vgapp 1.2.6 → 1.3.1
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 +113 -2
- package/app/langs/en/buttons.json +17 -17
- package/app/langs/en/messages.json +36 -36
- package/app/langs/ru/buttons.json +17 -17
- package/app/langs/ru/messages.json +36 -36
- package/app/modules/base-module.js +104 -87
- package/app/modules/vgalert/readme.md +105 -105
- package/app/modules/vgdynamictable/index.js +5 -5
- package/app/modules/vgdynamictable/js/editable.js +19 -19
- package/app/modules/vgdynamictable/js/filters.js +21 -21
- package/app/modules/vgdynamictable/js/fixed.js +179 -179
- package/app/modules/vgdynamictable/js/pagination.js +1 -1
- package/app/modules/vgdynamictable/js/search.js +12 -12
- package/app/modules/vgdynamictable/js/sortable.js +71 -71
- package/app/modules/vgdynamictable/js/summary-footer.js +28 -28
- package/app/modules/vgdynamictable/js/table-remote.js +79 -79
- package/app/modules/vgdynamictable/js/table-url-state.js +31 -31
- package/app/modules/vgdynamictable/js/utils/common.js +48 -48
- package/app/modules/vgdynamictable/js/vgdynamictable.js +268 -268
- package/app/modules/vgdynamictable/readme.md +250 -250
- package/app/modules/vgdynamictable/scss/_skeleton.scss +6 -6
- package/app/modules/vgdynamictable/scss/_sortable.scss +24 -24
- package/app/modules/vgdynamictable/scss/_table.scss +4 -4
- package/app/modules/vgdynamictable/scss/_variables.scss +79 -79
- package/app/modules/vgdynamictable/scss/vgdynamictable.scss +27 -27
- package/app/modules/vgfilepreview/js/i18n.js +56 -56
- package/app/modules/vgfilepreview/js/renderers/image-modal.js +145 -145
- package/app/modules/vgfilepreview/js/renderers/image.js +92 -92
- package/app/modules/vgfilepreview/js/renderers/index.js +19 -19
- package/app/modules/vgfilepreview/js/renderers/office-modal.js +168 -168
- package/app/modules/vgfilepreview/js/renderers/office.js +79 -79
- package/app/modules/vgfilepreview/js/renderers/pdf-modal.js +260 -260
- package/app/modules/vgfilepreview/js/renderers/pdf.js +76 -76
- package/app/modules/vgfilepreview/js/renderers/playlist.js +71 -71
- package/app/modules/vgfilepreview/js/renderers/text-modal.js +343 -343
- package/app/modules/vgfilepreview/js/renderers/text.js +83 -83
- package/app/modules/vgfilepreview/js/renderers/video-modal.js +272 -272
- package/app/modules/vgfilepreview/js/renderers/video.js +80 -80
- package/app/modules/vgfilepreview/js/renderers/zip-modal.js +522 -522
- package/app/modules/vgfilepreview/js/renderers/zip.js +89 -89
- package/app/modules/vgfilepreview/js/vgfilepreview.js +7 -7
- package/app/modules/vgfilepreview/readme.md +68 -68
- package/app/modules/vgfilepreview/scss/_variables.scss +113 -113
- package/app/modules/vgfilepreview/scss/vgfilepreview.scss +464 -464
- package/app/modules/vgfiles/js/base.js +26 -26
- package/app/modules/vgfiles/js/droppable.js +260 -260
- package/app/modules/vgfiles/js/render.js +153 -153
- package/app/modules/vgfiles/js/vgfiles.js +104 -104
- package/app/modules/vgfiles/readme.md +123 -123
- package/app/modules/vgfiles/scss/_variables.scss +18 -18
- package/app/modules/vgfiles/scss/vgfiles.scss +148 -148
- package/app/modules/vgformsender/js/hideshowpass.js +16 -16
- package/app/modules/vgformsender/scss/vgformsender.scss +34 -34
- package/app/modules/vgmodal/js/vgmodal.drag.js +332 -332
- package/app/modules/vgmodal/js/vgmodal.js +188 -188
- package/app/modules/vgmodal/js/vgmodal.resize.js +27 -27
- package/app/modules/vgmodal/scss/vgmodal.scss +14 -14
- package/app/modules/vgnav/js/vgnav.js +135 -135
- package/app/modules/vgnav/readme.md +67 -67
- package/app/modules/vgnestable/README.md +307 -307
- package/app/modules/vgnestable/scss/_variables.scss +60 -60
- package/app/modules/vgnestable/scss/vgnestable.scss +163 -163
- package/app/modules/vgrangeslider/js/skins.js +222 -222
- package/app/modules/vgrangeslider/js/vgrangeslider.js +704 -704
- package/app/modules/vgrangeslider/readme.md +523 -523
- package/app/modules/vgrangeslider/scss/_variables.scss +53 -53
- package/app/modules/vgrangeslider/scss/vgrangeslider.scss +240 -240
- package/app/modules/vgselect/js/vgselect.js +39 -39
- package/app/modules/vgselect/scss/vgselect.scss +22 -22
- package/app/modules/vgspy/readme.md +28 -28
- package/app/modules/vgtoast/readme.md +18 -18
- package/app/modules/vgtoast/scss/vgtoast.scss +48 -48
- package/app/modules/vgtooltip/js/vgtooltip.js +89 -89
- package/app/modules/vgtooltip/readme.md +181 -181
- package/app/utils/js/components/ajax.js +117 -117
- package/app/utils/js/components/audio-metadata.js +240 -240
- package/app/utils/js/components/backdrop.js +17 -17
- package/app/utils/js/components/file-icon.js +109 -109
- package/app/utils/js/components/file-preview.js +304 -304
- package/app/utils/js/components/sanitize.js +150 -150
- package/app/utils/js/components/video-metadata.js +140 -140
- package/app/vgapp.js +130 -0
- package/build/vgapp.css +2 -2
- package/build/vgapp.css.map +1 -1
- package/build/vgapp.js +2 -1
- package/build/vgapp.js.LICENSE.txt +1 -0
- package/build/vgapp.js.map +1 -1
- package/index.js +5 -0
- package/package.json +21 -1
- package/.gitattributes +0 -1
- package/CHANGELOG.md +0 -392
- package/agents.md +0 -14
- package/webpack.config.js +0 -63
package/build/vgapp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vgapp.js","mappings":"0BACA,I,KCAwB,CAACA,IACH,oBAAXC,QAA0BA,OAAOC,aAC1CC,OAAOC,eAAeJ,EAASC,OAAOC,YAAa,CAAEG,MAAO,WAE7DF,OAAOC,eAAeJ,EAAS,aAAc,CAAEK,OAAO,GAAO,E","sources":["webpack://vg/webpack/bootstrap","webpack://vg/webpack/runtime/make namespace object"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};"],"names":["exports","Symbol","toStringTag","Object","defineProperty","value"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"vgapp.js","mappings":";CAAA,SAA2CA,EAAMC,GAC1B,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,IACQ,mBAAXG,QAAyBA,OAAOC,IAC9CD,OAAO,GAAIH,GACe,iBAAZC,QACdA,QAAe,MAAID,IAEnBD,EAAY,MAAIC,GACjB,CATD,CASGK,MAAM,uHCAT,MAAMC,EACL,mBAAWC,GACV,MAAO,CACNC,QAAQ,EACRC,GAAI,kBACJC,IAAK,mBACLC,SAAU,IAEZ,CAEAC,WAAAA,CAAYC,EAASC,EAAKC,EAAa,CAAC,GACvCV,KAAKW,SAAWH,EAChBR,KAAKY,SAAWH,EAGhBT,KAAKa,SAAUC,EAAAA,EAAAA,IAAgBb,EAAUC,SAAUQ,GAG9CV,KAAKa,QAAQV,SAAWY,EAAAA,EAAAA,IAAUP,KAIvCR,KAAKgB,SAAW,CACfC,SAAU,oBACVX,SAAU,iBAGXN,KAAKkB,QACN,CAMAA,KAAAA,GACC,MAAM,UAAEC,GAAcnB,KAAKW,SAG3BQ,EAAUC,IAAIpB,KAAKgB,SAASC,SAAUjB,KAAKgB,SAASV,UAGhDa,EAAUE,SAAS,SACtBF,EAAUG,OAAO,QAIlBtB,KAAKuB,sBACN,CAMAA,oBAAAA,GACCC,EAAAA,EAAaC,GAAGzB,KAAKW,SAAU,GAAGX,KAAKY,gBAAiBZ,KAAK0B,YAAYC,KAAK3B,MAAO,MACrFwB,EAAAA,EAAaC,GAAGzB,KAAKW,SAAU,GAAGX,KAAKY,iBAAkBZ,KAAK4B,aAAaD,KAAK3B,MAAO,MACvFwB,EAAAA,EAAaC,GAAGzB,KAAKW,SAAU,GAAGX,KAAKY,gBAAiBZ,KAAK6B,YAAYF,KAAK3B,MAAO,MACrFwB,EAAAA,EAAaC,GAAGzB,KAAKW,SAAU,GAAGX,KAAKY,kBAAmBZ,KAAK8B,cAAcH,KAAK3B,MAAO,KAC1F,CAMA0B,WAAAA,GACC,MAAM,UAAEP,GAAcnB,KAAKW,UACnBP,GAAI2B,EAAS1B,IAAK2B,GAAahC,KAAKa,QAGxCM,EAAUE,SAASW,IACtBb,EAAUG,OAAOU,GAIlBb,EAAUC,IAAIW,EACf,CAMAH,YAAAA,GACC5B,KAAKW,SAASQ,UAAUC,IAAIpB,KAAKgB,SAASC,SAC3C,CAMAY,WAAAA,GACC,MAAM,UAAEV,GAAcnB,KAAKW,UACnBP,GAAI2B,EAAS1B,IAAK2B,GAAahC,KAAKa,QAGxCM,EAAUE,SAASU,IACtBZ,EAAUG,OAAOS,GAIlBZ,EAAUC,IAAIY,EACf,CAMAF,aAAAA,GACC,MAAM,UAAEX,GAAcnB,KAAKW,UACnBP,GAAI2B,EAAS1B,IAAK2B,GAAahC,KAAKa,QAG5C,IAAIM,GACFc,QAAOC,GAAOA,EAAIC,WAAW,eAC7BC,SAAQF,GAAOf,EAAUG,OAAOY,KAGlCf,EAAUC,IAAIpB,KAAKgB,SAASC,SAAUjB,KAAKgB,SAASV,SACrD,CAKA+B,OAAAA,GACCb,EAAAA,EAAac,IAAItC,KAAKW,SAAU,GAAGX,KAAKY,gBAAiB,KAAM,MAC/DY,EAAAA,EAAac,IAAItC,KAAKW,SAAU,GAAGX,KAAKY,iBAAkB,KAAM,MAChEY,EAAAA,EAAac,IAAItC,KAAKW,SAAU,GAAGX,KAAKY,gBAAiB,KAAM,MAC/DY,EAAAA,EAAac,IAAItC,KAAKW,SAAU,GAAGX,KAAKY,kBAAmB,KAAM,MAGjE,IAAIZ,KAAKW,SAASQ,WAChBc,QAAOC,GAAOA,EAAIC,WAAW,eAC7BC,SAAQF,GAAOlC,KAAKW,SAASQ,UAAUG,OAAOY,KAEhDlC,KAAKW,SAAW,IACjB,EAGD,+BCyHA,QA1PA,MACCJ,WAAAA,CAAYC,GACX,GAAKA,EAAL,CAGA,GADAR,KAAKW,SAAW4B,EAAAA,EAAUC,KAAKhC,IAC1BR,KAAKW,SACT,MAAM,IAAI8B,MAAM,mDAGjBzC,KAAKa,QAAU,CAAC,EAChBb,KAAK0C,WAAY,EACjBC,EAAAA,EAAKC,IAAI5C,KAAKW,SAAUX,KAAKO,YAAYsC,SAAU7C,KAT/B,CAUrB,CAEA8C,UAAAA,CAAWtC,EAASuC,GACnB,OAAO,IAAIC,EAAAA,EAAOD,EAAQvC,GAASyC,KACpC,CAEAZ,OAAAA,GACCM,EAAAA,EAAKrB,OAAOtB,KAAKW,SAAUX,KAAKO,YAAYsC,UAC5CrB,EAAAA,EAAac,IAAItC,KAAKW,SAAUX,KAAKO,YAAY2C,WAEjD,IAAK,MAAMC,KAAgBC,OAAOC,oBAAoBrD,MACrDA,KAAKmD,GAAgB,IAEvB,CAcAG,MAAAA,CAAOC,GACN,GAAwB,mBAAbA,EACV,OAAOvD,KAAKwD,cAAcD,GAG3B,IAAIE,EAAW,KACdC,EAAU1D,KAAKa,QAAQ8C,KAAKD,SAAW,EAExC,GAAI1D,KAAK0C,UAAW,OAEpB,MAAMkB,EAAWC,IACQ,iBAAbA,EACNJ,IAAUA,EAASK,UAAYD,IACzBE,EAAAA,EAAAA,IAASF,MAAcG,EAAAA,EAAAA,IAAWH,IAC5CT,OAAOa,OAAOJ,GAAUzB,SAAQ8B,IACV,iBAAVA,GACNT,IAAUA,EAASK,UAAYI,EACpC,GAEF,EAGD,IAAKlE,KAAKa,QAAQsD,eAAe,QAChC,OAGD,IAAKnE,KAAKa,QAAQ8C,KAAKS,MACtB,QAGG,KAAapE,KAAKa,QAAQ8C,OAC7B3D,KAAKa,QAAQ8C,KAAKU,OAAS,OAGxB,WAAYrE,KAAKa,QAAQ8C,MAAQ3D,KAAKa,QAAQ8C,KAAKW,SACtDb,EAAWlB,EAAAA,EAAUC,KAAKxC,KAAKa,QAAQ8C,KAAKW,SAGxC,WAAYtE,KAAKa,QAAQ8C,MAAQ3D,KAAKa,QAAQ8C,KAAKY,QAAY,WAAYvE,KAAKa,QAAQ8C,MAAQ3D,KAAKa,QAAQ8C,KAAKa,QACtHZ,GAAQa,EAAAA,EAAAA,GAAK,UAAUC,IAAI,CAACC,MAAO,eAGpC,IAAIC,EAAsBA,CAACC,EAAMC,KAC5B,WAAY9E,KAAKa,QAAQ8C,MAAQ3D,KAAKa,QAAQ8C,KAAKY,QAAQX,EAAQ,IAEnE,SAAU5D,KAAKa,QAAQ8C,MAAQ3D,KAAKa,QAAQ8C,KAAKoB,OACpD/E,KAAK0C,WAAY,GAGd,WAAY1C,KAAKa,QAAQ8C,MAAQ3D,KAAKa,QAAQ8C,KAAKa,QAErDZ,EADG,aAAciB,GACTG,EAAAA,EAAAA,IAAcH,EAAKhB,UAEnBgB,IAIVI,EAAAA,EAAAA,IAAQ1B,EAAU,CAACuB,EAAQD,EAAMpB,GAAU,EAG5C,MAAME,EAAO,IAAIuB,EAAAA,EAEjB,IAAIC,EAAW,CACdC,UAAYP,IACXD,EAAoBC,EAAM,UAAU,EAErCQ,QAAUC,IACTV,EAAoBU,EAAK,QAAQ,GAInCC,YAAW,KACqC,QAA3CvF,KAAKa,QAAQ8C,KAAKU,OAAOmB,eAC5B7B,EAAKV,IAAIjD,KAAKa,QAAQ8C,KAAKS,MAAOe,GAGY,SAA3CnF,KAAKa,QAAQ8C,KAAKU,OAAOmB,eAC5B7B,EAAK8B,KAAKzF,KAAKa,QAAQ8C,KAAKS,MAAOpE,KAAKa,QAAQ8C,KAAKkB,KAAMM,GAGb,WAA3CnF,KAAKa,QAAQ8C,KAAKU,OAAOmB,eAC5B7B,EAAK+B,OAAO1F,KAAKa,QAAQ8C,KAAKS,MAAOe,EACtC,GACEzB,EACJ,CAEAF,aAAAA,CAAcmC,EAAU,CAAC,GACxB,MAAMC,EAAS5F,KAAK6F,8BAA8BF,GAClD,OAAOT,EAAAA,EAAKY,aAAaF,EAC1B,CAEAG,cAAAA,CAAehD,EAAS,CAAC,EAAGiD,EAAW,GAAIL,EAAU,CAAC,GACrD,MAAMC,EAAS5F,KAAK6F,8BAA8BzC,OAAO6C,OAAO,CAAC,EAAGN,EAAS,CAC5E5C,SACAqB,MAAO4B,GAAYL,EAAQvB,OAAS,MAErC,OAAOc,EAAAA,EAAKgB,cAAcN,EAAOxB,MAAO,CACvCrB,OAAQ6C,EAAO7C,OACfoD,WAAYP,EAAOO,YAErB,CAEAN,6BAAAA,CAA8BF,EAAU,CAAC,GACxC,MAAMS,EAAiBpG,KAAKa,UAAWkD,EAAAA,EAAAA,IAAS/D,KAAKa,QAAQwF,SAC1DrG,KAAKa,QAAQwF,QACb,CAAC,EACEC,EAActG,KAAKa,UAAWkD,EAAAA,EAAAA,IAAS/D,KAAKa,QAAQ8C,MACvD3D,KAAKa,QAAQ8C,KACb,CAAC,EACE4C,GAASxC,EAAAA,EAAAA,IAAS4B,GAAWA,EAAU,CAAC,EAqC9C,MAAO,CACNvB,MArCaoC,OACbD,EAAOnC,OACJmC,EAAOP,UACPI,EAAehC,OACfkC,EAAYlC,OACZ,IACFqC,OAgCDpC,OA/BcmC,OACdD,EAAOlC,QACJ+B,EAAe/B,QACfiC,EAAYjC,QACZ,OACFqC,cAAcD,QAAU,MA2BzBE,YA1BmBH,OACnBD,EAAOI,aACJP,EAAeO,aACf,eACFF,QAAU,cAuBXG,SAtBe9F,EAAAA,EAAAA,IACf,CACC,OAAU,mBACV,mBAAoB,mBAErBiD,EAAAA,EAAAA,IAASqC,EAAeQ,SAAWR,EAAeQ,QAAU,CAAC,GAC7D7C,EAAAA,EAAAA,IAASwC,EAAOK,SAAWL,EAAOK,QAAU,CAAC,GAiB7CT,YAfkBrF,EAAAA,EAAAA,IAClB,CAAC,GACDiD,EAAAA,EAAAA,IAASqC,EAAerD,QAAUqD,EAAerD,OAAS,CAAC,GAC3DgB,EAAAA,EAAAA,IAASwC,EAAOJ,YAAcI,EAAOJ,WAAa,CAAC,GACnDpC,EAAAA,EAAAA,IAASwC,EAAOM,YAAcN,EAAOM,WAAa,CAAC,GAYnD9D,QAVcgB,EAAAA,EAAAA,IAASwC,EAAOxD,QAAUwD,EAAOxD,OAAS,CAAC,EAWzD+D,UAV4BC,IAAhBR,EAAOO,KACjBP,EAAOO,UACUC,IAAhBR,EAAO1B,KAAqB0B,EAAO1B,KAAO,KAS7CmC,OAAQT,EAAOS,QAAU,KACzBC,aAAcT,OAAOD,EAAOU,cAAgBV,EAAOW,OAAS,QAAQ1B,cAAciB,QAAU,OAE9F,CAEAU,eAAAA,GACC,IAAIC,GAAQC,EAAAA,EAAAA,GAAO,SAClBC,EAAStH,KAAKW,SAAS4G,cAAc,iBAElCD,IACOA,EAAOC,cAAc,QACrBD,EAAOE,mBAAmB,YAAaJ,GAEnD,CAEAK,cAAAA,CAAelE,EAAU/C,EAASkH,GAAa,EAAMC,IACpDC,EAAAA,EAAAA,IAAuBrE,EAAU/C,EAASkH,EAAYC,EACvD,CAEAE,UAAAA,CAAWrH,EAASC,EAAKsC,EAAS,CAAC,GAClC,IAAI9C,EAAUO,EAASC,EAAKsC,EAC7B,CAEA,kBAAO+E,CAAYtH,GAClB,OAAOmC,EAAAA,EAAKM,IAAIV,EAAAA,EAAUC,KAAKhC,GAAUR,KAAK6C,SAC/C,CAEA,0BAAOkF,CAAoBvH,EAASuC,EAAS,CAAC,GAC7C,OAAO/C,KAAK8H,YAAYtH,IAAY,IAAIR,KAAKQ,GAAUwD,EAAAA,EAAAA,IAAWjB,GAAmB,CAAC,EAAVA,EAC7E,CAEA,WAAOiF,CAAKjF,EAAS,CAAC,GACrB,GAA4B,mBAAjB/C,KAAKiI,QACf,OAAOjI,KAAKiI,QAAQlF,GAGrB,GAAyB,mBAAd/C,KAAKkI,KACf,OAAO,KAGR,GAAInF,GAAUK,OAAO+E,UAAUhE,eAAeiE,KAAKrF,EAAQ,WAAY,CACtE,MAAM,QAAEvC,KAAYmF,GAAY5C,EAChC,OAAO/C,KAAKkI,KAAK1H,EAASmF,EAC3B,CAEA,OAAO,IACR,CAEA,mBAAW0C,GACV,MAAO,MAAMrI,KAAKsI,MACnB,CAEA,oBAAWpF,GACV,MAAO,IAAIlD,KAAKqI,UACjB,0ECxQD,MAAME,EAAmB,CACxBC,IAAK,WACLC,IAAK,YACLC,KAAM,YACNC,IAAK,YACLC,IAAK,YACLC,IAAK,YACLC,KAAM,YACNC,KAAM,YACNC,IAAK,YACLC,IAAK,YACLC,IAAK,WACLC,IAAK,WACL,KAAM,WACNC,IAAK,WACLC,GAAI,WACJC,IAAK,WACLC,IAAK,YACLC,GAAI,YACJC,IAAK,YACLC,KAAM,YACNC,IAAK,YACLC,IAAK,YACLC,KAAM,YACNC,IAAK,WACLC,IAAK,aACLC,IAAK,aACLC,KAAM,aACNC,IAAK,aACLC,KAAM,aACNC,IAAK,aACLC,IAAK,aACLC,IAAK,aACLC,KAAM,aACNC,KAAM,aACNC,KAAM,aACNC,KAAM,aACNC,IAAK,aACLC,IAAK,aACLC,IAAK,aACLC,KAAM,aACNC,IAAK,aACLC,IAAK,aACLC,IAAK,aACLC,KAAM,aACNC,IAAK,aACLC,IAAK,aACLC,IAAK,cAGAC,EAAoBpH,IACzB,IAAKA,EAAO,MAAO,GAEnB,MACMqH,EADa/E,OAAOtC,GAAOsB,cAAcgG,MAAM,KAAK,GAAGA,MAAM,KAAK,GACzCA,MAAM,KAAKC,OAAS,GACnD,OAAKF,EAAYG,SAAS,MAEnBH,EAAYC,MAAM,KAAKC,OAFS,EAEE,EC3CpCpE,EAAUsE,GDyEDtE,EAACsE,EAAMC,EAAQ,CAAC,KAC9B,MAAMC,EAAeD,EAAMD,GAC3B,GAAIE,EACH,OAAOA,EAGR,MACMC,EAAWF,EAtBWG,KAC5B,MAAM,KAACC,EAAI,IAAEC,GAbe/H,KAC5B,IAAKA,EAAO,MAAO,CAAC8H,KAAM,GAAIC,IAAK,IAEnC,GAAqB,iBAAV/H,EAAoB,CAC9B,MAAM8H,EAAOxF,OAAOtC,EAAM8H,MAAQ,IAAIxG,cAChCmG,EAAOnF,OAAOtC,EAAMyH,MAAQzH,EAAMgI,MAAQhI,EAAMiI,KAAO,IAAI3G,cACjE,MAAO,CAACwG,OAAMC,IAAKX,EAAiBK,GACrC,CAEA,MAAO,CAACK,KAAM,GAAIC,IAAKX,EAAiBpH,GAAO,EAI3BkI,CAAoBL,GAExC,MAAa,oBAATC,EAAmC,WACnCA,EAAKN,SAAS,QAAgB,YAC9BM,EAAKN,SAAS,UAAYM,EAAKN,SAAS,eAAuB,YAC/DM,EAAKN,SAAS,QAAUM,EAAKN,SAAS,cAAsB,WAC5DM,EAAK7J,WAAW,SAAiB,YACjC6J,EAAK7J,WAAW,UAAkB,aAClC6J,EAAK7J,WAAW,UAAkB,aAClC6J,EAAK7J,WAAW,UAAkB,aAE/BoG,EAAiB0D,IAAQ,cAAc,EASzBI,CAAoBV,IAEzC,OAAIG,GAIGF,EAAM,iBAAmB,EAAE,ECpD3BU,CAAiBX,EAhCX,CACZY,MAAqB,uMACrBC,KAAqB,mPACrB,oBAAqB,yZACrBC,QAAqB,uWACrBC,OAAqB,wlDACrBC,QAAqB,8uBACrBC,QAAqB,iuCACrBC,QAAqB,+2CACrBC,KAAqB,o1BACrBC,KAAqB,mgBACrB3F,MAAqB,u5CACrB,WAAqB,iyBACrB,WAAqB,umCACrB4F,MAAqB,ymCACrBC,QAAqB,0yDACrBC,MAAqB,uNACrB,YAAqB,20EACrB,eAAqB,8eACrB,YAAqB,q1CACrB,YAAqB,gyCACrB,WAAqB,uyDACrB,WAAqB,6pBACrB,YAAqB,8wBACrB,aAAqB,2+CACrB,aAAqB,8qCACrB,aAAqB,6iCACrB,SAAqB,2YACrB,KAAqB,kQACrB,MAAqB,qSAWjBC,EAAiBA,CAACtN,EAAQwE,EAAS,UACxC,MAAM+I,EAAa,iBAAiBvN,EAAOqD,YACrCyI,EAAO9L,EAAOyI,KAEpB9G,EAAAA,EAAaC,GAAG4L,SAAUD,EAAY,qBAAqBzB,OAAU,SAAU2B,GAK9E,GAJI,CAAC,IAAK,QAAQ5B,SAAS1L,KAAKuN,UAC/BD,EAAME,kBAGHC,EAAAA,EAAAA,IAAWzN,MAAO,OAEtB,MAAMsE,EAAS/B,EAAAA,EAAUmL,uBAAuB1N,OAASA,KAAK2N,QAAQ,OAAOhC,KAC5D9L,EAAOkI,oBAAoBzD,GAEnCD,IACV,GAAE,sFCoFH,QArJA,MACI9D,WAAAA,CAAYqN,EAAiBjI,EAAU,CAAC,GACpC3F,KAAK6N,IAAMD,EACX5N,KAAKa,QAAU,CACXiN,OAAQ,QACRC,aAAc,UACd3J,MAAO,KACPC,OAAQ,OACR2J,OAAO,KACJrI,IAGFA,EAAQoI,cAAgBpI,EAAQmI,SACjC9N,KAAKa,QAAQkN,aAAe,KAAKpI,EAAQmI,UAGxC9N,KAAKa,QAAQuD,OACd6J,QAAQC,KAAK,sEAEblO,KAAKa,QAAQsN,OAAOC,OACpBpO,KAAKqO,MAAQrO,KAAKa,QAAQsN,MAAMG,KAAIC,GAAKhM,EAAAA,EAAUC,KAAK,IAAM+L,EAAGvO,KAAK6N,IAAIlN,YAAW6B,MAAKgM,GAAKA,IAE/FxO,KAAKqO,MAAQrO,KAAK6N,IAAIY,OAAOC,MAG5B3N,EAAAA,EAAAA,IAAUf,KAAKqO,QAKpBrO,KAAK2O,aAAe,KAEpB3O,KAAK4O,kBAAoB5O,KAAK6O,aAAalN,KAAK3B,MAChDA,KAAK8O,gBAAkB9O,KAAK+O,WAAWpN,KAAK3B,MAC5CA,KAAKgP,iBAAmBhP,KAAKiP,YAAYtN,KAAK3B,MAC9CA,KAAKkP,aAAelP,KAAKmP,QAAQxN,KAAK3B,MAEtCA,KAAKkB,SAXD+M,QAAQmB,MAAM,qDAYtB,CAEAlO,KAAAA,GACIlB,KAAKqP,wBAELrP,KAAKsP,eACLtP,KAAK6N,IAAI0B,iBAAiB,iBAC9B,CAEAF,qBAAAA,GACkBrP,KAAKqO,MAAMmB,iBAAiBxP,KAAKa,QAAQkN,cAEjD3L,SAAQqN,IACVA,EAAGC,aAAa,YAAa,QAE7B,MAAMC,EAAMF,EAAGlI,cAAc,OACzBoI,GAAKA,EAAID,aAAa,YAAa,QAAQ,GAEvD,CAEAJ,YAAAA,GACItP,KAAKqO,MAAMuB,iBAAiB,YAAa5P,KAAK4O,mBAC9C5O,KAAKqO,MAAMuB,iBAAiB,UAAW5P,KAAK8O,iBAC5C9O,KAAKqO,MAAMuB,iBAAiB,WAAY5P,KAAKgP,kBAC7ChP,KAAKqO,MAAMuB,iBAAiB,OAAQ5P,KAAKkP,aAC7C,CAEAL,YAAAA,CAAagB,GAET,IADiBA,EAAEvL,OAAOqJ,QAAQ3N,KAAKa,QAAQiN,QAChC,OAEf,MAAMgC,EAAOD,EAAEvL,OAAOqJ,QAAQ3N,KAAKa,QAAQkN,eAAiB8B,EAAEvL,OAAOqJ,QAAQ,MACxEmC,IAEL9P,KAAK2O,aAAemB,EAEpBD,EAAEE,aAAaC,cAAgB,OAC/BH,EAAEE,aAAanM,QAAQ,aAAc,cAErCkM,EAAK3O,UAAUC,IAAI,YACnB6O,uBAAsB,IAAMH,EAAK3O,UAAUC,IAAI,0BACnD,CAEA2N,UAAAA,CAAWc,GACH7P,KAAK2O,eACL3O,KAAK2O,aAAaxN,UAAUG,OAAO,WAAY,wBAC/CtB,KAAK2O,aAAe,KACpB3O,KAAKkQ,aAEb,CAEAjB,WAAAA,CAAYY,GACR,IAAK7P,KAAK2O,aAAc,OAExBkB,EAAErC,iBACFqC,EAAEE,aAAaI,WAAa,OAE5B,MAAMC,EACFP,EAAEvL,OAAOqJ,QAAQ3N,KAAKa,QAAQkN,eAC9B8B,EAAEvL,OAAOqJ,QAAQ,MAErB,IAAKyC,GAAiBA,IAAkBpQ,KAAK2O,aAAc,OAE3D,MAAM0B,EAAOD,EAAcE,wBACrBC,EAAWF,EAAKG,OAAS,EACTX,EAAEY,QAAUJ,EAAKK,IAEnBH,EAChBvQ,KAAKqO,MAAMsC,aAAa3Q,KAAK2O,aAAcyB,GAE3CpQ,KAAKqO,MAAMsC,aAAa3Q,KAAK2O,aAAcyB,EAAcQ,YAEjE,CAEAzB,OAAAA,CAAQU,GACJ,GAAK7P,KAAK2O,aAIV,OAFAkB,EAAErC,iBACFqC,EAAEgB,mBACK,CACX,CAEAX,UAAAA,GACI,MAAMY,EAAM,IAAK,IAAIC,IAAI/Q,KAAKgR,oBAEzBF,EAAI1C,QAAWpO,KAAKa,QAAQuD,QAErB,IAAIc,EAAAA,GACZO,KAAKzF,KAAKa,QAAQuD,MAAO,CAAE0M,OAAO,CAClC1L,UAAYP,GAASoM,EAAAA,EAAQC,IAAIrM,EAAKhB,SAASsN,UAEvD,CAEAH,eAAAA,GACI,OAAOI,MAAMC,KAAKrR,KAAKqO,MAAMmB,iBAAiB,cACzClB,KAAIgD,IACUtM,EAAAA,EAAAA,IAAcsM,EAAGC,aAAa,aACxB,OAClBtP,QAAOuP,GAAa,OAAPA,GACxB,CAEAC,OAAAA,GACIzR,KAAKqO,MAAMqD,oBAAoB,YAAa1R,KAAK4O,mBACjD5O,KAAKqO,MAAMqD,oBAAoB,UAAW1R,KAAK8O,iBAC/C9O,KAAKqO,MAAMqD,oBAAoB,WAAY1R,KAAKgP,kBAChDhP,KAAKqO,MAAMqD,oBAAoB,OAAQ1R,KAAKkP,cAE5ClP,KAAK2O,aAAe,IACxB,mCCrJJ,eAAsB,4FCFtB,MAAMgD,EAAkB,CACvBxR,QAAQ,EACRyR,SAAU,oBACVC,UAAW,EACXC,eAAgB,EAChBC,OAAO,GAuUR,EApUA,MACCxR,WAAAA,CAAYyR,EAAcC,EAAetM,EAAU,CAAC,GACnD3F,KAAKkS,cAAgBF,EACrBhS,KAAKmS,eAAiBF,EACtBjS,KAAKoS,SAAWpS,KAAKqS,kBAAkB1M,GACvC3F,KAAKsS,WAAa,KAClBtS,KAAKuS,YAAc,KACnBvS,KAAKwS,aAAc,EACnBxS,KAAKyS,QAAU,EACfzS,KAAK0S,QAAU,EACf1S,KAAK2S,UAAY,EACjB3S,KAAK4S,UAAY,EACjB5S,KAAK6S,iBAAmB,EACxB7S,KAAK8S,gBAAkB,EACvB9S,KAAK+S,aAAe,EACpB/S,KAAKgT,cAAgB,EACrBhT,KAAKiT,YAAa,EAClBjT,KAAKkT,oBAAsB,GAC3BlT,KAAKmT,oBAAsB,GAC3BnT,KAAKoT,oBAAsB,GAC3BpT,KAAKqT,aAAe,KACpBrT,KAAKsT,eAAiB,GACtBtT,KAAKuT,cAAgB,KAErBvT,KAAKwT,eAAiBxT,KAAKwT,eAAe7R,KAAK3B,MAC/CA,KAAKyT,aAAezT,KAAKyT,aAAa9R,KAAK3B,MAC3CA,KAAK0T,eAAiB1T,KAAK0T,eAAe/R,KAAK3B,MAC/CA,KAAK2T,mBAAqB3T,KAAK2T,mBAAmBhS,KAAK3B,KACxD,CAEA4T,UAAAA,CAAWjO,EAAU,CAAC,GACrB3F,KAAKoS,SAAWpS,KAAKqS,kBAAkB1M,EAAS3F,KAAKoS,UACrDpS,KAAK6T,qBACN,CAEA1T,MAAAA,GACMH,KAAKmS,iBAAkBnS,KAAKiT,aAEjCjT,KAAK6T,sBACL7T,KAAKmS,eAAevC,iBAAiB,cAAe5P,KAAK0T,gBACzD1T,KAAKiT,YAAa,EACnB,CAEAa,OAAAA,GACM9T,KAAKmS,gBAAmBnS,KAAKiT,aAElCjT,KAAKmS,eAAeT,oBAAoB,cAAe1R,KAAK0T,gBAC5DrG,SAASqE,oBAAoB,cAAe1R,KAAKwT,gBACjDnG,SAASqE,oBAAoB,YAAa1R,KAAKyT,cAC/CpG,SAASqE,oBAAoB,gBAAiB1R,KAAKyT,cACnDpG,SAASqE,oBAAoB,YAAa1R,KAAK2T,oBAAoB,GACnE3T,KAAKmS,eAAe4B,MAAMC,YAAc,GACxC3G,SAASvG,KAAKiN,MAAME,WAAajU,KAAKkT,oBACtClT,KAAKsS,WAAa,KAClBtS,KAAKuS,YAAc,KACnBvS,KAAKwS,aAAc,EACnBxS,KAAKqT,aAAe,KACpBrT,KAAKkU,wBACLlU,KAAKmU,4BACEnU,KAAKkS,cAAckC,QAAQC,gBAClCrU,KAAKsU,qBAAoB,GACzBtU,KAAKiT,YAAa,EACnB,CAEAsB,YAAAA,GACC,IAAKvU,KAAKiT,WAAY,OACtB,IAAKjT,KAAKwU,4BAA6B,OAEvC,MAAMnE,EAAOrQ,KAAKmS,eAAe7B,wBAC3BmE,EAAQzU,KAAKmS,eAAeuC,aAAerE,EAAKoE,MAChDjE,EAASxQ,KAAKmS,eAAewC,cAAgBtE,EAAKG,OAClDoE,EAAcC,OAAOC,WAAW9U,KAAKmS,eAAe4B,MAAMgB,MAC1DC,EAAaH,OAAOC,WAAW9U,KAAKmS,eAAe4B,MAAMrD,KACzDqE,EAAOF,OAAOI,SAASL,GAAeA,EAAcvE,EAAK0E,KACzDrE,EAAMmE,OAAOI,SAASD,GAAcA,EAAa3E,EAAKK,IACtDwE,EAAUC,KAAKC,IAAI,EAAGC,OAAOC,WAAab,GAC1Cc,EAASJ,KAAKC,IAAI,EAAGC,OAAOG,YAAchF,GAC1CiF,EAAWN,KAAKO,IAAIR,EAASC,KAAKC,IAAI,EAAGL,IACzCY,EAAUR,KAAKO,IAAIH,EAAQJ,KAAKC,IAAI,EAAG1E,IAE7C1Q,KAAKmS,eAAe4B,MAAMgB,KAAO,GAAGU,MACpCzV,KAAKmS,eAAe4B,MAAMrD,IAAM,GAAGiF,MACnC3V,KAAK4V,mBAAmB,SACzB,CAEAlC,cAAAA,CAAepG,GACd,GAAqB,IAAjBA,EAAMhG,OAAc,OAExB,MAAMuO,EAAW7V,KAAK8V,iBAAiBxI,EAAMhJ,QACxCuR,GAAa7V,KAAKmS,eAAe9Q,SAASwU,KAC3C7V,KAAK+V,uBAAuBzI,IAC5BA,EAAMhJ,OAAOqJ,QAAQ,iEACrBkI,GAAYA,EAASlI,QAAQ,+BAEjC3N,KAAKsS,WAAahF,EAAM0I,UACxBhW,KAAKuS,YAAcjF,EAAMhJ,OACzBtE,KAAKwS,aAAc,EACnBlF,EAAME,iBACNxN,KAAKkT,oBAAsB7F,SAASvG,KAAKiN,MAAME,WAC/C5G,SAASvG,KAAKiN,MAAME,WAAa,OACjCjU,KAAKqT,aAAerT,KAAKmS,eAAe7B,wBACxCtQ,KAAK6S,iBAAmB7S,KAAKqT,aAAa0B,KAC1C/U,KAAK8S,gBAAkB9S,KAAKqT,aAAa3C,IACzC1Q,KAAK+S,aAAe/S,KAAKqT,aAAaoB,MACtCzU,KAAKgT,cAAgBhT,KAAKqT,aAAa7C,OACvCxQ,KAAKyS,QAAUnF,EAAM2I,QACrBjW,KAAK0S,QAAUpF,EAAMmD,QACrBzQ,KAAK2S,UAAYrF,EAAM2I,QACvBjW,KAAK4S,UAAYtF,EAAMmD,QACvBzQ,KAAKkW,sBACLlW,KAAKkS,cAAckC,QAAQC,gBAAkB,OAC7CrU,KAAKsU,qBAAoB,GACzBtU,KAAK4V,mBAAmB,SAExBvI,SAASuC,iBAAiB,YAAa5P,KAAK2T,oBAAoB,GAE5D3T,KAAKmS,gBAAkBnS,KAAKmS,eAAegE,mBAC9CnW,KAAKmS,eAAegE,kBAAkB7I,EAAM0I,WAG7C3I,SAASuC,iBAAiB,cAAe5P,KAAKwT,gBAC9CnG,SAASuC,iBAAiB,YAAa5P,KAAKyT,cAC5CpG,SAASuC,iBAAiB,gBAAiB5P,KAAKyT,eACjD,CAEAD,cAAAA,CAAelG,GACd,GAAIA,EAAM0I,YAAchW,KAAKsS,WAA7B,CAIA,GAFAtS,KAAK2S,UAAYrF,EAAM2I,QACvBjW,KAAK4S,UAAYtF,EAAMmD,SAClBzQ,KAAKwS,YAAa,CACtB,MAAM4D,EAASpW,KAAK2S,UAAY3S,KAAKyS,QAC/B4D,EAASrW,KAAK4S,UAAY5S,KAAK0S,QAErC,GADiByC,KAAKmB,MAAMF,EAAQC,GACrBrW,KAAKoS,SAASP,UAAW,OAExC7R,KAAKwS,aAAc,EACnBxS,KAAKmS,eAAe4B,MAAMC,YAAc,OACxChU,KAAKuW,mBACLvW,KAAKwW,iBAAiBxW,KAAKqT,cAC3B/F,EAAME,iBACNxN,KAAK4V,mBAAmB,WACzB,CACA5V,KAAKyW,oBAjB0C,CAkBhD,CAEAhD,YAAAA,CAAanG,GACRA,EAAM0I,YAAchW,KAAKsS,aAE7BjF,SAASqE,oBAAoB,cAAe1R,KAAKwT,gBACjDnG,SAASqE,oBAAoB,YAAa1R,KAAKyT,cAC/CpG,SAASqE,oBAAoB,gBAAiB1R,KAAKyT,cACnDpG,SAASqE,oBAAoB,YAAa1R,KAAK2T,oBAAoB,GAC/D3T,KAAKwS,aACRxS,KAAKyW,qBAENzW,KAAKmS,eAAe4B,MAAMC,YAAc,GACxC3G,SAASvG,KAAKiN,MAAME,WAAajU,KAAKkT,oBAElClT,KAAKmS,gBAAkBnS,KAAKmS,eAAeuE,uBAC9C1W,KAAKmS,eAAeuE,sBAAsBpJ,EAAM0I,WAGjDhW,KAAKsS,WAAa,KAClBtS,KAAKuS,YAAc,KACnBvS,KAAKwS,aAAc,EACnBxS,KAAKqT,aAAe,KACpBrT,KAAKkU,wBACLlU,KAAKmU,4BACEnU,KAAKkS,cAAckC,QAAQC,gBAClCrU,KAAKsU,oBAAoBtU,KAAKoS,SAASL,OACvC/R,KAAK4V,mBAAmB,QACzB,CAEAY,gBAAAA,CAAiBnG,EAAO,MACvB,IAAKrQ,KAAKmS,eAAgB,OAE1B,MAAMwE,EAActG,GAAQrQ,KAAKmS,eAAe7B,wBAChDtQ,KAAKmS,eAAe4B,MAAM6C,SAAW,QACrC5W,KAAKmS,eAAe4B,MAAM8C,OAAS,IACnC7W,KAAKmS,eAAe4B,MAAMgB,KAAO,GAAG4B,EAAY5B,SAChD/U,KAAKmS,eAAe4B,MAAMrD,IAAM,GAAGiG,EAAYjG,QAC/C1Q,KAAKmS,eAAe4B,MAAMU,MAAQ,GAAGkC,EAAYlC,UACjDzU,KAAKmS,eAAe4B,MAAMvD,OAAS,GAAGmG,EAAYnG,WAClDxQ,KAAKmS,eAAe4B,MAAM+C,UAAY,OACtC9W,KAAKmS,eAAe4B,MAAMgD,UAAY,MACvC,CAEAvC,yBAAAA,GACC,MAA8C,UAAvCxU,KAAKmS,eAAe4B,MAAM6C,UAAgE,SAAxC5W,KAAKmS,eAAe4B,MAAM+C,SACpF,CAEAf,sBAAAA,CAAuBzI,GACtB,MAAM+C,EAAOrQ,KAAKmS,eAAe7B,wBAC3B0G,EAAU1J,EAAM2I,QAAU5F,EAAK0E,KAC/BkC,EAAU3J,EAAMmD,QAAUJ,EAAKK,IAC/BwG,EAAWlX,KAAKoS,SAASN,eAEzBqF,EAAUF,GAAW,GAAKA,GAAWC,EACrCE,EAAaH,GAAW5G,EAAKG,QAAUyG,GAAW5G,EAAKG,OAAS0G,EAChEG,EAAWL,GAAW,GAAKA,GAAWE,EACtCI,EAAYN,GAAW3G,EAAKoE,OAASuC,GAAW3G,EAAKoE,MAAQyC,EAEnE,OAAOC,GAAWC,GAAcC,GAAYC,CAC7C,CAEAb,kBAAAA,GACC,GAAwB,OAApBzW,KAAKsS,aAAwBtS,KAAKwS,YAAa,OAEnD,MAAM4D,EAASpW,KAAK2S,UAAY3S,KAAKyS,QAC/B4D,EAASrW,KAAK4S,UAAY5S,KAAK0S,QAC/BwC,EAAUC,KAAKC,IAAI,EAAGC,OAAOC,WAAatV,KAAK+S,cAC/CwC,EAASJ,KAAKC,IAAI,EAAGC,OAAOG,YAAcxV,KAAKgT,eAC/CyC,EAAWN,KAAKO,IAAIR,EAASC,KAAKC,IAAI,EAAGpV,KAAK6S,iBAAmBuD,IACjET,EAAUR,KAAKO,IAAIH,EAAQJ,KAAKC,IAAI,EAAGpV,KAAK8S,gBAAkBuD,IAEpErW,KAAKmS,eAAe4B,MAAMgB,KAAO,GAAGU,MACpCzV,KAAKmS,eAAe4B,MAAMrD,IAAM,GAAGiF,MACnC3V,KAAK4V,mBAAmB,WACzB,CAEAjC,kBAAAA,CAAmBrG,GACM,OAApBtN,KAAKsS,YACThF,EAAME,gBACP,CAEA+I,gBAAAA,GACCvW,KAAKmT,oBAAsBnT,KAAKmS,eAAe4B,MAAMwD,WACrDvX,KAAKoT,oBAAsBpT,KAAKmS,eAAe4B,MAAMyD,WACrDxX,KAAKmS,eAAe4B,MAAMwD,WAAa,OACvCvX,KAAKmS,eAAe4B,MAAMyD,WAAa,WACxC,CAEArD,kBAAAA,GACCnU,KAAKmS,eAAe4B,MAAMwD,WAAavX,KAAKmT,oBAC5CnT,KAAKmS,eAAe4B,MAAMyD,WAAaxX,KAAKoT,mBAC7C,CAEA8C,mBAAAA,GACC,IAAKlW,KAAKmS,gBAAkBnS,KAAKsT,eAAelF,OAAQ,OAExD,MAAMqJ,EAAUzX,KAAKmS,eAAe3C,iBAAiB,UACrD,IAAK,MAAMkI,KAASD,EACnBzX,KAAKsT,eAAeqE,KAAK,CACxBnX,QAASkX,EACTE,cAAeF,EAAM3D,MAAM6D,gBAE5BF,EAAM3D,MAAM6D,cAAgB,MAE9B,CAEA1D,qBAAAA,GACC,GAAKlU,KAAKsT,eAAelF,OAAzB,CAEA,IAAK,MAAM0B,KAAQ9P,KAAKsT,eACvBxD,EAAKtP,QAAQuT,MAAM6D,cAAgB9H,EAAK8H,cAEzC5X,KAAKsT,eAAiB,EALiB,CAMxC,CAEAjB,iBAAAA,CAAkB1M,EAASkS,EAAOlG,GACjC,MAAMmG,EAAS,IAAID,KAASlS,GACtBkM,EAAYgD,OAAOiD,EAAOjG,WAC1BC,EAAiB+C,OAAOiD,EAAOhG,gBAC/BF,EAAsC,iBAApBkG,EAAOlG,UAAyBkG,EAAOlG,SAASnL,OACrEqR,EAAOlG,SACPD,EAAgBC,SAEnB,MAAO,IACHkG,EACHlG,WACAC,UAAWgD,OAAOI,SAASpD,IAAcA,GAAa,EAAIA,EAAYF,EAAgBE,UACtFC,eAAgB+C,OAAOI,SAASnD,IAAmBA,EAAiB,EAAIA,EAAiBH,EAAgBG,eACzGC,MAAOgG,QAAQD,EAAO/F,OAExB,CAEA+D,gBAAAA,CAAiBxR,GAChB,IACC,OAAOA,EAAOqJ,QAAQ3N,KAAKoS,SAASR,SACrC,CAAE,MAAOxC,GACR,OAAO9K,EAAOqJ,QAAQgE,EAAgBC,SACvC,CACD,CAEAiC,mBAAAA,GACM7T,KAAKoS,SAASL,OAKd/R,KAAKuT,gBACTvT,KAAKuT,cAAgBlG,SAAS2K,cAAc,OAC5ChY,KAAKuT,cAAcQ,MAAM6C,SAAW,WACpC5W,KAAKuT,cAAcQ,MAAMgB,KAAO,QAChC/U,KAAKuT,cAAcQ,MAAMkE,OAAS,MAClCjY,KAAKuT,cAAcQ,MAAMmE,OAAS,IAClClY,KAAKuT,cAAcQ,MAAMoE,QAAU,UACnCnY,KAAKuT,cAAcQ,MAAMqE,aAAe,MACxCpY,KAAKuT,cAAcQ,MAAMsE,WAAa,sBACtCrY,KAAKuT,cAAcQ,MAAMuE,MAAQ,OACjCtY,KAAKuT,cAAcQ,MAAMwE,SAAW,OACpCvY,KAAKuT,cAAcQ,MAAMyE,WAAa,MACtCxY,KAAKuT,cAAcQ,MAAM6D,cAAgB,OACzC5X,KAAKmS,eAAesG,OAAOzY,KAAKuT,gBAGjCvT,KAAKsU,qBAAoB,GACzBtU,KAAK4V,mBAAmB5V,KAAKwS,YAAc,WAAa,SArBvDxS,KAAKsU,qBAAoB,EAsB3B,CAEAA,mBAAAA,CAAoBoE,GACd1Y,KAAKuT,gBACVvT,KAAKuT,cAAcQ,MAAM4E,QAAUD,EAAU,QAAU,OACxD,CAEA9C,kBAAAA,CAAmBgD,EAAQ,QAC1B,IAAK5Y,KAAKuT,gBAAkBvT,KAAKoS,SAASL,MAAO,OAEjD,MAAM1B,EAAOrQ,KAAKmS,eAAe7B,wBACjCtQ,KAAKuT,cAAcsF,YAAc,QAAQD,OAAWzD,KAAK2D,MAAMzI,EAAK0E,WAAWI,KAAK2D,MAAMzI,EAAKK,UAAUyE,KAAK2D,MAAMzI,EAAKoE,YAAYU,KAAK2D,MAAMzI,EAAKG,SACtJ,GCzUKmB,EAAkB,CACvBxR,QAAQ,EACR4Y,SAAU,IACVC,UAAW,IACX9B,SAAU,EACVnF,OAAO,GAGFkH,EAAsB,CAC3BC,EAAG,YACH1K,EAAG,YACHqB,EAAG,YACHsJ,EAAG,YACHC,GAAI,cACJC,GAAI,cACJC,GAAI,cACJC,GAAI,eAmaL,EAhaA,MACChZ,WAAAA,CAAYyR,EAAcC,EAAetM,EAAU,CAAC,GACnD3F,KAAKkS,cAAgBF,EACrBhS,KAAKmS,eAAiBF,EACtBjS,KAAKwZ,gBAAkBxZ,KAAKmS,eAAiBnS,KAAKmS,eAAe5K,cAAc,qBAAuB,KACtGvH,KAAKoS,SAAWpS,KAAKqS,kBAAkB1M,GACvC3F,KAAKsS,WAAa,KAClBtS,KAAKyZ,WAAa,GAClBzZ,KAAKyS,QAAU,EACfzS,KAAK0S,QAAU,EACf1S,KAAK2S,UAAY,EACjB3S,KAAK4S,UAAY,EACjB5S,KAAK0Z,YAAc,EACnB1Z,KAAK2Z,aAAe,EACpB3Z,KAAK4Z,WAAa,EAClB5Z,KAAK6Z,UAAY,EACjB7Z,KAAK8Z,YAAc,EACnB9Z,KAAK+Z,aAAe,EACpB/Z,KAAKiT,YAAa,EAClBjT,KAAKga,UAAY,KACjBha,KAAKia,aAAe,KACpBja,KAAKka,eAAiB,KACtBla,KAAKsT,eAAiB,GACtBtT,KAAKuT,cAAgB,KACrBvT,KAAKma,kBAAoB,GACzBna,KAAKoa,mBAAqB,GAC1Bpa,KAAKqa,uBAAyB,GAC9Bra,KAAKsa,mBAAqB,GAC1Bta,KAAKua,kBAAoB,GACzBva,KAAKmT,oBAAsB,GAC3BnT,KAAKoT,oBAAsB,GAC3BpT,KAAKwa,uBAAyB,GAC9Bxa,KAAKya,0BAA4B,GACjCza,KAAK0a,yBAA2B,GAEhC1a,KAAK0T,eAAiB1T,KAAK0T,eAAe/R,KAAK3B,MAC/CA,KAAKwT,eAAiBxT,KAAKwT,eAAe7R,KAAK3B,MAC/CA,KAAKyT,aAAezT,KAAKyT,aAAa9R,KAAK3B,MAC3CA,KAAK2a,gBAAkB3a,KAAK2a,gBAAgBhZ,KAAK3B,MACjDA,KAAK4a,qBAAuB5a,KAAK4a,qBAAqBjZ,KAAK3B,KAC5D,CAEA4T,UAAAA,CAAWjO,EAAU,CAAC,GACrB3F,KAAKoS,SAAWpS,KAAKqS,kBAAkB1M,EAAS3F,KAAKoS,UACrDpS,KAAK6T,qBACN,CAEA1T,MAAAA,GACMH,KAAKmS,iBAAkBnS,KAAKiT,aAEjCjT,KAAK6T,sBACL7T,KAAKkS,cAActC,iBAAiB,cAAe5P,KAAKwT,gBACxDxT,KAAKkS,cAActC,iBAAiB,cAAe5P,KAAK0T,gBACxD1T,KAAKkS,cAActC,iBAAiB,eAAgB5P,KAAK2a,iBACzD3a,KAAK6a,2BACL7a,KAAKiT,YAAa,EACnB,CAEAa,OAAAA,GACM9T,KAAKiT,aAEVjT,KAAKkS,cAAcR,oBAAoB,cAAe1R,KAAKwT,gBAC3DxT,KAAKkS,cAAcR,oBAAoB,cAAe1R,KAAK0T,gBAC3D1T,KAAKkS,cAAcR,oBAAoB,eAAgB1R,KAAK2a,iBAC5DtN,SAASqE,oBAAoB,cAAe1R,KAAKwT,gBACjDnG,SAASqE,oBAAoB,YAAa1R,KAAKyT,cAC/CpG,SAASqE,oBAAoB,gBAAiB1R,KAAKyT,cACnDzT,KAAK8a,qBACL9a,KAAK+a,0BACL/a,KAAKsS,WAAa,KAClBtS,KAAKyZ,WAAa,GAClBzZ,KAAKmS,eAAe4B,MAAMiH,OAAS,UAC5Bhb,KAAKkS,cAAckC,QAAQ6G,gBAClCjb,KAAKkU,wBACLlU,KAAKkb,uBACLlb,KAAKsU,qBAAoB,GACzBtU,KAAKiT,YAAa,EACnB,CAEAkI,cAAAA,GACC,GAAInb,KAAKkS,eAAgE,SAA/ClS,KAAKkS,cAAckC,QAAQC,gBAA4B,OACjF,IAAKrU,KAAKwU,4BAA6B,OAEvC,MAAMnE,EAAOrQ,KAAKmS,eAAe7B,wBAC3B8K,EAAepb,KAAKmS,eAAeuC,aAAerE,EAAKoE,MACvD4G,EAAgBrb,KAAKmS,eAAewC,cAAgBtE,EAAKG,OACzD8K,EAAmBzG,OAAOC,WAAW9U,KAAKmS,eAAe4B,MAAMgB,MAC/DwG,EAAkB1G,OAAOC,WAAW9U,KAAKmS,eAAe4B,MAAMrD,KAC9DkE,EAAcC,OAAOI,SAASqG,GAAoBA,EAAmBjL,EAAK0E,KAC1EC,EAAaH,OAAOI,SAASsG,GAAmBA,EAAkBlL,EAAKK,IACvE8K,EAAWnG,OAAOC,WAClBmG,EAAYpG,OAAOG,YACnBf,EAAQU,KAAKC,IAAIpV,KAAKoS,SAAS2G,SAAU5D,KAAKO,IAAI0F,EAAcI,IAChEhL,EAAS2E,KAAKC,IAAIpV,KAAKoS,SAAS4G,UAAW7D,KAAKO,IAAI2F,EAAeI,IACnEvG,EAAUC,KAAKC,IAAI,EAAGC,OAAOC,WAAab,GAC1Cc,EAASJ,KAAKC,IAAI,EAAGC,OAAOG,YAAchF,GAC1CuE,EAAOI,KAAKO,IAAIR,EAASC,KAAKC,IAAI,EAAGR,IACrClE,EAAMyE,KAAKO,IAAIH,EAAQJ,KAAKC,IAAI,EAAGJ,IAErCG,KAAKuG,IAAIN,EAAe3G,GAAS,KACpCzU,KAAKmS,eAAe4B,MAAMU,MAAQ,GAAGA,OAGlCU,KAAKuG,IAAIL,EAAgB7K,GAAU,KACtCxQ,KAAKmS,eAAe4B,MAAMvD,OAAS,GAAGA,OAGvCxQ,KAAKmS,eAAe4B,MAAMgB,KAAO,GAAGA,MACpC/U,KAAKmS,eAAe4B,MAAMrD,IAAM,GAAGA,MACnC1Q,KAAK4V,oBACN,CAEAlC,cAAAA,CAAepG,GACd,GAAqB,IAAjBA,EAAMhG,OAAc,OACxB,GAAIgG,EAAMqO,iBAAkB,OAE5B,MAAMC,EAAY5b,KAAK6b,yBAAyBvO,GAChD,IAAKsO,EAAW,OAEhBtO,EAAME,iBACNxN,KAAKsS,WAAahF,EAAM0I,UACxBhW,KAAKyZ,WAAamC,EAElB,MAAMvL,EAAOrQ,KAAKmS,eAAe7B,wBACjCtQ,KAAK8b,qBACL9b,KAAKwW,iBAAiBnG,GACtBrQ,KAAKyS,QAAUnF,EAAM2I,QACrBjW,KAAK0S,QAAUpF,EAAMmD,QACrBzQ,KAAK2S,UAAYrF,EAAM2I,QACvBjW,KAAK4S,UAAYtF,EAAMmD,QACvBzQ,KAAK0Z,YAAcrJ,EAAKoE,MACxBzU,KAAK2Z,aAAetJ,EAAKG,OACzBxQ,KAAK4Z,WAAavJ,EAAK0E,KACvB/U,KAAK6Z,UAAYxJ,EAAKK,IACtB1Q,KAAK8Z,YAAczJ,EAAK0L,MACxB/b,KAAK+Z,aAAe1J,EAAK4H,OACzBjY,KAAKkW,sBACLlW,KAAKkS,cAAckC,QAAQ6G,gBAAkB,OAC7Cjb,KAAKsU,qBAAoB,GACzBtU,KAAK4V,qBAELvI,SAASuC,iBAAiB,cAAe5P,KAAKwT,gBAC9CnG,SAASuC,iBAAiB,YAAa5P,KAAKyT,cAC5CpG,SAASuC,iBAAiB,gBAAiB5P,KAAKyT,aACjD,CAEAD,cAAAA,CAAelG,GACd,GAAwB,OAApBtN,KAAKsS,WAMLhF,EAAM0I,YAAchW,KAAKsS,aAE7BtS,KAAK2S,UAAYrF,EAAM2I,QACvBjW,KAAK4S,UAAYtF,EAAMmD,QACK,OAAxBzQ,KAAKka,iBACTla,KAAKka,eAAiB7E,OAAOpF,sBAAsBjQ,KAAK4a,4BAXxD,CACC,MAAMgB,EAAY5b,KAAK6b,yBAAyBvO,GAChDtN,KAAKmS,eAAe4B,MAAMiH,OAASY,EAAY3C,EAAoB2C,GAAa,EAEjF,CAQD,CAEAhB,oBAAAA,GAEC,GADA5a,KAAKka,eAAiB,KACE,OAApBla,KAAKsS,WAAqB,OAE9B,MAAM8D,EAASpW,KAAK2S,UAAY3S,KAAKyS,QAC/B4D,EAASrW,KAAK4S,UAAY5S,KAAK0S,QACrC,IAAI+B,EAAQzU,KAAK0Z,YACblJ,EAASxQ,KAAK2Z,aACd5E,EAAO/U,KAAK4Z,WACZlJ,EAAM1Q,KAAK6Z,UAEf,GAAI7Z,KAAKyZ,WAAW/N,SAAS,KAAM,CAClC,MAAM8P,EAAWrG,KAAKC,IAAIpV,KAAKoS,SAAS2G,SAAU1D,OAAOC,WAAatV,KAAK4Z,YAC3EnF,EAAQU,KAAKO,IAAI8F,EAAUrG,KAAKC,IAAIpV,KAAKoS,SAAS2G,SAAU/Y,KAAK0Z,YAActD,GAChF,CAEA,GAAIpW,KAAKyZ,WAAW/N,SAAS,KAAM,CAClC,MAAM+P,EAAYtG,KAAKC,IAAIpV,KAAKoS,SAAS4G,UAAW3D,OAAOG,YAAcxV,KAAK6Z,WAC9ErJ,EAAS2E,KAAKO,IAAI+F,EAAWtG,KAAKC,IAAIpV,KAAKoS,SAAS4G,UAAWhZ,KAAK2Z,aAAetD,GACpF,CAEA,GAAIrW,KAAKyZ,WAAW/N,SAAS,KAAM,CAClC,MAAMwJ,EAAUlV,KAAK8Z,YAAc9Z,KAAKoS,SAAS2G,SACjDhE,EAAOI,KAAKO,IAAIR,EAASC,KAAKC,IAAI,EAAGpV,KAAK4Z,WAAaxD,IACvD3B,EAAQzU,KAAK8Z,YAAc/E,CAC5B,CAEA,GAAI/U,KAAKyZ,WAAW/N,SAAS,KAAM,CAClC,MAAM6J,EAASvV,KAAK+Z,aAAe/Z,KAAKoS,SAAS4G,UACjDtI,EAAMyE,KAAKO,IAAIH,EAAQJ,KAAKC,IAAI,EAAGpV,KAAK6Z,UAAYxD,IACpD7F,EAASxQ,KAAK+Z,aAAerJ,CAC9B,CAEA1Q,KAAKmS,eAAe4B,MAAMgB,KAAO,GAAGA,MACpC/U,KAAKmS,eAAe4B,MAAMrD,IAAM,GAAGA,MACnC1Q,KAAKmS,eAAe4B,MAAMU,MAAQ,GAAGA,MACrCzU,KAAKmS,eAAe4B,MAAMvD,OAAS,GAAGA,MACtCxQ,KAAK4V,oBACN,CAEAnC,YAAAA,CAAanG,GACRA,EAAM0I,YAAchW,KAAKsS,aAE7BjF,SAASqE,oBAAoB,cAAe1R,KAAKwT,gBACjDnG,SAASqE,oBAAoB,YAAa1R,KAAKyT,cAC/CpG,SAASqE,oBAAoB,gBAAiB1R,KAAKyT,cACnDzT,KAAK8a,qBACL9a,KAAK4a,uBACL5a,KAAKsS,WAAa,KAClBtS,KAAKyZ,WAAa,UACXzZ,KAAKkS,cAAckC,QAAQ6G,gBAClCjb,KAAKkU,wBACLlU,KAAKsU,oBAAoBtU,KAAKoS,SAASL,OACvC/R,KAAK4V,qBACN,CAEA+E,eAAAA,GACyB,OAApB3a,KAAKsS,aACTtS,KAAKmS,eAAe4B,MAAMiH,OAAS,GACpC,CAEAa,wBAAAA,CAAyBvO,GACxB,MAAM+C,EAAOrQ,KAAKmS,eAAe7B,wBAC3B0G,EAAU1J,EAAM2I,QAAU5F,EAAK0E,KAC/BkC,EAAU3J,EAAMmD,QAAUJ,EAAKK,IAC/BwG,EAAWlX,KAAKoS,SAAS8E,SAE/B,KADqBF,GAAW,GAAKA,GAAW3G,EAAKoE,OAASwC,GAAW,GAAKA,GAAW5G,EAAKG,QAC3E,MAAO,GAE1B,MAAM2G,EAAUF,GAAW,GAAKA,GAAWC,EACrCE,EAAaH,GAAW5G,EAAKG,QAAUyG,GAAW5G,EAAKG,OAAS0G,EAChEG,EAAWL,GAAW,GAAKA,GAAWE,EACtCI,EAAYN,GAAW3G,EAAKoE,OAASuC,GAAW3G,EAAKoE,MAAQyC,EAEnE,OAAIC,GAAWE,EAAiB,KAC5BF,GAAWG,EAAkB,KAC7BF,GAAcC,EAAiB,KAC/BD,GAAcE,EAAkB,KAChCH,EAAgB,IAChBC,EAAmB,IACnBC,EAAiB,IACjBC,EAAkB,IAEf,EACR,CAEAd,gBAAAA,CAAiBnG,GAChBrQ,KAAKmS,eAAe4B,MAAM6C,SAAW,QACrC5W,KAAKmS,eAAe4B,MAAM8C,OAAS,IACnC7W,KAAKmS,eAAe4B,MAAMgB,KAAO,GAAG1E,EAAK0E,SACzC/U,KAAKmS,eAAe4B,MAAMrD,IAAM,GAAGL,EAAKK,QACxC1Q,KAAKmS,eAAe4B,MAAMU,MAAQ,GAAGpE,EAAKoE,UAC1CzU,KAAKmS,eAAe4B,MAAMvD,OAAS,GAAGH,EAAKG,WAC3CxQ,KAAKmS,eAAe4B,MAAM+C,UAAY,OACtC9W,KAAKmS,eAAe4B,MAAMgD,UAAY,MACvC,CAEAvC,yBAAAA,GACC,MAA8C,UAAvCxU,KAAKmS,eAAe4B,MAAM6C,UAAgE,SAAxC5W,KAAKmS,eAAe4B,MAAM+C,SACpF,CAEA+D,wBAAAA,GAC+B,oBAAnBmB,gBAAkChc,KAAKga,YAElDha,KAAKga,UAAY,IAAIgC,gBAAe,KACX,OAApBhc,KAAKsS,aACLtS,KAAKkS,eAAgE,SAA/ClS,KAAKkS,cAAckC,QAAQC,iBAC3B,OAAtBrU,KAAKia,eAETja,KAAKia,aAAe5E,OAAOpF,uBAAsB,KAChDjQ,KAAKia,aAAe,KACpBja,KAAKmb,gBAAgB,KACpB,IAGHnb,KAAKga,UAAUiC,QAAQjc,KAAKmS,gBAC7B,CAEA4I,uBAAAA,GACK/a,KAAKga,YACRha,KAAKga,UAAUkC,aACflc,KAAKga,UAAY,MAGQ,OAAtBha,KAAKia,eACR5E,OAAO8G,qBAAqBnc,KAAKia,cACjCja,KAAKia,aAAe,KAEtB,CAEA6B,kBAAAA,GACC9b,KAAKma,kBAAoBna,KAAKmS,eAAe4B,MAAMyH,SACnDxb,KAAKoa,mBAAqBpa,KAAKmS,eAAe4B,MAAM0H,UACpDzb,KAAKqa,uBAAyBra,KAAKmS,eAAe4B,MAAM6D,cACxD5X,KAAKsa,mBAAqBta,KAAKmS,eAAe4B,MAAMiF,UACpDhZ,KAAKua,kBAAoBva,KAAKmS,eAAe4B,MAAMqI,SACnDpc,KAAKmT,oBAAsBnT,KAAKmS,eAAe4B,MAAMwD,WACrDvX,KAAKoT,oBAAsBpT,KAAKmS,eAAe4B,MAAMyD,WAErDxX,KAAKmS,eAAe4B,MAAMyH,SAAW,OACrCxb,KAAKmS,eAAe4B,MAAM0H,UAAY,OACtCzb,KAAKmS,eAAe4B,MAAM6D,cAAgB,OAC1C5X,KAAKmS,eAAe4B,MAAMiF,UAAY,GAAGhZ,KAAKoS,SAAS4G,cACvDhZ,KAAKmS,eAAe4B,MAAMqI,SAAW,SACrCpc,KAAKmS,eAAe4B,MAAMwD,WAAa,OACvCvX,KAAKmS,eAAe4B,MAAMyD,WAAa,2BAEnCxX,KAAKwZ,kBACRxZ,KAAKwa,uBAAyBxa,KAAKwZ,gBAAgBzF,MAAMvD,OACzDxQ,KAAKya,0BAA4Bza,KAAKwZ,gBAAgBzF,MAAM0H,UAC5Dzb,KAAK0a,yBAA2B1a,KAAKwZ,gBAAgBzF,MAAMqI,SAC3Dpc,KAAKwZ,gBAAgBzF,MAAMvD,OAAS,OACpCxQ,KAAKwZ,gBAAgBzF,MAAM0H,UAAY,OACvCzb,KAAKwZ,gBAAgBzF,MAAMqI,SAAW,OAExC,CAEAlB,oBAAAA,GACClb,KAAKmS,eAAe4B,MAAMyH,SAAWxb,KAAKma,kBAC1Cna,KAAKmS,eAAe4B,MAAM0H,UAAYzb,KAAKoa,mBAC3Cpa,KAAKmS,eAAe4B,MAAM6D,cAAgB5X,KAAKqa,uBAC/Cra,KAAKmS,eAAe4B,MAAMiF,UAAYhZ,KAAKsa,mBAC3Cta,KAAKmS,eAAe4B,MAAMqI,SAAWpc,KAAKua,kBAC1Cva,KAAKmS,eAAe4B,MAAMwD,WAAavX,KAAKmT,oBAC5CnT,KAAKmS,eAAe4B,MAAMyD,WAAaxX,KAAKoT,oBAExCpT,KAAKwZ,kBACRxZ,KAAKwZ,gBAAgBzF,MAAMvD,OAASxQ,KAAKwa,uBACzCxa,KAAKwZ,gBAAgBzF,MAAM0H,UAAYzb,KAAKya,0BAC5Cza,KAAKwZ,gBAAgBzF,MAAMqI,SAAWpc,KAAK0a,yBAE7C,CAEArI,iBAAAA,CAAkB1M,EAASkS,EAAOlG,GACjC,MAAMmG,EAAS,IAAID,KAASlS,GACtBoT,EAAWlE,OAAOiD,EAAOiB,UACzBC,EAAYnE,OAAOiD,EAAOkB,WAC1B9B,EAAWrC,OAAOiD,EAAOZ,UAE/B,MAAO,IACHY,EACHiB,SAAUlE,OAAOI,SAAS8D,IAAaA,EAAW,EAAIA,EAAWpH,EAAgBoH,SACjFC,UAAWnE,OAAOI,SAAS+D,IAAcA,EAAY,EAAIA,EAAYrH,EAAgBqH,UACrF9B,SAAUrC,OAAOI,SAASiC,IAAaA,EAAW,EAAIA,EAAWvF,EAAgBuF,SACjFnF,MAAOgG,QAAQD,EAAO/F,OAExB,CAEA+I,kBAAAA,GAC6B,OAAxB9a,KAAKka,iBACT7E,OAAO8G,qBAAqBnc,KAAKka,gBACjCla,KAAKka,eAAiB,KACvB,CAEAhE,mBAAAA,GACC,IAAKlW,KAAKmS,gBAAkBnS,KAAKsT,eAAelF,OAAQ,OAExD,MAAMqJ,EAAUzX,KAAKmS,eAAe3C,iBAAiB,UACrD,IAAK,MAAMkI,KAASD,EACnBzX,KAAKsT,eAAeqE,KAAK,CACxBnX,QAASkX,EACTE,cAAeF,EAAM3D,MAAM6D,gBAE5BF,EAAM3D,MAAM6D,cAAgB,MAE9B,CAEA1D,qBAAAA,GACC,GAAKlU,KAAKsT,eAAelF,OAAzB,CAEA,IAAK,MAAM0B,KAAQ9P,KAAKsT,eACvBxD,EAAKtP,QAAQuT,MAAM6D,cAAgB9H,EAAK8H,cAEzC5X,KAAKsT,eAAiB,EALiB,CAMxC,CAEAO,mBAAAA,GACM7T,KAAKoS,SAASL,OAKd/R,KAAKuT,gBACTvT,KAAKuT,cAAgBlG,SAAS2K,cAAc,OAC5ChY,KAAKuT,cAAcQ,MAAM6C,SAAW,WACpC5W,KAAKuT,cAAcQ,MAAMgB,KAAO,MAChC/U,KAAKuT,cAAcQ,MAAMkE,OAAS,MAClCjY,KAAKuT,cAAcQ,MAAMmE,OAAS,IAClClY,KAAKuT,cAAcQ,MAAMoE,QAAU,UACnCnY,KAAKuT,cAAcQ,MAAMqE,aAAe,MACxCpY,KAAKuT,cAAcQ,MAAMsE,WAAa,sBACtCrY,KAAKuT,cAAcQ,MAAMuE,MAAQ,OACjCtY,KAAKuT,cAAcQ,MAAMwE,SAAW,OACpCvY,KAAKuT,cAAcQ,MAAMyE,WAAa,MACtCxY,KAAKuT,cAAcQ,MAAM6D,cAAgB,OACzC5X,KAAKmS,eAAesG,OAAOzY,KAAKuT,gBAGjCvT,KAAKsU,qBAAoB,GACzBtU,KAAK4V,sBArBJ5V,KAAKsU,qBAAoB,EAsB3B,CAEAA,mBAAAA,CAAoBoE,GACd1Y,KAAKuT,gBACVvT,KAAKuT,cAAcQ,MAAM4E,QAAUD,EAAU,QAAU,OACxD,CAEA9C,kBAAAA,GACC,IAAK5V,KAAKuT,gBAAkBvT,KAAKoS,SAASL,MAAO,OAEjD,MAAM1B,EAAOrQ,KAAKmS,eAAe7B,wBACjCtQ,KAAKuT,cAAcsF,YAAc,KAAK1D,KAAK2D,MAAMzI,EAAKoE,YAAYU,KAAK2D,MAAMzI,EAAKG,aAAa2E,KAAK2D,MAAMzI,EAAK0E,WAAWI,KAAK2D,MAAMzI,EAAKK,MAC3I,GC/ZK7N,EAAW,WAUXwZ,EAAkB,gBAKlBC,EAAkB,OAKlBC,EAAmB,QACnBC,EAAsB,mBACtBC,EAAoB,CACzBC,KAAM,GACNC,KAAM,GAAGH,QACTI,KAAM,GAAGJ,QACTK,KAAM,GAAGL,QACT,WAAY,GAAGA,YACf,aAAc,GAAGA,eAIZM,EAAqB,GAAGja,SACxBka,EAAqB,GAAGla,WACxBma,EAAqB,GAAGna,SACxBoa,EAAqB,GAAGpa,UACxBqa,EAAqB,GAAGra,WACxBsa,EAA4B,mBAAmBta,IAE/Cua,EAA4B,SAASva,aACrCwa,EAAoC,2BAA2Bxa,IAC/Dya,EAAkC,yBAAyBza,IAC3D0a,EAAsC,6BAA6B1a,IACnE2a,EAAiB,CACtB7Q,QAAS,UACTyC,MAAO,SACPvC,QAAS,UACTC,KAAM,QAoCD2Q,EAAgB,CACrBC,QAAQ,EACRC,UAAW,gBACXC,UAAU,EACVC,MAAO,IACPC,kBAAkB,EAClBC,mBAAmB,EACnBC,UAAU,EACVC,MAAO,OACPjS,KAAM,KACNkS,MAAO,CACN/d,QAAQ,EACRiV,IAAK,GAEN+I,KAAM,CACLhe,QAAQ,EACRyR,SAAU,oBACVC,UAAW,EACXC,eAAgB,EAChBC,OAAO,GAERqM,OAAQ,CACPje,QAAQ,EACR+W,SAAU,EACV6B,SAAU,IACVC,UAAW,GACXjH,OAAO,GAERsM,UAAW,CACVle,QAAQ,EACRC,GAAI,oBACJC,IAAK,uBACLwd,MAAO,IACPS,OAAQ,QAET3a,KAAM,CACLS,MAAO,GACPE,OAAQ,GACRD,OAAQ,MACRE,QAAQ,EACRQ,MAAM,EACNP,QAAQ,IAQV,MAAMyM,UAAgBsN,EAAAA,EAMrBhe,WAAAA,CAAYC,EAASuC,EAAS,CAAC,GAC9Byb,MAAMhe,EAASuC,GAGf/C,KAAKye,qBAAuB,CAC3BN,KAAM,CACLhe,QAAQ,EACRyR,SAAU,oBACVC,UAAW,EACXC,eAAgB,EAChBC,OAAO,GAERqM,OAAQ,CACPje,QAAQ,EACR+W,SAAU,EACV6B,SAAU,IACVC,UAAW,GACXjH,OAAO,IAGT/R,KAAKa,QAAUb,KAAK8C,WAAWtC,GAASM,EAAAA,EAAAA,IAAgB2c,EAAe1a,IACvE/C,KAAK0e,aAAe,IAAIC,EAAY3e,KAAKW,SAAUX,KAAKW,UACxDX,KAAK4e,eAAiB,IAAIC,EAAc7e,KAAKW,SAAUX,KAAKW,UAC5DX,KAAK8e,mBAAqB9e,KAAK+e,4BAC/B/e,KAAK0e,aAAa9K,WAAW5T,KAAK8e,mBAAmBX,MACrDne,KAAK4e,eAAehL,WAAW5T,KAAK8e,mBAAmBV,QACvDpe,KAAK6H,WAAW7H,KAAKW,SAAUsQ,EAAQpO,SAAU7C,KAAKa,QAAQwd,WAC9Dre,KAAKgf,yBACLhf,KAAKmH,kBACLnH,KAAKif,qBAGLjf,KAAKkf,SAAW,KAChBlf,KAAKmf,aAAe,KACpBnf,KAAKof,WAAY,CAClB,CAMA,eAAW9W,GACV,MAzLW,OA0LZ,CAMA,mBAAWzF,GACV,OAAOA,CACR,CASA,UAAOqO,CAAImO,EAAMtc,EAAS,CAAC,EAAGQ,GAC7B,OAAO0N,EAAQqO,MAAMD,EAAMtc,EAAQQ,EACpC,CASA,YAAO+b,CAAMD,EAAMtc,EAAQQ,GAC1B,MAAMgc,EAAYxc,GAA4B,iBAAXA,EAAsBA,EAAS,CAAC,EAC7Dyc,EAAmBpc,OAAO+E,UAAUhE,eAAeiE,KAAKmX,EAAW,aACzExc,GAASjC,EAAAA,EAAAA,IAAgB2c,EAAe,CAAEC,QAAQ,EAAOE,UAAU,GAAQ2B,IAChE7B,SAAW8B,IACrBzc,EAAO6a,UAAW,GAGnB,MAAMpM,EAAK,aAAciO,EAAAA,EAAAA,MACnBnb,EAAS+I,SAAS2K,cAAc,OACtC1T,EAAOnD,UAAUC,IAAI,YACrBkD,EAAOkN,GAAKA,EAGRzO,EAAOkb,OACV3Z,EAAOnD,UAAUC,IAAI,YAAY2B,EAAOkb,SAIrClb,EAAO4a,WACV5a,EAAO4a,UAAUnS,MAAM,KAAKpJ,SAAQF,GAAOoC,EAAOnD,UAAUC,IAAIc,KAGjE,MAAMwd,EAAUrS,SAAS2K,cAAc,OAIvC,GAHA0H,EAAQve,UAAUC,IAAI,oBAGlB2B,EAAOiJ,KAAM,CAChB,MAAM2T,EAAWnC,EAAeza,EAAOiJ,MACjC4T,EAAUD,GAAWtY,EAAAA,EAAAA,GAAOsY,GAAY,GAE9C,GAAIC,EAAS,CACZ,MAAMC,EAAOxS,SAAS2K,cAAc,OACpC6H,EAAK1e,UAAUC,IAAI,iBACnB,MAAM0e,EAAcC,EAAAA,EAAAA,iBAA0BH,GAExCI,EADW3S,SAAS4S,cAAcC,yBAAyBJ,GACrCK,kBAExBH,GACHH,EAAKpH,OAAOuH,GAEbN,EAAQjH,OAAOoH,EAChB,CACD,CAEA,MAAMO,EAAU/S,SAAS2K,cAAc,OACvCoI,EAAQjf,UAAUC,IAAI,oBAEtB,MAAM0F,EAAOuG,SAAS2K,cAAc,OAGpC,GAFAlR,EAAK3F,UAAUC,IAAI,iBAEC,iBAATie,EACVvY,EAAKhD,UAAYub,EACjBe,EAAQ3H,OAAO3R,QACT,GAAIsK,MAAMiP,QAAQhB,GAAO,CAC/B,GAAIA,EAAKjR,OAAS,EAAG,CACpB,MAAMkS,EAASjT,SAAS2K,cAAc,OACtCsI,EAAOnf,UAAUC,IAAI,mBACrBkf,EAAOxc,UAAYub,EAAK,GACxBe,EAAQ3H,OAAO6H,EAChB,CACAxZ,EAAKhD,UAAYub,EAAK,GACtBe,EAAQ3H,OAAO3R,EAChB,CAKA,GAHA4Y,EAAQjH,OAAO2H,GAGXrd,EAAOgb,kBAAmB,CAC7BzZ,EAAOnD,UAAUC,IAAI,uBACrB,MAAMkG,EAAS+F,SAAS2K,cAAc,OACtC1Q,EAAOnG,UAAUC,IAAI,mBACrBkG,EAAOxD,UAAY,iEACnB4b,EAAQjH,OAAOnR,EAChB,CAEAhD,EAAOmU,OAAOiH,GACdrS,SAASvG,KAAK2R,OAAOnU,GAErB,MAAMic,EAAWtP,EAAQlJ,oBAAoBzD,EAAQvB,GASrD,OARIA,EAAOsb,YACVkC,EAAS1Y,WAAWvD,EAAQ2M,EAAQpO,SAAUE,EAAOsb,WACrDkC,EAASvB,2BAGV/Z,EAAAA,EAAAA,IAAQ1B,EAAU,CAACgd,IACnBA,EAASC,OAEFD,CACR,CAOAE,MAAAA,CAAOC,GACN,OAAO1gB,KAAK2gB,WAAa3gB,KAAK4gB,OAAS5gB,KAAKwgB,KAAKE,EAClD,CAOAF,IAAAA,CAAKE,GACJ,IAAIjT,EAAAA,EAAAA,IAAWzN,KAAKW,UAAW,OAE/B,MAAMH,EAAUR,KAAKW,SACrBX,KAAK6gB,gBACL7gB,KAAK8gB,oBACL9gB,KAAKof,WAAY,EACjBpf,KAAK+gB,8BAEL/gB,KAAKa,QAAUb,KAAK8C,WAAW4d,GAAiB,CAAC,EAAG1gB,KAAKa,SACzDb,KAAKsD,QAAO,CAACwB,EAAQD,KAChB7E,KAAKW,WAAaH,GACtBgB,EAAAA,EAAawf,QAAQxgB,EAAS0c,EAAkB,CAAE+D,MAAOnc,EAAQD,QAAO,IAGvDrD,EAAAA,EAAawf,QAAQxgB,EAASwc,EAAgB,CAAE0D,kBACpD/E,mBAEdnb,EAAQW,UAAUG,OAAOib,GACzB/b,EAAQW,UAAUC,IAAIkb,GACtBjP,SAASvG,KAAK3F,UAAUC,IAAIib,GAE5Brc,KAAKkhB,gBAYLlhB,KAAKyH,gBAVoB0Z,KACpBnhB,KAAKW,WAAaH,GAAWR,KAAKof,YAEtC5e,EAAQW,UAAUC,IAAImb,GACtBvc,KAAKohB,6BACLphB,KAAKqhB,yBACLrhB,KAAKshB,gBACL9f,EAAAA,EAAawf,QAAQxgB,EAASyc,EAAiB,CAAEyD,kBAAgB,GAG5BlgB,GAAS,EAAMR,KAAKa,QAAQwd,UAAUR,OAC7E,CAMA+C,IAAAA,GACC,IAAInT,EAAAA,EAAAA,IAAWzN,KAAKW,WAAaX,KAAKof,UAAW,OAEjD,MAAM5e,EAAUR,KAAKW,SACrBX,KAAK6gB,gBACL7gB,KAAK8gB,oBAEatf,EAAAA,EAAawf,QAAQxgB,EAASsc,GAClCnB,mBAEd3b,KAAKof,WAAY,EACjB5e,EAAQW,UAAUG,OAAOib,GACzBvc,KAAK+gB,8BAEL/gB,KAAKmf,aAAe5Z,YAAW,KAC9BvF,KAAKmf,aAAe,KAChBnf,KAAKW,WAAaH,IAEtBA,EAAQW,UAAUG,OAAOgb,GACrBtc,KAAKa,QAAQqd,MAAM/d,QACtBH,KAAKkhB,gBAoBNlhB,KAAKyH,gBAjBoB8Z,KACxB,GAAIvhB,KAAKW,WAAaH,EAAS,OAE1B+B,EAAAA,EAAUC,KAAK,mBACnB6K,SAASvG,KAAK3F,UAAUG,OAAO+a,GAGhC,MAAMmF,GAAiBxhB,KAAKa,QAAQ6c,OACpC1d,KAAKof,WAAY,EACjB5d,EAAAA,EAAawf,QAAQxgB,EAASuc,GAE1B/c,KAAKW,WAAaH,GAClBghB,GACHxhB,KAAKqC,SACN,GAGqC7B,GAAS,EAAOR,KAAKa,QAAQwd,UAAUR,OAAM,GACjF7d,KAAKa,QAAQwd,UAAUR,OAC3B,CAMAxb,OAAAA,GACMrC,KAAKW,WAEVX,KAAK6gB,gBACL7gB,KAAK8gB,oBACL9gB,KAAK+gB,8BACA/gB,KAAKa,QAAQ6c,QACjB1d,KAAKW,SAASW,SAEfkd,MAAMnc,UACP,CAMAif,aAAAA,GACCthB,KAAK6gB,gBACA7gB,KAAKa,QAAQ+c,WAElB5d,KAAKkf,SAAW3Z,YAAW,IAAMvF,KAAK4gB,QAAQ5gB,KAAKa,QAAQgd,OAC5D,CAOA8C,QAAAA,GACC,QAAS3gB,KAAKW,UAAYX,KAAKW,SAASQ,UAAUE,SAASib,EAC5D,CAQAmF,YAAAA,GACC,MAKMC,EALY1hB,KAAKa,QAAQ8c,UACPjS,SAAS,OAIN,MAAQ,SAC7BiW,EAAYpf,EAAAA,EAAUqf,QAAQ,kBAAkBF,KACpDzf,QAAOqP,IACP,MAAMiP,EAAWtP,EAAQnJ,YAAYwJ,GACrC,OAAOiP,GAAU1f,QAAQqd,MAAM/d,MAAM,IAGvC,IAAKH,KAAKa,QAAQqd,MAAM/d,OAKvB,OAHAwhB,EACE1f,QAAOqP,GAAMA,IAAOtR,KAAKW,WACzByB,SAAQkP,GAAML,EAAQnJ,YAAYwJ,GAAIsP,SACjC,CAAC,CAAEtP,GAAItR,KAAKW,SAAU+P,IAAK,IAI/BiR,EAAUvT,QAAUpO,KAAKa,QAAQqd,MAAM9I,KAC3BuM,EAAUE,MAAM,EAAGF,EAAUvT,OAASpO,KAAKa,QAAQqd,MAAM9I,IAAM,GACvEhT,SAAQkP,GAAML,EAAQnJ,YAAYwJ,GAAIsP,SAI9C,MACMkB,EADUH,EAAU1f,QAAOqP,GAAMA,IAAOtR,KAAKW,WAC5BohB,QAAO,CAACC,EAAK1Q,IAAO0Q,EAAM1Q,EAAG2Q,cAAc,GAElE,OAAON,EAAUjW,SAAS1L,KAAKW,UAC5BghB,EAAUrT,KAAI,CAACgD,EAAI4Q,KAEb,CAAE5Q,KAAIZ,IADKiR,EAAUE,MAAM,EAAGK,GAAOH,QAAO,CAACC,EAAKnS,IAAMmS,EAAMnS,EAAEoS,cAAc,OAGpF,CAAC,CAAE3Q,GAAItR,KAAKW,SAAU+P,IAAKoR,GAC/B,CAMAZ,aAAAA,GACC,MAAMiB,EAAaniB,KAAKyhB,eAClBW,EAAQpiB,KAAKa,QAAQ8c,UAAUjS,SAAS,OAExCgW,EAAaU,EAAQ,MAAQ,SAC7BC,EAAe9f,EAAAA,EAAUqf,QAAQ,kBAAkBF,KACvDzf,QAAOqP,IACP,MAAMiP,EAAWtP,EAAQnJ,YAAYwJ,GACrC,OAAOiP,GAAU1f,QAAQqd,MAAM/d,MAAM,IAEjCmiB,EAAOD,EAAajU,OAASiU,EAAeF,EAAW7T,KAAIwB,GAAQA,EAAKwB,KAC9E,IAAIwQ,EAAS,EAEbQ,EAAKlgB,SAASkP,IACb,MAAMiP,EAAWtP,EAAQnJ,YAAYwJ,GAC/BqM,EAAY4C,GAAU1f,QAAQ8c,WAAa3d,KAAKa,QAAQ8c,UACxD4E,EAAW5E,EAAUjS,SAAS,UAC9B8W,EAAS7E,EAAUjS,SAAS,QAC5B+W,EAAU9E,EAAUjS,SAAS,SAC7BqI,EAAQzC,EAAGyC,MACjBA,EAAMgB,KAAO,GACbhB,EAAMgI,MAAQ,GACdhI,EAAMrD,IAAM,GACZqD,EAAMkE,OAAS,GACflE,EAAM+C,UAAY,GAClB/C,EAAMgD,UAAY,GAEdwL,GACHxO,EAAMgB,KAAO,MACbhB,EAAMgD,UAAY,UACRyL,EACVzO,EAAMgB,KAAO,IACH0N,EACV1O,EAAMgI,MAAQ,KAGdhI,EAAMgB,KAAO,MACbhB,EAAMgD,UAAY,UAGfqL,EACHrO,EAAMrD,IAAMoR,EAAS,KAErB/N,EAAMkE,OAAS6J,EAAS,KAGzBA,GAAUxQ,EAAGqD,YAAY,GAE3B,CAMAyM,0BAAAA,GACCphB,KAAK8e,mBAAqB9e,KAAK+e,4BAC/B/e,KAAK0e,aAAa9K,WAAW5T,KAAK8e,mBAAmBX,MACrDne,KAAK4e,eAAehL,WAAW5T,KAAK8e,mBAAmBV,QAEnDpe,KAAK8e,mBAAmBX,KAAKhe,OAChCH,KAAK0e,aAAave,SAElBH,KAAK0e,aAAa5K,UAGf9T,KAAK8e,mBAAmBV,OAAOje,OAClCH,KAAK4e,eAAeze,SAEpBH,KAAK4e,eAAe9K,SAEtB,CAEAiN,2BAAAA,GACC/gB,KAAK0e,aAAa5K,UAClB9T,KAAK4e,eAAe9K,SACrB,CAEAuN,sBAAAA,GACKrhB,KAAK8e,mBAAmBV,OAAOje,QAClCH,KAAK4e,eAAezD,iBAGjBnb,KAAK8e,mBAAmBX,KAAKhe,QAChCH,KAAK0e,aAAanK,cAEpB,CAEAwK,yBAAAA,GACC,MAAO,CACNZ,KAAMne,KAAK0iB,4BAA4B1iB,KAAKa,QAAQsd,KAAMne,KAAKye,qBAAqBN,MACpFC,OAAQpe,KAAK0iB,4BAA4B1iB,KAAKa,QAAQud,OAAQpe,KAAKye,qBAAqBL,QAE1F,CAEAsE,2BAAAA,CAA4BC,EAAaC,GACxC,GAA2B,kBAAhBD,EACV,MAAO,IAAIC,EAAUziB,OAAQwiB,GAG9B,GAAIA,GAAsC,iBAAhBA,EAA0B,CACnD,MAAME,EAAYzf,OAAO+E,UAAUhE,eAAeiE,KAAKua,EAAa,UACpE,MAAO,IACHC,KACAD,EACHxiB,QAAQ0iB,GAAY9K,QAAQ4K,EAAYxiB,QAE1C,CAEA,MAAO,IAAIyiB,EACZ,CAEA5D,sBAAAA,GACC,MAAM7d,EAAYnB,KAAKW,SAASQ,UACV,IAAIA,GAAWc,QAAO6gB,GAAaA,EAAU3gB,WAAWqa,KAChEpa,SAAQ0gB,GAAa3hB,EAAUG,OAAOwhB,KAEhC9iB,KAAK+iB,+BAA+B/iB,KAAKa,QAAQwd,WAAWC,QACpElc,SAAQ0gB,GAAa3hB,EAAUC,IAAI0hB,IAChD,CAEAC,8BAAAA,CAA+BC,GAC9B,MACMC,GADS7R,MAAMiP,QAAQ2C,GAAeA,EAAc,CAACA,IAEzD/gB,OAAO8V,SACPzJ,KAAIgQ,GAAUte,KAAKkjB,6BAA6B5E,KAChDrc,OAAO8V,SAET,OAAO3G,MAAMC,KAAK,IAAIN,IAAIkS,GAC3B,CAEAC,4BAAAA,CAA6BF,GAC5B,GAA2B,iBAAhBA,EAA0B,MAAO,GAC5C,MAAMviB,EAAMuiB,EAAYvc,OAAOjB,cAC/B,OAAK/E,EAED2C,OAAO+E,UAAUhE,eAAeiE,KAAKqU,EAAmBhc,GACpDgc,EAAkBhc,GAGnBuiB,EAAYvc,OANF,EAOlB,CAEAoa,aAAAA,GACK7gB,KAAKkf,WACRiE,aAAanjB,KAAKkf,UAClBlf,KAAKkf,SAAW,KAElB,CAEA4B,iBAAAA,GACK9gB,KAAKmf,eACRgE,aAAanjB,KAAKmf,cAClBnf,KAAKmf,aAAe,KAEtB,CAMAF,kBAAAA,GAEKjf,KAAKa,QAAQmd,UAChBxc,EAAAA,EAAaC,GAAG4L,SAAU8P,GAA2B7P,IAClC,WAAdA,EAAM7M,KAAoBT,KAAK2gB,YAClC3gB,KAAK4gB,MACN,IAKE5gB,KAAKa,QAAQid,mBAChB9d,KAAKW,SAASQ,UAAUC,IAAI,oBAC5BI,EAAAA,EAAaC,GAAG4L,SAAU+P,EAA0B,IAAIpd,KAAKW,SAAS6Q,MAAM,KAC3ExR,KAAK4gB,MAAM,KAIbpf,EAAAA,EAAaC,GAAGzB,KAAKW,SAAU0c,GAAmC,KACjErd,KAAK6gB,eAAe,IAGrB,MAAMuC,EAAaA,KACdpjB,KAAK2gB,YACR3gB,KAAKshB,eACN,EAGD9f,EAAAA,EAAaC,GAAGzB,KAAKW,SAAU2c,EAAiC8F,GAChE5hB,EAAAA,EAAaC,GAAGzB,KAAKW,SAAU4c,EAAqC6F,EACrE,GAIDjW,EAAAA,EAAAA,GAAe8D,GAKfzP,EAAAA,EAAaC,GAAG4L,SAAU+P,EAtqBG,4BAsqB6C,SAAU9P,GACnF,MAAMhJ,EAAS/B,EAAAA,EAAU8gB,uBAAuBrjB,MAC5C,CAAC,IAAK,QAAQ0L,SAAS1L,KAAKuN,UAC/BD,EAAME,kBAEHC,EAAAA,EAAAA,IAAWzN,QAEfA,KAAK0P,aAAa,gBAAiB,QACnClO,EAAAA,EAAa8hB,IAAIhf,EAAQyY,GAAkB,KAC1C/c,KAAK0P,aAAa,gBAAiB,QAAQ,IAG/BuB,EAAQlJ,oBAAoBzD,GACpCmc,OAAOzgB,MACb,IAEA,sDCjUA,QAzYA,MACC,8BAAOujB,CAAwBrf,GAC9B,OAAKkN,MAAMiP,QAAQnc,GAIZA,EACLoK,KAAKwB,GAAStJ,OAAOsJ,GAAQ,IAAIrJ,SACjCxE,QAAQ6N,GAAkB,KAATA,IACjB0T,KAAK,KANCtf,CAOT,CAEA,oBAAOgC,CAAc9B,EAAOuB,EAAU,CAAC,GACtC,MAAMrB,EAASkC,OAAOpC,GAAS,IAAIqC,OACnC,IAAKnC,EACJ,MAAM,IAAI7B,MAAM,6BAGjB,MAAM0D,GAAapC,EAAAA,EAAAA,IAAS4B,EAAQQ,YAAcR,EAAQQ,WAAa,CAAC,EAClEpD,GAASgB,EAAAA,EAAAA,IAAS4B,EAAQ5C,QAAU4C,EAAQ5C,OAAS,CAAC,EACtDoJ,EAAM,IAAIsX,IAAInf,EAAQ+Q,OAAOqO,SAASC,QACtC7L,EAAS,IAAK3R,KAAepD,GAWnC,OATAK,OAAOwgB,KAAK9L,GAAQ1V,SAAS3B,IAC5B,MAAMyD,EAAQlE,KAAKujB,wBAAwBzL,EAAOrX,IAC9CyD,SAAmD,KAAVA,GAI7CiI,EAAI0X,aAAajhB,IAAInC,EAAK+F,OAAOtC,GAAO,IAGlCiI,CACR,CAEA,yBAAarG,CAAaH,EAAU,CAAC,GACpC,MAAMtB,EAASmC,OAAOb,EAAQtB,QAAU,OAAOqC,cAAcD,QAAU,MACjEG,GAAU7C,EAAAA,EAAAA,IAAS4B,EAAQiB,SAAW,IAAKjB,EAAQiB,SAAY,CAAC,EAChED,EAAcH,OAAOb,EAAQgB,aAAe,eAAeF,QAAU,cACrEN,GAAapC,EAAAA,EAAAA,IAAS4B,EAAQQ,YAAcR,EAAQQ,WAAa,CAAC,EAClEpD,GAASgB,EAAAA,EAAAA,IAAS4B,EAAQ5C,QAAU4C,EAAQ5C,OAAS,CAAC,EACtD+gB,OAA2B/c,IAAjBpB,EAAQmB,MAAuC,OAAjBnB,EAAQmB,KAChDid,EAAuB,QAAX1f,GAA+B,SAAXA,EAChCD,EAAQoC,OAAOb,EAAQvB,OAASuB,EAAQK,UAAY,IAAIS,OACxD0F,EAAMnM,KAAKkG,cAAc9B,EAAO,CACrC+B,aACApD,OAAQghB,EAAYhhB,EAAS,CAAC,IAEzBqD,EAAiB,CACtB/B,SACAsC,cACAC,UACAI,OAAQrB,EAAQqB,aAAUD,GAG3B,IAAKgd,GAAaD,EAAS,CAC1B,MAAMhd,EAAOnB,EAAQmB,KACkB,oBAAbkd,UAA4Bld,aAAgBkd,iBAG9D5d,EAAeQ,QAAQ,gBAC9BR,EAAeU,KAAOA,GACI,iBAATA,GACZV,EAAeQ,QAAQ,kBAC3BR,EAAeQ,QAAQ,gBAAkB,oBAE1CR,EAAeU,KAAOA,IAEjBV,EAAeQ,QAAQ,kBAC3BR,EAAeQ,QAAQ,gBAAkB,oBAE1CR,EAAeU,KAAOmd,KAAKC,UAAUpd,GAEvC,CAEA,MAAMjD,QAAiBsgB,MAAMhY,EAAIiY,WAAYhe,GACvCie,EAAc7d,OAAO3C,EAAS+C,QAAQ3D,IAAI,iBAAmB,IAAIuC,cACjE8e,EAAuC,SAAzB3e,EAAQsB,cACE,SAAzBtB,EAAQsB,cAA2Bod,EAAY3Y,SAAS,oBACvD6Y,OAAgB,WACrB,GAAID,EACH,IACC,aAAazgB,EAAS6F,MACvB,CAAE,MAAO0F,GACR,aAAavL,EAASwb,MACvB,CAGD,OAAOxb,EAASwb,MAChB,EAVqB,GAYtB,IAAKxb,EAAS2gB,GAAI,CACjB,MAAMC,EAAWF,GAA8B,iBAAZA,GAAwBA,EAAQnV,OAAkC,iBAAlBmV,EAAQnV,MACxFmV,EAAQnV,MACR,CAAC,EACEsV,EAAqC,iBAAZH,GAAwBA,EAAQ9d,OAC5D8d,EACA1gB,EAAS8gB,WACNxT,EAAU3K,OAAOie,EAAStT,SAAWuT,GAAmB,kBACxDtV,EAAQ,IAAI3M,MAAM0O,GAMxB,MALA/B,EAAMtK,OAASjB,EAASiB,OACxBsK,EAAMwV,KAAOH,EAASG,MAAQ,iBAC9BxV,EAAMyV,QAAUzT,MAAMiP,QAAQoE,EAASI,SAAWJ,EAASI,QAAU,GACrEzV,EAAM0V,UAAYL,EAASM,YAAclhB,EAAS+C,QAAQ3D,IAAI,iBAAmB,GACjFmM,EAAMvL,SAAW0gB,EACXnV,CACP,CAEA,OAAOmV,CACR,CAUAhkB,WAAAA,CAAYoF,EAAU,CAAC,GACtB3F,KAAKglB,QAAUrf,EAAQqf,SAAW,GAClChlB,KAAKilB,eAAiB,CACrB,mBAAoB,oBACjBtf,EAAQiB,SAEZ5G,KAAKklB,gBAAkBvf,EAAQuf,kBAAmB,EAClDllB,KAAKmlB,UAAYxf,EAAQyf,QAAUplB,KAAKqlB,eACzC,CAMAA,aAAAA,GACC,MAAMC,EAAOjY,SAAS9F,cAAc,2BACpC,OAAI+d,EAAaA,EAAK/T,aAAa,YACnCtD,QAAQC,KAAK,mDACN,GACR,CAgBA7H,OAAAA,CAAQ8F,GAAK,OACZ9H,EAAS,MAAK,KACdyC,EAAO,KAAI,QACXF,EAAU,CAAC,EAAC,OACZI,EAAS,KAAI,WACbue,EAAa,KAAI,UACjBngB,EAAYogB,EAAAA,GAAI,QAChBngB,EAAUmgB,EAAAA,GAAI,cACdC,EAAgBD,EAAAA,GAAI,YACpBE,EAAcF,EAAAA,IACX,CAAC,GACJ,MAAMG,EAAU3lB,KAAKglB,QAAU7Y,EACzByZ,EAAa9e,aAAgBkd,SAC7B6B,EAAiB,IAAK7lB,KAAKilB,kBAAmBre,GAC9Ckf,EAAiC,QAAzBzhB,EAAOqC,cAmBrB,OAhBIof,IAAOhf,EAAO,MAGbgf,GAAUF,IAAc5lB,KAAKmlB,YAC5Bre,IAAMA,EAAO,CAAC,GACC,iBAATA,GAAsBsK,MAAMiP,QAAQvZ,KAC9CA,EAAKse,OAASplB,KAAKmlB,YAKhBS,GAAgB,iBAAkBhf,IACtCif,EAAe,gBAAkB,oBAI9BD,GAAcL,EACVvlB,KAAK+lB,SAAS,CACpB1hB,SACA8H,IAAKwZ,EACL7e,OACAF,QAASif,EACT7e,SACAue,aACAngB,YACAC,UACAogB,gBACAC,gBAGM1lB,KAAKgmB,WAAW,CACtB7Z,IAAKwZ,EACLthB,SACAyC,KAAMgf,OAAQ/e,EAAY/G,KAAKimB,eAAenf,GAC9CF,QAASif,EACT7e,SACAke,gBAAiBllB,KAAKklB,gBACtB9f,YACAC,WAGH,CAKA2gB,UAAAA,EAAW,IACC7Z,EAAG,OACH9H,EAAM,KACNyC,EAAI,QACJF,EAAO,OACPI,EAAM,gBACNke,EAAe,UACf9f,EAAS,QACTC,IAEX,MAAMO,EAAS,CACdvB,SACAuC,UACAI,SACAL,YAAaue,EAAkB,UAAY,sBAC9Bne,IAATD,GAAsB,CAAEA,SAG7Bqd,MAAMhY,EAAKvG,GACTsgB,MAAMriB,IACN,MAAMwgB,EAAcxgB,EAAS+C,QAAQ3D,IAAI,gBACnCkjB,EAAS9B,GAAeA,EAAY3Y,SAAS,oBAEnD,IAAK7H,EAAS2gB,GACb,OAAO4B,QAAQC,QACdrhB,EAAAA,EAAAA,IAAc,CACb4f,KAAM/gB,EAASiB,OACfjB,SAAUsiB,EACPtiB,EAAS6F,OAAO4c,OAAM,IAAMziB,EAASwb,SACrCxb,EAASwb,UAKf,IAAIxa,EAAO,CAAE+f,KAAM/gB,EAASiB,QAO5B,OALCD,EAAKhB,SADFsiB,EACatiB,EAAS6F,OAET7F,EAASwb,OAGnBxa,CAAI,IAEXqhB,MAAMrhB,IACFA,GAAQA,EAAKhB,oBAAoBuiB,QACpCvhB,EAAKhB,SAASqiB,MACZK,GAAanhB,EAAU,IAAKP,EAAMhB,SAAU0iB,MAC7C,SAGDnhB,EAAUP,EACX,IAEAyhB,OAAOlX,IACY,eAAfA,EAAMzD,OAENyD,GAASA,EAAMvL,oBAAoBuiB,QACtChX,EAAMvL,SAASqiB,MAAMM,IACpBnhB,EAAQ,IAAK+J,EAAOvL,SAAU2iB,GAAU,IACtC,KACFnhB,EAAQ,IAAK+J,EAAOvL,SAAU,kBAAmB,IAGlDwB,EAAQ+J,GACT,GAEH,CAKA2W,QAAAA,EAAS,OACC1hB,EAAM,IACN8H,EAAG,KACHrF,EAAI,QACJF,EAAO,OACPI,EAAM,WACNue,EAAU,UACVngB,EAAS,QACTC,EAAO,cACPogB,EAAa,YACbC,IAET,MAAMe,EAAM,IAAIC,eA2DhB,OAzDAD,EAAIE,KAAKtiB,EAAQ8H,GAAK,GACtBsa,EAAIvB,gBAAkBllB,KAAKklB,gBAG3B9hB,OAAOwgB,KAAKhd,GAASxE,SAAS3B,IACH,iBAAtBA,EAAI+E,eAAsCsB,aAAgBkd,UAC7DyC,EAAIG,iBAAiBnmB,EAAKmG,EAAQnG,GACnC,IAIG8kB,GACHkB,EAAII,OAAOjX,iBAAiB,YAAaC,IACpCA,EAAEiX,kBACLvB,EAAWpQ,KAAK2D,MAAOjJ,EAAEkX,OAASlX,EAAEmX,MAAS,KAAMnX,EACpD,IAKF4W,EAAIQ,OAAS,KACZ,GAAIR,EAAI3hB,QAAU,KAAO2hB,EAAI3hB,OAAS,IAAK,CAC1C,MAAMD,EAAO,CACZ+f,KAAM6B,EAAI3hB,OACVjB,UAAUmB,EAAAA,EAAAA,IAAcyhB,EAAIS,eAE7B9hB,EAAUP,EACX,KAAO,CACN,MAAMuK,GAAQpK,EAAAA,EAAAA,IAAc,CAC3B4f,KAAM6B,EAAI3hB,OACVjB,SAAU4iB,EAAIS,cAAgB,QAAQT,EAAI3hB,WAE3CO,EAAQ+J,EACT,CACAsW,GAAa,EAGde,EAAIU,QAAU,KACb9hB,GAAQL,EAAAA,EAAAA,IAAc,CAAE4f,KAAM,EAAG/gB,SAAU,mBAC3C6hB,GAAa,EAGde,EAAIW,UAAY,KACf/hB,GAAQL,EAAAA,EAAAA,IAAc,CAAE4f,KAAM,EAAG/gB,SAAU,qBAC3C6hB,GAAa,EAIV1e,GACHA,EAAO4I,iBAAiB,SAAS,KAChC6W,EAAIY,OAAO,IAIb5B,IACAgB,EAAIa,KAAKxgB,GAEF2f,CACR,CAIAxjB,GAAAA,CAAIkJ,EAAKxG,EAAU,CAAC,GACnB,OAAO3F,KAAKqG,QAAQ8F,EAAK,CAAE9H,OAAQ,SAAUsB,GAC9C,CAEAF,IAAAA,CAAK0G,EAAKrF,EAAMnB,EAAU,CAAC,GAC1B,OAAO3F,KAAKqG,QAAQ8F,EAAK,CAAE9H,OAAQ,OAAQyC,UAASnB,GACrD,CAEA4hB,GAAAA,CAAIpb,EAAKrF,EAAMnB,EAAU,CAAC,GACzB,OAAO3F,KAAKqG,QAAQ8F,EAAK,CAAE9H,OAAQ,MAAOyC,UAASnB,GACpD,CAEAD,OAAOyG,EAAKxG,EAAU,CAAC,GACtB,OAAO3F,KAAKqG,QAAQ8F,EAAK,CAAE9H,OAAQ,YAAasB,GACjD,CAEA6hB,KAAAA,CAAMrb,EAAKrF,EAAMnB,EAAU,CAAC,GAC3B,OAAO3F,KAAKqG,QAAQ8F,EAAK,CAAE9H,OAAQ,QAASyC,UAASnB,GACtD,CAKAsgB,cAAAA,CAAenf,GACd,GAAKA,KAAQA,aAAgBkd,UAC7B,OAAOC,KAAKC,UAAUpd,EACvB,wDCjYD,MAAM9D,EACLzC,WAAAA,CAAYwC,EAAQvC,EAAU,MAC7BR,KAAKa,QAAUb,KAAKynB,MAAM1kB,EAAQvC,EACnC,CAKAyC,GAAAA,GACC,OAAOjD,KAAKa,OACb,CAKA6mB,WAAAA,CAAYlnB,GACX,OAAOO,EAAAA,EAAAA,IAAUP,GAAWmnB,EAAAA,EAAY1kB,IAAIzC,GAAW,CAAC,CACzD,CAKA,2BAAOonB,CAAqBC,EAAK3jB,GAChC,OAAO2jB,EAAIrc,MAAM,KAAKsc,aAAY,CAACC,EAAKtnB,KAAQ,CAAG,CAACA,GAAMsnB,KAAQ7jB,EACnE,CAKAujB,KAAAA,CAAM1kB,EAAQvC,GACb,IAAIsX,GAAShX,EAAAA,EAAAA,IAAgBiC,EAAQ/C,KAAK0nB,YAAYlnB,IAgBtD,OAbA4C,OAAOwgB,KAAK9L,GAAQ1V,SAAQ3B,IAM3B,GALY,WAARA,IACHqX,GAAShX,EAAAA,EAAAA,IAAgBgX,EAAQA,EAAO/U,eACjC+U,EAAO/U,QAGXtC,EAAIiL,SAAS,KAAM,CACtB,MAAMsc,EAAYhlB,EAAO4kB,qBAAqBnnB,EAAKqX,EAAOrX,IAC1DqX,GAAShX,EAAAA,EAAAA,IAAgBgX,EAAQkQ,UAC1BlQ,EAAOrX,EACf,KAGMqX,CACR,EAGD,0CCzDA,MACMmQ,EAA2B,IAAIlX,IAAI,CACxC,MACA,IACA,OACA,OACA,WACA,UACA,SACA,UACA,OACA,OACA,SACA,QACA,QAEKmX,EAA4B,IAAInX,IAAI,CACzC,QACA,UACA,QACA,SACA,OACA,SACA,eACA,iBACA,kBACA,oBACA,mBACA,oBACA,UACA,YACA,QACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,SACA,IACA,OACA,YACA,cACA,OACA,eAGD,SAASoX,EAAWjkB,GACnB,OAAOsC,OAAOtC,GACZkkB,QAAQ,KAAM,SACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,UACdA,QAAQ,KAAM,QACjB,CAEA,SAASC,EAAgBC,EAAMC,EAAcN,EAA0BO,EAAeN,GACrF,IAAKI,EACJ,OAAO,KAGR,GAAIA,EAAKG,WAAaC,KAAKC,UAC1B,OAAOtb,SAASub,eAAeN,EAAKzP,aAAe,IAGpD,GAAIyP,EAAKG,WAAaC,KAAKG,aAC1B,OAAO,KAGR,MAAMtb,EAAU+a,EAAK/a,QAAQ/H,cAC7B,IAAK+iB,EAAYO,IAAIvb,GACpB,OAAO,KAGR,MAAMwb,EAAW1b,SAAS2b,gBA/EL,6BA+EoCzb,GAwBzD,OAtBA6D,MAAMC,KAAKiX,EAAKW,YAAc,IAAI7mB,SAAS8mB,IAC1C,MAAMvd,EAAOud,EAAKvd,KAAKnG,cACjB2jB,EAAYD,EAAKhlB,OAAS,GAE3BskB,EAAaM,IAAInd,KAASA,EAAKxJ,WAAW,QAIjC,SAATwJ,GAA4B,eAATA,IAA0Bwd,GAAcA,EAAUhnB,WAAW,OAIrF4mB,EAASrZ,aAAa/D,EAAMwd,EAAU,IAGvC/X,MAAMC,KAAKiX,EAAKc,YAAc,IAAIhnB,SAASinB,IAC1C,MAAMC,EAAYjB,EAAgBgB,EAAOd,EAAaC,GAClDc,GACHP,EAAStQ,OAAO6Q,EACjB,IAGMP,CACR,CAEO,SAASQ,EAAiBrlB,GAAO,eACvCslB,EAAiBvB,EAAwB,gBACzCwB,EAAkBvB,GACf,CAAC,GACJ,GAAIhkB,QACH,MAAO,GAGR,MAAMkc,EAAU5Z,OAAOtC,GAAOuC,OAC9B,IAAK2Z,EACJ,MAAO,GAGR,IAAKA,EAAQ1U,SAAS,KACrB,OAAOyc,EAAW/H,GAGnB,MAAMsJ,EAAWrc,SAAS2K,cAAc,YAiBxC,OAhBA0R,EAAS5lB,UAAYsc,EAEEhP,MAAMC,KAAKqY,EAAStJ,QAAQgJ,YACjD9a,KAAKga,GAASD,EAAgBC,EAAMkB,EAAgBC,KACpDxnB,OAAO8V,SACPzJ,KAAKga,GACDA,EAAKG,WAAaC,KAAKC,UACnBR,EAAWG,EAAKzP,aAAe,IAEnCyP,EAAKG,WAAaC,KAAKG,aACnBP,EAAKqB,UAEN,KAGwBnG,KAAK,KAClB2E,EAAW/H,EAChC,CAQA,QANA,MACC,uBAAOmJ,CAAiBrlB,EAAOyB,GAC9B,OAAO4jB,EAAiBrlB,EAAOyB,EAChC,gDChJD,MAAMikB,EACLrpB,WAAAA,CAAYspB,EAAO,UAClB7pB,KAAK6pB,KAAOA,EACZ7pB,KAAKqN,SAA+B,oBAAbA,SAA2BA,SAAW,KAC7DrN,KAAK8pB,KAAO,CACXC,YAAa,CAAC,MAAO,QAAS,KAAM,KAAM,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,UAAW,QAAS,SAAU,QAAS,SAAU,QAAS,OAE7I,CAKAC,OAAAA,CAAQH,GAEP,OADA7pB,KAAK6pB,KAAOA,EACL7pB,IACR,CAKAQ,OAAAA,CAAQypB,EAAKhB,EAAa,CAAC,EAAG7I,EAAU,KAAM8J,EAAS,CAAC,GACvD,MAAkB,QAAdlqB,KAAK6pB,MAAkB7pB,KAAKqN,SACxBrN,KAAKmqB,kBAAkBF,EAAKhB,EAAY7I,EAAS8J,GAElDlqB,KAAKoqB,kBAAkBH,EAAKhB,EAAY7I,EAAS8J,EACzD,CAKAC,iBAAAA,CAAkBF,EAAKhB,EAAY7I,EAAS8J,EAAS,CAAC,GACrD,MAAM1pB,EAAUR,KAAKqN,SAAS2K,cAAciS,GA0B5C,OAvBAjqB,KAAKqqB,kBAAkB7pB,EAASyoB,GAGhB,OAAZ7I,GAAqBpgB,KAAK8pB,KAAKC,YAAYre,SAASue,KACnD7Y,MAAMiP,QAAQD,GACjBA,EAAQhe,SAAQ0N,IACK,iBAATA,EACVtP,EAAQ8pB,YAAYtqB,KAAKqN,SAASub,eAAe9Y,IACvCA,aAAgB4Y,MAC1BloB,EAAQ8pB,YAAYxa,EACrB,IAESsQ,aAAmBsI,KAC7BloB,EAAQ8pB,YAAYlK,GAEhB,WAAY8J,GAAUA,EAAOK,OAChC/pB,EAAQsD,UAAYsc,EAEpB5f,EAAQqY,YAAcuH,GAKlB5f,CACR,CAKA6pB,iBAAAA,CAAkB7pB,EAASyoB,GACrBA,GAEL7lB,OAAOonB,QAAQvB,GAAY7mB,SAAQ,EAAE3B,EAAKyD,MACrCA,UAAmD,IAAVA,KAI/B,IAAVA,EACH1D,EAAQkP,aAAajP,EAAK,IAE1BD,EAAQkP,aAAajP,EAAK+F,OAAOtC,IAClC,GAEF,CAKAkmB,iBAAAA,CAAkBH,EAAKhB,EAAY7I,EAASmK,GAAS,GACpD,MAAME,EAAazqB,KAAK0qB,oBAAoBzB,GAG5C,GAFsBjpB,KAAK8pB,KAAKC,YAAYre,SAASue,GAGpD,MAAO,IAAIA,IAAMQ,KAGlB,MAAME,EAAyB,OAAZvK,EAClBpgB,KAAK4qB,iBAAiBxK,GAAW,GAElC,MAAY,KAAR6J,EACI,GAAGU,IAEH,IAAIV,IAAMQ,KAAcE,MAAeV,IAEhD,CAKAW,gBAAAA,CAAiBxK,GAChB,OAAIhP,MAAMiP,QAAQD,GACVA,EAAQ9R,KAAIwB,GACdA,aAAgB4Y,KACZ1oB,KAAK6qB,cAAc/a,GAEpBtJ,OAAOsJ,KACZ0T,KAAK,IAGLpD,aAAmBsI,KACf1oB,KAAK6qB,cAAczK,GAGpB5Z,OAAO4Z,EACf,CAKAyK,aAAAA,CAAcvC,GACb,OAAIA,EAAKqB,UACDrB,EAAKqB,UAENnjB,OAAO8hB,EACf,CAKAoC,mBAAAA,CAAoBI,GACnB,IAAKA,GAAuC,IAA9B1nB,OAAOwgB,KAAKkH,GAAO1c,OAChC,MAAO,GAGR,MAAM6a,EAAa7lB,OAAOonB,QAAQM,GAChCxc,KAAI,EAAE7N,EAAKyD,KACPA,UAAmD,IAAVA,EACrC,IAGM,IAAVA,EACIzD,EASD,GAAGA,MANW+F,OAAOtC,GAC1BkkB,QAAQ,KAAM,SACdA,QAAQ,KAAM,UACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,aAIhBnmB,QAAOinB,GAAiB,KAATA,IAEjB,OAAOD,EAAW7a,OAAS,IAAM6a,EAAWzF,KAAK,KAAO,EACzD,CAKA9e,GAAAA,CAAIukB,EAAa,CAAC,EAAG7I,EAAU,GAAIza,EAAU,CAAC,GAC7C,OAAO3F,KAAKQ,QAAQ,MAAOyoB,EAAY7I,EAASza,EACjD,CAEAolB,IAAAA,CAAK9B,EAAa,CAAC,EAAG7I,EAAU,GAAIza,EAAU,CAAC,GAC9C,OAAO3F,KAAKQ,QAAQ,OAAQyoB,EAAY7I,EAASza,EAClD,CAEAqlB,CAAAA,CAAE/B,EAAa,CAAC,EAAG7I,EAAU,GAAIza,EAAU,CAAC,GAC3C,OAAO3F,KAAKQ,QAAQ,IAAKyoB,EAAY7I,EAASza,EAC/C,CAEAslB,CAAAA,CAAEhC,EAAa,CAAC,EAAG7I,EAAU,GAAIza,EAAU,CAAC,GAC3C,OAAO3F,KAAKQ,QAAQ,IAAKyoB,EAAY7I,EAASza,EAC/C,CAEAulB,CAAAA,CAAEC,EAAM/K,EAAU,GAAI6I,EAAa,CAAC,EAAGtjB,EAAU,CAAC,GACjD,OAAO3F,KAAKQ,QAAQ,IAAK,CAAE2qB,UAASlC,GAAc7I,EAASza,EAC5D,CAEAgK,GAAAA,CAAIyb,EAAKC,EAAM,GAAIpC,EAAa,CAAC,GAChC,OAAOjpB,KAAKQ,QAAQ,MAAO,CAAE4qB,MAAKC,SAAQpC,GAC3C,CAEAqC,KAAAA,CAAM3f,EAAMK,EAAO,OAAQ9H,EAAQ,GAAI+kB,EAAa,CAAC,GACpD,OAAOjpB,KAAKQ,QAAQ,QAAS,CAC5BwL,OACAL,OACAzH,WACG+kB,GAEL,CAEA3hB,MAAAA,CAAO8Y,EAAU,GAAIpU,EAAO,SAAUid,EAAa,CAAC,EAAGtjB,EAAU,CAAC,GACjE,OAAO3F,KAAKQ,QAAQ,SAAU,CAAEwL,UAASid,GAAc7I,EAASza,EACjE,CAEA4lB,IAAAA,CAAKC,EAAS,GAAInnB,EAAS,OAAQ4kB,EAAa,CAAC,EAAG7I,EAAU,GAAIza,EAAU,CAAC,GAC5E,OAAO3F,KAAKQ,QAAQ,OAAQ,CAAEgrB,SAAQnnB,YAAW4kB,GAAc7I,EAASza,EACzE,CAEA8lB,KAAAA,CAAMC,EAAOtL,EAAS6I,EAAa,CAAC,EAAGtjB,EAAU,CAAC,GACjD,OAAO3F,KAAKQ,QAAQ,QAAS,CAAEmrB,IAAKD,KAAUzC,GAAc7I,EAASza,EACtE,CAEAimB,QAAAA,CAASjgB,EAAMyU,EAAU,GAAI6I,EAAa,CAAC,GAC1C,OAAOjpB,KAAKQ,QAAQ,WAAY,CAAEmL,UAASsd,GAAc7I,EAC1D,CAEAyL,EAAAA,CAAGC,EAAQ,GAAI7C,EAAa,CAAC,EAAG8C,GAAW,GAC1C,IAAIC,EAAY,GAShB,OAFCA,EALID,EAKQD,EAJAA,EAAMxd,KAAIwB,GACrB9P,KAAKQ,QAAQ,KAAM,CAAC,EAAGsP,KAKlB9P,KAAKQ,QAAQ,KAAMyoB,EAAY+C,EACvC,CAEAvc,EAAAA,CAAGwZ,EAAa,CAAC,EAAG7I,EAASza,GAC5B,OAAO3F,KAAKQ,QAAQ,KAAMyoB,EAAY7I,EAASza,EAChD,CAEAsmB,EAAAA,CAAGH,EAAQ,GAAI7C,EAAa,CAAC,GAC5B,MAAM+C,EAAYF,EAAMxd,KAAIwB,GAC3B9P,KAAKQ,QAAQ,KAAM,CAAC,EAAGsP,KAExB,OAAO9P,KAAKQ,QAAQ,KAAMyoB,EAAY+C,EACvC,CAEAE,EAAAA,CAAGjD,EAAa,CAAC,EAAG7I,EAAU,GAAIza,EAAU,CAAC,GAC5C,OAAO3F,KAAKQ,QAAQ,KAAMyoB,EAAY7I,EAASza,EAChD,CAKAwmB,KAAAA,CAAMvlB,EAAU,GAAIwlB,EAAO,GAAInD,EAAa,CAAC,GAC5C,MAAMoD,EAAczlB,EAAQ0H,KAAIgS,GAC/BtgB,KAAKQ,QAAQ,KAAM,CAAC,EAAG8f,KAElBgM,EAAYtsB,KAAKQ,QAAQ,KAAM,CAAC,EAAG6rB,GACnCE,EAAQvsB,KAAKQ,QAAQ,QAAS,CAAC,EAAG8rB,GAElCE,EAAWJ,EAAK9d,KAAIme,IACzB,MAAMC,EAAQD,EAAIne,KAAIqe,GACrB3sB,KAAKQ,QAAQ,KAAM,CAAC,EAAGmsB,KAExB,OAAO3sB,KAAKQ,QAAQ,KAAM,CAAC,EAAGksB,EAAM,IAE/BE,EAAQ5sB,KAAKQ,QAAQ,QAAS,CAAC,EAAGgsB,GAExC,OAAOxsB,KAAKQ,QAAQ,QAASyoB,EAAY,CAACsD,EAAOK,GAClD,CAKAzH,SAAAA,CAAU0H,GACT,OAAO7sB,KAAKQ,QAAQ,QAAS,CAC5BwL,KAAM,SACNL,KAAM,SACNzH,MAAO2oB,GAET,CAEAxoB,MAAAA,CAAOA,GACN,OAAOrE,KAAKQ,QAAQ,QAAS,CAC5BwL,KAAM,SACNL,KAAM,UACNzH,MAAOG,GAET,CAKAyoB,UAAAA,CAAWtsB,EAASusB,EAAS,CAAC,GAM7B,OALIvsB,aAAmBkoB,MAAsB,QAAd1oB,KAAK6pB,MACnCzmB,OAAOonB,QAAQuC,GAAQ3qB,SAAQ,EAAEkL,EAAO0f,MACvCxsB,EAAQoP,iBAAiBtC,EAAO0f,EAAQ,IAGnCxsB,CACR,CAKAysB,QAAAA,CAASzsB,EAASsiB,GACjB,GAAItiB,aAAmBkoB,MAAsB,QAAd1oB,KAAK6pB,KACnCrpB,EAAQW,UAAUC,IAAI0hB,QAChB,GAAuB,iBAAZtiB,EAAsB,CAEvC,MAAM0sB,EAAQ1sB,EAAQ0sB,MAAM,kBAC5B,GAAIA,EAAO,CACV,MAAOC,EAAWlD,EAAKa,GAASoC,EAC1BE,EAAWptB,KAAKqtB,sBAAsBvC,EAAOhI,GACnD,OAAOtiB,EAAQ4nB,QAAQ+E,EAAW,IAAIlD,IAAMmD,KAC7C,CACD,CACA,OAAO5sB,CACR,CAEA6sB,qBAAAA,CAAsBvC,EAAOhI,GAC5B,MAAMwK,EAAaxC,EAAMoC,MAAM,mBAC/B,GAAII,EAAY,CACf,MAAMC,EAAgBD,EAAW,GAC3BE,EAAWD,EAAgB,GAAGA,KAAiBzK,IAAcA,EACnE,OAAOgI,EAAM1C,QAAQ,gBAAiB,UAAUoF,KACjD,CACC,MAAO,GAAG1C,YAAgBhI,IAE5B,CAKA2K,SAAAA,CAAU9hB,EAAM+hB,EAAQ,CAAC,EAAGC,EAAQ,CAAC,GAEpC,MAAMC,EAAa,CAClB,IAAQF,IACP,MAAM1hB,EAAO0hB,EAAM1hB,MAAQ,OACrB5B,EAAMpK,KAAKQ,QAAQ,GAAI,CAAC,GAAI6G,EAAAA,EAAAA,GAAO,OAAO2E,MAChD,OAAOhM,KAAK+qB,KACX,CACC,iBAAkB,OAClB,iBAAkB,UAClB,MAAS,SACT,MAAS2C,EAAM/oB,OAAS,IAEzB,CACCyF,GAED,EAEF,MAAUsjB,IACT,MAAM1hB,EAAO0hB,EAAM1hB,MAAQ,OAC3B,OAAOhM,KAAK0E,IACX,CACCC,MAAO,eAAeqH,IACtB6hB,KAAM,SAEPH,EAAMtN,SAAW,GACjB,EAEF,KAASsN,IACR,MAAMpN,EAASoN,EAAMpN,OACpBtgB,KAAK0E,IAAI,CAAEC,MAAO,eAAiB+oB,EAAMpN,QAAU,GAC9CxZ,EAAO9G,KAAK0E,IAAI,CAAEC,MAAO,aAAe+oB,EAAM5mB,MAAQ,IACtDgnB,EAASJ,EAAMI,OACpB9tB,KAAK0E,IAAI,CAAEC,MAAO,eAAiB+oB,EAAMI,QAAU,GAEpD,OAAO9tB,KAAK0E,IACX,CAAEC,MAAO,QACT,CAAC2b,EAAQxZ,EAAMgnB,GACf,GAIH,OAAIF,EAAWjiB,GACPiiB,EAAWjiB,GAAM+hB,GAGlB1tB,KAAK0E,IAAI,CAAEC,MAAO,aAAagH,KAAU,GACjD,EAsBD,QAnBA,SAAcke,EAAO,UACpB,MAAMkE,EAAU,IAAInE,EAAmBC,GAevC,OAAO,IAAImE,MAAMD,EAbD,CACf9qB,IAAGA,CAACqB,EAAQ2pB,IACPA,KAAQ3pB,EACJA,EAAO2pB,GAAMtsB,KAAK2C,GAInB,SAAS2kB,EAAa,CAAC,EAAG7I,EAAU,GAAIza,EAAU,CAAC,GACzD,OAAOrB,EAAO9D,QAAQytB,EAAMhF,EAAY7I,EAASza,EAClD,GAKH,kCC7XA,MAAMuoB,EAAa,IAAIC,IAOvB,SAASC,EAAe5tB,GACvB,OAAK0tB,EAAWpF,IAAItoB,GAGb0tB,EAAWjrB,IAAIzC,GAFd,IAGT,CAaA,SASCoC,GAAAA,CAAIpC,EAASC,EAAK8f,GACZ6N,EAAe5tB,IAhBtB,SAA2BA,GAC1B,MAAM8N,EAAM,IAAI6f,IAChBD,EAAWtrB,IAAIpC,EAAS8N,EAEzB,CAaG+f,CAAkB7tB,GAGnB,MAAM8tB,EAAcF,EAAe5tB,GAGnC,GAAI8tB,EAAYC,KAAO,IAAMD,EAAYxF,IAAIroB,GAA7C,CACC,MAAM+tB,EAAcpd,MAAMC,KAAKid,EAAY1K,QAAQ,GACnD3V,QAAQmB,MACP,yFAAyFof,KAG3F,MAEAF,EAAY1rB,IAAInC,EAAK8f,EACtB,EASAtd,GAAAA,CAAIzC,EAASC,GACZ,MAAM6tB,EAAcF,EAAe5tB,GACnC,OAAK8tB,GAEEA,EAAYrrB,IAAIxC,IAFE,IAG1B,EASAa,MAAAA,CAAOd,EAASC,GACf,MAAM6tB,EAAcF,EAAe5tB,GAC9B8tB,IAELA,EAAY5oB,OAAOjF,GAGM,IAArB6tB,EAAYC,MACfL,EAAWxoB,OAAOlF,GAEpB,mCCnFD,MAAMiuB,EAAkB,qBAClBC,EAAmB,OACnBC,EAAkB,SAClBC,EAAe,CACpBC,WAAY,YACZC,WAAY,YAIPC,EAAe,IAAIhe,IAAI,CAC5B,QAAS,WAAY,UAAW,YAAa,cAC7C,aAAc,iBAAkB,YAAa,WAAY,YACzD,cAAe,YAAa,SAAU,UAAW,WAAY,QAC7D,oBAAqB,aAAc,YAAa,WAAY,cAC5D,cAAe,cAAe,YAAa,eAAgB,gBAC3D,WAAY,eAAgB,gBAAiB,aAC7C,QAAS,OAAQ,SAAU,QAAS,SAAU,UAAW,WACzD,OAAQ,SAAU,eAAgB,SAAU,OAC5C,mBAAoB,mBAAoB,QAAS,QAAS,WASrDie,EAAgB,CAAC,EACvB,IAAIC,EAAW,EAcf,MAAMC,EAAeA,CAAC1uB,EAAS2uB,EAAM,QAC/B3uB,EAAQyuB,WACZzuB,EAAQyuB,SAAWE,EAAM,GAAGA,MAAQF,MAAeA,KAE7CzuB,EAAQyuB,UAQVG,EAAoB5uB,IACzB,MAAM2uB,EAAMD,EAAa1uB,GAEzB,OADAwuB,EAAcG,GAAOH,EAAcG,IAAQ,CAAC,EACrCH,EAAcG,EAAI,EAoFpBE,EAAsBA,CAACC,EAAmBtC,EAASuC,KACxD,MAAMC,EAAiC,iBAAZxC,EACrByC,EAAWD,EAAcD,EAAsBvC,GAAWuC,EAChE,IAAIG,EAAYJ,EAAkBlH,QAAQsG,EAAkB,IAY5D,OATIE,EAAac,KAChBA,EAAYd,EAAac,IAIrBX,EAAajG,IAAI4G,KACrBA,EAAYJ,GAGN,CAACE,EAAaC,EAAUC,EAAU,EAWpCC,EAAaA,CAACnvB,EAAS8uB,EAAmBtC,EAASuC,EAAoBK,KAC5E,GAAiC,iBAAtBN,IAAmC9uB,EAAS,OAEvD,MAAOgvB,EAAaC,EAAUC,GAAaL,EAAoBC,EAAmBtC,EAASuC,GACrFxC,EAASqC,EAAiB5uB,GAC1BqvB,EAAW9C,EAAO2C,KAAe,CAAC,EAElCI,EAAWC,EAAYF,EAAUJ,EAD3BD,EAAcxC,EAAU,MAGpC,GAAI8C,EAEH,YADAA,EAASF,OAASE,EAASF,QAAUA,GAItC,IAAII,EAAKR,EAvFqBS,EAACzvB,EAASoR,EAAUoe,EAAIE,KACtD,MAAMlD,EAAU,SAAU1f,GACzB,MAAM6iB,EAAa/e,MAAMC,KAAK7Q,EAAQgP,iBAAiBoC,IACvD,IAAK,IAAItN,EAASgJ,EAAMhJ,OAAQA,GAAUA,IAAW9D,EAAS8D,EAASA,EAAO8rB,WAC7E,GAAKD,EAAWzkB,SAASpH,GAQzB,OANA+rB,EAAW/iB,EAAO,CAAEgjB,eAAgBhsB,IAEhC4rB,GACH1uB,EAAac,IAAI9B,EAAS8M,EAAMtB,KAAM4F,EAAUoe,GAG1CA,EAAGO,MAAMjsB,EAAQ,CAACgJ,GAE3B,EAOA,OALA0f,EAAQwD,mBAAqB5e,EAC7Bob,EAAQyC,SAAWO,EACnBhD,EAAQ4C,OAASM,EACjBlD,EAAQiC,SAAW,KAEZjC,CAAO,EAmEXiD,CAAuBzvB,EAASwsB,EAASyC,EAAUG,GAnHjCa,EAACjwB,EAASwvB,EAAIE,KACnC,MAAMlD,EAAU,SAAU1f,GAOzB,OANA+iB,EAAW/iB,EAAO,CAAEgjB,eAAgB9vB,IAEhC0vB,GACH1uB,EAAac,IAAI9B,EAAS8M,EAAMtB,KAAMgkB,GAGhCA,EAAGO,MAAM/vB,EAAS,CAAC8M,GAC3B,EAOA,OALA0f,EAAQwD,mBAAqB,KAC7BxD,EAAQyC,SAAWO,EACnBhD,EAAQ4C,OAASM,EACjBlD,EAAQiC,SAAW,KAEZjC,CAAO,EAoGXyD,CAAcjwB,EAASivB,EAAUG,GAEpC,MAAMT,EAAMD,EAAac,EAAIV,EAAkBlH,QAAQqG,EAAiB,KACxEuB,EAAGf,SAAWE,EACdU,EAASV,GAAOa,EAEhBxvB,EAAQoP,iBAAiB8f,EAAWM,EAAIR,EAAY,EAU/CO,EAAcA,CAACF,EAAUJ,EAAUe,IACjCptB,OAAOa,OAAO4rB,GAAUrtB,MAC9BkuB,GAAKA,EAAEjB,WAAaA,GAAYiB,EAAEF,qBAAuBA,IAYrDG,EAAgBA,CAACnwB,EAASusB,EAAQ2C,EAAWD,EAAUe,KAC5D,MAAMxD,EAAU+C,EAAYhD,EAAO2C,GAAYD,EAAUe,GACpDxD,IAELxsB,EAAQkR,oBAAoBge,EAAW1C,EAASjV,QAAQyY,WACjDzD,EAAO2C,GAAW1C,EAAQiC,UAAS,EAUrC2B,EAA2BA,CAACpwB,EAASusB,EAAQ2C,EAAWmB,KAC7D,MAAMhB,EAAW9C,EAAO2C,IAAc,CAAC,EACvC,IAAK,MAAOjvB,EAAKusB,KAAY5pB,OAAOonB,QAAQqF,GACvCpvB,EAAIiL,SAASmlB,IAChBF,EAAcnwB,EAASusB,EAAQ2C,EAAW1C,EAAQyC,SAAUzC,EAAQwD,mBAEtE,EASKH,EAAaA,CAACS,EAAKxL,EAAO,CAAC,KAChC,IAAK,MAAO7kB,EAAKyD,KAAUd,OAAOonB,QAAQlF,GACzC,IACCwL,EAAIrwB,GAAOyD,CACZ,CAAE,MACDd,OAAO2tB,eAAeD,EAAKrwB,EAAK,CAC/BuwB,cAAc,EACd/tB,IAAGA,IAAYiB,GAEjB,CAED,OAAO4sB,CAAG,EASLtvB,EAAe,CAQpBC,EAAAA,CAAGjB,EAAS8M,EAAO0f,EAASuC,GAC3BI,EAAWnvB,EAAS8M,EAAO0f,EAASuC,GAAoB,EACzD,EASAjM,GAAAA,CAAI9iB,EAAS8M,EAAO0f,EAASuC,GAC5BI,EAAWnvB,EAAS8M,EAAO0f,EAASuC,GAAoB,EACzD,EASAjtB,GAAAA,CAAI9B,EAAS8uB,EAAmBtC,EAASuC,GACxC,GAAiC,iBAAtBD,IAAmC9uB,EAAS,OAEvD,MAAOgvB,EAAaC,EAAUC,GAAaL,EAAoBC,EAAmBtC,EAASuC,GACrFxC,EAASqC,EAAiB5uB,GAC1BywB,EAAc3B,EAAkBntB,WAAW,KAC3C+uB,EAAcxB,IAAcJ,EAGlC,GAAI2B,EAAa,CAChB,IAAK,MAAME,KAAa/tB,OAAOwgB,KAAKmJ,GACnC6D,EAAyBpwB,EAASusB,EAAQoE,EAAW7B,EAAkBzN,MAAM,IAE9E,MACD,CAEA,MAAMuP,EAAoBrE,EAAO2C,IAAc,CAAC,EAGhD,QAAwB,IAAbD,EAMX,IAAK,MAAOhvB,EAAK4wB,KAAajuB,OAAOonB,QAAQ4G,GAAoB,CAChE,MAAME,EAAa7wB,EAAI2nB,QAAQuG,EAAiB,IAC3CuC,IAAe5B,EAAkB5jB,SAAS4lB,IAC9CX,EAAcnwB,EAASusB,EAAQ2C,EAAW2B,EAAS5B,SAAU4B,EAASb,mBAExE,MAVCG,EAAcnwB,EAASusB,EAAQ2C,EAAWD,EAAUD,EAAcxC,EAAU,KAW9E,EASAhM,OAAAA,CAAQxgB,EAAS8M,EAAOikB,GACvB,GAAqB,iBAAVjkB,IAAuB9M,EAAS,OAAO,KAElD,MAAMgxB,EAAMnB,EACX,IAAIoB,YAAYnkB,EAAO,CACtBokB,SAAS,EACTC,YAAY,EACZC,OAAQL,IAETA,GAID,OADA/wB,EAAQqxB,cAAcL,GACfA,CACR,GAGD,wDCvWA,MAAM7J,EAAc,CAQnB1kB,GAAAA,CAAIzC,EAASsxB,EAAgB,OAAQC,GAAmB,GACvD,KAAKhxB,EAAAA,EAAAA,IAAUP,GAAU,MAAO,CAAC,EAGjC,GAAsB,QAAlBsxB,EACH,OAAO1gB,MAAMC,KAAK7Q,EAAQyoB,YAAYlH,QAAO,CAACgG,EAAKmB,KAClDnB,EAAImB,EAAKvd,MAAQud,EAAKhlB,MACf6jB,IACL,CAAC,GAIL,GAAsB,SAAlB+J,EAA0B,CAC7B,MAAME,EAAW,IAAIjhB,IAAI,CAAC,iBAAkB,iBAAkB,kBAAmB,mBAC3EkhB,EAAY,CAAC,EAWnB,OATA7gB,MAAMC,KAAK7Q,EAAQyoB,YACjBhnB,QAAOinB,GAAQA,EAAKvd,KAAKxJ,WAAW,WACpCC,SAAQ8mB,IACR,IAAK8I,EAASlJ,IAAII,EAAKvd,MAAO,CAC7B,MAAMlL,EAAMsxB,EAAmB7I,EAAKvd,KAAKkW,MAAM,GAAKqH,EAAKvd,KACzDsmB,EAAUxxB,IAAOuE,EAAAA,EAAAA,IAAckkB,EAAKhlB,MACrC,KAGK+tB,CACR,CAGA,OAAOzxB,EAAQ+Q,aAAaugB,EAC7B,EAQAhJ,IAAGA,CAACtoB,EAASsxB,KACL/wB,EAAAA,EAAAA,IAAUP,IAAYA,EAAQ0xB,aAAaJ,GASnDlvB,GAAAA,CAAIpC,EAASmL,EAAMzH,IACdnD,EAAAA,EAAAA,IAAUP,IAAYmL,GACzBnL,EAAQkP,aAAa/D,EAAMzH,EAE7B,EAOA5C,MAAAA,CAAOd,EAASsxB,IACX/wB,EAAAA,EAAAA,IAAUP,IAAYsxB,GACzBtxB,EAAQ2xB,gBAAgBL,EAE1B,EAMAlR,IAAAA,CAAKpgB,IACAO,EAAAA,EAAAA,IAAUP,KACbA,EAAQuT,MAAM4E,QAAU,OAE1B,EAOA6H,IAAAA,CAAKhgB,EAASoY,EAAQ,UACjB7X,EAAAA,EAAAA,IAAUP,KACbA,EAAQuT,MAAM4E,QAAUC,EAE1B,GAMKwZ,EAAU,CAMf9wB,MAAAA,CAAOd,EAASsiB,GACf,KAAK/hB,EAAAA,EAAAA,IAAUP,KAAasiB,EAAW,OAEvC,MAAMuP,EAAUjhB,MAAMiP,QAAQyC,GAAaA,EAAYA,EAAUtX,MAAM,KAAKvJ,OAAO8V,SACnFvX,EAAQW,UAAUG,UAAU+wB,EAC7B,EASAjxB,GAAAA,CAAIZ,EAASsiB,EAAWwP,GAAW,GAClC,IAAKxP,EAAW,OAEhB,MAAMuP,EAAUjhB,MAAMiP,QAAQyC,GAAaA,EAAYA,EAAUtX,MAAM,KAAKvJ,OAAO8V,SAEnF,GAAIua,EACH,OAAOD,EAAQ7O,KAAK,MAGjBziB,EAAAA,EAAAA,IAAUP,IACbA,EAAQW,UAAUC,OAAOixB,EAE3B,EAQA5R,MAAAA,CAAOjgB,EAASsiB,EAAWyP,GAAY,IAClCxxB,EAAAA,EAAAA,IAAUP,IAAYsiB,GACzBtiB,EAAQW,UAAUsf,OAAOqC,IAAayP,EAExC,EAQAnK,OAAAA,CAAQ5nB,EAASgyB,EAAUhF,IACtBzsB,EAAAA,EAAAA,IAAUP,IAAYgyB,GAAYhF,GACrChtB,EAAQW,UAAUinB,QAAQoK,EAAUhF,EAEtC,EAQA1E,IAAGA,CAACtoB,EAASsiB,KACL/hB,EAAAA,EAAAA,IAAUP,IAAYA,EAAQW,UAAUE,SAASyhB,iDC5J1D,MAaM2P,EAAejyB,IACpB,MAAMkyB,EAAalyB,EAAQ+Q,aAAa,kBACxC,GAAImhB,GAA6B,MAAfA,EACjB,OAAOA,EAAWjsB,OAGnB,MAAM0kB,EAAO3qB,EAAQ+Q,aAAa,QAClC,IAAK4Z,IAAUA,EAAKzf,SAAS,OAASyf,EAAKhpB,WAAW,KACrD,OAAO,KAGR,MAAMyP,EAAWuZ,EAAKzf,SAAS,OAASyf,EAAKhpB,WAAW,KACrD,IAAIgpB,EAAK3f,MAAM,KAAK,KACpB2f,EAEH,MAAoB,MAAbvZ,EAAmBA,EAASnL,OAAS,IAAI,EAkKjD,EA5JkB,CAOjBjE,IAAAA,CAAKoP,EAAU+gB,EAAYtlB,SAASulB,iBACnC,IAAI7xB,EAAAA,EAAAA,IAAU6Q,GACb,OAAOA,EAER,IACC,OAAO+gB,EAAUprB,cAAcqK,EAChC,CAAE,MAAO/B,GAER,OADA5B,QAAQC,KAAK,oBAAqB0D,EAAU/B,GACrC,IACR,CACD,EAcAgjB,MAAAA,CAAOrhB,EAAImhB,EAAYtlB,UACtB,IACC,GAAkB,iBAAPmE,GAAiC,KAAdA,EAAG/K,OAAe,OAAO,KAEvD,MAIMqsB,GAJMH,GAAoC,IAAvBA,EAAUlK,SAChCkK,EACCA,GAAWI,eAAiB1lB,UAEf2lB,eAAexhB,GAChC,GAAIshB,EACH,OAAIH,GAAoC,IAAvBA,EAAUlK,SACnBkK,EAAUtxB,SAASyxB,GAAQA,EAAO,KAEnCA,EAGR,MAAMG,EAASN,GAAoC,IAAvBA,EAAUlK,SAAkBkK,EAAUC,gBAAkBD,EACpF,IAAKM,GAAwC,mBAAxBA,EAAM1rB,cAA8B,OAAO,KAEhE,MAAM2rB,EApFS1hB,IACbA,GAAM6D,OAAO8d,KAAKC,OACdD,IAAIC,OAAO5hB,GAGZA,EAAG4W,QAAQ,aAAc,QA+EdiL,CAAS7hB,GACzB,OAAOyhB,EAAM1rB,cAAc,IAAI2rB,IAChC,CAAE,MAAOrjB,GAER,OADA5B,QAAQC,KAAK,wBAAyBsD,EAAI3B,GACnC,IACR,CACD,EAQA+R,OAAAA,CAAQhQ,EAAU+gB,EAAYtlB,SAASulB,iBACtC,IACC,OAAOxhB,MAAMC,KAAKshB,EAAUnjB,iBAAiBoC,GAC9C,CAAE,MAAO/B,GAER,OADA5B,QAAQC,KAAK,+BAAgC0D,EAAU/B,GAChD,EACR,CACD,EAOAnC,sBAAAA,CAAuBlN,GACtB,MAAMoR,EAAW6gB,EAAYjyB,GAC7B,OAAOoR,GAAY5R,KAAKwC,KAAKoP,GAAYA,EAAW,IACrD,EAOAyR,sBAAAA,CAAuB7iB,GACtB,MAAMoR,EAAW6gB,EAAYjyB,GAC7B,OAAOoR,EAAW5R,KAAKwC,KAAKoP,GAAY,IACzC,EAOA0hB,+BAAAA,CAAgC9yB,GAC/B,MAAMoR,EAAW6gB,EAAYjyB,GAC7B,OAAOoR,EAAW5R,KAAK4hB,QAAQhQ,GAAY,EAC5C,EAQA2hB,OAAAA,CAAQ/yB,EAASoR,GAChB,MAAM2hB,EAAU,GAChB,IAAIC,EAAShzB,EAAQizB,eAAe9lB,QAAQiE,GAE5C,KAAO4hB,GACND,EAAQ5b,KAAK6b,GACbA,EAASA,EAAOC,eAAe9lB,QAAQiE,GAGxC,OAAO2hB,CACR,EAQAG,IAAAA,CAAKlzB,EAASoR,GACb,IAAI+hB,EAAUnzB,EAAQozB,mBACtB,KAAOD,GAAS,CACf,GAAIA,EAAQE,QAAQjiB,GACnB,MAAO,CAAC+hB,GAETA,EAAUA,EAAQC,kBACnB,CACA,MAAO,EACR,EAQAE,IAAAA,CAAKtzB,EAASoR,GACb,IAAI+hB,EAAUnzB,EAAQuzB,uBACtB,KAAOJ,GAAS,CACf,GAAIA,EAAQE,QAAQjiB,GACnB,MAAO,CAAC+hB,GAETA,EAAUA,EAAQI,sBACnB,CACA,MAAO,EACR,oLC7LD,MAAMhzB,EAAa+vB,GAAQA,GAAKrI,WAAaC,KAAKG,aAO5C9kB,EAAY+sB,GAAQA,GAAsB,iBAARA,EAOlC9sB,EAAc8sB,IACnB,IAAK/sB,EAAS+sB,GAAM,OAAO,EAC3B,IAAK,MAAMrwB,KAAOqwB,EACjB,GAAI1tB,OAAO+E,UAAUhE,eAAeiE,KAAK0oB,EAAKrwB,GAAM,OAAO,EAE5D,OAAO,CAAI,EAQNuzB,EAAcpiB,IACnB,GAAI7Q,EAAU6Q,GAAW,OAAOA,EAChC,GAAIA,GAAUqiB,OAAQ,OAAOriB,EAAS,IAAM,KAC5C,GAAwB,iBAAbA,GAA6C,KAApBA,EAASnL,OAC5C,IACC,OAAO4G,SAAS9F,cAAcqK,EAC/B,CAAE,MAAO/B,GAER,OADA5B,QAAQC,KAAK,oBAAqB0D,GAC3B,IACR,CAED,OAAO,IAAI,EAQNnE,EAAc6D,IACdvQ,EAAUuQ,MACXA,EAAGnQ,UAAUE,SAAS,mBACC,IAAhBiQ,EAAG4iB,WAAmC5iB,EAAG4iB,SAC7C5iB,EAAG4gB,aAAa,aAA+C,UAAhC5gB,EAAGC,aAAa,aAQjD4iB,EAAa7iB,IAClB,IAAKvQ,EAAUuQ,IAAsC,IAA/BA,EAAG8iB,iBAAiBhmB,OAAc,OAAO,EAG/D,GAAyB,WADXimB,iBAAiB/iB,GACrBgjB,WAAyB,OAAO,EAE1C,MAAMC,EAAgBjjB,EAAG3D,QAAQ,uBACjC,IAAK4mB,EAAe,OAAO,EAE3B,MAAMC,EAAUljB,EAAG3D,QAAQ,WAC3B,SAAI6mB,GAAWA,EAAQpE,aAAemE,EAE1B,EAQPvvB,EAAiBd,IACtB,GAAc,SAAVA,EAAkB,OAAO,EAC7B,GAAc,UAAVA,EAAmB,OAAO,EAC9B,GAAc,SAAVA,EAAkB,OAAO,KAC7B,GAAc,KAAVA,EAAc,OAAO,KACzB,GAAqB,iBAAVA,GAAsBA,IAAU2Q,OAAO3Q,GAAQ,OAAO2Q,OAAO3Q,GACxE,GAAqB,iBAAVA,EAAoB,OAAOA,EAEtC,IACC,OAAO+f,KAAK/c,MAAMutB,mBAAmBvwB,GACtC,CAAE,MACD,OAAOA,CACR,GAgBKpD,EAAkBA,IAAI4zB,KAC3B,MAAMC,EAASC,GAAMA,GAAkB,iBAANA,EAEjC,OAAOF,EAAQ3S,QAAO,CAACgG,EAAK+I,IACtB6D,EAAM7D,IAEX1tB,OAAOwgB,KAAKkN,GAAK1uB,SAAS3B,IACzB,MAAM2qB,EAAMrD,EAAItnB,GACVo0B,EAAM/D,EAAIrwB,GAEZ2Q,MAAMiP,QAAQ+K,IAAQha,MAAMiP,QAAQwU,GACvC9M,EAAItnB,GAAO2qB,EAAI0J,OAAOD,GACZF,EAAMvJ,IAAQuJ,EAAME,GAC9B9M,EAAItnB,GAAOK,EAAgBsqB,EAAKyJ,GAEhC9M,EAAItnB,GAAOo0B,CACZ,IAGM9M,GAfiBA,GAgBtB,CAAC,EAAE,EAUD9iB,EAAUA,CAAC+qB,EAAIuB,EAAO,GAAIwD,EAAe/E,IACzB,mBAAPA,EAAoBA,KAAMuB,GAAQwD,EAO3CC,EAAiB,gBAejBptB,EAAyBA,CAACrE,EAAU/C,EAASy0B,GAAoB,EAAMC,KAC5E,IAAK10B,EAEJ,YADAyE,EAAQ1B,GAIT,IAAK0xB,EAEJ,YADAhwB,EAAQ1B,GAIT,MAAMjD,EAAW40B,GAAaC,EAAiC30B,GAAW,EAC1E,IAAI40B,GAAS,EAEb,MAAMpI,EAAWnd,IACZA,EAAEvL,SAAW9D,IAChB40B,GAAS,EACT50B,EAAQkR,oBAAoBsjB,EAAgBhI,GAC5C/nB,EAAQ1B,GACT,EAGD/C,EAAQoP,iBAAiBolB,EAAgBhI,GACzCznB,YAAW,KACL6vB,GAAQC,EAAqB70B,EAAQ,GACxCF,EAAS,EAQP60B,EAAoC30B,IACzC,IAAKA,EAAS,OAAO,EACrB,MAAM,mBAAE80B,EAAkB,gBAAEC,GAAoBlB,iBAAiB7zB,GAE3Dg1B,EAAYF,EAAmB9pB,MAAM,MACrCiqB,EAASF,EAAgB/pB,MAAM,MAKrC,OApD+B,MAiDdqJ,OAAOC,WAAW0gB,EAAU,KAAO,IACtC3gB,OAAOC,WAAW2gB,EAAO,KAAO,GAEK,EAO9CJ,EAAwB70B,IACxBA,GACLA,EAAQqxB,cAAc,IAAI6D,MAAMV,GAAgB,EAO3CW,EAAUn1B,IAEfA,EAAQmU,YAAY,EAOf6Q,EAAOA,OAOP/F,EAAmBA,CAACrR,EAAS,KAElC,IAAIwnB,EAAS,GACb,IAAK,IAAI5K,EAAI,EAAGA,EAAI5c,EAAQ4c,IAC3B4K,GAHa,iEAGGC,OAAO1gB,KAAK2gB,MAAsBC,GAAhB5gB,KAAK6gB,WAExC,OAAOJ,CAAM,EASRK,EAAgBA,CAAC5W,EAAM6W,GAAS,KACrC,MAAM7kB,EAAO,kEAAmE7F,MAAM,KAChF2qB,EAAK,kEAAkE3qB,MAAM,KAE7E4f,EAAM8K,EAAS7kB,EAAO8kB,EACtBC,EAAMF,EAASC,EAAK9kB,EAE1B,IAAIukB,EAASvW,EAEb,IAAK,IAAI2L,EAAI,EAAGA,EAAII,EAAIhd,OAAQ4c,IAAK,CACpC,MAAMqL,EAAWjL,EAAIJ,GACfsL,EAAWF,EAAIpL,GACfuL,EAAWnL,EAAIJ,GAAGtkB,cAClB8vB,EAAWJ,EAAIpL,GAAGtkB,cAExBkvB,EAASA,EAAOpqB,MAAM6qB,GAAU7S,KAAK8S,GAAU9qB,MAAM+qB,GAAU/S,KAAKgT,EACrE,CAEA,OAAOZ,CAAM,EAWRa,EAAuBA,CAAC/nB,EAAMgoB,EAAQC,EAASC,KACpD,MAAMC,EAAMnoB,EAAKN,OACjB,IAAI0oB,EAAMpoB,EAAKqoB,QAAQL,GAEvB,OAAa,IAATI,EAAmBH,IAAYC,EAAQloB,EAAK,GAAKA,EAAKmoB,EAAM,IAEhEC,GAAOH,EAAU,GAAK,EAClBC,IAAOE,GAAQA,EAAMD,EAAOA,GAAOA,GAEhCnoB,EAAKyG,KAAKC,IAAI,EAAGD,KAAKO,IAAIohB,EAAKD,EAAM,KAAI,EAkB3CG,EAAQA,IAAuC,QAAjC3pB,SAASulB,gBAAgBqE,IAE7C,SAASC,IACR,MAAMC,EAAYC,UAAUD,UACtBE,EAAa,4BAA4BC,KAAKH,GAC9CI,EAAgB,iBAAkBliB,QAAU+hB,UAAUI,eAAiB,EACvEC,EAAgBpiB,OAAOC,WAAa,IACpCoiB,EAAYriB,OAAOsiB,kBAAoB,EAiC7C,OAAON,GAAeE,GAAiBE,GAAiBC,GA/BxD,WACC,MAAMP,EAAYC,UAAUD,UACtBS,EAAWR,UAAUQ,SAI3B,KAFe,OAAON,KAAKH,IAA4B,aAAbS,GAA2BR,UAAUI,eAAiB,GAEnF,MAAO,CAAEK,WAAW,GAEjC,MAAMC,EAAcziB,OAAO0iB,OAAOtjB,MAAQY,OAAOsiB,iBAC3CK,EAAe3iB,OAAO0iB,OAAOvnB,OAAS6E,OAAOsiB,iBAanD,MAAO,CACNE,UAZsB,CACtB,CAAEpjB,MAAO,KAAMjE,OAAQ,MACvB,CAAEiE,MAAO,KAAMjE,OAAQ,MACvB,CAAEiE,MAAO,KAAMjE,OAAQ,OAGeynB,MAAKC,GAC1CJ,IAAgBI,EAAIzjB,OAASujB,IAAiBE,EAAI1nB,QAClDsnB,IAAgBI,EAAI1nB,QAAUwnB,IAAiBE,EAAIzjB,QAKpDqjB,YAAaA,EACbE,aAAcA,EACdb,UAAWA,EACXS,SAAUA,EAEZ,CAEsEO,GAAgBN,SACvF,ICnWIO,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBvxB,IAAjBwxB,EACH,OAAOA,EAAa34B,QAGrB,IAAIC,EAASu4B,EAAyBE,GAAY,CAGjD14B,QAAS,CAAC,GAOX,OAHA44B,EAAoBF,GAAUz4B,EAAQA,EAAOD,QAASy4B,GAG/Cx4B,EAAOD,OACf,CCrBAy4B,EAAoBI,EAAI,CAAC74B,EAAS84B,KACjC,IAAI,IAAIj4B,KAAOi4B,EACXL,EAAoBzD,EAAE8D,EAAYj4B,KAAS43B,EAAoBzD,EAAEh1B,EAASa,IAC5E2C,OAAO2tB,eAAenxB,EAASa,EAAK,CAAEk4B,YAAY,EAAM11B,IAAKy1B,EAAWj4B,IAE1E,ECND43B,EAAoBzD,EAAI,CAAC9D,EAAK7C,IAAU7qB,OAAO+E,UAAUhE,eAAeiE,KAAK0oB,EAAK7C,GCClFoK,EAAoBO,EAAKh5B,IACH,oBAAXi5B,QAA0BA,OAAOC,aAC1C11B,OAAO2tB,eAAenxB,EAASi5B,OAAOC,YAAa,CAAE50B,MAAO,WAE7Dd,OAAO2tB,eAAenxB,EAAS,aAAc,CAAEsE,OAAO,GAAO,8DCY9D,MAAM60B,EAAyB,oDACzBC,EAA0B,cAC1BC,EAAmB,gBACnBC,EAAkB,eAuJxB,EAjJA,MACC34B,WAAAA,GAEC,CAGD,YAAII,GACH,OAAO0M,SAASvG,IACjB,CAMAqyB,QAAAA,GACC,MAAMC,EAAgB/rB,SAASulB,gBAAgByG,YAC/C,OAAOlkB,KAAKuG,IAAIrG,OAAOC,WAAa8jB,EACrC,CAMAE,aAAAA,GACC,OAAOt5B,KAAKm5B,WAAa,CAC1B,CAKAvY,IAAAA,GACC,GAAI5gB,KAAKs5B,mBAAoBpC,EAAAA,EAAAA,MAAkB,CAC9C,MAAMziB,EAAQzU,KAAKm5B,WACnBn5B,KAAKu5B,mBAELv5B,KAAKw5B,UAAUT,EAAwBE,EAAkBxkB,GAAQvQ,GAAUA,EAAQuQ,IACnFzU,KAAKw5B,UAAUR,EAAyBE,EAAiBzkB,GAAQvQ,GAAUA,EAAQuQ,IACnFzU,KAAKw5B,UAAUx5B,KAAKW,SAAUs4B,EAAkBxkB,GAAQvQ,GAAUA,EAAQuQ,GAC3E,MAAWyiB,EAAAA,EAAAA,OACVl3B,KAAKu5B,kBAEP,CAKAE,KAAAA,GACCz5B,KAAK05B,YAAY15B,KAAKW,SAAU,YAChCX,KAAK05B,YAAY15B,KAAKW,SAAUs4B,GAChCj5B,KAAK05B,YAAYX,EAAwBE,GACzCj5B,KAAK05B,YAAYV,EAAyBE,EAC3C,CAMAK,gBAAAA,GACCv5B,KAAK25B,kBAAkB35B,KAAKW,SAAU,YACtCX,KAAKW,SAASoT,MAAMqI,SAAW,QAChC,CAUAod,SAAAA,CAAU5nB,EAAUgoB,EAAUnlB,EAAOlR,GAepCvD,KAAK65B,iBAAiBjoB,GAdPpR,IAEd,GAAIA,IAAYR,KAAKW,UAAY0U,OAAOC,WAAa9U,EAAQ64B,YAAc5kB,EAC1E,OAGDzU,KAAK25B,kBAAkBn5B,EAASo5B,GAEhC,MAAME,EAAUzF,iBAAiB7zB,GAASu5B,iBAAiBH,GACrD11B,EAAQ2Q,OAAOC,WAAWglB,IAAY,EAE5Ct5B,EAAQuT,MAAMimB,YAAYJ,EAAU,GAAGr2B,EAASW,OAAW,GAI7D,CAQAw1B,WAAAA,CAAY9nB,EAAUgoB,GAarB55B,KAAK65B,iBAAiBjoB,GAZPpR,IACd,MAAM0D,EAAQyjB,EAAAA,EAAY1kB,IAAIzC,EAASo5B,GAEzB,OAAV11B,GAKJyjB,EAAAA,EAAYrmB,OAAOd,EAASo5B,GAC5Bp5B,EAAQuT,MAAMimB,YAAYJ,EAAU11B,IALnC1D,EAAQuT,MAAMkmB,eAAeL,EAKY,GAI5C,CASAD,iBAAAA,CAAkBn5B,EAASo5B,GAG1B,GAA2C,OAAvCjS,EAAAA,EAAY1kB,IAAIzC,EAASo5B,GAAoB,OAEjD,MAAM11B,EAAQ1D,EAAQuT,MAAMgmB,iBAAiBH,GAI7CjS,EAAAA,EAAY/kB,IAAIpC,EAASo5B,EAAU11B,EACpC,CAQA21B,gBAAAA,CAAiBjoB,EAAUrO,IACtBxC,EAAAA,EAAAA,IAAU6Q,GACbrO,EAASqO,GAIVrP,EAAAA,EAAUqf,QAAQhQ,EAAU5R,KAAKW,UAAUyB,QAAQmB,EACpD,gBCnKD,MACM22B,EAAa,cACbC,EAAkB,OAClB7d,EAAkB,OAIxB,MAAM8d,EACL,kBAAWC,GACV,OAAOhtB,SAASvG,IACjB,CAEA4W,kBAAoB,IAAI4c,EACxB5c,iBAAmB,KAMnB,WAAO8C,CAAKjd,GACNvD,KAAKu6B,YACTv6B,KAAKu6B,UAAYv6B,KAAKq6B,QAAQ9yB,cAAc,IAAI2yB,MAG7Cl6B,KAAKu6B,WACRv6B,KAAKu6B,UAAUj5B,SAGhBtB,KAAKw6B,WACLv1B,EAAAA,EAAAA,IAAQ1B,EACT,CAMA,WAAOqd,CAAKrd,GACNvD,KAAKu6B,YAETv6B,KAAKu6B,UAAYv6B,KAAKq6B,QAAQ9yB,cAAc,IAAI2yB,MAG5Cl6B,KAAKu6B,WAEVv6B,KAAKy6B,WAAWvU,KAAKjhB,EAAAA,GAAQtD,KAAK,KAAM4B,GACzC,CAMA,cAAOi3B,GACN,MAAME,GAAOj2B,EAAAA,EAAAA,GAAK,OAClBzE,KAAKu6B,UAAYG,EAAKh2B,IAAI,CAAEC,MAAOu1B,IAEnCl6B,KAAKq6B,QAAQ/P,YAAYtqB,KAAKu6B,WAC9BtqB,uBAAsB,KACrBmiB,EAAAA,EAAQhxB,IAAIpB,KAAKu6B,UAAWje,GAC5B/W,YAAW,KACV6sB,EAAAA,EAAQhxB,IAAIpB,KAAKu6B,UAAWJ,EAAgB,GAtD1B,IAuDF,GAEnB,CAOA,eAAOM,GACN,OAAO,IAAIrU,SAASuU,IACnBvI,EAAAA,EAAQ9wB,OAAOtB,KAAKu6B,UAAWJ,GAC/B50B,YAAW,KACV6sB,EAAAA,EAAQ9wB,OAAOtB,KAAKu6B,UAAWje,GAC/Btc,KAAKu6B,UAAUj5B,SACftB,KAAKu6B,UAAY,KACjBv6B,KAAK46B,WAAWnB,QAChBkB,GAAS,GAxES,IAyEF,GAEnB,EAGD,gCCxFA,MAAMhpB,EAAkB,CACvBxR,QAAQ,EACRyR,SAAU,oBACVC,UAAW,EACXC,eAAgB,EAChBC,OAAO,GAsUR,EAnUA,MACCxR,WAAAA,CAAYyR,EAAcC,EAAetM,EAAU,CAAC,GACnD3F,KAAKkS,cAAgBF,EACrBhS,KAAKmS,eAAiBF,EACtBjS,KAAKoS,SAAWpS,KAAKqS,kBAAkB1M,GACvC3F,KAAKsS,WAAa,KAClBtS,KAAKuS,YAAc,KACnBvS,KAAKwS,aAAc,EACnBxS,KAAKyS,QAAU,EACfzS,KAAK0S,QAAU,EACf1S,KAAK2S,UAAY,EACjB3S,KAAK4S,UAAY,EACjB5S,KAAK6S,iBAAmB,EACxB7S,KAAK8S,gBAAkB,EACvB9S,KAAK+S,aAAe,EACpB/S,KAAKgT,cAAgB,EACrBhT,KAAKiT,YAAa,EAClBjT,KAAKkT,oBAAsB,GAC3BlT,KAAKmT,oBAAsB,GAC3BnT,KAAKoT,oBAAsB,GAC3BpT,KAAKqT,aAAe,KACpBrT,KAAKsT,eAAiB,GACtBtT,KAAKuT,cAAgB,KAErBvT,KAAKwT,eAAiBxT,KAAKwT,eAAe7R,KAAK3B,MAC/CA,KAAKyT,aAAezT,KAAKyT,aAAa9R,KAAK3B,MAC3CA,KAAK0T,eAAiB1T,KAAK0T,eAAe/R,KAAK3B,MAC/CA,KAAK2T,mBAAqB3T,KAAK2T,mBAAmBhS,KAAK3B,KACxD,CAEA4T,UAAAA,CAAWjO,EAAU,CAAC,GACrB3F,KAAKoS,SAAWpS,KAAKqS,kBAAkB1M,EAAS3F,KAAKoS,UACrDpS,KAAK6T,qBACN,CAEA1T,MAAAA,GACMH,KAAKmS,iBAAkBnS,KAAKiT,aAEjCjT,KAAK6T,sBACL7T,KAAKmS,eAAevC,iBAAiB,cAAe5P,KAAK0T,gBACzD1T,KAAKiT,YAAa,EACnB,CAEAa,OAAAA,GACM9T,KAAKmS,gBAAmBnS,KAAKiT,aAElCjT,KAAKmS,eAAeT,oBAAoB,cAAe1R,KAAK0T,gBAC5DrG,SAASqE,oBAAoB,cAAe1R,KAAKwT,gBACjDnG,SAASqE,oBAAoB,YAAa1R,KAAKyT,cAC/CpG,SAASqE,oBAAoB,gBAAiB1R,KAAKyT,cACnDpG,SAASqE,oBAAoB,YAAa1R,KAAK2T,oBAAoB,GACnE3T,KAAKmS,eAAe4B,MAAMC,YAAc,GACxC3G,SAASvG,KAAKiN,MAAME,WAAajU,KAAKkT,oBACtClT,KAAKsS,WAAa,KAClBtS,KAAKuS,YAAc,KACnBvS,KAAKwS,aAAc,EACnBxS,KAAKqT,aAAe,KACpBrT,KAAKkU,wBACLlU,KAAKmU,4BACEnU,KAAKkS,cAAckC,QAAQymB,gBAClC76B,KAAKsU,qBAAoB,GACzBtU,KAAKiT,YAAa,EACnB,CAEAsB,YAAAA,GACC,IAAKvU,KAAKiT,WAAY,OACtB,IAAKjT,KAAKwU,4BAA6B,OAEvC,MAAMnE,EAAOrQ,KAAKmS,eAAe7B,wBAC3BmE,EAAQzU,KAAKmS,eAAeuC,aAAerE,EAAKoE,MAChDjE,EAASxQ,KAAKmS,eAAewC,cAAgBtE,EAAKG,OAClDoE,EAAcC,OAAOC,WAAW9U,KAAKmS,eAAe4B,MAAMgB,MAC1DC,EAAaH,OAAOC,WAAW9U,KAAKmS,eAAe4B,MAAMrD,KACzDqE,EAAOF,OAAOI,SAASL,GAAeA,EAAcvE,EAAK0E,KACzDrE,EAAMmE,OAAOI,SAASD,GAAcA,EAAa3E,EAAKK,IACtDwE,EAAUC,KAAKC,IAAI,EAAGC,OAAOC,WAAab,GAC1Cc,EAASJ,KAAKC,IAAI,EAAGC,OAAOG,YAAchF,GAC1CiF,EAAWN,KAAKO,IAAIR,EAASC,KAAKC,IAAI,EAAGL,IACzCY,EAAUR,KAAKO,IAAIH,EAAQJ,KAAKC,IAAI,EAAG1E,IAE7C1Q,KAAKmS,eAAe4B,MAAMgB,KAAO,GAAGU,MACpCzV,KAAKmS,eAAe4B,MAAMrD,IAAM,GAAGiF,MACnC3V,KAAK4V,mBAAmB,SACzB,CAEAlC,cAAAA,CAAepG,GACd,GAAqB,IAAjBA,EAAMhG,OAAc,OAExB,MAAMuO,EAAW7V,KAAK8V,iBAAiBxI,EAAMhJ,QACxCuR,GAAa7V,KAAKmS,eAAe9Q,SAASwU,KAC3C7V,KAAK+V,uBAAuBzI,IAC5BA,EAAMhJ,OAAOqJ,QAAQ,iEACrBkI,GAAYA,EAASlI,QAAQ,+BAEjC3N,KAAKsS,WAAahF,EAAM0I,UACxBhW,KAAKuS,YAAcjF,EAAMhJ,OACzBtE,KAAKwS,aAAc,EACnBlF,EAAME,iBACNxN,KAAKkT,oBAAsB7F,SAASvG,KAAKiN,MAAME,WAC/C5G,SAASvG,KAAKiN,MAAME,WAAa,OACjCjU,KAAKqT,aAAerT,KAAKmS,eAAe7B,wBACxCtQ,KAAK6S,iBAAmB7S,KAAKqT,aAAa0B,KAC1C/U,KAAK8S,gBAAkB9S,KAAKqT,aAAa3C,IACzC1Q,KAAK+S,aAAe/S,KAAKqT,aAAaoB,MACtCzU,KAAKgT,cAAgBhT,KAAKqT,aAAa7C,OACvCxQ,KAAKyS,QAAUnF,EAAM2I,QACrBjW,KAAK0S,QAAUpF,EAAMmD,QACrBzQ,KAAK2S,UAAYrF,EAAM2I,QACvBjW,KAAK4S,UAAYtF,EAAMmD,QACvBzQ,KAAKkW,sBACLlW,KAAKkS,cAAckC,QAAQymB,gBAAkB,OAC7C76B,KAAKsU,qBAAoB,GACzBtU,KAAK4V,mBAAmB,SAExBvI,SAASuC,iBAAiB,YAAa5P,KAAK2T,oBAAoB,GAE5D3T,KAAKmS,gBAAkBnS,KAAKmS,eAAegE,mBAC9CnW,KAAKmS,eAAegE,kBAAkB7I,EAAM0I,WAG7C3I,SAASuC,iBAAiB,cAAe5P,KAAKwT,gBAC9CnG,SAASuC,iBAAiB,YAAa5P,KAAKyT,cAC5CpG,SAASuC,iBAAiB,gBAAiB5P,KAAKyT,eACjD,CAEAD,cAAAA,CAAelG,GACd,GAAIA,EAAM0I,YAAchW,KAAKsS,WAA7B,CAIA,GAFAtS,KAAK2S,UAAYrF,EAAM2I,QACvBjW,KAAK4S,UAAYtF,EAAMmD,SAClBzQ,KAAKwS,YAAa,CACtB,MAAM4D,EAASpW,KAAK2S,UAAY3S,KAAKyS,QAC/B4D,EAASrW,KAAK4S,UAAY5S,KAAK0S,QAErC,GADiByC,KAAKmB,MAAMF,EAAQC,GACrBrW,KAAKoS,SAASP,UAAW,OAExC7R,KAAKwS,aAAc,EACnBxS,KAAKmS,eAAe4B,MAAMC,YAAc,OACxChU,KAAKuW,mBACLvW,KAAKwW,iBAAiBxW,KAAKqT,cAC3B/F,EAAME,iBACNxN,KAAK4V,mBAAmB,WACzB,CACA5V,KAAKyW,oBAjB0C,CAkBhD,CAEAhD,YAAAA,CAAanG,GACRA,EAAM0I,YAAchW,KAAKsS,aAE7BjF,SAASqE,oBAAoB,cAAe1R,KAAKwT,gBACjDnG,SAASqE,oBAAoB,YAAa1R,KAAKyT,cAC/CpG,SAASqE,oBAAoB,gBAAiB1R,KAAKyT,cACnDpG,SAASqE,oBAAoB,YAAa1R,KAAK2T,oBAAoB,GAC/D3T,KAAKwS,aACRxS,KAAKyW,qBAENzW,KAAKmS,eAAe4B,MAAMC,YAAc,GACxC3G,SAASvG,KAAKiN,MAAME,WAAajU,KAAKkT,oBAElClT,KAAKmS,gBAAkBnS,KAAKmS,eAAeuE,uBAC9C1W,KAAKmS,eAAeuE,sBAAsBpJ,EAAM0I,WAGjDhW,KAAKsS,WAAa,KAClBtS,KAAKuS,YAAc,KACnBvS,KAAKwS,aAAc,EACnBxS,KAAKqT,aAAe,KACpBrT,KAAKkU,wBACLlU,KAAKmU,4BACEnU,KAAKkS,cAAckC,QAAQymB,gBAClC76B,KAAKsU,oBAAoBtU,KAAKoS,SAASL,OACvC/R,KAAK4V,mBAAmB,QACzB,CAEAY,gBAAAA,CAAiBnG,EAAO,MACvB,IAAKrQ,KAAKmS,eAAgB,OAE1B,MAAMwE,EAActG,GAAQrQ,KAAKmS,eAAe7B,wBAChDtQ,KAAKmS,eAAe4B,MAAM6C,SAAW,QACrC5W,KAAKmS,eAAe4B,MAAM8C,OAAS,IACnC7W,KAAKmS,eAAe4B,MAAMgB,KAAO,GAAG4B,EAAY5B,SAChD/U,KAAKmS,eAAe4B,MAAMrD,IAAM,GAAGiG,EAAYjG,QAC/C1Q,KAAKmS,eAAe4B,MAAMU,MAAQ,GAAGkC,EAAYlC,UACjDzU,KAAKmS,eAAe4B,MAAMvD,OAAS,GAAGmG,EAAYnG,WAClDxQ,KAAKmS,eAAe4B,MAAM+C,UAAY,MACvC,CAEAtC,yBAAAA,GACC,MAA8C,UAAvCxU,KAAKmS,eAAe4B,MAAM6C,UAAgE,SAAxC5W,KAAKmS,eAAe4B,MAAM+C,SACpF,CAEAf,sBAAAA,CAAuBzI,GACtB,MAAM+C,EAAOrQ,KAAKmS,eAAe7B,wBAC3B0G,EAAU1J,EAAM2I,QAAU5F,EAAK0E,KAC/BkC,EAAU3J,EAAMmD,QAAUJ,EAAKK,IAC/BwG,EAAWlX,KAAKoS,SAASN,eAEzBqF,EAAUF,GAAW,GAAKA,GAAWC,EACrCE,EAAaH,GAAW5G,EAAKG,QAAUyG,GAAW5G,EAAKG,OAAS0G,EAChEG,EAAWL,GAAW,GAAKA,GAAWE,EACtCI,EAAYN,GAAW3G,EAAKoE,OAASuC,GAAW3G,EAAKoE,MAAQyC,EAEnE,OAAOC,GAAWC,GAAcC,GAAYC,CAC7C,CAEAb,kBAAAA,GACC,GAAwB,OAApBzW,KAAKsS,aAAwBtS,KAAKwS,YAAa,OAEnD,MAAM4D,EAASpW,KAAK2S,UAAY3S,KAAKyS,QAC/B4D,EAASrW,KAAK4S,UAAY5S,KAAK0S,QAC/BwC,EAAUC,KAAKC,IAAI,EAAGC,OAAOC,WAAatV,KAAK+S,cAC/CwC,EAASJ,KAAKC,IAAI,EAAGC,OAAOG,YAAcxV,KAAKgT,eAC/CyC,EAAWN,KAAKO,IAAIR,EAASC,KAAKC,IAAI,EAAGpV,KAAK6S,iBAAmBuD,IACjET,EAAUR,KAAKO,IAAIH,EAAQJ,KAAKC,IAAI,EAAGpV,KAAK8S,gBAAkBuD,IAEpErW,KAAKmS,eAAe4B,MAAMgB,KAAO,GAAGU,MACpCzV,KAAKmS,eAAe4B,MAAMrD,IAAM,GAAGiF,MACnC3V,KAAK4V,mBAAmB,WACzB,CAEAjC,kBAAAA,CAAmBrG,GACM,OAApBtN,KAAKsS,YACThF,EAAME,gBACP,CAEA+I,gBAAAA,GACCvW,KAAKmT,oBAAsBnT,KAAKmS,eAAe4B,MAAMwD,WACrDvX,KAAKoT,oBAAsBpT,KAAKmS,eAAe4B,MAAMyD,WACrDxX,KAAKmS,eAAe4B,MAAMwD,WAAa,OACvCvX,KAAKmS,eAAe4B,MAAMyD,WAAa,WACxC,CAEArD,kBAAAA,GACCnU,KAAKmS,eAAe4B,MAAMwD,WAAavX,KAAKmT,oBAC5CnT,KAAKmS,eAAe4B,MAAMyD,WAAaxX,KAAKoT,mBAC7C,CAEA8C,mBAAAA,GACC,IAAKlW,KAAKmS,gBAAkBnS,KAAKsT,eAAelF,OAAQ,OAExD,MAAMqJ,EAAUzX,KAAKmS,eAAe3C,iBAAiB,UACrD,IAAK,MAAMkI,KAASD,EACnBzX,KAAKsT,eAAeqE,KAAK,CACxBnX,QAASkX,EACTE,cAAeF,EAAM3D,MAAM6D,gBAE5BF,EAAM3D,MAAM6D,cAAgB,MAE9B,CAEA1D,qBAAAA,GACC,GAAKlU,KAAKsT,eAAelF,OAAzB,CAEA,IAAK,MAAM0B,KAAQ9P,KAAKsT,eACvBxD,EAAKtP,QAAQuT,MAAM6D,cAAgB9H,EAAK8H,cAEzC5X,KAAKsT,eAAiB,EALiB,CAMxC,CAEAjB,iBAAAA,CAAkB1M,EAASkS,EAAOlG,GACjC,MAAMmG,EAAS,IAAID,KAASlS,GACtBkM,EAAYgD,OAAOiD,EAAOjG,WAC1BC,EAAiB+C,OAAOiD,EAAOhG,gBAC/BF,EAAsC,iBAApBkG,EAAOlG,UAAyBkG,EAAOlG,SAASnL,OACrEqR,EAAOlG,SACPD,EAAgBC,SAEnB,MAAO,IACHkG,EACHlG,WACAC,UAAWgD,OAAOI,SAASpD,IAAcA,GAAa,EAAIA,EAAYF,EAAgBE,UACtFC,eAAgB+C,OAAOI,SAASnD,IAAmBA,EAAiB,EAAIA,EAAiBH,EAAgBG,eACzGC,MAAOgG,QAAQD,EAAO/F,OAExB,CAEA+D,gBAAAA,CAAiBxR,GAChB,IACC,OAAOA,EAAOqJ,QAAQ3N,KAAKoS,SAASR,SACrC,CAAE,MAAOxC,GACR,OAAO9K,EAAOqJ,QAAQgE,EAAgBC,SACvC,CACD,CAEAiC,mBAAAA,GACM7T,KAAKoS,SAASL,OAKd/R,KAAKuT,gBACTvT,KAAKuT,cAAgBlG,SAAS2K,cAAc,OAC5ChY,KAAKuT,cAAcQ,MAAM6C,SAAW,WACpC5W,KAAKuT,cAAcQ,MAAMgB,KAAO,QAChC/U,KAAKuT,cAAcQ,MAAMkE,OAAS,MAClCjY,KAAKuT,cAAcQ,MAAMmE,OAAS,IAClClY,KAAKuT,cAAcQ,MAAMoE,QAAU,UACnCnY,KAAKuT,cAAcQ,MAAMqE,aAAe,MACxCpY,KAAKuT,cAAcQ,MAAMsE,WAAa,sBACtCrY,KAAKuT,cAAcQ,MAAMuE,MAAQ,OACjCtY,KAAKuT,cAAcQ,MAAMwE,SAAW,OACpCvY,KAAKuT,cAAcQ,MAAMyE,WAAa,MACtCxY,KAAKuT,cAAcQ,MAAM6D,cAAgB,OACzC5X,KAAKmS,eAAesG,OAAOzY,KAAKuT,gBAGjCvT,KAAKsU,qBAAoB,GACzBtU,KAAK4V,mBAAmB5V,KAAKwS,YAAc,WAAa,SArBvDxS,KAAKsU,qBAAoB,EAsB3B,CAEAA,mBAAAA,CAAoBoE,GACd1Y,KAAKuT,gBACVvT,KAAKuT,cAAcQ,MAAM4E,QAAUD,EAAU,QAAU,OACxD,CAEA9C,kBAAAA,CAAmBgD,EAAQ,QAC1B,IAAK5Y,KAAKuT,gBAAkBvT,KAAKoS,SAASL,MAAO,OAEjD,MAAM1B,EAAOrQ,KAAKmS,eAAe7B,wBACjCtQ,KAAKuT,cAAcsF,YAAc,QAAQD,OAAWzD,KAAK2D,MAAMzI,EAAK0E,WAAWI,KAAK2D,MAAMzI,EAAKK,UAAUyE,KAAK2D,MAAMzI,EAAKoE,YAAYU,KAAK2D,MAAMzI,EAAKG,SACtJ,GCxUKmB,EAAkB,CACvBxR,QAAQ,EACR4Y,SAAU,IACVC,UAAW,IACX9B,SAAU,EACVnF,OAAO,GAGFkH,EAAsB,CAC3BC,EAAG,YACH1K,EAAG,YACHqB,EAAG,YACHsJ,EAAG,YACHC,GAAI,cACJC,GAAI,cACJC,GAAI,cACJC,GAAI,eAoaL,EAjaA,MACChZ,WAAAA,CAAYyR,EAAcC,EAAetM,EAAU,CAAC,GACnD3F,KAAKkS,cAAgBF,EACrBhS,KAAKmS,eAAiBF,EACtBjS,KAAKwZ,gBAAkBxZ,KAAKmS,eAAiBnS,KAAKmS,eAAe5K,cAAc,qBAAuB,KACtGvH,KAAKoS,SAAWpS,KAAKqS,kBAAkB1M,GACvC3F,KAAKsS,WAAa,KAClBtS,KAAKyZ,WAAa,GAClBzZ,KAAKyS,QAAU,EACfzS,KAAK0S,QAAU,EACf1S,KAAK2S,UAAY,EACjB3S,KAAK4S,UAAY,EACjB5S,KAAK0Z,YAAc,EACnB1Z,KAAK2Z,aAAe,EACpB3Z,KAAK4Z,WAAa,EAClB5Z,KAAK6Z,UAAY,EACjB7Z,KAAK8Z,YAAc,EACnB9Z,KAAK+Z,aAAe,EACpB/Z,KAAKiT,YAAa,EAClBjT,KAAKga,UAAY,KACjBha,KAAKia,aAAe,KACpBja,KAAKka,eAAiB,KACtBla,KAAKsT,eAAiB,GACtBtT,KAAKuT,cAAgB,KACrBvT,KAAKma,kBAAoB,GACzBna,KAAKoa,mBAAqB,GAC1Bpa,KAAKqa,uBAAyB,GAC9Bra,KAAKsa,mBAAqB,GAC1Bta,KAAKua,kBAAoB,GACzBva,KAAKmT,oBAAsB,GAC3BnT,KAAKoT,oBAAsB,GAC3BpT,KAAKwa,uBAAyB,GAC9Bxa,KAAKya,0BAA4B,GACjCza,KAAK0a,yBAA2B,GAEhC1a,KAAK0T,eAAiB1T,KAAK0T,eAAe/R,KAAK3B,MAC/CA,KAAKwT,eAAiBxT,KAAKwT,eAAe7R,KAAK3B,MAC/CA,KAAKyT,aAAezT,KAAKyT,aAAa9R,KAAK3B,MAC3CA,KAAK2a,gBAAkB3a,KAAK2a,gBAAgBhZ,KAAK3B,MACjDA,KAAK4a,qBAAuB5a,KAAK4a,qBAAqBjZ,KAAK3B,KAC5D,CAEA4T,UAAAA,CAAWjO,EAAU,CAAC,GACrB3F,KAAKoS,SAAWpS,KAAKqS,kBAAkB1M,EAAS3F,KAAKoS,UACrDpS,KAAK6T,qBACN,CAEA1T,MAAAA,GACMH,KAAKmS,iBAAkBnS,KAAKiT,aAEjCjT,KAAK6T,sBACL7T,KAAKkS,cAActC,iBAAiB,cAAe5P,KAAKwT,gBACxDxT,KAAKkS,cAActC,iBAAiB,cAAe5P,KAAK0T,gBACxD1T,KAAKkS,cAActC,iBAAiB,eAAgB5P,KAAK2a,iBACzD3a,KAAK6a,2BACL7a,KAAKiT,YAAa,EACnB,CAEAa,OAAAA,GACM9T,KAAKiT,aAEVjT,KAAKkS,cAAcR,oBAAoB,cAAe1R,KAAKwT,gBAC3DxT,KAAKkS,cAAcR,oBAAoB,cAAe1R,KAAK0T,gBAC3D1T,KAAKkS,cAAcR,oBAAoB,eAAgB1R,KAAK2a,iBAC5DtN,SAASqE,oBAAoB,cAAe1R,KAAKwT,gBACjDnG,SAASqE,oBAAoB,YAAa1R,KAAKyT,cAC/CpG,SAASqE,oBAAoB,gBAAiB1R,KAAKyT,cACnDzT,KAAK8a,qBACL9a,KAAK+a,0BACL/a,KAAKsS,WAAa,KAClBtS,KAAKyZ,WAAa,GAClBzZ,KAAKmS,eAAe4B,MAAMiH,OAAS,UAC5Bhb,KAAKkS,cAAckC,QAAQ0mB,gBAClC96B,KAAKkU,wBACLlU,KAAKkb,uBACLlb,KAAKsU,qBAAoB,GACzBtU,KAAKiT,YAAa,EACnB,CAEAkI,cAAAA,GACC,GAAInb,KAAKkS,eAAgE,SAA/ClS,KAAKkS,cAAckC,QAAQymB,gBAA4B,OACjF,IAAK76B,KAAKwU,4BAA6B,OAEvC,MAAMnE,EAAOrQ,KAAKmS,eAAe7B,wBAC3B8K,EAAepb,KAAKmS,eAAeuC,aAAerE,EAAKoE,MACvD4G,EAAgBrb,KAAKmS,eAAewC,cAAgBtE,EAAKG,OACzD8K,EAAmBzG,OAAOC,WAAW9U,KAAKmS,eAAe4B,MAAMgB,MAC/DwG,EAAkB1G,OAAOC,WAAW9U,KAAKmS,eAAe4B,MAAMrD,KAC9DkE,EAAcC,OAAOI,SAASqG,GAAoBA,EAAmBjL,EAAK0E,KAC1EC,EAAaH,OAAOI,SAASsG,GAAmBA,EAAkBlL,EAAKK,IACvE8K,EAAWnG,OAAOC,WAClBmG,EAAYpG,OAAOG,YACnBf,EAAQU,KAAKC,IAAIpV,KAAKoS,SAAS2G,SAAU5D,KAAKO,IAAI0F,EAAcI,IAChEhL,EAAS2E,KAAKC,IAAIpV,KAAKoS,SAAS4G,UAAW7D,KAAKO,IAAI2F,EAAeI,IACnEvG,EAAUC,KAAKC,IAAI,EAAGC,OAAOC,WAAab,GAC1Cc,EAASJ,KAAKC,IAAI,EAAGC,OAAOG,YAAchF,GAC1CuE,EAAOI,KAAKO,IAAIR,EAASC,KAAKC,IAAI,EAAGR,IACrClE,EAAMyE,KAAKO,IAAIH,EAAQJ,KAAKC,IAAI,EAAGJ,IAErCG,KAAKuG,IAAIN,EAAe3G,GAAS,KACpCzU,KAAKmS,eAAe4B,MAAMU,MAAQ,GAAGA,OAGlCU,KAAKuG,IAAIL,EAAgB7K,GAAU,KACtCxQ,KAAKmS,eAAe4B,MAAMvD,OAAS,GAAGA,OAGvCxQ,KAAKmS,eAAe4B,MAAMgB,KAAO,GAAGA,MACpC/U,KAAKmS,eAAe4B,MAAMrD,IAAM,GAAGA,MACnC1Q,KAAK4V,oBAEN,CAEAlC,cAAAA,CAAepG,GACd,GAAqB,IAAjBA,EAAMhG,OAAc,OACxB,GAAIgG,EAAMqO,iBAAkB,OAE5B,MAAMC,EAAY5b,KAAK6b,yBAAyBvO,GAChD,IAAKsO,EAAW,OAEhBtO,EAAME,iBACNxN,KAAKsS,WAAahF,EAAM0I,UACxBhW,KAAKyZ,WAAamC,EAElB,MAAMvL,EAAOrQ,KAAKmS,eAAe7B,wBACjCtQ,KAAK8b,qBACL9b,KAAKwW,iBAAiBnG,GACtBrQ,KAAKyS,QAAUnF,EAAM2I,QACrBjW,KAAK0S,QAAUpF,EAAMmD,QACrBzQ,KAAK2S,UAAYrF,EAAM2I,QACvBjW,KAAK4S,UAAYtF,EAAMmD,QACvBzQ,KAAK0Z,YAAcrJ,EAAKoE,MACxBzU,KAAK2Z,aAAetJ,EAAKG,OACzBxQ,KAAK4Z,WAAavJ,EAAK0E,KACvB/U,KAAK6Z,UAAYxJ,EAAKK,IACtB1Q,KAAK8Z,YAAczJ,EAAK0L,MACxB/b,KAAK+Z,aAAe1J,EAAK4H,OACzBjY,KAAKkW,sBACLlW,KAAKkS,cAAckC,QAAQ0mB,gBAAkB,OAC7C96B,KAAKsU,qBAAoB,GACzBtU,KAAK4V,qBAELvI,SAASuC,iBAAiB,cAAe5P,KAAKwT,gBAC9CnG,SAASuC,iBAAiB,YAAa5P,KAAKyT,cAC5CpG,SAASuC,iBAAiB,gBAAiB5P,KAAKyT,aACjD,CAEAD,cAAAA,CAAelG,GACd,GAAwB,OAApBtN,KAAKsS,WAMLhF,EAAM0I,YAAchW,KAAKsS,aAE7BtS,KAAK2S,UAAYrF,EAAM2I,QACvBjW,KAAK4S,UAAYtF,EAAMmD,QACK,OAAxBzQ,KAAKka,iBACTla,KAAKka,eAAiB7E,OAAOpF,sBAAsBjQ,KAAK4a,4BAXxD,CACC,MAAMgB,EAAY5b,KAAK6b,yBAAyBvO,GAChDtN,KAAKmS,eAAe4B,MAAMiH,OAASY,EAAY3C,EAAoB2C,GAAa,EAEjF,CAQD,CAEAhB,oBAAAA,GAEC,GADA5a,KAAKka,eAAiB,KACE,OAApBla,KAAKsS,WAAqB,OAE9B,MAAM8D,EAASpW,KAAK2S,UAAY3S,KAAKyS,QAC/B4D,EAASrW,KAAK4S,UAAY5S,KAAK0S,QACrC,IAAI+B,EAAQzU,KAAK0Z,YACblJ,EAASxQ,KAAK2Z,aACd5E,EAAO/U,KAAK4Z,WACZlJ,EAAM1Q,KAAK6Z,UAEf,GAAI7Z,KAAKyZ,WAAW/N,SAAS,KAAM,CAClC,MAAM8P,EAAWrG,KAAKC,IAAIpV,KAAKoS,SAAS2G,SAAU1D,OAAOC,WAAatV,KAAK4Z,YAC3EnF,EAAQU,KAAKO,IAAI8F,EAAUrG,KAAKC,IAAIpV,KAAKoS,SAAS2G,SAAU/Y,KAAK0Z,YAActD,GAChF,CAEA,GAAIpW,KAAKyZ,WAAW/N,SAAS,KAAM,CAClC,MAAM+P,EAAYtG,KAAKC,IAAIpV,KAAKoS,SAAS4G,UAAW3D,OAAOG,YAAcxV,KAAK6Z,WAC9ErJ,EAAS2E,KAAKO,IAAI+F,EAAWtG,KAAKC,IAAIpV,KAAKoS,SAAS4G,UAAWhZ,KAAK2Z,aAAetD,GACpF,CAEA,GAAIrW,KAAKyZ,WAAW/N,SAAS,KAAM,CAClC,MAAMwJ,EAAUlV,KAAK8Z,YAAc9Z,KAAKoS,SAAS2G,SACjDhE,EAAOI,KAAKO,IAAIR,EAASC,KAAKC,IAAI,EAAGpV,KAAK4Z,WAAaxD,IACvD3B,EAAQzU,KAAK8Z,YAAc/E,CAC5B,CAEA,GAAI/U,KAAKyZ,WAAW/N,SAAS,KAAM,CAClC,MAAM6J,EAASvV,KAAK+Z,aAAe/Z,KAAKoS,SAAS4G,UACjDtI,EAAMyE,KAAKO,IAAIH,EAAQJ,KAAKC,IAAI,EAAGpV,KAAK6Z,UAAYxD,IACpD7F,EAASxQ,KAAK+Z,aAAerJ,CAC9B,CAEA1Q,KAAKmS,eAAe4B,MAAMgB,KAAO,GAAGA,MACpC/U,KAAKmS,eAAe4B,MAAMrD,IAAM,GAAGA,MACnC1Q,KAAKmS,eAAe4B,MAAMU,MAAQ,GAAGA,MACrCzU,KAAKmS,eAAe4B,MAAMvD,OAAS,GAAGA,MACtCxQ,KAAK4V,oBAEN,CAEAnC,YAAAA,CAAanG,GACRA,EAAM0I,YAAchW,KAAKsS,aAE7BjF,SAASqE,oBAAoB,cAAe1R,KAAKwT,gBACjDnG,SAASqE,oBAAoB,YAAa1R,KAAKyT,cAC/CpG,SAASqE,oBAAoB,gBAAiB1R,KAAKyT,cACnDzT,KAAK8a,qBACL9a,KAAK4a,uBACL5a,KAAKsS,WAAa,KAClBtS,KAAKyZ,WAAa,UACXzZ,KAAKkS,cAAckC,QAAQ0mB,gBAClC96B,KAAKkU,wBACLlU,KAAKsU,oBAAoBtU,KAAKoS,SAASL,OACvC/R,KAAK4V,qBACN,CAEA+E,eAAAA,GACyB,OAApB3a,KAAKsS,aACTtS,KAAKmS,eAAe4B,MAAMiH,OAAS,GACpC,CAEAa,wBAAAA,CAAyBvO,GACxB,MAAM+C,EAAOrQ,KAAKmS,eAAe7B,wBAC3B0G,EAAU1J,EAAM2I,QAAU5F,EAAK0E,KAC/BkC,EAAU3J,EAAMmD,QAAUJ,EAAKK,IAC/BwG,EAAWlX,KAAKoS,SAAS8E,SAE/B,KADqBF,GAAW,GAAKA,GAAW3G,EAAKoE,OAASwC,GAAW,GAAKA,GAAW5G,EAAKG,QAC3E,MAAO,GAE1B,MAAM2G,EAAUF,GAAW,GAAKA,GAAWC,EACrCE,EAAaH,GAAW5G,EAAKG,QAAUyG,GAAW5G,EAAKG,OAAS0G,EAChEG,EAAWL,GAAW,GAAKA,GAAWE,EACtCI,EAAYN,GAAW3G,EAAKoE,OAASuC,GAAW3G,EAAKoE,MAAQyC,EAEnE,OAAIC,GAAWE,EAAiB,KAC5BF,GAAWG,EAAkB,KAC7BF,GAAcC,EAAiB,KAC/BD,GAAcE,EAAkB,KAChCH,EAAgB,IAChBC,EAAmB,IACnBC,EAAiB,IACjBC,EAAkB,IAEf,EACR,CAEAd,gBAAAA,CAAiBnG,GAChBrQ,KAAKmS,eAAe4B,MAAM6C,SAAW,QACrC5W,KAAKmS,eAAe4B,MAAM8C,OAAS,IACnC7W,KAAKmS,eAAe4B,MAAMgB,KAAO,GAAG1E,EAAK0E,SACzC/U,KAAKmS,eAAe4B,MAAMrD,IAAM,GAAGL,EAAKK,QACxC1Q,KAAKmS,eAAe4B,MAAMU,MAAQ,GAAGpE,EAAKoE,UAC1CzU,KAAKmS,eAAe4B,MAAMvD,OAAS,GAAGH,EAAKG,WAC3CxQ,KAAKmS,eAAe4B,MAAM+C,UAAY,MACvC,CAEAtC,yBAAAA,GACC,MAA8C,UAAvCxU,KAAKmS,eAAe4B,MAAM6C,UAAgE,SAAxC5W,KAAKmS,eAAe4B,MAAM+C,SACpF,CAEA+D,wBAAAA,GAC+B,oBAAnBmB,gBAAkChc,KAAKga,YAElDha,KAAKga,UAAY,IAAIgC,gBAAe,KACX,OAApBhc,KAAKsS,aACLtS,KAAKkS,eAAgE,SAA/ClS,KAAKkS,cAAckC,QAAQymB,iBAC3B,OAAtB76B,KAAKia,eAETja,KAAKia,aAAe5E,OAAOpF,uBAAsB,KAChDjQ,KAAKia,aAAe,KACpBja,KAAKmb,gBAAgB,KACpB,IAGHnb,KAAKga,UAAUiC,QAAQjc,KAAKmS,gBAC7B,CAEA4I,uBAAAA,GACK/a,KAAKga,YACRha,KAAKga,UAAUkC,aACflc,KAAKga,UAAY,MAGQ,OAAtBha,KAAKia,eACR5E,OAAO8G,qBAAqBnc,KAAKia,cACjCja,KAAKia,aAAe,KAEtB,CAEA6B,kBAAAA,GACC9b,KAAKma,kBAAoBna,KAAKmS,eAAe4B,MAAMyH,SACnDxb,KAAKoa,mBAAqBpa,KAAKmS,eAAe4B,MAAM0H,UACpDzb,KAAKqa,uBAAyBra,KAAKmS,eAAe4B,MAAM6D,cACxD5X,KAAKsa,mBAAqBta,KAAKmS,eAAe4B,MAAMiF,UACpDhZ,KAAKua,kBAAoBva,KAAKmS,eAAe4B,MAAMqI,SACnDpc,KAAKmT,oBAAsBnT,KAAKmS,eAAe4B,MAAMwD,WACrDvX,KAAKoT,oBAAsBpT,KAAKmS,eAAe4B,MAAMyD,WAErDxX,KAAKmS,eAAe4B,MAAMyH,SAAW,OACrCxb,KAAKmS,eAAe4B,MAAM0H,UAAY,OACtCzb,KAAKmS,eAAe4B,MAAM6D,cAAgB,OAC1C5X,KAAKmS,eAAe4B,MAAMiF,UAAY,GAAGhZ,KAAKoS,SAAS4G,cACvDhZ,KAAKmS,eAAe4B,MAAMqI,SAAW,SACrCpc,KAAKmS,eAAe4B,MAAMwD,WAAa,OACvCvX,KAAKmS,eAAe4B,MAAMyD,WAAa,2BAEnCxX,KAAKwZ,kBACRxZ,KAAKwa,uBAAyBxa,KAAKwZ,gBAAgBzF,MAAMvD,OACzDxQ,KAAKya,0BAA4Bza,KAAKwZ,gBAAgBzF,MAAM0H,UAC5Dzb,KAAK0a,yBAA2B1a,KAAKwZ,gBAAgBzF,MAAMqI,SAC3Dpc,KAAKwZ,gBAAgBzF,MAAMvD,OAAS,OACpCxQ,KAAKwZ,gBAAgBzF,MAAM0H,UAAY,OACvCzb,KAAKwZ,gBAAgBzF,MAAMqI,SAAW,OAExC,CAEAlB,oBAAAA,GACClb,KAAKmS,eAAe4B,MAAMyH,SAAWxb,KAAKma,kBAC1Cna,KAAKmS,eAAe4B,MAAM0H,UAAYzb,KAAKoa,mBAC3Cpa,KAAKmS,eAAe4B,MAAM6D,cAAgB5X,KAAKqa,uBAC/Cra,KAAKmS,eAAe4B,MAAMiF,UAAYhZ,KAAKsa,mBAC3Cta,KAAKmS,eAAe4B,MAAMqI,SAAWpc,KAAKua,kBAC1Cva,KAAKmS,eAAe4B,MAAMwD,WAAavX,KAAKmT,oBAC5CnT,KAAKmS,eAAe4B,MAAMyD,WAAaxX,KAAKoT,oBAExCpT,KAAKwZ,kBACRxZ,KAAKwZ,gBAAgBzF,MAAMvD,OAASxQ,KAAKwa,uBACzCxa,KAAKwZ,gBAAgBzF,MAAM0H,UAAYzb,KAAKya,0BAC5Cza,KAAKwZ,gBAAgBzF,MAAMqI,SAAWpc,KAAK0a,yBAE7C,CAEArI,iBAAAA,CAAkB1M,EAASkS,EAAOlG,GACjC,MAAMmG,EAAS,IAAID,KAASlS,GACtBoT,EAAWlE,OAAOiD,EAAOiB,UACzBC,EAAYnE,OAAOiD,EAAOkB,WAC1B9B,EAAWrC,OAAOiD,EAAOZ,UAE/B,MAAO,IACHY,EACHiB,SAAUlE,OAAOI,SAAS8D,IAAaA,EAAW,EAAIA,EAAWpH,EAAgBoH,SACjFC,UAAWnE,OAAOI,SAAS+D,IAAcA,EAAY,EAAIA,EAAYrH,EAAgBqH,UACrF9B,SAAUrC,OAAOI,SAASiC,IAAaA,EAAW,EAAIA,EAAWvF,EAAgBuF,SACjFnF,MAAOgG,QAAQD,EAAO/F,OAExB,CAEA+I,kBAAAA,GAC6B,OAAxB9a,KAAKka,iBACT7E,OAAO8G,qBAAqBnc,KAAKka,gBACjCla,KAAKka,eAAiB,KACvB,CAEAhE,mBAAAA,GACC,IAAKlW,KAAKmS,gBAAkBnS,KAAKsT,eAAelF,OAAQ,OAExD,MAAMqJ,EAAUzX,KAAKmS,eAAe3C,iBAAiB,UACrD,IAAK,MAAMkI,KAASD,EACnBzX,KAAKsT,eAAeqE,KAAK,CACxBnX,QAASkX,EACTE,cAAeF,EAAM3D,MAAM6D,gBAE5BF,EAAM3D,MAAM6D,cAAgB,MAE9B,CAEA1D,qBAAAA,GACC,GAAKlU,KAAKsT,eAAelF,OAAzB,CAEA,IAAK,MAAM0B,KAAQ9P,KAAKsT,eACvBxD,EAAKtP,QAAQuT,MAAM6D,cAAgB9H,EAAK8H,cAEzC5X,KAAKsT,eAAiB,EALiB,CAMxC,CAEAO,mBAAAA,GACM7T,KAAKoS,SAASL,OAKd/R,KAAKuT,gBACTvT,KAAKuT,cAAgBlG,SAAS2K,cAAc,OAC5ChY,KAAKuT,cAAcQ,MAAM6C,SAAW,WACpC5W,KAAKuT,cAAcQ,MAAMgB,KAAO,MAChC/U,KAAKuT,cAAcQ,MAAMkE,OAAS,MAClCjY,KAAKuT,cAAcQ,MAAMmE,OAAS,IAClClY,KAAKuT,cAAcQ,MAAMoE,QAAU,UACnCnY,KAAKuT,cAAcQ,MAAMqE,aAAe,MACxCpY,KAAKuT,cAAcQ,MAAMsE,WAAa,sBACtCrY,KAAKuT,cAAcQ,MAAMuE,MAAQ,OACjCtY,KAAKuT,cAAcQ,MAAMwE,SAAW,OACpCvY,KAAKuT,cAAcQ,MAAMyE,WAAa,MACtCxY,KAAKuT,cAAcQ,MAAM6D,cAAgB,OACzC5X,KAAKmS,eAAesG,OAAOzY,KAAKuT,gBAGjCvT,KAAKsU,qBAAoB,GACzBtU,KAAK4V,sBArBJ5V,KAAKsU,qBAAoB,EAsB3B,CAEAA,mBAAAA,CAAoBoE,GACd1Y,KAAKuT,gBACVvT,KAAKuT,cAAcQ,MAAM4E,QAAUD,EAAU,QAAU,OACxD,CAEA9C,kBAAAA,GACC,IAAK5V,KAAKuT,gBAAkBvT,KAAKoS,SAASL,MAAO,OAEjD,MAAM1B,EAAOrQ,KAAKmS,eAAe7B,wBACjCtQ,KAAKuT,cAAcsF,YAAc,KAAK1D,KAAK2D,MAAMzI,EAAKoE,YAAYU,KAAK2D,MAAMzI,EAAKG,aAAa2E,KAAK2D,MAAMzI,EAAK0E,WAAWI,KAAK2D,MAAMzI,EAAKK,MAC3I,GClaK7N,EAAW,WAIXk4B,EAAgB,kDAKhB1e,EAAkB,gBAClBC,EAAkB,OAElB0e,EAAoB,kBAEpBle,EAAmB,GAAGja,SACtBka,EAAmB,GAAGla,WACtBma,EAAmB,GAAGna,SACtBoa,EAAmB,GAAGpa,UACtBo4B,EAAmB,GAAGp4B,WACtBqa,EAAmB,GAAGra,WAEtBsa,EAAgC,mBAAmBta,IACnDq4B,EAAgC,iBAAiBr4B,IACjDua,EAAgC,SAASva,aACzCs4B,EAAgC,oBAAoBt4B,IACpDu4B,EAAgC,gBAAgBv4B,IAChDw4B,EAAgC,oBAAoBx4B,aACpDy4B,EAAgC,YAAYz4B,aAElD,MAAM04B,UAAgBhd,EAAAA,EACrBhe,WAAAA,CAAYC,EAASuC,EAAS,CAAC,GAC9Byb,MAAMhe,EAASuC,GAEf/C,KAAKye,qBAAuB,CAC3BN,KAAM,CACLhe,QAAQ,EACRyR,SAAU,oBACVC,UAAW,EACXC,eAAgB,EAChBC,OAAO,GAERqM,OAAQ,CACPje,QAAQ,EACR+W,SAAU,EACV6B,SAAU,IACVC,UAAW,IACXjH,OAAO,IAIT/R,KAAKa,QAAUb,KAAK8C,WAAWtC,GAASM,EAAAA,EAAAA,IAAgB,CACvD06B,UAAU,EACVC,YAAY,EACZC,OAAO,EACP1d,UAAU,EACV2d,OAAQ,GACRC,MAAM,EACNC,UAAU,EACVC,SAAS,EACT1d,OAAQ,CACPje,QAAQ,EACR+W,SAAU,EACV6B,SAAU,IACVC,UAAW,IACXjH,OAAO,GAER6G,MAAO,CACNzY,QAAQ,EACRM,IAAK,IAEN0d,KAAM,CACLhe,QAAQ,EACRyR,SAAU,oBACVC,UAAW,EACXC,eAAgB,EAChBC,OAAO,GAERgqB,MAAO,CACNtnB,MAAO,GACPjE,OAAQ,IAET7M,KAAM,CACLS,MAAO,GACPE,OAAQ,GACRD,OAAQ,MACRE,QAAQ,EACRQ,MAAM,EACNP,QAAQ,GAET6Z,UAAW,CACVle,QAAQ,EACRC,GAAI,kBACJC,IAAK,mBACLwd,MAAO,IACPvd,SAAU,KAEX+xB,QAAS,CACR2J,QAAS,WACTC,OAAQ,kBACR7b,QAAS,mBACTE,OAAQ,kBACR4b,MAAO,iBACPp1B,KAAM,gBACNgnB,OAAQ,oBAEP/qB,IAEH/C,KAAKm8B,QAAU,KACfn8B,KAAKo8B,QAAU75B,EAAAA,EAAUC,KAvGH,mBAuGyBxC,KAAKW,UACpDX,KAAKq8B,SAAW95B,EAAAA,EAAUC,KAAK,oBAAqBxC,KAAKo8B,SACzDp8B,KAAK2gB,UAAW,EAChB3gB,KAAKs8B,kBAAmB,EACxBt8B,KAAKu8B,WAAa,IAAIjC,EACtBt6B,KAAK0e,aAAe,IAAI8d,EAAYx8B,KAAKW,SAAUX,KAAKo8B,SACxDp8B,KAAK4e,eAAiB,IAAI6d,EAAcz8B,KAAKW,SAAUX,KAAKo8B,SAC5Dp8B,KAAK8e,mBAAqB9e,KAAK+e,4BAC/B/e,KAAK0e,aAAa9K,WAAW5T,KAAK8e,mBAAmBX,MACrDne,KAAK4e,eAAehL,WAAW5T,KAAK8e,mBAAmBV,QAEvDpe,KAAKif,qBACLjf,KAAKmH,kBAELnH,KAAKa,QAAQwd,UAAUR,MAAS7d,KAAKa,QAAQwd,UAAUle,OAAaH,KAAKa,QAAQwd,UAAUR,MAA3B,EAChE7d,KAAK6H,WAAW7H,KAAKW,SAAU46B,EAAQ14B,SAAU7C,KAAKa,QAAQwd,WAC1Dre,KAAKa,QAAQ46B,WAChBz7B,KAAKW,SAAS+O,aAAa,qBAAsB,QAEjD1P,KAAKW,SAASwxB,gBAAgB,qBAEhC,CAEA,eAAW7pB,GACV,MArIW,OAsIZ,CAEA,mBAAWzF,GACV,OAAOA,CACR,CAEA,WAAOqF,CAAK1H,EAASuC,EAAQQ,GAC5Bg4B,EAAQjc,MAAM9e,EAASuC,EAAQQ,EAChC,CAEA,YAAO+b,CAAM9N,EAAIzO,EAAQQ,GACxB,GAAkB,iBAAPiO,EAAiB,OAE5B,IAAI7Q,EAAW0M,SAAS2K,cAAc,OACtCrX,EAASQ,UAAUC,IAAI,YACvBT,EAASQ,UAAUC,IAAI,QACvBT,EAAS6Q,GAAKA,EAEd,IAAIyqB,EAAS5uB,SAAS2K,cAAc,OACpCikB,EAAO96B,UAAUC,IAAI,mBAEjB,aAAc2B,GAAUA,EAAO84B,UAClCI,EAAO96B,UAAUC,IAAI,4BAGtB,IAAIgf,EAAU/S,SAAS2K,cAAc,OAGrC,GAFAoI,EAAQjf,UAAUC,IAAI,oBAElB,YAAa2B,GAAUA,EAAO+4B,QAAS,CAC1C,IAAIY,EAAWrvB,SAAS2K,cAAc,UACtC2P,EAAAA,EAAY/kB,IAAI85B,EAAU,OAAQ,UAClC/U,EAAAA,EAAY/kB,IAAI85B,EAAU,kBAAmB,SAC7C/U,EAAAA,EAAY/kB,IAAI85B,EAAU,iBAAkB,IAAMlrB,GAClDmW,EAAAA,EAAY/kB,IAAI85B,EAAU,aAAc,SACxCA,EAASv7B,UAAUC,IAAI,gBAEvBgf,EAAQ3H,OAAOikB,EAChB,CAEA,IAAI51B,EAAOuG,SAAS2K,cAAc,OAClClR,EAAK3F,UAAUC,IAAI,iBAEnBgf,EAAQ3H,OAAO3R,GACfm1B,EAAOxjB,OAAO2H,GACdzf,EAAS8X,OAAOwjB,GAEhB5uB,SAASvG,KAAK2R,OAAO9X,GAErB,MAAMg8B,EAAQpB,EAAQxzB,oBAAoBpH,EAAUoC,GAepD,MAdI,cAAeA,GAClB45B,EAAM90B,WAAWlH,EAAU46B,EAAQ14B,SAAUE,EAAOsb,WAGjD,UAAWse,EAAM97B,SAAW87B,EAAM97B,QAAQk7B,MAAMtnB,OACnD9T,EAASoT,MAAMimB,YAAY,mBAAoB2C,EAAM97B,QAAQk7B,MAAMtnB,OAGhE,UAAWkoB,EAAM97B,SAAW87B,EAAM97B,QAAQk7B,MAAMvrB,SACnDyrB,EAAOloB,MAAMvD,OAASmsB,EAAM97B,QAAQk7B,MAAMvrB,SAG3CvL,EAAAA,EAAAA,IAAQ1B,EAAU,CAACo5B,IAEZA,CACR,CAEAlc,MAAAA,CAAOC,GACN,OAAQ1gB,KAAK2gB,SAAsC3gB,KAAK4gB,OAAhC5gB,KAAKwgB,KAAKE,EACnC,CAEAF,IAAAA,CAAKE,GACJ,KAAIjT,EAAAA,EAAAA,IAAWzN,KAAKW,UAApB,CAEA,GAAIX,KAAKa,QAAQ8C,KAAKS,OAASpE,KAAKa,QAAQ8C,KAAKW,SAAWtE,KAAKa,QAAQ8C,KAAKoB,KAAM,CACnF,MAAM63B,EAAoBr6B,EAAAA,EAAUC,KAAKxC,KAAKa,QAAQ8C,KAAKW,OAAQtE,KAAKW,UACpEi8B,IAAmBA,EAAkB94B,UAAY,GACtD,CAEkBtC,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUqc,EAAgB,CAAE0D,kBAC1D/E,mBAEd3b,KAAK2gB,UAAW,EAChB3gB,KAAKs8B,kBAAmB,EAEpBt8B,KAAKa,QAAQ+6B,OAChBvmB,OAAOwnB,QAAQC,UAAU,KAAM,kBAAmB,IAAM98B,KAAKW,SAAS6Q,IAEtEhQ,EAAAA,EAAaC,GAAG4T,OAAQimB,GAA6B,KACpDt7B,KAAK4gB,MAAM,KAIb5gB,KAAKu8B,WAAW3b,OAEhBvT,SAASvG,KAAK3F,UAAUC,IAAIib,GAE5Brc,KAAK+8B,kBAAkBrc,GACvB1gB,KAAKg9B,gBAEDh9B,KAAKa,QAAQ26B,SAChBpB,EAAS5Z,MAAK,KACb,MAAMgb,EAAWj5B,EAAAA,EAAUC,KAAK,gBAC5Bg5B,GACHh6B,EAAAA,EAAa8hB,IAAIkY,EAAU,yBAAyB,KACnDx7B,KAAK4gB,MAAM,IAIb5gB,KAAKi9B,aAAavc,EAAc,IAKlC1gB,KAAKi9B,aAAavc,GA1CmB,CA2CtC,CAEAE,IAAAA,CAAKsc,EAAe,GAAIC,GAAkB,GACpCn9B,KAAK2gB,WAAY3gB,KAAKs8B,mBAET96B,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUmc,GACxCnB,mBAEd3b,KAAK2gB,UAAW,EAChB3gB,KAAKs8B,kBAAmB,EAExB/2B,YAAW,KACVvF,KAAKW,SAASQ,UAAUG,OAAOgb,GAC/Btc,KAAKyH,gBAAe,IAAMzH,KAAKo9B,WAAWF,EAAcC,IAAkBn9B,KAAKW,SAAUX,KAAKq9B,kBAAkB,GAC9Gr9B,KAAKa,QAAQwd,UAAUR,QAC3B,CAEAuf,UAAAA,CAAWF,EAAcC,GACxB,IAAKA,EAAiB,CASrB,GARAn9B,KAAKs9B,wBACLt9B,KAAK+gB,8BACL/gB,KAAKW,SAASoT,MAAM4E,QAAU,OAC9B3Y,KAAKW,SAASwxB,gBAAgB,cAC9BnyB,KAAKW,SAASwxB,gBAAgB,QAC9BnyB,KAAKs8B,kBAAmB,EAEI/5B,EAAAA,EAAUqf,QAAQmZ,GAAe94B,QAAO06B,GAASA,IAAU38B,KAAKW,WACpEyN,QAAU8uB,EAAa9uB,OAE9C,YADA5M,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUoc,GAUrC,GANA1P,SAASvG,KAAK3F,UAAUG,OAAO+a,GAE3Brc,KAAKa,QAAQ+6B,MAChBiB,QAAQC,UAAU,GAAIzvB,SAAS6uB,MAAO7mB,OAAOqO,SAAS6Z,SAAWloB,OAAOqO,SAAS8Z,SAG7Ex9B,KAAKa,QAAQ26B,SAKjB,OAJAx7B,KAAKy9B,oBACLz9B,KAAKu8B,WAAW9C,aAEhBj4B,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUoc,GAIrCqd,EAASxZ,MAAK,KACb5gB,KAAKy9B,oBACLz9B,KAAKu8B,WAAW9C,QAEhBj4B,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUoc,EAAiB,GAEvD,CACD,CAEAkgB,YAAAA,CAAavc,GACPrT,SAASvG,KAAKzF,SAASrB,KAAKW,WAChC0M,SAASvG,KAAK2R,OAAOzY,KAAKW,UAG3BX,KAAKW,SAASoT,MAAM4E,QAAU,QAC9B3Y,KAAKW,SAAS+O,aAAa,cAAc,GACzC1P,KAAKW,SAAS+O,aAAa,OAAQ,UACnC1P,KAAKW,SAAS+8B,UAAY,EAE1B,MAAMC,EAAYp7B,EAAAA,EAAUC,KAlTF,iBAkT4BxC,KAAKo8B,SACvDuB,IACHA,EAAUD,UAAY,IAGvB/H,EAAAA,EAAAA,IAAO31B,KAAKW,UAEZX,KAAKW,SAASQ,UAAUC,IAAIkb,GAC5Btc,KAAKohB,6BAkBLphB,KAAKyH,gBAhBsBm2B,KAC1B59B,KAAKs8B,kBAAmB,EACxB96B,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUsc,EAAiB,CACpDyD,kBAED1gB,KAAKqhB,yBAELrhB,KAAKa,QAAUb,KAAK8C,WAAW4d,EAAe1gB,KAAKa,SACnDb,KAAK69B,2BACL79B,KAAKqhB,yBACLrhB,KAAKsD,QAAO,CAACwB,EAAQD,KACpBrD,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUuc,EAAkB,CAAC+D,MAAOnc,EAAQD,KAAMA,EAAM6b,cAAeA,IACjG1gB,KAAKqhB,wBAAwB,GAC5B,GAGqCrhB,KAAKo8B,QAASp8B,KAAKq9B,kBAC5D,CAEAS,wBAAAA,GACC99B,KAAK0e,aAAa9K,WAAW5T,KAAK8e,mBAAmBX,MACrDne,KAAK4e,eAAehL,WAAW5T,KAAK8e,mBAAmBV,OACxD,CACAgD,0BAAAA,GACCphB,KAAK8e,mBAAqB9e,KAAK+e,4BAC/B/e,KAAK89B,2BAED99B,KAAK8e,mBAAmBX,KAAKhe,OAChCH,KAAK0e,aAAave,SAElBH,KAAK0e,aAAa5K,UAGf9T,KAAK8e,mBAAmBV,OAAOje,OAClCH,KAAK4e,eAAeze,SAEpBH,KAAK4e,eAAe9K,SAEtB,CAEAiN,2BAAAA,GACC/gB,KAAK0e,aAAa5K,UAClB9T,KAAK4e,eAAe9K,SACrB,CAEAuN,sBAAAA,GACKrhB,KAAK8e,mBAAmBV,OAAOje,QAClCH,KAAK4e,eAAezD,iBAGjBnb,KAAK8e,mBAAmBX,KAAKhe,QAChCH,KAAK0e,aAAanK,cAEpB,CAEAwK,yBAAAA,GACC,MAAO,CACNZ,KAAMne,KAAK0iB,4BAA4B1iB,KAAKa,QAAQsd,KAAMne,KAAKye,qBAAqBN,MACpFC,OAAQpe,KAAK0iB,4BAA4B1iB,KAAKa,QAAQud,OAAQpe,KAAKye,qBAAqBL,QAE1F,CAEAsE,2BAAAA,CAA4BC,EAAaC,GACxC,GAA2B,kBAAhBD,EACV,MAAO,IAAIC,EAAUziB,OAAQwiB,GAG9B,GAAIA,GAAsC,iBAAhBA,EAA0B,CACnD,MAAME,EAAYzf,OAAO+E,UAAUhE,eAAeiE,KAAKua,EAAa,UACpE,MAAO,IACHC,KACAD,EACHxiB,QAAQ0iB,GAAY9K,QAAQ4K,EAAYxiB,QAE1C,CAEA,MAAO,IAAIyiB,EACZ,CAEAmb,eAAAA,GACC,OAAO/9B,KAAKg+B,sBAAsBh+B,KAAKa,QAAQ+X,MAChD,CAEAolB,qBAAAA,CAAsBrb,EAAaC,EAAW,CAAEziB,QAAQ,EAAMM,IAAK,KAClE,GAA2B,kBAAhBkiB,EACV,MAAO,IAAIC,EAAUziB,OAAQwiB,GAG9B,GAAIA,GAAsC,iBAAhBA,EAA0B,CACnD,MAAME,EAAYzf,OAAO+E,UAAUhE,eAAeiE,KAAKua,EAAa,UAC9DliB,EAAiC,iBAApBkiB,EAAYliB,IAAmBkiB,EAAYliB,IAAIgG,OAAS,GAC3E,MAAO,IACHmc,KACAD,EACHliB,MACAN,QAAQ0iB,GAAY9K,QAAQ4K,EAAYxiB,QAE1C,CAEA,MAAO,IAAIyiB,EACZ,CAEAqb,mBAAAA,CAAoBC,EAAcl+B,KAAK+9B,mBACtC,OAAKG,EAAY/9B,OAEc,iBAApB+9B,EAAYz9B,KAAoBy9B,EAAYz9B,IAAIgG,OACnDy3B,EAAYz9B,IAAIgG,OAGnBzG,KAAKW,UAAaX,KAAKW,SAAS6Q,GAE9B,kBAAkB6D,OAAOqO,SAAS6Z,YAAYv9B,KAAKW,SAAS6Q,KAFnB,GANhB,EASjC,CAEA2sB,wBAAAA,GACC,MAAMC,EAAcp+B,KAAKo8B,QAAUp8B,KAAKo8B,QAAQroB,MAAQ,KAClDsqB,EAAiBr+B,KAAKq8B,UAAY95B,EAAAA,EAAUC,KAAK,oBAAqBxC,KAAKo8B,SAC3EkC,EAAeD,EAAiBA,EAAetqB,MAAQ,KAE7D,MAAO,CACNkoB,OAAQmC,EAAc,CACrBxnB,SAAUwnB,EAAYxnB,SACtBC,OAAQunB,EAAYvnB,OACpB9B,KAAMqpB,EAAYrpB,KAClBrE,IAAK0tB,EAAY1tB,IACjB+D,MAAO2pB,EAAY3pB,MACnBjE,OAAQ4tB,EAAY5tB,OACpBsG,UAAWsnB,EAAYtnB,UACvB0E,SAAU4iB,EAAY5iB,SACtBC,UAAW2iB,EAAY3iB,UACvBzC,UAAWolB,EAAYplB,UACxBoD,SAAUgiB,EAAYhiB,SACtBxE,cAAewmB,EAAYxmB,cAC3BL,WAAY6mB,EAAY7mB,WACxBC,WAAY4mB,EAAY5mB,YACrB,CAAC,EACJ4I,QAASke,EAAe,CACvB9tB,OAAQ8tB,EAAa9tB,OACrBiL,UAAW6iB,EAAa7iB,UACxBW,SAAUkiB,EAAaliB,UACpB,CAAC,EAEP,CAEAmiB,sBAAAA,CAAuB3lB,GACtB,IAAKA,GAA0B,iBAAVA,EAAoB,OAEzC,MAAM4lB,EAAc5lB,EAAMqjB,QAAkC,iBAAjBrjB,EAAMqjB,OAAsBrjB,EAAMqjB,OAAS,CAAC,EACjFwC,EAAe7lB,EAAMwH,SAAoC,iBAAlBxH,EAAMwH,QAAuBxH,EAAMwH,QAAU,CAAC,EACvFpgB,KAAKo8B,SACRh5B,OAAOwgB,KAAK4a,GAAap8B,SAAQe,IAChCnD,KAAKo8B,QAAQroB,MAAM5Q,GAAgBq7B,EAAYr7B,IAAiB,EAAE,IAIpE,MAAMk7B,EAAiBr+B,KAAKq8B,UAAY95B,EAAAA,EAAUC,KAAK,oBAAqBxC,KAAKo8B,SAC7EiC,GACHj7B,OAAOwgB,KAAK6a,GAAcr8B,SAAQe,IACjCk7B,EAAetqB,MAAM5Q,GAAgBs7B,EAAat7B,IAAiB,EAAE,GAGxE,CAEAm6B,qBAAAA,GACC,MAAMY,EAAcl+B,KAAK+9B,kBACnBW,EAAa1+B,KAAKi+B,oBAAoBC,GAC5C,GAAKA,EAAY/9B,QAAWu+B,GAAgC,oBAAXrpB,QAA2BA,OAAOspB,aAEnF,IACCtpB,OAAOspB,aAAaC,QAAQF,EAAYza,KAAKC,UAAUlkB,KAAKm+B,4BAC7D,CAAE,MAAO/uB,GACT,CACD,CAEAyuB,wBAAAA,GACC,MAAMK,EAAcl+B,KAAK+9B,kBACnBW,EAAa1+B,KAAKi+B,oBAAoBC,GAC5C,IAAKA,EAAY/9B,SAAWu+B,GAAgC,oBAAXrpB,SAA2BA,OAAOspB,aAAc,OAAO,EAExG,IACC,MAAME,EAAWxpB,OAAOspB,aAAaG,QAAQJ,GAC7C,IAAKG,EAAU,OAAO,EAEtB,MAAME,EAAc9a,KAAK/c,MAAM23B,GAE/B,OADA7+B,KAAKu+B,uBAAuBQ,IACrB,CACR,CAAE,MAAO3vB,GACR,OAAO,CACR,CACD,CAEAiuB,eAAAA,GACC,OAAOr9B,KAAKW,SAASQ,UAAUE,SAvfT,OAwfvB,CAEA27B,aAAAA,GACC,MAAMgC,EAAqBh/B,KAAKW,SAASs+B,aAAe5xB,SAASulB,gBAAgB3Q,aAC3Eid,EAAiBl/B,KAAKu8B,WAAWpD,WACjCgG,EAAoBD,EAAiB,EAE3C,GAAIC,IAAsBH,EAAoB,CAC7C,MAAMpF,GAAW5C,EAAAA,EAAAA,MAAU,cAAgB,eAC3Ch3B,KAAKW,SAASoT,MAAM6lB,GAAY,GAAGsF,KACpC,CAEA,IAAKC,GAAqBH,EAAoB,CAC7C,MAAMpF,GAAW5C,EAAAA,EAAAA,MAAU,eAAiB,cAC5Ch3B,KAAKW,SAASoT,MAAM6lB,GAAY,GAAGsF,KACpC,CACD,CAEAzB,iBAAAA,GACCz9B,KAAKW,SAASoT,MAAMqrB,YAAc,GAClCp/B,KAAKW,SAASoT,MAAMsrB,aAAe,EACpC,CAEApgB,kBAAAA,GACCzd,EAAAA,EAAaC,GAAG4L,SAAU8P,GAA2B7P,IAzhBpC,WA0hBZA,EAAM7M,MAENT,KAAKa,QAAQmd,SAChBhe,KAAK4gB,OAIN5gB,KAAKs/B,6BAA4B,IAGlC99B,EAAAA,EAAaC,GAAG4T,OAAQ4lB,GAAkB,KACrCj7B,KAAK2gB,WAAa3gB,KAAKs8B,mBAC1Bt8B,KAAKg9B,gBACLh9B,KAAKqhB,yBACN,IAGD7f,EAAAA,EAAaC,GAAGzB,KAAKW,SAAUw6B,GAA6B7tB,IAC3D9L,EAAAA,EAAa8hB,IAAItjB,KAAKW,SAAUy6B,GAAyBmE,IACpDv/B,KAAKW,WAAa2M,EAAMhJ,QAAUtE,KAAKW,WAAa4+B,EAAOj7B,SAEjC,WAA1BtE,KAAKa,QAAQ26B,SAKbx7B,KAAKa,QAAQ26B,UAChBx7B,KAAK4gB,OALL5gB,KAAKs/B,6BAMN,GACC,GAEJ,CAEAA,0BAAAA,GAEC,GADkB99B,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUu6B,GACxCvf,iBAAkB,OAEhC,MAAMqjB,EAAqBh/B,KAAKW,SAASs+B,aAAe5xB,SAASulB,gBAAgB3Q,aAC3Eud,EAAmBx/B,KAAKW,SAASoT,MAAM0rB,UAEpB,WAArBD,GAAiCx/B,KAAKW,SAASQ,UAAUE,SAAS25B,KACjEgE,IAAoBh/B,KAAKW,SAASoT,MAAM0rB,UAAY,UAEzDz/B,KAAKW,SAASQ,UAAUC,IAAI45B,GAE5Bh7B,KAAKyH,gBAAe,KACnBzH,KAAKW,SAASQ,UAAUG,OAAO05B,GAC/Bh7B,KAAKyH,gBAAe,KACnBzH,KAAKW,SAASoT,MAAM0rB,UAAYD,CAAgB,GAC9Cx/B,KAAKo8B,QAAQ,GACdp8B,KAAKo8B,SACT,CAEAW,iBAAAA,CAAkBrc,GACjB1gB,KAAKa,QAAUb,KAAK8C,WAAW4d,EAAe1gB,KAAKa,SAE9Cb,KAAKa,QAAQ86B,OAAOvtB,QAEzBpO,KAAKa,QAAQ86B,OAAOv5B,SAAS0N,IAC5B,IAAI,KAAWA,IAAQ,KAAYA,EAAM,OAEzC,IAAI4vB,EAAWn9B,EAAAA,EAAUqf,QAAQ,SAAW9R,EAAKnE,KAAO,IAAK3L,KAAKW,UAClE,GAAK++B,EAAStxB,OAEd,IAAK,MAAMuxB,KAAOD,EACjB,OAAQC,EAAIpyB,SACX,IAAK,QAASoyB,EAAIz7B,MAAQ4L,EAAK5L,MAAO,MACtC,IAAK,OAAQy7B,EAAInU,OAAS1b,EAAK5L,MAAO,MACtC,IAAK,MAAOyjB,EAAAA,EAAY/kB,IAAI+8B,EAAK,MAAO7vB,EAAK5L,OAAQ,MACrD,QAASy7B,EAAI77B,UAAYgM,EAAK5L,MAEhC,GAEF,GAGDiJ,EAAAA,EAAAA,GAAeouB,GAMd/5B,EAAAA,EAAaC,GAAG4L,SAAU+P,EAvmBE,4BAumB8C,SAAU9P,GACnF,MAAMhJ,EAAS/B,EAAAA,EAAU8gB,uBAAuBrjB,MAE7C,CAAC,IAAK,QAAQ0L,SAAS1L,KAAKuN,UAAUD,EAAME,iBAE/ChM,EAAAA,EAAa8hB,IAAIhf,EAAQ0Y,GAAgB4iB,IACpCA,EAAUjkB,gBAAwB,IAGvC,MAAMkkB,EAAct9B,EAAAA,EAAUC,KAAKu4B,GACnC,GAAI8E,EAAa,CAChB,MAAMC,EAAsBvE,EAAQzzB,YAAY+3B,GAC5CC,IAAwBA,EAAoBj/B,QAAQ46B,YACvDqE,EAAoBlf,KAAK,CAACif,GAE5B,CAEatE,EAAQxzB,oBAAoBzD,GACpCmc,OAAOzgB,KACb,IAEDwB,EAAAA,EAAaC,GAAG4L,SAAUguB,GAA+B,WACxD,IAAI0E,EAAa1qB,OAAOqO,SAASkY,KAAK/Z,MAAM,GAC5C,GAAIke,EAAY,CACf,IAAIz7B,EAAS/B,EAAAA,EAAUC,KAAK,IAAMu9B,GAClC,GAAIz7B,GAAUA,EAAOnD,UAAUE,SAAS,YAAa,CACpD,IAAIoM,EAAAA,EAAAA,IAAWnJ,GACd,OAGYi3B,EAAQxzB,oBAAoBzD,GACpCmc,QACN,CACD,CACD,IAEA,UC/pBA,ghMCUMuf,EAAW,CAChBC,IAAIj7B,EAAAA,EAAAA,IAAc,CACjBk7B,SAAUC,EACVC,OAAQC,EACRC,QAASC,IAEVC,IAAIx7B,EAAAA,EAAAA,IAAc,CACjBk7B,SAAUO,EACVL,OAAQM,EACRJ,QAASK,KAOX,MAAMC,EAILrgC,WAAAA,CAAYsgC,EAAO,MAClB7gC,KAAK6gC,KAAOA,CACb,CAMA59B,GAAAA,GACC,OAAO+8B,EAAShgC,KAAK6gC,OAASb,EAAa,EAC5C,EAUD,SAASc,EAAYC,EAAW,KAAMlX,EAAMhqB,GAC3C,MACMgF,EADe,IAAI+7B,EAAKG,GACJ99B,MAC1B,OAAO4B,EAAKglB,KAAQhqB,IAAW,CAAC,CACjC,CAQA,SAASmhC,EAAYD,EAAUlhC,GAC9B,OAAOihC,EAAYC,EAAU,SAAUlhC,EACxC,CAQA,SAASohC,GAAcF,EAAUlhC,GAChC,OAAOihC,EAAYC,EAAU,WAAYlhC,EAC1C,CAQA,SAASqhC,GAAaH,EAAUlhC,GAC/B,OAAOihC,EAAYC,EAAU,UAAWlhC,EACzC,eCvEA,MAAMshC,GAAmB,WACnBC,GAAa,sBACbC,GAAc,uBAEd/4B,GAAO,QACPzF,GAAW,WAGjB,IAAIy+B,IAAc,EAElB,MAAMC,GACLhhC,WAAAA,CAAYwC,EAAS,CAAC,EAAG89B,EAAO,MAC/B7gC,KAAK6gC,KAAOA,EACZ7gC,KAAKwhC,eAAiB,CACrBC,OAAQ,CACPz1B,KAAM,QACN8vB,SAAS,GAEVn4B,KAAM,CACLS,MAAO,GACPE,OAAQ,GACRD,OAAQ,MACRE,QAAQ,EACRQ,MAAM,EACNP,QAAQ,GAETm4B,MAAO,CACNd,UAAU,EACVL,UAAU,EACVpf,UAAU,EACV4B,UAAU,EACV8d,SAAS,EACTzd,UAAW,CACVle,QAAQ,EACRC,GAAI,kBACJC,IAAK,mBACLwd,MAAO,IACPvd,SAAU,MAGZupB,KAAM,UACN5L,MAAO,SACPqiB,QAAS,CAAC,EACVnvB,QAAS,CAAC,GAEXnR,KAAK0hC,iBAAmB,CACvBpB,QAAS,CACRqB,MAAO,CACNnhC,QAAS,GACTypB,IAAK,SACLje,KAAM,SACNkd,KAAM,CAAC,EACPzI,OAAQ2gB,GACRz8B,MAAO,CAAC,OACR0a,KAAM6hB,GAAalhC,KAAK6gC,KAAMv4B,IAAa,OAE5Cs5B,OAAQ,CACPphC,QAAS,GACTypB,IAAK,SACLje,KAAM,SACNkd,KAAM,CAAC,EACPzI,OAAQ4gB,GACR18B,MAAO,CAAC,OACR0a,KAAM6hB,GAAalhC,KAAK6gC,KAAMv4B,IAAc,SAG9C6I,QAAS,CACR+qB,MAAO+E,GAAcjhC,KAAK6gC,KAAMv4B,IAAa,MAC7Cu5B,YAAaZ,GAAcjhC,KAAK6gC,KAAMv4B,IAAmB,aAE1DsD,MAAO,CACNc,QAAQrF,EAAAA,EAAAA,GAAO,UACfwF,SAASxF,EAAAA,EAAAA,GAAO,WAChBsF,SAAStF,EAAAA,EAAAA,GAAO,WAChByF,MAAMzF,EAAAA,EAAAA,GAAO,UAGfrH,KAAKa,QAAUb,KAAK8hC,WAAW/+B,EAChC,CAEA,WAAOqF,CAAKzC,EAAU,CAAC,EAAGk7B,EAAO,MAChC,MAAMkB,EAAU,IAAIR,GAAQ57B,EAASk7B,GAErC,GAAIS,GAAa,OAAOlb,QAAQC,OAAO,CAAE2b,UAAU,EAAOC,OAAQhB,GAAcc,EAAQlB,KAAMh+B,IAAUo/B,SACxGX,IAAc,EAEd,MAkBO9gC,QAASmyB,EAAS,OAAE8O,EAAM,KAAEz1B,GAlBdk2B,MACpB,GAAoC,YAAhCH,EAAQlhC,QAAQ4gC,OAAOz1B,KAAoB,CAC9C,MAAMm2B,EAAUJ,EAAQK,gBACxB,MAAO,CACN5hC,QAAS2hC,EAAQ3hC,QACjBihC,OAAQU,EAAQV,OAChBz1B,KAAM,UAER,CAAO,GAAoC,UAAhC+1B,EAAQlhC,QAAQ4gC,OAAOz1B,KAAkB,CACnD,MAAM2wB,EAAQoF,EAAQM,cACtB,MAAO,CACN7hC,QAASm8B,EAAMh8B,SACf8gC,OAAQ9E,EACR3wB,KAAM,QAER,GAG0Ck2B,GAE9B,UAATl2B,GACHy1B,EAAOjhB,OAGR,MAAM8hB,EAAW//B,EAAAA,EAAUC,KAAK,IAAI4+B,MAAezO,GAC7C4P,EAAYhgC,EAAAA,EAAUC,KAAK,IAAI6+B,MAAgB1O,GAErD,OAAO,IAAIvM,SAAQ,CAACuU,EAAStU,KAC5B,MAAMmc,EAAaA,CAACC,GAAS,KACf,UAATz2B,EAKS,YAATA,IACH2mB,EAAUrxB,SAENygC,EAAQlhC,QAAQ4gC,OAAO3F,SAAW2G,GACrChB,EAAO7gB,QARR6gB,EAAO7gB,MAUR,EAGK8hB,EAAe7yB,IACpBA,EAAErC,iBACFm1B,IACAhI,EAAQ,CACPqH,UAAU,EACVY,UAAW,IAAIC,OAEhBL,GAAY,EAGPM,EAAgBjzB,IACrBA,EAAErC,iBACFm1B,IACAtc,EAAO,CACN2b,UAAU,EACVY,UAAW,IAAIC,OAEhBL,GAAW,EAAM,EAGZO,EAAiBlzB,IACR,UAAVA,EAAEpP,KAAmB6hC,IACxBzyB,EAAErC,iBACFk1B,EAAY7yB,IAEC,WAAVA,EAAEpP,MACLoP,EAAErC,iBACFs1B,EAAajzB,GACd,EAGK8yB,EAAUA,KACfrB,IAAc,EACdj0B,SAASqE,oBAAoB,UAAWqxB,GACpCT,GAAUA,EAAS5wB,oBAAoB,QAASgxB,GAChDH,GAAWA,EAAU7wB,oBAAoB,QAASoxB,EAAa,EAGvC,YAAzBf,EAAQlhC,QAAQgpB,OACfyY,GAAUA,EAAS1yB,iBAAiB,QAAS8yB,GAC7CH,GAAWA,EAAU3yB,iBAAiB,QAASkzB,IAGvB,SAAzBf,EAAQlhC,QAAQgpB,MACf0Y,GAAWA,EAAU3yB,iBAAiB,QAASkzB,GAGpDz1B,SAASuC,iBAAiB,UAAWmzB,GAExB,UAAT/2B,GACH2mB,EAAU/iB,iBAAiB,iBAAiB,KAC3C+yB,IACAtc,EAAO,CACN2b,UAAU,EACVY,UAAW,IAAIC,MACd,GACA,CAAC99B,MAAM,IAGX4tB,EAAU+I,OAAO,GAEnB,CAEA,cAAOsH,CAAQC,EAAMt9B,EAAU,CAAC,GAC/B,IAAIk7B,EAAO,KAEP,SAAUl7B,IACbk7B,EAAOl7B,EAAQk7B,MAAQ,YAChBl7B,EAAQk7B,MAEhB,MAAMkB,EAAU,IAAIR,GAAQ57B,EAASk7B,GACR,YAAzBkB,EAAQlhC,QAAQgpB,MAEHqZ,GAAen7B,oBAAoBk7B,EAAMlB,EAAQlhC,SACzDqQ,IAAIqwB,GACd,CAEAO,UAAAA,CAAW/+B,GACV,MAAM+U,GAAShX,EAAAA,EAAAA,IAAgBd,KAAKwhC,eAAgBz+B,GAKpD,OAJA+U,EAAOwoB,SAAUx/B,EAAAA,EAAAA,IAAgBd,KAAK0hC,iBAAiBpB,QAASxoB,EAAOwoB,SACvExoB,EAAO3G,SAAUrQ,EAAAA,EAAAA,IAAgBd,KAAK0hC,iBAAiBvwB,QAAS2G,EAAO3G,SACvE2G,EAAO+H,KAAO7f,KAAK0hC,iBAAiB91B,MAAMkM,EAAOmG,OAE1CnG,CACR,CAEAuqB,WAAAA,GACC,MAAM7wB,EAAK,GAAG2vB,OAAoB1hB,EAAAA,EAAAA,QAElC,OAAO8b,EAAQjc,MAAM9N,EAAIxR,KAAKa,QAAQ87B,OAAQA,IAC7CA,EAAMh8B,SAASQ,UAAUC,IAAI,GAAG+/B,YACnB5+B,EAAAA,EAAUC,KAAK,iBAAkBm6B,EAAMh8B,UAC/C8X,OAAOzY,KAAKmjC,gBAAgB,GAEnC,CAEAA,aAAAA,GACC,MAAMzI,GAAOj2B,EAAAA,EAAAA,GAAK,OAElB,IAAIob,EAAO,KAEP7f,KAAKa,QAAQgf,OAChBA,EAAO6a,EAAKh2B,IACX,CAACC,MAAO,GAAGw8B,oBACXnhC,KAAKa,QAAQgf,KACb,CAAC0K,QAAQ,KAIX,MAAM+V,EAAUjzB,SAAS2K,cAAc,OAYvC,OAXAoa,EAAAA,EAAQhxB,IAAIk/B,EAAS,oBAEK,YAAtBtgC,KAAKa,QAAQgpB,OAChB7pB,KAAKojC,cAAc9C,EAAS,UAC5BtgC,KAAKojC,cAAc9C,EAAS,UAGH,SAAtBtgC,KAAKa,QAAQgpB,MAChB7pB,KAAKojC,cAAc9C,EAAS,UAGtB5F,EAAKh2B,IACX,CAACC,MAAO,GAAGw8B,cAA4BA,MAAoBnhC,KAAKa,QAAQod,SACxE,CACCyc,EAAKh2B,IACJ,CAACC,MAAO,GAAGw8B,cACX,CACCthB,EACA6a,EAAKh2B,IACJ,CAACC,MAAO,GAAGw8B,uBACX,CACCzG,EAAKh2B,IACJ,CAACC,MAAO,GAAGw8B,qBACXnhC,KAAKa,QAAQsQ,QAAQ+qB,OAEtBxB,EAAKh2B,IACJ,CAACC,MAAO,GAAGw8B,2BACXnhC,KAAKa,QAAQsQ,QAAQ0wB,iBAM1BvB,GAGH,CAEA8B,aAAAA,GAEC,MAAMiB,EAAgBrjC,KAAKa,QAAQ6f,cAAc/S,QAD1B,CAAC,YAAa,eACqC6V,KAAK,OAEzEmZ,EAAQpB,EAAQxzB,oBAAoBs7B,GACpC1Q,EAAYpwB,EAAAA,EAAUC,KAAK,oBAAqBm6B,EAAMh8B,WAAa0iC,EAEnElB,EAAU90B,SAAS2K,cAAc,OAOvC,OALAmqB,EAAQrf,UAAY,GAAGqe,aACvBgB,EAAQ1pB,OAAOzY,KAAKmjC,iBAEpBxQ,EAAUla,OAAO0pB,GAEV,CACN3hC,QAAS2hC,EACTV,OAAQ9E,EAEV,CAEAyG,aAAAA,CAAczQ,EAAWlyB,GACxB,MAAM6G,EAAStH,KAAKa,QAAQy/B,QAAQ7/B,GACpC,IAAK6G,GAAUA,EAAO9G,QAErB,YADAmyB,EAAUnrB,mBAAmB,YAAaF,GAAQ9G,SAAW,IAI9D,IAAK8G,EAAO2iB,IAAK,OAEjB,IAAIqZ,EAAM,KACTjR,EAAU,IAAI,IAAIthB,IAAIzJ,EAAO3C,QAAQ6e,KAAK,KAC1CsH,GAAQhqB,EAAAA,EAAAA,IAAgB,CACvB6D,MAAO0tB,GACL/qB,EAAO4hB,MAEQ,WAAf5hB,EAAO2iB,IACVqZ,GAAM7+B,EAAAA,EAAAA,GAAK,OAAO6C,OAAOA,EAAO+X,KAAM/X,EAAO0E,KAAM8e,GAC1B,MAAfxjB,EAAO2iB,MACjBqZ,GAAM7+B,EAAAA,EAAAA,GAAK,OAAOymB,EAAE,IAAK5jB,EAAO+X,KAAMyL,IAGlCwY,IAELA,EAAI5zB,aAAapI,EAAOmZ,OAAQ,QAChCkS,EAAUrI,YAAYgZ,GACvB,EAMD,MAAMC,GAAuB,oBAAoBj7B,OAC3C8U,GAA2B,SAASva,cACpCqa,GAAoB,GAAGra,YACvB2gC,GAAoB,GAAG3gC,YACvB4gC,GAAoB,GAAG5gC,YACvB6gC,GAAoB,GAAG7gC,aAE7B,MAAMqgC,WAAuB3kB,EAAAA,EAC5Bhe,WAAAA,CAAYC,EAASmF,EAAU,CAAC,GAC/B6Y,MAAMhe,GACNR,KAAKa,QAAUb,KAAK8C,WAAWtC,GAASM,EAAAA,EAAAA,IAAgB,CAAC,EAAG6E,GAC7D,CAEA,eAAW2C,GACV,OAAOA,EACR,CAEA,mBAAWzF,GACV,OAAOA,EACR,CAEAqO,GAAAA,CAAIyyB,GACuB,YAAtB3jC,KAAKa,QAAQgpB,OAEjB7pB,KAAKa,QAAQ6f,cAAgB1gB,KAAKW,SAElCgjC,EAAWv7B,KAAKpI,KAAKa,SACnBqlB,MAAMyU,GACDA,EAAQqH,SACRhiC,KAAKa,QAAQ8C,KAAKS,MAChBpE,KAAK4jC,QADyBjJ,EADPvU,QAAQC,OAAOsU,KAI7CzU,MAAMriB,IACNrC,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAU6iC,GAAkB,CAAEK,QAAShgC,GAAW,IAE5EyiB,OAAOlX,IACP5N,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAU8iC,GAAkB,CAAEI,QAASz0B,GAAQ,IAEzE00B,SAAQ,KACRtiC,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAU+iC,GAAmB,CAAEG,QAAS,WAAY,IAEjF,CAEAD,KAAAA,GACC,OAAO,IAAIxd,SAASuU,IACnB36B,KAAKsD,QAAO,CAACwB,EAAQD,KACpBrD,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUuc,GAAkB,CAAE+D,MAAOnc,EAAQD,SACvE81B,EAAQ,CAAE71B,SAAQD,QAAO,GACxB,GAEJ,EAIDrD,EAAAA,EAAaC,GAAG4L,SAAU+P,GAA0BmmB,IAAsB,SAAUj2B,GACnFA,EAAME,iBACN,MAAMlJ,EAASgJ,EAAMhJ,QAEhB6vB,EAAAA,EAAAA,IAAU7vB,KAAYvD,EAAAA,EAAAA,IAAUuD,IAErCi9B,GAAQyB,QAAQ1+B,EAAQ,CACvBg8B,QAAS,CACRqB,MAAO,CACNh9B,MAAO,CAAC,gBAETi9B,OAAQ,CACPj9B,MAAO,CAAC,0BAIZ,IAEA,MC7ZA,GD6ZA,GElXM9B,GAAW,cACXyZ,GAAkB,OAClBynB,GAAsB,cACtBC,GAAwB,gBAExBC,GAA6B,WAAWF,OAAwBA,KAGhER,GAAuB,8BAGvBzmB,GAAiB,GAAGja,UACpBka,GAAmB,GAAGla,YACtBma,GAAiB,GAAGna,UACpBoa,GAAkB,GAAGpa,WACrBqa,GAAmB,GAAGra,YAEtBua,GAA2B,SAASva,cAK1C,MAAMqhC,WAAmB3lB,EAAAA,EAMxBhe,WAAAA,CAAYC,EAASuC,EAAS,CAAC,GAC9Byb,MAAMhe,EAASuC,GAOf/C,KAAKa,QAAUb,KAAK8C,WAAWtC,GAASM,EAAAA,EAAAA,IAAgB,CACvD2f,QAAQ,EACR+S,OAAQ,KACR7vB,KAAM,CACLS,MAAO,GACPE,OAAQ,GACRD,OAAQ,MACRE,QAAQ,EACRQ,MAAM,EACNP,QAAQ,IAEPzB,IAOH/C,KAAKa,QAAQ2yB,QAASQ,EAAAA,EAAAA,IAAWh0B,KAAKa,QAAQ2yB,SAAW,KAOzDxzB,KAAKs8B,kBAAmB,EAOxBt8B,KAAKmkC,cAAgB,GAErB,MAAMC,EAAa7hC,EAAAA,EAAUqf,QAAQ2hB,IAErC,IAAK,MAAMN,KAAQmB,EAAY,CAC9B,MAAMxyB,EAAWrP,EAAAA,EAAUmL,uBAAuBu1B,GAC5CoB,EAAgB9hC,EAAAA,EAAUqf,QAAQhQ,GAAU3P,QAAOqiC,GAAgBA,IAAiBtkC,KAAKW,WAE9E,OAAbiR,GAAqByyB,EAAcj2B,QACtCpO,KAAKmkC,cAAcxsB,KAAKsrB,EAE1B,CAEAjjC,KAAKukC,sBAEAvkC,KAAKa,QAAQ2yB,QACjBxzB,KAAKwkC,0BAA0BxkC,KAAKmkC,cAAenkC,KAAK2gB,YAGrD3gB,KAAKa,QAAQ4f,QAChBzgB,KAAKygB,QAEP,CAOA,eAAWnY,GACV,MAnGW,UAoGZ,CAOA,mBAAWzF,GACV,OAAOA,EACR,CAOA4d,MAAAA,CAAOC,GACN,OAAQ1gB,KAAK2gB,WAAwC3gB,KAAK4gB,OAAhC5gB,KAAKwgB,KAAKE,EACrC,CASAF,IAAAA,GACC,GAAIxgB,KAAKs8B,kBAAoBt8B,KAAK2gB,WACjC,OAGD,IAAI8jB,EAAiB,GAQrB,GANIzkC,KAAKa,QAAQ2yB,SAChBiR,EAAiBzkC,KAAK0kC,uBA7HA,iDA8HpBziC,QAAOzB,GAAWA,IAAYR,KAAKW,WACnC2N,KAAI9N,GAAW0jC,GAAWn8B,oBAAoBvH,EAAS,CAAEigB,QAAQ,OAGhEgkB,EAAer2B,QAAUq2B,EAAe,GAAGnI,iBAC9C,OAID,GADmB96B,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUqc,IACxCrB,iBACd,OAGD,IAAK,MAAMgpB,KAAkBF,EAC5BE,EAAe/jB,OAGhB,MAAMgkB,EAAY5kC,KAAK6kC,gBAEvB7kC,KAAKW,SAASQ,UAAUG,OAAOyiC,IAC/B/jC,KAAKW,SAASQ,UAAUC,IAAI4iC,IAE5BhkC,KAAKW,SAASoT,MAAM6wB,GAAa,IAEjC5kC,KAAKwkC,0BAA0BxkC,KAAKmkC,eAAe,GACnDnkC,KAAKs8B,kBAAmB,EAExB,MAgBMwI,EAAa,SADUF,EAAU,GAAGl+B,cAAgBk+B,EAAU/iB,MAAM,KAG1E7hB,KAAKyH,gBAlBYs9B,KAChB/kC,KAAKs8B,kBAAmB,EAExBt8B,KAAKW,SAASQ,UAAUG,OAAO0iC,IAC/BhkC,KAAKW,SAASQ,UAAUC,IAAI2iC,GAAqBznB,IAEjDtc,KAAKW,SAASoT,MAAM6wB,GAAa,GAEjC5kC,KAAKsD,QAAO,CAACwB,EAAQD,KACpBrD,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUuc,GAAkB,CAAE+D,MAAOnc,EAAQD,QAAO,IAG/ErD,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUsc,GAAgB,GAMvBjd,KAAKW,UAAU,GAC7CX,KAAKW,SAASoT,MAAM6wB,GAAa,GAAG5kC,KAAKW,SAASmkC,MACnD,CAQAlkB,IAAAA,GACC,GAAI5gB,KAAKs8B,mBAAqBt8B,KAAK2gB,WAClC,OAID,GADmBnf,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUmc,IACxCnB,iBACd,OAGD,MAAMipB,EAAY5kC,KAAK6kC,gBAEvB7kC,KAAKW,SAASoT,MAAM6wB,GAAa,GAAG5kC,KAAKW,SAAS2P,wBAAwBs0B,QAE1EjP,EAAAA,EAAAA,IAAO31B,KAAKW,UAEZX,KAAKW,SAASQ,UAAUC,IAAI4iC,IAC5BhkC,KAAKW,SAASQ,UAAUG,OAAOyiC,GAAqBznB,IAEpD,IAAK,MAAM0E,KAAWhhB,KAAKmkC,cAAe,CACzC,MAAM3jC,EAAU+B,EAAAA,EAAU8gB,uBAAuBrC,GAE7CxgB,IAAYR,KAAK2gB,SAASngB,IAC7BR,KAAKwkC,0BAA0B,CAACxjB,IAAU,EAE5C,CAEAhhB,KAAKs8B,kBAAmB,EASxBt8B,KAAKW,SAASoT,MAAM6wB,GAAa,GAEjC5kC,KAAKyH,gBATYs9B,KAChB/kC,KAAKs8B,kBAAmB,EACxBt8B,KAAKW,SAASQ,UAAUG,OAAO0iC,IAC/BhkC,KAAKW,SAASQ,UAAUC,IAAI2iC,IAC5BviC,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUoc,GAAiB,GAKxB/c,KAAKW,UAAU,EAC9C,CAMA0B,OAAAA,GACCmc,MAAMnc,SACP,CAQAse,QAAAA,CAASngB,EAAUR,KAAKW,UACvB,OAAOH,EAAQW,UAAUE,SAASib,GACnC,CAQAkoB,yBAAAA,CAA0BQ,EAAcC,GACvC,GAAKD,EAAa52B,OAIlB,IAAK,MAAM5N,KAAWwkC,EACrBhlC,KAAKklC,mBAAmB1kC,EAASykC,EAEnC,CAMAV,mBAAAA,GACC,IAAKvkC,KAAKa,QAAQ2yB,OAAQ,OAE1B,MAAM2R,EAAWnlC,KAAK0kC,uBAAuBnB,IAE7C,IAAK,MAAM/iC,KAAW2kC,EAAU,CAC/B,MAAMC,EAAW7iC,EAAAA,EAAU8gB,uBAAuB7iB,GAE9C4kC,GACHplC,KAAKwkC,0BAA0B,CAAChkC,GAAUR,KAAK2gB,SAASykB,GAE1D,CACD,CAQAV,sBAAAA,CAAuB9yB,GACtB,MAAMuzB,EAAW5iC,EAAAA,EAAUqf,QAAQqiB,GAA4BjkC,KAAKa,QAAQ2yB,QAC5E,OAAOjxB,EAAAA,EAAUqf,QAAQhQ,EAAU5R,KAAKa,QAAQ2yB,QAAQvxB,QAAOzB,IAAY2kC,EAASz5B,SAASlL,IAC9F,CAQA0kC,kBAAAA,CAAmB1kC,EAASykC,GAC3BzkC,EAAQW,UAAUsf,OAzSS,gBAySqBwkB,GAChDzkC,EAAQkP,aAAa,gBAAiBu1B,GACtCzkC,EAAQsD,UAAY6jB,EAAAA,EAAY1kB,IAAIzC,EAAS,QAAQykC,EAAS,OAAS,gBAAkBzkC,EAAQsD,SAClG,CAOA+gC,aAAAA,GACC,OAAO7kC,KAAKW,SAASQ,UAAUE,SAlTH,0BAahB,QACC,QAqSd,EAODG,EAAAA,EAAaC,GAAG4L,SAAU+P,GAA0BmmB,IAAsB,SAAUj2B,IACtD,MAAzBA,EAAMhJ,OAAOiJ,SAAoBD,EAAMgjB,gBAAmD,MAAjChjB,EAAMgjB,eAAe/iB,UACjFD,EAAME,iBAGPjL,EAAAA,EAAU+wB,gCAAgCtzB,MAAMoC,SAAQ,SAAU5B,GACjE0jC,GAAWn8B,oBAAoBvH,EAAS,CAAEigB,QAAQ,IAASA,QAC5D,GACD,IAEA,YCrXA,MCoNA,GApNA,MACClgB,WAAAA,CAAYqF,GACX5F,KAAKqlC,UAAYz/B,EAAOy/B,UACxBrlC,KAAKslC,KAAO1/B,EAAO0/B,KACnBtlC,KAAK8hB,OAASlc,EAAOkc,QAAU,CAAC,EAAG,GACnC9hB,KAAKulC,SAAW3/B,EAAO2/B,UAAY,WACnCvlC,KAAKwlC,UAA+B,IAApB5/B,EAAO4/B,SACvBxlC,KAAKylC,oBAAmD,IAA9B7/B,EAAO6/B,mBACjCzlC,KAAK2d,UAAY/X,EAAO+X,WAAa,SACrC3d,KAAK0lC,mBAAqB9/B,EAAO8/B,oBAAsB,GAEvD1lC,KAAK2lC,OAAyB,IAAjB//B,EAAO+/B,MACpB3lC,KAAK4lC,aAAehgC,EAAOggC,cAAgB,EAC3C5lC,KAAK6lC,SAA6B,IAAnBjgC,EAAOigC,OACvB,CAEAC,iBAAAA,CAAkBtlC,GACjB,OAAOA,EAAQ8P,uBAChB,CAEAy1B,gBAAAA,GACC,MAAMt9B,EAAM4E,SAASulB,gBAErB,MAAO,CACNne,MAAOhM,EAAI4wB,YACX7oB,OAAQ/H,EAAIwZ,aACZlN,KAAM,EACNrE,IAAK,EACLqL,MAAOtT,EAAI4wB,YACXphB,OAAQxP,EAAIwZ,aAEd,CAEA+jB,uBAAAA,GACC,MAAMC,EAAUjmC,KAAK8lC,kBAAkB9lC,KAAKqlC,WACtCa,EAAWlmC,KAAK8lC,kBAAkB9lC,KAAKslC,MACvCa,EAAWnmC,KAAK+lC,oBACfK,EAASC,GAAWrmC,KAAK8hB,OAEhC,IAAInE,EAAY3d,KAAK2d,UAErB,GAAI3d,KAAKylC,mBAAoB,CAC5B,MAAMa,EAAY,CAACtmC,KAAK2d,aAAc3d,KAAK0lC,oBAC3C,IAAIa,EAAO,KAEX,IAAK,MAAMtb,KAAKqb,EAAW,CAC1B,MAAM1vB,EAAW5W,KAAKwmC,mBAAmBvb,EAAGgb,EAASC,EAAUE,EAASC,GAClEjqB,EAAWpc,KAAKymC,mBAAmB7vB,EAAUsvB,EAAUC,GAE7D,KAAKI,GAAQnqB,EAAWmqB,EAAKnqB,YAC5BmqB,EAAO,CAAE5oB,UAAWsN,EAAGrU,WAAUwF,YAEhB,IAAbA,GAAgB,KAEtB,CAEAuB,EAAY4oB,EAAK5oB,UAEjB,MAAM+oB,EAAgB1mC,KAAK2lC,MACxB3lC,KAAK2mC,eAAeJ,EAAK3vB,SAAUsvB,EAAUC,GAC7CI,EAAK3vB,SAER5W,KAAK4mC,WAAWF,EACjB,KAAO,CACN,MAAM9vB,EAAW5W,KAAKwmC,mBAAmB7oB,EAAWsoB,EAASC,EAAUE,EAASC,GAE1EK,EAAgB1mC,KAAK2lC,MACxB3lC,KAAK2mC,eAAe/vB,EAAUsvB,EAAUC,GACxCvvB,EAEH5W,KAAK4mC,WAAWF,EACjB,CAEA1mC,KAAKslC,KAAK51B,aAAa,oBAAqBiO,EAC7C,CAEA6oB,kBAAAA,CAAmB7oB,EAAWsoB,EAASC,EAAUE,EAAU,EAAGC,EAAU,GACvE,IAAI31B,EACAqE,EAEJ,OAAQ4I,GACP,IAAK,MACJjN,EAAMu1B,EAAQv1B,IAAMw1B,EAAS11B,OAAS61B,EACtCtxB,EAAOkxB,EAAQlxB,MAAQkxB,EAAQxxB,MAAQyxB,EAASzxB,OAAS,EACzD,MAED,IAAK,YACJ/D,EAAMu1B,EAAQv1B,IAAMw1B,EAAS11B,OAAS61B,EACtCtxB,EAAOkxB,EAAQlxB,KAAOqxB,EACtB,MAED,IAAK,UACJ11B,EAAMu1B,EAAQv1B,IAAMw1B,EAAS11B,OAAS61B,EACtCtxB,EAAOkxB,EAAQlqB,MAAQmqB,EAASzxB,MAAQ2xB,EACxC,MAED,IAAK,SACJ11B,EAAMu1B,EAAQhuB,OAASouB,EACvBtxB,EAAOkxB,EAAQlxB,MAAQkxB,EAAQxxB,MAAQyxB,EAASzxB,OAAS,EACzD,MAED,IAAK,eAwCL,QACC/D,EAAMu1B,EAAQhuB,OAASouB,EACvBtxB,EAAOkxB,EAAQlxB,KAAOqxB,QArCvB,IAAK,aACJ11B,EAAMu1B,EAAQhuB,OAASouB,EACvBtxB,EAAOkxB,EAAQlqB,MAAQmqB,EAASzxB,MAAQ2xB,EACxC,MAED,IAAK,OACJ11B,EAAMu1B,EAAQv1B,KAAOu1B,EAAQz1B,OAAS01B,EAAS11B,QAAU,EACzDuE,EAAOkxB,EAAQlxB,KAAOmxB,EAASzxB,MAAQ2xB,EACvC,MAED,IAAK,aACJ11B,EAAMu1B,EAAQv1B,IAAM21B,EACpBtxB,EAAOkxB,EAAQlxB,KAAOmxB,EAASzxB,MAAQ2xB,EACvC,MAED,IAAK,WACJ11B,EAAMu1B,EAAQhuB,OAASiuB,EAAS11B,OAAS61B,EACzCtxB,EAAOkxB,EAAQlxB,KAAOmxB,EAASzxB,MAAQ2xB,EACvC,MAED,IAAK,QACJ11B,EAAMu1B,EAAQv1B,KAAOu1B,EAAQz1B,OAAS01B,EAAS11B,QAAU,EACzDuE,EAAOkxB,EAAQlqB,MAAQqqB,EACvB,MAED,IAAK,cACJ11B,EAAMu1B,EAAQv1B,IAAM21B,EACpBtxB,EAAOkxB,EAAQlqB,MAAQqqB,EACvB,MAED,IAAK,YACJ11B,EAAMu1B,EAAQhuB,OAASiuB,EAAS11B,OAAS61B,EACzCtxB,EAAOkxB,EAAQlqB,MAAQqqB,EAQzB,MAAO,CAAE11B,MAAKqE,OACf,CAEA0xB,kBAAAA,CAAmBI,EAAKX,EAAUC,GACjC,IAAI/pB,EAAW,EAkBf,OAhBIyqB,EAAI9xB,KAAOoxB,EAASpxB,OACvBqH,GAAY+pB,EAASpxB,KAAO8xB,EAAI9xB,MAG7B8xB,EAAIn2B,IAAMy1B,EAASz1B,MACtB0L,GAAY+pB,EAASz1B,IAAMm2B,EAAIn2B,KAG5Bm2B,EAAI9xB,KAAOmxB,EAASzxB,MAAQ0xB,EAASpqB,QACxCK,GAAayqB,EAAI9xB,KAAOmxB,EAASzxB,MAAS0xB,EAASpqB,OAGhD8qB,EAAIn2B,IAAMw1B,EAAS11B,OAAS21B,EAASluB,SACxCmE,GAAayqB,EAAIn2B,IAAMw1B,EAAS11B,OAAU21B,EAASluB,QAG7CmE,CACR,CAEAuqB,cAAAA,CAAeE,EAAKX,EAAUC,GAC7B,MAAMhuB,EAAUnY,KAAK4lC,aAEfrwB,EAAS4wB,EAASluB,OAASiuB,EAAS11B,OAAS2H,EAC7CjD,EAAUixB,EAASpqB,MAAQmqB,EAASzxB,MAAQ0D,EAElD,MAAO,CACNzH,IAAKyE,KAAKO,IACTP,KAAKC,IAAIyxB,EAAIn2B,IAAKy1B,EAASz1B,IAAMyH,GACjC5C,GAEDR,KAAMI,KAAKO,IACVP,KAAKC,IAAIyxB,EAAI9xB,KAAMoxB,EAASpxB,KAAOoD,GACnCjD,GAGH,CAEA0xB,UAAAA,CAAWC,GACLA,GAAQ7mC,KAAKslC,OAEdtlC,KAAK6lC,SACR/kC,EAAAA,EAAAA,IAAgBd,KAAKslC,KAAKvxB,MAAO,CAChC6C,SAAU,WACVlG,IAAK,GAAGm2B,EAAIn2B,IAAM2E,OAAOyxB,gBACzB/xB,KAAM,GAAG8xB,EAAI9xB,KAAOM,OAAO0xB,gBAC3BlwB,OAAQ,OAGT7W,KAAKslC,KAAKvxB,MAAM6C,SAAW,WAC3B5W,KAAKslC,KAAKvxB,MAAMrD,IAAM,GAAGm2B,EAAIn2B,IAAM2E,OAAOyxB,gBAC1C9mC,KAAKslC,KAAKvxB,MAAMgB,KAAO,GAAG8xB,EAAI9xB,KAAOM,OAAO0xB,gBAC5C/mC,KAAKslC,KAAKvxB,MAAM8C,OAAS,KAE3B,CAEAqK,aAAAA,GACClhB,KAAKgmC,yBACN,GChMKnjC,GAAmB,cACnByZ,GAAmB,OACnB6d,GAAmB,OACnB9d,GAAmB,OACnB2qB,GAAmB,sBAEnBzD,GAAuB,8BAMvBzmB,GAAmB,GAAGja,UACtBka,GAAmB,GAAGla,YACtBma,GAAmB,GAAGna,UACtBoa,GAAmB,GAAGpa,WACtBqa,GAAmB,GAAGra,YAMtBokC,GAA2B,SAASpkC,cACpCqkC,GAA2B,WAAWrkC,cACtCskC,GAA2B,SAAStkC,cACpCukC,GAA2B,aAAavkC,cACxCwkC,GAA2B,YAAYxkC,cAyB7C,MAAMykC,WAAmB/oB,EAAAA,EAsBxBhe,WAAAA,CAAYC,EAASuC,GACpByb,MAAMhe,EAASuC,GAsBf/C,KAAKa,QAAUb,KAAK8C,WAAWtC,GAASM,EAAAA,EAAAA,IApBpB,CACnB6c,UAAW,OACX4pB,OAAO,EACP5jC,KAAM,CACLS,MAAO,GACPE,OAAQ,GACRD,OAAQ,MACRE,QAAQ,EACRQ,MAAM,EACNP,QAAQ,GAET6Z,UAAW,CACV1B,MAAM,EACNxc,QAAQ,EACRC,GAAI,mBACJC,IAAK,oBACLwd,MAAO,MAI8D9a,IAEvE,MAAMuB,EAAS/B,EAAAA,EAAU8gB,uBAAuBrjB,KAAKW,UACrDX,KAAKwnC,QAAUxnC,KAAKW,SAASyvB,WAC7BpwB,KAAKynC,MAAQnjC,GAAU/B,EAAAA,EAAUC,KAAK,IAAIwkC,KAAoBhnC,KAAKwnC,SAE9DxnC,KAAKynC,QAEVznC,KAAK0nC,cAAe,EACpB1nC,KAAK2nC,OAAS3nC,KAAKa,QAAQwd,UAAU1B,KACrC3c,KAAK4nC,YAAc5nC,KAAKa,QAAQwd,UAAUle,OAE1CH,KAAKa,QAAQwd,UAAUR,MAAQ7d,KAAK4nC,YAAc5nC,KAAKa,QAAQwd,UAAUR,MAAQ,EACjF7d,KAAK6H,WAAW7H,KAAKynC,MAAOH,GAAWzkC,SAAU7C,KAAKa,QAAQwd,WAC/D,CAMA,eAAW/V,GACV,MAtHuB,UAuHxB,CAMA,mBAAWzF,GACV,OAAOA,EACR,CAMA4d,MAAAA,GACC,OAAOzgB,KAAK2gB,WAAa3gB,KAAK4gB,OAAS5gB,KAAKwgB,MAC7C,CAQAA,IAAAA,GACC,IAAI/S,EAAAA,EAAAA,IAAWzN,KAAKW,WAAaX,KAAK2gB,WAAY,OAElD,MAAMD,EAAgB,CAAEA,cAAe1gB,KAAKW,UAE1Ba,EAAAA,EAAawf,QAAQhhB,KAAKynC,MAAOzqB,GAAgB0D,GACrD/E,mBAEV,iBAAkBtO,SAASulB,iBAC9B,GAAGkC,UAAUznB,SAASvG,KAAKq+B,UAAU/iC,SAAQkP,IAC5C9P,EAAAA,EAAaC,GAAG6P,EAAI,YAAakU,EAAAA,GAAK,IAIxCxlB,KAAKW,SAAS+O,aAAa,gBAAiB,QAC5C1P,KAAKW,SAASQ,UAAUC,IAAIkb,IAC5Btc,KAAKynC,MAAMtmC,UAAUC,IAAIkb,IACzBtc,KAAKkhB,gBAeLlhB,KAAKyH,gBAboB8Z,KACxBvhB,KAAKsD,QAAO,CAACwB,EAAQD,KACpBrD,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUuc,GAAkB,CAAE+D,MAAOnc,EAAQD,QAAO,IAG3E7E,KAAK2nC,OACR3nC,KAAKynC,MAAMtmC,UAAUC,IAAI+4B,IACdn6B,KAAK4nC,aAChB5nC,KAAKynC,MAAMtmC,UAAUC,IAAIib,IAE1B7a,EAAAA,EAAawf,QAAQhhB,KAAKynC,MAAOxqB,GAAiByD,EAAc,GAG3B1gB,KAAKynC,MAAOznC,KAAK4nC,aAAe5nC,KAAK2nC,OAAQ,IACpF,CAQA/mB,IAAAA,KACKnT,EAAAA,EAAAA,IAAWzN,KAAKW,WAAcX,KAAK2gB,YACvC3gB,KAAK6nC,cAAc,CAAEnnB,cAAe1gB,KAAKW,UAC1C,CAMA0B,OAAAA,GACCmc,MAAMnc,SACP,CAOAse,QAAAA,GACC,OAAO3gB,KAAKW,SAASQ,UAAUE,SAASib,GACzC,CAOAurB,aAAAA,CAAcnnB,GACKlf,EAAAA,EAAawf,QAAQhhB,KAAKynC,MAAO3qB,GAAgB4D,GACrD/E,mBAEV,iBAAkBtO,SAASulB,iBAC9B,GAAGkC,UAAUznB,SAASvG,KAAKq+B,UAAU/iC,SAAQkP,IAC5C9P,EAAAA,EAAac,IAAIgP,EAAI,YAAakU,EAAAA,GAAK,IAIzCxlB,KAAKW,SAASQ,UAAUG,OAAOgb,IAC/Btc,KAAKW,SAAS+O,aAAa,gBAAiB,SAExC1P,KAAK2nC,OACR3nC,KAAKynC,MAAMtmC,UAAUG,OAAO64B,IACjBn6B,KAAK4nC,aAChB5nC,KAAKynC,MAAMtmC,UAAUG,OAAO+a,IAG7B9W,YAAW,KAKVvF,KAAKyH,gBAJoB8Z,KACxBvhB,KAAKynC,MAAMtmC,UAAUG,OAAOgb,IAC5B9a,EAAAA,EAAawf,QAAQhhB,KAAKynC,MAAO1qB,GAAkB2D,EAAc,GAE5B1gB,KAAKynC,MAAOznC,KAAK4nC,aAAe5nC,KAAK2nC,OAAO,GAChF3nC,KAAKa,QAAQwd,UAAUR,OAC3B,CAMAqD,aAAAA,GACC,GAAKlhB,KAAKynC,MAAV,CAEA,IAAKznC,KAAK0nC,aAAc,CACvB,IAAII,EAAmB,eACtBtC,GAAW,EACXC,GAAqB,EAES,SAA3BzlC,KAAKa,QAAQ8c,WAChB6nB,GAAW,EACXC,GAAqB,GAErBqC,EAAmB9nC,KAAKa,QAAQ8c,UAGf,IAAIoqB,GAAU,CAC/B1C,UAAWrlC,KAAKW,SAChB2kC,KAAMtlC,KAAKynC,MACX9pB,UAAWmqB,EACXvC,SAAU,kBACVC,SAAUA,EACVC,mBAAoBA,EACpBC,mBAAoB,CAAC,YAAa,aAAc,aAGvCxkB,eACX,CAEAlhB,KAAK0nC,cAAe,CA3BG,CA4BxB,CAQA,WAAOx/B,CAAK1H,EAASuC,EAAS,CAAC,GAC9B,MAAMwd,EAAW+mB,GAAWv/B,oBAAoBvH,EAASuC,GAEzD,GAAIwd,EAAS1f,QAAQ0mC,SAAUrQ,EAAAA,EAAAA,MAAkB,CAChD,IAAI8Q,EAAc,KAElBxmC,EAAAA,EAAaC,GAAG8e,EAASinB,QAASJ,IAA2B95B,IAC5D,GAAI06B,EAAa,OAEjBV,GAAWW,gBAAgB36B,GAE3B,MAAMhJ,EAASgJ,EAAMhJ,OAAOqJ,QAAQ,gBAC/BrJ,GAAWic,EAASinB,QAAQnmC,SAASiD,KAE1C0jC,EAAc1jC,EACdic,EAASC,OAAM,IAGhBhf,EAAAA,EAAaC,GAAG8e,EAASinB,QAASH,IAA0B/5B,IAC3D,IAAK06B,EAAa,OAElB,IAAItnB,EAAgBpT,EAAMoT,cAC1B,KAAOA,GAAiBA,IAAkBsnB,GACzCtnB,EAAgBA,EAAc0P,WAG3B1P,IAAkBsnB,IAEtBA,EAAc,KACdznB,EAASsnB,cAAc,CAAEnnB,cAAeH,EAAS5f,WAAW,GAE9D,CAcA,OAXAa,EAAAA,EAAaC,GAAG4L,SAAU45B,GAAsB1D,GAAsB+D,GAAWY,gBACjF1mC,EAAAA,EAAaC,GAAG4L,SAAU65B,GAAwB,IAAIF,KAAoBM,GAAWY,gBACrF1mC,EAAAA,EAAaC,GAAG4L,SAAU45B,GAAsBK,GAAWa,YAC3D3mC,EAAAA,EAAaC,GAAG4L,SAAU85B,GAAsBG,GAAWa,YAG3D3mC,EAAAA,EAAaC,GAAGjB,EAAS2mC,IAAuB75B,IAC/CA,EAAME,iBACN+S,EAASE,QAAQ,IAGXF,CACR,CAOA,sBAAO0nB,CAAgB36B,GACtB,MAAM86B,EAAc7lC,EAAAA,EAAUqf,QAAQ,GAAG2hB,oCAAsDjnB,MAC/F,IAAK,MAAMmE,KAAU2nB,EAAa,CACjC,MAAMrG,EAAUuF,GAAWx/B,YAAY2Y,GACvC,IAAKshB,EAAS,SAEd,GAAIz0B,EAAMhJ,OAAOqJ,QAAQ,IAAIq5B,QAAwBjF,EAAQ0F,MAC5D,OAID,IADqBn6B,EAAM+6B,kBAAoB,IAC9B38B,SAASq2B,EAAQphC,UACjC,SAGD,MAAM+f,EAAgB,CAAEA,cAAeqhB,EAAQphC,UAC5B,UAAf2M,EAAMtB,OACT0U,EAActT,WAAaE,GAG5By0B,EAAQ8F,cAAcnnB,EACvB,CACD,CAOA,qBAAOwnB,CAAe56B,GACrB,MAAMg7B,EAAU,kBAAkBhR,KAAKhqB,EAAMhJ,OAAOiJ,SAC9Cg7B,EAA8B,WAAdj7B,EAAM7M,IACtB+nC,EAAkB,CAAC,UAAW,aAAa98B,SAAS4B,EAAM7M,KAEhE,IAAK+nC,IAAoBD,EAAe,OACxC,GAAID,IAAYC,EAAe,OAE/Bj7B,EAAME,iBAEN,MAAMiT,EAASzgB,KAAK6zB,QAAQ0P,IACzBvjC,KACAuC,EAAAA,EAAUC,KAAK+gC,GAAsBj2B,EAAMgjB,gBAAgBF,YAE9D,IAAK3P,EAAQ,OAEb,MAAMF,EAAW+mB,GAAWv/B,oBAAoB0Y,GAE5C+nB,GACHl7B,EAAMuD,kBACN0P,EAASC,QACCD,EAASI,aACnBrT,EAAMuD,kBACN0P,EAASK,OACTH,EAAOib,QAET,CAOA,iBAAOyM,CAAW76B,GACI,IAAjBA,EAAMhG,QAAgC,UAAfgG,EAAMtB,MAAkC,QAAdsB,EAAM7M,KAG3D6mC,GAAWW,gBAAgB36B,EAC5B,EAGD,MCnaA,GDmaA,GEraMm7B,GAAsB,CACxBC,yBAAAA,GACI,MAGMC,GAHe3oC,KAAKa,SAAWb,KAAKa,QAAQ+nC,OAAuC,iBAAvB5oC,KAAKa,QAAQ+nC,MACzE5oC,KAAKa,QAAQ+nC,MACb,CAAC,GACwBC,QACzBC,EAAU9oC,KAAKW,SACfX,KAAKW,SAAS4Q,aAAa,sBAC3B,KACAw3B,EAAMD,SAAwE,KAA3BtiC,OAAOsiC,GAASriC,OACnEqiC,EACAH,EACN,OAAOniC,OAAOuiC,GAAO,IAAItiC,MAC7B,EAEAuiC,sBAAAA,GAEI,MAAa,KADAhpC,KAAK0oC,8BAIF1oC,KAAKW,UAAYX,KAAKW,SAASsoC,MACzC73B,MAAMC,KAAKrR,KAAKW,SAASsoC,MAAMz5B,iBAAiB,OAChD,IACSyoB,MAAM3X,IACjB,MAAM4oB,EAAY1iC,OAAO8Z,EAAO/O,aAAa,eAAiB,IAAI/L,cAAciB,OAC1E0iC,EAAkB3iC,OAAO8Z,EAAO/O,aAAa,sBAAwB,IAAI/L,cAAciB,OAC7F,MAAqB,SAAdyiC,GAAsC,UAAdA,GAA6C,SAApBC,GAAkD,UAApBA,CAA2B,GAEzH,EAEAC,0BAAAA,CAA2BR,GACvB,MAAMhwB,EAAQ,IAAIuV,IACZpZ,EAAO3D,MAAMiP,QAAQuoB,GAASA,EAAM7zB,MAAQ6zB,EAAM7zB,KAAO,GACzDgH,EAAQ3K,MAAMiP,QAAQuoB,GAASA,EAAM7sB,OAAS6sB,EAAM7sB,MAAQ,GAWlE,OAVAhH,EAAK3S,SAAS8f,IACNrN,OAAOw0B,UAAUnnB,IAAUA,GAAS,GACpCtJ,EAAMhW,IAAIsf,EAAO,OACrB,IAEJnG,EAAM3Z,SAAS8f,IACPrN,OAAOw0B,UAAUnnB,IAAUA,GAAS,IAAMtJ,EAAMkQ,IAAI5G,IACpDtJ,EAAMhW,IAAIsf,EAAO,QACrB,IAEGtJ,CACX,EAEA0wB,+BAAAA,CAAgCC,GAC5B,MAAMC,EAAgBxpC,KAAKypC,qCAAqCtb,IAC1DnuB,KAAKypC,0BACL,IAAItb,IACJub,EAAc,GAOpB,OANAH,EAAUnnC,SAAQ,CAACunC,EAAMznB,KACjBsnB,EAAcvmC,IAAIif,KAAWynB,GAC7BD,EAAY/xB,KAAK,CAAEuK,QAAOynB,QAC9B,IAEJ3pC,KAAKypC,0BAA4BF,EAC1BG,CACX,EAEAE,wBAAAA,GACI,IAAK5pC,KAAKW,SACN,OAEJ,MAAMkpC,EAAuB9xB,QAAQ/X,KAAK8pC,yBAEpCC,EAAgB/pC,KAAKW,SAASsoC,MAAQ73B,MAAMC,KAAKrR,KAAKW,SAASsoC,MAAMz5B,iBAAiB,OAAS,GAC/Fw6B,EAAiBhqC,KAAKiqC,0BAA0BF,EAAe,CACjEG,gBAAgB,EAChBC,oBAAoB,IAElBC,EAAcP,EACd,CAAE90B,KAAM,GAAIgH,MAAO,IACnB/b,KAAKqqC,8BAA8BrqC,KAAKW,SAAUqpC,GAClDM,EAAiBF,EAAYr1B,KAAK3G,OAAS,GAAKg8B,EAAYruB,MAAM3N,OAAS,EACjFpO,KAAKW,SAASQ,UAAUsf,OAAO,mBAAoB6pB,GAC/CtqC,KAAKwnC,SACLxnC,KAAKwnC,QAAQrmC,UAAUsf,OAAO,mBAAoB6pB,GAEtD,MAAMC,EAAyBvqC,KAAKspC,gCAChCtpC,KAAKopC,2BAA2BgB,IAEpCpqC,KAAKwqC,0BAA0BxqC,KAAKW,SAAUypC,EAAa,CACvDK,aAAa,EACbC,YAAY,EACZC,oBAAqBJ,IAEzBvqC,KAAK4qC,iCAAiCN,GAEtC,MAAMO,EAAa7qC,KAAK8qC,mBAAqB9qC,KAAK8qC,kBAAkB3e,MAC9DnsB,KAAK8qC,kBAAkB3e,MACvB,KACN,GAAI0e,EAAY,CACZ,MAAME,EAAeF,EAAW5B,MAAQ73B,MAAMC,KAAKw5B,EAAW5B,MAAMz5B,iBAAiB,OAAS,GACxFw7B,EAAgBhrC,KAAKiqC,0BAA0Bc,EAAc,CAC/Db,gBAAgB,EAChBC,oBAAoB,IAElBc,EAAaX,EACbtqC,KAAKqqC,8BAA8BQ,EAAYG,GAC/C,CAAEj2B,KAAM,GAAIgH,MAAO,IACzB/b,KAAKwqC,0BAA0BK,EAAYI,EAAY,CACnDR,aAAa,EACbC,YAAY,GAEpB,CACA1qC,KAAKkrC,iCACLlrC,KAAKmrC,wBAAwB,CAAEC,WAAW,GAC9C,EAEAf,6BAAAA,CAA8Ble,EAAOyc,GACjC,MAAMlV,EAAO,CACT3e,KAAM3D,MAAMiP,QAAQuoB,GAASA,EAAM7zB,MAAQ6zB,EAAM7zB,KAAK8M,QAAU,GAChE9F,MAAO3K,MAAMiP,QAAQuoB,GAASA,EAAM7sB,OAAS6sB,EAAM7sB,MAAM8F,QAAU,IAEvE,IAAK7hB,KAAKqrC,iBACN,OAAO3X,EAEX,MAAM4X,EAAkBtrC,KAAKurC,2BACvBC,EAAgBF,EAChBA,EAAgBG,eACftf,EAAQA,EAAM7b,wBAAwBmE,MAAQ,EAErD,KADyB+2B,EAAgB,GAAKA,GAAiB,KAE3D,OAAO9X,EAGX,MAAMgY,EAAehY,EAAK3e,KAAK+f,OAAOpB,EAAK3X,OAC3C,GAAI2vB,EAAat9B,QAAU,EACvB,OAAOslB,EAEX,GAAIgY,EAAat9B,OAAS,EACtB,MAAO,CAAE2G,KAAM,GAAIgH,MAAO,IAG9B,MAAMsQ,EAAcF,GAASA,EAAM8c,MAAQ73B,MAAMC,KAAK8a,EAAM8c,MAAMz5B,iBAAiB,OAAS,GACtFm8B,EAAaD,EAAa,GAC1BprB,EAASzL,OAAOw0B,UAAUsC,IAAeA,GAAc,GAAKA,EAAatf,EAAYje,OACrFie,EAAYsf,GACZ,KACN,OAAKrrB,IAIeA,EAAOhQ,wBAAwBmE,OAAS,GAC1B,GAAhB+2B,EACP,CAAEz2B,KAAM,GAAIgH,MAAO,IALnB2X,CASf,EAEAuW,yBAAAA,CAA0BrjC,EAASjB,EAAU,CAAC,GAC1C,MAAM+I,EAAO0C,MAAMiP,QAAQzZ,GAAWA,EAAU,GAC1CsjC,GAA4C,IAA3BvkC,EAAQukC,eACzBC,GAAoD,IAA/BxkC,EAAQwkC,mBAC7ByB,EAAU,IAAIzd,IACd0d,EAAU,IAAI96B,IACd+6B,EAAW,IAAI/6B,IACfg7B,EAAc,GA6BpB,GA3BAr9B,EAAKtM,SAAQ,CAACke,EAAQ4B,KAClB,MAAM8pB,EAAQxlC,OAAO8Z,EAAO/O,aAAa,eAAiB,IAAI9K,OAChD,KAAVulC,GACAJ,EAAQhpC,IAAIopC,EAAO9pB,EACvB,IAGJxT,EAAKtM,SAAQ,CAACke,EAAQ4B,KAClB,MAAMgnB,EAAY1iC,OAAO8Z,EAAO/O,aAAa,eAAiB,IAAI/L,cAAciB,OAC1E0iC,EAAkB3iC,OAAO8Z,EAAO/O,aAAa,sBAAwB,IAAI/L,cAAciB,OACvFkjC,EAAqB,SAAdT,GAAsC,UAAdA,EAC/BA,EACqB,SAApBC,GAAkD,UAApBA,EAA8BA,EAAkB,GACrF,GAAa,SAATQ,EACAkC,EAAQzqC,IAAI8gB,QACT,GAAa,UAATynB,EACPmC,EAAS1qC,IAAI8gB,QACV,IAAKgoB,EAAgB,CACxB,MAAM+B,EAAazlC,OAAO8Z,EAAO/O,aAAa,oBAAsB,IAAI/L,cAAciB,OACnE,SAAfwlC,EACAJ,EAAQzqC,IAAI8gB,GACU,UAAf+pB,GACPH,EAAS1qC,IAAI8gB,EAErB,KAGAgoB,GAAkBlqC,KAAKW,SAAU,CACjC,MAAMmoC,EAAU9oC,KAAK0oC,4BACL,KAAZI,GACeA,EAAQt9B,MAAM,KAAK8C,KAAKwB,GAASA,EAAKrJ,SAAQxE,OAAO8V,SAC7D3V,SAAS8pC,IACZ,MAAMC,EAAYD,EAAMhf,MAAM,8BACxBkf,EAAeD,EAAYA,EAAU,GAAG3mC,cAAgB,IAC5C2mC,EAAYA,EAAU,GAAKD,GACpB1gC,MAAM,KAAK8C,KAAKwB,GAASA,EAAKrJ,SAAQxE,OAAO8V,SAC/D3V,SAASuJ,IACZ,MAAMuW,EAAQ0pB,EAAQ9iB,IAAInd,GAAQigC,EAAQ3oC,IAAI0I,GAAQkJ,OAAOw3B,SAAS1gC,EAAM,KACvEkJ,OAAOw0B,UAAUnnB,IAAUA,EAAQ,GAAKA,GAASxT,EAAKN,SAGtC,SAAjBg+B,EACAP,EAAQzqC,IAAI8gB,GACY,UAAjBkqB,EACPN,EAAS1qC,IAAI8gB,GAEb6pB,EAAYp0B,KAAKuK,GACrB,GACF,GAGd,CAEA6pB,EAAY3pC,SAAS8f,IACb2pB,EAAQ/iB,IAAI5G,IAAU4pB,EAAShjB,IAAI5G,KAGlBA,GACC/M,KAAKC,IAAI,EAAG1G,EAAKN,OAAS,EAAI8T,KACdioB,EAClC0B,EAAQzqC,IAAI8gB,GAGhB4pB,EAAS1qC,IAAI8gB,GAAM,IAQvB,MAAO,CAAEnN,KALI3D,MAAMC,KAAKw6B,GAASS,MAAK,CAACphB,EAAGqhB,IAAMrhB,EAAIqhB,IAKrCxwB,MAJD3K,MAAMC,KAAKy6B,GACpB7pC,QAAQigB,IAAW2pB,EAAQ/iB,IAAI5G,KAC/BoqB,MAAK,CAACphB,EAAGqhB,IAAMrhB,EAAIqhB,IAG5B,EAEA/B,yBAAAA,CAA0Bre,EAAOyc,EAAOjjC,EAAU,CAAC,GAC/C,IAAKwmB,EACD,OAEJ,MAAMse,GAAsC,IAAxB9kC,EAAQ8kC,YACtB+B,GAA0C,IAAvB7mC,EAAQ+kC,WAC3BC,EAAsBv5B,MAAMiP,QAAQ1a,EAAQglC,qBAC5ChlC,EAAQglC,oBACR,GACA8B,EAAW,GACbtgB,EAAM8c,OACNwD,EAAS90B,KAAKwU,EAAM8c,OAEpBwB,GAAete,EAAMugB,SAAWvgB,EAAMugB,QAAQt+B,QAC9Cq+B,EAAS90B,QAAQvG,MAAMC,KAAK8a,EAAMugB,UAElCjC,GAAete,EAAMwgB,OACrBF,EAAS90B,KAAKwU,EAAMwgB,OAGxB,MAAMvgB,EAAO,GACbqgB,EAASrqC,SAASwqC,IACdxgB,EAAKzU,QAAQvG,MAAMC,KAAKu7B,EAAQxgB,MAAQ,IAAI,IAEhD,MAAMygB,EAAWjE,IAAUA,EAAM7zB,KAAK3G,OAAS,GAAKw6B,EAAM7sB,MAAM3N,OAAS,GAazE,GAZAge,EAAKhqB,SAASqqB,IACVrb,MAAMC,KAAKob,EAAIC,OAAS,IAAItqB,SAASuqB,IACjCA,EAAKwF,gBAAgB,mBACrBxF,EAAKwF,gBAAgB,mBACrBxF,EAAKwF,gBAAgB,oBACrBxF,EAAKwF,gBAAgB,qBACrBxF,EAAKwF,gBAAgB,sBACrBxF,EAAK5Y,MAAMkmB,eAAe,WAC1BtN,EAAK5Y,MAAMkmB,eAAe,YAAY,GACxC,KAGD4S,EACD,OAGJ,MAAMxgB,EAAcF,EAAM8c,MAAQ73B,MAAMC,KAAK8a,EAAM8c,MAAMz5B,iBAAiB,OAAS,GAC7Es9B,EAAY3gB,EAAM7b,wBAClBg7B,EAAkBtrC,KAAKurC,2BACvBC,EAAgBF,EAChBA,EAAgBG,eAChBqB,EAAUr4B,MACVs4B,EAAU,CAAC,EACjB1gB,EAAYjqB,SAAQ,CAACuqB,EAAMzK,KACvB,MAAM7R,EAAOsc,EAAKrc,wBAClBy8B,EAAQ7qB,GAAS,CACbzN,MAAOU,KAAKC,IAAI,EAAG/E,EAAKoE,OACxBM,KAAMI,KAAKC,IAAI,EAAG/E,EAAK0E,KAAO+3B,EAAU/3B,MACxCvE,OAAQ2E,KAAKC,IAAI,EAAG/E,EAAKG,QACzBE,IAAKyE,KAAKC,IAAI,EAAG/E,EAAKK,IAAMo8B,EAAUp8B,KACzC,IAEL,MAAMs8B,EAAc,CAAC,EACrB,IAAIC,EAAa,EACjBrE,EAAM7zB,KAAK3S,SAAS8f,IAChB,MAAMzN,EAAQs4B,EAAQ7qB,GAAS6qB,EAAQ7qB,GAAOzN,MAAQ,EACtDu4B,EAAY9qB,GAAS+qB,EACrBA,GAAcx4B,CAAK,IAGvB,MAAMy4B,EAAe,CAAC,EACtB,IAAIC,EAAc,EAClBvE,EAAM7sB,MAAM8F,QAAQyqB,MAAK,CAACphB,EAAGqhB,IAAMA,EAAIrhB,IAAG9oB,SAAS8f,IAC/C,MAAMzN,EAAQs4B,EAAQ7qB,GAAS6qB,EAAQ7qB,GAAOzN,MAAQ,EACtDy4B,EAAahrB,GAASirB,EACtBA,GAAe14B,CAAK,IAGxB,MAAM24B,EAAgBxE,EAAM7zB,KAAK3G,OAASw6B,EAAM7zB,KAAK6zB,EAAM7zB,KAAK3G,OAAS,IAAM,EACzEi/B,EAAiBzE,EAAM7sB,MAAM3N,OAASw6B,EAAM7sB,MAAM,IAAM,EAC9DqQ,EAAKhqB,SAASqqB,IACV,MACMvU,EADcuU,EAAIgH,eAA+C,UAA9BhH,EAAIgH,cAAclmB,QAC9B,EAAI,EAEjCq7B,EAAM7zB,KAAK3S,SAAS8f,IAChB,MAAMyK,EAAOF,EAAIC,OAASD,EAAIC,MAAMxK,GAASuK,EAAIC,MAAMxK,GAAS,KAChE,IAAKyK,EACD,OAEJ,MAAM2gB,EAASP,EAAQ7qB,IAAU,CAAEnN,KAAM,GACnCw4B,EAAYP,EAAY9qB,GAASorB,EAAOv4B,KAC9C4X,EAAKjd,aAAa,kBAAmB,QACrCid,EAAKjd,aAAa,mBAAoBlJ,OAAO+mC,IAC7C5gB,EAAK5Y,MAAMmE,OAAS1R,OAAO0R,GACvBgK,IAAUkrB,GACVzgB,EAAKjd,aAAa,kBAAmB,QACzC,IAGJk5B,EAAM7sB,MAAM3Z,SAAS8f,IACjB,MAAMyK,EAAOF,EAAIC,OAASD,EAAIC,MAAMxK,GAASuK,EAAIC,MAAMxK,GAAS,KAChE,IAAKyK,EACD,OAEJ,MAAM2gB,EAASP,EAAQ7qB,IAAU,CAAEnN,KAAM,EAAGN,MAAO,GAE7C84B,EADc/B,EAAgB0B,EAAahrB,GAASorB,EAAO74B,MACjC64B,EAAOv4B,KACvC4X,EAAKjd,aAAa,kBAAmB,SACrCid,EAAKjd,aAAa,mBAAoBlJ,OAAO+mC,IAC7C5gB,EAAK5Y,MAAMmE,OAAS1R,OAAO0R,GACvBgK,IAAUmrB,GACV1gB,EAAKjd,aAAa,kBAAmB,OACzC,GACF,IAGD88B,GAAgD,mBAArBxsC,KAAKwtC,aAA+B7C,EAAoBv8B,QAIxFu8B,EAAoBvoC,SAASqrC,IACzB,MAAMvrB,EAAQrN,OAAOw0B,UAAUoE,GAASA,EAAMvrB,OAASurB,EAAMvrB,OAAS,EAChEynB,GAAO8D,GAAyB,SAAfA,EAAM9D,MAAkC,UAAf8D,EAAM9D,KAEhD,GADA8D,EAAM9D,KAEN+D,EAAaxrB,GAAS,GAAKA,EAAQmK,EAAYje,OAC/Cie,EAAYnK,GACZ,KACN,IAAKwrB,IAAe/D,EAChB,OAGJ,MAAM2D,EAASP,EAAQ7qB,IAAU,CAAEnN,KAAM,EAAGN,MAAO,EAAG/D,IAAK,EAAGF,OAAQ,GAChEiE,EAAQ64B,EAAO74B,OAAS,EACxBjE,EAAS88B,EAAO98B,QAAU,EAC1BuE,EAAgB,SAAT40B,EACNqD,EAAY9qB,IAAU,EACvB/M,KAAKC,IAAI,EAAGo2B,GAAiB0B,EAAahrB,IAAU,GAAKzN,GACzDsH,EAAiB,UAAT4tB,EACPuD,EAAahrB,IAAU,EACxB/M,KAAKC,IAAI,EAAGo2B,EAAgBz2B,EAAON,GACnC/D,EAAM48B,EAAO58B,KAAO,EACpBuH,EAAS9C,KAAKC,IAAI,EAAG03B,EAAUt8B,OAASE,EAAMF,GAC9Cw7B,EAAQxlC,OAAOknC,EAAWn8B,aAAa,eAAiB,IAAI9K,OAC5DknC,EAAoB54B,GAAQu4B,EAAOv4B,MAAQ,GAC3C64B,EAAgB/4B,OAAOC,WAAW44B,EAAWn8B,aAAa,qBAAuB,IACjFg8B,EAAY14B,OAAOI,SAAS24B,GAAiBA,EAAgBD,EAC7DE,EAAa7tC,KAAK8tC,gBAAkB9tC,KAAK8tC,eAAeD,YAAmB,EAC3EE,EAAYlL,KAAKmL,MAEvBhuC,KAAKwtC,YAAY,cAAe,CAC5BS,YAAa/rB,EACbynB,OACAuE,MAAO,QACPlC,QACAmC,OAAQ,CACJjsB,QACAynB,OACAqC,QACAv3B,QACAjE,SACAhQ,QAASktC,GAEbU,QAAS,CACLr5B,OACAgH,QACArL,MACAuH,UAEJo2B,MAAO,CACHx2B,KAAM01B,EACNzT,QAASyT,EAAYM,EACrBA,cAEJS,QAAS,CACL1L,UAAWmL,EACXQ,IAAK,IAAI1L,KAAKkL,GAAWS,gBAE/B,GAEV,EAEA5D,gCAAAA,CAAiC6D,GAC7B,GAAKzuC,KAAK8tC,eAAV,CAIA,GAAIW,IAAYzuC,KAAK0uC,yBAGjB,OAFA1uC,KAAK8tC,eAAel+B,iBAAiB,SAAU5P,KAAK2uC,yBAA0B,CAAEC,SAAS,SACzF5uC,KAAK0uC,0BAA2B,IAG/BD,GAAWzuC,KAAK0uC,2BACjB1uC,KAAK8tC,eAAep8B,oBAAoB,SAAU1R,KAAK2uC,0BACvD3uC,KAAK0uC,0BAA2B,GAE/BD,GACDzuC,KAAK6uC,mCAXT,MAFI7uC,KAAK6uC,mCAeb,EAEAA,iCAAAA,GACQ7uC,KAAK8uC,wBAA4C,oBAAXz5B,QAAiE,mBAAhCA,OAAO8G,sBAC9E9G,OAAO8G,qBAAqBnc,KAAK8uC,wBAErC9uC,KAAK8uC,uBAAyB,EAC9B9uC,KAAK+uC,4BAA8B,EACnC/uC,KAAKgvC,mCAAqCn6B,OAAOo6B,IACjDjvC,KAAKkvC,gCAAkC,GACvClvC,KAAKmvC,wBAA0B,GAC/BnvC,KAAKovC,gCAAkC,GACvCpvC,KAAKypC,0BAA4B,IAAItb,GACzC,EAEA+c,8BAAAA,GACI,MAAMmE,EAAS,CAACrvC,KAAKW,UACjBX,KAAK8qC,mBAAqB9qC,KAAK8qC,kBAAkB3e,OACjDkjB,EAAO13B,KAAK3X,KAAK8qC,kBAAkB3e,OAEvC,MAAMmjB,EAAmBD,EAAOptC,OAAO8V,SACvC/X,KAAKmvC,wBAA0BG,EAC1BhhC,KAAK6d,GACK/a,MAAMC,KAAK8a,EAAM3c,iBAAiB,wCACpClB,KAAKqe,IACF,MAAM4gB,EAAY14B,OAAOC,WAAW6X,EAAKpb,aAAa,qBAAuB,KAC7E,MAAO,CACHob,OACA4gB,UAAW14B,OAAOI,SAASs4B,GAAaA,EAAY,EACvD,MAGZtrC,QAAQyqB,GAAUA,EAAMte,OAAS,IACtCpO,KAAKovC,gCAAkCE,EAClChhC,KAAK6d,IACK,CACHA,QACAojB,MAAOn+B,MAAMC,KAAK8a,EAAM3c,iBAAiB,sBACzCggC,WAAYp+B,MAAMC,KAAK8a,EAAM3c,iBAAiB,0BAGrDvN,QAAQwrC,GAAUA,EAAM8B,MAAMnhC,OAAS,GAAKq/B,EAAM+B,WAAWphC,OAAS,IAC3EpO,KAAKgvC,mCAAqCn6B,OAAOo6B,IACjDjvC,KAAKkvC,gCAAkC,EAC3C,EAEA/D,uBAAAA,CAAwBxlC,EAAU,CAAC,GAC/B,IAAK3F,KAAK8tC,eACN,OAGJ,MAAM2B,EAAiBzvC,KAAK8tC,eAAeD,YAAc,EACzD7tC,KAAK+uC,4BAA8BU,EACnC,MAAMrE,EAAYrzB,QAAQpS,GAAWA,EAAQylC,YACxCA,GAAaprC,KAAKgvC,qCAAuCS,KAG1DrE,GAA+B,oBAAX/1B,QAAkE,mBAAjCA,OAAOpF,sBAC5DjQ,KAAK0vC,6BAA6BD,GAGlCzvC,KAAK8uC,yBAGT9uC,KAAK8uC,uBAAyBz5B,OAAOpF,uBAAsB,KACvDjQ,KAAK8uC,uBAAyB,EAC9B9uC,KAAK0vC,6BAA6B1vC,KAAK+uC,4BAA4B,KAE3E,EAEAW,4BAAAA,CAA6B7B,GACpB7tC,KAAKmvC,wBAAwB/gC,QAC9BpO,KAAKkrC,iCAETlrC,KAAKmvC,wBAAwB/sC,SAASsqB,IAClCA,EAAMtqB,SAAQ,EAAGuqB,OAAM4gB,gBACnB,IAAK5gB,IAASA,EAAKgjB,YACf,OAEJ,MAAMtB,EAAQd,EAAYM,EAC1BlhB,EAAK5Y,MAAM+C,UAAY,eAAeu3B,gBAAoB,GAC5D,IAENruC,KAAKgvC,mCAAqCnB,EAC1C7tC,KAAK4vC,0BACT,EAEAA,wBAAAA,GACSx+B,MAAMiP,QAAQrgB,KAAKovC,kCAAqCpvC,KAAKovC,gCAAgChhC,QAC9FpO,KAAKkrC,iCAET,MAAM2E,EAAUz+B,MAAMiP,QAAQrgB,KAAKovC,iCAC7BpvC,KAAKovC,gCACL,GACN,IAAKS,EAAQzhC,OACT,OAGJ,MAAM0hC,EAAW9vC,KAAK8tC,eAChBiC,EAAYh4B,QAAQ+3B,GAAYA,EAASE,YAAcF,EAASzW,YAAc,GAC9EwU,EAAaiC,GAAYA,EAASjC,YAAmB,EACrDoC,EAAgBH,EAAW36B,KAAKC,IAAI,EAAG06B,EAASE,YAAcF,EAASzW,aAAe,EACtF6W,EAAsBH,GAAalC,EAAa,EAChDsC,EAAuBJ,GAAalC,EAAaoC,EAAgB,EACjEG,EAAe,GAAGF,EAAsB,EAAI,KAAKC,EAAuB,EAAI,IAC9EnwC,KAAKkvC,kCAAoCkB,IAG7CpwC,KAAKkvC,gCAAkCkB,EAEvCP,EAAQztC,SAAQ,EAAGmtC,QAAOC,iBACtBD,EAAMntC,SAASuqB,IACX,MAAM0jB,EAAO7pC,OAAOmmB,EAAKpb,aAAa,oBAAsB,IAAI/L,cAAciB,OACjD,UAAT4pC,GAAoBH,GAAkC,SAATG,GAAmBF,EAEhFxjB,EAAKjd,aAAa,oBAAqB,KAEvCid,EAAKwF,gBAAgB,oBACzB,IAGJqd,EAAWptC,SAASuqB,IAChB,MAAMgd,EAAOnjC,OAAOmmB,EAAKpb,aAAa,oBAAsB,IAAI/L,cAAciB,OACjD,SAATkjC,GAAmBuG,GAAkC,UAATvG,GAAoBwG,EAEhFxjB,EAAKjd,aAAa,qBAAsB,KAExCid,EAAKwF,gBAAgB,qBACzB,GACF,IAEV,GAGJ,MCljBMme,GAAkB,CACpBC,oBAAAA,CAAqBC,EAAiB,MAClC,IAAKxwC,KAAKwnC,UAAYxnC,KAAKW,SACvB,OAGJ,IAAImvC,EAAW9vC,KAAKW,SAAS8yB,eAAiBzzB,KAAKW,SAAS8yB,cAActyB,UAAUE,SAAS,uBACvFrB,KAAKW,SAAS8yB,cACd,KAEDqc,IACDA,EAAW1+B,MAAMC,KAAKrR,KAAKwnC,QAAQrC,UAAY,IAAI3iC,MAAM8lB,GAC9CA,GAAQA,EAAKnnB,WAAamnB,EAAKnnB,UAAUE,SAAS,0BACvD,MAGLyuC,IACDA,EAAWziC,SAAS2K,cAAc,OAClC83B,EAAShtB,UAAY,sBACjB0tB,IAAmBxwC,KAAKwnC,QACxBxnC,KAAKwnC,QAAQ72B,aAAam/B,EAAU9vC,KAAKW,UAEzCX,KAAKwnC,QAAQld,YAAYwlB,IAI7B9vC,KAAKW,SAAS8yB,gBAAkBqc,GAChCA,EAASxlB,YAAYtqB,KAAKW,UAG9BX,KAAK8tC,eAAiBgC,CAC1B,EAEAW,gBAAAA,GACI,MAAMX,EAAW9vC,KAAK8tC,eACtB,IAAKgC,EACD,OAGJ,GAAI9vC,KAAK0wC,WAAa1wC,KAAK0wC,UAAUZ,WAAaA,EAC9C,OAGJ,GAAI9vC,KAAK0wC,WAAa1wC,KAAK0wC,UAAUZ,SAAU,CAC3C,MAAMhc,EAAO9zB,KAAK0wC,UAAUZ,SAC5Bhc,EAAKpiB,oBAAoB,cAAe1R,KAAK0wC,UAAUC,eACvD7c,EAAKpiB,oBAAoB,cAAe1R,KAAK0wC,UAAUE,eACvD9c,EAAKpiB,oBAAoB,YAAa1R,KAAK0wC,UAAUG,aACrD/c,EAAKpiB,oBAAoB,gBAAiB1R,KAAK0wC,UAAUI,iBACzDhd,EAAK3yB,UAAUG,OAAO,mBAAoB,aAC9C,CAEA,MAAMsX,EAAQ,CACVk3B,WACApZ,QAAQ,EACRqa,OAAO,EACP/6B,UAAW,KACXg7B,OAAQ,EACRC,OAAQ,EACRC,gBAAiB,EACjBC,eAAgB,EAChBR,cAAe,KACfC,cAAe,KACfC,YAAa,KACbC,gBAAiB,MAGfM,EAAWA,KACbx4B,EAAM8d,QAAS,EACf9d,EAAMm4B,OAAQ,EACdn4B,EAAM5C,UAAY,KAClB85B,EAAS3uC,UAAUG,OAAO,aAAa,EAG3CsX,EAAM+3B,cAAiBrjC,IACnB,IAAKA,IAAUA,EAAM+jC,UACjB,OAEJ,GAA0B,UAAtB/jC,EAAMgkC,aAA4C,IAAjBhkC,EAAMhG,OACvC,OAEJ,IAAKgG,EAAMikC,SACP,OAGJ,MAAMjtC,EAASgJ,EAAMhJ,OACjBA,GAAUA,EAAOqJ,QAAQ,4EAI7BiL,EAAM8d,QAAS,EACf9d,EAAMm4B,OAAQ,EACdn4B,EAAM5C,UAAY1I,EAAM0I,UACxB4C,EAAMo4B,OAAS1jC,EAAM2I,QACrB2C,EAAMq4B,OAAS3jC,EAAMmD,QACrBmI,EAAMs4B,gBAAkBpB,EAASjC,WACjCj1B,EAAMu4B,eAAiBrB,EAASpS,UAChCoS,EAAS3uC,UAAUC,IAAI,cACmB,mBAA/B0uC,EAAS35B,mBAChB25B,EAAS35B,kBAAkB7I,EAAM0I,WACrC,EAGJ4C,EAAMg4B,cAAiBtjC,IACnB,IAAKsL,EAAM8d,QAAUppB,EAAM0I,YAAc4C,EAAM5C,UAC3C,OAGJ,MAAMI,EAAS9I,EAAM2I,QAAU2C,EAAMo4B,OAC/B36B,EAAS/I,EAAMmD,QAAUmI,EAAMq4B,QAChCr4B,EAAMm4B,QAAU57B,KAAKuG,IAAItF,GAAU,GAAKjB,KAAKuG,IAAIrF,GAAU,KAC5DuC,EAAMm4B,OAAQ,GAGlBjB,EAASjC,WAAaj1B,EAAMs4B,gBAAkB96B,EAC9C05B,EAASpS,UAAY9kB,EAAMu4B,eAAiB96B,EAExCuC,EAAMm4B,OAASzjC,EAAMqkB,YACrBrkB,EAAME,gBACV,EAGJoL,EAAMi4B,YAAevjC,IACjB,GAAIA,EAAM0I,YAAc4C,EAAM5C,UAA9B,CAGA,GAA8C,mBAAnC85B,EAASp5B,sBAChB,IACIo5B,EAASp5B,sBAAsBpJ,EAAM0I,UACzC,CAAE,MAAO5G,GACL,CAGRgiC,GARA,CAQU,EAGdx4B,EAAMk4B,gBAAmBxjC,IACjBA,EAAM0I,YAAc4C,EAAM5C,WAG9Bo7B,GAAU,EAGdtB,EAAS3uC,UAAUC,IAAI,oBACvB0uC,EAASlgC,iBAAiB,cAAegJ,EAAM+3B,eAC/Cb,EAASlgC,iBAAiB,cAAegJ,EAAMg4B,eAC/Cd,EAASlgC,iBAAiB,YAAagJ,EAAMi4B,aAC7Cf,EAASlgC,iBAAiB,gBAAiBgJ,EAAMk4B,iBACjD9wC,KAAK0wC,UAAY93B,EACK,oBAAXvD,SACPA,OAAO3D,oBAAoB,SAAU1R,KAAKwxC,qBAC1Cn8B,OAAOzF,iBAAiB,SAAU5P,KAAKwxC,sBAE3CxxC,KAAKyxC,0BACT,EAEAC,kBAAAA,GACI,GAAI1xC,KAAK2xC,eAAiB3xC,KAAKwnC,QAC3B,OAEJ,MAAMlf,EAAOjb,SAAS2K,cAAc,OACpCsQ,EAAKxF,UAAY,gBACjB,MAAMzD,EAAOrf,KAAK4xC,iBAAiB,gBAAiB,4CAC9CC,EAAa7xC,KAAK4xC,iBAAiB,qBAAsB,cAC/DtpB,EAAKxkB,UAAY,qCAAqC9D,KAAK8xC,YAAYzyB,iGAAoGrf,KAAK8xC,YAAYD,uBAC5LvpB,EAAKypB,QAAS,EACdzpB,EAAK1Y,iBAAiB,QAAS5P,KAAKgyC,sBACpC,MAAMC,EAASjyC,KAAK8tC,gBAAkB9tC,KAAK8tC,eAAera,gBAAkBzzB,KAAKwnC,QAC3ExnC,KAAK8tC,eACL9tC,KAAKW,SACXX,KAAKwnC,QAAQ72B,aAAa2X,EAAM2pB,GAChCjyC,KAAK2xC,aAAerpB,CACxB,EAEA4pB,qBAAAA,CAAsB5kC,GAClB,MAAM6kC,EAAa7kC,EAAQA,EAAMhJ,OAAS,KACpC8tC,EAAgBD,aAAsBE,QACtCF,EACCA,GAAcA,EAAW1e,cAAgB0e,EAAW1e,cAAgB,KACrD2e,GAAgBA,EAAczkC,QAAQ,6BAIxDL,GAAyC,mBAAzBA,EAAME,gBACtBF,EAAME,iBAEVxN,KAAKsyC,yBAAyBzP,KAAKmL,OAC/BhuC,KAAK2xC,eACL3xC,KAAK2xC,aAAaI,QAAS,GAEnC,EAEAN,wBAAAA,GACI,IAAKzxC,KAAK2xC,eAAiB3xC,KAAK8tC,eAC5B,OAEJ,MAAMkC,EAAchwC,KAAK8tC,eAAekC,aAAe,EACjD3W,EAAcr5B,KAAK8tC,eAAezU,aAAe,EAGvD,KAFkBlkB,KAAKC,IAAI,EAAG46B,EAAc3W,GACF,GAGtC,YADAr5B,KAAK2xC,aAAaI,QAAS,GAG/B,MAAMQ,GAAqBvyC,KAAKqrC,mBAAqBrrC,KAAKwyC,sBAC1DxyC,KAAK2xC,aAAaI,QAAUQ,CAChC,EAEAE,sBAAAA,GACI,MAAM9sC,EAAU3F,KAAKa,SAAWb,KAAKa,QAAQ6xC,SAA2C,iBAAzB1yC,KAAKa,QAAQ6xC,QACtE1yC,KAAKa,QAAQ6xC,QACb,CAAC,EACDvpB,EAAYnpB,KAAKW,SACjBX,KAAKW,SAAS4Q,aAAa,8BAC3B,KACAw3B,EAAoB,OAAd5f,EAAqBA,EAAYxjB,EAAQgtC,YAC/CC,EAAS/9B,OAAOw3B,SAAStD,EAAK,IACpC,OAAOl0B,OAAOI,SAAS29B,IAAWA,EAAS,EAAIA,EAAS,EAC5D,EAEAC,4BAAAA,GACI,GAA0C,mBAA/B7yC,KAAK8yC,sBACZ,MAAO,GAAG9yC,KAAK8yC,6CAEnB,MAAMC,EAAU/yC,KAAKW,UAAYX,KAAKW,SAAS6Q,GAAKhL,OAAOxG,KAAKW,SAAS6Q,IAAI/K,OAAS,GACtF,OAAIssC,EACO,gBAAgBA,IAEpB,gBAAgB19B,OAAOqO,SAAS6Z,UAC3C,EAEAyV,uBAAAA,GACI,GAAsB,oBAAX39B,SAA2BA,OAAOspB,aACzC,OAAO,EAEX,IACI,MAAMz6B,EAAQ2Q,OAAOw3B,SAASh3B,OAAOspB,aAAaG,QAAQ9+B,KAAK6yC,gCAAiC,IAChG,OAAOh+B,OAAOI,SAAS/Q,IAAUA,EAAQ,EAAIA,EAAQ,CACzD,CAAE,MAAOkL,GACL,OAAO,CACX,CACJ,EAEAkjC,wBAAAA,CAAyB1P,GACrB,GAAsB,oBAAXvtB,SAA2BA,OAAOspB,aACzC,OAEJ,MAAMz6B,EAAQ2Q,OAAOI,SAAS2tB,IAAcA,EAAY,EAAIztB,KAAK2gB,MAAM8M,GAAaC,KAAKmL,MACzF,IACI34B,OAAOspB,aAAaC,QAAQ5+B,KAAK6yC,+BAAgCrsC,OAAOtC,GAC5E,CAAE,MAAOkL,GACL,CAER,EAEA6jC,wBAAAA,GACI,GAAsB,oBAAX59B,QAA2BA,OAAOspB,aAG7C,IACItpB,OAAOspB,aAAauU,WAAWlzC,KAAK6yC,+BACxC,CAAE,MAAOzjC,GACL,CAER,EAEAojC,mBAAAA,GACI,MAAMW,EAAcnzC,KAAKgzC,0BACzB,IAAKG,EACD,OAAO,EAEX,MACMC,EAAe,GADRpzC,KAAKyyC,yBACQ,GAAK,GAAK,IACpC,IAAK59B,OAAOI,SAASm+B,IAAUA,GAAS,EACpC,OAAO,EAEX,MAAMC,EAAYF,EAAcC,EAChC,OAAIvQ,KAAKmL,OAASqF,IAGlBrzC,KAAKizC,4BACE,EACX,EAEA5H,cAAAA,GACI,GAAsB,oBAAXh2B,QAA+C,oBAAd+hB,UACxC,OAAO,EAGX,MAAMkc,EAAiBz+B,OAAOI,SAASmiB,UAAUI,iBAAmBJ,UAAUI,eAAiB,EACzF+b,EAAgD,mBAAtBl+B,OAAOm+B,aACjCn+B,OAAOm+B,WAAW,qBAAqB3f,SAAWxe,OAAOm+B,WAAW,yBAAyB3f,SAE7F4f,EAA0C,mBAAtBp+B,OAAOm+B,aAC3Bn+B,OAAOm+B,WAAW,iBAAiB3f,SAAWxe,OAAOm+B,WAAW,qBAAqB3f,SAErF6f,EAAiB,iBAAkBr+B,OAEzC,OAAOi+B,GAAkBC,GAAoBE,GAAcC,CAC/D,EAEAC,0BAAAA,CAA2Bj0B,GACvB,IAAKA,IAAY1f,KAAKW,SAClB,OAEJ,MAAMizC,EAAexiC,MAAMC,KAAKrR,KAAKW,SAASQ,WAAa,IACtDyyC,EAAaxlC,QAGlBwlC,EAAaxxC,SAAS0gB,IAvTF,qBAwTZA,GACApD,EAAQve,UAAUC,IAAI0hB,GAE1B9iB,KAAKW,SAASQ,UAAUG,OAAOwhB,EAAU,GAEjD,GAGJ,MChUO,SAAS+wB,GAAwB3vC,EAAO4vC,EAAW,GACtD,MAAMlB,EAAS/9B,OAAOw3B,SAASnoC,EAAO,IACtC,OAAO2Q,OAAOI,SAAS29B,IAAWA,GAAU,EAAIA,EAASkB,CAC7D,CAEO,SAASC,GAAuB7vC,EAAO4vC,GAAW,GACrD,GAAI5vC,QACA,OAAO4vC,EAEX,MAAM7wB,EAAazc,OAAOtC,GAAOsB,cAAciB,OAC/C,MAAmB,SAAfwc,GAAwC,MAAfA,GAGV,UAAfA,GAAyC,MAAfA,GAGvBlL,QAAQ7T,EACnB,CAEO,SAAS8vC,GAAqB9vC,EAAO4vC,GAAW,GACnD,GAAI5vC,QACA,OAAO4vC,EAEX,MAAM7wB,EAAazc,OAAOtC,GAAOsB,cAAciB,OAC/C,MAAsB,UAAfwc,GAAyC,MAAfA,CACrC,CAEO,SAASgxB,GAAkBriC,EAAUlS,EAAO2N,UAC/C,MAAM4V,EAAazc,OAAOoL,GAAY,IAAInL,OAC1C,IAAKwc,IAAevjB,GAAsC,mBAAvBA,EAAK6H,cACpC,OAAO,KAEX,IACI,OAAO7H,EAAK6H,cAAc0b,EAC9B,CAAE,MAAO7T,GACL,OAAO,IACX,CACJ,CCnCA,MAAM8kC,GAAuB,CACzBC,cAAAA,CAAe7uB,EAAO,CAAC,GACnB,IAAKtlB,KAAKo0C,sBAAwBp0C,KAAKq0C,eAAiBr0C,KAAKs0C,UACzD,OAGJ,MAAMC,EAAW1/B,OAAOw3B,SAAS/mB,EAAK0B,MAAO,IACvCA,EAAQnS,OAAOI,SAASs/B,IAAaA,GAAY,EAAIA,EAAW,EAChEC,EAAcx0C,KAAKy0C,gBAAgB,WAEnCC,EAAa,GADCF,EAAYG,YAAcnuC,OAAOguC,EAAYG,YAAYluC,QAAW,YACnDugB,IAG/B4tB,EAFS50C,KAAK60C,qBAECvmC,KAAKwB,GAGf,uCAFO9P,KAAK8xC,YAAYhiC,EAAK2b,eACtBzrB,KAAK8xC,YAAYhiC,EAAK5L,kBAErCsf,KAAK,IAERxjB,KAAKq0C,aAAavwC,UAAY,oGAEc9D,KAAK8xC,YAAY4C,8BACnDE,EAAQ,oCAAoCA,UAAgB,mCAGtE50C,KAAKq0C,aAAatC,QAAS,CAC/B,EAEAqC,iBAAAA,GACI,MAAMzuC,EAAU3F,KAAKa,QAAQ2zB,SAAW,CAAC,EACzC,YAAuBztB,IAAnBpB,EAAQxF,QAA2C,OAAnBwF,EAAQxF,OACjC4zC,GAAuBpuC,EAAQxF,QAAQ,GAI3C6zC,GADMh0C,KAAKW,SAAS4Q,aAAa,wBACN,EACtC,EAEAsjC,kBAAAA,GACI,MAAMnmC,EAAO,GACPomC,EAAc90C,KAAK+0C,sBACnBC,EAAcxuC,OAAOxG,KAAKi1C,cAAcH,IAAgB,IAAIruC,OAClE,GAAoB,KAAhBuuC,EAAoB,CACpB,MAAMR,EAAcx0C,KAAKy0C,gBAAgB,WACnCS,EAAeV,EAAYU,aAAe1uC,OAAOguC,EAAYU,aAAazuC,QAAW,SAC3FiI,EAAKiJ,KAAK,CAAE8T,MAAOypB,EAAahxC,MAAO8wC,GAC3C,CAcA,OAZA5xC,OAAOwgB,KAAK5jB,KAAKi1C,eAAiB,CAAC,GAAG7yC,SAAS3B,IAC3C,GAAIA,IAAQq0C,EACR,OAEJ,MAAM5wC,EAAQsC,OAAOxG,KAAKi1C,cAAcx0C,IAAQ,IAAIgG,OACpD,GAAc,KAAVvC,EACA,OAEJ,MAAMunB,EAAQzrB,KAAKm1C,uBAAuB10C,IAAQA,EAClDiO,EAAKiJ,KAAK,CAAE8T,QAAOvnB,SAAQ,IAGxBwK,CACX,EAEAymC,sBAAAA,CAAuBC,GACnB,MAAMxjC,EAAW5R,KAAKq1C,0BACtB,IAAKzjC,EACD,MAAO,IAGoB5R,KAAKs1C,4BAA8B1jC,IAC1D5R,KAAKu1C,wBACLv1C,KAAKu1C,sBAAsB5F,eAE/B3vC,KAAKs1C,0BAA4B1jC,EACjC5R,KAAKu1C,sBAAwBtB,GAAkBriC,GAC/C5R,KAAKw1C,mBAAqB,CAAC,GAG/B,MAAMjqB,EAAOvrB,KAAKu1C,sBAClB,IAAKhqB,EACD,MAAO,GAGX,MAAMkqB,EAAQz1C,KAAKw1C,oBAAyD,iBAA5Bx1C,KAAKw1C,mBAC/Cx1C,KAAKw1C,mBACL,CAAC,EAEP,GADAx1C,KAAKw1C,mBAAqBC,EACtBryC,OAAO+E,UAAUhE,eAAeiE,KAAKqtC,EAAOL,GAC5C,OAAOK,EAAML,GAGjB,MAAMzvC,EAAU3F,KAAKa,QAAQ60C,SAAW,CAAC,EACnCC,EAAYnvC,OAAOb,EAAQgwC,WAAa,qBAAqBlvC,QAAU,oBACvEmvC,EAAWpvC,OAAOb,EAAQiwC,UAAY,oBAAoBnvC,QAAU,mBACpEovC,EAAkBrvC,OAAO4uC,GAAS,IAAI3uC,OACtCqvC,EAAa,QAAQxe,KAAKue,GAC1BE,EAAWF,EAAgBztB,QAAQ,QAAS,IAC5C4tB,EAAkBF,EAClB,IAAIH,MAAcI,OAAcH,gBAChC,IAAID,MAAcI,MAClBE,EAAU1qB,EAAKhkB,cAAcyuC,GACnC,IAAKC,EAED,OADAR,EAAML,GAAS,GACR,GAEX,MAAMpJ,EAAQiK,EAAQtoC,QAAQ,UACxBuoC,EAAYlK,EAAQA,EAAMzkC,cAAc,iBAAmB,KACjE,GAAI2uC,EAAW,CACX,MAAMzqB,EAAQjlB,OAAO0vC,EAAUr9B,aAAe,IAAIpS,OAElD,OADAgvC,EAAML,GAAS3pB,EACRA,CACX,CAEA,OADAgqB,EAAML,GAAS,GACR,EACX,EAEAe,cAAAA,GACI,IAAKn2C,KAAKo2C,mBACN,OAAO,KAEX,MAAMC,EAAOr2C,KAAKW,SAASgsC,OAAS3sC,KAAKW,SAAS4G,cAAc,SAChE,OAAK8uC,GAASA,EAAKjqB,MAASiqB,EAAKjqB,KAAKhe,SAG/BioC,EAAK9uC,cAAc,uBAAyB8uC,EAAKjqB,KAAK,GAAGM,MAAM,KAF3D,IAGf,EAEA4pB,YAAAA,GACI,MAAM3pB,EAAO3sB,KAAKm2C,iBACbxpB,IAGLA,EAAK7oB,UAAY,GACrB,EAEAyyC,6BAAAA,GACI,IAAKv2C,KAAKo2C,mBACN,OAEJ,GAAIp2C,KAAKs0C,UACL,OAEJ,MACMkC,EADcx2C,KAAKy2C,kBACGnoC,KAAKme,GAAQzsB,KAAK02C,mBAAmBjqB,KACjEzsB,KAAK22C,mBAAmBH,EAAS,KACrC,EAEAI,qBAAAA,CAAsBxqB,EAAM9G,GACnBtlB,KAAKo2C,oBAGLp2C,KAAKs0C,WAGVt0C,KAAK22C,mBAAmBvlC,MAAMiP,QAAQ+L,GAAQA,EAAO,GAAI9G,GAAQ,KACrE,EAEAmxB,eAAAA,GACI,MAAM3vC,EAAO9G,KAAK62C,WAClB,OAAOzlC,MAAMC,KAAKvK,EAAKslB,MAAQ,IAAInqB,QAAQwqB,IAASA,EAAIslB,QAC5D,EAEA2E,kBAAAA,CAAmBjqB,GACf,MAAMqqB,EAAe,CAAC,EAKtB,OAJA92C,KAAK+2C,QAAQ30C,SAAQ,CAAC4pC,EAAO9pB,KACzB,MAAMyK,EAAOF,GAAOA,EAAIC,OAASD,EAAIC,MAAMxK,GAASuK,EAAIC,MAAMxK,GAAS,KACvE40B,EAAa9K,GAASrf,EAAOnmB,OAAOmmB,EAAK9T,aAAe,IAAIpS,OAAS,EAAE,IAEpEqwC,CACX,EAEAH,kBAAAA,CAAmBH,EAASlxB,GACxB,IAAKtlB,KAAKo2C,mBACN,OAEJ,MAAMzpB,EAAO3sB,KAAKm2C,iBAClB,IAAKxpB,EACD,OAGJ,MAAMP,EAAOhb,MAAMiP,QAAQm2B,GAAWA,EAAU,GAC1CQ,EAAe5qB,EAAKhe,OAC1B,IAAI6oC,EAAW,EACXC,EAAW,EACXC,EAAY,EACZC,EAAc,EAElBhrB,EAAKhqB,SAASqqB,IACV,MAAM4qB,EAAQr3C,KAAKs3C,eAAe7qB,EAAI4qB,OAClCxiC,OAAOI,SAASoiC,KAChBJ,GAAYI,GAGhB,MAAME,EAAQv3C,KAAKs3C,eAAe7qB,EAAI8qB,OAClC1iC,OAAOI,SAASsiC,KAChBL,GAAYK,GAGhB,MAAMC,EAASx3C,KAAKs3C,eAAe7qB,EAAI+qB,QACnC3iC,OAAOI,SAASuiC,KAChBL,GAAaK,EACbJ,GAAe,EACnB,IAGJ,MAAMK,EAAYL,EAAc,EAAKD,EAAYC,EAAe,EAE1D5C,EAAcx0C,KAAKy0C,gBAAgB,WACnCiD,EAAoBlD,EAAYkD,kBAAoBlxC,OAAOguC,EAAYkD,kBAAkBjxC,QAAW,eACpGkxC,EAAqBnD,EAAYmD,mBAAqBnxC,OAAOguC,EAAYmD,mBAAmBlxC,QAAW,YACvGmxC,EAAqBpD,EAAYoD,mBAAqBpxC,OAAOguC,EAAYoD,mBAAmBnxC,QAAW,cACvGoxC,EAAsBrD,EAAYqD,oBAAsBrxC,OAAOguC,EAAYqD,oBAAoBpxC,QAAW,iBAC1GkuC,EAAcH,EAAYG,YAAcnuC,OAAOguC,EAAYG,YAAYluC,QAAW,QAElFqxC,EAAexyB,GAAQliB,OAAO+E,UAAUhE,eAAeiE,KAAKkd,EAAM,SAClEzQ,OAAOw3B,SAAS/mB,EAAK0B,MAAO,IAC5BioB,IAEA8I,EADWljC,OAAOI,SAAS6iC,IAAiBA,GAAgB,EAE5D,oCAAoC93C,KAAK8xC,YAAY6C,WAAoBmD,WACzE,GAEAE,EAAiBnjC,OAAOI,SAASgiC,GAAYA,EAAW,EACxDgB,EAAiBpjC,OAAOI,SAASiiC,GAAYA,EAAW,EACxDgB,EAAkBrjC,OAAOI,SAASwiC,GAAaA,EAAY,EAEjE9qB,EAAK7oB,UAAY,2FAE0B9D,KAAK8xC,YAAY4F,WAA0BV,6BAC5Ee,uDACiC/3C,KAAK8xC,YAAY6F,WAA2BK,EAAeG,QAAQ,mEACnEn4C,KAAK8xC,YAAY8F,WAA2BziC,KAAK2D,MAAMm/B,+DACvDj4C,KAAK8xC,YAAY+F,WAA4BK,EAAgBC,QAAQ,yCAGpH,EAEA/B,gBAAAA,GACI,MAAMzwC,EAAU3F,KAAKa,QAAQitB,QAAU,CAAC,EACxC,YAAuB/mB,IAAnBpB,EAAQxF,QAA2C,OAAnBwF,EAAQxF,OACjC4zC,GAAuBpuC,EAAQxF,QAAQ,GAI3C6zC,GADMh0C,KAAKW,SAAS4Q,aAAa,uBACN,EACtC,EAEA6mC,sBAAAA,GACI,MAAM/B,EAAOr2C,KAAKW,SAASgsC,OAAS3sC,KAAKW,SAAS4G,cAAc,SAC3D8uC,IAGLA,EAAKtE,QAAU/xC,KAAKo2C,mBACxB,EAEAiC,iBAAAA,CAAkBrM,EAAO9nC,GACrB,GAAc,UAAV8nC,EAAmB,CACnB,MAAMsM,EAASzjC,OAAOC,WAAW5Q,GACjC,OAAI2Q,OAAOI,SAASqjC,GACT,GAAGA,EAAOH,QAAQ,SAEtB,EACX,CAEA,MAAc,aAAVnM,GAAyB9nC,SAAmD,KAAVA,EAI/DA,QAAwC,GAAKsC,OAAOtC,GAHhD,GAIf,EAEA4tC,YAAY5tC,GACDsC,OAAOtC,GACTkkB,QAAQ,KAAM,SACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,UACdA,QAAQ,KAAM,UAI3B,MCpJA,GAvIwB,CACpBmwB,sBAAAA,GACI,MAAMzxC,EAAO9G,KAAK62C,WACZhO,EAAU7oC,KAAKw4C,2BACfC,EAAez4C,KAAK04C,4BACpBC,EAAY34C,KAAK44C,wBACjBC,EAAY74C,KAAK84C,0BACjBC,EAAiBlkC,OAAOI,SAAS4jC,IAAcA,EAAY,EAC3D,UAAUA,kCAA0CA,OACpD,GAEAG,EAAU5nC,MAAMC,KAAK,CAAEjD,OAAQuqC,IAAarqC,KAAI,CAAC2qC,EAAGC,KACtD,MAAMxsB,EAAQtb,MAAMC,KAAK,CAAEjD,OAAQy6B,IAAWv6B,KAAI,CAAC2qC,EAAGhL,KAClD,MAAMx5B,EAAQI,OAAOI,SAASwjC,EAAaxK,IAAgB94B,KAAK2D,MAAM2/B,EAAaxK,IAAgB,EAInG,MAAO,MAHYx5B,EAAQ,EACrB,iBAAiBA,iBAAqBA,iBAAqBA,QAC3D,4EAC2F,IAClG+O,KAAK,IACR,MAAO,mCAAmCu1B,sBAA8C,IAAXG,GAAiBf,QAAQ,QAAQzrB,QAAY,IAC3HlJ,KAAK,IAER1c,EAAKhD,UAAYk1C,EACjBh5C,KAAKyxC,2BACLzxC,KAAKm5C,8BACT,EAEAX,wBAAAA,GACI,MAAMY,EAAcp5C,KAAKq5C,kBAAkBjrC,OACrCkrC,EAAct5C,KAAK+2C,QAAQ3oC,OAC3BmY,EAAWpR,KAAKC,IAAIgkC,EAAaE,GACvC,OAAO/yB,EAAW,EAAIA,EAAW,CACrC,EAEAmyB,yBAAAA,GACI,MACMa,EADUv5C,KAAKq5C,kBACQ/qC,KAAKgS,IAC9B,IAAKA,GAAkD,mBAAjCA,EAAOhQ,sBACzB,OAAO,EAEX,MAAMD,EAAOiQ,EAAOhQ,wBACpB,OAAOD,GAAQwE,OAAOI,SAAS5E,EAAKoE,QAAUpE,EAAKoE,MAAQ,EAAIpE,EAAKoE,MAAQ,CAAC,IAGjF,GAAI8kC,EAAathB,MAAMxjB,GAAUA,EAAQ,IACrC,OAAO8kC,EAGX,MAAMzyC,EAAO9G,KAAK62C,WACZ2C,EAAW1yC,GAAQA,EAAKslB,MAAQtlB,EAAKslB,KAAKhe,OAAStH,EAAKslB,KAAK,GAAK,KACxE,OAAKotB,GAAaA,EAAS9sB,OAAU8sB,EAAS9sB,MAAMte,OAI7CgD,MAAMC,KAAKmoC,EAAS9sB,OAAOpe,KAAKqe,IACnC,IAAKA,GAA8C,mBAA/BA,EAAKrc,sBACrB,OAAO,EAEX,MAAMD,EAAOsc,EAAKrc,wBAClB,OAAOD,GAAQwE,OAAOI,SAAS5E,EAAKoE,QAAUpE,EAAKoE,MAAQ,EAAIpE,EAAKoE,MAAQ,CAAC,IARtE,EAUf,EAEAmkC,qBAAAA,GACI,MAAMa,EAAqBz5C,KAAK05C,0BAChC,GAAI7kC,OAAOI,SAASwkC,IAAuBA,EAAqB,EAC5D,OAAOA,EAGX,MAAME,EAAiB35C,KAAKa,QAAQ+4C,SAAW,CAAC,EAC1CC,EAAWhlC,OAAOw3B,SAASsN,EAAeG,SAAU,IAC1D,GAAIjlC,OAAOI,SAAS4kC,IAAaA,EAAW,EACxC,OAAOA,EAGX,MAAME,EAAe/5C,KAAKg6C,uBAC1B,GAAID,EAAa3rC,OAAS,EACtB,OAAO2rC,EAAa3rC,OAGxB,MAAM6rC,EAAYplC,OAAOw3B,SAASrsC,KAAKk6C,YAAcl6C,KAAKk6C,WAAWC,QAAS,IAC9E,GAAItlC,OAAOI,SAASglC,IAAcA,EAAY,EAC1C,OAAOA,EAGX,MAAMG,EAAap6C,KAAKa,QAAQu5C,YAAc,CAAC,EACzCC,EAAaxlC,OAAOw3B,SAAS+N,EAAWD,QAAS,IACvD,OAAItlC,OAAOI,SAASolC,IAAeA,EAAa,EACrCA,EAGJ,EACX,EAEAX,uBAAAA,GACI,IAAK15C,KAAKwnC,QACN,OAAOyH,IAEX,MAAMqL,EAAiBt6C,KAAKwnC,QAAQjgC,cAAc,mBAClD,IAAK+yC,EACD,OAAOrL,IAEX,MAAM/qC,EAAQ2Q,OAAOw3B,SAASiO,EAAep2C,MAAO,IACpD,OAAO2Q,OAAOI,SAAS/Q,GAASlE,KAAKu6C,cAAcr2C,EAAO,IAAM+qC,GACpE,EAEA6J,uBAAAA,GACI,MAAMiB,EAAe/5C,KAAKg6C,uBAC1B,IAAKD,EAAa3rC,OACd,OAAO,KAGX,MACMiC,EADW0pC,EAAa,GACRzpC,wBACtB,OAAKD,IAASwE,OAAOI,SAAS5E,EAAKG,SAAWH,EAAKG,QAAU,EAClD,KAGJ2E,KAAK2D,MAAMzI,EAAKG,OAC3B,EAEAwpC,oBAAAA,GACI,MAAMlzC,EAAO9G,KAAK62C,WAClB,OAAOzlC,MAAMC,KAAKvK,EAAKslB,MAAQ,IAAInqB,QAAQwqB,MAClCA,GAAOA,EAAItrB,UAAUE,SAAS,iBAG/BorB,EAAIllB,cAAc,wBAK9B,GCpIEizC,GAAqB,CACvBC,4BAAAA,CAA6Br2C,EAAQ,IACjC,MAAMgC,EAAiBpG,KAAKa,QAAQwF,SAAW,CAAC,EAC1Cq0C,EAAa16C,KAAKW,SAAS4Q,aAAa,uBACxCopC,EAAkB36C,KAAKW,SAAS4Q,aAAa,4BAC7CqpC,EAAa56C,KAAKW,SAAS4Q,aAAa,uBAC9C,IAAIspC,EAAiB,CAAC,EAEtB,GAAmB,OAAfD,GAAqD,KAA9Bp0C,OAAOo0C,GAAYn0C,OAC1C,IACI,MAAMmsC,EAAS3uB,KAAK/c,MAAM0zC,GACtBhI,GAA4B,iBAAXA,IAAwBxhC,MAAMiP,QAAQuyB,KACvDiI,EAAiBjI,EAEzB,CAAE,MAAOxjC,GACLyrC,EAAiB,CAAC,CACtB,CAGJ,MAAO,CACHz2C,MAAOA,GAASpE,KAAK86C,sBACrBz2C,OAAuB,OAAfq2C,EAAsBA,EAAat0C,EAAe/B,OAC1DsC,YAAiC,OAApBg0C,EAA2BA,EAAkBv0C,EAAeO,YACzEC,QAASR,EAAeQ,SAA6C,iBAA3BR,EAAeQ,QACnDxD,OAAO6C,OAAO,CAAC,EAAGG,EAAeQ,SACjC,CAAE,OAAU,oBAClBT,WAAY/C,OAAO6C,OACf,CAAC,EACDG,EAAerD,QAA2C,iBAA1BqD,EAAerD,OAAsBqD,EAAerD,OAAS,CAAC,EAC9F83C,GAEJ5zC,aAAc,OAEtB,EAEA8zC,qBAAAA,GACI,MAAM30C,EAAiBpG,KAAKa,QAAQwF,SAAW,CAAC,EAC1C20C,EAAsB50C,EAAeqvC,OAAyC,iBAAzBrvC,EAAeqvC,MACpErvC,EAAeqvC,MACf,CAAC,EACDvsB,EAAOlpB,KAAKW,SAAS4Q,aAAa,6BACxC,GAAa,OAAT2X,EACA,OAAOlpB,KAAKi7C,UAAU/xB,GAE1B,MAAMgyB,EAAcF,EAAoB76C,OACxC,OAAI+6C,SAGGnjC,QAAQmjC,EACnB,EAEAC,oBAAAA,GACI,MAAM/0C,EAAiBpG,KAAKa,QAAQwF,SAAW,CAAC,EAC1C20C,EAAsB50C,EAAeqvC,OAAyC,iBAAzBrvC,EAAeqvC,MACpErvC,EAAeqvC,MACf,CAAC,EACDvsB,EAAOlpB,KAAKW,SAAS4Q,aAAa,0BAClCw3B,EAAe,OAAT7f,EAAgBA,EAAO8xB,EAAoBI,IACjDxI,EAAS/9B,OAAOw3B,SAAStD,EAAK,IACpC,OAAOl0B,OAAOI,SAAS29B,IAAWA,EAAS,EAAIA,EAAS,GAC5D,EAEAyI,yBAAAA,GACI,MAAMj1C,EAAiBpG,KAAKa,QAAQwF,SAAW,CAAC,EAC1C20C,EAAsB50C,EAAeqvC,OAAyC,iBAAzBrvC,EAAeqvC,MACpErvC,EAAeqvC,MACf,CAAC,EACDvsB,EAAOlpB,KAAKW,SAAS4Q,aAAa,0BAClCw3B,EAAe,OAAT7f,EAAgBA,EAAO8xB,EAAoB5lC,IACjDw9B,EAAS/9B,OAAOw3B,SAAStD,EAAK,IACpC,OAAOl0B,OAAOI,SAAS29B,IAAWA,EAAS,EAAIA,EAAS,EAC5D,EAEA0I,kBAAAA,CAAmBt1C,EAAUjD,EAAS,CAAC,GACnC,MACMw4C,EADOn4C,OAAOwgB,KAAK7gB,GAAU,CAAC,GAAGupC,OACpBh+B,KAAK7N,IACpB,MAAMyD,EAAQnB,EAAOtC,GACfwiB,EAAa7R,MAAMiP,QAAQnc,GAC3BA,EAAMsf,KAAK,KACXhd,OAAOtC,QAAwC,GAAKA,GAC1D,MAAO,GAAGs3C,mBAAmB/6C,MAAQ+6C,mBAAmBv4B,IAAa,IACtEO,KAAK,KACR,MAAO,GAAGhd,OAAOR,GAAY,IAAIS,UAAU80C,GAC/C,EAEAE,gBAAAA,CAAiBz1C,EAAUjD,EAAS,CAAC,GACjC,IAAK/C,KAAK+6C,wBACN,OAAO,KAEX,IAAK/6C,KAAK07C,kBAAyD,mBAA9B17C,KAAK07C,iBAAiBz4C,IACvD,OAAO,KAEX,MAAMxC,EAAMT,KAAKs7C,mBAAmBt1C,EAAUjD,GACxC0qC,EAAQztC,KAAK07C,iBAAiBz4C,IAAIxC,GACxC,IAAKgtC,GAA0B,iBAAVA,EACjB,OAAO,KAEX,MAAM2F,EAAQpzC,KAAKm7C,uBACbQ,EAAM9Y,KAAKmL,MAAQn5B,OAAO44B,EAAMmO,IAAM,GAC5C,OAAK/mC,OAAOI,SAAS0mC,IAAQA,EAAM,GAAKA,EAAMvI,GAC1CpzC,KAAK07C,iBAAiBh2C,OAAOjF,GACtB,OAEXgtC,EAAMoO,WAAahZ,KAAKmL,MACjBP,EAAM5pC,SACjB,EAEAi4C,iBAAAA,CAAkB91C,EAAUjD,EAAS,CAAC,EAAGc,GACrC,IAAK7D,KAAK+6C,wBACN,OAEJ,IAAK/6C,KAAK07C,kBAAyD,mBAA9B17C,KAAK07C,iBAAiB94C,IACvD,OAEJ,MAAMnC,EAAMT,KAAKs7C,mBAAmBt1C,EAAUjD,GAC9C/C,KAAK07C,iBAAiB94C,IAAInC,EAAK,CAC3Bm7C,GAAI/Y,KAAKmL,MACT6N,WAAYhZ,KAAKmL,MACjBnqC,aAGJ,MAAMk4C,EAAa/7C,KAAKq7C,4BACxB,GAAIr7C,KAAK07C,iBAAiBntB,MAAQwtB,EAC9B,OAEJ,MAAMvxB,EAAUpZ,MAAMC,KAAKrR,KAAK07C,iBAAiBlxB,WAEjD,IADAA,EAAQ8hB,MAAK,CAACphB,EAAGqhB,IAAM13B,OAAQqW,EAAE,IAAMA,EAAE,GAAG2wB,YAAe,GAAKhnC,OAAQ03B,EAAE,IAAMA,EAAE,GAAGsP,YAAe,KAC7F77C,KAAK07C,iBAAiBntB,KAAOwtB,GAAcvxB,EAAQpc,QAAQ,CAC9D,MAAMslB,EAAOlJ,EAAQ6jB,QACjB3a,GACA1zB,KAAK07C,iBAAiBh2C,OAAOguB,EAAK,GAE1C,CACJ,EAEAsoB,oBAAAA,CAAqBn4C,EAAUo4C,EAAUC,EAAaC,EAAe,KAAMx2C,EAAU,CAAC,GAClF,MAAMymB,EAAOpsB,KAAKo8C,mBAAmBv4C,GAC/ByhB,EAAOtlB,KAAKq8C,mBAAmBx4C,GAC/By4C,EAAYvkC,QAAQpS,EAAQ22C,WAC5BC,EAAiB52C,EAAQ42C,gBAAoD,iBAA3B52C,EAAQ42C,eAC1D52C,EAAQ42C,eACR,KACAz3B,EAAYte,OACb8e,IAASA,EAAKP,YAAcO,EAAKR,YAC9By3B,GAAkBA,EAAez3B,WAClC,IACLre,OACFzG,KAAKw8C,gBAAkBl3B,EACvBtlB,KAAKm0C,eAAe7uB,GAEpB,MAAMm3B,EAAez8C,KAAK08C,2BAA2B74C,GAC/B7D,KAAK28C,8BAA8BF,EAAcrwB,IAEnEpsB,KAAK48C,kBAAkBxwB,GAE3BpsB,KAAK42C,sBAAsBxqB,EAAM9G,GACjCtlB,KAAKyxC,2BACLzxC,KAAKm5C,+BAEL,MAAM0D,EAAW78C,KAAK88C,sBAAsBx3B,EAAKy3B,KAAMd,GACjDe,EAAch9C,KAAKu6C,cAAcj1B,EAAK23B,SAAUf,GAChDgB,EAAal9C,KAAK88C,sBAAsBx3B,EAAK63B,MAAO,GAC1Dn9C,KAAKk6C,WAAa,CAAE6C,KAAMF,EAAU1C,QAAS6C,GAC7Ch9C,KAAKo9C,WAAWP,GAChB78C,KAAKq9C,cAAcL,GAEnB,MAAMM,EAAgC,iBAAdh4B,EAAKgnB,KAAoBhnB,EAAKgnB,KAAK7lC,OAASzG,KAAKu9C,WAAWvR,MAC9EwR,EAAUl4B,GAA4B,iBAAbA,EAAK2R,IAAmB3R,EAAK2R,IAAMj3B,KAAKu9C,WAAWtmB,IAClF,GAAIqmB,EAAU,CACV,MAAMG,EAAYz9C,KAAK09C,uBAAuBJ,EAAUE,GACxDx9C,KAAKu9C,WAAan6C,OAAO6C,OAAO,CAAC,EAAGjG,KAAKu9C,WAAY,CACjDvR,MAAOyR,EAAU,GAAKA,EAAU,GAAGzR,MAAQsR,EAC3CrmB,IAAKwmB,EAAU,GAAKA,EAAU,GAAGxmB,IAAMj3B,KAAK29C,kBAAkBH,GAC9DI,MAAOH,IAEPz9C,KAAK69C,WACL79C,KAAK69C,UAAUC,SAAS,CACpBF,MAAO59C,KAAKu9C,WAAWK,OAGnC,CAEI59C,KAAK+9C,aACL/9C,KAAK+9C,YAAYC,QAAQ,CACrBjB,KAAMF,EACN1C,QAAS6C,EACTE,eAIoB,mBAAjBf,GACPA,EAAa,CACTY,KAAMF,EACN1C,QAAS6C,EACTE,eAGRl9C,KAAKi+C,gBACL,MAAMC,EAAW,CACb9xB,KAAMhb,MAAMiP,QAAQ+L,GAAQA,EAAKvK,QAAU,GAC3CmF,MAAOhnB,KAAK88C,sBAAsBx3B,GAAQA,EAAK0B,MAAO5V,MAAMiP,QAAQ+L,GAAQA,EAAKhe,OAAS,GAC1F+vC,WAAY/6C,OAAO6C,OAAO,CAAC,EAAGqf,GAAQ,CAAC,GACvCyjB,IAAKllC,GAEHu6C,EAAO7B,GAAkBA,EAAe6B,KACxCh7C,OAAO6C,OAAO,CAAC,EAAGs2C,EAAe6B,MACjC,CAAC,EACDC,EAAiB9B,GAAoD,iBAA3BA,EAAev7B,QACzDxa,OAAO+1C,EAAev7B,SAASxb,cAAciB,OAC7C,GACA63C,EAAsB/B,GAAkBA,EAAegC,cAAuD,iBAAhChC,EAAegC,aAC7Fv+C,KAAKw+C,4BAA4BjC,EAAegC,cAChD,KACN,GAAuB,kBAAnBF,GAAsCr+C,KAAKy+C,mCAAoC,CAC/E,MAAMC,EAAgB1+C,KAAKw+C,4BAA4B,CACnD9I,QAAS0I,EAAK1I,SAAW,CAAC,EAC1B3yC,OAAQq7C,EAAKr7C,QAAU,CAAC,IAEtB47C,EAAaL,GAAuBI,EACpCE,EAAa5+C,KAAK6+C,0BAA0BT,EAAKr7C,QAAU,CAAC,GAClE/C,KAAKwtC,YAAY,gBAAiB,CAC9BkI,QAAStyC,OAAO6C,OAAO,CAAC,EAAG04C,EAAWjJ,SAAW,CAAC,GAClD3yC,OAAQK,OAAO6C,OAAO,CAAC,EAAG04C,EAAW57C,QAAU,CAAC,GAChD44B,OAAQvqB,MAAMiP,QAAQs+B,EAAWhjB,QAAUgjB,EAAWhjB,OAAO9Z,QAAU,GACvEyD,KAAMliB,OAAO6C,OAAO,CAAC,EAAG04C,EAAWr5B,MAAQ,CAAC,GAC5C4oB,MAAO,WACP4Q,WAAY9+C,KAAK++C,iBAAiBJ,IAAeC,EACjDA,aACA95B,YACAw3B,YACA8B,OACAF,WACAr6C,WACAs6C,WAAY/6C,OAAO6C,OAAO,CAAC,EAAGi4C,EAASC,YAAc,CAAC,IAE9D,CACAn+C,KAAKwtC,YAAY,iBAAkB,CAC/B1oB,YACA+E,KAAM,SACNm1B,aAAch/C,KAAKi/C,yBACnBb,OACAF,WACA5B,cAEJt8C,KAAKwtC,YAAY,aAAc,CAC3B1oB,YACAi4B,KAAMF,EACN1C,QAAS6C,EACTE,aACA9wB,OACA8yB,KAAMzC,EACNn3B,OACAg3B,YACA8B,OACAF,aAEJl+C,KAAKwtC,YAAY,cAAe,CAC5B1oB,YACAq6B,cAAe/tC,MAAMiP,QAAQ+L,GAAQA,EAAKhe,OAAS,EACnD4Y,MAAOk3B,EAASl3B,MAChBo3B,OACAF,aAEJl+C,KAAKwtC,YAAY,YAAa,CAC1B1oB,YACAlM,MAAO,CACHmkC,KAAMF,EACN1C,QAAS6C,EACTY,MAAO59C,KAAKo/C,oBAAoBp/C,KAAKu9C,WAAWK,OAChDlI,QAAStyC,OAAO6C,OAAO,CAAC,EAAGjG,KAAKq/C,gBAAkB,CAAC,GACnDt8C,OAAQK,OAAO6C,OAAO,CAAC,EAAGjG,KAAKi1C,eAAiB,CAAC,IAErDmJ,OACAF,aAEC9sC,MAAMiP,QAAQ+L,IAAyB,IAAhBA,EAAKhe,QAC7BpO,KAAKwtC,YAAY,cAAe,CAC5B1oB,YACAmd,OAAQ,aACRmc,OACAF,YAGZ,EAEAoB,yBAAAA,CAA0BvC,EAAM5C,GAC5B,MAAMoF,EAAcv/C,KAAKa,QAAQ2+C,UAAY,CAAC,EACxCC,EAAgB,CAClB1C,OACAE,SAAU9C,GAKd,GAHA/2C,OAAO6C,OAAOw5C,EAAez/C,KAAKi1C,eAGb,SADAj1C,KAAKi/C,yBACG,CACzB,MAAMS,EAAY1/C,KAAK2/C,0BACjBC,EAAY5/C,KAAK6/C,2BACnBH,GAAaE,IAAcx8C,OAAO+E,UAAUhE,eAAeiE,KAAKq3C,EAAeC,KAC/ED,EAAcC,GAAaE,GAG/B,MAAME,EAAc9/C,KAAK+/C,4BACrBD,GAAe9/C,KAAK+2C,QAAQ3oC,SAAWhL,OAAO+E,UAAUhE,eAAeiE,KAAKq3C,EAAeK,KAC3FL,EAAcK,GAAe9/C,KAAK+2C,QAAQvzB,KAAK,KAEvD,CAEA,GAAI+7B,EAAYp/C,QAAUH,KAAKu9C,WAAWvR,MAAO,CAC7C,MAAMgU,EAAmB,OACnBC,EAAiB,MACjBrC,EAAQ59C,KAAKo/C,oBAAoBp/C,KAAKu9C,WAAWK,OACnDA,EAAMxvC,OAAS,GACfqxC,EAAcO,GAAoBpC,EAAMtvC,KAAKwB,GAASA,EAAKk8B,QAAOxoB,KAAK,KACvEi8B,EAAcQ,GAAkBrC,EAAMtvC,KAAKwB,GAASA,EAAKmnB,MAAKzT,KAAK,OAEnEi8B,EAAcO,GAAoBhgD,KAAKu9C,WAAWvR,MAClDyT,EAAcQ,GAAkBjgD,KAAKu9C,WAAWtmB,IAExD,CAEA,OAAOwoB,CACX,EAEAS,YAAAA,CAAaC,EAAS,MAAOx6C,EAAU,CAAC,GACpC,IAAK3F,KAAKs0C,UACN,MAAO,GAEX,MAAMluC,EAAiBpG,KAAKa,QAAQwF,SAAW,CAAC,EAE1C+5C,EAAoE,SAAjD55C,OAAO25C,GAAU,OAAO36C,cAAciB,OACzD,OACA,MACAw1C,EAAWj8C,KAAK88C,2BACD/1C,IAAjBpB,EAAQo3C,KAAqBp3C,EAAQo3C,KAAO/8C,KAAKk6C,WAAW6C,KAC5D,GAEEb,EAAcl8C,KAAKu6C,mBACDxzC,IAApBpB,EAAQw0C,QAAwBx0C,EAAQw0C,QAAUn6C,KAAKk6C,WAAWC,QAClEn6C,KAAKqgD,sBAGHZ,EAAgBz/C,KAAKs/C,0BAA0BrD,EAAUC,GAC/DuD,EAAcU,OAASC,EACvB,MAAME,EAAsBtgD,KAAKugD,wBAAwBd,GAOnDe,EANWh6C,OACbb,EAAQK,UACJI,EAAeq6C,QAAUr6C,EAAeq6C,OAAOr8C,OAChDpE,KAAKW,SAAS4Q,aAAa,8BAC3BvR,KAAK86C,uBACVr0C,QACiCzG,KAAK86C,sBAClC4F,EAAY1gD,KAAK+F,eACnBu6C,EACAE,EACAxgD,KAAKy6C,6BAA6B+F,IACpCp8B,WAYF,OAXqB,IAAjBze,EAAQghB,MAAoC,oBAAXtR,QAAiD,mBAAhBA,OAAOsR,MACzEtR,OAAOsR,KAAK+5B,EAAW,SAAU,YAGrC1gD,KAAKwtC,YAAY,SAAU,CACvB2S,OAAQC,EACRrD,KAAMd,EACN9B,QAAS+B,EACTl2C,SAAUw6C,EACVr0C,IAAKu0C,IAEFA,CACX,EAEA,qBAAMC,CAAgB5D,EAAM5C,EAASgC,EAAe,KAAMyE,EAAc,MACpE,IAAK5gD,KAAKs0C,UACN,OAGJ,MAAM2H,EAAWj8C,KAAK88C,sBAAsBC,EAAM,GAC5Cb,EAAcl8C,KAAKu6C,cAAcJ,EAASn6C,KAAKqgD,sBAC/CQ,IAAiB7gD,KAAK8gD,cACtBh8B,EAAY,OAAO+d,KAAKmL,SAAS6S,IACjCpB,EAAgBz/C,KAAKs/C,0BAA0BrD,EAAUC,GACzDoE,EAAsBtgD,KAAKugD,wBAAwBd,GACnDz5C,EAAWhG,KAAK86C,sBAChBiG,EAAiB/gD,KAAKa,QAAQ60C,SAAW,CAAC,GAIlB,KAHZqL,EAAeC,WAAiD,iBAA7BD,EAAeC,UAC9DD,EAAeC,UACf,CAAC,GACOC,cACVX,EAAoBv7B,WAAaD,EACjCw7B,EAAoBtB,aAAeh/C,KAAKi/C,0BAE5C,MAAMb,EAAO,CACT1I,QAAStyC,OAAO6C,OAAO,CAAC,EAAGjG,KAAKq/C,gBAAkB,CAAC,GACnD/S,KAAMtsC,KAAKo/C,oBAAoBp/C,KAAKu9C,WAAWK,OAAS,IACxDb,KAAMd,EACN9B,QAAS+B,EACTn5C,OAAQK,OAAO6C,OAAO,CAAC,EAAGjG,KAAKi1C,eAAiB,CAAC,GACjDiM,SAAUlhD,KAAKmhD,mBACfC,eAAgBh+C,OAAO6C,OAAO,CAAC,EAAGq6C,GAClCt6C,YAEEgb,EAAU4/B,GAA8C,iBAAxBA,EAAY5/B,QAC5Cxa,OAAOo6C,EAAY5/B,SAASxb,cAAciB,OAC1C,GACA83C,EAAeqC,GAAeA,EAAYrC,cAAoD,iBAA7BqC,EAAYrC,aAC7Ev+C,KAAKw+C,4BAA4BoC,EAAYrC,cAC7C,KACAhC,EAAiB,CACnBz3B,YACAs5B,OACAp9B,UACAu9B,gBAEJv+C,KAAKqhD,uBAAyBv8B,EAC9B,MAAMw8B,EAAiBthD,KAAKy7C,iBAAiBz1C,EAAUs6C,GACvD,GAAgB,kBAAZt/B,GAA+BhhB,KAAKy+C,mCAAoC,CACxE,MAAME,EAAaJ,GAAgBv+C,KAAKw+C,4BAA4B,CAChE9I,QAAS0I,EAAK1I,SAAW,CAAC,EAC1B3yC,OAAQq7C,EAAKr7C,QAAU,CAAC,IAEtB67C,EAAa5+C,KAAK6+C,0BAA0BT,EAAKr7C,QAAU,CAAC,GAClE/C,KAAKwtC,YAAY,gBAAiB,CAC9BkI,QAAStyC,OAAO6C,OAAO,CAAC,EAAG04C,EAAWjJ,SAAW,CAAC,GAClD3yC,OAAQK,OAAO6C,OAAO,CAAC,EAAG04C,EAAW57C,QAAU,CAAC,GAChD44B,OAAQvqB,MAAMiP,QAAQs+B,EAAWhjB,QAAUgjB,EAAWhjB,OAAO9Z,QAAU,GACvEyD,KAAMliB,OAAO6C,OAAO,CAAC,EAAG04C,EAAWr5B,MAAQ,CAAC,GAC5C4oB,MAAO,UACP4Q,WAAY9+C,KAAK++C,iBAAiBJ,IAAeC,EACjDA,aACA95B,YACAw3B,UAAWvkC,QAAQupC,GACnBlD,OACAjyB,MAAO,MAEf,CACInsB,KAAKuhD,yBAAyE,mBAAvCvhD,KAAKuhD,wBAAwBl6B,OACpErnB,KAAKuhD,wBAAwBl6B,QAEjC,MAAMm6B,EAAyBF,EAAiB,KAAmC,mBAApBG,gBACzD,IAAIA,gBACJ,KACNzhD,KAAKuhD,wBAA0BC,EAC/B,MAAME,EAAmB7e,KAAKmL,MAC9BhuC,KAAKwtC,YAAY,aAAc,CAC3B1oB,YACAi4B,KAAMd,EACN9B,QAAS+B,EACTn5C,OAAQK,OAAO6C,OAAO,CAAC,EAAGjG,KAAKi1C,eAC/BmJ,SAECkD,GACDthD,KAAKu4C,yBAGT,IACI,MAAM10C,EAAWy9C,SAAwBthD,KAAKsD,OAAOF,OAAO6C,OACxD,CAAC,EACDjG,KAAKy6C,6BAA6Bz0C,GAClC,CACI5B,MAAO4B,EACP3B,OAAQ,MACRtB,OAAQu9C,EACRt5C,OAAQw6C,EAAyBA,EAAuBx6C,YAASD,EACjEE,aAAc,UAOtB,GAJKq6C,SACKthD,KAAK2hD,qBAAqBD,GAGhCb,IAAiB7gD,KAAK8gD,cAMtB,YALA9gD,KAAKwtC,YAAY,gBAAiB,CAC9B1oB,YACA88B,gBAAiBp7C,OAAOxG,KAAKqhD,wBAA0B,IACvDjD,SAKHkD,GACDthD,KAAK87C,kBAAkB91C,EAAUs6C,EAAqBz8C,GAE1D7D,KAAKg8C,qBAAqBn4C,EAAUo4C,EAAUC,EAAaC,EAAc,CACrEG,UAAWvkC,QAAQupC,GACnB/E,kBAER,CAAE,MAAOntC,GACL,GAAIA,GAAwB,eAAfA,EAAMzD,KACf,OAGJ,SADM3L,KAAK2hD,qBAAqBD,GAC5Bb,IAAiB7gD,KAAK8gD,cAMtB,YALA9gD,KAAKwtC,YAAY,gBAAiB,CAC9B1oB,YACA88B,gBAAiBp7C,OAAOxG,KAAKqhD,wBAA0B,IACvDjD,SAIRp+C,KAAKm0C,eAAe,CAAEntB,MAAO,IAC7BhnB,KAAKs2C,eACL,MAAMuL,EAAe7hD,KAAK4xC,iBAAiB,aAAc,wBA0BzD,GAzBuB,oBAAZ3jC,SAAoD,mBAAlBA,QAAQmB,OACjDnB,QAAQmB,MAAM,0CAA2CA,GAE7DpP,KAAK8hD,gBAAgBD,EAAc,SACnC7hD,KAAKm5C,+BACLn5C,KAAKwtC,YAAY,QAAS,CACtB1oB,YACAi4B,KAAMd,EACN9B,QAAS+B,EACT9sC,QACA+B,QAAS0wC,EACTzD,SAEJp+C,KAAKwtC,YAAY,eAAgB,CAC7B1oB,YACA+E,KAAM,SACNm1B,aAAch/C,KAAKi/C,yBACnBb,OACAhvC,MAAO,CACH+B,QAAS3K,OAAQ4I,GAASA,EAAM+B,SAAY0wC,GAC5Cj9B,KAAMpe,OAAQ4I,GAASA,EAAMwV,MAAS,kBACtC9f,OAAQsK,GAASA,EAAMtK,OAASsK,EAAMtK,OAAS,EAC/C+f,QAASzV,GAASgC,MAAMiP,QAAQjR,EAAMyV,SAAWzV,EAAMyV,QAAQhD,QAAU,MAG7E06B,GAAgF,kBAA9D/1C,OAAO+1C,EAAev7B,SAAW,IAAIxb,cAAciB,QAA8BzG,KAAKy+C,mCAAoC,CAC5I,MAAME,EAAapC,EAAegC,cAAuD,iBAAhChC,EAAegC,aAClEv+C,KAAKw+C,4BAA4BjC,EAAegC,cAChDv+C,KAAKw+C,4BAA4B,CAC/B9I,QAAS0I,EAAK1I,SAAW,CAAC,EAC1B3yC,OAAQq7C,EAAKr7C,QAAU,CAAC,IAE1B67C,EAAa5+C,KAAK6+C,0BAA0BT,EAAKr7C,QAAU,CAAC,GAClE/C,KAAKwtC,YAAY,gBAAiB,CAC9BkI,QAAStyC,OAAO6C,OAAO,CAAC,EAAG04C,EAAWjJ,SAAW,CAAC,GAClD3yC,OAAQK,OAAO6C,OAAO,CAAC,EAAG04C,EAAW57C,QAAU,CAAC,GAChD44B,OAAQvqB,MAAMiP,QAAQs+B,EAAWhjB,QAAUgjB,EAAWhjB,OAAO9Z,QAAU,GACvEyD,KAAMliB,OAAO6C,OAAO,CAAC,EAAG04C,EAAWr5B,MAAQ,CAAC,GAC5C4oB,MAAO,QACP4Q,WAAY9+C,KAAK++C,iBAAiBJ,IAAeC,EACjDA,aACA95B,YACAs5B,OACAhvC,MAAO,CACH+B,QAAS3K,OAAQ4I,GAASA,EAAM+B,SAAY0wC,GAC5Cj9B,KAAMpe,OAAQ4I,GAASA,EAAMwV,MAAS,kBACtC9f,OAAQsK,GAASA,EAAMtK,OAASsK,EAAMtK,OAAS,EAC/C+f,QAASzV,GAASgC,MAAMiP,QAAQjR,EAAMyV,SAAWzV,EAAMyV,QAAQhD,QAAU,KAGrF,CACJ,CAAE,QACM7hB,KAAKuhD,0BAA4BC,IACjCxhD,KAAKuhD,wBAA0B,KAEvC,CACJ,EAEAtC,sBAAAA,GACI,MAAM74C,EAAiBpG,KAAKa,QAAQwF,SAAW,CAAC,EAC1C07C,EAAmB/hD,KAAKW,SAAS4Q,aAAa,6BAC9Cw3B,EAA2B,OAArBgZ,EAA4BA,EAAmB37C,EAAe44C,aACpE/7B,EAAazc,OAAOuiC,GAAO,QAAQvjC,cAAciB,OACvD,MAAmB,SAAfwc,GAAwC,SAAfA,EAClBA,EAEJ,MACX,EAEA08B,uBAAAA,GACI,MAAMv5C,EAAiBpG,KAAKa,QAAQwF,SAAW,CAAC,EAC1C6iB,EAAOlpB,KAAKW,SAAS4Q,aAAa,0BAClCw3B,EAAe,OAAT7f,EAAgBA,EAAO9iB,EAAe47C,UAElD,OADmBx7C,OAAOuiC,GAAO,IAAItiC,QAChB,EACzB,EAEAo5C,wBAAAA,GACI,MAAMz5C,EAAiBpG,KAAKa,QAAQwF,SAAW,CAAC,EAC1C6iB,EAAOlpB,KAAKW,SAAS4Q,aAAa,0BAClCw3B,EAAe,OAAT7f,EAAgBA,EAAO9iB,EAAe67C,UAElD,OADmBz7C,OAAOuiC,GAAO,IAAItiC,QAChB,EACzB,EAEAs5C,yBAAAA,GACI,MAAM35C,EAAiBpG,KAAKa,QAAQwF,SAAW,CAAC,EAC1C6iB,EAAOlpB,KAAKW,SAAS4Q,aAAa,4BAClCw3B,EAAe,OAAT7f,EAAgBA,EAAO9iB,EAAe87C,YAElD,OADmB17C,OAAOuiC,GAAO,IAAItiC,QAChB,EACzB,EAEAq0C,mBAAAA,GAEI,OADqB96C,KAAKmiD,oBAInBniD,KAAKoiD,WAChB,EAEAC,mBAAAA,GACI,MACMnH,GADiBl7C,KAAKa,QAAQwF,SAAW,CAAC,GACbi8C,SACnC,GAAIpH,GAAsC,iBAAhBA,IAA6B9pC,MAAMiP,QAAQ66B,GACjE,OAAOA,EAGX,MAAMhyB,EAAOlpB,KAAKW,SAAS4Q,aAAa,0BAA4B,GACpE,IAAK2X,EACD,MAAO,CAAC,EAGZ,IACI,MAAM0pB,EAAS3uB,KAAK/c,MAAMgiB,GAC1B,GAAI0pB,GAA4B,iBAAXA,IAAwBxhC,MAAMiP,QAAQuyB,GACvD,OAAOA,CAEf,CAAE,MAAOxjC,GACL,MAAO,CAAC,CACZ,CAEA,MAAO,CAAC,CACZ,EAEAmxC,uBAAAA,CAAwBx9C,EAAS,CAAC,GAC9B,MAAMuL,EAAMlL,OAAO6C,OACf,CAAC,EACDjG,KAAKuiD,8BAA8Bx/C,GACnC/C,KAAKqiD,uBAEHzsB,EAAS,CAAC,EAQhB,OAPAxyB,OAAOwgB,KAAK7gB,GAAU,CAAC,GAAGX,SAAS3B,IAC/B,MAAM6D,EAASlB,OAAO+E,UAAUhE,eAAeiE,KAAKkG,EAAK7N,GACnD+F,OAAO8H,EAAI7N,IAAQ,IAAIgG,OACvBhG,EAENm1B,EADgBtxB,GAAU7D,GACRsC,EAAOtC,EAAI,IAE1Bm1B,CACX,EAEA2sB,6BAAAA,CAA8Bx/C,EAAS,CAAC,GACpC,MAAMwD,EAASxD,GAA4B,iBAAXA,EAC1BA,EACA,CAAC,EACD44B,EAA6C,mBAA7B37B,KAAKwiD,oBACrBxiD,KAAKwiD,sBACL,GACN,IAAKpxC,MAAMiP,QAAQsb,KAAYA,EAAOvtB,OAClC,MAAO,CAAC,EAGZ,MAAMq0C,EAA8C,mBAA9BziD,KAAK0iD,qBACrBl8C,OAAOxG,KAAK0iD,wBAA0B,IAAIj8C,OAC1C,GACN,IAAKg8C,EACD,MAAO,CAAC,EAGZ,MAAME,EAAU,CAAC,EAsBjB,OArBAhnB,EAAOv5B,SAAS4pC,IACZ,MAAM4W,EAAkBp8C,OAAOwlC,GAAS,IAAIvlC,OAC5C,IAAKm8C,EACD,OAEJ,MAAMC,EAAoD,mBAA/B7iD,KAAK8iD,sBAC1B9iD,KAAK8iD,sBAAsBF,EAAiBH,GAC3CG,EAAgBzgD,WAAWsgD,GAAUG,EAAkB,GAAGH,IAASG,IAEtEx/C,OAAO+E,UAAUhE,eAAeiE,KAAK7B,EAAQq8C,KAC7CD,EAAQC,GAAmBC,GAG/B,MAAME,EAAc,GAAGH,OACjBI,EAA0D,mBAA/BhjD,KAAK8iD,sBAChC9iD,KAAK8iD,sBAAsBC,EAAaN,GACvCM,EAAY5gD,WAAWsgD,GAAUM,EAAc,GAAGN,IAASM,IAC9D3/C,OAAO+E,UAAUhE,eAAeiE,KAAK7B,EAAQw8C,KAC7CJ,EAAQI,GAAeC,EAC3B,IAEGL,CACX,EAEAM,eAAAA,CAAgBj3C,GACZ,MAAM5F,EAAiBpG,KAAKa,QAAQwF,SAAW,CAAC,EAChD,GAAa,SAAT2F,EAAiB,CACjB,MAAMk3C,EAAWljD,KAAKW,SAAS4Q,aAAa,yBACtCw3B,EAAmB,OAAbma,EAAoBA,EAAW98C,EAAe+8C,SAC1D,OAAO38C,OAAOuiC,GAAO,IAAItiC,MAC7B,CACA,GAAa,SAATuF,EAAiB,CACjB,MAAMo3C,EAAWpjD,KAAKW,SAAS4Q,aAAa,yBACtCw3B,EAAmB,OAAbqa,EAAoBA,EAAWh9C,EAAei9C,SAC1D,OAAO78C,OAAOuiC,GAAO,IAAItiC,MAC7B,CACA,GAAa,SAATuF,EAAiB,CACjB,MAAMs3C,EAAWtjD,KAAKW,SAAS4Q,aAAa,yBACtCw3B,EAAmB,OAAbua,EAAoBA,EAAWl9C,EAAem9C,SAC1D,OAAO/8C,OAAOuiC,GAAO,IAAItiC,MAC7B,CACA,MAAO,EACX,EAEA+8C,SAAAA,CAAUj9C,EAAQ2F,GACd,IAAK3F,GAA4B,iBAAXA,EAClB,OAEJ,MAAM0c,EAAazc,OAAO0F,GAAQ,IAAIzF,OACtC,IAAKwc,EACD,OAEJ,MAAMwgC,EAAQxgC,EAAWzX,MAAM,KAAK8C,KAAKwB,GAAStJ,OAAOsJ,GAAQ,IAAIrJ,SAAQxE,OAAO8V,SACpF,IAAK0rC,EAAMr1C,OACP,OAEJ,IAAI0rB,EAAUvzB,EACd,IAAK,IAAIykB,EAAI,EAAGA,EAAIy4B,EAAMr1C,OAAQ4c,GAAK,EAAG,CACtC,IAAK8O,GAA8B,iBAAZA,IAAyB12B,OAAO+E,UAAUhE,eAAeiE,KAAK0xB,EAAS2pB,EAAMz4B,IAChG,OAEJ8O,EAAUA,EAAQ2pB,EAAMz4B,GAC5B,CACA,OAAO8O,CACX,EAEAsiB,kBAAAA,CAAmBv4C,GACf,MAAM6/C,EAAa1jD,KAAKwjD,UAAU3/C,EAAU7D,KAAKijD,gBAAgB,SACjE,OAAI7xC,MAAMiP,QAAQqjC,GACPA,EAEJtyC,MAAMiP,QAAQxc,GAAYA,EAASgB,MAAQhB,EAASgB,KAAO,EACtE,EAEAw3C,kBAAAA,CAAmBx4C,GACf,MAAM6/C,EAAa1jD,KAAKwjD,UAAU3/C,EAAU7D,KAAKijD,gBAAgB,SACjE,OAAIS,GAAoC,iBAAfA,IAA4BtyC,MAAMiP,QAAQqjC,GACxDA,EAEJ7/C,GAAgC,iBAAbA,GAAyBA,EAASyhB,MAAiC,iBAAlBzhB,EAASyhB,KAC9EzhB,EAASyhB,KACT,CAAC,CACX,EAEAo3B,0BAAAA,CAA2B74C,GACvB,IAAKA,GAAgC,iBAAbA,EACpB,MAAO,GAGX,MAAM6/C,EAAa1jD,KAAKwjD,UAAU3/C,EAAU7D,KAAKijD,gBAAgB,SACjE,GAA0B,iBAAfS,EACP,OAAOA,EAGX,GAA6B,iBAAlB7/C,EAASq7C,KAChB,OAAOr7C,EAASq7C,KAGpB,MAAMA,EAAOr7C,EAASq7C,MAAiC,iBAAlBr7C,EAASq7C,KAAoBr7C,EAASq7C,KAAO,KAClF,OAAIA,GAA8B,iBAAfA,EAAKtyB,MACbsyB,EAAKtyB,MAEZsyB,GAA6B,iBAAdA,EAAK9yB,KACb8yB,EAAK9yB,KAGc,iBAAnBvoB,EAAS+oB,MACT/oB,EAAS+oB,MAGb,EACX,EAEA+vB,6BAAAA,CAA8BF,EAAcrwB,GACxC,MAAMvC,EAAO7pB,KAAKi/C,yBACZ0E,EAAqC,iBAAjBlH,GAAqD,KAAxBA,EAAah2C,OAEpE,KAD+B,SAATojB,GAA6B,SAATA,GAAmB85B,GAEzD,OAAO,EAGX,IAAKA,EAAY,CACb,GAAIvyC,MAAMiP,QAAQ+L,IAASA,EAAKhe,OAC5B,OAAO,EAEX,MAAM+C,EAAUnR,KAAK4xC,iBAAiB,aAAc,cAEpD,OADA5xC,KAAK8hD,gBAAgB3wC,EAAS,UACvB,CACX,CAEA,MAAMrK,EAAO9G,KAAK62C,WAElB,OADA/vC,EAAKhD,UAAY24C,EACZz8C,KAAK4jD,yBAAyB98C,IAInC9G,KAAK6jD,4BAA2B,GAChC7jD,KAAK8jD,mBACE,IALH9jD,KAAK8hD,gBAAgB9hD,KAAK4xC,iBAAiB,aAAc,cAAe,UACjE,EAKf,EAEA,0BAAM+P,CAAqBoC,GACvB,MAAMpK,EAAiB35C,KAAKa,QAAQ+4C,SAAW,CAAC,EAC1CoK,EAAa7uC,KAAKC,IAAI,EAAGP,OAAOw3B,SAASsN,EAAesK,SAAU,KAAO,GAC/E,GAAID,GAAc,EACd,OAGJ,MACME,EAAYF,GADFnhB,KAAKmL,MAAQ+V,GAEzBG,GAAa,SAIX,IAAI99B,SAASuU,GAAYp1B,WAAWo1B,EAASupB,IACvD,GAGJ,MClzBMC,GAAuB,CACzBlG,aAAAA,GACI,IAAKj+C,KAAKokD,8BAAgCpkD,KAAKqkD,kCAC3C,OAEJ,GAAsB,oBAAXhvC,SAA2BA,OAAOwnB,UAAYxnB,OAAOqO,SAC5D,OAGJ,IAAIvX,EACJ,IACIA,EAAM,IAAIsX,IAAIpO,OAAOqO,SAASyH,KAClC,CAAE,MAAO/b,GAKL,YAJApP,KAAKwtC,YAAY,gBAAiB,CAC9BjnC,OAAQ,QACR6I,SAGR,CAEA,MAAMm6B,EAAYvpC,KAAKmhD,mBACHnhD,KAAKskD,0BACbliD,SAAS3B,IACjB0L,EAAI0X,aAAane,OAAOjF,EAAI,IAGhC2C,OAAOwgB,KAAK2lB,GAAWnnC,SAAS3B,IAC5B,MACMyD,EJSX,SAA2BA,GAC9B,OAAKkN,MAAMiP,QAAQnc,GAGZA,EACFoK,KAAKwB,GAAStJ,OAAOsJ,GAAQ,IAAIrJ,SACjCxE,QAAQ6N,GAAkB,KAATA,IACjB0T,KAAK,KALCtf,CAMf,CIjB0BqgD,CADGhb,EAAU9oC,IAEvByD,SAAmD,KAAVA,GAG7CiI,EAAI0X,aAAajhB,IAAInC,EAAK+F,OAAOtC,GAAO,IAG5C,MAAMsgD,EAAU,GAAGr4C,EAAIoxB,WAAWpxB,EAAIqxB,SAASrxB,EAAIyvB,OAEnD,GAAI4oB,IADe,GAAGnvC,OAAOqO,SAAS6Z,WAAWloB,OAAOqO,SAAS8Z,SAASnoB,OAAOqO,SAASkY,OAEtF,OAGJ,MAAM/R,EAAO7pB,KAAKykD,mBACL,SAAT56B,EACAxU,OAAOwnB,QAAQC,UAAU,CAAC,EAAG,GAAI0nB,GAEjCnvC,OAAOwnB,QAAQ6nB,aAAa,CAAC,EAAG,GAAIF,GAGxCxkD,KAAKwtC,YAAY,gBAAiB,CAC9B3jB,OACAjR,MAAOxV,OAAO6C,OAAO,CAAC,EAAGsjC,GACzBp9B,IAAKq4C,GAEb,EAEArD,gBAAAA,GACI,MAAMztB,EAAO,CAAC,EACR9tB,EAAS5F,KAAK2kD,4BACdlC,EAASziD,KAAK0iD,uBACd5N,EAAc90C,KAAK+0C,sBAmBzB,GAjBID,GAAe1xC,OAAO+E,UAAUhE,eAAeiE,KAAKpI,KAAKi1C,eAAiB,CAAC,EAAGH,KAC9EphB,EAAKohB,GAAe90C,KAAKi1C,cAAcH,IAG3C90C,KAAKwiD,sBAAsBpgD,SAAS4pC,IAChC,MAAM4Y,EAAW5Y,EACX+W,EAAc,GAAG/W,OACjB6Y,EAAc7kD,KAAK8iD,sBAAsB8B,EAAUnC,GACnDqC,EAAiB9kD,KAAK8iD,sBAAsBC,EAAaN,GAC3Dr/C,OAAO+E,UAAUhE,eAAeiE,KAAKpI,KAAKi1C,eAAiB,CAAC,EAAG2P,KAC/DlxB,EAAKmxB,GAAe7kD,KAAKi1C,cAAc2P,IAEvCxhD,OAAO+E,UAAUhE,eAAeiE,KAAKpI,KAAKi1C,eAAiB,CAAC,EAAG8N,KAC/DrvB,EAAKoxB,GAAkB9kD,KAAKi1C,cAAc8N,GAC9C,IAGA/iD,KAAK+kD,uBAAwB,CAC7B,MAAMhI,EAAO/8C,KAAK88C,sBAAsB98C,KAAKk6C,WAAW6C,KAAM,GACxDiI,EAAkBhlD,KAAK88C,sBAAsB98C,KAAKa,QAAQu5C,WAAWD,QAAS,IAC9EA,EAAUn6C,KAAK88C,sBAAsB98C,KAAKk6C,WAAWC,QAAS6K,GACpEtxB,EAAKltB,OAAOZ,EAAOq/C,SAAW,SAAWlI,EACzCrpB,EAAKltB,OAAOZ,EAAOs/C,YAAc,YAAc/K,CACnD,CAEA,GAAIn6C,KAAKa,QAAQ2+C,UAAYx/C,KAAKa,QAAQ2+C,SAASr/C,OAAQ,CACvD,MACMglD,EADQnlD,KAAKo/C,oBAAoBp/C,KAAKu9C,WAAWK,OAAS,IAE3D37C,QAAQ6N,GAA6C,KAApCtJ,OAAOsJ,EAAKk8B,OAAS,IAAIvlC,SAC1C6H,KAAKwB,GAAS,GAAGA,EAAKk8B,SAAShsC,KAAK29C,kBAAkB7tC,EAAKmnB,SAC5DkuB,EAAM/2C,OAAS,IACfslB,EAAKltB,OAAOZ,EAAOw/C,SAAW,SAAWD,EAAM3hC,KAAK,KAE5D,CAEA,OAAOkQ,CACX,EAEA4wB,uBAAAA,GACI,MAAM1gC,EAAO,IAAI7S,IACXnL,EAAS5F,KAAK2kD,4BACdlC,EAASziD,KAAK0iD,uBAgBpB,OAdA9+B,EAAKxiB,IAAIpB,KAAK+0C,uBACd/0C,KAAKwiD,sBAAsBpgD,SAAS4pC,IAChCpoB,EAAKxiB,IAAIpB,KAAK8iD,sBAAsB9W,EAAOyW,IAC3C7+B,EAAKxiB,IAAIpB,KAAK8iD,sBAAsB,GAAG9W,OAAYyW,GAAQ,IAG3DziD,KAAK+kD,yBACLnhC,EAAKxiB,IAAIoF,OAAOZ,EAAOq/C,SAAW,SAClCrhC,EAAKxiB,IAAIoF,OAAOZ,EAAOs/C,YAAc,aAErCllD,KAAKa,QAAQ2+C,UAAYx/C,KAAKa,QAAQ2+C,SAASr/C,QAC/CyjB,EAAKxiB,IAAIoF,OAAOZ,EAAOw/C,SAAW,SAG/Bh0C,MAAMC,KAAKuS,GAAM3hB,OAAO8V,QACnC,EAEAstC,kBAAAA,GACI,OAAOrlD,KAAKokD,2BAChB,EAEAK,gBAAAA,GACI,MAAM7+C,EAAS5F,KAAK2kD,4BACdz7B,EAAOlpB,KAAKW,SAAS4Q,aAAa,sCAExC,MAAgB,SADH/K,OAAgB,OAAT0iB,EAAgBA,EAAQtjB,EAAO0/C,aAAe,WAAY9/C,cAAciB,OACnE,OAAS,SACtC,EAEA8+C,4BAAAA,GACI,OAAOvlD,KAAK+kD,sBAChB,EAEAS,sBAAAA,GACI,OAAOztC,QAAQ/X,KAAKa,QAAQ2+C,UAAYx/C,KAAKa,QAAQ2+C,SAASr/C,OAClE,EAEAslD,aAAAA,GACSzlD,KAAKs0C,WAAct0C,KAAKokD,6BAGP,oBAAX/uC,QAA2BA,OAAOzF,kBAG9B5P,KAAK0lD,+BAIpBrwC,OAAO3D,oBAAoB,WAAY1R,KAAK2lD,gBAC5CtwC,OAAOzF,iBAAiB,WAAY5P,KAAK2lD,gBAC7C,EAEA,qBAAMC,GACF,IAAK5lD,KAAKs0C,UACN,OAGJt0C,KAAKi1C,cAAgBj1C,KAAK6lD,0BAC1B7lD,KAAKu9C,WAAav9C,KAAK8lD,uBACnB9lD,KAAK69C,WACL79C,KAAK69C,UAAUC,SAAS,CACpBF,MAAO59C,KAAKu9C,WAAWK,QAI/B59C,KAAK+lD,yBAEL,MAAMhJ,EAAO/8C,KAAKgmD,kBACZ7L,EAAUn6C,KAAKqgD,qBACrBrgD,KAAKk6C,WAAa,CAAE6C,OAAM5C,WACtBn6C,KAAK+9C,aACL/9C,KAAK+9C,YAAYC,QAAQ,CACrBjB,OACA5C,YAIR,MAAM8L,EAAqBjmD,KAAKkmD,uCAC1BlmD,KAAK2gD,gBAAgB5D,EAAM5C,EAAS,KAAM8L,EACpD,EAEAF,sBAAAA,GACI,MAAMjR,EAAc90C,KAAK+0C,sBACnBoR,EAAiBnmD,KAAKomD,0BAC5B,GAAID,EAAgB,CAChB,MAAM76B,EAAQtrB,KAAKqmD,oBAAoBF,GACnC76B,IACAA,EAAMpnB,MAAQsC,OAAOxG,KAAKi1C,cAAcH,IAAgB,IAEhE,CAEI90C,KAAKsmD,UAA+C,mBAA5BtmD,KAAKsmD,SAASC,WACtCvmD,KAAKsmD,SAASC,UAAUvmD,KAAKwmD,0BAA2B,CAAEC,MAAM,GAExE,EAEAf,0BAAAA,GAEI,OAAO1R,GADMh0C,KAAKW,SAAS4Q,aAAa,0CACN,EACtC,EAEAs0C,uBAAAA,GACI,MACMpG,GADiBz/C,KAAKa,QAAQwF,SAAW,CAAC,GACXtD,QAAU,CAAC,EAC1C2jD,EAAa,CAAC,EACdC,EAAW,IAAI51C,IAAI,CAAC,OAAQ,WAAY,OAAQ,QAatD,GAXA3N,OAAOwgB,KAAK67B,GAAer9C,SAAS3B,IAChC,GAAIkmD,EAAS79B,IAAIroB,GACb,OAEJ,MAAMyD,EAAQu7C,EAAch/C,GACxByD,SAAmD,KAAVA,IAG7CwiD,EAAWjmD,GAAOyD,EAAK,KAGtBlE,KAAKokD,8BAAgCpkD,KAAK4mD,+BAC3C,OAAOF,EAGX,MAAM9gD,EAAS5F,KAAK2kD,4BACdlC,EAASziD,KAAK0iD,uBACdmE,EAAY7mD,KAAK8mD,gBACjBhS,EAAc90C,KAAK+0C,sBACnBgS,EAAe/mD,KAAKwiD,sBAE1B,GAAI1N,GAAe+R,EAAU/9B,IAAIgsB,GAAc,CAC3C,MAAM5wC,EAAQsC,OAAOqgD,EAAU5jD,IAAI6xC,IAAgB,IAAIruC,OACnDvC,EACAwiD,EAAW5R,GAAe5wC,SAEnBwiD,EAAW5R,EAE1B,CAEAiS,EAAa3kD,SAAS4pC,IAClB,MAAM4Y,EAAW5kD,KAAK8iD,sBAAsB9W,EAAOyW,GAC7CM,EAAc/iD,KAAK8iD,sBAAsB,GAAG9W,OAAYyW,GAC9D,GAAIoE,EAAU/9B,IAAI87B,GAAW,CACzB,MAAM1gD,EAAQsC,OAAOqgD,EAAU5jD,IAAI2hD,IAAa,IAAIn+C,OAChDvC,EACAwiD,EAAW1a,GAAS9nC,EAAMwH,SAAS,KAAOxH,EAAMsH,MAAM,KAAK8C,KAAKwB,GAAStJ,OAAOsJ,GAAQ,IAAIrJ,SAAQxE,OAAO8V,SAAW7T,SAE/GwiD,EAAW1a,EAE1B,CACA,GAAI6a,EAAU/9B,IAAIi6B,GAAc,CAC5B,MAAMiE,EAAWxgD,OAAOqgD,EAAU5jD,IAAI8/C,IAAgB,IAAIt8C,OACtDugD,EACAN,EAAW,GAAG1a,QAAcgb,SAErBN,EAAW,GAAG1a,OAE7B,KAGJ,MAAMoZ,EAAU5+C,OAAOZ,EAAOw/C,SAAW,QACzC,GAAIyB,EAAU/9B,IAAIs8B,GAAU,CACxB,MAAM6B,EAAUzgD,OAAOqgD,EAAU5jD,IAAImiD,IAAY,IAAI3+C,OACrD,GAAIwgD,EAAS,CACT,MAAMn7B,EAAQm7B,EAAQz7C,MAAM,KAAK8C,KAAKwB,GAAStJ,OAAOsJ,GAAQ,IAAIrJ,SAAQxE,OAAO8V,SAC3E4jB,EAAS,GACTurB,EAAO,GACbp7B,EAAM1pB,SAAS0N,IACX,MAAM2zC,EAAQ3zC,EAAKtE,MAAM,KAAK8C,KAAK64C,GAAS3gD,OAAO2gD,GAAQ,IAAI1gD,SAAQxE,OAAO8V,SACzE0rC,EAAMr1C,SAGXutB,EAAOhkB,KAAK8rC,EAAM,IAClByD,EAAKvvC,KAAkB,SAAb8rC,EAAM,GAAgB,OAAS,OAAM,IAE/C9nB,EAAOvtB,SACPs4C,EAAWpa,KAAO3Q,EAAOnY,KAAK,KAC9BkjC,EAAWzvB,IAAMiwB,EAAK1jC,KAAK,KAEnC,CACJ,CAMA,OAJAxjB,KAAKwtC,YAAY,eAAgB,CAC7B50B,MAAOxV,OAAO6C,OAAO,CAAC,EAAGygD,KAGtBA,CACX,EAEA5D,qBAAAA,CAAsBriD,EAAKgiD,GACvB,MAAM2E,EAAS5gD,OAAO/F,GAAO,IAAIgG,OACjC,IAAK2gD,EACD,MAAO,GAEX,MAAMC,EAAY7gD,OAAOi8C,GAAU,IAAIh8C,OACvC,OAAK4gD,GAAaD,EAAOjlD,WAAWklD,GACzBD,EAEJ,GAAGC,IAAYD,GAC1B,EAEAN,aAAAA,GACI,IACI,OAAO,IAAIQ,gBAAgBjyC,OAAOqO,SAAS8Z,QAAU,GACzD,CAAE,MAAOpuB,GAKL,OAJApP,KAAKwtC,YAAY,gBAAiB,CAC9BjnC,OAAQ,OACR6I,UAEG,IAAIk4C,eACf,CACJ,EAEAvS,mBAAAA,GACI,MAAMwS,EAAgBvnD,KAAKa,QAAQ28B,QAAU,CAAC,EACxCgqB,EAAYxnD,KAAKW,SAAS4Q,aAAa,sBAAwB,GACrE,OAAO/K,OAAO+gD,EAAcnS,OAASoS,GAAa,KAAK/gD,QAAU,GACrE,EAEA+7C,mBAAAA,GACI,MAAMj3B,EAAOvrB,KAAKynD,sBAClB,IAAKl8B,EACD,MAAO,GAGX,GAAIna,MAAMiP,QAAQrgB,KAAK0nD,uBACnB,OAAO1nD,KAAK0nD,sBAAsB7lC,QAGtC,MAAMlc,EAAU3F,KAAKa,QAAQ60C,SAAW,CAAC,EACnCC,EAAYnvC,OAAOb,EAAQgwC,WAAa,qBAAqBlvC,QAAU,oBACvEkhD,EAAS,IAAI52C,IAQnB,OAPAK,MAAMC,KAAKka,EAAK/b,iBAAiB,IAAImmC,OAAevzC,SAASkmB,IACzD,MAAM7nB,EAAM+F,OAAO8hB,EAAK/W,aAAaokC,IAAc,IAAIlvC,OACnDhG,GACAknD,EAAOvmD,IAAIX,EACf,IAEJT,KAAK0nD,sBAAwBt2C,MAAMC,KAAKs2C,GACjC3nD,KAAK0nD,sBAAsB7lC,OACtC,EAEA2kC,uBAAAA,GACI,MAAM5iC,EAAO5jB,KAAKwiD,sBAClB,IAAK5+B,EAAKxV,OACN,MAAO,CAAC,EAEZ,MAAMnK,EAAS,CAAC,EAShB,OARA2f,EAAKxhB,SAAS3B,IACN2C,OAAO+E,UAAUhE,eAAeiE,KAAKpI,KAAKi1C,cAAex0C,KACzDwD,EAAOxD,GAAOT,KAAKi1C,cAAcx0C,IAEjC2C,OAAO+E,UAAUhE,eAAeiE,KAAKpI,KAAKi1C,cAAe,GAAGx0C,UAC5DwD,EAAO,GAAGxD,QAAYT,KAAKi1C,cAAc,GAAGx0C,QAChD,IAEGwD,CACX,EAEAoxC,uBAAAA,GACI,MAAMuS,EAAgB5nD,KAAKa,QAAQ60C,SAAW,CAAC,EAC/C,GAAkC,iBAAvBkS,EAAcr8B,KACrB,OAAO/kB,OAAOohD,EAAcr8B,MAAM9kB,OAEtC,MAAMohD,EAAe7nD,KAAKW,SAAS4Q,aAAa,sBAAwB,GACxE,OAAO/K,OAAOqhD,GAAcphD,MAChC,EAEAghD,mBAAAA,GACI,MACMK,GADgB9nD,KAAKa,QAAQ60C,SAAW,CAAC,GACdnqB,KACjC,GAAIu8B,GAAsC,IAAxBA,EAAWr/B,SAQzB,OAP4BzoB,KAAKu1C,wBAA0BuS,GACjB,KAAnC9nD,KAAKs1C,6BAERt1C,KAAKs1C,0BAA4B,GACjCt1C,KAAKu1C,sBAAwBuS,EAC7B9nD,KAAK0nD,sBAAwB,MAE5BI,EAAWnY,YAGT3vC,KAAKu1C,sBAFD,KAKf,MAAM3jC,EAAW5R,KAAKq1C,0BACtB,OAAKzjC,IAMiB5R,KAAKs1C,4BAA8B1jC,IACjD5R,KAAKu1C,wBACLv1C,KAAKu1C,sBAAsB5F,eAE/B3vC,KAAKs1C,0BAA4B1jC,EACjC5R,KAAKu1C,sBAAwBtB,GAAkBriC,GAC/C5R,KAAK0nD,sBAAwB,MAE1B1nD,KAAKu1C,wBAbRv1C,KAAKs1C,0BAA4B,GACjCt1C,KAAKu1C,sBAAwB,KAC7Bv1C,KAAK0nD,sBAAwB,KACtB,KAWf,EAEA/C,yBAAAA,GACI,MAAMjP,EAAU11C,KAAKa,QAAQ60C,SAAW,CAAC,EAIzC,OAHiBA,EAAQwL,UAAwC,iBAArBxL,EAAQwL,SAC9CxL,EAAQwL,SACR,CAAC,CAEX,EAEAwB,oBAAAA,GACI,MAAM98C,EAAS5F,KAAK2kD,4BACdz7B,EAAOlpB,KAAKW,SAAS4Q,aAAa,gCAClCw3B,EAAe,OAAT7f,EAAgBA,EAAOtjB,EAAOmiD,YAC1C,OAAOvhD,OAAOuiC,GAAO,MAAMtiC,QAAU,IACzC,EAEA29C,yBAAAA,GACI,MAAMx+C,EAAS5F,KAAK2kD,4BACdz7B,EAAOlpB,KAAKW,SAAS4Q,aAAa,gCAExC,OAAOwiC,GADc,OAAT7qB,EAAgBA,EAAOtjB,EAAOzF,QACP,EACvC,EAEAymD,4BAAAA,GACI,MAAMhhD,EAAS5F,KAAK2kD,4BACdz7B,EAAOlpB,KAAKW,SAAS4Q,aAAa,sCAExC,OAAOyiC,GADc,OAAT9qB,EAAgBA,EAAOtjB,EAAOoiD,YACT,EACrC,EAEA3D,+BAAAA,GACI,MAAMz+C,EAAS5F,KAAK2kD,4BACdz7B,EAAOlpB,KAAKW,SAAS4Q,aAAa,yCAExC,OAAOyiC,GADc,OAAT9qB,EAAgBA,EAAOtjB,EAAOqiD,eACT,EACrC,GAGJ,MC1MA,GAjP0B,CACtBrL,iBAAAA,CAAkBxwB,GACd,MAAMtlB,EAAO9G,KAAK62C,WAElB,GAAKzqB,EAAKhe,OAMVpO,KAAK6jD,4BAA2B,GAChC7jD,KAAK8jD,kBACLh9C,EAAKhD,UAAYsoB,EAAK9d,KAAKme,GAMhB,OALOzsB,KAAK+2C,QAAQzoC,KAAK09B,IAC5B,MAAMkc,EAAWz7B,GAAOrpB,OAAO+E,UAAUhE,eAAeiE,KAAKqkB,EAAKuf,GAASvf,EAAIuf,GAAS,GAClFmc,EAAWnoD,KAAKq4C,kBAAkBrM,EAAOkc,GAC/C,MAAO,OAAOloD,KAAK8xC,YAAYqW,SAAgB,IAE/B3kC,KAAK,aAC1BA,KAAK,IACRxjB,KAAKyxC,+BAhBL,CACI,MAAMtgC,EAAUnR,KAAK4xC,iBAAiB,aAAc,cACpD5xC,KAAK8hD,gBAAgB3wC,EAAS,QAElC,CAaJ,EAEA2wC,eAAAA,CAAgB3wC,EAASyH,GACrB,MAAM9R,EAAO9G,KAAK62C,WACZhO,EAAU7oC,KAAKw4C,2BACf4P,EAAwB,UAAVxvC,EACd,mGAAmG5Y,KAAK8xC,YAAY9xC,KAAK4xC,iBAAiB,QAAS,2BACnJ,GACAyW,EAAeroD,KAAKsoD,8BAA8B1vC,GACxD9R,EAAKhD,UAAY,oBAAoB+kC,wBAA8BjwB,8BAAkCyvC,iCAA4CroD,KAAK8xC,YAAY3gC,WAAiBi3C,oBACnL,MAAMG,EAAYzhD,EAAKS,cAAc,sBACrCvH,KAAK6jD,4BAA2B,GAChC7jD,KAAKwoD,cAAc5vC,GACnB5Y,KAAKyoD,uBAAuBF,GAC5BvoD,KAAK0oD,UAAUv3C,GACfnR,KAAKs2C,eACLt2C,KAAKyxC,2BACLzxC,KAAKm5C,8BACT,EAEAyK,yBAAyB98C,MAChBA,GAASA,EAAKslB,MAAStlB,EAAKslB,KAAKhe,SAG/BgD,MAAMC,KAAKvK,EAAKslB,MAAM6L,MAAMxL,IAC/B,MAAMC,EAAQtb,MAAMC,KAAKob,EAAIC,OAAS,IACtC,QAAKA,EAAMte,QAGJse,EAAMuL,MAAMtL,KACVA,IAIW,KADHnmB,OAAOmmB,EAAK9T,aAAe,IAAIpS,QACtBkmB,EAAKwY,SAAS/2B,OAAS,IAC/C,IAIVy1C,0BAAAA,CAA2B3/C,GACvBlE,KAAK8pC,wBAA0B/xB,QAAQ7T,EAC3C,EAEAskD,aAAAA,CAAc5vC,GACL5Y,KAAKwnC,SAGVxnC,KAAKwnC,QAAQ93B,aAAa,kBAAmBlJ,OAAOoS,GAAS,IACjE,EAEAkrC,eAAAA,GACS9jD,KAAKwnC,SAGVxnC,KAAKwnC,QAAQrV,gBAAgB,kBACjC,EAEAm2B,6BAAAA,CAA8B1vC,GAC1B,MAIM+vC,EAAqB,UAAV/vC,EACX,gCACA,gCACAgwC,GAPe5oD,KAAKa,QAAQ+X,OAAuC,iBAAvB5Y,KAAKa,QAAQ+X,MACzD5Y,KAAKa,QAAQ+X,MACb,CAAC,GACqB,UAAVA,EAAoB,oBAAsB,sBAIb,GACzCuQ,EAAYnpB,KAAKW,SAAWX,KAAKW,SAAS4Q,aAAao3C,GAAY,GACnEv9B,EAAM5kB,OAAOoiD,GAAez/B,GAAa,IAAI1iB,OACnD,IAAK2kB,EACD,MAAO,iEAEX,MAAMy9B,EAAY7oD,KAAK8oD,wBAAwB19B,GAC/C,GAAIy9B,EACA,MAAO,2DAA2DA,UAEtE,MAAMx9B,EAAgB,UAAVzS,EAAoB,QAAU,QAC1C,MAAO,kDAAkD5Y,KAAK8xC,YAAY1mB,YAAcC,0BAC5F,EAEAy9B,uBAAAA,CAAwB5kD,GACpB,MAAM6kC,EAAMviC,OAAOtC,GAAS,IAAIuC,OAChC,IAAKsiC,EACD,MAAO,GAEX,GAAI,cAAczR,KAAKyR,GACnB,OAAOA,EAGX,MAAMggB,EAAU/oD,KAAKgpD,oBAAoBjgB,GACzC,MAAI,cAAczR,KAAKyxB,GACZA,EAEJ,EACX,EAEAC,oBAAoB9kD,GACTsC,OAAOtC,GAAS,IAClBkkB,QAAQ,QAAS,KACjBA,QAAQ,QAAS,KACjBA,QAAQ,UAAW,KACnBA,QAAQ,SAAU,KAClBA,QAAQ,SAAU,KAG3BqgC,sBAAAA,CAAuBF,GACnB,IAAKA,EACD,OAEJ,MAAMvvC,EAAYhZ,KAAKipD,0BAMvB,GALAV,EAAUx0C,MAAMiF,UAAY,GAAGA,MAC3BhZ,KAAK8tC,iBACL9tC,KAAK8tC,eAAepQ,UAAY,EAChC19B,KAAK8tC,eAAeD,WAAa,GAEf,oBAAXx4B,OACP,OAEJ,MAAMhF,EAAOk4C,EAAUj4C,wBACjB44C,EAAK7zC,OAAOG,aAAe,GAC7BnF,EAAKK,IAAM,GAAMw4C,EAAK,GAAK74C,EAAK4H,OAASixC,IACzCX,EAAUY,eAAe,CAAEC,MAAO,SAAUC,OAAQ,WAE5D,EAEAJ,uBAAAA,GACI,GAAsB,oBAAX5zC,OACP,OAAO,IAEX,MAAM6zC,EAAK7zC,OAAOG,aAAe,EAE3B8zC,GADYj0C,OAAOC,YAAc,IAAM,IACpB,IAAO,IAC1Bi0C,EAAWL,EAAK,EAAI/zC,KAAK2D,MAAMowC,EAAKI,GAAS,EACnD,OAAOn0C,KAAKC,IAAI,IAAKm0C,EACzB,EAEAC,sBAAAA,GACIxpD,KAAKW,SAASiP,iBAAiB,SAAUtC,IAErC,GADcA,EAAMhJ,OAAOqJ,QAAQ,sBAI/B,OAFAL,EAAME,sBACNxN,KAAKypD,yBAGKn8C,EAAMhJ,OAAOqJ,QAAQ,wBAE/BL,EAAME,iBACNxN,KAAK0pD,qBACT,GAER,EAEAD,sBAAAA,GACI,IAAKzpD,KAAKs0C,UACN,OAGJt0C,KAAKi1C,cAAgB,CAAC,EACtBj1C,KAAKq/C,eAAiB,CAAC,EACvBr/C,KAAKu9C,WAAan6C,OAAO6C,OAAO,CAAC,EAAGjG,KAAKu9C,WAAY,CAAEvR,MAAO,GAAI/U,IAAK,MAAOgX,aAAc,EAAG2P,MAAO,KAClG59C,KAAK69C,WACL79C,KAAK69C,UAAUC,SAAS,CAAEF,MAAO,KAGrC,MAAMuI,EAAiBnmD,KAAKomD,0BAC5B,GAAID,EAAgB,CAChB,MAAMwD,EAAc3pD,KAAKqmD,oBAAoBF,GACzCwD,IACAA,EAAYzlD,MAAQ,GAE5B,CAEIlE,KAAKsmD,UAA+C,mBAA5BtmD,KAAKsmD,SAASC,WACtCvmD,KAAKsmD,SAASC,UAAU,CAAC,EAAG,CAAEE,MAAM,IAGxC,MAAMtM,EAAUn6C,KAAKk6C,WAAWC,SAAWn6C,KAAK88C,sBAAsB98C,KAAKa,QAAQu5C,WAAWD,QAAS,IACvGn6C,KAAKk6C,WAAa,CAAE6C,KAAM,EAAG5C,WAC7Bn6C,KAAKwtC,YAAY,QAAS,CACtBuP,KAAM,EACN5C,YAEJn6C,KAAK2gD,gBAAgB,EAAGxG,EAC5B,EAEAuP,kBAAAA,GACI,IAAK1pD,KAAKs0C,UACN,OAEJ,MAAMyI,EAAO/8C,KAAKk6C,WAAW6C,MAAQ,EAC/B5C,EAAUn6C,KAAKk6C,WAAWC,SAAWn6C,KAAK88C,sBAAsB98C,KAAKa,QAAQu5C,WAAWD,QAAS,IACvGn6C,KAAK2gD,gBAAgB5D,EAAM5C,EAC/B,EAEAyP,uBAAAA,GACI,QAAK5pD,KAAKs0C,WAGHlxC,OAAOwgB,KAAK5jB,KAAKi1C,eAAiB,CAAC,GAAG7mC,OAAS,CAC1D,EAEAy7C,iBAAAA,GACI,GAAI7pD,KAAK8pD,cAAgB9pD,KAAKwnC,QAC1B,OAEJ,MAAMlf,EAAOjb,SAAS2K,cAAc,OACpCsQ,EAAKxF,UAAY,mBACjBwF,EAAK5Y,aAAa,YAAa,UAC/B4Y,EAAK5Y,aAAa,cAAe,QACjC1P,KAAKwnC,QAAQld,YAAYhC,GACzBtoB,KAAK8pD,YAAcxhC,CACvB,EAEAogC,SAAAA,CAAUv3C,GACDnR,KAAK8pD,cAGV9pD,KAAK8pD,YAAYjxC,YAAcrS,OAAO2K,GAAW,IACrD,GCqZJ,GAnoBwB,CAGpB8M,MAAO,OAIP8rC,OAAQ,KAIRC,KAAM,CACF/pB,GAAI,CACAma,WAAY,CAGR6P,aAAc,oBAGdC,oBAAqB,cAGrBC,UAAW,QAGXC,UAAW,SAGXC,qBAAsB,WAE1Bl+B,MAAO,CAGHytB,QAAS,qBAGT0Q,MAAO,cAGPl7C,MAAO,+BAGPm7C,MAAO,YAGPC,cAAe,uDAEnBhL,SAAU,CAGNiL,SAAU,4BAGVC,UAAW,0BAEfl2B,QAAS,CAGLmgB,WAAY,UAGZO,YAAa,QAGbwC,iBAAkB,oBAGlBC,kBAAmB,YAGnBC,kBAAmB,oBAGnBC,mBAAoB,oBAG5BrX,GAAI,CACA4Z,WAAY,CACR6P,aAAc,gBACdC,oBAAqB,OACrBC,UAAW,OACXC,UAAW,OACXC,qBAAsB,MAE1Bl+B,MAAO,CACHytB,QAAS,kBACT0Q,MAAO,qBACPl7C,MAAO,uBACPm7C,MAAO,QACPC,cAAe,4CAEnBhL,SAAU,CACNiL,SAAU,iBACVC,UAAW,mBAEfl2B,QAAS,CACLmgB,WAAY,QACZO,YAAa,SACbwC,iBAAkB,eAClBC,kBAAmB,YACnBC,kBAAmB,cACnBC,mBAAoB,oBAOhChzC,KAAM,GAEN+jC,MAAO,CAEHC,QAAS,IAGb8hB,MAAO,CACHC,QAAS,CAELnqD,IAAK,KAIb4F,QAAS,CAGLjC,MAAO,GAGPC,OAAQ,MAGRsC,YAAa,cAGbC,QAAS,CAAE,OAAU,oBAGrB7D,OAAQ,CAAC,EAGTu/C,SAAU,CAAC,EAGXtD,aAAc,OAGdmE,SAAU,OAGVE,SAAU,OAGVE,SAAU,aAGVvB,UAAW,OAGXC,UAAW,OAGXC,YAAa,SACbzM,MAAO,CAEHt1C,QAAQ,EAERi7C,IAAK,IAELhmC,IAAK,IAETqrC,OAAQ,CAEJr8C,MAAO,KAIfg2C,WAAY,CAGRj6C,QAAQ,EAGR48C,KAAM,EAGN5C,QAAS,GAGT0Q,IAAK,GAGLC,WAAY,IAGZ11C,IAAK,IAGL21C,aAAa,EAGbC,gBAAgB,EAChBC,QAAS,CAELlO,MAAM,EAEN8N,KAAK,GAITnsB,WAAY,GAGZwsB,eAAgB,GAChBN,QAAS,CAELnqD,IAAK,IAET0qD,YAAa,CACTP,QAAS,CAELnqD,IAAK,KAKby8C,WAAY,KAGZtmC,SAAU,SAGVw0C,MAAO,OAGPC,WAAY,OAGZC,UAAU,EAGVC,cAAe,EAGfC,gBAAiB,EAGjBC,aAAa,EAGbC,kBAAkB,EAGlBC,aAAa,EAGbC,mBAAmB,EAGnBC,WAAW,EAGXxB,qBAAsB,UAGtByB,eAAgB,CAAC,GAAI,GAAI,GAAI,KAG7BC,SAAU,KAGVC,gBAAiB,MAGrBxM,SAAU,CAGNr/C,QAAQ,EAGR8rD,aAAc,GAGdC,WAAY,MAGZC,OAAO,EAGPC,gBAAgB,EAGhBzwB,OAAQ,GAGR0wB,oBAAoB,EAGpBC,iBAAkBA,KAAM,GAG5BC,cAAe,CAGXpsD,QAAQ,EAGR8qD,SAAS,EAGTvsB,WAAY,IAGhB8tB,aAAc,CAGVrsD,QAAQ,EAGR4Y,SAAU,GAGVyC,SAAU,KAGdixC,QAAS,CAGLtsD,QAAQ,EAGR04C,UAAW,GAGX6T,SAAU,EAGV76C,UAAW,KAGf86C,WAAY,CAGRxsD,QAAQ,EAGRysD,OAAQ,iBAGRC,WAAY,wBAGZC,eAAgB,uBAGhBC,WAAW,GAGfnT,QAAS,CAGLqK,SAAU,IAGVnK,SAAU,IAGdtlB,QAAS,CAGLr0B,QAAQ,GAGZ2tB,OAAQ,CAGJ3tB,QAAQ,GAGZyY,MAAO,CAGHo0C,kBAAmB,uXAGnBC,kBAAmB,+hBAGvBva,QAAS,CAGL5W,QAAS,GAGT6W,YAAa,IAGjBua,aAAc,CAGV/sD,QAAQ,EAGRuQ,IAAK,EAGL0E,IAAK,GAGTooB,OAAQ,CAGJr9B,QAAQ,EAGRgtD,SAAU,IAGV/X,MAAO,IAGP9pB,MAAO,IAGXoqB,QAAS,CAGLv1C,QAAQ,EAGRorB,KAAM,GAGN4hC,SAAU,IAGV58B,MAAO,OAGPjpB,OAAQ,CACJipB,MAAO,sBACPkJ,MAAO,uBAIXr1B,MAAO,GAGPuxC,UAAW,oBAGXC,SAAU,mBAGVwX,SAAU,mBAGVC,UAAW,oBAGXC,aAAc,uBAGdC,gBAAiB,KAGjBC,mBAAmB,EAGnBC,WAAW,EAGXC,YAAY,EAGZC,iBAAiB,EAEjBzM,SAAU,CAEN/gD,QAAQ,EAER6nD,YAAY,EAEZC,eAAe,EAEf3C,YAAa,UAEbyC,YAAa,KAEb9C,QAAS,OAETC,WAAY,UAEZE,QAAS,QAGbpE,UAAW,CAEP4M,WAAY,UAEZ3M,aAAa,EAEb4M,iBAAiB,GAGrBhqD,SAAU,CAENiqD,SAAU,YAEVC,UAAW,aAEXC,SAAU,OAEVC,mBAAoB,wBAI5B/M,SAAU,CAGN/gD,QAAQ,EAGR0pB,KAAM,UACNqkC,QAAS,CAEL9T,YAAY,EAEZ9N,MAAM,GAEV6hB,OAAQ,CAEJC,UAAU,IAIlBC,SAAU,CAGNluD,QAAQ,EAGRmuD,YAAY,EAGZC,eAAgB,MAGhBC,yBAA0B,6BAG9BC,UAAW,CAEPC,OAAQ,KAERC,aAAc,KAEdC,aAAc,KAEdvpD,QAAS,KAETwpD,iBAAkB,KAElBC,eAAgB,KAEhBC,gBAAiB,KAEjBC,eAAgB,KAEhBC,gBAAiB,KAEjBC,gBAAiB,KAEjBC,cAAe,KAEfC,cAAe,KAEfC,YAAa,KAEbC,aAAc,KAEdC,aAAc,KAEdvD,gBAAiB,KAEjBwD,SAAU,KAEVC,gBAAiB,KAEjBC,QAAS,KAETC,WAAY,KAEZC,WAAY,KAEZC,aAAc,KAEdC,SAAU,KAEVC,aAAc,KAEdC,YAAa,KAEbC,cAAe,KAEfC,YAAa,KAEbC,gBAAiB,KAEjBC,eAAgB,KAChBC,cAAe,MAGnBtjC,OAAQ,CAGJ5sB,QAAQ,EAGRsiD,OAAQ,OAGR/wB,SAAS,GAGb4+B,YAAa,CAGTnwD,QAAQ,EAGRu+B,WAAY,GAGZzgB,OAAO,EAGP8rC,QAAQ,EAGRwG,cAAc,IClBtB,GA3mBA,MACChwD,WAAAA,CAAY+Q,EAAIvO,EAAS,CAAC,GACzB,KAAKuO,GAAQA,aAAc+gC,SAC1B,MAAM,IAAI5vC,MAAM,4CAejBzC,KAAKwwD,MAAQl/C,EACbtR,KAAKa,QAAUuC,OAAO6C,OAAO,CAAC,EAbb,CAChBwqD,eAAgB,2CAChBvG,oBAAqB,OACrBwB,kBAAkB,EAClBzB,aAAc,oBACdE,UAAW,QACXC,UAAW,SACXC,qBAAsB,UACtB13B,UAAW,KACXm4B,WAAY,KAI8B/nD,GAE3C/C,KAAK0wD,YAAc1wD,KAAK2wD,qBACxB3wD,KAAK4wD,OAAS,CACb7T,KAAM/8C,KAAK6wD,cAAc7wD,KAAKa,QAAQk8C,KAAM,GAC5C5C,QAASn6C,KAAK8wD,kBAAkB9wD,KAAKa,QAAQs5C,QAAS,IACtD+C,WAAYl9C,KAAK6wD,cAAc7wD,KAAKa,QAAQq8C,WAAY,IAGzDl9C,KAAK+wD,YAAc,GACnB/wD,KAAKgxD,uBAAyB,IAAIC,QAClCjxD,KAAKkxD,qBAAuBlxD,KAAKmxD,sBAAsBxvD,KAAK3B,MAC5DA,KAAKoxD,sBAAwBpxD,KAAKqxD,uBAAuB1vD,KAAK3B,MAC9DA,KAAKsxD,uBAAyBtxD,KAAKuxD,wBAAwB5vD,KAAK3B,MAChEA,KAAKwxD,uBAAyBxxD,KAAKyxD,wBAAwB9vD,KAAK3B,MAChEA,KAAK0xD,oBAAsB1xD,KAAK2xD,qBAAqBhwD,KAAK3B,MAC1DA,KAAK4xD,mBAAqB,IAAIX,OAC/B,CAEA/oD,IAAAA,GACClI,KAAK+wD,YAAc/wD,KAAK6xD,qBACnB7xD,KAAK+wD,YAAY3iD,SACtBpO,KAAK8xD,UACL9xD,KAAK+xD,cACN,CAEA/T,OAAAA,CAAQ14B,EAAO,CAAC,GACf,IAAI0sC,GAAU,EACd,QAAkBjrD,IAAdue,EAAKy3B,KAAoB,CAC5B,MAAMF,EAAW78C,KAAK6wD,cAAcvrC,EAAKy3B,KAAM/8C,KAAK4wD,OAAO7T,MACvDF,IAAa78C,KAAK4wD,OAAO7T,OAC5B/8C,KAAK4wD,OAAO7T,KAAOF,EACnBmV,GAAU,EAEZ,CACA,QAAqBjrD,IAAjBue,EAAK60B,QAAuB,CAC/B,MAAM6C,EAAch9C,KAAK8wD,kBAAkBxrC,EAAK60B,QAASn6C,KAAK4wD,OAAOzW,SACjE6C,IAAgBh9C,KAAK4wD,OAAOzW,UAC/Bn6C,KAAK4wD,OAAOzW,QAAU6C,EACtBgV,GAAU,EAEZ,CACA,QAAwBjrD,IAApBue,EAAK43B,WAA0B,CAClC,MAAM+U,EAAiBjyD,KAAK6wD,cAAcvrC,EAAK43B,WAAYl9C,KAAK4wD,OAAO1T,YACnE+U,IAAmBjyD,KAAK4wD,OAAO1T,aAClCl9C,KAAK4wD,OAAO1T,WAAa+U,EACzBD,GAAU,EAEZ,CACA,MAAME,EAAclyD,KAAKmyD,WAAWnyD,KAAK4wD,OAAO7T,MAC5CmV,IAAgBlyD,KAAK4wD,OAAO7T,OAC/B/8C,KAAK4wD,OAAO7T,KAAOmV,EACnBF,GAAU,GAENA,GAGLhyD,KAAK8xD,SACN,CAEAD,kBAAAA,GACC,MAAMhoC,EAAO7pB,KAAKoyD,qBACZC,EAAQryD,KAAKsyD,wBACnB,MAAa,WAATzoC,GACS,SAATA,GAAmBwoC,EAAMjkD,OADCikD,EAEvBryD,KAAKuyD,wBACb,CAEAH,kBAAAA,GACC,MAAM3wB,GAAUzhC,KAAKa,QAAQwqD,YAAcrrD,KAAKa,QAAQ4gC,QAAU,QAAQrd,WAAW5e,cACrF,MAAe,UAAXi8B,EAA2B,QAChB,WAAXA,EAA4B,SACzB,MACR,CAEA6wB,qBAAAA,GACC,GAAItyD,KAAKa,QAAQ8xB,qBAAqB0f,QACrC,MAAO,CAACryC,KAAKa,QAAQ8xB,WAEtB,GAAsC,iBAA3B3yB,KAAKa,QAAQ8xB,WAA0B3yB,KAAKa,QAAQ8xB,UAAUlsB,OAAQ,CAChF,MAAM+rD,EAAkBxyD,KAAKwwD,MAAMjpD,cAAcvH,KAAKa,QAAQ8xB,WAC9D,GAAI6/B,EAAiB,MAAO,CAACA,EAC9B,CAEA,MAAM9jD,EAAO0C,MAAMC,KAAKrR,KAAKwwD,MAAMhhD,iBAAiBxP,KAAKa,QAAQ4vD,gBAAkB,qBACnF,IAAK/hD,EAAKN,OAAQ,MAAO,GAEzB,MAAMwI,GAAY5W,KAAKa,QAAQ+V,UAAY,UAAUwN,WAAW5e,cAChE,GAAiB,SAAboR,EAAqB,OAAOlI,EAEhC,MAAM+jD,EAAY/jD,EAAKlM,MAAMsN,GAASA,EAAKsE,QAAQwC,WAAaA,IAChE,OAAO67C,EAAY,CAACA,GAAa,CAAC/jD,EAAK,GACxC,CAEA6jD,sBAAAA,GACC,MAAM37C,GAAY5W,KAAKa,QAAQ+V,UAAY,UAAUwN,WAAW5e,cAC1D2mB,EAAQnsB,KAAKwwD,MAAMjpD,cAAc,SACjCmrD,EAAYvmC,EAASA,EAAMxe,QAAQ,yBAA2Bwe,EAAS,KACvEwmC,EAAa,GAEbC,EAAU/rB,IACf,MAAM/jB,EAAY,oCAAoC+jB,IACtD,IAAIlU,EAAY3yB,KAAKwwD,MAAMjpD,cAAc,qBAAqBs/B,oCACzDlU,IACJA,EAAYtlB,SAAS2K,cAAc,OACnC2a,EAAU7P,UAAYA,EACtB6P,EAAUve,QAAQwC,SAAWiwB,EAC7BlU,EAAUve,QAAQy+C,oBAAsB,IACpCH,GAAaA,EAAUj/B,gBAAkBzzB,KAAKwwD,MACrC,QAAR3pB,EACH7mC,KAAKwwD,MAAM7/C,aAAagiB,EAAW+/B,GAE/BA,EAAU9hD,YACb5Q,KAAKwwD,MAAM7/C,aAAagiB,EAAW+/B,EAAU9hD,aAE7C5Q,KAAKwwD,MAAMlmC,YAAYqI,GAIzB3yB,KAAKwwD,MAAMlmC,YAAYqI,IAGzBggC,EAAWh7C,KAAKgb,EAAU,EAK3B,MAFiB,QAAb/b,GAAmC,SAAbA,GAAqBg8C,EAAO,OACrC,WAAbh8C,GAAsC,SAAbA,GAAqBg8C,EAAO,UAClDD,CACR,CAEAZ,WAAAA,GACC/xD,KAAK+wD,YAAY3uD,SAASuwB,IACzBA,EAAUjhB,oBAAoB,QAAS1R,KAAKkxD,sBAC5Cv+B,EAAUjhB,oBAAoB,SAAU1R,KAAKoxD,uBAC7Cz+B,EAAUjhB,oBAAoB,UAAW1R,KAAKsxD,wBAC9C3+B,EAAUjhB,oBAAoB,UAAW1R,KAAKwxD,wBAC9C7+B,EAAUjhB,oBAAoB,WAAY1R,KAAK0xD,qBAC/C/+B,EAAU/iB,iBAAiB,QAAS5P,KAAKkxD,sBACzCv+B,EAAU/iB,iBAAiB,SAAU5P,KAAKoxD,uBAC1Cz+B,EAAU/iB,iBAAiB,UAAW5P,KAAKsxD,wBAC3C3+B,EAAU/iB,iBAAiB,UAAW5P,KAAKwxD,wBAC3C7+B,EAAU/iB,iBAAiB,WAAY5P,KAAK0xD,oBAAoB,GAElE,CAEAP,qBAAAA,CAAsB7jD,GACrB,MAAMwlD,EAAgBxlD,EAAMhJ,OAAOqJ,QAAQ,0BAC3C,GAAImlD,EAAe,CAClBxlD,EAAME,iBACN,MAAM8d,EAAQtrB,KAAK+yD,0BAA0BD,GACvC5uD,EAAQ4uD,EAAcvhD,aAAa,yBAA2B,GAMpE,OALI+Z,IACHA,EAAMpnB,MAAQlE,KAAKgzD,sBAAsB9uD,IAE1ClE,KAAKizD,cAAc/uD,QACnBlE,KAAKkzD,6BAA6BJ,EAEnC,CAEA,MAAMK,EAAe7lD,EAAMhJ,OAAOqJ,QAAQ,mBAC1C,GAAIwlD,EAAc,CACjB7lD,EAAME,iBACNF,EAAMuD,kBACN,MAAM4P,EAASzgB,KAAKozD,2BAA2BD,GACzCE,EAAWrzD,KAAKszD,4BAA4B7yC,GAMlD,YALI4yC,GAAuC,mBAApBA,EAAS5yC,OAC/B4yC,EAAS5yC,SACC4yC,GAAqC,mBAAlBA,EAAS7yC,MACtC6yC,EAAS7yC,OAGX,CAEA,MAAM+yC,EAAajmD,EAAMhJ,OAAOqJ,QAAQ,oBACxC,GAAI4lD,EAAY,CACf,MAAM7zD,EAAO6zD,EAAW5lD,QAAQ,0BAC1B2d,EAAQ5rB,EAAOA,EAAK6H,cAAc,0BAA4B,KAEpE,YADAvH,KAAKwzD,YAAYloC,EAAQA,EAAMpnB,MAAQ,GAExC,CAEA,MAAMoD,EAASgG,EAAMhJ,OAAOqJ,QAAQ,eACpC,IAAKrG,EAAQ,OAEb,MAAMy1C,EAAOz1C,EAAO8M,QAAQ2oC,KACf,SAATA,EAIS,SAATA,EAIS,kBAATA,EAIS,kBAATA,EAIJ/8C,KAAKyzD,SAASzzD,KAAK6wD,cAAc9T,EAAM/8C,KAAK4wD,OAAO7T,MAAO,QAHzD/8C,KAAKyzD,SAASzzD,KAAK0zD,uBAAuB,QAAS,YAJnD1zD,KAAKyzD,SAASzzD,KAAK0zD,uBAAuB,QAAS,YAJnD1zD,KAAKyzD,SAASzzD,KAAK4wD,OAAO7T,KAAO,EAAG,QAJpC/8C,KAAKyzD,SAASzzD,KAAK4wD,OAAO7T,KAAO,EAAG,OAgBtC,CAEAwU,uBAAAA,CAAwBjkD,GACvB,GAAkB,WAAdA,EAAM7M,IAAkB,CAC3B,MAAM0yD,EAAe7lD,EAAMhJ,OAAOqJ,QAAQ,mBAC1C,GAAIwlD,EAGH,OAFAnzD,KAAKkzD,6BAA6BC,QAClCA,EAAat2C,MAGf,CAEA,GAAkB,UAAdvP,EAAM7M,IAAiB,OAE3B,MAAM0yD,EAAe7lD,EAAMhJ,OAAOqJ,QAAQ,mBAC1C,GAAIwlD,EAIH,OAHA7lD,EAAME,iBACNxN,KAAKizD,cAAcE,EAAajvD,YAChCivD,EAAajvD,MAAQlE,KAAKgzD,sBAAsBhzD,KAAK4wD,OAAOzW,UAI7D,MAAM7uB,EAAQhe,EAAMhJ,OAAOqJ,QAAQ,0BAC9B2d,IAELhe,EAAME,iBACNxN,KAAKwzD,YAAYloC,EAAMpnB,OACxB,CAEAmtD,sBAAAA,CAAuB/jD,GACtB,MAAMge,EAAQhe,EAAMhJ,OAAOqJ,QAAQ,mBAC/B2d,IACHtrB,KAAKizD,cAAc3nC,EAAMpnB,OACzBonB,EAAMpnB,MAAQlE,KAAKgzD,sBAAsBhzD,KAAK4wD,OAAOzW,SAEvD,CAEAsX,uBAAAA,CAAwBnkD,GACvB,MAAMge,EAAQhe,EAAMhJ,OAAOqJ,QAAQ,mBAC9B2d,IAGLA,EAAMpnB,MAAQsC,OAAOxG,KAAK8wD,kBAAkBxlC,EAAMpnB,MAAOlE,KAAK4wD,OAAOzW,UACtE,CAEAwX,oBAAAA,CAAqBrkD,GACpB,MAAMge,EAAQhe,EAAMhJ,OAAOqJ,QAAQ,mBACnC,IAAK2d,EACJ,OAED,MAAMqoC,EAAUrmD,EAAMoT,yBAAyB2xB,QAAU/kC,EAAMoT,cAAgB,KACzEu1B,EAAU3qB,EAAM3d,QAAQ,sCAC1BsoC,GAAW0d,GAAW1d,EAAQ50C,SAASsyD,KAG3C3zD,KAAKizD,cAAc3nC,EAAMpnB,OACzBonB,EAAMpnB,MAAQlE,KAAKgzD,sBAAsBhzD,KAAK4wD,OAAOzW,SACtD,CAEA8Y,aAAAA,CAAc/uD,GACb,MAAMi2C,EAAUn6C,KAAK8wD,kBAAkB5sD,EAAOlE,KAAK4wD,OAAOzW,SACpDyZ,EAAiBzZ,IAAYn6C,KAAK4wD,OAAOzW,QACzC0Z,EAAmC,IAArB7zD,KAAK4wD,OAAO7T,MAC3B6W,GAAmBC,KAExB7zD,KAAK4wD,OAAOzW,QAAUA,EACtBn6C,KAAK4wD,OAAO7T,KAAO,EACnB/8C,KAAK8xD,UACL9xD,KAAK8zD,YAAYF,EAAgB,YAClC,CAEAH,QAAAA,CAAS1W,EAAMx2C,EAAS,QACvB,MAAM0c,EAAajjB,KAAKmyD,WAAWpV,GAC/B95B,IAAejjB,KAAK4wD,OAAO7T,OAC/B/8C,KAAK4wD,OAAO7T,KAAO95B,EACnBjjB,KAAK8xD,UACL9xD,KAAK8zD,aAAY,EAAOvtD,GACzB,CAEAutD,WAAAA,CAAYF,EAAgBrtD,EAAS,QACpC,MAAMge,EAAU,CACfw4B,KAAM/8C,KAAK4wD,OAAO7T,KAClB5C,QAASn6C,KAAK4wD,OAAOzW,QACrB+C,WAAYl9C,KAAK4wD,OAAO1T,WACxB0W,eAAgB77C,QAAQ67C,GACxBrtD,UAGKwlD,EAAW/rD,KAAKa,QAAQkrD,SACN,mBAAbA,GACVA,EAASxnC,GAEV,MAAMynC,EAAkBhsD,KAAKa,QAAQmrD,gBACjC4H,GAA6C,mBAApB5H,GAC5BA,EAAgBznC,GAGjBvkB,KAAKwwD,MAAM3+B,cAAc,IAAIJ,YAAY,yBAA0B,CAClEC,SAAS,EACTE,OAAQrN,IAEV,CAEAutC,OAAAA,GACC,MAAM3U,EAAQn9C,KAAK+zD,cACbC,EAASh0D,KAAKi0D,aAAa9W,GACjCn9C,KAAK+wD,YAAY3uD,SAASuwB,KACN3yB,KAAKgxD,uBAAuB/tD,IAAI0vB,IAAc,MAC9CqhC,IAGnBrhC,EAAU7uB,UAAYkwD,EACtBh0D,KAAKgxD,uBAAuBpuD,IAAI+vB,EAAWqhC,GAC3Ch0D,KAAKk0D,qBAAqBvhC,GAAU,GAEtC,CAEAshC,YAAAA,CAAa9W,GACZ,MAAMiO,EAAQprD,KAAKm0D,gBACbC,EAAap0D,KAAKq0D,mBAAmBjJ,GACrCkJ,EAAet0D,KAAK4wD,OAAO7T,MAAQ,EAAI,WAAa,GACpDwX,EAAev0D,KAAK4wD,OAAO7T,MAAQ/8C,KAAK4wD,OAAO1T,WAAa,WAAa,GAEzEsX,EADcx0D,KAAKa,QAAQ4qD,YACCzrD,KAAKy0D,sBAAwB,GACzDC,EAAgB10D,KAAK20D,uBACxB30D,KAAK40D,wBACL,GAEH,MAAO,sEACuDxJ,6DAAiEgJ,yCAC3HI,+JAE0EF,KAAgBt0D,KAAKa,QAAQspD,iCACtGhN,EAAM7uC,KAAKwB,GAAS9P,KAAK60D,eAAe/kD,KAAO0T,KAAK,2FACqB+wC,KAAgBv0D,KAAKa,QAAQupD,+CAEvGsK,uBAGL,CAEAD,mBAAAA,GACC,MAAM9uD,EAAU3F,KAAK80D,2BAGrB,MAAO,8DAFW90D,KAAK+0D,yBACgB,SAAS/0D,KAAKa,QAAQopD,sBAAwB,6JAQ1EjqD,KAAK0wD,0JAKH1wD,KAAKgzD,sBAAsBhzD,KAAK4wD,OAAOzW,sCAClCn6C,KAAKa,QAAQopD,ocAUxBtkD,EAAQ2I,KAAKpK,GACP,wFAAwFA,MAAUlE,KAAKgzD,sBAAsB9uD,gBAClIsf,KAAK,iFAMd,CAEAuxC,sBAAAA,GACC,MAAM5oC,EAAQnsB,KAAKwwD,MAAQxwD,KAAKwwD,MAAMjpD,cAAc,SAAW,KACzD2hB,EAAOiD,EACVA,EAAM5a,aAAa,uCACnB,KACH,GAAa,OAAT2X,EAAe,CAClB,MAAMjG,EAAazc,OAAO0iB,GAAM1jB,cAAciB,OAC9C,MAAsB,UAAfwc,GAAyC,MAAfA,CAClC,CAEA,OAAOlL,QAAQ/X,KAAKa,QAAQ6qD,iBAC7B,CAEAmJ,cAAAA,CAAe/kD,GACd,GAAIA,GAAwB,iBAATA,GAAmC,aAAdA,EAAK9D,KAAqB,CACjE,MAAMgpD,EAA4B,SAAnBllD,EAAK8L,UACdq5C,EAAaD,EAAS,gBAAkB,gBACxCvoD,EAAUuoD,EAAS,UAAY,UAC/BE,EAAal1D,KAAK0zD,uBAAuB5jD,EAAK8L,WAC9Cu5C,EAAWhgD,KAAKuG,IAAIw5C,EAAal1D,KAAK4wD,OAAO7T,MAInD,MAAO,0EAA0EkY,kBAHnED,EACX,WAAWG,SAAgBA,EAAW,EAAI,IAAM,KAChD,cAAcA,SAAgBA,EAAW,EAAI,IAAM,8HACqL1oD,mBAC5O,CACA,MAAMiqB,EAAS5mB,IAAS9P,KAAK4wD,OAAO7T,KAAO,YAAc,GACzD,MAAO,0CAA0CrmB,iBAAsB5mB,oBAAuB4mB,EAAS,OAAS,YAAY5mB,YAC7H,CAEA8kD,qBAAAA,GACC,MAAO,2HAKG50D,KAAK4wD,OAAO1T,oHAIVl9C,KAAK4wD,OAAO7T,oGAEmD/8C,KAAKa,QAAQwpD,sBAAwB,mCAGjH,CAEA0J,WAAAA,GACC,MAAM/sC,EAAQhnB,KAAK4wD,OAAO1T,WACpBpjB,EAAU95B,KAAKmyD,WAAWnyD,KAAK4wD,OAAO7T,MACtCqY,EAAajgD,KAAKC,IAAI,EAAGpV,KAAK6wD,cAAc7wD,KAAKa,QAAQ2qD,gBAAiB,IAGhF,KAFuBzzC,QAAQ/X,KAAKa,QAAQyqD,WAAatkC,EAAQhnB,KAAK6wD,cAAc7wD,KAAKa,QAAQ0qD,cAAe,KAEzFvkC,GAASouC,EAAa,EAC5C,OAAOp1D,KAAKq1D,OAAO,EAAGruC,GAGvB,MAAMsuC,EAAcF,EACpB,IAAIG,EAAQpgD,KAAKC,IAAI,EAAG0kB,EAAU3kB,KAAK2gB,MAAMw/B,EAAc,IACvDE,EAAMrgD,KAAKO,IAAIsR,EAAQ,EAAGuuC,EAAQD,EAAc,GAEpDC,EAAQpgD,KAAKC,IAAI,EAAGogD,EAAMF,EAAc,GAExC,MAAMnY,EAAQ,CAAC,GACXoY,EAAQ,GAAGpY,EAAMxlC,KAAK,CAAE3L,KAAM,WAAY4P,UAAW,SACzD,IAAK,IAAImhC,EAAOwY,EAAOxY,GAAQyY,EAAKzY,GAAQ,EAC3CI,EAAMxlC,KAAKolC,GAIZ,OAFIyY,EAAMxuC,EAAQ,GAAGm2B,EAAMxlC,KAAK,CAAE3L,KAAM,WAAY4P,UAAW,SAC/DuhC,EAAMxlC,KAAKqP,GACJm2B,CACR,CAEA4V,yBAAAA,CAA0BzqC,GACzB,MAAM5oB,EAAO4oB,EAAOA,EAAK3a,QAAQ,sCAAwC,KACzE,OAAOjO,EAAOA,EAAK6H,cAAc,mBAAqB,IACvD,CAEA6rD,0BAAAA,CAA2B9qC,GAC1B,MAAM5oB,EAAO4oB,EAAOA,EAAK3a,QAAQ,sCAAwC,KACzE,OAAOjO,EAAOA,EAAK6H,cAAc,2CAA6C,IAC/E,CAEA+rD,2BAAAA,CAA4B7yC,GAC3B,IAAKA,EACJ,OAAO,KAER,IAAIF,EAAWvgB,KAAK4xD,mBAAmB3uD,IAAIwd,GAC3C,OAAIF,IAGJA,EAAW+mB,GAAWv/B,oBAAoB0Y,EAAQ,CACjD9C,UAAW,OACX4pB,OAAO,EACPlpB,UAAW,CACV1B,MAAM,EACNxc,QAAQ,EACR0d,MAAO,OAGT7d,KAAK4xD,mBAAmBhvD,IAAI6d,EAAQF,GAC7BA,EACR,CAEA2zC,oBAAAA,CAAqBvhC,GACpB,MAAMlS,EAASkS,EAAUprB,cAAc,+DAClCkZ,GAGLzgB,KAAKszD,4BAA4B7yC,EAClC,CAEAyyC,4BAAAA,CAA6B5qC,GAC5B,MAAM7H,EAASzgB,KAAKozD,2BAA2B9qC,GAC/C,IAAK7H,EACJ,OAED,MAAM4yC,EAAWrzD,KAAK4xD,mBAAmB3uD,IAAIwd,GACzC4yC,GAAqC,mBAAlBA,EAASzyC,MAC/ByyC,EAASzyC,MAEX,CAEA+zC,oBAAAA,GACC,GAAI30D,KAAK4wD,OAAO1T,YAAc,EAAG,OAAO,EAExC,MAAMrzB,EAAO7pB,KAAKa,QAAQgrD,UAC1B,IAAa,IAAThiC,GAA0B,SAATA,EAAiB,OAAO,EAC7C,IAAa,IAATA,GAA2B,UAATA,EAAkB,OAAO,EAE/C,MAAMhY,EAAY7R,KAAK6wD,cAAc7wD,KAAKa,QAAQ0qD,cAAe,GACjE,OAAOvrD,KAAK4wD,OAAO1T,WAAarrC,CACjC,CAEAsiD,aAAAA,GACC,MAAMjwD,GAASlE,KAAKa,QAAQuqD,OAAS,QAAQhnC,WAAW5e,cACxD,MAAc,WAAVtB,GAAgC,UAAVA,GAA+B,YAAVA,EAA4BA,EACpE,MACR,CAEAmwD,kBAAAA,CAAmBjJ,GAClB,MAAc,WAAVA,EAA2B,SACjB,UAAVA,EAA0B,WAChB,YAAVA,EAA4B,gBACzB,YACR,CAEA0J,wBAAAA,GACC,MAAMpmD,EAAO1O,KAAKa,QAAQirD,eAEpB7oC,GADU7R,MAAMiP,QAAQ3R,GAAQA,EAAO,CAAC,GAAI,GAAI,GAAI,MAExDJ,KAAKwB,GAAS9P,KAAK6wD,cAAc/gD,EAAM,KACvC7N,QAAQ6N,GAASA,EAAO,GAAKA,GAAQ9P,KAAK0wD,cAC5C,OAAKztC,EAAW7U,QACX6U,EAAWvX,SAAS1L,KAAK4wD,OAAOzW,UAAUl3B,EAAWtL,KAAK3X,KAAK4wD,OAAOzW,SACpE/oC,MAAMC,KAAK,IAAIN,IAAIkS,IAAaqpB,MAAK,CAACphB,EAAGqhB,IAAMrhB,EAAIqhB,KAF3B,CAACvsC,KAAK4wD,OAAOzW,QAG7C,CAEAwW,kBAAAA,GACC,MAAM5nB,EAAM/oC,KAAKa,QAAQiqD,WACzB,OAAO9qD,KAAK6wD,cAAc9nB,EAAK,IAChC,CAEA+nB,iBAAAA,CAAkB5sD,EAAO4vC,GACxB,MAAM7wB,EAAajjB,KAAK6wD,cAAc3sD,EAAO4vC,GAC7C,OAAO3+B,KAAKO,IAAIuN,EAAYjjB,KAAK0wD,YAClC,CAEA+E,uBAAAA,GACC,MAAMC,EAAY11D,KAAKa,QAAQqpD,oBACzBjnC,EAAazc,OAAOkvD,GAAa,IAAIjvD,OAC3C,GAAIwc,EACH,OAAOA,EAER,MAAMwI,EAAQjlB,OAAOxG,KAAKa,QAAQopD,cAAgB,IAAIzkD,cACtD,MAAO,UAAU8xB,KAAK7L,GAAS,cAAgB,MAChD,CAEAunC,qBAAAA,CAAsB9uD,GAErB,MAAO,GADiBlE,KAAK6wD,cAAc3sD,EAAOlE,KAAK4wD,OAAOzW,cAC/Bn6C,KAAKy1D,2BACrC,CAEAtD,UAAAA,CAAWpV,GACV,MAAM95B,EAAajjB,KAAK6wD,cAAc9T,EAAM,GAC5C,OAAO5nC,KAAKC,IAAI,EAAGD,KAAKO,IAAIuN,EAAYjjB,KAAK4wD,OAAO1T,YACrD,CAEA2T,aAAAA,CAAc3sD,EAAO4vC,GACpB,MAAMlB,EAAS/9B,OAAOw3B,SAASnoC,EAAO,IACtC,OAAO2Q,OAAOI,SAAS29B,IAAWA,EAAS,EAAIA,EAASkB,CACzD,CAEA0f,WAAAA,CAAYtvD,GACX,MAAM64C,EAAO/8C,KAAK6wD,cAAc3sD,EAAOlE,KAAK4wD,OAAO7T,MACnD/8C,KAAKyzD,SAAS1W,EAAM,OACrB,CAEA2W,sBAAAA,CAAuB93C,GACtB,MACM+5C,EADQ31D,KAAK+zD,cACe9xD,QAAQ6N,GAAS+E,OAAOw0B,UAAUv5B,IAASA,EAAO,GAAKA,EAAO9P,KAAK4wD,OAAO1T,aAC5G,IAAKyY,EAAoBvnD,OACxB,MAAqB,SAAdwN,EAAuB,EAAI5b,KAAK4wD,OAAO1T,WAE/C,MAAM0Y,EAAeD,EAAoB,GACnCE,EAAcF,EAAoBA,EAAoBvnD,OAAS,GACrE,MAAkB,SAAdwN,EACI5b,KAAKmyD,WAAWyD,EAAe,GAEhC51D,KAAKmyD,WAAW0D,EAAc,EACtC,CAEAR,MAAAA,CAAOE,EAAOC,GACb,MAAM5/B,EAAS,GACf,IAAK,IAAI1xB,EAAQqxD,EAAOrxD,GAASsxD,EAAKtxD,GAAS,EAC9C0xB,EAAOje,KAAKzT,GAEb,OAAO0xB,CACR,GCnLD,GAvbA,MACIr1B,WAAAA,CAAY4rB,EAAOxmB,EAAU,CAAC,GAC1B3F,KAAK81D,OAAS3pC,EACdnsB,KAAKoS,SAAWhP,OAAO6C,OAAO,CAC1BgmD,aAAc,GACdC,WAAY,MACZ6J,WAAY,CAAC,MAAO,QACpBtL,SAAU,4BACVC,UAAW,yBACX4B,iBAAkB,KAClBP,SAAU,KACViK,WAAW,EACXC,oBAAoB,EACpB5J,oBAAoB,GACrB1mD,GAEH3F,KAAKk2D,SAAW,GAChBl2D,KAAKm2D,OAAS,GACdn2D,KAAKo2D,gBAAkB,IAAInF,QAC3BjxD,KAAKq2D,YAAcr2D,KAAKs2D,aAAa30D,KAAK3B,MAC1CA,KAAKu2D,cAAgBv2D,KAAKw2D,eAAe70D,KAAK3B,KAClD,CAEAkI,IAAAA,GACIlI,KAAKk2D,SAAWl2D,KAAKy2D,cAChBz2D,KAAKk2D,SAAS9nD,SAGnBpO,KAAK02D,8BAEL12D,KAAKk2D,SAAS9zD,SAAQ,CAACke,EAAQ4B,KACtBliB,KAAK22D,YAAYr2C,EAAQ4B,IAK9B5B,EAAOlM,QAAQorC,SAAW,IAC1Bl/B,EAAOs2C,SAAW,EAClBt2C,EAAO5Q,aAAa,OAAQ,UAC5B4Q,EAAO5Q,aAAa,YAAa,QACjC1P,KAAK62D,gBAAgBv2C,IARjBA,EAAO5Q,aAAa,YAAa,OAQT,IAGhC1P,KAAK81D,OAAOlmD,iBAAiB,QAAS5P,KAAKq2D,aAC3Cr2D,KAAK81D,OAAOlmD,iBAAiB,UAAW5P,KAAKu2D,eAC7Cv2D,KAAK82D,qBACT,CAEAhZ,QAAAA,CAASv5B,EAAU,CAAC,GAChB,GAAInT,MAAMiP,QAAQkE,EAAQq5B,OAAQ,CAC9B,MAAM36B,EAAajjB,KAAK+2D,gBAAgBxyC,EAAQq5B,OAEhD,YADA59C,KAAKg3D,UAAU/zC,GAAY,EAE/B,CAEA,MAAMf,EAAQliB,KAAKi3D,cAAc1yC,GAC7BrC,EAAQ,EACRliB,KAAKg3D,UAAU,IAAI,GAGlBh3D,KAAK22D,YAAY32D,KAAKk2D,SAASh0C,GAAQA,IAG5CliB,KAAKg3D,UAAU,CAAC,CAAE90C,QAAO+U,IAAKj3B,KAAKk3D,cAAc3yC,EAAQ0S,QAAS,EACtE,CAEAkgC,OAAAA,CAAQ5yC,EAAU,CAAC,GACfvkB,KAAKk2D,SAAWl2D,KAAKy2D,cAChBz2D,KAAKk2D,SAAS9nD,SAGnBpO,KAAK02D,8BAEL12D,KAAKk2D,SAAS9zD,SAAQ,CAACke,EAAQ4B,KAC3B,IAAKliB,KAAK22D,YAAYr2C,EAAQ4B,GAK1B,OAJA5B,EAAO6R,gBAAgB,iBACvB7R,EAAO6R,gBAAgB,uBACvB7R,EAAO6R,gBAAgB,2BACvB7R,EAAO5Q,aAAa,YAAa,QAIrC4Q,EAAOlM,QAAQorC,SAAW,IAC1Bl/B,EAAOs2C,SAAW,EAClBt2C,EAAO5Q,aAAa,OAAQ,UACvB4Q,EAAO4R,aAAa,cACrB5R,EAAO5Q,aAAa,YAAa,QAErC1P,KAAK62D,gBAAgBv2C,EAAO,IAG5BlP,MAAMiP,QAAQkE,EAAQq5B,OACtB59C,KAAKg3D,UAAUh3D,KAAK+2D,gBAAgBxyC,EAAQq5B,QAAQ,GAIxD59C,KAAKg3D,UAAUh3D,KAAK+2D,gBAAgB/2D,KAAKm2D,SAAS,GACtD,CAEAW,kBAAAA,GACI,MAAM50C,EAAQliB,KAAKi3D,cAAc,CAC7BjrB,MAAOhsC,KAAKoS,SAAS65C,aACrBhe,aAAc,IAEd/rB,EAAQ,IAAMliB,KAAK22D,YAAY32D,KAAKk2D,SAASh0C,GAAQA,GACrDliB,KAAKg3D,UAAU,IAAI,GAGvBh3D,KAAKg3D,UAAU,CAAC,CAAE90C,QAAO+U,IAAKj3B,KAAKk3D,cAAcl3D,KAAKoS,SAAS85C,eAAgB,EACnF,CAEAuK,WAAAA,GACI,MAAMW,EAAOp3D,KAAK81D,OAAO7sB,OAASjpC,KAAK81D,OAAOvuD,cAAc,SAC5D,OAAK6vD,GAASA,EAAKhrC,KAAKhe,OAGjBgD,MAAMC,KAAK+lD,EAAKhrC,KAAK,GAAGM,OAFpB,EAGf,CAEAiqC,WAAAA,CAAYr2C,EAAQ4B,GAChB,MAA8C,mBAAnCliB,KAAKoS,SAASk6C,kBACdv0C,QAAQ/X,KAAKoS,SAASk6C,iBAAiBhsC,EAAQ4B,GAG9D,CAEAo0C,YAAAA,CAAahpD,GACT,MAAMgT,EAAShT,EAAMhJ,OAAOqJ,QAAQ,MACpC,IAAK2S,IAAWtgB,KAAK81D,OAAOz0D,SAASif,GACjC,OAGJ,MAAM4B,EAAQliB,KAAKk2D,SAASn/B,QAAQzW,GACpC,GAAI4B,EAAQ,IAAMliB,KAAK22D,YAAYr2C,EAAQ4B,GACvC,OAGJ,MAAMm1C,EAAQ/pD,EAAMhJ,OAAOqJ,QAAQ,qBAC7B2pD,EAAYt3D,KAAKu3D,aAAajqD,GACpC,GAAI+pD,GAAS/2C,EAAOjf,SAASg2D,GAA7B,CACI,MAAMpgC,EAAMj3B,KAAKk3D,cAAcG,EAAM9lD,aAAa,oBAClDvR,KAAKw3D,sBAAsBt1C,EAAO+U,EAAKqgC,GAAW,EAEtD,MAEAt3D,KAAKy3D,aAAav1C,EAAOo1C,EAC7B,CAEAd,cAAAA,CAAelpD,GACX,GAAkB,UAAdA,EAAM7M,KAAiC,MAAd6M,EAAM7M,IAC/B,OAGJ,MAAM6f,EAAShT,EAAMhJ,OAAOqJ,QAAQ,MACpC,IAAK2S,IAAWtgB,KAAK81D,OAAOz0D,SAASif,GACjC,OAGJ,MAAM4B,EAAQliB,KAAKk2D,SAASn/B,QAAQzW,GAChC4B,EAAQ,IAAMliB,KAAK22D,YAAYr2C,EAAQ4B,KAI3C5U,EAAME,iBACNxN,KAAKy3D,aAAav1C,EAAOliB,KAAKu3D,aAAajqD,IAC/C,CAEAiqD,YAAAA,CAAajqD,GACT,QAAKtN,KAAKoS,SAAS4jD,aAGdh2D,KAAKoS,SAAS6jD,oBAGZl+C,QAAQzK,GAASA,EAAMikC,UAClC,CAEAkmB,YAAAA,CAAav1C,EAAOo1C,GAChB,MAAMx9B,EAAU95B,KAAKm2D,OAAO3zD,MAAMsN,GAASA,EAAKoS,QAAUA,KAAU,KAC9D6zC,EAAa/1D,KAAK03D,iBAClBC,EAAW5B,EAAW,GACtB6B,EAAY7B,EAAW,IAAM4B,EAE9B79B,EAIDA,EAAQ7C,MAAQ0gC,EAIpB33D,KAAK63D,uBAAuB31C,EAAOo1C,GAAW,GAH1Ct3D,KAAKw3D,sBAAsBt1C,EAAO01C,EAAWN,GAAW,GAJxDt3D,KAAKw3D,sBAAsBt1C,EAAOy1C,EAAUL,GAAW,EAQ/D,CAEAE,qBAAAA,CAAsBt1C,EAAO+U,EAAKqgC,EAAW7Q,GACzC,IAAI/yB,EAAO1zB,KAAKm2D,OAAOt0C,QACvB6R,EAAOA,EAAKzxB,QAAQ6N,GAASA,EAAKoS,QAAUA,IACvCo1C,IACD5jC,EAAO,IAEXA,EAAK/b,KAAK,CAAEuK,QAAO+U,IAAKj3B,KAAKk3D,cAAcjgC,KAC3Cj3B,KAAKg3D,UAAUtjC,EAAM+yB,EACzB,CAEAoR,sBAAAA,CAAuB31C,EAAOo1C,EAAW7Q,GACrC,IAAI/yB,EAAO1zB,KAAKm2D,OAAOt0C,QACvB6R,EAAOA,EAAKzxB,QAAQ6N,GAASA,EAAKoS,QAAUA,IACvCo1C,IACD5jC,EAAO,IAEX1zB,KAAKg3D,UAAUtjC,EAAM+yB,EACzB,CAEAuQ,SAAAA,CAAUc,EAAWrR,GACjBzmD,KAAKm2D,OAASn2D,KAAK+2D,gBAAgBe,GACnC,MAAMC,EAAc,IAAI5pC,IA2CxB,GA1CAnuB,KAAKm2D,OAAO/zD,SAAQ,CAAC0N,EAAMoS,KACvB61C,EAAYn1D,IAAIkN,EAAKoS,MAAO,CACxB+U,IAAKnnB,EAAKmnB,IACV+gC,SAAU91C,EAAQ,GACpB,IAGNliB,KAAKk2D,SAAS9zD,SAAQ,CAACke,EAAQ23C,KAC3B,MAAM3rB,EAAOyrB,EAAYjvC,IAAImvC,GAAeF,EAAY90D,IAAIg1D,GAAe,KAC3E,IAAKj4D,KAAK22D,YAAYr2C,EAAQ23C,GAI1B,OAHA33C,EAAO6R,gBAAgB,uBACvB7R,EAAO6R,gBAAgB,2BACvB7R,EAAO5Q,aAAa,YAAa,QAIrC,MAAMwoD,EAAWl4D,KAAKm4D,mBAAmB73C,GACnC83C,EAAeF,EAASE,aACxBC,EAAYH,EAASG,UACrBC,EAAaJ,EAASI,WACtBC,EAAqBxgD,QAAQ/X,KAAKoS,SAASi6C,qBAAuB/f,GAEpE8rB,IACAA,EAAarmB,OAASwmB,GAGtBjsB,GACAhsB,EAAOlM,QAAQokD,cAAgBlsB,EAAKrV,IACpC3W,EAAOlM,QAAQqkD,aAAejyD,OAAO8lC,EAAK0rB,UAC1C13C,EAAO5Q,aAAa,YAA0B,QAAb48B,EAAKrV,IAAgB,YAAc,cAChEohC,GAAWA,EAAU3oD,aAAa,eAA6B,QAAb48B,EAAKrV,IAAgB,OAAS,SAChFqhC,GAAYA,EAAW5oD,aAAa,eAA6B,SAAb48B,EAAKrV,IAAiB,OAAS,WAEvF3W,EAAO6R,gBAAgB,uBACvB7R,EAAO6R,gBAAgB,sBACvB7R,EAAO5Q,aAAa,YAAa,QAC7B2oD,GAAWA,EAAU3oD,aAAa,eAAgB,SAClD4oD,GAAYA,EAAW5oD,aAAa,eAAgB,SAC5D,IAEJ1P,KAAK04D,+BAEAjS,GAA0C,mBAA3BzmD,KAAKoS,SAAS25C,SAC9B,OAGJ,MAAM4M,EAAQ34D,KAAKm2D,OAAO,IAAM,KAChCn2D,KAAKoS,SAAS25C,SAAS,CACnB/f,MAAO2sB,EAAQ34D,KAAK44D,iBAAiBD,EAAMz2C,OAAS,GACpD+U,IAAK0hC,EAAQA,EAAM1hC,IAAMj3B,KAAKk3D,cAAcl3D,KAAKoS,SAAS85C,YAC1Dje,YAAa0qB,EAAQA,EAAMz2C,OAAS,EACpC07B,MAAO59C,KAAKm2D,OAAO7nD,KAAKwB,IAAI,CACxBk8B,MAAOhsC,KAAK44D,iBAAiB9oD,EAAKoS,OAClC+U,IAAKnnB,EAAKmnB,IACVgX,YAAan+B,EAAKoS,WAG9B,CAEA60C,eAAAA,CAAgBjrC,GACZ,MAAM67B,EAAS,GACTkR,EAAO,IAAI9nD,IAkBjB,OAjBCK,MAAMiP,QAAQyL,GAASA,EAAQ,IAAI1pB,SAAS0N,IACzC,MAAMoS,EAAQrN,OAAOw3B,SAASv8B,EAAKoS,OAASpS,EAAKm+B,YAAa,KACzDp5B,OAAOw0B,UAAUnnB,IAAUA,EAAQ,GAAKA,GAASliB,KAAKk2D,SAAS9nD,QAG/DpO,KAAK22D,YAAY32D,KAAKk2D,SAASh0C,GAAQA,KAGxC22C,EAAK/vC,IAAI5G,KAGb22C,EAAKz3D,IAAI8gB,GACTylC,EAAOhwC,KAAK,CACRuK,QACA+U,IAAKj3B,KAAKk3D,cAAcpnD,EAAKmnB,QAC/B,IAEC0wB,CACX,CAEA+Q,2BAAAA,GACI,MAAMtsC,EAAOpsB,KAAK84D,cACb1sC,EAAKhe,SAIVge,EAAKhqB,SAASqqB,IACVrb,MAAMC,KAAKob,EAAIC,OAAS,IAAItqB,SAASuqB,IACjCA,EAAKwF,gBAAgB,sBACrBxF,EAAKwF,gBAAgB,uBAAuB,GAC9C,IAGNnyB,KAAKm2D,OAAO/zD,SAAQ,CAACkqC,EAAMpqB,KACvBkK,EAAKhqB,SAASqqB,IACV,MAAME,EAAOF,EAAIC,OAASD,EAAIC,MAAM4f,EAAKpqB,OAASuK,EAAIC,MAAM4f,EAAKpqB,OAAS,KACrEyK,IAGLA,EAAKjd,aAAa,qBAAsB,KACxCid,EAAKjd,aAAa,uBAAwBlJ,OAAO0b,EAAQ,IAAG,GAC9D,IAEV,CAEA42C,WAAAA,GACI,MAAM1sC,EAAO,GAiBb,MAhBiB,CAAC,QAAS,UAAW,SAE7BhqB,SAASwqC,IACd,MAAM1oC,EAAQlE,KAAK81D,OAAOlpB,GACrB1oC,IAGW,YAAZ0oC,EAMJxgB,EAAKzU,QAAQvG,MAAMC,KAAKnN,EAAMkoB,MAAQ,KALlChb,MAAMC,KAAKnN,GAAO9B,SAAS0E,IACvBslB,EAAKzU,QAAQvG,MAAMC,KAAKvK,EAAKslB,MAAQ,IAAI,IAIP,IAGvCA,CACX,CAEAyqC,eAAAA,CAAgBv2C,GACZ,GAAIA,EAAO/Y,cAAc,uBAErB,YADAvH,KAAKo2D,gBAAgB1wD,OAAO4a,GAIhC,MAAMmL,EAAQpe,SAAS2K,cAAc,QAErC,IADAyT,EAAM3I,UAAY,kBACXxC,EAAOy4C,YACVttC,EAAMnB,YAAYhK,EAAOy4C,YAG7B,MAAMb,EAAW7qD,SAAS2K,cAAc,QACxCkgD,EAASp1C,UAAY,qBACrBo1C,EAASp0D,UAAY,sHACsF9D,KAAKg5D,YAAYh5D,KAAKoS,SAASq4C,wKAC7BzqD,KAAKg5D,YAAYh5D,KAAKoS,SAASs4C,8DAG5Ij/B,EAAMnB,YAAY4tC,GAClB53C,EAAOgK,YAAYmB,GACnBzrB,KAAKo2D,gBAAgB1wD,OAAO4a,EAChC,CAEA63C,kBAAAA,CAAmB73C,GACf,GAAItgB,KAAKo2D,gBAAgBttC,IAAIxI,GACzB,OAAOtgB,KAAKo2D,gBAAgBnzD,IAAIqd,GAEpC,MAAM43C,EAAW,CACbE,aAAc93C,EAAO/Y,cAAc,uBACnC8wD,UAAW/3C,EAAO/Y,cAAc,2BAChC+wD,WAAYh4C,EAAO/Y,cAAc,6BAGrC,OADAvH,KAAKo2D,gBAAgBxzD,IAAI0d,EAAQ43C,GAC1BA,CACX,CAEAU,gBAAAA,CAAiB12C,GACb,MAAM5B,EAAStgB,KAAKk2D,SAASh0C,GAC7B,OAAK5B,GAGGA,EAAO/O,aAAa,eAAiB,IAAI9K,OAFtC,EAGf,CAEAwwD,aAAAA,CAAc1yC,EAAU,CAAC,GACrB,MAAMynB,GAASznB,EAAQynB,OAAS,IAAI5nB,WAAW3d,OAC/C,GAAIulC,EAAO,CACP,MAAMJ,EAAU5rC,KAAKk2D,SAAS+C,WAAW34C,IAC7BA,EAAO/O,aAAa,eAAiB,IAAI9K,SAAWulC,IAEhE,GAAIJ,GAAW,EACX,OAAOA,CAEf,CAEA,MAAMstB,EAAUrkD,OAAOw3B,SAAS9nB,EAAQ0pB,YAAa,IACrD,OAAIp5B,OAAOw0B,UAAU6vB,IAAYA,GAAW,GAAKA,EAAUl5D,KAAKk2D,SAAS9nD,OAC9D8qD,GAGH,CACZ,CAEAhC,aAAAA,CAAcjgC,GACV,MAAMhU,EAAazc,OAAOywB,GAAKzxB,cACzBuwD,EAAa/1D,KAAK03D,iBACxB,OAAO3B,EAAWrqD,SAASuX,GAAcA,EAAa8yC,EAAW,EACrE,CAEA2B,cAAAA,GACI,MACMz0C,GADO7R,MAAMiP,QAAQrgB,KAAKoS,SAAS2jD,YAAc/1D,KAAKoS,SAAS2jD,WAAa,CAAC,MAAO,SAErFznD,KAAKwB,GAAStJ,OAAOsJ,GAAMtK,cAAciB,SACzCxE,QAAQ6N,GAAkB,QAATA,GAA2B,SAATA,IACxC,OAAOmT,EAAW7U,OAASgD,MAAMC,KAAK,IAAIN,IAAIkS,IAAe,CAAC,MAAO,OACzE,CAEAyzC,2BAAAA,GACQ12D,KAAKoS,SAASi6C,mBACdrsD,KAAK81D,OAAOpmD,aAAa,iCAAkC,KAG/D1P,KAAK81D,OAAO3jC,gBAAgB,iCAChC,CAEA6mC,WAAAA,CAAY90D,GACR,OAAOsC,OAAOtC,GACTkkB,QAAQ,KAAM,SACdA,QAAQ,KAAM,UACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,OACvB,GC7LJ,GAvPA,MACI7nB,WAAAA,CAAY4rB,EAAOppB,EAAS,CAAC,GACzB/C,KAAK81D,OAAS3pC,EACdnsB,KAAKa,QAAUkC,GAA4B,iBAAXA,EAAsBA,EAAS,CAAC,EAChE/C,KAAKm5D,WAAa,IAAIpoD,IACtB/Q,KAAKq2D,YAAcr2D,KAAKs2D,aAAa30D,KAAK3B,MAC1CA,KAAKo5D,cAAe,CACxB,CAEAlxD,IAAAA,GACSlI,KAAKiT,eAAgBjT,KAAKo5D,eAG/Bp5D,KAAK81D,OAAOlmD,iBAAiB,QAAS5P,KAAKq2D,aAC3Cr2D,KAAKo5D,cAAe,EACpBp5D,KAAKm3D,UACT,CAEA1lD,OAAAA,GACSzR,KAAKo5D,eAGVp5D,KAAK81D,OAAOpkD,oBAAoB,QAAS1R,KAAKq2D,aAC9Cr2D,KAAKo5D,cAAe,EACxB,CAEAjC,OAAAA,GACI,IAAKn3D,KAAKiT,aACN,OAGJ,MAAMmZ,EAAOpsB,KAAKq5D,WAClB,IAAKjtC,EAAKhe,OACN,OAGJpO,KAAKs5D,mBAAmBltC,GACxBpsB,KAAKu5D,wBAAwBntC,GAE7B,MAAMwgC,EAAS5sD,KAAKw5D,aACd3M,EAAa7sD,KAAKy5D,iBAClBC,EAAU,IAAIvrC,IACdwrC,EAAa,IAAIxrC,IACjByrC,EAAmB,IAAIzrC,IAE7B/B,EAAKhqB,SAAQ,CAACqqB,EAAKvK,KACf,MAAM23C,EAAa,OAAO33C,EAAQ,IAC5B43C,EAAQtzD,OAAOimB,EAAIlb,aAAaq7C,IAAWiN,GAAYpzD,QAAUozD,EACvEptC,EAAI/c,aAAak9C,EAAQkN,GACzBJ,EAAQ92D,IAAIk3D,EAAOrtC,GAEnB,MAAMstC,EAAWvzD,OAAOimB,EAAIlb,aAAas7C,IAAe,IAAIpmD,OAC5DkzD,EAAW/2D,IAAIk3D,EAAOC,GAClBA,IACKH,EAAiB9wC,IAAIixC,IACtBH,EAAiBh3D,IAAIm3D,EAAU,IAEnCH,EAAiB32D,IAAI82D,GAAUpiD,KAAKmiD,GACxC,IAGJ,MAAME,EAAa,IAAI7rC,IACjB8rC,EAAYH,IACd,GAAIE,EAAWlxC,IAAIgxC,GACf,OAAOE,EAAW/2D,IAAI62D,GAE1B,MAAMC,EAAWvzD,OAAOmzD,EAAW12D,IAAI62D,IAAU,IAAIrzD,OACrD,IAAKszD,EAED,OADAC,EAAWp3D,IAAIk3D,EAAO,GACf,EAEX,IAAKJ,EAAQ5wC,IAAIixC,IAAaA,IAAaD,EAEvC,OADAE,EAAWp3D,IAAIk3D,EAAO,GACf,EAEX,MAAMI,EAAQ/kD,KAAKC,IAAI,EAAG6kD,EAASF,GAAY,GAE/C,OADAC,EAAWp3D,IAAIk3D,EAAOI,GACfA,CAAK,EAGVC,EAAuBL,IACzB,IAAIC,EAAWvzD,OAAOmzD,EAAW12D,IAAI62D,IAAU,IAAIrzD,OACnD,KAAOszD,GAAU,CACb,GAAI/5D,KAAKm5D,WAAWrwC,IAAIixC,GACpB,OAAO,EAEXA,EAAWvzD,OAAOmzD,EAAW12D,IAAI82D,IAAa,IAAItzD,MACtD,CACA,OAAO,CAAK,EAGhBizD,EAAQt3D,SAAQ,CAACqqB,EAAKqtC,KAClB,MAAMI,EAAQD,EAASH,GACvBrtC,EAAI/c,aAAa,oBAAqBlJ,OAAO0zD,IAC7CztC,EAAI1Y,MAAMimB,YAAY,sBAAuBxzB,OAAO0zD,IAEpD,MAAME,EAAcR,EAAiB9wC,IAAIgxC,IAAUF,EAAiB32D,IAAI62D,GAAO1rD,OAAS,EAClFisD,EAAoD,MAA3C5tC,EAAIlb,aAAa,sBAC5B6oD,IAAgBC,IACZr6D,KAAKs6D,sBAAsB7tC,IAC3BzsB,KAAKm5D,WAAW/3D,IAAI04D,GAExBrtC,EAAI/c,aAAa,qBAAsB,MAE3C1P,KAAKu6D,gBAAgB9tC,EAAKqtC,EAAOM,GAEjC,MAAMI,EAA6D,MAAhD/tC,EAAIlb,aAAa,2BAC9BkpD,EAAiBN,EAAoBL,GACrCY,EAAaF,GAAcC,EACjChuC,EAAIslB,OAAS2oB,EACTD,EACAhuC,EAAI/c,aAAa,qBAAsB,KAEvC+c,EAAI0F,gBAAgB,qBACxB,GAER,CAEAmkC,YAAAA,CAAahpD,GACT,MAAMw/C,EAAiB9sD,KAAK26D,qBACtBC,EAAYttD,EAAMhJ,QAAU,KAC5BA,EAASs2D,GAAoC,IAAvBA,EAAUnyC,SAAiBmyC,EAAUnnC,cAAgBmnC,EAC3En6C,EAASnc,GAAUA,EAAOqJ,QAAUrJ,EAAOqJ,QAAQm/C,GAAkB,KAC3E,IAAKrsC,IAAWzgB,KAAK81D,OAAOz0D,SAASof,GACjC,OAEJnT,EAAME,iBAEN,MAAMif,EAAMhM,EAAO9S,QAAQ,MAC3B,IAAK8e,EACD,OAEJ,MAAMqtC,EAAQtzD,OAAOimB,EAAIlb,aAAavR,KAAKw5D,eAAiB,IAAI/yD,OAChE,IAAKqzD,EACD,OAGJ,MAAM/M,GAAa/sD,KAAKm5D,WAAWrwC,IAAIgxC,GACnC/M,EACA/sD,KAAKm5D,WAAW/3D,IAAI04D,GAEpB95D,KAAKm5D,WAAWzzD,OAAOo0D,GAE3B95D,KAAKm3D,UAEL,MAAM5yC,EAAU,CACZ/S,GAAIsoD,EACJ/M,YACAtgC,OAEiC,mBAA1BzsB,KAAKa,QAAQg6D,UACpB76D,KAAKa,QAAQg6D,SAASt2C,EAE9B,CAEAg2C,eAAAA,CAAgB9tC,EAAKqtC,EAAOM,GACxB,MAAMxoD,EAAW5R,KAAK26D,qBACtB,IAAIl6C,EAASgM,EAAIllB,cAAcqK,GAC/B,IAAK6O,GAAU25C,EAAa,CACxB,MAAMU,EAAYruC,EAAIC,OAASD,EAAIC,MAAM,GAAKD,EAAIC,MAAM,GAAK,KACzDouC,IACAr6C,EAASpT,SAAS2K,cAAc,UAChCyI,EAAOzU,KAAO,SACdyU,EAAOqC,UAAY,qBACnBrC,EAAO/Q,aAAa,qBAAsB,KAC1CorD,EAAUC,QAAQt6C,GAE1B,CACA,IAAKA,EACD,OAIJA,EAAO1M,MAAMinD,gBAAkB,OAC/Bv6C,EAAO1M,MAAMiH,OAAS,UAEtB,MAAMigD,EAAWx6C,EAAO7P,YAWxB,GAVwBqqD,GACK,IAAtBA,EAASxyC,UACT,MAAM6O,KAAK9wB,OAAOy0D,EAASpiD,aAAe,MAE7C4H,EAAOy6C,MAAM7tD,SAASub,eAAe,MAGzCnI,EAAO/Q,aAAa,qBAAsBoqD,GAC1Cr5C,EAAO/Q,aAAa,gBAAiB1P,KAAKm5D,WAAWrwC,IAAIgxC,GAAS,QAAU,QAC5Er5C,EAAOsxB,QAAUqoB,GACZA,EACD,OAEJ,MAAMrN,EAAY/sD,KAAKm5D,WAAWrwC,IAAIgxC,GACtCr5C,EAAO5H,YAAck0C,EAAY,IAAM,GAC3C,CAEAsM,QAAAA,GACI,MAAMvyD,EAAO9G,KAAK81D,OAAOppB,SAAW1sC,KAAK81D,OAAOppB,QAAQ,GACxD,OAAK5lC,EAGEsK,MAAMC,KAAKvK,EAAKslB,MAAMnqB,QAAQwqB,IAASA,EAAIllB,cAAc,wBAFrD,EAGf,CAEA+xD,kBAAAA,CAAmBltC,GACfA,EAAKhqB,SAASqqB,IACqC,MAA3CA,EAAIlb,aAAa,wBACjBkb,EAAIslB,QAAS,EACbtlB,EAAI0F,gBAAgB,sBACxB,GAER,CAEAonC,uBAAAA,CAAwBntC,GACpBA,EAAKhqB,SAASqqB,IACVA,EAAI/c,aAAa,0BAA2B+c,EAAIslB,OAAS,IAAM,IAAI,GAE3E,CAEAuoB,qBAAAA,CAAsB7tC,GAClB,MAAMvD,EAAOuD,EAAIlb,aAAa,yBAC9B,OAAa,OAAT2X,EACOlpB,KAAKi7C,UAAU/xB,GAEnBnR,QAAQ/X,KAAKa,QAAQksD,UAChC,CAEA95C,UAAAA,GACI,OAAO8E,QAAQ/X,KAAKa,QAAQV,OAChC,CAEAq5D,UAAAA,GACI,OAAOhzD,OAAOxG,KAAKa,QAAQ+rD,QAAU,kBAAkBnmD,QAAU,gBACrE,CAEAgzD,cAAAA,GACI,OAAOjzD,OAAOxG,KAAKa,QAAQgsD,YAAc,yBAAyBpmD,QAAU,uBAChF,CAEAk0D,kBAAAA,GACI,OAAOn0D,OAAOxG,KAAKa,QAAQisD,gBAAkB,wBAAwBrmD,QAAU,sBACnF,CAEAw0C,SAAAA,CAAU/2C,GACN,MAAM+e,EAAazc,OAAOtC,GAAS,IAAIsB,cAAciB,OACrD,MAAsB,KAAfwc,GAAoC,MAAfA,GAAqC,UAAfA,GAAyC,QAAfA,GAAuC,OAAfA,CACxG,GCpKJ,GA9EA,MACI1iB,WAAAA,CAAYoF,EAAU,CAAC,GACnB3F,KAAKoS,SAAWhP,OAAO6C,OAAO,CAC1BwoC,SAAS,EACT0sB,WAAY,IACZC,cAAe,GACfhmB,MAAO,IACPoa,SAAU,MACX7pD,GAEH3F,KAAKq7D,OAAS,KACdr7D,KAAKs7D,OAAS,KAEdt7D,KAAKu7D,YAAcv7D,KAAKw7D,aAAa75D,KAAK3B,MAC1CA,KAAKu2D,cAAgBv2D,KAAKw2D,eAAe70D,KAAK3B,KAClD,CAEAkI,IAAAA,GACI,IAAKlI,KAAKoS,SAASq8B,QACf,OAGJ,MAAM78B,EAAWpL,OAAOxG,KAAKoS,SAASgpD,eAAiB,IAAI30D,OAC3D,IAAKmL,EACD,OAGJ,MAAM0Z,EAAQ2oB,GAAkBriC,GAC3B0Z,IAILtrB,KAAKq7D,OAAS/vC,EACdtrB,KAAKq7D,OAAOzrD,iBAAiB,QAAS5P,KAAKu7D,aAC3Cv7D,KAAKq7D,OAAOzrD,iBAAiB,UAAW5P,KAAKu2D,eACjD,CAEA9kD,OAAAA,GACSzR,KAAKq7D,SAIVr7D,KAAKq7D,OAAO3pD,oBAAoB,QAAS1R,KAAKu7D,aAC9Cv7D,KAAKq7D,OAAO3pD,oBAAoB,UAAW1R,KAAKu2D,eAChDv2D,KAAKq7D,OAAS,KACdl4C,aAAanjB,KAAKs7D,QAClBt7D,KAAKs7D,OAAS,KAClB,CAEAE,YAAAA,GACIr4C,aAAanjB,KAAKs7D,QAClBt7D,KAAKs7D,OAAS/1D,YAAW,KACrBvF,KAAKy7D,OAAO,GACb5nB,GAAwB7zC,KAAKoS,SAAS+oD,WAAY,KACzD,CAEA3E,cAAAA,CAAelpD,GACO,UAAdA,EAAM7M,MAIV6M,EAAME,iBACN2V,aAAanjB,KAAKs7D,QAClBt7D,KAAKy7D,QACT,CAEAA,KAAAA,GAC0C,mBAA3Bz7D,KAAKoS,SAASo9C,UAA4BxvD,KAAKq7D,QAI1Dr7D,KAAKoS,SAASo9C,SAAS,CACnBtrD,MAAOlE,KAAKq7D,OAAOn3D,MAAMuC,OACzB2uC,MAAO5uC,OAAOxG,KAAKoS,SAASgjC,OAAS,MAE7C,GCoXJ,GA/bA,MACI70C,WAAAA,CAAYoF,EAAU,CAAC,GACnB3F,KAAKoS,SAAWhP,OAAO6C,OAAO,CAC1BwoC,SAAS,EACTitB,aAAc,GACdC,SAAU,KACVR,WAAY,IACZS,UAAW,OACXt0D,OAAQ,CACJipB,MAAO,sBACPkJ,MAAO,uBAEXkc,UAAW,oBACXC,SAAU,mBACVwX,SAAU,mBACVC,UAAW,oBACXC,aAAc,uBACdC,gBAAiB,KACjBE,WAAW,EACXC,YAAY,EACZmO,YAAY,EACZC,cAAe,CAAC,EAChB/P,SAAU,KACV2D,QAAS,MACV/pD,GAEH3F,KAAK+7D,MAAQ,KACb/7D,KAAKs7D,OAAS,KACdt7D,KAAKg8D,UAAY,GACjBh8D,KAAKu7D,YAAcv7D,KAAKw7D,aAAa75D,KAAK3B,MAC1CA,KAAKi8D,aAAej8D,KAAKk8D,cAAcv6D,KAAK3B,MAC5CA,KAAKq2D,YAAcr2D,KAAKs2D,aAAa30D,KAAK3B,MAC1CA,KAAKm8D,aAAen8D,KAAKo8D,cAAcz6D,KAAK3B,KAChD,CAEAkI,IAAAA,GACI,IAAKlI,KAAKoS,SAASq8B,QACf,OAGJ,MAAMljB,EAAOvrB,KAAKq8D,mBACb9wC,IAILvrB,KAAK+7D,MAAQxwC,EACbvrB,KAAKs8D,mBACLt8D,KAAK+7D,MAAMnsD,iBAAiB,QAAS5P,KAAKu7D,aAC1Cv7D,KAAK+7D,MAAMnsD,iBAAiB,SAAU5P,KAAKi8D,cAC3Cj8D,KAAK+7D,MAAMnsD,iBAAiB,QAAS5P,KAAKq2D,aAC1Cr2D,KAAK+7D,MAAMnsD,iBAAiB,SAAU5P,KAAKm8D,cAE3Cn8D,KAAKumD,UAAUvmD,KAAKoS,SAAS0pD,eAAiB,CAAC,EAAG,CAAErV,MAAM,IACtDzmD,KAAKoS,SAASypD,YACd77D,KAAKy7D,QAEb,CAEAhqD,OAAAA,GACSzR,KAAK+7D,QAGV/7D,KAAK+7D,MAAMrqD,oBAAoB,QAAS1R,KAAKu7D,aAC7Cv7D,KAAK+7D,MAAMrqD,oBAAoB,SAAU1R,KAAKi8D,cAC9Cj8D,KAAK+7D,MAAMrqD,oBAAoB,QAAS1R,KAAKq2D,aAC7Cr2D,KAAK+7D,MAAMrqD,oBAAoB,SAAU1R,KAAKm8D,cAC9Cn8D,KAAK+7D,MAAQ,KACb54C,aAAanjB,KAAKs7D,QAClBt7D,KAAKs7D,OAAS,KACdt7D,KAAKg8D,UAAY,GACrB,CAEAO,QAAAA,GACI,OAAOv8D,KAAKw8D,eAChB,CAEAC,SAAAA,GACI,OAAOz8D,KAAKw8D,gBAAgBz5D,MAChC,CAEA25D,SAAAA,GACI,MAAM/U,EAAS,IAAI52C,IAOnB,OANA/Q,KAAK28D,eAAev6D,SAAS6zC,IACzB,MAAMjK,EAAQhsC,KAAK48D,UAAU3mB,GACzBjK,GACA2b,EAAOvmD,IAAI4qC,EACf,IAEG56B,MAAMC,KAAKs2C,EACtB,CAEApB,SAAAA,CAAUsW,EAAa,CAAC,EAAGl3D,EAAU,CAAC,GAC7B3F,KAAK+7D,QAGV/7D,KAAK28D,eAAev6D,SAAS6zC,IACzB,MAAMjK,EAAQhsC,KAAK48D,UAAU3mB,GAC7B,IAAKjK,EACD,OAEJ,MACMvrC,EAAe,aADRT,KAAK88D,SAAS7mB,GACO,GAAGjK,OAAaA,EAE5C+wB,EADS35D,OAAO+E,UAAUhE,eAAeiE,KAAKy0D,EAAYp8D,GACrCo8D,EAAWp8D,GAAO,GAC7CT,KAAKg9D,iBAAiB/mB,EAAS8mB,EAAU,IAEzCp3D,EAAQ8gD,MACRzmD,KAAKy7D,QAEb,CAEAY,gBAAAA,GACI,GAAIr8D,KAAKoS,SAASupD,UAAgD,IAApC37D,KAAKoS,SAASupD,SAASlzC,SACjD,OAAOzoB,KAAKoS,SAASupD,SAEzB,MAAM/pD,EAAWpL,OAAOxG,KAAKoS,SAASspD,cAAgB,IAAIj1D,OAC1D,OAAKmL,EAGEqiC,GAAkBriC,GAFd,IAGf,CAEA4pD,YAAAA,CAAaluD,GACT,IAAKtN,KAAKi9D,iBAAiB3vD,EAAMhJ,QAC7B,OAEJ,GAAItE,KAAKk9D,gBACL,OAEJ,MAAMlxD,EAAOxF,OAAO8G,EAAMhJ,OAAO0H,MAAQ,IAAIxG,cAChC,aAATwG,GAAgC,UAATA,GAA6C,WAAzBsB,EAAMhJ,OAAOiJ,SAI5D4V,aAAanjB,KAAKs7D,QAClBt7D,KAAKs7D,OAAS/1D,YAAW,IAAMvF,KAAKy7D,SAAS5nB,GAAwB7zC,KAAKoS,SAAS+oD,WAAY,OAJ3Fn7D,KAAKy7D,OAKb,CAEAS,aAAAA,CAAc5uD,GACLtN,KAAKi9D,iBAAiB3vD,EAAMhJ,UAG7BtE,KAAKk9D,kBAGT/5C,aAAanjB,KAAKs7D,QAClBt7D,KAAKy7D,SACT,CAEAnF,YAAAA,CAAahpD,GACT,IAAKtN,KAAK+7D,MACN,OAEJ,MAAMz0D,EAAStH,KAAKoS,SAAS9K,QAAU,CAAC,EAClC61D,EAAgB32D,OAAOc,EAAOipB,OAAS,uBAAuB9pB,OAC9D22D,EAAgB52D,OAAOc,EAAOmyB,OAAS,uBAAuBhzB,OAGpE,GADoB02D,GAAgB7vD,EAAMhJ,OAAOqJ,QAAQwvD,GAKrD,OAHA7vD,EAAME,iBACN2V,aAAanjB,KAAKs7D,aAClBt7D,KAAKy7D,QAIW2B,GAAgB9vD,EAAMhJ,OAAOqJ,QAAQyvD,KAIzD9vD,EAAME,iBACNxN,KAAKq9D,SACgC,mBAA1Br9D,KAAKoS,SAASs9C,SACrB1vD,KAAKoS,SAASs9C,UAElBvsC,aAAanjB,KAAKs7D,QAClBt7D,KAAKy7D,QACT,CAEAW,aAAAA,CAAc9uD,GACLtN,KAAKk9D,kBAGV5vD,EAAME,iBACN2V,aAAanjB,KAAKs7D,QAClBt7D,KAAKy7D,QACT,CAEAA,KAAAA,GACSz7D,KAAK+7D,OAA2C,mBAA3B/7D,KAAKoS,SAAS25C,UAGxC/rD,KAAKoS,SAAS25C,SAAS/rD,KAAKw8D,gBAChC,CAEAA,aAAAA,GACI,MAAMc,EAAS,IAAInvC,IACnBnuB,KAAK28D,eAAev6D,SAAS6zC,IACzB,MAAMjK,EAAQhsC,KAAK48D,UAAU3mB,GAC7B,IAAKjK,EACD,OAECsxB,EAAOx0C,IAAIkjB,IACZsxB,EAAO16D,IAAIopC,EAAO,CACdA,QACAhgC,KAAMhM,KAAKu9D,SAAStnB,GACpB+Q,SAAUhnD,KAAKw9D,mBAAmBvnB,GAClC/xC,MAAO,GACPD,OAAQ,KAGhB,MAAM6L,EAAOwtD,EAAOr6D,IAAI+oC,GAClBmb,EAAOnnD,KAAK88D,SAAS7mB,GACrB/xC,EAAQlE,KAAKy9D,kBAAkBxnB,GAC/BynB,EAAcl3D,OAAOyvC,EAAQjqC,MAAQ,IAAIxG,cAC/C,GAAa,aAAT2hD,EAIJ,GAAa,SAATA,GAKJ,GAAqB,aAAhBuW,GAA8C,UAAhBA,GAAsC,KAAVx5D,EAG/D,OAAIkN,MAAMiP,QAAQnc,IACd4L,EAAK7L,OAASC,EAAM2d,aACpB/R,EAAK5L,MAAQ4L,EAAK7L,OAAOuf,KAAK,YAGlC1T,EAAK5L,MAAQA,QAZT4L,EAAK9D,KAAOxF,OAAOtC,GAAS,IAAIuC,QAAUqJ,EAAK9D,MAAQ,YAJvD8D,EAAKk3C,SAAWxgD,OAAOtC,GAAS,IAAIuC,QAAUqJ,EAAKk3C,UAAYhnD,KAAK29D,qBAgBtD,IAGtB,MAAMjoB,EAAU,CAAC,EACX3yC,EAAS,CAAC,EAkBhB,OAjBAu6D,EAAOl7D,SAAQ,CAAC0N,EAAMk8B,KAClB,MAAM/oB,EAAajjB,KAAK49D,qBAAqB9tD,GACxCmT,IAGLyyB,EAAQ1J,GAAS/oB,EAEbA,EAAWhf,OAAOmK,OAAS,EAC3BrL,EAAOipC,GAAS/oB,EAAWhf,OAAO4d,QAElC9e,EAAOipC,GAAS/oB,EAAW/e,MAE3B+e,EAAW+jC,WACXjkD,EAAO,GAAGipC,QAAc/oB,EAAW+jC,UACvC,IAGG,CACHtR,UACA3yC,SACA44B,OAAQv4B,OAAOwgB,KAAK8xB,GACpBpwB,KAAM,CACFu4C,MAAOz6D,OAAOwgB,KAAK8xB,GAAStnC,QAGxC,CAEAwvD,oBAAAA,CAAqB9tD,GACjB,MAAM9D,EAAOxF,OAAOsJ,EAAK9D,MAAQ,QAAQvF,QAAU,OAC7CugD,EAAWxgD,OAAOsJ,EAAKk3C,UAAYhnD,KAAK29D,uBAAuBl3D,OACrE,IAAIvC,EAAQ4L,EAAK5L,MACbD,EAASmN,MAAMiP,QAAQvQ,EAAK7L,QAAU6L,EAAK7L,OAAO4d,QAAU,GAShE,GAPI7hB,KAAKoS,SAASs7C,aACO,iBAAVxpD,IACPA,EAAQA,EAAMuC,QAElBxC,EAASA,EAAOqK,KAAKm/B,GAAUjnC,OAAOinC,GAAS,IAAIhnC,SAAQxE,QAAQwrC,GAAoB,KAAVA,KAG7EztC,KAAKoS,SAASq7C,UAAW,CACzB,MAAMqQ,EAAiC,IAAlB75D,EAAOmK,OACtB2vD,EAAe75D,SAA2D,KAAlBsC,OAAOtC,GACrE,GAAI45D,GAAgBC,EAChB,OAAO,IAEf,CAEA,MAAO,CACH/xB,MAAOxlC,OAAOsJ,EAAKk8B,OAAS,IAAIvlC,OAChCuF,OACAg7C,WACA9iD,MAAOA,QAAwC,GAAKA,EACpDD,SAER,CAEA+4D,gBAAAA,CAAiB/mB,EAAS8mB,GACtB,MAAM/wD,EAAOxF,OAAOyvC,EAAQjqC,MAAQ,IAAIxG,cACxC,GAAa,aAATwG,EAQJ,GAAa,UAATA,EAIJ,GAAwB,WAApBiqC,EAAQ1oC,SAAwB0oC,EAAQ+nB,SAA5C,CACI,MAAMC,EAAY7sD,MAAMiP,QAAQ08C,GAC1BA,EACAv2D,OAAOu2D,GAAa,IAAIvxD,MAAM,KAC9B45B,EAAW,IAAIr0B,IAAIktD,EACpB3vD,KAAKpK,GAAUsC,OAAOtC,GAAS,IAAIuC,SACnCxE,QAAQiC,GAAoB,KAAVA,KACvBkN,MAAMC,KAAK4kC,EAAQtwC,SAAW,IAAIvD,SAAS8nB,IACvCA,EAAOkb,SAAWA,EAAStc,IAAItiB,OAAO0jB,EAAOhmB,OAAS,IAAIuC,OAAO,GAGzE,MACAwvC,EAAQ/xC,MAAQsC,OAAOu2D,GAAa,SAfhC9mB,EAAQioB,QAAU13D,OAAOyvC,EAAQ/xC,OAAS,MAAQsC,OAAOu2D,GAAa,QAT1E,CACI,MAAM95C,EAAazc,OAAOu2D,GAAa,IAAIv3D,cAC3CywC,EAAQioB,QAAUj7C,IAAezc,OAAOyvC,EAAQ/xC,OAAS,IAAIsB,eACvC,MAAfyd,GACe,SAAfA,GACe,OAAfA,CAEX,CAkBJ,CAEAw6C,iBAAAA,CAAkBxnB,GACd,GAAwB,WAApBA,EAAQ1oC,SAAwB0oC,EAAQ+nB,SACxC,OAAO5sD,MAAMC,KAAK4kC,EAAQkoB,iBAAmB,IACxC7vD,KAAK4b,GAAW1jB,OAAO0jB,EAAOhmB,OAAS,IAAIuC,SAC3CxE,QAAQiC,GAAoB,KAAVA,IAE3B,MAAM8H,EAAOxF,OAAOyvC,EAAQjqC,MAAQ,IAAIxG,cACxC,MAAa,aAATwG,EACOiqC,EAAQioB,QAAWjoB,EAAQ/xC,OAAS,IAAO,GAEzC,UAAT8H,EACOiqC,EAAQioB,SAAWjoB,EAAQ/xC,OAAe,GAE9CsC,OAAOyvC,EAAQ/xC,OAAS,GACnC,CAEAo4D,gBAAAA,GACI,IAAKt8D,KAAK+7D,MAEN,YADA/7D,KAAKg8D,UAAY,IAGrB,MAAM9yC,EAAOlpB,KAAKo+D,gBAClBp+D,KAAKg8D,UAAY5qD,MAAMC,KAAKrR,KAAK+7D,MAAMvsD,iBAAiB,IAAI0Z,OACvDjnB,QAAQg0C,GAAYj2C,KAAKq+D,oBAAoBpoB,IACtD,CAEA0mB,YAAAA,GACI,OAAK38D,KAAK+7D,OAGL3qD,MAAMiP,QAAQrgB,KAAKg8D,YAAwC,IAA1Bh8D,KAAKg8D,UAAU5tD,QACjDpO,KAAKs8D,mBAEFt8D,KAAKg8D,WALD,EAMf,CAEAqB,MAAAA,GACIr9D,KAAK28D,eAAev6D,SAAS6zC,IACzB,MAAMjqC,EAAOxF,OAAOyvC,EAAQjqC,MAAQ,IAAIxG,cACxC,GAAa,aAATwG,GAAgC,UAATA,EAI3B,MAAwB,WAApBiqC,EAAQ1oC,QACJ0oC,EAAQ+nB,cACR5sD,MAAMC,KAAK4kC,EAAQtwC,SAAW,IAAIvD,SAAS8nB,IACvCA,EAAOkb,UAAW,CAAK,SAI/B6Q,EAAQqoB,cAAgB,QAG5BroB,EAAQ/xC,MAAQ,IAbZ+xC,EAAQioB,SAAU,CAaJ,GAE1B,CAEAE,aAAAA,GACI,OAAO53D,OAAOxG,KAAKoS,SAASujC,WAAa,qBAAqBlvC,QAAU,mBAC5E,CAEA83D,YAAAA,GACI,OAAO/3D,OAAOxG,KAAKoS,SAASwjC,UAAY,oBAAoBnvC,QAAU,kBAC1E,CAEA+3D,YAAAA,GACI,OAAOh4D,OAAOxG,KAAKoS,SAASg7C,UAAY,oBAAoB3mD,QAAU,kBAC1E,CAEAg4D,aAAAA,GACI,OAAOj4D,OAAOxG,KAAKoS,SAASi7C,WAAa,qBAAqB5mD,QAAU,mBAC5E,CAEAi4D,gBAAAA,GACI,OAAOl4D,OAAOxG,KAAKoS,SAASk7C,cAAgB,wBAAwB7mD,QAAU,sBAClF,CAEAk3D,mBAAAA,GACI,OAAOn3D,OAAOxG,KAAKoS,SAASm7C,iBAAmB,MAAM9mD,QAAU,IACnE,CAEAm2D,SAAAA,CAAU3mB,GACN,OAAOzvC,OAAOyvC,EAAQ1kC,aAAavR,KAAKo+D,kBAAoB,IAAI33D,MACpE,CAEAq2D,QAAAA,CAAS7mB,GACL,MAAMkR,EAAO3gD,OAAOyvC,EAAQ1kC,aAAavR,KAAKu+D,iBAAmB,SAAS/4D,cAAciB,OACxF,MAAa,aAAT0gD,GAAgC,SAATA,EAChBA,EAEJ,OACX,CAEAoW,QAAAA,CAAStnB,GAEL,OADazvC,OAAOyvC,EAAQ1kC,aAAavR,KAAKw+D,iBAAmB,IAAIh5D,cAAciB,QACpE,MACnB,CAEA+2D,kBAAAA,CAAmBvnB,GAEf,OADiBzvC,OAAOyvC,EAAQ1kC,aAAavR,KAAK0+D,qBAAuB,IAAIj4D,QAC1D,EACvB,CAEAw2D,gBAAAA,CAAiB30C,GACb,OAAOvQ,QACHuQ,GACGtoB,KAAKq+D,oBAAoB/1C,IACI,mBAAtBA,EAAK/W,cACqD,KAAjE/K,OAAO8hB,EAAK/W,aAAavR,KAAKo+D,kBAAoB,IAAI33D,OAEjE,CAEA43D,mBAAAA,CAAoB/1C,GAChB,IAAKA,GAAgC,iBAAjBA,EAAK/a,QACrB,OAAO,EAEX,MAAM0c,EAAMzjB,OAAO8hB,EAAK/a,SAAW,IAAI7G,cACvC,MAAe,UAARujB,GAA2B,WAARA,GAA4B,aAARA,CAClD,CACAizC,aAAAA,GAEI,MAAgB,WADH12D,OAAOxG,KAAKoS,SAASwpD,WAAa,QAAQp2D,cAAciB,MAEzE,GCzaE6B,GAAO,eACPzF,GAAW,MAAQyF,GAEnBq2D,GAAsB,mBAMtBC,GAAsB,CAC3B12D,KAAM,SACN22D,WAAY,eACZC,WAAY,eACZ1vD,MAAO,UACP2vD,eAAgB,mBAChBC,aAAc,iBACdC,cAAe,kBACfC,aAAc,iBACdC,cAAe,kBACfC,cAAe,kBACfC,YAAa,gBACbC,YAAa,gBACbC,UAAW,cACXC,WAAY,eACZC,WAAY,eACZC,cAAe,kBACfliC,OAAQ,WACRmiC,cAAe,kBACflmC,MAAO,UACPgnB,OAAQ,WACRmf,WAAY,eACZC,UAAW,cACXC,eAAgB,mBAChBC,WAAY,eACZC,UAAW,cACXC,SAAU,aACVC,SAAU,aACVC,gBAAiB,oBACjBC,UAAW,cACXC,YAAa,gBACbC,UAAW,cACXC,WAAY,eACZC,gBAAiB,oBACjBC,cAAe,kBACfC,aAAc,iBACdC,YAAa,iBAGd,MAAMC,WAAuBriD,EAAAA,EAC5Bhe,WAAAA,CAAYC,EAASuC,EAAS,CAAC,GAC9Byb,MAAMhe,EAASuC,GACf/C,KAAKa,QAAUb,KAAK8C,WAAWtC,GAASM,EAAAA,EAAAA,IAAgB6Q,GAAiB5O,IACzE/C,KAAKwnC,QAAU,KACfxnC,KAAK8tC,eAAiB,KACtB9tC,KAAK+9C,YAAc,KACnB/9C,KAAK6gE,MAAQ,GACb7gE,KAAK8gE,cAAgB,GACrB9gE,KAAK8gD,cAAgB,EACrB9gD,KAAKs0C,WAAY,EACjBt0C,KAAK+2C,QAAU,GACf/2C,KAAK+gE,gBAAiB,EACtB/gE,KAAK69C,UAAY,KACjB79C,KAAKghE,QAAU,KACfhhE,KAAKsmD,SAAW,KAChBtmD,KAAKu9C,WAAa,CAAEvR,MAAO,GAAI/U,IAAK,MAAOgX,aAAc,EAAG2P,MAAO,IACnE59C,KAAKk6C,WAAa,CAAE6C,KAAM,EAAG5C,QAAS,IACtCn6C,KAAKi1C,cAAgB,CAAC,EACtBj1C,KAAKq/C,eAAiB,CAAC,EACvBr/C,KAAKw8C,gBAAkB,CAAC,EACxBx8C,KAAK8pD,YAAc,KACnB9pD,KAAKq0C,aAAe,KACpBr0C,KAAK2xC,aAAe,KACpB3xC,KAAK8qC,kBAAoB,KACzB9qC,KAAK2lD,eAAiB3lD,KAAK4lD,gBAAgBjkD,KAAK3B,MAChDA,KAAK0wC,UAAY,KACjB1wC,KAAKwxC,oBAAsBxxC,KAAKyxC,yBAAyB9vC,KAAK3B,MAC9DA,KAAKgyC,qBAAuBhyC,KAAKkyC,sBAAsBvwC,KAAK3B,MAC5DA,KAAKihE,wBAA0BjhE,KAAKm5C,6BAA6Bx3C,KAAK3B,MACtEA,KAAK2uC,yBAA2B3uC,KAAKmrC,wBAAwBxpC,KAAK3B,MAClEA,KAAK0uC,0BAA2B,EAChC1uC,KAAKmvC,wBAA0B,GAC/BnvC,KAAK8uC,uBAAyB,EAC9B9uC,KAAK+uC,4BAA8B,EACnC/uC,KAAKkhE,sBAAwB,KAC7BlhE,KAAKmhE,oBAAsB,EAC3BnhE,KAAKohE,sBAAwB,GAC7BphE,KAAKqhE,yBAA0B,EAC/BrhE,KAAKuhD,wBAA0B,KAC/BvhD,KAAKqhD,uBAAyB,GAC9BrhD,KAAK07C,iBAAmB,IAAIvtB,IAC5BnuB,KAAK8pC,yBAA0B,EAC/B9pC,KAAKshE,0BAA4B,GACjCthE,KAAKuhE,sBAAwB,KAC7BvhE,KAAKs1C,0BAA4B,GACjCt1C,KAAKu1C,sBAAwB,KAC7Bv1C,KAAK0nD,sBAAwB,KAC7B1nD,KAAKwhE,oBAAsB,CAC1B/yB,SAAS,EACTgzB,WAAY,EACZC,SAAU,EACVC,YAAY,GAEb3hE,KAAK4hE,mBAAqB,CACzBnzB,SAAS,EACTozB,OAAO,EACPnrC,QAAQ,EACRxU,OAAQ,EACR8uB,OAAQ,EACR8wB,WAAY,EACZC,UAAW,EACXrqD,MAAO,GAER1X,KAAKgiE,cAAgB,CACpBvzB,SAAS,EACTozB,OAAO,EACPI,UAAW,EACXC,aAAc,EACd3M,MAAO,EACPC,IAAK,EACLzY,MAAO,EACP5C,SAAU,EACVziC,MAAO,EACPyqD,eAAgB,EAChBtpB,UAAW,IAEZ74C,KAAKoiE,gBAAkB,CACtB1xD,IAAK,KACLuH,OAAQ,MAETjY,KAAKqiE,oBAAsBriE,KAAKsiE,qBAAqB3gE,KAAK3B,MAC1DA,KAAKuiE,YAAc,IACpB,CAEA,eAAWj6D,GAAS,OAAOA,EAAM,CAEjC,mBAAWzF,GAAa,OAAOA,EAAU,CAEzC,cAAOoF,CAAQlF,EAAS,CAAC,GACxBqO,MAAMC,KAAK9O,EAAAA,EAAUqf,QAtIM,oBAsIyBxf,SAAS5B,KAC3CR,KAAK8H,YAAYtH,IAAY,IAAIR,KAAKQ,EAASuC,IACvDmF,MAAM,GAEjB,CAEAslC,WAAAA,CAAYhiB,EAAQjH,EAAU,CAAC,GAC9B,MAAMi+C,EAAmBh8D,OAAOglB,GAAU,IAAI/kB,OAC9C,IAAK+7D,EACJ,OAGD,MAAM5wC,EAASxuB,OAAO6C,OAAO,CAC5BulB,OAAQg3C,EACRr2C,MAAOnsB,KAAKW,SACZ8hE,SAAUziE,KAAKs0C,WACb/vB,GAEGkqC,EAAYzuD,KAAKa,QAAQ4tD,WAAa,CAAC,EACvCiU,EAAsBF,EAAiBh9D,cACvCm9D,EAAe/D,GAAoB8D,IAAwB,GAC3Dn/D,EAAWo/D,EAAelU,EAAUkU,GAAgB,KAClC,mBAAbp/D,GACVA,EAASquB,EAAQ5xB,MAGlB,MAAM+sB,EAAS/sB,KAAKa,QAAQksB,QAAU,CAAC,EAEvC,QADwChmB,IAAlBgmB,EAAO5sB,SAA8B4X,QAAQgV,EAAO5sB,SAClC,oBAAXkV,QAAwD,mBAAvBA,OAAOoc,YACpE,OAGD,MACMmxC,EAAY,GADHp8D,OAAOumB,EAAO01B,QAAU,QAAQh8C,QAAU,UAC1Bi8D,IACzBhxC,OAA6B3qB,IAAnBgmB,EAAO2E,SAA+B3Z,QAAQgV,EAAO2E,SACrE1xB,KAAKW,SAASkxB,cAAc,IAAIJ,YAAYmxC,EAAW,CACtDhxC,SACAF,YAEF,CAEAmxC,kBAAAA,CAAmBnc,EAAa,CAAC,EAAG/gD,EAAU,CAAC,GAC9C,IAAK3F,KAAKs0C,UACT,OAGD,MAAMwuB,KAAgBn9D,IAAWvC,OAAO+E,UAAUhE,eAAeiE,KAAKzC,EAAS,aAC5EoS,QAAQpS,EAAQyiB,SAEb26C,GAAep9D,IAAWvC,OAAO+E,UAAUhE,eAAeiE,KAAKzC,EAAS,WAC3EoS,QAAQpS,EAAQq9D,QAEbC,GAAkBt9D,IAAWvC,OAAO+E,UAAUhE,eAAeiE,KAAKzC,EAAS,cAC9EoS,QAAQpS,EAAQu9D,WAEbliD,EAAUrb,GAAsC,iBAApBA,EAAQqb,QACvCxa,OAAOb,EAAQqb,SAASxb,cAAciB,OACtC,GACG83C,EAAe54C,GAAWA,EAAQ44C,cAAgD,iBAAzB54C,EAAQ44C,aACpEv+C,KAAKw+C,4BAA4B74C,EAAQ44C,cACzC,KAEGh4C,EAASmgD,GAAoC,iBAAfA,EAA0BA,EAAa,CAAC,EACtE5sB,EAAUgpC,EAAgB,CAAC,EAAI1/D,OAAO6C,OAAO,CAAC,EAAGjG,KAAKi1C,eAsB5D,GArBA7xC,OAAOwgB,KAAKrd,GAAQnE,SAAS3B,IAC5B,MAAMyD,EAAQqC,EAAO9F,GACrB,GAAI2Q,MAAMiP,QAAQnc,GAAQ,CACzB,MAAM+e,EAAa/e,EACjBoK,KAAKwB,GAAStJ,OAAOsJ,GAAQ,IAAIrJ,SACjCxE,QAAQ6N,GAAkB,KAATA,IACnB,OAAKmT,EAAW7U,YAIhB0rB,EAAQr5B,GAAOwiB,eAHP6W,EAAQr5B,EAKjB,CACIyD,SAAmD,KAAVA,EAI7C41B,EAAQr5B,GAAOyD,SAHP41B,EAAQr5B,EAGI,IAErBT,KAAKi1C,cAAgBnb,GAEhBipC,EAEJ,YADA/iE,KAAKi+C,gBAIN,MAAM9D,EAAUn6C,KAAKk6C,WAAWC,SAAWn6C,KAAK88C,sBAAsB98C,KAAKa,QAAQu5C,WAAWD,QAAS,IACjG4C,EAAOkmB,EAAkB,EAAKjjE,KAAKk6C,WAAW6C,MAAQ,EAC5D/8C,KAAKk6C,WAAa,CAAE6C,OAAM5C,WAC1Bn6C,KAAK2gD,gBAAgB5D,EAAM5C,EAAS,KAAM,CACzCn5B,UACAu9B,gBAEF,CAEA4kB,SAAAA,CAAUpZ,GACT,MAAM9mC,EAAazc,OAAOujD,GAAU,IAAIvkD,cAAciB,QAAU,KAGhE,OAFAzG,KAAKa,QAAQkpD,OAAS9mC,EACtBjjB,KAAKojE,sBAAsB,SAAUngD,GAC9BA,CACR,CAEAogD,mBAAAA,CAAoBx5C,GACnB,MAAM5G,EAAajjB,KAAKsjE,2BAA2Bz5C,GASnD,OARK7pB,KAAKa,QAAQ60C,SAA2C,iBAAzB11C,KAAKa,QAAQ60C,UAChD11C,KAAKa,QAAQ60C,QAAU,CAAC,GAEzB11C,KAAKa,QAAQ60C,QAAQnlB,MAAQtN,EAC7BjjB,KAAKojE,sBAAsB,mBAAoBngD,GAC3CjjB,KAAK+gE,gBAAkB/gE,KAAKs0C,WAC/Bt0C,KAAKujE,eAECtgD,CACR,CAEAugD,mBAAAA,GACC,MAAMC,EAAej9D,OAAOxG,KAAKW,SAAS4Q,aAAa,2BAA6B,IAAI9K,OACxF,GAAIg9D,EACH,OAAOA,EAER,MAAMC,EAAe1jE,KAAKa,QAAQ8pD,OAAuC,iBAAvB3qD,KAAKa,QAAQ8pD,MAC5D3qD,KAAKa,QAAQ8pD,MACb,CAAC,EACEgZ,EAAgBD,EAAa9Y,SAA2C,iBAAzB8Y,EAAa9Y,QAC/D8Y,EAAa9Y,QACb,CAAC,EAEJ,OADqBpkD,OAAOm9D,EAAcljE,KAAOmjE,aAAallC,YAAc,IAAIj4B,QAIzE,GAAGzG,KAAK8yC,+BAChB,CAEA+wB,iBAAAA,GACC,IACC,MAAM96B,EAAMviC,OAAO6O,OAAOspB,aAAaG,QAAQ9+B,KAAKwjE,wBAA0B,IAAI/8D,OAClF,IAAKsiC,EACJ,MAAO,CAAC,EAET,MAAM6J,EAAS3uB,KAAK/c,MAAM6hC,GAC1B,OAAO6J,GAA4B,iBAAXA,IAAwBxhC,MAAMiP,QAAQuyB,GAAUA,EAAS,CAAC,CACnF,CAAE,MAAOxjC,GACR,MAAO,CAAC,CACT,CACD,CAEA00D,kBAAAA,CAAmBj/D,GAClB,IACCwQ,OAAOspB,aAAaC,QAAQ5+B,KAAKwjE,sBAAuBv/C,KAAKC,UAAUrf,GAAQ,CAAC,GACjF,CAAE,MAAOuK,GACR,CAEF,CAEA20D,gBAAAA,GACC,OAAO/jE,KAAKq5C,kBACVp3C,QAAQqe,GAAgE,MAArD9Z,OAAO8Z,EAAO/O,aAAa,gBAAkB,MAChEjD,KAAKgS,GAAW9Z,OAAO8Z,EAAO/O,aAAa,eAAiB,IAAI9K,SAChExE,OAAO8V,QACV,CAEAisD,eAAAA,CAAgBh4B,EAAO+F,GACtB,MAAMkyB,EAAcz9D,OAAOwlC,GAAS,IAAIvlC,OACxC,IAAKw9D,EACJ,OAED,MAAMr9D,EAAU5G,KAAKq5C,kBACfn3B,EAAQtb,EAAQqyD,WAAW34C,GAAW9Z,OAAO8Z,EAAO/O,aAAa,eAAiB,IAAI9K,SAAWw9D,IACvG,GAAI/hD,EAAQ,EACX,OAED,MAAMuqB,EAAW,GACbzsC,KAAKW,SAASsoC,OACjBwD,EAAS90B,KAAK3X,KAAKW,SAASsoC,OAEzBjpC,KAAKW,SAAS+rC,SAAW1sC,KAAKW,SAAS+rC,QAAQt+B,QAClDq+B,EAAS90B,QAAQvG,MAAMC,KAAKrR,KAAKW,SAAS+rC,UAEvC1sC,KAAKW,SAASgsC,OACjBF,EAAS90B,KAAK3X,KAAKW,SAASgsC,OAE7BF,EAASrqC,SAASwqC,IACjBx7B,MAAMC,KAAKu7B,EAAQxgB,MAAQ,IAAIhqB,SAASqqB,IACvC,MAAME,EAAOF,EAAIC,OAASD,EAAIC,MAAMxK,GAASuK,EAAIC,MAAMxK,GAAS,KAC3DyK,IAGLA,EAAK5Y,MAAM4E,QAAUo5B,EAAS,OAAS,GACnCA,EACHplB,EAAKjd,aAAa,cAAe,KAEjCid,EAAKwF,gBAAgB,eACtB,GACC,IAEH,MAAM7R,EAAS1Z,EAAQsb,GACnB5B,IACCyxB,EACHzxB,EAAO5Q,aAAa,cAAe,KAEnC4Q,EAAO6R,gBAAgB,eAG1B,CAEA+xC,mBAAAA,GACC,MAAO,CACNxuB,QAAStyC,OAAO6C,OAAO,CAAC,EAAGjG,KAAKi1C,eAAiB,CAAC,GAClD2I,MAAO59C,KAAKo/C,oBAAoBp/C,KAAKu9C,WAAWK,OAAS,IACzDzD,QAASn6C,KAAKk6C,WAAWC,SAAWn6C,KAAKqgD,qBACzC8jB,YAAankE,KAAKokE,yBAClBC,aAAcrkE,KAAK+jE,mBAErB,CAEAO,SAAAA,GACC,OAAOlhE,OAAOwgB,KAAK5jB,KAAK6jE,qBAAqBv3B,MAC9C,CAEAi4B,QAAAA,CAAS54D,GACR,MAAM64D,EAAYh+D,OAAOmF,GAAQ,IAAIlF,OACrC,IAAK+9D,EACJ,OAAO,EAER,MAAM5Z,EAAU5qD,KAAK6jE,oBAQrB,OAPAjZ,EAAQ4Z,GAAaxkE,KAAKkkE,sBAC1BlkE,KAAK8jE,mBAAmBlZ,GACxB5qD,KAAKwtC,YAAY,aAAc,CAC9B3jB,KAAM,OACNle,KAAM64D,EACN5rD,MAAOgyC,EAAQ4Z,MAET,CACR,CAEAC,SAAAA,CAAU94D,GACT,MAAM64D,EAAYh+D,OAAOmF,GAAQ,IAAIlF,OACrC,IAAK+9D,EACJ,OAAO,EAER,MACM5rD,EADU5Y,KAAK6jE,oBACCW,GACtB,IAAK5rD,GAA0B,iBAAVA,EACpB,OAAO,GAGYxH,MAAMiP,QAAQzH,EAAMurD,aAAevrD,EAAMurD,YAAYliE,OAAO8V,SAAW,IAC/E3V,SAAQ,CAAC4pC,EAAO04B,KAC3B,MAAMC,EAAe3kE,KAAK4kE,wBAAwB54B,GAC9C24B,EAAe,GAAKA,IAAiBD,GAGzC1kE,KAAK6kE,YAAYF,EAAcD,EAAY,IAG5C,MAAML,EAAejzD,MAAMiP,QAAQzH,EAAMyrD,cAAgBzrD,EAAMyrD,aAAe,GACxES,EAAY,IAAI/zD,IAAIszD,EAAa/1D,KAAK09B,GAAUxlC,OAAOwlC,GAAS,IAAIvlC,SAAQxE,OAAO8V,UACzF/X,KAAKokE,yBAAyBhiE,SAAS4pC,IACtChsC,KAAKgkE,gBAAgBh4B,EAAO84B,EAAUh8C,IAAIkjB,GAAO,IAGlD,MAAM4R,EAAQ59C,KAAKo/C,oBAAoBxmC,EAAMglC,OAAS,IAClD59C,KAAK69C,WACR79C,KAAK69C,UAAUC,SAAS,CAAEF,UAE3B,MAAMmnB,EAAYnnB,EAAM,IAAM,KAC9B59C,KAAKu9C,WAAan6C,OAAO6C,OAAO,CAAC,EAAGjG,KAAKu9C,WAAY,CACpDvR,MAAO+4B,EAAYA,EAAU/4B,MAAQ,GACrC/U,IAAK8tC,EAAYA,EAAU9tC,IAAM,MACjC2mB,UAGD,MAAMZ,EAAch9C,KAAKu6C,cAAc3hC,EAAMuhC,QAASn6C,KAAKqgD,sBAU3D,GATIrgD,KAAK+9C,aACR/9C,KAAK+9C,YAAYC,QAAQ,CACxBjB,KAAM,EACN5C,QAAS6C,EACTE,WAAYl9C,KAAKs0C,UAAYt0C,KAAK88C,sBAAsB98C,KAAKw8C,gBAAgBW,MAAO,GAAKn9C,KAAKglE,eAAehoB,KAG/Gh9C,KAAKk6C,WAAa,CAAE6C,KAAM,EAAG5C,QAAS6C,GAElCh9C,KAAKs0C,UAAW,CACnBt0C,KAAKi1C,cAAgBr8B,EAAM88B,SAAoC,iBAAlB98B,EAAM88B,QAChDtyC,OAAO6C,OAAO,CAAC,EAAG2S,EAAM88B,SACxB,CAAC,EACA11C,KAAKsmD,UAA+C,mBAA5BtmD,KAAKsmD,SAASC,WACzCvmD,KAAKsmD,SAASC,UAAUvmD,KAAKwmD,0BAA2B,CAAEC,MAAM,IAEjE,MAAMR,EAAqBjmD,KAAKkmD,iCAChClmD,KAAK2gD,gBAAgB,EAAG3D,EAAa,KAAMiJ,EAC5C,MACCjmD,KAAKilE,gBAAgB,EAAGjoB,GASzB,OANAh9C,KAAKklE,sBACLllE,KAAKwtC,YAAY,aAAc,CAC9B3jB,KAAM,QACNle,KAAM64D,EACN5rD,WAEM,CACR,CAEAusD,UAAAA,CAAWx5D,GACV,MAAM64D,EAAYh+D,OAAOmF,GAAQ,IAAIlF,OACrC,IAAK+9D,EACJ,OAAO,EAER,MAAM5Z,EAAU5qD,KAAK6jE,oBACrB,QAAKzgE,OAAO+E,UAAUhE,eAAeiE,KAAKwiD,EAAS4Z,YAG5C5Z,EAAQ4Z,GACfxkE,KAAK8jE,mBAAmBlZ,GACxB5qD,KAAKwtC,YAAY,aAAc,CAC9B3jB,KAAM,SACNle,KAAM64D,KAEA,EACR,CAEAt8D,IAAAA,GACC,GAAIlI,KAAK+gE,eACR,OAGD,MAAMqE,EAAeplE,KAAKW,SAAS8yB,cAC7B4xC,EAAiBrlE,KAAKW,SAASgN,QAAQ,IAAIgxD,MAEjD,GADkB0G,GAAkBA,EAAehkE,SAASrB,KAAKW,UAUhEX,KAAKwnC,QAAU69B,EACXrlE,KAAKwnC,UACRxnC,KAAKwnC,QAAQrmC,UAAUC,IAAIu9D,IAC3B3+D,KAAK2zC,2BAA2B3zC,KAAKwnC,cAZvB,CACf,MAAM9nB,EAAUrS,SAAS2K,cAAc,OACvC0H,EAAQoD,UAAY67C,GACpB3+D,KAAK2zC,2BAA2Bj0B,GAChC1f,KAAKW,SAASyvB,WAAWzf,aAAa+O,EAAS1f,KAAKW,UACpD+e,EAAQ4K,YAAYtqB,KAAKW,UAEzBX,KAAKwnC,QAAU9nB,CAChB,CAQA,IAAK1f,KAAKwnC,QAAS,OAEnBxnC,KAAKuwC,qBAAqB60B,GAC1BplE,KAAKywC,mBACLzwC,KAAKslE,0BACLtlE,KAAK6pD,oBACL7pD,KAAKulE,qBACLvlE,KAAK0xC,qBACL1xC,KAAKo4C,yBAEL,MAAMotB,EAAkBztD,QAAQ/X,KAAKa,QAAQ2+C,UAAYx/C,KAAKa,QAAQ2+C,SAASr/C,QACzEslE,EAAoBzlE,KAAK+kD,uBACzB2gB,EAAqB1lE,KAAK2lE,8BAC1BC,GAAsBF,GAA6B1lE,KAAK6lE,yBAC9D7lE,KAAKW,SAASQ,UAAUsf,OAAO,iBAAkB+kD,GACjDxlE,KAAKW,SAASQ,UAAUsf,OAAO,mBAAoBglD,GACnDzlE,KAAKW,SAASQ,UAAUsf,OAAO,oBAAqBmlD,GACpD5lE,KAAKW,SAASQ,UAAUsf,OAAO,qBAAsBilD,GACrD1lE,KAAKwnC,QAAQrmC,UAAUsf,OAAO,iBAAkB+kD,GAChDxlE,KAAKwnC,QAAQrmC,UAAUsf,OAAO,mBAAoBglD,GAClDzlE,KAAKwnC,QAAQrmC,UAAUsf,OAAO,oBAAqBmlD,GACnD5lE,KAAKwnC,QAAQrmC,UAAUsf,OAAO,qBAAsBilD,GACpD1lE,KAAK8lE,mBAAmBF,GACxB5lE,KAAK+lE,wBAAwBL,GAE7B,MAAMthE,EAAQpE,KAAKoiD,YAsBnB,GArBApiD,KAAKs0C,UAAYv8B,QAAQ3T,GACzBpE,KAAK+2C,QAAU/2C,KAAKgmE,aACpBhmE,KAAKu9C,WAAav9C,KAAK8lD,uBACvB9lD,KAAKi1C,cAAgBj1C,KAAK6lD,0BAC1B7lD,KAAK+gE,gBAAiB,EAEjB/gE,KAAKs0C,YACTt0C,KAAK6gE,MAAQ7gE,KAAKimE,gBAClBjmE,KAAK8gE,cAAgB9gE,KAAK6gE,MAAMh/C,SAGjC7hB,KAAKkmE,eACLlmE,KAAKmmE,qBACLnmE,KAAKomE,oBACLpmE,KAAKqmE,kBACLrmE,KAAKsmE,cACLtmE,KAAKujE,eACLvjE,KAAKwpD,yBACLxpD,KAAKylD,gBACLzlD,KAAKm5C,+BAEDssB,EAMH,OALAzlE,KAAKumE,qBACLvmE,KAAKwtC,YAAY,OAAQ,CACxBuP,KAAM/8C,KAAKk6C,WAAW6C,KACtB5C,QAASn6C,KAAKk6C,WAAWC,UAK3B,GAAIn6C,KAAKs0C,UAAW,CACnB,MAAMyI,EAAO/8C,KAAKgmD,kBACZ7L,EAAUn6C,KAAKqgD,qBACrBrgD,KAAKk6C,WAAa,CAAE6C,OAAM5C,WAC1B,MAAM8L,EAAqBjmD,KAAKkmD,iCAChClmD,KAAK2gD,gBAAgB5D,EAAM5C,EAAS,KAAM8L,EAC3C,MACCjmD,KAAKu2C,gCACLv2C,KAAKwmE,qBAGNxmE,KAAKwtC,YAAY,OAAQ,CACxBuP,KAAM/8C,KAAKk6C,WAAW6C,KACtB5C,QAASn6C,KAAKk6C,WAAWC,SAE3B,CAEAosB,aAAAA,GACC,GAAIvmE,KAAKs0C,UAER,YADAt0C,KAAKymE,uBAINzmE,KAAK6gE,MAAQ7gE,KAAKimE,gBACbjmE,KAAK8gE,cAAc1yD,SACvBpO,KAAK8gE,cAAgB9gE,KAAK6gE,MAAMh/C,SAGjC,MAAMk7B,EAAO/8C,KAAKgmD,kBACZ7L,EAAUn6C,KAAKqgD,qBACfnD,EAAal9C,KAAKglE,eAAe7qB,GACjCusB,EAAcvxD,KAAKO,IAAIqnC,EAAMG,GACnCl9C,KAAKk6C,WAAa,CAAE6C,KAAM2pB,EAAavsB,WAEvC,MAAMgC,EAAen8C,KAAKa,QAAQu5C,WAAW2R,SACvC4a,EAAsB3mE,KAAKa,QAAQu5C,WAAW4R,gBAC9C4a,EAAiB5mE,KAAKy0C,gBAAgB,cAEtCoyB,EAAoBzjE,OAAO6C,OAAO,CAAC,EAAGjG,KAAKa,QAAQu5C,WAAYwsB,EAAgB,CACpF7pB,KAAM2pB,EACNvsB,UACA2Q,WAAY9qD,KAAK8mE,iBACjB5pB,aACA6O,SAAWxnC,IACV,MAAM0tC,EAAiBjyD,KAAKglE,eAAezgD,EAAQ41B,SAC7C0C,EAAW1nC,KAAKO,IAAI6O,EAAQw4B,KAAMkV,GACxCjyD,KAAKk6C,WAAa,CAAE6C,KAAMF,EAAU1C,QAAS51B,EAAQ41B,SACrDn6C,KAAKo9C,WAAWP,GAChB78C,KAAKq9C,cAAc94B,EAAQ41B,SAE3Bn6C,KAAKilE,gBAAgBpoB,EAAUt4B,EAAQ41B,SACvCn6C,KAAK+9C,YAAYC,QAAQ,CACxBjB,KAAMF,EACN1C,QAAS51B,EAAQ41B,QACjB+C,WAAY+U,IAEU,aAAnB1tC,EAAQhe,QACXvG,KAAK+mE,yBAEN/mE,KAAKi+C,gBAEuB,mBAAjB9B,GACVA,EAAa/4C,OAAO6C,OAAO,CAAC,EAAGse,EAAS,CACvCw4B,KAAMF,EACNK,WAAY+U,KAIdjyD,KAAKwtC,YAAY,aAAc,CAC9BuP,KAAMF,EACN1C,QAAS51B,EAAQ41B,QACjB+C,WAAY+U,EACZ1rD,OAAQ,SACP,EAEHylD,gBAAkBznC,IACkB,mBAAxBoiD,GACVA,EAAoBpiD,GAErBvkB,KAAKwtC,YAAY,gBAAiBpqC,OAAO6C,OAAO,CAAC,EAAGse,EAAS,CAC5Dhe,OAAQ,UACN,IAIC6zC,EAAa,IAAI4sB,GAAWhnE,KAAKwnC,QAASq/B,GAChDzsB,EAAWlyC,OACXlI,KAAK+9C,YAAc3D,EAEnBp6C,KAAKilE,gBAAgByB,EAAavsB,GAClCn6C,KAAKu2C,+BACN,CAEAkwB,oBAAAA,GACC,MAAM1pB,EAAO/8C,KAAKgmD,kBACZ7L,EAAUn6C,KAAKqgD,qBACrBrgD,KAAKk6C,WAAa,CAAE6C,OAAM5C,WAE1B,MAAMgC,EAAen8C,KAAKa,QAAQu5C,WAAW2R,SACvC4a,EAAsB3mE,KAAKa,QAAQu5C,WAAW4R,gBAC9C4a,EAAiB5mE,KAAKy0C,gBAAgB,cAEtCoyB,EAAoBzjE,OAAO6C,OAAO,CAAC,EAAGjG,KAAKa,QAAQu5C,WAAYwsB,EAAgB,CACpF7pB,OACA5C,UACA2Q,WAAY9qD,KAAK8mE,iBACjB5pB,WAAY,EACZ6O,SAAUkb,UACTjnE,KAAKk6C,WAAa,CAAE6C,KAAMx4B,EAAQw4B,KAAM5C,QAAS51B,EAAQ41B,SACzDn6C,KAAKo9C,WAAW74B,EAAQw4B,MACxB/8C,KAAKq9C,cAAc94B,EAAQ41B,SACJ,aAAnB51B,EAAQhe,QACXvG,KAAK+mE,+BAEA/mE,KAAK2gD,gBAAgBp8B,EAAQw4B,KAAMx4B,EAAQ41B,QAASgC,GAC1D,MAAMe,EAAal9C,KAAK88C,sBAAsB98C,KAAKw8C,gBAAgBW,MAAO,GAC1En9C,KAAKwtC,YAAY,aAAc,CAC9BuP,KAAMx4B,EAAQw4B,KACd5C,QAAS51B,EAAQ41B,QACjB+C,aACA32C,OAAQ,UACP,EAEHylD,gBAAkBznC,IACkB,mBAAxBoiD,GACVA,EAAoBpiD,GAErBvkB,KAAKwtC,YAAY,gBAAiBpqC,OAAO6C,OAAO,CAAC,EAAGse,EAAS,CAC5Dhe,OAAQ,WACN,IAIC6zC,EAAa,IAAI4sB,GAAWhnE,KAAKwnC,QAASq/B,GAChDzsB,EAAWlyC,OACXlI,KAAK+9C,YAAc3D,EAEnB,MAAM6L,EAAqBjmD,KAAKkmD,iCAChClmD,KAAK2gD,gBAAgB5D,EAAM5C,EAAS,KAAM8L,EAC3C,CAEAggB,aAAAA,GACC,MAAMn/D,EAAO9G,KAAKW,SAAS+rC,SAAW1sC,KAAKW,SAAS+rC,QAAQ,GAC5D,OAAK5lC,EAGEsK,MAAMC,KAAKvK,EAAKslB,MAAMnqB,QAAQwqB,GAAkE,MAA1DjmB,OAAOimB,EAAIlb,aAAa,wBAA0B,MAFvF,EAGT,CAEAyzD,cAAAA,CAAe7qB,GACd,OAAKn6C,KAAK6gE,MAAMzyD,OAGT+G,KAAKC,IAAI,EAAGD,KAAK+xD,KAAKlnE,KAAK6gE,MAAMzyD,OAAS+rC,IAFzC,CAGT,CAEA8qB,eAAAA,CAAgBloB,EAAM5C,GACrB,IAAKn6C,KAAK6gE,MAAMzyD,OACf,OAGD,MAAM+4D,EAAmBnnE,KAAKonE,oBACxB7R,GAASxY,EAAO,GAAK5C,EACrBqb,EAAMD,EAAQpb,EAEpBn6C,KAAK6gE,MAAMz+D,SAAQ,CAACqqB,EAAKvK,KACxBuK,EAAIslB,OAAS7vB,EAAQqzC,GAASrzC,GAASszC,CAAG,IAEvC2R,GACHnnE,KAAKgiE,cAAcC,SAAWllB,EAC9B/8C,KAAKgiE,cAAcE,YAAc/nB,EACjCn6C,KAAKqnE,oBAAoBtqB,EAAM5C,IAE/Bn6C,KAAKsnE,yBAENtnE,KAAKwmE,qBACLxmE,KAAKu2C,gCACLv2C,KAAKm5C,8BACN,CAEAiuB,iBAAAA,GACC,MAAMzhE,EAAU3F,KAAKa,QAAQ4rD,SAAW,CAAC,EACnCvjC,EAAOlpB,KAAKW,SAAS4Q,aAAa,uBAIxC,KAHyB,OAAT2X,EACblpB,KAAKi7C,UAAU/xB,GACfnR,QAAQpS,EAAQxF,SAElB,OAAO,EAER,MAAMonE,EAAevnE,KAAKW,SAAS4Q,aAAa,0BAC1CM,EAAY7R,KAAK88C,sBACL,OAAjByqB,EAAwBA,EAAe5hE,EAAQkM,UAC/C,KAED,OAAO7R,KAAK6gE,MAAMzyD,QAAUyD,CAC7B,CAEA21D,mBAAAA,GACMxnE,KAAK8tC,iBAAkB9tC,KAAKgiE,cAAcH,QAG/C7hE,KAAK8tC,eAAel+B,iBAAiB,SAAU5P,KAAKqiE,oBAAqB,CAAEzzB,SAAS,IACpF5uC,KAAKgiE,cAAcH,OAAQ,EAC5B,CAEA4F,8BAAAA,GACMznE,KAAK8tC,gBAAmB9tC,KAAKgiE,cAAcH,QAGhD7hE,KAAK8tC,eAAep8B,oBAAoB,SAAU1R,KAAKqiE,qBACvDriE,KAAKgiE,cAAcH,OAAQ,EAC5B,CAEAS,oBAAAA,GACC,IAAKtiE,KAAKonE,oBACT,OAED,GAAIpnE,KAAKgiE,cAAcC,UAAY,GAAKjiE,KAAKgiE,cAAcE,aAAe,EACzE,OAED,MAAMwF,EAAgB1nE,KAAK8tC,gBAAkB9tC,KAAK8tC,eAAepQ,WAAkB,EAC/EgqC,IAAkB1nE,KAAKgiE,cAAcG,eAA8C,IAA7BniE,KAAKgiE,cAActqD,QAG7E1X,KAAKgiE,cAAcG,cAAgBuF,EAC/B1nE,KAAKgiE,cAActqD,QAGD,oBAAXrC,QAAkE,mBAAjCA,OAAOpF,sBAInDjQ,KAAKgiE,cAActqD,MAAQrC,OAAOpF,uBAAsB,KACvDjQ,KAAKgiE,cAActqD,MAAQ,EAC3B1X,KAAKqnE,oBAAoBrnE,KAAKgiE,cAAcC,SAAUjiE,KAAKgiE,cAAcE,YAAY,IALrFliE,KAAKqnE,oBAAoBrnE,KAAKgiE,cAAcC,SAAUjiE,KAAKgiE,cAAcE,cAO3E,CAEAmF,mBAAAA,CAAoBtqB,EAAM5C,GACzB,IAAKn6C,KAAKonE,sBAAwBpnE,KAAK8tC,eAEtC,YADA9tC,KAAKsnE,yBAINtnE,KAAKwnE,sBACL,MAAM1gE,EAAO9G,KAAK62C,WAClB,IAAK/vC,EAEJ,YADA9G,KAAKsnE,yBAGN,MAAM3hE,EAAU3F,KAAKa,QAAQ4rD,SAAW,CAAC,EACnC5T,EAAY74C,KAAK2nE,yBAAyB5qB,EAAM5C,EAASx0C,GACzDiiE,EAAc5nE,KAAKW,SAAS4Q,aAAa,yBACzCm7C,EAAWv3C,KAAKC,IAAI,EAAGpV,KAAK88C,sBAAsC,OAAhB8qB,EAAuBA,EAAcjiE,EAAQ+mD,SAAU,IACzG1V,EAAe7hC,KAAKC,IAAI,EAAGD,KAAK+xD,MAAMlnE,KAAK8tC,eAAe7rB,cAAgB,GAAK42B,IAC/EgvB,GAAa9qB,EAAO,GAAK5C,EACzB2tB,EAAU3yD,KAAKO,IAAImyD,EAAY1tB,EAASn6C,KAAK6gE,MAAMzyD,QAEnD25D,EAAe5yD,KAAK2gB,OAAO91B,KAAK8tC,eAAepQ,WAAa,GAAKmb,GACjEmvB,EAAc7yD,KAAKC,IAAIyyD,EAAWA,EAAYE,EAAerb,GAC7Dub,EAAY9yD,KAAKO,IAAIoyD,EAASD,EAAYE,EAAe/wB,EAAe0V,GAExEwb,EAAkB/yD,KAAKC,IAAI,GAAI4yD,EAAcH,GAAahvB,GAC1DsvB,EAAqBhzD,KAAKC,IAAI,GAAI0yD,EAAUG,GAAapvB,GAC/D,GACC74C,KAAKgiE,cAAczM,QAAUyS,GAC1BhoE,KAAKgiE,cAAcxM,MAAQyS,GAC3BjoE,KAAKgiE,cAAcjlB,OAASA,GAC5B/8C,KAAKgiE,cAAc7nB,UAAYA,EAGlC,YADAn6C,KAAKooE,oBAAoBthE,EAAMkhE,EAAaC,EAAWC,EAAiBC,GAIzE,MAAME,EAAgBroE,KAAKgiE,cAAcjlB,OAASA,GAAQ/8C,KAAKgiE,cAAc7nB,UAAYA,EACnFmuB,EAAYtoE,KAAKgiE,cAAczM,MAC/BgT,EAAUvoE,KAAKgiE,cAAcxM,IAC7BgT,EAAaH,EAChBlzD,KAAKC,IAAIyyD,EAAW1yD,KAAKO,IAAI4yD,EAAWN,IACxCH,EACGY,EAAWJ,EACdlzD,KAAKO,IAAIoyD,EAAS3yD,KAAKC,IAAImzD,EAASN,IACpCH,EACH,IAAK,IAAI5lD,EAAQsmD,EAAYtmD,EAAQumD,EAAUvmD,GAAS,EAAG,CAC1D,MAAMuK,EAAMzsB,KAAK6gE,MAAM3+C,GAClBuK,IAGLA,EAAIslB,OAAS7vB,EAAQ8lD,GAAe9lD,GAAS+lD,EAC9C,CACAjoE,KAAKooE,oBAAoBthE,EAAMkhE,EAAaC,EAAWC,EAAiBC,GACxEnoE,KAAKgiE,cAAczM,MAAQyS,EAC3BhoE,KAAKgiE,cAAcxM,IAAMyS,EACzBjoE,KAAKgiE,cAAcjlB,KAAOA,EAC1B/8C,KAAKgiE,cAAc7nB,QAAUA,EAC7Bn6C,KAAKgiE,cAAcnpB,UAAYA,CAChC,CAEA8uB,wBAAAA,CAAyB5qB,EAAM5C,EAASx0C,EAAU,CAAC,GAClD,MAAM+iE,EAAgB1oE,KAAKW,SAAS4Q,aAAa,2BACjD,GAAsB,OAAlBm3D,GAA2D,KAAjCliE,OAAOkiE,GAAejiE,OACnD,OAAO0O,KAAKC,IAAI,GAAIpV,KAAK88C,sBAAsB4rB,EAAe,KAG/D,MAAMC,EAAkB3oE,KAAK88C,sBAAsBn3C,EAAQijE,UAAW,GAChEf,EAAY1yD,KAAKC,IAAI,GAAI2nC,EAAO,GAAK5C,GACrC2tB,EAAU3yD,KAAKO,IAAImyD,EAAY1tB,EAASn6C,KAAK6gE,MAAMzyD,QACnDy6D,EAAiB7oE,KAAK8oE,yBAAyBjB,EAAWC,GAChE,GAAIe,EAAiB,EACpB,OAAOA,EAER,GAAIF,EAAkB,EACrB,OAAOxzD,KAAKC,IAAI,GAAIuzD,GAErB,MAAMI,EAAe/oE,KAAK88C,sBAAsB98C,KAAKgiE,cAAcnpB,UAAW,IAC9E,OAAO1jC,KAAKC,IAAI,GAAI2zD,EACrB,CAEAD,wBAAAA,CAAyBjB,EAAWC,GACnC,MAAMkB,EAAU,GAChB,IAAK,IAAI9mD,EAAQ2lD,EAAW3lD,EAAQ4lD,EAAS5lD,GAAS,EAAG,CACxD,MAAMuK,EAAMzsB,KAAK6gE,MAAM3+C,GACvB,IAAKuK,GAAOA,EAAIslB,OACf,SAED,MAAM1hC,EAAOoc,EAAInc,wBACXE,EAAS2E,KAAK2D,MAAMzI,GAAQA,EAAKG,OAASH,EAAKG,OAAS,GAI9D,GAHIA,EAAS,GACZw4D,EAAQrxD,KAAKnH,GAEVw4D,EAAQ56D,QAAU,EACrB,KAEF,CACA,IAAK46D,EAAQ56D,OACZ,OAAO,EAER,MAAM4Y,EAAQgiD,EAAQjnD,QAAO,CAACC,EAAK9d,IAAU8d,EAAM9d,GAAO,GAC1D,OAAOiR,KAAKC,IAAI,GAAID,KAAK2D,MAAMkO,EAAQgiD,EAAQ56D,QAChD,CAEAg6D,mBAAAA,CAAoBthE,EAAMkhE,EAAaC,EAAWgB,EAAWC,GAC5D,MAAMrgC,EAAU7oC,KAAKw4C,2BACf2wB,EAAYnpE,KAAKopE,qBAAqB,MAAOvgC,GAC7CwgC,EAAerpE,KAAKopE,qBAAqB,SAAUvgC,GACnDygC,EAAkBtpE,KAAK6gE,MAAMmH,IAAgB,KAC7CuB,EAAkBvpE,KAAK6gE,MAAMoH,IAAc,KAEjDjoE,KAAKwpE,qBAAqBL,EAAWF,EAAWpgC,GAChD7oC,KAAKwpE,qBAAqBH,EAAcH,EAAcrgC,GAElDygC,EACHxiE,EAAK6J,aAAaw4D,EAAWG,GAClBH,EAAU11C,eACrB3sB,EAAKwjB,YAAY6+C,GAGdI,EACHziE,EAAK6J,aAAa04D,EAAcE,GAEhCziE,EAAKwjB,YAAY++C,EAEnB,CAEAD,oBAAAA,CAAqBxyD,EAAUiyB,GAC9B,MAAM/O,EAAU95B,KAAKoiE,iBAAmBpiE,KAAKoiE,gBAAgBxrD,GAC1D5W,KAAKoiE,gBAAgBxrD,GACrB,KACH,GAAIkjB,GAAWA,EAAQ6V,YAEtB,OADA3vC,KAAKypE,0BAA0B3vC,EAAS+O,GACjC/O,EAGR,MAAM4vC,EAASr8D,SAAS2K,cAAc,MACtC0xD,EAAOh6D,aAAa,sBAAuB,KAC3Cg6D,EAAOh6D,aAAa,+BAAgCkH,GACpD8yD,EAAOh6D,aAAa,oBAAqB,KACzCg6D,EAAOh6D,aAAa,cAAe,QACnC,MAAMid,EAAOtf,SAAS2K,cAAc,MAKpC,OAJA2U,EAAKjd,aAAa,2BAA4B,KAC9Cid,EAAKg9C,QAAUx0D,KAAKC,IAAI,EAAGyzB,GAC3B6gC,EAAOp/C,YAAYqC,GACnB3sB,KAAKoiE,gBAAgBxrD,GAAY8yD,EAC1BA,CACR,CAEAD,yBAAAA,CAA0BC,EAAQ7gC,GAC5B6gC,GAAWA,EAAOh9C,OAAUg9C,EAAOh9C,MAAM,KAG9Cg9C,EAAOh9C,MAAM,GAAGi9C,QAAUx0D,KAAKC,IAAI,EAAGyzB,GACvC,CAEA2gC,oBAAAA,CAAqBE,EAAQl5D,EAAQq4B,GACpC,IAAK6gC,IAAWA,EAAOh9C,QAAUg9C,EAAOh9C,MAAM,GAC7C,OAED,MAAMk9C,EAAaz0D,KAAKC,IAAI,EAAGD,KAAK2D,MAAMtI,IAC1CxQ,KAAKypE,0BAA0BC,EAAQ7gC,GAC1B6gC,EAAOh9C,MAAM,GACrB3Y,MAAMvD,OAAS,GAAGo5D,MACvBF,EAAO33B,OAAS63B,GAAc,CAC/B,CAEAtC,sBAAAA,GACCtnE,KAAKynE,iCACDznE,KAAKgiE,cAActqD,OAA2B,oBAAXrC,QAAiE,mBAAhCA,OAAO8G,sBAC9E9G,OAAO8G,qBAAqBnc,KAAKgiE,cAActqD,OAEhD1X,KAAKgiE,cAAczM,MAAQ,EAC3Bv1D,KAAKgiE,cAAcxM,IAAM,EACzBx1D,KAAKgiE,cAAcjlB,MAAQ,EAC3B/8C,KAAKgiE,cAAc7nB,SAAW,EAC9Bn6C,KAAKgiE,cAActqD,MAAQ,EAC3B1X,KAAKgiE,cAAcG,eAAiB,EACpC/+D,OAAOwgB,KAAK5jB,KAAKoiE,iBAAmB,CAAC,GAAGhgE,SAAS3B,IAChD,MAAMipE,EAAS1pE,KAAKoiE,gBAAgB3hE,GAChCipE,GAAUA,EAAOj2C,eACpBi2C,EAAOj2C,cAAco2C,YAAYH,EAClC,GAEF,CAGA5sB,qBAAAA,CAAsB54C,EAAO4vC,GAC5B,MAAMlB,EAAS/9B,OAAOw3B,SAASnoC,EAAO,IACtC,OAAO2Q,OAAOI,SAAS29B,IAAWA,EAAS,EAAIA,EAASkB,CACzD,CAEAsO,SAAAA,GACC,MAAMh8C,EAAiBpG,KAAKa,QAAQwF,SAAW,CAAC,EAC1CyjE,EAAY9pE,KAAKW,SAAS4Q,aAAa,sBAE7C,OADqB/K,OAAOJ,EAAehC,OAAS0lE,GAAa,IAAIrjE,QAI9DzG,KAAKmiD,kBACb,CAEAmjB,uBAAAA,GACC,MAAMyE,EAAe/pE,KAAKgqE,qBAAqB,UAC3CD,IACH/pE,KAAKa,QAAQkpD,OAASvjD,OAAOujE,GAAcvkE,cAAciB,QAG1D,MAAMwjE,EAAoBjqE,KAAKgqE,qBAAqB,oBAChDC,IACEjqE,KAAKa,QAAQ60C,SAA2C,iBAAzB11C,KAAKa,QAAQ60C,UAChD11C,KAAKa,QAAQ60C,QAAU,CAAC,GAEzB11C,KAAKa,QAAQ60C,QAAQnlB,MAAQvwB,KAAKsjE,2BAA2B2G,GAE/D,CAEAC,qBAAAA,CAAsBzpE,GACrB,MAAM6vD,EAActwD,KAAKa,QAAQyvD,aAAe,CAAC,EAC3C6Z,EAAcnqE,KAAKW,SAAS4Q,aAAa,2BAI/C,KAHsC,OAAhB44D,EACnBnqE,KAAKi7C,UAAUkvB,GACfpyD,QAAQu4C,EAAYnwD,SAEtB,OAAO,EAGR,MAIMwoD,EAJc,CACnBoB,OAAQ,0BACRqgB,iBAAkB,uCAEU3pE,GAC7B,GAAIkoD,EAAU,CACb,MAAMx/B,EAAYnpB,KAAKW,SAAS4Q,aAAao3C,GAC7C,GAAkB,OAAdx/B,EACH,OAAOnpB,KAAKi7C,UAAU9xB,EAExB,CAEA,OAAOpR,QAAQu4C,EAAY7vD,GAC5B,CAEA4pE,yBAAAA,CAA0B5pE,GACzB,MAAM6vD,EAActwD,KAAKa,QAAQyvD,aAAe,CAAC,EAGjD,MAAO,GAFU9pD,OAAO8pD,EAAY5xB,YAAc1+B,KAAKW,SAAS4Q,aAAa,iCAAmC,IAAI9K,QAC3FzG,KAAK8yC,wBAAwB1qB,QAAQ,UAAW,YACvD3nB,GACnB,CAEAupE,oBAAAA,CAAqBvpE,GACpB,IAAKT,KAAKkqE,sBAAsBzpE,GAC/B,MAAO,GAER,IACC,OAAO+F,OAAO6O,OAAOspB,aAAaG,QAAQ9+B,KAAKqqE,0BAA0B5pE,KAAS,GACnF,CAAE,MAAO2O,GACR,MAAO,EACR,CACD,CAEAg0D,qBAAAA,CAAsB3iE,EAAKyD,GAC1B,GAAKlE,KAAKkqE,sBAAsBzpE,GAGhC,IACC4U,OAAOspB,aAAaC,QAAQ5+B,KAAKqqE,0BAA0B5pE,GAAM+F,OAAOtC,GAAS,IAClF,CAAE,MAAOkL,GACR,CAEF,CAEA6rC,SAAAA,CAAU/2C,GACT,MAAM+e,EAAazc,OAAOtC,GAAOsB,cAAciB,OAC/C,MAAsB,UAAfwc,GAAyC,MAAfA,GAAqC,KAAfA,CACxD,CAEA+iD,UAAAA,GACC,MAAMsE,EAAel5D,MAAMC,KAAKrR,KAAKW,SAAS6O,iBAAiB,yBAC7DlB,KAAKqe,IAAUA,EAAKpb,aAAa,eAAiB,IAAI9K,SACtDxE,OAAO8V,SAET,OAAIuyD,EAAal8D,OACTk8D,EAGD,CAAC,MAAO,OAAQ,WAAY,QAAS,QAAS,SACtD,CAEAzzB,QAAAA,GACC,GAAI72C,KAAKW,SAAS+rC,SAAW1sC,KAAKW,SAAS+rC,QAAQ,GAClD,OAAO1sC,KAAKW,SAAS+rC,QAAQ,GAG9B,MAAM5lC,EAAOuG,SAAS2K,cAAc,SAEpC,OADAhY,KAAKW,SAAS2pB,YAAYxjB,GACnBA,CACR,CAEAm4C,sBAAAA,GACC,MAAM74C,EAAiBpG,KAAKa,QAAQwF,SAAW,CAAC,EAC1C07C,EAAmB/hD,KAAKW,SAAS4Q,aAAa,6BAC9Cw3B,EAA2B,OAArBgZ,EAA4BA,EAAmB37C,EAAe44C,aACpE/7B,EAAazc,OAAOuiC,GAAO,QAAQvjC,cAAciB,OACvD,MAAmB,SAAfwc,GAAwC,SAAfA,EACrBA,EAED,MACR,CAEA08B,uBAAAA,GACC,MAAMv5C,EAAiBpG,KAAKa,QAAQwF,SAAW,CAAC,EAC1C6iB,EAAOlpB,KAAKW,SAAS4Q,aAAa,0BAClCw3B,EAAe,OAAT7f,EAAgBA,EAAO9iB,EAAe47C,UAElD,OADmBx7C,OAAOuiC,GAAO,IAAItiC,QAChB,EACtB,CAEAo5C,wBAAAA,GACC,MAAMz5C,EAAiBpG,KAAKa,QAAQwF,SAAW,CAAC,EAC1C6iB,EAAOlpB,KAAKW,SAAS4Q,aAAa,0BAClCw3B,EAAe,OAAT7f,EAAgBA,EAAO9iB,EAAe67C,UAElD,OADmBz7C,OAAOuiC,GAAO,IAAItiC,QAChB,EACtB,CAEAs5C,yBAAAA,GACC,MAAM35C,EAAiBpG,KAAKa,QAAQwF,SAAW,CAAC,EAC1C6iB,EAAOlpB,KAAKW,SAAS4Q,aAAa,4BAClCw3B,EAAe,OAAT7f,EAAgBA,EAAO9iB,EAAe87C,YAElD,OADmB17C,OAAOuiC,GAAO,IAAItiC,QAChB,EACtB,CAEAq0C,mBAAAA,GAEC,OADqB96C,KAAKmiD,oBAInBniD,KAAKoiD,WACb,CAEAC,mBAAAA,GACC,MACMnH,GADiBl7C,KAAKa,QAAQwF,SAAW,CAAC,GACbi8C,SACnC,GAAIpH,GAAsC,iBAAhBA,IAA6B9pC,MAAMiP,QAAQ66B,GACpE,OAAOA,EAGR,MAAMhyB,EAAOlpB,KAAKW,SAAS4Q,aAAa,0BAA4B,GACpE,IAAK2X,EACJ,MAAO,CAAC,EAGT,IACC,MAAM0pB,EAAS3uB,KAAK/c,MAAMgiB,GAC1B,GAAI0pB,GAA4B,iBAAXA,IAAwBxhC,MAAMiP,QAAQuyB,GAC1D,OAAOA,CAET,CAAE,MAAOxjC,GACR,MAAO,CAAC,CACT,CAEA,MAAO,CAAC,CACT,CAEAmxC,uBAAAA,CAAwBx9C,EAAS,CAAC,GACjC,MAAMuL,EAAMtO,KAAKqiD,sBACXzsB,EAAS,CAAC,EAQhB,OAPAxyB,OAAOwgB,KAAK7gB,GAAU,CAAC,GAAGX,SAAS3B,IAClC,MAAM6D,EAASlB,OAAO+E,UAAUhE,eAAeiE,KAAKkG,EAAK7N,GACtD+F,OAAO8H,EAAI7N,IAAQ,IAAIgG,OACvBhG,EAEHm1B,EADgBtxB,GAAU7D,GACRsC,EAAOtC,EAAI,IAEvBm1B,CACR,CAEAqtB,eAAAA,CAAgBj3C,GACf,MAAM5F,EAAiBpG,KAAKa,QAAQwF,SAAW,CAAC,EAChD,GAAa,SAAT2F,EAAiB,CACpB,MAAMk3C,EAAWljD,KAAKW,SAAS4Q,aAAa,yBACtCw3B,EAAmB,OAAbma,EAAoBA,EAAW98C,EAAe+8C,SAC1D,OAAO38C,OAAOuiC,GAAO,IAAItiC,MAC1B,CACA,GAAa,SAATuF,EAAiB,CACpB,MAAMo3C,EAAWpjD,KAAKW,SAAS4Q,aAAa,yBACtCw3B,EAAmB,OAAbqa,EAAoBA,EAAWh9C,EAAei9C,SAC1D,OAAO78C,OAAOuiC,GAAO,IAAItiC,MAC1B,CACA,GAAa,SAATuF,EAAiB,CACpB,MAAMs3C,EAAWtjD,KAAKW,SAAS4Q,aAAa,yBACtCw3B,EAAmB,OAAbua,EAAoBA,EAAWl9C,EAAem9C,SAC1D,OAAO/8C,OAAOuiC,GAAO,IAAItiC,MAC1B,CACA,MAAO,EACR,CAEA+8C,SAAAA,CAAUj9C,EAAQ2F,GACjB,IAAK3F,GAA4B,iBAAXA,EACrB,OAED,MAAM0c,EAAazc,OAAO0F,GAAQ,IAAIzF,OACtC,IAAKwc,EACJ,OAED,MAAMwgC,EAAQxgC,EAAWzX,MAAM,KAAK8C,KAAKwB,GAAStJ,OAAOsJ,GAAQ,IAAIrJ,SAAQxE,OAAO8V,SACpF,IAAK0rC,EAAMr1C,OACV,OAED,IAAI0rB,EAAUvzB,EACd,IAAK,IAAIykB,EAAI,EAAGA,EAAIy4B,EAAMr1C,OAAQ4c,GAAK,EAAG,CACzC,IAAK8O,GAA8B,iBAAZA,IAAyB12B,OAAO+E,UAAUhE,eAAeiE,KAAK0xB,EAAS2pB,EAAMz4B,IACnG,OAED8O,EAAUA,EAAQ2pB,EAAMz4B,GACzB,CACA,OAAO8O,CACR,CAEAsiB,kBAAAA,CAAmBv4C,GAClB,MAAM6/C,EAAa1jD,KAAKwjD,UAAU3/C,EAAU7D,KAAKijD,gBAAgB,SACjE,OAAI7xC,MAAMiP,QAAQqjC,GACVA,EAEDtyC,MAAMiP,QAAQxc,GAAYA,EAASgB,MAAQhB,EAASgB,KAAO,EACnE,CAEAw3C,kBAAAA,CAAmBx4C,GAClB,MAAM6/C,EAAa1jD,KAAKwjD,UAAU3/C,EAAU7D,KAAKijD,gBAAgB,SACjE,OAAIS,GAAoC,iBAAfA,IAA4BtyC,MAAMiP,QAAQqjC,GAC3DA,EAED7/C,GAAgC,iBAAbA,GAAyBA,EAASyhB,MAAiC,iBAAlBzhB,EAASyhB,KACjFzhB,EAASyhB,KACT,CAAC,CACL,CAEAo3B,0BAAAA,CAA2B74C,GAC1B,IAAKA,GAAgC,iBAAbA,EACvB,MAAO,GAGR,MAAM6/C,EAAa1jD,KAAKwjD,UAAU3/C,EAAU7D,KAAKijD,gBAAgB,SACjE,GAA0B,iBAAfS,EACV,OAAOA,EAGR,GAA6B,iBAAlB7/C,EAASq7C,KACnB,OAAOr7C,EAASq7C,KAGjB,MAAMA,EAAOr7C,EAASq7C,MAAiC,iBAAlBr7C,EAASq7C,KAAoBr7C,EAASq7C,KAAO,KAClF,OAAIA,GAA8B,iBAAfA,EAAKtyB,MAChBsyB,EAAKtyB,MAETsyB,GAA6B,iBAAdA,EAAK9yB,KAChB8yB,EAAK9yB,KAGiB,iBAAnBvoB,EAAS+oB,MACZ/oB,EAAS+oB,MAGV,EACR,CAEA+vB,6BAAAA,CAA8BF,EAAcrwB,GAC3C,MAAMvC,EAAO7pB,KAAKi/C,yBACZ0E,EAAqC,iBAAjBlH,GAAqD,KAAxBA,EAAah2C,OAEpE,KAD+B,SAATojB,GAA6B,SAATA,GAAmB85B,GAE5D,OAAO,EAGR,IAAKA,EAAY,CAChB,GAAIvyC,MAAMiP,QAAQ+L,IAASA,EAAKhe,OAC/B,OAAO,EAER,MAAM+C,EAAUnR,KAAK4xC,iBAAiB,aAAc,uBAEpD,OADA5xC,KAAK8hD,gBAAgB3wC,EAAS,UACvB,CACR,CAEA,MAAMrK,EAAO9G,KAAK62C,WAElB,OADA/vC,EAAKhD,UAAY24C,EACZz8C,KAAK4jD,yBAAyB98C,IAInC9G,KAAK6jD,4BAA2B,GAChC7jD,KAAK8jD,mBACE,IALN9jD,KAAK8hD,gBAAgB9hD,KAAK4xC,iBAAiB,aAAc,uBAAwB,UAC1E,EAKT,CAEAs0B,YAAAA,GACC,MAAM3mB,EAAcv/C,KAAKa,QAAQ2+C,UAAY,CAAC,EAC9C,IAAKD,EAAYp/C,OAChB,OAED,MAAMoqE,EAAevqE,KAAKy0C,gBAAgB,YACpC+1B,EAAYxqE,KAAKW,SAAS4Q,aAAa,mBACvCykD,EAA0B,OAAdwU,EACfzyD,QAAQwnC,EAAY4M,OACuB,UAA3C3lD,OAAOgkE,GAAWhlE,cAAciB,OAC7BgkE,EAAqBzqE,KAAKW,SAAS4Q,aAAa,8BAChD0kD,EAA4C,OAAvBwU,OACQ1jE,IAA/Bw4C,EAAY6M,gBAA+Br0C,QAAQwnC,EAAY6M,gBACZ,UAApD5lD,OAAOikE,GAAoBjlE,cAAciB,OACtCikE,EAAyB1qE,KAAKW,SAAS4Q,aAAa,kCACpD86C,EAAgD,OAA3Bqe,EACxB3yD,QAAQwnC,EAAY8M,oBACoC,UAAxD7lD,OAAOkkE,GAAwBllE,cAAciB,OAEhDzG,KAAK69C,UAAY,IAAI8sB,GAAS3qE,KAAKW,SAAU,CAC5CsrD,aAAcjsD,KAAKu9C,WAAWvR,MAC9BkgB,WAAYlsD,KAAKu9C,WAAWtmB,IAC5BwzB,SAAU8f,EAAa9f,SACvBC,UAAW6f,EAAa7f,UACxBsL,YACAC,qBACA5J,qBACAC,iBAAkBA,CAAChsC,EAAQ4B,MACrBliB,KAAK4qE,0BAA0BtqD,EAAQ4B,EAAOq9B,KAGO,mBAAjCA,EAAY+M,kBAClCv0C,QAAQwnC,EAAY+M,iBAAiBhsC,KAIzCyrC,SAAWxnC,GAAYvkB,KAAK6qE,kBAAkBtmD,KAE/CvkB,KAAK69C,UAAU31C,OACXlI,KAAKu9C,WAAWK,OAAS59C,KAAKu9C,WAAWK,MAAMxvC,QAClDpO,KAAK69C,UAAUC,SAAS,CAAEF,MAAO59C,KAAKu9C,WAAWK,QAElD59C,KAAKm5C,8BACN,CAEAgtB,kBAAAA,GACC,MAAM13B,EAAUzuC,KAAK8qE,0BACrB9qE,KAAKwhE,oBAAoB/yB,QAAUA,EAC9BA,IAILzuC,KAAK+qE,0BACL/qE,KAAKgrE,4BACLhrE,KAAKirE,qBACN,CAEA7E,iBAAAA,GACC,MAAM33B,EAAUzuC,KAAKkrE,yBACrBlrE,KAAK4hE,mBAAmBnzB,QAAUA,EAC7BA,IAGLzuC,KAAKmrE,2BACLnrE,KAAKorE,oBACN,CAEA/E,eAAAA,GACC,IAAKrmE,KAAKqrE,uBAKT,OAJIrrE,KAAKuiE,aAAmD,mBAA7BviE,KAAKuiE,YAAY9wD,SAC/CzR,KAAKuiE,YAAY9wD,eAElBzR,KAAKuiE,YAAc,MAIpB,MAAM38D,EAAS5F,KAAKsrE,uBAChBtrE,KAAKuiE,aAAmD,mBAA7BviE,KAAKuiE,YAAY9wD,SAC/CzR,KAAKuiE,YAAY9wD,UAElBzR,KAAKuiE,YAAc,IAAIgJ,GAAWvrE,KAAKW,SAAUyC,OAAO6C,OAAO,CAAC,EAAGL,EAAQ,CAC1Ei1D,SAAWt2C,IACVvkB,KAAKwtC,YAAY,YAAajpB,GAC9BvkB,KAAKwtC,YAAYjpB,EAAQwoC,UAAY,cAAgB,YAAaxoC,GAClEvkB,KAAKu2C,gCACLv2C,KAAKm5C,8BAA8B,KAGrCn5C,KAAKuiE,YAAYr6D,MAClB,CAEAs+D,kBAAAA,GACMxmE,KAAKuiE,aAAmD,mBAA7BviE,KAAKuiE,YAAYpL,SAGjDn3D,KAAKuiE,YAAYpL,SAClB,CAEAkU,oBAAAA,GACC,MAAM1lE,EAAU3F,KAAKa,QAAQ8rD,YAAc,CAAC,EACtCzjC,EAAOlpB,KAAKW,SAAS4Q,aAAa,0BACxC,OAAa,OAAT2X,EACIlpB,KAAKi7C,UAAU/xB,GAEhBnR,QAAQpS,EAAQxF,OACxB,CAEAmrE,oBAAAA,GACC,MAAM3lE,EAAU3F,KAAKa,QAAQ8rD,YAAc,CAAC,EACtC6e,EAASxrE,KAAKW,SAAS4Q,aAAa,2BACpCk6D,EAAazrE,KAAKW,SAAS4Q,aAAa,+BACxCm6D,EAAa1rE,KAAKW,SAAS4Q,aAAa,mCACxCo6D,EAAgB3rE,KAAKW,SAAS4Q,aAAa,6BAEjD,MAAO,CACNpR,QAAQ,EACRysD,OAAQpmD,OAAkB,OAAXglE,EAAkBA,EAAS7lE,EAAQinD,QAAU,kBAAkBnmD,QAAU,iBACxFomD,WAAYrmD,OAAsB,OAAfilE,EAAsBA,EAAa9lE,EAAQknD,YAAc,yBAAyBpmD,QAAU,wBAC/GqmD,eAAgBtmD,OAAsB,OAAfklE,EAAsBA,EAAa/lE,EAAQmnD,gBAAkB,wBAAwBrmD,QAAU,uBACtHsmD,UAA6B,OAAlB4e,EAAyB3rE,KAAKi7C,UAAU0wB,GAAiB5zD,QAAQpS,EAAQonD,WAEtF,CAGAme,sBAAAA,GACC,MAAMvlE,EAAU3F,KAAKa,QAAQ2rD,cAAgB,CAAC,EACxCtjC,EAAOlpB,KAAKW,SAAS4Q,aAAa,6BACxC,OAAa,OAAT2X,EACIlpB,KAAKi7C,UAAU/xB,GAEhBnR,QAAQpS,EAAQxF,OACxB,CAEAgrE,wBAAAA,GACiBnrE,KAAKq5C,kBACbj3C,SAASke,IAChB,IAAKA,EAAO/Y,cAAc,4BAA6B,CACtD,MAAMuG,EAAST,SAAS2K,cAAc,QACtClK,EAAOgV,UAAY,yBACnBhV,EAAO4B,aAAa,yBAA0B,KAC9C5B,EAAO4B,aAAa,OAAQ,aAC5B5B,EAAO4B,aAAa,cAAe,QACnC4Q,EAAOgK,YAAYxc,EACpB,CACAwS,EAAO5Q,aAAa,kBAAmB,IAAI,GAE7C,CAEA07D,iBAAAA,GACC,GAAIprE,KAAK4hE,mBAAmBC,MAC3B,OAED,MAAMjpD,EAAQ5Y,KAAK4hE,mBAEnBhpD,EAAMgzD,YAAet+D,IACpB,MAAMQ,EAASR,EAAMhJ,QAAUgJ,EAAMhJ,OAAOqJ,QAAUL,EAAMhJ,OAAOqJ,QAAQ,4BAA8B,KACzG,IAAKG,EACJ,OAED,MAAMwS,EAASxS,EAAOH,QAAQ,MACxBuU,EAAQliB,KAAK6rE,iBAAiBvrD,GAChC4B,EAAQ,IAGZ5U,EAAME,iBACNoL,EAAM8d,QAAS,EACf9d,EAAMsJ,MAAQA,EACdtJ,EAAMo4B,OAAS1jC,EAAM2I,QACrB2C,EAAMkpD,WAAa3sD,KAAKC,IAAI,EAAGkL,EAAOhQ,wBAAwBmE,OAAS6L,EAAO5L,aAAe,GAC7F1U,KAAKW,SAASQ,UAAUC,IAAI,mBAAkB,EAG/CwX,EAAMkzD,YAAex+D,IACpB,IAAKsL,EAAM8d,QAAU9d,EAAMsJ,MAAQ,EAClC,OAED,MAAMvc,EAAU3F,KAAKa,QAAQ2rD,cAAgB,CAAC,EACxCzzC,EAAW5D,KAAKC,IAAI,GAAIpV,KAAK88C,sBAAsBn3C,EAAQomE,SAAU,KACrEvwD,EAAWrG,KAAKC,IAAI2D,EAAU/Y,KAAK88C,sBAAsBn3C,EAAQqmE,SAAU,MACjFpzD,EAAMmpD,UAAY5sD,KAAKO,IAAI8F,EAAUrG,KAAKC,IAAI2D,EAAU5D,KAAK2D,MAAMF,EAAMkpD,YAAcx0D,EAAM2I,QAAU2C,EAAMo4B,WACzGp4B,EAAMlB,QAGY,oBAAXrC,QAAkE,mBAAjCA,OAAOpF,sBAInD2I,EAAMlB,MAAQrC,OAAOpF,uBAAsB,KAC1C2I,EAAMlB,MAAQ,GACTkB,EAAM8d,QAAU9d,EAAMsJ,MAAQ,GAGnCliB,KAAKisE,kBAAkBrzD,EAAMsJ,MAAOtJ,EAAMmpD,UAAU,IARpD/hE,KAAKisE,kBAAkBrzD,EAAMsJ,MAAOtJ,EAAMmpD,WASzC,EAGHnpD,EAAMszD,UAAY,KACZtzD,EAAM8d,SAGP9d,EAAMlB,OAA2B,oBAAXrC,QAAiE,mBAAhCA,OAAO8G,uBACjE9G,OAAO8G,qBAAqBvD,EAAMlB,OAClCkB,EAAMlB,MAAQ,GAEXkB,EAAMsJ,OAAS,GAAKtJ,EAAMmpD,UAAY,GACzC/hE,KAAKisE,kBAAkBrzD,EAAMsJ,MAAOtJ,EAAMmpD,WAE3CnpD,EAAM8d,QAAS,EACf9d,EAAMsJ,OAAS,EACftJ,EAAMmpD,UAAY,EAClB/hE,KAAKW,SAASQ,UAAUG,OAAO,mBAC/BtB,KAAKm5C,+BACLn5C,KAAKwtC,YAAY,eAAgB,CAAC,GAAE,EAGrCxtC,KAAKW,SAASiP,iBAAiB,YAAagJ,EAAMgzD,aAClDv+D,SAASuC,iBAAiB,YAAagJ,EAAMkzD,aAC7Cz+D,SAASuC,iBAAiB,UAAWgJ,EAAMszD,WAC3CtzD,EAAMipD,OAAQ,CACf,CAEAoK,iBAAAA,CAAkB/pD,EAAOiqD,GACxB,MAAM1/B,EAAW,GACbzsC,KAAKW,SAASsoC,OACjBwD,EAAS90B,KAAK3X,KAAKW,SAASsoC,OAEzBjpC,KAAKW,SAAS+rC,SAAW1sC,KAAKW,SAAS+rC,QAAQt+B,QAClDq+B,EAAS90B,QAAQvG,MAAMC,KAAKrR,KAAKW,SAAS+rC,UAEvC1sC,KAAKW,SAASgsC,OACjBF,EAAS90B,KAAK3X,KAAKW,SAASgsC,OAG7BF,EAASrqC,SAASwqC,IACjBx7B,MAAMC,KAAKu7B,EAAQxgB,MAAQ,IAAIhqB,SAASqqB,IACvC,MAAME,EAAOF,EAAIC,OAASD,EAAIC,MAAMxK,GAASuK,EAAIC,MAAMxK,GAAS,KAC3DyK,IAGLA,EAAK5Y,MAAMU,MAAQ,GAAG03D,MACtBx/C,EAAK5Y,MAAMgF,SAAW,GAAGozD,MACzBx/C,EAAK5Y,MAAMyH,SAAW,GAAG2wD,MAAW,GACnC,GAEJ,CAEArB,uBAAAA,GACC,MAAMnlE,EAAU3F,KAAKa,QAAQ0rD,eAAiB,CAAC,EACzCrjC,EAAOlpB,KAAKW,SAAS4Q,aAAa,8BACxC,GAAa,OAAT2X,EAAe,CAClB,MAAMjG,EAAazc,OAAO0iB,GAAM1jB,cAAciB,OAC9C,MAAsB,UAAfwc,GAAyC,MAAfA,CAClC,CACA,OAAOlL,QAAQpS,EAAQxF,OACxB,CAEAisE,8BAAAA,GACC,MAAMzmE,EAAU3F,KAAKa,QAAQ0rD,eAAiB,CAAC,EACzCrjC,EAAOlpB,KAAKW,SAAS4Q,aAAa,+BACxC,GAAa,OAAT2X,EAAe,CAClB,MAAMjG,EAAazc,OAAO0iB,GAAM1jB,cAAciB,OAC9C,MAAsB,UAAfwc,GAAyC,MAAfA,CAClC,CACA,OAAOlL,QAAQpS,EAAQslD,QACxB,CAEAohB,2BAAAA,GACC,MAAM1mE,EAAU3F,KAAKa,QAAQ0rD,eAAiB,CAAC,EACzC+f,EAAiBtsE,KAAKW,SAAS4Q,aAAa,oCAAsC,GAExF,OADiB/K,OAAOb,EAAQ+4B,YAAc4tC,GAAgB7lE,QAIvD,GAAGzG,KAAK8yC,qCAChB,CAEAm4B,kBAAAA,GACKjrE,KAAKwhE,oBAAoBK,QAI7B7hE,KAAKwhE,oBAAoB+K,YAAej/D,IACvC,MAAMk/D,EAAKl/D,EAAMhJ,QAAUgJ,EAAMhJ,OAAOqJ,QAAUL,EAAMhJ,OAAOqJ,QAAQ,4BAA8B,KACrG,IAAK6+D,IAAOxsE,KAAKW,SAASU,SAASmrE,GAClC,OAED,GAAIxsE,KAAKysE,+BAA+BD,GACvC,OAGD,MAAM/K,EAAYzhE,KAAK6rE,iBAAiBW,GACxC,KAAI/K,EAAY,KAIhBzhE,KAAKwhE,oBAAoBC,UAAYA,EACrCzhE,KAAKwhE,oBAAoBE,QAAUD,EACnCzhE,KAAKwhE,oBAAoBG,YAAa,EACtC3hE,KAAKW,SAASQ,UAAUC,IAAI,mBAC5BorE,EAAG98D,aAAa,oBAAqB,KAEjCpC,EAAMyC,cAAc,CACvBzC,EAAMyC,aAAaC,cAAgB,OACnC,IACC1C,EAAMyC,aAAanM,QAAQ,aAAc4C,OAAOi7D,GACjD,CAAE,MAAOryD,GACR,CAEF,GAGDpP,KAAKwhE,oBAAoBkL,WAAcp/D,IACtC,IAAKtN,KAAKwhE,oBAAoBG,WAC7B,OAED,MAAM6K,EAAKl/D,EAAMhJ,QAAUgJ,EAAMhJ,OAAOqJ,QAAUL,EAAMhJ,OAAOqJ,QAAQ,4BAA8B,KACrG,IAAK6+D,IAAOxsE,KAAKW,SAASU,SAASmrE,GAClC,OAED,GAAIxsE,KAAKysE,+BAA+BD,GACvC,OAEDl/D,EAAME,iBACN,MAAMk0D,EAAU1hE,KAAK6rE,iBAAiBW,GAClC9K,EAAU,IAGd1hE,KAAKwhE,oBAAoBE,QAAUA,EACnC1hE,KAAK2sE,0BAA0BjL,GAAQ,EAGxC1hE,KAAKwhE,oBAAoBoL,OAAUt/D,IAClC,IAAKtN,KAAKwhE,oBAAoBG,WAC7B,OAEDr0D,EAAME,iBACN,MAAMg/D,EAAKl/D,EAAMhJ,QAAUgJ,EAAMhJ,OAAOqJ,QAAUL,EAAMhJ,OAAOqJ,QAAQ,4BAA8B,KACrG,IAAK6+D,IAAOxsE,KAAKW,SAASU,SAASmrE,GAClC,OAED,GAAIxsE,KAAKysE,+BAA+BD,GAEvC,YADAxsE,KAAK6sE,0BAGN,MAAMnL,EAAU1hE,KAAK6rE,iBAAiBW,GACtC,GAAI9K,EAAU,EACb,OAGD,MAAMD,EAAYzhE,KAAKwhE,oBAAoBC,UAC3CzhE,KAAK6sE,0BACL7sE,KAAK8sE,uBAAuBrL,EAAWC,EAAQ,EAGhD1hE,KAAKwhE,oBAAoBuL,UAAY,KACpC/sE,KAAK6sE,yBAAyB,EAG/B7sE,KAAKW,SAASiP,iBAAiB,YAAa5P,KAAKwhE,oBAAoB+K,aACrEvsE,KAAKW,SAASiP,iBAAiB,WAAY5P,KAAKwhE,oBAAoBkL,YACpE1sE,KAAKW,SAASiP,iBAAiB,OAAQ5P,KAAKwhE,oBAAoBoL,QAChE5sE,KAAKW,SAASiP,iBAAiB,UAAW5P,KAAKwhE,oBAAoBuL,WACnE/sE,KAAKwhE,oBAAoBK,OAAQ,EAClC,CAEAmJ,yBAAAA,GACMhrE,KAAKwhE,oBAAoB/yB,SAGdzuC,KAAKq5C,kBACbj3C,SAASke,IAChBA,EAAO5Q,aAAa,mBAAoB,KACxC,MAAMs9D,EAAYhtE,KAAKysE,+BAA+BnsD,GAAU,QAAU,OAC1EA,EAAO5Q,aAAa,YAAas9D,EAAU,GAE7C,CAEAL,yBAAAA,CAA0BzqD,GACTliB,KAAKq5C,kBACbj3C,SAAQ,CAACke,EAAQ23C,KACpBA,IAAgB/1C,EACnB5B,EAAO5Q,aAAa,qBAAsB,KAE1C4Q,EAAO6R,gBAAgB,qBACxB,KAEoBnyB,KAAK8qC,mBAAqB9qC,KAAK8qC,kBAAkBssB,KACnEhmD,MAAMC,KAAKrR,KAAK8qC,kBAAkBssB,KAAK5nD,iBAAiB,OACxD,IACUpN,SAAQ,CAACke,EAAQ23C,KACzBA,IAAgB/1C,EACnB5B,EAAO5Q,aAAa,qBAAsB,KAE1C4Q,EAAO6R,gBAAgB,qBACxB,GAEF,CAEA06C,uBAAAA,GACiB7sE,KAAKq5C,kBACbj3C,SAASke,IAChBA,EAAO6R,gBAAgB,sBACvB7R,EAAO6R,gBAAgB,oBAAoB,KAEvBnyB,KAAK8qC,mBAAqB9qC,KAAK8qC,kBAAkBssB,KACnEhmD,MAAMC,KAAKrR,KAAK8qC,kBAAkBssB,KAAK5nD,iBAAiB,OACxD,IACUpN,SAASke,IACrBA,EAAO6R,gBAAgB,sBACvB7R,EAAO6R,gBAAgB,oBAAoB,IAE5CnyB,KAAKwhE,oBAAoBC,WAAa,EACtCzhE,KAAKwhE,oBAAoBE,SAAW,EACpC1hE,KAAKwhE,oBAAoBG,YAAa,EACtC3hE,KAAKW,SAASQ,UAAUG,OAAO,kBAChC,CAEAwrE,sBAAAA,CAAuBrL,EAAWC,IAC5B7sD,OAAOw0B,UAAUo4B,KAAe5sD,OAAOw0B,UAAUq4B,IAAYD,EAAY,GAAKC,EAAU,GAAKD,IAAcC,IAIhH1hE,KAAK6kE,YAAYpD,EAAWC,GAC5B1hE,KAAKitE,8BACLjtE,KAAKklE,sBACN,CAEAL,WAAAA,CAAYpD,EAAWC,GACtB,MAAMj1B,EAAW,GACbzsC,KAAKW,SAASsoC,OACjBwD,EAAS90B,KAAK3X,KAAKW,SAASsoC,OAEzBjpC,KAAKW,SAAS+rC,SAAW1sC,KAAKW,SAAS+rC,QAAQt+B,QAClDq+B,EAAS90B,QAAQvG,MAAMC,KAAKrR,KAAKW,SAAS+rC,UAEvC1sC,KAAKW,SAASgsC,OACjBF,EAAS90B,KAAK3X,KAAKW,SAASgsC,OAG7BF,EAASrqC,SAASwqC,IACjBx7B,MAAMC,KAAKu7B,EAAQxgB,MAAQ,IAAIhqB,SAASqqB,IACvC,MAAMC,EAAQtb,MAAMC,KAAKob,EAAIC,OAAS,IACtC,GAAI+0C,EAAY,GAAKA,GAAa/0C,EAAMte,QAAUszD,EAAU,GAAKA,GAAWh1C,EAAMte,OACjF,OAED,MAAM8+D,EAAaxgD,EAAM+0C,GACnB0L,EAAgB1L,EAAYC,EAAUh1C,EAAMg1C,GAAS9wD,YAAc8b,EAAMg1C,GAC/Ej1C,EAAI9b,aAAau8D,EAAYC,GAAiB,KAAK,GAClD,GAEJ,CAEAjI,mBAAAA,GACCllE,KAAK+2C,QAAU/2C,KAAKgmE,aAEpB,MAAMoH,EAAkBptE,KAAKo/C,oBAAoBp/C,KAAKu9C,WAAWK,OAAS,IACpEyvB,EAAcD,EAAgB,IAAM,KAC1CptE,KAAKu9C,WAAa,CACjBvR,MAAOqhC,EAAcA,EAAYrhC,MAAQ,GACzC/U,IAAKo2C,EAAcA,EAAYp2C,IAAMj3B,KAAK29C,kBAAkB39C,KAAKu9C,WAAWtmB,KAC5EgX,YAAao/B,EAAcA,EAAYp/B,aAAe,EACtD2P,MAAOwvB,GAGJptE,KAAK69C,WAA+C,mBAA3B79C,KAAK69C,UAAUsZ,SAC3Cn3D,KAAK69C,UAAUsZ,QAAQ,CAAEvZ,MAAOwvB,IAGjCptE,KAAKgrE,4BACLhrE,KAAKm5C,+BACLn5C,KAAKi+C,gBACLj+C,KAAKstE,oBACL,MAAMC,EAAQvtE,KAAKokE,yBACnBpkE,KAAKwtC,YAAY,gBAAiB,CAAE+/B,SACrC,CAEAnJ,sBAAAA,GACC,OAAOpkE,KAAKq5C,kBACV/qC,KAAKgS,GAAW9Z,OAAO8Z,EAAO/O,aAAa,eAAiB,IAAI9K,SAChExE,OAAO8V,QACV,CAEAu1D,iBAAAA,GACC,IAAKttE,KAAKosE,iCACT,OAED,MAAMmB,EAAQvtE,KAAKokE,yBACnB,GAAKmJ,EAAMn/D,OAGX,IACCiH,OAAOspB,aAAaC,QAAQ5+B,KAAKqsE,8BAA+BkB,EAAM/pD,KAAK,KAC5E,CAAE,MAAOpU,GACR,CAEF,CAEAo+D,sBAAAA,GACC,IAAKxtE,KAAKosE,iCACT,MAAO,GAER,IACC,MAAMrjC,EAAMviC,OAAO6O,OAAOspB,aAAaG,QAAQ9+B,KAAKqsE,gCAAkC,IAAI5lE,OAC1F,OAAKsiC,EAGEA,EAAIv9B,MAAM,KAAK8C,KAAKwB,GAASA,EAAKrJ,SAAQxE,OAAO8V,SAFhD,EAGT,CAAE,MAAO3I,GACR,MAAO,EACR,CACD,CAEA27D,uBAAAA,GACC,MAAMwC,EAAQvtE,KAAKwtE,yBACnB,IAAKD,EAAMn/D,OACV,OAGD,IAAI4jD,GAAU,EACdub,EAAMnrE,SAAQ,CAAC4pC,EAAO04B,KACrB,MAAMC,EAAe3kE,KAAK4kE,wBAAwB54B,GAC9C24B,EAAe,GAAKA,IAAiBD,IAGzC1kE,KAAK6kE,YAAYF,EAAcD,GAC/B1S,GAAU,EAAI,IAEXhyD,KAAKitE,gCACRjb,GAAU,GAGPA,GACHhyD,KAAKklE,qBAEP,CAEAuH,8BAAAA,CAA+BnsD,GAC9B,IAAKA,EACJ,OAAO,EAER,MAAMmtD,EAAYjnE,OAAO8Z,EAAO/O,aAAa,oBAAsB,IAAI/L,cAAciB,OACrF,GAAkB,SAAdgnE,GAAsC,UAAdA,EAC3B,OAAO,EAER,MAAMvkC,EAAY1iC,OAAO8Z,EAAO/O,aAAa,eAAiB,IAAI/L,cAAciB,OAC1E0iC,EAAkB3iC,OAAO8Z,EAAO/O,aAAa,sBAAwB,IAAI/L,cAAciB,OAC7F,GAAkB,SAAdyiC,GAAsC,UAAdA,GAA6C,SAApBC,GAAkD,UAApBA,EAClF,OAAO,EAER,MAAMjnB,EAAQliB,KAAK6rE,iBAAiBvrD,GACpC,GAAI4B,EAAQ,EACX,OAAO,EAER,MAAM0mB,EAAQ5oC,KAAKiqC,0BAA0BjqC,KAAKq5C,kBAAmB,CACpEnP,gBAAgB,EAChBC,oBAAoB,IAErB,OAAOvB,EAAM7zB,KAAKrJ,SAASwW,IAAU0mB,EAAM7sB,MAAMrQ,SAASwW,EAC3D,CAEA+qD,2BAAAA,GACC,MAAMrmE,EAAU5G,KAAKq5C,kBACrB,IAAKzyC,EAAQwH,OACZ,OAAO,EAGR,MAAMw6B,EAAQ5oC,KAAKiqC,0BAA0BrjC,EAAS,CACrDsjC,gBAAgB,EAChBC,oBAAoB,IAErB,IAAKvB,EAAM7zB,KAAK3G,SAAWw6B,EAAM7sB,MAAM3N,OACtC,OAAO,EAGR,MAAMs/D,EAAc9kC,EAAM7zB,KAAKzG,KAAK4T,GAAUtb,EAAQsb,KAAQjgB,OAAO8V,SAC/D41D,EAAe/kC,EAAM7sB,MAAMzN,KAAK4T,GAAUtb,EAAQsb,KAAQjgB,OAAO8V,SACvE,IAAIi6C,GAAU,EACV4b,EAAa,EACjBF,EAAYtrE,SAASke,IACpB,MAAMqkD,EAAe3kE,KAAK6rE,iBAAiBvrD,GACvCqkD,GAAgB,GAAKA,IAAiBiJ,IACzC5tE,KAAK6kE,YAAYF,EAAciJ,GAC/B5b,GAAU,GAEX4b,GAAc,CAAC,IAGhB,IAAIC,EAAc7tE,KAAKq5C,kBAAkBjrC,OAAS,EAClD,IAAK,IAAI8T,EAAQyrD,EAAav/D,OAAS,EAAG8T,GAAS,EAAGA,GAAS,EAAG,CACjE,MAAM5B,EAASqtD,EAAazrD,GACtByiD,EAAe3kE,KAAK6rE,iBAAiBvrD,GACvCqkD,GAAgB,GAAKA,IAAiBkJ,IACzC7tE,KAAK6kE,YAAYF,EAAckJ,GAC/B7b,GAAU,GAEX6b,GAAe,CAChB,CAEA,OAAO7b,CACR,CAEAsU,WAAAA,GACC,IAAKtmE,KAAKs0C,UACT,OAGD,MAAMiT,EAAgBvnD,KAAKa,QAAQ28B,QAAU,CAAC,EAC9C,IAAKx9B,KAAK8tE,mBACT,OAGD,MAAM1S,EAAgBp7D,KAAKomD,0BAC3B,IAAKgV,EACJ,OAGD,MAAM5T,EAAYxnD,KAAKW,SAAS4Q,aAAa,sBAAwB,GAC/D6jC,EAAQ5uC,OAAO+gD,EAAcnS,OAASoS,GAAa,KAAK/gD,QAAU,IACxE,GAAIrD,OAAO+E,UAAUhE,eAAeiE,KAAKpI,KAAKi1C,cAAeG,GAAQ,CACpE,MAAM9pB,EAAQtrB,KAAKqmD,oBAAoB+U,GACnC9vC,GAASA,EAAMpnB,QAAUlE,KAAKi1C,cAAcG,KAC/C9pB,EAAMpnB,MAAQlE,KAAKi1C,cAAcG,GAEnC,CAEIp1C,KAAKghE,SAA2C,mBAAzBhhE,KAAKghE,QAAQvvD,SACvCzR,KAAKghE,QAAQvvD,UAGdzR,KAAKghE,QAAU,IAAI+M,GAAO,CACzBt/B,SAAS,EACT0sB,WAAY5T,EAAc4F,SAC1BiO,gBACAhmB,QACAoa,SAAUA,EAAGtrD,QAAOkxC,MAAON,MAC1B,MAAMphB,EAAO,CAAC,EACdA,EAAKohB,GAAe5wC,EACpB,MAAMq6C,EAAev+C,KAAKguE,+BACpBrgB,EAAkB3tD,KAAKy+C,mCACvBG,EAAa5+C,KAAKiuE,iBAAiB/pE,GACzClE,KAAKwtC,YAAY,SAAU,CAC1B4H,MAAON,EACP5wC,UAEIlE,KAAKs0C,WAAcqZ,GACvB3tD,KAAKwtC,YAAY,gBAAiB,CACjCkI,QAAStyC,OAAO6C,OAAO,CAAC,EAAGs4C,EAAa7I,SAAW,CAAC,GACpD3yC,OAAQK,OAAO6C,OAAO,CAAC,EAAGs4C,EAAax7C,QAAU,CAAC,GAClD44B,OAAQvqB,MAAMiP,QAAQk+B,EAAa5iB,QAAU4iB,EAAa5iB,OAAO9Z,QAAU,GAC3EyD,KAAMliB,OAAO6C,OAAO,CAAC,EAAGs4C,EAAaj5B,MAAQ,CAAC,GAC9C4oB,MAAO,SACP4Q,WAAY9+C,KAAK++C,iBAAiBR,IAAiBK,EACnDA,eAGF5+C,KAAK6iE,mBAAmBnvC,EAAM,CAC7BtL,SAAS,EACT86C,WAAW,EACXF,QAAQ,EACRhiD,QAAS2sC,EAAkB,gBAAkB,GAC7CpP,aAAcoP,EAAkBpP,EAAe,MAC9C,IAGJv+C,KAAKghE,QAAQ94D,MACd,CAEAk+C,uBAAAA,GACC,MAAMmB,EAAgBvnD,KAAKa,QAAQ28B,QAAU,CAAC,EACxCqqB,EAAe7nD,KAAKW,SAAS4Q,aAAa,sBAAwB,GACxE,OAAO/K,OAAO+gD,EAAcj8B,OAASu8B,GAAcphD,MACpD,CAEA4/C,mBAAAA,CAAoBz0C,EAAW,IAC9B,MAAMs8D,EAAe1nE,OAAOoL,GAAY5R,KAAKomD,2BAA6B,IAAI3/C,OAC9E,OAAKynE,IAKiBluE,KAAKshE,4BAA8B4M,IACpDluE,KAAKuhE,wBACLvhE,KAAKuhE,sBAAsB5xB,eAE/B3vC,KAAKshE,0BAA4B4M,EACjCluE,KAAKuhE,sBAAwBl0D,SAAS9F,cAAc2mE,IAE9CluE,KAAKuhE,wBAXXvhE,KAAKshE,0BAA4B,GACjCthE,KAAKuhE,sBAAwB,KACtB,KAUT,CAEAgC,YAAAA,GACC,MAAM3b,EAAgB5nD,KAAKa,QAAQ60C,SAAW,CAAC,EAC/C,IAAK11C,KAAKmuE,oBACT,OAGD,MAAMxS,EAAW/T,EAAcr8B,MAAwC,IAAhCq8B,EAAcr8B,KAAK9C,SACvDm/B,EAAcr8B,KACd,KACGs8B,EAAe7nD,KAAKW,SAAS4Q,aAAa,sBAAwB,GAClEmqD,EAAeC,EAClB,GAC+B,iBAAvB/T,EAAcr8B,KACrB/kB,OAAOohD,EAAcr8B,MAAM9kB,OAC3BD,OAAOqhD,GAAcphD,OACzB,IAAKk1D,IAAaD,EACjB,OAED,MAAM0S,EAAgBpuE,KAAKW,SAAS4Q,aAAa,uBAAyB,GACpEqqD,EAAY57D,KAAKsjE,2BAA2B1b,EAAcr3B,OAAS69C,GAAiB,QAC1FpuE,KAAKojE,sBAAsB,mBAAoBxH,GAC/C,MAAME,EAAgB97D,KAAKwmD,0BACrBl/C,EAASsgD,EAActgD,QAA0C,iBAAzBsgD,EAActgD,OACzDsgD,EAActgD,OACd,CAAC,EAEAtH,KAAKsmD,UAA6C,mBAA1BtmD,KAAKsmD,SAAS70C,SACzCzR,KAAKsmD,SAAS70C,UAGfzR,KAAKsmD,SAAW,IAAI+nB,GAAQ,CAC3B5/B,SAAS,EACTitB,eACAC,WACAR,WAAYvT,EAAcuF,SAC1ByO,YACAt0D,OAAQ,CACPipB,MAAO/pB,OACNc,EAAOipB,OACJvwB,KAAKW,SAAS4Q,aAAa,8BAC3B,uBACF9K,OACFgzB,MAAOjzB,OACNc,EAAOmyB,OACJz5B,KAAKW,SAAS4Q,aAAa,8BAC3B,uBACF9K,QAEHkvC,UAAWiS,EAAcjS,UACzBC,SAAUgS,EAAchS,SACxBwX,SAAUxF,EAAcwF,SACxBC,UAAWzF,EAAcyF,UACzBC,aAAc1F,EAAc0F,aAC5BC,gBAAiB3F,EAAc2F,gBAC/BE,UAAW7F,EAAc6F,UACzBC,WAAY9F,EAAc8F,WAC1BoO,gBACApM,QAASA,KACR,MAAMvJ,EAAiBnmD,KAAKomD,0BAC5B,IAAKD,EACJ,OAED,MAAMwD,EAAc3pD,KAAKqmD,oBAAoBF,GACzCwD,IACHA,EAAYzlD,MAAQ,IAErB,MAAM4wC,EAAc90C,KAAK+0C,sBACpBD,UAGE90C,KAAKi1C,cAAcH,EAAY,EAEvCiX,SAAWnzC,IACV,MAAM01D,EAAkBtuE,KAAKw+C,4BAA4B5lC,GACzD5Y,KAAKq/C,eAAiBj8C,OAAO6C,OAAO,CAAC,EAAGqoE,EAAgB54B,SAAW,CAAC,GAC/D11C,KAAKs0C,WAAct0C,KAAKy+C,oCAC5Bz+C,KAAKwtC,YAAY,gBAAiB,CACjCkI,QAAStyC,OAAO6C,OAAO,CAAC,EAAGqoE,EAAgB54B,SAAW,CAAC,GACvD3yC,OAAQK,OAAO6C,OAAO,CAAC,EAAGqoE,EAAgBvrE,QAAU,CAAC,GACrD44B,OAAQvqB,MAAMiP,QAAQiuD,EAAgB3yC,QAAU2yC,EAAgB3yC,OAAO9Z,QAAU,GACjFyD,KAAMliB,OAAO6C,OAAO,CAAC,EAAGqoE,EAAgBhpD,MAAQ,CAAC,GACjD4oB,MAAO,SACP4Q,WAAY9+C,KAAK++C,iBAAiBuvB,IAAoBtuE,KAAK6+C,0BAA0B7+C,KAAKi1C,eAAiB,CAAC,GAC5G2J,WAAY5+C,KAAK6+C,0BAA0B7+C,KAAKi1C,eAAiB,CAAC,KAGpEj1C,KAAKuuE,0BAA0BD,EAAgB,IAGjDtuE,KAAKsmD,SAASp+C,MACf,CAEAqmE,yBAAAA,CAA0B31D,GACzB,MAAM41D,EAAgB51D,GAASA,EAAM7V,QAAkC,iBAAjB6V,EAAM7V,OACzD6V,EAAM7V,OACN,CAAC,EACE2jD,EAAa1mD,KAAKyuE,8BAA8BD,GAChD5mB,EAAgB5nD,KAAKa,QAAQ60C,SAAW,CAAC,EACzCwtB,OAAgDn8D,IAApC6gD,EAAc4F,mBAE7Bz1C,QAAQ6vC,EAAc4F,mBAEzB,GAAIxtD,KAAKs0C,UAAT,CACC,MAAMqZ,EAAkB3tD,KAAKy+C,mCAC7Bz+C,KAAK6iE,mBAAmBnc,EAAY,CACnCt+B,SAAS,EACT86C,YACAF,QAAQ,EACRhiD,QAAS2sC,EAAkB,gBAAkB,GAC7CpP,aAAcoP,EAAkB3tD,KAAKw+C,4BAA4B5lC,GAAS,MAG5E,KAVA,CAcA,GAFA5Y,KAAKi1C,cAAgB7xC,OAAO6C,OAAO,CAAC,EAAGygD,GACvC1mD,KAAK0uE,qBACD1uE,KAAK+kD,wBAA0B/kD,KAAK+9C,YAAa,CACpD,MAAM5D,EAAUn6C,KAAKk6C,WAAWC,SAAWn6C,KAAK88C,sBAAsB98C,KAAKa,QAAQu5C,WAAWD,QAAS,IACjG0C,EAAWqmB,EAAY,EAAIljE,KAAKk6C,WAAW6C,KAC3CG,EAAal9C,KAAKglE,eAAe7qB,GACjC8B,EAAW9mC,KAAKC,IAAI,EAAGD,KAAKO,IAAImnC,EAAUK,IAChDl9C,KAAKk6C,WAAa,CAAE6C,KAAMd,EAAU9B,WACpCn6C,KAAK+9C,YAAYC,QAAQ,CACxBjB,KAAMd,EACN9B,UACA+C,eAEDl9C,KAAKilE,gBAAgBhpB,EAAU9B,EAChC,KAAO,CACN,MAAM4C,EAAO/8C,KAAKk6C,WAAW6C,MAAQ,EAC/B5C,EAAUn6C,KAAKk6C,WAAWC,SAAWn6C,KAAK88C,sBAAsB98C,KAAKa,QAAQu5C,WAAWD,QAAS,IACvGn6C,KAAKilE,gBAAgBloB,EAAM5C,EAC5B,CACAn6C,KAAKm5C,+BACLn5C,KAAKi+C,eAtBL,CAuBD,CAEAwwB,6BAAAA,CAA8BE,EAAmB,CAAC,GACjD,MAAMpoE,EAASooE,GAAgD,iBAArBA,EACvCA,EACA,CAAC,EACEnnD,EAAQ,CAAC,EA6Bf,OA5BaxnB,KAAKwiD,sBAEbpgD,SAAS4pC,IACb,MAAM4W,EAAkBp8C,OAAOwlC,GAAS,IAAIvlC,OAC5C,IAAKm8C,EACJ,OAGGx/C,OAAO+E,UAAUhE,eAAeiE,KAAK7B,EAAQq8C,GAChDp7B,EAAMo7B,GAAmBr8C,EAAOq8C,GAEhCp7B,EAAMo7B,GAAmB,GAG1B,MAAMG,EAAc,GAAGH,OACnBx/C,OAAO+E,UAAUhE,eAAeiE,KAAK7B,EAAQw8C,GAChDv7B,EAAMu7B,GAAex8C,EAAOw8C,GAE5Bv7B,EAAMu7B,GAAe,EACtB,IAGD3/C,OAAOwgB,KAAKrd,GAAQnE,SAAS3B,IACvB2C,OAAO+E,UAAUhE,eAAeiE,KAAKof,EAAO/mB,KAChD+mB,EAAM/mB,GAAO8F,EAAO9F,GACrB,IAGM+mB,CACR,CAEAg3B,2BAAAA,CAA4B5lC,GAC3B,MAAMrS,EAASqS,GAA0B,iBAAVA,EAAqBA,EAAQ,CAAC,EACvD88B,EAAUnvC,EAAOmvC,SAAqC,iBAAnBnvC,EAAOmvC,QAC7CtyC,OAAO6C,OAAO,CAAC,EAAGM,EAAOmvC,SACzB,CAAC,EACE3yC,EAASwD,EAAOxD,QAAmC,iBAAlBwD,EAAOxD,OAC3CK,OAAO6C,OAAO,CAAC,EAAGM,EAAOxD,QACzB,CAAC,EACE6rE,EAAiBx9D,MAAMiP,QAAQ9Z,EAAOo1B,QACzCp1B,EAAOo1B,OAAO9Z,QAAQvT,KAAK09B,GAAUxlC,OAAOwlC,GAAS,IAAIvlC,SAAQxE,OAAO8V,SACxE3U,OAAOwgB,KAAK8xB,GACTm5B,EAAqBzrE,OAAOwgB,KAAK7gB,GACrCuL,KAAK7N,GAAQ+F,OAAO/F,GAAO,IAAIgG,SAC/BxE,QAAQxB,GAAgB,KAARA,IAAe,QAAQ62B,KAAK72B,KAC5CwB,QAAQxB,GAAQT,KAAK8uE,4BAA4B/rE,EAAOtC,MACxD6N,KAAK7N,GAAQA,EAAI2nB,QAAQ,WAAY,MACjCuT,EAASvqB,MAAMC,KAAK,IAAIN,IAAI69D,EAAe95C,OAAO+5C,KAClDvpD,EAAO/e,EAAO+e,MAA+B,iBAAhB/e,EAAO+e,KACvCliB,OAAO6C,OAAO,CAAC,EAAGM,EAAO+e,MACzB,CAAC,EAIJ,OAHKliB,OAAO+E,UAAUhE,eAAeiE,KAAKkd,EAAM,WAC/CA,EAAKu4C,MAAQliC,EAAOvtB,QAEd,CACNsnC,UACA3yC,SACA44B,SACArW,OAEF,CAEAm5B,gCAAAA,GACC,MAAM/I,EAAU11C,KAAKa,QAAQ60C,SAAW,CAAC,EACnCxsB,EAAOlpB,KAAKW,SAAS4Q,aAAa,kCACxC,OAAa,OAAT2X,EACIlpB,KAAKi7C,UAAU/xB,QAESniB,IAA5B2uC,EAAQiY,iBAA6D,OAA5BjY,EAAQiY,iBAG9C51C,QAAQ29B,EAAQiY,gBACxB,CAEA5O,gBAAAA,CAAiBnmC,GAChB,MAAM01D,EAAkBtuE,KAAKw+C,4BAA4B5lC,GACzD,OAAI01D,EAAgB3yC,OAAOvtB,OAAS,GAG7BhL,OAAOwgB,KAAK0qD,EAAgBvrE,QAAU,CAAC,GAC5Ck1B,MAAMx3B,IACN,MAAMsuE,EAAgBvoE,OAAO/F,GAAO,IAAIgG,OACxC,SAAKsoE,GAAiB,QAAQz3C,KAAKy3C,KAG5B/uE,KAAK8uE,4BAA4BR,EAAgBvrE,OAAOgsE,GAAe,GAEjF,CAEAf,4BAAAA,GACC,IAAIp1D,EAAQ,KAMZ,GALI5Y,KAAKsmD,UAA8C,mBAA3BtmD,KAAKsmD,SAASiW,WACzC3jD,EAAQ5Y,KAAKw+C,4BAA4Bx+C,KAAKsmD,SAASiW,YACvDv8D,KAAKq/C,eAAiBj8C,OAAO6C,OAAO,CAAC,EAAG2S,EAAM88B,SAAW,CAAC,KAGtD98B,EAAO,CACX,MAAM7V,EAAS/C,KAAKgvE,qCAAqChvE,KAAKi1C,eAAiB,CAAC,GAChFr8B,EAAQ5Y,KAAKw+C,4BAA4B,CACxC9I,QAAStyC,OAAO6C,OAAO,CAAC,EAAGjG,KAAKq/C,gBAAkB,CAAC,GACnDt8C,UAEF,CAEA,OAAO6V,CACR,CAEAo2D,oCAAAA,CAAqCC,EAAe,CAAC,GACpD,MAAM1oE,EAAS0oE,GAAwC,iBAAjBA,EACnCA,EACA,CAAC,EACEv7C,EAAO,CAAC,EACRw7C,EAAS,IAAIn+D,IAmBnB,OAjBA/Q,KAAKwiD,sBAAsBpgD,SAAS3B,GAAQyuE,EAAO9tE,IAAIX,KACvD2C,OAAOwgB,KAAK5jB,KAAKq/C,gBAAkB,CAAC,GAAGj9C,SAAS3B,GAAQyuE,EAAO9tE,IAAIoF,OAAO/F,GAAO,IAAIgG,UAErFyoE,EAAO9sE,SAAS3B,IACf,MAAMsuE,EAAgBvoE,OAAO/F,GAAO,IAAIgG,OACxC,IAAKsoE,EACJ,OAEG3rE,OAAO+E,UAAUhE,eAAeiE,KAAK7B,EAAQwoE,KAChDr7C,EAAKq7C,GAAiBxoE,EAAOwoE,IAE9B,MAAMhsB,EAAc,GAAGgsB,OACnB3rE,OAAO+E,UAAUhE,eAAeiE,KAAK7B,EAAQw8C,KAChDrvB,EAAKqvB,GAAex8C,EAAOw8C,GAC5B,IAGMrvB,CACR,CAEAwyB,8BAAAA,GACC,MAAM3H,EAAev+C,KAAKguE,+BAC1B,OAAKhuE,KAAK++C,iBAAiBR,GAGpB,CACNv9B,QAAS,gBACTu9B,gBAJO,IAMT,CAEAuwB,2BAAAA,CAA4B5qE,GAC3B,OAAIkN,MAAMiP,QAAQnc,GACVA,EAAM+zB,MAAMnoB,GAAuC,KAA9BtJ,OAAOsJ,GAAQ,IAAIrJ,SAEzCvC,SAAkE,KAAzBsC,OAAOtC,GAAOuC,MAC/D,CAEAwnE,gBAAAA,CAAiB/pE,GAChB,OAAOlE,KAAK8uE,4BAA4B5qE,EACzC,CAEA26C,yBAAAA,CAA0BowB,EAAe,CAAC,GACzC,IAAKjvE,KAAK8tE,mBACT,OAAO,EAER,MAAM/qE,EAASksE,GAAwC,iBAAjBA,EACnCA,EACA,CAAC,EACEn6B,EAAc90C,KAAK+0C,sBACzB,SAAKD,IAAgB1xC,OAAO+E,UAAUhE,eAAeiE,KAAKrF,EAAQ+xC,KAG3D90C,KAAKiuE,iBAAiBlrE,EAAO+xC,GACrC,CAEAg5B,gBAAAA,GACC,MAAMtwC,EAASx9B,KAAKa,QAAQ28B,QAAU,CAAC,EACvC,QAAsBz2B,IAAlBy2B,EAAOr9B,QAA0C,OAAlBq9B,EAAOr9B,OAAiB,CAC1D,MAAM8iB,EAAazc,OAAOg3B,EAAOr9B,QAAQqF,cAAciB,OACvD,MAAmB,SAAfwc,GAAwC,MAAfA,GAGV,UAAfA,GAAyC,MAAfA,GAGvBlL,QAAQylB,EAAOr9B,OACvB,CAEA,MAAM+oB,EAAOlpB,KAAKW,SAAS4Q,aAAa,sBACxC,GAAa,OAAT2X,EAAe,CAClB,MAAMjG,EAAazc,OAAO0iB,GAAM1jB,cAAciB,OAC9C,MAAsB,UAAfwc,GAAyC,MAAfA,CAClC,CAEA,OAAO,CACR,CAEAkrD,iBAAAA,GACC,MAAMz4B,EAAU11C,KAAKa,QAAQ60C,SAAW,CAAC,EACzC,QAAuB3uC,IAAnB2uC,EAAQv1C,QAA2C,OAAnBu1C,EAAQv1C,OAAiB,CAC5D,MAAM8iB,EAAazc,OAAOkvC,EAAQv1C,QAAQqF,cAAciB,OACxD,MAAmB,SAAfwc,GAAwC,MAAfA,GAGV,UAAfA,GAAyC,MAAfA,GAGvBlL,QAAQ29B,EAAQv1C,OACxB,CAEA,MAAM+oB,EAAOlpB,KAAKW,SAAS4Q,aAAa,uBACxC,GAAa,OAAT2X,EAAe,CAClB,MAAMjG,EAAazc,OAAO0iB,GAAM1jB,cAAciB,OAC9C,MAAsB,UAAfwc,GAAyC,MAAfA,CAClC,CAEA,OAAO,CACR,CAEAqgD,0BAAAA,CAA2Bp/D,GAE1B,MAAsB,WADHsC,OAAOtC,GAAS,QAAQsB,cAAciB,OACxB,SAAW,MAC7C,CAEAokE,iBAAAA,CAAkBtmD,GACjB,MAAM6oD,EAAkBptE,KAAKo/C,oBAAoBhuC,MAAMiP,QAAQkE,EAAQq5B,OAASr5B,EAAQq5B,MAAQ,IAC1FyvB,EAAcD,EAAgB,IAAM,KAc1C,GAbAptE,KAAKu9C,WAAa,CACjBvR,MAAOqhC,EAAcA,EAAYrhC,MAASznB,EAAQynB,OAAS,GAC3D/U,IAAKo2C,EAAcA,EAAYp2C,IAAMj3B,KAAK29C,kBAAkBp5B,EAAQ0S,KACpEgX,YAAao/B,GAAex4D,OAAOw0B,UAAUgkC,EAAYp/B,aAAeo/B,EAAYp/B,YAAep5B,OAAOw0B,UAAU9kB,EAAQ0pB,aAAe1pB,EAAQ0pB,aAAe,EAClK2P,MAAOwvB,GAERptE,KAAKwtC,YAAY,aAAc,CAC9BlB,KAAMtsC,KAAKu9C,WAAWvR,MACtB/U,IAAKj3B,KAAKu9C,WAAWtmB,IACrB2mB,MAAO59C,KAAKu9C,WAAWK,MAAM/7B,QAC7B4gD,SAAUziE,KAAKs0C,YAGZt0C,KAAKs0C,UAAW,CACnB,MAAM6F,EAAUn6C,KAAKk6C,WAAWC,SAAWn6C,KAAK88C,sBAAsB98C,KAAKa,QAAQu5C,WAAWD,QAAS,IAGvG,OAFAn6C,KAAKk6C,WAAa,CAAE6C,KAAM,EAAG5C,gBAC7Bn6C,KAAK2gD,gBAAgB,EAAGxG,EAEzB,CAYA,IAVKn6C,KAAKu9C,WAAWK,MAAMxvC,QAAUpO,KAAKu9C,WAAWtP,YAAc,EAClEjuC,KAAKmvE,uBAELnvE,KAAKovE,eAAepvE,KAAKu9C,WAAWK,MAAMxvC,OAASpO,KAAKu9C,WAAWK,MAAQ,CAAC,CAC3E5R,MAAOhsC,KAAKu9C,WAAWvR,MACvB/U,IAAKj3B,KAAKu9C,WAAWtmB,IACrBgX,YAAajuC,KAAKu9C,WAAWtP,eAI3BjuC,KAAK+kD,wBAA0B/kD,KAAK+9C,YAAa,CACpD,MAAM5D,EAAUn6C,KAAKk6C,WAAWC,SAAWn6C,KAAK88C,sBAAsB98C,KAAKa,QAAQu5C,WAAWD,QAAS,IACjG+C,EAAal9C,KAAKglE,eAAe7qB,GACvCn6C,KAAKk6C,WAAa,CAAE6C,KAAM,EAAG5C,WAC7Bn6C,KAAKo9C,WAAW,GAChBp9C,KAAK+9C,YAAYC,QAAQ,CACxBjB,KAAM,EACN5C,UACA+C,eAEDl9C,KAAKilE,gBAAgB,EAAG9qB,EACzB,CACAn6C,KAAKwmE,qBACLxmE,KAAKu2C,gCACLv2C,KAAKm5C,+BACLn5C,KAAKi+C,eACN,CAEAmxB,cAAAA,CAAeC,GACTrvE,KAAK6gE,MAAMzyD,SACfpO,KAAK6gE,MAAQ7gE,KAAKimE,iBAGnB,MAAMmH,EAAkBptE,KAAKo/C,oBAAoBiwB,GACjD,IAAKjC,EAAgBh/D,SAAWpO,KAAK6gE,MAAMzyD,OAC1C,OAGDpO,KAAK6gE,MAAMv0B,MAAK,CAACgjC,EAASC,KACzB,IAAK,IAAIrtD,EAAQ,EAAGA,EAAQkrD,EAAgBh/D,OAAQ8T,GAAS,EAAG,CAC/D,MAAMoqB,EAAO8gC,EAAgBlrD,GACvBstD,EAAsB,SAAbljC,EAAKrV,KAAkB,EAAI,EACpCgX,EAAc3B,EAAK2B,YACzB,IAAKp5B,OAAOw0B,UAAU4E,IAAgBA,EAAc,EACnD,SAED,MAAMwhC,EAAYH,EAAQ5iD,MAAMuhB,GAAeqhC,EAAQ5iD,MAAMuhB,GAAap1B,YAAc,GAClF62D,EAAaH,EAAS7iD,MAAMuhB,GAAeshC,EAAS7iD,MAAMuhB,GAAap1B,YAAc,GACrF82D,EAAW3vE,KAAK4vE,uBAAuBH,EAAWC,GAAcF,EACtE,GAAiB,IAAbG,EACH,OAAOA,CAET,CACA,OAAO,CAAC,IAGT,MAAM7oE,EAAO9G,KAAK62C,WAClB72C,KAAK6gE,MAAMz+D,SAASqqB,IACnB3lB,EAAKwjB,YAAYmC,EAAI,GAEvB,CAEA0iD,oBAAAA,GACMnvE,KAAK8gE,cAAc1yD,SACvBpO,KAAK8gE,cAAgB9gE,KAAKimE,iBAE3BjmE,KAAK6gE,MAAQ7gE,KAAK8gE,cAAcj/C,QAEhC,MAAM/a,EAAO9G,KAAK62C,WAClB72C,KAAK6gE,MAAMz+D,SAASqqB,IACnB3lB,EAAKwjB,YAAYmC,EAAI,GAEvB,CAEAiiD,kBAAAA,GACM1uE,KAAK8gE,cAAc1yD,SACvBpO,KAAK8gE,cAAgB9gE,KAAKimE,iBAE3B,MAAMvwB,EAAU11C,KAAKq/C,gBAAiD,iBAAxBr/C,KAAKq/C,eAChDr/C,KAAKq/C,eACL,CAAC,EAEJ,IADmBj8C,OAAOwgB,KAAK8xB,GACftnC,OAKf,OAJApO,KAAK6gE,MAAQ7gE,KAAK8gE,cAAcj/C,aAChC7hB,KAAK6gE,MAAMz+D,SAASqqB,IACnBA,EAAIslB,QAAS,CAAK,IAKpB,MAAM89B,EAAgB7vE,KAAK8vE,oBACrBC,EAAe,GACrB/vE,KAAK8gE,cAAc1+D,SAASqqB,IAC3B,MAAMujD,EAAUhwE,KAAKiwE,mBAAmBxjD,EAAKipB,EAASm6B,GACtDpjD,EAAIslB,QAAUi+B,EACVA,GACHD,EAAap4D,KAAK8U,EACnB,IAEDzsB,KAAK6gE,MAAQkP,CACd,CAEAD,iBAAAA,GACC,MAAMxhE,EAAM,CAAC,EAOb,OANAtO,KAAKq5C,kBAAkBj3C,SAAQ,CAACke,EAAQ4B,KACvC,MAAM8pB,EAAQxlC,OAAO8Z,EAAO/O,aAAa,eAAiB,IAAI9K,OAC1DulC,IACH19B,EAAI09B,GAAS9pB,EACd,IAEM5T,CACR,CAEA2hE,kBAAAA,CAAmBxjD,EAAKipB,EAASm6B,GAChC,MAAMjsD,EAAOxgB,OAAOwgB,KAAK8xB,GAAW,CAAC,GACrC,IAAK,IAAI1qB,EAAI,EAAGA,EAAIpH,EAAKxV,OAAQ4c,GAAK,EAAG,CACxC,MAAMvqB,EAAMmjB,EAAKoH,GACXjf,EAAa2pC,EAAQj1C,GAC3B,IAAKsL,GAAoC,iBAAfA,EACzB,SAED,MAAMigC,EAAQxlC,OAAOuF,EAAWigC,OAASvrC,GAAO,IAAIgG,OAC9CwnC,EAAc7qC,OAAO+E,UAAUhE,eAAeiE,KAAKynE,EAAe7jC,GACrE6jC,EAAc7jC,IACb,EACJ,GAAIiC,EAAc,EACjB,SAED,MAAMthB,EAAOF,EAAIC,OAASD,EAAIC,MAAMuhB,GAAexhB,EAAIC,MAAMuhB,GAAe,KACtEiiC,EAAYvjD,EAAOnmB,OAAOmmB,EAAK9T,aAAe,IAAIpS,OAAS,GACjE,IAAKzG,KAAKmwE,oBAAoBD,EAAWnkE,GACxC,OAAO,CAET,CACA,OAAO,CACR,CAEAokE,mBAAAA,CAAoBC,EAAcrkE,GACjC,MAAM7H,EAAQ6H,EAAW9H,QAAU8H,EAAW9H,OAAOmK,OAClDrC,EAAW9H,OACX8H,EAAW7H,MACR8iD,EAAWxgD,OAAOuF,EAAWi7C,UAAYj7C,EAAWC,MAAQ,MAAMxG,cAAciB,OAChFsO,EAAOvO,OAAO4pE,GAAgB,IAEpC,GAAIh/D,MAAMiP,QAAQnc,GAAQ,CACzB,MAAMmsE,EAAmBnsE,EAAMoK,KAAKwB,GAAStJ,OAAOsJ,GAAQ,IAAItK,cAAciB,SAAQxE,OAAO8V,SAC7F,OAAKs4D,EAAiBjiE,QAGfiiE,EAAiB3kE,SAASqJ,EAAKvP,cAAciB,OACrD,CAEA,MAAMsV,EAAQvV,OAAOtC,GAAS,IAC9B,GAAc,KAAV6X,EACH,OAAO,EAGR,MAAMu0D,EAAYv7D,EAAKvP,cACjB+qE,EAAax0D,EAAMvW,cACnBgrE,EAAa37D,OAAOC,WAAWC,EAAKqT,QAAQ,IAAK,MACjDqoD,EAAc57D,OAAOC,WAAWiH,EAAMqM,QAAQ,IAAK,MACnDsoD,EAAa77D,OAAOI,SAASu7D,IAAe37D,OAAOI,SAASw7D,GAElE,MAAiB,aAAbzpB,EACIspB,EAAU5kE,SAAS6kE,GAEV,WAAbvpB,EACIspB,EAAUnuE,WAAWouE,GAEZ,SAAbvpB,EACIspB,EAAUK,SAASJ,GAEV,QAAbvpB,EACC0pB,EACIF,IAAeC,EAEhBH,IAAcC,EAEL,OAAbvpB,GAAqB0pB,EACjBF,EAAaC,EAEJ,QAAbzpB,GAAsB0pB,EAClBF,GAAcC,EAEL,OAAbzpB,GAAqB0pB,EACjBF,EAAaC,EAEJ,QAAbzpB,GAAsB0pB,EAClBF,GAAcC,EAEfC,EAAaF,IAAeC,EAAcH,IAAcC,CAChE,CAEAX,sBAAAA,CAAuB76D,EAAMgH,GAC5B,MAAMy0D,EAAaxwE,KAAKs3C,eAAeviC,GACjC07D,EAAczwE,KAAKs3C,eAAev7B,GAElC60D,EAAe/7D,OAAOI,SAASu7D,GAC/BK,EAAgBh8D,OAAOI,SAASw7D,GACtC,GAAIG,GAAgBC,EACnB,OAAOL,EAAaC,EAGrB,MAAMK,EAAatqE,OAAOuO,GAAQ,IAAItO,OAChCsqE,EAAcvqE,OAAOuV,GAAS,IAAItV,OACxC,OAAOqqE,EAAWE,cAAcD,EAAa,KAAM,CAClDE,SAAS,EACTC,YAAa,QAEf,CAEA55B,cAAAA,CAAepzC,GACd,MAAMikD,EAAW3hD,OAAOtC,GAAS,IAC/BkkB,QAAQ,UAAW,IACnBA,QAAQ,OAAQ,IAChBA,QAAQ,IAAK,KACbA,QAAQ,WAAY,IACtB,MAAiB,KAAb+/B,GAAgC,MAAbA,GAAiC,MAAbA,EACnClZ,IAEDp6B,OAAOC,WAAWqzC,EAC1B,CAEArC,oBAAAA,GACC,MAAMvG,EAAcv/C,KAAKa,QAAQ2+C,UAAY,CAAC,EAExCC,GADiBz/C,KAAKa,QAAQwF,SAAW,CAAC,GACXtD,QAAU,CAAC,EAC1C8jD,EAAY7mD,KAAK8mD,gBACjB9G,EAAmB,OAEnBhU,EAAQxlC,OACb+4C,EAAY0M,cACTpF,EAAU5jD,IAAI+8C,IACdP,EAAcO,IACdhgD,KAAKW,SAAS4Q,aAAa,cAC3B,IACF9K,OACI0qE,EACL5xB,EAAY2M,YACTrF,EAAU5jD,IAVS,QAWnBw8C,EAA4B,KAC5Bz/C,KAAKW,SAAS4Q,aAAa,aAC3B,MAEE0lB,EAAMj3B,KAAK29C,kBAAkBwzB,GAC7BvzB,EAAQ59C,KAAK09C,uBAAuB1R,EAAOmlC,GAEjD,MAAO,CACNnlC,QACA/U,MACAgX,YAAa2P,EAAM,IAAM/oC,OAAOw0B,UAAUuU,EAAM,GAAG3P,aAAe2P,EAAM,GAAG3P,aAAe,EAC1F2P,QAEF,CAEAF,sBAAAA,CAAuB0zB,EAASD,GAC/B,MAAMx1C,EAASn1B,OAAO4qE,GAAW,IAC/B5lE,MAAM,KACN8C,KAAKwB,GAASA,EAAKrJ,SACnBxE,OAAO8V,SACHmvC,EAAO1gD,OAAO2qE,GAAU,IAC5B3lE,MAAM,KACN8C,KAAKwB,GAAS9P,KAAK29C,kBAAkB7tC,KAEjC8tC,EAAQ,GASd,OARAjiB,EAAOv5B,SAAQ,CAAC4pC,EAAO9pB,KACtB,MAAM+rB,EAAcjuC,KAAK4kE,wBAAwB54B,GACjD4R,EAAMjmC,KAAK,CACVq0B,QACA/U,IAAKiwB,EAAKhlC,IAAUglC,EAAK,IAAM,MAC/BjZ,eACC,IAEIjuC,KAAKo/C,oBAAoBxB,EACjC,CAEAwB,mBAAAA,CAAoBtzB,GACnB,MAAM7I,EAAa,GA2CnB,OA1CC7R,MAAMiP,QAAQyL,GAASA,EAAQ,IAAI1pB,SAAS0N,IAC5C,MAAMk8B,EAAQxlC,OAAOsJ,GAAQA,EAAKk8B,MAAQl8B,EAAKk8B,MAAQ,IAAIvlC,OACrDwnC,EAAcp5B,OAAOw0B,UAAUv5B,GAAQA,EAAKm+B,aAC/Cn+B,EAAKm+B,YACLp5B,OAAOw3B,SAASv8B,GAAQA,EAAKm+B,YAAa,IACvChX,EAAMj3B,KAAK29C,kBAAkB7tC,GAAQA,EAAKmnB,IAAMnnB,EAAKmnB,IAAM,OAEjE,IAAK+U,IAAUn3B,OAAOw0B,UAAU4E,GAC/B,OAGD,MAAM3tB,EAAStgB,KAAKqxE,sBAAsBrlC,EAAOiC,GACjD,IAAK3tB,EACJ,OAED,MAAMgxD,EAAsBtxE,KAAK6rE,iBAAiBvrD,GAClD,GAAIgxD,EAAsB,EACzB,OAED,IAAKtxE,KAAK4qE,0BAA0BtqD,EAAQgxD,EAAqBtxE,KAAKa,QAAQ2+C,UAAY,CAAC,GAC1F,OAGD,MAAM+xB,EAAgB/qE,OAAOwlC,GAAS1rB,EAAO/O,aAAa,eAAiB,IAAI9K,OAC3EzG,KAAKs0C,YAAci9B,GAInBtuD,EAAWgV,MAAMwV,GAChB8jC,GAAiB9jC,EAAMzB,MACnByB,EAAMzB,QAAUulC,EAEjB9jC,EAAMQ,cAAgBqjC,KAI9BruD,EAAWtL,KAAK,CACfq0B,MAAOulC,EACPt6C,MACAgX,YAAaqjC,GACZ,IAEIruD,CACR,CAEA2nD,yBAAAA,CAA0BtqD,EAAQ4B,EAAOq9B,EAAc,CAAC,GACvD,IAAKj/B,EACJ,OAAO,EAGR,MAAMmjD,EAAenjD,EAAO/O,aAAa,iBACzC,GAAqB,OAAjBkyD,EAAuB,CAC1B,MAAMxgD,EAAazc,OAAOi9D,GAAcj+D,cAAciB,OACtD,GAAmB,UAAfwc,GAAyC,MAAfA,EAC7B,OAAO,CAET,CAEA,MAAMuuD,EAAYxxE,KAAKyxE,4BAA4BlyB,GACnD,GAAIiyB,GAAaA,EAAUjjD,KAAO,EAAG,CACpC,MAAMyd,EAAQxlC,OAAO8Z,EAAO/O,aAAa,eAAiB,IAAI9K,OAC9D,IAAKulC,IAAUwlC,EAAU1oD,IAAIkjB,GAC5B,OAAO,CAET,CAEA,OAAIhsC,KAAKs0C,WACDv8B,QAAQvR,OAAO8Z,EAAO/O,aAAa,eAAiB,IAAI9K,OAIjE,CAEAgrE,2BAAAA,CAA4BlyB,EAAc,CAAC,GAC1C,MAAMmyB,EAAa1xE,KAAKW,SAAS4Q,aAAa,oBACxChL,EAAwB,OAAfmrE,EAAsBA,EAAanyB,EAAY5jB,OACxDjtB,EAAO1O,KAAK2xE,yBAAyBprE,GAC3C,OAAKmI,EAAKN,OAGH,IAAI2C,IAAIrC,GAFP,IAGT,CAEAijE,wBAAAA,CAAyBztE,GACxB,OAAIkN,MAAMiP,QAAQnc,GACVA,EACLoK,KAAKwB,GAAStJ,OAAOsJ,GAAQ,IAAIrJ,SACjCxE,OAAO8V,SAGHvR,OAAOtC,GAAS,IACrBsH,MAAM,KACN8C,KAAKwB,GAASA,EAAKrJ,SACnBxE,OAAO8V,QACV,CAEAshC,eAAAA,GACC,MAAM+d,EAAOp3D,KAAKW,SAASsoC,OAASjpC,KAAKW,SAAS4G,cAAc,SAChE,OAAK6vD,GAASA,EAAKhrC,MAASgrC,EAAKhrC,KAAKhe,OAG/BgD,MAAMC,KAAK+lD,EAAKhrC,KAAK,GAAGM,OAAS,IAFhC,EAGT,CAEAm/C,gBAAAA,CAAiBvrD,GAChB,OAAKA,EAGWtgB,KAAKq5C,kBACNtiB,QAAQzW,IAHd,CAIV,CAEAskD,uBAAAA,CAAwB54B,GACvB,MAAM1nC,EAASkC,OAAOwlC,GAAS,IAAIvlC,OACnC,OAAKnC,EAGWtE,KAAKq5C,kBACN4f,WAAW34C,GAAW9Z,OAAO8Z,EAAO/O,aAAa,eAAiB,IAAI9K,SAAWnC,KAHvF,CAIV,CAEA+sE,qBAAAA,CAAsBrlC,EAAOiC,GAC5B,MAAMrnC,EAAU5G,KAAKq5C,kBACfuJ,EAAkBp8C,OAAOwlC,GAAS,IAAIvlC,OAC5C,GAAIm8C,EAAiB,CACpB,MAAMhX,EAAUhlC,EAAQpE,MAAM8d,GAAW9Z,OAAO8Z,EAAO/O,aAAa,eAAiB,IAAI9K,SAAWm8C,IACpG,GAAIhX,EACH,OAAOA,CAET,CAEA,OAAI/2B,OAAOw0B,UAAU4E,IAAgBA,GAAe,GAAKA,EAAcrnC,EAAQwH,OACvExH,EAAQqnC,GAGT,IACR,CAEA+X,eAAAA,GACC,MAAM4rB,EAAU5xE,KAAK88C,sBAAsB98C,KAAK8mD,gBAAgB7jD,IAAI,QAAS,GAC7E,GAAI2uE,EAAU,EACb,OAAOA,EAER,MACMnyB,GADiBz/C,KAAKa,QAAQwF,SAAW,CAAC,GACXtD,QAAU,CAAC,EAC1C8uE,EAAc7xE,KAAK88C,sBAAsB2C,EAAc1C,KAAM,GACnE,GAAI80B,EAAc,EACjB,OAAOA,EAER,MAAMC,EAAc9xE,KAAK+xE,kBACzB,OAAID,EAAc,EACVA,EAED9xE,KAAK88C,sBAAsB98C,KAAKa,QAAQu5C,WAAW2C,KAAM,EACjE,CAEAsD,kBAAAA,GACC,MAAMuxB,EAAU5xE,KAAK88C,sBAAsB98C,KAAK8mD,gBAAgB7jD,IAAI,YAAa,GACjF,GAAI2uE,EAAU,EACb,OAAO5xE,KAAKu6C,cAAcq3B,EAAS,IAEpC,MACMnyB,GADiBz/C,KAAKa,QAAQwF,SAAW,CAAC,GACXtD,QAAU,CAAC,EAC1C8uE,EAAc7xE,KAAK88C,sBAAsB2C,EAAcxC,SAAU,GACvE,GAAI40B,EAAc,EACjB,OAAO7xE,KAAKu6C,cAAcs3B,EAAa,IAExC,MAAMC,EAAc9xE,KAAKgyE,qBACzB,GAAIF,EAAc,EACjB,OAAO9xE,KAAKu6C,cAAcu3B,EAAa,IAExC,MAAMpuB,EAAa1jD,KAAKiyE,wBACxB,OAAIvuB,EAAa,EACT1jD,KAAKu6C,cAAcmJ,EAAY,IAEhC1jD,KAAKu6C,cAAcv6C,KAAKa,QAAQu5C,WAAWD,QAAS,GAC5D,CAEA83B,qBAAAA,GACC,MAAMC,EAAclyE,KAAKW,SAAS4Q,aAAa,4BACzC4gE,EAAWnyE,KAAK88C,sBAAsBo1B,EAAa,GACzD,OAAIC,EAAW,EACPA,EAEDnyE,KAAK88C,sBAAsB98C,KAAKa,QAAQu5C,WAAWD,QAAS,EACpE,CAEA2sB,cAAAA,GACC,MAAM1sB,EAAap6C,KAAKa,QAAQu5C,YAAc,CAAC,EACzCg4B,EAAiBpyE,KAAKW,SAAS4Q,aAAa,gCAC5C4gE,EAAWnyE,KAAK88C,sBAAsBs1B,EAAgB,GAC5D,GAAID,EAAW,EACd,OAAOA,EAGR,MAAMj3B,EAAcl7C,KAAK88C,sBAAsB1C,EAAW0Q,WAAY,GACtE,OAAI5P,EAAc,EACVA,EAGD,GACR,CAEAX,aAAAA,CAAcr2C,EAAO4vC,EAAW,IAC/B,MAAM7wB,EAAajjB,KAAK88C,sBAAsB54C,EAAO4vC,GAC/CgX,EAAa9qD,KAAK8mE,iBACxB,OAAO3xD,KAAKC,IAAI,EAAGD,KAAKO,IAAIuN,EAAY6nC,GACzC,CAEA3I,gBAAAA,GACC,MAAMyF,EAAgB5nD,KAAKa,QAAQ60C,SAAW,CAAC,EACzCo0B,EAAY9pE,KAAKW,SAAS4Q,aAAa,sBAC7C,OAAO/K,OAAOohD,EAAcxjD,OAAS0lE,GAAa,IAAIrjE,MACvD,CAEA4rE,4BAAAA,GACC,MAAMj4B,EAAap6C,KAAKa,QAAQu5C,YAAc,CAAC,EACzClxB,EAAOlpB,KAAKW,SAAS4Q,aAAa,oCACxC,GAAa,OAAT2X,EAAe,CAClB,MAAMjG,EAAazc,OAAO0iB,GAAM1jB,cAAciB,OAC9C,MAAsB,UAAfwc,GAAyC,MAAfA,CAClC,CACA,YAA2Clc,KAAtCqzC,EAAW6Q,SAAW,CAAC,GAAG9Q,SAAgE,QAAtCC,EAAW6Q,SAAW,CAAC,GAAG9Q,SAG5EpiC,SAASqiC,EAAW6Q,SAAW,CAAC,GAAG9Q,QAC3C,CAEAm4B,yBAAAA,GACC,MAAMl4B,EAAap6C,KAAKa,QAAQu5C,YAAc,CAAC,EACzClxB,EAAOlpB,KAAKW,SAAS4Q,aAAa,gCACxC,GAAa,OAAT2X,EAAe,CAClB,MAAMjG,EAAazc,OAAO0iB,GAAM1jB,cAAciB,OAC9C,MAAsB,UAAfwc,GAAyC,MAAfA,CAClC,CACA,YAAwClc,KAAnCqzC,EAAW6Q,SAAW,CAAC,GAAGlO,MAA0D,QAAnC3C,EAAW6Q,SAAW,CAAC,GAAGlO,MAGzEhlC,SAASqiC,EAAW6Q,SAAW,CAAC,GAAGlO,KAC3C,CAEAjK,qBAAAA,GACC,MAAMsH,EAAap6C,KAAKa,QAAQu5C,YAAc,CAAC,EACzCP,EAAWrzC,QAAS4zC,EAAWwQ,SAAW,CAAC,GAAGnqD,KAAQT,KAAKW,SAAS4Q,aAAa,gCAAkC,IAAI9K,OAC7H,GAAIozC,EACH,OAAOA,EAER,MAAM9G,EAAUvsC,OAAOxG,KAAKW,SAAS6Q,IAAM,IAAI/K,OAC/C,GAAIssC,EACH,MAAO,gBAAgBA,IAExB,MAAM3uC,EAAQoC,OAAOxG,KAAKoiD,aAAe,IAAI37C,OAC7C,GAAIrC,EACH,MAAO,gBAAgBA,IAExB,MAAMmuE,EAAa/rE,OAAOxG,KAAKW,SAAS4Q,aAAa,kBAAoB,IAAI9K,OAC7E,GAAI8rE,EACH,MAAO,gBAAgBl9D,OAAOqO,SAAS6Z,YAAYg1C,IAEpD,MACMrwD,EADS9Q,MAAMC,KAAKhE,SAASmC,iBAAiB,oBAC/BunB,QAAQ/2B,KAAKW,UAClC,MAAO,gBAAgB0U,OAAOqO,SAAS6Z,YAAYrb,GAAS,EAAIA,EAAQ,GACzE,CAEAswD,kBAAAA,GACC,MAAMp4B,EAAap6C,KAAKa,QAAQu5C,YAAc,CAAC,EAE/C,OADiB5zC,SAAU4zC,EAAW+Q,aAAe,CAAC,GAAGP,SAAW,CAAC,GAAGnqD,KAAQT,KAAKW,SAAS4Q,aAAa,qCAAuC,IAAI9K,QAI/I,GAAGzG,KAAK8yC,8BAChB,CAEAi/B,eAAAA,GACC,IAAK/xE,KAAKsyE,4BACT,OAAO,EAER,IACC,MAAMvpC,EAAM1zB,OAAOspB,aAAaG,QAAQ9+B,KAAKwyE,sBAC7C,OAAOxyE,KAAK88C,sBAAsB/T,EAAK,EACxC,CAAE,MAAO35B,GACR,OAAO,CACR,CACD,CAEAguC,UAAAA,CAAWL,GACV,IAAK/8C,KAAKsyE,4BACT,OAED,MAAMrvD,EAAajjB,KAAK88C,sBAAsBC,EAAM,GACpD,KAAI95B,GAAc,GAGlB,IACC5N,OAAOspB,aAAaC,QAAQ5+B,KAAKwyE,qBAAsBhsE,OAAOyc,GAC/D,CAAE,MAAO7T,GACR,CAEF,CAEA4iE,kBAAAA,GACC,IAAKhyE,KAAKqyE,+BACT,OAAO,EAER,IACC,MAAMtpC,EAAM1zB,OAAOspB,aAAaG,QAAQ9+B,KAAK8yC,yBAC7C,OAAO9yC,KAAK88C,sBAAsB/T,EAAK,EACxC,CAAE,MAAO35B,GACR,OAAO,CACR,CACD,CAEAiuC,aAAAA,CAAclD,GACb,IAAKn6C,KAAKqyE,+BACT,OAED,MAAMpvD,EAAajjB,KAAK88C,sBAAsB3C,EAAS,GACvD,KAAIl3B,GAAc,GAGlB,IACC5N,OAAOspB,aAAaC,QAAQ5+B,KAAK8yC,wBAAyBtsC,OAAOyc,GAClE,CAAE,MAAO7T,GACR,CAEF,CAEAuuC,iBAAAA,CAAkBz5C,GAKjB,MAAsB,SAJHsC,OAAOtC,GACxBsH,MAAM,KAAK,GACXhG,cACAiB,OAC6B,OAAS,KACzC,CAEAs+C,oBAAAA,GACC,MAAM3K,EAAap6C,KAAKa,QAAQu5C,YAAc,CAAC,EAC/C,QAA0BrzC,IAAtBqzC,EAAWj6C,QAA8C,OAAtBi6C,EAAWj6C,OAAiB,CAClE,MAAM8iB,EAAazc,OAAO4zC,EAAWj6C,QAAQqF,cAAciB,OAC3D,MAAmB,SAAfwc,GAAwC,MAAfA,GAGV,UAAfA,GAAyC,MAAfA,GAGvBlL,QAAQqiC,EAAWj6C,OAC3B,CAEA,MAAMsjE,EAAezjE,KAAKW,SAAS4Q,aAAa,0BAChD,GAAqB,OAAjBkyD,EAAuB,CAC1B,MAAMxgD,EAAazc,OAAOi9D,GAAcj+D,cAAciB,OACtD,MAAsB,UAAfwc,GAAyC,MAAfA,CAClC,CAEA,OAAO,CACR,CAEA4iD,sBAAAA,GACC,MAAM4M,EAASzyE,KAAKa,QAAQqsD,cAAgB,CAAC,EACvCwlB,EAAa1yE,KAAKW,SAAS4Q,aAAa,6BAC9C,GAAmB,OAAfmhE,EAAqB,CACxB,MAAMzvD,EAAazc,OAAOksE,GAAYltE,cAAciB,OACpD,MAAsB,UAAfwc,GAAyC,MAAfA,CAClC,CAEA,QAAsBlc,IAAlB0rE,EAAOtyE,QAA0C,OAAlBsyE,EAAOtyE,OAAiB,CAC1D,MAAM8iB,EAAazc,OAAOisE,EAAOtyE,QAAQqF,cAAciB,OACvD,MAAmB,SAAfwc,GAAwC,MAAfA,GAGV,UAAfA,GAAyC,MAAfA,GAGvBlL,QAAQ06D,EAAOtyE,OACvB,CAEA,OAAO,CACR,CAEAwlE,2BAAAA,GACC,SAAI3lE,KAAKwnC,UAAWxnC,KAAKwnC,QAAQrmC,UAAUE,SAAS,kBAG7C0W,QAAQ/X,KAAKW,UAAYX,KAAKW,SAASQ,UAAUE,SAAS,gBAClE,CAEA83C,4BAAAA,CAA6BxzC,EAAU,CAAC,GACvC,MAAMylC,EAAYrzB,QAAQpS,GAAWA,EAAQylC,WACvCnJ,EAASz7B,OAAQb,GAAWA,EAAQs8B,QAAW,IAAIx7B,OAOzD,GANIw7B,IACHjiC,KAAKohE,sBAAsBzpD,KAAKsqB,GAC5BjiC,KAAKohE,sBAAsBhzD,OAAS,IACvCpO,KAAKohE,sBAAsB/yB,SAGzBjD,GAA+B,oBAAX/1B,QAAkE,mBAAjCA,OAAOpF,sBAO/D,OANIjQ,KAAKmhE,qBAAyC,oBAAX9rD,QAAiE,mBAAhCA,OAAO8G,sBAC9E9G,OAAO8G,qBAAqBnc,KAAKmhE,qBAElCnhE,KAAKmhE,oBAAsB,EAC3BnhE,KAAKqhE,yBAA0B,OAC/BrhE,KAAK2yE,kCAGF3yE,KAAKqhE,0BAGTrhE,KAAKqhE,yBAA0B,EAC/BrhE,KAAKmhE,oBAAsB9rD,OAAOpF,uBAAsB,KACvDjQ,KAAKmhE,oBAAsB,EAC3BnhE,KAAKqhE,yBAA0B,EAC/BrhE,KAAK2yE,iCAAiC,IAExC,CAEAA,+BAAAA,GACC3yE,KAAKohE,sBAAwB,GACxBphE,KAAKW,UAAaX,KAAKW,SAASgvC,cAGrC3vC,KAAK4pC,2BACL5pC,KAAK4yE,yBACL5yE,KAAKyxC,2BACN,CAEAohC,0BAAAA,GACC,GAAsB,oBAAXx9D,OACV,OAED,MAAMy9D,EAAe9yE,KAAK2lE,+BAAiC3lE,KAAKgpC,yBAChE3zB,OAAO3D,oBAAoB,SAAU1R,KAAKihE,yBAC1CjhE,KAAK+yE,gCACDD,IACHz9D,OAAOzF,iBAAiB,SAAU5P,KAAKihE,yBACvCjhE,KAAKgzE,6BAEP,CAEAA,0BAAAA,GAC+B,oBAAnBh3D,iBAINhc,KAAKkhE,wBACTlhE,KAAKkhE,sBAAwB,IAAIllD,gBAAe,KAC/Chc,KAAKihE,yBAAyB,KAIhCjhE,KAAKizE,0BAA0B7wE,SAASkC,IACvCtE,KAAKkhE,sBAAsBjlD,QAAQ3X,EAAO,IAE5C,CAEAyuE,6BAAAA,GACM/yE,KAAKkhE,uBAGVlhE,KAAKkhE,sBAAsBhlD,YAC5B,CAEA+2D,uBAAAA,GACC,MAAMpa,EAAO,IAAI9nD,IACXmiE,EAAc5uE,IACdA,IAAUu0D,EAAK/vC,IAAIxkB,IAGxBu0D,EAAKz3D,IAAIkD,EAAO,EAMjB,OAHA4uE,EAAWlzE,KAAKwnC,SAChB0rC,EAAWlzE,KAAK8tC,gBAET18B,MAAMC,KAAKwnD,EACnB,CAEAsa,uBAAAA,GACC,MAAMV,EAASzyE,KAAKa,QAAQqsD,cAAgB,CAAC,EACvCkmB,EAAUpzE,KAAKW,SAAS4Q,aAAa,0BACrC8hE,EAAqB,OAAZD,GAA+C,KAA3B5sE,OAAO4sE,GAAS3sE,OAAgB2sE,EAAUX,EAAO/hE,IAC9EA,EAAMmE,OAAOI,SAASJ,OAAOw3B,SAASgnC,EAAQ,KAAOx+D,OAAOw3B,SAASgnC,EAAQ,IAAM,EACnFC,EAAgBtzE,KAAKW,SAAS4Q,aAAa,0BAC3CgiE,EAAiC,OAAlBD,GAA2D,KAAjC9sE,OAAO8sE,GAAe7sE,OAAgB6sE,EAAgBb,EAAOr9D,IACtGqG,EAAY5G,OAAOI,SAASJ,OAAOw3B,SAASknC,EAAc,KAAO1+D,OAAOw3B,SAASknC,EAAc,IAAM,EAC3G,MAAO,CACN7iE,IAAKyE,KAAKC,IAAI,EAAG1E,GACjB+K,UAAWtG,KAAKC,IAAI,EAAGqG,GAEzB,CAEA+3D,4BAAAA,GACC,MAAO,CACN9iE,IAAK1Q,KAAKyzE,gBAAgB,oBAAqB,GAC/Ch4D,UAAWzb,KAAKyzE,gBAAgB,2BAA4B,GAE9D,CAEAA,eAAAA,CAAgB9nE,EAAMmoC,EAAW,GAChC,MAAMpf,EAAU,CAAC10B,KAAKwnC,QAASxnC,KAAKW,SAAUX,KAAK8tC,gBAAgB7rC,OAAO8V,SAC1E,IAAK,IAAImK,EAAQ,EAAGA,EAAQwS,EAAQtmB,OAAQ8T,GAAS,EAAG,CACvD,MAAMoG,EAAOoM,EAAQxS,GACfhe,EAAQmR,OAAOgf,iBAAiB/L,GAAMyR,iBAAiBpuB,GACvDinC,EAAS5yC,KAAK0zE,sBAAsBxvE,EAAOokB,GACjD,GAAIzT,OAAOI,SAAS29B,GACnB,OAAOz9B,KAAKC,IAAI,EAAGw9B,EAErB,CACA,OAAOz9B,KAAKC,IAAI,EAAG0+B,EACpB,CAEA4/B,qBAAAA,CAAsBxvE,EAAOyvE,EAAgB,MAC5C,MAAM5qC,EAAMviC,OAAOtC,GAAS,IAAIuC,OAChC,IAAKsiC,EACJ,OAAOkG,IAGR,MAAM2kC,EAAS/+D,OAAOC,WAAWi0B,GACjC,GAAIl0B,OAAOI,SAAS2+D,GACnB,OAAOA,EAGR,GAAwB,oBAAbvmE,SACV,OAAO4hC,IAGR,MAAM4kC,EAAOF,aAAyBthC,QACnCshC,EACCtmE,SAASvG,MAAQuG,SAASulB,gBAC9B,IAAKihD,EACJ,OAAO5kC,IAGR,MAAM6kC,EAAQzmE,SAAS2K,cAAc,OACrC87D,EAAM//D,MAAM6C,SAAW,WACvBk9D,EAAM//D,MAAMugB,WAAa,SACzBw/C,EAAM//D,MAAM6D,cAAgB,OAC5Bk8D,EAAM//D,MAAMgB,KAAO,WACnB++D,EAAM//D,MAAMrD,IAAM,IAClBojE,EAAM//D,MAAMvD,OAASu4B,EACrB8qC,EAAKvpD,YAAYwpD,GAEjB,MAAMvqB,EAAWl0C,OAAOgf,iBAAiBy/C,GAAOtjE,OAChDqjE,EAAKhK,YAAYiK,GAEjB,MAAMvtD,EAAW1R,OAAOC,WAAWtO,OAAO+iD,GAAY,IAAI9iD,QAC1D,OAAOoO,OAAOI,SAASsR,GAAYA,EAAW0oB,GAC/C,CAEA62B,kBAAAA,CAAmBr3B,GAClB,IAAKzuC,KAAKW,SACT,OAGD,MAAMytC,EAAUpuC,KAAKmzE,0BAErB,GAAI1kC,EAAS,CACZzuC,KAAKW,SAASoT,MAAMimB,YAAY,oBAAqB,GAAGoU,EAAQ19B,SAChE,MAAMqjE,EAAe/zE,KAAK8tC,gBAAkB9tC,KAAKwnC,QAUjD,YATIusC,IACC3lC,EAAQ3yB,UAAY,GACvBs4D,EAAa5yE,UAAUC,IAAI,uBAC3B2yE,EAAahgE,MAAMimB,YAAY,2BAA4B,GAAGoU,EAAQ3yB,iBAEtEs4D,EAAa5yE,UAAUG,OAAO,uBAC9ByyE,EAAahgE,MAAMkmB,eAAe,8BAIrC,CAEAj6B,KAAKW,SAASoT,MAAMkmB,eAAe,qBACnC,MAAM85C,EAAe/zE,KAAK8tC,gBAAkB9tC,KAAKwnC,QAC7CusC,IACHA,EAAa5yE,UAAUG,OAAO,uBAC9ByyE,EAAahgE,MAAMkmB,eAAe,4BAEpC,CAEA8rC,uBAAAA,CAAwBt3B,GACvB,MAAMslC,EAAe/zE,KAAK8tC,gBAAkB9tC,KAAKwnC,QAC3C5uB,EAAQ5Y,KAAK8qC,kBAEnB,IAAK2D,EAcJ,OAbI71B,GAASA,EAAMk3B,UAAYl3B,EAAMo7D,UACpCp7D,EAAMk3B,SAASp+B,oBAAoB,SAAUkH,EAAMo7D,UAEhDp7D,GAASA,EAAMq7D,YAAcr7D,EAAMq7D,WAAWxgD,eACjD7a,EAAMq7D,WAAWxgD,cAAco2C,YAAYjxD,EAAMq7D,YAElDj0E,KAAK8qC,kBAAoB,KACzB9qC,KAAKwnC,QAAQzzB,MAAMkmB,eAAe,8BAC9B85C,IAAiB/zE,KAAK6lE,2BACzBkO,EAAa5yE,UAAUG,OAAO,uBAC9ByyE,EAAahgE,MAAMkmB,eAAe,kCAEnCj6B,KAAK6yE,6BAIN,IAAK7yE,KAAKwnC,UAAYxnC,KAAK8tC,iBAAmB9tC,KAAKW,SAASsoC,MAC3D,OAGD,MAAMmF,EAAUpuC,KAAKwzE,+BAYrB,GAVIO,IACC3lC,EAAQ3yB,UAAY,GACvBs4D,EAAa5yE,UAAUC,IAAI,uBAC3B2yE,EAAahgE,MAAMimB,YAAY,2BAA4B,GAAGoU,EAAQ3yB,iBAEtEs4D,EAAa5yE,UAAUG,OAAO,uBAC9ByyE,EAAahgE,MAAMkmB,eAAe,+BAI/Bj6B,KAAK8qC,kBAAmB,CAC5B,MAAMmpC,EAAa5mE,SAAS2K,cAAc,OAC1Ci8D,EAAWnxD,UAAY,oBACvB,MAAM+nB,EAAax9B,SAAS2K,cAAc,SAC1C6yB,EAAW/nB,UAAY,2BACnB9iB,KAAKW,SAASQ,UAAUE,SAAS,mBACpCwpC,EAAW1pC,UAAUC,IAAI,kBAE1B,MAAM8yE,EAAY7mE,SAAS2K,cAAc,SACzC6yB,EAAWvgB,YAAY4pD,GACvBD,EAAW3pD,YAAYugB,GACvB7qC,KAAKwnC,QAAQ72B,aAAasjE,EAAYj0E,KAAK8tC,gBAE3C,MAAMqmC,EAAY,CACjBF,aACA9nD,MAAO0e,EACPusB,KAAM8c,EACNE,aAAc,GACdC,WAAY,GACZvkC,SAAU9vC,KAAK8tC,eACfkmC,SAAUA,KACTh0E,KAAKs0E,wBAAwB,EAE9BC,QAAUjnE,IACTtN,KAAKw0E,+BAA+BlnE,EAAO,QAAQ,EAEpDy+C,SAAWz+C,IACVtN,KAAKw0E,+BAA+BlnE,EAAO,SAAS,EAErDi/D,YAAcj/D,IACbtN,KAAKw0E,+BAA+BlnE,EAAO,YAAY,EAExDo/D,WAAap/D,IACZtN,KAAKw0E,+BAA+BlnE,EAAO,WAAW,EAEvDs/D,OAASt/D,IACRtN,KAAKw0E,+BAA+BlnE,EAAO,OAAO,EAEnDy/D,UAAYz/D,IACXtN,KAAKw0E,+BAA+BlnE,EAAO,UAAU,GAIvD6mE,EAAUrkC,SAASlgC,iBAAiB,SAAUukE,EAAUH,SAAU,CAAEplC,SAAS,IAC7EulC,EAAU/c,KAAKxnD,iBAAiB,QAASukE,EAAUI,SACnDJ,EAAU/c,KAAKxnD,iBAAiB,SAAUukE,EAAUpoB,UACpDooB,EAAU/c,KAAKxnD,iBAAiB,YAAaukE,EAAU5H,aACvD4H,EAAU/c,KAAKxnD,iBAAiB,WAAYukE,EAAUzH,YACtDyH,EAAU/c,KAAKxnD,iBAAiB,OAAQukE,EAAUvH,QAClDuH,EAAU/c,KAAKxnD,iBAAiB,UAAWukE,EAAUpH,WACrD/sE,KAAK8qC,kBAAoBqpC,CAC1B,CAEAn0E,KAAK6yE,6BACL7yE,KAAK4yE,wBACN,CAEAA,sBAAAA,GACC,MAAMh6D,EAAQ5Y,KAAK8qC,kBACnB,IAAKlyB,IAAU5Y,KAAKW,WAAaX,KAAKW,SAASsoC,MAC9C,OAGD,MAAMwrC,EAAaz0E,KAAKW,SAASsoC,MAEjC,IADmB73B,MAAMC,KAAKojE,EAAWroD,MAAQ,IACjChe,OAEf,YADAwK,EAAMq7D,WAAWliC,QAAS,GAGvB/xC,KAAKW,SAASQ,UAAUE,SAAS,kBACpCuX,EAAMuT,MAAMhrB,UAAUC,IAAI,kBAE1BwX,EAAMuT,MAAMhrB,UAAUG,OAAO,kBAE9B,MAAMozE,EAAmB10E,KAAKW,SAAS4Q,aAAa,kCAC3B,OAArBmjE,EACH97D,EAAMuT,MAAMzc,aAAa,iCAAkCglE,GAE3D97D,EAAMuT,MAAMgG,gBAAgB,kCAG7B,IAAIwiD,GAAmB,EACvB,MAAMC,EAAeH,EAAW3wE,UAC5B8U,EAAMw7D,eAAiBQ,IAC1Bh8D,EAAMw+C,KAAKtzD,UAAY8wE,EACvB50E,KAAK60E,4BAA4Bj8D,EAAMw+C,MACvCx+C,EAAMw7D,aAAeQ,EACrBh8D,EAAMy7D,WAAajjE,MAAMC,KAAKuH,EAAMw+C,KAAK5nD,iBAAiB,OAC1DmlE,GAAmB,GAEpB,MAAMG,EAAc1jE,MAAMC,KAAKojE,EAAWjlE,iBAAiB,OACrD6kE,EAAajjE,MAAMiP,QAAQzH,EAAMy7D,aAAez7D,EAAMy7D,WAAWjmE,OACpEwK,EAAMy7D,WACNjjE,MAAMC,KAAKuH,EAAMw+C,KAAK5nD,iBAAiB,OAC1CxP,KAAK+0E,+BAA+BN,EAAY77D,EAAMw+C,MACtD,MAAM4d,EAAmBh1E,KAAKW,SAAS2P,wBAAwBmE,MACzD62B,EAAkBtrC,KAAKurC,2BACvB0pC,IAAwBj1E,KAAK8tC,gBAChC9tC,KAAK8tC,eAAekC,YAAchwC,KAAK8tC,eAAezU,YAAc,EAEvE,IAAI67C,EAAaF,EAEb1pC,IACH4pC,GAAeD,GAAyB3pC,EAAgB6pC,oBACrDH,EACA7/D,KAAKC,IAAI4/D,EAAkB1pC,EAAgBG,iBAG/C,MAAM2pC,EAAgB,GAAGjgE,KAAKC,IAAI,EAAG8/D,OACjCt8D,EAAMuT,MAAMpY,MAAMU,QAAU2gE,IAC/Bx8D,EAAMuT,MAAMpY,MAAMU,MAAQ2gE,GAE3Bx8D,EAAMq7D,WAAWlgE,MAAMU,MAAQ,OAC/B,IAAI4gE,EAAkB,EAqBtB,GApBAP,EAAY1yE,SAAQ,CAACuqB,EAAMzK,KAC1B,MAAMozD,EAAYjB,EAAWnyD,GAC7B,IAAKozD,EACJ,OAED,MAAM7gE,EAAQkY,EAAKrc,wBAAwBmE,MACrC8gE,EAAYpgE,KAAKC,IAAI,EAAGX,GACxB+gE,EAAW,GAAGD,MAChBD,EAAUvhE,MAAMU,QAAU+gE,IAC7BF,EAAUvhE,MAAMU,MAAQ+gE,GAErBF,EAAUvhE,MAAMgF,WAAay8D,IAChCF,EAAUvhE,MAAMgF,SAAWy8D,GAExBF,EAAUvhE,MAAMyH,WAAag6D,IAChCF,EAAUvhE,MAAMyH,SAAWg6D,GAE5BH,GAAmBE,CAAS,IAGzBN,GAAyBZ,EAAWjmE,OAAQ,CAC/C,MAAMqnE,EAAMtgE,KAAKC,IAAI,EAAG8/D,EAAaG,GACrC,GAAII,EAAM,EAAG,CACZ,MAAMC,EAAWrB,EAAWA,EAAWjmE,OAAS,GAC1C0rB,EAAU47C,EAASplE,wBAAwBmE,MAC3Cif,EAAOve,KAAKC,IAAI,EAAG0kB,EAAU27C,GACnCC,EAAS3hE,MAAMU,MAAQ,GAAGif,MAC1BgiD,EAAS3hE,MAAMgF,SAAW,GAAG2a,MAC7BgiD,EAAS3hE,MAAMyH,SAAW,GAAGkY,KAC9B,CACD,CAEA9a,EAAMq7D,WAAWliC,QAAS,EAC1B,MAAM4jC,EAAc/8D,EAAMq7D,WAAW3jE,wBAAwBE,OAC7DxQ,KAAKwnC,QAAQzzB,MAAMimB,YAAY,6BAA8B,GAAG7kB,KAAKC,IAAI,EAAGugE,QAC5E31E,KAAKs0E,yBACDK,GAAmE,mBAAxC30E,KAAKkrC,iCACnClrC,KAAKkrC,iCACuC,mBAAjClrC,KAAKmrC,yBACfnrC,KAAKmrC,wBAAwB,CAAEC,WAAW,IAG7C,CAEA2pC,8BAAAA,CAA+BN,EAAYP,GAC1C,IAAKO,IAAeP,GAAiD,mBAA7BO,EAAWltE,eAAmE,mBAA5B2sE,EAAU3sE,cACnG,OAED,MAAMquE,EAAkBnB,EAAWltE,cAAc,qBAC3CsuE,EAAiB3B,EAAU3sE,cAAc,qBAC1CquE,GAAoBC,IAGzBA,EAAe3X,QAAUnmD,QAAQ69D,EAAgB1X,SACjD2X,EAAeC,cAAgB/9D,QAAQ69D,EAAgBE,eACvDD,EAAe3hD,SAAWnc,QAAQ69D,EAAgB1hD,UACnD,CAEA2gD,2BAAAA,CAA4Bzd,GAC3B,IAAKA,GAAyC,mBAA1BA,EAAK5nD,iBACxB,OAGD,MAAMumE,EAAc3kE,MAAMC,KAAK+lD,EAAK5nD,iBAAiB,SACrD,IAAKumE,EAAY3nE,OAChB,OAGD,MAAM4nE,EAAQ,IAAI7nD,IAWlB,GAVA4nD,EAAY3zE,SAASkmB,IACpB,MAAM2tD,EAAazvE,OAAO8hB,EAAK/W,aAAa,OAAS,IAAI9K,OACzD,IAAKwvE,EACJ,OAED,MAAMC,EAAU,GAAGD,gBACnB3tD,EAAK5Y,aAAa,KAAMwmE,GACxBF,EAAMpzE,IAAIqzE,EAAYC,EAAQ,KAG1BF,EAAMznD,KACV,OAGD,MAAM4nD,EAAa,CAAC,MAAO,UAAW,kBAAmB,mBAAoB,gBAAiB,YAAa,gBAC1F/kE,MAAMC,KAAK+lD,EAAK5nD,iBAAiB,MACzCpN,SAASkmB,IACjB6tD,EAAW/zE,SAAS8mB,IACnB,MAAMhlB,EAAQsC,OAAO8hB,EAAK/W,aAAa2X,IAAS,IAAIziB,OACpD,IAAKvC,EACJ,OAED,MAAM64D,EAAY74D,EAChBsH,MAAM,OACN8C,KAAK64C,GAAS6uB,EAAM/yE,IAAIkkD,IAASA,IACjC3jC,KAAK,KACHu5C,IAAc74D,GACjBokB,EAAK5Y,aAAawZ,EAAM6zC,EACzB,GACC,GAEJ,CAEAuX,sBAAAA,GACC,MAAM17D,EAAQ5Y,KAAK8qC,kBACnB,IAAKlyB,IAAUA,EAAMk3B,SACpB,OAGD,KAD8Bl3B,EAAMk3B,SAASE,YAAcp3B,EAAMk3B,SAASzW,YAAc,GAMvF,OAJkC,IAA9BzgB,EAAMk3B,SAASjC,aAClBj1B,EAAMk3B,SAASjC,WAAa,QAE7Bj1B,EAAMuT,MAAMpY,MAAM+C,UAAY,mBAG/B,MAAM/B,EAAO6D,EAAMk3B,SAASjC,YAAc,EAC1Cj1B,EAAMuT,MAAMpY,MAAM+C,UAAY,eAAe/B,MAC9C,CAEAw2B,wBAAAA,GACC,MAAMuE,EAAW9vC,KAAK8tC,eACtB,IAAKgC,EACJ,OAAO,KAGR,MAAMzW,EAAcyW,EAASzW,aAAe,EACtCpX,EAAe6tB,EAAS7tB,cAAgB,EACxCkzD,EAAsBrlC,EAAS7Q,aAAehd,EAAe,EAGnE,MAAO,CACNoX,cACAoS,eAJsBpS,GAAeyW,EAASp7B,aAAe,EAK7DygE,sBAEF,CAEAX,8BAAAA,CAA+BlnE,EAAOtB,GACrC,MAAM4M,EAAQ5Y,KAAK8qC,kBACnB,KAAKlyB,GAAU5Y,KAAKW,UAAaX,KAAKW,SAASsoC,OAAU37B,GACxD,OAED,MAAMhJ,EAASgJ,EAAMhJ,kBAAkB+tC,QAAU/kC,EAAMhJ,OAAS,KAChE,IAAKA,EACJ,OAED,MAAM8xE,EAAU9xE,EAAOqJ,QAAQ,MAC/B,IAAKyoE,EACJ,OAGD,MAAMrrC,EAAe35B,MAAMC,KAAKuH,EAAMw+C,KAAK5nD,iBAAiB,OACtDu6B,EAAgB34B,MAAMC,KAAKrR,KAAKW,SAASsoC,MAAMz5B,iBAAiB,OAChE0S,EAAQ6oB,EAAahU,QAAQq/C,GAC7BC,EAAWn0D,GAAS,EAAI6nB,EAAc7nB,GAAS,KACrD,IAAKm0D,EACJ,OAGD,GAAa,cAATrqE,GAAiC,aAATA,GAAgC,SAATA,GAA4B,YAATA,EAAoB,CACzF,IAAKhM,KAAKwhE,oBAAoB/yB,QAC7B,OAGD,GAAa,cAATziC,EAAsB,CACzB,MAAMy1D,EAAYzhE,KAAK6rE,iBAAiBwK,GACxC,GAAI5U,EAAY,GAAKzhE,KAAKysE,+BAA+B4J,GACxD,OASD,GAPAr2E,KAAKwhE,oBAAoBC,UAAYA,EACrCzhE,KAAKwhE,oBAAoBE,QAAUD,EACnCzhE,KAAKwhE,oBAAoBG,YAAa,EACtC3hE,KAAKW,SAASQ,UAAUC,IAAI,mBAC5Bi1E,EAAS3mE,aAAa,oBAAqB,KAC3C0mE,EAAQ1mE,aAAa,oBAAqB,KAEtCpC,EAAMyC,aAAc,CACvBzC,EAAMyC,aAAaC,cAAgB,OACnC,IACC1C,EAAMyC,aAAanM,QAAQ,aAAc4C,OAAOi7D,GACjD,CAAE,MAAOryD,GACR,CAEF,CACA,MACD,CAEA,GAAa,aAATpD,EAAqB,CACxB,IAAKhM,KAAKwhE,oBAAoBG,YAAc3hE,KAAKysE,+BAA+B4J,GAC/E,OAED/oE,EAAME,iBACN,MAAMk0D,EAAU1hE,KAAK6rE,iBAAiBwK,GACtC,GAAI3U,EAAU,EACb,OAID,OAFA1hE,KAAKwhE,oBAAoBE,QAAUA,OACnC1hE,KAAK2sE,0BAA0BjL,EAEhC,CAEA,GAAa,SAAT11D,EAAiB,CACpB,IAAKhM,KAAKwhE,oBAAoBG,WAC7B,OAGD,GADAr0D,EAAME,iBACFxN,KAAKysE,+BAA+B4J,GAEvC,YADAr2E,KAAK6sE,0BAGN,MAAMnL,EAAU1hE,KAAK6rE,iBAAiBwK,GACtC,GAAI3U,EAAU,EAEb,YADA1hE,KAAK6sE,0BAGN,MAAMpL,EAAYzhE,KAAKwhE,oBAAoBC,UAG3C,OAFAzhE,KAAK6sE,+BACL7sE,KAAK8sE,uBAAuBrL,EAAWC,EAExC,CAGA,YADA1hE,KAAK6sE,yBAEN,CAEA,GAAa,WAAT7gE,EAAmB,CACtB,MAAMsqE,EAAkBhyE,EAAOqJ,QAAQ,qBACvC,IAAK2oE,EACJ,OAED,MAAMV,EAAkBS,EAAS9uE,cAAc,qBAC/C,IAAKquE,EACJ,OAKD,OAHAA,EAAgB1X,QAAUnmD,QAAQu+D,EAAgBpY,SAClD0X,EAAgB/jD,cAAc,IAAI6D,MAAM,SAAU,CAAEhE,SAAS,UAC7D1xB,KAAK4yE,wBAEN,CAEA,GAAa,UAAT5mE,GACqB1H,EAAOqJ,QAAQ,qBAEtC,OAIF,MAAM4oE,EAAcjyE,EAAOqJ,QAAQ,qBACnC,IAAI6oE,EAAcH,EAClB,GAAIE,EAAa,CAChB,MAAMt/C,EAAMs/C,EAAYhlE,aAAa,mBAC/BklE,EAAcJ,EAAS9uE,cAAc,qBAAqB0vB,OAC5Dw/C,IACHD,EAAcC,EAEhB,MAEC,GADwBnyE,EAAOqJ,QAAQ,qBAClB,CACpB,MAAMioE,EAAkBS,EAAS9uE,cAAc,qBAC3CquE,IACHY,EAAcZ,EAEhB,CAGDY,EAAY3kD,cAAc,IAAI6kD,WAAW,QAAS,CACjDhlD,SAAS,EACTC,YAAY,EACZutB,KAAM7pC,OACNk8B,SAAUx5B,QAAQzK,EAAMikC,UACxBolC,QAAS5+D,QAAQzK,EAAMqpE,SACvBC,OAAQ7+D,QAAQzK,EAAMspE,QACtBC,QAAS9+D,QAAQzK,EAAMupE,YAExB72E,KAAK4yE,wBACN,CAEAh2B,iBAAAA,CAAkBxwB,GACjB,MAAMtlB,EAAO9G,KAAK62C,WAElB,GAAKzqB,EAAKhe,OAMVpO,KAAK6jD,4BAA2B,GAChC7jD,KAAK8jD,kBACLh9C,EAAKhD,UAAYsoB,EAAK9d,KAAKme,GAMnB,OALOzsB,KAAK+2C,QAAQzoC,KAAK09B,IAC/B,MAAMkc,EAAWz7B,GAAOrpB,OAAO+E,UAAUhE,eAAeiE,KAAKqkB,EAAKuf,GAASvf,EAAIuf,GAAS,GAClFmc,EAAWnoD,KAAKq4C,kBAAkBrM,EAAOkc,GAC/C,MAAO,OAAOloD,KAAK8xC,YAAYqW,SAAgB,IAE5B3kC,KAAK,aACvBA,KAAK,IACRxjB,KAAKyxC,+BAhBL,CACC,MAAMtgC,EAAUnR,KAAK4xC,iBAAiB,aAAc,uBACpD5xC,KAAK8hD,gBAAgB3wC,EAAS,QAE/B,CAaD,CAEA2wC,eAAAA,CAAgB3wC,EAASyH,GACxB,MAAM9R,EAAO9G,KAAK62C,WACZhO,EAAU7oC,KAAKw4C,2BACf4P,EAAwB,UAAVxvC,EACjB,mGAAmG5Y,KAAK8xC,YAAY9xC,KAAK4xC,iBAAiB,QAAS,wCACnJ,GACGyW,EAAeroD,KAAKsoD,8BAA8B1vC,GACxD9R,EAAKhD,UAAY,oBAAoB+kC,wBAA8BjwB,8BAAkCyvC,iCAA4CroD,KAAK8xC,YAAY3gC,WAAiBi3C,oBACnL,MAAMG,EAAYzhD,EAAKS,cAAc,sBACrCvH,KAAK6jD,4BAA2B,GAChC7jD,KAAKwoD,cAAc5vC,GACnB5Y,KAAKyoD,uBAAuBF,GAC5BvoD,KAAK0oD,UAAUv3C,GACfnR,KAAKs2C,eACLt2C,KAAKyxC,2BACLzxC,KAAKm5C,8BACN,CAEA4tB,sBAAAA,GACC,IAAK/mE,KAAK82E,kCACT,OAMD,GAJI92E,KAAK8tC,iBACR9tC,KAAK8tC,eAAepQ,UAAY,EAChC19B,KAAK8tC,eAAeD,WAAa,GAEZ,oBAAXx4B,SAA2BrV,KAAKwnC,QAC1C,OAGD,MAAMuvC,EAAY/2E,KAAKg3E,gCACjBhiE,EAAaK,OAAOyxB,aAAezxB,OAAO4hE,SAAW,EAC3D,IAAKpiE,OAAOI,SAAS8hE,GACpB,OAED,GAAI5hE,KAAKuG,IAAIq7D,EAAY/hE,GAAc,EACtC,OAGD,MAAMkiE,EAAoD,mBAAtB7hE,OAAOm+B,YACvCn+B,OAAOm+B,WAAW,oCAAoC3f,QAE1Dxe,OAAO8hE,SAAS,CACfzmE,IAAKyE,KAAKC,IAAI,EAAGD,KAAK2D,MAAMi+D,IAC5BK,SAAUF,EAAuB,OAAS,UAE5C,CAEAF,6BAAAA,GACC,GAAIh3E,KAAKq3E,wCACR,OAAO,EAER,MAAMhnE,EAAOrQ,KAAKwnC,QAAQl3B,wBAC1B,OAAKuE,OAAOI,SAAS5E,EAAKK,KAGnBL,EAAKK,KAAO2E,OAAOyxB,aAAezxB,OAAO4hE,SAAW,GAFnDhoC,GAGT,CAEA6nC,+BAAAA,GACC,MACM5sD,GADalqB,KAAKa,QAAQu5C,YAAc,CAAC,GACrBuR,YAC1B,OAAIzhC,SAGGnS,QAAQmS,EAChB,CAEAmtD,qCAAAA,GACC,MACMntD,GADalqB,KAAKa,QAAQu5C,YAAc,CAAC,GACrBwR,kBAC1B,OAAI1hC,SAGGnS,QAAQmS,EAChB,CAEAuqB,eAAAA,CAAgB7H,GACf,MAAMod,EAAOhqD,KAAKa,QAAQmpD,MAAqC,iBAAtBhqD,KAAKa,QAAQmpD,KACnDhqD,KAAKa,QAAQmpD,KACb,CAAC,EACEstB,EAAc3lE,GAAgBq4C,MAAwC,iBAAzBr4C,GAAgBq4C,KAChEr4C,GAAgBq4C,KAChB,CAAC,EACEutB,EAAY/wE,OAAOxG,KAAKa,QAAQkpD,QAAU,MAAMvkD,cAChDukD,EAASwtB,EAAU/rE,MAAM,KAAK,GAC9BgsE,EAAaF,EAAYC,IAAcD,EAAYvtB,IAAWutB,EAAYr3C,IAAM,CAAC,EACjFw3C,EAAcD,EAAW5qC,IAA2C,iBAAxB4qC,EAAW5qC,GAAwB4qC,EAAW5qC,GAAW,CAAC,EAEtG8qC,EAAY1tB,EAAKutB,IAAcvtB,EAAKD,GACpC4tB,EAAmBD,GAAkC,iBAAdA,GAA0BA,EAAU9qC,IAA0C,iBAAvB8qC,EAAU9qC,GAC3G8qC,EAAU9qC,GACV,CAAC,EAEJ,OAAOxpC,OAAO6C,OAAO,CAAC,EAAGwxE,EAAaE,EACvC,CAEA/lC,gBAAAA,CAAiBnxC,EAAKqzC,GACrB,MACM5vC,EADYlE,KAAKy0C,gBAAgB,SACfh0C,GACxB,MAAwB,iBAAVyD,GAAsBA,EAAMuC,OAASvC,EAAQ4vC,CAC5D,CAEA,0BAAM6N,CAAqBoC,GAC1B,MAAMpK,EAAiB35C,KAAKa,QAAQ+4C,SAAW,CAAC,EAC1CoK,EAAa7uC,KAAKC,IAAI,EAAGP,OAAOw3B,SAASsN,EAAesK,SAAU,KAAO,GAC/E,GAAID,GAAc,EACjB,OAGD,MACME,EAAYF,GADFnhB,KAAKmL,MAAQ+V,GAEzBG,GAAa,SAIX,IAAI99B,SAASuU,GAAYp1B,WAAWo1B,EAASupB,IACpD,CAEAqhB,kBAAAA,GACC,IAAKvlE,KAAKo0C,qBAAuBp0C,KAAKq0C,eAAiBr0C,KAAKwnC,QAC3D,OAED,MAAMlf,EAAOjb,SAAS2K,cAAc,OACpCsQ,EAAKxF,UAAY,eACjBwF,EAAKypB,QAAS,EACd,MAAME,EAASjyC,KAAK8tC,gBAAkB9tC,KAAK8tC,eAAera,gBAAkBzzB,KAAKwnC,QAC9ExnC,KAAK8tC,eACL9tC,KAAKW,SACRX,KAAKwnC,QAAQ72B,aAAa2X,EAAM2pB,GAChCjyC,KAAKq0C,aAAe/rB,CACrB,EAIDllB,OAAO6C,OACN26D,GAAez4D,UACfsgC,GACA6H,GACA4D,GACA0jC,GACAp9B,GACA2J,GACA0zB,IAGDr2E,EAAAA,EAAaC,GAAG4L,SAAU,oBAAoB,KAC7CuzD,GAAe34D,SAAS,IAGzB,0BChvHA,MACM6vE,GAAe,wCACfC,GAAqB,oBACrBC,GAAqB,oBAIrBpZ,GAAsB,CACxBqB,SAAU,aACVC,SAAU,aACVK,WAAY,gBAGhB,MAAM0X,GACF,oBAAOC,GAIH,OAHKl4E,KAAKm4E,cACNn4E,KAAKm4E,YAAc,IAAIC,SAEpBp4E,KAAKm4E,WAChB,CAEA,oBAAOE,GAIH,OAHKr4E,KAAKs4E,cACNt4E,KAAKs4E,YAAc,IAAIrnB,SAEpBjxD,KAAKs4E,WAChB,CAEA,cAAOrwE,GACYmJ,MAAMC,KAAKhE,SAASmC,iBA7BpB,oBA8BRpN,SAAS+pB,IACZ,IAAKnsB,KAAKu4E,mBAAmBpsD,GACzB,OAGJ,MAAMqsD,EAAYx4E,KAAKk4E,gBACvB,GAAIM,EAAU1vD,IAAIqD,GAGd,OAFAnsB,KAAKy4E,eAAetsD,QACpBnsB,KAAK04E,gBAAgBvsD,GAIzBqsD,EAAUp3E,IAAI+qB,GACdnsB,KAAK24E,MAAMxsD,GACXnsB,KAAKy4E,eAAetsD,GACpBnsB,KAAK04E,gBAAgBvsD,EAAM,GAEnC,CAEA,YAAOwsD,CAAMxsD,GACTA,EAAMvc,iBAAiB,UAAWtC,IAC9B,MAAMsrE,EAAWtrE,EAAMhJ,OAAOqJ,QAAQqqE,IACtC,GAAIY,EAMA,OALA54E,KAAK64E,WAAW1sD,EAAOpU,QAAQ6gE,EAAS1a,UACxCl+D,KAAKy4E,eAAetsD,QACpBnsB,KAAKy7D,MAAMtvC,EAAO,WAAYnsB,KAAK84E,qBAAqB3sD,EAAO,CAC3D+xC,QAASnmD,QAAQ6gE,EAAS1a,YAKlC,MAAM6a,EAAczrE,EAAMhJ,OAAOqJ,QAAQoqE,IACzC,IAAKgB,EACD,OAGJ/4E,KAAKy4E,eAAetsD,GACpB,MAAMM,EAAMssD,EAAYprE,QAAQ,MAChC3N,KAAKy7D,MAAMtvC,EAAO,WAAYnsB,KAAK84E,qBAAqB3sD,EAAO,CAC3D+xC,QAASnmD,QAAQghE,EAAY7a,SAC7BzxC,IAAKzsB,KAAKg5E,eAAe7sD,EAAOM,KACjC,IAGPN,EAAMvc,iBAAiB,aAActC,IACjCtN,KAAKi5E,oBAAoB9sD,EAAO7e,EAAM,IAE1C6e,EAAMvc,iBAAiB,YAAatC,IAChCtN,KAAKk5E,mBAAmB/sD,EAAO7e,EAAM,IAEzC6e,EAAMvc,iBAAiB,QAAStC,IAC5BtN,KAAKm5E,eAAehtD,EAAO7e,EAAM,IAErC6e,EAAMvc,iBAAiB,WAAW,KAC9B5P,KAAKo5E,mBAAmBjtD,EAAM,IAGlC,MAAMktD,EAAcr5E,KAAKs5E,gBAAgBntD,GACzCA,EAAMvc,iBAAiB,GAAGypE,gBAA0B,KAChDr5E,KAAKy4E,eAAetsD,GACpBnsB,KAAK04E,gBAAgBvsD,EAAM,GAEnC,CAEA,iBAAO0sD,CAAW1sD,EAAO+xC,GACrB9sD,MAAMC,KAAK8a,EAAM3c,iBAAiB,GAAGsoE,MAAgBC,OAAuB31E,SAASkmB,IACjFA,EAAK41C,QAAUA,CAAO,GAE9B,CAEA,qBAAOua,CAAetsD,GAClB,MAAMotD,EAAgBnoE,MAAMC,KAAK8a,EAAM3c,iBAAiB,GAAGsoE,MAAgBC,OACrE/wD,EAAQuyD,EAAcnrE,OACtBg3B,EAAWm0C,EAAct3E,QAAQqmB,GAASA,EAAK41C,UAAS9vD,OACxDwqE,EAAWzsD,EAAM5kB,cAAcywE,IAChCY,IAGLA,EAAS1a,QAAUl3C,EAAQ,GAAKoe,IAAape,EAC7C4xD,EAAS9C,cAAgB1wC,EAAW,GAAKA,EAAWpe,EACxD,CAEA,2BAAO8xD,CAAqB3sD,EAAOqtD,EAAQ,CAAC,GACxC,MAAMD,EAAgBnoE,MAAMC,KAAK8a,EAAM3c,iBAAiB,GAAGsoE,MAAgBC,OACrE/wD,EAAQuyD,EAAcnrE,OACtBg3B,EAAWm0C,EAAct3E,QAAQqmB,GAASA,EAAK41C,UAAS9vD,OAC9D,OAAOhL,OAAO6C,OAAO,CAAE+gB,QAAOoe,YAAYo0C,EAC9C,CAEA,yBAAOjB,CAAmBpsD,GACtB,MAAMstD,EAAkBz5E,KAAK05E,oBAAoB15E,KAAK25E,kBAAkBxtD,IACxE,QAA+BplB,IAA3B0yE,EAAgBt5E,OAChB,OAAO4X,QAAQ0hE,EAAgBt5E,QAEnC,MAAMgqE,EAAch+C,EAAM5a,aAAa,wBACvC,OAAoB,OAAhB44D,GAGGnqE,KAAK45E,WAAWzP,GAAa,EACxC,CAEA,2BAAO0P,CAAqB1tD,GACxB,MAAMstD,EAAkBz5E,KAAK05E,oBAAoB15E,KAAK25E,kBAAkBxtD,IAClEg+C,EAAch+C,EAAM5a,aAAa,2BACvC,OAAoB,OAAhB44D,EACOnqE,KAAK45E,WAAWzP,GAAa,QAELpjE,IAA/B0yE,EAAgBnrB,YACTv2C,QAAQ0hE,EAAgBnrB,WAGvC,CAEA,yBAAOwrB,CAAmB3tD,GACtB,MAAMstD,EAAkBz5E,KAAK05E,oBAAoB15E,KAAK25E,kBAAkBxtD,IAClE4tD,EAAW5tD,EAAM5a,aAAa,yBAEpC,MAAgB,WADH/K,OAAoB,OAAbuzE,EAAoBA,EAAWN,EAAgBlrB,gBAAkB,OAAO9nD,OAAOjB,cACxE,SAAW,KAC1C,CAEA,mCAAOw0E,CAA6B7tD,GAChC,MAAMstD,EAAkBz5E,KAAK05E,oBAAoB15E,KAAK25E,kBAAkBxtD,IAClE07B,EAAerhD,OAAO2lB,EAAM5a,aAAa,qCAAuC,IAAI9K,OACpFwzE,EAAiBzzE,OAAOizE,EAAgBjrB,0BAA4B,IAAI/nD,OAC9E,OAAOohD,GAAgBoyB,GAtJa,2BAuJxC,CAEA,sBAAOvB,CAAgBvsD,GACnB,MAAMsiB,EAAUzuC,KAAK65E,qBAAqB1tD,GACpCtC,EAAO7pB,KAAK85E,mBAAmB3tD,GAC/B+tD,EAAiBl6E,KAAKg6E,6BAA6B7tD,GAC5C/a,MAAMC,KAAK8a,EAAM3c,iBAAiBsoE,KAE1C11E,SAASqqB,IACV,MAAM0tD,EAAU/oE,MAAMC,KAAKob,EAAIjd,iBAAiB0qE,IAChD,IAAKzrC,EAKD,OAJAhiB,EAAI0F,gBAAgB,oBACpB1F,EAAI0F,gBAAgB,yBACpB1F,EAAI/c,aAAa,YAAa,cAC9ByqE,EAAQ/3E,SAAS0L,GAAWA,EAAO4B,aAAa,YAAa,WAIjE+c,EAAI/c,aAAa,mBAAoB,KACrC+c,EAAI/c,aAAa,wBAAyBma,GAC1C4C,EAAI/c,aAAa,YAAsB,QAATma,EAAiB,OAAS,SACxDswD,EAAQ/3E,SAAS0L,GAAWA,EAAO4B,aAAa,YAAsB,WAATma,EAAoB,OAAS,UAAS,IAGlG4kB,GACDzuC,KAAKo5E,mBAAmBjtD,EAEhC,CAEA,uBAAOiuD,CAAiBjuD,GACpB,MAAMkuD,EAAQr6E,KAAKq4E,gBASnB,OARKgC,EAAMvxD,IAAIqD,IACXkuD,EAAMz3E,IAAIupB,EAAO,CACbmuD,QAAS,KACT7Y,WAAY,EACZ8Y,QAAS,KACTC,WAAW,IAGZH,EAAMp3E,IAAIkpB,EACrB,CAEA,yBAAOitD,CAAmBjtD,GACtB,MAAMvT,EAAQ5Y,KAAKo6E,iBAAiBjuD,GACpC/a,MAAMC,KAAK8a,EAAM3c,iBAAiB,GAAGsoE,0BAAoCA,2BAAqC11E,SAASqqB,IACnHA,EAAI0F,gBAAgB,qBACpB1F,EAAI0F,gBAAgB,qBAAqB,IAE7CvZ,EAAM0hE,QAAU,KAChB1hE,EAAM6oD,WAAa,EACnB7oD,EAAM2hE,QAAU,KAChB3hE,EAAM4hE,WAAY,CACtB,CAEA,0BAAOvB,CAAoB9sD,EAAO7e,GAC9B,IAAKtN,KAAK65E,qBAAqB1tD,GAC3B,OAGJ,MAAMM,EAAMnf,EAAMhJ,QAAUgJ,EAAMhJ,OAAOqJ,QAAUL,EAAMhJ,OAAOqJ,QAAQ,GAAGmqE,4BAAwC,KACnH,IAAKrrD,IAAQN,EAAM9qB,SAASorB,GACxB,OAIJ,GAAa,WADAzsB,KAAK85E,mBAAmB3tD,GACd,CACnB,MAAM+tD,EAAiBl6E,KAAKg6E,6BAA6B7tD,GAEzD,IADqBpU,QAAQzK,EAAMhJ,QAAUgJ,EAAMhJ,OAAOqJ,SAAWL,EAAMhJ,OAAOqJ,QAAQusE,IAGtF,YADA5sE,EAAME,gBAGd,MAAO,GAAIF,EAAMhJ,QAAUgJ,EAAMhJ,OAAOqJ,SAAWL,EAAMhJ,OAAOqJ,QA9NpC,gEAgOxB,YADAL,EAAME,iBAIV,MAAMoL,EAAQ5Y,KAAKo6E,iBAAiBjuD,GACpCvT,EAAM0hE,QAAU7tD,EAChB7T,EAAM6oD,UAAYzhE,KAAKy6E,iBAAiBtuD,EAAOM,GAC/C7T,EAAM2hE,QAAU,KAChB3hE,EAAM4hE,WAAY,EAClB/tD,EAAI/c,aAAa,oBAAqB,KAElCpC,EAAMyC,eACNzC,EAAMyC,aAAaC,cAAgB,OACnC1C,EAAMyC,aAAanM,QAAQ,aAAc,eAEjD,CAEA,yBAAOs1E,CAAmB/sD,EAAO7e,GAC7B,MAAMsL,EAAQ5Y,KAAKo6E,iBAAiBjuD,GACpC,IAAKvT,EAAM0hE,QACP,OAGJ,MAAM7tD,EAAMnf,EAAMhJ,QAAUgJ,EAAMhJ,OAAOqJ,QAAUL,EAAMhJ,OAAOqJ,QAAQ,GAAGmqE,4BAAwC,KACnH,IAAKrrD,IAAQN,EAAM9qB,SAASorB,GACxB,OAGJnf,EAAME,iBACN,MAAM6C,EAAOoc,EAAInc,wBACXoqE,EAAcptE,EAAMmD,QAAUJ,EAAKK,IAAOL,EAAKG,OAAS,EAC9DoI,EAAM2hE,QAAU9tD,EAChB7T,EAAM4hE,UAAYE,EAElBtpE,MAAMC,KAAK8a,EAAM3c,iBAAiB,GAAGsoE,2BAAqC11E,SAASkmB,IAC/EA,EAAK6J,gBAAgB,qBAAqB,IAE1C1F,IAAQ7T,EAAM0hE,SACd7tD,EAAI/c,aAAa,qBAAsBgrE,EAAc,QAAU,SAEvE,CAEA,qBAAOvB,CAAehtD,EAAO7e,GACzB,MAAMsL,EAAQ5Y,KAAKo6E,iBAAiBjuD,GACpC,IAAKvT,EAAM0hE,QACP,OAGJhtE,EAAME,iBACN,MAAMmtE,EAAY/hE,EAAM2hE,QACxB,IAAKI,IAAcxuD,EAAM9qB,SAASs5E,GAE9B,YADA36E,KAAKo5E,mBAAmBjtD,GAK5B,IADcnsB,KAAK46E,SAASzuD,EAAOvT,EAAM0hE,QAASK,EAAW/hE,EAAM4hE,WAG/D,YADAx6E,KAAKo5E,mBAAmBjtD,GAI5B,MAAMu1C,EAAU1hE,KAAKy6E,iBAAiBtuD,EAAOvT,EAAM0hE,SACnDt6E,KAAKy4E,eAAetsD,GACpBnsB,KAAKy7D,MAAMtvC,EAAO,aAAc,CAC5BM,IAAKzsB,KAAKg5E,eAAe7sD,EAAOvT,EAAM0hE,SACtC7Y,UAAW7oD,EAAM6oD,UACjBC,UACAmZ,UAAW76E,KAAK86E,sBAAsB3uD,EAAOvT,EAAM0hE,QAAS,QAC5DS,SAAU/6E,KAAK86E,sBAAsB3uD,EAAOvT,EAAM0hE,QAAS,UAE/Dt6E,KAAKo5E,mBAAmBjtD,EAC5B,CAEA,eAAOyuD,CAASzuD,EAAOmuD,EAASK,EAAWD,GACvC,MAAM5zE,EAAOqlB,EAAMugB,SAAWvgB,EAAMugB,QAAQ,GAAKvgB,EAAMugB,QAAQ,GAAK,KACpE,SAAK5lC,GAASwzE,GAAYK,GAAaL,IAAYK,KAI/CD,EACIC,EAAU/pE,cAAgB0pE,IAG9BxzE,EAAK6J,aAAa2pE,EAASK,EAAU/pE,cAC9B,GAGP0pE,EAAQ1pE,cAAgB+pE,IAG5B7zE,EAAK6J,aAAa2pE,EAASK,IACpB,GACX,CAEA,uBAAOF,CAAiBtuD,EAAOM,GAC3B,MAAM3lB,EAAOqlB,EAAMugB,SAAWvgB,EAAMugB,QAAQ,GAAKvgB,EAAMugB,QAAQ,GAAK,KACpE,OAAK5lC,GAAS2lB,EAGPrb,MAAMC,KAAKvK,EAAKslB,MAAM2K,QAAQtK,IAFzB,CAGhB,CAEA,4BAAOquD,CAAsB3uD,EAAOM,EAAK7Q,GACrC,IAAK6Q,EACD,OAAO,KAEX,MAAMkH,EAAwB,SAAd/X,EAAuB6Q,EAAIsH,uBAAyBtH,EAAImH,mBACxE,OAAKD,GAA+B,OAApBA,EAAQpmB,QAGjBvN,KAAKg5E,eAAe7sD,EAAOwH,GAFvB,IAGf,CAEA,qBAAOqlD,CAAe7sD,EAAOM,GACzB,IAAKA,EACD,OAAO,KAEX,MAAM7lB,EAAUwK,MAAMC,KAAK8a,EAAM3c,iBAAiB,aAAalB,KAAKqe,GAASnmB,OAAOmmB,EAAK9T,aAAe,IAAIpS,SACtGimB,EAAQtb,MAAMC,KAAKob,EAAIC,OAAS,IAAIpe,KAAKqe,GAASnmB,OAAOmmB,EAAK9T,aAAe,IAAIpS,SACvF,MAAO,CACHyb,MAAOliB,KAAKy6E,iBAAiBtuD,EAAOM,GACpC7lB,UACA8lB,QACAzoB,OAAQ2C,EAAQmb,QAAO,CAACgG,EAAKtnB,EAAKq2B,KAE9B/O,EADmBtnB,GAAO,OAAOq2B,KACfpK,EAAMoK,IAAQ,GACzB/O,IACR,CAAC,GAEZ,CAEA,YAAO0zC,CAAMtvC,EAAOX,EAAQjH,EAAU,CAAC,GACnC,MAAMi+C,EAAmBh8D,OAAOglB,GAAU,IAAIhmB,cAAciB,OAC5D,IAAK+7D,EACD,OAGJ,MAAMjiD,EAAWvgB,KAAK25E,kBAAkBxtD,GAClCyF,EAASxuB,OAAO6C,OAAO,CACzBulB,OAAQg3C,EACRr2C,QACAs2C,SAAU1qD,QAAQwI,GAAYA,EAAS+zB,YACxC/vB,GAEGkqC,EAAYluC,GAAYA,EAAS1f,SAAW0f,EAAS1f,QAAQ4tD,WAAmD,iBAA/BluC,EAAS1f,QAAQ4tD,UAClGluC,EAAS1f,QAAQ4tD,UACjB,CAAC,EACDkU,EAAe/D,GAAoB4D,IAAqB,GACxDj/D,EAAWo/D,EAAelU,EAAUkU,GAAgB,KAClC,mBAAbp/D,GACPA,EAASquB,EAAQrR,GAGrB,MAAMwM,EAASxM,GAAYA,EAAS1f,SAAW0f,EAAS1f,QAAQksB,OAASxM,EAAS1f,QAAQksB,OAAS,CAAC,EAEpG,QADkChmB,IAAlBgmB,EAAO5sB,SAA8B4X,QAAQgV,EAAO5sB,SACtB,mBAAvBkV,OAAOoc,YAC1B,OAGJ,MAAMgxB,EAASj8C,OAAOumB,EAAO01B,QAAU,QAAQh8C,QAAU,OACnDirB,OAA6B3qB,IAAnBgmB,EAAO2E,SAA+B3Z,QAAQgV,EAAO2E,SACrEvF,EAAM0F,cAAc,IAAIJ,YAAY,GAAGgxB,KAAU+f,IAAoB,CACjE5wC,SACAF,YAER,CAEA,0BAAOgoD,CAAoBn5D,EAAW,MAClC,MAAMuZ,EAAUvZ,GAAY,KAC5B,OAAOuZ,GAAWA,EAAQj5B,SAAWi5B,EAAQj5B,QAAQwtD,UAAgD,iBAA7Bv0B,EAAQj5B,QAAQwtD,SAClFv0B,EAAQj5B,QAAQwtD,SAChB,CAAC,CACX,CAEA,wBAAOsrB,CAAkBxtD,GACrB,OAAKA,EAGExpB,GAAAA,EAAKM,IAAIkpB,EAhZD,mBA8YJ,IAGf,CAEA,sBAAOmtD,CAAgBntD,GACnB,MAAM5L,EAAWvgB,KAAK25E,kBAAkBxtD,GAClCY,EAASxM,GAAYA,EAAS1f,SAAW0f,EAAS1f,QAAQksB,OAASxM,EAAS1f,QAAQksB,OAAS,CAAC,EACpG,OAAOvmB,OAAOumB,EAAO01B,QAAU,QAAQh8C,QAAU,MACrD,CAEA,iBAAOmzE,CAAW11E,EAAO4vC,GAAW,GAChC,GAAI5vC,QACA,OAAO4vC,EAEX,MAAM7wB,EAAazc,OAAOtC,GAAOsB,cAAciB,OAC/C,MAAmB,MAAfwc,GAAqC,SAAfA,GAAwC,QAAfA,GAAuC,OAAfA,GAGxD,MAAfA,GAAqC,UAAfA,GAAyC,OAAfA,GAAsC,QAAfA,GAGpE6wB,CACX,EAGJtyC,EAAAA,EAAaC,GAAG4L,SAAU,oBAAoB,KAC1C4qE,GAAShwE,SAAS,IAGtB,MCrbM0J,GAAkB,CACvBqpE,cAAe,sBACfC,gBAAiB,cACjBC,eAAgB,4BAChBC,eAAgB,4BAChBC,WAAY,oBACZC,eAAgB,4BAChBC,kBAAmB,+BACnBC,wBAAyB,sCACzBC,uBAAwB,sCAsSzB,GAnSA,MACCj7E,WAAAA,CAAYC,EAASmF,EAAU,CAAC,GAC/B3F,KAAKW,SAAWH,EAChBR,KAAKoS,SAAWhP,OAAO6C,OAAO,CAAC,EAAG0L,GAAiBhM,EACpD,CAEA81E,WAAAA,GACC,IAAKz7E,KAAKW,SACT,MAAO,GAGR,MAAM+6E,EAAW17E,KAAKW,SAAS4Q,aAAavR,KAAKoS,SAAS4oE,eAC1D,MAA2B,iBAAbU,EAAwBA,EAASj1E,OAAS,EACzD,CAEAi2D,SAAAA,GACC,IAAK18D,KAAKW,SACT,MAAO,GAGR,MAAMg7E,EAAY37E,KAAKW,SAAS4Q,aAAavR,KAAKoS,SAAS6oE,iBAC3D,MAAyB,iBAAdU,GAA2BA,EAAUl1E,OAIzCk1E,EACLnwE,MAAM,KACN8C,KAAI09B,GAASA,EAAMvlC,SACnBxE,QAAO+pC,GAASA,GAAS,mBAAmB1U,KAAK0U,KAN3C,EAOT,CAEA4vC,gBAAAA,CAAiB1vE,GAChB,IAAKA,GAAiB,MAATA,GAAgB,gBAAgBorB,KAAKprB,GACjD,MAAO,CAAE2vE,SAAS,EAAOC,QAAS,MAGnC,IACC,MAAMlpC,EAAS,IAAInvB,IAAIvX,EAAMmJ,OAAOqO,SAASC,QACvCo4D,EAAWnpC,EAAOmpC,SAExB,IAAK,CAAC,QAAS,SAAU,QAAS,SAASrwE,SAASqwE,GACnD,MAAO,CAAEF,SAAS,EAAOC,QAAS,MAGnC,GAAiB,UAAbC,GAAqC,UAAbA,EAC3B,MAAO,CAAEF,SAAS,EAAMC,QAASlpC,GAGlC,MACMopC,GADWppC,EAAOrV,UAAY,IACV/xB,MAAM,KAAKvJ,OAAO8V,SAAStM,OAAS,GAC9D,OAAKuwE,GAAaA,EAAStwE,SAAS,KAI7B,CAAEmwE,SAAS,EAAMC,QAASlpC,GAHzB,CAAEipC,SAAS,EAAOC,QAAS,KAIpC,CAAE,MACD,MAAO,CAAED,SAAS,EAAOC,QAAS,KACnC,CACD,CAEAG,SAAAA,CAAUJ,GACJ77E,KAAKW,WAIVX,KAAKW,SAAS+O,aAAa1P,KAAKoS,SAAS8oE,eAAgBW,EAAU,OAAS,SAExEA,EACH77E,KAAKW,SAASwxB,gBAAgBnyB,KAAKoS,SAAS+oE,gBAI7Cn7E,KAAKW,SAAS+O,aAAa1P,KAAKoS,SAAS+oE,eAAgBn7E,KAAKoS,SAASgpE,YACxE,CAEAc,qBAAAA,CAAsBvgD,EAAS,IAC9B,OAAK37B,KAAKW,UAAayQ,MAAMiP,QAAQsb,IAAYA,EAAOvtB,OAIjDutB,EAAO5Z,QAAO,CAACgG,EAAKikB,KAC1BjkB,EAAIikB,GAAShsC,KAAKW,SAAS4G,cAAc,IAAIvH,KAAKm8E,iBAAiBnwC,MAC5DjkB,IACL,CAAC,GANI,CAAC,CAOV,CAEAq0D,kBAAAA,CAAmBC,EAAY,CAAC,GAC/B,IAAKr8E,KAAKW,SACT,OAG4BX,KAAKW,SAAS6O,iBAAiB,IAAIxP,KAAKoS,SAASipE,mBACzDj5E,SAASkmB,IAC7BA,EAAK6J,gBAAgBnyB,KAAKoS,SAASipE,gBACnC/yD,EAAK5Y,aAAa1P,KAAKoS,SAASkpE,kBAAmB,QAAQ,IAG5D,MAAMgB,EAAiB,GACjBC,EAAgB,GAEtBn5E,OAAOonB,QAAQ6xD,GAAWj6E,SAAQ,EAAE4pC,EAAO1jB,MACrCA,GAKLA,EAAK5Y,aAAa1P,KAAKoS,SAASipE,eAAgBrvC,GAChD1jB,EAAK5Y,aAAa1P,KAAKoS,SAASkpE,kBAAmB,QACnDgB,EAAe3kE,KAAKq0B,IANnBuwC,EAAc5kE,KAAKq0B,EAMM,IAGvBswC,EAAeluE,OAClBpO,KAAKW,SAAS+O,aAAa1P,KAAKoS,SAASmpE,wBAAyBe,EAAe94D,KAAK,MAEtFxjB,KAAKW,SAASwxB,gBAAgBnyB,KAAKoS,SAASmpE,yBAGzCgB,EAAcnuE,OACjBpO,KAAKW,SAAS+O,aAAa1P,KAAKoS,SAASopE,uBAAwBe,EAAc/4D,KAAK,MAEpFxjB,KAAKW,SAASwxB,gBAAgBnyB,KAAKoS,SAASopE,uBAE9C,CAEAW,gBAAAA,CAAiBj4E,GAChB,OAAImR,OAAO8d,KAAoC,mBAAtB9d,OAAO8d,IAAIC,OAC5B/d,OAAO8d,IAAIC,OAAOlvB,GAGnBsC,OAAOtC,GAAOkkB,QAAQ,yCAA0C,OACxE,CAEAo0D,WAAAA,CAAYtwE,GACX,MAAMuwE,EAAiC,iBAATvwE,EAAoBA,EAAKzF,OAAS,GAUhE,IAAKg2E,EACJ,MAVgB,CAChB9wE,KAAM,GACNM,IAAK,GACLywE,aAAc,GACdC,SAAS,EACTC,UAAW,KACXC,SAAU,IAOX,IACC,MAAMC,EAAY,IAAIr5D,IAAIg5D,EAAgBpnE,OAAOqO,SAASC,QACpD4Z,EAAWu/C,EAAUv/C,UAAY,GACjCx6B,EAAS+5E,EAAUj5D,aACnB64D,EAAe18E,KAAK+8E,kBAAkBh6E,GAC5C,IAAIi5E,EAAWvnD,mBAAmB8I,EAAS/xB,MAAM,KAAKC,OAAS,IAG1DuwE,GAAaA,EAAStwE,SAAS,OACnCswE,EAAWU,GAAgBV,GAG5B,MAAM/vE,EAAM+vE,EAAStwE,SAAS,KAAO,IAAIswE,EAASxwE,MAAM,KAAKC,OAAS,KAAO,GACvEmxE,EAAY58E,KAAKg9E,UAAUj6E,GAC3Bk6E,EAAa,CAAC,OAAQ,OAAQ,OAAQ,QAAS,OAAQ,OAAQ,OAAQ,QAAS,OAAQ,OAAQ,QAEtG,MAAO,CACNtxE,KAAMqwE,EACN/vE,IAAKA,EAAIzG,cACTk3E,eACAC,QAASM,EAAWvxE,SAASO,EAAIzG,eACjCo3E,YACAC,SAAU78E,KAAKk9E,YAAYN,GAE7B,CAAE,MACD,MAAMO,EAAYV,EAAejxE,MAAM,KAAK,GAAGA,MAAM,KAAK,GAC1D,IAAIwwE,EAAWvnD,mBAAmB0oD,EAAU3xE,MAAM,KAAKC,OAAS,IAChE,MAAMixE,EAAe18E,KAAK+8E,kBAAkB,MACvCf,GAAaA,EAAStwE,SAAS,OACnCswE,EAAWU,GAAgBV,GAE5B,MAAM/vE,EAAM+vE,EAAStwE,SAAS,KAAO,IAAIswE,EAASxwE,MAAM,KAAKC,OAAS,KAAO,GACvEmxE,EAAY58E,KAAKg9E,UAAU,MAEjC,MAAO,CACNrxE,KAAMqwE,EACN/vE,IAAKA,EAAIzG,cACTk3E,aAAcA,GAAgB,GAC9BC,SAAS,EACTC,YACAC,SAAU78E,KAAKk9E,YAAYN,GAE7B,CACD,CAEAG,iBAAAA,CAAkBl5D,GACjB,MAAMu5D,EAAWp9E,KAAKW,UAAU4Q,aAAa,uBACzCvR,KAAKW,UAAU4Q,aAAa,sCAC5B,GACJ,GAAI6rE,EACH,OAAO52E,OAAO42E,GAAU32E,OAGzB,MAAMmd,EAAO,CAAC,gBAAiB,eAAgB,WAAY,QAC3D,IAAK,MAAMnjB,KAAOmjB,EAAM,CACvB,MAAM1f,EAAQ2f,EAAa5gB,IAAIxC,GAC/B,GAAIyD,EACH,OAAOsC,OAAOtC,GAAOuC,MAEvB,CAEA,MAAO,EACR,CAEAu2E,SAAAA,CAAUn5D,GACT,MAAMw5D,EAAiB,CACtBr9E,KAAKW,UAAU4Q,aAAa,aAC5BvR,KAAKW,UAAU4Q,aAAa,6BAG7B,IAAK,MAAMrN,KAASm5E,EAAgB,CACnC,MAAMzqC,EAAS5yC,KAAKs9E,gBAAgBp5E,GACpC,GAAe,OAAX0uC,EACH,OAAOA,CAET,CAEA,IAAK/uB,EACJ,OAAO,KAGR,MAAMD,EAAO,CAAC,OAAQ,aAAc,SACpC,IAAK,MAAMnjB,KAAOmjB,EAAM,CACvB,MAAM1f,EAAQ2f,EAAa5gB,IAAIxC,GACzBmyC,EAAS5yC,KAAKs9E,gBAAgBp5E,GACpC,GAAe,OAAX0uC,EACH,OAAOA,CAET,CAEA,OAAO,IACR,CAEA0qC,eAAAA,CAAgBp5E,GACf,GAAIA,QACH,OAAO,KAGR,MAAM+e,EAAazc,OAAOtC,GAAOuC,OAAOjB,cACxC,IAAKyd,EACJ,OAAO,KAGR,MAAMiK,EAAQjK,EAAWiK,MAAM,yCAC/B,IAAKA,EACJ,OAAO,KAGR,MAAMqwD,EAAS1oE,OAAOC,WAAWoY,EAAM,IACvC,IAAKrY,OAAOI,SAASsoE,IAAWA,EAAS,EACxC,OAAO,KAGR,MAAMC,GAAQtwD,EAAM,IAAM,KAAK1nB,cAS/B,OAAO2P,KAAK2D,MAAMykE,GARE,CACnBhxC,EAAG,EACHkxC,GAAI,KACJC,GAAI,QACJC,GAAI,WACJC,GAAI,eAGmCJ,IAAS,GAClD,CAEAN,WAAAA,CAAYW,GACX,IAAKhpE,OAAOI,SAAS4oE,IAAUA,EAAQ,EACtC,MAAO,GAGR,MAAMC,EAAQ,CAAC,IAAK,KAAM,KAAM,KAAM,MACtC,IAAI55E,EAAQ25E,EACRE,EAAY,EAEhB,KAAO75E,GAAS,MAAQ65E,EAAYD,EAAM1vE,OAAS,GAClDlK,GAAS,KACT65E,GAAa,EAGd,MAAMC,EAAiB95E,GAAS,KAAqB,IAAd65E,EAAkB,EAAI,EAC7D,MAAO,GAAG75E,EAAMi0C,QAAQ6lC,MAAmBF,EAAMC,IAClD,GC5SKE,GAAmB,IAAIltE,IAAI,CAAC,QAE5BmtE,GAAkBA,CAACL,EAAO/7D,EAAS,KACf,IAAhB+7D,EAAM/7D,KAAmB,IACT,IAApB+7D,EAAM/7D,EAAS,KAAc,IACT,IAApB+7D,EAAM/7D,EAAS,KAAc,EACV,IAApB+7D,EAAM/7D,EAAS,GAGdq8D,GAAaA,CAACj/B,EAAMp9B,EAAQs8D,IAC7BA,EACIF,GAAgB,CACtBh/B,EAAKm/B,SAASv8D,GACdo9B,EAAKm/B,SAASv8D,EAAS,GACvBo9B,EAAKm/B,SAASv8D,EAAS,GACvBo9B,EAAKm/B,SAASv8D,EAAS,IACrB,IAIFo9B,EAAKm/B,SAASv8D,IAAW,GACvBo9B,EAAKm/B,SAASv8D,EAAS,IAAM,GAC7Bo9B,EAAKm/B,SAASv8D,EAAS,IAAM,EAC9Bo9B,EAAKm/B,SAASv8D,EAAS,MACpB,EAGDw8D,GAAaA,CAACT,EAAOU,KAC1B,IAAKV,IAAUA,EAAMzvE,OACpB,MAAO,GAGR,IACC,GAAqB,IAAjBmwE,EACH,OAAO,IAAIC,YAAY,cAAcC,OAAOZ,GAAOz1D,QAAQ,UAAW,IAAI3hB,OAG3E,GAAqB,IAAjB83E,EAAuB,CAC1B,GAAIV,EAAMzvE,QAAU,EAAG,CACtB,MAAMswE,EAAOb,EAAM,GACbc,EAAOd,EAAM,GACnB,GAAa,MAATa,GAA0B,MAATC,EACpB,OAAO,IAAIH,YAAY,YAAYC,OAAOZ,EAAMh8D,MAAM,IAAIuG,QAAQ,UAAW,IAAI3hB,OAElF,GAAa,MAATi4E,GAA0B,MAATC,EAAe,CACnC,MAAMC,EAAU,IAAIC,WAAWhB,EAAMzvE,OAAS,GAC9C,IAAK,IAAI4c,EAAI,EAAGA,EAAI,EAAI6yD,EAAMzvE,OAAQ4c,GAAK,EAC1C4zD,EAAQ5zD,EAAI,GAAK6yD,EAAM7yD,EAAI,GAC3B4zD,EAAQ5zD,EAAI,GAAK6yD,EAAM7yD,GAExB,OAAO,IAAIwzD,YAAY,YAAYC,OAAOG,GAASx2D,QAAQ,UAAW,IAAI3hB,MAC3E,CACD,CAEA,OAAO,IAAI+3E,YAAY,YAAYC,OAAOZ,GAAOz1D,QAAQ,UAAW,IAAI3hB,MACzE,CAEA,GAAqB,IAAjB83E,EAAuB,CAC1B,MAAMK,EAAU,IAAIC,WAAWhB,EAAMzvE,QACrC,IAAK,IAAI4c,EAAI,EAAGA,EAAI,EAAI6yD,EAAMzvE,OAAQ4c,GAAK,EAC1C4zD,EAAQ5zD,GAAK6yD,EAAM7yD,EAAI,GACvB4zD,EAAQ5zD,EAAI,GAAK6yD,EAAM7yD,GAExB,OAAO,IAAIwzD,YAAY,YAAYC,OAAOG,GAASx2D,QAAQ,UAAW,IAAI3hB,MAC3E,CAEA,OAAO,IAAI+3E,YAAY,SAASC,OAAOZ,GAAOz1D,QAAQ,UAAW,IAAI3hB,MACtE,CAAE,MACD,MAAO,EACR,GAGKq4E,GAAqBA,CAACjB,EAAOtoB,EAAOwpB,EAAO,KAChD,IAAK,IAAI/zD,EAAIuqC,EAAOvqC,EAAI6yD,EAAMzvE,OAAQ4c,GAAK+zD,EAC1C,GAAa,IAATA,GACH,GAAI/zD,EAAI,EAAI6yD,EAAMzvE,QAAuB,IAAbyvE,EAAM7yD,IAAgC,IAAjB6yD,EAAM7yD,EAAI,GAC1D,OAAOA,OAEF,GAAiB,IAAb6yD,EAAM7yD,GAChB,OAAOA,EAIT,OAAQ,CAAC,EAGJg0D,GAAaC,IAClB,IAAKA,GAAcA,EAAW7wE,OAAS,EACtC,OAAO,KAGR,MAAM8wE,EAAWD,EAAW,GAC5B,IAAIp4C,EAAM,EAEV,MAAMs4C,EAAUL,GAAmBG,EAAYp4C,GAC/C,GAAIs4C,EAAU,EACb,OAAO,KAER,MAAMC,EAAc,IAAIZ,YAAY,cAAcC,OAAOQ,EAAWp9D,MAAMglB,EAAKs4C,IAAU14E,OAGzF,GAFAogC,EAAMs4C,EAAU,EAEZt4C,GAAOo4C,EAAW7wE,OACrB,OAAO,KAGRy4B,GAAO,EAEP,MAAMw4C,EAAyB,IAAbH,GAAkC,IAAbA,EACjCI,EAAUR,GAAmBG,EAAYp4C,EAAKw4C,EAAY,EAAI,GAKpE,GAJIC,GAAW,IACdz4C,EAAMy4C,GAAWD,EAAY,EAAI,IAG9Bx4C,GAAOo4C,EAAW7wE,OACrB,OAAO,KAGR,MAAMvJ,EAAOo6E,EAAWp9D,MAAMglB,GACxB04C,EAAWH,GAAe,aAChC,OAAKv6E,EAAKuJ,OAIH,CAAEmxE,WAAU16E,QAHX,IAGiB,EA4EpB26E,GAAuBvY,UAC5B,KAAMwY,aAAgBC,MACrB,OAAO,KAGR,MAAMzzE,EAdmBwzE,KACzB,MAAMzD,EAAWx1E,OAAOi5E,GAAM9zE,MAAQ,IAAInG,cACpCm6E,EAAM3D,EAAS4D,YAAY,KACjC,OAAID,EAAM,GAAKA,GAAO3D,EAAS5tE,OAAS,EAChC,GAED4tE,EAASn6D,MAAM89D,EAAM,EAAE,EAQlBE,CAAiBJ,GAC7B,IAAKxB,GAAiBn1D,IAAI7c,GACzB,OAAO,KAGR,IAAKwzE,EAAKlxD,KACT,OAAO,KAGR,IACC,MAAMuxD,EAAQL,EAAK59D,MAAM,EAAG1M,KAAKO,IAAI+pE,EAAKlxD,KAAM,UAE1CqkB,EA1FYmtC,KACnB,MAAMlC,EAAQ,IAAIgB,WAAWkB,GAC7B,GAAIlC,EAAMzvE,OAAS,GAClB,OAAO,KAGR,GAAiB,KAAbyvE,EAAM,IAA4B,KAAbA,EAAM,IAA4B,KAAbA,EAAM,GACnD,OAAO,KAGR,MAAMmC,EAAUnC,EAAM,GACtB,GAAImC,EAAU,GAAKA,EAAU,EAC5B,OAAO,KAGR,MAAMC,EAAU/B,GAAgBL,EAAO,GACjCqC,EAAe/qE,KAAKO,IAAImoE,EAAMzvE,OAAQ6xE,EAAU,IAChD/gC,EAAO,IAAIihC,SAASJ,EAAa,EAAGG,GAE1C,IAAIp+D,EAAS,GACToa,EAAQ,GACRkkD,EAAU,KAEd,KAAOt+D,EAAS,IAAMo+D,GAAc,CACnC,MAAMG,EAAU75E,OAAO85E,aACtBphC,EAAKm/B,SAASv8D,GACdo9B,EAAKm/B,SAASv8D,EAAS,GACvBo9B,EAAKm/B,SAASv8D,EAAS,GACvBo9B,EAAKm/B,SAASv8D,EAAS,IAGxB,IAAKu+D,EAAQ55E,OACZ,MAGD,MAAM85E,EAAYpC,GAAWj/B,EAAMp9B,EAAS,EAAe,IAAZk+D,GAC/C,IAAKO,GAAaA,EAAY,EAC7B,MAGD,MAAMC,EAAiB1+D,EAAS,GAC1B2+D,EAAeD,EAAiBD,EACtC,GAAIE,EAAeP,EAClB,MAGD,MAAMjB,EAAapB,EAAMh8D,MAAM2+D,EAAgBC,GAC/B,SAAZJ,GAAsBpB,EAAW7wE,OAAS,IAC7C8tB,EAAQoiD,GAAWW,EAAWp9D,MAAM,GAAIo9D,EAAW,KAAO/iD,GAG3C,SAAZmkD,GAAuBD,IAC1BA,EAAUpB,GAAUC,IAGrBn9D,EAAS2+D,CACV,CAEA,MAAO,CACNvkD,QACAkkD,UACA,EA6BeM,OADMZ,EAAMC,eAE3B,IAAKntC,EACJ,OAAO,KAGR,MAAMhd,EAAS,CAAC,EAKhB,GAJIgd,EAAO1W,QACVtG,EAAOsG,MAAQ0W,EAAO1W,OAGnB0W,EAAOwtC,SAASv7E,MAAMuJ,OAAQ,CACjC,MAAMuyE,EAAY,IAAIC,KAAK,CAAChuC,EAAOwtC,QAAQv7E,MAAO,CAAEmH,KAAM4mC,EAAOwtC,QAAQb,UAAY,eACrF3pD,EAAOirD,YAAcF,CACtB,CAEA,OAAOv9E,OAAOwgB,KAAKgS,GAAQxnB,OAASwnB,EAAS,IAC9C,CAAE,MACD,OAAO,IACR,GC1OKkrD,GAAmB,IAAI/vE,IAAI,CAChC,MACA,OACA,MACA,MACA,MACA,MACA,QCLD,MAAMgwE,GACLxgF,WAAAA,GACCP,KAAKghF,SAAW,4BACjB,CAEA,kBAAOl5E,GAKN,OAJKi5E,GAAWE,YACfF,GAAWE,UAAY,IAAIF,IAGrBA,GAAWE,SACnB,CAEAt6D,IAAAA,CAAKpC,EAAU,CAAC,GACf,MAAM6G,EAAM5kB,OAAO+d,EAAQ6G,KAAO,IAAI3kB,OACtC,IAAK2kB,EACJ,OAID,GADAprB,KAAKkhF,gBACAlhF,KAAKmhF,SAAWnhF,KAAKohF,OACzB,OAGD,MAAMC,EAAe76E,OAAO+d,EAAQ88D,cAAgB,IAAI56E,OAClDy1B,EAAQ11B,OAAO+d,EAAQ2X,OAAS,IAAIz1B,OAC1CzG,KAAKshF,OAAOzoE,YAAcqjB,GAASmlD,EACnCrhF,KAAKohF,OAAOh2D,IAAMA,EAClBprB,KAAKohF,OAAO/1D,IAAM6Q,GAASmlD,EAE3BrhF,KAAKmhF,OAAO3gE,MACb,CAEA+gE,KAAAA,GACMvhF,KAAKmhF,QAIVnhF,KAAKmhF,OAAOvgE,MACb,CAEAsgE,YAAAA,GACKlhF,KAAKmhF,QAAUnhF,KAAKwwD,OAIxBxwD,KAAKwhF,YACN,CAEAA,UAAAA,GACC,MAAMz+E,EAAS,CACd84B,UAAU,EACVC,SAAS,EACTN,UAAU,EACVxd,UAAU,EACV+d,MAAO,CACNtnB,MAAO,eAER4J,UAAW,CACVle,QAAQ,IAIJshF,EAAUp0E,SAAS2lB,eAAehzB,KAAKghF,UAC7C,GAAIS,EAKH,OAJAzhF,KAAKwwD,MAAQixB,EACbzhF,KAAKmhF,OAAS5lD,EAAQxzB,oBAAoB05E,EAAS1+E,GACnD/C,KAAK0hF,cAAcD,QACnBzhF,KAAK2hF,eAAeF,GAIrBzhF,KAAKmhF,OAAS5lD,EAAQjc,MAAMtf,KAAKghF,SAAUj+E,GAAS6+E,IACnD,MAAMphF,EAAUohF,EAAcjhF,SAC9BX,KAAKwwD,MAAQhwD,EACbA,EAAQW,UAAUC,IAAI,8BAEtB,MAAM0F,EAAOtG,EAAQ+G,cAAc,kBAC7B6Y,EAAU5f,EAAQ+G,cAAc,qBACtC,IAAKT,IAASsZ,EACb,OAGDtZ,EAAK3F,UAAUC,IAAI,oCACnB0F,EAAKhD,UAAY,GAEjB,IAAIwc,EAAS9f,EAAQ+G,cAAc,oBAC9B+Y,IACJA,EAASjT,SAAS2K,cAAc,OAChCsI,EAAOwC,UAAY,kBACnB1C,EAAQ26C,QAAQz6C,IAGjBtgB,KAAKshF,OAASj0E,SAAS2K,cAAc,OACrChY,KAAKshF,OAAOx+D,UAAY,iBACxB9iB,KAAKshF,OAAOzoE,YAAc,GAE1B7Y,KAAKohF,OAAS/zE,SAAS2K,cAAc,OACrChY,KAAKohF,OAAOt+D,UAAY,kCACxB9iB,KAAKohF,OAAOxnC,QAAU,QACtB55C,KAAKohF,OAAOS,SAAW,QAEvBvhE,EAAOgK,YAAYtqB,KAAKshF,QACxBx6E,EAAKwjB,YAAYtqB,KAAKohF,QAEtBphF,KAAK2hF,eAAenhF,EAAQ,GAE9B,CAEAkhF,aAAAA,CAAchiF,GACbM,KAAKshF,OAAS5hF,EAAK6H,cAAc,sCACjCvH,KAAKohF,OAAS1hF,EAAK6H,cAAc,mCAClC,CAEAo6E,cAAAA,CAAejiF,GACTA,IAAQA,EAAKwyB,aAAa,8CAI/BxyB,EAAKgQ,aAAa,2CAA4C,QAC9DhQ,EAAKkQ,iBAAiB,mBAAmB,KACxC5P,KAAK8hF,eAAe,IAEtB,CAEAA,aAAAA,GACK9hF,KAAKmhF,QAAyC,mBAAxBnhF,KAAKmhF,OAAO9+E,SACrCrC,KAAKmhF,OAAO9+E,UAGTrC,KAAKwwD,OAASxwD,KAAKwwD,MAAMpgC,YAC5BpwB,KAAKwwD,MAAMpgC,WAAWy5C,YAAY7pE,KAAKwwD,OAGxCxwD,KAAKwwD,MAAQ,KACbxwD,KAAKmhF,OAAS,KACdnhF,KAAKshF,OAAS,KACdthF,KAAKohF,OAAS,IACf,EAID,YC9IMW,GAAmB,IAAIhxE,IAAI,CAChC,OACA,OACA,QACA,OACA,QACA,OACA,OACA,OACA,QACA,QACA,QACA,UA6ED,GA1EA,MACCxQ,WAAAA,GACCP,KAAK2L,KAAO,QACZ3L,KAAKmhF,OAASJ,GAAWj5E,aAC1B,CAEAk6E,SAAAA,CAAUjgD,EAAU,CAAC,GACpB,MAAM91B,EAAMzF,OAAOu7B,GAASkgD,UAAUh2E,KAAO,IAAIzG,cACjD,OAAOu8E,GAAiBj5D,IAAI7c,EAC7B,CAEAw1B,MAAAA,CAAOM,EAAU,CAAC,GACjB,MAAMpP,EAAYoP,GAASmgD,iBACrBC,EAAWpqE,QAAQgqB,GAASqgD,IAAID,UAChCn4B,EAAOjoB,GAASioB,KAEhB5+B,EAAM2W,GAAS+5C,SAAS3wD,MAAQ4W,GAAS25C,UAAY,GAC3D,IAAKtwD,EACJ,OAAO,EAGR,MAAMi3D,EAAa/0E,IACdA,GACHA,EAAME,iBAGPxN,KAAKmhF,OAAOx6D,KAAK,CAChByE,MACA8Q,MAAO6F,GAASkgD,UAAUt2E,MAAQq+C,GAAM74C,QAAQ,gBAAkB,GAClEkwE,aAAcr3B,GAAM74C,QAAQ,gBAAkB,IAC7C,EAGGmxE,EAAYvgD,GAASvhC,SAAS+G,cAAc,SAC9C+6E,IAAcA,EAAUpwD,aAAa,oCACxCowD,EAAU5yE,aAAa,iCAAkC,QACzD4yE,EAAUnhF,UAAUC,IAAI,qBACxBkhF,EAAU1yE,iBAAiB,QAASyyE,IAGrC,MAAME,EAAYxgD,GAASvhC,SAASmN,QAAQ,UAAUpG,cAAc,6BAOpE,GANIg7E,IAAcA,EAAUrwD,aAAa,oCACxCqwD,EAAU7yE,aAAa,iCAAkC,QACzD6yE,EAAUphF,UAAUC,IAAI,qBACxBmhF,EAAU3yE,iBAAiB,QAASyyE,IAGjCF,EACH,OAAOpqE,QAAQuqE,GAAaC,GAG7B,IAAK5vD,EACJ,OAAO,EAGR,MAAM3R,EAAU3T,SAAS2K,cAAc,UACvCgJ,EAAQhV,KAAO,SACfgV,EAAQ8B,UAAY,+BACpB9B,EAAQnI,YAAcmxC,GAAM1iD,OAAO,eAAiB,GACpD0Z,EAAQpR,iBAAiB,QAASyyE,GAClC1vD,EAAUrI,YAAYtJ,GAEtB,MAAMwhE,EAAYn1E,SAAS2K,cAAc,OAQzC,OAPAwqE,EAAU1/D,UAAY,6BACtB0/D,EAAUp3D,IAAMA,EAChBo3D,EAAUn3D,IAAM0W,GAASkgD,UAAUt2E,MAAQq+C,GAAM74C,QAAQ,wBAA0B,GACnFqxE,EAAU5oC,QAAU,OACpB4oC,EAAU5yE,iBAAiB,QAASyyE,GACpC1vD,EAAUrI,YAAYk4D,IAEf,CACR,GCtFD,MAAMC,GACLliF,WAAAA,GACCP,KAAKghF,SAAW,8BAChBhhF,KAAK0iF,QAAU,CAAC,CACjB,CAEA,kBAAO56E,GAKN,OAJK26E,GAAYxB,YAChBwB,GAAYxB,UAAY,IAAIwB,IAGtBA,GAAYxB,SACpB,CAEAt6D,IAAAA,CAAKpC,EAAU,CAAC,GACf,MAAM6G,EAAM5kB,OAAO+d,EAAQ6G,KAAO,IAAI3kB,OACtC,IAAK2kB,EACJ,OAID,GADAprB,KAAKkhF,gBACAlhF,KAAKmhF,SAAWnhF,KAAK2iF,OACzB,OAGD3iF,KAAK0iF,QAAUn+D,GAASq+D,QAAoC,iBAAnBr+D,EAAQq+D,OAAsBr+D,EAAQq+D,OAAS,CAAC,EACzF5iF,KAAK6iF,KAAOz3D,EACZprB,KAAK8iF,cAAgBt8E,OAAO+d,EAAQw+D,cAAgB,IAAIt8E,OAExD,MAAM46E,EAAe76E,OAAO+d,EAAQ88D,cAAgB,IAAI56E,OAClDy1B,EAAQ11B,OAAO+d,EAAQ2X,OAAS,IAAIz1B,OAC1CzG,KAAKshF,OAAOzoE,YAAcqjB,GAASmlD,EACnCrhF,KAAKgjF,UAAUnqE,YAAc7Y,KAAKijF,OAAO,YACzCjjF,KAAKkjF,UAAUrqE,YAAc7Y,KAAKijF,OAAO,YAEzCjjF,KAAK2iF,OAAOv3D,IAAMprB,KAAKmjF,gBAAgB/3D,GACvCprB,KAAKmhF,OAAO3gE,MACb,CAEA0gE,YAAAA,GACKlhF,KAAKmhF,QAAUnhF,KAAKwwD,OAGxBxwD,KAAKwhF,YACN,CAEAA,UAAAA,GAcCxhF,KAAKmhF,OAAS5lD,EAAQjc,MAAMtf,KAAKghF,SAblB,CACdnlD,UAAU,EACVC,SAAS,EACTN,UAAU,EACVxd,UAAU,EACV+d,MAAO,CACNtnB,MAAO,eAER4J,UAAW,CACVle,QAAQ,KAI0CyhF,IACnD,MAAMphF,EAAUohF,EAAcjhF,SAC9BX,KAAKwwD,MAAQhwD,EACbA,EAAQW,UAAUC,IAAI,+BAEtB,MAAM0F,EAAOtG,EAAQ+G,cAAc,kBAC7B6Y,EAAU5f,EAAQ+G,cAAc,qBACtC,IAAKT,IAASsZ,EACb,OAGDtZ,EAAK3F,UAAUC,IAAI,oCACnB0F,EAAKhD,UAAY,GAEjB,IAAIwc,EAAS9f,EAAQ+G,cAAc,oBAC9B+Y,IACJA,EAASjT,SAAS2K,cAAc,OAChCsI,EAAOwC,UAAY,kBACnB1C,EAAQ26C,QAAQz6C,IAGjBtgB,KAAKshF,OAASj0E,SAAS2K,cAAc,OACrChY,KAAKshF,OAAOx+D,UAAY,iBAExB9iB,KAAK2iF,OAASt1E,SAAS2K,cAAc,UACrChY,KAAK2iF,OAAO7/D,UAAY,qCACxB9iB,KAAK2iF,OAAOjzE,aAAa,QAAS,kBAElC,MAAMoe,EAASzgB,SAAS2K,cAAc,OACtC8V,EAAOhL,UAAY,sCAEnB9iB,KAAKgjF,UAAY31E,SAAS2K,cAAc,QACxChY,KAAKgjF,UAAUlgE,UAAY,oCAE3B9iB,KAAKkjF,UAAY71E,SAAS2K,cAAc,UACxChY,KAAKkjF,UAAUl3E,KAAO,SACtBhM,KAAKkjF,UAAUpgE,UAAY,mCAC3B9iB,KAAKkjF,UAAUtzE,iBAAiB,SAAS,IAAM5P,KAAKojF,kBAEpDt1D,EAAOxD,YAAYtqB,KAAKgjF,WACxBl1D,EAAOxD,YAAYtqB,KAAKkjF,WAExB5iE,EAAOgK,YAAYtqB,KAAKshF,QACxBx6E,EAAKwjB,YAAYtqB,KAAK2iF,QACtBviE,EAAQkK,YAAYwD,GAEpB9tB,KAAK2hF,eAAenhF,EAAQ,GAE9B,CAEA2iF,eAAAA,CAAgB/3D,GACf,MAAMi4D,EAAW,IAAI5/D,IAAI2H,EAAK/V,OAAOqO,SAASC,QAAQwH,KAEtD,MAAO,sDAAgBqwB,mBAAmB6nC,IAC3C,CAEAD,aAAAA,GACC,IAAKpjF,KAAK6iF,KACT,OAGD,MAAMS,EAAOj2E,SAAS2K,cAAc,KACpCsrE,EAAKn4D,KAAOnrB,KAAK6iF,KACb7iF,KAAK8iF,eACRQ,EAAK5zE,aAAa,WAAY1P,KAAK8iF,eAEpCQ,EAAKvvE,MAAM4E,QAAU,OACrBtL,SAASvG,KAAKwjB,YAAYg5D,GAC1BA,EAAKC,QACLl2E,SAASvG,KAAK+iE,YAAYyZ,EAC3B,CAEAL,MAAAA,CAAOxiF,GACN,MAAMyD,EAAQlE,KAAK0iF,UAAUjiF,GAC7B,OAAO+F,OAAOtC,GAAS,IAAIuC,MAC5B,CAEAk7E,cAAAA,CAAejiF,GACTA,IAAQA,EAAKwyB,aAAa,+CAG/BxyB,EAAKgQ,aAAa,4CAA6C,QAC/DhQ,EAAKkQ,iBAAiB,mBAAmB,IAAM5P,KAAK8hF,kBACrD,CAEAA,aAAAA,GACK9hF,KAAKmhF,QAAyC,mBAAxBnhF,KAAKmhF,OAAO9+E,SACrCrC,KAAKmhF,OAAO9+E,UAETrC,KAAKwwD,OAASxwD,KAAKwwD,MAAMpgC,YAC5BpwB,KAAKwwD,MAAMpgC,WAAWy5C,YAAY7pE,KAAKwwD,OAGxCxwD,KAAKwwD,MAAQ,KACbxwD,KAAKmhF,OAAS,KACdnhF,KAAKshF,OAAS,KACdthF,KAAK2iF,OAAS,KACd3iF,KAAKgjF,UAAY,KACjBhjF,KAAKkjF,UAAY,KACjBljF,KAAK0iF,QAAU,KACf1iF,KAAK6iF,KAAO,GACZ7iF,KAAK8iF,cAAgB,EACtB,EAGD,YCrKMU,GAAoB,IAAIzyE,IAAI,CACjC,OACA,QACA,OACA,QACA,OACA,QACA,OACA,OACA,SAmED,GAhEA,MACCxQ,WAAAA,GACCP,KAAK2L,KAAO,SACZ3L,KAAKmhF,OAASsB,GAAY36E,aAC3B,CAEAk6E,SAAAA,CAAUjgD,EAAU,CAAC,GACpB,MAAM91B,EAAMzF,OAAOu7B,GAASkgD,UAAUh2E,KAAO,IAAIzG,cACjD,OAAOg+E,GAAkB16D,IAAI7c,EAC9B,CAEAw1B,MAAAA,CAAOM,EAAU,CAAC,GACjB,MAAMpP,EAAYoP,GAASmgD,iBACrBC,EAAWpqE,QAAQgqB,GAASqgD,IAAID,UAChCn4B,EAAOjoB,GAASioB,KAEhB5+B,EAAM2W,GAAS+5C,SAAS3wD,MAAQ4W,GAAS25C,UAAY,GAC3D,IAAKtwD,EACJ,OAAO,EAGR,MAAMq4D,EAAcn2E,IACfA,GACHA,EAAME,iBAGPxN,KAAKmhF,OAAOx6D,KAAK,CAChByE,MACA8Q,MAAO6F,GAASkgD,UAAUt2E,MAAQq+C,GAAM74C,QAAQ,iBAAmB,GACnEkwE,aAAcr3B,GAAM74C,QAAQ,iBAAmB,GAC/C4xE,aAAchhD,GAASkgD,UAAUvF,cAAgB36C,GAASkgD,UAAUt2E,MAAQ,GAC5Ei3E,OAAQ,CACPc,SAAU15B,GAAM1iD,OAAO,aAAe,GACtCwsC,SAAUkW,GAAM74C,QAAQ,oBAAsB,KAE9C,EAGGmxE,EAAYvgD,GAASvhC,SAAS+G,cAAc,SAOlD,GANI+6E,IAAcA,EAAUpwD,aAAa,qCACxCowD,EAAU5yE,aAAa,kCAAmC,QAC1D4yE,EAAUnhF,UAAUC,IAAI,qBACxBkhF,EAAU1yE,iBAAiB,QAAS6zE,IAGjCtB,EACH,OAAOpqE,QAAQuqE,GAGhB,IAAK3vD,EACJ,OAAO,EAGR,MAAM3R,EAAU3T,SAAS2K,cAAc,UAOvC,OANAgJ,EAAQhV,KAAO,SACfgV,EAAQ8B,UAAY,gCACpB9B,EAAQnI,YAAcmxC,GAAM1iD,OAAO,gBAAkB,GACrD0Z,EAAQpR,iBAAiB,QAAS6zE,GAClC9wD,EAAUrI,YAAYtJ,IAEf,CACR,GCzED,MAAM2iE,GACLpjF,WAAAA,GACCP,KAAKghF,SAAW,2BAChBhhF,KAAK0iF,QAAU,CAAC,EAChB1iF,KAAK6iF,KAAO,GACZ7iF,KAAK8iF,cAAgB,GACrB9iF,KAAK4jF,MAAQ,EACb5jF,KAAK6jF,MAAQ,GACd,CAEA,kBAAO/7E,GAKN,OAJK67E,GAAS1C,YACb0C,GAAS1C,UAAY,IAAI0C,IAGnBA,GAAS1C,SACjB,CAEAt6D,IAAAA,CAAKpC,EAAU,CAAC,GACf,MAAM6G,EAAM5kB,OAAO+d,EAAQ6G,KAAO,IAAI3kB,OACtC,IAAK2kB,EACJ,OAID,GADAprB,KAAKkhF,gBACAlhF,KAAKmhF,SAAWnhF,KAAK2iF,OACzB,OAGD3iF,KAAK0iF,QAAUn+D,GAASq+D,QAAoC,iBAAnBr+D,EAAQq+D,OAAsBr+D,EAAQq+D,OAAS,CAAC,EACzF5iF,KAAK6iF,KAAOz3D,EACZprB,KAAK8iF,cAAgBt8E,OAAO+d,EAAQw+D,cAAgB,IAAIt8E,OACxDzG,KAAK4jF,MAAQ,EACb5jF,KAAK6jF,MAAQ,IAEb,MAAMxC,EAAe76E,OAAO+d,EAAQ88D,cAAgB,IAAI56E,OAClDy1B,EAAQ11B,OAAO+d,EAAQ2X,OAAS,IAAIz1B,OAC1CzG,KAAKshF,OAAOzoE,YAAcqjB,GAASmlD,EAEnCrhF,KAAK8jF,gBACL9jF,KAAK+jF,kBACL/jF,KAAKmhF,OAAO3gE,MACb,CAEA0gE,YAAAA,GACKlhF,KAAKmhF,QAAUnhF,KAAKwwD,OAGxBxwD,KAAKwhF,YACN,CAEAA,UAAAA,GACC,MAAMz+E,EAAS,CACd84B,UAAU,EACVC,SAAS,EACTN,UAAU,EACVxd,UAAU,EACV+d,MAAO,CACNtnB,MAAO,eAER4J,UAAW,CACVle,QAAQ,IAIJshF,EAAUp0E,SAAS2lB,eAAehzB,KAAKghF,UAC7C,GAAIS,EAKH,OAJAzhF,KAAKwwD,MAAQixB,EACbzhF,KAAKmhF,OAAS5lD,EAAQxzB,oBAAoB05E,EAAS1+E,GACnD/C,KAAK0hF,cAAcD,QACnBzhF,KAAK2hF,eAAeF,GAIrBzhF,KAAKmhF,OAAS5lD,EAAQjc,MAAMtf,KAAKghF,SAAUj+E,GAAS6+E,IACnD,MAAMphF,EAAUohF,EAAcjhF,SAC9BX,KAAKwwD,MAAQhwD,EACbA,EAAQW,UAAUC,IAAI,4BAEtB,MAAM0F,EAAOtG,EAAQ+G,cAAc,kBAC7B6Y,EAAU5f,EAAQ+G,cAAc,qBACtC,IAAKT,IAASsZ,EACb,OAGDtZ,EAAK3F,UAAUC,IAAI,kCACnB0F,EAAKhD,UAAY,GAEjB,IAAIwc,EAAS9f,EAAQ+G,cAAc,oBAC9B+Y,IACJA,EAASjT,SAAS2K,cAAc,OAChCsI,EAAOwC,UAAY,kBACnB1C,EAAQ26C,QAAQz6C,IAGjBtgB,KAAKshF,OAASj0E,SAAS2K,cAAc,OACrChY,KAAKshF,OAAOx+D,UAAY,iBAExB,MAAMkhE,EAAU32E,SAAS2K,cAAc,OACvCgsE,EAAQlhE,UAAY,oCAEpB9iB,KAAKikF,UAAY52E,SAAS2K,cAAc,UACxChY,KAAKikF,UAAUj4E,KAAO,SACtBhM,KAAKikF,UAAUnhE,UAAY,gCAC3B9iB,KAAKikF,UAAUv0E,aAAa,YAAa,aACzC1P,KAAKikF,UAAUr0E,iBAAiB,SAAS,KACxC5P,KAAK4jF,MAAQzuE,KAAKC,IAAI,EAAGpV,KAAK4jF,MAAQ,GACtC5jF,KAAK8jF,gBACL9jF,KAAK+jF,iBAAiB,IAGvB/jF,KAAKkkF,UAAY72E,SAAS2K,cAAc,QACxChY,KAAKkkF,UAAUphE,UAAY,iCAC3B9iB,KAAKkkF,UAAUx0E,aAAa,YAAa,QAEzC1P,KAAKmkF,UAAY92E,SAAS2K,cAAc,UACxChY,KAAKmkF,UAAUn4E,KAAO,SACtBhM,KAAKmkF,UAAUrhE,UAAY,gCAC3B9iB,KAAKmkF,UAAUz0E,aAAa,YAAa,aACzC1P,KAAKmkF,UAAUv0E,iBAAiB,SAAS,KACxC5P,KAAK4jF,OAAS,EACd5jF,KAAK8jF,gBACL9jF,KAAK+jF,iBAAiB,IAGvB/jF,KAAKokF,SAAW/2E,SAAS2K,cAAc,UACvChY,KAAKokF,SAASp4E,KAAO,SACrBhM,KAAKokF,SAASthE,UAAY,gCAC1B9iB,KAAKokF,SAAS10E,aAAa,YAAa,YACxC1P,KAAKokF,SAASx0E,iBAAiB,SAAS,KACvC5P,KAAK6jF,MAAQ1uE,KAAKC,IAAI,GAAIpV,KAAK6jF,MAAQ,IACvC7jF,KAAK8jF,gBACL9jF,KAAK+jF,iBAAiB,IAGvB/jF,KAAKqkF,QAAUh3E,SAAS2K,cAAc,UACtChY,KAAKqkF,QAAQr4E,KAAO,SACpBhM,KAAKqkF,QAAQvhE,UAAY,gCACzB9iB,KAAKqkF,QAAQ30E,aAAa,YAAa,WACvC1P,KAAKqkF,QAAQz0E,iBAAiB,SAAS,KACtC5P,KAAK6jF,MAAQ1uE,KAAKO,IAAI,IAAK1V,KAAK6jF,MAAQ,IACxC7jF,KAAK8jF,gBACL9jF,KAAK+jF,iBAAiB,IAGvB/jF,KAAKskF,UAAYj3E,SAAS2K,cAAc,QACxChY,KAAKskF,UAAUxhE,UAAY,iCAC3B9iB,KAAKskF,UAAU50E,aAAa,YAAa,QAEzC1P,KAAKkjF,UAAY71E,SAAS2K,cAAc,UACxChY,KAAKkjF,UAAUl3E,KAAO,SACtBhM,KAAKkjF,UAAUpgE,UAAY,wCAC3B9iB,KAAKkjF,UAAUxzE,aAAa,YAAa,YACzC1P,KAAKkjF,UAAUtzE,iBAAiB,SAAS,IAAM5P,KAAKojF,kBAEpDY,EAAQ15D,YAAYtqB,KAAKikF,WACzBD,EAAQ15D,YAAYtqB,KAAKkkF,WACzBF,EAAQ15D,YAAYtqB,KAAKmkF,WACzBH,EAAQ15D,YAAYtqB,KAAKokF,UACzBJ,EAAQ15D,YAAYtqB,KAAKskF,WACzBN,EAAQ15D,YAAYtqB,KAAKqkF,SACzBL,EAAQ15D,YAAYtqB,KAAKkjF,WAEzBljF,KAAK2iF,OAASt1E,SAAS2K,cAAc,UACrChY,KAAK2iF,OAAO7/D,UAAY,kCACxB9iB,KAAK2iF,OAAOjzE,aAAa,QAAS,eAElC4Q,EAAOgK,YAAYtqB,KAAKshF,QAExBx6E,EAAKwjB,YAAYtqB,KAAK2iF,QAEtB3iF,KAAK2hF,eAAenhF,EAAQ,GAE9B,CAEAkhF,aAAAA,CAAchiF,GACbM,KAAKshF,OAAS5hF,EAAK6H,cAAc,oCACjCvH,KAAK2iF,OAASjjF,EAAK6H,cAAc,oCACjCvH,KAAKikF,UAAYvkF,EAAK6H,cAAc,yDACpCvH,KAAKmkF,UAAYzkF,EAAK6H,cAAc,yDACpCvH,KAAKokF,SAAW1kF,EAAK6H,cAAc,wDACnCvH,KAAKqkF,QAAU3kF,EAAK6H,cAAc,uDAClCvH,KAAKkjF,UAAYxjF,EAAK6H,cAAc,wDACpCvH,KAAKkkF,UAAYxkF,EAAK6H,cAAc,qDACpCvH,KAAKskF,UAAY5kF,EAAK6H,cAAc,oDACrC,CAEAo6E,cAAAA,CAAejiF,GACTA,IAAQA,EAAKwyB,aAAa,4CAI/BxyB,EAAKgQ,aAAa,yCAA0C,QAC5DhQ,EAAKkQ,iBAAiB,mBAAmB,IAAM5P,KAAK8hF,kBACrD,CAEAgC,aAAAA,GACM9jF,KAAKkkF,WAAclkF,KAAKskF,YAI7BtkF,KAAKikF,UAAUprE,YAAc7Y,KAAKijF,OAAO,YACzCjjF,KAAKmkF,UAAUtrE,YAAc7Y,KAAKijF,OAAO,YACzCjjF,KAAKokF,SAASvrE,YAAc7Y,KAAKijF,OAAO,WACxCjjF,KAAKqkF,QAAQxrE,YAAc7Y,KAAKijF,OAAO,UACvCjjF,KAAKkjF,UAAUrqE,YAAc7Y,KAAKijF,OAAO,YACzCjjF,KAAKkkF,UAAUrrE,YAAc,GAAG7Y,KAAKijF,OAAO,YAAYjjF,KAAK4jF,QAC7D5jF,KAAKskF,UAAUzrE,YAAc,GAAG7Y,KAAKijF,OAAO,YAAYjjF,KAAK6jF,SAC9D,CAEAE,eAAAA,GACC,IAAK/jF,KAAK2iF,SAAW3iF,KAAK6iF,KACzB,OAGD,MAAMjnD,EAAO,SAAS57B,KAAK4jF,cAAc5jF,KAAK6jF,QAC9C7jF,KAAK2iF,OAAOv3D,IAAM,GAAGprB,KAAK6iF,OAAOjnD,GAClC,CAEAwnD,aAAAA,GACC,IAAKpjF,KAAK6iF,KACT,OAGD,MAAMS,EAAOj2E,SAAS2K,cAAc,KACpCsrE,EAAKn4D,KAAOnrB,KAAK6iF,KACb7iF,KAAK8iF,eACRQ,EAAK5zE,aAAa,WAAY1P,KAAK8iF,eAEpCQ,EAAKvvE,MAAM4E,QAAU,OACrBtL,SAASvG,KAAKwjB,YAAYg5D,GAC1BA,EAAKC,QACLl2E,SAASvG,KAAK+iE,YAAYyZ,EAC3B,CAEAL,MAAAA,CAAOxiF,GACN,MAAMyD,EAAQlE,KAAK0iF,UAAUjiF,GAC7B,OAAO+F,OAAOtC,GAAS,IAAIuC,MAC5B,CAEAq7E,aAAAA,GACK9hF,KAAKmhF,QAAyC,mBAAxBnhF,KAAKmhF,OAAO9+E,SACrCrC,KAAKmhF,OAAO9+E,UAETrC,KAAKwwD,OAASxwD,KAAKwwD,MAAMpgC,YAC5BpwB,KAAKwwD,MAAMpgC,WAAWy5C,YAAY7pE,KAAKwwD,OAGxCxwD,KAAKwwD,MAAQ,KACbxwD,KAAKmhF,OAAS,KACdnhF,KAAKshF,OAAS,KACdthF,KAAK2iF,OAAS,KACd3iF,KAAK0iF,QAAU,KACf1iF,KAAK6iF,KAAO,EACb,EAGD,YCjQM0B,GAAiB,IAAIxzE,IAAI,CAC9B,SAwED,GArEA,MACCxQ,WAAAA,GACCP,KAAK2L,KAAO,MACZ3L,KAAKmhF,OAASwC,GAAS77E,aACxB,CAEAk6E,SAAAA,CAAUjgD,EAAU,CAAC,GACpB,MAAM91B,EAAMzF,OAAOu7B,GAASkgD,UAAUh2E,KAAO,IAAIzG,cACjD,OAAO++E,GAAez7D,IAAI7c,EAC3B,CAEAw1B,MAAAA,CAAOM,EAAU,CAAC,GACjB,MAAMpP,EAAYoP,GAASmgD,iBACrBC,EAAWpqE,QAAQgqB,GAASqgD,IAAID,UAChCn4B,EAAOjoB,GAASioB,KAEhB5+B,EAAM2W,GAAS+5C,SAAS3wD,MAAQ4W,GAAS25C,UAAY,GAC3D,IAAKtwD,EACJ,OAAO,EAGR,MAAMo5D,EAAWl3E,IACZA,GACHA,EAAME,iBAGPxN,KAAKmhF,OAAOx6D,KAAK,CAChByE,MACA8Q,MAAO6F,GAASkgD,UAAUt2E,MAAQq+C,GAAM74C,QAAQ,cAAgB,GAChEkwE,aAAcr3B,GAAM74C,QAAQ,cAAgB,GAC5CyxE,OAAQ,CACP7lC,KAAMiN,GAAM74C,QAAQ,aAAe,GACnCyL,KAAMotC,GAAM74C,QAAQ,aAAe,GACnCszE,OAAQz6B,GAAM1iD,OAAO,YAAc,GACnCo9E,QAAS16B,GAAM1iD,OAAO,aAAe,GACrCq9E,SAAU36B,GAAM1iD,OAAO,SAAW,GAClCu1C,SAAUmN,GAAM1iD,OAAO,SAAW,GAClCo8E,SAAU15B,GAAM1iD,OAAO,aAAe,IAEvCy7E,aAAchhD,GAASkgD,UAAUvF,cAAgB36C,GAASkgD,UAAUt2E,MAAQ,YAC3E,EAGG22E,EAAYvgD,GAASvhC,SAAS+G,cAAc,SAOlD,GANI+6E,IAAcA,EAAUpwD,aAAa,kCACxCowD,EAAU5yE,aAAa,+BAAgC,QACvD4yE,EAAUnhF,UAAUC,IAAI,qBACxBkhF,EAAU1yE,iBAAiB,QAAS40E,IAGjCrC,EACH,OAAOpqE,QAAQuqE,GAGhB,IAAK3vD,EACJ,OAAO,EAGR,MAAM3R,EAAU3T,SAAS2K,cAAc,UAOvC,OANAgJ,EAAQhV,KAAO,SACfgV,EAAQ8B,UAAY,6BACpB9B,EAAQnI,YAAcmxC,GAAM1iD,OAAO,aAAe,GAClD0Z,EAAQpR,iBAAiB,QAAS40E,GAClC7xD,EAAUrI,YAAYtJ,IAEf,CACR,GCtED,MAAM4jE,GACLrkF,WAAAA,GACCP,KAAKghF,SAAW,4BAChBhhF,KAAK6kF,iBAAmB,KACxB7kF,KAAK0iF,QAAU,CAAC,CACjB,CAEA,kBAAO56E,GAKN,OAJK88E,GAAU3D,YACd2D,GAAU3D,UAAY,IAAI2D,IAGpBA,GAAU3D,SAClB,CAEAt6D,IAAAA,CAAKpC,EAAU,CAAC,GACf,MAAM6G,EAAM5kB,OAAO+d,EAAQ6G,KAAO,IAAI3kB,OACtC,IAAK2kB,EACJ,OAID,GADAprB,KAAKkhF,gBACAlhF,KAAKmhF,SAAWnhF,KAAKq8B,SACzB,OAGDr8B,KAAK0iF,QAAUn+D,GAASq+D,QAAoC,iBAAnBr+D,EAAQq+D,OAAsBr+D,EAAQq+D,OAAS,CAAC,EACzF,MAAMvB,EAAe76E,OAAO+d,EAAQ88D,cAAgB,IAAI56E,OAClDy1B,EAAQ11B,OAAO+d,EAAQ2X,OAAS,IAAIz1B,OACpCwF,EAAMzF,OAAO+d,EAAQtY,KAAO,IAAIzG,cACtCxF,KAAKshF,OAAOzoE,YAAcqjB,GAASmlD,EACnCrhF,KAAKq8B,SAASxjB,YAAc7Y,KAAKijF,OAAO,WACxCjjF,KAAKq8B,SAASl7B,UAAUG,OAAO,eAC/BtB,KAAKmhF,OAAO3gE,OAEZxgB,KAAK8kF,UAAU15D,EAAK,CAACnf,OACtB,CAEAs1E,KAAAA,GACMvhF,KAAKmhF,QAIVnhF,KAAKmhF,OAAOvgE,MACb,CAEAsgE,YAAAA,GACKlhF,KAAKmhF,QAAUnhF,KAAKwwD,OAIxBxwD,KAAKwhF,YACN,CAEAA,UAAAA,GACC,MAAMz+E,EAAS,CACd84B,UAAU,EACVC,SAAS,EACTN,UAAU,EACVxd,UAAU,EACV+d,MAAO,CACNtnB,MAAO,QACPjE,OAAQ,IAET6N,UAAW,CACVle,QAAQ,IAIJshF,EAAUp0E,SAAS2lB,eAAehzB,KAAKghF,UAC7C,GAAIS,EAKH,OAJAzhF,KAAKwwD,MAAQixB,EACbzhF,KAAKmhF,OAAS5lD,EAAQxzB,oBAAoB05E,EAAS1+E,GACnD/C,KAAK0hF,cAAcD,QACnBzhF,KAAK2hF,eAAeF,GAIrBzhF,KAAKmhF,OAAS5lD,EAAQjc,MAAMtf,KAAKghF,SAAUj+E,GAAS6+E,IACnD,MAAMphF,EAAUohF,EAAcjhF,SAC9BX,KAAKwwD,MAAQhwD,EACbA,EAAQW,UAAUC,IAAI,6BAEtB,MAAM0F,EAAOtG,EAAQ+G,cAAc,kBAC7B6Y,EAAU5f,EAAQ+G,cAAc,qBACtC,IAAKT,IAASsZ,EACb,OAGDtZ,EAAK3F,UAAUC,IAAI,mCACnB0F,EAAKhD,UAAY,GAEjB,IAAIwc,EAAS9f,EAAQ+G,cAAc,oBAC9B+Y,IACJA,EAASjT,SAAS2K,cAAc,OAChCsI,EAAOwC,UAAY,kBACnB1C,EAAQ26C,QAAQz6C,IAGjBtgB,KAAKshF,OAASj0E,SAAS2K,cAAc,OACrChY,KAAKshF,OAAOx+D,UAAY,iBACxB9iB,KAAKshF,OAAOzoE,YAAc,GAE1B7Y,KAAKq8B,SAAWhvB,SAAS2K,cAAc,OACvChY,KAAKq8B,SAASvZ,UAAY,qCAC1B9iB,KAAKq8B,SAASxjB,YAAc,GAE5ByH,EAAOgK,YAAYtqB,KAAKshF,QACxBx6E,EAAKwjB,YAAYtqB,KAAKq8B,UAEtBr8B,KAAK2hF,eAAenhF,EAAQ,GAE9B,CAEAkhF,aAAAA,CAAchiF,GACbM,KAAKshF,OAAS5hF,EAAK6H,cAAc,qCACjCvH,KAAKq8B,SAAW38B,EAAK6H,cAAc,sCACpC,CAEAo6E,cAAAA,CAAejiF,GACTA,IAAQA,EAAKwyB,aAAa,6CAI/BxyB,EAAKgQ,aAAa,0CAA2C,QAC7DhQ,EAAKkQ,iBAAiB,mBAAmB,KACxC5P,KAAK8hF,eAAe,IAEtB,CAEAgD,SAAAA,CAAU15D,EAAKzlB,EAAU,CAAC,GACzB,MAAMsG,EAAMzF,OAAOb,EAAQsG,KAAO,IAAIzG,cAChCu/E,EAAW,GAAG35D,KAAOnf,IAE3B,GAAI24E,GAAUI,OAAOl8D,IAAIi8D,GAAzB,CACC,MAAME,EAASL,GAAUI,OAAO/hF,IAAI8hF,GACpC/kF,KAAKklF,kBAAkBD,EAAQh5E,EAEhC,MAEIjM,KAAK6kF,kBACR7kF,KAAK6kF,iBAAiBx9D,QAGvBrnB,KAAK6kF,iBAAmB,IAAIpjC,gBAE5Bt9B,MAAMiH,EAAK,CACV/mB,OAAQ,MACR2C,OAAQhH,KAAK6kF,iBAAiB79E,SAE7Bkf,MAAMriB,IACN,IAAKA,EAAS2gB,GACb,MAAM,IAAI/hB,MAAM,QAAQoB,EAASiB,UAGlC,OAAOjB,EAASwb,MAAM,IAEtB6G,MAAM7G,IACN,MAAM4D,EAAa5D,GAAQ,GAC3BulE,GAAUI,OAAOpiF,IAAImiF,EAAU9hE,GAC/BjjB,KAAKklF,kBAAkBjiE,EAAYhX,EAAI,IAEvCqa,OAAOlX,IACFpP,KAAKq8B,UAIU,eAAhBjtB,GAAOzD,OAIX3L,KAAKq8B,SAASl7B,UAAUG,OAAO,eAC/BtB,KAAKq8B,SAASxjB,YAAc,GAAG7Y,KAAKijF,OAAO,kBAAkB7zE,GAAO+B,SAAWnR,KAAKijF,OAAO,kBAAiB,GAE/G,CAEAiC,iBAAAA,CAAkB7lE,EAAMpT,GACvB,IAAKjM,KAAKq8B,SACT,OAGD,MAAMpZ,EAAazc,OAAO6Y,GAAQ,IACtB,QAARpT,GACHjM,KAAKq8B,SAASl7B,UAAUC,IAAI,eAC5BpB,KAAKq8B,SAASv4B,UAAY9D,KAAKmlF,gBAAgBliE,KAE/CjjB,KAAKq8B,SAASl7B,UAAUG,OAAO,eAC/BtB,KAAKq8B,SAASxjB,YAAcoK,GAAcjjB,KAAKijF,OAAO,aAExD,CAEAnB,aAAAA,GACK9hF,KAAK6kF,mBACR7kF,KAAK6kF,iBAAiBx9D,QACtBrnB,KAAK6kF,iBAAmB,MAGrB7kF,KAAKmhF,QAAyC,mBAAxBnhF,KAAKmhF,OAAO9+E,SACrCrC,KAAKmhF,OAAO9+E,UAGTrC,KAAKwwD,OAASxwD,KAAKwwD,MAAMpgC,YAC5BpwB,KAAKwwD,MAAMpgC,WAAWy5C,YAAY7pE,KAAKwwD,OAGxCxwD,KAAKwwD,MAAQ,KACbxwD,KAAKmhF,OAAS,KACdnhF,KAAKshF,OAAS,KACdthF,KAAKq8B,SAAW,KAChBr8B,KAAK0iF,QAAU,IAChB,CAEAO,MAAAA,CAAOxiF,EAAKqzC,EAAW,IACtB,MAAM5vC,EAAQlE,KAAK0iF,UAAUjiF,GAC7B,MAAwB,iBAAVyD,GAAsBA,EAAMuC,OAASvC,EAAQ4vC,CAC5D,CAEAqxC,eAAAA,CAAgBC,GACf,MAAMj9D,EAAcjkB,GAAUsC,OAAOtC,GACnCkkB,QAAQ,KAAM,SACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,UACdA,QAAQ,KAAM,SAEVihC,EAAUg8B,IACf,IAAIzvD,EAASzN,EAAWk9D,GAQxB,OAPAzvD,EAASA,EAAOxN,QAAQ,aAAc,mBACtCwN,EAASA,EAAOxN,QAAQ,mBAAoB,uBAC5CwN,EAASA,EAAOxN,QAAQ,eAAgB,eACxCwN,EAASA,EAAOxN,QAAQ,4BAA4B,CAAC8E,EAAO7N,EAAM8L,IAE1D,YADUnrB,KAAKslF,aAAan6D,iDACuC9L,UAEpEuW,CAAM,EAGR2vD,EAAQ/+E,OAAO4+E,GAAgB,IAAI55E,MAAM,SACzCkvB,EAAO,GACb,IAAI8qD,GAAS,EACTC,GAAS,EAkEb,OAhEAF,EAAMnjF,SAASsjF,IACd,MAAML,EAAOK,GAAW,GAExB,GAAIL,EAAK5+E,OAAOtE,WAAW,OAQ1B,YAPKsjF,GAIJA,GAAS,EACT/qD,EAAK/iB,KAAK,mBAJV8tE,GAAS,EACT/qD,EAAK/iB,KAAK,iBAQZ,GAAI8tE,EAEH,YADA/qD,EAAK/iB,KAAK,GAAGwQ,EAAWk9D,QAIzB,IAAKA,EAAK5+E,OAKT,YAJI++E,IACHA,GAAS,EACT9qD,EAAK/iB,KAAK,WAKZ,MAAMguE,EAAUN,EAAKn4D,MAAM,qBAC3B,GAAIy4D,EAAS,CACRH,IACHA,GAAS,EACT9qD,EAAK/iB,KAAK,UAGX,MAAMiuE,EAAQD,EAAQ,GAAGv3E,OAEzB,YADAssB,EAAK/iB,KAAK,KAAKiuE,KAASv8B,EAAOs8B,EAAQ,SAASC,KAEjD,CAEA,MAAMC,EAAWR,EAAKn4D,MAAM,iBAC5B,GAAI24D,EAMH,OALKL,IACJA,GAAS,EACT9qD,EAAK/iB,KAAK,cAEX+iB,EAAK/iB,KAAK,OAAO0xC,EAAOw8B,EAAS,YAI9BL,IACHA,GAAS,EACT9qD,EAAK/iB,KAAK,UAGX+iB,EAAK/iB,KAAK,MAAM0xC,EAAOg8B,SAAY,IAGhCG,GACH9qD,EAAK/iB,KAAK,SAEP8tE,GACH/qD,EAAK/iB,KAAK,iBAGJ+iB,EAAKlX,KAAK,KAAO,MAAMxjB,KAAK8xC,YAAY9xC,KAAKijF,OAAO,mBAC5D,CAEAnxC,WAAAA,CAAY5tC,GACX,OAAOsC,OAAOtC,GACZkkB,QAAQ,KAAM,SACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,UACdA,QAAQ,KAAM,QACjB,CAEAk9D,YAAAA,CAAan5E,GACZ,MAAMjI,EAAQsC,OAAO2F,GAAO,IAAI1F,OAChC,IAAKvC,EACJ,MAAO,IAGR,IACC,MAAM0uC,EAAS,IAAInvB,IAAIvf,EAAOmR,OAAOqO,SAASC,QAC9C,GAAI,CAAC,QAAS,SAAU,WAAWjY,SAASknC,EAAOmpC,UAClD,OAAOnpC,EAAOznB,IAEhB,CAAE,MACD,MAAO,GACR,CAEA,MAAO,GACR,EAIDy5D,GAAUI,OAAS,IAAI72D,IAEvB,YCpVM23D,GAAkB,IAAI/0E,IAAI,CAC/B,OACA,MACA,OACA,QACA,OACA,OACA,QACA,OACA,OACA,QACA,SAqED,GAlEA,MACCxQ,WAAAA,GACCP,KAAK2L,KAAO,OACZ3L,KAAKmhF,OAASyD,GAAU98E,aACzB,CAEAk6E,SAAAA,CAAUjgD,EAAU,CAAC,GACpB,MAAM91B,EAAMzF,OAAOu7B,GAASkgD,UAAUh2E,KAAO,IAAIzG,cACjD,OAAOsgF,GAAgBh9D,IAAI7c,EAC5B,CAEAw1B,MAAAA,CAAOM,EAAU,CAAC,GACjB,MAAMpP,EAAYoP,GAASmgD,iBACrBC,EAAWpqE,QAAQgqB,GAASqgD,IAAID,UAChCn4B,EAAOjoB,GAASioB,KAEhB5+B,EAAM2W,GAAS+5C,SAAS3wD,MAAQ4W,GAAS25C,UAAY,GAC3D,IAAKtwD,EACJ,OAAO,EAGR,MAAM26D,EAAYz4E,IACbA,GACHA,EAAME,iBAGPxN,KAAKmhF,OAAOx6D,KAAK,CAChByE,MACA8Q,MAAO6F,GAASkgD,UAAUt2E,MAAQq+C,GAAM74C,QAAQ,eAAiB,GACjEkwE,aAAcr3B,GAAM74C,QAAQ,eAAiB,GAC7ClF,IAAK81B,GAASkgD,UAAUh2E,KAAO,GAC/B22E,OAAQ,CACPhpC,QAASoQ,GAAM74C,QAAQ,iBAAmB,GAC1C60E,WAAYh8B,GAAM74C,QAAQ,qBAAuB,GACjD80E,aAAcj8B,GAAM74C,QAAQ,kBAAoB,GAChD+0E,UAAWl8B,GAAM74C,QAAQ,eAAiB,KAE1C,EAGGmxE,EAAYvgD,GAASvhC,SAAS+G,cAAc,SAOlD,GANI+6E,IAAcA,EAAUpwD,aAAa,mCACxCowD,EAAU5yE,aAAa,gCAAiC,QACxD4yE,EAAUnhF,UAAUC,IAAI,qBACxBkhF,EAAU1yE,iBAAiB,QAASm2E,IAGjC5D,EACH,OAAOpqE,QAAQuqE,GAGhB,IAAK3vD,EACJ,OAAO,EAGR,MAAM3R,EAAU3T,SAAS2K,cAAc,UAOvC,OANAgJ,EAAQhV,KAAO,SACfgV,EAAQ8B,UAAY,8BACpB9B,EAAQnI,YAAcmxC,GAAM1iD,OAAO,cAAgB,GACnD0Z,EAAQpR,iBAAiB,QAASm2E,GAClCpzD,EAAUrI,YAAYtJ,IAEf,CACR,GC7ED,MAAMmlE,GACL5lF,WAAAA,GACCP,KAAKghF,SAAW,6BAChBhhF,KAAKomF,UAAY,GACjBpmF,KAAKqmF,eAAiB,EACtBrmF,KAAK0iF,QAAU,CAAC,EAChB1iF,KAAKsmF,WAAch5E,GAAUtN,KAAKumF,eAAej5E,EAClD,CAEA,kBAAOxF,GAKN,OAJKq+E,GAAWlF,YACfkF,GAAWlF,UAAY,IAAIkF,IAGrBA,GAAWlF,SACnB,CAEAt6D,IAAAA,CAAKpC,EAAU,CAAC,GACf,MAAM6G,EAAM5kB,OAAO+d,EAAQ6G,KAAO,IAAI3kB,OACtC,IAAK2kB,EACJ,OAID,GADAprB,KAAKkhF,gBACAlhF,KAAKmhF,SAAWnhF,KAAKwmF,OACzB,OAGD,MAAMC,EAAWliE,GAASkiE,UAAwC,iBAArBliE,EAAQkiE,SAAwBliE,EAAQkiE,SAAW,KAEhG,GADAzmF,KAAK0iF,QAAUn+D,GAASq+D,QAAoC,iBAAnBr+D,EAAQq+D,OAAsBr+D,EAAQq+D,OAAS,CAAC,EACrF6D,GAAUC,QAAQt4E,OAAQ,CAC7BpO,KAAKomF,UAAYK,EAASC,OAC1B,MAAMC,EAAe3mF,KAAKomF,UAAUntB,WAAW2tB,GAAUpgF,OAAOogF,EAAMx7D,KAAO,IAAI3kB,SAAW2kB,IAC5FprB,KAAKqmF,cAAgBM,GAAgB,EAAIA,EAAe9xE,OAAO4xE,EAAS9hB,cAAgB,EACzF,MACC3kE,KAAKomF,UAAY,CAAC,CAAEh7D,MAAK8Q,MAAO11B,OAAO+d,EAAQ2X,OAAS,IAAIz1B,SAC5DzG,KAAKqmF,cAAgB,EAGtB,MAAMhF,EAAe76E,OAAO+d,EAAQ88D,cAAgB,IAAI56E,OAClDy1B,EAAQ11B,OAAO+d,EAAQ2X,OAAS,IAAIz1B,OAC1CzG,KAAKshF,OAAOzoE,YAAcqjB,GAASmlD,EACnCrhF,KAAK6mF,kBACL7mF,KAAKwmF,OAAOp7D,IAAMA,EAClBprB,KAAKwmF,OAAOM,OAEZ9mF,KAAKmhF,OAAO3gE,OACZxgB,KAAKwmF,OAAOO,OAAOzgE,OAAM,QAC1B,CAEAi7D,KAAAA,GACMvhF,KAAKmhF,SAIVnhF,KAAKmhF,OAAOvgE,OACZ5gB,KAAKgnF,QACN,CAEA9F,YAAAA,GACKlhF,KAAKmhF,QAAUnhF,KAAKwwD,OAIxBxwD,KAAKwhF,YACN,CAEAA,UAAAA,GACC,MAAMz+E,EAAS,CACd84B,UAAU,EACVC,SAAS,EACTN,UAAU,EACVxd,UAAU,EACV+d,MAAO,CACNtnB,MAAO,eAER4J,UAAW,CACVle,QAAQ,IAIJshF,EAAUp0E,SAAS2lB,eAAehzB,KAAKghF,UAC7C,GAAIS,EAKH,OAJAzhF,KAAKwwD,MAAQixB,EACbzhF,KAAKmhF,OAAS5lD,EAAQxzB,oBAAoB05E,EAAS1+E,GACnD/C,KAAK0hF,cAAcD,QACnBzhF,KAAK+xD,YAAY0vB,GAIlBzhF,KAAKmhF,OAAS5lD,EAAQjc,MAAMtf,KAAKghF,SAAUj+E,GAAS6+E,IACnD,MAAMphF,EAAUohF,EAAcjhF,SAC9BX,KAAKwwD,MAAQhwD,EACbA,EAAQW,UAAUC,IAAI,8BAEtB,MAAM0F,EAAOtG,EAAQ+G,cAAc,kBAC7B6Y,EAAU5f,EAAQ+G,cAAc,qBACtC,IAAKT,IAASsZ,EACb,OAGDtZ,EAAK3F,UAAUC,IAAI,oCACnB0F,EAAKhD,UAAY,GAEjB,IAAIwc,EAAS9f,EAAQ+G,cAAc,oBAC9B+Y,IACJA,EAASjT,SAAS2K,cAAc,OAChCsI,EAAOwC,UAAY,kBACnB1C,EAAQ26C,QAAQz6C,IAGjBtgB,KAAKshF,OAASj0E,SAAS2K,cAAc,OACrChY,KAAKshF,OAAOx+D,UAAY,iBACxB9iB,KAAKshF,OAAOzoE,YAAc,GAE1B,MAAMouE,EAAa55E,SAAS2K,cAAc,OAC1CivE,EAAWnkE,UAAY,yCAEvB9iB,KAAKknF,YAAc75E,SAAS2K,cAAc,UAC1ChY,KAAKknF,YAAYl7E,KAAO,SACxBhM,KAAKknF,YAAYpkE,UAAY,sCAC7B9iB,KAAKknF,YAAYt3E,iBAAiB,SAAS,IAAM5P,KAAKmnF,YAEtDnnF,KAAKonF,YAAc/5E,SAAS2K,cAAc,UAC1ChY,KAAKonF,YAAYp7E,KAAO,SACxBhM,KAAKonF,YAAYtkE,UAAY,sCAC7B9iB,KAAKonF,YAAYx3E,iBAAiB,SAAS,IAAM5P,KAAKqnF,YAEtDJ,EAAW38D,YAAYtqB,KAAKknF,aAC5BD,EAAW38D,YAAYtqB,KAAKonF,aAE5BpnF,KAAKwmF,OAASn5E,SAAS2K,cAAc,SACrChY,KAAKwmF,OAAO1jE,UAAY,oCACxB9iB,KAAKwmF,OAAOtuB,UAAW,EACvBl4D,KAAKwmF,OAAOc,QAAU,WACtBtnF,KAAKwmF,OAAOe,aAAc,EAC1BvnF,KAAKwmF,OAAO52E,iBAAiB,SAAS,IAAM5P,KAAKqnF,SAAQ,KAEzD/mE,EAAOgK,YAAYtqB,KAAKshF,QAExBx6E,EAAKwjB,YAAYtqB,KAAKwmF,QAEtBxmF,KAAK+xD,YAAYvxD,EAAQ,GAE3B,CAEAkhF,aAAAA,CAAchiF,GACbM,KAAKshF,OAAS5hF,EAAK6H,cAAc,sCACjCvH,KAAKwmF,OAAS9mF,EAAK6H,cAAc,qCAClC,CAEAwqD,WAAAA,CAAYryD,GACNA,IAAQA,EAAKwyB,aAAa,oCAI/BxyB,EAAKgQ,aAAa,iCAAkC,QACpDrC,SAASuC,iBAAiB,UAAW5P,KAAKsmF,YAC1C5mF,EAAKkQ,iBAAiB,mBAAmB,KACxC5P,KAAKgnF,QACLhnF,KAAK8hF,eAAe,IAEtB,CAEAkF,KAAAA,GACMhnF,KAAKwmF,SAIVxmF,KAAKwmF,OAAOgB,QACZxnF,KAAKwmF,OAAOiB,YAAc,EAC3B,CAEA3F,aAAAA,GACCz0E,SAASqE,oBAAoB,UAAW1R,KAAKsmF,YACzCtmF,KAAKmhF,QAAyC,mBAAxBnhF,KAAKmhF,OAAO9+E,SACrCrC,KAAKmhF,OAAO9+E,UAGTrC,KAAKwwD,OAASxwD,KAAKwwD,MAAMpgC,YAC5BpwB,KAAKwwD,MAAMpgC,WAAWy5C,YAAY7pE,KAAKwwD,OAGxCxwD,KAAKwwD,MAAQ,KACbxwD,KAAKmhF,OAAS,KACdnhF,KAAKshF,OAAS,KACdthF,KAAKknF,YAAc,KACnBlnF,KAAKonF,YAAc,KACnBpnF,KAAKwmF,OAAS,KACdxmF,KAAKomF,UAAY,GACjBpmF,KAAKqmF,eAAiB,EACtBrmF,KAAK0iF,QAAU,CAAC,CACjB,CAEAmE,eAAAA,GACC,IAAK7mF,KAAKknF,cAAgBlnF,KAAKonF,YAC9B,OAGDpnF,KAAKknF,YAAYruE,YAAc7Y,KAAK0iF,QAAQ5uD,MAAQ,GACpD9zB,KAAKonF,YAAYvuE,YAAc7Y,KAAK0iF,QAAQhvD,MAAQ,GACpD,MAAMg0D,EAAc1nF,KAAKomF,UAAUh4E,OAAS,EAC5CpO,KAAKknF,YAAYhzD,UAAYwzD,EAC7B1nF,KAAKonF,YAAYlzD,UAAYwzD,CAC9B,CAEAP,OAAAA,GACMnnF,KAAKomF,UAAUh4E,SAIpBpO,KAAKqmF,cAAgBrmF,KAAKqmF,eAAiB,EAAIrmF,KAAKomF,UAAUh4E,OAAS,EAAIpO,KAAKqmF,cAAgB,EAChGrmF,KAAK2nF,oBACN,CAEAN,OAAAA,CAAQO,GAAY,GACd5nF,KAAKomF,UAAUh4E,SAIU,IAA1BpO,KAAKomF,UAAUh4E,QAAiBw5E,KAIpC5nF,KAAKqmF,eAAiBrmF,KAAKqmF,cAAgB,GAAKrmF,KAAKomF,UAAUh4E,OAC/DpO,KAAK2nF,oBACN,CAEAA,iBAAAA,GACC,MAAM7tD,EAAU95B,KAAKomF,UAAUpmF,KAAKqmF,eAC/BvsD,GAAS1O,KAIdprB,KAAK2mB,KAAK,CACTyE,IAAK0O,EAAQ1O,IACb8Q,MAAOpC,EAAQoC,OAAS,GACxBmlD,aAAcvnD,EAAQoC,OAAS,GAC/BuqD,SAAU,CACTC,OAAQ1mF,KAAKomF,UACbzhB,aAAc3kE,KAAKqmF,eAEpBzD,OAAQ5iF,KAAK0iF,SAEf,CAEA6D,cAAAA,CAAej5E,GACd,IAAKtN,KAAKwwD,QAAUxwD,KAAKwwD,MAAMrvD,UAAUE,SAAS,QACjD,OAGD,MAAM4oB,EAAMzjB,OAAO8G,GAAOhJ,QAAQiJ,SAAW,IAAI7G,cAC7C,CAAC,QAAS,WAAY,UAAUgF,SAASue,KAI3B,cAAd3c,EAAM7M,MACT6M,EAAME,iBACNxN,KAAKmnF,WAGY,eAAd75E,EAAM7M,MACT6M,EAAME,iBACNxN,KAAKqnF,WAEP,EAID,YC/QMQ,GAAsBrnF,IAC3B,MAAM0D,EAAQ1D,GAAS+Q,aAAa,wBAA0B,GAC9D,OAAO/K,OAAOtC,GAAOuC,MAAM,EAiBtBqhF,GAAiB57E,IACtB,IACC,OAAO,IAAIuX,IAAIvX,EAAMmJ,OAAOqO,SAASC,QAAQwH,IAC9C,CAAE,MACD,MAAO,EACR,GAGK48D,GAAeA,CAACvnF,EAASwnF,EAAe,MAC7C,MAAM1/D,EAAO9nB,GAAS+G,cAAc,SAC9B20B,EAAQ11B,OAAO8hB,GAAMzP,aAAe,IAAIpS,OAC9C,GAAIy1B,EACH,OAAOA,EAGR,MAAMvwB,EAAOnF,OAAOwhF,GAAcx8E,MAAM,KAAKC,OAAS,GACtD,OAAOgpB,mBAAmB9oB,EAAK,EAG1Bs8E,GAAmBznF,IACxB,MAAM8nB,EAAO9nB,GAAS+G,cAAc,kBACpC,OAAOf,OAAO8hB,GAAMzP,aAAe,IAAIpS,MAAM,ECrCxCq6E,GAAmB,IAAI/vE,IAAI,CAChC,OACA,QACA,OACA,OACA,OACA,SAsED,GAnEA,MACCxQ,WAAAA,GACCP,KAAK2L,KAAO,QACZ3L,KAAKmhF,OAASgF,GAAWr+E,aAC1B,CAEAk6E,SAAAA,CAAUjgD,EAAU,CAAC,GACpB,MAAM91B,EAAMzF,OAAOu7B,GAASkgD,UAAUh2E,KAAO,IAAIzG,cACjD,OAAOs7E,GAAiBh4D,IAAI7c,EAC7B,CAEAw1B,MAAAA,CAAOM,EAAU,CAAC,GACjB,MAAMpP,EAAYoP,GAASmgD,iBACrBC,EAAWpqE,QAAQgqB,GAASqgD,IAAID,UAChCn4B,EAAOjoB,GAASioB,KAEhB5+B,EAAM2W,GAAS+5C,SAAS3wD,MAAQ4W,GAAS25C,UAAY,GAC3D,IAAKtwD,EACJ,OAAO,EAGR,MAAMq7D,EDUmByB,EAACC,EAAgBC,EAAYA,KAAM,KAC7D,MACM1B,EADQt1E,MAAMC,KAAKhE,SAASmC,iBAAiB,4DAEjDlB,KAAK9N,IACL,MAAM0L,EAAO27E,GAAmBrnF,GAC1B4qB,EAAM08D,GAAc57E,GACpBD,EA5CSC,KACjB,IAAKA,EACJ,MAAO,GAGR,MACMP,EADQnF,OAAO0F,GAAMV,MAAM,KAAK,GAAGA,MAAM,KAAK,GACjCA,MAAM,KAAKC,OAAS,GACvC,OAAKE,EAAKD,SAAS,KAIZ,IAAIlF,OAAOmF,EAAKH,MAAM,KAAKC,OAAS,IAAIjG,gBAHvC,EAGsD,EAiChD6iF,CAASn8E,GACrB,MAAO,CACN1L,UACA0L,OACAkf,MACAnf,MACAiwB,MAAO6rD,GAAavnF,EAAS0L,GAC7Bo8E,SAAUL,GAAgBznF,GAC1B,IAEDyB,QAAQ6N,GAASA,EAAKsb,KAAOg9D,EAAUt4E,EAAK7D,OAExCs8E,EAAaT,GAAcD,GAAmBM,IAC9CxjB,EAAe+hB,EAAOztB,WAAWnpD,GAASA,EAAKsb,MAAQm9D,IAE7D,MAAO,CACN7B,SACA/hB,aAAcA,GAAgB,EAAIA,EAAe,EACjD,EClCiBujB,CAAmBnmD,GAASvhC,SAAUyL,GAAQ60E,GAAiBh4D,IAAI7c,KAC9E22E,EAAS,CACd9uD,KAAMk2B,GAAM1iD,OAAO,SAAW,GAC9BosB,KAAMs2B,GAAM1iD,OAAO,SAAW,IAGzBkhF,EAAal7E,IACdA,GACHA,EAAME,iBAGPxN,KAAKmhF,OAAOx6D,KAAK,CAChByE,MACA8Q,MAAO6F,GAASkgD,UAAUt2E,MAAQq+C,GAAM74C,QAAQ,gBAAkB,GAClEkwE,aAAcr3B,GAAM74C,QAAQ,gBAAkB,GAC9Cs1E,WACA7D,UACC,EAGGN,EAAYvgD,GAASvhC,SAAS+G,cAAc,SAOlD,GANI+6E,IAAcA,EAAUpwD,aAAa,oCACxCowD,EAAU5yE,aAAa,iCAAkC,QACzD4yE,EAAUnhF,UAAUC,IAAI,qBACxBkhF,EAAU1yE,iBAAiB,QAAS44E,IAGjCrG,EACH,OAAOpqE,QAAQuqE,GAGhB,IAAK3vD,EACJ,OAAO,EAGR,MAAM3R,EAAU3T,SAAS2K,cAAc,UAOvC,OANAgJ,EAAQhV,KAAO,SACfgV,EAAQ8B,UAAY,+BACpB9B,EAAQnI,YAAcmxC,GAAM1iD,OAAO,eAAiB,GACpD0Z,EAAQpR,iBAAiB,QAAS44E,GAClC71D,EAAUrI,YAAYtJ,IAEf,CACR,GC1ED,MAAMynE,GACLloF,WAAAA,GACCP,KAAKghF,SAAW,2BAChBhhF,KAAK6kF,iBAAmB,KACxB7kF,KAAK0iF,QAAU,CAAC,EAChB1iF,KAAK0oF,SAAW,GAChB1oF,KAAK2oF,aAAe,IACrB,CAEA,kBAAO7gF,GAKN,OAJK2gF,GAASxH,YACbwH,GAASxH,UAAY,IAAIwH,IAGnBA,GAASxH,SACjB,CAEAt6D,IAAAA,CAAKpC,EAAU,CAAC,GACf,MAAM6G,EAAM5kB,OAAO+d,EAAQ6G,KAAO,IAAI3kB,OACtC,IAAK2kB,EACJ,OAID,GADAprB,KAAKkhF,gBACAlhF,KAAKmhF,SAAWnhF,KAAKq8B,SACzB,OAGDr8B,KAAK0iF,QAAUn+D,GAASq+D,QAAoC,iBAAnBr+D,EAAQq+D,OAAsBr+D,EAAQq+D,OAAS,CAAC,EACzF,MAAMvB,EAAe76E,OAAO+d,EAAQ88D,cAAgB,IAAI56E,OAClDy1B,EAAQ11B,OAAO+d,EAAQ2X,OAAS,IAAIz1B,OAC1CzG,KAAKshF,OAAOzoE,YAAcqjB,GAASmlD,EACnCrhF,KAAKq8B,SAASv4B,UAAY,kDAAkD9D,KAAK8xC,YAAY9xC,KAAKijF,OAAO,2BACzGjjF,KAAKmhF,OAAO3gE,OAEZxgB,KAAK4oF,gBAAgBx9D,EACtB,CAEAm2D,KAAAA,GACMvhF,KAAKmhF,QAIVnhF,KAAKmhF,OAAOvgE,MACb,CAEAsgE,YAAAA,GACKlhF,KAAKmhF,QAAUnhF,KAAKwwD,OAIxBxwD,KAAKwhF,YACN,CAEAA,UAAAA,GACC,MAAMz+E,EAAS,CACd84B,UAAU,EACVC,SAAS,EACTN,UAAU,EACVxd,UAAU,EACV+d,MAAO,CACNtnB,MAAO,SAER4J,UAAW,CACVle,QAAQ,IAIJshF,EAAUp0E,SAAS2lB,eAAehzB,KAAKghF,UAC7C,GAAIS,EAKH,OAJAzhF,KAAKwwD,MAAQixB,EACbzhF,KAAKmhF,OAAS5lD,EAAQxzB,oBAAoB05E,EAAS1+E,GACnD/C,KAAK0hF,cAAcD,QACnBzhF,KAAK2hF,eAAeF,GAIrBzhF,KAAKmhF,OAAS5lD,EAAQjc,MAAMtf,KAAKghF,SAAUj+E,GAAS6+E,IACnD,MAAMphF,EAAUohF,EAAcjhF,SAC9BX,KAAKwwD,MAAQhwD,EACbA,EAAQW,UAAUC,IAAI,4BAEtB,MAAM0F,EAAOtG,EAAQ+G,cAAc,kBAC7B6Y,EAAU5f,EAAQ+G,cAAc,qBACtC,IAAKT,IAASsZ,EACb,OAGDtZ,EAAK3F,UAAUC,IAAI,oCACnB0F,EAAKhD,UAAY,GAEjB,IAAIwc,EAAS9f,EAAQ+G,cAAc,oBAC9B+Y,IACJA,EAASjT,SAAS2K,cAAc,OAChCsI,EAAOwC,UAAY,kBACnB1C,EAAQ26C,QAAQz6C,IAGjBtgB,KAAKshF,OAASj0E,SAAS2K,cAAc,OACrChY,KAAKshF,OAAOx+D,UAAY,iBACxB9iB,KAAKshF,OAAOzoE,YAAc,GAE1B7Y,KAAKq8B,SAAWhvB,SAAS2K,cAAc,OACvChY,KAAKq8B,SAASvZ,UAAY,oCAE1BxC,EAAOgK,YAAYtqB,KAAKshF,QACxBx6E,EAAKwjB,YAAYtqB,KAAKq8B,UAEtBr8B,KAAK2hF,eAAenhF,EAAQ,GAE9B,CAEAkhF,aAAAA,CAAchiF,GACbM,KAAKshF,OAAS5hF,EAAK6H,cAAc,oCACjCvH,KAAKq8B,SAAW38B,EAAK6H,cAAc,qCACpC,CAEAo6E,cAAAA,CAAejiF,GACTA,IAAQA,EAAKwyB,aAAa,4CAI/BxyB,EAAKgQ,aAAa,yCAA0C,QAC5DhQ,EAAKkQ,iBAAiB,mBAAmB,KACxC5P,KAAK8hF,eAAe,IAEtB,CAEA8G,eAAAA,CAAgBx9D,GACXprB,KAAK6kF,kBACR7kF,KAAK6kF,iBAAiBx9D,QAEvBrnB,KAAK6kF,iBAAmB,IAAIpjC,gBAE5B,MAAMwjC,EAASwD,GAASzD,OAAO/hF,IAAImoB,GACnC,GAAI65D,GAAQz6D,SAAWy6D,GAAQlF,YAI9B,OAHA//E,KAAK0oF,SAAWzD,EAAOz6D,QACvBxqB,KAAK2oF,aAAe1D,EAAOlF,iBAC3B//E,KAAK6oF,eAAe7oF,KAAK0oF,UAI1BvkE,MAAMiH,EAAK,CACV/mB,OAAQ,MACR2C,OAAQhH,KAAK6kF,iBAAiB79E,SAE7Bkf,MAAMriB,IACN,IAAKA,EAAS2gB,GACb,MAAM,IAAI/hB,MAAM,QAAQoB,EAASiB,UAElC,OAAOjB,EAASk8E,aAAa,IAE7B75D,MAAM4iE,IACN,MAAMt+D,EAAUxqB,KAAK+oF,iBAAiBD,GACtC9oF,KAAK0oF,SAAWl+D,EAChBxqB,KAAK2oF,aAAeG,EACpBL,GAASzD,OAAOpiF,IAAIwoB,EAAK,CACxBZ,UACAu1D,YAAa+I,IAEd9oF,KAAK6oF,eAAer+D,EAAQ,IAE5BlE,OAAOlX,IACP,GAAoB,eAAhBA,GAAOzD,MAIP3L,KAAKq8B,SAAU,CAClB,MAAM2sD,EAAYhpF,KAAKipF,kBAAkB75E,GACzCpP,KAAKq8B,SAASv4B,UAAY,gDAAgD9D,KAAK8xC,YAAY9xC,KAAKijF,OAAO,0BAA0BjjF,KAAK8xC,YAAYk3C,UACnJ,IAEH,CAEAlH,aAAAA,GACK9hF,KAAK6kF,mBACR7kF,KAAK6kF,iBAAiBx9D,QACtBrnB,KAAK6kF,iBAAmB,MAGrB7kF,KAAKmhF,QAAyC,mBAAxBnhF,KAAKmhF,OAAO9+E,SACrCrC,KAAKmhF,OAAO9+E,UAGTrC,KAAKwwD,OAASxwD,KAAKwwD,MAAMpgC,YAC5BpwB,KAAKwwD,MAAMpgC,WAAWy5C,YAAY7pE,KAAKwwD,OAGxCxwD,KAAKwwD,MAAQ,KACbxwD,KAAKmhF,OAAS,KACdnhF,KAAKshF,OAAS,KACdthF,KAAKq8B,SAAW,KAChBr8B,KAAK0iF,QAAU,KACf1iF,KAAK0oF,SAAW,GAChB1oF,KAAK2oF,aAAe,IACrB,CAEAI,gBAAAA,CAAiBhJ,GAChB,MAAM7gC,EAAO,IAAIihC,SAASJ,GACpB3xE,EAAS8wC,EAAKgqC,WAEpB,GAAI96E,EAAS,GACZ,MAAM,IAAI3L,MAAM,eAGjB,MAAM0mF,EAAanpF,KAAKopF,2BAA2BlqC,GACnD,GAAIiqC,EAAa,EAChB,MAAM,IAAI1mF,MAAM,+BAGjB,MAAM4mF,EAAenqC,EAAKoqC,UAAUH,EAAa,IAAI,GAC/CI,EAAmBrqC,EAAKsqC,UAAUL,EAAa,IAAI,GAEnDM,EAAU,IAAIjL,YAAY,QAAS,CAAEkL,OAAO,IAC5Cl/D,EAAU,GAChB,IAAIm/D,EAAMJ,EAEV,IAAK,IAAIv+D,EAAI,EAAGA,EAAIq+D,KACfM,EAAM,GAAKv7E,IAKG,WADA8wC,EAAKsqC,UAAUG,GAAK,GALL3+D,GAAK,EAAG,CAUzC,MAAM4+D,EAAiB1qC,EAAKsqC,UAAUG,EAAM,IAAI,GAC1CE,EAAmB3qC,EAAKsqC,UAAUG,EAAM,IAAI,GAC5CG,EAAoB5qC,EAAKoqC,UAAUK,EAAM,IAAI,GAC7CI,EAAc7qC,EAAKoqC,UAAUK,EAAM,IAAI,GACvCK,EAAW9qC,EAAKoqC,UAAUK,EAAM,IAAI,GACpCM,EAAa/qC,EAAKoqC,UAAUK,EAAM,IAAI,GACtCO,EAAoBhrC,EAAKsqC,UAAUG,EAAM,IAAI,GAE7CQ,EAAYR,EAAM,GAClBS,EAAUD,EAAYJ,EAC5B,GAAIK,EAAUh8E,EACb,MAGD,MAAMi8E,EAAgB,IAAIxL,WAAWkB,EAAaoK,EAAWJ,GACvD/N,EAAWyN,EAAQhL,OAAO4L,GAEhC7/D,EAAQ7S,KAAK,CACZhM,KAAMqwE,EACN4N,iBACAC,mBACAC,oBACAI,oBACAI,YAAatO,EAASrL,SAAS,OAGhCgZ,EAAMS,EAAUJ,EAAWC,CAC5B,CAEA,OAAOz/D,CACR,CAEA4+D,0BAAAA,CAA2BlqC,GAC1B,MAAMqrC,EAAYp1E,KAAKC,IAAI,EAAG8pC,EAAKgqC,WAAa,OAChD,IAAK,IAAIl+D,EAAIk0B,EAAKgqC,WAAa,GAAIl+D,GAAKu/D,EAAWv/D,GAAK,EACvD,GAAgC,YAA5Bk0B,EAAKsqC,UAAUx+D,GAAG,GACrB,OAAOA,EAGT,OAAQ,CACT,CAEA69D,cAAAA,CAAer+D,GACd,IAAKxqB,KAAKq8B,SACT,OAGD,IAAK7R,EAAQpc,OAEZ,YADApO,KAAKq8B,SAASv4B,UAAY,gDAAgD9D,KAAK8xC,YAAY9xC,KAAKijF,OAAO,qCAIxG,MAAM72D,EAAO5B,EAAQlc,KAAI,CAACm/B,EAAOvrB,KAChC,MAAMlW,EAAOyhC,EAAM68C,YAChBtqF,KAAKijF,OAAO,WACZjjF,KAAKijF,OAAO,YACTuH,EAAa/8C,EAAM68C,YAAc,IAAMtqF,KAAKk9E,YAAYzvC,EAAMm8C,gBAC9Da,EAAWh9C,EAAM68C,YAAc,IAAMtqF,KAAKk9E,YAAYzvC,EAAMo8C,kBAC5Da,GAAkBj9C,EAAM68C,aAAetqF,KAAK2qF,iBAAiBl9C,GAChE,uFAAuFvrB,MAAUliB,KAAK8xC,YAAY9xC,KAAKijF,OAAO,4BAC9H,IAEH,MAAO,iBAEH/gE,EAAQ,8BACKliB,KAAK8xC,YAAYrE,EAAM9hC,qBACpCK,iBACAw+E,iBACAC,iBACAC,eACD,IACDlnE,KAAK,IAERxjB,KAAKq8B,SAASv4B,UAAY,uGAKnB9D,KAAK8xC,YAAY9xC,KAAKijF,OAAO,iCAC7BjjF,KAAK8xC,YAAY9xC,KAAKijF,OAAO,iCAC7BjjF,KAAK8xC,YAAY9xC,KAAKijF,OAAO,mCAC7BjjF,KAAK8xC,YAAY9xC,KAAKijF,OAAO,iCAC7BjjF,KAAK8xC,YAAY9xC,KAAKijF,OAAO,gEAIlC72D,0BAGFpsB,KAAK4qF,qBACN,CAEA3H,MAAAA,CAAOxiF,EAAKqzC,EAAW,IACtB,MAAM5vC,EAAQlE,KAAK0iF,UAAUjiF,GAC7B,MAAwB,iBAAVyD,GAAsBA,EAAMuC,OAASvC,EAAQ4vC,CAC5D,CAEAm1C,iBAAAA,CAAkB75E,GACjB,MAAM+B,EAAU3K,OAAO4I,GAAO+B,SAAW,IAAI1K,OAC7C,OAAK0K,EAIW,gBAAZA,EACInR,KAAKijF,OAAO,cAGJ,gCAAZ9xE,EACInR,KAAKijF,OAAO,4BAGb9xE,EAXCnR,KAAKijF,OAAO,eAYrB,CAEA/F,WAAAA,CAAYW,GACX,IAAKhpE,OAAOI,SAAS4oE,IAAUA,EAAQ,EACtC,MAAO,IAGR,MAAMC,EAAQ,CAAC,IAAK,KAAM,KAAM,MAChC,IAAI55E,EAAQ25E,EACRE,EAAY,EAChB,KAAO75E,GAAS,MAAQ65E,EAAYD,EAAM1vE,OAAS,GAClDlK,GAAS,KACT65E,GAAa,EAGd,MAAM8M,EAAS3mF,GAAS,KAAqB,IAAd65E,EAAkB,EAAI,EACrD,MAAO,GAAG75E,EAAMi0C,QAAQ0yC,MAAW/M,EAAMC,IAC1C,CAEAjsC,WAAAA,CAAY5tC,GACX,OAAOsC,OAAOtC,GACZkkB,QAAQ,KAAM,SACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,UACdA,QAAQ,KAAM,QACjB,CAEAwiE,mBAAAA,GACM5qF,KAAKq8B,WAAYr8B,KAAKq8B,SAASnK,aAAa,0CAIjDlyB,KAAKq8B,SAAS3sB,aAAa,uCAAwC,QACnE1P,KAAKq8B,SAASzsB,iBAAiB,SAAUtC,IACxC,MAAMhG,EAASgG,EAAMhJ,OAAOqJ,QAAQ,sBACpC,IAAKrG,EACJ,OAGDgG,EAAME,iBACN,MAAM0U,EAAQrN,OAAOvN,EAAOiK,aAAa,sBACpCsD,OAAOI,SAASiN,IAAUA,EAAQ,GAAKA,GAASliB,KAAK0oF,SAASt6E,QAGnEpO,KAAK8qF,cAAc5oE,EAAM,IAE3B,CAEAyoE,gBAAAA,CAAiBl9C,GAChB,IAAKA,GAASA,EAAM68C,cAAgB78C,EAAM9hC,KACzC,OAAO,EAGR,MAAMM,EAAMjM,KAAK+qF,kBAAkBt9C,EAAM9hC,MAKzC,OAJgB,IAAIoF,IAAI,CACvB,OAAQ,MAAO,QAAS,OAAQ,OAAQ,QAAS,OAAQ,OACzD,OAAQ,OAAQ,QAAS,OAAQ,QAAS,OAAQ,SAEpC+X,IAAI7c,EACpB,CAEA,mBAAM6+E,CAAc5oE,GACnB,IAAKliB,KAAKq8B,SACT,OAGD,MAAMoR,EAAQztC,KAAK0oF,SAASxmE,GAC5B,IAAKurB,IAAUztC,KAAK2qF,iBAAiBl9C,GACpC,OAGD,IAAIu9C,EAAQhrF,KAAKq8B,SAAS90B,cAAc,4CACnCyjF,IACJA,EAAQ39E,SAAS2K,cAAc,OAC/BgzE,EAAMloE,UAAY,0CAClB9iB,KAAKq8B,SAAS/R,YAAY0gE,IAG3BA,EAAMlnF,UAAY,gEAAgE9D,KAAK8xC,YAAY9xC,KAAKijF,OAAO,yBAE/G,IACC,MAAMgI,QAAcjrF,KAAKkrF,mBAAmBz9C,GACtCxhC,EAAMjM,KAAK+qF,kBAAkBt9C,EAAM9hC,MAEzC,GAAI3L,KAAKmrF,kBAAkBl/E,GAAM,CAChC,MAAMm/E,EAAO,IAAIxK,KAAK,CAACqK,EAAMnC,QAAS,CAAE98E,KAAMhM,KAAKqrF,iBAAiBp/E,KAC9DE,EAAMsX,IAAI6nE,gBAAgBF,GAKhC,OAJAJ,EAAMlnF,UAAY,gEACuC9D,KAAK8xC,YAAYrE,EAAM9hC,gFAClBQ,WAAanM,KAAK8xC,YAAYrE,EAAM9hC,iBAClGpG,YAAW,IAAMke,IAAI8nE,gBAAgBp/E,IAAM,IAE5C,CAEA,MACMkT,EADU,IAAIm/D,YAAY,QAAS,CAAEkL,OAAO,IAC7BjL,OAAOwM,GACtBO,EAAWxrF,KAAK8xC,YAAYzyB,GAAQrf,KAAKijF,OAAO,uBACtD+H,EAAMlnF,UAAY,gEACwC9D,KAAK8xC,YAAYrE,EAAM9hC,0EACxB6/E,SAC1D,CAAE,MAAOp8E,GACR47E,EAAMlnF,UAAY,8DAA8D9D,KAAK8xC,YAAY9xC,KAAKijF,OAAO,2BAA2BjjF,KAAK8xC,YAAY1iC,GAAO+B,SAAWnR,KAAKijF,OAAO,wBACxL,CACD,CAEA,wBAAMiI,CAAmBz9C,GACxB,IAAKztC,KAAK2oF,aACT,MAAM,IAAIlmF,MAAMzC,KAAKijF,OAAO,yBAG7B,MAAM/jC,EAAO,IAAIihC,SAASngF,KAAK2oF,cACzB7mE,EAASjN,OAAO44B,EAAMy8C,mBAAqB,GACjD,GAAIpoE,EAAS,GAAKo9B,EAAKgqC,WACtB,MAAM,IAAIzmF,MAAMzC,KAAKijF,OAAO,mBAI7B,GAAkB,WADA/jC,EAAKsqC,UAAU1nE,GAAQ,GAExC,MAAM,IAAIrf,MAAMzC,KAAKijF,OAAO,mBAG7B,MAEMwI,EAAY3pE,EAAS,GAFXo9B,EAAKoqC,UAAUxnE,EAAS,IAAI,GAC3Bo9B,EAAKoqC,UAAUxnE,EAAS,IAAI,GAEvC4pE,EAAUD,EAAY52E,OAAO44B,EAAMm8C,gBAAkB,GAC3D,GAAI8B,EAAUxsC,EAAKgqC,WAClB,MAAM,IAAIzmF,MAAMzC,KAAKijF,OAAO,mBAG7B,MAAMuH,EAAa,IAAI3L,WAAW7+E,KAAK2oF,aAAa9mE,MAAM4pE,EAAWC,IAC/DrnF,EAASwQ,OAAO44B,EAAMq8C,mBAAqB,GAEjD,GAAe,IAAXzlF,EACH,OAAOmmF,EAGR,GAAe,IAAXnmF,EAAc,CACjB,GAAmC,oBAAxBsnF,oBACV,MAAM,IAAIlpF,MAAMzC,KAAKijF,OAAO,wBAG7B,MAAM2I,EAAS,IAAIhL,KAAK,CAAC4J,IAAaoB,SAASC,YAAY,IAAIF,oBAAoB,gBAC7EG,QAAqB,IAAIC,SAASH,GAAQ7L,cAChD,OAAO,IAAIlB,WAAWiN,EACvB,CAEA,MAAM,IAAIrpF,MAAMzC,KAAKijF,OAAO,2BAC7B,CAEA8H,iBAAAA,CAAkBp/E,GACjB,MACMqgF,EADQxlF,OAAOmF,GAAQ,IAAInG,cACbgG,MAAM,KAAKC,OAAS,GACxC,OAAKugF,EAAMtgF,SAAS,KAGb,IAAIsgF,EAAMxgF,MAAM,KAAKC,OAAS,KAF7B,EAGT,CAEA0/E,iBAAAA,CAAkBl/E,GACjB,OAAO,IAAI8E,IAAI,CAAC,OAAQ,OAAQ,QAAS,OAAQ,QAAS,OAAQ,SAAS+X,IAAI7c,EAChF,CAEAo/E,gBAAAA,CAAiBp/E,GAUhB,MATY,CACX,OAAQ,YACR,OAAQ,aACR,QAAS,aACT,OAAQ,YACR,QAAS,aACT,OAAQ,gBACR,OAAQ,aAEEA,IAAQ,0BACpB,EAIDw8E,GAASzD,OAAS,IAAI72D,IAEtB,YCvgBM89D,GAAiB,IAAIl7E,IAAI,CAC9B,SAqFD,GAlFA,MACCxQ,WAAAA,GACCP,KAAK2L,KAAO,MACZ3L,KAAKmhF,OAASsH,GAAS3gF,aACxB,CAEAk6E,SAAAA,CAAUjgD,EAAU,CAAC,GACpB,MAAM91B,EAAMzF,OAAOu7B,GAASkgD,UAAUh2E,KAAO,IAAIzG,cACjD,OAAOymF,GAAenjE,IAAI7c,EAC3B,CAEAw1B,MAAAA,CAAOM,EAAU,CAAC,GACjB,MAAMpP,EAAYoP,GAASmgD,iBACrBC,EAAWpqE,QAAQgqB,GAASqgD,IAAID,UAChCn4B,EAAOjoB,GAASioB,KAEhB5+B,EAAM2W,GAAS+5C,SAAS3wD,MAAQ4W,GAAS25C,UAAY,GAC3D,IAAKtwD,EACJ,OAAO,EAGR,MAAM8gE,EAAe5+E,IAChBA,GACHA,EAAME,iBAGPxN,KAAKmhF,OAAOx6D,KAAK,CAChByE,MACA8Q,MAAO6F,GAASkgD,UAAUt2E,MAAQq+C,GAAM74C,QAAQ,kBAAoB,GACpEkwE,aAAcr3B,GAAM74C,QAAQ,kBAAoB,GAChDyxE,OAAQ,CACPuJ,eAAgBniC,GAAM74C,QAAQ,oBAAsB,GACpDi7E,kBAAmBpiC,GAAM74C,QAAQ,wBAA0B,GAC3D80E,aAAcj8B,GAAM74C,QAAQ,kBAAoB,GAChDk7E,WAAYriC,GAAM74C,QAAQ,gBAAkB,GAC5Cm7E,yBAA0BtiC,GAAM74C,QAAQ,gCAAkC,GAC1Eo7E,wBAAyBviC,GAAM74C,QAAQ,8BAAgC,GACvEq7E,QAASxiC,GAAM74C,QAAQ,qBAAuB,GAC9Cs7E,SAAUziC,GAAM74C,QAAQ,sBAAwB,GAChDu7E,UAAW1iC,GAAM74C,QAAQ,uBAAyB,GAClDw7E,UAAW3iC,GAAM74C,QAAQ,uBAAyB,GAClDy7E,YAAa5iC,GAAM74C,QAAQ,yBAA2B,GACtD07E,UAAW7iC,GAAM74C,QAAQ,uBAAyB,GAClD27E,aAAc9iC,GAAM74C,QAAQ,0BAA4B,GACxD47E,aAAc/iC,GAAM1iD,OAAO,YAAc,GACzC0lF,aAAchjC,GAAM74C,QAAQ,kBAAoB,GAChD87E,mBAAoBjjC,GAAM74C,QAAQ,yBAA2B,GAC7D+7E,oBAAqBljC,GAAM74C,QAAQ,0BAA4B,GAC/Dg8E,wBAAyBnjC,GAAM74C,QAAQ,8BAAgC,GACvEi8E,eAAgBpjC,GAAM74C,QAAQ,oBAAsB,GACpDk8E,qBAAsBrjC,GAAM74C,QAAQ,2BAA6B,GACjEm8E,mBAAoBtjC,GAAM74C,QAAQ,eAAiB,KAEnD,EAGGmxE,EAAYvgD,GAASvhC,SAAS+G,cAAc,SAOlD,GANI+6E,IAAcA,EAAUpwD,aAAa,kCACxCowD,EAAU5yE,aAAa,+BAAgC,QACvD4yE,EAAUnhF,UAAUC,IAAI,qBACxBkhF,EAAU1yE,iBAAiB,QAASs8E,IAGjC/J,EACH,OAAOpqE,QAAQuqE,GAGhB,IAAK3vD,EACJ,OAAO,EAGR,MAAM3R,EAAU3T,SAAS2K,cAAc,UAOvC,OANAgJ,EAAQhV,KAAO,SACfgV,EAAQ8B,UAAY,6BACpB9B,EAAQnI,YAAcmxC,GAAM1iD,OAAO,iBAAmB,GACtD0Z,EAAQpR,iBAAiB,QAASs8E,GAClCv5D,EAAUrI,YAAYtJ,IAEf,CACR,GCnFKusE,GAAkB,IAAIx8E,IAAI,CAAC,KAAM,OAEjCy8E,GAAgBA,CAACtpF,EAAO4vC,EAAW,QACxC,MAAM25C,EAAYjnF,OAAOtC,GAAS,IAAIuC,OAAOjB,cAC7C,IAAKioF,EACJ,OAAO35C,EAGR,MAAM45C,EAAQD,EAAUjiF,MAAM,KAAK,GACnC,OAAO+hF,GAAgBzkE,IAAI4kE,GAASA,EAAQ55C,CAAQ,ECErD,MAAM65C,WAAsBpvE,EAAAA,EAC3Bhe,WAAAA,CAAY+Q,EAAIvO,EAAS,CAAC,GACzByb,MAAMlN,EAAIvO,GAEV/C,KAAKa,QAAUb,KAAK8C,WAAWwO,GAAIxQ,EAAAA,EAAAA,IAAgB,CAClD8sF,UAAU,EACV/sD,KAAM,KACNuhD,GAAI,CACHD,UAAU,GAEX0L,QAAS,CACRC,MAAO,CAAC3tF,QAAQ,GAChB4tF,MAAO,CAAC5tF,QAAQ,GAChB6tF,MAAO,CAAC7tF,QAAQ,GAChB8tF,QAAS,CAAC9tF,QAAQ,GAClBkf,KAAM,CAAClf,QAAQ,GACf+tF,OAAQ,CAAC/tF,QAAQ,GACjBqI,IAAK,CAACrI,QAAQ,KAEb4C,IAEH/C,KAAKmuF,UAAY,GACjBnuF,KAAKouF,SAAW,KAChBpuF,KAAKquF,UAAW,EAChBruF,KAAKsuF,UAAY,CAAC,EAClBtuF,KAAK+2C,QAAU,GACf/2C,KAAKuuF,gBAAkB,CAAC,EACxBvuF,KAAKwuF,QAAU,IAAIC,GAAkBzuF,KAAKW,UAC1CX,KAAK0uF,WCjCC,CACN,IAAIC,GACJ,IAAIC,GACJ,IAAIC,GACJ,IAAIC,GACJ,IAAIC,GACJ,IAAIC,ID4BJhvF,KAAKivF,MD5BwBC,EAACC,EAAY3uF,KAC3C,MAAM65C,EAAamzC,GAAc2B,EAAY,IAC7C,GAAI90C,EACH,OAAOA,EAGR,MAAM3yB,EAAc8lE,GAAchtF,GAAS+Q,aAAa,QAAS,IACjE,GAAImW,EACH,OAAOA,EAGR,MAAM0nE,EAAc5B,GAAchtF,GAASmN,QAAQ,WAAW4D,aAAa,QAAS,IACpF,GAAI69E,EACH,OAAOA,EAGR,MAAMC,EAAW7B,GAAcngF,UAAUulB,iBAAiBrhB,aAAa,QAAS,IAChF,OAAI89E,IAIkB7B,GAAcn4E,QAAQ+hB,WAAW2J,SAAU,KAK1D,KAAI,ECEGmuD,CAAuBlvF,KAAKa,QAAQggC,KAAM7gC,KAAKW,UAC5DX,KAAKsvF,MDAuBC,EAAC1uD,EAAO,QACrC,MAAM2uD,EAAiBhC,GAAc3sD,EAAM,MACrCX,EAAWe,GAAcuuD,EAAgB,gBAAkB,CAAC,EAC5DlvD,EAAUY,GAAasuD,EAAgB,gBAAkB,CAAC,EAEhE,MAAO,CACN3uD,KAAM2uD,EACNr+E,QAASA,CAAC1Q,EAAKqzC,EAAW,KAAO5T,EAASz/B,IAAQqzC,EAClDxsC,OAAQA,CAAC7G,EAAKqzC,EAAW,KAAOxT,EAAQ7/B,IAAQqzC,EAChD,ECTay7C,CAAsBvvF,KAAKivF,OACxCjvF,KAAKyvF,aAAe,KACpBzvF,KAAK0vF,gBAAkB,GACvB1vF,KAAK2vF,mBAAqB,KAC1B3vF,KAAK4vF,iBAAmB,KACxB5vF,KAAK6vF,sBAAwB,KAC7B7vF,KAAK8vF,kBAAoB,KACzB9vF,KAAK+vF,mBAAoB,EACzB/vF,KAAKgwF,qBAAuB,GAC5BhwF,KAAKiwF,kBAAoB,KACzBjwF,KAAKkwF,mBAAoB,EACzBlwF,KAAKmwF,qBAAuB,GAC5BnwF,KAAKowF,YAAc,KAEnBpwF,KAAKkI,MACN,CAEA,eAAWI,GACV,MAnDW,aAoDZ,CAEA,mBAAWzF,GACV,MAtDe,gBAuDhB,CAEA,YAAI64E,GACH,OAAO17E,KAAKmuF,SACb,CAEA,WAAIrS,GACH,OAAO97E,KAAKouF,QACb,CAEA,WAAIvS,GACH,OAAO77E,KAAKquF,QACb,CAEA,YAAIpM,GACH,OAAOjiF,KAAKsuF,SACb,CAEA,UAAI3yD,GACH,OAAO37B,KAAK+2C,OACb,CAEA,kBAAIulC,GACH,OAAOt8E,KAAKuuF,eACb,CAEArmF,IAAAA,GACC,MAAMwzE,EAAW17E,KAAKwuF,QAAQ/S,cAG9B,GAFAz7E,KAAKmuF,UAAYzS,EAEb17E,KAAKa,QAAQ+sF,SAAU,CAC1B,MAAMyC,EAAarwF,KAAKwuF,QAAQ5S,iBAAiBF,GACjD17E,KAAKquF,SAAWgC,EAAWxU,QAC3B77E,KAAKouF,SAAWiC,EAAWvU,OAC5B,MACC97E,KAAKquF,UAAW,EAChBruF,KAAKouF,SAAW,KAKjB,OAFApuF,KAAKwuF,QAAQvS,UAAUj8E,KAAKquF,YAEvBruF,KAAKquF,WAIVruF,KAAKsuF,UAAYtuF,KAAKwuF,QAAQhS,YAAYx8E,KAAKmuF,WACxCnuF,KAAK6tF,UACb,CAEAA,OAAAA,GAWC,OAVA7tF,KAAKswF,UAAU,WACftwF,KAAK+2C,QAAU/2C,KAAKwuF,QAAQ9xB,YAC5B18D,KAAKuuF,gBAAkBvuF,KAAKwuF,QAAQtS,sBAAsBl8E,KAAK+2C,SAC/D/2C,KAAKwuF,QAAQpS,mBAAmBp8E,KAAKuuF,iBACrCvuF,KAAKuwF,cACLvwF,KAAKwwF,oBACLxwF,KAAKywF,uBACLzwF,KAAK0wF,uBACL1wF,KAAK2wF,iBAEE3wF,KAAKuuF,eACb,CAEAgC,WAAAA,GACC,MAAMK,EAAY5wF,KAAKuuF,gBAAgB1uE,KACvC,IAAK+wE,EACJ,OAGD,MAAMC,EAAW7wF,KAAK8wF,mBACtB,GAAID,EAAU,CACbD,EAAU9sF,UAAY,GACtB,MAAMkqF,EAAQ3gF,SAAS2K,cAAc,OAYrC,OAXAg2E,EAAM5iE,IAAMylE,EACZ7C,EAAM3iE,IAAMrrB,KAAKsuF,WAAW5R,cAAgB18E,KAAKsuF,WAAW3iF,MAAQ,GACpEqiF,EAAMlrE,UAAY,4BAClBkrE,EAAMp0C,QAAU,OAChBo0C,EAAMp+E,iBAAiB,SAAS,KAC/B5P,KAAK+wF,mBAAmBH,EAAU,IAE/B5wF,KAAKgxF,uBAAuB,UAC/BhxF,KAAKixF,sBAAsBjD,EAAO6C,QAEnCD,EAAUtmE,YAAY0jE,EAEvB,CAEAhuF,KAAK+wF,mBAAmBH,EACzB,CAEAJ,iBAAAA,GACC,MAAMU,EAAclxF,KAAKmxF,kBACnBnV,EAAWh8E,KAAKoxF,eAChBC,EAAerxF,KAAKsxF,4BAEpBC,EAAYvxF,KAAKuuF,gBAAgB5iF,KACnC4lF,IACCvxF,KAAKwxF,gBAAkBxxF,KAAKgxF,uBAAuB,UACtDhxF,KAAKyxF,sBAAsBF,GAC3BvxF,KAAKW,SAAS+O,aAAa,+BAAgC,UACjDwhF,IACVK,EAAUpwF,UAAUG,OAAO,+BAC3BiwF,EAAU14E,YAAcq4E,EACxBlxF,KAAK0xF,sBAAsBH,KAI7B,MAAMI,EAAW3xF,KAAKuuF,gBAAgBtiF,IAClC0lF,GAAY3xF,KAAKsuF,UAAUriF,MAC9B0lF,EAAS94E,YAAc7Y,KAAKsuF,UAAUriF,KAGvC,MAAM2lF,EAAY5xF,KAAKuuF,gBAAgBhgE,KACnCqjE,GAAa5xF,KAAKsuF,UAAUzR,WAC/B+U,EAAU/4E,YAAc7Y,KAAKsuF,UAAUzR,UAGxC,MAAMgV,EAAoB7xF,KAAKuuF,gBAAgBuD,cAC/C,GAAKD,EAIL,OAAIR,GAAgBrV,GACnB6V,EAAkBh5E,YAAcmjE,OAChCh8E,KAAK0xF,sBAAsBG,IAIxB7xF,KAAKsuF,UAAU5R,cAClBmV,EAAkBh5E,YAAc7Y,KAAKsuF,UAAU5R,kBAC/C18E,KAAK0xF,sBAAsBG,SAIxB7xF,KAAKsuF,UAAU3R,UAClBkV,EAAkBh5E,YAAc,IAElC,CAEA44E,qBAAAA,CAAsBF,GACrB,MAAMvV,EAAWh8E,KAAKmxF,kBACtB,IAAKnV,EACJ,OAGDuV,EAAUztF,UAAY,GACtBytF,EAAUpwF,UAAUC,IAAI,+BAExB,MAAMkG,EAAS+F,SAAS2K,cAAc,UACtC1Q,EAAO0E,KAAO,SACd1E,EAAOwb,UAAY,sCACnBxb,EAAOoI,aAAa,aAAc,cAElC,MAAMmQ,EAAOxS,SAAS2K,cAAc,QACpC6H,EAAKiD,UAAY,oCACjBxb,EAAOgjB,YAAYzK,GAEnB,MAAMR,EAAOhS,SAAS2K,cAAc,QACpCqH,EAAKyD,UAAY,oCACjBzD,EAAKxG,YAAcmjE,EACnBh8E,KAAK0xF,sBAAsBryE,GAC3BA,EAAKzP,iBAAiB,SAAUtC,IAC/BA,EAAME,iBACNF,EAAMuD,kBACN7Q,KAAK+xF,oBAAoB,IAG1BzqF,EAAOsI,iBAAiB,SAAUtC,IACjCA,EAAME,iBACNF,EAAMuD,kBACN7Q,KAAK+xF,oBAAoB,IAG1BR,EAAUjnE,YAAYhjB,GACtBiqF,EAAUjnE,YAAYjL,GAEtBrf,KAAK2vF,mBAAqBroF,EAC1BtH,KAAK4vF,iBAAmB/vE,EACxB,MAAMmyE,EAAWhyF,KAAKW,UAAUQ,WAAWE,SAAS,QACjDrB,KAAKW,SACLX,KAAKW,UAAUgN,UAAU,SAC5B3N,KAAK6vF,sBAAwBmC,GAAYhyF,KAAKW,UAAY4wF,EAC1DvxF,KAAKiyF,wBAAwB,GAC7B,MAAMC,EAAwBvE,GAAcwE,oBAAsBnyF,MAAQA,KAAKyvF,eAAiBzvF,KAAKyvF,aAAa2C,OAClHpyF,KAAKqyF,qBAAqBH,GAC1BlyF,KAAKsyF,qBAAqBjzE,EAC3B,CAEA0yE,kBAAAA,GACC,IAAK/xF,KAAKgxF,uBAAuB,SAChC,OAGD,MAAM5lE,EAAMprB,KAAKouF,UAAUjjE,MAAQnrB,KAAKmuF,WAAa,GAChD/iE,GAAQprB,KAAK2vF,qBAIdhC,GAAcwE,mBAAqBxE,GAAcwE,oBAAsBnyF,MAC1E2tF,GAAcwE,kBAAkBI,mBAG5BvyF,KAAKyvF,cAAgBzvF,KAAK0vF,kBAAoBtkE,IAClDprB,KAAKuyF,mBACLvyF,KAAKyvF,aAAe,IAAI+C,MAAMpnE,GAC9BprB,KAAK0vF,gBAAkBtkE,EACvBprB,KAAKyvF,aAAa7/E,iBAAiB,SAAS,KAC3C5P,KAAKqyF,sBAAqB,GAC1BryF,KAAKiyF,wBAAwB,EAAE,IAEhCjyF,KAAKyvF,aAAa7/E,iBAAiB,cAAc,IAAM5P,KAAKyyF,6BAC5DzyF,KAAKyvF,aAAa7/E,iBAAiB,kBAAkB,IAAM5P,KAAKyyF,8BAG7DzyF,KAAKyvF,aAAa2C,OACrBpyF,KAAKyvF,aAAa1I,OAAO7gE,MAAK,KAC7BynE,GAAcwE,kBAAoBnyF,KAClCA,KAAKqyF,sBAAqB,EAAK,IAC7B/rE,OAAM,KACRtmB,KAAKqyF,sBAAqB,EAAM,KAKlCryF,KAAKyvF,aAAajI,QAClBxnF,KAAKqyF,sBAAqB,GACtB1E,GAAcwE,oBAAsBnyF,OACvC2tF,GAAcwE,kBAAoB,OAEpC,CAEAI,gBAAAA,GACC,IAAKvyF,KAAKyvF,aAGT,OAFAzvF,KAAKqyF,sBAAqB,QAC1BryF,KAAKiyF,wBAAwB,GAI9BjyF,KAAKyvF,aAAajI,QAClBxnF,KAAKyvF,aAAahI,YAAc,EAChCznF,KAAKqyF,sBAAqB,GAC1BryF,KAAKiyF,wBAAwB,GACzBtE,GAAcwE,oBAAsBnyF,OACvC2tF,GAAcwE,kBAAoB,KAEpC,CAEAE,oBAAAA,CAAqBK,GACf1yF,KAAK4vF,mBAIV5vF,KAAK4vF,iBAAiB9rF,UAAY4uF,GAAarrF,EAAAA,EAAAA,GAAO,UAAY,IAAOA,EAAAA,EAAAA,GAAO,SAAW,GAC5F,CAEAorF,wBAAAA,GACC,IAAKzyF,KAAKyvF,aAET,YADAzvF,KAAKiyF,wBAAwB,GAI9B,MAAM3xF,EAAWuU,OAAO7U,KAAKyvF,aAAanvF,UAAY,GAChDmnF,EAAc5yE,OAAO7U,KAAKyvF,aAAahI,aAAe,GAC5D,IAAKnnF,IAAauU,OAAOI,SAAS3U,IAAaA,GAAY,EAE1D,YADAN,KAAKiyF,wBAAwB,GAI9B,MAAMU,EAAWx9E,KAAKC,IAAI,EAAGD,KAAKO,IAAI,IAAM+xE,EAAcnnF,EAAY,MACtEN,KAAKiyF,wBAAwBU,EAC9B,CAEAV,uBAAAA,CAAwBW,GACvB,IAAK5yF,KAAK6vF,sBACT,OAGD,MAAM5sE,EAAa9N,KAAKC,IAAI,EAAGD,KAAKO,IAAI,IAAKb,OAAO+9E,IAAY,IAChE5yF,KAAK6vF,sBAAsB97E,MAAMimB,YAAY,yCAA0C,GAAG/W,KAC3F,CAEAwtE,oBAAAA,GACC,MAAMoC,EAAgB7yF,KAAKuuF,gBAAgB7K,SAC3C,IAAKmP,EACJ,OAGD,MAAMC,EAAgB9yF,KAAKsvF,OAAOhoF,OAAO,aAAe,GAClDyrF,GAAe1rF,EAAAA,EAAAA,GAAO,aAAe,GACrC2rF,EAAWxsF,OAAOqsF,EAActlF,SAAW,IAAI7G,cACrD,IAAIuvC,EAAU,KA0Bd,GAxBiB,MAAb+8C,GAAiC,WAAbA,EACvB/8C,EAAU48C,GAEV58C,EAAU48C,EAActrF,cAAc,0CACjC0uC,IACJA,EAAU5oC,SAAS2K,cAAc,UACjCi+B,EAAQjqC,KAAO,SACf6mF,EAAc/uF,UAAY,GAC1B+uF,EAAcvoE,YAAY2rB,KAI5BA,EAAQ90C,UAAUC,IAAI,mCACtB60C,EAAQvmC,aAAa,uCAAwC,QAE5C,MAAbsjF,GAAoB/8C,IAAY48C,GACnC58C,EAAQvmC,aAAa,OAAQ1P,KAAKouF,UAAUjjE,MAAQnrB,KAAKmuF,WAAa,KAClEnuF,KAAKsuF,WAAW3iF,MACnBsqC,EAAQvmC,aAAa,WAAY1P,KAAKsuF,UAAU3iF,OAES,WAAhDnF,OAAOyvC,EAAQ1oC,SAAW,IAAI7G,eACxCuvC,EAAQvmC,aAAa,OAAQ,WAGzBumC,EAAQ/jB,aAAa,6CAA8C,CAIvE,GAHA+jB,EAAQvmC,aAAa,4CAA6C,QAClEumC,EAAQnyC,UAAY,GAEhBivF,EAAc,CACjB,MAAMlzE,EAAOxS,SAAS2K,cAAc,QACpC6H,EAAKiD,UAAY,wCACjBjD,EAAK/b,UAAYivF,EACjB98C,EAAQ3rB,YAAYzK,EACrB,CAEA,GAAIizE,EAAe,CAClB,MAAMzzE,EAAOhS,SAAS2K,cAAc,QACpCqH,EAAKyD,UAAY,wCACjBzD,EAAKxG,YAAci6E,EACnB78C,EAAQ3rB,YAAYjL,EACrB,CACD,CAEK42B,EAAQ/jB,aAAa,uCACzB+jB,EAAQvmC,aAAa,oCAAqC,QAC1DumC,EAAQrmC,iBAAiB,SAAUtC,IAClCA,EAAME,iBACNxN,KAAKojF,eAAe,IAGvB,CAEAA,aAAAA,GACC,MAAMh4D,EAAMprB,KAAKouF,UAAUjjE,MAAQnrB,KAAKmuF,WAAa,GACrD,IAAK/iE,EACJ,OAGD,MAAM4wD,EAAWh8E,KAAKsuF,WAAW5R,cAAgB18E,KAAKsuF,WAAW3iF,MAAQ,OAEzEwY,MAAMiH,EAAK,CACV/mB,OAAQ,MACRsC,YAAa,gBAEZuf,MAAMriB,IACN,IAAKA,EAAS2gB,GACb,MAAM,IAAI/hB,MAAM,QAAQoB,EAASiB,UAElC,OAAOjB,EAASunF,MAAM,IAEtBllE,MAAMklE,IACN,MAAM6H,EAAYxvE,IAAI6nE,gBAAgBF,GACtCprF,KAAKkzF,gBAAgBD,EAAWjX,GAChCz2E,YAAW,IAAMke,IAAI8nE,gBAAgB0H,IAAY,IAAK,IAEtD3sE,OAAM,KACNtmB,KAAKkzF,gBAAgB9nE,EAAK4wD,EAAS,GAEtC,CAEAkX,eAAAA,CAAgB/nE,EAAM6wD,GACrB,MAAMsH,EAAOj2E,SAAS2K,cAAc,KACpCsrE,EAAKn4D,KAAOA,EACZm4D,EAAKvvE,MAAM4E,QAAU,OACrB2qE,EAAK6P,IAAM,sBACPnX,GACHsH,EAAK5zE,aAAa,WAAYssE,GAG/B3uE,SAASvG,KAAKwjB,YAAYg5D,GAC1BA,EAAKC,QACLl2E,SAASvG,KAAK+iE,YAAYyZ,EAC3B,CAEAgP,oBAAAA,CAAqBf,EAAY,MAChC,GAAIvxF,KAAK+vF,mBAAqB/vF,KAAK8vF,oBAAsB9vF,KAAKwxF,eAC7D,OAGD,MAAMpmE,EAAMprB,KAAKouF,UAAUjjE,MAAQnrB,KAAKmuF,WAAa,GAChD/iE,IAILprB,KAAK8vF,kBAAoB9vF,KAAKozF,2BAA2BhoE,GACvDlF,MAAMu5D,GACDA,EAGED,GAAqBC,GAFpB,OAIRv5D,MAAMZ,IACN,IAAKA,EACJ,OAAO,EAGR,IAAI0sC,GAAU,EACd,MAAM91B,EAAQ11B,OAAO8e,EAAK4W,OAAS,IAAIz1B,OACvC,GAAIy1B,EAAO,CACVl8B,KAAKW,SAAS+O,aAAa,mCAAoCwsB,GAE3Dq1D,IACHA,EAAU14E,YAAcqjB,EACxBl8B,KAAK0xF,sBAAsBH,IAG5B,MAAMM,EAAoB7xF,KAAKuuF,iBAAiBuD,cAC5CD,IACHA,EAAkBh5E,YAAc7Y,KAAKoxF,eACrCpxF,KAAK0xF,sBAAsBG,IAG5B7/B,GAAU,CACX,CAEA,GAAI1sC,EAAKu7D,uBAAuBD,MAAQ5gF,KAAKuuF,iBAAiB1uE,KAAM,CAC/D7f,KAAKgwF,sBACRvsE,IAAI8nE,gBAAgBvrF,KAAKgwF,sBAE1BhwF,KAAKgwF,qBAAuBvsE,IAAI6nE,gBAAgBhmE,EAAKu7D,aAErD,MAAM+P,EAAY5wF,KAAKuuF,gBAAgB1uE,KACvC+wE,EAAU9sF,UAAY,GAEtB,MAAMkqF,EAAQ3gF,SAAS2K,cAAc,OACrCg2E,EAAM5iE,IAAMprB,KAAKgwF,qBACjBhC,EAAM3iE,IAAM6Q,GAASl8B,KAAKsuF,WAAW5R,cAAgB18E,KAAKsuF,WAAW3iF,MAAQ,GAC7EqiF,EAAMlrE,UAAY,4BAClBkrE,EAAMp0C,QAAU,OAChBo0C,EAAMp+E,iBAAiB,SAAS,KAC/B5P,KAAK+wF,mBAAmBH,EAAU,IAEnC5wF,KAAKixF,sBAAsBjD,EAAOhuF,KAAKgwF,qBAAsB9zD,GAC7D00D,EAAUtmE,YAAY0jE,GAEtBh8B,GAAU,CACX,CAGA,OADAhyD,KAAK+vF,mBAAoB,EAClB/9B,CAAO,IAEd1rC,OAAM,KAAM,IACZwd,SAAQ,KACR9jC,KAAK8vF,kBAAoB,IAAI,IAEhC,CAEAY,oBAAAA,GACC,IAAK1wF,KAAKgxF,uBAAuB,SAChC,OAGD,GAAIhxF,KAAKkwF,mBAAqBlwF,KAAKiwF,oBAAsBjwF,KAAKqzF,eAC7D,OAGD,MAAMjoE,EAAMprB,KAAKouF,UAAUjjE,MAAQnrB,KAAKmuF,WAAa,GAChD/iE,IAILprB,KAAKiwF,kBAAoBjwF,KAAKszF,2BAA2BloE,EAAKprB,KAAKsuF,WAAW5R,cAAgB18E,KAAKsuF,WAAW3iF,MAAQ,YAAa,aACjIua,MAAMu5D,GACDA,Ef7doBxY,WAC5B,KAAMwY,aAAgBC,MACrB,OAAO,KAGR,MAAMzzE,EA3DmBwzE,KACzB,MAAMzD,EAAWx1E,OAAOi5E,GAAM9zE,MAAQ,IAAInG,cACpCm6E,EAAM3D,EAAS4D,YAAY,KACjC,OAAID,EAAM,GAAKA,GAAO3D,EAAS5tE,OAAS,EAChC,GAED4tE,EAASn6D,MAAM89D,EAAM,EAAE,EAqDlBE,CAAiBJ,GAE7B,IADoBj5E,OAAOi5E,EAAKzzE,MAAQ,IAAIxG,cAAcrD,WAAW,YAChD2+E,GAAiBh4D,IAAI7c,GACzC,OAAO,KAGR,IAAKwzE,EAAKlxD,KACT,OAAO,KAGR,IAAI0kE,EAAY,GAChB,IACCA,EAAYxvE,IAAI6nE,gBAAgB7L,GAEhC,MAAMsO,EAAQ1gF,SAAS2K,cAAc,SACrC+1E,EAAMzG,QAAU,WAChByG,EAAMwF,OAAQ,EACdxF,EAAMxG,aAAc,EACpBwG,EAAMyF,YAAc,YACpBzF,EAAM3iE,IAAM6nE,QArEK3qE,EAuEDylE,EAvEOnrB,EAuEA,iBAvEc,IAAIx8C,SAAQ,CAACuU,EAAStU,KAC5D,MAAMotE,EAAYA,KACjB9wD,IACAhI,GAAQ,EAAK,EAGR+4D,EAAWA,KAChB/wD,IACAtc,EAAO,IAAI5jB,MAAMmgE,GAAW,EAGvBjgC,EAAUA,KACfra,EAAK5W,oBAAoBkxD,EAAW6wB,GACpCnrE,EAAK5W,oBAAoB,QAASgiF,EAAS,EAG5CprE,EAAK1Y,iBAAiBgzD,EAAW6wB,EAAW,CAAE1uF,MAAM,IACpDujB,EAAK1Y,iBAAiB,QAAS8jF,EAAU,CAAE3uF,MAAM,GAAO,KAwDvD,MAAM0P,EAAQI,OAAOk5E,EAAM4F,YAAc,GACnCnjF,EAASqE,OAAOk5E,EAAM6F,aAAe,GACrCtzF,EAAWuU,OAAOk5E,EAAMztF,UAAY,GAE1C,KAAKmU,GAAUjE,GAAWqE,OAAOI,SAASR,IAAWI,OAAOI,SAASzE,IACpE,MAAO,CACNlQ,SAAUuU,OAAOI,SAAS3U,GAAYA,EAAW,EACjDmU,MAAO,EACPjE,OAAQ,GAIV,MAAMqjF,EAAWvzF,EAAW,EAAI6U,KAAKO,IAAI,EAAGP,KAAKC,IAAI,EAAG9U,EAAW,IAAM,OAjEzDwzF,EAAC/F,EAAOgG,IAAS,IAAI3tE,SAAQ,CAACuU,EAAStU,KACxD,MAAM2tE,EAAWA,KAChBrxD,IACAhI,GAAQ,EAAK,EAGRt1B,EAAUA,KACfs9B,IACAtc,EAAO,IAAI5jB,MAAM,QAAQ,EAGpBkgC,EAAUA,KACforD,EAAMr8E,oBAAoB,SAAUsiF,GACpCjG,EAAMr8E,oBAAoB,QAASrM,EAAQ,EAG5C0oF,EAAMn+E,iBAAiB,SAAUokF,EAAU,CAAEjvF,MAAM,IACnDgpF,EAAMn+E,iBAAiB,QAASvK,EAAS,CAAEN,MAAM,IACjDgpF,EAAMtG,YAAcsM,CAAI,IAgDjBD,CAAU/F,EAAO8F,GAEvB,MAAMI,EAAS5mF,SAAS2K,cAAc,UACtCi8E,EAAOx/E,MAAQA,EACfw/E,EAAOzjF,OAASA,EAChB,MAAM0jF,EAAMD,EAAOE,WAAW,MAC9B,IAAKD,EACJ,MAAO,CACN5zF,SAAUuU,OAAOI,SAAS3U,GAAYA,EAAW,EACjDmU,QACAjE,UAIF0jF,EAAIE,UAAUrG,EAAO,EAAG,EAAGt5E,EAAOjE,GAClC,MAAM6jF,OA5DaC,EAACL,EAAQjoF,EAAO,aAAcuoF,EAAU,MAAS,IAAInuE,SAASuU,IAClFs5D,EAAOO,QAAQpJ,GAASzwD,EAAQywD,GAAQ,OAAOp/E,EAAMuoF,EAAQ,IA2DnCD,CAAaL,EAAQ,aAAc,KAE5D,MAAO,CACN3zF,SAAUuU,OAAOI,SAAS3U,GAAYA,EAAW,EACjDmU,QACAjE,SACA6jF,WAAYA,GAAc,KAE5B,CAAE,MACD,OAAO,IACR,CAAE,QACGpB,GACHxvE,IAAI8nE,gBAAgB0H,EAEtB,CAnHiBwB,IAACnsE,EAAMs6C,CAmHxB,Ee0ZU8xB,CAAqBjV,GAFpB,OAIRv5D,MAAMZ,IACN,KAAKA,GAAUA,EAAK+uE,sBAAsBzT,MAAU5gF,KAAKuuF,iBAAiB1uE,MACzE,OAAO,EAGJ7f,KAAKmwF,sBACR1sE,IAAI8nE,gBAAgBvrF,KAAKmwF,sBAE1BnwF,KAAKmwF,qBAAuB1sE,IAAI6nE,gBAAgBhmE,EAAK+uE,YAErD,MAAMzD,EAAY5wF,KAAKuuF,gBAAgB1uE,KACvC+wE,EAAU9sF,UAAY,GAEtB,MAAMkqF,EAAQ3gF,SAAS2K,cAAc,OAcrC,OAbAg2E,EAAM5iE,IAAMprB,KAAKmwF,qBACjBnC,EAAM3iE,IAAMrrB,KAAKsuF,WAAW5R,cAAgB18E,KAAKsuF,WAAW3iF,MAAQ,GACpEqiF,EAAMlrE,UAAY,4BAClBkrE,EAAMp0C,QAAU,OAChBo0C,EAAMp+E,iBAAiB,SAAS,KAC/B5P,KAAK+wF,mBAAmBH,EAAU,IAE/B5wF,KAAKgxF,uBAAuB,UAC/BhxF,KAAKixF,sBAAsBjD,EAAOhuF,KAAKmwF,qBAAsBnC,EAAM3iE,KAEpEulE,EAAUtmE,YAAY0jE,GAEtBhuF,KAAKkwF,mBAAoB,GAClB,CAAI,IAEX5pE,OAAM,KAAM,IACZwd,SAAQ,KACR9jC,KAAKiwF,kBAAoB,IAAI,IAEhC,CAEA,gCAAMmD,CAA2BhoE,EAAM,IACtC,MAAMzf,EAAO3L,KAAKsuF,WAAW5R,cAAgB18E,KAAKsuF,WAAW3iF,MAAQ,YACrE,OAAO3L,KAAKszF,2BAA2BloE,EAAKzf,EAAM,aACnD,CAEA,gCAAM2nF,CAA2BloE,EAAM,GAAIzf,EAAO,OAAQgpF,EAAc,4BACvE,IACC,MAAM9wF,QAAiBsgB,MAAMiH,EAAK,CACjC/mB,OAAQ,MACRsC,YAAa,gBAEd,IAAK9C,EAAS2gB,GACb,OAAO,KAGR,MAAM4mE,QAAavnF,EAASunF,OAC5B,OAAKA,GAASA,EAAK78D,KAIZ,IAAImxD,KAAK,CAAC0L,GAAOz/E,EAAM,CAC7BK,KAAMo/E,EAAKp/E,MAAQ2oF,EACnBC,aAAc/xD,KAAKmL,QALZ,IAOT,CAAE,MACD,OAAO,IACR,CACD,CAEAijD,qBAAAA,CAAsB4D,EAAWzpE,EAAM,GAAI8Q,EAAQ,IAClD,IAAK24D,EACJ,OAGD,MAAMC,EAAWtuF,OAAO4kB,GAAO,IAAI3kB,OACnC,IAAKquF,EACJ,OAGD,MAAMC,EAAavuF,OAAO01B,GAASl8B,KAAKsuF,WAAW5R,cAAgB18E,KAAKsuF,WAAW3iF,MAAQ,IAAIlF,OAC/FouF,EAAUnlF,aAAa,sCAAuColF,GAC9DD,EAAUnlF,aAAa,wCAAyCqlF,GAChEF,EAAU1zF,UAAUC,IAAI,qBAEpByzF,EAAU3iE,aAAa,0CAI3B2iE,EAAUnlF,aAAa,uCAAwC,QAC/DmlF,EAAUjlF,iBAAiB,SAAUtC,IACpCA,EAAME,iBACNF,EAAMuD,kBAEN,MAAMmkF,EAAUxuF,OAAOquF,EAAUtjF,aAAa,wCAA0C,IAAI9K,OAC5F,IAAKuuF,EACJ,OAGD,MAAMC,EAAYzuF,OAAOquF,EAAUtjF,aAAa,0CAA4C,IAAI9K,OAC3FzG,KAAKowF,cACTpwF,KAAKowF,YAAcrP,GAAWj5E,eAG/B9H,KAAKowF,YAAYzpE,KAAK,CACrByE,IAAK4pE,EACL94D,MAAO+4D,EACP5T,aAAcrhF,KAAKsvF,OAAOn+E,QAAQ,gBAAkB,IACnD,IAEJ,CAEAw/E,cAAAA,GACC,MAAMuE,EAAan9E,QAAQ/X,KAAKa,SAASuhF,IAAID,YAAcniF,KAAKm1F,qCAC1DjT,EAAmBliF,KAAKo1F,yBAAyB,CACtDC,YAAaH,IAEd,IAAKhT,IAAqBgT,EAEzB,YADAl1F,KAAKswF,UAAU,SAIZpO,IACHA,EAAiBp+E,UAAY,IAG9B,MAAMi+B,EAAU,CACfvhC,QAASR,KAAKW,SACd+6E,SAAU17E,KAAKmuF,UACfrS,QAAS97E,KAAKouF,SACdnM,SAAUjiF,KAAKsuF,UACfpM,mBACArhD,KAAM7gC,KAAKivF,MACXjlC,KAAMhqD,KAAKsvF,MACXlN,GAAIpiF,KAAKa,SAASuhF,IAAM,CAAC,GAG1B,IAAIkT,GAAW,EAuBf,GAtBAt1F,KAAK0uF,WAAWtsF,SAASmzF,IACxB,IAAID,GAA2C,mBAAxBC,GAAUvT,WAAwD,mBAArBuT,GAAU9zD,QAGzEzhC,KAAKw1F,mBAAmBD,GAAU5pF,OAIlC4pF,EAASvT,UAAUjgD,GAAxB,CAIA,IACCuzD,GAAwC,IAA7BC,EAAS9zD,OAAOM,EAC5B,CAAE,MAAO3yB,GACRkmF,GAAW,CACZ,CACIA,GACHt1F,KAAKW,SAAS+O,aAAa,+BAAgC6lF,EAAS5pF,MAAQ,SAR7E,CASA,KAGI2pF,IAAaJ,EAGjB,OAFAl1F,KAAKW,SAASwxB,gBAAgB,qCAC9BnyB,KAAKswF,UAAU,SAGhBtwF,KAAKswF,UAAU,QAChB,CAEA8E,wBAAAA,CAAyBryF,EAAS,CAAC,GAElC,GADoBK,OAAO+E,UAAUhE,eAAeiE,KAAKrF,EAAQ,gBAAiBgV,QAAQhV,EAAOsyF,YAChF,CAChB,MAAMI,EAAkBz1F,KAAKuuF,gBAAgBV,SAAW7tF,KAAKW,SAAS4G,cAAc,wCAOpF,OANIkuF,IACHA,EAAgB3xF,UAAY,GAC5B2xF,EAAgBt0F,UAAUG,OAAO,WACjCm0F,EAAgB/lF,aAAa,SAAU,UACvC+lF,EAAgB/lF,aAAa,cAAe,SAEtC,IACR,CAEA,MAAMgmF,EAAkB11F,KAAKuuF,gBAAgBV,QAC7C,GAAI6H,EAKH,OAJAA,EAAgBv0F,UAAUC,IAAI,WAC9Bs0F,EAAgBvjE,gBAAgB,UAChCujE,EAAgBvjE,gBAAgB,eAChCujE,EAAgBhmF,aAAa,2BAA4B,WAClDgmF,EAGR,MAAMC,EAAiB31F,KAAKW,SAAS4G,cAAc,wCACnD,GAAIouF,EAKH,OAJAA,EAAex0F,UAAUC,IAAI,WAC7Bu0F,EAAexjE,gBAAgB,UAC/BwjE,EAAexjE,gBAAgB,eAC/BnyB,KAAKuuF,gBAAgBV,QAAU8H,EACxBA,EAGR,MAAMhjE,EAAYtlB,SAAS2K,cAAc,OAMzC,OALA2a,EAAU7P,UAAY,UACtB6P,EAAUjjB,aAAa,2BAA4B,WACnD1P,KAAKW,SAAS2pB,YAAYqI,GAC1B3yB,KAAKuuF,gBAAgBV,QAAUl7D,EAExBA,CACR,CAEAwiE,kCAAAA,GACC,OAAIn1F,KAAKwxF,eACDxxF,KAAKgxF,uBAAuB,SAIxB,SADAxqF,OAAOxG,KAAKsuF,WAAWriF,KAAO,IAAIzG,cAEtCxF,KAAKgxF,uBAAuB,OAGhChxF,KAAKqzF,eACDrzF,KAAKgxF,uBAAuB,UAGhChxF,KAAK41F,iBAIL51F,KAAK61F,gBACD71F,KAAKgxF,uBAAuB,UAGhChxF,KAAK81F,iBACD91F,KAAKgxF,uBAAuB,aAGhChxF,KAAK+1F,eACD/1F,KAAKgxF,uBAAuB,QAIrC,CAEAwE,kBAAAA,CAAmBQ,EAAe,IACjC,MASM9pD,EARM,CACX8hD,MAAO,QACPD,MAAO,QACPvlF,IAAK,MACL0lF,OAAQ,SACRhlF,IAAK,UACLmW,KAAM,QAPM7Y,OAAOwvF,GAAgB,IAAIvvF,QAUxC,OAAKylC,GAIElsC,KAAKgxF,uBAAuB9kD,EACpC,CAEA8kD,sBAAAA,CAAuBiF,EAAY,IAClC,MAAM/pD,EAAQ1lC,OAAOyvF,GAAa,IAAIxvF,OACtC,IAAKylC,EACJ,OAAO,EAGR,MAAM2hD,EAAU7tF,KAAKa,SAASgtF,QAC9B,IAAKA,GAA8B,iBAAZA,GAAwBz8E,MAAMiP,QAAQwtE,GAC5D,OAAO,EAGR,IAAKzqF,OAAO+E,UAAUhE,eAAeiE,KAAKylF,EAAS3hD,GAClD,OAAO,EAGR,MAAMtmC,EAASioF,EAAQ3hD,GACvB,MAAsB,kBAAXtmC,EACHA,KAGHA,GAA4B,iBAAXA,GAAuBwL,MAAMiP,QAAQza,OAItDxC,OAAO+E,UAAUhE,eAAeiE,KAAKxC,EAAQ,WAI3CmS,QAAQnS,EAAOzF,OACvB,CAEA2wF,gBAAAA,GACC,MAAM7kF,EAAMzF,OAAOxG,KAAKsuF,WAAWriF,KAAO,IAAIzG,cAE9C,MADkB,CAAC,OAAQ,QAAS,OAAQ,OAAQ,QAAS,OAAQ,OAAQ,QAAS,QACvEkG,SAASO,KAIjBjM,KAAKouF,UAAUjjE,MAAQnrB,KAAKmuF,YAH3B,EAIT,CAEAyH,YAAAA,GACC,MAAM3pF,EAAMzF,OAAOxG,KAAKsuF,WAAWriF,KAAO,IAAIzG,cAC9C,MAAO,CAAC,OAAQ,QAAS,OAAQ,OAAQ,QAAS,OAAQ,OAAQ,QAAS,OAAQ,OAAQ,QAAS,QAAS,SAASkG,SAASO,EAChI,CAEA4pF,aAAAA,GACC,MAAM5pF,EAAMzF,OAAOxG,KAAKsuF,WAAWriF,KAAO,IAAIzG,cAC9C,MAAO,CAAC,OAAQ,QAAS,OAAQ,QAAS,OAAQ,QAAS,OAAQ,OAAQ,QAAQkG,SAASO,EAC7F,CAEA6pF,cAAAA,GACC,MAAM7pF,EAAMzF,OAAOxG,KAAKsuF,WAAWriF,KAAO,IAAIzG,cAC9C,MAAO,CAAC,QAAQkG,SAASO,EAC1B,CAEA8pF,WAAAA,GACC,MAAM9pF,EAAMzF,OAAOxG,KAAKsuF,WAAWriF,KAAO,IAAIzG,cAC9C,MAAO,CAAC,OAAQ,MAAO,OAAQ,QAAS,OAAQ,OAAQ,QAAS,OAAQ,OAAQ,QAAS,QAAQkG,SAASO,EAC5G,CAEA8kF,kBAAAA,CAAmBH,GAClB,MAAM/wE,GAAOxY,EAAAA,EAAAA,GAAOrH,KAAKmuF,WAMzByC,EAAU9sF,UALL+b,GACkB,EAKxB,CAEA6xE,qBAAAA,CAAsB1lD,GAChBA,GAAUA,EAAMj4B,QAIrBi4B,EAAMj4B,MAAMgF,SAAW,OACvBizB,EAAMj4B,MAAMyH,SAAW,OACvBwwB,EAAMj4B,MAAMqI,SAAW,SACvB4vB,EAAMj4B,MAAMmiF,aAAe,WAC3BlqD,EAAMj4B,MAAMoiF,WAAa,SAC1B,CAEA,WAAOjuF,CAAK1H,EAASuC,EAAS,CAAC,GAC9B,OAAO4qF,GAAc5lF,oBAAoBvH,EAASuC,EACnD,CAEA,4BAAOqzF,GACN,MAAMC,EAAQ1I,GAAcwE,kBACxBkE,GAA2C,mBAA3BA,EAAM9D,kBACzB8D,EAAM9D,mBAGP5E,GAAcwE,kBAAoB,IACnC,CAEA,sCAAOmE,CAAgCC,EAAQ,IAC9C,MAAMF,EAAQ1I,GAAcwE,kBACvBkE,GAAUA,EAAM11F,UAAayQ,MAAMiP,QAAQk2E,IAAWA,EAAMnoF,QAI9CmoF,EAAMt+D,MAAM3P,MACzBA,GAAiC,mBAAlBA,EAAKjnB,YAIlBinB,IAAS+tE,EAAM11F,UAAY2nB,EAAKjnB,SAASg1F,EAAM11F,eAItD01F,EAAM9D,mBACN5E,GAAcwE,kBAAoB,KAEpC,CAEA7B,SAAAA,CAAU13E,EAAQ,IACjB,MAAM1U,EAAQsC,OAAOoS,GAAS,IAAInS,OAC7BvC,EAILlE,KAAKW,SAAS+O,aAAa,4BAA6BxL,GAHvDlE,KAAKW,SAASwxB,gBAAgB,4BAIhC,CAEAq/D,YAAAA,GACC,MAAMvlF,EAAMzF,OAAOxG,KAAKsuF,WAAWriF,KAAO,IAAIzG,cAC9C,MAAO,CAAC,OAAQ,OAAQ,OAAQ,QAAS,OAAQ,OAAQ,QAAS,QAAQkG,SAASO,EACpF,CAEAonF,YAAAA,GACC,MAAMpnF,EAAMzF,OAAOxG,KAAKsuF,WAAWriF,KAAO,IAAIzG,cAC9C,MAAO,CAAC,OAAQ,QAAS,OAAQ,OAAQ,OAAQ,OAAQ,QAAQkG,SAASO,EAC3E,CAEAmlF,YAAAA,GACC,OAAO5qF,OAAOxG,KAAKsuF,WAAW5R,cAAgB18E,KAAKsuF,WAAW3iF,MAAQ,IAAIlF,MAC3E,CAEA+vF,mBAAAA,GAEC,OADiBhwF,OAAOxG,KAAKW,UAAU4Q,aAAa,cAAgB,IAAI9K,QAKjED,OAAOxG,KAAKW,UAAU4Q,aAAa,qCAAuC,IAAI9K,MACtF,CAEA6qF,yBAAAA,GACC,MAAMmF,EAAWz2F,KAAKw2F,sBACtB,IAAKC,EACJ,OAAO,EAGR,MAAMza,EAAWh8E,KAAKoxF,eACtB,OAAKpV,GAIEya,IAAaza,CACrB,CAEAmV,eAAAA,GAEC,OADiBnxF,KAAKw2F,uBAKfx2F,KAAKoxF,cACb,EAGD,MEz8BA,GFy8BA,GGj8BA,MAAMsF,WAAoBn4E,EAAAA,EACzBhe,WAAAA,CAAYC,EAASuC,EAAS,CAAC,EAAG6f,EAAW,CAAC,GAC7CpE,MAAMhe,EAASuC,GAEf/C,KAAKa,QAAUb,KAAK8C,WAAWtC,GAASM,EAAAA,EAAAA,IAAgB8hB,EAAU7f,IAClE/C,KAAKa,QAAQqH,KAAQ,SAAUnF,GAAWA,EAAOmF,MAAQlI,KAAKa,QAAQqH,KAEjElI,KAAKa,QAAQqH,MAIlBlI,KAAK+gE,gBAAiB,EAEtB/gE,KAAK22F,MAAOlyF,EAAAA,EAAAA,GAAK,OACjBzE,KAAK42F,OAAS,GACd52F,KAAK62F,QAAU,IAAI9lF,IACnB/Q,KAAK82F,gBAAkB,IAAI3oE,IAC3BnuB,KAAK+2F,mBAAqB,IAAI5oE,IAE9BnuB,KAAKyO,OAAS,CACbuoF,KAAMz0F,EAAAA,EAAUC,KAAK,IAAIxC,KAAKi3F,UAAU,UAAWj3F,KAAKW,UACxDmM,KAAMvK,EAAAA,EAAUC,KAAK,IAAIxC,KAAKi3F,UAAU,UAAWj3F,KAAKW,UACxD2kC,KAAM/iC,EAAAA,EAAUC,KAAK,IAAIxC,KAAKi3F,UAAU,UAAWj3F,KAAKW,WAGzDX,KAAK0pB,SAAW,gIAChB1pB,KAAKk3F,qBAAwBrnF,GAAM7P,KAAKm3F,OAAOtnF,GAAGvL,QAElDtE,KAAKkB,SApBJlB,KAAK+gE,gBAAiB,CAqBxB,CAEAk2B,SAAAA,CAAUtrF,GAWT,MAVY,CACX,KAAQ,gBACR,gBAAiB,yBACjB,KAAQ,gBACR,YAAa,sBACb,KAAQ,gBACR,YAAa,sBACb,eAAgB,wBAChB,OAAU,mBAEAA,IAAS,EACrB,CAEAyrF,2BAAAA,CAA4BC,GAC3B,MAAMC,EAASt3F,KAAKa,SAASy2F,OAE7B,OAAKA,GACAlmF,MAAMiP,QAAQg3E,IAAWA,EAAMjpF,OAE7BipF,EAAM/oF,KAAI,CAACmxE,EAAMv9D,KACvB,IAAKu9D,EAAM,OAAOA,EAElB,IAAI8X,EAAU,KAQd,GANsB,mBAAXD,EACVC,EAAUD,EAAO7X,EAAMv9D,IACF,IAAXo1E,IACVC,EAAUv3F,KAAKw3F,yBAAyB/X,GAAM9zE,MAAQ,OAAQuW,KAG1Dq1E,GAA8B,iBAAZA,GAA2C,KAAnBA,EAAQ9wF,OAAe,OAAOg5E,EAC7E,GAAIA,EAAK9zE,OAAS4rF,EAAS,OAAO9X,EAElC,IACC,MAAMgY,EAAU,IAAI/X,KAAK,CAACD,GAAO8X,EAAS,CACzCvrF,KAAMyzE,EAAKzzE,MAAQ,2BACnB4oF,aAAcnV,EAAKmV,cAAgB/xD,KAAKmL,QAczC,MAVA,CAAC,KAAM,MAAO,SAAS5rC,SAAS6rB,SACZlnB,IAAf04E,EAAKxxD,IACR7qB,OAAO2tB,eAAe0mE,EAASxpE,EAAM,CACpC/pB,MAAOu7E,EAAKxxD,GACZypE,UAAU,EACV/+D,YAAY,GAEd,IAGM8+D,CACR,CAAE,MAAO5nF,GAER,OAAO4vE,CACR,KAtCmB4X,CAwCrB,CAEAG,wBAAAA,CAAyB9a,EAAcx6D,GACtC,MAAMy1E,EAAenxF,OAAOk2E,GAAgB,QAEtCkb,EAAWD,EAAa/X,YAAY,KACpCiY,EAASD,EAAW,GAAKA,EAAWD,EAAavpF,OAAS,EAE1DyJ,EAAOggF,EAASF,EAAa91E,MAAM,EAAG+1E,GAAYD,EAClD1rF,EAAM4rF,EAASF,EAAa91E,MAAM+1E,EAAW,GAAK,GAElDE,EAAQj1D,KAAKmL,MACb+pD,EAAM71E,EAAQ,EAEd81E,EAAiBngF,EAAKpR,QAAU,OACtC,OAAOwF,EAAM,GAAG+rF,KAAkBF,KAASC,KAAO9rF,IAAQ,GAAG+rF,KAAkBF,KAASC,GACzF,CAEA72F,KAAAA,GACMlB,KAAK+gE,iBAE+C,IAAxClsD,OAAO7U,KAAKa,SAASo3F,QAAQp6B,QAG7C79D,KAAKk4F,iCAAgC,GACrCl4F,KAAKm4F,sBAELn4F,KAAKk4F,kCAGNl4F,KAAKo4F,oBACN,CAEAjB,MAAAA,CAAO7rE,EAAQ,MACd,MAAM+sE,EAAgB/sE,GAAO+rE,MAC7B,IAAKgB,GAAejqF,OAAQ,OAE5B,MAAMkqF,EAAat4F,KAAKo3F,4BAA4BhmF,MAAMC,KAAKgnF,IAEzDE,EAAmD,IAAxC1jF,OAAO7U,KAAKa,SAASo3F,QAAQp6B,OAK9C,GAHC9lD,QAAQ/X,KAAKa,SAASunB,UACtBmwE,EAaA,OAVAv4F,KAAKw4F,OAAM,GACXx4F,KAAKyY,OAAO6/E,GAAY,GACxBt4F,KAAKy4F,cACLz4F,KAAKm4F,qBACLn4F,KAAK04F,iBAEL14F,KAAK42F,OAAS52F,KAAK24F,aAAaL,GAC5Bt4F,KAAKa,QAAQk6D,SAAS/6D,KAAK42F,OAAOgC,eAEtC54F,KAAKsf,QAIDtf,KAAKa,QAAQg4F,SAIjB74F,KAAKw4F,QACLx4F,KAAKyY,OAAO6/E,GAAY,GACxBt4F,KAAKsf,UALLtf,KAAKyY,OAAO6/E,GAAY,GACxBt4F,KAAKsf,QAMP,CAEAA,KAAAA,GACCtf,KAAK84F,cAED94F,KAAKa,QAAQ8C,MACZ3D,KAAK8xD,QAAQ5pD,OAChBlI,KAAK8xD,QAAQ5pD,OAEblI,KAAK+4F,UAAU/4F,KAAK42F,QAErB52F,KAAK+4F,UAAU/4F,KAAK42F,UAEpB52F,KAAK+4F,UAAU/4F,KAAK42F,QAEqC,IAAxC/hF,OAAO7U,KAAKa,SAASo3F,QAAQp6B,OAI7C79D,KAAKm4F,qBAFLn4F,KAAKg5F,sBAAsBh5F,KAAK42F,QAKnC,CAEAn+E,MAAAA,CAAOxU,EAAQmkB,GAAU,GACxB,MAAM6wE,EAAWj5F,KAAKo3F,4BAA4BhmF,MAAMC,KAAKpN,IAC7D,IAAIi1F,EAaJ,OAVCA,EADG9wE,EACc6wE,EAEAj5F,KAAKm5F,mBAAmBF,EAAUj5F,KAAK42F,OAAQ7+E,QAAQ/X,KAAKa,QAAQk6D,UAGtF/6D,KAAK42F,OAAS52F,KAAK24F,aAAaO,GAEhCl5F,KAAKo5F,gBACLp5F,KAAKsyF,qBAAqBtyF,KAAK42F,QAExB52F,KAAK42F,MACb,CAEAuC,kBAAAA,CAAmBF,EAAW,GAAInpE,EAAW,GAAIirC,GAAU,GAC1D,MAAMs+B,EAAUt+B,EACb,IAAIk+B,KAAanpE,GACjB,IAAIA,KAAampE,GAEdpgC,EAAO,IAAI9nD,IACX6kB,EAAS,GAYf,OAVAyjE,EAAQj3F,SAASq9E,IAChB,MAAMh/E,EAAMT,KAAKs5F,YAAY7Z,GACzB5mB,EAAK/vC,IAAIroB,KAIbo4D,EAAKz3D,IAAIX,GACTm1B,EAAOje,KAAK8nE,GAAK,IAGX7pD,CACR,CAEA0jE,WAAAA,CAAY7Z,GACX,MAAO,GAAGA,EAAK9zE,QAAQ8zE,EAAKlxD,QAAQkxD,EAAKzzE,MAC1C,CAEAutF,kBAAAA,CAAmB9Z,GAClB,MAAM+Z,EAAa/Z,GAAM+Z,WACzB,OAAKA,GAAoC,iBAAfA,GAA2BpoF,MAAMiP,QAAQm5E,GAAoB,CAAC,EACjFA,CACR,CAEAC,mBAAAA,CAAoBh5F,GACnB,OAAKA,EAEE+F,OAAO/F,GACZ2nB,QAAQ,qBAAsB,SAC9BA,QAAQ,UAAW,KACnBA,QAAQ,iBAAkB,IAC1BA,QAAQ,MAAO,KACfA,QAAQ,SAAU,IAClB5iB,cARe,EASlB,CAEAk0F,qBAAAA,CAAsBx1F,GACrB,GAAIA,SAAmD,KAAVA,EAAc,OAAO,KAClE,GAAqB,iBAAVA,EACV,IACC,OAAO+f,KAAKC,UAAUhgB,EACvB,CAAE,MAAO2L,GACR,OAAOrJ,OAAOtC,EACf,CAED,OAAOA,CACR,CAEAy1F,wBAAAA,CAAyBla,EAAMma,EAAY,CAAC,GAC3C,MAAM9uE,EAAQ,IAAK8uE,GACbJ,EAAax5F,KAAKu5F,mBAAmB9Z,GAe3C,OAbAr8E,OAAOonB,QAAQgvE,GAAYp3F,SAAQ,EAAE3B,EAAKyD,MACzC,MAAM21F,EAAU75F,KAAKy5F,oBAAoBh5F,GACzC,IAAKo5F,EAAS,OAEd,MAAMlxC,EAAW,QAAQkxC,IACzB,GAAIz2F,OAAO+E,UAAUhE,eAAeiE,KAAK0iB,EAAO69B,GAAW,OAE3D,MAAMx/B,EAAYnpB,KAAK05F,sBAAsBx1F,GAC3B,OAAdilB,IAEJ2B,EAAM69B,GAAYx/B,EAAS,IAGrB2B,CACR,CAEA6tE,YAAAA,CAAatB,GACZr3F,KAAK62F,QAAQ2B,QACb,MAAM,MAAE36B,EAAK,MAAE9hC,EAAK,MAAE/U,GAAUhnB,KAAKa,QAAQo3F,OACvC6B,EAAkB,KAAR/9D,EAAe,KACzBg+D,EAAuB,KAAR/yE,EAAe,KAEpC,IAAIgzE,EAAmB,EACvB,MAAMC,EAAW,GAEjB,IAAK,MAAMxa,KAAQ4X,EAAO,CACzB,GAAIx5B,EAAQ,GAAKo8B,EAAS7rF,QAAUyvD,EAAO,CAC1C79D,KAAK62F,QAAQz1F,IAAI,YACjB,KACD,CAEA,IAAIy6E,GAAU,EAEV77E,KAAKa,QAAQq5F,MAAM9rF,SAAWpO,KAAKa,QAAQq5F,MAAMxuF,SAAS+zE,EAAKzzE,QAClEhM,KAAK62F,QAAQz1F,IAAI,YACjBy6E,GAAU,GAGP4D,EAAKlxD,KAAOurE,IACf95F,KAAK62F,QAAQz1F,IAAI,YACjBy6E,GAAU,GAGPA,GAAWke,EAAe,IACzBC,EAAmBva,EAAKlxD,KAAOwrE,GAClC/5F,KAAK62F,QAAQz1F,IAAI,iBACjBy6E,GAAU,GAEVme,GAAoBva,EAAKlxD,MAIvBstD,GAASoe,EAAStiF,KAAK8nE,EAC5B,CAEA,OAAOwa,CACR,CAEAE,SAAAA,CAAU5rE,EAAMlO,GAAU,GACzB,MAAM+5E,EAAY/5E,EAAUrgB,KAAK42F,OAAO70E,QAAO,CAACgG,EAAKsyE,IAAMtyE,EAAMsyE,EAAE9rE,MAAM,GAAKA,EACxEuvD,EAAQ,CAAC,OAAQ,WAAY,WAAY,YACzC57D,EAAQk4E,EAAY,EAAIjlF,KAAKO,IAAIP,KAAK2gB,MAAM3gB,KAAK1L,IAAI2wF,GAAajlF,KAAK1L,IAAI,OAAQq0E,EAAM1vE,OAAS,GAAK,EACvGlK,EAAQk2F,EAAYjlF,KAAKmlF,IAAI,KAAMp4E,GAEzC,OAAO,IAAIq4E,KAAKC,aAAax6F,KAAKa,QAAQggC,KAAM,CAC/C9sB,MAAO,OACPypE,KAAMM,EAAM57D,GACZu4E,YAAa,QACbC,sBAAuB,IACrBv6C,OAAOj8C,EACX,CAEAw0F,cAAAA,GACC14F,KAAK62F,QAAQ2B,QACb,MAAMmC,EAAap4F,EAAAA,EAAUC,KAAK,IAAIxC,KAAKi3F,UAAU,YAAaj3F,KAAKW,UACnEg6F,GACHA,EAAWr5F,QAEb,CAEA83F,aAAAA,GACC,IAAKp5F,KAAK62F,QAAQtoE,KAAM,OAExB,MAAM2R,EAAWe,GAAcjhC,KAAKa,QAAQggC,KAAM,UAAY7gC,KAAK46F,qBACnE,IAAID,EAAap4F,EAAAA,EAAUC,KAAK,IAAIxC,KAAKi3F,UAAU,YAAaj3F,KAAKW,UAEhEg6F,EAIJA,EAAW72F,UAAY,IAHvB62F,EAAa36F,KAAK22F,KAAKjyF,IAAI,CAAEC,MAAO3E,KAAKi3F,UAAU,YACnDj3F,KAAKW,SAASo6D,QAAQ4/B,IAKvB36F,KAAK62F,QAAQz0F,SAAQy4F,IACpB,MAAMC,EAAM56D,EAAS26D,IAAWA,EAChCF,EAAWliF,OAAOzY,KAAK22F,KAAK5rE,KAAK,CAAEpmB,MAAO,cAAgBm2F,GAAK,GAEjE,CAEAF,kBAAAA,GACC,MAAM,MAAE/8B,EAAK,MAAE9hC,EAAK,MAAE/U,GAAUhnB,KAAKa,QAAQo3F,OAC7C,MAAO,CACN,WAAY,UAAUp6B,IACtB,WAAY,aAAa9hC,MACzB,gBAAiB,mBAAmB/U,MACpC,WAAY,YAAYhnB,KAAKa,QAAQq5F,MAAM12E,KAAK,QAElD,CAEAu1E,SAAAA,CAAU1B,GACLr3F,KAAKyO,OAAO62B,KACftlC,KAAK+6F,kBAAkB1D,GACbr3F,KAAKyO,OAAO3B,MACtB9M,KAAKg7F,gBAAgB3D,GAGtBr3F,KAAKi7F,4BAA4Bj7F,KAAK42F,OACvC,CAEAsE,cAAAA,GACC,MAAMz5D,EAASzhC,KAAK8xD,QACdqpC,EAAmB,+JACzB,IAAIC,EAAOp7F,KAAK0pB,UAAYyxE,EAExB15D,GACCA,EAAO45D,iBAAgBD,EAAO35D,EAAO45D,gBAG1C,MAAMC,EAAOjuF,SAAS2K,cAAc,OACpCsjF,EAAKx3F,UAAYs3F,EACjB,IAAIG,EAAYD,EAAKn7E,kBAEhBo7E,IACJD,EAAKx3F,UAAYq3F,EACjBI,EAAYD,EAAKn7E,mBAElB,MAAMq7E,EAAYD,EAAUz4E,WAAa,GACnC24E,EAAcD,EAAYA,EAAUhwF,MAAM,KAAKvJ,QAAOC,GAAsB,KAAfA,EAAIuE,SAAiB,GAElFi1F,EAAaH,EAAUI,kBAEvBx2D,EAAW,GACjB,IAAK,IAAIna,EAAI,EAAGA,EAAI0wE,EAAY1wE,IAC/Bma,EAASxtB,KAAK,CACbuK,MAAO8I,EACPxqB,QAAS+6F,EAAUp2D,SAASna,GAC5BlI,UAAWy4E,EAAUp2D,SAASna,GAAGlI,YAInC,MAAO,CACNqiB,SAAUA,EACVzb,SAAU0xE,EACVI,UAAWC,EACXG,YAAaJ,EAEf,CAEAT,iBAAAA,CAAkB1D,GACjB,IAAKr3F,KAAKyO,OAAO62B,KAAM,OAEvB,IAAIu2D,EAAQt5F,EAAAA,EAAUC,KAAK,IAAIxC,KAAKi3F,UAAU,eAAgBj3F,KAAKyO,OAAO62B,MACrEu2D,IACJA,EAAQ77F,KAAK22F,KAAK9qE,GAAG,GAAI,CAAElnB,MAAO3E,KAAKi3F,UAAU,gBAGlD,MAAM6E,EAAiB97F,KAAKk7F,iBAAiB/1D,SACvC42D,EAAwB/7F,KAAKk7F,iBAAiBM,UAAUv5F,QAAOC,GAAe,SAARA,IACtE85F,EAAW3uF,SAAS4uF,yBAE1B5E,EAAMj1F,SAASq9E,IACd,IAAIptD,EAAU0pE,EAEV/7F,KAAKa,QAAQq7F,QAAQ7pE,EAAQ1a,KAAK,eAClC3X,KAAKa,QAAQ2+C,SAAS/Q,SAASpc,EAAQ1a,KAAK,iBACd,IAA9B3X,KAAKa,QAAQo3F,OAAOp6B,QACvBxrC,EAAQ1a,KAAK,UAET8nE,EAAKzzE,KAAK7J,WAAW,UACxBkwB,EAAQ1a,KAAK,gBAEb0a,EAAQ1a,KAAK,gBAIf,IAAI8rC,EAAQ,GACZq4C,EAAe15F,SAAQg5F,IACtB,MAAMj0C,EAAOnnD,KAAKm8F,oBAAoBf,EAAK56F,QAASi/E,EAAM,KAAM,CAAE2c,QAAQ,IACtEj1C,GAAM1D,EAAM9rC,KAAKwvC,EAAK,IAG3B,MAAMk1C,EAAMr8F,KAAK22F,KAAKlnF,GACrBzP,KAAK25F,yBAAyBla,EAAM,CACnC,YAAaA,EAAK9zE,KAClB,YAAa8zE,EAAKlxD,MAAQ,EAC1B,UAAWkxD,EAAKjuE,IAAM,GACtB7M,MAAO,QAAU0tB,EAAQ7O,KAAK,OAE/BigC,GAGDu4C,EAAS1xE,YAAY+xE,EAAI,IAG1BR,EAAM/3F,UAAY,GAClB+3F,EAAMvxE,YAAY0xE,GAElB,MAAMM,EAAW/5F,EAAAA,EAAUC,KAAK,IAAIxC,KAAKi3F,UAAU,kBAAmBj3F,KAAKyO,OAAO62B,MAC9Eg3D,IACCjF,EAAMjpF,OAAQgkB,EAAAA,EAAQhxB,IAAIk7F,EAAU,aACnClqE,EAAAA,EAAQ9wB,OAAOg7F,EAAU,aAE2B,IAAxCznF,OAAO7U,KAAKa,SAASo3F,QAAQp6B,SAEzCw5B,EAAMjpF,OAAQgkB,EAAAA,EAAQ9wB,OAAOg7F,EAAU,QACtClqE,EAAAA,EAAQhxB,IAAIk7F,EAAU,UAI7Bt8F,KAAKyO,OAAO62B,KAAKhb,YAAYuxE,GAC7BzpE,EAAAA,EAAQhxB,IAAIpB,KAAKyO,OAAO62B,KAAM,SAC/B,CAEA01D,eAAAA,CAAgB3D,GACf,IAAKr3F,KAAKyO,OAAO3B,KAAM,OAEvB,IAAI+uF,EAAQt5F,EAAAA,EAAUC,KAAK,IAAIxC,KAAKi3F,UAAU,eAAgBj3F,KAAKW,UAC9Dk7F,IACJA,EAAQ77F,KAAK22F,KAAK9qE,GAAG,GAAI,CAAElnB,MAAO3E,KAAKi3F,UAAU,eACjDj3F,KAAKyO,OAAO3B,KAAKwd,YAAYuxE,IAGzB77F,KAAKa,QAAQiM,MAAMslB,EAAAA,EAAQhxB,IAAIy6F,EAAO,YAE3C,MAAMC,EAAiB97F,KAAKk7F,iBAAiB/1D,SACvC42D,EAAwB/7F,KAAKk7F,iBAAiBM,UAAUv5F,QAAOC,GAAe,SAARA,IACtEq6F,EAAkBnrF,MAAMC,KAAKwqF,EAAM12D,UAAY,IAC/Cq3D,EAAgB,IAAIruE,IAC1BouE,EAAgBn6F,SAASinB,IACxB,MAAM5oB,EAAMT,KAAKy8F,gBAAgBpzE,GAC7B5oB,IACE4oB,EAAM6I,aAAa,kBACvB7I,EAAM3Z,aAAa,gBAAiBjP,GAErC+7F,EAAc55F,IAAInC,EAAK4oB,GACxB,IAGD,MAAMqzE,EAAY,GA2BlB,GAzBArF,EAAMj1F,SAAQ,CAACq9E,EAAMz0D,KACpB,MAAM2xE,EAAU38F,KAAKs5F,YAAY7Z,GAC3Bmd,EAAY58F,KAAK68F,sBAAsBpd,EAAMz0D,GAC7C8xE,EAAeN,EAAcv5F,IAAI05F,GAEvC,GAAIG,GAAgBA,EAAavrF,aAAa,4BAA8BqrF,EAAW,CACtF,MAAMG,EAAgBD,EAAav1F,cAAc,cAMjD,OALIw1F,IACHA,EAAclkF,YAAc,GAAGmS,EAAI,MAEpC0xE,EAAU/kF,KAAKmlF,QACfN,EAAc92F,OAAOi3F,EAEtB,CAEIG,IACHnP,GAAc2I,gCAAgC,CAACwG,IAC/CA,EAAax7F,UAGd,MAAM25D,EAAWj7D,KAAKg9F,oBAAoBvd,EAAMz0D,EAAG8wE,EAAgBC,EAAuBY,EAASC,GACnGF,EAAU/kF,KAAKsjD,GACfuhC,EAAc92F,OAAOi3F,EAAQ,IAG1BH,EAAcjuE,KAAM,CACvB,MAAM0uE,EAAe7rF,MAAMC,KAAKmrF,EAAcv4F,UAC9C0pF,GAAc2I,gCAAgC2G,GAC9CA,EAAa76F,SAASkmB,GAASA,EAAKhnB,UACrC,CAEAo7F,EAAUt6F,SAASkmB,IAClBuzE,EAAMvxE,YAAYhC,EAAK,IAGxBtoB,KAAKk9F,uBAAuBrB,GAE5BzpE,EAAAA,EAAQhxB,IAAIpB,KAAKyO,OAAO3B,KAAM,OAC/B,CAEA+vF,qBAAAA,CAAsBpd,EAAMv9D,GAC3B,MAAMgvE,EAAclxF,KAAKm9F,oBAAoB1d,GACvC2d,EAAcp9F,KAAKq9F,wBAAwB5d,GAMjD,MAAO,GALIA,GAAMjuE,IAAM,MACViuE,GAAM9zE,MAAQ,MACd8zE,GAAMlxD,MAAQ,KACdkxD,GAAMzzE,MAAQ,MAEaklF,KAAekM,GACxD,CAEAX,eAAAA,CAAgBn0E,GACf,IAAKA,GAAqC,mBAAtBA,EAAK/W,aACxB,MAAO,GAGR,MAAM4gE,EAAW3rE,OAAO8hB,EAAK/W,aAAa,kBAAoB,IAAI9K,OAClE,GAAI0rE,EACH,OAAOA,EAGR,MAAMxmE,EAAOnF,OAAO8hB,EAAK/W,aAAa,cAAgB,IAAI9K,OACpD8nB,EAAO/nB,OAAO8hB,EAAK/W,aAAa,cAAgB,IAAI9K,OACpDuF,EAAOxF,OAAO8hB,EAAK/W,aAAa,cAAgB,IAAI9K,OAC1D,GAAIkF,GAAQ4iB,GAAQviB,EACnB,MAAO,GAAGL,KAAQ4iB,KAAQviB,IAG3B,MAAM+8B,EAAMviC,OAAO8hB,EAAK/W,aAAa,cAAgB,IAAI9K,OACzD,IAAKsiC,EACJ,MAAO,GAGR,IACC,MAAM6J,EAAS3uB,KAAK/c,MAAM6hC,GACpBu0D,EAAQ92F,OAAOosC,GAAQjnC,MAAQ,IAAIlF,OACnC82F,EAAQ/2F,OAAOosC,GAAQrkB,MAAQ,IAAI9nB,OACnC+2F,EAAQh3F,OAAOosC,GAAQ5mC,MAAQ,IAAIvF,OACzC,GAAI62F,GAASC,GAASC,EACrB,MAAO,GAAGF,KAASC,KAASC,GAE9B,CAAE,MACD,MAAO,EACR,CAEA,MAAO,EACR,CAEAR,mBAAAA,CAAoBvd,EAAMz0D,EAAGyyE,EAAeC,EAAqBf,EAASC,GACzE,IAAIvqE,EAAU,IAAIqrE,GAEd19F,KAAKa,QAAQmtF,OAAO37D,EAAQ1a,KAAK,cACjC3X,KAAKa,QAAQiM,MAAMulB,EAAQ1a,KAAK,aAChC3X,KAAKa,QAAQq7F,QAAQ7pE,EAAQ1a,KAAK,eAClC3X,KAAKa,QAAQ2+C,SAAS/Q,SAASpc,EAAQ1a,KAAK,iBAChD,MAAMylF,EAAcp9F,KAAKq9F,wBAAwB5d,GAC3CyR,EAAclxF,KAAKm9F,oBAAoB1d,GAE7C,IAAIh8B,EAAQ,GACZg6C,EAAcr7F,SAAQg5F,IACrB,MAAMj0C,EAAOnnD,KAAKm8F,oBAAoBf,EAAK56F,QAASi/E,EAAMz0D,GACtDm8B,GAAM1D,EAAM9rC,KAAKwvC,EAAK,IAG3B,MAAMw2C,EAAU,CACf,YAAale,EAAK9zE,KAClB,YAAa8zE,EAAKlxD,MAAQ,EAC1B,YAAakxD,EAAKzzE,MAAQ,GAC1B,UAAWyzE,EAAKjuE,IAAM,GACtB,gBAAiBmrF,EACjB,yBAA0BC,EAC1Bj4F,MAAO,QAAU0tB,EAAQ7O,KAAK,KAAO,KAUtC,OAPI45E,IACHO,EAAQ,uBAAyBP,EACjCO,EAAQ,eAAiB,qBACzBA,EAAQ,sBAAwBle,EAAK9zE,MAAQ,GAC7CgyF,EAAQ,oCAAsCzM,GAAezR,EAAK9zE,MAAQ,IAGpE3L,KAAK22F,KAAKlnF,GAChBzP,KAAK25F,yBAAyBla,EAAMke,GACpCl6C,EAEF,CAEA04C,mBAAAA,CAAoB37F,EAASi/E,EAAMv9D,EAAQ,KAAMvc,EAAU,CAAC,GAC3D,IAAKnF,EAAS,OAAO,KACrB,MAAM,OAAE47F,GAAS,GAAUz2F,EAErBxE,EAAYX,GAASW,UAE3B,GAAIA,GAAWE,SAAS,cAAe,OAAOrB,KAAK49F,eAAene,GAClE,GAAIt+E,GAAWE,SAAS,aACvB,OAAI+6F,EAAe,KACZp8F,KAAK69F,cAAcpe,EAAMv9D,GAEjC,GAAI/gB,GAAWE,SAAS,eAAgB,OAAOrB,KAAK89F,kBAAkB99F,KAAK+9F,gBAAgBte,IAE3F,MAAMue,EAAQx9F,EAAQy9F,WAAU,GAMhC,OAJAj+F,KAAKk+F,qBAAqBF,EAAO,eAAe,IAAMh+F,KAAK49F,eAAene,KAC1Ez/E,KAAKk+F,qBAAqBF,EAAO,cAAc,IAAM5B,EAAS,KAAOp8F,KAAK69F,cAAcpe,EAAMv9D,KAC9FliB,KAAKk+F,qBAAqBF,EAAO,gBAAgB,IAAMh+F,KAAK+9F,gBAAgBte,KAErEz/E,KAAK89F,kBAAkBE,EAC/B,CAEAF,iBAAAA,CAAkBx1E,GACjB,IAAKA,EAAM,OAAO,KAClB,GAAIA,EAAKnnB,WAAWE,SAAS,eAAgB,OAAOinB,EAEpD,MAAM5I,EAAUrS,SAAS2K,cAAc,OAIvC,OAHA0H,EAAQoD,UAAY,cACpBpD,EAAQ4K,YAAYhC,GAEb5I,CACR,CAEAw+E,oBAAAA,CAAqBvrE,EAAW/gB,EAAU2jF,IACrB5iE,GAAWkB,SAAWlB,EAAUkB,QAAQjiB,GAC9B,CAAC+gB,GAAavhB,MAAMC,KAAKshB,EAAUnjB,iBAAiBoC,KAE1ExP,SAASkmB,IAChB,MAAM61E,EAAc5I,IAChB4I,EAAa71E,EAAK81E,YAAYD,GAC7B71E,EAAKhnB,QAAQ,GAEpB,CAEAy8F,eAAAA,CAAgBte,GACf,GAAIz/E,KAAKa,QAAQq7F,OAChB,OAAOl8F,KAAK22F,KAAKjyF,IAAI,CAAEC,MAAO,eAAiB,CAC9C3E,KAAKq+F,kBAAkB5e,IAG1B,CAEAoe,aAAAA,CAAcpe,EAAMz0D,GACnB,GAAIhrB,KAAKa,QAAQiM,KAAM,CACtB,MAAMokF,EAAclxF,KAAKm9F,oBAAoB1d,GAC7C,OAAQz/E,KAAK22F,KAAKjyF,IAAI,CAAEC,MAAO,aAAe,CAC7C3E,KAAK22F,KAAK5rE,KAAK,CAAEpmB,MAAO,aAAe,GAAGqmB,EAAI,MAC9ChrB,KAAK22F,KAAK5rE,KAAK,CAAEpmB,MAAO,QAAUusF,GAClClxF,KAAK22F,KAAK5rE,KAAK,CAAEpmB,MAAO,QAAU,IAAI3E,KAAKm6F,UAAU1a,EAAKlxD,UAC1DvuB,KAAK22F,KAAK5rE,KAAK,CAAEpmB,MAAO,YAAc,KAExC,CACD,CAEAi5F,cAAAA,CAAene,GACd,MAAM6e,EAAat+F,KAAK22F,KAAKjyF,IAAI,CAAEC,MAAO,eAEpCymB,EAAMq0D,GAAMr0D,KAAOq0D,GAAMuO,MAC/B,GAAI5iE,EAEH,OADAkzE,EAAWh0E,YAAYtqB,KAAK22F,KAAKhnF,IAAIyb,EAAKq0D,EAAK9zE,MAAQ,GAAI,CAAEhH,MAAO,kBAC7D25F,EAGR,MAAM9E,EAAax5F,KAAKu5F,mBAAmB9Z,GACrC8e,EAAa/3F,OAAOgzF,EAAW+E,YAAc,IAAI93F,OACvD,GAAI83F,EAEH,OADAD,EAAWh0E,YAAYtqB,KAAK22F,KAAKhnF,IAAI4uF,EAAYv+F,KAAKm9F,oBAAoB1d,GAAO,CAAE96E,MAAO,kBACnF25F,EAGR,GAAI7e,GAAMzzE,MAAQyzE,EAAKzzE,KAAK7J,WAAW,UAAW,CACjD,MAAM8wF,EAAYjzF,KAAKw+F,kBAAkB/e,GACzC,OAAKwT,GAGLqL,EAAWh0E,YAAYtqB,KAAK22F,KAAKhnF,IAAIsjF,EAAWxT,EAAK9zE,KAAM,CAAEhH,MAAO,kBAC7D25F,GAHCA,CAIT,CAEA,MAAMz+E,EAAO7f,KAAKy+F,mBAAmBhf,GAErC,OADA6e,EAAWh0E,YAAYtqB,KAAK22F,KAAK3rE,EAAE,CAAC,EAAGnL,EAAM,CAAE0K,QAAQ,KAChD+zE,CACR,CAEAnB,mBAAAA,CAAoB1d,GACnB,MAAM+Z,EAAax5F,KAAKu5F,mBAAmB9Z,GAE3C,OADkBj5E,OAAOgzF,EAAWkF,YAAc,IAAIj4F,QAK/CD,OAAOi5E,GAAM9zE,MAAQ,IAAIlF,MACjC,CAEAg4F,kBAAAA,CAAmBhf,GAClB,OAAOp4E,EAAAA,EAAAA,GAAOo4E,EACf,CAEA4d,uBAAAA,CAAwB5d,GAEvB,OADYj5E,OAAOi5E,GAAMr0D,KAAOq0D,GAAMuO,OAAS,IAAIvnF,QAK5CzG,KAAKw+F,kBAAkB/e,EAC/B,CAEA+e,iBAAAA,CAAkB/e,GACjB,KAAKA,GAAwB,oBAATC,MAA0BD,aAAgBC,MAC7D,MAAO,GAGR,MAAMj/E,EAAMT,KAAKs5F,YAAY7Z,GAC7B,GAAIz/E,KAAK82F,gBAAgBhuE,IAAIroB,GAC5B,OAAOT,KAAK82F,gBAAgB7zF,IAAIxC,GAGjC,MAAMwyF,EAAYxvE,IAAI6nE,gBAAgB7L,GAEtC,OADAz/E,KAAK82F,gBAAgBl0F,IAAInC,EAAKwyF,GACvBA,CACR,CAEAzB,YAAAA,CAAa/R,GACZ,IAAKA,EACJ,OAAO,EAIR,GADiBj5E,OAAOi5E,EAAKzzE,MAAQ,IAAIxG,cAC5BrD,WAAW,UACvB,OAAO,EAGR,MAAMwJ,EAAOnF,OAAOi5E,EAAK9zE,MAAQ,IAAInG,cACrC,MAAO,yCAAyC8xB,KAAK3rB,EACtD,CAEAgzF,uBAAAA,CAAwBlf,EAAMh/E,EAAKyD,GAC7Bu7E,GAASh/E,IAITg/E,EAAK+Z,YAAyC,iBAApB/Z,EAAK+Z,aAA2BpoF,MAAMiP,QAAQo/D,EAAK+Z,aACjFp2F,OAAO2tB,eAAe0uD,EAAM,aAAc,CACzCv7E,MAAO,CAAC,EACRwzF,UAAU,EACV/+D,YAAY,IAId8mD,EAAK+Z,WAAW/4F,GAAOyD,EACxB,CAEAouF,oBAAAA,CAAqB+E,EAAQ,IAC5B,IAAKjmF,MAAMiP,QAAQg3E,KAAWA,EAAMjpF,OACnC,OAGD,MAAMwwF,EAAU,GAEhBvH,EAAMj1F,SAASq9E,IACd,IAAKz/E,KAAKwxF,aAAa/R,GACtB,OAGD,MAAMkd,EAAU38F,KAAKs5F,YAAY7Z,GACjC,GAAIz/E,KAAK+2F,mBAAmBjuE,IAAI6zE,GAC/B,OAGD,MAAMnD,EAAax5F,KAAKu5F,mBAAmB9Z,GAC3C,GAAI+Z,EAAWkF,YAAclF,EAAW+E,WACvC,OAGD,MAAMM,EAAOrf,GAAqBC,GAChCv5D,MAAMZ,IACN,IAAKA,EACJ,OAAO,EAGR,IAAI0sC,GAAU,EAOd,GALI1sC,EAAK4W,QACRl8B,KAAK2+F,wBAAwBlf,EAAM,aAAcn6D,EAAK4W,OACtD81B,GAAU,GAGP1sC,EAAKu7D,YAAa,CACrB,MAAMie,EAAW,SAASnC,IAC1B,IAAIoC,EAAW/+F,KAAK82F,gBAAgB7zF,IAAI67F,GACnCC,IACJA,EAAWt7E,IAAI6nE,gBAAgBhmE,EAAKu7D,aACpC7gF,KAAK82F,gBAAgBl0F,IAAIk8F,EAAUC,IAEpC/+F,KAAK2+F,wBAAwBlf,EAAM,aAAcsf,GACjD/sC,GAAU,CACX,CAEA,OAAOA,CAAO,IAEd1rC,OAAM,KAAM,IACZJ,MAAM0P,IACN51B,KAAK+2F,mBAAmBrxF,OAAOi3F,GACxB/mE,KAGT51B,KAAK+2F,mBAAmBn0F,IAAI+5F,EAASkC,GACrCD,EAAQjnF,KAAKknF,EAAK,IAGdD,EAAQxwF,QAIbgY,QAAQ44E,WAAWJ,GAAS14E,MAAM+4E,IACdA,EAAQhnE,MAAMnoB,GAAyB,cAAhBA,EAAKhL,SAAyC,IAAfgL,EAAK5L,SAC1DlE,KAAK42F,OAAOxoF,QAIhCpO,KAAK+4F,UAAU/4F,KAAK42F,OAAO,GAE7B,CAEAsG,sBAAAA,CAAuBx9F,GACtB,IAAKM,KAAKyO,OAAO3B,OAASpN,EACzB,OAGD,MAAMmhC,EAAO7gC,KAAKa,SAASggC,MAAQxzB,SAASulB,gBAAgBiO,MAAQ,MACtDt+B,EAAAA,EAAUqf,QAAQ,wBAAyBliB,IAAS,IAE5D0C,SAASkmB,IACdqlE,GAAc5lF,oBAAoBugB,EAAM,CACvCuY,OACAuhD,GAAI,CACHD,UAAU,IAEV,GAEJ,CAEA2W,WAAAA,GACC,IAAK94F,KAAKyO,OAAOuoF,KAAM,OAEvB,MAAMoD,EAAYp6F,KAAKm6F,UAAUn6F,KAAK42F,QAAQ,GACxCsI,EAAS38F,EAAAA,EAAUC,KAAK,IAAIxC,KAAKi3F,UAAU,gBAAiBj3F,KAAKyO,OAAOuoF,MAC1EkI,IACHA,EAAOp7F,UAAY9D,KAAK42F,OAAOxoF,OAAS,GAAGpO,KAAK42F,OAAOxoF,gBAAgBgsF,YAAsB,IAG9FhoE,EAAAA,EAAQhxB,IAAIpB,KAAKyO,OAAOuoF,KAAM,OAC/B,CAEAgC,qBAAAA,CAAsB3B,GACrBr3F,KAAKm4F,qBACL,MAAM6D,EAAW3uF,SAAS4uF,yBACpBkD,EAAWx3E,EAAAA,EAAY1kB,IAAIV,EAAAA,EAAUC,KAAK,QAASxC,KAAKW,UAAW,QAAU,GAC7EgL,EAAOpJ,EAAAA,EAAUswB,OAAOssE,EAASn/F,KAAKW,WAAWgL,MAAQpJ,EAAAA,EAAUswB,OAAOssE,EAASn/F,KAAKW,WAAWyT,QAAQsoE,cAAgB,UAE3H0iB,EAAWzzF,EAAKglE,SAAS,MAAQhlE,EAAKkW,MAAM,GAAI,GAAKlW,EACF,IAAxCkJ,OAAO7U,KAAKa,SAASo3F,QAAQp6B,SAI9Cw5B,EAAMj1F,SAAQ,CAACq9E,EAAMv9D,KACpB,MAAMoJ,EAAQje,SAAS2K,cAAc,SACrCsT,EAAMtf,KAAO,OACbsf,EAAM3f,KAAO,GAAGyzF,KAAYl9E,KAC5BoJ,EAAMlX,QAAQirF,QAAU,YACxB13E,EAAAA,EAAY/G,KAAK0K,GAEjB,MAAMvb,EAAe,IAAIuvF,aACzBvvF,EAAa+b,MAAM1qB,IAAIq+E,GACvBn0D,EAAM+rE,MAAQtnF,EAAasnF,MAC3B2E,EAAS1xE,YAAYgB,EAAM,IAG5BtrB,KAAKW,SAAS2pB,YAAY0xE,GAC3B,CAEA7D,kBAAAA,GACC51F,EAAAA,EAAUqf,QAAQ,8BAA+B5hB,KAAKW,UAAUyB,SAAQkP,GAAMA,EAAGhQ,UAClF,CAEAk3F,KAAAA,CAAM+G,GAAa,GAClB,MAAMC,EAAgB,GACtB,GAAIx/F,KAAKyO,OAAO3B,KAAM,CACrB,MAAM2yF,EAAYl9F,EAAAA,EAAUC,KAAK,IAAIxC,KAAKi3F,UAAU,eAAgBj3F,KAAKW,UACrE8+F,GAAWt6D,UAAU/2B,QACxBoxF,EAAc7nF,QAAQvG,MAAMC,KAAKouF,EAAUt6D,UAE7C,CACA,GAAInlC,KAAKyO,OAAO62B,KAAM,CACrB,MAAMo6D,EAAYn9F,EAAAA,EAAUC,KAAK,IAAIxC,KAAKi3F,UAAU,eAAgBj3F,KAAKW,UACrE++F,GAAWv6D,UAAU/2B,QACxBoxF,EAAc7nF,QAAQvG,MAAMC,KAAKquF,EAAUv6D,UAE7C,CAaA,GAZIq6D,EAAcpxF,QACjBu/E,GAAc2I,gCAAgCkJ,GAG/Cx/F,KAAKy4F,cACD8G,GACHv/F,KAAK2/F,kBAEN3/F,KAAKm4F,qBACLn4F,KAAK04F,iBACL14F,KAAK42F,OAAS,GAEV52F,KAAKyO,OAAO3B,KAAM,CACrBslB,EAAAA,EAAQ9wB,OAAOtB,KAAKyO,OAAO3B,KAAM,QACjC,MAAM+uF,EAAQt5F,EAAAA,EAAUC,KAAK,IAAIxC,KAAKi3F,UAAU,eAAgBj3F,KAAKW,UACjEk7F,IAAOA,EAAM/3F,UAAY,GAC9B,CACA,GAAI9D,KAAKyO,OAAO62B,KAAM,CACrB,MAAMu2D,EAAQt5F,EAAAA,EAAUC,KAAK,IAAIxC,KAAKi3F,UAAU,eAAgBj3F,KAAKW,UACjEk7F,IAAOA,EAAM/3F,UAAY,IAE7B,MAAMw4F,EAAW/5F,EAAAA,EAAUC,KAAK,IAAIxC,KAAKi3F,UAAU,kBAAmBj3F,KAAKW,UACvE27F,IACHlqE,EAAAA,EAAQ9wB,OAAOg7F,EAAU,aAEgC,IAAxCznF,OAAO7U,KAAKa,SAASo3F,QAAQp6B,QAE7CzrC,EAAAA,EAAQhxB,IAAIk7F,EAAU,SAIxBlqE,EAAAA,EAAQ9wB,OAAOtB,KAAKyO,OAAO62B,KAAM,SAClC,CACItlC,KAAKyO,OAAOuoF,MACf5kE,EAAAA,EAAQ9wB,OAAOtB,KAAKyO,OAAOuoF,KAAM,OAEnC,CAEAyB,WAAAA,GACCz4F,KAAK82F,gBAAgB10F,SAAS+J,IAC7BsX,IAAI8nE,gBAAgBp/E,EAAI,IAEzBnM,KAAK82F,gBAAgB0B,QACrBx4F,KAAK+2F,mBAAmByB,OACzB,CAEAmH,eAAAA,GACCp9F,EAAAA,EAAUqf,QAAQ,2BAA4B5hB,KAAKW,UAAUyB,SAAQkpB,GAASA,EAAMpnB,MAAQ,IAC7F,CAEAg0F,+BAAAA,CAAgC0H,GAAY,GAC3C,MAAMtuF,EAAK/O,EAAAA,EAAUC,KAAK,2BAA4BxC,KAAKW,UACtD2Q,IACAsuF,GAActuF,EAAG8C,QAAQsoE,aAGnBkjB,GAAatuF,EAAG8C,QAAQsoE,eAClCprE,EAAG3F,KAAO2F,EAAG8C,QAAQsoE,oBACdprE,EAAG8C,QAAQsoE,eAJlBprE,EAAG8C,QAAQsoE,aAAeprE,EAAG3F,KAC7B2F,EAAG6gB,gBAAgB,SAKrB,CAEAimE,iBAAAA,GACC71F,EAAAA,EAAUqf,QAAQ,2BAA4B5hB,KAAKW,UAAUyB,SAAQkP,IACpEA,EAAGI,oBAAoB,SAAU1R,KAAKk3F,sBACtC5lF,EAAG1B,iBAAiB,SAAU5P,KAAKk3F,qBAAqB,GAE1D,CAEA70F,OAAAA,GACCrC,KAAKw4F,QACLh6E,MAAMnc,SACP,EAGD,yBC9nBA,SAjYA,MACC9B,WAAAA,CAAYoF,EAAU,CAAC,GAEtB3F,KAAK6pB,KAAOlkB,EAAQkkB,MAAQ,aAC5B7pB,KAAK6/F,YAAcl6F,EAAQk6F,aAAe,EAC1C7/F,KAAK8/F,cAAgBn6F,EAAQm6F,eAAiB,EAC9C9/F,KAAK+/F,cAAgBp6F,EAAQo6F,eAAiB,EAC9C//F,KAAKggG,WAAar6F,EAAQq6F,YAAc,IAGxChgG,KAAKigG,QAAU,IAAI9xE,IACnBnuB,KAAKkgG,UAAY,GACjBlgG,KAAKmgG,MAAQ,GACbngG,KAAKogG,gBAAkB,GAGvBpgG,KAAKqgG,YAAc,EACnBrgG,KAAKsgG,UAAW,EAGhBtgG,KAAKyuD,UAAY,CAChBkkC,SAAU,GACV5tD,SAAU,GACV31B,MAAO,GACPmxF,YAAa,IAGdvgG,KAAKwgG,uBAAyBxgG,KAAKygG,iBAAiB9+F,KAAK3B,KAC1D,CAOA,gBAAM0gG,CAAWjhB,EAAMtzE,EAAKxG,EAAU,CAAC,GACtC,MAAM6L,EAAKxR,KAAK2gG,aACVC,EAAa,CAClBpvF,KACAiuE,OACAtzE,MACAxG,UACAb,OAAQ,UACR6tF,SAAU,EACVkO,SAAU,EACVjrE,OAAQ,KACRxmB,MAAO,KACP0xF,UAAW,KACXC,QAAS,KACTC,WAAY,IAAIv/C,gBAChBz6C,OAAQ,MAKT,OAFAhH,KAAKigG,QAAQr9F,IAAI4O,EAAIovF,GAEH,eAAd5gG,KAAK6pB,KACD7pB,KAAKihG,sBAAsBL,GAE3B5gG,KAAKkhG,qBAAqBN,EAEnC,CAKA,iBAAMO,CAAY9J,EAAOlrF,EAAKxG,EAAU,CAAC,GACxC,MAAMy7F,EAAW/J,EAAM/oF,KAAImxE,GAAQz/E,KAAK0gG,WAAWjhB,EAAMtzE,EAAKxG,KAG9D,aAFsBygB,QAAQ44E,WAAWoC,IAE1B9yF,KAAIsnB,GACI,cAAlBA,EAAO9wB,OACH,CAAE26E,KAAM7pD,EAAO1xB,MAAMu7E,MAAM9zE,KAAMgB,SAAS,EAAMipB,OAAQA,EAAO1xB,OAE/D,CAAEu7E,KAAM7pD,EAAOqM,QAAQw9C,MAAM9zE,MAAQ,UAAWgB,SAAS,EAAOyC,MAAOwmB,EAAOqM,SAGxF,CAIAg/D,qBAAAA,CAAsBL,GACrB,OAAO,IAAIx6E,SAAQ,CAACuU,EAAStU,KAC5BrmB,KAAKmgG,MAAMxoF,KAAK,CAAEipF,aAAYjmE,UAAStU,WACvCrmB,KAAKqhG,yBAAyB,GAEhC,CAEA,6BAAMA,GACL,GACCrhG,KAAKsgG,UACLtgG,KAAKqgG,aAAergG,KAAK8/F,eACH,IAAtB9/F,KAAKmgG,MAAM/xF,OAEX,OAGD,MAAM,WAAEwyF,EAAU,QAAEjmE,EAAO,OAAEtU,GAAWrmB,KAAKmgG,MAAM,GACnDngG,KAAKqgG,cAEL,IAEC1lE,QADqB36B,KAAKshG,eAAeV,GAE1C,CAAE,MAAOxxF,GACRiX,EAAOjX,EACR,CAAE,QACDpP,KAAKmgG,MAAM9xD,QACXruC,KAAKqgG,oBACCrgG,KAAKqhG,yBACZ,CACD,CAEA,0BAAMH,CAAqBN,GAEtB5gG,KAAKqgG,aAAergG,KAAK6/F,mBACtB,IAAIz5E,SAAQuU,GAAW36B,KAAKogG,gBAAgBzoF,KAAKgjB,KAGxD36B,KAAKqgG,cACLO,EAAWE,UAAYj+D,KAAKmL,MAE5B,IACC,aAAahuC,KAAKshG,eAAeV,EAClC,CAAE,QACD5gG,KAAKqgG,cACLrgG,KAAKuhG,gBACN,CACD,CAEAA,cAAAA,GACKvhG,KAAKogG,gBAAgBhyF,OAAS,GAAKpO,KAAKqgG,YAAcrgG,KAAK6/F,aAC9C7/F,KAAKogG,gBAAgB/xD,OACrC1T,EAEF,CAIA,oBAAM2mE,CAAeV,EAAYY,EAAU,GAC1CZ,EAAW97F,OAAS,YACpB87F,EAAWC,SAAWW,EACtBZ,EAAW55F,OAAS45F,EAAWI,WAAWh6F,OAE1C,IACC,MAAM4uB,QAAe51B,KAAKyhG,eAAeb,GAEzC,OADA5gG,KAAK0hG,gBAAgBd,EAAYhrE,GAC1BA,CACR,CAAE,MAAOxmB,GACR,GAA0B,cAAtBwxF,EAAW97F,OAAwB,OAIvC,GAFA87F,EAAWxxF,MAAQA,EAEfoyF,EAAUxhG,KAAK+/F,cAIlB,OAHAa,EAAW97F,OAAS,WACpB9E,KAAK2hG,eAAef,SACd5gG,KAAK4hG,OAAO5hG,KAAKggG,WAAa7qF,KAAKmlF,IAAI,EAAGkH,IACzCxhG,KAAKshG,eAAeV,EAAYY,EAAU,GAOjD,MALAZ,EAAW97F,OAAS,SACpB87F,EAAWG,QAAUl+D,KAAKmL,MAC1BhuC,KAAK2hG,eAAef,GACpB5gG,KAAK6hG,YAAYjB,EAAYxxF,GAC7BpP,KAAKwgG,yBACCpxF,CAER,CACD,CAEAqyF,cAAAA,CAAeb,GACd,OAAO,IAAIx6E,SAAQ,CAACuU,EAAStU,KAC5B,MAAM1iB,EAAO,IAAIuB,GAAAA,EACX48F,EAAW,IAAI99E,SAErB89E,EAASrpF,OAAO,OAAQmoF,EAAWnhB,MACnCqiB,EAASrpF,OAAO,SAAU9U,EAAK0hB,iBAAmB,IAE9Cu7E,EAAWj7F,QAAQo8F,gBACtB3+F,OAAOonB,QAAQo2E,EAAWj7F,QAAQo8F,gBAAgB3/F,SAAQ,EAAE3B,EAAKyD,MAChE49F,EAASrpF,OAAOhY,EAAKyD,EAAM,IAK7B,MAAM0B,EAAS,CACd2f,WAAYA,CAACqtE,EAAStlF,KACrBszF,EAAWjO,SAAWC,EACtB5yF,KAAK2hG,eAAef,EAAW,EAEhCx7F,UAAYP,IACX81B,GAAQ31B,EAAAA,EAAAA,IAAcH,GAAM,EAE7BQ,QAAUC,IACT+gB,GAAOrhB,EAAAA,EAAAA,IAAcM,GAAK,EAE3B0B,OAAQ45F,EAAW55F,QAIdyf,EAAM9iB,EAAK8B,KAAKm7F,EAAWz0F,IAAK21F,EAAUl8F,GAChDg7F,EAAWn6E,IAAMA,CAAG,GAEtB,CAEAi7E,eAAAA,CAAgBd,EAAYhrE,GAC3BgrE,EAAW97F,OAAS,YACpB87F,EAAWjO,SAAW,IACtBiO,EAAWhrE,OAASA,EACpBgrE,EAAWG,QAAUl+D,KAAKmL,MAE1BhuC,KAAKkgG,UAAUvoF,KAAK,IAAKipF,IACzB5gG,KAAKgiG,eAAepB,GACpB5gG,KAAKwgG,wBACN,CAIAyB,YAAAA,CAAazwF,GACZ,MAAMovF,EAAa5gG,KAAKigG,QAAQh9F,IAAIuO,GACpC,IAAKovF,GAAc,CAAC,YAAa,SAAU,aAAal1F,SAASk1F,EAAW97F,QAC3E,OAAO,EAIR87F,EAAWI,WAAW35E,QAClBu5E,EAAWn6E,KAAuC,mBAAzBm6E,EAAWn6E,IAAIY,OAC3Cu5E,EAAWn6E,IAAIY,QAGhBu5E,EAAW97F,OAAS,YACpB87F,EAAWG,QAAUl+D,KAAKmL,MAC1BhuC,KAAK2hG,eAAef,GAGpB,MAAMsB,EAAaliG,KAAKmgG,MAAMlnC,WAAU4lC,GAAQA,EAAK+B,WAAWpvF,KAAOA,IAKvE,OAJI0wF,GAAc,GACjBliG,KAAKmgG,MAAMgC,OAAOD,EAAY,IAGxB,CACR,CAEAl4E,OAAAA,CAAQH,EAAMg2E,EAAc,GAC3B7/F,KAAK6pB,KAAOA,EACZ7pB,KAAK6/F,YAAcA,EAEN,aAATh2E,IACH7pB,KAAKmgG,MAAQ,GACbngG,KAAKuhG,iBAEP,CAEA/Z,KAAAA,GACCxnF,KAAKsgG,UAAW,CACjB,CAEA8B,MAAAA,GACCpiG,KAAKsgG,UAAW,EACE,eAAdtgG,KAAK6pB,KACR7pB,KAAKqhG,0BAELrhG,KAAKuhG,gBAEP,CAEA/I,KAAAA,GACCx4F,KAAKigG,QAAQ79F,SAAQ,CAAC62C,EAAGznC,KACxBxR,KAAKiiG,aAAazwF,EAAG,IAGtBxR,KAAKigG,QAAQzH,QACbx4F,KAAKkgG,UAAY,GACjBlgG,KAAKmgG,MAAQ,GACbngG,KAAKogG,gBAAkB,GACvBpgG,KAAKqgG,YAAc,CACpB,CAIAgC,QAAAA,GACC,MAAMC,EAAMlxF,MAAMC,KAAKrR,KAAKigG,QAAQh8F,UAC9Bm2F,EAAYkI,EAAIvgF,QAAO,CAACC,EAAKugF,IAAMvgF,GAAOugF,EAAE9iB,MAAMlxD,MAAQ,IAAI,GAEpE,MAAO,CACNvH,MAAOs7E,EAAIl0F,OACXsoB,OAAQ12B,KAAKqgG,YACbzB,QAAS0D,EAAIrgG,QAAOsgG,GAAkB,YAAbA,EAAEz9F,SAAsBsJ,OACjDo0F,UAAWF,EAAIrgG,QAAOsgG,GAAkB,cAAbA,EAAEz9F,SAAwBsJ,OACrD8xF,UAAWoC,EAAIrgG,QAAOsgG,GAAkB,cAAbA,EAAEz9F,SAAwBsJ,OACrDq0F,OAAQH,EAAIrgG,QAAOsgG,GAAkB,WAAbA,EAAEz9F,SAAqBsJ,OAC/Cs0F,UAAWJ,EAAIrgG,QAAOsgG,GAAkB,cAAbA,EAAEz9F,SAAwBsJ,OACrDyb,KAAM7pB,KAAK6pB,KACXy2E,SAAUtgG,KAAKsgG,SACfqC,YAAa3iG,KAAKmgG,MAAM/xF,OACxBw0F,oBAAqBxI,EAAY,SAAejiD,QAAQ,GAAK,MAE/D,CAEA0qD,eAAAA,GACC,MAAM5hF,EAAQjhB,KAAKqiG,WACnBp0F,QAAQi+B,MAAM,+BACdj+B,QAAQke,MAAM,CACb,KAAQlL,EAAM4I,KACd,OAAU5I,EAAMq/E,SAAW,SAAW,UACtC,cAAer/E,EAAM+F,MACrB,UAAa/F,EAAMuhF,UACnB,UAAavhF,EAAMi/E,UACnB,OAAUj/E,EAAMwhF,OAChB,MAASxhF,EAAM0hF,cAEhB10F,QAAQxE,IAAI,eAAewX,EAAM2hF,sBACjC30F,QAAQ60F,UACT,CAEAnC,UAAAA,GACC,MAAO,GAAG99D,KAAKmL,SAAS74B,KAAK6gB,SAAS5R,SAAS,IAAI2+E,OAAO,EAAG,IAC9D,CAEAnB,MAAAA,CAAOoB,GACN,OAAO,IAAI58E,SAAQuU,GAAWp1B,WAAWo1B,EAASqoE,IACnD,CAEAvC,gBAAAA,GACiBrvF,MAAMC,KAAKrR,KAAKigG,QAAQh8F,UAAUg/F,OAAMV,GACvD,CAAC,YAAa,SAAU,aAAa72F,SAAS62F,EAAEz9F,WAGlC9E,KAAKigG,QAAQ1xE,KAAO,GAClCvuB,KAAKkjG,mBAEP,CAIA39E,UAAAA,CAAWhiB,GAAYvD,KAAKyuD,UAAUkkC,SAASh7E,KAAKpU,EAAW,CAC/D4/F,UAAAA,CAAW5/F,GAAYvD,KAAKyuD,UAAU1pB,SAASptB,KAAKpU,EAAW,CAC/D8B,OAAAA,CAAQ9B,GAAYvD,KAAKyuD,UAAUr/C,MAAMuI,KAAKpU,EAAW,CACzD6/F,aAAAA,CAAc7/F,GAAYvD,KAAKyuD,UAAU8xC,YAAY5oF,KAAKpU,EAAW,CAErEo+F,cAAAA,CAAef,GACd5gG,KAAKyuD,UAAUkkC,SAASvwF,SAAQihG,GAAMrjG,KAAKsjG,UAAUD,EAAI,IAAKzC,EAAY3/E,MAAOjhB,KAAKqiG,cACvF,CAEAL,cAAAA,CAAepB,GACd5gG,KAAKyuD,UAAU1pB,SAAS3iC,SAAQihG,GAAMrjG,KAAKsjG,UAAUD,EAAIzC,IAC1D,CAEAiB,WAAAA,CAAYjB,EAAYxxF,GACvBpP,KAAKyuD,UAAUr/C,MAAMhN,SAAQihG,GAAMrjG,KAAKsjG,UAAUD,EAAIzC,EAAYxxF,IACnE,CAEA8zF,iBAAAA,GACCljG,KAAKyuD,UAAU8xC,YAAYn+F,SAAQihG,GAAMrjG,KAAKsjG,UAAUD,EAAI,CAAEnD,UAAWlgG,KAAKkgG,UAAWj/E,MAAOjhB,KAAKqiG,cACtG,CAEAkB,MAAAA,GACC,MAAMC,EAAmBxjG,KAAKqgG,YAAc,EACtCoD,EAAoBzjG,KAAKmgG,MAAM/xF,OAAS,EACxCs1F,EAAqB1jG,KAAKogG,gBAAgBhyF,OAAS,EACnDu1F,EAAoBvyF,MAAMC,KAAKrR,KAAKigG,QAAQh8F,UAAUg0B,MAAKsqE,GAChE,CAAC,YAAa,WAAY,WAAW72F,SAAS62F,EAAEz9F,UAGjD,QAAQ0+F,GAAqBC,GAAsBC,GAAuBC,EAC3E,CAMAC,MAAAA,GAKC,OAJA5jG,KAAKyuD,UAAUkkC,SAAW,GAC1B3yF,KAAKyuD,UAAU1pB,SAAW,GAC1B/kC,KAAKyuD,UAAUr/C,MAAQ,GACvBpP,KAAKyuD,UAAU8xC,YAAc,GACtBvgG,IACR,CAEAsjG,SAAAA,CAAU//F,KAAaguB,GACtB,IACChuB,KAAYguB,EACb,CAAE,MAAOniB,GACRnB,QAAQmB,MAAM,kBAAmBA,EAClC,CACD,GC1XKy0F,GAAkB,gBAElBC,GAAyB,cACzBC,GAAwB,aAK9B,MAAMC,WAAyBzlF,EAAAA,EAK3Bhe,WAAAA,CAAYC,EAASuC,EAAS,CAAC,GAC3Byb,MAAMhe,EAASuC,GACf/C,KAAKW,SAAWH,EAChBR,KAAKa,QAAUkC,EAEf/C,KAAK42F,OAAS,KACd52F,KAAKq7D,OAAS,KACdr7D,KAAKkB,OACT,CAEA,eAAWoH,GAAS,MAlBX,eAkBwB,CACjC,mBAAWzF,GAAa,MAlBX,kBAkB4B,CAEzC3B,KAAAA,GACI8iG,GAAiBC,WAAW7iG,IAAIpB,MAC5BA,KAAKa,SAASqjG,YACdF,GAAiBG,gBAAgB/iG,IAAIpB,MACrCA,KAAKokG,qBAETpkG,KAAKqkG,aACLrkG,KAAKsP,cACT,CAKA+0F,UAAAA,GACI,MAAM,GAAE7yF,EAAE,KAAE7F,GAAS3L,KAAKW,SAASyT,QAC/B5C,IAAIxR,KAAKq7D,OAAShuD,SAAS2lB,eAAexhB,KACzCxR,KAAKq7D,QAAU1vD,IAChB3L,KAAKq7D,OAAS94D,EAAAA,EAAUC,KAAK,UAAUmJ,QAEtC3L,KAAKq7D,SACNr7D,KAAKq7D,OAAS94D,EAAAA,EAAUC,KAAK,qBAAsBxC,KAAKW,WAAa4B,EAAAA,EAAUC,KAAK,qBAAsBxC,KAAKW,SAASyvB,YAEhI,CAKA9gB,YAAAA,GACI,KAAKvO,EAAAA,EAAAA,IAAUf,KAAKW,UAAW,OAE/B,MAAM2jG,EAAkBz0F,IAEpB,GAAIxC,SAAS9F,cAAc,aAAc,OAAO,EAGhD,IAAIg9F,EAAQ,GACZ,IAAMA,EAAQ10F,EAAEE,cAAcy0F,UAAU,eAAiB,EAAI,CAAE,MAAOvrD,GAAI,CAC1E,MAAiB,eAAVsrD,CAAsB,EAGjC/iG,EAAAA,EAAaC,GAAGzB,KAAKW,SAAU,YAAakP,IAKxC,GAJAA,EAAErC,iBACFqC,EAAEgB,kBAGEyzF,EAAez0F,GAIf,OAHAuiB,EAAAA,EAAQ9wB,OAAOtB,KAAKW,SAAU,CAACmjG,GAAwBC,KACvDC,GAAiBS,0BAA0BzkG,KAAKW,UAAU,QAC1DkP,EAAEE,aAAaI,WAAa,QAI3BiiB,EAAAA,EAAQtJ,IAAI9oB,KAAKW,SAAUmjG,KAC5B1xE,EAAAA,EAAQhxB,IAAIpB,KAAKW,SAAUojG,GAC/B,IAGJviG,EAAAA,EAAaC,GAAGzB,KAAKW,SAAU,aAAckP,IAKzC,GAJAA,EAAErC,iBACFqC,EAAEgB,kBAGEyzF,EAAez0F,GAGf,OAFAuiB,EAAAA,EAAQ9wB,OAAOtB,KAAKW,SAAU,CAACmjG,GAAwBC,UACvDC,GAAiBS,0BAA0BzkG,KAAKW,UAAU,GAI9DyxB,EAAAA,EAAQhxB,IAAIpB,KAAKW,SAAU,CAACmjG,GAAwBC,KACpDC,GAAiBS,0BAA0BzkG,KAAKW,UAAU,EAAK,IAGnEa,EAAAA,EAAaC,GAAGzB,KAAKW,SAAU,aAAckP,IAKzC,GAJAA,EAAErC,iBACFqC,EAAEgB,kBAGEyzF,EAAez0F,GAGf,OAFAuiB,EAAAA,EAAQ9wB,OAAOtB,KAAKW,SAAU,CAACmjG,GAAwBC,UACvDC,GAAiBS,0BAA0BzkG,KAAKW,UAAU,GAI1DkP,EAAEvL,SAAWtE,KAAKW,UAAYkP,EAAEvL,OAAOqJ,QAAQ,IAAMk2F,MAAqB7jG,KAAKW,WAC/EyxB,EAAAA,EAAQ9wB,OAAOtB,KAAKW,SAAUojG,IAC9Bx+F,YAAW,KACFvF,KAAKW,SAASkzB,QAAQ,YACvBzB,EAAAA,EAAQ9wB,OAAOtB,KAAKW,SAAUmjG,IAC9BE,GAAiBS,0BAA0BzkG,KAAKW,UAAU,GAC9D,GACD,IACP,IAGJa,EAAAA,EAAaC,GAAGzB,KAAKW,SAAU,QAASkP,IAQpC,GAPAA,EAAErC,iBACFqC,EAAEgB,kBAEFuhB,EAAAA,EAAQ9wB,OAAOtB,KAAKW,SAAU,CAACmjG,GAAwBC,KACvDC,GAAiBS,0BAA0BzkG,KAAKW,UAAU,GAGtD2jG,EAAez0F,GACf,OAGJ,MAAMwnF,EAAQxnF,EAAEE,cAAcsnF,MACzBA,GAAUA,EAAMjpF,SAErBpO,KAAK42F,OAASS,GAEVt2F,EAAAA,EAAAA,IAAUf,KAAKq7D,UACfr7D,KAAKq7D,OAAOg8B,MAAQA,EACpB71F,EAAAA,EAAawf,QAAQhhB,KAAKq7D,OAAQ,WACtC,GAER,CAEA+oC,iBAAAA,GACQJ,GAAiBU,uBAErBV,GAAiBW,gBAAkB,CAC/BC,UAAY/0F,GAAM7P,KAAK6kG,qBAAqBh1F,GAC5Ci1F,SAAWj1F,GAAM7P,KAAK6kG,qBAAqBh1F,GAC3Ck1F,UAAYl1F,IACH7P,KAAKglG,YAAYn1F,KACE,OAApBA,EAAE6Q,eAA0B7Q,EAAEvL,SAAW+I,UAAYwC,EAAEvL,SAAW+I,SAASulB,iBAC3EoxE,GAAiBiB,sBACrB,EAEJ3/D,KAAOz1B,IACH,IAAK7P,KAAKglG,YAAYn1F,GAElB,YADAm0F,GAAiBiB,sBAIrB,MAAMC,EAAalB,GAAiBmB,qBACpC,GAAID,EAAY,CACZ,MAAM3kF,EAAWnP,MAAMC,KAAK2yF,GAAiBG,iBAAiB3hG,MAAKwoB,GAAKA,EAAErqB,WAAaukG,IACjF7N,EAAQxnF,EAAEE,cAAcsnF,MAE1B92E,GAAY82E,GAASA,EAAMjpF,SAAUrN,EAAAA,EAAAA,IAAUwf,EAAS86C,UACxDxrD,EAAErC,iBACFqC,EAAEgB,kBACF0P,EAASq2E,OAASS,EAClB92E,EAAS86C,OAAOg8B,MAAQA,EACxB71F,EAAAA,EAAawf,QAAQT,EAAS86C,OAAQ,UAE9C,CAEA2oC,GAAiBiB,qBAAqB,EAE1CG,QAASA,IAAMpB,GAAiBiB,uBAGpCzjG,EAAAA,EAAaC,GAAG4L,SAAU,YAAa22F,GAAiBW,gBAAgBC,WACxEpjG,EAAAA,EAAaC,GAAG4L,SAAU,WAAY22F,GAAiBW,gBAAgBG,UACvEtjG,EAAAA,EAAaC,GAAG4L,SAAU,YAAa22F,GAAiBW,gBAAgBI,WACxEvjG,EAAAA,EAAaC,GAAG4L,SAAU,OAAQ22F,GAAiBW,gBAAgBr/D,MACnE9jC,EAAAA,EAAaC,GAAG4L,SAAU,UAAW22F,GAAiBW,gBAAgBS,SAEtE5jG,EAAAA,EAAaC,GAAG4T,OAAQ,YAAa2uF,GAAiBW,gBAAgBC,WACtEpjG,EAAAA,EAAaC,GAAG4T,OAAQ,WAAY2uF,GAAiBW,gBAAgBG,UACrEtjG,EAAAA,EAAaC,GAAG4T,OAAQ,YAAa2uF,GAAiBW,gBAAgBI,WACtEvjG,EAAAA,EAAaC,GAAG4T,OAAQ,OAAQ2uF,GAAiBW,gBAAgBr/D,MACjE9jC,EAAAA,EAAaC,GAAG4T,OAAQ,UAAW2uF,GAAiBW,gBAAgBS,SAEpEpB,GAAiBU,sBAAuB,EAC5C,CAEAG,oBAAAA,CAAqBh1F,GACjB,IAAK7P,KAAKglG,YAAYn1F,GAElB,YADAm0F,GAAiBiB,sBAIrB,MAAMI,EAAerlG,KAAKslG,iCAE1B,GAA4B,IAAxBD,EAAaj3F,OAAc,CACvB,MAAOm3F,GAAYF,EAUvB,OATQrB,GAAiBmB,uBAAyBI,IAC1CvB,GAAiBiB,sBACjB7yE,EAAAA,EAAQhxB,IAAImkG,EAAUzB,IACtBE,GAAiBS,0BAA0Bc,GAAU,GACrDvB,GAAiBmB,qBAAuBI,GAG5C11F,EAAEE,eAAcF,EAAEE,aAAaI,WAAa,aAChDN,EAAErC,gBAEN,CAEAw2F,GAAiBiB,qBACrB,CAEAD,WAAAA,CAAYn1F,GACR,IACI,MAAM21F,EAAK31F,GAAGE,aACd,QAAKy1F,OAEDA,EAAGnO,OAASmO,EAAGnO,MAAMjpF,OAAS,KAE9Bo3F,EAAG15E,OAAS05E,EAAG15E,MAAM1d,OAAS,EACvBgD,MAAMC,KAAKm0F,EAAG15E,OAAOmM,MAAKnoB,GAAsB,SAAdA,EAAK21F,SAG9CD,EAAGtL,OACI9oF,MAAMC,KAAKm0F,EAAGtL,OAAOxuF,SAAS,UAI7C,CAAE,MAAOutC,GACL,OAAO,CACX,CACJ,CAEAqsD,8BAAAA,GAEI,OADkBl0F,MAAMC,KAAK9O,EAAAA,EAAUqf,QAAQ,IAAIiiF,OAAsB,IACxD5hG,QAAQqP,GAAOtR,KAAK0lG,qBAAqBp0F,IAC9D,CAEAo0F,oBAAAA,CAAqBp0F,GACjB,KAAKvQ,EAAAA,EAAAA,IAAUuQ,KAAQA,EAAGq+B,YAAa,OAAO,EAE9C,MAAM57B,EAAQsB,OAAOgf,iBAAiB/iB,GACtC,GAAsB,SAAlByC,EAAM4E,SAA2C,WAArB5E,EAAMugB,YAA6C,MAAlBvgB,EAAM4xF,QACnE,OAAO,EAGX,MAAMt1F,EAAOiB,EAAGhB,wBAChB,SAAKD,EAAKoE,QAAUpE,EAAKG,UAGrBH,EAAK4H,OAAS,GACd5H,EAAK0L,MAAQ,GACb1L,EAAKK,IAAM2E,OAAOG,aAClBnF,EAAK0E,KAAOM,OAAOC,WAG3B,CAEA,0BAAO2vF,GACEjB,GAAiBmB,uBAEtBnB,GAAiBS,0BAA0BT,GAAiBmB,sBAAsB,GAClF/yE,EAAAA,EAAQ9wB,OAAO0iG,GAAiBmB,qBAAsBrB,IACtDE,GAAiBmB,qBAAuB,KAC5C,CAEA,gCAAOV,CAA0BmB,EAAaC,GAC1C,KAAK9kG,EAAAA,EAAAA,IAAU6kG,GAAc,OAE7B,MAAM1pE,EAAQ35B,EAAAA,EAAUC,KAAK,gCAAiCojG,GAC9D,IAAK1pE,EAAO,OAEZ,MAAM4pE,GAAgB5pE,EAAM3qB,aAAa,4BAA8B,IAAI9K,SAAWy1B,EAAMrjB,aAAe,IAAIpS,OAC/Gy1B,EAAMxsB,aAAa,0BAA2Bo2F,GAE9C,MAAMC,GAAcH,EAAYr0F,aAAa,0BAA4B,IAAI9K,OAEzEy1B,EAAMrjB,YADNgtF,GAAYE,EACQA,EAIJD,CACxB,CAEA,0BAAOE,GACH,IAAKhC,GAAiBU,qBAAsB,OAE5C,MAAM70E,EAAWm0E,GAAiBW,iBAAmB,CAAC,EAEtDnjG,EAAAA,EAAac,IAAI+K,SAAU,YAAawiB,EAAS+0E,WACjDpjG,EAAAA,EAAac,IAAI+K,SAAU,WAAYwiB,EAASi1E,UAChDtjG,EAAAA,EAAac,IAAI+K,SAAU,YAAawiB,EAASk1E,WACjDvjG,EAAAA,EAAac,IAAI+K,SAAU,OAAQwiB,EAASyV,MAC5C9jC,EAAAA,EAAac,IAAI+K,SAAU,UAAWwiB,EAASu1E,SAE/C5jG,EAAAA,EAAac,IAAI+S,OAAQ,YAAawa,EAAS+0E,WAC/CpjG,EAAAA,EAAac,IAAI+S,OAAQ,WAAYwa,EAASi1E,UAC9CtjG,EAAAA,EAAac,IAAI+S,OAAQ,YAAawa,EAASk1E,WAC/CvjG,EAAAA,EAAac,IAAI+S,OAAQ,OAAQwa,EAASyV,MAC1C9jC,EAAAA,EAAac,IAAI+S,OAAQ,UAAWwa,EAASu1E,SAE7CpB,GAAiBU,sBAAuB,EACxCV,GAAiBW,gBAAkB,KACnCX,GAAiBiB,qBACrB,CAEAgB,QAAAA,GACI,OAAOjmG,KAAK42F,MAChB,CAEAv0F,OAAAA,GACIb,EAAAA,EAAac,IAAItC,KAAKW,SAAU,YAChCa,EAAAA,EAAac,IAAItC,KAAKW,SAAU,aAChCa,EAAAA,EAAac,IAAItC,KAAKW,SAAU,aAChCa,EAAAA,EAAac,IAAItC,KAAKW,SAAU,QAEhCqjG,GAAiBC,WAAWv+F,OAAO1F,MACnCgkG,GAAiBG,gBAAgBz+F,OAAO1F,MACnCgkG,GAAiBG,gBAAgB51E,MAClCy1E,GAAiBgC,sBAGrBhmG,KAAKq7D,OAAS,KACdr7D,KAAK42F,OAAS,IAClB,CAEA1uF,IAAAA,GACI,OAAOlI,IACX,EAGJgkG,GAAiBC,WAAa,IAAIlzF,IAClCizF,GAAiBG,gBAAkB,IAAIpzF,IACvCizF,GAAiBU,sBAAuB,EACxCV,GAAiBmB,qBAAuB,KACxCnB,GAAiBW,gBAAkB,KAEnC,0BCxMA,SApJA,MACCpkG,WAAAA,CAAYqN,EAAiBpN,EAASuC,EAAS,CAAC,GAC/C/C,KAAKH,OAAS+N,EACd5N,KAAKQ,SAAUO,EAAAA,EAAAA,IAAUP,GAAWA,EAAU,KAEzCR,KAAKQ,SAKVR,KAAKa,QAAU,IAAImC,GAAAA,EAAOD,EAAQvC,GAASyC,MAC3CjD,KAAKyO,OAAS,CACb3B,KAAM9M,KAAKH,OAAO4O,OAAO3B,KACzBw4B,KAAMtlC,KAAKH,OAAO4O,OAAO62B,MAG1BtlC,KAAKq7F,eAAiB,GACtBr7F,KAAKkmG,YAAc,IAXlBj4F,QAAQmB,MAAM,4BAA6B5O,EAY7C,CAEA0H,IAAAA,GACC,MAAMi+F,EAAcnmG,KAAKyO,OAAO3B,MAAQ9M,KAAKyO,OAAO62B,KACpD,IAAK6gE,EAAa,OAAO,EAEzB,MAAMC,EAAOpmG,KAAKyO,OAAO3B,KAAO,OAAS,OACzC,OAAO9M,KAAKqmG,mBAAmBD,EAAMD,EACtC,CAEAE,kBAAAA,CAAmBD,EAAME,GACxB,MAAMzK,EAAQt5F,EAAAA,EAAUC,KAAK,aAAa4jG,UAAcE,GACxD,IAAKzK,EAAO,OAAO,EAEnB,MAAM0K,EAASn1F,MAAMC,KAAKwqF,EAAM12D,UAAUljC,QAAOwN,GAAqB,OAAfA,EAAGlC,UAC1D,OAAsB,IAAlBg5F,EAAOn4F,SAEXpO,KAAKwmG,qBAAqBD,KACrBvmG,KAAKq7F,iBAEVr7F,KAAKkmG,YAAcK,EACjBj4F,KAAImB,IACJ,MAAMg3F,EAAU9+E,EAAAA,EAAY1kB,IAAIwM,EAAI,aACpC,OAAKg3F,EAEEzmG,KAAK0mG,eAAeD,GAFN,IAEc,IAEnCxkG,OAAO8V,UAEF,GACR,CAEA2uF,cAAAA,CAAeD,GACd,MAAME,GAAW3hG,EAAAA,EAAAA,IAAcyhG,GAC/B,IAAKE,GAAgC,iBAAbA,GAAyBv1F,MAAMiP,QAAQsmF,GAAW,OAAO,KAEjF,MAAMC,EAAa5mG,KAAK6mG,mBAAmBF,GACrCh7F,EAAO3L,KAAK8mG,gBAAgBH,EAASh7F,MACrC6F,EAAKxR,KAAK8mG,gBAAgBH,EAASn1F,IACnC4Z,EAAMprB,KAAK8mG,gBAAgBH,EAASv7E,KACpCpf,EAAOhM,KAAK8mG,gBAAgBH,EAAS36F,OAAS46F,EAAW56F,MAAQ,2BAIjE4pB,EAAS,CACdpkB,KACA7F,OACA4iB,KANYvuB,KAAK+mG,gBAAgBJ,EAASp4E,OAASq4E,EAAWr4E,MAAQ,EAOtEviB,OACAof,MACAwpE,aARoB50F,KAAK+mG,gBAAgBJ,EAAS/R,cAAgB+R,EAAS,mBAAqBC,EAAWhS,cAAgB/xD,KAAKmL,OAsBjI,QAXuBjnC,IAAnB4/F,EAAS3Y,OAA0C,OAAnB2Y,EAAS3Y,OAAqC,KAAnB2Y,EAAS3Y,QACvEp4D,EAAOo4D,MAAQ2Y,EAAS3Y,QAGJ,CAAC,KAAM,OAAQ,OAAQ,OAAQ,OACvBiV,OAAOxiG,IACnC,MAAMyD,EAAQ0xB,EAAOn1B,GACrB,MAAY,SAARA,EAAuBoU,OAAOI,SAAS/Q,GACpCA,SAAmD,KAAVA,CAAY,IAG/C,OAAO,KAErB,MAAMs1F,EAAa,CAAC,EACd7yC,EAAW,IAAI51C,IAAI,CAAC,KAAM,OAAQ,OAAQ,OAAQ,MAAO,QAAS,eAAgB,kBAYxF,OAVA3N,OAAOonB,QAAQm8E,GAAUvkG,SAAQ,EAAE3B,EAAKyD,MACnCyiD,EAAS79B,IAAIroB,IACbyD,SAAmD,KAAVA,IAC7Cs1F,EAAW/4F,GAAOyD,EAAK,IAGpBd,OAAOwgB,KAAK41E,GAAYprF,SAC3BwnB,EAAO4jE,WAAaA,GAGd5jE,CACR,CAEAixE,kBAAAA,CAAmBF,GAClB,MAAMK,EAASL,EAASlnB,MAAQknB,EAASvb,MAAQub,EAASM,YAAc,KACxE,OAAMD,aAAkBpmB,KAQjB,CACNryD,KAPYvuB,KAAK+mG,gBAAgBC,EAAOz4E,OAO1B,KACdviB,KAPYhM,KAAK8mG,gBAAgBE,EAAOh7F,OAO1B,KACd4oF,cAPqBoS,aAAkBtnB,KACrC1/E,KAAK+mG,gBAAgBC,EAAOpS,cAC5B,OAK4B,MAXO,CAAC,CAaxC,CAEAkS,eAAAA,CAAgB5iG,GACf,GAAIA,QAAuC,OAAO,KAElD,OADmBsC,OAAOtC,GAAOuC,QACA,IAClC,CAEAsgG,eAAAA,CAAgB7iG,GACf,GAAIA,SAAmD,KAAVA,EAAc,OAAO,KAClE,MAAM+e,EAAapO,OAAO3Q,GAC1B,OAAO2Q,OAAOI,SAASgO,GAAcA,EAAa,IACnD,CAEAujF,oBAAAA,CAAqBD,GACpB,GAAIvmG,KAAKq7F,gBAAoC,IAAlBkL,EAAOn4F,OAAc,OAEhD,MAAM84F,EAAYX,EAAO,GAEpB5+E,EAAAA,EAAYmB,IAAIo+E,EAAW,aAI/BlnG,KAAKq7F,eAAiB6L,EAAUv9E,WAHhC3pB,KAAKq7F,eAAiB6L,EAAUv9E,UAChCu9E,EAAU5lG,SAIZ,CAEAe,OAAAA,GACCrC,KAAKq7F,eAAiB,GACtBr7F,KAAKkmG,YAAc,EACpB,iBCxID,MAAM59F,GAAO,QACPzF,GAAW,WAGXskG,GAAuB,0BACvBC,GAAwB,2BAGxBC,GAAuB,WACvBC,GAAkB,GAAGD,UACrBE,GAAuB,YACvBC,GAAqB,UACrBC,GAAqB,UACrBC,GAAqB,UACrBC,GAAoB,SAE1B,MAAMC,WAAgBlR,GAClBn2F,WAAAA,CAAYC,EAASuC,EAAS,CAAC,GAgD3Byb,MAAMhe,EAASuC,EA/CE,CACbmF,MAAM,EACN2wF,SAAS,EACTh4D,KAAMxzB,SAASulB,gBAAgBiO,MAAQ,KACvCo3D,OAAQ,CAAEp6B,MAAO,EAAG9hC,MAAO,GAAI/U,MAAO,GACtCgnE,OAAO,EACPkO,QAAQ,EACRpvF,MAAM,EACNotF,MAAO,GACPv2F,MAAM,EACNo3D,SAAS,EACT3yC,SAAS,EACTkvE,QAAQ,EACR4M,WAAW,EACXjE,QAAS,CACLp2E,KAAM,aACNzlB,MAAO,GACPy7F,YAAa,EACbC,cAAe,EACfC,cAAe,EACfC,WAAY,KAEhB6H,QAAS,CACLvnE,QAAS,KACTgiE,IAAK,CAAEl+F,MAAO,GAAI0jG,OAAO,EAAM95F,OAAO,EAAMg1B,QAAS,KAAM1C,QAAS,MACpEynE,OAAQ,CAAE3jG,MAAO,GAAI0jG,OAAO,EAAM95F,OAAO,EAAMg1B,QAAS,KAAM1C,QAAS,OAE3Ekf,SAAU,CACN/Q,SAAS,EACTrqC,MAAO,GACP0J,OAAQ,QACRK,MAAO,CAAC,sBAAuB,wBAEnCsgD,UAAW,CACPC,OAAQ,KACR3C,SAAU,KACVtmC,cAAe,KACfuiF,iBAAkB,KAClBC,iBAAkB,KAClBC,cAAe,KACfC,oBAAqB,KACrBC,aAAc,KACdC,QAAS,KACTC,SAAU,QAMlBtoG,KAAK42F,OAAS,GACd52F,KAAKuoG,cAAgB,IAAIx3F,IACzB/Q,KAAKwoG,qBAAuB,IAAIz3F,IAChC/Q,KAAKyoG,qBAAuB,IAAI13F,IAChC/Q,KAAK0oG,iBAAmB,GACxB1oG,KAAK2oG,UAAY,KACjB3oG,KAAK69C,UAAY,KACjB79C,KAAK8xD,QAAU,KAEf9xD,KAAK4oG,iBAAkB,EACvB5oG,KAAK6oG,eACT,CAEA,eAAWvgG,GAAS,OAAOA,EAAM,CACjC,mBAAWzF,GAAa,OAAOA,EAAU,CAEzCgmG,aAAAA,GACI,IAAK7oG,KAAK+gE,eAAgB,OAQ1B,GANA/gE,KAAK8xD,QAAU,IAAIg3C,GAAsB9oG,KAAMA,KAAKW,SAAUX,KAAKa,SAE/Db,KAAKa,QAAQ8C,OACb3D,KAAKa,QAAQg4F,SAAU,GAGvB74F,KAAK4oG,gBAAiB,OAC1B5oG,KAAK4oG,gBAAkB5oG,KAAK8xD,QAAQ5pD,OAEpC,MAAMg+F,EAAclmG,KAAK8xD,QAAQo0C,YAE7BA,EAAY93F,QACZpO,KAAK+oG,kBAAkB7C,GAGvBlmG,KAAKa,QAAQg4F,UAAY74F,KAAKa,QAAQ8C,OAAM3D,KAAKa,QAAQq7F,QAAS,GAClEl8F,KAAKyO,OAAO62B,OACZtlC,KAAKa,QAAQmtF,OAAQ,EACrBhuF,KAAKa,QAAQq7F,QAAS,EACtBl8F,KAAKgpG,qBAELhF,GAAiBj8F,oBAAoB/H,KAAKyO,OAAO62B,KAAMtlC,KAAKa,SAASqH,QAGzElI,KAAKipG,4BACLjpG,KAAKkpG,cACLlpG,KAAKuP,iBAAiB,SAAU,CAAE/O,QAASR,KAAKW,SAAU02F,MAAO6O,GAAe,IACpF,CAEA8C,kBAAAA,GACI,IAAKhpG,KAAKyO,OAAO62B,KAAM,OAEvB,MAAMpF,EAAWe,GAAcjhC,KAAKa,QAAQggC,KAAMv4B,KAAS,CAAC,EACtDy9F,GAAc/lG,KAAKyO,OAAO62B,KAAK/zB,aAAa,0BAA4B,IAAI9K,QAAUy5B,EAAS,gBAAkB,oBACvHlgC,KAAKyO,OAAO62B,KAAK51B,aAAa,wBAAyBq2F,GAEvD,MAAM7pE,EAAQ35B,EAAAA,EAAUC,KAAK,gCAAiCxC,KAAKyO,OAAO62B,MAC1E,IAAKpJ,EAAO,OAEZ,MAAM4pE,GAAgB5pE,EAAM3qB,aAAa,4BAA8B,IAAI9K,SAAWy1B,EAAMrjB,aAAe,IAAIpS,OAC/Gy1B,EAAMxsB,aAAa,0BAA2Bo2F,EAClD,CAEAiD,iBAAAA,CAAkB1R,GACTjmF,MAAMiP,QAAQg3E,IAAWA,EAAMjpF,SAEpCipF,EAAMj1F,SAAQ+mG,IACV,IAAKA,GAAUx9F,KAAM,OAErB,MAAMy9F,EAAc,CAAC,EACQ,iBAAlBD,EAASn9F,OAAmBo9F,EAAYp9F,KAAOm9F,EAASn9F,MAC/D6I,OAAOI,SAASk0F,EAASvU,gBAAewU,EAAYxU,aAAeuU,EAASvU,cAEhF,MAAMnV,EAAO,IAAIC,KAAK,CAAC,IAAKypB,EAASx9F,KAAMy9F,QAEvBriG,IAAhBoiG,EAAS33F,IAAoC,OAAhB23F,EAAS33F,IAA+B,KAAhB23F,EAAS33F,IAC9DpO,OAAO2tB,eAAe0uD,EAAM,KAAM,CAC9Bv7E,MAAOilG,EAAS33F,GAChBkmF,UAAU,EACV/+D,YAAY,IAIhB9jB,OAAOI,SAASk0F,EAAS56E,OACzBnrB,OAAO2tB,eAAe0uD,EAAM,OAAQ,CAChCv7E,MAAOilG,EAAS56E,KAChBmpE,UAAU,EACV/+D,YAAY,SAIC5xB,IAAjBoiG,EAAS/9E,KAAsC,OAAjB+9E,EAAS/9E,KAAiC,KAAjB+9E,EAAS/9E,KAChEhoB,OAAO2tB,eAAe0uD,EAAM,MAAO,CAC/Bv7E,MAAOilG,EAAS/9E,IAChBssE,UAAU,EACV/+D,YAAY,SAIG5xB,IAAnBoiG,EAASnb,OAA0C,OAAnBmb,EAASnb,OAAqC,KAAnBmb,EAASnb,OACpE5qF,OAAO2tB,eAAe0uD,EAAM,QAAS,CACjCv7E,MAAOilG,EAASnb,MAChB0J,UAAU,EACV/+D,YAAY,IAIhBwwE,EAAS3P,YAA6C,iBAAxB2P,EAAS3P,aAA4BpoF,MAAMiP,QAAQ8oF,EAAS3P,aAC1Fp2F,OAAO2tB,eAAe0uD,EAAM,aAAc,CACtCv7E,MAAOilG,EAAS3P,WAChB9B,UAAU,EACV/+D,YAAY,IAIpB,MAAMgkE,EAAU38F,KAAKs5F,YAAY7Z,GAGjCz/E,KAAKuoG,cAAcnnG,IAAIu7F,GACvB38F,KAAKyoG,qBAAqB/iG,OAAOi3F,GACjC38F,KAAKwoG,qBAAqB9iG,OAAOi3F,GAGjC38F,KAAK42F,OAAOj/E,KAAK8nE,EAAK,IAI1Bz/E,KAAK+4F,UAAU/4F,KAAK42F,QAGpB52F,KAAKkpG,cACLlpG,KAAK84F,cACL94F,KAAKqpG,aAAa,YAAarpG,KAAKuoG,cAAch6E,MAG9CvuB,KAAKa,QAAQ2+C,UAAU/Q,SAAWzuC,KAAKa,QAAQ2+C,SAASp7C,QAAUpE,KAAK69C,YACvE79C,KAAK69C,UAAY,IAAIyrD,GAAAA,QAAgBtpG,KAAMA,KAAKa,QAAQ2+C,WAI5Dx/C,KAAKuP,iBAAiB,WAAY,CAAE8nF,MAAOr3F,KAAK42F,SAChDp1F,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAU,GAAGkC,YAAmB,CAAEw0F,MAAOr3F,KAAK42F,SAC5E,CAEAqS,yBAAAA,GACI1mG,EAAAA,EAAUqf,QAhNW,2BAgNmB5hB,KAAKW,UAAUyB,SAAQkP,IACvDtR,KAAKk3F,sBACL5lF,EAAGI,oBAAoB,SAAU1R,KAAKk3F,sBAG1C5lF,EAAG1B,iBAAiB,UAAWC,GAAM7P,KAAKk8D,cAAcrsD,IAAG,GAEnE,CAEAqsD,aAAAA,CAAcrsD,GACV,MAAMyb,EAAQzb,GAAGvL,OACXilG,EAAavpG,KAAKwpG,oBAAoBl+E,GAC5CtrB,KAAKm3F,OAAO7rE,GAERtrB,KAAKa,QAAQ8C,MAAM3D,KAAKypG,UAAUzpG,KAAK42F,QAE3C,MAAMryE,EAAU,CACZ8yE,MAAOr3F,KAAK42F,OACZtrE,MAAOzb,GAAGvL,QAAUuL,GAAGub,KAAO,GAC9Bm+E,cAGJvpG,KAAKuP,iBAAiB,WAAYgV,GAClCvkB,KAAK0pG,cAAc,SAAU,CACzBrS,MAAOr3F,KAAK42F,OACZtrE,MAAO/G,EAAQ+G,MACfi+E,WAAYhlF,EAAQglF,YAE5B,CAEAC,mBAAAA,CAAoBl+E,GAChB,MAAM+rE,EAAQ/rE,GAAO+rE,MACrB,OAAKA,GAAOjpF,OACLgD,MAAMC,KAAKgmF,GADS,EAE/B,CAEA,eAAMoS,CAAUpS,GACZ,IAAKr3F,KAAKa,QAAQ8C,OAAS3D,KAAKa,QAAQo/F,QAAQ77F,MAAO,OAElDpE,KAAKuoG,cAAch6E,MACpBvuB,KAAKwoG,qBAAqBhQ,QAG9B,MAAMmR,EAAmBtS,EAAMp1F,QAAOo4F,IAAMr6F,KAAKuoG,cAAcz/E,IAAI9oB,KAAKs5F,YAAYe,MACpF,IAAKsP,EAAiBv7F,OAAQ,OAEzBpO,KAAK2oG,YAAa3oG,KAAK2oG,UAAUpF,WAClCvjG,KAAK2oG,UAAY,IAAIiB,GAAa,CAC9B//E,KAAM7pB,KAAKa,QAAQo/F,QAAQp2E,KAC3Bi2E,cAAe9/F,KAAKa,QAAQo/F,QAAQH,cACpCD,YAAa7/F,KAAKa,QAAQo/F,QAAQJ,YAClCE,cAAe//F,KAAKa,QAAQo/F,QAAQF,cACpCC,WAAYhgG,KAAKa,QAAQo/F,QAAQD,aAGrChgG,KAAK6pG,6BAGTF,EAAiBvnG,SAAQq9E,IACrB,MAAMkd,EAAU38F,KAAKs5F,YAAY7Z,GACjCz/E,KAAKyoG,qBAAqBrnG,IAAIu7F,GAC9B38F,KAAK0oG,iBAAmB1oG,KAAK0oG,iBAAiBzmG,QAAOo4F,GAAKr6F,KAAKs5F,YAAYe,KAAOsC,GAAQ,IAG9F38F,KAAKqpG,aAAa,UAAWrpG,KAAKyoG,qBAAqBl6E,MAEvD,MAAMu7E,EAAe,CACjB/H,eAAgB,CACZn/D,WAAW,IAAIC,MAAO2L,cACtBjoC,OAAQ,eACRw0D,QAAS/6D,KAAKa,QAAQk6D,UAI9B/6D,KAAKuP,iBAAiB,gBAAiB,CACnC8nF,MAAOsS,EACP3iF,MAAO2iF,EAAiBv7F,SAE5BpO,KAAK0pG,cAAc,eAAgB,CAC/BrS,MAAOsS,EACP3iF,MAAO2iF,EAAiBv7F,SAG5B,UACUpO,KAAK2oG,UAAUxH,YAAYwI,EAAkB3pG,KAAKa,QAAQo/F,QAAQ77F,MAAO0lG,EACnF,CAAE,MAAO16F,GACLnB,QAAQmB,MAAM,sBAAuBA,EACzC,CACJ,CAEA,YAAMyX,CAAO44D,GACT,IAAKz/E,KAAKa,QAAQ8C,OAAS3D,KAAKa,QAAQo/F,QAAQ77F,MAAO,OAElDpE,KAAK2oG,YAAa3oG,KAAK2oG,UAAUpF,WAClCvjG,KAAK2oG,UAAY,IAAIiB,GAAa,CAC9B//E,KAAM7pB,KAAKa,QAAQo/F,QAAQp2E,KAC3Bi2E,cAAe9/F,KAAKa,QAAQo/F,QAAQH,cACpCD,YAAa7/F,KAAKa,QAAQo/F,QAAQJ,YAClCE,cAAe//F,KAAKa,QAAQo/F,QAAQF,cACpCC,WAAYhgG,KAAKa,QAAQo/F,QAAQD,cAIzC,MAAMrD,EAAU38F,KAAKs5F,YAAY7Z,GAG5Bz/E,KAAKyoG,qBAAqB3/E,IAAI6zE,KAC/B38F,KAAKyoG,qBAAqBrnG,IAAIu7F,GAC9B38F,KAAKqpG,aAAa,UAAWrpG,KAAKyoG,qBAAqBl6E,OAI3DvuB,KAAK0oG,iBAAmB1oG,KAAK0oG,iBAAiBzmG,QAAOo4F,GAAKr6F,KAAKs5F,YAAYe,KAAOsC,IAGlF,MAAMoN,EAAQ/pG,KAAKgqG,gBAAgBvqB,GAC/BsqB,IACA33E,EAAAA,EAAQ9wB,OAAOyoG,EAAOrC,IACtBt1E,EAAAA,EAAQhxB,IAAI2oG,EAAOtC,IACnBr1E,EAAAA,EAAQhxB,IAAI2oG,EAAOvC,KAIvBxnG,KAAK6pG,0BAA0BpqB,GAE/B,MAAMqqB,EAAe,CACjB/H,eAAgB,CACZn/D,WAAW,IAAIC,MAAO2L,cACtBjoC,OAAQ,iBAIhB,UACUvG,KAAK2oG,UAAUxH,YAAY,CAAC1hB,GAAOz/E,KAAKa,QAAQo/F,QAAQ77F,MAAO0lG,EACzE,CAAE,MAAO16F,GACLnB,QAAQmB,MAAM,iBAAkBA,EAEpC,CACJ,CAEAy6F,yBAAAA,GACyC,mBAA1B7pG,KAAK2oG,UAAU/E,OACtB5jG,KAAK2oG,UAAU/E,UAEf5jG,KAAK2oG,UAAUrmG,IAAI,YACnBtC,KAAK2oG,UAAUrmG,IAAI,YACnBtC,KAAK2oG,UAAUrmG,IAAI,SACnBtC,KAAK2oG,UAAUrmG,IAAI,gBAGvBtC,KAAK84F,aAAY,GAEjB94F,KAAK2oG,UAAUpjF,YAAYq7E,IACvB,MAAMnhB,EAAOmhB,EAAWnhB,KAClBsqB,EAAQ/pG,KAAKgqG,gBAAgBvqB,GACnC,IAAKsqB,EAAO,OAEZ33E,EAAAA,EAAQhxB,IAAI2oG,EAAOtC,IACnBr1E,EAAAA,EAAQhxB,IAAI2oG,EAAOvC,IAEnB,MAAMlgG,EAAStH,KAAKiqG,kBAAkBxqB,GACtC,IAAI1+E,EAAAA,EAAAA,IAAUuG,GAAS,CACnB,MAAMmI,EAAKnI,EAAOqG,QAAQ,MAC1B,GAAI8B,EAAI,CACJ,MAAMy6F,EAAa3nG,EAAAA,EAAUC,KAAK,eAAgBiN,GAC9Cy6F,IACAA,EAAWpmG,UAAY,GACvBomG,EAAW5/E,YAAYtqB,KAAKq+F,kBAAkB5e,GAAM,IAE5D,CACJ,CAEA,MAAMl7D,EAAU,CACZk7D,KAAMmhB,EAAWnhB,KACjBkT,SAAUiO,EAAWjO,SACrBwX,UAAWvJ,EAAWuJ,UACtBC,WAAYxJ,EAAWwJ,YAG3BpqG,KAAKuP,iBAAiB,mBAAoBgV,GAC1CvkB,KAAK0pG,cAAc,kBAAmBnlF,EAAQ,IAGlDvkB,KAAK2oG,UAAUxF,YAAYvC,IACvB,MAAMnhB,EAAOmhB,EAAWnhB,KAClBkd,EAAU38F,KAAKs5F,YAAY7Z,GAC3BsqB,EAAQ/pG,KAAKgqG,gBAAgBvqB,GAEnC,IAAKsqB,EAAO,OAEZ33E,EAAAA,EAAQhK,QAAQ2hF,EAAOtC,GAAoBE,IAC3Cv1E,EAAAA,EAAQ9wB,OAAOyoG,EAAOvC,IAEtB,MAAMlgG,EAAStH,KAAKiqG,kBAAkBxqB,GAChCjuE,GAAKxM,EAAAA,EAAAA,IAAc47F,EAAWhrE,QAAQ/xB,UAAU2N,KAAOovF,EAAWpvF,IAAMiuE,EAAKmV,aAGnF,GAFAnV,EAAKjuE,GAAKA,GAENzQ,EAAAA,EAAAA,IAAUuG,IAAWkK,EAAI,CACzB,MAAM/B,EAAKnI,EAAOqG,QAAQ,MAC1B,GAAI8B,EAAI,CACJkY,EAAAA,EAAY/kB,IAAI6M,EAAI,UAAW+B,GAC/BxR,KAAKq+F,kBAAkB5e,GAEvB,MAAMyqB,EAAa3nG,EAAAA,EAAUC,KAAK,eAAgBiN,GAC9Cy6F,IACAA,EAAWpmG,UAAY,GACvBomG,EAAW5/E,YAAYtqB,KAAKq+F,kBAAkB5e,GAAM,EAAM,cAC1DrtD,EAAAA,EAAQhxB,IAAIqO,EAAI83F,IAEhBhiG,YAAW,KACP2kG,EAAWpmG,UAAY,GACvBomG,EAAW5/E,YAAYtqB,KAAKq+F,kBAAkB5e,IAC9CrtD,EAAAA,EAAQ9wB,OAAOmO,EAAI83F,GAAqB,GACzC,KAEX,CACJ,CAEAvnG,KAAKuoG,cAAcnnG,IAAIu7F,GACvB38F,KAAKwoG,qBAAqB9iG,OAAOi3F,GACjC38F,KAAKyoG,qBAAqB/iG,OAAOi3F,GAEjC38F,KAAKqpG,aAAa,YAAarpG,KAAKuoG,cAAch6E,MAClDvuB,KAAKqpG,aAAa,UAAWrpG,KAAKyoG,qBAAqBl6E,MAEvD,MAAMhK,EAAU,CACZk7D,KAAMmhB,EAAWnhB,KACjB57E,SAAU+8F,EAAWhrE,QAAQ/xB,SAC7BiB,OAAQ87F,EAAWhrE,QAAQ9wB,OAC3B0M,GAAIiuE,EAAKjuE,IAGbxR,KAAKuP,iBAAiB,mBAAoBgV,GAC1CvkB,KAAK0pG,cAAc,kBAAmBnlF,EAAQ,IAGlDvkB,KAAK2oG,UAAUtjG,SAASu7F,IACpB,MAAMnhB,EAAOmhB,EAAWnhB,KAClBkd,EAAU38F,KAAKs5F,YAAY7Z,GAC3BsqB,EAAQ/pG,KAAKgqG,gBAAgBvqB,GAEnC,IAAKsqB,EAAO,OAEZ/pG,KAAKuoG,cAAc7iG,OAAOi3F,GAC1B38F,KAAKwoG,qBAAqBpnG,IAAIu7F,GAC9B38F,KAAKyoG,qBAAqB/iG,OAAOi3F,GACjC38F,KAAK0oG,iBAAiB/wF,KAAK8nE,GAE3BrtD,EAAAA,EAAQ9wB,OAAOyoG,EAAOvC,IACtBp1E,EAAAA,EAAQhK,QAAQ2hF,EAAOtC,GAAoBC,IAE3C1nG,KAAKqpG,aAAa,UAAWrpG,KAAKwoG,qBAAqBj6E,MACvDvuB,KAAKqpG,aAAa,UAAWrpG,KAAKyoG,qBAAqBl6E,MAEvD,MAAMjnB,EAAStH,KAAKiqG,kBAAkBxqB,GACtC,IAAI1+E,EAAAA,EAAAA,IAAUuG,GAAS,CACnB,MAAMmI,EAAKnI,EAAOqG,QAAQ,MAC1B,GAAI8B,EAAI,CACJzP,KAAKq+F,kBAAkB5e,GAEvB,MAAMyqB,EAAa3nG,EAAAA,EAAUC,KAAK,eAAgBiN,GAC9Cy6F,IACAA,EAAWpmG,UAAY,GACvBomG,EAAW5/E,YAAYtqB,KAAKqqG,mBAAmB5qB,IAC/CrtD,EAAAA,EAAQhxB,IAAIqO,EAAIi4F,IAExB,CACJ,CAEA,MAAMnjF,EAAU,CAAEk7D,KAAMmhB,EAAWnhB,MAEnCz/E,KAAKuP,iBAAiB,gBAAiBgV,GACvCvkB,KAAK0pG,cAAc,eAAgBnlF,EAAQ,IAG/CvkB,KAAK2oG,UAAUvF,eAAc,KACzBpjG,KAAK0pG,cAAc,sBACnB1pG,KAAK84F,aAAY,GAEZ94F,KAAKwoG,qBAAqBj6E,MACvBvuB,KAAKa,QAAQ2+C,UAAU/Q,SAAWzuC,KAAKa,QAAQ2+C,SAASp7C,OACxD,sCAAwB8hB,MAAKrmB,IACrBG,KAAK69C,WAA+C,mBAA3B79C,KAAK69C,UAAUpsC,SACxCzR,KAAK69C,UAAUpsC,UAGnBzR,KAAK69C,UAAY,IAAIh+C,EAAOyqG,QAAQtqG,KAAMA,KAAKa,QAAQ2+C,SAAS,IACjEl5B,OAAMhhB,IACL2I,QAAQmB,MAAM,mCAAoC9J,EAAI,IAKlE,MAAMif,EAAU,CACZgmF,SAAUvqG,KAAKuoG,cAAch6E,KAC7Bk0E,OAAQziG,KAAKwoG,qBAAqBj6E,KAClCvH,MAAOhnB,KAAK42F,OAAOxoF,QAGvBpO,KAAKuP,iBAAiB,sBAAuBgV,EAAQ,GAE7D,CAEAy+C,MAAAA,CAAO17D,GACH,IAAKtH,KAAKa,QAAQ8C,OAAS3D,KAAKa,QAAQo/F,QAAQ77F,MAAO,OAEvD,MAAMomG,EAAa7iF,EAAAA,EAAY1kB,IAAIqE,EAAQ,QACrC6hG,EAAW,CACbx9F,KAAM6+F,EAAW7+F,KACjB4iB,KAAMi8E,EAAWj8E,KACjBviB,KAAMw+F,EAAWx+F,KACjB4oF,aAAc4V,EAAW,kBAGvB7N,EAAU38F,KAAKs5F,YAAY6P,GACjC,IAAKnpG,KAAKwoG,qBAAqB1/E,IAAI6zE,GAAU,OAE7C,MAAM8N,EAAczqG,KAAK0oG,iBAAiBlmG,MAAK63F,GAAKr6F,KAAKs5F,YAAYe,KAAOsC,IAC5E,IAAK8N,EAAa,OAElBzqG,KAAKwoG,qBAAqB9iG,OAAOi3F,GACjC38F,KAAKyoG,qBAAqBrnG,IAAIu7F,GAE9B38F,KAAKqpG,aAAa,UAAWrpG,KAAKwoG,qBAAqBj6E,MACvDvuB,KAAKqpG,aAAa,UAAWrpG,KAAKyoG,qBAAqBl6E,MAEvD,MAAMhK,EAAU,CACZjd,OAAQA,EACRm4E,KAAMgrB,GAGVzqG,KAAKuP,iBAAiB,WAAYgV,GAClCvkB,KAAK0pG,cAAc,SAAUnlF,GAE7BvkB,KAAK6mB,OAAO4jF,EAChB,CAEAC,eAAAA,CAAgBC,EAAYpnG,GACxB,MAAMqnG,EAAe5qG,KAAKa,QAAQ8C,KAClC3D,KAAKa,QAAQ8C,KAAOgnG,EAEpB3qG,KAAKsD,QAAO,CAACwB,EAAQD,KACjB7E,KAAKa,QAAQ8C,KAAOinG,EACpBrnG,EAASuB,EAAQD,EAAK,GAE9B,CAEAgmG,uBAAAA,CAAwBj1E,GACpB,IAAe,IAAXA,EAAiB,MAAO,CAAEoM,UAAU,EAAMn9B,KAAM,MACpD,IAAe,IAAX+wB,GAA8B,MAAVA,EAAgB,MAAO,CAAEoM,UAAU,EAAOn9B,KAAM,MAExE,GAAsB,iBAAX+wB,EAAqB,CAC5B,GAA+B,kBAApBA,EAAOoM,SACd,MAAO,CAAEA,SAAUpM,EAAOoM,SAAUn9B,KAAM+wB,EAAO/wB,MAAQ,MAE7D,GAAIzB,OAAO+E,UAAUhE,eAAeiE,KAAKwtB,EAAQ,QAC7C,MAAO,CAAEoM,UAAU,EAAMn9B,KAAM+wB,EAAO/wB,MAAQ,KAEtD,CAEA,MAAO,CAAEm9B,SAAUjqB,QAAQ6d,GAAS/wB,KAAM,KAC9C,CAEAimG,wBAAAA,CAAyB9pF,EAASje,GAC9B,OAAO,IAAIqjB,SAASuU,IAChB4G,GAAQyB,QAAQhiB,EAAS,CACrB6f,KAAM99B,EAAO89B,KACbl9B,KAAMZ,EAAOY,KACb28B,QAASv9B,EAAOu9B,QAChBnvB,QAASpO,EAAOoO,UAGpB3P,EAAAA,EAAa8hB,IAAItC,EAAS,mBAAoB1T,IAC1CqtB,EAAQ,CAAEqH,UAAU,EAAMn9B,KAAMyI,GAAOu2B,SAASh/B,MAAQ,MAAO,IAGnErD,EAAAA,EAAa8hB,IAAItC,EAAS,mBAAmB,KACzC2Z,EAAQ,CAAEqH,UAAU,EAAOn9B,KAAM,MAAO,GAC1C,GAEV,CAEAkmG,cAAAA,CAAe7mG,GACX,OAAOA,GAA0B,iBAAVA,IAAuBkN,MAAMiP,QAAQnc,EAChE,CAEA8mG,mBAAAA,IAAuBC,GACnB,OAAOA,EAAQlpF,QAAO,CAACgG,EAAKniB,IACnB5F,KAAK+qG,eAAenlG,IAEzBxC,OAAOonB,QAAQ5kB,GAAQxD,SAAQ,EAAE3B,EAAKyD,MAC9BlE,KAAK+qG,eAAehjF,EAAItnB,KAAST,KAAK+qG,eAAe7mG,GACrD6jB,EAAItnB,GAAOT,KAAKgrG,oBAAoBjjF,EAAItnB,GAAMyD,GAIlD6jB,EAAItnB,GAAO2Q,MAAMiP,QAAQnc,GAASA,EAAM2d,QAAU3d,CAAK,IAGpD6jB,GAXkCA,GAY1C,CAAC,EACR,CAEAmjF,+BAAAA,GACI,MAAO,CACHvpE,MAAO,CACHtiB,KAAM6hB,GAAalhC,KAAKa,QAAQggC,KAAMv4B,IAAa,MACnD3D,MAAO,CAAC,eAEZi9B,OAAQ,CACJviB,KAAM6hB,GAAalhC,KAAKa,QAAQggC,KAAMv4B,IAAc,OACpD3D,MAAO,CAAC,uBAGpB,CAEAwmG,wBAAAA,CAAyBn/F,GACrB,OAAOhM,KAAKgrG,oBACRhrG,KAAKkrG,kCACLlrG,KAAKa,SAASgnG,SAASvnE,QACvBtgC,KAAKa,SAASgnG,UAAU77F,IAAOs0B,QAEvC,CAEA8qE,cAAAA,CAAep/F,EAAMgV,EAASrd,EAAMwN,GAChC,MAAMmvB,EAAUtgC,KAAKmrG,yBAAyBn/F,GAExCq/F,EAAgB,CAClBr/F,OACAgV,UACA6f,KAAM7gC,KAAKa,QAAQggC,KACnBl9B,OACA28B,UACAnvB,WAGEm6F,EAAgBtrG,KAAKa,SAASgnG,UAAU77F,IAAOg3B,QACrD,MAA6B,mBAAlBsoE,EACAllF,QAAQuU,QAAQ2wE,EAAcD,EAAerrG,OAC/CkmB,MAAM0P,GAAW51B,KAAK6qG,wBAAwBj1E,KAGhD51B,KAAK8qG,yBAAyB9pF,EAASqqF,EAClD,CAEAE,UAAAA,CAAWjkG,GACP,MAAMqE,GAAO3G,EAAAA,EAAAA,IAAc2iB,EAAAA,EAAY1kB,IAAIqE,EAAQ,cAC7CinB,GAAOvpB,EAAAA,EAAAA,IAAc2iB,EAAAA,EAAY1kB,IAAIqE,EAAQ,cAC7CkK,GAAKxM,EAAAA,EAAAA,IAAc2iB,EAAAA,EAAY1kB,IAAIqE,EAAQ,YAC3CkkG,EAAaA,KACf,MAAMjnF,EAAU,CACZjd,OAAQA,EACRqE,KAAMA,EACN4iB,KAAMA,EACN/c,GAAIA,EACJ0yC,UAAWlkD,KAAK42F,OAAOxoF,QAG3BpO,KAAKuP,iBAAiB,eAAgBgV,GACtCvkB,KAAK0pG,cAAc,SAAUnlF,EAAQ,EAGnCknF,EAAezrG,KAAK42F,OAAOp0F,MAAK63F,GAAKA,EAAE1uF,OAASA,GAAQ0uF,EAAE9rE,OAASA,IACzE,GAAIk9E,EAAc,CACd,MAAMhrG,EAAMT,KAAKs5F,YAAYmS,GAC7BzrG,KAAKuoG,cAAc7iG,OAAOjF,GAC1BT,KAAKyoG,qBAAqB/iG,OAAOjF,GACjCT,KAAKwoG,qBAAqB9iG,OAAOjF,EACrC,CAoBA,GAlBAT,KAAKgqG,kBAAkB5nG,SAAQkP,IAC3B,MAAMgyB,EAAM/gC,EAAAA,EAAUC,KAAK,SAAU8O,GACrC,IAAKgyB,EAAK,OACV,MAAMooE,GAAQ1mG,EAAAA,EAAAA,IAAc2iB,EAAAA,EAAY1kB,IAAIqgC,EAAK,YAC3CqoE,GAAU3mG,EAAAA,EAAAA,IAAc2iB,EAAAA,EAAY1kB,IAAIqgC,EAAK,cAC7CsoE,GAAU5mG,EAAAA,EAAAA,IAAc2iB,EAAAA,EAAY1kB,IAAIqgC,EAAK,cAEnDtjC,KAAK42F,OAAOx0F,SAAQq9E,IACZA,EAAK9zE,OAASggG,GAAWlsB,EAAKlxD,OAASq9E,IACvCnsB,EAAKjuE,GAAKk6F,EACd,IAGAD,GAAc9/F,OAASggG,GAAWF,GAAcl9E,OAASq9E,IACzDH,EAAaj6F,GAAKk6F,EACtB,IAGA1rG,KAAKa,QAAQ8C,MAAQ3D,KAAKa,QAAQgnG,QAAQE,OAAO3jG,MAAO,CACxD,IAAKoN,EAMD,OALAxR,KAAK42F,OAAS52F,KAAK42F,OAAO30F,QAAOo4F,KAAOA,EAAE1uF,OAASA,GAAQ0uF,EAAE9rE,OAASA,KACtEvuB,KAAK6rG,0BACL7rG,KAAK42F,OAAOxoF,OAASpO,KAAKsf,QAAUtf,KAAKw4F,OAAM,GAC/CgT,SACAxrG,KAAK2/F,kBAIT,MAAMmM,EAAY9rG,KAAKa,QAAQgnG,QAAQE,OAAO3jG,MACxC2nG,EAAiBD,EAAUpgG,SAAS,KAAO,IAAM,IAEjDi/F,EAAa,CACfvmG,MAFU,GAAG0nG,IAAYC,OAAoBvwD,mBAAmBhqC,KAGhEnN,OAAQ,UAGN2nG,EAAuBnnG,IACzB7E,KAAK42F,OAAS52F,KAAK42F,OAAO30F,QAAOo4F,KAAOA,EAAE1uF,OAASA,GAAQ0uF,EAAE9rE,OAASA,KACtEvuB,KAAK6rG,0BAED7rG,KAAK42F,OAAOxoF,OACZpO,KAAK+4F,UAAU/4F,KAAK42F,QAEpB52F,KAAKw4F,OAAM,GAAM,GAGjBx4F,KAAKa,QAAQgnG,QAAQE,OAAO/5F,OAC5BiD,GAAAA,EAAQC,IAAIrM,GAAMhB,UAAUsN,SAGhCq6F,GAAY,EAGhB,GAAIxrG,KAAKa,QAAQgnG,QAAQE,OAAOD,MAAO,CACnC,MAAM32F,EAAU,CACZ+qB,MAAO+E,GAAcjhC,KAAKa,QAAQggC,KAAMv4B,IAAa,MACrDu5B,YAAaZ,GAAcjhC,KAAKa,QAAQggC,KAAMv4B,IAAmB,aAGrEtI,KAAKorG,eAAe,SAAU9jG,EAAQqjG,EAAYx5F,GAC7C+U,MAAM0P,IACEA,EAAOoM,WAERpM,EAAO/wB,KACPmnG,EAAoBp2E,EAAO/wB,MAI/B7E,KAAK0qG,gBAAgBC,GAAY,CAAC7lG,EAAQD,KACtCmnG,EAAoBnnG,EAAK,IAC3B,IAELyhB,OAAM,QACf,MACItmB,KAAK0qG,gBAAgBC,GAAY,CAAC7lG,EAAQD,KACtCmnG,EAAoBnnG,EAAK,GAGrC,MACI7E,KAAK42F,OAAS52F,KAAK42F,OAAO30F,QAAOo4F,KAAOA,EAAE1uF,OAASA,GAAQ0uF,EAAE9rE,OAASA,KACtEvuB,KAAK6rG,0BACL7rG,KAAK42F,OAAOxoF,OAASpO,KAAKsf,QAAUtf,KAAKw4F,OAAM,GAC/CgT,IAGJxrG,KAAK2/F,iBACT,CAEAkM,uBAAAA,GACI7rG,KAAKqpG,aAAa,YAAarpG,KAAKuoG,cAAch6E,MAClDvuB,KAAKqpG,aAAa,UAAWrpG,KAAKyoG,qBAAqBl6E,MACvDvuB,KAAKqpG,aAAa,UAAWrpG,KAAKwoG,qBAAqBj6E,MACvDvuB,KAAK84F,aACT,CAEAkR,eAAAA,CAAgBvqB,EAAO,MACnB,IAAI38D,EAAY,GAAG9iB,KAAKi3F,UAAU,eAGlC,OAFIj3F,KAAKyO,OAAO62B,OAAMxiB,EAAY,GAAG9iB,KAAKi3F,UAAU,gBAE/CxX,EAMMl9E,EAAAA,EAAUC,KACb,IAAIsgB,mBAA2B28D,EAAK9zE,qBAAqB8zE,EAAKlxD,SAC9DvuB,KAAKW,UAPF4B,EAAAA,EAAUqf,QACb,IAAIkB,cACJ9iB,KAAKW,SAQjB,CAEAspG,iBAAAA,CAAkBxqB,GACd,OAAOl9E,EAAAA,EAAUC,KAAK,qBAAqBi9E,EAAK9zE,qBAAqB8zE,EAAKlxD,SAAUvuB,KAAKW,SAC7F,CAEA09F,iBAAAA,CAAkB5e,EAAMwsB,GAAS,EAAOnnG,EAAS,IAC7C,IAAI+a,GAAOxY,EAAAA,EAAAA,GAAO,SAAUmkB,EAAS,kBAQrC,OAPKxrB,KAAKa,QAAQiM,OAAM+S,GAAOxY,EAAAA,EAAAA,GAAO,UAClC4kG,IACApsF,GAAOxY,EAAAA,EAAAA,GAAO,WACC,cAAXvC,EAAwB+a,GAAOxY,EAAAA,EAAAA,GAAO,SACrCmkB,EAAS,kBAGXxrB,KAAK22F,KAAKrvF,OAAO,CACpBtH,KAAK22F,KAAK3rE,EAAE,CAAC,EAAGnL,EAAM,CAAE0K,QAAQ,KACjC,SAAUvqB,KAAK25F,yBAAyBla,EAAM,CAC7CzzE,KAAM,SACN,CAACwf,GAAS,OACV,YAAai0D,EAAK9zE,KAClB,YAAa8zE,EAAKlxD,MAAQ,EAC1B,YAAakxD,EAAKzzE,MAAQ,GAC1B,qBAAsByzE,EAAKmV,cAAgB,GAC3C,UAAWnV,EAAKjuE,IAAM,KAE9B,CAEA64F,kBAAAA,CAAmB5qB,GAMf,OALgBz/E,KAAK22F,KAAKjyF,IAAI,CAAEC,MAAO,wBAA0B,CAC7D3E,KAAKq+F,kBAAkB5e,GAAM,EAAM,WACnCz/E,KAAKq+F,kBAAkB5e,IAI/B,CAEAypB,WAAAA,GACI,IAAKlpG,KAAKyO,OAAOuoF,KAAM,OACvB,IAAKh3F,KAAKa,QAAQ8C,KAAM,OAExB,MAAMuoG,EAAY3pG,EAAAA,EAAUC,KAAK,IAAI8kG,cAA4BtnG,KAAKyO,OAAOuoF,MAC7E,IAAKkV,EAAW,OAEhB,IAAIC,EAAY5pG,EAAAA,EAAUC,KAAK,IAAI8kG,mBAAiC4E,GAC/DC,IACDA,EAAYnsG,KAAK22F,KAAK9qE,GAAG,CACrB7rB,KAAK22F,KAAKlnF,GAAG,CACT9K,MAAO,oBACP,aAAc,IACd,MAASs8B,GAAcjhC,KAAKa,QAAQggC,KAAMv4B,IAAe,SAC1D,CACCtI,KAAK22F,KAAK5rE,KAAK,CAAEpmB,MAAO,eAAgB0C,EAAAA,EAAAA,GAAO,aAAc,CAAEkjB,QAAQ,IACvEvqB,KAAK22F,KAAK5rE,KAAK,CAAEpmB,MAAO,cAAgB,KAE5C3E,KAAK22F,KAAKlnF,GAAG,CACT9K,MAAO,sBACP,aAAc,IACd,MAASs8B,GAAcjhC,KAAKa,QAAQggC,KAAMv4B,IAAiB,WAC5D,CACCtI,KAAK22F,KAAK5rE,KAAK,CAAEpmB,MAAO,eAAgB0C,EAAAA,EAAAA,GAAO,aAAc,CAAEkjB,QAAQ,IACvEvqB,KAAK22F,KAAK5rE,KAAK,CAAEpmB,MAAO,cAAgB,KAE5C3E,KAAK22F,KAAKlnF,GAAG,CACT9K,MAAO,oBACP,aAAc,IACd,MAASs8B,GAAcjhC,KAAKa,QAAQggC,KAAMv4B,IAAe,SAC1D,CACCtI,KAAK22F,KAAK5rE,KAAK,CAAEpmB,MAAO,eAAgB0C,EAAAA,EAAAA,GAAO,aAAc,CAAEkjB,QAAQ,IACvEvqB,KAAK22F,KAAK5rE,KAAK,CAAEpmB,MAAO,cAAgB,MAG7C,CAAEA,MAAO2iG,GAAkB,mBAAoB,GAClD4E,EAAU5hF,YAAY6hF,GAE9B,CAEA9C,YAAAA,CAAavkG,EAAQ+4D,GACjB,IAAK79D,KAAKyO,OAAOuoF,KAAM,OAEvB,MAAM+S,EAAQxnG,EAAAA,EAAUC,KAAK,IAAI8kG,uBAAoCxiG,IAAU9E,KAAKyO,OAAOuoF,MAC3F,IAAK+S,EAAO,OAEZpiF,EAAAA,EAAY/kB,IAAImnG,EAAO,aAAclsC,GACrC,MAAMuuC,EAAS7pG,EAAAA,EAAUC,KAAK,cAAeunG,GACzCqC,IAAQA,EAAOtoG,UAAY+5D,EACnC,CAEAo9B,2BAAAA,CAA4B5D,GACnBr3F,KAAKa,QAAQ8C,MAElB0zF,EAAMj1F,SAAQq9E,IACV,MAAMsqB,EAAQ/pG,KAAKgqG,gBAAgBvqB,GACnC,IAAKsqB,EAAO,OAEZ,MAAMtpG,EAAMT,KAAKs5F,YAAY7Z,GACzBz/E,KAAKuoG,cAAcz/E,IAAIroB,IACvB2xB,EAAAA,EAAQhK,QAAQ2hF,EAAOvC,GAAoBD,IAC3Cn1E,EAAAA,EAAQhxB,IAAI2oG,EAAOpC,KACZ3nG,KAAKwoG,qBAAqB1/E,IAAIroB,GACrC2xB,EAAAA,EAAQhK,QAAQ2hF,EAAOvC,GAAoBE,IAE3Ct1E,EAAAA,EAAQhxB,IAAI2oG,EAAOvC,GACvB,GAER,CAEAj4F,gBAAAA,CAAiB5D,EAAM9G,GACnB,MAAMw+F,EAAKrjG,KAAKa,QAAQ4tD,YAAY9iD,GACpC,GAAkB,mBAAP03F,EACP,IAAMA,EAAGj7F,KAAKpI,KAAM6E,EAAM7E,KAAO,CAAE,MAAO6P,GAAK5B,QAAQmB,MAAM,GAAGzD,oBAAwBkE,EAAI,CAEpG,CAEA65F,aAAAA,CAAc2C,EAAQ9nF,EAAU,CAAC,GAC7B/iB,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAU,GAAGkC,MAAYwpG,IAAU9nF,EACjE,CAEAvT,eAAAA,GACI,OAAOI,MAAMC,KAAKrR,KAAKuoG,eAAej6F,KAAI7N,IACtC,MAAMg/E,EAAOz/E,KAAK42F,OAAOp0F,MAAK63F,GAAKr6F,KAAKs5F,YAAYe,KAAO55F,IAC3D,OAAOg/E,GAAMjuE,IAAM,IAAI,IACxBvP,QAAOuP,GAAa,OAAPA,GACpB,CAEAnP,OAAAA,GACQrC,KAAK69C,WAA+C,mBAA3B79C,KAAK69C,UAAUpsC,SACxCzR,KAAK69C,UAAUpsC,UAEnBzR,KAAK69C,UAAY,KAEjB79C,KAAKw4F,QACDx4F,KAAK2oG,YACiC,mBAA3B3oG,KAAK2oG,UAAUl3F,QACtBzR,KAAK2oG,UAAUl3F,WAEqB,mBAAzBzR,KAAK2oG,UAAUnQ,OAAsBx4F,KAAK2oG,UAAUnQ,QAC1B,mBAA1Bx4F,KAAK2oG,UAAU/E,QAAuB5jG,KAAK2oG,UAAU/E,WAGxEplF,MAAMnc,SACV,EAGJb,EAAAA,EAAaC,GAAG4L,SAAU,oBAAoBxK,eAAqB,KAC/DN,EAAAA,EAAUqf,QAAQ,IAAIylF,MAAwBjlG,SAAQkP,GAAMs2F,GAAQ7/F,oBAAoBuJ,IAAI,IAGhG9P,EAAAA,EAAaC,GAAG4L,SAAU,SAASxK,cAAqBukG,IAAuB,SAAUv3F,GACrFA,EAAErC,iBACFqC,EAAEgB,kBACwC,mBAA/BhB,EAAEy8F,0BAAyCz8F,EAAEy8F,2BAExD,MAAMhoG,EAASuL,EAAEvL,OAAOqJ,QAAQ,IAAI05F,MAChC/iG,GAAQsjG,GAAQ7/F,oBAAoBzD,GAAQinG,WAAW17F,EAAEvL,OAAOqJ,QAAQy5F,IAChF,IAEA5lG,EAAAA,EAAaC,GAAG4L,SAAU,SAASxK,cAAqBskG,IAAsB,SAAUt3F,GACpFA,EAAErC,iBACFqC,EAAEgB,kBACwC,mBAA/BhB,EAAEy8F,0BAAyCz8F,EAAEy8F,2BAExD,MAAMhoG,EAASuL,EAAEvL,OAAOqJ,QAAQ,IAAI05F,MAChC/iG,GAAQsjG,GAAQ7/F,oBAAoBzD,GAAQ0+D,OAAOnzD,EAAEvL,OAAOqJ,QAAQw5F,IAC5E,IAEA3lG,EAAAA,EAAaC,GAAG4L,SAAU,SAASxK,cAv7BD,gCAu7BiD,SAAUgN,GACzF,MAAMvL,EAASuL,EAAEvL,OAAOqJ,QAAQ,IAAI05F,MACpC,IAAK/iG,EAAQ,OAEb,MAAMic,EAAWqnF,GAAQ7/F,oBAAoBzD,GAE7C,GAAIic,EAAS1f,QAAQ8C,MAAQ4c,EAAS1f,QAAQgnG,QAAQvF,IAAIl+F,MAAO,CAC7DyL,EAAErC,iBAEF,MACMm9F,EAAa,CACfvmG,MAFUmc,EAAS1f,QAAQgnG,QAAQvF,IAAIl+F,MAGvCC,OAAQ,OACRQ,KAAM,CAAEiM,IAAKyP,EAASvP,oBAGpBu7F,EAAoBA,KACtBhsF,EAASi4E,OAAM,GAAM,EAAK,EAG9B,GAAIj4E,EAAS1f,QAAQgnG,QAAQvF,IAAIwF,MAAO,CACpC,MAAM32F,EAAU,CACZ+qB,MAAO+E,GAAc1gB,EAAS1f,QAAQggC,KAAMv4B,IAAa,MACzDu5B,YAAaZ,GAAc1gB,EAAS1f,QAAQggC,KAAMv4B,IAAoB,cAG1EiY,EAAS6qF,eAAe,MAAOv7F,EAAEvL,OAAQqmG,EAAYx5F,GAChD+U,MAAM0P,IACH,GAAKA,EAAOoM,SAEZ,OAAIpM,EAAO/wB,MACH0b,EAAS1f,QAAQgnG,QAAQvF,IAAIt0F,OAC7BiD,GAAAA,EAAQC,IAAI0kB,EAAO/wB,MAAMhB,UAAUsN,cAEvCo7F,UAIJhsF,EAASmqF,gBAAgBC,GAAY,CAAC7lG,EAAQD,KACtC0b,EAAS1f,QAAQgnG,QAAQvF,IAAIt0F,OAASnJ,GAAMhB,UAAUsN,SACtDF,GAAAA,EAAQC,IAAIrM,EAAKhB,SAASsN,SAE9Bo7F,GAAmB,GACrB,IAELjmF,OAAM,QACf,MACI/F,EAASmqF,gBAAgBC,GAAY,CAAC7lG,EAAQD,KACtC0b,EAAS1f,QAAQgnG,QAAQvF,IAAIt0F,OAASnJ,GAAMhB,UAAUsN,SACtDF,GAAAA,EAAQC,IAAIrM,EAAKhB,SAASsN,SAE9Bo7F,GAAmB,GAG/B,MACIhsF,EAASi4E,OAAM,GAAM,EAE7B,IAEA,MCpgCA,GDogCA,iBE5/BA,MACM31F,GAAW,kBAGXyZ,GAAkB,OAElBc,GAA2B,SAASva,cAE1C,MAAM2pG,WAAuBjuF,EAAAA,EAC5Bhe,WAAAA,CAAY+Q,EAAIvO,EAAS,CAAC,GACzByb,MAAMlN,EAAIvO,GAEV/C,KAAKa,QAAUb,KAAK8C,WAAWwO,GAAIxQ,EAAAA,EAAAA,IAAgB,CAClD2rG,YAAa,gCACX1pG,GACJ,CAEA,eAAWuF,GACV,MAlBW,cAmBZ,CAEA,mBAAWzF,GACV,OAAOA,EACR,CAEA4d,MAAAA,CAAOC,GACN,OAAQ1gB,KAAK2gB,WAAwC3gB,KAAK4gB,KAAKF,GAArC1gB,KAAKwgB,KAAKE,EACrC,CAEAF,IAAAA,CAAKE,GACAA,IAAe1gB,KAAKa,QAAUb,KAAK8C,WAAW4d,EAAe1gB,KAAKa,UAEtEb,KAAKW,SAASQ,UAAUC,IAAIkb,IAC5BoE,EAAcpf,SACdtB,KAAKsf,OAAM,GACXqI,EAAAA,EAAY/kB,IAAI5C,KAAKW,SAAU,OAAQ,OACxC,CAEAigB,IAAAA,CAAKF,GACJ1gB,KAAKW,SAASQ,UAAUG,OAAOgb,IAC/BoE,EAAcpf,SACdtB,KAAKsf,OAAM,GACXqI,EAAAA,EAAY/kB,IAAI5C,KAAKW,SAAU,OAAQ,WACxC,CAEAggB,QAAAA,GACC,OAAO3gB,KAAKW,SAASQ,UAAUE,SAASib,GACzC,CAEA,WAAOpU,CAAKoJ,EAAIvO,GACAypG,GAAezkG,oBAAoBuJ,EAAIvO,GAC7Cuc,OAAM,EAChB,CAEAA,KAAAA,CAAMotF,GAAS,GACd,IAAIr6E,EAAUryB,KAAKa,QAAQwxB,QAAQ7O,KAAK,KAAMmc,EAAM,GACpD,MAAMgtE,GAAOloG,EAAAA,EAAAA,GAAK,UACdzE,KAAKW,SAAS8yB,eAAiBzzB,KAAKa,QAAQ4rG,aAC/CzsG,KAAKW,SAAS8yB,cAActyB,UAAUC,IAAIpB,KAAKa,QAAQ4rG,aAMvD9sE,EAHI+sE,EAGEC,EAAKl/E,UAAU,MAAO,CAAC9oB,MAAO0tB,EAASrmB,KAAM,SAF7C2gG,EAAKl/E,UAAU,MAAO,CAAC9oB,MAAO0tB,IAKrCryB,KAAKW,SAAS6G,mBAAmBxH,KAAKa,QAAQ+rG,OAAQjtE,EACvD,EAMDn+B,EAAAA,EAAaC,GAAG4L,SAAU+P,GAxEE,2BAwE8C,SAAU9P,GACnF,MAAMhJ,EAAS/B,EAAAA,EAAUuxB,KAAK9zB,KAAM,SAC/BsE,IAED,CAAC,IAAK,QAAQoH,SAAS1L,KAAKuN,UAC/BD,EAAME,kBAGHC,EAAAA,EAAAA,IAAWzN,QAIfA,KAAK0P,aAAa,iBAAiB,GAElB88F,GAAezkG,oBAAoBzD,EAAO+pC,SAClD5tB,OAAOzgB,OACjB,IAEA,YC9CMsI,GAAO,cAMPzF,GAAW,QAMXs+B,GAAoB,uBAyBpB0rE,GAAwB,UAAUhqG,cAKxC,MAAMiqG,WAAqBvuF,EAAAA,EAM1Bhe,WAAAA,CAAYC,EAASuC,EAAS,CAAC,GAC9Byb,MAAMhe,EAASuC,GAOf/C,KAAKa,QAAUb,KAAK8C,WAAWtC,GAASM,EAAAA,EAAAA,IAAgB,CACvD+C,SAAU,CACT4qC,SAAS,EACTs+D,QAAQ,EACR7wE,MAAO,GACP/qB,QAAS,IAEV67F,SAAU,CACT59F,MAAO,GACPzC,QAAS,IAEVihF,UAAU,EACVqf,QAAQ,EACRtxE,OAAQ,GACRj4B,QAAS,GACTwpG,KAAM,CACLz+D,SAAS,EACT/kB,SAAU,YACV2I,QAAS,CAAC,kCACVu6E,OAAQ,YAET9E,MAAO,CACNr5D,SAAS,EACTziC,KAAM,QACN+gG,QAAQ,EACR7wE,OAAO,EACPre,MAAO,EACP8e,MAAO,CACNwwE,wBAAwB,GAEzBn/F,MAAO,CACNo/F,wBAAwB,IAG1BzpG,KAAM,CACLS,MAAO,GACPE,OAAQ,GACRD,OAAQ,MACRX,QAAS,IACTa,QAAQ,EACRC,QAAQ,GAET6tB,QAAS,CACR2J,QAAS,iBACTqxE,cAAe,0BACfC,WAAY,uBACZjd,WAAY,mBACZkd,YAAa,gBACbntF,QAAS,2BAEV7c,SAAU,CACTiqG,UAAWhoF,EAAAA,GACXioF,aAAcjoF,EAAAA,GACdkoF,WAAYloF,EAAAA,GACZmoF,UAAWnoF,EAAAA,IAEZooF,aAAc,CACbC,WAAYA,IAAM,IAAIznF,SAAQ,CAACuU,EAAStU,IAAWsU,MACnDhuB,SAAS,EACTyC,OAAO,GAER9H,OAAQ,CACPmnC,SAAS,EACTva,UAAU,EACV5M,KAAM,gBACNwmF,QAAS,YACT7gG,QAAS,CACRwhC,SAAS,EACTjuC,QAAS,+DAEV+iF,MAAO/9D,EAAAA,IAERqb,KAAM,MACJ99B,IAOH/C,KAAKm8B,QAAU,KAOfn8B,KAAK+tG,gBAAkB,IAAI5/E,IAE3BnuB,KAAKguG,eACN,CAOA,eAAW1lG,GACV,OAAOA,EACR,CAOA,mBAAWzF,GACV,OAAOA,EACR,CAMAmrG,aAAAA,GACChuG,KAAKm8B,QAAU55B,EAAAA,EAAUC,KAAK,kBAAmBxC,KAAKW,WACrD4B,EAAAA,EAAUC,KAAK,UAAYxC,KAAKW,SAAS6Q,GAAK,OAC9C,KAED,MAAMmqB,EAASp5B,EAAAA,EAAUqf,QAAQ,0BAA2B5hB,KAAKW,UACjEX,KAAK+tG,gBAAgBnrG,IAAI,SAAU+4B,GAEnC37B,KAAKa,QAAQ8C,KAAKS,MAAQujB,EAAAA,EAAY1kB,IAAIjD,KAAKW,SAAU,WAAaX,KAAKa,QAAQ8C,KAAKS,MACxFpE,KAAKa,QAAQ8C,KAAKU,OAASsjB,EAAAA,EAAY1kB,IAAIjD,KAAKW,SAAU,WAAaX,KAAKa,QAAQ8C,KAAKU,OAEzFrE,KAAKa,QAAQotG,UAAgE,UAApDtmF,EAAAA,EAAY1kB,IAAIjD,KAAKW,SAAU,iBACxDX,KAAKa,QAAQqtG,YAAoE,UAAtDvmF,EAAAA,EAAY1kB,IAAIjD,KAAKW,SAAU,mBAC1DX,KAAKa,QAAQstG,WAAkE,SAArDxmF,EAAAA,EAAY1kB,IAAIjD,KAAKW,SAAU,kBAErDX,KAAKm8B,UACRn8B,KAAKa,QAAUb,KAAK8C,WAAW9C,KAAKm8B,QAASn8B,KAAKa,SAClDb,KAAKa,QAAQyG,OAAOwmG,QAAU9tG,KAAKm8B,QAAQr4B,UAAU2C,QAAUzG,KAAKa,QAAQyG,OAAOwmG,QAErF,CAMAxuF,KAAAA,GACCtf,KAAKW,SAASQ,UAAUC,IAAIpB,KAAKa,QAAQwxB,QAAQ2J,SAEjD,MAAML,EAAS37B,KAAK+tG,gBAAgB9qG,IAAI,UAsBxC,OArBI04B,GACHA,EAAOv5B,SAASkP,KACX6iB,EAAAA,EAAAA,IAAU7iB,IAAOA,EAAGmiB,eACvBniB,EAAGmiB,cAActyB,UAAUC,IAAIpB,KAAKa,QAAQwxB,QAAQjS,QACrD,IAIEpgB,KAAKa,QAAQ+sF,WAChBjmE,EAAAA,EAAY/kB,IAAI5C,KAAKW,SAAU,aAAc,IAC7CX,KAAKW,SAASQ,UAAUC,IAAIpB,KAAKa,QAAQwxB,QAAQg+D,aAG9CrwF,KAAKa,QAAQqsG,KAAKz+D,SACrB,IAAKlsC,EAAAA,EAAUqf,QAAQ,yBAA0B5hB,KAAKW,WAAWyB,SAASkP,IACzEk7F,GAAetkG,KAAKoJ,EAAItR,KAAKa,QAAQqsG,KAAK,KAI5CjoG,EAAAA,EAAAA,IAAQjF,KAAKa,QAAQ0C,SAASiqG,UAAW,CAACxtG,KAAKW,SAAUX,OAElDA,IACR,CAOAqG,OAAAA,CAAQiH,EAAOzI,EAAO,MACrB,MAAMupG,EAAQpuG,KAadouG,EAAMC,eA6CND,EAAMvtG,QAAQ+sG,aAAaC,aAAa3nF,MAAK,KA3C9B+mF,MACd,IAAInL,EAAW,IAAI99E,SAASoqF,EAAMztG,UAExBytG,EAAMvtG,QAAQ8C,KAAKkB,KAAzBA,EAjBiBypG,EAAChqG,EAAQiC,KAC9B,MAAMgoG,EAAe,IAAIx9F,IAQzB,OAPAxK,EAAOnE,SAAQ,CAAC8B,EAAOzD,KACjB8tG,EAAazlF,IAAIroB,KACrB6D,EAAOoB,OAAOjF,GACd8tG,EAAantG,IAAIX,IAElB6D,EAAOmU,OAAOhY,EAAKyD,EAAM,IAEnBI,CAAM,EAQuBgqG,CAAczpG,EAAMi9F,GACzBA,EAE/BsM,EAAM9qG,QAAO,SAAUwB,EAAQD,IAC9BI,EAAAA,EAAAA,IAAQmpG,EAAMvtG,QAAQ0C,SAASoqG,UAAW,CAACS,EAAMztG,SAAUytG,EAAOtpG,EAAQD,IAE1EupG,EAAMztG,SAASQ,UAAUG,OAAO,iBAE5B8sG,EAAMvtG,QAAQgD,SAAS4qC,UAC1B5pC,EAAKhB,SAAWuqG,EAAMvtG,QAAQgD,UAG3BuqG,EAAMvtG,QAAQinG,MAAMr5D,UACD,iBAAX3pC,GAAkC,UAAXA,EAC7BspG,EAAMvtG,QAAQmsG,SAAS59F,MAC1BiG,OAAOqO,SAASyH,KAAOijF,EAAMvtG,QAAQmsG,SAAS59F,OAEzCg/F,EAAMvtG,QAAQ+sG,aAAax+F,OAC/Bg/F,EAAMI,YAAYlhG,EAAOzI,IAGzBI,EAAAA,EAAAA,IAAQmpG,EAAMvtG,QAAQ0C,SAASmqG,WAAY,CAACU,EAAMztG,SAAUytG,EAAO9gG,EAAOzI,KAGhD,iBAAXC,GAAkC,YAAXA,IACpCspG,EAAMvtG,QAAQmsG,SAASrgG,QAC1B0I,OAAOqO,SAASyH,KAAOijF,EAAMvtG,QAAQmsG,SAASrgG,SAEzCyhG,EAAMvtG,QAAQ+sG,aAAajhG,SAC/ByhG,EAAMK,cAAcnhG,EAAOzI,IAG3BI,EAAAA,EAAAA,IAAQmpG,EAAMvtG,QAAQ0C,SAASkqG,aAAc,CAACW,EAAMztG,SAAUytG,EAAO9gG,EAAOzI,MAKjF,GAAE,EAIFooG,EAAQ,IACN3mF,OAAMhhB,IACR2I,QAAQmB,MAAM9J,EAAI,GAEpB,CAMA+oG,YAAAA,GACC,MAAMD,EAAQpuG,KAEd,GAAiC,aAA7BouG,EAAMvtG,QAAQinG,MAAM97F,KAAqB,CAC5C,MAAM0iG,EAAgBN,EAAMvtG,QAAQwxB,QAAQg7E,cAC5C,IAAKe,EAAML,gBAAgBjlF,IAAI,cAAgBzb,SAAS9F,cAAc,IAAMmnG,EAAgB,SAAU,CACrG,MAAMC,EAAYthG,SAASuhG,uBAAuBF,GAClDN,EAAML,gBAAgBnrG,IAAI,YAAa+rG,GAEvC,IAAIA,GAAWvsG,SAAQ,SAAU5B,GAC5BA,EAAQW,UAAUE,SAAS,SAC9B6iC,GAAWn8B,oBAAoBvH,EAAS,CAAEigB,QAAQ,IAASG,MAE7D,GACD,CACD,CAEAwtF,EAAMS,cAAc,UACpBrtG,EAAAA,EAAawf,QAAQotF,EAAMztG,SA7RH,eA6R+B,CACtDmuG,aAAc,CACbC,KAAMX,IAGT,CAQAI,WAAAA,CAAYlhG,EAAOzI,GAClB,MAAMupG,EAAQpuG,KAEdouG,EAAMS,cAAc,SACpBT,EAAMY,WAAWnqG,EAAM,SACvBrD,EAAAA,EAAawf,QAAQotF,EAAMztG,SArTH,cAqT8B,CACrDmuG,aAAc,CACbxhG,MAAOA,EACPyhG,KAAMX,EACNvpG,KAAMA,IAGT,CAQA4pG,aAAAA,CAAcnhG,EAAOzI,GACpB,MAAMupG,EAAQpuG,KAEdouG,EAAMS,cAAc,SACpBT,EAAMY,WAAWnqG,EAAM,WACvBrD,EAAAA,EAAawf,QAAQotF,EAAMztG,SA/UH,gBA+UgC,CACvDmuG,aAAc,CACbxhG,MAAOA,EACPyhG,KAAMX,EACNvpG,KAAMA,IAGT,CAOAgqG,aAAAA,CAAc/pG,GACb,GAAK9E,KAAKm8B,QAAV,CAEA,GAAe,WAAXr3B,EAAqB,CACxB,MAAMwC,EAAStH,KAAKm8B,QAEpBn8B,KAAKa,QAAQyG,OAAOwmG,QAAU9tG,KAAKm8B,QAAQr4B,UAAU2C,OAEjDzG,KAAKa,QAAQyG,OAAO2F,QAAQwhC,SAC/BzuC,KAAKm8B,QAAQ30B,mBAAmB,aAAcxH,KAAKa,QAAQyG,OAAO2F,QAAQzM,SAGvER,KAAKa,QAAQyG,OAAOmnC,UACvBnnC,EAAOxD,UAAY9D,KAAKa,QAAQyG,OAAOggB,MAGpCtnB,KAAKa,QAAQyG,OAAO4sB,UACvBvM,EAAAA,EAAY/kB,IAAI5C,KAAKm8B,QAAQ,WAAY,aAG1Cl3B,EAAAA,EAAAA,IAAQjF,KAAKa,QAAQyG,OAAOi8E,MAAO,CAACvjF,KAAMA,KAAKm8B,QAAS,UACzD,CAEA,GAAe,UAAXr3B,EAAoB,CASvB,GARI9E,KAAKa,QAAQyG,OAAOmnC,UACvBzuC,KAAKm8B,QAAQr4B,UAAY9D,KAAKa,QAAQyG,OAAOwmG,SAG1C9tG,KAAKa,QAAQyG,OAAO4sB,UACvBvM,EAAAA,EAAYrmB,OAAOtB,KAAKm8B,QAAQ,YAG7Bn8B,KAAKa,QAAQyG,OAAO2F,QAAQwhC,QAAS,CACxC,IAAIxhC,EAAUjN,KAAKm8B,QAAQ50B,cAAc,mBACrC0F,GAASA,EAAQ3L,QACtB,EAEA2D,EAAAA,EAAAA,IAAQjF,KAAKa,QAAQyG,OAAOi8E,MAAO,CAACvjF,KAAMA,KAAKm8B,QAAS,SACzD,CArCyB,CAsC1B,CAQA6yE,UAAAA,CAAWnqG,EAAMC,GAChB,MAAMspG,EAAQpuG,KAEVouG,EAAMvtG,QAAQqtG,YACjBE,EAAMtG,OAAM9iG,EAAAA,EAAAA,IAAcH,GAAOC,GAEjCspG,EAAMtG,MAAMjjG,EAAMC,EAEpB,CAOAgjG,KAAAA,CAAMjjG,EAAMC,GACX,IAAIf,EAAAA,EAAAA,IAASc,GACZ,GAAK,SAAUA,GAASA,EAAK+f,MAAsB,MAAd/f,EAAK+f,MACzC,GAAI,aAAc/f,GAAQA,EAAKhB,SAAU,CACxC,IAAIA,GAAWmB,EAAAA,EAAAA,IAAcH,EAAKhB,UACV,iBAAbA,GAC+B,IAArCA,EAASkzB,QAAQ,iBAA+D,IAAtClzB,EAASkzB,QAAQ,kBAC9DjyB,EAAS,SACTD,EAAO,CACNhB,SAAU,CACTq4B,MAAO8E,EAAYhhC,KAAKa,QAAQggC,KAAM,UAAU3E,MAChD/qB,QAAS8vB,GAAcjhC,KAAKa,QAAQggC,KAAM,UAAUouE,cAKnD,WAAYprG,IAAYmB,EAAAA,EAAAA,IAAcnB,EAASkpG,UAClDjoG,GAASE,EAAAA,EAAAA,IAAcnB,EAASkpG,QAAU,SAAW,UAGxD,OAEAjoG,EAAS,SAIN9E,KAAKa,QAAQinG,MAAMr5D,UAEQ,UAA5BzuC,KAAKa,QAAQinG,MAAM97F,MACtBhM,KAAKkvG,YAAYrqG,EAAMC,GAGQ,aAA5B9E,KAAKa,QAAQinG,MAAM97F,MACtBhM,KAAKmvG,eAAetqG,EAAMC,GAGK,UAA5B9E,KAAKa,QAAQinG,MAAM97F,MACtBhM,KAAKovG,YAAYvqG,EAAMC,GAEzB,CAQAoqG,WAAAA,CAAYrqG,EAAMC,GACjB,MAAMspG,EAAQpuG,KACRmtG,EAAyBiB,EAAMvtG,QAAQinG,MAAMnrE,OAAOwwE,uBACpDkC,GAAkBlC,GAA0BiB,EAAMkB,mBAEpDnC,GACHiB,EAAMmB,qBAGP,IAAI/9F,EAAK48F,EAAMvtG,QAAQwxB,QAAQ2J,QAAU,KAAMvc,EAAAA,EAAAA,MAC9C+vF,EAASjtG,EAAAA,EAAUC,KAAK,IAAM4rG,EAAMvtG,QAAQwxB,QAAQi7E,YAEjDkC,GAAQA,EAAOluG,SAEnBiE,YAAW,KACVg2B,EAAQrzB,KAAKsJ,EAAI,CAChBsqB,SAAS,EACTzJ,QAAS,CACRy1E,MAAOsG,EAAMvtG,QAAQwxB,QAAQi7E,cAE5B,SAAUyB,GACZ,IAAIvuG,EAAUuuG,EAAKpuG,SACnBH,EAAQW,UAAUC,IAAIgtG,EAAMvtG,QAAQwxB,QAAQi7E,YACxC+B,GACHjB,EAAMqB,sBAAsBjvG,GAG7B,IAAIiD,EAAWlB,EAAAA,EAAUC,KAAK,oBAAqBhC,GAC/CiD,GAAUA,EAAStC,UAAUC,IAAI+/B,GAAkBA,GAAmB,IAAMr8B,GAEhF,IAAI4qG,EAAQntG,EAAAA,EAAUC,KAAK,iBAAkBhC,GACzCkvG,GAAOA,EAAMj3F,OAAO21F,EAAMuB,sBAAsBnvG,EAASsE,EAAQD,EAAM,UAE3EkqG,EAAKtuF,SAED2tF,EAAMvtG,QAAQinG,MAAMjqF,MAAQ,GAC/BtY,YAAW,KACVwpG,EAAKnuF,MAAM,GACTwtF,EAAMvtG,QAAQinG,MAAMjqF,MAEzB,GAAE,GACAuwF,EAAMvtG,QAAQ6C,QAClB,CAOA4rG,gBAAAA,GACC,OAAOv3F,QAAQxV,EAAAA,EAAUC,KAAK,+BAC/B,CAOAitG,qBAAAA,CAAsBjvG,GAChBA,IAELA,EAAQW,UAAUC,IA7gBa,oBA8gB/BZ,EAAQuT,MAAMmE,OAASlY,KAAK4vG,sBAC7B,CAOAA,mBAAAA,GACC,MAAMC,EAAUttG,EAAAA,EAAUqf,QAAQ,+BAChCtT,KAAK9N,GAAYqU,OAAOw3B,SAASh3B,OAAOgf,iBAAiB7zB,GAAS0X,OAAQ,MAC1EjW,QAAQigB,GAAUrN,OAAOI,SAASiN,KAEpC,OAAO1b,QAAQqpG,EAAQzhG,OAAS+G,KAAKC,OAAOy6F,GAAW,MAAQ,GAChE,CAMAN,kBAAAA,GACC,IAAIliG,SAASuhG,uBAAuB,UAAUxsG,SAAS5B,IAClDA,GAAWA,EAAQW,UAAUE,SAAS,UAChB,oBAAdyuG,WAA6BA,UAAUC,OAAOhoG,oBAC5C+nG,UAAUC,MAAMhoG,oBAAoBvH,GAC5CogB,OAEJ3S,QAAQC,KAAK+yB,GAAcjhC,KAAKa,QAAQggC,KAAMv4B,IAAM0nG,qBAEtD,IAGD,IAAI3iG,SAASuhG,uBAAuB,aAAaxsG,SAAS5B,IACzD,GAAIA,GAAWA,EAAQW,UAAUE,SAAS,QAAS,CAClD,MAAM4uG,EAAM10E,EAAQxzB,oBAAoBvH,GACxCyvG,EAAIrvF,KAAK,CAACqvF,GACX,IAEF,CAQAd,cAAAA,CAAetqG,EAAMC,GACpB,MAAMspG,EAAQpuG,KAEd,IAAIkwG,EAAY3tG,EAAAA,EAAUC,KAAK,IAAM4rG,EAAMvtG,QAAQwxB,QAAQg7E,eACtD6C,IACJA,EAAY7iG,SAAS2K,cAAc,OACnCk4F,EAAU/uG,UAAUC,IAAIgtG,EAAMvtG,QAAQwxB,QAAQg7E,eAC9C6C,EAAU/uG,UAAUC,IAAI,eACxB8uG,EAAU1+F,GAAK48F,EAAMvtG,QAAQwxB,QAAQ2J,QAAU,KAAMvc,EAAAA,EAAAA,MACrDywF,EAAUz3F,OAAO21F,EAAMuB,sBAAsBO,EAAWprG,EAAQD,EAAM,aAEtEupG,EAAMztG,SAASo6D,QAAQm1C,IAGxB,IAAIC,EAAWjsE,GAAWn8B,oBAAoBmoG,EAAW,CAACzvF,QAAQ,IAClE0vF,EAAS1vF,SAEL2tF,EAAMvtG,QAAQinG,MAAMjqF,MAAQ,GAC/BtY,YAAW,KACV4qG,EAASvvF,MAAM,GACbwtF,EAAMvtG,QAAQinG,MAAMjqF,MAEzB,CAQAuxF,WAAAA,CAAYvqG,EAAMC,GACjB,MAAMjB,EAAW7D,KAAKowG,sBAAsBtrG,EAAQD,GAC9CwrG,EAAcrwG,KAAKswG,gBAAgBxrG,GAErC9E,KAAKa,QAAQinG,MAAM95F,OAAOo/F,wBAC7BptG,KAAKuvG,qBAGF1rG,EAASq4B,MACZjrB,GAAAA,EAAQC,IAAI,CAACrN,EAASq4B,MAAOr4B,EAASsN,SAAUk/F,GAIjDp/F,GAAAA,EAAQC,IAAIrN,EAASsN,QAASk/F,EAC/B,CAQAC,eAAAA,CAAgBxrG,GACf,MAAMmZ,EAAmB,UAAXnZ,EAAqB,SAAWA,EACxCyrG,EAAuB,WAAXzrG,EAAsB,QAAUA,EAC5C+Y,EAAQ7d,KAAKa,QAAQinG,MAAMjqF,MAAQ,EAAI7d,KAAKa,QAAQinG,MAAMjqF,MAAQ,IAClE2yF,EAAkB,CAAC,GACnB,uBAACpD,KAA2BiD,GAAerwG,KAAKa,QAAQinG,MAAM95F,OAAS,CAAC,EAuB9E,MAtBoB,CACnB,SACA,YACA,WACA,QACA,mBACA,oBACA,WACA,QACA,OACA,SACA,QACA,YACA,QAGW5L,SAAS3B,IAChBA,KAAOT,KAAKa,QAAQinG,QACvB0I,EAAgB/vG,GAAOT,KAAKa,QAAQinG,MAAMrnG,GAC3C,KAGMK,EAAAA,EAAAA,IAAgB,CACtBmd,MAAOA,GAAS,OAChBjS,KAAMukG,GAAa,KACnBxyF,mBAAmB,EACnBH,SAAU5d,KAAKa,QAAQinG,MAAMjqF,MAAQ,EACrCA,MAAOA,GACL2yF,EAAiBH,EACrB,CAUAV,qBAAAA,CAAsBc,EAAU3rG,EAAQD,EAAMmH,GAC7C,IAAI0kG,EAASnuG,EAAAA,EAAUC,KAAK,IAAK2+B,GAAkB,WAAYsvE,GAC/D,MAAM5sG,EAAW7D,KAAKowG,sBAAsBtrG,EAAQD,GAI9Cub,GAHQvc,EAASq4B,OACpBz3B,EAAAA,EAAAA,GAAK,UAAUynB,GAAG,CAACvnB,MAAOw8B,GAAkB,mBAAoBt9B,EAASq4B,OACzE,IACqBr4B,EAASsN,QAEjC,GAAKu/F,EAYOnuG,EAAAA,EAAUC,KAAK,iBAAkBiuG,GACvC3sG,UAAYsc,MAbL,CACZ,MAAMuf,GAAMl7B,EAAAA,EAAAA,GAAK,OAEjBisG,EAAS/wE,EAAIj7B,IAAI,CAChBC,MAAOw8B,GAAmB,IAAMn1B,GAC9B,CACF2zB,EAAIj7B,IAAI,CAACC,MAAOw8B,GAAmB,YAAa,CAC/CxB,EAAI3U,EAAE,CAACrmB,MAAOw8B,GAAmB,mBAAmB95B,EAAAA,EAAAA,GAAOvC,GAAS,CAACylB,QAAQ,IAC7EoV,EAAIj7B,IAAI,CAACC,MAAOw8B,GAAmB,kBAAmB/gB,EAAS,CAACmK,QAAQ,OAG3E,CAKA,OAAOmmF,CACR,CASAN,qBAAAA,CAAsBtrG,EAAQD,GAC7B,IAAIhB,GAAWmB,EAAAA,EAAAA,IAAcH,GAAMhB,WAAagB,EAEhD,IAAId,EAAAA,EAAAA,IAASc,GAAO,CACnB,IAAId,EAAAA,EAAAA,IAASc,EAAKhB,WAAa,SAAUgB,EAAKhB,SAC7C,MAAO,CACNq4B,MAAO,GACP/qB,QAAStM,EAAKhB,SAASq7C,MAIzB,GAAwB,iBAAbr7C,EAAuB,CACjC,GAAe,WAAXiB,EAAqB,CAGxB,GAFAjB,EAASq4B,MAAS,UAAWr4B,EAAYA,EAASq4B,MAAQ8E,EAAYhhC,KAAKa,QAAQggC,KAAM,UAAU3E,MAE/F,SAAUr3B,GAAsB,MAAdA,EAAK+f,KAAc,CACxC,MAAMsb,EAAW,CAChB,IAAKe,GAAcjhC,KAAKa,QAAQggC,KAAM,UAAU,KAChD,IAAKI,GAAcjhC,KAAKa,QAAQggC,KAAM,UAAU,KAChD,IAAKI,GAAcjhC,KAAKa,QAAQggC,KAAM,UAAU,KAChD,IAAKI,GAAcjhC,KAAKa,QAAQggC,KAAM,UAAU,KAChD,IAAKI,GAAcjhC,KAAKa,QAAQggC,KAAM,UAAU,KAChD,IAAKI,GAAcjhC,KAAKa,QAAQggC,KAAM,UAAU,KAChD,IAAKI,GAAcjhC,KAAKa,QAAQggC,KAAM,UAAU,KAChD,IAAKI,GAAcjhC,KAAKa,QAAQggC,KAAM,UAAU,KAChD,IAAKI,GAAcjhC,KAAKa,QAAQggC,KAAM,UAAU,MAEjDh9B,EAASsN,QAAU+uB,EAASr7B,EAAK+f,OAASqc,GAAcjhC,KAAKa,QAAQggC,KAAM,UAAUouE,WACrFprG,EAASq4B,OAAS,KAAOr3B,EAAK+f,KAAO,GACtC,CAEA,GAAI,WAAY/gB,GAAY7D,KAAKa,QAAQinG,MAAMiF,OAAQ,CACtD,IAAIA,GAAS/nG,EAAAA,EAAAA,IAAcnB,EAASkpG,SAAW,KAG/C,GAFAlpG,EAASsN,QAAU,IAEfpN,EAAAA,EAAAA,IAASgpG,GACZ,IAAK,MAAM39F,KAAS29F,EACf37F,MAAMiP,QAAQ0sF,EAAO39F,IACxB29F,EAAO39F,GAAOhN,SAASid,GAASxb,EAASsN,QAAQwG,KAAK0H,KAEtDxb,EAASsN,QAAQwG,KAAKo1F,EAAO39F,GAIjC,CACD,CAEA,MAAMuwB,GAAMl7B,EAAAA,EAAAA,GAAK,UACjB,IAAI0M,EAAU,GAcd,OAZIC,MAAMiP,QAAQxc,EAASsN,SAC1BtN,EAASsN,QAAQ/O,SAASid,IACzBlO,GAAWwuB,EAAIj7B,IAAI,CAClBC,MAAOw8B,GAAkB,qBACvB9hB,EAAK,IAGTlO,EAAUwuB,EAAIj7B,IAAI,CACjBC,MAAOw8B,GAAkB,qBACvBt9B,EAASsN,SAGN,CACN+qB,MAAOl8B,KAAKa,QAAQinG,MAAM5rE,OAAQr4B,EAASq4B,OAAc,GACzD/qB,QAASA,EAEX,CACD,CAEA,MAAO,CACN+qB,MAAO,GACP/qB,QAA6B,iBAAbtN,EAAwBA,EAAW,GAErD,CASA,WAAOqE,CAAK1H,EAASuC,EAAS,CAAC,GACb+pG,GAAa/kG,oBAAoBvH,EAASuC,GAClDuc,OACV,CAUA,kBAAOqxF,CAAYC,EAAQrtG,EAAUuB,EAAS,UAC7C,MAAMymB,EAAOhpB,EAAAA,EAAUC,KAAKouG,GAC5B,GAAIrlF,EAAM,CACT,MAAMhL,EAAWusF,GAAa/kG,oBAAoBwjB,GAClDA,EAAK3b,iBAAiB,SAAW9K,GAAQ+K,KACxC5K,EAAAA,EAAAA,IAAQ1B,EAAU,CAACgoB,EAAMhL,GAAU,GAErC,CACD,EAMD/e,EAAAA,EAAaC,GAAG4L,SAAUw/F,IAAuB,SAAUv/F,GAC1D,IAAKqa,EAAAA,EAAYmB,IAAIxb,EAAMhJ,OAAQ,qBAClC,OAGD,MAAMic,EAAWusF,GAAa/kG,oBAAoBuF,EAAMhJ,OAAQ,CAAC,GACjE,GAAKic,EAAL,CAIA,GAAIA,EAAS1f,QAAQ+sF,WACfrtE,EAAS5f,SAASkwG,gBAMtB,OALAvjG,EAAME,iBACNF,EAAMuD,kBAEN0P,EAAS5f,SAASQ,UAAUC,IAAImf,EAAS1f,QAAQwxB,QAAQk7E,cAElD,EAIT,IAAKhtF,EAAS1f,QAAQosG,OAAQ,CAC7B3/F,EAAME,iBAEN,MAAMsjG,EAAc,SAASjsG,EAAM82B,GAgBlC,OAfAA,EAAOv5B,SAAQ,SAAS4pC,IACnBjoC,EAAAA,EAAAA,IAASioC,IACD5oC,OAAOwgB,KAAKooB,GAClB5pC,SAAQ,SAAS3B,GACrB,IAAIyD,GAAQc,EAAAA,EAAAA,IAAcgnC,EAAMvrC,IAE5B2Q,MAAMiP,QAAQnc,KAAUH,EAAAA,EAAAA,IAASG,GACpCW,EAAK4T,OAAOhY,EAAKwjB,KAAKC,UAAUhgB,IAEhCW,EAAK4T,OAAOhY,EAAKyD,EAEnB,GAEF,IAEOW,CACR,EAEA,IAAIA,EAAO,IAAImf,SAASzD,EAAS5f,UAChCg7B,EAASpb,EAAS1f,QAAQ86B,OAM3B,OAJIvqB,MAAMiP,QAAQsb,IAAWA,EAAOvtB,SACnCvJ,EAAOisG,EAAYjsG,EAAM82B,IAGnBpb,EAASla,QAAQiH,EAAOzI,EAChC,CA3CA,CA4CD,IAEA,MCr6BA,GDq6BA,GE75BA,SAASoB,GAAO3B,GAQf,OAPgB8M,MAAMjJ,UAAU0Z,MAAMzZ,KAAK2oG,UAAW,GAC9C3uG,SAAQmE,IACVA,GACLnD,OAAOwgB,KAAKrd,GAAQnE,SAAQ3B,IAC3B6D,EAAO7D,GAAO8F,EAAO9F,EAAI,GACxB,IAEI6D,CACR,CAoJA,MAEA,GA/GA,SAAS4D,EAAK8oG,EAAWC,GAIxB,SAASruG,EAAInC,EAAKyD,EAAO+kB,GACxB,GAAwB,oBAAb5b,SAA0B,OAMrC,GAAkC,iBAHlC4b,EAAahjB,GAAO,CAAC,EAAGgrG,EAAmBhoF,IAGrBioF,QAAsB,CAC3C,MAAMC,EAAW,MACjBloF,EAAWioF,QAAU,IAAIruE,KAAKA,KAAKmL,MAAQ/kB,EAAWioF,QAAUC,EACjE,CAGIloF,EAAWioF,UACdjoF,EAAWioF,QAAUjoF,EAAWioF,QAAQE,eAIzC3wG,EAAM+6C,mBAAmB/6C,GACvB2nB,QAAQ,uBAAwBqM,oBAChCrM,QAAQ,QAASgL,QAGnB,IAAIi+E,EAAwB,GAe5B,OAdAjuG,OAAOwgB,KAAKqF,GAAY7mB,SAAQkvG,IAC/B,GAAKroF,EAAWqoF,KAEhBD,GAAyB,KAAOC,GAGE,IAA9BroF,EAAWqoF,IAAyB,CAEvC,MAAMC,EAAiB/qG,OAAOyiB,EAAWqoF,IAAgB9lG,MAAM,KAAK,GACpE6lG,GAAyB,IAAME,CAChC,KAIOlkG,SAASmkG,OAAS/wG,EAAM,IAAMuwG,EAAUS,MAAMvtG,EAAOzD,GAAO4wG,CACrE,CAiCA,OAAOjuG,OAAOsuG,OACb,CACC9uG,MACAK,IA/BF,SAAaxC,GACZ,GAAwB,oBAAb4M,UAA6B0jG,UAAU3iG,SAAW3N,EAC5D,OAGD,MAAMkxG,EAAUtkG,SAASmkG,OAASnkG,SAASmkG,OAAOhmG,MAAM,MAAQ,GAC1DomG,EAAM,CAAC,EAEb,IAAK,IAAI5mF,EAAI,EAAGA,EAAI2mF,EAAQvjG,OAAQ4c,IAAK,CACxC,MAAMy4B,EAAQkuD,EAAQ3mF,GAAGxf,MAAM,KACzBtH,EAAQu/C,EAAM5hC,MAAM,GAAG2B,KAAK,KAC5BquF,EAAapuD,EAAM,GAEzB,IACC,MAAMquD,EAAWr9E,mBAAmBo9E,GAIpC,GAHAD,EAAIE,GAAYd,EAAUe,KAAK7tG,EAAO4tG,GAGlCrxG,IAAQqxG,EAAU,KACvB,CAAE,MAAOjiG,GACR,CAEF,CAEA,OAAOpP,EAAMmxG,EAAInxG,GAAOmxG,CACzB,EAUEtwG,OAAQ,SAAUb,EAAKwoB,GACtBrmB,EAAInC,EAAK,GAAIwF,GAAO,CAAC,EAAGgjB,EAAY,CAAEioF,SAAU,IACjD,EAKAc,eAAgB,SAAU/oF,GACzB,OAAO/gB,EAAKlI,KAAKgxG,UAAW/qG,GAAO,CAAC,EAAGjG,KAAKipB,WAAYA,GACzD,EAKAgpF,cAAe,SAAUjB,GACxB,OAAO9oG,EAAKjC,GAAO,CAAC,EAAGjG,KAAKgxG,UAAWA,GAAYhxG,KAAKipB,WACzD,GAED,CACCA,WAAY,CAAE/kB,MAAOd,OAAO8uG,OAAOjB,IACnCD,UAAW,CAAE9sG,MAAOd,OAAO8uG,OAAOlB,KAGrC,CAGgB9oG,CA/IS,CAOxB6pG,KAAM,SAAU7tG,GAIf,MAHiB,MAAbA,EAAM,KACTA,EAAQA,EAAM2d,MAAM,GAAI,IAElB3d,EAAMkkB,QAAQ,mBAAoBqM,mBAC1C,EAQAg9E,MAAO,SAAUvtG,GAChB,OAAOs3C,mBAAmBt3C,GAAOkkB,QAChC,2CACAqM,mBAEF,GAsHsC,CAAEvoB,KAAM,MC5JzCrJ,GAAW,eAEXyZ,GAAkB,OAElBQ,GAAiB,GAAGja,UACpBka,GAAmB,GAAGla,YACtBma,GAAiB,GAAGna,UACpBoa,GAAkB,GAAGpa,WAIrBua,GAA2B,SAASva,cAE1C,MAAMsvG,WAAoB5zF,EAAAA,EAGzBhe,WAAAA,CAAYC,EAASuC,EAAS,CAAC,GAC9Byb,MAAMhe,EAASuC,GAEf/C,KAAKa,QAAUb,KAAK8C,WAAWtC,GAASM,EAAAA,EAAAA,IAAgB,CACvD8pD,QAAS,QACT/sC,MAAO,IACP2zF,OAAQ,CACP7lG,KAAM,YACNzH,MAAO,MACP+kB,WAAY,CAAC,GAEd5K,UAAW,CACVle,QAAQ,EACRC,GAAI,oBACJC,IAAK,uBACLwd,MAAO,KAERla,KAAM,CACLS,MAAO,GACPE,OAAQ,GACRD,OAAQ,MACRE,QAAQ,EACRQ,MAAM,EACNP,QAAQ,IAEPzB,IAGH/C,KAAKoyG,SAAWpyG,KAAKqyG,iBAGrBryG,KAAKa,QAAQwd,UAAUR,MAAQ7d,KAAKa,QAAQwd,UAAUle,OAASH,KAAKa,QAAQwd,UAAUR,MAAQ,EAC9F7d,KAAK6H,WAAW7H,KAAKW,SAAUwxG,GAAYtvG,SAAU7C,KAAKa,QAAQwd,UACnE,CAEA,eAAW/V,GACV,MArDW,WAsDZ,CAEA,mBAAWzF,GACV,OAAOA,EACR,CAOAyvG,YAAAA,GACC,OAAOtyG,KAAKoyG,SAASnvG,QAAUjD,KAAKa,QAAQ2wG,OAAOttG,KACpD,CAKAuc,MAAAA,GACC,OAAOzgB,KAAKsyG,eAAiBtyG,KAAK4gB,OAAS5gB,KAAKwgB,MACjD,CAKAA,IAAAA,IACK/S,EAAAA,EAAAA,IAAWzN,KAAKW,WAAaX,KAAKsyG,gBAEpB9wG,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUqc,IACxCrB,mBAEd3b,KAAKW,SAASQ,UAAUC,IAAIkb,IAM5Btc,KAAKyH,gBAJoB8Z,KACxB/f,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUsc,GAAgB,GAGfjd,KAAKW,UAAU,EAAMX,KAAKa,QAAQgd,OACzE,CAKA+C,IAAAA,GACmBpf,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUmc,IACxCnB,mBAEd3b,KAAKW,SAASQ,UAAUG,OAAOgb,IAM/Btc,KAAKyH,gBAJoB8Z,KACxB/f,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUoc,GAAiB,GAGhB/c,KAAKW,UAAU,EAAMX,KAAKa,QAAQwd,UAAUR,OACnF,CAOAw0F,cAAAA,GACC,MAAM,KAAE1mG,EAAI,MAAEzH,EAAK,WAAE+kB,GAAejpB,KAAKa,QAAQ2wG,OAEjD,MAA6B,WAAzBxxG,KAAKa,QAAQ+pD,QACT,CACN3nD,IAAKA,IAAMsvG,GAAQtvG,IAAI0I,GACvB/I,IAAKA,IAAM2vG,GAAQ3vG,IAAI+I,EAAMzH,EAAO+kB,IAG9B,CACNhmB,IAAKA,IAAM07B,aAAaG,QAAQnzB,GAChC/I,IAAKA,IAAM+7B,aAAaC,QAAQjzB,EAAMzH,GAGzC,CAKAsuG,MAAAA,GACCxyG,KAAKoyG,SAASxvG,KACf,CAKA,YAAO62B,GACN84E,GAAQjxG,OAAO6wG,GAAYM,mBAAmBjB,OAAO7lG,MACrDgzB,aAAa65D,QACb90E,SAASs/C,QACV,CAKA,uBAAOyvC,GACN,OAAO3xG,EAAAA,EAAAA,IAAgB,CACtB0wG,OAAQ,CAAE7lG,KAAM,cACd,CAAC,EACL,CAEAtJ,OAAAA,GACCkwG,GAAQjxG,OAAO6wG,GAAYM,mBAAmBjB,OAAO7lG,MACrDgzB,aAAa65D,QACbh6E,MAAMnc,SACP,CAOA,WAAO6F,CAAK1H,EAASuC,EAAS,CAAC,GACbovG,GAAYpqG,oBAAoBvH,EAASuC,GACjD0d,QACV,GAIDtT,EAAAA,EAAAA,GAAeglG,IAGf3wG,EAAAA,EAAaC,GAAG4L,SAAU+P,GAvKG,gCAuK6C,SAAU9P,GAKnF,GAJI,CAAC,IAAK,QAAQ5B,SAAS1L,KAAKuN,UAC/BD,EAAME,kBAGHC,EAAAA,EAAAA,IAAWzN,MAAO,OAEtB,MAAMQ,EAAU+B,EAAAA,EAAUC,KAAK,iBAC/B,IAAKhC,EAAS,OAEd,MAAM+f,EAAW4xF,GAAYpqG,oBAAoBvH,GACjD+f,EAASiyF,SACTjyF,EAASK,MACV,IAGApf,EAAAA,EAAaC,GAAG4L,SAAU+P,GAtLS,sCAsL6C,SAAU9P,GAKzF,GAJI,CAAC,IAAK,QAAQ5B,SAAS1L,KAAKuN,UAC/BD,EAAME,kBAGHC,EAAAA,EAAAA,IAAWzN,MAAO,OAEtB,MAAMQ,EAAU+B,EAAAA,EAAUC,KAAK,iBAC1BhC,IAEY2xG,GAAYpqG,oBAAoBvH,GACxC6B,UACT8vG,GAAY14E,QACb,IAEA,MCxNA,GDwNA,GE5JMnxB,GAAO,WACPzF,GAAW,MAAQyF,GAInB4U,GAAmB,GAAGra,YACtB6vG,GAAwB,GAAG7vG,iBAC3B8vG,GAAkB,cAClBr2F,GAAkB,OAClBc,GAA2B,SAASva,cAE1C,MAAM+vG,WAAmBr0F,EAAAA,EAKxB,eAAWjW,GAAS,OAAOA,EAAM,CAMjC,mBAAWzF,GAAa,OAAOA,EAAU,CAKzCtC,WAAAA,CAAYC,EAASuC,GACpByb,MAAMhe,EAASuC,GAOf/C,KAAKa,QAAUb,KAAK8C,WAAWtC,GAASM,EAAAA,EAAAA,IAAgB,CACvD+/B,KAAMxzB,SAASulB,gBAAgBiO,MAAQ,KACvCgyE,MAAO,EACP/wF,OAAQ,EACRtd,QAAQ,EACRoZ,UAAU,EACVk1F,SAAS,EACTr6F,OAAQ,QACRoR,KAAM,SACNhY,UAAW,IACXE,OAAO,EACPmqF,QAAQ,EACR50F,OAAQ,CACP+X,KAAM,GACNiI,KAAM,cACN9G,KAAM,eACNjc,QAAQ,EACR8tB,QAAS,IAEV1uB,KAAM,CACLS,MAAO,GACPE,OAAQ,GACRD,OAAQ,MACRE,QAAQ,EACRQ,MAAM,EACNP,QAAQ,EACRK,KAAM,CAAC,IAEN9B,IAOH/C,KAAKga,UAAY,KAOjBha,KAAK+yG,cAAsC,WAAtB/yG,KAAKa,QAAQgpB,KAOlC7pB,KAAKgzG,iBAAmBxyG,EAAQ0xB,aAAa,kBAG7ClyB,KAAKa,QAAQyG,OAAOggB,KAAO4Z,GAAalhC,KAAKa,QAAQggC,KAAMv4B,IAAY,KACvEtI,KAAKa,QAAQyG,OAAOkZ,KAAO0gB,GAAalhC,KAAKa,QAAQggC,KAAMv4B,IAAY,KAElEtI,KAAKa,QAAQyG,OAAO+X,OACxBrf,KAAKa,QAAQyG,OAAO+X,KAAOrf,KAAKgzG,iBAC7BhzG,KAAKW,SAASmD,UAAU2C,QAAUy6B,GAAalhC,KAAKa,QAAQggC,KAAMv4B,IAAM,aACxEtI,KAAKa,QAAQ8C,KAAKS,MAAQ88B,GAAalhC,KAAKa,QAAQggC,KAAMv4B,IAAM,aAAe44B,GAAalhC,KAAKa,QAAQggC,KAAMv4B,IAAM,cAGrHtI,KAAKgzG,iBACRhzG,KAAKizG,sBAELjzG,KAAKkzG,sBAEP,CAMAD,mBAAAA,GACKjzG,KAAK+yG,eACR/yG,KAAKmzG,iBAEP,CAMAD,oBAAAA,GACC,MAAQxzE,SAAU0zE,EAAS,MAAEP,GAAU7yG,KAAKa,QACtC8xB,EAAY3yB,KAAKW,SACjBmrB,EAAQvpB,EAAAA,EAAUqf,QAAQ,IAAIwxF,IAAazgF,IAE5C3yB,KAAKa,QAAQ8C,KAAKS,QAAU0nB,EAAM1d,QAAUykG,GAAS7yG,KAAKa,QAAQihB,QAAUgK,EAAM1d,UAIvF0d,EAAM1pB,SAAQ,CAAC0N,EAAMkb,KACpBlb,EAAK3O,UAAUsf,OAAOnE,GAAiB0O,EAAI6nF,GAC3C/iG,EAAK3O,UAAUsf,OAAOkyF,GAAiB3nF,GAAK6nF,EAAM,IAGzB,WAAtB7yG,KAAKa,QAAQgpB,KAChB7pB,KAAKqzG,uBAAuB1gF,GAClB3yB,KAAK+yG,eACf/yG,KAAKmzG,kBAGsB,IAAxBnzG,KAAKa,QAAQihB,SAChB9hB,KAAKa,QAAQihB,OAAS+wF,GAExB,CAOAQ,sBAAAA,CAAuB1gF,GACtB,MAAMrrB,EAAS+F,SAAS2K,cAAc,UAChCs7F,GAAatuG,EAAAA,EAAAA,IAAc2tB,EAAUve,QAAQk/F,aAAetzG,KAAKa,QAAQyG,OAAO+X,KAEhFk0F,EAAa,CAClBV,MAAO7yG,KAAKa,QAAQgyG,MACpB/wF,OAAQ9hB,KAAKa,QAAQihB,OACrBtd,OAAQxE,KAAKa,QAAQ2D,OACrBoZ,SAAU5d,KAAKa,QAAQ+c,SACvBk1F,QAAS9yG,KAAKa,QAAQiyG,QACtBr6F,OAAQzY,KAAKa,QAAQ4X,OACrBoR,KAAM7pB,KAAKa,QAAQgpB,KACnBhY,UAAW7R,KAAKa,QAAQgR,UACxBE,MAAO/R,KAAKa,QAAQkR,MACpBmqF,OAAQl8F,KAAKa,QAAQq7F,OACrBx8D,SAAU1/B,KAAKa,QAAQ6+B,SACvB,YAAa,WACbp7B,OAAQ,IAAIquB,EAAUnhB,MAGvBpO,OAAO6C,OAAOstG,GAAYvuG,EAAAA,EAAAA,IAAc2tB,EAAUve,QAAQrR,SAE1DK,OAAOwgB,KAAK2vF,GAAYnxG,SAAQ3B,IAC/BknB,EAAAA,EAAY/kB,IAAI0E,EAAQ,QAAQ7G,IAAO8yG,EAAW9yG,GAAK,IAGxD6G,EAAOuR,YAAcy6F,EACrBhsG,EAAOnG,UAAUC,OAAOpB,KAAKa,QAAQyG,OAAO+qB,SAE5CM,EAAUvC,WAAWzf,aAAarJ,EAAQqrB,EAAU/hB,YACrD,CAMAuiG,eAAAA,GACCnzG,KAAKwzG,6BACLxzG,KAAKyzG,yBACN,CAMAD,0BAAAA,GACKxzG,KAAKga,YAETha,KAAKga,UAAY,IAAI05F,sBAAsBlpF,IAC1CA,EAAQpoB,SAAQqrC,IACXA,EAAMkmE,iBACT3zG,KAAKa,QAAQkR,OAAS9D,QAAQxE,IAAI,2CAClCzJ,KAAKygB,SACN,GACC,GACA,CACF/gB,KAAM,KACNk0G,WAAY,WAAW5zG,KAAKa,QAAQgR,kBACpCA,UAAW,KAEb,CAMA4hG,uBAAAA,GACC,IAAKzzG,KAAKga,UAAW,OAErBha,KAAKga,UAAUkC,aAEf,MAAMyW,EAAYpwB,EAAAA,EAAUC,KAAKxC,KAAKa,QAAQyD,SAAWtE,KAAKW,SAASyvB,WAEjEyjF,EADQtxG,EAAAA,EAAUqf,QAAQ,IAAI5hB,KAAKa,QAAQ6+B,WAAY/M,GAClC1wB,QAAO6N,GAAQA,EAAK3O,UAAUE,SAASib,MAC5Du5C,EAAcg+C,EAAaA,EAAazlG,OAAS,GAEnDynD,aAAuBxjB,SAC1BryC,KAAKga,UAAUiC,QAAQ45C,EAEzB,CASAp1C,MAAAA,CAAOld,GACNvD,KAAKa,QAAQkR,OAAS9D,QAAQxE,IAAI,yBAE9BjI,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAU+xG,IAAuB/2F,oBAE9C3b,KAAKgzG,kBAAqB,CAAC,SAAU,KAAKtnG,SAAS1L,KAAKW,SAAS4M,WAAavN,KAAK+yG,iBAEnG/yG,KAAKW,SAASuzB,UAAW,EACzBl0B,KAAKW,SAASmD,UAAY9D,KAAKa,QAAQ8C,KAAKS,MAAQpE,KAAKa,QAAQyG,OAAOggB,KAAOtnB,KAAKa,QAAQyG,OAAOkZ,MAGpGxgB,KAAKa,QAAQ8C,KAAKS,MAAQpE,KAAK2D,KAAKJ,GAAYvD,KAAK8zG,WAAWvwG,GACjE,CAOAI,IAAAA,CAAKJ,GACJ,MAAMwwG,EAAiB/zG,KAAKa,QAAQ8C,KAAKW,QAAQmC,OACjD,IAAIutG,EAAW,KAQf,GALCA,EADGD,EACQxxG,EAAAA,EAAUC,KAAKuxG,GAEf/zG,KAAKW,UAGZqzG,EAEJ,YADA/lG,QAAQmB,MAAM,yCAA0CpP,KAAKa,QAAQ8C,KAAKW,QAI3E,MAAMwhG,EAAe9lG,KAAKa,QAAQyG,OAAO+X,KAEzCrf,KAAKa,QAAQ8C,KAAKkB,KAAO,CAAEguG,MAAO7yG,KAAKa,QAAQgyG,MAAO/wF,OAAQ9hB,KAAKa,QAAQihB,QAE3E9hB,KAAKsD,QAAO,CAACwB,EAAQD,EAAMovG,KAC1B,GAAe,UAAXnvG,GAAgD,iBAAnBD,GAAMhB,SAAuB,OAE1D7D,KAAKa,QAAQ2D,QAChBwvG,EAASxsG,mBACgB,UAAxBxH,KAAKa,QAAQ4X,OAAqB,YAAc,aAChD5T,EAAKhB,UAIP7D,KAAKa,QAAQihB,QAAU9hB,KAAKa,QAAQgyG,MACpC7yG,KAAKk0G,qBAAqBpO,GAC1B9lG,KAAKyzG,0BAEL,MAAMU,GAActvG,EAAKhB,SAAS4C,OAC9BzG,KAAKa,QAAQ+c,UAAY5d,KAAKa,QAAQq7F,QAAUiY,GACnDn0G,KAAKo0G,mBAGN5yG,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUuc,GAAkB,CAAE+D,MAAOnc,EAAQD,UACvEI,EAAAA,EAAAA,IAAQ1B,EAAU,CAACvD,KAAM6E,EAAMovG,EAAgBnvG,GAAQ,IACpDsK,IACHpP,KAAKk0G,qBAAqBpO,GAC1B73F,QAAQmB,MAAM,2BAA4BA,EAAM,GAElD,CAOA0kG,UAAAA,CAAWvwG,GACV,MAAMovB,EAAYpwB,EAAAA,EAAUC,KAAKxC,KAAKa,QAAQyD,SAAWtE,KAAKW,SAASyvB,WACjEtE,EAAQvpB,EAAAA,EAAUqf,QAAQ,IAAI5hB,KAAKa,QAAQ6+B,WAAY/M,GACvD4iC,EAAQv1D,KAAKa,QAAQihB,OACrB0zC,EAAMD,EAAQv1D,KAAKa,QAAQgyG,MAC3BwB,EAAWvoF,EAAMjK,MAAM0zC,EAAOC,GAEpC,GAAwB,IAApB6+C,EAASjmG,OAAc,QAEvBpO,KAAKgzG,kBAAqB,CAAC,SAAU,KAAKtnG,SAAS1L,KAAKW,SAAS4M,WAAavN,KAAK+yG,iBACtF/yG,KAAKW,SAASuzB,UAAW,EACzBl0B,KAAKW,SAASmD,UAAY9D,KAAKa,QAAQyG,OAAOkZ,MAG/C6zF,EAASjyG,SAAQ0N,IAChBA,EAAK3O,UAAUinB,QAAQuqF,GAAiBr2F,IACpCtc,KAAKa,QAAQiyG,UAChBhjG,EAAKiE,MAAM4xF,QAAU,EACrB11F,uBAAsB,KACrBH,EAAKiE,MAAMwD,WAAa,oBACxBzH,EAAKiE,MAAM4xF,QAAU,CAAC,IAExB,IAGD3lG,KAAKa,QAAQihB,OAAS0zC,EACtBx1D,KAAKyzG,0BAEL,MAAMvvD,EAAYp4B,EAAMjK,MAAM2zC,GAC1Bx1D,KAAKa,QAAQ+c,UAAY5d,KAAKa,QAAQq7F,QAA+B,IAArBh4C,EAAU91C,QAC7DpO,KAAKo0G,mBAGNp0G,KAAKk0G,qBAAqBl0G,KAAKa,QAAQyG,OAAO+X,OAC9Cpa,EAAAA,EAAAA,IAAQ1B,EAAU,CAACvD,KAAMA,KAAKW,UAC/B,CAOAuzG,oBAAAA,CAAqB70F,IACHrf,KAAKgzG,kBAA8C,WAA1BhzG,KAAKW,SAAS4M,WACvCvN,KAAK+yG,gBACrB/yG,KAAKW,SAASuzB,UAAW,EACzBl0B,KAAKW,SAASmD,UAAYub,EAE5B,CAMA+0F,gBAAAA,GACKp0G,KAAK+yG,eACR/yG,KAAKga,WAAWkC,aAChBlc,KAAKga,UAAY,MACPha,KAAKa,QAAQq7F,QAAUl8F,KAAKW,SAASyvB,YAC/CpwB,KAAKW,SAASW,QAEhB,CAMAe,OAAAA,GACCrC,KAAKga,WAAWkC,aAChBsC,MAAMnc,SACP,EAMDb,EAAAA,EAAaC,GAAG4L,SAAU,oBAAoB,KAC7C9K,EAAAA,EAAUqf,QA3XkB,qBA2XYxf,SAAQkP,KAC9CA,EAAG8C,QAAQkgG,aAAe1B,GAAW7qG,oBAAoBuJ,GAC1DA,EAAG8C,QAAQkgG,YAAc,MAAM,GAC9B,IAMH9yG,EAAAA,EAAaC,GAAG4L,SAAU+P,GArYG,+BAqY6C,SAAU9P,GACnF,CAAC,IAAK,QAAQ5B,SAAS1L,KAAKuN,UAAYD,EAAME,iBAC9ColG,GAAW7qG,oBAAoB/H,MAAMygB,QACtC,IAEA,MCxcA,GDwcA,GExbM5d,GAAW,SAMXyZ,GAAuB,OACvB6d,GAAuB,OACvBo6E,GAAuB,SAUvBz3F,GAAmB,GAAGja,UACtBka,GAAmB,GAAGla,YACtBma,GAAmB,GAAGna,UACtBoa,GAAmB,GAAGpa,WAEtBukC,GAA2B,aAAavkC,cACxCwkC,GAA2B,YAAYxkC,cACvCskC,GAAuB,SAAStkC,cAChCokC,GAAuB,SAASpkC,cAEtC,MAAM2xG,WAAcj2F,EAAAA,EACnBhe,WAAAA,CAAYC,EAASuC,EAAS,CAAC,GAC9Byb,MAAMhe,GAENR,KAAKa,QAAUb,KAAK8C,WAAWtC,GAASM,EAAAA,EAAAA,IAAgB,CACvD2zG,WAAY,KACZ92F,UAAW,aACX4pB,OAAO,EACPmtE,sBAAuB,CACtBv0G,QAAQ,EACRw0G,gBAAgB,GAEjBt2F,UAAW,CACVle,QAAQ,EACRuD,QAAS,KAEV+c,OAAQ,gCACRm0F,UAAW,CACVz0G,QAAQ,EACR00G,QAAQ,EACR34E,MAAO,GACPp1B,KAAM,KACNxC,OAAQ,gBAETmqD,UAAW,CACV++C,UAAWhoF,EAAAA,GACXsvF,WAAYtvF,EAAAA,KAEXziB,IAEH/C,KAAKgB,SAAW,CACf+zG,gBAAiB,0BACjBC,gBAAiB,0BACjBJ,UAAW,mBACXjiF,UAAW,mBACXjT,QAAS,iBACTgX,OAAQ,gBACRu+E,OAAQ,gBACRC,OAAQ,gBACR3tE,MAAO,eACP4tE,KAAM,cACNC,KAAM,cACNC,IAAK,aACLC,GAAI,YACJC,GAAI,YACJC,GAAI,YACJC,GAAI,YACJC,GAAI,aAGL11G,KAAK21G,YAAc,KACnB31G,KAAKinF,WAAa,IAAMjnF,KAAKgB,SAAS0e,SAEA,IAAlC1f,KAAKa,QAAQwd,UAAUle,SAC1BH,KAAKa,QAAQwd,UAAU3a,QAAU,IAGlC1D,KAAK41G,WAAa,IAAIznF,IACtBnuB,KAAK61G,iBAAmB,KACxB71G,KAAK81G,cAAgB91G,KAAK81G,cAAcn0G,KAAK3B,MAC7CA,KAAK+1G,cAAgB/1G,KAAK+1G,cAAcp0G,KAAK3B,KAC9C,CAEA,eAAWsI,GACV,MA7FW,KA8FZ,CAEA,mBAAWzF,GACV,OAAOA,EACR,CAEA,cAAIokF,GACH,OAAOjnF,KAAK21G,WACb,CAEA,cAAI1uB,CAAW31E,GACd,IAAIquB,EAAMp9B,EAAAA,EAAUC,KAAK8O,EAAItR,KAAKW,UAC7Bg/B,IACL3/B,KAAK21G,YAAch2E,EACpB,CAEArgB,KAAAA,GACC,IAAKtf,KAAKinF,WAAY,OAEtB,IAAIlkF,EAAS/C,KAAKa,QACjBwxB,EAAUryB,KAAKgB,SAiBhB,GAdAhB,KAAKW,SAASQ,UAAUC,IAAIixB,EAAQM,WACpC3yB,KAAKW,SAASQ,UAAUC,IAAI,UAAY2B,EAAO4a,WAE1C5a,EAAO6xG,UAAUC,OAOrB70G,KAAKW,SAASQ,UAAUC,IAAIixB,EAAQ2iF,iBAN/BjyG,EAAO0xG,YAEqB,IAAtB1xG,EAAO0xG,YACjBz0G,KAAKW,SAASQ,UAAUC,IAAI,UAAY2B,EAAO0xG,YAF/Cz0G,KAAKW,SAASQ,UAAUC,IAAIixB,EAAQ4iF,QASlClyG,EAAO6xG,UAAUz0G,SACAoC,EAAAA,EAAUC,KAAK,IAAM6vB,EAAQuiF,UAAW50G,KAAKW,UAE/C,CACjB,MAAMozG,EAAiBhxG,EAAO6xG,UAAUtwG,QAAU,eAClD,IAAI0xG,EAAiB,GACpBpB,EAAY,gBAAkBviF,EAAQuiF,UAAY,0DAE/C7xG,EAAO6xG,UAAU14E,QACpB85E,EAAiB,gBAAkB3jF,EAAQuiF,UAAY,YAAc7xG,EAAO6xG,UAAU14E,MAAQ,WAGjE,OAA1Bn5B,EAAO6xG,UAAU9tG,OACpB8tG,EAAY7xG,EAAO6xG,UAAU9tG,MAG9B,IAAIokB,EAAI7d,SAAS2K,cAAc,KAC/BkT,EAAE/pB,UAAUC,IAAIixB,EAAQuiF,WACxBjtF,EAAAA,EAAY/kB,IAAIsoB,EAAG,iBAAkB,WACrCvD,EAAAA,EAAY/kB,IAAIsoB,EAAG,OAAQ6oF,GAC3B7oF,EAAEpnB,UAAYkyG,EAAiBpB,EAE/B50G,KAAKW,SAAS8X,OAAOyS,EACtB,CAID,GAAInoB,EAAO0d,OAAQ,CAClB,IAAIw1F,EAAc,IAAI1zG,EAAAA,EAAUqf,QAAQ,gBAAiB5hB,KAAKW,WAC7D8f,EAAS,wBAA0B1d,EAAO0d,OAAS,UAEhDw1F,EAAY7nG,QACf6nG,EAAY7zG,SAAQ,SAAU6gC,GACxBA,EAAK17B,cAAc,YAAe07B,EAAKt1B,QAAQ,WACnDs1B,EAAKvzB,aAAa,gBAAiB,SACnCuzB,EAAKz7B,mBAAmB,YAAaiZ,GAEvC,GAEF,CAEI,cAAezgB,KAAKa,QAAQ4tD,YAC/BxpD,EAAAA,EAAAA,IAAQjF,KAAKa,QAAQ4tD,UAAU++C,UAAW,CAACxtG,MAE7C,CAEAwgB,IAAAA,CAAKE,GACJ,IAAIpc,EAASoc,EAAcA,cAE3B,IAAKpc,IAAUmJ,EAAAA,EAAAA,IAAWnJ,GAAS,OAOnC,GALKA,EAAOqJ,QAAQ,sBACnBrJ,EAAOnD,UAAUC,IAAI,SAGJI,EAAAA,EAAawf,QAAQ1c,EAAQ0Y,GAAgB,CAAE0D,kBACnD/E,iBAAkB,OAEhC,IAAI2pB,EAAO/iC,EAAAA,EAAUC,KAAK,oBAAqB8B,GAC9Cg/E,EAAOh/E,EAAO6b,kBAEXmjE,GAAMA,EAAK5zE,aAAa,gBAAiB,QAC7C41B,EAAKnkC,UAAUC,IAAIkb,IACnBhY,EAAOnD,UAAUC,IAAImzG,IAErB,MAAM2B,EAAa,IAAInuE,GAAU,CAChC1C,UAAW/gC,EACXghC,KAAMA,EACN3nB,UAAW,eACX+nB,mBAAoB,CAAC,YAAa,aAAc,WAChD5jB,OAAQ,CAAC,EAAG,GACZyjB,SAAU,kBACVC,UAAU,EACVC,oBAAoB,IAGrBywE,EAAWh1F,gBAEXlhB,KAAK41G,WAAWhzG,IAAI0iC,EAAM,CACzBD,UAAW/gC,EACXqZ,UAAWu4F,EACXC,cAAen2G,KAAK81G,cACpBM,cAAep2G,KAAK+1G,gBAGrB1gG,OAAOzF,iBAAiB,SAAU5P,KAAK81G,cAAe,CAAElnE,SAAS,EAAMynE,SAAS,IAChFhhG,OAAOzF,iBAAiB,SAAU5P,KAAK+1G,eAMvC/1G,KAAKyH,gBAJoB0Z,KACxBmkB,EAAKnkC,UAAUC,IAAI+4B,IACnB34B,EAAAA,EAAawf,QAAQ1c,EAAQ2Y,GAAiByD,EAAc,GAEvB4kB,GAAM,EAAM,GACnD,CAEA1kB,IAAAA,CAAKF,GACJ,MAAM0tF,EAAQpuG,KACd,GAAI,iBAAkBqN,SAASulB,gBAC9B,IAAK,MAAMpyB,IAAW,GAAGs0B,UAAUznB,SAASvG,KAAKq+B,UAChD3jC,EAAAA,EAAac,IAAI9B,EAAS,YAAaglB,EAAAA,IAIzC,IAAIhlB,EAAUkgB,EAAcA,cAM5B,GAJI,QAASA,GAAiBA,EAAcif,MAC3Cn/B,EAAUkgB,EAAcif,KAGrBn/B,EAAS,CAEZ,GADkBgB,EAAAA,EAAawf,QAAQxgB,EAASsc,IAClCnB,iBAAkB,OAEhCnb,EAAQW,UAAUG,OAAOizG,IAErB/zG,EAAQW,UAAUE,SAAS,UAC9Bb,EAAQW,UAAUG,OAAO,SAG1B,IAAIiB,EAAAA,EAAUqf,QAAQ,IAAMtF,GAAiB9b,IAAU4B,SAAQ,SAAUkP,EAAI4Q,GAC5E5Q,EAAGnQ,UAAUG,OAAO64B,IAEpB,IAAI3G,EAASliB,EAAG3D,QAAQ,aACpB6lB,EAAOryB,UAAUE,SAASkzG,KAC7B/gF,EAAOryB,UAAUG,OAAOizG,IAGzB,IAAIjxB,EAAOhyE,EAAGyiB,uBAGd,GAFIuvD,GAAMA,EAAK5zE,aAAa,gBAAiB,SAE/B,IAAVwS,EAAa,CAChB,MAAMX,EAAmBA,KACxBjQ,EAAGnQ,UAAUG,OAAOgb,IACpB9a,EAAAA,EAAawf,QAAQ1P,EAAIyL,GAAkB2D,EAAc,EAG1D0tF,EAAM3mG,eAAe8Z,EAAkBjQ,GAAI,EAAM,IAClD,CAEA,MAAMglG,EAAWlI,EAAMwH,WAAW3yG,IAAIqO,GAClCglG,IACHjhG,OAAO3D,oBAAoB,SAAU4kG,EAASH,cAAe,CAAEE,SAAS,IACxEhhG,OAAO3D,oBAAoB,SAAU4kG,EAASF,eAC9ChI,EAAMwH,WAAWlwG,OAAO4L,GAE1B,GACD,CACD,CAEAwkG,aAAAA,GACC,IAAK,MAAOxwE,EAAMzgC,KAAS7E,KAAK41G,WAAWprF,UAC1C,GAA0B,OAAtB8a,EAAKixE,cAOT,GAFA1xG,EAAK8Y,UAAUuD,iBAEVlhB,KAAKw2G,qBAAqBlxE,GAAO,CACrC,MAAMhhC,EAASO,EAAKwgC,UACpBrlC,KAAK4gB,KAAK,CAAEF,cAAepc,GAC5B,OATCtE,KAAKy2G,aAAanxE,EAWrB,CAEAywE,aAAAA,GACC,IAAK,MAAOzwE,EAAMzgC,KAAS7E,KAAK41G,WAAWprF,UAChB,OAAtB8a,EAAKixE,cACT1xG,EAAK8Y,UAAUuD,eAEjB,CAEAu1F,YAAAA,CAAanxE,GACZ,MAAMgxE,EAAWt2G,KAAK41G,WAAW3yG,IAAIqiC,GACjCgxE,IACHjhG,OAAO3D,oBAAoB,SAAU4kG,EAASH,cAAe,CAAEE,SAAS,IACxEhhG,OAAO3D,oBAAoB,SAAU4kG,EAASF,eAC9Cp2G,KAAK41G,WAAWlwG,OAAO4/B,GAEzB,CAEAkxE,oBAAAA,CAAqBllG,GACpB,MAAMjB,EAAOiB,EAAGhB,wBACVomG,EAAarhG,OAAOG,aAAenI,SAASulB,gBAAgB3Q,aAC5D00F,EAAYthG,OAAOC,YAAcjI,SAASulB,gBAAgByG,YAE1Du9E,EAAcvmG,EAAKK,KAAOgmG,GAAiBrmG,EAAKK,IAAML,EAAKG,QAAW,EACtEqmG,EAAaxmG,EAAK0E,MAAQ4hG,GAAgBtmG,EAAK0E,KAAO1E,EAAKoE,OAAU,EAE3E,OAAOmiG,GAAcC,CACtB,CAEAC,sBAAAA,CAAuBxpG,GACjBA,GAAkC,iBAAlBA,EAAM2I,SAAiD,iBAAlB3I,EAAMmD,UAChEzQ,KAAK61G,iBAAmB,CACvBkB,EAAGzpG,EAAM2I,QACT+gG,EAAG1pG,EAAMmD,SAEX,CAEAwmG,wBAAAA,CAAyB3pG,GACxB,IAAKtN,KAAK61G,mBAAqBvoG,EAAO,OAAO,EAE7C,MAAM4pG,EAAK5pG,EAAM2I,QAAUjW,KAAK61G,iBAAiBkB,EAC3CI,EAAK7pG,EAAMmD,QAAUzQ,KAAK61G,iBAAiBmB,EAEjD,OAAO7hG,KAAKuG,IAAIw7F,GAAM/hG,KAAKuG,IAAIy7F,IAAOhiG,KAAKuG,IAAIw7F,GAAM,CACtD,CAEAE,qBAAAA,CAAsB9xE,GACrB,QAASA,IAASA,EAAK33B,QAAQ,oBAChC,CAEA0pG,yBAAAA,CAA0B/xE,GACzB,SAAKA,IAASA,EAAKH,WACZ,IAAIG,EAAKH,UAAUlN,MAAM5O,GAAUA,EAAMloB,WAAakoB,EAAMloB,UAAUE,SAAS,qBACvF,CAEAi2G,mBAAAA,CAAoBhyE,EAAMiyE,GACzB,SAAKjyE,IAASiyE,GACVjyE,EAAK7R,gBAAkB8jF,EAAY9jF,eAChC6R,EAAKvR,yBAA2BwjF,GAAejyE,EAAK1R,qBAAuB2jF,EACnF,CAEAC,0BAAAA,CAA2BlqG,EAAOmqG,EAAaF,GAC9C,MAAMG,EAAe13G,KAAKa,QAAQ6zG,uBAAyB,CAAC,EAC5D,SAAKgD,EAAav3G,SACbs3G,IAAgBF,GAAeE,IAAgBF,IAC/Cv3G,KAAKo3G,sBAAsBK,KAAiBz3G,KAAKo3G,sBAAsBG,KACvEv3G,KAAKq3G,0BAA0BI,KAAiBz3G,KAAKq3G,0BAA0BE,KAC/Ev3G,KAAKs3G,oBAAoBG,EAAaF,IACvCG,EAAa/C,iBAAmB30G,KAAKi3G,yBAAyB3pG,GAGnE,CAEA,WAAOpF,CAAK1H,EAASuC,EAAS,CAAC,GAC9B,MAAMwd,EAAWi0F,GAAMzsG,oBAAoBvH,EAASuC,GACpDwd,EAASjB,QAET,IAAIq4F,EAAQp1G,EAAAA,EAAUqf,QAAQ,YAAarB,EAAS0mE,YAEhD1mE,EAAS1f,QAAQ0mC,SAAUrQ,EAAAA,EAAAA,QAC9B11B,EAAAA,EAAaC,GAAG8e,EAAS0mE,WAAY,aAAapkF,eAAqB,SAAUyK,GAChFiT,EAASu2F,uBAAuBxpG,EACjC,IAEA,IAAIqqG,GAAOv1G,SAAQ,SAAUkP,GAC5B,IAAI02B,EAAc,KAElBxmC,EAAAA,EAAaC,GAAG6P,EAAI81B,IAA0B,SAAU95B,GACvD,GAAI06B,EAAa,OAEjB,IAAI1jC,EAASgJ,EAAMhJ,OAAOqJ,QAAQ,aAClC,IAAKrJ,EAAQ,OAEb,IAAKic,EAAS0mE,WAAW5lF,SAASiD,GAAS,OAC3C0jC,EAAc1jC,EAEd,MAAMszG,EAAetqG,EAAMoT,eAAe/S,QAAQ,aAC5CkqG,EAAkBt3F,EAASi3F,2BAA2BlqG,EAAOhJ,EAAQszG,GAEtEC,GACJrD,GAAMsD,cAAcxqG,GAGrB,IAAIoT,EAAgB,CACnBA,cAAepc,GAGhBic,EAASC,KAAKE,GAEVm3F,GAAmBD,GAAgBA,EAAaz2G,UAAUE,SAASkzG,KACtEh0F,EAASK,KAAK,CAAEF,cAAek3F,IAGhCr3F,EAASu2F,uBAAuBxpG,EACjC,IAEA9L,EAAAA,EAAaC,GAAG6P,EAAI+1B,IAAyB,SAAU/5B,GACtD,IAAK06B,EAAa,OAElB,IAAI+vE,EAAWzqG,EAAMoT,eAAe/S,QAAQ,aAC3C+S,EAAgBq3F,EAChBp4E,EAAMqI,EAEP,KAAOtnB,GAAe,CACrB,GAAIA,IAAkBsnB,EAAa,OACnCtnB,EAAgBA,EAAc0P,UAC/B,CAEA,GAAI7P,EAASi3F,2BAA2BlqG,EAAOqyB,EAAKo4E,GAGnD,OAFA/vE,EAAc,UACdznB,EAASu2F,uBAAuBxpG,GAIjC06B,EAAc,KACdznB,EAASK,KAAK,CAAEF,cAAeA,EAAeif,IAAKA,IACnDpf,EAASu2F,uBAAuBxpG,EACjC,GACD,KAGD,MAAM0qG,EAAe3qG,SAAS9F,cAAcgZ,EAAS1f,QAAQ+zG,UAAUtwG,QAAU,gBACjF,IAAIswG,EAAYr0F,EAAS5f,SAAS4G,cAAc,IAAMgZ,EAASvf,SAAS4zG,WAEpEoD,GAAgBpD,IACnBoD,EAAapoG,iBAAiB,mBAAmB,WAChDglG,EAAUzzG,UAAUC,IAAImf,EAASvf,SAAS+zG,gBAC3C,IAEAiD,EAAapoG,iBAAiB,mBAAmB,WAChDglG,EAAUzzG,UAAUG,OAAOif,EAASvf,SAAS+zG,gBAC9C,IAEF,CAEA,iBAAO5sE,CAAW76B,GACI,IAAjBA,EAAMhG,QAAgC,UAAfgG,EAAMtB,MAAkC,QAAdsB,EAAM7M,KAI3D+zG,GAAMsD,cAAcxqG,EACrB,CAEA,oBAAOwqG,CAAcxqG,GACpB,IAAI/K,EAAAA,EAAUqf,QAAQ,mDAAmDxf,SAASkP,IACjF,IAAIhN,EAASgJ,EAAMhJ,OAGnB,GAAIgN,IAFIhN,EAAOqJ,QAAQ,aAEN,CAChB,MAAMsqG,EAAM3mG,EAAG3D,QAAQ,WACjBo0B,EAAUyyE,GAAM1sG,YAAYmwG,GAClC,IAAKl2E,EAAS,OAEd,IAAIm2E,IAAYD,EAAI1wG,cAAc,UACjC4wG,IAAgB7zG,EAAOqJ,QAAQ,qBAEhC,GAAIuqG,GAAWC,EACd,OAGD,MAAMz3F,EAAgB,CAAEA,cAAepP,GAEvCywB,EAAQnhB,KAAKF,EACd,IAEF,EAGDlf,EAAAA,EAAaC,GAAG4L,SAAU45B,GAAsButE,GAAMrsE,YACtD3mC,EAAAA,EAAaC,GAAG4L,SAAU85B,GAAsBqtE,GAAMrsE,YACtD3mC,EAAAA,EAAaC,GAAG4L,SAAU85B,GAtdG,aAsdyC,SAAU75B,GAC/E,IAAKqa,EAAAA,EAAYmB,IAAI9oB,KAAM,iBAC1B,OAGD,IAAIi4G,EAAMj4G,KAAK2N,QAAQ,WACvB,MAAM4S,EAAWi0F,GAAMzsG,oBAAoBkwG,GAM3C,GAJI,eAAgB13F,EAAS1f,QAAQ4tD,YACpCxpD,EAAAA,EAAAA,IAAQsb,EAAS1f,QAAQ4tD,UAAUqmD,WAAY,CAACv0F,EAAUjT,EAAOtN,OAG9DugB,EAAS1f,QAAQ0mC,SAAUrQ,EAAAA,EAAAA,MAAkB,OAEjD5pB,EAAME,iBAEN,IAAI83B,EAAOtlC,KAAKowB,WAChB,IAAKkV,EAAM,OAEX,IAAI73B,EAAAA,EAAAA,IAAW63B,MAAUnR,EAAAA,EAAAA,IAAUmR,GAClC,OAGD,IAAI4yE,IAAYD,EAAI1wG,cAAc,UAGlC,GAFiBvH,KAAK2N,QAAQ,sBAEXuqG,GAClB,GAAI5yE,EAAKnkC,UAAUE,SAAS,UAE3B,YADAkf,EAASK,KAAK,CAAEF,cAAe4kB,QAIhC,IAAI/iC,EAAAA,EAAUqf,QAAQ,UAAWq2F,IAAM71G,SAAQ,SAAUkP,GACxDiP,EAASK,KAAK,CAAEF,cAAepP,GAChC,IAGDiP,EAASC,KAAK,CAAEE,cAAe4kB,GAChC,IAEA,MC3hBA,GD2hBA,iBEphBA,MAAMh9B,GAAO,WACPzF,GAAW,cAIXu1G,GAAsB,cAEtBC,GAAoB,0BAIpBC,GAAc,oBACdC,GAAe,qBACfC,GAAoB,0BACpBC,GAAwB,8BACxBC,GAAoB,iBACpBC,GAAoB,iBAGpBC,GAAkB,GAAG/1G,WACrBg2G,GAAmB,GAAGh2G,YACtBi2G,GAAgB,GAAGj2G,SACnBk2G,GAAiB,GAAGl2G,UACpBm2G,GAAiB,GAAGn2G,UACpBo2G,GAAoB,GAAGp2G,aACvBq2G,GAAyB,GAAGr2G,iBAC5Bs2G,GAAiB,GAAGt2G,UACpBu2G,GAAiB,GAAGv2G,UACpBw2G,GAAqB,GAAGx2G,cACxBy2G,GAA6B,GAAGz2G,qBAChC02G,GAAoB,GAAG12G,aAE7B,MAAM22G,WAAmBj7F,EAAAA,EACxBb,eAAiB,IAAIyQ,IAErB5tB,WAAAA,CAAYC,EAASuC,EAAS,CAAC,GAC9Byb,MAAMhe,EAASuC,GAEf/C,KAAKa,QAAUb,KAAK8C,WAAWtC,GAASM,EAAAA,EAAAA,IAAgB,CACvD24G,aAAc,oBACdC,aAAc,oBACdC,eAAgB,sBAChBC,YAAa,UACbC,eAAgB,mBAChBC,WAAY,GACZC,OAAQ,GACRC,SAAU,EACVC,SAAU,UACVC,eAAgB,EAChBC,wBAAyB,EACzBC,iBAAiB,EACjBluE,MAAO,GACPmuE,SAAS,EACT7H,OAAQ,KACRrC,SAAU,CACT1hE,SAAS,EACT9nB,MAAM,EACN2zF,UAAUjzG,EAAAA,EAAAA,GAAO,QACjBkzG,UAAUlzG,EAAAA,EAAAA,GAAO,UAElBonD,UAAW,CACVvmD,KAAM,KACNivD,QAAS,KACTqjD,YAAa,KACbjlD,MAAO,KACPklD,KAAM,KACNC,gBAAiB,KACjBp1E,KAAM,KACNq1E,SAAU,KACVxjB,OAAQ,KACR3hC,IAAK,KACLolD,KAAM,KACNnpG,QAAS,MAEV9N,KAAM,CACLS,MAAO,GACPC,OAAQ,OACR2nC,MAAO,QACPnnC,KAAM,CAAC,EACPN,QAAQ,EACRQ,MAAM,EACNP,QAAQ,EACRd,QAAS,IAERX,IAEH/C,KAAK66G,UAAY76G,KAAK86G,mBACtB96G,KAAK2O,aAAe,KACpB3O,KAAK+6G,aAAe,KACpB/6G,KAAKg7G,aAAe,KACpBh7G,KAAKi7G,WAAa,KAClBj7G,KAAKwS,aAAc,EACnBxS,KAAKk7G,eAAiB,GACtBl7G,KAAKm7G,gBAAkBn7G,KACvBA,KAAKo7G,kBAAoBp7G,KACzBA,KAAKq7G,gBAAkB,KAEvBr7G,KAAKs7G,OAAS,CACbtqE,OAAQ,EACRC,OAAQ,EACRsqE,WAAY,EACZC,YAAa,EACbC,YAAa,EACb1E,EAAG,EACHC,EAAG,GAGJh3G,KAAK07G,oBAAsB,GAE3B17G,KAAK27G,kBAAoB37G,KAAK47G,aAAaj6G,KAAK3B,MAChDA,KAAK67G,kBAAoB77G,KAAK87G,aAAan6G,KAAK3B,MAChDA,KAAK+7G,gBAAkB/7G,KAAKg8G,WAAWr6G,KAAK3B,MAC5CA,KAAKi8G,oBAAsBj8G,KAAK0T,eAAe/R,KAAK3B,MACpDA,KAAKk8G,oBAAsBl8G,KAAKwT,eAAe7R,KAAK3B,MACpDA,KAAKm8G,kBAAoBn8G,KAAKyT,aAAa9R,KAAK3B,MAChDA,KAAKo8G,sBAAwBp8G,KAAKq8G,iBAAiB16G,KAAK3B,MACxDA,KAAKs8G,mBAAqBt8G,KAAKu8G,cAAc56G,KAAK3B,MAClDA,KAAKw8G,kBAAoBx8G,KAAKy8G,aAAa96G,KAAK3B,MAChDA,KAAK08G,iBAAmB18G,KAAK28G,YAAYh7G,KAAK3B,MAC9CA,KAAK48G,oBAAsB58G,KAAK68G,eAAel7G,KAAK3B,MACpDA,KAAK88G,gBAAkB98G,KAAKsmF,WAAW3kF,KAAK3B,MAC5CA,KAAK+8G,uBAA2C,oBAAX1nG,QAA0B,iBAAkBA,OACjFrV,KAAKg9G,iBAAmB,KACxBh9G,KAAKi9G,eAAiB,KACtBj9G,KAAKk9G,qBAAuB,KAC5Bl9G,KAAKm9G,uBAAyB,GAC9Bn9G,KAAK8pD,YAAc,KAEd9pD,KAAK66G,YAIV76G,KAAKo9G,iBACLp9G,KAAKm3D,UACLn3D,KAAK6pD,oBACL7pD,KAAK+xD,cACL/xD,KAAKy7D,MAAM,OAAQ,CAClBl3C,QAASvkB,KAAKq9G,cAEhB,CAEA,eAAW/0G,GACV,OAAOA,EACR,CAEA,mBAAWzF,GACV,OAAOA,EACR,CAEAy6G,YAAAA,CAAa9xF,GACZ,OAAQA,GACR,IAAK,OACJ,OAAOwtF,GACR,IAAK,UACJ,OAAOC,GACR,IAAK,cACJ,OAAOC,GACR,IAAK,QACJ,OAAON,GACR,IAAK,OACJ,OAAOO,GACR,IAAK,kBACJ,OAAOG,GACR,IAAK,OACJ,OAAOF,GACR,IAAK,WACJ,OAAOC,GACR,IAAK,SACJ,OAAOR,GACR,IAAK,MACJ,OAAOC,GACR,IAAK,OACJ,OAAOC,GACR,IAAK,UACJ,OAAOQ,GACR,QACC,MAAO,GAAG12G,MAAY2oB,IAExB,CAEAiwC,KAAAA,CAAMjwC,EAAQoG,EAAS,CAAC,GACvB,MAAMrN,EAAU,CACfiH,SACAjL,SAAUvgB,QACP4xB,GAGJpwB,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUX,KAAKs9G,aAAa9xF,GAASjH,GAE/D,MAAMhhB,EAAWvD,KAAKa,SAAS4tD,YAAYjjC,GAC3C,GAAwB,mBAAbjoB,EACV,IACCA,EAASghB,EACV,CAAE,MAAOnV,GAERnB,QAAQmB,MAAM,IAAI9G,iBAAmBkjB,YAAkBpc,EACxD,CAGD,OAAOmV,CACR,CAEAg5F,aAAAA,GACC,MAAM5xG,EAAO3L,KAAKa,SAASqrC,MAC3B,OAAIvgC,QAA4C,GACzCnF,OAAOmF,GAAMlF,MACrB,CAEA22G,cAAAA,GACC,MAAMlxE,EAAQlsC,KAAKu9G,gBACdrxE,IAEAstE,GAAWgE,QAAQ10F,IAAIojB,IAC3BstE,GAAWgE,QAAQ56G,IAAIspC,EAAO,IAAIn7B,KAGnCyoG,GAAWgE,QAAQv6G,IAAIipC,GAAO9qC,IAAIpB,MACnC,CAEAy9G,gBAAAA,GACC,MAAMvxE,EAAQlsC,KAAKu9G,gBACnB,IAAKrxE,IAAUstE,GAAWgE,QAAQ10F,IAAIojB,GAAQ,OAE9C,MAAMtpC,EAAM42G,GAAWgE,QAAQv6G,IAAIipC,GACnCtpC,EAAI8C,OAAO1F,MACN4C,EAAI2rB,MACRirF,GAAWgE,QAAQ93G,OAAOwmC,EAE5B,CAEAwxE,sBAAAA,GACC,IAAK19G,KAAKa,QAAQw5G,QAAS,MAAO,CAACr6G,MAEnC,MAAMksC,EAAQlsC,KAAKu9G,gBACnB,OAAKrxE,GAAUstE,GAAWgE,QAAQ10F,IAAIojB,GAE/B96B,MAAMC,KAAKmoG,GAAWgE,QAAQv6G,IAAIipC,IAAQjqC,QAC/Cse,GAAaA,GAAYA,EAASs6F,YAHiB,CAAC76G,KAKvD,CAEA29G,2BAAAA,CAA4Bn9G,GAC3B,OAAKA,GACER,KAAK09G,yBAAyBl7G,MACnC+d,GAAaA,EAASs6F,WAAat6F,EAASs6F,UAAUx5G,SAASb,MAF5C,IAItB,CAEAo9G,cAAAA,CAAe9tG,EAAM+tG,GACpB,MAAMrL,EAASxyG,KAAKa,SAAS2xG,OAC7B,GAAsB,mBAAXA,EAAuB,OAAO,EACzC,IACC,QAASA,EAAO1iG,EAAM+tG,EAAgB79G,KACvC,CAAE,MAAOoP,GAER,OADAnB,QAAQmB,MAAM,IAAI9G,sBAAyB8G,IACpC,CACR,CACD,CAEA+nD,OAAAA,GACCn3D,KAAK89G,YAAY17G,SAAS0N,IACzB,MAAMhC,EAAS9N,KAAK+9G,kBAAkBjuG,GAElChC,IACHA,EAAOiG,MAAMiH,OAAS,OACtBlN,EAAOiG,MAAME,WAAa,OAC1BnG,EAAOiG,MAAMC,YAAc,OAEtB,CAAC,SAAU,IAAK,SAAStI,SAASoC,EAAOP,UAC7CO,EAAO4B,aAAa,OAAQ,UAExB5B,EAAOokB,aAAa,aACxBpkB,EAAO4B,aAAa,WAAY,KAE5B5B,EAAOokB,aAAa,eACxBpkB,EAAO4B,aAAa,aAAc,cAIpC1P,KAAKg+G,kBAAkBluG,EAAK,IAG7B9P,KAAKy7D,MAAM,UAAW,CACrB3vC,MAAO9rB,KAAK89G,YAAY1vG,QAE1B,CAEA4vG,iBAAAA,CAAkBluG,GACjB,IAAKA,IAAS9P,KAAKa,QAAQsvG,UAAU1hE,QACpC,OAGD,MAAMwvE,EAAQj+G,KAAKk+G,0BAA0BpuG,EAAM,IAAIwoG,MACjDxqG,EAASmwG,EAAQj+G,KAAKk+G,0BAA0BD,EAAO,IAAI1F,MAAkB,KAC7E4F,EAAYn+G,KAAKk+G,0BAA0BpuG,EAAM9P,KAAKa,QAAQ44G,cACpE,IAAIh5F,EAASw9F,EAAQj+G,KAAKk+G,0BAA0BD,EAAO,IAAIxF,MAA2B,KAE1F,IAAKwF,IAAUE,EAId,YAHI19F,GACHA,EAAOnf,UAKJ68G,EAAU3sG,KACd2sG,EAAU3sG,GAAK,wBAAwB2D,KAAK6gB,SAAS5R,SAAS,IAAIvC,MAAM,EAAG,OAG5E,MAAMu8F,EAAmBD,EAAUh9G,UAAUE,SAAS,eACtD88G,EAAUh9G,UAAUC,IAAI,eACnBg9G,IACAp+G,KAAKa,QAAQsvG,SAASxpF,KACzBw3F,EAAUh9G,UAAUC,IAAI,QAExB+8G,EAAUh9G,UAAUG,OAAO,SAIxBmf,EASM3S,GAAU2S,EAAOsT,yBAA2BjmB,GACtDmwG,EAAMttG,aAAa8P,EAAQ3S,EAAO8C,cATlC6P,EAASpT,SAAS2K,cAAc,UAChCyI,EAAOzU,KAAO,SACdyU,EAAOqC,UAAY21F,GACf3qG,EACHmwG,EAAMttG,aAAa8P,EAAQ3S,EAAO8C,aAElCqtG,EAAMttG,aAAa8P,EAAQw9F,EAAMllD,aAMnCt4C,EAAO/Q,aAAa,iBAAkB,YACtC+Q,EAAO/Q,aAAa,iBAAkB,IAAIyuG,EAAU3sG,MACpDiP,EAAO/Q,aAAa,gBAAiByuG,EAAU3sG,IAC/C,MAAM6sG,EAAet+F,GAAAA,EAAAA,iBAA0B/f,KAAKa,QAAQsvG,SAASmK,WAAYjzG,EAAAA,EAAAA,GAAO,YAClFi3G,EAAev+F,GAAAA,EAAAA,iBAA0B/f,KAAKa,QAAQsvG,SAASoK,WAAYlzG,EAAAA,EAAAA,GAAO,YACxFoZ,EAAO/Q,aAAa,iBAAkB2uG,GACtC59F,EAAO/Q,aAAa,iBAAkB4uG,GAEtC,MAAMr5E,EAASk5E,EAAUh9G,UAAUE,SAAS,QAC5Cof,EAAO/Q,aAAa,gBAAiBu1B,EAAS,OAAS,SACvDxkB,EAAO3c,UAAYmhC,EAASq5E,EAAeD,EAE3Cn6E,GAAWn8B,oBAAoBo2G,EAAW,CAAE19F,QAAQ,GACrD,CAEAs9F,iBAAAA,CAAkBjuG,GACjB,IAAKA,IAAS9P,KAAKa,QAAQ84G,eAC1B,OAAO,KAGR,MAAMsE,EAAQj+G,KAAKu+G,mBAAmBzuG,GACtC,IAAIhC,EAAS9N,KAAKk+G,0BAA0BD,EAAOj+G,KAAKa,QAAQ84G,gBAEhE,IAAK7rG,EAAQ,CACZ,MAAM0wG,EAAYptG,MAAMC,KAAKvB,EAAKN,iBAAiBxP,KAAKa,QAAQ84G,iBAAiBn3G,MAC/E8lB,GAASA,EAAK3a,QAAQ3N,KAAKa,QAAQ64G,gBAAkB5pG,IAGnD0uG,IACH1wG,EAAS0wG,EAEX,CAEA,IAAK1wG,EAAQ,CACZ,GAAI9N,KAAKa,QAAQ84G,iBAAmB,IAAIpB,KACvC,OAAO,KAGRzqG,EAAST,SAAS2K,cAAc,OAChClK,EAAO3M,UAAUC,IAAIm3G,GACtB,CAMA,GAJIzqG,EAAO2lB,gBAAkBwqF,GAASnwG,IAAWmwG,EAAM99F,mBACtD89F,EAAMttG,aAAa7C,EAAQmwG,EAAMllD,aAG7BjrD,EAAOvG,cAAc,aAAaixG,MAAsB,CAC5D,MAAM34F,EAAOxS,SAAS2K,cAAc,QACpC6H,EAAKiD,UAAY01F,GACjB34F,EAAKnQ,aAAa,cAAe,QACjCmQ,EAAK/b,UAAYic,GAAAA,EAAAA,iBAA0B/f,KAAKa,QAAQi5G,aAAczyG,EAAAA,EAAAA,GAAO,sBAAwB,OACrGyG,EAAOitD,QAAQl7C,EAChB,CAEA,OAAO/R,CACR,CAEAywG,kBAAAA,CAAmBzuG,GAClB,IAAImuG,EAAQj+G,KAAKk+G,0BAA0BpuG,EAAM,IAAIwoG,MACrD,MAAM6F,EAAYn+G,KAAKk+G,0BAA0BpuG,EAAM9P,KAAKa,QAAQ44G,cAqBpE,OAnBKwE,IACJA,EAAQ5wG,SAAS2K,cAAc,OAC/BimG,EAAMn7F,UAAYw1F,GAClBxoG,EAAKa,aAAastG,EAAOE,GAAaruG,EAAKipD,aAGxB3nD,MAAMC,KAAKvB,EAAKsZ,YAAYnnB,QAAQqmB,GACnDA,IAAS21F,KAGJ31F,EAAKG,WAAaC,KAAKG,cAAgBP,EAAKuL,QAAQ7zB,KAAKa,QAAQ44G,iBAG/Dr3G,SAASkmB,GAAS21F,EAAMxlG,OAAO6P,KAEvC21F,EAAMxqF,gBAAkB3jB,GAC3BA,EAAKa,aAAastG,EAAOE,GAAaruG,EAAKipD,YAGrCklD,CACR,CAEAC,yBAAAA,CAA0B1qF,EAAQ5hB,GACjC,OAAK4hB,GAAW5hB,GAITR,MAAMC,KAAKmiB,EAAO2R,UAAU3iC,MAAM6mB,GAAUA,EAAMwK,QAAQjiB,MAHzD,IAIT,CAEAyrG,SAAAA,GACC,OAAKr9G,KAAK66G,UAIH76G,KAAKy+G,eAAez+G,KAAK66G,WAHxB,EAIT,CAEAD,IAAAA,GACC,MAAMr2F,EAAUvkB,KAAKq9G,YACfj5G,EAAQpE,KAAKa,QAAQ8C,MAAMS,MAEjC,OAAKA,GAKLpE,KAAKy7D,MAAM,OAAQ,CAAEl3C,UAASzf,OAAQ,UAE/B,IAAIshB,SAAQ,CAACuU,EAAStU,KAC5B,MAAMq4F,EAAa1+G,KAAKa,QAAQ8C,MAAQ,CAAC,EACnCqoC,EAAQ0yE,EAAW1yE,OAAS,QAC5B3nC,EAASmC,OAAOk4G,EAAWr6G,QAAU,QAAQmB,cAC7C9B,EAAUmR,OAAO6pG,EAAWh7G,SAAW,GACvCmB,GAAO/D,EAAAA,EAAAA,IAAgB49G,EAAW75G,MAAQ,CAAC,EAAG,CACnD,CAACmnC,GAAQznB,IAEJ5gB,EAAO,IAAIuB,GAAAA,EACXupD,EAAY,CACjBrpD,UAAYvB,IACX7D,KAAKy7D,MAAM,OAAQ,CAClBl3C,UACAzf,OAAQ,UACRjB,aAED82B,EAAQ92B,EAAS,EAElBwB,QAAU+J,IACTpP,KAAKy7D,MAAM,OAAQ,CAClBl3C,UACAzf,OAAQ,QACRsK,UAEDiX,EAAOjX,EAAM,GAIf7J,YAAW,KACV,OAAQlB,GACR,IAAK,MACJV,EAAKV,IAAImB,EAAOqqD,GAChB,MACD,IAAK,SACJ9qD,EAAK+B,OAAOtB,EAAOqqD,GACnB,MACD,QACC9qD,EAAK8B,KAAKrB,EAAOS,EAAM4pD,GAExB,GACE/qD,EAAQ,MA9CX1D,KAAKy7D,MAAM,OAAQ,CAAEl3C,UAASzf,OAAQ,YAC/BshB,QAAQuU,QAAQpW,GA+CzB,CAEAliB,OAAAA,GACKrC,KAAK66G,YACJ76G,KAAK+8G,uBACR/8G,KAAK66G,UAAUnpG,oBAAoB,cAAe1R,KAAKi8G,sBAEvDj8G,KAAK66G,UAAUnpG,oBAAoB,YAAa1R,KAAK27G,mBACrD37G,KAAK66G,UAAUnpG,oBAAoB,aAAc1R,KAAKs8G,qBAEvDt8G,KAAK66G,UAAUnpG,oBAAoB,UAAW1R,KAAK88G,kBAGpDzvG,SAASqE,oBAAoB,YAAa1R,KAAK67G,mBAC/CxuG,SAASqE,oBAAoB,UAAW1R,KAAK+7G,iBAC7C1uG,SAASqE,oBAAoB,cAAe1R,KAAKk8G,qBACjD7uG,SAASqE,oBAAoB,YAAa1R,KAAKm8G,mBAC/C9uG,SAASqE,oBAAoB,gBAAiB1R,KAAKo8G,uBACnD/uG,SAASqE,oBAAoB,YAAa1R,KAAKw8G,mBAC/CnvG,SAASqE,oBAAoB,WAAY1R,KAAK08G,kBAC9CrvG,SAASqE,oBAAoB,cAAe1R,KAAK48G,qBAEjD58G,KAAK2+G,kBACL3+G,KAAK4+G,0BACD5+G,KAAK8pD,aAAar2B,eACrBzzB,KAAK8pD,YAAYxoD,SAElBtB,KAAK8pD,YAAc,KACnB9pD,KAAKy9G,mBACLz9G,KAAKy7D,MAAM,WACXj9C,MAAMnc,SACP,CAEA0vD,WAAAA,GACC/xD,KAAK66G,UAAUjrG,iBAAiB,UAAW5P,KAAK88G,iBAE5C98G,KAAK+8G,uBACR/8G,KAAK66G,UAAUjrG,iBAAiB,cAAe5P,KAAKi8G,sBAIrDj8G,KAAK66G,UAAUjrG,iBAAiB,YAAa5P,KAAK27G,mBAClD37G,KAAK66G,UAAUjrG,iBAAiB,aAAc5P,KAAKs8G,mBAAoB,CAAE1tE,SAAS,IACnF,CAEAksE,gBAAAA,GACC,OAAK96G,KAAKW,SAINX,KAAKW,SAASkzB,QAAQ7zB,KAAKa,QAAQ44G,cAC/Bz5G,KAAKW,SAGNX,KAAKW,SAAS4G,cAAcvH,KAAKa,QAAQ44G,cAPxC,IAQT,CAEAqE,SAAAA,CAAU7qF,EAAQjzB,KAAK66G,WACtB,OAAK5nF,EAIE7hB,MAAMC,KAAK4hB,EAAMzjB,iBAAiBxP,KAAKa,QAAQ64G,eAH9C,EAIT,CAEAkC,YAAAA,CAAatuG,GACS,IAAjBA,EAAMhG,SAIVtH,KAAK6+G,kBAAkBvxG,EAAMhJ,OAAQgJ,EAAM2I,QAAS3I,EAAMmD,QAASnD,GAC9DtN,KAAK2O,eAIVtB,SAASuC,iBAAiB,YAAa5P,KAAK67G,mBAC5CxuG,SAASuC,iBAAiB,UAAW5P,KAAK+7G,kBAC3C,CAEAD,YAAAA,CAAaxuG,GACZtN,KAAK8+G,iBAAiBxxG,EAAM2I,QAAS3I,EAAMmD,QAASnD,EACrD,CAEA0uG,UAAAA,GACC3uG,SAASqE,oBAAoB,YAAa1R,KAAK67G,mBAC/CxuG,SAASqE,oBAAoB,UAAW1R,KAAK+7G,iBAC7C/7G,KAAK++G,aACN,CAEArrG,cAAAA,CAAepG,GACY,UAAtBA,EAAMgkC,aAA4C,IAAjBhkC,EAAMhG,SAI3CtH,KAAK6+G,kBAAkBvxG,EAAMhJ,OAAQgJ,EAAM2I,QAAS3I,EAAMmD,QAASnD,GAC9DtN,KAAK2O,eAIV3O,KAAKg9G,iBAAmB1vG,EAAM0I,UAC9B3I,SAASuC,iBAAiB,cAAe5P,KAAKk8G,qBAC9C7uG,SAASuC,iBAAiB,YAAa5P,KAAKm8G,mBAC5C9uG,SAASuC,iBAAiB,gBAAiB5P,KAAKo8G,wBACjD,CAEA5oG,cAAAA,CAAelG,GACTtN,KAAK2O,cAAgBrB,EAAM0I,YAAchW,KAAKg9G,kBAInDh9G,KAAK8+G,iBAAiBxxG,EAAM2I,QAAS3I,EAAMmD,QAASnD,EACrD,CAEAmG,YAAAA,CAAanG,GACRA,EAAM0I,YAAchW,KAAKg9G,mBAI7Bh9G,KAAKg9G,iBAAmB,KACxB3vG,SAASqE,oBAAoB,cAAe1R,KAAKk8G,qBACjD7uG,SAASqE,oBAAoB,YAAa1R,KAAKm8G,mBAC/C9uG,SAASqE,oBAAoB,gBAAiB1R,KAAKo8G,uBACnDp8G,KAAK++G,cACN,CAEA1C,gBAAAA,CAAiB/uG,GACZA,EAAM0I,YAAchW,KAAKg9G,mBAI7Bh9G,KAAKg9G,iBAAmB,KACxB3vG,SAASqE,oBAAoB,cAAe1R,KAAKk8G,qBACjD7uG,SAASqE,oBAAoB,YAAa1R,KAAKm8G,mBAC/C9uG,SAASqE,oBAAoB,gBAAiB1R,KAAKo8G,uBACnDp8G,KAAKg/G,cACN,CAEAzC,aAAAA,CAAcjvG,GACb,GAA4B,OAAxBtN,KAAKi9G,iBAA4B3vG,EAAM2xG,gBAAgB7wG,OAC1D,OAGD,MAAM8wG,EAAQ5xG,EAAM2xG,eAAe,GACnCj/G,KAAK6+G,kBAAkBK,EAAM56G,OAAQ46G,EAAMjpG,QAASipG,EAAMzuG,QAASnD,GAC9DtN,KAAK2O,eAIV3O,KAAKi9G,eAAiBiC,EAAMC,WAC5B9xG,SAASuC,iBAAiB,YAAa5P,KAAKw8G,kBAAmB,CAAE5tE,SAAS,IAC1EvhC,SAASuC,iBAAiB,WAAY5P,KAAK08G,kBAC3CrvG,SAASuC,iBAAiB,cAAe5P,KAAK48G,qBAC/C,CAEAH,YAAAA,CAAanvG,GACZ,IAAKtN,KAAK2O,cAAwC,OAAxB3O,KAAKi9G,eAC9B,OAGD,MAAMiC,EAAQl/G,KAAKo/G,eAAe9xG,EAAM2xG,eAAgBj/G,KAAKi9G,iBACzDj9G,KAAKo/G,eAAe9xG,EAAM+xG,QAASr/G,KAAKi9G,gBACvCiC,GAILl/G,KAAK8+G,iBAAiBI,EAAMjpG,QAASipG,EAAMzuG,QAASnD,EACrD,CAEAqvG,WAAAA,CAAYrvG,GACiB,OAAxBtN,KAAKi9G,gBAIKj9G,KAAKo/G,eAAe9xG,EAAM2xG,eAAgBj/G,KAAKi9G,kBAK7Dj9G,KAAKi9G,eAAiB,KACtB5vG,SAASqE,oBAAoB,YAAa1R,KAAKw8G,mBAC/CnvG,SAASqE,oBAAoB,WAAY1R,KAAK08G,kBAC9CrvG,SAASqE,oBAAoB,cAAe1R,KAAK48G,qBACjD58G,KAAK++G,cACN,CAEAlC,cAAAA,GAC6B,OAAxB78G,KAAKi9G,iBAITj9G,KAAKi9G,eAAiB,KACtB5vG,SAASqE,oBAAoB,YAAa1R,KAAKw8G,mBAC/CnvG,SAASqE,oBAAoB,WAAY1R,KAAK08G,kBAC9CrvG,SAASqE,oBAAoB,cAAe1R,KAAK48G,qBACjD58G,KAAKg/G,cACN,CAEA14B,UAAAA,CAAWh5E,GACV,GAAItN,KAAKwS,aAAexS,KAAK2O,aAC5B,OAGD,MAAMmB,EAAOxC,EAAMhJ,QAAQqJ,UAAU3N,KAAKa,QAAQ64G,cAClD,IAAK5pG,IAAS9P,KAAK66G,UAAUx5G,SAASyO,GACrC,OAGD,MAAMrP,EAAM6M,EAAM7M,IACZ6+G,EAAsB,MAAR7+G,GAAuB,UAARA,EAEnC,GAAI6+G,IAAgBt/G,KAAKk9G,qBAAsB,CAC9C,IAAKl9G,KAAKu/G,sBAAsBjyG,EAAMhJ,OAAQwL,GAC7C,OAKD,OAFAxC,EAAME,sBACNxN,KAAKw/G,mBAAmB1vG,EAEzB,CAEA,IAAK9P,KAAKk9G,qBACT,OAGD,GAAIptG,IAAS9P,KAAKk9G,uBAAyBl9G,KAAKk9G,qBAAqB77G,SAASyO,GAC7E,OAGD,GAAIwvG,EAGH,OAFAhyG,EAAME,sBACNxN,KAAKy/G,sBAIN,GAAY,WAARh/G,EAGH,OAFA6M,EAAME,sBACNxN,KAAKy/G,oBAAoB,CAAE/c,WAAW,IAIvC,IAAI3xD,GAAQ,EACR2uE,EAAmB,GACvB,MAAMC,EAAW3/G,KAAK4/G,eAChBC,EAA6B,eAAbF,EAChBG,EAA+B,aAAbH,EAExB,GAAY,YAARl/G,EAAmB,CACtB,IAAKo/G,EACJ,OAEDvyG,EAAME,iBACNujC,EAAQ/wC,KAAK+/G,gBAAgB//G,KAAKk9G,sBAClCwC,EAAmB,WACpB,MAAO,GAAY,cAARj/G,EAAqB,CAC/B,IAAKo/G,EACJ,OAEDvyG,EAAME,iBACNujC,EAAQ/wC,KAAKggH,kBAAkBhgH,KAAKk9G,sBACpCwC,EAAmB,aACpB,MAAO,GAAY,eAARj/G,EAAsB,CAChC,IAAKq/G,EACJ,OAEDxyG,EAAME,iBACNujC,EAAQ/wC,KAAKigH,gBAAgBjgH,KAAKk9G,sBAClCwC,EAAmB,4BACpB,MAAO,GAAY,cAARj/G,EAAqB,CAC/B,IAAKq/G,EACJ,OAEDxyG,EAAME,iBACNujC,EAAQ/wC,KAAKkgH,iBAAiBlgH,KAAKk9G,sBACnCwC,EAAmB,sBACpB,CAEK3uE,IAIL/wC,KAAKmgH,qBACLngH,KAAKm3D,UACLn3D,KAAKk9G,qBAAqBxhF,UAC1B17B,KAAKy7D,MAAM,OAAQ,CAClB3rD,KAAM9P,KAAKk9G,qBACXkD,eAAgBpgH,KAChBge,UAAU,EACVqiG,MAAO,OAEJX,GACH1/G,KAAK0oD,UAAUg3D,GAEjB,CAEAH,qBAAAA,CAAsBj7G,EAAQwL,GAC7B,IAAKxL,IAAWwL,EACf,OAAO,EAGR,MAAMoqE,EAAiBl6E,KAAKa,QAAQ84G,eACpC,IAAKz/B,EACJ,OAAO,EAGR,MAAMpsE,EAASxJ,EAAOqJ,QAAQusE,GAC9B,SAAUpsE,IAAUgC,EAAKzO,SAASyM,GACnC,CAEA0xG,kBAAAA,CAAmB1vG,GACbA,IAAQ9P,KAAKk9G,uBAIlBl9G,KAAKk9G,qBAAuBptG,EAC5B9P,KAAKm9G,uBAAyBl5F,KAAKC,UAAUlkB,KAAKq9G,aAClDvtG,EAAK3O,UAAUC,IAAIg3G,IACnBtoG,EAAKJ,aAAa,eAAgB,QAElC1P,KAAKy7D,MAAM,QAAS,CACnB3rD,OACAyU,QAASvkB,KAAKq9G,YACdr/F,UAAU,IAEXhe,KAAK0oD,UAAU1oD,KAAKsgH,gCACrB,CAEAb,mBAAAA,CAAoB95G,EAAU,CAAC,GAC9B,IAAK3F,KAAKk9G,qBACT,OAGD,MAAMqD,EAAcvgH,KAAKk9G,qBACnBsD,EAAkBxgH,KAAKm9G,uBAAyBl5F,KAAK/c,MAAMlH,KAAKm9G,wBAA0B,GAC1F54F,EAAUvkB,KAAKq9G,YACfrrD,EAAUhyD,KAAKm9G,yBAA2Bl5F,KAAKC,UAAUK,GAE/DvkB,KAAKy7D,MAAM,OAAQ,CAClB3rD,KAAMywG,EACNh8F,UACAi8F,kBACAxuD,UACAouD,eAAgBpgH,KAChBge,UAAU,EACV0kF,YAAa/8F,EAAQ+8F,YAGlB1wC,GACHhyD,KAAKy7D,MAAM,SAAU,CAAEl3C,UAASi8F,kBAAiBxiG,UAAU,IAG5Dhe,KAAKy7D,MAAM,MAAO,CACjBl3C,UACAytC,UACAh0C,UAAU,EACV0kF,YAAa/8F,EAAQ+8F,YAElB/8F,EAAQ+8F,UACX1iG,KAAK0oD,UAAU,mBACLsJ,EACVhyD,KAAK0oD,UAAU,iBAEf1oD,KAAK0oD,UAAU,4BAGZsJ,GAAWhyD,KAAKa,QAAQ8C,MAAMS,OACjCpE,KAAK46G,OAGN56G,KAAK4+G,yBACN,CAEAA,uBAAAA,GACK5+G,KAAKk9G,uBACRl9G,KAAKk9G,qBAAqB/7G,UAAUG,OAAO82G,IAC3Cp4G,KAAKk9G,qBAAqB/qF,gBAAgB,iBAG3CnyB,KAAKk9G,qBAAuB,KAC5Bl9G,KAAKm9G,uBAAyB,EAC/B,CAEA4C,eAAAA,CAAgBjwG,GACf,MAAMgkB,EAAO9zB,KAAKygH,iBAAiB3wG,GACnC,OAAKgkB,GAKQhkB,EAAK2jB,cACb9iB,aAAab,EAAMgkB,IACjB,IANN9zB,KAAK0oD,UAAU,oBACR,EAMT,CAEAs3D,iBAAAA,CAAkBlwG,GACjB,MAAM4jB,EAAO1zB,KAAK0gH,aAAa5wG,GAC/B,OAAK4jB,GAKQ5jB,EAAK2jB,cACb9iB,aAAab,EAAM4jB,EAAK9iB,cACtB,IANN5Q,KAAK0oD,UAAU,sBACR,EAMT,CAEAu3D,eAAAA,CAAgBnwG,GACf,MAAM6wG,EAAkB3gH,KAAKygH,iBAAiB3wG,GAC9C,IAAK6wG,GAAmBA,IAAoB7wG,GAAQA,EAAKzO,SAASs/G,GAEjE,OADA3gH,KAAK0oD,UAAU,sBACR,EAGR,MAAMy1D,EAAYn+G,KAAK4gH,sBAAsBD,GAC7C,OAAI3gH,KAAK6gH,iBAAiB1C,EAAWruG,IACpC9P,KAAK0oD,UAAU,mCACR,IAGRy1D,EAAU1lG,OAAO3I,IACV,EACR,CAEAowG,gBAAAA,CAAiBpwG,GAChB,MAAMgxG,EAAchxG,EAAK2jB,cACnBstF,EAAaD,GAAanzG,QAAQ3N,KAAKa,QAAQ64G,cACrD,IAAKqH,EAEJ,OADA/gH,KAAK0oD,UAAU,sBACR,EAGR,MAAMs4D,EAAaD,EAAWttF,cAC9B,OAAKutF,GAKLA,EAAWrwG,aAAab,EAAMixG,EAAWnwG,cAClC,IALN5Q,KAAK0oD,UAAU,sBACR,EAKT,CAEAk3D,YAAAA,CAAa78G,EAAS/C,KAAKa,SAC1B,MAAMogH,EAAUz6G,OAAOzD,GAAQk3G,UAAY,WAAWxzG,OAAOjB,cAC7D,MAAgB,aAAZy7G,GAAsC,eAAZA,EACtBA,EAED,SACR,CAEAX,4BAAAA,GACC,MAAMX,EAAW3/G,KAAK4/G,eACtB,MAAiB,aAAbD,EACI,wFAES,eAAbA,EACI,2FAED,mFACR,CAEAd,iBAAAA,CAAkBv6G,EAAQ2R,EAASxF,EAASnD,GACvCtN,KAAKk9G,sBACRl9G,KAAK4+G,0BAGN,MAAM9uG,EAAOxL,GAAQqJ,UAAU3N,KAAKa,QAAQ64G,cAC5C,IAAK5pG,IAAS9P,KAAK66G,UAAUx5G,SAASyO,GACrC,OAGD,MAAMoqE,EAAiBl6E,KAAKa,QAAQ84G,eACpC,GAAIz/B,EAAgB,CACnB,MAAMpsE,EAASxJ,EAAOqJ,QAAQusE,GAC9B,IAAKpsE,IAAWgC,EAAKzO,SAASyM,GAC7B,MAEF,CAEAR,EAAME,iBAEN,MAAM0zG,EAAWpxG,EAAKQ,wBACtBtQ,KAAK2O,aAAemB,EACpB9P,KAAKs7G,OAAOtqE,OAAS/6B,EACrBjW,KAAKs7G,OAAOrqE,OAASxgC,EACrBzQ,KAAKs7G,OAAOC,WAAa2F,EAASnsG,KAClC/U,KAAKs7G,OAAOE,YAAcvlG,EAAUirG,EAASnsG,KAC7C/U,KAAKs7G,OAAOG,YAAchrG,EAAUywG,EAASxwG,IAC7C1Q,KAAKs7G,OAAOvE,EAAI9gG,EAChBjW,KAAKs7G,OAAOtE,EAAIvmG,EAChBzQ,KAAKwS,aAAc,EACnBxS,KAAKk7G,eAAiB,GACtBl7G,KAAKy7D,MAAM,cAAe,CACzB3rD,KAAM9P,KAAK2O,aACX0xG,MAAO,CACNtJ,EAAG/2G,KAAKs7G,OAAOvE,EACfC,EAAGh3G,KAAKs7G,OAAOtE,IAGlB,CAEA8H,gBAAAA,CAAiB7oG,EAASxF,EAASnD,GAClC,IAAKtN,KAAK2O,aACT,OAMD,GAHA3O,KAAKs7G,OAAOvE,EAAI9gG,EAChBjW,KAAKs7G,OAAOtE,EAAIvmG,GAEXzQ,KAAKwS,YAAa,CACtB,MAAM4D,EAASjB,KAAKuG,IAAI1b,KAAKs7G,OAAOvE,EAAI/2G,KAAKs7G,OAAOtqE,QAC9C36B,EAASlB,KAAKuG,IAAI1b,KAAKs7G,OAAOtE,EAAIh3G,KAAKs7G,OAAOrqE,QACpD,GAAI76B,EAAS,GAAKC,EAAS,EAC1B,OAEDrW,KAAKmhH,YACN,CAEA7zG,EAAME,iBAENxN,KAAKohH,iBAAiBphH,KAAKs7G,OAAOvE,EAAG/2G,KAAKs7G,OAAOtE,GAEjD,MAAMqK,EAAgBrhH,KAAKshH,kBAAkBthH,KAAKs7G,OAAOvE,EAAG/2G,KAAKs7G,OAAOtE,GACxE,IAAKqK,EAEJ,YADArhH,KAAKuhH,kBAAkB,MAIxB,GAAIF,EAAc1zG,QAAQ,IAAI0qG,MAC7B,OAGD,MAAM+H,EAAiBpgH,KAAK29G,4BAA4B0D,IAAkBrhH,KACpEwhH,EAAcH,EAAc1zG,QAAQyyG,EAAev/G,QAAQ64G,cAC3DhrG,EAAO1O,KAAKyhH,iBAAiBJ,EAAeG,EAAapB,GAC/D,IAAK1xG,IAAS0xG,EAAevF,UAAUx5G,SAASqN,GAE/C,YADA1O,KAAKuhH,kBAAkB,MAIxB,IAAKnB,EAAexC,eAAe59G,KAAK2O,aAAc3O,KAAKm7G,iBAE1D,YADAn7G,KAAKuhH,kBAAkB7yG,GAAM,GAI9B,MAAMmb,EAAO7pB,KAAK0hH,aAAa1hH,KAAKs7G,OAAOvE,EAAG/2G,KAAKs7G,OAAOtE,EAAGwK,EAAapB,EAAev/G,SAWzF,GAVAb,KAAKy7D,MAAM,OAAQ,CAClB3rD,KAAM9P,KAAK2O,aACX6yG,cACA33F,OACAu2F,iBACAC,MAAO,CACNtJ,EAAG/2G,KAAKs7G,OAAOvE,EACfC,EAAGh3G,KAAKs7G,OAAOtE,KAGJ,SAATntF,EAAJ,CAKA,GAAa,UAATA,EAAkB,CAGrB,IAAI82F,EAAkB,KAEtB,GAAIa,EAAa,CAChB,GAAIA,IAAgBxhH,KAAK2O,cAAgB3O,KAAK2O,aAAatN,SAASmgH,GAEnE,YADAxhH,KAAKuhH,kBAAkB,MAGxBZ,EAAkBa,CACnB,MAGC,GAFAxhH,KAAK2hH,sCAAsCjzG,EAAM1O,KAAKs7G,OAAOtE,EAAGoJ,GACtCpgH,KAAK+6G,cAActnF,cAG5C,IADAktF,EAAkBP,EAAeK,iBAAiBzgH,KAAK+6G,cAChD4F,IAAoBA,IAAoB3gH,KAAK2O,cAAgB3O,KAAK2O,aAAatN,SAASs/G,KAC9FA,EAAkBP,EAAeK,iBAAiBE,GAKrD,IAAKA,EAEJ,YADA3gH,KAAKuhH,kBAAkB,MAIxB,MAAMpD,EAAYiC,EAAeQ,sBAAsBD,GACvD,OAAIP,EAAeS,iBAAiB1C,EAAWn+G,KAAK2O,mBACnD3O,KAAKuhH,kBAAkBpD,GAAW,IAInCn+G,KAAK4hH,kBAAkBzD,EAAW,MAClCn+G,KAAKuhH,kBAAkBpD,GACvBn+G,KAAK6hH,uBAAyBzB,OAC9BpgH,KAAKo7G,kBAAoBgF,GAE1B,CAEA,GAAIoB,EAAa,CAChB,GAAIA,IAAgBxhH,KAAK2O,cAAgB3O,KAAK2O,aAAatN,SAASmgH,GAEnE,YADAxhH,KAAKuhH,kBAAkB,MAIxB,MAAMP,EAAaQ,EAAY/tF,cAC/B,OAAI2sF,EAAeS,iBAAiBG,EAAYhhH,KAAK2O,mBACpD3O,KAAKuhH,kBAAkBP,GAAY,IAIvB,WAATn3F,EACH7pB,KAAK4hH,kBAAkBZ,EAAYQ,GAEnCxhH,KAAK4hH,kBAAkBZ,EAAYQ,EAAY5wG,aAEhD5Q,KAAKuhH,kBAAkBP,GACvBhhH,KAAK6hH,uBAAyBzB,OAC9BpgH,KAAKo7G,kBAAoBgF,GAE1B,CAEApgH,KAAK2hH,sCAAsCjzG,EAAM1O,KAAKs7G,OAAOtE,EAAGoJ,GAChEpgH,KAAKuhH,kBAAkB7yG,GACvB1O,KAAK6hH,uBAAyBzB,EAC9BpgH,KAAKo7G,kBAAoBgF,CApEzB,MAFCpgH,KAAKuhH,kBAAkB7yG,EAuEzB,CAEAqwG,WAAAA,GACC,IAAK/+G,KAAK2O,aACT,OAGD,MAAM4xG,EAAcvgH,KAAK2O,aACnBmzG,EAAU9hH,KAAKwS,YACf4tG,EAAiBpgH,KAAKo7G,mBAAqBp7G,KAC3CwgH,EAAkBxgH,KAAKk7G,eAAiBj3F,KAAK/c,MAAMlH,KAAKk7G,gBAAkB,GAChF,IAAI6G,EAAgB/hH,KAAKq9G,YACrB2E,EAAgB5B,EAAe/C,YAC/BrrD,GAAU,EAEd,GAAI8vD,EAAS,CACZ,MAAMG,EAAoBjiH,KAAK+6G,cAActnF,eAAiB,KAC1DwuF,GACHA,EAAkBtxG,aAAa4vG,EAAavgH,KAAK+6G,cAGlDwF,EAAYxsG,MAAM4E,QAAU,GAC5B3Y,KAAKmgH,qBACDC,IAAmBpgH,MACtBogH,EAAeD,qBAEhBngH,KAAKm3D,UACDipD,IAAmBpgH,MACtBogH,EAAejpD,UAGhB4qD,EAAgB/hH,KAAKq9G,YACrB2E,EAAgB5B,EAAe/C,YAC/BrrD,EAAUhyD,KAAKk7G,iBAAmBj3F,KAAKC,UAAU69F,IAAkB3B,IAAmBpgH,IACvF,CAEA,MAAMukB,EAAUw9F,EAChB/hH,KAAKy7D,MAAM,OAAQ,CAClB3rD,KAAMywG,EACNh8F,UACAi8F,kBACAxuD,UACAouD,mBAGGpuD,GAAWouD,IAAmBpgH,OACjCA,KAAKy7D,MAAM,WAAY,CACtB3rD,KAAMywG,EACNlvG,KAAMrR,KACNm2B,GAAIiqF,EACJ2B,gBACAC,kBAED5B,EAAe3kD,MAAM,WAAY,CAChC3rD,KAAMywG,EACNlvG,KAAMrR,KACNm2B,GAAIiqF,EACJ2B,gBACAC,kBAED5B,EAAe3kD,MAAM,SAAU,CAAEl3C,QAASy9F,EAAexB,gBAAiB,MAG3ExgH,KAAK2+G,kBAED3sD,GACHhyD,KAAKy7D,MAAM,SAAU,CAAEl3C,UAASi8F,oBAG7BsB,GACH9hH,KAAKy7D,MAAM,MAAO,CACjBl3C,UACAytC,YAIEA,IACChyD,KAAKa,QAAQ8C,MAAMS,OACtBpE,KAAK46G,OAEFwF,IAAmBpgH,MAAQogH,EAAev/G,QAAQ8C,MAAMS,OAC3Dg8G,EAAexF,OAGlB,CAEAoE,WAAAA,GACC,IAAKh/G,KAAK2O,aACT,OAGD,MAAMmzG,EAAU9hH,KAAKwS,YACrBxS,KAAK2+G,kBAEDmD,GACH9hH,KAAKy7D,MAAM,MAAO,CACjBl3C,QAASvkB,KAAKq9G,YACdrrD,SAAS,EACT0wC,WAAW,GAGd,CAEA0c,cAAAA,CAAe8C,EAAW1wG,GACzB,IAAK0wG,GAAD,MAAc1wG,EACjB,OAAO,KAGR,IAAK,IAAI0Q,EAAQ,EAAGA,EAAQggG,EAAU9zG,OAAQ8T,GAAS,EACtD,GAAIggG,EAAUhgG,GAAOi9F,aAAe3tG,EACnC,OAAO0wG,EAAUhgG,GAInB,OAAO,IACR,CAEAi/F,UAAAA,GACMnhH,KAAK2O,eAAgB3O,KAAKwS,cAI/BxS,KAAKwS,aAAc,EACnBxS,KAAKk7G,eAAiBj3F,KAAKC,UAAUlkB,KAAKq9G,aAC1Cr9G,KAAKm7G,gBAAkBn7G,KACvBA,KAAKmiH,YAAcniH,KAAK66G,UACxB76G,KAAK6hH,uBAAyB7hH,KAC9BA,KAAKo7G,kBAAoBp7G,KAEzBA,KAAK+6G,aAAe/6G,KAAKoiH,mBAAmBpiH,KAAK2O,cAC5C3O,KAAKa,QAAQu5G,iBACjBp6G,KAAK+6G,aAAa55G,UAAUC,IAhtCE,kCAmtC/BpB,KAAK2O,aAAa8kB,cAAc9iB,aAAa3Q,KAAK+6G,aAAc/6G,KAAK2O,aAAaiC,aAElF5Q,KAAKg7G,aAAeh7G,KAAKqiH,mBAAmBriH,KAAK2O,cACjD3O,KAAKi7G,WAAa5tG,SAAS2K,cAAc,OACzChY,KAAKi7G,WAAW95G,UAAUC,IArtCH,0BAutCnBpB,KAAKW,UAAUQ,WAClBnB,KAAKW,SAASQ,UAAUiB,SAAS0gB,GAAc9iB,KAAKi7G,WAAW95G,UAAUC,IAAI0hB,KAE9E9iB,KAAKi7G,WAAWlnG,MAAM6C,SAAW,QACjC5W,KAAKi7G,WAAWlnG,MAAMgB,KAAO,IAC7B/U,KAAKi7G,WAAWlnG,MAAMrD,IAAM,IAC5B1Q,KAAKi7G,WAAWlnG,MAAMU,MAAQ,IAC9BzU,KAAKi7G,WAAWlnG,MAAMvD,OAAS,IAC/BxQ,KAAKi7G,WAAWlnG,MAAM6D,cAAgB,OACtC5X,KAAKi7G,WAAWlnG,MAAMmE,OAAS,QAC/B7K,SAASvG,KAAK2R,OAAOzY,KAAKi7G,YAC1Bj7G,KAAKi7G,WAAWxiG,OAAOzY,KAAKg7G,cAEJ,oBAAb3tG,UAA4BA,SAASvG,OAC/C9G,KAAK07G,oBAAsBruG,SAASvG,KAAKiN,MAAMiH,QAAU,GACzD3N,SAASvG,KAAKiN,MAAMiH,OAAS,YAG9Bhb,KAAKohH,iBAAiBphH,KAAKs7G,OAAOvE,EAAG/2G,KAAKs7G,OAAOtE,GAEjDh3G,KAAK2O,aAAaxN,UAAUC,IAAIg3G,IAChCp4G,KAAK2O,aAAaoF,MAAM4E,QAAU,OAClC3Y,KAAK2O,aAAae,aAAa,eAAgB,QAE/C1P,KAAKy7D,MAAM,QAAS,CACnB3rD,KAAM9P,KAAK2O,aACX4V,QAASvkB,KAAKq9G,cAEhB,CAEAgF,kBAAAA,CAAmBvyG,GAClB,MAAMO,EAAOP,EAAKQ,wBACZgyG,EAASxyG,EAAKmuF,WAAU,GAW9B,OATAqkB,EAAOnhH,UAAUC,IA7vCM,gBAGE,4BA2vCzBkhH,EAAOvuG,MAAM6C,SAAW,QACxB0rG,EAAOvuG,MAAMgB,KAAO,GAAG1E,EAAK0E,SAC5ButG,EAAOvuG,MAAMrD,IAAM,GAAGL,EAAKK,QAC3B4xG,EAAOvuG,MAAMU,MAAQ,GAAGpE,EAAKoE,UAC7B6tG,EAAOvuG,MAAMmE,OAAS,QACtBoqG,EAAOvuG,MAAM6D,cAAgB,OAC7B0qG,EAAOvuG,MAAM8C,OAAS,IAEfyrG,CACR,CAEAlB,gBAAAA,CAAiBrK,EAAGC,GACnB,IAAKh3G,KAAKg7G,aACT,OAID,MAAMjmG,EAAOgiG,GAAKliG,OAAO7U,KAAKs7G,OAAOE,cAAgB,GAC/C9qG,EAAMsmG,GAAKniG,OAAO7U,KAAKs7G,OAAOG,cAAgB,GACpDz7G,KAAKg7G,aAAajnG,MAAMgB,KAAO,GAAGA,MAClC/U,KAAKg7G,aAAajnG,MAAMrD,IAAM,GAAGA,KAClC,CAEA4wG,iBAAAA,CAAkBvK,EAAGC,GACpB,MAAM1lG,EAAKjE,SAASk1G,iBAAiBxL,EAAGC,GACxC,OAAK1lG,GAIEtR,KAAK29G,4BAA4BrsG,GAAMA,EAHtC,IAIT,CAEAmwG,gBAAAA,CAAiBJ,EAAeG,EAAapB,EAAiBpgH,MAC7D,GAAIwhH,EACH,OAAOA,EAAY/tF,cAGpB,MAAM/kB,EAAO2yG,EAAc1zG,QAAQyyG,EAAev/G,QAAQ44G,cAC1D,OAAI/qG,GAAQ0xG,EAAevF,UAAUx5G,SAASqN,GACtCA,EAGD0xG,EAAevF,SACvB,CAED6G,YAAAA,CAAac,EAAUC,EAAUjB,EAAaz+G,EAAS/C,KAAKa,SAC3D,IAAK2gH,EACJ,MAAO,SAGR,MAAMnxG,EAAOmxG,EAAYlxG,wBACnB2G,EAAUwrG,EAAWpyG,EAAKK,IAI1BsG,EAAUwrG,GADF3tG,OAAOI,SAASjV,KAAKs7G,OAAOC,YAAcv7G,KAAKs7G,OAAOC,WAAav7G,KAAKs7G,OAAOtqE,QAEvF0xE,EAAc5tG,WAAW/R,EAAOg3G,QAChCA,EAASllG,OAAOI,SAASytG,GAAeA,EAAc,EACtD/C,EAAW3/G,KAAK4/G,aAAa78G,GAC7B88G,EAA6B,eAAbF,EAChBG,EAA+B,aAAbH,EAClBgD,EAA2BxtG,KAAKC,IACrC,EACAD,KAAKO,IAAI,GAAIb,OAAO9R,EAAOo3G,yBAA2B,KAGvD,GAAIwI,EAA2B,EAAG,CACjC,MAAMC,EAAYD,EAA2B,IACvCE,EAAYxyG,EAAKG,OAASoyG,EAC1BE,EAAezyG,EAAKG,QAAU,EAAIoyG,GAExC,OAAI9C,GAAmB9oG,EAAU+iG,EACzB,QAGJ8F,GAAiB5oG,GAAW4rG,EACxB,SAGJhD,GAAiB5oG,GAAW6rG,EACxB,QAGD,MACR,CAEA,MAAMjxG,EAAYsD,KAAKO,IACtB,IACAP,KAAKC,IAAI,IAAMP,OAAO9R,EAAOm3G,gBAAkB,OAGhD,OAAI4F,GAAmB9oG,EAAU+iG,EACzB,QAGJ8F,GAAiB5oG,EAAU5G,EAAKG,QAAU,GAAMqB,GAC5C,SAGJguG,GAAiB5oG,EAAU5G,EAAKG,QAAU,GAAMqB,GAC5C,QAGD,MACR,CAEC4uG,gBAAAA,CAAiB3wG,GAChB,IAAI6jB,EAAU7jB,GAAMikB,wBAA0B,KAC9C,KAAOJ,IAAYA,EAAQE,QAAQ7zB,KAAKa,QAAQ64G,eAC/C/lF,EAAUA,EAAQI,uBAEnB,OAAOJ,CACR,CAEA+sF,YAAAA,CAAa5wG,GACZ,IAAI6jB,EAAU7jB,GAAM8jB,oBAAsB,KAC1C,KAAOD,IAAYA,EAAQE,QAAQ7zB,KAAKa,QAAQ64G,eAC/C/lF,EAAUA,EAAQC,mBAEnB,OAAOD,CACR,CAEAitF,qBAAAA,CAAsB9wG,GACrB,IAAIpB,EAAOoB,EAAKvI,cAAc,YAAYvH,KAAKa,QAAQ44G,gBACvD,OAAI/qG,IAIJA,EAAOrB,SAAS2K,cAAchY,KAAK66G,UAAUttG,SAAW,MAEpDvN,KAAKa,QAAQg5G,gBAChB75G,KAAKa,QAAQg5G,eACXruG,MAAM,KACNvJ,OAAO8V,SACP3V,SAAS0gB,GAAcpU,EAAKvN,UAAUC,IAAI0hB,KAG7ChT,EAAK2I,OAAO/J,GACLA,EACR,CAEAmyG,gBAAAA,CAAiBnyG,EAAM6xG,EAAcvgH,KAAK2O,cACzC,MAAMo0G,EAAY/iH,KAAKgjH,cAAct0G,GAC/Bu0G,EAAWpuG,OAAO7U,KAAKa,QAAQm5G,UAAY,GAEjD,OAAQ+I,EADa/iH,KAAKkjH,qBAAqB3C,GACZ,EAAK0C,CACzC,CAEAD,aAAAA,CAAct0G,GACb,IAAKA,EACJ,OAAO,EAGR,IAAIwrD,EAAQ,EACR4mD,EAAcpyG,EAElB,KAAOoyG,GAAeA,IAAgB9gH,KAAK66G,WAAW,CACrD,MAAMkG,EAAaD,EAAYnzG,QAAQ3N,KAAKa,QAAQ64G,cACpD,IAAKqH,EACJ,MAED7mD,GAAS,EACT4mD,EAAcC,EAAWttF,eAAe9lB,QAAQ3N,KAAKa,QAAQ44G,aAC9D,CAEA,OAAOv/C,CACR,CAEAgpD,oBAAAA,CAAqBpzG,GACpB,IAAKA,EACJ,OAAO,EAGR,MAAMquG,EAAYn+G,KAAKk+G,0BAA0BpuG,EAAM9P,KAAKa,QAAQ44G,cACpE,IAAK0E,EACJ,OAAO,EAGR,MAAMgF,EAAa/xG,MAAMC,KAAK8sG,EAAUh5E,UAAUljC,QAAQonB,GAAUA,EAAMwK,QAAQ7zB,KAAKa,QAAQ64G,gBAC/F,OAAKyJ,EAAW/0G,OAIM+0G,EAAWphG,QAChC,CAACm4C,EAAOkpD,IAAcjuG,KAAKC,IAAI8kD,EAAOl6D,KAAKkjH,qBAAqBE,KAChE,GAGsB,EARf,CAST,CAEAjD,kBAAAA,GACMngH,KAAK66G,WAIIzpG,MAAMC,KAAKrR,KAAK66G,UAAUrrG,iBAAiBxP,KAAKa,QAAQ44G,eAChEr3G,SAASsM,IACVA,IAAS1O,KAAK66G,YAIDzpG,MAAMC,KAAK3C,EAAKy2B,UAAUlN,MAAM5O,GAAUA,EAAMwK,QAAQ7zB,KAAKa,QAAQ64G,iBAErFhrG,EAAKpN,SACN,GAEF,CAEA8gH,kBAAAA,CAAmBtyG,GAClB,MAAMma,EAAMna,EAAKvC,SAA0C,OAA/BuC,EAAKvC,QAAQ/H,cAAyB,KAAO,MACnE69G,EAAch2G,SAAS2K,cAAciS,GAI3C,OAHAo5F,EAAYvgG,UAAYu1F,GACxBgL,EAAYtvG,MAAMvD,OAAS,GAAG2E,KAAKC,IAAItF,EAAKQ,wBAAwBE,OAAQ,QAC5E6yG,EAAY3zG,aAAa,cAAe,QACjC2zG,CACR,CAEAzB,iBAAAA,CAAkBpuF,EAAQ8vF,EAAa,MACtC,IAAK9vF,IAAWxzB,KAAK+6G,aACpB,OAGD,GAAIuI,IAAetjH,KAAK+6G,aACvB,OAGD,MAAMwI,EAAgBvjH,KAAK+6G,aAAatnF,cAClC+vF,EAAcxjH,KAAK+6G,aAAanqG,YAElC2yG,IAAkB/vF,GAAUgwF,IAAgBF,IAIhD9vF,EAAO7iB,aAAa3Q,KAAK+6G,aAAcuI,GACvCtjH,KAAKy7D,MAAM,kBAAmB,CAC7BjoC,SACA8vF,aACAxzG,KAAM9P,KAAK2O,eAEb,CAEAgzG,qCAAAA,CAAsCjzG,EAAM+zG,EAAUrC,EAAiBpgH,MACtE,IAAK0O,GAAQ0xG,EAAeS,iBAAiBnyG,EAAM1O,KAAK2O,cACvD,OAGD,MAAMmd,EAAQ1a,MAAMC,KAAK3C,EAAKy2B,UAAUljC,QAAQonB,GAAUA,EAAMwK,QAAQ7zB,KAAKa,QAAQ64G,gBACrF,IAAK5tF,EAAM1d,OAEV,YADApO,KAAK4hH,kBAAkBlzG,EAAM,MAI9B,MACMw4F,EAAYp7E,EAAM,GAClB23F,EAAW33F,EAAMA,EAAM1d,OAAS,GAChCs1G,EAAYxc,EAAU52F,wBACtBqzG,EAAWF,EAASnzG,wBAEtBmyG,GAAYiB,EAAUhzG,IANJ,EAOrB1Q,KAAK4hH,kBAAkBlzG,EAAMw4F,GAI1Bub,GAAYkB,EAAS1rG,OAXH,GAYrBjY,KAAK4hH,kBAAkBlzG,EAAM,KAE/B,CAEA6yG,iBAAAA,CAAkB7yG,EAAMk1G,GAAS,GAC5B5jH,KAAKq7G,iBAAmBr7G,KAAKq7G,kBAAoB3sG,GACpD1O,KAAKq7G,gBAAgBl6G,UAAUG,OAAOo3G,GAAmBC,IAGrDjqG,GAKLA,EAAKvN,UAAUC,IAAIwiH,EAASjL,GAAoBD,IAChDhqG,EAAKvN,UAAUG,OAAOsiH,EAASlL,GAAoBC,IACnD34G,KAAKq7G,gBAAkB3sG,GANtB1O,KAAKq7G,gBAAkB,IAOzB,CAEAsD,eAAAA,GACC3+G,KAAKuhH,kBAAkB,MAEnBvhH,KAAK2O,eACR3O,KAAK2O,aAAaxN,UAAUG,OAAO82G,IACnCp4G,KAAK2O,aAAaoF,MAAM4E,QAAU,GAClC3Y,KAAK2O,aAAawjB,gBAAgB,iBAG/BnyB,KAAKg7G,cAAgBh7G,KAAKg7G,aAAavnF,eAC1CzzB,KAAKg7G,aAAa15G,SAGftB,KAAKi7G,YAAcj7G,KAAKi7G,WAAWxnF,eACtCzzB,KAAKi7G,WAAW35G,SAGO,oBAAb+L,UAA4BA,SAASvG,OAC/CuG,SAASvG,KAAKiN,MAAMiH,OAAShb,KAAK07G,qBAAuB,IAGtD17G,KAAK+6G,cAAgB/6G,KAAK+6G,aAAatnF,eAC1CzzB,KAAK+6G,aAAaz5G,SAGnBtB,KAAK2O,aAAe,KACpB3O,KAAK+6G,aAAe,KACpB/6G,KAAKg7G,aAAe,KACpBh7G,KAAKi7G,WAAa,KAClBj7G,KAAK07G,oBAAsB,GAC3B17G,KAAKwS,aAAc,EACnBxS,KAAK6hH,uBAAyB7hH,KAC9BA,KAAKo7G,kBAAoBp7G,KACzBA,KAAKg9G,iBAAmB,KACxBh9G,KAAKi9G,eAAiB,IACvB,CAEApzD,iBAAAA,GACC,IAAK7pD,KAAKW,UAAYX,KAAK8pD,YAC1B,OAGD,MAAM+5D,EAAOx2G,SAAS2K,cAAc,OACpC6rG,EAAK/gG,UA1jDmB,mBA2jDxB+gG,EAAKn0G,aAAa,YAAa,UAC/Bm0G,EAAKn0G,aAAa,cAAe,QACjCm0G,EAAK9vG,MAAM6C,SAAW,WACtBitG,EAAK9vG,MAAMU,MAAQ,MACnBovG,EAAK9vG,MAAMvD,OAAS,MACpBqzG,EAAK9vG,MAAM8C,OAAS,OACpBgtG,EAAK9vG,MAAM+vG,OAAS,IACpBD,EAAK9vG,MAAMoE,QAAU,IACrB0rG,EAAK9vG,MAAMgwG,KAAO,gBAClBF,EAAK9vG,MAAMiwG,SAAW,aACtBH,EAAK9vG,MAAMqI,SAAW,SACtBynG,EAAK9vG,MAAMoiF,WAAa,SACxBn2F,KAAKW,SAAS8X,OAAOorG,GACrB7jH,KAAK8pD,YAAc+5D,CACpB,CAEAn7D,SAAAA,CAAUv3C,GACJA,IAILnR,KAAK6pD,oBACA7pD,KAAK8pD,cAIV9pD,KAAK8pD,YAAYjxC,YAAc,GAC/B5I,uBAAsB,KACjBjQ,KAAK8pD,cACR9pD,KAAK8pD,YAAYjxC,YAAc1H,EAChC,KAEF,CAEAstG,cAAAA,CAAe/vG,GAGd,OAFc0C,MAAMC,KAAK3C,EAAKy2B,UAAUljC,QAAQonB,GAAUA,EAAMwK,QAAQ7zB,KAAKa,QAAQ64G,gBAExEprG,KAAKwB,IACjB,MAAM0B,GAAKxM,EAAAA,EAAAA,IAAc8K,EAAKyB,aAAavR,KAAKa,QAAQ+4G,cAClDuE,EAAYruG,EAAKvI,cAAc,YAAYvH,KAAKa,QAAQ44G,gBAExD50G,EAAO,CAAE2M,GAAIA,GAAM,MAEzB,GAAI2sG,EAAW,CACd,MAAMh5E,EAAWnlC,KAAKy+G,eAAeN,GACjCh5E,EAAS/2B,SACZvJ,EAAKsgC,SAAWA,EAElB,CAEA,OAAOtgC,CAAI,GAEb,EAGDrD,EAAAA,EAAaC,GAAG4L,SAAU,oBAAoBxK,eAAqB,KAClEN,EAAAA,EAAUqf,QAjoDkB,+BAioDYxf,SAASkP,GAAOkoG,GAAWzxG,oBAAoBuJ,IAAI,IAG5F,MC9oDA,GD8oDA,GE5oDM2yG,GAAuB,oBACvBC,GAAuB,oBACvBC,GAAsB,mBAEtBC,GAAiB,CACtBH,GACAC,GACAC,IAGKE,GAA2BA,CAACngH,EAAOnB,EAAQ6V,KAChD,MAAMmS,EAAOnS,EAAMxD,IAAMwD,EAAMlD,IACzBk9E,EAAU7nE,EAAO,GAAM7mB,EAAQ0U,EAAMlD,KAAOqV,EAAQ,IAAM,EAC1Du5F,EAAezvG,OAAO9R,GAAQ+B,QAAQw/G,cACtCC,EAAc1vG,OAAO9R,GAAQ+B,QAAQy/G,aACrCC,EAAmB3vG,OAAOI,SAASqvG,GAAgBA,EAAe,GAGxE,OAAI1xB,GAFoB/9E,OAAOI,SAASsvG,GAAeA,EAAc,IAG7D,SAGJ3xB,EAAU4xB,EACN,UAGD,SAAS,EAoFXC,GAAoBA,CAAC1hH,EAAQ6V,EAAO8rG,KACzC,MAAMxgH,EAlF0BygH,EAAC5hH,EAAQ6V,EAAO8rG,KAChD,IAAKA,EAAQE,QACZ,OAAOhsG,EAAMvH,KAGd,MAAMwzG,EAAmC,iBAAvB9hH,GAAQ+B,QAAQ+/G,GAC/B9hH,EAAO+B,OAAO+/G,GAAGr/G,cACjB,KAEH,MAAW,SAAPq/G,EACIjsG,EAAMvH,KAGH,QAAPwzG,GACKjsG,EAAMvH,KAAOuH,EAAMud,IAAM,EAG3Bvd,EAAMud,EAAE,EAiEDwuF,CAAyB5hH,EAAQ6V,EAAO8rG,GACtD,OAAOL,GAAyBngH,EAAOnB,EAAQ6V,EAAM,EAGhDksG,GAAoBA,CAACplH,EAAMqlH,KAChCrlH,EAAKyB,UAAUG,UAAU8iH,IAEZ,WAATW,EAKS,YAATA,EAKJrlH,EAAKyB,UAAUC,IAAI6iH,IAJlBvkH,EAAKyB,UAAUC,IAAI8iH,IALnBxkH,EAAKyB,UAAUC,IAAI+iH,GASoB,EAGnCa,GAAqBA,CAACjiH,EAAQgiH,KAC9B3zG,MAAMiP,QAAQtd,GAAQkiH,aAAeliH,EAAOkiH,WAAW72G,OAAS,EAC7D,KAGK,WAAT22G,EACIhiH,EAAOkiH,WAAW,IAAM,KAGnB,YAATF,EACIhiH,EAAOkiH,WAAW,IAAM,KAGzBliH,EAAOkiH,WAAW,IAAM,KC7I1BpiH,GAAW,iBAIXqiH,GAAoB,kBAGpBC,GAA4B,YAE5BnM,GAAiB,GAAGn2G,UACpBuiH,GAAkB,GAAGviH,WACrBg2G,GAAmB,GAAGh2G,YACtBwiH,GAAmB,GAAGxiH,YAEtB4a,GAAgB,CACrB6nG,OAAO,EACP5vG,IAAK,EACLN,IAAK,IACL2pE,KAAM,EACNxpB,MAAO,KACP8kD,SAAS,EACTkL,UAAU,EACV3iC,QAAQ,EACR4iC,UAAW,MACXnZ,OAAQ,GACR5pD,OAAQ,GACRwiE,WAAY,KACZQ,KAAM,UACNC,MAAO,CACN7nD,MAAO,EACP+kB,QAAQ,EACR3+E,OAAQ,KACR0hH,aAAa,GAEd7gH,OAAQ,CACPw/G,aAAc,GACdC,YAAa,GACbM,GAAI,MAELl5G,KAAM,CACL+J,IAAK,GACLN,IAAK,IAENkW,MAAO,CACN5V,IAAK,KACLN,IAAK,MAEN5Q,OAAQ,CACPF,OAAQ,KACRoR,IAAK,KACLN,IAAK,MAEN8e,UAAU,EACVw6B,OAAQ,KACRk3D,QAAS,KACT75D,SAAU,KACV85D,SAAU,KACVC,YAAa,MAGd,MAAMC,WAAsBxnG,EAAAA,EAC3Bhe,WAAAA,CAAYC,EAASuC,EAAS,CAAC,GAC9Byb,MAAMhe,EAASuC,GAEf/C,KAAKgmH,aAAehmH,KAAKW,SAASkzB,QAAQ,uBAAyB7zB,KAAKW,SAAW,KACnFX,KAAKa,QAAUb,KAAKimH,aAAaljH,GACjC/C,KAAKkmH,SAAWlmH,KAAKmmH,oBACrBnmH,KAAKomH,WAAa,GAClBpmH,KAAK+1G,cAAgB,IAAM/1G,KAAKqmH,UAChCrmH,KAAKsmH,KAAO,CACX5mH,KAAM,KACNggB,QAAS,KACT6mG,KAAM,KACNC,UAAW,KACXC,QAAS,KACTC,YAAa,KACbC,UAAW,KACXC,cAAe,KACfC,UAAW,KACXC,QAAS,KACTC,eAAgB,KAChBC,UAAW,KACXC,UAAW,KACXxB,KAAM,MAGPzlH,KAAK4wD,OAAS5wD,KAAKknH,cAEnBlnH,KAAK8xD,UACL9xD,KAAK+xD,cACL/xD,KAAKqmH,UACLrmH,KAAKmnH,kBAAkBnnH,KAAKa,QAAQqzB,UACpCl0B,KAAKy7D,MAAMu9C,GAAgB,SAC5B,CAEA,eAAW1wG,GACV,MAjGW,aAkGZ,CAEA,mBAAWzF,GACV,OAAOA,EACR,CAEA,WAAOqF,CAAK1H,EAASuC,EAAS,CAAC,GAC9B,OAAO/C,KAAK+H,oBAAoBvH,EAASuC,EAC1C,CAEAqkH,QAAAA,GACC,OAAOpnH,KAAKkmH,SAAW,CAAClmH,KAAK4wD,OAAOv/C,KAAMrR,KAAK4wD,OAAOz6B,IAAMn2B,KAAK4wD,OAAOv/C,IACzE,CAEAg2G,QAAAA,CAASnjH,EAAOyB,EAAU,CAAC,GAC1B,MAAM,OAAE2hH,GAAS,EAAK,KAAE7gE,EAAO,UAAa9gD,EAE5C,GAAI3F,KAAKkmH,SAAU,CAClB,MAAMxyF,EAAOtiB,MAAMiP,QAAQnc,GAASA,EAAQ,CAACA,EAAOlE,KAAK4wD,OAAOz6B,IAC1D9kB,EAAOrR,KAAKunH,gBAAgB7zF,EAAK,GAAI1zB,KAAK4wD,OAAOl7C,KACjDygB,EAAKn2B,KAAKunH,gBAAgB7zF,EAAK,GAAI1zB,KAAK4wD,OAAOx7C,KACrDpV,KAAK4wD,OAAOv/C,KAAO8D,KAAKO,IAAIrE,EAAM8kB,GAClCn2B,KAAK4wD,OAAOz6B,GAAKhhB,KAAKC,IAAI/D,EAAM8kB,EACjC,MACCn2B,KAAK4wD,OAAOv/C,KAAOrR,KAAKunH,gBAAgBrjH,EAAOlE,KAAK4wD,OAAOl7C,KAG5D1V,KAAKqmH,UAEAiB,GACJtnH,KAAKy7D,MAAe,WAAThV,EAAoBoyD,GAAmBwM,GAA2B,WAAT5+D,EAAoB,WAAa,WAEvG,CAEAtmD,MAAAA,GACCH,KAAKmnH,mBAAkB,EACxB,CAEArzG,OAAAA,GACC9T,KAAKmnH,mBAAkB,EACxB,CAEA9kH,OAAAA,GACCrC,KAAKomH,WAAWhkH,SAAQ,EAAG5B,UAASwL,OAAMghB,aAAcxsB,EAAQkR,oBAAoB1F,EAAMghB,KAC1FhtB,KAAKomH,WAAa,GAClB/wG,OAAO3D,oBAAoB,SAAU1R,KAAK+1G,eAC1Cv3F,MAAMnc,SACP,CAEA4jH,YAAAA,CAAaljH,GACZ,MAAM+U,EAAS9X,KAAK8C,WAAW9C,KAAKW,UAAUG,EAAAA,EAAAA,IAAgB2c,GAAe1a,IAmD7E,OAjDI/C,KAAKgmH,eACRluG,EAAOpC,IAAgC,KAA1B1V,KAAKgmH,aAAatwG,KAAa1Q,EAAAA,EAAAA,IAAchF,KAAKgmH,aAAatwG,KAAOoC,EAAOpC,IAC1FoC,EAAO1C,IAAgC,KAA1BpV,KAAKgmH,aAAa5wG,KAAapQ,EAAAA,EAAAA,IAAchF,KAAKgmH,aAAa5wG,KAAO0C,EAAO1C,IAC1F0C,EAAOinE,KAAkC,KAA3B/+E,KAAKgmH,aAAajnC,MAAc/5E,EAAAA,EAAAA,IAAchF,KAAKgmH,aAAajnC,MAAQjnE,EAAOinE,KAC7FjnE,EAAOy9C,MAAoC,KAA5Bv1D,KAAKgmH,aAAa9hH,OAAec,EAAAA,EAAAA,IAAchF,KAAKgmH,aAAa9hH,OAAS4T,EAAOy9C,MAChGz9C,EAAOnM,KAAO3L,KAAKgmH,aAAar6G,MAAQmM,EAAOnM,KAC/CmM,EAAOoc,SAAWl0B,KAAKgmH,aAAa9xF,UAAYpc,EAAOoc,UAG7B,iBAAhBpc,EAAOnM,OACjBmM,EAAOnM,KAAO,CACb+J,IAAKoC,EAAOnM,KACZyJ,IAAK0C,EAAOnM,OAITmM,EAAOwT,OAAiC,iBAAjBxT,EAAOwT,QAClCxT,EAAOwT,MAAQ,CAAE5V,IAAK,KAAMN,IAAK,OAGL,iBAAlB0C,EAAOtT,OACjBsT,EAAOtT,OAAS,CACfF,OAAQwT,EAAOtT,OACfkR,IAAK,KACLN,IAAK,MAEK0C,EAAOtT,QAAmC,iBAAlBsT,EAAOtT,OAM/BpB,OAAO+E,UAAUhE,eAAeiE,KAAK0P,EAAOtT,OAAQ,YAC/DsT,EAAOtT,OAAOF,OAAS,MANvBwT,EAAOtT,OAAS,CACfF,OAAQ,KACRoR,IAAK,KACLN,IAAK,OAMF0C,EAAOmtG,YAAcntG,EAAO2T,OAAiC,iBAAjB3T,EAAO2T,OAAsBroB,OAAO+E,UAAUhE,eAAeiE,KAAK0P,EAAO2T,MAAO,WAChI3T,EAAOmtG,WAAantG,EAAO2T,MAAM+7F,OAGD,iBAAtB1vG,EAAOmtG,WACjBntG,EAAOmtG,WAAantG,EAAOmtG,WACzBz5G,MAAM,KACN8C,KAAKm5G,GAASA,EAAKhhH,SACnBxE,OAAO8V,SACE3G,MAAMiP,QAAQvI,EAAOmtG,cAChCntG,EAAOmtG,WAAa,MAGdntG,CACR,CAEAovG,WAAAA,GACC,MAAMxxG,EAAMb,QAAO7P,EAAAA,EAAAA,IAAchF,KAAKa,QAAQ6U,MACxCN,EAAMD,KAAKC,IAAIP,QAAO7P,EAAAA,EAAAA,IAAchF,KAAKa,QAAQuU,MAAOM,GACxDqpE,EAAOlqE,QAAO7P,EAAAA,EAAAA,IAAchF,KAAKa,QAAQk+E,QAAU,EACnDxpB,EAAQv1D,KAAK0nH,oBAAoBhyG,EAAKN,GAE5C,MAAO,CACNM,MACAN,IAAKA,GAAOM,EAAMN,EAAMM,EACxBqpE,KAAMA,EAAO,EAAIA,EAAO,EACxB1tE,KAAMkkD,EAAMlkD,KACZ8kB,GAAIo/B,EAAMp/B,GAEZ,CAEAgwF,iBAAAA,GACC,OAAInmH,KAAKgmH,eACoC,KAAtChhH,EAAAA,EAAAA,IAAchF,KAAKa,QAAQykH,MACnC,CAEAoC,mBAAAA,CAAoBhyG,EAAKN,GACxB,IAAI/D,EAAOqE,EACPygB,EAAK/gB,EAET,GAAIpV,KAAKkmH,SAAU,CAClB,MAAM3wD,EAAQnkD,MAAMiP,QAAQrgB,KAAKa,QAAQ00D,OAASv1D,KAAKa,QAAQ00D,MAAQ,CAACv1D,KAAKa,QAAQwQ,KAAMrR,KAAKa,QAAQs1B,IACxG9kB,EAAOrR,KAAKunH,gBAAgBhyD,EAAM,GAAI7/C,EAAKA,EAAKN,GAChD+gB,EAAKn2B,KAAKunH,gBAAgBhyD,EAAM,GAAIngD,EAAKM,EAAKN,GAC1C/D,EAAO8kB,KACT9kB,EAAM8kB,GAAM,CAACA,EAAI9kB,GAEpB,KAAO,CACN,MAAMnN,EAAQlE,KAAKa,QAAQ00D,OAASv1D,KAAKa,QAAQqD,OAASwR,EAC1DrE,EAAOrR,KAAKunH,gBAAgBrjH,EAAOwR,EAAKA,EAAKN,GAC7C+gB,EAAK9kB,CACN,CAEA,MAAO,CAAEA,OAAM8kB,KAChB,CAEA27B,OAAAA,GACC,MAAMpyD,EAAOM,KAAKgmH,aAAehmH,KAAK2nH,mBAAqB3nH,KAAK4nH,uBAChE5nH,KAAKsmH,KAAK5mH,KAAOA,EACjBM,KAAKsmH,KAAK5mG,QAAUnd,EAAAA,EAAUC,KAAK,4BAA6B9C,GAChEM,KAAKsmH,KAAKC,KAAOhkH,EAAAA,EAAUC,KAAK,yBAA0B9C,GAC1DM,KAAKsmH,KAAKE,UAAYjkH,EAAAA,EAAUC,KAAK,gCAAiC9C,GACtEM,KAAKsmH,KAAKG,QAAUlkH,EAAAA,EAAUC,KAAK,8BAA+B9C,GAClEM,KAAKsmH,KAAKI,YAAcnkH,EAAAA,EAAUC,KAAK,kCAAmC9C,GAC1EM,KAAKsmH,KAAKK,UAAYpkH,EAAAA,EAAUC,KAAK,gCAAiC9C,GACtEM,KAAKsmH,KAAKM,cAAgBrkH,EAAAA,EAAUC,KAAK,oCAAqC9C,GAC9EM,KAAKsmH,KAAKO,UAAYtkH,EAAAA,EAAUC,KAAK,gCAAiC9C,GACtEM,KAAKsmH,KAAKQ,QAAUvkH,EAAAA,EAAUC,KAAK,8BAA+B9C,GAClEM,KAAKsmH,KAAKS,eAAiBxkH,EAAAA,EAAUC,KAAK,8BAA+B9C,GACzEM,KAAKsmH,KAAKU,UAAYtnH,EAAK6H,cAAc,0CACzCvH,KAAKsmH,KAAKW,UAAYvnH,EAAK6H,cAAc,0CACzCvH,KAAKsmH,KAAKb,KDjGiBoC,EAACnoH,EAAMqD,EAAQ6V,EAAO8rG,KAClDhlH,EAAKyB,UAAUC,IAvKW,mBAyKN,UAAhB2B,EAAO0iH,MACV/lH,EAAKyB,UAAUC,IAzKQ,iBAyED0mH,EAACpoH,EAAMqD,EAAQ6V,EAAOktG,EAAaiC,KAC1D,MAAM9jH,EAtBkB+jH,EAACjlH,EAAQ6V,KACjC,GAAIxH,MAAMiP,QAAQtd,GAAQ2iH,OAAOzhH,SAAWlB,EAAO2iH,MAAMzhH,OAAOmK,OAAS,EACxE,OAAOrL,EAAO2iH,MAAMzhH,OAClBqK,KAAIpK,GAAS2Q,OAAO3Q,KACpBjC,QAAOiC,GAAS2Q,OAAOI,SAAS/Q,KAChCooC,MAAK,CAACphB,EAAGqhB,IAAMrhB,EAAIqhB,IAGtB,MAAMsxB,EAAQ1oD,KAAKC,IAAI,EAAGP,OAAO9R,GAAQ2iH,OAAO7nD,QAAU,GAEpDkhB,GADOnmE,EAAMxD,IAAMwD,EAAMlD,MACVmoD,EAAQ,GACvB55D,EAAS,GAEf,IAAK,IAAIie,EAAQ,EAAGA,EAAQ27C,EAAO37C,IAAS,CAC3C,MAAMhe,EAAQge,IAAU27C,EAAQ,EAAIjlD,EAAMxD,IAAMwD,EAAMlD,IAAOqpE,EAAO78D,EACpEje,EAAO0T,KAAK9C,OAAO3Q,EAAMi0C,QAAQ,IAClC,CAEA,OAAOl0C,CAAM,EAIE+jH,CAAiBjlH,EAAQ6V,GAClC8sG,EAAQr4G,SAAS2K,cAAc,OACrC0tG,EAAM5iG,UAAY,0BAEiB,IAA/B/f,GAAQ2iH,OAAOC,aAClBjmH,EAAKyB,UAAUC,IA7EY,yBAgF5B,MAAM6mH,EAAQhkH,EAAOqK,KAAKpK,IACzB,MAAM4L,EAAOzC,SAAS2K,cAAc,QACpClI,EAAKgT,UAAY,8BACjBhT,EAAKiE,MAAMgB,KAAO,GAAGgzG,EAAa7jH,OAClC4L,EAAKsE,QAAQlQ,MAAQsC,OAAOtC,GAE5B,MAAMgkH,EAAO76G,SAAS2K,cAAc,QAIpC,GAHAkwG,EAAKplG,UAAY,8BACjBhT,EAAKwa,YAAY49F,IAEa,IAA1BnlH,GAAQ2iH,OAAO9iC,OAAkB,CACpC,MAAMn3D,EAAQpe,SAAS2K,cAAc,QACrCyT,EAAM3I,UAAY,+BAClB2I,EAAM5S,YAAcitG,EAAY5hH,GAChC4L,EAAKwa,YAAYmB,EAClB,CAGA,OADAi6F,EAAMp7F,YAAYxa,GACXA,CAAI,IAKZ,OAFApQ,EAAK4qB,YAAYo7F,GAEV,CACN15G,KAAM,QACNtM,KAAMgmH,EACNuC,QACAhkH,SACA,EA4DO6jH,CAAgBpoH,EAAMqD,EAAQ6V,EAAO8rG,EAAQoB,YAAapB,EAAQqD,eAGtD,WAAhBhlH,EAAO0iH,MACV/lH,EAAKyB,UAAUC,IA7KS,kBA8KxB0jH,GAAkBplH,EAAM+kH,GAAkB1hH,EAAQ6V,EAAO8rG,IAElD,CACN14G,KAAM,SACNtM,UAIEqD,EAAO0iH,KACH,OC8EUoC,CAAqBnoH,EAAMM,KAAKa,QAASb,KAAK4wD,OAAQ,CACtEk1D,YAAc5hH,GAAUlE,KAAKmoH,aAAajkH,GAC1C6jH,aAAe7jH,GAAUlE,KAAKooH,cAAclkH,IAE9C,CAEAyjH,gBAAAA,GACC,MAAMU,EAAcroH,KAAKgmH,aACnBtmH,EAAO2N,SAAS2K,cAAc,OACpCtY,EAAKojB,UAAYoiG,GAEjB,MAAMxlG,EAAUrS,SAAS2K,cAAc,OACvC0H,EAAQoD,UAAY,2BAEpB,MAAM8jE,EAAQv5E,SAAS2K,cAAc,OACrC4uE,EAAM9jE,UAAY,yBAElB,MAAMyjG,EAAOl5G,SAAS2K,cAAc,OACpCuuG,EAAKzjG,UAAY,wBAEjB,MAAMwlG,EAAUtoH,KAAKa,QAAQ0kH,SAAWvlH,KAAKuoH,eAAe,QAAU,KAChE3lC,EAAS5iF,KAAKa,QAAQ+hF,OAAS5iF,KAAKwoH,eAAc,GAAS,KAcjE,OAZAH,EAAYI,sBAAsB,cAAe/oH,GAEjD2oH,EAAYlnH,UAAUC,IAAI,yBAA0B,gCACpDinH,EAAYK,aAAe,MAE3B9hC,EAAMt8D,YAAYi8F,GAClB7mG,EAAQ4K,YAAYs8D,GACpBlnE,EAAQ4K,YAAY+9F,GAChBC,GAAS5oG,EAAQ4K,YAAYg+F,GACjC5oH,EAAK4qB,YAAY5K,GACbkjE,GAAQljF,EAAK4qB,YAAYs4D,GAEtBljF,CACR,CAEAkoH,oBAAAA,GACC,MAAMloH,EAAOM,KAAKW,SAClBjB,EAAKyB,UAAUC,IAAI8jH,IACfllH,KAAKkmH,UAAUxmH,EAAKyB,UAAUC,IApSX,YAsSvB1B,EAAKoE,UAAY,GAEjB,MAAM4b,EAAUrS,SAAS2K,cAAc,OACvC0H,EAAQoD,UAAY,2BAEpB,MAAM8jE,EAAQv5E,SAAS2K,cAAc,OACrC4uE,EAAM9jE,UAAY,yBAElB,MAAMyjG,EAAOl5G,SAAS2K,cAAc,OACpCuuG,EAAKzjG,UAAY,wBAEjB8jE,EAAMt8D,YAAYi8F,GAClB7mG,EAAQ4K,YAAYs8D,GAEpB,MAAM4/B,EAAYxmH,KAAK2oH,kBAAkB,QAGzC,GAFAjpG,EAAQ4K,YAAYk8F,GAEhBxmH,KAAKkmH,SAAU,CAClB,MAAMO,EAAUzmH,KAAK2oH,kBAAkB,MACvCjpG,EAAQ4K,YAAYm8F,EACrB,CAqBA,OAnBIzmH,KAAKa,QAAQ0kH,WAChB7lG,EAAQ4K,YAAYtqB,KAAKuoH,eAAe,SACpCvoH,KAAKkmH,UAAUxmG,EAAQ4K,YAAYtqB,KAAKuoH,eAAe,OACvDvoH,KAAKkmH,UAAUxmG,EAAQ4K,YAAYtqB,KAAKuoH,eAAe,YAG5D7oH,EAAK4qB,YAAY5K,GAEb1f,KAAKa,QAAQ+hF,QAChBljF,EAAK4qB,YAAYtqB,KAAKwoH,cAAcxoH,KAAKkmH,WAGtClmH,KAAKkmH,UACRlmH,KAAK4oH,mBAAmBlpH,EAAM,MAAOM,KAAKa,QAAQyqB,OAAO5V,IAAK1V,KAAKa,QAAQ8K,MAAM+J,KACjF1V,KAAK4oH,mBAAmBlpH,EAAM,MAAOM,KAAKa,QAAQyqB,OAAOlW,IAAKpV,KAAKa,QAAQ8K,MAAMyJ,MACvEpV,KAAKa,QAAQ8K,MAAM+J,KAC7B1V,KAAK4oH,mBAAmBlpH,EAAM,MAAOM,KAAKa,QAAQyqB,OAAO5V,IAAK1V,KAAKa,QAAQ8K,KAAK+J,KAG1EhW,CACR,CAEAipH,iBAAAA,CAAkB38G,GACjB,MAAMsf,EAAQje,SAAS2K,cAAc,SAQrC,OAPAsT,EAAMtf,KAAO,QACbsf,EAAMxI,UAAY,kDAAkD9W,IACpEsf,EAAM5V,IAAMlP,OAAOxG,KAAK4wD,OAAOl7C,KAC/B4V,EAAMlW,IAAM5O,OAAOxG,KAAK4wD,OAAOx7C,KAC/BkW,EAAMyzD,KAAOv4E,OAAOxG,KAAK4wD,OAAOmuB,MAChCzzD,EAAMpnB,MAAQsC,OAAgB,OAATwF,EAAgBhM,KAAK4wD,OAAOz6B,GAAKn2B,KAAK4wD,OAAOv/C,MAClEia,EAAMo9F,aAAe,MACdp9F,CACR,CAEAi9F,cAAAA,CAAev8G,GACd,MAAMs8G,EAAUj7G,SAAS2K,cAAc,QAKvC,OAJAswG,EAAQxlG,UAAY,sDAAsD9W,IAC7D,WAATA,GACHs8G,EAAQnnH,UAAUC,IAAI+jH,IAEhBmD,CACR,CAEAE,aAAAA,CAAc5D,GACb,MAAMhiC,EAASv1E,SAAS2K,cAAc,OACtC4qE,EAAO9/D,UAAY,0BAEnB,MAAMzR,EAAOhE,SAAS2K,cAAc,QAIpC,GAHA3G,EAAKyR,UAAY,sDACjB8/D,EAAOt4D,YAAYjZ,GAEfuzG,EAAS,CACZ,MAAMY,EAAYn4G,SAAS2K,cAAc,QACzCwtG,EAAU1iG,UAAY,6BACtB0iG,EAAU3sG,YAAc7Y,KAAKa,QAAQ2kH,UACrC5iC,EAAOt4D,YAAYk7F,GAEnB,MAAMrvF,EAAK9oB,SAAS2K,cAAc,QAClCme,EAAGrT,UAAY,oDACf8/D,EAAOt4D,YAAY6L,EACpB,CAEA,OAAOysD,CACR,CAEAgmC,kBAAAA,CAAmBlpH,EAAMmuB,EAAMjc,EAAUjG,GACxC,IAAI2f,EAAQ1Z,EAAWrP,EAAAA,EAAUC,KAAKoP,GAAY,KAC7C0Z,IACJA,EAAQje,SAAS2K,cAAc,SAC/BsT,EAAMtf,KAAO,SACTL,IAAM2f,EAAM3f,KAAOA,GACvBjM,EAAK4qB,YAAYgB,IAElBA,EAAM5b,aAAa,4BAA6Bme,EACjD,CAEAkkC,WAAAA,GACC,MAAM82D,EAAgB78G,GAAUsB,IAC/B,MAAM46C,EAAWloD,KAAKunH,gBAAgBj6G,EAAMhJ,OAAOJ,MAAOlE,KAAK4wD,OAAOl7C,KAElE1V,KAAKkmH,SACK,SAATl6G,GACHhM,KAAK4wD,OAAOv/C,KAAO8D,KAAKO,IAAIwyC,EAAUloD,KAAK4wD,OAAOz6B,IAClD7oB,EAAMhJ,OAAOJ,MAAQsC,OAAOxG,KAAK4wD,OAAOv/C,QAExCrR,KAAK4wD,OAAOz6B,GAAKhhB,KAAKC,IAAI8yC,EAAUloD,KAAK4wD,OAAOv/C,MAChD/D,EAAMhJ,OAAOJ,MAAQsC,OAAOxG,KAAK4wD,OAAOz6B,KAGzCn2B,KAAK4wD,OAAOv/C,KAAO62C,EAGpBloD,KAAKqmH,UACLrmH,KAAKy7D,MAAM2pD,GAAiB,UAAU,EAGjC0D,EAAgBA,KACrB9oH,KAAKqmH,UACLrmH,KAAKy7D,MAAMo9C,GAAkB,WAAW,EAGzC,CAAC74G,KAAKsmH,KAAKE,UAAWxmH,KAAKsmH,KAAKG,SAASxkH,OAAO8V,SAAS3V,SAASkpB,IACjE,MAAMtf,EAAOsf,EAAMnqB,UAAUE,SAAS,8BAAgC,KAAO,OACvEukH,EAAUiD,EAAa78G,GACvB+/C,EAAW+8D,EAEjBx9F,EAAM1b,iBAAiB,QAASg2G,GAChCt6F,EAAM1b,iBAAiB,SAAUm8C,GAEjC/rD,KAAKomH,WAAWzuG,KAAK,CAAEnX,QAAS8qB,EAAOtf,KAAM,QAASghB,QAAS44F,IAC/D5lH,KAAKomH,WAAWzuG,KAAK,CAAEnX,QAAS8qB,EAAOtf,KAAM,SAAUghB,QAAS++B,GAAW,IAG5E12C,OAAOzF,iBAAiB,SAAU5P,KAAK+1G,cACxC,CAEAsQ,OAAAA,GACqBrmH,KAAK+oH,WAAW/oH,KAAK4wD,OAAOv/C,MAC9BrR,KAAK+oH,WAAW/oH,KAAKkmH,SAAWlmH,KAAK4wD,OAAOz6B,GAAKn2B,KAAK4wD,OAAOv/C,MAD/E,MAEM23G,EAAehpH,KAAKooH,cAAcpoH,KAAK4wD,OAAOv/C,MAC9C43G,EAAajpH,KAAKooH,cAAcpoH,KAAKkmH,SAAWlmH,KAAK4wD,OAAOz6B,GAAKn2B,KAAK4wD,OAAOv/C,MAKnF,GAHIrR,KAAKsmH,KAAKE,YAAWxmH,KAAKsmH,KAAKE,UAAUtiH,MAAQsC,OAAOxG,KAAK4wD,OAAOv/C,OACpErR,KAAKsmH,KAAKG,UAASzmH,KAAKsmH,KAAKG,QAAQviH,MAAQsC,OAAOxG,KAAK4wD,OAAOz6B,KAEhEn2B,KAAKsmH,KAAKC,KAAM,CACnB,MAAMxxG,EAAO/U,KAAKkmH,SAAW8C,EAAe,EACtCv0G,EAAQzU,KAAKkmH,SAAY+C,EAAaD,EAAgBC,EAC5DjpH,KAAKsmH,KAAKC,KAAKxyG,MAAMgB,KAAO,GAAGI,KAAKC,IAAIL,EAAM,OAC9C/U,KAAKsmH,KAAKC,KAAKxyG,MAAMU,MAAQ,GAAGU,KAAKC,IAAIX,EAAO,MACjD,CAEAzU,KAAKkpH,cAAclpH,KAAKsmH,KAAKI,YAAasC,EAAchpH,KAAKmoH,aAAanoH,KAAK4wD,OAAOv/C,OACtFrR,KAAKkpH,cAAclpH,KAAKsmH,KAAKK,UAAWsC,EAAYjpH,KAAKmoH,aAAanoH,KAAK4wD,OAAOz6B,KAClFn2B,KAAKmpH,cAAcH,EAAcC,GAE7BjpH,KAAKsmH,KAAKO,YAAW7mH,KAAKsmH,KAAKO,UAAUhuG,YAAc7Y,KAAKmoH,aAAanoH,KAAK4wD,OAAOv/C,OACrFrR,KAAKsmH,KAAKQ,UAAS9mH,KAAKsmH,KAAKQ,QAAQjuG,YAAc7Y,KAAKmoH,aAAanoH,KAAK4wD,OAAOz6B,KACjFn2B,KAAKsmH,KAAKS,iBAAgB/mH,KAAKsmH,KAAKS,eAAeh1E,QAAU/xC,KAAKkmH,UAEtElmH,KAAKopH,eDrRqBC,EAAC5D,EAAM7sG,EAAO8rG,KACzC,IAAKe,EACJ,OAGD,GAAkB,WAAdA,EAAKz5G,KAGR,OAFA84G,GAAkBW,EAAK/lH,KAAM+kH,GAAkBC,EAAQ3hH,OAAQ6V,EAAO8rG,QA9C/C4E,EAACvmH,EAAQ6V,EAAO8rG,KACxC,MAAMmC,EAAYnC,GAAS6E,KAAK1C,UAC1BC,EAAUpC,GAAS6E,KAAKzC,QACxB0C,EAAYxE,GAAmBjiH,EAAQshH,GAAyBzrG,EAAMvH,KAAMtO,EAAQ6V,IACpF6wG,EAAUzE,GAAmBjiH,EAAQshH,GAAyBzrG,EAAMud,GAAIpzB,EAAQ6V,IAElFiuG,GAAa2C,IAChB3C,EAAUhuG,YAAc2wG,GAGrB1C,GAAW2C,IACd3C,EAAQjuG,YAAc4wG,EACvB,EAmCCH,CAAiB5E,EAAQ3hH,OAAQ6V,EAAO8rG,GAIzC,GAAkB,UAAde,EAAKz5G,KACR,OAGD,MAAM44G,EAAUhsG,EAAMvH,OAASuH,EAAMud,IAAMuuF,EAAQE,QAEnDa,EAAKwC,MAAM7lH,SAAQ,CAACsnH,EAAMxnG,KACzB,MAAMhe,EAAQuhH,EAAKxhH,OAAOie,GACpB2jF,EAAW+e,EACd1gH,GAAS0U,EAAMvH,MAAQnN,GAAS0U,EAAMud,GACtCjyB,GAAS0U,EAAMvH,KAElBq4G,EAAKvoH,UAAUsf,OAAO,YAAaolF,EAAS,GAC3C,EC8PDwjB,CAAoBrpH,KAAKsmH,KAAKb,KAAMzlH,KAAK4wD,OAAQ,CAChDg0D,QAAS5kH,KAAKkmH,SACdnjH,OAAQ/C,KAAKa,QACb0oH,IAAKvpH,KAAKsmH,MAEZ,CAEA8C,YAAAA,GACC,MAAMnlH,EAASjE,KAAKonH,YACb/1G,EAAM8kB,GAAM/kB,MAAMiP,QAAQpc,GAAUA,EAAS,CAACA,EAAQA,GAEzDjE,KAAKsmH,KAAKU,YACbhnH,KAAKsmH,KAAKU,UAAU9iH,MAAQsC,OAAO6K,IAGhCrR,KAAKsmH,KAAKW,YACbjnH,KAAKsmH,KAAKW,UAAU/iH,MAAQsC,OAAO2vB,IAGpCn2B,KAAK2pH,SAAS3pH,KAAKa,QAAQ2D,QAAQF,OAAQtE,KAAKkmH,SAAW,GAAGlmH,KAAKmoH,aAAa92G,KAAQrR,KAAKa,QAAQ2kH,YAAYxlH,KAAKmoH,aAAahyF,KAAQn2B,KAAKmoH,aAAa92G,IAC7JrR,KAAK2pH,SAAS3pH,KAAKa,QAAQ2D,QAAQkR,IAAK1V,KAAKmoH,aAAa92G,IAC1DrR,KAAK2pH,SAAS3pH,KAAKa,QAAQ2D,QAAQ4Q,IAAKpV,KAAKmoH,aAAahyF,GAC3D,CAEAgxF,iBAAAA,CAAkBvuG,GACjB5Y,KAAKa,QAAQqzB,WAAatb,EACtB5Y,KAAKsmH,KAAK5mH,MACbM,KAAKsmH,KAAK5mH,KAAKyB,UAAUsf,OAneA,WAme4BzgB,KAAKa,QAAQqzB,UAGnE,CAACl0B,KAAKsmH,KAAKE,UAAWxmH,KAAKsmH,KAAKG,SAASxkH,OAAO8V,SAAS3V,SAASkpB,IACjEA,EAAM4I,SAAWl0B,KAAKa,QAAQqzB,QAAQ,GAExC,CAEAg1F,aAAAA,CAAc5gG,EAAMsqE,EAAS1uF,GACvBokB,IACLA,EAAKzP,YAAc3U,EACnBokB,EAAKvU,MAAMgB,KAAO,GAAG69E,MACtB,CAEAu2B,aAAAA,CAAcH,EAAcC,GAC3B,MAAMW,EAAgB5pH,KAAKsmH,KAAKM,cAC1BiD,EAAc7pH,KAAKsmH,KAAKI,YACxBoD,EAAY9pH,KAAKsmH,KAAKK,UAE5B,OAAK3mH,KAAKkmH,UAAa0D,GAAkBC,GAAgBC,EAUlCb,EAAaD,GAFda,EAAYn1G,YAAc,EAC5Bo1G,EAAUp1G,YAAc,EAFhC,GAYZm1G,EAAY1oH,UAAUC,IAAI+jH,IAC1B2E,EAAU3oH,UAAUC,IAAI+jH,IACxByE,EAAczoH,UAAUG,OAAO6jH,IAC/ByE,EAAc/wG,YAAc,GAAG7Y,KAAKmoH,aAAanoH,KAAK4wD,OAAOv/C,QAAQrR,KAAKa,QAAQ2kH,YAAYxlH,KAAKmoH,aAAanoH,KAAK4wD,OAAOz6B,WAC5HyzF,EAAc71G,MAAMgB,MAAWi0G,EAAeC,GAAc,EAAjC,QAV1BY,EAAY1oH,UAAUG,OAAO6jH,IAC7B2E,EAAU3oH,UAAUG,OAAO6jH,SAC3ByE,EAAczoH,UAAUC,IAAI+jH,MAdxB0E,GAAaA,EAAY1oH,UAAUG,OAAO6jH,IAC1C2E,GAAWA,EAAU3oH,UAAUG,OAAO6jH,SACtCyE,GAAeA,EAAczoH,UAAUC,IAAI+jH,KAqBjD,CAEA4D,UAAAA,CAAW7kH,GACV,MAAMohH,EAAQtlH,KAAK4wD,OAAOx7C,IAAMpV,KAAK4wD,OAAOl7C,IAC5C,OAAI4vG,GAAS,EAAU,GACdphH,EAAQlE,KAAK4wD,OAAOl7C,KAAO4vG,EAAS,GAC9C,CAEA8C,aAAAA,CAAclkH,GACb,MAAMwb,EAAU1f,KAAKsmH,MAAM5mG,QACrB4lG,EAAQtlH,KAAK4wD,OAAOx7C,IAAMpV,KAAK4wD,OAAOl7C,IAC5C,IAAKgK,GAAW4lG,GAAS,EAAG,OAAO,EAEnC,MAAM1yB,GAAW1uF,EAAQlE,KAAK4wD,OAAOl7C,KAAO4vG,EACtCyE,EAAS11F,iBAAiBr0B,KAAKsmH,KAAK5mH,MAAQggB,GAC5CsqG,EAAYl1G,WAAWi1G,EAAOhwF,iBAAiB,kCAAoC,EACnFtlB,EAAQiL,EAAQ2Z,aAAe,EAErC,OAAI5kB,GAAS,EAAU,EACnBA,GAASu1G,EAAkBv1G,EAAQ,EAE/Bm+E,GAAWn+E,EAAQu1G,GAAeA,EAAY,CACvD,CAEAzC,eAAAA,CAAgBrjH,EAAO4vC,EAAUp+B,EAAM1V,KAAK4wD,QAAQl7C,KAAO,EAAGN,EAAMpV,KAAK4wD,QAAQx7C,KAAO,KACvF,MAAM67D,EAAUp8D,QAAO7P,EAAAA,EAAAA,IAAcd,IAC/B+lH,EAAYp1G,OAAOI,SAASg8D,GAAWA,EAAUn9B,EACjDo2E,EAAU/0G,KAAKO,IAAIP,KAAKC,IAAI60G,EAAWv0G,GAAMN,GAC7C2pE,EAAO/+E,KAAK4wD,QAAQmuB,MAAQ/+E,KAAKa,QAAQk+E,MAAQ,EACjDorC,EAAUh1G,KAAK2D,OAAOoxG,EAAUx0G,GAAOqpE,GAAQA,EAAOrpE,EAC5D,OAAOb,OAAOs1G,EAAQhyE,QAAQ,GAC/B,CAEAgwE,YAAAA,CAAajkH,GACZ,MAAwC,mBAA7BlE,KAAKa,QAAQilH,YAChB9lH,KAAKa,QAAQilH,YAAY19G,KAAKpI,KAAMkE,EAAOlE,KAAKW,UAMjD,GAH+B,MAAvBX,KAAKa,QAAQ4hD,OAAiB,GAAKj8C,OAAOxG,KAAKa,QAAQ4hD,UAGnDv+C,IAFmB,MAAvBlE,KAAKa,QAAQwrG,OAAiB,GAAK7lG,OAAOxG,KAAKa,QAAQwrG,SAGvE,CAEA+d,YAAAA,GACC,GAAwC,iBAA7BpqH,KAAKa,SAASiE,QAAQ+/G,GAChC,MAAO,KAGR,MAAMA,EAAK7kH,KAAKa,QAAQiE,OAAO+/G,GAAGr/G,cAClC,MAAO,CAAC,OAAQ,KAAM,OAAOkG,SAASm5G,GAAMA,EAAK,IAClD,CAEAwF,wBAAAA,CAAyBnmH,GACxB,MAAMohH,EAAQtlH,KAAK4wD,OAAOx7C,IAAMpV,KAAK4wD,OAAOl7C,IAC5C,OAAI4vG,GAAS,EACL,GAGCphH,EAAQlE,KAAK4wD,OAAOl7C,KAAO4vG,EAAS,GAC9C,CAEAgF,qBAAAA,CAAsBpmH,GACrB,MAAM0uF,EAAU5yF,KAAKqqH,yBAAyBnmH,GACxCogH,EAAezvG,OAAO7U,KAAKa,SAASiE,QAAQw/G,cAC5CC,EAAc1vG,OAAO7U,KAAKa,SAASiE,QAAQy/G,aAC3CC,EAAmB3vG,OAAOI,SAASqvG,GAAgBA,EAAe,GAGxE,OAAI1xB,GAFoB/9E,OAAOI,SAASsvG,GAAeA,EAAc,IAG7D,SAGJ3xB,EAAU4xB,EACN,UAGD,SACR,CAEA+F,qBAAAA,CAAsBxF,GACrB,OAAK3zG,MAAMiP,QAAQrgB,KAAKa,SAASokH,aAAejlH,KAAKa,QAAQokH,WAAW72G,OAAS,EACzE,KAGK,WAAT22G,EACI/kH,KAAKa,QAAQokH,WAAW,IAAM,KAGzB,YAATF,EACI/kH,KAAKa,QAAQokH,WAAW,IAAM,KAG/BjlH,KAAKa,QAAQokH,WAAW,IAAM,IACtC,CAEAuF,gBAAAA,GACC,MAAM3F,EAAK7kH,KAAKoqH,eACVK,EAAYzqH,KAAK4wD,OAAOv/C,KACxBq5G,EAAU1qH,KAAK4wD,OAAOz6B,GACtBw0F,EAAqB,SAAP9F,EACjB4F,EACO,QAAP5F,GACE4F,EAAYC,GAAW,EACxBA,EACE3F,EAAO/kH,KAAKsqH,sBAAsBK,GAExC,MAAO,CACN9F,KACA8F,cACA/3B,QAAS/9E,OAAO7U,KAAKqqH,yBAAyBM,GAAaxyE,QAAQ,IACnE4sE,OACAt5F,MAAOzrB,KAAKuqH,sBAAsBxF,GAClC1zG,KAAM,CACLnN,MAAOumH,EACP73B,QAAS/9E,OAAO7U,KAAKqqH,yBAAyBI,GAAWtyE,QAAQ,IACjE4sE,KAAM/kH,KAAKsqH,sBAAsBG,GACjCh/F,MAAOzrB,KAAKuqH,sBAAsBvqH,KAAKsqH,sBAAsBG,KAE9Dt0F,GAAI,CACHjyB,MAAOwmH,EACP93B,QAAS/9E,OAAO7U,KAAKqqH,yBAAyBK,GAASvyE,QAAQ,IAC/D4sE,KAAM/kH,KAAKsqH,sBAAsBI,GACjCj/F,MAAOzrB,KAAKuqH,sBAAsBvqH,KAAKsqH,sBAAsBI,KAGhE,CAEAjvD,KAAAA,CAAMmH,EAAWD,GAChB,MAAM/wC,EAAS,CACd1tB,MAAOlE,KAAKonH,WACZ/1G,KAAMrR,KAAK4wD,OAAOv/C,KAClB8kB,GAAIn2B,KAAK4wD,OAAOz6B,GAChBzgB,IAAK1V,KAAK4wD,OAAOl7C,IACjBN,IAAKpV,KAAK4wD,OAAOx7C,IACjB2pE,KAAM/+E,KAAK4wD,OAAOmuB,KAClBj6E,OAAQ9E,KAAKwqH,mBACbjqG,SAAUvgB,MAGXwB,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUiiE,EAAWhxC,GAE/C,MAAMruB,EAAWvD,KAAKa,QAAQ8hE,GACN,mBAAbp/D,GACVA,EAAS6E,KAAKpI,KAAMA,KAAKW,SAAUixB,EAErC,CAEA+3F,QAAAA,CAAS/3G,EAAU1N,GAClB,IAAK0N,EAAU,OACf,MAAMtN,EAAS/B,EAAAA,EAAUC,KAAKoP,GAC1BtN,IAAQA,EAAOuU,YAAc3U,EAClC,EAGD1C,EAAAA,EAAaC,GAAG4L,SAAU,oBAAoB,KAC7C9K,EAAAA,EAAUqf,QA9qBkB,wBA8qBYxf,SAAS5B,IAC3CA,EAAQ4T,QAAQw2G,2BACpB7E,GAAch+G,oBAAoBvH,GAClCA,EAAQ4T,QAAQw2G,yBAA2B,OAC5C,GACC,IAGH,MC7rBA,GD6rBA,GE9pBMtiH,GAAO,SACPzF,GAAW,YACXyZ,GAAkB,OAClBq2F,GAAkB,0BAGlB71F,GAAiB,GAAGja,UACpBma,GAAiB,GAAGna,UACpBua,GAA2B,SAASva,cAE1C,MAAMgoH,WAAiBtsG,EAAAA,EA6BtBhe,WAAAA,CAAYC,EAASuC,EAAS,CAAC,GAC9Byb,MAAMhe,EAASuC,GAEf,MAAM0a,EAAgB,CACrBojB,KAAMxzB,SAASulB,gBAAgBiO,MAAQ,KACvCzgB,QAAS,OACT0qG,IAAK,EACLnuG,MAAM,EACNpF,YAAY,EACZgmE,QAAQ,EACR/sE,OAAQ,EACR86C,SAAU,CACT+5B,KAAM,MAEP0lC,KAAM,QACNzjH,OAAQ,CACPmnC,SAAS,EACTs8E,KAAM,WACNC,KAAM,WACN34F,QAAS,IAEVo8B,UAAW,CACVvmD,KAAMA,OACN+sG,OAAQA,OACR9E,SAAUA,SAIZ,IAAItvE,EAAOlZ,EAAAA,EAAY1kB,IAAIzC,EAAS,cAAiB,SAAUuC,EAAUA,EAAO89B,KAAOpjB,EAAcojB,KAGrGpjB,EAAcnW,OAAOyjH,KAAO7pF,GAAaL,EAAMv4B,IAAY,KAC3DmV,EAAcnW,OAAO0jH,KAAO9pF,GAAaL,EAAMv4B,IAAY,KAC3DmV,EAAcstG,KAAc7pF,GAAaL,EAAMv4B,IAAY,KAG3DtI,KAAKa,QAAUb,KAAK8C,WAAWtC,GAASM,EAAAA,EAAAA,IAAgB2c,EAAe1a,IAYvE/C,KAAKqyB,QAAU,CACdM,UAAW,YACXof,OAAQ,4BACRp1B,KAAM,0BACN2uC,SAAU,8BACVhkD,OAAQ,4BACRiQ,WAAY,iCAObvX,KAAKgnB,MAAQ,EAMbhnB,KAAK69D,MAAQ,EAMb79D,KAAK8hB,OAAS,EAMd9hB,KAAKirH,UAAW,EAEhBjrH,KAAKsf,OACN,CAMA,eAAWhX,GAAS,OAAOA,EAAM,CAMjC,mBAAWzF,GAAa,OAAOA,EAAU,CAUzC,aAAO4d,CAAOnc,EAAQoc,GACrB,MAAMH,EAAWsqG,GAAS9iH,oBAAoBzD,GAC9Bic,EAASmsF,SAKxBnsF,EAAS2qG,MAAMxqG,GAFfH,EAAS4qG,MAAMzqG,EAIjB,CAOAyqG,KAAAA,CAAMzqG,GACL0R,EAAAA,EAAQhxB,IAAIpB,KAAKW,SAAU2b,IAC3BoE,EAAc5c,UAAY9D,KAAKa,QAAQyG,OAAO0jH,KAC9CrjG,EAAAA,EAAY/kB,IAAI8d,EAAe,gBAAiB,QAE5C1gB,KAAK8hB,OAAS,IACjBpB,EAAc5c,UAAY9D,KAAKirH,SAAWjrH,KAAKa,QAAQyG,OAAOyjH,KAAO/qH,KAAKa,QAAQyG,OAAO0jH,KACzFrjG,EAAAA,EAAY/kB,IAAI8d,EAAe,gBAAiB1gB,KAAKirH,SAAW,OAAS,UAG1EjrH,KAAKorH,OAAOprH,KAAKW,UAAU,GAC3Ba,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUqc,GAAgB,CAAE0D,iBACvD,CAOAwqG,KAAAA,CAAMxqG,GACL,IAAI4yF,EAAatzG,KAAKa,QAAQyG,OAAOyjH,KAGrC,GAFkB/qH,KAAKa,QAAQ08E,OAEhB,CACd,MAAMv7D,EAAMhiB,KAAKgnB,MAAQhnB,KAAK69D,MAC1B77C,EAAM,IACTsxF,GAActzG,KAAKa,QAAQkqH,KAAO/oG,EAEpC,CAEAoQ,EAAAA,EAAQ9wB,OAAOtB,KAAKW,SAAU2b,IAC9BqL,EAAAA,EAAY/kB,IAAI8d,EAAe,gBAAiB,SAChDA,EAAc7H,YAAcy6F,EAE5BtzG,KAAKorH,OAAOprH,KAAKW,UAAU,GAC3Ba,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUmc,GAAgB,CAAE4D,iBACvD,CASApB,KAAAA,CAAMhO,EAAK,KAAM+5G,GAAiB,GACjC,MAAM7qH,EAAU8Q,GAAMtR,KAAKW,SACrB2qH,EAAa9qH,EAAQyhB,aACrBspG,EAAYvrH,KAAKa,QAAQ2P,QAAW86G,EAAa,GAEjD,KACL3uG,EAAI,WACJpF,EAAU,OACVjQ,EACAi2E,OAAQiuC,EAAO,QACfprG,EACAsf,SAAU+rF,EAAY,IACtBX,EACAx/D,SAAUogE,GACP1rH,KAAKa,QAEH8qH,EAAkC,OAArBD,EAAYrmC,KACzBumC,EAAWtkH,EAAOmnC,SAAW48E,EAEnCj5F,EAAAA,EAAQhxB,IAAIZ,EAASR,KAAKqyB,QAAQM,WAE7B04F,GAKW,SAAZjrG,GAAsBkrG,EAAaC,EACtCvrH,KAAK6rH,kBAAkBrrH,EAAS+qH,EAAW5uG,EAAMpF,EAAYo0G,EAAYD,EAAYrmC,KAAMumC,EAAUJ,GAC/E,aAAZprG,GACVpgB,KAAK8rH,sBAAsBtrH,EAASirH,EAAcX,EAAKnuG,EAAMpF,EAAYo0G,EAAYC,EAAUJ,IAGhGvmH,EAAAA,EAAAA,IAAQjF,KAAKa,QAAQ4tD,UAAUvmD,KAAM,CAAC1H,EAASR,QAV9CA,KAAKorH,OAAO5qH,EAWd,CAcAqrH,iBAAAA,CAAkBrrH,EAASgQ,EAAQmM,EAAMpF,EAAYo0G,EAAYtmC,EAAMumC,EAAUJ,GAChFp5F,EAAAA,EAAQhxB,IAAIZ,EAASR,KAAKqyB,QAAQ0f,QAClCvxC,EAAQuT,MAAMvD,OAASA,EAAS,KAE5Bm7G,GAActmC,GACjBjzD,EAAAA,EAAQhxB,IAAIZ,EAASR,KAAKqyB,QAAQi5B,UAClC9qD,EAAQuT,MAAMg4G,UAAal3G,OAAOwwE,IACxBsmC,GACV19G,QAAQmB,MAAM,oEAGXmI,GAAY6a,EAAAA,EAAQhxB,IAAIZ,EAASR,KAAKqyB,QAAQ9a,YAC9CoF,GAAMyV,EAAAA,EAAQhxB,IAAIZ,EAASR,KAAKqyB,QAAQ1V,MAExCivG,GAAU5rH,KAAKojC,cAAc5iC,EAAS,GAAIgrH,EAC/C,CAcAM,qBAAAA,CAAsBtrH,EAASirH,EAAcX,EAAKnuG,EAAMpF,EAAYo0G,EAAYC,EAAUJ,GACzF,MAAM1/F,EAAQvpB,EAAAA,EAAUqf,QAAQ,IAAM6pG,EAAcjrH,GACpDR,KAAKgnB,MAAQ8E,EAAM1d,OACnBpO,KAAK69D,MAAQitD,EAEbh/F,EAAM1pB,SAAQ,CAAC0N,EAAMoS,KAChBA,GAAS4oG,GACZ14F,EAAAA,EAAQhxB,IAAI0O,EAAM6iG,GACnB,IAGD,MAAMqZ,EAAmBJ,GAAY9/F,EAAM1d,OAAS08G,EAMpD,GAJIa,GAAYv5F,EAAAA,EAAQhxB,IAAIZ,EAASR,KAAKqyB,QAAQi5B,UAC9C/zC,GAAY6a,EAAAA,EAAQhxB,IAAIZ,EAASR,KAAKqyB,QAAQ9a,YAC9CoF,GAAMyV,EAAAA,EAAQhxB,IAAIZ,EAASR,KAAKqyB,QAAQ1V,MAExCqvG,EAAkB,CACrB,MAAMhqG,EAAMhiB,KAAKgnB,MAAQhnB,KAAK69D,MACxBouD,EAAcT,GAAWxpG,EAAM,EAAIhiB,KAAKa,QAAQkqH,KAAO/oG,EAAM,GACnEhiB,KAAKojC,cAAc5iC,EAASyrH,GAAa,EAC1C,CACD,CASA7oF,aAAAA,CAAc5iC,EAAS0rH,EAAU,GAAIV,GAAU,GACzChrH,EAAQgR,KACZhR,EAAQgR,GAAK,aAAa2D,KAAK6gB,SAAS5R,SAAS,IAAI2+E,OAAO,EAAG,MAGhE,MAAMopB,EAAcnsH,KAAKa,QAAQyG,OAAOyjH,KAClCqB,EAAU,eAAepsH,KAAKqyB,QAAQ/qB,0FACiCtH,KAAKa,QAAQyG,OAAO+qB,6BAA6B7xB,EAAQgR,yBACtH26G,IAAcD,sCAI9B1rH,EAAQgH,mBAAmB,WAAY4kH,EACxC,CAUAhB,OAAO95G,EAAI+6G,GAAW,GACrB,GAAIA,IAAarsH,KAAKirH,SAAU,CAC/B,MAAM,QAAE7qG,GAAYpgB,KAAKa,QACnByqH,EAAah6G,EAAG2Q,aAChBspG,EAAYvrH,KAAKa,QAAQ2P,QAAU86G,EAAa,EAEtD,GAAgB,SAAZlrG,GAAsBkrG,EAAaC,EACtCn5F,EAAAA,EAAQhxB,IAAIkQ,EAAItR,KAAKqyB,QAAQ0f,QAC7BzgC,EAAGyC,MAAMvD,OAAS+6G,EAAY,KAE1BvrH,KAAKa,QAAQyqD,SAAS+5B,OACzBjzD,EAAAA,EAAQhxB,IAAIkQ,EAAItR,KAAKqyB,QAAQi5B,UAC7Bh6C,EAAGyC,MAAMg4G,UAAY/rH,KAAKa,QAAQyqD,SAAS+5B,MAGxCrlF,KAAKa,QAAQ8b,MAAMyV,EAAAA,EAAQhxB,IAAIkQ,EAAItR,KAAKqyB,QAAQ1V,MAChD3c,KAAKa,QAAQ0W,YAAY6a,EAAAA,EAAQhxB,IAAIkQ,EAAItR,KAAKqyB,QAAQ9a,aAE1DtS,EAAAA,EAAAA,IAAQjF,KAAKa,QAAQ4tD,UAAUwmD,OAAQ,CAAC3jG,EAAItR,YACtC,GAAgB,aAAZogB,EAAwB,CAClC,MAAM0L,EAAQvpB,EAAAA,EAAUqf,QAAQ,IAAM5hB,KAAKa,QAAQ6+B,SAAUpuB,GAC7Dwa,EAAM1pB,SAAQ,CAAC0N,EAAMoS,KAChBA,GAASliB,KAAK69D,OACjBzrC,EAAAA,EAAQhxB,IAAI0O,EAAM6iG,GACnB,KAGD1tG,EAAAA,EAAAA,IAAQjF,KAAKa,QAAQ4tD,UAAU0hD,SAAU,CAAC7+F,EAAIwa,EAAO9rB,MACtD,CAEAoyB,EAAAA,EAAQhxB,IAAIkQ,EAAItR,KAAKqyB,QAAQM,UAC9B,KAAO,CACN,MAAM,OAAEof,EAAM,SAAEuZ,EAAQ,KAAE3uC,GAAS3c,KAAKqyB,QACxCD,EAAAA,EAAQ9wB,OAAOgQ,EAAI,CAACygC,EAAQuZ,EAAU3uC,IACtCgL,EAAAA,EAAYrmB,OAAOgQ,EAAI,SAEM,aAAzBtR,KAAKa,QAAQuf,SACF7d,EAAAA,EAAUqf,QAAQ,IAAM5hB,KAAKa,QAAQ6+B,SAAUpuB,GACvDlP,SAAQ0N,GAAQsiB,EAAAA,EAAQ9wB,OAAOwO,EAAM6iG,OAG5C1tG,EAAAA,EAAAA,IAAQjF,KAAKa,QAAQ4tD,UAAUwmD,OAAQ,CAAC3jG,EAAItR,MAC7C,CACD,CAQA0sG,MAAAA,GACC,OAAOt6E,EAAAA,EAAQtJ,IAAI9oB,KAAKW,SAAU2b,GACnC,CAaA,WAAOpU,CAAK1H,EAASuC,EAAS,CAAC,EAAGQ,GACjC,MAAMgd,EAAWsqG,GAAS9iH,oBAAoBvH,EAASuC,IACvDkC,EAAAA,EAAAA,IAAQ1B,EAAU,CAACgd,GACpB,EAQD/e,EAAAA,EAAaC,GAAG4L,SAAU+P,GAvZG,6BAuZ6C,SAAU9P,GAKnF,GAJI,CAAC,IAAK,QAAQ5B,SAAS1L,KAAKuN,UAC/BD,EAAME,kBAGHC,EAAAA,EAAAA,IAAWzN,MAAO,OAEtB,MAAMsE,EAAS/B,EAAAA,EAAU8gB,uBAAuBrjB,MAC3CsE,GAELumH,GAASpqG,OAAOnc,EAAQtE,KACzB,IAEA,MCvcA,GDucA,GEncM6C,GAAW,YAGXwkG,GAA4B,YAG5BilB,GAA4B,yBAG5BC,GAA4B,gBAC5BC,GAA4B,uBAE5BrlF,GAA4B,SAAStkC,cACrC4pH,GAA4B,SAAS5pH,cACrC6pH,GAA4B,SAAS7pH,cACrCqkC,GAA4B,WAAWrkC,cAEvCg2G,GAA4B,GAAGh2G,YAC/B8pH,GAA4B,GAAG9pH,YAC/B+pH,GAA4B,GAAG/pH,YAC/BgqH,GAA4B,GAAGhqH,cAE/B0gC,GAA4B,4BCf5Bj7B,GAAO,SACPzF,GAAW,YAEXyZ,GAA4B,OAC5Bi4F,GAA4B,SAC5BlN,GAA4B,YAC5BylB,GAA4B,qBAC5BC,GAA4B,iBAC5BT,GAA4B,yBAG5BU,GAA4B,oBAC5BC,GAA4B,iCAC5BC,GAA4B,mBAC5BC,GAA4B,iBAC5BZ,GAA4B,gBAE5Ba,GAA4B,sBAC5B3lB,GAA4B,oBAC5B4lB,GAA4B,UAE5BxU,GAA4B,GAAGh2G,YAC/Bia,GAA4B,GAAGja,UAC/Bka,GAA4B,GAAGla,YAC/Bma,GAA4B,GAAGna,UAC/Boa,GAA4B,GAAGpa,WAC/Bm2G,GAA4B,GAAGn2G,UAC/ByqH,GAA4B,GAAGzqH,aAC/B0qH,GAA4B,GAAG1qH,UAC/B2qH,GAA4B,GAAG3qH,WAC/B+pH,GAA4B,GAAG/pH,YAC/B4qH,GAA4B,GAAG5qH,WAC/B6qH,GAA4B,GAAG7qH,WAC/B8qH,GAA4B,GAAG9qH,cAE/B0gC,GAA4B,4BAC5BqqF,GAA4B,IAAIZ,KAChCa,GAA4B,IAAIf,KAChCgB,GAA4B,IAAIZ,WAChCa,GAA4B,IAAIhB,KAChCiB,GAA4B,IAAIZ,KAChCa,GAAiC,CAAC,SAAU,WAAY,WAO9D,MAAMC,WAAiB3vG,EAAAA,EAMtBhe,WAAAA,CAAYC,EAASuC,EAAS,CAAC,GAC9Byb,MAAMhe,EAASuC,GAEf/C,KAAKa,QAAUb,KAAK8C,WAAWtC,GAASM,EAAAA,EAAAA,IAAgB,CACvD+/B,KAAMxzB,SAASulB,gBAAgBiO,MAAQ,KAMvCjqB,SAAU,OACV4mB,OAAQ,CACPiR,SAAS,EACTrqC,MAAO,GACP+pH,QAAQ,EACRtwG,MAAO,IACPuwG,QAAS,EACTh0E,YAAY,EACZi0E,UAAW,OACXC,UAAW,IACXC,QAAS,GACTC,aAAc,iBAEfjtC,OAAO,EACPktC,MAAM,EACNC,QAAS,oBACTrL,YAAa,GACb30D,OAAQ,KACRigE,OAAQ,KACRC,OAAQ,KACR7iE,SAAU,KACV8iE,SAAU,KACVC,WAAY,KACZzmB,QAAS,KACT0mB,WAAY,MACVhsH,IAEH/C,KAAKga,UAAY,KACjBha,KAAKgvH,iBAAmB,KACxBhvH,KAAKynC,MAAQllC,EAAAA,EAAUC,KAAKqrH,GAAmB7tH,KAAKW,UACpDX,KAAKivH,YAAc,GACnBjvH,KAAKkvH,aAAe,EACpBlvH,KAAKmvH,YAAc,KACnBnvH,KAAKovH,UAAW,EAEa,iBAAlBrsH,EAAOy6B,SACjBx9B,KAAKa,QAAQ28B,OAAOgxF,aAAettF,GAAalhC,KAAKa,QAAQggC,KAAMv4B,IAAM,cAAgB,iBAG1FtI,KAAKqvH,uBAAyB,EAC9BrvH,KAAKsvH,6BAA+B,KAEpCtvH,KAAKuvH,yBAA2B,KAChCvvH,KAAKwvH,8BAAgC,IAAMxvH,KAAKyvH,2BAEhDzvH,KAAK0vH,gBACL1vH,KAAK2vH,sBAEL3vH,KAAK0pG,cAAcsP,IACnBh5G,KAAK4vH,cAAc,SACpB,CAMA,eAAWtnH,GACV,OAAOA,EACR,CAMA,mBAAWzF,GACV,OAAOA,EACR,CAQA,uBAAOgtH,CAAiBj+G,EAAU0zB,EAAMviC,EAAS,CAAC,GACjD,IAAI2L,EAAO42B,EAAK/9B,cAAc,IAAIwlH,MAC7Br+G,EAKJA,EAAK5K,UAAY,IAJjB4K,EAAOrB,SAAS2K,cAAc,MAC9Boa,EAAAA,EAAQhxB,IAAIsN,EAAMq+G,IAClBznF,EAAKhb,YAAY5b,IAKlB,MAAMohH,EAAYvtH,EAAAA,EAAUqf,QAAQ,WAAYhQ,GAC1CoqF,EAAW3uF,SAAS4uF,yBACpB8zB,EAAS/vH,KAAKgwH,eAAep+G,EAAU7O,GA0B7C,OAxBI+sH,EAAU1hH,OAAS,GACtB0hH,EAAU1tH,SAAQ6tH,IACjB,MAAMhkG,EAAK5e,SAAS2K,cAAc,MAClCoa,EAAAA,EAAQhxB,IAAI6qB,EAlJkB,4BAoJ9B,MAAMR,EAAQpe,SAAS2K,cAAc,MACrCyT,EAAM5S,YAAco3G,EAASxkG,MAAMhlB,OACnC2rB,EAAAA,EAAQhxB,IAAIqqB,EArJkB,kCAsJ9BQ,EAAG3B,YAAYmB,GAEfyiG,GAASgC,iBAAiB3tH,EAAAA,EAAUqf,QAAQ,SAAUquG,GAAWhkG,EAAIra,EAAU,CAC9E68G,KAAMsB,EACN71D,MAAO61D,EAAS,EAAI,IAErB/zB,EAAS1xE,YAAY2B,EAAG,IAEzBvd,EAAK4b,YAAY0xE,IAEjBkyB,GAASgC,iBAAiBt+G,EAASjM,QAAS+I,EAAMkD,EAAU,CAC3D68G,KAAMsB,EACN71D,MAAO,IAIFxrD,CACR,CASA,uBAAOwhH,CAAiBvqH,EAAS6tB,EAAQ5hB,EAAUhM,EAAS,CAAC,GAC5D,MAAMuqH,EAAO9iH,SAAS4uF,yBAChBm0B,EAAYv7G,OAAOw0B,UAAUzjC,EAAOs0D,OAASt0D,EAAOs0D,MAAQ,EAC5Dm2D,IAAgBzqH,EAAO6oH,KAE7B,IAAI9oH,GAASvD,SAAS8nB,IACrB,GAAIA,EAAO6nB,OAAQ,OAGnB,MAAMu+E,EAAepmG,EAAO3Y,aAAa,SACnCrN,EAAwB,MAAhBosH,EAAuB,GAAKA,EACpCjxG,EAAO6K,EAAOrR,YAAYpS,OAC1B8pH,EAA0B,KAAVrsH,GAAyB,KAATmb,EAEhC5P,EAAKpC,SAAS2K,cAAc,MAMlC,GALAvI,EAAGoJ,YAAcwG,EACjB5P,EAAG2E,QAAQ8N,MAAQ1b,OAAO0jB,EAAOhI,OACjCzS,EAAG2E,QAAQlQ,MAAQA,EACnBuL,EAAGtO,UAAUC,IAAIkrH,IACjB3kG,EAAAA,EAAY/kB,IAAI6M,EAAI,iBAAkB,iBAClC4gH,EAAa,CAChB,MAAMG,EAAiBtmG,EAAO9V,QAAQwxE,MAChC6qC,EAAc57G,OAAOI,SAASJ,OAAO27G,IAAmBnkF,SAASmkF,EAAgB,IAAM,KACvF5qC,EAAQzwE,KAAKC,IAAI,EAAkB,MAAfq7G,EAAsBL,EAAYK,GAC5DhhH,EAAG2E,QAAQwxE,MAAQp/E,OAAOo/E,GAC1Bn2E,EAAGsE,MAAMqrB,YAAiB,GAAc,GAARwmD,EAAT,IACxB,CAKI17D,EAAOkb,UACV31B,EAAGtO,UAAUC,IAAI,YAGd8oB,EAAOgK,UACVzkB,EAAGtO,UAAUC,IAAI,YAGdmvH,IACH9gH,EAAGsiC,QAAS,EACZtiC,EAAGsE,MAAM4E,QAAU,QAGpB,MAAMsZ,EAAYtK,EAAAA,EAAY1kB,IAAIinB,IAC7BlmB,EAAAA,EAAAA,IAAWiuB,IACf7uB,OAAOwgB,KAAKqO,GAAW7vB,SAAQ3B,IAC9BknB,EAAAA,EAAY/kB,IAAI6M,EAAI,QAAQhP,IAAOwxB,EAAUxxB,GAAK,IAIpD0vH,EAAK7lG,YAAY7a,EAAG,IAGrB+jB,EAAOlJ,YAAY6lG,EACpB,CAEA,qBAAOH,CAAep+G,EAAU7O,EAAS,CAAC,GACzC,MAA2B,kBAAhBA,EAAO0rH,KAA2B1rH,EAAO0rH,QAChD78G,GAAUwC,cAA4C,IAA1BxC,EAASwC,QAAQq6G,QACA,KAAzCzpH,EAAAA,EAAAA,IAAc4M,EAASwC,QAAQq6G,KAIxC,CAEA,iCAAOiC,CAA2B9+G,EAAU7O,EAAS,CAAC,GACrD,MAGM4tH,GAHuC,iBAAnB5tH,EAAO2rH,QAC9B3rH,EAAO2rH,QACN98G,EAASwC,QAAQs6G,SAAW,IAE9BljH,MAAM,KACN8C,KAAIwB,GAAQ9P,KAAK4wH,sBAAsB9gH,KACvC7N,OAAO8V,SAET,OAAO,IAAIhH,IAAI,IAAIk9G,MAAmC0C,GACvD,CAEA,4BAAOC,CAAsB1sH,GAC5B,OAAOsC,OAAOtC,GAAS,IACrBuC,OACA2hB,QAAQ,SAAU,IAClB5iB,aACH,CAQA,yBAAOqrH,CAAmBC,EAAQ5sH,GACjC,MAAMglB,EAAO4nG,EAAO18G,QAAQ28G,iBAC5B,OAAK7nG,EACEA,EAAK1d,MAAM,KAAK8C,KAAI0iH,GAAKA,EAAEvqH,SAAQiF,SAASlF,OAAOtC,IAD/B,MAATA,GAA0C,KAAzBsC,OAAOtC,GAAOuC,MAElD,CAOA,gCAAOwqH,CAA0BH,GAChC,OAAO1/G,MAAMC,KAAKy/G,EAAOnrH,SAASsyB,MAAKi5F,GAAOA,EAAIh/F,aAAa,aAChE,CAOA,6BAAOi/F,CAAuBL,GAC7B,MAAM5uG,EAAQ4uG,EAAOxyD,cACrB,OAAe,IAAXp8C,IACIliB,KAAK6wH,mBAAmBC,EAAQA,EAAOnrH,QAAQuc,IAAQhe,MAChE,CASA,YAAOob,CAAM1N,EAAUw/G,GAAU,EAAOruH,EAAS,CAAC,IAC7CquH,GAAuC,SAA5Bx/G,EAASwC,QAAQi9G,SAC/BrxH,KAAKyR,QAAQG,GAGd,MAAM+gB,EAAYtlB,SAAS2K,cAAc,OACzC2a,EAAUxxB,UAAUC,IAAIimG,IACxB10E,EAAU5e,MAAM6C,SAAW,WAEvBhF,EAASzQ,UAAUiN,QACtB,IAAIwD,EAASzQ,WAAWiB,SAAQF,GAAOywB,EAAUxxB,UAAUC,IAAIc,MAG5DuL,EAAAA,EAAAA,IAAWmE,IACd+gB,EAAUxxB,UAAUC,IAAI,YAGzB,MAAMkwH,EAAS3pG,EAAAA,EAAY1kB,IAAI2O,GAC/B,KAAK5N,EAAAA,EAAAA,IAAWstH,GAAS,CACxB,MAAMC,EAAmBvxH,KAAK0wH,2BAA2B9+G,EAAU7O,GACnEK,OAAOwgB,KAAK0tG,GAAQlvH,SAAQ3B,IACvB8wH,EAAiBzoG,IAAIroB,IACzBknB,EAAAA,EAAY/kB,IAAI+vB,EAAW,QAAQlyB,IAAO6wH,EAAO7wH,GAAK,GAExD,CAEA,MAAM4iH,EAAczxG,EAASwC,QAAQivG,aAAe,GAC9CmO,EAAa5/G,EAASosD,SAEtBlkC,EAAUzsB,SAAS2K,cAAc,OAOvC,GANA8hB,EAAQ34B,UAAUC,IAAI4rH,IACtBlzF,EAAQpqB,aAAa,iBAAkB,UACvCoqB,EAAQpqB,aAAa,gBAAiB,SACtCoqB,EAAQpqB,aAAa,OAAQ,UAC7BoqB,EAAQ88B,SAAW46D,GAAc,EAAI,EAEjCA,EAAY,CACf,MAAM1nG,EAAOzc,SAAS2K,cAAc,OACpC8R,EAAK3oB,UAAUC,IAAI+rH,IACnBrzF,EAAQxP,YAAYR,GAEpB,MAAMwB,EAAQje,SAAS2K,cAAc,SACrCsT,EAAMtf,KAAO,OACbsf,EAAMxI,UAAY,2BAClBwI,EAAMvX,MAAM09G,QAAU,2IACtB3nG,EAAKQ,YAAYgB,GAEjBA,EAAM1b,iBAAiB,SAAS,KAC/B,MAAM8hH,EAAOxD,GAASpmH,YAAYwjB,EAAM3d,QAAQ,IAAI05F,OAChDqqB,IAASA,EAAK/wG,YAAY+wG,EAAKlxG,MAAM,GAE3C,KAAO,CACN,MAAM0B,EAAQtQ,EAAS0sD,cACjBp0C,EAAShI,GAAS,EAAItQ,EAASjM,QAAQuc,GAAS,KAChD7C,EAAO6K,GAAQrR,YAAYpS,QAAU,GAGrCkrH,EAAkBtO,IAAgBrjH,KAAKmxH,uBAAuBv/G,GAEpEkoB,EAAQh2B,UAAY6tH,EACjB,gBAAgB1E,OAA2B5J,WAC3ChkG,GAAQ,GACZ,CAEAsT,EAAUrI,YAAYwP,GAEtB,MAAMu5B,EAAWhmD,SAAS2K,cAAc,OACxCq7C,EAASlyD,UAAUC,IAAI0rH,IACvBn6F,EAAUrI,YAAY+oC,GAEtBrzD,KAAK6vH,iBAAiBj+G,EAAUyhD,EAAUtwD,GAE1C6O,EAAS62G,sBAAsB,WAAY91F,GAC3C/gB,EAASwC,QAAQi9G,OAAS,OAE1BrxH,KAAK+H,oBAAoB4qB,EAAW5vB,GACpC/C,KAAK4xH,SAAShgH,GACd,MAAM2O,EAAW2tG,GAASpmH,YAAY6qB,GAEtC,IAAIg3B,EAAc,KAClB,GAAIhiC,EAAAA,EAAYmB,IAAIlX,EAAU,uBAAwB,CACrD,MAAM4rB,EAASnwB,SAAS2K,cAAc,OACtCwlB,EAAOr8B,UAAUC,IAAI8rH,IACrBvjE,EAAct8C,SAAS2K,cAAc,SACrC2xC,EAAYh+C,KAAO,mBACnBg+C,EAAY39C,KAAO,OACnB29C,EAAY05D,YAAcriF,EAAYzgB,EAAS1f,QAAQggC,KAAMv4B,IAAc,OAC3EqhD,EAAY++D,aAAe,MAC3B/+D,EAAYj6C,aAAa,OAAQ,aACjC8tB,EAAOlT,YAAYq/B,GACnB0J,EAAS1iD,aAAa6sB,EAAQ61B,EAAS0F,WACxC,CAEA,GAAIpP,GAAeppC,EAAU,CAC5B,IAAIsxG,EAEJloE,EAAY/5C,iBAAiB,SAAUC,IACtC,MAAMiiH,EAAOjiH,EAAEvL,OAAOJ,MAAMuC,OACtB1D,EAASwd,EAAS1f,QAIxB,GAFA0f,EAASqvG,cAAc,WAAY,CAAEkC,SAEjC/uH,EAAOy6B,OAAO2wF,QAAUprH,EAAOy6B,OAAOp5B,MAAO,CAChD,GAAI0tH,EAAK1jH,QAAUrL,EAAOy6B,OAAO4wF,SAAW,GAAI,OAEhDjrG,aAAa0uG,GACbA,EAAgBtsH,YAAW,KAC1Bgb,EAASwxG,iBAAiBD,EAAK,GAC7B/uH,EAAOy6B,OAAO3f,OAAS,IAC3B,MACC0C,EAASyxG,oBAAoBF,EAC9B,GAEF,CAEA,OAAOn/F,CACR,CAMAlS,MAAAA,CAAOC,GACN,OAAO1gB,KAAK2gB,WAAa3gB,KAAK4gB,OAAS5gB,KAAKwgB,KAAKE,EAClD,CAMAF,IAAAA,CAAKE,GACJ,KAAIjT,EAAAA,EAAAA,IAAWzN,KAAKW,YAEVa,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUqc,GAAgB,CAAE0D,kBAC1D/E,iBAAN,CAiBA,GAfA3b,KAAKW,SAASQ,UAAUC,IAAIkb,IACI,SAA5Btc,KAAKiyH,mBACRjyH,KAAKkyH,0BAGLlyH,KAAKmyH,6BAGF,iBAAkB9kH,SAASulB,kBAC9BvlB,SAASvG,KAAKiN,MAAM6D,cAAgB,QAGtB5X,KAAKW,SAAS4G,cAAcg8B,IACpC7zB,aAAa,gBAAiB,QAEjC1P,KAAKa,QAAQ28B,QAAQiR,QAAS,CACjC,MAAMnjB,EAAQtrB,KAAKW,SAAS4G,cAAcumH,IACtCxiG,GAAOA,EAAMoQ,OAClB,CAEA,OAAO17B,KAAKyH,gBAAe,KAC1BzH,KAAKW,SAASQ,UAAUC,IAAImzG,IAC5Bv0G,KAAKyvH,2BACLjuH,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUsc,GAAiB,CAAEyD,kBACvD1gB,KAAK0pG,cAAc6jB,IACnBvtH,KAAK4vH,cAAc,SAAS,GAC1B5vH,KAAKynC,OAAO,EAAM,GA5BS,CA6B/B,CAKA7mB,IAAAA,KACKnT,EAAAA,EAAAA,IAAWzN,KAAKW,WAAcX,KAAK2gB,YACvC3gB,KAAK6nC,eACN,CAOAA,aAAAA,CAAcnnB,EAAgB,CAAC,GACpBlf,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUmc,GAAgB4D,GACxD/E,mBAEN3b,KAAKmyH,6BAELnyH,KAAKW,SAASQ,UAAUG,OAAOizG,IAC/Bv0G,KAAKW,SAAS4G,cAAcg8B,IAAsB7zB,aAAa,gBAAiB,SAEhF1P,KAAKyH,gBAAe,KACnBzH,KAAKW,SAASQ,UAAUG,OAAOgb,IAC/B9a,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUoc,GAAkB2D,GACtD1gB,KAAK0pG,cAAc8jB,IACnBxtH,KAAK4vH,cAAc,SAAS,GAC1B5vH,KAAKynC,OAAO,EAAM,IAEjB,iBAAkBp6B,SAASulB,kBAC9BvlB,SAASvG,KAAKiN,MAAM6D,cAAgB,IAEtC,CAOA+I,QAAAA,GACC,OAAO3gB,KAAKW,SAASQ,UAAUE,SAASib,GACzC,CAMAozG,aAAAA,GACK1vH,KAAKga,WACRha,KAAKga,UAAUkC,aAGhB,MAAM40G,EAAS9wH,KAAKW,SAASozB,uBACxB+8F,GAA6B,WAAnBA,EAAOvjH,UAEtBvN,KAAKga,UAAY,IAAIo4G,kBAAkBC,IAEtC,GADApkH,QAAQ8D,MAAM,8BAA+BsgH,GACzCvB,EAAO5+F,aAAa,iBAAkB,OAS1C,IAPqBmgG,EAAUp6F,MAAKq6F,GACb,eAAlBA,EAAStmH,KACL,CAAC,WAAY,WAAY,QAAS,UAAUN,SAAS4mH,EAAShhB,eAE7C,cAAlBghB,EAAStmH,MAA0C,kBAAlBsmH,EAAStmH,OAG/B,OAEnB,MAAMumH,EAAWvyH,KAAK2gB,WAEtBwC,aAAanjB,KAAKgvH,kBAClBhvH,KAAKgvH,iBAAmBzpH,YAAW,KAC9BvF,KAAKW,SAASozB,yBAA2B+8F,GAAUA,EAAO5+F,aAAa,mBAE3ElyB,KAAKwyH,sBAEDD,GACHtiH,uBAAsB,KACrBjQ,KAAKwgB,MAAM,IAEb,GACE,IAAI,IAGRxgB,KAAKga,UAAUiC,QAAQ60G,EAAQ,CAC9B7nG,YAAY,EACZwpG,gBAAiB,CAAC,WAAY,WAAY,QAAS,UACnDtU,WAAW,EACXuU,SAAS,EACTC,eAAe,IAEjB,CAMAH,mBAAAA,GACC,MAAM1B,EAAS9wH,KAAKW,SAASozB,uBAC7B,IAAK+8F,EAAQ,QAETrjH,EAAAA,EAAAA,IAAWqjH,GACd9wH,KAAKW,SAASQ,UAAUC,IAAI,YAE5BpB,KAAKW,SAASQ,UAAUG,OAAO,YAGhC,MAAMgkC,EAAOtlC,KAAKW,SAAS4G,cAAcsmH,IACzCK,GAAS2B,iBAAiBiB,EAAQxrF,EAAMtlC,KAAKa,SAC7CqtH,GAAS0D,SAASd,EACnB,CAKAzuH,OAAAA,GACKrC,KAAKga,YACRha,KAAKga,UAAUkC,aACflc,KAAKga,UAAY,MAElBmJ,aAAanjB,KAAKgvH,kBAClBhvH,KAAKgvH,iBAAmB,KACxBhvH,KAAKmyH,6BACL3zG,MAAMnc,SACP,CAEA6vH,uBAAAA,GACiC,SAA5BlyH,KAAKiyH,qBAETjyH,KAAKmyH,6BACLnyH,KAAKuvH,yBAA2BvvH,KAAK4yH,qBAAqB5yH,KAAKW,UAG/D0U,OAAOzF,iBAAiB,SAAU5P,KAAKwvH,8BAA+B,CAAE5gF,SAAS,IACjFv5B,OAAOzF,iBAAiB,SAAU5P,KAAKwvH,8BAA+B,CAAE5gF,SAAS,IAE7E5uC,KAAKuvH,0BACRvvH,KAAKuvH,yBAAyB3/G,iBAAiB,SAAU5P,KAAKwvH,8BAA+B,CAAE5gF,SAAS,IAGzG5uC,KAAKyvH,2BACN,CAEA0C,0BAAAA,GACC98G,OAAO3D,oBAAoB,SAAU1R,KAAKwvH,+BAC1Cn6G,OAAO3D,oBAAoB,SAAU1R,KAAKwvH,+BAEtCxvH,KAAKuvH,0BACRvvH,KAAKuvH,yBAAyB79G,oBAAoB,SAAU1R,KAAKwvH,+BAElExvH,KAAKuvH,yBAA2B,KAGhCvvH,KAAKW,SAASQ,UAAUG,OAAO+rH,IAC/BrtH,KAAKW,SAASoT,MAAMkmB,eAAe,8BACpC,CAEAg4F,gBAAAA,GACC,MAAMlpF,EAAM/oC,KAAKa,SAAS+V,SACpBiT,EAAc,MAAPkf,EAAc,OAASviC,OAAOuiC,GAAKtiC,OAAOjB,cACvD,MAAa,SAATqkB,GAA4B,QAATA,GAA2B,WAATA,GAA8B,SAATA,EAAwBA,EAC/E,MACR,CAEA+oG,oBAAAA,CAAqBC,GACpB,IAAIvhH,EAAKuhH,GAASp/F,cAClB,KAAOniB,GAAMA,IAAOjE,SAASvG,MAAQwK,IAAOjE,SAASulB,iBAAiB,CACrE,MAAM7e,EAAQsB,OAAOgf,iBAAiB/iB,GAChCwhH,EAAY/+G,EAAM++G,WAAa/+G,EAAMqI,UAAY,UACjDqjB,EAAY1rB,EAAM0rB,WAAa1rB,EAAMqI,UAAY,UAIvD,GAH6B,YAAd02G,GACc,YAAdrzF,EAGd,OAAOnuB,EAGRA,EAAKA,EAAGmiB,aACT,CACA,OAAO,IACR,CAEAs/F,YAAAA,GACC,MAAMjjF,EAAW,CAChBp/B,IAAK,EACLqE,KAAM,EACNgH,MAAO1G,OAAOC,WACd2C,OAAQ5C,OAAOG,aAGVge,EAASxzB,KAAKuvH,yBACpB,IAAK/7F,EAAQ,OAAOsc,EAEpB,MAAMlX,EAAIpF,EAAOljB,wBACjB,MAAO,CACNI,IAAKyE,KAAKC,IAAI06B,EAASp/B,IAAKkoB,EAAEloB,KAC9BqE,KAAMI,KAAKC,IAAI06B,EAAS/6B,KAAM6jB,EAAE7jB,MAChCgH,MAAO5G,KAAKO,IAAIo6B,EAAS/zB,MAAO6c,EAAE7c,OAClC9D,OAAQ9C,KAAKO,IAAIo6B,EAAS73B,OAAQ2gB,EAAE3gB,QAEtC,CAEAw3G,wBAAAA,GACC,IAAKzvH,KAAK2gB,WAAY,OAEtB,MAAMkJ,EAAO7pB,KAAKiyH,mBAClB,GAAa,SAATpoG,EAAiB,OAErB,MAAMk6F,EAAO/jH,KAAK+yH,eACZC,EAAgBhzH,KAAKW,SAAS2P,wBAE9B2iH,EAAalP,EAAK9rG,OAAS+6G,EAAc/6G,OACzCi7G,EAAaF,EAActiH,IAAMqzG,EAAKrzG,IAEtCyiH,EAAkB,QAATtpG,GAAiC,WAATA,GAA4BqpG,EAAaD,EAChFjzH,KAAKW,SAASQ,UAAUsf,OAAO4sG,GAAoB8F,GAEnD,MAAMC,EAAYD,EAASD,EAAaD,EAGlCI,EAAUl+G,KAAKC,IAAI,GAAID,KAAK2gB,MAAMs9F,EAAY,KAChDv+G,OAAOI,SAASo+G,IAAYA,EAAU,GACzCrzH,KAAKW,SAASoT,MAAMimB,YAAY,8BAA+B,GAAGq5F,MAEpE,CAMA,cAAO5hH,CAAQq/G,GACd,MAAMn+F,EAAYm+F,EAAOl9F,mBACrBjB,GAAaA,EAAUxxB,UAAUE,SAASgmG,KAC7C10E,EAAUrxB,QAEZ,CAMA,eAAOswH,CAASd,GACf,MAAMn+F,EAAYm+F,EAAOl9F,mBACzB,IAAKjB,IAAcA,EAAUxxB,UAAUE,SAASgmG,IAAuB,OAEvE,MAAMvtE,EAAUnH,EAAUprB,cAAcqmH,IAClCvK,EAAcyN,EAAO18G,QAAQivG,aAAe,GAC5CmO,EAAaV,EAAO9yD,SACpBz9C,EAAW2tG,GAASpmH,YAAY6qB,GAEtC,GAAI6+F,EAAY,CACf,MAAM1nG,EAAOgQ,EAAQvyB,cAAc,IAAI4lH,MACjC7hG,EAAQxB,EAAKviB,cAAc,SAC3B+rH,EAAYxpG,EAAKta,iBAAiB,IAAI+8G,MAAkBn+G,OAC9D0b,EAAKhmB,UAAY,GACjBgmB,EAAKQ,YAAYgB,GAEjB,MAAM8Z,EAAWh0B,MAAMC,KAAKy/G,EAAO3yD,iBAGlB,IAFA/4B,EAASh3B,QAEJklH,EAAY,IACjC/yG,GAAUmpF,cAAc+jB,IACxBltG,GAAUqvG,cAAc,YAGD,IAApBxqF,EAASh3B,OACZkd,EAAM+3F,YAAcA,GAEpB/3F,EAAM+3F,YAAc,GACpBj+E,EAAShjC,SAAQ8uH,IAChB,MAAMjnG,EAAM5c,SAAS2K,cAAc,OACnCiS,EAAI9oB,UAAUC,IAAImrH,IAElBtiG,EAAInmB,UAAY,SAASotH,EAAIr4G,mEAAuEq4G,EAAIhvG,sBAAsBgvG,EAAI3/G,aAAa,UAAY,8KAC3JuY,EAAKnZ,aAAasZ,EAAKqB,EAAM,IAGhC,KAAO,CACN,MAAMpJ,EAAQ4uG,EAAOxyD,cACfp0C,EAAShI,GAAS,EAAI4uG,EAAOnrH,QAAQuc,GAAS,KAC9C7C,EAAO6K,GAAQrR,YAAYpS,QAAU,GAGrCkrH,EAAkBtO,IAAgBrjH,KAAKmxH,uBAAuBL,GAG9DyC,EAAU5B,EAAkBtO,EAAchkG,GAAQ,IADxCya,EAAQjhB,cAGR06G,IACfz5F,EAAQh2B,UAAY6tH,EACjB,gBAAgB1E,OAA2B5J,WAC3CkQ,EAEL,CACD,CAQA,qBAAOC,CAAe1C,EAAQ5sH,EAAOW,EAAO,CAAC,GAC5C,MAAM8tB,EAAYm+F,EAAOl9F,mBACnBrT,EAAWoS,EAAYu7F,GAASpmH,YAAY6qB,GAAa,KAE/Dm+F,EAAOphH,aAAa,gBAAiB,QACrC,IACC,MAAMwhH,EAAMJ,EAAOvpH,cAAc,iBAAiB4rB,IAAIC,QAAOpuB,EAAAA,EAAAA,IAAcd,SAC3E,IAAKgtH,EAEJ,YADA3wG,GAAUmpF,cAAcgkB,GAAiB,CAAEt+G,MAAO,mBAAoBlL,UAIvE,MAAMuvH,EAAcvC,EAAI9rF,SAClBsuF,EAAexC,EAAIr4G,YAAYpS,OAEjCqqH,EAAO9yD,SACVkzD,EAAI9rF,UAA8B,IAAnBvgC,GAAMugC,UAErB,IAAI0rF,EAAOnrH,SAASvD,SAAQwyB,GAAKA,EAAEwQ,UAAW,IAC9C8rF,EAAI9rF,UAAW,EACf0rF,EAAO5sH,MAAQgtH,EAAIhtH,OAGpBlE,KAAK4xH,SAASd,GAEd,MAAMjhH,EAAI,IAAI6lB,MAAM,SAAU,CAAEhE,SAAS,EAAMC,YAAY,IAC3Dm/F,EAAOj/F,cAAchiB,GAEhB4jH,IACJjyH,EAAAA,EAAawf,QAAQ8vG,EAAQjY,GAAkB,CAAEh0G,SACjD0b,GAAUmpF,cAAckjB,GAAkB,CAAE1oH,QAAOmb,KAAMq0G,EAAc7uH,SACvE0b,GAAUqvG,cAAc,WAAY,CAAE1rH,QAAOmb,KAAMq0G,EAAc7uH,SAEnE,CAAE,QACDisH,EAAO3+F,gBAAgB,gBACxB,CACD,CAQA,4BAAOwhG,CAAsB7C,EAAQ5uG,EAAOrd,EAAO,CAAC,GACnD,MAAM8tB,EAAYm+F,EAAOl9F,mBACnBrT,EAAWoS,EAAYu7F,GAASpmH,YAAY6qB,GAAa,KAE/Dm+F,EAAOphH,aAAa,gBAAiB,QACrC,IACC,MAAMwhH,EAAMr8G,OAAOw0B,UAAUnnB,GAAS4uG,EAAOnrH,QAAQuc,GAAS,KAC9D,IAAKgvG,EAEJ,YADA3wG,GAAUmpF,cAAcgkB,GAAiB,CAAEt+G,MAAO,4BAA6B8S,UAIhF,MAAMuxG,EAAcvC,EAAI9rF,SAClBsuF,EAAexC,EAAIr4G,YAAYpS,OAC/BvC,EAAQgtH,EAAIhtH,MAEd4sH,EAAO9yD,SACVkzD,EAAI9rF,UAA8B,IAAnBvgC,GAAMugC,UAErB,IAAI0rF,EAAOnrH,SAASvD,SAAQwyB,GAAKA,EAAEwQ,UAAW,IAC9C8rF,EAAI9rF,UAAW,EACf0rF,EAAO5sH,MAAQgtH,EAAIhtH,OAGpBlE,KAAK4xH,SAASd,GAEd,MAAMjhH,EAAI,IAAI6lB,MAAM,SAAU,CAAEhE,SAAS,EAAMC,YAAY,IAC3Dm/F,EAAOj/F,cAAchiB,GAEhB4jH,IACJjyH,EAAAA,EAAawf,QAAQ8vG,EAAQjY,GAAkB,CAAEh0G,SACjD0b,GAAUmpF,cAAckjB,GAAkB,CAAE1oH,QAAOmb,KAAMq0G,EAAc7uH,SACvE0b,GAAUqvG,cAAc,WAAY,CAAE1rH,QAAOmb,KAAMq0G,EAAc7uH,SAEnE,CAAE,QACDisH,EAAO3+F,gBAAgB,gBACxB,CACD,CAQAu3E,aAAAA,CAAc9mC,EAAWhxC,EAAS,CAAC,GAClCpwB,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUiiE,EAAWhxC,EAChD,CAQAg+F,aAAAA,CAAcjkH,EAAMioH,EAAM,MACzB,MAAMrwH,EAAWvD,KAAKa,QAAQ8K,GACN,mBAAbpI,GACVA,EAAS6E,KAAKpI,KAAMA,KAAKW,SAAUizH,EAErC,CAQA,WAAO1rH,CAAK1H,EAASuC,EAAS,CAAC,EAAG8wH,GAAY,GAC7C7zH,KAAKsf,MAAM9e,EAASqzH,EAAW9wH,EAChC,CAMA,iBAAOolC,CAAW76B,GACjB,MAAMqZ,EAAOpkB,EAAAA,EAAUC,KAAK,IAAI6kG,MAAwB/qF,MACxD,IAAKqK,EAAM,OAEX,MAAMmtG,EAAiBxmH,EAAMhJ,OAAOqJ,QAAQ41B,IAC5C,GAAIuwF,GAAkBA,EAAenmH,QAAQ,IAAI05F,QAA4B1gF,EAC5E,OAMD,GAHyBrZ,EAAM+6B,eAAepQ,MAAK3mB,GAClDA,EAAGnQ,WAAWE,SAASyrH,MAGvB,OAGD,MAAMvsG,EAAW2tG,GAASpmH,YAAY6e,GAClCpG,GACHA,EAASsnB,cAAc,CAAEnnB,cAAepT,EAAMhJ,QAEhD,CAMAqrH,mBAAAA,GACC,IAAK3vH,KAAKa,QAAQ28B,QAAQ4c,aAAep6C,KAAKa,QAAQ28B,OAAO2wF,OAAQ,OAErE,MAAMz/G,EAAO1O,KAAKW,SAAS4G,cAAcwmH,IACzC,IAAKr/G,EAAM,OAEX,MAAM40B,EAAMj2B,SAAS2K,cAAc,MACnCsrB,EAAIxgB,UAAYsqG,GAChB9pF,EAAIvvB,MAAMggH,UAAY,SACtBzwF,EAAIvvB,MAAMoE,QAAU,MACpBmrB,EAAIvvB,MAAMiH,OAAS,UACnBsoB,EAAIvvB,MAAMuE,MAAQ,UAClBgrB,EAAIvvB,MAAMwE,SAAW,OACrB+qB,EAAIvvB,MAAMigH,WAAa,MACvB1wF,EAAIzqB,YAAc7Y,KAAKa,QAAQ28B,OAAOgxF,aAEtClrF,EAAI1zB,iBAAiB,SAAS,MACxB5P,KAAKovH,WAAkC,OAArBpvH,KAAKmvH,aAAwBnvH,KAAKkvH,aAAelvH,KAAKmvH,cAC5EnvH,KAAKi0H,eACN,IAGDvlH,EAAK4b,YAAYgZ,GACjBtjC,KAAKk0H,qBAAoB,EAC1B,CAOAA,mBAAAA,CAAoBtzG,GACnB,MAAM0iB,EAAMtjC,KAAKW,SAAS4G,cAAcymH,IACpC1qF,IACHA,EAAIvvB,MAAM4E,QAAUiI,EAAO,OAAS,QAEtC,CAOAuzG,YAAAA,CAAa3zG,GACZ,MAAM9R,EAAO1O,KAAKW,SAAS4G,cAAcwmH,IACzC,IAAIxpH,EAASmK,EAAKnH,cAAc,IAAIkgG,MAChCjnF,IAASjc,GACZA,EAAS8I,SAAS2K,cAAc,MAChCzT,EAAOue,UAAY2kF,GACnBljG,EAAOwP,MAAMggH,UAAY,SACzBxvH,EAAOwP,MAAMoE,QAAU,MACvB5T,EAAOsU,YAAcooB,GAAcjhC,KAAKa,QAAQggC,KAAMv4B,IAAe,QACrEoG,EAAK4b,YAAY/lB,KACNic,GAAQjc,GACnBA,EAAOjD,QAET,CAMA,mBAAM2yH,GACL,MAAM,MAAE7vH,EAAK,UAAEiqH,EAAY,OAAM,UAAEC,EAAY,IAAG,QAAEC,EAAU,IAAOvuH,KAAKa,QAAQ28B,OAC5Eqf,EAAW78C,KAAKkvH,aAAe,EAE/B/iH,EAAM,IAAIsX,IAAIrf,EAAOiR,OAAOqO,SAASC,QAC3CxX,EAAI0X,aAAajhB,IAAI0rH,EAAWtuH,KAAKivH,aACrC9iH,EAAI0X,aAAajhB,IAAIyrH,EAAWxxE,GAChC1wC,EAAI0X,aAAajhB,IAAI,WAAY2rH,GAEjCvuH,KAAKovH,UAAW,EAChBpvH,KAAKm0H,cAAa,GAClBn0H,KAAKk0H,qBAAoB,GAEzB,IACC,MAAMh8F,QAAY/T,MAAMhY,EAAK,CAAEvF,QAAS,CAAE,eAAgB,sBACpD/B,QAAaqzB,EAAIxuB,OAEnB0H,MAAMiP,QAAQxb,EAAKo6F,WACtBivB,GAASkG,WAAWp0H,KAAKW,SAASozB,uBAAwBlvB,EAAM,CAAEwvH,UAAU,IAC5Er0H,KAAKkvH,aAAerqH,EAAKu1C,YAAYk6E,cAAgBz3E,EACrD78C,KAAKmvH,YAActqH,EAAKu1C,YAAYm6E,aAAe,MAG1B,OAArBv0H,KAAKmvH,aAAwBnvH,KAAKkvH,aAAelvH,KAAKmvH,cACzDnvH,KAAKk0H,qBAAoB,GAG1Bl0H,KAAK4vH,cAAc,aAAc,CAAE7yE,KAAM/8C,KAAKkvH,aAAcrqH,SAC5D7E,KAAK0pG,cAAcikB,GAAqB,CAAE5wE,KAAM/8C,KAAKkvH,aAAc4C,KAAM9xH,KAAKivH,cAEhF,CAAE,MAAO3pH,GACR2I,QAAQmB,MAAM,qCAAsC9J,GACpDtF,KAAK0pG,cAAcgkB,GAAiB,CAAEt+G,MAAO,0BAA2B0iH,KAAM9xH,KAAKivH,cACnFjvH,KAAKk0H,qBAAoB,EAC1B,CAAE,QACDl0H,KAAKm0H,cAAa,GAClBn0H,KAAKovH,UAAW,CACjB,CACD,CAOA2C,gBAAAA,CAAiBD,GAChB,MAAM,MAAE1tH,EAAK,OAAEC,EAAS,MAAK,UAAEgqH,EAAY,OAAM,UAAEC,EAAY,IAAG,QAAEC,EAAU,IAAOvuH,KAAKa,QAAQ28B,OAC5FrxB,EAAM,IAAIsX,IAAIrf,EAAOiR,OAAOqO,SAASC,QAC3CxX,EAAI0X,aAAajhB,IAAI0rH,EAAWwD,GAChC3lH,EAAI0X,aAAajhB,IAAIyrH,EAAW,GAChCliH,EAAI0X,aAAajhB,IAAI,WAAY2rH,GAEjC,MAAM5kE,EAAc3pD,KAAKW,SAAS4G,cAAcumH,IAC1C0G,EAAUx0H,KAAK2gB,WAGrB3gB,KAAKivH,YAAc6C,EACnB9xH,KAAKkvH,aAAe,EACpBlvH,KAAKmvH,YAAc,KAGfnvH,KAAKsvH,8BACRtvH,KAAKsvH,6BAA6BjoG,QAEnCrnB,KAAKsvH,6BAA+B,IAAI7tE,gBAGxC,MAAM38B,IAAc9kB,KAAKqvH,uBACnBroH,EAAShH,KAAKsvH,6BAA6BtoH,OAEjDhH,KAAKm0H,cAAa,GAClBn0H,KAAKk0H,qBAAoB,GAEzB/vG,MAAMhY,EAAK,CACV9H,SACAuC,QAAS,CAAE,eAAgB,oBAC3BI,WAECkf,MAAKgS,GAAOA,EAAIxuB,SAChBwc,MAAKrhB,IAEL,GAAIigB,IAAc9kB,KAAKqvH,uBAAwB,OAI/C,IADiB1lE,EAAcA,EAAYzlD,MAAMuC,OAAS,MACzCqrH,EAAM,OAEvB,MAAMhB,EAAS9wH,KAAKW,SAASozB,uBACxB+8F,IAGL,IAAIA,EAAOthH,iBAAiB,WAAWpN,SAAQ8uH,IAG9C,MAAMhZ,EAAUgZ,IAAQJ,EAAOnrH,QAAQ,GACjCo4D,EAAqD,MAArCmzD,EAAI3/G,aAAa,UAAY,IAC7CkjH,EAAiD,MAAlCvD,EAAIr4G,aAAe,IAAIpS,OACtCiuH,GAA0B,IAAfxD,EAAIn/E,QAAmBm/E,EAAIh/F,aAAa,UACnDyiG,EAAiBzD,EAAIh/F,aAAa,YAEpCgmF,GAAWn6C,GAAgB02D,GAAeC,GAAYC,GAIrDzD,EAAIh/F,aAAa,kBAAqBg/F,EAAIvjH,QAAQ,4BACtDujH,EAAI5vH,QACL,IAGD4sH,GAASkG,WAAWtD,EAAQjsH,EAAM,CAAEwvH,UAAU,IAE9Cr0H,KAAK4vH,cAAc,WAAY,CAAEkC,OAAMjtH,SACvC7E,KAAK0pG,cAAc4jB,GAAmB,CAAEwE,OAAMjtH,SAE1CA,EAAKu1C,aACRp6C,KAAKkvH,aAAerqH,EAAKu1C,WAAWk6E,cAAgB,EACpDt0H,KAAKmvH,YAActqH,EAAKu1C,WAAWm6E,aAAe,OAI1B,OAArBv0H,KAAKmvH,aAAwBnvH,KAAKkvH,aAAelvH,KAAKmvH,cACzDnvH,KAAKk0H,qBAAoB,GAItBM,GAAW7qE,IACdA,EAAYjuB,QACZ17B,KAAKW,SAASQ,UAAUC,IAAIkb,GAAiBi4F,KAC9C,IAEAjuF,OAAMhhB,IAEFA,GAAqB,eAAbA,EAAIqG,OAEhBsC,QAAQmB,MAAM,gCAAiC9J,GAC/CtF,KAAK0pG,cAAcgkB,GAAiB,CAAEt+G,MAAO,wBAAyB0iH,SACtE9xH,KAAKk0H,qBAAoB,GAAM,IAE/BpwF,SAAQ,KAEJhf,IAAc9kB,KAAKqvH,wBACtBrvH,KAAKm0H,cAAa,EACnB,GAEH,CASA,iBAAOC,CAAWtD,EAAQjsH,EAAMc,EAAU,CAAC,GAC1C,MAAM,SAAE0uH,GAAW,GAAU1uH,EACvBgtB,EAAYm+F,EAAOl9F,mBACnBigG,EAAYlhG,GAAaA,EAAUxxB,UAAUE,SAASgmG,IACtD9mF,EAAWszG,EAAY3F,GAASpmH,YAAY6qB,GAAa,KAE/D,IAAIiiG,EAAc/vH,EAKlB,GAJIA,GAAQA,EAAKo6F,SAAW7tF,MAAMiP,QAAQxb,EAAKo6F,WAC9C21B,EAAc/vH,EAAKo6F,UAGf7tF,MAAMiP,QAAQu0G,GAElB,YADAr0G,GAAUmpF,cAAcgkB,GAAiB,CAAEt+G,MAAO,wCAGnD,MAAMihH,EAAcrwH,KAAKgwH,eAAec,EAAQvwG,GAAU1f,SAAW,CAAC,GAEjEwzH,IAEJ,IAAIvD,EAAOthH,iBAAiB,WAAWpN,SAAQ8nB,IAC9C,MAAM2qG,EAAiB3qG,EAAOvc,QAAQ,YACjB,KAAjBuc,EAAOhmB,QACPgmB,EAAOgI,aAAa,kBACpB2iG,GAAkBA,EAAe3iG,aAAa,kBAClDhI,EAAO5oB,SAAQ,IAGhB,IAAIwvH,EAAOthH,iBAAiB,aAAapN,SAAQ0yH,IACrB,IAAvBA,EAAG3vF,SAAS/2B,QAAiB0mH,EAAG5iG,aAAa,kBAChD4iG,EAAGxzH,QACJ,KAIF,MAAMyzH,EAAeA,CAACjlH,EAAM0jB,EAAQoyD,EAAQ,QAC3C,MAAM17D,EAAS7c,SAAS2K,cAAc,UAChCoiD,EAAchpD,MAAMiP,QAAQvQ,EAAKq1B,WAAar1B,EAAKq1B,SAAS/2B,OAAS,EAE3E8b,EAAOhmB,MAAQ4L,EAAK0B,IAAM,GAC1B0Y,EAAOrR,YAAc/I,EAAKuP,MAAQ,GAC9BvP,EAAKs1B,WAAUlb,EAAOkb,UAAW,GACjCt1B,EAAKokB,WAAUhK,EAAOgK,UAAW,GACjCm8F,GAAex7G,OAAOw0B,UAAUu8C,KACnC17D,EAAOxa,aAAa,aAAclJ,OAAOo/E,IACrCxrB,IAAgBlwC,EAAOhmB,QAC1BgmB,EAAOgK,UAAW,IAIF9wB,OAAOwgB,KAAK9T,GAAM7N,QAAO+yH,IAAM,CAAC,KAAM,OAAQ,WAAY,WAAY,YAAYtpH,SAASspH,KACnG5yH,SAAQ3B,IACjBypB,EAAOxa,aAAa,QAAQjP,IAAOqP,EAAKrP,GAAK,IAG9C+yB,EAAOlJ,YAAYJ,EAAO,EAGrB+qG,EAAoBA,CAACnpG,EAAO0H,EAAQoyD,EAAQ,KACjD95D,EAAM1pB,SAAQ0N,IACbilH,EAAajlH,EAAM0jB,EAAQoyD,GACvBx0E,MAAMiP,QAAQvQ,EAAKq1B,WAAar1B,EAAKq1B,SAAS/2B,OAAS,GAC1D6mH,EAAkBnlH,EAAKq1B,SAAU3R,EAAQoyD,EAAQ,EAClD,GACC,EAqBH,GAlBIyqC,EACH4E,EAAkBL,EAAa9D,EAAQ,GAEvC8D,EAAYxyH,SAAQ0N,IACnB,GAAIA,EAAKq1B,UAAY/zB,MAAMiP,QAAQvQ,EAAKq1B,UAAW,CAClD,MAAM+vF,EAAW7nH,SAAS2K,cAAc,YACxCk9G,EAASzpG,MAAQ3b,EAAKuP,MAAQ,GAC1BvP,EAAKokB,WAAUghG,EAAShhG,UAAW,GAEvCpkB,EAAKq1B,SAAS/iC,SAAQinB,GAAS0rG,EAAa1rG,EAAO6rG,KAEnDpE,EAAOxmG,YAAY4qG,EACpB,MACCH,EAAajlH,EAAMghH,EACpB,IAIE+C,EAAW,CACd,MAAMvuF,EAAO3S,EAAUprB,cAAc,IAAIulH,MACzCoB,GAAS2B,iBAAiBiB,EAAQxrF,EAAM/kB,GAAU1f,SAAW,CAAC,GAC9D0f,GAAUmpF,cAAc4jB,GACzB,MACCttH,KAAK4xH,SAASd,EAEhB,CAOAkB,mBAAAA,CAAoBF,GACnB,MACMnsH,EADO3F,KAAKynC,MAAMlgC,cAAc,IAAIwlH,MACrBv9G,iBAAiB,IAAI88G,MAErCwF,GAKLA,EAAOA,EAAKtsH,cACZG,EAAQvD,SAAQkP,IACf,MAAM+N,EAAO/N,EAAGuH,YAAYrT,cAC5B8L,EAAGygC,QAAU1yB,EAAK3T,SAASomH,EAAK,KAPhCnsH,EAAQvD,SAAQkP,GAAMA,EAAGygC,QAAS,GASpC,ED5sCAvwC,EAAAA,EAAaC,GAAG4L,SAAU85B,IAAsBt3B,GAAKq+G,GAAS/lF,WAAWt4B,KAEzErO,EAAAA,EAAaC,GAAG4L,SAAU85B,GAAsB5D,IAAsB,SAAS1zB,GAC9E,MAAMvL,EAASuL,EAAEvL,OACjB,GAAIA,EAAOqJ,QAAQ,IAAI4+G,OAAqBjoH,EAAOqJ,QAAQ,IAAI6+G,MAE9D,YADA38G,EAAEgB,kBAGH,MAAM8hB,EAAY3yB,KAAK2N,QAAQ,IAAI05F,MAC7B9mF,EAAW2tG,GAASnmH,oBAAoB4qB,GACxChM,EAAOpkB,EAAAA,EAAUC,KAAK,IAAI6kG,WAC5B1gF,GAAQA,IAASgM,GAAWu7F,GAASpmH,YAAY6e,IAAO/F,OAC5DL,EAASE,OAAOzgB,KACjB,IAEAwB,EAAAA,EAAaC,GAAG4L,SAAU85B,GArBO,oCAqBuC,SAASt3B,GAChF,MAAMqa,EAASra,EAAEvL,OACjB,GAAI4lB,EAAO/oB,UAAUE,SAAS,YAAa,OAC3C,MAAMsxB,EAAYzI,EAAOvc,QAAQ,IAAI05F,MAC/BypB,EAASn+F,EAAUoB,uBACnBy9F,EAAaV,EAAO9yD,SAGpBm3D,EAAWjrG,EAAO9V,QAAQ8N,MAC1B4U,EAAMjiB,OAAOI,SAASJ,OAAOsgH,IAAa9oF,SAAS8oF,EAAU,IAAMlmF,IACnEmmF,EAAUvgH,OAAOw0B,UAAUvS,GAAOg6F,EAAOnrH,QAAQmxB,GAAO,KAC9D,IAAKs+F,EAAS,OAEd,MAAM70G,EAAW2tG,GAASpmH,YAAY6qB,GAChC8gG,EAAc2B,EAAQhwF,SAEtBlhC,EAAQkxH,EAAQlxH,MAEtB,GAAIstH,EACH4D,EAAQhwF,UAAYgwF,EAAQhwF,SAC5Blb,EAAO/oB,UAAUsf,OAAO,WAAY20G,EAAQhwF,UAC5C8oF,GAAS0D,SAASd,GAClBA,EAAOj/F,cAAc,IAAI6D,MAAM,SAAU,CAAEhE,SAAS,KACpDlwB,EAAAA,EAAawf,QAAQ8vG,EAAQjY,GAAkB,CAC9Ch0G,KAAM,CAAEX,QAAOg4B,MAAOhS,EAAOrR,eAAgB8O,EAAAA,EAAY1kB,IAAIinB,MAG1DkrG,EAAQhwF,UACX7kB,GAAUmpF,cAAckjB,GAAkB,CAAE1oH,QAAOg4B,MAAOhS,EAAOrR,eAAgB8O,EAAAA,EAAY1kB,IAAIinB,KACjG3J,GAAUqvG,cAAc,WAAY,CAAE1rH,QAAOg4B,MAAOhS,EAAOrR,eAAgB8O,EAAAA,EAAY1kB,IAAIinB,OAE3F3J,GAAUmpF,cAAcmjB,GAAoB,CAAE3oH,QAAOg4B,MAAOhS,EAAOrR,eAAgB8O,EAAAA,EAAY1kB,IAAIinB,KACnG3J,GAAUqvG,cAAc,aAAc,CAAE1rH,QAAOg4B,MAAOhS,EAAOrR,eAAgB8O,EAAAA,EAAY1kB,IAAIinB,UAExF,CACN,GAAIupG,EAAa,OAEjB9gG,EAAUnjB,iBAAiB,IAAI88G,MAAqBlqH,SAAQwyB,GAAKA,EAAEzzB,UAAUG,OAAO,cACpF4oB,EAAO/oB,UAAUC,IAAI,YAErB8sH,GAASyF,sBAAsB7C,EAAQh6F,EAAK,CAC3C5U,MAAO4U,EACP5yB,QACAg4B,MAAOhS,EAAOrR,eACX8O,EAAAA,EAAY1kB,IAAIinB,MAG+B,IAA7B3J,GAAU1f,SAAS0gF,OACtBhhE,GAAUK,MAC9B,CACD,IAEApf,EAAAA,EAAaC,GAAG4L,SAAUo/G,GAxEO,6BAwEwC,SAAS58G,GACjF,MAAMyb,EAAQzb,EAAEvL,OACV+uD,EAAW/nC,EAAM3d,QAzES,uBA0E1Be,EAAO2kD,GAAU9rD,cAAc,mBACrC,IAAKmH,EAAM,OAEX,MAAMikB,EAAYrH,EAAM3d,QAAQ,IAAI05F,MAC9B9mF,EAAW2tG,GAASpmH,YAAY6qB,GAEhChtB,EAAU+I,EAAKc,iBAAiB,IAAI88G,MACpChvD,EAAS5uD,EAAKc,iBAAiB,6BAC/BtL,EAAQonB,EAAMpnB,MAAMuC,OAAOjB,cAC3Bg4B,EAAS,CAACt5B,GAAO+xB,EAAAA,EAAAA,IAAc/xB,IAAQ+xB,EAAAA,EAAAA,IAAc/xB,GAAO,IAKlE,GAHAyB,EAAQvD,SAAQkP,IAAQA,EAAGygC,QAAS,EAAOzgC,EAAGyC,MAAM4E,QAAU,EAAE,IAChE2kD,EAAOl7D,SAAQkP,IAAQA,EAAGygC,QAAS,EAAOzgC,EAAGyC,MAAM4E,QAAU,EAAE,IAE3DzU,EAAO,CACV,IAAI8yC,EAAe,EACnBsmB,EAAOlvD,OAASkvD,EAAOl7D,SAAQ8pC,IAC9B,MAAMpgB,EAAQogB,EAAM18B,iBAAiB,IAAI88G,MACnC5zG,EAAUtH,MAAMC,KAAKya,GAAOmM,MAAKnoB,IACtC,MAAMulH,EAAIvlH,EAAK+I,YAAYrT,cAC3B,OAAOg4B,EAAOvF,MAAKzpB,GAAK6mH,EAAE3pH,SAAS8C,IAAG,IAEvC09B,EAAM6F,QAAUr5B,EAChBwzB,EAAMn4B,MAAM4E,QAAUD,EAAU,GAAK,OACrCoT,EAAM1pB,SAAQ0N,IACb,MAAMulH,EAAIvlH,EAAK+I,YAAYrT,cACrB0nB,EAAQsQ,EAAOvF,MAAKzpB,GAAK6mH,EAAE3pH,SAAS8C,KAC1CsB,EAAKiiC,QAAU7kB,EACfpd,EAAKiE,MAAM4E,QAAUuU,EAAQ,GAAK,OAC9BA,GAAO8pB,GAAc,GACxB,IACErxC,EAAQvD,SAAQ8nB,IACpB,MAAMmrG,EAAInrG,EAAOrR,YAAYrT,cACvB0nB,EAAQsQ,EAAOvF,MAAKzpB,GAAK6mH,EAAE3pH,SAAS8C,KAC1C0b,EAAO6nB,QAAU7kB,EACjBhD,EAAOnW,MAAM4E,QAAUuU,EAAQ,GAAK,OAChCA,GAAO8pB,GAAc,IAG1Bz2B,GAAUmpF,cAAcijB,GAAkB,CAAEpxE,MAAOr3C,EAAO+6F,QAASjoD,IACnEz2B,GAAUqvG,cAAc,WAAY,CAAEr0E,MAAOr3C,EAAO+6F,QAASjoD,GAC9D,MACCz2B,GAAUmpF,cAAcijB,GAAkB,CAAEpxE,MAAO,GAAI0jD,QAASt5F,EAAQyI,SACxEmS,GAAUqvG,cAAc,WAAY,CAAEr0E,MAAO,GAAI0jD,QAASt5F,EAAQyI,QAEpE,IAEA5M,EAAAA,EAAaC,GAAG4L,SAAUq/G,GAAsB,QAAQ,WACvDnqH,EAAAA,EAAUqf,QAAQ,6BAA8B5hB,MAAMoC,SAAQ0uH,GAAU5C,GAAS5uG,MAAMwxG,GAAQ,IAChG,IAEAtvH,EAAAA,EAAaC,GAAG4L,SAAU,UAAWk2B,IAAsB,SAAS1zB,GACnE,MAAM6hH,EAAOxD,GAASpmH,YAAY9H,KAAK2N,QAAQ,IAAI05F,OACnD,GAAKqqB,EACL,OAAQ7hH,EAAEpP,KACT,IAAK,QACL,IAAK,IACJoP,EAAErC,iBACFkkH,EAAKjxG,SACL,MACD,IAAK,SACAixG,EAAK/wG,YAAY+wG,EAAK9wG,OAC1B,MACD,IAAK,YACJ/Q,EAAErC,iBACGkkH,EAAK/wG,YAAY+wG,EAAKlxG,OAG9B,IAEAhf,EAAAA,EAAaC,GAAG4L,SAAU85B,GAAsB,mBAAuB,SAASt3B,GAC/E,MAAMyzB,EAAMzzB,EAAEvL,OAAOqJ,QAAQ,IAAI6+G,MACjC,IAAKlpF,EAAK,OACVzzB,EAAErC,iBACFqC,EAAEgB,kBACF,MAAM8hB,EAAY3yB,KAAK2N,QAAQ,IAAI05F,MAC7BypB,EAASn+F,EAAUoB,uBAEnBohG,EAAW7xF,EAAIlvB,QAAQ8N,MACvB4U,EAAMjiB,OAAOI,SAASJ,OAAOsgH,IAAa9oF,SAAS8oF,EAAU,IAAMlmF,IACnEiiF,EAAMr8G,OAAOw0B,UAAUvS,GAAOg6F,EAAOnrH,QAAQmxB,GAAO,KACpDhnB,EAAO+E,OAAOw0B,UAAUvS,GAC3BnE,EAAUprB,cAAc,IAAI+kH,kBAAiCx1F,OAC7D,KAEGvW,EAAW2tG,GAASpmH,YAAY6qB,GAElCu+F,IACHA,EAAI9rF,UAAW,EACXt1B,GAAMA,EAAK3O,UAAUG,OAAO,YAChC4sH,GAAS0D,SAASd,GAClBA,EAAOj/F,cAAc,IAAI6D,MAAM,SAAU,CAAEhE,SAAS,KACpDlwB,EAAAA,EAAawf,QAAQ8vG,EAAQjY,GAAkB,CAAEh0G,KAAM,CAAEX,MAAOgtH,EAAIhtH,SAEpEqc,GAAUmpF,cAAcmjB,GAAoB,CAAE3oH,MAAOgtH,EAAIhtH,QACzDqc,GAAUqvG,cAAc,aAAc,CAAE1rH,MAAOgtH,EAAIhtH,QAErD,IAEA1C,EAAAA,EAAaC,GAAG4L,SAAU65B,GA5KO,6BA4K0C,SAASr3B,GACnF,GAAc,cAAVA,EAAEpP,MAAwBoP,EAAEvL,OAAOJ,MAAO,CAC7C,MAAMonB,EAAQzb,EAAEvL,OAEVwlB,EADgBwB,EAAMmI,cACDjkB,iBAAiB,IAAI+8G,MAChD,GAAIziG,EAAK1b,OAAS,EAAG,CACpB,MACMhE,EADU0f,EAAKA,EAAK1b,OAAS,GACf7G,cAAc,OAC5B4tH,EAAW/qH,GAAKgK,QAAQ8N,MACxB4U,EAAMjiB,OAAOI,SAASJ,OAAOsgH,IAAa9oF,SAAS8oF,EAAU,IAAMlmF,IAEnE6hF,EAASxlG,EAAM3d,QAAQ,IAAI05F,MAAwBtzE,uBACnD7J,EAASrV,OAAOw0B,UAAUvS,GAAOg6F,EAAOnrH,QAAQmxB,GAAO,KACvD+uD,EAAWhxE,OAAOw0B,UAAUvS,GAC/BxL,EAAM3d,QAAQ,IAAI05F,MAAwB9/F,cAAc,IAAI+kH,kBAAiCx1F,OAC7F,KAEGvW,EAAW2tG,GAASpmH,YAAYwjB,EAAM3d,QAAQ,IAAI05F,OAEpDn9E,IACHA,EAAOkb,UAAW,EACdygD,GAAUA,EAAS1kF,UAAUG,OAAO,YACxC4sH,GAAS0D,SAASd,GAClBA,EAAOj/F,cAAc,IAAI6D,MAAM,SAAU,CAAEhE,SAAS,KACpDlwB,EAAAA,EAAawf,QAAQ8vG,EAAQjY,GAAkB,CAAEh0G,KAAM,CAAEX,MAAOgmB,EAAOhmB,SAEvEqc,GAAUmpF,cAAcmjB,GAAoB,CAAE3oH,MAAOgmB,EAAOhmB,QAC5Dqc,GAAUqvG,cAAc,aAAc,CAAE1rH,MAAOgmB,EAAOhmB,QAExD,CACD,CACD,ICygCD,YClvCA,MCcMrB,GAAW,aAUXyZ,GAAkB,OAKlBD,GAAkB,kBAKlBi5G,GAAa,CAClBC,KAAM,GAAG1yH,UACT2yH,OAAQ,GAAG3yH,YACX4yH,KAAM,GAAG5yH,UACT6yH,MAAO,GAAG7yH,WACV8yH,OAAQ,GAAG9yH,YACX+yH,gBAAiB,mBAAmB/yH,KACpCgzH,eAAgB,iBAAiBhzH,KACjCizH,eAAgB,SAASjzH,cACzBkzH,kBAAmB,YAAYlzH,cAC/BmzH,oBAAqB,oBAAoBnzH,eAa1C,MAAMozH,WAAkB13G,EAAAA,EAuBvBhe,WAAAA,CAAYC,EAASuC,EAAS,CAAC,GAC9Byb,MAAMhe,EAASuC,GAEf/C,KAAKa,QAAUb,KAAK8C,WAAWtC,GAASM,EAAAA,EAAAA,IAAgB,CACvD06B,UAAU,EACVpf,UAAU,EACV4B,UAAU,EACV4d,MAAM,EACNvd,UAAW,CACVle,QAAQ,EACRC,GAAI,kBACJC,IAAK,mBACLwd,MAAO,KAERla,KAAM,CACLS,MAAO,GACPE,OAAQ,GACRD,OAAQ,MACRE,QAAQ,EACRQ,MAAM,EACNP,QAAQ,IAEPzB,IAEH/C,KAAKu8B,WAAa,IAAIjC,EACtBt6B,KAAKa,QAAQwd,UAAUR,MAAQ7d,KAAKa,QAAQwd,UAAUle,OAASH,KAAKa,QAAQwd,UAAUR,MAAQ,EAE9F7d,KAAKif,qBACLjf,KAAKmH,kBACLnH,KAAK6H,WAAW7H,KAAKW,SAAUkC,GAAU7C,KAAKa,QAAQwd,UACvD,CAMA,eAAW/V,GACV,MA5GW,SA6GZ,CAMA,mBAAWzF,GACV,OAAOA,EACR,CAQA4d,MAAAA,CAAOC,GACN,OAAO1gB,KAAK2gB,WAAa3gB,KAAK4gB,OAAS5gB,KAAKwgB,KAAKE,EAClD,CACAw1G,qBAAuB,KAQvB11G,IAAAA,CAAKE,IACAjT,EAAAA,EAAAA,IAAWzN,KAAKW,YAEhB+f,IACH1gB,KAAKa,QAAUb,KAAK8C,WAAW4d,EAAe1gB,KAAKa,UAGpDb,KAAKsD,QAAO,CAACwB,EAAQD,KACpBrD,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAU20H,GAAWK,OAAQ,CAAE10G,MAAOnc,EAAQD,QAAO,IAG9DrD,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAU20H,GAAWG,KAAM,CAAE/0G,kBAC3D/E,mBAEV3b,KAAKa,QAAQ26B,UAChBpB,EAAS5Z,OAGNxgB,KAAKa,QAAQub,UAChBpc,KAAKu8B,WAAW3b,OAGb5gB,KAAKa,QAAQ+6B,OAChBiB,QAAQC,UAAU,KAAM,GAAI,IAAI98B,KAAKW,SAAS6Q,MAE1CxR,KAAKk2H,sBACR10H,EAAAA,EAAac,IAAI+S,OAAQigH,GAAWS,kBAAmB/1H,KAAKk2H,sBAG7Dl2H,KAAKk2H,qBAAuB,IAAMl2H,KAAK4gB,OACvCpf,EAAAA,EAAaC,GAAG4T,OAAQigH,GAAWS,kBAAmB/1H,KAAKk2H,uBAG5Dl2H,KAAKW,SAASQ,UAAUC,IAAIkb,IAC5BjP,SAASvG,KAAK3F,UAAUC,IAAIib,IAU5Brc,KAAKyH,gBARoB8Z,KACxB,MAAMia,EAAWj5B,EAAAA,EAAUC,KAAK,gBAC5Bg5B,GACHh6B,EAAAA,EAAaC,GAAG+5B,EAAU,yBAAyB,IAAMx7B,KAAK4gB,SAE/Dpf,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAU20H,GAAWI,MAAO,CAAEh1G,iBAAgB,GAGnC1gB,KAAKW,UAAU,EAAM,KAC5D,CAQAigB,IAAAA,CAAKuc,GAAkB,IAClB1vB,EAAAA,EAAAA,IAAWzN,KAAKW,WAEFa,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAU20H,GAAWC,MACnD55G,mBAEdtO,SAASvG,KAAK3F,UAAUG,OAAO+a,IAC/Brc,KAAKW,SAASQ,UAAUG,OAAOgb,IAE/B/W,YAAW,KACVvF,KAAKW,SAAS+O,aAAa,gBAAiB,SA+B5C1P,KAAKyH,gBA7BoB8Z,KACnB4b,IACAn9B,KAAKa,QAAQ26B,SAChBpB,EAASxZ,MAAK,KACT5gB,KAAKa,QAAQub,UAChBpc,KAAKu8B,WAAW9C,OACjB,IAESz5B,KAAKa,QAAQub,UACvBpc,KAAKu8B,WAAW9C,QAGbz5B,KAAKa,QAAQ+6B,MAAQvmB,OAAOqO,SAASkY,OAAS,IAAI57B,KAAKW,SAAS6Q,MACnEqrB,QAAQ6nB,aACP,GACAr3C,SAAS6uB,MACT7mB,OAAOqO,SAAS6Z,SAAWloB,OAAOqO,SAAS8Z,QAIzCx9B,KAAKk2H,uBACR10H,EAAAA,EAAac,IAAI+S,OAAQigH,GAAWS,kBAAmB/1H,KAAKk2H,sBAC5Dl2H,KAAKk2H,qBAAuB,MAG7B10H,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAU20H,GAAWE,QAChD,GAGqCx1H,KAAKW,UAAU,EAAK,GACxDX,KAAKa,QAAQwd,UAAUR,OAC3B,CAMAxb,OAAAA,GACCmc,MAAMnc,UACNb,EAAAA,EAAac,IAAItC,KAAKW,SAAU20H,GAAWC,MACvCv1H,KAAKk2H,sBACR10H,EAAAA,EAAac,IAAI+S,OAAQigH,GAAWS,kBAAmB/1H,KAAKk2H,sBAE7Dl2H,KAAKu8B,WAAW9C,OACjB,CAOA9Y,QAAAA,GACC,OAAO3gB,KAAKW,SAASQ,UAAUE,SAASib,GACzC,CAMA2C,kBAAAA,GACCzd,EAAAA,EAAaC,GAAG4L,SAAUioH,GAAWM,iBAAkBtoH,IACpC,WAAdA,EAAM7M,MAENT,KAAKa,QAAQmd,SAChBhe,KAAK4gB,OAELpf,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAU20H,GAAWO,gBAChD,GAEF,GAID1oH,EAAAA,EAAAA,GAAe8oH,IAKfz0H,EAAAA,EAAaC,GAAG4L,SAAUioH,GAAWQ,eA7QR,8BA6Q8C,SAAUxoH,GACpF,MAAMhJ,EAAS/B,EAAAA,EAAU8gB,uBAAuBrjB,MAChD,IAAKsE,EAAQ,OAMb,GAJI,CAAC,IAAK,QAAQoH,SAAS1L,KAAKuN,UAC/BD,EAAME,kBAGHC,EAAAA,EAAAA,IAAWzN,MAAO,OAEtBA,KAAK0P,aAAa,gBAAiB,QAGnClO,EAAAA,EAAa8hB,IAAIhf,EAAQgxH,GAAWE,QAAQ,KAC3Cx1H,KAAK0P,aAAa,gBAAiB,QAAQ,IAI5C,MAAMmwB,EAAct9B,EAAAA,EAAUC,KAAK,oBAC/Bq9B,GAAeA,IAAgBv7B,GAClC2xH,GAAUnuH,YAAY+3B,GAAajf,OAGnBq1G,GAAUluH,oBAAoBzD,GACtCmc,OAAOzgB,KACjB,IAKAwB,EAAAA,EAAaC,GAAG4L,SAAUioH,GAAWU,qBAAqB,WACzD,MAAMp6F,EAAOvmB,OAAOqO,SAASkY,KAAK/Z,MAAM,GACxC,IAAK+Z,EAAM,OAEX,MAAMt3B,EAAS/B,EAAAA,EAAUC,KAAK,IAAIo5B,KAClC,GAAIt3B,GAAUA,EAAOnD,UAAUE,SAAS,iBAAkBoM,EAAAA,EAAAA,IAAWnJ,GAAS,CAC7E,MAAMic,EAAW01G,GAAUluH,oBAAoBzD,GAE3Cic,EAAS1f,QAAQ+6B,MACpBrb,EAASE,QAEX,CACD,IAEA,MC5UA,GD4UA,GErUM5d,GAAW,SACXK,GAAY,IAAIL,KAChBszH,GAAe,YAEfC,GAAiB,WAAWlzH,KAC5BmzH,GAAc,QAAQnzH,KACtBozH,GAAsB,OAAOpzH,KAAYizH,KAGzC5hB,GAAoB,SAGpBgiB,GAAwB,2BAExBC,GAAqB,YAGrBC,GAAsB,GAAGD,mBAA+CA,uBAS9E,MAAME,WAAcn4G,EAAAA,EAMnBhe,WAAAA,CAAYC,EAASuC,GACpByb,MAAMhe,EAASuC,GAWf/C,KAAKa,QAAUb,KAAK22H,mBACnB71H,EAAAA,EAAAA,IACC,CACCghB,OAAQ,KACR8xF,WAAY,eACZgjB,cAAc,EACdtyH,OAAQtE,KAAKW,SACbkR,UAAW,CAAC,GAAK,GAAK,IAEvB9O,IAQF/C,KAAK62H,aAAe,IAAI1oG,IAMxBnuB,KAAK82H,oBAAsB,IAAI3oG,IAM/BnuB,KAAK+2H,aAAe,KAMpB/2H,KAAKg3H,cAAgB,KAMrBh3H,KAAKga,UAAY,KAMjBha,KAAK46B,WAAa,KAMlB56B,KAAKi3H,mBAAqB,KAM1Bj3H,KAAKk3H,oBAAsB,CAC1BC,gBAAiB,EACjBC,gBAAiB,GAGlBp3H,KAAKm3D,SACN,CAMA,eAAW7uD,GACV,MArHW,KAsHZ,CAMA,mBAAWzF,GACV,OAAOA,EACR,CAKAs0D,OAAAA,GACCn3D,KAAKq3H,mCACLr3H,KAAKs3H,qBACLt3H,KAAKu3H,2BAELv3H,KAAKw3H,gBAGN,CAKAA,cAAAA,GACCx3H,KAAKy3H,yBAEDz3H,KAAK46B,WACR56B,KAAK03H,2BAIN13H,KAAK23H,6BACL33H,KAAK43H,mBAGD53H,KAAK+2H,eAAiB/2H,KAAK63H,kBAAkB73H,KAAK+2H,eAAiB1hH,OAAOyiH,WAC7EvyH,YAAW,KACNvF,KAAK46B,aACT56B,KAAKy3H,yBACDz3H,KAAK46B,YAAY56B,KAAK03H,0BAAyB,GACjD,GAEL,CAEAD,sBAAAA,GACC,MAAM/3H,EAAOM,KAAK+2H,aACZe,EAAYziH,OAAOyiH,UAEzB,IAAIv3G,EAAW,KACX7gB,IACH6gB,EAAW7gB,EAAKq4H,WAAa,MAExBx3G,GAAYu3G,GAAsC,mBAAlBA,EAAU70H,MAC9Csd,EAAWu3G,EAAU70H,IAAIvD,IAAS,OAIhC6gB,IAAavgB,KAAK46B,aAEtB56B,KAAK23H,6BACL33H,KAAK46B,WAAara,EACnB,CAEAm3G,uBAAAA,GACM13H,KAAK46B,YAAqD,mBAAhC56B,KAAK46B,WAAWo9F,cAG3Ch4H,KAAKga,WAAWha,KAAKga,UAAUkC,aAE/Blc,KAAKi3H,oBAAgE,mBAAnCj3H,KAAK46B,WAAWq9F,gBACrDj4H,KAAK46B,WAAWq9F,eAAej4H,KAAKi3H,oBAGrCj3H,KAAKi3H,mBAAsBnyH,GAAW9E,KAAKk4H,mBAAmBpzH,GAC9D9E,KAAK46B,WAAWo9F,YAAYh4H,KAAKi3H,oBAEjCj3H,KAAKk4H,mBAAmB,MACzB,CAEAP,0BAAAA,GACK33H,KAAK46B,YAAc56B,KAAKi3H,oBAAgE,mBAAnCj3H,KAAK46B,WAAWq9F,gBACxEj4H,KAAK46B,WAAWq9F,eAAej4H,KAAKi3H,oBAErCj3H,KAAKi3H,mBAAqB,IAC3B,CAEAiB,kBAAAA,CAAmBpzH,GAClB,MAAM44B,EAAY54B,GAAQgd,QAAQk1F,GAAKh3G,KAAKm4H,sBACtCC,EAAkB16F,GAAa19B,KAAKk3H,oBAAoBE,gBAC9Dp3H,KAAKk3H,oBAAoBE,gBAAkB15F,EAE3C,MAAM26F,EAAiBr4H,KAAKs4H,mBAAmB56F,GAEzC5R,EAAQ,GACd,IAAK,MAAOta,EAAIo7B,KAAY5sC,KAAK82H,oBAAoBtsG,UAAW,CAC/D,IAAKoiB,KAAYzY,EAAAA,EAAAA,IAAUyY,GAAU,SACrC,MAAM02C,EAAOtjF,KAAK62H,aAAa5zH,IAAIuO,GAC9B8xE,GAELx3D,EAAMnU,KAAK,CAAEjH,IAAK1Q,KAAKu4H,eAAe3rF,GAAU02C,QACjD,CAEAx3D,EAAMwgB,MAAK,CAACphB,EAAGqhB,IAAMrhB,EAAExa,IAAM67B,EAAE77B,MAE/B,IAAI8nH,EAAa,KACjB,IAAK,MAAM1oH,KAAQgc,EAClB,GAAIhc,EAAKY,KAAO2nH,EACfG,EAAa1oH,EAAKwzE,UACZ,IAAK80C,EACX,MAIFp4H,KAAKy4H,SAASD,EACf,CAEAF,kBAAAA,CAAmB56F,GAClB,MAAMg7F,EAAa14H,KAAK+2H,aACrB/2H,KAAK+2H,aAAa90G,aACjB5M,OAAOG,aAAenI,SAASulB,gBAAgB3Q,cAAgB,EAE7DpL,GAAU7W,KAAKa,QAAQ+yG,YAAc,IAAIntG,OACzCg9C,EAAQ5sC,EAASA,EAAOrL,MAAM,OAAS,GACvCyM,EAA0B,IAAjBwrC,EAAMr1C,QAED,IAAjBq1C,EAAMr1C,OADNq1C,EAAM,GAGLA,EAAMr1C,QAAU,EACfq1C,EAAM,GACN,KAEL,GAAIxrC,GAAUA,EAAO04D,SAAS,KAAM,CACnC,MAAMgoD,EAAM9jH,OAAOC,WAAWmD,GAC9B,IAAKpD,OAAO+jH,MAAMD,GAAM,OAAOj7F,EAAYg7F,GAAc,EAAIC,EAAM,IACpE,CAEA,GAAI1gH,GAAUA,EAAO04D,SAAS,MAAO,CACpC,MAAMkoD,EAAKhkH,OAAOC,WAAWmD,GAC7B,IAAKpD,OAAO+jH,MAAMC,GAAK,OAAOn7F,EAAYg7F,EAAaG,CACxD,CAEA,OAAOn7F,EAAyB,IAAbg7F,CACpB,CAEAd,gBAAAA,GACK53H,KAAKga,WAAWha,KAAKga,UAAUkC,aACnClc,KAAKga,UAAYha,KAAK84H,kBAEtB,IAAK,MAAMlsF,KAAW5sC,KAAK82H,oBAAoB7yH,SAC9CjE,KAAKga,UAAUiC,QAAQ2wB,EAEzB,CAEA0qF,kBAAAA,GAOC,GANAt3H,KAAK+2H,aAAe/2H,KAAK+4H,qBAAqB/4H,KAAKa,QAAQyD,SAEtDtE,KAAK+2H,cAAgB/2H,KAAK63H,kBAAkB73H,KAAKW,YACrDX,KAAK+2H,aAAe/2H,KAAKW,WAGrBX,KAAK+2H,aAAc,CACvB,MAAMiC,EAAeh5H,KAAK82H,oBAAoB7yH,SAASyvB,OAAOxvB,OAAS,KAGnE80H,GAAgBh5H,KAAKi5H,cAAcD,GACtCh5H,KAAK+2H,aAAeiC,EAAavlG,cAEjCzzB,KAAK+2H,aAAeiC,EAAeh5H,KAAKk5H,iBAAiBF,GAAgB,IAE3E,CAEAh5H,KAAKy3H,yBACLz3H,KAAKk3H,oBAAoBE,gBAAkBp3H,KAAKm4H,sBAChDn4H,KAAKk3H,oBAAoBC,gBAAkB,CAC5C,CAEA4B,oBAAAA,CAAqBv4H,GACpB,MAAMd,GAAOs0B,EAAAA,EAAAA,IAAWxzB,GACxB,IAAKd,EAAM,OAAO,KAClB,GAAIA,IAAS2N,SAASvG,MAAQpH,IAAS2N,SAASulB,gBAAiB,OAAO,KAExE,GAAI5yB,KAAK63H,kBAAkBn4H,GAAO,OAAOA,EAGzC,MAAMo4H,EAAYziH,OAAOyiH,UAEzB,OAD8Bp4H,EAAKq4H,WAAcD,GAAsC,mBAAlBA,EAAU70H,KAAsB60H,EAAU70H,IAAIvD,GACvFA,EAAO,IACpC,CAGAu5H,aAAAA,CAAcz4H,GACb,KAAMA,aAAmB24H,aAAc,OAAO,EAC9C,MAAM3lG,EAAShzB,EAAQizB,cACvB,QAAKD,GACExzB,KAAK63H,kBAAkBrkG,EAC/B,CAGAqkG,iBAAAA,CAAkBr3H,GACjB,KAAMA,aAAmB24H,aAAc,OAAO,EAC9C,MAAM15F,EAAYpL,iBAAiB7zB,GAASi/B,UAC5C,QAAK,wBAAwBnI,KAAKmI,IAC3Bj/B,EAAQy+B,aAAez+B,EAAQyhB,YACvC,CAEAi3G,gBAAAA,CAAiB14H,GAChB,IAAK,IAAIgzB,EAAShzB,EAAQizB,cAAeD,GAAUA,IAAWnmB,SAASvG,KAAM0sB,EAASA,EAAOC,cAC5F,GAAIzzB,KAAK63H,kBAAkBrkG,GAAS,OAAOA,EAE5C,OAAO,IACR,CAEA+kG,cAAAA,CAAe3rF,GACd,GAAI5sC,KAAK+2H,aAAc,CACtB,MAAMqC,EAAWp5H,KAAK+2H,aAAazmH,wBAC7BD,EAAOu8B,EAAQt8B,wBAErB,OADkBtQ,KAAK46B,YAAY9Y,QAAQk1F,GAAKh3G,KAAK+2H,aAAar5F,YAC9CrtB,EAAKK,IAAM0oH,EAAS1oH,IACzC,CAEA,OAAQ2E,OAAO4hE,SAAW5pE,SAASulB,gBAAgB8K,WAAa,GAAKkP,EAAQt8B,wBAAwBI,GACtG,CAEAynH,mBAAAA,GACC,OAAIn4H,KAAK46B,WAAmB56B,KAAK46B,WAAW9Y,QAAQk1F,GAAK,EACrDh3G,KAAK+2H,aAAqB/2H,KAAK+2H,aAAar5F,UACzCroB,OAAO4hE,SAAW5pE,SAASulB,gBAAgB8K,WAAa,CAChE,CAEAr7B,OAAAA,GACKrC,KAAKga,WACRha,KAAKga,UAAUkC,aAEhBlc,KAAK23H,6BACL33H,KAAK46B,WAAa,KAClBpc,MAAMnc,SACP,CAQAs0H,iBAAAA,CAAkB/wH,GAejB,OAdAA,EAAOtB,QAAS0vB,EAAAA,EAAAA,IAAWpuB,EAAOtB,SAAW+I,SAASvG,KAGjC,MAAjBlB,EAAOkc,SACVlc,EAAOguG,WAAa,GAAGhuG,EAAOkc,qBAIC,iBAArBlc,EAAOiM,YACjBjM,EAAOiM,UAAYjM,EAAOiM,UACxBrG,MAAM,KACN8C,KAAKpK,GAAU2Q,OAAOC,WAAW5Q,EAAMuC,WAGnCb,CACR,CAMA2xH,wBAAAA,GACMv3H,KAAKa,QAAQ+1H,eAElBp1H,EAAAA,EAAac,IAAItC,KAAKW,SAAU01H,IAChC70H,EAAAA,EAAaC,GAAGzB,KAAKW,SAAU01H,GAAaE,IAAwBjpH,IACnE,MAAMg2E,EAAOh2E,EAAMgjB,gBAAkBhjB,EAAMhJ,OACrCkN,EAAKxR,KAAKq5H,wBAAwB/1C,GACxC,IAAK9xE,EAAI,OAET,IAAIo7B,EAAU5sC,KAAK82H,oBAAoB7zH,IAAIuO,GAQ3C,GAPKo7B,IACJA,EAAUrqC,EAAAA,EAAUswB,OAAOrhB,GACvBo7B,IACH5sC,KAAK62H,aAAaj0H,IAAIgqC,EAAQp7B,GAAI8xE,GAClCtjF,KAAK82H,oBAAoBl0H,IAAIgqC,EAAQp7B,GAAIo7B,MAGtCA,EAAS,OAId,KAAKzY,EAAAA,EAAAA,IAAUyY,GA4Bd,YA3BArnC,YAAW,KACV,MAAM+zH,EAAW/2H,EAAAA,EAAUswB,OAAOrhB,GAClC,IAAK8nH,KAAanlG,EAAAA,EAAAA,IAAUmlG,GAAW,OAEvCt5H,KAAK62H,aAAaj0H,IAAI02H,EAAS9nH,GAAI8xE,GACnCtjF,KAAK82H,oBAAoBl0H,IAAI02H,EAAS9nH,GAAI8nH,GAE1Ct5H,KAAKs3H,qBACLt3H,KAAKw3H,iBAEL,MAAM9mH,EAAM1Q,KAAKu4H,eAAee,GAC5Bt5H,KAAK46B,YAAkD,mBAA7B56B,KAAK46B,WAAWu8C,SAC7Cn3E,KAAK46B,WAAWu8C,SAAS,EAAGzmE,EAAK,KACvB1Q,KAAK+2H,aACX/2H,KAAK+2H,aAAa5/C,SACrBn3E,KAAK+2H,aAAa5/C,SAAS,CAAEzmE,MAAK0mE,SAAU,WAE5Cp3E,KAAK+2H,aAAar5F,UAAYhtB,EAErB2E,OAAO8hE,SACjB9hE,OAAO8hE,SAAS,CAAEzmE,MAAK0mE,SAAU,WAEjC/pE,SAASulB,gBAAgB8K,UAAYhtB,EAGtC1Q,KAAKy4H,SAASn1C,EAAK,GACjB,GAIJh2E,EAAME,iBAENxN,KAAKs3H,qBACLt3H,KAAKw3H,iBAEL,MAAM95F,EAAY19B,KAAKu4H,eAAe3rF,GAChCltC,EAAOM,KAAK+2H,aAElB,OAAI/2H,KAAK46B,YAAkD,mBAA7B56B,KAAK46B,WAAWu8C,UAC7Cn3E,KAAK46B,WAAWu8C,SAAS,EAAGz5C,EAAW,UACvC19B,KAAKy4H,SAASn1C,IAIX5jF,GACCA,EAAKy3E,SACRz3E,EAAKy3E,SAAS,CAAEzmE,IAAKgtB,EAAW05C,SAAU,WAE1C13E,EAAKg+B,UAAYA,OAElB19B,KAAKy4H,SAASn1C,KAIXjuE,OAAO8hE,SACV9hE,OAAO8hE,SAAS,CAAEzmE,IAAKgtB,EAAW05C,SAAU,WAE5C/pE,SAASulB,gBAAgB8K,UAAYA,OAGtC19B,KAAKy4H,SAASn1C,GAAK,IAErB,CAOAw1C,eAAAA,GACC,MAAMnzH,EAAU,CACfjG,KAAMM,KAAK+2H,aACXnjB,WAAY5zG,KAAKa,QAAQ+yG,WACzB/hG,UAAW7R,KAAKa,QAAQgR,WAGzB,OAAO,IAAI6hG,sBAAsBlpF,GAAYxqB,KAAKu5H,kBAAkB/uG,IAAU7kB,EAC/E,CAOA4zH,iBAAAA,CAAkB/uG,GACjB,MAAMgvG,EAAiB/rF,GAAUztC,KAAK62H,aAAa5zH,IAAIwqC,EAAMnpC,OAAOkN,IAC9D4lH,EAAkBp3H,KAAKm4H,sBACvBC,EAAkBhB,GAAmBp3H,KAAKk3H,oBAAoBE,gBACpEp3H,KAAKk3H,oBAAoBE,gBAAkBA,EAE3C,IAAK,MAAM3pF,KAASjjB,EAAS,CAC5B,IAAKijB,EAAMkmE,eAAgB,CAC1B3zG,KAAKy5H,kBAAkBD,EAAc/rF,IACrC,QACD,CAEA,MAAMisF,EAAW15H,KAAKu4H,eAAe9qF,EAAMnpC,QACrCq1H,EAAeD,GAAY15H,KAAKk3H,oBAAoBC,iBAExDiB,GAAmBuB,IAAmBvB,IAAoBuB,KAG3D35H,KAAKk3H,oBAAoBC,gBAAkBuC,EAC3C15H,KAAKy4H,SAASe,EAAc/rF,IAE9B,CACD,CAMA4pF,gCAAAA,GACCr3H,KAAK62H,aAAar+B,QAClBx4F,KAAK82H,oBAAoBt+B,QAEzB,MAAMohC,EAAQr3H,EAAAA,EAAUqf,QAAQ20G,GAAuBv2H,KAAKW,UAC5D,IAAK,MAAM2iF,KAAQs2C,EAAO,CACzB,IAAInsH,EAAAA,EAAAA,IAAW61E,GAAO,SAEtB,MAAM9xE,EAAKxR,KAAKq5H,wBAAwB/1C,GACxC,IAAK9xE,EAAI,SAET,MAAMo7B,EAAUrqC,EAAAA,EAAUswB,OAAOrhB,GAC7Bo7B,IACH5sC,KAAK62H,aAAaj0H,IAAIgqC,EAAQp7B,GAAI8xE,GAClCtjF,KAAK82H,oBAAoBl0H,IAAIgqC,EAAQp7B,GAAIo7B,GAE3C,CACD,CAOA6rF,QAAAA,CAASn0H,GACJtE,KAAKg3H,gBAAkB1yH,IAG3BtE,KAAKy5H,kBAAkBz5H,KAAKW,UAC5BX,KAAKg3H,cAAgB1yH,EAEjBA,IACHA,EAAOnD,UAAUC,IAAImzG,IACrBv0G,KAAK65H,iBAAiBv1H,GACtB9C,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUy1H,GAAgB,CAAE11G,cAAepc,KAEvE,CAOAu1H,gBAAAA,CAAiBv1H,GAChB,GAAIA,EAAOnD,UAAUE,SA5iBU,oBA4iB/B,CACC,MAAMy4H,EAAiBv3H,EAAAA,EAAUC,KAliBH,8BAkiBkC8B,EAAOqJ,QAniBhD,iBAoiBnBmsH,GAAgBA,EAAe34H,UAAUC,IAAImzG,GAElD,MAGA,IAAK,MAAMwlB,KAAex3H,EAAAA,EAAUgxB,QAAQjvB,EA9iBd,qBA+iB7B,IAAK,MAAMqvB,KAAWpxB,EAAAA,EAAUuxB,KAAKimG,EAAatD,IACjD9iG,EAAQxyB,UAAUC,IAAImzG,GAGzB,CAOAklB,iBAAAA,CAAkBjmG,GACjB,IAAKA,EAAQ,OACbA,EAAOryB,UAAUG,OAAOizG,IAExB,MAAMylB,EAAcz3H,EAAAA,EAAUqf,QAC7B,UAAU2yF,wBAAuCA,KACjD/gF,GAED,IAAK,MAAM8vD,KAAQ02C,EAClB12C,EAAKniF,UAAUG,OAAOizG,GAExB,CAEA8kB,uBAAAA,CAAwBr4G,GACvB,IAAKA,GAA2C,mBAAzBA,EAAQzP,aAA6B,OAAO,KAEnE,MAAMmhB,GAAc1R,EAAQzP,aAAa,mBAAqB,IAAI9K,OAC5D0kB,GAAQnK,EAAQzP,aAAa,SAAW,IAAI9K,OAE5CmL,EAAY8gB,GAA6B,MAAfA,EAC7BA,EAEAvH,IAASA,EAAKzf,SAAS,MAAQyf,EAAKhpB,WAAW,MAC5CgpB,EAAKzf,SAAS,OAASyf,EAAKhpB,WAAW,KAAO,IAAIgpB,EAAK3f,MAAM,KAAK,KAAO2f,EAC1E,KAGL,IAAKvZ,GAAyB,MAAbA,IAAqBA,EAASzP,WAAW,KAAM,OAAO,KAEvE,MAAM4mD,EAAU/oD,KAAKi6H,YAAYroH,GACjC,OAAOm3C,GAAWA,EAAQ5mD,WAAW,MAAQ4mD,EAAQ36C,OAAS,EAAI26C,EAAQlnC,MAAM,GAAK,IACtF,CAEAo4G,WAAAA,CAAY/1H,GACX,IACC,OAAOuwB,mBAAmBvwB,EAC3B,CAAE,MACD,IACC,OAAOg2H,UAAUh2H,EAClB,CAAE,MACD,OAAOA,CACR,CACD,CACD,EAMD,MACC,IAAIi2H,GAAgB,EAEpB,MAAMjyH,EAAOA,KACZ,IAAIiyH,EAAJ,CACAA,GAAgB,EAEhB,IAAK,MAAMC,KAAO73H,EAAAA,EAAUqf,QApnBJ,0BAqnBvB80G,GAAM3uH,oBAAoBqyH,EAJF,CAKzB,EAI2B,YAAxB/sH,SAASgtH,WACZ74H,EAAAA,EAAaC,GAAG4L,SAAU,mBAAmBnK,KAAYizH,KAAgBjuH,GAEzEA,IAGD1G,EAAAA,EAAaC,GAAG4T,OAAQihH,GAAqBpuH,EAC7C,EApBD,GAsBA,MCrpBA,GDqpBA,GE3oBMrF,GAAW,UAKXy3H,GAAa,GAAGz3H,UAIhB03H,GAAe,GAAG13H,YAIlB23H,GAAa,GAAG33H,UAIhB43H,GAAc,GAAG53H,WAIjB63H,GAAe,GAAG73H,YAKlB83H,GAAgB,WAAW93H,KAI3ByzH,GAAsB,QAAQzzH,KAI9BskC,GAAuB,SAAStkC,KAIhCukC,GAA2B,aAAavkC,KAIxCwkC,GAA0B,YAAYxkC,KAKtC+3H,GAAW,CAAC,YAAa,aAAc,UAAW,YAAa,OAAQ,OAEvEC,GAAkB,aAElBC,GAAiB,YACjBC,GAAW,OACXC,GAAU,MAKV9gG,GACG,SADHA,GAEE,QAFFA,GAGC,OAHDA,GAIC,OAJDA,GAMG,iBAOH+gG,GAAiB,mJACjBC,GAAc,yBAEdC,GAAW,CAChBC,gBAAiB,8BACjBC,cAAe,oBACfC,UAAW,WACXC,UAAW,gDACXC,MAAO,kCACPC,MAAOR,GACPC,YAAaA,GACbQ,WAAY,GAAGT,OAAmBC,KAClCS,mBAAoB,iCASrB,MAAMC,WAAer9G,EAAAA,EAgBpBhe,WAAAA,CAAYC,EAASuC,GAmBpB,GAlBAyb,MAAMhe,EAASuC,GAEf/C,KAAKa,SAAUC,EAAAA,EAAAA,IAAgB,CAC9B+6H,OAAO,EACPjgG,MAAM,EACNj4B,KAAM,CACLS,MAAO,GACPE,OAAQ,GACRD,OAAQ,MACRE,QAAQ,EACRQ,MAAM,EACNP,QAAQ,IAEPxE,KAAKa,SAERb,KAAKwnC,QAAUxnC,KAAKW,SAASgN,QAAQwtH,GAASI,WAC9Cv7H,KAAK87H,aAAe97H,KAAKwnC,SAAS75B,QAAQwtH,GAASG,YAAc,MAE5Dt7H,KAAKwnC,QACT,MAAM,IAAIu0F,UAAU,GAAGv7H,EAAQmpB,4CAA4CwxG,GAASO,cAGrF17H,KAAKa,QAAUb,KAAK8C,WAAW9C,KAAK87H,aAAc97H,KAAKa,SACvDb,KAAKa,QAAUb,KAAK8C,WAAW9C,KAAKW,SAAUX,KAAKa,SAEnDb,KAAKg8H,sBAAsBh8H,KAAKwnC,QAASxnC,KAAKi8H,gBAC9Cj8H,KAAKk8H,oBACLl8H,KAAKm8H,cAEL36H,EAAAA,EAAaC,GAAGzB,KAAKW,SAAUg6H,IAAertH,GAAStN,KAAKo8H,SAAS9uH,IACtE,CAMA,eAAWhF,GACV,MAtJW,MAuJZ,CAMA,mBAAWzF,GACV,OAAOA,EACR,CAKA2d,IAAAA,GACC,MAAM67G,EAAYr8H,KAAKW,SAEvB,GAAIX,KAAKs8H,cAAcD,GAAY,OAEnC,MAAME,EAAav8H,KAAKw8H,iBAClB97G,EAAgB27G,EAGhBI,EAAYF,EAAa/6H,EAAAA,EAAawf,QAAQu7G,EAAYjC,GAAY,CAAC55G,kBAAkB,KAC7Elf,EAAAA,EAAawf,QAAQq7G,EAAW7B,GAAY,CAAC95G,kBAEjD/E,kBAAqB8gH,GAAaA,EAAU9gH,mBAE1D3b,KAAK08H,YAAYH,EAAYF,GAC7Br8H,KAAK28H,UAAUN,EAAW37G,GAC3B,CAOA47G,aAAAA,CAAcr5F,GACb,OAAOA,GAAM9hC,UAAUE,SAAS64B,MAAsB,CACvD,CAMAsiG,cAAAA,GACC,OAAOx8H,KAAKi8H,eAAez5H,MAAK6mB,GAASrpB,KAAKs8H,cAAcjzG,MAAW,IACxE,CAOAszG,SAAAA,CAAUn8H,EAASkgB,GAClB,IAAKlgB,EAAS,OAEdA,EAAQW,UAAUC,IAAI84B,IAEtB,MAAM51B,EAAS/B,EAAAA,EAAU8gB,uBAAuB7iB,GAC5C8D,GAAQtE,KAAK28H,UAAUr4H,EAAQoc,GAmBnC1gB,KAAKyH,gBAjBYs9B,KACqB,QAAjCvkC,EAAQ+Q,aAAa,SAKzBvR,KAAKsD,QAAO,CAACwB,EAAQD,KACpBrD,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAU+5H,GAAc,CAAEz5G,MAAOnc,EAAQD,QAAO,IAG3ErE,EAAQ2xB,gBAAgB,YACxB3xB,EAAQkP,aAAa,gBAAiB,QACtC1P,KAAK48H,gBAAgBp8H,GAAS,GAE9BgB,EAAAA,EAAawf,QAAQxgB,EAASi6H,GAAa,CAAE/5G,mBAZ5ClgB,EAAQW,UAAUC,IAAI84B,GAYsC,GAGhC15B,EAASA,EAAQW,UAAUE,SAAS64B,IACnE,CAOAwiG,WAAAA,CAAYl8H,EAASkgB,GACpB,IAAKlgB,EAAS,OAEdA,EAAQW,UAAUG,OAAO44B,IACzB15B,EAAQqc,OAER,MAAMvY,EAAS/B,EAAAA,EAAU8gB,uBAAuB7iB,GAC5C8D,GAAQtE,KAAK08H,YAAYp4H,EAAQoc,GAerC1gB,KAAKyH,gBAbYs9B,KACqB,QAAjCvkC,EAAQ+Q,aAAa,SAKzB/Q,EAAQkP,aAAa,gBAAiB,SACtClP,EAAQkP,aAAa,WAAY,MACjC1P,KAAK48H,gBAAgBp8H,GAAS,GAE9BgB,EAAAA,EAAawf,QAAQxgB,EAAS+5H,GAAc,CAAE75G,mBAR7ClgB,EAAQW,UAAUG,OAAO44B,GAQoC,GAGjC15B,EAASA,EAAQW,UAAUE,SAAS64B,IACnE,CAMAkiG,QAAAA,CAAS9uH,GACR,IAAKstH,GAASlvH,SAAS4B,EAAM7M,KAAM,OAEnC6M,EAAMuD,kBACNvD,EAAME,iBAEN,MAAM23B,EAAWnlC,KAAKi8H,eAAeh6H,QAAOqP,KAAO7D,EAAAA,EAAAA,IAAW6D,KAC9D,IAAIurH,EAEJ,GAAI,CAAC9B,GAAUC,IAAStvH,SAAS4B,EAAM7M,KACtCo8H,EAAoB13F,EAAS73B,EAAM7M,MAAQs6H,GAAW,EAAI51F,EAAS/2B,OAAS,OACtE,CACN,MAAM0uH,EAAS,CAACjC,GAAiBC,IAAgBpvH,SAAS4B,EAAM7M,KAChEo8H,GAAoBpmG,EAAAA,EAAAA,IAAqB0O,EAAU73B,EAAMhJ,OAAQw4H,GAAQ,EAC1E,CAEID,IACHA,EAAkBnhG,MAAM,CAACqhG,eAAe,IACxCnB,GAAO7zH,oBAAoB80H,GAAmBr8G,OAEhD,CAKA27G,WAAAA,GACC,IAAKn8H,KAAKa,QAAQ+6B,KAAM,OAExB,MAAMzvB,EAAMkB,SAASqW,SAASU,WAC9B,IAAKjY,EAAIT,SAAS,KAAM,OAExB,MAAM8F,EAAKrF,EAAIX,MAAM,KAAK,GACpBhL,EAAU+B,EAAAA,EAAUC,KAAK,WAAWgP,MAAQxR,KAAKwnC,UACtDjlC,EAAAA,EAAUC,KAAK,qBAAqBgP,MAAQxR,KAAKW,WACjD,KAEGH,GACHo7H,GAAO7zH,oBAAoBvH,GAASggB,MAEtC,CAKA07G,iBAAAA,GACC,IAAKl8H,KAAKa,QAAQg7H,MAAO,OAEzB,IAAImB,EAASz6H,EAAAA,EAAUC,KAAK,IAAI03B,KAAqBl6B,KAAK87H,cACrDkB,IACJA,EAAS3vH,SAAS2K,cAAc,QAChCglH,EAAO77H,UAAUC,IAAI84B,IACrBl6B,KAAK87H,aAAa/gE,QAAQiiE,IAG3Bh9H,KAAK87H,aAAa36H,UAAUC,IA3PhB,uBA6PZ,MAAMo3H,EAAaj2H,EAAAA,EAAUC,KAAK,IAAI03B,KAAqBl6B,KAAKwnC,SAChE,IAAKgxF,EAAY,OAEjB,MAAM,MAAC/jH,EAAK,OAAEjE,GAAU6E,OAAOgf,iBAAiBmkG,GAChDA,EAAWr3H,UAAUC,IAAI84B,IAEzB8iG,EAAOjpH,MAAMU,MAAQA,EACrBuoH,EAAOjpH,MAAMvD,OAASA,EACtBwsH,EAAOjpH,MAAMgB,KAAO,GAAGyjH,EAAWyE,eAGlCz7H,EAAAA,EAAaC,GAAGzB,KAAK87H,aAAc10F,GAA0B+zF,GAASD,aAAc5tH,IACnF,MAAMhJ,EAASgJ,EAAMhJ,OAErB,GADI,CAAC,IAAK,QAAQoH,SAASpH,EAAOiJ,UAAUD,EAAME,kBAC9CC,EAAAA,EAAAA,IAAWnJ,GAAS,OAExB,MAAMijC,EAAQhlC,EAAAA,EAAUC,KAAK,IAAI03B,KAAoBl6B,KAAKwnC,SACtDD,GAAOA,EAAMpmC,UAAUG,OAAO44B,IAClC51B,EAAOnD,UAAUC,IAAI84B,IAErB,MAAM,MAACzlB,EAAK,OAAEjE,GAAU6E,OAAOgf,iBAAiB/vB,GAChD04H,EAAOjpH,MAAMU,MAAQA,EACrBuoH,EAAOjpH,MAAMvD,OAASA,EACtBwsH,EAAOjpH,MAAMgB,KAAO,GAAGzQ,EAAO24H,cAAc,IAI7Cz7H,EAAAA,EAAaC,GAAGzB,KAAK87H,aAAcz0F,GAAyB8zF,GAASD,aAAa,KACjF,MAAMxkG,EAASn0B,EAAAA,EAAUC,KAAK,IAAI03B,KAAqBl6B,KAAKwnC,UACtD,MAAC/yB,EAAK,OAAEjE,GAAU6E,OAAOgf,iBAAiBqC,GAEhDn0B,EAAAA,EAAUqf,QAAQ,IAAIsY,KAAoBl6B,KAAKwnC,SAASplC,SAAQkP,GAAMA,EAAGnQ,UAAUG,OAAO44B,MAC1FxD,EAAOv1B,UAAUC,IAAI84B,IAErB8iG,EAAOjpH,MAAMU,MAAQA,EACrBuoH,EAAOjpH,MAAMvD,OAASA,EACtBwsH,EAAOjpH,MAAMgB,KAAO,GAAG2hB,EAAOumG,cAAc,GAE9C,CAOAjB,qBAAAA,CAAsBxoG,EAAQ2R,GAC7BnlC,KAAKk9H,yBAAyB1pG,EAAQ,OAAQ,WAC9C2R,EAAS/iC,SAAQinB,GAASrpB,KAAKm9H,6BAA6B9zG,IAC7D,CAMA8zG,4BAAAA,CAA6B9zG,GAC5BA,EAAQrpB,KAAKo9H,iBAAiB/zG,GAC9B,MAAMw8E,EAAW7lG,KAAKs8H,cAAcjzG,GAC9Bg0G,EAAYr9H,KAAKs9H,iBAAiBj0G,GAExCA,EAAM3Z,aAAa,gBAAiBm2F,GAChCw3B,IAAch0G,GACjBrpB,KAAKk9H,yBAAyBG,EAAW,OAAQ,gBAE7Cx3B,GACJx8E,EAAM3Z,aAAa,WAAY,MAEhC1P,KAAKk9H,yBAAyB7zG,EAAO,OAAQ,OAC7CrpB,KAAKu9H,mCAAmCl0G,EACzC,CAMAk0G,kCAAAA,CAAmCl0G,GAClC,MAAM/kB,EAAS/B,EAAAA,EAAU8gB,uBAAuBgG,GAC3C/kB,IAELtE,KAAKk9H,yBAAyB54H,EAAQ,OAAQ,YAC1C+kB,EAAM7X,IACTxR,KAAKk9H,yBAAyB54H,EAAQ,kBAAmB+kB,EAAM7X,IAEjE,CAQA0rH,wBAAAA,CAAyB18H,EAASg9H,EAAWt5H,GACvC1D,EAAQ0xB,aAAasrG,IACzBh9H,EAAQkP,aAAa8tH,EAAWt5H,EAElC,CAMA+3H,YAAAA,GACC,OAAO15H,EAAAA,EAAUqf,QAAQu5G,GAASO,WAAY17H,KAAKwnC,QACpD,CAOA41F,gBAAAA,CAAiBn6F,GAChB,OAAOA,EAAKpP,QAAQsnG,GAASO,YAAcz4F,EAAO1gC,EAAAA,EAAUC,KAAK24H,GAASO,WAAYz4F,EACvF,CAOAq6F,gBAAAA,CAAiBr6F,GAChB,OAAOA,EAAKt1B,QAAQwtH,GAASK,QAAUv4F,CACxC,CAOA25F,eAAAA,CAAgBp8H,EAASmmB,GACxB,MAAM02G,EAAYr9H,KAAKs9H,iBAAiB98H,GACxC,IAAK68H,EAAUl8H,UAAUE,SAhYhB,YAgY+C,OAExD,MAAMof,EAASA,CAAC7O,EAAUkR,KACzB,MAAMxR,EAAK/O,EAAAA,EAAUC,KAAKoP,EAAUyrH,GAChC/rH,GAAIA,EAAGnQ,UAAUsf,OAAOqC,EAAW6D,EAAK,EAG7ClG,EAAO06G,GAASC,gBAAiBlhG,IACjCzZ,EAAO06G,GAASE,cAAenhG,IAC/BmjG,EAAU3tH,aAAa,gBAAiBiX,EACzC,EAMDnlB,EAAAA,EAAaC,GAAG4L,SAAU85B,GAAsBg0F,GAASD,aAAa,SAAU5tH,GAC3E,CAAC,IAAK,QAAQ5B,SAAS1L,KAAKuN,UAC/BD,EAAME,kBAEHC,EAAAA,EAAAA,IAAWzN,OACf47H,GAAO7zH,oBAAoB/H,MAAMwgB,MAClC,IAKAhf,EAAAA,EAAaC,GAAG4T,OAAQihH,IAAqB,KAC5C/zH,EAAAA,EAAUqf,QAAQu5G,GAASQ,oBAAoBv5H,SAAQ5B,IACtDo7H,GAAO7zH,oBAAoBvH,EAAQ,GAClC,IAGH,MC1eA,GD0eA,GEreMqC,GAAW,aAEX0gC,GAAuB,6BACvBk6F,GAA+B,6BAE/BphH,GAAkB,kBAClBC,GAAkB,OAClBC,GAAmB,QAEnBmhH,GAAwB,GAAGn6F,MAAwBjnB,OAAoBmhH,MAAgCnhH,KAEvGQ,GAAiB,GAAGja,UACpBka,GAAmB,GAAGla,YACtBma,GAAiB,GAAGna,UACpBoa,GAAkB,GAAGpa,WAErBua,GAA2B,SAASva,cACpC86H,GAAuB,cAAc96H,KACrC+6H,GAAuB,cAAc/6H,KACrCu4B,GAA0B,iBAAiBv4B,KAC3Cg7H,GAAoB,mBAAmBh7H,KAEvCi7H,GAAoB,CACzB,MACA,YACA,UACA,SACA,eACA,aACA,OACA,aACA,WACA,QACA,cACA,aAGKrgH,GAAgB,CACrBye,MAAO,GACP9b,QAAS,GACTY,QAAS,QACTrD,UAAW,MACXgV,UAAW,OACXorG,SAAS,EACTrjG,MAAM,EACN5Y,OAAQ,CAAC,EAAG,GACZ0jB,UAAU,EACVC,oBAAoB,EACpBC,mBAAoB,CAAC,SAAU,QAAS,QACxCs4F,qBAAqB,EACrBhgH,UAAU,EACVigH,YAAY,EACZpgH,MAAO,CACN2C,KAAM,IACNI,KAAM,KAEPy2C,MAAO,CACNl/C,QAAS,GAEV+lH,OAAQ,CACPv5H,MAAO,IAER0Z,UAAW,CACVle,QAAQ,EACRC,GAAI,oBACJC,IAAK,uBACLwd,MAAO,IACPS,OAAQ,SAIV,MAAM6/G,WAAkB5/G,EAAAA,EACvBhe,WAAAA,CAAYC,EAASuC,EAAS,CAAC,GAC9Byb,MAAMhe,EAASuC,GAEf/C,KAAKa,QAAUb,KAAK8C,WAAWtC,GAASM,EAAAA,EAAAA,IAAgB2c,GAAe1a,IACvE/C,KAAKo+H,SAAW,KAChBp+H,KAAKof,WAAY,EACjBpf,KAAKq+H,aAAe,KACpBr+H,KAAKmf,aAAe,KAEpBnf,KAAKs+H,YAELt+H,KAAKu+H,cAAgB,KAChBv+H,KAAK2gB,YACR3gB,KAAKkhB,eACN,CAEF,CAEA,eAAW5Y,GACV,MA5FW,SA6FZ,CAEA,mBAAWzF,GACV,OAAOA,EACR,CAEA4d,MAAAA,CAAOC,GACN,OAAO1gB,KAAK2gB,WAAa3gB,KAAK4gB,OAAS5gB,KAAKwgB,KAAKE,EAClD,CAEAF,IAAAA,CAAKE,IACAjT,EAAAA,EAAAA,IAAWzN,KAAKW,WAAaX,KAAK2gB,aAEtC3gB,KAAKw+H,iBAELx+H,KAAKq+H,aAAe94H,YAAW,KAC9BvF,KAAKq+H,aAAe,KAEF78H,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUqc,GAAgB,CAAE0D,kBAC1D/E,mBAEV3b,KAAKa,QAAQo9H,YAChBj+H,KAAKy+H,sBAGNz+H,KAAKof,WAAY,EACjBpf,KAAKuoH,iBAEAvoH,KAAKo+H,WAEVp+H,KAAKo+H,SAASj9H,UAAUG,OAAOib,IAC/Bvc,KAAKo+H,SAASj9H,UAAUC,IAAIkb,IAC5Btc,KAAKW,SAASQ,UAAUC,IAAIkb,IAC5BjP,SAASvG,KAAK3F,UAAUC,IAAIib,IAE5Brc,KAAK0+H,sBAELzuH,uBAAsB,KAChBjQ,KAAKo+H,WAEVp+H,KAAKkhB,gBAELlhB,KAAKyH,gBAAe,KACdzH,KAAKo+H,WAAYp+H,KAAKof,YAE3Bpf,KAAKo+H,SAASj9H,UAAUC,IAAImb,IAC5B/a,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUsc,GAAiB,CAAEyD,kBAAgB,GACrE1gB,KAAKo+H,UAAU,EAAMp+H,KAAKa,QAAQwd,UAAUR,OAAM,KACpD,GACA7d,KAAKa,QAAQgd,MAAM2C,MACvB,CAEAI,IAAAA,GACM5gB,KAAK2gB,aAAc3gB,KAAKof,WAAcpf,KAAKo+H,WAEhDp+H,KAAKw+H,iBAELx+H,KAAKmf,aAAe5Z,YAAW,KAC9BvF,KAAKmf,aAAe,KAEF3d,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUmc,IACxCnB,mBAEd3b,KAAK2+H,yBAEL3+H,KAAKof,WAAY,EACjBpf,KAAKo+H,SAASj9H,UAAUG,OAAOib,IAE/Bvc,KAAKyH,gBAAe,KACdzH,KAAKo+H,WAEVp+H,KAAKo+H,SAASj9H,UAAUG,OAAOgb,IAC/Btc,KAAKW,SAASQ,UAAUG,OAAOgb,IAC/Btc,KAAKW,SAASwxB,gBAAgB,oBAE9BnyB,KAAKo+H,SAAS98H,SACdtB,KAAKo+H,SAAW,KAChBp+H,KAAKof,WAAY,EAEZ7c,EAAAA,EAAUC,KAAK,qBACnB6K,SAASvG,KAAK3F,UAAUG,OAAO+a,IAGhC7a,EAAAA,EAAawf,QAAQhhB,KAAKW,SAAUoc,IAAiB,GACnD/c,KAAKo+H,UAAU,EAAOp+H,KAAKa,QAAQwd,UAAUR,OAAM,GACpD7d,KAAKa,QAAQgd,MAAM+C,MACvB,CAEAve,OAAAA,GACCrC,KAAKw+H,iBACLx+H,KAAK2+H,yBAED3+H,KAAKo+H,WACRp+H,KAAKo+H,SAAS98H,SACdtB,KAAKo+H,SAAW,MAGjB,MAAMQ,EAAgB5+H,KAAKW,SAASyT,QAAQyqH,gBACxCD,GACH5+H,KAAKW,SAAS+O,aAAa,QAASkvH,GAGrCpgH,MAAMnc,SACP,CAEAse,QAAAA,GACC,QAAS3gB,KAAKW,UAAYX,KAAKW,SAASQ,UAAUE,SAASib,GAC5D,CAEAisG,cAAAA,GACC,GAAIvoH,KAAKo+H,SAAU,OAEnB,MAAMliG,EAAQl8B,KAAK8+H,YACnB,IAAK5iG,EAAO,OAEZ,MAAM1qB,EAAK,eAAciO,EAAAA,EAAAA,QACnB6oG,EAAUj7G,SAAS2K,cAAc,OAEvCswG,EAAQ92G,GAAKA,EACb82G,EAAQxlG,UAAY,cAAc9iB,KAAKa,QAAQ8c,aAAa3d,KAAKa,QAAQq9H,OAAOv5H,OAAS,KACzF2jH,EAAQ54G,aAAa,OAAQ1P,KAAKa,QAAQk9H,QAAU,SAAW,WAE3D/9H,KAAKa,QAAQk9H,SAChBzV,EAAQnnH,UAAUC,IAAI,sBAGvB,MAAM68G,EAAQ5wG,SAAS2K,cAAc,OAGrC,GAFAimG,EAAM98G,UAAUC,IAAI,oBAEhBpB,KAAKa,QAAQuf,QAAS,CACzB,MAAM2+G,EAAa1xH,SAAS2K,cAAc,OAC1C+mH,EAAW59H,UAAUC,IAAI,2BAEzB,MAAM49H,EAAe3xH,SAAS2K,cAAc,OAC5CgnH,EAAa79H,UAAUC,IAAI,6BAEvBpB,KAAKa,QAAQ65B,MAChBqkG,EAAWj7H,UAAYo4B,EACvB8iG,EAAal7H,UAAY9D,KAAKa,QAAQuf,UAEtC2+G,EAAWlmH,YAAcqjB,EACzB8iG,EAAanmH,YAAc7Y,KAAKa,QAAQuf,SAGzC69F,EAAMxlG,OAAOsmH,GACb9gB,EAAMxlG,OAAOumH,EACd,MACKh/H,KAAKa,QAAQ65B,KAChBujF,EAAMn6G,UAAYo4B,EAElB+hF,EAAMplG,YAAcqjB,EAItB,MAAMm7B,EAAQhqD,SAAS2K,cAAc,OACrCq/C,EAAMl2D,UAAUC,IAAI,oBAEpB68G,EAAMxlG,OAAO4+C,GACbixD,EAAQ7vG,OAAOwlG,GAEf,MAAMtrF,EAAuC,SAA3B3yB,KAAKa,QAAQ8xB,UAC5BtlB,SAASvG,KACTvE,EAAAA,EAAUC,KAAKxC,KAAKa,QAAQ8xB,WAE1BA,IAELA,EAAUla,OAAO6vG,GAEjBtoH,KAAKW,SAAS+O,aAAa,mBAAoB8B,GAC/CxR,KAAKo+H,SAAW9V,EAEhBtoH,KAAK6H,WAAW7H,KAAKo+H,SAAUD,GAAUt7H,SAAU7C,KAAKa,QAAQwd,WACjE,CAEAygH,SAAAA,GACC,OACC9+H,KAAKa,QAAQq7B,OACbl8B,KAAKW,SAASyT,QAAQ6qH,SACtBj/H,KAAKW,SAASyT,QAAQyqH,iBACtB,EAEF,CAEAP,SAAAA,GACC,MAAMpiG,EAAQl8B,KAAKW,SAAS4Q,aAAa,SAEpC2qB,IAELl8B,KAAKW,SAAS+O,aAAa,yBAA0BwsB,GACrDl8B,KAAKW,SAASwxB,gBAAgB,SAC/B,CAEAjR,aAAAA,GACMlhB,KAAKo+H,WAEQ,IAAIr2F,GAAU,CAC/B1C,UAAWrlC,KAAKW,SAChB2kC,KAAMtlC,KAAKo+H,SACXzgH,UAAW3d,KAAKa,QAAQ8c,UACxBmE,OAAQ9hB,KAAKa,QAAQihB,OACrB0jB,SAAUxlC,KAAKa,QAAQ2kC,SACvBC,mBAAoBzlC,KAAKa,QAAQ4kC,mBACjCC,mBAAoB1lC,KAAKa,QAAQ6kC,mBACjCC,OAAO,EACPE,SAAS,IAGA3kB,gBAEVlhB,KAAKk/H,sBACLl/H,KAAKm/H,qBACN,CAEAA,kBAAAA,GACC,IAAKn/H,KAAKo+H,SAAU,OAEpB,MAAMngB,EAAQj+G,KAAKo+H,SAAS72H,cAAc,qBACpC8vD,EAAQr3D,KAAKo+H,SAAS72H,cAAc,qBAE1C,IAAK02G,IAAU5mD,EAAO,OAEtB,MAAM15C,EAAY3d,KAAKo+H,SAAS7sH,aAAa,sBAAwBvR,KAAKa,QAAQ8c,UAE5EyhH,EAAcp/H,KAAKW,SAAS2P,wBAC5B+uH,EAAYphB,EAAM3tG,wBAElBgvH,EAAiBF,EAAYrqH,KAAOqqH,EAAY3qH,MAAQ,EACxD8qH,EAAiBH,EAAY1uH,IAAM0uH,EAAY5uH,OAAS,EAExDgvH,EAAex/H,KAAKa,QAAQw2D,MAAMl/C,QAOxC,GALAk/C,EAAMtjD,MAAMgB,KAAO,GACnBsiD,EAAMtjD,MAAMgI,MAAQ,GACpBs7C,EAAMtjD,MAAMrD,IAAM,GAClB2mD,EAAMtjD,MAAMkE,OAAS,GAEjB0F,EAAUxb,WAAW,QAAUwb,EAAUxb,WAAW,UAAW,CAClE,IAAIs9H,EAAYH,EAAiBD,EAAUtqH,KAE3C0qH,EAAYtqH,KAAKC,IAChBoqH,EACArqH,KAAKO,IAAI+pH,EAAWJ,EAAU5qH,MAAQ+qH,IAGvCnoE,EAAMtjD,MAAMgB,KAAO,GAAG0qH,MACtBpoE,EAAMtjD,MAAM+C,UAAY,iCAEpB6G,EAAUxb,WAAW,OACxBk1D,EAAMtjD,MAAMkE,OAAS,OAErBo/C,EAAMtjD,MAAMrD,IAAM,MAEpB,CAEA,GAAIiN,EAAUxb,WAAW,SAAWwb,EAAUxb,WAAW,SAAU,CAClE,IAAIu9H,EAAWH,EAAiBF,EAAU3uH,IAE1CgvH,EAAWvqH,KAAKC,IACfoqH,EACArqH,KAAKO,IAAIgqH,EAAUL,EAAU7uH,OAASgvH,IAGvCnoE,EAAMtjD,MAAMrD,IAAM,GAAGgvH,MACrBroE,EAAMtjD,MAAM+C,UAAY,iCAEpB6G,EAAUxb,WAAW,QACxBk1D,EAAMtjD,MAAMgI,MAAQ,OAEpBs7C,EAAMtjD,MAAMgB,KAAO,MAErB,CACD,CAEAmqH,mBAAAA,GACC,IAAKl/H,KAAKo+H,SAAU,OAEpB,MAAMzgH,EAAY3d,KAAKo+H,SAAS7sH,aAAa,qBAE7CvR,KAAKo+H,SAASj9H,UAAUG,UAAUw8H,IAE9BngH,GACH3d,KAAKo+H,SAASj9H,UAAUC,IAAIuc,EAE9B,CAEA8gH,mBAAAA,GACCl8H,EAAAA,EAAUqf,QAAQ,oBAAoBxf,SAAQkmH,IAC7C,MAAM92G,EAAK82G,EAAQ92G,GACbwP,EAAUze,EAAAA,EAAUC,KAAK,sBAAsBgP,OAErD,IAAKwP,GAAWA,IAAYhhB,KAAKW,SAAU,OAE3C,MAAM4f,EAAW49G,GAAUr2H,YAAYkZ,GACvCT,GAAUK,MAAM,GAElB,CAEA89G,mBAAAA,GACCrpH,OAAOzF,iBAAiB,SAAU5P,KAAKu+H,eACvClpH,OAAOzF,iBAAiB,SAAU5P,KAAKu+H,eAAe,EACvD,CAEAI,sBAAAA,GACCtpH,OAAO3D,oBAAoB,SAAU1R,KAAKu+H,eAC1ClpH,OAAO3D,oBAAoB,SAAU1R,KAAKu+H,eAAe,EAC1D,CAEAC,cAAAA,GACKx+H,KAAKq+H,eACRl7G,aAAanjB,KAAKq+H,cAClBr+H,KAAKq+H,aAAe,MAGjBr+H,KAAKmf,eACRgE,aAAanjB,KAAKmf,cAClBnf,KAAKmf,aAAe,KAEtB,EAGD,MAAMwgH,GAAoBA,IAClBp9H,EAAAA,EAAUqf,QAAQ87G,IACvBpvH,KAAI9N,GAAW29H,GAAUr2H,YAAYtH,KACrCyB,OAAO8V,SAGVvW,EAAAA,EAAaC,GAAG4L,SAAUwwH,IAAmBvwH,IAC1B,WAAdA,EAAM7M,KAEVk/H,KAAoBv9H,SAAQme,IACtBA,EAAS1f,QAAQmd,UAAauC,EAASI,YAE5CJ,EAASK,MAAM,GACd,IAGHpf,EAAAA,EAAaC,GAAG4L,SAAU+tB,IAAyB9tB,IAClDqyH,KAAoBv9H,SAAQme,IACtBA,EAAS1f,QAAQm9H,sBACjBz9G,EAAS1f,QAAQmgB,QAAQtV,SAAS,UAAa6U,EAAS1f,QAAQk9H,UAChEx9G,EAASI,aAGbJ,EAAS69G,UAAU/8H,SAASiM,EAAMhJ,SAClCic,EAAS5f,SAASU,SAASiM,EAAMhJ,SAKlCic,EAASK,OAAM,GACd,IAGHpf,EAAAA,EAAaC,GAAG4L,SAAUswH,GAAsBp6F,IAAsB,WACrE,MAAMhjB,EAAW49G,GAAUp2H,oBAAoB/H,MAE3CugB,EAAS1f,QAAQmgB,QAAQtV,SAAS,UACrC6U,EAASC,KAAKxgB,KAEhB,IAEAwB,EAAAA,EAAaC,GAAG4L,SAAUuwH,GAAsBr6F,IAAsB,WACrE,MAAMhjB,EAAW49G,GAAUp2H,oBAAoB/H,MAE3CugB,EAAS1f,QAAQmgB,QAAQtV,SAAS,UACrC6U,EAASK,MAEX,IAEApf,EAAAA,EAAaC,GAAG4L,SAAU+P,GAA0BmmB,IAAsB,SAAUj2B,GACnF,MAAMiT,EAAW49G,GAAUp2H,oBAAoB/H,MAE3CugB,EAAS1f,QAAQk9H,UACpBx9G,EAAS1f,QAAQmgB,QAAU,SAGxBT,EAAS1f,QAAQmgB,QAAQtV,SAAS,WACrC4B,EAAME,iBACN+S,EAASE,OAAOzgB,MAElB,IAEAwB,EAAAA,EAAaC,GAAG4L,SAAU+P,GAA0BqgH,IAA8B,SAAUnwH,GAC3FA,EAAME,iBAEN,MAAM+S,EAAW49G,GAAUp2H,oBAAoB/H,MAE/CugB,EAAS1f,QAAQk9H,SAAU,EAC3Bx9G,EAAS1f,QAAQmgB,QAAU,QAE3BT,EAASE,OAAOzgB,KACjB,IAEA,MC1eA,GD0eA,GEvYM4/H,GAAiB,CACtBr+F,GACA2C,GACAoD,GACAs5B,GACAgnC,GACAja,GACAmf,GACAqF,GACAS,GACAr3E,EACAi5E,GACAgF,GACAuM,GACA8E,GACAqD,GACA+H,GACAS,GACAkF,GACA3qH,GAAAA,EACAktH,IAGa,IAvGd,MACC59H,WAAAA,CAAYoF,EAAU,CAAC,GACtB3F,KAAK6/H,SAAW,IAAI1xG,IACpBnuB,KAAK8/H,aAA8C,mBAAxBn6H,EAAQo6H,YAChCp6H,EAAQo6H,YACR,KACH//H,KAAK+gE,gBAAiB,CACvB,CAEAi/D,QAAAA,IAAYx1G,GACX,MAAMy1G,EAAUz1G,EAAQ01G,SAASzyF,GAC5Br8B,MAAMiP,QAAQotB,GACVA,EAGDA,EAAQ,CAACA,GAAS,KAG1B,IAAK,MAAM0yF,KAAUF,EAAS,CAC7B,MAAMxyC,EAAY0yC,GAAQ71B,SAAW61B,EAC/Bx0H,EAAOnF,OAAOinF,GAAWnlF,MAAQ,IAAI7B,OAE3C,IAAKkF,EAAM,CACV,MAAMy0H,EAAaD,GAA4B,iBAAXA,EACjC/8H,OAAOwgB,KAAKu8G,GAAQ38G,KAAK,MACzB,GACH,MAAM,IAAI/gB,MAAM,kEAAkE29H,UAAqBD,IACxG,CAEAngI,KAAK6/H,SAASj9H,IAAI+I,EAAM8hF,EACzB,CAEA,OAAOztF,IACR,CAEAgI,IAAAA,CAAKpC,EAAS,CAAC,GACd5F,KAAKqgI,qBAEL,IAAK,MAAO10H,EAAMw0H,KAAWngI,KAAK6/H,SAAU,CAC3C,GAA4B,mBAAjBM,GAAQn4H,KAClB,SAGD,MAAMs4H,EAAetgI,KAAKugI,qBAAqB50H,EAAM/F,GACrDu6H,EAAOn4H,KAAKs4H,EACb,CAEA,OAAOtgI,IACR,CAEAiD,GAAAA,CAAI0I,GAEH,OADA3L,KAAKqgI,qBACErgI,KAAK6/H,SAAS58H,IAAIuD,OAAOmF,GAAMlF,OACvC,CAEAqiB,GAAAA,CAAInd,GAEH,OADA3L,KAAKqgI,qBACErgI,KAAK6/H,SAAS/2G,IAAItiB,OAAOmF,GAAMlF,OACvC,CAEA85H,oBAAAA,CAAqB50H,EAAM/F,GAC1B,GAAKA,GAA4B,iBAAXA,EAItB,OAAOxC,OAAO+E,UAAUhE,eAAeiE,KAAKxC,EAAQ+F,GACjD/F,EAAO+F,QACP5E,CACJ,CAEAs5H,kBAAAA,GACKrgI,KAAK+gE,gBAA+C,mBAAtB/gE,KAAK8/H,eAIvC9/H,KAAK+gE,gBAAiB,EACtB/gE,KAAK8/H,aAAa9/H,MACnB,GA0BuB,CACvB+/H,YAAcS,GAAQA,EAAIR,SAASJ","sources":["webpack://vgapp/webpack/universalModuleDefinition","webpack://vgapp/./app/utils/js/components/animation.js","webpack://vgapp/./app/modules/base-module.js","webpack://vgapp/./app/utils/js/components/file-icon.js","webpack://vgapp/./app/modules/module-fn.js","webpack://vgapp/./app/modules/vgfiles/js/sortable.js","webpack://vgapp/./app/modules/vgtoast/index.js","webpack://vgapp/./app/modules/vgtoast/js/vgtoast.drag.js","webpack://vgapp/./app/modules/vgtoast/js/vgtoast.resize.js","webpack://vgapp/./app/modules/vgtoast/js/vgtoast.js","webpack://vgapp/./app/utils/js/components/ajax.js","webpack://vgapp/./app/utils/js/components/params.js","webpack://vgapp/./app/utils/js/components/sanitize.js","webpack://vgapp/./app/utils/js/components/templater.js","webpack://vgapp/./app/utils/js/dom/data.js","webpack://vgapp/./app/utils/js/dom/event.js","webpack://vgapp/./app/utils/js/dom/manipulator.js","webpack://vgapp/./app/utils/js/dom/selectors.js","webpack://vgapp/./app/utils/js/functions.js","webpack://vgapp/webpack/bootstrap","webpack://vgapp/webpack/runtime/define property getters","webpack://vgapp/webpack/runtime/hasOwnProperty shorthand","webpack://vgapp/webpack/runtime/make namespace object","webpack://vgapp/./app/utils/js/components/scrollbar.js","webpack://vgapp/./app/utils/js/components/backdrop.js","webpack://vgapp/./app/modules/vgmodal/js/vgmodal.drag.js","webpack://vgapp/./app/modules/vgmodal/js/vgmodal.resize.js","webpack://vgapp/./app/modules/vgmodal/js/vgmodal.js","webpack://vgapp/./app/modules/vgmodal/index.js","webpack://vgapp/./app/utils/js/components/lang.js","webpack://vgapp/./app/modules/vgalert/js/vgalert.js","webpack://vgapp/./app/modules/vgalert/index.js","webpack://vgapp/./app/modules/vgcollapse/js/vgcollapse.js","webpack://vgapp/./app/modules/vgcollapse/index.js","webpack://vgapp/./app/utils/js/components/placement.js","webpack://vgapp/./app/modules/vgdropdown/js/vgdropdown.js","webpack://vgapp/./app/modules/vgdropdown/index.js","webpack://vgapp/./app/modules/vgdynamictable/js/fixed.js","webpack://vgapp/./app/modules/vgdynamictable/js/viewport.js","webpack://vgapp/./app/modules/vgdynamictable/js/utils/common.js","webpack://vgapp/./app/modules/vgdynamictable/js/summary-footer.js","webpack://vgapp/./app/modules/vgdynamictable/js/skeleton.js","webpack://vgapp/./app/modules/vgdynamictable/js/table-remote.js","webpack://vgapp/./app/modules/vgdynamictable/js/table-url-state.js","webpack://vgapp/./app/modules/vgdynamictable/js/table-state.js","webpack://vgapp/./app/modules/vgdynamictable/js/options.js","webpack://vgapp/./app/modules/vgdynamictable/js/pagination.js","webpack://vgapp/./app/modules/vgdynamictable/js/sortable.js","webpack://vgapp/./app/modules/vgdynamictable/js/expandable.js","webpack://vgapp/./app/modules/vgdynamictable/js/search.js","webpack://vgapp/./app/modules/vgdynamictable/js/filters.js","webpack://vgapp/./app/modules/vgdynamictable/js/vgdynamictable.js","webpack://vgapp/./app/modules/vgdynamictable/js/editable.js","webpack://vgapp/./app/utils/js/components/file-preview.js","webpack://vgapp/./app/utils/js/components/audio-metadata.js","webpack://vgapp/./app/utils/js/components/video-metadata.js","webpack://vgapp/./app/modules/vgfilepreview/js/renderers/image-modal.js","webpack://vgapp/./app/modules/vgfilepreview/js/renderers/image.js","webpack://vgapp/./app/modules/vgfilepreview/js/renderers/office-modal.js","webpack://vgapp/./app/modules/vgfilepreview/js/renderers/office.js","webpack://vgapp/./app/modules/vgfilepreview/js/renderers/pdf-modal.js","webpack://vgapp/./app/modules/vgfilepreview/js/renderers/pdf.js","webpack://vgapp/./app/modules/vgfilepreview/js/renderers/text-modal.js","webpack://vgapp/./app/modules/vgfilepreview/js/renderers/text.js","webpack://vgapp/./app/modules/vgfilepreview/js/renderers/video-modal.js","webpack://vgapp/./app/modules/vgfilepreview/js/renderers/playlist.js","webpack://vgapp/./app/modules/vgfilepreview/js/renderers/video.js","webpack://vgapp/./app/modules/vgfilepreview/js/renderers/zip-modal.js","webpack://vgapp/./app/modules/vgfilepreview/js/renderers/zip.js","webpack://vgapp/./app/modules/vgfilepreview/js/i18n.js","webpack://vgapp/./app/modules/vgfilepreview/js/vgfilepreview.js","webpack://vgapp/./app/modules/vgfilepreview/js/renderers/index.js","webpack://vgapp/./app/modules/vgfilepreview/index.js","webpack://vgapp/./app/modules/vgfiles/js/base.js","webpack://vgapp/./app/modules/vgfiles/js/loader.js","webpack://vgapp/./app/modules/vgfiles/js/droppable.js","webpack://vgapp/./app/modules/vgfiles/js/render.js","webpack://vgapp/./app/modules/vgfiles/js/vgfiles.js","webpack://vgapp/./app/modules/vgfiles/index.js","webpack://vgapp/./app/modules/vgformsender/js/hideshowpass.js","webpack://vgapp/./app/modules/vgformsender/js/vgformsender.js","webpack://vgapp/./app/modules/vgformsender/index.js","webpack://vgapp/./app/utils/js/dom/cookie.js","webpack://vgapp/./app/modules/vglawcookie/js/vglawcookie.js","webpack://vgapp/./app/modules/vglawcookie/index.js","webpack://vgapp/./app/modules/vgloadmore/js/vgloadmore.js","webpack://vgapp/./app/modules/vgloadmore/index.js","webpack://vgapp/./app/modules/vgnav/js/vgnav.js","webpack://vgapp/./app/modules/vgnav/index.js","webpack://vgapp/./app/modules/vgnestable/js/vgnestable.js","webpack://vgapp/./app/modules/vgnestable/index.js","webpack://vgapp/./app/modules/vgrangeslider/js/skins.js","webpack://vgapp/./app/modules/vgrangeslider/js/vgrangeslider.js","webpack://vgapp/./app/modules/vgrangeslider/index.js","webpack://vgapp/./app/modules/vgrollup/js/vgrollup.js","webpack://vgapp/./app/modules/vgrollup/index.js","webpack://vgapp/./app/modules/vgselect/js/handlers.js","webpack://vgapp/./app/modules/vgselect/js/vgselect.js","webpack://vgapp/./app/modules/vgselect/index.js","webpack://vgapp/./app/modules/vgsidebar/js/vgsidebar.js","webpack://vgapp/./app/modules/vgsidebar/index.js","webpack://vgapp/./app/modules/vgspy/js/vgspy.js","webpack://vgapp/./app/modules/vgspy/index.js","webpack://vgapp/./app/modules/vgtabs/js/vgtabs.js","webpack://vgapp/./app/modules/vgtabs/index.js","webpack://vgapp/./app/modules/vgtooltip/js/vgtooltip.js","webpack://vgapp/./app/modules/vgtooltip/index.js","webpack://vgapp/./app/vgapp.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"vgapp\"] = factory();\n\telse\n\t\troot[\"vgapp\"] = factory();\n})(this, () => {\nreturn ","import { isElement, mergeDeepObject } from \"../functions\";\r\nimport EventHandler from \"../dom/event\";\r\n\r\n/**\r\n * Анимация на основе Animate.css\r\n * Поддерживает модули с событиях: show, shown, hide, hidden\r\n *\r\n * @see https://animate.style/\r\n */\r\nclass Animation {\r\n\tstatic get DEFAULTS() {\r\n\t\treturn {\r\n\t\t\tenable: false,\r\n\t\t\tin: 'animate__fadeIn', // Анимация при появлении\r\n\t\t\tout: 'animate__fadeOut', // Анимация при скрытии\r\n\t\t\tduration: 500, // Длительность анимации (мс)\r\n\t\t};\r\n\t}\r\n\r\n\tconstructor(element, key, userParams = {}) {\r\n\t\tthis._element = element;\r\n\t\tthis._nameKey = key;\r\n\r\n\t\t// Объединение параметров\r\n\t\tthis._params = mergeDeepObject(Animation.DEFAULTS, userParams);\r\n\r\n\t\t// Ранний выход, если анимация отключена или элемент не валиден\r\n\t\tif (!this._params.enable || !isElement(element)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._classes = {\r\n\t\t\tanimated: 'animate__animated',\r\n\t\t\tduration: 'animate__fast' // Используем классы animate.css\r\n\t\t};\r\n\r\n\t\tthis._init();\r\n\t}\r\n\r\n\t/**\r\n\t * Инициализация анимации\r\n\t * @private\r\n\t */\r\n\t_init() {\r\n\t\tconst { classList } = this._element;\r\n\r\n\t\t// Добавляем общие классы\r\n\t\tclassList.add(this._classes.animated, this._classes.duration);\r\n\r\n\t\t// Удаляем стандартный класс 'fade', если используется animate.css\r\n\t\tif (classList.contains('fade')) {\r\n\t\t\tclassList.remove('fade');\r\n\t\t}\r\n\r\n\t\t// Назначаем обработчики событий\r\n\t\tthis._setupEventListeners();\r\n\t}\r\n\r\n\t/**\r\n\t * Назначение обработчиков событий\r\n\t * @private\r\n\t */\r\n\t_setupEventListeners() {\r\n\t\tEventHandler.on(this._element, `${this._nameKey}.show`, this._handleShow.bind(this), null);\r\n\t\tEventHandler.on(this._element, `${this._nameKey}.shown`, this._handleShown.bind(this), null);\r\n\t\tEventHandler.on(this._element, `${this._nameKey}.hide`, this._handleHide.bind(this), null);\r\n\t\tEventHandler.on(this._element, `${this._nameKey}.hidden`, this._handleHidden.bind(this), null);\r\n\t}\r\n\r\n\t/**\r\n\t * Обработка события \"show\" — запуск анимации входа\r\n\t * @private\r\n\t */\r\n\t_handleShow() {\r\n\t\tconst { classList } = this._element;\r\n\t\tconst { in: inClass, out: outClass } = this._params;\r\n\r\n\t\t// Убираем выходную анимацию, если была\r\n\t\tif (classList.contains(outClass)) {\r\n\t\t\tclassList.remove(outClass);\r\n\t\t}\r\n\r\n\t\t// Добавляем входную анимацию\r\n\t\tclassList.add(inClass);\r\n\t}\r\n\r\n\t/**\r\n\t * Обработка события \"shown\" — завершение анимации входа\r\n\t * @private\r\n\t */\r\n\t_handleShown() {\r\n\t\tthis._element.classList.add(this._classes.animated);\r\n\t}\r\n\r\n\t/**\r\n\t * Обработка события \"hide\" — запуск анимации выхода\r\n\t * @private\r\n\t */\r\n\t_handleHide() {\r\n\t\tconst { classList } = this._element;\r\n\t\tconst { in: inClass, out: outClass } = this._params;\r\n\r\n\t\t// Убираем входную анимацию\r\n\t\tif (classList.contains(inClass)) {\r\n\t\t\tclassList.remove(inClass);\r\n\t\t}\r\n\r\n\t\t// Добавляем выходную анимацию\r\n\t\tclassList.add(outClass);\r\n\t}\r\n\r\n\t/**\r\n\t * Обработка события \"hidden\" — очистка анимационных классов\r\n\t * @private\r\n\t */\r\n\t_handleHidden() {\r\n\t\tconst { classList } = this._element;\r\n\t\tconst { in: inClass, out: outClass } = this._params;\r\n\r\n\t\t// Удаляем все анимационные классы animate.css\r\n\t\t[...classList]\r\n\t\t\t.filter(cls => cls.startsWith('animate__'))\r\n\t\t\t.forEach(cls => classList.remove(cls));\r\n\r\n\t\t// Восстанавливаем базовые классы для будущих анимаций\r\n\t\tclassList.add(this._classes.animated, this._classes.duration);\r\n\t}\r\n\r\n\t/**\r\n\t * Уничтожение экземпляра (очистка событий)\r\n\t */\r\n\tdispose() {\r\n\t\tEventHandler.off(this._element, `${this._nameKey}.show`, null, null);\r\n\t\tEventHandler.off(this._element, `${this._nameKey}.shown`, null, null);\r\n\t\tEventHandler.off(this._element, `${this._nameKey}.hide`, null, null);\r\n\t\tEventHandler.off(this._element, `${this._nameKey}.hidden`, null, null);\r\n\r\n\t\t// Очищаем анимационные классы\r\n\t\t[...this._element.classList]\r\n\t\t\t.filter(cls => cls.startsWith('animate__'))\r\n\t\t\t.forEach(cls => this._element.classList.remove(cls));\r\n\r\n\t\tthis._element = null;\r\n\t}\r\n}\r\n\r\nexport default Animation;","import {\r\n\texecute,\r\n\texecuteAfterTransition,\r\n\tisEmptyObj,\r\n\tisObject,\r\n\tmergeDeepObject,\r\n\tnormalizeData\r\n} from \"../utils/js/functions\";\r\nimport Selectors from \"../utils/js/dom/selectors\";\r\nimport Data from \"../utils/js/dom/data\";\r\nimport Params from \"../utils/js/components/params\";\r\nimport EventHandler from \"../utils/js/dom/event\";\r\nimport {getSVG} from \"./module-fn\";\r\nimport Animation from \"../utils/js/components/animation\";\r\nimport Ajax from \"../utils/js/components/ajax\";\r\nimport Html from \"../utils/js/components/templater\";\r\n\r\nclass BaseModule {\n\tconstructor(element) {\n\t\tif (!element) return\r\n\r\n\t\tthis._element = Selectors.find(element);\r\n\t\tif (!this._element){\r\n\t\t\tthrow new Error('Товарищ! Первый параметр не должен быть пустым!');\r\n\t\t}\r\n\r\n\t\tthis._params = {};\r\n\t\tthis._isLoaded = false;\r\n\t\tData.set(this._element, this.constructor.NAME_KEY, this);\r\n\t}\r\n\r\n\t_getParams(element, params) {\r\n\t\treturn new Params(params, element).get();\r\n\t}\r\n\r\n\tdispose() {\r\n\t\tData.remove(this._element, this.constructor.NAME_KEY);\r\n\t\tEventHandler.off(this._element, this.constructor.EVENT_KEY)\r\n\r\n\t\tfor (const propertyName of Object.getOwnPropertyNames(this)) {\r\n\t\t\tthis[propertyName] = null\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Метод для отправки данных на сервер\r\n\t * данные для работы должны быть в this._params.ajax\r\n\t * - route = ссылка для отправки данных, обязательное поле\r\n\t * - method = по умолчанию get\r\n\t * - target = элемент (#container-request), куда будут выгружен ответ сервер, тип строка\r\n\t * - loader = спиннер загрузки использует класс vg-loader (в дефолтных стилях), по умолчанию false\r\n\t * - once = сделает всего один запрос (например: при открытии модалки несколько раз), по умолчанию false\r\n\t * - output = Разрешает или запрещает добавление контента с сервера в целевой блок, по умолчанию false\r\n\t * - timeout = задержка перед отправкой, по умолчанию 0\r\n\t * @param callback\r\n\t */\r\n\t_route(callback) {\n\t\tif (typeof callback !== 'function') {\n\t\t\treturn this._requestRoute(callback);\n\t\t}\n\n\t\tlet $content = null,\n\t\t\ttimeout = this._params.ajax.timeout || 0;\n\r\n\t\tif (this._isLoaded) return;\r\n\r\n\t\tconst setData = (response) => {\r\n\t\t\tif (typeof response === \"string\") {\r\n\t\t\t\tif ($content) $content.innerHTML = response;\r\n\t\t\t} else if (isObject(response) && !isEmptyObj(response)) {\r\n\t\t\t\tObject.values(response).forEach(value => {\r\n\t\t\t\t\tif (typeof value === \"string\") {\r\n\t\t\t\t\t\tif ($content) $content.innerHTML = value;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tif (!this._params.hasOwnProperty('ajax')) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!this._params.ajax.route) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!'method' in this._params.ajax) {\r\n\t\t\tthis._params.ajax.method = 'get';\r\n\t\t}\r\n\r\n\t\tif ('target' in this._params.ajax && this._params.ajax.target) {\r\n\t\t\t$content = Selectors.find(this._params.ajax.target);\r\n\t\t}\r\n\r\n\t\tif (('loader' in this._params.ajax && this._params.ajax.loader) && ('output' in this._params.ajax && this._params.ajax.output)) {\r\n\t\t\tsetData(Html('string').div({class: 'vg-loader'}));\r\n\t\t}\r\n\r\n\t\tlet completeAjaxRequest = (data, status) => {\r\n\t\t\tif ('loader' in this._params.ajax && this._params.ajax.loader) setData('');\r\n\r\n\t\t\tif ('once' in this._params.ajax && this._params.ajax.once) {\r\n\t\t\t\tthis._isLoaded = true;\r\n\t\t\t}\r\n\r\n\t\t\tif ('output' in this._params.ajax && this._params.ajax.output) {\r\n\t\t\t\tif ('response' in data) {\r\n\t\t\t\t\tsetData(normalizeData(data.response))\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsetData(data);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\texecute(callback, [status, data, $content]);\r\n\t\t}\r\n\r\n\t\tconst ajax = new Ajax();\r\n\r\n\t\tlet ajaxData = {\r\n\t\t\tonSuccess: (data) => {\r\n\t\t\t\tcompleteAjaxRequest(data, 'success')\r\n\t\t\t},\r\n\t\t\tonError: (err) => {\r\n\t\t\t\tcompleteAjaxRequest(err, 'error')\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsetTimeout(() => {\r\n\t\t\tif (this._params.ajax.method.toLowerCase() === 'get') {\r\n\t\t\t\tajax.get(this._params.ajax.route, ajaxData);\r\n\t\t\t}\r\n\r\n\t\t\tif (this._params.ajax.method.toLowerCase() === 'post') {\r\n\t\t\t\tajax.post(this._params.ajax.route, this._params.ajax.data, ajaxData);\r\n\t\t\t}\r\n\r\n\t\t\tif (this._params.ajax.method.toLowerCase() === 'delete') {\r\n\t\t\t\tajax.delete(this._params.ajax.route, ajaxData);\r\n\t\t\t}\r\n\t\t}, timeout);\n\t}\n\n\t_requestRoute(options = {}) {\n\t\tconst config = this._normalizeRouteRequestOptions(options);\n\t\treturn Ajax.requestRoute(config);\n\t}\n\n\t_buildRouteUrl(params = {}, endpoint = '', options = {}) {\n\t\tconst config = this._normalizeRouteRequestOptions(Object.assign({}, options, {\n\t\t\tparams,\n\t\t\troute: endpoint || options.route || '',\n\t\t}));\n\t\treturn Ajax.buildRouteUrl(config.route, {\n\t\t\tparams: config.params,\n\t\t\tbaseParams: config.baseParams,\n\t\t});\n\t}\n\n\t_normalizeRouteRequestOptions(options = {}) {\n\t\tconst requestOptions = this._params && isObject(this._params.request)\n\t\t\t? this._params.request\n\t\t\t: {};\n\t\tconst ajaxOptions = this._params && isObject(this._params.ajax)\n\t\t\t? this._params.ajax\n\t\t\t: {};\n\t\tconst source = isObject(options) ? options : {};\n\t\tconst route = String(\n\t\t\tsource.route\n\t\t\t|| source.endpoint\n\t\t\t|| requestOptions.route\n\t\t\t|| ajaxOptions.route\n\t\t\t|| ''\n\t\t).trim();\n\t\tconst method = String(\n\t\t\tsource.method\n\t\t\t|| requestOptions.method\n\t\t\t|| ajaxOptions.method\n\t\t\t|| 'GET'\n\t\t).toUpperCase().trim() || 'GET';\n\t\tconst credentials = String(\n\t\t\tsource.credentials\n\t\t\t|| requestOptions.credentials\n\t\t\t|| 'same-origin'\n\t\t).trim() || 'same-origin';\n\t\tconst headers = mergeDeepObject(\n\t\t\t{\n\t\t\t\t'Accept': 'application/json',\n\t\t\t\t'X-Requested-With': 'XMLHttpRequest',\n\t\t\t},\n\t\t\tisObject(requestOptions.headers) ? requestOptions.headers : {},\n\t\t\tisObject(source.headers) ? source.headers : {}\n\t\t);\n\t\tconst baseParams = mergeDeepObject(\n\t\t\t{},\n\t\t\tisObject(requestOptions.params) ? requestOptions.params : {},\n\t\t\tisObject(source.baseParams) ? source.baseParams : {},\n\t\t\tisObject(source.paramsBase) ? source.paramsBase : {}\n\t\t);\n\t\tconst params = isObject(source.params) ? source.params : {};\n\t\tconst body = source.body !== undefined\n\t\t\t? source.body\n\t\t\t: (source.data !== undefined ? source.data : null);\n\t\treturn {\n\t\t\troute,\n\t\t\tmethod,\n\t\t\tcredentials,\n\t\t\theaders,\n\t\t\tbaseParams,\n\t\t\tparams,\n\t\t\tbody,\n\t\t\tsignal: source.signal || null,\n\t\t\tresponseType: String(source.responseType || source.parse || 'auto').toLowerCase().trim() || 'auto',\n\t\t};\n\t}\n\n\t_dismissElement() {\n\t\tlet cross = getSVG('cross'),\r\n\t\t\tbutton = this._element.querySelector('.vg-btn-close');\r\n\r\n\t\tif (button) {\r\n\t\t\tlet svg = button.querySelector('svg');\r\n\t\t\tif (!svg) button.insertAdjacentHTML('beforeend', cross);\r\n\t\t}\r\n\t}\r\n\r\n\t_queueCallback(callback, element, isAnimated = true, timeOutMs) {\r\n\t\texecuteAfterTransition(callback, element, isAnimated, timeOutMs);\r\n\t}\r\n\r\n\t_animation(element, key, params = {}) {\r\n\t\tnew Animation(element, key, params);\r\n\t}\r\n\r\n\tstatic getInstance(element) {\r\n\t\treturn Data.get(Selectors.find(element), this.NAME_KEY)\r\n\t}\r\n\r\n\tstatic getOrCreateInstance(element, params = {}) {\n\t\treturn this.getInstance(element) || new this(element, !isEmptyObj(params) ? params : {})\n\t}\n\n\tstatic boot(params = {}) {\n\t\tif (typeof this.initAll === 'function') {\n\t\t\treturn this.initAll(params);\n\t\t}\n\n\t\tif (typeof this.init !== 'function') {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (params && Object.prototype.hasOwnProperty.call(params, 'element')) {\n\t\t\tconst { element, ...options } = params;\n\t\t\treturn this.init(element, options);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tstatic get DATA_KEY() {\n\t\treturn `vg.${this.NAME}`\n\t}\n\r\n\tstatic get EVENT_KEY() {\r\n\t\treturn `.${this.DATA_KEY}`\r\n\t}\r\n}\r\n\r\nexport default BaseModule;\n","const FILE_ICON_BY_EXT = {\r\n\tpdf: 'file-pdf',\r\n\tdoc: 'file-word',\r\n\tdocx: 'file-word',\r\n\todt: 'file-word',\r\n\trtf: 'file-word',\r\n\txls: 'file-exel',\r\n\txlsx: 'file-exel',\r\n\txlsm: 'file-exel',\r\n\tods: 'file-exel',\r\n\tcsv: 'file-exel',\r\n\tzip: 'file-zip',\r\n\trar: 'file-zip',\r\n\t'7z': 'file-zip',\r\n\ttar: 'file-zip',\r\n\tgz: 'file-zip',\r\n\ttgz: 'file-zip',\r\n\ttxt: 'file-text',\r\n\tmd: 'file-text',\r\n\tlog: 'file-text',\r\n\tjson: 'file-text',\r\n\txml: 'file-text',\r\n\tyml: 'file-text',\r\n\tyaml: 'file-text',\r\n\tphp: 'file-php',\r\n\tpng: 'file-image',\r\n\tjpg: 'file-image',\r\n\tjpeg: 'file-image',\r\n\tgif: 'file-image',\r\n\twebp: 'file-image',\r\n\tsvg: 'file-image',\r\n\tbmp: 'file-image',\r\n\ttif: 'file-image',\r\n\ttiff: 'file-image',\r\n\theic: 'file-image',\r\n\theif: 'file-image',\r\n\tavif: 'file-image',\r\n\tmp3: 'file-audio',\r\n\twav: 'file-audio',\r\n\togg: 'file-audio',\r\n\tflac: 'file-audio',\r\n\taac: 'file-audio',\r\n\tm4a: 'file-audio',\r\n\tmp4: 'file-video',\r\n\twebm: 'file-video',\r\n\tmov: 'file-video',\r\n\tmkv: 'file-video',\r\n\tavi: 'file-video'\r\n};\r\n\r\nconst extractExtension = (value) => {\r\n\tif (!value) return '';\r\n\r\n\tconst cleanValue = String(value).toLowerCase().split('#')[0].split('?')[0];\r\n\tconst lastSegment = cleanValue.split('/').pop() || '';\r\n\tif (!lastSegment.includes('.')) return '';\r\n\r\n\treturn lastSegment.split('.').pop() || '';\r\n};\r\n\r\nconst parseFileDescriptor = (value) => {\r\n\tif (!value) return {type: '', ext: ''};\r\n\r\n\tif (typeof value === 'object') {\r\n\t\tconst type = String(value.type || '').toLowerCase();\r\n\t\tconst name = String(value.name || value.path || value.url || '').toLowerCase();\r\n\t\treturn {type, ext: extractExtension(name)};\r\n\t}\r\n\r\n\treturn {type: '', ext: extractExtension(value)};\r\n};\r\n\r\nconst resolveFileIconName = (descriptor) => {\r\n\tconst {type, ext} = parseFileDescriptor(descriptor);\r\n\r\n\tif (type === 'application/pdf') return 'file-pdf';\r\n\tif (type.includes('word')) return 'file-word';\r\n\tif (type.includes('excel') || type.includes('spreadsheet')) return 'file-exel';\r\n\tif (type.includes('zip') || type.includes('compressed')) return 'file-zip';\r\n\tif (type.startsWith('text/')) return 'file-text';\r\n\tif (type.startsWith('image/')) return 'file-image';\r\n\tif (type.startsWith('audio/')) return 'file-audio';\r\n\tif (type.startsWith('video/')) return 'file-video';\r\n\r\n\treturn FILE_ICON_BY_EXT[ext] || 'file-generic';\r\n};\r\n\r\nconst getSVG = (name, icons = {}) => {\r\n\tconst explicitIcon = icons[name];\r\n\tif (explicitIcon) {\r\n\t\treturn explicitIcon;\r\n\t}\r\n\r\n\tconst autoIconName = resolveFileIconName(name);\r\n\tconst autoIcon = icons[autoIconName];\r\n\tif (autoIcon) {\r\n\t\treturn autoIcon;\r\n\t}\r\n\r\n\treturn icons['file-generic'] || '';\r\n};\r\n\r\nexport {\r\n\tFILE_ICON_BY_EXT,\r\n\textractExtension,\r\n\tparseFileDescriptor,\r\n\tresolveFileIconName,\r\n\tgetSVG\r\n};\r\n","import EventHandler from \"../utils/js/dom/event\";\r\nimport {isDisabled, isEmptyObj} from \"../utils/js/functions\";\r\nimport Selectors from \"../utils/js/dom/selectors\";\r\nimport {getSVG as resolveSVGByFile} from \"../utils/js/components/file-icon\";\r\n\r\n/**\r\n * Тут собраны вспомогательные скрипты для работы модулей\r\n */\r\n\r\n/**\r\n * Набор svg элементов\r\n * @param name\r\n * @returns {*|{}}\r\n */\r\nconst getSVG = (name) => {\r\n\tconst svg = {\r\n\t\tminus: '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-dash\" viewBox=\"0 0 16 16\"><path d=\"M4 8a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7A.5.5 0 0 1 4 8\"/></svg>',\r\n\t\tplus: '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" class=\"bi bi-plus\" viewBox=\"0 0 16 16\"><path d=\"M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4\"/></svg>',\r\n\t\t'dots-six-vertical': '<svg viewBox=\"64 64 896 896\" focusable=\"false\" data-icon=\"holder\" width=\"1em\" height=\"1em\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M300 276.5a56 56 0 1056-97 56 56 0 00-56 97zm0 284a56 56 0 1056-97 56 56 0 00-56 97zM640 228a56 56 0 10112 0 56 56 0 00-112 0zm0 284a56 56 0 10112 0 56 56 0 00-112 0zM300 844.5a56 56 0 1056-97 56 56 0 00-56 97zM640 796a56 56 0 10112 0 56 56 0 00-112 0z\"></path></svg>',\r\n\t\tchevron: '<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M12 12.392L8.74146 9.13354L7.0918 10.7832L11.1751 14.8665C11.3939 15.0853 11.6906 15.2081 12 15.2081C12.3093 15.2081 12.606 15.0853 12.8248 14.8665L16.9081 10.7832L15.2585 9.13354L12 12.392Z\" fill=\"black\"/></svg>',\r\n\t\tdanger: '<svg width=\"72\" height=\"72\" viewBox=\"0 0 72 72\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M36 4.5C53.3953 4.5 67.5 18.6047 67.5 36C67.5 53.3953 53.3953 67.5 36 67.5C18.6047 67.5 4.5 53.3953 4.5 36C4.5 18.6047 18.6047 4.5 36 4.5ZM44.9961 23.8237C44.9944 23.8242 44.9931 23.825 44.9902 23.8279L36 32.818L27.0098 23.8279C27.0069 23.825 27.0056 23.8242 27.0039 23.8237C27.0023 23.8232 27.0006 23.8232 26.999 23.8237C26.9975 23.8242 26.9961 23.825 26.9932 23.8279L23.8278 26.9932C23.825 26.9961 23.8243 26.9975 23.8237 26.9991C23.8232 27.0007 23.8232 27.0024 23.8237 27.004L23.8244 27.0056C23.8253 27.0071 23.8265 27.0085 23.8279 27.0098L32.818 36L23.8279 44.9903C23.825 44.9931 23.8242 44.9945 23.8237 44.9961C23.8232 44.9977 23.8232 44.9995 23.8237 45.0011C23.8242 45.0026 23.825 45.0039 23.8279 45.0068L26.9932 48.1723C26.9961 48.1751 26.9975 48.1758 26.9991 48.1764C27.0007 48.1769 27.0024 48.1769 27.004 48.1764C27.0056 48.1759 27.0069 48.1751 27.0098 48.1722L36 39.1819L44.9903 48.1721C44.9931 48.175 44.9945 48.1758 44.9961 48.1763C44.9977 48.1768 44.9995 48.1768 45.0011 48.1763C45.0026 48.1758 45.0039 48.175 45.0068 48.1721L48.1723 45.0068C48.1751 45.0039 48.1758 45.0025 48.1764 45.0009C48.1769 44.9993 48.1769 44.9976 48.1764 44.996L48.1757 44.9944C48.1747 44.9929 48.1736 44.9915 48.1722 44.9902L39.1819 36L48.1721 27.0098C48.175 27.0069 48.1758 27.0056 48.1763 27.0039C48.1768 27.0023 48.1768 27.0006 48.1763 26.999C48.1758 26.9975 48.175 26.9961 48.1721 26.9932L45.0068 23.8278C45.0039 23.825 45.0025 23.8243 45.0009 23.8237C44.9993 23.8232 44.9977 23.8232 44.9961 23.8237Z\" fill=\"#000000\"/></svg>',\r\n\t\tsuccess: '<svg width=\"72\" height=\"72\" viewBox=\"0 0 72 72\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M36 4.5C18.6047 4.5 4.5 18.6047 4.5 36C4.5 53.3953 18.6047 67.5 36 67.5C53.3953 67.5 67.5 53.3953 67.5 36C67.5 18.6047 53.3953 4.5 36 4.5ZM49.6055 25.7133L34.7977 46.2445C34.5907 46.5334 34.3179 46.7688 34.0018 46.9312C33.6857 47.0935 33.3354 47.1782 32.9801 47.1782C32.6247 47.1782 32.2745 47.0935 31.9584 46.9312C31.6423 46.7688 31.3695 46.5334 31.1625 46.2445L22.3945 34.0945C22.1273 33.7219 22.3945 33.2016 22.8516 33.2016H26.1492C26.8664 33.2016 27.5484 33.5461 27.9703 34.1367L32.9766 41.0836L44.0297 25.7555C44.4516 25.1719 45.1266 24.8203 45.8508 24.8203H49.1484C49.6055 24.8203 49.8727 25.3406 49.6055 25.7133Z\" fill=\"#000000\"/></svg>',\r\n\t\twaiting: '<svg width=\"72\" height=\"72\" viewBox=\"0 0 72 72\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M51 10.02C55.5248 12.6326 59.2888 16.3816 61.9194 20.8959C64.5501 25.4103 65.9561 30.5334 65.9983 35.7581C66.0405 40.9828 64.7174 46.1279 62.1601 50.6841C59.6027 55.2404 55.8997 59.0497 51.4177 61.735C46.9357 64.4203 41.8301 65.8885 36.6063 65.9942C31.3825 66.1 26.2216 64.8395 21.6347 62.3378C17.0477 59.836 13.1936 56.1796 10.454 51.7306C7.71439 47.2816 6.18423 42.1942 6.015 36.972L6 36L6.015 35.028C6.18301 29.847 7.69064 24.7979 10.3909 20.373C13.0912 15.9481 16.892 12.2984 21.4227 9.77969C25.9534 7.26098 31.0594 5.95923 36.243 6.00136C41.4266 6.04348 46.5108 7.42804 51 10.02ZM36 18C35.2652 18.0001 34.556 18.2699 34.0069 18.7582C33.4578 19.2465 33.107 19.9193 33.021 20.649L33 21V36L33.027 36.393C33.0954 36.9135 33.2992 37.407 33.618 37.824L33.879 38.124L42.879 47.124L43.161 47.37C43.6871 47.7782 44.3341 47.9998 45 47.9998C45.6659 47.9998 46.3129 47.7782 46.839 47.37L47.121 47.121L47.37 46.839C47.7782 46.3129 47.9998 45.6659 47.9998 45C47.9998 44.3341 47.7782 43.6872 47.37 43.161L47.121 42.879L39 34.755V21L38.979 20.649C38.893 19.9193 38.5422 19.2465 37.9931 18.7582C37.444 18.2699 36.7348 18.0001 36 18Z\" fill=\"black\"/></svg>',\r\n\t\twarning: '<svg width=\"72\" height=\"72\" viewBox=\"0 0 72 72\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M36.5 5C44.8543 5 52.8665 8.31874 58.7739 14.2261C64.6813 20.1335 68 28.1457 68 36.5C68 44.8543 64.6813 52.8665 58.7739 58.7739C52.8665 64.6813 44.8543 68 36.5 68C28.1457 68 20.1335 64.6813 14.2261 58.7739C8.31874 52.8665 5 44.8543 5 36.5C5 28.1457 8.31874 20.1335 14.2261 14.2261C20.1335 8.31874 28.1457 5 36.5 5ZM36.5 18.5C35.9287 18.4995 35.3635 18.6181 34.8406 18.8484C34.3178 19.0786 33.8487 19.4154 33.4633 19.8372C33.0779 20.259 32.7848 20.7565 32.6025 21.298C32.4203 21.8395 32.353 22.413 32.405 22.982L34.0475 41.009C34.1112 41.6151 34.397 42.1761 34.8499 42.5839C35.3028 42.9917 35.8906 43.2173 36.5 43.2173C37.1094 43.2173 37.6972 42.9917 38.1501 42.5839C38.603 42.1761 38.8888 41.6151 38.9525 41.009L40.5905 22.982C40.6424 22.4134 40.5753 21.8403 40.3933 21.2991C40.2114 20.7579 39.9186 20.2606 39.5337 19.8389C39.1488 19.4171 38.6803 19.0803 38.1579 18.8498C37.6356 18.6192 37.0709 18.5001 36.5 18.5ZM36.5 54.5C37.4548 54.5 38.3705 54.1207 39.0456 53.4456C39.7207 52.7705 40.1 51.8548 40.1 50.9C40.1 49.9452 39.7207 49.0295 39.0456 48.3544C38.3705 47.6793 37.4548 47.3 36.5 47.3C35.5452 47.3 34.6295 47.6793 33.9544 48.3544C33.2793 49.0295 32.9 49.9452 32.9 50.9C32.9 51.8548 33.2793 52.7705 33.9544 53.4456C34.6295 54.1207 35.5452 54.5 36.5 54.5Z\" fill=\"#000000\"/></svg>',\r\n\t\tinfo: '<svg width=\"72\" height=\"72\" viewBox=\"0 0 72 72\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M36 4.5C18.6047 4.5 4.5 18.6047 4.5 36C4.5 53.3953 18.6047 67.5 36 67.5C53.3953 67.5 67.5 53.3953 67.5 36C67.5 18.6047 53.3953 4.5 36 4.5ZM33.75 20.8125C33.75 20.5031 34.0031 20.25 34.3125 20.25H37.6875C37.9969 20.25 38.25 20.5031 38.25 20.8125V39.9375C38.25 40.2469 37.9969 40.5 37.6875 40.5H34.3125C34.0031 40.5 33.75 40.2469 33.75 39.9375V20.8125ZM36 51.75C35.1168 51.732 34.2759 51.3685 33.6577 50.7375C33.0395 50.1065 32.6932 49.2584 32.6932 48.375C32.6932 47.4916 33.0395 46.6435 33.6577 46.0125C34.2759 45.3815 35.1168 45.018 36 45C36.8832 45.018 37.7241 45.3815 38.3423 46.0125C38.9605 46.6435 39.3068 47.4916 39.3068 48.375C39.3068 49.2584 38.9605 50.1065 38.3423 50.7375C37.7241 51.3685 36.8832 51.732 36 51.75Z\" fill=\"#000000\"/></svg>',\r\n\t\tdots: '<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M10 17C11.1046 17 12 16.1046 12 15C12 13.8954 11.1046 13 10 13C8.89543 13 8 13.8954 8 15C8 16.1046 8.89543 17 10 17Z\" fill=\"black\"/><path d=\"M10 12C11.1046 12 12 11.1046 12 10C12 8.89543 11.1046 8 10 8C8.89543 8 8 8.89543 8 10C8 11.1046 8.89543 12 10 12Z\" fill=\"black\"/><path d=\"M10 7C11.1046 7 12 6.10457 12 5C12 3.89543 11.1046 3 10 3C8.89543 3 8 3.89543 8 5C8 6.10457 8.89543 7 10 7Z\" fill=\"black\"/></svg>',\r\n\t\tcross: '<svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M15.3149 0.340332C15.4478 0.20752 15.6027 0.118978 15.7798 0.074707C15.9569 0.0249023 16.134 0.0249023 16.311 0.074707C16.4881 0.118978 16.6431 0.20752 16.7759 0.340332C16.9142 0.473145 17.0055 0.630859 17.0498 0.813477C17.0941 0.99056 17.0941 1.16764 17.0498 1.34473C17.0055 1.52181 16.917 1.67676 16.7842 1.80957L1.80127 16.8008C1.67399 16.9281 1.52181 17.0111 1.34473 17.0498C1.16764 17.0941 0.987793 17.0941 0.805176 17.0498C0.628092 17.0111 0.470378 16.9253 0.332031 16.7925C0.199219 16.6597 0.110677 16.502 0.0664062 16.3193C0.0221354 16.1423 0.0221354 15.9652 0.0664062 15.7881C0.110677 15.611 0.196452 15.4588 0.32373 15.3315L15.3149 0.340332ZM16.7842 15.3232C16.917 15.4561 17.0028 15.6082 17.0415 15.7798C17.0858 15.9569 17.0858 16.134 17.0415 16.311C17.0028 16.4937 16.9142 16.6541 16.7759 16.7925C16.6431 16.9253 16.4881 17.0138 16.311 17.0581C16.134 17.1024 15.9569 17.1024 15.7798 17.0581C15.6027 17.0138 15.4478 16.9253 15.3149 16.7925L0.32373 1.80127C0.201986 1.67952 0.116211 1.53011 0.0664062 1.35303C0.0221354 1.17594 0.0221354 0.996094 0.0664062 0.813477C0.116211 0.630859 0.204753 0.473145 0.332031 0.340332C0.464844 0.20752 0.622559 0.118978 0.805176 0.074707C0.987793 0.0304362 1.16488 0.0304362 1.33643 0.074707C1.51351 0.118978 1.66846 0.204753 1.80127 0.332031L16.7842 15.3232Z\" fill=\"#000\"/></svg>',\r\n\t\t'eye-open': '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 576 512\"><path d=\"M288 80c-65.2 0-118.8 29.6-159.9 67.7C89.6 183.5 63 226 49.4 256c13.6 30 40.2 72.5 78.6 108.3C169.2 402.4 222.8 432 288 432s118.8-29.6 159.9-67.7C486.4 328.5 513 286 526.6 256c-13.6-30-40.2-72.5-78.6-108.3C406.8 109.6 353.2 80 288 80zM95.4 112.6C142.5 68.8 207.2 32 288 32s145.5 36.8 192.6 80.6c46.8 43.5 78.1 95.4 93 131.1c3.3 7.9 3.3 16.7 0 24.6c-14.9 35.7-46.2 87.7-93 131.1C433.5 443.2 368.8 480 288 480s-145.5-36.8-192.6-80.6C48.6 356 17.3 304 2.5 268.3c-3.3-7.9-3.3-16.7 0-24.6C17.3 208 48.6 156 95.4 112.6zM288 336c44.2 0 80-35.8 80-80s-35.8-80-80-80c-.7 0-1.3 0-2 0c1.3 5.1 2 10.5 2 16c0 35.3-28.7 64-64 64c-5.5 0-10.9-.7-16-2c0 .7 0 1.3 0 2c0 44.2 35.8 80 80 80zm0-208a128 128 0 1 1 0 256 128 128 0 1 1 0-256z\"/></svg>',\r\n\t\t'eye-hide': '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 640 512\"><path d=\"M38.8 5.1C28.4-3.1 13.3-1.2 5.1 9.2S-1.2 34.7 9.2 42.9l592 464c10.4 8.2 25.5 6.3 33.7-4.1s6.3-25.5-4.1-33.7L525.6 386.7c39.6-40.6 66.4-86.1 79.9-118.4c3.3-7.9 3.3-16.7 0-24.6c-14.9-35.7-46.2-87.7-93-131.1C465.5 68.8 400.8 32 320 32c-68.2 0-125 26.3-169.3 60.8L38.8 5.1zm151 118.3C226 97.7 269.5 80 320 80c65.2 0 118.8 29.6 159.9 67.7C518.4 183.5 545 226 558.6 256c-12.6 28-36.6 66.8-70.9 100.9l-53.8-42.2c9.1-17.6 14.2-37.5 14.2-58.7c0-70.7-57.3-128-128-128c-32.2 0-61.7 11.9-84.2 31.5l-46.1-36.1zM394.9 284.2l-81.5-63.9c4.2-8.5 6.6-18.2 6.6-28.3c0-5.5-.7-10.9-2-16c.7 0 1.3 0 2 0c44.2 0 80 35.8 80 80c0 9.9-1.8 19.4-5.1 28.2zm9.4 130.3C378.8 425.4 350.7 432 320 432c-65.2 0-118.8-29.6-159.9-67.7C121.6 328.5 95 286 81.4 256c8.3-18.4 21.5-41.5 39.4-64.8L83.1 161.5C60.3 191.2 44 220.8 34.5 243.7c-3.3 7.9-3.3 16.7 0 24.6c14.9 35.7 46.2 87.7 93 131.1C174.5 443.2 239.2 480 320 480c47.8 0 89.9-12.9 126.2-32.5l-41.9-33zM192 256c0 70.7 57.3 128 128 128c13.3 0 26.1-2 38.2-5.8L302 334c-23.5-5.4-43.1-21.2-53.7-42.3l-56.1-44.2c-.2 2.8-.3 5.6-.3 8.5z\"/></svg>',\r\n\t\ttrash: '<svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M17.5013 3.33332H14.918C14.5193 1.39465 12.8139 0.0025 10.8346 0H9.16793C7.18867 0.0025 5.48328 1.39465 5.08461 3.33332H2.50129C2.04105 3.33332 1.66797 3.70641 1.66797 4.16664C1.66797 4.62687 2.04105 5 2.50129 5H3.33461V15.8333C3.33738 18.1334 5.20125 19.9973 7.50129 20H12.5013C14.8013 19.9973 16.6652 18.1334 16.668 15.8333V5H17.5013C17.9615 5 18.3346 4.62691 18.3346 4.16668C18.3346 3.70645 17.9615 3.33332 17.5013 3.33332ZM9.16797 14.1667C9.16797 14.6269 8.79488 15 8.33465 15C7.87437 15 7.50129 14.6269 7.50129 14.1667V9.16668C7.50129 8.70645 7.87437 8.33336 8.33461 8.33336C8.79484 8.33336 9.16793 8.70645 9.16793 9.16668V14.1667H9.16797ZM12.5013 14.1667C12.5013 14.6269 12.1282 15 11.668 15C11.2077 15 10.8346 14.6269 10.8346 14.1667V9.16668C10.8346 8.70645 11.2077 8.33336 11.668 8.33336C12.1282 8.33336 12.5013 8.70645 12.5013 9.16668V14.1667ZM6.81047 3.33332C7.16492 2.33523 8.10883 1.66793 9.16797 1.66664H10.8346C11.8938 1.66793 12.8377 2.33523 13.1921 3.33332H6.81047Z\" fill=\"black\" fill-opacity=\"0.5\"/></svg>',\r\n\t\tspinner: '<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><g clip-path=\"url(#clip0_290_5000)\"><path d=\"M14.6414 8.58333C14.5128 10.1032 13.8685 11.5335 12.8153 12.6368C11.7621 13.7401 10.3634 14.4502 8.85109 14.6493C7.33883 14.8483 5.80396 14.5244 4.50113 13.7311C3.19831 12.9379 2.20584 11.7231 1.68838 10.2882C1.17092 8.85338 1.15958 7.28474 1.65623 5.84255C2.15289 4.40037 3.12769 3.17133 4.41891 2.35934C5.71013 1.54735 7.24015 1.20123 8.75514 1.37839C10.2701 1.55555 11.679 2.24534 12.748 3.33333H10.6667C10.4899 3.33333 10.3203 3.40357 10.1953 3.5286C10.0703 3.65362 10 3.82319 10 4C10 4.17681 10.0703 4.34638 10.1953 4.47141C10.3203 4.59643 10.4899 4.66667 10.6667 4.66667H13.4287C13.757 4.66649 14.0718 4.536 14.3039 4.30387C14.5361 4.07174 14.6665 3.75695 14.6667 3.42867V0.666667C14.6667 0.489856 14.5965 0.320286 14.4715 0.195262C14.3464 0.0702379 14.1769 0 14 0C13.8232 0 13.6537 0.0702379 13.5286 0.195262C13.4036 0.320286 13.3334 0.489856 13.3334 0.666667V2.052C11.9925 0.853819 10.2866 0.142989 8.4917 0.0344742C6.69675 -0.0740408 4.91768 0.426105 3.44222 1.45402C1.96675 2.48194 0.881175 3.97752 0.361055 5.69888C-0.159065 7.42024 -0.0833125 9.26672 0.57606 10.9397C1.23543 12.6127 2.43987 14.0143 3.99457 14.9179C5.54928 15.8215 7.36334 16.1742 9.14336 15.9191C10.9234 15.6639 12.5653 14.8157 13.8035 13.5117C15.0417 12.2077 15.8039 10.5242 15.9667 8.73333C15.9753 8.6405 15.9645 8.54688 15.9349 8.45846C15.9054 8.37003 15.8577 8.28873 15.795 8.21974C15.7323 8.15075 15.6559 8.09559 15.5707 8.05775C15.4854 8.01992 15.3933 8.00025 15.3 8C15.1374 7.99804 14.9799 8.05669 14.8581 8.16452C14.7364 8.27236 14.6591 8.42165 14.6414 8.58333Z\" fill=\"black\" fill-opacity=\"0.35\"/></g><defs><clipPath id=\"clip0_290_5000\"><rect width=\"16\" height=\"16\" fill=\"white\"/></clipPath></defs></svg>',\r\n\t\tcheck: '<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M9.29448 19L3 12.8378L4.57362 11.2973L9.29448 15.9189L19.4264 6L21 7.54054L9.29448 19Z\" fill=\"black\"/></svg>',\r\n\t\t'cloud-dot': '<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M14.1401 13.925C14.2399 13.9266 14.3378 13.8983 14.4213 13.8438C14.5049 13.7893 14.5702 13.711 14.6089 13.6191C14.6476 13.5272 14.6579 13.4258 14.6385 13.3279C14.6192 13.2301 14.5709 13.1402 14.5001 13.07L12.0001 10.57L9.50011 13.07C9.4182 13.1657 9.3754 13.2887 9.38026 13.4145C9.38512 13.5404 9.43728 13.6597 9.52633 13.7488C9.61538 13.8378 9.73475 13.89 9.86058 13.8949C9.98642 13.8997 10.1095 13.8569 10.2051 13.775L11.5001 12.5V18.625C11.5001 18.7576 11.5528 18.8848 11.6466 18.9786C11.7403 19.0723 11.8675 19.125 12.0001 19.125C12.1327 19.125 12.2599 19.0723 12.3537 18.9786C12.4474 18.8848 12.5001 18.7576 12.5001 18.625V12.5L13.7851 13.785C13.8803 13.8768 14.0079 13.9271 14.1401 13.925Z\" fill=\"black\"/><path d=\"M18.46 9.71996C18.0211 9.77884 17.5751 9.7551 17.145 9.64996V9.76496L17.105 10.125L17.43 10.275C18.0502 10.5605 18.5545 11.0491 18.8595 11.6601C19.1645 12.271 19.2519 12.9677 19.1074 13.6351C18.9628 14.3024 18.5949 14.9005 18.0645 15.3305C17.5341 15.7605 16.8728 15.9966 16.19 16H13.5V17H16.19C17.0395 16.9958 17.8657 16.7214 18.5488 16.2163C19.2319 15.7112 19.7364 15.0017 19.9893 14.1907C20.2422 13.3797 20.2303 12.5092 19.9553 11.7054C19.6804 10.9016 19.1566 10.2062 18.46 9.71996Z\" fill=\"black\"/><path d=\"M4.80029 12.19C4.80848 11.2 5.19728 10.251 5.88612 9.53986C6.57495 8.82869 7.51101 8.40981 8.50029 8.37003H8.83529L8.95029 8.05503C9.2604 7.2496 9.81028 6.55878 10.5256 6.07591C11.241 5.59305 12.0873 5.34142 12.9503 5.35503C13.4051 5.35535 13.8572 5.42619 14.2903 5.56503C14.3299 5.23197 14.414 4.90573 14.5403 4.59503C14.0252 4.43613 13.4893 4.35523 12.9503 4.35503C11.9414 4.3468 10.9516 4.63029 10.1 5.1714C9.24844 5.7125 8.57138 6.48816 8.15029 7.40503C6.96363 7.53241 5.86506 8.09111 5.06315 8.97505C4.26125 9.85898 3.81186 11.0066 3.80029 12.2C3.8016 12.8321 3.92748 13.4577 4.17073 14.0411C4.41398 14.6245 4.76984 15.1543 5.21794 15.6001C5.66605 16.0459 6.19763 16.3989 6.78229 16.6392C7.36695 16.8794 7.99321 17.002 8.62529 17H10.5003V16H8.62529C7.61384 15.9987 6.64396 15.5974 5.92735 14.8836C5.21074 14.1698 4.80557 13.2015 4.80029 12.19Z\" fill=\"black\"/><path class=\"dot\" d=\"M18 8.5C19.3807 8.5 20.5 7.38071 20.5 6C20.5 4.61929 19.3807 3.5 18 3.5C16.6193 3.5 15.5 4.61929 15.5 6C15.5 7.38071 16.6193 8.5 18 8.5Z\" fill=\"black\"/></svg>',\r\n\t\t'file-generic': '<svg width=\"128\" height=\"128\" viewBox=\"0 0 128 128\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M106.825 36.075L79.925 9.175C79.175 8.425 78.1625 8 77.1 8H24C21.7875 8 20 9.7875 20 12V116C20 118.213 21.7875 120 24 120H104C106.213 120 108 118.213 108 116V38.9125C108 37.85 107.575 36.825 106.825 36.075ZM98.775 40.75H75.25V17.225L98.775 40.75ZM99 111H29V17H66.75V44C66.75 45.3924 67.3031 46.7277 68.2877 47.7123C69.2723 48.6969 70.6076 49.25 72 49.25H99V111Z\" fill=\"black\"/></svg>',\r\n\t\t'file-exel': '<svg width=\"128\" height=\"128\" viewBox=\"0 0 128 128\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M106.825 36.075L79.925 9.175C79.175 8.425 78.1625 8 77.1 8H24C21.7875 8 20 9.7875 20 12V116C20 118.213 21.7875 120 24 120H104C106.213 120 108 118.213 108 116V38.9125C108 37.85 107.575 36.825 106.825 36.075ZM98.775 40.75H75.25V17.225L98.775 40.75ZM99 111H29V17H66.75V44C66.75 45.3924 67.3031 46.7277 68.2877 47.7123C69.2723 48.6969 70.6076 49.25 72 49.25H99V111ZM64.2625 72.5125L56.5375 59.7125C56.2625 59.2625 55.775 58.9875 55.25 58.9875H50.45C50.1625 58.9875 49.8875 59.0625 49.65 59.225C48.95 59.6625 48.7375 60.5875 49.1875 61.3L59.475 77.6L49.05 94.2C48.9084 94.4277 48.8301 94.6891 48.8234 94.9571C48.8166 95.2252 48.8816 95.4902 49.0116 95.7247C49.1416 95.9592 49.3319 96.1547 49.5628 96.291C49.7937 96.4273 50.0569 96.4995 50.325 96.5H54.6375C55.1625 96.5 55.6375 96.225 55.9125 95.7875L63.75 83.1L71.5375 95.775C71.8125 96.225 72.3 96.4875 72.8125 96.4875H77.5C77.7875 96.4875 78.0625 96.4 78.3125 96.25C79.0125 95.8 79.2125 94.875 78.7625 94.175L68.2625 77.875L78.925 61.3125C79.0693 61.0855 79.1502 60.824 79.1591 60.5551C79.1681 60.2863 79.1048 60.0199 78.9759 59.7838C78.847 59.5477 78.6572 59.3505 78.4262 59.2126C78.1952 59.0748 77.9315 59.0013 77.6625 59H73.2C72.675 59 72.1875 59.275 71.9125 59.725L64.2625 72.5125Z\" fill=\"black\"/></svg>',\r\n\t\t'file-word': '<svg width=\"128\" height=\"128\" viewBox=\"0 0 128 128\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M106.825 36.075L79.925 9.175C79.175 8.425 78.1625 8 77.1 8H24C21.7875 8 20 9.7875 20 12V116C20 118.213 21.7875 120 24 120H104C106.213 120 108 118.213 108 116V38.9125C108 37.85 107.575 36.825 106.825 36.075ZM98.775 40.75H75.25V17.225L98.775 40.75ZM99 111H29V17H66.75V44C66.75 45.3924 67.3031 46.7277 68.2877 47.7123C69.2723 48.6969 70.6076 49.25 72 49.25H99V111ZM66.0125 59H61.9875C61.3 59 60.7 59.4625 60.5375 60.1375L54.325 85L48.5625 60.1625C48.4 59.4875 47.8 59 47.1 59H42.675C42.4451 59.0004 42.2183 59.0535 42.0121 59.1553C41.806 59.2571 41.6259 59.4048 41.4858 59.5872C41.3458 59.7695 41.2494 59.9816 41.2042 60.207C41.159 60.4324 41.1661 60.6652 41.225 60.8875L50.5 95.3875C50.675 96.0375 51.275 96.5 51.95 96.5H55.95C56.625 96.5 57.225 96.05 57.4 95.3875L64 70.7625L70.6 95.3875C70.775 96.0375 71.375 96.5 72.05 96.5H76.025C76.7 96.5 77.3 96.05 77.475 95.3875L86.775 60.8875C86.8334 60.6653 86.8401 60.4326 86.7947 60.2074C86.7493 59.9822 86.6529 59.7703 86.5129 59.5881C86.3729 59.4059 86.1931 59.2582 85.9872 59.1562C85.7813 59.0543 85.5548 59.0009 85.325 59H80.875C80.175 59 79.575 59.4875 79.4125 60.1625L73.6875 85.05L67.4625 60.1375C67.3 59.4625 66.7 59 66.0125 59Z\" fill=\"black\"/></svg>',\r\n\t\t'file-pdf': '<svg width=\"128\" height=\"128\" viewBox=\"0 0 128 128\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M66.4125 71.8L66.45 71.625C67.175 68.6375 68.0875 64.9125 67.375 61.5375C66.9 58.875 64.9375 57.8375 63.2625 57.7625C61.2875 57.675 59.525 58.8 59.0875 60.4375C58.2625 63.4375 59 67.5375 60.35 72.7625C58.65 76.8125 55.9375 82.7 53.95 86.2C50.25 88.1125 45.2875 91.0625 44.55 94.7875C44.4 95.475 44.575 96.35 44.9875 97.1375C45.45 98.0125 46.1875 98.6875 47.05 99.0125C47.425 99.15 47.875 99.2625 48.4 99.2625C50.6 99.2625 54.1625 97.4875 58.9125 89.3375C59.6375 89.1 60.3875 88.85 61.1125 88.6C64.5125 87.45 68.0375 86.25 71.225 85.7125C74.75 87.6 78.7625 88.8125 81.4875 88.8125C84.1875 88.8125 85.25 87.2125 85.65 86.25C86.35 84.5625 86.0125 82.4375 84.875 81.3C83.225 79.675 79.2125 79.25 72.9625 80.025C69.8875 78.15 67.875 75.6 66.4125 71.8ZM52.7 90.7875C50.9625 93.3125 49.65 94.575 48.9375 95.125C49.775 93.5875 51.4125 91.9625 52.7 90.7875ZM63.65 61.35C64.3 62.4625 64.2125 65.825 63.7125 67.525C63.1 65.0375 63.0125 61.5125 63.375 61.1C63.475 61.1125 63.5625 61.1875 63.65 61.35ZM63.45 76.4125C64.7875 78.725 66.475 80.7125 68.3375 82.1875C65.6375 82.8 63.175 83.8125 60.975 84.7125C60.45 84.925 59.9375 85.1375 59.4375 85.3375C61.1 82.325 62.4875 78.9125 63.45 76.4125ZM82.9 84.6C82.9125 84.625 82.925 84.6625 82.85 84.7125H82.825L82.8 84.75C82.7 84.8125 81.675 85.4125 77.2625 83.675C82.3375 83.4375 82.8875 84.5875 82.9 84.6ZM106.825 36.075L79.925 9.175C79.175 8.425 78.1625 8 77.1 8H24C21.7875 8 20 9.7875 20 12V116C20 118.213 21.7875 120 24 120H104C106.213 120 108 118.213 108 116V38.9125C108 37.85 107.575 36.825 106.825 36.075ZM98.775 40.75H75.25V17.225L98.775 40.75ZM99 111H29V17H66.75V44C66.75 45.3924 67.3031 46.7277 68.2877 47.7123C69.2723 48.6969 70.6076 49.25 72 49.25H99V111Z\" fill=\"black\"/></svg>',\r\n\t\t'file-zip': '<svg width=\"128\" height=\"128\" viewBox=\"0 0 128 128\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M37 49H45V57H37V49ZM37 72.75V92.75H53V72.75H45V65H37V72.75ZM47 78.75V86.75H43V78.75H47ZM45 41H53V49H45V41ZM37 33H45V41H37V33ZM45 57H53V65H45V57ZM45 25H53V33H45V25ZM106.825 36.075L79.925 9.175C79.175 8.425 78.1625 8 77.1 8H24C21.7875 8 20 9.7875 20 12V116C20 118.213 21.7875 120 24 120H104C106.213 120 108 118.213 108 116V38.9125C108 37.85 107.575 36.825 106.825 36.075ZM98.775 40.75H75.25V17.225L98.775 40.75ZM99 111H29V17H37V25H45V17H66.75V44C66.75 45.3924 67.3031 46.7277 68.2877 47.7123C69.2723 48.6969 70.6076 49.25 72 49.25H99V111Z\" fill=\"black\"/></svg>',\r\n\t\t'file-text': '<svg width=\"128\" height=\"128\" viewBox=\"0 0 128 128\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M106.825 36.075L79.925 9.175C79.175 8.425 78.1625 8 77.1 8H24C21.7875 8 20 9.7875 20 12V116C20 118.213 21.7875 120 24 120H104C106.213 120 108 118.213 108 116V38.9125C108 37.85 107.575 36.825 106.825 36.075ZM98.775 40.75H75.25V17.225L98.775 40.75ZM99 111H29V17H66.75V44C66.75 45.3924 67.3031 46.7277 68.2877 47.7123C69.2723 48.6969 70.6076 49.25 72 49.25H99V111ZM63 77.25H40C39.45 77.25 39 77.7 39 78.25V84.25C39 84.8 39.45 85.25 40 85.25H63C63.55 85.25 64 84.8 64 84.25V78.25C64 77.7 63.55 77.25 63 77.25ZM39 61.25V67.25C39 67.8 39.45 68.25 40 68.25H88C88.55 68.25 89 67.8 89 67.25V61.25C89 60.7 88.55 60.25 88 60.25H40C39.45 60.25 39 60.7 39 61.25Z\" fill=\"black\"/></svg>',\r\n\t\t'file-image': '<svg width=\"128\" height=\"128\" viewBox=\"0 0 128 128\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M69.1375 63.6375L59.4125 76.0375L54.275 69.4875C54.1815 69.368 54.0619 69.2713 53.9255 69.2048C53.7891 69.1384 53.6393 69.1038 53.4875 69.1038C53.3357 69.1038 53.1859 69.1384 53.0495 69.2048C52.9131 69.2713 52.7935 69.368 52.7 69.4875L40.225 85.3875C40.1096 85.5349 40.038 85.7118 40.0183 85.8979C39.9987 86.0841 40.0319 86.272 40.114 86.4402C40.1962 86.6084 40.324 86.7501 40.4829 86.8491C40.6418 86.9481 40.8253 87.0004 41.0125 87H87C87.8375 87 88.3 86.0375 87.7875 85.3875L70.725 63.6375C70.6302 63.5178 70.5096 63.4211 70.3721 63.3546C70.2347 63.2881 70.0839 63.2536 69.9313 63.2536C69.7786 63.2536 69.6278 63.2881 69.4904 63.3546C69.3529 63.4211 69.2323 63.5178 69.1375 63.6375ZM45 55.25C45 56.5761 45.5268 57.8479 46.4645 58.7855C47.4021 59.7232 48.6739 60.25 50 60.25C51.3261 60.25 52.5979 59.7232 53.5355 58.7855C54.4732 57.8479 55 56.5761 55 55.25C55 53.9239 54.4732 52.6521 53.5355 51.7145C52.5979 50.7768 51.3261 50.25 50 50.25C48.6739 50.25 47.4021 50.7768 46.4645 51.7145C45.5268 52.6521 45 53.9239 45 55.25ZM106.825 36.075L79.925 9.175C79.175 8.425 78.1625 8 77.1 8H24C21.7875 8 20 9.7875 20 12V116C20 118.213 21.7875 120 24 120H104C106.213 120 108 118.213 108 116V38.9125C108 37.85 107.575 36.825 106.825 36.075ZM98.775 40.75H75.25V17.225L98.775 40.75ZM99 111H29V17H66.75V44C66.75 45.3924 67.3031 46.7277 68.2877 47.7123C69.2723 48.6969 70.6076 49.25 72 49.25H99V111Z\" fill=\"black\"/></svg>',\r\n\t\t'file-audio': '<svg width=\"128\" height=\"128\" viewBox=\"0 0 128 128\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M106.825 36.075L79.925 9.175C79.175 8.425 78.1625 8 77.1 8H24C21.7875 8 20 9.7875 20 12V116C20 118.213 21.7875 120 24 120H104C106.213 120 108 118.213 108 116V38.9125C108 37.85 107.575 36.825 106.825 36.075ZM98.775 40.75H75.25V17.225L98.775 40.75ZM99 111H29V17H66.75V44C66.75 45.3924 67.3031 46.7277 68.2877 47.7123C69.2723 48.6969 70.6076 49.25 72 49.25H99V111Z\" fill=\"black\"/><path d=\"M64.6781 93.0344C62.701 95.0114 60.2677 96 57.3781 96C54.4885 96 52.0552 95.0114 50.0781 93.0344C48.1011 91.0573 47.1125 88.624 47.1125 85.7344C47.1125 82.8448 48.1011 80.4115 50.0781 78.4344C52.0552 76.4573 54.4885 75.4688 57.3781 75.4688C58.4458 75.4657 59.4541 75.598 60.4031 75.8657C61.3521 76.1333 62.2448 76.5714 63.0813 77.1797V64.0625C63.0843 62.7728 63.5223 61.69 64.3953 60.814C65.2682 59.938 66.351 59.5 67.6438 59.5H76.7688C78.0615 59.5 79.1443 59.938 80.0172 60.814C80.8902 61.69 81.3282 62.7728 81.3313 64.0625C81.3343 65.3522 80.8978 66.435 80.0218 67.311C79.1458 68.187 78.0615 68.625 76.7688 68.625H67.6438V85.7344C67.6438 88.624 66.6552 91.0573 64.6781 93.0344Z\" fill=\"black\"/></svg>',\r\n\t\t'file-video': '<svg width=\"128\" height=\"128\" viewBox=\"0 0 128 128\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M106.825 36.075L79.925 9.175C79.175 8.425 78.1625 8 77.1 8H24C21.7875 8 20 9.7875 20 12V116C20 118.213 21.7875 120 24 120H104C106.213 120 108 118.213 108 116V38.9125C108 37.85 107.575 36.825 106.825 36.075ZM98.775 40.75H75.25V17.225L98.775 40.75ZM99 111H29V17H66.75V44C66.75 45.3924 67.3031 46.7277 68.2877 47.7123C69.2723 48.6969 70.6076 49.25 72 49.25H99V111Z\" fill=\"black\"/><path d=\"M44.2566 71.7109C44.2566 70.0637 44.911 68.4839 46.0758 67.3191C47.2405 66.1544 48.8203 65.5 50.4676 65.5H64.5457C66.1929 65.5 67.7727 66.1544 68.9375 67.3191C70.1023 68.4839 70.7566 70.0637 70.7566 71.7109V85.7891C70.7566 87.4363 70.1023 89.0161 68.9375 90.1809C67.7727 91.3456 66.1929 92 64.5457 92H50.4676C48.8203 92 47.2405 91.3456 46.0758 90.1809C44.911 89.0161 44.2566 87.4363 44.2566 85.7891V71.7109ZM79.4552 89.8187L72.4129 84.956V72.5391L79.4552 67.6763C81.3765 66.348 84 67.726 84 70.0613V87.4354C84 89.7707 81.3782 91.1454 79.4552 89.8187Z\" fill=\"black\"/></svg>',\r\n\t\t'download': '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\"><path d=\"M.5 9.9a.5.5 0 0 1 .5.5v2.5a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-2.5a.5.5 0 0 1 1 0v2.5a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2v-2.5a.5.5 0 0 1 .5-.5\"/><path d=\"M7.646 11.854a.5.5 0 0 0 .708 0l3-3a.5.5 0 0 0-.708-.708L8.5 10.293V1.5a.5.5 0 0 0-1 0v8.793L5.354 8.146a.5.5 0 1 0-.708.708z\"/></svg>',\r\n\t\t'play': '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\"><path d=\"M10.804 8 5 4.633v6.734zm.792-.696a.802.802 0 0 1 0 1.392l-6.363 3.692C4.713 12.69 4 12.345 4 11.692V4.308c0-.653.713-.998 1.233-.696z\"/></svg>',\r\n\t\t'pause': '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\"><path d=\"M6.25 5C5.56 5 5 5.56 5 6.25v3.5a1.25 1.25 0 1 0 2.5 0v-3.5C7.5 5.56 6.94 5 6.25 5m3.5 0c-.69 0-1.25.56-1.25 1.25v3.5a1.25 1.25 0 1 0 2.5 0v-3.5C11 5.56 10.44 5 9.75 5\"/></svg>',\r\n\t};\r\n\r\n\treturn resolveSVGByFile(name, svg);\r\n}\r\n\r\n/**\r\n * Вешаем событие \"Закрыть\" на все модалки, сайдбары и т.п.\r\n * @param module\r\n * @param method\r\n */\r\nconst dismissTrigger = (module, method = 'hide') => {\r\n\tconst clickEvent = `click.dismiss.${module.EVENT_KEY}`\r\n\tconst name = module.NAME;\r\n\r\n\tEventHandler.on(document, clickEvent, `[data-vg-dismiss=\"${name}\"]`, function (event) {\r\n\t\tif (['A', 'AREA'].includes(this.tagName)) {\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\r\n\t\tif (isDisabled(this)) return;\r\n\r\n\t\tconst target = Selectors.getSelectorFromElement(this) || this.closest(`.vg-${name}`);\r\n\t\tconst instance = module.getOrCreateInstance(target);\r\n\r\n\t\tinstance[method]();\r\n\t})\r\n}\r\n\r\nexport {\r\n\tdismissTrigger, getSVG\r\n}\r\n","import Selectors from \"../../../utils/js/dom/selectors\";\r\nimport {isElement, normalizeData} from \"../../../utils/js/functions\";\r\nimport Ajax from \"../../../utils/js/components/ajax\";\r\nimport VGToast from \"../../vgtoast\";\r\n\r\nclass VGFilesSortable {\r\n constructor(vgFilesInstance, options = {}) {\r\n this._vg = vgFilesInstance;\r\n this._params = {\r\n handle: '.file',\r\n itemSelector: 'li.file',\r\n route: null,\r\n method: 'POST',\r\n toast: true,\r\n ...options\r\n };\r\n\r\n if (!options.itemSelector && options.handle) {\r\n this._params.itemSelector = `li${options.handle}`;\r\n }\r\n\r\n if (!this._params.route) {\r\n console.warn('VGFilesSortable: Не указан маршрут `route` для сохранения порядка.');\r\n }\r\n if (this._params.lists?.length) {\r\n this._list = this._params.lists.map(l => Selectors.find('.' + l, this._vg._element)).find(s => s);\r\n } else {\r\n this._list = this._vg._nodes.list;\r\n }\r\n\r\n if (!isElement(this._list)) {\r\n console.error('VGFilesSortable: Не найден контейнер списка файлов');\r\n return;\r\n }\r\n\r\n this._draggedItem = null;\r\n\r\n this._boundOnDragStart = this._onDragStart.bind(this);\r\n this._boundOnDragEnd = this._onDragEnd.bind(this);\r\n this._boundOnDragOver = this._onDragOver.bind(this);\r\n this._boundOnDrop = this._onDrop.bind(this);\r\n\r\n this._init();\r\n }\r\n\r\n _init() {\r\n this._enableDraggableItems();\r\n\r\n this._setupEvents();\r\n this._vg._triggerCallback('onSortableInit');\r\n }\r\n\r\n _enableDraggableItems() {\r\n const items = this._list.querySelectorAll(this._params.itemSelector);\r\n\r\n items.forEach(li => {\r\n li.setAttribute('draggable', 'true');\r\n\r\n const img = li.querySelector('img');\r\n if (img) img.setAttribute('draggable', 'false');\r\n });\r\n }\r\n\r\n _setupEvents() {\r\n this._list.addEventListener('dragstart', this._boundOnDragStart);\r\n this._list.addEventListener('dragend', this._boundOnDragEnd);\r\n this._list.addEventListener('dragover', this._boundOnDragOver);\r\n this._list.addEventListener('drop', this._boundOnDrop);\r\n }\r\n\r\n _onDragStart(e) {\r\n const handleEl = e.target.closest(this._params.handle);\r\n if (!handleEl) return;\r\n\r\n const item = e.target.closest(this._params.itemSelector) || e.target.closest('li');\r\n if (!item) return;\r\n\r\n this._draggedItem = item;\r\n\r\n e.dataTransfer.effectAllowed = 'move';\r\n e.dataTransfer.setData('text/plain', 'vgsortable');\r\n\r\n item.classList.add('dragging');\r\n requestAnimationFrame(() => item.classList.add('dragging-transparent'));\r\n }\r\n\r\n _onDragEnd(e) {\r\n if (this._draggedItem) {\r\n this._draggedItem.classList.remove('dragging', 'dragging-transparent');\r\n this._draggedItem = null;\r\n this._saveOrder();\r\n }\r\n }\r\n\r\n _onDragOver(e) {\r\n if (!this._draggedItem) return;\r\n\r\n e.preventDefault();\r\n e.dataTransfer.dropEffect = 'move';\r\n\r\n const currentTarget =\r\n e.target.closest(this._params.itemSelector) ||\r\n e.target.closest('li');\r\n\r\n if (!currentTarget || currentTarget === this._draggedItem) return;\r\n\r\n const rect = currentTarget.getBoundingClientRect();\r\n const midpoint = rect.height / 2;\r\n const offsetFromTop = e.clientY - rect.top;\r\n\r\n if (offsetFromTop < midpoint) {\r\n this._list.insertBefore(this._draggedItem, currentTarget);\r\n } else {\r\n this._list.insertBefore(this._draggedItem, currentTarget.nextSibling);\r\n }\r\n }\r\n\r\n _onDrop(e) {\r\n if (!this._draggedItem) return;\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n return false;\r\n }\r\n\r\n _saveOrder() {\r\n const ids = [... new Set(this._getUploadedIds())]\r\n\r\n if (!ids.length || !this._params.route) return;\r\n\r\n const xhr = new Ajax();\r\n xhr.post(this._params.route, { ids }, {\r\n onSuccess: (data) => VGToast.run(data.response.message),\r\n });\r\n }\r\n\r\n _getUploadedIds() {\r\n return Array.from(this._list.querySelectorAll('[data-id]'))\r\n .map(el => {\r\n const id = normalizeData(el.getAttribute('data-id'));\r\n return id ? id : null;\r\n }).filter(id => id !== null);\r\n }\r\n\r\n destroy() {\r\n this._list.removeEventListener('dragstart', this._boundOnDragStart);\r\n this._list.removeEventListener('dragend', this._boundOnDragEnd);\r\n this._list.removeEventListener('dragover', this._boundOnDragOver);\r\n this._list.removeEventListener('drop', this._boundOnDrop);\r\n\r\n this._draggedItem = null;\r\n }\r\n}\r\n\r\nexport default VGFilesSortable","import VGToast from \"./js/vgtoast\";\r\n\r\nexport default VGToast;","const DEFAULT_OPTIONS = {\r\n\tenable: false,\r\n\tselector: '.vg-toast-wrapper',\r\n\tthreshold: 4,\r\n\tresizeEdgeSize: 8,\r\n\tdebug: false,\r\n};\r\n\r\nclass VGToastDrag {\r\n\tconstructor(modalElement, dialogElement, options = {}) {\r\n\t\tthis._modalElement = modalElement;\r\n\t\tthis._dialogElement = dialogElement;\r\n\t\tthis._options = this._normalizeOptions(options);\r\n\t\tthis._pointerId = null;\r\n\t\tthis._dragTarget = null;\r\n\t\tthis._isDragging = false;\r\n\t\tthis._startX = 0;\r\n\t\tthis._startY = 0;\r\n\t\tthis._currentX = 0;\r\n\t\tthis._currentY = 0;\r\n\t\tthis._dialogStartLeft = 0;\r\n\t\tthis._dialogStartTop = 0;\r\n\t\tthis._dialogWidth = 0;\r\n\t\tthis._dialogHeight = 0;\r\n\t\tthis._isEnabled = false;\r\n\t\tthis._previousUserSelect = '';\r\n\t\tthis._previousTransition = '';\r\n\t\tthis._previousWillChange = '';\r\n\t\tthis._initialRect = null;\r\n\t\tthis._lockedIframes = [];\r\n\t\tthis._debugElement = null;\r\n\r\n\t\tthis._onPointerMove = this._onPointerMove.bind(this);\r\n\t\tthis._onPointerUp = this._onPointerUp.bind(this);\r\n\t\tthis._onPointerDown = this._onPointerDown.bind(this);\r\n\t\tthis._onNativeDragStart = this._onNativeDragStart.bind(this);\r\n\t}\r\n\r\n\tsetOptions(options = {}) {\r\n\t\tthis._options = this._normalizeOptions(options, this._options);\r\n\t\tthis._updateDebugOverlay();\r\n\t}\r\n\r\n\tenable() {\r\n\t\tif (!this._dialogElement || this._isEnabled) return;\r\n\r\n\t\tthis._updateDebugOverlay();\r\n\t\tthis._dialogElement.addEventListener('pointerdown', this._onPointerDown);\r\n\t\tthis._isEnabled = true;\r\n\t}\r\n\r\n\tdisable() {\r\n\t\tif (!this._dialogElement || !this._isEnabled) return;\r\n\r\n\t\tthis._dialogElement.removeEventListener('pointerdown', this._onPointerDown);\r\n\t\tdocument.removeEventListener('pointermove', this._onPointerMove);\r\n\t\tdocument.removeEventListener('pointerup', this._onPointerUp);\r\n\t\tdocument.removeEventListener('pointercancel', this._onPointerUp);\r\n\t\tdocument.removeEventListener('dragstart', this._onNativeDragStart, true);\r\n\t\tthis._dialogElement.style.touchAction = '';\r\n\t\tdocument.body.style.userSelect = this._previousUserSelect;\r\n\t\tthis._pointerId = null;\r\n\t\tthis._dragTarget = null;\r\n\t\tthis._isDragging = false;\r\n\t\tthis._initialRect = null;\r\n\t\tthis._unlockEmbeddedFrames();\r\n\t\tthis._restoreDragStyles();\r\n\t\tdelete this._modalElement.dataset.vgToastDragging;\r\n\t\tthis._setDebugVisibility(false);\r\n\t\tthis._isEnabled = false;\r\n\t}\r\n\r\n\tsyncPosition() {\r\n\t\tif (!this._isEnabled) return;\r\n\t\tif (!this._isPreparedForInteraction()) return;\r\n\r\n\t\tconst rect = this._dialogElement.getBoundingClientRect();\r\n\t\tconst width = this._dialogElement.offsetWidth || rect.width;\r\n\t\tconst height = this._dialogElement.offsetHeight || rect.height;\r\n\t\tconst currentLeft = Number.parseFloat(this._dialogElement.style.left);\r\n\t\tconst currentTop = Number.parseFloat(this._dialogElement.style.top);\r\n\t\tconst left = Number.isFinite(currentLeft) ? currentLeft : rect.left;\r\n\t\tconst top = Number.isFinite(currentTop) ? currentTop : rect.top;\r\n\t\tconst maxLeft = Math.max(0, window.innerWidth - width);\r\n\t\tconst maxTop = Math.max(0, window.innerHeight - height);\r\n\t\tconst nextLeft = Math.min(maxLeft, Math.max(0, left));\r\n\t\tconst nextTop = Math.min(maxTop, Math.max(0, top));\r\n\r\n\t\tthis._dialogElement.style.left = `${nextLeft}px`;\r\n\t\tthis._dialogElement.style.top = `${nextTop}px`;\r\n\t\tthis._updateDebugValues('synced');\r\n\t}\r\n\r\n\t_onPointerDown(event) {\r\n\t\tif (event.button !== 0) return;\r\n\r\n\t\tconst dragArea = this._resolveDragArea(event.target);\r\n\t\tif (!dragArea || !this._dialogElement.contains(dragArea)) return;\r\n\t\tif (this._isPointerOnResizeEdge(event)) return;\r\n\t\tif (event.target.closest('input, textarea, select, button, a, [contenteditable=\"true\"]')) return;\r\n\t\tif (dragArea && dragArea.closest('[data-vg-dismiss=\"toast\"]')) return;\r\n\r\n\t\tthis._pointerId = event.pointerId;\r\n\t\tthis._dragTarget = event.target;\r\n\t\tthis._isDragging = false;\r\n\t\tevent.preventDefault();\r\n\t\tthis._previousUserSelect = document.body.style.userSelect;\r\n\t\tdocument.body.style.userSelect = 'none';\r\n\t\tthis._initialRect = this._dialogElement.getBoundingClientRect();\r\n\t\tthis._dialogStartLeft = this._initialRect.left;\r\n\t\tthis._dialogStartTop = this._initialRect.top;\r\n\t\tthis._dialogWidth = this._initialRect.width;\r\n\t\tthis._dialogHeight = this._initialRect.height;\r\n\t\tthis._startX = event.clientX;\r\n\t\tthis._startY = event.clientY;\r\n\t\tthis._currentX = event.clientX;\r\n\t\tthis._currentY = event.clientY;\r\n\t\tthis._lockEmbeddedFrames();\r\n\t\tthis._modalElement.dataset.vgToastDragging = 'true';\r\n\t\tthis._setDebugVisibility(true);\r\n\t\tthis._updateDebugValues('armed');\r\n\r\n\t\tdocument.addEventListener('dragstart', this._onNativeDragStart, true);\r\n\r\n\t\tif (this._dialogElement && this._dialogElement.setPointerCapture) {\r\n\t\t\tthis._dialogElement.setPointerCapture(event.pointerId);\r\n\t\t}\r\n\r\n\t\tdocument.addEventListener('pointermove', this._onPointerMove);\r\n\t\tdocument.addEventListener('pointerup', this._onPointerUp);\r\n\t\tdocument.addEventListener('pointercancel', this._onPointerUp);\r\n\t}\r\n\r\n\t_onPointerMove(event) {\r\n\t\tif (event.pointerId !== this._pointerId) return;\r\n\r\n\t\tthis._currentX = event.clientX;\r\n\t\tthis._currentY = event.clientY;\r\n\t\tif (!this._isDragging) {\r\n\t\t\tconst deltaX = this._currentX - this._startX;\r\n\t\t\tconst deltaY = this._currentY - this._startY;\r\n\t\t\tconst distance = Math.hypot(deltaX, deltaY);\r\n\t\t\tif (distance < this._options.threshold) return;\r\n\r\n\t\t\tthis._isDragging = true;\r\n\t\t\tthis._dialogElement.style.touchAction = 'none';\r\n\t\t\tthis._applyDragStyles();\r\n\t\t\tthis._preparePosition(this._initialRect);\r\n\t\t\tevent.preventDefault();\r\n\t\t\tthis._updateDebugValues('dragging');\r\n\t\t}\r\n\t\tthis._applyDragPosition();\r\n\t}\r\n\r\n\t_onPointerUp(event) {\r\n\t\tif (event.pointerId !== this._pointerId) return;\r\n\r\n\t\tdocument.removeEventListener('pointermove', this._onPointerMove);\r\n\t\tdocument.removeEventListener('pointerup', this._onPointerUp);\r\n\t\tdocument.removeEventListener('pointercancel', this._onPointerUp);\r\n\t\tdocument.removeEventListener('dragstart', this._onNativeDragStart, true);\r\n\t\tif (this._isDragging) {\r\n\t\t\tthis._applyDragPosition();\r\n\t\t}\r\n\t\tthis._dialogElement.style.touchAction = '';\r\n\t\tdocument.body.style.userSelect = this._previousUserSelect;\r\n\r\n\t\tif (this._dialogElement && this._dialogElement.releasePointerCapture) {\r\n\t\t\tthis._dialogElement.releasePointerCapture(event.pointerId);\r\n\t\t}\r\n\r\n\t\tthis._pointerId = null;\r\n\t\tthis._dragTarget = null;\r\n\t\tthis._isDragging = false;\r\n\t\tthis._initialRect = null;\r\n\t\tthis._unlockEmbeddedFrames();\r\n\t\tthis._restoreDragStyles();\r\n\t\tdelete this._modalElement.dataset.vgToastDragging;\r\n\t\tthis._setDebugVisibility(this._options.debug);\r\n\t\tthis._updateDebugValues('idle');\r\n\t}\r\n\r\n\t_preparePosition(rect = null) {\r\n\t\tif (!this._dialogElement) return;\r\n\r\n\t\tconst currentRect = rect || this._dialogElement.getBoundingClientRect();\r\n\t\tthis._dialogElement.style.position = 'fixed';\r\n\t\tthis._dialogElement.style.margin = '0';\r\n\t\tthis._dialogElement.style.left = `${currentRect.left}px`;\r\n\t\tthis._dialogElement.style.top = `${currentRect.top}px`;\r\n\t\tthis._dialogElement.style.width = `${currentRect.width}px`;\r\n\t\tthis._dialogElement.style.height = `${currentRect.height}px`;\r\n\t\tthis._dialogElement.style.transform = 'none';\r\n\t\tthis._dialogElement.style.translate = 'none';\r\n\t}\r\n\r\n\t_isPreparedForInteraction() {\r\n\t\treturn this._dialogElement.style.position === 'fixed' && this._dialogElement.style.transform === 'none';\r\n\t}\r\n\r\n\t_isPointerOnResizeEdge(event) {\r\n\t\tconst rect = this._dialogElement.getBoundingClientRect();\r\n\t\tconst offsetX = event.clientX - rect.left;\r\n\t\tconst offsetY = event.clientY - rect.top;\r\n\t\tconst edgeSize = this._options.resizeEdgeSize;\r\n\r\n\t\tconst nearTop = offsetY >= 0 && offsetY <= edgeSize;\r\n\t\tconst nearBottom = offsetY <= rect.height && offsetY >= rect.height - edgeSize;\r\n\t\tconst nearLeft = offsetX >= 0 && offsetX <= edgeSize;\r\n\t\tconst nearRight = offsetX <= rect.width && offsetX >= rect.width - edgeSize;\r\n\r\n\t\treturn nearTop || nearBottom || nearLeft || nearRight;\r\n\t}\r\n\r\n\t_applyDragPosition() {\r\n\t\tif (this._pointerId === null || !this._isDragging) return;\r\n\r\n\t\tconst deltaX = this._currentX - this._startX;\r\n\t\tconst deltaY = this._currentY - this._startY;\r\n\t\tconst maxLeft = Math.max(0, window.innerWidth - this._dialogWidth);\r\n\t\tconst maxTop = Math.max(0, window.innerHeight - this._dialogHeight);\r\n\t\tconst nextLeft = Math.min(maxLeft, Math.max(0, this._dialogStartLeft + deltaX));\r\n\t\tconst nextTop = Math.min(maxTop, Math.max(0, this._dialogStartTop + deltaY));\r\n\r\n\t\tthis._dialogElement.style.left = `${nextLeft}px`;\r\n\t\tthis._dialogElement.style.top = `${nextTop}px`;\r\n\t\tthis._updateDebugValues('dragging');\r\n\t}\r\n\r\n\t_onNativeDragStart(event) {\r\n\t\tif (this._pointerId === null) return;\r\n\t\tevent.preventDefault();\r\n\t}\r\n\r\n\t_applyDragStyles() {\r\n\t\tthis._previousTransition = this._dialogElement.style.transition;\r\n\t\tthis._previousWillChange = this._dialogElement.style.willChange;\r\n\t\tthis._dialogElement.style.transition = 'none';\r\n\t\tthis._dialogElement.style.willChange = 'left, top';\r\n\t}\r\n\r\n\t_restoreDragStyles() {\r\n\t\tthis._dialogElement.style.transition = this._previousTransition;\r\n\t\tthis._dialogElement.style.willChange = this._previousWillChange;\r\n\t}\r\n\r\n\t_lockEmbeddedFrames() {\r\n\t\tif (!this._dialogElement || this._lockedIframes.length) return;\r\n\r\n\t\tconst iframes = this._dialogElement.querySelectorAll('iframe');\r\n\t\tfor (const frame of iframes) {\r\n\t\t\tthis._lockedIframes.push({\r\n\t\t\t\telement: frame,\r\n\t\t\t\tpointerEvents: frame.style.pointerEvents,\r\n\t\t\t});\r\n\t\t\tframe.style.pointerEvents = 'none';\r\n\t\t}\r\n\t}\r\n\r\n\t_unlockEmbeddedFrames() {\r\n\t\tif (!this._lockedIframes.length) return;\r\n\r\n\t\tfor (const item of this._lockedIframes) {\r\n\t\t\titem.element.style.pointerEvents = item.pointerEvents;\r\n\t\t}\r\n\t\tthis._lockedIframes = [];\r\n\t}\r\n\r\n\t_normalizeOptions(options, base = DEFAULT_OPTIONS) {\r\n\t\tconst merged = {...base, ...options};\r\n\t\tconst threshold = Number(merged.threshold);\r\n\t\tconst resizeEdgeSize = Number(merged.resizeEdgeSize);\r\n\t\tconst selector = typeof merged.selector === 'string' && merged.selector.trim()\r\n\t\t\t? merged.selector\r\n\t\t\t: DEFAULT_OPTIONS.selector;\r\n\r\n\t\treturn {\r\n\t\t\t...merged,\r\n\t\t\tselector,\r\n\t\t\tthreshold: Number.isFinite(threshold) && threshold >= 0 ? threshold : DEFAULT_OPTIONS.threshold,\r\n\t\t\tresizeEdgeSize: Number.isFinite(resizeEdgeSize) && resizeEdgeSize > 0 ? resizeEdgeSize : DEFAULT_OPTIONS.resizeEdgeSize,\r\n\t\t\tdebug: Boolean(merged.debug),\r\n\t\t};\r\n\t}\r\n\r\n\t_resolveDragArea(target) {\r\n\t\ttry {\r\n\t\t\treturn target.closest(this._options.selector);\r\n\t\t} catch (error) {\r\n\t\t\treturn target.closest(DEFAULT_OPTIONS.selector);\r\n\t\t}\r\n\t}\r\n\r\n\t_updateDebugOverlay() {\r\n\t\tif (!this._options.debug) {\r\n\t\t\tthis._setDebugVisibility(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!this._debugElement) {\r\n\t\t\tthis._debugElement = document.createElement('div');\r\n\t\t\tthis._debugElement.style.position = 'absolute';\r\n\t\t\tthis._debugElement.style.left = '170px';\r\n\t\t\tthis._debugElement.style.bottom = '8px';\r\n\t\t\tthis._debugElement.style.zIndex = '7';\r\n\t\t\tthis._debugElement.style.padding = '4px 6px';\r\n\t\t\tthis._debugElement.style.borderRadius = '4px';\r\n\t\t\tthis._debugElement.style.background = 'rgba(0, 0, 0, 0.72)';\r\n\t\t\tthis._debugElement.style.color = '#fff';\r\n\t\t\tthis._debugElement.style.fontSize = '11px';\r\n\t\t\tthis._debugElement.style.lineHeight = '1.3';\r\n\t\t\tthis._debugElement.style.pointerEvents = 'none';\r\n\t\t\tthis._dialogElement.append(this._debugElement);\r\n\t\t}\r\n\r\n\t\tthis._setDebugVisibility(true);\r\n\t\tthis._updateDebugValues(this._isDragging ? 'dragging' : 'idle');\r\n\t}\r\n\r\n\t_setDebugVisibility(visible) {\r\n\t\tif (!this._debugElement) return;\r\n\t\tthis._debugElement.style.display = visible ? 'block' : 'none';\r\n\t}\r\n\r\n\t_updateDebugValues(state = 'idle') {\r\n\t\tif (!this._debugElement || !this._options.debug) return;\r\n\r\n\t\tconst rect = this._dialogElement.getBoundingClientRect();\r\n\t\tthis._debugElement.textContent = `drag:${state} x:${Math.round(rect.left)} y:${Math.round(rect.top)} w:${Math.round(rect.width)} h:${Math.round(rect.height)}`;\r\n\t}\r\n}\r\n\r\nexport default VGToastDrag;\r\n\r\n\r\n","const DEFAULT_OPTIONS = {\r\n\tenable: false,\r\n\tminWidth: 300,\r\n\tminHeight: 160,\r\n\tedgeSize: 8,\r\n\tdebug: false,\r\n};\r\n\r\nconst DIRECTION_TO_CURSOR = {\r\n\tn: 'ns-resize',\r\n\ts: 'ns-resize',\r\n\te: 'ew-resize',\r\n\tw: 'ew-resize',\r\n\tne: 'nesw-resize',\r\n\tsw: 'nesw-resize',\r\n\tnw: 'nwse-resize',\r\n\tse: 'nwse-resize',\r\n};\r\n\r\nclass VGToastResize {\r\n\tconstructor(modalElement, dialogElement, options = {}) {\r\n\t\tthis._modalElement = modalElement;\r\n\t\tthis._dialogElement = dialogElement;\r\n\t\tthis._contentElement = this._dialogElement ? this._dialogElement.querySelector('.vg-toast-wrapper') : null;\r\n\t\tthis._options = this._normalizeOptions(options);\r\n\t\tthis._pointerId = null;\r\n\t\tthis._direction = '';\r\n\t\tthis._startX = 0;\r\n\t\tthis._startY = 0;\r\n\t\tthis._currentX = 0;\r\n\t\tthis._currentY = 0;\r\n\t\tthis._startWidth = 0;\r\n\t\tthis._startHeight = 0;\r\n\t\tthis._startLeft = 0;\r\n\t\tthis._startTop = 0;\r\n\t\tthis._startRight = 0;\r\n\t\tthis._startBottom = 0;\r\n\t\tthis._isEnabled = false;\r\n\t\tthis._observer = null;\r\n\t\tthis._syncFrameId = null;\r\n\t\tthis._resizeFrameId = null;\r\n\t\tthis._lockedIframes = [];\r\n\t\tthis._debugElement = null;\r\n\t\tthis._previousMaxWidth = '';\r\n\t\tthis._previousMaxHeight = '';\r\n\t\tthis._previousPointerEvents = '';\r\n\t\tthis._previousMinHeight = '';\r\n\t\tthis._previousOverflow = '';\r\n\t\tthis._previousTransition = '';\r\n\t\tthis._previousWillChange = '';\r\n\t\tthis._previousContentHeight = '';\r\n\t\tthis._previousContentMaxHeight = '';\r\n\t\tthis._previousContentOverflow = '';\r\n\r\n\t\tthis._onPointerDown = this._onPointerDown.bind(this);\r\n\t\tthis._onPointerMove = this._onPointerMove.bind(this);\r\n\t\tthis._onPointerUp = this._onPointerUp.bind(this);\r\n\t\tthis._onPointerLeave = this._onPointerLeave.bind(this);\r\n\t\tthis._applyResizePosition = this._applyResizePosition.bind(this);\r\n\t}\r\n\r\n\tsetOptions(options = {}) {\r\n\t\tthis._options = this._normalizeOptions(options, this._options);\r\n\t\tthis._updateDebugOverlay();\r\n\t}\r\n\r\n\tenable() {\r\n\t\tif (!this._dialogElement || this._isEnabled) return;\r\n\r\n\t\tthis._updateDebugOverlay();\r\n\t\tthis._modalElement.addEventListener('pointermove', this._onPointerMove);\r\n\t\tthis._modalElement.addEventListener('pointerdown', this._onPointerDown);\r\n\t\tthis._modalElement.addEventListener('pointerleave', this._onPointerLeave);\r\n\t\tthis._startObserveSizeChanges();\r\n\t\tthis._isEnabled = true;\r\n\t}\r\n\r\n\tdisable() {\r\n\t\tif (!this._isEnabled) return;\r\n\r\n\t\tthis._modalElement.removeEventListener('pointermove', this._onPointerMove);\r\n\t\tthis._modalElement.removeEventListener('pointerdown', this._onPointerDown);\r\n\t\tthis._modalElement.removeEventListener('pointerleave', this._onPointerLeave);\r\n\t\tdocument.removeEventListener('pointermove', this._onPointerMove);\r\n\t\tdocument.removeEventListener('pointerup', this._onPointerUp);\r\n\t\tdocument.removeEventListener('pointercancel', this._onPointerUp);\r\n\t\tthis._cancelResizeFrame();\r\n\t\tthis._stopObserveSizeChanges();\r\n\t\tthis._pointerId = null;\r\n\t\tthis._direction = '';\r\n\t\tthis._dialogElement.style.cursor = '';\r\n\t\tdelete this._modalElement.dataset.vgToastResizing;\r\n\t\tthis._unlockEmbeddedFrames();\r\n\t\tthis._restoreResizeStyles();\r\n\t\tthis._setDebugVisibility(false);\r\n\t\tthis._isEnabled = false;\r\n\t}\r\n\r\n\tsyncToViewport() {\r\n\t\tif (this._modalElement && this._modalElement.dataset.vgToastDragging === 'true') return;\r\n\t\tif (!this._isPreparedForInteraction()) return;\r\n\r\n\t\tconst rect = this._dialogElement.getBoundingClientRect();\r\n\t\tconst currentWidth = this._dialogElement.offsetWidth || rect.width;\r\n\t\tconst currentHeight = this._dialogElement.offsetHeight || rect.height;\r\n\t\tconst currentLeftValue = Number.parseFloat(this._dialogElement.style.left);\r\n\t\tconst currentTopValue = Number.parseFloat(this._dialogElement.style.top);\r\n\t\tconst currentLeft = Number.isFinite(currentLeftValue) ? currentLeftValue : rect.left;\r\n\t\tconst currentTop = Number.isFinite(currentTopValue) ? currentTopValue : rect.top;\r\n\t\tconst maxWidth = window.innerWidth;\r\n\t\tconst maxHeight = window.innerHeight;\r\n\t\tconst width = Math.max(this._options.minWidth, Math.min(currentWidth, maxWidth));\r\n\t\tconst height = Math.max(this._options.minHeight, Math.min(currentHeight, maxHeight));\r\n\t\tconst maxLeft = Math.max(0, window.innerWidth - width);\r\n\t\tconst maxTop = Math.max(0, window.innerHeight - height);\r\n\t\tconst left = Math.min(maxLeft, Math.max(0, currentLeft));\r\n\t\tconst top = Math.min(maxTop, Math.max(0, currentTop));\r\n\r\n\t\tif (Math.abs(currentWidth - width) > 0.5) {\r\n\t\t\tthis._dialogElement.style.width = `${width}px`;\r\n\t\t}\r\n\r\n\t\tif (Math.abs(currentHeight - height) > 0.5) {\r\n\t\t\tthis._dialogElement.style.height = `${height}px`;\r\n\t\t}\r\n\r\n\t\tthis._dialogElement.style.left = `${left}px`;\r\n\t\tthis._dialogElement.style.top = `${top}px`;\r\n\t\tthis._updateDebugValues();\r\n\t}\r\n\r\n\t_onPointerDown(event) {\r\n\t\tif (event.button !== 0) return;\r\n\t\tif (event.defaultPrevented) return;\r\n\r\n\t\tconst direction = this._getDirectionFromPointer(event);\r\n\t\tif (!direction) return;\r\n\r\n\t\tevent.preventDefault();\r\n\t\tthis._pointerId = event.pointerId;\r\n\t\tthis._direction = direction;\r\n\r\n\t\tconst rect = this._dialogElement.getBoundingClientRect();\r\n\t\tthis._applyResizeStyles();\r\n\t\tthis._preparePosition(rect);\r\n\t\tthis._startX = event.clientX;\r\n\t\tthis._startY = event.clientY;\r\n\t\tthis._currentX = event.clientX;\r\n\t\tthis._currentY = event.clientY;\r\n\t\tthis._startWidth = rect.width;\r\n\t\tthis._startHeight = rect.height;\r\n\t\tthis._startLeft = rect.left;\r\n\t\tthis._startTop = rect.top;\r\n\t\tthis._startRight = rect.right;\r\n\t\tthis._startBottom = rect.bottom;\r\n\t\tthis._lockEmbeddedFrames();\r\n\t\tthis._modalElement.dataset.vgToastResizing = 'true';\r\n\t\tthis._setDebugVisibility(true);\r\n\t\tthis._updateDebugValues();\r\n\r\n\t\tdocument.addEventListener('pointermove', this._onPointerMove);\r\n\t\tdocument.addEventListener('pointerup', this._onPointerUp);\r\n\t\tdocument.addEventListener('pointercancel', this._onPointerUp);\r\n\t}\r\n\r\n\t_onPointerMove(event) {\r\n\t\tif (this._pointerId === null) {\r\n\t\t\tconst direction = this._getDirectionFromPointer(event);\r\n\t\t\tthis._dialogElement.style.cursor = direction ? DIRECTION_TO_CURSOR[direction] : '';\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (event.pointerId !== this._pointerId) return;\r\n\r\n\t\tthis._currentX = event.clientX;\r\n\t\tthis._currentY = event.clientY;\r\n\t\tif (this._resizeFrameId !== null) return;\r\n\t\tthis._resizeFrameId = window.requestAnimationFrame(this._applyResizePosition);\r\n\t}\r\n\r\n\t_applyResizePosition() {\r\n\t\tthis._resizeFrameId = null;\r\n\t\tif (this._pointerId === null) return;\r\n\r\n\t\tconst deltaX = this._currentX - this._startX;\r\n\t\tconst deltaY = this._currentY - this._startY;\r\n\t\tlet width = this._startWidth;\r\n\t\tlet height = this._startHeight;\r\n\t\tlet left = this._startLeft;\r\n\t\tlet top = this._startTop;\r\n\r\n\t\tif (this._direction.includes('e')) {\r\n\t\t\tconst maxWidth = Math.max(this._options.minWidth, window.innerWidth - this._startLeft);\r\n\t\t\twidth = Math.min(maxWidth, Math.max(this._options.minWidth, this._startWidth + deltaX));\r\n\t\t}\r\n\r\n\t\tif (this._direction.includes('s')) {\r\n\t\t\tconst maxHeight = Math.max(this._options.minHeight, window.innerHeight - this._startTop);\r\n\t\t\theight = Math.min(maxHeight, Math.max(this._options.minHeight, this._startHeight + deltaY));\r\n\t\t}\r\n\r\n\t\tif (this._direction.includes('w')) {\r\n\t\t\tconst maxLeft = this._startRight - this._options.minWidth;\r\n\t\t\tleft = Math.min(maxLeft, Math.max(0, this._startLeft + deltaX));\r\n\t\t\twidth = this._startRight - left;\r\n\t\t}\r\n\r\n\t\tif (this._direction.includes('n')) {\r\n\t\t\tconst maxTop = this._startBottom - this._options.minHeight;\r\n\t\t\ttop = Math.min(maxTop, Math.max(0, this._startTop + deltaY));\r\n\t\t\theight = this._startBottom - top;\r\n\t\t}\r\n\r\n\t\tthis._dialogElement.style.left = `${left}px`;\r\n\t\tthis._dialogElement.style.top = `${top}px`;\r\n\t\tthis._dialogElement.style.width = `${width}px`;\r\n\t\tthis._dialogElement.style.height = `${height}px`;\r\n\t\tthis._updateDebugValues();\r\n\t}\r\n\r\n\t_onPointerUp(event) {\r\n\t\tif (event.pointerId !== this._pointerId) return;\r\n\r\n\t\tdocument.removeEventListener('pointermove', this._onPointerMove);\r\n\t\tdocument.removeEventListener('pointerup', this._onPointerUp);\r\n\t\tdocument.removeEventListener('pointercancel', this._onPointerUp);\r\n\t\tthis._cancelResizeFrame();\r\n\t\tthis._applyResizePosition();\r\n\t\tthis._pointerId = null;\r\n\t\tthis._direction = '';\r\n\t\tdelete this._modalElement.dataset.vgToastResizing;\r\n\t\tthis._unlockEmbeddedFrames();\r\n\t\tthis._setDebugVisibility(this._options.debug);\r\n\t\tthis._updateDebugValues();\r\n\t}\r\n\r\n\t_onPointerLeave() {\r\n\t\tif (this._pointerId !== null) return;\r\n\t\tthis._dialogElement.style.cursor = '';\r\n\t}\r\n\r\n\t_getDirectionFromPointer(event) {\r\n\t\tconst rect = this._dialogElement.getBoundingClientRect();\r\n\t\tconst offsetX = event.clientX - rect.left;\r\n\t\tconst offsetY = event.clientY - rect.top;\r\n\t\tconst edgeSize = this._options.edgeSize;\r\n\t\tconst insideDialog = offsetX >= 0 && offsetX <= rect.width && offsetY >= 0 && offsetY <= rect.height;\r\n\t\tif (!insideDialog) return '';\r\n\r\n\t\tconst nearTop = offsetY >= 0 && offsetY <= edgeSize;\r\n\t\tconst nearBottom = offsetY <= rect.height && offsetY >= rect.height - edgeSize;\r\n\t\tconst nearLeft = offsetX >= 0 && offsetX <= edgeSize;\r\n\t\tconst nearRight = offsetX <= rect.width && offsetX >= rect.width - edgeSize;\r\n\r\n\t\tif (nearTop && nearLeft) return 'nw';\r\n\t\tif (nearTop && nearRight) return 'ne';\r\n\t\tif (nearBottom && nearLeft) return 'sw';\r\n\t\tif (nearBottom && nearRight) return 'se';\r\n\t\tif (nearTop) return 'n';\r\n\t\tif (nearBottom) return 's';\r\n\t\tif (nearLeft) return 'w';\r\n\t\tif (nearRight) return 'e';\r\n\r\n\t\treturn '';\r\n\t}\r\n\r\n\t_preparePosition(rect) {\r\n\t\tthis._dialogElement.style.position = 'fixed';\r\n\t\tthis._dialogElement.style.margin = '0';\r\n\t\tthis._dialogElement.style.left = `${rect.left}px`;\r\n\t\tthis._dialogElement.style.top = `${rect.top}px`;\r\n\t\tthis._dialogElement.style.width = `${rect.width}px`;\r\n\t\tthis._dialogElement.style.height = `${rect.height}px`;\r\n\t\tthis._dialogElement.style.transform = 'none';\r\n\t\tthis._dialogElement.style.translate = 'none';\r\n\t}\r\n\r\n\t_isPreparedForInteraction() {\r\n\t\treturn this._dialogElement.style.position === 'fixed' && this._dialogElement.style.transform === 'none';\r\n\t}\r\n\r\n\t_startObserveSizeChanges() {\r\n\t\tif (typeof ResizeObserver === 'undefined' || this._observer) return;\r\n\r\n\t\tthis._observer = new ResizeObserver(() => {\r\n\t\t\tif (this._pointerId !== null) return;\r\n\t\t\tif (this._modalElement && this._modalElement.dataset.vgToastDragging === 'true') return;\r\n\t\t\tif (this._syncFrameId !== null) return;\r\n\r\n\t\t\tthis._syncFrameId = window.requestAnimationFrame(() => {\r\n\t\t\t\tthis._syncFrameId = null;\r\n\t\t\t\tthis.syncToViewport();\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\tthis._observer.observe(this._dialogElement);\r\n\t}\r\n\r\n\t_stopObserveSizeChanges() {\r\n\t\tif (this._observer) {\r\n\t\t\tthis._observer.disconnect();\r\n\t\t\tthis._observer = null;\r\n\t\t}\r\n\r\n\t\tif (this._syncFrameId !== null) {\r\n\t\t\twindow.cancelAnimationFrame(this._syncFrameId);\r\n\t\t\tthis._syncFrameId = null;\r\n\t\t}\r\n\t}\r\n\r\n\t_applyResizeStyles() {\r\n\t\tthis._previousMaxWidth = this._dialogElement.style.maxWidth;\r\n\t\tthis._previousMaxHeight = this._dialogElement.style.maxHeight;\r\n\t\tthis._previousPointerEvents = this._dialogElement.style.pointerEvents;\r\n\t\tthis._previousMinHeight = this._dialogElement.style.minHeight;\r\n\t\tthis._previousOverflow = this._dialogElement.style.overflow;\r\n\t\tthis._previousTransition = this._dialogElement.style.transition;\r\n\t\tthis._previousWillChange = this._dialogElement.style.willChange;\r\n\r\n\t\tthis._dialogElement.style.maxWidth = 'none';\r\n\t\tthis._dialogElement.style.maxHeight = 'none';\r\n\t\tthis._dialogElement.style.pointerEvents = 'auto';\r\n\t\tthis._dialogElement.style.minHeight = `${this._options.minHeight}px`;\r\n\t\tthis._dialogElement.style.overflow = 'hidden';\r\n\t\tthis._dialogElement.style.transition = 'none';\r\n\t\tthis._dialogElement.style.willChange = 'left, top, width, height';\r\n\r\n\t\tif (this._contentElement) {\r\n\t\t\tthis._previousContentHeight = this._contentElement.style.height;\r\n\t\t\tthis._previousContentMaxHeight = this._contentElement.style.maxHeight;\r\n\t\t\tthis._previousContentOverflow = this._contentElement.style.overflow;\r\n\t\t\tthis._contentElement.style.height = '100%';\r\n\t\t\tthis._contentElement.style.maxHeight = '100%';\r\n\t\t\tthis._contentElement.style.overflow = 'auto';\r\n\t\t}\r\n\t}\r\n\r\n\t_restoreResizeStyles() {\r\n\t\tthis._dialogElement.style.maxWidth = this._previousMaxWidth;\r\n\t\tthis._dialogElement.style.maxHeight = this._previousMaxHeight;\r\n\t\tthis._dialogElement.style.pointerEvents = this._previousPointerEvents;\r\n\t\tthis._dialogElement.style.minHeight = this._previousMinHeight;\r\n\t\tthis._dialogElement.style.overflow = this._previousOverflow;\r\n\t\tthis._dialogElement.style.transition = this._previousTransition;\r\n\t\tthis._dialogElement.style.willChange = this._previousWillChange;\r\n\r\n\t\tif (this._contentElement) {\r\n\t\t\tthis._contentElement.style.height = this._previousContentHeight;\r\n\t\t\tthis._contentElement.style.maxHeight = this._previousContentMaxHeight;\r\n\t\t\tthis._contentElement.style.overflow = this._previousContentOverflow;\r\n\t\t}\r\n\t}\r\n\r\n\t_normalizeOptions(options, base = DEFAULT_OPTIONS) {\r\n\t\tconst merged = {...base, ...options};\r\n\t\tconst minWidth = Number(merged.minWidth);\r\n\t\tconst minHeight = Number(merged.minHeight);\r\n\t\tconst edgeSize = Number(merged.edgeSize);\r\n\r\n\t\treturn {\r\n\t\t\t...merged,\r\n\t\t\tminWidth: Number.isFinite(minWidth) && minWidth > 0 ? minWidth : DEFAULT_OPTIONS.minWidth,\r\n\t\t\tminHeight: Number.isFinite(minHeight) && minHeight > 0 ? minHeight : DEFAULT_OPTIONS.minHeight,\r\n\t\t\tedgeSize: Number.isFinite(edgeSize) && edgeSize > 0 ? edgeSize : DEFAULT_OPTIONS.edgeSize,\r\n\t\t\tdebug: Boolean(merged.debug),\r\n\t\t};\r\n\t}\r\n\r\n\t_cancelResizeFrame() {\r\n\t\tif (this._resizeFrameId === null) return;\r\n\t\twindow.cancelAnimationFrame(this._resizeFrameId);\r\n\t\tthis._resizeFrameId = null;\r\n\t}\r\n\r\n\t_lockEmbeddedFrames() {\r\n\t\tif (!this._dialogElement || this._lockedIframes.length) return;\r\n\r\n\t\tconst iframes = this._dialogElement.querySelectorAll('iframe');\r\n\t\tfor (const frame of iframes) {\r\n\t\t\tthis._lockedIframes.push({\r\n\t\t\t\telement: frame,\r\n\t\t\t\tpointerEvents: frame.style.pointerEvents,\r\n\t\t\t});\r\n\t\t\tframe.style.pointerEvents = 'none';\r\n\t\t}\r\n\t}\r\n\r\n\t_unlockEmbeddedFrames() {\r\n\t\tif (!this._lockedIframes.length) return;\r\n\r\n\t\tfor (const item of this._lockedIframes) {\r\n\t\t\titem.element.style.pointerEvents = item.pointerEvents;\r\n\t\t}\r\n\t\tthis._lockedIframes = [];\r\n\t}\r\n\r\n\t_updateDebugOverlay() {\r\n\t\tif (!this._options.debug) {\r\n\t\t\tthis._setDebugVisibility(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!this._debugElement) {\r\n\t\t\tthis._debugElement = document.createElement('div');\r\n\t\t\tthis._debugElement.style.position = 'absolute';\r\n\t\t\tthis._debugElement.style.left = '8px';\r\n\t\t\tthis._debugElement.style.bottom = '8px';\r\n\t\t\tthis._debugElement.style.zIndex = '6';\r\n\t\t\tthis._debugElement.style.padding = '4px 6px';\r\n\t\t\tthis._debugElement.style.borderRadius = '4px';\r\n\t\t\tthis._debugElement.style.background = 'rgba(0, 0, 0, 0.72)';\r\n\t\t\tthis._debugElement.style.color = '#fff';\r\n\t\t\tthis._debugElement.style.fontSize = '11px';\r\n\t\t\tthis._debugElement.style.lineHeight = '1.3';\r\n\t\t\tthis._debugElement.style.pointerEvents = 'none';\r\n\t\t\tthis._dialogElement.append(this._debugElement);\r\n\t\t}\r\n\r\n\t\tthis._setDebugVisibility(true);\r\n\t\tthis._updateDebugValues();\r\n\t}\r\n\r\n\t_setDebugVisibility(visible) {\r\n\t\tif (!this._debugElement) return;\r\n\t\tthis._debugElement.style.display = visible ? 'block' : 'none';\r\n\t}\r\n\r\n\t_updateDebugValues() {\r\n\t\tif (!this._debugElement || !this._options.debug) return;\r\n\r\n\t\tconst rect = this._dialogElement.getBoundingClientRect();\r\n\t\tthis._debugElement.textContent = `w:${Math.round(rect.width)} h:${Math.round(rect.height)} x:${Math.round(rect.left)} y:${Math.round(rect.top)}`;\r\n\t}\r\n}\r\n\r\nexport default VGToastResize;\r\n\r\n","import BaseModule from \"../../base-module\";\r\nimport EventHandler from \"../../../utils/js/dom/event\";\r\nimport {dismissTrigger, getSVG} from \"../../module-fn\";\r\nimport Sanitize from \"../../../utils/js/components/sanitize\";\r\nimport {execute, isDisabled, makeRandomString, mergeDeepObject} from \"../../../utils/js/functions\";\r\nimport Selectors from \"../../../utils/js/dom/selectors\";\r\nimport VGToastDrag from \"./vgtoast.drag\";\r\nimport VGToastResize from \"./vgtoast.resize\";\r\n\r\n/**\r\n * @constant {string} NAME - Имя модуля.\r\n */\r\nconst NAME = 'toast';\r\n\r\n/**\r\n * @constant {string} NAME_KEY - Пространство имён для событий.\r\n */\r\nconst NAME_KEY = 'vg.toast';\r\n\r\n/**\r\n * @constant {string} SELECTOR_DATA_TOGGLE - Селектор для активации через data-атрибут.\r\n */\r\nconst SELECTOR_DATA_TOGGLE = '[data-vg-toggle=\"toast\"]';\r\n\r\n/**\r\n * @constant {string} CLASS_NAME_OPEN - Класс, добавляемый к body при открытии любого тоста.\r\n */\r\nconst CLASS_NAME_OPEN = 'vg-toast-open';\r\n\r\n/**\r\n * @constant {string} CLASS_NAME_SHOW - Класс, показывающий, что тост видим.\r\n */\r\nconst CLASS_NAME_SHOW = 'show';\r\n\r\n/**\r\n * @constant {string} CLASS_NAME_SHOWN - Класс, добавляемый после завершения анимации появления.\r\n */\r\nconst CLASS_NAME_SHOWN = 'shown';\r\nconst EFFECT_CLASS_PREFIX = 'vg-toast-effect-';\r\nconst EFFECT_PRESET_MAP = {\r\n\tnone: '',\r\n\tfade: `${EFFECT_CLASS_PREFIX}fade`,\r\n\tzoom: `${EFFECT_CLASS_PREFIX}zoom`,\r\n\tblur: `${EFFECT_CLASS_PREFIX}blur`,\r\n\t'slide-up': `${EFFECT_CLASS_PREFIX}slide-up`,\r\n\t'slide-down': `${EFFECT_CLASS_PREFIX}slide-down`,\r\n};\r\n\r\n// События\r\nconst EVENT_KEY_HIDE = `${NAME_KEY}.hide`;\r\nconst EVENT_KEY_HIDDEN = `${NAME_KEY}.hidden`;\r\nconst EVENT_KEY_SHOW = `${NAME_KEY}.show`;\r\nconst EVENT_KEY_SHOWN = `${NAME_KEY}.shown`;\r\nconst EVENT_KEY_LOADED = `${NAME_KEY}.loaded`;\r\nconst EVENT_KEY_KEYDOWN_DISMISS = `keydown.dismiss.${NAME_KEY}`;\r\nconst EVENT_KEY_HIDE_PREVENTED = `hidePrevented.${NAME_KEY}`;\r\nconst EVENT_KEY_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;\r\nconst EVENT_KEY_POINTERDOWN_INTERACTION = `pointerdown.interaction.${NAME_KEY}`;\r\nconst EVENT_KEY_POINTERUP_INTERACTION = `pointerup.interaction.${NAME_KEY}`;\r\nconst EVENT_KEY_POINTERCANCEL_INTERACTION = `pointercancel.interaction.${NAME_KEY}`;\r\nconst TOAST_ICON_MAP = {\r\n\tsuccess: 'success',\r\n\terror: 'danger',\r\n\twarning: 'warning',\r\n\tinfo: 'info',\r\n};\r\n\r\n/**\r\n * @typedef {Object} ToastParams\r\n * @property {boolean} static - Сохранять ли тост в DOM после скрытия.\r\n * @property {string} placement - Расположение: 'top left', 'bottom center' и т.д.\r\n * @property {boolean} autohide - Автоматически скрывать.\r\n * @property {number} delay - Задержка перед авто-скрытием (мс).\r\n * @property {boolean} enableClickToast - Закрывать по клику на тост.\r\n * @property {boolean} enableButtonClose - Добавить кнопку закрытия.\r\n * @property {boolean} keyboard - Закрывать по Esc.\r\n * @property {string} theme - Тема: 'dark', 'light' и т.д.\r\n * @property {('success'|'error'|'warning'|'info'|null)} type - Тип уведомления для вывода иконки.\r\n * @property {Object} stack - Настройки стека уведомлений.\r\n * @property {boolean} stack.enable - Разрешить стек.\r\n * @property {number} stack.max - Макс. количество тостов одновременно.\r\n * @property {Object} animation - Анимация.\r\n * @property {boolean} animation.enable - Включить анимацию.\r\n * @property {string} animation.in - Анимация входа (Animate.css).\r\n * @property {string} animation.out - Анимация выхода.\r\n * @property {number} animation.delay - Длительность анимации.\r\n * @property {string|string[]} animation.effect - Доп. визуальный эффект (preset или css-класс).\r\n * @property {Object} ajax - Настройки AJAX.\r\n * @property {string} ajax.route - URL для загрузки.\r\n * @property {string} ajax.target - Селектор контейнера.\r\n * @property {string} ajax.method - HTTP-метод.\r\n * @property {boolean} ajax.loader - Показывать лоадер.\r\n * @property {boolean} ajax.once - Загружать один раз.\r\n * @property {boolean} ajax.output - Выводить результат.\r\n */\r\n\r\n/**\r\n * Параметры по умолчанию\r\n * @type {ToastParams}\r\n */\r\nconst defaultParams = {\r\n\tstatic: true,\r\n\tplacement: 'bottom center',\r\n\tautohide: false,\r\n\tdelay: 3000,\r\n\tenableClickToast: true,\r\n\tenableButtonClose: false,\r\n\tkeyboard: true,\r\n\ttheme: 'dark',\r\n\ttype: null,\r\n\tstack: {\r\n\t\tenable: true,\r\n\t\tmax: 5\r\n\t},\r\n\tdrag: {\r\n\t\tenable: false,\r\n\t\tselector: '.vg-toast-wrapper',\r\n\t\tthreshold: 4,\r\n\t\tresizeEdgeSize: 8,\r\n\t\tdebug: false,\r\n\t},\r\n\tresize: {\r\n\t\tenable: false,\r\n\t\tedgeSize: 8,\r\n\t\tminWidth: 220,\r\n\t\tminHeight: 64,\r\n\t\tdebug: false,\r\n\t},\r\n\tanimation: {\r\n\t\tenable: true,\r\n\t\tin: 'animate__backInUp',\r\n\t\tout: 'animate__backOutDown',\r\n\t\tdelay: 300,\r\n\t\teffect: 'none',\r\n\t},\r\n\tajax: {\r\n\t\troute: '',\r\n\t\ttarget: '',\r\n\t\tmethod: 'get',\r\n\t\tloader: false,\r\n\t\tonce: false,\r\n\t\toutput: true,\r\n\t}\r\n};\r\n\r\n/**\r\n * Класс VGToast — модуль уведомлений (тосты)\r\n * Поддерживает стек, анимации, авто-скрытие, AJAX-контент, горячие клавиши.\r\n */\r\nclass VGToast extends BaseModule {\r\n\t/**\r\n\t * Создаёт экземпляр VGToast\r\n\t * @param {Element} element - HTML-элемент тоста.\r\n\t * @param {Partial<ToastParams>} params - Пользовательские параметры.\r\n\t */\r\n\tconstructor(element, params = {}) {\r\n\t\tsuper(element, params);\r\n\r\n\t\t/** @private */\r\n\t\tthis._interactionDefaults = {\r\n\t\t\tdrag: {\r\n\t\t\t\tenable: false,\r\n\t\t\t\tselector: '.vg-toast-wrapper',\r\n\t\t\t\tthreshold: 4,\r\n\t\t\t\tresizeEdgeSize: 8,\r\n\t\t\t\tdebug: false,\r\n\t\t\t},\r\n\t\t\tresize: {\r\n\t\t\t\tenable: false,\r\n\t\t\t\tedgeSize: 8,\r\n\t\t\t\tminWidth: 220,\r\n\t\t\t\tminHeight: 64,\r\n\t\t\t\tdebug: false,\r\n\t\t\t},\r\n\t\t};\r\n\t\tthis._params = this._getParams(element, mergeDeepObject(defaultParams, params));\r\n\t\tthis._dragHandler = new VGToastDrag(this._element, this._element);\r\n\t\tthis._resizeHandler = new VGToastResize(this._element, this._element);\r\n\t\tthis._interactionConfig = this._resolveInteractionConfig();\r\n\t\tthis._dragHandler.setOptions(this._interactionConfig.drag);\r\n\t\tthis._resizeHandler.setOptions(this._interactionConfig.resize);\r\n\t\tthis._animation(this._element, VGToast.NAME_KEY, this._params.animation);\r\n\t\tthis._applyAnimationEffects();\r\n\t\tthis._dismissElement();\r\n\t\tthis._addEventListeners();\r\n\r\n\t\t/** @private */\r\n\t\tthis._timeout = null;\r\n\t\tthis._hideTimeout = null;\r\n\t\tthis._isHiding = false;\r\n\t}\r\n\r\n\t/**\r\n\t * Имя модуля\r\n\t * @returns {string}\r\n\t */\r\n\tstatic get NAME() {\r\n\t\treturn NAME;\r\n\t}\r\n\r\n\t/**\r\n\t * Пространство имён событий\r\n\t * @returns {string}\r\n\t */\r\n\tstatic get NAME_KEY() {\r\n\t\treturn NAME_KEY;\r\n\t}\r\n\r\n\t/**\r\n\t * Глобальный метод для быстрого создания тоста\r\n\t * @param {string|Array<string>} text - Текст или [заголовок, тело].\r\n\t * @param {Partial<ToastParams>} [params] - Параметры.\r\n\t * @param {Function} [callback] - Вызывается после создания.\r\n\t * @returns {VGToast}\r\n\t */\r\n\tstatic run(text, params = {}, callback) {\r\n\t\treturn VGToast.build(text, params, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Создаёт и показывает новый тост\r\n\t * @param {string|Array<string>} text - Текст уведомления.\r\n\t * @param {Partial<ToastParams>} [params] - Параметры.\r\n\t * @param {Function} [callback] - Вызывается после появления.\r\n\t * @returns {VGToast}\r\n\t */\r\n\tstatic build(text, params, callback) {\r\n\t\tconst rawParams = params && typeof params === 'object' ? params : {};\r\n\t\tconst hasAutohideParam = Object.prototype.hasOwnProperty.call(rawParams, 'autohide');\r\n\t\tparams = mergeDeepObject(defaultParams, { static: false, autohide: true }, rawParams);\r\n\t\tif (params.static && !hasAutohideParam) {\r\n\t\t\tparams.autohide = false;\r\n\t\t}\r\n\r\n\t\tconst id = 'vg-toast-' + makeRandomString();\r\n\t\tconst target = document.createElement('div');\r\n\t\ttarget.classList.add('vg-toast');\r\n\t\ttarget.id = id;\r\n\r\n\t\t// Тема\r\n\t\tif (params.theme) {\r\n\t\t\ttarget.classList.add(`vg-toast-${params.theme}`);\r\n\t\t}\r\n\r\n\t\t// Позиция\r\n\t\tif (params.placement) {\r\n\t\t\tparams.placement.split(' ').forEach(cls => target.classList.add(cls));\r\n\t\t}\r\n\r\n\t\tconst wrapper = document.createElement('div');\r\n\t\twrapper.classList.add('vg-toast-wrapper');\r\n\r\n\t\t// Иконка (если задан тип)\r\n\t\tif (params.type) {\r\n\t\t\tconst iconName = TOAST_ICON_MAP[params.type];\r\n\t\t\tconst iconSvg = iconName ? getSVG(iconName) : '';\r\n\r\n\t\t\tif (iconSvg) {\r\n\t\t\t\tconst icon = document.createElement('div');\r\n\t\t\t\ticon.classList.add('vg-toast-icon');\r\n\t\t\t\tconst safeIconSvg = Sanitize.toSafeHtmlString(iconSvg);\r\n\t\t\t\tconst fragment = document.createRange().createContextualFragment(safeIconSvg);\r\n\t\t\t\tconst svgElement = fragment.firstElementChild;\r\n\r\n\t\t\t\tif (svgElement) {\r\n\t\t\t\t\ticon.append(svgElement);\r\n\t\t\t\t}\r\n\t\t\t\twrapper.append(icon);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst content = document.createElement('div');\r\n\t\tcontent.classList.add('vg-toast-content');\r\n\r\n\t\tconst body = document.createElement('div');\r\n\t\tbody.classList.add('vg-toast-body');\r\n\r\n\t\tif (typeof text === 'string') {\r\n\t\t\tbody.innerHTML = text;\r\n\t\t\tcontent.append(body);\r\n\t\t} else if (Array.isArray(text)) {\r\n\t\t\tif (text.length > 1) {\r\n\t\t\t\tconst header = document.createElement('div');\r\n\t\t\t\theader.classList.add('vg-toast-header');\r\n\t\t\t\theader.innerHTML = text[0];\r\n\t\t\t\tcontent.append(header);\r\n\t\t\t}\r\n\t\t\tbody.innerHTML = text[1];\r\n\t\t\tcontent.append(body);\r\n\t\t}\r\n\r\n\t\twrapper.append(content);\r\n\r\n\t\t// Кнопка закрытия\r\n\t\tif (params.enableButtonClose) {\r\n\t\t\ttarget.classList.add('vg-toast-has-button');\r\n\t\t\tconst button = document.createElement('div');\r\n\t\t\tbutton.classList.add('vg-toast-button');\r\n\t\t\tbutton.innerHTML = '<button class=\"vg-btn-close\" data-vg-dismiss=\"toast\"></button>';\r\n\t\t\twrapper.append(button);\r\n\t\t}\r\n\r\n\t\ttarget.append(wrapper);\r\n\t\tdocument.body.append(target);\r\n\r\n\t\tconst instance = VGToast.getOrCreateInstance(target, params);\r\n\t\tif (params.animation) {\r\n\t\t\tinstance._animation(target, VGToast.NAME_KEY, params.animation);\r\n\t\t\tinstance._applyAnimationEffects();\r\n\t\t}\r\n\r\n\t\texecute(callback, [instance]);\r\n\t\tinstance.show();\r\n\r\n\t\treturn instance;\r\n\t}\r\n\r\n\t/**\r\n\t * Переключает состояние (показать/скрыть)\r\n\t * @param {Element} [relatedTarget] - Элемент, вызвавший тост.\r\n\t * @returns {void}\r\n\t */\r\n\ttoggle(relatedTarget) {\r\n\t\treturn this._isShown() ? this.hide() : this.show(relatedTarget);\r\n\t}\r\n\r\n\t/**\r\n\t * Показывает тост\r\n\t * @param {Element} [relatedTarget] - Элемент, инициировавший показ.\r\n\t * @returns {void}\r\n\t */\r\n\tshow(relatedTarget) {\r\n\t\tif (isDisabled(this._element)) return;\r\n\r\n\t\tconst element = this._element;\r\n\t\tthis._clearTimeout();\r\n\t\tthis._clearHideTimeout();\r\n\t\tthis._isHiding = false;\r\n\t\tthis._disableInteractionHandlers();\r\n\r\n\t\tthis._params = this._getParams(relatedTarget || {}, this._params);\r\n\t\tthis._route((status, data) => {\r\n\t\t\tif (this._element !== element) return;\r\n\t\t\tEventHandler.trigger(element, EVENT_KEY_LOADED, { stats: status, data });\r\n\t\t});\r\n\r\n\t\tconst showEvent = EventHandler.trigger(element, EVENT_KEY_SHOW, { relatedTarget });\r\n\t\tif (showEvent.defaultPrevented) return;\r\n\r\n\t\telement.classList.remove(CLASS_NAME_SHOWN);\r\n\t\telement.classList.add(CLASS_NAME_SHOW);\r\n\t\tdocument.body.classList.add(CLASS_NAME_OPEN);\r\n\r\n\t\tthis._setPlacement();\r\n\r\n\t\tconst completeCallBack = () => {\r\n\t\t\tif (this._element !== element || this._isHiding) return;\r\n\r\n\t\t\telement.classList.add(CLASS_NAME_SHOWN);\r\n\t\t\tthis._toggleInteractionHandlers();\r\n\t\t\tthis._syncInteractiveBounds();\r\n\t\t\tthis._scheduleHide();\r\n\t\t\tEventHandler.trigger(element, EVENT_KEY_SHOWN, { relatedTarget });\r\n\t\t};\r\n\r\n\t\tthis._queueCallback(completeCallBack, element, true, this._params.animation.delay);\r\n\t}\r\n\r\n\t/**\r\n\t * Скрывает тост\r\n\t * @returns {void}\r\n\t */\r\n\thide() {\r\n\t\tif (isDisabled(this._element) || this._isHiding) return;\r\n\r\n\t\tconst element = this._element;\r\n\t\tthis._clearTimeout();\r\n\t\tthis._clearHideTimeout();\r\n\r\n\t\tconst hideEvent = EventHandler.trigger(element, EVENT_KEY_HIDE);\r\n\t\tif (hideEvent.defaultPrevented) return;\r\n\r\n\t\tthis._isHiding = true;\r\n\t\telement.classList.remove(CLASS_NAME_SHOWN);\r\n\t\tthis._disableInteractionHandlers();\r\n\r\n\t\tthis._hideTimeout = setTimeout(() => {\r\n\t\t\tthis._hideTimeout = null;\r\n\t\t\tif (this._element !== element) return;\r\n\r\n\t\t\telement.classList.remove(CLASS_NAME_SHOW);\r\n\t\t\tif (this._params.stack.enable) {\r\n\t\t\t\tthis._setPlacement();\r\n\t\t\t}\r\n\r\n\t\t\tconst completeCallback = () => {\r\n\t\t\t\tif (this._element !== element) return;\r\n\r\n\t\t\t\tif (!Selectors.find('.vg-toast.show')) {\r\n\t\t\t\t\tdocument.body.classList.remove(CLASS_NAME_OPEN);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst shouldDispose = !this._params.static;\r\n\t\t\t\tthis._isHiding = false;\r\n\t\t\t\tEventHandler.trigger(element, EVENT_KEY_HIDDEN);\r\n\r\n\t\t\t\tif (this._element !== element) return;\r\n\t\t\t\tif (shouldDispose) {\r\n\t\t\t\t\tthis.dispose();\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tthis._queueCallback(completeCallback, element, false, this._params.animation.delay);\r\n\t\t}, this._params.animation.delay);\r\n\t}\r\n\r\n\t/**\r\n\t * Удаляет тост из DOM и снимает обработчики\r\n\t * @override\r\n\t */\r\n\tdispose() {\r\n\t\tif (!this._element) return;\r\n\r\n\t\tthis._clearTimeout();\r\n\t\tthis._clearHideTimeout();\r\n\t\tthis._disableInteractionHandlers();\r\n\t\tif (!this._params.static) {\r\n\t\t\tthis._element.remove();\r\n\t\t}\r\n\t\tsuper.dispose();\r\n\t}\r\n\r\n\t/**\r\n\t * Устанавливает таймер на скрытие\r\n\t * @private\r\n\t */\r\n\t_scheduleHide() {\r\n\t\tthis._clearTimeout();\r\n\t\tif (!this._params.autohide) return;\r\n\r\n\t\tthis._timeout = setTimeout(() => this.hide(), this._params.delay);\r\n\t}\r\n\r\n\t/**\r\n\t * Проверяет, показан ли тост\r\n\t * @private\r\n\t * @returns {boolean}\r\n\t */\r\n\t_isShown() {\r\n\t\treturn !!this._element && this._element.classList.contains(CLASS_NAME_SHOW);\r\n\t}\r\n\r\n\t/**\r\n\t * Возвращает список активных тостов с вертикальными смещениями\r\n\t * Учитывает стек и максимальное количество\r\n\t * @private\r\n\t * @returns {Array<{el: Element, top: number}>}\r\n\t */\r\n\t_enableStack() {\r\n\t\tconst placement = this._params.placement;\r\n\t\tconst isTop = placement.includes('top');\r\n\t\tconst isBottom = !isTop; // по умолчанию снизу\r\n\r\n\t\t// Фильтруем тосты с таким же направлением (top или bottom)\r\n\t\tconst stackClass = isTop ? 'top' : 'bottom';\r\n\t\tconst elmsShown = Selectors.findAll(`.vg-toast.show.${stackClass}`)\r\n\t\t\t.filter(el => {\r\n\t\t\t\tconst instance = VGToast.getInstance(el);\r\n\t\t\t\treturn instance?._params.stack.enable;\r\n\t\t\t});\r\n\r\n\t\tif (!this._params.stack.enable) {\r\n\t\t\t// Скрываем другие тосты, если стек выключен\r\n\t\t\telmsShown\r\n\t\t\t\t.filter(el => el !== this._element)\r\n\t\t\t\t.forEach(el => VGToast.getInstance(el).hide());\r\n\t\t\treturn [{ el: this._element, top: 0 }];\r\n\t\t}\r\n\r\n\t\t// Ограничиваем по max\r\n\t\tif (elmsShown.length >= this._params.stack.max) {\r\n\t\t\tconst excess = elmsShown.slice(0, elmsShown.length - this._params.stack.max + 1);\r\n\t\t\texcess.forEach(el => VGToast.getInstance(el).hide());\r\n\t\t}\r\n\r\n\t\t// Вычисляем смещение (по высоте)\r\n\t\tconst prevEls = elmsShown.filter(el => el !== this._element);\r\n\t\tconst offset = prevEls.reduce((sum, el) => sum + el.clientHeight, 0);\r\n\r\n\t\treturn elmsShown.includes(this._element)\r\n\t\t\t? elmsShown.map((el, index) => {\r\n\t\t\t\tconst heightSum = elmsShown.slice(0, index).reduce((sum, e) => sum + e.clientHeight, 0);\r\n\t\t\t\treturn { el, top: heightSum };\r\n\t\t\t})\r\n\t\t\t: [{ el: this._element, top: offset }];\r\n\t}\r\n\r\n\t/**\r\n\t * Устанавливает позицию тостов с учётом стека\r\n\t * @private\r\n\t */\r\n\t_setPlacement() {\r\n\t\tconst stackItems = this._enableStack();\r\n\t\tconst isTop = this._params.placement.includes('top');\r\n\r\n\t\tconst stackClass = isTop ? 'top' : 'bottom';\r\n\t\tconst visibleStack = Selectors.findAll(`.vg-toast.show.${stackClass}`)\r\n\t\t\t.filter(el => {\r\n\t\t\t\tconst instance = VGToast.getInstance(el);\r\n\t\t\t\treturn instance?._params.stack.enable;\r\n\t\t\t});\r\n\t\tconst elms = visibleStack.length ? visibleStack : stackItems.map(item => item.el);\r\n\t\tlet offset = 0;\r\n\r\n\t\telms.forEach((el) => {\r\n\t\t\tconst instance = VGToast.getInstance(el);\r\n\t\t\tconst placement = instance?._params.placement || this._params.placement;\r\n\t\t\tconst isCenter = placement.includes('center');\r\n\t\t\tconst isLeft = placement.includes('left');\r\n\t\t\tconst isRight = placement.includes('right');\r\n\t\t\tconst style = el.style;\r\n\t\t\tstyle.left = '';\r\n\t\t\tstyle.right = '';\r\n\t\t\tstyle.top = '';\r\n\t\t\tstyle.bottom = '';\r\n\t\t\tstyle.transform = '';\r\n\t\t\tstyle.translate = ''; // <-- важно: сбрасываем translate отдельно\r\n\r\n\t\t\tif (isCenter) {\r\n\t\t\t\tstyle.left = '50%';\r\n\t\t\t\tstyle.translate = '-50% 0'; // <-- вместо transform: translateX(-50%)\r\n\t\t\t} else if (isLeft) {\r\n\t\t\t\tstyle.left = '0';\r\n\t\t\t} else if (isRight) {\r\n\t\t\t\tstyle.right = '0';\r\n\t\t\t} else {\r\n\t\t\t\t// по умолчанию: центрирование\r\n\t\t\t\tstyle.left = '50%';\r\n\t\t\t\tstyle.translate = '-50% 0';\r\n\t\t\t}\r\n\r\n\t\t\tif (isTop) {\r\n\t\t\t\tstyle.top = offset + 'px';\r\n\t\t\t} else {\r\n\t\t\t\tstyle.bottom = offset + 'px';\r\n\t\t\t}\r\n\r\n\t\t\toffset += el.offsetHeight;\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Очищает таймер\r\n\t * @private\r\n\t */\r\n\t_toggleInteractionHandlers() {\r\n\t\tthis._interactionConfig = this._resolveInteractionConfig();\r\n\t\tthis._dragHandler.setOptions(this._interactionConfig.drag);\r\n\t\tthis._resizeHandler.setOptions(this._interactionConfig.resize);\r\n\r\n\t\tif (this._interactionConfig.drag.enable) {\r\n\t\t\tthis._dragHandler.enable();\r\n\t\t} else {\r\n\t\t\tthis._dragHandler.disable();\r\n\t\t}\r\n\r\n\t\tif (this._interactionConfig.resize.enable) {\r\n\t\t\tthis._resizeHandler.enable();\r\n\t\t} else {\r\n\t\t\tthis._resizeHandler.disable();\r\n\t\t}\r\n\t}\r\n\r\n\t_disableInteractionHandlers() {\r\n\t\tthis._dragHandler.disable();\r\n\t\tthis._resizeHandler.disable();\r\n\t}\r\n\r\n\t_syncInteractiveBounds() {\r\n\t\tif (this._interactionConfig.resize.enable) {\r\n\t\t\tthis._resizeHandler.syncToViewport();\r\n\t\t}\r\n\r\n\t\tif (this._interactionConfig.drag.enable) {\r\n\t\t\tthis._dragHandler.syncPosition();\r\n\t\t}\r\n\t}\r\n\r\n\t_resolveInteractionConfig() {\r\n\t\treturn {\r\n\t\t\tdrag: this._normalizeInteractionParams(this._params.drag, this._interactionDefaults.drag),\r\n\t\t\tresize: this._normalizeInteractionParams(this._params.resize, this._interactionDefaults.resize),\r\n\t\t};\r\n\t}\r\n\r\n\t_normalizeInteractionParams(paramsValue, defaults) {\r\n\t\tif (typeof paramsValue === 'boolean') {\r\n\t\t\treturn {...defaults, enable: paramsValue};\r\n\t\t}\r\n\r\n\t\tif (paramsValue && typeof paramsValue === 'object') {\r\n\t\t\tconst hasEnable = Object.prototype.hasOwnProperty.call(paramsValue, 'enable');\r\n\t\t\treturn {\r\n\t\t\t\t...defaults,\r\n\t\t\t\t...paramsValue,\r\n\t\t\t\tenable: hasEnable ? Boolean(paramsValue.enable) : true,\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn {...defaults};\r\n\t}\r\n\r\n\t_applyAnimationEffects() {\r\n\t\tconst classList = this._element.classList;\r\n\t\tconst effectClasses = [...classList].filter(className => className.startsWith(EFFECT_CLASS_PREFIX));\r\n\t\teffectClasses.forEach(className => classList.remove(className));\r\n\r\n\t\tconst nextClasses = this._resolveAnimationEffectClasses(this._params.animation?.effect);\r\n\t\tnextClasses.forEach(className => classList.add(className));\r\n\t}\r\n\r\n\t_resolveAnimationEffectClasses(effectValue) {\r\n\t\tconst values = Array.isArray(effectValue) ? effectValue : [effectValue];\r\n\t\tconst normalized = values\r\n\t\t\t.filter(Boolean)\r\n\t\t\t.map(effect => this._resolveAnimationEffectClass(effect))\r\n\t\t\t.filter(Boolean);\r\n\r\n\t\treturn Array.from(new Set(normalized));\r\n\t}\r\n\r\n\t_resolveAnimationEffectClass(effectValue) {\r\n\t\tif (typeof effectValue !== 'string') return '';\r\n\t\tconst key = effectValue.trim().toLowerCase();\r\n\t\tif (!key) return '';\r\n\r\n\t\tif (Object.prototype.hasOwnProperty.call(EFFECT_PRESET_MAP, key)) {\r\n\t\t\treturn EFFECT_PRESET_MAP[key];\r\n\t\t}\r\n\r\n\t\treturn effectValue.trim();\r\n\t}\r\n\r\n\t_clearTimeout() {\r\n\t\tif (this._timeout) {\r\n\t\t\tclearTimeout(this._timeout);\r\n\t\t\tthis._timeout = null;\r\n\t\t}\r\n\t}\r\n\r\n\t_clearHideTimeout() {\r\n\t\tif (this._hideTimeout) {\r\n\t\t\tclearTimeout(this._hideTimeout);\r\n\t\t\tthis._hideTimeout = null;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Назначает обработчики событий\r\n\t * @private\r\n\t */\r\n\t_addEventListeners() {\r\n\t\t// Закрытие по Esc\r\n\t\tif (this._params.keyboard) {\r\n\t\t\tEventHandler.on(document, EVENT_KEY_KEYDOWN_DISMISS, event => {\r\n\t\t\t\tif (event.key === 'Escape' && this._isShown()) {\r\n\t\t\t\t\tthis.hide();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Закрытие по клику на тост\r\n\t\tif (this._params.enableClickToast) {\r\n\t\t\tthis._element.classList.add('vg-toast-pointer');\r\n\t\t\tEventHandler.on(document, EVENT_KEY_CLICK_DATA_API, `#${this._element.id}`, () => {\r\n\t\t\t\tthis.hide();\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tEventHandler.on(this._element, EVENT_KEY_POINTERDOWN_INTERACTION, () => {\r\n\t\t\tthis._clearTimeout();\r\n\t\t});\r\n\r\n\t\tconst resumeHide = () => {\r\n\t\t\tif (this._isShown()) {\r\n\t\t\t\tthis._scheduleHide();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tEventHandler.on(this._element, EVENT_KEY_POINTERUP_INTERACTION, resumeHide);\r\n\t\tEventHandler.on(this._element, EVENT_KEY_POINTERCANCEL_INTERACTION, resumeHide);\r\n\t}\r\n}\r\n\r\n// Автоматическое закрытие по data-vg-dismiss\r\ndismissTrigger(VGToast);\r\n\r\n/**\r\n * Реализация Data API\r\n */\r\nEventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\r\n\tconst target = Selectors.getElementFromSelector(this);\r\n\tif (['A', 'AREA'].includes(this.tagName)) {\r\n\t\tevent.preventDefault();\r\n\t}\r\n\tif (isDisabled(this)) return;\r\n\r\n\tthis.setAttribute('aria-expanded', 'true');\r\n\tEventHandler.one(target, EVENT_KEY_HIDDEN, () => {\r\n\t\tthis.setAttribute('aria-expanded', 'false');\r\n\t});\r\n\r\n\tconst data = VGToast.getOrCreateInstance(target);\r\n\tdata.toggle(this);\r\n});\r\n\r\nexport default VGToast;\r\n\r\n\r\n","import { isObject, noop, normalizeData } from \"../functions\";\n\r\nclass Ajax {\n\tstatic _toRouteQueryParamValue(value) {\n\t\tif (!Array.isArray(value)) {\n\t\t\treturn value;\n\t\t}\n\n\t\treturn value\n\t\t\t.map((item) => String(item || '').trim())\n\t\t\t.filter((item) => item !== '')\n\t\t\t.join(',');\n\t}\n\n\tstatic buildRouteUrl(route, options = {}) {\n\t\tconst target = String(route || '').trim();\n\t\tif (!target) {\n\t\t\tthrow new Error('Request endpoint is empty');\n\t\t}\n\n\t\tconst baseParams = isObject(options.baseParams) ? options.baseParams : {};\n\t\tconst params = isObject(options.params) ? options.params : {};\n\t\tconst url = new URL(target, window.location.origin);\n\t\tconst merged = { ...baseParams, ...params };\n\n\t\tObject.keys(merged).forEach((key) => {\n\t\t\tconst value = this._toRouteQueryParamValue(merged[key]);\n\t\t\tif (value === undefined || value === null || value === '') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\turl.searchParams.set(key, String(value));\n\t\t});\n\n\t\treturn url;\n\t}\n\n\tstatic async requestRoute(options = {}) {\n\t\tconst method = String(options.method || 'GET').toUpperCase().trim() || 'GET';\n\t\tconst headers = isObject(options.headers) ? { ...options.headers } : {};\n\t\tconst credentials = String(options.credentials || 'same-origin').trim() || 'same-origin';\n\t\tconst baseParams = isObject(options.baseParams) ? options.baseParams : {};\n\t\tconst params = isObject(options.params) ? options.params : {};\n\t\tconst hasBody = options.body !== undefined && options.body !== null;\n\t\tconst isGetLike = method === 'GET' || method === 'HEAD';\n\t\tconst route = String(options.route || options.endpoint || '').trim();\n\t\tconst url = this.buildRouteUrl(route, {\n\t\t\tbaseParams,\n\t\t\tparams: isGetLike ? params : {},\n\t\t});\n\t\tconst requestOptions = {\n\t\t\tmethod,\n\t\t\tcredentials,\n\t\t\theaders,\n\t\t\tsignal: options.signal || undefined,\n\t\t};\n\n\t\tif (!isGetLike && hasBody) {\n\t\t\tconst body = options.body;\n\t\t\tconst isFormData = typeof FormData !== 'undefined' && body instanceof FormData;\n\n\t\t\tif (isFormData) {\n\t\t\t\tdelete requestOptions.headers['Content-Type'];\n\t\t\t\trequestOptions.body = body;\n\t\t\t} else if (typeof body === 'string') {\n\t\t\t\tif (!requestOptions.headers['Content-Type']) {\n\t\t\t\t\trequestOptions.headers['Content-Type'] = 'application/json';\n\t\t\t\t}\n\t\t\t\trequestOptions.body = body;\n\t\t\t} else {\n\t\t\t\tif (!requestOptions.headers['Content-Type']) {\n\t\t\t\t\trequestOptions.headers['Content-Type'] = 'application/json';\n\t\t\t\t}\n\t\t\t\trequestOptions.body = JSON.stringify(body);\n\t\t\t}\n\t\t}\n\n\t\tconst response = await fetch(url.toString(), requestOptions);\n\t\tconst contentType = String(response.headers.get('content-type') || '').toLowerCase();\n\t\tconst expectsJson = options.responseType === 'json'\n\t\t\t|| (options.responseType !== 'text' && contentType.includes('application/json'));\n\t\tconst payload = await (async () => {\n\t\t\tif (expectsJson) {\n\t\t\t\ttry {\n\t\t\t\t\treturn await response.json();\n\t\t\t\t} catch (error) {\n\t\t\t\t\treturn await response.text();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn response.text();\n\t\t})();\n\n\t\tif (!response.ok) {\n\t\t\tconst apiError = payload && typeof payload === 'object' && payload.error && typeof payload.error === 'object'\n\t\t\t\t? payload.error\n\t\t\t\t: {};\n\t\t\tconst fallbackMessage = typeof payload === 'string' && payload.trim()\n\t\t\t\t? payload\n\t\t\t\t: response.statusText;\n\t\t\tconst message = String(apiError.message || fallbackMessage || 'Request failed');\n\t\t\tconst error = new Error(message);\n\t\t\terror.status = response.status;\n\t\t\terror.code = apiError.code || 'REQUEST_FAILED';\n\t\t\terror.details = Array.isArray(apiError.details) ? apiError.details : [];\n\t\t\terror.requestId = apiError.request_id || response.headers.get('X-Request-Id') || '';\n\t\t\terror.response = payload;\n\t\t\tthrow error;\n\t\t}\n\n\t\treturn payload;\n\t}\n\n\t/**\n\t * Конфигурация запроса\r\n\t * @param {Object} options\r\n\t * @param {string} options.baseUrl - Базовый URL API (опционально)\r\n\t * @param {Object} options.headers - Доп. заголовки (например, авторизация)\r\n\t * @param {boolean} options.withCredentials - Отправлять ли куки (для авторизованных запросов)\r\n\t * @param {string} options._token - Токен (авто-чтение из meta)\r\n\t */\r\n\tconstructor(options = {}) {\r\n\t\tthis.baseUrl = options.baseUrl || \"\";\r\n\t\tthis.defaultHeaders = {\r\n\t\t\t\"X-Requested-With\": \"XMLHttpRequest\",\r\n\t\t\t...options.headers,\r\n\t\t};\r\n\t\tthis.withCredentials = options.withCredentials || false;\r\n\t\tthis.csrfToken = options._token || this._getCsrfToken();\r\n\t}\r\n\r\n\t/**\r\n\t * Получение CSRF-токена из тега meta\r\n\t * @returns {string}\r\n\t */\r\n\t_getCsrfToken() {\r\n\t\tconst meta = document.querySelector('meta[name=\"csrf-token\"]');\r\n\t\tif (meta) return meta.getAttribute(\"content\");\r\n\t\tconsole.warn('CSRF-токен не найден в <meta name=\"csrf-token\">');\r\n\t\treturn \"\";\r\n\t}\r\n\r\n\t/**\r\n\t * Универсальный метод отправки запроса\r\n\t * @param {string} url\r\n\t * @param {Object} options\r\n\t * @param {'GET'|'POST'|'PUT'|'DELETE'|'PATCH'} options.method\r\n\t * @param {Object|FormData} options.body\r\n\t * @param {Object} options.headers\r\n\t * @param {AbortSignal} [options.signal] - Для отмены запроса\r\n\t * @param {Function} [options.onProgress] - Только для POST/PUT с FormData\r\n\t * @param {Function} options.onSuccess\r\n\t * @param {Function} options.onError\r\n\t * @param {Function} [options.onUploadStart]\r\n\t * @param {Function} [options.onUploadEnd]\r\n\t */\r\n\trequest(url, {\r\n\t\tmethod = \"GET\",\r\n\t\tbody = null,\r\n\t\theaders = {},\r\n\t\tsignal = null,\r\n\t\tonProgress = null,\r\n\t\tonSuccess = noop,\r\n\t\tonError = noop,\r\n\t\tonUploadStart = noop,\r\n\t\tonUploadEnd = noop,\r\n\t} = {}) {\r\n\t\tconst fullUrl = this.baseUrl + url;\r\n\t\tconst isFormData = body instanceof FormData;\r\n\t\tconst requestHeaders = { ...this.defaultHeaders, ...headers };\r\n\t\tconst isGet = method.toUpperCase() === \"GET\";\r\n\r\n\t\t// Удаление тела для GET\r\n\t\tif (isGet) body = null;\r\n\r\n\t\t// Установка CSRF токена: в body, если не FormData\r\n\t\tif (!isGet && !isFormData && this.csrfToken) {\r\n\t\t\tif (!body) body = {};\r\n\t\t\tif (typeof body === \"object\" && !Array.isArray(body)) {\r\n\t\t\t\tbody._token = this.csrfToken;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Content-Type только для JSON\r\n\t\tif (!isFormData && !(\"Content-Type\" in headers)) {\r\n\t\t\trequestHeaders[\"Content-Type\"] = \"application/json\";\r\n\t\t}\r\n\r\n\t\t// Если нужно отслеживать прогресс или FormData — используем XHR\r\n\t\tif (isFormData || onProgress) {\r\n\t\t\treturn this._makeXHR({\r\n\t\t\t\tmethod,\r\n\t\t\t\turl: fullUrl,\r\n\t\t\t\tbody,\r\n\t\t\t\theaders: requestHeaders,\r\n\t\t\t\tsignal,\r\n\t\t\t\tonProgress,\r\n\t\t\t\tonSuccess,\r\n\t\t\t\tonError,\r\n\t\t\t\tonUploadStart,\r\n\t\t\t\tonUploadEnd,\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\treturn this._makeFetch({\r\n\t\t\t\turl: fullUrl,\r\n\t\t\t\tmethod,\r\n\t\t\t\tbody: isGet ? undefined : this._serializeBody(body),\r\n\t\t\t\theaders: requestHeaders,\r\n\t\t\t\tsignal,\r\n\t\t\t\twithCredentials: this.withCredentials,\r\n\t\t\t\tonSuccess,\r\n\t\t\t\tonError,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * fetch-реализация (для JSON)\r\n\t */\r\n\t_makeFetch({\r\n\t\t url,\r\n\t\t method,\r\n\t\t body,\r\n\t\t headers,\r\n\t\t signal,\r\n\t\t withCredentials,\r\n\t\t onSuccess,\r\n\t\t onError,\r\n\t }) {\r\n\t\tconst config = {\r\n\t\t\tmethod,\r\n\t\t\theaders,\r\n\t\t\tsignal,\r\n\t\t\tcredentials: withCredentials ? 'include' : 'same-origin',\n\t\t\t...(body !== undefined && { body }),\r\n\t\t};\r\n\r\n\t\tfetch(url, config)\r\n\t\t\t.then((response) => {\r\n\t\t\t\tconst contentType = response.headers.get(\"content-type\");\r\n\t\t\t\tconst isJson = contentType && contentType.includes(\"application/json\");\r\n\r\n\t\t\t\tif (!response.ok) {\r\n\t\t\t\t\treturn Promise.reject(\r\n\t\t\t\t\t\tnormalizeData({\r\n\t\t\t\t\t\t\tcode: response.status,\r\n\t\t\t\t\t\t\tresponse: isJson\r\n\t\t\t\t\t\t\t\t? response.json().catch(() => response.text())\r\n\t\t\t\t\t\t\t\t: response.text(),\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet data = { code: response.status };\r\n\t\t\t\tif (isJson) {\r\n\t\t\t\t\tdata.response = response.json();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdata.response = response.text();\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn data;\r\n\t\t\t})\r\n\t\t\t.then((data) => {\r\n\t\t\t\tif (data && data.response instanceof Promise) {\r\n\t\t\t\t\tdata.response.then(\r\n\t\t\t\t\t\t(resolved) => onSuccess({ ...data, response: resolved }),\r\n\t\t\t\t\t\t() => {}\r\n\t\t\t\t\t);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tonSuccess(data);\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\t.catch((error) => {\r\n\t\t\t\tif (error.name === \"AbortError\") return; // отмена — не ошибка\r\n\r\n\t\t\t\tif (error && error.response instanceof Promise) {\r\n\t\t\t\t\terror.response.then((errData) => {\r\n\t\t\t\t\t\tonError({ ...error, response: errData });\r\n\t\t\t\t\t}, () => {\r\n\t\t\t\t\t\tonError({ ...error, response: \"Request failed\" });\r\n\t\t\t\t\t});\r\n\t\t\t\t} else {\r\n\t\t\t\t\tonError(error);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * XHR-реализация (с прогрессом и AbortController)\r\n\t */\r\n\t_makeXHR({\r\n\t\t method,\r\n\t\t url,\r\n\t\t body,\r\n\t\t headers,\r\n\t\t signal,\r\n\t\t onProgress,\r\n\t\t onSuccess,\r\n\t\t onError,\r\n\t\t onUploadStart,\r\n\t\t onUploadEnd,\r\n\t }) {\r\n\t\tconst xhr = new XMLHttpRequest();\r\n\r\n\t\txhr.open(method, url, true);\r\n\t\txhr.withCredentials = this.withCredentials;\r\n\r\n\t\t// Установка заголовков\r\n\t\tObject.keys(headers).forEach((key) => {\r\n\t\t\tif (key.toLowerCase() !== \"content-type\" || !(body instanceof FormData)) {\r\n\t\t\t\txhr.setRequestHeader(key, headers[key]);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// Прогресс\r\n\t\tif (onProgress) {\r\n\t\t\txhr.upload.addEventListener(\"progress\", (e) => {\r\n\t\t\t\tif (e.lengthComputable) {\r\n\t\t\t\t\tonProgress(Math.round((e.loaded / e.total) * 100), e);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// События\r\n\t\txhr.onload = () => {\r\n\t\t\tif (xhr.status >= 200 && xhr.status < 300) {\r\n\t\t\t\tconst data = {\r\n\t\t\t\t\tcode: xhr.status,\r\n\t\t\t\t\tresponse: normalizeData(xhr.responseText),\r\n\t\t\t\t};\r\n\t\t\t\tonSuccess(data);\r\n\t\t\t} else {\r\n\t\t\t\tconst error = normalizeData({\r\n\t\t\t\t\tcode: xhr.status,\r\n\t\t\t\t\tresponse: xhr.responseText || `HTTP ${xhr.status}`,\r\n\t\t\t\t});\r\n\t\t\t\tonError(error);\r\n\t\t\t}\r\n\t\t\tonUploadEnd();\r\n\t\t};\r\n\r\n\t\txhr.onerror = () => {\r\n\t\t\tonError(normalizeData({ code: 0, response: \"Network Error\" }));\r\n\t\t\tonUploadEnd();\r\n\t\t};\r\n\r\n\t\txhr.ontimeout = () => {\r\n\t\t\tonError(normalizeData({ code: 0, response: \"Request Timeout\" }));\r\n\t\t\tonUploadEnd();\r\n\t\t};\r\n\r\n\t\t// Привязка AbortController\r\n\t\tif (signal) {\r\n\t\t\tsignal.addEventListener(\"abort\", () => {\r\n\t\t\t\txhr.abort();\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tonUploadStart();\r\n\t\txhr.send(body);\r\n\r\n\t\treturn xhr; // для отмены снаружи\r\n\t}\r\n\r\n\t// === Сокращённые методы ===\r\n\r\n\tget(url, options = {}) {\r\n\t\treturn this.request(url, { method: \"GET\", ...options });\r\n\t}\r\n\r\n\tpost(url, body, options = {}) {\r\n\t\treturn this.request(url, { method: \"POST\", body, ...options });\r\n\t}\r\n\r\n\tput(url, body, options = {}) {\r\n\t\treturn this.request(url, { method: \"PUT\", body, ...options });\r\n\t}\r\n\r\n\tdelete(url, options = {}) {\r\n\t\treturn this.request(url, { method: \"DELETE\", ...options });\r\n\t}\r\n\r\n\tpatch(url, body, options = {}) {\r\n\t\treturn this.request(url, { method: \"PATCH\", body, ...options });\r\n\t}\r\n\r\n\t/**\r\n\t * Сериализация тела (если не FormData)\r\n\t */\r\n\t_serializeBody(body) {\r\n\t\tif (!body || body instanceof FormData) return undefined;\r\n\t\treturn JSON.stringify(body);\r\n\t}\r\n}\r\n\r\nexport default Ajax;\n","import { isElement, mergeDeepObject } from \"../functions\";\r\nimport { Manipulator } from \"../dom/manipulator\";\r\n\r\n/**\r\n * Класс Params\r\n * Объединяет параметры из объекта и атрибутов элемента, поддерживает вложенные параметры через дефисы\r\n */\r\nclass Params {\r\n\tconstructor(params, element = null) {\r\n\t\tthis._params = this.merge(params, element);\r\n\t}\r\n\r\n\t/**\r\n\t * Возвращает итоговые параметры\r\n\t */\r\n\tget() {\r\n\t\treturn this._params;\r\n\t}\r\n\r\n\t/**\r\n\t * Извлекает параметры из data-атрибутов элемента\r\n\t */\r\n\tfromElement(element) {\r\n\t\treturn isElement(element) ? Manipulator.get(element) : {};\r\n\t}\r\n\r\n\t/**\r\n\t * Преобразует строку вида 'foo-bar-baz' в вложенный объект { foo: { bar: { baz: value } } }\r\n\t */\r\n\tstatic stringToNestedObject(str, value) {\r\n\t\treturn str.split('-').reduceRight((acc, key) => ({ [key]: acc }), value);\r\n\t}\r\n\r\n\t/**\r\n\t * Слияние параметров: объект + data-атрибуты + обработка вложенности и ключа 'params'\r\n\t */\r\n\tmerge(params, element) {\r\n\t\tlet merged = mergeDeepObject(params, this.fromElement(element));\r\n\r\n\t\t// Обработка вложенных ключей через дефисы и ключа 'params'\r\n\t\tObject.keys(merged).forEach(key => {\r\n\t\t\tif (key === 'params') {\r\n\t\t\t\tmerged = mergeDeepObject(merged, merged.params);\r\n\t\t\t\tdelete merged.params;\r\n\t\t\t}\r\n\r\n\t\t\tif (key.includes('-')) {\r\n\t\t\t\tconst nestedObj = Params.stringToNestedObject(key, merged[key]);\r\n\t\t\t\tmerged = mergeDeepObject(merged, nestedObj);\r\n\t\t\t\tdelete merged[key];\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn merged;\r\n\t}\r\n}\r\n\r\nexport default Params;","const SVG_NAMESPACE = \"http://www.w3.org/2000/svg\";\r\nconst DEFAULT_ALLOWED_SVG_TAGS = new Set([\r\n\t\"svg\",\r\n\t\"g\",\r\n\t\"path\",\r\n\t\"line\",\r\n\t\"polyline\",\r\n\t\"polygon\",\r\n\t\"circle\",\r\n\t\"ellipse\",\r\n\t\"rect\",\r\n\t\"defs\",\r\n\t\"symbol\",\r\n\t\"title\",\r\n\t\"use\"\r\n]);\r\nconst DEFAULT_ALLOWED_SVG_ATTRS = new Set([\r\n\t\"xmlns\",\r\n\t\"viewbox\",\r\n\t\"width\",\r\n\t\"height\",\r\n\t\"fill\",\r\n\t\"stroke\",\r\n\t\"stroke-width\",\r\n\t\"stroke-linecap\",\r\n\t\"stroke-linejoin\",\r\n\t\"stroke-miterlimit\",\r\n\t\"stroke-dasharray\",\r\n\t\"stroke-dashoffset\",\r\n\t\"opacity\",\r\n\t\"transform\",\r\n\t\"class\",\r\n\t\"x\",\r\n\t\"y\",\r\n\t\"x1\",\r\n\t\"y1\",\r\n\t\"x2\",\r\n\t\"y2\",\r\n\t\"cx\",\r\n\t\"cy\",\r\n\t\"r\",\r\n\t\"rx\",\r\n\t\"ry\",\r\n\t\"points\",\r\n\t\"d\",\r\n\t\"role\",\r\n\t\"focusable\",\r\n\t\"aria-hidden\",\r\n\t\"href\",\r\n\t\"xlink:href\"\r\n]);\r\n\r\nfunction escapeHtml(value) {\r\n\treturn String(value)\r\n\t\t.replace(/&/g, \"&\")\r\n\t\t.replace(/</g, \"<\")\r\n\t\t.replace(/>/g, \">\")\r\n\t\t.replace(/\"/g, \""\")\r\n\t\t.replace(/'/g, \"'\");\r\n}\r\n\r\nfunction sanitizeSvgNode(node, allowedTags = DEFAULT_ALLOWED_SVG_TAGS, allowedAttrs = DEFAULT_ALLOWED_SVG_ATTRS) {\r\n\tif (!node) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tif (node.nodeType === Node.TEXT_NODE) {\r\n\t\treturn document.createTextNode(node.textContent || \"\");\r\n\t}\r\n\r\n\tif (node.nodeType !== Node.ELEMENT_NODE) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst tagName = node.tagName.toLowerCase();\r\n\tif (!allowedTags.has(tagName)) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst safeNode = document.createElementNS(SVG_NAMESPACE, tagName);\r\n\r\n\tArray.from(node.attributes || []).forEach((attr) => {\r\n\t\tconst name = attr.name.toLowerCase();\r\n\t\tconst attrValue = attr.value || \"\";\r\n\r\n\t\tif (!allowedAttrs.has(name) || name.startsWith(\"on\")) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ((name === \"href\" || name === \"xlink:href\") && attrValue && !attrValue.startsWith(\"#\")) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tsafeNode.setAttribute(name, attrValue);\r\n\t});\r\n\r\n\tArray.from(node.childNodes || []).forEach((child) => {\r\n\t\tconst safeChild = sanitizeSvgNode(child, allowedTags, allowedAttrs);\r\n\t\tif (safeChild) {\r\n\t\t\tsafeNode.append(safeChild);\r\n\t\t}\r\n\t});\r\n\r\n\treturn safeNode;\r\n}\r\n\r\nexport function toSafeHtmlString(value, {\r\n\tallowedSvgTags = DEFAULT_ALLOWED_SVG_TAGS,\r\n\tallowedSvgAttrs = DEFAULT_ALLOWED_SVG_ATTRS\r\n} = {}) {\r\n\tif (value === null || value === undefined) {\r\n\t\treturn \"\";\r\n\t}\r\n\r\n\tconst content = String(value).trim();\r\n\tif (!content) {\r\n\t\treturn \"\";\r\n\t}\r\n\r\n\tif (!content.includes(\"<\")) {\r\n\t\treturn escapeHtml(content);\r\n\t}\r\n\r\n\tconst template = document.createElement(\"template\");\r\n\ttemplate.innerHTML = content;\r\n\r\n\tconst sanitizedParts = Array.from(template.content.childNodes)\r\n\t\t.map((node) => sanitizeSvgNode(node, allowedSvgTags, allowedSvgAttrs))\r\n\t\t.filter(Boolean)\r\n\t\t.map((node) => {\r\n\t\t\tif (node.nodeType === Node.TEXT_NODE) {\r\n\t\t\t\treturn escapeHtml(node.textContent || \"\");\r\n\t\t\t}\r\n\t\t\tif (node.nodeType === Node.ELEMENT_NODE) {\r\n\t\t\t\treturn node.outerHTML;\r\n\t\t\t}\r\n\t\t\treturn \"\";\r\n\t\t});\r\n\r\n\tconst sanitized = sanitizedParts.join(\"\");\r\n\treturn sanitized || escapeHtml(content);\r\n}\r\n\r\nclass Sanitize {\r\n\tstatic toSafeHtmlString(value, options) {\r\n\t\treturn toSafeHtmlString(value, options);\r\n\t}\r\n}\r\n\r\nexport default Sanitize;\r\n","import {getSVG} from \"../../../modules/module-fn\";\r\n\r\nclass LaravelHtmlBuilder {\r\n\tconstructor(mode = 'string') {\r\n\t\tthis.mode = mode; // 'string' или 'dom'\r\n\t\tthis.document = typeof document !== 'undefined' ? document : null;\r\n\t\tthis.tags = {\r\n\t\t\tselfClosing: ['img', 'input', 'br', 'hr', 'meta', 'link', 'area', 'base', 'col', 'command', 'embed', 'keygen', 'param', 'source', 'track', 'wbr']\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * Установка режима работы\r\n\t */\r\n\tsetMode(mode) {\r\n\t\tthis.mode = mode;\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/**\r\n\t * Создание HTML элемента\r\n\t */\r\n\telement(tag, attributes = {}, content = null, option = {}) {\r\n\t\tif (this.mode === 'dom' && this.document) {\r\n\t\t\treturn this._createDomElement(tag, attributes, content, option);\r\n\t\t}\r\n\t\treturn this._createHtmlString(tag, attributes, content, option);\r\n\t}\r\n\r\n\t/**\r\n\t * Создание DOM элемента\r\n\t */\r\n\t_createDomElement(tag, attributes, content, option = {}) {\r\n\t\tconst element = this.document.createElement(tag);\r\n\r\n\t\t// Установка атрибутов\r\n\t\tthis._setDomAttributes(element, attributes);\r\n\r\n\t\t// Добавление содержимого\r\n\t\tif (content !== null && !this.tags.selfClosing.includes(tag)) {\r\n\t\t\tif (Array.isArray(content)) {\r\n\t\t\t\tcontent.forEach(item => {\r\n\t\t\t\t\tif (typeof item === 'string') {\r\n\t\t\t\t\t\telement.appendChild(this.document.createTextNode(item));\r\n\t\t\t\t\t} else if (item instanceof Node) {\r\n\t\t\t\t\t\telement.appendChild(item);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t} else if (content instanceof Node) {\r\n\t\t\t\telement.appendChild(content);\r\n\t\t\t} else {\r\n\t\t\t\tif ('isHTML' in option && option.isHTML) {\r\n\t\t\t\t\telement.innerHTML = content;\r\n\t\t\t\t} else {\r\n\t\t\t\t\telement.textContent = content;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn element;\r\n\t}\r\n\r\n\t/**\r\n\t * Установка атрибутов DOM элемента\r\n\t */\r\n\t_setDomAttributes(element, attributes) {\r\n\t\tif (!attributes) return;\r\n\r\n\t\tObject.entries(attributes).forEach(([key, value]) => {\r\n\t\t\tif (value === null || value === undefined || value === false) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (value === true) {\r\n\t\t\t\telement.setAttribute(key, '');\r\n\t\t\t} else {\r\n\t\t\t\telement.setAttribute(key, String(value));\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Создание HTML строки\r\n\t */\r\n\t_createHtmlString(tag, attributes, content, isHTML = false) {\r\n\t\tconst attrString = this._attributesToString(attributes);\r\n\t\tconst isSelfClosing = this.tags.selfClosing.includes(tag);\r\n\r\n\t\tif (isSelfClosing) {\r\n\t\t\treturn `<${tag}${attrString}>`;\r\n\t\t}\r\n\r\n\t\tconst contentStr = content !== null ?\r\n\t\t\tthis._contentToString(content) : '';\r\n\r\n\t\tif (tag === '') {\r\n\t\t\treturn `${contentStr}`;\r\n\t\t} else {\r\n\t\t\treturn `<${tag}${attrString}>${contentStr}</${tag}>`;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Преобразование содержимого в строку\r\n\t */\r\n\t_contentToString(content) {\r\n\t\tif (Array.isArray(content)) {\r\n\t\t\treturn content.map(item => {\r\n\t\t\t\tif (item instanceof Node) {\r\n\t\t\t\t\treturn this._nodeToString(item);\r\n\t\t\t\t}\r\n\t\t\t\treturn String(item);\r\n\t\t\t}).join('');\r\n\t\t}\r\n\r\n\t\tif (content instanceof Node) {\r\n\t\t\treturn this._nodeToString(content);\r\n\t\t}\r\n\r\n\t\treturn String(content);\r\n\t}\r\n\r\n\t/**\r\n\t * Преобразование DOM узла в строку\r\n\t */\r\n\t_nodeToString(node) {\r\n\t\tif (node.outerHTML) {\r\n\t\t\treturn node.outerHTML;\r\n\t\t}\r\n\t\treturn String(node);\r\n\t}\r\n\r\n\t/**\r\n\t * Преобразование атрибутов в строку\r\n\t */\r\n\t_attributesToString(attrs) {\r\n\t\tif (!attrs || Object.keys(attrs).length === 0) {\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\tconst attributes = Object.entries(attrs)\r\n\t\t\t.map(([key, value]) => {\r\n\t\t\t\tif (value === null || value === undefined || value === false) {\r\n\t\t\t\t\treturn '';\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (value === true) {\r\n\t\t\t\t\treturn key;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst escapedValue = String(value)\r\n\t\t\t\t\t.replace(/&/g, '&')\r\n\t\t\t\t\t.replace(/\"/g, '"')\r\n\t\t\t\t\t.replace(/</g, '<')\r\n\t\t\t\t\t.replace(/>/g, '>');\r\n\r\n\t\t\t\treturn `${key}=\"${escapedValue}\"`;\r\n\t\t\t})\r\n\t\t\t.filter(attr => attr !== '');\r\n\r\n\t\treturn attributes.length ? ' ' + attributes.join(' ') : '';\r\n\t}\r\n\r\n\t/**\r\n\t * Методы для конкретных элементов\r\n\t */\r\n\tdiv(attributes = {}, content = '', options = {}) {\r\n\t\treturn this.element('div', attributes, content, options);\r\n\t}\r\n\r\n\tspan(attributes = {}, content = '', options = {}) {\r\n\t\treturn this.element('span', attributes, content, options);\r\n\t}\r\n\r\n\ti(attributes = {}, content = '', options = {}) {\r\n\t\treturn this.element('i', attributes, content, options);\r\n\t}\r\n\r\n\tp(attributes = {}, content = '', options = {}) {\r\n\t\treturn this.element('p', attributes, content, options);\r\n\t}\r\n\r\n\ta(href, content = '', attributes = {}, options = {}) {\r\n\t\treturn this.element('a', { href, ...attributes }, content, options);\r\n\t}\r\n\r\n\timg(src, alt = '', attributes = {}) {\r\n\t\treturn this.element('img', { src, alt, ...attributes });\r\n\t}\r\n\r\n\tinput(name, type = 'text', value = '', attributes = {}) {\r\n\t\treturn this.element('input', {\r\n\t\t\ttype,\r\n\t\t\tname,\r\n\t\t\tvalue,\r\n\t\t\t...attributes\r\n\t\t});\r\n\t}\r\n\r\n\tbutton(content = '', type = 'button', attributes = {}, options = {}) {\r\n\t\treturn this.element('button', { type, ...attributes }, content, options);\r\n\t}\r\n\r\n\tform(action = '', method = 'post', attributes = {}, content = '', options = {}) {\r\n\t\treturn this.element('form', { action, method, ...attributes }, content, options);\r\n\t}\r\n\r\n\tlabel(forId, content, attributes = {}, options = {}) {\r\n\t\treturn this.element('label', { for: forId, ...attributes }, content, options);\r\n\t}\r\n\r\n\ttextarea(name, content = '', attributes = {}) {\r\n\t\treturn this.element('textarea', { name, ...attributes }, content);\r\n\t}\r\n\r\n\tul(items = [], attributes = {}, isNative = false) {\r\n\t\tlet listItems = [];\r\n\r\n\t\tif (!isNative) {\r\n\t\t\tlistItems = items.map(item =>\r\n\t\t\t\tthis.element('li', {}, item)\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\tlistItems = items\r\n\t\t}\r\n\t\treturn this.element('ul', attributes, listItems);\r\n\t}\r\n\r\n\tli(attributes = {}, content, options) {\r\n\t\treturn this.element('li', attributes, content, options);\r\n\t}\r\n\r\n\tol(items = [], attributes = {}) {\r\n\t\tconst listItems = items.map(item =>\r\n\t\t\tthis.element('li', {}, item)\r\n\t\t);\r\n\t\treturn this.element('ol', attributes, listItems);\r\n\t}\r\n\r\n\th4(attributes = {}, content = '', options = {}) {\r\n\t\treturn this.element('h4', attributes, content, options);\r\n\t}\r\n\r\n\t/**\r\n\t * Создание таблицы\r\n\t */\r\n\ttable(headers = [], rows = [], attributes = {}) {\r\n\t\tconst headerCells = headers.map(header =>\r\n\t\t\tthis.element('th', {}, header)\r\n\t\t);\r\n\t\tconst headerRow = this.element('tr', {}, headerCells);\r\n\t\tconst thead = this.element('thead', {}, headerRow);\r\n\r\n\t\tconst bodyRows = rows.map(row => {\r\n\t\t\tconst cells = row.map(cell =>\r\n\t\t\t\tthis.element('td', {}, cell)\r\n\t\t\t);\r\n\t\t\treturn this.element('tr', {}, cells);\r\n\t\t});\r\n\t\tconst tbody = this.element('tbody', {}, bodyRows);\r\n\r\n\t\treturn this.element('table', attributes, [thead, tbody]);\r\n\t}\r\n\r\n\t/**\r\n\t * Методы для форм\r\n\t */\r\n\tcsrfToken(token) {\r\n\t\treturn this.element('input', {\r\n\t\t\ttype: 'hidden',\r\n\t\t\tname: '_token',\r\n\t\t\tvalue: token\r\n\t\t});\r\n\t}\r\n\r\n\tmethod(method) {\r\n\t\treturn this.element('input', {\r\n\t\t\ttype: 'hidden',\r\n\t\t\tname: '_method',\r\n\t\t\tvalue: method\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Создание элемента с обработчиками событий\r\n\t */\r\n\twithEvents(element, events = {}) {\r\n\t\tif (element instanceof Node && this.mode === 'dom') {\r\n\t\t\tObject.entries(events).forEach(([event, handler]) => {\r\n\t\t\t\telement.addEventListener(event, handler);\r\n\t\t\t});\r\n\t\t}\r\n\t\treturn element;\r\n\t}\r\n\r\n\t/**\r\n\t * Добавление классов\r\n\t */\r\n\taddClass(element, className) {\r\n\t\tif (element instanceof Node && this.mode === 'dom') {\r\n\t\t\telement.classList.add(className);\r\n\t\t} else if (typeof element === 'string') {\r\n\t\t\t// Для строкового режима - модифицируем атрибут class\r\n\t\t\tconst match = element.match(/<(\\w+)([^>]*)>/);\r\n\t\t\tif (match) {\r\n\t\t\t\tconst [fullMatch, tag, attrs] = match;\r\n\t\t\t\tconst newAttrs = this._addClassToAttributes(attrs, className);\r\n\t\t\t\treturn element.replace(fullMatch, `<${tag}${newAttrs}>`);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn element;\r\n\t}\r\n\r\n\t_addClassToAttributes(attrs, className) {\r\n\t\tconst classMatch = attrs.match(/class=\"([^\"]*)\"/);\r\n\t\tif (classMatch) {\r\n\t\t\tconst existingClass = classMatch[1];\r\n\t\t\tconst newClass = existingClass ? `${existingClass} ${className}` : className;\r\n\t\t\treturn attrs.replace(/class=\"[^\"]*\"/, `class=\"${newClass}\"`);\r\n\t\t} else {\r\n\t\t\treturn `${attrs} class=\"${className}\"`;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Создание компонента\r\n\t */\r\n\tcomponent(name, props = {}, slots = {}) {\r\n\t\t// Можно добавить заготовленные компоненты\r\n\t\tconst components = {\r\n\t\t\t'eye': (props) => {\r\n\t\t\t\tconst type = props.type || 'open';\r\n\t\t\t\tconst svg = this.element('', {}, getSVG(`eye-${type}`))\r\n\t\t\t\treturn this.span(\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t'data-vg-toggle': 'pass',\r\n\t\t\t\t\t\t'data-bs-toggle': 'tooltip',\r\n\t\t\t\t\t\t'title': 'Скрыть',\r\n\t\t\t\t\t\t'class': props.class || ''\r\n\t\t\t\t\t},\r\n\t\t\t\t\t[\r\n\t\t\t\t\t\tsvg\r\n\t\t\t\t\t]\r\n\t\t\t\t);\r\n\t\t\t},\r\n\t\t\t'alert': (props) => {\r\n\t\t\t\tconst type = props.type || 'info';\r\n\t\t\t\treturn this.div(\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tclass: `alert alert-${type}`,\r\n\t\t\t\t\t\trole: 'alert'\r\n\t\t\t\t\t},\r\n\t\t\t\t\tprops.content || ''\r\n\t\t\t\t);\r\n\t\t\t},\r\n\t\t\t'card': (props) => {\r\n\t\t\t\tconst header = props.header ?\r\n\t\t\t\t\tthis.div({ class: 'card-header' }, props.header) : '';\r\n\t\t\t\tconst body = this.div({ class: 'card-body' }, props.body || '');\r\n\t\t\t\tconst footer = props.footer ?\r\n\t\t\t\t\tthis.div({ class: 'card-footer' }, props.footer) : '';\r\n\r\n\t\t\t\treturn this.div(\r\n\t\t\t\t\t{ class: 'card' },\r\n\t\t\t\t\t[header, body, footer]\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tif (components[name]) {\r\n\t\t\treturn components[name](props);\r\n\t\t}\r\n\r\n\t\treturn this.div({ class: `component-${name}` }, '');\r\n\t}\r\n}\r\n\r\nfunction Html(mode = 'string') {\r\n\tconst builder = new LaravelHtmlBuilder(mode);\r\n\r\n\tconst handler = {\r\n\t\tget(target, prop) {\r\n\t\t\tif (prop in target) {\r\n\t\t\t\treturn target[prop].bind(target);\r\n\t\t\t}\r\n\r\n\t\t\t// Динамическое создание метода для любого тега\r\n\t\t\treturn function(attributes = {}, content = '', options = {}) {\r\n\t\t\t\treturn target.element(prop, attributes, content, options);\r\n\t\t\t};\r\n\t\t}\r\n\t};\r\n\r\n\treturn new Proxy(builder, handler);\r\n}\r\n\r\nexport default Html;","/**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap data.js\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n * Управление данными-экземплярами, привязанными к DOM-элементам.\r\n * Использует Map для эффективного хранения и контроля уникальности.\r\n */\r\n\r\n/**\r\n * Внутренняя карта для хранения данных по элементам.\r\n * Структура: Element → Map<Key, Instance>\r\n */\r\nconst elementMap = new Map();\r\n\r\n/**\r\n * Утилита для безопасного получения вложенной карты экземпляров.\r\n * @param {Element} element\r\n * @returns {Map<string, any>|null}\r\n */\r\nfunction getInstanceMap(element) {\r\n\tif (!elementMap.has(element)) {\r\n\t\treturn null;\r\n\t}\r\n\treturn elementMap.get(element);\r\n}\r\n\r\n/**\r\n * Утилита для создания новой вложенной карты для элемента.\r\n * @param {Element} element\r\n * @returns {Map<string, any>}\r\n */\r\nfunction createInstanceMap(element) {\r\n\tconst map = new Map();\r\n\telementMap.set(element, map);\r\n\treturn map;\r\n}\r\n\r\nexport default {\r\n\t/**\r\n\t * Устанавливает экземпляр для элемента по ключу.\r\n\t * Запрещает несколько экземпляров на один элемент.\r\n\t *\r\n\t * @param {Element} element - DOM-элемент\r\n\t * @param {string} key - уникальный ключ (например, имя компонента)\r\n\t * @param {any} instance - экземпляр класса или объект\r\n\t */\r\n\tset(element, key, instance) {\r\n\t\tif (!getInstanceMap(element)) {\r\n\t\t\tcreateInstanceMap(element);\r\n\t\t}\r\n\r\n\t\tconst instanceMap = getInstanceMap(element);\r\n\r\n\t\t// Проверяем, есть ли уже экземпляр (кроме случая, если это первая запись)\r\n\t\tif (instanceMap.size > 0 && !instanceMap.has(key)) {\r\n\t\t\tconst existingKey = Array.from(instanceMap.keys())[0];\r\n\t\t\tconsole.error(\r\n\t\t\t\t`VGApp не допускает более одного экземпляра для каждого элемента. Связанный экземпляр: ${existingKey}.`\r\n\t\t\t);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tinstanceMap.set(key, instance);\r\n\t},\r\n\r\n\t/**\r\n\t * Получает экземпляр по элементу и ключу.\r\n\t *\r\n\t * @param {Element} element - DOM-элемент\r\n\t * @param {string} key - ключ\r\n\t * @returns {any|null} - экземпляр или null\r\n\t */\r\n\tget(element, key) {\r\n\t\tconst instanceMap = getInstanceMap(element);\r\n\t\tif (!instanceMap) return null;\r\n\r\n\t\treturn instanceMap.get(key) || null;\r\n\t},\r\n\r\n\t/**\r\n\t * Удаляет экземпляр по ключу.\r\n\t * Если у элемента не остаётся экземпляров — удаляет и сам элемент из хранилища.\r\n\t *\r\n\t * @param {Element} element - DOM-элемент\r\n\t * @param {string} key - ключ\r\n\t */\r\n\tremove(element, key) {\r\n\t\tconst instanceMap = getInstanceMap(element);\r\n\t\tif (!instanceMap) return;\r\n\r\n\t\tinstanceMap.delete(key);\r\n\r\n\t\t// Очищаем корневую запись, если больше нет экземпляров\r\n\t\tif (instanceMap.size === 0) {\r\n\t\t\telementMap.delete(element);\r\n\t\t}\r\n\t}\r\n};","/**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap event.js (рефакторинг)\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n * Утилита для гибкого управления DOM-событиями с поддержкой делегирования, пространств имён и one-off обработчиков.\r\n */\r\n\r\n/**\r\n * ==================================\r\n * КОНСТАНТЫ\r\n * ==================================\r\n */\r\n\r\nconst NAMESPACE_REGEX = /[^.]*(?=\\..*)\\.|.*/\r\nconst STRIP_NAME_REGEX = /\\..*/\r\nconst STRIP_UID_REGEX = /::\\d+$/\r\nconst customEvents = {\r\n\tmouseenter: 'mouseover',\r\n\tmouseleave: 'mouseout'\r\n};\r\n\r\n// Список нативных событий для валидации\r\nconst nativeEvents = new Set([\r\n\t'click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu',\r\n\t'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove',\r\n\t'selectstart', 'selectend', 'submit', 'keydown', 'keypress', 'keyup',\r\n\t'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel',\r\n\t'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel',\r\n\t'popstate', 'gesturestart', 'gesturechange', 'gestureend',\r\n\t'focus', 'blur', 'change', 'reset', 'select', 'focusin', 'focusout',\r\n\t'load', 'unload', 'beforeunload', 'resize', 'move',\r\n\t'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll'\r\n]);\r\n\r\n/**\r\n * ==================================\r\n * ПРИВАТНЫЕ ПОЛЯ\r\n * ==================================\r\n */\r\n\r\nconst eventRegistry = {}; // Хранилище событий\r\nlet uidEvent = 1; // Глобальный идентификатор\r\n\r\n/**\r\n * ==================================\r\n * ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ\r\n * ==================================\r\n */\r\n\r\n/**\r\n * Генерирует уникальный ID для события.\r\n * @param {Element} element\r\n * @param {string|null} uid\r\n * @returns {string|number}\r\n */\r\nconst makeEventUid = (element, uid = null) => {\r\n\tif (!element.uidEvent) {\r\n\t\telement.uidEvent = uid ? `${uid}::${uidEvent++}` : uidEvent++;\r\n\t}\r\n\treturn element.uidEvent;\r\n};\r\n\r\n/**\r\n * Получает или создаёт хранилище событий для элемента.\r\n * @param {Element} element\r\n * @returns {Object}\r\n */\r\nconst getElementEvents = (element) => {\r\n\tconst uid = makeEventUid(element);\r\n\teventRegistry[uid] = eventRegistry[uid] || {};\r\n\treturn eventRegistry[uid];\r\n};\r\n\r\n/**\r\n * Создаёт обёртку для вызова обработчика.\r\n * @param {Element} element\r\n * @param {Function} fn\r\n * @param {boolean} isOneOff\r\n * @returns {Function}\r\n */\r\nconst createHandler = (element, fn, isOneOff) => {\r\n\tconst handler = function (event) {\r\n\t\thydrateObj(event, { delegateTarget: element });\r\n\r\n\t\tif (isOneOff) {\r\n\t\t\tEventHandler.off(element, event.type, fn);\r\n\t\t}\r\n\r\n\t\treturn fn.apply(element, [event]);\r\n\t};\r\n\r\n\thandler.delegationSelector = null;\r\n\thandler.callable = fn;\r\n\thandler.oneOff = isOneOff;\r\n\thandler.uidEvent = null;\r\n\r\n\treturn handler;\r\n};\r\n\r\n/**\r\n * Создаёт делегированный обработчик.\r\n * @param {Element} element\r\n * @param {string} selector\r\n * @param {Function} fn\r\n * @param {boolean} isOneOff\r\n * @returns {Function}\r\n */\r\nconst createDelegatedHandler = (element, selector, fn, isOneOff) => {\r\n\tconst handler = function (event) {\r\n\t\tconst candidates = Array.from(element.querySelectorAll(selector));\r\n\t\tfor (let target = event.target; target && target !== element; target = target.parentNode) {\r\n\t\t\tif (!candidates.includes(target)) continue;\r\n\r\n\t\t\thydrateObj(event, { delegateTarget: target });\r\n\r\n\t\t\tif (isOneOff) {\r\n\t\t\t\tEventHandler.off(element, event.type, selector, fn);\r\n\t\t\t}\r\n\r\n\t\t\treturn fn.apply(target, [event]);\r\n\t\t}\r\n\t};\r\n\r\n\thandler.delegationSelector = selector;\r\n\thandler.callable = fn;\r\n\thandler.oneOff = isOneOff;\r\n\thandler.uidEvent = null;\r\n\r\n\treturn handler;\r\n};\r\n\r\n/**\r\n * Обёртка для mouseenter/mouseleave.\r\n * @param {Function} fn\r\n * @returns {Function}\r\n */\r\nconst withRelatedTargetCheck = (fn) => {\r\n\treturn function (event) {\r\n\t\tif (\r\n\t\t\t!event.relatedTarget ||\r\n\t\t\t(event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))\r\n\t\t) {\r\n\t\t\treturn fn.call(this, event);\r\n\t\t}\r\n\t};\r\n};\r\n\r\n/**\r\n * Нормализует параметры события.\r\n * @param {string} originalTypeEvent\r\n * @param {Function|string} handler\r\n * @param {Function} delegationFunction\r\n * @returns {[boolean, Function, string]}\r\n */\r\nconst normalizeParameters = (originalTypeEvent, handler, delegationFunction) => {\r\n\tconst isDelegated = typeof handler === 'string';\r\n\tconst callable = isDelegated ? delegationFunction : (handler || delegationFunction);\r\n\tlet typeEvent = originalTypeEvent.replace(STRIP_NAME_REGEX, '');\r\n\r\n\t// Замена кастомных событий\r\n\tif (customEvents[typeEvent]) {\r\n\t\ttypeEvent = customEvents[typeEvent];\r\n\t}\r\n\r\n\t// Если не нативное событие — оставляем как есть\r\n\tif (!nativeEvents.has(typeEvent)) {\r\n\t\ttypeEvent = originalTypeEvent;\r\n\t}\r\n\r\n\treturn [isDelegated, callable, typeEvent];\r\n};\r\n\r\n/**\r\n * Добавляет обработчик.\r\n * @param {Element} element\r\n * @param {string} originalTypeEvent\r\n * @param {Function|string} handler\r\n * @param {Function} delegationFunction\r\n * @param {boolean} oneOff\r\n */\r\nconst addHandler = (element, originalTypeEvent, handler, delegationFunction, oneOff) => {\r\n\tif (typeof originalTypeEvent !== 'string' || !element) return;\r\n\r\n\tconst [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\r\n\tconst events = getElementEvents(element);\r\n\tconst handlers = events[typeEvent] ||= {};\r\n\tconst key = isDelegated ? handler : null;\r\n\tconst existing = findHandler(handlers, callable, key);\r\n\r\n\tif (existing) {\r\n\t\texisting.oneOff = existing.oneOff && oneOff;\r\n\t\treturn;\r\n\t}\r\n\r\n\tlet fn = isDelegated\r\n\t\t? createDelegatedHandler(element, handler, callable, oneOff)\r\n\t\t: createHandler(element, callable, oneOff);\r\n\r\n\tconst uid = makeEventUid(fn, originalTypeEvent.replace(NAMESPACE_REGEX, ''));\r\n\tfn.uidEvent = uid;\r\n\thandlers[uid] = fn;\r\n\r\n\telement.addEventListener(typeEvent, fn, isDelegated);\r\n};\r\n\r\n/**\r\n * Находит обработчик в хранилище.\r\n * @param {Object} handlers\r\n * @param {Function} callable\r\n * @param {string|null} delegationSelector\r\n * @returns {Object|undefined}\r\n */\r\nconst findHandler = (handlers, callable, delegationSelector) => {\r\n\treturn Object.values(handlers).find(\r\n\t\th => h.callable === callable && h.delegationSelector === delegationSelector\r\n\t);\r\n};\r\n\r\n/**\r\n * Удаляет обработчик.\r\n * @param {Element} element\r\n * @param {Object} events\r\n * @param {string} typeEvent\r\n * @param {Function} callable\r\n * @param {string|null} delegationSelector\r\n */\r\nconst removeHandler = (element, events, typeEvent, callable, delegationSelector) => {\r\n\tconst handler = findHandler(events[typeEvent], callable, delegationSelector);\r\n\tif (!handler) return;\r\n\r\n\telement.removeEventListener(typeEvent, handler, Boolean(delegationSelector));\r\n\tdelete events[typeEvent][handler.uidEvent];\r\n};\r\n\r\n/**\r\n * Удаляет обработчики по пространству имён.\r\n * @param {Element} element\r\n * @param {Object} events\r\n * @param {string} typeEvent\r\n * @param {string} namespace\r\n */\r\nconst removeNamespacedHandlers = (element, events, typeEvent, namespace) => {\r\n\tconst handlers = events[typeEvent] || {};\r\n\tfor (const [key, handler] of Object.entries(handlers)) {\r\n\t\tif (key.includes(namespace)) {\r\n\t\t\tremoveHandler(element, events, typeEvent, handler.callable, handler.delegationSelector);\r\n\t\t}\r\n\t}\r\n};\r\n\r\n/**\r\n * Добавляет свойства в объект события, безопасно.\r\n * @param {Object} obj\r\n * @param {Object} meta\r\n * @returns {Object}\r\n */\r\nconst hydrateObj = (obj, meta = {}) => {\r\n\tfor (const [key, value] of Object.entries(meta)) {\r\n\t\ttry {\r\n\t\t\tobj[key] = value;\r\n\t\t} catch {\r\n\t\t\tObject.defineProperty(obj, key, {\r\n\t\t\t\tconfigurable: true,\r\n\t\t\t\tget() { return value; }\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\treturn obj;\r\n};\r\n\r\n/**\r\n * ==================================\r\n * ОСНОВНОЙ МОДУЛЬ: EventHandler\r\n * ==================================\r\n */\r\n\r\nconst EventHandler = {\r\n\t/**\r\n\t * Добавляет прослушиватель события.\r\n\t * @param {Element} element\r\n\t * @param {string} event — тип события (с опциональным пространством имён)\r\n\t * @param {Function|string} handler — селектор (если делегирование) или функция\r\n\t * @param {Function} [delegationFunction] — функция, вызываемая при делегировании\r\n\t */\r\n\ton(element, event, handler, delegationFunction) {\r\n\t\taddHandler(element, event, handler, delegationFunction, false);\r\n\t},\r\n\r\n\t/**\r\n\t * Добавляет одноразовый обработчик.\r\n\t * @param {Element} element\r\n\t * @param {string} event\r\n\t * @param {Function|string} handler\r\n\t * @param {Function} [delegationFunction]\r\n\t */\r\n\tone(element, event, handler, delegationFunction) {\r\n\t\taddHandler(element, event, handler, delegationFunction, true);\r\n\t},\r\n\r\n\t/**\r\n\t * Удаляет обработчик(и).\r\n\t * @param {Element} element\r\n\t * @param {string} originalTypeEvent\r\n\t * @param {Function|string} [handler]\r\n\t * @param {Function} [delegationFunction]\r\n\t */\r\n\toff(element, originalTypeEvent, handler, delegationFunction) {\r\n\t\tif (typeof originalTypeEvent !== 'string' || !element) return;\r\n\r\n\t\tconst [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\r\n\t\tconst events = getElementEvents(element);\r\n\t\tconst isNamespace = originalTypeEvent.startsWith('.');\r\n\t\tconst inNamespace = typeEvent !== originalTypeEvent;\r\n\r\n\t\t// Удаление по пространству имён\r\n\t\tif (isNamespace) {\r\n\t\t\tfor (const eventType of Object.keys(events)) {\r\n\t\t\t\tremoveNamespacedHandlers(element, events, eventType, originalTypeEvent.slice(1));\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst storeElementEvent = events[typeEvent] || {};\r\n\r\n\t\t// Удаление конкретного обработчика\r\n\t\tif (typeof callable !== 'undefined') {\r\n\t\t\tremoveHandler(element, events, typeEvent, callable, isDelegated ? handler : null);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Удаление всех обработчиков события\r\n\t\tfor (const [key, eventObj] of Object.entries(storeElementEvent)) {\r\n\t\t\tconst handlerKey = key.replace(STRIP_UID_REGEX, '');\r\n\t\t\tif (!inNamespace || originalTypeEvent.includes(handlerKey)) {\r\n\t\t\t\tremoveHandler(element, events, typeEvent, eventObj.callable, eventObj.delegationSelector);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Генерирует пользовательское событие.\r\n\t * @param {Element} element\r\n\t * @param {string} event — имя события\r\n\t * @param {Object} [args] — дополнительные данные\r\n\t * @returns {Object}\r\n\t */\r\n\ttrigger(element, event, args) {\r\n\t\tif (typeof event !== 'string' || !element) return null;\r\n\r\n\t\tconst evt = hydrateObj(\r\n\t\t\tnew CustomEvent(event, {\r\n\t\t\t\tbubbles: true,\r\n\t\t\t\tcancelable: true,\r\n\t\t\t\tdetail: args\r\n\t\t\t}),\r\n\t\t\targs\r\n\t\t);\r\n\r\n\t\telement.dispatchEvent(evt);\r\n\t\treturn evt;\r\n\t}\r\n};\r\n\r\nexport default EventHandler;","import { isElement, normalizeData } from \"../functions\";\r\n\r\n/**\r\n * Утилиты для работы с атрибутами и классами DOM-элементов.\r\n */\r\nconst Manipulator = {\r\n\t/**\r\n\t * Получает значение атрибута, data-атрибутов или всех атрибутов.\r\n\t * @param {Element} element - DOM-элемент.\r\n\t * @param {string} nameAttribute - Имя атрибута ('data', 'all' или конкретное имя).\r\n\t * @param {boolean} isRemoveDataName - Убрать префикс 'data-' у data-атрибутов.\r\n\t * @returns {any|Object} - Значение атрибута или объект атрибутов.\r\n\t */\r\n\tget(element, nameAttribute = \"data\", isRemoveDataName = true) {\r\n\t\tif (!isElement(element)) return {};\r\n\r\n\t\t// Все атрибуты\r\n\t\tif (nameAttribute === \"all\") {\r\n\t\t\treturn Array.from(element.attributes).reduce((acc, attr) => {\r\n\t\t\t\tacc[attr.name] = attr.value;\r\n\t\t\t\treturn acc;\r\n\t\t\t}, {});\r\n\t\t}\r\n\r\n\t\t// Data-атрибуты\r\n\t\tif (nameAttribute === \"data\") {\r\n\t\t\tconst baseKeys = new Set(['data-vg-toggle', 'data-vg-target', 'data-vg-dismiss', 'data-vg-loaded']);\r\n\t\t\tconst dataAttrs = {};\r\n\r\n\t\t\tArray.from(element.attributes)\r\n\t\t\t\t.filter(attr => attr.name.startsWith('data-'))\r\n\t\t\t\t.forEach(attr => {\r\n\t\t\t\t\tif (!baseKeys.has(attr.name)) {\r\n\t\t\t\t\t\tconst key = isRemoveDataName ? attr.name.slice(5) : attr.name;\r\n\t\t\t\t\t\tdataAttrs[key] = normalizeData(attr.value);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\treturn dataAttrs;\r\n\t\t}\r\n\r\n\t\t// Конкретный атрибут\r\n\t\treturn element.getAttribute(nameAttribute);\r\n\t},\r\n\r\n\t/**\r\n\t * Проверяет наличие атрибута у элемента.\r\n\t * @param {Element} element - DOM-элемент.\r\n\t * @param {string} nameAttribute - Имя атрибута.\r\n\t * @returns {boolean}\r\n\t */\r\n\thas(element, nameAttribute) {\r\n\t\treturn isElement(element) && element.hasAttribute(nameAttribute);\r\n\t},\r\n\r\n\t/**\r\n\t * Устанавливает атрибут элементу.\r\n\t * @param {Element} element - DOM-элемент.\r\n\t * @param {string} name - Имя атрибута.\r\n\t * @param {string} value - Значение атрибута.\r\n\t */\r\n\tset(element, name, value) {\r\n\t\tif (isElement(element) && name) {\r\n\t\t\telement.setAttribute(name, value);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Удаляет атрибут у элемента.\r\n\t * @param {Element} element - DOM-элемент.\r\n\t * @param {string} nameAttribute - Имя атрибута.\r\n\t */\r\n\tremove(element, nameAttribute) {\r\n\t\tif (isElement(element) && nameAttribute) {\r\n\t\t\telement.removeAttribute(nameAttribute);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Скрывает элемент.\r\n\t * @param {Element} element - DOM-элемент.\r\n\t */\r\n\thide(element) {\r\n\t\tif (isElement(element)) {\r\n\t\t\telement.style.display = 'none';\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Отображает элемент.\r\n\t * @param {Element} element - DOM-элемент.\r\n\t * @param {string} state - display-значение (по умолчанию 'block').\r\n\t */\r\n\tshow(element, state = 'block') {\r\n\t\tif (isElement(element)) {\r\n\t\t\telement.style.display = state;\r\n\t\t}\r\n\t},\r\n};\r\n\r\n/**\r\n * Утилиты для работы с classList элемента.\r\n */\r\nconst Classes = {\r\n\t/**\r\n\t * Удаляет класс(ы) у элемента.\r\n\t * @param {Element} element - DOM-элемент.\r\n\t * @param {string|string[]} className - Класс или массив классов.\r\n\t */\r\n\tremove(element, className) {\r\n\t\tif (!isElement(element) || !className) return;\r\n\r\n\t\tconst classes = Array.isArray(className) ? className : className.split(' ').filter(Boolean);\r\n\t\telement.classList.remove(...classes);\r\n\t},\r\n\r\n\t/**\r\n\t * Добавляет класс(ы) к элементу.\r\n\t * @param {Element} element - DOM-элемент.\r\n\t * @param {string|string[]} className - Класс или массив классов.\r\n\t * @param {boolean} isString - Если true — возвращает строку вместо применения.\r\n\t * @returns {string|undefined} - Строка с классами (если isString=true).\r\n\t */\r\n\tadd(element, className, isString = false) {\r\n\t\tif (!className) return;\r\n\r\n\t\tconst classes = Array.isArray(className) ? className : className.split(' ').filter(Boolean);\r\n\r\n\t\tif (isString) {\r\n\t\t\treturn classes.join(' ');\r\n\t\t}\r\n\r\n\t\tif (isElement(element)) {\r\n\t\t\telement.classList.add(...classes);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Переключает класс у элемента.\r\n\t * @param {Element} element - DOM-элемент.\r\n\t * @param {string} className - Имя класса.\r\n\t * @param {boolean} condition - Условие переключения.\r\n\t */\r\n\ttoggle(element, className, condition = true) {\r\n\t\tif (isElement(element) && className) {\r\n\t\t\telement.classList.toggle(className, !!condition);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Заменяет один класс на другой.\r\n\t * @param {Element} element - DOM-элемент.\r\n\t * @param {string} oldClass - Старый класс.\r\n\t * @param {string} newClass - Новый класс.\r\n\t */\r\n\treplace(element, oldClass, newClass) {\r\n\t\tif (isElement(element) && oldClass && newClass) {\r\n\t\t\telement.classList.replace(oldClass, newClass);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Проверяет наличие класса у элемента.\r\n\t * @param {Element} element - DOM-элемент.\r\n\t * @param {string} className - Имя класса.\r\n\t * @returns {boolean} - Возвращает true, если элемент содержит указанный класс.\r\n\t */\r\n\thas(element, className) {\r\n\t\treturn isElement(element) && element.classList.contains(className);\r\n\t},\r\n};\r\n\r\nexport { Manipulator, Classes };","/**\r\n * Утилиты для работы с DOM-селекторами\r\n * Поддержка data-атрибутов, href и CSS-экранирование\r\n */\r\n\r\nimport { isElement } from '../functions';\r\n\r\n/**\r\n * Экранирует ID в CSS-селекторах, если поддерживается браузером\r\n * @param {string} id\r\n * @returns {string}\r\n */\r\nconst escapeId = (id) => {\r\n\tif (id && window.CSS?.escape) {\r\n\t\treturn CSS.escape(id);\r\n\t}\r\n\t// Резервное экранирование для старых браузеров\r\n\treturn id.replace(/([:.#[]])/g, '\\\\$1');\r\n};\r\n\r\n/**\r\n * Извлекает селектор из элемента через data-атрибут или href\r\n * @param {Element} element\r\n * @returns {string|null}\r\n */\r\nconst getSelector = (element) => {\r\n\tconst dataTarget = element.getAttribute('data-vg-target');\r\n\tif (dataTarget && dataTarget !== '#') {\r\n\t\treturn dataTarget.trim();\r\n\t}\r\n\r\n\tconst href = element.getAttribute('href');\r\n\tif (!href || (!href.includes('#') && !href.startsWith('.'))) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst selector = href.includes('#') && !href.startsWith('#')\r\n\t\t? `#${href.split('#')[1]}`\r\n\t\t: href;\r\n\r\n\treturn selector !== '#' ? selector.trim() : null;\r\n};\r\n\r\n/**\r\n * Основной объект для работы с селекторами\r\n */\r\nconst Selectors = {\r\n\t/**\r\n\t * Находит один элемент по селектору или возвращает сам элемент\r\n\t * @param {string|Element} selector\r\n\t * @param {Element} [container=document.documentElement]\r\n\t * @returns {Element|null}\r\n\t */\r\n\tfind(selector, container = document.documentElement) {\r\n\t\tif (isElement(selector)) {\r\n\t\t\treturn selector;\r\n\t\t}\r\n\t\ttry {\r\n\t\t\treturn container.querySelector(selector);\r\n\t\t} catch (e) {\r\n\t\t\tconsole.warn('Invalid selector:', selector, e);\r\n\t\t\treturn null;\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Находит элемент по ID с экранированием\r\n\t * @param {string} id\r\n\t * @param {Element} [container=document]\r\n\t * @returns {Element|null}\r\n\t */\r\n\t/**\r\n\t * Находит элемент по ID с экранированием\r\n\t * @param {string} id\r\n\t * @param {Document|Element} [container=document]\r\n\t * @returns {Element|null}\r\n\t */\r\n\tfindID(id, container = document) {\r\n\t\ttry {\r\n\t\t\tif (typeof id !== 'string' || id.trim() === '') return null;\r\n\r\n\t\t\tconst doc = container && container.nodeType === 9\r\n\t\t\t\t? container\r\n\t\t\t\t: (container?.ownerDocument || document);\r\n\r\n\t\t\tconst byId = doc.getElementById(id);\r\n\t\t\tif (byId) {\r\n\t\t\t\tif (container && container.nodeType !== 9) {\r\n\t\t\t\t\treturn container.contains(byId) ? byId : null;\r\n\t\t\t\t}\r\n\t\t\t\treturn byId;\r\n\t\t\t}\r\n\r\n\t\t\tconst scope = (container && container.nodeType === 9) ? container.documentElement : container;\r\n\t\t\tif (!scope || typeof scope.querySelector !== 'function') return null;\r\n\r\n\t\t\tconst escaped = escapeId(id);\r\n\t\t\treturn scope.querySelector(`#${escaped}`);\r\n\t\t} catch (e) {\r\n\t\t\tconsole.warn('Invalid ID in findID:', id, e);\r\n\t\t\treturn null;\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Находит все элементы по селектору\r\n\t * @param {string} selector\r\n\t * @param {Element} [container=document.documentElement]\r\n\t * @returns {Element[]}\r\n\t */\r\n\tfindAll(selector, container = document.documentElement) {\r\n\t\ttry {\r\n\t\t\treturn Array.from(container.querySelectorAll(selector));\r\n\t\t} catch (e) {\r\n\t\t\tconsole.warn('Invalid selector in findAll:', selector, e);\r\n\t\t\treturn [];\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Получает валидный селектор из элемента\r\n\t * @param {Element} element\r\n\t * @returns {string|null}\r\n\t */\r\n\tgetSelectorFromElement(element) {\r\n\t\tconst selector = getSelector(element);\r\n\t\treturn selector && this.find(selector) ? selector : null;\r\n\t},\r\n\r\n\t/**\r\n\t * Получает целевой элемент по селектору из элемента\r\n\t * @param {Element} element\r\n\t * @returns {Element|null}\r\n\t */\r\n\tgetElementFromSelector(element) {\r\n\t\tconst selector = getSelector(element);\r\n\t\treturn selector ? this.find(selector) : null;\r\n\t},\r\n\r\n\t/**\r\n\t * Получает все целевые элементы (для множественного выбора)\r\n\t * @param {Element} element\r\n\t * @returns {Element[]}\r\n\t */\r\n\tgetMultipleElementsFromSelector(element) {\r\n\t\tconst selector = getSelector(element);\r\n\t\treturn selector ? this.findAll(selector) : [];\r\n\t},\r\n\r\n\t/**\r\n\t * Находит всех родителей, соответствующих селектору\r\n\t * @param {Element} element\r\n\t * @param {string} selector\r\n\t * @returns {Element[]}\r\n\t */\r\n\tparents(element, selector) {\r\n\t\tconst parents = [];\r\n\t\tlet parent = element.parentElement?.closest(selector);\r\n\r\n\t\twhile (parent) {\r\n\t\t\tparents.push(parent);\r\n\t\t\tparent = parent.parentElement?.closest(selector);\r\n\t\t}\r\n\r\n\t\treturn parents;\r\n\t},\r\n\r\n\t/**\r\n\t * Находит следующий соседний элемент, соответствующий селектору\r\n\t * @param {Element} element\r\n\t * @param {string} selector\r\n\t * @returns {Element[]}\r\n\t */\r\n\tnext(element, selector) {\r\n\t\tlet sibling = element.nextElementSibling;\r\n\t\twhile (sibling) {\r\n\t\t\tif (sibling.matches(selector)) {\r\n\t\t\t\treturn [sibling];\r\n\t\t\t}\r\n\t\t\tsibling = sibling.nextElementSibling;\r\n\t\t}\r\n\t\treturn [];\r\n\t},\r\n\r\n\t/**\r\n\t * Находит предыдущий соседний элемент, соответствующий селектору\r\n\t * @param {Element} element\r\n\t * @param {string} selector\r\n\t * @returns {Element[]}\r\n\t */\r\n\tprev(element, selector) {\r\n\t\tlet sibling = element.previousElementSibling;\r\n\t\twhile (sibling) {\r\n\t\t\tif (sibling.matches(selector)) {\r\n\t\t\t\treturn [sibling];\r\n\t\t\t}\r\n\t\t\tsibling = sibling.previousElementSibling;\r\n\t\t}\r\n\t\treturn [];\r\n\t},\r\n};\r\n\r\nexport default Selectors;","/**\r\n * Утилиты: DOM, типы, массивы, анимации, объекты\r\n * Экспортируются все функции.\r\n */\r\n\r\n/**\r\n * Проверяет, является ли объект DOM-элементом.\r\n * @param {*} obj\r\n * @returns {boolean}\r\n */\r\nconst isElement = (obj) => obj?.nodeType === Node.ELEMENT_NODE;\r\n\r\n/**\r\n * Проверяет, является ли значение объектом (не null, включая массивы).\r\n * @param {*} obj\r\n * @returns {boolean}\r\n */\r\nconst isObject = (obj) => obj && typeof obj === 'object';\r\n\r\n/**\r\n * Проверяет, пуст ли объект (нет собственных перечисляемых ключей).\r\n * @param {Object} obj\r\n * @returns {boolean}\r\n */\r\nconst isEmptyObj = (obj) => {\r\n\tif (!isObject(obj)) return true;\r\n\tfor (const key in obj) {\r\n\t\tif (Object.prototype.hasOwnProperty.call(obj, key)) return false;\r\n\t}\r\n\treturn true;\r\n};\r\n\r\n/**\r\n * Возвращает DOM-элемент по селектору, элементу или jQuery-объекту.\r\n * @param {string|Element|jQuery} selector\r\n * @returns {Element|null}\r\n */\r\nconst getElement = (selector) => {\r\n\tif (isElement(selector)) return selector;\r\n\tif (selector?.jquery) return selector[0] || null;\r\n\tif (typeof selector === 'string' && selector.trim() !== '') {\r\n\t\ttry {\r\n\t\t\treturn document.querySelector(selector);\r\n\t\t} catch (e) {\r\n\t\t\tconsole.warn('Invalid selector:', selector);\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\n/**\r\n * Проверяет, отключён ли элемент (по классу .disabled, атрибуту или свойству).\r\n * @param {Element} el\r\n * @returns {boolean}\r\n */\r\nconst isDisabled = (el) => {\r\n\tif (!isElement(el)) return true;\r\n\tif (el.classList.contains('disabled')) return true;\r\n\tif (typeof el.disabled !== 'undefined') return !!el.disabled;\r\n\treturn el.hasAttribute('disabled') && el.getAttribute('disabled') !== 'false';\r\n};\r\n\r\n/**\r\n * Проверяет видимость элемента (размер, visibility, details).\r\n * @param {Element} el\r\n * @returns {boolean}\r\n */\r\nconst isVisible = (el) => {\r\n\tif (!isElement(el) || el.getClientRects().length === 0) return false;\r\n\r\n\tconst style = getComputedStyle(el);\r\n\tif (style.visibility === 'hidden') return false;\r\n\r\n\tconst parentDetails = el.closest('details:not([open])');\r\n\tif (!parentDetails) return true;\r\n\r\n\tconst summary = el.closest('summary');\r\n\tif (summary && summary.parentNode === parentDetails) return true;\r\n\r\n\treturn false;\r\n};\r\n\r\n/**\r\n * Преобразует строку в соответствующий тип: boolean, number, null, объект.\r\n * @param {*} value\r\n * @returns {*}\r\n */\r\nconst normalizeData = (value) => {\r\n\tif (value === 'true') return true;\r\n\tif (value === 'false') return false;\r\n\tif (value === 'null') return null;\r\n\tif (value === '') return null;\r\n\tif (typeof value === 'number' || value === Number(value)) return Number(value);\r\n\tif (typeof value !== 'string') return value;\r\n\r\n\ttry {\r\n\t\treturn JSON.parse(decodeURIComponent(value));\r\n\t} catch {\r\n\t\treturn value;\r\n\t}\r\n};\r\n\r\n/**\r\n * Удаляет элементы из массива.\r\n * @param {Array} arr\r\n * @param {Array} toRemove\r\n * @returns {Array}\r\n */\r\nconst removeElementArray = (arr, toRemove) => arr.filter((item) => !toRemove.includes(item));\r\n\r\n/**\r\n * Глубокое слияние объектов с конкатенацией массивов.\r\n * @param {...Object} sources\r\n * @returns {Object}\r\n */\r\nconst mergeDeepObject = (...sources) => {\r\n\tconst isObj = (o) => o && typeof o === 'object';\r\n\r\n\treturn sources.reduce((acc, obj) => {\r\n\t\tif (!isObj(obj)) return acc;\r\n\r\n\t\tObject.keys(obj).forEach((key) => {\r\n\t\t\tconst src = acc[key];\r\n\t\t\tconst val = obj[key];\r\n\r\n\t\t\tif (Array.isArray(src) && Array.isArray(val)) {\r\n\t\t\t\tacc[key] = src.concat(val);\r\n\t\t\t} else if (isObj(src) && isObj(val)) {\r\n\t\t\t\tacc[key] = mergeDeepObject(src, val);\r\n\t\t\t} else {\r\n\t\t\t\tacc[key] = val;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn acc;\r\n\t}, {});\r\n};\r\n\r\n/**\r\n * Выполняет функцию с аргументами или возвращает значение по умолчанию.\r\n * @param {Function|*} fn\r\n * @param {Array} args\r\n * @param {*} defaultValue\r\n * @returns {*}\r\n */\r\nconst execute = (fn, args = [], defaultValue = fn) => {\r\n\treturn typeof fn === 'function' ? fn(...args) : defaultValue;\r\n};\r\n\r\n/**\r\n * Событие завершения CSS-перехода.\r\n * @type {string}\r\n */\r\nconst TRANSITION_END = 'transitionend';\r\n\r\n/**\r\n * Множитель для мс.\r\n * @type {number}\r\n */\r\nconst MILLISECONDS_MULTIPLIER = 1000;\r\n\r\n/**\r\n * Выполняет колбэк после CSS-перехода с fallback на setTimeout.\r\n * @param {Function} callback\r\n * @param {Element} element\r\n * @param {boolean} waitForTransition\r\n * @param {number} [timeoutMs]\r\n */\r\nconst executeAfterTransition = (callback, element, waitForTransition = true, timeoutMs) => {\r\n\tif (!element) {\r\n\t\texecute(callback);\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (!waitForTransition) {\r\n\t\texecute(callback);\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst duration = timeoutMs ?? getTransitionDurationFromElement(element) + 5;\r\n\tlet called = false;\r\n\r\n\tconst handler = (e) => {\r\n\t\tif (e.target === element) {\r\n\t\t\tcalled = true;\r\n\t\t\telement.removeEventListener(TRANSITION_END, handler);\r\n\t\t\texecute(callback);\r\n\t\t}\r\n\t};\r\n\r\n\telement.addEventListener(TRANSITION_END, handler);\r\n\tsetTimeout(() => {\r\n\t\tif (!called) triggerTransitionEnd(element);\r\n\t}, duration);\r\n};\r\n\r\n/**\r\n * Получает длительность CSS-перехода элемента в мс.\r\n * @param {Element} element\r\n * @returns {number}\r\n */\r\nconst getTransitionDurationFromElement = (element) => {\r\n\tif (!element) return 0;\r\n\tconst { transitionDuration, transitionDelay } = getComputedStyle(element);\r\n\r\n\tconst durations = transitionDuration.split(', ');\r\n\tconst delays = transitionDelay.split(', ');\r\n\r\n\tconst duration = Number.parseFloat(durations[0]) || 0;\r\n\tconst delay = Number.parseFloat(delays[0]) || 0;\r\n\r\n\treturn (duration + delay) * MILLISECONDS_MULTIPLIER;\r\n};\r\n\r\n/**\r\n * Принудительно вызывает событие перехода.\r\n * @param {Element} element\r\n */\r\nconst triggerTransitionEnd = (element) => {\r\n\tif (!element) return;\r\n\telement.dispatchEvent(new Event(TRANSITION_END));\r\n};\r\n\r\n/**\r\n * Принудительный рефлоу (для перезапуска анимаций).\r\n * @param {HTMLElement} element\r\n */\r\nconst reflow = (element) => {\r\n\t/* eslint-disable no-unused-expressions */\r\n\telement.offsetHeight;\r\n\t/* eslint-enable no-unused-expressions */\r\n};\r\n\r\n/**\r\n * Пустая функция-заглушка.\r\n */\r\nconst noop = () => {};\r\n\r\n/**\r\n * Генерирует случайную строку.\r\n * @param {number} length\r\n * @returns {string}\r\n */\r\nconst makeRandomString = (length = 7) => {\r\n\tconst chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\r\n\tlet result = '';\r\n\tfor (let i = 0; i < length; i++) {\r\n\t\tresult += chars.charAt(Math.floor(Math.random() * chars.length));\r\n\t}\r\n\treturn result;\r\n};\r\n\r\n/**\r\n * Транслитерация: en ⇄ ru.\r\n * @param {string} text\r\n * @param {boolean} [enToRu=true] - true: en→ru, false: ru→en\r\n * @returns {string}\r\n */\r\nconst transliterate = (text, enToRu = true) => {\r\n\tconst from = 'q w e r t y u i o p [ ] a s d f g h j k l ; \\' z x c v b n m , .'.split(' ');\r\n\tconst to = 'й ц у к е н г ш щ з х ъ ф ы в а п р о л д ж э я ч с м и т ь б ю'.split(' ');\r\n\r\n\tconst src = enToRu ? from : to;\r\n\tconst dst = enToRu ? to : from;\r\n\r\n\tlet result = text;\r\n\r\n\tfor (let i = 0; i < src.length; i++) {\r\n\t\tconst srcLower = src[i];\r\n\t\tconst dstLower = dst[i];\r\n\t\tconst srcUpper = src[i].toUpperCase();\r\n\t\tconst dstUpper = dst[i].toUpperCase();\r\n\r\n\t\tresult = result.split(srcLower).join(dstLower).split(srcUpper).join(dstUpper);\r\n\t}\r\n\r\n\treturn result;\r\n};\r\n\r\n/**\r\n * Получает следующий/предыдущий элемент с циклом.\r\n * @param {Array<Element>} list\r\n * @param {Element} active\r\n * @param {boolean} getNext\r\n * @param {boolean} cycle\r\n * @returns {Element}\r\n */\r\nconst getNextActiveElement = (list, active, getNext, cycle) => {\r\n\tconst len = list.length;\r\n\tlet idx = list.indexOf(active);\r\n\r\n\tif (idx === -1) return getNext || !cycle ? list[0] : list[len - 1];\r\n\r\n\tidx += getNext ? 1 : -1;\r\n\tif (cycle) idx = ((idx % len) + len) % len;\r\n\r\n\treturn list[Math.max(0, Math.min(idx, len - 1))];\r\n};\r\n\r\n/**\r\n * Возвращает самый глубокий последний дочерний элемент.\r\n * @param {Element} el\r\n * @returns {Element}\r\n */\r\nconst getDeepestLastChild = (el) => {\r\n\tlet node = el;\r\n\twhile (node.lastElementChild) node = node.lastElementChild;\r\n\treturn node;\r\n};\r\n\r\n/**\r\n * Проверяет, включён ли RTL.\r\n * @returns {boolean}\r\n */\r\nconst isRTL = () => document.documentElement.dir === 'rtl';\r\n\r\nfunction isMobileDevice() {\r\n\tconst userAgent = navigator.userAgent;\r\n\tconst isMobileUA = /Android|iPhone|iPad|iPod/i.test(userAgent);\r\n\tconst isTouchDevice = \"ontouchstart\" in window || navigator.maxTouchPoints > 0;\r\n\tconst isSmallScreen = window.innerWidth < 768;\r\n\tconst isHighDPI = window.devicePixelRatio >= 2;\r\n\r\n\tfunction detectIPadPro() {\r\n\t\tconst userAgent = navigator.userAgent;\r\n\t\tconst platform = navigator.platform;\r\n\r\n\t\tconst isIPad = /iPad/.test(userAgent) || (platform === 'MacIntel' && navigator.maxTouchPoints > 1);\r\n\r\n\t\tif (!isIPad) return { isiPadPro: false };\r\n\r\n\t\tconst screenWidth = window.screen.width * window.devicePixelRatio;\r\n\t\tconst screenHeight = window.screen.height * window.devicePixelRatio;\r\n\r\n\t\tconst proResolutions = [\r\n\t\t\t{ width: 2048, height: 2732 }, // 12.9\"\r\n\t\t\t{ width: 1668, height: 2388 }, // 11\"\r\n\t\t\t{ width: 1668, height: 2224 } // 10.5\"\r\n\t\t];\r\n\r\n\t\tconst isProResolution = proResolutions.some(res =>\r\n\t\t\t(screenWidth === res.width && screenHeight === res.height) ||\r\n\t\t\t(screenWidth === res.height && screenHeight === res.width)\r\n\t\t);\r\n\r\n\t\treturn {\r\n\t\t\tisiPadPro: isProResolution,\r\n\t\t\tscreenWidth: screenWidth,\r\n\t\t\tscreenHeight: screenHeight,\r\n\t\t\tuserAgent: userAgent,\r\n\t\t\tplatform: platform\r\n\t\t};\r\n\t}\r\n\r\n\treturn isMobileUA || (isTouchDevice && isSmallScreen && isHighDPI) || detectIPadPro().isiPadPro;\r\n}\r\n\r\n// экспорт\r\nexport {\r\n\tgetDeepestLastChild,\r\n\tisElement,\r\n\tisVisible,\r\n\tisDisabled,\r\n\tisObject,\r\n\tisEmptyObj,\r\n\tmergeDeepObject,\r\n\tremoveElementArray,\r\n\tnormalizeData,\r\n\texecute,\r\n\texecuteAfterTransition,\r\n\treflow,\r\n\tnoop,\r\n\tmakeRandomString,\r\n\tisRTL,\r\n\ttransliterate,\r\n\tgetElement,\r\n\tgetNextActiveElement,\r\n\tgetTransitionDurationFromElement,\r\n\ttriggerTransitionEnd,\r\n\tisMobileDevice\r\n};","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\r\n * --------------------------------------------------------------------------\r\n * Bootstrap util/scrollBar.js (рефакторинг)\r\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\r\n * --------------------------------------------------------------------------\r\n *\r\n * Улучшена читаемость, вынесены дублирующиеся операции,\r\n * добавлены JSDoc-комментарии, упрощена логика.\r\n */\r\n\r\nimport { Manipulator } from \"../dom/manipulator\";\r\nimport Selectors from \"../dom/selectors\";\r\nimport {isElement, isMobileDevice} from \"../functions\";\r\n\r\n/**\r\n * Константы\r\n */\r\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\r\nconst SELECTOR_STICKY_CONTENT = '.sticky-top';\r\nconst PROPERTY_PADDING = 'padding-right';\r\nconst PROPERTY_MARGIN = 'margin-right';\r\n\r\n/**\r\n * Вспомогательный класс для управления скроллбаром\r\n * Корректирует отступы при скрытии скролла, сохраняет исходные стили\r\n */\r\nclass ScrollBarHelper {\r\n\tconstructor() {\r\n\t\t// Не кэшируем body: при Turbo/partial navigation DOM может меняться.\r\n\t\t// Актуальный body берём через геттер.\r\n\t}\r\n\r\n\tget _element() {\r\n\t\treturn document.body;\r\n\t}\r\n\r\n\t/**\r\n\t * Возвращает ширину вертикального скроллбара\r\n\t * @returns {number}\r\n\t */\r\n\tgetWidth() {\r\n\t\tconst documentWidth = document.documentElement.clientWidth;\r\n\t\treturn Math.abs(window.innerWidth - documentWidth);\r\n\t}\r\n\r\n\t/**\r\n\t * Проверяет, есть ли скроллбар (ширина > 0)\r\n\t * @returns {boolean}\r\n\t */\r\n\tisOverflowing() {\r\n\t\treturn this.getWidth() > 0;\r\n\t}\r\n\r\n\t/**\r\n\t * Скрывает скроллбар и корректирует макет\r\n\t */\r\n\thide() {\r\n\t\tif (this.isOverflowing() && !isMobileDevice()) {\r\n\t\t\tconst width = this.getWidth();\r\n\t\t\tthis._disableOverflow();\r\n\r\n\t\t\tthis._setStyle(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, width, (value) => value + width);\r\n\t\t\tthis._setStyle(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, width, (value) => value - width);\r\n\t\t\tthis._setStyle(this._element, PROPERTY_PADDING, width, (value) => value + width);\r\n\t\t} else if (isMobileDevice()) {\r\n\t\t\tthis._disableOverflow();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Сбрасывает стили до исходных значений\r\n\t */\r\n\treset() {\r\n\t\tthis._resetStyle(this._element, \"overflow\");\r\n\t\tthis._resetStyle(this._element, PROPERTY_PADDING);\r\n\t\tthis._resetStyle(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);\r\n\t\tthis._resetStyle(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);\r\n\t}\r\n\r\n\t/**\r\n\t * Блокирует overflow у body\r\n\t * @private\r\n\t */\r\n\t_disableOverflow() {\r\n\t\tthis._saveInitialStyle(this._element, \"overflow\");\r\n\t\tthis._element.style.overflow = \"hidden\";\r\n\t}\r\n\r\n\t/**\r\n\t * Устанавливает стили с сохранением начальных значений\r\n\t * @param {string|HTMLElement} selector\r\n\t * @param {string} property\r\n\t * @param {number} width\r\n\t * @param {(value: number) => number} callback\r\n\t * @private\r\n\t */\r\n\t_setStyle(selector, property, width, callback) {\r\n\t\tconst apply = (element) => {\r\n\t\t\t// Исключаем элементы, у которых и так нет места под скролл\r\n\t\t\tif (element !== this._element && window.innerWidth > element.clientWidth + width) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tthis._saveInitialStyle(element, property);\r\n\r\n\t\t\tconst current = getComputedStyle(element).getPropertyValue(property);\r\n\t\t\tconst value = Number.parseFloat(current) || 0;\r\n\r\n\t\t\telement.style.setProperty(property, `${callback(value)}px`);\r\n\t\t};\r\n\r\n\t\tthis._applyToElements(selector, apply);\r\n\t}\r\n\r\n\t/**\r\n\t * Сбрасывает стили до сохранённых значений\r\n\t * @param {string|HTMLElement} selector\r\n\t * @param {string} property\r\n\t * @private\r\n\t */\r\n\t_resetStyle(selector, property) {\r\n\t\tconst apply = (element) => {\r\n\t\t\tconst value = Manipulator.get(element, property);\r\n\r\n\t\t\tif (value === null) {\r\n\t\t\t\telement.style.removeProperty(property);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tManipulator.remove(element, property);\r\n\t\t\telement.style.setProperty(property, value);\r\n\t\t};\r\n\r\n\t\tthis._applyToElements(selector, apply);\r\n\t}\r\n\r\n\t/**\r\n\t * Сохраняет текущее значение inline-стиля через Manipulator\r\n\t * (включая пустое значение, чтобы reset() работал стабильно).\r\n\t * @param {HTMLElement} element\r\n\t * @param {string} property\r\n\t * @private\r\n\t */\r\n\t_saveInitialStyle(element, property) {\r\n\t\t// Сохраняем только один раз, чтобы \"оригинал\" не перетирался\r\n\t\t// при повторных открытиях/закрытиях.\r\n\t\tif (Manipulator.get(element, property) !== null) return;\r\n\r\n\t\tconst value = element.style.getPropertyValue(property);\r\n\r\n\t\t// Важно: сохраняем даже пустую строку (если inline-стиля не было),\r\n\t\t// чтобы reset() мог корректно восстановить \"как было\".\r\n\t\tManipulator.set(element, property, value);\r\n\t}\r\n\r\n\t/**\r\n\t * Применяет callback к элементу или списку элементов\r\n\t * @param {string|HTMLElement} selector\r\n\t * @param {(element: HTMLElement) => void} callback\r\n\t * @private\r\n\t */\r\n\t_applyToElements(selector, callback) {\r\n\t\tif (isElement(selector)) {\r\n\t\t\tcallback(selector);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tSelectors.findAll(selector, this._element).forEach(callback);\r\n\t}\r\n}\r\n\r\nexport default ScrollBarHelper;","import { execute } from \"../functions\";\nimport Html from \"../components/templater\";\nimport { Classes } from \"../dom/manipulator\";\nimport ScrollBarHelper from \"./scrollbar\";\n\r\nconst NAME = 'backdrop';\r\nconst CLASS_NAME = 'vg-backdrop';\nconst CLASS_NAME_FADE = 'fade';\nconst CLASS_NAME_SHOW = 'show';\n\nconst backdropDelay = 150;\n\r\nclass Backdrop {\r\n\tstatic get _rootEl() {\r\n\t\treturn document.body;\r\n\t}\r\n\r\n\tstatic _scrollbar = new ScrollBarHelper();\r\n\tstatic _backdrop = null;\r\n\r\n\t/**\r\n\t * Показывает бэкдроп\r\n\t * @param {Function} callback - вызывается после отображения\r\n\t */\r\n\tstatic show(callback) {\r\n\t\tif (!this._backdrop) {\r\n\t\t\tthis._backdrop = this._rootEl.querySelector(`.${CLASS_NAME}`);\r\n\t\t}\r\n\r\n\t\tif (this._backdrop) {\r\n\t\t\tthis._backdrop.remove();\r\n\t\t}\r\n\r\n\t\tthis._append();\r\n\t\texecute(callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Скрывает бэкдроп\r\n\t * @param {Function} callback - вызывается после скрытия\r\n\t */\r\n\tstatic hide(callback) {\r\n\t\tif (!this._backdrop) {\r\n\t\t\t// На всякий случай проверим, есть ли элемент в DOM\r\n\t\t\tthis._backdrop = this._rootEl.querySelector(`.${CLASS_NAME}`);\r\n\t\t}\r\n\r\n\t\tif (!this._backdrop) return;\r\n\r\n\t\tthis._destroy().then(execute.bind(null, callback));\r\n\t}\r\n\r\n\t/**\r\n\t * Создаёт и добавляет элемент бэкдропа\r\n\t * @private\r\n\t */\r\n\tstatic _append() {\r\n\t\tconst html = Html('dom');\r\n\t\tthis._backdrop = html.div({ class: CLASS_NAME });\r\n\r\n\t\tthis._rootEl.appendChild(this._backdrop);\r\n\t\trequestAnimationFrame(() => {\n\t\t\tClasses.add(this._backdrop, CLASS_NAME_SHOW);\n\t\t\tsetTimeout(() => {\n\t\t\t\tClasses.add(this._backdrop, CLASS_NAME_FADE);\n\t\t\t}, backdropDelay);\n\t\t});\n\t}\n\r\n\t/**\r\n\t * Удаляет бэкдроп с анимацией\r\n\t * @returns {Promise}\r\n\t * @private\r\n\t */\r\n\tstatic _destroy() {\r\n\t\treturn new Promise((resolve) => {\r\n\t\t\tClasses.remove(this._backdrop, CLASS_NAME_FADE);\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tClasses.remove(this._backdrop, CLASS_NAME_SHOW);\r\n\t\t\t\tthis._backdrop.remove();\r\n\t\t\t\tthis._backdrop = null;\r\n\t\t\t\tthis._scrollbar.reset();\r\n\t\t\t\tresolve();\r\n\t\t\t}, backdropDelay);\r\n\t\t});\r\n\t}\r\n}\r\n\r\nexport default Backdrop;\n","const DEFAULT_OPTIONS = {\n\tenable: false,\n\tselector: '.vg-modal-content',\n\tthreshold: 4,\n\tresizeEdgeSize: 8,\n\tdebug: false,\n};\n\nclass VGModalDrag {\n\tconstructor(modalElement, dialogElement, options = {}) {\n\t\tthis._modalElement = modalElement;\n\t\tthis._dialogElement = dialogElement;\n\t\tthis._options = this._normalizeOptions(options);\n\t\tthis._pointerId = null;\n\t\tthis._dragTarget = null;\n\t\tthis._isDragging = false;\n\t\tthis._startX = 0;\n\t\tthis._startY = 0;\n\t\tthis._currentX = 0;\n\t\tthis._currentY = 0;\n\t\tthis._dialogStartLeft = 0;\n\t\tthis._dialogStartTop = 0;\n\t\tthis._dialogWidth = 0;\n\t\tthis._dialogHeight = 0;\n\t\tthis._isEnabled = false;\n\t\tthis._previousUserSelect = '';\n\t\tthis._previousTransition = '';\n\t\tthis._previousWillChange = '';\n\t\tthis._initialRect = null;\n\t\tthis._lockedIframes = [];\n\t\tthis._debugElement = null;\n\n\t\tthis._onPointerMove = this._onPointerMove.bind(this);\n\t\tthis._onPointerUp = this._onPointerUp.bind(this);\n\t\tthis._onPointerDown = this._onPointerDown.bind(this);\n\t\tthis._onNativeDragStart = this._onNativeDragStart.bind(this);\n\t}\n\n\tsetOptions(options = {}) {\n\t\tthis._options = this._normalizeOptions(options, this._options);\n\t\tthis._updateDebugOverlay();\n\t}\n\n\tenable() {\n\t\tif (!this._dialogElement || this._isEnabled) return;\n\n\t\tthis._updateDebugOverlay();\n\t\tthis._dialogElement.addEventListener('pointerdown', this._onPointerDown);\n\t\tthis._isEnabled = true;\n\t}\n\n\tdisable() {\n\t\tif (!this._dialogElement || !this._isEnabled) return;\n\n\t\tthis._dialogElement.removeEventListener('pointerdown', this._onPointerDown);\n\t\tdocument.removeEventListener('pointermove', this._onPointerMove);\n\t\tdocument.removeEventListener('pointerup', this._onPointerUp);\n\t\tdocument.removeEventListener('pointercancel', this._onPointerUp);\n\t\tdocument.removeEventListener('dragstart', this._onNativeDragStart, true);\n\t\tthis._dialogElement.style.touchAction = '';\n\t\tdocument.body.style.userSelect = this._previousUserSelect;\n\t\tthis._pointerId = null;\n\t\tthis._dragTarget = null;\n\t\tthis._isDragging = false;\n\t\tthis._initialRect = null;\n\t\tthis._unlockEmbeddedFrames();\n\t\tthis._restoreDragStyles();\n\t\tdelete this._modalElement.dataset.vgModalDragging;\n\t\tthis._setDebugVisibility(false);\n\t\tthis._isEnabled = false;\n\t}\n\n\tsyncPosition() {\n\t\tif (!this._isEnabled) return;\n\t\tif (!this._isPreparedForInteraction()) return;\n\n\t\tconst rect = this._dialogElement.getBoundingClientRect();\n\t\tconst width = this._dialogElement.offsetWidth || rect.width;\n\t\tconst height = this._dialogElement.offsetHeight || rect.height;\n\t\tconst currentLeft = Number.parseFloat(this._dialogElement.style.left);\n\t\tconst currentTop = Number.parseFloat(this._dialogElement.style.top);\n\t\tconst left = Number.isFinite(currentLeft) ? currentLeft : rect.left;\n\t\tconst top = Number.isFinite(currentTop) ? currentTop : rect.top;\n\t\tconst maxLeft = Math.max(0, window.innerWidth - width);\n\t\tconst maxTop = Math.max(0, window.innerHeight - height);\n\t\tconst nextLeft = Math.min(maxLeft, Math.max(0, left));\n\t\tconst nextTop = Math.min(maxTop, Math.max(0, top));\n\n\t\tthis._dialogElement.style.left = `${nextLeft}px`;\n\t\tthis._dialogElement.style.top = `${nextTop}px`;\n\t\tthis._updateDebugValues('synced');\n\t}\n\n\t_onPointerDown(event) {\n\t\tif (event.button !== 0) return;\n\n\t\tconst dragArea = this._resolveDragArea(event.target);\n\t\tif (!dragArea || !this._dialogElement.contains(dragArea)) return;\n\t\tif (this._isPointerOnResizeEdge(event)) return;\n\t\tif (event.target.closest('input, textarea, select, button, a, [contenteditable=\"true\"]')) return;\n\t\tif (dragArea && dragArea.closest('[data-vg-dismiss=\"modal\"]')) return;\n\n\t\tthis._pointerId = event.pointerId;\n\t\tthis._dragTarget = event.target;\n\t\tthis._isDragging = false;\n\t\tevent.preventDefault();\n\t\tthis._previousUserSelect = document.body.style.userSelect;\n\t\tdocument.body.style.userSelect = 'none';\n\t\tthis._initialRect = this._dialogElement.getBoundingClientRect();\n\t\tthis._dialogStartLeft = this._initialRect.left;\n\t\tthis._dialogStartTop = this._initialRect.top;\n\t\tthis._dialogWidth = this._initialRect.width;\n\t\tthis._dialogHeight = this._initialRect.height;\n\t\tthis._startX = event.clientX;\n\t\tthis._startY = event.clientY;\n\t\tthis._currentX = event.clientX;\n\t\tthis._currentY = event.clientY;\n\t\tthis._lockEmbeddedFrames();\n\t\tthis._modalElement.dataset.vgModalDragging = 'true';\n\t\tthis._setDebugVisibility(true);\n\t\tthis._updateDebugValues('armed');\n\n\t\tdocument.addEventListener('dragstart', this._onNativeDragStart, true);\n\n\t\tif (this._dialogElement && this._dialogElement.setPointerCapture) {\n\t\t\tthis._dialogElement.setPointerCapture(event.pointerId);\n\t\t}\n\n\t\tdocument.addEventListener('pointermove', this._onPointerMove);\n\t\tdocument.addEventListener('pointerup', this._onPointerUp);\n\t\tdocument.addEventListener('pointercancel', this._onPointerUp);\n\t}\n\n\t_onPointerMove(event) {\n\t\tif (event.pointerId !== this._pointerId) return;\n\n\t\tthis._currentX = event.clientX;\n\t\tthis._currentY = event.clientY;\n\t\tif (!this._isDragging) {\n\t\t\tconst deltaX = this._currentX - this._startX;\n\t\t\tconst deltaY = this._currentY - this._startY;\n\t\t\tconst distance = Math.hypot(deltaX, deltaY);\n\t\t\tif (distance < this._options.threshold) return;\n\n\t\t\tthis._isDragging = true;\n\t\t\tthis._dialogElement.style.touchAction = 'none';\n\t\t\tthis._applyDragStyles();\n\t\t\tthis._preparePosition(this._initialRect);\n\t\t\tevent.preventDefault();\n\t\t\tthis._updateDebugValues('dragging');\n\t\t}\n\t\tthis._applyDragPosition();\n\t}\n\n\t_onPointerUp(event) {\n\t\tif (event.pointerId !== this._pointerId) return;\n\n\t\tdocument.removeEventListener('pointermove', this._onPointerMove);\n\t\tdocument.removeEventListener('pointerup', this._onPointerUp);\n\t\tdocument.removeEventListener('pointercancel', this._onPointerUp);\n\t\tdocument.removeEventListener('dragstart', this._onNativeDragStart, true);\n\t\tif (this._isDragging) {\n\t\t\tthis._applyDragPosition();\n\t\t}\n\t\tthis._dialogElement.style.touchAction = '';\n\t\tdocument.body.style.userSelect = this._previousUserSelect;\n\n\t\tif (this._dialogElement && this._dialogElement.releasePointerCapture) {\n\t\t\tthis._dialogElement.releasePointerCapture(event.pointerId);\n\t\t}\n\n\t\tthis._pointerId = null;\n\t\tthis._dragTarget = null;\n\t\tthis._isDragging = false;\n\t\tthis._initialRect = null;\n\t\tthis._unlockEmbeddedFrames();\n\t\tthis._restoreDragStyles();\n\t\tdelete this._modalElement.dataset.vgModalDragging;\n\t\tthis._setDebugVisibility(this._options.debug);\n\t\tthis._updateDebugValues('idle');\n\t}\n\n\t_preparePosition(rect = null) {\n\t\tif (!this._dialogElement) return;\n\n\t\tconst currentRect = rect || this._dialogElement.getBoundingClientRect();\n\t\tthis._dialogElement.style.position = 'fixed';\n\t\tthis._dialogElement.style.margin = '0';\n\t\tthis._dialogElement.style.left = `${currentRect.left}px`;\n\t\tthis._dialogElement.style.top = `${currentRect.top}px`;\n\t\tthis._dialogElement.style.width = `${currentRect.width}px`;\n\t\tthis._dialogElement.style.height = `${currentRect.height}px`;\n\t\tthis._dialogElement.style.transform = 'none';\n\t}\n\n\t_isPreparedForInteraction() {\n\t\treturn this._dialogElement.style.position === 'fixed' && this._dialogElement.style.transform === 'none';\n\t}\n\n\t_isPointerOnResizeEdge(event) {\n\t\tconst rect = this._dialogElement.getBoundingClientRect();\n\t\tconst offsetX = event.clientX - rect.left;\n\t\tconst offsetY = event.clientY - rect.top;\n\t\tconst edgeSize = this._options.resizeEdgeSize;\n\n\t\tconst nearTop = offsetY >= 0 && offsetY <= edgeSize;\n\t\tconst nearBottom = offsetY <= rect.height && offsetY >= rect.height - edgeSize;\n\t\tconst nearLeft = offsetX >= 0 && offsetX <= edgeSize;\n\t\tconst nearRight = offsetX <= rect.width && offsetX >= rect.width - edgeSize;\n\n\t\treturn nearTop || nearBottom || nearLeft || nearRight;\n\t}\n\n\t_applyDragPosition() {\n\t\tif (this._pointerId === null || !this._isDragging) return;\n\n\t\tconst deltaX = this._currentX - this._startX;\n\t\tconst deltaY = this._currentY - this._startY;\n\t\tconst maxLeft = Math.max(0, window.innerWidth - this._dialogWidth);\n\t\tconst maxTop = Math.max(0, window.innerHeight - this._dialogHeight);\n\t\tconst nextLeft = Math.min(maxLeft, Math.max(0, this._dialogStartLeft + deltaX));\n\t\tconst nextTop = Math.min(maxTop, Math.max(0, this._dialogStartTop + deltaY));\n\n\t\tthis._dialogElement.style.left = `${nextLeft}px`;\n\t\tthis._dialogElement.style.top = `${nextTop}px`;\n\t\tthis._updateDebugValues('dragging');\n\t}\n\n\t_onNativeDragStart(event) {\n\t\tif (this._pointerId === null) return;\n\t\tevent.preventDefault();\n\t}\n\n\t_applyDragStyles() {\n\t\tthis._previousTransition = this._dialogElement.style.transition;\n\t\tthis._previousWillChange = this._dialogElement.style.willChange;\n\t\tthis._dialogElement.style.transition = 'none';\n\t\tthis._dialogElement.style.willChange = 'left, top';\n\t}\n\n\t_restoreDragStyles() {\n\t\tthis._dialogElement.style.transition = this._previousTransition;\n\t\tthis._dialogElement.style.willChange = this._previousWillChange;\n\t}\n\n\t_lockEmbeddedFrames() {\n\t\tif (!this._dialogElement || this._lockedIframes.length) return;\n\n\t\tconst iframes = this._dialogElement.querySelectorAll('iframe');\n\t\tfor (const frame of iframes) {\n\t\t\tthis._lockedIframes.push({\n\t\t\t\telement: frame,\n\t\t\t\tpointerEvents: frame.style.pointerEvents,\n\t\t\t});\n\t\t\tframe.style.pointerEvents = 'none';\n\t\t}\n\t}\n\n\t_unlockEmbeddedFrames() {\n\t\tif (!this._lockedIframes.length) return;\n\n\t\tfor (const item of this._lockedIframes) {\n\t\t\titem.element.style.pointerEvents = item.pointerEvents;\n\t\t}\n\t\tthis._lockedIframes = [];\n\t}\n\n\t_normalizeOptions(options, base = DEFAULT_OPTIONS) {\n\t\tconst merged = {...base, ...options};\n\t\tconst threshold = Number(merged.threshold);\n\t\tconst resizeEdgeSize = Number(merged.resizeEdgeSize);\n\t\tconst selector = typeof merged.selector === 'string' && merged.selector.trim()\n\t\t\t? merged.selector\n\t\t\t: DEFAULT_OPTIONS.selector;\n\n\t\treturn {\n\t\t\t...merged,\n\t\t\tselector,\n\t\t\tthreshold: Number.isFinite(threshold) && threshold >= 0 ? threshold : DEFAULT_OPTIONS.threshold,\n\t\t\tresizeEdgeSize: Number.isFinite(resizeEdgeSize) && resizeEdgeSize > 0 ? resizeEdgeSize : DEFAULT_OPTIONS.resizeEdgeSize,\n\t\t\tdebug: Boolean(merged.debug),\n\t\t};\n\t}\n\n\t_resolveDragArea(target) {\n\t\ttry {\n\t\t\treturn target.closest(this._options.selector);\n\t\t} catch (error) {\n\t\t\treturn target.closest(DEFAULT_OPTIONS.selector);\n\t\t}\n\t}\n\n\t_updateDebugOverlay() {\n\t\tif (!this._options.debug) {\n\t\t\tthis._setDebugVisibility(false);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._debugElement) {\n\t\t\tthis._debugElement = document.createElement('div');\n\t\t\tthis._debugElement.style.position = 'absolute';\n\t\t\tthis._debugElement.style.left = '170px';\n\t\t\tthis._debugElement.style.bottom = '8px';\n\t\t\tthis._debugElement.style.zIndex = '7';\n\t\t\tthis._debugElement.style.padding = '4px 6px';\n\t\t\tthis._debugElement.style.borderRadius = '4px';\n\t\t\tthis._debugElement.style.background = 'rgba(0, 0, 0, 0.72)';\n\t\t\tthis._debugElement.style.color = '#fff';\n\t\t\tthis._debugElement.style.fontSize = '11px';\n\t\t\tthis._debugElement.style.lineHeight = '1.3';\n\t\t\tthis._debugElement.style.pointerEvents = 'none';\n\t\t\tthis._dialogElement.append(this._debugElement);\n\t\t}\n\n\t\tthis._setDebugVisibility(true);\n\t\tthis._updateDebugValues(this._isDragging ? 'dragging' : 'idle');\n\t}\n\n\t_setDebugVisibility(visible) {\n\t\tif (!this._debugElement) return;\n\t\tthis._debugElement.style.display = visible ? 'block' : 'none';\n\t}\n\n\t_updateDebugValues(state = 'idle') {\n\t\tif (!this._debugElement || !this._options.debug) return;\n\n\t\tconst rect = this._dialogElement.getBoundingClientRect();\n\t\tthis._debugElement.textContent = `drag:${state} x:${Math.round(rect.left)} y:${Math.round(rect.top)} w:${Math.round(rect.width)} h:${Math.round(rect.height)}`;\n\t}\n}\n\nexport default VGModalDrag;\n","const DEFAULT_OPTIONS = {\r\n\tenable: false,\r\n\tminWidth: 300,\n\tminHeight: 160,\n\tedgeSize: 8,\n\tdebug: false,\n};\n\r\nconst DIRECTION_TO_CURSOR = {\r\n\tn: 'ns-resize',\r\n\ts: 'ns-resize',\r\n\te: 'ew-resize',\r\n\tw: 'ew-resize',\r\n\tne: 'nesw-resize',\r\n\tsw: 'nesw-resize',\r\n\tnw: 'nwse-resize',\r\n\tse: 'nwse-resize',\r\n};\r\n\r\nclass VGModalResize {\r\n\tconstructor(modalElement, dialogElement, options = {}) {\r\n\t\tthis._modalElement = modalElement;\r\n\t\tthis._dialogElement = dialogElement;\r\n\t\tthis._contentElement = this._dialogElement ? this._dialogElement.querySelector('.vg-modal-content') : null;\r\n\t\tthis._options = this._normalizeOptions(options);\r\n\t\tthis._pointerId = null;\r\n\t\tthis._direction = '';\r\n\t\tthis._startX = 0;\r\n\t\tthis._startY = 0;\r\n\t\tthis._currentX = 0;\r\n\t\tthis._currentY = 0;\r\n\t\tthis._startWidth = 0;\r\n\t\tthis._startHeight = 0;\r\n\t\tthis._startLeft = 0;\r\n\t\tthis._startTop = 0;\r\n\t\tthis._startRight = 0;\r\n\t\tthis._startBottom = 0;\r\n\t\tthis._isEnabled = false;\r\n\t\tthis._observer = null;\r\n\t\tthis._syncFrameId = null;\r\n\t\tthis._resizeFrameId = null;\r\n\t\tthis._lockedIframes = [];\r\n\t\tthis._debugElement = null;\r\n\t\tthis._previousMaxWidth = '';\r\n\t\tthis._previousMaxHeight = '';\r\n\t\tthis._previousPointerEvents = '';\r\n\t\tthis._previousMinHeight = '';\r\n\t\tthis._previousOverflow = '';\r\n\t\tthis._previousTransition = '';\r\n\t\tthis._previousWillChange = '';\r\n\t\tthis._previousContentHeight = '';\r\n\t\tthis._previousContentMaxHeight = '';\r\n\t\tthis._previousContentOverflow = '';\r\n\r\n\t\tthis._onPointerDown = this._onPointerDown.bind(this);\r\n\t\tthis._onPointerMove = this._onPointerMove.bind(this);\r\n\t\tthis._onPointerUp = this._onPointerUp.bind(this);\r\n\t\tthis._onPointerLeave = this._onPointerLeave.bind(this);\r\n\t\tthis._applyResizePosition = this._applyResizePosition.bind(this);\r\n\t}\r\n\r\n\tsetOptions(options = {}) {\r\n\t\tthis._options = this._normalizeOptions(options, this._options);\r\n\t\tthis._updateDebugOverlay();\r\n\t}\r\n\r\n\tenable() {\r\n\t\tif (!this._dialogElement || this._isEnabled) return;\r\n\r\n\t\tthis._updateDebugOverlay();\r\n\t\tthis._modalElement.addEventListener('pointermove', this._onPointerMove);\r\n\t\tthis._modalElement.addEventListener('pointerdown', this._onPointerDown);\r\n\t\tthis._modalElement.addEventListener('pointerleave', this._onPointerLeave);\r\n\t\tthis._startObserveSizeChanges();\r\n\t\tthis._isEnabled = true;\r\n\t}\r\n\r\n\tdisable() {\r\n\t\tif (!this._isEnabled) return;\r\n\r\n\t\tthis._modalElement.removeEventListener('pointermove', this._onPointerMove);\r\n\t\tthis._modalElement.removeEventListener('pointerdown', this._onPointerDown);\r\n\t\tthis._modalElement.removeEventListener('pointerleave', this._onPointerLeave);\r\n\t\tdocument.removeEventListener('pointermove', this._onPointerMove);\r\n\t\tdocument.removeEventListener('pointerup', this._onPointerUp);\r\n\t\tdocument.removeEventListener('pointercancel', this._onPointerUp);\r\n\t\tthis._cancelResizeFrame();\r\n\t\tthis._stopObserveSizeChanges();\r\n\t\tthis._pointerId = null;\r\n\t\tthis._direction = '';\r\n\t\tthis._dialogElement.style.cursor = '';\r\n\t\tdelete this._modalElement.dataset.vgModalResizing;\r\n\t\tthis._unlockEmbeddedFrames();\r\n\t\tthis._restoreResizeStyles();\r\n\t\tthis._setDebugVisibility(false);\r\n\t\tthis._isEnabled = false;\r\n\t}\r\n\r\n\tsyncToViewport() {\r\n\t\tif (this._modalElement && this._modalElement.dataset.vgModalDragging === 'true') return;\r\n\t\tif (!this._isPreparedForInteraction()) return;\r\n\r\n\t\tconst rect = this._dialogElement.getBoundingClientRect();\r\n\t\tconst currentWidth = this._dialogElement.offsetWidth || rect.width;\r\n\t\tconst currentHeight = this._dialogElement.offsetHeight || rect.height;\r\n\t\tconst currentLeftValue = Number.parseFloat(this._dialogElement.style.left);\r\n\t\tconst currentTopValue = Number.parseFloat(this._dialogElement.style.top);\r\n\t\tconst currentLeft = Number.isFinite(currentLeftValue) ? currentLeftValue : rect.left;\r\n\t\tconst currentTop = Number.isFinite(currentTopValue) ? currentTopValue : rect.top;\r\n\t\tconst maxWidth = window.innerWidth;\r\n\t\tconst maxHeight = window.innerHeight;\r\n\t\tconst width = Math.max(this._options.minWidth, Math.min(currentWidth, maxWidth));\r\n\t\tconst height = Math.max(this._options.minHeight, Math.min(currentHeight, maxHeight));\r\n\t\tconst maxLeft = Math.max(0, window.innerWidth - width);\r\n\t\tconst maxTop = Math.max(0, window.innerHeight - height);\r\n\t\tconst left = Math.min(maxLeft, Math.max(0, currentLeft));\r\n\t\tconst top = Math.min(maxTop, Math.max(0, currentTop));\r\n\r\n\t\tif (Math.abs(currentWidth - width) > 0.5) {\r\n\t\t\tthis._dialogElement.style.width = `${width}px`;\r\n\t\t}\r\n\r\n\t\tif (Math.abs(currentHeight - height) > 0.5) {\r\n\t\t\tthis._dialogElement.style.height = `${height}px`;\r\n\t\t}\r\n\r\n\t\tthis._dialogElement.style.left = `${left}px`;\r\n\t\tthis._dialogElement.style.top = `${top}px`;\r\n\t\tthis._updateDebugValues();\r\n\r\n\t}\r\n\r\n\t_onPointerDown(event) {\r\n\t\tif (event.button !== 0) return;\r\n\t\tif (event.defaultPrevented) return;\r\n\r\n\t\tconst direction = this._getDirectionFromPointer(event);\r\n\t\tif (!direction) return;\r\n\r\n\t\tevent.preventDefault();\r\n\t\tthis._pointerId = event.pointerId;\r\n\t\tthis._direction = direction;\r\n\r\n\t\tconst rect = this._dialogElement.getBoundingClientRect();\r\n\t\tthis._applyResizeStyles();\r\n\t\tthis._preparePosition(rect);\r\n\t\tthis._startX = event.clientX;\r\n\t\tthis._startY = event.clientY;\r\n\t\tthis._currentX = event.clientX;\r\n\t\tthis._currentY = event.clientY;\r\n\t\tthis._startWidth = rect.width;\r\n\t\tthis._startHeight = rect.height;\r\n\t\tthis._startLeft = rect.left;\r\n\t\tthis._startTop = rect.top;\r\n\t\tthis._startRight = rect.right;\r\n\t\tthis._startBottom = rect.bottom;\r\n\t\tthis._lockEmbeddedFrames();\r\n\t\tthis._modalElement.dataset.vgModalResizing = 'true';\r\n\t\tthis._setDebugVisibility(true);\r\n\t\tthis._updateDebugValues();\r\n\r\n\t\tdocument.addEventListener('pointermove', this._onPointerMove);\r\n\t\tdocument.addEventListener('pointerup', this._onPointerUp);\r\n\t\tdocument.addEventListener('pointercancel', this._onPointerUp);\r\n\t}\r\n\r\n\t_onPointerMove(event) {\r\n\t\tif (this._pointerId === null) {\r\n\t\t\tconst direction = this._getDirectionFromPointer(event);\r\n\t\t\tthis._dialogElement.style.cursor = direction ? DIRECTION_TO_CURSOR[direction] : '';\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (event.pointerId !== this._pointerId) return;\r\n\r\n\t\tthis._currentX = event.clientX;\r\n\t\tthis._currentY = event.clientY;\r\n\t\tif (this._resizeFrameId !== null) return;\r\n\t\tthis._resizeFrameId = window.requestAnimationFrame(this._applyResizePosition);\r\n\t}\r\n\r\n\t_applyResizePosition() {\r\n\t\tthis._resizeFrameId = null;\r\n\t\tif (this._pointerId === null) return;\r\n\r\n\t\tconst deltaX = this._currentX - this._startX;\r\n\t\tconst deltaY = this._currentY - this._startY;\r\n\t\tlet width = this._startWidth;\r\n\t\tlet height = this._startHeight;\r\n\t\tlet left = this._startLeft;\r\n\t\tlet top = this._startTop;\r\n\r\n\t\tif (this._direction.includes('e')) {\r\n\t\t\tconst maxWidth = Math.max(this._options.minWidth, window.innerWidth - this._startLeft);\r\n\t\t\twidth = Math.min(maxWidth, Math.max(this._options.minWidth, this._startWidth + deltaX));\r\n\t\t}\r\n\r\n\t\tif (this._direction.includes('s')) {\r\n\t\t\tconst maxHeight = Math.max(this._options.minHeight, window.innerHeight - this._startTop);\r\n\t\t\theight = Math.min(maxHeight, Math.max(this._options.minHeight, this._startHeight + deltaY));\r\n\t\t}\r\n\r\n\t\tif (this._direction.includes('w')) {\r\n\t\t\tconst maxLeft = this._startRight - this._options.minWidth;\r\n\t\t\tleft = Math.min(maxLeft, Math.max(0, this._startLeft + deltaX));\r\n\t\t\twidth = this._startRight - left;\r\n\t\t}\r\n\r\n\t\tif (this._direction.includes('n')) {\r\n\t\t\tconst maxTop = this._startBottom - this._options.minHeight;\r\n\t\t\ttop = Math.min(maxTop, Math.max(0, this._startTop + deltaY));\r\n\t\t\theight = this._startBottom - top;\r\n\t\t}\r\n\r\n\t\tthis._dialogElement.style.left = `${left}px`;\r\n\t\tthis._dialogElement.style.top = `${top}px`;\r\n\t\tthis._dialogElement.style.width = `${width}px`;\r\n\t\tthis._dialogElement.style.height = `${height}px`;\r\n\t\tthis._updateDebugValues();\r\n\r\n\t}\r\n\r\n\t_onPointerUp(event) {\r\n\t\tif (event.pointerId !== this._pointerId) return;\r\n\r\n\t\tdocument.removeEventListener('pointermove', this._onPointerMove);\r\n\t\tdocument.removeEventListener('pointerup', this._onPointerUp);\r\n\t\tdocument.removeEventListener('pointercancel', this._onPointerUp);\r\n\t\tthis._cancelResizeFrame();\r\n\t\tthis._applyResizePosition();\r\n\t\tthis._pointerId = null;\n\t\tthis._direction = '';\n\t\tdelete this._modalElement.dataset.vgModalResizing;\n\t\tthis._unlockEmbeddedFrames();\n\t\tthis._setDebugVisibility(this._options.debug);\n\t\tthis._updateDebugValues();\n\t}\n\r\n\t_onPointerLeave() {\r\n\t\tif (this._pointerId !== null) return;\r\n\t\tthis._dialogElement.style.cursor = '';\r\n\t}\r\n\r\n\t_getDirectionFromPointer(event) {\r\n\t\tconst rect = this._dialogElement.getBoundingClientRect();\r\n\t\tconst offsetX = event.clientX - rect.left;\r\n\t\tconst offsetY = event.clientY - rect.top;\r\n\t\tconst edgeSize = this._options.edgeSize;\r\n\t\tconst insideDialog = offsetX >= 0 && offsetX <= rect.width && offsetY >= 0 && offsetY <= rect.height;\r\n\t\tif (!insideDialog) return '';\r\n\r\n\t\tconst nearTop = offsetY >= 0 && offsetY <= edgeSize;\r\n\t\tconst nearBottom = offsetY <= rect.height && offsetY >= rect.height - edgeSize;\r\n\t\tconst nearLeft = offsetX >= 0 && offsetX <= edgeSize;\r\n\t\tconst nearRight = offsetX <= rect.width && offsetX >= rect.width - edgeSize;\r\n\r\n\t\tif (nearTop && nearLeft) return 'nw';\r\n\t\tif (nearTop && nearRight) return 'ne';\r\n\t\tif (nearBottom && nearLeft) return 'sw';\r\n\t\tif (nearBottom && nearRight) return 'se';\r\n\t\tif (nearTop) return 'n';\r\n\t\tif (nearBottom) return 's';\r\n\t\tif (nearLeft) return 'w';\r\n\t\tif (nearRight) return 'e';\r\n\r\n\t\treturn '';\r\n\t}\r\n\r\n\t_preparePosition(rect) {\r\n\t\tthis._dialogElement.style.position = 'fixed';\r\n\t\tthis._dialogElement.style.margin = '0';\r\n\t\tthis._dialogElement.style.left = `${rect.left}px`;\r\n\t\tthis._dialogElement.style.top = `${rect.top}px`;\r\n\t\tthis._dialogElement.style.width = `${rect.width}px`;\r\n\t\tthis._dialogElement.style.height = `${rect.height}px`;\r\n\t\tthis._dialogElement.style.transform = 'none';\r\n\t}\r\n\r\n\t_isPreparedForInteraction() {\r\n\t\treturn this._dialogElement.style.position === 'fixed' && this._dialogElement.style.transform === 'none';\r\n\t}\r\n\r\n\t_startObserveSizeChanges() {\r\n\t\tif (typeof ResizeObserver === 'undefined' || this._observer) return;\r\n\r\n\t\tthis._observer = new ResizeObserver(() => {\r\n\t\t\tif (this._pointerId !== null) return;\r\n\t\t\tif (this._modalElement && this._modalElement.dataset.vgModalDragging === 'true') return;\r\n\t\t\tif (this._syncFrameId !== null) return;\r\n\r\n\t\t\tthis._syncFrameId = window.requestAnimationFrame(() => {\r\n\t\t\t\tthis._syncFrameId = null;\r\n\t\t\t\tthis.syncToViewport();\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\tthis._observer.observe(this._dialogElement);\r\n\t}\r\n\r\n\t_stopObserveSizeChanges() {\r\n\t\tif (this._observer) {\r\n\t\t\tthis._observer.disconnect();\r\n\t\t\tthis._observer = null;\r\n\t\t}\r\n\r\n\t\tif (this._syncFrameId !== null) {\r\n\t\t\twindow.cancelAnimationFrame(this._syncFrameId);\r\n\t\t\tthis._syncFrameId = null;\r\n\t\t}\r\n\t}\r\n\r\n\t_applyResizeStyles() {\r\n\t\tthis._previousMaxWidth = this._dialogElement.style.maxWidth;\r\n\t\tthis._previousMaxHeight = this._dialogElement.style.maxHeight;\r\n\t\tthis._previousPointerEvents = this._dialogElement.style.pointerEvents;\r\n\t\tthis._previousMinHeight = this._dialogElement.style.minHeight;\r\n\t\tthis._previousOverflow = this._dialogElement.style.overflow;\r\n\t\tthis._previousTransition = this._dialogElement.style.transition;\r\n\t\tthis._previousWillChange = this._dialogElement.style.willChange;\r\n\r\n\t\tthis._dialogElement.style.maxWidth = 'none';\r\n\t\tthis._dialogElement.style.maxHeight = 'none';\r\n\t\tthis._dialogElement.style.pointerEvents = 'auto';\r\n\t\tthis._dialogElement.style.minHeight = `${this._options.minHeight}px`;\r\n\t\tthis._dialogElement.style.overflow = 'hidden';\r\n\t\tthis._dialogElement.style.transition = 'none';\r\n\t\tthis._dialogElement.style.willChange = 'left, top, width, height';\r\n\r\n\t\tif (this._contentElement) {\r\n\t\t\tthis._previousContentHeight = this._contentElement.style.height;\r\n\t\t\tthis._previousContentMaxHeight = this._contentElement.style.maxHeight;\r\n\t\t\tthis._previousContentOverflow = this._contentElement.style.overflow;\r\n\t\t\tthis._contentElement.style.height = '100%';\r\n\t\t\tthis._contentElement.style.maxHeight = '100%';\r\n\t\t\tthis._contentElement.style.overflow = 'auto';\r\n\t\t}\r\n\t}\r\n\r\n\t_restoreResizeStyles() {\n\t\tthis._dialogElement.style.maxWidth = this._previousMaxWidth;\n\t\tthis._dialogElement.style.maxHeight = this._previousMaxHeight;\n\t\tthis._dialogElement.style.pointerEvents = this._previousPointerEvents;\n\t\tthis._dialogElement.style.minHeight = this._previousMinHeight;\r\n\t\tthis._dialogElement.style.overflow = this._previousOverflow;\r\n\t\tthis._dialogElement.style.transition = this._previousTransition;\r\n\t\tthis._dialogElement.style.willChange = this._previousWillChange;\r\n\r\n\t\tif (this._contentElement) {\n\t\t\tthis._contentElement.style.height = this._previousContentHeight;\n\t\t\tthis._contentElement.style.maxHeight = this._previousContentMaxHeight;\n\t\t\tthis._contentElement.style.overflow = this._previousContentOverflow;\n\t\t}\n\t}\n\n\t_normalizeOptions(options, base = DEFAULT_OPTIONS) {\n\t\tconst merged = {...base, ...options};\r\n\t\tconst minWidth = Number(merged.minWidth);\r\n\t\tconst minHeight = Number(merged.minHeight);\r\n\t\tconst edgeSize = Number(merged.edgeSize);\r\n\r\n\t\treturn {\r\n\t\t\t...merged,\r\n\t\t\tminWidth: Number.isFinite(minWidth) && minWidth > 0 ? minWidth : DEFAULT_OPTIONS.minWidth,\r\n\t\t\tminHeight: Number.isFinite(minHeight) && minHeight > 0 ? minHeight : DEFAULT_OPTIONS.minHeight,\r\n\t\t\tedgeSize: Number.isFinite(edgeSize) && edgeSize > 0 ? edgeSize : DEFAULT_OPTIONS.edgeSize,\r\n\t\t\tdebug: Boolean(merged.debug),\r\n\t\t};\r\n\t}\r\n\r\n\t_cancelResizeFrame() {\r\n\t\tif (this._resizeFrameId === null) return;\r\n\t\twindow.cancelAnimationFrame(this._resizeFrameId);\r\n\t\tthis._resizeFrameId = null;\r\n\t}\r\n\r\n\t_lockEmbeddedFrames() {\r\n\t\tif (!this._dialogElement || this._lockedIframes.length) return;\r\n\r\n\t\tconst iframes = this._dialogElement.querySelectorAll('iframe');\r\n\t\tfor (const frame of iframes) {\r\n\t\t\tthis._lockedIframes.push({\r\n\t\t\t\telement: frame,\r\n\t\t\t\tpointerEvents: frame.style.pointerEvents,\r\n\t\t\t});\r\n\t\t\tframe.style.pointerEvents = 'none';\r\n\t\t}\r\n\t}\r\n\r\n\t_unlockEmbeddedFrames() {\r\n\t\tif (!this._lockedIframes.length) return;\r\n\r\n\t\tfor (const item of this._lockedIframes) {\r\n\t\t\titem.element.style.pointerEvents = item.pointerEvents;\r\n\t\t}\r\n\t\tthis._lockedIframes = [];\r\n\t}\r\n\r\n\t_updateDebugOverlay() {\r\n\t\tif (!this._options.debug) {\r\n\t\t\tthis._setDebugVisibility(false);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!this._debugElement) {\r\n\t\t\tthis._debugElement = document.createElement('div');\r\n\t\t\tthis._debugElement.style.position = 'absolute';\r\n\t\t\tthis._debugElement.style.left = '8px';\r\n\t\t\tthis._debugElement.style.bottom = '8px';\r\n\t\t\tthis._debugElement.style.zIndex = '6';\r\n\t\t\tthis._debugElement.style.padding = '4px 6px';\r\n\t\t\tthis._debugElement.style.borderRadius = '4px';\r\n\t\t\tthis._debugElement.style.background = 'rgba(0, 0, 0, 0.72)';\r\n\t\t\tthis._debugElement.style.color = '#fff';\r\n\t\t\tthis._debugElement.style.fontSize = '11px';\r\n\t\t\tthis._debugElement.style.lineHeight = '1.3';\r\n\t\t\tthis._debugElement.style.pointerEvents = 'none';\r\n\t\t\tthis._dialogElement.append(this._debugElement);\r\n\t\t}\r\n\r\n\t\tthis._setDebugVisibility(true);\n\t\tthis._updateDebugValues();\n\t}\n\r\n\t_setDebugVisibility(visible) {\r\n\t\tif (!this._debugElement) return;\r\n\t\tthis._debugElement.style.display = visible ? 'block' : 'none';\r\n\t}\r\n\r\n\t_updateDebugValues() {\r\n\t\tif (!this._debugElement || !this._options.debug) return;\r\n\r\n\t\tconst rect = this._dialogElement.getBoundingClientRect();\r\n\t\tthis._debugElement.textContent = `w:${Math.round(rect.width)} h:${Math.round(rect.height)} x:${Math.round(rect.left)} y:${Math.round(rect.top)}`;\r\n\t}\r\n}\r\n\r\nexport default VGModalResize;\r\n","import BaseModule from \"../../base-module\";\r\nimport ScrollBarHelper from \"../../../utils/js/components/scrollbar\";\r\nimport Backdrop from \"../../../utils/js/components/backdrop\";\r\nimport Selectors from \"../../../utils/js/dom/selectors\";\r\nimport EventHandler from \"../../../utils/js/dom/event\";\r\nimport {Manipulator} from \"../../../utils/js/dom/manipulator\";\r\nimport {execute, isDisabled, isRTL, mergeDeepObject, reflow} from \"../../../utils/js/functions\";\nimport {dismissTrigger} from \"../../module-fn\";\nimport VGModalDrag from \"./vgmodal.drag\";\nimport VGModalResize from \"./vgmodal.resize\";\n\r\n/**\r\n * Constants\r\n */\r\nconst NAME = 'modal';\r\nconst NAME_KEY = 'vg.modal';\r\n\r\nconst ESCAPE_KEY = 'Escape';\r\n\r\nconst OPEN_SELECTOR = '.vg-modal.show:not([data-vg-persistent=\"true\"])';\nconst SELECTOR_DIALOG = '.vg-modal-dialog';\r\nconst SELECTOR_MODAL_BODY = '.vg-modal-body';\r\nconst SELECTOR_DATA_TOGGLE = '[data-vg-toggle=\"modal\"]';\r\n\r\nconst CLASS_NAME_OPEN = 'vg-modal-open';\nconst CLASS_NAME_SHOW = 'show';\nconst CLASS_NAME_FADE = 'fade';\nconst CLASS_NAME_STATIC = 'vg-modal-static';\n\r\nconst EVENT_KEY_HIDE = `${NAME_KEY}.hide`;\r\nconst EVENT_KEY_HIDDEN = `${NAME_KEY}.hidden`;\r\nconst EVENT_KEY_SHOW = `${NAME_KEY}.show`;\r\nconst EVENT_KEY_SHOWN = `${NAME_KEY}.shown`;\r\nconst EVENT_KEY_RESIZE = `${NAME_KEY}.resize`;\r\nconst EVENT_KEY_LOADED = `${NAME_KEY}.loaded`;\r\n\r\nconst EVENT_KEY_KEYDOWN_DISMISS = `keydown.dismiss.${NAME_KEY}`;\r\nconst EVENT_KEY_HIDE_PREVENTED = `hidePrevented.${NAME_KEY}`;\r\nconst EVENT_KEY_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;\r\nconst EVENT_KEY_MOUSEDOWN_DISMISS = `mousedown.dismiss${NAME_KEY}`;\r\nconst EVENT_KEY_CLICK_DISMISS = `click.dismiss${NAME_KEY}`;\r\nconst EVENT_KEY_DOM_LOADED_DATA_API = `DOMContentLoaded.${NAME_KEY}.data.api`;\r\nconst EVENT_KEY_POPSTATE_DATA_API = `popstate.${NAME_KEY}.data.api`;\r\n\r\nclass VGModal extends BaseModule {\r\n\tconstructor(element, params = {}) {\r\n\t\tsuper(element, params);\r\n\r\n\t\tthis._interactionDefaults = {\r\n\t\t\tdrag: {\r\n\t\t\t\tenable: false,\r\n\t\t\t\tselector: '.vg-modal-content',\r\n\t\t\t\tthreshold: 4,\r\n\t\t\t\tresizeEdgeSize: 8,\r\n\t\t\t\tdebug: false,\r\n\t\t\t},\r\n\t\t\tresize: {\n\t\t\t\tenable: false,\n\t\t\t\tedgeSize: 8,\n\t\t\t\tminWidth: 300,\n\t\t\t\tminHeight: 160,\n\t\t\t\tdebug: false,\n\t\t\t},\n\t\t};\n\r\n\t\tthis._params = this._getParams(element, mergeDeepObject({\n\t\t\tbackdrop: true,\n\t\t\tpersistent: false,\n\t\t\tfocus: true,\n\t\t\tkeyboard: true,\n\t\t\tfields: [],\r\n\t\t\thash: false,\r\n\t\t\tcentered: false,\r\n\t\t\tdismiss: true,\r\n\t\t\tresize: {\n\t\t\t\tenable: false,\n\t\t\t\tedgeSize: 8,\n\t\t\t\tminWidth: 300,\n\t\t\t\tminHeight: 160,\n\t\t\t\tdebug: false,\n\t\t\t},\n\t\t\tstate: {\r\n\t\t\t\tenable: true,\r\n\t\t\t\tkey: '',\r\n\t\t\t},\r\n\t\t\tdrag: {\r\n\t\t\t\tenable: false,\r\n\t\t\t\tselector: '.vg-modal-content',\r\n\t\t\t\tthreshold: 4,\r\n\t\t\t\tresizeEdgeSize: 8,\r\n\t\t\t\tdebug: false,\r\n\t\t\t},\r\n\t\t\tsizes: {\r\n\t\t\t\twidth: '',\r\n\t\t\t\theight: '',\r\n\t\t\t},\r\n\t\t\tajax: {\r\n\t\t\t\troute: '',\r\n\t\t\t\ttarget: '',\r\n\t\t\t\tmethod: 'get',\r\n\t\t\t\tloader: false,\r\n\t\t\t\tonce: false,\r\n\t\t\t\toutput: true,\r\n\t\t\t},\r\n\t\t\tanimation: {\r\n\t\t\t\tenable: false,\r\n\t\t\t\tin: 'animate__rollIn',\r\n\t\t\t\tout: 'animate__rollOut',\r\n\t\t\t\tdelay: 100,\r\n\t\t\t\tduration: 800,\r\n\t\t\t},\r\n\t\t\tclasses: {\r\n\t\t\t\tgeneral: 'vg-modal',\r\n\t\t\t\tdialog: 'vg-modal-dialog',\r\n\t\t\t\tcontent: 'vg-modal-content',\r\n\t\t\t\theader: 'vg-modal-header',\r\n\t\t\t\ttitle: 'vg-modal-title',\r\n\t\t\t\tbody: 'vg-modal-body',\r\n\t\t\t\tfooter: 'vg-modal-footer',\r\n\t\t\t}\r\n\t\t}, params));\r\n\r\n\t\tthis._button = null;\r\n\t\tthis._dialog = Selectors.find(SELECTOR_DIALOG, this._element);\r\n\t\tthis._content = Selectors.find('.vg-modal-content', this._dialog);\r\n\t\tthis._isShown = false;\r\n\t\tthis._isTransitioning = false;\n\t\tthis._scrollBar = new ScrollBarHelper();\n\t\tthis._dragHandler = new VGModalDrag(this._element, this._dialog);\n\t\tthis._resizeHandler = new VGModalResize(this._element, this._dialog);\n\t\tthis._interactionConfig = this._resolveInteractionConfig();\n\t\tthis._dragHandler.setOptions(this._interactionConfig.drag);\n\t\tthis._resizeHandler.setOptions(this._interactionConfig.resize);\n\r\n\t\tthis._addEventListeners();\r\n\t\tthis._dismissElement();\r\n\r\n\t\tthis._params.animation.delay = !this._params.animation.enable ? 0 : this._params.animation.delay;\n\t\tthis._animation(this._element, VGModal.NAME_KEY, this._params.animation);\n\t\tif (this._params.persistent) {\n\t\t\tthis._element.setAttribute('data-vg-persistent', 'true');\n\t\t} else {\n\t\t\tthis._element.removeAttribute('data-vg-persistent');\n\t\t}\n\t}\n\r\n\tstatic get NAME() {\r\n\t\treturn NAME;\r\n\t}\r\n\r\n\tstatic get NAME_KEY() {\r\n\t\treturn NAME_KEY;\r\n\t}\r\n\r\n\tstatic init(element, params, callback) {\r\n\t\tVGModal.build(element, params, callback);\r\n\t}\r\n\r\n\tstatic build(id, params, callback) {\r\n\t\tif (typeof id !== \"string\") return;\r\n\r\n\t\tlet _element = document.createElement('div');\r\n\t\t_element.classList.add('vg-modal');\r\n\t\t_element.classList.add('fade');\r\n\t\t_element.id = id;\r\n\r\n\t\tlet dialog = document.createElement('div');\r\n\t\tdialog.classList.add('vg-modal-dialog');\r\n\r\n\t\tif ('centered' in params && params.centered) {\r\n\t\t\tdialog.classList.add('vg-modal-dialog-centered');\r\n\t\t}\r\n\r\n\t\tlet content = document.createElement('div');\r\n\t\tcontent.classList.add('vg-modal-content');\r\n\r\n\t\tif ('dismiss' in params && params.dismiss) {\r\n\t\t\tlet btnClose = document.createElement('button');\r\n\t\t\tManipulator.set(btnClose, 'type', 'button');\r\n\t\t\tManipulator.set(btnClose, 'data-vg-dismiss', 'modal');\r\n\t\t\tManipulator.set(btnClose, 'data-vg-target', '#' + id);\r\n\t\t\tManipulator.set(btnClose, 'aria-label', 'close');\r\n\t\t\tbtnClose.classList.add('vg-btn-close');\r\n\r\n\t\t\tcontent.append(btnClose);\r\n\t\t}\r\n\r\n\t\tlet body = document.createElement('div');\r\n\t\tbody.classList.add('vg-modal-body');\r\n\r\n\t\tcontent.append(body);\r\n\t\tdialog.append(content);\r\n\t\t_element.append(dialog);\r\n\r\n\t\tdocument.body.append(_element);\r\n\r\n\t\tconst modal = VGModal.getOrCreateInstance(_element, params);\r\n\t\tif ('animation' in params) {\r\n\t\t\tmodal._animation(_element, VGModal.NAME_KEY, params.animation);\r\n\t\t}\r\n\r\n\t\tif ('sizes' in modal._params && modal._params.sizes.width) {\r\n\t\t\t_element.style.setProperty('--vg-modal-width', modal._params.sizes.width);\r\n\t\t}\r\n\r\n\t\tif ('sizes' in modal._params && modal._params.sizes.height) {\r\n\t\t\tdialog.style.height = modal._params.sizes.height;\r\n\t\t}\r\n\r\n\t\texecute(callback, [modal]);\r\n\r\n\t\treturn modal;\r\n\t}\r\n\r\n\ttoggle(relatedTarget) {\r\n\t\treturn !this._isShown ? this.show(relatedTarget) : this.hide();\r\n\t}\r\n\r\n\tshow(relatedTarget) {\r\n\t\tif (isDisabled(this._element)) return;\r\n\r\n\t\tif (this._params.ajax.route && this._params.ajax.target && !this._params.ajax.once) {\r\n\t\t\tconst ajaxTargetContent = Selectors.find(this._params.ajax.target, this._element);\r\n\t\t\tif (ajaxTargetContent) ajaxTargetContent.innerHTML = '';\r\n\t\t}\r\n\r\n\t\tconst showEvent = EventHandler.trigger(this._element, EVENT_KEY_SHOW, { relatedTarget })\r\n\t\tif (showEvent.defaultPrevented) return;\r\n\r\n\t\tthis._isShown = true;\r\n\t\tthis._isTransitioning = true;\r\n\r\n\t\tif (this._params.hash) {\r\n\t\t\twindow.history.pushState(null, \"vg-sidebar-open\", \"#\" + this._element.id);\r\n\r\n\t\t\tEventHandler.on(window, EVENT_KEY_POPSTATE_DATA_API, () => {\r\n\t\t\t\tthis.hide();\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tthis._scrollBar.hide();\n\n\t\tdocument.body.classList.add(CLASS_NAME_OPEN);\n\r\n\t\tthis._addFieldsInModal(relatedTarget);\r\n\t\tthis._adjustDialog();\r\n\r\n\t\tif (this._params.backdrop) {\n\t\t\tBackdrop.show(() => {\n\t\t\t\tconst backdrop = Selectors.find('.vg-backdrop');\n\t\t\t\tif (backdrop) {\n\t\t\t\t\tEventHandler.one(backdrop, 'mousedown.vg.backdrop', () => {\n\t\t\t\t\t\tthis.hide();\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis._showElement(relatedTarget);\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tthis._showElement(relatedTarget);\n\t}\r\n\r\n\thide(openedModals = [], isLeaveBackDrop = false) {\r\n\t\tif (!this._isShown || this._isTransitioning) return;\r\n\r\n\t\tconst hideEvent = EventHandler.trigger(this._element, EVENT_KEY_HIDE);\r\n\t\tif (hideEvent.defaultPrevented) return;\r\n\r\n\t\tthis._isShown = false;\n\t\tthis._isTransitioning = true;\n\n\t\tsetTimeout(() => {\n\t\t\tthis._element.classList.remove(CLASS_NAME_SHOW);\n\t\t\tthis._queueCallback(() => this._hideModal(openedModals, isLeaveBackDrop), this._element, this._isAnimatedFade());\n\t\t}, this._params.animation.delay);\r\n\t}\r\n\r\n\t_hideModal(openedModals, isLeaveBackDrop) {\n\t\tif (!isLeaveBackDrop) {\n\t\t\tthis._saveInteractionState();\n\t\t\tthis._disableInteractionHandlers();\n\t\t\tthis._element.style.display = 'none';\n\t\t\tthis._element.removeAttribute('aria-modal');\n\t\t\tthis._element.removeAttribute('role');\n\t\t\tthis._isTransitioning = false;\n\n\t\t\tconst remainingOpenModals = Selectors.findAll(OPEN_SELECTOR).filter(modal => modal !== this._element);\n\t\t\tif (remainingOpenModals.length || openedModals.length) {\n\t\t\t\tEventHandler.trigger(this._element, EVENT_KEY_HIDDEN);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdocument.body.classList.remove(CLASS_NAME_OPEN);\n\n\t\t\tif (this._params.hash) {\n\t\t\t\thistory.pushState(\"\", document.title, window.location.pathname + window.location.search);\n\t\t\t}\n\r\n\t\t\tif (!this._params.backdrop) {\n\t\t\t\tthis._resetAdjustments();\n\t\t\t\tthis._scrollBar.reset();\n\n\t\t\t\tEventHandler.trigger(this._element, EVENT_KEY_HIDDEN);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tBackdrop.hide(() => {\n\t\t\t\tthis._resetAdjustments();\n\t\t\t\tthis._scrollBar.reset();\n\n\t\t\t\tEventHandler.trigger(this._element, EVENT_KEY_HIDDEN);\n\t\t\t})\n\t\t}\r\n\t}\r\n\r\n\t_showElement(relatedTarget) {\r\n\t\tif (!document.body.contains(this._element)) {\r\n\t\t\tdocument.body.append(this._element);\r\n\t\t}\r\n\r\n\t\tthis._element.style.display = 'block';\r\n\t\tthis._element.setAttribute('aria-modal', true);\r\n\t\tthis._element.setAttribute('role', 'dialog');\r\n\t\tthis._element.scrollTop = 0;\r\n\r\n\t\tconst modalBody = Selectors.find(SELECTOR_MODAL_BODY, this._dialog);\r\n\t\tif (modalBody) {\r\n\t\t\tmodalBody.scrollTop = 0;\r\n\t\t}\r\n\r\n\t\treflow(this._element);\r\n\r\n\t\tthis._element.classList.add(CLASS_NAME_SHOW);\r\n\t\tthis._toggleInteractionHandlers();\r\n\r\n\t\tconst transitionComplete = () => {\n\t\t\tthis._isTransitioning = false;\n\t\t\tEventHandler.trigger(this._element, EVENT_KEY_SHOWN, {\n\t\t\t\trelatedTarget\n\t\t\t});\n\t\t\tthis._syncInteractiveBounds();\n\n\t\t\tthis._params = this._getParams(relatedTarget, this._params);\n\t\t\tthis._restoreInteractionState();\n\t\t\tthis._syncInteractiveBounds();\n\t\t\tthis._route((status, data) => {\n\t\t\t\tEventHandler.trigger(this._element, EVENT_KEY_LOADED, {stats: status, data: data, relatedTarget: relatedTarget});\n\t\t\t\tthis._syncInteractiveBounds();\n\t\t\t});\n\t\t}\n\r\n\t\tthis._queueCallback(transitionComplete, this._dialog, this._isAnimatedFade())\r\n\t}\r\n\r\n\t_bindInteractionHandlers() {\n\t\tthis._dragHandler.setOptions(this._interactionConfig.drag);\n\t\tthis._resizeHandler.setOptions(this._interactionConfig.resize);\n\t}\n\t_toggleInteractionHandlers() {\n\t\tthis._interactionConfig = this._resolveInteractionConfig();\n\t\tthis._bindInteractionHandlers();\n\r\n\t\tif (this._interactionConfig.drag.enable) {\r\n\t\t\tthis._dragHandler.enable();\r\n\t\t} else {\r\n\t\t\tthis._dragHandler.disable();\r\n\t\t}\r\n\r\n\t\tif (this._interactionConfig.resize.enable) {\n\t\t\tthis._resizeHandler.enable();\n\t\t} else {\n\t\t\tthis._resizeHandler.disable();\n\t\t}\n\t}\n\n\t_disableInteractionHandlers() {\n\t\tthis._dragHandler.disable();\n\t\tthis._resizeHandler.disable();\n\t}\n\r\n\t_syncInteractiveBounds() {\r\n\t\tif (this._interactionConfig.resize.enable) {\r\n\t\t\tthis._resizeHandler.syncToViewport();\r\n\t\t}\r\n\r\n\t\tif (this._interactionConfig.drag.enable) {\n\t\t\tthis._dragHandler.syncPosition();\n\t\t}\n\t}\n\r\n\t_resolveInteractionConfig() {\n\t\treturn {\n\t\t\tdrag: this._normalizeInteractionParams(this._params.drag, this._interactionDefaults.drag),\n\t\t\tresize: this._normalizeInteractionParams(this._params.resize, this._interactionDefaults.resize),\n\t\t};\n\t}\n\r\n\t_normalizeInteractionParams(paramsValue, defaults) {\r\n\t\tif (typeof paramsValue === 'boolean') {\r\n\t\t\treturn {...defaults, enable: paramsValue};\r\n\t\t}\r\n\r\n\t\tif (paramsValue && typeof paramsValue === 'object') {\r\n\t\t\tconst hasEnable = Object.prototype.hasOwnProperty.call(paramsValue, 'enable');\r\n\t\t\treturn {\r\n\t\t\t\t...defaults,\r\n\t\t\t\t...paramsValue,\r\n\t\t\t\tenable: hasEnable ? Boolean(paramsValue.enable) : true,\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn {...defaults};\r\n\t}\r\n\r\n\t_getStateConfig() {\r\n\t\treturn this._normalizeStateParams(this._params.state);\r\n\t}\r\n\r\n\t_normalizeStateParams(paramsValue, defaults = { enable: true, key: '' }) {\r\n\t\tif (typeof paramsValue === 'boolean') {\r\n\t\t\treturn {...defaults, enable: paramsValue};\r\n\t\t}\r\n\r\n\t\tif (paramsValue && typeof paramsValue === 'object') {\r\n\t\t\tconst hasEnable = Object.prototype.hasOwnProperty.call(paramsValue, 'enable');\r\n\t\t\tconst key = typeof paramsValue.key === 'string' ? paramsValue.key.trim() : '';\r\n\t\t\treturn {\r\n\t\t\t\t...defaults,\r\n\t\t\t\t...paramsValue,\r\n\t\t\t\tkey,\r\n\t\t\t\tenable: hasEnable ? Boolean(paramsValue.enable) : true,\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn {...defaults};\r\n\t}\r\n\r\n\t_getStateStorageKey(stateConfig = this._getStateConfig()) {\r\n\t\tif (!stateConfig.enable) return '';\r\n\r\n\t\tif (typeof stateConfig.key === 'string' && stateConfig.key.trim()) {\r\n\t\t\treturn stateConfig.key.trim();\r\n\t\t}\r\n\r\n\t\tif (!this._element || !this._element.id) return '';\r\n\r\n\t\treturn `vg.modal.state:${window.location.pathname}:${this._element.id}`;\r\n\t}\r\n\r\n\t_captureInteractionState() {\r\n\t\tconst dialogStyle = this._dialog ? this._dialog.style : null;\r\n\t\tconst contentElement = this._content || Selectors.find('.vg-modal-content', this._dialog);\r\n\t\tconst contentStyle = contentElement ? contentElement.style : null;\r\n\r\n\t\treturn {\r\n\t\t\tdialog: dialogStyle ? {\r\n\t\t\t\tposition: dialogStyle.position,\r\n\t\t\t\tmargin: dialogStyle.margin,\r\n\t\t\t\tleft: dialogStyle.left,\r\n\t\t\t\ttop: dialogStyle.top,\r\n\t\t\t\twidth: dialogStyle.width,\r\n\t\t\t\theight: dialogStyle.height,\r\n\t\t\t\ttransform: dialogStyle.transform,\r\n\t\t\t\tmaxWidth: dialogStyle.maxWidth,\r\n\t\t\t\tmaxHeight: dialogStyle.maxHeight,\r\n\t\t\t\tminHeight: dialogStyle.minHeight,\r\n\t\t\toverflow: dialogStyle.overflow,\n\t\t\tpointerEvents: dialogStyle.pointerEvents,\n\t\t\ttransition: dialogStyle.transition,\n\t\t\twillChange: dialogStyle.willChange,\n\t\t} : {},\n\t\t\tcontent: contentStyle ? {\n\t\t\t\theight: contentStyle.height,\n\t\t\t\tmaxHeight: contentStyle.maxHeight,\n\t\t\t\toverflow: contentStyle.overflow,\n\t\t\t} : {},\n\t\t};\n\t}\n\r\n\t_applyInteractionState(state) {\r\n\t\tif (!state || typeof state !== 'object') return;\r\n\r\n\t\tconst dialogState = state.dialog && typeof state.dialog === 'object' ? state.dialog : {};\r\n\t\tconst contentState = state.content && typeof state.content === 'object' ? state.content : {};\r\n\t\tif (this._dialog) {\n\t\t\tObject.keys(dialogState).forEach(propertyName => {\n\t\t\t\tthis._dialog.style[propertyName] = dialogState[propertyName] || '';\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tconst contentElement = this._content || Selectors.find('.vg-modal-content', this._dialog);\r\n\t\tif (contentElement) {\r\n\t\t\tObject.keys(contentState).forEach(propertyName => {\r\n\t\t\t\tcontentElement.style[propertyName] = contentState[propertyName] || '';\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t_saveInteractionState() {\n\t\tconst stateConfig = this._getStateConfig();\n\t\tconst storageKey = this._getStateStorageKey(stateConfig);\n\t\tif (!stateConfig.enable || !storageKey || typeof window === 'undefined' || !window.localStorage) return;\n\r\n\t\ttry {\n\t\t\twindow.localStorage.setItem(storageKey, JSON.stringify(this._captureInteractionState()));\n\t\t} catch (error) {\n\t\t}\n\t}\n\r\n\t_restoreInteractionState() {\r\n\t\tconst stateConfig = this._getStateConfig();\r\n\t\tconst storageKey = this._getStateStorageKey(stateConfig);\r\n\t\tif (!stateConfig.enable || !storageKey || typeof window === 'undefined' || !window.localStorage) return false;\r\n\r\n\t\ttry {\r\n\t\t\tconst rawState = window.localStorage.getItem(storageKey);\r\n\t\t\tif (!rawState) return false;\r\n\r\n\t\t\tconst parsedState = JSON.parse(rawState);\r\n\t\t\tthis._applyInteractionState(parsedState);\r\n\t\t\treturn true;\r\n\t\t} catch (error) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\t_isAnimatedFade() {\r\n\t\treturn this._element.classList.contains(CLASS_NAME_FADE)\r\n\t}\r\n\r\n\t_adjustDialog() {\r\n\t\tconst isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\r\n\t\tconst scrollbarWidth = this._scrollBar.getWidth()\r\n\t\tconst isBodyOverflowing = scrollbarWidth > 0\r\n\r\n\t\tif (isBodyOverflowing && !isModalOverflowing) {\r\n\t\t\tconst property = isRTL() ? 'paddingLeft' : 'paddingRight'\r\n\t\t\tthis._element.style[property] = `${scrollbarWidth}px`\r\n\t\t}\r\n\r\n\t\tif (!isBodyOverflowing && isModalOverflowing) {\r\n\t\t\tconst property = isRTL() ? 'paddingRight' : 'paddingLeft'\r\n\t\t\tthis._element.style[property] = `${scrollbarWidth}px`\r\n\t\t}\r\n\t}\r\n\r\n\t_resetAdjustments() {\r\n\t\tthis._element.style.paddingLeft = ''\r\n\t\tthis._element.style.paddingRight = ''\r\n\t}\r\n\r\n\t_addEventListeners() {\r\n\t\tEventHandler.on(document, EVENT_KEY_KEYDOWN_DISMISS, event => {\r\n\t\t\tif (event.key !== ESCAPE_KEY) return;\r\n\r\n\t\t\tif (this._params.keyboard) {\r\n\t\t\t\tthis.hide();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tthis._triggerBackdropTransition();\r\n\t\t});\r\n\r\n\t\tEventHandler.on(window, EVENT_KEY_RESIZE, () => {\r\n\t\t\tif (this._isShown && !this._isTransitioning) {\r\n\t\t\t\tthis._adjustDialog();\r\n\t\t\t\tthis._syncInteractiveBounds();\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tEventHandler.on(this._element, EVENT_KEY_MOUSEDOWN_DISMISS, event => {\r\n\t\t\tEventHandler.one(this._element, EVENT_KEY_CLICK_DISMISS, event2 => {\r\n\t\t\t\tif (this._element !== event.target || this._element !== event2.target) return;\r\n\r\n\t\t\t\tif (this._params.backdrop === 'static') {\r\n\t\t\t\t\tthis._triggerBackdropTransition();\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (this._params.backdrop) {\r\n\t\t\t\t\tthis.hide();\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t});\r\n\t}\r\n\r\n\t_triggerBackdropTransition() {\r\n\t\tconst hideEvent = EventHandler.trigger(this._element, EVENT_KEY_HIDE_PREVENTED);\r\n\t\tif (hideEvent.defaultPrevented) return;\r\n\r\n\t\tconst isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\r\n\t\tconst initialOverflowY = this._element.style.overflowY;\r\n\r\n\t\tif (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) return;\r\n\t\tif (!isModalOverflowing) this._element.style.overflowY = 'hidden';\r\n\r\n\t\tthis._element.classList.add(CLASS_NAME_STATIC);\r\n\r\n\t\tthis._queueCallback(() => {\r\n\t\t\tthis._element.classList.remove(CLASS_NAME_STATIC);\r\n\t\t\tthis._queueCallback(() => {\r\n\t\t\t\tthis._element.style.overflowY = initialOverflowY;\r\n\t\t\t}, this._dialog);\r\n\t\t}, this._dialog);\r\n\t}\r\n\r\n\t_addFieldsInModal(relatedTarget) {\r\n\t\tthis._params = this._getParams(relatedTarget, this._params);\r\n\r\n\t\tif (!this._params.fields.length) return;\r\n\r\n\t\tthis._params.fields.forEach((item) => {\r\n\t\t\tif (!'name' in item && !'value' in item) return;\r\n\r\n\t\t\tlet elements = Selectors.findAll('[data-' + item.name + ']', this._element);\r\n\t\t\tif (!elements.length) return;\r\n\r\n\t\t\tfor (const elm of elements) {\r\n\t\t\t\tswitch (elm.tagName) {\r\n\t\t\t\t\tcase 'INPUT': elm.value = item.value; break;\r\n\t\t\t\t\tcase 'FORM': elm.action = item.value; break;\r\n\t\t\t\t\tcase 'IMG': Manipulator.set(elm, 'src', item.value); break;\r\n\t\t\t\t\tdefault: elm.innerHTML = item.value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n}\r\n\r\ndismissTrigger(VGModal);\r\n\r\n\r\n/**\r\n * Data API implementation\r\n */\r\n\tEventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n\t\tconst target = Selectors.getElementFromSelector(this);\n\r\n\tif (['A', 'AREA'].includes(this.tagName)) event.preventDefault();\r\n\r\n\t\tEventHandler.one(target, EVENT_KEY_SHOW, showEvent => {\n\t\t\tif (showEvent.defaultPrevented) return;\n\t\t});\n\n\t\tconst alreadyOpen = Selectors.find(OPEN_SELECTOR);\n\t\tif (alreadyOpen) {\n\t\t\tconst alreadyOpenInstance = VGModal.getInstance(alreadyOpen);\n\t\t\tif (alreadyOpenInstance && !alreadyOpenInstance._params.persistent) {\n\t\t\t\talreadyOpenInstance.hide([alreadyOpen]);\n\t\t\t}\n\t\t}\n\n\t\tconst data = VGModal.getOrCreateInstance(target);\n\t\tdata.toggle(this);\n\t});\n\r\nEventHandler.on(document, EVENT_KEY_DOM_LOADED_DATA_API, function () {\r\n\tlet targetHash = window.location.hash.slice(1);\r\n\tif (targetHash) {\r\n\t\tlet target = Selectors.find('#' + targetHash);\r\n\t\tif (target && target.classList.contains('vg-modal')) {\r\n\t\t\tif (isDisabled(target)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst data = VGModal.getOrCreateInstance(target)\r\n\t\t\tdata.toggle();\r\n\t\t}\r\n\t}\r\n})\r\n\r\nexport default VGModal;\r\n","import VGModal from \"./js/vgmodal\";\r\n\r\nexport default VGModal;","import { normalizeData } from \"../functions\";\r\n\r\n// Синхронный импорт JSON-файлов (включаются в бандл Webpack/Vite)\r\nimport messagesRu from '../../../langs/ru/messages.json';\r\nimport titlesRu from '../../../langs/ru/titles.json';\r\nimport buttonsRu from '../../../langs/ru/buttons.json';\r\n\r\nimport messagesEn from '../../../langs/en/messages.json';\r\nimport titlesEn from '../../../langs/en/titles.json';\r\nimport buttonsEn from '../../../langs/en/buttons.json';\r\n\r\n// Синхронные данные, загруженные при сборке\r\nconst langData = {\r\n\tru: normalizeData({\r\n\t\tmessages: messagesRu,\r\n\t\ttitles: titlesRu,\r\n\t\tbuttons: buttonsRu\r\n\t}),\r\n\ten: normalizeData({\r\n\t\tmessages: messagesEn,\r\n\t\ttitles: titlesEn,\r\n\t\tbuttons: buttonsEn\r\n\t})\r\n};\r\n\r\n/**\r\n * Класс для управления языком (синхронный)\r\n */\r\nclass Lang {\r\n\t/**\r\n\t * @param {string} lang - Язык (ru, en и т.д.)\r\n\t */\r\n\tconstructor(lang = 'en') {\r\n\t\tthis.lang = lang;\r\n\t}\r\n\r\n\t/**\r\n\t * Получение языкового пакета\r\n\t * @returns {Object}\r\n\t */\r\n\tget() {\r\n\t\treturn langData[this.lang] || langData['en'];\r\n\t}\r\n}\r\n\r\n/**\r\n * Получение языкового раздела\r\n * @param {string} language - Язык\r\n * @param {string} mode - messages, titles, buttons\r\n * @param {string} module - Модуль (files, alert и т.д.)\r\n * @returns {Object}\r\n */\r\nfunction getLangData(language = 'en', mode, module) {\r\n\tconst langInstance = new Lang(language);\r\n\tconst data = langInstance.get();\r\n\treturn data[mode]?.[module] || {};\r\n}\r\n\r\n/**\r\n * Получение заголовков\r\n * @param {string} language\r\n * @param {string} module\r\n * @returns {Object}\r\n */\r\nfunction lang_titles(language, module) {\r\n\treturn getLangData(language, 'titles', module);\r\n}\r\n\r\n/**\r\n * Получение сообщений\r\n * @param {string} language\r\n * @param {string} module\r\n * @returns {Object}\r\n */\r\nfunction lang_messages(language, module) {\r\n\treturn getLangData(language, 'messages', module);\r\n}\r\n\r\n/**\r\n * Получение текстов кнопок\r\n * @param {string} language\r\n * @param {string} module\r\n * @returns {Object}\r\n */\r\nfunction lang_buttons(language, module) {\r\n\treturn getLangData(language, 'buttons', module);\r\n}\r\n\r\nexport { lang_messages, lang_titles, lang_buttons };","import BaseModule from \"../../base-module\";\r\nimport VGModal from \"../../vgmodal\";\r\n\r\nimport { isElement, isVisible, makeRandomString, mergeDeepObject } from \"../../../utils/js/functions\";\r\nimport { getSVG } from \"../../module-fn\";\r\nimport {Classes, Manipulator} from \"../../../utils/js/dom/manipulator\";\r\nimport Selectors from \"../../../utils/js/dom/selectors\";\r\nimport EventHandler from \"../../../utils/js/dom/event\";\r\nimport {lang_buttons, lang_messages} from \"../../../utils/js/components/lang\";\r\nimport Html from \"../../../utils/js/components/templater\";\r\nimport Params from \"../../../utils/js/components/params\";\r\n\r\n/**\r\n * Константы\r\n */\r\nconst CLASS_NAME_ALERT = \"vg-alert\";\r\nconst DATA_AGREE = \"data-vg-alert-agree\";\r\nconst DATA_CANCEL = \"data-vg-alert-cancel\";\r\n\r\nconst NAME = \"alert\";\r\nconst NAME_KEY = \"vg.alert\";\r\n\r\n// Глобальная блокировка: предотвращаем открытие нескольких алертов\r\nlet isAlertOpen = false;\r\n\r\nclass VGAlert {\r\n\tconstructor(params = {}, lang = 'ru') {\r\n\t\tthis.lang = lang;\r\n\t\tthis._defaultParams = {\r\n\t\t\trender: {\r\n\t\t\t\ttype: \"modal\", // modal or overlay,\r\n\t\t\t\tdismiss: false,\r\n\t\t\t},\r\n\t\t\tajax: {\r\n\t\t\t\troute: \"\",\r\n\t\t\t\ttarget: \"\",\r\n\t\t\t\tmethod: \"get\",\r\n\t\t\t\tloader: false,\r\n\t\t\t\tonce: false,\r\n\t\t\t\toutput: true,\r\n\t\t\t},\r\n\t\t\tmodal: {\r\n\t\t\t\tcentered: false,\r\n\t\t\t\tbackdrop: true,\r\n\t\t\t\toverflow: true,\r\n\t\t\t\tkeyboard: true,\r\n\t\t\t\tdismiss: true,\r\n\t\t\t\tanimation: {\r\n\t\t\t\t\tenable: false,\r\n\t\t\t\t\tin: \"animate__rollIn\",\r\n\t\t\t\t\tout: \"animate__rollOut\",\r\n\t\t\t\t\tdelay: 300,\r\n\t\t\t\t\tduration: 700,\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t\tmode: \"confirm\",\r\n\t\t\ttheme: \"danger\",\r\n\t\t\tbuttons: {},\r\n\t\t\tmessage: {},\r\n\t\t};\r\n\t\tthis._elementsDefault = {\r\n\t\t\tbuttons: {\r\n\t\t\t\tagree: {\r\n\t\t\t\t\telement: \"\",\r\n\t\t\t\t\ttag: \"button\",\r\n\t\t\t\t\ttype: \"button\",\r\n\t\t\t\t\tattr: {},\r\n\t\t\t\t\ttoggle: DATA_AGREE,\r\n\t\t\t\t\tclass: [\"btn\"],\r\n\t\t\t\t\ttext: lang_buttons(this.lang, NAME)['agree'],\r\n\t\t\t\t},\r\n\t\t\t\tcancel: {\r\n\t\t\t\t\telement: \"\",\r\n\t\t\t\t\ttag: \"button\",\r\n\t\t\t\t\ttype: \"button\",\r\n\t\t\t\t\tattr: {},\r\n\t\t\t\t\ttoggle: DATA_CANCEL,\r\n\t\t\t\t\tclass: [\"btn\"],\r\n\t\t\t\t\ttext: lang_buttons(this.lang, NAME)['cancel'],\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t\tmessage: {\r\n\t\t\t\ttitle: lang_messages(this.lang, NAME)['title'],\r\n\t\t\t\tdescription: lang_messages(this.lang, NAME)['description']\r\n\t\t\t},\r\n\t\t\ticons: {\r\n\t\t\t\tdanger: getSVG(\"danger\"),\r\n\t\t\t\twarning: getSVG(\"warning\"),\r\n\t\t\t\tsuccess: getSVG(\"success\"),\r\n\t\t\t\tinfo: getSVG(\"info\"),\r\n\t\t\t},\r\n\t\t};\r\n\t\tthis._params = this._setParams(params);\r\n\t}\r\n\r\n\tstatic call(options = {}, lang = 'ru') {\r\n\t\tconst context = new VGAlert(options, lang);\r\n\r\n\t\tif (isAlertOpen) return Promise.reject({ accepted: false, reason: lang_messages(context.lang, NAME_KEY).reason });\r\n\t\tisAlertOpen = true;\r\n\r\n\t\tconst getContainer = () => {\r\n\t\t\tif (context._params.render.type === \"overlay\") {\r\n\t\t\t\tconst overlay = context._buildOverlay();\r\n\t\t\t\treturn {\r\n\t\t\t\t\telement: overlay.element,\r\n\t\t\t\t\trender: overlay.render,\r\n\t\t\t\t\ttype: 'overlay'\r\n\t\t\t\t}\r\n\t\t\t} else if (context._params.render.type === \"modal\") {\r\n\t\t\t\tconst modal = context._buildModal();\r\n\t\t\t\treturn {\r\n\t\t\t\t\telement: modal._element,\r\n\t\t\t\t\trender: modal,\r\n\t\t\t\t\ttype: 'modal'\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst {element: container, render, type} = getContainer();\r\n\r\n\t\tif (type === 'modal') {\r\n\t\t\trender.show();\r\n\t\t}\r\n\r\n\t\tconst agreeBtn = Selectors.find(`[${DATA_AGREE}]`, container);\r\n\t\tconst cancelBtn = Selectors.find(`[${DATA_CANCEL}]`, container);\r\n\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\tconst closeAlert = (isHide = true) => {\r\n\t\t\t\tif (type === 'modal') {\r\n\t\t\t\t\trender.hide();\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (type === 'overlay') {\r\n\t\t\t\t\tcontainer.remove();\r\n\r\n\t\t\t\t\tif (context._params.render.dismiss && isHide) {\r\n\t\t\t\t\t\trender.hide();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tconst handleAgree = (e) => {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tcleanup();\r\n\t\t\t\tresolve({\r\n\t\t\t\t\taccepted: true,\r\n\t\t\t\t\ttimestamp: new Date(),\r\n\t\t\t\t});\r\n\t\t\t\tcloseAlert();\r\n\t\t\t};\r\n\r\n\t\t\tconst handleCancel = (e) => {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tcleanup();\r\n\t\t\t\treject({\r\n\t\t\t\t\taccepted: false,\r\n\t\t\t\t\ttimestamp: new Date(),\r\n\t\t\t\t});\r\n\t\t\t\tcloseAlert(false);\r\n\t\t\t};\r\n\r\n\t\t\tconst handleKeydown = (e) => {\r\n\t\t\t\tif (e.key === \"Enter\" && agreeBtn) {\r\n\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\thandleAgree(e);\r\n\t\t\t\t}\r\n\t\t\t\tif (e.key === \"Escape\") {\r\n\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\thandleCancel(e);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tconst cleanup = () => {\r\n\t\t\t\tisAlertOpen = false;\r\n\t\t\t\tdocument.removeEventListener(\"keydown\", handleKeydown);\r\n\t\t\t\tif (agreeBtn) agreeBtn.removeEventListener(\"click\", handleAgree);\r\n\t\t\t\tif (cancelBtn) cancelBtn.removeEventListener(\"click\", handleCancel);\r\n\t\t\t};\r\n\r\n\t\t\tif (context._params.mode === \"confirm\") {\r\n\t\t\t\tif (agreeBtn) agreeBtn.addEventListener(\"click\", handleAgree);\r\n\t\t\t\tif (cancelBtn) cancelBtn.addEventListener(\"click\", handleCancel);\r\n\t\t\t}\r\n\r\n\t\t\tif (context._params.mode === \"info\") {\r\n\t\t\t\tif (cancelBtn) cancelBtn.addEventListener(\"click\", handleCancel);\r\n\t\t\t}\r\n\r\n\t\t\tdocument.addEventListener(\"keydown\", handleKeydown);\r\n\r\n\t\t\tif (type === 'modal') {\r\n\t\t\t\tcontainer.addEventListener(\"vg.modal.hide\", () => {\r\n\t\t\t\t\tcleanup();\r\n\t\t\t\t\treject({\r\n\t\t\t\t\t\taccepted: false,\r\n\t\t\t\t\t\ttimestamp: new Date(),\r\n\t\t\t\t\t});\r\n\t\t\t\t}, {once: true});\r\n\t\t\t}\r\n\r\n\t\t\tcontainer.focus();\r\n\t\t});\r\n\t}\r\n\r\n\tstatic confirm(elem, options = {}) {\r\n\t\tlet lang = 'ru';\r\n\r\n\t\tif ('lang' in options) {\r\n\t\t\tlang = options.lang || 'ru';\r\n\t\t\tdelete options.lang;\r\n\t\t}\r\n\t\tconst context = new VGAlert(options, lang);\r\n\t\tif (context._params.mode !== \"confirm\") return;\r\n\r\n\t\tconst instance = VGAlertConfirm.getOrCreateInstance(elem, context._params);\r\n\t\tinstance.run(VGAlert);\r\n\t}\r\n\r\n\t_setParams(params) {\r\n\t\tconst merged = mergeDeepObject(this._defaultParams, params);\r\n\t\tmerged.buttons = mergeDeepObject(this._elementsDefault.buttons, merged.buttons);\r\n\t\tmerged.message = mergeDeepObject(this._elementsDefault.message, merged.message);\r\n\t\tmerged.icon = this._elementsDefault.icons[merged.theme];\r\n\r\n\t\treturn merged;\r\n\t}\r\n\r\n\t_buildModal() {\r\n\t\tconst id = `${CLASS_NAME_ALERT}-${makeRandomString()}`;\r\n\r\n\t\treturn VGModal.build(id, this._params.modal, (modal) => {\r\n\t\t\tmodal._element.classList.add(`${CLASS_NAME_ALERT}-modal`);\r\n\t\t\tconst body = Selectors.find(\".vg-modal-body\", modal._element);\r\n\t\t\tbody.append(this._buildContent());\r\n\t\t});\r\n\t}\r\n\r\n\t_buildContent() {\r\n\t\tconst html = Html('dom');\r\n\r\n\t\tlet icon = null;\r\n\r\n\t\tif (this._params.icon) {\r\n\t\t\ticon = html.div(\r\n\t\t\t\t{class: `${CLASS_NAME_ALERT}-content--icon`},\r\n\t\t\t\tthis._params.icon,\r\n\t\t\t\t{isHTML: true}\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tconst buttons = document.createElement(\"div\");\r\n\t\tClasses.add(buttons, \"vg-alert-buttons\");\r\n\r\n\t\tif (this._params.mode === \"confirm\") {\r\n\t\t\tthis._createButton(buttons, \"cancel\");\r\n\t\t\tthis._createButton(buttons, \"agree\");\r\n\t\t}\r\n\r\n\t\tif (this._params.mode === \"info\") {\r\n\t\t\tthis._createButton(buttons, \"cancel\");\r\n\t\t}\r\n\r\n\t\treturn html.div(\r\n\t\t\t{class: `${CLASS_NAME_ALERT}-wrapper ${CLASS_NAME_ALERT}-${this._params.theme}`},\r\n\t\t\t[\r\n\t\t\t\thtml.div(\r\n\t\t\t\t\t{class: `${CLASS_NAME_ALERT}-content`},\r\n\t\t\t\t\t[\r\n\t\t\t\t\t\ticon,\r\n\t\t\t\t\t\thtml.div(\r\n\t\t\t\t\t\t\t{class: `${CLASS_NAME_ALERT}-content--message`},\r\n\t\t\t\t\t\t\t[\r\n\t\t\t\t\t\t\t\thtml.div(\r\n\t\t\t\t\t\t\t\t\t{class: `${CLASS_NAME_ALERT}-content--title`},\r\n\t\t\t\t\t\t\t\t\tthis._params.message.title\r\n\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t\thtml.div(\r\n\t\t\t\t\t\t\t\t\t{class: `${CLASS_NAME_ALERT}-content--description`},\r\n\t\t\t\t\t\t\t\t\tthis._params.message.description\r\n\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t]\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t]\r\n\t\t\t\t),\r\n\t\t\t\tbuttons\r\n\t\t\t]\r\n\t\t);\r\n\t}\r\n\r\n\t_buildOverlay() {\r\n\t\tlet targetContainers = ['.vg-modal', '.vg-sidebar'];\r\n\t\tconst containerWrap = this._params.relatedTarget.closest(targetContainers.join(', '));\r\n\r\n\t\tconst modal = VGModal.getOrCreateInstance(containerWrap);\r\n\t\tconst container = Selectors.find('.vg-modal-content', modal._element) || containerWrap;\r\n\r\n\t\tconst overlay = document.createElement('div');\r\n\r\n\t\toverlay.className = `${CLASS_NAME_ALERT}-overlay`;\r\n\t\toverlay.append(this._buildContent());\r\n\r\n\t\tcontainer.append(overlay);\r\n\r\n\t\treturn {\r\n\t\t\telement: overlay,\r\n\t\t\trender: modal,\r\n\t\t};\r\n\t}\r\n\r\n\t_createButton(container, key) {\r\n\t\tconst button = this._params.buttons[key];\r\n\t\tif (!button || button.element) {\r\n\t\t\tcontainer.insertAdjacentHTML(\"beforeend\", button?.element || \"\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!button.tag) return;\r\n\r\n\t\tlet btn = null,\r\n\t\t\tclasses = [...new Set(button.class)].join(\" \"),\r\n\t\t\tattrs = mergeDeepObject({\r\n\t\t\t\tclass: classes\r\n\t\t\t}, button.attr);\r\n\r\n\t\tif (button.tag === \"button\") {\r\n\t\t\tbtn = Html('dom').button(button.text, button.type, attrs);\r\n\t\t} else if (button.tag === \"a\") {\r\n\t\t\tbtn = Html('dom').a('#', button.text, attrs);\r\n\t\t}\r\n\r\n\t\tif (!btn) return;\r\n\r\n\t\tbtn.setAttribute(button.toggle, \"true\");\r\n\t\tcontainer.appendChild(btn);\r\n\t}\r\n}\r\n\r\n/**\r\n * Константы для событий и селекторов\r\n */\r\nconst SELECTOR_DATA_TOGGLE = `[data-vg-toggle=\"${NAME}\"]`;\r\nconst EVENT_KEY_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;\r\nconst EVENT_KEY_LOADED = `${NAME_KEY}.loaded`;\r\nconst EVENT_KEY_ACCEPT = `${NAME_KEY}.accept`;\r\nconst EVENT_KEY_REJECT = `${NAME_KEY}.reject`;\r\nconst EVENT_KEY_FINALLY = `${NAME_KEY}.finally`;\r\n\r\nclass VGAlertConfirm extends BaseModule {\r\n\tconstructor(element, options = {}) {\r\n\t\tsuper(element);\r\n\t\tthis._params = this._getParams(element, mergeDeepObject({}, options));\r\n\t}\r\n\r\n\tstatic get NAME() {\r\n\t\treturn NAME;\r\n\t}\r\n\r\n\tstatic get NAME_KEY() {\r\n\t\treturn NAME_KEY;\r\n\t}\r\n\r\n\trun(AlertClass) {\r\n\t\tif (this._params.mode !== \"confirm\") return;\r\n\r\n\t\tthis._params.relatedTarget = this._element;\r\n\r\n\t\tAlertClass.call(this._params)\r\n\t\t\t.then((resolve) => {\r\n\t\t\t\tif (!resolve.accepted) return Promise.reject(resolve);\r\n\t\t\t\tif (!this._params.ajax.route) return resolve;\r\n\t\t\t\treturn this._ajax();\r\n\t\t\t})\r\n\t\t\t.then((response) => {\r\n\t\t\t\tEventHandler.trigger(this._element, EVENT_KEY_ACCEPT, { vgalert: response });\r\n\t\t\t})\r\n\t\t\t.catch((error) => {\r\n\t\t\t\tEventHandler.trigger(this._element, EVENT_KEY_REJECT, { vgalert: error });\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\tEventHandler.trigger(this._element, EVENT_KEY_FINALLY, { vgalert: 'finally' });\r\n\t\t\t});\r\n\t}\r\n\r\n\t_ajax() {\r\n\t\treturn new Promise((resolve) => {\r\n\t\t\tthis._route((status, data) => {\r\n\t\t\t\tEventHandler.trigger(this._element, EVENT_KEY_LOADED, { stats: status, data });\r\n\t\t\t\tresolve({ status, data });\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n}\r\n\r\n// Делегирование кликов по data-атрибутам\r\nEventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\r\n\tevent.preventDefault();\r\n\tconst target = event.target;\r\n\r\n\tif (!isVisible(target) || !isElement(target)) return;\r\n\r\n\tVGAlert.confirm(target, {\r\n\t\tbuttons: {\r\n\t\t\tagree: {\r\n\t\t\t\tclass: [\"btn-primary\"],\r\n\t\t\t},\r\n\t\t\tcancel: {\r\n\t\t\t\tclass: [\"btn-outline-primary\"],\r\n\t\t\t},\r\n\t\t},\r\n\t});\r\n});\r\n\r\nexport default VGAlert;\r\n","import VGAlert from \"./js/vgalert\";\r\n\r\nexport default VGAlert;","/**\r\n * @class VGCollapse\r\n * @extends BaseModule\r\n * @classdesc Класс для реализации поведения \"collapse\" (раскрытие/свертывание элементов) с поддержкой анимации, AJAX-загрузки и иерархической структуры.\r\n *\r\n * Поддерживает переключение видимости контента по клику на элементы с атрибутом `data-vg-toggle=\"collapse\"`.\r\n * Может работать в вертикальном и горизонтальном режимах, управлять aria-атрибутами и состоянием кнопок.\r\n *\r\n * @param {HTMLElement} element - Основной элемент, к которому применяется collapse.\r\n * @param {Object} params - Параметры конфигурации.\r\n * @param {boolean} [params.toggle=true] - Автоматически переключать состояние при инициализации.\r\n * @param {string|HTMLElement|null} [params.parent=null] - Родительский контейнер, ограничивающий поиск дочерних collapse-элементов.\r\n * @param {Object} params.ajax - Настройки AJAX-загрузки контента.\r\n * @param {string} params.ajax.route - URL-адрес для запроса.\r\n * @param {string} params.ajax.target - CSS-селектор, куда вставлять ответ.\r\n * @param {string} params.ajax.method='get' - HTTP-метод запроса.\r\n * @param {boolean} params.ajax.loader=false - Показывать ли лоадер при загрузке.\r\n * @param {boolean} params.ajax.once=true - Загружать контент только один раз.\r\n * @param {boolean} params.ajax.output=true - Вставлять ли ответ в DOM.\r\n *\r\n * @example\r\n * const collapse = new VGCollapse(document.getElementById('myCollapse'), {\r\n * toggle: true,\r\n * parent: '#accordion'\r\n * });\r\n *\r\n * @example\r\n * <div id=\"accordion\">\r\n * <div class=\"vg-collapse\" id=\"collapseOne\">\r\n * <button data-vg-toggle=\"collapse\" data-target=\"#collapseOne\">Toggle</button>\r\n * </div>\r\n * </div>\r\n */\r\nimport BaseModule from \"../../base-module\";\r\nimport {getElement, mergeDeepObject, reflow} from \"../../../utils/js/functions\";\r\nimport EventHandler from \"../../../utils/js/dom/event\";\r\nimport Selectors from \"../../../utils/js/dom/selectors\";\r\nimport {Manipulator} from \"../../../utils/js/dom/manipulator\";\r\n\r\n/**\r\n * Константы, используемые в классе VGCollapse.\r\n * @private\r\n * @type {Object}\r\n */\r\nconst NAME = 'collapse';\r\nconst NAME_KEY = 'vg.collapse';\r\nconst CLASS_NAME_SHOW = 'show';\r\nconst CLASS_NAME_COLLAPSE = 'vg-collapse';\r\nconst CLASS_NAME_COLLAPSING = 'vg-collapsing';\r\nconst CLASS_NAME_COLLAPSED = 'vg-collapsed';\r\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;\r\nconst CLASS_NAME_HORIZONTAL = 'vg-collapse-horizontal';\r\n\r\nconst SELECTOR_DATA_TOGGLE = '[data-vg-toggle=\"collapse\"]';\r\nconst SELECTOR_ACTIVES = '.vg-collapse.show, .vg-collapse.vg-collapsing';\r\n\r\nconst EVENT_KEY_HIDE = `${NAME_KEY}.hide`;\r\nconst EVENT_KEY_HIDDEN = `${NAME_KEY}.hidden`;\r\nconst EVENT_KEY_SHOW = `${NAME_KEY}.show`;\r\nconst EVENT_KEY_SHOWN = `${NAME_KEY}.shown`;\r\nconst EVENT_KEY_LOADED = `${NAME_KEY}.loaded`;\r\n\r\nconst EVENT_KEY_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;\r\n\r\nconst WIDTH = 'width';\r\nconst HEIGHT = 'height';\r\n\r\nclass VGCollapse extends BaseModule {\r\n\t/**\r\n\t * Создает экземпляр VGCollapse.\r\n\t * @param {HTMLElement} element - DOM-элемент, к которому применяется collapse.\r\n\t * @param {Object} params - Параметры инициализации.\r\n\t */\r\n\tconstructor(element, params = {}) {\r\n\t\tsuper(element, params);\r\n\r\n\t\t/**\r\n\t\t * Объединённые параметры с учётом значений по умолчанию и переданных пользователем.\r\n\t\t * @type {Object}\r\n\t\t * @private\r\n\t\t */\r\n\t\tthis._params = this._getParams(element, mergeDeepObject({\r\n\t\t\ttoggle: true,\r\n\t\t\tparent: null,\r\n\t\t\tajax: {\r\n\t\t\t\troute: '',\r\n\t\t\t\ttarget: '',\r\n\t\t\t\tmethod: 'get',\r\n\t\t\t\tloader: false,\r\n\t\t\t\tonce: true,\r\n\t\t\t\toutput: true,\r\n\t\t\t}\r\n\t\t}, params));\r\n\r\n\t\t/**\r\n\t\t * Родительский элемент (если задан).\r\n\t\t * @type {HTMLElement|null}\r\n\t\t * @private\r\n\t\t */\r\n\t\tthis._params.parent = getElement(this._params.parent) || null;\r\n\r\n\t\t/**\r\n\t\t * Флаг, указывающий на переход (анимацию).\r\n\t\t * @type {boolean}\r\n\t\t * @private\r\n\t\t */\r\n\t\tthis._isTransitioning = false;\r\n\r\n\t\t/**\r\n\t\t * Массив элементов, которые управляют этим collapse (например, кнопки).\r\n\t\t * @type {HTMLElement[]}\r\n\t\t * @private\r\n\t\t */\r\n\t\tthis._triggerArray = [];\r\n\r\n\t\tconst toggleList = Selectors.findAll(SELECTOR_DATA_TOGGLE);\r\n\r\n\t\tfor (const elem of toggleList) {\r\n\t\t\tconst selector = Selectors.getSelectorFromElement(elem);\r\n\t\t\tconst filterElement = Selectors.findAll(selector).filter(foundElement => foundElement === this._element);\r\n\r\n\t\t\tif (selector !== null && filterElement.length) {\r\n\t\t\t\tthis._triggerArray.push(elem);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._initializeChildren();\r\n\r\n\t\tif (!this._params.parent) {\r\n\t\t\tthis._addAriaAndCollapsedClass(this._triggerArray, this._isShown());\r\n\t\t}\r\n\r\n\t\tif (this._params.toggle) {\r\n\t\t\tthis.toggle();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Возвращает статическое имя модуля.\r\n\t * @returns {string} Имя модуля.\r\n\t * @static\r\n\t */\r\n\tstatic get NAME() {\r\n\t\treturn NAME;\r\n\t}\r\n\r\n\t/**\r\n\t * Возвращает статический ключ модуля (используется для событий и хранения экземпляров).\r\n\t * @returns {string} Ключ модуля.\r\n\t * @static\r\n\t */\r\n\tstatic get NAME_KEY() {\r\n\t\treturn NAME_KEY;\r\n\t}\r\n\r\n\t/**\r\n\t * Переключает состояние collapse: если скрыт — показывает, если показан — скрывает.\r\n\t * @param {EventTarget} [relatedTarget] - Связанный элемент (опционально).\r\n\t * @returns {void}\r\n\t */\r\n\ttoggle(relatedTarget) {\r\n\t\treturn !this._isShown() ? this.show(relatedTarget) : this.hide();\r\n\t}\r\n\r\n\t/**\r\n\t * Открывает collapse с анимацией и, при необходимости, AJAX-загрузкой.\r\n\t * @emits VGCollapse#show - Перед началом открытия.\r\n\t * @emits VGCollapse#shown - После завершения открытия.\r\n\t * @emits VGCollapse#loaded - После загрузки AJAX-контента (если используется).\r\n\t * @returns {void}\r\n\t */\r\n\tshow() {\r\n\t\tif (this._isTransitioning || this._isShown()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet activeChildren = [];\r\n\r\n\t\tif (this._params.parent) {\r\n\t\t\tactiveChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES)\r\n\t\t\t\t.filter(element => element !== this._element)\r\n\t\t\t\t.map(element => VGCollapse.getOrCreateInstance(element, { toggle: false }));\r\n\t\t}\r\n\r\n\t\tif (activeChildren.length && activeChildren[0]._isTransitioning) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst startEvent = EventHandler.trigger(this._element, EVENT_KEY_SHOW);\r\n\t\tif (startEvent.defaultPrevented) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor (const activeInstance of activeChildren) {\r\n\t\t\tactiveInstance.hide();\r\n\t\t}\r\n\r\n\t\tconst dimension = this._getDimension();\r\n\r\n\t\tthis._element.classList.remove(CLASS_NAME_COLLAPSE);\r\n\t\tthis._element.classList.add(CLASS_NAME_COLLAPSING);\r\n\r\n\t\tthis._element.style[dimension] = '0';\r\n\r\n\t\tthis._addAriaAndCollapsedClass(this._triggerArray, true);\r\n\t\tthis._isTransitioning = true;\r\n\r\n\t\tconst complete = () => {\r\n\t\t\tthis._isTransitioning = false;\r\n\r\n\t\t\tthis._element.classList.remove(CLASS_NAME_COLLAPSING);\r\n\t\t\tthis._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);\r\n\r\n\t\t\tthis._element.style[dimension] = '';\r\n\r\n\t\t\tthis._route((status, data) => {\r\n\t\t\t\tEventHandler.trigger(this._element, EVENT_KEY_LOADED, { stats: status, data });\r\n\t\t\t});\r\n\r\n\t\t\tEventHandler.trigger(this._element, EVENT_KEY_SHOWN);\r\n\t\t};\r\n\r\n\t\tconst capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);\r\n\t\tconst scrollSize = `scroll${capitalizedDimension}`;\r\n\r\n\t\tthis._queueCallback(complete, this._element, true);\r\n\t\tthis._element.style[dimension] = `${this._element[scrollSize]}px`;\r\n\t}\r\n\r\n\t/**\r\n\t * Скрывает collapse с анимацией.\r\n\t * @emits VGCollapse#hide - Перед началом скрытия.\r\n\t * @emits VGCollapse#hidden - После завершения скрытия.\r\n\t * @returns {void}\r\n\t */\r\n\thide() {\r\n\t\tif (this._isTransitioning || !this._isShown()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst startEvent = EventHandler.trigger(this._element, EVENT_KEY_HIDE);\r\n\t\tif (startEvent.defaultPrevented) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst dimension = this._getDimension();\r\n\r\n\t\tthis._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;\r\n\r\n\t\treflow(this._element);\r\n\r\n\t\tthis._element.classList.add(CLASS_NAME_COLLAPSING);\r\n\t\tthis._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW);\r\n\r\n\t\tfor (const trigger of this._triggerArray) {\r\n\t\t\tconst element = Selectors.getElementFromSelector(trigger);\r\n\r\n\t\t\tif (element && !this._isShown(element)) {\r\n\t\t\t\tthis._addAriaAndCollapsedClass([trigger], false);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._isTransitioning = true;\r\n\r\n\t\tconst complete = () => {\r\n\t\t\tthis._isTransitioning = false;\r\n\t\t\tthis._element.classList.remove(CLASS_NAME_COLLAPSING);\r\n\t\t\tthis._element.classList.add(CLASS_NAME_COLLAPSE);\r\n\t\t\tEventHandler.trigger(this._element, EVENT_KEY_HIDDEN);\r\n\t\t};\r\n\r\n\t\tthis._element.style[dimension] = '';\r\n\r\n\t\tthis._queueCallback(complete, this._element, true);\r\n\t}\r\n\r\n\t/**\r\n\t * Удаляет экземпляр collapse и очищает память.\r\n\t * @returns {void}\r\n\t */\r\n\tdispose() {\r\n\t\tsuper.dispose();\r\n\t}\r\n\r\n\t/**\r\n\t * Проверяет, является ли элемент открытым.\r\n\t * @param {HTMLElement} [element=this._element] - Элемент для проверки.\r\n\t * @returns {boolean} `true`, если элемент имеет класс `.show`.\r\n\t * @private\r\n\t */\r\n\t_isShown(element = this._element) {\r\n\t\treturn element.classList.contains(CLASS_NAME_SHOW);\r\n\t}\r\n\r\n\t/**\r\n\t * Добавляет или удаляет aria-атрибуты и классы у управляющих элементов.\r\n\t * @param {HTMLElement[]} triggerArray - Массив элементов управления.\r\n\t * @param {boolean} isOpen - Состояние: открыто или закрыто.\r\n\t * @private\r\n\t */\r\n\t_addAriaAndCollapsedClass(triggerArray, isOpen) {\r\n\t\tif (!triggerArray.length) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor (const element of triggerArray) {\r\n\t\t\tthis._changeStateButton(element, isOpen);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Инициализирует дочерние collapse-элементы, если указан родитель.\r\n\t * @private\r\n\t */\r\n\t_initializeChildren() {\r\n\t\tif (!this._params.parent) return;\r\n\r\n\t\tconst children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE);\r\n\r\n\t\tfor (const element of children) {\r\n\t\t\tconst selected = Selectors.getElementFromSelector(element);\r\n\r\n\t\t\tif (selected) {\r\n\t\t\t\tthis._addAriaAndCollapsedClass([element], this._isShown(selected));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Возвращает дочерние элементы первого уровня (без вложенных).\r\n\t * @param {string} selector - CSS-селектор для поиска.\r\n\t * @returns {HTMLElement[]} Массив найденных элементов.\r\n\t * @private\r\n\t */\r\n\t_getFirstLevelChildren(selector) {\r\n\t\tconst children = Selectors.findAll(CLASS_NAME_DEEPER_CHILDREN, this._params.parent);\r\n\t\treturn Selectors.findAll(selector, this._params.parent).filter(element => !children.includes(element));\r\n\t}\r\n\r\n\t/**\r\n\t * Обновляет состояние кнопки: классы, текст, aria-expanded.\r\n\t * @param {HTMLElement} element - Кнопка, управляющая collapse.\r\n\t * @param {boolean} isOpen - Текущее состояние (открыто/закрыто).\r\n\t * @private\r\n\t */\r\n\t_changeStateButton(element, isOpen) {\r\n\t\telement.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);\r\n\t\telement.setAttribute('aria-expanded', isOpen);\r\n\t\telement.innerHTML = Manipulator.get(element, `data-${isOpen ? 'hide' : 'show'}-text`) || element.innerHTML;\r\n\t}\r\n\r\n\t/**\r\n\t * Определяет, по какой оси происходит анимация (высота или ширина).\r\n\t * @returns {string} `'height'` или `'width'`.\r\n\t * @private\r\n\t */\r\n\t_getDimension() {\r\n\t\treturn this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;\r\n\t}\r\n}\r\n\r\n/**\r\n * Реализация Data API: автоматическая инициализация по атрибуту `data-vg-toggle=\"collapse\"`.\r\n * @listens document#click\r\n */\r\nEventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\r\n\tif (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\r\n\t\tevent.preventDefault();\r\n\t}\r\n\r\n\tSelectors.getMultipleElementsFromSelector(this).forEach(function (element) {\r\n\t\tVGCollapse.getOrCreateInstance(element, { toggle: false }).toggle();\r\n\t});\r\n});\r\n\r\nexport default VGCollapse;","import VGCollapse from \"./js/vgcollapse\";\r\n\r\nexport default VGCollapse;","import {mergeDeepObject} from \"../functions\";\r\n\r\nclass Placement {\r\n\tconstructor(config) {\r\n\t\tthis.reference = config.reference;\r\n\t\tthis.drop = config.drop;\r\n\t\tthis.offset = config.offset || [0, 0];\r\n\t\tthis.boundary = config.boundary || 'viewport';\r\n\t\tthis.autoFlip = config.autoFlip !== false;\r\n\t\tthis.overflowProtection = config.overflowProtection !== false;\r\n\t\tthis.placement = config.placement || 'bottom';\r\n\t\tthis.fallbackPlacements = config.fallbackPlacements || [];\r\n\r\n\t\tthis.clamp = config.clamp === true;\r\n\t\tthis.clampPadding = config.clampPadding ?? 8;\r\n\t\tthis.isMerge = config.isMerge !== false;\r\n\t}\r\n\r\n\t_getPlacementRect(element) {\r\n\t\treturn element.getBoundingClientRect();\r\n\t}\r\n\r\n\t_getViewportRect() {\r\n\t\tconst doc = document.documentElement;\r\n\r\n\t\treturn {\r\n\t\t\twidth: doc.clientWidth,\r\n\t\t\theight: doc.clientHeight,\r\n\t\t\tleft: 0,\r\n\t\t\ttop: 0,\r\n\t\t\tright: doc.clientWidth,\r\n\t\t\tbottom: doc.clientHeight\r\n\t\t};\r\n\t}\r\n\r\n\t_getOverflowConstraints() {\r\n\t\tconst refRect = this._getPlacementRect(this.reference);\r\n\t\tconst dropRect = this._getPlacementRect(this.drop);\r\n\t\tconst viewRect = this._getViewportRect();\r\n\t\tconst [xOffset, yOffset] = this.offset;\r\n\r\n\t\tlet placement = this.placement;\r\n\r\n\t\tif (this.overflowProtection) {\r\n\t\t\tconst fallbacks = [this.placement, ...this.fallbackPlacements];\r\n\t\t\tlet best = null;\r\n\r\n\t\t\tfor (const p of fallbacks) {\r\n\t\t\t\tconst position = this._calculatePosition(p, refRect, dropRect, xOffset, yOffset);\r\n\t\t\t\tconst overflow = this._calculateOverflow(position, dropRect, viewRect);\r\n\r\n\t\t\t\tif (!best || overflow < best.overflow) {\r\n\t\t\t\t\tbest = { placement: p, position, overflow };\r\n\r\n\t\t\t\t\tif (overflow === 0) break;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tplacement = best.placement;\r\n\r\n\t\t\tconst finalPosition = this.clamp\r\n\t\t\t\t? this._clampPosition(best.position, dropRect, viewRect)\r\n\t\t\t\t: best.position;\r\n\r\n\t\t\tthis._setStyles(finalPosition);\r\n\t\t} else {\r\n\t\t\tconst position = this._calculatePosition(placement, refRect, dropRect, xOffset, yOffset);\r\n\r\n\t\t\tconst finalPosition = this.clamp\r\n\t\t\t\t? this._clampPosition(position, dropRect, viewRect)\r\n\t\t\t\t: position;\r\n\r\n\t\t\tthis._setStyles(finalPosition);\r\n\t\t}\r\n\r\n\t\tthis.drop.setAttribute('data-vg-placement', placement);\r\n\t}\r\n\r\n\t_calculatePosition(placement, refRect, dropRect, xOffset = 0, yOffset = 0) {\r\n\t\tlet top;\r\n\t\tlet left;\r\n\r\n\t\tswitch (placement) {\r\n\t\t\tcase 'top':\r\n\t\t\t\ttop = refRect.top - dropRect.height - yOffset;\r\n\t\t\t\tleft = refRect.left + (refRect.width - dropRect.width) / 2;\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'top-start':\r\n\t\t\t\ttop = refRect.top - dropRect.height - yOffset;\r\n\t\t\t\tleft = refRect.left + xOffset;\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'top-end':\r\n\t\t\t\ttop = refRect.top - dropRect.height - yOffset;\r\n\t\t\t\tleft = refRect.right - dropRect.width - xOffset;\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'bottom':\r\n\t\t\t\ttop = refRect.bottom + yOffset;\r\n\t\t\t\tleft = refRect.left + (refRect.width - dropRect.width) / 2;\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'bottom-start':\r\n\t\t\t\ttop = refRect.bottom + yOffset;\r\n\t\t\t\tleft = refRect.left + xOffset;\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'bottom-end':\r\n\t\t\t\ttop = refRect.bottom + yOffset;\r\n\t\t\t\tleft = refRect.right - dropRect.width - xOffset;\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'left':\r\n\t\t\t\ttop = refRect.top + (refRect.height - dropRect.height) / 2;\r\n\t\t\t\tleft = refRect.left - dropRect.width - xOffset;\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'left-start':\r\n\t\t\t\ttop = refRect.top + yOffset;\r\n\t\t\t\tleft = refRect.left - dropRect.width - xOffset;\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'left-end':\r\n\t\t\t\ttop = refRect.bottom - dropRect.height - yOffset;\r\n\t\t\t\tleft = refRect.left - dropRect.width - xOffset;\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'right':\r\n\t\t\t\ttop = refRect.top + (refRect.height - dropRect.height) / 2;\r\n\t\t\t\tleft = refRect.right + xOffset;\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'right-start':\r\n\t\t\t\ttop = refRect.top + yOffset;\r\n\t\t\t\tleft = refRect.right + xOffset;\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase 'right-end':\r\n\t\t\t\ttop = refRect.bottom - dropRect.height - yOffset;\r\n\t\t\t\tleft = refRect.right + xOffset;\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tdefault:\r\n\t\t\t\ttop = refRect.bottom + yOffset;\r\n\t\t\t\tleft = refRect.left + xOffset;\r\n\t\t}\r\n\r\n\t\treturn { top, left };\r\n\t}\r\n\r\n\t_calculateOverflow(pos, dropRect, viewRect) {\r\n\t\tlet overflow = 0;\r\n\r\n\t\tif (pos.left < viewRect.left) {\r\n\t\t\toverflow += viewRect.left - pos.left;\r\n\t\t}\r\n\r\n\t\tif (pos.top < viewRect.top) {\r\n\t\t\toverflow += viewRect.top - pos.top;\r\n\t\t}\r\n\r\n\t\tif (pos.left + dropRect.width > viewRect.right) {\r\n\t\t\toverflow += (pos.left + dropRect.width) - viewRect.right;\r\n\t\t}\r\n\r\n\t\tif (pos.top + dropRect.height > viewRect.bottom) {\r\n\t\t\toverflow += (pos.top + dropRect.height) - viewRect.bottom;\r\n\t\t}\r\n\r\n\t\treturn overflow;\r\n\t}\r\n\r\n\t_clampPosition(pos, dropRect, viewRect) {\r\n\t\tconst padding = this.clampPadding;\r\n\r\n\t\tconst maxTop = viewRect.bottom - dropRect.height - padding;\r\n\t\tconst maxLeft = viewRect.right - dropRect.width - padding;\r\n\r\n\t\treturn {\r\n\t\t\ttop: Math.min(\r\n\t\t\t\tMath.max(pos.top, viewRect.top + padding),\r\n\t\t\t\tmaxTop\r\n\t\t\t),\r\n\t\t\tleft: Math.min(\r\n\t\t\t\tMath.max(pos.left, viewRect.left + padding),\r\n\t\t\t\tmaxLeft\r\n\t\t\t)\r\n\t\t};\r\n\t}\r\n\r\n\t_setStyles(pos) {\r\n\t\tif (!pos || !this.drop) return;\r\n\r\n\t\tif (this.isMerge) {\r\n\t\t\tmergeDeepObject(this.drop.style, {\r\n\t\t\t\tposition: 'absolute',\r\n\t\t\t\ttop: `${pos.top + window.pageYOffset}px`,\r\n\t\t\t\tleft: `${pos.left + window.pageXOffset}px`,\r\n\t\t\t\tmargin: '0'\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tthis.drop.style.position = 'absolute';\r\n\t\t\tthis.drop.style.top = `${pos.top + window.pageYOffset}px`;\r\n\t\t\tthis.drop.style.left = `${pos.left + window.pageXOffset}px`;\r\n\t\t\tthis.drop.style.margin = '0';\r\n\t\t}\r\n\t}\r\n\r\n\t_setPlacement() {\r\n\t\tthis._getOverflowConstraints();\r\n\t}\r\n}\r\n\r\nexport default Placement;","import BaseModule from \"../../base-module\";\r\nimport EventHandler from \"../../../utils/js/dom/event\";\r\nimport Selectors from \"../../../utils/js/dom/selectors\";\r\nimport {isDisabled, isMobileDevice, mergeDeepObject, noop} from \"../../../utils/js/functions\";\r\nimport Placement from \"../../../utils/js/components/placement\";\r\n\r\n/**\r\n * Константы, используемые в модуле выпадающего списка.\r\n * @type {Object}\r\n * @property {string} NAME - Имя модуля.\r\n * @property {string} NAME_KEY - Уникальный ключ модуля с префиксом.\r\n * @property {string} CLASS_NAME_SHOW - CSS-класс для отображения элемента.\r\n * @property {string} CLASS_NAME_FADE - CSS-класс для эффекта затухания.\r\n * @property {string} CLASS_NAME_OPEN - CSS-класс для немигающего открытия.\r\n * @property {string} TARGET_CONTAINER - Класс контейнера выпадающего меню.\r\n * @property {string} PARENT_CONTAINER - Класс родительского контейнера.\r\n * @property {string} SELECTOR_DATA_TOGGLE - Селектор элемента-переключателя.\r\n */\r\nconst NAME = 'dropdown';\r\nconst NAME_KEY = 'vg.dropdown';\r\nconst CLASS_NAME_SHOW = 'show';\r\nconst CLASS_NAME_FADE = 'fade';\r\nconst CLASS_NAME_OPEN = 'open';\r\nconst TARGET_CONTAINER = 'vg-dropdown-content';\r\nconst PARENT_CONTAINER = 'vg-dropdown';\r\nconst SELECTOR_DATA_TOGGLE = '[data-vg-toggle=\"dropdown\"]';\r\n\r\n/**\r\n * События, генерируемые модулем.\r\n * @type {Object}\r\n */\r\nconst EVENT_KEY_HIDE = `${NAME_KEY}.hide`;\r\nconst EVENT_KEY_HIDDEN = `${NAME_KEY}.hidden`;\r\nconst EVENT_KEY_SHOW = `${NAME_KEY}.show`;\r\nconst EVENT_KEY_SHOWN = `${NAME_KEY}.shown`;\r\nconst EVENT_KEY_LOADED = `${NAME_KEY}.loaded`;\r\n\r\n/**\r\n * Делегированные события на уровне документа.\r\n * @type {Object}\r\n */\r\nconst EVENT_KEYUP_DATA_API = `keyup.${NAME_KEY}.data.api`;\r\nconst EVENT_KEYDOWN_DATA_API = `keydown.${NAME_KEY}.data.api`;\r\nconst EVENT_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;\r\nconst EVENT_MOUSEOVER_DATA_API = `mouseover.${NAME_KEY}.data.api`;\r\nconst EVENT_MOUSEOUT_DATA_API = `mouseout.${NAME_KEY}.data.api`;\r\n\r\n/**\r\n * Компонент выпадающего списка (Dropdown).\r\n *\r\n * @extends BaseModule\r\n *\r\n * @example\r\n * const dropdown = new VGDropdown(document.querySelector('[data-vg-toggle=\"dropdown\"]'), {\r\n * placement: 'bottom-start',\r\n * hover: true,\r\n * animation: {\r\n * enable: true,\r\n * in: 'animate__fadeIn',\r\n * out: 'animate__fadeOut',\r\n * delay: 150\r\n * }\r\n * });\r\n *\r\n * @example <caption>Инициализация через data-атрибуты</caption>\r\n * <div class=\"vg-dropdown\">\r\n * <button data-vg-toggle=\"dropdown\" aria-expanded=\"false\">Меню</button>\r\n * <div class=\"vg-dropdown-content\">Содержимое меню</div>\r\n * </div>\r\n */\r\nclass VGDropdown extends BaseModule {\r\n\t/**\r\n\t * Создаёт экземпляр VGDropdown.\r\n\t *\r\n\t * @param {HTMLElement} element - Элемент-переключатель (кнопка).\r\n\t * @param {Object} [params] - Пользовательские параметры.\r\n\t * @param {string} [params.placement='auto'] - Позиция выпадающего окна: 'top', 'bottom', 'left', 'right', 'auto' и т.д.\r\n\t * @param {boolean} [params.hover=false] - Открывать по наведению мыши.\r\n\t * @param {Object} [params.ajax] - Параметры AJAX-загрузки.\r\n\t * @param {string} [params.ajax.route=''] - URL для загрузки контента.\r\n\t * @param {string} [params.ajax.target=''] - Селектор внутри drop для вставки данных.\r\n\t * @param {string} [params.ajax.method='get'] - HTTP-метод.\r\n\t * @param {boolean} [params.ajax.loader=false] - Показывать ли лоадер.\r\n\t * @param {boolean} [params.ajax.once=false] - Загружать один раз.\r\n\t * @param {boolean} [params.ajax.output=true] - Вставлять ли ответ в DOM.\r\n\t * @param {Object} [params.animation] - Настройки анимации.\r\n\t * @param {boolean} [params.animation.fade=false] - Использовать fade-анимацию.\r\n\t * @param {boolean} [params.animation.enable=false] - Включить CSS-анимации.\r\n\t * @param {string} [params.animation.in='animate__flipInY'] - Класс для анимации входа.\r\n\t * @param {string} [params.animation.out='animate__flipOutY'] - Класс для анимации выхода.\r\n\t * @param {number} [params.animation.delay=300] - Задержка перед завершением скрытия (в мс).\r\n\t */\r\n\tconstructor(element, params) {\r\n\t\tsuper(element, params);\r\n\r\n\t\tlet defaultParams = {\r\n\t\t\tplacement: 'auto',\r\n\t\t\thover: false,\r\n\t\t\tajax: {\r\n\t\t\t\troute: '',\r\n\t\t\t\ttarget: '',\r\n\t\t\t\tmethod: 'get',\r\n\t\t\t\tloader: false,\r\n\t\t\t\tonce: false,\r\n\t\t\t\toutput: true,\r\n\t\t\t},\r\n\t\t\tanimation: {\r\n\t\t\t\tfade: true,\r\n\t\t\t\tenable: false,\r\n\t\t\t\tin: 'animate__flipInY',\r\n\t\t\t\tout: 'animate__flipOutY',\r\n\t\t\t\tdelay: 300,\r\n\t\t\t},\r\n\t\t};\r\n\r\n\t\tthis._params = this._getParams(element, mergeDeepObject(defaultParams, params));\r\n\r\n\t\tconst target = Selectors.getElementFromSelector(this._element);\r\n\t\tthis._parent = this._element.parentNode;\r\n\t\tthis._drop = target || Selectors.find(`.${TARGET_CONTAINER}`, this._parent);\r\n\r\n\t\tif (!this._drop) return;\r\n\r\n\t\tthis._isPlacement = false;\r\n\t\tthis.isFade = this._params.animation.fade;\r\n\t\tthis.isAnimation = this._params.animation.enable;\r\n\r\n\t\tthis._params.animation.delay = this.isAnimation ? this._params.animation.delay : 0;\r\n\t\tthis._animation(this._drop, VGDropdown.NAME_KEY, this._params.animation);\r\n\t}\r\n\r\n\t/**\r\n\t * Возвращает имя компонента.\r\n\t * @return {string}\r\n\t */\r\n\tstatic get NAME() {\r\n\t\treturn NAME;\r\n\t}\r\n\r\n\t/**\r\n\t * Возвращает уникальный ключ компонента.\r\n\t * @return {string}\r\n\t */\r\n\tstatic get NAME_KEY() {\r\n\t\treturn NAME_KEY;\r\n\t}\r\n\r\n\t/**\r\n\t * Переключает состояние выпадающего списка (открыто/закрыто).\r\n\t * @return {void}\r\n\t */\r\n\ttoggle() {\r\n\t\treturn this._isShown() ? this.hide() : this.show();\r\n\t}\r\n\r\n\t/**\r\n\t * Открывает выпадающий список.\r\n\t * @fires VGDropdown#show - Перед открытием.\r\n\t * @fires VGDropdown#shown - После открытия.\r\n\t * @return {void}\r\n\t */\r\n\tshow() {\r\n\t\tif (isDisabled(this._element) || this._isShown()) return;\r\n\r\n\t\tconst relatedTarget = { relatedTarget: this._element };\r\n\r\n\t\tconst showEvent = EventHandler.trigger(this._drop, EVENT_KEY_SHOW, relatedTarget);\r\n\t\tif (showEvent.defaultPrevented) return;\r\n\r\n\t\tif ('ontouchstart' in document.documentElement) {\r\n\t\t\t[].concat(...document.body.children).forEach(el => {\r\n\t\t\t\tEventHandler.on(el, 'mouseover', noop);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tthis._element.setAttribute('aria-expanded', 'true');\r\n\t\tthis._element.classList.add(CLASS_NAME_SHOW);\r\n\t\tthis._drop.classList.add(CLASS_NAME_SHOW);\r\n\t\tthis._setPlacement();\r\n\r\n\t\tconst completeCallback = () => {\r\n\t\t\tthis._route((status, data) => {\r\n\t\t\t\tEventHandler.trigger(this._element, EVENT_KEY_LOADED, { stats: status, data });\r\n\t\t\t});\r\n\r\n\t\t\tif (this.isFade) {\r\n\t\t\t\tthis._drop.classList.add(CLASS_NAME_FADE);\r\n\t\t\t} else if (!this.isAnimation) {\r\n\t\t\t\tthis._drop.classList.add(CLASS_NAME_OPEN);\r\n\t\t\t}\r\n\t\t\tEventHandler.trigger(this._drop, EVENT_KEY_SHOWN, relatedTarget);\r\n\t\t};\r\n\r\n\t\tthis._queueCallback(completeCallback, this._drop, this.isAnimation || this.isFade, 50);\r\n\t}\r\n\r\n\t/**\r\n\t * Закрывает выпадающий список.\r\n\t * @fires VGDropdown#hide - Перед закрытием.\r\n\t * @fires VGDropdown#hidden - После закрытия.\r\n\t * @return {void}\r\n\t */\r\n\thide() {\r\n\t\tif (isDisabled(this._element) || !this._isShown()) return;\r\n\t\tthis._completeHide({ relatedTarget: this._element });\r\n\t}\r\n\r\n\t/**\r\n\t * Удаляет инстанс компонента и очищает обработчики событий.\r\n\t * @return {void}\r\n\t */\r\n\tdispose() {\r\n\t\tsuper.dispose();\r\n\t}\r\n\r\n\t/**\r\n\t * Проверяет, открыто ли выпадающее меню.\r\n\t * @return {boolean} - `true`, если открыто.\r\n\t * @private\r\n\t */\r\n\t_isShown() {\r\n\t\treturn this._element.classList.contains(CLASS_NAME_SHOW);\r\n\t}\r\n\r\n\t/**\r\n\t * Полностью закрывает меню с анимацией и callback.\r\n\t * @param {Object} relatedTarget - Событие-инициатор.\r\n\t * @private\r\n\t */\r\n\t_completeHide(relatedTarget) {\r\n\t\tconst hideEvent = EventHandler.trigger(this._drop, EVENT_KEY_HIDE, relatedTarget);\r\n\t\tif (hideEvent.defaultPrevented) return;\r\n\r\n\t\tif ('ontouchstart' in document.documentElement) {\r\n\t\t\t[].concat(...document.body.children).forEach(el => {\r\n\t\t\t\tEventHandler.off(el, 'mouseover', noop);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tthis._element.classList.remove(CLASS_NAME_SHOW);\r\n\t\tthis._element.setAttribute('aria-expanded', 'false');\r\n\r\n\t\tif (this.isFade) {\r\n\t\t\tthis._drop.classList.remove(CLASS_NAME_FADE);\r\n\t\t} else if (!this.isAnimation) {\r\n\t\t\tthis._drop.classList.remove(CLASS_NAME_OPEN);\r\n\t\t}\r\n\r\n\t\tsetTimeout(() => {\r\n\t\t\tconst completeCallback = () => {\r\n\t\t\t\tthis._drop.classList.remove(CLASS_NAME_SHOW);\r\n\t\t\t\tEventHandler.trigger(this._drop, EVENT_KEY_HIDDEN, relatedTarget);\r\n\t\t\t};\r\n\t\t\tthis._queueCallback(completeCallback, this._drop, this.isAnimation || this.isFade);\r\n\t\t}, this._params.animation.delay);\r\n\t}\r\n\r\n\t/**\r\n\t * Устанавливает позицию выпадающего окна с помощью вспомогательного класса Placement.\r\n\t * @private\r\n\t */\r\n\t_setPlacement() {\r\n\t\tif (!this._drop) return;\r\n\r\n\t\tif (!this._isPlacement) {\r\n\t\t\tlet placementDefault = 'bottom-start',\r\n\t\t\t\tautoFlip = false,\r\n\t\t\t\toverflowProtection = false;\r\n\r\n\t\t\tif (this._params.placement === 'auto') {\r\n\t\t\t\tautoFlip = true;\r\n\t\t\t\toverflowProtection = true;\r\n\t\t\t} else {\r\n\t\t\t\tplacementDefault = this._params.placement\r\n\t\t\t}\r\n\r\n\t\t\tconst placement = new Placement({\r\n\t\t\t\treference: this._element,\r\n\t\t\t\tdrop: this._drop,\r\n\t\t\t\tplacement: placementDefault,\r\n\t\t\t\tboundary: 'clippingParents',\r\n\t\t\t\tautoFlip: autoFlip,\r\n\t\t\t\toverflowProtection: overflowProtection,\r\n\t\t\t\tfallbackPlacements: ['top-start', 'bottom-end', 'top-end'],\r\n\t\t\t});\r\n\r\n\t\t\tplacement._setPlacement(); // позиционируем\r\n\t\t}\r\n\r\n\t\tthis._isPlacement = true;\r\n\t}\r\n\r\n\t/**\r\n\t * Инициализирует компонент на указанном элементе и устанавливает обработчики событий.\r\n\t * @param {HTMLElement} element - Элемент-переключатель.\r\n\t * @param {Object} [params] - Параметры инициализации.\r\n\t * @return {VGDropdown} - Экземпляр компонента.\r\n\t */\r\n\tstatic init(element, params = {}) {\r\n\t\tconst instance = VGDropdown.getOrCreateInstance(element, params);\r\n\r\n\t\tif (instance._params.hover && !isMobileDevice()) {\r\n\t\t\tlet currentElem = null;\r\n\r\n\t\t\tEventHandler.on(instance._parent, EVENT_MOUSEOVER_DATA_API, (event) => {\r\n\t\t\t\tif (currentElem) return;\r\n\r\n\t\t\t\tVGDropdown.hideOpenToggles(event);\r\n\r\n\t\t\t\tconst target = event.target.closest(`.${PARENT_CONTAINER}`);\r\n\t\t\t\tif (!target || !instance._parent.contains(target)) return;\r\n\r\n\t\t\t\tcurrentElem = target;\r\n\t\t\t\tinstance.show();\r\n\t\t\t});\r\n\r\n\t\t\tEventHandler.on(instance._parent, EVENT_MOUSEOUT_DATA_API, (event) => {\r\n\t\t\t\tif (!currentElem) return;\r\n\r\n\t\t\t\tlet relatedTarget = event.relatedTarget;\r\n\t\t\t\twhile (relatedTarget && relatedTarget !== currentElem) {\r\n\t\t\t\t\trelatedTarget = relatedTarget.parentNode;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (relatedTarget === currentElem) return;\r\n\r\n\t\t\t\tcurrentElem = null;\r\n\t\t\t\tinstance._completeHide({ relatedTarget: instance._element });\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Клавиатурные события\r\n\t\tEventHandler.on(document, EVENT_KEYUP_DATA_API, SELECTOR_DATA_TOGGLE, VGDropdown.keydownHandler);\r\n\t\tEventHandler.on(document, EVENT_KEYDOWN_DATA_API, `.${TARGET_CONTAINER}`, VGDropdown.keydownHandler);\r\n\t\tEventHandler.on(document, EVENT_KEYUP_DATA_API, VGDropdown.clearDrops);\r\n\t\tEventHandler.on(document, EVENT_CLICK_DATA_API, VGDropdown.clearDrops);\r\n\r\n\t\t// Клик по тоглу\r\n\t\tEventHandler.on(element, EVENT_CLICK_DATA_API, (event) => {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tinstance.toggle();\r\n\t\t});\r\n\r\n\t\treturn instance;\r\n\t}\r\n\r\n\t/**\r\n\t * Скрывает все открытые выпадающие списки.\r\n\t * @param {Event} event - Событие, инициировавшее скрытие.\r\n\t * @static\r\n\t */\r\n\tstatic hideOpenToggles(event) {\r\n\t\tconst openToggles = Selectors.findAll(`${SELECTOR_DATA_TOGGLE}:not(.disabled):not(:disabled).${CLASS_NAME_SHOW}`);\r\n\t\tfor (const toggle of openToggles) {\r\n\t\t\tconst context = VGDropdown.getInstance(toggle);\r\n\t\t\tif (!context) continue;\r\n\r\n\t\t\tif (event.target.closest(`.${TARGET_CONTAINER}`) === context._drop) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst composedPath = event.composedPath?.() || [];\r\n\t\t\tif (composedPath.includes(context._element)) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tconst relatedTarget = { relatedTarget: context._element };\r\n\t\t\tif (event.type === 'click') {\r\n\t\t\t\trelatedTarget.clickEvent = event;\r\n\t\t\t}\r\n\r\n\t\t\tcontext._completeHide(relatedTarget);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Обработчик клавиатурных событий (стрелки, Esc).\r\n\t * @param {KeyboardEvent} event - Клавиатурное событие.\r\n\t * @static\r\n\t */\r\n\tstatic keydownHandler(event) {\r\n\t\tconst isInput = /input|textarea/i.test(event.target.tagName);\r\n\t\tconst isEscapeEvent = event.key === 'Escape';\r\n\t\tconst isUpOrDownEvent = ['ArrowUp', 'ArrowDown'].includes(event.key);\r\n\r\n\t\tif (!isUpOrDownEvent && !isEscapeEvent) return;\r\n\t\tif (isInput && !isEscapeEvent) return;\r\n\r\n\t\tevent.preventDefault();\r\n\r\n\t\tconst toggle = this.matches(SELECTOR_DATA_TOGGLE)\r\n\t\t\t? this\r\n\t\t\t: Selectors.find(SELECTOR_DATA_TOGGLE, event.delegateTarget?.parentNode);\r\n\r\n\t\tif (!toggle) return;\r\n\r\n\t\tconst instance = VGDropdown.getOrCreateInstance(toggle);\r\n\r\n\t\tif (isUpOrDownEvent) {\r\n\t\t\tevent.stopPropagation();\r\n\t\t\tinstance.show();\r\n\t\t} else if (instance._isShown()) {\r\n\t\t\tevent.stopPropagation();\r\n\t\t\tinstance.hide();\r\n\t\t\ttoggle.focus();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Обработчик кликов и Tab для закрытия выпадающих списков.\r\n\t * @param {Event} event - Событие (click или keyup).\r\n\t * @static\r\n\t */\r\n\tstatic clearDrops(event) {\r\n\t\tif (event.button === 2 || (event.type === 'keyup' && event.key !== 'Tab')) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tVGDropdown.hideOpenToggles(event);\r\n\t}\r\n}\r\n\r\nexport default VGDropdown;","import VGDropdown from \"./js/vgdropdown\";\r\n\r\nexport default VGDropdown;","const fixedColumnsMethods = {\r\n _getFixedColumnsConfigRaw() {\r\n const fixedOptions = this._params && this._params.fixed && typeof this._params.fixed === 'object'\r\n ? this._params.fixed\r\n : {};\r\n const optionRaw = fixedOptions.columns;\r\n const attrRaw = this._element\r\n ? this._element.getAttribute('data-fixed-columns')\r\n : null;\r\n const raw = attrRaw !== null && attrRaw !== undefined && String(attrRaw).trim() !== ''\r\n ? attrRaw\r\n : optionRaw;\r\n return String(raw || '').trim();\r\n },\r\n\r\n _hasFixedColumnsConfig() {\r\n const attr = this._getFixedColumnsConfigRaw();\r\n if (attr !== '') {\r\n return true;\r\n }\r\n const headers = this._element && this._element.tHead\r\n ? Array.from(this._element.tHead.querySelectorAll('th'))\r\n : [];\r\n return headers.some((header) => {\r\n const fixedAttr = String(header.getAttribute('data-fixed') || '').toLowerCase().trim();\r\n const fixedColumnAttr = String(header.getAttribute('data-fixed-column') || '').toLowerCase().trim();\r\n return fixedAttr === 'left' || fixedAttr === 'right' || fixedColumnAttr === 'left' || fixedColumnAttr === 'right';\r\n });\r\n },\r\n\r\n _buildFixedColumnsStateMap(fixed) {\r\n const state = new Map();\r\n const left = Array.isArray(fixed && fixed.left) ? fixed.left : [];\r\n const right = Array.isArray(fixed && fixed.right) ? fixed.right : [];\r\n left.forEach((index) => {\r\n if (Number.isInteger(index) && index >= 0) {\r\n state.set(index, 'left');\r\n }\r\n });\r\n right.forEach((index) => {\r\n if (Number.isInteger(index) && index >= 0 && !state.has(index)) {\r\n state.set(index, 'right');\r\n }\r\n });\r\n return state;\r\n },\r\n\r\n _collectFixedColumnsTransitions(nextState) {\r\n const previousState = this._fixedColumnsLastStateMap instanceof Map\r\n ? this._fixedColumnsLastStateMap\r\n : new Map();\r\n const transitions = [];\r\n nextState.forEach((side, index) => {\r\n if (previousState.get(index) !== side) {\r\n transitions.push({ index, side });\r\n }\r\n });\r\n this._fixedColumnsLastStateMap = nextState;\r\n return transitions;\r\n },\r\n\r\n _applyFixedColumnsLayout() {\r\n if (!this._element) {\r\n return;\r\n }\r\n const suppressFixedColumns = Boolean(this._fixedColumnsSuppressed);\r\n\r\n const sourceHeaders = this._element.tHead ? Array.from(this._element.tHead.querySelectorAll('th')) : [];\r\n const sourceFixedRaw = this._getFixedColumnsByHeaders(sourceHeaders, {\r\n parseTableAttr: true,\r\n fallbackByPosition: true,\r\n });\r\n const sourceFixed = suppressFixedColumns\r\n ? { left: [], right: [] }\r\n : this._applyMobileFixedColumnsGuard(this._element, sourceFixedRaw);\r\n const hasSourceFixed = sourceFixed.left.length > 0 || sourceFixed.right.length > 0;\r\n this._element.classList.toggle('table-fixed-cols', hasSourceFixed);\r\n if (this._parent) {\r\n this._parent.classList.toggle('table-fixed-cols', hasSourceFixed);\r\n }\r\n const sourceFixedTransitions = this._collectFixedColumnsTransitions(\r\n this._buildFixedColumnsStateMap(sourceFixed)\r\n );\r\n this._applyFixedColumnsToTable(this._element, sourceFixed, {\r\n includeBody: true,\r\n emitAction: true,\r\n transitionedColumns: sourceFixedTransitions,\r\n });\r\n this._toggleFixedColumnsScrollBinding(hasSourceFixed);\r\n\r\n const cloneTable = this._cloneStickyState && this._cloneStickyState.table\r\n ? this._cloneStickyState.table\r\n : null;\r\n if (cloneTable) {\r\n const cloneHeaders = cloneTable.tHead ? Array.from(cloneTable.tHead.querySelectorAll('th')) : [];\r\n const cloneFixedRaw = this._getFixedColumnsByHeaders(cloneHeaders, {\r\n parseTableAttr: false,\r\n fallbackByPosition: false,\r\n });\r\n const cloneFixed = hasSourceFixed\r\n ? this._applyMobileFixedColumnsGuard(cloneTable, cloneFixedRaw)\r\n : { left: [], right: [] };\r\n this._applyFixedColumnsToTable(cloneTable, cloneFixed, {\r\n includeBody: false,\r\n emitAction: false,\r\n });\r\n }\r\n this._rebuildFixedColumnsCellsCache();\r\n this._syncFixedColumnsScroll({ immediate: true });\r\n },\r\n\r\n _applyMobileFixedColumnsGuard(table, fixed) {\r\n const next = {\r\n left: Array.isArray(fixed && fixed.left) ? fixed.left.slice() : [],\r\n right: Array.isArray(fixed && fixed.right) ? fixed.right.slice() : [],\r\n };\r\n if (!this._isTouchDevice()) {\r\n return next;\r\n }\r\n const viewportMetrics = this._getViewportWidthMetrics();\r\n const viewportWidth = viewportMetrics\r\n ? viewportMetrics.effectiveWidth\r\n : (table ? table.getBoundingClientRect().width : 0);\r\n const isMobileViewport = viewportWidth > 0 && viewportWidth <= 768;\r\n if (!isMobileViewport) {\r\n return next;\r\n }\r\n\r\n const fixedIndexes = next.left.concat(next.right);\r\n if (fixedIndexes.length <= 0) {\r\n return next;\r\n }\r\n if (fixedIndexes.length > 1) {\r\n return { left: [], right: [] };\r\n }\r\n\r\n const headerCells = table && table.tHead ? Array.from(table.tHead.querySelectorAll('th')) : [];\r\n const fixedIndex = fixedIndexes[0];\r\n const header = Number.isInteger(fixedIndex) && fixedIndex >= 0 && fixedIndex < headerCells.length\r\n ? headerCells[fixedIndex]\r\n : null;\r\n if (!header) {\r\n return next;\r\n }\r\n\r\n const columnWidth = header.getBoundingClientRect().width || 0;\r\n if (columnWidth > viewportWidth * 0.5) {\r\n return { left: [], right: [] };\r\n }\r\n\r\n return next;\r\n },\r\n\r\n _getFixedColumnsByHeaders(headers, options = {}) {\r\n const list = Array.isArray(headers) ? headers : [];\r\n const parseTableAttr = options.parseTableAttr !== false;\r\n const fallbackByPosition = options.fallbackByPosition !== false;\r\n const byField = new Map();\r\n const leftSet = new Set();\r\n const rightSet = new Set();\r\n const autoIndexes = [];\r\n\r\n list.forEach((header, index) => {\r\n const field = String(header.getAttribute('data-field') || '').trim();\r\n if (field !== '') {\r\n byField.set(field, index);\r\n }\r\n });\r\n\r\n list.forEach((header, index) => {\r\n const fixedAttr = String(header.getAttribute('data-fixed') || '').toLowerCase().trim();\r\n const fixedColumnAttr = String(header.getAttribute('data-fixed-column') || '').toLowerCase().trim();\r\n const side = fixedAttr === 'left' || fixedAttr === 'right'\r\n ? fixedAttr\r\n : (fixedColumnAttr === 'left' || fixedColumnAttr === 'right' ? fixedColumnAttr : '');\r\n if (side === 'left') {\r\n leftSet.add(index);\r\n } else if (side === 'right') {\r\n rightSet.add(index);\r\n } else if (!parseTableAttr) {\r\n const clonedSide = String(header.getAttribute('data-fixed-side') || '').toLowerCase().trim();\r\n if (clonedSide === 'left') {\r\n leftSet.add(index);\r\n } else if (clonedSide === 'right') {\r\n rightSet.add(index);\r\n }\r\n }\r\n });\r\n\r\n if (parseTableAttr && this._element) {\r\n const attrRaw = this._getFixedColumnsConfigRaw();\r\n if (attrRaw !== '') {\r\n const groups = attrRaw.split(';').map((item) => item.trim()).filter(Boolean);\r\n groups.forEach((group) => {\r\n const sideMatch = group.match(/^(left|right)\\s*:\\s*(.+)$/i);\r\n const explicitSide = sideMatch ? sideMatch[1].toLowerCase() : '';\r\n const valuesRaw = sideMatch ? sideMatch[2] : group;\r\n const values = valuesRaw.split(',').map((item) => item.trim()).filter(Boolean);\r\n values.forEach((name) => {\r\n const index = byField.has(name) ? byField.get(name) : Number.parseInt(name, 10);\r\n if (!Number.isInteger(index) || index < 0 || index >= list.length) {\r\n return;\r\n }\r\n if (explicitSide === 'left') {\r\n leftSet.add(index);\r\n } else if (explicitSide === 'right') {\r\n rightSet.add(index);\r\n } else {\r\n autoIndexes.push(index);\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n autoIndexes.forEach((index) => {\r\n if (leftSet.has(index) || rightSet.has(index)) {\r\n return;\r\n }\r\n const distanceLeft = index;\r\n const distanceRight = Math.max(0, list.length - 1 - index);\r\n if (distanceLeft <= distanceRight || !fallbackByPosition) {\r\n leftSet.add(index);\r\n return;\r\n }\r\n rightSet.add(index);\r\n });\r\n\r\n const left = Array.from(leftSet).sort((a, b) => a - b);\r\n const right = Array.from(rightSet)\r\n .filter((index) => !leftSet.has(index))\r\n .sort((a, b) => a - b);\r\n\r\n return { left, right };\r\n },\r\n\r\n _applyFixedColumnsToTable(table, fixed, options = {}) {\r\n if (!table) {\r\n return;\r\n }\r\n const includeBody = options.includeBody !== false;\r\n const shouldEmitAction = options.emitAction !== false;\r\n const transitionedColumns = Array.isArray(options.transitionedColumns)\r\n ? options.transitionedColumns\r\n : [];\r\n const sections = [];\r\n if (table.tHead) {\r\n sections.push(table.tHead);\r\n }\r\n if (includeBody && table.tBodies && table.tBodies.length) {\r\n sections.push(...Array.from(table.tBodies));\r\n }\r\n if (includeBody && table.tFoot) {\r\n sections.push(table.tFoot);\r\n }\r\n\r\n const rows = [];\r\n sections.forEach((section) => {\r\n rows.push(...Array.from(section.rows || []));\r\n });\r\n const hasFixed = fixed && (fixed.left.length > 0 || fixed.right.length > 0);\r\n rows.forEach((row) => {\r\n Array.from(row.cells || []).forEach((cell) => {\r\n cell.removeAttribute('data-fixed-side');\r\n cell.removeAttribute('data-fixed-edge');\r\n cell.removeAttribute('data-fixed-shift');\r\n cell.removeAttribute('data-fixed-shadow');\r\n cell.removeAttribute('data-fixed-overlap');\r\n cell.style.removeProperty('z-index');\r\n cell.style.removeProperty('transform');\r\n });\r\n });\r\n\r\n if (!hasFixed) {\r\n return;\r\n }\r\n\r\n const headerCells = table.tHead ? Array.from(table.tHead.querySelectorAll('th')) : [];\r\n const tableRect = table.getBoundingClientRect();\r\n const viewportMetrics = this._getViewportWidthMetrics();\r\n const viewportWidth = viewportMetrics\r\n ? viewportMetrics.effectiveWidth\r\n : tableRect.width;\r\n const metrics = {};\r\n headerCells.forEach((cell, index) => {\r\n const rect = cell.getBoundingClientRect();\r\n metrics[index] = {\r\n width: Math.max(0, rect.width),\r\n left: Math.max(0, rect.left - tableRect.left),\r\n height: Math.max(0, rect.height),\r\n top: Math.max(0, rect.top - tableRect.top),\r\n };\r\n });\r\n const leftOffsets = {};\r\n let leftOffset = 0;\r\n fixed.left.forEach((index) => {\r\n const width = metrics[index] ? metrics[index].width : 0;\r\n leftOffsets[index] = leftOffset;\r\n leftOffset += width;\r\n });\r\n\r\n const rightOffsets = {};\r\n let rightOffset = 0;\r\n fixed.right.slice().sort((a, b) => b - a).forEach((index) => {\r\n const width = metrics[index] ? metrics[index].width : 0;\r\n rightOffsets[index] = rightOffset;\r\n rightOffset += width;\r\n });\r\n\r\n const leftEdgeIndex = fixed.left.length ? fixed.left[fixed.left.length - 1] : -1;\r\n const rightEdgeIndex = fixed.right.length ? fixed.right[0] : -1;\r\n rows.forEach((row) => {\r\n const isHeaderRow = row.parentElement && row.parentElement.tagName === 'THEAD';\r\n const zIndex = isHeaderRow ? 6 : 2;\r\n\r\n fixed.left.forEach((index) => {\r\n const cell = row.cells && row.cells[index] ? row.cells[index] : null;\r\n if (!cell) {\r\n return;\r\n }\r\n const metric = metrics[index] || { left: 0 };\r\n const baseShift = leftOffsets[index] - metric.left;\r\n cell.setAttribute('data-fixed-side', 'left');\r\n cell.setAttribute('data-fixed-shift', String(baseShift));\r\n cell.style.zIndex = String(zIndex);\r\n if (index === leftEdgeIndex) {\r\n cell.setAttribute('data-fixed-edge', 'right');\r\n }\r\n });\r\n\r\n fixed.right.forEach((index) => {\r\n const cell = row.cells && row.cells[index] ? row.cells[index] : null;\r\n if (!cell) {\r\n return;\r\n }\r\n const metric = metrics[index] || { left: 0, width: 0 };\r\n const desiredLeft = viewportWidth - rightOffsets[index] - metric.width;\r\n const baseShift = desiredLeft - metric.left;\r\n cell.setAttribute('data-fixed-side', 'right');\r\n cell.setAttribute('data-fixed-shift', String(baseShift));\r\n cell.style.zIndex = String(zIndex);\r\n if (index === rightEdgeIndex) {\r\n cell.setAttribute('data-fixed-edge', 'left');\r\n }\r\n });\r\n });\r\n\r\n if (!shouldEmitAction || typeof this._emitAction !== 'function' || !transitionedColumns.length) {\r\n return;\r\n }\r\n\r\n transitionedColumns.forEach((entry) => {\r\n const index = Number.isInteger(entry && entry.index) ? entry.index : -1;\r\n const side = entry && (entry.side === 'left' || entry.side === 'right')\r\n ? entry.side\r\n : '';\r\n const headerCell = index >= 0 && index < headerCells.length\r\n ? headerCells[index]\r\n : null;\r\n if (!headerCell || !side) {\r\n return;\r\n }\r\n\r\n const metric = metrics[index] || { left: 0, width: 0, top: 0, height: 0 };\r\n const width = metric.width || 0;\r\n const height = metric.height || 0;\r\n const left = side === 'left'\r\n ? (leftOffsets[index] || 0)\r\n : Math.max(0, viewportWidth - (rightOffsets[index] || 0) - width);\r\n const right = side === 'right'\r\n ? (rightOffsets[index] || 0)\r\n : Math.max(0, viewportWidth - left - width);\r\n const top = metric.top || 0;\r\n const bottom = Math.max(0, tableRect.height - top - height);\r\n const field = String(headerCell.getAttribute('data-field') || '').trim();\r\n const fallbackBaseShift = left - (metric.left || 0);\r\n const attrBaseShift = Number.parseFloat(headerCell.getAttribute('data-fixed-shift') || '');\r\n const baseShift = Number.isFinite(attrBaseShift) ? attrBaseShift : fallbackBaseShift;\r\n const scrollLeft = this._tableViewport ? (this._tableViewport.scrollLeft || 0) : 0;\r\n const fixedAtTs = Date.now();\r\n\r\n this._emitAction('columnfixed', {\r\n columnIndex: index,\r\n side,\r\n phase: 'fixed',\r\n field,\r\n column: {\r\n index,\r\n side,\r\n field,\r\n width,\r\n height,\r\n element: headerCell,\r\n },\r\n offsets: {\r\n left,\r\n right,\r\n top,\r\n bottom,\r\n },\r\n shift: {\r\n base: baseShift,\r\n current: baseShift + scrollLeft,\r\n scrollLeft,\r\n },\r\n fixedAt: {\r\n timestamp: fixedAtTs,\r\n iso: new Date(fixedAtTs).toISOString(),\r\n },\r\n });\r\n });\r\n },\r\n\r\n _toggleFixedColumnsScrollBinding(enabled) {\r\n if (!this._tableViewport) {\r\n this._resetFixedColumnsScrollSyncState();\r\n return;\r\n }\r\n if (enabled && !this._fixedColumnsScrollBound) {\r\n this._tableViewport.addEventListener('scroll', this._boundFixedColumnsScroll, { passive: true });\r\n this._fixedColumnsScrollBound = true;\r\n return;\r\n }\r\n if (!enabled && this._fixedColumnsScrollBound) {\r\n this._tableViewport.removeEventListener('scroll', this._boundFixedColumnsScroll);\r\n this._fixedColumnsScrollBound = false;\r\n }\r\n if (!enabled) {\r\n this._resetFixedColumnsScrollSyncState();\r\n }\r\n },\r\n\r\n _resetFixedColumnsScrollSyncState() {\r\n if (this._fixedColumnsSyncFrame && typeof window !== 'undefined' && typeof window.cancelAnimationFrame === 'function') {\r\n window.cancelAnimationFrame(this._fixedColumnsSyncFrame);\r\n }\r\n this._fixedColumnsSyncFrame = 0;\r\n this._fixedColumnsLastScrollLeft = 0;\r\n this._fixedColumnsLastAppliedScrollLeft = Number.NaN;\r\n this._fixedColumnsLastShadowStateKey = '';\r\n this._fixedColumnsCellsCache = [];\r\n this._fixedColumnsShadowTargetsCache = [];\r\n this._fixedColumnsLastStateMap = new Map();\r\n },\r\n\r\n _rebuildFixedColumnsCellsCache() {\r\n const tables = [this._element];\r\n if (this._cloneStickyState && this._cloneStickyState.table) {\r\n tables.push(this._cloneStickyState.table);\r\n }\r\n const normalizedTables = tables.filter(Boolean);\r\n this._fixedColumnsCellsCache = normalizedTables\r\n .map((table) => {\r\n return Array.from(table.querySelectorAll('[data-fixed-side][data-fixed-shift]'))\r\n .map((cell) => {\r\n const baseShift = Number.parseFloat(cell.getAttribute('data-fixed-shift') || '0');\r\n return {\r\n cell,\r\n baseShift: Number.isFinite(baseShift) ? baseShift : 0,\r\n };\r\n });\r\n })\r\n .filter((cells) => cells.length > 0);\r\n this._fixedColumnsShadowTargetsCache = normalizedTables\r\n .map((table) => {\r\n return {\r\n table,\r\n edges: Array.from(table.querySelectorAll('[data-fixed-edge]')),\r\n fixedCells: Array.from(table.querySelectorAll('[data-fixed-side]')),\r\n };\r\n })\r\n .filter((entry) => entry.edges.length > 0 || entry.fixedCells.length > 0);\r\n this._fixedColumnsLastAppliedScrollLeft = Number.NaN;\r\n this._fixedColumnsLastShadowStateKey = '';\r\n },\r\n\r\n _syncFixedColumnsScroll(options = {}) {\r\n if (!this._tableViewport) {\r\n return;\r\n }\r\n\r\n const nextScrollLeft = this._tableViewport.scrollLeft || 0;\r\n this._fixedColumnsLastScrollLeft = nextScrollLeft;\r\n const immediate = Boolean(options && options.immediate);\r\n if (!immediate && this._fixedColumnsLastAppliedScrollLeft === nextScrollLeft) {\r\n return;\r\n }\r\n if (immediate || typeof window === 'undefined' || typeof window.requestAnimationFrame !== 'function') {\r\n this._flushFixedColumnsScrollSync(nextScrollLeft);\r\n return;\r\n }\r\n if (this._fixedColumnsSyncFrame) {\r\n return;\r\n }\r\n this._fixedColumnsSyncFrame = window.requestAnimationFrame(() => {\r\n this._fixedColumnsSyncFrame = 0;\r\n this._flushFixedColumnsScrollSync(this._fixedColumnsLastScrollLeft);\r\n });\r\n },\r\n\r\n _flushFixedColumnsScrollSync(scrollLeft) {\r\n if (!this._fixedColumnsCellsCache.length) {\r\n this._rebuildFixedColumnsCellsCache();\r\n }\r\n this._fixedColumnsCellsCache.forEach((cells) => {\r\n cells.forEach(({ cell, baseShift }) => {\r\n if (!cell || !cell.isConnected) {\r\n return;\r\n }\r\n const shift = baseShift + scrollLeft;\r\n cell.style.transform = `translate3d(${shift}px, 0px, 0px)`;\r\n });\r\n });\r\n this._fixedColumnsLastAppliedScrollLeft = scrollLeft;\r\n this._syncFixedColumnsShadows();\r\n },\r\n\r\n _syncFixedColumnsShadows() {\r\n if (!Array.isArray(this._fixedColumnsShadowTargetsCache) || !this._fixedColumnsShadowTargetsCache.length) {\r\n this._rebuildFixedColumnsCellsCache();\r\n }\r\n const targets = Array.isArray(this._fixedColumnsShadowTargetsCache)\r\n ? this._fixedColumnsShadowTargetsCache\r\n : [];\r\n if (!targets.length) {\r\n return;\r\n }\r\n\r\n const viewport = this._tableViewport;\r\n const canScroll = Boolean(viewport && viewport.scrollWidth > viewport.clientWidth + 1);\r\n const scrollLeft = viewport ? (viewport.scrollLeft || 0) : 0;\r\n const maxScrollLeft = viewport ? Math.max(0, viewport.scrollWidth - viewport.clientWidth) : 0;\r\n const showLeftFixedShadow = canScroll && scrollLeft > 0;\r\n const showRightFixedShadow = canScroll && scrollLeft < maxScrollLeft - 1;\r\n const nextStateKey = `${showLeftFixedShadow ? 1 : 0}:${showRightFixedShadow ? 1 : 0}`;\r\n if (this._fixedColumnsLastShadowStateKey === nextStateKey) {\r\n return;\r\n }\r\n this._fixedColumnsLastShadowStateKey = nextStateKey;\r\n\r\n targets.forEach(({ edges, fixedCells }) => {\r\n edges.forEach((cell) => {\r\n const edge = String(cell.getAttribute('data-fixed-edge') || '').toLowerCase().trim();\r\n const shouldShow = (edge === 'right' && showLeftFixedShadow) || (edge === 'left' && showRightFixedShadow);\r\n if (shouldShow) {\r\n cell.setAttribute('data-fixed-shadow', '1');\r\n } else {\r\n cell.removeAttribute('data-fixed-shadow');\r\n }\r\n });\r\n\r\n fixedCells.forEach((cell) => {\r\n const side = String(cell.getAttribute('data-fixed-side') || '').toLowerCase().trim();\r\n const hasOverlap = (side === 'left' && showLeftFixedShadow) || (side === 'right' && showRightFixedShadow);\r\n if (hasOverlap) {\r\n cell.setAttribute('data-fixed-overlap', '1');\r\n } else {\r\n cell.removeAttribute('data-fixed-overlap');\r\n }\r\n });\r\n });\r\n },\r\n};\r\n\r\nexport default fixedColumnsMethods;\r\n\r\n","const MAIN_SELECTOR_CLASS = 'vg-dynamic-table';\r\n\r\nconst viewportMethods = {\r\n _ensureTableViewport(previousParent = null) {\r\n if (!this._parent || !this._element) {\r\n return;\r\n }\r\n\r\n let viewport = this._element.parentElement && this._element.parentElement.classList.contains('vgdt-table-viewport')\r\n ? this._element.parentElement\r\n : null;\r\n\r\n if (!viewport) {\r\n viewport = Array.from(this._parent.children || []).find((node) => {\r\n return node && node.classList && node.classList.contains('vgdt-table-viewport');\r\n }) || null;\r\n }\r\n\r\n if (!viewport) {\r\n viewport = document.createElement('div');\r\n viewport.className = 'vgdt-table-viewport';\r\n if (previousParent === this._parent) {\r\n this._parent.insertBefore(viewport, this._element);\r\n } else {\r\n this._parent.appendChild(viewport);\r\n }\r\n }\r\n\r\n if (this._element.parentElement !== viewport) {\r\n viewport.appendChild(this._element);\r\n }\r\n\r\n this._tableViewport = viewport;\r\n },\r\n\r\n _bindViewportPan() {\r\n const viewport = this._tableViewport;\r\n if (!viewport) {\r\n return;\r\n }\r\n\r\n if (this._panState && this._panState.viewport === viewport) {\r\n return;\r\n }\r\n\r\n if (this._panState && this._panState.viewport) {\r\n const prev = this._panState.viewport;\r\n prev.removeEventListener('pointerdown', this._panState.onPointerDown);\r\n prev.removeEventListener('pointermove', this._panState.onPointerMove);\r\n prev.removeEventListener('pointerup', this._panState.onPointerUp);\r\n prev.removeEventListener('pointercancel', this._panState.onPointerCancel);\r\n prev.classList.remove('vgdt-pan-enabled', 'is-panning');\r\n }\r\n\r\n const state = {\r\n viewport,\r\n active: false,\r\n moved: false,\r\n pointerId: null,\r\n startX: 0,\r\n startY: 0,\r\n startScrollLeft: 0,\r\n startScrollTop: 0,\r\n onPointerDown: null,\r\n onPointerMove: null,\r\n onPointerUp: null,\r\n onPointerCancel: null,\r\n };\r\n\r\n const resetPan = () => {\r\n state.active = false;\r\n state.moved = false;\r\n state.pointerId = null;\r\n viewport.classList.remove('is-panning');\r\n };\r\n\r\n state.onPointerDown = (event) => {\r\n if (!event || !event.isPrimary) {\r\n return;\r\n }\r\n if (event.pointerType === 'mouse' && event.button !== 0) {\r\n return;\r\n }\r\n if (!event.shiftKey) {\r\n return;\r\n }\r\n\r\n const target = event.target;\r\n if (target && target.closest('button, a, input, select, textarea, [role=\"button\"], [data-sort-arrow]')) {\r\n return;\r\n }\r\n\r\n state.active = true;\r\n state.moved = false;\r\n state.pointerId = event.pointerId;\r\n state.startX = event.clientX;\r\n state.startY = event.clientY;\r\n state.startScrollLeft = viewport.scrollLeft;\r\n state.startScrollTop = viewport.scrollTop;\r\n viewport.classList.add('is-panning');\r\n if (typeof viewport.setPointerCapture === 'function') {\r\n viewport.setPointerCapture(event.pointerId);\r\n }\r\n };\r\n\r\n state.onPointerMove = (event) => {\r\n if (!state.active || event.pointerId !== state.pointerId) {\r\n return;\r\n }\r\n\r\n const deltaX = event.clientX - state.startX;\r\n const deltaY = event.clientY - state.startY;\r\n if (!state.moved && (Math.abs(deltaX) > 4 || Math.abs(deltaY) > 4)) {\r\n state.moved = true;\r\n }\r\n\r\n viewport.scrollLeft = state.startScrollLeft - deltaX;\r\n viewport.scrollTop = state.startScrollTop - deltaY;\r\n\r\n if (state.moved && event.cancelable) {\r\n event.preventDefault();\r\n }\r\n };\r\n\r\n state.onPointerUp = (event) => {\r\n if (event.pointerId !== state.pointerId) {\r\n return;\r\n }\r\n if (typeof viewport.releasePointerCapture === 'function') {\r\n try {\r\n viewport.releasePointerCapture(event.pointerId);\r\n } catch (error) {\r\n // Ignore capture release errors.\r\n }\r\n }\r\n resetPan();\r\n };\r\n\r\n state.onPointerCancel = (event) => {\r\n if (event.pointerId !== state.pointerId) {\r\n return;\r\n }\r\n resetPan();\r\n };\r\n\r\n viewport.classList.add('vgdt-pan-enabled');\r\n viewport.addEventListener('pointerdown', state.onPointerDown);\r\n viewport.addEventListener('pointermove', state.onPointerMove);\r\n viewport.addEventListener('pointerup', state.onPointerUp);\r\n viewport.addEventListener('pointercancel', state.onPointerCancel);\r\n this._panState = state;\r\n if (typeof window !== 'undefined') {\r\n window.removeEventListener('resize', this._boundPanHintResize);\r\n window.addEventListener('resize', this._boundPanHintResize);\r\n }\r\n this._updatePanHintVisibility();\r\n },\r\n\r\n _ensurePanHintNode() {\r\n if (this._panHintNode || !this._parent) {\r\n return;\r\n }\r\n const node = document.createElement('div');\r\n node.className = 'vgdt-pan-hint';\r\n const text = this._getTableMessage('shiftDragHint', 'Hold Shift and drag to scroll the table.');\r\n const closeLabel = this._getTableMessage('shiftDragHintClose', 'Close hint');\r\n node.innerHTML = `<span class=\"vgdt-pan-hint__text\">${this._escapeHtml(text)}</span><button type=\"button\" class=\"vgdt-pan-hint__close\" data-pan-hint-dismiss aria-label=\"${this._escapeHtml(closeLabel)}\">×</button>`;\r\n node.hidden = true;\r\n node.addEventListener('click', this._boundPanHintDismiss);\r\n const anchor = this._tableViewport && this._tableViewport.parentElement === this._parent\r\n ? this._tableViewport\r\n : this._element;\r\n this._parent.insertBefore(node, anchor);\r\n this._panHintNode = node;\r\n },\r\n\r\n _handlePanHintDismiss(event) {\r\n const targetNode = event ? event.target : null;\r\n const targetElement = targetNode instanceof Element\r\n ? targetNode\r\n : (targetNode && targetNode.parentElement ? targetNode.parentElement : null);\r\n const dismissButton = targetElement ? targetElement.closest('[data-pan-hint-dismiss]') : null;\r\n if (!dismissButton) {\r\n return;\r\n }\r\n if (event && typeof event.preventDefault === 'function') {\r\n event.preventDefault();\r\n }\r\n this._storePanHintDismissedAt(Date.now());\r\n if (this._panHintNode) {\r\n this._panHintNode.hidden = true;\r\n }\r\n },\r\n\r\n _updatePanHintVisibility() {\r\n if (!this._panHintNode || !this._tableViewport) {\r\n return;\r\n }\r\n const scrollWidth = this._tableViewport.scrollWidth || 0;\r\n const clientWidth = this._tableViewport.clientWidth || 0;\r\n const overflowX = Math.max(0, scrollWidth - clientWidth);\r\n const hasHorizontalOverflow = overflowX > 1;\r\n if (!hasHorizontalOverflow) {\r\n this._panHintNode.hidden = true;\r\n return;\r\n }\r\n const shouldShowPanHint = !this._isTouchDevice() && !this._isPanHintDismissed();\r\n this._panHintNode.hidden = !shouldShowPanHint;\r\n },\r\n\r\n _getPanHintDismissDays() {\r\n const options = this._params && this._params.panHint && typeof this._params.panHint === 'object'\r\n ? this._params.panHint\r\n : {};\r\n const attrValue = this._element\r\n ? this._element.getAttribute('data-pan-hint-dismiss-days')\r\n : null;\r\n const raw = attrValue !== null ? attrValue : options.dismissDays;\r\n const parsed = Number.parseInt(raw, 10);\r\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 60;\r\n },\r\n\r\n _getPanHintDismissStorageKey() {\r\n if (typeof this._getPerPageStorageKey === 'function') {\r\n return `${this._getPerPageStorageKey()}:panHintDismissedAt`;\r\n }\r\n const tableId = this._element && this._element.id ? String(this._element.id).trim() : '';\r\n if (tableId) {\r\n return `vgdt:panHint:${tableId}`;\r\n }\r\n return `vgdt:panHint:${window.location.pathname}`;\r\n },\r\n\r\n _readPanHintDismissedAt() {\r\n if (typeof window === 'undefined' || !window.localStorage) {\r\n return 0;\r\n }\r\n try {\r\n const value = Number.parseInt(window.localStorage.getItem(this._getPanHintDismissStorageKey()), 10);\r\n return Number.isFinite(value) && value > 0 ? value : 0;\r\n } catch (error) {\r\n return 0;\r\n }\r\n },\r\n\r\n _storePanHintDismissedAt(timestamp) {\r\n if (typeof window === 'undefined' || !window.localStorage) {\r\n return;\r\n }\r\n const value = Number.isFinite(timestamp) && timestamp > 0 ? Math.floor(timestamp) : Date.now();\r\n try {\r\n window.localStorage.setItem(this._getPanHintDismissStorageKey(), String(value));\r\n } catch (error) {\r\n // Ignore storage errors.\r\n }\r\n },\r\n\r\n _clearPanHintDismissedAt() {\r\n if (typeof window === 'undefined' || !window.localStorage) {\r\n return;\r\n }\r\n try {\r\n window.localStorage.removeItem(this._getPanHintDismissStorageKey());\r\n } catch (error) {\r\n // Ignore storage errors.\r\n }\r\n },\r\n\r\n _isPanHintDismissed() {\r\n const dismissedAt = this._readPanHintDismissedAt();\r\n if (!dismissedAt) {\r\n return false;\r\n }\r\n const days = this._getPanHintDismissDays();\r\n const ttlMs = days * 24 * 60 * 60 * 1000;\r\n if (!Number.isFinite(ttlMs) || ttlMs <= 0) {\r\n return false;\r\n }\r\n const expiresAt = dismissedAt + ttlMs;\r\n if (Date.now() <= expiresAt) {\r\n return true;\r\n }\r\n this._clearPanHintDismissedAt();\r\n return false;\r\n },\r\n\r\n _isTouchDevice() {\r\n if (typeof window === 'undefined' || typeof navigator === 'undefined') {\r\n return false;\r\n }\r\n\r\n const hasTouchPoints = Number.isFinite(navigator.maxTouchPoints) && navigator.maxTouchPoints > 0;\r\n const hasCoarsePointer = typeof window.matchMedia === 'function'\r\n ? window.matchMedia('(pointer: coarse)').matches || window.matchMedia('(any-pointer: coarse)').matches\r\n : false;\r\n const hasNoHover = typeof window.matchMedia === 'function'\r\n ? window.matchMedia('(hover: none)').matches || window.matchMedia('(any-hover: none)').matches\r\n : false;\r\n const hasTouchEvents = 'ontouchstart' in window;\r\n\r\n return hasTouchPoints || hasCoarsePointer || hasNoHover || hasTouchEvents;\r\n },\r\n\r\n _moveTableClassesToWrapper(wrapper) {\r\n if (!wrapper || !this._element) {\r\n return;\r\n }\r\n const tableClasses = Array.from(this._element.classList || []);\r\n if (!tableClasses.length) {\r\n return;\r\n }\r\n tableClasses.forEach((className) => {\r\n if (className !== MAIN_SELECTOR_CLASS) {\r\n wrapper.classList.add(className);\r\n }\r\n this._element.classList.remove(className);\r\n });\r\n },\r\n};\r\n\r\nexport default viewportMethods;\r\n\r\n","export function normalizeNonNegativeInt(value, fallback = 0) {\r\n const parsed = Number.parseInt(value, 10);\r\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : fallback;\r\n}\r\n\r\nexport function normalizeBooleanOption(value, fallback = false) {\r\n if (value === undefined || value === null) {\r\n return fallback;\r\n }\r\n const normalized = String(value).toLowerCase().trim();\r\n if (normalized === 'true' || normalized === '1') {\r\n return true;\r\n }\r\n if (normalized === 'false' || normalized === '0') {\r\n return false;\r\n }\r\n return Boolean(value);\r\n}\r\n\r\nexport function normalizeEnabledFlag(value, fallback = true) {\r\n if (value === undefined || value === null) {\r\n return fallback;\r\n }\r\n const normalized = String(value).toLowerCase().trim();\r\n return normalized !== 'false' && normalized !== '0';\r\n}\r\n\r\nexport function safeQuerySelector(selector, root = document) {\r\n const normalized = String(selector || '').trim();\r\n if (!normalized || !root || typeof root.querySelector !== 'function') {\r\n return null;\r\n }\r\n try {\r\n return root.querySelector(normalized);\r\n } catch (error) {\r\n return null;\r\n }\r\n}\r\n\r\nexport function toQueryParamValue(value) {\r\n if (!Array.isArray(value)) {\r\n return value;\r\n }\r\n return value\r\n .map((item) => String(item || '').trim())\r\n .filter((item) => item !== '')\r\n .join(',');\r\n}\r\n","import {normalizeBooleanOption, normalizeEnabledFlag, safeQuerySelector} from \"./utils/common\";\r\n\r\nconst summaryFooterMethods = {\r\n _renderSummary(meta = {}) {\r\n if (!this._isSummaryEnabled() || !this._summaryNode || !this._isRemote) {\r\n return;\r\n }\r\n\r\n const totalRaw = Number.parseInt(meta.total, 10);\r\n const total = Number.isFinite(totalRaw) && totalRaw >= 0 ? totalRaw : 0;\r\n const summaryI18n = this._getI18nSection('summary');\r\n const foundLabel = (summaryI18n.foundLabel && String(summaryI18n.foundLabel).trim()) || 'Found';\r\n const totalLabel = `${foundLabel}: ${total}`;\r\n const active = this._getActiveCriteria();\r\n\r\n const chips = active.map((item) => {\r\n const label = this._escapeHtml(item.label);\r\n const value = this._escapeHtml(item.value);\r\n return `<span class=\"vgdt-summary__chip\"><b>${label}:</b> ${value}</span>`;\r\n }).join('');\r\n\r\n this._summaryNode.innerHTML = `\r\n <div class=\"vgdt-summary__row\">\r\n <span class=\"vgdt-summary__count\">${this._escapeHtml(totalLabel)}</span>\r\n ${chips ? `<div class=\"vgdt-summary__chips\">${chips}</div>` : ''}\r\n </div>\r\n `;\r\n this._summaryNode.hidden = false;\r\n },\r\n\r\n _isSummaryEnabled() {\r\n const options = this._params.summary || {};\r\n if (options.enable !== undefined && options.enable !== null) {\r\n return normalizeBooleanOption(options.enable, false);\r\n }\r\n\r\n const attr = this._element.getAttribute('data-summary-enable');\r\n return normalizeEnabledFlag(attr, false);\r\n },\r\n\r\n _getActiveCriteria() {\r\n const list = [];\r\n const searchParam = this._getSearchParamName();\r\n const searchValue = String(this._remoteParams[searchParam] || '').trim();\r\n if (searchValue !== '') {\r\n const summaryI18n = this._getI18nSection('summary');\r\n const searchLabel = (summaryI18n.searchLabel && String(summaryI18n.searchLabel).trim()) || 'Search';\r\n list.push({ label: searchLabel, value: searchValue });\r\n }\r\n\r\n Object.keys(this._remoteParams || {}).forEach((key) => {\r\n if (key === searchParam) {\r\n return;\r\n }\r\n const value = String(this._remoteParams[key] || '').trim();\r\n if (value === '') {\r\n return;\r\n }\r\n const label = this._getFilterLabelByParam(key) || key;\r\n list.push({ label, value });\r\n });\r\n\r\n return list;\r\n },\r\n\r\n _getFilterLabelByParam(param) {\r\n const selector = this._getFiltersFormSelector();\r\n if (!selector) {\r\n return '';\r\n }\r\n\r\n const shouldRefreshFormCache = this._filtersFormCacheSelector !== selector\r\n || !this._filtersFormCacheNode\r\n || !this._filtersFormCacheNode.isConnected;\r\n if (shouldRefreshFormCache) {\r\n this._filtersFormCacheSelector = selector;\r\n this._filtersFormCacheNode = safeQuerySelector(selector);\r\n this._filtersLabelCache = {};\r\n }\r\n\r\n const form = this._filtersFormCacheNode;\r\n if (!form) {\r\n return '';\r\n }\r\n\r\n const cache = this._filtersLabelCache && typeof this._filtersLabelCache === 'object'\r\n ? this._filtersLabelCache\r\n : {};\r\n this._filtersLabelCache = cache;\r\n if (Object.prototype.hasOwnProperty.call(cache, param)) {\r\n return cache[param];\r\n }\r\n\r\n const options = this._params.filters || {};\r\n const fieldAttr = String(options.fieldAttr || 'data-filter-field').trim() || 'data-filter-field';\r\n const partAttr = String(options.partAttr || 'data-filter-part').trim() || 'data-filter-part';\r\n const normalizedParam = String(param || '').trim();\r\n const isOperator = /_op$/i.test(normalizedParam);\r\n const fieldKey = normalizedParam.replace(/_op$/i, '');\r\n const controlSelector = isOperator\r\n ? `[${fieldAttr}=\"${fieldKey}\"][${partAttr}=\"operator\"]`\r\n : `[${fieldAttr}=\"${fieldKey}\"]`;\r\n const control = form.querySelector(controlSelector);\r\n if (!control) {\r\n cache[param] = '';\r\n return '';\r\n }\r\n const field = control.closest('.field');\r\n const labelNode = field ? field.querySelector('.field__label') : null;\r\n if (labelNode) {\r\n const label = String(labelNode.textContent || '').trim();\r\n cache[param] = label;\r\n return label;\r\n }\r\n cache[param] = '';\r\n return '';\r\n },\r\n\r\n _getFooterCell() {\r\n if (!this._isFooterEnabled()) {\r\n return null;\r\n }\r\n const foot = this._element.tFoot || this._element.querySelector('tfoot');\r\n if (!foot || !foot.rows || !foot.rows.length) {\r\n return null;\r\n }\r\n return foot.querySelector('[data-vgdt-footer]') || foot.rows[0].cells[0] || null;\r\n },\r\n\r\n _clearFooter() {\r\n const cell = this._getFooterCell();\r\n if (!cell) {\r\n return;\r\n }\r\n cell.innerHTML = '';\r\n },\r\n\r\n _renderFooterFromCurrentState() {\r\n if (!this._isFooterEnabled()) {\r\n return;\r\n }\r\n if (this._isRemote) {\r\n return;\r\n }\r\n const visibleRows = this._getVisibleRows();\r\n const records = visibleRows.map((row) => this._mapDomRowToRecord(row));\r\n this._renderFooterStats(records, null);\r\n },\r\n\r\n _renderFooterFromRows(rows, meta) {\r\n if (!this._isFooterEnabled()) {\r\n return;\r\n }\r\n if (!this._isRemote) {\r\n return;\r\n }\r\n this._renderFooterStats(Array.isArray(rows) ? rows : [], meta || null);\r\n },\r\n\r\n _getVisibleRows() {\r\n const body = this._getBody();\r\n return Array.from(body.rows || []).filter((row) => !row.hidden);\r\n },\r\n\r\n _mapDomRowToRecord(row) {\r\n const valueByField = {};\r\n this._fields.forEach((field, index) => {\r\n const cell = row && row.cells && row.cells[index] ? row.cells[index] : null;\r\n valueByField[field] = cell ? String(cell.textContent || '').trim() : '';\r\n });\r\n return valueByField;\r\n },\r\n\r\n _renderFooterStats(records, meta) {\r\n if (!this._isFooterEnabled()) {\r\n return;\r\n }\r\n const cell = this._getFooterCell();\r\n if (!cell) {\r\n return;\r\n }\r\n\r\n const rows = Array.isArray(records) ? records : [];\r\n const visibleCount = rows.length;\r\n let sumPrice = 0;\r\n let sumStock = 0;\r\n let ratingSum = 0;\r\n let ratingCount = 0;\r\n\r\n rows.forEach((row) => {\r\n const price = this._extractNumber(row.price);\r\n if (Number.isFinite(price)) {\r\n sumPrice += price;\r\n }\r\n\r\n const stock = this._extractNumber(row.stock);\r\n if (Number.isFinite(stock)) {\r\n sumStock += stock;\r\n }\r\n\r\n const rating = this._extractNumber(row.rating);\r\n if (Number.isFinite(rating)) {\r\n ratingSum += rating;\r\n ratingCount += 1;\r\n }\r\n });\r\n\r\n const avgRating = ratingCount > 0 ? (ratingSum / ratingCount) : 0;\r\n\r\n const summaryI18n = this._getI18nSection('summary');\r\n const visibleRowsLabel = (summaryI18n.visibleRowsLabel && String(summaryI18n.visibleRowsLabel).trim()) || 'Rows on page';\r\n const pagePriceSumLabel = (summaryI18n.pagePriceSumLabel && String(summaryI18n.pagePriceSumLabel).trim()) || 'Price sum';\r\n const pageStockSumLabel = (summaryI18n.pageStockSumLabel && String(summaryI18n.pageStockSumLabel).trim()) || 'Total stock';\r\n const pageAvgRatingLabel = (summaryI18n.pageAvgRatingLabel && String(summaryI18n.pageAvgRatingLabel).trim()) || 'Average rating';\r\n const foundLabel = (summaryI18n.foundLabel && String(summaryI18n.foundLabel).trim()) || 'Found';\r\n\r\n const metaTotalRaw = meta && Object.prototype.hasOwnProperty.call(meta, 'total')\r\n ? Number.parseInt(meta.total, 10)\r\n : NaN;\r\n const hasTotal = Number.isFinite(metaTotalRaw) && metaTotalRaw >= 0;\r\n const totalHtml = hasTotal\r\n ? `<span class=\"vgdt-foot__item\"><b>${this._escapeHtml(foundLabel)}:</b> ${metaTotalRaw}</span>`\r\n : '';\r\n\r\n const finiteSumPrice = Number.isFinite(sumPrice) ? sumPrice : 0;\r\n const finiteSumStock = Number.isFinite(sumStock) ? sumStock : 0;\r\n const finiteAvgRating = Number.isFinite(avgRating) ? avgRating : 0;\r\n\r\n cell.innerHTML = `\r\n <div class=\"vgdt-foot\">\r\n <span class=\"vgdt-foot__item\"><b>${this._escapeHtml(visibleRowsLabel)}:</b> ${visibleCount}</span>\r\n ${totalHtml}\r\n <span class=\"vgdt-foot__item\"><b>${this._escapeHtml(pagePriceSumLabel)}:</b> ${finiteSumPrice.toFixed(2)} RUB</span>\r\n <span class=\"vgdt-foot__item\"><b>${this._escapeHtml(pageStockSumLabel)}:</b> ${Math.round(finiteSumStock)}</span>\r\n <span class=\"vgdt-foot__item\"><b>${this._escapeHtml(pageAvgRatingLabel)}:</b> ${finiteAvgRating.toFixed(2)}</span>\r\n </div>\r\n `;\r\n },\r\n\r\n _isFooterEnabled() {\r\n const options = this._params.footer || {};\r\n if (options.enable !== undefined && options.enable !== null) {\r\n return normalizeBooleanOption(options.enable, false);\r\n }\r\n\r\n const attr = this._element.getAttribute('data-footer-enable');\r\n return normalizeEnabledFlag(attr, false);\r\n },\r\n\r\n _applyFooterVisibility() {\r\n const foot = this._element.tFoot || this._element.querySelector('tfoot');\r\n if (!foot) {\r\n return;\r\n }\r\n foot.hidden = !this._isFooterEnabled();\r\n },\r\n\r\n _formatFieldValue(field, value) {\r\n if (field === 'price') {\r\n const amount = Number.parseFloat(value);\r\n if (Number.isFinite(amount)) {\r\n return `${amount.toFixed(2)} RUB`;\r\n }\r\n return '';\r\n }\r\n\r\n if (field === 'category' && (value === null || value === undefined || value === '')) {\r\n return '-';\r\n }\r\n\r\n return value === null || value === undefined ? '' : String(value);\r\n },\r\n\r\n _escapeHtml(value) {\r\n return String(value)\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\r\n },\r\n};\r\n\r\nexport default summaryFooterMethods;\r\n","const skeletonMethods = {\r\n _renderLoadingSkeleton() {\r\n const body = this._getBody();\r\n const columns = this._getRenderedColumnsCount();\r\n const columnWidths = this._getCurrentColumnWidthsPx();\r\n const rowsCount = this._getSkeletonRowsCount();\r\n const rowHeight = this._getSkeletonRowHeightPx();\r\n const rowHeightStyle = Number.isFinite(rowHeight) && rowHeight > 0\r\n ? `height:${rowHeight}px;--vgdt-skeleton-row-height:${rowHeight}px;`\r\n : '';\r\n\r\n const rowHtml = Array.from({ length: rowsCount }).map((_, rowIndex) => {\r\n const cells = Array.from({ length: columns }).map((_, columnIndex) => {\r\n const width = Number.isFinite(columnWidths[columnIndex]) ? Math.round(columnWidths[columnIndex]) : 0;\r\n const widthStyle = width > 0\r\n ? ` style=\"width:${width}px;min-width:${width}px;max-width:${width}px;\"`\r\n : '';\r\n return `<td${widthStyle}><div class=\"skeleton-cell\"><div class=\"skeleton-line\"></div></div></td>`;\r\n }).join('');\r\n return `<tr class=\"skeleton-row\" style=\"${rowHeightStyle}--skeleton-delay:${(rowIndex * 0.08).toFixed(2)}s\">${cells}</tr>`;\r\n }).join('');\r\n\r\n body.innerHTML = rowHtml;\r\n this._updatePanHintVisibility();\r\n this._refreshStickyAndFixedLayout();\r\n },\r\n\r\n _getRenderedColumnsCount() {\r\n const headerCount = this._getHeaderCells().length;\r\n const fieldsCount = this._fields.length;\r\n const resolved = Math.max(headerCount, fieldsCount);\r\n return resolved > 0 ? resolved : 1;\r\n },\r\n\r\n _getCurrentColumnWidthsPx() {\r\n const headers = this._getHeaderCells();\r\n const headerWidths = headers.map((header) => {\r\n if (!header || typeof header.getBoundingClientRect !== 'function') {\r\n return 0;\r\n }\r\n const rect = header.getBoundingClientRect();\r\n return rect && Number.isFinite(rect.width) && rect.width > 0 ? rect.width : 0;\r\n });\r\n\r\n if (headerWidths.some((width) => width > 0)) {\r\n return headerWidths;\r\n }\r\n\r\n const body = this._getBody();\r\n const firstRow = body && body.rows && body.rows.length ? body.rows[0] : null;\r\n if (!firstRow || !firstRow.cells || !firstRow.cells.length) {\r\n return [];\r\n }\r\n\r\n return Array.from(firstRow.cells).map((cell) => {\r\n if (!cell || typeof cell.getBoundingClientRect !== 'function') {\r\n return 0;\r\n }\r\n const rect = cell.getBoundingClientRect();\r\n return rect && Number.isFinite(rect.width) && rect.width > 0 ? rect.width : 0;\r\n });\r\n },\r\n\r\n _getSkeletonRowsCount() {\r\n const fromPerPageControl = this._getPerPageControlValue();\r\n if (Number.isFinite(fromPerPageControl) && fromPerPageControl > 0) {\r\n return fromPerPageControl;\r\n }\r\n\r\n const loadingOptions = this._params.loading || {};\r\n const explicit = Number.parseInt(loadingOptions.skeleton, 10);\r\n if (Number.isFinite(explicit) && explicit > 0) {\r\n return explicit;\r\n }\r\n\r\n const renderedRows = this._getRenderedDataRows();\r\n if (renderedRows.length > 0) {\r\n return renderedRows.length;\r\n }\r\n\r\n const fromState = Number.parseInt(this._pageState && this._pageState.perPage, 10);\r\n if (Number.isFinite(fromState) && fromState > 0) {\r\n return fromState;\r\n }\r\n\r\n const pagination = this._params.pagination || {};\r\n const fromParams = Number.parseInt(pagination.perPage, 10);\r\n if (Number.isFinite(fromParams) && fromParams > 0) {\r\n return fromParams;\r\n }\r\n\r\n return 10;\r\n },\r\n\r\n _getPerPageControlValue() {\r\n if (!this._parent) {\r\n return NaN;\r\n }\r\n const perPageControl = this._parent.querySelector('[data-per-page]');\r\n if (!perPageControl) {\r\n return NaN;\r\n }\r\n const value = Number.parseInt(perPageControl.value, 10);\r\n return Number.isFinite(value) ? this._clampPerPage(value, 10) : NaN;\r\n },\r\n\r\n _getSkeletonRowHeightPx() {\r\n const renderedRows = this._getRenderedDataRows();\r\n if (!renderedRows.length) {\r\n return null;\r\n }\r\n\r\n const firstRow = renderedRows[0];\r\n const rect = firstRow.getBoundingClientRect();\r\n if (!rect || !Number.isFinite(rect.height) || rect.height <= 0) {\r\n return null;\r\n }\r\n\r\n return Math.round(rect.height);\r\n },\r\n\r\n _getRenderedDataRows() {\r\n const body = this._getBody();\r\n return Array.from(body.rows || []).filter((row) => {\r\n if (!row || row.classList.contains('skeleton-row')) {\r\n return false;\r\n }\r\n if (row.querySelector('[data-table-state]')) {\r\n return false;\r\n }\r\n return true;\r\n });\r\n },\r\n};\r\n\r\nexport default skeletonMethods;\r\n","const tableRemoteMethods = {\n _getRemoteRouteRequestConfig(route = '') {\n const requestOptions = this._params.request || {};\n const attrMethod = this._element.getAttribute('data-request-method');\n const attrCredentials = this._element.getAttribute('data-request-credentials');\n const attrParams = this._element.getAttribute('data-request-params');\n let paramsFromAttr = {};\n\n if (attrParams !== null && String(attrParams).trim() !== '') {\n try {\n const parsed = JSON.parse(attrParams);\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n paramsFromAttr = parsed;\n }\n } catch (error) {\n paramsFromAttr = {};\n }\n }\n\n return {\n route: route || this._getRemoteDataRoute(),\n method: attrMethod !== null ? attrMethod : requestOptions.method,\n credentials: attrCredentials !== null ? attrCredentials : requestOptions.credentials,\n headers: requestOptions.headers && typeof requestOptions.headers === 'object'\n ? Object.assign({}, requestOptions.headers)\n : { 'Accept': 'application/json' },\n baseParams: Object.assign(\n {},\n requestOptions.params && typeof requestOptions.params === 'object' ? requestOptions.params : {},\n paramsFromAttr\n ),\n responseType: 'json',\n };\n },\n\n _isRemoteCacheEnabled() {\n const requestOptions = this._params.request || {};\n const requestCacheOptions = requestOptions.cache && typeof requestOptions.cache === 'object'\n ? requestOptions.cache\n : {};\n const attr = this._element.getAttribute('data-request-cache-enable');\r\n if (attr !== null) {\r\n return this._isTruthy(attr);\r\n }\r\n const fromOptions = requestCacheOptions.enable;\r\n if (fromOptions === undefined || fromOptions === null) {\r\n return true;\r\n }\r\n return Boolean(fromOptions);\r\n },\r\n\r\n _getRemoteCacheTtlMs() {\r\n const requestOptions = this._params.request || {};\r\n const requestCacheOptions = requestOptions.cache && typeof requestOptions.cache === 'object'\r\n ? requestOptions.cache\r\n : {};\r\n const attr = this._element.getAttribute('data-request-cache-ttl');\r\n const raw = attr !== null ? attr : requestCacheOptions.ttl;\r\n const parsed = Number.parseInt(raw, 10);\r\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 30000;\r\n },\r\n\r\n _getRemoteCacheMaxEntries() {\r\n const requestOptions = this._params.request || {};\r\n const requestCacheOptions = requestOptions.cache && typeof requestOptions.cache === 'object'\r\n ? requestOptions.cache\r\n : {};\r\n const attr = this._element.getAttribute('data-request-cache-max');\r\n const raw = attr !== null ? attr : requestCacheOptions.max;\r\n const parsed = Number.parseInt(raw, 10);\r\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 30;\r\n },\r\n\r\n _getRemoteCacheKey(endpoint, params = {}) {\r\n const keys = Object.keys(params || {}).sort();\r\n const query = keys.map((key) => {\r\n const value = params[key];\r\n const normalized = Array.isArray(value)\r\n ? value.join(',')\r\n : String(value === undefined || value === null ? '' : value);\r\n return `${encodeURIComponent(key)}=${encodeURIComponent(normalized)}`;\r\n }).join('&');\r\n return `${String(endpoint || '').trim()}?${query}`;\r\n },\r\n\r\n _readRemoteCache(endpoint, params = {}) {\r\n if (!this._isRemoteCacheEnabled()) {\r\n return null;\r\n }\r\n if (!this._remotePageCache || typeof this._remotePageCache.get !== 'function') {\r\n return null;\r\n }\r\n const key = this._getRemoteCacheKey(endpoint, params);\r\n const entry = this._remotePageCache.get(key);\r\n if (!entry || typeof entry !== 'object') {\r\n return null;\r\n }\r\n const ttlMs = this._getRemoteCacheTtlMs();\r\n const age = Date.now() - Number(entry.ts || 0);\r\n if (!Number.isFinite(age) || age < 0 || age > ttlMs) {\r\n this._remotePageCache.delete(key);\r\n return null;\r\n }\r\n entry.lastUsedAt = Date.now();\r\n return entry.response;\r\n },\r\n\r\n _writeRemoteCache(endpoint, params = {}, response) {\r\n if (!this._isRemoteCacheEnabled()) {\r\n return;\r\n }\r\n if (!this._remotePageCache || typeof this._remotePageCache.set !== 'function') {\r\n return;\r\n }\r\n const key = this._getRemoteCacheKey(endpoint, params);\r\n this._remotePageCache.set(key, {\r\n ts: Date.now(),\r\n lastUsedAt: Date.now(),\r\n response,\r\n });\r\n\r\n const maxEntries = this._getRemoteCacheMaxEntries();\r\n if (this._remotePageCache.size <= maxEntries) {\r\n return;\r\n }\r\n const entries = Array.from(this._remotePageCache.entries());\r\n entries.sort((a, b) => Number((a[1] && a[1].lastUsedAt) || 0) - Number((b[1] && b[1].lastUsedAt) || 0));\r\n while (this._remotePageCache.size > maxEntries && entries.length) {\r\n const next = entries.shift();\r\n if (next) {\r\n this._remotePageCache.delete(next[0]);\r\n }\r\n }\r\n },\r\n\r\n _applyRemoteResponse(response, safePage, safePerPage, userOnChange = null, options = {}) {\r\n const rows = this._extractRemoteRows(response);\r\n const meta = this._extractRemoteMeta(response);\r\n const fromCache = Boolean(options.fromCache);\r\n const requestContext = options.requestContext && typeof options.requestContext === 'object'\r\n ? options.requestContext\r\n : null;\r\n const requestId = String(\r\n (meta && (meta.request_id || meta.requestId))\r\n || (requestContext && requestContext.requestId)\r\n || ''\r\n ).trim();\r\n this._lastRemoteMeta = meta;\r\n this._renderSummary(meta);\r\n\r\n const viewRowsHtml = this._extractRemoteViewRowsHtml(response);\r\n const didRenderView = this._renderRemoteViewIfConfigured(viewRowsHtml, rows);\r\n if (!didRenderView) {\r\n this._renderRemoteRows(rows);\r\n }\r\n this._renderFooterFromRows(rows, meta);\r\n this._updatePanHintVisibility();\r\n this._refreshStickyAndFixedLayout();\r\n\r\n const nextPage = this._normalizePositiveInt(meta.page, safePage);\r\n const nextPerPage = this._clampPerPage(meta.per_page, safePerPage);\r\n const totalPages = this._normalizePositiveInt(meta.pages, 1);\r\n this._pageState = { page: nextPage, perPage: nextPerPage };\r\n this._storePage(nextPage);\r\n this._storePerPage(nextPerPage);\r\n\r\n const nextSort = typeof meta.sort === 'string' ? meta.sort.trim() : this._sortState.field;\r\n const nextDir = meta && typeof meta.dir === 'string' ? meta.dir : this._sortState.dir;\r\n if (nextSort) {\r\n const metaSorts = this._parseSortsFromStrings(nextSort, nextDir);\r\n this._sortState = Object.assign({}, this._sortState, {\r\n field: metaSorts[0] ? metaSorts[0].field : nextSort,\r\n dir: metaSorts[0] ? metaSorts[0].dir : this._normalizeSortDir(nextDir),\r\n sorts: metaSorts,\r\n });\r\n if (this._sortable) {\r\n this._sortable.setState({\r\n sorts: this._sortState.sorts,\r\n });\r\n }\r\n }\r\n\r\n if (this._pagination) {\r\n this._pagination.setMeta({\r\n page: nextPage,\r\n perPage: nextPerPage,\r\n totalPages,\r\n });\r\n }\r\n\r\n if (typeof userOnChange === 'function') {\r\n userOnChange({\r\n page: nextPage,\r\n perPage: nextPerPage,\r\n totalPages,\r\n });\r\n }\r\n this._syncUrlState();\r\n const received = {\r\n rows: Array.isArray(rows) ? rows.slice() : [],\r\n total: this._normalizePositiveInt(meta && meta.total, Array.isArray(rows) ? rows.length : 0),\r\n serverMeta: Object.assign({}, meta || {}),\r\n raw: response,\r\n };\r\n const sent = requestContext && requestContext.sent\r\n ? Object.assign({}, requestContext.sent)\r\n : {};\r\n const requestTrigger = requestContext && typeof requestContext.trigger === 'string'\r\n ? String(requestContext.trigger).toLowerCase().trim()\r\n : '';\r\n const requestFiltersState = requestContext && requestContext.filtersState && typeof requestContext.filtersState === 'object'\r\n ? this._normalizeFiltersEventState(requestContext.filtersState)\r\n : null;\r\n if (requestTrigger === 'filterschange' && this._isFiltersEmitFullContextEnabled()) {\r\n const fallbackState = this._normalizeFiltersEventState({\r\n filters: sent.filters || {},\r\n params: sent.params || {},\r\n });\r\n const eventState = requestFiltersState || fallbackState;\r\n const isSearched = this._isSearchActiveFromParams(sent.params || {});\r\n this._emitAction('filterschange', {\r\n filters: Object.assign({}, eventState.filters || {}),\r\n params: Object.assign({}, eventState.params || {}),\r\n fields: Array.isArray(eventState.fields) ? eventState.fields.slice() : [],\r\n meta: Object.assign({}, eventState.meta || {}),\r\n phase: 'response',\r\n isFiltered: this._isFilteredState(eventState) || isSearched,\r\n isSearched,\r\n requestId,\r\n fromCache,\r\n sent,\r\n received,\r\n response,\r\n serverMeta: Object.assign({}, received.serverMeta || {}),\r\n });\r\n }\r\n this._emitAction('requestsuccess', {\r\n requestId,\r\n mode: 'remote',\r\n responsemode: this._getRemoteResponseMode(),\r\n sent,\r\n received,\r\n fromCache,\r\n });\r\n this._emitAction('dataloaded', {\r\n requestId,\r\n page: nextPage,\r\n perPage: nextPerPage,\r\n totalPages,\r\n rows,\r\n view: viewRowsHtml,\r\n meta,\r\n fromCache,\r\n sent,\r\n received,\r\n });\r\n this._emitAction('afterrender', {\r\n requestId,\r\n renderedCount: Array.isArray(rows) ? rows.length : 0,\r\n total: received.total,\r\n sent,\r\n received,\r\n });\r\n this._emitAction('statesync', {\r\n requestId,\r\n state: {\r\n page: nextPage,\r\n perPage: nextPerPage,\r\n sorts: this._getNormalizedSorts(this._sortState.sorts),\r\n filters: Object.assign({}, this._activeFilters || {}),\r\n params: Object.assign({}, this._remoteParams || {}),\r\n },\r\n sent,\r\n received,\r\n });\r\n if (!Array.isArray(rows) || rows.length === 0) {\r\n this._emitAction('emptyresult', {\r\n requestId,\r\n reason: 'no_matches',\r\n sent,\r\n received,\r\n });\r\n }\r\n },\r\n\r\n _buildRemoteRequestParams(page, perPage) {\r\n const sortOptions = this._params.sortable || {};\r\n const requestParams = {\r\n page,\r\n per_page: perPage,\r\n };\r\n Object.assign(requestParams, this._remoteParams);\r\n\r\n const responseMode = this._getRemoteResponseMode();\r\n if (responseMode !== 'data') {\r\n const viewParam = this._getRemoteViewParamName();\r\n const viewValue = this._getRemoteViewParamValue();\r\n if (viewParam && viewValue && !Object.prototype.hasOwnProperty.call(requestParams, viewParam)) {\r\n requestParams[viewParam] = viewValue;\r\n }\r\n\r\n const fieldsParam = this._getRemoteFieldsParamName();\r\n if (fieldsParam && this._fields.length && !Object.prototype.hasOwnProperty.call(requestParams, fieldsParam)) {\r\n requestParams[fieldsParam] = this._fields.join(',');\r\n }\r\n }\r\n\r\n if (sortOptions.enable && this._sortState.field) {\r\n const remoteFieldParam = 'sort';\r\n const remoteDirParam = 'dir';\r\n const sorts = this._getNormalizedSorts(this._sortState.sorts);\r\n if (sorts.length > 0) {\r\n requestParams[remoteFieldParam] = sorts.map((item) => item.field).join(',');\r\n requestParams[remoteDirParam] = sorts.map((item) => item.dir).join(',');\r\n } else {\r\n requestParams[remoteFieldParam] = this._sortState.field;\r\n requestParams[remoteDirParam] = this._sortState.dir;\r\n }\r\n }\r\n\r\n return requestParams;\r\n },\r\n\r\n exportRemote(format = 'csv', options = {}) {\n if (!this._isRemote) {\n return '';\n }\n const requestOptions = this._params.request || {};\n\r\n const normalizedFormat = String(format || 'csv').toLowerCase().trim() === 'xlsx'\r\n ? 'xlsx'\r\n : 'csv';\r\n const safePage = this._normalizePositiveInt(\r\n options.page !== undefined ? options.page : this._pageState.page,\r\n 1\r\n );\r\n const safePerPage = this._clampPerPage(\r\n options.perPage !== undefined ? options.perPage : this._pageState.perPage,\r\n this._getInitialPerPage()\r\n );\r\n\r\n const requestParams = this._buildRemoteRequestParams(safePage, safePerPage);\r\n requestParams.format = normalizedFormat;\r\n const mappedRequestParams = this._mapRemoteRequestParams(requestParams);\r\n const endpoint = String(\r\n options.endpoint\r\n || (requestOptions.export && requestOptions.export.route)\r\n || this._element.getAttribute('data-request-export-route')\r\n || this._getRemoteDataRoute()\n ).trim();\n const exportEndpoint = endpoint || this._getRemoteDataRoute();\n const exportUrl = this._buildRouteUrl(\n mappedRequestParams,\n exportEndpoint,\n this._getRemoteRouteRequestConfig(exportEndpoint)\n ).toString();\n if (options.open !== false && typeof window !== 'undefined' && typeof window.open === 'function') {\n window.open(exportUrl, '_blank', 'noopener');\n }\n\r\n this._emitAction('export', {\r\n format: normalizedFormat,\r\n page: safePage,\r\n perPage: safePerPage,\r\n endpoint: exportEndpoint,\r\n url: exportUrl,\r\n });\r\n return exportUrl;\r\n },\n\n async _loadRemotePage(page, perPage, userOnChange = null, requestMeta = null) {\n if (!this._isRemote) {\n return;\n }\n\n const safePage = this._normalizePositiveInt(page, 1);\r\n const safePerPage = this._clampPerPage(perPage, this._getInitialPerPage());\r\n const requestToken = ++this._requestToken;\r\n const requestId = `req-${Date.now()}-${requestToken}`;\r\n const requestParams = this._buildRemoteRequestParams(safePage, safePerPage);\r\n const mappedRequestParams = this._mapRemoteRequestParams(requestParams);\r\n const endpoint = this._getRemoteDataRoute();\r\n const filtersOptions = this._params.filters || {};\r\n const transport = filtersOptions.transport && typeof filtersOptions.transport === 'object'\r\n ? filtersOptions.transport\r\n : {};\r\n if (transport.includeMeta !== false) {\r\n mappedRequestParams.request_id = requestId;\r\n mappedRequestParams.responsemode = this._getRemoteResponseMode();\r\n }\r\n const sent = {\r\n filters: Object.assign({}, this._activeFilters || {}),\r\n sort: this._getNormalizedSorts(this._sortState.sorts || []),\r\n page: safePage,\r\n perPage: safePerPage,\r\n params: Object.assign({}, this._remoteParams || {}),\r\n urlState: this._collectUrlState(),\r\n requestPayload: Object.assign({}, mappedRequestParams),\r\n endpoint,\r\n };\r\n const trigger = requestMeta && typeof requestMeta.trigger === 'string'\r\n ? String(requestMeta.trigger).toLowerCase().trim()\r\n : '';\r\n const filtersState = requestMeta && requestMeta.filtersState && typeof requestMeta.filtersState === 'object'\r\n ? this._normalizeFiltersEventState(requestMeta.filtersState)\r\n : null;\r\n const requestContext = {\r\n requestId,\r\n sent,\r\n trigger,\r\n filtersState,\r\n };\r\n this._activeRemoteRequestId = requestId;\r\n const cachedResponse = this._readRemoteCache(endpoint, mappedRequestParams);\r\n if (trigger === 'filterschange' && this._isFiltersEmitFullContextEnabled()) {\r\n const eventState = filtersState || this._normalizeFiltersEventState({\r\n filters: sent.filters || {},\r\n params: sent.params || {},\r\n });\r\n const isSearched = this._isSearchActiveFromParams(sent.params || {});\r\n this._emitAction('filterschange', {\r\n filters: Object.assign({}, eventState.filters || {}),\r\n params: Object.assign({}, eventState.params || {}),\r\n fields: Array.isArray(eventState.fields) ? eventState.fields.slice() : [],\r\n meta: Object.assign({}, eventState.meta || {}),\r\n phase: 'request',\r\n isFiltered: this._isFilteredState(eventState) || isSearched,\r\n isSearched,\r\n requestId,\r\n fromCache: Boolean(cachedResponse),\r\n sent,\r\n table: null,\r\n });\r\n }\r\n if (this._requestAbortController && typeof this._requestAbortController.abort === 'function') {\r\n this._requestAbortController.abort();\r\n }\r\n const requestAbortController = cachedResponse ? null : (typeof AbortController === 'function'\r\n ? new AbortController()\r\n : null);\r\n this._requestAbortController = requestAbortController;\r\n const requestStartedAt = Date.now();\r\n this._emitAction('beforeload', {\r\n requestId,\r\n page: safePage,\r\n perPage: safePerPage,\r\n params: Object.assign({}, this._remoteParams),\r\n sent,\r\n });\r\n if (!cachedResponse) {\r\n this._renderLoadingSkeleton();\r\n }\r\n\n try {\n const response = cachedResponse || await this._route(Object.assign(\n {},\n this._getRemoteRouteRequestConfig(endpoint),\n {\n route: endpoint,\n method: 'GET',\n params: mappedRequestParams,\n signal: requestAbortController ? requestAbortController.signal : undefined,\n responseType: 'json',\n }\n ));\n if (!cachedResponse) {\n await this._waitMinLoadingDelay(requestStartedAt);\n }\n\r\n if (requestToken !== this._requestToken) {\r\n this._emitAction('staleresponse', {\r\n requestId,\r\n activeRequestId: String(this._activeRemoteRequestId || ''),\r\n sent,\r\n });\r\n return;\r\n }\r\n\r\n if (!cachedResponse) {\r\n this._writeRemoteCache(endpoint, mappedRequestParams, response);\r\n }\r\n this._applyRemoteResponse(response, safePage, safePerPage, userOnChange, {\r\n fromCache: Boolean(cachedResponse),\r\n requestContext,\r\n });\r\n } catch (error) {\r\n if (error && error.name === 'AbortError') {\r\n return;\r\n }\r\n await this._waitMinLoadingDelay(requestStartedAt);\r\n if (requestToken !== this._requestToken) {\r\n this._emitAction('staleresponse', {\r\n requestId,\r\n activeRequestId: String(this._activeRemoteRequestId || ''),\r\n sent,\r\n });\r\n return;\r\n }\r\n this._renderSummary({ total: 0 });\r\n this._clearFooter();\r\n const errorMessage = this._getTableMessage('stateError', 'Failed to load data.');\r\n if (typeof console !== 'undefined' && typeof console.error === 'function') {\r\n console.error('VGDynamicTable: remote data load failed', error);\r\n }\r\n this._renderStateRow(errorMessage, 'error');\r\n this._refreshStickyAndFixedLayout();\r\n this._emitAction('error', {\r\n requestId,\r\n page: safePage,\r\n perPage: safePerPage,\r\n error,\r\n message: errorMessage,\r\n sent,\r\n });\r\n this._emitAction('requesterror', {\r\n requestId,\r\n mode: 'remote',\r\n responsemode: this._getRemoteResponseMode(),\r\n sent,\r\n error: {\r\n message: String((error && error.message) || errorMessage),\r\n code: String((error && error.code) || 'REQUEST_FAILED'),\r\n status: error && error.status ? error.status : 0,\r\n details: error && Array.isArray(error.details) ? error.details.slice() : [],\r\n },\r\n });\r\n if (requestContext && String(requestContext.trigger || '').toLowerCase().trim() === 'filterschange' && this._isFiltersEmitFullContextEnabled()) {\r\n const eventState = requestContext.filtersState && typeof requestContext.filtersState === 'object'\r\n ? this._normalizeFiltersEventState(requestContext.filtersState)\r\n : this._normalizeFiltersEventState({\r\n filters: sent.filters || {},\r\n params: sent.params || {},\r\n });\r\n const isSearched = this._isSearchActiveFromParams(sent.params || {});\r\n this._emitAction('filterschange', {\r\n filters: Object.assign({}, eventState.filters || {}),\r\n params: Object.assign({}, eventState.params || {}),\r\n fields: Array.isArray(eventState.fields) ? eventState.fields.slice() : [],\r\n meta: Object.assign({}, eventState.meta || {}),\r\n phase: 'error',\r\n isFiltered: this._isFilteredState(eventState) || isSearched,\r\n isSearched,\r\n requestId,\r\n sent,\r\n error: {\r\n message: String((error && error.message) || errorMessage),\r\n code: String((error && error.code) || 'REQUEST_FAILED'),\r\n status: error && error.status ? error.status : 0,\r\n details: error && Array.isArray(error.details) ? error.details.slice() : [],\r\n },\r\n });\r\n }\r\n } finally {\r\n if (this._requestAbortController === requestAbortController) {\r\n this._requestAbortController = null;\r\n }\r\n }\r\n },\r\n\r\n _getRemoteResponseMode() {\r\n const requestOptions = this._params.request || {};\r\n const attrResponseMode = this._element.getAttribute('data-request-responsemode');\r\n const raw = attrResponseMode !== null ? attrResponseMode : requestOptions.responsemode;\r\n const normalized = String(raw || 'data').toLowerCase().trim();\r\n if (normalized === 'view' || normalized === 'auto') {\r\n return normalized;\r\n }\r\n return 'data';\r\n },\r\n\r\n _getRemoteViewParamName() {\r\n const requestOptions = this._params.request || {};\r\n const attr = this._element.getAttribute('data-request-viewparam');\r\n const raw = attr !== null ? attr : requestOptions.viewparam;\r\n const normalized = String(raw || '').trim();\r\n return normalized || '';\r\n },\r\n\r\n _getRemoteViewParamValue() {\r\n const requestOptions = this._params.request || {};\r\n const attr = this._element.getAttribute('data-request-viewvalue');\r\n const raw = attr !== null ? attr : requestOptions.viewvalue;\r\n const normalized = String(raw || '').trim();\r\n return normalized || '';\r\n },\r\n\r\n _getRemoteFieldsParamName() {\r\n const requestOptions = this._params.request || {};\r\n const attr = this._element.getAttribute('data-request-fieldsparam');\r\n const raw = attr !== null ? attr : requestOptions.fieldsparam;\r\n const normalized = String(raw || '').trim();\r\n return normalized || '';\r\n },\r\n\r\n _getRemoteDataRoute() {\r\n const filtersRoute = this._getFiltersRoute();\r\n if (filtersRoute) {\r\n return filtersRoute;\r\n }\r\n return this._getRoute();\r\n },\r\n\r\n _getRequestParamMap() {\r\n const requestOptions = this._params.request || {};\r\n const fromOptions = requestOptions.parammap;\r\n if (fromOptions && typeof fromOptions === 'object' && !Array.isArray(fromOptions)) {\r\n return fromOptions;\r\n }\r\n\r\n const attr = this._element.getAttribute('data-request-parammap') || '';\r\n if (!attr) {\r\n return {};\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(attr);\r\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\r\n return parsed;\r\n }\r\n } catch (error) {\r\n return {};\r\n }\r\n\r\n return {};\r\n },\r\n\r\n _mapRemoteRequestParams(params = {}) {\r\n const map = Object.assign(\r\n {},\r\n this._getAutoFilterRequestParamMap(params),\r\n this._getRequestParamMap()\r\n );\r\n const result = {};\r\n Object.keys(params || {}).forEach((key) => {\r\n const target = Object.prototype.hasOwnProperty.call(map, key)\r\n ? String(map[key] || '').trim()\r\n : key;\r\n const nextKey = target || key;\r\n result[nextKey] = params[key];\r\n });\r\n return result;\r\n },\r\n\r\n _getAutoFilterRequestParamMap(params = {}) {\r\n const source = params && typeof params === 'object'\r\n ? params\r\n : {};\r\n const fields = typeof this._getFilterFieldKeys === 'function'\r\n ? this._getFilterFieldKeys()\r\n : [];\r\n if (!Array.isArray(fields) || !fields.length) {\r\n return {};\r\n }\r\n\r\n const prefix = typeof this._getFiltersUrlPrefix === 'function'\r\n ? String(this._getFiltersUrlPrefix() || '').trim()\r\n : '';\r\n if (!prefix) {\r\n return {};\r\n }\r\n\r\n const autoMap = {};\r\n fields.forEach((field) => {\r\n const normalizedField = String(field || '').trim();\r\n if (!normalizedField) {\r\n return;\r\n }\r\n const mappedField = typeof this._prefixFilterParamKey === 'function'\r\n ? this._prefixFilterParamKey(normalizedField, prefix)\r\n : (normalizedField.startsWith(prefix) ? normalizedField : `${prefix}${normalizedField}`);\r\n\r\n if (Object.prototype.hasOwnProperty.call(source, normalizedField)) {\r\n autoMap[normalizedField] = mappedField;\r\n }\r\n\r\n const operatorKey = `${normalizedField}_op`;\r\n const mappedOperatorKey = typeof this._prefixFilterParamKey === 'function'\r\n ? this._prefixFilterParamKey(operatorKey, prefix)\r\n : (operatorKey.startsWith(prefix) ? operatorKey : `${prefix}${operatorKey}`);\r\n if (Object.prototype.hasOwnProperty.call(source, operatorKey)) {\r\n autoMap[operatorKey] = mappedOperatorKey;\r\n }\r\n });\r\n return autoMap;\r\n },\r\n\r\n _getRequestPath(type) {\r\n const requestOptions = this._params.request || {};\r\n if (type === 'data') {\r\n const attrData = this._element.getAttribute('data-request-datapath');\r\n const raw = attrData !== null ? attrData : requestOptions.datapath;\r\n return String(raw || '').trim();\r\n }\r\n if (type === 'meta') {\r\n const attrMeta = this._element.getAttribute('data-request-metapath');\r\n const raw = attrMeta !== null ? attrMeta : requestOptions.metapath;\r\n return String(raw || '').trim();\r\n }\r\n if (type === 'view') {\r\n const attrView = this._element.getAttribute('data-request-viewpath');\r\n const raw = attrView !== null ? attrView : requestOptions.viewpath;\r\n return String(raw || '').trim();\r\n }\r\n return '';\r\n },\r\n\r\n _readPath(source, path) {\r\n if (!source || typeof source !== 'object') {\r\n return undefined;\r\n }\r\n const normalized = String(path || '').trim();\r\n if (!normalized) {\r\n return undefined;\r\n }\r\n const parts = normalized.split('.').map((item) => String(item || '').trim()).filter(Boolean);\r\n if (!parts.length) {\r\n return undefined;\r\n }\r\n let current = source;\r\n for (let i = 0; i < parts.length; i += 1) {\r\n if (!current || typeof current !== 'object' || !Object.prototype.hasOwnProperty.call(current, parts[i])) {\r\n return undefined;\r\n }\r\n current = current[parts[i]];\r\n }\r\n return current;\r\n },\r\n\r\n _extractRemoteRows(response) {\r\n const configured = this._readPath(response, this._getRequestPath('data'));\r\n if (Array.isArray(configured)) {\r\n return configured;\r\n }\r\n return Array.isArray(response && response.data) ? response.data : [];\r\n },\r\n\r\n _extractRemoteMeta(response) {\r\n const configured = this._readPath(response, this._getRequestPath('meta'));\r\n if (configured && typeof configured === 'object' && !Array.isArray(configured)) {\r\n return configured;\r\n }\r\n return response && typeof response === 'object' && response.meta && typeof response.meta === 'object'\r\n ? response.meta\r\n : {};\r\n },\r\n\r\n _extractRemoteViewRowsHtml(response) {\r\n if (!response || typeof response !== 'object') {\r\n return '';\r\n }\r\n\r\n const configured = this._readPath(response, this._getRequestPath('view'));\r\n if (typeof configured === 'string') {\r\n return configured;\r\n }\r\n\r\n if (typeof response.view === 'string') {\r\n return response.view;\r\n }\r\n\r\n const view = response.view && typeof response.view === 'object' ? response.view : null;\r\n if (view && typeof view.tbody === 'string') {\r\n return view.tbody;\r\n }\r\n if (view && typeof view.rows === 'string') {\r\n return view.rows;\r\n }\r\n\r\n if (typeof response.tbody === 'string') {\r\n return response.tbody;\r\n }\r\n\r\n return '';\r\n },\r\n\r\n _renderRemoteViewIfConfigured(viewRowsHtml, rows) {\r\n const mode = this._getRemoteResponseMode();\r\n const canUseView = typeof viewRowsHtml === 'string' && viewRowsHtml.trim() !== '';\r\n const shouldUseView = mode === 'view' || (mode === 'auto' && canUseView);\r\n if (!shouldUseView) {\r\n return false;\r\n }\r\n\r\n if (!canUseView) {\r\n if (Array.isArray(rows) && rows.length) {\r\n return false;\r\n }\r\n const message = this._getTableMessage('stateEmpty', 'Ничего нет');\r\n this._renderStateRow(message, 'empty');\r\n return true;\r\n }\r\n\r\n const body = this._getBody();\r\n body.innerHTML = viewRowsHtml;\r\n if (!this._hasRenderableRowsInBody(body)) {\r\n this._renderStateRow(this._getTableMessage('stateEmpty', 'Ничего нет'), 'empty');\r\n return true;\r\n }\r\n this._setFixedColumnsSuppressed(false);\r\n this._clearStateMode();\r\n return true;\r\n },\r\n\r\n async _waitMinLoadingDelay(startedAt) {\r\n const loadingOptions = this._params.loading || {};\r\n const minDelayMs = Math.max(0, Number.parseInt(loadingOptions.minDelay, 10) || 0);\r\n if (minDelayMs <= 0) {\r\n return;\r\n }\r\n\r\n const elapsed = Date.now() - startedAt;\r\n const remaining = minDelayMs - elapsed;\r\n if (remaining <= 0) {\r\n return;\r\n }\r\n\r\n await new Promise((resolve) => setTimeout(resolve, remaining));\r\n },\r\n};\r\n\r\nexport default tableRemoteMethods;\r\n","import {normalizeBooleanOption, normalizeEnabledFlag, safeQuerySelector, toQueryParamValue} from \"./utils/common\";\r\n\r\nconst tableUrlStateMethods = {\r\n _syncUrlState() {\r\n if (!this._isFiltersUrlStateEnabled() || !this._isFiltersUrlStateWriteOnChange()) {\r\n return;\r\n }\r\n if (typeof window === 'undefined' || !window.history || !window.location) {\r\n return;\r\n }\r\n\r\n let url;\r\n try {\r\n url = new URL(window.location.href);\r\n } catch (error) {\r\n this._emitAction('urlstateerror', {\r\n source: 'write',\r\n error,\r\n });\r\n return;\r\n }\r\n\r\n const nextState = this._collectUrlState();\r\n const managedKeys = this._getManagedUrlStateKeys();\r\n managedKeys.forEach((key) => {\r\n url.searchParams.delete(key);\r\n });\r\n\r\n Object.keys(nextState).forEach((key) => {\r\n const rawValue = nextState[key];\r\n const value = toQueryParamValue(rawValue);\r\n if (value === undefined || value === null || value === '') {\r\n return;\r\n }\r\n url.searchParams.set(key, String(value));\r\n });\r\n\r\n const nextUrl = `${url.pathname}${url.search}${url.hash}`;\r\n const currentUrl = `${window.location.pathname}${window.location.search}${window.location.hash}`;\r\n if (nextUrl === currentUrl) {\r\n return;\r\n }\r\n\r\n const mode = this._getUrlStateMode();\r\n if (mode === 'push') {\r\n window.history.pushState({}, '', nextUrl);\r\n } else {\r\n window.history.replaceState({}, '', nextUrl);\r\n }\r\n\r\n this._emitAction('urlstatewrite', {\r\n mode,\r\n state: Object.assign({}, nextState),\r\n url: nextUrl,\r\n });\r\n },\r\n\r\n _collectUrlState() {\r\n const next = {};\r\n const config = this._getFiltersUrlStateConfig();\r\n const prefix = this._getFiltersUrlPrefix();\r\n const searchParam = this._getSearchParamName();\r\n\r\n if (searchParam && Object.prototype.hasOwnProperty.call(this._remoteParams || {}, searchParam)) {\r\n next[searchParam] = this._remoteParams[searchParam];\r\n }\r\n\r\n this._getFilterFieldKeys().forEach((field) => {\r\n const valueKey = field;\r\n const operatorKey = `${field}_op`;\r\n const urlValueKey = this._prefixFilterParamKey(valueKey, prefix);\r\n const urlOperatorKey = this._prefixFilterParamKey(operatorKey, prefix);\r\n if (Object.prototype.hasOwnProperty.call(this._remoteParams || {}, valueKey)) {\r\n next[urlValueKey] = this._remoteParams[valueKey];\r\n }\r\n if (Object.prototype.hasOwnProperty.call(this._remoteParams || {}, operatorKey)) {\r\n next[urlOperatorKey] = this._remoteParams[operatorKey];\r\n }\r\n });\r\n\r\n if (this._isPaginationEnabled()) {\r\n const page = this._normalizePositiveInt(this._pageState.page, 1);\r\n const fallbackPerPage = this._normalizePositiveInt(this._params.pagination.perPage, 10);\r\n const perPage = this._normalizePositiveInt(this._pageState.perPage, fallbackPerPage);\r\n next[String(config.pageKey || 'page')] = page;\r\n next[String(config.perPageKey || 'perPage')] = perPage;\r\n }\r\n\r\n if (this._params.sortable && this._params.sortable.enable) {\r\n const sorts = this._getNormalizedSorts(this._sortState.sorts || []);\r\n const valid = sorts\r\n .filter((item) => String(item.field || '').trim() !== '')\r\n .map((item) => `${item.field}:${this._normalizeSortDir(item.dir)}`);\r\n if (valid.length > 0) {\r\n next[String(config.sortKey || 'sort')] = valid.join(',');\r\n }\r\n }\r\n\r\n return next;\r\n },\r\n\r\n _getManagedUrlStateKeys() {\r\n const keys = new Set();\r\n const config = this._getFiltersUrlStateConfig();\r\n const prefix = this._getFiltersUrlPrefix();\r\n\r\n keys.add(this._getSearchParamName());\r\n this._getFilterFieldKeys().forEach((field) => {\r\n keys.add(this._prefixFilterParamKey(field, prefix));\r\n keys.add(this._prefixFilterParamKey(`${field}_op`, prefix));\r\n });\r\n\r\n if (this._isPaginationEnabled()) {\r\n keys.add(String(config.pageKey || 'page'));\r\n keys.add(String(config.perPageKey || 'perPage'));\r\n }\r\n if (this._params.sortable && this._params.sortable.enable) {\r\n keys.add(String(config.sortKey || 'sort'));\r\n }\r\n\r\n return Array.from(keys).filter(Boolean);\r\n },\r\n\r\n _isUrlStateEnabled() {\r\n return this._isFiltersUrlStateEnabled();\r\n },\r\n\r\n _getUrlStateMode() {\r\n const config = this._getFiltersUrlStateConfig();\r\n const attr = this._element.getAttribute('data-filters-urlstate-history-mode');\r\n const mode = String(attr !== null ? attr : (config.historyMode || 'replace')).toLowerCase().trim();\r\n return mode === 'push' ? 'push' : 'replace';\r\n },\r\n\r\n _isUrlStateIncludePagination() {\r\n return this._isPaginationEnabled();\r\n },\r\n\r\n _isUrlStateIncludeSort() {\r\n return Boolean(this._params.sortable && this._params.sortable.enable);\r\n },\r\n\r\n _bindPopState() {\r\n if (!this._isRemote || !this._isFiltersUrlStateEnabled()) {\r\n return;\r\n }\r\n if (typeof window === 'undefined' || !window.addEventListener) {\r\n return;\r\n }\r\n const listen = this._isUrlStatePopStateEnabled();\r\n if (!listen) {\r\n return;\r\n }\r\n window.removeEventListener('popstate', this._boundPopState);\r\n window.addEventListener('popstate', this._boundPopState);\r\n },\r\n\r\n async _handlePopState() {\r\n if (!this._isRemote) {\r\n return;\r\n }\r\n\r\n this._remoteParams = this._getInitialRemoteParams();\r\n this._sortState = this._getInitialSortState();\r\n if (this._sortable) {\r\n this._sortable.setState({\r\n sorts: this._sortState.sorts,\r\n });\r\n }\r\n\r\n this._syncControlsFromState();\r\n\r\n const page = this._getInitialPage();\r\n const perPage = this._getInitialPerPage();\r\n this._pageState = { page, perPage };\r\n if (this._pagination) {\r\n this._pagination.setMeta({\r\n page,\r\n perPage,\r\n });\r\n }\r\n\r\n const filtersRequestMeta = this._getFiltersRequestMetaIfActive();\r\n await this._loadRemotePage(page, perPage, null, filtersRequestMeta);\r\n },\r\n\r\n _syncControlsFromState() {\r\n const searchParam = this._getSearchParamName();\r\n const searchSelector = this._getSearchInputSelector();\r\n if (searchSelector) {\r\n const input = this._getSearchInputNode(searchSelector);\r\n if (input) {\r\n input.value = String(this._remoteParams[searchParam] || '');\r\n }\r\n }\r\n\r\n if (this._filters && typeof this._filters.setValues === 'function') {\r\n this._filters.setValues(this._getInitialFilterValues(), { emit: false });\r\n }\r\n },\r\n\r\n _isUrlStatePopStateEnabled() {\r\n const attr = this._element.getAttribute('data-filters-urlstate-listen-popstate');\r\n return normalizeEnabledFlag(attr, true);\r\n },\r\n\r\n _getInitialRemoteParams() {\r\n const requestOptions = this._params.request || {};\r\n const requestParams = requestOptions.params || {};\r\n const nextParams = {};\r\n const reserved = new Set(['page', 'per_page', 'sort', 'dir']);\r\n\r\n Object.keys(requestParams).forEach((key) => {\r\n if (reserved.has(key)) {\r\n return;\r\n }\r\n const value = requestParams[key];\r\n if (value === undefined || value === null || value === '') {\r\n return;\r\n }\r\n nextParams[key] = value;\r\n });\r\n\r\n if (!this._isFiltersUrlStateEnabled() || !this._isFiltersUrlStateReadOnInit()) {\r\n return nextParams;\r\n }\r\n\r\n const config = this._getFiltersUrlStateConfig();\r\n const prefix = this._getFiltersUrlPrefix();\r\n const urlParams = this._getUrlParams();\r\n const searchParam = this._getSearchParamName();\r\n const filterFields = this._getFilterFieldKeys();\r\n\r\n if (searchParam && urlParams.has(searchParam)) {\r\n const value = String(urlParams.get(searchParam) || '').trim();\r\n if (value) {\r\n nextParams[searchParam] = value;\r\n } else {\r\n delete nextParams[searchParam];\r\n }\r\n }\r\n\r\n filterFields.forEach((field) => {\r\n const valueKey = this._prefixFilterParamKey(field, prefix);\r\n const operatorKey = this._prefixFilterParamKey(`${field}_op`, prefix);\r\n if (urlParams.has(valueKey)) {\r\n const value = String(urlParams.get(valueKey) || '').trim();\r\n if (value) {\r\n nextParams[field] = value.includes(',') ? value.split(',').map((item) => String(item || '').trim()).filter(Boolean) : value;\r\n } else {\r\n delete nextParams[field];\r\n }\r\n }\r\n if (urlParams.has(operatorKey)) {\r\n const operator = String(urlParams.get(operatorKey) || '').trim();\r\n if (operator) {\r\n nextParams[`${field}_op`] = operator;\r\n } else {\r\n delete nextParams[`${field}_op`];\r\n }\r\n }\r\n });\r\n\r\n const sortKey = String(config.sortKey || 'sort');\r\n if (urlParams.has(sortKey)) {\r\n const rawSort = String(urlParams.get(sortKey) || '').trim();\r\n if (rawSort) {\r\n const items = rawSort.split(',').map((item) => String(item || '').trim()).filter(Boolean);\r\n const fields = [];\r\n const dirs = [];\r\n items.forEach((item) => {\r\n const parts = item.split(':').map((part) => String(part || '').trim()).filter(Boolean);\r\n if (!parts.length) {\r\n return;\r\n }\r\n fields.push(parts[0]);\r\n dirs.push(parts[1] === 'desc' ? 'desc' : 'asc');\r\n });\r\n if (fields.length) {\r\n nextParams.sort = fields.join(',');\r\n nextParams.dir = dirs.join(',');\r\n }\r\n }\r\n }\r\n\r\n this._emitAction('urlstateread', {\r\n state: Object.assign({}, nextParams),\r\n });\r\n\r\n return nextParams;\r\n },\r\n\r\n _prefixFilterParamKey(key, prefix) {\r\n const rawKey = String(key || '').trim();\r\n if (!rawKey) {\r\n return '';\r\n }\r\n const rawPrefix = String(prefix || '').trim();\r\n if (!rawPrefix || rawKey.startsWith(rawPrefix)) {\r\n return rawKey;\r\n }\r\n return `${rawPrefix}${rawKey}`;\r\n },\r\n\r\n _getUrlParams() {\r\n try {\r\n return new URLSearchParams(window.location.search || '');\r\n } catch (error) {\r\n this._emitAction('urlstateerror', {\r\n source: 'read',\r\n error,\r\n });\r\n return new URLSearchParams();\r\n }\r\n },\r\n\r\n _getSearchParamName() {\r\n const searchOptions = this._params.search || {};\r\n const attrParam = this._element.getAttribute('data-search-param') || '';\r\n return String(searchOptions.param || attrParam || 'q').trim() || 'q';\r\n },\r\n\r\n _getFilterFieldKeys() {\r\n const form = this._getFiltersFormNode();\r\n if (!form) {\r\n return [];\r\n }\r\n\r\n if (Array.isArray(this._filterParamKeysCache)) {\r\n return this._filterParamKeysCache.slice();\r\n }\r\n\r\n const options = this._params.filters || {};\r\n const fieldAttr = String(options.fieldAttr || 'data-filter-field').trim() || 'data-filter-field';\r\n const unique = new Set();\r\n Array.from(form.querySelectorAll(`[${fieldAttr}]`)).forEach((node) => {\r\n const key = String(node.getAttribute(fieldAttr) || '').trim();\r\n if (key) {\r\n unique.add(key);\r\n }\r\n });\r\n this._filterParamKeysCache = Array.from(unique);\r\n return this._filterParamKeysCache.slice();\r\n },\r\n\r\n _getInitialFilterValues() {\r\n const keys = this._getFilterFieldKeys();\r\n if (!keys.length) {\r\n return {};\r\n }\r\n const values = {};\r\n keys.forEach((key) => {\r\n if (Object.prototype.hasOwnProperty.call(this._remoteParams, key)) {\r\n values[key] = this._remoteParams[key];\r\n }\r\n if (Object.prototype.hasOwnProperty.call(this._remoteParams, `${key}_op`)) {\r\n values[`${key}_op`] = this._remoteParams[`${key}_op`];\r\n }\r\n });\r\n return values;\r\n },\r\n\r\n _getFiltersFormSelector() {\r\n const filterOptions = this._params.filters || {};\r\n if (typeof filterOptions.form === 'string') {\r\n return String(filterOptions.form).trim();\r\n }\r\n const attrSelector = this._element.getAttribute('data-filters-form') || '';\r\n return String(attrSelector).trim();\r\n },\r\n\r\n _getFiltersFormNode() {\r\n const filterOptions = this._params.filters || {};\r\n const optionForm = filterOptions.form;\r\n if (optionForm && optionForm.nodeType === 1) {\r\n const shouldRefreshByNode = this._filtersFormCacheNode !== optionForm\r\n || this._filtersFormCacheSelector !== '';\r\n if (shouldRefreshByNode) {\r\n this._filtersFormCacheSelector = '';\r\n this._filtersFormCacheNode = optionForm;\r\n this._filterParamKeysCache = null;\r\n }\r\n if (!optionForm.isConnected) {\r\n return null;\r\n }\r\n return this._filtersFormCacheNode;\r\n }\r\n\r\n const selector = this._getFiltersFormSelector();\r\n if (!selector) {\r\n this._filtersFormCacheSelector = '';\r\n this._filtersFormCacheNode = null;\r\n this._filterParamKeysCache = null;\r\n return null;\r\n }\r\n const shouldRefresh = this._filtersFormCacheSelector !== selector\r\n || !this._filtersFormCacheNode\r\n || !this._filtersFormCacheNode.isConnected;\r\n if (shouldRefresh) {\r\n this._filtersFormCacheSelector = selector;\r\n this._filtersFormCacheNode = safeQuerySelector(selector);\r\n this._filterParamKeysCache = null;\r\n }\r\n return this._filtersFormCacheNode;\r\n },\r\n\r\n _getFiltersUrlStateConfig() {\r\n const filters = this._params.filters || {};\r\n const urlState = filters.urlState && typeof filters.urlState === 'object'\r\n ? filters.urlState\r\n : {};\r\n return urlState;\r\n },\r\n\r\n _getFiltersUrlPrefix() {\r\n const config = this._getFiltersUrlStateConfig();\r\n const attr = this._element.getAttribute('data-filters-urlstate-prefix');\r\n const raw = attr !== null ? attr : config.paramPrefix;\r\n return String(raw || 'f.').trim() || 'f.';\r\n },\r\n\r\n _isFiltersUrlStateEnabled() {\r\n const config = this._getFiltersUrlStateConfig();\r\n const attr = this._element.getAttribute('data-filters-urlstate-enable');\r\n const raw = attr !== null ? attr : config.enable;\r\n return normalizeBooleanOption(raw, false);\r\n },\r\n\r\n _isFiltersUrlStateReadOnInit() {\r\n const config = this._getFiltersUrlStateConfig();\r\n const attr = this._element.getAttribute('data-filters-urlstate-read-on-init');\r\n const raw = attr !== null ? attr : config.readOnInit;\r\n return normalizeEnabledFlag(raw, true);\r\n },\r\n\r\n _isFiltersUrlStateWriteOnChange() {\r\n const config = this._getFiltersUrlStateConfig();\r\n const attr = this._element.getAttribute('data-filters-urlstate-write-on-change');\r\n const raw = attr !== null ? attr : config.writeOnChange;\r\n return normalizeEnabledFlag(raw, true);\r\n },\r\n};\r\n\r\nexport default tableUrlStateMethods;\r\n","const tableStateMethods = {\r\n _renderRemoteRows(rows) {\r\n const body = this._getBody();\r\n\r\n if (!rows.length) {\r\n const message = this._getTableMessage('stateEmpty', 'Ничего нет');\r\n this._renderStateRow(message, 'empty');\r\n return;\r\n }\r\n\r\n this._setFixedColumnsSuppressed(false);\r\n this._clearStateMode();\r\n body.innerHTML = rows.map((row) => {\r\n const cells = this._fields.map((field) => {\r\n const rawValue = row && Object.prototype.hasOwnProperty.call(row, field) ? row[field] : '';\r\n const prepared = this._formatFieldValue(field, rawValue);\r\n return `<td>${this._escapeHtml(prepared)}</td>`;\r\n });\r\n return `<tr>${cells.join('')}</tr>`;\r\n }).join('');\r\n this._updatePanHintVisibility();\r\n },\r\n\r\n _renderStateRow(message, state) {\r\n const body = this._getBody();\r\n const columns = this._getRenderedColumnsCount();\r\n const retryButton = state === 'error'\r\n ? `<div class=\"vgdt-state-actions\"><button type=\"button\" class=\"vgdt-state-reset\" data-state-retry>${this._escapeHtml(this._getTableMessage('retry', 'Retry'))}</button></div>`\r\n : '';\r\n const illustration = this._buildStateIllustrationMarkup(state);\r\n body.innerHTML = `<tr><td colspan=\"${columns}\" data-table-state=\"${state}\"><div class=\"vgdt-state\">${illustration}<div class=\"vgdt-state-text\">${this._escapeHtml(message)}</div>${retryButton}</div></td></tr>`;\r\n const stateCell = body.querySelector('[data-table-state]');\r\n this._setFixedColumnsSuppressed(true);\r\n this._setStateMode(state);\r\n this._ensureStateRowVisible(stateCell);\r\n this._announce(message);\r\n this._clearFooter();\r\n this._updatePanHintVisibility();\r\n this._refreshStickyAndFixedLayout();\r\n },\r\n\r\n _hasRenderableRowsInBody(body) {\r\n if (!body || !body.rows || !body.rows.length) {\r\n return false;\r\n }\r\n return Array.from(body.rows).some((row) => {\r\n const cells = Array.from(row.cells || []);\r\n if (!cells.length) {\r\n return false;\r\n }\r\n return cells.some((cell) => {\r\n if (!cell) {\r\n return false;\r\n }\r\n const text = String(cell.textContent || '').trim();\r\n return text !== '' || cell.children.length > 0;\r\n });\r\n });\r\n },\r\n\r\n _setFixedColumnsSuppressed(value) {\r\n this._fixedColumnsSuppressed = Boolean(value);\r\n },\r\n\r\n _setStateMode(state) {\r\n if (!this._parent) {\r\n return;\r\n }\r\n this._parent.setAttribute('data-state-mode', String(state || ''));\r\n },\r\n\r\n _clearStateMode() {\r\n if (!this._parent) {\r\n return;\r\n }\r\n this._parent.removeAttribute('data-state-mode');\r\n },\r\n\r\n _buildStateIllustrationMarkup(state) {\r\n const stateOptions = this._params.state && typeof this._params.state === 'object'\r\n ? this._params.state\r\n : {};\r\n const optionKey = state === 'error' ? 'errorIllustration' : 'emptyIllustration';\r\n const attrName = state === 'error'\r\n ? 'data-state-error-illustration'\r\n : 'data-state-empty-illustration';\r\n const optionValue = stateOptions[optionKey] || '';\r\n const attrValue = this._element ? this._element.getAttribute(attrName) : '';\r\n const src = String(optionValue || attrValue || '').trim();\r\n if (!src) {\r\n return '<div class=\"vgdt-state-illustration\" aria-hidden=\"true\"></div>';\r\n }\r\n const inlineSvg = this._extractInlineSvgMarkup(src);\r\n if (inlineSvg) {\r\n return `<div class=\"vgdt-state-illustration\" aria-hidden=\"true\">${inlineSvg}</div>`;\r\n }\r\n const alt = state === 'error' ? 'Error' : 'Empty';\r\n return `<div class=\"vgdt-state-illustration\"><img src=\"${this._escapeHtml(src)}\" alt=\"${alt}\" loading=\"lazy\"></div>`;\r\n },\r\n\r\n _extractInlineSvgMarkup(value) {\r\n const raw = String(value || '').trim();\r\n if (!raw) {\r\n return '';\r\n }\r\n if (/^<svg[\\s>]/i.test(raw)) {\r\n return raw;\r\n }\r\n\r\n const decoded = this._decodeHtmlEntities(raw);\r\n if (/^<svg[\\s>]/i.test(decoded)) {\r\n return decoded;\r\n }\r\n return '';\r\n },\r\n\r\n _decodeHtmlEntities(value) {\r\n return String(value || '')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/"/g, '\"')\r\n .replace(/'/g, '\\'')\r\n .replace(/&/g, '&');\r\n },\r\n\r\n _ensureStateRowVisible(stateCell) {\r\n if (!stateCell) {\r\n return;\r\n }\r\n const minHeight = this._getStateBlockMinHeight();\r\n stateCell.style.minHeight = `${minHeight}px`;\r\n if (this._tableViewport) {\r\n this._tableViewport.scrollTop = 0;\r\n this._tableViewport.scrollLeft = 0;\r\n }\r\n if (typeof window === 'undefined') {\r\n return;\r\n }\r\n const rect = stateCell.getBoundingClientRect();\r\n const vh = window.innerHeight || 0;\r\n if (rect.top < 0 || (vh > 0 && rect.bottom > vh)) {\r\n stateCell.scrollIntoView({ block: 'center', inline: 'nearest' });\r\n }\r\n },\r\n\r\n _getStateBlockMinHeight() {\r\n if (typeof window === 'undefined') {\r\n return 180;\r\n }\r\n const vh = window.innerHeight || 0;\r\n const isMobile = (window.innerWidth || 0) <= 768;\r\n const ratio = isMobile ? 0.52 : 0.34;\r\n const computed = vh > 0 ? Math.round(vh * ratio) : 0;\r\n return Math.max(160, computed);\r\n },\r\n\r\n _bindTableStateActions() {\r\n this._element.addEventListener('click', (event) => {\r\n const reset = event.target.closest('[data-state-reset]');\r\n if (reset) {\r\n event.preventDefault();\r\n this._resetFiltersAndSearch();\r\n return;\r\n }\r\n const retry = event.target.closest('[data-state-retry]');\r\n if (retry) {\r\n event.preventDefault();\r\n this._reloadCurrentPage();\r\n }\r\n });\r\n },\r\n\r\n _resetFiltersAndSearch() {\r\n if (!this._isRemote) {\r\n return;\r\n }\r\n\r\n this._remoteParams = {};\r\n this._activeFilters = {};\r\n this._sortState = Object.assign({}, this._sortState, { field: '', dir: 'asc', columnIndex: -1, sorts: [] });\r\n if (this._sortable) {\r\n this._sortable.setState({ sorts: [] });\r\n }\r\n\r\n const searchSelector = this._getSearchInputSelector();\r\n if (searchSelector) {\r\n const searchInput = this._getSearchInputNode(searchSelector);\r\n if (searchInput) {\r\n searchInput.value = '';\r\n }\r\n }\r\n\r\n if (this._filters && typeof this._filters.setValues === 'function') {\r\n this._filters.setValues({}, { emit: false });\r\n }\r\n\r\n const perPage = this._pageState.perPage || this._normalizePositiveInt(this._params.pagination.perPage, 10);\r\n this._pageState = { page: 1, perPage };\r\n this._emitAction('reset', {\r\n page: 1,\r\n perPage,\r\n });\r\n this._loadRemotePage(1, perPage);\r\n },\r\n\r\n _reloadCurrentPage() {\r\n if (!this._isRemote) {\r\n return;\r\n }\r\n const page = this._pageState.page || 1;\r\n const perPage = this._pageState.perPage || this._normalizePositiveInt(this._params.pagination.perPage, 10);\r\n this._loadRemotePage(page, perPage);\r\n },\r\n\r\n _hasActiveRemoteFilters() {\r\n if (!this._isRemote) {\r\n return false;\r\n }\r\n return Object.keys(this._remoteParams || {}).length > 0;\r\n },\r\n\r\n _ensureLiveRegion() {\r\n if (this._liveRegion || !this._parent) {\r\n return;\r\n }\r\n const node = document.createElement('div');\r\n node.className = 'vgdt-live-region';\r\n node.setAttribute('aria-live', 'polite');\r\n node.setAttribute('aria-atomic', 'true');\r\n this._parent.appendChild(node);\r\n this._liveRegion = node;\r\n },\r\n\r\n _announce(message) {\r\n if (!this._liveRegion) {\r\n return;\r\n }\r\n this._liveRegion.textContent = String(message || '');\r\n },\r\n};\r\n\r\nexport default tableStateMethods;\r\n\r\n","const DEFAULT_OPTIONS = {\r\n // Режим темы таблицы.\r\n // data-атрибуты: data-theme\r\n theme: 'auto', // auto | light | dark\r\n\r\n // Ключ локали для выбора словаря i18n.\r\n // data-атрибуты: data-locale\r\n locale: 'ru',\r\n\r\n // Локализованные словари интерфейса.\r\n // data-атрибуты: нет прямого (обычно задается из JS)\r\n i18n: {\r\n ru: {\r\n pagination: {\r\n // Подпись блока per-page.\r\n // data-атрибуты: data-pagination-per-page-label\r\n perPageLabel: 'Строк на странице',\r\n // Суффикс варианта per-page.\r\n // data-атрибуты: data-pagination-per-page-option-suffix\r\n perPageOptionSuffix: 'на страницу',\r\n // Текст кнопки \"назад\".\r\n // data-атрибуты: data-pagination-prev-label\r\n prevLabel: 'Назад',\r\n // Текст кнопки \"вперед\".\r\n // data-атрибуты: data-pagination-next-label\r\n nextLabel: 'Вперед',\r\n // Текст кнопки быстрого перехода.\r\n // data-атрибуты: data-pagination-quick-jump-button-label\r\n quickJumpButtonLabel: 'Перейти',\r\n },\r\n table: {\r\n // Текст состояния загрузки.\r\n // data-атрибуты: data-table-loading-label\r\n loading: 'Загрузка данных...',\r\n // Текст пустого состояния.\r\n // data-атрибуты: data-table-empty-label\r\n empty: 'Нет данных.',\r\n // Текст состояния ошибки.\r\n // data-атрибуты: data-table-error-label\r\n error: 'Не удалось загрузить данные.',\r\n // Текст кнопки повторного запроса при ошибке.\r\n // data-атрибуты: data-table-retry-label\r\n retry: 'Повторить',\r\n // Подсказка для горизонтальной прокрутки таблицы.\r\n // data-атрибуты: data-table-shift-drag-hint\r\n shiftDragHint: 'Зажмите Shift и тяните мышью для прокрутки таблицы.',\r\n },\r\n sortable: {\r\n // Подсказка сортировки по возрастанию.\r\n // data-атрибуты: data-sort-asc-label\r\n ascLabel: 'Сортировка по возрастанию',\r\n // Подсказка сортировки по убыванию.\r\n // data-атрибуты: data-sort-desc-label\r\n descLabel: 'Сортировка по убыванию',\r\n },\r\n summary: {\r\n // Подпись общего количества.\r\n // data-атрибуты: data-summary-found-label\r\n foundLabel: 'Найдено',\r\n // Подпись активного поиска.\r\n // data-атрибуты: data-summary-search-label\r\n searchLabel: 'Поиск',\r\n // Подпись видимых строк.\r\n // data-атрибуты: data-summary-visible-rows-label\r\n visibleRowsLabel: 'Строк на странице',\r\n // Подпись суммы цен.\r\n // data-атрибуты: data-summary-page-price-sum-label\r\n pagePriceSumLabel: 'Сумма цен',\r\n // Подпись суммарного остатка.\r\n // data-атрибуты: data-summary-page-stock-sum-label\r\n pageStockSumLabel: 'Суммарный остаток',\r\n // Подпись среднего рейтинга.\r\n // data-атрибуты: data-summary-page-avg-rating-label\r\n pageAvgRatingLabel: 'Средний рейтинг',\r\n },\r\n },\r\n en: {\r\n pagination: {\r\n perPageLabel: 'Rows per page',\r\n perPageOptionSuffix: 'page',\r\n prevLabel: 'Prev',\r\n nextLabel: 'Next',\r\n quickJumpButtonLabel: 'Go',\r\n },\r\n table: {\r\n loading: 'Loading data...',\r\n empty: 'No data available.',\r\n error: 'Failed to load data.',\r\n retry: 'Retry',\r\n shiftDragHint: 'Hold Shift and drag to scroll the table.',\r\n },\r\n sortable: {\r\n ascLabel: 'Sort ascending',\r\n descLabel: 'Sort descending',\r\n },\r\n summary: {\r\n foundLabel: 'Found',\r\n searchLabel: 'Search',\r\n visibleRowsLabel: 'Rows on page',\r\n pagePriceSumLabel: 'Price sum',\r\n pageStockSumLabel: 'Total stock',\r\n pageAvgRatingLabel: 'Average rating',\r\n },\r\n },\r\n },\r\n\r\n // Локальный источник строк (без remote API).\r\n // data-атрибуты: нет прямого\r\n data: [],\r\n\r\n fixed: {\r\n // data-attributes: data-fixed-columns\r\n columns: '',\r\n },\r\n\r\n views: {\r\n storage: {\r\n // data-attributes: data-views-storage-key\r\n key: '',\r\n },\r\n },\r\n\r\n request: {\r\n // URL endpoint для remote-запросов.\r\n // data-атрибуты: data-request-route\r\n route: '',\r\n // HTTP-метод запроса.\r\n // data-атрибуты: data-request-method\r\n method: 'GET',\r\n // Режим credentials для fetch.\r\n // data-атрибуты: data-request-credentials\r\n credentials: 'same-origin',\r\n // Базовые HTTP-заголовки.\r\n // data-атрибуты: нет прямого\r\n headers: { 'Accept': 'application/json' },\r\n // Базовые query-параметры для каждого запроса.\r\n // data-атрибуты: data-request-params (json)\r\n params: {},\r\n // Маппинг внутренних параметров в backend-имена (например, q -> search).\r\n // data-атрибуты: data-request-parammap\r\n parammap: {},\r\n // Режим чтения ответа: data | view | auto.\r\n // data-атрибуты: data-request-responsemode\r\n responsemode: 'data',\r\n // Dot-path до массива строк в JSON.\r\n // data-атрибуты: data-request-datapath\r\n datapath: 'data',\r\n // Dot-path до meta в JSON.\r\n // data-атрибуты: data-request-metapath\r\n metapath: 'meta',\r\n // Dot-path до server-rendered HTML строк.\r\n // data-атрибуты: data-request-viewpath\r\n viewpath: 'view.tbody',\r\n // Имя параметра для запроса server-rendered view.\r\n // data-атрибуты: data-request-viewparam\r\n viewparam: 'view',\r\n // Значение параметра для server-rendered view.\r\n // data-атрибуты: data-request-viewvalue\r\n viewvalue: 'rows',\r\n // Имя параметра списка полей для view-режима.\r\n // data-атрибуты: data-request-fieldsparam\r\n fieldsparam: 'fields',\r\n cache: {\r\n // data-attributes: data-request-cache-enable\r\n enable: true,\r\n // data-attributes: data-request-cache-ttl\r\n ttl: 30000,\r\n // data-attributes: data-request-cache-max\r\n max: 30,\r\n },\r\n export: {\r\n // data-attributes: data-request-export-route\r\n route: '',\r\n },\r\n },\r\n\r\n pagination: {\r\n // Canonical key for enable flag.\r\n // data-attributes: data-pagination-enable\r\n enable: false,\r\n // Начальная страница.\r\n // data-атрибуты: data-pagination-page\r\n page: 1,\r\n // Начальный per-page.\r\n // data-атрибуты: data-pagination-perPage | data-pagination-per-page\r\n perPage: 10,\r\n // Canonical key for page size.\r\n // data-attributes: data-pagination-per\r\n per: 10,\r\n // Максимально допустимый per-page.\r\n // data-атрибуты: data-pagination-maxPerPage | data-pagination-max-per-page\r\n maxPerPage: 100,\r\n // Canonical key for max page size.\r\n // data-attributes: data-pagination-max\r\n max: 100,\r\n // Сохранять страницу в localStorage.\r\n // data-атрибуты: data-pagination-persist-page\r\n persistPage: true,\r\n // Сохранять per-page в localStorage.\r\n // data-атрибуты: data-pagination-persist-per-page\r\n persistPerPage: true,\r\n persist: {\r\n // data-attributes: data-pagination-persist-page\r\n page: true,\r\n // data-attributes: data-pagination-persist-per\r\n per: true,\r\n },\r\n // Ключ storage для per-page.\r\n // data-атрибуты: data-pagination-storage-key\r\n storageKey: '',\r\n // Ключ storage для page.\r\n // data-атрибуты: data-pagination-page-storage-key\r\n pageStorageKey: '',\r\n storage: {\r\n // data-attributes: data-pagination-storage-key\r\n key: '',\r\n },\r\n pageStorage: {\r\n storage: {\r\n // data-attributes: data-pagination-page-storage-key\r\n key: '',\r\n },\r\n },\r\n // Фиксированное число страниц (опционально).\r\n // data-атрибуты: data-pagination-totalPages | data-pagination-total-pages\r\n totalPages: null,\r\n // Позиция пагинатора.\r\n // data-атрибуты: data-pagination-position\r\n position: 'bottom', // top | bottom | both\r\n // Выравнивание пагинатора.\r\n // data-атрибуты: data-pagination-align\r\n align: 'left', // left | center | right | between\r\n // Режим рендера контролов.\r\n // data-атрибуты: data-pagination-renderMode | data-pagination-render-mode\r\n renderMode: 'auto', // auto | class | markup\r\n // Использовать многоточия.\r\n // data-атрибуты: data-pagination-ellipsis\r\n ellipsis: true,\r\n // Порог появления многоточий.\r\n // data-атрибуты: data-pagination-ellipsisAfter | data-pagination-ellipsis-after\r\n ellipsisAfter: 5,\r\n // Максимум видимых кнопок страниц.\r\n // data-атрибуты: data-pagination-maxVisiblePages | data-pagination-max-visible-pages\r\n maxVisiblePages: 5,\r\n // Показывать контрол per-page.\r\n // data-атрибуты: data-pagination-showPerPage | data-pagination-show-per-page\r\n showPerPage: true,\r\n // Показывать подпись рядом с per-page.\r\n // data-атрибуты: data-pagination-showPerPageLabel | data-pagination-show-per-page-label\r\n showPerPageLabel: false,\r\n // Прокручивать к началу таблицы при смене страницы.\r\n // data-атрибуты: data-pagination-scrollToTop | data-pagination-scroll-to-top\r\n scrollToTop: true,\r\n // Прокручивать страницу к началу окна браузера при смене страницы.\r\n // data-атрибуты: data-pagination-scrollToWindowTop | data-pagination-scroll-to-window-top\r\n scrollToWindowTop: false,\r\n // Режим быстрого перехода.\r\n // data-атрибуты: data-pagination-quickJump | data-pagination-quick-jump\r\n quickJump: false, // auto | true | false\r\n // Подпись кнопки быстрого перехода.\r\n // data-атрибуты: data-pagination-quickJumpButtonLabel | data-pagination-quick-jump-button-label\r\n quickJumpButtonLabel: 'Перейти',\r\n // Доступные варианты per-page.\r\n // data-атрибуты: data-pagination-perPageOptions | data-pagination-per-page-options\r\n perPageOptions: [10, 25, 50, 100],\r\n // Колбек смены страницы.\r\n // data-атрибуты: нет прямого\r\n onChange: null,\r\n // Колбек смены per-page.\r\n // data-атрибуты: нет прямого\r\n onPerPageChange: null,\r\n },\r\n\r\n sortable: {\r\n // Canonical key for enable flag.\r\n // data-attributes: data-sortable-enable\r\n enable: true,\r\n // Начальное поле сортировки.\r\n // data-атрибуты: data-sort\r\n initialField: '',\r\n // Начальное направление сортировки.\r\n // data-атрибуты: data-dir\r\n initialDir: 'asc',\r\n // Включить мультисортировку.\r\n // data-атрибуты: data-sort-multi | data-sortmulti\r\n multi: false,\r\n // Мультисортировка только с Shift.\r\n // data-атрибуты: data-sort-multi-with-shift | data-sortmultiWithShift\r\n multiWithShift: true,\r\n // Белый список сортируемых полей.\r\n // data-атрибуты: data-sort-fields\r\n fields: [],\r\n // Скрывать стрелки у несортированных колонок.\r\n // data-атрибуты: data-sort-hide-unsorted-arrows\r\n hideUnsortedArrows: true,\r\n // Пользовательская проверка сортируемости колонки.\r\n // data-атрибуты: нет прямого\r\n isColumnSortable: () => true,\r\n },\r\n\r\n columnReorder: {\r\n // Canonical key for enable flag.\r\n // data-attributes: data-column-reorder-enable\r\n enable: false,\r\n // Сохранять порядок колонок.\r\n // data-атрибуты: data-column-reorder-persist\r\n persist: false,\r\n // Ключ storage для порядка колонок.\r\n // data-атрибуты: data-column-reorder-storage-key\r\n storageKey: '',\r\n },\r\n\r\n columnResize: {\r\n // Canonical key for enable flag.\r\n // data-attributes: data-column-resize-enable\r\n enable: false,\r\n // Минимальная ширина колонки.\r\n // data-атрибуты: data-column-resize-min-width\r\n minWidth: 80,\r\n // Максимальная ширина колонки.\r\n // data-атрибуты: data-column-resize-max-width\r\n maxWidth: 600,\r\n },\r\n\r\n virtual: {\r\n // Canonical key for enable flag.\r\n // data-attributes: data-virtual-enable\r\n enable: false,\r\n // Ожидаемая высота строки (px).\r\n // data-атрибуты: data-virtual-row-height\r\n rowHeight: 44,\r\n // Запас строк вне viewport.\r\n // data-атрибуты: data-virtual-overscan\r\n overscan: 8,\r\n // Порог числа строк для активации виртуализации.\r\n // data-атрибуты: data-virtual-threshold\r\n threshold: 500,\r\n },\r\n\r\n expandable: {\r\n // Enable tree-like expandable rows.\r\n // data-attributes: data-expandable-enable\r\n enable: false,\r\n // Attribute name with unique row id.\r\n // data-attributes: data-expandable-id-attr\r\n idAttr: 'data-expand-id',\r\n // Attribute name with parent row id.\r\n // data-attributes: data-expandable-parent-attr\r\n parentAttr: 'data-expand-parent-id',\r\n // Selector for toggle control inside row.\r\n // data-attributes: data-expandable-toggle-selector\r\n toggleSelector: '[data-expand-toggle]',\r\n // Collapse groups by default.\r\n // data-attributes: data-expandable-collapsed\r\n collapsed: true,\r\n },\r\n\r\n loading: {\r\n // Canonical key for minimum loading delay.\r\n // data-attributes: data-loading-min-delay\r\n minDelay: 500,\r\n // Количество skeleton-строк.\r\n // data-атрибуты: data-loading-skeleton | data-loading-skeleton-rows\r\n skeleton: 10,\r\n },\r\n\r\n summary: {\r\n // Canonical key for enable flag.\r\n // data-attributes: data-summary-enable\r\n enable: false,\r\n },\r\n\r\n footer: {\r\n // Canonical key for enable flag.\r\n // data-attributes: data-footer-enable\r\n enable: false,\r\n },\r\n\r\n state: {\r\n // SVG/URL для иллюстрации error-state.\r\n // data-атрибуты: data-state-error-illustration\r\n errorIllustration: '<svg width=\"100\" height=\"100\" viewBox=\"0 0 100 100\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><circle cx=\"50\" cy=\"50\" r=\"36\" stroke=\"currentColor\" stroke-opacity=\"0.32\" stroke-width=\"4\"/><path d=\"M50 30V56\" stroke=\"currentColor\" stroke-opacity=\"0.7\" stroke-width=\"6\" stroke-linecap=\"round\"/><circle cx=\"50\" cy=\"68\" r=\"4\" fill=\"currentColor\" fill-opacity=\"0.7\"/></svg>',\r\n // SVG/URL для иллюстрации empty-state.\r\n // data-атрибуты: data-state-empty-illustration\r\n emptyIllustration: '<svg width=\"100\" height=\"100\" viewBox=\"0 0 100 100\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><rect x=\"18\" y=\"24\" width=\"64\" height=\"52\" rx=\"8\" stroke=\"currentColor\" stroke-opacity=\"0.32\" stroke-width=\"4\"/><path d=\"M30 40H70M30 50H62M30 60H54\" stroke=\"currentColor\" stroke-opacity=\"0.55\" stroke-width=\"4\" stroke-linecap=\"round\"/><circle cx=\"72\" cy=\"68\" r=\"10\" stroke=\"currentColor\" stroke-opacity=\"0.6\" stroke-width=\"4\"/><path d=\"M79 75L86 82\" stroke=\"currentColor\" stroke-opacity=\"0.6\" stroke-width=\"4\" stroke-linecap=\"round\"/></svg>',\r\n },\r\n\r\n panHint: {\r\n // Canonical key for dismiss days.\r\n // data-attributes: data-pan-hint-dismiss\r\n dismiss: 60,\r\n // Сколько дней скрывать подсказку \"Shift + drag\" после закрытия.\r\n // data-атрибуты: data-pan-hint-dismiss-days\r\n dismissDays: 60,\r\n },\r\n\r\n stickyHeader: {\r\n // Canonical key for enable flag.\r\n // data-attributes: data-sticky-header-enable\r\n enable: false,\r\n // Отступ сверху для sticky-header (px).\r\n // data-атрибуты: data-sticky-header-top-offset | data-stickyHeader-top\r\n top: 0,\r\n // Максимальная высота viewport таблицы.\r\n // data-атрибуты: data-sticky-header-max-height | data-stickyHeader-max\r\n max: 0,\r\n },\r\n\r\n search: {\r\n // Canonical key for enable flag.\r\n // data-attributes: data-search-enable\r\n enable: false,\r\n // Debounce поиска.\r\n // data-атрибуты: data-search-debounce | data-search-debounce-ms\r\n debounce: 300,\r\n // Имя query-параметра поиска.\r\n // data-атрибуты: data-search-param\r\n param: 'q',\r\n // CSS-селектор input поиска.\r\n // data-атрибуты: data-search-input | data-search-input-selector\r\n input: '',\r\n },\r\n\r\n filters: {\r\n // Canonical key for enable flag.\r\n // data-attributes: data-filters-enable\r\n enable: false,\r\n // CSS-селектор формы фильтров.\r\n // data-атрибуты: data-filters-form | data-filters-form-selector\r\n form: '',\r\n // Debounce фильтров.\r\n // data-атрибуты: data-filters-debounce | data-filters-debounce-ms\r\n debounce: 300,\r\n // Режим применения фильтров.\r\n // data-атрибуты: data-filters-apply | data-filters-apply-mode\r\n apply: 'auto', // auto | manual\r\n // Селекторы кнопок применения/сброса.\r\n // data-attributes: data-filters-button-apply | data-filters-button-reset\r\n button: {\r\n apply: '[data-filter-apply]',\r\n reset: '[data-filter-reset]',\r\n },\r\n // Отдельный route для фильтрации (опционально).\r\n // data-атрибуты: data-filters-route\r\n route: '',\r\n // Атрибут ключа фильтра (канонический field id).\r\n // data-атрибуты: data-filters-field-attr\r\n fieldAttr: 'data-filter-field',\r\n // Атрибут части фильтра (value|operator).\r\n // data-атрибуты: data-filters-part-attr\r\n partAttr: 'data-filter-part',\r\n // Атрибут типа сравнения (eq|contains|gt|...).\r\n // data-атрибуты: data-filters-type-attr\r\n typeAttr: 'data-filter-type',\r\n // Атрибут значения по умолчанию для фильтра.\r\n // data-атрибуты: data-filters-value-attr\r\n valueAttr: 'data-filter-value',\r\n // Атрибут оператора по умолчанию для фильтра.\r\n // data-атрибуты: data-filters-operator-attr\r\n operatorAttr: 'data-filter-operator',\r\n // Оператор по умолчанию.\r\n // data-атрибуты: data-filters-default-operator\r\n defaultOperator: 'eq',\r\n // Сбрасывать страницу при изменении фильтров.\r\n // data-атрибуты: data-filters-reset-page-on-change\r\n resetPageOnChange: true,\r\n // Пропускать пустые значения фильтров.\r\n // data-атрибуты: data-filters-skip-empty\r\n skipEmpty: true,\r\n // Trim текстовых значений.\r\n // data-атрибуты: data-filters-trim-values\r\n trimValues: true,\r\n // Всегда эмитить полный контекст sent/received для callbacks/events.\r\n // data-атрибуты: data-filters-emit-full-context\r\n emitFullContext: true,\r\n // URL-state для фильтров.\r\n urlState: {\r\n // data-атрибуты: data-filters-urlstate-enable\r\n enable: false,\r\n // data-атрибуты: data-filters-urlstate-read-on-init\r\n readOnInit: true,\r\n // data-атрибуты: data-filters-urlstate-write-on-change\r\n writeOnChange: true,\r\n // data-атрибуты: data-filters-urlstate-history-mode\r\n historyMode: 'replace', // replace | push\r\n // data-атрибуты: data-filters-urlstate-prefix\r\n paramPrefix: 'f.',\r\n // data-атрибуты: data-filters-urlstate-page-key\r\n pageKey: 'page',\r\n // data-атрибуты: data-filters-urlstate-per-page-key\r\n perPageKey: 'perPage',\r\n // data-атрибуты: data-filters-urlstate-sort-key\r\n sortKey: 'sort',\r\n },\r\n // Конфигурация транспортного payload.\r\n transport: {\r\n // data-атрибуты: data-filters-payload-key\r\n payloadKey: 'filters',\r\n // data-атрибуты: data-filters-include-meta\r\n includeMeta: true,\r\n // data-атрибуты: data-filters-include-urlstate\r\n includeUrlState: true,\r\n },\r\n // Конфигурация response mapping.\r\n response: {\r\n // data-атрибуты: data-filters-response-rows-path\r\n rowsPath: 'data.rows',\r\n // data-атрибуты: data-filters-response-total-path\r\n totalPath: 'data.total',\r\n // data-атрибуты: data-filters-response-meta-path\r\n metaPath: 'meta',\r\n // data-атрибуты: data-filters-response-applied-filters-path\r\n appliedFiltersPath: 'meta.appliedFilters',\r\n },\r\n },\r\n\r\n urlState: {\r\n // Canonical key for enable flag.\r\n // data-attributes: data-url-state-enable\r\n enable: false,\r\n // Режим history обновлений.\r\n // data-атрибуты: data-url-state-mode | data-url-state-mode\r\n mode: 'replace', // replace | push\r\n include: {\r\n // data-attributes: data-urlstate-include-pagination\r\n pagination: false,\r\n // data-attributes: data-urlstate-include-sort\r\n sort: false,\r\n },\r\n listen: {\r\n // data-attributes: data-url-state-listen-popstate\r\n popstate: false,\r\n },\r\n },\r\n\r\n editable: {\r\n // Enable editable mode.\r\n // data-attributes: data-editable-enable\r\n enable: false,\r\n // Enable drag-and-drop row reorder.\r\n // data-attributes: data-row-reorder-enable\r\n rowReorder: true,\r\n // Row reorder drag mode.\r\n // data-attributes: data-row-reorder-mode\r\n rowReorderMode: 'row', // row | handle\r\n // CSS selector for explicit drag handle inside row.\r\n // data-attributes: data-row-reorder-handle-selector\r\n rowReorderHandleSelector: '[data-row-reorder-handle]',\r\n },\r\n\r\n callbacks: {\r\n // Событие инициализации.\r\n onInit: null,\r\n // Начало remote-загрузки.\r\n onBeforeLoad: null,\r\n // Успешная загрузка данных.\r\n onDataLoaded: null,\r\n // Ошибка загрузки.\r\n onError: null,\r\n // Успех HTTP-запроса (расширенный контекст sent/received).\r\n onRequestSuccess: null,\r\n // Ошибка HTTP-запроса (расширенный контекст sent/error).\r\n onRequestError: null,\r\n // Пришел устаревший ответ и был отброшен.\r\n onStaleResponse: null,\r\n // Синхронизация urlState: чтение.\r\n onUrlStateRead: null,\r\n // Синхронизация urlState: запись.\r\n onUrlStateWrite: null,\r\n // Ошибка чтения/записи urlState.\r\n onUrlStateError: null,\r\n // Пустой результат после загрузки.\r\n onEmptyResult: null,\r\n // Завершение рендера после ответа сервера.\r\n onAfterRender: null,\r\n // Синхронизация финального состояния таблицы.\r\n onStateSync: null,\r\n // Изменение сортировки.\r\n onSortChange: null,\r\n // Изменение страницы.\r\n onPageChange: null,\r\n // Изменение per-page.\r\n onPerPageChange: null,\r\n // Изменение поискового запроса.\r\n onSearch: null,\r\n // Изменение фильтров.\r\n onFiltersChange: null,\r\n // Сброс фильтров/поиска.\r\n onReset: null,\r\n // Изменение чекбокса строки в editable-режиме.\r\n onRowCheck: null,\r\n // Изменение чекбокса \"выбрать все\" в editable-режиме.\r\n onCheckAll: null,\r\n // Ручная перестановка строк в editable-режиме.\r\n onRowReorder: null,\r\n // Запуск экспорта.\r\n onExport: null,\r\n // Операции сохраненных видов.\r\n onViewChange: null,\r\n // Раскрытие строки в tree-data.\r\n onRowExpand: null,\r\n // Коллапс строки в tree-data.\r\n onRowCollapse: null,\r\n // Переключение состояния строки в tree-data.\r\n onRowToggle: null,\r\n // Перестановка колонок.\r\n onColumnReorder: null,\r\n // Изменение ширины колонки.\r\n onColumnResize: null,\r\n onColumnFixed: null,\r\n },\r\n\r\n events: {\r\n // Включить dispatch CustomEvent-событий.\r\n // data-атрибуты: data-events-enabled\r\n enable: true,\r\n // Префикс событий (например, vgdt:dataloaded).\r\n // data-атрибуты: data-events-prefix\r\n prefix: 'vgdt',\r\n // Распространять события вверх по DOM (bubbles).\r\n // data-атрибуты: data-events-bubbles\r\n bubbles: true,\r\n },\r\n\r\n persistence: {\r\n // Глобальный toggle persistence.\r\n // data-атрибуты: data-persistence-enabled\r\n enable: false,\r\n // Общий ключ storage для persistence.\r\n // data-атрибуты: data-persistence-storage-key\r\n storageKey: '',\r\n // Сохранять тему.\r\n // data-атрибуты: data-persistence-theme\r\n theme: false,\r\n // Сохранять локаль.\r\n // data-атрибуты: data-persistence-locale\r\n locale: false,\r\n // Сохранять режим применения фильтров.\r\n // data-атрибуты: data-persistence-filters-apply-mode\r\n filtersApply: false,\r\n },\r\n};\r\n\r\nexport default DEFAULT_OPTIONS;\r\n\r\n\r\n","import VGDropdown from \"../../vgdropdown\";\r\n\r\nclass Pagination {\r\n\tconstructor(el, params = {}) {\r\n\t\tif (!el || !(el instanceof Element)) {\r\n\t\t\tthrow new Error('Pagination requires a valid root element');\r\n\t\t}\r\n\r\n\t\tconst defaults = {\r\n\t\t\tmarkupSelector: '[data-vgdt-pagination], .vgdt-pagination',\r\n\t\t\tperPageOptionSuffix: 'page',\r\n\t\t\tshowPerPageLabel: false,\r\n\t\t\tperPageLabel: 'Строк на странице',\r\n\t\t\tprevLabel: 'Назад',\r\n\t\t\tnextLabel: 'Вперед',\r\n\t\t\tquickJumpButtonLabel: 'Перейти',\r\n\t\t\tcontainer: null,\r\n\t\t\tmaxPerPage: 100,\r\n\t\t};\r\n\r\n\t\tthis._root = el;\r\n\t\tthis._params = Object.assign({}, defaults, params);\r\n\r\n\t\tthis._maxPerPage = this._resolveMaxPerPage();\r\n\t\tthis._state = {\r\n\t\t\tpage: this._normalizeInt(this._params.page, 1),\r\n\t\t\tperPage: this._normalizePerPage(this._params.perPage, 10),\r\n\t\t\ttotalPages: this._normalizeInt(this._params.totalPages, 1),\r\n\t\t};\r\n\r\n\t\tthis._containers = [];\r\n\t\tthis._lastMarkupByContainer = new WeakMap();\r\n\t\tthis._boundContainerClick = this._handleContainerClick.bind(this);\r\n\t\tthis._boundContainerChange = this._handleContainerChange.bind(this);\r\n\t\tthis._boundContainerKeyDown = this._handleContainerKeyDown.bind(this);\r\n\t\tthis._boundContainerFocusIn = this._handleContainerFocusIn.bind(this);\r\n\t\tthis._boundContainerBlur = this._handleContainerBlur.bind(this);\r\n\t\tthis._dropdownInstances = new WeakMap();\r\n\t}\r\n\r\n\tinit() {\r\n\t\tthis._containers = this._resolveContainers();\r\n\t\tif (!this._containers.length) return;\r\n\t\tthis._render();\r\n\t\tthis._bindEvents();\r\n\t}\r\n\r\n\tsetMeta(meta = {}) {\r\n\t\tlet changed = false;\r\n\t\tif (meta.page !== undefined) {\r\n\t\t\tconst nextPage = this._normalizeInt(meta.page, this._state.page);\r\n\t\t\tif (nextPage !== this._state.page) {\r\n\t\t\t\tthis._state.page = nextPage;\r\n\t\t\t\tchanged = true;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (meta.perPage !== undefined) {\r\n\t\t\tconst nextPerPage = this._normalizePerPage(meta.perPage, this._state.perPage);\r\n\t\t\tif (nextPerPage !== this._state.perPage) {\r\n\t\t\t\tthis._state.perPage = nextPerPage;\r\n\t\t\t\tchanged = true;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (meta.totalPages !== undefined) {\r\n\t\t\tconst nextTotalPages = this._normalizeInt(meta.totalPages, this._state.totalPages);\r\n\t\t\tif (nextTotalPages !== this._state.totalPages) {\r\n\t\t\t\tthis._state.totalPages = nextTotalPages;\r\n\t\t\t\tchanged = true;\r\n\t\t\t}\r\n\t\t}\r\n\t\tconst clampedPage = this._clampPage(this._state.page);\r\n\t\tif (clampedPage !== this._state.page) {\r\n\t\t\tthis._state.page = clampedPage;\r\n\t\t\tchanged = true;\r\n\t\t}\r\n\t\tif (!changed) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._render();\r\n\t}\r\n\r\n\t_resolveContainers() {\r\n\t\tconst mode = this._resolveRenderMode();\r\n\t\tconst found = this._findMarkupContainers();\r\n\t\tif (mode === 'markup') return found;\r\n\t\tif (mode === 'auto' && found.length) return found;\r\n\t\treturn this._createClassContainers();\r\n\t}\r\n\r\n\t_resolveRenderMode() {\r\n\t\tconst render = (this._params.renderMode || this._params.render || 'auto').toString().toLowerCase();\r\n\t\tif (render === 'class') return 'class';\r\n\t\tif (render === 'markup') return 'markup';\r\n\t\treturn 'auto';\r\n\t}\r\n\r\n\t_findMarkupContainers() {\r\n\t\tif (this._params.container instanceof Element) {\r\n\t\t\treturn [this._params.container];\r\n\t\t}\r\n\t\tif (typeof this._params.container === 'string' && this._params.container.trim()) {\r\n\t\t\tconst scopedContainer = this._root.querySelector(this._params.container);\r\n\t\t\tif (scopedContainer) return [scopedContainer];\r\n\t\t}\r\n\r\n\t\tconst list = Array.from(this._root.querySelectorAll(this._params.markupSelector || '.vgdt-pagination'));\r\n\t\tif (!list.length) return [];\r\n\r\n\t\tconst position = (this._params.position || 'bottom').toString().toLowerCase();\r\n\t\tif (position === 'both') return list;\r\n\r\n\t\tconst preferred = list.find((item) => item.dataset.position === position);\r\n\t\treturn preferred ? [preferred] : [list[0]];\r\n\t}\r\n\r\n\t_createClassContainers() {\r\n\t\tconst position = (this._params.position || 'bottom').toString().toLowerCase();\r\n\t\tconst table = this._root.querySelector('table');\r\n\t\tconst tableHost = table ? (table.closest('.vgdt-table-viewport') || table) : null;\r\n\t\tconst containers = [];\r\n\r\n\t\tconst ensure = (pos) => {\r\n\t\t\tconst className = `vgdt-pagination vgdt-pagination--${pos}`;\r\n\t\t\tlet container = this._root.querySelector(`.vgdt-pagination--${pos}[data-pagination-generated=\"1\"]`);\r\n\t\t\tif (!container) {\r\n\t\t\t\tcontainer = document.createElement('div');\r\n\t\t\t\tcontainer.className = className;\r\n\t\t\t\tcontainer.dataset.position = pos;\r\n\t\t\t\tcontainer.dataset.paginationGenerated = '1';\r\n\t\t\t\tif (tableHost && tableHost.parentElement === this._root) {\r\n\t\t\t\t\tif (pos === 'top') {\r\n\t\t\t\t\t\tthis._root.insertBefore(container, tableHost);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tif (tableHost.nextSibling) {\r\n\t\t\t\t\t\t\tthis._root.insertBefore(container, tableHost.nextSibling);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tthis._root.appendChild(container);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis._root.appendChild(container);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcontainers.push(container);\r\n\t\t};\r\n\r\n\t\tif (position === 'top' || position === 'both') ensure('top');\r\n\t\tif (position === 'bottom' || position === 'both') ensure('bottom');\r\n\t\treturn containers;\r\n\t}\r\n\r\n\t_bindEvents() {\r\n\t\tthis._containers.forEach((container) => {\r\n\t\t\tcontainer.removeEventListener('click', this._boundContainerClick);\r\n\t\t\tcontainer.removeEventListener('change', this._boundContainerChange);\r\n\t\t\tcontainer.removeEventListener('keydown', this._boundContainerKeyDown);\r\n\t\t\tcontainer.removeEventListener('focusin', this._boundContainerFocusIn);\r\n\t\t\tcontainer.removeEventListener('focusout', this._boundContainerBlur);\r\n\t\t\tcontainer.addEventListener('click', this._boundContainerClick);\r\n\t\t\tcontainer.addEventListener('change', this._boundContainerChange);\r\n\t\t\tcontainer.addEventListener('keydown', this._boundContainerKeyDown);\r\n\t\t\tcontainer.addEventListener('focusin', this._boundContainerFocusIn);\r\n\t\t\tcontainer.addEventListener('focusout', this._boundContainerBlur);\r\n\t\t});\r\n\t}\r\n\r\n\t_handleContainerClick(event) {\r\n\t\tconst perPageOption = event.target.closest('[data-per-page-option]');\r\n\t\tif (perPageOption) {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tconst input = this._findPerPageInputFromNode(perPageOption);\r\n\t\t\tconst value = perPageOption.getAttribute('data-per-page-option') || '';\r\n\t\t\tif (input) {\r\n\t\t\t\tinput.value = this._formatPerPageDisplay(value);\r\n\t\t\t}\r\n\t\t\tthis._applyPerPage(value);\r\n\t\t\tthis._hidePerPageDropdownFromNode(perPageOption);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst perPageInput = event.target.closest('[data-per-page]');\r\n\t\tif (perPageInput) {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tevent.stopPropagation();\r\n\t\t\tconst toggle = this._findPerPageToggleFromNode(perPageInput);\r\n\t\t\tconst dropdown = this._getOrCreatePerPageDropdown(toggle);\r\n\t\t\tif (dropdown && typeof dropdown.toggle === 'function') {\r\n\t\t\t\tdropdown.toggle();\r\n\t\t\t} else if (dropdown && typeof dropdown.show === 'function') {\r\n\t\t\t\tdropdown.show();\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst jumpButton = event.target.closest('[data-page-jump]');\r\n\t\tif (jumpButton) {\r\n\t\t\tconst root = jumpButton.closest('.vgdt-pagination__jump');\r\n\t\t\tconst input = root ? root.querySelector('[data-page-jump-input]') : null;\r\n\t\t\tthis._jumpToPage(input ? input.value : '');\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst button = event.target.closest('[data-page]');\r\n\t\tif (!button) return;\r\n\r\n\t\tconst page = button.dataset.page;\r\n\t\tif (page === 'prev') {\r\n\t\t\tthis._setPage(this._state.page - 1, 'prev');\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (page === 'next') {\r\n\t\t\tthis._setPage(this._state.page + 1, 'next');\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (page === 'ellipsis-prev') {\r\n\t\t\tthis._setPage(this._getEllipsisTargetPage('prev'), 'ellipsis');\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (page === 'ellipsis-next') {\r\n\t\t\tthis._setPage(this._getEllipsisTargetPage('next'), 'ellipsis');\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._setPage(this._normalizeInt(page, this._state.page), 'page');\r\n\t}\r\n\r\n\t_handleContainerKeyDown(event) {\r\n\t\tif (event.key === 'Escape') {\r\n\t\t\tconst perPageInput = event.target.closest('[data-per-page]');\r\n\t\t\tif (perPageInput) {\r\n\t\t\t\tthis._hidePerPageDropdownFromNode(perPageInput);\r\n\t\t\t\tperPageInput.blur();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (event.key !== 'Enter') return;\r\n\r\n\t\tconst perPageInput = event.target.closest('[data-per-page]');\r\n\t\tif (perPageInput) {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tthis._applyPerPage(perPageInput.value);\r\n\t\t\tperPageInput.value = this._formatPerPageDisplay(this._state.perPage);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst input = event.target.closest('[data-page-jump-input]');\r\n\t\tif (!input) return;\r\n\r\n\t\tevent.preventDefault();\r\n\t\tthis._jumpToPage(input.value);\r\n\t}\r\n\r\n\t_handleContainerChange(event) {\r\n\t\tconst input = event.target.closest('[data-per-page]');\r\n\t\tif (input) {\r\n\t\t\tthis._applyPerPage(input.value);\r\n\t\t\tinput.value = this._formatPerPageDisplay(this._state.perPage);\r\n\t\t}\r\n\t}\r\n\r\n\t_handleContainerFocusIn(event) {\r\n\t\tconst input = event.target.closest('[data-per-page]');\r\n\t\tif (!input) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tinput.value = String(this._normalizePerPage(input.value, this._state.perPage));\r\n\t}\r\n\r\n\t_handleContainerBlur(event) {\r\n\t\tconst input = event.target.closest('[data-per-page]');\r\n\t\tif (!input) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst related = event.relatedTarget instanceof Element ? event.relatedTarget : null;\r\n\t\tconst control = input.closest('.vgdt-pagination__per-page-control');\r\n\t\tif (control && related && control.contains(related)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._applyPerPage(input.value);\r\n\t\tinput.value = this._formatPerPageDisplay(this._state.perPage);\r\n\t}\r\n\r\n\t_applyPerPage(value) {\r\n\t\tconst perPage = this._normalizePerPage(value, this._state.perPage);\r\n\t\tconst perPageChanged = perPage !== this._state.perPage;\r\n\t\tconst pageChanged = this._state.page !== 1;\r\n\t\tif (!perPageChanged && !pageChanged) return;\r\n\r\n\t\tthis._state.perPage = perPage;\r\n\t\tthis._state.page = 1;\r\n\t\tthis._render();\r\n\t\tthis._emitChange(perPageChanged, 'per-page');\r\n\t}\r\n\r\n\t_setPage(page, source = 'page') {\r\n\t\tconst normalized = this._clampPage(page);\r\n\t\tif (normalized === this._state.page) return;\r\n\t\tthis._state.page = normalized;\r\n\t\tthis._render();\r\n\t\tthis._emitChange(false, source);\r\n\t}\r\n\r\n\t_emitChange(perPageChanged, source = 'page') {\r\n\t\tconst payload = {\r\n\t\t\tpage: this._state.page,\r\n\t\t\tperPage: this._state.perPage,\r\n\t\t\ttotalPages: this._state.totalPages,\r\n\t\t\tperPageChanged: Boolean(perPageChanged),\r\n\t\t\tsource,\r\n\t\t};\r\n\r\n\t\tconst onChange = this._params.onChange;\r\n\t\tif (typeof onChange === 'function') {\r\n\t\t\tonChange(payload);\r\n\t\t}\r\n\t\tconst onPerPageChange = this._params.onPerPageChange;\r\n\t\tif (perPageChanged && typeof onPerPageChange === 'function') {\r\n\t\t\tonPerPageChange(payload);\r\n\t\t}\r\n\r\n\t\tthis._root.dispatchEvent(new CustomEvent('vgdt:pagination:change', {\r\n\t\t\tbubbles: true,\r\n\t\t\tdetail: payload,\r\n\t\t}));\r\n\t}\r\n\r\n\t_render() {\r\n\t\tconst pages = this._buildPages();\r\n\t\tconst markup = this._buildMarkup(pages);\r\n\t\tthis._containers.forEach((container) => {\r\n\t\t\tconst lastMarkup = this._lastMarkupByContainer.get(container) || '';\r\n\t\t\tif (lastMarkup === markup) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tcontainer.innerHTML = markup;\r\n\t\t\tthis._lastMarkupByContainer.set(container, markup);\r\n\t\t\tthis._initPerPageDropdown(container);\r\n\t\t});\r\n\t}\r\n\r\n\t_buildMarkup(pages) {\r\n\t\tconst align = this._resolveAlign();\r\n\t\tconst alignStyle = this._resolveAlignStyle(align);\r\n\t\tconst prevDisabled = this._state.page <= 1 ? 'disabled' : '';\r\n\t\tconst nextDisabled = this._state.page >= this._state.totalPages ? 'disabled' : '';\r\n\t\tconst showPerPage = this._params.showPerPage;\r\n\t\tconst perPageHtml = showPerPage ? this._buildPerPageMarkup() : '';\r\n\t\tconst quickJumpHtml = this._shouldShowQuickJump()\r\n\t\t\t? this._buildQuickJumpMarkup()\r\n\t\t\t: '';\r\n\r\n\t\treturn `\r\n\t\t\t<div class=\"vgdt-pagination__inner vgdt-pagination__inner--${align}\" style=\"display:flex;align-items:center;justify-content:${alignStyle};gap:12px;flex-wrap:wrap;\">\r\n\t\t\t\t${perPageHtml}\r\n\t\t\t\t<nav class=\"vgdt-pagination__pages\" aria-label=\"Pagination\">\r\n\t\t\t\t\t<button type=\"button\" class=\"vgdt-page vgdt-page--prev\" data-page=\"prev\" ${prevDisabled}>${this._params.prevLabel}</button>\r\n\t\t\t\t\t${pages.map((item) => this._buildPageItem(item)).join('')}\r\n\t\t\t\t\t<button type=\"button\" class=\"vgdt-page vgdt-page--next\" data-page=\"next\" ${nextDisabled}>${this._params.nextLabel}</button>\r\n\t\t\t\t</nav>\r\n\t\t\t\t${quickJumpHtml}\r\n\t\t\t</div>\r\n\t\t`;\r\n\t}\r\n\r\n\t_buildPerPageMarkup() {\r\n\t\tconst options = this._normalizePerPageOptions();\r\n\t\tconst showLabel = this._isPerPageLabelVisible();\r\n\t\tconst perPageLabelMarkup = showLabel ? `<span>${this._params.perPageLabel}</span>` : '';\r\n\t\treturn `\r\n\t\t\t<label class=\"vgdt-pagination__per-page\">\r\n\t\t\t\t${perPageLabelMarkup}\r\n\t\t\t\t<div class=\"vgdt-pagination__per-page-control vg-dropdown\">\r\n\t\t\t\t\t<input\r\n\t\t\t\t\t\ttype=\"text\"\r\n\t\t\t\t\t\tmin=\"1\"\r\n\t\t\t\t\t\tmax=\"${this._maxPerPage}\"\r\n\t\t\t\t\t\tstep=\"1\"\r\n\t\t\t\t\t\tinputmode=\"numeric\"\r\n\t\t\t\t\t\tdata-per-page\r\n\t\t\t\t\t\tdata-toggle=\"dropdown\"\r\n\t\t\t\t\t\tvalue=\"${this._formatPerPageDisplay(this._state.perPage)}\"\r\n\t\t\t\t\t\taria-label=\"${this._params.perPageLabel}\"\r\n\t\t\t\t\t\taria-haspopup=\"true\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t<span class=\"vgdt-pagination__per-page-chevron\" aria-hidden=\"true\">\r\n\t\t\t\t\t\t<svg viewBox=\"0 0 20 20\" focusable=\"false\" aria-hidden=\"true\">\r\n\t\t\t\t\t\t\t<path d=\"M5 7.5L10 12.5L15 7.5\" />\r\n\t\t\t\t\t\t</svg>\r\n\t\t\t\t\t</span>\r\n\t\t\t\t\t<div class=\"vg-dropdown-content vgdt-pagination__per-page-dropdown\">\r\n\t\t\t\t\t\t<div class=\"vg-dropdown-container\">\r\n\t\t\t\t\t\t\t${options.map((value) => {\r\n\t\t\t\t\t\t\t\treturn `<button type=\"button\" class=\"vgdt-pagination__per-page-option\" data-per-page-option=\"${value}\">${this._formatPerPageDisplay(value)}</button>`;\r\n\t\t\t\t\t\t\t}).join('')}\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</label>\r\n\t\t`;\r\n\t}\r\n\r\n\t_isPerPageLabelVisible() {\r\n\t\tconst table = this._root ? this._root.querySelector('table') : null;\r\n\t\tconst attr = table\r\n\t\t\t? table.getAttribute('data-pagination-show-per-page-label')\r\n\t\t\t: null;\r\n\t\tif (attr !== null) {\r\n\t\t\tconst normalized = String(attr).toLowerCase().trim();\r\n\t\t\treturn normalized !== 'false' && normalized !== '0';\r\n\t\t}\r\n\r\n\t\treturn Boolean(this._params.showPerPageLabel);\r\n\t}\r\n\r\n\t_buildPageItem(item) {\r\n\t\tif (item && typeof item === 'object' && item.type === 'ellipsis') {\r\n\t\t\tconst isPrev = item.direction === 'prev';\r\n\t\t\tconst pageAction = isPrev ? 'ellipsis-prev' : 'ellipsis-next';\r\n\t\t\tconst chevron = isPrev ? '«' : '»';\r\n\t\t\tconst targetPage = this._getEllipsisTargetPage(item.direction);\r\n\t\t\tconst jumpStep = Math.abs(targetPage - this._state.page);\r\n\t\t\tconst label = isPrev\r\n\t\t\t\t? `Go back ${jumpStep} page${jumpStep > 1 ? 's' : ''}`\r\n\t\t\t\t: `Go forward ${jumpStep} page${jumpStep > 1 ? 's' : ''}`;\r\n\t\t\treturn `<button type=\"button\" class=\"vgdt-page vgdt-page--ellipsis\" data-page=\"${pageAction}\" aria-label=\"${label}\"><span class=\"vgdt-ellipsis-dots\" aria-hidden=\"true\">...</span><span class=\"vgdt-ellipsis-chevron\" aria-hidden=\"true\">${chevron}</span></button>`;\r\n\t\t}\r\n\t\tconst active = item === this._state.page ? 'is-active' : '';\r\n\t\treturn `<button type=\"button\" class=\"vgdt-page ${active}\" data-page=\"${item}\" aria-current=\"${active ? 'page' : 'false'}\">${item}</button>`;\r\n\t}\r\n\r\n\t_buildQuickJumpMarkup() {\r\n\t\treturn `\r\n\t\t\t<div class=\"vgdt-pagination__jump\">\r\n\t\t\t\t<input\r\n\t\t\t\t\ttype=\"number\"\r\n\t\t\t\t\tmin=\"1\"\r\n\t\t\t\t\tmax=\"${this._state.totalPages}\"\r\n\t\t\t\t\tstep=\"1\"\r\n\t\t\t\t\tinputmode=\"numeric\"\r\n\t\t\t\t\tdata-page-jump-input\r\n\t\t\t\t\tvalue=\"${this._state.page}\"\r\n\t\t\t\t>\r\n\t\t\t\t<button type=\"button\" class=\"vgdt-page vgdt-page--jump\" data-page-jump>${this._params.quickJumpButtonLabel || 'Go'}</button>\r\n\t\t\t</div>\r\n\t\t`;\r\n\t}\r\n\r\n\t_buildPages() {\r\n\t\tconst total = this._state.totalPages;\r\n\t\tconst current = this._clampPage(this._state.page);\r\n\t\tconst maxVisible = Math.max(1, this._normalizeInt(this._params.maxVisiblePages, 5));\r\n\t\tconst shouldEllipsis = Boolean(this._params.ellipsis) && total > this._normalizeInt(this._params.ellipsisAfter, 5);\r\n\r\n\t\tif (!shouldEllipsis || total <= maxVisible + 2) {\r\n\t\t\treturn this._range(1, total);\r\n\t\t}\r\n\r\n\t\tconst middleSlots = maxVisible;\r\n\t\tlet start = Math.max(2, current - Math.floor(middleSlots / 2));\r\n\t\tlet end = Math.min(total - 1, start + middleSlots - 1);\r\n\r\n\t\tstart = Math.max(2, end - middleSlots + 1);\r\n\r\n\t\tconst pages = [1];\r\n\t\tif (start > 2) pages.push({ type: 'ellipsis', direction: 'prev' });\r\n\t\tfor (let page = start; page <= end; page += 1) {\r\n\t\t\tpages.push(page);\r\n\t\t}\r\n\t\tif (end < total - 1) pages.push({ type: 'ellipsis', direction: 'next' });\r\n\t\tpages.push(total);\r\n\t\treturn pages;\r\n\t}\r\n\r\n\t_findPerPageInputFromNode(node) {\r\n\t\tconst root = node ? node.closest('.vgdt-pagination__per-page-control') : null;\r\n\t\treturn root ? root.querySelector('[data-per-page]') : null;\r\n\t}\r\n\r\n\t_findPerPageToggleFromNode(node) {\r\n\t\tconst root = node ? node.closest('.vgdt-pagination__per-page-control') : null;\r\n\t\treturn root ? root.querySelector('[data-per-page][data-toggle=\"dropdown\"]') : null;\r\n\t}\r\n\r\n\t_getOrCreatePerPageDropdown(toggle) {\r\n\t\tif (!toggle) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tlet instance = this._dropdownInstances.get(toggle);\r\n\t\tif (instance) {\r\n\t\t\treturn instance;\r\n\t\t}\r\n\t\tinstance = VGDropdown.getOrCreateInstance(toggle, {\r\n\t\t\tplacement: 'auto',\r\n\t\t\thover: false,\r\n\t\t\tanimation: {\r\n\t\t\t\tfade: true,\r\n\t\t\t\tenable: false,\r\n\t\t\t\tdelay: 120,\r\n\t\t\t},\r\n\t\t});\r\n\t\tthis._dropdownInstances.set(toggle, instance);\r\n\t\treturn instance;\r\n\t}\r\n\r\n\t_initPerPageDropdown(container) {\r\n\t\tconst toggle = container.querySelector('.vgdt-pagination__per-page-control [data-toggle=\"dropdown\"]');\r\n\t\tif (!toggle) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._getOrCreatePerPageDropdown(toggle);\r\n\t}\r\n\r\n\t_hidePerPageDropdownFromNode(node) {\r\n\t\tconst toggle = this._findPerPageToggleFromNode(node);\r\n\t\tif (!toggle) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst dropdown = this._dropdownInstances.get(toggle);\r\n\t\tif (dropdown && typeof dropdown.hide === 'function') {\r\n\t\t\tdropdown.hide();\r\n\t\t}\r\n\t}\r\n\r\n\t_shouldShowQuickJump() {\r\n\t\tif (this._state.totalPages <= 1) return false;\r\n\r\n\t\tconst mode = this._params.quickJump;\r\n\t\tif (mode === true || mode === 'true') return true;\r\n\t\tif (mode === false || mode === 'false') return false;\r\n\r\n\t\tconst threshold = this._normalizeInt(this._params.ellipsisAfter, 5);\r\n\t\treturn this._state.totalPages > threshold;\r\n\t}\r\n\r\n\t_resolveAlign() {\r\n\t\tconst value = (this._params.align || 'left').toString().toLowerCase();\r\n\t\tif (value === 'center' || value === 'right' || value === 'between') return value;\r\n\t\treturn 'left';\r\n\t}\r\n\r\n\t_resolveAlignStyle(align) {\r\n\t\tif (align === 'center') return 'center';\r\n\t\tif (align === 'right') return 'flex-end';\r\n\t\tif (align === 'between') return 'space-between';\r\n\t\treturn 'flex-start';\r\n\t}\r\n\r\n\t_normalizePerPageOptions() {\r\n\t\tconst list = this._params.perPageOptions;\r\n\t\tconst options = Array.isArray(list) ? list : [10, 25, 50, 100];\r\n\t\tconst normalized = options\r\n\t\t\t.map((item) => this._normalizeInt(item, 0))\r\n\t\t\t.filter((item) => item > 0 && item <= this._maxPerPage);\r\n\t\tif (!normalized.length) return [this._state.perPage];\r\n\t\tif (!normalized.includes(this._state.perPage)) normalized.push(this._state.perPage);\r\n\t\treturn Array.from(new Set(normalized)).sort((a, b) => a - b);\r\n\t}\r\n\r\n\t_resolveMaxPerPage() {\r\n\t\tconst raw = this._params.maxPerPage;\r\n\t\treturn this._normalizeInt(raw, 100);\r\n\t}\r\n\r\n\t_normalizePerPage(value, fallback) {\r\n\t\tconst normalized = this._normalizeInt(value, fallback);\r\n\t\treturn Math.min(normalized, this._maxPerPage);\r\n\t}\r\n\r\n\t_getPerPageOptionSuffix() {\r\n\t\tconst rawSuffix = this._params.perPageOptionSuffix;\r\n\t\tconst normalized = String(rawSuffix || '').trim();\r\n\t\tif (normalized) {\r\n\t\t\treturn normalized;\r\n\t\t}\r\n\t\tconst label = String(this._params.perPageLabel || '').toLowerCase();\r\n\t\treturn /[а-яё]/i.test(label) ? 'на страницу' : 'page';\r\n\t}\r\n\r\n\t_formatPerPageDisplay(value) {\r\n\t\tconst normalizedValue = this._normalizeInt(value, this._state.perPage);\r\n\t\treturn `${normalizedValue} / ${this._getPerPageOptionSuffix()}`;\r\n\t}\r\n\r\n\t_clampPage(page) {\r\n\t\tconst normalized = this._normalizeInt(page, 1);\r\n\t\treturn Math.max(1, Math.min(normalized, this._state.totalPages));\r\n\t}\r\n\r\n\t_normalizeInt(value, fallback) {\r\n\t\tconst parsed = Number.parseInt(value, 10);\r\n\t\treturn Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;\r\n\t}\r\n\r\n\t_jumpToPage(value) {\r\n\t\tconst page = this._normalizeInt(value, this._state.page);\r\n\t\tthis._setPage(page, 'jump');\r\n\t}\r\n\r\n\t_getEllipsisTargetPage(direction) {\r\n\t\tconst pages = this._buildPages();\r\n\t\tconst visibleNumericPages = pages.filter((item) => Number.isInteger(item) && item > 1 && item < this._state.totalPages);\r\n\t\tif (!visibleNumericPages.length) {\r\n\t\t\treturn direction === 'prev' ? 1 : this._state.totalPages;\r\n\t\t}\r\n\t\tconst firstVisible = visibleNumericPages[0];\r\n\t\tconst lastVisible = visibleNumericPages[visibleNumericPages.length - 1];\r\n\t\tif (direction === 'prev') {\r\n\t\t\treturn this._clampPage(firstVisible - 1);\r\n\t\t}\r\n\t\treturn this._clampPage(lastVisible + 1);\r\n\t}\r\n\r\n\t_range(start, end) {\r\n\t\tconst result = [];\r\n\t\tfor (let value = start; value <= end; value += 1) {\r\n\t\t\tresult.push(value);\r\n\t\t}\r\n\t\treturn result;\r\n\t}\r\n}\r\n\r\nexport default Pagination\r\n\r\n","class Sortable {\r\n constructor(table, options = {}) {\r\n this._table = table;\r\n this._options = Object.assign({\r\n initialField: '',\r\n initialDir: 'asc',\r\n directions: ['asc', 'desc'],\r\n ascLabel: 'Сортировка по возрастанию',\r\n descLabel: 'Сортировка по убыванию',\r\n isColumnSortable: null,\r\n onChange: null,\r\n multiSort: false,\r\n multiSortWithShift: true,\r\n hideUnsortedArrows: false,\r\n }, options);\r\n\r\n this._headers = [];\r\n this._sorts = [];\r\n this._headerControls = new WeakMap();\r\n this._boundClick = this._handleClick.bind(this);\r\n this._boundKeyDown = this._handleKeyDown.bind(this);\r\n }\r\n\r\n init() {\r\n this._headers = this._getHeaders();\r\n if (!this._headers.length) {\r\n return;\r\n }\r\n this._syncControlsVisibilityMode();\r\n\r\n this._headers.forEach((header, index) => {\r\n if (!this._isSortable(header, index)) {\r\n header.setAttribute('aria-sort', 'none');\r\n return;\r\n }\r\n\r\n header.dataset.sortable = '1';\r\n header.tabIndex = 0;\r\n header.setAttribute('role', 'button');\r\n header.setAttribute('aria-sort', 'none');\r\n this._decorateHeader(header);\r\n });\r\n\r\n this._table.addEventListener('click', this._boundClick);\r\n this._table.addEventListener('keydown', this._boundKeyDown);\r\n this._applyInitialState();\r\n }\r\n\r\n setState(payload = {}) {\r\n if (Array.isArray(payload.sorts)) {\r\n const normalized = this._normalizeSorts(payload.sorts);\r\n this._setSorts(normalized, false);\r\n return;\r\n }\r\n\r\n const index = this._resolveIndex(payload);\r\n if (index < 0) {\r\n this._setSorts([], false);\r\n return;\r\n }\r\n if (!this._isSortable(this._headers[index], index)) {\r\n return;\r\n }\r\n this._setSorts([{ index, dir: this._normalizeDir(payload.dir) }], false);\r\n }\r\n\r\n refresh(payload = {}) {\r\n this._headers = this._getHeaders();\r\n if (!this._headers.length) {\r\n return;\r\n }\r\n this._syncControlsVisibilityMode();\r\n\r\n this._headers.forEach((header, index) => {\r\n if (!this._isSortable(header, index)) {\r\n header.removeAttribute('data-sortable');\r\n header.removeAttribute('data-sort-direction');\r\n header.removeAttribute('data-sort-priority');\r\n header.setAttribute('aria-sort', 'none');\r\n return;\r\n }\r\n\r\n header.dataset.sortable = '1';\r\n header.tabIndex = 0;\r\n header.setAttribute('role', 'button');\r\n if (!header.hasAttribute('aria-sort')) {\r\n header.setAttribute('aria-sort', 'none');\r\n }\r\n this._decorateHeader(header);\r\n });\r\n\r\n if (Array.isArray(payload.sorts)) {\r\n this._setSorts(this._normalizeSorts(payload.sorts), false);\r\n return;\r\n }\r\n\r\n this._setSorts(this._normalizeSorts(this._sorts), false);\r\n }\r\n\r\n _applyInitialState() {\r\n const index = this._resolveIndex({\r\n field: this._options.initialField,\r\n columnIndex: -1,\r\n });\r\n if (index < 0 || !this._isSortable(this._headers[index], index)) {\r\n this._setSorts([], false);\r\n return;\r\n }\r\n this._setSorts([{ index, dir: this._normalizeDir(this._options.initialDir) }], false);\r\n }\r\n\r\n _getHeaders() {\r\n const head = this._table.tHead || this._table.querySelector('thead');\r\n if (!head || !head.rows.length) {\r\n return [];\r\n }\r\n return Array.from(head.rows[0].cells);\r\n }\r\n\r\n _isSortable(header, index) {\r\n if (typeof this._options.isColumnSortable === 'function') {\r\n return Boolean(this._options.isColumnSortable(header, index));\r\n }\r\n return true;\r\n }\r\n\r\n _handleClick(event) {\r\n const header = event.target.closest('th');\r\n if (!header || !this._table.contains(header)) {\r\n return;\r\n }\r\n\r\n const index = this._headers.indexOf(header);\r\n if (index < 0 || !this._isSortable(header, index)) {\r\n return;\r\n }\r\n\r\n const arrow = event.target.closest('[data-sort-arrow]');\r\n const multiMode = this._isMultiMode(event);\r\n if (arrow && header.contains(arrow)) {\r\n const dir = this._normalizeDir(arrow.getAttribute('data-sort-arrow'));\r\n this._applyColumnDirection(index, dir, multiMode, true);\r\n return;\r\n }\r\n\r\n this._cycleColumn(index, multiMode);\r\n }\r\n\r\n _handleKeyDown(event) {\r\n if (event.key !== 'Enter' && event.key !== ' ') {\r\n return;\r\n }\r\n\r\n const header = event.target.closest('th');\r\n if (!header || !this._table.contains(header)) {\r\n return;\r\n }\r\n\r\n const index = this._headers.indexOf(header);\r\n if (index < 0 || !this._isSortable(header, index)) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n this._cycleColumn(index, this._isMultiMode(event));\r\n }\r\n\r\n _isMultiMode(event) {\r\n if (!this._options.multiSort) {\r\n return false;\r\n }\r\n if (!this._options.multiSortWithShift) {\r\n return true;\r\n }\r\n return Boolean(event && event.shiftKey);\r\n }\r\n\r\n _cycleColumn(index, multiMode) {\r\n const current = this._sorts.find((item) => item.index === index) || null;\r\n const directions = this._getDirections();\r\n const firstDir = directions[0];\r\n const secondDir = directions[1] || firstDir;\r\n\r\n if (!current) {\r\n this._applyColumnDirection(index, firstDir, multiMode, true);\r\n return;\r\n }\r\n if (current.dir === firstDir) {\r\n this._applyColumnDirection(index, secondDir, multiMode, true);\r\n return;\r\n }\r\n this._removeColumnDirection(index, multiMode, true);\r\n }\r\n\r\n _applyColumnDirection(index, dir, multiMode, emit) {\r\n let next = this._sorts.slice();\r\n next = next.filter((item) => item.index !== index);\r\n if (!multiMode) {\r\n next = [];\r\n }\r\n next.push({ index, dir: this._normalizeDir(dir) });\r\n this._setSorts(next, emit);\r\n }\r\n\r\n _removeColumnDirection(index, multiMode, emit) {\r\n let next = this._sorts.slice();\r\n next = next.filter((item) => item.index !== index);\r\n if (!multiMode) {\r\n next = [];\r\n }\r\n this._setSorts(next, emit);\r\n }\r\n\r\n _setSorts(nextSorts, emit) {\r\n this._sorts = this._normalizeSorts(nextSorts);\r\n const sortByIndex = new Map();\r\n this._sorts.forEach((item, index) => {\r\n sortByIndex.set(item.index, {\r\n dir: item.dir,\r\n priority: index + 1,\r\n });\r\n });\r\n\r\n this._headers.forEach((header, headerIndex) => {\r\n const sort = sortByIndex.has(headerIndex) ? sortByIndex.get(headerIndex) : null;\r\n if (!this._isSortable(header, headerIndex)) {\r\n header.removeAttribute('data-sort-direction');\r\n header.removeAttribute('data-sort-priority');\r\n header.setAttribute('aria-sort', 'none');\r\n return;\r\n }\r\n\r\n const controls = this._getHeaderControls(header);\r\n const controlsNode = controls.controlsNode;\r\n const ascButton = controls.ascButton;\r\n const descButton = controls.descButton;\r\n const shouldHideControls = Boolean(this._options.hideUnsortedArrows && !sort);\r\n\r\n if (controlsNode) {\r\n controlsNode.hidden = shouldHideControls;\r\n }\r\n\r\n if (sort) {\r\n header.dataset.sortDirection = sort.dir;\r\n header.dataset.sortPriority = String(sort.priority);\r\n header.setAttribute('aria-sort', sort.dir === 'asc' ? 'ascending' : 'descending');\r\n if (ascButton) ascButton.setAttribute('aria-pressed', sort.dir === 'asc' ? 'true' : 'false');\r\n if (descButton) descButton.setAttribute('aria-pressed', sort.dir === 'desc' ? 'true' : 'false');\r\n } else {\r\n header.removeAttribute('data-sort-direction');\r\n header.removeAttribute('data-sort-priority');\r\n header.setAttribute('aria-sort', 'none');\r\n if (ascButton) ascButton.setAttribute('aria-pressed', 'false');\r\n if (descButton) descButton.setAttribute('aria-pressed', 'false');\r\n }\r\n });\r\n this._syncSortedColumnsHighlight();\r\n\r\n if (!emit || typeof this._options.onChange !== 'function') {\r\n return;\r\n }\r\n\r\n const first = this._sorts[0] || null;\r\n this._options.onChange({\r\n field: first ? this._getFieldByIndex(first.index) : '',\r\n dir: first ? first.dir : this._normalizeDir(this._options.initialDir),\r\n columnIndex: first ? first.index : -1,\r\n sorts: this._sorts.map((item) => ({\r\n field: this._getFieldByIndex(item.index),\r\n dir: item.dir,\r\n columnIndex: item.index,\r\n })),\r\n });\r\n }\r\n\r\n _normalizeSorts(items) {\r\n const unique = [];\r\n const seen = new Set();\r\n (Array.isArray(items) ? items : []).forEach((item) => {\r\n const index = Number.parseInt(item.index ?? item.columnIndex, 10);\r\n if (!Number.isInteger(index) || index < 0 || index >= this._headers.length) {\r\n return;\r\n }\r\n if (!this._isSortable(this._headers[index], index)) {\r\n return;\r\n }\r\n if (seen.has(index)) {\r\n return;\r\n }\r\n seen.add(index);\r\n unique.push({\r\n index,\r\n dir: this._normalizeDir(item.dir),\r\n });\r\n });\r\n return unique;\r\n }\r\n\r\n _syncSortedColumnsHighlight() {\r\n const rows = this._getAllRows();\r\n if (!rows.length) {\r\n return;\r\n }\r\n\r\n rows.forEach((row) => {\r\n Array.from(row.cells || []).forEach((cell) => {\r\n cell.removeAttribute('data-sorted-column');\r\n cell.removeAttribute('data-sorted-priority');\r\n });\r\n });\r\n\r\n this._sorts.forEach((sort, index) => {\r\n rows.forEach((row) => {\r\n const cell = row.cells && row.cells[sort.index] ? row.cells[sort.index] : null;\r\n if (!cell) {\r\n return;\r\n }\r\n cell.setAttribute('data-sorted-column', '1');\r\n cell.setAttribute('data-sorted-priority', String(index + 1));\r\n });\r\n });\r\n }\r\n\r\n _getAllRows() {\r\n const rows = [];\r\n const sections = ['tHead', 'tBodies', 'tFoot'];\r\n\r\n sections.forEach((section) => {\r\n const value = this._table[section];\r\n if (!value) {\r\n return;\r\n }\r\n if (section === 'tBodies') {\r\n Array.from(value).forEach((body) => {\r\n rows.push(...Array.from(body.rows || []));\r\n });\r\n return;\r\n }\r\n rows.push(...Array.from(value.rows || []));\r\n });\r\n\r\n return rows;\r\n }\r\n\r\n _decorateHeader(header) {\r\n if (header.querySelector('.vgdt-sort-controls')) {\r\n this._headerControls.delete(header);\r\n return;\r\n }\r\n\r\n const label = document.createElement('span');\r\n label.className = 'vgdt-sort-label';\r\n while (header.firstChild) {\r\n label.appendChild(header.firstChild);\r\n }\r\n\r\n const controls = document.createElement('span');\r\n controls.className = 'vgdt-sort-controls';\r\n controls.innerHTML = `\r\n <button type=\"button\" class=\"vgdt-sort-arrow vgdt-sort-arrow--asc\" data-sort-arrow=\"asc\" aria-label=\"${this._escapeAttr(this._options.ascLabel)}\" aria-pressed=\"false\">▲</button>\r\n <button type=\"button\" class=\"vgdt-sort-arrow vgdt-sort-arrow--desc\" data-sort-arrow=\"desc\" aria-label=\"${this._escapeAttr(this._options.descLabel)}\" aria-pressed=\"false\">▼</button>\r\n `;\r\n\r\n label.appendChild(controls);\r\n header.appendChild(label);\r\n this._headerControls.delete(header);\r\n }\r\n\r\n _getHeaderControls(header) {\r\n if (this._headerControls.has(header)) {\r\n return this._headerControls.get(header);\r\n }\r\n const controls = {\r\n controlsNode: header.querySelector('.vgdt-sort-controls'),\r\n ascButton: header.querySelector('[data-sort-arrow=\"asc\"]'),\r\n descButton: header.querySelector('[data-sort-arrow=\"desc\"]'),\r\n };\r\n this._headerControls.set(header, controls);\r\n return controls;\r\n }\r\n\r\n _getFieldByIndex(index) {\r\n const header = this._headers[index];\r\n if (!header) {\r\n return '';\r\n }\r\n return (header.getAttribute('data-field') || '').trim();\r\n }\r\n\r\n _resolveIndex(payload = {}) {\r\n const field = (payload.field || '').toString().trim();\r\n if (field) {\r\n const byField = this._headers.findIndex((header) => {\r\n return (header.getAttribute('data-field') || '').trim() === field;\r\n });\r\n if (byField >= 0) {\r\n return byField;\r\n }\r\n }\r\n\r\n const byIndex = Number.parseInt(payload.columnIndex, 10);\r\n if (Number.isInteger(byIndex) && byIndex >= 0 && byIndex < this._headers.length) {\r\n return byIndex;\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n _normalizeDir(dir) {\r\n const normalized = String(dir).toLowerCase();\r\n const directions = this._getDirections();\r\n return directions.includes(normalized) ? normalized : directions[0];\r\n }\r\n\r\n _getDirections() {\r\n const list = Array.isArray(this._options.directions) ? this._options.directions : ['asc', 'desc'];\r\n const normalized = list\r\n .map((item) => String(item).toLowerCase().trim())\r\n .filter((item) => item === 'asc' || item === 'desc');\r\n return normalized.length ? Array.from(new Set(normalized)) : ['asc', 'desc'];\r\n }\r\n\r\n _syncControlsVisibilityMode() {\r\n if (this._options.hideUnsortedArrows) {\r\n this._table.setAttribute('data-sort-hide-unsorted-arrows', '1');\r\n return;\r\n }\r\n this._table.removeAttribute('data-sort-hide-unsorted-arrows');\r\n }\r\n\r\n _escapeAttr(value) {\r\n return String(value)\r\n .replace(/&/g, '&')\r\n .replace(/\"/g, '"')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>');\r\n }\r\n}\r\n\r\nexport default Sortable;\r\n\r\n\r\n","class Expandable {\r\n constructor(table, params = {}) {\r\n this._table = table;\r\n this._params = params && typeof params === 'object' ? params : {};\r\n this._collapsed = new Set();\r\n this._boundClick = this._handleClick.bind(this);\r\n this._initialized = false;\r\n }\r\n\r\n init() {\r\n if (!this._isEnabled() || this._initialized) {\r\n return;\r\n }\r\n this._table.addEventListener('click', this._boundClick);\r\n this._initialized = true;\r\n this.refresh();\r\n }\r\n\r\n destroy() {\r\n if (!this._initialized) {\r\n return;\r\n }\r\n this._table.removeEventListener('click', this._boundClick);\r\n this._initialized = false;\r\n }\r\n\r\n refresh() {\r\n if (!this._isEnabled()) {\r\n return;\r\n }\r\n\r\n const rows = this._getRows();\r\n if (!rows.length) {\r\n return;\r\n }\r\n\r\n this._resetExpandHidden(rows);\r\n this._rememberBaseVisibility(rows);\r\n\r\n const idAttr = this._getIdAttr();\r\n const parentAttr = this._getParentAttr();\r\n const rowById = new Map();\r\n const parentById = new Map();\r\n const childrenByParent = new Map();\r\n\r\n rows.forEach((row, index) => {\r\n const fallbackId = `row-${index + 1}`;\r\n const rowId = String(row.getAttribute(idAttr) || fallbackId).trim() || fallbackId;\r\n row.setAttribute(idAttr, rowId);\r\n rowById.set(rowId, row);\r\n\r\n const parentId = String(row.getAttribute(parentAttr) || '').trim();\r\n parentById.set(rowId, parentId);\r\n if (parentId) {\r\n if (!childrenByParent.has(parentId)) {\r\n childrenByParent.set(parentId, []);\r\n }\r\n childrenByParent.get(parentId).push(rowId);\r\n }\r\n });\r\n\r\n const depthCache = new Map();\r\n const getDepth = (rowId) => {\r\n if (depthCache.has(rowId)) {\r\n return depthCache.get(rowId);\r\n }\r\n const parentId = String(parentById.get(rowId) || '').trim();\r\n if (!parentId) {\r\n depthCache.set(rowId, 0);\r\n return 0;\r\n }\r\n if (!rowById.has(parentId) || parentId === rowId) {\r\n depthCache.set(rowId, 0);\r\n return 0;\r\n }\r\n const depth = Math.max(0, getDepth(parentId) + 1);\r\n depthCache.set(rowId, depth);\r\n return depth;\r\n };\r\n\r\n const isAncestorCollapsed = (rowId) => {\r\n let parentId = String(parentById.get(rowId) || '').trim();\r\n while (parentId) {\r\n if (this._collapsed.has(parentId)) {\r\n return true;\r\n }\r\n parentId = String(parentById.get(parentId) || '').trim();\r\n }\r\n return false;\r\n };\r\n\r\n rowById.forEach((row, rowId) => {\r\n const depth = getDepth(rowId);\r\n row.setAttribute('data-expand-depth', String(depth));\r\n row.style.setProperty('--vgdt-expand-depth', String(depth));\r\n\r\n const hasChildren = childrenByParent.has(rowId) && childrenByParent.get(rowId).length > 0;\r\n const seeded = row.getAttribute('data-expand-seeded') === '1';\r\n if (hasChildren && !seeded) {\r\n if (this._isInitiallyCollapsed(row)) {\r\n this._collapsed.add(rowId);\r\n }\r\n row.setAttribute('data-expand-seeded', '1');\r\n }\r\n this._syncToggleNode(row, rowId, hasChildren);\r\n\r\n const baseHidden = row.getAttribute('data-expand-base-hidden') === '1';\r\n const collapseHidden = isAncestorCollapsed(rowId);\r\n const nextHidden = baseHidden || collapseHidden;\r\n row.hidden = nextHidden;\r\n if (collapseHidden) {\r\n row.setAttribute('data-expand-hidden', '1');\r\n } else {\r\n row.removeAttribute('data-expand-hidden');\r\n }\r\n });\r\n }\r\n\r\n _handleClick(event) {\r\n const toggleSelector = this._getToggleSelector();\r\n const rawTarget = event.target || null;\r\n const target = rawTarget && rawTarget.nodeType === 3 ? rawTarget.parentElement : rawTarget;\r\n const toggle = target && target.closest ? target.closest(toggleSelector) : null;\r\n if (!toggle || !this._table.contains(toggle)) {\r\n return;\r\n }\r\n event.preventDefault();\r\n\r\n const row = toggle.closest('tr');\r\n if (!row) {\r\n return;\r\n }\r\n const rowId = String(row.getAttribute(this._getIdAttr()) || '').trim();\r\n if (!rowId) {\r\n return;\r\n }\r\n\r\n const collapsed = !this._collapsed.has(rowId);\r\n if (collapsed) {\r\n this._collapsed.add(rowId);\r\n } else {\r\n this._collapsed.delete(rowId);\r\n }\r\n this.refresh();\r\n\r\n const payload = {\r\n id: rowId,\r\n collapsed,\r\n row,\r\n };\r\n if (typeof this._params.onToggle === 'function') {\r\n this._params.onToggle(payload);\r\n }\r\n }\r\n\r\n _syncToggleNode(row, rowId, hasChildren) {\r\n const selector = this._getToggleSelector();\r\n let toggle = row.querySelector(selector);\r\n if (!toggle && hasChildren) {\r\n const firstCell = row.cells && row.cells[0] ? row.cells[0] : null;\r\n if (firstCell) {\r\n toggle = document.createElement('button');\r\n toggle.type = 'button';\r\n toggle.className = 'vgdt-expand-toggle';\r\n toggle.setAttribute('data-expand-toggle', '1');\r\n firstCell.prepend(toggle);\r\n }\r\n }\r\n if (!toggle) {\r\n return;\r\n }\r\n\r\n // Keep visual spacing stable even if CSS bundle is outdated.\r\n toggle.style.marginInlineEnd = '10px';\r\n toggle.style.cursor = 'pointer';\r\n\r\n const nextNode = toggle.nextSibling;\r\n const hasLeadingSpace = nextNode\r\n && nextNode.nodeType === 3\r\n && /^\\s/.test(String(nextNode.textContent || ''));\r\n if (!hasLeadingSpace) {\r\n toggle.after(document.createTextNode(' '));\r\n }\r\n\r\n toggle.setAttribute('data-expand-toggle', rowId);\r\n toggle.setAttribute('aria-expanded', this._collapsed.has(rowId) ? 'false' : 'true');\r\n toggle.hidden = !hasChildren;\r\n if (!hasChildren) {\r\n return;\r\n }\r\n const collapsed = this._collapsed.has(rowId);\r\n toggle.textContent = collapsed ? '+' : '−';\r\n }\r\n\r\n _getRows() {\r\n const body = this._table.tBodies && this._table.tBodies[0];\r\n if (!body) {\r\n return [];\r\n }\r\n return Array.from(body.rows).filter((row) => !row.querySelector('[data-table-state]'));\r\n }\r\n\r\n _resetExpandHidden(rows) {\r\n rows.forEach((row) => {\r\n if (row.getAttribute('data-expand-hidden') === '1') {\r\n row.hidden = false;\r\n row.removeAttribute('data-expand-hidden');\r\n }\r\n });\r\n }\r\n\r\n _rememberBaseVisibility(rows) {\r\n rows.forEach((row) => {\r\n row.setAttribute('data-expand-base-hidden', row.hidden ? '1' : '0');\r\n });\r\n }\r\n\r\n _isInitiallyCollapsed(row) {\r\n const attr = row.getAttribute('data-expand-collapsed');\r\n if (attr !== null) {\r\n return this._isTruthy(attr);\r\n }\r\n return Boolean(this._params.collapsed);\r\n }\r\n\r\n _isEnabled() {\r\n return Boolean(this._params.enable);\r\n }\r\n\r\n _getIdAttr() {\r\n return String(this._params.idAttr || 'data-expand-id').trim() || 'data-expand-id';\r\n }\r\n\r\n _getParentAttr() {\r\n return String(this._params.parentAttr || 'data-expand-parent-id').trim() || 'data-expand-parent-id';\r\n }\r\n\r\n _getToggleSelector() {\r\n return String(this._params.toggleSelector || '[data-expand-toggle]').trim() || '[data-expand-toggle]';\r\n }\r\n\r\n _isTruthy(value) {\r\n const normalized = String(value || '').toLowerCase().trim();\r\n return normalized !== '' && normalized !== '0' && normalized !== 'false' && normalized !== 'off' && normalized !== 'no';\r\n }\r\n}\r\n\r\nexport default Expandable;\r\n","import {normalizeNonNegativeInt, safeQuerySelector} from \"./utils/common\";\r\n\r\nclass Search {\r\n constructor(options = {}) {\r\n this._options = Object.assign({\r\n enabled: true,\r\n debounceMs: 300,\r\n inputSelector: '',\r\n param: 'q',\r\n onSearch: null,\r\n }, options);\r\n\r\n this._input = null;\r\n this._timer = null;\r\n\r\n this._boundInput = this._handleInput.bind(this);\r\n this._boundKeyDown = this._handleKeyDown.bind(this);\r\n }\r\n\r\n init() {\r\n if (!this._options.enabled) {\r\n return;\r\n }\r\n\r\n const selector = String(this._options.inputSelector || '').trim();\r\n if (!selector) {\r\n return;\r\n }\r\n\r\n const input = safeQuerySelector(selector);\r\n if (!input) {\r\n return;\r\n }\r\n\r\n this._input = input;\r\n this._input.addEventListener('input', this._boundInput);\r\n this._input.addEventListener('keydown', this._boundKeyDown);\r\n }\r\n\r\n destroy() {\r\n if (!this._input) {\r\n return;\r\n }\r\n\r\n this._input.removeEventListener('input', this._boundInput);\r\n this._input.removeEventListener('keydown', this._boundKeyDown);\r\n this._input = null;\r\n clearTimeout(this._timer);\r\n this._timer = null;\r\n }\r\n\r\n _handleInput() {\r\n clearTimeout(this._timer);\r\n this._timer = setTimeout(() => {\r\n this._emit();\r\n }, normalizeNonNegativeInt(this._options.debounceMs, 300));\r\n }\r\n\r\n _handleKeyDown(event) {\r\n if (event.key !== 'Enter') {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n clearTimeout(this._timer);\r\n this._emit();\r\n }\r\n\r\n _emit() {\r\n if (typeof this._options.onSearch !== 'function' || !this._input) {\r\n return;\r\n }\r\n\r\n this._options.onSearch({\r\n value: this._input.value.trim(),\r\n param: String(this._options.param || 'q'),\r\n });\r\n }\r\n}\r\n\r\nexport default Search;\r\n\r\n","import {normalizeNonNegativeInt, safeQuerySelector} from \"./utils/common\";\r\n\r\nclass Filters {\r\n constructor(options = {}) {\r\n this._options = Object.assign({\r\n enabled: true,\r\n formSelector: '',\r\n formNode: null,\r\n debounceMs: 300,\r\n applyMode: 'auto', // auto | manual\r\n button: {\r\n apply: '[data-filter-apply]',\r\n reset: '[data-filter-reset]',\r\n },\r\n fieldAttr: 'data-filter-field',\r\n partAttr: 'data-filter-part',\r\n typeAttr: 'data-filter-type',\r\n valueAttr: 'data-filter-value',\r\n operatorAttr: 'data-filter-operator',\r\n defaultOperator: 'eq',\r\n skipEmpty: true,\r\n trimValues: true,\r\n emitOnInit: false,\r\n initialValues: {},\r\n onChange: null,\r\n onReset: null,\r\n }, options);\r\n\r\n this._form = null;\r\n this._timer = null;\r\n this._controls = [];\r\n this._boundInput = this._handleInput.bind(this);\r\n this._boundChange = this._handleChange.bind(this);\r\n this._boundClick = this._handleClick.bind(this);\r\n this._boundSubmit = this._handleSubmit.bind(this);\r\n }\r\n\r\n init() {\r\n if (!this._options.enabled) {\r\n return;\r\n }\r\n\r\n const form = this._resolveFormNode();\r\n if (!form) {\r\n return;\r\n }\r\n\r\n this._form = form;\r\n this._syncCachedNodes();\r\n this._form.addEventListener('input', this._boundInput);\r\n this._form.addEventListener('change', this._boundChange);\r\n this._form.addEventListener('click', this._boundClick);\r\n this._form.addEventListener('submit', this._boundSubmit);\r\n\r\n this.setValues(this._options.initialValues || {}, { emit: false });\r\n if (this._options.emitOnInit) {\r\n this._emit();\r\n }\r\n }\r\n\r\n destroy() {\r\n if (!this._form) {\r\n return;\r\n }\r\n this._form.removeEventListener('input', this._boundInput);\r\n this._form.removeEventListener('change', this._boundChange);\r\n this._form.removeEventListener('click', this._boundClick);\r\n this._form.removeEventListener('submit', this._boundSubmit);\r\n this._form = null;\r\n clearTimeout(this._timer);\r\n this._timer = null;\r\n this._controls = [];\r\n }\r\n\r\n getState() {\r\n return this._collectState();\r\n }\r\n\r\n getValues() {\r\n return this._collectState().params;\r\n }\r\n\r\n getFields() {\r\n const unique = new Set();\r\n this._getControls().forEach((control) => {\r\n const field = this._getField(control);\r\n if (field) {\r\n unique.add(field);\r\n }\r\n });\r\n return Array.from(unique);\r\n }\r\n\r\n setValues(nextValues = {}, options = {}) {\r\n if (!this._form) {\r\n return;\r\n }\r\n this._getControls().forEach((control) => {\r\n const field = this._getField(control);\r\n if (!field) {\r\n return;\r\n }\r\n const part = this._getPart(control);\r\n const key = part === 'operator' ? `${field}_op` : field;\r\n const hasOwn = Object.prototype.hasOwnProperty.call(nextValues, key);\r\n const nextValue = hasOwn ? nextValues[key] : '';\r\n this._setControlValue(control, nextValue);\r\n });\r\n if (options.emit) {\r\n this._emit();\r\n }\r\n }\r\n\r\n _resolveFormNode() {\r\n if (this._options.formNode && this._options.formNode.nodeType === 1) {\r\n return this._options.formNode;\r\n }\r\n const selector = String(this._options.formSelector || '').trim();\r\n if (!selector) {\r\n return null;\r\n }\r\n return safeQuerySelector(selector);\r\n }\r\n\r\n _handleInput(event) {\r\n if (!this._isFilterControl(event.target)) {\r\n return;\r\n }\r\n if (this._isManualMode()) {\r\n return;\r\n }\r\n const type = String(event.target.type || '').toLowerCase();\r\n if (type === 'checkbox' || type === 'radio' || event.target.tagName === 'SELECT') {\r\n this._emit();\r\n return;\r\n }\r\n clearTimeout(this._timer);\r\n this._timer = setTimeout(() => this._emit(), normalizeNonNegativeInt(this._options.debounceMs, 300));\r\n }\r\n\r\n _handleChange(event) {\r\n if (!this._isFilterControl(event.target)) {\r\n return;\r\n }\r\n if (this._isManualMode()) {\r\n return;\r\n }\r\n clearTimeout(this._timer);\r\n this._emit();\r\n }\r\n\r\n _handleClick(event) {\r\n if (!this._form) {\r\n return;\r\n }\r\n const button = this._options.button || {};\r\n const applySelector = String(button.apply || '[data-filter-apply]').trim();\r\n const resetSelector = String(button.reset || '[data-filter-reset]').trim();\r\n\r\n const applyButton = applySelector ? event.target.closest(applySelector) : null;\r\n if (applyButton) {\r\n event.preventDefault();\r\n clearTimeout(this._timer);\r\n this._emit();\r\n return;\r\n }\r\n\r\n const resetButton = resetSelector ? event.target.closest(resetSelector) : null;\r\n if (!resetButton) {\r\n return;\r\n }\r\n event.preventDefault();\r\n this._reset();\r\n if (typeof this._options.onReset === 'function') {\r\n this._options.onReset();\r\n }\r\n clearTimeout(this._timer);\r\n this._emit();\r\n }\r\n\r\n _handleSubmit(event) {\r\n if (!this._isManualMode()) {\r\n return;\r\n }\r\n event.preventDefault();\r\n clearTimeout(this._timer);\r\n this._emit();\r\n }\r\n\r\n _emit() {\r\n if (!this._form || typeof this._options.onChange !== 'function') {\r\n return;\r\n }\r\n this._options.onChange(this._collectState());\r\n }\r\n\r\n _collectState() {\r\n const groups = new Map();\r\n this._getControls().forEach((control) => {\r\n const field = this._getField(control);\r\n if (!field) {\r\n return;\r\n }\r\n if (!groups.has(field)) {\r\n groups.set(field, {\r\n field,\r\n type: this._getType(control),\r\n operator: this._getStaticOperator(control),\r\n value: '',\r\n values: [],\r\n });\r\n }\r\n const item = groups.get(field);\r\n const part = this._getPart(control);\r\n const value = this._readControlValue(control);\r\n const controlType = String(control.type || '').toLowerCase();\r\n if (part === 'operator') {\r\n item.operator = String(value || '').trim() || item.operator || this._getDefaultOperator();\r\n return;\r\n }\r\n if (part === 'type') {\r\n item.type = String(value || '').trim() || item.type || 'text';\r\n return;\r\n }\r\n // Ignore unchecked radio/checkbox values so they do not wipe selected values in a group.\r\n if ((controlType === 'checkbox' || controlType === 'radio') && value === '') {\r\n return;\r\n }\r\n if (Array.isArray(value)) {\r\n item.values = value.slice();\r\n item.value = item.values.join(',');\r\n return;\r\n }\r\n item.value = value;\r\n });\r\n\r\n const filters = {};\r\n const params = {};\r\n groups.forEach((item, field) => {\r\n const normalized = this._normalizeFilterItem(item);\r\n if (!normalized) {\r\n return;\r\n }\r\n filters[field] = normalized;\r\n\r\n if (normalized.values.length > 0) {\r\n params[field] = normalized.values.slice();\r\n } else {\r\n params[field] = normalized.value;\r\n }\r\n if (normalized.operator) {\r\n params[`${field}_op`] = normalized.operator;\r\n }\r\n });\r\n\r\n return {\r\n filters,\r\n params,\r\n fields: Object.keys(filters),\r\n meta: {\r\n count: Object.keys(filters).length,\r\n },\r\n };\r\n }\r\n\r\n _normalizeFilterItem(item) {\r\n const type = String(item.type || 'text').trim() || 'text';\r\n const operator = String(item.operator || this._getDefaultOperator()).trim();\r\n let value = item.value;\r\n let values = Array.isArray(item.values) ? item.values.slice() : [];\r\n\r\n if (this._options.trimValues) {\r\n if (typeof value === 'string') {\r\n value = value.trim();\r\n }\r\n values = values.map((entry) => String(entry || '').trim()).filter((entry) => entry !== '');\r\n }\r\n\r\n if (this._options.skipEmpty) {\r\n const isEmptyArray = values.length === 0;\r\n const isEmptyValue = value === undefined || value === null || String(value) === '';\r\n if (isEmptyArray && isEmptyValue) {\r\n return null;\r\n }\r\n }\r\n\r\n return {\r\n field: String(item.field || '').trim(),\r\n type,\r\n operator,\r\n value: value === undefined || value === null ? '' : value,\r\n values,\r\n };\r\n }\r\n\r\n _setControlValue(control, nextValue) {\r\n const type = String(control.type || '').toLowerCase();\r\n if (type === 'checkbox') {\r\n const normalized = String(nextValue || '').toLowerCase();\r\n control.checked = normalized === String(control.value || '').toLowerCase()\r\n || normalized === '1'\r\n || normalized === 'true'\r\n || normalized === 'on';\r\n return;\r\n }\r\n if (type === 'radio') {\r\n control.checked = String(control.value || '') === String(nextValue || '');\r\n return;\r\n }\r\n if (control.tagName === 'SELECT' && control.multiple) {\r\n const rawValues = Array.isArray(nextValue)\r\n ? nextValue\r\n : String(nextValue || '').split(',');\r\n const selected = new Set(rawValues\r\n .map((value) => String(value || '').trim())\r\n .filter((value) => value !== ''));\r\n Array.from(control.options || []).forEach((option) => {\r\n option.selected = selected.has(String(option.value || '').trim());\r\n });\r\n return;\r\n }\r\n control.value = String(nextValue || '');\r\n }\r\n\r\n _readControlValue(control) {\r\n if (control.tagName === 'SELECT' && control.multiple) {\r\n return Array.from(control.selectedOptions || [])\r\n .map((option) => String(option.value || '').trim())\r\n .filter((value) => value !== '');\r\n }\r\n const type = String(control.type || '').toLowerCase();\r\n if (type === 'checkbox') {\r\n return control.checked ? (control.value || '1') : '';\r\n }\r\n if (type === 'radio') {\r\n return control.checked ? (control.value || '') : '';\r\n }\r\n return String(control.value || '');\r\n }\r\n\r\n _syncCachedNodes() {\r\n if (!this._form) {\r\n this._controls = [];\r\n return;\r\n }\r\n const attr = this._getFieldAttr();\r\n this._controls = Array.from(this._form.querySelectorAll(`[${attr}]`))\r\n .filter((control) => this._isSupportedControl(control));\r\n }\r\n\r\n _getControls() {\r\n if (!this._form) {\r\n return [];\r\n }\r\n if (!Array.isArray(this._controls) || this._controls.length === 0) {\r\n this._syncCachedNodes();\r\n }\r\n return this._controls;\r\n }\r\n\r\n _reset() {\r\n this._getControls().forEach((control) => {\r\n const type = String(control.type || '').toLowerCase();\r\n if (type === 'checkbox' || type === 'radio') {\r\n control.checked = false;\r\n return;\r\n }\r\n if (control.tagName === 'SELECT') {\r\n if (control.multiple) {\r\n Array.from(control.options || []).forEach((option) => {\r\n option.selected = false;\r\n });\r\n return;\r\n }\r\n control.selectedIndex = 0;\r\n return;\r\n }\r\n control.value = '';\r\n });\r\n }\r\n\r\n _getFieldAttr() {\r\n return String(this._options.fieldAttr || 'data-filter-field').trim() || 'data-filter-field';\r\n }\r\n\r\n _getPartAttr() {\r\n return String(this._options.partAttr || 'data-filter-part').trim() || 'data-filter-part';\r\n }\r\n\r\n _getTypeAttr() {\r\n return String(this._options.typeAttr || 'data-filter-type').trim() || 'data-filter-type';\r\n }\r\n\r\n _getValueAttr() {\r\n return String(this._options.valueAttr || 'data-filter-value').trim() || 'data-filter-value';\r\n }\r\n\r\n _getOperatorAttr() {\r\n return String(this._options.operatorAttr || 'data-filter-operator').trim() || 'data-filter-operator';\r\n }\r\n\r\n _getDefaultOperator() {\r\n return String(this._options.defaultOperator || 'eq').trim() || 'eq';\r\n }\r\n\r\n _getField(control) {\r\n return String(control.getAttribute(this._getFieldAttr()) || '').trim();\r\n }\r\n\r\n _getPart(control) {\r\n const part = String(control.getAttribute(this._getPartAttr()) || 'value').toLowerCase().trim();\r\n if (part === 'operator' || part === 'type') {\r\n return part;\r\n }\r\n return 'value';\r\n }\r\n\r\n _getType(control) {\r\n const type = String(control.getAttribute(this._getTypeAttr()) || '').toLowerCase().trim();\r\n return type || 'text';\r\n }\r\n\r\n _getStaticOperator(control) {\r\n const operator = String(control.getAttribute(this._getOperatorAttr()) || '').trim();\r\n return operator || '';\r\n }\r\n\r\n _isFilterControl(node) {\r\n return Boolean(\r\n node\r\n && this._isSupportedControl(node)\r\n && typeof node.getAttribute === 'function'\r\n && String(node.getAttribute(this._getFieldAttr()) || '').trim() !== ''\r\n );\r\n }\r\n\r\n _isSupportedControl(node) {\r\n if (!node || typeof node.tagName !== 'string') {\r\n return false;\r\n }\r\n const tag = String(node.tagName || '').toUpperCase();\r\n return tag === 'INPUT' || tag === 'SELECT' || tag === 'TEXTAREA';\r\n }\r\n _isManualMode() {\r\n const mode = String(this._options.applyMode || 'auto').toLowerCase().trim();\r\n return mode === 'manual';\r\n }\r\n}\r\n\r\nexport default Filters;\r\n","import BaseModule from \"../../base-module\";\r\nimport fixedColumnsMethods from \"./fixed\";\r\nimport viewportMethods from \"./viewport\";\r\nimport summaryFooterMethods from \"./summary-footer\";\r\nimport skeletonMethods from \"./skeleton\";\r\nimport tableRemoteMethods from \"./table-remote\";\r\nimport tableUrlStateMethods from \"./table-url-state\";\r\nimport tableStateMethods from \"./table-state\";\r\nimport DEFAULT_OPTIONS from \"./options\";\r\nimport Pagination from \"./pagination\";\r\nimport Sortable from \"./sortable\";\r\nimport Expandable from \"./expandable\";\r\nimport Search from \"./search\";\r\nimport Filters from \"./filters\";\r\nimport Selectors from \"../../../utils/js/dom/selectors\";\r\nimport EventHandler from \"../../../utils/js/dom/event\";\r\nimport {mergeDeepObject} from \"../../../utils/js/functions\";\r\n\r\n/**\r\n * Константы\r\n */\r\nconst NAME = 'dynamicTable';\r\nconst NAME_KEY = 'vg.' + NAME;\r\n\r\nconst MAIN_SELECTOR_CLASS = 'vg-dynamic-table';\r\nconst SELECTOR_DATA_TOGGLE = '[data-vg-table]';\r\n\r\n/**\r\n * Карта колбеков\r\n */\r\nconst ACTION_CALLBACK_MAP = {\r\n\tinit: 'onInit',\r\n\tbeforeload: 'onBeforeLoad',\r\n\tdataloaded: 'onDataLoaded',\r\n\terror: 'onError',\r\n\trequestsuccess: 'onRequestSuccess',\r\n\trequesterror: 'onRequestError',\r\n\tstaleresponse: 'onStaleResponse',\r\n\turlstateread: 'onUrlStateRead',\r\n\turlstatewrite: 'onUrlStateWrite',\r\n\turlstateerror: 'onUrlStateError',\r\n\temptyresult: 'onEmptyResult',\r\n\tafterrender: 'onAfterRender',\r\n\tstatesync: 'onStateSync',\r\n\tsortchange: 'onSortChange',\r\n\tpagechange: 'onPageChange',\r\n\tperpagechange: 'onPerPageChange',\r\n\tsearch: 'onSearch',\r\n\tfilterschange: 'onFiltersChange',\r\n\treset: 'onReset',\r\n\texport: 'onExport',\r\n\tviewchange: 'onViewChange',\r\n\trowupdate: 'onRowUpdate',\r\n\trowupdateerror: 'onRowUpdateError',\r\n\tbulkaction: 'onBulkAction',\r\n\trowdelete: 'onRowDelete',\r\n\trowcheck: 'onRowCheck',\r\n\tcheckall: 'onCheckAll',\r\n\tselectionchange: 'onSelectionChange',\r\n\trowexpand: 'onRowExpand',\r\n\trowcollapse: 'onRowCollapse',\r\n\trowtoggle: 'onRowToggle',\r\n\trowreorder: 'onRowReorder',\r\n\trowreordererror: 'onRowReorderError',\r\n\tcolumnreorder: 'onColumnReorder',\r\n\tcolumnresize: 'onColumnResize',\r\n\tcolumnfixed: 'onColumnFixed',\r\n};\r\n\r\nclass VGDynamicTable extends BaseModule {\r\n\tconstructor(element, params = {}) {\r\n\t\tsuper(element, params);\r\n\t\tthis._params = this._getParams(element, mergeDeepObject(DEFAULT_OPTIONS, params));\r\n\t\tthis._parent = null;\r\n\t\tthis._tableViewport = null;\r\n\t\tthis._pagination = null;\r\n\t\tthis._rows = [];\r\n\t\tthis._originalRows = [];\r\n\t\tthis._requestToken = 0;\r\n\t\tthis._isRemote = false;\r\n\t\tthis._fields = [];\r\n\t\tthis._isInitialized = false;\r\n\t\tthis._sortable = null;\r\n\t\tthis._search = null;\r\n\t\tthis._filters = null;\r\n\t\tthis._sortState = { field: '', dir: 'asc', columnIndex: -1, sorts: [] };\r\n\t\tthis._pageState = { page: 1, perPage: 10 };\r\n\t\tthis._remoteParams = {};\r\n\t\tthis._activeFilters = {};\r\n\t\tthis._lastRemoteMeta = {};\r\n\t\tthis._liveRegion = null;\r\n\t\tthis._summaryNode = null;\r\n\t\tthis._panHintNode = null;\r\n\t\tthis._cloneStickyState = null;\r\n\t\tthis._boundPopState = this._handlePopState.bind(this);\r\n\t\tthis._panState = null;\r\n\t\tthis._boundPanHintResize = this._updatePanHintVisibility.bind(this);\r\n\t\tthis._boundPanHintDismiss = this._handlePanHintDismiss.bind(this);\r\n\t\tthis._boundCloneStickyResize = this._refreshStickyAndFixedLayout.bind(this);\r\n\t\tthis._boundFixedColumnsScroll = this._syncFixedColumnsScroll.bind(this);\r\n\t\tthis._fixedColumnsScrollBound = false;\r\n\t\tthis._fixedColumnsCellsCache = [];\r\n\t\tthis._fixedColumnsSyncFrame = 0;\r\n\t\tthis._fixedColumnsLastScrollLeft = 0;\r\n\t\tthis._layoutResizeObserver = null;\r\n\t\tthis._layoutRefreshFrame = 0;\r\n\t\tthis._layoutRefreshReasons = [];\r\n\t\tthis._layoutRefreshScheduled = false;\r\n\t\tthis._requestAbortController = null;\r\n\t\tthis._activeRemoteRequestId = '';\r\n\t\tthis._remotePageCache = new Map();\r\n\t\tthis._fixedColumnsSuppressed = false;\r\n\t\tthis._searchInputCacheSelector = '';\r\n\t\tthis._searchInputCacheNode = null;\r\n\t\tthis._filtersFormCacheSelector = '';\r\n\t\tthis._filtersFormCacheNode = null;\r\n\t\tthis._filterParamKeysCache = null;\r\n\t\tthis._columnReorderState = {\r\n\t\t\tenabled: false,\r\n\t\t\tfromIndex: -1,\r\n\t\t\ttoIndex: -1,\r\n\t\t\tisDragging: false,\r\n\t\t};\r\n\t\tthis._columnResizeState = {\r\n\t\t\tenabled: false,\r\n\t\t\tbound: false,\r\n\t\t\tactive: false,\r\n\t\t\tindex: -1,\r\n\t\t\tstartX: 0,\r\n\t\t\tstartWidth: 0,\r\n\t\t\tnextWidth: 0,\r\n\t\t\tframe: 0,\r\n\t\t};\r\n\t\tthis._virtualState = {\n\t\t\tenabled: false,\n\t\t\tbound: false,\n\t\t\tlastPage: -1,\n\t\t\tlastPerPage: -1,\n\t\t\tstart: 0,\r\n\t\t\tend: 0,\r\n\t\t\tpage: -1,\r\n\t\t\tperPage: -1,\n\t\t\tframe: 0,\n\t\t\tlastScrollTop: -1,\n\t\t\trowHeight: 44,\n\t\t};\n\t\tthis._virtualSpacers = {\n\t\t\ttop: null,\n\t\t\tbottom: null,\n\t\t};\n\t\tthis._boundVirtualScroll = this._handleVirtualScroll.bind(this);\n\t\tthis._expandable = null;\n\t}\n\r\n\tstatic get NAME() { return NAME; }\r\n\r\n\tstatic get NAME_KEY() { return NAME_KEY; }\r\n\r\n\tstatic initAll(params = {}) {\r\n\t\tArray.from(Selectors.findAll(SELECTOR_DATA_TOGGLE)).forEach((element) => {\r\n\t\t\tconst instance = this.getInstance(element) || new this(element, params);\r\n\t\t\tinstance.init();\r\n\t\t});\r\n\t}\r\n\r\n\t_emitAction(action, payload = {}) {\r\n\t\tconst normalizedAction = String(action || '').trim();\r\n\t\tif (!normalizedAction) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst detail = Object.assign({\r\n\t\t\taction: normalizedAction,\r\n\t\t\ttable: this._element,\r\n\t\t\tisRemote: this._isRemote,\r\n\t\t}, payload);\r\n\r\n\t\tconst callbacks = this._params.callbacks || {};\r\n\t\tconst normalizedActionKey = normalizedAction.toLowerCase();\r\n\t\tconst callbackName = ACTION_CALLBACK_MAP[normalizedActionKey] || '';\r\n\t\tconst callback = callbackName ? callbacks[callbackName] : null;\r\n\t\tif (typeof callback === 'function') {\r\n\t\t\tcallback(detail, this);\r\n\t\t}\r\n\r\n\t\tconst events = this._params.events || {};\r\n\t\tconst eventsEnabled = events.enable === undefined ? true : Boolean(events.enable);\r\n\t\tif (!eventsEnabled || typeof window === 'undefined' || typeof window.CustomEvent !== 'function') {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst prefix = String(events.prefix || 'vgdt').trim() || 'vgdt';\r\n\t\tconst eventName = `${prefix}:${normalizedActionKey}`;\r\n\t\tconst bubbles = events.bubbles === undefined ? true : Boolean(events.bubbles);\r\n\t\tthis._element.dispatchEvent(new CustomEvent(eventName, {\r\n\t\t\tdetail,\r\n\t\t\tbubbles,\r\n\t\t}));\r\n\t}\r\n\r\n\tupdateRemoteParams(nextParams = {}, options = {}) {\r\n\t\tif (!this._isRemote) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst shouldReplace = options && Object.prototype.hasOwnProperty.call(options, 'replace')\r\n\t\t\t? Boolean(options.replace)\r\n\t\t\t: false;\r\n\t\tconst shouldReload = options && Object.prototype.hasOwnProperty.call(options, 'reload')\r\n\t\t\t? Boolean(options.reload)\r\n\t\t\t: true;\r\n\t\tconst shouldResetPage = options && Object.prototype.hasOwnProperty.call(options, 'resetPage')\r\n\t\t\t? Boolean(options.resetPage)\r\n\t\t\t: true;\r\n\t\tconst trigger = options && typeof options.trigger === 'string'\r\n\t\t\t? String(options.trigger).toLowerCase().trim()\r\n\t\t\t: '';\r\n\t\tconst filtersState = options && options.filtersState && typeof options.filtersState === 'object'\r\n\t\t\t? this._normalizeFiltersEventState(options.filtersState)\r\n\t\t\t: null;\r\n\r\n\t\tconst source = nextParams && typeof nextParams === 'object' ? nextParams : {};\r\n\t\tconst current = shouldReplace ? {} : Object.assign({}, this._remoteParams);\r\n\t\tObject.keys(source).forEach((key) => {\r\n\t\t\tconst value = source[key];\r\n\t\t\tif (Array.isArray(value)) {\r\n\t\t\t\tconst normalized = value\r\n\t\t\t\t\t.map((item) => String(item || '').trim())\r\n\t\t\t\t\t.filter((item) => item !== '');\r\n\t\t\t\tif (!normalized.length) {\r\n\t\t\t\t\tdelete current[key];\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tcurrent[key] = normalized;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (value === undefined || value === null || value === '') {\r\n\t\t\t\tdelete current[key];\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tcurrent[key] = value;\r\n\t\t});\r\n\t\tthis._remoteParams = current;\r\n\r\n\t\tif (!shouldReload) {\r\n\t\t\tthis._syncUrlState();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst perPage = this._pageState.perPage || this._normalizePositiveInt(this._params.pagination.perPage, 10);\r\n\t\tconst page = shouldResetPage ? 1 : (this._pageState.page || 1);\r\n\t\tthis._pageState = { page, perPage };\r\n\t\tthis._loadRemotePage(page, perPage, null, {\r\n\t\t\ttrigger,\r\n\t\t\tfiltersState,\r\n\t\t});\r\n\t}\r\n\r\n\tsetLocale(locale) {\n\t\tconst normalized = String(locale || '').toLowerCase().trim() || 'ru';\r\n\t\tthis._params.locale = normalized;\r\n\t\tthis._writePersistentState('locale', normalized);\r\n\t\treturn normalized;\r\n\t}\r\n\r\n\tsetFiltersApplyMode(mode) {\r\n\t\tconst normalized = this._normalizeFiltersApplyMode(mode);\r\n\t\tif (!this._params.filters || typeof this._params.filters !== 'object') {\r\n\t\t\tthis._params.filters = {};\r\n\t\t}\r\n\t\tthis._params.filters.apply = normalized;\r\n\t\tthis._writePersistentState('filtersApplyMode', normalized);\r\n\t\tif (this._isInitialized && this._isRemote) {\r\n\t\t\tthis._initFilters();\r\n\t\t}\r\n\t\treturn normalized;\r\n\t}\r\n\r\n\t_getViewsStorageKey() {\r\n\t\tconst explicitAttr = String(this._element.getAttribute('data-views-storage-key') || '').trim();\r\n\t\tif (explicitAttr) {\r\n\t\t\treturn explicitAttr;\r\n\t\t}\r\n\t\tconst viewsOptions = this._params.views && typeof this._params.views === 'object'\r\n\t\t\t? this._params.views\r\n\t\t\t: {};\r\n\t\tconst nestedStorage = viewsOptions.storage && typeof viewsOptions.storage === 'object'\r\n\t\t\t? viewsOptions.storage\r\n\t\t\t: {};\r\n\t\tconst nestedOption = String(nestedStorage.key || viewsoptions.storageKey || '').trim();\r\n\t\tif (nestedOption) {\r\n\t\t\treturn nestedOption;\r\n\t\t}\r\n\t\treturn `${this._getPerPageStorageKey()}:views`;\r\n\t}\r\n\r\n\t_readViewsStorage() {\r\n\t\ttry {\r\n\t\t\tconst raw = String(window.localStorage.getItem(this._getViewsStorageKey()) || '').trim();\r\n\t\t\tif (!raw) {\r\n\t\t\t\treturn {};\r\n\t\t\t}\r\n\t\t\tconst parsed = JSON.parse(raw);\r\n\t\t\treturn parsed && typeof parsed === 'object' && !Array.isArray(parsed) ? parsed : {};\r\n\t\t} catch (error) {\r\n\t\t\treturn {};\r\n\t\t}\r\n\t}\r\n\r\n\t_writeViewsStorage(data) {\r\n\t\ttry {\r\n\t\t\twindow.localStorage.setItem(this._getViewsStorageKey(), JSON.stringify(data || {}));\r\n\t\t} catch (error) {\r\n\t\t\t// Ignore storage errors.\r\n\t\t}\r\n\t}\r\n\r\n\t_getHiddenFields() {\r\n\t\treturn this._getHeaderCells()\r\n\t\t\t.filter((header) => String(header.getAttribute('data-hidden') || '') === '1')\r\n\t\t\t.map((header) => String(header.getAttribute('data-field') || '').trim())\r\n\t\t\t.filter(Boolean);\r\n\t}\r\n\r\n\t_setFieldHidden(field, hidden) {\r\n\t\tconst targetField = String(field || '').trim();\r\n\t\tif (!targetField) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst headers = this._getHeaderCells();\r\n\t\tconst index = headers.findIndex((header) => String(header.getAttribute('data-field') || '').trim() === targetField);\r\n\t\tif (index < 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst sections = [];\r\n\t\tif (this._element.tHead) {\r\n\t\t\tsections.push(this._element.tHead);\r\n\t\t}\r\n\t\tif (this._element.tBodies && this._element.tBodies.length) {\r\n\t\t\tsections.push(...Array.from(this._element.tBodies));\r\n\t\t}\r\n\t\tif (this._element.tFoot) {\r\n\t\t\tsections.push(this._element.tFoot);\r\n\t\t}\r\n\t\tsections.forEach((section) => {\r\n\t\t\tArray.from(section.rows || []).forEach((row) => {\r\n\t\t\t\tconst cell = row.cells && row.cells[index] ? row.cells[index] : null;\r\n\t\t\t\tif (!cell) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tcell.style.display = hidden ? 'none' : '';\r\n\t\t\t\tif (hidden) {\r\n\t\t\t\t\tcell.setAttribute('data-hidden', '1');\r\n\t\t\t\t} else {\r\n\t\t\t\t\tcell.removeAttribute('data-hidden');\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\t\tconst header = headers[index];\r\n\t\tif (header) {\r\n\t\t\tif (hidden) {\r\n\t\t\t\theader.setAttribute('data-hidden', '1');\r\n\t\t\t} else {\r\n\t\t\t\theader.removeAttribute('data-hidden');\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tgetCurrentViewState() {\r\n\t\treturn {\r\n\t\t\tfilters: Object.assign({}, this._remoteParams || {}),\r\n\t\t\tsorts: this._getNormalizedSorts(this._sortState.sorts || []),\r\n\t\t\tperPage: this._pageState.perPage || this._getInitialPerPage(),\r\n\t\t\tcolumnOrder: this._getCurrentColumnOrder(),\r\n\t\t\thiddenFields: this._getHiddenFields(),\r\n\t\t};\r\n\t}\r\n\r\n\tlistViews() {\r\n\t\treturn Object.keys(this._readViewsStorage()).sort();\r\n\t}\r\n\r\n\tsaveView(name) {\r\n\t\tconst cleanName = String(name || '').trim();\r\n\t\tif (!cleanName) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tconst storage = this._readViewsStorage();\r\n\t\tstorage[cleanName] = this.getCurrentViewState();\r\n\t\tthis._writeViewsStorage(storage);\r\n\t\tthis._emitAction('viewchange', {\r\n\t\t\tmode: 'save',\r\n\t\t\tname: cleanName,\r\n\t\t\tstate: storage[cleanName],\r\n\t\t});\r\n\t\treturn true;\r\n\t}\r\n\r\n\tapplyView(name) {\r\n\t\tconst cleanName = String(name || '').trim();\r\n\t\tif (!cleanName) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tconst storage = this._readViewsStorage();\r\n\t\tconst state = storage[cleanName];\r\n\t\tif (!state || typeof state !== 'object') {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst columnOrder = Array.isArray(state.columnOrder) ? state.columnOrder.filter(Boolean) : [];\r\n\t\tcolumnOrder.forEach((field, targetIndex) => {\r\n\t\t\tconst currentIndex = this._findHeaderIndexByField(field);\r\n\t\t\tif (currentIndex < 0 || currentIndex === targetIndex) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tthis._moveColumn(currentIndex, targetIndex);\r\n\t\t});\r\n\r\n\t\tconst hiddenFields = Array.isArray(state.hiddenFields) ? state.hiddenFields : [];\r\n\t\tconst hiddenSet = new Set(hiddenFields.map((field) => String(field || '').trim()).filter(Boolean));\r\n\t\tthis._getCurrentColumnOrder().forEach((field) => {\r\n\t\t\tthis._setFieldHidden(field, hiddenSet.has(field));\r\n\t\t});\r\n\r\n\t\tconst sorts = this._getNormalizedSorts(state.sorts || []);\r\n\t\tif (this._sortable) {\r\n\t\t\tthis._sortable.setState({ sorts });\r\n\t\t}\r\n\t\tconst firstSort = sorts[0] || null;\r\n\t\tthis._sortState = Object.assign({}, this._sortState, {\r\n\t\t\tfield: firstSort ? firstSort.field : '',\r\n\t\t\tdir: firstSort ? firstSort.dir : 'asc',\r\n\t\t\tsorts,\r\n\t\t});\r\n\r\n\t\tconst nextPerPage = this._clampPerPage(state.perPage, this._getInitialPerPage());\r\n\t\tif (this._pagination) {\r\n\t\t\tthis._pagination.setMeta({\r\n\t\t\t\tpage: 1,\r\n\t\t\t\tperPage: nextPerPage,\r\n\t\t\t\ttotalPages: this._isRemote ? this._normalizePositiveInt(this._lastRemoteMeta.pages, 1) : this._getTotalPages(nextPerPage),\r\n\t\t\t});\r\n\t\t}\r\n\t\tthis._pageState = { page: 1, perPage: nextPerPage };\r\n\r\n\t\tif (this._isRemote) {\r\n\t\t\tthis._remoteParams = state.filters && typeof state.filters === 'object'\r\n\t\t\t\t? Object.assign({}, state.filters)\r\n\t\t\t\t: {};\r\n\t\t\tif (this._filters && typeof this._filters.setValues === 'function') {\r\n\t\t\t\tthis._filters.setValues(this._getInitialFilterValues(), { emit: false });\r\n\t\t\t}\r\n\t\t\tconst filtersRequestMeta = this._getFiltersRequestMetaIfActive();\r\n\t\t\tthis._loadRemotePage(1, nextPerPage, null, filtersRequestMeta);\r\n\t\t} else {\r\n\t\t\tthis._renderPageRows(1, nextPerPage);\r\n\t\t}\r\n\r\n\t\tthis._afterColumnReorder();\r\n\t\tthis._emitAction('viewchange', {\r\n\t\t\tmode: 'apply',\r\n\t\t\tname: cleanName,\r\n\t\t\tstate,\r\n\t\t});\r\n\t\treturn true;\r\n\t}\r\n\r\n\tdeleteView(name) {\r\n\t\tconst cleanName = String(name || '').trim();\r\n\t\tif (!cleanName) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tconst storage = this._readViewsStorage();\r\n\t\tif (!Object.prototype.hasOwnProperty.call(storage, cleanName)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tdelete storage[cleanName];\r\n\t\tthis._writeViewsStorage(storage);\r\n\t\tthis._emitAction('viewchange', {\r\n\t\t\tmode: 'delete',\r\n\t\t\tname: cleanName,\r\n\t\t});\r\n\t\treturn true;\r\n\t}\r\n\r\n\tinit() {\r\n\t\tif (this._isInitialized) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst directParent = this._element.parentElement;\r\n\t\tconst nearestWrapper = this._element.closest(`.${MAIN_SELECTOR_CLASS}`);\r\n\t\tconst isWrapped = nearestWrapper && nearestWrapper.contains(this._element);\r\n\t\tif (!isWrapped) {\r\n\t\t\tconst wrapper = document.createElement('div');\r\n\t\t\twrapper.className = MAIN_SELECTOR_CLASS;\r\n\t\t\tthis._moveTableClassesToWrapper(wrapper);\r\n\t\t\tthis._element.parentNode.insertBefore(wrapper, this._element);\r\n\t\t\twrapper.appendChild(this._element);\r\n\r\n\t\t\tthis._parent = wrapper;\r\n\t\t} else {\r\n\t\t\tthis._parent = nearestWrapper;\r\n\t\t\tif (this._parent) {\r\n\t\t\t\tthis._parent.classList.add(MAIN_SELECTOR_CLASS);\r\n\t\t\t\tthis._moveTableClassesToWrapper(this._parent);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!this._parent) return;\r\n\r\n\t\tthis._ensureTableViewport(directParent);\r\n\t\tthis._bindViewportPan();\r\n\t\tthis._restorePersistentState();\n\t\tthis._ensureLiveRegion();\n\t\tthis._ensureSummaryNode();\r\n\t\tthis._ensurePanHintNode();\r\n\t\tthis._applyFooterVisibility();\r\n\r\n\t\tconst sortableEnabled = Boolean(this._params.sortable && this._params.sortable.enable);\r\n\t\tconst paginationEnabled = this._isPaginationEnabled();\r\n\t\tconst cloneStickyEnabled = this._isCloneStickyHeaderEnabled();\r\n\t\tconst stickyHeaderEnabled = cloneStickyEnabled ? false : this._isStickyHeaderEnabled();\r\n\t\tthis._element.classList.toggle('table-sortable', sortableEnabled);\r\n\t\tthis._element.classList.toggle('table-pagination', paginationEnabled);\r\n\t\tthis._element.classList.toggle('table-sticky-head', stickyHeaderEnabled);\r\n\t\tthis._element.classList.toggle('table-sticky-clone', cloneStickyEnabled);\r\n\t\tthis._parent.classList.toggle('table-sortable', sortableEnabled);\r\n\t\tthis._parent.classList.toggle('table-pagination', paginationEnabled);\r\n\t\tthis._parent.classList.toggle('table-sticky-head', stickyHeaderEnabled);\r\n\t\tthis._parent.classList.toggle('table-sticky-clone', cloneStickyEnabled);\r\n\t\tthis._applyStickyHeader(stickyHeaderEnabled);\r\n\t\tthis._applyCloneStickyHeader(cloneStickyEnabled);\r\n\r\n\t\tconst route = this._getRoute();\r\n\t\tthis._isRemote = Boolean(route);\r\n\t\tthis._fields = this._getFields();\r\n\t\tthis._sortState = this._getInitialSortState();\r\n\t\tthis._remoteParams = this._getInitialRemoteParams();\r\n\t\tthis._isInitialized = true;\r\n\r\n\t\tif (!this._isRemote) {\r\n\t\t\tthis._rows = this._getTableRows();\r\n\t\t\tthis._originalRows = this._rows.slice();\r\n\t\t}\r\n\r\n\t\tthis._initSorting();\r\n\t\tthis._initColumnReorder();\r\n\t\tthis._initColumnResize();\r\n\t\tthis._initExpandable();\r\n\t\tthis._initSearch();\r\n\t\tthis._initFilters();\r\n\t\tthis._bindTableStateActions();\r\n\t\tthis._bindPopState();\r\n\t\tthis._refreshStickyAndFixedLayout();\r\n\r\n\t\tif (paginationEnabled) {\n\t\t\tthis.setPagination();\n\t\t\tthis._emitAction('init', {\n\t\t\t\tpage: this._pageState.page,\r\n\t\t\t\tperPage: this._pageState.perPage,\r\n\t\t\t});\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (this._isRemote) {\r\n\t\t\tconst page = this._getInitialPage();\r\n\t\t\tconst perPage = this._getInitialPerPage();\r\n\t\t\tthis._pageState = { page, perPage };\r\n\t\t\tconst filtersRequestMeta = this._getFiltersRequestMetaIfActive();\r\n\t\t\tthis._loadRemotePage(page, perPage, null, filtersRequestMeta);\r\n\t\t} else {\r\n\t\t\tthis._renderFooterFromCurrentState();\r\n\t\t\tthis._refreshExpandable();\r\n\t\t}\r\n\r\n\t\tthis._emitAction('init', {\r\n\t\t\tpage: this._pageState.page,\r\n\t\t\tperPage: this._pageState.perPage,\r\n\t\t});\r\n\t}\r\n\r\n\tsetPagination() {\r\n\t\tif (this._isRemote) {\r\n\t\t\tthis._setRemotePagination();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._rows = this._getTableRows();\r\n\t\tif (!this._originalRows.length) {\r\n\t\t\tthis._originalRows = this._rows.slice();\r\n\t\t}\r\n\r\n\t\tconst page = this._getInitialPage();\r\n\t\tconst perPage = this._getInitialPerPage();\r\n\t\tconst totalPages = this._getTotalPages(perPage);\r\n\t\tconst initialPage = Math.min(page, totalPages);\r\n\t\tthis._pageState = { page: initialPage, perPage };\r\n\r\n\t\tconst userOnChange = this._params.pagination.onChange;\r\n\t\tconst userOnPerPageChange = this._params.pagination.onPerPageChange;\r\n\t\tconst paginationI18n = this._getI18nSection('pagination');\r\n\r\n\t\tconst paginationOptions = Object.assign({}, this._params.pagination, paginationI18n, {\r\n\t\t\tpage: initialPage,\r\n\t\t\tperPage,\r\n\t\t\tmaxPerPage: this._getMaxPerPage(),\r\n\t\t\ttotalPages,\r\n\t\t\tonChange: (payload) => {\r\n\t\t\t\tconst nextTotalPages = this._getTotalPages(payload.perPage);\r\n\t\t\t\tconst nextPage = Math.min(payload.page, nextTotalPages);\r\n\t\t\t\tthis._pageState = { page: nextPage, perPage: payload.perPage };\r\n\t\t\t\tthis._storePage(nextPage);\r\n\t\t\t\tthis._storePerPage(payload.perPage);\r\n\r\n\t\t\t\tthis._renderPageRows(nextPage, payload.perPage);\r\n\t\t\t\tthis._pagination.setMeta({\r\n\t\t\t\t\tpage: nextPage,\r\n\t\t\t\t\tperPage: payload.perPage,\r\n\t\t\t\t\ttotalPages: nextTotalPages,\r\n\t\t\t\t});\r\n\t\t\t\tif (payload.source !== 'ellipsis') {\r\n\t\t\t\t\tthis._scrollToPaginationTop();\r\n\t\t\t\t}\r\n\t\t\t\tthis._syncUrlState();\r\n\r\n\t\t\t\tif (typeof userOnChange === 'function') {\r\n\t\t\t\t\tuserOnChange(Object.assign({}, payload, {\r\n\t\t\t\t\t\tpage: nextPage,\r\n\t\t\t\t\t\ttotalPages: nextTotalPages,\r\n\t\t\t\t\t}));\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis._emitAction('pagechange', {\r\n\t\t\t\t\tpage: nextPage,\r\n\t\t\t\t\tperPage: payload.perPage,\r\n\t\t\t\t\ttotalPages: nextTotalPages,\r\n\t\t\t\t\tsource: 'local',\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\tonPerPageChange: (payload) => {\r\n\t\t\t\tif (typeof userOnPerPageChange === 'function') {\r\n\t\t\t\t\tuserOnPerPageChange(payload);\r\n\t\t\t\t}\r\n\t\t\t\tthis._emitAction('perpagechange', Object.assign({}, payload, {\r\n\t\t\t\t\tsource: 'local',\r\n\t\t\t\t}));\r\n\t\t\t},\r\n\t\t});\r\n\r\n\t\tconst pagination = new Pagination(this._parent, paginationOptions);\r\n\t\tpagination.init();\r\n\t\tthis._pagination = pagination;\r\n\r\n\t\tthis._renderPageRows(initialPage, perPage);\r\n\t\tthis._renderFooterFromCurrentState();\r\n\t}\r\n\r\n\t_setRemotePagination() {\n\t\tconst page = this._getInitialPage();\n\t\tconst perPage = this._getInitialPerPage();\n\t\tthis._pageState = { page, perPage };\n\r\n\t\tconst userOnChange = this._params.pagination.onChange;\r\n\t\tconst userOnPerPageChange = this._params.pagination.onPerPageChange;\r\n\t\tconst paginationI18n = this._getI18nSection('pagination');\r\n\r\n\t\tconst paginationOptions = Object.assign({}, this._params.pagination, paginationI18n, {\r\n\t\t\tpage,\r\n\t\t\tperPage,\r\n\t\t\tmaxPerPage: this._getMaxPerPage(),\r\n\t\t\ttotalPages: 1,\r\n\t\t\tonChange: async (payload) => {\r\n\t\t\t\tthis._pageState = { page: payload.page, perPage: payload.perPage };\r\n\t\t\t\tthis._storePage(payload.page);\r\n\t\t\t\tthis._storePerPage(payload.perPage);\r\n\t\t\t\tif (payload.source !== 'ellipsis') {\r\n\t\t\t\t\tthis._scrollToPaginationTop();\r\n\t\t\t\t}\r\n\t\t\t\tawait this._loadRemotePage(payload.page, payload.perPage, userOnChange);\r\n\t\t\t\tconst totalPages = this._normalizePositiveInt(this._lastRemoteMeta.pages, 1);\r\n\t\t\t\tthis._emitAction('pagechange', {\r\n\t\t\t\t\tpage: payload.page,\r\n\t\t\t\t\tperPage: payload.perPage,\r\n\t\t\t\t\ttotalPages,\r\n\t\t\t\t\tsource: 'remote',\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\tonPerPageChange: (payload) => {\r\n\t\t\t\tif (typeof userOnPerPageChange === 'function') {\r\n\t\t\t\t\tuserOnPerPageChange(payload);\r\n\t\t\t\t}\r\n\t\t\t\tthis._emitAction('perpagechange', Object.assign({}, payload, {\r\n\t\t\t\t\tsource: 'remote',\r\n\t\t\t\t}));\r\n\t\t\t},\r\n\t\t});\r\n\r\n\t\tconst pagination = new Pagination(this._parent, paginationOptions);\r\n\t\tpagination.init();\r\n\t\tthis._pagination = pagination;\r\n\r\n\t\tconst filtersRequestMeta = this._getFiltersRequestMetaIfActive();\r\n\t\tthis._loadRemotePage(page, perPage, null, filtersRequestMeta);\r\n\t}\r\n\r\n\t_getTableRows() {\n\t\tconst body = this._element.tBodies && this._element.tBodies[0];\n\t\tif (!body) {\n\t\t\treturn [];\n\t\t}\n\t\treturn Array.from(body.rows).filter((row) => String(row.getAttribute('data-virtual-spacer') || '') !== '1');\n\t}\n\r\n\t_getTotalPages(perPage) {\r\n\t\tif (!this._rows.length) {\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t\treturn Math.max(1, Math.ceil(this._rows.length / perPage));\r\n\t}\r\n\r\n\t_renderPageRows(page, perPage) {\n\t\tif (!this._rows.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst isVirtualEnabled = this._isVirtualEnabled();\n\t\tconst start = (page - 1) * perPage;\n\t\tconst end = start + perPage;\n\n\t\tthis._rows.forEach((row, index) => {\n\t\t\trow.hidden = index < start || index >= end;\n\t\t});\n\t\tif (isVirtualEnabled) {\n\t\t\tthis._virtualState.lastPage = page;\n\t\t\tthis._virtualState.lastPerPage = perPage;\n\t\t\tthis._applyVirtualWindow(page, perPage);\n\t\t} else {\n\t\t\tthis._teardownVirtualWindow();\n\t\t}\n\t\tthis._refreshExpandable();\n\t\tthis._renderFooterFromCurrentState();\n\t\tthis._refreshStickyAndFixedLayout();\n\t}\n\r\n\t_isVirtualEnabled() {\n\t\tconst options = this._params.virtual || {};\n\t\tconst attr = this._element.getAttribute('data-virtual-enable');\n\t\tconst enabled = attr !== null\n\t\t\t? this._isTruthy(attr)\n\t\t\t: Boolean(options.enable);\n\t\tif (!enabled) {\n\t\t\treturn false;\n\t\t}\n\t\tconst thresholdRaw = this._element.getAttribute('data-virtual-threshold');\n\t\tconst threshold = this._normalizePositiveInt(\n\t\t\tthresholdRaw !== null ? thresholdRaw : options.threshold,\n\t\t\t500\n\t\t);\n\t\treturn this._rows.length >= threshold;\n\t}\n\n\t_initVirtualization() {\n\t\tif (!this._tableViewport || this._virtualState.bound) {\n\t\t\treturn;\n\t\t}\n\t\tthis._tableViewport.addEventListener('scroll', this._boundVirtualScroll, { passive: true });\n\t\tthis._virtualState.bound = true;\n\t}\n\n\t_teardownVirtualizationBinding() {\n\t\tif (!this._tableViewport || !this._virtualState.bound) {\n\t\t\treturn;\n\t\t}\n\t\tthis._tableViewport.removeEventListener('scroll', this._boundVirtualScroll);\n\t\tthis._virtualState.bound = false;\n\t}\n\r\n\t_handleVirtualScroll() {\r\n\t\tif (!this._isVirtualEnabled()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (this._virtualState.lastPage <= 0 || this._virtualState.lastPerPage <= 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst nextScrollTop = this._tableViewport ? (this._tableViewport.scrollTop || 0) : 0;\r\n\t\tif (nextScrollTop === this._virtualState.lastScrollTop && this._virtualState.frame === 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._virtualState.lastScrollTop = nextScrollTop;\r\n\t\tif (this._virtualState.frame) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (typeof window === 'undefined' || typeof window.requestAnimationFrame !== 'function') {\r\n\t\t\tthis._applyVirtualWindow(this._virtualState.lastPage, this._virtualState.lastPerPage);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._virtualState.frame = window.requestAnimationFrame(() => {\r\n\t\t\tthis._virtualState.frame = 0;\r\n\t\t\tthis._applyVirtualWindow(this._virtualState.lastPage, this._virtualState.lastPerPage);\r\n\t\t});\r\n\t}\r\n\r\n\t_applyVirtualWindow(page, perPage) {\n\t\tif (!this._isVirtualEnabled() || !this._tableViewport) {\n\t\t\tthis._teardownVirtualWindow();\n\t\t\treturn;\n\t\t}\n\n\t\tthis._initVirtualization();\n\t\tconst body = this._getBody();\n\t\tif (!body) {\n\t\t\tthis._teardownVirtualWindow();\n\t\t\treturn;\n\t\t}\n\t\tconst options = this._params.virtual || {};\n\t\tconst rowHeight = this._resolveVirtualRowHeight(page, perPage, options);\n\t\tconst overscanRaw = this._element.getAttribute('data-virtual-overscan');\n\t\tconst overscan = Math.max(0, this._normalizePositiveInt(overscanRaw !== null ? overscanRaw : options.overscan, 8));\n\t\tconst visibleCount = Math.max(1, Math.ceil((this._tableViewport.clientHeight || 0) / rowHeight));\n\t\tconst pageStart = (page - 1) * perPage;\r\n\t\tconst pageEnd = Math.min(pageStart + perPage, this._rows.length);\r\n\r\n\t\tconst scrolledRows = Math.floor((this._tableViewport.scrollTop || 0) / rowHeight);\n\t\tconst windowStart = Math.max(pageStart, pageStart + scrolledRows - overscan);\n\t\tconst windowEnd = Math.min(pageEnd, pageStart + scrolledRows + visibleCount + overscan);\n\n\t\tconst topSpacerHeight = Math.max(0, (windowStart - pageStart) * rowHeight);\n\t\tconst bottomSpacerHeight = Math.max(0, (pageEnd - windowEnd) * rowHeight);\n\t\tif (\n\t\t\tthis._virtualState.start === windowStart\n\t\t\t&& this._virtualState.end === windowEnd\n\t\t\t&& this._virtualState.page === page\n\t\t\t&& this._virtualState.perPage === perPage\n\t\t) {\n\t\t\tthis._syncVirtualSpacers(body, windowStart, windowEnd, topSpacerHeight, bottomSpacerHeight);\n\t\t\treturn;\n\t\t}\n\n\t\tconst isSameContext = this._virtualState.page === page && this._virtualState.perPage === perPage;\n\t\tconst prevStart = this._virtualState.start;\r\n\t\tconst prevEnd = this._virtualState.end;\r\n\t\tconst updateFrom = isSameContext\r\n\t\t\t? Math.max(pageStart, Math.min(prevStart, windowStart))\r\n\t\t\t: pageStart;\r\n\t\tconst updateTo = isSameContext\r\n\t\t\t? Math.min(pageEnd, Math.max(prevEnd, windowEnd))\r\n\t\t\t: pageEnd;\r\n\t\tfor (let index = updateFrom; index < updateTo; index += 1) {\n\t\t\tconst row = this._rows[index];\n\t\t\tif (!row) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\trow.hidden = index < windowStart || index >= windowEnd;\n\t\t}\n\t\tthis._syncVirtualSpacers(body, windowStart, windowEnd, topSpacerHeight, bottomSpacerHeight);\n\t\tthis._virtualState.start = windowStart;\n\t\tthis._virtualState.end = windowEnd;\n\t\tthis._virtualState.page = page;\n\t\tthis._virtualState.perPage = perPage;\n\t\tthis._virtualState.rowHeight = rowHeight;\n\t}\n\n\t_resolveVirtualRowHeight(page, perPage, options = {}) {\n\t\tconst attrRowHeight = this._element.getAttribute('data-virtual-row-height');\n\t\tif (attrRowHeight !== null && String(attrRowHeight).trim() !== '') {\n\t\t\treturn Math.max(24, this._normalizePositiveInt(attrRowHeight, 44));\n\t\t}\n\n\t\tconst optionRowHeight = this._normalizePositiveInt(options.rowheight, 0);\n\t\tconst pageStart = Math.max(0, (page - 1) * perPage);\n\t\tconst pageEnd = Math.min(pageStart + perPage, this._rows.length);\n\t\tconst measuredHeight = this._measureVirtualRowHeight(pageStart, pageEnd);\n\t\tif (measuredHeight > 0) {\n\t\t\treturn measuredHeight;\n\t\t}\n\t\tif (optionRowHeight > 0) {\n\t\t\treturn Math.max(24, optionRowHeight);\n\t\t}\n\t\tconst cachedHeight = this._normalizePositiveInt(this._virtualState.rowHeight, 44);\n\t\treturn Math.max(24, cachedHeight);\n\t}\n\n\t_measureVirtualRowHeight(pageStart, pageEnd) {\n\t\tconst samples = [];\n\t\tfor (let index = pageStart; index < pageEnd; index += 1) {\n\t\t\tconst row = this._rows[index];\n\t\t\tif (!row || row.hidden) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst rect = row.getBoundingClientRect();\n\t\t\tconst height = Math.round(rect && rect.height ? rect.height : 0);\n\t\t\tif (height > 0) {\n\t\t\t\tsamples.push(height);\n\t\t\t}\n\t\t\tif (samples.length >= 6) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (!samples.length) {\n\t\t\treturn 0;\n\t\t}\n\t\tconst total = samples.reduce((sum, value) => sum + value, 0);\n\t\treturn Math.max(24, Math.round(total / samples.length));\n\t}\n\n\t_syncVirtualSpacers(body, windowStart, windowEnd, topHeight, bottomHeight) {\n\t\tconst columns = this._getRenderedColumnsCount();\n\t\tconst topSpacer = this._ensureVirtualSpacer('top', columns);\n\t\tconst bottomSpacer = this._ensureVirtualSpacer('bottom', columns);\n\t\tconst firstVisibleRow = this._rows[windowStart] || null;\n\t\tconst afterVisibleRow = this._rows[windowEnd] || null;\n\n\t\tthis._updateVirtualSpacer(topSpacer, topHeight, columns);\n\t\tthis._updateVirtualSpacer(bottomSpacer, bottomHeight, columns);\n\n\t\tif (firstVisibleRow) {\n\t\t\tbody.insertBefore(topSpacer, firstVisibleRow);\n\t\t} else if (!topSpacer.parentElement) {\n\t\t\tbody.appendChild(topSpacer);\n\t\t}\n\n\t\tif (afterVisibleRow) {\n\t\t\tbody.insertBefore(bottomSpacer, afterVisibleRow);\n\t\t} else {\n\t\t\tbody.appendChild(bottomSpacer);\n\t\t}\n\t}\n\n\t_ensureVirtualSpacer(position, columns) {\n\t\tconst current = this._virtualSpacers && this._virtualSpacers[position]\n\t\t\t? this._virtualSpacers[position]\n\t\t\t: null;\n\t\tif (current && current.isConnected) {\n\t\t\tthis._syncVirtualSpacerColumns(current, columns);\n\t\t\treturn current;\n\t\t}\n\n\t\tconst spacer = document.createElement('tr');\n\t\tspacer.setAttribute('data-virtual-spacer', '1');\n\t\tspacer.setAttribute('data-virtual-spacer-position', position);\n\t\tspacer.setAttribute('data-group-header', '1');\n\t\tspacer.setAttribute('aria-hidden', 'true');\n\t\tconst cell = document.createElement('td');\n\t\tcell.setAttribute('data-virtual-spacer-cell', '1');\n\t\tcell.colSpan = Math.max(1, columns);\n\t\tspacer.appendChild(cell);\n\t\tthis._virtualSpacers[position] = spacer;\n\t\treturn spacer;\n\t}\n\n\t_syncVirtualSpacerColumns(spacer, columns) {\n\t\tif (!spacer || !spacer.cells || !spacer.cells[0]) {\n\t\t\treturn;\n\t\t}\n\t\tspacer.cells[0].colSpan = Math.max(1, columns);\n\t}\n\n\t_updateVirtualSpacer(spacer, height, columns) {\n\t\tif (!spacer || !spacer.cells || !spacer.cells[0]) {\n\t\t\treturn;\n\t\t}\n\t\tconst safeHeight = Math.max(0, Math.round(height));\n\t\tthis._syncVirtualSpacerColumns(spacer, columns);\n\t\tconst cell = spacer.cells[0];\n\t\tcell.style.height = `${safeHeight}px`;\n\t\tspacer.hidden = safeHeight <= 0;\n\t}\n\n\t_teardownVirtualWindow() {\n\t\tthis._teardownVirtualizationBinding();\n\t\tif (this._virtualState.frame && typeof window !== 'undefined' && typeof window.cancelAnimationFrame === 'function') {\n\t\t\twindow.cancelAnimationFrame(this._virtualState.frame);\n\t\t}\n\t\tthis._virtualState.start = 0;\n\t\tthis._virtualState.end = 0;\n\t\tthis._virtualState.page = -1;\n\t\tthis._virtualState.perPage = -1;\n\t\tthis._virtualState.frame = 0;\n\t\tthis._virtualState.lastScrollTop = -1;\n\t\tObject.keys(this._virtualSpacers || {}).forEach((key) => {\n\t\t\tconst spacer = this._virtualSpacers[key];\n\t\t\tif (spacer && spacer.parentElement) {\n\t\t\t\tspacer.parentElement.removeChild(spacer);\n\t\t\t}\n\t\t});\n\t}\n\r\n\r\n\t_normalizePositiveInt(value, fallback) {\r\n\t\tconst parsed = Number.parseInt(value, 10);\r\n\t\treturn Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;\r\n\t}\r\n\r\n\t_getRoute() {\r\n\t\tconst requestOptions = this._params.request || {};\r\n\t\tconst attrRoute = this._element.getAttribute('data-request-route');\r\n\t\tconst requestRoute = String(requestOptions.route || attrRoute || '').trim();\r\n\t\tif (requestRoute) {\r\n\t\t\treturn requestRoute;\r\n\t\t}\r\n\t\treturn this._getFiltersRoute();\r\n\t}\r\n\r\n\t_restorePersistentState() {\r\n\t\tconst storedLocale = this._readPersistentState('locale');\n\t\tif (storedLocale) {\r\n\t\t\tthis._params.locale = String(storedLocale).toLowerCase().trim();\r\n\t\t}\r\n\r\n\t\tconst storedFiltersMode = this._readPersistentState('filtersApplyMode');\r\n\t\tif (storedFiltersMode) {\r\n\t\t\tif (!this._params.filters || typeof this._params.filters !== 'object') {\r\n\t\t\t\tthis._params.filters = {};\r\n\t\t\t}\r\n\t\t\tthis._params.filters.apply = this._normalizeFiltersApplyMode(storedFiltersMode);\r\n\t\t}\r\n\t}\r\n\r\n\t_isPersistenceEnabled(key) {\r\n\t\tconst persistence = this._params.persistence || {};\r\n\t\tconst attrEnabled = this._element.getAttribute('data-persistence-enable');\r\n\t\tconst globalEnabled = attrEnabled !== null\r\n\t\t\t? this._isTruthy(attrEnabled)\r\n\t\t\t: Boolean(persistence.enable);\r\n\t\tif (!globalEnabled) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst attrNameMap = {\r\n\t\t\tlocale: 'data-persistence-locale',\n\t\t\tfiltersApplyMode: 'data-persistence-filters-apply-mode',\n\t\t};\n\t\tconst attrName = attrNameMap[key];\r\n\t\tif (attrName) {\r\n\t\t\tconst attrValue = this._element.getAttribute(attrName);\r\n\t\t\tif (attrValue !== null) {\r\n\t\t\t\treturn this._isTruthy(attrValue);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn Boolean(persistence[key]);\r\n\t}\r\n\r\n\t_getPersistenceStorageKey(key) {\r\n\t\tconst persistence = this._params.persistence || {};\r\n\t\tconst explicit = String(persistence.storageKey || this._element.getAttribute('data-persistence-storage-key') || '').trim();\r\n\t\tconst base = explicit || this._getPerPageStorageKey().replace('perPage', 'state');\r\n\t\treturn `${base}:${key}`;\r\n\t}\r\n\r\n\t_readPersistentState(key) {\r\n\t\tif (!this._isPersistenceEnabled(key)) {\r\n\t\t\treturn '';\r\n\t\t}\r\n\t\ttry {\r\n\t\t\treturn String(window.localStorage.getItem(this._getPersistenceStorageKey(key)) || '');\r\n\t\t} catch (error) {\r\n\t\t\treturn '';\r\n\t\t}\r\n\t}\r\n\r\n\t_writePersistentState(key, value) {\r\n\t\tif (!this._isPersistenceEnabled(key)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\ttry {\r\n\t\t\twindow.localStorage.setItem(this._getPersistenceStorageKey(key), String(value ?? ''));\r\n\t\t} catch (error) {\r\n\t\t\t// Ignore storage errors.\r\n\t\t}\r\n\t}\r\n\r\n\t_isTruthy(value) {\r\n\t\tconst normalized = String(value).toLowerCase().trim();\r\n\t\treturn normalized !== 'false' && normalized !== '0' && normalized !== '';\r\n\t}\r\n\r\n\t_getFields() {\r\n\t\tconst headerFields = Array.from(this._element.querySelectorAll('thead th[data-field]'))\r\n\t\t\t.map((cell) => (cell.getAttribute('data-field') || '').trim())\r\n\t\t\t.filter(Boolean);\r\n\r\n\t\tif (headerFields.length) {\r\n\t\t\treturn headerFields;\r\n\t\t}\r\n\r\n\t\treturn ['sku', 'name', 'category', 'price', 'stock', 'rating'];\r\n\t}\r\n\r\n\t_getBody() {\r\n\t\tif (this._element.tBodies && this._element.tBodies[0]) {\r\n\t\t\treturn this._element.tBodies[0];\r\n\t\t}\r\n\r\n\t\tconst body = document.createElement('tbody');\r\n\t\tthis._element.appendChild(body);\r\n\t\treturn body;\r\n\t}\r\n\r\n\t_getRemoteResponseMode() {\r\n\t\tconst requestOptions = this._params.request || {};\r\n\t\tconst attrResponseMode = this._element.getAttribute('data-request-responsemode');\r\n\t\tconst raw = attrResponseMode !== null ? attrResponseMode : requestOptions.responsemode;\r\n\t\tconst normalized = String(raw || 'data').toLowerCase().trim();\r\n\t\tif (normalized === 'view' || normalized === 'auto') {\r\n\t\t\treturn normalized;\r\n\t\t}\r\n\t\treturn 'data';\r\n\t}\r\n\r\n\t_getRemoteViewParamName() {\r\n\t\tconst requestOptions = this._params.request || {};\r\n\t\tconst attr = this._element.getAttribute('data-request-viewparam');\r\n\t\tconst raw = attr !== null ? attr : requestOptions.viewparam;\r\n\t\tconst normalized = String(raw || '').trim();\r\n\t\treturn normalized || '';\r\n\t}\r\n\r\n\t_getRemoteViewParamValue() {\r\n\t\tconst requestOptions = this._params.request || {};\r\n\t\tconst attr = this._element.getAttribute('data-request-viewvalue');\r\n\t\tconst raw = attr !== null ? attr : requestOptions.viewvalue;\r\n\t\tconst normalized = String(raw || '').trim();\r\n\t\treturn normalized || '';\r\n\t}\r\n\r\n\t_getRemoteFieldsParamName() {\r\n\t\tconst requestOptions = this._params.request || {};\r\n\t\tconst attr = this._element.getAttribute('data-request-fieldsparam');\r\n\t\tconst raw = attr !== null ? attr : requestOptions.fieldsparam;\r\n\t\tconst normalized = String(raw || '').trim();\r\n\t\treturn normalized || '';\r\n\t}\r\n\r\n\t_getRemoteDataRoute() {\r\n\t\tconst filtersRoute = this._getFiltersRoute();\r\n\t\tif (filtersRoute) {\r\n\t\t\treturn filtersRoute;\r\n\t\t}\r\n\t\treturn this._getRoute();\r\n\t}\r\n\r\n\t_getRequestParamMap() {\r\n\t\tconst requestOptions = this._params.request || {};\r\n\t\tconst fromOptions = requestOptions.parammap;\r\n\t\tif (fromOptions && typeof fromOptions === 'object' && !Array.isArray(fromOptions)) {\r\n\t\t\treturn fromOptions;\r\n\t\t}\r\n\r\n\t\tconst attr = this._element.getAttribute('data-request-parammap') || '';\r\n\t\tif (!attr) {\r\n\t\t\treturn {};\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tconst parsed = JSON.parse(attr);\r\n\t\t\tif (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\r\n\t\t\t\treturn parsed;\r\n\t\t\t}\r\n\t\t} catch (error) {\r\n\t\t\treturn {};\r\n\t\t}\r\n\r\n\t\treturn {};\r\n\t}\r\n\r\n\t_mapRemoteRequestParams(params = {}) {\r\n\t\tconst map = this._getRequestParamMap();\r\n\t\tconst result = {};\r\n\t\tObject.keys(params || {}).forEach((key) => {\r\n\t\t\tconst target = Object.prototype.hasOwnProperty.call(map, key)\r\n\t\t\t\t? String(map[key] || '').trim()\r\n\t\t\t\t: key;\r\n\t\t\tconst nextKey = target || key;\r\n\t\t\tresult[nextKey] = params[key];\r\n\t\t});\r\n\t\treturn result;\r\n\t}\r\n\r\n\t_getRequestPath(type) {\r\n\t\tconst requestOptions = this._params.request || {};\r\n\t\tif (type === 'data') {\r\n\t\t\tconst attrData = this._element.getAttribute('data-request-datapath');\r\n\t\t\tconst raw = attrData !== null ? attrData : requestOptions.datapath;\r\n\t\t\treturn String(raw || '').trim();\r\n\t\t}\r\n\t\tif (type === 'meta') {\r\n\t\t\tconst attrMeta = this._element.getAttribute('data-request-metapath');\r\n\t\t\tconst raw = attrMeta !== null ? attrMeta : requestOptions.metapath;\r\n\t\t\treturn String(raw || '').trim();\r\n\t\t}\r\n\t\tif (type === 'view') {\r\n\t\t\tconst attrView = this._element.getAttribute('data-request-viewpath');\r\n\t\t\tconst raw = attrView !== null ? attrView : requestOptions.viewpath;\r\n\t\t\treturn String(raw || '').trim();\r\n\t\t}\r\n\t\treturn '';\r\n\t}\r\n\r\n\t_readPath(source, path) {\r\n\t\tif (!source || typeof source !== 'object') {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\tconst normalized = String(path || '').trim();\r\n\t\tif (!normalized) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\tconst parts = normalized.split('.').map((item) => String(item || '').trim()).filter(Boolean);\r\n\t\tif (!parts.length) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\tlet current = source;\r\n\t\tfor (let i = 0; i < parts.length; i += 1) {\r\n\t\t\tif (!current || typeof current !== 'object' || !Object.prototype.hasOwnProperty.call(current, parts[i])) {\r\n\t\t\t\treturn undefined;\r\n\t\t\t}\r\n\t\t\tcurrent = current[parts[i]];\r\n\t\t}\r\n\t\treturn current;\r\n\t}\r\n\r\n\t_extractRemoteRows(response) {\r\n\t\tconst configured = this._readPath(response, this._getRequestPath('data'));\r\n\t\tif (Array.isArray(configured)) {\r\n\t\t\treturn configured;\r\n\t\t}\r\n\t\treturn Array.isArray(response && response.data) ? response.data : [];\r\n\t}\r\n\r\n\t_extractRemoteMeta(response) {\r\n\t\tconst configured = this._readPath(response, this._getRequestPath('meta'));\r\n\t\tif (configured && typeof configured === 'object' && !Array.isArray(configured)) {\r\n\t\t\treturn configured;\r\n\t\t}\r\n\t\treturn response && typeof response === 'object' && response.meta && typeof response.meta === 'object'\r\n\t\t\t? response.meta\r\n\t\t\t: {};\r\n\t}\r\n\r\n\t_extractRemoteViewRowsHtml(response) {\r\n\t\tif (!response || typeof response !== 'object') {\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\tconst configured = this._readPath(response, this._getRequestPath('view'));\r\n\t\tif (typeof configured === 'string') {\r\n\t\t\treturn configured;\r\n\t\t}\r\n\r\n\t\tif (typeof response.view === 'string') {\r\n\t\t\treturn response.view;\r\n\t\t}\r\n\r\n\t\tconst view = response.view && typeof response.view === 'object' ? response.view : null;\r\n\t\tif (view && typeof view.tbody === 'string') {\r\n\t\t\treturn view.tbody;\r\n\t\t}\r\n\t\tif (view && typeof view.rows === 'string') {\r\n\t\t\treturn view.rows;\r\n\t\t}\r\n\r\n\t\tif (typeof response.tbody === 'string') {\r\n\t\t\treturn response.tbody;\r\n\t\t}\r\n\r\n\t\treturn '';\r\n\t}\r\n\r\n\t_renderRemoteViewIfConfigured(viewRowsHtml, rows) {\r\n\t\tconst mode = this._getRemoteResponseMode();\r\n\t\tconst canUseView = typeof viewRowsHtml === 'string' && viewRowsHtml.trim() !== '';\r\n\t\tconst shouldUseView = mode === 'view' || (mode === 'auto' && canUseView);\r\n\t\tif (!shouldUseView) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!canUseView) {\r\n\t\t\tif (Array.isArray(rows) && rows.length) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tconst message = this._getTableMessage('stateEmpty', 'Ничего нет');\r\n\t\t\tthis._renderStateRow(message, 'empty');\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tconst body = this._getBody();\r\n\t\tbody.innerHTML = viewRowsHtml;\r\n\t\tif (!this._hasRenderableRowsInBody(body)) {\r\n\t\t\tthis._renderStateRow(this._getTableMessage('stateEmpty', 'Ничего нет'), 'empty');\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tthis._setFixedColumnsSuppressed(false);\r\n\t\tthis._clearStateMode();\r\n\t\treturn true;\r\n\t}\r\n\r\n\t_initSorting() {\r\n\t\tconst sortOptions = this._params.sortable || {};\r\n\t\tif (!sortOptions.enable) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst sortableI18n = this._getI18nSection('sortable');\r\n\t\tconst attrMulti = this._element.getAttribute('data-sort-multi');\r\n\t\tconst multiSort = attrMulti === null\r\n\t\t\t? Boolean(sortOptions.multi)\r\n\t\t\t: String(attrMulti).toLowerCase().trim() !== 'false';\r\n\t\tconst attrMultiWithShift = this._element.getAttribute('data-sort-multi-with-shift');\r\n\t\tconst multiSortWithShift = attrMultiWithShift === null\r\n\t\t\t? (sortOptions.multiWithShift !== undefined ? Boolean(sortOptions.multiWithShift) : true)\r\n\t\t\t: String(attrMultiWithShift).toLowerCase().trim() !== 'false';\r\n\t\tconst attrHideUnsortedArrows = this._element.getAttribute('data-sort-hide-unsorted-arrows');\r\n\t\tconst hideUnsortedArrows = attrHideUnsortedArrows === null\r\n\t\t\t? Boolean(sortOptions.hideUnsortedArrows)\r\n\t\t\t: String(attrHideUnsortedArrows).toLowerCase().trim() !== 'false';\r\n\r\n\t\tthis._sortable = new Sortable(this._element, {\r\n\t\t\tinitialField: this._sortState.field,\r\n\t\t\tinitialDir: this._sortState.dir,\r\n\t\t\tascLabel: sortableI18n.ascLabel,\r\n\t\t\tdescLabel: sortableI18n.descLabel,\r\n\t\t\tmultiSort,\r\n\t\t\tmultiSortWithShift,\r\n\t\t\thideUnsortedArrows,\r\n\t\t\tisColumnSortable: (header, index) => {\r\n\t\t\t\tif (!this._isHeaderSortableByConfig(header, index, sortOptions)) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tconst userCheck = typeof sortOptions.isColumnSortable === 'function'\r\n\t\t\t\t\t? Boolean(sortOptions.isColumnSortable(header))\r\n\t\t\t\t\t: true;\r\n\t\t\t\treturn userCheck;\r\n\t\t\t},\r\n\t\t\tonChange: (payload) => this._handleSortChange(payload),\r\n\t\t});\r\n\t\tthis._sortable.init();\r\n\t\tif (this._sortState.sorts && this._sortState.sorts.length) {\r\n\t\t\tthis._sortable.setState({ sorts: this._sortState.sorts });\r\n\t\t}\r\n\t\tthis._refreshStickyAndFixedLayout();\r\n\t}\r\n\r\n\t_initColumnReorder() {\r\n\t\tconst enabled = this._isColumnReorderEnabled();\r\n\t\tthis._columnReorderState.enabled = enabled;\r\n\t\tif (!enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._applyStoredColumnOrder();\r\n\t\tthis._syncColumnReorderHeaders();\r\n\t\tthis._bindColumnReorder();\r\n\t}\r\n\r\n\t_initColumnResize() {\r\n\t\tconst enabled = this._isColumnResizeEnabled();\r\n\t\tthis._columnResizeState.enabled = enabled;\r\n\t\tif (!enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._syncColumnResizeHeaders();\r\n\t\tthis._bindColumnResize();\r\n\t}\r\n\r\n\t_initExpandable() {\r\n\t\tif (!this._isExpandableEnabled()) {\r\n\t\t\tif (this._expandable && typeof this._expandable.destroy === 'function') {\r\n\t\t\t\tthis._expandable.destroy();\r\n\t\t\t}\r\n\t\t\tthis._expandable = null;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst config = this._getExpandableConfig();\r\n\t\tif (this._expandable && typeof this._expandable.destroy === 'function') {\r\n\t\t\tthis._expandable.destroy();\r\n\t\t}\r\n\t\tthis._expandable = new Expandable(this._element, Object.assign({}, config, {\r\n\t\t\tonToggle: (payload) => {\r\n\t\t\t\tthis._emitAction('rowtoggle', payload);\r\n\t\t\t\tthis._emitAction(payload.collapsed ? 'rowcollapse' : 'rowexpand', payload);\r\n\t\t\t\tthis._renderFooterFromCurrentState();\r\n\t\t\t\tthis._refreshStickyAndFixedLayout();\r\n\t\t\t},\r\n\t\t}));\r\n\t\tthis._expandable.init();\r\n\t}\r\n\r\n\t_refreshExpandable() {\r\n\t\tif (!this._expandable || typeof this._expandable.refresh !== 'function') {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._expandable.refresh();\r\n\t}\r\n\r\n\t_isExpandableEnabled() {\r\n\t\tconst options = this._params.expandable || {};\r\n\t\tconst attr = this._element.getAttribute('data-expandable-enable');\r\n\t\tif (attr !== null) {\r\n\t\t\treturn this._isTruthy(attr);\r\n\t\t}\r\n\t\treturn Boolean(options.enable);\r\n\t}\r\n\r\n\t_getExpandableConfig() {\r\n\t\tconst options = this._params.expandable || {};\r\n\t\tconst attrId = this._element.getAttribute('data-expandable-id-attr');\r\n\t\tconst attrParent = this._element.getAttribute('data-expandable-parent-attr');\r\n\t\tconst attrToggle = this._element.getAttribute('data-expandable-toggle-selector');\r\n\t\tconst attrCollapsed = this._element.getAttribute('data-expandable-collapsed');\r\n\r\n\t\treturn {\r\n\t\t\tenable: true,\r\n\t\t\tidAttr: String(attrId !== null ? attrId : options.idAttr || 'data-expand-id').trim() || 'data-expand-id',\r\n\t\t\tparentAttr: String(attrParent !== null ? attrParent : options.parentAttr || 'data-expand-parent-id').trim() || 'data-expand-parent-id',\r\n\t\t\ttoggleSelector: String(attrToggle !== null ? attrToggle : options.toggleSelector || '[data-expand-toggle]').trim() || '[data-expand-toggle]',\r\n\t\t\tcollapsed: attrCollapsed !== null ? this._isTruthy(attrCollapsed) : Boolean(options.collapsed),\r\n\t\t};\r\n\t}\r\n\r\n\r\n\t_isColumnResizeEnabled() {\r\n\t\tconst options = this._params.columnResize || {};\r\n\t\tconst attr = this._element.getAttribute('data-column-resize-enable');\r\n\t\tif (attr !== null) {\r\n\t\t\treturn this._isTruthy(attr);\r\n\t\t}\r\n\t\treturn Boolean(options.enable);\r\n\t}\r\n\r\n\t_syncColumnResizeHeaders() {\r\n\t\tconst headers = this._getHeaderCells();\r\n\t\theaders.forEach((header) => {\r\n\t\t\tif (!header.querySelector('[data-col-resize-handle]')) {\r\n\t\t\t\tconst handle = document.createElement('span');\r\n\t\t\t\thandle.className = 'vgdt-col-resize-handle';\r\n\t\t\t\thandle.setAttribute('data-col-resize-handle', '1');\r\n\t\t\t\thandle.setAttribute('role', 'separator');\r\n\t\t\t\thandle.setAttribute('aria-hidden', 'true');\r\n\t\t\t\theader.appendChild(handle);\r\n\t\t\t}\r\n\t\t\theader.setAttribute('data-col-resize', '1');\r\n\t\t});\r\n\t}\r\n\r\n\t_bindColumnResize() {\r\n\t\tif (this._columnResizeState.bound) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst state = this._columnResizeState;\r\n\r\n\t\tstate.onMouseDown = (event) => {\r\n\t\t\tconst handle = event.target && event.target.closest ? event.target.closest('[data-col-resize-handle]') : null;\r\n\t\t\tif (!handle) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst header = handle.closest('th');\r\n\t\t\tconst index = this._findHeaderIndex(header);\r\n\t\t\tif (index < 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tevent.preventDefault();\r\n\t\t\tstate.active = true;\r\n\t\t\tstate.index = index;\r\n\t\t\tstate.startX = event.clientX;\r\n\t\t\tstate.startWidth = Math.max(1, header.getBoundingClientRect().width || header.offsetWidth || 1);\r\n\t\t\tthis._element.classList.add('is-col-resizing');\r\n\t\t};\r\n\r\n\t\tstate.onMouseMove = (event) => {\r\n\t\t\tif (!state.active || state.index < 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst options = this._params.columnResize || {};\r\n\t\t\tconst minWidth = Math.max(40, this._normalizePositiveInt(options.minwidth, 80));\r\n\t\t\tconst maxWidth = Math.max(minWidth, this._normalizePositiveInt(options.maxwidth, 600));\r\n\t\t\tstate.nextWidth = Math.min(maxWidth, Math.max(minWidth, Math.round(state.startWidth + (event.clientX - state.startX))));\r\n\t\t\tif (state.frame) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (typeof window === 'undefined' || typeof window.requestAnimationFrame !== 'function') {\r\n\t\t\t\tthis._applyColumnWidth(state.index, state.nextWidth);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tstate.frame = window.requestAnimationFrame(() => {\r\n\t\t\t\tstate.frame = 0;\r\n\t\t\t\tif (!state.active || state.index < 0) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tthis._applyColumnWidth(state.index, state.nextWidth);\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tstate.onMouseUp = () => {\r\n\t\t\tif (!state.active) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (state.frame && typeof window !== 'undefined' && typeof window.cancelAnimationFrame === 'function') {\r\n\t\t\t\twindow.cancelAnimationFrame(state.frame);\r\n\t\t\t\tstate.frame = 0;\r\n\t\t\t}\r\n\t\t\tif (state.index >= 0 && state.nextWidth > 0) {\r\n\t\t\t\tthis._applyColumnWidth(state.index, state.nextWidth);\r\n\t\t\t}\r\n\t\t\tstate.active = false;\r\n\t\t\tstate.index = -1;\r\n\t\t\tstate.nextWidth = 0;\r\n\t\t\tthis._element.classList.remove('is-col-resizing');\r\n\t\t\tthis._refreshStickyAndFixedLayout();\r\n\t\t\tthis._emitAction('columnresize', {});\r\n\t\t};\r\n\r\n\t\tthis._element.addEventListener('mousedown', state.onMouseDown);\r\n\t\tdocument.addEventListener('mousemove', state.onMouseMove);\r\n\t\tdocument.addEventListener('mouseup', state.onMouseUp);\r\n\t\tstate.bound = true;\r\n\t}\r\n\r\n\t_applyColumnWidth(index, widthPx) {\r\n\t\tconst sections = [];\r\n\t\tif (this._element.tHead) {\r\n\t\t\tsections.push(this._element.tHead);\r\n\t\t}\r\n\t\tif (this._element.tBodies && this._element.tBodies.length) {\r\n\t\t\tsections.push(...Array.from(this._element.tBodies));\r\n\t\t}\r\n\t\tif (this._element.tFoot) {\r\n\t\t\tsections.push(this._element.tFoot);\r\n\t\t}\r\n\r\n\t\tsections.forEach((section) => {\r\n\t\t\tArray.from(section.rows || []).forEach((row) => {\r\n\t\t\t\tconst cell = row.cells && row.cells[index] ? row.cells[index] : null;\r\n\t\t\t\tif (!cell) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tcell.style.width = `${widthPx}px`;\r\n\t\t\t\tcell.style.minWidth = `${widthPx}px`;\r\n\t\t\t\tcell.style.maxWidth = `${widthPx}px`;\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\t_isColumnReorderEnabled() {\r\n\t\tconst options = this._params.columnReorder || {};\r\n\t\tconst attr = this._element.getAttribute('data-column-reorder-enable');\r\n\t\tif (attr !== null) {\r\n\t\t\tconst normalized = String(attr).toLowerCase().trim();\r\n\t\t\treturn normalized !== 'false' && normalized !== '0';\r\n\t\t}\r\n\t\treturn Boolean(options.enable);\r\n\t}\r\n\r\n\t_isColumnReorderPersistEnabled() {\r\n\t\tconst options = this._params.columnReorder || {};\r\n\t\tconst attr = this._element.getAttribute('data-column-reorder-persist');\r\n\t\tif (attr !== null) {\r\n\t\t\tconst normalized = String(attr).toLowerCase().trim();\r\n\t\t\treturn normalized !== 'false' && normalized !== '0';\r\n\t\t}\r\n\t\treturn Boolean(options.persist);\r\n\t}\r\n\r\n\t_getColumnReorderStorageKey() {\r\n\t\tconst options = this._params.columnReorder || {};\r\n\t\tconst attrStorageKey = this._element.getAttribute('data-column-reorder-storage-key') || '';\r\n\t\tconst explicit = String(options.storageKey || attrStorageKey).trim();\r\n\t\tif (explicit) {\r\n\t\t\treturn explicit;\r\n\t\t}\r\n\t\treturn `${this._getPerPageStorageKey()}:columnOrder`;\r\n\t}\r\n\r\n\t_bindColumnReorder() {\r\n\t\tif (this._columnReorderState.bound) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._columnReorderState.onDragStart = (event) => {\r\n\t\t\tconst th = event.target && event.target.closest ? event.target.closest('th[data-col-reorder=\"1\"]') : null;\r\n\t\t\tif (!th || !this._element.contains(th)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (this._isHeaderFixedForColumnReorder(th)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst fromIndex = this._findHeaderIndex(th);\r\n\t\t\tif (fromIndex < 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tthis._columnReorderState.fromIndex = fromIndex;\r\n\t\t\tthis._columnReorderState.toIndex = fromIndex;\r\n\t\t\tthis._columnReorderState.isDragging = true;\r\n\t\t\tthis._element.classList.add('is-col-dragging');\r\n\t\t\tth.setAttribute('data-col-dragging', '1');\r\n\r\n\t\t\tif (event.dataTransfer) {\r\n\t\t\t\tevent.dataTransfer.effectAllowed = 'move';\r\n\t\t\t\ttry {\r\n\t\t\t\t\tevent.dataTransfer.setData('text/plain', String(fromIndex));\r\n\t\t\t\t} catch (error) {\r\n\t\t\t\t\t// Ignore setData errors.\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tthis._columnReorderState.onDragOver = (event) => {\r\n\t\t\tif (!this._columnReorderState.isDragging) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst th = event.target && event.target.closest ? event.target.closest('th[data-col-reorder=\"1\"]') : null;\r\n\t\t\tif (!th || !this._element.contains(th)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (this._isHeaderFixedForColumnReorder(th)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tevent.preventDefault();\r\n\t\t\tconst toIndex = this._findHeaderIndex(th);\r\n\t\t\tif (toIndex < 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tthis._columnReorderState.toIndex = toIndex;\r\n\t\t\tthis._syncColumnDragOverMarker(toIndex);\r\n\t\t};\r\n\r\n\t\tthis._columnReorderState.onDrop = (event) => {\r\n\t\t\tif (!this._columnReorderState.isDragging) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tevent.preventDefault();\r\n\t\t\tconst th = event.target && event.target.closest ? event.target.closest('th[data-col-reorder=\"1\"]') : null;\r\n\t\t\tif (!th || !this._element.contains(th)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (this._isHeaderFixedForColumnReorder(th)) {\r\n\t\t\t\tthis._resetColumnDragMarkers();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst toIndex = this._findHeaderIndex(th);\r\n\t\t\tif (toIndex < 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst fromIndex = this._columnReorderState.fromIndex;\r\n\t\t\tthis._resetColumnDragMarkers();\r\n\t\t\tthis._finalizeColumnReorder(fromIndex, toIndex);\r\n\t\t};\r\n\r\n\t\tthis._columnReorderState.onDragEnd = () => {\r\n\t\t\tthis._resetColumnDragMarkers();\r\n\t\t};\r\n\r\n\t\tthis._element.addEventListener('dragstart', this._columnReorderState.onDragStart);\r\n\t\tthis._element.addEventListener('dragover', this._columnReorderState.onDragOver);\r\n\t\tthis._element.addEventListener('drop', this._columnReorderState.onDrop);\r\n\t\tthis._element.addEventListener('dragend', this._columnReorderState.onDragEnd);\r\n\t\tthis._columnReorderState.bound = true;\r\n\t}\r\n\r\n\t_syncColumnReorderHeaders() {\r\n\t\tif (!this._columnReorderState.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst headers = this._getHeaderCells();\r\n\t\theaders.forEach((header) => {\r\n\t\t\theader.setAttribute('data-col-reorder', '1');\r\n\t\t\tconst draggable = this._isHeaderFixedForColumnReorder(header) ? 'false' : 'true';\r\n\t\t\theader.setAttribute('draggable', draggable);\r\n\t\t});\r\n\t}\r\n\r\n\t_syncColumnDragOverMarker(index) {\r\n\t\tconst headers = this._getHeaderCells();\r\n\t\theaders.forEach((header, headerIndex) => {\r\n\t\t\tif (headerIndex === index) {\r\n\t\t\t\theader.setAttribute('data-col-drag-over', '1');\r\n\t\t\t} else {\r\n\t\t\t\theader.removeAttribute('data-col-drag-over');\r\n\t\t\t}\r\n\t\t});\r\n\t\tconst cloneHeaders = this._cloneStickyState && this._cloneStickyState.head\r\n\t\t\t? Array.from(this._cloneStickyState.head.querySelectorAll('th'))\r\n\t\t\t: [];\r\n\t\tcloneHeaders.forEach((header, headerIndex) => {\r\n\t\t\tif (headerIndex === index) {\r\n\t\t\t\theader.setAttribute('data-col-drag-over', '1');\r\n\t\t\t} else {\r\n\t\t\t\theader.removeAttribute('data-col-drag-over');\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t_resetColumnDragMarkers() {\r\n\t\tconst headers = this._getHeaderCells();\r\n\t\theaders.forEach((header) => {\r\n\t\t\theader.removeAttribute('data-col-drag-over');\r\n\t\t\theader.removeAttribute('data-col-dragging');\r\n\t\t});\r\n\t\tconst cloneHeaders = this._cloneStickyState && this._cloneStickyState.head\r\n\t\t\t? Array.from(this._cloneStickyState.head.querySelectorAll('th'))\r\n\t\t\t: [];\r\n\t\tcloneHeaders.forEach((header) => {\r\n\t\t\theader.removeAttribute('data-col-drag-over');\r\n\t\t\theader.removeAttribute('data-col-dragging');\r\n\t\t});\r\n\t\tthis._columnReorderState.fromIndex = -1;\r\n\t\tthis._columnReorderState.toIndex = -1;\r\n\t\tthis._columnReorderState.isDragging = false;\r\n\t\tthis._element.classList.remove('is-col-dragging');\r\n\t}\r\n\r\n\t_finalizeColumnReorder(fromIndex, toIndex) {\r\n\t\tif (!Number.isInteger(fromIndex) || !Number.isInteger(toIndex) || fromIndex < 0 || toIndex < 0 || fromIndex === toIndex) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._moveColumn(fromIndex, toIndex);\r\n\t\tthis._normalizeFixedColumnsOrder();\r\n\t\tthis._afterColumnReorder();\r\n\t}\r\n\r\n\t_moveColumn(fromIndex, toIndex) {\r\n\t\tconst sections = [];\r\n\t\tif (this._element.tHead) {\r\n\t\t\tsections.push(this._element.tHead);\r\n\t\t}\r\n\t\tif (this._element.tBodies && this._element.tBodies.length) {\r\n\t\t\tsections.push(...Array.from(this._element.tBodies));\r\n\t\t}\r\n\t\tif (this._element.tFoot) {\r\n\t\t\tsections.push(this._element.tFoot);\r\n\t\t}\r\n\r\n\t\tsections.forEach((section) => {\r\n\t\t\tArray.from(section.rows || []).forEach((row) => {\r\n\t\t\t\tconst cells = Array.from(row.cells || []);\r\n\t\t\t\tif (fromIndex < 0 || fromIndex >= cells.length || toIndex < 0 || toIndex >= cells.length) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tconst movingCell = cells[fromIndex];\r\n\t\t\t\tconst referenceCell = fromIndex < toIndex ? cells[toIndex].nextSibling : cells[toIndex];\r\n\t\t\t\trow.insertBefore(movingCell, referenceCell || null);\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\t_afterColumnReorder() {\r\n\t\tthis._fields = this._getFields();\r\n\r\n\t\tconst normalizedSorts = this._getNormalizedSorts(this._sortState.sorts || []);\r\n\t\tconst primarySort = normalizedSorts[0] || null;\r\n\t\tthis._sortState = {\r\n\t\t\tfield: primarySort ? primarySort.field : '',\r\n\t\t\tdir: primarySort ? primarySort.dir : this._normalizeSortDir(this._sortState.dir),\r\n\t\t\tcolumnIndex: primarySort ? primarySort.columnIndex : -1,\r\n\t\t\tsorts: normalizedSorts,\r\n\t\t};\r\n\r\n\t\tif (this._sortable && typeof this._sortable.refresh === 'function') {\r\n\t\t\tthis._sortable.refresh({ sorts: normalizedSorts });\r\n\t\t}\r\n\r\n\t\tthis._syncColumnReorderHeaders();\r\n\t\tthis._refreshStickyAndFixedLayout();\r\n\t\tthis._syncUrlState();\r\n\t\tthis._storeColumnOrder();\r\n\t\tconst order = this._getCurrentColumnOrder();\r\n\t\tthis._emitAction('columnreorder', { order });\r\n\t}\r\n\r\n\t_getCurrentColumnOrder() {\r\n\t\treturn this._getHeaderCells()\r\n\t\t\t.map((header) => String(header.getAttribute('data-field') || '').trim())\r\n\t\t\t.filter(Boolean);\r\n\t}\r\n\r\n\t_storeColumnOrder() {\r\n\t\tif (!this._isColumnReorderPersistEnabled()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst order = this._getCurrentColumnOrder();\r\n\t\tif (!order.length) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\ttry {\r\n\t\t\twindow.localStorage.setItem(this._getColumnReorderStorageKey(), order.join(','));\r\n\t\t} catch (error) {\r\n\t\t\t// Ignore storage errors.\r\n\t\t}\r\n\t}\r\n\r\n\t_readStoredColumnOrder() {\r\n\t\tif (!this._isColumnReorderPersistEnabled()) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tconst raw = String(window.localStorage.getItem(this._getColumnReorderStorageKey()) || '').trim();\r\n\t\t\tif (!raw) {\r\n\t\t\t\treturn [];\r\n\t\t\t}\r\n\t\t\treturn raw.split(',').map((item) => item.trim()).filter(Boolean);\r\n\t\t} catch (error) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\t}\r\n\r\n\t_applyStoredColumnOrder() {\r\n\t\tconst order = this._readStoredColumnOrder();\r\n\t\tif (!order.length) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet changed = false;\r\n\t\torder.forEach((field, targetIndex) => {\r\n\t\t\tconst currentIndex = this._findHeaderIndexByField(field);\r\n\t\t\tif (currentIndex < 0 || currentIndex === targetIndex) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tthis._moveColumn(currentIndex, targetIndex);\r\n\t\t\tchanged = true;\r\n\t\t});\r\n\t\tif (this._normalizeFixedColumnsOrder()) {\r\n\t\t\tchanged = true;\r\n\t\t}\r\n\r\n\t\tif (changed) {\r\n\t\t\tthis._afterColumnReorder();\r\n\t\t}\r\n\t}\r\n\r\n\t_isHeaderFixedForColumnReorder(header) {\r\n\t\tif (!header) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tconst fixedSide = String(header.getAttribute('data-fixed-side') || '').toLowerCase().trim();\r\n\t\tif (fixedSide === 'left' || fixedSide === 'right') {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tconst fixedAttr = String(header.getAttribute('data-fixed') || '').toLowerCase().trim();\r\n\t\tconst fixedColumnAttr = String(header.getAttribute('data-fixed-column') || '').toLowerCase().trim();\r\n\t\tif (fixedAttr === 'left' || fixedAttr === 'right' || fixedColumnAttr === 'left' || fixedColumnAttr === 'right') {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tconst index = this._findHeaderIndex(header);\r\n\t\tif (index < 0) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tconst fixed = this._getFixedColumnsByHeaders(this._getHeaderCells(), {\r\n\t\t\tparseTableAttr: true,\r\n\t\t\tfallbackByPosition: true,\r\n\t\t});\r\n\t\treturn fixed.left.includes(index) || fixed.right.includes(index);\r\n\t}\r\n\r\n\t_normalizeFixedColumnsOrder() {\r\n\t\tconst headers = this._getHeaderCells();\r\n\t\tif (!headers.length) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst fixed = this._getFixedColumnsByHeaders(headers, {\r\n\t\t\tparseTableAttr: true,\r\n\t\t\tfallbackByPosition: true,\r\n\t\t});\r\n\t\tif (!fixed.left.length && !fixed.right.length) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst leftHeaders = fixed.left.map((index) => headers[index]).filter(Boolean);\r\n\t\tconst rightHeaders = fixed.right.map((index) => headers[index]).filter(Boolean);\r\n\t\tlet changed = false;\r\n\t\tlet targetLeft = 0;\r\n\t\tleftHeaders.forEach((header) => {\r\n\t\t\tconst currentIndex = this._findHeaderIndex(header);\r\n\t\t\tif (currentIndex >= 0 && currentIndex !== targetLeft) {\r\n\t\t\t\tthis._moveColumn(currentIndex, targetLeft);\r\n\t\t\t\tchanged = true;\r\n\t\t\t}\r\n\t\t\ttargetLeft += 1;\r\n\t\t});\r\n\r\n\t\tlet targetRight = this._getHeaderCells().length - 1;\r\n\t\tfor (let index = rightHeaders.length - 1; index >= 0; index -= 1) {\r\n\t\t\tconst header = rightHeaders[index];\r\n\t\t\tconst currentIndex = this._findHeaderIndex(header);\r\n\t\t\tif (currentIndex >= 0 && currentIndex !== targetRight) {\r\n\t\t\t\tthis._moveColumn(currentIndex, targetRight);\r\n\t\t\t\tchanged = true;\r\n\t\t\t}\r\n\t\t\ttargetRight -= 1;\r\n\t\t}\r\n\r\n\t\treturn changed;\r\n\t}\r\n\r\n\t_initSearch() {\r\n\t\tif (!this._isRemote) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst searchOptions = this._params.search || {};\r\n\t\tif (!this._isSearchEnabled()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst inputSelector = this._getSearchInputSelector();\r\n\t\tif (!inputSelector) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst attrParam = this._element.getAttribute('data-search-param') || '';\r\n\t\tconst param = String(searchOptions.param || attrParam || 'q').trim() || 'q';\r\n\t\tif (Object.prototype.hasOwnProperty.call(this._remoteParams, param)) {\r\n\t\t\tconst input = this._getSearchInputNode(inputSelector);\r\n\t\t\tif (input && input.value !== this._remoteParams[param]) {\r\n\t\t\t\tinput.value = this._remoteParams[param];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (this._search && typeof this._search.destroy === 'function') {\r\n\t\t\tthis._search.destroy();\r\n\t\t}\r\n\r\n\t\tthis._search = new Search({\r\n\t\t\tenabled: true,\r\n\t\t\tdebounceMs: searchOptions.debounce,\r\n\t\t\tinputSelector,\r\n\t\t\tparam,\r\n\t\t\tonSearch: ({ value, param: searchParam }) => {\r\n\t\t\t\tconst next = {};\r\n\t\t\t\tnext[searchParam] = value;\r\n\t\t\t\tconst filtersState = this._getCurrentFiltersEventState();\r\n\t\t\t\tconst emitFullContext = this._isFiltersEmitFullContextEnabled();\r\n\t\t\t\tconst isSearched = this._isSearchedValue(value);\r\n\t\t\t\tthis._emitAction('search', {\r\n\t\t\t\t\tparam: searchParam,\r\n\t\t\t\t\tvalue,\r\n\t\t\t\t});\r\n\t\t\t\tif (!this._isRemote || !emitFullContext) {\r\n\t\t\t\t\tthis._emitAction('filterschange', {\r\n\t\t\t\t\t\tfilters: Object.assign({}, filtersState.filters || {}),\r\n\t\t\t\t\t\tparams: Object.assign({}, filtersState.params || {}),\r\n\t\t\t\t\t\tfields: Array.isArray(filtersState.fields) ? filtersState.fields.slice() : [],\r\n\t\t\t\t\t\tmeta: Object.assign({}, filtersState.meta || {}),\r\n\t\t\t\t\t\tphase: 'change',\r\n\t\t\t\t\t\tisFiltered: this._isFilteredState(filtersState) || isSearched,\r\n\t\t\t\t\t\tisSearched,\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\tthis.updateRemoteParams(next, {\r\n\t\t\t\t\treplace: false,\r\n\t\t\t\t\tresetPage: true,\r\n\t\t\t\t\treload: true,\r\n\t\t\t\t\ttrigger: emitFullContext ? 'filterschange' : '',\r\n\t\t\t\t\tfiltersState: emitFullContext ? filtersState : null,\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t});\r\n\t\tthis._search.init();\r\n\t}\r\n\r\n\t_getSearchInputSelector() {\r\n\t\tconst searchOptions = this._params.search || {};\r\n\t\tconst attrSelector = this._element.getAttribute('data-search-input') || '';\r\n\t\treturn String(searchOptions.input || attrSelector).trim();\r\n\t}\r\n\r\n\t_getSearchInputNode(selector = '') {\r\n\t\tconst nextSelector = String(selector || this._getSearchInputSelector() || '').trim();\r\n\t\tif (!nextSelector) {\r\n\t\t\tthis._searchInputCacheSelector = '';\r\n\t\t\tthis._searchInputCacheNode = null;\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tconst shouldRefresh = this._searchInputCacheSelector !== nextSelector\r\n\t\t\t|| !this._searchInputCacheNode\r\n\t\t\t|| !this._searchInputCacheNode.isConnected;\r\n\t\tif (shouldRefresh) {\r\n\t\t\tthis._searchInputCacheSelector = nextSelector;\r\n\t\t\tthis._searchInputCacheNode = document.querySelector(nextSelector);\r\n\t\t}\r\n\t\treturn this._searchInputCacheNode;\r\n\t}\r\n\r\n\t_initFilters() {\r\n\t\tconst filterOptions = this._params.filters || {};\r\n\t\tif (!this._isFiltersEnabled()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst formNode = filterOptions.form && filterOptions.form.nodeType === 1\r\n\t\t\t? filterOptions.form\r\n\t\t\t: null;\r\n\t\tconst attrSelector = this._element.getAttribute('data-filters-form') || '';\r\n\t\tconst formSelector = formNode\r\n\t\t\t? ''\r\n\t\t\t: (typeof filterOptions.form === 'string'\r\n\t\t\t\t? String(filterOptions.form).trim()\r\n\t\t\t\t: String(attrSelector).trim());\r\n\t\tif (!formNode && !formSelector) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst attrApplyMode = this._element.getAttribute('data-filters-apply') || '';\r\n\t\tconst applyMode = this._normalizeFiltersApplyMode(filterOptions.apply || attrApplyMode || 'auto');\r\n\t\tthis._writePersistentState('filtersApplyMode', applyMode);\r\n\t\tconst initialValues = this._getInitialFilterValues();\r\n\t\tconst button = filterOptions.button && typeof filterOptions.button === 'object'\r\n\t\t\t? filterOptions.button\r\n\t\t\t: {};\r\n\r\n\t\tif (this._filters && typeof this._filters.destroy === 'function') {\r\n\t\t\tthis._filters.destroy();\r\n\t\t}\r\n\r\n\t\tthis._filters = new Filters({\r\n\t\t\tenabled: true,\r\n\t\t\tformSelector,\r\n\t\t\tformNode,\r\n\t\t\tdebounceMs: filterOptions.debounce,\r\n\t\t\tapplyMode,\r\n\t\t\tbutton: {\r\n\t\t\t\tapply: String(\r\n\t\t\t\t\tbutton.apply\r\n\t\t\t\t\t|| this._element.getAttribute('data-filters-button-apply')\r\n\t\t\t\t\t|| '[data-filter-apply]'\r\n\t\t\t\t).trim(),\r\n\t\t\t\treset: String(\r\n\t\t\t\t\tbutton.reset\r\n\t\t\t\t\t|| this._element.getAttribute('data-filters-button-reset')\r\n\t\t\t\t\t|| '[data-filter-reset]'\r\n\t\t\t\t).trim(),\r\n\t\t\t},\r\n\t\t\tfieldAttr: filterOptions.fieldAttr,\r\n\t\t\tpartAttr: filterOptions.partAttr,\r\n\t\t\ttypeAttr: filterOptions.typeAttr,\r\n\t\t\tvalueAttr: filterOptions.valueAttr,\r\n\t\t\toperatorAttr: filterOptions.operatorAttr,\r\n\t\t\tdefaultOperator: filterOptions.defaultOperator,\r\n\t\t\tskipEmpty: filterOptions.skipEmpty,\r\n\t\t\ttrimValues: filterOptions.trimValues,\r\n\t\t\tinitialValues,\r\n\t\t\tonReset: () => {\r\n\t\t\t\tconst searchSelector = this._getSearchInputSelector();\r\n\t\t\t\tif (!searchSelector) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tconst searchInput = this._getSearchInputNode(searchSelector);\r\n\t\t\t\tif (searchInput) {\r\n\t\t\t\t\tsearchInput.value = '';\r\n\t\t\t\t}\r\n\t\t\t\tconst searchParam = this._getSearchParamName();\r\n\t\t\t\tif (!searchParam) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tdelete this._remoteParams[searchParam];\r\n\t\t\t},\r\n\t\t\tonChange: (state) => {\r\n\t\t\t\tconst normalizedState = this._normalizeFiltersEventState(state);\r\n\t\t\t\tthis._activeFilters = Object.assign({}, normalizedState.filters || {});\r\n\t\t\t\tif (!this._isRemote || !this._isFiltersEmitFullContextEnabled()) {\r\n\t\t\t\t\tthis._emitAction('filterschange', {\r\n\t\t\t\t\t\tfilters: Object.assign({}, normalizedState.filters || {}),\r\n\t\t\t\t\t\tparams: Object.assign({}, normalizedState.params || {}),\r\n\t\t\t\t\t\tfields: Array.isArray(normalizedState.fields) ? normalizedState.fields.slice() : [],\r\n\t\t\t\t\t\tmeta: Object.assign({}, normalizedState.meta || {}),\r\n\t\t\t\t\t\tphase: 'change',\r\n\t\t\t\t\t\tisFiltered: this._isFilteredState(normalizedState) || this._isSearchActiveFromParams(this._remoteParams || {}),\r\n\t\t\t\t\t\tisSearched: this._isSearchActiveFromParams(this._remoteParams || {}),\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\tthis._handleFiltersStateChange(normalizedState);\r\n\t\t\t},\r\n\t\t});\r\n\t\tthis._filters.init();\r\n\t}\r\n\r\n\t_handleFiltersStateChange(state) {\r\n\t\tconst rawNextParams = state && state.params && typeof state.params === 'object'\r\n\t\t\t? state.params\r\n\t\t\t: {};\r\n\t\tconst nextParams = this._buildFilterRemoteParamsPatch(rawNextParams);\r\n\t\tconst filterOptions = this._params.filters || {};\r\n\t\tconst resetPage = filterOptions.resetPageOnChange === undefined\r\n\t\t\t? true\r\n\t\t\t: Boolean(filterOptions.resetPageOnChange);\r\n\r\n\t\tif (this._isRemote) {\r\n\t\t\tconst emitFullContext = this._isFiltersEmitFullContextEnabled();\r\n\t\t\tthis.updateRemoteParams(nextParams, {\r\n\t\t\t\treplace: false,\r\n\t\t\t\tresetPage,\r\n\t\t\t\treload: true,\r\n\t\t\t\ttrigger: emitFullContext ? 'filterschange' : '',\r\n\t\t\t\tfiltersState: emitFullContext ? this._normalizeFiltersEventState(state) : null,\r\n\t\t\t});\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._remoteParams = Object.assign({}, nextParams);\r\n\t\tthis._applyLocalFilters();\r\n\t\tif (this._isPaginationEnabled() && this._pagination) {\r\n\t\t\tconst perPage = this._pageState.perPage || this._normalizePositiveInt(this._params.pagination.perPage, 10);\r\n\t\t\tconst nextPage = resetPage ? 1 : this._pageState.page;\r\n\t\t\tconst totalPages = this._getTotalPages(perPage);\r\n\t\t\tconst safePage = Math.max(1, Math.min(nextPage, totalPages));\r\n\t\t\tthis._pageState = { page: safePage, perPage };\r\n\t\t\tthis._pagination.setMeta({\r\n\t\t\t\tpage: safePage,\r\n\t\t\t\tperPage,\r\n\t\t\t\ttotalPages,\r\n\t\t\t});\r\n\t\t\tthis._renderPageRows(safePage, perPage);\r\n\t\t} else {\r\n\t\t\tconst page = this._pageState.page || 1;\r\n\t\t\tconst perPage = this._pageState.perPage || this._normalizePositiveInt(this._params.pagination.perPage, 10);\r\n\t\t\tthis._renderPageRows(page, perPage);\r\n\t\t}\r\n\t\tthis._refreshStickyAndFixedLayout();\r\n\t\tthis._syncUrlState();\r\n\t}\r\n\r\n\t_buildFilterRemoteParamsPatch(nextFilterParams = {}) {\r\n\t\tconst source = nextFilterParams && typeof nextFilterParams === 'object'\r\n\t\t\t? nextFilterParams\r\n\t\t\t: {};\r\n\t\tconst patch = {};\r\n\t\tconst keys = this._getFilterFieldKeys();\r\n\r\n\t\tkeys.forEach((field) => {\r\n\t\t\tconst normalizedField = String(field || '').trim();\r\n\t\t\tif (!normalizedField) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (Object.prototype.hasOwnProperty.call(source, normalizedField)) {\r\n\t\t\t\tpatch[normalizedField] = source[normalizedField];\r\n\t\t\t} else {\r\n\t\t\t\tpatch[normalizedField] = '';\r\n\t\t\t}\r\n\r\n\t\t\tconst operatorKey = `${normalizedField}_op`;\r\n\t\t\tif (Object.prototype.hasOwnProperty.call(source, operatorKey)) {\r\n\t\t\t\tpatch[operatorKey] = source[operatorKey];\r\n\t\t\t} else {\r\n\t\t\t\tpatch[operatorKey] = '';\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tObject.keys(source).forEach((key) => {\r\n\t\t\tif (!Object.prototype.hasOwnProperty.call(patch, key)) {\r\n\t\t\t\tpatch[key] = source[key];\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn patch;\r\n\t}\r\n\r\n\t_normalizeFiltersEventState(state) {\r\n\t\tconst source = state && typeof state === 'object' ? state : {};\r\n\t\tconst filters = source.filters && typeof source.filters === 'object'\r\n\t\t\t? Object.assign({}, source.filters)\r\n\t\t\t: {};\r\n\t\tconst params = source.params && typeof source.params === 'object'\r\n\t\t\t? Object.assign({}, source.params)\r\n\t\t\t: {};\r\n\t\tconst explicitFields = Array.isArray(source.fields)\r\n\t\t\t? source.fields.slice().map((field) => String(field || '').trim()).filter(Boolean)\r\n\t\t\t: Object.keys(filters);\r\n\t\tconst inferredFromParams = Object.keys(params)\r\n\t\t\t.map((key) => String(key || '').trim())\r\n\t\t\t.filter((key) => key !== '' && !/_op$/i.test(key))\r\n\t\t\t.filter((key) => this._isNonEmptyFilterParamValue(params[key]))\r\n\t\t\t.map((key) => key.replace(/_value$/i, ''));\r\n\t\tconst fields = Array.from(new Set(explicitFields.concat(inferredFromParams)));\r\n\t\tconst meta = source.meta && typeof source.meta === 'object'\r\n\t\t\t? Object.assign({}, source.meta)\r\n\t\t\t: {};\r\n\t\tif (!Object.prototype.hasOwnProperty.call(meta, 'count')) {\r\n\t\t\tmeta.count = fields.length;\r\n\t\t}\r\n\t\treturn {\r\n\t\t\tfilters,\r\n\t\t\tparams,\r\n\t\t\tfields,\r\n\t\t\tmeta,\r\n\t\t};\r\n\t}\r\n\r\n\t_isFiltersEmitFullContextEnabled() {\r\n\t\tconst filters = this._params.filters || {};\r\n\t\tconst attr = this._element.getAttribute('data-filters-emit-full-context');\r\n\t\tif (attr !== null) {\r\n\t\t\treturn this._isTruthy(attr);\r\n\t\t}\r\n\t\tif (filters.emitFullContext === undefined || filters.emitFullContext === null) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn Boolean(filters.emitFullContext);\r\n\t}\r\n\r\n\t_isFilteredState(state) {\r\n\t\tconst normalizedState = this._normalizeFiltersEventState(state);\r\n\t\tif (normalizedState.fields.length > 0) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn Object.keys(normalizedState.params || {})\r\n\t\t\t.some((key) => {\r\n\t\t\t\tconst normalizedKey = String(key || '').trim();\r\n\t\t\t\tif (!normalizedKey || /_op$/i.test(normalizedKey)) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\treturn this._isNonEmptyFilterParamValue(normalizedState.params[normalizedKey]);\r\n\t\t\t});\r\n\t}\r\n\r\n\t_getCurrentFiltersEventState() {\r\n\t\tlet state = null;\r\n\t\tif (this._filters && typeof this._filters.getState === 'function') {\r\n\t\t\tstate = this._normalizeFiltersEventState(this._filters.getState());\r\n\t\t\tthis._activeFilters = Object.assign({}, state.filters || {});\r\n\t\t}\r\n\r\n\t\tif (!state) {\r\n\t\t\tconst params = this._extractFilterParamsFromRemoteParams(this._remoteParams || {});\r\n\t\t\tstate = this._normalizeFiltersEventState({\r\n\t\t\t\tfilters: Object.assign({}, this._activeFilters || {}),\r\n\t\t\t\tparams,\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn state;\r\n\t}\r\n\r\n\t_extractFilterParamsFromRemoteParams(sourceParams = {}) {\r\n\t\tconst source = sourceParams && typeof sourceParams === 'object'\r\n\t\t\t? sourceParams\r\n\t\t\t: {};\r\n\t\tconst next = {};\r\n\t\tconst keySet = new Set();\r\n\r\n\t\tthis._getFilterFieldKeys().forEach((key) => keySet.add(key));\r\n\t\tObject.keys(this._activeFilters || {}).forEach((key) => keySet.add(String(key || '').trim()));\r\n\r\n\t\tkeySet.forEach((key) => {\r\n\t\t\tconst normalizedKey = String(key || '').trim();\r\n\t\t\tif (!normalizedKey) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (Object.prototype.hasOwnProperty.call(source, normalizedKey)) {\r\n\t\t\t\tnext[normalizedKey] = source[normalizedKey];\r\n\t\t\t}\r\n\t\t\tconst operatorKey = `${normalizedKey}_op`;\r\n\t\t\tif (Object.prototype.hasOwnProperty.call(source, operatorKey)) {\r\n\t\t\t\tnext[operatorKey] = source[operatorKey];\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn next;\r\n\t}\r\n\r\n\t_getFiltersRequestMetaIfActive() {\r\n\t\tconst filtersState = this._getCurrentFiltersEventState();\r\n\t\tif (!this._isFilteredState(filtersState)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn {\r\n\t\t\ttrigger: 'filterschange',\r\n\t\t\tfiltersState,\r\n\t\t};\r\n\t}\r\n\r\n\t_isNonEmptyFilterParamValue(value) {\r\n\t\tif (Array.isArray(value)) {\r\n\t\t\treturn value.some((item) => String(item || '').trim() !== '');\r\n\t\t}\r\n\t\treturn value !== undefined && value !== null && String(value).trim() !== '';\r\n\t}\r\n\r\n\t_isSearchedValue(value) {\r\n\t\treturn this._isNonEmptyFilterParamValue(value);\r\n\t}\r\n\r\n\t_isSearchActiveFromParams(sourceParams = {}) {\r\n\t\tif (!this._isSearchEnabled()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tconst params = sourceParams && typeof sourceParams === 'object'\r\n\t\t\t? sourceParams\r\n\t\t\t: {};\r\n\t\tconst searchParam = this._getSearchParamName();\r\n\t\tif (!searchParam || !Object.prototype.hasOwnProperty.call(params, searchParam)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn this._isSearchedValue(params[searchParam]);\r\n\t}\r\n\r\n\t_isSearchEnabled() {\r\n\t\tconst search = this._params.search || {};\r\n\t\tif (search.enable !== undefined && search.enable !== null) {\r\n\t\t\tconst normalized = String(search.enable).toLowerCase().trim();\r\n\t\t\tif (normalized === 'true' || normalized === '1') {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tif (normalized === 'false' || normalized === '0') {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn Boolean(search.enable);\r\n\t\t}\r\n\r\n\t\tconst attr = this._element.getAttribute('data-search-enable');\r\n\t\tif (attr !== null) {\r\n\t\t\tconst normalized = String(attr).toLowerCase().trim();\r\n\t\t\treturn normalized !== 'false' && normalized !== '0';\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\t_isFiltersEnabled() {\r\n\t\tconst filters = this._params.filters || {};\r\n\t\tif (filters.enable !== undefined && filters.enable !== null) {\r\n\t\t\tconst normalized = String(filters.enable).toLowerCase().trim();\r\n\t\t\tif (normalized === 'true' || normalized === '1') {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tif (normalized === 'false' || normalized === '0') {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn Boolean(filters.enable);\r\n\t\t}\r\n\r\n\t\tconst attr = this._element.getAttribute('data-filters-enable');\r\n\t\tif (attr !== null) {\r\n\t\t\tconst normalized = String(attr).toLowerCase().trim();\r\n\t\t\treturn normalized !== 'false' && normalized !== '0';\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\t_normalizeFiltersApplyMode(value) {\r\n\t\tconst normalized = String(value || 'auto').toLowerCase().trim();\r\n\t\treturn normalized === 'manual' ? 'manual' : 'auto';\r\n\t}\r\n\r\n\t_handleSortChange(payload) {\r\n\t\tconst normalizedSorts = this._getNormalizedSorts(Array.isArray(payload.sorts) ? payload.sorts : []);\r\n\t\tconst primarySort = normalizedSorts[0] || null;\r\n\t\tthis._sortState = {\r\n\t\t\tfield: primarySort ? primarySort.field : (payload.field || ''),\r\n\t\t\tdir: primarySort ? primarySort.dir : this._normalizeSortDir(payload.dir),\r\n\t\t\tcolumnIndex: primarySort && Number.isInteger(primarySort.columnIndex) ? primarySort.columnIndex : (Number.isInteger(payload.columnIndex) ? payload.columnIndex : -1),\r\n\t\t\tsorts: normalizedSorts,\r\n\t\t};\r\n\t\tthis._emitAction('sortchange', {\r\n\t\t\tsort: this._sortState.field,\r\n\t\t\tdir: this._sortState.dir,\r\n\t\t\tsorts: this._sortState.sorts.slice(),\r\n\t\t\tisRemote: this._isRemote,\r\n\t\t});\r\n\r\n\t\tif (this._isRemote) {\r\n\t\t\tconst perPage = this._pageState.perPage || this._normalizePositiveInt(this._params.pagination.perPage, 10);\r\n\t\t\tthis._pageState = { page: 1, perPage };\r\n\t\t\tthis._loadRemotePage(1, perPage);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!this._sortState.sorts.length && this._sortState.columnIndex < 0) {\r\n\t\t\tthis._resetLocalRowsOrder();\r\n\t\t} else {\r\n\t\t\tthis._sortLocalRows(this._sortState.sorts.length ? this._sortState.sorts : [{\r\n\t\t\t\tfield: this._sortState.field,\r\n\t\t\t\tdir: this._sortState.dir,\r\n\t\t\t\tcolumnIndex: this._sortState.columnIndex,\r\n\t\t\t}]);\r\n\t\t}\r\n\r\n\t\tif (this._isPaginationEnabled() && this._pagination) {\r\n\t\t\tconst perPage = this._pageState.perPage || this._normalizePositiveInt(this._params.pagination.perPage, 10);\r\n\t\t\tconst totalPages = this._getTotalPages(perPage);\r\n\t\t\tthis._pageState = { page: 1, perPage };\r\n\t\t\tthis._storePage(1);\r\n\t\t\tthis._pagination.setMeta({\r\n\t\t\t\tpage: 1,\r\n\t\t\t\tperPage,\r\n\t\t\t\ttotalPages,\r\n\t\t\t});\r\n\t\t\tthis._renderPageRows(1, perPage);\r\n\t\t}\r\n\t\tthis._refreshExpandable();\r\n\t\tthis._renderFooterFromCurrentState();\r\n\t\tthis._refreshStickyAndFixedLayout();\r\n\t\tthis._syncUrlState();\r\n\t}\r\n\r\n\t_sortLocalRows(sortList) {\r\n\t\tif (!this._rows.length) {\r\n\t\t\tthis._rows = this._getTableRows();\r\n\t\t}\r\n\r\n\t\tconst normalizedSorts = this._getNormalizedSorts(sortList);\r\n\t\tif (!normalizedSorts.length || !this._rows.length) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._rows.sort((leftRow, rightRow) => {\r\n\t\t\tfor (let index = 0; index < normalizedSorts.length; index += 1) {\r\n\t\t\t\tconst sort = normalizedSorts[index];\r\n\t\t\t\tconst factor = sort.dir === 'desc' ? -1 : 1;\r\n\t\t\t\tconst columnIndex = sort.columnIndex;\r\n\t\t\t\tif (!Number.isInteger(columnIndex) || columnIndex < 0) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tconst leftValue = leftRow.cells[columnIndex] ? leftRow.cells[columnIndex].textContent : '';\r\n\t\t\t\tconst rightValue = rightRow.cells[columnIndex] ? rightRow.cells[columnIndex].textContent : '';\r\n\t\t\t\tconst compared = this._compareSortableValues(leftValue, rightValue) * factor;\r\n\t\t\t\tif (compared !== 0) {\r\n\t\t\t\t\treturn compared;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn 0;\r\n\t\t});\r\n\r\n\t\tconst body = this._getBody();\r\n\t\tthis._rows.forEach((row) => {\r\n\t\t\tbody.appendChild(row);\r\n\t\t});\r\n\t}\r\n\r\n\t_resetLocalRowsOrder() {\r\n\t\tif (!this._originalRows.length) {\r\n\t\t\tthis._originalRows = this._getTableRows();\r\n\t\t}\r\n\t\tthis._rows = this._originalRows.slice();\r\n\r\n\t\tconst body = this._getBody();\r\n\t\tthis._rows.forEach((row) => {\r\n\t\t\tbody.appendChild(row);\r\n\t\t});\r\n\t}\r\n\r\n\t_applyLocalFilters() {\r\n\t\tif (!this._originalRows.length) {\r\n\t\t\tthis._originalRows = this._getTableRows();\r\n\t\t}\r\n\t\tconst filters = this._activeFilters && typeof this._activeFilters === 'object'\r\n\t\t\t? this._activeFilters\r\n\t\t\t: {};\r\n\t\tconst filterKeys = Object.keys(filters);\r\n\t\tif (!filterKeys.length) {\r\n\t\t\tthis._rows = this._originalRows.slice();\r\n\t\t\tthis._rows.forEach((row) => {\r\n\t\t\t\trow.hidden = false;\r\n\t\t\t});\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst fieldIndexMap = this._getFieldIndexMap();\r\n\t\tconst filteredRows = [];\r\n\t\tthis._originalRows.forEach((row) => {\r\n\t\t\tconst matched = this._rowMatchesFilters(row, filters, fieldIndexMap);\r\n\t\t\trow.hidden = !matched;\r\n\t\t\tif (matched) {\r\n\t\t\t\tfilteredRows.push(row);\r\n\t\t\t}\r\n\t\t});\r\n\t\tthis._rows = filteredRows;\r\n\t}\r\n\r\n\t_getFieldIndexMap() {\r\n\t\tconst map = {};\r\n\t\tthis._getHeaderCells().forEach((header, index) => {\r\n\t\t\tconst field = String(header.getAttribute('data-field') || '').trim();\r\n\t\t\tif (field) {\r\n\t\t\t\tmap[field] = index;\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn map;\r\n\t}\r\n\r\n\t_rowMatchesFilters(row, filters, fieldIndexMap) {\r\n\t\tconst keys = Object.keys(filters || {});\r\n\t\tfor (let i = 0; i < keys.length; i += 1) {\r\n\t\t\tconst key = keys[i];\r\n\t\t\tconst descriptor = filters[key];\r\n\t\t\tif (!descriptor || typeof descriptor !== 'object') {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tconst field = String(descriptor.field || key || '').trim();\r\n\t\t\tconst columnIndex = Object.prototype.hasOwnProperty.call(fieldIndexMap, field)\r\n\t\t\t\t? fieldIndexMap[field]\r\n\t\t\t\t: -1;\r\n\t\t\tif (columnIndex < 0) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tconst cell = row.cells && row.cells[columnIndex] ? row.cells[columnIndex] : null;\r\n\t\t\tconst cellValue = cell ? String(cell.textContent || '').trim() : '';\r\n\t\t\tif (!this._matchesFilterValue(cellValue, descriptor)) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t}\r\n\r\n\t_matchesFilterValue(rawCellValue, descriptor) {\r\n\t\tconst value = descriptor.values && descriptor.values.length\r\n\t\t\t? descriptor.values\r\n\t\t\t: descriptor.value;\r\n\t\tconst operator = String(descriptor.operator || descriptor.type || 'eq').toLowerCase().trim();\r\n\t\tconst left = String(rawCellValue || '');\r\n\r\n\t\tif (Array.isArray(value)) {\r\n\t\t\tconst normalizedValues = value.map((item) => String(item || '').toLowerCase().trim()).filter(Boolean);\r\n\t\t\tif (!normalizedValues.length) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\treturn normalizedValues.includes(left.toLowerCase().trim());\r\n\t\t}\r\n\r\n\t\tconst right = String(value || '');\r\n\t\tif (right === '') {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tconst leftLower = left.toLowerCase();\r\n\t\tconst rightLower = right.toLowerCase();\r\n\t\tconst leftNumber = Number.parseFloat(left.replace(',', '.'));\r\n\t\tconst rightNumber = Number.parseFloat(right.replace(',', '.'));\r\n\t\tconst hasNumbers = Number.isFinite(leftNumber) && Number.isFinite(rightNumber);\r\n\r\n\t\tif (operator === 'contains') {\r\n\t\t\treturn leftLower.includes(rightLower);\r\n\t\t}\r\n\t\tif (operator === 'starts') {\r\n\t\t\treturn leftLower.startsWith(rightLower);\r\n\t\t}\r\n\t\tif (operator === 'ends') {\r\n\t\t\treturn leftLower.endsWith(rightLower);\r\n\t\t}\r\n\t\tif (operator === 'neq') {\r\n\t\t\tif (hasNumbers) {\r\n\t\t\t\treturn leftNumber !== rightNumber;\r\n\t\t\t}\r\n\t\t\treturn leftLower !== rightLower;\r\n\t\t}\r\n\t\tif (operator === 'gt' && hasNumbers) {\r\n\t\t\treturn leftNumber > rightNumber;\r\n\t\t}\r\n\t\tif (operator === 'gte' && hasNumbers) {\r\n\t\t\treturn leftNumber >= rightNumber;\r\n\t\t}\r\n\t\tif (operator === 'lt' && hasNumbers) {\r\n\t\t\treturn leftNumber < rightNumber;\r\n\t\t}\r\n\t\tif (operator === 'lte' && hasNumbers) {\r\n\t\t\treturn leftNumber <= rightNumber;\r\n\t\t}\r\n\t\treturn hasNumbers ? leftNumber === rightNumber : leftLower === rightLower;\r\n\t}\r\n\r\n\t_compareSortableValues(left, right) {\r\n\t\tconst leftNumber = this._extractNumber(left);\r\n\t\tconst rightNumber = this._extractNumber(right);\r\n\r\n\t\tconst leftIsNumber = Number.isFinite(leftNumber);\r\n\t\tconst rightIsNumber = Number.isFinite(rightNumber);\r\n\t\tif (leftIsNumber && rightIsNumber) {\r\n\t\t\treturn leftNumber - rightNumber;\r\n\t\t}\r\n\r\n\t\tconst leftString = String(left || '').trim();\r\n\t\tconst rightString = String(right || '').trim();\r\n\t\treturn leftString.localeCompare(rightString, 'ru', {\r\n\t\t\tnumeric: true,\r\n\t\t\tsensitivity: 'base',\r\n\t\t});\r\n\t}\r\n\r\n\t_extractNumber(value) {\r\n\t\tconst prepared = String(value || '')\r\n\t\t\t.replace(/\\u00A0/g, '')\r\n\t\t\t.replace(/\\s+/g, '')\r\n\t\t\t.replace(',', '.')\r\n\t\t\t.replace(/[^\\d.-]/g, '');\r\n\t\tif (prepared === '' || prepared === '-' || prepared === '.') {\r\n\t\t\treturn NaN;\r\n\t\t}\r\n\t\treturn Number.parseFloat(prepared);\r\n\t}\r\n\r\n\t_getInitialSortState() {\r\n\t\tconst sortOptions = this._params.sortable || {};\r\n\t\tconst requestOptions = this._params.request || {};\r\n\t\tconst requestParams = requestOptions.params || {};\r\n\t\tconst urlParams = this._getUrlParams();\r\n\t\tconst remoteFieldParam = 'sort';\r\n\t\tconst remoteDirParam = 'dir';\r\n\t\tconst field = String(\r\n\t\t\tsortOptions.initialField\r\n\t\t\t|| urlParams.get(remoteFieldParam)\r\n\t\t\t|| requestParams[remoteFieldParam]\r\n\t\t\t|| this._element.getAttribute('data-sort')\r\n\t\t\t|| ''\r\n\t\t).trim();\r\n\t\tconst dirRaw = (\r\n\t\t\tsortOptions.initialDir\r\n\t\t\t|| urlParams.get(remoteDirParam)\r\n\t\t\t|| requestParams[remoteDirParam]\r\n\t\t\t|| this._element.getAttribute('data-dir')\r\n\t\t\t|| 'asc'\r\n\t\t);\r\n\t\tconst dir = this._normalizeSortDir(dirRaw);\r\n\t\tconst sorts = this._parseSortsFromStrings(field, dirRaw);\r\n\r\n\t\treturn {\r\n\t\t\tfield,\r\n\t\t\tdir,\r\n\t\t\tcolumnIndex: sorts[0] && Number.isInteger(sorts[0].columnIndex) ? sorts[0].columnIndex : -1,\r\n\t\t\tsorts,\r\n\t\t};\r\n\t}\r\n\r\n\t_parseSortsFromStrings(sortRaw, dirRaw) {\r\n\t\tconst fields = String(sortRaw || '')\r\n\t\t\t.split(',')\r\n\t\t\t.map((item) => item.trim())\r\n\t\t\t.filter(Boolean);\r\n\t\tconst dirs = String(dirRaw || '')\r\n\t\t\t.split(',')\r\n\t\t\t.map((item) => this._normalizeSortDir(item));\r\n\r\n\t\tconst sorts = [];\r\n\t\tfields.forEach((field, index) => {\r\n\t\t\tconst columnIndex = this._findHeaderIndexByField(field);\r\n\t\t\tsorts.push({\r\n\t\t\t\tfield,\r\n\t\t\t\tdir: dirs[index] || dirs[0] || 'asc',\r\n\t\t\t\tcolumnIndex,\r\n\t\t\t});\r\n\t\t});\r\n\t\treturn this._getNormalizedSorts(sorts);\r\n\t}\r\n\r\n\t_getNormalizedSorts(items) {\r\n\t\tconst normalized = [];\r\n\t\t(Array.isArray(items) ? items : []).forEach((item) => {\r\n\t\t\tconst field = String(item && item.field ? item.field : '').trim();\r\n\t\t\tconst columnIndex = Number.isInteger(item && item.columnIndex)\r\n\t\t\t\t? item.columnIndex\r\n\t\t\t\t: Number.parseInt(item && item.columnIndex, 10);\r\n\t\t\tconst dir = this._normalizeSortDir(item && item.dir ? item.dir : 'asc');\r\n\r\n\t\t\tif (!field && !Number.isInteger(columnIndex)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst header = this._resolveHeaderForSort(field, columnIndex);\r\n\t\t\tif (!header) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst resolvedColumnIndex = this._findHeaderIndex(header);\r\n\t\t\tif (resolvedColumnIndex < 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (!this._isHeaderSortableByConfig(header, resolvedColumnIndex, this._params.sortable || {})) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst resolvedField = String(field || header.getAttribute('data-field') || '').trim();\r\n\t\t\tif (this._isRemote && !resolvedField) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (normalized.some((entry) => {\r\n\t\t\t\tif (resolvedField && entry.field) {\r\n\t\t\t\t\treturn entry.field === resolvedField;\r\n\t\t\t\t}\r\n\t\t\t\treturn entry.columnIndex === resolvedColumnIndex;\r\n\t\t\t})) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tnormalized.push({\r\n\t\t\t\tfield: resolvedField,\r\n\t\t\t\tdir,\r\n\t\t\t\tcolumnIndex: resolvedColumnIndex,\r\n\t\t\t});\r\n\t\t});\r\n\t\treturn normalized;\r\n\t}\r\n\r\n\t_isHeaderSortableByConfig(header, index, sortOptions = {}) {\r\n\t\tif (!header) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst explicitAttr = header.getAttribute('data-sortable');\r\n\t\tif (explicitAttr !== null) {\r\n\t\t\tconst normalized = String(explicitAttr).toLowerCase().trim();\r\n\t\t\tif (normalized === 'false' || normalized === '0') {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst whitelist = this._getSortableFieldsWhitelist(sortOptions);\r\n\t\tif (whitelist && whitelist.size > 0) {\r\n\t\t\tconst field = String(header.getAttribute('data-field') || '').trim();\r\n\t\t\tif (!field || !whitelist.has(field)) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (this._isRemote) {\r\n\t\t\treturn Boolean(String(header.getAttribute('data-field') || '').trim());\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t_getSortableFieldsWhitelist(sortOptions = {}) {\r\n\t\tconst attrFields = this._element.getAttribute('data-sort-fields');\r\n\t\tconst source = attrFields !== null ? attrFields : sortOptions.fields;\r\n\t\tconst list = this._normalizeSortableFields(source);\r\n\t\tif (!list.length) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn new Set(list);\r\n\t}\r\n\r\n\t_normalizeSortableFields(value) {\r\n\t\tif (Array.isArray(value)) {\r\n\t\t\treturn value\r\n\t\t\t\t.map((item) => String(item || '').trim())\r\n\t\t\t\t.filter(Boolean);\r\n\t\t}\r\n\r\n\t\treturn String(value || '')\r\n\t\t\t.split(',')\r\n\t\t\t.map((item) => item.trim())\r\n\t\t\t.filter(Boolean);\r\n\t}\r\n\r\n\t_getHeaderCells() {\r\n\t\tconst head = this._element.tHead || this._element.querySelector('thead');\r\n\t\tif (!head || !head.rows || !head.rows.length) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\t\treturn Array.from(head.rows[0].cells || []);\r\n\t}\r\n\r\n\t_findHeaderIndex(header) {\r\n\t\tif (!header) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\tconst headers = this._getHeaderCells();\r\n\t\treturn headers.indexOf(header);\r\n\t}\r\n\r\n\t_findHeaderIndexByField(field) {\r\n\t\tconst target = String(field || '').trim();\r\n\t\tif (!target) {\r\n\t\t\treturn -1;\r\n\t\t}\r\n\t\tconst headers = this._getHeaderCells();\r\n\t\treturn headers.findIndex((header) => String(header.getAttribute('data-field') || '').trim() === target);\r\n\t}\r\n\r\n\t_resolveHeaderForSort(field, columnIndex) {\r\n\t\tconst headers = this._getHeaderCells();\r\n\t\tconst normalizedField = String(field || '').trim();\r\n\t\tif (normalizedField) {\r\n\t\t\tconst byField = headers.find((header) => String(header.getAttribute('data-field') || '').trim() === normalizedField);\r\n\t\t\tif (byField) {\r\n\t\t\t\treturn byField;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (Number.isInteger(columnIndex) && columnIndex >= 0 && columnIndex < headers.length) {\r\n\t\t\treturn headers[columnIndex];\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t}\r\n\r\n\t_getInitialPage() {\r\n\t\tconst fromUrl = this._normalizePositiveInt(this._getUrlParams().get('page'), 0);\r\n\t\tif (fromUrl > 0) {\r\n\t\t\treturn fromUrl;\r\n\t\t}\r\n\t\tconst requestOptions = this._params.request || {};\r\n\t\tconst requestParams = requestOptions.params || {};\r\n\t\tconst fromRequest = this._normalizePositiveInt(requestParams.page, 0);\r\n\t\tif (fromRequest > 0) {\r\n\t\t\treturn fromRequest;\r\n\t\t}\r\n\t\tconst fromStorage = this._readStoredPage();\r\n\t\tif (fromStorage > 0) {\r\n\t\t\treturn fromStorage;\r\n\t\t}\r\n\t\treturn this._normalizePositiveInt(this._params.pagination.page, 1);\r\n\t}\r\n\r\n\t_getInitialPerPage() {\r\n\t\tconst fromUrl = this._normalizePositiveInt(this._getUrlParams().get('per_page'), 0);\r\n\t\tif (fromUrl > 0) {\r\n\t\t\treturn this._clampPerPage(fromUrl, 10);\r\n\t\t}\r\n\t\tconst requestOptions = this._params.request || {};\r\n\t\tconst requestParams = requestOptions.params || {};\r\n\t\tconst fromRequest = this._normalizePositiveInt(requestParams.per_page, 0);\r\n\t\tif (fromRequest > 0) {\r\n\t\t\treturn this._clampPerPage(fromRequest, 10);\r\n\t\t}\r\n\t\tconst fromStorage = this._readStoredPerPage();\r\n\t\tif (fromStorage > 0) {\r\n\t\t\treturn this._clampPerPage(fromStorage, 10);\r\n\t\t}\r\n\t\tconst configured = this._getConfiguredPerPage();\r\n\t\tif (configured > 0) {\r\n\t\t\treturn this._clampPerPage(configured, 10);\r\n\t\t}\r\n\t\treturn this._clampPerPage(this._params.pagination.perPage, 10);\r\n\t}\r\n\r\n\t_getConfiguredPerPage() {\r\n\t\tconst perPageAttr = this._element.getAttribute('data-pagination-per-page');\r\n\t\tconst fromAttr = this._normalizePositiveInt(perPageAttr, 0);\r\n\t\tif (fromAttr > 0) {\r\n\t\t\treturn fromAttr;\r\n\t\t}\r\n\t\treturn this._normalizePositiveInt(this._params.pagination.perPage, 0);\r\n\t}\r\n\r\n\t_getMaxPerPage() {\r\n\t\tconst pagination = this._params.pagination || {};\r\n\t\tconst maxPerPageAttr = this._element.getAttribute('data-pagination-max-per-page');\r\n\t\tconst fromAttr = this._normalizePositiveInt(maxPerPageAttr, 0);\r\n\t\tif (fromAttr > 0) {\r\n\t\t\treturn fromAttr;\r\n\t\t}\r\n\r\n\t\tconst fromOptions = this._normalizePositiveInt(pagination.maxPerPage, 0);\r\n\t\tif (fromOptions > 0) {\r\n\t\t\treturn fromOptions;\r\n\t\t}\r\n\r\n\t\treturn 100;\r\n\t}\r\n\r\n\t_clampPerPage(value, fallback = 10) {\r\n\t\tconst normalized = this._normalizePositiveInt(value, fallback);\r\n\t\tconst maxPerPage = this._getMaxPerPage();\r\n\t\treturn Math.max(1, Math.min(normalized, maxPerPage));\r\n\t}\r\n\r\n\t_getFiltersRoute() {\r\n\t\tconst filterOptions = this._params.filters || {};\r\n\t\tconst attrRoute = this._element.getAttribute('data-filters-route');\r\n\t\treturn String(filterOptions.route || attrRoute || '').trim();\r\n\t}\r\n\r\n\t_isPerPagePersistenceEnabled() {\r\n\t\tconst pagination = this._params.pagination || {};\r\n\t\tconst attr = this._element.getAttribute('data-pagination-persist-per-page');\r\n\t\tif (attr !== null) {\r\n\t\t\tconst normalized = String(attr).toLowerCase().trim();\r\n\t\t\treturn normalized !== 'false' && normalized !== '0';\r\n\t\t}\r\n\t\tif ((pagination.persist || {}).perPage === undefined || (pagination.persist || {}).perPage === null) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn Boolean((pagination.persist || {}).perPage);\r\n\t}\r\n\r\n\t_isPagePersistenceEnabled() {\r\n\t\tconst pagination = this._params.pagination || {};\r\n\t\tconst attr = this._element.getAttribute('data-pagination-persist-page');\r\n\t\tif (attr !== null) {\r\n\t\t\tconst normalized = String(attr).toLowerCase().trim();\r\n\t\t\treturn normalized !== 'false' && normalized !== '0';\r\n\t\t}\r\n\t\tif ((pagination.persist || {}).page === undefined || (pagination.persist || {}).page === null) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn Boolean((pagination.persist || {}).page);\r\n\t}\r\n\r\n\t_getPerPageStorageKey() {\r\n\t\tconst pagination = this._params.pagination || {};\r\n\t\tconst explicit = String(((pagination.storage || {}).key) || this._element.getAttribute('data-pagination-storage-key') || '').trim();\r\n\t\tif (explicit) {\r\n\t\t\treturn explicit;\r\n\t\t}\r\n\t\tconst tableId = String(this._element.id || '').trim();\r\n\t\tif (tableId) {\r\n\t\t\treturn `vgdt:perPage:${tableId}`;\r\n\t\t}\r\n\t\tconst route = String(this._getRoute() || '').trim();\r\n\t\tif (route) {\r\n\t\t\treturn `vgdt:perPage:${route}`;\r\n\t\t}\r\n\t\tconst dataToggle = String(this._element.getAttribute('data-vg-table') || '').trim();\r\n\t\tif (dataToggle) {\r\n\t\t\treturn `vgdt:perPage:${window.location.pathname}:${dataToggle}`;\r\n\t\t}\r\n\t\tconst tables = Array.from(document.querySelectorAll('[data-vg-table]'));\r\n\t\tconst index = tables.indexOf(this._element);\r\n\t\treturn `vgdt:perPage:${window.location.pathname}:${index >= 0 ? index : 0}`;\r\n\t}\r\n\r\n\t_getPageStorageKey() {\r\n\t\tconst pagination = this._params.pagination || {};\r\n\t\tconst explicit = String((((pagination.pageStorage || {}).storage || {}).key) || this._element.getAttribute('data-pagination-page-storage-key') || '').trim();\r\n\t\tif (explicit) {\r\n\t\t\treturn explicit;\r\n\t\t}\r\n\t\treturn `${this._getPerPageStorageKey()}:page`;\r\n\t}\r\n\r\n\t_readStoredPage() {\r\n\t\tif (!this._isPagePersistenceEnabled()) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tconst raw = window.localStorage.getItem(this._getPageStorageKey());\r\n\t\t\treturn this._normalizePositiveInt(raw, 0);\r\n\t\t} catch (error) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t}\r\n\r\n\t_storePage(page) {\r\n\t\tif (!this._isPagePersistenceEnabled()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst normalized = this._normalizePositiveInt(page, 0);\r\n\t\tif (normalized <= 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\ttry {\r\n\t\t\twindow.localStorage.setItem(this._getPageStorageKey(), String(normalized));\r\n\t\t} catch (error) {\r\n\t\t\t// Ignore storage errors.\r\n\t\t}\r\n\t}\r\n\r\n\t_readStoredPerPage() {\r\n\t\tif (!this._isPerPagePersistenceEnabled()) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\ttry {\r\n\t\t\tconst raw = window.localStorage.getItem(this._getPerPageStorageKey());\r\n\t\t\treturn this._normalizePositiveInt(raw, 0);\r\n\t\t} catch (error) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t}\r\n\r\n\t_storePerPage(perPage) {\r\n\t\tif (!this._isPerPagePersistenceEnabled()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst normalized = this._normalizePositiveInt(perPage, 0);\r\n\t\tif (normalized <= 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\ttry {\r\n\t\t\twindow.localStorage.setItem(this._getPerPageStorageKey(), String(normalized));\r\n\t\t} catch (error) {\r\n\t\t\t// Ignore storage errors.\r\n\t\t}\r\n\t}\r\n\r\n\t_normalizeSortDir(value) {\r\n\t\tconst normalized = String(value)\r\n\t\t\t.split(',')[0]\r\n\t\t\t.toLowerCase()\r\n\t\t\t.trim();\r\n\t\treturn normalized === 'desc' ? 'desc' : 'asc';\r\n\t}\r\n\r\n\t_isPaginationEnabled() {\r\n\t\tconst pagination = this._params.pagination || {};\r\n\t\tif (pagination.enable !== undefined && pagination.enable !== null) {\r\n\t\t\tconst normalized = String(pagination.enable).toLowerCase().trim();\r\n\t\t\tif (normalized === 'true' || normalized === '1') {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tif (normalized === 'false' || normalized === '0') {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn Boolean(pagination.enable);\r\n\t\t}\r\n\r\n\t\tconst explicitAttr = this._element.getAttribute('data-pagination-enable');\r\n\t\tif (explicitAttr !== null) {\r\n\t\t\tconst normalized = String(explicitAttr).toLowerCase().trim();\r\n\t\t\treturn normalized !== 'false' && normalized !== '0';\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\t_isStickyHeaderEnabled() {\r\n\t\tconst sticky = this._params.stickyHeader || {};\r\n\t\tconst enableAttr = this._element.getAttribute('data-sticky-header-enable');\r\n\t\tif (enableAttr !== null) {\r\n\t\t\tconst normalized = String(enableAttr).toLowerCase().trim();\r\n\t\t\treturn normalized !== 'false' && normalized !== '0';\r\n\t\t}\r\n\r\n\t\tif (sticky.enable !== undefined && sticky.enable !== null) {\r\n\t\t\tconst normalized = String(sticky.enable).toLowerCase().trim();\r\n\t\t\tif (normalized === 'true' || normalized === '1') {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tif (normalized === 'false' || normalized === '0') {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn Boolean(sticky.enable);\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\t_isCloneStickyHeaderEnabled() {\r\n\t\tif (this._parent && this._parent.classList.contains('table-sticky')) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn Boolean(this._element && this._element.classList.contains('table-sticky'));\r\n\t}\r\n\r\n\t_refreshStickyAndFixedLayout(options = {}) {\r\n\t\tconst immediate = Boolean(options && options.immediate);\r\n\t\tconst reason = String((options && options.reason) || '').trim();\r\n\t\tif (reason) {\r\n\t\t\tthis._layoutRefreshReasons.push(reason);\r\n\t\t\tif (this._layoutRefreshReasons.length > 25) {\r\n\t\t\t\tthis._layoutRefreshReasons.shift();\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (immediate || typeof window === 'undefined' || typeof window.requestAnimationFrame !== 'function') {\r\n\t\t\tif (this._layoutRefreshFrame && typeof window !== 'undefined' && typeof window.cancelAnimationFrame === 'function') {\r\n\t\t\t\twindow.cancelAnimationFrame(this._layoutRefreshFrame);\r\n\t\t\t}\r\n\t\t\tthis._layoutRefreshFrame = 0;\r\n\t\t\tthis._layoutRefreshScheduled = false;\r\n\t\t\tthis._refreshStickyAndFixedLayoutNow();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (this._layoutRefreshScheduled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._layoutRefreshScheduled = true;\r\n\t\tthis._layoutRefreshFrame = window.requestAnimationFrame(() => {\r\n\t\t\tthis._layoutRefreshFrame = 0;\r\n\t\t\tthis._layoutRefreshScheduled = false;\r\n\t\t\tthis._refreshStickyAndFixedLayoutNow();\r\n\t\t});\r\n\t}\r\n\r\n\t_refreshStickyAndFixedLayoutNow() {\r\n\t\tthis._layoutRefreshReasons = [];\r\n\t\tif (!this._element || !this._element.isConnected) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._applyFixedColumnsLayout();\r\n\t\tthis._syncCloneStickyHeader();\r\n\t\tthis._updatePanHintVisibility();\r\n\t}\r\n\r\n\t_updateLayoutResizeBinding() {\r\n\t\tif (typeof window === 'undefined') {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst shouldListen = this._isCloneStickyHeaderEnabled() || this._hasFixedColumnsConfig();\r\n\t\twindow.removeEventListener('resize', this._boundCloneStickyResize);\r\n\t\tthis._teardownLayoutResizeObserver();\r\n\t\tif (shouldListen) {\r\n\t\t\twindow.addEventListener('resize', this._boundCloneStickyResize);\r\n\t\t\tthis._setupLayoutResizeObserver();\r\n\t\t}\r\n\t}\r\n\r\n\t_setupLayoutResizeObserver() {\r\n\t\tif (typeof ResizeObserver === 'undefined') {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!this._layoutResizeObserver) {\r\n\t\t\tthis._layoutResizeObserver = new ResizeObserver(() => {\r\n\t\t\t\tthis._boundCloneStickyResize();\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tthis._getLayoutResizeTargets().forEach((target) => {\r\n\t\t\tthis._layoutResizeObserver.observe(target);\r\n\t\t});\r\n\t}\r\n\r\n\t_teardownLayoutResizeObserver() {\r\n\t\tif (!this._layoutResizeObserver) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._layoutResizeObserver.disconnect();\r\n\t}\r\n\r\n\t_getLayoutResizeTargets() {\r\n\t\tconst seen = new Set();\r\n\t\tconst pushUnique = (target) => {\r\n\t\t\tif (!target || seen.has(target)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tseen.add(target);\r\n\t\t};\r\n\r\n\t\tpushUnique(this._parent);\r\n\t\tpushUnique(this._tableViewport);\r\n\r\n\t\treturn Array.from(seen);\r\n\t}\r\n\r\n\t_getStickyHeaderOffsets() {\r\n\t\tconst sticky = this._params.stickyHeader || {};\r\n\t\tconst attrTop = this._element.getAttribute('data-sticky-header-top');\r\n\t\tconst topRaw = attrTop !== null && String(attrTop).trim() !== '' ? attrTop : sticky.top;\r\n\t\tconst top = Number.isFinite(Number.parseInt(topRaw, 10)) ? Number.parseInt(topRaw, 10) : 0;\r\n\t\tconst attrMaxHeight = this._element.getAttribute('data-sticky-header-max');\r\n\t\tconst maxHeightRaw = attrMaxHeight !== null && String(attrMaxHeight).trim() !== '' ? attrMaxHeight : sticky.max;\r\n\t\tconst maxHeight = Number.isFinite(Number.parseInt(maxHeightRaw, 10)) ? Number.parseInt(maxHeightRaw, 10) : 0;\r\n\t\treturn {\r\n\t\t\ttop: Math.max(0, top),\r\n\t\t\tmaxHeight: Math.max(0, maxHeight),\r\n\t\t};\r\n\t}\r\n\r\n\t_getCloneStickyHeaderOffsets() {\r\n\t\treturn {\r\n\t\t\ttop: this._readCssSizeVar('--vgdt-sticky-top', 0),\r\n\t\t\tmaxHeight: this._readCssSizeVar('--vgdt-sticky-max-height', 0),\r\n\t\t};\r\n\t}\r\n\r\n\t_readCssSizeVar(name, fallback = 0) {\r\n\t\tconst sources = [this._parent, this._element, this._tableViewport].filter(Boolean);\r\n\t\tfor (let index = 0; index < sources.length; index += 1) {\r\n\t\t\tconst node = sources[index];\r\n\t\t\tconst value = window.getComputedStyle(node).getPropertyValue(name);\r\n\t\t\tconst parsed = this._resolveCssLengthToPx(value, node);\r\n\t\t\tif (Number.isFinite(parsed)) {\r\n\t\t\t\treturn Math.max(0, parsed);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn Math.max(0, fallback);\r\n\t}\r\n\r\n\t_resolveCssLengthToPx(value, referenceNode = null) {\r\n\t\tconst raw = String(value || '').trim();\r\n\t\tif (!raw) {\r\n\t\t\treturn NaN;\r\n\t\t}\r\n\r\n\t\tconst direct = Number.parseFloat(raw);\r\n\t\tif (Number.isFinite(direct)) {\r\n\t\t\treturn direct;\r\n\t\t}\r\n\r\n\t\tif (typeof document === 'undefined') {\r\n\t\t\treturn NaN;\r\n\t\t}\r\n\r\n\t\tconst host = referenceNode instanceof Element\r\n\t\t\t? referenceNode\r\n\t\t\t: (document.body || document.documentElement);\r\n\t\tif (!host) {\r\n\t\t\treturn NaN;\r\n\t\t}\r\n\r\n\t\tconst probe = document.createElement('div');\r\n\t\tprobe.style.position = 'absolute';\r\n\t\tprobe.style.visibility = 'hidden';\r\n\t\tprobe.style.pointerEvents = 'none';\r\n\t\tprobe.style.left = '-99999px';\r\n\t\tprobe.style.top = '0';\r\n\t\tprobe.style.height = raw;\r\n\t\thost.appendChild(probe);\r\n\r\n\t\tconst computed = window.getComputedStyle(probe).height;\r\n\t\thost.removeChild(probe);\r\n\r\n\t\tconst resolved = Number.parseFloat(String(computed || '').trim());\r\n\t\treturn Number.isFinite(resolved) ? resolved : NaN;\r\n\t}\r\n\r\n\t_applyStickyHeader(enabled) {\r\n\t\tif (!this._element) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst offsets = this._getStickyHeaderOffsets();\r\n\r\n\t\tif (enabled) {\r\n\t\t\tthis._element.style.setProperty('--vgdt-sticky-top', `${offsets.top}px`);\r\n\t\t\tconst scrollTarget = this._tableViewport || this._parent;\r\n\t\t\tif (scrollTarget) {\r\n\t\t\t\tif (offsets.maxHeight > 0) {\r\n\t\t\t\t\tscrollTarget.classList.add('table-sticky-scroll');\r\n\t\t\t\t\tscrollTarget.style.setProperty('--vgdt-sticky-max-height', `${offsets.maxHeight}px`);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tscrollTarget.classList.remove('table-sticky-scroll');\r\n\t\t\t\t\tscrollTarget.style.removeProperty('--vgdt-sticky-max-height');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._element.style.removeProperty('--vgdt-sticky-top');\r\n\t\tconst scrollTarget = this._tableViewport || this._parent;\r\n\t\tif (scrollTarget) {\r\n\t\t\tscrollTarget.classList.remove('table-sticky-scroll');\r\n\t\t\tscrollTarget.style.removeProperty('--vgdt-sticky-max-height');\r\n\t\t}\r\n\t}\r\n\r\n\t_applyCloneStickyHeader(enabled) {\r\n\t\tconst scrollTarget = this._tableViewport || this._parent;\r\n\t\tconst state = this._cloneStickyState;\r\n\r\n\t\tif (!enabled) {\r\n\t\t\tif (state && state.viewport && state.onScroll) {\r\n\t\t\t\tstate.viewport.removeEventListener('scroll', state.onScroll);\r\n\t\t\t}\r\n\t\t\tif (state && state.headerWrap && state.headerWrap.parentElement) {\r\n\t\t\t\tstate.headerWrap.parentElement.removeChild(state.headerWrap);\r\n\t\t\t}\r\n\t\t\tthis._cloneStickyState = null;\r\n\t\t\tthis._parent.style.removeProperty('--vgdt-sticky-clone-height');\r\n\t\t\tif (scrollTarget && !this._isStickyHeaderEnabled()) {\r\n\t\t\t\tscrollTarget.classList.remove('table-sticky-scroll');\r\n\t\t\t\tscrollTarget.style.removeProperty('--vgdt-sticky-max-height');\r\n\t\t\t}\r\n\t\t\tthis._updateLayoutResizeBinding();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!this._parent || !this._tableViewport || !this._element.tHead) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst offsets = this._getCloneStickyHeaderOffsets();\r\n\r\n\t\tif (scrollTarget) {\r\n\t\t\tif (offsets.maxHeight > 0) {\r\n\t\t\t\tscrollTarget.classList.add('table-sticky-scroll');\r\n\t\t\t\tscrollTarget.style.setProperty('--vgdt-sticky-max-height', `${offsets.maxHeight}px`);\r\n\t\t\t} else {\r\n\t\t\t\tscrollTarget.classList.remove('table-sticky-scroll');\r\n\t\t\t\tscrollTarget.style.removeProperty('--vgdt-sticky-max-height');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!this._cloneStickyState) {\r\n\t\t\tconst headerWrap = document.createElement('div');\r\n\t\t\theaderWrap.className = 'vgdt-sticky-clone';\r\n\t\t\tconst cloneTable = document.createElement('table');\r\n\t\t\tcloneTable.className = 'vgdt-sticky-clone__table';\r\n\t\t\tif (this._element.classList.contains('table-sortable')) {\r\n\t\t\t\tcloneTable.classList.add('table-sortable');\r\n\t\t\t}\r\n\t\t\tconst cloneHead = document.createElement('thead');\r\n\t\t\tcloneTable.appendChild(cloneHead);\r\n\t\t\theaderWrap.appendChild(cloneTable);\r\n\t\t\tthis._parent.insertBefore(headerWrap, this._tableViewport);\r\n\r\n\t\t\tconst stateNode = {\r\n\t\t\t\theaderWrap,\r\n\t\t\t\ttable: cloneTable,\r\n\t\t\t\thead: cloneHead,\r\n\t\t\t\tlastHeadHtml: '',\r\n\t\t\t\tcloneCells: [],\r\n\t\t\t\tviewport: this._tableViewport,\r\n\t\t\t\tonScroll: () => {\r\n\t\t\t\t\tthis._syncCloneStickyScroll();\r\n\t\t\t\t},\r\n\t\t\t\tonClick: (event) => {\r\n\t\t\t\t\tthis._forwardCloneStickyInteraction(event, 'click');\r\n\t\t\t\t},\r\n\t\t\t\tonChange: (event) => {\r\n\t\t\t\t\tthis._forwardCloneStickyInteraction(event, 'change');\r\n\t\t\t\t},\r\n\t\t\t\tonDragStart: (event) => {\r\n\t\t\t\t\tthis._forwardCloneStickyInteraction(event, 'dragstart');\r\n\t\t\t\t},\r\n\t\t\t\tonDragOver: (event) => {\r\n\t\t\t\t\tthis._forwardCloneStickyInteraction(event, 'dragover');\r\n\t\t\t\t},\r\n\t\t\t\tonDrop: (event) => {\r\n\t\t\t\t\tthis._forwardCloneStickyInteraction(event, 'drop');\r\n\t\t\t\t},\r\n\t\t\t\tonDragEnd: (event) => {\r\n\t\t\t\t\tthis._forwardCloneStickyInteraction(event, 'dragend');\r\n\t\t\t\t},\r\n\t\t\t};\r\n\r\n\t\t\tstateNode.viewport.addEventListener('scroll', stateNode.onScroll, { passive: true });\r\n\t\t\tstateNode.head.addEventListener('click', stateNode.onClick);\r\n\t\t\tstateNode.head.addEventListener('change', stateNode.onChange);\r\n\t\t\tstateNode.head.addEventListener('dragstart', stateNode.onDragStart);\r\n\t\t\tstateNode.head.addEventListener('dragover', stateNode.onDragOver);\r\n\t\t\tstateNode.head.addEventListener('drop', stateNode.onDrop);\r\n\t\t\tstateNode.head.addEventListener('dragend', stateNode.onDragEnd);\r\n\t\t\tthis._cloneStickyState = stateNode;\r\n\t\t}\r\n\r\n\t\tthis._updateLayoutResizeBinding();\r\n\t\tthis._syncCloneStickyHeader();\r\n\t}\r\n\r\n\t_syncCloneStickyHeader() {\r\n\t\tconst state = this._cloneStickyState;\r\n\t\tif (!state || !this._element || !this._element.tHead) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst sourceHead = this._element.tHead;\r\n\t\tconst sourceRows = Array.from(sourceHead.rows || []);\r\n\t\tif (!sourceRows.length) {\r\n\t\t\tstate.headerWrap.hidden = true;\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (this._element.classList.contains('table-sortable')) {\r\n\t\t\tstate.table.classList.add('table-sortable');\r\n\t\t} else {\r\n\t\t\tstate.table.classList.remove('table-sortable');\r\n\t\t}\r\n\t\tconst hideUnsortedAttr = this._element.getAttribute('data-sort-hide-unsorted-arrows');\r\n\t\tif (hideUnsortedAttr !== null) {\r\n\t\t\tstate.table.setAttribute('data-sort-hide-unsorted-arrows', hideUnsortedAttr);\r\n\t\t} else {\r\n\t\t\tstate.table.removeAttribute('data-sort-hide-unsorted-arrows');\r\n\t\t}\r\n\r\n\t\tlet cloneHeadChanged = false;\r\n\t\tconst nextHeadHtml = sourceHead.innerHTML;\r\n\t\tif (state.lastHeadHtml !== nextHeadHtml) {\r\n\t\t\tstate.head.innerHTML = nextHeadHtml;\r\n\t\t\tthis._sanitizeCloneStickyHeadIds(state.head);\r\n\t\t\tstate.lastHeadHtml = nextHeadHtml;\r\n\t\t\tstate.cloneCells = Array.from(state.head.querySelectorAll('th'));\r\n\t\t\tcloneHeadChanged = true;\r\n\t\t}\r\n\t\tconst sourceCells = Array.from(sourceHead.querySelectorAll('th'));\r\n\t\tconst cloneCells = Array.isArray(state.cloneCells) && state.cloneCells.length\r\n\t\t\t? state.cloneCells\r\n\t\t\t: Array.from(state.head.querySelectorAll('th'));\r\n\t\tthis._syncCloneStickySelectAllState(sourceHead, state.head);\r\n\t\tconst sourceTableWidth = this._element.getBoundingClientRect().width;\r\n\t\tconst viewportMetrics = this._getViewportWidthMetrics();\r\n\t\tconst hasHorizontalOverflow = this._tableViewport\r\n\t\t\t? this._tableViewport.scrollWidth > this._tableViewport.clientWidth + 1\r\n\t\t\t: false;\r\n\t\tlet tableWidth = sourceTableWidth;\r\n\r\n\t\tif (viewportMetrics) {\r\n\t\t\ttableWidth = (!hasHorizontalOverflow || viewportMetrics.hasVerticalOverflow)\r\n\t\t\t\t? sourceTableWidth\r\n\t\t\t\t: Math.max(sourceTableWidth, viewportMetrics.effectiveWidth);\r\n\t\t}\r\n\r\n\t\tconst tableWidthCss = `${Math.max(0, tableWidth)}px`;\r\n\t\tif (state.table.style.width !== tableWidthCss) {\r\n\t\t\tstate.table.style.width = tableWidthCss;\r\n\t\t}\r\n\t\tstate.headerWrap.style.width = '100%';\r\n\t\tlet totalCloneWidth = 0;\r\n\t\tsourceCells.forEach((cell, index) => {\r\n\t\t\tconst cloneCell = cloneCells[index];\r\n\t\t\tif (!cloneCell) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst width = cell.getBoundingClientRect().width;\r\n\t\t\tconst safeWidth = Math.max(0, width);\r\n\t\t\tconst widthCss = `${safeWidth}px`;\r\n\t\t\tif (cloneCell.style.width !== widthCss) {\r\n\t\t\t\tcloneCell.style.width = widthCss;\r\n\t\t\t}\r\n\t\t\tif (cloneCell.style.minWidth !== widthCss) {\r\n\t\t\t\tcloneCell.style.minWidth = widthCss;\r\n\t\t\t}\r\n\t\t\tif (cloneCell.style.maxWidth !== widthCss) {\r\n\t\t\t\tcloneCell.style.maxWidth = widthCss;\r\n\t\t\t}\r\n\t\t\ttotalCloneWidth += safeWidth;\r\n\t\t});\r\n\r\n\t\tif (hasHorizontalOverflow && cloneCells.length) {\r\n\t\t\tconst gap = Math.max(0, tableWidth - totalCloneWidth);\r\n\t\t\tif (gap > 1) {\r\n\t\t\t\tconst lastCell = cloneCells[cloneCells.length - 1];\r\n\t\t\t\tconst current = lastCell.getBoundingClientRect().width;\r\n\t\t\t\tconst next = Math.max(0, current + gap);\r\n\t\t\t\tlastCell.style.width = `${next}px`;\r\n\t\t\t\tlastCell.style.minWidth = `${next}px`;\r\n\t\t\t\tlastCell.style.maxWidth = `${next}px`;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tstate.headerWrap.hidden = false;\r\n\t\tconst cloneHeight = state.headerWrap.getBoundingClientRect().height;\r\n\t\tthis._parent.style.setProperty('--vgdt-sticky-clone-height', `${Math.max(0, cloneHeight)}px`);\r\n\t\tthis._syncCloneStickyScroll();\r\n\t\tif (cloneHeadChanged && typeof this._rebuildFixedColumnsCellsCache === 'function') {\r\n\t\t\tthis._rebuildFixedColumnsCellsCache();\r\n\t\t\tif (typeof this._syncFixedColumnsScroll === 'function') {\r\n\t\t\t\tthis._syncFixedColumnsScroll({ immediate: true });\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t_syncCloneStickySelectAllState(sourceHead, cloneHead) {\r\n\t\tif (!sourceHead || !cloneHead || typeof sourceHead.querySelector !== 'function' || typeof cloneHead.querySelector !== 'function') {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst sourceSelectAll = sourceHead.querySelector('[data-select-all]');\r\n\t\tconst cloneSelectAll = cloneHead.querySelector('[data-select-all]');\r\n\t\tif (!sourceSelectAll || !cloneSelectAll) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tcloneSelectAll.checked = Boolean(sourceSelectAll.checked);\r\n\t\tcloneSelectAll.indeterminate = Boolean(sourceSelectAll.indeterminate);\r\n\t\tcloneSelectAll.disabled = Boolean(sourceSelectAll.disabled);\r\n\t}\r\n\r\n\t_sanitizeCloneStickyHeadIds(head) {\r\n\t\tif (!head || typeof head.querySelectorAll !== 'function') {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst nodesWithId = Array.from(head.querySelectorAll('[id]'));\r\n\t\tif (!nodesWithId.length) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst idMap = new Map();\r\n\t\tnodesWithId.forEach((node) => {\r\n\t\t\tconst originalId = String(node.getAttribute('id') || '').trim();\r\n\t\t\tif (!originalId) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst cloneId = `${originalId}--vgdt-clone`;\r\n\t\t\tnode.setAttribute('id', cloneId);\r\n\t\t\tidMap.set(originalId, cloneId);\r\n\t\t});\r\n\r\n\t\tif (!idMap.size) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst idRefAttrs = ['for', 'headers', 'aria-labelledby', 'aria-describedby', 'aria-controls', 'aria-owns', 'aria-details'];\r\n\t\tconst allNodes = Array.from(head.querySelectorAll('*'));\r\n\t\tallNodes.forEach((node) => {\r\n\t\t\tidRefAttrs.forEach((attr) => {\r\n\t\t\t\tconst value = String(node.getAttribute(attr) || '').trim();\r\n\t\t\t\tif (!value) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tconst nextValue = value\r\n\t\t\t\t\t.split(/\\s+/)\r\n\t\t\t\t\t.map((part) => idMap.get(part) || part)\r\n\t\t\t\t\t.join(' ');\r\n\t\t\t\tif (nextValue !== value) {\r\n\t\t\t\t\tnode.setAttribute(attr, nextValue);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\t_syncCloneStickyScroll() {\r\n\t\tconst state = this._cloneStickyState;\r\n\t\tif (!state || !state.viewport) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst hasHorizontalOverflow = state.viewport.scrollWidth > state.viewport.clientWidth + 1;\r\n\t\tif (!hasHorizontalOverflow) {\r\n\t\t\tif (state.viewport.scrollLeft !== 0) {\r\n\t\t\t\tstate.viewport.scrollLeft = 0;\r\n\t\t\t}\r\n\t\t\tstate.table.style.transform = 'translateX(0px)';\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst left = state.viewport.scrollLeft || 0;\r\n\t\tstate.table.style.transform = `translateX(${-left}px)`;\r\n\t}\r\n\r\n\t_getViewportWidthMetrics() {\r\n\t\tconst viewport = this._tableViewport;\r\n\t\tif (!viewport) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst clientWidth = viewport.clientWidth || 0;\r\n\t\tconst clientHeight = viewport.clientHeight || 0;\r\n\t\tconst hasVerticalOverflow = viewport.scrollHeight > clientHeight + 1;\r\n\t\tconst effectiveWidth = clientWidth || viewport.offsetWidth || 0;\r\n\r\n\t\treturn {\r\n\t\t\tclientWidth,\r\n\t\t\teffectiveWidth,\r\n\t\t\thasVerticalOverflow,\r\n\t\t};\r\n\t}\r\n\r\n\t_forwardCloneStickyInteraction(event, type) {\r\n\t\tconst state = this._cloneStickyState;\r\n\t\tif (!state || !this._element || !this._element.tHead || !event) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst target = event.target instanceof Element ? event.target : null;\r\n\t\tif (!target) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst cloneTh = target.closest('th');\r\n\t\tif (!cloneTh) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst cloneHeaders = Array.from(state.head.querySelectorAll('th'));\r\n\t\tconst sourceHeaders = Array.from(this._element.tHead.querySelectorAll('th'));\r\n\t\tconst index = cloneHeaders.indexOf(cloneTh);\r\n\t\tconst sourceTh = index >= 0 ? sourceHeaders[index] : null;\r\n\t\tif (!sourceTh) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (type === 'dragstart' || type === 'dragover' || type === 'drop' || type === 'dragend') {\r\n\t\t\tif (!this._columnReorderState.enabled) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (type === 'dragstart') {\r\n\t\t\t\tconst fromIndex = this._findHeaderIndex(sourceTh);\r\n\t\t\t\tif (fromIndex < 0 || this._isHeaderFixedForColumnReorder(sourceTh)) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tthis._columnReorderState.fromIndex = fromIndex;\r\n\t\t\t\tthis._columnReorderState.toIndex = fromIndex;\r\n\t\t\t\tthis._columnReorderState.isDragging = true;\r\n\t\t\t\tthis._element.classList.add('is-col-dragging');\r\n\t\t\t\tsourceTh.setAttribute('data-col-dragging', '1');\r\n\t\t\t\tcloneTh.setAttribute('data-col-dragging', '1');\r\n\r\n\t\t\t\tif (event.dataTransfer) {\r\n\t\t\t\t\tevent.dataTransfer.effectAllowed = 'move';\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tevent.dataTransfer.setData('text/plain', String(fromIndex));\r\n\t\t\t\t\t} catch (error) {\r\n\t\t\t\t\t\t// Ignore setData errors.\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (type === 'dragover') {\r\n\t\t\t\tif (!this._columnReorderState.isDragging || this._isHeaderFixedForColumnReorder(sourceTh)) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tconst toIndex = this._findHeaderIndex(sourceTh);\r\n\t\t\t\tif (toIndex < 0) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tthis._columnReorderState.toIndex = toIndex;\r\n\t\t\t\tthis._syncColumnDragOverMarker(toIndex);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (type === 'drop') {\r\n\t\t\t\tif (!this._columnReorderState.isDragging) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tif (this._isHeaderFixedForColumnReorder(sourceTh)) {\r\n\t\t\t\t\tthis._resetColumnDragMarkers();\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tconst toIndex = this._findHeaderIndex(sourceTh);\r\n\t\t\t\tif (toIndex < 0) {\r\n\t\t\t\t\tthis._resetColumnDragMarkers();\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tconst fromIndex = this._columnReorderState.fromIndex;\r\n\t\t\t\tthis._resetColumnDragMarkers();\r\n\t\t\t\tthis._finalizeColumnReorder(fromIndex, toIndex);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tthis._resetColumnDragMarkers();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (type === 'change') {\r\n\t\t\tconst clonedSelectAll = target.closest('[data-select-all]');\r\n\t\t\tif (!clonedSelectAll) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tconst sourceSelectAll = sourceTh.querySelector('[data-select-all]');\r\n\t\t\tif (!sourceSelectAll) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tsourceSelectAll.checked = Boolean(clonedSelectAll.checked);\r\n\t\t\tsourceSelectAll.dispatchEvent(new Event('change', { bubbles: true }));\r\n\t\t\tthis._syncCloneStickyHeader();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (type === 'click') {\r\n\t\t\tconst clonedSelectAll = target.closest('[data-select-all]');\r\n\t\t\tif (clonedSelectAll) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst clonedArrow = target.closest('[data-sort-arrow]');\r\n\t\tlet clickTarget = sourceTh;\r\n\t\tif (clonedArrow) {\r\n\t\t\tconst dir = clonedArrow.getAttribute('data-sort-arrow');\r\n\t\t\tconst sourceArrow = sourceTh.querySelector(`[data-sort-arrow=\"${dir}\"]`);\r\n\t\t\tif (sourceArrow) {\r\n\t\t\t\tclickTarget = sourceArrow;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tconst clonedSelectAll = target.closest('[data-select-all]');\r\n\t\t\tif (clonedSelectAll) {\r\n\t\t\t\tconst sourceSelectAll = sourceTh.querySelector('[data-select-all]');\r\n\t\t\t\tif (sourceSelectAll) {\r\n\t\t\t\t\tclickTarget = sourceSelectAll;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tclickTarget.dispatchEvent(new MouseEvent('click', {\r\n\t\t\tbubbles: true,\r\n\t\t\tcancelable: true,\r\n\t\t\tview: window,\r\n\t\t\tshiftKey: Boolean(event.shiftKey),\r\n\t\t\tctrlKey: Boolean(event.ctrlKey),\r\n\t\t\taltKey: Boolean(event.altKey),\r\n\t\t\tmetaKey: Boolean(event.metaKey),\r\n\t\t}));\r\n\t\tthis._syncCloneStickyHeader();\r\n\t}\r\n\r\n\t_renderRemoteRows(rows) {\n\t\tconst body = this._getBody();\r\n\r\n\t\tif (!rows.length) {\r\n\t\t\tconst message = this._getTableMessage('stateEmpty', 'Ничего нет');\r\n\t\t\tthis._renderStateRow(message, 'empty');\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._setFixedColumnsSuppressed(false);\r\n\t\tthis._clearStateMode();\r\n\t\tbody.innerHTML = rows.map((row) => {\r\n\t\t\tconst cells = this._fields.map((field) => {\r\n\t\t\t\tconst rawValue = row && Object.prototype.hasOwnProperty.call(row, field) ? row[field] : '';\r\n\t\t\t\tconst prepared = this._formatFieldValue(field, rawValue);\r\n\t\t\t\treturn `<td>${this._escapeHtml(prepared)}</td>`;\r\n\t\t\t});\r\n\t\t\treturn `<tr>${cells.join('')}</tr>`;\r\n\t\t}).join('');\r\n\t\tthis._updatePanHintVisibility();\r\n\t}\r\n\r\n\t_renderStateRow(message, state) {\r\n\t\tconst body = this._getBody();\r\n\t\tconst columns = this._getRenderedColumnsCount();\r\n\t\tconst retryButton = state === 'error'\r\n\t\t\t? `<div class=\"vgdt-state-actions\"><button type=\"button\" class=\"vgdt-state-reset\" data-state-retry>${this._escapeHtml(this._getTableMessage('retry', 'Повторить'))}</button></div>`\r\n\t\t\t: '';\r\n\t\tconst illustration = this._buildStateIllustrationMarkup(state);\r\n\t\tbody.innerHTML = `<tr><td colspan=\"${columns}\" data-table-state=\"${state}\"><div class=\"vgdt-state\">${illustration}<div class=\"vgdt-state-text\">${this._escapeHtml(message)}</div>${retryButton}</div></td></tr>`;\r\n\t\tconst stateCell = body.querySelector('[data-table-state]');\r\n\t\tthis._setFixedColumnsSuppressed(true);\r\n\t\tthis._setStateMode(state);\r\n\t\tthis._ensureStateRowVisible(stateCell);\r\n\t\tthis._announce(message);\r\n\t\tthis._clearFooter();\r\n\t\tthis._updatePanHintVisibility();\r\n\t\tthis._refreshStickyAndFixedLayout();\r\n\t}\r\n\r\n\t_scrollToPaginationTop() {\r\n\t\tif (!this._isPaginationScrollToTopEnabled()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (this._tableViewport) {\r\n\t\t\tthis._tableViewport.scrollTop = 0;\r\n\t\t\tthis._tableViewport.scrollLeft = 0;\r\n\t\t}\r\n\t\tif (typeof window === 'undefined' || !this._parent) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst targetTop = this._getPaginationScrollTopTarget();\r\n\t\tconst currentTop = window.pageYOffset || window.scrollY || 0;\r\n\t\tif (!Number.isFinite(targetTop)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (Math.abs(targetTop - currentTop) < 2) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst prefersReducedMotion = typeof window.matchMedia === 'function'\r\n\t\t\t&& window.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n\r\n\t\twindow.scrollTo({\r\n\t\t\ttop: Math.max(0, Math.round(targetTop)),\r\n\t\t\tbehavior: prefersReducedMotion ? 'auto' : 'smooth',\r\n\t\t});\r\n\t}\r\n\r\n\t_getPaginationScrollTopTarget() {\r\n\t\tif (this._isPaginationScrollToWindowTopEnabled()) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tconst rect = this._parent.getBoundingClientRect();\r\n\t\tif (!Number.isFinite(rect.top)) {\r\n\t\t\treturn NaN;\r\n\t\t}\r\n\t\treturn rect.top + (window.pageYOffset || window.scrollY || 0);\r\n\t}\r\n\r\n\t_isPaginationScrollToTopEnabled() {\r\n\t\tconst pagination = this._params.pagination || {};\r\n\t\tconst option = pagination.scrollToTop;\r\n\t\tif (option === undefined || option === null) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn Boolean(option);\r\n\t}\r\n\r\n\t_isPaginationScrollToWindowTopEnabled() {\r\n\t\tconst pagination = this._params.pagination || {};\r\n\t\tconst option = pagination.scrollToWindowTop;\r\n\t\tif (option === undefined || option === null) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn Boolean(option);\r\n\t}\r\n\r\n\t_getI18nSection(section) {\r\n\t\tconst i18n = this._params.i18n && typeof this._params.i18n === 'object'\r\n\t\t\t? this._params.i18n\r\n\t\t\t: {};\r\n\t\tconst defaultI18n = DEFAULT_OPTIONS.i18n && typeof DEFAULT_OPTIONS.i18n === 'object'\r\n\t\t\t? DEFAULT_OPTIONS.i18n\r\n\t\t\t: {};\r\n\t\tconst localeRaw = String(this._params.locale || 'ru').toLowerCase();\r\n\t\tconst locale = localeRaw.split('-')[0];\r\n\t\tconst baseLocale = defaultI18n[localeRaw] || defaultI18n[locale] || defaultI18n.ru || {};\r\n\t\tconst baseSection = baseLocale[section] && typeof baseLocale[section] === 'object' ? baseLocale[section] : {};\r\n\r\n\t\tconst localized = i18n[localeRaw] || i18n[locale];\r\n\t\tconst localizedSection = localized && typeof localized === 'object' && localized[section] && typeof localized[section] === 'object'\r\n\t\t\t? localized[section]\r\n\t\t\t: {};\r\n\r\n\t\treturn Object.assign({}, baseSection, localizedSection);\r\n\t}\r\n\r\n\t_getTableMessage(key, fallback) {\r\n\t\tconst tableI18n = this._getI18nSection('table');\r\n\t\tconst value = tableI18n[key];\r\n\t\treturn typeof value === 'string' && value.trim() ? value : fallback;\r\n\t}\r\n\r\n\tasync _waitMinLoadingDelay(startedAt) {\r\n\t\tconst loadingOptions = this._params.loading || {};\r\n\t\tconst minDelayMs = Math.max(0, Number.parseInt(loadingOptions.minDelay, 10) || 0);\r\n\t\tif (minDelayMs <= 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst elapsed = Date.now() - startedAt;\r\n\t\tconst remaining = minDelayMs - elapsed;\r\n\t\tif (remaining <= 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tawait new Promise((resolve) => setTimeout(resolve, remaining));\r\n\t}\r\n\r\n\t_ensureSummaryNode() {\r\n\t\tif (!this._isSummaryEnabled() || this._summaryNode || !this._parent) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst node = document.createElement('div');\r\n\t\tnode.className = 'vgdt-summary';\r\n\t\tnode.hidden = true;\r\n\t\tconst anchor = this._tableViewport && this._tableViewport.parentElement === this._parent\r\n\t\t\t? this._tableViewport\r\n\t\t\t: this._element;\r\n\t\tthis._parent.insertBefore(node, anchor);\r\n\t\tthis._summaryNode = node;\r\n\t}\r\n\r\n}\r\n\r\nObject.assign(\r\n\tVGDynamicTable.prototype,\r\n\tfixedColumnsMethods,\r\n\tviewportMethods,\r\n\tsummaryFooterMethods,\r\n\tskeletonMethods,\r\n\ttableRemoteMethods,\r\n\ttableUrlStateMethods,\r\n\ttableStateMethods\r\n);\r\n\r\nEventHandler.on(document, 'DOMContentLoaded', () => {\r\n\tVGDynamicTable.initAll();\r\n});\r\n\r\nexport default VGDynamicTable;\r\n\r\n","import EventHandler from \"../../../utils/js/dom/event\";\r\nimport Data from \"../../../utils/js/dom/data\";\r\n\r\nconst TABLE_SELECTOR = '[data-vg-table]';\r\nconst ROW_SELECTOR = 'tbody tr:not([data-group-header=\"1\"])';\r\nconst ROW_CHECK_SELECTOR = '[data-row-select]';\r\nconst CHECK_ALL_SELECTOR = '[data-select-all]';\r\nconst DEFAULT_ROW_REORDER_HANDLE_SELECTOR = '[data-row-reorder-handle]';\r\nconst ROW_REORDER_IGNORE_SELECTOR = 'input, button, a, select, textarea, [contenteditable=\"true\"]';\r\nconst TABLE_DATA_KEY = 'vg.dynamicTable';\r\nconst ACTION_CALLBACK_MAP = {\r\n rowcheck: 'onRowCheck',\r\n checkall: 'onCheckAll',\r\n rowreorder: 'onRowReorder',\r\n};\r\n\r\nclass Editable {\r\n static _getInitStore() {\r\n if (!this.__initStore) {\r\n this.__initStore = new WeakSet();\r\n }\r\n return this.__initStore;\r\n }\r\n\r\n static _getDragStore() {\r\n if (!this.__dragStore) {\r\n this.__dragStore = new WeakMap();\r\n }\r\n return this.__dragStore;\r\n }\r\n\r\n static initAll() {\r\n const tables = Array.from(document.querySelectorAll(TABLE_SELECTOR));\r\n tables.forEach((table) => {\r\n if (!this._isEditableEnabled(table)) {\r\n return;\r\n }\r\n\r\n const initStore = this._getInitStore();\r\n if (initStore.has(table)) {\r\n this._syncSelectAll(table);\r\n this._syncRowReorder(table);\r\n return;\r\n }\r\n\r\n initStore.add(table);\r\n this._bind(table);\r\n this._syncSelectAll(table);\r\n this._syncRowReorder(table);\r\n });\r\n }\r\n\r\n static _bind(table) {\r\n table.addEventListener('change', (event) => {\r\n const checkAll = event.target.closest(CHECK_ALL_SELECTOR);\r\n if (checkAll) {\r\n this._toggleAll(table, Boolean(checkAll.checked));\r\n this._syncSelectAll(table);\r\n this._emit(table, 'checkall', this._getSelectionPayload(table, {\r\n checked: Boolean(checkAll.checked),\r\n }));\r\n return;\r\n }\r\n\r\n const rowCheckbox = event.target.closest(ROW_CHECK_SELECTOR);\r\n if (!rowCheckbox) {\r\n return;\r\n }\r\n\r\n this._syncSelectAll(table);\r\n const row = rowCheckbox.closest('tr');\r\n this._emit(table, 'rowcheck', this._getSelectionPayload(table, {\r\n checked: Boolean(rowCheckbox.checked),\r\n row: this._getRowPayload(table, row),\r\n }));\r\n });\r\n\r\n table.addEventListener('dragstart', (event) => {\r\n this._handleRowDragStart(table, event);\r\n });\r\n table.addEventListener('dragover', (event) => {\r\n this._handleRowDragOver(table, event);\r\n });\r\n table.addEventListener('drop', (event) => {\r\n this._handleRowDrop(table, event);\r\n });\r\n table.addEventListener('dragend', () => {\r\n this._clearRowDragState(table);\r\n });\r\n\r\n const eventPrefix = this._getEventPrefix(table);\r\n table.addEventListener(`${eventPrefix}:dataloaded`, () => {\r\n this._syncSelectAll(table);\r\n this._syncRowReorder(table);\r\n });\r\n }\r\n\r\n static _toggleAll(table, checked) {\r\n Array.from(table.querySelectorAll(`${ROW_SELECTOR} ${ROW_CHECK_SELECTOR}`)).forEach((node) => {\r\n node.checked = checked;\r\n });\r\n }\r\n\r\n static _syncSelectAll(table) {\r\n const rowCheckboxes = Array.from(table.querySelectorAll(`${ROW_SELECTOR} ${ROW_CHECK_SELECTOR}`));\r\n const total = rowCheckboxes.length;\r\n const selected = rowCheckboxes.filter((node) => node.checked).length;\r\n const checkAll = table.querySelector(CHECK_ALL_SELECTOR);\r\n if (!checkAll) {\r\n return;\r\n }\r\n checkAll.checked = total > 0 && selected === total;\r\n checkAll.indeterminate = selected > 0 && selected < total;\r\n }\r\n\r\n static _getSelectionPayload(table, extra = {}) {\r\n const rowCheckboxes = Array.from(table.querySelectorAll(`${ROW_SELECTOR} ${ROW_CHECK_SELECTOR}`));\r\n const total = rowCheckboxes.length;\r\n const selected = rowCheckboxes.filter((node) => node.checked).length;\r\n return Object.assign({ total, selected }, extra);\r\n }\r\n\r\n static _isEditableEnabled(table) {\r\n const editableOptions = this._getEditableOptions(this._getTableInstance(table));\r\n if (editableOptions.enable !== undefined) {\r\n return Boolean(editableOptions.enable);\r\n }\r\n const attrEnabled = table.getAttribute('data-editable-enable');\r\n if (attrEnabled === null) {\r\n return false;\r\n }\r\n return this._parseBool(attrEnabled, false);\r\n }\r\n\r\n static _isRowReorderEnabled(table) {\r\n const editableOptions = this._getEditableOptions(this._getTableInstance(table));\r\n const attrEnabled = table.getAttribute('data-row-reorder-enable');\r\n if (attrEnabled !== null) {\r\n return this._parseBool(attrEnabled, false);\r\n }\r\n if (editableOptions.rowReorder !== undefined) {\r\n return Boolean(editableOptions.rowReorder);\r\n }\r\n return true;\r\n }\r\n\r\n static _getRowReorderMode(table) {\r\n const editableOptions = this._getEditableOptions(this._getTableInstance(table));\r\n const attrMode = table.getAttribute('data-row-reorder-mode');\r\n const mode = String(attrMode !== null ? attrMode : editableOptions.rowReorderMode || 'row').trim().toLowerCase();\r\n return mode === 'handle' ? 'handle' : 'row';\r\n }\r\n\r\n static _getRowReorderHandleSelector(table) {\r\n const editableOptions = this._getEditableOptions(this._getTableInstance(table));\r\n const attrSelector = String(table.getAttribute('data-row-reorder-handle-selector') || '').trim();\r\n const optionSelector = String(editableOptions.rowReorderHandleSelector || '').trim();\r\n return attrSelector || optionSelector || DEFAULT_ROW_REORDER_HANDLE_SELECTOR;\r\n }\r\n\r\n static _syncRowReorder(table) {\r\n const enabled = this._isRowReorderEnabled(table);\r\n const mode = this._getRowReorderMode(table);\r\n const handleSelector = this._getRowReorderHandleSelector(table);\r\n const rows = Array.from(table.querySelectorAll(ROW_SELECTOR));\r\n\r\n rows.forEach((row) => {\r\n const handles = Array.from(row.querySelectorAll(handleSelector));\r\n if (!enabled) {\r\n row.removeAttribute('data-row-reorder');\r\n row.removeAttribute('data-row-reorder-mode');\r\n row.setAttribute('draggable', 'false');\r\n handles.forEach((handle) => handle.setAttribute('draggable', 'false'));\r\n return;\r\n }\r\n\r\n row.setAttribute('data-row-reorder', '1');\r\n row.setAttribute('data-row-reorder-mode', mode);\r\n row.setAttribute('draggable', mode === 'row' ? 'true' : 'false');\r\n handles.forEach((handle) => handle.setAttribute('draggable', mode === 'handle' ? 'true' : 'false'));\r\n });\r\n\r\n if (!enabled) {\r\n this._clearRowDragState(table);\r\n }\r\n }\r\n\r\n static _getRowDragState(table) {\r\n const store = this._getDragStore();\r\n if (!store.has(table)) {\r\n store.set(table, {\r\n fromRow: null,\r\n fromIndex: -1,\r\n overRow: null,\r\n overAfter: false,\r\n });\r\n }\r\n return store.get(table);\r\n }\r\n\r\n static _clearRowDragState(table) {\r\n const state = this._getRowDragState(table);\r\n Array.from(table.querySelectorAll(`${ROW_SELECTOR}[data-row-dragging], ${ROW_SELECTOR}[data-row-drag-over]`)).forEach((row) => {\r\n row.removeAttribute('data-row-dragging');\r\n row.removeAttribute('data-row-drag-over');\r\n });\r\n state.fromRow = null;\r\n state.fromIndex = -1;\r\n state.overRow = null;\r\n state.overAfter = false;\r\n }\r\n\r\n static _handleRowDragStart(table, event) {\r\n if (!this._isRowReorderEnabled(table)) {\r\n return;\r\n }\r\n\r\n const row = event.target && event.target.closest ? event.target.closest(`${ROW_SELECTOR}[data-row-reorder=\"1\"]`) : null;\r\n if (!row || !table.contains(row)) {\r\n return;\r\n }\r\n\r\n const mode = this._getRowReorderMode(table);\r\n if (mode === 'handle') {\r\n const handleSelector = this._getRowReorderHandleSelector(table);\r\n const isFromHandle = Boolean(event.target && event.target.closest && event.target.closest(handleSelector));\r\n if (!isFromHandle) {\r\n event.preventDefault();\r\n return;\r\n }\r\n } else if (event.target && event.target.closest && event.target.closest(ROW_REORDER_IGNORE_SELECTOR)) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n const state = this._getRowDragState(table);\r\n state.fromRow = row;\r\n state.fromIndex = this._getBodyRowIndex(table, row);\r\n state.overRow = null;\r\n state.overAfter = false;\r\n row.setAttribute('data-row-dragging', '1');\r\n\r\n if (event.dataTransfer) {\r\n event.dataTransfer.effectAllowed = 'move';\r\n event.dataTransfer.setData('text/plain', 'row-reorder');\r\n }\r\n }\r\n\r\n static _handleRowDragOver(table, event) {\r\n const state = this._getRowDragState(table);\r\n if (!state.fromRow) {\r\n return;\r\n }\r\n\r\n const row = event.target && event.target.closest ? event.target.closest(`${ROW_SELECTOR}[data-row-reorder=\"1\"]`) : null;\r\n if (!row || !table.contains(row)) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n const rect = row.getBoundingClientRect();\r\n const insertAfter = event.clientY > rect.top + (rect.height / 2);\r\n state.overRow = row;\r\n state.overAfter = insertAfter;\r\n\r\n Array.from(table.querySelectorAll(`${ROW_SELECTOR}[data-row-drag-over]`)).forEach((node) => {\r\n node.removeAttribute('data-row-drag-over');\r\n });\r\n if (row !== state.fromRow) {\r\n row.setAttribute('data-row-drag-over', insertAfter ? 'after' : 'before');\r\n }\r\n }\r\n\r\n static _handleRowDrop(table, event) {\r\n const state = this._getRowDragState(table);\r\n if (!state.fromRow) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n const targetRow = state.overRow;\r\n if (!targetRow || !table.contains(targetRow)) {\r\n this._clearRowDragState(table);\r\n return;\r\n }\r\n\r\n const moved = this._moveRow(table, state.fromRow, targetRow, state.overAfter);\r\n if (!moved) {\r\n this._clearRowDragState(table);\r\n return;\r\n }\r\n\r\n const toIndex = this._getBodyRowIndex(table, state.fromRow);\r\n this._syncSelectAll(table);\r\n this._emit(table, 'rowreorder', {\r\n row: this._getRowPayload(table, state.fromRow),\r\n fromIndex: state.fromIndex,\r\n toIndex,\r\n beforeRow: this._getSiblingRowPayload(table, state.fromRow, 'prev'),\r\n afterRow: this._getSiblingRowPayload(table, state.fromRow, 'next'),\r\n });\r\n this._clearRowDragState(table);\r\n }\r\n\r\n static _moveRow(table, fromRow, targetRow, insertAfter) {\r\n const body = table.tBodies && table.tBodies[0] ? table.tBodies[0] : null;\r\n if (!body || !fromRow || !targetRow || fromRow === targetRow) {\r\n return false;\r\n }\r\n\r\n if (insertAfter) {\r\n if (targetRow.nextSibling === fromRow) {\r\n return false;\r\n }\r\n body.insertBefore(fromRow, targetRow.nextSibling);\r\n return true;\r\n }\r\n\r\n if (fromRow.nextSibling === targetRow) {\r\n return false;\r\n }\r\n body.insertBefore(fromRow, targetRow);\r\n return true;\r\n }\r\n\r\n static _getBodyRowIndex(table, row) {\r\n const body = table.tBodies && table.tBodies[0] ? table.tBodies[0] : null;\r\n if (!body || !row) {\r\n return -1;\r\n }\r\n return Array.from(body.rows).indexOf(row);\r\n }\r\n\r\n static _getSiblingRowPayload(table, row, direction) {\r\n if (!row) {\r\n return null;\r\n }\r\n const sibling = direction === 'prev' ? row.previousElementSibling : row.nextElementSibling;\r\n if (!sibling || sibling.tagName !== 'TR') {\r\n return null;\r\n }\r\n return this._getRowPayload(table, sibling);\r\n }\r\n\r\n static _getRowPayload(table, row) {\r\n if (!row) {\r\n return null;\r\n }\r\n const headers = Array.from(table.querySelectorAll('thead th')).map((cell) => String(cell.textContent || '').trim());\r\n const cells = Array.from(row.cells || []).map((cell) => String(cell.textContent || '').trim());\r\n return {\r\n index: this._getBodyRowIndex(table, row),\r\n headers,\r\n cells,\r\n values: headers.reduce((acc, key, idx) => {\r\n const normalized = key || `col_${idx}`;\r\n acc[normalized] = cells[idx] || '';\r\n return acc;\r\n }, {}),\r\n };\r\n }\r\n\r\n static _emit(table, action, payload = {}) {\r\n const normalizedAction = String(action || '').toLowerCase().trim();\r\n if (!normalizedAction) {\r\n return;\r\n }\r\n\r\n const instance = this._getTableInstance(table);\r\n const detail = Object.assign({\r\n action: normalizedAction,\r\n table,\r\n isRemote: Boolean(instance && instance._isRemote),\r\n }, payload);\r\n\r\n const callbacks = instance && instance._params && instance._params.callbacks && typeof instance._params.callbacks === 'object'\r\n ? instance._params.callbacks\r\n : {};\r\n const callbackName = ACTION_CALLBACK_MAP[normalizedAction] || '';\r\n const callback = callbackName ? callbacks[callbackName] : null;\r\n if (typeof callback === 'function') {\r\n callback(detail, instance);\r\n }\r\n\r\n const events = instance && instance._params && instance._params.events ? instance._params.events : {};\r\n const enabled = events.enable === undefined ? true : Boolean(events.enable);\r\n if (!enabled || typeof window.CustomEvent !== 'function') {\r\n return;\r\n }\r\n\r\n const prefix = String(events.prefix || 'vgdt').trim() || 'vgdt';\r\n const bubbles = events.bubbles === undefined ? true : Boolean(events.bubbles);\r\n table.dispatchEvent(new CustomEvent(`${prefix}:${normalizedAction}`, {\r\n detail,\r\n bubbles,\r\n }));\r\n }\r\n\r\n static _getEditableOptions(instance = null) {\r\n const current = instance || null;\r\n return current && current._params && current._params.editable && typeof current._params.editable === 'object'\r\n ? current._params.editable\r\n : {};\r\n }\r\n\r\n static _getTableInstance(table) {\r\n if (!table) {\r\n return null;\r\n }\r\n return Data.get(table, TABLE_DATA_KEY);\r\n }\r\n\r\n static _getEventPrefix(table) {\r\n const instance = this._getTableInstance(table);\r\n const events = instance && instance._params && instance._params.events ? instance._params.events : {};\r\n return String(events.prefix || 'vgdt').trim() || 'vgdt';\r\n }\r\n\r\n static _parseBool(value, fallback = false) {\r\n if (value === undefined || value === null) {\r\n return fallback;\r\n }\r\n const normalized = String(value).toLowerCase().trim();\r\n if (normalized === '1' || normalized === 'true' || normalized === 'yes' || normalized === 'on') {\r\n return true;\r\n }\r\n if (normalized === '0' || normalized === 'false' || normalized === 'no' || normalized === 'off') {\r\n return false;\r\n }\r\n return fallback;\r\n }\r\n}\r\n\r\nEventHandler.on(document, 'DOMContentLoaded', () => {\r\n Editable.initAll();\r\n});\r\n\r\nexport default Editable;\r\n","const DEFAULT_OPTIONS = {\r\n\tpathAttribute: 'data-vg-filepreview',\r\n\tfieldsAttribute: 'data-fields',\r\n\tvalidAttribute: 'data-vg-filepreview-valid',\r\n\terrorAttribute: 'data-vg-filepreview-error',\r\n\terrorValue: 'invalid-file-path',\r\n\tfieldAttribute: 'data-vg-filepreview-field',\r\n\teditableAttribute: 'data-vg-filepreview-editable',\r\n\teditableFieldsAttribute: 'data-vg-filepreview-editable-fields',\r\n\tmissingFieldsAttribute: 'data-vg-filepreview-missing-fields'\r\n};\r\n\r\nclass FilePreviewHelper {\r\n\tconstructor(element, options = {}) {\r\n\t\tthis._element = element;\r\n\t\tthis._options = Object.assign({}, DEFAULT_OPTIONS, options);\r\n\t}\r\n\r\n\tgetFilePath() {\r\n\t\tif (!this._element) {\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\tconst filePath = this._element.getAttribute(this._options.pathAttribute);\r\n\t\treturn typeof filePath === 'string' ? filePath.trim() : '';\r\n\t}\r\n\r\n\tgetFields() {\r\n\t\tif (!this._element) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\tconst rawFields = this._element.getAttribute(this._options.fieldsAttribute);\r\n\t\tif (typeof rawFields !== 'string' || !rawFields.trim()) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\treturn rawFields\r\n\t\t\t.split(',')\r\n\t\t\t.map(field => field.trim())\r\n\t\t\t.filter(field => field && /^[-_a-zA-Z0-9]+$/.test(field));\r\n\t}\r\n\r\n\tvalidateFilePath(path) {\r\n\t\tif (!path || path === '#' || /^javascript:/i.test(path)) {\r\n\t\t\treturn { isValid: false, fileUrl: null };\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tconst parsed = new URL(path, window.location.origin);\r\n\t\t\tconst protocol = parsed.protocol;\r\n\r\n\t\t\tif (!['http:', 'https:', 'blob:', 'data:'].includes(protocol)) {\r\n\t\t\t\treturn { isValid: false, fileUrl: null };\r\n\t\t\t}\r\n\r\n\t\t\tif (protocol === 'data:' || protocol === 'blob:') {\r\n\t\t\t\treturn { isValid: true, fileUrl: parsed };\r\n\t\t\t}\r\n\r\n\t\t\tconst pathname = parsed.pathname || '';\r\n\t\t\tconst fileName = pathname.split('/').filter(Boolean).pop() || '';\r\n\t\t\tif (!fileName || !fileName.includes('.')) {\r\n\t\t\t\treturn { isValid: false, fileUrl: null };\r\n\t\t\t}\r\n\r\n\t\t\treturn { isValid: true, fileUrl: parsed };\r\n\t\t} catch {\r\n\t\t\treturn { isValid: false, fileUrl: null };\r\n\t\t}\r\n\t}\r\n\r\n\tsyncState(isValid) {\r\n\t\tif (!this._element) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._element.setAttribute(this._options.validAttribute, isValid ? 'true' : 'false');\r\n\r\n\t\tif (isValid) {\r\n\t\t\tthis._element.removeAttribute(this._options.errorAttribute);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._element.setAttribute(this._options.errorAttribute, this._options.errorValue);\r\n\t}\r\n\r\n\tresolveEditableFields(fields = []) {\r\n\t\tif (!this._element || !Array.isArray(fields) || !fields.length) {\r\n\t\t\treturn {};\r\n\t\t}\r\n\r\n\t\treturn fields.reduce((acc, field) => {\r\n\t\t\tacc[field] = this._element.querySelector(`.${this._escapeClassName(field)}`);\r\n\t\t\treturn acc;\r\n\t\t}, {});\r\n\t}\r\n\r\n\tsyncEditableFields(fieldsMap = {}) {\r\n\t\tif (!this._element) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst previousMarkedFields = this._element.querySelectorAll(`[${this._options.fieldAttribute}]`);\r\n\t\tpreviousMarkedFields.forEach((node) => {\r\n\t\t\tnode.removeAttribute(this._options.fieldAttribute);\r\n\t\t\tnode.setAttribute(this._options.editableAttribute, 'false');\r\n\t\t});\r\n\r\n\t\tconst editableFields = [];\r\n\t\tconst missingFields = [];\r\n\r\n\t\tObject.entries(fieldsMap).forEach(([field, node]) => {\r\n\t\t\tif (!node) {\r\n\t\t\t\tmissingFields.push(field);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tnode.setAttribute(this._options.fieldAttribute, field);\r\n\t\t\tnode.setAttribute(this._options.editableAttribute, 'true');\r\n\t\t\teditableFields.push(field);\r\n\t\t});\r\n\r\n\t\tif (editableFields.length) {\r\n\t\t\tthis._element.setAttribute(this._options.editableFieldsAttribute, editableFields.join(','));\r\n\t\t} else {\r\n\t\t\tthis._element.removeAttribute(this._options.editableFieldsAttribute);\r\n\t\t}\r\n\r\n\t\tif (missingFields.length) {\r\n\t\t\tthis._element.setAttribute(this._options.missingFieldsAttribute, missingFields.join(','));\r\n\t\t} else {\r\n\t\t\tthis._element.removeAttribute(this._options.missingFieldsAttribute);\r\n\t\t}\r\n\t}\r\n\r\n\t_escapeClassName(value) {\r\n\t\tif (window.CSS && typeof window.CSS.escape === 'function') {\r\n\t\t\treturn window.CSS.escape(value);\r\n\t\t}\r\n\r\n\t\treturn String(value).replace(/([ !\"#$%&'()*+,./:;<=>?@[\\\\\\]^`{|}~])/g, '\\\\$1');\r\n\t}\r\n\r\n\tgetFileMeta(path) {\r\n\t\tconst normalizedPath = typeof path === 'string' ? path.trim() : '';\r\n\t\tconst fallback = {\r\n\t\t\tname: '',\r\n\t\t\text: '',\r\n\t\t\toriginalName: '',\r\n\t\t\tisMedia: false,\r\n\t\t\tsizeBytes: null,\r\n\t\t\tsizeText: ''\r\n\t\t};\r\n\r\n\t\tif (!normalizedPath) {\r\n\t\t\treturn fallback;\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tconst parsedUrl = new URL(normalizedPath, window.location.origin);\r\n\t\t\tconst pathname = parsedUrl.pathname || '';\r\n\t\t\tconst params = parsedUrl.searchParams;\r\n\t\t\tconst originalName = this._readOriginalName(params);\r\n\t\t\tlet fileName = decodeURIComponent(pathname.split('/').pop() || '');\r\n\r\n\t\t\t// blob/data urls often do not contain real filename; prefer explicit original name\r\n\t\t\tif (!fileName || !fileName.includes('.')) {\r\n\t\t\t\tfileName = originalName || fileName;\r\n\t\t\t}\r\n\r\n\t\t\tconst ext = fileName.includes('.') ? `.${fileName.split('.').pop() || ''}` : '';\r\n\t\t\tconst sizeBytes = this._readSize(params);\r\n\t\t\tconst mediaByExt = ['.mp3', '.wav', '.ogg', '.flac', '.aac', '.m4a', '.mp4', '.webm', '.mov', '.mkv', '.avi'];\r\n\r\n\t\t\treturn {\r\n\t\t\t\tname: fileName,\r\n\t\t\t\text: ext.toLowerCase(),\r\n\t\t\t\toriginalName,\r\n\t\t\t\tisMedia: mediaByExt.includes(ext.toLowerCase()),\r\n\t\t\t\tsizeBytes,\r\n\t\t\t\tsizeText: this._formatSize(sizeBytes)\r\n\t\t\t};\r\n\t\t} catch {\r\n\t\t\tconst cleanPath = normalizedPath.split('#')[0].split('?')[0];\r\n\t\t\tlet fileName = decodeURIComponent(cleanPath.split('/').pop() || '');\r\n\t\t\tconst originalName = this._readOriginalName(null);\r\n\t\t\tif (!fileName || !fileName.includes('.')) {\r\n\t\t\t\tfileName = originalName || fileName;\r\n\t\t\t}\r\n\t\t\tconst ext = fileName.includes('.') ? `.${fileName.split('.').pop() || ''}` : '';\r\n\t\t\tconst sizeBytes = this._readSize(null);\r\n\r\n\t\t\treturn {\r\n\t\t\t\tname: fileName,\r\n\t\t\t\text: ext.toLowerCase(),\r\n\t\t\t\toriginalName: originalName || '',\r\n\t\t\t\tisMedia: false,\r\n\t\t\t\tsizeBytes,\r\n\t\t\t\tsizeText: this._formatSize(sizeBytes)\r\n\t\t\t};\r\n\t\t}\r\n\t}\r\n\r\n\t_readOriginalName(searchParams) {\r\n\t\tconst fromData = this._element?.getAttribute('data-original-name')\r\n\t\t\t|| this._element?.getAttribute('data-vg-filepreview-original-name')\r\n\t\t\t|| '';\r\n\t\tif (fromData) {\r\n\t\t\treturn String(fromData).trim();\r\n\t\t}\r\n\r\n\t\tconst keys = ['original_name', 'originalName', 'filename', 'name'];\r\n\t\tfor (const key of keys) {\r\n\t\t\tconst value = searchParams.get(key);\r\n\t\t\tif (value) {\r\n\t\t\t\treturn String(value).trim();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn '';\r\n\t}\r\n\r\n\t_readSize(searchParams) {\r\n\t\tconst dataCandidates = [\r\n\t\t\tthis._element?.getAttribute('data-size'),\r\n\t\t\tthis._element?.getAttribute('data-vg-filepreview-size')\r\n\t\t];\r\n\r\n\t\tfor (const value of dataCandidates) {\r\n\t\t\tconst parsed = this._parseSizeValue(value);\r\n\t\t\tif (parsed !== null) {\r\n\t\t\t\treturn parsed;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!searchParams) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst keys = ['size', 'size_bytes', 'bytes'];\r\n\t\tfor (const key of keys) {\r\n\t\t\tconst value = searchParams.get(key);\r\n\t\t\tconst parsed = this._parseSizeValue(value);\r\n\t\t\tif (parsed !== null) {\r\n\t\t\t\treturn parsed;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t}\r\n\r\n\t_parseSizeValue(value) {\r\n\t\tif (value === null || value === undefined) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst normalized = String(value).trim().toLowerCase();\r\n\t\tif (!normalized) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst match = normalized.match(/^(\\d+(?:\\.\\d+)?)\\s*(b|kb|mb|gb|tb)?$/i);\r\n\t\tif (!match) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst number = Number.parseFloat(match[1]);\r\n\t\tif (!Number.isFinite(number) || number < 0) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst unit = (match[2] || 'b').toLowerCase();\r\n\t\tconst multipliers = {\r\n\t\t\tb: 1,\r\n\t\t\tkb: 1024,\r\n\t\t\tmb: 1024 * 1024,\r\n\t\t\tgb: 1024 * 1024 * 1024,\r\n\t\t\ttb: 1024 * 1024 * 1024 * 1024\r\n\t\t};\r\n\r\n\t\treturn Math.round(number * (multipliers[unit] || 1));\r\n\t}\r\n\r\n\t_formatSize(bytes) {\r\n\t\tif (!Number.isFinite(bytes) || bytes < 0) {\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\tconst units = ['B', 'KB', 'MB', 'GB', 'TB'];\r\n\t\tlet value = bytes;\r\n\t\tlet unitIndex = 0;\r\n\r\n\t\twhile (value >= 1024 && unitIndex < units.length - 1) {\r\n\t\t\tvalue /= 1024;\r\n\t\t\tunitIndex += 1;\r\n\t\t}\r\n\r\n\t\tconst fractionDigits = value >= 100 || unitIndex === 0 ? 0 : 2;\r\n\t\treturn `${value.toFixed(fractionDigits)} ${units[unitIndex]}`;\r\n\t}\r\n}\r\n\r\nexport default FilePreviewHelper;\r\n","const AUDIO_EXTENSIONS = new Set(['mp3']);\r\n\r\nconst readSyncSafeInt = (bytes, offset = 0) => {\r\n\treturn ((bytes[offset] & 0x7f) << 21)\r\n\t\t| ((bytes[offset + 1] & 0x7f) << 14)\r\n\t\t| ((bytes[offset + 2] & 0x7f) << 7)\r\n\t\t| (bytes[offset + 3] & 0x7f);\r\n};\r\n\r\nconst readUInt32 = (view, offset, useSyncSafe) => {\r\n\tif (useSyncSafe) {\r\n\t\treturn readSyncSafeInt([\r\n\t\t\tview.getUint8(offset),\r\n\t\t\tview.getUint8(offset + 1),\r\n\t\t\tview.getUint8(offset + 2),\r\n\t\t\tview.getUint8(offset + 3)\r\n\t\t], 0);\r\n\t}\r\n\r\n\treturn (\r\n\t\t(view.getUint8(offset) << 24)\r\n\t\t| (view.getUint8(offset + 1) << 16)\r\n\t\t| (view.getUint8(offset + 2) << 8)\r\n\t\t| view.getUint8(offset + 3)\r\n\t) >>> 0;\r\n};\r\n\r\nconst decodeText = (bytes, encodingByte) => {\r\n\tif (!bytes || !bytes.length) {\r\n\t\treturn '';\r\n\t}\r\n\r\n\ttry {\r\n\t\tif (encodingByte === 0x00) {\r\n\t\t\treturn new TextDecoder('iso-8859-1').decode(bytes).replace(/\\u0000/g, '').trim();\r\n\t\t}\r\n\r\n\t\tif (encodingByte === 0x01) {\r\n\t\t\tif (bytes.length >= 2) {\r\n\t\t\t\tconst bom0 = bytes[0];\r\n\t\t\t\tconst bom1 = bytes[1];\r\n\t\t\t\tif (bom0 === 0xff && bom1 === 0xfe) {\r\n\t\t\t\t\treturn new TextDecoder('utf-16le').decode(bytes.slice(2)).replace(/\\u0000/g, '').trim();\r\n\t\t\t\t}\r\n\t\t\t\tif (bom0 === 0xfe && bom1 === 0xff) {\r\n\t\t\t\t\tconst swapped = new Uint8Array(bytes.length - 2);\r\n\t\t\t\t\tfor (let i = 2; i + 1 < bytes.length; i += 2) {\r\n\t\t\t\t\t\tswapped[i - 2] = bytes[i + 1];\r\n\t\t\t\t\t\tswapped[i - 1] = bytes[i];\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn new TextDecoder('utf-16le').decode(swapped).replace(/\\u0000/g, '').trim();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn new TextDecoder('utf-16le').decode(bytes).replace(/\\u0000/g, '').trim();\r\n\t\t}\r\n\r\n\t\tif (encodingByte === 0x02) {\r\n\t\t\tconst swapped = new Uint8Array(bytes.length);\r\n\t\t\tfor (let i = 0; i + 1 < bytes.length; i += 2) {\r\n\t\t\t\tswapped[i] = bytes[i + 1];\r\n\t\t\t\tswapped[i + 1] = bytes[i];\r\n\t\t\t}\r\n\t\t\treturn new TextDecoder('utf-16le').decode(swapped).replace(/\\u0000/g, '').trim();\r\n\t\t}\r\n\r\n\t\treturn new TextDecoder('utf-8').decode(bytes).replace(/\\u0000/g, '').trim();\r\n\t} catch {\r\n\t\treturn '';\r\n\t}\r\n};\r\n\r\nconst findNullTerminator = (bytes, start, step = 1) => {\r\n\tfor (let i = start; i < bytes.length; i += step) {\r\n\t\tif (step === 2) {\r\n\t\t\tif (i + 1 < bytes.length && bytes[i] === 0x00 && bytes[i + 1] === 0x00) {\r\n\t\t\t\treturn i;\r\n\t\t\t}\r\n\t\t} else if (bytes[i] === 0x00) {\r\n\t\t\treturn i;\r\n\t\t}\r\n\t}\r\n\r\n\treturn -1;\r\n};\r\n\r\nconst parseApic = (frameBytes) => {\r\n\tif (!frameBytes || frameBytes.length < 4) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst encoding = frameBytes[0];\r\n\tlet pos = 1;\r\n\r\n\tconst mimeEnd = findNullTerminator(frameBytes, pos);\r\n\tif (mimeEnd < 0) {\r\n\t\treturn null;\r\n\t}\r\n\tconst mimeTypeRaw = new TextDecoder('iso-8859-1').decode(frameBytes.slice(pos, mimeEnd)).trim();\r\n\tpos = mimeEnd + 1;\r\n\r\n\tif (pos >= frameBytes.length) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tpos += 1; // picture type\r\n\r\n\tconst isUnicode = encoding === 0x01 || encoding === 0x02;\r\n\tconst descEnd = findNullTerminator(frameBytes, pos, isUnicode ? 2 : 1);\r\n\tif (descEnd >= 0) {\r\n\t\tpos = descEnd + (isUnicode ? 2 : 1);\r\n\t}\r\n\r\n\tif (pos >= frameBytes.length) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst data = frameBytes.slice(pos);\r\n\tconst mimeType = mimeTypeRaw || 'image/jpeg';\r\n\tif (!data.length) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\treturn { mimeType, data };\r\n};\r\n\r\nconst parseId3v2 = (arrayBuffer) => {\r\n\tconst bytes = new Uint8Array(arrayBuffer);\r\n\tif (bytes.length < 10) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tif (bytes[0] !== 0x49 || bytes[1] !== 0x44 || bytes[2] !== 0x33) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst version = bytes[3];\r\n\tif (version < 2 || version > 4) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst tagSize = readSyncSafeInt(bytes, 6);\r\n\tconst totalTagSize = Math.min(bytes.length, tagSize + 10);\r\n\tconst view = new DataView(arrayBuffer, 0, totalTagSize);\r\n\r\n\tlet offset = 10;\r\n\tlet title = '';\r\n\tlet picture = null;\r\n\r\n\twhile (offset + 10 <= totalTagSize) {\r\n\t\tconst frameId = String.fromCharCode(\r\n\t\t\tview.getUint8(offset),\r\n\t\t\tview.getUint8(offset + 1),\r\n\t\t\tview.getUint8(offset + 2),\r\n\t\t\tview.getUint8(offset + 3)\r\n\t\t);\r\n\r\n\t\tif (!frameId.trim()) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tconst frameSize = readUInt32(view, offset + 4, version === 4);\r\n\t\tif (!frameSize || frameSize < 1) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tconst frameDataStart = offset + 10;\r\n\t\tconst frameDataEnd = frameDataStart + frameSize;\r\n\t\tif (frameDataEnd > totalTagSize) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tconst frameBytes = bytes.slice(frameDataStart, frameDataEnd);\r\n\t\tif (frameId === 'TIT2' && frameBytes.length > 1) {\r\n\t\t\ttitle = decodeText(frameBytes.slice(1), frameBytes[0]) || title;\r\n\t\t}\r\n\r\n\t\tif (frameId === 'APIC' && !picture) {\r\n\t\t\tpicture = parseApic(frameBytes);\r\n\t\t}\r\n\r\n\t\toffset = frameDataEnd;\r\n\t}\r\n\r\n\treturn {\r\n\t\ttitle,\r\n\t\tpicture\r\n\t};\r\n};\r\n\r\nconst getFileExtension = (file) => {\r\n\tconst fileName = String(file?.name || '').toLowerCase();\r\n\tconst dot = fileName.lastIndexOf('.');\r\n\tif (dot < 0 || dot >= fileName.length - 1) {\r\n\t\treturn '';\r\n\t}\r\n\treturn fileName.slice(dot + 1);\r\n};\r\n\r\nconst extractAudioMetadata = async (file) => {\r\n\tif (!(file instanceof File)) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst ext = getFileExtension(file);\r\n\tif (!AUDIO_EXTENSIONS.has(ext)) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tif (!file.size) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\ttry {\r\n\t\tconst chunk = file.slice(0, Math.min(file.size, 1024 * 1024 * 2));\r\n\t\tconst buffer = await chunk.arrayBuffer();\r\n\t\tconst parsed = parseId3v2(buffer);\r\n\t\tif (!parsed) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst result = {};\r\n\t\tif (parsed.title) {\r\n\t\t\tresult.title = parsed.title;\r\n\t\t}\r\n\r\n\t\tif (parsed.picture?.data?.length) {\r\n\t\t\tconst imageBlob = new Blob([parsed.picture.data], { type: parsed.picture.mimeType || 'image/jpeg' });\r\n\t\t\tresult.pictureBlob = imageBlob;\r\n\t\t}\r\n\r\n\t\treturn Object.keys(result).length ? result : null;\r\n\t} catch {\r\n\t\treturn null;\r\n\t}\r\n};\r\n\r\nexport {\r\n\textractAudioMetadata\r\n};\r\n","const VIDEO_EXTENSIONS = new Set([\r\n\t'mp4',\r\n\t'webm',\r\n\t'mov',\r\n\t'mkv',\r\n\t'avi',\r\n\t'm4v',\r\n\t'ogv'\r\n]);\r\n\r\nconst getFileExtension = (file) => {\r\n\tconst fileName = String(file?.name || '').toLowerCase();\r\n\tconst dot = fileName.lastIndexOf('.');\r\n\tif (dot < 0 || dot >= fileName.length - 1) {\r\n\t\treturn '';\r\n\t}\r\n\treturn fileName.slice(dot + 1);\r\n};\r\n\r\nconst waitEvent = (node, eventName) => new Promise((resolve, reject) => {\r\n\tconst onResolve = () => {\r\n\t\tcleanup();\r\n\t\tresolve(true);\r\n\t};\r\n\r\n\tconst onReject = () => {\r\n\t\tcleanup();\r\n\t\treject(new Error(eventName));\r\n\t};\r\n\r\n\tconst cleanup = () => {\r\n\t\tnode.removeEventListener(eventName, onResolve);\r\n\t\tnode.removeEventListener('error', onReject);\r\n\t};\r\n\r\n\tnode.addEventListener(eventName, onResolve, { once: true });\r\n\tnode.addEventListener('error', onReject, { once: true });\r\n});\r\n\r\nconst seekVideo = (video, time) => new Promise((resolve, reject) => {\r\n\tconst onSeeked = () => {\r\n\t\tcleanup();\r\n\t\tresolve(true);\r\n\t};\r\n\r\n\tconst onError = () => {\r\n\t\tcleanup();\r\n\t\treject(new Error('seek'));\r\n\t};\r\n\r\n\tconst cleanup = () => {\r\n\t\tvideo.removeEventListener('seeked', onSeeked);\r\n\t\tvideo.removeEventListener('error', onError);\r\n\t};\r\n\r\n\tvideo.addEventListener('seeked', onSeeked, { once: true });\r\n\tvideo.addEventListener('error', onError, { once: true });\r\n\tvideo.currentTime = time;\r\n});\r\n\r\nconst canvasToBlob = (canvas, type = 'image/jpeg', quality = 0.92) => new Promise((resolve) => {\r\n\tcanvas.toBlob((blob) => resolve(blob || null), type, quality);\r\n});\r\n\r\nconst extractVideoMetadata = async (file) => {\r\n\tif (!(file instanceof File)) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst ext = getFileExtension(file);\r\n\tconst isVideoType = String(file.type || '').toLowerCase().startsWith('video/');\r\n\tif (!isVideoType && !VIDEO_EXTENSIONS.has(ext)) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tif (!file.size) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tlet objectUrl = '';\r\n\ttry {\r\n\t\tobjectUrl = URL.createObjectURL(file);\r\n\r\n\t\tconst video = document.createElement('video');\r\n\t\tvideo.preload = 'metadata';\r\n\t\tvideo.muted = true;\r\n\t\tvideo.playsInline = true;\r\n\t\tvideo.crossOrigin = 'anonymous';\r\n\t\tvideo.src = objectUrl;\r\n\r\n\t\tawait waitEvent(video, 'loadedmetadata');\r\n\r\n\t\tconst width = Number(video.videoWidth || 0);\r\n\t\tconst height = Number(video.videoHeight || 0);\r\n\t\tconst duration = Number(video.duration || 0);\r\n\r\n\t\tif (!width || !height || !Number.isFinite(width) || !Number.isFinite(height)) {\r\n\t\t\treturn {\r\n\t\t\t\tduration: Number.isFinite(duration) ? duration : 0,\r\n\t\t\t\twidth: 0,\r\n\t\t\t\theight: 0\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tconst seekTime = duration > 1 ? Math.min(1, Math.max(0, duration / 2)) : 0;\r\n\t\tawait seekVideo(video, seekTime);\r\n\r\n\t\tconst canvas = document.createElement('canvas');\r\n\t\tcanvas.width = width;\r\n\t\tcanvas.height = height;\r\n\t\tconst ctx = canvas.getContext('2d');\r\n\t\tif (!ctx) {\r\n\t\t\treturn {\r\n\t\t\t\tduration: Number.isFinite(duration) ? duration : 0,\r\n\t\t\t\twidth,\r\n\t\t\t\theight\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tctx.drawImage(video, 0, 0, width, height);\r\n\t\tconst posterBlob = await canvasToBlob(canvas, 'image/jpeg', 0.92);\r\n\r\n\t\treturn {\r\n\t\t\tduration: Number.isFinite(duration) ? duration : 0,\r\n\t\t\twidth,\r\n\t\t\theight,\r\n\t\t\tposterBlob: posterBlob || null\r\n\t\t};\r\n\t} catch {\r\n\t\treturn null;\r\n\t} finally {\r\n\t\tif (objectUrl) {\r\n\t\t\tURL.revokeObjectURL(objectUrl);\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport {\r\n\textractVideoMetadata\r\n};\r\n","import VGModal from \"../../../vgmodal\";\r\n\r\nclass ImageModal {\r\n\tconstructor() {\r\n\t\tthis._modalId = 'vg-filepreview-image-modal';\r\n\t}\r\n\r\n\tstatic getInstance() {\r\n\t\tif (!ImageModal._instance) {\r\n\t\t\tImageModal._instance = new ImageModal();\r\n\t\t}\r\n\r\n\t\treturn ImageModal._instance;\r\n\t}\r\n\r\n\topen(payload = {}) {\r\n\t\tconst src = String(payload.src || '').trim();\r\n\t\tif (!src) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._ensureModal();\r\n\t\tif (!this._modal || !this._image) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst defaultTitle = String(payload.defaultTitle || '').trim();\r\n\t\tconst title = String(payload.title || '').trim();\r\n\t\tthis._title.textContent = title || defaultTitle;\r\n\t\tthis._image.src = src;\r\n\t\tthis._image.alt = title || defaultTitle;\r\n\r\n\t\tthis._modal.show();\r\n\t}\r\n\r\n\tclose() {\r\n\t\tif (!this._modal) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._modal.hide();\r\n\t}\r\n\r\n\t_ensureModal() {\r\n\t\tif (this._modal && this._root) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._initModal();\r\n\t}\r\n\r\n\t_initModal() {\r\n\t\tconst params = {\r\n\t\t\tcentered: true,\r\n\t\t\tdismiss: true,\r\n\t\t\tbackdrop: true,\r\n\t\t\tkeyboard: true,\r\n\t\t\tsizes: {\r\n\t\t\t\twidth: 'fit-content',\r\n\t\t\t},\r\n\t\t\tanimation: {\r\n\t\t\t\tenable: false\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst existed = document.getElementById(this._modalId);\r\n\t\tif (existed) {\r\n\t\t\tthis._root = existed;\r\n\t\t\tthis._modal = VGModal.getOrCreateInstance(existed, params);\r\n\t\t\tthis._bindElements(existed);\r\n\t\t\tthis._bindLifecycle(existed);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._modal = VGModal.build(this._modalId, params, (modalInstance) => {\r\n\t\t\tconst element = modalInstance._element;\r\n\t\t\tthis._root = element;\r\n\t\t\telement.classList.add('vg-filepreview-image-modal');\r\n\r\n\t\t\tconst body = element.querySelector('.vg-modal-body');\r\n\t\t\tconst content = element.querySelector('.vg-modal-content');\r\n\t\t\tif (!body || !content) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tbody.classList.add('vg-filepreview-image-modal__body');\r\n\t\t\tbody.innerHTML = '';\r\n\r\n\t\t\tlet header = element.querySelector('.vg-modal-header');\r\n\t\t\tif (!header) {\r\n\t\t\t\theader = document.createElement('div');\r\n\t\t\t\theader.className = 'vg-modal-header';\r\n\t\t\t\tcontent.prepend(header);\r\n\t\t\t}\r\n\r\n\t\t\tthis._title = document.createElement('div');\r\n\t\t\tthis._title.className = 'vg-modal-title';\r\n\t\t\tthis._title.textContent = '';\r\n\r\n\t\t\tthis._image = document.createElement('img');\r\n\t\t\tthis._image.className = 'vg-filepreview-image-modal__img';\r\n\t\t\tthis._image.loading = 'eager';\r\n\t\t\tthis._image.decoding = 'async';\r\n\r\n\t\t\theader.appendChild(this._title);\r\n\t\t\tbody.appendChild(this._image);\r\n\r\n\t\t\tthis._bindLifecycle(element);\r\n\t\t});\r\n\t}\r\n\r\n\t_bindElements(root) {\r\n\t\tthis._title = root.querySelector('.vg-filepreview-image-modal__title');\r\n\t\tthis._image = root.querySelector('.vg-filepreview-image-modal__img');\r\n\t}\r\n\r\n\t_bindLifecycle(root) {\r\n\t\tif (!root || root.hasAttribute('data-vg-filepreview-image-lifecycle-bind')) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\troot.setAttribute('data-vg-filepreview-image-lifecycle-bind', 'true');\r\n\t\troot.addEventListener('vg.modal.hidden', () => {\r\n\t\t\tthis._destroyModal();\r\n\t\t});\r\n\t}\r\n\r\n\t_destroyModal() {\r\n\t\tif (this._modal && typeof this._modal.dispose === 'function') {\r\n\t\t\tthis._modal.dispose();\r\n\t\t}\r\n\r\n\t\tif (this._root && this._root.parentNode) {\r\n\t\t\tthis._root.parentNode.removeChild(this._root);\r\n\t\t}\r\n\r\n\t\tthis._root = null;\r\n\t\tthis._modal = null;\r\n\t\tthis._title = null;\r\n\t\tthis._image = null;\r\n\t}\r\n\r\n}\r\n\r\nexport default ImageModal;\r\n","import ImageModal from \"./image-modal\";\r\n\r\nconst IMAGE_EXTENSIONS = new Set([\r\n\t'.png',\r\n\t'.jpg',\r\n\t'.jpeg',\r\n\t'.gif',\r\n\t'.webp',\r\n\t'.svg',\r\n\t'.bmp',\r\n\t'.tif',\r\n\t'.tiff',\r\n\t'.heic',\r\n\t'.heif',\r\n\t'.avif'\r\n]);\r\n\r\nclass ImageFilePreviewRenderer {\r\n\tconstructor() {\r\n\t\tthis.name = 'image';\r\n\t\tthis._modal = ImageModal.getInstance();\r\n\t}\r\n\r\n\tcanRender(context = {}) {\r\n\t\tconst ext = String(context?.fileMeta?.ext || '').toLowerCase();\r\n\t\treturn IMAGE_EXTENSIONS.has(ext);\r\n\t}\r\n\r\n\trender(context = {}) {\r\n\t\tconst container = context?.previewContainer;\r\n\t\tconst nameOnly = Boolean(context?.ui?.nameOnly);\r\n\t\tconst i18n = context?.i18n;\r\n\r\n\t\tconst src = context?.fileUrl?.href || context?.filePath || '';\r\n\t\tif (!src) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst openImage = (event) => {\r\n\t\t\tif (event) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t}\r\n\r\n\t\t\tthis._modal.open({\r\n\t\t\t\tsrc,\r\n\t\t\t\ttitle: context?.fileMeta?.name || i18n?.message('image_title') || '',\r\n\t\t\t\tdefaultTitle: i18n?.message('image_title') || ''\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tconst titleLink = context?.element?.querySelector('.name');\r\n\t\tif (titleLink && !titleLink.hasAttribute('data-vg-filepreview-image-bind')) {\r\n\t\t\ttitleLink.setAttribute('data-vg-filepreview-image-bind', 'true');\r\n\t\t\ttitleLink.classList.add('is-preview-action');\r\n\t\t\ttitleLink.addEventListener('click', openImage);\r\n\t\t}\r\n\r\n\t\tconst listImage = context?.element?.closest('.file')?.querySelector('.file-image .file-preview');\r\n\t\tif (listImage && !listImage.hasAttribute('data-vg-filepreview-image-bind')) {\r\n\t\t\tlistImage.setAttribute('data-vg-filepreview-image-bind', 'true');\r\n\t\t\tlistImage.classList.add('is-preview-action');\r\n\t\t\tlistImage.addEventListener('click', openImage);\r\n\t\t}\r\n\r\n\t\tif (nameOnly) {\r\n\t\t\treturn Boolean(titleLink || listImage);\r\n\t\t}\r\n\r\n\t\tif (!container) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst trigger = document.createElement('button');\r\n\t\ttrigger.type = 'button';\r\n\t\ttrigger.className = 'vg-filepreview-image-trigger';\r\n\t\ttrigger.textContent = i18n?.button('open_image') || '';\r\n\t\ttrigger.addEventListener('click', openImage);\r\n\t\tcontainer.appendChild(trigger);\r\n\r\n\t\tconst thumbnail = document.createElement('img');\r\n\t\tthumbnail.className = 'vg-filepreview-image-thumb';\r\n\t\tthumbnail.src = src;\r\n\t\tthumbnail.alt = context?.fileMeta?.name || i18n?.message('image_thumbnail_alt') || '';\r\n\t\tthumbnail.loading = 'lazy';\r\n\t\tthumbnail.addEventListener('click', openImage);\r\n\t\tcontainer.appendChild(thumbnail);\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport default ImageFilePreviewRenderer;\r\n","import VGModal from \"../../../vgmodal\";\r\n\r\nclass OfficeModal {\r\n\tconstructor() {\r\n\t\tthis._modalId = 'vg-filepreview-office-modal';\r\n\t\tthis._labels = {};\r\n\t}\r\n\r\n\tstatic getInstance() {\r\n\t\tif (!OfficeModal._instance) {\r\n\t\t\tOfficeModal._instance = new OfficeModal();\r\n\t\t}\r\n\r\n\t\treturn OfficeModal._instance;\r\n\t}\r\n\r\n\topen(payload = {}) {\r\n\t\tconst src = String(payload.src || '').trim();\r\n\t\tif (!src) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._ensureModal();\r\n\t\tif (!this._modal || !this._frame) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._labels = payload?.labels && typeof payload.labels === 'object' ? payload.labels : {};\r\n\t\tthis._src = src;\r\n\t\tthis._downloadName = String(payload.downloadName || '').trim();\r\n\r\n\t\tconst defaultTitle = String(payload.defaultTitle || '').trim();\r\n\t\tconst title = String(payload.title || '').trim();\r\n\t\tthis._title.textContent = title || defaultTitle;\r\n\t\tthis._fallback.textContent = this._label('fallback');\r\n\t\tthis._download.textContent = this._label('download');\r\n\r\n\t\tthis._frame.src = this._buildViewerUrl(src);\r\n\t\tthis._modal.show();\r\n\t}\r\n\r\n\t_ensureModal() {\r\n\t\tif (this._modal && this._root) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._initModal();\r\n\t}\r\n\r\n\t_initModal() {\r\n\t\tconst params = {\r\n\t\t\tcentered: true,\r\n\t\t\tdismiss: true,\r\n\t\t\tbackdrop: true,\r\n\t\t\tkeyboard: true,\r\n\t\t\tsizes: {\r\n\t\t\t\twidth: 'fit-content',\r\n\t\t\t},\r\n\t\t\tanimation: {\r\n\t\t\t\tenable: false\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tthis._modal = VGModal.build(this._modalId, params, (modalInstance) => {\r\n\t\t\tconst element = modalInstance._element;\r\n\t\t\tthis._root = element;\r\n\t\t\telement.classList.add('vg-filepreview-office-modal');\r\n\r\n\t\t\tconst body = element.querySelector('.vg-modal-body');\r\n\t\t\tconst content = element.querySelector('.vg-modal-content');\r\n\t\t\tif (!body || !content) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tbody.classList.add('vg-filepreview-image-modal__body');\r\n\t\t\tbody.innerHTML = '';\r\n\r\n\t\t\tlet header = element.querySelector('.vg-modal-header');\r\n\t\t\tif (!header) {\r\n\t\t\t\theader = document.createElement('div');\r\n\t\t\t\theader.className = 'vg-modal-header';\r\n\t\t\t\tcontent.prepend(header);\r\n\t\t\t}\r\n\r\n\t\t\tthis._title = document.createElement('div');\r\n\t\t\tthis._title.className = 'vg-modal-title';\r\n\r\n\t\t\tthis._frame = document.createElement('iframe');\r\n\t\t\tthis._frame.className = 'vg-filepreview-office-modal__frame';\r\n\t\t\tthis._frame.setAttribute('title', 'Office preview');\r\n\r\n\t\t\tconst footer = document.createElement('div');\r\n\t\t\tfooter.className = 'vg-filepreview-office-modal__footer';\r\n\r\n\t\t\tthis._fallback = document.createElement('span');\r\n\t\t\tthis._fallback.className = 'vg-filepreview-office-modal__hint';\r\n\r\n\t\t\tthis._download = document.createElement('button');\r\n\t\t\tthis._download.type = 'button';\r\n\t\t\tthis._download.className = 'vg-filepreview-office-modal__btn';\r\n\t\t\tthis._download.addEventListener('click', () => this._downloadFile());\r\n\r\n\t\t\tfooter.appendChild(this._fallback);\r\n\t\t\tfooter.appendChild(this._download);\r\n\r\n\t\t\theader.appendChild(this._title);\r\n\t\t\tbody.appendChild(this._frame);\r\n\t\t\tcontent.appendChild(footer);\r\n\r\n\t\t\tthis._bindLifecycle(element);\r\n\t\t});\r\n\t}\r\n\r\n\t_buildViewerUrl(src) {\r\n\t\tconst absolute = new URL(src, window.location.origin).href;\r\n\t\tconst viewerBase = 'https://view.officeapps.live.com/op/embed.aspx?src=';\r\n\t\treturn `${viewerBase}${encodeURIComponent(absolute)}`;\r\n\t}\r\n\r\n\t_downloadFile() {\r\n\t\tif (!this._src) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst link = document.createElement('a');\r\n\t\tlink.href = this._src;\r\n\t\tif (this._downloadName) {\r\n\t\t\tlink.setAttribute('download', this._downloadName);\r\n\t\t}\r\n\t\tlink.style.display = 'none';\r\n\t\tdocument.body.appendChild(link);\r\n\t\tlink.click();\r\n\t\tdocument.body.removeChild(link);\r\n\t}\r\n\r\n\t_label(key) {\r\n\t\tconst value = this._labels?.[key];\r\n\t\treturn String(value || '').trim();\r\n\t}\r\n\r\n\t_bindLifecycle(root) {\r\n\t\tif (!root || root.hasAttribute('data-vg-filepreview-office-lifecycle-bind')) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\troot.setAttribute('data-vg-filepreview-office-lifecycle-bind', 'true');\r\n\t\troot.addEventListener('vg.modal.hidden', () => this._destroyModal());\r\n\t}\r\n\r\n\t_destroyModal() {\r\n\t\tif (this._modal && typeof this._modal.dispose === 'function') {\r\n\t\t\tthis._modal.dispose();\r\n\t\t}\r\n\t\tif (this._root && this._root.parentNode) {\r\n\t\t\tthis._root.parentNode.removeChild(this._root);\r\n\t\t}\r\n\r\n\t\tthis._root = null;\r\n\t\tthis._modal = null;\r\n\t\tthis._title = null;\r\n\t\tthis._frame = null;\r\n\t\tthis._fallback = null;\r\n\t\tthis._download = null;\r\n\t\tthis._labels = null;\r\n\t\tthis._src = '';\r\n\t\tthis._downloadName = '';\r\n\t}\r\n}\r\n\r\nexport default OfficeModal;\r\n","import OfficeModal from \"./office-modal\";\r\n\r\nconst OFFICE_EXTENSIONS = new Set([\r\n\t'.doc',\r\n\t'.docx',\r\n\t'.xls',\r\n\t'.xlsx',\r\n\t'.ppt',\r\n\t'.pptx',\r\n\t'.odt',\r\n\t'.ods',\r\n\t'.odp'\r\n]);\r\n\r\nclass OfficeFilePreviewRenderer {\r\n\tconstructor() {\r\n\t\tthis.name = 'office';\r\n\t\tthis._modal = OfficeModal.getInstance();\r\n\t}\r\n\r\n\tcanRender(context = {}) {\r\n\t\tconst ext = String(context?.fileMeta?.ext || '').toLowerCase();\r\n\t\treturn OFFICE_EXTENSIONS.has(ext);\r\n\t}\r\n\r\n\trender(context = {}) {\r\n\t\tconst container = context?.previewContainer;\r\n\t\tconst nameOnly = Boolean(context?.ui?.nameOnly);\r\n\t\tconst i18n = context?.i18n;\r\n\r\n\t\tconst src = context?.fileUrl?.href || context?.filePath || '';\r\n\t\tif (!src) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst openOffice = (event) => {\r\n\t\t\tif (event) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t}\r\n\r\n\t\t\tthis._modal.open({\r\n\t\t\t\tsrc,\r\n\t\t\t\ttitle: context?.fileMeta?.name || i18n?.message('office_title') || '',\r\n\t\t\t\tdefaultTitle: i18n?.message('office_title') || '',\r\n\t\t\t\tdownloadName: context?.fileMeta?.originalName || context?.fileMeta?.name || '',\r\n\t\t\t\tlabels: {\r\n\t\t\t\t\tdownload: i18n?.button('download') || '',\r\n\t\t\t\t\tfallback: i18n?.message('office_fallback') || ''\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tconst titleLink = context?.element?.querySelector('.name');\r\n\t\tif (titleLink && !titleLink.hasAttribute('data-vg-filepreview-office-bind')) {\r\n\t\t\ttitleLink.setAttribute('data-vg-filepreview-office-bind', 'true');\r\n\t\t\ttitleLink.classList.add('is-preview-action');\r\n\t\t\ttitleLink.addEventListener('click', openOffice);\r\n\t\t}\r\n\r\n\t\tif (nameOnly) {\r\n\t\t\treturn Boolean(titleLink);\r\n\t\t}\r\n\r\n\t\tif (!container) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst trigger = document.createElement('button');\r\n\t\ttrigger.type = 'button';\r\n\t\ttrigger.className = 'vg-filepreview-office-trigger';\r\n\t\ttrigger.textContent = i18n?.button('open_office') || '';\r\n\t\ttrigger.addEventListener('click', openOffice);\r\n\t\tcontainer.appendChild(trigger);\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport default OfficeFilePreviewRenderer;\r\n","import VGModal from \"../../../vgmodal\";\r\n\r\nclass PdfModal {\r\n\tconstructor() {\r\n\t\tthis._modalId = 'vg-filepreview-pdf-modal';\r\n\t\tthis._labels = {};\r\n\t\tthis._src = '';\r\n\t\tthis._downloadName = '';\r\n\t\tthis._page = 1;\r\n\t\tthis._zoom = 100;\r\n\t}\r\n\r\n\tstatic getInstance() {\r\n\t\tif (!PdfModal._instance) {\r\n\t\t\tPdfModal._instance = new PdfModal();\r\n\t\t}\r\n\r\n\t\treturn PdfModal._instance;\r\n\t}\r\n\r\n\topen(payload = {}) {\r\n\t\tconst src = String(payload.src || '').trim();\r\n\t\tif (!src) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._ensureModal();\r\n\t\tif (!this._modal || !this._frame) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._labels = payload?.labels && typeof payload.labels === 'object' ? payload.labels : {};\r\n\t\tthis._src = src;\r\n\t\tthis._downloadName = String(payload.downloadName || '').trim();\r\n\t\tthis._page = 1;\r\n\t\tthis._zoom = 100;\r\n\r\n\t\tconst defaultTitle = String(payload.defaultTitle || '').trim();\r\n\t\tconst title = String(payload.title || '').trim();\r\n\t\tthis._title.textContent = title || defaultTitle;\r\n\r\n\t\tthis._syncControls();\r\n\t\tthis._updateFrameSrc();\r\n\t\tthis._modal.show();\r\n\t}\r\n\r\n\t_ensureModal() {\r\n\t\tif (this._modal && this._root) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._initModal();\r\n\t}\r\n\r\n\t_initModal() {\r\n\t\tconst params = {\r\n\t\t\tcentered: true,\r\n\t\t\tdismiss: true,\r\n\t\t\tbackdrop: true,\r\n\t\t\tkeyboard: true,\r\n\t\t\tsizes: {\r\n\t\t\t\twidth: 'fit-content',\r\n\t\t\t},\r\n\t\t\tanimation: {\r\n\t\t\t\tenable: false\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst existed = document.getElementById(this._modalId);\r\n\t\tif (existed) {\r\n\t\t\tthis._root = existed;\r\n\t\t\tthis._modal = VGModal.getOrCreateInstance(existed, params);\r\n\t\t\tthis._bindElements(existed);\r\n\t\t\tthis._bindLifecycle(existed);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._modal = VGModal.build(this._modalId, params, (modalInstance) => {\r\n\t\t\tconst element = modalInstance._element;\r\n\t\t\tthis._root = element;\r\n\t\t\telement.classList.add('vg-filepreview-pdf-modal');\r\n\r\n\t\t\tconst body = element.querySelector('.vg-modal-body');\r\n\t\t\tconst content = element.querySelector('.vg-modal-content');\r\n\t\t\tif (!body || !content) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tbody.classList.add('vg-filepreview-pdf-modal__body');\r\n\t\t\tbody.innerHTML = '';\r\n\r\n\t\t\tlet header = element.querySelector('.vg-modal-header');\r\n\t\t\tif (!header) {\r\n\t\t\t\theader = document.createElement('div');\r\n\t\t\t\theader.className = 'vg-modal-header';\r\n\t\t\t\tcontent.prepend(header);\r\n\t\t\t}\r\n\r\n\t\t\tthis._title = document.createElement('div');\r\n\t\t\tthis._title.className = 'vg-modal-title';\r\n\r\n\t\t\tconst toolbar = document.createElement('div');\r\n\t\t\ttoolbar.className = 'vg-filepreview-pdf-modal__toolbar';\r\n\r\n\t\t\tthis._pagePrev = document.createElement('button');\r\n\t\t\tthis._pagePrev.type = 'button';\r\n\t\t\tthis._pagePrev.className = 'vg-filepreview-pdf-modal__btn';\r\n\t\t\tthis._pagePrev.setAttribute('data-role', 'page-prev');\r\n\t\t\tthis._pagePrev.addEventListener('click', () => {\r\n\t\t\t\tthis._page = Math.max(1, this._page - 1);\r\n\t\t\t\tthis._syncControls();\r\n\t\t\t\tthis._updateFrameSrc();\r\n\t\t\t});\r\n\r\n\t\t\tthis._pageInfo = document.createElement('span');\r\n\t\t\tthis._pageInfo.className = 'vg-filepreview-pdf-modal__meta';\r\n\t\t\tthis._pageInfo.setAttribute('data-role', 'page');\r\n\r\n\t\t\tthis._pageNext = document.createElement('button');\r\n\t\t\tthis._pageNext.type = 'button';\r\n\t\t\tthis._pageNext.className = 'vg-filepreview-pdf-modal__btn';\r\n\t\t\tthis._pageNext.setAttribute('data-role', 'page-next');\r\n\t\t\tthis._pageNext.addEventListener('click', () => {\r\n\t\t\t\tthis._page += 1;\r\n\t\t\t\tthis._syncControls();\r\n\t\t\t\tthis._updateFrameSrc();\r\n\t\t\t});\r\n\r\n\t\t\tthis._zoomOut = document.createElement('button');\r\n\t\t\tthis._zoomOut.type = 'button';\r\n\t\t\tthis._zoomOut.className = 'vg-filepreview-pdf-modal__btn';\r\n\t\t\tthis._zoomOut.setAttribute('data-role', 'zoom-out');\r\n\t\t\tthis._zoomOut.addEventListener('click', () => {\r\n\t\t\t\tthis._zoom = Math.max(50, this._zoom - 10);\r\n\t\t\t\tthis._syncControls();\r\n\t\t\t\tthis._updateFrameSrc();\r\n\t\t\t});\r\n\r\n\t\t\tthis._zoomIn = document.createElement('button');\r\n\t\t\tthis._zoomIn.type = 'button';\r\n\t\t\tthis._zoomIn.className = 'vg-filepreview-pdf-modal__btn';\r\n\t\t\tthis._zoomIn.setAttribute('data-role', 'zoom-in');\r\n\t\t\tthis._zoomIn.addEventListener('click', () => {\r\n\t\t\t\tthis._zoom = Math.min(300, this._zoom + 10);\r\n\t\t\t\tthis._syncControls();\r\n\t\t\t\tthis._updateFrameSrc();\r\n\t\t\t});\r\n\r\n\t\t\tthis._zoomInfo = document.createElement('span');\r\n\t\t\tthis._zoomInfo.className = 'vg-filepreview-pdf-modal__meta';\r\n\t\t\tthis._zoomInfo.setAttribute('data-role', 'zoom');\r\n\r\n\t\t\tthis._download = document.createElement('button');\r\n\t\t\tthis._download.type = 'button';\r\n\t\t\tthis._download.className = 'vg-filepreview-pdf-modal__btn primary';\r\n\t\t\tthis._download.setAttribute('data-role', 'download');\r\n\t\t\tthis._download.addEventListener('click', () => this._downloadFile());\r\n\r\n\t\t\ttoolbar.appendChild(this._pagePrev);\r\n\t\t\ttoolbar.appendChild(this._pageInfo);\r\n\t\t\ttoolbar.appendChild(this._pageNext);\r\n\t\t\ttoolbar.appendChild(this._zoomOut);\r\n\t\t\ttoolbar.appendChild(this._zoomInfo);\r\n\t\t\ttoolbar.appendChild(this._zoomIn);\r\n\t\t\ttoolbar.appendChild(this._download);\r\n\r\n\t\t\tthis._frame = document.createElement('iframe');\r\n\t\t\tthis._frame.className = 'vg-filepreview-pdf-modal__frame';\r\n\t\t\tthis._frame.setAttribute('title', 'PDF preview');\r\n\r\n\t\t\theader.appendChild(this._title);\r\n\t\t\t//header.appendChild(toolbar);\r\n\t\t\tbody.appendChild(this._frame);\r\n\r\n\t\t\tthis._bindLifecycle(element);\r\n\t\t});\r\n\t}\r\n\r\n\t_bindElements(root) {\r\n\t\tthis._title = root.querySelector('.vg-filepreview-pdf-modal__title');\r\n\t\tthis._frame = root.querySelector('.vg-filepreview-pdf-modal__frame');\r\n\t\tthis._pagePrev = root.querySelector('.vg-filepreview-pdf-modal__btn[data-role=\"page-prev\"]');\r\n\t\tthis._pageNext = root.querySelector('.vg-filepreview-pdf-modal__btn[data-role=\"page-next\"]');\r\n\t\tthis._zoomOut = root.querySelector('.vg-filepreview-pdf-modal__btn[data-role=\"zoom-out\"]');\r\n\t\tthis._zoomIn = root.querySelector('.vg-filepreview-pdf-modal__btn[data-role=\"zoom-in\"]');\r\n\t\tthis._download = root.querySelector('.vg-filepreview-pdf-modal__btn[data-role=\"download\"]');\r\n\t\tthis._pageInfo = root.querySelector('.vg-filepreview-pdf-modal__meta[data-role=\"page\"]');\r\n\t\tthis._zoomInfo = root.querySelector('.vg-filepreview-pdf-modal__meta[data-role=\"zoom\"]');\r\n\t}\r\n\r\n\t_bindLifecycle(root) {\r\n\t\tif (!root || root.hasAttribute('data-vg-filepreview-pdf-lifecycle-bind')) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\troot.setAttribute('data-vg-filepreview-pdf-lifecycle-bind', 'true');\r\n\t\troot.addEventListener('vg.modal.hidden', () => this._destroyModal());\r\n\t}\r\n\r\n\t_syncControls() {\r\n\t\tif (!this._pageInfo || !this._zoomInfo) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._pagePrev.textContent = this._label('prevPage');\r\n\t\tthis._pageNext.textContent = this._label('nextPage');\r\n\t\tthis._zoomOut.textContent = this._label('zoomOut');\r\n\t\tthis._zoomIn.textContent = this._label('zoomIn');\r\n\t\tthis._download.textContent = this._label('download');\r\n\t\tthis._pageInfo.textContent = `${this._label('page')}: ${this._page}`;\r\n\t\tthis._zoomInfo.textContent = `${this._label('zoom')}: ${this._zoom}%`;\r\n\t}\r\n\r\n\t_updateFrameSrc() {\r\n\t\tif (!this._frame || !this._src) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst hash = `#page=${this._page}&zoom=${this._zoom}`;\r\n\t\tthis._frame.src = `${this._src}${hash}`;\r\n\t}\r\n\r\n\t_downloadFile() {\r\n\t\tif (!this._src) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst link = document.createElement('a');\r\n\t\tlink.href = this._src;\r\n\t\tif (this._downloadName) {\r\n\t\t\tlink.setAttribute('download', this._downloadName);\r\n\t\t}\r\n\t\tlink.style.display = 'none';\r\n\t\tdocument.body.appendChild(link);\r\n\t\tlink.click();\r\n\t\tdocument.body.removeChild(link);\r\n\t}\r\n\r\n\t_label(key) {\r\n\t\tconst value = this._labels?.[key];\r\n\t\treturn String(value || '').trim();\r\n\t}\r\n\r\n\t_destroyModal() {\r\n\t\tif (this._modal && typeof this._modal.dispose === 'function') {\r\n\t\t\tthis._modal.dispose();\r\n\t\t}\r\n\t\tif (this._root && this._root.parentNode) {\r\n\t\t\tthis._root.parentNode.removeChild(this._root);\r\n\t\t}\r\n\r\n\t\tthis._root = null;\r\n\t\tthis._modal = null;\r\n\t\tthis._title = null;\r\n\t\tthis._frame = null;\r\n\t\tthis._labels = null;\r\n\t\tthis._src = '';\r\n\t}\r\n}\r\n\r\nexport default PdfModal;\r\n","import PdfModal from \"./pdf-modal\";\r\n\r\nconst PDF_EXTENSIONS = new Set([\r\n\t'.pdf'\r\n]);\r\n\r\nclass PdfFilePreviewRenderer {\r\n\tconstructor() {\r\n\t\tthis.name = 'pdf';\r\n\t\tthis._modal = PdfModal.getInstance();\r\n\t}\r\n\r\n\tcanRender(context = {}) {\r\n\t\tconst ext = String(context?.fileMeta?.ext || '').toLowerCase();\r\n\t\treturn PDF_EXTENSIONS.has(ext);\r\n\t}\r\n\r\n\trender(context = {}) {\r\n\t\tconst container = context?.previewContainer;\r\n\t\tconst nameOnly = Boolean(context?.ui?.nameOnly);\r\n\t\tconst i18n = context?.i18n;\r\n\r\n\t\tconst src = context?.fileUrl?.href || context?.filePath || '';\r\n\t\tif (!src) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst openPdf = (event) => {\r\n\t\t\tif (event) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t}\r\n\r\n\t\t\tthis._modal.open({\r\n\t\t\t\tsrc,\r\n\t\t\t\ttitle: context?.fileMeta?.name || i18n?.message('pdf_title') || '',\r\n\t\t\t\tdefaultTitle: i18n?.message('pdf_title') || '',\r\n\t\t\t\tlabels: {\r\n\t\t\t\t\tpage: i18n?.message('pdf_page') || '',\r\n\t\t\t\t\tzoom: i18n?.message('pdf_zoom') || '',\r\n\t\t\t\t\tzoomIn: i18n?.button('zoom_in') || '',\r\n\t\t\t\t\tzoomOut: i18n?.button('zoom_out') || '',\r\n\t\t\t\t\tprevPage: i18n?.button('prev') || '',\r\n\t\t\t\t\tnextPage: i18n?.button('next') || '',\r\n\t\t\t\t\tdownload: i18n?.button('download') || ''\r\n\t\t\t\t},\r\n\t\t\t\tdownloadName: context?.fileMeta?.originalName || context?.fileMeta?.name || 'file.pdf'\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tconst titleLink = context?.element?.querySelector('.name');\r\n\t\tif (titleLink && !titleLink.hasAttribute('data-vg-filepreview-pdf-bind')) {\r\n\t\t\ttitleLink.setAttribute('data-vg-filepreview-pdf-bind', 'true');\r\n\t\t\ttitleLink.classList.add('is-preview-action');\r\n\t\t\ttitleLink.addEventListener('click', openPdf);\r\n\t\t}\r\n\r\n\t\tif (nameOnly) {\r\n\t\t\treturn Boolean(titleLink);\r\n\t\t}\r\n\r\n\t\tif (!container) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst trigger = document.createElement('button');\r\n\t\ttrigger.type = 'button';\r\n\t\ttrigger.className = 'vg-filepreview-pdf-trigger';\r\n\t\ttrigger.textContent = i18n?.button('open_pdf') || '';\r\n\t\ttrigger.addEventListener('click', openPdf);\r\n\t\tcontainer.appendChild(trigger);\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport default PdfFilePreviewRenderer;\r\n","import VGModal from \"../../../vgmodal\";\r\n\r\nclass TextModal {\r\n\tconstructor() {\r\n\t\tthis._modalId = 'vg-filepreview-text-modal';\r\n\t\tthis._abortController = null;\r\n\t\tthis._labels = {};\r\n\t}\r\n\r\n\tstatic getInstance() {\r\n\t\tif (!TextModal._instance) {\r\n\t\t\tTextModal._instance = new TextModal();\r\n\t\t}\r\n\r\n\t\treturn TextModal._instance;\r\n\t}\r\n\r\n\topen(payload = {}) {\r\n\t\tconst src = String(payload.src || '').trim();\r\n\t\tif (!src) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._ensureModal();\r\n\t\tif (!this._modal || !this._content) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._labels = payload?.labels && typeof payload.labels === 'object' ? payload.labels : {};\r\n\t\tconst defaultTitle = String(payload.defaultTitle || '').trim();\r\n\t\tconst title = String(payload.title || '').trim();\r\n\t\tconst ext = String(payload.ext || '').toLowerCase();\r\n\t\tthis._title.textContent = title || defaultTitle;\r\n\t\tthis._content.textContent = this._label('loading');\r\n\t\tthis._content.classList.remove('is-markdown');\r\n\t\tthis._modal.show();\r\n\r\n\t\tthis._loadText(src, {ext});\r\n\t}\r\n\r\n\tclose() {\r\n\t\tif (!this._modal) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._modal.hide();\r\n\t}\r\n\r\n\t_ensureModal() {\r\n\t\tif (this._modal && this._root) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._initModal();\r\n\t}\r\n\r\n\t_initModal() {\r\n\t\tconst params = {\r\n\t\t\tcentered: true,\r\n\t\t\tdismiss: true,\r\n\t\t\tbackdrop: true,\r\n\t\t\tkeyboard: true,\r\n\t\t\tsizes: {\r\n\t\t\t\twidth: '600px',\r\n\t\t\t\theight: '',\r\n\t\t\t},\r\n\t\t\tanimation: {\r\n\t\t\t\tenable: false\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst existed = document.getElementById(this._modalId);\r\n\t\tif (existed) {\r\n\t\t\tthis._root = existed;\r\n\t\t\tthis._modal = VGModal.getOrCreateInstance(existed, params);\r\n\t\t\tthis._bindElements(existed);\r\n\t\t\tthis._bindLifecycle(existed);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._modal = VGModal.build(this._modalId, params, (modalInstance) => {\r\n\t\t\tconst element = modalInstance._element;\r\n\t\t\tthis._root = element;\r\n\t\t\telement.classList.add('vg-filepreview-text-modal');\r\n\r\n\t\t\tconst body = element.querySelector('.vg-modal-body');\r\n\t\t\tconst content = element.querySelector('.vg-modal-content');\r\n\t\t\tif (!body || !content) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tbody.classList.add('vg-filepreview-text-modal__body');\r\n\t\t\tbody.innerHTML = '';\r\n\r\n\t\t\tlet header = element.querySelector('.vg-modal-header');\r\n\t\t\tif (!header) {\r\n\t\t\t\theader = document.createElement('div');\r\n\t\t\t\theader.className = 'vg-modal-header';\r\n\t\t\t\tcontent.prepend(header);\r\n\t\t\t}\r\n\r\n\t\t\tthis._title = document.createElement('div');\r\n\t\t\tthis._title.className = 'vg-modal-title';\r\n\t\t\tthis._title.textContent = '';\r\n\r\n\t\t\tthis._content = document.createElement('pre');\r\n\t\t\tthis._content.className = 'vg-filepreview-text-modal__content';\r\n\t\t\tthis._content.textContent = '';\r\n\r\n\t\t\theader.appendChild(this._title);\r\n\t\t\tbody.appendChild(this._content);\r\n\r\n\t\t\tthis._bindLifecycle(element);\r\n\t\t});\r\n\t}\r\n\r\n\t_bindElements(root) {\r\n\t\tthis._title = root.querySelector('.vg-filepreview-text-modal__title');\r\n\t\tthis._content = root.querySelector('.vg-filepreview-text-modal__content');\r\n\t}\r\n\r\n\t_bindLifecycle(root) {\r\n\t\tif (!root || root.hasAttribute('data-vg-filepreview-text-lifecycle-bind')) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\troot.setAttribute('data-vg-filepreview-text-lifecycle-bind', 'true');\r\n\t\troot.addEventListener('vg.modal.hidden', () => {\r\n\t\t\tthis._destroyModal();\r\n\t\t});\r\n\t}\r\n\r\n\t_loadText(src, options = {}) {\r\n\t\tconst ext = String(options.ext || '').toLowerCase();\r\n\t\tconst cacheKey = `${src}|${ext}`;\r\n\r\n\t\tif (TextModal._cache.has(cacheKey)) {\r\n\t\t\tconst cached = TextModal._cache.get(cacheKey);\r\n\t\t\tthis._renderLoadedText(cached, ext);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (this._abortController) {\r\n\t\t\tthis._abortController.abort();\r\n\t\t}\r\n\r\n\t\tthis._abortController = new AbortController();\r\n\r\n\t\tfetch(src, {\r\n\t\t\tmethod: 'GET',\r\n\t\t\tsignal: this._abortController.signal\r\n\t\t})\r\n\t\t\t.then((response) => {\r\n\t\t\t\tif (!response.ok) {\r\n\t\t\t\t\tthrow new Error(`HTTP ${response.status}`);\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn response.text();\r\n\t\t\t})\r\n\t\t\t.then((text) => {\r\n\t\t\t\tconst normalized = text || '';\r\n\t\t\t\tTextModal._cache.set(cacheKey, normalized);\r\n\t\t\t\tthis._renderLoadedText(normalized, ext);\r\n\t\t\t})\r\n\t\t\t.catch((error) => {\r\n\t\t\t\tif (!this._content) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (error?.name === 'AbortError') {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis._content.classList.remove('is-markdown');\r\n\t\t\t\tthis._content.textContent = `${this._label('cannotOpen')}: ${error?.message || this._label('unknownError')}`;\r\n\t\t\t});\r\n\t}\r\n\r\n\t_renderLoadedText(text, ext) {\r\n\t\tif (!this._content) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst normalized = String(text || '');\r\n\t\tif (ext === '.md') {\r\n\t\t\tthis._content.classList.add('is-markdown');\r\n\t\t\tthis._content.innerHTML = this._renderMarkdown(normalized);\r\n\t\t} else {\r\n\t\t\tthis._content.classList.remove('is-markdown');\r\n\t\t\tthis._content.textContent = normalized || this._label('emptyFile');\r\n\t\t}\r\n\t}\r\n\r\n\t_destroyModal() {\r\n\t\tif (this._abortController) {\r\n\t\t\tthis._abortController.abort();\r\n\t\t\tthis._abortController = null;\r\n\t\t}\r\n\r\n\t\tif (this._modal && typeof this._modal.dispose === 'function') {\r\n\t\t\tthis._modal.dispose();\r\n\t\t}\r\n\r\n\t\tif (this._root && this._root.parentNode) {\r\n\t\t\tthis._root.parentNode.removeChild(this._root);\r\n\t\t}\r\n\r\n\t\tthis._root = null;\r\n\t\tthis._modal = null;\r\n\t\tthis._title = null;\r\n\t\tthis._content = null;\r\n\t\tthis._labels = null;\r\n\t}\r\n\r\n\t_label(key, fallback = '') {\r\n\t\tconst value = this._labels?.[key];\r\n\t\treturn typeof value === 'string' && value.trim() ? value : fallback;\r\n\t}\r\n\r\n\t_renderMarkdown(markdownText) {\r\n\t\tconst escapeHtml = (value) => String(value)\r\n\t\t\t.replace(/&/g, '&')\r\n\t\t\t.replace(/</g, '<')\r\n\t\t\t.replace(/>/g, '>')\r\n\t\t\t.replace(/\"/g, '"')\r\n\t\t\t.replace(/'/g, ''');\r\n\r\n\t\tconst inline = (line) => {\r\n\t\t\tlet result = escapeHtml(line);\r\n\t\t\tresult = result.replace(/`([^`]+)`/g, '<code>$1</code>');\r\n\t\t\tresult = result.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\r\n\t\t\tresult = result.replace(/\\*([^*]+)\\*/g, '<em>$1</em>');\r\n\t\t\tresult = result.replace(/\\[([^\\]]+)\\]\\(([^)]+)\\)/g, (match, text, href) => {\r\n\t\t\t\tconst safeHref = this._sanitizeUrl(href);\r\n\t\t\t\treturn `<a href=\"${safeHref}\" target=\"_blank\" rel=\"noopener noreferrer\">${text}</a>`;\r\n\t\t\t});\r\n\t\t\treturn result;\r\n\t\t};\r\n\r\n\t\tconst lines = String(markdownText || '').split(/\\r?\\n/);\r\n\t\tconst html = [];\r\n\t\tlet inList = false;\r\n\t\tlet inCode = false;\r\n\r\n\t\tlines.forEach((rawLine) => {\r\n\t\t\tconst line = rawLine || '';\r\n\r\n\t\t\tif (line.trim().startsWith('```')) {\r\n\t\t\t\tif (!inCode) {\r\n\t\t\t\t\tinCode = true;\r\n\t\t\t\t\thtml.push('<pre><code>');\r\n\t\t\t\t} else {\r\n\t\t\t\t\tinCode = false;\r\n\t\t\t\t\thtml.push('</code></pre>');\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (inCode) {\r\n\t\t\t\thtml.push(`${escapeHtml(line)}\\n`);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (!line.trim()) {\r\n\t\t\t\tif (inList) {\r\n\t\t\t\t\tinList = false;\r\n\t\t\t\t\thtml.push('</ul>');\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst heading = line.match(/^(#{1,6})\\s+(.+)$/);\r\n\t\t\tif (heading) {\r\n\t\t\t\tif (inList) {\r\n\t\t\t\t\tinList = false;\r\n\t\t\t\t\thtml.push('</ul>');\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst level = heading[1].length;\r\n\t\t\t\thtml.push(`<h${level}>${inline(heading[2])}</h${level}>`);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst listItem = line.match(/^[-*]\\s+(.+)$/);\r\n\t\t\tif (listItem) {\r\n\t\t\t\tif (!inList) {\r\n\t\t\t\t\tinList = true;\r\n\t\t\t\t\thtml.push('<ul>');\r\n\t\t\t\t}\r\n\t\t\t\thtml.push(`<li>${inline(listItem[1])}</li>`);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (inList) {\r\n\t\t\t\tinList = false;\r\n\t\t\t\thtml.push('</ul>');\r\n\t\t\t}\r\n\r\n\t\t\thtml.push(`<p>${inline(line)}</p>`);\r\n\t\t});\r\n\r\n\t\tif (inList) {\r\n\t\t\thtml.push('</ul>');\r\n\t\t}\r\n\t\tif (inCode) {\r\n\t\t\thtml.push('</code></pre>');\r\n\t\t}\r\n\r\n\t\treturn html.join('') || `<p>${this._escapeHtml(this._label('emptyFile'))}</p>`;\r\n\t}\r\n\r\n\t_escapeHtml(value) {\r\n\t\treturn String(value)\r\n\t\t\t.replace(/&/g, '&')\r\n\t\t\t.replace(/</g, '<')\r\n\t\t\t.replace(/>/g, '>')\r\n\t\t\t.replace(/\"/g, '"')\r\n\t\t\t.replace(/'/g, ''');\r\n\t}\r\n\r\n\t_sanitizeUrl(url) {\r\n\t\tconst value = String(url || '').trim();\r\n\t\tif (!value) {\r\n\t\t\treturn '#';\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tconst parsed = new URL(value, window.location.origin);\r\n\t\t\tif (['http:', 'https:', 'mailto:'].includes(parsed.protocol)) {\r\n\t\t\t\treturn parsed.href;\r\n\t\t\t}\r\n\t\t} catch {\r\n\t\t\treturn '#';\r\n\t\t}\r\n\r\n\t\treturn '#';\r\n\t}\r\n\r\n}\r\n\r\nTextModal._cache = new Map();\r\n\r\nexport default TextModal;\r\n","import TextModal from \"./text-modal\";\r\n\r\nconst TEXT_EXTENSIONS = new Set([\r\n\t'.txt',\r\n\t'.md',\r\n\t'.csv',\r\n\t'.json',\r\n\t'.xml',\r\n\t'.yml',\r\n\t'.yaml',\r\n\t'.log',\r\n\t'.ini',\r\n\t'.conf',\r\n\t'.env'\r\n]);\r\n\r\nclass TextFilePreviewRenderer {\r\n\tconstructor() {\r\n\t\tthis.name = 'text';\r\n\t\tthis._modal = TextModal.getInstance();\r\n\t}\r\n\r\n\tcanRender(context = {}) {\r\n\t\tconst ext = String(context?.fileMeta?.ext || '').toLowerCase();\r\n\t\treturn TEXT_EXTENSIONS.has(ext);\r\n\t}\r\n\r\n\trender(context = {}) {\r\n\t\tconst container = context?.previewContainer;\r\n\t\tconst nameOnly = Boolean(context?.ui?.nameOnly);\r\n\t\tconst i18n = context?.i18n;\r\n\r\n\t\tconst src = context?.fileUrl?.href || context?.filePath || '';\r\n\t\tif (!src) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst openText = (event) => {\r\n\t\t\tif (event) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t}\r\n\r\n\t\t\tthis._modal.open({\r\n\t\t\t\tsrc,\r\n\t\t\t\ttitle: context?.fileMeta?.name || i18n?.message('text_title') || '',\r\n\t\t\t\tdefaultTitle: i18n?.message('text_title') || '',\r\n\t\t\t\text: context?.fileMeta?.ext || '',\r\n\t\t\t\tlabels: {\r\n\t\t\t\t\tloading: i18n?.message('loading_text') || '',\r\n\t\t\t\t\tcannotOpen: i18n?.message('cannot_open_file') || '',\r\n\t\t\t\t\tunknownError: i18n?.message('unknown_error') || '',\r\n\t\t\t\t\temptyFile: i18n?.message('empty_file') || ''\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tconst titleLink = context?.element?.querySelector('.name');\r\n\t\tif (titleLink && !titleLink.hasAttribute('data-vg-filepreview-text-bind')) {\r\n\t\t\ttitleLink.setAttribute('data-vg-filepreview-text-bind', 'true');\r\n\t\t\ttitleLink.classList.add('is-preview-action');\r\n\t\t\ttitleLink.addEventListener('click', openText);\r\n\t\t}\r\n\r\n\t\tif (nameOnly) {\r\n\t\t\treturn Boolean(titleLink);\r\n\t\t}\r\n\r\n\t\tif (!container) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst trigger = document.createElement('button');\r\n\t\ttrigger.type = 'button';\r\n\t\ttrigger.className = 'vg-filepreview-text-trigger';\r\n\t\ttrigger.textContent = i18n?.button('open_text') || '';\r\n\t\ttrigger.addEventListener('click', openText);\r\n\t\tcontainer.appendChild(trigger);\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport default TextFilePreviewRenderer;\r\n","import VGModal from \"../../../vgmodal\";\r\n\r\nclass VideoModal {\r\n\tconstructor() {\r\n\t\tthis._modalId = 'vg-filepreview-video-modal';\r\n\t\tthis._playlist = [];\r\n\t\tthis._currentIndex = -1;\r\n\t\tthis._labels = {};\r\n\t\tthis._onKeyDown = (event) => this._handleHotkeys(event);\r\n\t}\r\n\r\n\tstatic getInstance() {\r\n\t\tif (!VideoModal._instance) {\r\n\t\t\tVideoModal._instance = new VideoModal();\r\n\t\t}\r\n\r\n\t\treturn VideoModal._instance;\r\n\t}\r\n\r\n\topen(payload = {}) {\r\n\t\tconst src = String(payload.src || '').trim();\r\n\t\tif (!src) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._ensureModal();\r\n\t\tif (!this._modal || !this._video) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst playlist = payload?.playlist && typeof payload.playlist === 'object' ? payload.playlist : null;\r\n\t\tthis._labels = payload?.labels && typeof payload.labels === 'object' ? payload.labels : {};\r\n\t\tif (playlist?.tracks?.length) {\r\n\t\t\tthis._playlist = playlist.tracks;\r\n\t\t\tconst currentBySrc = this._playlist.findIndex((track) => String(track.src || '').trim() === src);\r\n\t\t\tthis._currentIndex = currentBySrc >= 0 ? currentBySrc : Number(playlist.currentIndex || 0);\r\n\t\t} else {\r\n\t\t\tthis._playlist = [{ src, title: String(payload.title || '').trim() }];\r\n\t\t\tthis._currentIndex = 0;\r\n\t\t}\r\n\r\n\t\tconst defaultTitle = String(payload.defaultTitle || '').trim();\r\n\t\tconst title = String(payload.title || '').trim();\r\n\t\tthis._title.textContent = title || defaultTitle;\r\n\t\tthis._syncNavigation();\r\n\t\tthis._video.src = src;\r\n\t\tthis._video.load();\r\n\r\n\t\tthis._modal.show();\r\n\t\tthis._video.play().catch(() => {});\r\n\t}\r\n\r\n\tclose() {\r\n\t\tif (!this._modal) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._modal.hide();\r\n\t\tthis._stop();\r\n\t}\r\n\r\n\t_ensureModal() {\r\n\t\tif (this._modal && this._root) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._initModal();\r\n\t}\r\n\r\n\t_initModal() {\r\n\t\tconst params = {\r\n\t\t\tcentered: true,\r\n\t\t\tdismiss: true,\r\n\t\t\tbackdrop: true,\r\n\t\t\tkeyboard: true,\r\n\t\t\tsizes: {\r\n\t\t\t\twidth: 'fit-content',\r\n\t\t\t},\r\n\t\t\tanimation: {\r\n\t\t\t\tenable: false\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst existed = document.getElementById(this._modalId);\r\n\t\tif (existed) {\r\n\t\t\tthis._root = existed;\r\n\t\t\tthis._modal = VGModal.getOrCreateInstance(existed, params);\r\n\t\t\tthis._bindElements(existed);\r\n\t\t\tthis._bindEvents(existed);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._modal = VGModal.build(this._modalId, params, (modalInstance) => {\r\n\t\t\tconst element = modalInstance._element;\r\n\t\t\tthis._root = element;\r\n\t\t\telement.classList.add('vg-filepreview-video-modal');\r\n\r\n\t\t\tconst body = element.querySelector('.vg-modal-body');\r\n\t\t\tconst content = element.querySelector('.vg-modal-content');\r\n\t\t\tif (!body || !content) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tbody.classList.add('vg-filepreview-image-modal__body');\r\n\t\t\tbody.innerHTML = '';\r\n\r\n\t\t\tlet header = element.querySelector('.vg-modal-header');\r\n\t\t\tif (!header) {\r\n\t\t\t\theader = document.createElement('div');\r\n\t\t\t\theader.className = 'vg-modal-header';\r\n\t\t\t\tcontent.prepend(header);\r\n\t\t\t}\r\n\r\n\t\t\tthis._title = document.createElement('div');\r\n\t\t\tthis._title.className = 'vg-modal-title';\r\n\t\t\tthis._title.textContent = '';\r\n\r\n\t\t\tconst navigation = document.createElement('div');\r\n\t\t\tnavigation.className = 'vg-filepreview-video-modal__navigation';\r\n\r\n\t\t\tthis._prevButton = document.createElement('button');\r\n\t\t\tthis._prevButton.type = 'button';\r\n\t\t\tthis._prevButton.className = 'vg-filepreview-video-modal__nav-btn';\r\n\t\t\tthis._prevButton.addEventListener('click', () => this._goPrev());\r\n\r\n\t\t\tthis._nextButton = document.createElement('button');\r\n\t\t\tthis._nextButton.type = 'button';\r\n\t\t\tthis._nextButton.className = 'vg-filepreview-video-modal__nav-btn';\r\n\t\t\tthis._nextButton.addEventListener('click', () => this._goNext());\r\n\r\n\t\t\tnavigation.appendChild(this._prevButton);\r\n\t\t\tnavigation.appendChild(this._nextButton);\r\n\r\n\t\t\tthis._video = document.createElement('video');\r\n\t\t\tthis._video.className = 'vg-filepreview-video-modal__video';\r\n\t\t\tthis._video.controls = true;\r\n\t\t\tthis._video.preload = 'metadata';\r\n\t\t\tthis._video.playsInline = true;\r\n\t\t\tthis._video.addEventListener('ended', () => this._goNext(true));\r\n\r\n\t\t\theader.appendChild(this._title);\r\n\t\t\t//header.appendChild(navigation);\r\n\t\t\tbody.appendChild(this._video);\r\n\r\n\t\t\tthis._bindEvents(element);\r\n\t\t});\r\n\t}\r\n\r\n\t_bindElements(root) {\r\n\t\tthis._title = root.querySelector('.vg-filepreview-video-modal__title');\r\n\t\tthis._video = root.querySelector('.vg-filepreview-video-modal__video');\r\n\t}\r\n\r\n\t_bindEvents(root) {\r\n\t\tif (!root || root.hasAttribute('data-vg-filepreview-video-bind')) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\troot.setAttribute('data-vg-filepreview-video-bind', 'true');\r\n\t\tdocument.addEventListener('keydown', this._onKeyDown);\r\n\t\troot.addEventListener('vg.modal.hidden', () => {\r\n\t\t\tthis._stop();\r\n\t\t\tthis._destroyModal();\r\n\t\t});\r\n\t}\r\n\r\n\t_stop() {\r\n\t\tif (!this._video) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._video.pause();\r\n\t\tthis._video.currentTime = 0;\r\n\t}\r\n\r\n\t_destroyModal() {\r\n\t\tdocument.removeEventListener('keydown', this._onKeyDown);\r\n\t\tif (this._modal && typeof this._modal.dispose === 'function') {\r\n\t\t\tthis._modal.dispose();\r\n\t\t}\r\n\r\n\t\tif (this._root && this._root.parentNode) {\r\n\t\t\tthis._root.parentNode.removeChild(this._root);\r\n\t\t}\r\n\r\n\t\tthis._root = null;\r\n\t\tthis._modal = null;\r\n\t\tthis._title = null;\r\n\t\tthis._prevButton = null;\r\n\t\tthis._nextButton = null;\r\n\t\tthis._video = null;\r\n\t\tthis._playlist = [];\r\n\t\tthis._currentIndex = -1;\r\n\t\tthis._labels = {};\r\n\t}\r\n\r\n\t_syncNavigation() {\r\n\t\tif (!this._prevButton || !this._nextButton) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._prevButton.textContent = this._labels.prev || '';\r\n\t\tthis._nextButton.textContent = this._labels.next || '';\r\n\t\tconst hasPlaylist = this._playlist.length > 1;\r\n\t\tthis._prevButton.disabled = !hasPlaylist;\r\n\t\tthis._nextButton.disabled = !hasPlaylist;\r\n\t}\r\n\r\n\t_goPrev() {\r\n\t\tif (!this._playlist.length) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._currentIndex = this._currentIndex <= 0 ? this._playlist.length - 1 : this._currentIndex - 1;\r\n\t\tthis._openCurrentTrack();\r\n\t}\r\n\r\n\t_goNext(fromEnded = false) {\r\n\t\tif (!this._playlist.length) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (this._playlist.length === 1 && !fromEnded) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._currentIndex = (this._currentIndex + 1) % this._playlist.length;\r\n\t\tthis._openCurrentTrack();\r\n\t}\r\n\r\n\t_openCurrentTrack() {\r\n\t\tconst current = this._playlist[this._currentIndex];\r\n\t\tif (!current?.src) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.open({\r\n\t\t\tsrc: current.src,\r\n\t\t\ttitle: current.title || '',\r\n\t\t\tdefaultTitle: current.title || '',\r\n\t\t\tplaylist: {\r\n\t\t\t\ttracks: this._playlist,\r\n\t\t\t\tcurrentIndex: this._currentIndex\r\n\t\t\t},\r\n\t\t\tlabels: this._labels\r\n\t\t});\r\n\t}\r\n\r\n\t_handleHotkeys(event) {\r\n\t\tif (!this._root || !this._root.classList.contains('show')) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst tag = String(event?.target?.tagName || '').toUpperCase();\r\n\t\tif (['INPUT', 'TEXTAREA', 'SELECT'].includes(tag)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (event.key === 'ArrowLeft') {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tthis._goPrev();\r\n\t\t}\r\n\r\n\t\tif (event.key === 'ArrowRight') {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tthis._goNext();\r\n\t\t}\r\n\t}\r\n\r\n}\r\n\r\nexport default VideoModal;\r\n","const getPathFromElement = (element) => {\r\n\tconst value = element?.getAttribute('data-vg-filepreview') || '';\r\n\treturn String(value).trim();\r\n};\r\n\r\nconst parseExt = (path) => {\r\n\tif (!path) {\r\n\t\treturn '';\r\n\t}\r\n\r\n\tconst clean = String(path).split('#')[0].split('?')[0];\r\n\tconst name = clean.split('/').pop() || '';\r\n\tif (!name.includes('.')) {\r\n\t\treturn '';\r\n\t}\r\n\r\n\treturn `.${String(name.split('.').pop() || '').toLowerCase()}`;\r\n};\r\n\r\nconst toAbsoluteUrl = (path) => {\r\n\ttry {\r\n\t\treturn new URL(path, window.location.origin).href;\r\n\t} catch {\r\n\t\treturn '';\r\n\t}\r\n};\r\n\r\nconst resolveTitle = (element, fallbackPath = '') => {\r\n\tconst node = element?.querySelector('.name');\r\n\tconst title = String(node?.textContent || '').trim();\r\n\tif (title) {\r\n\t\treturn title;\r\n\t}\r\n\r\n\tconst name = String(fallbackPath).split('/').pop() || '';\r\n\treturn decodeURIComponent(name);\r\n};\r\n\r\nconst resolveSubtitle = (element) => {\r\n\tconst node = element?.querySelector('.original_name');\r\n\treturn String(node?.textContent || '').trim();\r\n};\r\n\r\nconst buildMediaPlaylist = (currentElement, acceptExt = () => true) => {\r\n\tconst nodes = Array.from(document.querySelectorAll('[data-vg-filepreview][data-vg-filepreview-valid=\"true\"]'));\r\n\tconst tracks = nodes\r\n\t\t.map((element) => {\r\n\t\t\tconst path = getPathFromElement(element);\r\n\t\t\tconst src = toAbsoluteUrl(path);\r\n\t\t\tconst ext = parseExt(path);\r\n\t\t\treturn {\r\n\t\t\t\telement,\r\n\t\t\t\tpath,\r\n\t\t\t\tsrc,\r\n\t\t\t\text,\r\n\t\t\t\ttitle: resolveTitle(element, path),\r\n\t\t\t\tsubtitle: resolveSubtitle(element)\r\n\t\t\t};\r\n\t\t})\r\n\t\t.filter((item) => item.src && acceptExt(item.ext));\r\n\r\n\tconst currentSrc = toAbsoluteUrl(getPathFromElement(currentElement));\r\n\tconst currentIndex = tracks.findIndex((item) => item.src === currentSrc);\r\n\r\n\treturn {\r\n\t\ttracks,\r\n\t\tcurrentIndex: currentIndex >= 0 ? currentIndex : 0\r\n\t};\r\n};\r\n\r\nexport { buildMediaPlaylist };\r\n","import VideoModal from \"./video-modal\";\r\nimport { buildMediaPlaylist } from \"./playlist\";\r\n\r\nconst VIDEO_EXTENSIONS = new Set([\r\n\t'.mp4',\r\n\t'.webm',\r\n\t'.mov',\r\n\t'.mkv',\r\n\t'.avi',\r\n\t'.m4v'\r\n]);\r\n\r\nclass VideoFilePreviewRenderer {\r\n\tconstructor() {\r\n\t\tthis.name = 'video';\r\n\t\tthis._modal = VideoModal.getInstance();\r\n\t}\r\n\r\n\tcanRender(context = {}) {\r\n\t\tconst ext = String(context?.fileMeta?.ext || '').toLowerCase();\r\n\t\treturn VIDEO_EXTENSIONS.has(ext);\r\n\t}\r\n\r\n\trender(context = {}) {\r\n\t\tconst container = context?.previewContainer;\r\n\t\tconst nameOnly = Boolean(context?.ui?.nameOnly);\r\n\t\tconst i18n = context?.i18n;\r\n\r\n\t\tconst src = context?.fileUrl?.href || context?.filePath || '';\r\n\t\tif (!src) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst playlist = buildMediaPlaylist(context?.element, (ext) => VIDEO_EXTENSIONS.has(ext));\r\n\t\tconst labels = {\r\n\t\t\tprev: i18n?.button('prev') || '',\r\n\t\t\tnext: i18n?.button('next') || ''\r\n\t\t};\r\n\r\n\t\tconst openVideo = (event) => {\r\n\t\t\tif (event) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t}\r\n\r\n\t\t\tthis._modal.open({\r\n\t\t\t\tsrc,\r\n\t\t\t\ttitle: context?.fileMeta?.name || i18n?.message('video_title') || '',\r\n\t\t\t\tdefaultTitle: i18n?.message('video_title') || '',\r\n\t\t\t\tplaylist,\r\n\t\t\t\tlabels\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tconst titleLink = context?.element?.querySelector('.name');\r\n\t\tif (titleLink && !titleLink.hasAttribute('data-vg-filepreview-video-bind')) {\r\n\t\t\ttitleLink.setAttribute('data-vg-filepreview-video-bind', 'true');\r\n\t\t\ttitleLink.classList.add('is-preview-action');\r\n\t\t\ttitleLink.addEventListener('click', openVideo);\r\n\t\t}\r\n\r\n\t\tif (nameOnly) {\r\n\t\t\treturn Boolean(titleLink);\r\n\t\t}\r\n\r\n\t\tif (!container) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst trigger = document.createElement('button');\r\n\t\ttrigger.type = 'button';\r\n\t\ttrigger.className = 'vg-filepreview-video-trigger';\r\n\t\ttrigger.textContent = i18n?.button('open_video') || '';\r\n\t\ttrigger.addEventListener('click', openVideo);\r\n\t\tcontainer.appendChild(trigger);\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport default VideoFilePreviewRenderer;\r\n","import VGModal from \"../../../vgmodal\";\r\n\r\nclass ZipModal {\r\n\tconstructor() {\r\n\t\tthis._modalId = 'vg-filepreview-zip-modal';\r\n\t\tthis._abortController = null;\r\n\t\tthis._labels = {};\r\n\t\tthis._entries = [];\r\n\t\tthis._arrayBuffer = null;\r\n\t}\r\n\r\n\tstatic getInstance() {\r\n\t\tif (!ZipModal._instance) {\r\n\t\t\tZipModal._instance = new ZipModal();\r\n\t\t}\r\n\r\n\t\treturn ZipModal._instance;\r\n\t}\r\n\r\n\topen(payload = {}) {\r\n\t\tconst src = String(payload.src || '').trim();\r\n\t\tif (!src) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._ensureModal();\r\n\t\tif (!this._modal || !this._content) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._labels = payload?.labels && typeof payload.labels === 'object' ? payload.labels : {};\r\n\t\tconst defaultTitle = String(payload.defaultTitle || '').trim();\r\n\t\tconst title = String(payload.title || '').trim();\r\n\t\tthis._title.textContent = title || defaultTitle;\r\n\t\tthis._content.innerHTML = `<div class=\"vg-filepreview-zip-modal__loading\">${this._escapeHtml(this._label('loadingArchive'))}</div>`;\r\n\t\tthis._modal.show();\r\n\r\n\t\tthis._loadZipEntries(src);\r\n\t}\r\n\r\n\tclose() {\r\n\t\tif (!this._modal) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._modal.hide();\r\n\t}\r\n\r\n\t_ensureModal() {\r\n\t\tif (this._modal && this._root) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._initModal();\r\n\t}\r\n\r\n\t_initModal() {\r\n\t\tconst params = {\r\n\t\t\tcentered: true,\r\n\t\t\tdismiss: true,\r\n\t\t\tbackdrop: true,\r\n\t\t\tkeyboard: true,\r\n\t\t\tsizes: {\r\n\t\t\t\twidth: '800px',\r\n\t\t\t},\r\n\t\t\tanimation: {\r\n\t\t\t\tenable: false\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst existed = document.getElementById(this._modalId);\r\n\t\tif (existed) {\r\n\t\t\tthis._root = existed;\r\n\t\t\tthis._modal = VGModal.getOrCreateInstance(existed, params);\r\n\t\t\tthis._bindElements(existed);\r\n\t\t\tthis._bindLifecycle(existed);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._modal = VGModal.build(this._modalId, params, (modalInstance) => {\r\n\t\t\tconst element = modalInstance._element;\r\n\t\t\tthis._root = element;\r\n\t\t\telement.classList.add('vg-filepreview-zip-modal');\r\n\r\n\t\t\tconst body = element.querySelector('.vg-modal-body');\r\n\t\t\tconst content = element.querySelector('.vg-modal-content');\r\n\t\t\tif (!body || !content) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tbody.classList.add('vg-filepreview-image-modal__body');\r\n\t\t\tbody.innerHTML = '';\r\n\r\n\t\t\tlet header = element.querySelector('.vg-modal-header');\r\n\t\t\tif (!header) {\r\n\t\t\t\theader = document.createElement('div');\r\n\t\t\t\theader.className = 'vg-modal-header';\r\n\t\t\t\tcontent.prepend(header);\r\n\t\t\t}\r\n\r\n\t\t\tthis._title = document.createElement('div');\r\n\t\t\tthis._title.className = 'vg-modal-title';\r\n\t\t\tthis._title.textContent = '';\r\n\r\n\t\t\tthis._content = document.createElement('div');\r\n\t\t\tthis._content.className = 'vg-filepreview-zip-modal__content';\r\n\r\n\t\t\theader.appendChild(this._title);\r\n\t\t\tbody.appendChild(this._content);\r\n\r\n\t\t\tthis._bindLifecycle(element);\r\n\t\t});\r\n\t}\r\n\r\n\t_bindElements(root) {\r\n\t\tthis._title = root.querySelector('.vg-filepreview-zip-modal__title');\r\n\t\tthis._content = root.querySelector('.vg-filepreview-zip-modal__content');\r\n\t}\r\n\r\n\t_bindLifecycle(root) {\r\n\t\tif (!root || root.hasAttribute('data-vg-filepreview-zip-lifecycle-bind')) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\troot.setAttribute('data-vg-filepreview-zip-lifecycle-bind', 'true');\r\n\t\troot.addEventListener('vg.modal.hidden', () => {\r\n\t\t\tthis._destroyModal();\r\n\t\t});\r\n\t}\r\n\r\n\t_loadZipEntries(src) {\r\n\t\tif (this._abortController) {\r\n\t\t\tthis._abortController.abort();\r\n\t\t}\r\n\t\tthis._abortController = new AbortController();\r\n\r\n\t\tconst cached = ZipModal._cache.get(src);\r\n\t\tif (cached?.entries && cached?.arrayBuffer) {\r\n\t\t\tthis._entries = cached.entries;\r\n\t\t\tthis._arrayBuffer = cached.arrayBuffer;\r\n\t\t\tthis._renderEntries(this._entries);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfetch(src, {\r\n\t\t\tmethod: 'GET',\r\n\t\t\tsignal: this._abortController.signal\r\n\t\t})\r\n\t\t\t.then((response) => {\r\n\t\t\t\tif (!response.ok) {\r\n\t\t\t\t\tthrow new Error(`HTTP ${response.status}`);\r\n\t\t\t\t}\r\n\t\t\t\treturn response.arrayBuffer();\r\n\t\t\t})\r\n\t\t\t.then((buffer) => {\r\n\t\t\t\tconst entries = this._parseZipEntries(buffer);\r\n\t\t\t\tthis._entries = entries;\r\n\t\t\t\tthis._arrayBuffer = buffer;\r\n\t\t\t\tZipModal._cache.set(src, {\r\n\t\t\t\t\tentries,\r\n\t\t\t\t\tarrayBuffer: buffer\r\n\t\t\t\t});\r\n\t\t\t\tthis._renderEntries(entries);\r\n\t\t\t})\r\n\t\t\t.catch((error) => {\r\n\t\t\t\tif (error?.name === 'AbortError') {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (this._content) {\r\n\t\t\t\t\tconst errorText = this._resolveErrorText(error);\r\n\t\t\t\t\tthis._content.innerHTML = `<div class=\"vg-filepreview-zip-modal__error\">${this._escapeHtml(this._label('cannotOpenArchive'))}: ${this._escapeHtml(errorText)}</div>`;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t}\r\n\r\n\t_destroyModal() {\r\n\t\tif (this._abortController) {\r\n\t\t\tthis._abortController.abort();\r\n\t\t\tthis._abortController = null;\r\n\t\t}\r\n\r\n\t\tif (this._modal && typeof this._modal.dispose === 'function') {\r\n\t\t\tthis._modal.dispose();\r\n\t\t}\r\n\r\n\t\tif (this._root && this._root.parentNode) {\r\n\t\t\tthis._root.parentNode.removeChild(this._root);\r\n\t\t}\r\n\r\n\t\tthis._root = null;\r\n\t\tthis._modal = null;\r\n\t\tthis._title = null;\r\n\t\tthis._content = null;\r\n\t\tthis._labels = null;\r\n\t\tthis._entries = [];\r\n\t\tthis._arrayBuffer = null;\r\n\t}\r\n\r\n\t_parseZipEntries(arrayBuffer) {\r\n\t\tconst view = new DataView(arrayBuffer);\r\n\t\tconst length = view.byteLength;\r\n\r\n\t\tif (length < 22) {\r\n\t\t\tthrow new Error('invalid_zip');\r\n\t\t}\r\n\r\n\t\tconst eocdOffset = this._findEndOfCentralDirectory(view);\r\n\t\tif (eocdOffset < 0) {\r\n\t\t\tthrow new Error('central_directory_not_found');\r\n\t\t}\r\n\r\n\t\tconst totalEntries = view.getUint16(eocdOffset + 10, true);\r\n\t\tconst centralDirOffset = view.getUint32(eocdOffset + 16, true);\r\n\r\n\t\tconst decoder = new TextDecoder('utf-8', { fatal: false });\r\n\t\tconst entries = [];\r\n\t\tlet ptr = centralDirOffset;\r\n\r\n\t\tfor (let i = 0; i < totalEntries; i += 1) {\r\n\t\t\tif (ptr + 46 > length) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tconst signature = view.getUint32(ptr, true);\r\n\t\t\tif (signature !== 0x02014b50) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tconst compressedSize = view.getUint32(ptr + 20, true);\r\n\t\t\tconst uncompressedSize = view.getUint32(ptr + 24, true);\r\n\t\t\tconst compressionMethod = view.getUint16(ptr + 10, true);\r\n\t\t\tconst fileNameLen = view.getUint16(ptr + 28, true);\r\n\t\t\tconst extraLen = view.getUint16(ptr + 30, true);\r\n\t\t\tconst commentLen = view.getUint16(ptr + 32, true);\r\n\t\t\tconst localHeaderOffset = view.getUint32(ptr + 42, true);\r\n\r\n\t\t\tconst nameStart = ptr + 46;\r\n\t\t\tconst nameEnd = nameStart + fileNameLen;\r\n\t\t\tif (nameEnd > length) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tconst fileNameBytes = new Uint8Array(arrayBuffer, nameStart, fileNameLen);\r\n\t\t\tconst fileName = decoder.decode(fileNameBytes);\r\n\r\n\t\t\tentries.push({\r\n\t\t\t\tname: fileName,\r\n\t\t\t\tcompressedSize,\r\n\t\t\t\tuncompressedSize,\r\n\t\t\t\tcompressionMethod,\r\n\t\t\t\tlocalHeaderOffset,\r\n\t\t\t\tisDirectory: fileName.endsWith('/')\r\n\t\t\t});\r\n\r\n\t\t\tptr = nameEnd + extraLen + commentLen;\r\n\t\t}\r\n\r\n\t\treturn entries;\r\n\t}\r\n\r\n\t_findEndOfCentralDirectory(view) {\r\n\t\tconst minOffset = Math.max(0, view.byteLength - 65557);\r\n\t\tfor (let i = view.byteLength - 22; i >= minOffset; i -= 1) {\r\n\t\t\tif (view.getUint32(i, true) === 0x06054b50) {\r\n\t\t\t\treturn i;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn -1;\r\n\t}\r\n\r\n\t_renderEntries(entries) {\r\n\t\tif (!this._content) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!entries.length) {\r\n\t\t\tthis._content.innerHTML = `<div class=\"vg-filepreview-zip-modal__empty\">${this._escapeHtml(this._label('archiveEmptyUnsupported'))}</div>`;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst rows = entries.map((entry, index) => {\r\n\t\t\tconst type = entry.isDirectory\r\n\t\t\t\t? this._label('typeDir')\r\n\t\t\t\t: this._label('typeFile');\r\n\t\t\tconst compressed = entry.isDirectory ? '-' : this._formatSize(entry.compressedSize);\r\n\t\t\tconst original = entry.isDirectory ? '-' : this._formatSize(entry.uncompressedSize);\r\n\t\t\tconst previewAction = (!entry.isDirectory && this._canPreviewEntry(entry))\r\n\t\t\t\t? `<button type=\"button\" class=\"vg-filepreview-zip-modal__entry-btn\" data-entry-index=\"${index}\">${this._escapeHtml(this._label('previewEntry'))}</button>`\r\n\t\t\t\t: '-';\r\n\r\n\t\t\treturn `\r\n<tr>\r\n\t<td>${index + 1}</td>\r\n\t<td class=\"name\">${this._escapeHtml(entry.name)}</td>\r\n\t<td>${type}</td>\r\n\t<td>${compressed}</td>\r\n\t<td>${original}</td>\r\n\t<td>${previewAction}</td>\r\n</tr>`;\r\n\t\t}).join('');\r\n\r\n\t\tthis._content.innerHTML = `\r\n<table class=\"vg-filepreview-zip-modal__table\">\r\n\t<thead>\r\n\t\t<tr>\r\n\t\t\t<th>#</th>\r\n\t\t\t<th>${this._escapeHtml(this._label('tableName'))}</th>\r\n\t\t\t<th>${this._escapeHtml(this._label('tableType'))}</th>\r\n\t\t\t<th>${this._escapeHtml(this._label('tablePacked'))}</th>\r\n\t\t\t<th>${this._escapeHtml(this._label('tableSize'))}</th>\r\n\t\t\t<th>${this._escapeHtml(this._label('tablePreview'))}</th>\r\n\t\t</tr>\r\n\t</thead>\r\n\t<tbody>\r\n\t\t${rows}\r\n\t</tbody>\r\n</table>`;\r\n\t\tthis._bindEntriesPreview();\r\n\t}\r\n\r\n\t_label(key, fallback = '') {\r\n\t\tconst value = this._labels?.[key];\r\n\t\treturn typeof value === 'string' && value.trim() ? value : fallback;\r\n\t}\r\n\r\n\t_resolveErrorText(error) {\r\n\t\tconst message = String(error?.message || '').trim();\r\n\t\tif (!message) {\r\n\t\t\treturn this._label('unknownError');\r\n\t\t}\r\n\r\n\t\tif (message === 'invalid_zip') {\r\n\t\t\treturn this._label('invalidZip');\r\n\t\t}\r\n\r\n\t\tif (message === 'central_directory_not_found') {\r\n\t\t\treturn this._label('centralDirectoryNotFound');\r\n\t\t}\r\n\r\n\t\treturn message;\r\n\t}\r\n\r\n\t_formatSize(bytes) {\r\n\t\tif (!Number.isFinite(bytes) || bytes < 0) {\r\n\t\t\treturn '-';\r\n\t\t}\r\n\r\n\t\tconst units = ['B', 'KB', 'MB', 'GB'];\r\n\t\tlet value = bytes;\r\n\t\tlet unitIndex = 0;\r\n\t\twhile (value >= 1024 && unitIndex < units.length - 1) {\r\n\t\t\tvalue /= 1024;\r\n\t\t\tunitIndex += 1;\r\n\t\t}\r\n\r\n\t\tconst digits = value >= 100 || unitIndex === 0 ? 0 : 2;\r\n\t\treturn `${value.toFixed(digits)} ${units[unitIndex]}`;\r\n\t}\r\n\r\n\t_escapeHtml(value) {\r\n\t\treturn String(value)\r\n\t\t\t.replace(/&/g, '&')\r\n\t\t\t.replace(/</g, '<')\r\n\t\t\t.replace(/>/g, '>')\r\n\t\t\t.replace(/\"/g, '"')\r\n\t\t\t.replace(/'/g, ''');\r\n\t}\r\n\r\n\t_bindEntriesPreview() {\r\n\t\tif (!this._content || this._content.hasAttribute('data-vg-filepreview-zip-preview-bind')) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._content.setAttribute('data-vg-filepreview-zip-preview-bind', 'true');\r\n\t\tthis._content.addEventListener('click', (event) => {\r\n\t\t\tconst button = event.target.closest('[data-entry-index]');\r\n\t\t\tif (!button) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tevent.preventDefault();\r\n\t\t\tconst index = Number(button.getAttribute('data-entry-index'));\r\n\t\t\tif (!Number.isFinite(index) || index < 0 || index >= this._entries.length) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tthis._previewEntry(index);\r\n\t\t});\r\n\t}\r\n\r\n\t_canPreviewEntry(entry) {\r\n\t\tif (!entry || entry.isDirectory || !entry.name) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst ext = this._extractExtension(entry.name);\r\n\t\tconst allowed = new Set([\r\n\t\t\t'.txt', '.md', '.json', '.xml', '.yml', '.yaml', '.csv', '.log',\r\n\t\t\t'.png', '.jpg', '.jpeg', '.gif', '.webp', '.svg', '.bmp'\r\n\t\t]);\r\n\t\treturn allowed.has(ext);\r\n\t}\r\n\r\n\tasync _previewEntry(index) {\r\n\t\tif (!this._content) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst entry = this._entries[index];\r\n\t\tif (!entry || !this._canPreviewEntry(entry)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet panel = this._content.querySelector('.vg-filepreview-zip-modal__entry-preview');\r\n\t\tif (!panel) {\r\n\t\t\tpanel = document.createElement('div');\r\n\t\t\tpanel.className = 'vg-filepreview-zip-modal__entry-preview';\r\n\t\t\tthis._content.appendChild(panel);\r\n\t\t}\r\n\r\n\t\tpanel.innerHTML = `<div class=\"vg-filepreview-zip-modal__entry-preview-loading\">${this._escapeHtml(this._label('loadingEntry'))}</div>`;\r\n\r\n\t\ttry {\r\n\t\t\tconst uint8 = await this._extractEntryBytes(entry);\r\n\t\t\tconst ext = this._extractExtension(entry.name);\r\n\r\n\t\t\tif (this._isImageExtension(ext)) {\r\n\t\t\t\tconst blob = new Blob([uint8.buffer], { type: this._mimeByExtension(ext) });\r\n\t\t\t\tconst url = URL.createObjectURL(blob);\r\n\t\t\t\tpanel.innerHTML = `\r\n<div class=\"vg-filepreview-zip-modal__entry-preview-title\">${this._escapeHtml(entry.name)}</div>\r\n<img class=\"vg-filepreview-zip-modal__entry-preview-image\" src=\"${url}\" alt=\"${this._escapeHtml(entry.name)}\" />`;\r\n\t\t\t\tsetTimeout(() => URL.revokeObjectURL(url), 2000);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst decoder = new TextDecoder('utf-8', { fatal: false });\r\n\t\t\tconst text = decoder.decode(uint8);\r\n\t\t\tconst safeText = this._escapeHtml(text || this._label('emptyFileInArchive'));\r\n\t\t\tpanel.innerHTML = `\r\n<div class=\"vg-filepreview-zip-modal__entry-preview-title\">${this._escapeHtml(entry.name)}</div>\r\n<pre class=\"vg-filepreview-zip-modal__entry-preview-text\">${safeText}</pre>`;\r\n\t\t} catch (error) {\r\n\t\t\tpanel.innerHTML = `<div class=\"vg-filepreview-zip-modal__entry-preview-error\">${this._escapeHtml(this._label('cannotPreviewEntry'))}: ${this._escapeHtml(error?.message || this._label('unknownError'))}</div>`;\r\n\t\t}\r\n\t}\r\n\r\n\tasync _extractEntryBytes(entry) {\r\n\t\tif (!this._arrayBuffer) {\r\n\t\t\tthrow new Error(this._label('archiveBufferMissing'));\r\n\t\t}\r\n\r\n\t\tconst view = new DataView(this._arrayBuffer);\r\n\t\tconst offset = Number(entry.localHeaderOffset || 0);\r\n\t\tif (offset + 30 > view.byteLength) {\r\n\t\t\tthrow new Error(this._label('entryCorrupted'));\r\n\t\t}\r\n\r\n\t\tconst signature = view.getUint32(offset, true);\r\n\t\tif (signature !== 0x04034b50) {\r\n\t\t\tthrow new Error(this._label('entryCorrupted'));\r\n\t\t}\r\n\r\n\t\tconst nameLen = view.getUint16(offset + 26, true);\r\n\t\tconst extraLen = view.getUint16(offset + 28, true);\r\n\t\tconst dataStart = offset + 30 + nameLen + extraLen;\r\n\t\tconst dataEnd = dataStart + Number(entry.compressedSize || 0);\r\n\t\tif (dataEnd > view.byteLength) {\r\n\t\t\tthrow new Error(this._label('entryCorrupted'));\r\n\t\t}\r\n\r\n\t\tconst compressed = new Uint8Array(this._arrayBuffer.slice(dataStart, dataEnd));\r\n\t\tconst method = Number(entry.compressionMethod || 0);\r\n\r\n\t\tif (method === 0) {\r\n\t\t\treturn compressed;\r\n\t\t}\r\n\r\n\t\tif (method === 8) {\r\n\t\t\tif (typeof DecompressionStream === 'undefined') {\r\n\t\t\t\tthrow new Error(this._label('deflateNotSupported'));\r\n\t\t\t}\r\n\r\n\t\t\tconst stream = new Blob([compressed]).stream().pipeThrough(new DecompressionStream('deflate-raw'));\r\n\t\t\tconst decompressed = await new Response(stream).arrayBuffer();\r\n\t\t\treturn new Uint8Array(decompressed);\r\n\t\t}\r\n\r\n\t\tthrow new Error(this._label('compressionNotSupported'));\r\n\t}\r\n\r\n\t_extractExtension(name) {\r\n\t\tconst value = String(name || '').toLowerCase();\r\n\t\tconst clean = value.split('/').pop() || '';\r\n\t\tif (!clean.includes('.')) {\r\n\t\t\treturn '';\r\n\t\t}\r\n\t\treturn `.${clean.split('.').pop() || ''}`;\r\n\t}\r\n\r\n\t_isImageExtension(ext) {\r\n\t\treturn new Set(['.png', '.jpg', '.jpeg', '.gif', '.webp', '.svg', '.bmp']).has(ext);\r\n\t}\r\n\r\n\t_mimeByExtension(ext) {\r\n\t\tconst map = {\r\n\t\t\t'.png': 'image/png',\r\n\t\t\t'.jpg': 'image/jpeg',\r\n\t\t\t'.jpeg': 'image/jpeg',\r\n\t\t\t'.gif': 'image/gif',\r\n\t\t\t'.webp': 'image/webp',\r\n\t\t\t'.svg': 'image/svg+xml',\r\n\t\t\t'.bmp': 'image/bmp'\r\n\t\t};\r\n\t\treturn map[ext] || 'application/octet-stream';\r\n\t}\r\n\r\n}\r\n\r\nZipModal._cache = new Map();\r\n\r\nexport default ZipModal;\r\n","import ZipModal from \"./zip-modal\";\r\n\r\nconst ZIP_EXTENSIONS = new Set([\r\n\t'.zip'\r\n]);\r\n\r\nclass ZipFilePreviewRenderer {\r\n\tconstructor() {\r\n\t\tthis.name = 'zip';\r\n\t\tthis._modal = ZipModal.getInstance();\r\n\t}\r\n\r\n\tcanRender(context = {}) {\r\n\t\tconst ext = String(context?.fileMeta?.ext || '').toLowerCase();\r\n\t\treturn ZIP_EXTENSIONS.has(ext);\r\n\t}\r\n\r\n\trender(context = {}) {\r\n\t\tconst container = context?.previewContainer;\r\n\t\tconst nameOnly = Boolean(context?.ui?.nameOnly);\r\n\t\tconst i18n = context?.i18n;\r\n\r\n\t\tconst src = context?.fileUrl?.href || context?.filePath || '';\r\n\t\tif (!src) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst openArchive = (event) => {\r\n\t\t\tif (event) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t}\r\n\r\n\t\t\tthis._modal.open({\r\n\t\t\t\tsrc,\r\n\t\t\t\ttitle: context?.fileMeta?.name || i18n?.message('archive_title') || '',\r\n\t\t\t\tdefaultTitle: i18n?.message('archive_title') || '',\r\n\t\t\t\tlabels: {\r\n\t\t\t\t\tloadingArchive: i18n?.message('loading_archive') || '',\r\n\t\t\t\t\tcannotOpenArchive: i18n?.message('cannot_open_archive') || '',\r\n\t\t\t\t\tunknownError: i18n?.message('unknown_error') || '',\r\n\t\t\t\t\tinvalidZip: i18n?.message('invalid_zip') || '',\r\n\t\t\t\t\tcentralDirectoryNotFound: i18n?.message('central_directory_not_found') || '',\r\n\t\t\t\t\tarchiveEmptyUnsupported: i18n?.message('archive_empty_unsupported') || '',\r\n\t\t\t\t\ttypeDir: i18n?.message('archive_type_dir') || '',\r\n\t\t\t\t\ttypeFile: i18n?.message('archive_type_file') || '',\r\n\t\t\t\t\ttableName: i18n?.message('archive_table_name') || '',\r\n\t\t\t\t\ttableType: i18n?.message('archive_table_type') || '',\r\n\t\t\t\t\ttablePacked: i18n?.message('archive_table_packed') || '',\r\n\t\t\t\t\ttableSize: i18n?.message('archive_table_size') || '',\r\n\t\t\t\t\ttablePreview: i18n?.message('archive_table_preview') || '',\r\n\t\t\t\t\tpreviewEntry: i18n?.button('preview') || '',\r\n\t\t\t\t\tloadingEntry: i18n?.message('loading_entry') || '',\r\n\t\t\t\t\tcannotPreviewEntry: i18n?.message('cannot_preview_entry') || '',\r\n\t\t\t\t\tdeflateNotSupported: i18n?.message('deflate_not_supported') || '',\r\n\t\t\t\t\tcompressionNotSupported: i18n?.message('compression_not_supported') || '',\r\n\t\t\t\t\tentryCorrupted: i18n?.message('entry_corrupted') || '',\r\n\t\t\t\t\tarchiveBufferMissing: i18n?.message('archive_buffer_missing') || '',\r\n\t\t\t\t\temptyFileInArchive: i18n?.message('empty_file') || ''\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tconst titleLink = context?.element?.querySelector('.name');\r\n\t\tif (titleLink && !titleLink.hasAttribute('data-vg-filepreview-zip-bind')) {\r\n\t\t\ttitleLink.setAttribute('data-vg-filepreview-zip-bind', 'true');\r\n\t\t\ttitleLink.classList.add('is-preview-action');\r\n\t\t\ttitleLink.addEventListener('click', openArchive);\r\n\t\t}\r\n\r\n\t\tif (nameOnly) {\r\n\t\t\treturn Boolean(titleLink);\r\n\t\t}\r\n\r\n\t\tif (!container) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst trigger = document.createElement('button');\r\n\t\ttrigger.type = 'button';\r\n\t\ttrigger.className = 'vg-filepreview-zip-trigger';\r\n\t\ttrigger.textContent = i18n?.button('open_archive') || '';\r\n\t\ttrigger.addEventListener('click', openArchive);\r\n\t\tcontainer.appendChild(trigger);\r\n\r\n\t\treturn true;\r\n\t}\r\n}\r\n\r\nexport default ZipFilePreviewRenderer;\r\n","import { lang_buttons, lang_messages } from \"../../../utils/js/components/lang\";\r\n\r\nconst SUPPORTED_LANGS = new Set([\"ru\", \"en\"]);\r\n\r\nconst normalizeLang = (value, fallback = \"ru\") => {\r\n\tconst candidate = String(value || \"\").trim().toLowerCase();\r\n\tif (!candidate) {\r\n\t\treturn fallback;\r\n\t}\r\n\r\n\tconst short = candidate.split(\"-\")[0];\r\n\treturn SUPPORTED_LANGS.has(short) ? short : fallback;\r\n};\r\n\r\nconst resolveFilePreviewLang = (paramsLang, element) => {\r\n\tconst fromParams = normalizeLang(paramsLang, \"\");\r\n\tif (fromParams) {\r\n\t\treturn fromParams;\r\n\t}\r\n\r\n\tconst fromElement = normalizeLang(element?.getAttribute(\"lang\"), \"\");\r\n\tif (fromElement) {\r\n\t\treturn fromElement;\r\n\t}\r\n\r\n\tconst fromClosest = normalizeLang(element?.closest(\"[lang]\")?.getAttribute(\"lang\"), \"\");\r\n\tif (fromClosest) {\r\n\t\treturn fromClosest;\r\n\t}\r\n\r\n\tconst fromHtml = normalizeLang(document?.documentElement?.getAttribute(\"lang\"), \"\");\r\n\tif (fromHtml) {\r\n\t\treturn fromHtml;\r\n\t}\r\n\r\n\tconst fromNavigator = normalizeLang(window?.navigator?.language, \"\");\r\n\tif (fromNavigator) {\r\n\t\treturn fromNavigator;\r\n\t}\r\n\r\n\treturn \"ru\";\r\n};\r\n\r\nconst createFilePreviewI18n = (lang = \"ru\") => {\r\n\tconst normalizedLang = normalizeLang(lang, \"ru\");\r\n\tconst messages = lang_messages(normalizedLang, \"filepreview\") || {};\r\n\tconst buttons = lang_buttons(normalizedLang, \"filepreview\") || {};\r\n\r\n\treturn {\r\n\t\tlang: normalizedLang,\r\n\t\tmessage: (key, fallback = \"\") => messages[key] || fallback,\r\n\t\tbutton: (key, fallback = \"\") => buttons[key] || fallback\r\n\t};\r\n};\r\n\r\nexport { createFilePreviewI18n, resolveFilePreviewLang };\r\n","import BaseModule from \"../../base-module\";\r\nimport {mergeDeepObject} from \"../../../utils/js/functions\";\r\nimport FilePreviewHelper from \"../../../utils/js/components/file-preview\";\r\nimport {extractAudioMetadata} from \"../../../utils/js/components/audio-metadata\";\r\nimport {extractVideoMetadata} from \"../../../utils/js/components/video-metadata\";\r\nimport {getSVG} from \"../../module-fn\";\r\nimport createFilePreviewRenderers from \"./renderers\";\r\nimport ImageModal from \"./renderers/image-modal\";\r\nimport {createFilePreviewI18n, resolveFilePreviewLang} from \"./i18n\";\r\n\r\nconst NAME = 'filepreview';\r\nconst NAME_KEY = 'vg.filepreview';\r\n\r\nclass VGFilePreview extends BaseModule {\r\n\tconstructor(el, params = {}) {\r\n\t\tsuper(el, params);\r\n\r\n\t\tthis._params = this._getParams(el, mergeDeepObject({\r\n\t\t\tvalidate: true,\r\n\t\t\tlang: 'ru',\r\n\t\t\tui: {\r\n\t\t\t\tnameOnly: false\r\n\t\t\t},\r\n\t\t\tpreview: {\r\n\t\t\t\taudio: {enable: true},\r\n\t\t\t\tvideo: {enable: true},\r\n\t\t\t\timage: {enable: true},\r\n\t\t\t\tarchive: {enable: true},\r\n\t\t\t\ttext: {enable: true},\r\n\t\t\t\toffice: {enable: true},\r\n\t\t\t\tpdf: {enable: true}\r\n\t\t\t}\r\n\t\t}, params));\r\n\r\n\t\tthis._filePath = '';\r\n\t\tthis._fileUrl = null;\r\n\t\tthis._isValid = false;\r\n\t\tthis._fileMeta = {};\r\n\t\tthis._fields = [];\r\n\t\tthis._editableFields = {};\r\n\t\tthis._helper = new FilePreviewHelper(this._element);\r\n\t\tthis._renderers = createFilePreviewRenderers();\r\n\t\tthis._lang = resolveFilePreviewLang(this._params.lang, this._element);\r\n\t\tthis._i18n = createFilePreviewI18n(this._lang);\r\n\t\tthis._inlineAudio = null;\r\n\t\tthis._inlineAudioSrc = '';\r\n\t\tthis._inlineAudioButton = null;\r\n\t\tthis._inlineAudioIcon = null;\r\n\t\tthis._inlineAudioContainer = null;\r\n\t\tthis._audioMetaPromise = null;\r\n\t\tthis._audioMetaApplied = false;\r\n\t\tthis._audioCoverObjectUrl = '';\r\n\t\tthis._videoMetaPromise = null;\r\n\t\tthis._videoMetaApplied = false;\r\n\t\tthis._videoCoverObjectUrl = '';\r\n\t\tthis._imageModal = null;\r\n\r\n\t\tthis.init();\r\n\t}\r\n\r\n\tstatic get NAME() {\r\n\t\treturn NAME;\r\n\t}\r\n\r\n\tstatic get NAME_KEY() {\r\n\t\treturn NAME_KEY;\r\n\t}\r\n\r\n\tget filePath() {\r\n\t\treturn this._filePath;\r\n\t}\r\n\r\n\tget fileUrl() {\r\n\t\treturn this._fileUrl;\r\n\t}\r\n\r\n\tget isValid() {\r\n\t\treturn this._isValid;\r\n\t}\r\n\r\n\tget fileMeta() {\r\n\t\treturn this._fileMeta;\r\n\t}\r\n\r\n\tget fields() {\r\n\t\treturn this._fields;\r\n\t}\r\n\r\n\tget editableFields() {\r\n\t\treturn this._editableFields;\r\n\t}\r\n\r\n\tinit() {\r\n\t\tconst filePath = this._helper.getFilePath();\r\n\t\tthis._filePath = filePath;\r\n\r\n\t\tif (this._params.validate) {\r\n\t\t\tconst validation = this._helper.validateFilePath(filePath);\r\n\t\t\tthis._isValid = validation.isValid;\r\n\t\t\tthis._fileUrl = validation.fileUrl;\r\n\t\t} else {\r\n\t\t\tthis._isValid = true;\r\n\t\t\tthis._fileUrl = null;\r\n\t\t}\r\n\r\n\t\tthis._helper.syncState(this._isValid);\r\n\r\n\t\tif (!this._isValid) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tthis._fileMeta = this._helper.getFileMeta(this._filePath);\r\n\t\treturn this.preview();\r\n\t}\r\n\r\n\tpreview() {\r\n\t\tthis._setState('loading');\r\n\t\tthis._fields = this._helper.getFields();\r\n\t\tthis._editableFields = this._helper.resolveEditableFields(this._fields);\r\n\t\tthis._helper.syncEditableFields(this._editableFields);\r\n\t\tthis._renderIcon();\r\n\t\tthis._renderTextFields();\r\n\t\tthis._renderDownloadField();\r\n\t\tthis._enrichVideoMetadata();\r\n\t\tthis._renderPreview();\r\n\r\n\t\treturn this._editableFields;\r\n\t}\r\n\r\n\t_renderIcon() {\r\n\t\tconst iconField = this._editableFields.icon;\r\n\t\tif (!iconField) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst imageSrc = this._getImageIconSrc();\r\n\t\tif (imageSrc) {\r\n\t\t\ticonField.innerHTML = '';\r\n\t\t\tconst image = document.createElement('img');\r\n\t\t\timage.src = imageSrc;\r\n\t\t\timage.alt = this._fileMeta?.originalName || this._fileMeta?.name || '';\r\n\t\t\timage.className = 'vg-filepreview-icon-image';\r\n\t\t\timage.loading = 'lazy';\r\n\t\t\timage.addEventListener('error', () => {\r\n\t\t\t\tthis._renderDefaultIcon(iconField);\r\n\t\t\t});\r\n\t\t\tif (this._isPreviewGroupEnabled('image')) {\r\n\t\t\t\tthis._bindIconImageToModal(image, imageSrc);\r\n\t\t\t}\r\n\t\t\ticonField.appendChild(image);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._renderDefaultIcon(iconField);\r\n\t}\r\n\r\n\t_renderTextFields() {\r\n\t\tconst displayName = this._getDisplayName();\r\n\t\tconst fileName = this._getFileName();\r\n\t\tconst hasDataTitle = this._hasDataDrivenDisplayName();\r\n\r\n\t\tconst nameField = this._editableFields.name;\r\n\t\tif (nameField) {\r\n\t\t\tif (this._isAudioFile() && this._isPreviewGroupEnabled('audio')) {\r\n\t\t\t\tthis._renderAudioNameField(nameField);\r\n\t\t\t\tthis._element.setAttribute('data-vg-filepreview-renderer', 'audio');\r\n\t\t\t} else if (displayName) {\r\n\t\t\t\tnameField.classList.remove('vg-filepreview-audio-inline');\r\n\t\t\t\tnameField.textContent = displayName;\r\n\t\t\t\tthis._applyNameClampStyles(nameField);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst extField = this._editableFields.ext;\r\n\t\tif (extField && this._fileMeta.ext) {\r\n\t\t\textField.textContent = this._fileMeta.ext;\r\n\t\t}\r\n\r\n\t\tconst sizeField = this._editableFields.size;\r\n\t\tif (sizeField && this._fileMeta.sizeText) {\r\n\t\t\tsizeField.textContent = this._fileMeta.sizeText;\r\n\t\t}\r\n\r\n\t\tconst originalNameField = this._editableFields.original_name;\r\n\t\tif (!originalNameField) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (hasDataTitle && fileName) {\r\n\t\t\toriginalNameField.textContent = fileName;\r\n\t\t\tthis._applyNameClampStyles(originalNameField);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (this._fileMeta.originalName) {\r\n\t\t\toriginalNameField.textContent = this._fileMeta.originalName;\r\n\t\t\tthis._applyNameClampStyles(originalNameField);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (this._fileMeta.isMedia) {\r\n\t\t\toriginalNameField.textContent = '';\r\n\t\t}\r\n\t}\r\n\r\n\t_renderAudioNameField(nameField) {\r\n\t\tconst fileName = this._getDisplayName();\r\n\t\tif (!fileName) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tnameField.innerHTML = '';\r\n\t\tnameField.classList.add('vg-filepreview-audio-inline');\r\n\r\n\t\tconst button = document.createElement('button');\r\n\t\tbutton.type = 'button';\r\n\t\tbutton.className = 'vg-filepreview-audio-inline__toggle';\r\n\t\tbutton.setAttribute('aria-label', 'Play/Pause');\r\n\r\n\t\tconst icon = document.createElement('span');\r\n\t\ticon.className = 'vg-filepreview-audio-inline__icon';\r\n\t\tbutton.appendChild(icon);\r\n\r\n\t\tconst text = document.createElement('span');\r\n\t\ttext.className = 'vg-filepreview-audio-inline__name';\r\n\t\ttext.textContent = fileName;\r\n\t\tthis._applyNameClampStyles(text);\r\n\t\ttext.addEventListener('click', (event) => {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tevent.stopPropagation();\r\n\t\t\tthis._toggleInlineAudio();\r\n\t\t});\r\n\r\n\t\tbutton.addEventListener('click', (event) => {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tevent.stopPropagation();\r\n\t\t\tthis._toggleInlineAudio();\r\n\t\t});\r\n\r\n\t\tnameField.appendChild(button);\r\n\t\tnameField.appendChild(text);\r\n\r\n\t\tthis._inlineAudioButton = button;\r\n\t\tthis._inlineAudioIcon = icon;\r\n\t\tconst rootFile = this._element?.classList?.contains('file')\r\n\t\t\t? this._element\r\n\t\t\t: this._element?.closest?.('.file');\r\n\t\tthis._inlineAudioContainer = rootFile || this._element || nameField;\r\n\t\tthis._setInlineAudioProgress(0);\r\n\t\tconst isCurrentAudioPlaying = VGFilePreview._activeAudioOwner === this && this._inlineAudio && !this._inlineAudio.paused;\r\n\t\tthis._syncInlineAudioIcon(isCurrentAudioPlaying);\r\n\t\tthis._enrichAudioMetadata(text);\r\n\t}\r\n\r\n\t_toggleInlineAudio() {\r\n\t\tif (!this._isPreviewGroupEnabled('audio')) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst src = this._fileUrl?.href || this._filePath || '';\r\n\t\tif (!src || !this._inlineAudioButton) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (VGFilePreview._activeAudioOwner && VGFilePreview._activeAudioOwner !== this) {\r\n\t\t\tVGFilePreview._activeAudioOwner._stopInlineAudio();\r\n\t\t}\r\n\r\n\t\tif (!this._inlineAudio || this._inlineAudioSrc !== src) {\r\n\t\t\tthis._stopInlineAudio();\r\n\t\t\tthis._inlineAudio = new Audio(src);\r\n\t\t\tthis._inlineAudioSrc = src;\r\n\t\t\tthis._inlineAudio.addEventListener('ended', () => {\r\n\t\t\t\tthis._syncInlineAudioIcon(false);\r\n\t\t\t\tthis._setInlineAudioProgress(0);\r\n\t\t\t});\r\n\t\t\tthis._inlineAudio.addEventListener('timeupdate', () => this._syncInlineAudioProgress());\r\n\t\t\tthis._inlineAudio.addEventListener('loadedmetadata', () => this._syncInlineAudioProgress());\r\n\t\t}\r\n\r\n\t\tif (this._inlineAudio.paused) {\r\n\t\t\tthis._inlineAudio.play().then(() => {\r\n\t\t\t\tVGFilePreview._activeAudioOwner = this;\r\n\t\t\t\tthis._syncInlineAudioIcon(true);\r\n\t\t\t}).catch(() => {\r\n\t\t\t\tthis._syncInlineAudioIcon(false);\r\n\t\t\t});\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._inlineAudio.pause();\r\n\t\tthis._syncInlineAudioIcon(false);\r\n\t\tif (VGFilePreview._activeAudioOwner === this) {\r\n\t\t\tVGFilePreview._activeAudioOwner = null;\r\n\t\t}\r\n\t}\r\n\r\n\t_stopInlineAudio() {\r\n\t\tif (!this._inlineAudio) {\r\n\t\t\tthis._syncInlineAudioIcon(false);\r\n\t\t\tthis._setInlineAudioProgress(0);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._inlineAudio.pause();\r\n\t\tthis._inlineAudio.currentTime = 0;\r\n\t\tthis._syncInlineAudioIcon(false);\r\n\t\tthis._setInlineAudioProgress(0);\r\n\t\tif (VGFilePreview._activeAudioOwner === this) {\r\n\t\t\tVGFilePreview._activeAudioOwner = null;\r\n\t\t}\r\n\t}\r\n\r\n\t_syncInlineAudioIcon(isPlaying) {\r\n\t\tif (!this._inlineAudioIcon) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._inlineAudioIcon.innerHTML = isPlaying ? (getSVG('pause') || '') : (getSVG('play') || '');\r\n\t}\r\n\r\n\t_syncInlineAudioProgress() {\r\n\t\tif (!this._inlineAudio) {\r\n\t\t\tthis._setInlineAudioProgress(0);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst duration = Number(this._inlineAudio.duration || 0);\r\n\t\tconst currentTime = Number(this._inlineAudio.currentTime || 0);\r\n\t\tif (!duration || !Number.isFinite(duration) || duration <= 0) {\r\n\t\t\tthis._setInlineAudioProgress(0);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst progress = Math.max(0, Math.min(100, (currentTime / duration) * 100));\r\n\t\tthis._setInlineAudioProgress(progress);\r\n\t}\r\n\r\n\t_setInlineAudioProgress(percent) {\r\n\t\tif (!this._inlineAudioContainer) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst normalized = Math.max(0, Math.min(100, Number(percent) || 0));\r\n\t\tthis._inlineAudioContainer.style.setProperty('--vg-filepreview-audio-inline-progress', `${normalized}%`);\r\n\t}\r\n\r\n\t_renderDownloadField() {\r\n\t\tconst downloadField = this._editableFields.download;\r\n\t\tif (!downloadField) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst downloadLabel = this._i18n?.button('download') || '';\r\n\t\tconst downloadIcon = getSVG('download') || '';\r\n\t\tconst fieldTag = String(downloadField.tagName || '').toUpperCase();\r\n\t\tlet control = null;\r\n\r\n\t\tif (fieldTag === 'A' || fieldTag === 'BUTTON') {\r\n\t\t\tcontrol = downloadField;\r\n\t\t} else {\r\n\t\t\tcontrol = downloadField.querySelector('[data-vg-filepreview-download-control]');\r\n\t\t\tif (!control) {\r\n\t\t\t\tcontrol = document.createElement('button');\r\n\t\t\t\tcontrol.type = 'button';\r\n\t\t\t\tdownloadField.innerHTML = '';\r\n\t\t\t\tdownloadField.appendChild(control);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tcontrol.classList.add('vg-filepreview-download-trigger');\r\n\t\tcontrol.setAttribute('data-vg-filepreview-download-control', 'true');\r\n\r\n\t\tif (fieldTag === 'A' && control === downloadField) {\r\n\t\t\tcontrol.setAttribute('href', this._fileUrl?.href || this._filePath || '#');\r\n\t\t\tif (this._fileMeta?.name) {\r\n\t\t\t\tcontrol.setAttribute('download', this._fileMeta.name);\r\n\t\t\t}\r\n\t\t} else if (String(control.tagName || '').toUpperCase() === 'BUTTON') {\r\n\t\t\tcontrol.setAttribute('type', 'button');\r\n\t\t}\r\n\r\n\t\tif (!control.hasAttribute('data-vg-filepreview-download-content-init')) {\r\n\t\t\tcontrol.setAttribute('data-vg-filepreview-download-content-init', 'true');\r\n\t\t\tcontrol.innerHTML = '';\r\n\r\n\t\t\tif (downloadIcon) {\r\n\t\t\t\tconst icon = document.createElement('span');\r\n\t\t\t\ticon.className = 'vg-filepreview-download-trigger__icon';\r\n\t\t\t\ticon.innerHTML = downloadIcon;\r\n\t\t\t\tcontrol.appendChild(icon);\r\n\t\t\t}\r\n\r\n\t\t\tif (downloadLabel) {\r\n\t\t\t\tconst text = document.createElement('span');\r\n\t\t\t\ttext.className = 'vg-filepreview-download-trigger__text';\r\n\t\t\t\ttext.textContent = downloadLabel;\r\n\t\t\t\tcontrol.appendChild(text);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!control.hasAttribute('data-vg-filepreview-download-bind')) {\r\n\t\t\tcontrol.setAttribute('data-vg-filepreview-download-bind', 'true');\r\n\t\t\tcontrol.addEventListener('click', (event) => {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tthis._downloadFile();\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t_downloadFile() {\r\n\t\tconst src = this._fileUrl?.href || this._filePath || '';\r\n\t\tif (!src) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst fileName = this._fileMeta?.originalName || this._fileMeta?.name || 'file';\r\n\r\n\t\tfetch(src, {\r\n\t\t\tmethod: 'GET',\r\n\t\t\tcredentials: 'same-origin'\r\n\t\t})\r\n\t\t\t.then((response) => {\r\n\t\t\t\tif (!response.ok) {\r\n\t\t\t\t\tthrow new Error(`HTTP ${response.status}`);\r\n\t\t\t\t}\r\n\t\t\t\treturn response.blob();\r\n\t\t\t})\r\n\t\t\t.then((blob) => {\r\n\t\t\t\tconst objectUrl = URL.createObjectURL(blob);\r\n\t\t\t\tthis._downloadByLink(objectUrl, fileName);\r\n\t\t\t\tsetTimeout(() => URL.revokeObjectURL(objectUrl), 1000);\r\n\t\t\t})\r\n\t\t\t.catch(() => {\r\n\t\t\t\tthis._downloadByLink(src, fileName);\r\n\t\t\t});\r\n\t}\r\n\r\n\t_downloadByLink(href, fileName) {\r\n\t\tconst link = document.createElement('a');\r\n\t\tlink.href = href;\r\n\t\tlink.style.display = 'none';\r\n\t\tlink.rel = 'noopener noreferrer';\r\n\t\tif (fileName) {\r\n\t\t\tlink.setAttribute('download', fileName);\r\n\t\t}\r\n\r\n\t\tdocument.body.appendChild(link);\r\n\t\tlink.click();\r\n\t\tdocument.body.removeChild(link);\r\n\t}\r\n\r\n\t_enrichAudioMetadata(nameField = null) {\r\n\t\tif (this._audioMetaApplied || this._audioMetaPromise || !this._isAudioFile()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst src = this._fileUrl?.href || this._filePath || '';\r\n\t\tif (!src) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._audioMetaPromise = this._createAudioFileFromSource(src)\r\n\t\t\t.then((file) => {\r\n\t\t\t\tif (!file) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t\treturn extractAudioMetadata(file);\r\n\t\t\t})\r\n\t\t\t.then((meta) => {\r\n\t\t\t\tif (!meta) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet changed = false;\r\n\t\t\t\tconst title = String(meta.title || '').trim();\r\n\t\t\t\tif (title) {\r\n\t\t\t\t\tthis._element.setAttribute('data-vg-filepreview-display-name', title);\r\n\r\n\t\t\t\t\tif (nameField) {\r\n\t\t\t\t\t\tnameField.textContent = title;\r\n\t\t\t\t\t\tthis._applyNameClampStyles(nameField);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst originalNameField = this._editableFields?.original_name;\r\n\t\t\t\t\tif (originalNameField) {\r\n\t\t\t\t\t\toriginalNameField.textContent = this._getFileName();\r\n\t\t\t\t\t\tthis._applyNameClampStyles(originalNameField);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tchanged = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (meta.pictureBlob instanceof Blob && this._editableFields?.icon) {\r\n\t\t\t\t\tif (this._audioCoverObjectUrl) {\r\n\t\t\t\t\t\tURL.revokeObjectURL(this._audioCoverObjectUrl);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis._audioCoverObjectUrl = URL.createObjectURL(meta.pictureBlob);\r\n\r\n\t\t\t\t\tconst iconField = this._editableFields.icon;\r\n\t\t\t\t\ticonField.innerHTML = '';\r\n\r\n\t\t\t\t\tconst image = document.createElement('img');\r\n\t\t\t\t\timage.src = this._audioCoverObjectUrl;\r\n\t\t\t\t\timage.alt = title || this._fileMeta?.originalName || this._fileMeta?.name || '';\r\n\t\t\t\t\timage.className = 'vg-filepreview-icon-image';\r\n\t\t\t\t\timage.loading = 'lazy';\r\n\t\t\t\t\timage.addEventListener('error', () => {\r\n\t\t\t\t\t\tthis._renderDefaultIcon(iconField);\r\n\t\t\t\t\t});\r\n\t\t\t\t\tthis._bindIconImageToModal(image, this._audioCoverObjectUrl, title);\r\n\t\t\t\t\ticonField.appendChild(image);\r\n\r\n\t\t\t\t\tchanged = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis._audioMetaApplied = true;\r\n\t\t\t\treturn changed;\r\n\t\t\t})\r\n\t\t\t.catch(() => false)\r\n\t\t\t.finally(() => {\r\n\t\t\t\tthis._audioMetaPromise = null;\r\n\t\t\t});\r\n\t}\r\n\r\n\t_enrichVideoMetadata() {\r\n\t\tif (!this._isPreviewGroupEnabled('video')) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (this._videoMetaApplied || this._videoMetaPromise || !this._isVideoFile()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst src = this._fileUrl?.href || this._filePath || '';\r\n\t\tif (!src) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._videoMetaPromise = this._createMediaFileFromSource(src, this._fileMeta?.originalName || this._fileMeta?.name || 'video.mp4', 'video/mp4')\r\n\t\t\t.then((file) => {\r\n\t\t\t\tif (!file) {\r\n\t\t\t\t\treturn null;\r\n\t\t\t\t}\r\n\t\t\t\treturn extractVideoMetadata(file);\r\n\t\t\t})\r\n\t\t\t.then((meta) => {\r\n\t\t\t\tif (!meta || !(meta.posterBlob instanceof Blob) || !this._editableFields?.icon) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (this._videoCoverObjectUrl) {\r\n\t\t\t\t\tURL.revokeObjectURL(this._videoCoverObjectUrl);\r\n\t\t\t\t}\r\n\t\t\t\tthis._videoCoverObjectUrl = URL.createObjectURL(meta.posterBlob);\r\n\r\n\t\t\t\tconst iconField = this._editableFields.icon;\r\n\t\t\t\ticonField.innerHTML = '';\r\n\r\n\t\t\t\tconst image = document.createElement('img');\r\n\t\t\t\timage.src = this._videoCoverObjectUrl;\r\n\t\t\t\timage.alt = this._fileMeta?.originalName || this._fileMeta?.name || '';\r\n\t\t\t\timage.className = 'vg-filepreview-icon-image';\r\n\t\t\t\timage.loading = 'lazy';\r\n\t\t\t\timage.addEventListener('error', () => {\r\n\t\t\t\t\tthis._renderDefaultIcon(iconField);\r\n\t\t\t\t});\r\n\t\t\t\tif (this._isPreviewGroupEnabled('video')) {\r\n\t\t\t\t\tthis._bindIconImageToModal(image, this._videoCoverObjectUrl, image.alt);\r\n\t\t\t\t}\r\n\t\t\t\ticonField.appendChild(image);\r\n\r\n\t\t\t\tthis._videoMetaApplied = true;\r\n\t\t\t\treturn true;\r\n\t\t\t})\r\n\t\t\t.catch(() => false)\r\n\t\t\t.finally(() => {\r\n\t\t\t\tthis._videoMetaPromise = null;\r\n\t\t\t});\r\n\t}\r\n\r\n\tasync _createAudioFileFromSource(src = '') {\r\n\t\tconst name = this._fileMeta?.originalName || this._fileMeta?.name || 'audio.mp3';\r\n\t\treturn this._createMediaFileFromSource(src, name, 'audio/mpeg');\r\n\t}\r\n\r\n\tasync _createMediaFileFromSource(src = '', name = 'file', defaultType = 'application/octet-stream') {\r\n\t\ttry {\r\n\t\t\tconst response = await fetch(src, {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\tcredentials: 'same-origin'\r\n\t\t\t});\r\n\t\t\tif (!response.ok) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\r\n\t\t\tconst blob = await response.blob();\r\n\t\t\tif (!blob || !blob.size) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\r\n\t\t\treturn new File([blob], name, {\r\n\t\t\t\ttype: blob.type || defaultType,\r\n\t\t\t\tlastModified: Date.now()\r\n\t\t\t});\r\n\t\t} catch {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n\r\n\t_bindIconImageToModal(imageNode, src = '', title = '') {\r\n\t\tif (!imageNode) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst modalSrc = String(src || '').trim();\r\n\t\tif (!modalSrc) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst modalTitle = String(title || this._fileMeta?.originalName || this._fileMeta?.name || '').trim();\r\n\t\timageNode.setAttribute('data-vg-filepreview-image-modal-src', modalSrc);\r\n\t\timageNode.setAttribute('data-vg-filepreview-image-modal-title', modalTitle);\r\n\t\timageNode.classList.add('is-preview-action');\r\n\r\n\t\tif (imageNode.hasAttribute('data-vg-filepreview-image-modal-bind')) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\timageNode.setAttribute('data-vg-filepreview-image-modal-bind', 'true');\r\n\t\timageNode.addEventListener('click', (event) => {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tevent.stopPropagation();\r\n\r\n\t\t\tconst nodeSrc = String(imageNode.getAttribute('data-vg-filepreview-image-modal-src') || '').trim();\r\n\t\t\tif (!nodeSrc) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst nodeTitle = String(imageNode.getAttribute('data-vg-filepreview-image-modal-title') || '').trim();\r\n\t\t\tif (!this._imageModal) {\r\n\t\t\t\tthis._imageModal = ImageModal.getInstance();\r\n\t\t\t}\r\n\r\n\t\t\tthis._imageModal.open({\r\n\t\t\t\tsrc: nodeSrc,\r\n\t\t\t\ttitle: nodeTitle,\r\n\t\t\t\tdefaultTitle: this._i18n?.message('image_title') || ''\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\t_renderPreview() {\r\n\t\tconst isNameOnly = Boolean(this._params?.ui?.nameOnly) || !this._shouldRenderPreviewForCurrentFile();\r\n\t\tconst previewContainer = this._resolvePreviewContainer({\r\n\t\t\tautoCreate: !isNameOnly\r\n\t\t});\r\n\t\tif (!previewContainer && !isNameOnly) {\r\n\t\t\tthis._setState('error');\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (previewContainer) {\r\n\t\t\tpreviewContainer.innerHTML = '';\r\n\t\t}\r\n\r\n\t\tconst context = {\r\n\t\t\telement: this._element,\r\n\t\t\tfilePath: this._filePath,\r\n\t\t\tfileUrl: this._fileUrl,\r\n\t\t\tfileMeta: this._fileMeta,\r\n\t\t\tpreviewContainer,\r\n\t\t\tlang: this._lang,\r\n\t\t\ti18n: this._i18n,\r\n\t\t\tui: this._params?.ui || {}\r\n\t\t};\r\n\r\n\t\tlet rendered = false;\r\n\t\tthis._renderers.forEach((renderer) => {\r\n\t\t\tif (rendered || typeof renderer?.canRender !== 'function' || typeof renderer?.render !== 'function') {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (!this._isRendererEnabled(renderer?.name)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (!renderer.canRender(context)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\ttry {\r\n\t\t\t\trendered = renderer.render(context) === true;\r\n\t\t\t} catch (error) {\r\n\t\t\t\trendered = false;\r\n\t\t\t}\r\n\t\t\tif (rendered) {\r\n\t\t\t\tthis._element.setAttribute('data-vg-filepreview-renderer', renderer.name || 'custom');\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tif (!rendered && !isNameOnly) {\r\n\t\t\tthis._element.removeAttribute('data-vg-filepreview-renderer');\r\n\t\t\tthis._setState('empty');\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._setState('ready');\r\n\t}\r\n\r\n\t_resolvePreviewContainer(params = {}) {\r\n\t\tconst autoCreate = !Object.prototype.hasOwnProperty.call(params, 'autoCreate') || Boolean(params.autoCreate);\r\n\t\tif (!autoCreate) {\r\n\t\t\tconst disabledPreview = this._editableFields.preview || this._element.querySelector('[data-vg-filepreview-slot=\"preview\"]');\r\n\t\t\tif (disabledPreview) {\r\n\t\t\t\tdisabledPreview.innerHTML = '';\r\n\t\t\t\tdisabledPreview.classList.remove('preview');\r\n\t\t\t\tdisabledPreview.setAttribute('hidden', 'hidden');\r\n\t\t\t\tdisabledPreview.setAttribute('aria-hidden', 'true');\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst editablePreview = this._editableFields.preview;\r\n\t\tif (editablePreview) {\r\n\t\t\teditablePreview.classList.add('preview');\r\n\t\t\teditablePreview.removeAttribute('hidden');\r\n\t\t\teditablePreview.removeAttribute('aria-hidden');\r\n\t\t\teditablePreview.setAttribute('data-vg-filepreview-slot', 'preview');\r\n\t\t\treturn editablePreview;\r\n\t\t}\r\n\r\n\t\tconst existedPreview = this._element.querySelector('[data-vg-filepreview-slot=\"preview\"]');\r\n\t\tif (existedPreview) {\r\n\t\t\texistedPreview.classList.add('preview');\r\n\t\t\texistedPreview.removeAttribute('hidden');\r\n\t\t\texistedPreview.removeAttribute('aria-hidden');\r\n\t\t\tthis._editableFields.preview = existedPreview;\r\n\t\t\treturn existedPreview;\r\n\t\t}\r\n\r\n\t\tconst container = document.createElement('div');\r\n\t\tcontainer.className = 'preview';\r\n\t\tcontainer.setAttribute('data-vg-filepreview-slot', 'preview');\r\n\t\tthis._element.appendChild(container);\r\n\t\tthis._editableFields.preview = container;\r\n\r\n\t\treturn container;\r\n\t}\r\n\r\n\t_shouldRenderPreviewForCurrentFile() {\r\n\t\tif (this._isAudioFile()) {\r\n\t\t\treturn this._isPreviewGroupEnabled('audio');\r\n\t\t}\r\n\r\n\t\tconst ext = String(this._fileMeta?.ext || '').toLowerCase();\r\n\t\tif (ext === '.pdf') {\r\n\t\t\treturn this._isPreviewGroupEnabled('pdf');\r\n\t\t}\r\n\r\n\t\tif (this._isVideoFile()) {\r\n\t\t\treturn this._isPreviewGroupEnabled('video');\r\n\t\t}\r\n\r\n\t\tif (this._isImageFile()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (this._isOfficeFile()) {\r\n\t\t\treturn this._isPreviewGroupEnabled('office');\r\n\t\t}\r\n\r\n\t\tif (this._isArchiveFile()) {\r\n\t\t\treturn this._isPreviewGroupEnabled('archive');\r\n\t\t}\r\n\r\n\t\tif (this._isTextFile()) {\r\n\t\t\treturn this._isPreviewGroupEnabled('text');\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\t_isRendererEnabled(rendererName = '') {\r\n\t\tconst name = String(rendererName || '').trim();\r\n\t\tconst map = {\r\n\t\t\timage: 'image',\r\n\t\t\tvideo: 'video',\r\n\t\t\tpdf: 'pdf',\r\n\t\t\toffice: 'office',\r\n\t\t\tzip: 'archive',\r\n\t\t\ttext: 'text'\r\n\t\t};\r\n\t\tconst group = map[name];\r\n\t\tif (!group) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn this._isPreviewGroupEnabled(group);\r\n\t}\r\n\r\n\t_isPreviewGroupEnabled(groupName = '') {\r\n\t\tconst group = String(groupName || '').trim();\r\n\t\tif (!group) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst preview = this._params?.preview;\r\n\t\tif (!preview || typeof preview !== 'object' || Array.isArray(preview)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!Object.prototype.hasOwnProperty.call(preview, group)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst config = preview[group];\r\n\t\tif (typeof config === 'boolean') {\r\n\t\t\treturn config;\r\n\t\t}\r\n\r\n\t\tif (!config || typeof config !== 'object' || Array.isArray(config)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!Object.prototype.hasOwnProperty.call(config, 'enable')) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn Boolean(config.enable);\r\n\t}\r\n\r\n\t_getImageIconSrc() {\r\n\t\tconst ext = String(this._fileMeta?.ext || '').toLowerCase();\r\n\t\tconst imageExts = ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.bmp', '.svg', '.avif', '.ico'];\r\n\t\tif (!imageExts.includes(ext)) {\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\treturn this._fileUrl?.href || this._filePath || '';\r\n\t}\r\n\r\n\t_isImageFile() {\r\n\t\tconst ext = String(this._fileMeta?.ext || '').toLowerCase();\r\n\t\treturn ['.jpg', '.jpeg', '.png', '.gif', '.webp', '.bmp', '.svg', '.avif', '.ico', '.tif', '.tiff', '.heic', '.heif'].includes(ext);\r\n\t}\r\n\r\n\t_isOfficeFile() {\r\n\t\tconst ext = String(this._fileMeta?.ext || '').toLowerCase();\r\n\t\treturn ['.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx', '.odt', '.ods', '.odp'].includes(ext);\r\n\t}\r\n\r\n\t_isArchiveFile() {\r\n\t\tconst ext = String(this._fileMeta?.ext || '').toLowerCase();\r\n\t\treturn ['.zip'].includes(ext);\r\n\t}\r\n\r\n\t_isTextFile() {\r\n\t\tconst ext = String(this._fileMeta?.ext || '').toLowerCase();\r\n\t\treturn ['.txt', '.md', '.csv', '.json', '.xml', '.yml', '.yaml', '.log', '.ini', '.conf', '.env'].includes(ext);\r\n\t}\r\n\r\n\t_renderDefaultIcon(iconField) {\r\n\t\tconst icon = getSVG(this._filePath);\r\n\t\tif (!icon) {\r\n\t\t\ticonField.innerHTML = '';\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\ticonField.innerHTML = icon;\r\n\t}\r\n\r\n\t_applyNameClampStyles(field) {\r\n\t\tif (!field || !field.style) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfield.style.minWidth = '60px';\r\n\t\tfield.style.maxWidth = '100%';\r\n\t\tfield.style.overflow = 'hidden';\r\n\t\tfield.style.textOverflow = 'ellipsis';\r\n\t\tfield.style.whiteSpace = 'nowrap';\r\n\t}\r\n\r\n\tstatic init(element, params = {}) {\r\n\t\treturn VGFilePreview.getOrCreateInstance(element, params);\r\n\t}\r\n\r\n\tstatic stopActiveInlineAudio() {\r\n\t\tconst owner = VGFilePreview._activeAudioOwner;\r\n\t\tif (owner && typeof owner._stopInlineAudio === 'function') {\r\n\t\t\towner._stopInlineAudio();\r\n\t\t}\r\n\r\n\t\tVGFilePreview._activeAudioOwner = null;\r\n\t}\r\n\r\n\tstatic stopActiveInlineAudioIfDetached(nodes = []) {\r\n\t\tconst owner = VGFilePreview._activeAudioOwner;\r\n\t\tif (!owner || !owner._element || !Array.isArray(nodes) || !nodes.length) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst shouldStop = nodes.some((node) => {\r\n\t\t\tif (!node || typeof node.contains !== 'function') {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\treturn node === owner._element || node.contains(owner._element);\r\n\t\t});\r\n\r\n\t\tif (shouldStop) {\r\n\t\t\towner._stopInlineAudio();\r\n\t\t\tVGFilePreview._activeAudioOwner = null;\r\n\t\t}\r\n\t}\r\n\r\n\t_setState(state = '') {\r\n\t\tconst value = String(state || '').trim();\r\n\t\tif (!value) {\r\n\t\t\tthis._element.removeAttribute('data-vg-filepreview-state');\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._element.setAttribute('data-vg-filepreview-state', value);\r\n\t}\r\n\r\n\t_isAudioFile() {\r\n\t\tconst ext = String(this._fileMeta?.ext || '').toLowerCase();\r\n\t\treturn ['.mp3', '.wav', '.ogg', '.flac', '.aac', '.m4a', '.opus', '.wma'].includes(ext);\r\n\t}\r\n\r\n\t_isVideoFile() {\r\n\t\tconst ext = String(this._fileMeta?.ext || '').toLowerCase();\r\n\t\treturn ['.mp4', '.webm', '.mov', '.mkv', '.avi', '.m4v', '.ogv'].includes(ext);\r\n\t}\r\n\r\n\t_getFileName() {\r\n\t\treturn String(this._fileMeta?.originalName || this._fileMeta?.name || '').trim();\r\n\t}\r\n\r\n\t_getDataDisplayName() {\r\n\t\tconst dataName = String(this._element?.getAttribute('data-name') || '').trim();\r\n\t\tif (dataName) {\r\n\t\t\treturn dataName;\r\n\t\t}\r\n\r\n\t\treturn String(this._element?.getAttribute('data-vg-filepreview-display-name') || '').trim();\r\n\t}\r\n\r\n\t_hasDataDrivenDisplayName() {\r\n\t\tconst dataName = this._getDataDisplayName();\r\n\t\tif (!dataName) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst fileName = this._getFileName();\r\n\t\tif (!fileName) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn dataName !== fileName;\r\n\t}\r\n\r\n\t_getDisplayName() {\r\n\t\tconst dataName = this._getDataDisplayName();\r\n\t\tif (dataName) {\r\n\t\t\treturn dataName;\r\n\t\t}\r\n\r\n\t\treturn this._getFileName();\r\n\t}\r\n}\r\n\r\nexport default VGFilePreview;\r\n","import ImageFilePreviewRenderer from \"./image\";\r\nimport OfficeFilePreviewRenderer from \"./office\";\r\nimport PdfFilePreviewRenderer from \"./pdf\";\r\nimport TextFilePreviewRenderer from \"./text\";\r\nimport VideoFilePreviewRenderer from \"./video\";\r\nimport ZipFilePreviewRenderer from \"./zip\";\r\n\r\nconst createFilePreviewRenderers = () => {\r\n\treturn [\r\n\t\tnew ImageFilePreviewRenderer(),\r\n\t\tnew VideoFilePreviewRenderer(),\r\n\t\tnew PdfFilePreviewRenderer(),\r\n\t\tnew OfficeFilePreviewRenderer(),\r\n\t\tnew ZipFilePreviewRenderer(),\r\n\t\tnew TextFilePreviewRenderer()\r\n\t];\r\n};\r\n\r\nexport default createFilePreviewRenderers;\r\n","import VGFilePreview from \"./js/vgfilepreview\";\r\n\r\nexport default VGFilePreview;","import BaseModule from \"../../base-module\";\r\nimport {mergeDeepObject} from \"../../../utils/js/functions\";\r\nimport Html from \"../../../utils/js/components/templater\";\r\nimport {lang_messages} from \"../../../utils/js/components/lang\";\r\nimport {Classes, Manipulator} from \"../../../utils/js/dom/manipulator\";\r\nimport Selectors from \"../../../utils/js/dom/selectors\";\r\nimport {getSVG} from \"../../module-fn\";\r\nimport VGFilePreview from \"../../vgfilepreview\";\r\nimport {extractAudioMetadata} from \"../../../utils/js/components/audio-metadata\";\r\n\r\nclass VGFilesBase extends BaseModule {\r\n\tconstructor(element, params = {}, defaults = {}) {\r\n\t\tsuper(element, params);\r\n\r\n\t\tthis._params = this._getParams(element, mergeDeepObject(defaults, params));\r\n\t\tthis._params.init = ('init' in params) && params.init || this._params.init;\r\n\r\n\t\tif (!this._params.init) {\r\n\t\t\tthis._isInitialized = false;\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._isInitialized = true;\r\n\r\n\t\tthis._tpl = Html('dom');\r\n\t\tthis._files = [];\r\n\t\tthis._errors = new Set();\r\n\t\tthis._fileObjectUrls = new Map();\r\n\t\tthis._audioMetaPromises = new Map();\r\n\r\n\t\tthis._nodes = {\r\n\t\t\tstat: Selectors.find(`.${this._getClass('stat')}`, this._element),\r\n\t\t\tinfo: Selectors.find(`.${this._getClass('info')}`, this._element),\r\n\t\t\tdrop: Selectors.find(`.${this._getClass('drop')}`, this._element),\r\n\t\t};\r\n\r\n\t\tthis.template = '<li data-file=\"\" class=\"file\"><div class=\"file-image\"></div><div class=\"file-info\"></div><div class=\"file-remove\"></div></li>';\r\n\t\tthis._onNativeInputChange = (e) => this.change(e?.target);\r\n\r\n\t\tthis._init();\r\n\t}\r\n\r\n\t_getClass(name) {\r\n\t\tconst map = {\r\n\t\t\t'stat': 'vg-files-stat',\r\n\t\t\t'stat-progress': 'vg-files-stat-progress',\r\n\t\t\t'info': 'vg-files-info',\r\n\t\t\t'info-list': 'vg-files-info--list',\r\n\t\t\t'drop': 'vg-files-drop',\r\n\t\t\t'drop-list': 'vg-files-drop--list',\r\n\t\t\t'drop-message': 'vg-files-drop-message',\r\n\t\t\t'errors': 'vg-files-errors'\r\n\t\t};\r\n\t\treturn map[name] || '';\r\n\t}\r\n\r\n\t_applyRenameToIncomingFiles(files) {\r\n\t\tconst rename = this._params?.rename;\r\n\r\n\t\tif (!rename) return files;\r\n\t\tif (!Array.isArray(files) || !files.length) return files;\r\n\r\n\t\treturn files.map((file, index) => {\r\n\t\t\tif (!file) return file;\r\n\r\n\t\t\tlet newName = null;\r\n\r\n\t\t\tif (typeof rename === 'function') {\r\n\t\t\t\tnewName = rename(file, index);\r\n\t\t\t} else if (rename === true) {\r\n\t\t\t\tnewName = this._generateRenamedFileName(file?.name || 'file', index);\r\n\t\t\t}\r\n\r\n\t\t\tif (!newName || typeof newName !== 'string' || newName.trim() === '') return file;\r\n\t\t\tif (file.name === newName) return file;\r\n\r\n\t\t\ttry {\r\n\t\t\t\tconst renamed = new File([file], newName, {\r\n\t\t\t\t\ttype: file.type || \"application/octet-stream\",\r\n\t\t\t\t\tlastModified: file.lastModified || Date.now()\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// переносим «кастомные» поля, которые используются в проекте\r\n\t\t\t\t['id', 'src', 'image'].forEach((prop) => {\r\n\t\t\t\t\tif (file[prop] !== undefined) {\r\n\t\t\t\t\t\tObject.defineProperty(renamed, prop, {\r\n\t\t\t\t\t\t\tvalue: file[prop],\r\n\t\t\t\t\t\t\twritable: true,\r\n\t\t\t\t\t\t\tenumerable: true\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\treturn renamed;\r\n\t\t\t} catch (e) {\r\n\t\t\t\t// если браузер/окружение не позволило создать File — оставляем как есть\r\n\t\t\t\treturn file;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t_generateRenamedFileName(originalName, index) {\r\n\t\tconst safeOriginal = String(originalName || 'file');\r\n\r\n\t\tconst dotIndex = safeOriginal.lastIndexOf('.');\r\n\t\tconst hasExt = dotIndex > 0 && dotIndex < safeOriginal.length - 1;\r\n\r\n\t\tconst base = hasExt ? safeOriginal.slice(0, dotIndex) : safeOriginal;\r\n\t\tconst ext = hasExt ? safeOriginal.slice(dotIndex + 1) : '';\r\n\r\n\t\tconst stamp = Date.now();\r\n\t\tconst seq = index + 1;\r\n\r\n\t\tconst normalizedBase = base.trim() || 'file';\r\n\t\treturn ext ? `${normalizedBase}_${stamp}_${seq}.${ext}` : `${normalizedBase}_${stamp}_${seq}`;\r\n\t}\r\n\r\n\t_init() {\r\n\t\tif (!this._isInitialized) return;\r\n\r\n\t\tconst isSingle = Number(this._params?.limits?.count) === 1;\r\n\r\n\t\tif (isSingle) {\r\n\t\t\tthis._preventOriginalInputFromSubmit(true);\r\n\t\t\tthis._cleanupFakeInputs();\r\n\t\t} else {\r\n\t\t\tthis._preventOriginalInputFromSubmit();\r\n\t\t}\r\n\r\n\t\tthis._addEventListener();\r\n\t}\r\n\r\n\tchange(input = null) {\r\n\t\tconst incomingFiles = input?.files;\r\n\t\tif (!incomingFiles?.length) return;\r\n\r\n\t\tconst filesArray = this._applyRenameToIncomingFiles(Array.from(incomingFiles));\r\n\r\n\t\tconst isSingle = Number(this._params?.limits?.count) === 1;\r\n\t\tconst shouldReplaceOnSingle =\r\n\t\t\tBoolean(this._params?.replace) &&\r\n\t\t\tisSingle;\r\n\r\n\t\tif (shouldReplaceOnSingle) {\r\n\t\t\tthis.clear(false);\r\n\t\t\tthis.append(filesArray, true);\r\n\t\t\tthis._revokeUrls();\r\n\t\t\tthis._cleanupFakeInputs();\r\n\t\t\tthis._cleanupErrors();\r\n\r\n\t\t\tthis._files = this._filterFiles(filesArray);\r\n\t\t\tif (this._params.prepend) this._files.reverse();\r\n\r\n\t\t\tthis.build();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!this._params.allowed) {\r\n\t\t\tthis.append(filesArray, false);\r\n\t\t\tthis.build();\r\n\t\t} else {\r\n\t\t\tthis.clear();\r\n\t\t\tthis.append(filesArray, true);\r\n\t\t\tthis.build();\r\n\t\t}\r\n\t}\r\n\r\n\tbuild() {\r\n\t\tthis._updateStat();\r\n\r\n\t\tif (this._params.ajax) {\r\n\t\t\tif (this._render.init()) {\r\n\t\t\t\tthis._render.init()\r\n\t\t\t} else {\r\n\t\t\t\tthis._renderUI(this._files);\r\n\t\t\t}\r\n\t\t\tthis._renderUI(this._files);\r\n\t\t} else {\r\n\t\t\tthis._renderUI(this._files);\r\n\r\n\t\t\tconst isSingle = Number(this._params?.limits?.count) === 1;\r\n\t\t\tif (!isSingle) {\r\n\t\t\t\tthis._generateHiddenInputs(this._files);\r\n\t\t\t} else {\r\n\t\t\t\tthis._cleanupFakeInputs();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tappend(values, replace = true) {\r\n\t\tconst incoming = this._applyRenameToIncomingFiles(Array.from(values));\r\n\t\tlet filesToProcess;\r\n\r\n\t\tif (replace) {\r\n\t\t\tfilesToProcess = incoming;\r\n\t\t} else {\r\n\t\t\tfilesToProcess = this._mergeFilesByOrder(incoming, this._files, Boolean(this._params.prepend));\r\n\t\t}\r\n\r\n\t\tthis._files = this._filterFiles(filesToProcess);\r\n\r\n\t\tthis._renderErrors();\r\n\t\tthis._enrichAudioMetadata(this._files);\r\n\r\n\t\treturn this._files;\r\n\t}\r\n\r\n\t_mergeFilesByOrder(incoming = [], existing = [], prepend = false) {\r\n\t\tconst ordered = prepend\r\n\t\t\t? [...incoming, ...existing]\r\n\t\t\t: [...existing, ...incoming];\r\n\r\n\t\tconst seen = new Set();\r\n\t\tconst result = [];\r\n\r\n\t\tordered.forEach((file) => {\r\n\t\t\tconst key = this._getFileKey(file);\r\n\t\t\tif (seen.has(key)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tseen.add(key);\r\n\t\t\tresult.push(file);\r\n\t\t});\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t_getFileKey(file) {\r\n\t\treturn `${file.name}-${file.size}-${file.type}`;\r\n\t}\r\n\r\n\t_getFileCustomData(file) {\r\n\t\tconst customData = file?.customData;\r\n\t\tif (!customData || typeof customData !== 'object' || Array.isArray(customData)) return {};\r\n\t\treturn customData;\r\n\t}\r\n\r\n\t_toDataAttributeKey(key) {\r\n\t\tif (!key) return '';\r\n\r\n\t\treturn String(key)\r\n\t\t\t.replace(/([a-z0-9])([A-Z])/g, '$1-$2')\r\n\t\t\t.replace(/[_\\s]+/g, '-')\r\n\t\t\t.replace(/[^a-zA-Z0-9-]/g, '')\r\n\t\t\t.replace(/-+/g, '-')\r\n\t\t\t.replace(/^-|-$/g, '')\r\n\t\t\t.toLowerCase();\r\n\t}\r\n\r\n\t_toDataAttributeValue(value) {\r\n\t\tif (value === undefined || value === null || value === '') return null;\r\n\t\tif (typeof value === 'object') {\r\n\t\t\ttry {\r\n\t\t\t\treturn JSON.stringify(value);\r\n\t\t\t} catch (e) {\r\n\t\t\t\treturn String(value);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn value;\r\n\t}\r\n\r\n\t_buildFileDataAttributes(file, baseAttrs = {}) {\r\n\t\tconst attrs = { ...baseAttrs };\r\n\t\tconst customData = this._getFileCustomData(file);\r\n\r\n\t\tObject.entries(customData).forEach(([key, value]) => {\r\n\t\t\tconst attrKey = this._toDataAttributeKey(key);\r\n\t\t\tif (!attrKey) return;\r\n\r\n\t\t\tconst attrName = `data-${attrKey}`;\r\n\t\t\tif (Object.prototype.hasOwnProperty.call(attrs, attrName)) return;\r\n\r\n\t\t\tconst attrValue = this._toDataAttributeValue(value);\r\n\t\t\tif (attrValue === null) return;\r\n\r\n\t\t\tattrs[attrName] = attrValue;\r\n\t\t});\r\n\r\n\t\treturn attrs;\r\n\t}\r\n\r\n\t_filterFiles(files) {\r\n\t\tthis._errors.clear();\r\n\t\tconst { count, sizes, total } = this._params.limits;\r\n\t\tconst maxSize = sizes * 1024 * 1024;\r\n\t\tconst maxTotalSize = total * 1024 * 1024;\r\n\r\n\t\tlet currentTotalSize = 0;\r\n\t\tconst filtered = [];\r\n\r\n\t\tfor (const file of files) {\r\n\t\t\tif (count > 0 && filtered.length >= count) {\r\n\t\t\t\tthis._errors.add('is-count');\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tlet isValid = true;\r\n\r\n\t\t\tif (this._params.types.length && !this._params.types.includes(file.type)) {\r\n\t\t\t\tthis._errors.add('is-types');\r\n\t\t\t\tisValid = false;\r\n\t\t\t}\r\n\r\n\t\t\tif (file.size > maxSize) {\r\n\t\t\t\tthis._errors.add('is-sizes');\r\n\t\t\t\tisValid = false;\r\n\t\t\t}\r\n\r\n\t\t\tif (isValid && maxTotalSize > 0) {\r\n\t\t\t\tif (currentTotalSize + file.size > maxTotalSize) {\r\n\t\t\t\t\tthis._errors.add('is-total-size');\r\n\t\t\t\t\tisValid = false;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tcurrentTotalSize += file.size;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (isValid) filtered.push(file);\r\n\t\t}\r\n\r\n\t\treturn filtered;\r\n\t}\r\n\r\n\t_getSizes(size, isArray = false) {\r\n\t\tconst totalSize = isArray ? this._files.reduce((acc, f) => acc + f.size, 0) : size;\r\n\t\tconst units = ['byte', 'kilobyte', 'megabyte', 'gigabyte'];\r\n\t\tconst index = totalSize > 0 ? Math.min(Math.floor(Math.log(totalSize) / Math.log(1024)), units.length - 1) : 0;\r\n\t\tconst value = totalSize / Math.pow(1024, index);\r\n\r\n\t\treturn new Intl.NumberFormat(this._params.lang, {\r\n\t\t\tstyle: 'unit',\r\n\t\t\tunit: units[index],\r\n\t\t\tunitDisplay: 'short',\r\n\t\t\tmaximumFractionDigits: 2\r\n\t\t}).format(value);\r\n\t}\r\n\r\n\t_cleanupErrors() {\r\n\t\tthis._errors.clear();\r\n\t\tconst $errorCont = Selectors.find(`.${this._getClass('errors')}`, this._element);\r\n\t\tif ($errorCont) {\r\n\t\t\t$errorCont.remove()\r\n\t\t}\r\n\t}\r\n\r\n\t_renderErrors() {\r\n\t\tif (!this._errors.size) return;\r\n\r\n\t\tconst messages = lang_messages(this._params.lang, 'files') || this._getFallbackErrors();\r\n\t\tlet $errorCont = Selectors.find(`.${this._getClass('errors')}`, this._element);\r\n\r\n\t\tif (!$errorCont) {\r\n\t\t\t$errorCont = this._tpl.div({ class: this._getClass('errors') });\r\n\t\t\tthis._element.prepend($errorCont);\r\n\t\t} else {\r\n\t\t\t$errorCont.innerHTML = '';\r\n\t\t}\r\n\r\n\t\tthis._errors.forEach(errKey => {\r\n\t\t\tconst msg = messages[errKey] || errKey;\r\n\t\t\t$errorCont.append(this._tpl.span({ class: 'error-item' }, msg));\r\n\t\t});\r\n\t}\r\n\r\n\t_getFallbackErrors() {\r\n\t\tconst { count, sizes, total } = this._params.limits;\r\n\t\treturn {\r\n\t\t\t'is-count': `Limit: ${count}`,\r\n\t\t\t'is-sizes': `Max size: ${sizes}MB`,\r\n\t\t\t'is-total-size': `Total max size: ${total}MB`,\r\n\t\t\t'is-types': `Allowed: ${this._params.types.join(', ')}`\r\n\t\t};\r\n\t}\r\n\r\n\t_renderUI(files) {\r\n\t\tif (this._nodes.drop) {\r\n\t\t\tthis._renderUIDropList(files);\r\n\t\t} else if (this._nodes.info) {\r\n\t\t\tthis._renderInfoList(files);\r\n\t\t}\r\n\r\n\t\tthis._renderUIStatusDropInfoAjax(this._files)\r\n\t}\r\n\r\n\t_parseTemplate() {\r\n\t\tconst render = this._render;\r\n\t\tconst fallbackTemplate = '<li data-file=\"\" class=\"file\"><div class=\"file-image\"></div><div class=\"file-custom\"><div class=\"file-info\"></div><div class=\"file-remove\"></div></div></li>';\r\n\t\tlet tmpl = this.template || fallbackTemplate;\r\n\r\n\t\tif (render) {\r\n\t\t\tif (render.bufferTemplate) tmpl = render.bufferTemplate;\r\n\t\t}\r\n\r\n\t\tconst temp = document.createElement('div');\r\n\t\ttemp.innerHTML = tmpl;\r\n\t\tlet liElement = temp.firstElementChild;\r\n\r\n\t\tif (!liElement) {\r\n\t\t\ttemp.innerHTML = fallbackTemplate;\r\n\t\t\tliElement = temp.firstElementChild;\r\n\t\t}\r\n\t\tconst liClasses = liElement.className || '';\r\n\t\tconst liClassList = liClasses ? liClasses.split(' ').filter(cls => cls.trim() !== '') : [];\r\n\r\n\t\tconst childCount = liElement.childElementCount;\r\n\r\n\t\tconst children = [];\r\n\t\tfor (let i = 0; i < childCount; i++) {\r\n\t\t\tchildren.push({\r\n\t\t\t\tindex: i,\r\n\t\t\t\telement: liElement.children[i],\r\n\t\t\t\tclassName: liElement.children[i].className\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tchildren: children,\r\n\t\t\ttemplate: tmpl,\r\n\t\t\tliClasses: liClassList,\r\n\t\t\tliClassName: liClasses\r\n\t\t};\r\n\t}\r\n\r\n\t_renderUIDropList(files) {\r\n\t\tif (!this._nodes.drop) return;\r\n\r\n\t\tlet $list = Selectors.find(`.${this._getClass('drop-list')}`, this._nodes.drop);\r\n\t\tif (!$list) {\r\n\t\t\t$list = this._tpl.ul([], { class: this._getClass('drop-list') });\r\n\t\t}\r\n\r\n\t\tconst $itemsTemplate = this._parseTemplate().children;\r\n\t\tconst $itemsTemplateClasses = this._parseTemplate().liClasses.filter(cls => cls !== 'file');\r\n\t\tconst fragment = document.createDocumentFragment();\r\n\r\n\t\tfiles.forEach((file) => {\r\n\t\t\tlet classes = $itemsTemplateClasses;\r\n\r\n\t\t\tif (this._params.detach) classes.push('with-remove')\r\n\t\t\tif (this._params.sortable.enabled) classes.push('with-sortable')\r\n\t\t\tif (this._params.limits.count === 1) {\r\n\t\t\t\tclasses.push('single');\r\n\r\n\t\t\t\tif (file.type.startsWith('image/')) {\r\n\t\t\t\t\tclasses.push('single-image')\r\n\t\t\t\t} else {\r\n\t\t\t\t\tclasses.push('single-file')\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tlet parts = [];\r\n\t\t\t$itemsTemplate.forEach(tmpl => {\r\n\t\t\t\tconst part = this._renderTemplatePart(tmpl.element, file, null, { isDrop: true });\r\n\t\t\t\tif (part) parts.push(part);\r\n\t\t\t});\r\n\r\n\t\t\tconst $li = this._tpl.li(\r\n\t\t\t\tthis._buildFileDataAttributes(file, {\r\n\t\t\t\t\t'data-name': file.name,\r\n\t\t\t\t\t'data-size': file.size ?? 0,\r\n\t\t\t\t\t'data-id': file.id || '',\r\n\t\t\t\t\tclass: 'file ' + classes.join(' ')\r\n\t\t\t\t}),\r\n\t\t\t\tparts\r\n\t\t\t);\r\n\r\n\t\t\tfragment.appendChild($li);\r\n\t\t});\r\n\r\n\t\t$list.innerHTML = '';\r\n\t\t$list.appendChild(fragment);\r\n\r\n\t\tconst $message = Selectors.find(`.${this._getClass('drop-message')}`, this._nodes.drop);\r\n\t\tif ($message) {\r\n\t\t\tif (files.length) Classes.add($message, 'has-files');\r\n\t\t\telse Classes.remove($message, 'has-files');\r\n\r\n\t\t\tconst isSingle = Number(this._params?.limits?.count) === 1;\r\n\t\t\tif (isSingle) {\r\n\t\t\t\tif (files.length) Classes.remove($message, 'show');\r\n\t\t\t\telse Classes.add($message, 'show');\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._nodes.drop.appendChild($list);\r\n\t\tClasses.add(this._nodes.drop, 'active');\r\n\t}\r\n\r\n\t_renderInfoList(files) {\r\n\t\tif (!this._nodes.info) return;\r\n\r\n\t\tlet $list = Selectors.find(`.${this._getClass('info-list')}`, this._element);\r\n\t\tif (!$list) {\r\n\t\t\t$list = this._tpl.ul([], { class: this._getClass('info-list') });\r\n\t\t\tthis._nodes.info.appendChild($list);\r\n\t\t}\r\n\r\n\t\tif (!this._params.info) Classes.add($list, 'list-row');\r\n\r\n\t\tconst $itemsTemplate = this._parseTemplate().children;\r\n\t\tconst $itemsTemplateClasses = this._parseTemplate().liClasses.filter(cls => cls !== 'file');\r\n\t\tconst currentChildren = Array.from($list.children || []);\r\n\t\tconst existingByKey = new Map();\r\n\t\tcurrentChildren.forEach((child) => {\r\n\t\t\tconst key = this._getInfoNodeKey(child);\r\n\t\t\tif (key) {\r\n\t\t\t\tif (!child.hasAttribute('data-file-key')) {\r\n\t\t\t\t\tchild.setAttribute('data-file-key', key);\r\n\t\t\t\t}\r\n\t\t\t\texistingByKey.set(key, child);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tconst nextNodes = [];\r\n\r\n\t\tfiles.forEach((file, i) => {\r\n\t\t\tconst fileKey = this._getFileKey(file);\r\n\t\t\tconst signature = this._getInfoItemSignature(file, i);\r\n\t\t\tconst existingNode = existingByKey.get(fileKey);\r\n\r\n\t\t\tif (existingNode && existingNode.getAttribute('data-vg-info-signature') === signature) {\r\n\t\t\t\tconst iterationNode = existingNode.querySelector('.iteration');\r\n\t\t\t\tif (iterationNode) {\r\n\t\t\t\t\titerationNode.textContent = `${i + 1}.`;\r\n\t\t\t\t}\r\n\t\t\t\tnextNodes.push(existingNode);\r\n\t\t\t\texistingByKey.delete(fileKey);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (existingNode) {\n\t\t\t\tVGFilePreview.stopActiveInlineAudioIfDetached([existingNode]);\n\t\t\t\texistingNode.remove();\n\t\t\t}\n\r\n\t\t\tconst nextNode = this._createInfoListItem(file, i, $itemsTemplate, $itemsTemplateClasses, fileKey, signature);\r\n\t\t\tnextNodes.push(nextNode);\r\n\t\t\texistingByKey.delete(fileKey);\r\n\t\t});\r\n\r\n\t\tif (existingByKey.size) {\r\n\t\t\tconst removedNodes = Array.from(existingByKey.values());\r\n\t\t\tVGFilePreview.stopActiveInlineAudioIfDetached(removedNodes);\r\n\t\t\tremovedNodes.forEach((node) => node.remove());\r\n\t\t}\r\n\r\n\t\tnextNodes.forEach((node) => {\r\n\t\t\t$list.appendChild(node);\r\n\t\t});\r\n\r\n\t\tthis._initFilePreviewInInfo($list);\r\n\r\n\t\tClasses.add(this._nodes.info, 'show')\r\n\t}\r\n\r\n\t_getInfoItemSignature(file, index) {\r\n\t\tconst displayName = this._resolveDisplayName(file);\r\n\t\tconst previewPath = this._resolveFilePreviewPath(file);\r\n\t\tconst id = file?.id || '';\r\n\t\tconst name = file?.name || '';\r\n\t\tconst size = file?.size ?? 0;\r\n\t\tconst type = file?.type || '';\r\n\r\n\t\treturn `${id}|${name}|${size}|${type}|${displayName}|${previewPath}`;\r\n\t}\r\n\r\n\t_getInfoNodeKey(node) {\r\n\t\tif (!node || typeof node.getAttribute !== 'function') {\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\tconst fromAttr = String(node.getAttribute('data-file-key') || '').trim();\r\n\t\tif (fromAttr) {\r\n\t\t\treturn fromAttr;\r\n\t\t}\r\n\r\n\t\tconst name = String(node.getAttribute('data-name') || '').trim();\r\n\t\tconst size = String(node.getAttribute('data-size') || '').trim();\r\n\t\tconst type = String(node.getAttribute('data-type') || '').trim();\r\n\t\tif (name && size && type) {\r\n\t\t\treturn `${name}-${size}-${type}`;\r\n\t\t}\r\n\r\n\t\tconst raw = String(node.getAttribute('data-file') || '').trim();\r\n\t\tif (!raw) {\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tconst parsed = JSON.parse(raw);\r\n\t\t\tconst pName = String(parsed?.name || '').trim();\r\n\t\t\tconst pSize = String(parsed?.size ?? '').trim();\r\n\t\t\tconst pType = String(parsed?.type || '').trim();\r\n\t\t\tif (pName && pSize && pType) {\r\n\t\t\t\treturn `${pName}-${pSize}-${pType}`;\r\n\t\t\t}\r\n\t\t} catch {\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\treturn '';\r\n\t}\r\n\r\n\t_createInfoListItem(file, i, itemsTemplate, itemTemplateClasses, fileKey, signature) {\r\n\t\tlet classes = [...itemTemplateClasses];\r\n\r\n\t\tif (this._params.image) classes.push('with-image');\r\n\t\tif (this._params.info) classes.push('with-info');\r\n\t\tif (this._params.detach) classes.push('with-remove')\r\n\t\tif (this._params.sortable.enabled) classes.push('with-sortable');\r\n\t\tconst previewPath = this._resolveFilePreviewPath(file);\r\n\t\tconst displayName = this._resolveDisplayName(file);\r\n\r\n\t\tlet parts = [];\r\n\t\titemsTemplate.forEach(tmpl => {\r\n\t\t\tconst part = this._renderTemplatePart(tmpl.element, file, i);\r\n\t\t\tif (part) parts.push(part);\r\n\t\t});\r\n\r\n\t\tconst liAttrs = {\r\n\t\t\t'data-name': file.name,\r\n\t\t\t'data-size': file.size ?? 0,\r\n\t\t\t'data-type': file.type || '',\r\n\t\t\t'data-id': file.id || '',\r\n\t\t\t'data-file-key': fileKey,\r\n\t\t\t'data-vg-info-signature': signature,\r\n\t\t\tclass: 'file ' + classes.join(' ') + ' '\r\n\t\t};\r\n\r\n\t\tif (previewPath) {\r\n\t\t\tliAttrs['data-vg-filepreview'] = previewPath;\r\n\t\t\tliAttrs['data-fields'] = 'name,size,download';\r\n\t\t\tliAttrs['data-original-name'] = file.name || '';\r\n\t\t\tliAttrs['data-vg-filepreview-display-name'] = displayName || file.name || '';\r\n\t\t}\r\n\r\n\t\treturn this._tpl.li(\r\n\t\t\tthis._buildFileDataAttributes(file, liAttrs),\r\n\t\t\tparts\r\n\t\t);\r\n\t}\r\n\r\n\t_renderTemplatePart(element, file, index = null, options = {}) {\r\n\t\tif (!element) return null;\r\n\t\tconst { isDrop = false } = options;\r\n\r\n\t\tconst classList = element?.classList;\r\n\r\n\t\tif (classList?.contains('file-image')) return this._renderUIImage(file);\r\n\t\tif (classList?.contains('file-info')) {\r\n\t\t\tif (isDrop) return null;\r\n\t\t\treturn this._renderUIInfo(file, index);\r\n\t\t}\r\n\t\tif (classList?.contains('file-remove')) return this._wrapInFileCustom(this._renderUIDetach(file));\r\n\r\n\t\tconst $part = element.cloneNode(true);\r\n\r\n\t\tthis._replaceTemplateSlot($part, '.file-image', () => this._renderUIImage(file));\r\n\t\tthis._replaceTemplateSlot($part, '.file-info', () => isDrop ? null : this._renderUIInfo(file, index));\r\n\t\tthis._replaceTemplateSlot($part, '.file-remove', () => this._renderUIDetach(file));\r\n\r\n\t\treturn this._wrapInFileCustom($part);\r\n\t}\r\n\r\n\t_wrapInFileCustom(node) {\r\n\t\tif (!node) return null;\r\n\t\tif (node.classList?.contains('file-custom')) return node;\r\n\r\n\t\tconst wrapper = document.createElement('div');\r\n\t\twrapper.className = 'file-custom';\r\n\t\twrapper.appendChild(node);\r\n\r\n\t\treturn wrapper;\r\n\t}\r\n\r\n\t_replaceTemplateSlot(container, selector, renderer) {\r\n\t\tconst isMatchSelf = container?.matches && container.matches(selector);\r\n\t\tconst matched = isMatchSelf ? [container] : Array.from(container.querySelectorAll(selector));\r\n\r\n\t\tmatched.forEach((node) => {\r\n\t\t\tconst replacement = renderer();\r\n\t\t\tif (replacement) node.replaceWith(replacement);\r\n\t\t\telse node.remove();\r\n\t\t});\r\n\t}\r\n\r\n\t_renderUIDetach(file) {\r\n\t\tif (this._params.detach) {\r\n\t\t\treturn this._tpl.div({ class: 'file-remove' }, [\r\n\t\t\t\tthis._setButtonElement(file)\r\n\t\t\t])\r\n\t\t}\r\n\t}\r\n\r\n\t_renderUIInfo(file, i) {\r\n\t\tif (this._params.info) {\r\n\t\t\tconst displayName = this._resolveDisplayName(file);\r\n\t\t\treturn this._tpl.div({ class: 'file-info' }, [\r\n\t\t\t\tthis._tpl.span({ class: 'iteration' }, `${i + 1}.`),\r\n\t\t\t\tthis._tpl.span({ class: 'name' }, displayName),\r\n\t\t\t\tthis._tpl.span({ class: 'size' }, `[${this._getSizes(file.size)}]`),\r\n\t\t\t\tthis._tpl.span({ class: 'download' }, '')\r\n\t\t\t]);\r\n\t\t}\r\n\t}\r\n\r\n\t_renderUIImage(file) {\r\n\t\tconst $container = this._tpl.div({ class: 'file-image' });\r\n\r\n\t\tconst src = file?.src || file?.image;\r\n\t\tif (src) {\r\n\t\t\t$container.appendChild(this._tpl.img(src, file.name || '', { class: 'file-preview' }));\r\n\t\t\treturn $container;\r\n\t\t}\r\n\r\n\t\tconst customData = this._getFileCustomData(file);\r\n\t\tconst audioCover = String(customData.audioCover || '').trim();\r\n\t\tif (audioCover) {\r\n\t\t\t$container.appendChild(this._tpl.img(audioCover, this._resolveDisplayName(file), { class: 'file-preview' }));\r\n\t\t\treturn $container;\r\n\t\t}\r\n\r\n\t\tif (file?.type && file.type.startsWith('image/')) {\r\n\t\t\tconst objectUrl = this._getFileObjectUrl(file);\r\n\t\t\tif (!objectUrl) {\r\n\t\t\t\treturn $container;\r\n\t\t\t}\r\n\t\t\t$container.appendChild(this._tpl.img(objectUrl, file.name, { class: 'file-preview' }));\r\n\t\t\treturn $container;\r\n\t\t}\r\n\r\n\t\tconst icon = this._getIconByFileType(file);\r\n\t\t$container.appendChild(this._tpl.i({}, icon, { isHTML: true }));\r\n\t\treturn $container;\r\n\t}\r\n\r\n\t_resolveDisplayName(file) {\r\n\t\tconst customData = this._getFileCustomData(file);\r\n\t\tconst metaTitle = String(customData.audioTitle || '').trim();\r\n\t\tif (metaTitle) {\r\n\t\t\treturn metaTitle;\r\n\t\t}\r\n\r\n\t\treturn String(file?.name || '').trim();\r\n\t}\r\n\r\n\t_getIconByFileType(file) {\r\n\t\treturn getSVG(file);\r\n\t}\r\n\r\n\t_resolveFilePreviewPath(file) {\r\n\t\tconst src = String(file?.src || file?.image || '').trim();\r\n\t\tif (src) {\r\n\t\t\treturn src;\r\n\t\t}\r\n\r\n\t\treturn this._getFileObjectUrl(file);\r\n\t}\r\n\r\n\t_getFileObjectUrl(file) {\r\n\t\tif (!file || typeof File === 'undefined' || !(file instanceof File)) {\r\n\t\t\treturn '';\r\n\t\t}\r\n\r\n\t\tconst key = this._getFileKey(file);\r\n\t\tif (this._fileObjectUrls.has(key)) {\r\n\t\t\treturn this._fileObjectUrls.get(key);\r\n\t\t}\r\n\r\n\t\tconst objectUrl = URL.createObjectURL(file);\r\n\t\tthis._fileObjectUrls.set(key, objectUrl);\r\n\t\treturn objectUrl;\r\n\t}\r\n\r\n\t_isAudioFile(file) {\r\n\t\tif (!file) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst fileType = String(file.type || '').toLowerCase();\r\n\t\tif (fileType.startsWith('audio/')) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tconst name = String(file.name || '').toLowerCase();\r\n\t\treturn /\\.(mp3|m4a|aac|wav|ogg|flac|opus|wma)$/.test(name);\r\n\t}\r\n\r\n\t_setFileCustomDataValue(file, key, value) {\r\n\t\tif (!file || !key) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!file.customData || typeof file.customData !== 'object' || Array.isArray(file.customData)) {\r\n\t\t\tObject.defineProperty(file, 'customData', {\r\n\t\t\t\tvalue: {},\r\n\t\t\t\twritable: true,\r\n\t\t\t\tenumerable: true\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tfile.customData[key] = value;\r\n\t}\r\n\r\n\t_enrichAudioMetadata(files = []) {\r\n\t\tif (!Array.isArray(files) || !files.length) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst pending = [];\r\n\r\n\t\tfiles.forEach((file) => {\r\n\t\t\tif (!this._isAudioFile(file)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst fileKey = this._getFileKey(file);\r\n\t\t\tif (this._audioMetaPromises.has(fileKey)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst customData = this._getFileCustomData(file);\r\n\t\t\tif (customData.audioTitle || customData.audioCover) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst task = extractAudioMetadata(file)\r\n\t\t\t\t.then((meta) => {\r\n\t\t\t\t\tif (!meta) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tlet changed = false;\r\n\r\n\t\t\t\t\tif (meta.title) {\r\n\t\t\t\t\t\tthis._setFileCustomDataValue(file, 'audioTitle', meta.title);\r\n\t\t\t\t\t\tchanged = true;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (meta.pictureBlob) {\r\n\t\t\t\t\t\tconst coverKey = `cover:${fileKey}`;\r\n\t\t\t\t\t\tlet coverUrl = this._fileObjectUrls.get(coverKey);\r\n\t\t\t\t\t\tif (!coverUrl) {\r\n\t\t\t\t\t\t\tcoverUrl = URL.createObjectURL(meta.pictureBlob);\r\n\t\t\t\t\t\t\tthis._fileObjectUrls.set(coverKey, coverUrl);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tthis._setFileCustomDataValue(file, 'audioCover', coverUrl);\r\n\t\t\t\t\t\tchanged = true;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn changed;\r\n\t\t\t\t})\r\n\t\t\t\t.catch(() => false)\r\n\t\t\t\t.then((result) => {\r\n\t\t\t\t\tthis._audioMetaPromises.delete(fileKey);\r\n\t\t\t\t\treturn result;\r\n\t\t\t\t});\r\n\r\n\t\t\tthis._audioMetaPromises.set(fileKey, task);\r\n\t\t\tpending.push(task);\r\n\t\t});\r\n\r\n\t\tif (!pending.length) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tPromise.allSettled(pending).then((results) => {\r\n\t\t\tconst hasChanges = results.some((item) => item.status === 'fulfilled' && item.value === true);\r\n\t\t\tif (!hasChanges || !this._files.length) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tthis._renderUI(this._files);\r\n\t\t});\r\n\t}\r\n\r\n\t_initFilePreviewInInfo(root) {\r\n\t\tif (!this._nodes.info || !root) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst lang = this._params?.lang || document.documentElement.lang || 'ru';\r\n\t\tconst nodes = Selectors.findAll('[data-vg-filepreview]', root) || [];\r\n\r\n\t\tnodes.forEach((node) => {\r\n\t\t\tVGFilePreview.getOrCreateInstance(node, {\r\n\t\t\t\tlang,\r\n\t\t\t\tui: {\r\n\t\t\t\t\tnameOnly: true\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\t_updateStat() {\r\n\t\tif (!this._nodes.stat) return;\r\n\r\n\t\tconst totalSize = this._getSizes(this._files, true);\r\n\t\tconst $count = Selectors.find(`.${this._getClass('stat')}-count`, this._nodes.stat);\r\n\t\tif ($count) {\r\n\t\t\t$count.innerHTML = this._files.length ? `${this._files.length}<span>[${totalSize}]</span>` : '';\r\n\t\t}\r\n\r\n\t\tClasses.add(this._nodes.stat, 'show');\r\n\t}\r\n\r\n\t_generateHiddenInputs(files) {\r\n\t\tthis._cleanupFakeInputs();\r\n\t\tconst fragment = document.createDocumentFragment();\r\n\t\tconst idInput = Manipulator.get(Selectors.find('label', this._element), 'for') || '';\r\n\t\tconst name = Selectors.findID(idInput, this._element)?.name || Selectors.findID(idInput, this._element)?.dataset.originalName || 'files[]';\r\n\r\n\t\tconst baseName = name.endsWith('[]') ? name.slice(0, -2) : name;\r\n\t\tconst isSingle = Number(this._params?.limits?.count) === 1;\r\n\r\n\t\tif (isSingle) return;\r\n\r\n\t\tfiles.forEach((file, index) => {\r\n\t\t\tconst input = document.createElement('input');\r\n\t\t\tinput.type = 'file';\r\n\t\t\tinput.name = `${baseName}[${index}]`;\r\n\t\t\tinput.dataset.vgFiles = 'generated';\r\n\t\t\tManipulator.hide(input);\r\n\r\n\t\t\tconst dataTransfer = new DataTransfer();\r\n\t\t\tdataTransfer.items.add(file);\r\n\t\t\tinput.files = dataTransfer.files;\r\n\t\t\tfragment.appendChild(input);\r\n\t\t});\r\n\r\n\t\tthis._element.appendChild(fragment);\r\n\t}\r\n\r\n\t_cleanupFakeInputs() {\r\n\t\tSelectors.findAll('[data-vg-files=\"generated\"]', this._element).forEach(el => el.remove());\r\n\t}\r\n\r\n\tclear(resetInput = true) {\n\t\tconst detachedNodes = [];\n\t\tif (this._nodes.info) {\n\t\t\tconst $infoList = Selectors.find(`.${this._getClass('info-list')}`, this._element);\n\t\t\tif ($infoList?.children?.length) {\n\t\t\t\tdetachedNodes.push(...Array.from($infoList.children));\n\t\t\t}\n\t\t}\n\t\tif (this._nodes.drop) {\n\t\t\tconst $dropList = Selectors.find(`.${this._getClass('drop-list')}`, this._element);\n\t\t\tif ($dropList?.children?.length) {\n\t\t\t\tdetachedNodes.push(...Array.from($dropList.children));\n\t\t\t}\n\t\t}\n\t\tif (detachedNodes.length) {\n\t\t\tVGFilePreview.stopActiveInlineAudioIfDetached(detachedNodes);\n\t\t}\n\n\t\tthis._revokeUrls();\n\t\tif (resetInput) {\n\t\t\tthis._resetFileInput();\n\t\t}\n\t\tthis._cleanupFakeInputs();\r\n\t\tthis._cleanupErrors();\r\n\t\tthis._files = [];\r\n\r\n\t\tif (this._nodes.info) {\r\n\t\t\tClasses.remove(this._nodes.info, 'show');\r\n\t\t\tconst $list = Selectors.find(`.${this._getClass('info-list')}`, this._element);\r\n\t\t\tif ($list) $list.innerHTML = '';\r\n\t\t}\r\n\t\tif (this._nodes.drop) {\r\n\t\t\tconst $list = Selectors.find(`.${this._getClass('drop-list')}`, this._element);\r\n\t\t\tif ($list) $list.innerHTML = '';\r\n\r\n\t\t\tconst $message = Selectors.find(`.${this._getClass('drop-message')}`, this._element);\r\n\t\t\tif ($message) {\r\n\t\t\t\tClasses.remove($message, 'has-files');\r\n\r\n\t\t\t\tconst isSingle = Number(this._params?.limits?.count) === 1;\r\n\t\t\t\tif (isSingle) {\r\n\t\t\t\t\tClasses.add($message, 'show');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tClasses.remove(this._nodes.drop, 'active');\r\n\t\t}\r\n\t\tif (this._nodes.stat) {\r\n\t\t\tClasses.remove(this._nodes.stat, 'show');\r\n\t\t}\r\n\t}\r\n\r\n\t_revokeUrls() {\r\n\t\tthis._fileObjectUrls.forEach((url) => {\r\n\t\t\tURL.revokeObjectURL(url);\r\n\t\t});\r\n\t\tthis._fileObjectUrls.clear();\r\n\t\tthis._audioMetaPromises.clear();\r\n\t}\r\n\r\n\t_resetFileInput() {\r\n\t\tSelectors.findAll('[data-vg-toggle=\"files\"]', this._element).forEach(input => input.value = '');\r\n\t}\r\n\r\n\t_preventOriginalInputFromSubmit(isRestore = false) {\r\n\t\tconst el = Selectors.find('[data-vg-toggle=\"files\"]', this._element);\r\n\t\tif (!el) return;\r\n\t\tif (!isRestore && !el.dataset.originalName) {\r\n\t\t\tel.dataset.originalName = el.name;\r\n\t\t\tel.removeAttribute('name');\r\n\t\t} else if (isRestore && el.dataset.originalName) {\r\n\t\t\tel.name = el.dataset.originalName;\r\n\t\t\tdelete el.dataset.originalName;\r\n\t\t}\r\n\t}\r\n\r\n\t_addEventListener() {\r\n\t\tSelectors.findAll('[data-vg-toggle=\"files\"]', this._element).forEach(el => {\r\n\t\t\tel.removeEventListener('change', this._onNativeInputChange);\r\n\t\t\tel.addEventListener('change', this._onNativeInputChange);\r\n\t\t});\r\n\t}\r\n\r\n\tdispose() {\r\n\t\tthis.clear();\r\n\t\tsuper.dispose();\r\n\t}\r\n}\r\n\r\nexport default VGFilesBase;\r\n","import Ajax from \"../../../utils/js/components/ajax\";\r\nimport { normalizeData } from \"../../../utils/js/functions\";\r\n\r\nclass FileUploader {\r\n\tconstructor(options = {}) {\r\n\t\t// Настройки\r\n\t\tthis.mode = options.mode || 'sequential';\r\n\t\tthis.maxParallel = options.maxParallel || 3;\r\n\t\tthis.maxConcurrent = options.maxConcurrent || 1; // для sequential\r\n\t\tthis.retryAttempts = options.retryAttempts || 3;\r\n\t\tthis.retryDelay = options.retryDelay || 1000;\r\n\r\n\t\t// Состояние загрузок\r\n\t\tthis.uploads = new Map(); // id → uploadData\r\n\t\tthis.completed = [];\r\n\t\tthis.queue = []; // очередь для sequential\r\n\t\tthis.waitingPromises = []; // для parallel: промисы, ожидающие слот\r\n\r\n\t\t// Состояние\r\n\t\tthis.activeCount = 0;\r\n\t\tthis.isPaused = false;\r\n\r\n\t\t// Коллбэки\r\n\t\tthis.callbacks = {\r\n\t\t\tprogress: [],\r\n\t\t\tcomplete: [],\r\n\t\t\terror: [],\r\n\t\t\tallComplete: []\r\n\t\t};\r\n\r\n\t\tthis._checkAllCompleteBound = this.checkAllComplete.bind(this);\r\n\t}\r\n\r\n\t// === ОСНОВНЫЕ МЕТОДЫ ===\r\n\r\n\t/**\r\n\t * Загрузка одного файла\r\n\t */\r\n\tasync uploadFile(file, url, options = {}) {\r\n\t\tconst id = this.generateId();\r\n\t\tconst uploadData = {\r\n\t\t\tid,\r\n\t\t\tfile,\r\n\t\t\turl,\r\n\t\t\toptions,\r\n\t\t\tstatus: 'pending',\r\n\t\t\tprogress: 0,\r\n\t\t\tattempts: 0,\r\n\t\t\tresult: null,\r\n\t\t\terror: null,\r\n\t\t\tstartTime: null,\r\n\t\t\tendTime: null,\r\n\t\t\tcontroller: new AbortController(), // для отмены\r\n\t\t\tsignal: null // будет установлен при старте\r\n\t\t};\r\n\r\n\t\tthis.uploads.set(id, uploadData);\r\n\r\n\t\tif (this.mode === 'sequential') {\r\n\t\t\treturn this._addToSequentialQueue(uploadData);\r\n\t\t} else {\r\n\t\t\treturn this._startParallelUpload(uploadData);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Массовая загрузка файлов\r\n\t */\r\n\tasync uploadFiles(files, url, options = {}) {\r\n\t\tconst promises = files.map(file => this.uploadFile(file, url, options));\r\n\t\tconst results = await Promise.allSettled(promises);\r\n\r\n\t\treturn results.map(result => {\r\n\t\t\tif (result.status === 'fulfilled') {\r\n\t\t\t\treturn { file: result.value.file?.name, success: true, result: result.value };\r\n\t\t\t} else {\r\n\t\t\t\treturn { file: result.reason?.file?.name || 'unknown', success: false, error: result.reason };\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t// === РЕЖИМЫ ЗАГРУЗКИ ===\r\n\r\n\t_addToSequentialQueue(uploadData) {\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\tthis.queue.push({ uploadData, resolve, reject });\r\n\t\t\tthis._processSequentialQueue();\r\n\t\t});\r\n\t}\r\n\r\n\tasync _processSequentialQueue() {\r\n\t\tif (\r\n\t\t\tthis.isPaused ||\r\n\t\t\tthis.activeCount >= this.maxConcurrent ||\r\n\t\t\tthis.queue.length === 0\r\n\t\t) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst { uploadData, resolve, reject } = this.queue[0]; // не удаляем, пока не начнём\r\n\t\tthis.activeCount++;\r\n\r\n\t\ttry {\r\n\t\t\tconst result = await this._executeUpload(uploadData);\r\n\t\t\tresolve(result);\r\n\t\t} catch (error) {\r\n\t\t\treject(error);\r\n\t\t} finally {\r\n\t\t\tthis.queue.shift(); // удаляем только после завершения\r\n\t\t\tthis.activeCount--;\r\n\t\t\tawait this._processSequentialQueue();\r\n\t\t}\r\n\t}\r\n\r\n\tasync _startParallelUpload(uploadData) {\r\n\t\t// Ждём свободный слот\r\n\t\tif (this.activeCount >= this.maxParallel) {\r\n\t\t\tawait new Promise(resolve => this.waitingPromises.push(resolve));\r\n\t\t}\r\n\r\n\t\tthis.activeCount++;\r\n\t\tuploadData.startTime = Date.now();\r\n\r\n\t\ttry {\r\n\t\t\treturn await this._executeUpload(uploadData);\r\n\t\t} finally {\r\n\t\t\tthis.activeCount--;\r\n\t\t\tthis._notifyWaiting(); // освободили слот\r\n\t\t}\r\n\t}\r\n\r\n\t_notifyWaiting() {\r\n\t\tif (this.waitingPromises.length > 0 && this.activeCount < this.maxParallel) {\r\n\t\t\tconst resolve = this.waitingPromises.shift();\r\n\t\t\tresolve();\r\n\t\t}\r\n\t}\r\n\r\n\t// === ВЫПОЛНЕНИЕ ЗАГРУЗКИ ===\r\n\r\n\tasync _executeUpload(uploadData, attempt = 1) {\r\n\t\tuploadData.status = 'uploading';\r\n\t\tuploadData.attempts = attempt;\r\n\t\tuploadData.signal = uploadData.controller.signal;\r\n\r\n\t\ttry {\r\n\t\t\tconst result = await this._performUpload(uploadData);\r\n\t\t\tthis._completeUpload(uploadData, result);\r\n\t\t\treturn result;\r\n\t\t} catch (error) {\r\n\t\t\tif (uploadData.status === 'cancelled') return;\r\n\r\n\t\t\tuploadData.error = error;\r\n\r\n\t\t\tif (attempt < this.retryAttempts) {\r\n\t\t\t\tuploadData.status = 'retrying';\r\n\t\t\t\tthis.notifyProgress(uploadData);\r\n\t\t\t\tawait this._delay(this.retryDelay * Math.pow(2, attempt)); // экспоненциальная задержка\r\n\t\t\t\treturn this._executeUpload(uploadData, attempt + 1);\r\n\t\t\t} else {\r\n\t\t\t\tuploadData.status = 'failed';\r\n\t\t\t\tuploadData.endTime = Date.now();\r\n\t\t\t\tthis.notifyProgress(uploadData);\r\n\t\t\t\tthis.notifyError(uploadData, error);\r\n\t\t\t\tthis._checkAllCompleteBound();\r\n\t\t\t\tthrow error;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t_performUpload(uploadData) {\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\tconst ajax = new Ajax();\r\n\t\t\tconst formData = new FormData();\r\n\r\n\t\t\tformData.append('file', uploadData.file);\r\n\t\t\tformData.append('_token', ajax._getCsrfToken() || '');\r\n\r\n\t\t\tif (uploadData.options.additionalData) {\r\n\t\t\t\tObject.entries(uploadData.options.additionalData).forEach(([key, value]) => {\r\n\t\t\t\t\tformData.append(key, value);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t// Передаём AbortController.signal\r\n\t\t\tconst config = {\r\n\t\t\t\tonProgress: (percent, event) => {\r\n\t\t\t\t\tuploadData.progress = percent;\r\n\t\t\t\t\tthis.notifyProgress(uploadData);\r\n\t\t\t\t},\r\n\t\t\t\tonSuccess: (data) => {\r\n\t\t\t\t\tresolve(normalizeData(data));\r\n\t\t\t\t},\r\n\t\t\t\tonError: (err) => {\r\n\t\t\t\t\treject(normalizeData(err));\r\n\t\t\t\t},\r\n\t\t\t\tsignal: uploadData.signal\r\n\t\t\t};\r\n\r\n\t\t\t// Предполагаем, что ajax.post поддерживает signal\r\n\t\t\tconst xhr = ajax.post(uploadData.url, formData, config);\r\n\t\t\tuploadData.xhr = xhr; // для отмены\r\n\t\t});\r\n\t}\r\n\r\n\t_completeUpload(uploadData, result) {\r\n\t\tuploadData.status = 'completed';\r\n\t\tuploadData.progress = 100;\r\n\t\tuploadData.result = result;\r\n\t\tuploadData.endTime = Date.now();\r\n\r\n\t\tthis.completed.push({ ...uploadData });\r\n\t\tthis.notifyComplete(uploadData);\r\n\t\tthis._checkAllCompleteBound();\r\n\t}\r\n\r\n\t// === УПРАВЛЕНИЕ ===\r\n\r\n\tcancelUpload(id) {\r\n\t\tconst uploadData = this.uploads.get(id);\r\n\t\tif (!uploadData || ['completed', 'failed', 'cancelled'].includes(uploadData.status)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Отмена\r\n\t\tuploadData.controller.abort();\r\n\t\tif (uploadData.xhr && typeof uploadData.xhr.abort === 'function') {\r\n\t\t\tuploadData.xhr.abort();\r\n\t\t}\r\n\r\n\t\tuploadData.status = 'cancelled';\r\n\t\tuploadData.endTime = Date.now();\r\n\t\tthis.notifyProgress(uploadData);\r\n\r\n\t\t// Удаление из очереди\r\n\t\tconst queueIndex = this.queue.findIndex(task => task.uploadData.id === id);\r\n\t\tif (queueIndex > -1) {\r\n\t\t\tthis.queue.splice(queueIndex, 1);\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\tsetMode(mode, maxParallel = 3) {\r\n\t\tthis.mode = mode;\r\n\t\tthis.maxParallel = maxParallel;\r\n\r\n\t\tif (mode === 'parallel') {\r\n\t\t\tthis.queue = [];\r\n\t\t\tthis._notifyWaiting(); // разблокировать ожидающие промисы\r\n\t\t}\r\n\t}\r\n\r\n\tpause() {\r\n\t\tthis.isPaused = true;\r\n\t}\r\n\r\n\tresume() {\r\n\t\tthis.isPaused = false;\r\n\t\tif (this.mode === 'sequential') {\r\n\t\t\tthis._processSequentialQueue();\r\n\t\t} else {\r\n\t\t\tthis._notifyWaiting(); // может быть, кто-то ждёт\r\n\t\t}\r\n\t}\r\n\r\n\tclear() {\r\n\t\tthis.uploads.forEach((_, id) => {\r\n\t\t\tthis.cancelUpload(id);\r\n\t\t});\r\n\r\n\t\tthis.uploads.clear();\r\n\t\tthis.completed = [];\r\n\t\tthis.queue = [];\r\n\t\tthis.waitingPromises = [];\r\n\t\tthis.activeCount = 0;\r\n\t}\r\n\r\n\t// === СТАТИСТИКА И ВСПОМОГАТЕЛЬНЫЕ ===\r\n\r\n\tgetStats() {\r\n\t\tconst all = Array.from(this.uploads.values());\r\n\t\tconst totalSize = all.reduce((sum, u) => sum + (u.file?.size || 0), 0);\r\n\r\n\t\treturn {\r\n\t\t\ttotal: all.length,\r\n\t\t\tactive: this.activeCount,\r\n\t\t\tpending: all.filter(u => u.status === 'pending').length,\r\n\t\t\tuploading: all.filter(u => u.status === 'uploading').length,\r\n\t\t\tcompleted: all.filter(u => u.status === 'completed').length,\r\n\t\t\tfailed: all.filter(u => u.status === 'failed').length,\r\n\t\t\tcancelled: all.filter(u => u.status === 'cancelled').length,\r\n\t\t\tmode: this.mode,\r\n\t\t\tisPaused: this.isPaused,\r\n\t\t\tqueueLength: this.queue.length,\r\n\t\t\ttotalSizeFormatted: (totalSize / (1024 * 1024)).toFixed(2) + ' MB'\r\n\t\t};\r\n\t}\r\n\r\n\tprintDebugStats() {\r\n\t\tconst stats = this.getStats();\r\n\t\tconsole.group('--- Uploader Statistics ---');\r\n\t\tconsole.table({\r\n\t\t\t'Mode': stats.mode,\r\n\t\t\t'Status': stats.isPaused ? 'Paused' : 'Running',\r\n\t\t\t'Total Files': stats.total,\r\n\t\t\t'Uploading': stats.uploading,\r\n\t\t\t'Completed': stats.completed,\r\n\t\t\t'Failed': stats.failed,\r\n\t\t\t'Queue': stats.queueLength\r\n\t\t});\r\n\t\tconsole.log(`Total Size: ${stats.totalSizeFormatted}`);\r\n\t\tconsole.groupEnd();\r\n\t}\r\n\r\n\tgenerateId() {\r\n\t\treturn `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n\t}\r\n\r\n\t_delay(ms) {\r\n\t\treturn new Promise(resolve => setTimeout(resolve, ms));\r\n\t}\r\n\r\n\tcheckAllComplete() {\r\n\t\tconst allDone = Array.from(this.uploads.values()).every(u =>\r\n\t\t\t['completed', 'failed', 'cancelled'].includes(u.status)\r\n\t\t);\r\n\r\n\t\tif (allDone && this.uploads.size > 0) {\r\n\t\t\tthis.notifyAllComplete();\r\n\t\t}\r\n\t}\r\n\r\n\t// === КОЛЛБЭКИ ===\r\n\r\n\tonProgress(callback) { this.callbacks.progress.push(callback); }\r\n\tonComplete(callback) { this.callbacks.complete.push(callback); }\r\n\tonError(callback) { this.callbacks.error.push(callback); }\r\n\tonAllComplete(callback) { this.callbacks.allComplete.push(callback); }\r\n\r\n\tnotifyProgress(uploadData) {\r\n\t\tthis.callbacks.progress.forEach(cb => this._safeCall(cb, { ...uploadData, stats: this.getStats() }));\r\n\t}\r\n\r\n\tnotifyComplete(uploadData) {\r\n\t\tthis.callbacks.complete.forEach(cb => this._safeCall(cb, uploadData));\r\n\t}\r\n\r\n\tnotifyError(uploadData, error) {\r\n\t\tthis.callbacks.error.forEach(cb => this._safeCall(cb, uploadData, error));\r\n\t}\r\n\r\n\tnotifyAllComplete() {\r\n\t\tthis.callbacks.allComplete.forEach(cb => this._safeCall(cb, { completed: this.completed, stats: this.getStats() }));\r\n\t}\r\n\r\n\tisIdle() {\r\n\t\tconst hasActiveUploads = this.activeCount > 0;\r\n\t\tconst hasPendingInQueue = this.queue.length > 0;\r\n\t\tconst hasWaitingPromises = this.waitingPromises.length > 0;\r\n\t\tconst hasRunningUploads = Array.from(this.uploads.values()).some(u =>\r\n\t\t\t['uploading', 'retrying', 'pending'].includes(u.status)\r\n\t\t);\r\n\r\n\t\treturn !hasActiveUploads && !hasPendingInQueue && !hasWaitingPromises && !hasRunningUploads;\r\n\t}\r\n\r\n\t/**\r\n\t * Отписывает все обработчики событий\r\n\t * Предотвращает утечки памяти при повторной инициализации\r\n\t */\r\n\toffAll() {\r\n\t\tthis.callbacks.progress = [];\r\n\t\tthis.callbacks.complete = [];\r\n\t\tthis.callbacks.error = [];\r\n\t\tthis.callbacks.allComplete = [];\r\n\t\treturn this;\r\n\t}\r\n\r\n\t_safeCall(callback, ...args) {\r\n\t\ttry {\r\n\t\t\tcallback(...args);\r\n\t\t} catch (error) {\r\n\t\t\tconsole.error('Callback error:', error);\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport default FileUploader;","import { isElement } from \"../../../utils/js/functions\";\r\nimport EventHandler from \"../../../utils/js/dom/event\";\r\nimport Selectors from \"../../../utils/js/dom/selectors\";\r\nimport { Classes } from \"../../../utils/js/dom/manipulator\";\r\nimport BaseModule from \"../../base-module\";\r\n\r\nconst CLASS_NAME_CONTAINER = 'vg-files';\r\nconst CLASS_NAME_DROP = `${CLASS_NAME_CONTAINER}-drop`;\r\n\r\nconst CLASS_NAME_DROP_ACTIVE = 'drop-active';\r\nconst CLASS_NAME_DROP_HOVER = 'drop-hover';\r\n\r\nconst NAME = 'drop-and-drop';\r\nconst NAME_KEY = 'vg.drop-and-drop';\r\n\r\nclass VGFilesDroppable extends BaseModule {\n /**\n * @param {HTMLElement} element\n * @param {Object} params\n */\n constructor(element, params = {}) {\r\n super(element, params);\r\n this._element = element;\r\n this._params = params;\r\n\r\n this._files = null;\r\n this._input = null;\r\n this._init();\r\n }\r\n\r\n static get NAME() { return NAME; }\r\n static get NAME_KEY() { return NAME_KEY; }\r\n\r\n _init() {\n VGFilesDroppable._instances.add(this);\n if (this._params?.smartdrop) {\n VGFilesDroppable._smartInstances.add(this);\n this._bindGlobalEvents();\n }\n this._findInput();\n this._setupEvents();\n }\n\r\n /**\r\n * Поиск связанного input[type=\"file\"] внутри или рядом с drop-зоной\r\n */\r\n _findInput() {\r\n const { id, name } = this._element.dataset;\r\n if (id) this._input = document.getElementById(id);\r\n if (!this._input && name) {\r\n this._input = Selectors.find(`[name=\"${name}\"]`);\r\n }\r\n if (!this._input) {\r\n this._input = Selectors.find('input[type=\"file\"]', this._element) || Selectors.find('input[type=\"file\"]', this._element.parentNode);\r\n }\r\n }\r\n\r\n /**\r\n * Настройка событий перетаскивания\r\n */\r\n _setupEvents() {\n if (!isElement(this._element)) return;\n\r\n const isSortableDrag = (e) => {\r\n // 1) если sortable реально активен — на элементе есть класс dragging\r\n if (document.querySelector('.dragging')) return true;\r\n\r\n // 2) маркер, который ставит sortable\r\n let plain = '';\r\n try { plain = e.dataTransfer?.getData?.('text/plain') || ''; } catch (_) {}\r\n return plain === 'vgsortable';\r\n };\n\r\n EventHandler.on(this._element, 'dragover', (e) => {\n e.preventDefault();\n e.stopPropagation();\n\r\n // ✅ Сортировка: НЕ подсвечиваем dropzone\r\n if (isSortableDrag(e)) {\n Classes.remove(this._element, [CLASS_NAME_DROP_ACTIVE, CLASS_NAME_DROP_HOVER]);\n VGFilesDroppable._setDropMessageTitleState(this._element, false);\n e.dataTransfer.dropEffect = 'none';\n return;\n }\n\r\n if (!Classes.has(this._element, CLASS_NAME_DROP_ACTIVE)) {\r\n Classes.add(this._element, CLASS_NAME_DROP_HOVER);\r\n }\r\n });\r\n\r\n EventHandler.on(this._element, 'dragenter', (e) => {\n e.preventDefault();\n e.stopPropagation();\n\r\n // ✅ Сортировка: НЕ подсвечиваем dropzone\r\n if (isSortableDrag(e)) {\n Classes.remove(this._element, [CLASS_NAME_DROP_ACTIVE, CLASS_NAME_DROP_HOVER]);\n VGFilesDroppable._setDropMessageTitleState(this._element, false);\n return;\n }\n\n Classes.add(this._element, [CLASS_NAME_DROP_ACTIVE, CLASS_NAME_DROP_HOVER]);\n VGFilesDroppable._setDropMessageTitleState(this._element, true);\n });\n\r\n EventHandler.on(this._element, 'dragleave', (e) => {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n // ✅ Сортировка: гарантированно без подсветки\r\n if (isSortableDrag(e)) {\n Classes.remove(this._element, [CLASS_NAME_DROP_ACTIVE, CLASS_NAME_DROP_HOVER]);\n VGFilesDroppable._setDropMessageTitleState(this._element, false);\n return;\n }\n\r\n if (e.target === this._element || e.target.closest('.' + CLASS_NAME_DROP) === this._element) {\r\n Classes.remove(this._element, CLASS_NAME_DROP_HOVER);\r\n setTimeout(() => {\r\n if (!this._element.matches(':hover')) {\n Classes.remove(this._element, CLASS_NAME_DROP_ACTIVE);\n VGFilesDroppable._setDropMessageTitleState(this._element, false);\n }\n }, 50);\n }\n });\n\r\n EventHandler.on(this._element, 'drop', (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n Classes.remove(this._element, [CLASS_NAME_DROP_ACTIVE, CLASS_NAME_DROP_HOVER]);\n VGFilesDroppable._setDropMessageTitleState(this._element, false);\n\r\n // ✅ сортировка: не трогаем input\r\n if (isSortableDrag(e)) {\n return;\n }\n\n const files = e.dataTransfer?.files;\n if (!files || !files.length) return;\n\r\n this._files = files;\r\n\r\n if (isElement(this._input)) {\r\n this._input.files = files;\r\n EventHandler.trigger(this._input, 'change');\r\n }\r\n });\n }\n\n _bindGlobalEvents() {\n if (VGFilesDroppable._isGlobalEventsBound) return;\n\n VGFilesDroppable._globalHandlers = {\n dragenter: (e) => this._updateSuggestedDrop(e),\n dragover: (e) => this._updateSuggestedDrop(e),\n dragleave: (e) => {\n if (!this._isFileDrag(e)) return;\n if (e.relatedTarget === null || e.target === document || e.target === document.documentElement) {\n VGFilesDroppable._clearSuggestedDrop();\n }\n },\n drop: (e) => {\n if (!this._isFileDrag(e)) {\n VGFilesDroppable._clearSuggestedDrop();\n return;\n }\n\n const activeDrop = VGFilesDroppable._activeSuggestedDrop;\n if (activeDrop) {\n const instance = Array.from(VGFilesDroppable._smartInstances).find(i => i._element === activeDrop);\n const files = e.dataTransfer?.files;\n\n if (instance && files && files.length && isElement(instance._input)) {\n e.preventDefault();\n e.stopPropagation();\n instance._files = files;\n instance._input.files = files;\n EventHandler.trigger(instance._input, 'change');\n }\n }\n\n VGFilesDroppable._clearSuggestedDrop();\n },\n dragend: () => VGFilesDroppable._clearSuggestedDrop(),\n };\n\n EventHandler.on(document, 'dragenter', VGFilesDroppable._globalHandlers.dragenter);\n EventHandler.on(document, 'dragover', VGFilesDroppable._globalHandlers.dragover);\n EventHandler.on(document, 'dragleave', VGFilesDroppable._globalHandlers.dragleave);\n EventHandler.on(document, 'drop', VGFilesDroppable._globalHandlers.drop);\n EventHandler.on(document, 'dragend', VGFilesDroppable._globalHandlers.dragend);\n\n EventHandler.on(window, 'dragenter', VGFilesDroppable._globalHandlers.dragenter);\n EventHandler.on(window, 'dragover', VGFilesDroppable._globalHandlers.dragover);\n EventHandler.on(window, 'dragleave', VGFilesDroppable._globalHandlers.dragleave);\n EventHandler.on(window, 'drop', VGFilesDroppable._globalHandlers.drop);\n EventHandler.on(window, 'dragend', VGFilesDroppable._globalHandlers.dragend);\n\n VGFilesDroppable._isGlobalEventsBound = true;\n }\n\n _updateSuggestedDrop(e) {\n if (!this._isFileDrag(e)) {\n VGFilesDroppable._clearSuggestedDrop();\n return;\n }\n\n const visibleDrops = this._getVisibleDropZonesInViewport();\n\n if (visibleDrops.length === 1) {\n const [dropZone] = visibleDrops;\n if (VGFilesDroppable._activeSuggestedDrop !== dropZone) {\n VGFilesDroppable._clearSuggestedDrop();\n Classes.add(dropZone, CLASS_NAME_DROP_ACTIVE);\n VGFilesDroppable._setDropMessageTitleState(dropZone, true);\n VGFilesDroppable._activeSuggestedDrop = dropZone;\n }\n\n if (e.dataTransfer) e.dataTransfer.dropEffect = 'copy';\n e.preventDefault();\n return;\n }\n\n VGFilesDroppable._clearSuggestedDrop();\n }\n\n _isFileDrag(e) {\n try {\n const dt = e?.dataTransfer;\n if (!dt) return false;\n\n if (dt.files && dt.files.length > 0) return true;\n\n if (dt.items && dt.items.length > 0) {\n return Array.from(dt.items).some(item => item.kind === 'file');\n }\n\n if (dt.types) {\n return Array.from(dt.types).includes('Files');\n }\n\n return false;\n } catch (_) {\n return false;\n }\n }\n\n _getVisibleDropZonesInViewport() {\n const dropZones = Array.from(Selectors.findAll(`.${CLASS_NAME_DROP}`) || []);\n return dropZones.filter((el) => this._isVisibleInViewport(el));\n }\n\n _isVisibleInViewport(el) {\n if (!isElement(el) || !el.isConnected) return false;\n\n const style = window.getComputedStyle(el);\n if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') {\n return false;\n }\n\n const rect = el.getBoundingClientRect();\n if (!rect.width || !rect.height) return false;\n\n const inViewport =\n rect.bottom > 0 &&\n rect.right > 0 &&\n rect.top < window.innerHeight &&\n rect.left < window.innerWidth;\n\n return inViewport;\n }\n\n static _clearSuggestedDrop() {\n if (!VGFilesDroppable._activeSuggestedDrop) return;\n\n VGFilesDroppable._setDropMessageTitleState(VGFilesDroppable._activeSuggestedDrop, false);\n Classes.remove(VGFilesDroppable._activeSuggestedDrop, CLASS_NAME_DROP_ACTIVE);\n VGFilesDroppable._activeSuggestedDrop = null;\n }\n\n static _setDropMessageTitleState(dropElement, isActive) {\n if (!isElement(dropElement)) return;\n\n const title = Selectors.find('.vg-files-drop-message .title', dropElement);\n if (!title) return;\n\n const originalText = (title.getAttribute('data-drop-original-text') || '').trim() || (title.textContent || '').trim();\n title.setAttribute('data-drop-original-text', originalText);\n\n const activeText = (dropElement.getAttribute('data-drop-active-text') || '').trim();\n if (isActive && activeText) {\n title.textContent = activeText;\n return;\n }\n\n title.textContent = originalText;\n }\n\n static _unbindGlobalEvents() {\n if (!VGFilesDroppable._isGlobalEventsBound) return;\n\n const handlers = VGFilesDroppable._globalHandlers || {};\n\n EventHandler.off(document, 'dragenter', handlers.dragenter);\n EventHandler.off(document, 'dragover', handlers.dragover);\n EventHandler.off(document, 'dragleave', handlers.dragleave);\n EventHandler.off(document, 'drop', handlers.drop);\n EventHandler.off(document, 'dragend', handlers.dragend);\n\n EventHandler.off(window, 'dragenter', handlers.dragenter);\n EventHandler.off(window, 'dragover', handlers.dragover);\n EventHandler.off(window, 'dragleave', handlers.dragleave);\n EventHandler.off(window, 'drop', handlers.drop);\n EventHandler.off(window, 'dragend', handlers.dragend);\n\n VGFilesDroppable._isGlobalEventsBound = false;\n VGFilesDroppable._globalHandlers = null;\n VGFilesDroppable._clearSuggestedDrop();\n }\n\r\n getFiles() {\r\n return this._files;\r\n }\r\n\r\n dispose() {\n EventHandler.off(this._element, 'dragover');\n EventHandler.off(this._element, 'dragenter');\n EventHandler.off(this._element, 'dragleave');\n EventHandler.off(this._element, 'drop');\n\n VGFilesDroppable._instances.delete(this);\n VGFilesDroppable._smartInstances.delete(this);\n if (!VGFilesDroppable._smartInstances.size) {\n VGFilesDroppable._unbindGlobalEvents();\n }\n\n this._input = null;\n this._files = null;\n }\n\r\n init() {\r\n return this;\r\n }\r\n}\n\nVGFilesDroppable._instances = new Set();\nVGFilesDroppable._smartInstances = new Set();\nVGFilesDroppable._isGlobalEventsBound = false;\nVGFilesDroppable._activeSuggestedDrop = null;\nVGFilesDroppable._globalHandlers = null;\n\nexport default VGFilesDroppable;\n","import { isElement, normalizeData } from \"../../../utils/js/functions\";\r\nimport Params from \"../../../utils/js/components/params\";\r\nimport Selectors from \"../../../utils/js/dom/selectors\";\r\nimport { Manipulator } from \"../../../utils/js/dom/manipulator\";\r\n\r\nclass VGFilesTemplateRender {\r\n\tconstructor(vgFilesInstance, element, params = {}) {\r\n\t\tthis.module = vgFilesInstance;\r\n\t\tthis.element = isElement(element) ? element : null;\r\n\r\n\t\tif (!this.element) {\r\n\t\t\tconsole.error('Invalid element provided:', element);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._params = new Params(params, element).get();\r\n\t\tthis._nodes = {\r\n\t\t\tinfo: this.module._nodes.info,\r\n\t\t\tdrop: this.module._nodes.drop\r\n\t\t};\r\n\r\n\t\tthis.bufferTemplate = '';\r\n\t\tthis.parsedFiles = [];\r\n\t}\r\n\r\n\tinit() {\r\n\t\tconst $targetNode = this._nodes.info || this._nodes.drop;\r\n\t\tif (!$targetNode) return false;\r\n\r\n\t\tconst area = this._nodes.info ? 'info' : 'drop';\r\n\t\treturn this._nativeRenderFiles(area, $targetNode);\r\n\t}\r\n\r\n\t_nativeRenderFiles(area, $node) {\r\n\t\tconst $list = Selectors.find(`.vg-files-${area}--list`, $node);\r\n\t\tif (!$list) return false;\r\n\r\n\t\tconst $items = Array.from($list.children).filter(li => li.tagName === 'LI');\r\n\t\tif ($items.length === 0) return false;\r\n\r\n\t\tthis._setTemplateInBuffer($items);\r\n\t\tif (!this.bufferTemplate) return false;\r\n\r\n\t\tthis.parsedFiles = $items\r\n\t\t\t.map(li => {\r\n\t\t\t\tconst rawData = Manipulator.get(li, 'data-file');\r\n\t\t\t\tif (!rawData) return null;\r\n\r\n\t\t\t\treturn this._parseDataFile(rawData);\r\n\t\t\t})\r\n\t\t\t.filter(Boolean);\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\t_parseDataFile(rawData) {\r\n\t\tconst dataFile = normalizeData(rawData);\r\n\t\tif (!dataFile || typeof dataFile !== 'object' || Array.isArray(dataFile)) return null;\r\n\r\n\t\tconst binaryMeta = this._extractBinaryMeta(dataFile);\r\n\t\tconst name = this._toStringOrNull(dataFile.name);\r\n\t\tconst id = this._toStringOrNull(dataFile.id);\r\n\t\tconst src = this._toStringOrNull(dataFile.src);\r\n\t\tconst type = this._toStringOrNull(dataFile.type) || binaryMeta.type || 'application/octet-stream';\r\n\t\tconst size = this._toNumberOrNull(dataFile.size) ?? binaryMeta.size ?? 0;\r\n\t\tconst lastModified = this._toNumberOrNull(dataFile.lastModified ?? dataFile['last-modified']) ?? binaryMeta.lastModified ?? Date.now();\r\n\r\n\t\tconst result = {\r\n\t\t\tid,\r\n\t\t\tname,\r\n\t\t\tsize,\r\n\t\t\ttype,\r\n\t\t\tsrc,\r\n\t\t\tlastModified\r\n\t\t};\r\n\r\n\t\tif (dataFile.image !== undefined && dataFile.image !== null && dataFile.image !== '') {\r\n\t\t\tresult.image = dataFile.image;\r\n\t\t}\r\n\r\n\t\tconst requiredKeys = ['id', 'name', 'size', 'type', 'src'];\r\n\t\tconst isValid = requiredKeys.every((key) => {\r\n\t\t\tconst value = result[key];\r\n\t\t\tif (key === 'size') return Number.isFinite(value);\r\n\t\t\treturn value !== undefined && value !== null && value !== '';\r\n\t\t});\r\n\r\n\t\tif (!isValid) return null;\r\n\r\n\t\tconst customData = {};\r\n\t\tconst reserved = new Set(['id', 'name', 'size', 'type', 'src', 'image', 'lastModified', 'last-modified']);\r\n\r\n\t\tObject.entries(dataFile).forEach(([key, value]) => {\r\n\t\t\tif (reserved.has(key)) return;\r\n\t\t\tif (value === undefined || value === null || value === '') return;\r\n\t\t\tcustomData[key] = value;\r\n\t\t});\r\n\r\n\t\tif (Object.keys(customData).length) {\r\n\t\t\tresult.customData = customData;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t_extractBinaryMeta(dataFile) {\r\n\t\tconst binary = dataFile.file || dataFile.blob || dataFile.originFile || null;\r\n\t\tif (!(binary instanceof Blob)) return {};\r\n\r\n\t\tconst size = this._toNumberOrNull(binary.size);\r\n\t\tconst type = this._toStringOrNull(binary.type);\r\n\t\tconst lastModified = (binary instanceof File)\r\n\t\t\t? this._toNumberOrNull(binary.lastModified)\r\n\t\t\t: null;\r\n\r\n\t\treturn {\r\n\t\t\tsize: size ?? null,\r\n\t\t\ttype: type || null,\r\n\t\t\tlastModified: lastModified ?? null\r\n\t\t};\r\n\t}\r\n\r\n\t_toStringOrNull(value) {\r\n\t\tif (value === undefined || value === null) return null;\r\n\t\tconst normalized = String(value).trim();\r\n\t\treturn normalized ? normalized : null;\r\n\t}\r\n\r\n\t_toNumberOrNull(value) {\r\n\t\tif (value === undefined || value === null || value === '') return null;\r\n\t\tconst normalized = Number(value);\r\n\t\treturn Number.isFinite(normalized) ? normalized : null;\r\n\t}\r\n\r\n\t_setTemplateInBuffer($items) {\r\n\t\tif (this.bufferTemplate || $items.length === 0) return;\r\n\r\n\t\tconst firstItem = $items[0];\r\n\r\n\t\tif (!Manipulator.has(firstItem, 'data-file')) {\r\n\t\t\tthis.bufferTemplate = firstItem.outerHTML;\r\n\t\t\tfirstItem.remove();\r\n\t\t} else {\r\n\t\t\tthis.bufferTemplate = firstItem.outerHTML;\r\n\t\t}\r\n\t}\r\n\r\n\tdispose() {\r\n\t\tthis.bufferTemplate = '';\r\n\t\tthis.parsedFiles = [];\r\n\t}\r\n}\r\n\r\nexport default VGFilesTemplateRender;\r\n","import VGFilesBase from \"./base\";\r\nimport FileUploader from \"./loader\";\r\nimport VGFilesDroppable from \"./droppable\";\r\nimport {getSVG} from \"../../module-fn\";\r\nimport EventHandler from \"../../../utils/js/dom/event\";\r\nimport Selectors from \"../../../utils/js/dom/selectors\";\r\nimport {isElement, normalizeData} from \"../../../utils/js/functions\";\r\nimport {Classes, Manipulator} from \"../../../utils/js/dom/manipulator\";\r\nimport {lang_buttons, lang_messages} from \"../../../utils/js/components/lang\";\r\nimport VGAlert from \"../../vgalert\";\r\nimport VGToast from \"../../vgtoast\";\r\nimport VGFilesTemplateRender from \"./render\";\r\nimport VGFilesSortable from \"./sortable\";\r\n\r\nconst NAME = 'files';\r\nconst NAME_KEY = 'vg.files';\r\n\r\nconst SELECTOR_DATA_TOGGLE = '[data-vg-toggle=\"files\"]';\r\nconst SELECTOR_DATA_RELOAD = '[data-vg-reload=\"file\"]';\r\nconst SELECTOR_DATA_DISMISS = '[data-vg-dismiss=\"file\"]';\r\nconst SELECTOR_DATA_DISMISS_ALL = '[data-vg-dismiss=\"vg-files\"]';\r\n\r\nconst CLASS_NAME_CONTAINER = 'vg-files';\r\nconst CLASS_NAME_STAT = `${CLASS_NAME_CONTAINER}-stat`;\r\nconst CLASS_NAME_COMPLETED = 'completed';\r\nconst CLASS_NAME_PENDING = 'pending';\r\nconst CLASS_NAME_LOADING = 'loading';\r\nconst CLASS_NAME_FAILING = 'failing';\r\nconst CLASS_NAME_LOADED = 'loaded';\r\n\r\nclass VGFiles extends VGFilesBase {\r\n constructor(element, params = {}) {\r\n const defaults = {\r\n init: true,\r\n allowed: false,\r\n lang: document.documentElement.lang || 'ru',\r\n limits: { count: 0, sizes: 10, total: 0 },\r\n image: false,\r\n detach: true,\r\n info: true,\r\n types: [],\r\n ajax: false,\r\n prepend: true,\r\n replace: true,\r\n rename: false,\r\n smartdrop: false,\r\n uploads: {\r\n mode: 'sequential',\r\n route: '',\r\n maxParallel: 3,\r\n maxConcurrent: 1,\r\n retryAttempts: 1,\r\n retryDelay: 1000,\r\n },\r\n removes: {\r\n buttons: null,\r\n all: { route: '', alert: true, toast: true, confirm: null, buttons: null },\r\n single: { route: '', alert: true, toast: true, confirm: null, buttons: null }\r\n },\r\n sortable: {\r\n enabled: false,\r\n route: '',\r\n handle: '.file',\r\n lists: [`vg-files-info--list`, `vg-files-drop--list`]\r\n },\r\n callbacks: {\r\n onInit: null,\r\n onChange: null,\r\n onUploadStart: null,\r\n onUploadProgress: null,\r\n onUploadComplete: null,\r\n onUploadError: null,\r\n onUploadAllComplete: null,\r\n onRemoveFile: null,\r\n onClear: null,\r\n onReload: null\r\n }\r\n };\r\n\r\n super(element, params, defaults);\r\n\r\n this._files = [];\r\n this._uploadedKeys = new Set();\r\n this._failingUploadedKeys = new Set();\r\n this._pendingUploadedKeys = new Set();\r\n this._unUploadedFiles = [];\r\n this._uploader = null;\r\n this._sortable = null;\r\n this._render = null;\r\n\r\n this.isRenderNonInit = false;\r\n this._initExtended();\r\n }\r\n\r\n static get NAME() { return NAME; }\r\n static get NAME_KEY() { return NAME_KEY; }\r\n\r\n _initExtended() {\r\n if (!this._isInitialized) return;\r\n\r\n this._render = new VGFilesTemplateRender(this, this._element, this._params);\r\n\r\n if (this._params.ajax) {\r\n this._params.allowed = false;\r\n }\r\n\r\n if (this.isRenderNonInit) return;\r\n this.isRenderNonInit = this._render.init();\r\n\r\n const parsedFiles = this._render.parsedFiles;\r\n\r\n if (parsedFiles.length) {\r\n this._addExternalFiles(parsedFiles);\r\n }\r\n\r\n if (this._params.allowed && !this._params.ajax) this._params.detach = false;\r\n if (this._nodes.drop) {\r\n this._params.image = true;\r\n this._params.detach = true;\r\n this._setDropActiveText();\r\n\r\n VGFilesDroppable.getOrCreateInstance(this._nodes.drop, this._params).init();\r\n }\r\n\r\n this._addEventListenerExtended();\r\n this._renderStat();\r\n this._triggerCallback('onInit', { element: this._element, files: parsedFiles || [] });\r\n }\r\n\r\n _setDropActiveText() {\r\n if (!this._nodes.drop) return;\r\n\r\n const messages = lang_messages(this._params.lang, NAME) || {};\r\n const activeText = (this._nodes.drop.getAttribute('data-drop-active-text') || '').trim() || messages['drop-active'] || 'Release to upload';\r\n this._nodes.drop.setAttribute('data-drop-active-text', activeText);\r\n\r\n const title = Selectors.find('.vg-files-drop-message .title', this._nodes.drop);\r\n if (!title) return;\r\n\r\n const originalText = (title.getAttribute('data-drop-original-text') || '').trim() || (title.textContent || '').trim();\r\n title.setAttribute('data-drop-original-text', originalText);\r\n }\r\n\r\n _addExternalFiles(files) {\r\n if (!Array.isArray(files) || !files.length) return;\r\n\r\n files.forEach(fileData => {\r\n if (!fileData?.name) return;\r\n\r\n const fileOptions = {};\r\n if (typeof fileData.type === 'string') fileOptions.type = fileData.type;\r\n if (Number.isFinite(fileData.lastModified)) fileOptions.lastModified = fileData.lastModified;\r\n\r\n const file = new File([\"\"], fileData.name, fileOptions);\r\n\r\n if (fileData.id !== undefined && fileData.id !== null && fileData.id !== '') {\r\n Object.defineProperty(file, 'id', {\r\n value: fileData.id,\r\n writable: true,\r\n enumerable: true\r\n });\r\n }\r\n\r\n if (Number.isFinite(fileData.size)) {\r\n Object.defineProperty(file, 'size', {\r\n value: fileData.size,\r\n writable: true,\r\n enumerable: true\r\n });\r\n }\r\n\r\n if (fileData.src !== undefined && fileData.src !== null && fileData.src !== '') {\r\n Object.defineProperty(file, 'src', {\r\n value: fileData.src,\r\n writable: true,\r\n enumerable: true\r\n });\r\n }\r\n\r\n if (fileData.image !== undefined && fileData.image !== null && fileData.image !== '') {\r\n Object.defineProperty(file, 'image', {\r\n value: fileData.image,\r\n writable: true,\r\n enumerable: true\r\n });\r\n }\r\n\r\n if (fileData.customData && typeof fileData.customData === 'object' && !Array.isArray(fileData.customData)) {\r\n Object.defineProperty(file, 'customData', {\r\n value: fileData.customData,\r\n writable: true,\r\n enumerable: true\r\n });\r\n }\r\n\r\n const fileKey = this._getFileKey(file);\r\n\r\n // Помечаем как уже загруженные\r\n this._uploadedKeys.add(fileKey);\r\n this._pendingUploadedKeys.delete(fileKey);\r\n this._failingUploadedKeys.delete(fileKey);\r\n\r\n // Добавляем в общий список\r\n this._files.push(file);\r\n });\r\n\r\n // Перестраиваем интерфейс\r\n this._renderUI(this._files);\r\n\r\n // Обновляем статистику\r\n this._renderStat();\r\n this._updateStat();\r\n this._setStatItem('completed', this._uploadedKeys.size);\r\n\r\n // Если нужно — запустить sortable\r\n if (this._params.sortable?.enabled && this._params.sortable.route && !this._sortable) {\r\n this._sortable = new VGFilesSortable(this, this._params.sortable)\r\n }\r\n\r\n // Триггерим изменение\r\n this._triggerCallback('onChange', { files: this._files });\r\n EventHandler.trigger(this._element, `${NAME_KEY}.change`, { files: this._files });\r\n }\r\n\r\n _addEventListenerExtended() {\r\n Selectors.findAll(SELECTOR_DATA_TOGGLE, this._element).forEach(el => {\r\n if (this._onNativeInputChange) {\r\n el.removeEventListener('change', this._onNativeInputChange);\r\n }\r\n\r\n el.addEventListener('change', (e) => this._handleChange(e));\r\n });\r\n }\r\n\r\n _handleChange(e) {\r\n const input = e?.target;\r\n const inputFiles = this._snapshotInputFiles(input);\r\n this.change(input);\r\n\r\n if (this._params.ajax) this.uploadAll(this._files);\r\n\r\n const payload = {\r\n files: this._files,\r\n input: e?.target || e?.src || '',\r\n inputFiles\r\n };\r\n\r\n this._triggerCallback('onChange', payload);\r\n this._triggerEvent('change', {\r\n files: this._files,\r\n input: payload.input,\r\n inputFiles: payload.inputFiles\r\n });\r\n }\r\n\r\n _snapshotInputFiles(input) {\r\n const files = input?.files;\r\n if (!files?.length) return [];\r\n return Array.from(files);\r\n }\r\n\r\n async uploadAll(files) {\r\n if (!this._params.ajax || !this._params.uploads.route) return;\r\n\r\n if (!this._uploadedKeys.size) {\r\n this._failingUploadedKeys.clear();\r\n }\r\n\r\n const notUploadedFiles = files.filter(f => !this._uploadedKeys.has(this._getFileKey(f)));\r\n if (!notUploadedFiles.length) return;\r\n\r\n if (!this._uploader || this._uploader.isIdle()) {\r\n this._uploader = new FileUploader({\r\n mode: this._params.uploads.mode,\r\n maxConcurrent: this._params.uploads.maxConcurrent,\r\n maxParallel: this._params.uploads.maxParallel,\r\n retryAttempts: this._params.uploads.retryAttempts,\r\n retryDelay: this._params.uploads.retryDelay\r\n });\r\n\r\n this._setupUploadEventHandlers();\r\n }\r\n\r\n notUploadedFiles.forEach(file => {\r\n const fileKey = this._getFileKey(file);\r\n this._pendingUploadedKeys.add(fileKey);\r\n this._unUploadedFiles = this._unUploadedFiles.filter(f => this._getFileKey(f) !== fileKey);\r\n });\r\n\r\n this._setStatItem('pending', this._pendingUploadedKeys.size);\r\n\r\n const uploadParams = {\r\n additionalData: {\r\n timestamp: new Date().toISOString(),\r\n source: 'web_uploader',\r\n prepend: this._params.prepend\r\n }\r\n };\r\n\r\n this._triggerCallback('onUploadStart', {\r\n files: notUploadedFiles,\r\n total: notUploadedFiles.length\r\n });\r\n this._triggerEvent('upload.start', {\r\n files: notUploadedFiles,\r\n total: notUploadedFiles.length\r\n });\r\n\r\n try {\r\n await this._uploader.uploadFiles(notUploadedFiles, this._params.uploads.route, uploadParams);\r\n } catch (error) {\r\n console.error('Bulk upload failed:', error);\r\n }\r\n }\r\n\r\n async upload(file) {\r\n if (!this._params.ajax || !this._params.uploads.route) return;\r\n\r\n if (!this._uploader || this._uploader.isIdle()) {\r\n this._uploader = new FileUploader({\r\n mode: this._params.uploads.mode,\r\n maxConcurrent: this._params.uploads.maxConcurrent,\r\n maxParallel: this._params.uploads.maxParallel,\r\n retryAttempts: this._params.uploads.retryAttempts,\r\n retryDelay: this._params.uploads.retryDelay\r\n });\r\n }\r\n\r\n const fileKey = this._getFileKey(file);\r\n\r\n // Убедимся, что файл в списке ожидания\r\n if (!this._pendingUploadedKeys.has(fileKey)) {\r\n this._pendingUploadedKeys.add(fileKey);\r\n this._setStatItem('pending', this._pendingUploadedKeys.size);\r\n }\r\n\r\n // Убираем из unUploadedFiles, если был там\r\n this._unUploadedFiles = this._unUploadedFiles.filter(f => this._getFileKey(f) !== fileKey);\r\n\r\n // Обновляем UI: устанавливаем состояние \"loading\"\r\n const $item = this._getItemElement(file);\r\n if ($item) {\r\n Classes.remove($item, CLASS_NAME_FAILING);\r\n Classes.add($item, CLASS_NAME_LOADING);\r\n Classes.add($item, CLASS_NAME_PENDING);\r\n }\r\n\r\n // Настройка событий загрузки\r\n this._setupUploadEventHandlers(file);\r\n\r\n const uploadParams = {\r\n additionalData: {\r\n timestamp: new Date().toISOString(),\r\n source: 'web_uploader'\r\n }\r\n };\r\n\r\n try {\r\n await this._uploader.uploadFiles([file], this._params.uploads.route, uploadParams);\r\n } catch (error) {\r\n console.error('Upload failed:', error);\r\n // Ошибка будет обработана через onError callback\r\n }\r\n }\r\n\r\n _setupUploadEventHandlers() {\r\n if (typeof this._uploader.offAll === 'function') {\r\n this._uploader.offAll();\r\n } else {\r\n this._uploader.off('progress');\r\n this._uploader.off('complete');\r\n this._uploader.off('error');\r\n this._uploader.off('allComplete');\r\n }\r\n\r\n this._updateStat(true)\r\n\r\n this._uploader.onProgress((uploadData) => {\r\n const file = uploadData.file;\r\n const $item = this._getItemElement(file);\r\n if (!$item) return;\r\n\r\n Classes.add($item, CLASS_NAME_LOADING);\r\n Classes.add($item, CLASS_NAME_PENDING);\r\n\r\n const button = this._getButtonElement(file);\r\n if (isElement(button)) {\r\n const li = button.closest('li');\r\n if (li) {\r\n const fileRemove = Selectors.find('.file-remove', li);\r\n if (fileRemove) {\r\n fileRemove.innerHTML = '';\r\n fileRemove.appendChild(this._setButtonElement(file, true));\r\n }\r\n }\r\n }\r\n\r\n const payload = {\r\n file: uploadData.file,\r\n progress: uploadData.progress,\r\n bytesSent: uploadData.bytesSent,\r\n totalBytes: uploadData.totalBytes\r\n };\r\n\r\n this._triggerCallback('onUploadProgress', payload);\r\n this._triggerEvent('upload.progress', payload);\r\n });\r\n\r\n this._uploader.onComplete((uploadData) => {\r\n const file = uploadData.file;\r\n const fileKey = this._getFileKey(file);\r\n const $item = this._getItemElement(file);\r\n\r\n if (!$item) return;\r\n\r\n Classes.replace($item, CLASS_NAME_LOADING, CLASS_NAME_LOADED);\r\n Classes.remove($item, CLASS_NAME_PENDING);\r\n\r\n const button = this._getButtonElement(file);\r\n const id = normalizeData(uploadData.result?.response?.id) || uploadData.id || file.lastModified;\r\n file.id = id;\r\n\r\n if (isElement(button) && id) {\r\n const li = button.closest('li');\r\n if (li) {\r\n Manipulator.set(li, 'data-id', id);\r\n this._setButtonElement(file);\r\n\r\n const fileRemove = Selectors.find('.file-remove', li);\r\n if (fileRemove) {\r\n fileRemove.innerHTML = '';\r\n fileRemove.appendChild(this._setButtonElement(file, true, 'completed'));\r\n Classes.add(li, CLASS_NAME_COMPLETED);\r\n\r\n setTimeout(() => {\r\n fileRemove.innerHTML = '';\r\n fileRemove.appendChild(this._setButtonElement(file));\r\n Classes.remove(li, CLASS_NAME_COMPLETED);\r\n }, 1000);\r\n }\r\n }\r\n }\r\n\r\n this._uploadedKeys.add(fileKey);\r\n this._failingUploadedKeys.delete(fileKey);\r\n this._pendingUploadedKeys.delete(fileKey);\r\n\r\n this._setStatItem('completed', this._uploadedKeys.size);\r\n this._setStatItem('pending', this._pendingUploadedKeys.size);\r\n\r\n const payload = {\r\n file: uploadData.file,\r\n response: uploadData.result?.response,\r\n status: uploadData.result?.status,\r\n id: file.id\r\n };\r\n\r\n this._triggerCallback('onUploadComplete', payload);\r\n this._triggerEvent('upload.complete', payload);\r\n });\r\n\r\n this._uploader.onError((uploadData) => {\r\n const file = uploadData.file;\r\n const fileKey = this._getFileKey(file);\r\n const $item = this._getItemElement(file);\r\n\r\n if (!$item) return;\r\n\r\n this._uploadedKeys.delete(fileKey);\r\n this._failingUploadedKeys.add(fileKey);\r\n this._pendingUploadedKeys.delete(fileKey);\r\n this._unUploadedFiles.push(file);\r\n\r\n Classes.remove($item, CLASS_NAME_PENDING);\r\n Classes.replace($item, CLASS_NAME_LOADING, CLASS_NAME_FAILING);\r\n\r\n this._setStatItem('failing', this._failingUploadedKeys.size);\r\n this._setStatItem('pending', this._pendingUploadedKeys.size);\r\n\r\n const button = this._getButtonElement(file);\r\n if (isElement(button)) {\r\n const li = button.closest('li');\r\n if (li) {\r\n this._setButtonElement(file);\r\n\r\n const fileRemove = Selectors.find('.file-remove', li);\r\n if (fileRemove) {\r\n fileRemove.innerHTML = '';\r\n fileRemove.appendChild(this._setFailingButtons(file));\r\n Classes.add(li, CLASS_NAME_FAILING);\r\n }\r\n }\r\n }\r\n\r\n const payload = { file: uploadData.file };\r\n\r\n this._triggerCallback('onUploadError', payload);\r\n this._triggerEvent('upload.error', payload);\r\n });\r\n\r\n this._uploader.onAllComplete(() => {\r\n this._triggerEvent('upload.allComplete');\r\n this._updateStat(false);\r\n\r\n if (!this._failingUploadedKeys.size) {\r\n if (this._params.sortable?.enabled && this._params.sortable.route) {\r\n import('./sortable.js').then(module => {\r\n if (this._sortable && typeof this._sortable.destroy === 'function') {\r\n this._sortable.destroy();\r\n }\r\n\r\n this._sortable = new module.default(this, this._params.sortable);\r\n }).catch(err => {\r\n console.error('Ошибка загрузки VGFilesSortable:', err);\r\n });\r\n }\r\n }\r\n\r\n const payload = {\r\n uploaded: this._uploadedKeys.size,\r\n failed: this._failingUploadedKeys.size,\r\n total: this._files.length\r\n };\r\n\r\n this._triggerCallback('onUploadAllComplete', payload);\r\n });\r\n }\r\n\r\n reload(button) {\r\n if (!this._params.ajax || !this._params.uploads.route) return;\r\n\r\n const dataButton = Manipulator.get(button, 'data');\r\n const fileData = {\r\n name: dataButton.name,\r\n size: dataButton.size,\r\n type: dataButton.type,\r\n lastModified: dataButton['last-modified']\r\n };\r\n\r\n const fileKey = this._getFileKey(fileData);\r\n if (!this._failingUploadedKeys.has(fileKey)) return;\r\n\r\n const fileToRetry = this._unUploadedFiles.find(f => this._getFileKey(f) === fileKey);\r\n if (!fileToRetry) return;\r\n\r\n this._failingUploadedKeys.delete(fileKey);\r\n this._pendingUploadedKeys.add(fileKey);\r\n\r\n this._setStatItem('failing', this._failingUploadedKeys.size);\r\n this._setStatItem('pending', this._pendingUploadedKeys.size);\r\n\r\n const payload = {\r\n button: button,\r\n file: fileToRetry\r\n };\r\n\r\n this._triggerCallback('onReload', payload);\r\n this._triggerEvent('reload', payload);\r\n\r\n this.upload(fileToRetry);\r\n }\r\n\r\n _runAjaxRequest(paramsAjax, callback) {\r\n const previousAjax = this._params.ajax;\r\n this._params.ajax = paramsAjax;\r\n\r\n this._route((status, data) => {\r\n this._params.ajax = previousAjax;\r\n callback(status, data);\r\n });\r\n }\r\n\r\n _normalizeConfirmResult(result) {\r\n if (result === true) return { accepted: true, data: null };\r\n if (result === false || result == null) return { accepted: false, data: null };\r\n\r\n if (typeof result === 'object') {\r\n if (typeof result.accepted === 'boolean') {\r\n return { accepted: result.accepted, data: result.data ?? null };\r\n }\r\n if (Object.prototype.hasOwnProperty.call(result, 'data')) {\r\n return { accepted: true, data: result.data ?? null };\r\n }\r\n }\r\n\r\n return { accepted: Boolean(result), data: null };\r\n }\r\n\r\n _runDefaultRemoveConfirm(trigger, params) {\r\n return new Promise((resolve) => {\r\n VGAlert.confirm(trigger, {\r\n lang: params.lang,\r\n ajax: params.ajax,\r\n buttons: params.buttons,\r\n message: params.message\r\n });\r\n\r\n EventHandler.one(trigger, 'vg.alert.accept', (event) => {\r\n resolve({ accepted: true, data: event?.vgalert?.data ?? null });\r\n });\r\n\r\n EventHandler.one(trigger, 'vg.alert.reject', () => {\r\n resolve({ accepted: false, data: null });\r\n });\r\n });\r\n }\r\n\r\n _isPlainObject(value) {\r\n return value && typeof value === 'object' && !Array.isArray(value);\r\n }\r\n\r\n _mergeButtonConfigs(...configs) {\r\n return configs.reduce((acc, config) => {\r\n if (!this._isPlainObject(config)) return acc;\r\n\r\n Object.entries(config).forEach(([key, value]) => {\r\n if (this._isPlainObject(acc[key]) && this._isPlainObject(value)) {\r\n acc[key] = this._mergeButtonConfigs(acc[key], value);\r\n return;\r\n }\r\n\r\n acc[key] = Array.isArray(value) ? value.slice() : value;\r\n });\r\n\r\n return acc;\r\n }, {});\r\n }\r\n\r\n _getDefaultRemoveConfirmButtons() {\r\n return {\r\n agree: {\r\n text: lang_buttons(this._params.lang, NAME)['agree'],\r\n class: [\"btn-danger\"],\r\n },\r\n cancel: {\r\n text: lang_buttons(this._params.lang, NAME)['cancel'],\r\n class: [\"btn-outline-danger\"],\r\n },\r\n };\r\n }\r\n\r\n _getRemoveConfirmButtons(type) {\r\n return this._mergeButtonConfigs(\r\n this._getDefaultRemoveConfirmButtons(),\r\n this._params?.removes?.buttons,\r\n this._params?.removes?.[type]?.buttons\r\n );\r\n }\r\n\r\n _confirmRemove(type, trigger, ajax, message) {\r\n const buttons = this._getRemoveConfirmButtons(type);\r\n\r\n const confirmParams = {\r\n type,\r\n trigger,\r\n lang: this._params.lang,\r\n ajax,\r\n buttons,\r\n message\r\n };\r\n\r\n const customConfirm = this._params?.removes?.[type]?.confirm;\r\n if (typeof customConfirm === 'function') {\r\n return Promise.resolve(customConfirm(confirmParams, this))\r\n .then((result) => this._normalizeConfirmResult(result));\r\n }\r\n\r\n return this._runDefaultRemoveConfirm(trigger, confirmParams);\r\n }\r\n\r\n removeFile(button) {\r\n const name = normalizeData(Manipulator.get(button, 'data-name'));\r\n const size = normalizeData(Manipulator.get(button, 'data-size'));\r\n const id = normalizeData(Manipulator.get(button, 'data-id'));\r\n const emitRemove = () => {\r\n const payload = {\r\n button: button,\r\n name: name,\r\n size: size,\r\n id: id,\r\n remaining: this._files.length\r\n };\r\n\r\n this._triggerCallback('onRemoveFile', payload);\r\n this._triggerEvent('remove', payload);\r\n };\r\n\r\n const fileToRemove = this._files.find(f => f.name === name && f.size === size);\r\n if (fileToRemove) {\r\n const key = this._getFileKey(fileToRemove);\r\n this._uploadedKeys.delete(key);\r\n this._pendingUploadedKeys.delete(key);\r\n this._failingUploadedKeys.delete(key);\r\n }\r\n\r\n this._getItemElement().forEach(el => {\r\n const btn = Selectors.find('button', el);\r\n if (!btn) return;\r\n const btnId = normalizeData(Manipulator.get(btn, 'data-id'));\r\n const btnName = normalizeData(Manipulator.get(btn, 'data-name'));\r\n const btnSize = normalizeData(Manipulator.get(btn, 'data-size'));\r\n\r\n this._files.forEach(file => {\r\n if (file.name === btnName && file.size === btnSize) {\r\n file.id = btnId;\r\n }\r\n });\r\n\r\n if (fileToRemove?.name === btnName && fileToRemove?.size === btnSize) {\r\n fileToRemove.id = btnId;\r\n }\r\n });\r\n\r\n if (this._params.ajax && this._params.removes.single.route) {\r\n if (!id) {\r\n this._files = this._files.filter(f => !(f.name === name && f.size === size));\r\n this._updateStatsAfterRemove();\r\n this._files.length ? this.build() : this.clear(true);\r\n emitRemove();\r\n this._resetFileInput();\r\n return;\r\n }\r\n\r\n const routeBase = this._params.removes.single.route;\r\n const routeSeparator = routeBase.includes('?') ? '&' : '?';\r\n const route = `${routeBase}${routeSeparator}id=${encodeURIComponent(id)}`;\r\n const paramsAjax = {\r\n route: route,\r\n method: 'delete'\r\n };\r\n\r\n const _completeRemoveFile = (data) => {\r\n this._files = this._files.filter(f => !(f.name === name && f.size === size));\r\n this._updateStatsAfterRemove();\r\n\r\n if (this._files.length) {\r\n this._renderUI(this._files);\r\n } else {\r\n this.clear(true, true);\r\n }\r\n\r\n if (this._params.removes.single.toast) {\r\n VGToast.run(data?.response?.message);\r\n }\r\n\r\n emitRemove();\r\n };\r\n\r\n if (this._params.removes.single.alert) {\r\n const message = {\r\n title: lang_messages(this._params.lang, NAME)['title'],\r\n description: lang_messages(this._params.lang, NAME)['description']\r\n };\r\n\r\n this._confirmRemove('single', button, paramsAjax, message)\r\n .then((result) => {\r\n if (!result.accepted) return;\r\n\r\n if (result.data) {\r\n _completeRemoveFile(result.data);\r\n return;\r\n }\r\n\r\n this._runAjaxRequest(paramsAjax, (status, data) => {\r\n _completeRemoveFile(data);\r\n });\r\n })\r\n .catch(() => {});\r\n } else {\r\n this._runAjaxRequest(paramsAjax, (status, data) => {\r\n _completeRemoveFile(data);\r\n });\r\n }\r\n } else {\r\n this._files = this._files.filter(f => !(f.name === name && f.size === size));\r\n this._updateStatsAfterRemove();\r\n this._files.length ? this.build() : this.clear(true);\r\n emitRemove();\r\n }\r\n\r\n this._resetFileInput();\r\n }\r\n\r\n _updateStatsAfterRemove() {\r\n this._setStatItem('completed', this._uploadedKeys.size);\r\n this._setStatItem('pending', this._pendingUploadedKeys.size);\r\n this._setStatItem('failing', this._failingUploadedKeys.size);\r\n this._updateStat();\r\n }\r\n\r\n _getItemElement(file = null) {\r\n let className = `${this._getClass('info-list')}`;\r\n if (this._nodes.drop) className = `${this._getClass('drop-list')}`;\r\n\r\n if (!file) {\r\n return Selectors.findAll(\r\n `.${className} li.loaded`,\r\n this._element\r\n )\r\n } else {\r\n return Selectors.find(\r\n `.${className} li[data-name=\"${file.name}\"][data-size=\"${file.size}\"]`,\r\n this._element\r\n );\r\n }\r\n }\r\n\r\n _getButtonElement(file) {\r\n return Selectors.find(`button[data-name=\"${file.name}\"][data-size=\"${file.size}\"]`, this._element);\r\n }\r\n\r\n _setButtonElement(file, isAjax = false, status = '') {\r\n let icon = getSVG('trash'), action = 'data-vg-dismiss';\r\n if (!this._params.info) icon = getSVG('cross');\r\n if (isAjax) {\r\n icon = getSVG('spinner');\r\n if (status === 'completed') icon = getSVG('check');\r\n else action = 'data-vg-reload';\r\n }\r\n\r\n return this._tpl.button([\r\n this._tpl.i({}, icon, { isHTML: true })\r\n ], 'button', this._buildFileDataAttributes(file, {\r\n type: 'button',\r\n [action]: 'file',\r\n 'data-name': file.name,\r\n 'data-size': file.size ?? 0,\r\n 'data-type': file.type || '',\r\n 'data-last-modified': file.lastModified || '',\r\n 'data-id': file.id || ''\r\n }));\r\n }\r\n\r\n _setFailingButtons(file) {\r\n const wrapper = this._tpl.div({ class: 'file-failing-actions' }, [\r\n this._setButtonElement(file, true, 'failing'),\r\n this._setButtonElement(file)\r\n ]);\r\n\r\n return wrapper;\r\n }\r\n\r\n _renderStat() {\r\n if (!this._nodes.stat) return;\r\n if (!this._params.ajax) return;\r\n\r\n const $progress = Selectors.find(`.${CLASS_NAME_STAT}-progress`, this._nodes.stat);\r\n if (!$progress) return;\r\n\r\n let $statList = Selectors.find(`.${CLASS_NAME_STAT}-progress-list`, $progress);\r\n if (!$statList) {\r\n $statList = this._tpl.ul([\r\n this._tpl.li({\r\n class: 'stat-item pending',\r\n 'data-count': '0',\r\n 'title': lang_messages(this._params.lang, NAME)['pending']\r\n }, [\r\n this._tpl.span({ class: 'stat-label' }, getSVG('cloud-dot'), { isHTML: true }),\r\n this._tpl.span({ class: 'stat-value' }, 0),\r\n ]),\r\n this._tpl.li({\r\n class: 'stat-item completed',\r\n 'data-count': '0',\r\n 'title': lang_messages(this._params.lang, NAME)['completed']\r\n }, [\r\n this._tpl.span({ class: 'stat-label' }, getSVG('cloud-dot'), { isHTML: true }),\r\n this._tpl.span({ class: 'stat-value' }, 0),\r\n ]),\r\n this._tpl.li({\r\n class: 'stat-item failing',\r\n 'data-count': '0',\r\n 'title': lang_messages(this._params.lang, NAME)['failing']\r\n }, [\r\n this._tpl.span({ class: 'stat-label' }, getSVG('cloud-dot'), { isHTML: true }),\r\n this._tpl.span({ class: 'stat-value' }, 0),\r\n ])\r\n\r\n ], { class: CLASS_NAME_STAT + '-progress-list' }, true);\r\n $progress.appendChild($statList);\r\n }\r\n }\r\n\r\n _setStatItem(status, count) {\r\n if (!this._nodes.stat) return;\r\n\r\n const $item = Selectors.find(`.${CLASS_NAME_STAT}-progress-list li.${status}`, this._nodes.stat);\r\n if (!$item) return;\r\n\r\n Manipulator.set($item, 'data-count', count);\r\n const $value = Selectors.find('.stat-value', $item);\r\n if ($value) $value.innerHTML = count;\r\n }\r\n\r\n _renderUIStatusDropInfoAjax(files) {\r\n if (!this._params.ajax) return;\r\n\r\n files.forEach(file => {\r\n const $item = this._getItemElement(file);\r\n if (!$item) return;\r\n\r\n const key = this._getFileKey(file);\r\n if (this._uploadedKeys.has(key)) {\r\n Classes.replace($item, CLASS_NAME_PENDING, CLASS_NAME_COMPLETED);\r\n Classes.add($item, CLASS_NAME_LOADED);\r\n } else if (this._failingUploadedKeys.has(key)) {\r\n Classes.replace($item, CLASS_NAME_PENDING, CLASS_NAME_FAILING);\r\n } else {\r\n Classes.add($item, CLASS_NAME_PENDING);\r\n }\r\n });\r\n }\r\n\r\n _triggerCallback(name, data) {\r\n const cb = this._params.callbacks?.[name];\r\n if (typeof cb === 'function') {\r\n try { cb.call(this, data, this); } catch (e) { console.error(`${name} callback error:`, e); }\r\n }\r\n }\r\n\r\n _triggerEvent(suffix, payload = {}) {\r\n EventHandler.trigger(this._element, `${NAME_KEY}.${suffix}`, payload);\r\n }\r\n\r\n _getUploadedIds() {\r\n return Array.from(this._uploadedKeys).map(key => {\r\n const file = this._files.find(f => this._getFileKey(f) === key);\r\n return file?.id || null;\r\n }).filter(id => id !== null);\r\n }\r\n\r\n dispose() {\r\n if (this._sortable && typeof this._sortable.destroy === 'function') {\r\n this._sortable.destroy();\r\n }\r\n this._sortable = null;\r\n\r\n this.clear();\r\n if (this._uploader) {\r\n if (typeof this._uploader.destroy === 'function') {\r\n this._uploader.destroy();\r\n } else {\r\n if (typeof this._uploader.clear === 'function') this._uploader.clear();\r\n if (typeof this._uploader.offAll === 'function') this._uploader.offAll();\r\n }\r\n }\r\n super.dispose();\r\n }\r\n}\r\n\r\nEventHandler.on(document, `DOMContentLoaded.${NAME_KEY}.data.api`, () => {\r\n Selectors.findAll(`.${CLASS_NAME_CONTAINER}`).forEach(el => VGFiles.getOrCreateInstance(el));\r\n});\r\n\r\nEventHandler.on(document, `click.${NAME_KEY}.data.api`, SELECTOR_DATA_DISMISS, function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n if (typeof e.stopImmediatePropagation === 'function') e.stopImmediatePropagation();\r\n\r\n const target = e.target.closest(`.${CLASS_NAME_CONTAINER}`);\r\n if (target) VGFiles.getOrCreateInstance(target).removeFile(e.target.closest(SELECTOR_DATA_DISMISS));\r\n});\r\n\r\nEventHandler.on(document, `click.${NAME_KEY}.data.api`, SELECTOR_DATA_RELOAD, function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n if (typeof e.stopImmediatePropagation === 'function') e.stopImmediatePropagation();\r\n\r\n const target = e.target.closest(`.${CLASS_NAME_CONTAINER}`);\r\n if (target) VGFiles.getOrCreateInstance(target).reload(e.target.closest(SELECTOR_DATA_RELOAD));\r\n});\r\n\r\nEventHandler.on(document, `click.${NAME_KEY}.data.api`, SELECTOR_DATA_DISMISS_ALL, function (e) {\r\n const target = e.target.closest(`.${CLASS_NAME_CONTAINER}`);\r\n if (!target) return;\r\n\r\n const instance = VGFiles.getOrCreateInstance(target);\r\n\r\n if (instance._params.ajax && instance._params.removes.all.route) {\r\n e.preventDefault();\r\n\r\n const route = instance._params.removes.all.route;\r\n const paramsAjax = {\r\n route: route,\r\n method: 'post',\r\n data: { ids: instance._getUploadedIds() }\r\n };\r\n\r\n const _completeClearAll = () => {\r\n instance.clear(true, true);\r\n };\r\n\r\n if (instance._params.removes.all.alert) {\r\n const message = {\r\n title: lang_messages(instance._params.lang, NAME)['title'],\r\n description: lang_messages(instance._params.lang, NAME)['descriptions']\r\n };\r\n\r\n instance._confirmRemove('all', e.target, paramsAjax, message)\r\n .then((result) => {\r\n if (!result.accepted) return;\r\n\r\n if (result.data) {\r\n if (instance._params.removes.all.toast) {\r\n VGToast.run(result.data?.response?.message);\r\n }\r\n _completeClearAll();\r\n return;\r\n }\r\n\r\n instance._runAjaxRequest(paramsAjax, (status, data) => {\r\n if (instance._params.removes.all.toast && data?.response?.message) {\r\n VGToast.run(data.response.message);\r\n }\r\n _completeClearAll();\r\n });\r\n })\r\n .catch(() => {});\r\n } else {\r\n instance._runAjaxRequest(paramsAjax, (status, data) => {\r\n if (instance._params.removes.all.toast && data?.response?.message) {\r\n VGToast.run(data.response.message);\r\n }\r\n _completeClearAll();\r\n });\r\n }\r\n } else {\r\n instance.clear(true, true);\r\n }\r\n});\r\n\r\nexport default VGFiles;\r\n","import VGSidebar from \"./js/vgfiles\";\r\n\r\nexport default VGSidebar;","import BaseModule from \"../../base-module\";\r\nimport EventHandler from \"../../../utils/js/dom/event\";\r\nimport Selectors from \"../../../utils/js/dom/selectors\";\r\nimport {isDisabled, mergeDeepObject} from \"../../../utils/js/functions\";\r\nimport {Manipulator} from \"../../../utils/js/dom/manipulator\";\r\nimport Html from \"../../../utils/js/components/templater\";\r\n\r\n/**\r\n * Constants\r\n */\r\nconst NAME = 'hideshowpass';\r\nconst NAME_KEY = 'vg.hideshowpass';\r\nconst SELECTOR_DATA_TOGGLE= '[data-vg-toggle=\"pass\"]';\r\n\r\nconst CLASS_NAME_SHOW = 'show';\r\n\r\nconst EVENT_KEY_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;\r\n\r\nclass VGHideShowPass extends BaseModule{\r\n\tconstructor(el, params = {}) {\r\n\t\tsuper(el, params);\r\n\r\n\t\tthis._params = this._getParams(el, mergeDeepObject({\r\n\t\t\tparentClass: 'vg-form-sender--content-pass'\r\n\t\t}, params));\r\n\t}\r\n\r\n\tstatic get NAME() {\r\n\t\treturn NAME;\r\n\t}\r\n\r\n\tstatic get NAME_KEY() {\r\n\t\treturn NAME_KEY\r\n\t}\r\n\r\n\ttoggle(relatedTarget) {\r\n\t\treturn !this._isShown() ? this.show(relatedTarget) : this.hide(relatedTarget);\r\n\t}\r\n\r\n\tshow(relatedTarget) {\r\n\t\tif (relatedTarget) this._params = this._getParams(relatedTarget, this._params);\r\n\r\n\t\tthis._element.classList.add(CLASS_NAME_SHOW);\r\n\t\trelatedTarget.remove();\r\n\t\tthis.build(true);\r\n\t\tManipulator.set(this._element, 'type', 'text');\r\n\t}\r\n\r\n\thide(relatedTarget) {\r\n\t\tthis._element.classList.remove(CLASS_NAME_SHOW);\r\n\t\trelatedTarget.remove();\r\n\t\tthis.build(false);\r\n\t\tManipulator.set(this._element, 'type', 'password');\r\n\t}\r\n\r\n\t_isShown() {\r\n\t\treturn this._element.classList.contains(CLASS_NAME_SHOW);\r\n\t}\r\n\r\n\tstatic init(el, params) {\r\n\t\tlet instance = VGHideShowPass.getOrCreateInstance(el, params);\r\n\t\tinstance.build(false);\r\n\t}\r\n\r\n\tbuild(isShow = false) {\r\n\t\tlet classes = this._params.classes.join(' '), elm = '';\r\n\t\tconst HTML = Html('string');\r\n\t\tif (this._element.parentElement && this._params.parentClass) {\r\n\t\t\tthis._element.parentElement.classList.add(this._params.parentClass);\r\n\t\t}\r\n\r\n\t\tif (!isShow) {\r\n\t\t\telm = HTML.component('eye', {class: classes});\r\n\t\t} else {\r\n\t\t\telm = HTML.component('eye', {class: classes, type: 'hide'});\r\n\t\t}\r\n\r\n\t\tthis._element.insertAdjacentHTML(this._params.insert, elm);\r\n\t}\r\n}\r\n\r\n/**\r\n * Data API implementation\r\n */\r\nEventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\r\n\tconst target = Selectors.prev(this, 'input');\r\n\tif (!target) return;\r\n\r\n\tif (['A', 'AREA'].includes(this.tagName)) {\r\n\t\tevent.preventDefault()\r\n\t}\r\n\r\n\tif (isDisabled(this)) {\r\n\t\treturn\r\n\t}\r\n\r\n\tthis.setAttribute('aria-expanded', true);\r\n\r\n\tconst instance = VGHideShowPass.getOrCreateInstance(target.shift())\r\n\tinstance.toggle(this);\r\n});\r\n\r\nexport default VGHideShowPass\r\n","/**\r\n * VGFormSender Module\r\n *\r\n * Этот модуль отвечает за отправку форм с поддержкой AJAX, валидации, отображения уведомлений\r\n * (модальные окна или collapse), обработки ошибок, спиннеров для кнопок и многое другое.\r\n * Поддерживает кастомизацию через параметры и data-атрибуты.\r\n *\r\n * @class VGFormSender\r\n * @extends BaseModule\r\n *\r\n * @param {HTMLElement} element - DOM-элемент формы\r\n * @param {Object} params - Параметры инициализации\r\n *\r\n * @example\r\n * VGFormSender.init(document.getElementById('myForm'), {\r\n * ajax: {\r\n * route: '/submit',\r\n * method: 'post'\r\n * },\r\n * alert: {\r\n * type: 'modal',\r\n * enabled: true\r\n * },\r\n * callback: {\r\n * afterSuccess: (form, instance, event, data) => {\r\n * console.log('Форма успешно отправлена');\r\n * }\r\n * }\r\n * });\r\n */\r\n\r\nimport BaseModule from \"../../base-module\";\r\nimport VGModal from \"../../vgmodal/js/vgmodal\";\r\nimport VGCollapse from \"../../vgcollapse/js/vgcollapse\";\r\nimport VGToast from \"../../vgtoast/js/vgtoast\";\r\nimport VGHideShowPass from \"./hideshowpass\";\r\nimport {lang_titles, lang_messages} from \"../../../utils/js/components/lang\";\r\nimport Html from \"../../../utils/js/components/templater\";\r\nimport {Manipulator} from \"../../../utils/js/dom/manipulator\";\r\nimport EventHandler from \"../../../utils/js/dom/event\";\r\nimport Selectors from \"../../../utils/js/dom/selectors\";\r\nimport {getSVG} from \"../../module-fn\";\r\nimport {\r\n\texecute,\r\n\tisObject,\r\n\tisVisible,\r\n\tmakeRandomString,\r\n\tmergeDeepObject,\r\n\tnoop,\r\n\tnormalizeData\r\n} from \"../../../utils/js/functions\";\r\n\r\n/**\r\n * Константа: имя модуля\r\n * @type {string}\r\n */\r\nconst NAME = 'form-sender';\r\n\r\n/**\r\n * Константа: ключ модуля для использования в data-атрибутах и событиях\r\n * @type {string}\r\n */\r\nconst NAME_KEY = 'vg.fs';\r\n\r\n/**\r\n * CSS-класс для алертов\r\n * @type {string}\r\n */\r\nconst CLASS_NAME_ALERT = 'vg-form-sender-alert';\r\nconst CLASS_NAME_MODAL_STACKED = 'vg-modal-stacked';\r\n\r\n/**\r\n * Событие: успешная отправка формы\r\n * @type {string}\r\n */\r\nconst EVENT_KEY_SUCCESS = 'vg.fs.success';\r\n\r\n/**\r\n * Событие: ошибка при отправке формы\r\n * @type {string}\r\n */\r\nconst EVENT_KEY_ERROR = 'vg.fs.error';\r\n\r\n/**\r\n * Событие: перед отправкой формы\r\n * @type {string}\r\n */\r\nconst EVENT_KEY_BEFORE = 'vg.fs.before';\r\n\r\n/**\r\n * Событие: обработка нативной отправки формы\r\n * @type {string}\r\n */\r\nconst EVENT_SUBMIT_DATA_API = `submit.${NAME_KEY}.data.api`;\r\n\r\n/**\r\n * Основной класс модуля формы\r\n */\r\nclass VGFormSender extends BaseModule {\r\n\t/**\r\n\t * Создаёт экземпляр VGFormSender\r\n\t * @param {HTMLElement} element - Элемент формы\r\n\t * @param {Object} params - Параметры конфигурации\r\n\t */\r\n\tconstructor(element, params = {}) {\r\n\t\tsuper(element, params);\r\n\r\n\t\t/**\r\n\t\t * Объединённые параметры с дефолтными значениями\r\n\t\t * @type {Object}\r\n\t\t * @private\r\n\t\t */\r\n\t\tthis._params = this._getParams(element, mergeDeepObject({\r\n\t\t\tresponse: {\r\n\t\t\t\tenabled: false,\r\n\t\t\t\terrors: false,\r\n\t\t\t\ttitle: '',\r\n\t\t\t\tmessage: '',\r\n\t\t\t},\r\n\t\t\tredirect: {\r\n\t\t\t\terror: '',\r\n\t\t\t\tsuccess: ''\r\n\t\t\t},\r\n\t\t\tvalidate: false,\r\n\t\t\tsubmit: false,\r\n\t\t\tfields: [],\r\n\t\t\ttimeout: 50,\r\n\t\t\tpass: {\r\n\t\t\t\tenabled: true,\r\n\t\t\t\ttemplate: 'pass-open',\r\n\t\t\t\tclasses: ['vg-form-sender--hide-show-pass'],\r\n\t\t\t\tinsert: 'afterend'\r\n\t\t\t},\r\n\t\t\talert: {\r\n\t\t\t\tenabled: true,\r\n\t\t\t\ttype: 'modal',\r\n\t\t\t\terrors: true,\r\n\t\t\t\ttitle: true,\r\n\t\t\t\tdelay: 0,\r\n\t\t\t\tmodal: {\r\n\t\t\t\t\tcloseModalsBeforeModal: true\r\n\t\t\t\t},\r\n\t\t\t\ttoast: {\r\n\t\t\t\t\tcloseModalsBeforeToast: true\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tajax: {\r\n\t\t\t\troute: '',\r\n\t\t\t\ttarget: '',\r\n\t\t\t\tmethod: 'get',\r\n\t\t\t\ttimeout: 1000,\r\n\t\t\t\tloader: false,\r\n\t\t\t\toutput: true\r\n\t\t\t},\r\n\t\t\tclasses: {\r\n\t\t\t\tgeneral: 'vg-form-sender',\r\n\t\t\t\talertCollapse: 'vg-form-sender-collapse',\r\n\t\t\t\talertModal: 'vg-form-sender-modal',\r\n\t\t\t\tvalidation: 'needs-validation',\r\n\t\t\t\twasValidate: 'was-validated',\r\n\t\t\t\tcontent: 'vg-form-sender--content'\r\n\t\t\t},\r\n\t\t\tcallback: {\r\n\t\t\t\tafterInit: noop,\r\n\t\t\t\tafterSuccess: noop,\r\n\t\t\t\tafterError: noop,\r\n\t\t\t\tafterSend: noop,\r\n\t\t\t},\r\n\t\t\tinterceptors: {\r\n\t\t\t\tbeforeSend: () => new Promise((resolve, reject) => resolve()),\r\n\t\t\t\tsuccess: false,\r\n\t\t\t\terror: false\r\n\t\t\t},\r\n\t\t\tbutton: {\r\n\t\t\t\tenabled: true,\r\n\t\t\t\tdisabled: true,\r\n\t\t\t\tsend: 'Отправляем...',\r\n\t\t\t\tinitial: 'Отправить',\r\n\t\t\t\tspinner: {\r\n\t\t\t\t\tenabled: false,\r\n\t\t\t\t\telement: '<span class=\"spinner-border spinner-border-sm me-2\"></span>'\r\n\t\t\t\t},\r\n\t\t\t\tclick: noop,\r\n\t\t\t},\r\n\t\t\tlang: 'ru'\r\n\t\t}, params));\r\n\r\n\t\t/**\r\n\t\t * Кнопка отправки формы\r\n\t\t * @type {HTMLElement|null}\r\n\t\t * @private\r\n\t\t */\r\n\t\tthis._button = null;\r\n\r\n\t\t/**\r\n\t\t * Кэш для часто используемых элементов\r\n\t\t * @type {Map<string, any>}\r\n\t\t * @private\r\n\t\t */\r\n\t\tthis._cachedElements = new Map();\r\n\r\n\t\tthis._initElements();\r\n\t}\r\n\r\n\t/**\r\n\t * Возвращает имя модуля\r\n\t * @returns {string}\r\n\t * @static\r\n\t */\r\n\tstatic get NAME() {\r\n\t\treturn NAME;\r\n\t}\r\n\r\n\t/**\r\n\t * Возвращает ключ модуля\r\n\t * @returns {string}\r\n\t * @static\r\n\t */\r\n\tstatic get NAME_KEY() {\r\n\t\treturn NAME_KEY;\r\n\t}\r\n\r\n\t/**\r\n\t * Инициализация внутренних элементов: кнопка, поля, параметры\r\n\t * @private\r\n\t */\r\n\t_initElements() {\r\n\t\tthis._button = Selectors.find('[type=\"submit\"]', this._element) ||\r\n\t\t\tSelectors.find('[form=\"' + this._element.id + '\"]') ||\r\n\t\t\tnull;\r\n\r\n\t\tconst fields = Selectors.findAll('input, textarea, select', this._element);\r\n\t\tthis._cachedElements.set('fields', fields);\r\n\r\n\t\tthis._params.ajax.route = Manipulator.get(this._element, 'action') || this._params.ajax.route;\r\n\t\tthis._params.ajax.method = Manipulator.get(this._element, 'method') || this._params.ajax.method;\r\n\r\n\t\tthis._params.isBtnText = Manipulator.get(this._element, 'data-btn-text') !== 'false';\r\n\t\tthis._params.isJsonParse = Manipulator.get(this._element, 'data-json-parse') !== 'false';\r\n\t\tthis._params.isShowPass = Manipulator.get(this._element, 'data-show-pass') === 'true';\r\n\r\n\t\tif (this._button) {\r\n\t\t\tthis._params = this._getParams(this._button, this._params);\r\n\t\t\tthis._params.button.initial = this._button.innerHTML.trim() || this._params.button.initial;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Построение формы: добавление классов, инициализация паролей, валидации\r\n\t * @returns {VGFormSender}\r\n\t */\r\n\tbuild() {\r\n\t\tthis._element.classList.add(this._params.classes.general);\r\n\r\n\t\tconst fields = this._cachedElements.get('fields');\r\n\t\tif (fields) {\r\n\t\t\tfields.forEach((el) => {\r\n\t\t\t\tif (isVisible(el) && el.parentElement) {\r\n\t\t\t\t\tel.parentElement.classList.add(this._params.classes.content);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (this._params.validate) {\r\n\t\t\tManipulator.set(this._element, 'novalidate', '');\r\n\t\t\tthis._element.classList.add(this._params.classes.validation);\r\n\t\t}\r\n\r\n\t\tif (this._params.pass.enabled) {\r\n\t\t\t[... Selectors.findAll('input[type=\"password\"]', this._element)].forEach((el) => {\r\n\t\t\t\tVGHideShowPass.init(el, this._params.pass);\r\n\t\t\t})\r\n\t\t}\r\n\r\n\t\texecute(this._params.callback.afterInit, [this._element, this]);\r\n\r\n\t\treturn this\r\n\t}\r\n\r\n\t/**\r\n\t * Отправка формы (AJAX или нативная)\r\n\t * @param {Event} event - DOM-событие отправки\r\n\t * @param {FormData|null} data - Дополнительные данные для отправки\r\n\t */\r\n\trequest(event, data = null) {\r\n\t\tconst _this = this;\r\n\t\tconst mergeFormData = (target, source) => {\r\n\t\t\tconst replacedKeys = new Set();\r\n\t\t\tsource.forEach((value, key) => {\r\n\t\t\t\tif (!replacedKeys.has(key)) {\r\n\t\t\t\t\ttarget.delete(key);\r\n\t\t\t\t\treplacedKeys.add(key);\r\n\t\t\t\t}\r\n\t\t\t\ttarget.append(key, value);\r\n\t\t\t});\r\n\t\t\treturn target;\r\n\t\t}\r\n\r\n\t\t_this._alertBefore();\r\n\r\n\t\tconst submit = () => {\r\n\t\t\tlet formData = new FormData(_this._element);\r\n\r\n\t\t\tif (data) _this._params.ajax.data = mergeFormData(data, formData);\r\n\t\t\telse _this._params.ajax.data = formData;\r\n\r\n\t\t\t_this._route(function (status, data) {\r\n\t\t\t\texecute(_this._params.callback.afterSend, [_this._element, _this, status, data]);\r\n\r\n\t\t\t\t_this._element.classList.remove('was-validated');\r\n\r\n\t\t\t\tif (_this._params.response.enabled) {\r\n\t\t\t\t\tdata.response = _this._params.response;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (_this._params.alert.enabled) {\r\n\t\t\t\t\tif (typeof status === 'string' && status === 'error') {\r\n\t\t\t\t\t\tif (_this._params.redirect.error) {\r\n\t\t\t\t\t\t\twindow.location.href = _this._params.redirect.error;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tif (!_this._params.interceptors.error) {\r\n\t\t\t\t\t\t\t\t_this._alertError(event, data);\r\n\t\t\t\t\t\t\t\texecute(_this._params.callback.afterError, [_this._element, _this, event, data]);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\texecute(_this._params.callback.afterError, [_this._element, _this, event, data]);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else if (typeof status === 'string' && status === 'success') {\r\n\t\t\t\t\t\tif (_this._params.redirect.success) {\r\n\t\t\t\t\t\t\twindow.location.href = _this._params.redirect.success;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tif (!_this._params.interceptors.success) {\r\n\t\t\t\t\t\t\t\t_this._alertSuccess(event, data);\r\n\t\t\t\t\t\t\t\texecute(_this._params.callback.afterSuccess, [_this._element, _this, event, data]);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\texecute(_this._params.callback.afterSuccess, [_this._element, _this, event, data]);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\t_this._params.interceptors.beforeSend().then(() => {\r\n\t\t\tsubmit();\r\n\t\t}).catch(err => {\r\n\t\t\tconsole.error(err);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Действия перед отправкой формы: блокировка кнопки, триггер события\r\n\t * @private\r\n\t */\r\n\t_alertBefore() {\r\n\t\tconst _this = this;\r\n\r\n\t\tif (_this._params.alert.type === 'collapse') {\r\n\t\t\tconst collapseClass = _this._params.classes.alertCollapse;\r\n\t\t\tif (!_this._cachedElements.has('collapses') || document.querySelector('.' + collapseClass + '.show')) {\r\n\t\t\t\tconst collapses = document.getElementsByClassName(collapseClass);\r\n\t\t\t\t_this._cachedElements.set('collapses', collapses);\r\n\r\n\t\t\t\t[...collapses].forEach(function (element) {\r\n\t\t\t\t\tif (element.classList.contains('show')) {\r\n\t\t\t\t\t\tVGCollapse.getOrCreateInstance(element, { toggle: false }).hide();\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t_this._statusButton('before');\r\n\t\tEventHandler.trigger(_this._element, EVENT_KEY_BEFORE, {\r\n\t\t\tvgformsender: {\r\n\t\t\t\tself: _this\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Обработка ошибки: отображение алерта, вызов колбэка\r\n\t * @param {Event} event - DOM-событие\r\n\t * @param {Object} data - Данные ответа\r\n\t * @private\r\n\t */\r\n\t_alertError(event, data) {\r\n\t\tconst _this = this;\r\n\r\n\t\t_this._statusButton('after');\r\n\t\t_this._jsonParse(data, 'error');\r\n\t\tEventHandler.trigger(_this._element, EVENT_KEY_ERROR, {\r\n\t\t\tvgformsender: {\r\n\t\t\t\tevent: event,\r\n\t\t\t\tself: _this,\r\n\t\t\t\tdata: data\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Обработка успеха: отображение алерта, вызов колбэка\r\n\t * @param {Event} event - DOM-событие\r\n\t * @param {Object} data - Данные ответа\r\n\t * @private\r\n\t */\r\n\t_alertSuccess(event, data) {\r\n\t\tconst _this = this;\r\n\r\n\t\t_this._statusButton('after');\r\n\t\t_this._jsonParse(data, 'success');\r\n\t\tEventHandler.trigger(_this._element, EVENT_KEY_SUCCESS, {\r\n\t\t\tvgformsender: {\r\n\t\t\t\tevent: event,\r\n\t\t\t\tself: _this,\r\n\t\t\t\tdata: data\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Управление состоянием кнопки отправки\r\n\t * @param {'before'|'after'} status - Статус: до/после отправки\r\n\t * @private\r\n\t */\r\n\t_statusButton(status) {\r\n\t\tif (!this._button) return;\r\n\r\n\t\tif (status === 'before') {\r\n\t\t\tconst button = this._button;\r\n\r\n\t\t\tthis._params.button.initial = this._button.innerHTML.trim();\r\n\r\n\t\t\tif (this._params.button.spinner.enabled) {\r\n\t\t\t\tthis._button.insertAdjacentHTML('afterbegin', this._params.button.spinner.element);\r\n\t\t\t}\r\n\r\n\t\t\tif (this._params.button.enabled) {\r\n\t\t\t\tbutton.innerHTML = this._params.button.send\r\n\t\t\t}\r\n\r\n\t\t\tif (this._params.button.disabled) {\r\n\t\t\t\tManipulator.set(this._button,'disabled', 'disabled');\r\n\t\t\t}\r\n\r\n\t\t\texecute(this._params.button.click, [this, this._button, 'before'])\r\n\t\t}\r\n\r\n\t\tif (status === 'after') {\r\n\t\t\tif (this._params.button.enabled) {\r\n\t\t\t\tthis._button.innerHTML = this._params.button.initial;\r\n\t\t\t}\r\n\r\n\t\t\tif (this._params.button.disabled) {\r\n\t\t\t\tManipulator.remove(this._button,'disabled');\r\n\t\t\t}\r\n\r\n\t\t\tif (this._params.button.spinner.enabled) {\r\n\t\t\t\tlet spinner = this._button.querySelector('.spinner-border');\r\n\t\t\t\tif (spinner) spinner.remove();\r\n\t\t\t}\r\n\r\n\t\t\texecute(this._params.button.click, [this, this._button, 'after'])\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Парсинг JSON-ответа и вызов алерта\r\n\t * @param {Object} data - Данные ответа\r\n\t * @param {'success'|'error'} status - Статус ответа\r\n\t * @private\r\n\t */\r\n\t_jsonParse(data, status) {\r\n\t\tconst _this = this;\r\n\r\n\t\tif (_this._params.isJsonParse) {\r\n\t\t\t_this.alert(normalizeData(data), status);\r\n\t\t} else {\r\n\t\t\t_this.alert(data, status);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Отображение алерта в зависимости от типа (modal/collapse)\r\n\t * @param {Object|string} data - Данные для отображения\r\n\t * @param {string} status - Статус: success, error, danger и т.д.\r\n\t */\r\n\talert(data, status) {\r\n\t\tif (isObject(data)) {\r\n\t\t\tif (('code' in data) && data.code && data.code === 200) {\r\n\t\t\t\tif ('response' in data && data.response) {\r\n\t\t\t\t\tlet response = normalizeData(data.response);\r\n\t\t\t\t\tif (typeof response === 'string') {\r\n\t\t\t\t\t\tif (response.indexOf(\"Parse error\") !== -1 || response.indexOf(\"syntax error\") !== -1) {\r\n\t\t\t\t\t\t\tstatus = 'danger';\r\n\t\t\t\t\t\t\tdata = {\r\n\t\t\t\t\t\t\t\tresponse: {\r\n\t\t\t\t\t\t\t\t\ttitle: lang_titles(this._params.lang, 'errors').title,\r\n\t\t\t\t\t\t\t\t\tmessage: lang_messages(this._params.lang, 'errors').went_wrong\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tif ('errors' in response && normalizeData(response.errors)) {\r\n\t\t\t\t\t\t\tstatus = normalizeData(response.errors) ? 'danger' : 'success';\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tstatus = 'danger'\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!this._params.alert.enabled) return;\r\n\r\n\t\tif (this._params.alert.type === 'modal') {\r\n\t\t\tthis._alertModal(data, status)\r\n\t\t}\r\n\r\n\t\tif (this._params.alert.type === 'collapse') {\r\n\t\t\tthis._alertCollapse(data, status)\r\n\t\t}\r\n\r\n\t\tif (this._params.alert.type === 'toast') {\r\n\t\t\tthis._alertToast(data, status)\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Показ алерта в виде модального окна\r\n\t * @param {Object} data - Данные для отображения\r\n\t * @param {string} status - Статус (success/error)\r\n\t * @private\r\n\t */\r\n\t_alertModal(data, status) {\r\n\t\tconst _this = this;\r\n\t\tconst closeModalsBeforeModal = _this._params.alert.modal?.closeModalsBeforeModal;\r\n\t\tconst isStackedModal = !closeModalsBeforeModal && _this._hasOpenedModals();\r\n\r\n\t\tif (closeModalsBeforeModal) {\r\n\t\t\t_this._closeOpenedModals();\r\n\t\t}\r\n\r\n\t\tlet id = _this._params.classes.general + '-' + makeRandomString(),\r\n\t\t\t$modal = Selectors.find('.' + _this._params.classes.alertModal);\r\n\r\n\t\tif ($modal) $modal.remove();\r\n\r\n\t\tsetTimeout(() => {\r\n\t\t\tVGModal.init(id, {\r\n\t\t\t\tdismiss: true,\r\n\t\t\t\tclasses: {\r\n\t\t\t\t\talert: _this._params.classes.alertModal\r\n\t\t\t\t}\r\n\t\t\t}, function (self) {\r\n\t\t\t\tlet element = self._element;\r\n\t\t\t\telement.classList.add(_this._params.classes.alertModal);\r\n\t\t\t\tif (isStackedModal) {\r\n\t\t\t\t\t_this._setStackedModalState(element);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet $content = Selectors.find('.vg-modal-content', element);\r\n\t\t\t\tif ($content) $content.classList.add(CLASS_NAME_ALERT, CLASS_NAME_ALERT + '-' + status);\r\n\r\n\t\t\t\tlet $body = Selectors.find('.vg-modal-body', element);\r\n\t\t\t\tif ($body) $body.append(_this.setDataRelationStatus(element, status, data, 'modal'));\r\n\r\n\t\t\t\tself.toggle();\r\n\r\n\t\t\t\tif (_this._params.alert.delay > 0) {\r\n\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\tself.hide();\r\n\t\t\t\t\t}, _this._params.alert.delay)\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}, _this._params.timeout);\r\n\t}\r\n\r\n\t/**\r\n\t * Проверка наличия открытых модальных окон\r\n\t * @returns {boolean}\r\n\t * @private\r\n\t */\r\n\t_hasOpenedModals() {\r\n\t\treturn Boolean(Selectors.find('.modal.show, .vg-modal.show'));\r\n\t}\r\n\r\n\t/**\r\n\t * Помечает alert-modal как вторую модалку и поднимает ее над уже открытыми\r\n\t * @param {HTMLElement} element\r\n\t * @private\r\n\t */\r\n\t_setStackedModalState(element) {\r\n\t\tif (!element) return;\r\n\r\n\t\telement.classList.add(CLASS_NAME_MODAL_STACKED);\r\n\t\telement.style.zIndex = this._getNextModalZIndex();\r\n\t}\r\n\r\n\t/**\r\n\t * Вычисление z-index выше всех открытых модалок\r\n\t * @returns {string}\r\n\t * @private\r\n\t */\r\n\t_getNextModalZIndex() {\r\n\t\tconst indexes = Selectors.findAll('.modal.show, .vg-modal.show')\r\n\t\t\t.map((element) => Number.parseInt(window.getComputedStyle(element).zIndex, 10))\r\n\t\t\t.filter((index) => Number.isFinite(index));\r\n\r\n\t\treturn String((indexes.length ? Math.max(...indexes) : 1040) + 10);\r\n\t}\r\n\r\n\t/**\r\n\t * Закрытие всех открытых модальных окон\r\n\t * @private\r\n\t */\r\n\t_closeOpenedModals() {\r\n\t\t[...document.getElementsByClassName('modal')].forEach((element) => {\r\n\t\t\tif (element && element.classList.contains('show')) {\r\n\t\t\t\tif (typeof bootstrap !== 'undefined' && bootstrap.Modal?.getOrCreateInstance) {\r\n\t\t\t\t\tconst mBS = bootstrap.Modal.getOrCreateInstance(element);\r\n\t\t\t\t\tmBS.hide();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.warn(lang_messages(this._params.lang, NAME).bootstrap_not_found)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t[...document.getElementsByClassName('vg-modal')].forEach((element) => {\r\n\t\t\tif (element && element.classList.contains('show')) {\r\n\t\t\t\tconst mVG = VGModal.getOrCreateInstance(element);\r\n\t\t\t\tmVG.hide([mVG]);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Показ алерта в виде collapse\r\n\t * @param {Object} data - Данные для отображения\r\n\t * @param {string} status - Статус (success/error)\r\n\t * @private\r\n\t */\r\n\t_alertCollapse(data, status) {\r\n\t\tconst _this = this;\r\n\r\n\t\tlet $collapse = Selectors.find('.' + _this._params.classes.alertCollapse);\r\n\t\tif (!$collapse) {\r\n\t\t\t$collapse = document.createElement('div');\r\n\t\t\t$collapse.classList.add(_this._params.classes.alertCollapse);\r\n\t\t\t$collapse.classList.add('vg-collapse');\r\n\t\t\t$collapse.id = _this._params.classes.general + '-' + makeRandomString();\r\n\t\t\t$collapse.append(_this.setDataRelationStatus($collapse, status, data, 'collapse'));\r\n\r\n\t\t\t_this._element.prepend($collapse);\r\n\t\t}\r\n\r\n\t\tlet collapse = VGCollapse.getOrCreateInstance($collapse, {toggle: false});\r\n\t\tcollapse.toggle();\r\n\r\n\t\tif (_this._params.alert.delay > 0) {\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tcollapse.hide();\r\n\t\t\t}, _this._params.alert.delay)\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Показ алерта в виде toast\r\n\t * @param {Object} data - Данные для отображения\r\n\t * @param {string} status - Статус (success/error)\r\n\t * @private\r\n\t */\r\n\t_alertToast(data, status) {\r\n\t\tconst response = this._prepareAlertResponse(status, data);\r\n\t\tconst toastParams = this._getToastParams(status);\r\n\r\n\t\tif (this._params.alert.toast?.closeModalsBeforeToast) {\r\n\t\t\tthis._closeOpenedModals();\r\n\t\t}\r\n\r\n\t\tif (response.title) {\r\n\t\t\tVGToast.run([response.title, response.message], toastParams);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tVGToast.run(response.message, toastParams);\r\n\t}\r\n\r\n\t/**\r\n\t * Сборка параметров toast из alert.* и alert.toast\r\n\t * @param {string} status - Статус алерта\r\n\t * @returns {Object}\r\n\t * @private\r\n\t */\r\n\t_getToastParams(status) {\r\n\t\tconst theme = status === 'error' ? 'danger' : status;\r\n\t\tconst toastType = status === 'danger' ? 'error' : status;\r\n\t\tconst delay = this._params.alert.delay > 0 ? this._params.alert.delay : 3000;\r\n\t\tconst flatToastParams = {};\r\n\t\tconst {closeModalsBeforeToast, ...toastParams} = this._params.alert.toast || {};\r\n\t\tconst allowedKeys = [\r\n\t\t\t'static',\r\n\t\t\t'placement',\r\n\t\t\t'autohide',\r\n\t\t\t'delay',\r\n\t\t\t'enableClickToast',\r\n\t\t\t'enableButtonClose',\r\n\t\t\t'keyboard',\r\n\t\t\t'theme',\r\n\t\t\t'drag',\r\n\t\t\t'resize',\r\n\t\t\t'stack',\r\n\t\t\t'animation',\r\n\t\t\t'ajax'\r\n\t\t];\r\n\r\n\t\tallowedKeys.forEach((key) => {\r\n\t\t\tif (key in this._params.alert) {\r\n\t\t\t\tflatToastParams[key] = this._params.alert[key];\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn mergeDeepObject({\r\n\t\t\ttheme: theme || 'dark',\r\n\t\t\ttype: toastType || null,\r\n\t\t\tenableButtonClose: true,\r\n\t\t\tautohide: this._params.alert.delay > 0,\r\n\t\t\tdelay: delay\r\n\t\t}, flatToastParams, toastParams);\r\n\t}\r\n\r\n\t/**\r\n\t * Формирование содержимого алерта (заголовок, текст, иконка)\r\n\t * @param {HTMLElement} $element - Родительский элемент\r\n\t * @param {string} status - Статус (success/danger и т.д.)\r\n\t * @param {Object} data - Данные ответа\r\n\t * @param {'modal'|'collapse'} type - Тип алерта\r\n\t * @returns {HTMLElement} - DOM-элемент с контентом\r\n\t */\r\n\tsetDataRelationStatus($element, status, data, type) {\r\n\t\tlet $alert = Selectors.find('.'+ CLASS_NAME_ALERT +'-content', $element);\r\n\t\tconst response = this._prepareAlertResponse(status, data);\r\n\t\tconst title = response.title\r\n\t\t\t? Html('string').h4({class: CLASS_NAME_ALERT +'-content--title'}, response.title)\r\n\t\t\t: '';\r\n\t\tconst content = title + response.message;\r\n\r\n\t\tif (!$alert) {\r\n\t\t\tconst elm = Html('dom');\r\n\r\n\t\t\t$alert = elm.div({\r\n\t\t\t\tclass: CLASS_NAME_ALERT + '-' + type\r\n\t\t\t}, [\r\n\t\t\t\telm.div({class: CLASS_NAME_ALERT + '-content'}, [\r\n\t\t\t\t\telm.i({class: CLASS_NAME_ALERT + '-content--icon'}, getSVG(status), {isHTML: true}),\r\n\t\t\t\t\telm.div({class: CLASS_NAME_ALERT + '-content--text'}, content, {isHTML: true})\r\n\t\t\t\t]),\r\n\t\t\t]);\r\n\t\t} else {\r\n\t\t\tlet text = Selectors.find('.vg-modal-body', $element);\r\n\t\t\ttext.innerHTML = content;\r\n\t\t}\r\n\r\n\t\treturn $alert;\r\n\t}\r\n\r\n\t/**\r\n\t * Подготовка содержимого алерта\r\n\t * @param {string} status - Статус алерта\r\n\t * @param {Object|string} data - Данные ответа\r\n\t * @returns {{title: string, message: string}}\r\n\t * @private\r\n\t */\r\n\t_prepareAlertResponse(status, data) {\r\n\t\tlet response = normalizeData(data?.response) || data;\r\n\r\n\t\tif (isObject(data)) {\r\n\t\t\tif (isObject(data.response) && 'view' in data.response) {\r\n\t\t\t\treturn {\r\n\t\t\t\t\ttitle: '',\r\n\t\t\t\t\tmessage: data.response.view\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\tif (typeof response !== 'string') {\r\n\t\t\t\tif (status === 'danger') {\r\n\t\t\t\t\tresponse.title = ('title' in response) ? response.title : lang_titles(this._params.lang, 'errors').title;\r\n\r\n\t\t\t\t\tif ('code' in data && data.code !== 200) {\r\n\t\t\t\t\t\tconst messages = {\r\n\t\t\t\t\t\t\t400: lang_messages(this._params.lang, 'errors')[400],\r\n\t\t\t\t\t\t\t401: lang_messages(this._params.lang, 'errors')[401],\r\n\t\t\t\t\t\t\t403: lang_messages(this._params.lang, 'errors')[403],\r\n\t\t\t\t\t\t\t404: lang_messages(this._params.lang, 'errors')[404],\r\n\t\t\t\t\t\t\t413: lang_messages(this._params.lang, 'errors')[413],\r\n\t\t\t\t\t\t\t419: lang_messages(this._params.lang, 'errors')[419],\r\n\t\t\t\t\t\t\t422: lang_messages(this._params.lang, 'errors')[422],\r\n\t\t\t\t\t\t\t500: lang_messages(this._params.lang, 'errors')[500],\r\n\t\t\t\t\t\t\t504: lang_messages(this._params.lang, 'errors')[504],\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t\tresponse.message = messages[data.code] || lang_messages(this._params.lang, 'errors').went_wrong;\r\n\t\t\t\t\t\tresponse.title += ' (' + data.code + ')';\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ('errors' in response && this._params.alert.errors) {\r\n\t\t\t\t\t\tlet errors = normalizeData(response.errors) || null;\r\n\t\t\t\t\t\tresponse.message = [];\r\n\r\n\t\t\t\t\t\tif (isObject(errors)) {\r\n\t\t\t\t\t\t\tfor (const error in errors) {\r\n\t\t\t\t\t\t\t\tif (Array.isArray(errors[error])) {\r\n\t\t\t\t\t\t\t\t\terrors[error].forEach((text) => response.message.push(text))\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tresponse.message.push(errors[error]);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst elm = Html('string');\r\n\t\t\t\tlet message = '';\r\n\r\n\t\t\t\tif (Array.isArray(response.message)) {\r\n\t\t\t\t\tresponse.message.forEach((text) => {\r\n\t\t\t\t\t\tmessage += elm.div({\r\n\t\t\t\t\t\t\tclass: CLASS_NAME_ALERT +'-content--message'\r\n\t\t\t\t\t\t}, text);\r\n\t\t\t\t\t})\r\n\t\t\t\t} else {\r\n\t\t\t\t\tmessage = elm.div({\r\n\t\t\t\t\t\tclass: CLASS_NAME_ALERT +'-content--message'\r\n\t\t\t\t\t}, response.message);\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn {\r\n\t\t\t\t\ttitle: this._params.alert.title ? response.title || '' : '',\r\n\t\t\t\t\tmessage: message\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\ttitle: '',\r\n\t\t\tmessage: typeof response === 'string' ? response : ''\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * Статический метод инициализации формы\r\n\t * @param {HTMLElement} element - Форма\r\n\t * @param {Object} params - Параметры\r\n\t * @example\r\n\t * VGFormSender.init(formElement, { validate: true });\r\n\t */\r\n\tstatic init(element, params = {}) {\r\n\t\tconst instance = VGFormSender.getOrCreateInstance(element, params);\r\n\t\tinstance.build();\r\n\t}\r\n\r\n\t/**\r\n\t * Подписка на события кнопки формы\r\n\t * @param {string} formID - CSS-селектор формы\r\n\t * @param {Function} callback - Колбэк-функция\r\n\t * @param {'before'|'after'} status - Статус события\r\n\t * @example\r\n\t * VGFormSender.buttonClick('#myForm', (form, instance) => { ... }, 'before');\r\n\t */\r\n\tstatic buttonClick(formID, callback, status = 'before') {\r\n\t\tconst form = Selectors.find(formID);\r\n\t\tif (form) {\r\n\t\t\tconst instance = VGFormSender.getOrCreateInstance(form);\r\n\t\t\tform.addEventListener('vg.fs.' + status, e => {\r\n\t\t\t\texecute(callback, [form, instance])\r\n\t\t\t})\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Обработчик события отправки формы\r\n */\r\nEventHandler.on(document, EVENT_SUBMIT_DATA_API, function (event) {\r\n\tif (!Manipulator.has(event.target, 'data-vgformsender')) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst instance = VGFormSender.getOrCreateInstance(event.target, {});\r\n\tif (!instance) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (instance._params.validate) {\r\n\t\tif (!instance._element.checkValidity()) {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tevent.stopPropagation();\r\n\r\n\t\t\tinstance._element.classList.add(instance._params.classes.wasValidate);\r\n\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\tif (!instance._params.submit) {\r\n\t\tevent.preventDefault();\r\n\r\n\t\tconst collectData = function(data, fields) {\r\n\t\t\tfields.forEach(function(field) {\r\n\t\t\t\tif (isObject(field)) {\r\n\t\t\t\t\tlet keys = Object.keys(field);\r\n\t\t\t\t\tkeys.forEach(function(key) {\r\n\t\t\t\t\t\tlet value = normalizeData(field[key]);\r\n\r\n\t\t\t\t\t\tif (Array.isArray(value) || isObject(value)) {\r\n\t\t\t\t\t\t\tdata.append(key, JSON.stringify(value));\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tdata.append(key, value);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\treturn data;\r\n\t\t}\r\n\r\n\t\tlet data = new FormData(instance._element),\r\n\t\t\tfields = instance._params.fields;\r\n\r\n\t\tif (Array.isArray(fields) && fields.length) {\r\n\t\t\tdata = collectData(data, fields);\r\n\t\t}\r\n\r\n\t\treturn instance.request(event, data);\r\n\t}\r\n})\r\n\r\nexport default VGFormSender;\r\n\r\n","import VGFormSender from \"./js/vgformsender\";\r\n\r\nexport default VGFormSender;","/*! js-cookie v3.0.1 | MIT */\r\n\r\n'use strict';\r\n\r\n/**\r\n * Объединяет несколько объектов в один (аналог Object.assign)\r\n * @param {Object} target - целевой объект\r\n * @param {...Object} sources - источники\r\n * @returns {Object}\r\n */\r\nfunction assign(target) {\r\n\tconst sources = Array.prototype.slice.call(arguments, 1);\r\n\tsources.forEach(source => {\r\n\t\tif (!source) return;\r\n\t\tObject.keys(source).forEach(key => {\r\n\t\t\ttarget[key] = source[key];\r\n\t\t});\r\n\t});\r\n\treturn target;\r\n}\r\n\r\n/**\r\n * Конвертер для чтения и записи значений cookie\r\n */\r\nconst defaultConverter = {\r\n\t/**\r\n\t * Читает значение cookie, убирая кавычки и декодируя\r\n\t * @param {string} value\r\n\t * @param {string} key\r\n\t * @returns {string}\r\n\t */\r\n\tread: function (value) {\r\n\t\tif (value[0] === '\"') {\r\n\t\t\tvalue = value.slice(1, -1);\r\n\t\t}\r\n\t\treturn value.replace(/(%[\\dA-F]{2})+/gi, decodeURIComponent);\r\n\t},\r\n\r\n\t/**\r\n\t * Записывает значение cookie, кодируя его\r\n\t * @param {string} value\r\n\t * @param {string} key\r\n\t * @returns {string}\r\n\t */\r\n\twrite: function (value) {\r\n\t\treturn encodeURIComponent(value).replace(\r\n\t\t\t/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,\r\n\t\t\tdecodeURIComponent\r\n\t\t);\r\n\t}\r\n};\r\n\r\n/**\r\n * Инициализация функционала работы с cookie\r\n * @param {Object} converter - объект с методами read/write\r\n * @param {Object} defaultAttributes - атрибуты по умолчанию (например, path, expires)\r\n * @returns {Object} - API: set, get, remove, withAttributes, withConverter\r\n */\r\nfunction init(converter, defaultAttributes) {\r\n\t/**\r\n\t * Устанавливает cookie\r\n\t */\r\n\tfunction set(key, value, attributes) {\r\n\t\tif (typeof document === 'undefined') return;\r\n\r\n\t\t// Объединяем атрибуты: по умолчанию → экземпляр → вызов\r\n\t\tattributes = assign({}, defaultAttributes, attributes);\r\n\r\n\t\t// Обработка expires: число → дата\r\n\t\tif (typeof attributes.expires === 'number') {\r\n\t\t\tconst daysInMs = 864e5; // 24 * 60 * 60 * 1000\r\n\t\t\tattributes.expires = new Date(Date.now() + attributes.expires * daysInMs);\r\n\t\t}\r\n\r\n\t\t// Преобразуем дату в строку, если есть\r\n\t\tif (attributes.expires) {\r\n\t\t\tattributes.expires = attributes.expires.toUTCString();\r\n\t\t}\r\n\r\n\t\t// Кодируем ключ\r\n\t\tkey = encodeURIComponent(key)\r\n\t\t\t.replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent)\r\n\t\t\t.replace(/[()]/g, escape);\r\n\r\n\t\t// Формируем строку атрибутов\r\n\t\tlet stringifiedAttributes = '';\r\n\t\tObject.keys(attributes).forEach(attributeName => {\r\n\t\t\tif (!attributes[attributeName]) return;\r\n\r\n\t\t\tstringifiedAttributes += '; ' + attributeName;\r\n\r\n\t\t\t// Булевые атрибуты (например, Secure) не требуют значения\r\n\t\t\tif (attributes[attributeName] !== true) {\r\n\t\t\t\t// RFC 6265: обрезаем значение до первого `;`\r\n\t\t\t\tconst sanitizedValue = String(attributes[attributeName]).split(';')[0];\r\n\t\t\t\tstringifiedAttributes += '=' + sanitizedValue;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// Устанавливаем cookie\r\n\t\treturn (document.cookie = key + '=' + converter.write(value, key) + stringifiedAttributes);\r\n\t}\r\n\r\n\t/**\r\n\t * Получает значение cookie по ключу\r\n\t */\r\n\tfunction get(key) {\r\n\t\tif (typeof document === 'undefined' || (arguments.length && !key)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst cookies = document.cookie ? document.cookie.split('; ') : [];\r\n\t\tconst jar = {};\r\n\r\n\t\tfor (let i = 0; i < cookies.length; i++) {\r\n\t\t\tconst parts = cookies[i].split('=');\r\n\t\t\tconst value = parts.slice(1).join('=');\r\n\t\t\tconst encodedKey = parts[0];\r\n\r\n\t\t\ttry {\r\n\t\t\t\tconst foundKey = decodeURIComponent(encodedKey);\r\n\t\t\t\tjar[foundKey] = converter.read(value, foundKey);\r\n\r\n\t\t\t\t// Прерываем, если нашли нужный ключ\r\n\t\t\t\tif (key === foundKey) break;\r\n\t\t\t} catch (e) {\r\n\t\t\t\t// Игнорируем поврежденные cookie\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn key ? jar[key] : jar;\r\n\t}\r\n\r\n\t// Возвращаем API\r\n\treturn Object.create(\r\n\t\t{\r\n\t\t\tset,\r\n\t\t\tget,\r\n\t\t\t/**\r\n\t\t\t * Удаляет cookie, устанавливая срок действия в прошлое\r\n\t\t\t */\r\n\t\t\tremove: function (key, attributes) {\r\n\t\t\t\tset(key, '', assign({}, attributes, { expires: -1 }));\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Создаёт новый экземпляр с новыми атрибутами по умолчанию\r\n\t\t\t */\r\n\t\t\twithAttributes: function (attributes) {\r\n\t\t\t\treturn init(this.converter, assign({}, this.attributes, attributes));\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * Создаёт новый экземпляр с новым конвертером\r\n\t\t\t */\r\n\t\t\twithConverter: function (converter) {\r\n\t\t\t\treturn init(assign({}, this.converter, converter), this.attributes);\r\n\t\t\t}\r\n\t\t},\r\n\t\t{\r\n\t\t\tattributes: { value: Object.freeze(defaultAttributes) },\r\n\t\t\tconverter: { value: Object.freeze(converter) }\r\n\t\t}\r\n\t);\r\n}\r\n\r\n// Экспорт по умолчанию: экземпляр с атрибутом path: '/'\r\nconst Cookies = init(defaultConverter, { path: '/' });\r\n\r\nexport default Cookies;","import BaseModule from \"../../base-module\";\r\nimport { isDisabled, mergeDeepObject } from \"../../../utils/js/functions\";\r\nimport EventHandler from \"../../../utils/js/dom/event\";\r\nimport Selectors from \"../../../utils/js/dom/selectors\";\r\nimport Cookies from \"../../../utils/js/dom/cookie\";\r\nimport { dismissTrigger } from \"../../module-fn\";\r\n\r\n/**\r\n * Constants\r\n */\r\nconst NAME = 'lawcookie';\r\nconst NAME_KEY = 'vg.lawcookie';\r\n\r\nconst CLASS_NAME_SHOW = 'show';\r\n\r\nconst EVENT_KEY_HIDE = `${NAME_KEY}.hide`;\r\nconst EVENT_KEY_HIDDEN = `${NAME_KEY}.hidden`;\r\nconst EVENT_KEY_SHOW = `${NAME_KEY}.show`;\r\nconst EVENT_KEY_SHOWN = `${NAME_KEY}.shown`;\r\n\r\nconst SELECTOR_DATA_TOGGLE = '[data-vg-toggle=\"lawcookie\"]';\r\nconst SELECTOR_DATA_TOGGLE_CLEAR = '[data-vg-toggle=\"lawcookie-clear\"]';\r\nconst EVENT_KEY_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;\r\n\r\nclass VGLawCookie extends BaseModule {\r\n\t// Убрано статическое sParams — избыточно и небезопасно\r\n\r\n\tconstructor(element, params = {}) {\r\n\t\tsuper(element, params);\r\n\r\n\t\tthis._params = this._getParams(element, mergeDeepObject({\r\n\t\t\tstorage: 'local', // 'cookie' или 'local'\r\n\t\t\tdelay: 500,\r\n\t\t\tcookie: {\r\n\t\t\t\tname: 'lawCookie',\r\n\t\t\t\tvalue: 'yes',\r\n\t\t\t\tattributes: {}\r\n\t\t\t},\r\n\t\t\tanimation: {\r\n\t\t\t\tenable: true,\r\n\t\t\t\tin: 'animate__fadeInUp',\r\n\t\t\t\tout: 'animate__fadeOutDown',\r\n\t\t\t\tdelay: 800,\r\n\t\t\t},\r\n\t\t\tajax: {\r\n\t\t\t\troute: '',\r\n\t\t\t\ttarget: '',\r\n\t\t\t\tmethod: 'get',\r\n\t\t\t\tloader: false,\r\n\t\t\t\tonce: false,\r\n\t\t\t\toutput: true,\r\n\t\t\t}\r\n\t\t}, params));\r\n\r\n\t\t// Инициализация хранилища сразу в конструкторе\r\n\t\tthis._storage = this._createStorage();\r\n\r\n\t\t// Настройка анимации\r\n\t\tthis._params.animation.delay = this._params.animation.enable ? this._params.animation.delay : 0;\r\n\t\tthis._animation(this._element, VGLawCookie.NAME_KEY, this._params.animation);\r\n\t}\r\n\r\n\tstatic get NAME() {\r\n\t\treturn NAME;\r\n\t}\r\n\r\n\tstatic get NAME_KEY() {\r\n\t\treturn NAME_KEY;\r\n\t}\r\n\r\n\t/**\r\n\t * Проверяет, было ли дано согласие\r\n\t * @returns {boolean}\r\n\t * @private\r\n\t */\r\n\t_isConsented() {\r\n\t\treturn this._storage.get() === this._params.cookie.value;\r\n\t}\r\n\r\n\t/**\r\n\t * Переключает отображение: показать, если ещё нет согласия\r\n\t */\r\n\ttoggle() {\r\n\t\treturn this._isConsented() ? this.hide() : this.show();\r\n\t}\r\n\r\n\t/**\r\n\t * Показать баннер\r\n\t */\r\n\tshow() {\r\n\t\tif (isDisabled(this._element) || this._isConsented()) return;\r\n\r\n\t\tconst showEvent = EventHandler.trigger(this._element, EVENT_KEY_SHOW);\r\n\t\tif (showEvent.defaultPrevented) return;\r\n\r\n\t\tthis._element.classList.add(CLASS_NAME_SHOW);\r\n\r\n\t\tconst completeCallback = () => {\r\n\t\t\tEventHandler.trigger(this._element, EVENT_KEY_SHOWN);\r\n\t\t};\r\n\r\n\t\tthis._queueCallback(completeCallback, this._element, true, this._params.delay);\r\n\t}\r\n\r\n\t/**\r\n\t * Скрыть баннер и сохранить согласие\r\n\t */\r\n\thide() {\r\n\t\tconst hideEvent = EventHandler.trigger(this._element, EVENT_KEY_HIDE);\r\n\t\tif (hideEvent.defaultPrevented) return;\r\n\r\n\t\tthis._element.classList.remove(CLASS_NAME_SHOW);\r\n\r\n\t\tconst completeCallback = () => {\r\n\t\t\tEventHandler.trigger(this._element, EVENT_KEY_HIDDEN);\r\n\t\t};\r\n\r\n\t\tthis._queueCallback(completeCallback, this._element, true, this._params.animation.delay);\r\n\t}\r\n\r\n\t/**\r\n\t * Создаёт объект хранилища с унифицированным API\r\n\t * @returns {{get: () => string|null, set: () => void}}\r\n\t * @private\r\n\t */\r\n\t_createStorage() {\r\n\t\tconst { name, value, attributes } = this._params.cookie;\r\n\r\n\t\tif (this._params.storage === 'cookie') {\r\n\t\t\treturn {\r\n\t\t\t\tget: () => Cookies.get(name),\r\n\t\t\t\tset: () => Cookies.set(name, value, attributes)\r\n\t\t\t};\r\n\t\t} else {\r\n\t\t\treturn {\r\n\t\t\t\tget: () => localStorage.getItem(name),\r\n\t\t\t\tset: () => localStorage.setItem(name, value)\r\n\t\t\t};\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Сохраняет согласие\r\n\t */\r\n\taccept() {\r\n\t\tthis._storage.set();\r\n\t}\r\n\r\n\t/**\r\n\t * Полный сброс согласия\r\n\t */\r\n\tstatic reset() {\r\n\t\tCookies.remove(VGLawCookie.getDefaultParams().cookie.name);\r\n\t\tlocalStorage.clear();\r\n\t\tlocation.reload();\r\n\t}\r\n\r\n\t/**\r\n\t * Возвращает дефолтные параметры (для доступа без инстанса)\r\n\t */\r\n\tstatic getDefaultParams() {\r\n\t\treturn mergeDeepObject({\r\n\t\t\tcookie: { name: 'lawCookie' }\r\n\t\t}, {});\r\n\t}\r\n\r\n\tdispose() {\r\n\t\tCookies.remove(VGLawCookie.getDefaultParams().cookie.name);\r\n\t\tlocalStorage.clear();\r\n\t\tsuper.dispose();\r\n\t}\r\n\r\n\t/**\r\n\t * Инициализация модуля\r\n\t * @param {Element} element\r\n\t * @param {Object} params\r\n\t */\r\n\tstatic init(element, params = {}) {\r\n\t\tconst instance = VGLawCookie.getOrCreateInstance(element, params);\r\n\t\tinstance.toggle();\r\n\t}\r\n}\r\n\r\n// Подключение поведения закрытия через триггер\r\ndismissTrigger(VGLawCookie);\r\n\r\n// Обработка кнопки принятия согласия\r\nEventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\r\n\tif (['A', 'AREA'].includes(this.tagName)) {\r\n\t\tevent.preventDefault();\r\n\t}\r\n\r\n\tif (isDisabled(this)) return;\r\n\r\n\tconst element = Selectors.find('#vg-lawcookie');\r\n\tif (!element) return;\r\n\r\n\tconst instance = VGLawCookie.getOrCreateInstance(element);\r\n\tinstance.accept(); // Сохраняем согласие\r\n\tinstance.hide(); // Скрываем баннер\r\n});\r\n\r\n// Обработка кнопки сброса\r\nEventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE_CLEAR, function (event) {\r\n\tif (['A', 'AREA'].includes(this.tagName)) {\r\n\t\tevent.preventDefault();\r\n\t}\r\n\r\n\tif (isDisabled(this)) return;\r\n\r\n\tconst element = Selectors.find('#vg-lawcookie');\r\n\tif (!element) return;\r\n\r\n\tconst instance = VGLawCookie.getOrCreateInstance(element);\r\n\tinstance.dispose();\r\n\tVGLawCookie.reset(); // Полный сброс\r\n});\r\n\r\nexport default VGLawCookie;","import VGLawCookie from \"./js/vglawcookie\";\r\n\r\nexport default VGLawCookie;","import BaseModule from \"../../base-module\";\r\nimport EventHandler from \"../../../utils/js/dom/event\";\r\nimport { execute, isObject, mergeDeepObject, normalizeData } from \"../../../utils/js/functions\";\r\nimport Selectors from \"../../../utils/js/dom/selectors\";\r\nimport { Manipulator } from \"../../../utils/js/dom/manipulator\";\r\nimport { lang_buttons } from \"../../../utils/js/components/lang\";\r\n\r\n/**\r\n * @typedef {Object} VGLoadMoreParams\r\n * @property {string} [lang='ru'] - Язык интерфейса (используется для локализации)\r\n * @property {number} limit - Количество элементов, загружаемых за один раз\r\n * @property {number} offset - Начальный сдвиг при загрузке\r\n * @property {boolean} output - Вставлять ли ответ в DOM\r\n * @property {boolean} autohide - Автоматически скрывать/удалять кнопку при достижении конца\r\n * @property {boolean} animate - Анимировать появление новых элементов\r\n * @property {string} append - Позиция вставки: 'after' (в конец) или 'before' (в начало)\r\n * @property {string} mode - Режим загрузки: 'button' или 'scroll'\r\n * @property {number} threshold - Отступ в пикселях для срабатывания при прокрутке\r\n * @property {boolean} debug - Включить отладочные сообщения в консоли\r\n * @property {boolean} detach - Удалять кнопку из DOM после использования\r\n * @property {Object} button - Настройки кнопки\r\n * @property {string} button.text - Текст кнопки по умолчанию\r\n * @property {string} button.send - Текст во время AJAX-загрузки\r\n * @property {string} button.show - Текст во время статической загрузки\r\n * @property {boolean} button.loader - Показывать лоадер\r\n * @property {string[]} button.classes - CSS-классы кнопки\r\n * @property {Object} ajax - Настройки AJAX-запроса\r\n * @property {string} ajax.route - URL для загрузки данных\r\n * @property {string} ajax.target - Селектор контейнера для вставки\r\n * @property {string} ajax.method - HTTP-метод ('get', 'post')\r\n * @property {boolean} ajax.loader - Использовать лоадер\r\n * @property {boolean} ajax.once - Загружать только один раз\r\n * @property {boolean} ajax.output - Выводить ли ответ\r\n * @property {Object} ajax.data - Дополнительные данные для запроса\r\n */\r\n\r\n/**\r\n * @class VGLoadMore\r\n * @extends BaseModule\r\n * @description\r\n * Модуль подгрузки контента по кнопке или при прокрутке.\r\n * Поддерживает как статическую подгрузку скрытых элементов из DOM,\r\n * так и AJAX-загрузку с сервера. Имеет гибкую настройку через data-атрибуты,\r\n * поддержку языков, анимаций и отладку.\r\n *\r\n * @example\r\n * <!-- Простая подгрузка по кнопке -->\r\n * <div data-vgloadmore data-limit=\"3\" data-elements=\"item\">\r\n * <div class=\"item vg-collapse\">Элемент 1</div>\r\n * <div class=\"item vg-collapse\">Элемент 2</div>\r\n * ...\r\n * </div>\r\n *\r\n * @example\r\n * <!-- AJAX-подгрузка при прокрутке -->\r\n * <div data-vgloadmore\r\n * data-ajax-route=\"/api/load\"\r\n * data-mode=\"scroll\"\r\n * data-threshold=\"200\">\r\n * </div>\r\n */\r\n\r\nconst NAME = 'loadmore';\r\nconst NAME_KEY = 'vg.' + NAME;\r\nconst SELECTOR_DATA_TOGGLE = '[data-vg-toggle=\"loadmore\"]';\r\nconst SELECTOR_DATA_MODULE = '[data-vgloadmore]';\r\n\r\nconst EVENT_KEY_LOADED = `${NAME_KEY}.loaded`;\r\nconst EVENT_KEY_BEFORE_LOAD = `${NAME_KEY}.before.load`;\r\nconst CLASS_NAME_HIDE = 'vg-collapse';\r\nconst CLASS_NAME_SHOW = 'show';\r\nconst EVENT_KEY_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;\r\n\r\nclass VGLoadMore extends BaseModule {\r\n\t/**\r\n\t * Имя модуля\r\n\t * @type {string}\r\n\t */\r\n\tstatic get NAME() { return NAME; }\r\n\r\n\t/**\r\n\t * Ключ события модуля\r\n\t * @type {string}\r\n\t */\r\n\tstatic get NAME_KEY() { return NAME_KEY; }\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\tconstructor(element, params) {\r\n\t\tsuper(element, params);\r\n\r\n\t\t/**\r\n\t\t * Параметры модуля\r\n\t\t * @type {VGLoadMoreParams}\r\n\t\t * @private\r\n\t\t */\r\n\t\tthis._params = this._getParams(element, mergeDeepObject({\r\n\t\t\tlang: document.documentElement.lang || 'ru',\r\n\t\t\tlimit: 0,\r\n\t\t\toffset: 0,\r\n\t\t\toutput: true,\r\n\t\t\tautohide: true,\r\n\t\t\tanimate: false,\r\n\t\t\tappend: 'after',\r\n\t\t\tmode: 'button',\r\n\t\t\tthreshold: 100,\r\n\t\t\tdebug: false,\r\n\t\t\tdetach: false,\r\n\t\t\tbutton: {\r\n\t\t\t\ttext: '',\r\n\t\t\t\tsend: 'Загружаю...',\r\n\t\t\t\tshow: 'Показываю...',\r\n\t\t\t\tloader: false,\r\n\t\t\t\tclasses: []\r\n\t\t\t},\r\n\t\t\tajax: {\r\n\t\t\t\troute: '',\r\n\t\t\t\ttarget: '',\r\n\t\t\t\tmethod: 'get',\r\n\t\t\t\tloader: false,\r\n\t\t\t\tonce: false,\r\n\t\t\t\toutput: false,\r\n\t\t\t\tdata: {}\r\n\t\t\t}\r\n\t\t}, params));\r\n\r\n\t\t/**\r\n\t\t * Обсервер пересечения (для режима scroll)\r\n\t\t * @type {IntersectionObserver|null}\r\n\t\t * @private\r\n\t\t */\r\n\t\tthis._observer = null;\r\n\r\n\t\t/**\r\n\t\t * Режим прокрутки включён\r\n\t\t * @type {boolean}\r\n\t\t * @private\r\n\t\t */\r\n\t\tthis._isScrollMode = this._params.mode === 'scroll';\r\n\r\n\t\t/**\r\n\t\t * Элемент является триггером (имеет data-vg-toggle)\r\n\t\t * @type {boolean}\r\n\t\t * @private\r\n\t\t */\r\n\t\tthis._isToggleElement = element.hasAttribute('data-vg-toggle');\r\n\r\n\t\t// Локализация текстов кнопок\r\n\t\tthis._params.button.send = lang_buttons(this._params.lang, NAME)['send'];\r\n\t\tthis._params.button.show = lang_buttons(this._params.lang, NAME)['show'];\r\n\r\n\t\tif (!this._params.button.text) {\r\n\t\t\tthis._params.button.text = this._isToggleElement\r\n\t\t\t\t? this._element.innerHTML.trim() || lang_buttons(this._params.lang, NAME)['text-ajax']\r\n\t\t\t\t: this._params.ajax.route ? lang_buttons(this._params.lang, NAME)['text-ajax'] : lang_buttons(this._params.lang, NAME)['text-more'];\r\n\t\t}\r\n\r\n\t\tif (this._isToggleElement) {\r\n\t\t\tthis._initializeAsButton();\r\n\t\t} else {\r\n\t\t\tthis._initializeContainer();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Инициализация, если элемент — кнопка-триггер\r\n\t * @private\r\n\t */\r\n\t_initializeAsButton() {\r\n\t\tif (this._isScrollMode) {\r\n\t\t\tthis._initScrollMode();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Инициализация контейнера с элементами\r\n\t * @private\r\n\t */\r\n\t_initializeContainer() {\r\n\t\tconst { elements: itemClass, limit } = this._params;\r\n\t\tconst container = this._element;\r\n\t\tconst items = Selectors.findAll(`.${itemClass}`, container);\r\n\r\n\t\tif (!this._params.ajax.route && (items.length <= limit || this._params.offset >= items.length)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\titems.forEach((item, i) => {\r\n\t\t\titem.classList.toggle(CLASS_NAME_SHOW, i < limit);\r\n\t\t\titem.classList.toggle(CLASS_NAME_HIDE, i >= limit);\r\n\t\t});\r\n\r\n\t\tif (this._params.mode === 'button') {\r\n\t\t\tthis._createAndInsertButton(container);\r\n\t\t} else if (this._isScrollMode) {\r\n\t\t\tthis._initScrollMode();\r\n\t\t}\r\n\r\n\t\tif (this._params.offset === 0) {\r\n\t\t\tthis._params.offset = limit;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Создаёт и вставляет кнопку управления\r\n\t * @param {HTMLElement} container - Контейнер, рядом с которым вставляется кнопка\r\n\t * @private\r\n\t */\r\n\t_createAndInsertButton(container) {\r\n\t\tconst button = document.createElement('button');\r\n\t\tconst buttonText = normalizeData(container.dataset.buttonText) || this._params.button.text;\r\n\r\n\t\tconst buttonData = {\r\n\t\t\tlimit: this._params.limit,\r\n\t\t\toffset: this._params.offset,\r\n\t\t\toutput: this._params.output,\r\n\t\t\tautohide: this._params.autohide,\r\n\t\t\tanimate: this._params.animate,\r\n\t\t\tappend: this._params.append,\r\n\t\t\tmode: this._params.mode,\r\n\t\t\tthreshold: this._params.threshold,\r\n\t\t\tdebug: this._params.debug,\r\n\t\t\tdetach: this._params.detach,\r\n\t\t\telements: this._params.elements,\r\n\t\t\t'vg-toggle': 'loadmore',\r\n\t\t\ttarget: `#${container.id}`\r\n\t\t};\r\n\r\n\t\tObject.assign(buttonData, normalizeData(container.dataset.params));\r\n\r\n\t\tObject.keys(buttonData).forEach(key => {\r\n\t\t\tManipulator.set(button, `data-${key}`, buttonData[key]);\r\n\t\t});\r\n\r\n\t\tbutton.textContent = buttonText;\r\n\t\tbutton.classList.add(...this._params.button.classes);\r\n\r\n\t\tcontainer.parentNode.insertBefore(button, container.nextSibling);\r\n\t}\r\n\r\n\t/**\r\n\t * Инициализирует режим прокрутки\r\n\t * @private\r\n\t */\r\n\t_initScrollMode() {\r\n\t\tthis._setupIntersectionObserver();\r\n\t\tthis._observeLastVisibleItem();\r\n\t}\r\n\r\n\t/**\r\n\t * Настраивает IntersectionObserver для отслеживания видимости последнего элемента\r\n\t * @private\r\n\t */\r\n\t_setupIntersectionObserver() {\r\n\t\tif (this._observer) return;\r\n\r\n\t\tthis._observer = new IntersectionObserver((entries) => {\r\n\t\t\tentries.forEach(entry => {\r\n\t\t\t\tif (entry.isIntersecting) {\r\n\t\t\t\t\tthis._params.debug && console.log('[VGLoadMore] Пересечение — вызов toggle');\r\n\t\t\t\t\tthis.toggle();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}, {\r\n\t\t\troot: null,\r\n\t\t\trootMargin: `0px 0px ${this._params.threshold}px 0px`,\r\n\t\t\tthreshold: 0.1\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Начинает отслеживание последнего видимого элемента\r\n\t * @private\r\n\t */\r\n\t_observeLastVisibleItem() {\r\n\t\tif (!this._observer) return;\r\n\r\n\t\tthis._observer.disconnect();\r\n\r\n\t\tconst container = Selectors.find(this._params.target) || this._element.parentNode;\r\n\t\tconst items = Selectors.findAll(`.${this._params.elements}`, container);\r\n\t\tconst visibleItems = items.filter(item => item.classList.contains(CLASS_NAME_SHOW));\r\n\t\tconst lastVisible = visibleItems[visibleItems.length - 1];\r\n\r\n\t\tif (lastVisible instanceof Element) {\r\n\t\t\tthis._observer.observe(lastVisible);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Основной метод подгрузки — вызывается по клику или при прокрутке\r\n\t * @param {Function} [callback] - Колбэк, вызываемый после загрузки\r\n\t * @fires VGLoadMore#vg.loadmore.before.load\r\n\t * @fires VGLoadMore#vg.loadmore.loaded\r\n\t * @public\r\n\t */\r\n\ttoggle(callback) {\r\n\t\tthis._params.debug && console.log('[VGLoadMore] toggle()');\r\n\r\n\t\tif (EventHandler.trigger(this._element, EVENT_KEY_BEFORE_LOAD).defaultPrevented) return;\r\n\r\n\t\tconst isButton = this._isToggleElement || (['BUTTON', 'A'].includes(this._element.tagName) && !this._isScrollMode);\r\n\t\tif (isButton) {\r\n\t\t\tthis._element.disabled = true;\r\n\t\t\tthis._element.innerHTML = this._params.ajax.route ? this._params.button.send : this._params.button.show;\r\n\t\t}\r\n\r\n\t\tthis._params.ajax.route ? this.ajax(callback) : this.staticLoad(callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Выполняет AJAX-запрос для подгрузки данных\r\n\t * @param {Function} [callback] - Колбэк после завершения\r\n\t * @private\r\n\t */\r\n\tajax(callback) {\r\n\t\tconst targetSelector = this._params.ajax.target?.trim();\r\n\t\tlet targetEl = null;\r\n\r\n\t\tif (targetSelector) {\r\n\t\t\ttargetEl = Selectors.find(targetSelector);\r\n\t\t} else {\r\n\t\t\ttargetEl = this._element;\r\n\t\t}\r\n\r\n\t\tif (!targetEl) {\r\n\t\t\tconsole.error('[VGLoadMore] target элемент не найден:', this._params.ajax.target);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst originalText = this._params.button.text;\r\n\r\n\t\tthis._params.ajax.data = { limit: this._params.limit, offset: this._params.offset };\r\n\r\n\t\tthis._route((status, data, responseTarget) => {\r\n\t\t\tif (status === 'error' || typeof data?.response !== 'string') return;\r\n\r\n\t\t\tif (this._params.output) {\r\n\t\t\t\ttargetEl.insertAdjacentHTML(\r\n\t\t\t\t\tthis._params.append === 'after' ? 'beforeend' : 'afterbegin',\r\n\t\t\t\t\tdata.response\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\tthis._params.offset += this._params.limit;\r\n\t\t\tthis._restoreElementState(originalText);\r\n\t\t\tthis._observeLastVisibleItem();\r\n\r\n\t\t\tconst noMoreData = !data.response.trim();\r\n\t\t\tif (this._params.autohide && this._params.detach && noMoreData) {\r\n\t\t\t\tthis._autohideTrigger();\r\n\t\t\t}\r\n\r\n\t\t\tEventHandler.trigger(this._element, EVENT_KEY_LOADED, { stats: status, data });\r\n\t\t\texecute(callback, [this, data, responseTarget, status]);\r\n\t\t}, (error) => {\r\n\t\t\tthis._restoreElementState(originalText);\r\n\t\t\tconsole.error('[VGLoadMore] AJAX ошибка', error);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Подгружает элементы из DOM (статический режим)\r\n\t * @param {Function} [callback] - Колбэк после завершения\r\n\t * @private\r\n\t */\r\n\tstaticLoad(callback) {\r\n\t\tconst container = Selectors.find(this._params.target) || this._element.parentNode;\r\n\t\tconst items = Selectors.findAll(`.${this._params.elements}`, container);\r\n\t\tconst start = this._params.offset;\r\n\t\tconst end = start + this._params.limit;\r\n\t\tconst newItems = items.slice(start, end);\r\n\r\n\t\tif (newItems.length === 0) return;\r\n\r\n\t\tif (this._isToggleElement || (['BUTTON', 'A'].includes(this._element.tagName) && !this._isScrollMode)) {\r\n\t\t\tthis._element.disabled = true;\r\n\t\t\tthis._element.innerHTML = this._params.button.show;\r\n\t\t}\r\n\r\n\t\tnewItems.forEach(item => {\r\n\t\t\titem.classList.replace(CLASS_NAME_HIDE, CLASS_NAME_SHOW);\r\n\t\t\tif (this._params.animate) {\r\n\t\t\t\titem.style.opacity = 0;\r\n\t\t\t\trequestAnimationFrame(() => {\r\n\t\t\t\t\titem.style.transition = 'opacity 0.3s ease';\r\n\t\t\t\t\titem.style.opacity = 1;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis._params.offset = end;\r\n\t\tthis._observeLastVisibleItem();\r\n\r\n\t\tconst remaining = items.slice(end);\r\n\t\tif (this._params.autohide && this._params.detach && remaining.length === 0) {\r\n\t\t\tthis._autohideTrigger();\r\n\t\t}\r\n\r\n\t\tthis._restoreElementState(this._params.button.text);\r\n\t\texecute(callback, [this, this._element]);\r\n\t}\r\n\r\n\t/**\r\n\t * Восстанавливает состояние кнопки (включает, устанавливает текст)\r\n\t * @param {string} text - Текст кнопки\r\n\t * @private\r\n\t */\r\n\t_restoreElementState(text) {\r\n\t\tconst isButton = this._isToggleElement || this._element.tagName === 'BUTTON';\r\n\t\tif (isButton && !this._isScrollMode) {\r\n\t\t\tthis._element.disabled = false;\r\n\t\t\tthis._element.innerHTML = text;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Автоматически скрывает или удаляет элемент при завершении\r\n\t * @private\r\n\t */\r\n\t_autohideTrigger() {\r\n\t\tif (this._isScrollMode) {\r\n\t\t\tthis._observer?.disconnect();\r\n\t\t\tthis._observer = null;\r\n\t\t} else if (this._params.detach && this._element.parentNode) {\r\n\t\t\tthis._element.remove();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Полная деинициализация модуля\r\n\t * @override\r\n\t */\r\n\tdispose() {\r\n\t\tthis._observer?.disconnect();\r\n\t\tsuper.dispose();\r\n\t}\r\n}\r\n\r\n/**\r\n * Автоматическая инициализация на элементах с data-vgloadmore\r\n */\r\nEventHandler.on(document, 'DOMContentLoaded', () => {\r\n\tSelectors.findAll(SELECTOR_DATA_MODULE).forEach(el => {\r\n\t\t!el.dataset.initialized && VGLoadMore.getOrCreateInstance(el);\r\n\t\tel.dataset.initialized = 'true';\r\n\t});\r\n});\r\n\r\n/**\r\n * Обработка кликов по элементам с data-vg-toggle=\"loadmore\"\r\n */\r\nEventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\r\n\t['A', 'AREA'].includes(this.tagName) && event.preventDefault();\r\n\tVGLoadMore.getOrCreateInstance(this).toggle();\r\n});\r\n\r\nexport default VGLoadMore;","import VGLoadMore from \"./js/vgloadmore\";\r\n\r\nexport default VGLoadMore","import BaseModule from \"../../base-module\";\r\nimport Selectors from \"../../../utils/js/dom/selectors\";\r\nimport {\r\n\texecute,\r\n\tisDisabled,\r\n\tisMobileDevice,\r\n\tisVisible,\r\n\tmergeDeepObject,\r\n\tnoop,\r\n} from \"../../../utils/js/functions\";\r\nimport EventHandler from \"../../../utils/js/dom/event\";\r\nimport {Manipulator} from \"../../../utils/js/dom/manipulator\";\r\nimport Placement from \"../../../utils/js/components/placement\";\r\n\r\n/**\r\n * Constants\r\n */\r\nconst NAME = 'nav';\r\nconst NAME_KEY = 'vg.nav';\r\n\r\n/**\r\n * Constants Classes\r\n */\r\nconst CLASS_NAME = 'vg-nav';\r\nconst CLASS_NAME_SHOW = 'show';\r\nconst CLASS_NAME_FADE = 'fade';\r\nconst CLASS_NAME_ACTIVE = 'active';\r\n\r\n/**\r\n * Constants toggle\r\n */\r\nconst SELECTOR_DATA_TOGGLE = '.' + CLASS_NAME + ' a';\r\n\r\n/**\r\n * Constants Events\r\n */\r\nconst EVENT_KEY_HIDE = `${NAME_KEY}.hide`;\r\nconst EVENT_KEY_HIDDEN = `${NAME_KEY}.hidden`;\r\nconst EVENT_KEY_SHOW = `${NAME_KEY}.show`;\r\nconst EVENT_KEY_SHOWN = `${NAME_KEY}.shown`;\r\n\r\nconst EVENT_MOUSEOVER_DATA_API = `mouseover.${NAME_KEY}.data.api`;\r\nconst EVENT_MOUSEOUT_DATA_API = `mouseout.${NAME_KEY}.data.api`;\r\nconst EVENT_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;\r\nconst EVENT_KEYUP_DATA_API = `keyup.${NAME_KEY}.data.api`;\r\n\r\nclass VGNav extends BaseModule {\r\n\tconstructor(element, params = {}) {\r\n\t\tsuper(element);\r\n\r\n\t\tthis._params = this._getParams(element, mergeDeepObject({\r\n\t\t\tbreakpoint: 'lg',\r\n\t\t\tplacement: 'horizontal',\r\n\t\t\thover: true,\r\n\t\t\thoversmoothfirstlevel: {\r\n\t\t\t\tenable: false,\r\n\t\t\t\thorizontalOnly: true\r\n\t\t\t},\r\n\t\t\tanimation: {\r\n\t\t\t\tenable: true,\r\n\t\t\t\ttimeout: 700\r\n\t\t\t},\r\n\t\t\ttoggle: '<span class=\"default\"></span>',\r\n\t\t\thamburger: {\r\n\t\t\t\tenable: true,\r\n\t\t\t\talways: false,\r\n\t\t\t\ttitle: '',\r\n\t\t\t\tbody: null,\r\n\t\t\t\ttarget: '#sidebar-nav'\r\n\t\t\t},\r\n\t\t\tcallbacks: {\r\n\t\t\t\tafterInit: noop,\r\n\t\t\t\tafterClick: noop,\r\n\t\t\t}\r\n\t\t}, params));\r\n\r\n\t\tthis._classes = {\r\n\t\t\thamburgerActive: 'vg-nav-hamburger-active',\r\n\t\t\thamburgerAlways: 'vg-nav-hamburger-always',\r\n\t\t\thamburger: 'vg-nav-hamburger',\r\n\t\t\tcontainer: 'vg-nav-container',\r\n\t\t\twrapper: 'vg-nav-wrapper',\r\n\t\t\tactive: 'vg-nav-active',\r\n\t\t\texpand: 'vg-nav-expand',\r\n\t\t\tcloned: 'vg-nav-cloned',\r\n\t\t\thover: 'vg-nav-hover',\r\n\t\t\tflip: 'vg-nav-flip',\r\n\t\t\tXXXL: 'vg-nav-xxxl',\r\n\t\t\tXXL: 'vg-nav-xxl',\r\n\t\t\tXL: 'vg-nav-xl',\r\n\t\t\tLG: 'vg-nav-lg',\r\n\t\t\tMD: 'vg-nav-md',\r\n\t\t\tSM: 'vg-nav-sm',\r\n\t\t\tXS: 'vg-nav-xs'\r\n\t\t};\r\n\r\n\t\tthis._navigation = null;\r\n\t\tthis.navigation = '.' + this._classes.wrapper;\r\n\r\n\t\tif (this._params.animation.enable === false) {\r\n\t\t\tthis._params.animation.timeout = 10;\r\n\t\t}\r\n\r\n\t\tthis._openDrops = new Map();\r\n\t\tthis._pointerPosition = null;\r\n\t\tthis._handleScroll = this._handleScroll.bind(this);\r\n\t\tthis._handleResize = this._handleResize.bind(this);\r\n\t}\r\n\r\n\tstatic get NAME() {\r\n\t\treturn NAME;\r\n\t}\r\n\r\n\tstatic get NAME_KEY() {\r\n\t\treturn NAME_KEY;\r\n\t}\r\n\r\n\tget navigation() {\r\n\t\treturn this._navigation;\r\n\t}\r\n\r\n\tset navigation(el) {\r\n\t\tlet elm = Selectors.find(el, this._element);\r\n\t\tif (!elm) return;\r\n\t\tthis._navigation = elm;\r\n\t}\r\n\r\n\tbuild() {\r\n\t\tif (!this.navigation) return;\r\n\r\n\t\tlet params = this._params,\r\n\t\t\tclasses = this._classes;\r\n\r\n\t\t// Вешаем основные классы\r\n\t\tthis._element.classList.add(classes.container);\r\n\t\tthis._element.classList.add('vg-nav-' + params.placement);\r\n\r\n\t\tif (!params.hamburger.always) {\r\n\t\t\tif (!params.breakpoint) {\r\n\t\t\t\tthis._element.classList.add(classes.expand);\r\n\t\t\t} else if (params.breakpoint !== false) {\r\n\t\t\t\tthis._element.classList.add('vg-nav-' + params.breakpoint);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tthis._element.classList.add(classes.hamburgerAlways);\r\n\t\t}\r\n\r\n\t\t// Устанавливаем гамбургер, если его нет в разметке\r\n\t\tif (params.hamburger.enable) {\r\n\t\t\tlet isHamburger = !!Selectors.find('.' + classes.hamburger, this._element);\r\n\r\n\t\t\tif (!isHamburger) {\r\n\t\t\t\tconst targetSelector = params.hamburger.target || '#sidebar-nav';\r\n\t\t\t\tlet mobileNavTitle = '',\r\n\t\t\t\t\thamburger = '<span class=\"' + classes.hamburger + '--lines\"><span></span><span></span><span></span></span>';\r\n\r\n\t\t\t\tif (params.hamburger.title) {\r\n\t\t\t\t\tmobileNavTitle = '<span class=\"' + classes.hamburger + '--title\">' + params.hamburger.title + '</span>';\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (params.hamburger.body !== null) {\r\n\t\t\t\t\thamburger = params.hamburger.body;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet a = document.createElement('a');\r\n\t\t\t\ta.classList.add(classes.hamburger);\r\n\t\t\t\tManipulator.set(a, 'data-vg-toggle', 'sidebar');\r\n\t\t\t\tManipulator.set(a, 'href', targetSelector);\r\n\t\t\t\ta.innerHTML = mobileNavTitle + hamburger;\r\n\r\n\t\t\t\tthis._element.append(a);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Устанавливаем указатель дропа\r\n\t\tif (params.toggle) {\r\n\t\t\tlet $dropdown_a = [...Selectors.findAll('.dropdown > a', this._element)],\r\n\t\t\t\ttoggle = '<span class=\"toggle\">' + params.toggle + '</span>';\r\n\r\n\t\t\tif ($dropdown_a.length) {\r\n\t\t\t\t$dropdown_a.forEach(function (elem) {\r\n\t\t\t\t\tif (!elem.querySelector('.toggle') && !elem.closest('.dots')) {\r\n\t\t\t\t\t\telem.setAttribute('aria-expanded', 'false');\r\n\t\t\t\t\t\telem.insertAdjacentHTML('beforeend', toggle);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ('afterInit' in this._params.callbacks) {\r\n\t\t\texecute(this._params.callbacks.afterInit, [this]);\r\n\t\t}\r\n\t}\r\n\r\n\tshow(relatedTarget) {\r\n\t\tlet target = relatedTarget.relatedTarget;\r\n\r\n\t\tif (!target || isDisabled(target)) return;\r\n\r\n\t\tif (!target.closest('.dropdown-content')) {\r\n\t\t\ttarget.classList.add('first');\r\n\t\t}\r\n\r\n\t\tconst showEvent = EventHandler.trigger(target, EVENT_KEY_SHOW, { relatedTarget });\r\n\t\tif (showEvent.defaultPrevented) return;\r\n\r\n\t\tlet drop = Selectors.find('.dropdown-content', target),\r\n\t\t\tlink = target.firstElementChild;\r\n\r\n\t\tif (link) link.setAttribute('aria-expanded', 'true');\r\n\t\tdrop.classList.add(CLASS_NAME_SHOW);\r\n\t\ttarget.classList.add(CLASS_NAME_ACTIVE);\r\n\r\n\t\tconst $placement = new Placement({\r\n\t\t\treference: target,\r\n\t\t\tdrop: drop,\r\n\t\t\tplacement: 'bottom-start',\r\n\t\t\tfallbackPlacements: ['top-start', 'bottom-end', 'top-end'],\r\n\t\t\toffset: [0, 6],\r\n\t\t\tboundary: 'clippingParents',\r\n\t\t\tautoFlip: true,\r\n\t\t\toverflowProtection: true\r\n\t\t});\r\n\r\n\t\t$placement._setPlacement();\r\n\r\n\t\tthis._openDrops.set(drop, {\r\n\t\t\treference: target,\r\n\t\t\tplacement: $placement,\r\n\t\t\tscrollHandler: this._handleScroll,\r\n\t\t\tresizeHandler: this._handleResize\r\n\t\t});\r\n\r\n\t\twindow.addEventListener('scroll', this._handleScroll, { passive: true, capture: true });\r\n\t\twindow.addEventListener('resize', this._handleResize);\r\n\r\n\t\tconst completeCallBack = () => {\r\n\t\t\tdrop.classList.add(CLASS_NAME_FADE);\r\n\t\t\tEventHandler.trigger(target, EVENT_KEY_SHOWN, relatedTarget);\r\n\t\t};\r\n\t\tthis._queueCallback(completeCallBack, drop, true, 10);\r\n\t}\r\n\r\n\thide(relatedTarget) {\r\n\t\tconst _this = this;\r\n\t\tif ('ontouchstart' in document.documentElement) {\r\n\t\t\tfor (const element of [].concat(...document.body.children)) {\r\n\t\t\t\tEventHandler.off(element, 'mouseover', noop);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tlet element = relatedTarget.relatedTarget;\r\n\r\n\t\tif ('elm' in relatedTarget && relatedTarget.elm) {\r\n\t\t\telement = relatedTarget.elm;\r\n\t\t}\r\n\r\n\t\tif (element) {\r\n\t\t\tconst hideEvent = EventHandler.trigger(element, EVENT_KEY_HIDE);\r\n\t\t\tif (hideEvent.defaultPrevented) return;\r\n\r\n\t\t\telement.classList.remove(CLASS_NAME_ACTIVE);\r\n\r\n\t\t\tif (element.classList.contains('first')) {\r\n\t\t\t\telement.classList.remove('first');\r\n\t\t\t}\r\n\r\n\t\t\t[...Selectors.findAll('.' + CLASS_NAME_SHOW, element)].forEach(function (el, index) {\r\n\t\t\t\tel.classList.remove(CLASS_NAME_FADE);\r\n\r\n\t\t\t\tlet parent = el.closest('.dropdown');\r\n\t\t\t\tif (parent.classList.contains(CLASS_NAME_ACTIVE)) {\r\n\t\t\t\t\tparent.classList.remove(CLASS_NAME_ACTIVE);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet link = el.previousElementSibling;\r\n\t\t\t\tif (link) link.setAttribute('aria-expanded', 'false');\r\n\r\n\t\t\t\tif (index === 0) {\r\n\t\t\t\t\tconst completeCallback = () => {\r\n\t\t\t\t\t\tel.classList.remove(CLASS_NAME_SHOW);\r\n\t\t\t\t\t\tEventHandler.trigger(el, EVENT_KEY_HIDDEN, relatedTarget);\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t_this._queueCallback(completeCallback, el, true, 500);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst dropData = _this._openDrops.get(el);\r\n\t\t\t\tif (dropData) {\r\n\t\t\t\t\twindow.removeEventListener('scroll', dropData.scrollHandler, { capture: true });\r\n\t\t\t\t\twindow.removeEventListener('resize', dropData.resizeHandler);\r\n\t\t\t\t\t_this._openDrops.delete(el);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t_handleScroll() {\r\n\t\tfor (const [drop, data] of this._openDrops.entries()) {\r\n\t\t\tif (drop.offsetParent === null) {\r\n\t\t\t\tthis._cleanupDrop(drop);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tdata.placement._setPlacement();\r\n\r\n\t\t\tif (!this._isElementInViewport(drop)) {\r\n\t\t\t\tconst target = data.reference;\r\n\t\t\t\tthis.hide({ relatedTarget: target });\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t_handleResize() {\r\n\t\tfor (const [drop, data] of this._openDrops.entries()) {\r\n\t\t\tif (drop.offsetParent === null) continue;\r\n\t\t\tdata.placement._setPlacement();\r\n\t\t}\r\n\t}\r\n\r\n\t_cleanupDrop(drop) {\r\n\t\tconst dropData = this._openDrops.get(drop);\r\n\t\tif (dropData) {\r\n\t\t\twindow.removeEventListener('scroll', dropData.scrollHandler, { capture: true });\r\n\t\t\twindow.removeEventListener('resize', dropData.resizeHandler);\r\n\t\t\tthis._openDrops.delete(drop);\r\n\t\t}\r\n\t}\r\n\r\n\t_isElementInViewport(el) {\r\n\t\tconst rect = el.getBoundingClientRect();\r\n\t\tconst viewHeight = window.innerHeight || document.documentElement.clientHeight;\r\n\t\tconst viewWidth = window.innerWidth || document.documentElement.clientWidth;\r\n\r\n\t\tconst vertInView = (rect.top <= viewHeight) && ((rect.top + rect.height) >= 0);\r\n\t\tconst horInView = (rect.left <= viewWidth) && ((rect.left + rect.width) >= 0);\r\n\r\n\t\treturn vertInView && horInView;\r\n\t}\r\n\r\n\t_updatePointerPosition(event) {\r\n\t\tif (!event || typeof event.clientX !== 'number' || typeof event.clientY !== 'number') return;\r\n\t\tthis._pointerPosition = {\r\n\t\t\tx: event.clientX,\r\n\t\t\ty: event.clientY\r\n\t\t};\r\n\t}\r\n\r\n\t_isHorizontalPointerMove(event) {\r\n\t\tif (!this._pointerPosition || !event) return false;\r\n\r\n\t\tconst dx = event.clientX - this._pointerPosition.x;\r\n\t\tconst dy = event.clientY - this._pointerPosition.y;\r\n\r\n\t\treturn Math.abs(dx) > Math.abs(dy) && Math.abs(dx) > 0;\r\n\t}\r\n\r\n\t_isFirstLevelDropdown(drop) {\r\n\t\treturn !!drop && !drop.closest('.dropdown-content');\r\n\t}\r\n\r\n\t_hasDirectDropdownContent(drop) {\r\n\t\tif (!drop || !drop.children) return false;\r\n\t\treturn [...drop.children].some((child) => child.classList && child.classList.contains('dropdown-content'));\r\n\t}\r\n\r\n\t_isAdjacentDropdown(drop, relatedDrop) {\r\n\t\tif (!drop || !relatedDrop) return false;\r\n\t\tif (drop.parentElement !== relatedDrop.parentElement) return false;\r\n\t\treturn drop.previousElementSibling === relatedDrop || drop.nextElementSibling === relatedDrop;\r\n\t}\r\n\r\n\t_canSmoothSwitchFirstLevel(event, currentDrop, relatedDrop) {\r\n\t\tconst smoothParams = this._params.hoversmoothfirstlevel || {};\r\n\t\tif (!smoothParams.enable) return false;\r\n\t\tif (!currentDrop || !relatedDrop || currentDrop === relatedDrop) return false;\r\n\t\tif (!this._isFirstLevelDropdown(currentDrop) || !this._isFirstLevelDropdown(relatedDrop)) return false;\r\n\t\tif (!this._hasDirectDropdownContent(currentDrop) || !this._hasDirectDropdownContent(relatedDrop)) return false;\r\n\t\tif (!this._isAdjacentDropdown(currentDrop, relatedDrop)) return false;\r\n\t\tif (smoothParams.horizontalOnly && !this._isHorizontalPointerMove(event)) return false;\r\n\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstatic init(element, params = {}) {\r\n\t\tconst instance = VGNav.getOrCreateInstance(element, params);\r\n\t\tinstance.build();\r\n\r\n\t\tlet drops = Selectors.findAll('.dropdown', instance.navigation);\r\n\r\n\t\tif (instance._params.hover && !isMobileDevice()) {\r\n\t\t\tEventHandler.on(instance.navigation, `mousemove.${NAME_KEY}.data.api`, function (event) {\r\n\t\t\t\tinstance._updatePointerPosition(event);\r\n\t\t\t});\r\n\r\n\t\t\t[...drops].forEach(function (el) {\r\n\t\t\t\tlet currentElem = null;\r\n\r\n\t\t\t\tEventHandler.on(el, EVENT_MOUSEOVER_DATA_API, function (event) {\r\n\t\t\t\t\tif (currentElem) return;\r\n\r\n\t\t\t\t\tlet target = event.target.closest('.dropdown');\r\n\t\t\t\t\tif (!target) return;\r\n\r\n\t\t\t\t\tif (!instance.navigation.contains(target)) return;\r\n\t\t\t\t\tcurrentElem = target;\r\n\r\n\t\t\t\t\tconst previousDrop = event.relatedTarget?.closest('.dropdown');\r\n\t\t\t\t\tconst useSmoothSwitch = instance._canSmoothSwitchFirstLevel(event, target, previousDrop);\r\n\r\n\t\t\t\t\tif (!useSmoothSwitch) {\r\n\t\t\t\t\t\tVGNav.hideOpenDrops(event);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tlet relatedTarget = {\r\n\t\t\t\t\t\trelatedTarget: target\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tinstance.show(relatedTarget);\r\n\r\n\t\t\t\t\tif (useSmoothSwitch && previousDrop && previousDrop.classList.contains(CLASS_NAME_ACTIVE)) {\r\n\t\t\t\t\t\tinstance.hide({ relatedTarget: previousDrop });\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tinstance._updatePointerPosition(event);\r\n\t\t\t\t});\r\n\r\n\t\t\t\tEventHandler.on(el, EVENT_MOUSEOUT_DATA_API, function (event) {\r\n\t\t\t\t\tif (!currentElem) return;\r\n\r\n\t\t\t\t\tlet nextDrop = event.relatedTarget?.closest('.dropdown'),\r\n\t\t\t\t\t\trelatedTarget = nextDrop,\r\n\t\t\t\t\t\telm = currentElem;\r\n\r\n\t\t\t\t\twhile (relatedTarget) {\r\n\t\t\t\t\t\tif (relatedTarget === currentElem) return;\r\n\t\t\t\t\t\trelatedTarget = relatedTarget.parentNode;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (instance._canSmoothSwitchFirstLevel(event, elm, nextDrop)) {\r\n\t\t\t\t\t\tcurrentElem = null;\r\n\t\t\t\t\t\tinstance._updatePointerPosition(event);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tcurrentElem = null;\r\n\t\t\t\t\tinstance.hide({ relatedTarget: relatedTarget, elm: elm });\r\n\t\t\t\t\tinstance._updatePointerPosition(event);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tconst vgNavSidebar = document.querySelector(instance._params.hamburger.target || '#sidebar-nav');\r\n\t\tlet hamburger = instance._element.querySelector('.' + instance._classes.hamburger);\r\n\r\n\t\tif (vgNavSidebar && hamburger) {\r\n\t\t\tvgNavSidebar.addEventListener('vg.sidebar.show', function () {\r\n\t\t\t\thamburger.classList.add(instance._classes.hamburgerActive);\r\n\t\t\t});\r\n\r\n\t\t\tvgNavSidebar.addEventListener('vg.sidebar.hide', function () {\r\n\t\t\t\thamburger.classList.remove(instance._classes.hamburgerActive);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tstatic clearDrops(event) {\r\n\t\tif (event.button === 2 || (event.type === 'keyup' && event.key !== 'Tab')) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tVGNav.hideOpenDrops(event);\r\n\t}\r\n\r\n\tstatic hideOpenDrops(event) {\r\n\t\t[...Selectors.findAll('.dropdown:not(.disabled):not(:disabled).active')].forEach((el) => {\r\n\t\t\tlet target = event.target,\r\n\t\t\t\tdrop = target.closest('.dropdown');\r\n\r\n\t\t\tif (el !== drop) {\r\n\t\t\t\tconst nav = el.closest('.vg-nav');\r\n\t\t\t\tconst context = VGNav.getInstance(nav);\r\n\t\t\t\tif (!context) return;\r\n\r\n\t\t\t\tlet isFirst = !!nav.querySelector('.first'),\r\n\t\t\t\t\tdropContent = !!target.closest('.dropdown-content');\r\n\r\n\t\t\t\tif (isFirst && dropContent) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst relatedTarget = { relatedTarget: el };\r\n\r\n\t\t\t\tcontext.hide(relatedTarget);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n}\r\n\r\nEventHandler.on(document, EVENT_KEYUP_DATA_API, VGNav.clearDrops);\r\nEventHandler.on(document, EVENT_CLICK_DATA_API, VGNav.clearDrops);\r\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\r\n\tif (!Manipulator.has(this, 'aria-expanded')) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tlet nav = this.closest('.vg-nav');\r\n\tconst instance = VGNav.getOrCreateInstance(nav);\r\n\r\n\tif ('afterClick' in instance._params.callbacks) {\r\n\t\texecute(instance._params.callbacks.afterClick, [instance, event, this]);\r\n\t}\r\n\r\n\tif (instance._params.hover && !isMobileDevice()) return;\r\n\r\n\tevent.preventDefault();\r\n\r\n\tlet drop = this.parentNode;\r\n\tif (!drop) return;\r\n\r\n\tif (isDisabled(drop) || !isVisible(drop)) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tlet isFirst = !!nav.querySelector('.first'),\r\n\t\tdropContent = !!this.closest('.dropdown-content');\r\n\r\n\tif (dropContent && isFirst) {\r\n\t\tif (drop.classList.contains('active')) {\r\n\t\t\tinstance.hide({ relatedTarget: drop });\r\n\t\t\treturn;\r\n\t\t}\r\n\t} else {\r\n\t\t[...Selectors.findAll('.active', nav)].forEach(function (el) {\r\n\t\t\tinstance.hide({ relatedTarget: el });\r\n\t\t});\r\n\t}\r\n\r\n\tinstance.show({ relatedTarget: drop });\r\n});\r\n\r\nexport default VGNav;\r\n","import VGNav from \"./js/vgnav\";\r\n\r\nexport default VGNav;","import BaseModule from \"../../base-module\";\r\nimport VGCollapse from \"../../vgcollapse/js/vgcollapse\";\r\nimport { mergeDeepObject, normalizeData } from \"../../../utils/js/functions\";\r\nimport EventHandler from \"../../../utils/js/dom/event\";\r\nimport Selectors from \"../../../utils/js/dom/selectors\";\r\nimport {getSVG} from \"../../module-fn\";\r\nimport Ajax from \"../../../utils/js/components/ajax\";\r\nimport Sanitize from \"../../../utils/js/components/sanitize\";\r\n\r\nconst NAME = \"nestable\";\r\nconst NAME_KEY = \"vg.nestable\";\r\n\r\nconst SELECTOR_DATA_TOGGLE = '[data-vg-toggle=\"nestable\"]';\r\n\r\nconst CLASS_ITEM_DRAGGING = \"is-dragging\";\r\nconst CLASS_ITEM_GHOST = \"is-drag-ghost\";\r\nconst CLASS_PLACEHOLDER = \"vg-nestable-placeholder\";\r\nconst CLASS_PLACEHOLDER_HIDDEN = \"vg-nestable-placeholder-hidden\";\r\nconst CLASS_DRAG_ELEMENT = \"vg-nestable-drag-element\";\r\nconst CLASS_DRAG_LAYER = \"vg-nestable-drag-layer\";\r\nconst CLASS_INNER = \"vg-nestable-inner\";\r\nconst CLASS_HANDLE = \"vg-nestable-handle\";\r\nconst CLASS_HANDLE_ICON = \"vg-nestable-handle-icon\";\r\nconst CLASS_COLLAPSE_TOGGLE = \"vg-nestable-collapse-toggle\";\r\nconst CLASS_DROP_TARGET = \"is-drop-target\";\r\nconst CLASS_DROP_DENIED = \"is-drop-denied\";\r\nconst CLASS_LIVE_REGION = \"vg-nestable-live\";\r\n\r\nconst EVENT_KEY_START = `${NAME_KEY}.start`;\r\nconst EVENT_KEY_CHANGE = `${NAME_KEY}.change`;\r\nconst EVENT_KEY_END = `${NAME_KEY}.end`;\r\nconst EVENT_KEY_SAVE = `${NAME_KEY}.save`;\r\nconst EVENT_KEY_INIT = `${NAME_KEY}.init`;\r\nconst EVENT_KEY_REFRESH = `${NAME_KEY}.refresh`;\r\nconst EVENT_KEY_POINTER_DOWN = `${NAME_KEY}.pointerdown`;\r\nconst EVENT_KEY_MOVE = `${NAME_KEY}.move`;\r\nconst EVENT_KEY_DROP = `${NAME_KEY}.drop`;\r\nconst EVENT_KEY_TRANSFER = `${NAME_KEY}.transfer`;\r\nconst EVENT_KEY_PLACEHOLDER_MOVE = `${NAME_KEY}.placeholdermove`;\r\nconst EVENT_KEY_DESTROY = `${NAME_KEY}.destroy`;\r\n\r\nclass VGNestable extends BaseModule {\r\n\tstatic _groups = new Map();\r\n\r\n\tconstructor(element, params = {}) {\r\n\t\tsuper(element, params);\r\n\r\n\t\tthis._params = this._getParams(element, mergeDeepObject({\r\n\t\t\tlistselector: \".vg-nestable-list\", // Root/nested list for dnd.\r\n\t\t\titemselector: \".vg-nestable-item\", // Sortable item selector.\r\n\t\t\thandleselector: \".vg-nestable-handle\", // Drag handle selector.\r\n\t\t\tidattribute: \"data-id\", // Item id attribute used by serialize().\r\n\t\t\tchildlistclass: \"vg-nestable-list\", // Class for auto-created child list.\r\n\t\t\thandleicon: '', // иконка для хендлера\r\n\t\t\tindent: 50, // X offset (px), after which item moves into child level.\r\n\t\t\tmaxdepth: 6, // Maximum nesting depth.\r\n\t\t\tmoveaxis: \"default\", // Drag direction: default | vertical | horizontal.\r\n\t\t\thoverthreshold: 0, // Vertical threshold (0..0.5) around hovered item center.\r\n\t\t\tneighborchangethreshold: 0, // Percentage (0..49) of entering adjacent item before position changes.\r\n\t\t\tshowplaceholder: true, // Show placeholder during drag.\r\n\t\t\tgroup: \"\",\r\n\t\t\tconnect: false,\r\n\t\t\taccept: null,\r\n\t\t\tcollapse: {\r\n\t\t\t\tenabled: true,\r\n\t\t\t\topen: true,\r\n\t\t\t\tshowtext: getSVG(\"plus\"),\r\n\t\t\t\thidetext: getSVG(\"minus\")\r\n\t\t\t},\r\n\t\t\tcallbacks: {\r\n\t\t\t\tinit: null,\r\n\t\t\t\trefresh: null,\r\n\t\t\t\tpointerdown: null,\r\n\t\t\t\tstart: null,\r\n\t\t\t\tmove: null,\r\n\t\t\t\tplaceholdermove: null,\r\n\t\t\t\tdrop: null,\r\n\t\t\t\ttransfer: null,\r\n\t\t\t\tchange: null,\r\n\t\t\t\tend: null,\r\n\t\t\t\tsave: null,\r\n\t\t\t\tdestroy: null\r\n\t\t\t},\r\n\t\t\tajax: {\r\n\t\t\t\troute: \"\",\r\n\t\t\t\tmethod: \"post\",\r\n\t\t\t\tfield: \"items\",\r\n\t\t\t\tdata: {},\r\n\t\t\t\tloader: false,\r\n\t\t\t\tonce: false,\r\n\t\t\t\toutput: false,\r\n\t\t\t\ttimeout: 0\r\n\t\t\t}\r\n\t\t}, params));\r\n\r\n\t\tthis._rootList = this._resolveRootList();\r\n\t\tthis._draggedItem = null;\r\n\t\tthis._placeholder = null;\r\n\t\tthis._dragElement = null;\r\n\t\tthis._dragLayer = null;\r\n\t\tthis._isDragging = false;\r\n\t\tthis._startSnapshot = \"\";\r\n\t\tthis._sourceInstance = this;\r\n\t\tthis._lastDropInstance = this;\r\n\t\tthis._activeDropList = null;\r\n\r\n\t\tthis._mouse = {\r\n\t\t\tstartX: 0,\r\n\t\t\tstartY: 0,\r\n\t\t\tstartItemX: 0,\r\n\t\t\tgrabOffsetX: 0,\r\n\t\t\tgrabOffsetY: 0,\r\n\t\t\tx: 0,\r\n\t\t\ty: 0\r\n\t\t};\r\n\r\n\t\tthis._previousBodyCursor = \"\";\r\n\r\n\t\tthis._boundOnMouseDown = this._onMouseDown.bind(this);\r\n\t\tthis._boundOnMouseMove = this._onMouseMove.bind(this);\r\n\t\tthis._boundOnMouseUp = this._onMouseUp.bind(this);\r\n\t\tthis._boundOnPointerDown = this._onPointerDown.bind(this);\r\n\t\tthis._boundOnPointerMove = this._onPointerMove.bind(this);\r\n\t\tthis._boundOnPointerUp = this._onPointerUp.bind(this);\r\n\t\tthis._boundOnPointerCancel = this._onPointerCancel.bind(this);\r\n\t\tthis._boundOnTouchStart = this._onTouchStart.bind(this);\r\n\t\tthis._boundOnTouchMove = this._onTouchMove.bind(this);\r\n\t\tthis._boundOnTouchEnd = this._onTouchEnd.bind(this);\r\n\t\tthis._boundOnTouchCancel = this._onTouchCancel.bind(this);\r\n\t\tthis._boundOnKeyDown = this._onKeyDown.bind(this);\r\n\t\tthis._supportsPointerEvents = typeof window !== \"undefined\" && \"PointerEvent\" in window;\r\n\t\tthis._activePointerId = null;\r\n\t\tthis._activeTouchId = null;\r\n\t\tthis._keyboardDraggedItem = null;\r\n\t\tthis._keyboardStartSnapshot = \"\";\r\n\t\tthis._liveRegion = null;\r\n\r\n\t\tif (!this._rootList) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._registerGroup();\r\n\t\tthis.refresh();\r\n\t\tthis._ensureLiveRegion();\r\n\t\tthis._bindEvents();\r\n\t\tthis._emit(\"init\", {\r\n\t\t\tpayload: this.serialize()\r\n\t\t});\r\n\t}\r\n\r\n\tstatic get NAME() {\r\n\t\treturn NAME;\r\n\t}\r\n\r\n\tstatic get NAME_KEY() {\r\n\t\treturn NAME_KEY;\r\n\t}\r\n\r\n\t_getEventKey(action) {\r\n\t\tswitch (action) {\r\n\t\tcase \"init\":\r\n\t\t\treturn EVENT_KEY_INIT;\r\n\t\tcase \"refresh\":\r\n\t\t\treturn EVENT_KEY_REFRESH;\r\n\t\tcase \"pointerdown\":\r\n\t\t\treturn EVENT_KEY_POINTER_DOWN;\r\n\t\tcase \"start\":\r\n\t\t\treturn EVENT_KEY_START;\r\n\t\tcase \"move\":\r\n\t\t\treturn EVENT_KEY_MOVE;\r\n\t\tcase \"placeholdermove\":\r\n\t\t\treturn EVENT_KEY_PLACEHOLDER_MOVE;\r\n\t\tcase \"drop\":\r\n\t\t\treturn EVENT_KEY_DROP;\r\n\t\tcase \"transfer\":\r\n\t\t\treturn EVENT_KEY_TRANSFER;\r\n\t\tcase \"change\":\r\n\t\t\treturn EVENT_KEY_CHANGE;\r\n\t\tcase \"end\":\r\n\t\t\treturn EVENT_KEY_END;\r\n\t\tcase \"save\":\r\n\t\t\treturn EVENT_KEY_SAVE;\r\n\t\tcase \"destroy\":\r\n\t\t\treturn EVENT_KEY_DESTROY;\r\n\t\tdefault:\r\n\t\t\treturn `${NAME_KEY}.${action}`;\r\n\t\t}\r\n\t}\r\n\r\n\t_emit(action, detail = {}) {\r\n\t\tconst payload = {\r\n\t\t\taction,\r\n\t\t\tinstance: this,\r\n\t\t\t...detail\r\n\t\t};\r\n\r\n\t\tEventHandler.trigger(this._element, this._getEventKey(action), payload);\r\n\r\n\t\tconst callback = this._params?.callbacks?.[action];\r\n\t\tif (typeof callback === \"function\") {\r\n\t\t\ttry {\r\n\t\t\t\tcallback(payload);\r\n\t\t\t} catch (error) {\r\n\t\t\t\t// Keep drag lifecycle stable even if external callback throws.\r\n\t\t\t\tconsole.error(`[${NAME}] callback \"${action}\" failed`, error);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn payload;\r\n\t}\r\n\r\n\t_getGroupName() {\r\n\t\tconst name = this._params?.group;\r\n\t\tif (name === null || name === undefined) return \"\";\r\n\t\treturn String(name).trim();\r\n\t}\r\n\r\n\t_registerGroup() {\r\n\t\tconst group = this._getGroupName();\r\n\t\tif (!group) return;\r\n\r\n\t\tif (!VGNestable._groups.has(group)) {\r\n\t\t\tVGNestable._groups.set(group, new Set());\r\n\t\t}\r\n\r\n\t\tVGNestable._groups.get(group).add(this);\r\n\t}\r\n\r\n\t_unregisterGroup() {\r\n\t\tconst group = this._getGroupName();\r\n\t\tif (!group || !VGNestable._groups.has(group)) return;\r\n\r\n\t\tconst set = VGNestable._groups.get(group);\r\n\t\tset.delete(this);\r\n\t\tif (!set.size) {\r\n\t\t\tVGNestable._groups.delete(group);\r\n\t\t}\r\n\t}\r\n\r\n\t_getConnectedInstances() {\r\n\t\tif (!this._params.connect) return [this];\r\n\r\n\t\tconst group = this._getGroupName();\r\n\t\tif (!group || !VGNestable._groups.has(group)) return [this];\r\n\r\n\t\treturn Array.from(VGNestable._groups.get(group)).filter(\r\n\t\t\t(instance) => instance && instance._rootList\r\n\t\t);\r\n\t}\r\n\r\n\t_findOwnerInstanceByElement(element) {\r\n\t\tif (!element) return null;\r\n\t\treturn this._getConnectedInstances().find(\r\n\t\t\t(instance) => instance._rootList && instance._rootList.contains(element)\r\n\t\t) || null;\r\n\t}\r\n\r\n\t_canAcceptItem(item, sourceInstance) {\r\n\t\tconst accept = this._params?.accept;\r\n\t\tif (typeof accept !== \"function\") return true;\r\n\t\ttry {\r\n\t\t\treturn !!accept(item, sourceInstance, this);\r\n\t\t} catch (error) {\r\n\t\t\tconsole.error(`[${NAME}] accept() failed`, error);\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\trefresh() {\r\n\t\tthis._getItems().forEach((item) => {\r\n\t\t\tconst handle = this._ensureItemLayout(item);\r\n\r\n\t\t\tif (handle) {\r\n\t\t\t\thandle.style.cursor = \"grab\";\r\n\t\t\t\thandle.style.userSelect = \"none\";\r\n\t\t\t\thandle.style.touchAction = \"none\";\r\n\r\n\t\t\t\tif (![\"BUTTON\", \"A\", \"INPUT\"].includes(handle.tagName)) {\r\n\t\t\t\t\thandle.setAttribute(\"role\", \"button\");\r\n\t\t\t\t}\r\n\t\t\t\tif (!handle.hasAttribute(\"tabindex\")) {\r\n\t\t\t\t\thandle.setAttribute(\"tabindex\", \"0\");\r\n\t\t\t\t}\r\n\t\t\t\tif (!handle.hasAttribute(\"aria-label\")) {\r\n\t\t\t\t\thandle.setAttribute(\"aria-label\", \"Drag item\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis._syncItemCollapse(item);\r\n\t\t});\r\n\r\n\t\tthis._emit(\"refresh\", {\r\n\t\t\titems: this._getItems().length\r\n\t\t});\r\n\t}\r\n\r\n\t_syncItemCollapse(item) {\r\n\t\tif (!item || !this._params.collapse?.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst inner = this._getDirectChildBySelector(item, `.${CLASS_INNER}`);\r\n\t\tconst handle = inner ? this._getDirectChildBySelector(inner, `.${CLASS_HANDLE}`) : null;\r\n\t\tconst childList = this._getDirectChildBySelector(item, this._params.listselector);\r\n\t\tlet toggle = inner ? this._getDirectChildBySelector(inner, `.${CLASS_COLLAPSE_TOGGLE}`) : null;\r\n\r\n\t\tif (!inner || !childList) {\r\n\t\t\tif (toggle) {\r\n\t\t\t\ttoggle.remove();\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!childList.id) {\r\n\t\t\tchildList.id = `vg-nestable-collapse-${Math.random().toString(36).slice(2, 10)}`;\r\n\t\t}\r\n\r\n\t\tconst hasCollapseClass = childList.classList.contains(\"vg-collapse\");\r\n\t\tchildList.classList.add(\"vg-collapse\");\r\n\t\tif (!hasCollapseClass) {\r\n\t\t\tif (this._params.collapse.open) {\r\n\t\t\t\tchildList.classList.add(\"show\");\r\n\t\t\t} else {\r\n\t\t\t\tchildList.classList.remove(\"show\");\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!toggle) {\r\n\t\t\ttoggle = document.createElement(\"button\");\r\n\t\t\ttoggle.type = \"button\";\r\n\t\t\ttoggle.className = CLASS_COLLAPSE_TOGGLE;\r\n\t\t\tif (handle) {\r\n\t\t\t\tinner.insertBefore(toggle, handle.nextSibling);\r\n\t\t\t} else {\r\n\t\t\t\tinner.insertBefore(toggle, inner.firstChild);\r\n\t\t\t}\r\n\t\t} else if (handle && toggle.previousElementSibling !== handle) {\r\n\t\t\tinner.insertBefore(toggle, handle.nextSibling);\r\n\t\t}\r\n\r\n\t\ttoggle.setAttribute(\"data-vg-toggle\", \"collapse\");\r\n\t\ttoggle.setAttribute(\"data-vg-target\", `#${childList.id}`);\r\n\t\ttoggle.setAttribute(\"aria-controls\", childList.id);\r\n\t\tconst safeShowText = Sanitize.toSafeHtmlString(this._params.collapse.showtext || getSVG(\"chevron\"));\r\n\t\tconst safeHideText = Sanitize.toSafeHtmlString(this._params.collapse.hidetext || getSVG(\"chevron\"));\r\n\t\ttoggle.setAttribute(\"data-show-text\", safeShowText);\r\n\t\ttoggle.setAttribute(\"data-hide-text\", safeHideText);\r\n\r\n\t\tconst isOpen = childList.classList.contains(\"show\");\r\n\t\ttoggle.setAttribute(\"aria-expanded\", isOpen ? \"true\" : \"false\");\r\n\t\ttoggle.innerHTML = isOpen ? safeHideText : safeShowText;\r\n\r\n\t\tVGCollapse.getOrCreateInstance(childList, { toggle: false });\r\n\t}\r\n\r\n\t_ensureItemLayout(item) {\r\n\t\tif (!item || !this._params.handleselector) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tconst inner = this._ensureInnerLayout(item);\r\n\t\tlet handle = this._getDirectChildBySelector(inner, this._params.handleselector);\r\n\r\n\t\tif (!handle) {\r\n\t\t\tconst ownHandle = Array.from(item.querySelectorAll(this._params.handleselector)).find(\r\n\t\t\t\t(node) => node.closest(this._params.itemselector) === item\r\n\t\t\t);\r\n\r\n\t\t\tif (ownHandle) {\r\n\t\t\t\thandle = ownHandle;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!handle) {\r\n\t\t\tif (this._params.handleselector !== `.${CLASS_HANDLE}`) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\r\n\t\t\thandle = document.createElement(\"div\");\r\n\t\t\thandle.classList.add(CLASS_HANDLE);\r\n\t\t}\r\n\r\n\t\tif (handle.parentElement !== inner || handle !== inner.firstElementChild) {\r\n\t\t\tinner.insertBefore(handle, inner.firstChild);\r\n\t\t}\r\n\r\n\t\tif (!handle.querySelector(`:scope > .${CLASS_HANDLE_ICON}`)) {\r\n\t\t\tconst icon = document.createElement(\"span\");\r\n\t\t\ticon.className = CLASS_HANDLE_ICON;\r\n\t\t\ticon.setAttribute(\"aria-hidden\", \"true\");\r\n\t\t\ticon.innerHTML = Sanitize.toSafeHtmlString(this._params.handleicon || getSVG(\"dots-six-vertical\") || \":::\");\r\n\t\t\thandle.prepend(icon);\r\n\t\t}\r\n\r\n\t\treturn handle;\r\n\t}\r\n\r\n\t_ensureInnerLayout(item) {\r\n\t\tlet inner = this._getDirectChildBySelector(item, `.${CLASS_INNER}`);\r\n\t\tconst childList = this._getDirectChildBySelector(item, this._params.listselector);\r\n\r\n\t\tif (!inner) {\r\n\t\t\tinner = document.createElement(\"div\");\r\n\t\t\tinner.className = CLASS_INNER;\r\n\t\t\titem.insertBefore(inner, childList || item.firstChild);\r\n\t\t}\r\n\r\n\t\tconst nodesToMove = Array.from(item.childNodes).filter((node) => {\r\n\t\t\tif (node === inner) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn !(node.nodeType === Node.ELEMENT_NODE && node.matches(this._params.listselector));\r\n\t\t});\r\n\r\n\t\tnodesToMove.forEach((node) => inner.append(node));\r\n\r\n\t\tif (inner.parentElement !== item) {\r\n\t\t\titem.insertBefore(inner, childList || item.firstChild);\r\n\t\t}\r\n\r\n\t\treturn inner;\r\n\t}\r\n\r\n\t_getDirectChildBySelector(parent, selector) {\r\n\t\tif (!parent || !selector) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn Array.from(parent.children).find((child) => child.matches(selector)) || null;\r\n\t}\r\n\r\n\tserialize() {\r\n\t\tif (!this._rootList) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\treturn this._serializeList(this._rootList);\r\n\t}\r\n\r\n\tsave() {\r\n\t\tconst payload = this.serialize();\r\n\t\tconst route = this._params.ajax?.route;\r\n\r\n\t\tif (!route) {\r\n\t\t\tthis._emit(\"save\", { payload, status: \"skipped\" });\r\n\t\t\treturn Promise.resolve(payload);\r\n\t\t}\r\n\r\n\t\tthis._emit(\"save\", { payload, status: \"start\" });\r\n\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\tconst ajaxParams = this._params.ajax || {};\r\n\t\t\tconst field = ajaxParams.field || \"items\";\r\n\t\t\tconst method = String(ajaxParams.method || \"post\").toLowerCase();\r\n\t\t\tconst timeout = Number(ajaxParams.timeout || 0);\r\n\t\t\tconst data = mergeDeepObject(ajaxParams.data || {}, {\r\n\t\t\t\t[field]: payload\r\n\t\t\t});\r\n\t\t\tconst ajax = new Ajax();\r\n\t\t\tconst callbacks = {\r\n\t\t\t\tonSuccess: (response) => {\r\n\t\t\t\t\tthis._emit(\"save\", {\r\n\t\t\t\t\t\tpayload,\r\n\t\t\t\t\t\tstatus: \"success\",\r\n\t\t\t\t\t\tresponse\r\n\t\t\t\t\t});\r\n\t\t\t\t\tresolve(response);\r\n\t\t\t\t},\r\n\t\t\t\tonError: (error) => {\r\n\t\t\t\t\tthis._emit(\"save\", {\r\n\t\t\t\t\t\tpayload,\r\n\t\t\t\t\t\tstatus: \"error\",\r\n\t\t\t\t\t\terror\r\n\t\t\t\t\t});\r\n\t\t\t\t\treject(error);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tswitch (method) {\r\n\t\t\t\tcase \"get\":\r\n\t\t\t\t\tajax.get(route, callbacks);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"delete\":\r\n\t\t\t\t\tajax.delete(route, callbacks);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tajax.post(route, data, callbacks);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}, timeout);\r\n\t\t});\r\n\t}\r\n\r\n\tdispose() {\r\n\t\tif (this._rootList) {\r\n\t\t\tif (this._supportsPointerEvents) {\r\n\t\t\t\tthis._rootList.removeEventListener(\"pointerdown\", this._boundOnPointerDown);\r\n\t\t\t} else {\r\n\t\t\t\tthis._rootList.removeEventListener(\"mousedown\", this._boundOnMouseDown);\r\n\t\t\t\tthis._rootList.removeEventListener(\"touchstart\", this._boundOnTouchStart);\r\n\t\t\t}\r\n\t\t\tthis._rootList.removeEventListener(\"keydown\", this._boundOnKeyDown);\r\n\t\t}\r\n\r\n\t\tdocument.removeEventListener(\"mousemove\", this._boundOnMouseMove);\r\n\t\tdocument.removeEventListener(\"mouseup\", this._boundOnMouseUp);\r\n\t\tdocument.removeEventListener(\"pointermove\", this._boundOnPointerMove);\r\n\t\tdocument.removeEventListener(\"pointerup\", this._boundOnPointerUp);\r\n\t\tdocument.removeEventListener(\"pointercancel\", this._boundOnPointerCancel);\r\n\t\tdocument.removeEventListener(\"touchmove\", this._boundOnTouchMove);\r\n\t\tdocument.removeEventListener(\"touchend\", this._boundOnTouchEnd);\r\n\t\tdocument.removeEventListener(\"touchcancel\", this._boundOnTouchCancel);\r\n\r\n\t\tthis._clearDragState();\r\n\t\tthis._clearKeyboardDragState();\r\n\t\tif (this._liveRegion?.parentElement) {\r\n\t\t\tthis._liveRegion.remove();\r\n\t\t}\r\n\t\tthis._liveRegion = null;\r\n\t\tthis._unregisterGroup();\r\n\t\tthis._emit(\"destroy\");\r\n\t\tsuper.dispose();\r\n\t}\r\n\r\n\t_bindEvents() {\r\n\t\tthis._rootList.addEventListener(\"keydown\", this._boundOnKeyDown);\r\n\r\n\t\tif (this._supportsPointerEvents) {\r\n\t\t\tthis._rootList.addEventListener(\"pointerdown\", this._boundOnPointerDown);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._rootList.addEventListener(\"mousedown\", this._boundOnMouseDown);\r\n\t\tthis._rootList.addEventListener(\"touchstart\", this._boundOnTouchStart, { passive: false });\r\n\t}\r\n\r\n\t_resolveRootList() {\r\n\t\tif (!this._element) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tif (this._element.matches(this._params.listselector)) {\r\n\t\t\treturn this._element;\r\n\t\t}\r\n\r\n\t\treturn this._element.querySelector(this._params.listselector);\r\n\t}\r\n\r\n\t_getItems(scope = this._rootList) {\r\n\t\tif (!scope) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\r\n\t\treturn Array.from(scope.querySelectorAll(this._params.itemselector));\r\n\t}\r\n\r\n\t_onMouseDown(event) {\r\n\t\tif (event.button !== 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._startInteraction(event.target, event.clientX, event.clientY, event);\r\n\t\tif (!this._draggedItem) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tdocument.addEventListener(\"mousemove\", this._boundOnMouseMove);\r\n\t\tdocument.addEventListener(\"mouseup\", this._boundOnMouseUp);\r\n\t}\r\n\r\n\t_onMouseMove(event) {\r\n\t\tthis._processDragMove(event.clientX, event.clientY, event);\r\n\t}\r\n\r\n\t_onMouseUp() {\r\n\t\tdocument.removeEventListener(\"mousemove\", this._boundOnMouseMove);\r\n\t\tdocument.removeEventListener(\"mouseup\", this._boundOnMouseUp);\r\n\t\tthis._finishDrag();\r\n\t}\r\n\r\n\t_onPointerDown(event) {\r\n\t\tif (event.pointerType === \"mouse\" && event.button !== 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._startInteraction(event.target, event.clientX, event.clientY, event);\r\n\t\tif (!this._draggedItem) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._activePointerId = event.pointerId;\r\n\t\tdocument.addEventListener(\"pointermove\", this._boundOnPointerMove);\r\n\t\tdocument.addEventListener(\"pointerup\", this._boundOnPointerUp);\r\n\t\tdocument.addEventListener(\"pointercancel\", this._boundOnPointerCancel);\r\n\t}\r\n\r\n\t_onPointerMove(event) {\r\n\t\tif (!this._draggedItem || event.pointerId !== this._activePointerId) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._processDragMove(event.clientX, event.clientY, event);\r\n\t}\r\n\r\n\t_onPointerUp(event) {\r\n\t\tif (event.pointerId !== this._activePointerId) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._activePointerId = null;\r\n\t\tdocument.removeEventListener(\"pointermove\", this._boundOnPointerMove);\r\n\t\tdocument.removeEventListener(\"pointerup\", this._boundOnPointerUp);\r\n\t\tdocument.removeEventListener(\"pointercancel\", this._boundOnPointerCancel);\r\n\t\tthis._finishDrag();\r\n\t}\r\n\r\n\t_onPointerCancel(event) {\r\n\t\tif (event.pointerId !== this._activePointerId) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._activePointerId = null;\r\n\t\tdocument.removeEventListener(\"pointermove\", this._boundOnPointerMove);\r\n\t\tdocument.removeEventListener(\"pointerup\", this._boundOnPointerUp);\r\n\t\tdocument.removeEventListener(\"pointercancel\", this._boundOnPointerCancel);\r\n\t\tthis._cancelDrag();\r\n\t}\r\n\r\n\t_onTouchStart(event) {\r\n\t\tif (this._activeTouchId !== null || !event.changedTouches?.length) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst touch = event.changedTouches[0];\r\n\t\tthis._startInteraction(touch.target, touch.clientX, touch.clientY, event);\r\n\t\tif (!this._draggedItem) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._activeTouchId = touch.identifier;\r\n\t\tdocument.addEventListener(\"touchmove\", this._boundOnTouchMove, { passive: false });\r\n\t\tdocument.addEventListener(\"touchend\", this._boundOnTouchEnd);\r\n\t\tdocument.addEventListener(\"touchcancel\", this._boundOnTouchCancel);\r\n\t}\r\n\r\n\t_onTouchMove(event) {\r\n\t\tif (!this._draggedItem || this._activeTouchId === null) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst touch = this._findTouchById(event.changedTouches, this._activeTouchId)\r\n\t\t\t|| this._findTouchById(event.touches, this._activeTouchId);\r\n\t\tif (!touch) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._processDragMove(touch.clientX, touch.clientY, event);\r\n\t}\r\n\r\n\t_onTouchEnd(event) {\r\n\t\tif (this._activeTouchId === null) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst touch = this._findTouchById(event.changedTouches, this._activeTouchId);\r\n\t\tif (!touch) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._activeTouchId = null;\r\n\t\tdocument.removeEventListener(\"touchmove\", this._boundOnTouchMove);\r\n\t\tdocument.removeEventListener(\"touchend\", this._boundOnTouchEnd);\r\n\t\tdocument.removeEventListener(\"touchcancel\", this._boundOnTouchCancel);\r\n\t\tthis._finishDrag();\r\n\t}\r\n\r\n\t_onTouchCancel() {\r\n\t\tif (this._activeTouchId === null) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._activeTouchId = null;\r\n\t\tdocument.removeEventListener(\"touchmove\", this._boundOnTouchMove);\r\n\t\tdocument.removeEventListener(\"touchend\", this._boundOnTouchEnd);\r\n\t\tdocument.removeEventListener(\"touchcancel\", this._boundOnTouchCancel);\r\n\t\tthis._cancelDrag();\r\n\t}\r\n\r\n\t_onKeyDown(event) {\r\n\t\tif (this._isDragging || this._draggedItem) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst item = event.target?.closest?.(this._params.itemselector);\r\n\t\tif (!item || !this._rootList.contains(item)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst key = event.key;\r\n\t\tconst isToggleKey = key === \" \" || key === \"Enter\";\r\n\r\n\t\tif (isToggleKey && !this._keyboardDraggedItem) {\r\n\t\t\tif (!this._isKeyboardDragHandle(event.target, item)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tevent.preventDefault();\r\n\t\t\tthis._startKeyboardDrag(item);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!this._keyboardDraggedItem) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (item !== this._keyboardDraggedItem && !this._keyboardDraggedItem.contains(item)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (isToggleKey) {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tthis._finishKeyboardDrag();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (key === \"Escape\") {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tthis._finishKeyboardDrag({ cancelled: true });\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet moved = false;\r\n\t\tlet moveAnnouncement = \"\";\r\n\t\tconst moveAxis = this._getMoveAxis();\r\n\t\tconst allowVertical = moveAxis !== \"horizontal\";\r\n\t\tconst allowHorizontal = moveAxis !== \"vertical\";\r\n\r\n\t\tif (key === \"ArrowUp\") {\r\n\t\t\tif (!allowVertical) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tevent.preventDefault();\r\n\t\t\tmoved = this._moveKeyboardUp(this._keyboardDraggedItem);\r\n\t\t\tmoveAnnouncement = \"Moved up.\";\r\n\t\t} else if (key === \"ArrowDown\") {\r\n\t\t\tif (!allowVertical) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tevent.preventDefault();\r\n\t\t\tmoved = this._moveKeyboardDown(this._keyboardDraggedItem);\r\n\t\t\tmoveAnnouncement = \"Moved down.\";\r\n\t\t} else if (key === \"ArrowRight\") {\r\n\t\t\tif (!allowHorizontal) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tevent.preventDefault();\r\n\t\t\tmoved = this._indentKeyboard(this._keyboardDraggedItem);\r\n\t\t\tmoveAnnouncement = \"Nested into previous item.\";\r\n\t\t} else if (key === \"ArrowLeft\") {\r\n\t\t\tif (!allowHorizontal) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tevent.preventDefault();\r\n\t\t\tmoved = this._outdentKeyboard(this._keyboardDraggedItem);\r\n\t\t\tmoveAnnouncement = \"Moved out one level.\";\r\n\t\t}\r\n\r\n\t\tif (!moved) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._cleanupEmptyLists();\r\n\t\tthis.refresh();\r\n\t\tthis._keyboardDraggedItem.focus?.();\r\n\t\tthis._emit(\"move\", {\r\n\t\t\titem: this._keyboardDraggedItem,\r\n\t\t\ttargetInstance: this,\r\n\t\t\tkeyboard: true,\r\n\t\t\tmouse: null\r\n\t\t});\r\n\t\tif (moveAnnouncement) {\r\n\t\t\tthis._announce(moveAnnouncement);\r\n\t\t}\r\n\t}\r\n\r\n\t_isKeyboardDragHandle(target, item) {\r\n\t\tif (!target || !item) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst handleSelector = this._params.handleselector;\r\n\t\tif (!handleSelector) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tconst handle = target.closest(handleSelector);\r\n\t\treturn !!(handle && item.contains(handle));\r\n\t}\r\n\r\n\t_startKeyboardDrag(item) {\r\n\t\tif (!item || this._keyboardDraggedItem) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._keyboardDraggedItem = item;\r\n\t\tthis._keyboardStartSnapshot = JSON.stringify(this.serialize());\r\n\t\titem.classList.add(CLASS_ITEM_DRAGGING);\r\n\t\titem.setAttribute(\"aria-grabbed\", \"true\");\r\n\r\n\t\tthis._emit(\"start\", {\r\n\t\t\titem,\r\n\t\t\tpayload: this.serialize(),\r\n\t\t\tkeyboard: true\r\n\t\t});\r\n\t\tthis._announce(this._getKeyboardDragInstructions());\r\n\t}\r\n\r\n\t_finishKeyboardDrag(options = {}) {\r\n\t\tif (!this._keyboardDraggedItem) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst draggedItem = this._keyboardDraggedItem;\r\n\t\tconst previousPayload = this._keyboardStartSnapshot ? JSON.parse(this._keyboardStartSnapshot) : [];\r\n\t\tconst payload = this.serialize();\r\n\t\tconst changed = this._keyboardStartSnapshot !== JSON.stringify(payload);\r\n\r\n\t\tthis._emit(\"drop\", {\r\n\t\t\titem: draggedItem,\r\n\t\t\tpayload,\r\n\t\t\tpreviousPayload,\r\n\t\t\tchanged,\r\n\t\t\ttargetInstance: this,\r\n\t\t\tkeyboard: true,\r\n\t\t\tcancelled: !!options.cancelled\r\n\t\t});\r\n\r\n\t\tif (changed) {\r\n\t\t\tthis._emit(\"change\", { payload, previousPayload, keyboard: true });\r\n\t\t}\r\n\r\n\t\tthis._emit(\"end\", {\r\n\t\t\tpayload,\r\n\t\t\tchanged,\r\n\t\t\tkeyboard: true,\r\n\t\t\tcancelled: !!options.cancelled\r\n\t\t});\r\n\t\tif (options.cancelled) {\r\n\t\t\tthis._announce(\"Move cancelled.\");\r\n\t\t} else if (changed) {\r\n\t\t\tthis._announce(\"Item dropped.\");\r\n\t\t} else {\r\n\t\t\tthis._announce(\"Item position unchanged.\");\r\n\t\t}\r\n\r\n\t\tif (changed && this._params.ajax?.route) {\r\n\t\t\tthis.save();\r\n\t\t}\r\n\r\n\t\tthis._clearKeyboardDragState();\r\n\t}\r\n\r\n\t_clearKeyboardDragState() {\r\n\t\tif (this._keyboardDraggedItem) {\r\n\t\t\tthis._keyboardDraggedItem.classList.remove(CLASS_ITEM_DRAGGING);\r\n\t\t\tthis._keyboardDraggedItem.removeAttribute(\"aria-grabbed\");\r\n\t\t}\r\n\r\n\t\tthis._keyboardDraggedItem = null;\r\n\t\tthis._keyboardStartSnapshot = \"\";\r\n\t}\r\n\r\n\t_moveKeyboardUp(item) {\r\n\t\tconst prev = this._getPreviousItem(item);\r\n\t\tif (!prev) {\r\n\t\t\tthis._announce(\"Cannot move up.\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst list = item.parentElement;\r\n\t\tlist.insertBefore(item, prev);\r\n\t\treturn true;\r\n\t}\r\n\r\n\t_moveKeyboardDown(item) {\r\n\t\tconst next = this._getNextItem(item);\r\n\t\tif (!next) {\r\n\t\t\tthis._announce(\"Cannot move down.\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst list = item.parentElement;\r\n\t\tlist.insertBefore(item, next.nextSibling);\r\n\t\treturn true;\r\n\t}\r\n\r\n\t_indentKeyboard(item) {\r\n\t\tconst parentCandidate = this._getPreviousItem(item);\r\n\t\tif (!parentCandidate || parentCandidate === item || item.contains(parentCandidate)) {\r\n\t\t\tthis._announce(\"Cannot nest here.\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst childList = this._getOrCreateChildList(parentCandidate);\r\n\t\tif (this._isDepthExceeded(childList, item)) {\r\n\t\t\tthis._announce(\"Maximum nesting depth reached.\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tchildList.append(item);\r\n\t\treturn true;\r\n\t}\r\n\r\n\t_outdentKeyboard(item) {\r\n\t\tconst currentList = item.parentElement;\r\n\t\tconst parentItem = currentList?.closest(this._params.itemselector);\r\n\t\tif (!parentItem) {\r\n\t\t\tthis._announce(\"Cannot move left.\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst targetList = parentItem.parentElement;\r\n\t\tif (!targetList) {\r\n\t\t\tthis._announce(\"Cannot move left.\");\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\ttargetList.insertBefore(item, parentItem.nextSibling);\r\n\t\treturn true;\r\n\t}\r\n\r\n\t_getMoveAxis(params = this._params) {\r\n\t\tconst rawAxis = String(params?.moveaxis || \"default\").trim().toLowerCase();\r\n\t\tif (rawAxis === \"vertical\" || rawAxis === \"horizontal\") {\r\n\t\t\treturn rawAxis;\r\n\t\t}\r\n\t\treturn \"default\";\r\n\t}\r\n\r\n\t_getKeyboardDragInstructions() {\r\n\t\tconst moveAxis = this._getMoveAxis();\r\n\t\tif (moveAxis === \"vertical\") {\r\n\t\t\treturn \"Picked up item. Use Up/Down arrows to move, Enter or Space to drop, Escape to cancel.\";\r\n\t\t}\r\n\t\tif (moveAxis === \"horizontal\") {\r\n\t\t\treturn \"Picked up item. Use Left/Right arrows to move, Enter or Space to drop, Escape to cancel.\";\r\n\t\t}\r\n\t\treturn \"Picked up item. Use arrow keys to move, Enter or Space to drop, Escape to cancel.\";\r\n\t}\r\n\r\n\t_startInteraction(target, clientX, clientY, event) {\r\n\t\tif (this._keyboardDraggedItem) {\r\n\t\t\tthis._clearKeyboardDragState();\r\n\t\t}\r\n\r\n\t\tconst item = target?.closest?.(this._params.itemselector);\r\n\t\tif (!item || !this._rootList.contains(item)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst handleSelector = this._params.handleselector;\r\n\t\tif (handleSelector) {\r\n\t\t\tconst handle = target.closest(handleSelector);\r\n\t\t\tif (!handle || !item.contains(handle)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tevent.preventDefault();\r\n\r\n\t\tconst itemRect = item.getBoundingClientRect();\r\n\t\tthis._draggedItem = item;\r\n\t\tthis._mouse.startX = clientX;\r\n\t\tthis._mouse.startY = clientY;\r\n\t\tthis._mouse.startItemX = itemRect.left;\r\n\t\tthis._mouse.grabOffsetX = clientX - itemRect.left;\r\n\t\tthis._mouse.grabOffsetY = clientY - itemRect.top;\r\n\t\tthis._mouse.x = clientX;\r\n\t\tthis._mouse.y = clientY;\r\n\t\tthis._isDragging = false;\r\n\t\tthis._startSnapshot = \"\";\r\n\t\tthis._emit(\"pointerdown\", {\r\n\t\t\titem: this._draggedItem,\r\n\t\t\tmouse: {\r\n\t\t\t\tx: this._mouse.x,\r\n\t\t\t\ty: this._mouse.y\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t_processDragMove(clientX, clientY, event) {\r\n\t\tif (!this._draggedItem) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._mouse.x = clientX;\r\n\t\tthis._mouse.y = clientY;\r\n\r\n\t\tif (!this._isDragging) {\r\n\t\t\tconst deltaX = Math.abs(this._mouse.x - this._mouse.startX);\r\n\t\t\tconst deltaY = Math.abs(this._mouse.y - this._mouse.startY);\r\n\t\t\tif (deltaX < 3 && deltaY < 3) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tthis._startDrag();\r\n\t\t}\r\n\r\n\t\tevent.preventDefault();\r\n\r\n\t\tthis._moveDragElement(this._mouse.x, this._mouse.y);\r\n\r\n\t\tconst pointerTarget = this._getPointerTarget(this._mouse.x, this._mouse.y);\r\n\t\tif (!pointerTarget) {\r\n\t\t\tthis._setDropListState(null);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (pointerTarget.closest(`.${CLASS_PLACEHOLDER}`)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst targetInstance = this._findOwnerInstanceByElement(pointerTarget) || this;\r\n\t\tconst hoveredItem = pointerTarget.closest(targetInstance._params.itemselector);\r\n\t\tconst list = this._resolveDropList(pointerTarget, hoveredItem, targetInstance);\r\n\t\tif (!list || !targetInstance._rootList.contains(list)) {\r\n\t\t\tthis._setDropListState(null);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!targetInstance._canAcceptItem(this._draggedItem, this._sourceInstance)) {\r\n\t\t\tthis._setDropListState(list, true);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst mode = this._resolveMode(this._mouse.x, this._mouse.y, hoveredItem, targetInstance._params);\r\n\t\tthis._emit(\"move\", {\r\n\t\t\titem: this._draggedItem,\r\n\t\t\thoveredItem,\r\n\t\t\tmode,\r\n\t\t\ttargetInstance,\r\n\t\t\tmouse: {\r\n\t\t\t\tx: this._mouse.x,\r\n\t\t\t\ty: this._mouse.y\r\n\t\t\t}\r\n\t\t});\r\n\t\tif (mode === \"keep\") {\r\n\t\t\tthis._setDropListState(list);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (mode === \"child\") {\r\n\t\t\t// Indent: make dragged item a child of the hovered item (when available).\r\n\t\t\t// This lets the user \"shift right\" without needing an extra vertical nudge first.\r\n\t\t\tlet parentCandidate = null;\r\n\r\n\t\t\tif (hoveredItem) {\r\n\t\t\t\tif (hoveredItem === this._draggedItem || this._draggedItem.contains(hoveredItem)) {\r\n\t\t\t\t\tthis._setDropListState(null);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tparentCandidate = hoveredItem;\r\n\t\t\t} else {\r\n\t\t\t\tthis._placePlaceholderWhenExplicitlyNeeded(list, this._mouse.y, targetInstance);\r\n\t\t\t\tconst placeholderParent = this._placeholder?.parentElement || null;\r\n\t\t\t\tif (placeholderParent) {\r\n\t\t\t\t\tparentCandidate = targetInstance._getPreviousItem(this._placeholder);\r\n\t\t\t\t\twhile (parentCandidate && (parentCandidate === this._draggedItem || this._draggedItem.contains(parentCandidate))) {\r\n\t\t\t\t\t\tparentCandidate = targetInstance._getPreviousItem(parentCandidate);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (!parentCandidate) {\r\n\t\t\t\tthis._setDropListState(null);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst childList = targetInstance._getOrCreateChildList(parentCandidate);\r\n\t\t\tif (targetInstance._isDepthExceeded(childList, this._draggedItem)) {\r\n\t\t\t\tthis._setDropListState(childList, true);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tthis._placePlaceholder(childList, null);\r\n\t\t\tthis._setDropListState(childList);\r\n\t\t\tthis._currentTargetInstance = targetInstance;\r\n\t\t\tthis._lastDropInstance = targetInstance;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (hoveredItem) {\r\n\t\t\tif (hoveredItem === this._draggedItem || this._draggedItem.contains(hoveredItem)) {\r\n\t\t\t\tthis._setDropListState(null);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst targetList = hoveredItem.parentElement;\r\n\t\t\tif (targetInstance._isDepthExceeded(targetList, this._draggedItem)) {\r\n\t\t\t\tthis._setDropListState(targetList, true);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (mode === \"before\") {\r\n\t\t\t\tthis._placePlaceholder(targetList, hoveredItem);\r\n\t\t\t} else {\r\n\t\t\t\tthis._placePlaceholder(targetList, hoveredItem.nextSibling);\r\n\t\t\t}\r\n\t\t\tthis._setDropListState(targetList);\r\n\t\t\tthis._currentTargetInstance = targetInstance;\r\n\t\t\tthis._lastDropInstance = targetInstance;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._placePlaceholderWhenExplicitlyNeeded(list, this._mouse.y, targetInstance);\r\n\t\tthis._setDropListState(list);\r\n\t\tthis._currentTargetInstance = targetInstance;\r\n\t\tthis._lastDropInstance = targetInstance;\r\n\t}\r\n\r\n\t_finishDrag() {\r\n\t\tif (!this._draggedItem) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst draggedItem = this._draggedItem;\r\n\t\tconst hadDrag = this._isDragging;\r\n\t\tconst targetInstance = this._lastDropInstance || this;\r\n\t\tconst previousPayload = this._startSnapshot ? JSON.parse(this._startSnapshot) : [];\r\n\t\tlet sourcePayload = this.serialize();\r\n\t\tlet targetPayload = targetInstance.serialize();\r\n\t\tlet changed = false;\r\n\r\n\t\tif (hadDrag) {\r\n\t\t\tconst placeholderParent = this._placeholder?.parentElement || null;\r\n\t\t\tif (placeholderParent) {\r\n\t\t\t\tplaceholderParent.insertBefore(draggedItem, this._placeholder);\r\n\t\t\t}\r\n\r\n\t\t\tdraggedItem.style.display = \"\";\r\n\t\t\tthis._cleanupEmptyLists();\r\n\t\t\tif (targetInstance !== this) {\r\n\t\t\t\ttargetInstance._cleanupEmptyLists();\r\n\t\t\t}\r\n\t\t\tthis.refresh();\r\n\t\t\tif (targetInstance !== this) {\r\n\t\t\t\ttargetInstance.refresh();\r\n\t\t\t}\r\n\r\n\t\t\tsourcePayload = this.serialize();\r\n\t\t\ttargetPayload = targetInstance.serialize();\r\n\t\t\tchanged = this._startSnapshot !== JSON.stringify(sourcePayload) || targetInstance !== this;\r\n\t\t}\r\n\r\n\t\tconst payload = sourcePayload;\r\n\t\tthis._emit(\"drop\", {\r\n\t\t\titem: draggedItem,\r\n\t\t\tpayload,\r\n\t\t\tpreviousPayload,\r\n\t\t\tchanged,\r\n\t\t\ttargetInstance\r\n\t\t});\r\n\r\n\t\tif (changed && targetInstance !== this) {\r\n\t\t\tthis._emit(\"transfer\", {\r\n\t\t\t\titem: draggedItem,\r\n\t\t\t\tfrom: this,\r\n\t\t\t\tto: targetInstance,\r\n\t\t\t\tsourcePayload,\r\n\t\t\t\ttargetPayload\r\n\t\t\t});\r\n\t\t\ttargetInstance._emit(\"transfer\", {\r\n\t\t\t\titem: draggedItem,\r\n\t\t\t\tfrom: this,\r\n\t\t\t\tto: targetInstance,\r\n\t\t\t\tsourcePayload,\r\n\t\t\t\ttargetPayload\r\n\t\t\t});\r\n\t\t\ttargetInstance._emit(\"change\", { payload: targetPayload, previousPayload: [] });\r\n\t\t}\r\n\r\n\t\tthis._clearDragState();\r\n\r\n\t\tif (changed) {\r\n\t\t\tthis._emit(\"change\", { payload, previousPayload });\r\n\t\t}\r\n\r\n\t\tif (hadDrag) {\r\n\t\t\tthis._emit(\"end\", {\r\n\t\t\t\tpayload,\r\n\t\t\t\tchanged\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (changed) {\r\n\t\t\tif (this._params.ajax?.route) {\r\n\t\t\t\tthis.save();\r\n\t\t\t}\r\n\t\t\tif (targetInstance !== this && targetInstance._params.ajax?.route) {\r\n\t\t\t\ttargetInstance.save();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t_cancelDrag() {\r\n\t\tif (!this._draggedItem) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst hadDrag = this._isDragging;\r\n\t\tthis._clearDragState();\r\n\r\n\t\tif (hadDrag) {\r\n\t\t\tthis._emit(\"end\", {\r\n\t\t\t\tpayload: this.serialize(),\r\n\t\t\t\tchanged: false,\r\n\t\t\t\tcancelled: true\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t_findTouchById(touchList, id) {\r\n\t\tif (!touchList || id === null || id === undefined) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tfor (let index = 0; index < touchList.length; index += 1) {\r\n\t\t\tif (touchList[index].identifier === id) {\r\n\t\t\t\treturn touchList[index];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t}\r\n\r\n\t_startDrag() {\r\n\t\tif (!this._draggedItem || this._isDragging) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._isDragging = true;\r\n\t\tthis._startSnapshot = JSON.stringify(this.serialize());\r\n\t\tthis._sourceInstance = this;\r\n\t\tthis._sourceRoot = this._rootList;\r\n\t\tthis._currentTargetInstance = this;\r\n\t\tthis._lastDropInstance = this;\r\n\r\n\t\tthis._placeholder = this._createPlaceholder(this._draggedItem);\r\n\t\tif (!this._params.showplaceholder) {\r\n\t\t\tthis._placeholder.classList.add(CLASS_PLACEHOLDER_HIDDEN);\r\n\t\t}\r\n\r\n\t\tthis._draggedItem.parentElement.insertBefore(this._placeholder, this._draggedItem.nextSibling);\r\n\r\n\t\tthis._dragElement = this._createDragElement(this._draggedItem);\r\n\t\tthis._dragLayer = document.createElement(\"div\");\r\n\t\tthis._dragLayer.classList.add(CLASS_DRAG_LAYER);\r\n\t\t// Keep scoped styles working for the drag preview (e.g. \".vg-nestable .vg-nestable-item ...\").\r\n\t\tif (this._element?.classList) {\r\n\t\t\tthis._element.classList.forEach((className) => this._dragLayer.classList.add(className));\r\n\t\t}\r\n\t\tthis._dragLayer.style.position = \"fixed\";\r\n\t\tthis._dragLayer.style.left = \"0\";\r\n\t\tthis._dragLayer.style.top = \"0\";\r\n\t\tthis._dragLayer.style.width = \"0\";\r\n\t\tthis._dragLayer.style.height = \"0\";\r\n\t\tthis._dragLayer.style.pointerEvents = \"none\";\r\n\t\tthis._dragLayer.style.zIndex = \"99999\";\r\n\t\tdocument.body.append(this._dragLayer);\r\n\t\tthis._dragLayer.append(this._dragElement);\r\n\r\n\t\tif (typeof document !== \"undefined\" && document.body) {\r\n\t\t\tthis._previousBodyCursor = document.body.style.cursor || \"\";\r\n\t\t\tdocument.body.style.cursor = \"grabbing\";\r\n\t\t}\r\n\r\n\t\tthis._moveDragElement(this._mouse.x, this._mouse.y);\r\n\r\n\t\tthis._draggedItem.classList.add(CLASS_ITEM_DRAGGING);\r\n\t\tthis._draggedItem.style.display = \"none\";\r\n\t\tthis._draggedItem.setAttribute(\"aria-grabbed\", \"true\");\r\n\r\n\t\tthis._emit(\"start\", {\r\n\t\t\titem: this._draggedItem,\r\n\t\t\tpayload: this.serialize()\r\n\t\t});\r\n\t}\r\n\r\n\t_createDragElement(item) {\r\n\t\tconst rect = item.getBoundingClientRect();\r\n\t\tconst dragEl = item.cloneNode(true);\r\n\r\n\t\tdragEl.classList.add(CLASS_ITEM_GHOST, CLASS_DRAG_ELEMENT);\r\n\t\tdragEl.style.position = \"fixed\";\r\n\t\tdragEl.style.left = `${rect.left}px`;\r\n\t\tdragEl.style.top = `${rect.top}px`;\r\n\t\tdragEl.style.width = `${rect.width}px`;\r\n\t\tdragEl.style.zIndex = \"99999\";\r\n\t\tdragEl.style.pointerEvents = \"none\";\r\n\t\tdragEl.style.margin = \"0\";\r\n\r\n\t\treturn dragEl;\r\n\t}\r\n\r\n\t_moveDragElement(x, y) {\r\n\t\tif (!this._dragElement) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Keep the cursor at the same relative point where the user grabbed the item.\r\n\t\tconst left = x - (Number(this._mouse.grabOffsetX) || 0);\r\n\t\tconst top = y - (Number(this._mouse.grabOffsetY) || 0);\r\n\t\tthis._dragElement.style.left = `${left}px`;\r\n\t\tthis._dragElement.style.top = `${top}px`;\r\n\t}\r\n\r\n\t_getPointerTarget(x, y) {\r\n\t\tconst el = document.elementFromPoint(x, y);\r\n\t\tif (!el) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\treturn this._findOwnerInstanceByElement(el) ? el : null;\r\n\t}\r\n\r\n\t_resolveDropList(pointerTarget, hoveredItem, targetInstance = this) {\r\n\t\tif (hoveredItem) {\r\n\t\t\treturn hoveredItem.parentElement;\r\n\t\t}\r\n\r\n\t\tconst list = pointerTarget.closest(targetInstance._params.listselector);\r\n\t\tif (list && targetInstance._rootList.contains(list)) {\r\n\t\t\treturn list;\r\n\t\t}\r\n\r\n\t\treturn targetInstance._rootList;\r\n\t}\r\n\r\n_resolveMode(pointerX, pointerY, hoveredItem, params = this._params) {\r\n\tif (!hoveredItem) {\r\n\t\treturn \"append\";\r\n\t}\r\n\r\n\tconst rect = hoveredItem.getBoundingClientRect();\r\n\tconst offsetY = pointerY - rect.top;\r\n\t// Use the dragged item's original left edge as baseline, not the pointer-down X.\r\n\t// This makes \"shift right to nest\" work reliably regardless of where inside the handle the user grabbed.\r\n\tconst baseX = Number.isFinite(this._mouse.startItemX) ? this._mouse.startItemX : this._mouse.startX;\r\n\tconst offsetX = pointerX - baseX;\r\n\tconst indentValue = parseFloat(params.indent);\r\n\tconst indent = Number.isFinite(indentValue) ? indentValue : 0;\r\n\tconst moveAxis = this._getMoveAxis(params);\r\n\tconst allowVertical = moveAxis !== \"horizontal\";\r\n\tconst allowHorizontal = moveAxis !== \"vertical\";\r\n\tconst neighborThresholdPercent = Math.max(\r\n\t\t0,\r\n\t\tMath.min(49, Number(params.neighborchangethreshold || 0))\r\n\t);\r\n\r\n\tif (neighborThresholdPercent > 0) {\r\n\t\tconst edgeRatio = neighborThresholdPercent / 100;\r\n\t\tconst topBorder = rect.height * edgeRatio;\r\n\t\tconst bottomBorder = rect.height * (1 - edgeRatio);\r\n\r\n\t\tif (allowHorizontal && offsetX > indent) {\r\n\t\t\treturn \"child\";\r\n\t\t}\r\n\r\n\t\tif (allowVertical && offsetY <= topBorder) {\r\n\t\t\treturn \"before\";\r\n\t\t}\r\n\r\n\t\tif (allowVertical && offsetY >= bottomBorder) {\r\n\t\t\treturn \"after\";\r\n\t\t}\r\n\r\n\t\treturn \"keep\";\r\n\t}\r\n\r\n\tconst threshold = Math.min(\r\n\t\t0.45,\r\n\t\tMath.max(0.05, Number(params.hoverthreshold || 0.18))\r\n\t);\r\n\r\n\tif (allowHorizontal && offsetX > indent) {\r\n\t\treturn \"child\";\r\n\t}\r\n\r\n\tif (allowVertical && offsetY < rect.height * (0.5 - threshold)) {\r\n\t\treturn \"before\";\r\n\t}\r\n\r\n\tif (allowVertical && offsetY > rect.height * (0.5 + threshold)) {\r\n\t\treturn \"after\";\r\n\t}\r\n\r\n\treturn \"keep\";\r\n}\r\n\r\n\t_getPreviousItem(item) {\r\n\t\tlet sibling = item?.previousElementSibling || null;\r\n\t\twhile (sibling && !sibling.matches(this._params.itemselector)) {\r\n\t\t\tsibling = sibling.previousElementSibling;\r\n\t\t}\r\n\t\treturn sibling;\r\n\t}\r\n\r\n\t_getNextItem(item) {\r\n\t\tlet sibling = item?.nextElementSibling || null;\r\n\t\twhile (sibling && !sibling.matches(this._params.itemselector)) {\r\n\t\t\tsibling = sibling.nextElementSibling;\r\n\t\t}\r\n\t\treturn sibling;\r\n\t}\r\n\r\n\t_getOrCreateChildList(item) {\r\n\t\tlet list = item.querySelector(`:scope > ${this._params.listselector}`);\r\n\t\tif (list) {\r\n\t\t\treturn list;\r\n\t\t}\r\n\r\n\t\tlist = document.createElement(this._rootList.tagName || \"ol\");\r\n\r\n\t\tif (this._params.childlistclass) {\r\n\t\t\tthis._params.childlistclass\r\n\t\t\t\t.split(\" \")\r\n\t\t\t\t.filter(Boolean)\r\n\t\t\t\t.forEach((className) => list.classList.add(className));\r\n\t\t}\r\n\r\n\t\titem.append(list);\r\n\t\treturn list;\r\n\t}\r\n\r\n\t_isDepthExceeded(list, draggedItem = this._draggedItem) {\r\n\t\tconst listDepth = this._getListDepth(list);\r\n\t\tconst maxDepth = Number(this._params.maxdepth || 1);\r\n\t\tconst subtreeDepth = this._getItemSubtreeDepth(draggedItem);\r\n\t\treturn (listDepth + subtreeDepth - 1) > maxDepth;\r\n\t}\r\n\r\n\t_getListDepth(list) {\r\n\t\tif (!list) {\r\n\t\t\treturn 1;\r\n\t\t}\r\n\r\n\t\tlet depth = 1;\r\n\t\tlet currentList = list;\r\n\r\n\t\twhile (currentList && currentList !== this._rootList) {\r\n\t\t\tconst parentItem = currentList.closest(this._params.itemselector);\r\n\t\t\tif (!parentItem) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tdepth += 1;\r\n\t\t\tcurrentList = parentItem.parentElement?.closest(this._params.listselector);\r\n\t\t}\r\n\r\n\t\treturn depth;\r\n\t}\r\n\r\n\t_getItemSubtreeDepth(item) {\r\n\t\tif (!item) {\r\n\t\t\treturn 1;\r\n\t\t}\r\n\r\n\t\tconst childList = this._getDirectChildBySelector(item, this._params.listselector);\r\n\t\tif (!childList) {\r\n\t\t\treturn 1;\r\n\t\t}\r\n\r\n\t\tconst childItems = Array.from(childList.children).filter((child) => child.matches(this._params.itemselector));\r\n\t\tif (!childItems.length) {\r\n\t\t\treturn 1;\r\n\t\t}\r\n\r\n\t\tconst maxChildDepth = childItems.reduce(\r\n\t\t\t(depth, childItem) => Math.max(depth, this._getItemSubtreeDepth(childItem)),\r\n\t\t\t1\r\n\t\t);\r\n\r\n\t\treturn maxChildDepth + 1;\r\n\t}\r\n\r\n\t_cleanupEmptyLists() {\r\n\t\tif (!this._rootList) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst lists = Array.from(this._rootList.querySelectorAll(this._params.listselector));\r\n\t\tlists.forEach((list) => {\r\n\t\t\tif (list === this._rootList) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst hasItems = Array.from(list.children).some((child) => child.matches(this._params.itemselector));\r\n\t\t\tif (!hasItems) {\r\n\t\t\t\tlist.remove();\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t_createPlaceholder(item) {\r\n\t\tconst tag = item.tagName && item.tagName.toLowerCase() === \"li\" ? \"li\" : \"div\";\r\n\t\tconst placeholder = document.createElement(tag);\r\n\t\tplaceholder.className = CLASS_PLACEHOLDER;\r\n\t\tplaceholder.style.height = `${Math.max(item.getBoundingClientRect().height, 24)}px`;\r\n\t\tplaceholder.setAttribute(\"aria-hidden\", \"true\");\r\n\t\treturn placeholder;\r\n\t}\r\n\r\n\t_placePlaceholder(parent, beforeNode = null) {\r\n\t\tif (!parent || !this._placeholder) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (beforeNode === this._placeholder) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst currentParent = this._placeholder.parentElement;\r\n\t\tconst currentNext = this._placeholder.nextSibling;\r\n\r\n\t\tif (currentParent === parent && currentNext === beforeNode) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tparent.insertBefore(this._placeholder, beforeNode);\r\n\t\tthis._emit(\"placeholdermove\", {\r\n\t\t\tparent,\r\n\t\t\tbeforeNode,\r\n\t\t\titem: this._draggedItem\r\n\t\t});\r\n\t}\r\n\r\n\t_placePlaceholderWhenExplicitlyNeeded(list, pointerY, targetInstance = this) {\r\n\t\tif (!list || targetInstance._isDepthExceeded(list, this._draggedItem)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst items = Array.from(list.children).filter((child) => child.matches(this._params.itemselector));\r\n\t\tif (!items.length) {\r\n\t\t\tthis._placePlaceholder(list, null);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst edgeThreshold = 8;\r\n\t\tconst firstItem = items[0];\r\n\t\tconst lastItem = items[items.length - 1];\r\n\t\tconst firstRect = firstItem.getBoundingClientRect();\r\n\t\tconst lastRect = lastItem.getBoundingClientRect();\r\n\r\n\t\tif (pointerY <= firstRect.top + edgeThreshold) {\r\n\t\t\tthis._placePlaceholder(list, firstItem);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (pointerY >= lastRect.bottom - edgeThreshold) {\r\n\t\t\tthis._placePlaceholder(list, null);\r\n\t\t}\r\n\t}\r\n\r\n\t_setDropListState(list, denied = false) {\r\n\t\tif (this._activeDropList && this._activeDropList !== list) {\r\n\t\t\tthis._activeDropList.classList.remove(CLASS_DROP_TARGET, CLASS_DROP_DENIED);\r\n\t\t}\r\n\r\n\t\tif (!list) {\r\n\t\t\tthis._activeDropList = null;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlist.classList.add(denied ? CLASS_DROP_DENIED : CLASS_DROP_TARGET);\r\n\t\tlist.classList.remove(denied ? CLASS_DROP_TARGET : CLASS_DROP_DENIED);\r\n\t\tthis._activeDropList = list;\r\n\t}\r\n\r\n\t_clearDragState() {\r\n\t\tthis._setDropListState(null);\r\n\r\n\t\tif (this._draggedItem) {\r\n\t\t\tthis._draggedItem.classList.remove(CLASS_ITEM_DRAGGING);\r\n\t\t\tthis._draggedItem.style.display = \"\";\r\n\t\t\tthis._draggedItem.removeAttribute(\"aria-grabbed\");\r\n\t\t}\r\n\r\n\t\tif (this._dragElement && this._dragElement.parentElement) {\r\n\t\t\tthis._dragElement.remove();\r\n\t\t}\r\n\r\n\t\tif (this._dragLayer && this._dragLayer.parentElement) {\r\n\t\t\tthis._dragLayer.remove();\r\n\t\t}\r\n\r\n\t\tif (typeof document !== \"undefined\" && document.body) {\r\n\t\t\tdocument.body.style.cursor = this._previousBodyCursor || \"\";\r\n\t\t}\r\n\r\n\t\tif (this._placeholder && this._placeholder.parentElement) {\r\n\t\t\tthis._placeholder.remove();\r\n\t\t}\r\n\r\n\t\tthis._draggedItem = null;\r\n\t\tthis._placeholder = null;\r\n\t\tthis._dragElement = null;\r\n\t\tthis._dragLayer = null;\r\n\t\tthis._previousBodyCursor = \"\";\r\n\t\tthis._isDragging = false;\r\n\t\tthis._currentTargetInstance = this;\r\n\t\tthis._lastDropInstance = this;\r\n\t\tthis._activePointerId = null;\r\n\t\tthis._activeTouchId = null;\r\n\t}\r\n\r\n\t_ensureLiveRegion() {\r\n\t\tif (!this._element || this._liveRegion) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst live = document.createElement(\"div\");\r\n\t\tlive.className = CLASS_LIVE_REGION;\r\n\t\tlive.setAttribute(\"aria-live\", \"polite\");\r\n\t\tlive.setAttribute(\"aria-atomic\", \"true\");\r\n\t\tlive.style.position = \"absolute\";\r\n\t\tlive.style.width = \"1px\";\r\n\t\tlive.style.height = \"1px\";\r\n\t\tlive.style.margin = \"-1px\";\r\n\t\tlive.style.border = \"0\";\r\n\t\tlive.style.padding = \"0\";\r\n\t\tlive.style.clip = \"rect(0 0 0 0)\";\r\n\t\tlive.style.clipPath = \"inset(50%)\";\r\n\t\tlive.style.overflow = \"hidden\";\r\n\t\tlive.style.whiteSpace = \"nowrap\";\r\n\t\tthis._element.append(live);\r\n\t\tthis._liveRegion = live;\r\n\t}\r\n\r\n\t_announce(message) {\r\n\t\tif (!message) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._ensureLiveRegion();\r\n\t\tif (!this._liveRegion) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._liveRegion.textContent = \"\";\r\n\t\trequestAnimationFrame(() => {\r\n\t\t\tif (this._liveRegion) {\r\n\t\t\t\tthis._liveRegion.textContent = message;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t_serializeList(list) {\r\n\t\tconst items = Array.from(list.children).filter((child) => child.matches(this._params.itemselector));\r\n\r\n\t\treturn items.map((item) => {\r\n\t\t\tconst id = normalizeData(item.getAttribute(this._params.idattribute));\r\n\t\t\tconst childList = item.querySelector(`:scope > ${this._params.listselector}`);\r\n\r\n\t\t\tconst data = { id: id ?? null };\r\n\r\n\t\t\tif (childList) {\r\n\t\t\t\tconst children = this._serializeList(childList);\r\n\t\t\t\tif (children.length) {\r\n\t\t\t\t\tdata.children = children;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn data;\r\n\t\t});\r\n\t}\r\n}\r\n\r\nEventHandler.on(document, `DOMContentLoaded.${NAME_KEY}.data.api`, () => {\r\n\tSelectors.findAll(SELECTOR_DATA_TOGGLE).forEach((el) => VGNestable.getOrCreateInstance(el));\r\n});\r\n\r\nexport default VGNestable;\r\n\r\n\r\n\r\n\r\n\r\n\r\n","import VGNestable from \"./js/vgnestable\";\r\n\r\nexport default VGNestable;","const SKIN_CLASS_DEFAULT = 'is-skin-default';\r\nconst SKIN_CLASS_RULER = 'is-skin-ruler';\r\nconst SKIN_CLASS_STATUS = 'is-skin-status';\r\nconst SKIN_CLASS_RULER_DIM = 'is-ruler-dim-inactive';\r\nconst STATUS_CLASS_SUCCESS = 'is-status-success';\r\nconst STATUS_CLASS_WARNING = 'is-status-warning';\r\nconst STATUS_CLASS_DANGER = 'is-status-danger';\r\n\r\nconst STATUS_CLASSES = [\r\n\tSTATUS_CLASS_SUCCESS,\r\n\tSTATUS_CLASS_WARNING,\r\n\tSTATUS_CLASS_DANGER,\r\n];\r\n\r\nconst resolveStatusToneByValue = (value, params, state) => {\r\n\tconst span = state.max - state.min;\r\n\tconst percent = span > 0 ? ((value - state.min) / span) * 100 : 0;\r\n\tconst warningBelow = Number(params?.status?.warningBelow);\r\n\tconst dangerBelow = Number(params?.status?.dangerBelow);\r\n\tconst warningThreshold = Number.isFinite(warningBelow) ? warningBelow : 60;\r\n\tconst dangerThreshold = Number.isFinite(dangerBelow) ? dangerBelow : 30;\r\n\r\n\tif (percent < dangerThreshold) {\r\n\t\treturn 'danger';\r\n\t}\r\n\r\n\tif (percent < warningThreshold) {\r\n\t\treturn 'warning';\r\n\t}\r\n\r\n\treturn 'success';\r\n};\r\n\r\nconst resolveStatusSourceValue = (params, state, helpers) => {\r\n\tif (!helpers.isRange) {\r\n\t\treturn state.from;\r\n\t}\r\n\r\n\tconst by = typeof params?.status?.by === 'string'\r\n\t\t? params.status.by.toLowerCase()\r\n\t\t: 'to';\r\n\r\n\tif (by === 'from') {\r\n\t\treturn state.from;\r\n\t}\r\n\r\n\tif (by === 'avg') {\r\n\t\treturn (state.from + state.to) / 2;\r\n\t}\r\n\r\n\treturn state.to;\r\n};\r\n\r\nconst buildRulerValues = (params, state) => {\r\n\tif (Array.isArray(params?.ruler?.values) && params.ruler.values.length > 0) {\r\n\t\treturn params.ruler.values\r\n\t\t\t.map(value => Number(value))\r\n\t\t\t.filter(value => Number.isFinite(value))\r\n\t\t\t.sort((a, b) => a - b);\r\n\t}\r\n\r\n\tconst count = Math.max(2, Number(params?.ruler?.count) || 6);\r\n\tconst span = state.max - state.min;\r\n\tconst step = span / (count - 1);\r\n\tconst values = [];\r\n\r\n\tfor (let index = 0; index < count; index++) {\r\n\t\tconst value = index === count - 1 ? state.max : state.min + (step * index);\r\n\t\tvalues.push(Number(value.toFixed(5)));\r\n\t}\r\n\r\n\treturn values;\r\n};\r\n\r\nconst createRulerSkin = (root, params, state, formatValue, toPositionPx) => {\r\n\tconst values = buildRulerValues(params, state);\r\n\tconst ruler = document.createElement('div');\r\n\truler.className = 'vg-range-slider__ruler';\r\n\r\n\tif (params?.ruler?.dimInactive === true) {\r\n\t\troot.classList.add(SKIN_CLASS_RULER_DIM);\r\n\t}\r\n\r\n\tconst ticks = values.map((value) => {\r\n\t\tconst item = document.createElement('span');\r\n\t\titem.className = 'vg-range-slider__ruler-item';\r\n\t\titem.style.left = `${toPositionPx(value)}px`;\r\n\t\titem.dataset.value = String(value);\r\n\r\n\t\tconst mark = document.createElement('span');\r\n\t\tmark.className = 'vg-range-slider__ruler-mark';\r\n\t\titem.appendChild(mark);\r\n\r\n\t\tif (params?.ruler?.labels !== false) {\r\n\t\t\tconst label = document.createElement('span');\r\n\t\t\tlabel.className = 'vg-range-slider__ruler-label';\r\n\t\t\tlabel.textContent = formatValue(value);\r\n\t\t\titem.appendChild(label);\r\n\t\t}\r\n\r\n\t\truler.appendChild(item);\r\n\t\treturn item;\r\n\t});\r\n\r\n\troot.appendChild(ruler);\r\n\r\n\treturn {\r\n\t\ttype: 'ruler',\r\n\t\troot: ruler,\r\n\t\tticks,\r\n\t\tvalues,\r\n\t};\r\n};\r\n\r\nconst resolveStatusTone = (params, state, helpers) => {\r\n\tconst value = resolveStatusSourceValue(params, state, helpers);\r\n\treturn resolveStatusToneByValue(value, params, state);\r\n};\r\n\r\nconst syncStatusClasses = (root, tone) => {\r\n\troot.classList.remove(...STATUS_CLASSES);\r\n\r\n\tif (tone === 'danger') {\r\n\t\troot.classList.add(STATUS_CLASS_DANGER);\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (tone === 'warning') {\r\n\t\troot.classList.add(STATUS_CLASS_WARNING);\r\n\t\treturn;\r\n\t}\r\n\r\n\troot.classList.add(STATUS_CLASS_SUCCESS);\r\n};\r\n\r\nconst resolveStatusLabel = (params, tone) => {\r\n\tif (!Array.isArray(params?.labelWords) || params.labelWords.length < 3) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tif (tone === 'danger') {\r\n\t\treturn params.labelWords[0] || null;\r\n\t}\r\n\r\n\tif (tone === 'warning') {\r\n\t\treturn params.labelWords[1] || null;\r\n\t}\r\n\r\n\treturn params.labelWords[2] || null;\r\n};\r\n\r\nconst syncStatusLabels = (params, state, helpers) => {\r\n\tconst labelFrom = helpers?.dom?.labelFrom;\r\n\tconst labelTo = helpers?.dom?.labelTo;\r\n\tconst fromLabel = resolveStatusLabel(params, resolveStatusToneByValue(state.from, params, state));\r\n\tconst toLabel = resolveStatusLabel(params, resolveStatusToneByValue(state.to, params, state));\r\n\r\n\tif (labelFrom && fromLabel) {\r\n\t\tlabelFrom.textContent = fromLabel;\r\n\t}\r\n\r\n\tif (labelTo && toLabel) {\r\n\t\tlabelTo.textContent = toLabel;\r\n\t}\r\n};\r\n\r\nconst applyRangeSliderSkin = (root, params, state, helpers) => {\r\n\troot.classList.add(SKIN_CLASS_DEFAULT);\r\n\r\n\tif (params.skin === 'ruler') {\r\n\t\troot.classList.add(SKIN_CLASS_RULER);\r\n\t\treturn createRulerSkin(root, params, state, helpers.formatValue, helpers.toPositionPx);\r\n\t}\r\n\r\n\tif (params.skin === 'status') {\r\n\t\troot.classList.add(SKIN_CLASS_STATUS);\r\n\t\tsyncStatusClasses(root, resolveStatusTone(params, state, helpers));\r\n\r\n\t\treturn {\r\n\t\t\ttype: 'status',\r\n\t\t\troot,\r\n\t\t};\r\n\t}\r\n\r\n\tif (params.skin !== 'default') {\r\n\t\treturn null;\r\n\t}\r\n\r\n\treturn null;\r\n};\r\n\r\nconst syncRangeSliderSkin = (skin, state, helpers) => {\r\n\tif (!skin) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (skin.type === 'status') {\r\n\t\tsyncStatusClasses(skin.root, resolveStatusTone(helpers.params, state, helpers));\r\n\t\tsyncStatusLabels(helpers.params, state, helpers);\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (skin.type !== 'ruler') {\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst isRange = state.from !== state.to || helpers.isRange;\r\n\r\n\tskin.ticks.forEach((tick, index) => {\r\n\t\tconst value = skin.values[index];\r\n\t\tconst isActive = isRange\r\n\t\t\t? value >= state.from && value <= state.to\r\n\t\t\t: value <= state.from;\r\n\r\n\t\ttick.classList.toggle('is-active', isActive);\r\n\t});\r\n};\r\n\r\nexport {\r\n\tapplyRangeSliderSkin,\r\n\tsyncRangeSliderSkin,\r\n};\r\n","import BaseModule from \"../../base-module\";\r\nimport EventHandler from \"../../../utils/js/dom/event\";\r\nimport Selectors from \"../../../utils/js/dom/selectors\";\r\nimport { mergeDeepObject, normalizeData } from \"../../../utils/js/functions\";\r\nimport { applyRangeSliderSkin, syncRangeSliderSkin } from \"./skins\";\r\n\r\nconst NAME = 'rangeslider';\r\nconst NAME_KEY = 'vg.rangeslider';\r\n\r\nconst SELECTOR_DATA_MODULE = '[data-vgrangeslider]';\r\n\r\nconst CLASS_NAME_MODULE = 'vg-range-slider';\r\nconst CLASS_NAME_RANGE = 'is-range';\r\nconst CLASS_NAME_DISABLED = 'disabled';\r\nconst CLASS_NAME_TOOLTIP_HIDDEN = 'is-hidden';\r\n\r\nconst EVENT_KEY_INIT = `${NAME_KEY}.init`;\r\nconst EVENT_KEY_INPUT = `${NAME_KEY}.input`;\r\nconst EVENT_KEY_CHANGE = `${NAME_KEY}.change`;\r\nconst EVENT_KEY_UPDATE = `${NAME_KEY}.update`;\r\n\r\nconst defaultParams = {\r\n\trange: false,\r\n\tmin: 0,\r\n\tmax: 100,\r\n\tstep: 1,\r\n\tstart: null,\r\n\tconnect: true,\r\n\ttooltips: true,\r\n\tlabels: true,\r\n\tseparator: ' - ',\r\n\tsuffix: '',\r\n\tprefix: '',\r\n\tlabelWords: null,\r\n\tskin: 'default',\r\n\truler: {\r\n\t\tcount: 6,\r\n\t\tlabels: true,\r\n\t\tvalues: null,\r\n\t\tdimInactive: false,\r\n\t},\r\n\tstatus: {\r\n\t\twarningBelow: 60,\r\n\t\tdangerBelow: 30,\r\n\t\tby: 'to',\r\n\t},\r\n\tname: {\r\n\t\tmin: '',\r\n\t\tmax: '',\r\n\t},\r\n\tinput: {\r\n\t\tmin: null,\r\n\t\tmax: null,\r\n\t},\r\n\toutput: {\r\n\t\ttarget: null,\r\n\t\tmin: null,\r\n\t\tmax: null,\r\n\t},\r\n\tdisabled: false,\r\n\tonInit: null,\r\n\tonInput: null,\r\n\tonChange: null,\r\n\tonUpdate: null,\r\n\tformatValue: null,\r\n};\r\n\r\nclass VGRangeSlider extends BaseModule {\r\n\tconstructor(element, params = {}) {\r\n\t\tsuper(element, params);\r\n\r\n\t\tthis._sourceInput = this._element.matches('input[type=\"range\"]') ? this._element : null;\r\n\t\tthis._params = this._buildParams(params);\r\n\t\tthis._isRange = this._resolveRangeMode();\r\n\t\tthis._listeners = [];\r\n\t\tthis._handleResize = () => this._syncUI();\r\n\t\tthis._dom = {\r\n\t\t\troot: null,\r\n\t\t\twrapper: null,\r\n\t\t\tfill: null,\r\n\t\t\tinputFrom: null,\r\n\t\t\tinputTo: null,\r\n\t\t\ttooltipFrom: null,\r\n\t\t\ttooltipTo: null,\r\n\t\t\ttooltipMerged: null,\r\n\t\t\tlabelFrom: null,\r\n\t\t\tlabelTo: null,\r\n\t\t\tlabelSeparator: null,\r\n\t\t\thiddenMin: null,\r\n\t\t\thiddenMax: null,\r\n\t\t\tskin: null,\r\n\t\t};\r\n\r\n\t\tthis._state = this._buildState();\r\n\r\n\t\tthis._render();\r\n\t\tthis._bindEvents();\r\n\t\tthis._syncUI();\r\n\t\tthis._setDisabledState(this._params.disabled);\r\n\t\tthis._emit(EVENT_KEY_INIT, 'onInit');\r\n\t}\r\n\r\n\tstatic get NAME() {\r\n\t\treturn NAME;\r\n\t}\r\n\r\n\tstatic get NAME_KEY() {\r\n\t\treturn NAME_KEY;\r\n\t}\r\n\r\n\tstatic init(element, params = {}) {\r\n\t\treturn this.getOrCreateInstance(element, params);\r\n\t}\r\n\r\n\tgetValue() {\r\n\t\treturn this._isRange ? [this._state.from, this._state.to] : this._state.from;\r\n\t}\r\n\r\n\tsetValue(value, options = {}) {\r\n\t\tconst { silent = false, emit = 'update' } = options;\r\n\r\n\t\tif (this._isRange) {\r\n\t\t\tconst next = Array.isArray(value) ? value : [value, this._state.to];\r\n\t\t\tconst from = this._normalizeValue(next[0], this._state.min);\r\n\t\t\tconst to = this._normalizeValue(next[1], this._state.max);\r\n\t\t\tthis._state.from = Math.min(from, to);\r\n\t\t\tthis._state.to = Math.max(from, to);\r\n\t\t} else {\r\n\t\t\tthis._state.from = this._normalizeValue(value, this._state.min);\r\n\t\t}\r\n\r\n\t\tthis._syncUI();\r\n\r\n\t\tif (!silent) {\r\n\t\t\tthis._emit(emit === 'change' ? EVENT_KEY_CHANGE : EVENT_KEY_UPDATE, emit === 'change' ? 'onChange' : 'onUpdate');\r\n\t\t}\r\n\t}\r\n\r\n\tenable() {\r\n\t\tthis._setDisabledState(false);\r\n\t}\r\n\r\n\tdisable() {\r\n\t\tthis._setDisabledState(true);\r\n\t}\r\n\r\n\tdispose() {\r\n\t\tthis._listeners.forEach(({ element, type, handler }) => element.removeEventListener(type, handler));\r\n\t\tthis._listeners = [];\r\n\t\twindow.removeEventListener('resize', this._handleResize);\r\n\t\tsuper.dispose();\r\n\t}\r\n\r\n\t_buildParams(params) {\r\n\t\tconst merged = this._getParams(this._element, mergeDeepObject(defaultParams, params));\r\n\r\n\t\tif (this._sourceInput) {\r\n\t\t\tmerged.min = this._sourceInput.min !== '' ? normalizeData(this._sourceInput.min) : merged.min;\r\n\t\t\tmerged.max = this._sourceInput.max !== '' ? normalizeData(this._sourceInput.max) : merged.max;\r\n\t\t\tmerged.step = this._sourceInput.step !== '' ? normalizeData(this._sourceInput.step) : merged.step;\r\n\t\t\tmerged.start = this._sourceInput.value !== '' ? normalizeData(this._sourceInput.value) : merged.start;\r\n\t\t\tmerged.name = this._sourceInput.name || merged.name;\r\n\t\t\tmerged.disabled = this._sourceInput.disabled || merged.disabled;\r\n\t\t}\r\n\r\n\t\tif (typeof merged.name === 'string') {\r\n\t\t\tmerged.name = {\r\n\t\t\t\tmin: merged.name,\r\n\t\t\t\tmax: merged.name,\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tif (!merged.input || typeof merged.input !== 'object') {\r\n\t\t\tmerged.input = { min: null, max: null };\r\n\t\t}\r\n\r\n\t\tif (typeof merged.output === 'string') {\r\n\t\t\tmerged.output = {\r\n\t\t\t\ttarget: merged.output,\r\n\t\t\t\tmin: null,\r\n\t\t\t\tmax: null,\r\n\t\t\t};\r\n\t\t} else if (!merged.output || typeof merged.output !== 'object') {\r\n\t\t\tmerged.output = {\r\n\t\t\t\ttarget: null,\r\n\t\t\t\tmin: null,\r\n\t\t\t\tmax: null,\r\n\t\t\t};\r\n\t\t} else if (!Object.prototype.hasOwnProperty.call(merged.output, 'target')) {\r\n\t\t\tmerged.output.target = null;\r\n\t\t}\r\n\r\n\t\tif (!merged.labelWords && merged.label && typeof merged.label === 'object' && Object.prototype.hasOwnProperty.call(merged.label, 'words')) {\r\n\t\t\tmerged.labelWords = merged.label.words;\r\n\t\t}\r\n\r\n\t\tif (typeof merged.labelWords === 'string') {\r\n\t\t\tmerged.labelWords = merged.labelWords\r\n\t\t\t\t.split(',')\r\n\t\t\t\t.map((word) => word.trim())\r\n\t\t\t\t.filter(Boolean);\r\n\t\t} else if (!Array.isArray(merged.labelWords)) {\r\n\t\t\tmerged.labelWords = null;\r\n\t\t}\r\n\r\n\t\treturn merged;\r\n\t}\r\n\r\n\t_buildState() {\r\n\t\tconst min = Number(normalizeData(this._params.min));\r\n\t\tconst max = Math.max(Number(normalizeData(this._params.max)), min);\r\n\t\tconst step = Number(normalizeData(this._params.step)) || 1;\r\n\t\tconst start = this._resolveStartValues(min, max);\r\n\r\n\t\treturn {\r\n\t\t\tmin,\r\n\t\t\tmax: max >= min ? max : min,\r\n\t\t\tstep: step > 0 ? step : 1,\r\n\t\t\tfrom: start.from,\r\n\t\t\tto: start.to,\r\n\t\t};\r\n\t}\r\n\r\n\t_resolveRangeMode() {\r\n\t\tif (this._sourceInput) return false;\r\n\t\treturn normalizeData(this._params.range) === true;\r\n\t}\r\n\r\n\t_resolveStartValues(min, max) {\r\n\t\tlet from = min;\r\n\t\tlet to = max;\r\n\r\n\t\tif (this._isRange) {\r\n\t\t\tconst start = Array.isArray(this._params.start) ? this._params.start : [this._params.from, this._params.to];\r\n\t\t\tfrom = this._normalizeValue(start[0], min, min, max);\r\n\t\t\tto = this._normalizeValue(start[1], max, min, max);\r\n\t\t\tif (from > to) {\r\n\t\t\t\t[from, to] = [to, from];\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tconst value = this._params.start ?? this._params.value ?? min;\r\n\t\t\tfrom = this._normalizeValue(value, min, min, max);\r\n\t\t\tto = from;\r\n\t\t}\r\n\r\n\t\treturn { from, to };\r\n\t}\r\n\r\n\t_render() {\r\n\t\tconst root = this._sourceInput ? this._renderFromInput() : this._renderFromContainer();\r\n\t\tthis._dom.root = root;\r\n\t\tthis._dom.wrapper = Selectors.find('.vg-range-slider__wrapper', root);\r\n\t\tthis._dom.fill = Selectors.find('.vg-range-slider__fill', root);\r\n\t\tthis._dom.inputFrom = Selectors.find('.vg-range-slider__input--from', root);\r\n\t\tthis._dom.inputTo = Selectors.find('.vg-range-slider__input--to', root);\r\n\t\tthis._dom.tooltipFrom = Selectors.find('.vg-range-slider__tooltip--from', root);\r\n\t\tthis._dom.tooltipTo = Selectors.find('.vg-range-slider__tooltip--to', root);\r\n\t\tthis._dom.tooltipMerged = Selectors.find('.vg-range-slider__tooltip--merged', root);\r\n\t\tthis._dom.labelFrom = Selectors.find('.vg-range-slider__label--from', root);\r\n\t\tthis._dom.labelTo = Selectors.find('.vg-range-slider__label--to', root);\r\n\t\tthis._dom.labelSeparator = Selectors.find('.vg-range-slider__separator', root);\r\n\t\tthis._dom.hiddenMin = root.querySelector('input[data-vgrangeslider-hidden=\"min\"]');\r\n\t\tthis._dom.hiddenMax = root.querySelector('input[data-vgrangeslider-hidden=\"max\"]');\r\n\t\tthis._dom.skin = applyRangeSliderSkin(root, this._params, this._state, {\r\n\t\t\tformatValue: (value) => this._formatValue(value),\r\n\t\t\ttoPositionPx: (value) => this._toPositionPx(value),\r\n\t\t});\r\n\t}\r\n\r\n\t_renderFromInput() {\r\n\t\tconst sourceInput = this._sourceInput;\r\n\t\tconst root = document.createElement('div');\r\n\t\troot.className = CLASS_NAME_MODULE;\r\n\r\n\t\tconst wrapper = document.createElement('div');\r\n\t\twrapper.className = 'vg-range-slider__wrapper';\r\n\r\n\t\tconst track = document.createElement('div');\r\n\t\ttrack.className = 'vg-range-slider__track';\r\n\r\n\t\tconst fill = document.createElement('div');\r\n\t\tfill.className = 'vg-range-slider__fill';\r\n\r\n\t\tconst tooltip = this._params.tooltips ? this._createTooltip('from') : null;\r\n\t\tconst labels = this._params.labels ? this._createLabels(false) : null;\r\n\r\n\t\tsourceInput.insertAdjacentElement('beforebegin', root);\r\n\r\n\t\tsourceInput.classList.add('vg-range-slider__input', 'vg-range-slider__input--from');\r\n\t\tsourceInput.autocomplete = 'off';\r\n\r\n\t\ttrack.appendChild(fill);\r\n\t\twrapper.appendChild(track);\r\n\t\twrapper.appendChild(sourceInput);\r\n\t\tif (tooltip) wrapper.appendChild(tooltip);\r\n\t\troot.appendChild(wrapper);\r\n\t\tif (labels) root.appendChild(labels);\r\n\r\n\t\treturn root;\r\n\t}\r\n\r\n\t_renderFromContainer() {\r\n\t\tconst root = this._element;\r\n\t\troot.classList.add(CLASS_NAME_MODULE);\r\n\t\tif (this._isRange) root.classList.add(CLASS_NAME_RANGE);\r\n\r\n\t\troot.innerHTML = '';\r\n\r\n\t\tconst wrapper = document.createElement('div');\r\n\t\twrapper.className = 'vg-range-slider__wrapper';\r\n\r\n\t\tconst track = document.createElement('div');\r\n\t\ttrack.className = 'vg-range-slider__track';\r\n\r\n\t\tconst fill = document.createElement('div');\r\n\t\tfill.className = 'vg-range-slider__fill';\r\n\r\n\t\ttrack.appendChild(fill);\r\n\t\twrapper.appendChild(track);\r\n\r\n\t\tconst inputFrom = this._createRangeInput('from');\r\n\t\twrapper.appendChild(inputFrom);\r\n\r\n\t\tif (this._isRange) {\r\n\t\t\tconst inputTo = this._createRangeInput('to');\r\n\t\t\twrapper.appendChild(inputTo);\r\n\t\t}\r\n\r\n\t\tif (this._params.tooltips) {\r\n\t\t\twrapper.appendChild(this._createTooltip('from'));\r\n\t\t\tif (this._isRange) wrapper.appendChild(this._createTooltip('to'));\r\n\t\t\tif (this._isRange) wrapper.appendChild(this._createTooltip('merged'));\r\n\t\t}\r\n\r\n\t\troot.appendChild(wrapper);\r\n\r\n\t\tif (this._params.labels) {\r\n\t\t\troot.appendChild(this._createLabels(this._isRange));\r\n\t\t}\r\n\r\n\t\tif (this._isRange) {\r\n\t\t\tthis._ensureHiddenInput(root, 'min', this._params.input?.min, this._params.name?.min);\r\n\t\t\tthis._ensureHiddenInput(root, 'max', this._params.input?.max, this._params.name?.max);\r\n\t\t} else if (this._params.name?.min) {\r\n\t\t\tthis._ensureHiddenInput(root, 'min', this._params.input?.min, this._params.name.min);\r\n\t\t}\r\n\r\n\t\treturn root;\r\n\t}\r\n\r\n\t_createRangeInput(type) {\r\n\t\tconst input = document.createElement('input');\r\n\t\tinput.type = 'range';\r\n\t\tinput.className = `vg-range-slider__input vg-range-slider__input--${type}`;\r\n\t\tinput.min = String(this._state.min);\r\n\t\tinput.max = String(this._state.max);\r\n\t\tinput.step = String(this._state.step);\r\n\t\tinput.value = String(type === 'to' ? this._state.to : this._state.from);\r\n\t\tinput.autocomplete = 'off';\r\n\t\treturn input;\r\n\t}\r\n\r\n\t_createTooltip(type) {\r\n\t\tconst tooltip = document.createElement('span');\r\n\t\ttooltip.className = `vg-range-slider__tooltip vg-range-slider__tooltip--${type}`;\r\n\t\tif (type === 'merged') {\r\n\t\t\ttooltip.classList.add(CLASS_NAME_TOOLTIP_HIDDEN);\r\n\t\t}\r\n\t\treturn tooltip;\r\n\t}\r\n\r\n\t_createLabels(isRange) {\r\n\t\tconst labels = document.createElement('div');\r\n\t\tlabels.className = 'vg-range-slider__labels';\r\n\r\n\t\tconst from = document.createElement('span');\r\n\t\tfrom.className = 'vg-range-slider__label vg-range-slider__label--from';\r\n\t\tlabels.appendChild(from);\r\n\r\n\t\tif (isRange) {\r\n\t\t\tconst separator = document.createElement('span');\r\n\t\t\tseparator.className = 'vg-range-slider__separator';\r\n\t\t\tseparator.textContent = this._params.separator;\r\n\t\t\tlabels.appendChild(separator);\r\n\r\n\t\t\tconst to = document.createElement('span');\r\n\t\t\tto.className = 'vg-range-slider__label vg-range-slider__label--to';\r\n\t\t\tlabels.appendChild(to);\r\n\t\t}\r\n\r\n\t\treturn labels;\r\n\t}\r\n\r\n\t_ensureHiddenInput(root, role, selector, name) {\r\n\t\tlet input = selector ? Selectors.find(selector) : null;\r\n\t\tif (!input) {\r\n\t\t\tinput = document.createElement('input');\r\n\t\t\tinput.type = 'hidden';\r\n\t\t\tif (name) input.name = name;\r\n\t\t\troot.appendChild(input);\r\n\t\t}\r\n\t\tinput.setAttribute('data-vgrangeslider-hidden', role);\r\n\t}\r\n\r\n\t_bindEvents() {\r\n\t\tconst inputHandler = (type) => (event) => {\r\n\t\t\tconst rawValue = this._normalizeValue(event.target.value, this._state.min);\r\n\r\n\t\t\tif (this._isRange) {\r\n\t\t\t\tif (type === 'from') {\r\n\t\t\t\t\tthis._state.from = Math.min(rawValue, this._state.to);\r\n\t\t\t\t\tevent.target.value = String(this._state.from);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis._state.to = Math.max(rawValue, this._state.from);\r\n\t\t\t\t\tevent.target.value = String(this._state.to);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tthis._state.from = rawValue;\r\n\t\t\t}\r\n\r\n\t\t\tthis._syncUI();\r\n\t\t\tthis._emit(EVENT_KEY_INPUT, 'onInput');\r\n\t\t};\r\n\r\n\t\tconst changeHandler = () => {\r\n\t\t\tthis._syncUI();\r\n\t\t\tthis._emit(EVENT_KEY_CHANGE, 'onChange');\r\n\t\t};\r\n\r\n\t\t[this._dom.inputFrom, this._dom.inputTo].filter(Boolean).forEach((input) => {\r\n\t\t\tconst type = input.classList.contains('vg-range-slider__input--to') ? 'to' : 'from';\r\n\t\t\tconst onInput = inputHandler(type);\r\n\t\t\tconst onChange = changeHandler;\r\n\r\n\t\t\tinput.addEventListener('input', onInput);\r\n\t\t\tinput.addEventListener('change', onChange);\r\n\r\n\t\t\tthis._listeners.push({ element: input, type: 'input', handler: onInput });\r\n\t\t\tthis._listeners.push({ element: input, type: 'change', handler: onChange });\r\n\t\t});\r\n\r\n\t\twindow.addEventListener('resize', this._handleResize);\r\n\t}\r\n\r\n\t_syncUI() {\r\n\t\tconst fromPercent = this._toPercent(this._state.from);\r\n\t\tconst toPercent = this._toPercent(this._isRange ? this._state.to : this._state.from);\r\n\t\tconst fromPosition = this._toPositionPx(this._state.from);\r\n\t\tconst toPosition = this._toPositionPx(this._isRange ? this._state.to : this._state.from);\r\n\r\n\t\tif (this._dom.inputFrom) this._dom.inputFrom.value = String(this._state.from);\r\n\t\tif (this._dom.inputTo) this._dom.inputTo.value = String(this._state.to);\r\n\r\n\t\tif (this._dom.fill) {\r\n\t\t\tconst left = this._isRange ? fromPosition : 0;\r\n\t\t\tconst width = this._isRange ? (toPosition - fromPosition) : toPosition;\r\n\t\t\tthis._dom.fill.style.left = `${Math.max(left, 0)}px`;\r\n\t\t\tthis._dom.fill.style.width = `${Math.max(width, 0)}px`;\r\n\t\t}\r\n\r\n\t\tthis._placeTooltip(this._dom.tooltipFrom, fromPosition, this._formatValue(this._state.from));\r\n\t\tthis._placeTooltip(this._dom.tooltipTo, toPosition, this._formatValue(this._state.to));\r\n\t\tthis._syncTooltips(fromPosition, toPosition);\r\n\r\n\t\tif (this._dom.labelFrom) this._dom.labelFrom.textContent = this._formatValue(this._state.from);\r\n\t\tif (this._dom.labelTo) this._dom.labelTo.textContent = this._formatValue(this._state.to);\r\n\t\tif (this._dom.labelSeparator) this._dom.labelSeparator.hidden = !this._isRange;\r\n\r\n\t\tthis._syncTargets();\r\n\t\tsyncRangeSliderSkin(this._dom.skin, this._state, {\r\n\t\t\tisRange: this._isRange,\r\n\t\t\tparams: this._params,\r\n\t\t\tdom: this._dom,\r\n\t\t});\r\n\t}\r\n\r\n\t_syncTargets() {\r\n\t\tconst values = this.getValue();\r\n\t\tconst [from, to] = Array.isArray(values) ? values : [values, values];\r\n\r\n\t\tif (this._dom.hiddenMin) {\r\n\t\t\tthis._dom.hiddenMin.value = String(from);\r\n\t\t}\r\n\r\n\t\tif (this._dom.hiddenMax) {\r\n\t\t\tthis._dom.hiddenMax.value = String(to);\r\n\t\t}\r\n\r\n\t\tthis._setText(this._params.output?.target, this._isRange ? `${this._formatValue(from)}${this._params.separator}${this._formatValue(to)}` : this._formatValue(from));\r\n\t\tthis._setText(this._params.output?.min, this._formatValue(from));\r\n\t\tthis._setText(this._params.output?.max, this._formatValue(to));\r\n\t}\r\n\r\n\t_setDisabledState(state) {\r\n\t\tthis._params.disabled = !!state;\r\n\t\tif (this._dom.root) {\r\n\t\t\tthis._dom.root.classList.toggle(CLASS_NAME_DISABLED, this._params.disabled);\r\n\t\t}\r\n\r\n\t\t[this._dom.inputFrom, this._dom.inputTo].filter(Boolean).forEach((input) => {\r\n\t\t\tinput.disabled = this._params.disabled;\r\n\t\t});\r\n\t}\r\n\r\n\t_placeTooltip(node, percent, value) {\r\n\t\tif (!node) return;\r\n\t\tnode.textContent = value;\r\n\t\tnode.style.left = `${percent}px`;\r\n\t}\r\n\r\n\t_syncTooltips(fromPosition, toPosition) {\r\n\t\tconst mergedTooltip = this._dom.tooltipMerged;\r\n\t\tconst fromTooltip = this._dom.tooltipFrom;\r\n\t\tconst toTooltip = this._dom.tooltipTo;\r\n\r\n\t\tif (!this._isRange || !mergedTooltip || !fromTooltip || !toTooltip) {\r\n\t\t\tif (fromTooltip) fromTooltip.classList.remove(CLASS_NAME_TOOLTIP_HIDDEN);\r\n\t\t\tif (toTooltip) toTooltip.classList.remove(CLASS_NAME_TOOLTIP_HIDDEN);\r\n\t\t\tif (mergedTooltip) mergedTooltip.classList.add(CLASS_NAME_TOOLTIP_HIDDEN);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst gap = 8;\r\n\t\tconst fromHalfWidth = fromTooltip.offsetWidth / 2;\r\n\t\tconst toHalfWidth = toTooltip.offsetWidth / 2;\r\n\t\tconst isIntersected = (toPosition - fromPosition) <= (fromHalfWidth + toHalfWidth + gap);\r\n\r\n\t\tif (!isIntersected) {\r\n\t\t\tfromTooltip.classList.remove(CLASS_NAME_TOOLTIP_HIDDEN);\r\n\t\t\ttoTooltip.classList.remove(CLASS_NAME_TOOLTIP_HIDDEN);\r\n\t\t\tmergedTooltip.classList.add(CLASS_NAME_TOOLTIP_HIDDEN);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfromTooltip.classList.add(CLASS_NAME_TOOLTIP_HIDDEN);\r\n\t\ttoTooltip.classList.add(CLASS_NAME_TOOLTIP_HIDDEN);\r\n\t\tmergedTooltip.classList.remove(CLASS_NAME_TOOLTIP_HIDDEN);\r\n\t\tmergedTooltip.textContent = `${this._formatValue(this._state.from)}${this._params.separator}${this._formatValue(this._state.to)}`;\r\n\t\tmergedTooltip.style.left = `${(fromPosition + toPosition) / 2}px`;\r\n\t}\r\n\r\n\t_toPercent(value) {\r\n\t\tconst range = this._state.max - this._state.min;\r\n\t\tif (range <= 0) return 0;\r\n\t\treturn ((value - this._state.min) / range) * 100;\r\n\t}\r\n\r\n\t_toPositionPx(value) {\r\n\t\tconst wrapper = this._dom?.wrapper;\r\n\t\tconst range = this._state.max - this._state.min;\r\n\t\tif (!wrapper || range <= 0) return 0;\r\n\r\n\t\tconst percent = (value - this._state.min) / range;\r\n\t\tconst styles = getComputedStyle(this._dom.root || wrapper);\r\n\t\tconst thumbSize = parseFloat(styles.getPropertyValue('--vg-range-slider-thumb-size')) || 0;\r\n\t\tconst width = wrapper.clientWidth || 0;\r\n\r\n\t\tif (width <= 0) return 0;\r\n\t\tif (width <= thumbSize) return width / 2;\r\n\r\n\t\treturn (percent * (width - thumbSize)) + (thumbSize / 2);\r\n\t}\r\n\r\n\t_normalizeValue(value, fallback, min = this._state?.min ?? 0, max = this._state?.max ?? 100) {\r\n\t\tconst numeric = Number(normalizeData(value));\r\n\t\tconst safeValue = Number.isFinite(numeric) ? numeric : fallback;\r\n\t\tconst clamped = Math.min(Math.max(safeValue, min), max);\r\n\t\tconst step = this._state?.step || this._params.step || 1;\r\n\t\tconst stepped = Math.round((clamped - min) / step) * step + min;\r\n\t\treturn Number(stepped.toFixed(5));\r\n\t}\r\n\r\n\t_formatValue(value) {\r\n\t\tif (typeof this._params.formatValue === 'function') {\r\n\t\t\treturn this._params.formatValue.call(this, value, this._element);\r\n\t\t}\r\n\r\n\t\tconst prefix = this._params.prefix == null ? '' : String(this._params.prefix);\r\n\t\tconst suffix = this._params.suffix == null ? '' : String(this._params.suffix);\r\n\r\n\t\treturn `${prefix}${value}${suffix}`;\r\n\t}\r\n\r\n\t_getStatusBy() {\r\n\t\tif (typeof this._params?.status?.by !== 'string') {\r\n\t\t\treturn 'to';\r\n\t\t}\r\n\r\n\t\tconst by = this._params.status.by.toLowerCase();\r\n\t\treturn ['from', 'to', 'avg'].includes(by) ? by : 'to';\r\n\t}\r\n\r\n\t_getStatusPercentByValue(value) {\r\n\t\tconst range = this._state.max - this._state.min;\r\n\t\tif (range <= 0) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\treturn ((value - this._state.min) / range) * 100;\r\n\t}\r\n\r\n\t_getStatusToneByValue(value) {\r\n\t\tconst percent = this._getStatusPercentByValue(value);\r\n\t\tconst warningBelow = Number(this._params?.status?.warningBelow);\r\n\t\tconst dangerBelow = Number(this._params?.status?.dangerBelow);\r\n\t\tconst warningThreshold = Number.isFinite(warningBelow) ? warningBelow : 60;\r\n\t\tconst dangerThreshold = Number.isFinite(dangerBelow) ? dangerBelow : 30;\r\n\r\n\t\tif (percent < dangerThreshold) {\r\n\t\t\treturn 'danger';\r\n\t\t}\r\n\r\n\t\tif (percent < warningThreshold) {\r\n\t\t\treturn 'warning';\r\n\t\t}\r\n\r\n\t\treturn 'success';\r\n\t}\r\n\r\n\t_getStatusLabelByTone(tone) {\r\n\t\tif (!Array.isArray(this._params?.labelWords) || this._params.labelWords.length < 3) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tif (tone === 'danger') {\r\n\t\t\treturn this._params.labelWords[0] || null;\r\n\t\t}\r\n\r\n\t\tif (tone === 'warning') {\r\n\t\t\treturn this._params.labelWords[1] || null;\r\n\t\t}\r\n\r\n\t\treturn this._params.labelWords[2] || null;\r\n\t}\r\n\r\n\t_getStatusDetail() {\r\n\t\tconst by = this._getStatusBy();\r\n\t\tconst fromValue = this._state.from;\r\n\t\tconst toValue = this._state.to;\r\n\t\tconst sourceValue = by === 'from'\r\n\t\t\t? fromValue\r\n\t\t\t: by === 'avg'\r\n\t\t\t\t? (fromValue + toValue) / 2\r\n\t\t\t\t: toValue;\r\n\t\tconst tone = this._getStatusToneByValue(sourceValue);\r\n\r\n\t\treturn {\r\n\t\t\tby,\r\n\t\t\tsourceValue,\r\n\t\t\tpercent: Number(this._getStatusPercentByValue(sourceValue).toFixed(5)),\r\n\t\t\ttone,\r\n\t\t\tlabel: this._getStatusLabelByTone(tone),\r\n\t\t\tfrom: {\r\n\t\t\t\tvalue: fromValue,\r\n\t\t\t\tpercent: Number(this._getStatusPercentByValue(fromValue).toFixed(5)),\r\n\t\t\t\ttone: this._getStatusToneByValue(fromValue),\r\n\t\t\t\tlabel: this._getStatusLabelByTone(this._getStatusToneByValue(fromValue)),\r\n\t\t\t},\r\n\t\t\tto: {\r\n\t\t\t\tvalue: toValue,\r\n\t\t\t\tpercent: Number(this._getStatusPercentByValue(toValue).toFixed(5)),\r\n\t\t\t\ttone: this._getStatusToneByValue(toValue),\r\n\t\t\t\tlabel: this._getStatusLabelByTone(this._getStatusToneByValue(toValue)),\r\n\t\t\t},\r\n\t\t};\r\n\t}\r\n\r\n\t_emit(eventName, callbackName) {\r\n\t\tconst detail = {\r\n\t\t\tvalue: this.getValue(),\r\n\t\t\tfrom: this._state.from,\r\n\t\t\tto: this._state.to,\r\n\t\t\tmin: this._state.min,\r\n\t\t\tmax: this._state.max,\r\n\t\t\tstep: this._state.step,\r\n\t\t\tstatus: this._getStatusDetail(),\r\n\t\t\tinstance: this,\r\n\t\t};\r\n\r\n\t\tEventHandler.trigger(this._element, eventName, detail);\r\n\r\n\t\tconst callback = this._params[callbackName];\r\n\t\tif (typeof callback === 'function') {\r\n\t\t\tcallback.call(this, this._element, detail);\r\n\t\t}\r\n\t}\r\n\r\n\t_setText(selector, value) {\r\n\t\tif (!selector) return;\r\n\t\tconst target = Selectors.find(selector);\r\n\t\tif (target) target.textContent = value;\r\n\t}\r\n}\r\n\r\nEventHandler.on(document, 'DOMContentLoaded', () => {\r\n\tSelectors.findAll(SELECTOR_DATA_MODULE).forEach((element) => {\r\n\t\tif (!element.dataset.vgrangesliderInitialized) {\r\n\t\t\tVGRangeSlider.getOrCreateInstance(element);\r\n\t\t\telement.dataset.vgrangesliderInitialized = 'true';\r\n\t\t}\r\n\t});\r\n});\r\n\r\nexport default VGRangeSlider;\r\n","import VGRangeSlider from './js/vgrangeslider';\r\n\r\nexport default VGRangeSlider;","import BaseModule from \"../../base-module\";\r\nimport { execute, isDisabled, mergeDeepObject } from \"../../../utils/js/functions\";\r\nimport EventHandler from \"../../../utils/js/dom/event\";\r\nimport Selectors from \"../../../utils/js/dom/selectors\";\r\nimport {lang_buttons} from \"../../../utils/js/components/lang\";\r\nimport {Classes, Manipulator} from \"../../../utils/js/dom/manipulator\";\r\n\r\n/**\r\n * @class VGRollup\r\n * @extends BaseModule\r\n * @description\r\n * Модуль \"Rollup\" — реализует функционал сворачивания/разворачивания контента.\r\n * Поддерживает два режима: текст (ограничение по высоте) и элементы (ограничение по количеству).\r\n * Автоматически создаёт кнопку управления, если включена.\r\n *\r\n * @example\r\n * // Инициализация через JS\r\n * VGRollup.init(document.querySelector('.rollup'), {\r\n * height: 100,\r\n * button: {\r\n * enabled: true,\r\n * more: \"Показать\",\r\n * less: \"Свернуть\"\r\n * }\r\n * });\r\n *\r\n * // Инициализация через data-атрибут\r\n * // <div class=\"rollup\" data-vg-rollup='{\"height\": 80, \"button\": {\"more\": \"Еще\"}}'>...</div>\r\n */\r\n\r\n/**\r\n * Constants\r\n */\r\nconst NAME = 'rollup';\r\nconst NAME_KEY = 'vg.rollup';\r\nconst CLASS_NAME_SHOW = 'show';\r\nconst CLASS_NAME_HIDE = 'vg-rollup-display--none';\r\nconst SELECTOR_DATA_TOGGLE = '[data-vg-toggle=\"rollup\"]';\r\n\r\nconst EVENT_KEY_HIDE = `${NAME_KEY}.hide`;\r\nconst EVENT_KEY_SHOW = `${NAME_KEY}.show`;\r\nconst EVENT_KEY_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;\r\n\r\nclass VGRollup extends BaseModule {\r\n\r\n\t/**\r\n\t * @constructor\r\n\t * @param {HTMLElement} element - Основной контейнер контента.\r\n\t * @param {Object} params - Параметры конфигурации.\r\n\t * @param {Object} [params.lang = 'ru'] - Локализация\r\n\t * @param {string} [params.content='text'] - Режим: `'text'` (ограничение по высоте) или `'elements'` (по количеству).\r\n\t * @param {number} [params.cnt=0] - Количество видимых элементов в режиме `'elements'`.\r\n\t * @param {boolean} [params.fade=true] - Добавлять эффект затухания.\r\n\t * @param {boolean} [params.transition=false] - Включить CSS-анимацию при переключении.\r\n\t * @param {boolean} [params.number=false] - Показывать количество скрытых элементов.\r\n\t * @param {number} [params.height=0] - Высота в px, до которой сворачивается текст.\r\n\t * @param {Object} [params.ellipsis] - Настройки для многоточия.\r\n\t * @param {number|null} [params.ellipsis.line=null] - Количество строк перед обрезкой (только для `display: -webkit-box`).\r\n\t * @param {string} [params.more=' еще '] - Текст для отображения количества скрытых элементов.\r\n\t * @param {Object} [params.button] - Настройки кнопки.\r\n\t * @param {boolean} [params.button.enabled=true] - Показывать кнопку управления.\r\n\t * @param {string} [params.button.more=\"Показать\"] - Текст кнопки для раскрытия.\r\n\t * @param {string} [params.button.less=\"Свернуть\"] - Текст кнопки для сворачивания.\r\n\t *\r\n\t * @example\r\n\t * new VGRollup(document.querySelector('.rollup'), {\r\n\t * content: 'elements',\r\n\t * elements: 'item',\r\n\t * cnt: 3,\r\n\t * button: { more: 'Показать ещё', less: 'Свернуть' }\r\n\t * });\r\n\t */\r\n\tconstructor(element, params = {}) {\r\n\t\tsuper(element, params);\r\n\r\n\t\tconst defaultParams = {\r\n\t\t\tlang: document.documentElement.lang || 'ru',\r\n\t\t\tcontent: 'text',\r\n\t\t\tcnt: 0,\r\n\t\t\tfade: true,\r\n\t\t\ttransition: false,\r\n\t\t\tnumber: false,\r\n\t\t\theight: 0,\r\n\t\t\tellipsis: {\r\n\t\t\t\tline: null\r\n\t\t\t},\r\n\t\t\tmore: ' еще ',\r\n\t\t\tbutton: {\r\n\t\t\t\tenabled: true,\r\n\t\t\t\tmore: 'Показать',\r\n\t\t\t\tless: 'Свернуть',\r\n\t\t\t\tclasses: ''\r\n\t\t\t},\r\n\t\t\tcallbacks: {\r\n\t\t\t\tinit: () => {},\r\n\t\t\t\texpand: () => {},\r\n\t\t\t\tcollapse: () => {}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tlet lang = Manipulator.get(element, 'data-lang') || ('lang' in params) ? params.lang : defaultParams.lang;\r\n\r\n\t\t// Локализация текстов кнопок\r\n\t\tdefaultParams.button.more = lang_buttons(lang, NAME)['show'];\r\n\t\tdefaultParams.button.less = lang_buttons(lang, NAME)['less'];\r\n\t\tdefaultParams.more = lang_buttons(lang, NAME)['more'];\r\n\r\n\r\n\t\tthis._params = this._getParams(element, mergeDeepObject(defaultParams, params));\r\n\r\n\t\t/**\r\n\t\t * CSS-классы, используемые модулем.\r\n\t\t * @type {Object}\r\n\t\t * @property {string} container - Базовый класс контейнера.\r\n\t\t * @property {string} hidden - Класс для скрытого состояния.\r\n\t\t * @property {string} fade - Класс для эффекта затухания.\r\n\t\t * @property {string} ellipsis - Класс для многоточия.\r\n\t\t * @property {string} button - Класс контейнера кнопки.\r\n\t\t * @property {string} transition - Класс для анимации.\r\n\t\t */\r\n\t\tthis.classes = {\r\n\t\t\tcontainer: 'vg-rollup',\r\n\t\t\thidden: \"vg-rollup-content--hidden\",\r\n\t\t\tfade: \"vg-rollup-content--fade\",\r\n\t\t\tellipsis: \"vg-rollup-content--ellipsis\",\r\n\t\t\tbutton: \"vg-rollup-content--button\",\r\n\t\t\ttransition: \"vg-rollup-content--transition\"\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Общее количество элементов (в режиме `elements`).\r\n\t\t * @type {number}\r\n\t\t */\r\n\t\tthis.total = 0;\r\n\r\n\t\t/**\r\n\t\t * Количество видимых элементов (в режиме `elements`).\r\n\t\t * @type {number}\r\n\t\t */\r\n\t\tthis.count = 0;\r\n\r\n\t\t/**\r\n\t\t * Смещение для подгрузки (если используется).\r\n\t\t * @type {number}\r\n\t\t */\r\n\t\tthis.offset = 0;\r\n\r\n\t\t/**\r\n\t\t * Флаг активности режима смещения.\r\n\t\t * @type {boolean}\r\n\t\t */\r\n\t\tthis.isOffset = false;\r\n\r\n\t\tthis.build();\r\n\t}\r\n\r\n\t/**\r\n\t * Имя модуля\r\n\t * @type {string}\r\n\t */\r\n\tstatic get NAME() { return NAME; }\r\n\r\n\t/**\r\n\t * Ключ модуля (пространство имён событий)\r\n\t * @type {string}\r\n\t */\r\n\tstatic get NAME_KEY() { return NAME_KEY; }\r\n\r\n\t/**\r\n\t * Переключает состояние контента (свёрнут/развёрнут).\r\n\t * @param {HTMLElement} target - Целевой контейнер контента.\r\n\t * @param {HTMLElement} relatedTarget - Кнопка, вызвавшая переключение.\r\n\t * @static\r\n\t * @example\r\n\t * VGRollup.toggle(document.querySelector('.rollup'), buttonEl);\r\n\t */\r\n\tstatic toggle(target, relatedTarget) {\r\n\t\tconst instance = VGRollup.getOrCreateInstance(target);\r\n\t\tconst isShown = instance.isShow();\r\n\r\n\t\tif (!isShown) {\r\n\t\t\tinstance._show(relatedTarget);\r\n\t\t} else {\r\n\t\t\tinstance._hide(relatedTarget);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Открывает (разворачивает) контент.\r\n\t * @param {HTMLElement} relatedTarget - Элемент, вызвавший событие (кнопка).\r\n\t * @private\r\n\t */\r\n\t_show(relatedTarget) {\r\n\t\tClasses.add(this._element, CLASS_NAME_SHOW);\r\n\t\trelatedTarget.innerHTML = this._params.button.less;\r\n\t\tManipulator.set(relatedTarget, 'aria-expanded', 'true');\r\n\r\n\t\tif (this.offset > 0) {\r\n\t\t\trelatedTarget.innerHTML = this.isOffset ? this._params.button.more : this._params.button.less;\r\n\t\t\tManipulator.set(relatedTarget, 'aria-expanded', this.isOffset ? \"true\" : \"false\");\r\n\t\t}\r\n\r\n\t\tthis.switch(this._element, false);\r\n\t\tEventHandler.trigger(this._element, EVENT_KEY_SHOW, { relatedTarget });\r\n\t}\r\n\r\n\t/**\r\n\t * Закрывает (сворачивает) контент.\r\n\t * @param {HTMLElement} relatedTarget - Элемент, вызвавший событие (кнопка).\r\n\t * @private\r\n\t */\r\n\t_hide(relatedTarget) {\r\n\t\tlet buttonText = this._params.button.more;\r\n\t\tconst isShowNum = this._params.number;\r\n\r\n\t\tif (isShowNum) {\r\n\t\t\tconst sum = this.total - this.count;\r\n\t\t\tif (sum > 0) {\r\n\t\t\t\tbuttonText += this._params.more + sum;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tClasses.remove(this._element, CLASS_NAME_SHOW);\r\n\t\tManipulator.set(relatedTarget, 'aria-expanded', 'false');\r\n\t\trelatedTarget.textContent = buttonText;\r\n\r\n\t\tthis.switch(this._element, true);\r\n\t\tEventHandler.trigger(this._element, EVENT_KEY_HIDE, { relatedTarget });\r\n\t}\r\n\r\n\t/**\r\n\t * Инициализирует отображение контента и создаёт кнопку (если нужно).\r\n\t * @param {HTMLElement|null} el - Элемент, который нужно инициализировать.\r\n\t * @param {boolean} isButtonAppend - Разрешено ли добавление кнопки.\r\n\t * @example\r\n\t * instance.build(); // перестроить текущий элемент\r\n\t */\r\n\tbuild(el = null, isButtonAppend = true) {\r\n\t\tconst element = el || this._element;\r\n\t\tconst selfHeight = element.clientHeight;\r\n\t\tconst setHeight = this._params.height || (selfHeight / 2);\r\n\r\n\t\tconst {\r\n\t\t\tfade,\r\n\t\t\ttransition,\r\n\t\t\tbutton,\r\n\t\t\tnumber: showNum,\r\n\t\t\tcontent,\r\n\t\t\telements: elementClass,\r\n\t\t\tcnt,\r\n\t\t\tellipsis: ellipsisCfg\r\n\t\t} = this._params;\r\n\r\n\t\tconst isEllipsis = ellipsisCfg.line !== null;\r\n\t\tconst isButton = button.enabled && isButtonAppend;\r\n\r\n\t\tClasses.add(element, this.classes.container);\r\n\r\n\t\tif (!isButtonAppend) {\r\n\t\t\tthis.switch(element);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (content === 'text' && selfHeight > setHeight) {\r\n\t\t\tthis._setupTextContent(element, setHeight, fade, transition, isEllipsis, ellipsisCfg.line, isButton, showNum);\r\n\t\t} else if (content === 'elements') {\r\n\t\t\tthis._setupElementsContent(element, elementClass, cnt, fade, transition, isEllipsis, isButton, showNum);\r\n\t\t}\r\n\r\n\t\texecute(this._params.callbacks.init, [element, this])\r\n\t}\r\n\r\n\t/**\r\n\t * Настраивает контент типа 'text' (ограничение по высоте).\r\n\t * @param {HTMLElement} element - Контейнер текста.\r\n\t * @param {number} height - Высота, до которой обрезать.\r\n\t * @param {boolean} fade - Использовать затухание.\r\n\t * @param {boolean} transition - Использовать анимацию.\r\n\t * @param {boolean} isEllipsis - Использовать многоточие.\r\n\t * @param {number|null} line - Количество строк.\r\n\t * @param {boolean} isButton - Показывать кнопку.\r\n\t * @param {boolean} showNum - Показывать счётчик.\r\n\t * @private\r\n\t */\r\n\t_setupTextContent(element, height, fade, transition, isEllipsis, line, isButton, showNum) {\r\n\t\tClasses.add(element, this.classes.hidden);\r\n\t\telement.style.height = height + \"px\";\r\n\r\n\t\tif (isEllipsis && line) {\r\n\t\t\tClasses.add(element, this.classes.ellipsis);\r\n\t\t\telement.style.lineClamp = Number(line);\r\n\t\t} else if (isEllipsis) {\r\n\t\t\tconsole.error(\"Переменная [data-line] или параметр[line] не должны быть пустыми\");\r\n\t\t}\r\n\r\n\t\tif (transition) Classes.add(element, this.classes.transition);\r\n\t\tif (fade) Classes.add(element, this.classes.fade);\r\n\r\n\t\tif (isButton) this._createButton(element, '', showNum);\r\n\t}\r\n\r\n\t/**\r\n\t * Настраивает контент типа 'elements' (ограничение по количеству).\r\n\t * @param {HTMLElement} element - Контейнер элементов.\r\n\t * @param {string} elementClass - Класс видимых элементов.\r\n\t * @param {number} cnt - Количество видимых элементов.\r\n\t * @param {boolean} fade - Использовать затухание.\r\n\t * @param {boolean} transition - Использовать анимацию.\r\n\t * @param {boolean} isEllipsis - Использовать многоточие.\r\n\t * @param {boolean} isButton - Показывать кнопку.\r\n\t * @param {boolean} showNum - Показывать счётчик.\r\n\t * @private\r\n\t */\r\n\t_setupElementsContent(element, elementClass, cnt, fade, transition, isEllipsis, isButton, showNum) {\r\n\t\tconst items = Selectors.findAll('.' + elementClass, element);\r\n\t\tthis.total = items.length;\r\n\t\tthis.count = cnt;\r\n\r\n\t\titems.forEach((item, index) => {\r\n\t\t\tif (index >= cnt) {\r\n\t\t\t\tClasses.add(item, CLASS_NAME_HIDE);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tconst shouldShowButton = isButton && items.length > cnt;\r\n\r\n\t\tif (isEllipsis) Classes.add(element, this.classes.ellipsis);\r\n\t\tif (transition) Classes.add(element, this.classes.transition);\r\n\t\tif (fade) Classes.add(element, this.classes.fade);\r\n\r\n\t\tif (shouldShowButton) {\r\n\t\t\tconst sum = this.total - this.count;\r\n\t\t\tconst textShowNum = showNum && sum > 0 ? this._params.more + sum : '';\r\n\t\t\tthis._createButton(element, textShowNum, false);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Создаёт кнопку управления разворачиванием.\r\n\t * @param {HTMLElement} element - Целевой контейнер.\r\n\t * @param {string} textNum - Дополнительный текст (например, количество).\r\n\t * @param {boolean} showNum - Флаг отображения числа (не используется).\r\n\t * @private\r\n\t */\r\n\t_createButton(element, textNum = '', showNum = false) {\r\n\t\tif (!element.id) {\r\n\t\t\telement.id = `vg-rollup-${Math.random().toString(36).substr(2, 9)}`;\r\n\t\t}\r\n\r\n\t\tconst btnTextMore = this._params.button.more;\r\n\t\tconst btnHTML = `<div class=\"${this.classes.button}\">\r\n <a href=\"#\" aria-expanded=\"false\" data-vg-toggle=\"rollup\" class=\"${this._params.button.classes}\" data-vg-target=\"#${element.id}\">\r\n ${btnTextMore}${textNum}\r\n </a>\r\n </div>`;\r\n\r\n\t\telement.insertAdjacentHTML(\"afterend\", btnHTML);\r\n\t}\r\n\r\n\t/**\r\n\t * Переключает состояние скрытия/показа контента.\r\n\t * @param {HTMLElement} el - Элемент контента.\r\n\t * @param {boolean} switcher - Если `true` — свернуть, иначе — полностью открыть.\r\n\t * @example\r\n\t * instance.switch(element, true); // свернуть\r\n\t * instance.switch(element, false); // развернуть\r\n\t */\r\n\tswitch(el, switcher = false) {\r\n\t\tif (switcher && !this.isOffset) {\r\n\t\t\tconst { content } = this._params;\r\n\t\t\tconst selfHeight = el.clientHeight;\r\n\t\t\tconst setHeight = this._params.height || selfHeight / 2;\r\n\r\n\t\t\tif (content === 'text' && selfHeight > setHeight) {\r\n\t\t\t\tClasses.add(el, this.classes.hidden);\r\n\t\t\t\tel.style.height = setHeight + \"px\";\r\n\r\n\t\t\t\tif (this._params.ellipsis.line) {\r\n\t\t\t\t\tClasses.add(el, this.classes.ellipsis);\r\n\t\t\t\t\tel.style.lineClamp = this._params.ellipsis.line;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (this._params.fade) Classes.add(el, this.classes.fade);\r\n\t\t\t\tif (this._params.transition) Classes.add(el, this.classes.transition);\r\n\r\n\t\t\t\texecute(this._params.callbacks.expand, [el, this])\r\n\t\t\t} else if (content === 'elements') {\r\n\t\t\t\tconst items = Selectors.findAll('.' + this._params.elements, el);\r\n\t\t\t\titems.forEach((item, index) => {\r\n\t\t\t\t\tif (index >= this.count) {\r\n\t\t\t\t\t\tClasses.add(item, CLASS_NAME_HIDE);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\texecute(this._params.callbacks.collapse, [el, items, this])\r\n\t\t\t}\r\n\r\n\t\t\tClasses.add(el, this.classes.container);\r\n\t\t} else {\r\n\t\t\tconst { hidden, ellipsis, fade } = this.classes;\r\n\t\t\tClasses.remove(el, [hidden, ellipsis, fade]);\r\n\t\t\tManipulator.remove(el, 'style');\r\n\r\n\t\t\tif (this._params.content === 'elements') {\r\n\t\t\t\tconst items = Selectors.findAll('.' + this._params.elements, el);\r\n\t\t\t\titems.forEach(item => Classes.remove(item, CLASS_NAME_HIDE));\r\n\t\t\t}\r\n\r\n\t\t\texecute(this._params.callbacks.expand, [el, this])\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Проверяет, развёрнут ли контент.\r\n\t * @returns {boolean} `true`, если контент развёрнут.\r\n\t * @example\r\n\t * if (instance.isShow()) { ... }\r\n\t */\r\n\tisShow() {\r\n\t\treturn Classes.has(this._element, CLASS_NAME_SHOW);\r\n\t}\r\n\r\n\t/**\r\n\t * Инициализирует экземпляр VGRollup для элемента.\r\n\t * @param {HTMLElement} element - Целевой элемент.\r\n\t * @param {Object} params - Параметры конфигурации.\r\n\t * @param {Function} [callback] - Колбэк, вызываемый после инициализации.\r\n\t * @static\r\n\t * @example\r\n\t * VGRollup.init(document.querySelector('.rollup'), { height: 100 }, (instance) => {\r\n\t * console.log('Rollup инициализирован:', instance);\r\n\t * });\r\n\t */\r\n\tstatic init(element, params = {}, callback) {\r\n\t\tconst instance = VGRollup.getOrCreateInstance(element, params);\r\n\t\texecute(callback, [instance]);\r\n\t}\r\n}\r\n\r\n/**\r\n * Подключает обработчик кликов по data-атрибуту для автоматической инициализации.\r\n * @listens click\r\n * @event\r\n */\r\nEventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\r\n\tif (['A', 'AREA'].includes(this.tagName)) {\r\n\t\tevent.preventDefault();\r\n\t}\r\n\r\n\tif (isDisabled(this)) return;\r\n\r\n\tconst target = Selectors.getElementFromSelector(this);\r\n\tif (!target) return;\r\n\r\n\tVGRollup.toggle(target, this);\r\n});\r\n\r\nexport default VGRollup;","import VGRollup from \"./js/vgrollup\";\r\n\r\nexport default VGRollup;","import VGSelect from \"./vgselect\";\r\nimport EventHandler from \"../../../utils/js/dom/event\";\r\nimport Selectors from \"../../../utils/js/dom/selectors\";\r\nimport {Manipulator} from \"../../../utils/js/dom/manipulator\";\r\nimport {transliterate} from \"../../../utils/js/functions\";\r\n\r\nconst NAME_KEY = 'vg.select';\r\n\r\nconst CLASS_NAME_SHOW = 'show';\r\nconst CLASS_NAME_CONTAINER = 'vg-select';\r\nconst CLASS_NAME_DROPDOWN = 'vg-select-dropdown';\r\nconst CLASS_NAME_LIST = 'vg-select-list';\r\nconst CLASS_NAME_OPTION = 'vg-select-list--option';\r\nconst CLASS_NAME_OPTGROUP = 'vg-select-list--optgroup';\r\nconst CLASS_NAME_TAGS = 'vg-select-tags';\r\nconst CLASS_NAME_TAG = 'vg-select-tag';\r\nconst CLASS_NAME_TAG_REMOVE = 'vg-select-tag-remove';\r\n\r\nconst EVENT_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;\r\nconst EVENT_KEY_UP_DATA_API = `keyup.${NAME_KEY}.data.api`;\r\nconst EVENT_RESET_DATA_API = `reset.${NAME_KEY}.data.api`;\r\nconst EVENT_KEYDOWN_DATA_API = `keydown.${NAME_KEY}.data.api`;\r\n\r\nconst EVENT_KEY_CHANGE = `${NAME_KEY}.change`;\r\nconst EVENT_KEY_SEARCH = `${NAME_KEY}.search`;\r\nconst EVENT_KEY_SELECT = `${NAME_KEY}.select`;\r\nconst EVENT_KEY_DESELECT = `${NAME_KEY}.deselect`;\r\n\r\nconst SELECTOR_DATA_TOGGLE = '[data-vg-toggle=\"select\"]';\r\nconst SELECTOR_OPTION_TOGGLE = '[data-vg-toggle=\"select-option\"]';\r\nconst SELECTOR_SEARCH_TOGGLE = '[name=\"vg-select-search\"]';\r\nconst SELECTOR_DROPDOWN = `.${CLASS_NAME_DROPDOWN}`;\r\nconst SELECTOR_MULTIPLE_INPUT = `.vg-select-multiple-input`;\r\n\r\nconst _handlersVGSelect = () => {\r\n\tEventHandler.on(document, EVENT_CLICK_DATA_API, e => VGSelect.clearDrops(e));\r\n\r\n\tEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function(e) {\r\n\t\tconst target = e.target;\r\n\t\tif (target.closest(`.${CLASS_NAME_TAG}`) || target.closest(`.${CLASS_NAME_TAG_REMOVE}`)) {\r\n\t\t\te.stopPropagation();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst container = this.closest(`.${CLASS_NAME_CONTAINER}`);\r\n\t\tconst instance = VGSelect.getOrCreateInstance(container);\r\n\t\tconst open = Selectors.find(`.${CLASS_NAME_CONTAINER}.${CLASS_NAME_SHOW}`);\r\n\t\tif (open && open !== container) VGSelect.getInstance(open)?.hide();\r\n\t\tinstance.toggle(this);\r\n\t});\r\n\r\n\tEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_OPTION_TOGGLE, function(e) {\r\n\t\tconst option = e.target;\r\n\t\tif (option.classList.contains('disabled')) return;\r\n\t\tconst container = option.closest(`.${CLASS_NAME_CONTAINER}`);\r\n\t\tconst select = container.previousElementSibling;\r\n\t\tconst isMultiple = select.multiple;\r\n\r\n\t\t// value у option может отсутствовать/быть пустым -> работаем по индексу\r\n\t\tconst indexStr = option.dataset.index;\r\n\t\tconst idx = Number.isFinite(Number(indexStr)) ? parseInt(indexStr, 10) : NaN;\r\n\t\tconst realOpt = Number.isInteger(idx) ? select.options[idx] : null;\r\n\t\tif (!realOpt) return;\r\n\r\n\t\tconst instance = VGSelect.getInstance(container);\r\n\t\tconst wasSelected = realOpt.selected;\r\n\r\n\t\tconst value = realOpt.value;\r\n\r\n\t\tif (isMultiple) {\r\n\t\t\trealOpt.selected = !realOpt.selected;\r\n\t\t\toption.classList.toggle('selected', realOpt.selected);\r\n\t\t\tVGSelect.updateUI(select);\r\n\t\t\tselect.dispatchEvent(new Event('change', { bubbles: true }));\r\n\t\t\tEventHandler.trigger(select, EVENT_KEY_CHANGE, {\r\n\t\t\t\tdata: { value, title: option.textContent, ...Manipulator.get(option) }\r\n\t\t\t});\r\n\r\n\t\t\tif (realOpt.selected) {\r\n\t\t\t\tinstance?._triggerEvent(EVENT_KEY_SELECT, { value, title: option.textContent, ...Manipulator.get(option) });\r\n\t\t\t\tinstance?._callCallback('onSelect', { value, title: option.textContent, ...Manipulator.get(option) });\r\n\t\t\t} else {\r\n\t\t\t\tinstance?._triggerEvent(EVENT_KEY_DESELECT, { value, title: option.textContent, ...Manipulator.get(option) });\r\n\t\t\t\tinstance?._callCallback('onDeselect', { value, title: option.textContent, ...Manipulator.get(option) });\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (wasSelected) return;\r\n\r\n\t\t\tcontainer.querySelectorAll(`.${CLASS_NAME_OPTION}`).forEach(o => o.classList.remove('selected'));\r\n\t\t\toption.classList.add('selected');\r\n\r\n\t\t\tVGSelect.changeSelectorByIndex(select, idx, {\r\n\t\t\t\tindex: idx,\r\n\t\t\t\tvalue,\r\n\t\t\t\ttitle: option.textContent,\r\n\t\t\t\t...Manipulator.get(option)\r\n\t\t\t});\r\n\r\n\t\t\tconst closeOnSelect = instance?._params?.close !== false;\r\n\t\t\tif (closeOnSelect) instance?.hide();\r\n\t\t}\r\n\t});\r\n\r\n\tEventHandler.on(document, EVENT_KEY_UP_DATA_API, SELECTOR_SEARCH_TOGGLE, function(e) {\r\n\t\tconst input = e.target;\r\n\t\tconst dropdown = input.closest(SELECTOR_DROPDOWN);\r\n\t\tconst list = dropdown?.querySelector(`.${CLASS_NAME_LIST}`);\r\n\t\tif (!list) return;\r\n\r\n\t\tconst container = input.closest(`.${CLASS_NAME_CONTAINER}`);\r\n\t\tconst instance = VGSelect.getInstance(container);\r\n\r\n\t\tconst options = list.querySelectorAll(`.${CLASS_NAME_OPTION}`);\r\n\t\tconst groups = list.querySelectorAll(`.${CLASS_NAME_OPTGROUP}`);\r\n\t\tconst value = input.value.trim().toLowerCase();\r\n\t\tconst search = [value, transliterate(value), transliterate(value, true)];\r\n\r\n\t\toptions.forEach(el => { el.hidden = false; el.style.display = ''; });\r\n\t\tgroups.forEach(el => { el.hidden = false; el.style.display = ''; });\r\n\r\n\t\tif (value) {\r\n\t\t\tlet visibleCount = 0;\r\n\t\t\tgroups.length ? groups.forEach(group => {\r\n\t\t\t\tconst items = group.querySelectorAll(`.${CLASS_NAME_OPTION}`);\r\n\t\t\t\tconst visible = Array.from(items).some(item => {\r\n\t\t\t\t\tconst t = item.textContent.toLowerCase();\r\n\t\t\t\t\treturn search.some(s => t.includes(s));\r\n\t\t\t\t});\r\n\t\t\t\tgroup.hidden = !visible;\r\n\t\t\t\tgroup.style.display = visible ? '' : 'none';\r\n\t\t\t\titems.forEach(item => {\r\n\t\t\t\t\tconst t = item.textContent.toLowerCase();\r\n\t\t\t\t\tconst match = search.some(s => t.includes(s));\r\n\t\t\t\t\titem.hidden = !match;\r\n\t\t\t\t\titem.style.display = match ? '' : 'none';\r\n\t\t\t\t\tif (match) visibleCount++;\r\n\t\t\t\t});\r\n\t\t\t}) : options.forEach(option => {\r\n\t\t\t\tconst t = option.textContent.toLowerCase();\r\n\t\t\t\tconst match = search.some(s => t.includes(s));\r\n\t\t\t\toption.hidden = !match;\r\n\t\t\t\toption.style.display = match ? '' : 'none';\r\n\t\t\t\tif (match) visibleCount++;\r\n\t\t\t});\r\n\r\n\t\t\tinstance?._triggerEvent(EVENT_KEY_SEARCH, { query: value, results: visibleCount });\r\n\t\t\tinstance?._callCallback('onSearch', { query: value, results: visibleCount });\r\n\t\t} else {\r\n\t\t\tinstance?._triggerEvent(EVENT_KEY_SEARCH, { query: '', results: options.length });\r\n\t\t\tinstance?._callCallback('onSearch', { query: '', results: options.length });\r\n\t\t}\r\n\t});\r\n\r\n\tEventHandler.on(document, EVENT_RESET_DATA_API, 'form', function() {\r\n\t\tSelectors.findAll('select[data-inited=\"true\"]', this).forEach(select => VGSelect.build(select, true));\r\n\t});\r\n\r\n\tEventHandler.on(document, 'keydown', SELECTOR_DATA_TOGGLE, function(e) {\r\n\t\tconst inst = VGSelect.getInstance(this.closest(`.${CLASS_NAME_CONTAINER}`));\r\n\t\tif (!inst) return;\r\n\t\tswitch (e.key) {\r\n\t\t\tcase 'Enter':\r\n\t\t\tcase ' ':\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tinst.toggle();\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'Escape':\r\n\t\t\t\tif (inst._isShown()) inst.hide();\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'ArrowDown':\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tif (!inst._isShown()) inst.show();\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t});\r\n\r\n\tEventHandler.on(document, EVENT_CLICK_DATA_API, `.${CLASS_NAME_TAGS}`, function(e) {\r\n\t\tconst btn = e.target.closest(`.${CLASS_NAME_TAG_REMOVE}`);\r\n\t\tif (!btn) return;\r\n\t\te.preventDefault();\r\n\t\te.stopPropagation();\r\n\t\tconst container = this.closest(`.${CLASS_NAME_CONTAINER}`);\r\n\t\tconst select = container.previousElementSibling;\r\n\r\n\t\tconst indexStr = btn.dataset.index;\r\n\t\tconst idx = Number.isFinite(Number(indexStr)) ? parseInt(indexStr, 10) : NaN;\r\n\t\tconst opt = Number.isInteger(idx) ? select.options[idx] : null;\r\n\t\tconst item = Number.isInteger(idx)\r\n\t\t\t? container.querySelector(`.${CLASS_NAME_OPTION}[data-index=\"${idx}\"]`)\r\n\t\t\t: null;\r\n\r\n\t\tconst instance = VGSelect.getInstance(container);\r\n\r\n\t\tif (opt) {\r\n\t\t\topt.selected = false;\r\n\t\t\tif (item) item.classList.remove('selected');\r\n\t\t\tVGSelect.updateUI(select);\r\n\t\t\tselect.dispatchEvent(new Event('change', { bubbles: true }));\r\n\t\t\tEventHandler.trigger(select, EVENT_KEY_CHANGE, { data: { value: opt.value } });\r\n\r\n\t\t\tinstance?._triggerEvent(EVENT_KEY_DESELECT, { value: opt.value });\r\n\t\t\tinstance?._callCallback('onDeselect', { value: opt.value });\r\n\t\t}\r\n\t});\r\n\r\n\tEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MULTIPLE_INPUT, function(e) {\r\n\t\tif (e.key === 'Backspace' && !e.target.value) {\r\n\t\t\tconst input = e.target;\r\n\t\t\tconst tagsContainer = input.parentElement;\r\n\t\t\tconst tags = tagsContainer.querySelectorAll(`.${CLASS_NAME_TAG}`);\r\n\t\t\tif (tags.length > 0) {\r\n\t\t\t\tconst lastTag = tags[tags.length - 1];\r\n\t\t\t\tconst svg = lastTag.querySelector('svg');\r\n\t\t\t\tconst indexStr = svg?.dataset.index;\r\n\t\t\t\tconst idx = Number.isFinite(Number(indexStr)) ? parseInt(indexStr, 10) : NaN;\r\n\r\n\t\t\t\tconst select = input.closest(`.${CLASS_NAME_CONTAINER}`).previousElementSibling;\r\n\t\t\t\tconst option = Number.isInteger(idx) ? select.options[idx] : null;\r\n\t\t\t\tconst listItem = Number.isInteger(idx)\r\n\t\t\t\t\t? input.closest(`.${CLASS_NAME_CONTAINER}`).querySelector(`.${CLASS_NAME_OPTION}[data-index=\"${idx}\"]`)\r\n\t\t\t\t\t: null;\r\n\r\n\t\t\t\tconst instance = VGSelect.getInstance(input.closest(`.${CLASS_NAME_CONTAINER}`));\r\n\r\n\t\t\t\tif (option) {\r\n\t\t\t\t\toption.selected = false;\r\n\t\t\t\t\tif (listItem) listItem.classList.remove('selected');\r\n\t\t\t\t\tVGSelect.updateUI(select);\r\n\t\t\t\t\tselect.dispatchEvent(new Event('change', { bubbles: true }));\r\n\t\t\t\t\tEventHandler.trigger(select, EVENT_KEY_CHANGE, { data: { value: option.value } });\r\n\r\n\t\t\t\t\tinstance?._triggerEvent(EVENT_KEY_DESELECT, { value: option.value });\r\n\t\t\t\t\tinstance?._callCallback('onDeselect', { value: option.value });\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n}\r\n\r\nexport default _handlersVGSelect;","import BaseModule from \"../../base-module\";\r\nimport {\r\n\tisDisabled,\r\n\tisEmptyObj,\r\n\tmergeDeepObject,\r\n\tnormalizeData,\r\n} from \"../../../utils/js/functions\";\r\nimport {Classes, Manipulator} from \"../../../utils/js/dom/manipulator\";\r\nimport EventHandler from \"../../../utils/js/dom/event\";\r\nimport Selectors from \"../../../utils/js/dom/selectors\";\r\nimport _handlersVGSelect from \"./handlers\";\r\nimport {lang_buttons, lang_messages, lang_titles} from \"../../../utils/js/components/lang\";\r\n\r\nconst NAME = 'select';\r\nconst NAME_KEY = 'vg.select';\r\n\r\nconst CLASS_NAME_SHOW = 'show';\r\nconst CLASS_NAME_ACTIVE = 'active';\r\nconst CLASS_NAME_CONTAINER = 'vg-select';\r\nconst CLASS_NAME_DROPDOWN = 'vg-select-dropdown';\r\nconst CLASS_NAME_LIST = 'vg-select-list';\r\nconst CLASS_NAME_OPTION = 'vg-select-list--option';\r\nconst CLASS_NAME_OPTGROUP = 'vg-select-list--optgroup';\r\nconst CLASS_NAME_OPTGROUP_TITLE = 'vg-select-list--optgroup-title';\r\nconst CLASS_NAME_CURRENT = 'vg-select-current';\r\nconst CLASS_NAME_PLACEHOLDER = 'vg-select-current--placeholder';\r\nconst CLASS_NAME_SEARCH = 'vg-select-search';\r\nconst CLASS_NAME_TAGS = 'vg-select-tags';\r\nconst CLASS_NAME_TAG = 'vg-select-tag';\r\nconst CLASS_NAME_TAG_REMOVE = 'vg-select-tag-remove';\r\nconst CLASS_NAME_LOAD_MORE = 'vg-select-load-more';\r\nconst CLASS_NAME_LOADING = 'vg-select-loading';\r\nconst CLASS_NAME_DROP_UP = 'drop-up';\r\n\r\nconst EVENT_KEY_CHANGE = `${NAME_KEY}.change`;\r\nconst EVENT_KEY_HIDE = `${NAME_KEY}.hide`;\r\nconst EVENT_KEY_HIDDEN = `${NAME_KEY}.hidden`;\r\nconst EVENT_KEY_SHOW = `${NAME_KEY}.show`;\r\nconst EVENT_KEY_SHOWN = `${NAME_KEY}.shown`;\r\nconst EVENT_KEY_INIT = `${NAME_KEY}.init`;\r\nconst EVENT_KEY_REBUILD = `${NAME_KEY}.rebuild`;\r\nconst EVENT_KEY_OPEN = `${NAME_KEY}.open`;\r\nconst EVENT_KEY_CLOSE = `${NAME_KEY}.close`;\r\nconst EVENT_KEY_SELECT = `${NAME_KEY}.select`;\r\nconst EVENT_KEY_CLEAR = `${NAME_KEY}.clear`;\r\nconst EVENT_KEY_ERROR = `${NAME_KEY}.error`;\r\nconst EVENT_KEY_LOAD_NEXT = `${NAME_KEY}.loadNext`;\r\n\r\nconst SELECTOR_DATA_TOGGLE = '[data-vg-toggle=\"select\"]';\r\nconst SELECTOR_CURRENT = `.${CLASS_NAME_CURRENT}`;\r\nconst SELECTOR_DROPDOWN = `.${CLASS_NAME_DROPDOWN}`;\r\nconst SELECTOR_SEARCH_INPUT = `.${CLASS_NAME_SEARCH} input`;\r\nconst SELECTOR_LIST = `.${CLASS_NAME_LIST}`;\r\nconst SELECTOR_LOAD_MORE_BTN = `.${CLASS_NAME_LOAD_MORE}`;\r\nconst DATA_ATTR_COPY_EXCLUDE_DEFAULT = ['inited', 'updating', 'exclude'];\n\r\n/**\r\n * Класс VGSelect\r\n * Кастомный <select> с поддержкой поиска, мультивыбора, динамической загрузки, i18n, пагинации и обновления через MutationObserver.\r\n * @extends BaseModule\r\n */\r\nclass VGSelect extends BaseModule {\r\n\t/**\r\n\t * Создаёт экземпляр VGSelect\r\n\t * @param {HTMLSelectElement} element - Исходный <select> элемент\r\n\t * @param {Object} [params] - Параметры инициализации\r\n\t */\r\n\tconstructor(element, params = {}) {\r\n\t\tsuper(element, params);\r\n\r\n\t\tthis._params = this._getParams(element, mergeDeepObject({\r\n\t\t\tlang: document.documentElement.lang || 'ru',\r\n\t\t\t// Dropdown placement behavior:\r\n\t\t\t// - none: default CSS positioning (no JS)\r\n\t\t\t// - auto: choose top/bottom based on available space in overflow ancestor/viewport\r\n\t\t\t// - top: force open upwards\r\n\t\t\t// - bottom: force open downwards\r\n\t\t\tposition: 'none',\r\n\t\t\tsearch: {\r\n\t\t\t\tenabled: true,\r\n\t\t\t\troute: '',\r\n\t\t\t\tremote: false,\r\n\t\t\t\tdelay: 300,\r\n\t\t\t\tminterm: 1,\r\n\t\t\t\tpagination: false,\r\n\t\t\t\tpageParam: 'page',\r\n\t\t\t\ttermParam: 'q',\r\n\t\t\t\tperpage: 20,\r\n\t\t\t\tloadMoreText: 'Загрузить ещё',\r\n\t\t\t},\r\n\t\t\tclose: true,\r\n\t\t\ttree: false,\r\n\t\t\texclude: 'data-filter-param',\n\t\t\tplaceholder: '',\r\n\t\t\tonInit: null,\r\n\t\t\tonShow: null,\r\n\t\t\tonHide: null,\r\n\t\t\tonChange: null,\r\n\t\t\tonSelect: null,\r\n\t\t\tonDeselect: null,\r\n\t\t\tonClear: null,\r\n\t\t\tonLoadNext: null,\r\n\t\t}, params));\r\n\r\n\t\tthis._observer = null;\r\n\t\tthis._observerTimeout = null;\r\n\t\tthis._drop = Selectors.find(SELECTOR_DROPDOWN, this._element);\r\n\t\tthis._searchTerm = '';\r\n\t\tthis._currentPage = 1;\r\n\t\tthis._totalPages = null;\r\n\t\tthis._loading = false;\r\n\r\n\t\tif (typeof params.search === 'object') {\r\n\t\t\tthis._params.search.loadMoreText = lang_buttons(this._params.lang, NAME)['load-more'] || 'Загрузить еще'\r\n\t\t}\r\n\r\n\t\tthis._remoteSearchRequestId = 0;\r\n\t\tthis._remoteSearchAbortController = null;\r\n\r\n\t\tthis._positioningScrollParent = null;\r\n\t\tthis._boundUpdateDropdownPlacement = () => this._updateDropdownPlacement();\r\n\r\n\t\tthis._initObserver();\r\n\t\tthis._initLoadMoreButton();\r\n\r\n\t\tthis._triggerEvent(EVENT_KEY_INIT);\r\n\t\tthis._callCallback('onInit');\r\n\t}\r\n\r\n\t/**\r\n\t * Возвращает имя компонента\r\n\t * @returns {string}\r\n\t */\r\n\tstatic get NAME() {\r\n\t\treturn NAME;\r\n\t}\r\n\r\n\t/**\r\n\t * Возвращает ключ события компонента\r\n\t * @returns {string}\r\n\t */\r\n\tstatic get NAME_KEY() {\r\n\t\treturn NAME_KEY;\r\n\t}\r\n\r\n\t/**\r\n\t * Перестраивает список опций в выпадающем меню\r\n\t * @param {HTMLSelectElement} selector - Исходный <select>\r\n\t * @param {HTMLElement} drop - Контейнер выпадающего списка\r\n\t * @returns {HTMLElement} - Обновлённый список\r\n\t */\r\n\tstatic buildListOptions(selector, drop, params = {}) {\r\n\t\tlet list = drop.querySelector(`.${CLASS_NAME_LIST}`);\r\n\t\tif (!list) {\r\n\t\t\tlist = document.createElement('ul');\r\n\t\t\tClasses.add(list, CLASS_NAME_LIST);\r\n\t\t\tdrop.appendChild(list);\r\n\t\t} else {\r\n\t\t\tlist.innerHTML = '';\r\n\t\t}\r\n\r\n\t\tconst optGroups = Selectors.findAll('optgroup', selector);\r\n\t\tconst fragment = document.createDocumentFragment();\r\n\t\tconst isTree = this._isTreeEnabled(selector, params);\r\n\r\n\t\tif (optGroups.length > 0) {\r\n\t\t\toptGroups.forEach(optGroup => {\r\n\t\t\t\tconst ol = document.createElement('ol');\r\n\t\t\t\tClasses.add(ol, CLASS_NAME_OPTGROUP);\r\n\r\n\t\t\t\tconst label = document.createElement('li');\r\n\t\t\t\tlabel.textContent = optGroup.label.trim();\r\n\t\t\t\tClasses.add(label, CLASS_NAME_OPTGROUP_TITLE);\r\n\t\t\t\tol.appendChild(label);\r\n\r\n\t\t\t\tVGSelect._createListItems(Selectors.findAll('option', optGroup), ol, selector, {\r\n\t\t\t\t\ttree: isTree,\r\n\t\t\t\t\tdepth: isTree ? 1 : 0,\r\n\t\t\t\t});\r\n\t\t\t\tfragment.appendChild(ol);\r\n\t\t\t});\r\n\t\t\tlist.appendChild(fragment);\r\n\t\t} else {\r\n\t\t\tVGSelect._createListItems(selector.options, list, selector, {\r\n\t\t\t\ttree: isTree,\r\n\t\t\t\tdepth: 0,\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn list;\r\n\t}\r\n\r\n\t/**\r\n\t * Создаёт <li> элементы из списка <option>\r\n\t * @param {HTMLCollection|NodeList} options - Коллекция <option>\r\n\t * @param {HTMLElement} parent - Родительский контейнер (ul/ol)\r\n\t * @param {HTMLSelectElement} selector - Исходный <select>\r\n\t * @private\r\n\t */\r\n\tstatic _createListItems(options, parent, selector, config = {}) {\r\n\t\tconst frag = document.createDocumentFragment();\r\n\t\tconst baseDepth = Number.isInteger(config.depth) ? config.depth : 0;\r\n\t\tconst treeEnabled = !!config.tree;\r\n\r\n\t\t[...options].forEach((option) => {\r\n\t\t\tif (option.hidden) return;\r\n\r\n\t\t\t// value атрибута может не быть или он может быть пустым -> для маппинга используем индекс\r\n\t\t\tconst rawValueAttr = option.getAttribute('value'); // null если атрибута нет\r\n\t\t\tconst value = rawValueAttr == null ? '' : rawValueAttr;\r\n\t\t\tconst text = option.textContent.trim();\r\n\t\t\tconst isEmptyOption = value === '' && text === '';\r\n\r\n\t\t\tconst li = document.createElement('li');\r\n\t\t\tli.textContent = text;\r\n\t\t\tli.dataset.index = String(option.index);\r\n\t\t\tli.dataset.value = value;\r\n\t\t\tli.classList.add(CLASS_NAME_OPTION);\r\n\t\t\tManipulator.set(li, 'data-vg-toggle', 'select-option');\r\n\t\t\tif (treeEnabled) {\r\n\t\t\t\tconst optionLevelRaw = option.dataset.level;\r\n\t\t\t\tconst optionLevel = Number.isFinite(Number(optionLevelRaw)) ? parseInt(optionLevelRaw, 10) : null;\r\n\t\t\t\tconst level = Math.max(0, optionLevel == null ? baseDepth : optionLevel);\r\n\t\t\t\tli.dataset.level = String(level);\r\n\t\t\t\tli.style.paddingLeft = `${16 + (level * 16)}px`;\r\n\t\t\t}\r\n\r\n\t\t\t// Раньше подсветка зависела от \"явно выбранных\" option (атрибут selected),\r\n\t\t\t// из-за этого UI мог показывать placeholder, но DOM считал, что выбрана 1-я опция.\r\n\t\t\t// Подсвечиваем по фактическому состоянию option.selected.\r\n\t\t\tif (option.selected) {\r\n\t\t\t\tli.classList.add('selected');\r\n\t\t\t}\r\n\r\n\t\t\tif (option.disabled) {\r\n\t\t\t\tli.classList.add('disabled');\r\n\t\t\t}\r\n\r\n\t\t\tif (isEmptyOption) {\r\n\t\t\t\tli.hidden = true;\r\n\t\t\t\tli.style.display = 'none';\r\n\t\t\t}\r\n\r\n\t\t\tconst dataAttrs = Manipulator.get(option);\r\n\t\t\tif (!isEmptyObj(dataAttrs)) {\r\n\t\t\t\tObject.keys(dataAttrs).forEach(key => {\r\n\t\t\t\t\tManipulator.set(li, `data-${key}`, dataAttrs[key]);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tfrag.appendChild(li);\r\n\t\t});\r\n\r\n\t\tparent.appendChild(frag);\r\n\t}\r\n\r\n\tstatic _isTreeEnabled(selector, params = {}) {\r\n\t\tif (typeof params.tree === 'boolean') return params.tree;\r\n\t\tif (selector?.dataset && typeof selector.dataset.tree !== 'undefined') {\r\n\t\t\treturn normalizeData(selector.dataset.tree) === true;\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\tstatic _getDataAttrCopyExclusions(selector, params = {}) {\r\n\t\tconst rawExclude = typeof params.exclude === 'string'\r\n\t\t\t? params.exclude\r\n\t\t\t: (selector.dataset.exclude || '');\r\n\t\tconst customExcluded = rawExclude\r\n\t\t\t.split(',')\r\n\t\t\t.map(item => this._normalizeDataAttrKey(item))\r\n\t\t\t.filter(Boolean);\r\n\r\n\t\treturn new Set([...DATA_ATTR_COPY_EXCLUDE_DEFAULT, ...customExcluded]);\r\n\t}\r\n\r\n\tstatic _normalizeDataAttrKey(value) {\n\t\treturn String(value || '')\n\t\t\t.trim()\n\t\t\t.replace(/^data-/, '')\n\t\t\t.toLowerCase();\n\t}\n\r\n\t/**\r\n\t * Проверяет, является ли значение \"пустым\" (соответствует placeholder)\r\n\t * @param {HTMLSelectElement} select - Элемент <select>\r\n\t * @param {string} value - Значение для проверки\r\n\t * @returns {boolean}\r\n\t */\r\n\tstatic isPlaceholderValue(select, value) {\r\n\t\tconst attr = select.dataset.placeholderValue;\r\n\t\tif (!attr) return value == null || String(value).trim() === '';\r\n\t\treturn attr.split(',').map(v => v.trim()).includes(String(value));\r\n\t}\r\n\r\n\t/**\r\n\t * Есть ли в <select> явно отмеченные selected (именно атрибутом selected, а не браузерным дефолтом)\r\n\t * @param {HTMLSelectElement} select\r\n\t * @returns {boolean}\r\n\t */\r\n\tstatic hasExplicitSelectedOption(select) {\r\n\t\treturn Array.from(select.options).some(opt => opt.hasAttribute('selected'));\r\n\t}\r\n\r\n\t/**\r\n\t * Проверяет, выбрана ли допустимая опция (не placeholder)\r\n\t * @param {HTMLSelectElement} select - Элемент <select>\r\n\t * @returns {boolean}\r\n\t */\r\n\tstatic hasSelectedValidOption(select) {\r\n\t\tconst index = select.selectedIndex;\r\n\t\tif (index === -1) return false;\r\n\t\treturn !this.isPlaceholderValue(select, select.options[index]?.value);\r\n\t}\r\n\r\n\t/**\r\n\t * Строит кастомный UI для <select>\r\n\t * @param {HTMLSelectElement} selector - Исходный <select>\r\n\t * @param {boolean} [reBuild=false] - Пересоздать, если уже инициализирован\r\n\t * @param params\r\n\t * @returns {HTMLElement} - Обёртка (.vg-select)\r\n\t */\r\n\tstatic build(selector, reBuild = false, params = {}) {\r\n\t\tif (reBuild || selector.dataset.inited === 'true') {\r\n\t\t\tthis.destroy(selector);\r\n\t\t}\r\n\r\n\t\tconst container = document.createElement('div');\r\n\t\tcontainer.classList.add(CLASS_NAME_CONTAINER);\r\n\t\tcontainer.style.position = 'relative';\r\n\r\n\t\tif (selector.classList.length) {\r\n\t\t\t[...selector.classList].forEach(cls => container.classList.add(cls));\r\n\t\t}\r\n\r\n\t\tif (isDisabled(selector)) {\r\n\t\t\tcontainer.classList.add('disabled');\r\n\t\t}\r\n\r\n\t\tconst elData = Manipulator.get(selector);\r\n\t\tif (!isEmptyObj(elData)) {\r\n\t\t\tconst excludeDataAttrs = this._getDataAttrCopyExclusions(selector, params);\r\n\t\t\tObject.keys(elData).forEach(key => {\r\n\t\t\t\tif (excludeDataAttrs.has(key)) return;\r\n\t\t\t\tManipulator.set(container, `data-${key}`, elData[key]);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tconst placeholder = selector.dataset.placeholder || '';\r\n\t\tconst isMultiple = selector.multiple;\r\n\r\n\t\tconst current = document.createElement('div');\r\n\t\tcurrent.classList.add(CLASS_NAME_CURRENT);\r\n\t\tcurrent.setAttribute('data-vg-toggle', 'select');\r\n\t\tcurrent.setAttribute('aria-expanded', 'false');\r\n\t\tcurrent.setAttribute('role', 'button');\r\n\t\tcurrent.tabIndex = isMultiple ? -1 : 0;\r\n\r\n\t\tif (isMultiple) {\r\n\t\t\tconst tags = document.createElement('div');\r\n\t\t\ttags.classList.add(CLASS_NAME_TAGS);\r\n\t\t\tcurrent.appendChild(tags);\r\n\r\n\t\t\tconst input = document.createElement('input');\r\n\t\t\tinput.type = 'text';\r\n\t\t\tinput.className = 'vg-select-multiple-input';\r\n\t\t\tinput.style.cssText = 'border:0;outline:none;background:transparent;padding:0;margin:0;min-width:1px;width:1px;height:1px;line-height:1;font:inherit;opacity:0;';\r\n\t\t\ttags.appendChild(input);\r\n\r\n\t\t\tinput.addEventListener('focus', () => {\r\n\t\t\t\tconst inst = VGSelect.getInstance(input.closest(`.${CLASS_NAME_CONTAINER}`));\r\n\t\t\t\tif (inst && !inst._isShown()) inst.show();\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tconst index = selector.selectedIndex;\r\n\t\t\tconst option = index >= 0 ? selector.options[index] : null;\r\n\t\t\tconst text = option?.textContent.trim() || '';\r\n\r\n\t\t\t// Placeholder показываем только если реально нет валидно выбранной опции\r\n\t\t\tconst showPlaceholder = placeholder && !this.hasSelectedValidOption(selector);\r\n\r\n\t\t\tcurrent.innerHTML = showPlaceholder\r\n\t\t\t\t? `<span class=\"${CLASS_NAME_PLACEHOLDER}\">${placeholder}</span>`\r\n\t\t\t\t: text || '-';\r\n\t\t}\r\n\r\n\t\tcontainer.appendChild(current);\r\n\r\n\t\tconst dropdown = document.createElement('div');\r\n\t\tdropdown.classList.add(CLASS_NAME_DROPDOWN);\r\n\t\tcontainer.appendChild(dropdown);\r\n\r\n\t\tthis.buildListOptions(selector, dropdown, params);\r\n\r\n\t\tselector.insertAdjacentElement('afterend', container);\r\n\t\tselector.dataset.inited = 'true';\r\n\r\n\t\tthis.getOrCreateInstance(container, params);\r\n\t\tthis.updateUI(selector);\r\n\t\tconst instance = VGSelect.getInstance(container);\r\n\r\n\t\tlet searchInput = null;\r\n\t\tif (Manipulator.has(selector, 'data-search-enabled')) {\r\n\t\t\tconst search = document.createElement('div');\r\n\t\t\tsearch.classList.add(CLASS_NAME_SEARCH);\r\n\t\t\tsearchInput = document.createElement('input');\r\n\t\t\tsearchInput.name = 'vg-select-search';\r\n\t\t\tsearchInput.type = 'text';\r\n\t\t\tsearchInput.placeholder = lang_titles(instance._params.lang, NAME)['search'];\r\n\t\t\tsearchInput.autocomplete = 'off';\r\n\t\t\tsearchInput.setAttribute('role', 'searchbox');\r\n\t\t\tsearch.appendChild(searchInput);\r\n\t\t\tdropdown.insertBefore(search, dropdown.firstChild);\r\n\t\t}\r\n\r\n\t\tif (searchInput && instance) {\r\n\t\t\tlet searchTimeout;\r\n\r\n\t\t\tsearchInput.addEventListener('input', (e) => {\r\n\t\t\t\tconst term = e.target.value.trim();\r\n\t\t\t\tconst params = instance._params;\r\n\r\n\t\t\t\tinstance._callCallback('onSearch', { term });\r\n\r\n\t\t\t\tif (params.search.remote && params.search.route) {\r\n\t\t\t\t\tif (term.length < (params.search.minterm || 1)) return;\r\n\r\n\t\t\t\t\tclearTimeout(searchTimeout);\r\n\t\t\t\t\tsearchTimeout = setTimeout(() => {\r\n\t\t\t\t\t\tinstance._fetchRemoteData(term);\r\n\t\t\t\t\t}, params.search.delay || 300);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tinstance._filterLocalOptions(term);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn container;\r\n\t}\r\n\r\n\t/**\r\n\t * Переключает открытие/закрытие выпадающего списка\r\n\t * @param {EventTarget} [relatedTarget] - Элемент, вызвавший событие\r\n\t */\r\n\ttoggle(relatedTarget) {\r\n\t\treturn this._isShown() ? this.hide() : this.show(relatedTarget);\r\n\t}\r\n\r\n\t/**\r\n\t * Открывает выпадающий список\r\n\t * @param {EventTarget} [relatedTarget] - Элемент, вызвавший событие\r\n\t */\r\n\tshow(relatedTarget) {\r\n\t\tif (isDisabled(this._element)) return;\r\n\r\n\t\tconst e = EventHandler.trigger(this._element, EVENT_KEY_SHOW, { relatedTarget });\r\n\t\tif (e.defaultPrevented) return;\r\n\r\n\t\tthis._element.classList.add(CLASS_NAME_SHOW);\r\n\t\tif (this._getPositionMode() !== 'none') {\r\n\t\t\tthis._setupDropdownPlacement();\r\n\t\t} else {\r\n\t\t\t// Ensure no leftovers if the instance had JS positioning before.\r\n\t\t\tthis._teardownDropdownPlacement();\r\n\t\t}\r\n\r\n\t\tif ('ontouchstart' in document.documentElement) {\r\n\t\t\tdocument.body.style.pointerEvents = 'none';\r\n\t\t}\r\n\r\n\t\tconst toggle = this._element.querySelector(SELECTOR_DATA_TOGGLE);\r\n\t\ttoggle.setAttribute('aria-expanded', 'true');\r\n\r\n\t\tif (this._params.search?.enabled) {\r\n\t\t\tconst input = this._element.querySelector(SELECTOR_SEARCH_INPUT);\r\n\t\t\tif (input) input.focus();\r\n\t\t}\r\n\r\n\t\treturn this._queueCallback(() => {\r\n\t\t\tthis._element.classList.add(CLASS_NAME_ACTIVE);\r\n\t\t\tthis._updateDropdownPlacement();\r\n\t\t\tEventHandler.trigger(this._element, EVENT_KEY_SHOWN, { relatedTarget });\r\n\t\t\tthis._triggerEvent(EVENT_KEY_OPEN);\r\n\t\t\tthis._callCallback('onShow');\r\n\t\t}, this._drop, true, 50);\r\n\t}\r\n\r\n\t/**\r\n\t * Закрывает выпадающий список\r\n\t */\r\n\thide() {\r\n\t\tif (isDisabled(this._element) || !this._isShown()) return;\r\n\t\tthis._completeHide();\r\n\t}\r\n\r\n\t/**\r\n\t * Полностью завершает процесс закрытия\r\n\t * @param {Object} [relatedTarget] - Доп. данные\r\n\t * @private\r\n\t */\r\n\t_completeHide(relatedTarget = {}) {\r\n\t\tconst e = EventHandler.trigger(this._element, EVENT_KEY_HIDE, relatedTarget);\r\n\t\tif (e.defaultPrevented) return;\r\n\r\n\t\tthis._teardownDropdownPlacement();\r\n\r\n\t\tthis._element.classList.remove(CLASS_NAME_ACTIVE);\r\n\t\tthis._element.querySelector(SELECTOR_DATA_TOGGLE).setAttribute('aria-expanded', 'false');\r\n\r\n\t\tthis._queueCallback(() => {\r\n\t\t\tthis._element.classList.remove(CLASS_NAME_SHOW);\r\n\t\t\tEventHandler.trigger(this._element, EVENT_KEY_HIDDEN, relatedTarget);\r\n\t\t\tthis._triggerEvent(EVENT_KEY_CLOSE);\r\n\t\t\tthis._callCallback('onHide');\r\n\t\t}, this._drop, true, 10);\r\n\r\n\t\tif ('ontouchstart' in document.documentElement) {\r\n\t\t\tdocument.body.style.pointerEvents = '';\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Проверяет, открыт ли список\r\n\t * @returns {boolean}\r\n\t * @private\r\n\t */\r\n\t_isShown() {\r\n\t\treturn this._element.classList.contains(CLASS_NAME_SHOW);\r\n\t}\r\n\r\n\t/**\r\n\t * Инициализирует MutationObserver для отслеживания изменений в <select>\r\n\t * @private\r\n\t */\r\n\t_initObserver() {\r\n\t\tif (this._observer) {\r\n\t\t\tthis._observer.disconnect();\r\n\t\t}\r\n\r\n\t\tconst select = this._element.previousElementSibling;\r\n\t\tif (!select || select.tagName !== 'SELECT') return;\r\n\r\n\t\tthis._observer = new MutationObserver((mutations) => {\r\n\t\t\tconsole.debug('VGSelect: Mutation detected', mutations);\r\n\t\t\tif (select.hasAttribute('data-updating')) return;\r\n\r\n\t\t\tconst shouldUpdate = mutations.some(mutation => {\r\n\t\t\t\tif (mutation.type === 'attributes') {\r\n\t\t\t\t\treturn ['disabled', 'required', 'style', 'hidden'].includes(mutation.attributeName);\r\n\t\t\t\t}\r\n\t\t\t\treturn mutation.type === 'childList' || mutation.type === 'characterData';\r\n\t\t\t});\r\n\r\n\t\t\tif (!shouldUpdate) return;\r\n\r\n\t\t\tconst wasShown = this._isShown();\r\n\r\n\t\t\tclearTimeout(this._observerTimeout);\r\n\t\t\tthis._observerTimeout = setTimeout(() => {\r\n\t\t\t\tif (this._element.previousElementSibling !== select || select.hasAttribute('data-updating')) return;\r\n\r\n\t\t\t\tthis._updateFromMutation();\r\n\r\n\t\t\t\tif (wasShown) {\r\n\t\t\t\t\trequestAnimationFrame(() => {\r\n\t\t\t\t\t\tthis.show();\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}, 100);\r\n\t\t});\r\n\r\n\t\tthis._observer.observe(select, {\r\n\t\t\tattributes: true,\r\n\t\t\tattributeFilter: ['disabled', 'required', 'style', 'hidden'],\r\n\t\t\tchildList: true,\r\n\t\t\tsubtree: true,\r\n\t\t\tcharacterData: true\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Обновляет UI после изменения в DOM\r\n\t * @private\r\n\t */\r\n\t_updateFromMutation() {\r\n\t\tconst select = this._element.previousElementSibling;\r\n\t\tif (!select) return;\r\n\r\n\t\tif (isDisabled(select)) {\r\n\t\t\tthis._element.classList.add('disabled');\r\n\t\t} else {\r\n\t\t\tthis._element.classList.remove('disabled');\r\n\t\t}\r\n\r\n\t\tconst drop = this._element.querySelector(SELECTOR_DROPDOWN);\r\n\t\tVGSelect.buildListOptions(select, drop, this._params);\r\n\t\tVGSelect.updateUI(select);\r\n\t}\r\n\r\n\t/**\r\n\t * Освобождает ресурсы (отключает observer, очищает таймеры)\r\n\t */\r\n\tdispose() {\r\n\t\tif (this._observer) {\r\n\t\t\tthis._observer.disconnect();\r\n\t\t\tthis._observer = null;\r\n\t\t}\r\n\t\tclearTimeout(this._observerTimeout);\r\n\t\tthis._observerTimeout = null;\r\n\t\tthis._teardownDropdownPlacement();\r\n\t\tsuper.dispose();\r\n\t}\r\n\r\n\t_setupDropdownPlacement() {\r\n\t\tif (this._getPositionMode() === 'none') return;\r\n\r\n\t\tthis._teardownDropdownPlacement();\r\n\t\tthis._positioningScrollParent = this._getOverflowAncestor(this._element);\r\n\r\n\t\t// Update position on viewport scroll/resize, and on the nearest scroll/overflow parent.\r\n\t\twindow.addEventListener('resize', this._boundUpdateDropdownPlacement, { passive: true });\r\n\t\twindow.addEventListener('scroll', this._boundUpdateDropdownPlacement, { passive: true });\r\n\r\n\t\tif (this._positioningScrollParent) {\r\n\t\t\tthis._positioningScrollParent.addEventListener('scroll', this._boundUpdateDropdownPlacement, { passive: true });\r\n\t\t}\r\n\r\n\t\tthis._updateDropdownPlacement();\r\n\t}\r\n\r\n\t_teardownDropdownPlacement() {\r\n\t\twindow.removeEventListener('resize', this._boundUpdateDropdownPlacement);\r\n\t\twindow.removeEventListener('scroll', this._boundUpdateDropdownPlacement);\r\n\r\n\t\tif (this._positioningScrollParent) {\r\n\t\t\tthis._positioningScrollParent.removeEventListener('scroll', this._boundUpdateDropdownPlacement);\r\n\t\t}\r\n\t\tthis._positioningScrollParent = null;\r\n\r\n\t\t// Reset to stylesheet defaults.\r\n\t\tthis._element.classList.remove(CLASS_NAME_DROP_UP);\r\n\t\tthis._element.style.removeProperty('--vg-select-list-max-height');\r\n\t}\r\n\r\n\t_getPositionMode() {\r\n\t\tconst raw = this._params?.position;\r\n\t\tconst mode = raw == null ? 'none' : String(raw).trim().toLowerCase();\r\n\t\tif (mode === 'auto' || mode === 'top' || mode === 'bottom' || mode === 'none') return mode;\r\n\t\treturn 'none';\r\n\t}\r\n\r\n\t_getOverflowAncestor(startEl) {\r\n\t\tlet el = startEl?.parentElement;\r\n\t\twhile (el && el !== document.body && el !== document.documentElement) {\r\n\t\t\tconst style = window.getComputedStyle(el);\r\n\t\t\tconst overflowX = style.overflowX || style.overflow || 'visible';\r\n\t\t\tconst overflowY = style.overflowY || style.overflow || 'visible';\r\n\t\t\tconst clipsX = overflowX !== 'visible';\r\n\t\t\tconst clipsY = overflowY !== 'visible';\r\n\r\n\t\t\tif (clipsX || clipsY) {\r\n\t\t\t\treturn el;\r\n\t\t\t}\r\n\r\n\t\t\tel = el.parentElement;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\t_getClipRect() {\r\n\t\tconst viewport = {\r\n\t\t\ttop: 0,\r\n\t\t\tleft: 0,\r\n\t\t\tright: window.innerWidth,\r\n\t\t\tbottom: window.innerHeight\r\n\t\t};\r\n\r\n\t\tconst parent = this._positioningScrollParent;\r\n\t\tif (!parent) return viewport;\r\n\r\n\t\tconst r = parent.getBoundingClientRect();\r\n\t\treturn {\r\n\t\t\ttop: Math.max(viewport.top, r.top),\r\n\t\t\tleft: Math.max(viewport.left, r.left),\r\n\t\t\tright: Math.min(viewport.right, r.right),\r\n\t\t\tbottom: Math.min(viewport.bottom, r.bottom),\r\n\t\t};\r\n\t}\r\n\r\n\t_updateDropdownPlacement() {\r\n\t\tif (!this._isShown()) return;\r\n\r\n\t\tconst mode = this._getPositionMode();\r\n\t\tif (mode === 'none') return;\r\n\r\n\t\tconst clip = this._getClipRect();\r\n\t\tconst containerRect = this._element.getBoundingClientRect();\r\n\r\n\t\tconst spaceBelow = clip.bottom - containerRect.bottom;\r\n\t\tconst spaceAbove = containerRect.top - clip.top;\r\n\r\n\t\tconst openUp = mode === 'top' ? true : mode === 'bottom' ? false : spaceAbove > spaceBelow;\r\n\t\tthis._element.classList.toggle(CLASS_NAME_DROP_UP, openUp);\r\n\r\n\t\tconst available = openUp ? spaceAbove : spaceBelow;\r\n\r\n\t\t// Give the dropdown some breathing room (borders/margins) and clamp.\r\n\t\tconst listMax = Math.max(80, Math.floor(available - 12));\r\n\t\tif (Number.isFinite(listMax) && listMax > 0) {\r\n\t\t\tthis._element.style.setProperty('--vg-select-list-max-height', `${listMax}px`);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Удаляет кастомный UI\r\n\t * @param {HTMLSelectElement} select - Исходный <select>\r\n\t */\r\n\tstatic destroy(select) {\r\n\t\tconst container = select.nextElementSibling;\r\n\t\tif (container && container.classList.contains(CLASS_NAME_CONTAINER)) {\r\n\t\t\tcontainer.remove();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Обновляет отображаемое значение (текст, теги)\r\n\t * @param {HTMLSelectElement} select - Исходный <select>\r\n\t */\r\n\tstatic updateUI(select) {\r\n\t\tconst container = select.nextElementSibling;\r\n\t\tif (!container || !container.classList.contains(CLASS_NAME_CONTAINER)) return;\r\n\r\n\t\tconst current = container.querySelector(SELECTOR_CURRENT);\r\n\t\tconst placeholder = select.dataset.placeholder || '';\r\n\t\tconst isMultiple = select.multiple;\r\n\t\tconst instance = VGSelect.getInstance(container);\r\n\r\n\t\tif (isMultiple) {\r\n\t\t\tconst tags = current.querySelector(`.${CLASS_NAME_TAGS}`);\r\n\t\t\tconst input = tags.querySelector('input');\r\n\t\t\tconst prevCount = tags.querySelectorAll(`.${CLASS_NAME_TAG}`).length;\r\n\t\t\ttags.innerHTML = '';\r\n\t\t\ttags.appendChild(input);\r\n\r\n\t\t\tconst selected = Array.from(select.selectedOptions);\r\n\t\t\tconst newCount = selected.length;\r\n\r\n\t\t\tif (newCount === 0 && prevCount > 0) {\r\n\t\t\t\tinstance?._triggerEvent(EVENT_KEY_CLEAR);\r\n\t\t\t\tinstance?._callCallback('onClear');\r\n\t\t\t}\r\n\r\n\t\t\tif (selected.length === 0) {\r\n\t\t\t\tinput.placeholder = placeholder;\r\n\t\t\t} else {\r\n\t\t\t\tinput.placeholder = '';\r\n\t\t\t\tselected.forEach(opt => {\r\n\t\t\t\t\tconst tag = document.createElement('div');\r\n\t\t\t\t\ttag.classList.add(CLASS_NAME_TAG);\r\n\t\t\t\t\t// data-index — основной ключ (работает даже если у option нет value атрибута)\r\n\t\t\t\t\ttag.innerHTML = `<span>${opt.textContent}</span><svg class=\"${CLASS_NAME_TAG_REMOVE}\" data-index=\"${opt.index}\" data-value=\"${opt.getAttribute('value') ?? ''}\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\"><line x1=\"2\" y1=\"2\" x2=\"12\" y2=\"12\" stroke=\"currentColor\"/><line x1=\"12\" y1=\"2\" x2=\"2\" y2=\"12\" stroke=\"currentColor\"/></svg>`;\r\n\t\t\t\t\ttags.insertBefore(tag, input);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tconst index = select.selectedIndex;\r\n\t\t\tconst option = index >= 0 ? select.options[index] : null;\r\n\t\t\tconst text = option?.textContent.trim() || '';\r\n\r\n\t\t\t// Placeholder показываем только если реально нет валидно выбранной опции\r\n\t\t\tconst showPlaceholder = placeholder && !this.hasSelectedValidOption(select);\r\n\r\n\t\t\tconst oldText = current.textContent;\r\n\t\t\tconst newText = showPlaceholder ? placeholder : text || '-';\r\n\r\n\t\t\tif (oldText !== newText) {\r\n\t\t\t\tcurrent.innerHTML = showPlaceholder\r\n\t\t\t\t\t? `<span class=\"${CLASS_NAME_PLACEHOLDER}\">${placeholder}</span>`\r\n\t\t\t\t\t: newText;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Программно устанавливает значение <select>\r\n\t * @param {HTMLSelectElement} select - Исходный <select>\r\n\t * @param {string} value - Значение для выбора\r\n\t * @param {Object} [data] - Дополнительные данные\r\n\t */\r\n\tstatic changeSelector(select, value, data = {}) {\n\t\tconst container = select.nextElementSibling;\n\t\tconst instance = container ? VGSelect.getInstance(container) : null;\n\n\t\tselect.setAttribute('data-updating', 'true');\n\t\ttry {\n\t\t\tconst opt = select.querySelector(`option[value=\"${CSS.escape(normalizeData(value))}\"]`);\n\t\t\tif (!opt) {\r\n\t\t\t\tinstance?._triggerEvent(EVENT_KEY_ERROR, { error: 'Option not found', value });\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst wasSelected = opt.selected;\n\t\t\tconst selectedText = opt.textContent.trim();\n\n\t\t\tif (select.multiple) {\n\t\t\t\topt.selected = data?.selected === false ? false : true;\n\t\t\t} else {\n\t\t\t\t[...select.options].forEach(o => o.selected = false);\n\t\t\t\topt.selected = true;\n\t\t\t\tselect.value = opt.value;\n\t\t\t}\n\r\n\t\t\tthis.updateUI(select);\r\n\r\n\t\t\tconst e = new Event('change', { bubbles: true, cancelable: true });\r\n\t\t\tselect.dispatchEvent(e);\r\n\r\n\t\t\tif (!wasSelected) {\r\n\t\t\t\tEventHandler.trigger(select, EVENT_KEY_CHANGE, { data });\r\n\t\t\t\tinstance?._triggerEvent(EVENT_KEY_SELECT, { value, text: selectedText, data });\r\n\t\t\t\tinstance?._callCallback('onSelect', { value, text: selectedText, data });\r\n\t\t\t}\r\n\t\t} finally {\r\n\t\t\tselect.removeAttribute('data-updating');\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Программно устанавливает выбор <select> по индексу option (надёжно даже при пустом/отсутствующем value)\r\n\t * @param {HTMLSelectElement} select\r\n\t * @param {number} index\r\n\t * @param {Object} [data]\r\n\t */\r\n\tstatic changeSelectorByIndex(select, index, data = {}) {\n\t\tconst container = select.nextElementSibling;\n\t\tconst instance = container ? VGSelect.getInstance(container) : null;\n\r\n\t\tselect.setAttribute('data-updating', 'true');\r\n\t\ttry {\r\n\t\t\tconst opt = Number.isInteger(index) ? select.options[index] : null;\r\n\t\t\tif (!opt) {\r\n\t\t\t\tinstance?._triggerEvent(EVENT_KEY_ERROR, { error: 'Option not found by index', index });\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tconst wasSelected = opt.selected;\n\t\t\tconst selectedText = opt.textContent.trim();\n\t\t\tconst value = opt.value;\n\n\t\t\tif (select.multiple) {\n\t\t\t\topt.selected = data?.selected === false ? false : true;\n\t\t\t} else {\n\t\t\t\t[...select.options].forEach(o => o.selected = false);\n\t\t\t\topt.selected = true;\n\t\t\t\tselect.value = opt.value;\n\t\t\t}\n\r\n\t\t\tthis.updateUI(select);\r\n\r\n\t\t\tconst e = new Event('change', { bubbles: true, cancelable: true });\r\n\t\t\tselect.dispatchEvent(e);\r\n\r\n\t\t\tif (!wasSelected) {\r\n\t\t\t\tEventHandler.trigger(select, EVENT_KEY_CHANGE, { data });\r\n\t\t\t\tinstance?._triggerEvent(EVENT_KEY_SELECT, { value, text: selectedText, data });\r\n\t\t\t\tinstance?._callCallback('onSelect', { value, text: selectedText, data });\r\n\t\t\t}\r\n\t\t} finally {\r\n\t\t\tselect.removeAttribute('data-updating');\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Вызывает кастомное событие\r\n\t * @param {string} eventName - Имя события\r\n\t * @param {Object} [detail] - Данные события\r\n\t * @private\r\n\t */\r\n\t_triggerEvent(eventName, detail = {}) {\r\n\t\tEventHandler.trigger(this._element, eventName, detail);\r\n\t}\r\n\r\n\t/**\r\n\t * Выполняет пользовательский коллбэк\r\n\t * @param {string} name - Имя коллбэка\r\n\t * @param {*} [arg] - Аргумент\r\n\t * @private\r\n\t */\r\n\t_callCallback(name, arg = null) {\r\n\t\tconst callback = this._params[name];\r\n\t\tif (typeof callback === 'function') {\r\n\t\t\tcallback.call(this, this._element, arg);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Инициализирует или пересоздаёт компонент\r\n\t * @param {HTMLSelectElement} element - <select>\r\n\t * @param {Object} [params] - Параметры\r\n\t * @param {boolean} [isRebuild=false] - Пересоздать\r\n\t */\r\n\tstatic init(element, params = {}, isRebuild = false) {\r\n\t\tthis.build(element, isRebuild, params);\r\n\t}\r\n\r\n\t/**\r\n\t * Закрывает все открытые выпадающие списки при клике вне\r\n\t * @param {MouseEvent} event\r\n\t */\r\n\tstatic clearDrops(event) {\r\n\t\tconst open = Selectors.find(`.${CLASS_NAME_CONTAINER}.${CLASS_NAME_SHOW}`);\r\n\t\tif (!open) return;\r\n\r\n\t\tconst targetIsToggle = event.target.closest(SELECTOR_DATA_TOGGLE);\r\n\t\tif (targetIsToggle && targetIsToggle.closest(`.${CLASS_NAME_CONTAINER}`) === open) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst targetInDropdown = event.composedPath().some(el =>\r\n\t\t\tel.classList?.contains(CLASS_NAME_DROPDOWN)\r\n\t\t);\r\n\t\tif (targetInDropdown) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst instance = VGSelect.getInstance(open);\r\n\t\tif (instance) {\r\n\t\t\tinstance._completeHide({ relatedTarget: event.target });\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Инициализирует кнопку \"Загрузить ещё\"\r\n\t * @private\r\n\t */\r\n\t_initLoadMoreButton() {\r\n\t\tif (!this._params.search?.pagination || !this._params.search.remote) return;\r\n\r\n\t\tconst list = this._element.querySelector(SELECTOR_LIST);\r\n\t\tif (!list) return;\r\n\r\n\t\tconst btn = document.createElement('li');\r\n\t\tbtn.className = CLASS_NAME_LOAD_MORE;\r\n\t\tbtn.style.textAlign = 'center';\r\n\t\tbtn.style.padding = '8px';\r\n\t\tbtn.style.cursor = 'pointer';\r\n\t\tbtn.style.color = '#007bff';\r\n\t\tbtn.style.fontSize = '14px';\r\n\t\tbtn.style.fontWeight = '500';\r\n\t\tbtn.textContent = this._params.search.loadMoreText;\r\n\r\n\t\tbtn.addEventListener('click', () => {\r\n\t\t\tif (!this._loading && (this._totalPages === null || this._currentPage < this._totalPages)) {\r\n\t\t\t\tthis._loadNextPage();\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tlist.appendChild(btn);\r\n\t\tthis._hideLoadMoreButton(true); // скрыта до первого запроса\r\n\t}\r\n\r\n\t/**\r\n\t * Показывает или скрывает кнопку \"Загрузить ещё\"\r\n\t * @param {boolean} hide\r\n\t * @private\r\n\t */\r\n\t_hideLoadMoreButton(hide) {\r\n\t\tconst btn = this._element.querySelector(SELECTOR_LOAD_MORE_BTN);\r\n\t\tif (btn) {\r\n\t\t\tbtn.style.display = hide ? 'none' : 'block';\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Показывает или скрывает индикатор загрузки\r\n\t * @param {boolean} show\r\n\t * @private\r\n\t */\r\n\t_showLoading(show) {\r\n\t\tconst list = this._element.querySelector(SELECTOR_LIST);\r\n\t\tlet loader = list.querySelector(`.${CLASS_NAME_LOADING}`);\r\n\t\tif (show && !loader) {\r\n\t\t\tloader = document.createElement('li');\r\n\t\t\tloader.className = CLASS_NAME_LOADING;\r\n\t\t\tloader.style.textAlign = 'center';\r\n\t\t\tloader.style.padding = '8px';\r\n\t\t\tloader.textContent = lang_messages(this._params.lang, NAME)['loading'];\r\n\t\t\tlist.appendChild(loader);\r\n\t\t} else if (!show && loader) {\r\n\t\t\tloader.remove();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Загружает следующую страницу данных по клику\r\n\t * @private\r\n\t */\r\n\tasync _loadNextPage() {\r\n\t\tconst { route, pageParam = 'page', termParam = 'q', perpage = 20 } = this._params.search;\r\n\t\tconst nextPage = this._currentPage + 1;\r\n\r\n\t\tconst url = new URL(route, window.location.origin);\r\n\t\turl.searchParams.set(termParam, this._searchTerm);\r\n\t\turl.searchParams.set(pageParam, nextPage);\r\n\t\turl.searchParams.set('per_page', perpage);\r\n\r\n\t\tthis._loading = true;\r\n\t\tthis._showLoading(true);\r\n\t\tthis._hideLoadMoreButton(true);\r\n\r\n\t\ttry {\r\n\t\t\tconst res = await fetch(url, { headers: { 'Content-Type': 'application/json' } });\r\n\t\t\tconst data = await res.json();\r\n\r\n\t\t\tif (Array.isArray(data.results)) {\r\n\t\t\t\tVGSelect.addOptions(this._element.previousElementSibling, data, { preserve: true });\r\n\t\t\t\tthis._currentPage = data.pagination?.current_page || nextPage;\r\n\t\t\t\tthis._totalPages = data.pagination?.total_pages || null;\r\n\r\n\t\t\t\t// Показать кнопку снова, если есть следующая страница\r\n\t\t\t\tif (this._totalPages === null || this._currentPage < this._totalPages) {\r\n\t\t\t\t\tthis._hideLoadMoreButton(false);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis._callCallback('onLoadNext', { page: this._currentPage, data });\r\n\t\t\t\tthis._triggerEvent(EVENT_KEY_LOAD_NEXT, { page: this._currentPage, term: this._searchTerm });\r\n\t\t\t}\r\n\t\t} catch (err) {\r\n\t\t\tconsole.error('VGSelect: Failed to load next page', err);\r\n\t\t\tthis._triggerEvent(EVENT_KEY_ERROR, { error: 'Pagination fetch failed', term: this._searchTerm });\r\n\t\t\tthis._hideLoadMoreButton(false); // оставить кнопку при ошибке\r\n\t\t} finally {\r\n\t\t\tthis._showLoading(false);\r\n\t\t\tthis._loading = false;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Выполняет удалённый запрос для поиска\r\n\t * @param {string} term - Поисковый запрос\r\n\t * @private\r\n\t */\r\n\t_fetchRemoteData(term) {\r\n\t\tconst { route, method = 'GET', pageParam = 'page', termParam = 'q', perpage = 20 } = this._params.search;\r\n\t\tconst url = new URL(route, window.location.origin);\r\n\t\turl.searchParams.set(termParam, term);\r\n\t\turl.searchParams.set(pageParam, 1);\r\n\t\turl.searchParams.set('per_page', perpage);\r\n\r\n\t\tconst searchInput = this._element.querySelector(SELECTOR_SEARCH_INPUT);\r\n\t\tconst wasOpen = this._isShown();\r\n\r\n\t\t// Обновляем текущее \"желательное\" состояние\r\n\t\tthis._searchTerm = term;\r\n\t\tthis._currentPage = 1;\r\n\t\tthis._totalPages = null;\r\n\r\n\t\t// Отменяем предыдущий запрос (если ещё летит)\r\n\t\tif (this._remoteSearchAbortController) {\r\n\t\t\tthis._remoteSearchAbortController.abort();\r\n\t\t}\r\n\t\tthis._remoteSearchAbortController = new AbortController();\r\n\r\n\t\t// Метим этот запрос как \"последний\"\r\n\t\tconst requestId = ++this._remoteSearchRequestId;\r\n\t\tconst signal = this._remoteSearchAbortController.signal;\r\n\r\n\t\tthis._showLoading(true);\r\n\t\tthis._hideLoadMoreButton(true);\r\n\r\n\t\tfetch(url, {\r\n\t\t\tmethod,\r\n\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\tsignal\r\n\t\t})\r\n\t\t\t.then(res => res.json())\r\n\t\t\t.then(data => {\r\n\t\t\t\t// Если прилетел не самый свежий ответ — игнорируем\r\n\t\t\t\tif (requestId !== this._remoteSearchRequestId) return;\r\n\r\n\t\t\t\t// Если пользователь уже ввёл другой текст — тоже игнорируем\r\n\t\t\t\tconst liveTerm = searchInput ? searchInput.value.trim() : '';\r\n\t\t\t\tif (liveTerm !== term) return;\r\n\r\n\t\t\t\tconst select = this._element.previousElementSibling;\r\n\t\t\t\tif (!select) return;\r\n\r\n\t\t\t\t// Очистка старых опций\r\n\t\t\t\t[...select.querySelectorAll('option')].forEach(opt => {\r\n\t\t\t\t\t// Оставляем первый пустой скрытый placeholder:\r\n\t\t\t\t\t// <option value=\"\" selected hidden></option>\r\n\t\t\t\t\tconst isFirst = opt === select.options[0];\r\n\t\t\t\t\tconst isEmptyValue = (opt.getAttribute('value') ?? '') === '';\r\n\t\t\t\t\tconst isEmptyText = (opt.textContent || '').trim() === '';\r\n\t\t\t\t\tconst isHidden = opt.hidden === true || opt.hasAttribute('hidden');\r\n\t\t\t\t\tconst isSelectedAttr = opt.hasAttribute('selected');\r\n\r\n\t\t\t\t\tif (isFirst && isEmptyValue && isEmptyText && isHidden && isSelectedAttr) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (!opt.hasAttribute('data-preserve') && !opt.closest('optgroup[data-preserve]')) {\r\n\t\t\t\t\t\topt.remove();\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\tVGSelect.addOptions(select, data, { preserve: true });\r\n\r\n\t\t\t\tthis._callCallback('onSearch', { term, data });\r\n\t\t\t\tthis._triggerEvent(EVENT_KEY_REBUILD, { term, data });\r\n\r\n\t\t\t\tif (data.pagination) {\r\n\t\t\t\t\tthis._currentPage = data.pagination.current_page || 1;\r\n\t\t\t\t\tthis._totalPages = data.pagination.total_pages || null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Показать кнопку \"Загрузить ещё\", если есть следующая страница\r\n\t\t\t\tif (this._totalPages === null || this._currentPage < this._totalPages) {\r\n\t\t\t\t\tthis._hideLoadMoreButton(false);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Важно: НЕ перетираем searchInput.value \"term\"-ом — это и вызывает глюк при гонках.\r\n\t\t\t\tif (wasOpen && searchInput) {\r\n\t\t\t\t\tsearchInput.focus();\r\n\t\t\t\t\tthis._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_ACTIVE);\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\t.catch(err => {\r\n\t\t\t\t// Abort — нормальная ситуация при быстром вводе\r\n\t\t\t\tif (err && (err.name === 'AbortError')) return;\r\n\r\n\t\t\t\tconsole.error('VGSelect: Remote search error', err);\r\n\t\t\t\tthis._triggerEvent(EVENT_KEY_ERROR, { error: 'Search request failed', term });\r\n\t\t\t\tthis._hideLoadMoreButton(false);\r\n\t\t\t})\r\n\t\t\t.finally(() => {\r\n\t\t\t\t// Лоадер убираем только для последнего актуального запроса\r\n\t\t\t\tif (requestId === this._remoteSearchRequestId) {\r\n\t\t\t\t\tthis._showLoading(false);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Добавляет опции в <select> и обновляет UI\r\n\t * @param {HTMLSelectElement} select - Исходный <select>\r\n\t * @param {Array|Object} data - Данные (массив или { results: [...] })\r\n\t * @param {Object} [options] - Опции\r\n\t * @param {boolean} [options.preserve] - Сохранить существующие опции\r\n\t */\r\n\tstatic addOptions(select, data, options = {}) {\r\n\t\tconst { preserve = false } = options;\r\n\t\tconst container = select.nextElementSibling;\r\n\t\tconst isRebuild = container && container.classList.contains(CLASS_NAME_CONTAINER);\r\n\t\tconst instance = isRebuild ? VGSelect.getInstance(container) : null;\r\n\r\n\t\tlet optionsData = data;\r\n\t\tif (data && data.results && Array.isArray(data.results)) {\r\n\t\t\toptionsData = data.results;\r\n\t\t}\r\n\r\n\t\tif (!Array.isArray(optionsData)) {\r\n\t\t\tinstance?._triggerEvent(EVENT_KEY_ERROR, { error: 'Invalid data format: expected array' });\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst treeEnabled = this._isTreeEnabled(select, instance?._params || {});\r\n\r\n\t\tif (!preserve) {\r\n\t\t\t// Удаление только не помеченных как data-preserve\r\n\t\t\t[...select.querySelectorAll('option')].forEach(option => {\r\n\t\t\t\tconst parentOptGroup = option.closest('optgroup');\r\n\t\t\t\tif (option.value === '') return;\r\n\t\t\t\tif (option.hasAttribute('data-preserve')) return;\r\n\t\t\t\tif (parentOptGroup && parentOptGroup.hasAttribute('data-preserve')) return;\r\n\t\t\t\toption.remove();\r\n\t\t\t});\r\n\r\n\t\t\t[...select.querySelectorAll('optgroup')].forEach(og => {\r\n\t\t\t\tif (og.children.length === 0 && !og.hasAttribute('data-preserve')) {\r\n\t\t\t\t\tog.remove();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tconst appendOption = (item, parent, level = null) => {\r\n\t\t\tconst option = document.createElement('option');\r\n\t\t\tconst hasChildren = Array.isArray(item.children) && item.children.length > 0;\r\n\r\n\t\t\toption.value = item.id || '';\r\n\t\t\toption.textContent = item.text || '';\r\n\t\t\tif (item.selected) option.selected = true;\r\n\t\t\tif (item.disabled) option.disabled = true;\r\n\t\t\tif (treeEnabled && Number.isInteger(level)) {\r\n\t\t\t\toption.setAttribute('data-level', String(level));\r\n\t\t\t\tif (hasChildren && !option.value) {\r\n\t\t\t\t\toption.disabled = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tconst dataAttrs = Object.keys(item).filter(k => !['id', 'text', 'selected', 'disabled', 'children'].includes(k));\r\n\t\t\tdataAttrs.forEach(key => {\r\n\t\t\t\toption.setAttribute(`data-${key}`, item[key]);\r\n\t\t\t});\r\n\r\n\t\t\tparent.appendChild(option);\r\n\t\t};\r\n\r\n\t\tconst appendTreeOptions = (items, parent, level = 0) => {\r\n\t\t\titems.forEach(item => {\r\n\t\t\t\tappendOption(item, parent, level);\r\n\t\t\t\tif (Array.isArray(item.children) && item.children.length > 0) {\r\n\t\t\t\t\tappendTreeOptions(item.children, parent, level + 1);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tif (treeEnabled) {\r\n\t\t\tappendTreeOptions(optionsData, select, 0);\r\n\t\t} else {\r\n\t\t\toptionsData.forEach(item => {\r\n\t\t\t\tif (item.children && Array.isArray(item.children)) {\r\n\t\t\t\t\tconst optgroup = document.createElement('optgroup');\r\n\t\t\t\t\toptgroup.label = item.text || '';\r\n\t\t\t\t\tif (item.disabled) optgroup.disabled = true;\r\n\r\n\t\t\t\t\titem.children.forEach(child => appendOption(child, optgroup));\r\n\r\n\t\t\t\t\tselect.appendChild(optgroup);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tappendOption(item, select);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (isRebuild) {\r\n\t\t\tconst drop = container.querySelector(`.${CLASS_NAME_DROPDOWN}`);\r\n\t\t\tVGSelect.buildListOptions(select, drop, instance?._params || {});\r\n\t\t\tinstance?._triggerEvent(EVENT_KEY_REBUILD);\r\n\t\t} else {\r\n\t\t\tthis.updateUI(select);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Фильтрует опции локально по введённому тексту\r\n\t * @param {string} term - Поисковый запрос\r\n\t * @private\r\n\t */\r\n\t_filterLocalOptions(term) {\r\n\t\tconst list = this._drop.querySelector(`.${CLASS_NAME_LIST}`);\r\n\t\tconst options = list.querySelectorAll(`.${CLASS_NAME_OPTION}`);\r\n\r\n\t\tif (!term) {\r\n\t\t\toptions.forEach(el => el.hidden = false);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tterm = term.toLowerCase();\r\n\t\toptions.forEach(el => {\r\n\t\t\tconst text = el.textContent.toLowerCase();\r\n\t\t\tel.hidden = !text.includes(term);\r\n\t\t});\r\n\t}\r\n}\r\n\r\n_handlersVGSelect();\r\n\r\nexport default VGSelect;\r\n","import VGSelect from \"./js/vgselect\";\r\n\r\nexport default VGSelect;","import BaseModule from \"../../base-module\";\r\nimport { isDisabled, isVisible, mergeDeepObject } from \"../../../utils/js/functions\";\r\nimport EventHandler from \"../../../utils/js/dom/event\";\r\nimport { dismissTrigger } from \"../../module-fn\";\r\nimport Selectors from \"../../../utils/js/dom/selectors\";\r\nimport Backdrop from \"../../../utils/js/components/backdrop\";\r\nimport ScrollBarHelper from \"../../../utils/js/components/scrollbar\";\r\n\r\n/**\r\n * @constant {string} NAME - Имя модуля.\r\n */\r\nconst NAME = 'sidebar';\r\n\r\n/**\r\n * @constant {string} NAME_KEY - Пространство имён для событий.\r\n */\r\nconst NAME_KEY = 'vg.sidebar';\r\n\r\n/**\r\n * @constant {string} SELECTOR_DATA_TOGGLE - Селектор для элементов активации сайдбара.\r\n */\r\nconst SELECTOR_DATA_TOGGLE = '[data-vg-toggle=\"sidebar\"]';\r\n\r\n/**\r\n * @constant {string} CLASS_NAME_SHOW - Класс, отвечающий за отображение сайдбара.\r\n */\r\nconst CLASS_NAME_SHOW = 'show';\r\n\r\n/**\r\n * @constant {string} CLASS_NAME_OPEN - Класс, добавляемый к body при открытом сайдбаре.\r\n */\r\nconst CLASS_NAME_OPEN = 'vg-sidebar-open';\r\n\r\n/**\r\n * @constant {Object} EVENT_KEYS - Объект с ключами событий для модуля.\r\n */\r\nconst EVENT_KEYS = {\r\n\tHIDE: `${NAME_KEY}.hide`,\r\n\tHIDDEN: `${NAME_KEY}.hidden`,\r\n\tSHOW: `${NAME_KEY}.show`,\r\n\tSHOWN: `${NAME_KEY}.shown`,\r\n\tLOADED: `${NAME_KEY}.loaded`,\r\n\tKEYDOWN_DISMISS: `keydown.dismiss.${NAME_KEY}`,\r\n\tHIDE_PREVENTED: `hidePrevented.${NAME_KEY}`,\r\n\tCLICK_DATA_API: `click.${NAME_KEY}.data.api`,\r\n\tPOPSTATE_DATA_API: `popstate.${NAME_KEY}.data.api`,\r\n\tDOM_LOADED_DATA_API: `DOMContentLoaded.${NAME_KEY}.data.api`,\r\n};\r\n\r\n/**\r\n * Класс VGSidebar реализует функциональность боковой панели (сайдбара) с поддержкой:\r\n * - открытия/закрытия по клику или хэшу\r\n * - поддержки backdrop\r\n * - блокировки скролла при открытии\r\n * - анимаций\r\n * - AJAX-загрузки контента\r\n *\r\n * @extends BaseModule\r\n */\r\nclass VGSidebar extends BaseModule {\r\n\t/**\r\n\t * Создаёт экземпляр VGSidebar.\r\n\t *\r\n\t * @param {HTMLElement} element - Основной элемент сайдбара.\r\n\t * @param {Object} params - Параметры конфигурации.\r\n\t * @param {boolean} [params.backdrop=true] - Показывать подложку.\r\n\t * @param {boolean} [params.overflow=true] - Блокировать скролл при открытии.\r\n\t * @param {boolean} [params.keyboard=true] - Закрывать по клавише Escape.\r\n\t * @param {boolean} [params.hash=false] - Поддержка открытия по хэшу URL.\r\n\t * @param {Object} [params.animation] - Настройки анимации.\r\n\t * @param {boolean} [params.animation.enable=false] - Включить анимацию.\r\n\t * @param {string} [params.animation.in='animate__rollIn'] - Класс входной анимации.\r\n\t * @param {string} [params.animation.out='animate__rollOut'] - Класс выходной анимации.\r\n\t * @param {number} [params.animation.delay=800] - Задержка перед закрытием (мс).\r\n\t * @param {Object} [params.ajax] - Параметры AJAX-загрузки.\r\n\t * @param {string} [params.ajax.route=''] - URL для загрузки.\r\n\t * @param {string} [params.ajax.target=''] - Селектор цели для вставки.\r\n\t * @param {string} [params.ajax.method='get'] - HTTP-метод.\r\n\t * @param {boolean} [params.ajax.loader=false] - Показывать лоадер.\r\n\t * @param {boolean} [params.ajax.once=false] - Загружать только один раз.\r\n\t * @param {boolean} [params.ajax.output=true] - Вставлять ответ в DOM.\r\n\t */\r\n\tconstructor(element, params = {}) {\r\n\t\tsuper(element, params);\r\n\r\n\t\tthis._params = this._getParams(element, mergeDeepObject({\r\n\t\t\tbackdrop: true,\r\n\t\t\toverflow: true,\r\n\t\t\tkeyboard: true,\r\n\t\t\thash: false,\r\n\t\t\tanimation: {\r\n\t\t\t\tenable: false,\r\n\t\t\t\tin: 'animate__rollIn',\r\n\t\t\t\tout: 'animate__rollOut',\r\n\t\t\t\tdelay: 800,\r\n\t\t\t},\r\n\t\t\tajax: {\r\n\t\t\t\troute: '',\r\n\t\t\t\ttarget: '',\r\n\t\t\t\tmethod: 'get',\r\n\t\t\t\tloader: false,\r\n\t\t\t\tonce: false,\r\n\t\t\t\toutput: true,\r\n\t\t\t}\r\n\t\t}, params));\r\n\r\n\t\tthis._scrollBar = new ScrollBarHelper();\r\n\t\tthis._params.animation.delay = this._params.animation.enable ? this._params.animation.delay : 0;\r\n\r\n\t\tthis._addEventListeners();\r\n\t\tthis._dismissElement();\r\n\t\tthis._animation(this._element, NAME_KEY, this._params.animation);\r\n\t}\r\n\r\n\t/**\r\n\t * Статическое свойство: имя модуля.\r\n\t * @returns {string}\r\n\t */\r\n\tstatic get NAME() {\r\n\t\treturn NAME;\r\n\t}\r\n\r\n\t/**\r\n\t * Статическое свойство: ключ для событий и данных.\r\n\t * @returns {string}\r\n\t */\r\n\tstatic get NAME_KEY() {\r\n\t\treturn NAME_KEY;\r\n\t}\r\n\r\n\t/**\r\n\t * Переключает состояние сайдбара (открыть/закрыть).\r\n\t *\r\n\t * @param {HTMLElement} [relatedTarget] - Элемент, инициировавший открытие.\r\n\t * @returns {void}\r\n\t */\r\n\ttoggle(relatedTarget) {\r\n\t\treturn this._isShown() ? this.hide() : this.show(relatedTarget);\r\n\t}\r\n\t_showPopstateHandler = null;\r\n\r\n\t/**\r\n\t * Открывает сайдбар.\r\n\t *\r\n\t * @param {HTMLElement} [relatedTarget] - Элемент, инициировавший открытие.\r\n\t * @returns {void}\r\n\t */\r\n\tshow(relatedTarget) {\r\n\t\tif (isDisabled(this._element)) return;\r\n\r\n\t\tif (relatedTarget) {\r\n\t\t\tthis._params = this._getParams(relatedTarget, this._params);\r\n\t\t}\r\n\r\n\t\tthis._route((status, data) => {\r\n\t\t\tEventHandler.trigger(this._element, EVENT_KEYS.LOADED, { stats: status, data });\r\n\t\t});\r\n\r\n\t\tconst showEvent = EventHandler.trigger(this._element, EVENT_KEYS.SHOW, { relatedTarget });\r\n\t\tif (showEvent.defaultPrevented) return;\r\n\r\n\t\tif (this._params.backdrop) {\r\n\t\t\tBackdrop.show();\r\n\t\t}\r\n\r\n\t\tif (this._params.overflow) {\r\n\t\t\tthis._scrollBar.hide();\r\n\t\t}\r\n\r\n\t\tif (this._params.hash) {\r\n\t\t\thistory.pushState(null, '', `#${this._element.id}`);\r\n\r\n\t\t\tif (this._showPopstateHandler) {\r\n\t\t\t\tEventHandler.off(window, EVENT_KEYS.POPSTATE_DATA_API, this._showPopstateHandler);\r\n\t\t\t}\r\n\r\n\t\t\tthis._showPopstateHandler = () => this.hide();\r\n\t\t\tEventHandler.on(window, EVENT_KEYS.POPSTATE_DATA_API, this._showPopstateHandler);\r\n\t\t}\r\n\r\n\t\tthis._element.classList.add(CLASS_NAME_SHOW);\r\n\t\tdocument.body.classList.add(CLASS_NAME_OPEN);\r\n\r\n\t\tconst completeCallback = () => {\r\n\t\t\tconst backdrop = Selectors.find('.vg-backdrop');\r\n\t\t\tif (backdrop) {\r\n\t\t\t\tEventHandler.on(backdrop, 'mousedown.vg.backdrop', () => this.hide());\r\n\t\t\t}\r\n\t\t\tEventHandler.trigger(this._element, EVENT_KEYS.SHOWN, { relatedTarget });\r\n\t\t};\r\n\r\n\t\tthis._queueCallback(completeCallback, this._element, true, 50);\r\n\t}\r\n\r\n\t/**\r\n\t * Закрывает сайдбар.\r\n\t *\r\n\t * @param {boolean} [isLeaveBackDrop=false] - Не убирать подложку.\r\n\t * @returns {void}\r\n\t */\r\n\thide(isLeaveBackDrop = false) {\r\n\t\tif (isDisabled(this._element)) return;\r\n\r\n\t\tconst hideEvent = EventHandler.trigger(this._element, EVENT_KEYS.HIDE);\r\n\t\tif (hideEvent.defaultPrevented) return;\r\n\r\n\t\tdocument.body.classList.remove(CLASS_NAME_OPEN);\r\n\t\tthis._element.classList.remove(CLASS_NAME_SHOW);\r\n\r\n\t\tsetTimeout(() => {\r\n\t\t\tthis._element.setAttribute('aria-expanded', 'false');\r\n\r\n\t\t\tconst completeCallback = () => {\r\n\t\t\t\tif (!isLeaveBackDrop) {\r\n\t\t\t\t\tif (this._params.backdrop) {\r\n\t\t\t\t\t\tBackdrop.hide(() => {\r\n\t\t\t\t\t\t\tif (this._params.overflow) {\r\n\t\t\t\t\t\t\t\tthis._scrollBar.reset();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} else if (this._params.overflow) {\r\n\t\t\t\t\t\tthis._scrollBar.reset();\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (this._params.hash && window.location.hash === `#${this._element.id}`) {\r\n\t\t\t\t\t\thistory.replaceState(\r\n\t\t\t\t\t\t\t'',\r\n\t\t\t\t\t\t\tdocument.title,\r\n\t\t\t\t\t\t\twindow.location.pathname + window.location.search\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (this._showPopstateHandler) {\r\n\t\t\t\t\t\tEventHandler.off(window, EVENT_KEYS.POPSTATE_DATA_API, this._showPopstateHandler);\r\n\t\t\t\t\t\tthis._showPopstateHandler = null;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tEventHandler.trigger(this._element, EVENT_KEYS.HIDDEN);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tthis._queueCallback(completeCallback, this._element, true);\r\n\t\t}, this._params.animation.delay);\r\n\t}\r\n\r\n\t/**\r\n\t * Очищает ресурсы модуля.\r\n\t * @override\r\n\t */\r\n\tdispose() {\r\n\t\tsuper.dispose();\r\n\t\tEventHandler.off(this._element, EVENT_KEYS.HIDE);\r\n\t\tif (this._showPopstateHandler) {\r\n\t\t\tEventHandler.off(window, EVENT_KEYS.POPSTATE_DATA_API, this._showPopstateHandler);\r\n\t\t}\r\n\t\tthis._scrollBar.reset();\r\n\t}\r\n\r\n\t/**\r\n\t * Проверяет, открыт ли сайдбар.\r\n\t * @returns {boolean}\r\n\t * @private\r\n\t */\r\n\t_isShown() {\r\n\t\treturn this._element.classList.contains(CLASS_NAME_SHOW);\r\n\t}\r\n\r\n\t/**\r\n\t * Добавляет глобальные слушатели событий (например, Escape).\r\n\t * @private\r\n\t */\r\n\t_addEventListeners() {\r\n\t\tEventHandler.on(document, EVENT_KEYS.KEYDOWN_DISMISS, (event) => {\r\n\t\t\tif (event.key !== 'Escape') return;\r\n\r\n\t\t\tif (this._params.keyboard) {\r\n\t\t\t\tthis.hide();\r\n\t\t\t} else {\r\n\t\t\t\tEventHandler.trigger(this._element, EVENT_KEYS.HIDE_PREVENTED);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n}\r\n\r\n// Автоматическая инициализация по data-атрибутам\r\ndismissTrigger(VGSidebar);\r\n\r\n/**\r\n * Реализация Data API: открытие сайдбара по data-атрибуту.\r\n */\r\nEventHandler.on(document, EVENT_KEYS.CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\r\n\tconst target = Selectors.getElementFromSelector(this);\r\n\tif (!target) return;\r\n\r\n\tif (['A', 'AREA'].includes(this.tagName)) {\r\n\t\tevent.preventDefault();\r\n\t}\r\n\r\n\tif (isDisabled(this)) return;\r\n\r\n\tthis.setAttribute('aria-expanded', 'true');\r\n\r\n\t// Сбрасываем атрибут после закрытия\r\n\tEventHandler.one(target, EVENT_KEYS.HIDDEN, () => {\r\n\t\tthis.setAttribute('aria-expanded', 'false');\r\n\t});\r\n\r\n\t// Закрываем уже открытый сайдбар\r\n\tconst alreadyOpen = Selectors.find('.vg-sidebar.show');\r\n\tif (alreadyOpen && alreadyOpen !== target) {\r\n\t\tVGSidebar.getInstance(alreadyOpen).hide();\r\n\t}\r\n\r\n\tconst instance = VGSidebar.getOrCreateInstance(target);\r\n\tinstance.toggle(this);\r\n});\r\n\r\n/**\r\n * Открытие сайдбара по хэшу при загрузке страницы.\r\n */\r\nEventHandler.on(document, EVENT_KEYS.DOM_LOADED_DATA_API, function () {\r\n\tconst hash = window.location.hash.slice(1);\r\n\tif (!hash) return;\r\n\r\n\tconst target = Selectors.find(`#${hash}`);\r\n\tif (target && target.classList.contains('vg-sidebar') && !isDisabled(target)) {\r\n\t\tconst instance = VGSidebar.getOrCreateInstance(target);\r\n\r\n\t\tif (instance._params.hash) {\r\n\t\t\tinstance.toggle();\r\n\t\t}\r\n\t}\r\n});\r\n\r\nexport default VGSidebar;","import VGSidebar from \"./js/vgsidebar\";\r\n\r\nexport default VGSidebar;","import BaseModule from \"../../base-module\";\r\nimport { mergeDeepObject, getElement, isDisabled, isVisible } from \"../../../utils/js/functions\";\r\nimport EventHandler from \"../../../utils/js/dom/event\";\r\nimport Selectors from \"../../../utils/js/dom/selectors\";\r\n\r\n/**\r\n * Константы модуля VGSpy\r\n */\r\nconst NAME = 'spy';\r\nconst NAME_KEY = 'vg.spy';\r\nconst EVENT_KEY = `.${NAME_KEY}`;\r\nconst DATA_API_KEY = '.data-api';\r\n\r\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`;\r\nconst EVENT_CLICK = `click${EVENT_KEY}`;\r\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`;\r\n\r\nconst CLASS_NAME_DROPDOWN_ITEM = 'vg-dropdown-item';\r\nconst CLASS_NAME_ACTIVE = 'active';\r\n\r\nconst SELECTOR_DATA_SPY = '[data-vg-toggle=\"spy\"]';\r\nconst SELECTOR_TARGET_LINKS = '[href], [data-vg-target]';\r\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group';\r\nconst SELECTOR_NAV_LINKS = '.nav-link';\r\nconst SELECTOR_NAV_ITEMS = '.nav-item';\r\nconst SELECTOR_LIST_ITEMS = '.list-group-item';\r\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;\r\nconst SELECTOR_DROPDOWN = '.vg-dropdown';\r\nconst SELECTOR_DROPDOWN_TOGGLE = '[data-vg-toggle=\"dropdown\"]';\r\n\r\n/**\r\n * Модуль \"Spy\" — отслеживает прокрутку и активные секции на странице.\r\n * Автоматически подсвечивает навигационные ссылки в зависимости от текущего положения скролла.\r\n * Поддерживает плавную прокрутку и работу внутри контейнеров с overflow.\r\n */\r\nclass VGSpy extends BaseModule {\r\n\t/**\r\n\t * Создаёт экземпляр VGSpy\r\n\t * @param {HTMLElement} element — корневой элемент навигации (например, .nav)\r\n\t * @param {Object} params — параметры конфигурации\r\n\t */\r\n\tconstructor(element, params) {\r\n\t\tsuper(element, params);\r\n\r\n\t\t/**\r\n\t\t * Объединённые параметры с настройками по умолчанию\r\n\t\t * @type {Object}\r\n\t\t * @property {number|null} offset - смещение (устаревшее, для совместимости)\r\n\t\t * @property {string} rootMargin - отступ для IntersectionObserver\r\n\t\t * @property {boolean} smoothScroll - включить плавную прокрутку по якорям\r\n\t\t * @property {HTMLElement|string} target - целевой контейнер прокрутки\r\n\t\t * @property {number[]|string} threshold - пороги видимости (0.1, 0.5, 1)\r\n\t\t */\r\n\t\tthis._params = this._configAfterMerge(\r\n\t\t\tmergeDeepObject(\r\n\t\t\t\t{\r\n\t\t\t\t\toffset: null, // Устаревшее, для обратной совместимости\r\n\t\t\t\t\trootMargin: '0px 0px -25%',\r\n\t\t\t\t\tsmoothScroll: true,\r\n\t\t\t\t\ttarget: this._element,\r\n\t\t\t\t\tthreshold: [0.1, 0.5, 1],\r\n\t\t\t\t},\r\n\t\t\t\tparams\r\n\t\t\t)\r\n\t\t);\r\n\r\n\t\t/**\r\n\t\t * Карта: хеш-ссылка → HTML-элемент ссылки\r\n\t\t * @type {Map<string, HTMLElement>}\r\n\t\t */\r\n\t\tthis._targetLinks = new Map();\r\n\r\n\t\t/**\r\n\t\t * Карта: хеш-ссылка → HTML-элемент наблюдаемой секции\r\n\t\t * @type {Map<string, HTMLElement>}\r\n\t\t */\r\n\t\tthis._observableSections = new Map();\r\n\r\n\t\t/**\r\n\t\t * Корневой элемент для IntersectionObserver (если скролл не окно)\r\n\t\t * @type {HTMLElement|null}\r\n\t\t */\r\n\t\tthis._rootElement = null;\r\n\r\n\t\t/**\r\n\t\t * Текущая активная секция\r\n\t\t * @type {HTMLElement|null}\r\n\t\t */\r\n\t\tthis._activeTarget = null;\r\n\r\n\t\t/**\r\n\t\t * Экземпляр IntersectionObserver\r\n\t\t * @type {IntersectionObserver|null}\r\n\t\t */\r\n\t\tthis._observer = null;\r\n\r\n\t\t/**\r\n\t\t * Экземпляр Smooth Scrollbar (если используется вместо нативного scrollTop).\r\n\t\t * @type {Object|null}\r\n\t\t */\r\n\t\tthis._scrollbar = null;\r\n\r\n\t\t/**\r\n\t\t * Listener для Smooth Scrollbar.\r\n\t\t * @type {Function|null}\r\n\t\t */\r\n\t\tthis._scrollbarListener = null;\r\n\r\n\t\t/**\r\n\t\t * Данные о предыдущей прокрутке для определения направления\r\n\t\t * @type {{visibleEntryTop: number, parentScrollTop: number}}\r\n\t\t */\r\n\t\tthis._previousScrollData = {\r\n\t\t\tvisibleEntryTop: 0,\r\n\t\t\tparentScrollTop: 0,\r\n\t\t};\r\n\r\n\t\tthis.refresh();\r\n\t}\r\n\r\n\t/**\r\n\t * Имя модуля\r\n\t * @returns {string}\r\n\t */\r\n\tstatic get NAME() {\r\n\t\treturn NAME;\r\n\t}\r\n\r\n\t/**\r\n\t * Ключ модуля (для хранения в data)\r\n\t * @returns {string}\r\n\t */\r\n\tstatic get NAME_KEY() {\r\n\t\treturn NAME_KEY;\r\n\t}\r\n\r\n\t/**\r\n\t * Инициализирует или перезапускает модуль: находит ссылки и секции, создаёт observer\r\n\t */\r\n\trefresh() {\r\n\t\tthis._initializeTargetsAndObservables();\r\n\t\tthis._updateRootElement();\r\n\t\tthis._maybeEnableSmoothScroll();\r\n\r\n\t\tthis._setupTracking();\r\n\r\n\t\t// Подписываемся на наблюдение за секциями\r\n\t}\r\n\r\n\t/**\r\n\t * Очищает ресурсы (отключает observer)\r\n\t */\r\n\t_setupTracking() {\r\n\t\tthis._updateSmoothScrollbar();\r\n\r\n\t\tif (this._scrollbar) {\r\n\t\t\tthis._setupScrollbarTracking();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._teardownScrollbarTracking();\r\n\t\tthis._rebuildObserver();\r\n\r\n\t\t// Smooth Scrollbar can be initialized after the spy; retry once on the next tick.\r\n\t\tif (this._rootElement && !this._isScrollableSelf(this._rootElement) && window.Scrollbar) {\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tif (this._scrollbar) return;\r\n\t\t\t\tthis._updateSmoothScrollbar();\r\n\t\t\t\tif (this._scrollbar) this._setupScrollbarTracking();\r\n\t\t\t}, 0);\r\n\t\t}\r\n\t}\r\n\r\n\t_updateSmoothScrollbar() {\r\n\t\tconst root = this._rootElement;\r\n\t\tconst Scrollbar = window.Scrollbar;\r\n\r\n\t\tlet instance = null;\r\n\t\tif (root) {\r\n\t\t\tinstance = root.scrollbar || null;\r\n\r\n\t\t\tif (!instance && Scrollbar && typeof Scrollbar.get === 'function') {\r\n\t\t\t\tinstance = Scrollbar.get(root) || null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (instance === this._scrollbar) return;\r\n\r\n\t\tthis._teardownScrollbarTracking();\r\n\t\tthis._scrollbar = instance;\r\n\t}\r\n\r\n\t_setupScrollbarTracking() {\r\n\t\tif (!this._scrollbar || typeof this._scrollbar.addListener !== 'function') return;\r\n\r\n\t\t// Smooth Scrollbar is virtual (content is transformed), so IntersectionObserver won't be reliable.\r\n\t\tif (this._observer) this._observer.disconnect();\r\n\r\n\t\tif (this._scrollbarListener && typeof this._scrollbar.removeListener === 'function') {\r\n\t\t\tthis._scrollbar.removeListener(this._scrollbarListener);\r\n\t\t}\r\n\r\n\t\tthis._scrollbarListener = (status) => this._onScrollbarScroll(status);\r\n\t\tthis._scrollbar.addListener(this._scrollbarListener);\r\n\r\n\t\tthis._onScrollbarScroll(null);\r\n\t}\r\n\r\n\t_teardownScrollbarTracking() {\r\n\t\tif (this._scrollbar && this._scrollbarListener && typeof this._scrollbar.removeListener === 'function') {\r\n\t\t\tthis._scrollbar.removeListener(this._scrollbarListener);\r\n\t\t}\r\n\t\tthis._scrollbarListener = null;\r\n\t}\r\n\r\n\t_onScrollbarScroll(status) {\r\n\t\tconst scrollTop = status?.offset?.y ?? this._getParentScrollTop();\r\n\t\tconst userScrollsDown = scrollTop >= this._previousScrollData.parentScrollTop;\r\n\t\tthis._previousScrollData.parentScrollTop = scrollTop;\r\n\r\n\t\tconst activationLine = this._getActivationLine(scrollTop);\r\n\r\n\t\tconst items = [];\r\n\t\tfor (const [id, section] of this._observableSections.entries()) {\r\n\t\t\tif (!section || !isVisible(section)) continue;\r\n\t\t\tconst link = this._targetLinks.get(id);\r\n\t\t\tif (!link) continue;\r\n\r\n\t\t\titems.push({ top: this._getSectionTop(section), link });\r\n\t\t}\r\n\r\n\t\titems.sort((a, b) => a.top - b.top);\r\n\r\n\t\tlet activeLink = null;\r\n\t\tfor (const item of items) {\r\n\t\t\tif (item.top <= activationLine) {\r\n\t\t\t\tactiveLink = item.link;\r\n\t\t\t} else if (!userScrollsDown) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._process(activeLink);\r\n\t}\r\n\r\n\t_getActivationLine(scrollTop) {\r\n\t\tconst rootHeight = this._rootElement\r\n\t\t\t? this._rootElement.clientHeight\r\n\t\t\t: (window.innerHeight || document.documentElement.clientHeight || 0);\r\n\r\n\t\tconst margin = (this._params.rootMargin || '').trim();\r\n\t\tconst parts = margin ? margin.split(/\\s+/) : [];\r\n\t\tconst bottom = parts.length === 1\r\n\t\t\t? parts[0]\r\n\t\t\t: parts.length === 2\r\n\t\t\t\t? parts[0]\r\n\t\t\t\t: parts.length >= 3\r\n\t\t\t\t\t? parts[2]\r\n\t\t\t\t\t: null;\r\n\r\n\t\tif (bottom && bottom.endsWith('%')) {\r\n\t\t\tconst pct = Number.parseFloat(bottom);\r\n\t\t\tif (!Number.isNaN(pct)) return scrollTop + rootHeight * (1 + pct / 100);\r\n\t\t}\r\n\r\n\t\tif (bottom && bottom.endsWith('px')) {\r\n\t\t\tconst px = Number.parseFloat(bottom);\r\n\t\t\tif (!Number.isNaN(px)) return scrollTop + rootHeight + px;\r\n\t\t}\r\n\r\n\t\treturn scrollTop + rootHeight * 0.75;\r\n\t}\r\n\r\n\t_rebuildObserver() {\r\n\t\tif (this._observer) this._observer.disconnect();\r\n\t\tthis._observer = this._getNewObserver();\r\n\r\n\t\tfor (const section of this._observableSections.values()) {\r\n\t\t\tthis._observer.observe(section);\r\n\t\t}\r\n\t}\r\n\r\n\t_updateRootElement() {\r\n\t\tthis._rootElement = this._normalizeScrollRoot(this._params.target);\r\n\r\n\t\tif (!this._rootElement && this._isScrollableSelf(this._element)) {\r\n\t\t\tthis._rootElement = this._element;\r\n\t\t}\r\n\r\n\t\tif (!this._rootElement) {\r\n\t\t\tconst firstSection = this._observableSections.values().next().value || null;\r\n\r\n\t\t\t// Если секции лежат внутри overflow-контейнера — он обычно родитель секции\r\n\t\t\tif (firstSection && this._isScrollable(firstSection)) {\r\n\t\t\t\tthis._rootElement = firstSection.parentElement;\r\n\t\t\t} else {\r\n\t\t\t\tthis._rootElement = firstSection ? this._getScrollParent(firstSection) : null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._updateSmoothScrollbar();\r\n\t\tthis._previousScrollData.parentScrollTop = this._getParentScrollTop();\r\n\t\tthis._previousScrollData.visibleEntryTop = 0;\r\n\t}\r\n\r\n\t_normalizeScrollRoot(element) {\r\n\t\tconst root = getElement(element);\r\n\t\tif (!root) return null;\r\n\t\tif (root === document.body || root === document.documentElement) return null;\r\n\r\n\t\tif (this._isScrollableSelf(root)) return root;\r\n\r\n\t\t// Smooth Scrollbar containers are often overflow-hidden, but still act as a scroll root.\r\n\t\tconst Scrollbar = window.Scrollbar;\r\n\t\tconst hasSmoothScrollbar = !!(root.scrollbar || (Scrollbar && typeof Scrollbar.get === 'function' && Scrollbar.get(root)));\r\n\t\treturn hasSmoothScrollbar ? root : null;\r\n\t}\r\n\r\n\t// Проверяет: \"родитель element является скролл-контейнером?\"\r\n\t_isScrollable(element) {\r\n\t\tif (!(element instanceof HTMLElement)) return false;\r\n\t\tconst parent = element.parentElement;\r\n\t\tif (!parent) return false;\r\n\t\treturn this._isScrollableSelf(parent);\r\n\t}\r\n\r\n\t// Проверяет: \"сам element является скролл-контейнером?\"\r\n\t_isScrollableSelf(element) {\r\n\t\tif (!(element instanceof HTMLElement)) return false;\r\n\t\tconst overflowY = getComputedStyle(element).overflowY;\r\n\t\tif (!/(auto|scroll|overlay)/.test(overflowY)) return false;\r\n\t\treturn element.scrollHeight > element.clientHeight;\r\n\t}\r\n\r\n\t_getScrollParent(element) {\r\n\t\tfor (let parent = element.parentElement; parent && parent !== document.body; parent = parent.parentElement) {\r\n\t\t\tif (this._isScrollableSelf(parent)) return parent;\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\r\n\t_getSectionTop(section) {\r\n\t\tif (this._rootElement) {\r\n\t\t\tconst rootRect = this._rootElement.getBoundingClientRect();\r\n\t\t\tconst rect = section.getBoundingClientRect();\r\n\t\t\tconst scrollTop = this._scrollbar?.offset?.y ?? this._rootElement.scrollTop;\r\n\t\t\treturn scrollTop + (rect.top - rootRect.top);\r\n\t\t}\r\n\r\n\t\treturn (window.scrollY || document.documentElement.scrollTop || 0) + section.getBoundingClientRect().top;\r\n\t}\r\n\r\n\t_getParentScrollTop() {\r\n\t\tif (this._scrollbar) return this._scrollbar.offset?.y ?? 0;\r\n\t\tif (this._rootElement) return this._rootElement.scrollTop;\r\n\t\treturn window.scrollY || document.documentElement.scrollTop || 0;\r\n\t}\r\n\r\n\tdispose() {\r\n\t\tif (this._observer) {\r\n\t\t\tthis._observer.disconnect();\r\n\t\t}\r\n\t\tthis._teardownScrollbarTracking();\r\n\t\tthis._scrollbar = null;\r\n\t\tsuper.dispose();\r\n\t}\r\n\r\n\t/**\r\n\t * Обрабатывает и нормализует параметры после слияния\r\n\t * @param {Object} config\r\n\t * @returns {Object}\r\n\t * @private\r\n\t */\r\n\t_configAfterMerge(config) {\r\n\t\tconfig.target = getElement(config.target) || document.body;\r\n\r\n\t\t// Поддержка устаревшего параметра `offset`\r\n\t\tif (config.offset != null) {\r\n\t\t\tconfig.rootMargin = `${config.offset}px 0px -30%`;\r\n\t\t}\r\n\r\n\t\t// Преобразуем строку порогов в массив чисел\r\n\t\tif (typeof config.threshold === 'string') {\r\n\t\t\tconfig.threshold = config.threshold\r\n\t\t\t\t.split(',')\r\n\t\t\t\t.map((value) => Number.parseFloat(value.trim()));\r\n\t\t}\r\n\r\n\t\treturn config;\r\n\t}\r\n\r\n\t/**\r\n\t * Подключает плавную прокрутку по якорным ссылкам\r\n\t * @private\r\n\t */\r\n\t_maybeEnableSmoothScroll() {\r\n\t\tif (!this._params.smoothScroll) return;\r\n\r\n\t\tEventHandler.off(this._element, EVENT_CLICK);\r\n\t\tEventHandler.on(this._element, EVENT_CLICK, SELECTOR_TARGET_LINKS, (event) => {\r\n\t\t\tconst link = event.delegateTarget || event.target;\r\n\t\t\tconst id = this._getTargetIdFromTrigger(link);\r\n\t\t\tif (!id) return;\r\n\r\n\t\t\tlet section = this._observableSections.get(id);\r\n\t\t\tif (!section) {\r\n\t\t\t\tsection = Selectors.findID(id);\r\n\t\t\t\tif (section) {\r\n\t\t\t\t\tthis._targetLinks.set(section.id, link);\r\n\t\t\t\t\tthis._observableSections.set(section.id, section);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (!section) return;\r\n\r\n\t\t\t// If the target section is currently hidden (tabs/collapses/lazy layout),\r\n\t\t\t// don't hijack the click; allow UI to reveal it, then retry.\r\n\t\t\tif (!isVisible(section)) {\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tconst revealed = Selectors.findID(id);\r\n\t\t\t\t\tif (!revealed || !isVisible(revealed)) return;\r\n\r\n\t\t\t\t\tthis._targetLinks.set(revealed.id, link);\r\n\t\t\t\t\tthis._observableSections.set(revealed.id, revealed);\r\n\r\n\t\t\t\t\tthis._updateRootElement();\r\n\t\t\t\t\tthis._setupTracking();\r\n\r\n\t\t\t\t\tconst top = this._getSectionTop(revealed);\r\n\t\t\t\t\tif (this._scrollbar && typeof this._scrollbar.scrollTo === 'function') {\r\n\t\t\t\t\t\tthis._scrollbar.scrollTo(0, top, 600);\r\n\t\t\t\t\t} else if (this._rootElement) {\r\n\t\t\t\t\t\tif (this._rootElement.scrollTo) {\r\n\t\t\t\t\t\t\tthis._rootElement.scrollTo({ top, behavior: 'smooth' });\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tthis._rootElement.scrollTop = top;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else if (window.scrollTo) {\r\n\t\t\t\t\t\twindow.scrollTo({ top, behavior: 'smooth' });\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tdocument.documentElement.scrollTop = top;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tthis._process(link);\r\n\t\t\t\t}, 0);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tevent.preventDefault();\r\n\r\n\t\t\tthis._updateRootElement();\r\n\t\t\tthis._setupTracking();\r\n\r\n\t\t\tconst scrollTop = this._getSectionTop(section);\r\n\t\t\tconst root = this._rootElement;\r\n\r\n\t\t\tif (this._scrollbar && typeof this._scrollbar.scrollTo === 'function') {\r\n\t\t\t\tthis._scrollbar.scrollTo(0, scrollTop, 600);\r\n\t\t\t\tthis._process(link);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (root) {\r\n\t\t\t\tif (root.scrollTo) {\r\n\t\t\t\t\troot.scrollTo({ top: scrollTop, behavior: 'smooth' });\r\n\t\t\t\t} else {\r\n\t\t\t\t\troot.scrollTop = scrollTop;\r\n\t\t\t\t}\r\n\t\t\t\tthis._process(link);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (window.scrollTo) {\r\n\t\t\t\twindow.scrollTo({ top: scrollTop, behavior: 'smooth' });\r\n\t\t\t} else {\r\n\t\t\t\tdocument.documentElement.scrollTop = scrollTop;\r\n\t\t\t}\r\n\r\n\t\t\tthis._process(link);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Создаёт новый экземпляр IntersectionObserver\r\n\t * @returns {IntersectionObserver}\r\n\t * @private\r\n\t */\r\n\t_getNewObserver() {\r\n\t\tconst options = {\r\n\t\t\troot: this._rootElement,\r\n\t\t\trootMargin: this._params.rootMargin,\r\n\t\t\tthreshold: this._params.threshold,\r\n\t\t};\r\n\r\n\t\treturn new IntersectionObserver((entries) => this._observerCallback(entries), options);\r\n\t}\r\n\r\n\t/**\r\n\t * Обработчик пересечений (IntersectionObserver)\r\n\t * @param {IntersectionObserverEntry[]} entries\r\n\t * @private\r\n\t */\r\n\t_observerCallback(entries) {\r\n\t\tconst getTargetLink = (entry) => this._targetLinks.get(entry.target.id);\r\n\t\tconst parentScrollTop = this._getParentScrollTop();\r\n\t\tconst userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;\r\n\t\tthis._previousScrollData.parentScrollTop = parentScrollTop;\r\n\r\n\t\tfor (const entry of entries) {\r\n\t\t\tif (!entry.isIntersecting) {\r\n\t\t\t\tthis._clearActiveClass(getTargetLink(entry));\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tconst entryTop = this._getSectionTop(entry.target);\r\n\t\t\tconst isEntryBelow = entryTop >= this._previousScrollData.visibleEntryTop;\r\n\t\t\tconst shouldActivate =\r\n\t\t\t\t(userScrollsDown && isEntryBelow) || (!userScrollsDown && !isEntryBelow);\r\n\r\n\t\t\tif (shouldActivate) {\r\n\t\t\t\tthis._previousScrollData.visibleEntryTop = entryTop;\r\n\t\t\t\tthis._process(getTargetLink(entry));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Находит все ссылки и соответствующие им секции\r\n\t * @private\r\n\t */\r\n\t_initializeTargetsAndObservables() {\r\n\t\tthis._targetLinks.clear();\r\n\t\tthis._observableSections.clear();\r\n\r\n\t\tconst links = Selectors.findAll(SELECTOR_TARGET_LINKS, this._element);\r\n\t\tfor (const link of links) {\r\n\t\t\tif (isDisabled(link)) continue;\r\n\r\n\t\t\tconst id = this._getTargetIdFromTrigger(link);\r\n\t\t\tif (!id) continue;\r\n\r\n\t\t\tconst section = Selectors.findID(id);\r\n\t\t\tif (section) {\r\n\t\t\t\tthis._targetLinks.set(section.id, link);\r\n\t\t\t\tthis._observableSections.set(section.id, section);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Активирует элемент и запускает событие\r\n\t * @param {HTMLElement|null} target — элемент ссылки, который нужно активировать\r\n\t * @private\r\n\t */\r\n\t_process(target) {\r\n\t\tif (this._activeTarget === target) return;\r\n\r\n\t\t// Clear only within this spy navigation to avoid cross-interference between multiple instances.\r\n\t\tthis._clearActiveClass(this._element);\r\n\t\tthis._activeTarget = target;\r\n\r\n\t\tif (target) {\r\n\t\t\ttarget.classList.add(CLASS_NAME_ACTIVE);\r\n\t\t\tthis._activateParents(target);\r\n\t\t\tEventHandler.trigger(this._element, EVENT_ACTIVATE, { relatedTarget: target });\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Активирует родительские элементы (навигация, dropdown)\r\n\t * @param {HTMLElement} target — активная ссылка\r\n\t * @private\r\n\t */\r\n\t_activateParents(target) {\r\n\t\tif (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\r\n\t\t\tconst dropdownToggle = Selectors.find(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN));\r\n\t\t\tif (dropdownToggle) dropdownToggle.classList.add(CLASS_NAME_ACTIVE);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Активируем предыдущие элементы в nav/list-group\r\n\t\tfor (const parentGroup of Selectors.parents(target, SELECTOR_NAV_LIST_GROUP)) {\r\n\t\t\tfor (const sibling of Selectors.prev(parentGroup, SELECTOR_LINK_ITEMS)) {\r\n\t\t\t\tsibling.classList.add(CLASS_NAME_ACTIVE);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Убирает активный класс со всех элементов\r\n\t * @param {HTMLElement} parent — контейнер для очистки\r\n\t * @private\r\n\t */\r\n\t_clearActiveClass(parent) {\r\n\t\tif (!parent) return;\r\n\t\tparent.classList.remove(CLASS_NAME_ACTIVE);\r\n\r\n\t\tconst activeLinks = Selectors.findAll(\r\n\t\t\t`[href].${CLASS_NAME_ACTIVE}, [data-vg-target].${CLASS_NAME_ACTIVE}`,\r\n\t\t\tparent\r\n\t\t);\r\n\t\tfor (const link of activeLinks) {\r\n\t\t\tlink.classList.remove(CLASS_NAME_ACTIVE);\r\n\t\t}\r\n\t}\r\n\r\n\t_getTargetIdFromTrigger(trigger) {\r\n\t\tif (!trigger || typeof trigger.getAttribute !== 'function') return null;\r\n\r\n\t\tconst dataTarget = (trigger.getAttribute('data-vg-target') || '').trim();\r\n\t\tconst href = (trigger.getAttribute('href') || '').trim();\r\n\r\n\t\tconst selector = (dataTarget && dataTarget !== '#')\r\n\t\t\t? dataTarget\r\n\t\t\t: (\r\n\t\t\t\t(href && (href.includes('#') || href.startsWith('#')))\r\n\t\t\t\t\t? (href.includes('#') && !href.startsWith('#') ? `#${href.split('#')[1]}` : href)\r\n\t\t\t\t\t: null\r\n\t\t\t);\r\n\r\n\t\tif (!selector || selector === '#' || !selector.startsWith('#')) return null;\r\n\r\n\t\tconst decoded = this._safeDecode(selector);\r\n\t\treturn decoded && decoded.startsWith('#') && decoded.length > 1 ? decoded.slice(1) : null;\r\n\t}\r\n\r\n\t_safeDecode(value) {\r\n\t\ttry {\r\n\t\t\treturn decodeURIComponent(value);\r\n\t\t} catch {\r\n\t\t\ttry {\r\n\t\t\t\treturn decodeURI(value);\r\n\t\t\t} catch {\r\n\t\t\t\treturn value;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Инициализация через data-атрибуты при загрузке DOM\r\n */\r\n(() => {\r\n\tlet isInitialized = false;\r\n\r\n\tconst init = () => {\r\n\t\tif (isInitialized) return;\r\n\t\tisInitialized = true;\r\n\r\n\t\tfor (const spy of Selectors.findAll(SELECTOR_DATA_SPY)) {\r\n\t\t\tVGSpy.getOrCreateInstance(spy);\r\n\t\t}\r\n\t};\r\n\r\n\t// If this module is loaded after `load`, ensure initialization still happens.\r\n\tif (document.readyState === 'loading') {\r\n\t\tEventHandler.on(document, `DOMContentLoaded${EVENT_KEY}${DATA_API_KEY}`, init);\r\n\t} else {\r\n\t\tinit();\r\n\t}\r\n\r\n\tEventHandler.on(window, EVENT_LOAD_DATA_API, init);\r\n})();\r\n\r\nexport default VGSpy;\r\n","import VGSpy from \"./js/vgspy\";\r\n\r\nexport default VGSpy;","import BaseModule from \"../../base-module\";\r\nimport Selectors from \"../../../utils/js/dom/selectors\";\r\nimport EventHandler from \"../../../utils/js/dom/event\";\r\nimport {getNextActiveElement, isDisabled, mergeDeepObject} from \"../../../utils/js/functions\";\r\n\r\n/**\r\n * @constant {string} NAME - Имя модуля (используется для событий и идентификации)\r\n */\r\nconst NAME = 'tabs';\r\n/**\r\n * @constant {string} NAME_KEY - Полное пространство имён модуля (с префиксом)\r\n */\r\nconst NAME_KEY = 'vg.tabs';\r\n\r\n/**\r\n * @event VGTabs#hide - Срабатывает перед скрытием вкладки\r\n */\r\nconst EVENT_HIDE = `${NAME_KEY}.hide`;\r\n/**\r\n * @event VGTabs#hidden - Срабатывает после скрытия вкладки\r\n */\r\nconst EVENT_HIDDEN = `${NAME_KEY}.hidden`;\r\n/**\r\n * @event VGTabs#show - Срабатывает перед показом вкладки\r\n */\r\nconst EVENT_SHOW = `${NAME_KEY}.show`;\r\n/**\r\n * @event VGTabs#shown - Срабатывает после показа вкладки\r\n */\r\nconst EVENT_SHOWN = `${NAME_KEY}.shown`;\r\n/**\r\n * @event VGTabs#loaded - Срабатывает после загрузки контента (AJAX)\r\n */\r\nconst EVENT_LOADED = `${NAME_KEY}.loaded`;\r\n\r\n/**\r\n * @constant {string} EVENT_KEYDOWN - Событие клавиатуры для навигации по вкладкам\r\n */\r\nconst EVENT_KEYDOWN = `keydown.${NAME_KEY}`;\r\n/**\r\n * @constant {string} EVENT_LOAD_DATA_API - Событие загрузки страницы\r\n */\r\nconst EVENT_LOAD_DATA_API = `load.${NAME_KEY}`;\r\n/**\r\n * @constant {string} EVENT_CLICK_DATA_API - Событие клика для активации вкладки\r\n */\r\nconst EVENT_CLICK_DATA_API = `click.${NAME_KEY}`;\r\n/**\r\n * @constant {string} EVENT_MOUSEOVER_DATA_API - Событие наведения для слайдера\r\n */\r\nconst EVENT_MOUSEOVER_DATA_API = `mouseover.${NAME_KEY}`;\r\n/**\r\n * @constant {string} EVENT_MOUSEOUT_DATA_API - Событие ухода курсора для слайдера\r\n */\r\nconst EVENT_MOUSEOUT_DATA_API = `mouseout.${NAME_KEY}`;\r\n\r\n/**\r\n * @constant {string[]} NAV_KEYS - Клавиши для навигации между вкладками\r\n */\r\nconst NAV_KEYS = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End'];\r\nconst ARROW_LEFT_KEY = 'ArrowLeft';\r\nconst ARROW_RIGHT_KEY = 'ArrowRight';\r\nconst ARROW_UP_KEY = 'ArrowUp';\r\nconst ARROW_DOWN_KEY = 'ArrowDown';\r\nconst HOME_KEY = 'Home';\r\nconst END_KEY = 'End';\r\n\r\n/**\r\n * @constant {Object} CLASS_NAME - Классы, используемые в компоненте\r\n */\r\nconst CLASS_NAME = {\r\n\tACTIVE: 'active',\r\n\tHOVER: 'hover',\r\n\tFADE: 'fade',\r\n\tSHOW: 'show',\r\n\tDROPDOWN: 'dropdown',\r\n\tSLIDER: 'vg-tabs-slider',\r\n\tWITH_SLIDER: 'vg-tabs-with-slider'\r\n};\r\n\r\n/**\r\n * @constant {Object} SELECTOR - CSS-селекторы, используемые в компоненте\r\n */\r\nconst INNER_SELECTOR = `.vg-tabs-link:not([data-vg-toggle=\"dropdown\"]), .list-group-item:not([data-vg-toggle=\"dropdown\"]), [role=\"tab\"]:not([data-vg-toggle=\"dropdown\"])`;\r\nconst DATA_TOGGLE = '[data-vg-toggle=\"tab\"]';\r\n\r\nconst SELECTOR = {\r\n\tDROPDOWN_TOGGLE: '[data-vg-toggle=\"dropdown\"]',\r\n\tDROPDOWN_MENU: '.dropdown-content',\r\n\tTAB_CLASS: '.vg-tabs',\r\n\tTAB_PANEL: '.list-group, .vg-tabs-panel, [role=\"tablist\"]',\r\n\tOUTER: '.vg-tabs-item, .list-group-item',\r\n\tINNER: INNER_SELECTOR,\r\n\tDATA_TOGGLE: DATA_TOGGLE,\r\n\tINNER_ELEM: `${INNER_SELECTOR}, ${DATA_TOGGLE}`,\r\n\tDATA_TOGGLE_ACTIVE: `.active[data-vg-toggle=\"tab\"]`\r\n};\r\n\r\n/**\r\n * Компонент вкладок (Tabs)\r\n * Поддерживает: навигацию с клавиатуры, хеш-роутинг, AJAX-загрузку, анимацию, слайдер-индикатор.\r\n *\r\n * @extends BaseModule\r\n */\r\nclass VGTabs extends BaseModule {\r\n\t/**\r\n\t * Создаёт экземпляр VGTabs\r\n\t *\r\n\t * @param {HTMLElement} element - Элемент вкладки (например, ссылка)\r\n\t * @param {Object} params - Параметры инициализации\r\n\t * @param {boolean} [params.slide=false] - Показывать ли индикатор-слайдер\r\n\t * @param {boolean} [params.hash=false] - Активировать вкладку по хешу в URL\r\n\t * @param {Object} [params.ajax] - Настройки AJAX\r\n\t * @param {string} [params.ajax.route=''] - URL для загрузки\r\n\t * @param {string} [params.ajax.target=''] - Селектор цели загрузки\r\n\t * @param {string} [params.ajax.method='get'] - HTTP-метод\r\n\t * @param {boolean} [params.ajax.loader=false] - Показывать ли лоадер\r\n\t * @param {boolean} [params.ajax.once=true] - Загружать один раз\r\n\t * @param {boolean} [params.ajax.output=true] - Выводить ли ответ в DOM\r\n\t */\r\n\tconstructor(element, params) {\r\n\t\tsuper(element, params);\r\n\r\n\t\tthis._params = mergeDeepObject({\r\n\t\t\tslide: false,\r\n\t\t\thash: false,\r\n\t\t\tajax: {\r\n\t\t\t\troute: '',\r\n\t\t\t\ttarget: '',\r\n\t\t\t\tmethod: 'get',\r\n\t\t\t\tloader: false,\r\n\t\t\t\tonce: true,\r\n\t\t\t\toutput: true,\r\n\t\t\t},\r\n\t\t}, this._params);\r\n\r\n\t\tthis._parent = this._element.closest(SELECTOR.TAB_PANEL);\r\n\t\tthis._main_parent = this._parent?.closest(SELECTOR.TAB_CLASS) || null;\r\n\r\n\t\tif (!this._parent) {\r\n\t\t\tthrow new TypeError(`${element.outerHTML} не имеет родителя с селектором ${SELECTOR.INNER_ELEM}`);\r\n\t\t}\r\n\r\n\t\tthis._params = this._getParams(this._main_parent, this._params);\r\n\t\tthis._params = this._getParams(this._element, this._params);\r\n\r\n\t\tthis._setInitialAttributes(this._parent, this._getChildren());\r\n\t\tthis._setInitialSlider();\r\n\t\tthis._setTabHash();\r\n\r\n\t\tEventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event));\r\n\t}\r\n\r\n\t/**\r\n\t * Возвращает имя компонента\r\n\t * @returns {string}\r\n\t */\r\n\tstatic get NAME() {\r\n\t\treturn NAME;\r\n\t}\r\n\r\n\t/**\r\n\t * Возвращает ключ компонента (с префиксом)\r\n\t * @returns {string}\r\n\t */\r\n\tstatic get NAME_KEY() {\r\n\t\treturn NAME_KEY;\r\n\t}\r\n\r\n\t/**\r\n\t * Активирует вкладку\r\n\t */\r\n\tshow() {\r\n\t\tconst innerElem = this._element;\r\n\r\n\t\tif (this._elemIsActive(innerElem)) return;\r\n\r\n\t\tconst activeElem = this._getActiveElem();\r\n\t\tconst relatedTarget = innerElem;\r\n\r\n\t\t// События hide и show\r\n\t\tconst hideEvent = activeElem ? EventHandler.trigger(activeElem, EVENT_HIDE, {relatedTarget}) : null;\r\n\t\tconst showEvent = EventHandler.trigger(innerElem, EVENT_SHOW, {relatedTarget});\r\n\r\n\t\tif (showEvent.defaultPrevented || (hideEvent && hideEvent.defaultPrevented)) return;\r\n\r\n\t\tthis._deactivate(activeElem, innerElem);\r\n\t\tthis._activate(innerElem, relatedTarget);\r\n\t}\r\n\r\n\t/**\r\n\t * Проверяет, активен ли элемент\r\n\t * @param {HTMLElement} elem - Элемент для проверки\r\n\t * @returns {boolean}\r\n\t */\r\n\t_elemIsActive(elem) {\r\n\t\treturn elem?.classList.contains(CLASS_NAME.ACTIVE) || false;\r\n\t}\r\n\r\n\t/**\r\n\t * Получает активный элемент во вкладках\r\n\t * @returns {HTMLElement|null}\r\n\t */\r\n\t_getActiveElem() {\r\n\t\treturn this._getChildren().find(child => this._elemIsActive(child)) || null;\r\n\t}\r\n\r\n\t/**\r\n\t * Активирует элемент и его целевой панель\r\n\t * @param {HTMLElement} element - Активируемый элемент\r\n\t * @param {HTMLElement} relatedTarget - Элемент, вызвавший активацию\r\n\t */\r\n\t_activate(element, relatedTarget) {\r\n\t\tif (!element) return;\r\n\r\n\t\telement.classList.add(CLASS_NAME.ACTIVE);\r\n\r\n\t\tconst target = Selectors.getElementFromSelector(element);\r\n\t\tif (target) this._activate(target, relatedTarget);\r\n\r\n\t\tconst complete = () => {\r\n\t\t\tif (element.getAttribute('role') !== 'tab') {\r\n\t\t\t\telement.classList.add(CLASS_NAME.SHOW);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tthis._route((status, data) => {\r\n\t\t\t\tEventHandler.trigger(this._element, EVENT_LOADED, { stats: status, data });\r\n\t\t\t});\r\n\r\n\t\t\telement.removeAttribute('tabindex');\r\n\t\t\telement.setAttribute('aria-selected', 'true');\r\n\t\t\tthis._toggleDropDown(element, true);\r\n\r\n\t\t\tEventHandler.trigger(element, EVENT_SHOWN, { relatedTarget }); // ← теперь relatedTarget определён\r\n\t\t};\r\n\r\n\t\tthis._queueCallback(complete, element, element.classList.contains(CLASS_NAME.FADE));\r\n\t}\r\n\r\n\t/**\r\n\t * Деактивирует элемент\r\n\t * @param {HTMLElement} element - Деактивируемый элемент\r\n\t * @param {HTMLElement} relatedTarget - Новый активный элемент\r\n\t */\r\n\t_deactivate(element, relatedTarget) {\r\n\t\tif (!element) return;\r\n\r\n\t\telement.classList.remove(CLASS_NAME.ACTIVE);\r\n\t\telement.blur();\r\n\r\n\t\tconst target = Selectors.getElementFromSelector(element);\r\n\t\tif (target) this._deactivate(target, relatedTarget);\r\n\r\n\t\tconst complete = () => {\r\n\t\t\tif (element.getAttribute('role') !== 'tab') {\r\n\t\t\t\telement.classList.remove(CLASS_NAME.SHOW);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\telement.setAttribute('aria-selected', 'false');\r\n\t\t\telement.setAttribute('tabindex', '-1');\r\n\t\t\tthis._toggleDropDown(element, false);\r\n\r\n\t\t\tEventHandler.trigger(element, EVENT_HIDDEN, { relatedTarget });\r\n\t\t};\r\n\r\n\t\tthis._queueCallback(complete, element, element.classList.contains(CLASS_NAME.FADE));\r\n\t}\r\n\r\n\t/**\r\n\t * Обработка навигации с клавиатуры\r\n\t * @param {KeyboardEvent} event\r\n\t */\r\n\t_keydown(event) {\r\n\t\tif (!NAV_KEYS.includes(event.key)) return;\r\n\r\n\t\tevent.stopPropagation();\r\n\t\tevent.preventDefault();\r\n\r\n\t\tconst children = this._getChildren().filter(el => !isDisabled(el));\r\n\t\tlet nextActiveElement;\r\n\r\n\t\tif ([HOME_KEY, END_KEY].includes(event.key)) {\r\n\t\t\tnextActiveElement = children[event.key === HOME_KEY ? 0 : children.length - 1];\r\n\t\t} else {\r\n\t\t\tconst isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key);\r\n\t\t\tnextActiveElement = getNextActiveElement(children, event.target, isNext, true);\r\n\t\t}\r\n\r\n\t\tif (nextActiveElement) {\r\n\t\t\tnextActiveElement.focus({preventScroll: true});\r\n\t\t\tVGTabs.getOrCreateInstance(nextActiveElement).show();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Активация вкладки по хешу в URL\r\n\t */\r\n\t_setTabHash() {\r\n\t\tif (!this._params.hash) return;\r\n\r\n\t\tconst url = document.location.toString();\r\n\t\tif (!url.includes('#')) return;\r\n\r\n\t\tconst id = url.split('#')[1];\r\n\t\tconst element = Selectors.find(`[href=\"#${id}\"]`, this._parent) ||\r\n\t\t\tSelectors.find(`[data-vg-target=\"#${id}\"]`, this._element) ||\r\n\t\t\tnull;\r\n\r\n\t\tif (element) {\r\n\t\t\tVGTabs.getOrCreateInstance(element).show();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Инициализация слайдера-индикатора под вкладками\r\n\t */\r\n\t_setInitialSlider() {\r\n\t\tif (!this._params.slide) return;\r\n\r\n\t\tlet slider = Selectors.find(`.${CLASS_NAME.SLIDER}`, this._main_parent);\r\n\t\tif (!slider) {\r\n\t\t\tslider = document.createElement('span');\r\n\t\t\tslider.classList.add(CLASS_NAME.SLIDER);\r\n\t\t\tthis._main_parent.prepend(slider);\r\n\t\t}\r\n\r\n\t\tthis._main_parent.classList.add(CLASS_NAME.WITH_SLIDER);\r\n\r\n\t\tconst activeLink = Selectors.find(`.${CLASS_NAME.ACTIVE}`, this._parent);\r\n\t\tif (!activeLink) return;\r\n\r\n\t\tconst {width, height} = window.getComputedStyle(activeLink);\r\n\t\tactiveLink.classList.add(CLASS_NAME.HOVER);\r\n\r\n\t\tslider.style.width = width;\r\n\t\tslider.style.height = height;\r\n\t\tslider.style.left = `${activeLink.offsetLeft}px`;\r\n\r\n\t\t// Наведение\r\n\t\tEventHandler.on(this._main_parent, EVENT_MOUSEOVER_DATA_API, SELECTOR.DATA_TOGGLE, (event) => {\r\n\t\t\tconst target = event.target;\r\n\t\t\tif (['A', 'AREA'].includes(target.tagName)) event.preventDefault();\r\n\t\t\tif (isDisabled(target)) return;\r\n\r\n\t\t\tconst hover = Selectors.find(`.${CLASS_NAME.HOVER}`, this._parent);\r\n\t\t\tif (hover) hover.classList.remove(CLASS_NAME.HOVER);\r\n\t\t\ttarget.classList.add(CLASS_NAME.HOVER);\r\n\r\n\t\t\tconst {width, height} = window.getComputedStyle(target);\r\n\t\t\tslider.style.width = width;\r\n\t\t\tslider.style.height = height;\r\n\t\t\tslider.style.left = `${target.offsetLeft}px`;\r\n\t\t});\r\n\r\n\t\t// Уход курсора\r\n\t\tEventHandler.on(this._main_parent, EVENT_MOUSEOUT_DATA_API, SELECTOR.DATA_TOGGLE, () => {\r\n\t\t\tconst active = Selectors.find(`.${CLASS_NAME.ACTIVE}`, this._parent);\r\n\t\t\tconst {width, height} = window.getComputedStyle(active);\r\n\r\n\t\t\tSelectors.findAll(`.${CLASS_NAME.HOVER}`, this._parent).forEach(el => el.classList.remove(CLASS_NAME.HOVER));\r\n\t\t\tactive.classList.add(CLASS_NAME.HOVER);\r\n\r\n\t\t\tslider.style.width = width;\r\n\t\t\tslider.style.height = height;\r\n\t\t\tslider.style.left = `${active.offsetLeft}px`;\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Устанавливает базовые ARIA-атрибуты родителю\r\n\t * @param {HTMLElement} parent - Родительский элемент (tablist)\r\n\t * @param {HTMLElement[]} children - Дочерние элементы (вкладки)\r\n\t */\r\n\t_setInitialAttributes(parent, children) {\r\n\t\tthis._setAttributeIfNotExists(parent, 'role', 'tablist');\r\n\t\tchildren.forEach(child => this._setInitialAttributesOnChild(child));\r\n\t}\r\n\r\n\t/**\r\n\t * Устанавливает атрибуты для одной вкладки\r\n\t * @param {HTMLElement} child - Элемент вкладки\r\n\t */\r\n\t_setInitialAttributesOnChild(child) {\r\n\t\tchild = this._getInnerElement(child);\r\n\t\tconst isActive = this._elemIsActive(child);\r\n\t\tconst outerElem = this._getOuterElement(child);\r\n\r\n\t\tchild.setAttribute('aria-selected', isActive);\r\n\t\tif (outerElem !== child) {\r\n\t\t\tthis._setAttributeIfNotExists(outerElem, 'role', 'presentation');\r\n\t\t}\r\n\t\tif (!isActive) {\r\n\t\t\tchild.setAttribute('tabindex', '-1');\r\n\t\t}\r\n\t\tthis._setAttributeIfNotExists(child, 'role', 'tab');\r\n\t\tthis._setInitialAttributesOnTargetPanel(child);\r\n\t}\r\n\r\n\t/**\r\n\t * Устанавливает атрибуты целевой панели (tabpanel)\r\n\t * @param {HTMLElement} child - Элемент вкладки\r\n\t */\r\n\t_setInitialAttributesOnTargetPanel(child) {\r\n\t\tconst target = Selectors.getElementFromSelector(child);\r\n\t\tif (!target) return;\r\n\r\n\t\tthis._setAttributeIfNotExists(target, 'role', 'tabpanel');\r\n\t\tif (child.id) {\r\n\t\t\tthis._setAttributeIfNotExists(target, 'aria-labelledby', child.id);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Устанавливает атрибут, если его ещё нет\r\n\t * @param {HTMLElement} element - Целевой элемент\r\n\t * @param {string} attribute - Имя атрибута\r\n\t * @param {string} value - Значение атрибута\r\n\t */\r\n\t_setAttributeIfNotExists(element, attribute, value) {\r\n\t\tif (!element.hasAttribute(attribute)) {\r\n\t\t\telement.setAttribute(attribute, value);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Получает все дочерние элементы-вкладки\r\n\t * @returns {HTMLElement[]}\r\n\t */\r\n\t_getChildren() {\r\n\t\treturn Selectors.findAll(SELECTOR.INNER_ELEM, this._parent);\r\n\t}\r\n\r\n\t/**\r\n\t * Получает внутренний элемент вкладки (ссылку)\r\n\t * @param {HTMLElement} elem - Элемент\r\n\t * @returns {HTMLElement}\r\n\t */\r\n\t_getInnerElement(elem) {\r\n\t\treturn elem.matches(SELECTOR.INNER_ELEM) ? elem : Selectors.find(SELECTOR.INNER_ELEM, elem);\r\n\t}\r\n\r\n\t/**\r\n\t * Получает внешний контейнер вкладки\r\n\t * @param {HTMLElement} elem - Элемент\r\n\t * @returns {HTMLElement}\r\n\t */\r\n\t_getOuterElement(elem) {\r\n\t\treturn elem.closest(SELECTOR.OUTER) || elem;\r\n\t}\r\n\r\n\t/**\r\n\t * Управляет состоянием выпадающего меню\r\n\t * @param {HTMLElement} element - Элемент вкладки\r\n\t * @param {boolean} open - Открыть или закрыть\r\n\t */\r\n\t_toggleDropDown(element, open) {\r\n\t\tconst outerElem = this._getOuterElement(element);\r\n\t\tif (!outerElem.classList.contains(CLASS_NAME.DROPDOWN)) return;\r\n\r\n\t\tconst toggle = (selector, className) => {\r\n\t\t\tconst el = Selectors.find(selector, outerElem);\r\n\t\t\tif (el) el.classList.toggle(className, open);\r\n\t\t};\r\n\r\n\t\ttoggle(SELECTOR.DROPDOWN_TOGGLE, CLASS_NAME.ACTIVE);\r\n\t\ttoggle(SELECTOR.DROPDOWN_MENU, CLASS_NAME.SHOW);\r\n\t\touterElem.setAttribute('aria-expanded', open);\r\n\t}\r\n}\r\n\r\n/**\r\n * Обработка кликов по вкладкам\r\n */\r\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR.DATA_TOGGLE, function (event) {\r\n\tif (['A', 'AREA'].includes(this.tagName)) {\r\n\t\tevent.preventDefault();\r\n\t}\r\n\tif (isDisabled(this)) return;\r\n\tVGTabs.getOrCreateInstance(this).show();\r\n});\r\n\r\n/**\r\n * Инициализация активных вкладок при загрузке страницы\r\n */\r\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\r\n\tSelectors.findAll(SELECTOR.DATA_TOGGLE_ACTIVE).forEach(element => {\r\n\t\tVGTabs.getOrCreateInstance(element);\r\n\t});\r\n});\r\n\r\nexport default VGTabs;","import VGTabs from \"./js/vgtabs\";\r\n\r\nexport default VGTabs;","import BaseModule from \"../../base-module\";\r\nimport {isDisabled, makeRandomString, mergeDeepObject} from \"../../../utils/js/functions\";\r\nimport EventHandler from \"../../../utils/js/dom/event\";\r\nimport Selectors from \"../../../utils/js/dom/selectors\";\r\nimport Placement from \"../../../utils/js/components/placement\";\r\n\r\nconst NAME = 'tooltip';\r\nconst NAME_KEY = 'vg.tooltip';\r\n\r\nconst SELECTOR_DATA_TOGGLE = '[data-vg-toggle=\"tooltip\"]';\nconst SELECTOR_DATA_TOGGLE_POPOVER = '[data-vg-toggle=\"popover\"]';\n\nconst CLASS_NAME_OPEN = 'vg-tooltip-open';\nconst CLASS_NAME_SHOW = 'show';\nconst CLASS_NAME_SHOWN = 'shown';\n\nconst SELECTOR_OPEN_TRIGGER = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}, ${SELECTOR_DATA_TOGGLE_POPOVER}.${CLASS_NAME_SHOW}`;\n\r\nconst EVENT_KEY_HIDE = `${NAME_KEY}.hide`;\r\nconst EVENT_KEY_HIDDEN = `${NAME_KEY}.hidden`;\r\nconst EVENT_KEY_SHOW = `${NAME_KEY}.show`;\r\nconst EVENT_KEY_SHOWN = `${NAME_KEY}.shown`;\r\n\r\nconst EVENT_KEY_CLICK_DATA_API = `click.${NAME_KEY}.data.api`;\r\nconst EVENT_KEY_MOUSEENTER = `mouseenter.${NAME_KEY}`;\r\nconst EVENT_KEY_MOUSELEAVE = `mouseleave.${NAME_KEY}`;\r\nconst EVENT_KEY_CLICK_DISMISS = `click.dismiss.${NAME_KEY}`;\nconst EVENT_KEY_KEYDOWN = `keydown.dismiss.${NAME_KEY}`;\n\nconst PLACEMENT_CLASSES = [\n\t'top',\n\t'top-start',\n\t'top-end',\n\t'bottom',\n\t'bottom-start',\n\t'bottom-end',\n\t'left',\n\t'left-start',\n\t'left-end',\n\t'right',\n\t'right-start',\n\t'right-end'\n];\n\r\nconst defaultParams = {\r\n\ttitle: '',\r\n\tcontent: '',\r\n\ttrigger: 'hover',\r\n\tplacement: 'top',\r\n\tcontainer: 'body',\r\n\tpopover: false,\r\n\thtml: false,\r\n\toffset: [8, 8],\r\n\tautoFlip: true,\r\n\toverflowProtection: true,\r\n\tfallbackPlacements: ['bottom', 'right', 'left'],\r\n\tcloseOnOutsideClick: true,\r\n\tkeyboard: true,\r\n\tcloseOther: true,\r\n\tdelay: {\r\n\t\tshow: 100,\r\n\t\thide: 100\r\n\t},\r\n\tarrow: {\r\n\t\tpadding: 8\r\n\t},\r\n\tcustom: {\r\n\t\tclass: ''\r\n\t},\r\n\tanimation: {\r\n\t\tenable: true,\r\n\t\tin: 'animate__backInUp',\r\n\t\tout: 'animate__backOutDown',\r\n\t\tdelay: 300,\r\n\t\teffect: 'none',\r\n\t}\r\n};\r\n\r\nclass VGTooltip extends BaseModule {\r\n\tconstructor(element, params = {}) {\r\n\t\tsuper(element, params);\r\n\r\n\t\tthis._params = this._getParams(element, mergeDeepObject(defaultParams, params));\r\n\t\tthis._tooltip = null;\r\n\t\tthis._isHiding = false;\r\n\t\tthis._showTimeout = null;\r\n\t\tthis._hideTimeout = null;\r\n\r\n\t\tthis._fixTitle();\n\r\n\t\tthis._handleUpdate = () => {\n\t\t\tif (this._isShown()) {\n\t\t\t\tthis._setPlacement();\n\t\t\t}\n\t\t};\n\t}\n\r\n\tstatic get NAME() {\r\n\t\treturn NAME;\r\n\t}\r\n\r\n\tstatic get NAME_KEY() {\r\n\t\treturn NAME_KEY;\r\n\t}\r\n\r\n\ttoggle(relatedTarget) {\r\n\t\treturn this._isShown() ? this.hide() : this.show(relatedTarget);\r\n\t}\r\n\r\n\tshow(relatedTarget) {\r\n\t\tif (isDisabled(this._element) || this._isShown()) return;\r\n\r\n\t\tthis._clearTimeouts();\r\n\r\n\t\tthis._showTimeout = setTimeout(() => {\r\n\t\t\tthis._showTimeout = null;\r\n\r\n\t\t\tconst showEvent = EventHandler.trigger(this._element, EVENT_KEY_SHOW, { relatedTarget });\r\n\t\t\tif (showEvent.defaultPrevented) return;\r\n\r\n\t\t\tif (this._params.closeOther) {\r\n\t\t\t\tthis._hideOpenedTooltips();\r\n\t\t\t}\r\n\r\n\t\t\tthis._isHiding = false;\r\n\t\t\tthis._createTooltip();\r\n\r\n\t\t\tif (!this._tooltip) return;\r\n\r\n\t\t\tthis._tooltip.classList.remove(CLASS_NAME_SHOWN);\r\n\t\t\tthis._tooltip.classList.add(CLASS_NAME_SHOW);\r\n\t\t\tthis._element.classList.add(CLASS_NAME_SHOW);\r\n\t\t\tdocument.body.classList.add(CLASS_NAME_OPEN);\r\n\r\n\t\t\tthis._addWindowListeners();\r\n\r\n\t\t\trequestAnimationFrame(() => {\r\n\t\t\t\tif (!this._tooltip) return;\r\n\r\n\t\t\t\tthis._setPlacement();\r\n\r\n\t\t\t\tthis._queueCallback(() => {\r\n\t\t\t\t\tif (!this._tooltip || this._isHiding) return;\r\n\r\n\t\t\t\t\tthis._tooltip.classList.add(CLASS_NAME_SHOWN);\r\n\t\t\t\t\tEventHandler.trigger(this._element, EVENT_KEY_SHOWN, { relatedTarget });\r\n\t\t\t\t}, this._tooltip, true, this._params.animation.delay);\r\n\t\t\t});\r\n\t\t}, this._params.delay.show);\r\n\t}\r\n\r\n\thide() {\r\n\t\tif (!this._isShown() || this._isHiding || !this._tooltip) return;\r\n\r\n\t\tthis._clearTimeouts();\r\n\r\n\t\tthis._hideTimeout = setTimeout(() => {\r\n\t\t\tthis._hideTimeout = null;\r\n\r\n\t\t\tconst hideEvent = EventHandler.trigger(this._element, EVENT_KEY_HIDE);\r\n\t\t\tif (hideEvent.defaultPrevented) return;\r\n\r\n\t\t\tthis._removeWindowListeners();\r\n\r\n\t\t\tthis._isHiding = true;\r\n\t\t\tthis._tooltip.classList.remove(CLASS_NAME_SHOWN);\r\n\r\n\t\t\tthis._queueCallback(() => {\r\n\t\t\t\tif (!this._tooltip) return;\r\n\r\n\t\t\t\tthis._tooltip.classList.remove(CLASS_NAME_SHOW);\r\n\t\t\t\tthis._element.classList.remove(CLASS_NAME_SHOW);\r\n\t\t\t\tthis._element.removeAttribute('aria-describedby');\r\n\r\n\t\t\t\tthis._tooltip.remove();\r\n\t\t\t\tthis._tooltip = null;\r\n\t\t\t\tthis._isHiding = false;\r\n\r\n\t\t\t\tif (!Selectors.find('.vg-tooltip.show')) {\r\n\t\t\t\t\tdocument.body.classList.remove(CLASS_NAME_OPEN);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tEventHandler.trigger(this._element, EVENT_KEY_HIDDEN);\r\n\t\t\t}, this._tooltip, false, this._params.animation.delay);\r\n\t\t}, this._params.delay.hide);\r\n\t}\r\n\r\n\tdispose() {\r\n\t\tthis._clearTimeouts();\r\n\t\tthis._removeWindowListeners();\r\n\r\n\t\tif (this._tooltip) {\r\n\t\t\tthis._tooltip.remove();\r\n\t\t\tthis._tooltip = null;\r\n\t\t}\r\n\r\n\t\tconst originalTitle = this._element.dataset.vgOriginalTitle;\r\n\t\tif (originalTitle) {\r\n\t\t\tthis._element.setAttribute('title', originalTitle);\r\n\t\t}\r\n\r\n\t\tsuper.dispose();\r\n\t}\r\n\r\n\t_isShown() {\r\n\t\treturn !!this._element && this._element.classList.contains(CLASS_NAME_SHOW);\r\n\t}\r\n\r\n\t_createTooltip() {\r\n\t\tif (this._tooltip) return;\r\n\r\n\t\tconst title = this._getTitle();\r\n\t\tif (!title) return;\r\n\r\n\t\tconst id = `vg-tooltip-${makeRandomString()}`;\r\n\t\tconst tooltip = document.createElement('div');\r\n\r\n\t\ttooltip.id = id;\r\n\t\ttooltip.className = `vg-tooltip ${this._params.placement} ${this._params.custom.class || ''}`;\r\n\t\ttooltip.setAttribute('role', this._params.popover ? 'dialog' : 'tooltip');\r\n\r\n\t\tif (this._params.popover) {\r\n\t\t\ttooltip.classList.add('vg-tooltip-popover');\r\n\t\t}\r\n\r\n\t\tconst inner = document.createElement('div');\r\n\t\tinner.classList.add('vg-tooltip-inner');\r\n\r\n\t\tif (this._params.content) {\r\n\t\t\tconst titleBlock = document.createElement('div');\r\n\t\t\ttitleBlock.classList.add('vg-tooltip-inner--title');\r\n\r\n\t\t\tconst contentBlock = document.createElement('div');\r\n\t\t\tcontentBlock.classList.add('vg-tooltip-inner--content');\r\n\r\n\t\t\tif (this._params.html) {\r\n\t\t\t\ttitleBlock.innerHTML = title;\r\n\t\t\t\tcontentBlock.innerHTML = this._params.content;\r\n\t\t\t} else {\r\n\t\t\t\ttitleBlock.textContent = title;\r\n\t\t\t\tcontentBlock.textContent = this._params.content;\r\n\t\t\t}\r\n\r\n\t\t\tinner.append(titleBlock);\r\n\t\t\tinner.append(contentBlock);\r\n\t\t} else {\r\n\t\t\tif (this._params.html) {\r\n\t\t\t\tinner.innerHTML = title;\r\n\t\t\t} else {\r\n\t\t\t\tinner.textContent = title;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst arrow = document.createElement('div');\r\n\t\tarrow.classList.add('vg-tooltip-arrow');\r\n\r\n\t\tinner.append(arrow);\r\n\t\ttooltip.append(inner);\r\n\r\n\t\tconst container = this._params.container === 'body'\r\n\t\t\t? document.body\r\n\t\t\t: Selectors.find(this._params.container);\r\n\r\n\t\tif (!container) return;\r\n\r\n\t\tcontainer.append(tooltip);\r\n\r\n\t\tthis._element.setAttribute('aria-describedby', id);\r\n\t\tthis._tooltip = tooltip;\r\n\r\n\t\tthis._animation(this._tooltip, VGTooltip.NAME_KEY, this._params.animation);\r\n\t}\r\n\r\n\t_getTitle() {\r\n\t\treturn (\r\n\t\t\tthis._params.title ||\r\n\t\t\tthis._element.dataset.vgTitle ||\r\n\t\t\tthis._element.dataset.vgOriginalTitle ||\r\n\t\t\t''\r\n\t\t);\r\n\t}\r\n\r\n\t_fixTitle() {\r\n\t\tconst title = this._element.getAttribute('title');\r\n\r\n\t\tif (!title) return;\r\n\r\n\t\tthis._element.setAttribute('data-vg-original-title', title);\r\n\t\tthis._element.removeAttribute('title');\r\n\t}\r\n\r\n\t_setPlacement() {\r\n\t\tif (!this._tooltip) return;\r\n\r\n\t\tconst placement = new Placement({\r\n\t\t\treference: this._element,\r\n\t\t\tdrop: this._tooltip,\r\n\t\t\tplacement: this._params.placement,\r\n\t\t\toffset: this._params.offset,\r\n\t\t\tautoFlip: this._params.autoFlip,\r\n\t\t\toverflowProtection: this._params.overflowProtection,\r\n\t\t\tfallbackPlacements: this._params.fallbackPlacements,\r\n\t\t\tclamp: true,\r\n\t\t\tisMerge: false\r\n\t\t});\r\n\r\n\t\tplacement._setPlacement();\r\n\r\n\t\tthis._syncPlacementClass();\r\n\t\tthis._setArrowPlacement();\r\n\t}\r\n\r\n\t_setArrowPlacement() {\r\n\t\tif (!this._tooltip) return;\r\n\r\n\t\tconst inner = this._tooltip.querySelector('.vg-tooltip-inner');\r\n\t\tconst arrow = this._tooltip.querySelector('.vg-tooltip-arrow');\r\n\r\n\t\tif (!inner || !arrow) return;\r\n\r\n\t\tconst placement = this._tooltip.getAttribute('data-vg-placement') || this._params.placement;\r\n\r\n\t\tconst triggerRect = this._element.getBoundingClientRect();\r\n\t\tconst innerRect = inner.getBoundingClientRect();\r\n\r\n\t\tconst triggerCenterX = triggerRect.left + triggerRect.width / 2;\r\n\t\tconst triggerCenterY = triggerRect.top + triggerRect.height / 2;\r\n\r\n\t\tconst arrowPadding = this._params.arrow.padding;\r\n\r\n\t\tarrow.style.left = '';\r\n\t\tarrow.style.right = '';\r\n\t\tarrow.style.top = '';\r\n\t\tarrow.style.bottom = '';\r\n\r\n\t\tif (placement.startsWith('top') || placement.startsWith('bottom')) {\r\n\t\t\tlet arrowLeft = triggerCenterX - innerRect.left;\r\n\r\n\t\t\tarrowLeft = Math.max(\r\n\t\t\t\tarrowPadding,\r\n\t\t\t\tMath.min(arrowLeft, innerRect.width - arrowPadding)\r\n\t\t\t);\r\n\r\n\t\t\tarrow.style.left = `${arrowLeft}px`;\r\n\t\t\tarrow.style.transform = 'translateX(-50%) rotate(45deg)';\r\n\r\n\t\t\tif (placement.startsWith('top')) {\r\n\t\t\t\tarrow.style.bottom = '-4px';\r\n\t\t\t} else {\r\n\t\t\t\tarrow.style.top = '-4px';\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (placement.startsWith('left') || placement.startsWith('right')) {\r\n\t\t\tlet arrowTop = triggerCenterY - innerRect.top;\r\n\r\n\t\t\tarrowTop = Math.max(\r\n\t\t\t\tarrowPadding,\r\n\t\t\t\tMath.min(arrowTop, innerRect.height - arrowPadding)\r\n\t\t\t);\r\n\r\n\t\t\tarrow.style.top = `${arrowTop}px`;\r\n\t\t\tarrow.style.transform = 'translateY(-50%) rotate(45deg)';\r\n\r\n\t\t\tif (placement.startsWith('left')) {\r\n\t\t\t\tarrow.style.right = '-4px';\r\n\t\t\t} else {\r\n\t\t\t\tarrow.style.left = '-4px';\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t_syncPlacementClass() {\n\t\tif (!this._tooltip) return;\n\n\t\tconst placement = this._tooltip.getAttribute('data-vg-placement');\n\n\t\tthis._tooltip.classList.remove(...PLACEMENT_CLASSES);\n\n\t\tif (placement) {\n\t\t\tthis._tooltip.classList.add(placement);\n\t\t}\n\t}\n\r\n\t_hideOpenedTooltips() {\r\n\t\tSelectors.findAll('.vg-tooltip.show').forEach(tooltip => {\r\n\t\t\tconst id = tooltip.id;\r\n\t\t\tconst trigger = Selectors.find(`[aria-describedby=\"${id}\"]`);\r\n\r\n\t\t\tif (!trigger || trigger === this._element) return;\r\n\r\n\t\t\tconst instance = VGTooltip.getInstance(trigger);\r\n\t\t\tinstance?.hide();\r\n\t\t});\r\n\t}\r\n\r\n\t_addWindowListeners() {\r\n\t\twindow.addEventListener('resize', this._handleUpdate);\r\n\t\twindow.addEventListener('scroll', this._handleUpdate, true);\r\n\t}\r\n\r\n\t_removeWindowListeners() {\r\n\t\twindow.removeEventListener('resize', this._handleUpdate);\r\n\t\twindow.removeEventListener('scroll', this._handleUpdate, true);\r\n\t}\r\n\r\n\t_clearTimeouts() {\n\t\tif (this._showTimeout) {\n\t\t\tclearTimeout(this._showTimeout);\n\t\t\tthis._showTimeout = null;\n\t\t}\r\n\r\n\t\tif (this._hideTimeout) {\r\n\t\t\tclearTimeout(this._hideTimeout);\n\t\t\tthis._hideTimeout = null;\n\t\t}\n\t}\n}\n\nconst getShownInstances = () => {\n\treturn Selectors.findAll(SELECTOR_OPEN_TRIGGER)\n\t\t.map(element => VGTooltip.getInstance(element))\n\t\t.filter(Boolean);\n};\n\nEventHandler.on(document, EVENT_KEY_KEYDOWN, event => {\n\tif (event.key !== 'Escape') return;\n\n\tgetShownInstances().forEach(instance => {\n\t\tif (!instance._params.keyboard || !instance._isShown()) return;\n\n\t\tinstance.hide();\n\t});\n});\n\nEventHandler.on(document, EVENT_KEY_CLICK_DISMISS, event => {\n\tgetShownInstances().forEach(instance => {\n\t\tif (!instance._params.closeOnOutsideClick) return;\n\t\tif (!instance._params.trigger.includes('click') && !instance._params.popover) return;\n\t\tif (!instance._isShown()) return;\n\n\t\tif (\n\t\t\tinstance._tooltip?.contains(event.target) ||\n\t\t\tinstance._element.contains(event.target)\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tinstance.hide();\n\t});\n});\n\nEventHandler.on(document, EVENT_KEY_MOUSEENTER, SELECTOR_DATA_TOGGLE, function () {\n\tconst instance = VGTooltip.getOrCreateInstance(this);\n\r\n\tif (instance._params.trigger.includes('hover')) {\r\n\t\tinstance.show(this);\r\n\t}\r\n});\r\n\r\nEventHandler.on(document, EVENT_KEY_MOUSELEAVE, SELECTOR_DATA_TOGGLE, function () {\r\n\tconst instance = VGTooltip.getOrCreateInstance(this);\r\n\r\n\tif (instance._params.trigger.includes('hover')) {\r\n\t\tinstance.hide();\r\n\t}\r\n});\r\n\r\nEventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\r\n\tconst instance = VGTooltip.getOrCreateInstance(this);\r\n\r\n\tif (instance._params.popover) {\r\n\t\tinstance._params.trigger = 'click';\r\n\t}\r\n\r\n\tif (instance._params.trigger.includes('click')) {\r\n\t\tevent.preventDefault();\r\n\t\tinstance.toggle(this);\r\n\t}\r\n});\r\n\r\nEventHandler.on(document, EVENT_KEY_CLICK_DATA_API, SELECTOR_DATA_TOGGLE_POPOVER, function (event) {\r\n\tevent.preventDefault();\r\n\r\n\tconst instance = VGTooltip.getOrCreateInstance(this);\r\n\r\n\tinstance._params.popover = true;\r\n\tinstance._params.trigger = 'click';\r\n\r\n\tinstance.toggle(this);\r\n});\r\n\r\nexport default VGTooltip;\n","import VGTooltip from \"./js/vgtooltip\";\r\n\r\nexport default VGTooltip;","import VGAlert from './modules/vgalert';\nimport VGCollapse from './modules/vgcollapse';\nimport VGDropdown from './modules/vgdropdown';\nimport { VGDynamicTable } from './modules/vgdynamictable';\nimport VGFiles from './modules/vgfiles';\nimport VGFilePreview from './modules/vgfilepreview';\nimport VGFormSender from './modules/vgformsender';\nimport VGLawCookie from './modules/vglawcookie';\nimport VGLoadMore from './modules/vgloadmore';\nimport VGModal from './modules/vgmodal';\nimport VGNav from './modules/vgnav';\nimport VGNestable from './modules/vgnestable';\nimport VGRangeSlider from './modules/vgrangeslider';\nimport VGRollup from './modules/vgrollup';\nimport VGSelect from './modules/vgselect';\nimport VGSidebar from './modules/vgsidebar';\nimport VGSpy from './modules/vgspy';\nimport VGTabs from './modules/vgtabs';\nimport VGToast from './modules/vgtoast';\nimport VGTooltip from './modules/vgtooltip';\n\nclass VGApp {\n\tconstructor(options = {}) {\n\t\tthis._modules = new Map();\n\t\tthis._initializer = typeof options.initializer === 'function'\n\t\t\t? options.initializer\n\t\t\t: null;\n\t\tthis._isInitialized = false;\n\t}\n\n\tregister(...entries) {\n\t\tconst modules = entries.flatMap((entry) => {\n\t\t\tif (Array.isArray(entry)) {\n\t\t\t\treturn entry;\n\t\t\t}\n\n\t\t\treturn entry ? [entry] : [];\n\t\t});\n\n\t\tfor (const Module of modules) {\n\t\t\tconst candidate = Module?.default ?? Module;\n\t\t\tconst name = String(candidate?.NAME || '').trim();\n\n\t\t\tif (!name) {\n\t\t\t\tconst moduleKeys = Module && typeof Module === 'object'\n\t\t\t\t\t? Object.keys(Module).join(', ')\n\t\t\t\t\t: '';\n\t\t\t\tthrow new Error(`VGApp.register() ожидает модуль со статическим NAME. Получено: ${moduleKeys || typeof Module}`);\n\t\t\t}\n\n\t\t\tthis._modules.set(name, candidate);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tboot(config = {}) {\n\t\tthis._ensureInitialized();\n\n\t\tfor (const [name, Module] of this._modules) {\n\t\t\tif (typeof Module?.boot !== 'function') {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst moduleConfig = this._resolveModuleConfig(name, config);\n\t\t\tModule.boot(moduleConfig);\n\t\t}\n\n\t\treturn this;\n\t}\n\n\tget(name) {\n\t\tthis._ensureInitialized();\n\t\treturn this._modules.get(String(name).trim());\n\t}\n\n\thas(name) {\n\t\tthis._ensureInitialized();\n\t\treturn this._modules.has(String(name).trim());\n\t}\n\n\t_resolveModuleConfig(name, config) {\n\t\tif (!config || typeof config !== 'object') {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn Object.prototype.hasOwnProperty.call(config, name)\n\t\t\t? config[name]\n\t\t\t: undefined;\n\t}\n\n\t_ensureInitialized() {\n\t\tif (this._isInitialized || typeof this._initializer !== 'function') {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._isInitialized = true;\n\t\tthis._initializer(this);\n\t}\n}\n\nconst defaultModules = [\n\tVGAlert,\n\tVGCollapse,\n\tVGDropdown,\n\tVGDynamicTable,\n\tVGFiles,\n\tVGFilePreview,\n\tVGFormSender,\n\tVGLawCookie,\n\tVGLoadMore,\n\tVGModal,\n\tVGNav,\n\tVGNestable,\n\tVGRangeSlider,\n\tVGRollup,\n\tVGSelect,\n\tVGSidebar,\n\tVGSpy,\n\tVGTabs,\n\tVGToast,\n\tVGTooltip,\n];\n\nconst vgapp = new VGApp({\n\tinitializer: (app) => app.register(defaultModules),\n});\n\nexport { VGApp, vgapp };\nexport default vgapp;\n"],"names":["root","factory","exports","module","define","amd","this","Animation","DEFAULTS","enable","in","out","duration","constructor","element","key","userParams","_element","_nameKey","_params","mergeDeepObject","isElement","_classes","animated","_init","classList","add","contains","remove","_setupEventListeners","EventHandler","on","_handleShow","bind","_handleShown","_handleHide","_handleHidden","inClass","outClass","filter","cls","startsWith","forEach","dispose","off","Selectors","find","Error","_isLoaded","Data","set","NAME_KEY","_getParams","params","Params","get","EVENT_KEY","propertyName","Object","getOwnPropertyNames","_route","callback","_requestRoute","$content","timeout","ajax","setData","response","innerHTML","isObject","isEmptyObj","values","value","hasOwnProperty","route","method","target","loader","output","Html","div","class","completeAjaxRequest","data","status","once","normalizeData","execute","Ajax","ajaxData","onSuccess","onError","err","setTimeout","toLowerCase","post","delete","options","config","_normalizeRouteRequestOptions","requestRoute","_buildRouteUrl","endpoint","assign","buildRouteUrl","baseParams","requestOptions","request","ajaxOptions","source","String","trim","toUpperCase","credentials","headers","paramsBase","body","undefined","signal","responseType","parse","_dismissElement","cross","getSVG","button","querySelector","insertAdjacentHTML","_queueCallback","isAnimated","timeOutMs","executeAfterTransition","_animation","getInstance","getOrCreateInstance","boot","initAll","init","prototype","call","DATA_KEY","NAME","FILE_ICON_BY_EXT","pdf","doc","docx","odt","rtf","xls","xlsx","xlsm","ods","csv","zip","rar","tar","gz","tgz","txt","md","log","json","xml","yml","yaml","php","png","jpg","jpeg","gif","webp","svg","bmp","tif","tiff","heic","heif","avif","mp3","wav","ogg","flac","aac","m4a","mp4","webm","mov","mkv","avi","extractExtension","lastSegment","split","pop","includes","name","icons","explicitIcon","autoIcon","descriptor","type","ext","path","url","parseFileDescriptor","resolveFileIconName","resolveSVGByFile","minus","plus","chevron","danger","success","waiting","warning","info","dots","trash","spinner","check","dismissTrigger","clickEvent","document","event","tagName","preventDefault","isDisabled","getSelectorFromElement","closest","vgFilesInstance","_vg","handle","itemSelector","toast","console","warn","lists","length","_list","map","l","s","_nodes","list","_draggedItem","_boundOnDragStart","_onDragStart","_boundOnDragEnd","_onDragEnd","_boundOnDragOver","_onDragOver","_boundOnDrop","_onDrop","error","_enableDraggableItems","_setupEvents","_triggerCallback","querySelectorAll","li","setAttribute","img","addEventListener","e","item","dataTransfer","effectAllowed","requestAnimationFrame","_saveOrder","dropEffect","currentTarget","rect","getBoundingClientRect","midpoint","height","clientY","top","insertBefore","nextSibling","stopPropagation","ids","Set","_getUploadedIds","VGToast","run","message","Array","from","el","getAttribute","id","destroy","removeEventListener","DEFAULT_OPTIONS","selector","threshold","resizeEdgeSize","debug","modalElement","dialogElement","_modalElement","_dialogElement","_options","_normalizeOptions","_pointerId","_dragTarget","_isDragging","_startX","_startY","_currentX","_currentY","_dialogStartLeft","_dialogStartTop","_dialogWidth","_dialogHeight","_isEnabled","_previousUserSelect","_previousTransition","_previousWillChange","_initialRect","_lockedIframes","_debugElement","_onPointerMove","_onPointerUp","_onPointerDown","_onNativeDragStart","setOptions","_updateDebugOverlay","disable","style","touchAction","userSelect","_unlockEmbeddedFrames","_restoreDragStyles","dataset","vgToastDragging","_setDebugVisibility","syncPosition","_isPreparedForInteraction","width","offsetWidth","offsetHeight","currentLeft","Number","parseFloat","left","currentTop","isFinite","maxLeft","Math","max","window","innerWidth","maxTop","innerHeight","nextLeft","min","nextTop","_updateDebugValues","dragArea","_resolveDragArea","_isPointerOnResizeEdge","pointerId","clientX","_lockEmbeddedFrames","setPointerCapture","deltaX","deltaY","hypot","_applyDragStyles","_preparePosition","_applyDragPosition","releasePointerCapture","currentRect","position","margin","transform","translate","offsetX","offsetY","edgeSize","nearTop","nearBottom","nearLeft","nearRight","transition","willChange","iframes","frame","push","pointerEvents","base","merged","Boolean","createElement","bottom","zIndex","padding","borderRadius","background","color","fontSize","lineHeight","append","visible","display","state","textContent","round","minWidth","minHeight","DIRECTION_TO_CURSOR","n","w","ne","sw","nw","se","_contentElement","_direction","_startWidth","_startHeight","_startLeft","_startTop","_startRight","_startBottom","_observer","_syncFrameId","_resizeFrameId","_previousMaxWidth","_previousMaxHeight","_previousPointerEvents","_previousMinHeight","_previousOverflow","_previousContentHeight","_previousContentMaxHeight","_previousContentOverflow","_onPointerLeave","_applyResizePosition","_startObserveSizeChanges","_cancelResizeFrame","_stopObserveSizeChanges","cursor","vgToastResizing","_restoreResizeStyles","syncToViewport","currentWidth","currentHeight","currentLeftValue","currentTopValue","maxWidth","maxHeight","abs","defaultPrevented","direction","_getDirectionFromPointer","_applyResizeStyles","right","ResizeObserver","observe","disconnect","cancelAnimationFrame","overflow","CLASS_NAME_OPEN","CLASS_NAME_SHOW","CLASS_NAME_SHOWN","EFFECT_CLASS_PREFIX","EFFECT_PRESET_MAP","none","fade","zoom","blur","EVENT_KEY_HIDE","EVENT_KEY_HIDDEN","EVENT_KEY_SHOW","EVENT_KEY_SHOWN","EVENT_KEY_LOADED","EVENT_KEY_KEYDOWN_DISMISS","EVENT_KEY_CLICK_DATA_API","EVENT_KEY_POINTERDOWN_INTERACTION","EVENT_KEY_POINTERUP_INTERACTION","EVENT_KEY_POINTERCANCEL_INTERACTION","TOAST_ICON_MAP","defaultParams","static","placement","autohide","delay","enableClickToast","enableButtonClose","keyboard","theme","stack","drag","resize","animation","effect","BaseModule","super","_interactionDefaults","_dragHandler","VGToastDrag","_resizeHandler","VGToastResize","_interactionConfig","_resolveInteractionConfig","_applyAnimationEffects","_addEventListeners","_timeout","_hideTimeout","_isHiding","text","build","rawParams","hasAutohideParam","makeRandomString","wrapper","iconName","iconSvg","icon","safeIconSvg","Sanitize","svgElement","createRange","createContextualFragment","firstElementChild","content","isArray","header","instance","show","toggle","relatedTarget","_isShown","hide","_clearTimeout","_clearHideTimeout","_disableInteractionHandlers","trigger","stats","_setPlacement","completeCallBack","_toggleInteractionHandlers","_syncInteractiveBounds","_scheduleHide","completeCallback","shouldDispose","_enableStack","stackClass","elmsShown","findAll","slice","offset","reduce","sum","clientHeight","index","stackItems","isTop","visibleStack","elms","isCenter","isLeft","isRight","_normalizeInteractionParams","paramsValue","defaults","hasEnable","className","_resolveAnimationEffectClasses","effectValue","normalized","_resolveAnimationEffectClass","clearTimeout","resumeHide","getElementFromSelector","one","_toRouteQueryParamValue","join","URL","location","origin","keys","searchParams","hasBody","isGetLike","FormData","JSON","stringify","fetch","toString","contentType","expectsJson","payload","ok","apiError","fallbackMessage","statusText","code","details","requestId","request_id","baseUrl","defaultHeaders","withCredentials","csrfToken","_token","_getCsrfToken","meta","onProgress","noop","onUploadStart","onUploadEnd","fullUrl","isFormData","requestHeaders","isGet","_makeXHR","_makeFetch","_serializeBody","then","isJson","Promise","reject","catch","resolved","errData","xhr","XMLHttpRequest","open","setRequestHeader","upload","lengthComputable","loaded","total","onload","responseText","onerror","ontimeout","abort","send","put","patch","merge","fromElement","Manipulator","stringToNestedObject","str","reduceRight","acc","nestedObj","DEFAULT_ALLOWED_SVG_TAGS","DEFAULT_ALLOWED_SVG_ATTRS","escapeHtml","replace","sanitizeSvgNode","node","allowedTags","allowedAttrs","nodeType","Node","TEXT_NODE","createTextNode","ELEMENT_NODE","has","safeNode","createElementNS","attributes","attr","attrValue","childNodes","child","safeChild","toSafeHtmlString","allowedSvgTags","allowedSvgAttrs","template","outerHTML","LaravelHtmlBuilder","mode","tags","selfClosing","setMode","tag","option","_createDomElement","_createHtmlString","_setDomAttributes","appendChild","isHTML","entries","attrString","_attributesToString","contentStr","_contentToString","_nodeToString","attrs","span","i","p","a","href","src","alt","input","form","action","label","forId","for","textarea","ul","items","isNative","listItems","ol","h4","table","rows","headerCells","headerRow","thead","bodyRows","row","cells","cell","tbody","token","withEvents","events","handler","addClass","match","fullMatch","newAttrs","_addClassToAttributes","classMatch","existingClass","newClass","component","props","slots","components","role","footer","builder","Proxy","prop","elementMap","Map","getInstanceMap","createInstanceMap","instanceMap","size","existingKey","NAMESPACE_REGEX","STRIP_NAME_REGEX","STRIP_UID_REGEX","customEvents","mouseenter","mouseleave","nativeEvents","eventRegistry","uidEvent","makeEventUid","uid","getElementEvents","normalizeParameters","originalTypeEvent","delegationFunction","isDelegated","callable","typeEvent","addHandler","oneOff","handlers","existing","findHandler","fn","createDelegatedHandler","isOneOff","candidates","parentNode","hydrateObj","delegateTarget","apply","delegationSelector","createHandler","h","removeHandler","removeNamespacedHandlers","namespace","obj","defineProperty","configurable","isNamespace","inNamespace","eventType","storeElementEvent","eventObj","handlerKey","args","evt","CustomEvent","bubbles","cancelable","detail","dispatchEvent","nameAttribute","isRemoveDataName","baseKeys","dataAttrs","hasAttribute","removeAttribute","Classes","classes","isString","condition","oldClass","getSelector","dataTarget","container","documentElement","findID","byId","ownerDocument","getElementById","scope","escaped","CSS","escape","escapeId","getMultipleElementsFromSelector","parents","parent","parentElement","next","sibling","nextElementSibling","matches","prev","previousElementSibling","getElement","jquery","disabled","isVisible","getClientRects","getComputedStyle","visibility","parentDetails","summary","decodeURIComponent","sources","isObj","o","val","concat","defaultValue","TRANSITION_END","waitForTransition","timeoutMs","getTransitionDurationFromElement","called","triggerTransitionEnd","transitionDuration","transitionDelay","durations","delays","Event","reflow","result","charAt","floor","chars","random","transliterate","enToRu","to","dst","srcLower","dstLower","srcUpper","dstUpper","getNextActiveElement","active","getNext","cycle","len","idx","indexOf","isRTL","dir","isMobileDevice","userAgent","navigator","isMobileUA","test","isTouchDevice","maxTouchPoints","isSmallScreen","isHighDPI","devicePixelRatio","platform","isiPadPro","screenWidth","screen","screenHeight","some","res","detectIPadPro","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","d","definition","enumerable","r","Symbol","toStringTag","SELECTOR_FIXED_CONTENT","SELECTOR_STICKY_CONTENT","PROPERTY_PADDING","PROPERTY_MARGIN","getWidth","documentWidth","clientWidth","isOverflowing","_disableOverflow","_setStyle","reset","_resetStyle","_saveInitialStyle","property","_applyToElements","current","getPropertyValue","setProperty","removeProperty","CLASS_NAME","CLASS_NAME_FADE","Backdrop","_rootEl","ScrollBarHelper","_backdrop","_append","_destroy","html","resolve","_scrollbar","vgModalDragging","vgModalResizing","OPEN_SELECTOR","CLASS_NAME_STATIC","EVENT_KEY_RESIZE","EVENT_KEY_HIDE_PREVENTED","EVENT_KEY_MOUSEDOWN_DISMISS","EVENT_KEY_CLICK_DISMISS","EVENT_KEY_DOM_LOADED_DATA_API","EVENT_KEY_POPSTATE_DATA_API","VGModal","backdrop","persistent","focus","fields","hash","centered","dismiss","sizes","general","dialog","title","_button","_dialog","_content","_isTransitioning","_scrollBar","VGModalDrag","VGModalResize","btnClose","modal","ajaxTargetContent","history","pushState","_addFieldsInModal","_adjustDialog","_showElement","openedModals","isLeaveBackDrop","_hideModal","_isAnimatedFade","_saveInteractionState","pathname","search","_resetAdjustments","scrollTop","modalBody","transitionComplete","_restoreInteractionState","_bindInteractionHandlers","_getStateConfig","_normalizeStateParams","_getStateStorageKey","stateConfig","_captureInteractionState","dialogStyle","contentElement","contentStyle","_applyInteractionState","dialogState","contentState","storageKey","localStorage","setItem","rawState","getItem","parsedState","isModalOverflowing","scrollHeight","scrollbarWidth","isBodyOverflowing","paddingLeft","paddingRight","_triggerBackdropTransition","event2","initialOverflowY","overflowY","elements","elm","showEvent","alreadyOpen","alreadyOpenInstance","targetHash","langData","ru","messages","messagesRu","titles","titlesRu","buttons","buttonsRu","en","messagesEn","titlesEn","buttonsEn","Lang","lang","getLangData","language","lang_titles","lang_messages","lang_buttons","CLASS_NAME_ALERT","DATA_AGREE","DATA_CANCEL","isAlertOpen","VGAlert","_defaultParams","render","_elementsDefault","agree","cancel","description","_setParams","context","accepted","reason","getContainer","overlay","_buildOverlay","_buildModal","agreeBtn","cancelBtn","closeAlert","isHide","handleAgree","cleanup","timestamp","Date","handleCancel","handleKeydown","confirm","elem","VGAlertConfirm","_buildContent","_createButton","containerWrap","btn","SELECTOR_DATA_TOGGLE","EVENT_KEY_ACCEPT","EVENT_KEY_REJECT","EVENT_KEY_FINALLY","AlertClass","_ajax","vgalert","finally","CLASS_NAME_COLLAPSE","CLASS_NAME_COLLAPSING","CLASS_NAME_DEEPER_CHILDREN","VGCollapse","_triggerArray","toggleList","filterElement","foundElement","_initializeChildren","_addAriaAndCollapsedClass","activeChildren","_getFirstLevelChildren","activeInstance","dimension","_getDimension","scrollSize","complete","triggerArray","isOpen","_changeStateButton","children","selected","reference","drop","boundary","autoFlip","overflowProtection","fallbackPlacements","clamp","clampPadding","isMerge","_getPlacementRect","_getViewportRect","_getOverflowConstraints","refRect","dropRect","viewRect","xOffset","yOffset","fallbacks","best","_calculatePosition","_calculateOverflow","finalPosition","_clampPosition","_setStyles","pos","pageYOffset","pageXOffset","TARGET_CONTAINER","EVENT_KEYUP_DATA_API","EVENT_KEYDOWN_DATA_API","EVENT_CLICK_DATA_API","EVENT_MOUSEOVER_DATA_API","EVENT_MOUSEOUT_DATA_API","VGDropdown","hover","_parent","_drop","_isPlacement","isFade","isAnimation","_completeHide","placementDefault","Placement","currentElem","hideOpenToggles","keydownHandler","clearDrops","openToggles","composedPath","isInput","isEscapeEvent","isUpOrDownEvent","fixedColumnsMethods","_getFixedColumnsConfigRaw","optionRaw","fixed","columns","attrRaw","raw","_hasFixedColumnsConfig","tHead","fixedAttr","fixedColumnAttr","_buildFixedColumnsStateMap","isInteger","_collectFixedColumnsTransitions","nextState","previousState","_fixedColumnsLastStateMap","transitions","side","_applyFixedColumnsLayout","suppressFixedColumns","_fixedColumnsSuppressed","sourceHeaders","sourceFixedRaw","_getFixedColumnsByHeaders","parseTableAttr","fallbackByPosition","sourceFixed","_applyMobileFixedColumnsGuard","hasSourceFixed","sourceFixedTransitions","_applyFixedColumnsToTable","includeBody","emitAction","transitionedColumns","_toggleFixedColumnsScrollBinding","cloneTable","_cloneStickyState","cloneHeaders","cloneFixedRaw","cloneFixed","_rebuildFixedColumnsCellsCache","_syncFixedColumnsScroll","immediate","_isTouchDevice","viewportMetrics","_getViewportWidthMetrics","viewportWidth","effectiveWidth","fixedIndexes","fixedIndex","byField","leftSet","rightSet","autoIndexes","field","clonedSide","group","sideMatch","explicitSide","parseInt","sort","b","shouldEmitAction","sections","tBodies","tFoot","section","hasFixed","tableRect","metrics","leftOffsets","leftOffset","rightOffsets","rightOffset","leftEdgeIndex","rightEdgeIndex","metric","baseShift","_emitAction","entry","headerCell","fallbackBaseShift","attrBaseShift","scrollLeft","_tableViewport","fixedAtTs","now","columnIndex","phase","column","offsets","shift","fixedAt","iso","toISOString","enabled","_fixedColumnsScrollBound","_boundFixedColumnsScroll","passive","_resetFixedColumnsScrollSyncState","_fixedColumnsSyncFrame","_fixedColumnsLastScrollLeft","_fixedColumnsLastAppliedScrollLeft","NaN","_fixedColumnsLastShadowStateKey","_fixedColumnsCellsCache","_fixedColumnsShadowTargetsCache","tables","normalizedTables","edges","fixedCells","nextScrollLeft","_flushFixedColumnsScrollSync","isConnected","_syncFixedColumnsShadows","targets","viewport","canScroll","scrollWidth","maxScrollLeft","showLeftFixedShadow","showRightFixedShadow","nextStateKey","edge","viewportMethods","_ensureTableViewport","previousParent","_bindViewportPan","_panState","onPointerDown","onPointerMove","onPointerUp","onPointerCancel","moved","startX","startY","startScrollLeft","startScrollTop","resetPan","isPrimary","pointerType","shiftKey","_boundPanHintResize","_updatePanHintVisibility","_ensurePanHintNode","_panHintNode","_getTableMessage","closeLabel","_escapeHtml","hidden","_boundPanHintDismiss","anchor","_handlePanHintDismiss","targetNode","targetElement","Element","_storePanHintDismissedAt","shouldShowPanHint","_isPanHintDismissed","_getPanHintDismissDays","panHint","dismissDays","parsed","_getPanHintDismissStorageKey","_getPerPageStorageKey","tableId","_readPanHintDismissedAt","_clearPanHintDismissedAt","removeItem","dismissedAt","ttlMs","expiresAt","hasTouchPoints","hasCoarsePointer","matchMedia","hasNoHover","hasTouchEvents","_moveTableClassesToWrapper","tableClasses","normalizeNonNegativeInt","fallback","normalizeBooleanOption","normalizeEnabledFlag","safeQuerySelector","summaryFooterMethods","_renderSummary","_isSummaryEnabled","_summaryNode","_isRemote","totalRaw","summaryI18n","_getI18nSection","totalLabel","foundLabel","chips","_getActiveCriteria","searchParam","_getSearchParamName","searchValue","_remoteParams","searchLabel","_getFilterLabelByParam","param","_getFiltersFormSelector","_filtersFormCacheSelector","_filtersFormCacheNode","_filtersLabelCache","cache","filters","fieldAttr","partAttr","normalizedParam","isOperator","fieldKey","controlSelector","control","labelNode","_getFooterCell","_isFooterEnabled","foot","_clearFooter","_renderFooterFromCurrentState","records","_getVisibleRows","_mapDomRowToRecord","_renderFooterStats","_renderFooterFromRows","_getBody","valueByField","_fields","visibleCount","sumPrice","sumStock","ratingSum","ratingCount","price","_extractNumber","stock","rating","avgRating","visibleRowsLabel","pagePriceSumLabel","pageStockSumLabel","pageAvgRatingLabel","metaTotalRaw","totalHtml","finiteSumPrice","finiteSumStock","finiteAvgRating","toFixed","_applyFooterVisibility","_formatFieldValue","amount","_renderLoadingSkeleton","_getRenderedColumnsCount","columnWidths","_getCurrentColumnWidthsPx","rowsCount","_getSkeletonRowsCount","rowHeight","_getSkeletonRowHeightPx","rowHeightStyle","rowHtml","_","rowIndex","_refreshStickyAndFixedLayout","headerCount","_getHeaderCells","fieldsCount","headerWidths","firstRow","fromPerPageControl","_getPerPageControlValue","loadingOptions","loading","explicit","skeleton","renderedRows","_getRenderedDataRows","fromState","_pageState","perPage","pagination","fromParams","perPageControl","_clampPerPage","tableRemoteMethods","_getRemoteRouteRequestConfig","attrMethod","attrCredentials","attrParams","paramsFromAttr","_getRemoteDataRoute","_isRemoteCacheEnabled","requestCacheOptions","_isTruthy","fromOptions","_getRemoteCacheTtlMs","ttl","_getRemoteCacheMaxEntries","_getRemoteCacheKey","query","encodeURIComponent","_readRemoteCache","_remotePageCache","age","ts","lastUsedAt","_writeRemoteCache","maxEntries","_applyRemoteResponse","safePage","safePerPage","userOnChange","_extractRemoteRows","_extractRemoteMeta","fromCache","requestContext","_lastRemoteMeta","viewRowsHtml","_extractRemoteViewRowsHtml","_renderRemoteViewIfConfigured","_renderRemoteRows","nextPage","_normalizePositiveInt","page","nextPerPage","per_page","totalPages","pages","_storePage","_storePerPage","nextSort","_sortState","nextDir","metaSorts","_parseSortsFromStrings","_normalizeSortDir","sorts","_sortable","setState","_pagination","setMeta","_syncUrlState","received","serverMeta","sent","requestTrigger","requestFiltersState","filtersState","_normalizeFiltersEventState","_isFiltersEmitFullContextEnabled","fallbackState","eventState","isSearched","_isSearchActiveFromParams","isFiltered","_isFilteredState","responsemode","_getRemoteResponseMode","view","renderedCount","_getNormalizedSorts","_activeFilters","_buildRemoteRequestParams","sortOptions","sortable","requestParams","viewParam","_getRemoteViewParamName","viewValue","_getRemoteViewParamValue","fieldsParam","_getRemoteFieldsParamName","remoteFieldParam","remoteDirParam","exportRemote","format","normalizedFormat","_getInitialPerPage","mappedRequestParams","_mapRemoteRequestParams","exportEndpoint","export","exportUrl","_loadRemotePage","requestMeta","requestToken","_requestToken","filtersOptions","transport","includeMeta","urlState","_collectUrlState","requestPayload","_activeRemoteRequestId","cachedResponse","_requestAbortController","requestAbortController","AbortController","requestStartedAt","_waitMinLoadingDelay","activeRequestId","errorMessage","_renderStateRow","attrResponseMode","viewparam","viewvalue","fieldsparam","_getFiltersRoute","_getRoute","_getRequestParamMap","parammap","_getAutoFilterRequestParamMap","_getFilterFieldKeys","prefix","_getFiltersUrlPrefix","autoMap","normalizedField","mappedField","_prefixFilterParamKey","operatorKey","mappedOperatorKey","_getRequestPath","attrData","datapath","attrMeta","metapath","attrView","viewpath","_readPath","parts","configured","canUseView","_hasRenderableRowsInBody","_setFixedColumnsSuppressed","_clearStateMode","startedAt","minDelayMs","minDelay","remaining","tableUrlStateMethods","_isFiltersUrlStateEnabled","_isFiltersUrlStateWriteOnChange","_getManagedUrlStateKeys","toQueryParamValue","nextUrl","_getUrlStateMode","replaceState","_getFiltersUrlStateConfig","valueKey","urlValueKey","urlOperatorKey","_isPaginationEnabled","fallbackPerPage","pageKey","perPageKey","valid","sortKey","_isUrlStateEnabled","historyMode","_isUrlStateIncludePagination","_isUrlStateIncludeSort","_bindPopState","_isUrlStatePopStateEnabled","_boundPopState","_handlePopState","_getInitialRemoteParams","_getInitialSortState","_syncControlsFromState","_getInitialPage","filtersRequestMeta","_getFiltersRequestMetaIfActive","searchSelector","_getSearchInputSelector","_getSearchInputNode","_filters","setValues","_getInitialFilterValues","emit","nextParams","reserved","_isFiltersUrlStateReadOnInit","urlParams","_getUrlParams","filterFields","operator","rawSort","dirs","part","rawKey","rawPrefix","URLSearchParams","searchOptions","attrParam","_getFiltersFormNode","_filterParamKeysCache","unique","filterOptions","attrSelector","optionForm","paramPrefix","readOnInit","writeOnChange","rawValue","prepared","retryButton","illustration","_buildStateIllustrationMarkup","stateCell","_setStateMode","_ensureStateRowVisible","_announce","attrName","optionValue","inlineSvg","_extractInlineSvgMarkup","decoded","_decodeHtmlEntities","_getStateBlockMinHeight","vh","scrollIntoView","block","inline","ratio","computed","_bindTableStateActions","_resetFiltersAndSearch","_reloadCurrentPage","searchInput","_hasActiveRemoteFilters","_ensureLiveRegion","_liveRegion","locale","i18n","perPageLabel","perPageOptionSuffix","prevLabel","nextLabel","quickJumpButtonLabel","empty","retry","shiftDragHint","ascLabel","descLabel","views","storage","per","maxPerPage","persistPage","persistPerPage","persist","pageStorageKey","pageStorage","align","renderMode","ellipsis","ellipsisAfter","maxVisiblePages","showPerPage","showPerPageLabel","scrollToTop","scrollToWindowTop","quickJump","perPageOptions","onChange","onPerPageChange","initialField","initialDir","multi","multiWithShift","hideUnsortedArrows","isColumnSortable","columnReorder","columnResize","virtual","overscan","expandable","idAttr","parentAttr","toggleSelector","collapsed","errorIllustration","emptyIllustration","stickyHeader","debounce","typeAttr","valueAttr","operatorAttr","defaultOperator","resetPageOnChange","skipEmpty","trimValues","emitFullContext","payloadKey","includeUrlState","rowsPath","totalPath","metaPath","appliedFiltersPath","include","listen","popstate","editable","rowReorder","rowReorderMode","rowReorderHandleSelector","callbacks","onInit","onBeforeLoad","onDataLoaded","onRequestSuccess","onRequestError","onStaleResponse","onUrlStateRead","onUrlStateWrite","onUrlStateError","onEmptyResult","onAfterRender","onStateSync","onSortChange","onPageChange","onSearch","onFiltersChange","onReset","onRowCheck","onCheckAll","onRowReorder","onExport","onViewChange","onRowExpand","onRowCollapse","onRowToggle","onColumnReorder","onColumnResize","onColumnFixed","persistence","filtersApply","_root","markupSelector","_maxPerPage","_resolveMaxPerPage","_state","_normalizeInt","_normalizePerPage","_containers","_lastMarkupByContainer","WeakMap","_boundContainerClick","_handleContainerClick","_boundContainerChange","_handleContainerChange","_boundContainerKeyDown","_handleContainerKeyDown","_boundContainerFocusIn","_handleContainerFocusIn","_boundContainerBlur","_handleContainerBlur","_dropdownInstances","_resolveContainers","_render","_bindEvents","changed","nextTotalPages","clampedPage","_clampPage","_resolveRenderMode","found","_findMarkupContainers","_createClassContainers","scopedContainer","preferred","tableHost","containers","ensure","paginationGenerated","perPageOption","_findPerPageInputFromNode","_formatPerPageDisplay","_applyPerPage","_hidePerPageDropdownFromNode","perPageInput","_findPerPageToggleFromNode","dropdown","_getOrCreatePerPageDropdown","jumpButton","_jumpToPage","_setPage","_getEllipsisTargetPage","related","perPageChanged","pageChanged","_emitChange","_buildPages","markup","_buildMarkup","_initPerPageDropdown","_resolveAlign","alignStyle","_resolveAlignStyle","prevDisabled","nextDisabled","perPageHtml","_buildPerPageMarkup","quickJumpHtml","_shouldShowQuickJump","_buildQuickJumpMarkup","_buildPageItem","_normalizePerPageOptions","_isPerPageLabelVisible","isPrev","pageAction","targetPage","jumpStep","maxVisible","_range","middleSlots","start","end","_getPerPageOptionSuffix","rawSuffix","visibleNumericPages","firstVisible","lastVisible","_table","directions","multiSort","multiSortWithShift","_headers","_sorts","_headerControls","_boundClick","_handleClick","_boundKeyDown","_handleKeyDown","_getHeaders","_syncControlsVisibilityMode","_isSortable","tabIndex","_decorateHeader","_applyInitialState","_normalizeSorts","_setSorts","_resolveIndex","_normalizeDir","refresh","head","arrow","multiMode","_isMultiMode","_applyColumnDirection","_cycleColumn","_getDirections","firstDir","secondDir","_removeColumnDirection","nextSorts","sortByIndex","priority","headerIndex","controls","_getHeaderControls","controlsNode","ascButton","descButton","shouldHideControls","sortDirection","sortPriority","_syncSortedColumnsHighlight","first","_getFieldByIndex","seen","_getAllRows","firstChild","_escapeAttr","findIndex","byIndex","_collapsed","_initialized","_getRows","_resetExpandHidden","_rememberBaseVisibility","_getIdAttr","_getParentAttr","rowById","parentById","childrenByParent","fallbackId","rowId","parentId","depthCache","getDepth","depth","isAncestorCollapsed","hasChildren","seeded","_isInitiallyCollapsed","_syncToggleNode","baseHidden","collapseHidden","nextHidden","_getToggleSelector","rawTarget","onToggle","firstCell","prepend","marginInlineEnd","nextNode","after","debounceMs","inputSelector","_input","_timer","_boundInput","_handleInput","_emit","formSelector","formNode","applyMode","emitOnInit","initialValues","_form","_controls","_boundChange","_handleChange","_boundSubmit","_handleSubmit","_resolveFormNode","_syncCachedNodes","getState","_collectState","getValues","getFields","_getControls","_getField","nextValues","_getPart","nextValue","_setControlValue","_isFilterControl","_isManualMode","applySelector","resetSelector","_reset","groups","_getType","_getStaticOperator","_readControlValue","controlType","_getDefaultOperator","_normalizeFilterItem","count","isEmptyArray","isEmptyValue","multiple","rawValues","checked","selectedOptions","_getFieldAttr","_isSupportedControl","selectedIndex","_getPartAttr","_getTypeAttr","_getValueAttr","_getOperatorAttr","MAIN_SELECTOR_CLASS","ACTION_CALLBACK_MAP","beforeload","dataloaded","requestsuccess","requesterror","staleresponse","urlstateread","urlstatewrite","urlstateerror","emptyresult","afterrender","statesync","sortchange","pagechange","perpagechange","filterschange","viewchange","rowupdate","rowupdateerror","bulkaction","rowdelete","rowcheck","checkall","selectionchange","rowexpand","rowcollapse","rowtoggle","rowreorder","rowreordererror","columnreorder","columnresize","columnfixed","VGDynamicTable","_rows","_originalRows","_isInitialized","_search","_boundCloneStickyResize","_layoutResizeObserver","_layoutRefreshFrame","_layoutRefreshReasons","_layoutRefreshScheduled","_searchInputCacheSelector","_searchInputCacheNode","_columnReorderState","fromIndex","toIndex","isDragging","_columnResizeState","bound","startWidth","nextWidth","_virtualState","lastPage","lastPerPage","lastScrollTop","_virtualSpacers","_boundVirtualScroll","_handleVirtualScroll","_expandable","normalizedAction","isRemote","normalizedActionKey","callbackName","eventName","updateRemoteParams","shouldReplace","shouldReload","reload","shouldResetPage","resetPage","setLocale","_writePersistentState","setFiltersApplyMode","_normalizeFiltersApplyMode","_initFilters","_getViewsStorageKey","explicitAttr","viewsOptions","nestedStorage","viewsoptions","_readViewsStorage","_writeViewsStorage","_getHiddenFields","_setFieldHidden","targetField","getCurrentViewState","columnOrder","_getCurrentColumnOrder","hiddenFields","listViews","saveView","cleanName","applyView","targetIndex","currentIndex","_findHeaderIndexByField","_moveColumn","hiddenSet","firstSort","_getTotalPages","_renderPageRows","_afterColumnReorder","deleteView","directParent","nearestWrapper","_restorePersistentState","_ensureSummaryNode","sortableEnabled","paginationEnabled","cloneStickyEnabled","_isCloneStickyHeaderEnabled","stickyHeaderEnabled","_isStickyHeaderEnabled","_applyStickyHeader","_applyCloneStickyHeader","_getFields","_getTableRows","_initSorting","_initColumnReorder","_initColumnResize","_initExpandable","_initSearch","setPagination","_refreshExpandable","_setRemotePagination","initialPage","userOnPerPageChange","paginationI18n","paginationOptions","_getMaxPerPage","_scrollToPaginationTop","Pagination","async","ceil","isVirtualEnabled","_isVirtualEnabled","_applyVirtualWindow","_teardownVirtualWindow","thresholdRaw","_initVirtualization","_teardownVirtualizationBinding","nextScrollTop","_resolveVirtualRowHeight","overscanRaw","pageStart","pageEnd","scrolledRows","windowStart","windowEnd","topSpacerHeight","bottomSpacerHeight","_syncVirtualSpacers","isSameContext","prevStart","prevEnd","updateFrom","updateTo","attrRowHeight","optionRowHeight","rowheight","measuredHeight","_measureVirtualRowHeight","cachedHeight","samples","topHeight","bottomHeight","topSpacer","_ensureVirtualSpacer","bottomSpacer","firstVisibleRow","afterVisibleRow","_updateVirtualSpacer","_syncVirtualSpacerColumns","spacer","colSpan","safeHeight","removeChild","attrRoute","storedLocale","_readPersistentState","storedFiltersMode","_isPersistenceEnabled","attrEnabled","filtersApplyMode","_getPersistenceStorageKey","headerFields","sortableI18n","attrMulti","attrMultiWithShift","attrHideUnsortedArrows","Sortable","_isHeaderSortableByConfig","_handleSortChange","_isColumnReorderEnabled","_applyStoredColumnOrder","_syncColumnReorderHeaders","_bindColumnReorder","_isColumnResizeEnabled","_syncColumnResizeHeaders","_bindColumnResize","_isExpandableEnabled","_getExpandableConfig","Expandable","attrId","attrParent","attrToggle","attrCollapsed","onMouseDown","_findHeaderIndex","onMouseMove","minwidth","maxwidth","_applyColumnWidth","onMouseUp","widthPx","_isColumnReorderPersistEnabled","_getColumnReorderStorageKey","attrStorageKey","onDragStart","th","_isHeaderFixedForColumnReorder","onDragOver","_syncColumnDragOverMarker","onDrop","_resetColumnDragMarkers","_finalizeColumnReorder","onDragEnd","draggable","_normalizeFixedColumnsOrder","movingCell","referenceCell","normalizedSorts","primarySort","_storeColumnOrder","order","_readStoredColumnOrder","fixedSide","leftHeaders","rightHeaders","targetLeft","targetRight","_isSearchEnabled","Search","_getCurrentFiltersEventState","_isSearchedValue","nextSelector","_isFiltersEnabled","attrApplyMode","Filters","normalizedState","_handleFiltersStateChange","rawNextParams","_buildFilterRemoteParamsPatch","_applyLocalFilters","nextFilterParams","explicitFields","inferredFromParams","_isNonEmptyFilterParamValue","normalizedKey","_extractFilterParamsFromRemoteParams","sourceParams","keySet","_resetLocalRowsOrder","_sortLocalRows","sortList","leftRow","rightRow","factor","leftValue","rightValue","compared","_compareSortableValues","fieldIndexMap","_getFieldIndexMap","filteredRows","matched","_rowMatchesFilters","cellValue","_matchesFilterValue","rawCellValue","normalizedValues","leftLower","rightLower","leftNumber","rightNumber","hasNumbers","endsWith","leftIsNumber","rightIsNumber","leftString","rightString","localeCompare","numeric","sensitivity","dirRaw","sortRaw","_resolveHeaderForSort","resolvedColumnIndex","resolvedField","whitelist","_getSortableFieldsWhitelist","attrFields","_normalizeSortableFields","fromUrl","fromRequest","fromStorage","_readStoredPage","_readStoredPerPage","_getConfiguredPerPage","perPageAttr","fromAttr","maxPerPageAttr","_isPerPagePersistenceEnabled","_isPagePersistenceEnabled","dataToggle","_getPageStorageKey","sticky","enableAttr","_refreshStickyAndFixedLayoutNow","_syncCloneStickyHeader","_updateLayoutResizeBinding","shouldListen","_teardownLayoutResizeObserver","_setupLayoutResizeObserver","_getLayoutResizeTargets","pushUnique","_getStickyHeaderOffsets","attrTop","topRaw","attrMaxHeight","maxHeightRaw","_getCloneStickyHeaderOffsets","_readCssSizeVar","_resolveCssLengthToPx","referenceNode","direct","host","probe","scrollTarget","onScroll","headerWrap","cloneHead","stateNode","lastHeadHtml","cloneCells","_syncCloneStickyScroll","onClick","_forwardCloneStickyInteraction","sourceHead","hideUnsortedAttr","cloneHeadChanged","nextHeadHtml","_sanitizeCloneStickyHeadIds","sourceCells","_syncCloneStickySelectAllState","sourceTableWidth","hasHorizontalOverflow","tableWidth","hasVerticalOverflow","tableWidthCss","totalCloneWidth","cloneCell","safeWidth","widthCss","gap","lastCell","cloneHeight","sourceSelectAll","cloneSelectAll","indeterminate","nodesWithId","idMap","originalId","cloneId","idRefAttrs","cloneTh","sourceTh","clonedSelectAll","clonedArrow","clickTarget","sourceArrow","MouseEvent","ctrlKey","altKey","metaKey","_isPaginationScrollToTopEnabled","targetTop","_getPaginationScrollTopTarget","scrollY","prefersReducedMotion","scrollTo","behavior","_isPaginationScrollToWindowTopEnabled","defaultI18n","localeRaw","baseLocale","baseSection","localized","localizedSection","skeletonMethods","tableStateMethods","ROW_SELECTOR","ROW_CHECK_SELECTOR","CHECK_ALL_SELECTOR","Editable","_getInitStore","__initStore","WeakSet","_getDragStore","__dragStore","_isEditableEnabled","initStore","_syncSelectAll","_syncRowReorder","_bind","checkAll","_toggleAll","_getSelectionPayload","rowCheckbox","_getRowPayload","_handleRowDragStart","_handleRowDragOver","_handleRowDrop","_clearRowDragState","eventPrefix","_getEventPrefix","rowCheckboxes","extra","editableOptions","_getEditableOptions","_getTableInstance","_parseBool","_isRowReorderEnabled","_getRowReorderMode","attrMode","_getRowReorderHandleSelector","optionSelector","handleSelector","handles","_getRowDragState","store","fromRow","overRow","overAfter","_getBodyRowIndex","insertAfter","targetRow","_moveRow","beforeRow","_getSiblingRowPayload","afterRow","pathAttribute","fieldsAttribute","validAttribute","errorAttribute","errorValue","fieldAttribute","editableAttribute","editableFieldsAttribute","missingFieldsAttribute","getFilePath","filePath","rawFields","validateFilePath","isValid","fileUrl","protocol","fileName","syncState","resolveEditableFields","_escapeClassName","syncEditableFields","fieldsMap","editableFields","missingFields","getFileMeta","normalizedPath","originalName","isMedia","sizeBytes","sizeText","parsedUrl","_readOriginalName","_readSize","mediaByExt","_formatSize","cleanPath","fromData","dataCandidates","_parseSizeValue","number","unit","kb","mb","gb","tb","bytes","units","unitIndex","fractionDigits","AUDIO_EXTENSIONS","readSyncSafeInt","readUInt32","useSyncSafe","getUint8","decodeText","encodingByte","TextDecoder","decode","bom0","bom1","swapped","Uint8Array","findNullTerminator","step","parseApic","frameBytes","encoding","mimeEnd","mimeTypeRaw","isUnicode","descEnd","mimeType","extractAudioMetadata","file","File","dot","lastIndexOf","getFileExtension","chunk","arrayBuffer","version","tagSize","totalTagSize","DataView","picture","frameId","fromCharCode","frameSize","frameDataStart","frameDataEnd","parseId3v2","imageBlob","Blob","pictureBlob","VIDEO_EXTENSIONS","ImageModal","_modalId","_instance","_ensureModal","_modal","_image","defaultTitle","_title","close","_initModal","existed","_bindElements","_bindLifecycle","modalInstance","decoding","_destroyModal","IMAGE_EXTENSIONS","canRender","fileMeta","previewContainer","nameOnly","ui","openImage","titleLink","listImage","thumbnail","OfficeModal","_labels","_frame","labels","_src","_downloadName","downloadName","_fallback","_label","_download","_buildViewerUrl","_downloadFile","absolute","link","click","OFFICE_EXTENSIONS","openOffice","download","PdfModal","_page","_zoom","_syncControls","_updateFrameSrc","toolbar","_pagePrev","_pageInfo","_pageNext","_zoomOut","_zoomIn","_zoomInfo","PDF_EXTENSIONS","openPdf","zoomIn","zoomOut","prevPage","TextModal","_abortController","_loadText","cacheKey","_cache","cached","_renderLoadedText","_renderMarkdown","markdownText","line","_sanitizeUrl","lines","inList","inCode","rawLine","heading","level","listItem","TEXT_EXTENSIONS","openText","cannotOpen","unknownError","emptyFile","VideoModal","_playlist","_currentIndex","_onKeyDown","_handleHotkeys","_video","playlist","tracks","currentBySrc","track","_syncNavigation","load","play","_stop","navigation","_prevButton","_goPrev","_nextButton","_goNext","preload","playsInline","pause","currentTime","hasPlaylist","_openCurrentTrack","fromEnded","getPathFromElement","toAbsoluteUrl","resolveTitle","fallbackPath","resolveSubtitle","buildMediaPlaylist","currentElement","acceptExt","parseExt","subtitle","currentSrc","openVideo","ZipModal","_entries","_arrayBuffer","_loadZipEntries","_renderEntries","buffer","_parseZipEntries","errorText","_resolveErrorText","byteLength","eocdOffset","_findEndOfCentralDirectory","totalEntries","getUint16","centralDirOffset","getUint32","decoder","fatal","ptr","compressedSize","uncompressedSize","compressionMethod","fileNameLen","extraLen","commentLen","localHeaderOffset","nameStart","nameEnd","fileNameBytes","isDirectory","minOffset","compressed","original","previewAction","_canPreviewEntry","_bindEntriesPreview","digits","_previewEntry","_extractExtension","panel","uint8","_extractEntryBytes","_isImageExtension","blob","_mimeByExtension","createObjectURL","revokeObjectURL","safeText","dataStart","dataEnd","DecompressionStream","stream","pipeThrough","decompressed","Response","clean","ZIP_EXTENSIONS","openArchive","loadingArchive","cannotOpenArchive","invalidZip","centralDirectoryNotFound","archiveEmptyUnsupported","typeDir","typeFile","tableName","tableType","tablePacked","tableSize","tablePreview","previewEntry","loadingEntry","cannotPreviewEntry","deflateNotSupported","compressionNotSupported","entryCorrupted","archiveBufferMissing","emptyFileInArchive","SUPPORTED_LANGS","normalizeLang","candidate","short","VGFilePreview","validate","preview","audio","video","image","archive","office","_filePath","_fileUrl","_isValid","_fileMeta","_editableFields","_helper","FilePreviewHelper","_renderers","ImageFilePreviewRenderer","VideoFilePreviewRenderer","PdfFilePreviewRenderer","OfficeFilePreviewRenderer","ZipFilePreviewRenderer","TextFilePreviewRenderer","_lang","resolveFilePreviewLang","paramsLang","fromClosest","fromHtml","_i18n","createFilePreviewI18n","normalizedLang","_inlineAudio","_inlineAudioSrc","_inlineAudioButton","_inlineAudioIcon","_inlineAudioContainer","_audioMetaPromise","_audioMetaApplied","_audioCoverObjectUrl","_videoMetaPromise","_videoMetaApplied","_videoCoverObjectUrl","_imageModal","validation","_setState","_renderIcon","_renderTextFields","_renderDownloadField","_enrichVideoMetadata","_renderPreview","iconField","imageSrc","_getImageIconSrc","_renderDefaultIcon","_isPreviewGroupEnabled","_bindIconImageToModal","displayName","_getDisplayName","_getFileName","hasDataTitle","_hasDataDrivenDisplayName","nameField","_isAudioFile","_renderAudioNameField","_applyNameClampStyles","extField","sizeField","originalNameField","original_name","_toggleInlineAudio","rootFile","_setInlineAudioProgress","isCurrentAudioPlaying","_activeAudioOwner","paused","_syncInlineAudioIcon","_enrichAudioMetadata","_stopInlineAudio","Audio","_syncInlineAudioProgress","isPlaying","progress","percent","downloadField","downloadLabel","downloadIcon","fieldTag","objectUrl","_downloadByLink","rel","_createAudioFileFromSource","_isVideoFile","_createMediaFileFromSource","muted","crossOrigin","onResolve","onReject","videoWidth","videoHeight","seekTime","seekVideo","time","onSeeked","canvas","ctx","getContext","drawImage","posterBlob","canvasToBlob","quality","toBlob","waitEvent","extractVideoMetadata","defaultType","lastModified","imageNode","modalSrc","modalTitle","nodeSrc","nodeTitle","isNameOnly","_shouldRenderPreviewForCurrentFile","_resolvePreviewContainer","autoCreate","rendered","renderer","_isRendererEnabled","disabledPreview","editablePreview","existedPreview","_isImageFile","_isOfficeFile","_isArchiveFile","_isTextFile","rendererName","groupName","textOverflow","whiteSpace","stopActiveInlineAudio","owner","stopActiveInlineAudioIfDetached","nodes","_getDataDisplayName","dataName","VGFilesBase","_tpl","_files","_errors","_fileObjectUrls","_audioMetaPromises","stat","_getClass","_onNativeInputChange","change","_applyRenameToIncomingFiles","files","rename","newName","_generateRenamedFileName","renamed","writable","safeOriginal","dotIndex","hasExt","stamp","seq","normalizedBase","limits","_preventOriginalInputFromSubmit","_cleanupFakeInputs","_addEventListener","incomingFiles","filesArray","isSingle","clear","_revokeUrls","_cleanupErrors","_filterFiles","reverse","allowed","_updateStat","_renderUI","_generateHiddenInputs","incoming","filesToProcess","_mergeFilesByOrder","_renderErrors","ordered","_getFileKey","_getFileCustomData","customData","_toDataAttributeKey","_toDataAttributeValue","_buildFileDataAttributes","baseAttrs","attrKey","maxSize","maxTotalSize","currentTotalSize","filtered","types","_getSizes","totalSize","f","pow","Intl","NumberFormat","unitDisplay","maximumFractionDigits","$errorCont","_getFallbackErrors","errKey","msg","_renderUIDropList","_renderInfoList","_renderUIStatusDropInfoAjax","_parseTemplate","fallbackTemplate","tmpl","bufferTemplate","temp","liElement","liClasses","liClassList","childCount","childElementCount","liClassName","$list","$itemsTemplate","$itemsTemplateClasses","fragment","createDocumentFragment","detach","_renderTemplatePart","isDrop","$li","$message","currentChildren","existingByKey","_getInfoNodeKey","nextNodes","fileKey","signature","_getInfoItemSignature","existingNode","iterationNode","_createInfoListItem","removedNodes","_initFilePreviewInInfo","_resolveDisplayName","previewPath","_resolveFilePreviewPath","pName","pSize","pType","itemsTemplate","itemTemplateClasses","liAttrs","_renderUIImage","_renderUIInfo","_wrapInFileCustom","_renderUIDetach","$part","cloneNode","_replaceTemplateSlot","replacement","replaceWith","_setButtonElement","$container","audioCover","_getFileObjectUrl","_getIconByFileType","audioTitle","_setFileCustomDataValue","pending","task","coverKey","coverUrl","allSettled","results","$count","idInput","baseName","vgFiles","DataTransfer","resetInput","detachedNodes","$infoList","$dropList","_resetFileInput","isRestore","maxParallel","maxConcurrent","retryAttempts","retryDelay","uploads","completed","queue","waitingPromises","activeCount","isPaused","allComplete","_checkAllCompleteBound","checkAllComplete","uploadFile","generateId","uploadData","attempts","startTime","endTime","controller","_addToSequentialQueue","_startParallelUpload","uploadFiles","promises","_processSequentialQueue","_executeUpload","_notifyWaiting","attempt","_performUpload","_completeUpload","notifyProgress","_delay","notifyError","formData","additionalData","notifyComplete","cancelUpload","queueIndex","splice","resume","getStats","all","u","uploading","failed","cancelled","queueLength","totalSizeFormatted","printDebugStats","groupEnd","substr","ms","every","notifyAllComplete","onComplete","onAllComplete","cb","_safeCall","isIdle","hasActiveUploads","hasPendingInQueue","hasWaitingPromises","hasRunningUploads","offAll","CLASS_NAME_DROP","CLASS_NAME_DROP_ACTIVE","CLASS_NAME_DROP_HOVER","VGFilesDroppable","_instances","smartdrop","_smartInstances","_bindGlobalEvents","_findInput","isSortableDrag","plain","getData","_setDropMessageTitleState","_isGlobalEventsBound","_globalHandlers","dragenter","_updateSuggestedDrop","dragover","dragleave","_isFileDrag","_clearSuggestedDrop","activeDrop","_activeSuggestedDrop","dragend","visibleDrops","_getVisibleDropZonesInViewport","dropZone","dt","kind","_isVisibleInViewport","opacity","dropElement","isActive","originalText","activeText","_unbindGlobalEvents","getFiles","parsedFiles","$targetNode","area","_nativeRenderFiles","$node","$items","_setTemplateInBuffer","rawData","_parseDataFile","dataFile","binaryMeta","_extractBinaryMeta","_toStringOrNull","_toNumberOrNull","binary","originFile","firstItem","SELECTOR_DATA_RELOAD","SELECTOR_DATA_DISMISS","CLASS_NAME_CONTAINER","CLASS_NAME_STAT","CLASS_NAME_COMPLETED","CLASS_NAME_PENDING","CLASS_NAME_LOADING","CLASS_NAME_FAILING","CLASS_NAME_LOADED","VGFiles","removes","alert","single","onUploadProgress","onUploadComplete","onUploadError","onUploadAllComplete","onRemoveFile","onClear","onReload","_uploadedKeys","_failingUploadedKeys","_pendingUploadedKeys","_unUploadedFiles","_uploader","isRenderNonInit","_initExtended","VGFilesTemplateRender","_addExternalFiles","_setDropActiveText","_addEventListenerExtended","_renderStat","fileData","fileOptions","_setStatItem","VGFilesSortable","inputFiles","_snapshotInputFiles","uploadAll","_triggerEvent","notUploadedFiles","FileUploader","_setupUploadEventHandlers","uploadParams","$item","_getItemElement","_getButtonElement","fileRemove","bytesSent","totalBytes","_setFailingButtons","default","uploaded","dataButton","fileToRetry","_runAjaxRequest","paramsAjax","previousAjax","_normalizeConfirmResult","_runDefaultRemoveConfirm","_isPlainObject","_mergeButtonConfigs","configs","_getDefaultRemoveConfirmButtons","_getRemoveConfirmButtons","_confirmRemove","confirmParams","customConfirm","removeFile","emitRemove","fileToRemove","btnId","btnName","btnSize","_updateStatsAfterRemove","routeBase","routeSeparator","_completeRemoveFile","isAjax","$progress","$statList","$value","suffix","stopImmediatePropagation","_completeClearAll","VGHideShowPass","parentClass","isShow","HTML","insert","EVENT_SUBMIT_DATA_API","VGFormSender","errors","redirect","submit","pass","closeModalsBeforeModal","closeModalsBeforeToast","alertCollapse","alertModal","wasValidate","afterInit","afterSuccess","afterError","afterSend","interceptors","beforeSend","initial","_cachedElements","_initElements","isBtnText","isJsonParse","isShowPass","_this","_alertBefore","mergeFormData","replacedKeys","_alertError","_alertSuccess","collapseClass","collapses","getElementsByClassName","_statusButton","vgformsender","self","_jsonParse","went_wrong","_alertModal","_alertCollapse","_alertToast","isStackedModal","_hasOpenedModals","_closeOpenedModals","$modal","_setStackedModalState","$body","setDataRelationStatus","_getNextModalZIndex","indexes","bootstrap","Modal","bootstrap_not_found","mVG","$collapse","collapse","_prepareAlertResponse","toastParams","_getToastParams","toastType","flatToastParams","$element","$alert","buttonClick","formID","checkValidity","collectData","arguments","converter","defaultAttributes","expires","daysInMs","toUTCString","stringifiedAttributes","attributeName","sanitizedValue","cookie","write","create","cookies","jar","encodedKey","foundKey","read","withAttributes","withConverter","freeze","VGLawCookie","_storage","_createStorage","_isConsented","Cookies","accept","getDefaultParams","EVENT_KEY_BEFORE_LOAD","CLASS_NAME_HIDE","VGLoadMore","limit","animate","_isScrollMode","_isToggleElement","_initializeAsButton","_initializeContainer","_initScrollMode","itemClass","_createAndInsertButton","buttonText","buttonData","_setupIntersectionObserver","_observeLastVisibleItem","IntersectionObserver","isIntersecting","rootMargin","visibleItems","staticLoad","targetSelector","targetEl","responseTarget","_restoreElementState","noMoreData","_autohideTrigger","newItems","initialized","CLASS_NAME_ACTIVE","VGNav","breakpoint","hoversmoothfirstlevel","horizontalOnly","hamburger","always","afterClick","hamburgerActive","hamburgerAlways","expand","cloned","flip","XXXL","XXL","XL","LG","MD","SM","XS","_navigation","_openDrops","_pointerPosition","_handleScroll","_handleResize","mobileNavTitle","$dropdown_a","$placement","scrollHandler","resizeHandler","capture","dropData","offsetParent","_isElementInViewport","_cleanupDrop","viewHeight","viewWidth","vertInView","horInView","_updatePointerPosition","x","y","_isHorizontalPointerMove","dx","dy","_isFirstLevelDropdown","_hasDirectDropdownContent","_isAdjacentDropdown","relatedDrop","_canSmoothSwitchFirstLevel","currentDrop","smoothParams","drops","previousDrop","useSmoothSwitch","hideOpenDrops","nextDrop","vgNavSidebar","nav","isFirst","dropContent","CLASS_ITEM_DRAGGING","CLASS_PLACEHOLDER","CLASS_INNER","CLASS_HANDLE","CLASS_HANDLE_ICON","CLASS_COLLAPSE_TOGGLE","CLASS_DROP_TARGET","CLASS_DROP_DENIED","EVENT_KEY_START","EVENT_KEY_CHANGE","EVENT_KEY_END","EVENT_KEY_SAVE","EVENT_KEY_INIT","EVENT_KEY_REFRESH","EVENT_KEY_POINTER_DOWN","EVENT_KEY_MOVE","EVENT_KEY_DROP","EVENT_KEY_TRANSFER","EVENT_KEY_PLACEHOLDER_MOVE","EVENT_KEY_DESTROY","VGNestable","listselector","itemselector","handleselector","idattribute","childlistclass","handleicon","indent","maxdepth","moveaxis","hoverthreshold","neighborchangethreshold","showplaceholder","connect","showtext","hidetext","pointerdown","move","placeholdermove","transfer","save","_rootList","_resolveRootList","_placeholder","_dragElement","_dragLayer","_startSnapshot","_sourceInstance","_lastDropInstance","_activeDropList","_mouse","startItemX","grabOffsetX","grabOffsetY","_previousBodyCursor","_boundOnMouseDown","_onMouseDown","_boundOnMouseMove","_onMouseMove","_boundOnMouseUp","_onMouseUp","_boundOnPointerDown","_boundOnPointerMove","_boundOnPointerUp","_boundOnPointerCancel","_onPointerCancel","_boundOnTouchStart","_onTouchStart","_boundOnTouchMove","_onTouchMove","_boundOnTouchEnd","_onTouchEnd","_boundOnTouchCancel","_onTouchCancel","_boundOnKeyDown","_supportsPointerEvents","_activePointerId","_activeTouchId","_keyboardDraggedItem","_keyboardStartSnapshot","_registerGroup","serialize","_getEventKey","_getGroupName","_groups","_unregisterGroup","_getConnectedInstances","_findOwnerInstanceByElement","_canAcceptItem","sourceInstance","_getItems","_ensureItemLayout","_syncItemCollapse","inner","_getDirectChildBySelector","childList","hasCollapseClass","safeShowText","safeHideText","_ensureInnerLayout","ownHandle","_serializeList","ajaxParams","_clearDragState","_clearKeyboardDragState","_startInteraction","_processDragMove","_finishDrag","_cancelDrag","changedTouches","touch","identifier","_findTouchById","touches","isToggleKey","_isKeyboardDragHandle","_startKeyboardDrag","_finishKeyboardDrag","moveAnnouncement","moveAxis","_getMoveAxis","allowVertical","allowHorizontal","_moveKeyboardUp","_moveKeyboardDown","_indentKeyboard","_outdentKeyboard","_cleanupEmptyLists","targetInstance","mouse","_getKeyboardDragInstructions","draggedItem","previousPayload","_getPreviousItem","_getNextItem","parentCandidate","_getOrCreateChildList","_isDepthExceeded","currentList","parentItem","targetList","rawAxis","itemRect","_startDrag","_moveDragElement","pointerTarget","_getPointerTarget","_setDropListState","hoveredItem","_resolveDropList","_resolveMode","_placePlaceholderWhenExplicitlyNeeded","_placePlaceholder","_currentTargetInstance","hadDrag","sourcePayload","targetPayload","placeholderParent","touchList","_sourceRoot","_createPlaceholder","_createDragElement","dragEl","elementFromPoint","pointerX","pointerY","indentValue","neighborThresholdPercent","edgeRatio","topBorder","bottomBorder","listDepth","_getListDepth","maxDepth","_getItemSubtreeDepth","childItems","childItem","placeholder","beforeNode","currentParent","currentNext","lastItem","firstRect","lastRect","denied","live","border","clip","clipPath","STATUS_CLASS_SUCCESS","STATUS_CLASS_WARNING","STATUS_CLASS_DANGER","STATUS_CLASSES","resolveStatusToneByValue","warningBelow","dangerBelow","warningThreshold","resolveStatusTone","helpers","resolveStatusSourceValue","isRange","by","syncStatusClasses","tone","resolveStatusLabel","labelWords","CLASS_NAME_MODULE","CLASS_NAME_TOOLTIP_HIDDEN","EVENT_KEY_INPUT","EVENT_KEY_UPDATE","range","tooltips","separator","skin","ruler","dimInactive","onInput","onUpdate","formatValue","VGRangeSlider","_sourceInput","_buildParams","_isRange","_resolveRangeMode","_listeners","_syncUI","_dom","fill","inputFrom","inputTo","tooltipFrom","tooltipTo","tooltipMerged","labelFrom","labelTo","labelSeparator","hiddenMin","hiddenMax","_buildState","_setDisabledState","getValue","setValue","silent","_normalizeValue","words","word","_resolveStartValues","_renderFromInput","_renderFromContainer","applyRangeSliderSkin","createRulerSkin","toPositionPx","buildRulerValues","ticks","mark","_formatValue","_toPositionPx","sourceInput","tooltip","_createTooltip","_createLabels","insertAdjacentElement","autocomplete","_createRangeInput","_ensureHiddenInput","inputHandler","changeHandler","_toPercent","fromPosition","toPosition","_placeTooltip","_syncTooltips","_syncTargets","syncRangeSliderSkin","syncStatusLabels","dom","fromLabel","toLabel","tick","_setText","mergedTooltip","fromTooltip","toTooltip","styles","thumbSize","safeValue","clamped","stepped","_getStatusBy","_getStatusPercentByValue","_getStatusToneByValue","_getStatusLabelByTone","_getStatusDetail","fromValue","toValue","sourceValue","vgrangesliderInitialized","VGRollup","cnt","more","less","isOffset","_hide","_show","switch","isButtonAppend","selfHeight","setHeight","showNum","elementClass","ellipsisCfg","isEllipsis","isButton","_setupTextContent","_setupElementsContent","lineClamp","shouldShowButton","textShowNum","textNum","btnTextMore","btnHTML","switcher","CLASS_NAME_OPTION","CLASS_NAME_TAG","CLASS_NAME_TAG_REMOVE","EVENT_KEY_UP_DATA_API","EVENT_RESET_DATA_API","EVENT_KEY_SEARCH","EVENT_KEY_SELECT","EVENT_KEY_DESELECT","CLASS_NAME_DROPDOWN","CLASS_NAME_LIST","CLASS_NAME_CURRENT","CLASS_NAME_PLACEHOLDER","CLASS_NAME_SEARCH","CLASS_NAME_TAGS","CLASS_NAME_LOAD_MORE","CLASS_NAME_DROP_UP","EVENT_KEY_REBUILD","EVENT_KEY_OPEN","EVENT_KEY_CLOSE","EVENT_KEY_CLEAR","EVENT_KEY_ERROR","EVENT_KEY_LOAD_NEXT","SELECTOR_CURRENT","SELECTOR_DROPDOWN","SELECTOR_SEARCH_INPUT","SELECTOR_LIST","SELECTOR_LOAD_MORE_BTN","DATA_ATTR_COPY_EXCLUDE_DEFAULT","VGSelect","remote","minterm","pageParam","termParam","perpage","loadMoreText","tree","exclude","onShow","onHide","onSelect","onDeselect","onLoadNext","_observerTimeout","_searchTerm","_currentPage","_totalPages","_loading","_remoteSearchRequestId","_remoteSearchAbortController","_positioningScrollParent","_boundUpdateDropdownPlacement","_updateDropdownPlacement","_initObserver","_initLoadMoreButton","_callCallback","buildListOptions","optGroups","isTree","_isTreeEnabled","optGroup","_createListItems","frag","baseDepth","treeEnabled","rawValueAttr","isEmptyOption","optionLevelRaw","optionLevel","_getDataAttrCopyExclusions","customExcluded","_normalizeDataAttrKey","isPlaceholderValue","select","placeholderValue","v","hasExplicitSelectedOption","opt","hasSelectedValidOption","reBuild","inited","elData","excludeDataAttrs","isMultiple","cssText","inst","showPlaceholder","updateUI","searchTimeout","term","_fetchRemoteData","_filterLocalOptions","_getPositionMode","_setupDropdownPlacement","_teardownDropdownPlacement","MutationObserver","mutations","mutation","wasShown","_updateFromMutation","attributeFilter","subtree","characterData","_getOverflowAncestor","startEl","overflowX","_getClipRect","containerRect","spaceBelow","spaceAbove","openUp","available","listMax","prevCount","newText","changeSelector","wasSelected","selectedText","changeSelectorByIndex","arg","isRebuild","targetIsToggle","textAlign","fontWeight","_loadNextPage","_hideLoadMoreButton","_showLoading","addOptions","preserve","current_page","total_pages","wasOpen","isEmptyText","isHidden","isSelectedAttr","optionsData","parentOptGroup","og","appendOption","k","appendTreeOptions","optgroup","indexStr","realOpt","t","EVENT_KEYS","HIDE","HIDDEN","SHOW","SHOWN","LOADED","KEYDOWN_DISMISS","HIDE_PREVENTED","CLICK_DATA_API","POPSTATE_DATA_API","DOM_LOADED_DATA_API","VGSidebar","_showPopstateHandler","DATA_API_KEY","EVENT_ACTIVATE","EVENT_CLICK","EVENT_LOAD_DATA_API","SELECTOR_TARGET_LINKS","SELECTOR_NAV_LINKS","SELECTOR_LINK_ITEMS","VGSpy","_configAfterMerge","smoothScroll","_targetLinks","_observableSections","_rootElement","_activeTarget","_scrollbarListener","_previousScrollData","visibleEntryTop","parentScrollTop","_initializeTargetsAndObservables","_updateRootElement","_maybeEnableSmoothScroll","_setupTracking","_updateSmoothScrollbar","_setupScrollbarTracking","_teardownScrollbarTracking","_rebuildObserver","_isScrollableSelf","Scrollbar","scrollbar","addListener","removeListener","_onScrollbarScroll","_getParentScrollTop","userScrollsDown","activationLine","_getActivationLine","_getSectionTop","activeLink","_process","rootHeight","pct","isNaN","px","_getNewObserver","_normalizeScrollRoot","firstSection","_isScrollable","_getScrollParent","HTMLElement","rootRect","_getTargetIdFromTrigger","revealed","_observerCallback","getTargetLink","_clearActiveClass","entryTop","isEntryBelow","links","_activateParents","dropdownToggle","parentGroup","activeLinks","_safeDecode","decodeURI","isInitialized","spy","readyState","EVENT_HIDE","EVENT_HIDDEN","EVENT_SHOW","EVENT_SHOWN","EVENT_LOADED","EVENT_KEYDOWN","NAV_KEYS","ARROW_RIGHT_KEY","ARROW_DOWN_KEY","HOME_KEY","END_KEY","INNER_SELECTOR","DATA_TOGGLE","SELECTOR","DROPDOWN_TOGGLE","DROPDOWN_MENU","TAB_CLASS","TAB_PANEL","OUTER","INNER","INNER_ELEM","DATA_TOGGLE_ACTIVE","VGTabs","slide","_main_parent","TypeError","_setInitialAttributes","_getChildren","_setInitialSlider","_setTabHash","_keydown","innerElem","_elemIsActive","activeElem","_getActiveElem","hideEvent","_deactivate","_activate","_toggleDropDown","nextActiveElement","isNext","preventScroll","slider","offsetLeft","_setAttributeIfNotExists","_setInitialAttributesOnChild","_getInnerElement","outerElem","_getOuterElement","_setInitialAttributesOnTargetPanel","attribute","SELECTOR_DATA_TOGGLE_POPOVER","SELECTOR_OPEN_TRIGGER","EVENT_KEY_MOUSEENTER","EVENT_KEY_MOUSELEAVE","EVENT_KEY_KEYDOWN","PLACEMENT_CLASSES","popover","closeOnOutsideClick","closeOther","custom","VGTooltip","_tooltip","_showTimeout","_fixTitle","_handleUpdate","_clearTimeouts","_hideOpenedTooltips","_addWindowListeners","_removeWindowListeners","originalTitle","vgOriginalTitle","_getTitle","titleBlock","contentBlock","vgTitle","_syncPlacementClass","_setArrowPlacement","triggerRect","innerRect","triggerCenterX","triggerCenterY","arrowPadding","arrowLeft","arrowTop","getShownInstances","defaultModules","_modules","_initializer","initializer","register","modules","flatMap","Module","moduleKeys","_ensureInitialized","moduleConfig","_resolveModuleConfig","app"],"sourceRoot":""}
|