@hienlh/ppm 0.13.50 → 0.13.51
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/CHANGELOG.md +6 -0
- package/assets/skills/ppm/SKILL.md +1 -1
- package/assets/skills/ppm/references/http-api.md +1 -1
- package/dist/web/assets/ai-settings-section-AuV6Lzz2.js +1 -2
- package/dist/web/assets/api-client-DIhJ5qVW.js +1 -2
- package/dist/web/assets/api-settings-C3T95dWg.js +1 -2
- package/dist/web/assets/arrow-up-Rcw6_KKu.js +1 -2
- package/dist/web/assets/{audio-preview-CILFIsuu.js → audio-preview-BQWWkcm0.js} +1 -2
- package/dist/web/assets/{chat-tab-DBYwH_Aa.js → chat-tab-B-QMa-uT.js} +5 -6
- package/dist/web/assets/chevron-right-DnHIvvcy.js +1 -2
- package/dist/web/assets/code-DGBecc50.js +1 -2
- package/dist/web/assets/{code-editor-MXnkYRLp.js → code-editor-DChspYxh.js} +3 -4
- package/dist/web/assets/{conflict-editor-C6wH5wV6.js → conflict-editor-C1dZ8tsU.js} +2 -3
- package/dist/web/assets/createLucideIcon-BjHrJDVb.js +1 -2
- package/dist/web/assets/csv-parser-Dly5nqE1.js +1 -2
- package/dist/web/assets/csv-preview-B3Dyhgho.js +1 -2
- package/dist/web/assets/data-grid-overlay-editor-C1UUm7Ob.js +1 -2
- package/dist/web/assets/data-grid-types-D2cHE8hx.js +1 -2
- package/dist/web/assets/database-DOWH9-Vv.js +1 -2
- package/dist/web/assets/{database-viewer-BjUruZLv.js → database-viewer-2KW73oEG.js} +1 -2
- package/dist/web/assets/{diff-viewer-B_nU7bQi.js → diff-viewer-BMla30lw.js} +2 -3
- package/dist/web/assets/dist-BoIkGNC8.js +1 -2
- package/dist/web/assets/dist-DVk8T0R5.js +1 -2
- package/dist/web/assets/esm-DCbn6xno.js +1 -2
- package/dist/web/assets/{extension-webview-B56ZfvoD.js → extension-webview-DpaCcCXq.js} +2 -3
- package/dist/web/assets/file-exclamation-point-BwzaQ50n.js +1 -2
- package/dist/web/assets/file-store-DOxcU_7s.js +1 -2
- package/dist/web/assets/{glide-data-grid-D-qQqqp7.js → glide-data-grid-D08bJMrD.js} +2 -3
- package/dist/web/assets/globe-B4Ilypbs.js +1 -2
- package/dist/web/assets/{image-preview-Dc6AiqYX.js → image-preview-DVQkHkSo.js} +1 -2
- package/dist/web/assets/{index-8_rE2Q1-.js → index-U7GK_3ED.js} +3 -4
- package/dist/web/assets/input-_LFQwhzd.js +1 -2
- package/dist/web/assets/katex-C10ndCVt.js +1 -2
- package/dist/web/assets/keybindings-store-B9gpby19.js +1 -0
- package/dist/web/assets/lib-C2D8j3K3.js +1 -2
- package/dist/web/assets/{markdown-renderer-CNQ8I0Dk.js → markdown-renderer-B4_rx1aO.js} +2 -3
- package/dist/web/assets/notification-store-7WlicqzJ.js +1 -0
- package/dist/web/assets/number-overlay-editor-CyEqxXcg.js +1 -2
- package/dist/web/assets/panel-store-C8wwxBpn.js +1 -2
- package/dist/web/assets/{pdf-preview-zs9QdgDp.js → pdf-preview-D16LLBdq.js} +1 -2
- package/dist/web/assets/{port-forwarding-tab-sArYx1nt.js → port-forwarding-tab-CoKoquJZ.js} +1 -2
- package/dist/web/assets/{postgres-viewer-khk7N7cd.js → postgres-viewer-B45DfArf.js} +2 -3
- package/dist/web/assets/react-DMIOAtcX.js +1 -2
- package/dist/web/assets/refresh-cw-BjrAbUJe.js +1 -2
- package/dist/web/assets/scroll-area-BDi_FNzr.js +1 -2
- package/dist/web/assets/search-tM8K5zWU.js +1 -2
- package/dist/web/assets/settings-store-8FpQDjEA.js +1 -2
- package/dist/web/assets/{settings-tab-CGWhVzQm.js → settings-tab-Dc8TBxJQ.js} +1 -1
- package/dist/web/assets/sparkles-CulWHe4c.js +1 -2
- package/dist/web/assets/{sql-query-editor-B5Ndypxp.js → sql-query-editor-DMk0nmOO.js} +2 -3
- package/dist/web/assets/{sqlite-viewer-BkpONSGa.js → sqlite-viewer-G81XimpL.js} +1 -2
- package/dist/web/assets/tab-store-CNas5Ny8.js +1 -2
- package/dist/web/assets/table-BzjWcs87.js +1 -2
- package/dist/web/assets/{terminal-tab-BgMCsdeN.js → terminal-tab-rslAfxoV.js} +2 -3
- package/dist/web/assets/text-wrap-DJz9Bgpa.js +1 -2
- package/dist/web/assets/use-blob-url-DB4nNruT.js +1 -2
- package/dist/web/assets/use-monaco-theme-DEI-tJAh.js +1 -2
- package/dist/web/assets/utils-CQux7CsO.js +1 -2
- package/dist/web/assets/vendor-markdown-0Mxgxy0L.js +1 -2
- package/dist/web/assets/vendor-mermaid-D2KKkqNs.js +1 -2
- package/dist/web/assets/vendor-ui-UXCWAcmi.js +1 -2
- package/dist/web/assets/vendor-xterm-D1P36hcr.js +1 -2
- package/dist/web/assets/{video-preview-w8ZAy8av.js → video-preview-vjw8RpLK.js} +1 -2
- package/dist/web/assets/x-BPReZWnP.js +1 -2
- package/dist/web/index.html +1 -1
- package/dist/web/sw.js +1 -2
- package/package.json +1 -1
- package/src/web/components/chat/chat-tab.tsx +6 -4
- package/src/web/components/layout/tab-pool.tsx +1 -1
- package/src/web/hooks/use-chat.ts +7 -6
- package/vite.config.ts +1 -1
- package/dist/web/assets/ai-settings-section-AuV6Lzz2.js.map +0 -1
- package/dist/web/assets/api-client-DIhJ5qVW.js.map +0 -1
- package/dist/web/assets/api-settings-C3T95dWg.js.map +0 -1
- package/dist/web/assets/arrow-up-Rcw6_KKu.js.map +0 -1
- package/dist/web/assets/audio-preview-CILFIsuu.js.map +0 -1
- package/dist/web/assets/chat-tab-DBYwH_Aa.js.map +0 -1
- package/dist/web/assets/chevron-right-DnHIvvcy.js.map +0 -1
- package/dist/web/assets/code-DGBecc50.js.map +0 -1
- package/dist/web/assets/code-editor-MXnkYRLp.js.map +0 -1
- package/dist/web/assets/conflict-editor-C6wH5wV6.js.map +0 -1
- package/dist/web/assets/createLucideIcon-BjHrJDVb.js.map +0 -1
- package/dist/web/assets/csv-parser-Dly5nqE1.js.map +0 -1
- package/dist/web/assets/csv-preview-B3Dyhgho.js.map +0 -1
- package/dist/web/assets/data-grid-overlay-editor-C1UUm7Ob.js.map +0 -1
- package/dist/web/assets/data-grid-types-D2cHE8hx.js.map +0 -1
- package/dist/web/assets/database-DOWH9-Vv.js.map +0 -1
- package/dist/web/assets/database-viewer-BjUruZLv.js.map +0 -1
- package/dist/web/assets/diff-viewer-B_nU7bQi.js.map +0 -1
- package/dist/web/assets/dist-BoIkGNC8.js.map +0 -1
- package/dist/web/assets/dist-DVk8T0R5.js.map +0 -1
- package/dist/web/assets/esm-DCbn6xno.js.map +0 -1
- package/dist/web/assets/extension-webview-B56ZfvoD.js.map +0 -1
- package/dist/web/assets/file-exclamation-point-BwzaQ50n.js.map +0 -1
- package/dist/web/assets/file-store-DOxcU_7s.js.map +0 -1
- package/dist/web/assets/glide-data-grid-D-qQqqp7.js.map +0 -1
- package/dist/web/assets/globe-B4Ilypbs.js.map +0 -1
- package/dist/web/assets/image-preview-Dc6AiqYX.js.map +0 -1
- package/dist/web/assets/index-8_rE2Q1-.js.map +0 -1
- package/dist/web/assets/input-_LFQwhzd.js.map +0 -1
- package/dist/web/assets/katex-C10ndCVt.js.map +0 -1
- package/dist/web/assets/keybindings-store-COJD5O6M.js +0 -1
- package/dist/web/assets/lib-C2D8j3K3.js.map +0 -1
- package/dist/web/assets/markdown-renderer-CNQ8I0Dk.js.map +0 -1
- package/dist/web/assets/notification-store-BiZaLXop.js +0 -1
- package/dist/web/assets/number-overlay-editor-CyEqxXcg.js.map +0 -1
- package/dist/web/assets/panel-store-C8wwxBpn.js.map +0 -1
- package/dist/web/assets/pdf-preview-zs9QdgDp.js.map +0 -1
- package/dist/web/assets/port-forwarding-tab-sArYx1nt.js.map +0 -1
- package/dist/web/assets/postgres-viewer-khk7N7cd.js.map +0 -1
- package/dist/web/assets/react-DMIOAtcX.js.map +0 -1
- package/dist/web/assets/refresh-cw-BjrAbUJe.js.map +0 -1
- package/dist/web/assets/scroll-area-BDi_FNzr.js.map +0 -1
- package/dist/web/assets/search-tM8K5zWU.js.map +0 -1
- package/dist/web/assets/settings-store-8FpQDjEA.js.map +0 -1
- package/dist/web/assets/sparkles-CulWHe4c.js.map +0 -1
- package/dist/web/assets/sql-query-editor-B5Ndypxp.js.map +0 -1
- package/dist/web/assets/sqlite-viewer-BkpONSGa.js.map +0 -1
- package/dist/web/assets/tab-store-CNas5Ny8.js.map +0 -1
- package/dist/web/assets/table-BzjWcs87.js.map +0 -1
- package/dist/web/assets/terminal-tab-BgMCsdeN.js.map +0 -1
- package/dist/web/assets/text-wrap-DJz9Bgpa.js.map +0 -1
- package/dist/web/assets/use-blob-url-DB4nNruT.js.map +0 -1
- package/dist/web/assets/use-monaco-theme-DEI-tJAh.js.map +0 -1
- package/dist/web/assets/utils-CQux7CsO.js.map +0 -1
- package/dist/web/assets/vendor-markdown-0Mxgxy0L.js.map +0 -1
- package/dist/web/assets/vendor-mermaid-D2KKkqNs.js.map +0 -1
- package/dist/web/assets/vendor-ui-UXCWAcmi.js.map +0 -1
- package/dist/web/assets/vendor-xterm-D1P36hcr.js.map +0 -1
- package/dist/web/assets/video-preview-w8ZAy8av.js.map +0 -1
- package/dist/web/assets/x-BPReZWnP.js.map +0 -1
- package/dist/web/sw.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"mappings":";uuCAkBA,IAAM,GAAS,EAAiB,SATb,CACjB,CACE,OACA,CACE,EAAG,qJACH,IAAK,SACN,CACF,CACF,CACoD,CCE/C,GAAO,EAAiB,OAXX,CACjB,CACE,OACA,CACE,EAAG,qGACH,IAAK,SACN,CACF,CACD,CAAC,OAAQ,CAAE,EAAG,4CAA6C,IAAK,SAAU,CAAC,CAC3E,CAAC,OAAQ,CAAE,EAAG,yBAA0B,IAAK,SAAU,CAAC,CACzD,CACgD,CCbpC,GAAe,4WAW3B,CAEY,GAAgB,CAAC,QAAS,MAAO,MAAO,MAAO,MAAM,CACrD,GAAY,CAAC,IAAK,KAAM,KAAM,IAAK,IAAK,KAAM,KAAM,OAAQ,QAAS,KAAM,SAAU,UAAW,UAAW,cAAc,CACzH,GAAY,CAAC,MAAO,OAAO,CAGlC,GAAc,IAAI,IAElB,GAAe,IAAI,IAAI,+JAI5B,CAAC,CAGF,SAAgB,GAAiB,EAAc,CAC7C,IAAM,EAAY,IAAI,IAChB,EAAW,IAAI,IAGf,EAAU,EAAK,SAAS,mMAAmM,CACjO,IAAK,IAAM,KAAK,EAAS,CACvB,IAAM,EAAM,EAAE,GACd,EAAU,IAAI,EAAI,CAClB,IAAM,EAAQ,EAAE,IAAM,EAAE,GACpB,GAAS,CAAC,GAAa,IAAI,EAAM,aAAa,CAAC,EACjD,EAAS,IAAI,EAAM,aAAa,CAAE,EAAI,CAG1C,MAAO,CAAE,YAAW,WAAU,CAIhC,SAAgB,GAAa,EAAc,EAAuC,CAChF,OAAO,EAAS,IAAI,EAAK,aAAa,CAAC,EAAI,EAI7C,eAAe,GAAW,EAAmB,EAAmE,CAC9G,IAAM,EAAM,EAAU,aAAa,CAC/B,EAAO,GAAY,IAAI,EAAI,CAC/B,GAAI,CAAC,EACH,GAAI,CACF,EAAO,MAAM,EAAW,WAAW,EAAU,CAC7C,GAAY,IAAI,EAAK,EAAK,MACpB,CAAE,EAAO,EAAE,CAErB,OAAO,EAIT,eAAe,GACb,EACA,EACA,EACA,EACgD,CAChD,IAAM,EAA+C,EAAE,CACjD,EAAO,IAAI,IACjB,IAAK,IAAM,KAAO,EAAW,CAC3B,IAAM,EAAO,MAAM,GAAW,EAAK,EAAW,CAC9C,IAAK,IAAM,KAAO,EAAM,CACtB,GAAI,EAAK,IAAI,EAAI,KAAK,CAAE,SACxB,EAAK,IAAI,EAAI,KAAK,CAClB,IAAM,EAAa,QAAQ,KAAK,EAAI,KAAK,CACzC,EAAM,KAAK,CACT,MAAO,EAAI,KACX,KAAM,EAAO,UAAU,mBAAmB,MAC1C,OAAQ,GAAG,EAAI,KAAK,EAAI,OACxB,WAAY,EAAa,IAAI,EAAI,KAAK,GAAK,EAAI,KAC/C,QACA,SAAU,IAAM,EAAI,KACrB,CAAC,EAGN,OAAO,EAQT,SAAgB,GAAqB,EAAmC,CAEtE,GAAI,cAAc,KAAK,EAAkB,CAAE,MAAO,MAIlD,IAAM,EAAkB,EAAkB,MAAM,6EAA6E,CAC7H,GAAI,EAAiB,CACnB,IAAM,EAAU,EAAgB,GAAI,aAAa,CAEjD,OADI,IAAY,OAAS,IAAY,OAAe,kBAC7C,iBAsBT,MAlBI,sDAAsD,KAAK,EAAkB,CAAS,oBAGtF,sCAAsC,KAAK,EAAkB,CAAS,WAGtE,4CAA4C,KAAK,EAAkB,CAAS,QAG5E,0DAA0D,KAAK,EAAkB,CAAS,cAG1F,0FAA0F,KAAK,EAAkB,CAAS,UAG1H,WAAW,KAAK,EAAkB,CAAS,aAGxC,UAGT,SAAgB,GACd,EACA,EAC6C,CAC7C,MAAO,CACL,kBAAmB,CAAC,IAAK,IAAI,CAC7B,uBAAwB,MAAO,EAAO,IAAa,CACjD,GAAI,CACF,IAAM,EAAoB,EAAM,gBAAgB,CAC9C,gBAAiB,EAAG,YAAa,EACjC,cAAe,EAAS,WAAY,UAAW,EAAS,OACzD,CAAC,CACI,EAAO,EAAM,qBAAqB,EAAS,CAC3C,EAA2B,CAC/B,gBAAiB,EAAS,WAAY,cAAe,EAAS,WAC9D,YAAa,EAAK,YAAa,UAAW,EAAK,UAChD,CAEK,CAAE,YAAW,YAAa,GADf,EAAM,UAAU,CACyB,CACpD,EAAqD,EAAE,CACvD,EAAM,GAAqB,EAAkB,CAGnD,GAAI,IAAQ,MAAO,CACjB,IAAM,EAAW,EAAkB,MAAM,cAAc,CACvD,GAAI,EAAU,CACZ,IAAM,EAAM,EAAS,GAEf,EAAO,MAAM,GADD,GAAa,EAAK,EAAS,CACJ,EAAW,CACpD,IAAK,IAAM,KAAO,EAAM,CACtB,IAAM,EAAa,QAAQ,KAAK,EAAI,KAAK,CACzC,EAAY,KAAK,CACf,MAAO,EAAI,KACX,KAAM,EAAO,UAAU,mBAAmB,MAC1C,OAAQ,EAAI,KACZ,WAAY,EAAa,IAAI,EAAI,KAAK,GAAK,EAAI,KAC/C,QACD,CAAC,EAGN,MAAO,CAAE,cAAa,CAIxB,GAAI,IAAQ,iBAAkB,CAC5B,IAAK,IAAM,KAAO,GAChB,EAAY,KAAK,CACf,MAAO,EACP,KAAM,EAAO,UAAU,mBAAmB,QAC1C,WAAY,EACZ,QACA,SAAU,IAAM,EACjB,CAAC,CAEJ,MAAO,CAAE,cAAa,CAIxB,GAAI,IAAQ,kBAAmB,MAAO,CAAE,YAAa,EAAE,CAAE,CAGzD,GAAI,IAAQ,oBAEV,OADA,EAAY,KAAK,GAAG,MAAM,GAAkB,EAAW,EAAY,EAAQ,EAAM,CAAC,CAC3E,CAAE,cAAa,CAIxB,GAAI,IAAQ,WAAY,CACtB,IAAK,IAAM,KAAM,GACf,EAAY,KAAK,CACf,MAAO,EACP,KAAM,EAAO,UAAU,mBAAmB,SAC1C,WAAY,EACZ,QACA,SAAU,IAAM,EACjB,CAAC,CAEJ,MAAO,CAAE,cAAa,CAIxB,GAAI,IAAQ,QAAS,CACnB,IAAK,IAAM,KAAK,EAAW,OACzB,EAAY,KAAK,CACf,MAAO,EAAE,KACT,KAAM,EAAO,UAAU,mBAAmB,OAC1C,OAAQ,EAAE,OACV,WAAY,EAAE,KACd,QACA,SAAU,IAAM,EAAE,KACnB,CAAC,CAEJ,MAAO,CAAE,cAAa,CAIxB,GAAI,IAAQ,cAEV,OADA,EAAY,KAAK,GAAG,MAAM,GAAkB,EAAW,EAAY,EAAQ,EAAM,CAAC,CAC3E,CAAE,cAAa,CAIxB,GAAI,IAAQ,UAAW,CAErB,GADA,EAAY,KAAK,GAAG,MAAM,GAAkB,EAAW,EAAY,EAAQ,EAAM,CAAC,CAC9E,eAAe,KAAK,EAAkB,CAAE,CAC1C,EAAY,KAAK,CACf,MAAO,IACP,KAAM,EAAO,UAAU,mBAAmB,MAC1C,WAAY,IACZ,QACA,SAAU,MACX,CAAC,CACF,IAAK,IAAM,KAAM,GACf,EAAY,KAAK,CACf,MAAO,GAAG,EAAG,IACb,KAAM,EAAO,UAAU,mBAAmB,SAC1C,WAAY,GAAG,EAAG,MAClB,gBAAiB,EAAO,UAAU,6BAA6B,gBAC/D,QACA,SAAU,IAAM,EACjB,CAAC,CAGN,IAAK,IAAM,KAAM,GACf,EAAY,KAAK,CACf,MAAO,EAAI,KAAM,EAAO,UAAU,mBAAmB,QACrD,WAAY,EAAI,QAAO,SAAU,IAAM,EACxC,CAAC,CAEJ,MAAO,CAAE,cAAa,CAIxB,GAAI,IAAQ,cAAgB,EAAU,KAAO,EAE3C,OADA,EAAY,KAAK,GAAG,MAAM,GAAkB,EAAW,EAAY,EAAQ,EAAM,CAAC,CAC3E,CAAE,cAAa,CAIxB,IAAK,IAAM,KAAM,GACf,EAAY,KAAK,CACf,MAAO,EAAI,KAAM,EAAO,UAAU,mBAAmB,QACrD,WAAY,EAAI,QAAO,SAAU,IAAM,EACxC,CAAC,CAEJ,IAAK,IAAM,KAAK,EAAW,OACzB,EAAY,KAAK,CACf,MAAO,EAAE,KAAM,KAAM,EAAO,UAAU,mBAAmB,OACzD,OAAQ,EAAE,OAAQ,WAAY,EAAE,KAAM,QAAO,SAAU,IAAM,EAAE,KAChE,CAAC,CAEJ,MAAO,CAAE,cAAa,MAChB,CAEN,MAAO,CAAE,YAAa,EAAE,CAAE,GAG/B,CAIH,SAAgB,IAAuB,CACrC,GAAY,OAAO,kCC9RrB,SAAS,GAAa,EAAc,EAAiB,EAAkB,CACrE,IAAM,EAAO,IAAI,KAAK,CAAC,EAAQ,CAAE,CAAE,KAAM,EAAU,CAAC,CAC9C,EAAM,IAAI,gBAAgB,EAAK,CAC/B,EAAI,SAAS,cAAc,IAAI,CACrC,EAAE,KAAO,EACT,EAAE,SAAW,EACb,EAAE,OAAO,CACT,IAAI,gBAAgB,EAAI,CAG1B,SAAgB,GAAa,CAAE,UAAS,OAAM,WAAW,SAAU,gBAAmC,CACpG,GAAM,CAAC,EAAM,kBAAoB,GAAM,CACjC,CAAC,EAAW,kBAAyB,GAAM,CAC3C,eAAmC,KAAK,CACxC,eAAqC,KAAK,EAGhD,mBAAgB,CACd,GAAI,CAAC,EAAM,OACX,IAAM,EAAW,GAAkB,CAC7B,EAAY,SAAW,CAAC,EAAY,QAAQ,SAAS,EAAE,OAAe,EACtE,EAAO,SAAW,CAAC,EAAO,QAAQ,SAAS,EAAE,OAAe,EAAE,EAAQ,GAAM,EAGlF,OADA,SAAS,iBAAiB,YAAa,EAAQ,KAClC,SAAS,oBAAoB,YAAa,EAAQ,EAC9D,CAAC,EAAK,CAAC,CAEV,IAAM,wBAA2B,EAAS,GAAM,CAAC,EAAE,CAAE,EAAE,CAAC,CAElD,MAAsB,CAE1B,IAAM,EAAM,EAAa,EADT,EAAK,IAAK,GAAM,EAAQ,IAAK,GAAM,OAAO,EAAE,IAAM,GAAG,CAAC,CAAC,CAC7B,CAC1C,GAAa,GAAG,EAAS,MAAO,EAAK,WAAW,CAChD,EAAQ,GAAM,EAGV,MAAuB,CAC3B,IAAM,EAAO,KAAK,UAAU,EAAM,KAAM,EAAE,CAC1C,GAAa,GAAG,EAAS,OAAQ,EAAM,mBAAmB,CAC1D,EAAQ,GAAM,EAGV,EAAkB,SAAY,CAClC,IAAM,EAAS,EAAQ,KAAK,IAAK,CAC3B,EAAO,EAAK,IAAK,GAAM,EAAQ,IAAK,GAAM,OAAO,EAAE,IAAM,GAAG,CAAC,CAAC,KAAK,IAAK,CAAC,CAAC,KAAK;EAAK,CAC1F,MAAM,UAAU,UAAU,UAAU,EAAS;EAAO,EAAK,CACzD,EAAQ,GAAM,EAGV,EAAY,KAAO,IAA2B,CAC7C,KACL,GAAa,GAAK,CAClB,GAAI,CAEF,IAAM,EAAO,MADD,MAAM,MAAM,GAAG,EAAa,UAAU,EAAO,cAAc,EAChD,MAAM,CACvB,EAAW,IAAW,MAAQ,WAAa,mBACjD,GAAa,GAAG,EAAS,OAAO,IAAU,EAAM,EAAS,MACnD,EACR,EAAa,GAAM,CACnB,EAAQ,GAAM,GAGhB,GAAI,EAAQ,SAAW,GAAK,EAAK,SAAW,EAAG,OAAO,KAGtD,IAAM,EAAO,EAAO,SAAS,uBAAuB,CAC9C,EAAS,SAAS,eAAe,SAAS,CAEhD,iBACE,gCACG,SAAD,CAAQ,IAAK,EAAQ,KAAK,SAAS,QAAS,EAC1C,UAAU,4EAA4E,MAAM,4BAC3F,EAAD,CAAU,UAAU,WAAa,EAC1B,EAER,GAAQ,GAAU,kCAChB,MAAD,CAAK,IAAK,EACR,MAAO,CAAE,SAAU,QAAS,KAAM,KAAK,IAAI,EAAK,KAAM,OAAO,WAAa,IAAI,CAAE,IAAK,EAAK,OAAS,EAAG,OAAQ,IAAO,CACrH,UAAU,2FAFZ,WAGG,SAAD,CAAQ,QAAS,EAAiB,UAAU,yFAAgF,0BAEnH,YACR,SAAD,CAAQ,QAAS,EAAe,UAAU,yFAAgF,oBAEjH,YACR,SAAD,CAAQ,QAAS,EAAgB,UAAU,yFAAgF,qBAElH,EACR,cACC,gCACG,MAAD,CAAK,UAAU,8BAAgC,YAC9C,SAAD,CAAQ,YAAe,EAAU,MAAM,CAAE,SAAU,EACjD,UAAU,6GACT,EAAY,aAAe,mBACrB,YACR,SAAD,CAAQ,YAAe,EAAU,OAAO,CAAE,SAAU,EAClD,UAAU,6GACT,EAAY,aAAe,oBACrB,EACR,GAED,GACN,EACD,CACA,GCpHP,IAAa,GAAuCA,EAAO,MAAM,CAAC,CAChE,KAAM,0BACN,MAAO,cACP,UAAW,GACZ,CAAC,eCMF,EAAO,QAFoB,gECA3B,IAAI,OAEJ,SAAS,GAAgB,EACzB,SAAS,GAAyB,EAClC,EAAuB,kBAAoB,EAE3C,EAAO,QAAU,UAAW,CAC1B,SAAS,EAAK,EAAO,EAAU,EAAe,EAAU,EAAc,EAAQ,CACxE,OAAW,EAIf,KAAI,EAAU,MACZ,kLAGD,CAED,KADA,GAAI,KAAO,sBACL,GAER,EAAK,WAAa,EAClB,SAAS,GAAU,CACjB,OAAO,EAIT,IAAI,EAAiB,CACnB,MAAO,EACP,OAAQ,EACR,KAAM,EACN,KAAM,EACN,OAAQ,EACR,OAAQ,EACR,OAAQ,EACR,OAAQ,EAER,IAAK,EACL,QAAS,EACT,QAAS,EACT,YAAa,EACb,WAAY,EACZ,KAAM,EACN,SAAU,EACV,MAAO,EACP,UAAW,EACX,MAAO,EACP,MAAO,EAEP,eAAgB,EAChB,kBAAmB,EACpB,CAID,MAFA,GAAe,UAAY,EAEpB,oBC9CP,EAAO,cAAiD,eCjBzD,SAAU,EAAQ,EAAS,CAC1B,GAAI,OAAO,QAAW,YAAc,OAAO,IACzC,OAAO,CAAC,UAAW,QAAS,aAAa,CAAE,EAAQ,SACnC,IAAY,OAC5B,EAAQ,WAAiD,KACpD,CACL,IAAI,EAAM,CACR,QAAS,EAAE,CACZ,CACD,EAAQ,EAAI,QAAS,EAAO,MAAO,EAAO,UAAU,CACpD,EAAO,WAAa,EAAI,aAEnB,SAAU,EAAS,EAAQ,EAAY,CAG9C,OAAO,eAAeC,EAAS,aAAc,CAC3C,MAAO,GACR,CAAC,CACF,EAAQ,6BAA+B,EAEvC,IAAI,EAAU,EAAuB,EAAO,CAExC,EAAc,EAAuB,EAAW,CAEpD,SAAS,EAAuB,EAAK,CACnC,OAAO,GAAO,EAAI,WAAa,EAAM,CACnC,QAAS,EACV,CAGH,IAAI,EAAW,OAAO,QAAU,SAAU,EAAQ,CAChD,IAAK,IAAI,EAAI,EAAG,EAAI,UAAU,OAAQ,IAAK,CACzC,IAAI,EAAS,UAAU,GAEvB,IAAK,IAAI,KAAO,EACV,OAAO,UAAU,eAAe,KAAK,EAAQ,EAAI,GACnD,EAAO,GAAO,EAAO,IAK3B,OAAO,GAGT,SAAS,EAAyB,EAAK,EAAM,CAC3C,IAAI,EAAS,EAAE,CAEf,IAAK,IAAI,KAAK,EACR,EAAK,QAAQ,EAAE,EAAI,GAClB,OAAO,UAAU,eAAe,KAAK,EAAK,EAAE,GACjD,EAAO,GAAK,EAAI,IAGlB,OAAO,EAGT,SAAS,EAAgB,EAAU,EAAa,CAC9C,GAAI,EAAE,aAAoB,GACxB,MAAU,UAAU,oCAAoC,CAI5D,IAAI,EAAe,UAAY,CAC7B,SAAS,EAAiB,EAAQ,EAAO,CACvC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,IAAK,CACrC,IAAI,EAAa,EAAM,GACvB,EAAW,WAAa,EAAW,YAAc,GACjD,EAAW,aAAe,GACtB,UAAW,IAAY,EAAW,SAAW,IACjD,OAAO,eAAe,EAAQ,EAAW,IAAK,EAAW,EAI7D,OAAO,SAAU,EAAa,EAAY,EAAa,CAGrD,OAFI,GAAY,EAAiB,EAAY,UAAW,EAAW,CAC/D,GAAa,EAAiB,EAAa,EAAY,CACpD,KAER,CAEH,SAAS,EAA2B,EAAM,EAAM,CAC9C,GAAI,CAAC,EACH,MAAU,eAAe,4DAA4D,CAGvF,OAAO,IAAS,OAAO,GAAS,UAAY,OAAO,GAAS,YAAc,EAAO,EAGnF,SAAS,EAAU,EAAU,EAAY,CACvC,GAAI,OAAO,GAAe,YAAc,IAAe,KACrD,MAAU,UAAU,2DAA6D,OAAO,EAAW,CAGrG,EAAS,UAAY,OAAO,OAAO,GAAc,EAAW,UAAW,CACrE,YAAa,CACX,MAAO,EACP,WAAY,GACZ,SAAU,GACV,aAAc,GACf,CACF,CAAC,CACE,IAAY,OAAO,eAAiB,OAAO,eAAe,EAAU,EAAW,CAAG,EAAS,UAAY,GAG7G,IAAI,EAAwB,GAC5B,SAAS,EAA6B,EAAY,CAChD,EAAwB,EAG1B,GAAI,CACF,iBAAiB,OAAQ,KAAM,OAAO,eAAe,EAAE,CAAE,UAAW,CAAE,IAAK,UAAe,CACtF,EAA6B,GAAK,EACjC,CAAC,CAAC,MACG,EAEZ,SAAS,GAA0B,CACjC,IAAI,EAAU,UAAU,OAAS,GAAK,UAAU,KAAO,OAAY,UAAU,GAAK,CAAE,QAAS,GAAM,CAEnG,OAAO,EAAwB,EAAU,EAAQ,QAQnD,SAAS,EAAY,EAAO,CAC1B,GAAI,YAAa,EAAO,CACtB,IAAI,EAAkB,EAAM,QAAQ,GAIpC,MAAO,CAAE,EAHG,EAAgB,MAGT,EAFP,EAAgB,MAEC,CAM/B,MAAO,CAAE,EAHK,EAAM,QAGC,EAFP,EAAM,QAEa,CAGnC,IAAI,EAAa,SAAU,EAAY,CACrC,EAAU,EAAY,EAAW,CAEjC,SAAS,GAAa,CACpB,IAAI,EAEJ,EAAgB,KAAM,EAAW,CAE5B,IAA6B,MACnB,WAGX,EAAQ,EAA2B,MAAO,EAAO,EAAW,WAAa,OAAO,eAAe,EAAW,EAAE,KAAK,MAAM,EAAM,CAAC,KAAK,CAAC,OAAO,EAAK,CAAC,CAAC,CAWtJ,MATA,GAAM,kBAAoB,EAAM,kBAAkB,KAAK,EAAM,CAC7D,EAAM,iBAAmB,EAAM,iBAAiB,KAAK,EAAM,CAC3D,EAAM,gBAAkB,EAAM,gBAAgB,KAAK,EAAM,CAEzD,EAAM,aAAe,EAAM,aAAa,KAAK,EAAM,CACnD,EAAM,aAAe,EAAM,aAAa,KAAK,EAAM,CACnD,EAAM,WAAa,EAAM,WAAW,KAAK,EAAM,CAE/C,EAAM,cAAgB,EAAM,cAAc,KAAK,EAAM,CAC9C,EAgKT,OA7JA,EAAa,EAAY,CAAC,CACxB,IAAK,oBACL,MAAO,UAA6B,CAC9B,KAAK,QACP,KAAK,OAAO,iBAAiB,YAAa,KAAK,iBAAkB,EAAwB,CACvF,QAAS,GACT,QAAS,GACV,CAAC,CAAC,EAGR,CAAE,CACD,IAAK,uBACL,MAAO,UAAgC,CACjC,KAAK,QACP,KAAK,OAAO,oBAAoB,YAAa,KAAK,iBAAkB,EAAwB,CAC1F,QAAS,GACT,QAAS,GACV,CAAC,CAAC,EAGR,CAAE,CACD,IAAK,eACL,MAAO,SAAsB,EAAO,CAC7B,KAAK,MAAM,mBAIhB,KAAK,UAAY,GAEjB,SAAS,iBAAiB,UAAW,KAAK,WAAW,CACrD,SAAS,iBAAiB,YAAa,KAAK,aAAa,CAEzD,KAAK,kBAAkB,EAAM,GAEhC,CAAE,CACD,IAAK,eACL,MAAO,SAAsB,EAAO,CAC7B,KAAK,WAIV,KAAK,iBAAiB,EAAM,EAE/B,CAAE,CACD,IAAK,aACL,MAAO,SAAoB,EAAO,CAChC,KAAK,UAAY,GAEjB,SAAS,oBAAoB,UAAW,KAAK,WAAW,CACxD,SAAS,oBAAoB,YAAa,KAAK,aAAa,CAE5D,KAAK,gBAAgB,EAAM,EAE9B,CAAE,CACD,IAAK,oBACL,MAAO,SAA2B,EAAO,CACvC,IAAI,EAAe,EAAY,EAAM,CAIrC,KAAK,UAAY,CAAE,EAHX,EAAa,EAGI,EAFjB,EAAa,EAEU,CAC/B,KAAK,MAAM,aAAa,EAAM,EAEjC,CAAE,CACD,IAAK,mBACL,MAAO,SAA0B,EAAO,CACjC,QAAK,UAIV,KAAI,EAAgB,EAAY,EAAM,CAClC,EAAI,EAAc,EAClB,EAAI,EAAc,EAElB,EAAS,EAAI,KAAK,UAAU,EAC5B,EAAS,EAAI,KAAK,UAAU,EAChC,KAAK,OAAS,GAIa,KAAK,MAAM,YAAY,CAChD,EAAG,EACH,EAAG,EACJ,CAAE,EAAM,EAEmB,EAAM,YAChC,EAAM,gBAAgB,CAGxB,KAAK,aAAe,CAAU,SAAgB,SAAQ,GAEzD,CAAE,CACD,IAAK,kBACL,MAAO,SAAyB,EAAO,CACrC,KAAK,MAAM,WAAW,EAAM,CAE5B,IAAI,EAAY,KAAK,MAAM,UAGvB,KAAK,QAAU,KAAK,eAClB,KAAK,aAAa,OAAS,CAAC,EAC9B,KAAK,MAAM,YAAY,EAAG,EAAM,CACvB,KAAK,aAAa,OAAS,GACpC,KAAK,MAAM,aAAa,EAAG,EAAM,CAE/B,KAAK,aAAa,OAAS,CAAC,EAC9B,KAAK,MAAM,UAAU,EAAG,EAAM,CACrB,KAAK,aAAa,OAAS,GACpC,KAAK,MAAM,YAAY,EAAG,EAAM,EAIpC,KAAK,UAAY,KACjB,KAAK,OAAS,GACd,KAAK,aAAe,MAEvB,CAAE,CACD,IAAK,gBACL,MAAO,SAAuB,EAAM,CAClC,KAAK,OAAS,EACd,KAAK,MAAM,SAAS,EAAK,EAE5B,CAAE,CACD,IAAK,SACL,MAAO,UAAkB,CACvB,IAAI,EAAS,KAAK,MACJ,EAAO,QADrB,IAEI,EAAY,EAAO,UACnB,EAAQ,EAAO,MACf,EAAW,EAAO,SACC,EAAO,iBACd,EAAO,UACL,EAAO,YACP,EAAO,YACN,EAAO,aACP,EAAO,aACR,EAAO,YACR,EAAO,WACT,EAAO,SACN,EAAO,UAdvB,IAeI,EAAQ,EAAyB,EAAQ,CAAC,UAAW,YAAa,QAAS,WAAY,mBAAoB,YAAa,cAAe,cAAe,eAAgB,eAAgB,cAAe,aAAc,WAAY,YAAY,CAAC,CAEhP,OAAO,EAAQ,QAAQ,cACrB,KAAK,MAAM,QACX,EAAS,CACP,IAAK,KAAK,cACV,YAAa,KAAK,aAClB,aAAc,KAAK,kBACnB,WAAY,KAAK,gBACN,YACJ,QACR,CAAE,EAAM,CACT,EACD,EAEJ,CAAC,CAAC,CAEI,GACP,EAAO,UAAU,CAEnB,EAAW,YAAc,aACzB,EAAW,UAAY,CACrB,QAAS,EAAY,QAAQ,OAC7B,UAAW,EAAY,QAAQ,OAC/B,MAAO,EAAY,QAAQ,OAC3B,SAAU,EAAY,QAAQ,KAC9B,iBAAkB,EAAY,QAAQ,KACtC,UAAW,EAAY,QAAQ,KAC/B,YAAa,EAAY,QAAQ,KACjC,YAAa,EAAY,QAAQ,KACjC,aAAc,EAAY,QAAQ,KAClC,aAAc,EAAY,QAAQ,KAClC,YAAa,EAAY,QAAQ,KACjC,WAAY,EAAY,QAAQ,KAChC,SAAU,EAAY,QAAQ,KAC9B,UAAW,EAAY,QAAQ,OAAO,WACvC,CACD,EAAW,aAAe,CACxB,QAAS,MACT,iBAAkB,GAClB,UAAW,UAAqB,GAChC,YAAa,UAAuB,GACpC,YAAa,UAAuB,GACpC,aAAc,UAAwB,GACtC,aAAc,UAAwB,GACtC,YAAa,UAAuB,GACpC,WAAY,UAAsB,GAClC,SAAU,UAAoB,GAE9B,UAAW,EACZ,CACD,EAAQ,QAAU,GAClB,eCvWD,SAAU,EAAQ,EAAS,CAC1B,GAAI,OAAO,QAAW,YAAc,OAAO,IACzC,OAAO,CAAC,UAAW,gBAAgB,CAAE,EAAQ,SAC7B,IAAY,OAC5B,EAAQ,OAAkC,KACrC,CACL,IAAI,EAAM,CACR,QAAS,EAAE,CACZ,CACD,EAAQ,EAAI,QAAS,EAAO,WAAW,CACvC,EAAO,MAAQ,EAAI,aAEd,SAAU,EAAS,EAAa,CAGvC,OAAO,eAAeA,EAAS,aAAc,CAC3C,MAAO,GACR,CAAC,CAEF,IAAI,EAAe,EAAuB,EAAY,CAEtD,SAAS,EAAuB,EAAK,CACnC,OAAO,GAAO,EAAI,WAAa,EAAM,CACnC,QAAS,EACV,CAGH,EAAQ,QAAU,EAAa,SAC/B,mBCrBD,UAAY,CAGZ,IAAI,EAAS,EAAE,CAAC,eAEhB,SAAS,GAAc,CAGtB,IAAK,IAFD,EAAU,GAEL,EAAI,EAAG,EAAI,UAAU,OAAQ,IAAK,CAC1C,IAAI,EAAM,UAAU,GAChB,IACH,EAAU,EAAY,EAAS,EAAW,EAAI,CAAC,EAIjD,OAAO,EAGR,SAAS,EAAY,EAAK,CACzB,GAAI,OAAO,GAAQ,UAAY,OAAO,GAAQ,SAC7C,OAAO,EAGR,GAAI,OAAO,GAAQ,SAClB,MAAO,GAGR,GAAI,MAAM,QAAQ,EAAI,CACrB,OAAO,EAAW,MAAM,KAAM,EAAI,CAGnC,GAAI,EAAI,WAAa,OAAO,UAAU,UAAY,CAAC,EAAI,SAAS,UAAU,CAAC,SAAS,gBAAgB,CACnG,OAAO,EAAI,UAAU,CAGtB,IAAI,EAAU,GAEd,IAAK,IAAI,KAAO,EACX,EAAO,KAAK,EAAK,EAAI,EAAI,EAAI,KAChC,EAAU,EAAY,EAAS,EAAI,EAIrC,OAAO,EAGR,SAAS,EAAa,EAAO,EAAU,CAStC,OARK,EAID,EACI,EAAQ,IAAM,EAGf,EAAQ,EAPP,EAUE,IAAW,QAAe,EAAO,SAC3C,EAAW,QAAU,EACrB,EAAO,QAAU,GACP,OAAO,QAAW,YAAc,OAAO,OAAO,KAAQ,UAAY,OAAO,IAEnF,OAAO,aAAc,EAAE,CAAE,UAAY,CACpC,OAAO,GACN,CAEF,OAAO,WAAa,KAEnB,cC1EH,OAAO,eAAe,EAAS,aAAc,CAC3C,MAAO,GACR,CAAC,CACF,EAAQ,QAAU,IAAK,GAEvB,IAAI,EAAc,OAA6C,CAE/D,SAAS,EAAuB,EAAK,CAAE,OAAO,GAAO,EAAI,WAAa,EAAM,CAAE,QAAS,EAAK,CAE5F,SAAS,EAAgB,EAAK,EAAK,EAAO,CAA0J,OAApJ,KAAO,EAAO,OAAO,eAAe,EAAK,EAAK,CAAS,QAAO,WAAY,GAAM,aAAc,GAAM,SAAU,GAAM,CAAC,CAAW,EAAI,GAAO,EAAgB,EAwD3M,EAAQ,QAtDO,CACb,KAAM,SAAc,EAAiB,CACnC,OAAQ,EAAG,EAAY,SAAS,EAAgB,CAC9C,gBAAiB,GAClB,CAAE,GAAmB,GAAI,CAAC,CAAC,EAAgB,CAAC,EAE/C,SAAU,SAAkB,EAAU,CACpC,OAAQ,EAAG,EAAY,SAAS,CAC9B,SAAU,GACV,kBAAmB,EACpB,CAAC,EAEJ,QAAS,SAAiB,EAAU,EAAM,CACxC,OAAQ,EAAG,EAAY,SAAS,CAC9B,iBAAkB,CAAC,EACnB,iBAAkB,EAClB,kBAAmB,IAAS,aAC5B,gBAAiB,IAAS,aAC3B,CAAC,EAEJ,OAAQ,SAAgB,EAAU,EAAW,CAC3C,OAAQ,EAAG,EAAY,SAAS,CAC9B,OAAQ,CAAC,EACT,OAAQ,EACR,SAAU,CAAC,EACZ,CAAC,EAEJ,KAAM,SAAc,EAAU,EAAU,EAAU,CAChD,OAAQ,EAAG,EAAY,SAAS,CAC9B,MAAO,CAAC,EACR,MAAO,EACG,WACA,WACX,CAAC,EAEJ,WAAY,SAAoB,EAAU,CACxC,OAAQ,EAAG,EAAY,SAAS,CAC9B,6BAA8B,GAC9B,mBAAoB,EACrB,CAAC,EAEJ,WAAY,SAAoB,EAAU,CACxC,OAAQ,EAAG,EAAY,SAAS,CAC9B,6BAA8B,GAC9B,mBAAoB,EACrB,CAAC,EAEJ,IAAK,SAAa,EAAU,CAC1B,OAAQ,EAAG,EAAY,SAAS,CAC9B,IAAK,GACK,WACX,CAAC,EAEL,cChED,OAAO,eAAe,EAAS,aAAc,CAC3C,MAAO,GACR,CAAC,CACF,EAAQ,WAAa,IAAK,GAS1B,EAAQ,WAPS,SAAoB,EAAI,CACvC,IAAI,EAAQ,EAAG,YACX,EAAQ,iBAAiB,EAAG,CAEhC,MADA,IAAS,SAAS,EAAM,WAAW,CAAG,SAAS,EAAM,YAAY,CAC1D,gBCTT,OAAO,eAAe,EAAS,aAAc,CAC3C,MAAO,GACR,CAAC,CACF,EAAQ,QAAU,IAAK,GAUvB,EAAQ,QARO,SAAkB,EAAU,EAAQ,EAAM,CACvD,IAAI,EAAkB,IAAa,EAAI,EAAW,EAAW,EAI7D,MAFqB,eACI,KAFP,IAAS,aAAe,CAAC,EAAiB,EAAG,EAAE,CAAG,CAAC,EAAG,EAAiB,EAAE,EAEhD,KAAK,IAAI,CAAG,mBCTzD,OAAO,eAAe,EAAS,aAAc,CAC3C,MAAO,GACR,CAAC,CACF,EAAQ,QAAU,IAAK,GAMvB,EAAQ,QAJO,UAAoB,CACjC,OAAO,qBCNT,OAAO,eAAe,EAAS,aAAc,CAC3C,MAAO,GACR,CAAC,CACF,EAAQ,QAAU,IAAK,GAEvB,IAAI,EAAS,MAAyC,CAElD,EAAc,OAAgD,CAE9D,OAEA,EAAgB,OAAkD,CAElE,EAAkB,OAAmD,CAErE,EAAU,OAAkD,CAEhE,SAAS,EAAuB,EAAK,CAAE,OAAO,GAAO,EAAI,WAAa,EAAM,CAAE,QAAS,EAAK,CAE5F,SAAS,GAA2B,CAAE,GAAI,OAAO,SAAY,WAAY,OAAO,KAAM,IAAI,EAAQ,IAAI,QAA6F,MAAlF,GAA2B,UAAoC,CAAE,OAAO,GAAiB,EAE1M,SAAS,EAAwB,EAAK,CAAE,GAAI,GAAO,EAAI,WAAc,OAAO,EAAO,GAAI,IAAQ,MAAQ,EAAQ,EAAI,GAAK,UAAY,OAAO,GAAQ,WAAc,MAAO,CAAE,QAAS,EAAK,CAAI,IAAI,EAAQ,GAA0B,CAAE,GAAI,GAAS,EAAM,IAAI,EAAI,CAAI,OAAO,EAAM,IAAI,EAAI,CAAI,IAAI,EAAS,EAAE,CAAM,EAAwB,OAAO,gBAAkB,OAAO,yBAA0B,IAAK,IAAI,KAAO,EAAO,GAAI,OAAO,UAAU,eAAe,KAAK,EAAK,EAAI,CAAE,CAAE,IAAI,EAAO,EAAwB,OAAO,yBAAyB,EAAK,EAAI,CAAG,KAAU,IAAS,EAAK,KAAO,EAAK,KAAQ,OAAO,eAAe,EAAQ,EAAK,EAAK,CAAW,EAAO,GAAO,EAAI,GAAyE,MAA7D,GAAO,QAAU,EAAS,GAAS,EAAM,IAAI,EAAK,EAAO,CAAW,EAEhuB,SAAS,EAAQ,EAAK,CAAE,0BAA4U,MAAjT,CAA4I,EAAxI,OAAO,QAAW,YAAc,OAAO,OAAO,UAAa,SAAsB,SAAiB,EAAK,CAAE,OAAO,OAAO,GAA2B,SAAiB,EAAK,CAAE,OAAO,GAAO,OAAO,QAAW,YAAc,EAAI,cAAgB,QAAU,IAAQ,OAAO,UAAY,SAAW,OAAO,GAAiB,EAAQ,EAAI,CAEvX,SAAS,GAAW,CAAgQ,MAA9P,GAAW,OAAO,QAAU,SAAU,EAAQ,CAAE,IAAK,IAAI,EAAI,EAAG,EAAI,UAAU,OAAQ,IAAK,CAAE,IAAI,EAAS,UAAU,GAAI,IAAK,IAAI,KAAO,EAAc,OAAO,UAAU,eAAe,KAAK,EAAQ,EAAI,GAAI,EAAO,GAAO,EAAO,IAAY,OAAO,GAAkB,EAAS,MAAM,KAAM,UAAU,CAE1T,SAAS,EAAgB,EAAU,EAAa,CAAE,GAAI,EAAE,aAAoB,GAAgB,MAAU,UAAU,oCAAoC,CAEpJ,SAAS,EAAkB,EAAQ,EAAO,CAAE,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,IAAK,CAAE,IAAI,EAAa,EAAM,GAAI,EAAW,WAAa,EAAW,YAAc,GAAO,EAAW,aAAe,GAAU,UAAW,IAAY,EAAW,SAAW,IAAM,OAAO,eAAe,EAAQ,EAAW,IAAK,EAAW,EAExT,SAAS,EAAa,EAAa,EAAY,EAAa,CAAsI,OAAhI,GAAY,EAAkB,EAAY,UAAW,EAAW,CAAM,GAAa,EAAkB,EAAa,EAAY,CAAS,EAEzM,SAAS,EAAU,EAAU,EAAY,CAAE,GAAI,OAAO,GAAe,YAAc,IAAe,KAAQ,MAAU,UAAU,qDAAqD,CAAI,EAAS,UAAY,OAAO,OAAO,GAAc,EAAW,UAAW,CAAE,YAAa,CAAE,MAAO,EAAU,SAAU,GAAM,aAAc,GAAM,CAAE,CAAC,CAAM,GAAY,EAAgB,EAAU,EAAW,CAE9X,SAAS,EAAgB,EAAG,EAAG,CAA4G,MAA1G,GAAkB,OAAO,gBAAkB,SAAyB,EAAG,EAAG,CAAmB,MAAjB,GAAE,UAAY,EAAU,GAAa,EAAgB,EAAG,EAAE,CAEvK,SAAS,EAAa,EAAS,CAAE,IAAI,EAA4B,GAA2B,CAAE,OAAO,UAAgC,CAAE,IAAI,EAAQ,EAAgB,EAAQ,CAAE,EAAQ,GAAI,EAA2B,CAAE,IAAI,EAAY,EAAgB,KAAK,CAAC,YAAa,EAAS,QAAQ,UAAU,EAAO,UAAW,EAAU,MAAW,EAAS,EAAM,MAAM,KAAM,UAAU,CAAI,OAAO,EAA2B,KAAM,EAAO,EAEna,SAAS,EAA2B,EAAM,EAAM,CAA2F,OAArF,IAAS,EAAQ,EAAK,GAAK,UAAY,OAAO,GAAS,YAAsB,EAAe,EAAuB,EAAK,CAE9K,SAAS,EAAuB,EAAM,CAAE,GAAI,IAAS,IAAK,GAAK,MAAU,eAAe,4DAA4D,CAAI,OAAO,EAE/J,SAAS,GAA4B,CAA0E,GAApE,OAAO,QAAY,KAAe,CAAC,QAAQ,WAA6B,QAAQ,UAAU,KAAM,MAAO,GAAO,GAAI,OAAO,OAAU,WAAY,MAAO,GAAM,GAAI,CAA6E,OAA3E,KAAK,UAAU,SAAS,KAAK,QAAQ,UAAU,KAAM,EAAE,CAAE,UAAY,GAAG,CAAC,CAAS,QAAkB,CAAE,MAAO,IAE1T,SAAS,EAAgB,EAAG,CAAqJ,MAAnJ,GAAkB,OAAO,eAAiB,OAAO,eAAiB,SAAyB,EAAG,CAAE,OAAO,EAAE,WAAa,OAAO,eAAe,EAAE,EAAY,EAAgB,EAAE,CAE1M,SAAS,EAAgB,EAAK,EAAK,EAAO,CAA0J,OAApJ,KAAO,EAAO,OAAO,eAAe,EAAK,EAAK,CAAS,QAAO,WAAY,GAAM,aAAc,GAAM,SAAU,GAAM,CAAC,CAAW,EAAI,GAAO,EAAgB,EAE3M,IAAI,EAAkB,SAAyB,EAAG,CAChD,OAAO,EAAE,eAAe,MAAM,EAG5B,EAAsB,SAAU,EAAY,CAC9C,EAAU,EAAQ,EAAW,CAE7B,IAAI,EAAS,EAAa,EAAO,CAEjC,SAAS,EAAO,EAAQ,CACtB,IAAI,EAyIJ,OAvIA,EAAgB,KAAM,EAAO,CAE7B,EAAQ,EAAO,KAAK,KAAM,EAAO,CAEjC,EAAgB,EAAuB,EAAM,CAAE,kBAAmB,IAAK,GAAE,CAEzE,EAAgB,EAAuB,EAAM,CAAE,eAAgB,IAAK,GAAE,CAEtE,EAAgB,EAAuB,EAAM,CAAE,YAAa,IAAK,GAAE,CAEnE,EAAgB,EAAuB,EAAM,CAAE,qBAAsB,SAAU,EAAM,CACnF,EAAM,gBAAkB,GACxB,CAEF,EAAgB,EAAuB,EAAM,CAAE,kBAAmB,SAAU,EAAM,CAChF,EAAM,aAAe,GACrB,CAEF,EAAgB,EAAuB,EAAM,CAAE,eAAgB,SAAU,EAAM,EAAO,CACpF,CACE,CAAM,YAAY,EAAE,CAGtB,EAAM,UAAU,GAAS,GACzB,CAEF,EAAgB,EAAuB,EAAM,CAAE,cAAe,UAAY,CACpE,MAAC,EAAM,MAAM,UAAY,CAAC,EAAM,iBAAmB,CAAC,EAAM,WAI9D,KAAI,EAAQ,EAAO,SAAS,MAAM,EAAM,MAAM,SAAS,CAEnD,EAAc,EAAM,gBAAgB,YACpC,EAAW,EAAM,MAAM,WAAa,EAAM,MAAM,YAAc,EAAG,EAAY,YAAY,EAAM,UAAU,GAAG,CAC5G,EAAe,KAAK,MAAM,EAAc,EAAS,CACjD,EAAa,EAAe,EAC5B,EAAe,EAAa,EAAQ,EAAe,EAEvD,EAAM,SAAS,SAAU,EAAQ,EAAO,CACtC,MAAO,CACK,WACI,eACd,UAAW,EAAa,EAAM,aAAa,EAAM,aAAa,CAAG,EACnD,eACF,aACb,EACD,GACF,CAEF,EAAgB,EAAuB,EAAM,CAAE,kBAAmB,SAAU,EAAO,EAAM,EAAG,CAC1F,GAAI,CAAC,EAAgB,EAAE,EAAI,EAAE,MAAQ,QAAS,CAC5C,IAAI,EAAU,EAAM,MAAM,aAEtB,OAAO,GAAY,YACrB,EAAQ,EAAO,EAAK,GAGxB,CAEF,EAAgB,EAAuB,EAAM,CAAE,eAAgB,UAAY,CACzE,EAAM,SAAS,CACb,QAAS,GACV,CAAC,EACF,CAEF,EAAgB,EAAuB,EAAM,CAAE,aAAc,UAAY,CACvE,EAAM,SAAS,CACb,QAAS,GACV,CAAC,EACF,CAEF,EAAgB,EAAuB,EAAM,CAAE,cAAe,SAAU,EAAO,CAC7E,IAAI,EAAS,EAAM,EAEnB,GAAI,CAAC,EAAM,MAAM,UAAY,CAAC,EAAM,iBAAmB,CAAC,EAAM,MAAM,aAClE,MAAO,GAGT,IAAI,EAAe,EAEf,EAAiB,EAAO,SAAS,MAAM,EAAM,MAAM,SAAS,CAE5D,EAAkB,EAAE,EAAM,MAAM,UAAY,KAAO,EAAM,MAAM,aAE/D,EAAmB,CADJ,KAAK,IAAI,EAAiB,EAAM,MAAM,aAAc,EAAE,CAClC,IAAM,EAAM,MAAM,aAErD,IAAoB,GAAgB,EAAS,IAC/C,EAAS,GAIP,IAAoB,GAAoB,EAAS,IACnD,EAAS,GAIX,IAAI,EAAW,EAAkB,KADf,EAAM,gBAAgB,YACc,GAQtD,OANI,EAAM,cACR,CAAC,kBAAmB,eAAgB,cAAe,aAAc,YAAa,cAAc,CAAC,QAAQ,SAAU,EAAM,CACnH,EAAM,aAAa,MAAM,IAAS,EAAG,EAAc,SAAS,EAAU,IAAK,EAAM,MAAM,KAAK,EAC5F,CAGG,IACP,CAEF,EAAgB,EAAuB,EAAM,CAAE,aAAc,SAAU,EAAW,CAChF,EAAM,OAAO,EAAM,MAAM,WAAa,OAAO,GAAc,SAAW,EAAY,GAAG,EACrF,CAEF,EAAgB,EAAuB,EAAM,CAAE,YAAa,SAAU,EAAW,CAC/E,EAAM,OAAO,EAAM,MAAM,WAAa,OAAO,GAAc,SAAW,EAAY,GAAG,EACrF,CAEF,EAAgB,EAAuB,EAAM,CAAE,SAAU,SAAU,EAAU,CAE3E,EAAW,EAAW,EAAI,EAAI,EAE9B,EAAW,GAAY,EAAM,MAAM,aAAe,EAAM,MAAM,aAAe,EAE7E,EAAM,SAAS,CACb,UAAW,EACZ,CAAC,EACF,CAEF,EAAM,MAAQ,CACZ,aAAc,EAAO,aACrB,QAAS,GACT,WAAY,GACZ,UAAW,EACX,aAAc,EACd,aAAc,EACf,CACM,EAyKT,OAtKA,EAAa,EAAQ,CAAC,CACpB,IAAK,oBACL,MAAO,UAA6B,CAClC,KAAK,aAAa,EAErB,CAAE,CACD,IAAK,qBACL,MAAO,SAA4B,EAAW,CACxC,KAAK,MAAM,eAAiB,KAAK,MAAM,cACzC,KAAK,SAAS,CACZ,aAAc,KAAK,MAAM,aACzB,UAAW,KAAK,aAAa,KAAK,MAAM,aAAa,CACtD,CAAC,CAGA,KAAK,MAAM,WAAa,EAAU,UAMtC,KAAK,aAAa,EAErB,CAAE,CACD,IAAK,uBACL,MAAO,UAAgC,CACrC,KAAK,eAAe,EAEvB,CAAE,CACD,IAAK,cACL,MAAO,UAAuB,EAG3B,EAAG,EAAQ,UAAU,CAAC,iBAAiB,SAAU,KAAK,YAAY,EAElE,EAAG,EAAQ,UAAU,CAAC,iBAAiB,mBAAoB,KAAK,YAAY,CAG7E,KAAK,aAAa,EAErB,CAAE,CACD,IAAK,gBACL,MAAO,UAAyB,EAE7B,EAAG,EAAQ,UAAU,CAAC,oBAAoB,SAAU,KAAK,YAAY,EACrE,EAAG,EAAQ,UAAU,CAAC,oBAAoB,mBAAoB,KAAK,YAAY,EAEnF,CAAE,CACD,IAAK,eACL,MAAO,SAAsB,EAAc,CACzC,IAAI,EAAY,EAchB,OAZI,GAAgB,KAAK,MAAM,eAC7B,EAAY,KAAK,MAAM,cAGrB,EAAe,KAAK,MAAM,UAAY,KAAK,MAAM,eACnD,EAAY,KAAK,MAAM,WAGrB,EAAe,KAAK,MAAM,YAC5B,EAAY,GAGP,GAEV,CAAE,CACD,IAAK,cACL,MAAO,UAAuB,CAC5B,IAAI,EAAS,KAEb,OAAO,KAAK,MAAM,SAAS,IAAI,SAAU,EAAK,EAAO,CAGnD,IAAI,EAAa,CACf,IAAK,EACL,IAAK,SAAa,EAAG,CACnB,OAAO,EAAO,aAAa,EAAG,EAAM,EAEtC,UAPc,EAAY,QAAQ,KAAK,GAAO,IAAU,EAAO,MAAM,aAAa,CAQlF,QAAS,EAAO,gBAAgB,KAAK,EAAQ,EAAO,EAAO,MAAM,SAAS,GAAO,CACjF,UAAW,EAAO,gBAAgB,KAAK,EAAQ,EAAO,EAAO,MAAM,SAAS,GAAO,CACnF,aAAc,GAAU,EAAO,MAAM,OAAO,QAAkB,EAAQ,IACtE,MAAO,CACL,MAAO,EAAO,MAAM,WACrB,CACF,CACD,OAAoB,EAAO,QAAQ,cAAc,KAAM,EAAS,EAAE,CAAE,EAAY,CAC9E,KAAM,SACN,SAAU,EACX,CAAC,CAAE,EAAI,EACR,EAEL,CAAE,CACD,IAAK,SACL,MAAO,UAAkB,CACvB,IAAI,EAAS,KAEb,GAAI,CAAC,KAAK,MAAM,SACd,OAAO,KAGT,IAAI,EAAc,EAAO,SAAS,MAAM,KAAK,MAAM,SAAS,CAAG,EAE3D,EAAU,KAAK,MAAM,YAAc,KAAK,MAAM,UAAY,EAE1D,EAAU,KAAK,MAAM,YAAc,KAAK,MAAM,UAAY,KAAK,MAAM,aAErE,EAAiB,EAAE,CACnB,EAAkB,CAAC,KAAK,MAAM,WAAa,KAAK,MAAM,UAAY,GAClE,GAAiB,EAAG,EAAc,SAAS,EAAiB,KAAM,KAAK,MAAM,KAAK,CAClF,EAAiB,KAAK,MAAM,eAAiB,KAejD,MAdA,GAAiB,CACf,gBAAiB,EACjB,aAAc,EACd,YAAa,EACb,WAAY,EACZ,UAAW,EACX,YAAa,EACb,yBAA0B,EAC1B,sBAAuB,EACvB,qBAAsB,EACtB,oBAAqB,EACrB,mBAAoB,EACpB,qBAAsB,EACvB,CACmB,EAAO,QAAQ,cAAc,MAAO,CACtD,UAAW,EAAY,QAAQ,SAAS,GAAM,CAC/C,CAAe,EAAO,QAAQ,cAAc,MAAO,CAClD,UAAW,EAAY,QAAQ,QAAQ,GAAM,CAC7C,IAAK,KAAK,mBACX,CAAe,EAAO,QAAQ,cAAc,SAAU,CACrD,KAAM,SACN,UAAW,EAAY,QAAQ,WAAW,CAAC,EAAQ,CACnD,QAAS,UAAmB,CAC1B,OAAO,EAAO,YAAY,EAE5B,aAAc,KAAK,MAAM,OAAO,UACjC,CAAC,CAAE,EAA2B,EAAO,QAAQ,cAAc,EAAgB,QAAS,CACnF,QAAS,KACT,UAAW,EAAY,QAAQ,OAAO,GAAO,KAAK,MAAM,QAAQ,CAChE,YAAa,KAAK,UAClB,aAAc,KAAK,WACnB,YAAa,KAAK,YAClB,aAAc,KAAK,aACnB,WAAY,KAAK,WACjB,MAAO,EACP,SAAU,KAAK,gBACf,iBAAkB,KAAK,MAAM,aAC9B,CAAE,KAAK,aAAa,CAAC,CAAgB,EAAO,QAAQ,cAAc,KAAM,CACvE,UAAW,EAAY,QAAQ,OAAO,GAAO,KAAK,MAAM,QAAQ,CAChE,IAAK,SAAa,EAAM,CACtB,OAAO,EAAO,gBAAgB,EAAK,EAErC,MAAO,EACR,CAAE,KAAK,aAAa,CAAC,CAAe,EAAO,QAAQ,cAAc,SAAU,CAC1E,KAAM,SACN,UAAW,EAAY,QAAQ,WAAW,CAAC,EAAQ,CACnD,QAAS,UAAmB,CAC1B,OAAO,EAAO,WAAW,EAE3B,aAAc,KAAK,MAAM,OAAO,WACjC,CAAC,CAAC,CAAC,EAEP,CAAC,CAAC,CAEI,GACP,EAAO,UAAU,CAEnB,EAAQ,QAAU,EAElB,EAAgB,EAAQ,cAAe,SAAS,CAEhD,EAAgB,EAAQ,eAAgB,CACtC,KAAM,aACN,OAAQ,CACN,UAAW,wBACX,WAAY,oBACZ,KAAM,aACP,CACD,aAAc,EACd,WAAY,GACZ,eAAgB,IACjB,CAAC,cC9XF,OAAO,eAAe,EAAS,aAAc,CAC3C,MAAO,GACR,CAAC,CACF,EAAQ,QAAU,IAAK,GAMvB,EAAQ,QAJO,UAAoB,CACjC,OAAO,uBCNT,OAAO,eAAe,EAAS,aAAc,CAC3C,MAAO,GACR,CAAC,CACF,EAAQ,YAAc,EAAQ,YAAc,EAAQ,gBAAkB,EAAQ,uBAAyB,EAAQ,KAAO,IAAK,GAE3H,IAAI,MAEA,EAAgB,OAAqD,CAEzE,SAAS,EAAuB,EAAK,CAAE,OAAO,GAAO,EAAI,WAAa,EAAM,CAAE,QAAS,EAAK,CAI5F,EAAQ,KAFG,UAAgB,GAQ3B,EAAQ,uBAJqB,SAAgC,EAAS,EAAO,CAC3E,MAAO,GAAU,QAAwB,KAc3C,EAAQ,gBATc,SAAyB,EAAG,CAChD,OAAO,EAAI,EAAE,eAAe,MAAM,CAAG,IA4CvC,EAAQ,YAlCU,SAAqB,EAAO,EAAO,CAMnD,GALI,EAAM,cAER,EAAE,EAGA,IAAU,EACZ,MAAO,GAGT,IAAI,EAAiB,EAAO,SAAS,MAAM,EAAM,SAAS,CAE1D,GAAI,EAAM,YAAc,EAAM,OAAS,aAAc,CACnD,IAAI,EAAkB,CAAC,EAAQ,EAAM,sBACjC,EAAe,EAAiB,EAQpC,OANI,IAAU,IAAU,GAAgB,EAAM,cAC5C,IAAoB,IAAM,EAAM,uBAAyB,EAChD,IAAU,IACnB,GAAmB,IAAM,EAAM,uBAG1B,EAGT,MAAO,CAAC,EAAQ,KAoBlB,EAAQ,YATU,SAAqB,EAAU,EAAM,CACrD,IAAI,EAAQ,EAAE,CAKd,MAJA,CAAC,kBAAmB,eAAgB,cAAe,aAAc,YAAa,cAAc,CAAC,QAAQ,SAAU,EAAM,CAEnH,EAAM,IAAS,EAAG,EAAc,SAAS,EAAU,IAAK,EAAK,EAC7D,CACK,gBC1ET,OAAO,eAAe,EAAS,aAAc,CAC3C,MAAO,GACR,CAAC,CACF,EAAQ,qBAAuB,EAAQ,wBAA0B,EAAQ,2BAA6B,EAAQ,sBAAwB,IAAK,GAE3I,IAAI,MAEA,EAAgB,OAAqD,CAErE,OAEJ,SAAS,EAAuB,EAAK,CAAE,OAAO,GAAO,EAAI,WAAa,EAAM,CAAE,QAAS,EAAK,CAE5F,SAAS,EAAQ,EAAQ,EAAgB,CAAE,IAAI,EAAO,OAAO,KAAK,EAAO,CAAE,GAAI,OAAO,sBAAuB,CAAE,IAAI,EAAU,OAAO,sBAAsB,EAAO,CAAM,IAAgB,EAAU,EAAQ,OAAO,SAAU,EAAK,CAAE,OAAO,OAAO,yBAAyB,EAAQ,EAAI,CAAC,YAAc,EAAE,EAAK,KAAK,MAAM,EAAM,EAAQ,CAAI,OAAO,EAE9U,SAAS,EAAc,EAAQ,CAAE,IAAK,IAAI,EAAI,EAAG,EAAI,UAAU,OAAQ,IAAK,CAAE,IAAI,EAAS,UAAU,IAAM,KAAsB,EAAE,CAAjB,UAAU,GAAa,EAAI,EAAK,EAAQ,OAAO,EAAO,CAAE,GAAK,CAAC,QAAQ,SAAU,EAAK,CAAE,EAAgB,EAAQ,EAAK,EAAO,GAAK,EAAI,CAAa,OAAO,0BAA6B,OAAO,iBAAiB,EAAQ,OAAO,0BAA0B,EAAO,CAAC,CAAW,EAAQ,OAAO,EAAO,CAAC,CAAC,QAAQ,SAAU,EAAK,CAAE,OAAO,eAAe,EAAQ,EAAK,OAAO,yBAAyB,EAAQ,EAAI,CAAC,EAAI,CAAM,OAAO,EAE7gB,SAAS,EAAgB,EAAK,EAAK,EAAO,CAA0J,OAApJ,KAAO,EAAO,OAAO,eAAe,EAAK,EAAK,CAAS,QAAO,WAAY,GAAM,aAAc,GAAM,SAAU,GAAM,CAAC,CAAW,EAAI,GAAO,EAAgB,EA4D3M,EAAQ,sBArDoB,SAA+B,EAAO,EAAO,CACvE,IAAI,EAAe,EAAE,CACjB,EAAe,EAAM,aACrB,EAAe,EACf,EAAe,EAAO,SAAS,MAAM,EAAM,SAAS,CAAG,EAG3D,GAFsB,EAAM,eAAiB,EAAe,GAAK,EAAe,GAa9E,OAVI,EAAe,EACb,EAAM,YAAc,EAAM,uBAAyB,EAAM,OAAS,aACpE,EAAa,eAAiB,EAAG,EAAO,aAAa,EAAE,EAAe,GAAK,EAAM,uBAAyB,IAAM,EAAM,uBAAyB,EAAG,EAAM,KAAK,CAE7J,EAAa,eAAiB,EAAG,EAAO,aAAa,EAAE,EAAe,GAAK,IAAK,EAAM,KAAK,CAEpF,EAAe,IACxB,EAAa,eAAiB,EAAG,EAAO,aAAa,EAAG,EAAM,KAAK,EAG9D,EAGT,IAAI,GAAmB,EAAG,EAAO,aAAa,EAAc,EAAM,CAE9D,GAAiB,EAAG,EAAc,SAAS,EAAiB,IAAK,EAAM,KAAK,CAC5E,EAAiB,EAAM,eAAiB,KAkB5C,MAjBA,GAAa,cAAgB,CAC3B,gBAAiB,EACjB,YAAa,EACb,WAAY,EACZ,UAAW,EACZ,CAEI,EAAM,UACT,EAAa,cAAgB,EAAc,EAAc,EAAE,CAAE,EAAa,cAAc,CAAE,EAAE,CAAE,CAC5F,yBAA0B,EAC1B,sBAAuB,EACvB,oBAAqB,EACrB,mBAAoB,EACpB,qBAAsB,EACvB,CAAC,EAGG,GAyET,EAAQ,2BA5DyB,SAAoC,EAAO,EAAO,EAAO,EAAU,CAClG,IAAI,EAAe,EAAE,CACjB,EAAe,EAAM,OAAS,aAE9B,EAAiB,EAAO,SAAS,MAAM,EAAM,SAAS,CAEtD,EAAiB,EACjB,GAAmB,EAAG,EAAO,aAAa,EAAM,aAAc,EAAM,CACpE,EAAe,EAAM,cAAgB,EAAG,EAAO,aAAa,EAAiB,EAAG,EAAM,CAAG,KAAO,EAAG,EAAO,aAAa,EAAiB,EAAG,EAAM,CACjJ,EAAY,EAAe,EAAM,EAAI,EAAM,EAC3C,EAAe,EAEf,IAAoB,GAAkB,EAAY,IACpD,EAAe,GAIb,IAAoB,GAAgB,EAAY,IAClD,EAAe,GAGjB,IAAI,EAAW,EAAkB,KAAO,EAAM,SAAW,GACrD,EAAW,KAAK,IAAI,EAAU,CAAG,EAAM,qBA6B3C,OA3BI,EAAM,cAAgB,IAGpB,EAAM,eAAiB,GAAK,EAAW,KACzC,GAAY,EAAiB,IACpB,EAAM,eAAiB,EAAiB,GAAK,EAAW,CAAC,EAAiB,MACnF,GAAY,EAAiB,OAI7B,CAAC,EAAM,0CAA4C,GAAY,EAAM,wBAClE,EAAM,sBACT,EAAS,CACP,qBAAsB,GACvB,CAAC,CAGJ,EAAa,eAAiB,EAAG,EAAO,aAAa,EAAU,EAAM,KAAK,EAIxE,GAAY,CAAC,EAAM,aACrB,EAAS,CACP,YAAa,GACd,CAAC,CAGG,GAyBT,EAAQ,wBAdsB,SAAiC,EAAO,EAAO,CAC3E,IAAI,GAAmB,EAAG,EAAO,aAAa,EAAM,aAAc,EAAM,CAExE,MAAO,CACL,eAFmB,EAAG,EAAO,aAAa,EAAiB,EAAM,KAAK,CAGvE,EAmDH,EAAQ,qBAxCmB,SAA8B,EAAO,EAAO,CACrE,IAAI,EAAiB,EAAM,eAAiB,KACxC,EAA2B,cAC3B,EAAa,CACf,SAAU,WACV,QAAS,QACT,OAAQ,GACR,UAAW,OACX,QAAS,EACT,IAAK,EACL,MAAO,EACP,KAAM,EACN,OAAQ,EACkB,2BAC1B,2BAA4B,EAC5B,4BAA6B,EAC7B,+BAAgC,EAChC,0BAA2B,EAC5B,CAYD,OAVK,EAAM,UACT,EAAa,EAAc,EAAc,EAAE,CAAE,EAAW,CAAE,EAAE,CAAE,CAC5D,yBAA0B,EAC1B,sBAAuB,EACvB,oBAAqB,EACrB,mBAAoB,EACpB,qBAAsB,EACvB,CAAC,EAGG,CACO,aACZ,cAAe,EAAc,EAAc,EAAE,CAAE,EAAW,CAAE,EAAE,CAAE,CAC9D,QAAS,EACT,SAAU,WACX,CAAC,CACF,UAAW,EAAc,EAAE,CAAE,EAAW,CACzC,eClMH,OAAO,eAAe,EAAS,aAAc,CAC3C,MAAO,GACR,CAAC,CACF,EAAQ,QAAU,IAAK,GAEvB,IAAI,EAAS,MAAyC,CAElD,EAAkB,OAAmD,CAErE,EAAc,OAAmD,CAEjE,EAAU,OAA4C,CAEtD,EAAY,OAAuD,CAEnE,EAAU,OAAqD,CAE/D,OAEA,OAEJ,SAAS,EAAuB,EAAK,CAAE,OAAO,GAAO,EAAI,WAAa,EAAM,CAAE,QAAS,EAAK,CAE5F,SAAS,GAA2B,CAAE,GAAI,OAAO,SAAY,WAAY,OAAO,KAAM,IAAI,EAAQ,IAAI,QAA6F,MAAlF,GAA2B,UAAoC,CAAE,OAAO,GAAiB,EAE1M,SAAS,EAAwB,EAAK,CAAE,GAAI,GAAO,EAAI,WAAc,OAAO,EAAO,GAAI,IAAQ,MAAQ,EAAQ,EAAI,GAAK,UAAY,OAAO,GAAQ,WAAc,MAAO,CAAE,QAAS,EAAK,CAAI,IAAI,EAAQ,GAA0B,CAAE,GAAI,GAAS,EAAM,IAAI,EAAI,CAAI,OAAO,EAAM,IAAI,EAAI,CAAI,IAAI,EAAS,EAAE,CAAM,EAAwB,OAAO,gBAAkB,OAAO,yBAA0B,IAAK,IAAI,KAAO,EAAO,GAAI,OAAO,UAAU,eAAe,KAAK,EAAK,EAAI,CAAE,CAAE,IAAI,EAAO,EAAwB,OAAO,yBAAyB,EAAK,EAAI,CAAG,KAAU,IAAS,EAAK,KAAO,EAAK,KAAQ,OAAO,eAAe,EAAQ,EAAK,EAAK,CAAW,EAAO,GAAO,EAAI,GAAyE,MAA7D,GAAO,QAAU,EAAS,GAAS,EAAM,IAAI,EAAK,EAAO,CAAW,EAEhuB,SAAS,EAAQ,EAAK,CAAE,0BAA4U,MAAjT,CAA4I,EAAxI,OAAO,QAAW,YAAc,OAAO,OAAO,UAAa,SAAsB,SAAiB,EAAK,CAAE,OAAO,OAAO,GAA2B,SAAiB,EAAK,CAAE,OAAO,GAAO,OAAO,QAAW,YAAc,EAAI,cAAgB,QAAU,IAAQ,OAAO,UAAY,SAAW,OAAO,GAAiB,EAAQ,EAAI,CAEvX,SAAS,GAAW,CAAgQ,MAA9P,GAAW,OAAO,QAAU,SAAU,EAAQ,CAAE,IAAK,IAAI,EAAI,EAAG,EAAI,UAAU,OAAQ,IAAK,CAAE,IAAI,EAAS,UAAU,GAAI,IAAK,IAAI,KAAO,EAAc,OAAO,UAAU,eAAe,KAAK,EAAQ,EAAI,GAAI,EAAO,GAAO,EAAO,IAAY,OAAO,GAAkB,EAAS,MAAM,KAAM,UAAU,CAE1T,SAAS,EAAQ,EAAQ,EAAgB,CAAE,IAAI,EAAO,OAAO,KAAK,EAAO,CAAE,GAAI,OAAO,sBAAuB,CAAE,IAAI,EAAU,OAAO,sBAAsB,EAAO,CAAM,IAAgB,EAAU,EAAQ,OAAO,SAAU,EAAK,CAAE,OAAO,OAAO,yBAAyB,EAAQ,EAAI,CAAC,YAAc,EAAE,EAAK,KAAK,MAAM,EAAM,EAAQ,CAAI,OAAO,EAE9U,SAAS,EAAc,EAAQ,CAAE,IAAK,IAAI,EAAI,EAAG,EAAI,UAAU,OAAQ,IAAK,CAAE,IAAI,EAAS,UAAU,IAAM,KAAsB,EAAE,CAAjB,UAAU,GAAa,EAAI,EAAK,EAAQ,OAAO,EAAO,CAAE,GAAK,CAAC,QAAQ,SAAU,EAAK,CAAE,EAAgB,EAAQ,EAAK,EAAO,GAAK,EAAI,CAAa,OAAO,0BAA6B,OAAO,iBAAiB,EAAQ,OAAO,0BAA0B,EAAO,CAAC,CAAW,EAAQ,OAAO,EAAO,CAAC,CAAC,QAAQ,SAAU,EAAK,CAAE,OAAO,eAAe,EAAQ,EAAK,OAAO,yBAAyB,EAAQ,EAAI,CAAC,EAAI,CAAM,OAAO,EAE7gB,SAAS,EAAgB,EAAU,EAAa,CAAE,GAAI,EAAE,aAAoB,GAAgB,MAAU,UAAU,oCAAoC,CAEpJ,SAAS,EAAkB,EAAQ,EAAO,CAAE,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,IAAK,CAAE,IAAI,EAAa,EAAM,GAAI,EAAW,WAAa,EAAW,YAAc,GAAO,EAAW,aAAe,GAAU,UAAW,IAAY,EAAW,SAAW,IAAM,OAAO,eAAe,EAAQ,EAAW,IAAK,EAAW,EAExT,SAAS,EAAa,EAAa,EAAY,EAAa,CAAsI,OAAhI,GAAY,EAAkB,EAAY,UAAW,EAAW,CAAM,GAAa,EAAkB,EAAa,EAAY,CAAS,EAEzM,SAAS,EAAU,EAAU,EAAY,CAAE,GAAI,OAAO,GAAe,YAAc,IAAe,KAAQ,MAAU,UAAU,qDAAqD,CAAI,EAAS,UAAY,OAAO,OAAO,GAAc,EAAW,UAAW,CAAE,YAAa,CAAE,MAAO,EAAU,SAAU,GAAM,aAAc,GAAM,CAAE,CAAC,CAAM,GAAY,EAAgB,EAAU,EAAW,CAE9X,SAAS,EAAgB,EAAG,EAAG,CAA4G,MAA1G,GAAkB,OAAO,gBAAkB,SAAyB,EAAG,EAAG,CAAmB,MAAjB,GAAE,UAAY,EAAU,GAAa,EAAgB,EAAG,EAAE,CAEvK,SAAS,EAAa,EAAS,CAAE,IAAI,EAA4B,GAA2B,CAAE,OAAO,UAAgC,CAAE,IAAI,EAAQ,EAAgB,EAAQ,CAAE,EAAQ,GAAI,EAA2B,CAAE,IAAI,EAAY,EAAgB,KAAK,CAAC,YAAa,EAAS,QAAQ,UAAU,EAAO,UAAW,EAAU,MAAW,EAAS,EAAM,MAAM,KAAM,UAAU,CAAI,OAAO,EAA2B,KAAM,EAAO,EAEna,SAAS,EAA2B,EAAM,EAAM,CAA2F,OAArF,IAAS,EAAQ,EAAK,GAAK,UAAY,OAAO,GAAS,YAAsB,EAAe,EAAuB,EAAK,CAE9K,SAAS,EAAuB,EAAM,CAAE,GAAI,IAAS,IAAK,GAAK,MAAU,eAAe,4DAA4D,CAAI,OAAO,EAE/J,SAAS,GAA4B,CAA0E,GAApE,OAAO,QAAY,KAAe,CAAC,QAAQ,WAA6B,QAAQ,UAAU,KAAM,MAAO,GAAO,GAAI,OAAO,OAAU,WAAY,MAAO,GAAM,GAAI,CAA6E,OAA3E,KAAK,UAAU,SAAS,KAAK,QAAQ,UAAU,KAAM,EAAE,CAAE,UAAY,GAAG,CAAC,CAAS,QAAkB,CAAE,MAAO,IAE1T,SAAS,EAAgB,EAAG,CAAqJ,MAAnJ,GAAkB,OAAO,eAAiB,OAAO,eAAiB,SAAyB,EAAG,CAAE,OAAO,EAAE,WAAa,OAAO,eAAe,EAAE,EAAY,EAAgB,EAAE,CAE1M,SAAS,EAAgB,EAAK,EAAK,EAAO,CAA0J,OAApJ,KAAO,EAAO,OAAO,eAAe,EAAK,EAAK,CAAS,QAAO,WAAY,GAAM,aAAc,GAAM,SAAU,GAAM,CAAC,CAAW,EAAI,GAAO,EAAgB,EAE3M,IAAI,EAAwB,SAAU,EAAkB,CACtD,EAAU,EAAU,EAAiB,CAErC,IAAI,EAAS,EAAa,EAAS,CAGnC,SAAS,EAAS,EAAO,CACvB,IAAI,EAEJ,EAAgB,KAAM,EAAS,CAE/B,EAAQ,EAAO,KAAK,KAAM,EAAM,CAEhC,EAAgB,EAAuB,EAAM,CAAE,YAAa,IAAK,GAAE,CAEnE,EAAgB,EAAuB,EAAM,CAAE,qBAAsB,IAAK,GAAE,CAE5E,EAAgB,EAAuB,EAAM,CAAE,UAAW,IAAK,GAAE,CAEjE,EAAgB,EAAuB,EAAM,CAAE,WAAY,IAAK,GAAE,CAElE,EAAgB,EAAuB,EAAM,CAAE,QAAS,IAAK,GAAE,CAE/D,EAAgB,EAAuB,EAAM,CAAE,mBAAoB,IAAK,GAAE,CAE1E,EAAgB,EAAuB,EAAM,CAAE,eAAgB,SAAU,EAAM,CAC7E,EAAM,UAAY,GAClB,CAEF,EAAgB,EAAuB,EAAM,CAAE,wBAAyB,SAAU,EAAM,CACtF,EAAM,mBAAqB,GAC3B,CAEF,EAAgB,EAAuB,EAAM,CAAE,aAAc,SAAU,EAAM,CAC3E,EAAM,QAAU,GAChB,CAEF,EAAgB,EAAuB,EAAM,CAAE,cAAe,SAAU,EAAM,EAAO,CACnF,CACE,CAAM,WAAW,EAAE,CAGrB,EAAM,SAAS,GAAS,GACxB,CAEF,EAAgB,EAAuB,EAAM,CAAE,WAAY,UAAY,CACjE,EAAO,SAAS,MAAM,EAAM,MAAM,SAAS,EAAI,IAInD,EAAM,eAAe,CAEhB,EAAM,MAAM,WAIjB,EAAM,MAAQ,WAAW,UAAY,CACnC,EAAM,WAAW,EAChB,EAAM,MAAM,SAAS,IACxB,CAEF,EAAgB,EAAuB,EAAM,CAAE,gBAAiB,UAAY,CACtE,EAAM,OAAO,aAAa,EAAM,MAAM,EAC1C,CAEF,EAAgB,EAAuB,EAAM,CAAE,gBAAiB,UAAY,CAC1E,EAAM,eAAe,CAErB,EAAM,UAAU,EAChB,CAEF,EAAgB,EAAuB,EAAM,CAAE,cAAe,UAAY,CACxE,EAAM,SAAS,CACb,eAAgB,GACjB,CAAE,EAAM,cAAc,EACvB,CAEF,EAAgB,EAAuB,EAAM,CAAE,eAAgB,UAAY,CACzE,EAAM,SAAS,CACb,eAAgB,GACjB,CAAE,EAAM,SAAS,EAClB,CAEF,EAAgB,EAAuB,EAAM,CAAE,2BAA4B,UAAY,CASrF,OARK,EAAM,mBAIX,IAAK,EAAG,EAAU,UAAU,CAAC,gBAAkB,EAAM,oBAAsB,EAAM,mBAAmB,UAAU,EAAG,EAAU,UAAU,CAAC,cAAc,EAH3I,IAQT,CAEF,EAAgB,EAAuB,EAAM,CAAE,uBAAwB,SAAU,EAAG,CAC7E,KAAM,0BAA0B,CAKrC,KAAI,EADO,EAAM,MAAM,OACK,aACxB,EAAW,CACb,QAAS,GACT,WAAY,GACZ,UAAW,GACX,UAAW,GACZ,CACG,EAAU,EAAe,EAAS,WAAa,EAAS,UACxD,EAAU,EAAe,EAAS,UAAY,EAAS,QAEvD,IAAY,EAAE,QAChB,EAAM,WAAW,CACR,IAAY,EAAE,SACvB,EAAM,WAAW,GAEnB,CAEF,EAAgB,EAAuB,EAAM,CAAE,cAAe,UAAY,CACpE,MAAC,EAAM,MAAM,aAAe,CAAC,EAAM,UAAY,EAAM,SAAS,SAAW,GAI7E,KAAI,EAAe,EAAM,MAAM,OAAS,aACpC,EAAY,EAAM,SAAS,GAE1B,KAIL,KAAI,EAAW,EAAe,EAAU,YAAc,EAAU,aAEhE,EAAM,SAAS,CACH,WACX,CAAC,CAEE,EAAM,WACR,EAAM,UAAU,aAAa,IAE/B,CAEF,EAAgB,EAAuB,EAAM,CAAE,gBAAiB,UAAY,CAC1E,EAAM,SAAS,CACb,SAAU,GACX,CAAC,CAEF,EAAM,aAAa,EACnB,CAEF,EAAgB,EAAuB,EAAM,CAAE,kBAAmB,SAAU,EAAO,EAAM,CACnF,KAAO,SAAS,MAAM,EAAM,MAAM,SAAS,GAAK,EAIpD,IAAI,EAAM,MAAM,YAAa,CAC3B,EAAM,SAAS,CACb,YAAa,GACd,CAAC,CAEF,OAGF,EAAM,MAAM,YAAY,EAAO,EAAK,CAEhC,IAAU,EAAM,MAAM,cACxB,EAAM,SAAS,CACb,aAAc,EACf,CAAC,GAEJ,CAEF,EAAgB,EAAuB,EAAM,CAAE,iBAAkB,SAAU,EAAO,EAAM,CAClF,EAAO,SAAS,MAAM,EAAM,MAAM,SAAS,EAAI,GAInD,EAAM,MAAM,SAAS,EAAO,EAAK,EACjC,CAEF,EAAgB,EAAuB,EAAM,CAAE,mBAAoB,SAAU,EAAO,EAAM,CACxF,EAAM,MAAM,aAAa,EAAO,EAAK,CAErC,EAAM,OAAO,EAAM,EACnB,CAEF,EAAgB,EAAuB,EAAM,CAAE,eAAgB,SAAU,EAAO,CAC9E,EAAM,SAAS,CACb,QAAS,GACV,CAAC,CAEF,EAAM,MAAM,aAAa,EAAM,EAC/B,CAEF,EAAgB,EAAuB,EAAM,CAAE,aAAc,SAAU,EAAO,CAC5E,EAAM,SAAS,CACb,QAAS,GACT,YAAa,GACb,qBAAsB,GACvB,CAAC,CAEF,EAAM,MAAM,WAAW,EAAM,CAE7B,EAAM,eAAe,CAEjB,EAAM,MAAM,UACd,EAAM,UAAU,EAElB,CAEF,EAAgB,EAAuB,EAAM,CAAE,cAAe,SAAU,EAAO,EAAO,CACpF,EAAM,MAAM,YAAY,EAAM,CAE9B,IAAI,EAA2B,EAAM,MAAM,sBAAsB,EAAO,EAAM,MAAO,EAAM,MAAO,EAAM,SAAS,KAAK,EAAuB,EAAM,CAAC,CAAC,CAMrJ,OAJA,EAAM,SAAS,EAAc,EAAE,CAAE,EAAyB,CAAC,CAIpD,CAAC,CAAC,OAAO,KAAK,EAAyB,CAAC,QAC/C,CAEF,EAAgB,EAAuB,EAAM,CAAE,YAAa,UAAY,CACtE,IAAI,EAAY,UAAU,OAAS,GAAK,UAAU,KAAO,OAAY,UAAU,GAAK,EAEpF,EAAM,OAAO,EAAM,MAAM,cAAgB,OAAO,GAAc,SAAW,EAAY,GAAG,EACxF,CAEF,EAAgB,EAAuB,EAAM,CAAE,YAAa,UAAY,CACtE,IAAI,EAAY,UAAU,OAAS,GAAK,UAAU,KAAO,OAAY,UAAU,GAAK,EAEpF,EAAM,OAAO,EAAM,MAAM,cAAgB,OAAO,GAAc,SAAW,EAAY,GAAG,EACxF,CAEF,EAAgB,EAAuB,EAAM,CAAE,SAAU,SAAU,EAAU,CACvE,UAAO,GAAa,SAIxB,KAAI,EAAe,EAAO,SAAS,MAAM,EAAM,MAAM,SAAS,CAAG,EAE7D,EAAW,IACb,EAAW,EAAM,MAAM,aAAe,EAAe,GAGnD,EAAW,IACb,EAAW,EAAM,MAAM,aAAe,EAAI,GAG5C,EAAM,WAAW,CAEf,aAAc,EACf,CAAC,CAIE,EAAM,MAAM,UAAY,EAAM,MAAM,iBAAmB,IACzD,EAAM,eAAe,GAEvB,CAEF,EAAgB,EAAuB,EAAM,CAAE,cAAe,UAAY,CACxE,EAAM,UAAU,EAAE,EAClB,CAEF,EAAgB,EAAuB,EAAM,CAAE,cAAe,UAAY,CACxE,EAAM,UAAU,EAAE,EAClB,CAEF,EAAgB,EAAuB,EAAM,CAAE,iBAAkB,UAAY,CAC3E,EAAM,UAAU,EAAE,CAEd,EAAM,MAAM,cACd,EAAM,SAAS,CACb,YAAa,GACd,CAAC,EAEJ,CAEF,EAAgB,EAAuB,EAAM,CAAE,mBAAoB,UAAY,CAC7E,EAAM,UAAU,EAAE,CAEd,EAAM,MAAM,cACd,EAAM,SAAS,CACb,YAAa,GACd,CAAC,EAEJ,CAEF,EAAgB,EAAuB,EAAM,CAAE,aAAc,SAAU,EAAU,CAC/E,OAAO,SAAU,EAAG,EACd,EAAE,EAAG,EAAO,iBAAiB,EAAE,EAAI,EAAE,MAAQ,UAC/C,EAAM,OAAO,EAAS,GAG1B,CAEF,EAAgB,EAAuB,EAAM,CAAE,aAAc,SAAU,EAAO,CAE5E,EAAM,SAAS,EAAc,CAC3B,aAAc,EAAM,MAAM,aAC3B,CAAE,EAAM,CAAE,UAAY,CAErB,EAAM,SAAS,EAAM,iBAAiB,EAAM,MAAO,EAAM,MAAM,CAAC,EAChE,CAEF,EAAM,eAAe,EAAM,aAAc,EAAO,SAAS,QAAQ,EAAM,MAAM,SAAS,CAAC,EAAM,cAAc,EAC3G,CAEF,EAAgB,EAAuB,EAAM,CAAE,kBAAmB,UAAY,CAC5E,IAAI,EAAe,EAAM,MAAM,aAC3B,EAAO,EAAM,UAAY,EAAM,SAAS,GAE5C,OADa,GAAQ,EAAK,qBAAqB,MAAM,EAAI,EAAE,EAC7C,IACd,CAEF,EAAgB,EAAuB,EAAM,CAAE,wBAAyB,SAAU,EAAU,CAC1F,IAAI,EAAO,EAAM,UAAY,EAAM,SAAS,GAE5C,GAAI,EAAM,MAAM,UAAY,GAAQ,EAAK,SAAS,OAAQ,CACxD,IAAI,EAAc,EAAK,SAAS,GAAG,qBAAqB,MAAM,EAAI,EAAE,CAEpE,GAAI,EAAY,OAAS,EAAG,CAC1B,IAAI,EAAQ,EAAY,GAEnB,EAAM,UAQT,EAAM,iBAAiB,OANL,SAAS,GAAc,CACvC,EAAM,aAAa,CAEnB,EAAM,oBAAoB,OAAQ,EAAY,EAGL,CAM/C,IAAI,GADc,EAAY,IAAM,EAAK,SAAS,IACzB,aACzB,OAAO,EAAS,EAAI,EAAS,KAG/B,OAAO,MACP,CAEF,IAAI,EAAY,CACd,YAAa,GACb,aAAc,EAAM,aACpB,aAAc,EAAM,aACpB,SAAU,GACV,eAAgB,GAChB,SAAU,EAAM,SAChB,QAAS,GACT,qBAAsB,GACtB,YAAa,GACb,SAAU,EACV,cAAe,EAAE,CACjB,WAAY,EAAE,CACd,cAAe,EAAE,CACjB,UAAW,EAAE,CACd,CAGD,MAFA,GAAM,iBAAmB,OAAO,EAAM,kBAAqB,YAAc,EAAM,kBAAoB,EAAM,mBAAqB,QAAU,EAAY,sBAAwB,EAAY,sBACxL,EAAM,MAAQ,EAAc,EAAc,EAAE,CAAE,EAAU,CAAE,EAAM,iBAAiB,EAAO,EAAU,CAAC,CAC5F,EAqTT,OAlTA,EAAa,EAAU,CAAC,CACtB,IAAK,oBACL,MAAO,UAA6B,CAC7B,KAAK,MAAM,UAIhB,KAAK,eAAe,EAEvB,CAAE,CACD,IAAK,qBACL,MAAO,SAA4B,EAAW,EAAW,CACnD,CAAC,EAAU,UAAY,KAAK,MAAM,UAAY,CAAC,KAAK,MAAM,aAC5D,KAAK,eAAe,CAGlB,CAAC,EAAU,WAAa,KAAK,MAAM,WACrC,KAAK,YAAY,CAGf,EAAU,SAAW,CAAC,KAAK,MAAM,SAEnC,KAAK,SAAS,EAAc,EAAE,CAAE,KAAK,MAAM,mBAAmB,KAAK,MAAO,KAAK,MAAM,CAAC,CAAC,EAGrF,EAAU,eAAiB,KAAK,MAAM,cAAgB,EAAU,aAAe,KAAK,MAAM,cAC5F,KAAK,aAAa,CAClB,KAAK,OAAO,KAAK,MAAM,aAAa,EAGlC,EAAU,WAAa,KAAK,MAAM,WAChC,KAAK,MAAM,SACb,KAAK,eAAe,CAEpB,KAAK,iBAAiB,CAGxB,KAAK,SAAS,CACZ,SAAU,KAAK,MAAM,SACtB,CAAC,GAGP,CAAE,CACD,IAAK,uBACL,MAAO,UAAgC,CACrC,KAAK,iBAAiB,EAEzB,CAAE,CACD,IAAK,gBACL,MAAO,UAAyB,CAC9B,IAAI,EAAS,KAEb,KAAK,YAAY,CAEb,KAAK,MAAM,UAAY,EAAO,SAAS,MAAM,KAAK,MAAM,SAAS,CAAG,GACtE,KAAK,eAAe,CAGlB,KAAK,MAAM,WACb,KAAK,YAAY,CAGnB,KAAK,SAAS,CACZ,YAAa,GACd,CAAE,UAAY,CACb,IAAI,EAAe,EAAO,iBAAiB,CAEvC,GAAgB,CAAC,EAAa,SAEhC,EAAa,iBAAiB,OAAQ,EAAO,cAAc,CAE3D,EAAO,eAAe,EAExB,EAEL,CAAE,CACD,IAAK,kBACL,MAAO,UAA2B,CAC5B,KAAK,MAAM,cACb,KAAK,cAAc,CACnB,KAAK,iBAAiB,GAG3B,CAAE,CACD,IAAK,gBACL,MAAO,UAAyB,CAC9B,KAAK,UAAU,CACf,IAAI,EAAkB,KAAK,mBAEvB,KAAK,MAAM,aAAe,IAC5B,EAAgB,iBAAiB,aAAc,KAAK,YAAY,CAChE,EAAgB,iBAAiB,aAAc,KAAK,aAAa,GAGtE,CAAE,CACD,IAAK,kBACL,MAAO,UAA2B,CAChC,KAAK,eAAe,CACpB,IAAI,EAAkB,KAAK,mBAEvB,KAAK,MAAM,aAAe,IAC5B,EAAgB,oBAAoB,aAAc,KAAK,YAAY,CACnE,EAAgB,oBAAoB,aAAc,KAAK,aAAa,GAGzE,CAAE,CACD,IAAK,aACL,MAAO,UAAsB,EAG1B,EAAG,EAAQ,UAAU,CAAC,iBAAiB,SAAU,KAAK,YAAY,EAElE,EAAG,EAAQ,UAAU,CAAC,iBAAiB,mBAAoB,KAAK,YAAY,CAEzE,KAAK,MAAM,oBACZ,EAAG,EAAU,UAAU,CAAC,iBAAiB,UAAW,KAAK,qBAAqB,EAGpF,CAAE,CACD,IAAK,eACL,MAAO,UAAwB,EAE5B,EAAG,EAAQ,UAAU,CAAC,oBAAoB,SAAU,KAAK,YAAY,EACrE,EAAG,EAAQ,UAAU,CAAC,oBAAoB,mBAAoB,KAAK,YAAY,CAChF,IAAI,EAAe,KAAK,iBAAiB,CAErC,GACF,EAAa,oBAAoB,OAAQ,KAAK,cAAc,CAG1D,KAAK,MAAM,oBACZ,EAAG,EAAU,UAAU,CAAC,oBAAoB,UAAW,KAAK,qBAAqB,EAGvF,CAAE,CACD,IAAK,aACL,MAAO,UAAsB,CAC3B,IAAI,GAEH,EAAwB,KAAK,qBAAwB,MAAoD,EAAsB,OAAO,EAE1I,CAAE,CACD,IAAK,cACL,MAAO,SAAqB,EAAS,CACnC,IAAI,EAAS,KAMb,OAJK,KAAK,MAAM,SAIT,EAAO,SAAS,IAAI,KAAK,MAAM,SAAU,SAAU,EAAM,EAAO,CACrE,IAAI,EAAa,IAAU,EAAO,MAAM,aACpC,EAAa,IAAU,EAAO,MAAM,aACpC,EAAQ,GAAc,EAAO,MAAM,eAAiB,GAAc,EAAO,MAAM,WAAa,EAAO,MAAM,YAAc,EAAE,CAEzH,EAAO,MAAM,YAAc,EAAO,MAAM,OAAS,eACnD,EAAQ,EAAc,EAAc,EAAE,CAAE,EAAM,CAAE,EAAE,CAAE,CAClD,SAAU,EAAO,MAAM,sBAAwB,IAChD,CAAC,EAGA,EAAO,MAAM,SAAW,EAAO,MAAM,uBACvC,EAAQ,EAAc,EAAc,EAAE,CAAE,EAAM,CAAE,EAAE,CAAE,CAClD,cAAe,OAChB,CAAC,EAGJ,IAAI,EAAa,CACf,IAAK,SAAa,EAAG,CACnB,OAAO,EAAO,YAAY,EAAG,EAAM,EAErC,IAAK,UAAY,GAAS,EAAU,QAAU,IAC9C,UAAW,EAAY,QAAQ,KAAK,GAAM,IAAU,EAAO,MAAM,aAAc,IAAU,EAAO,MAAM,aAAa,CACnH,QAAS,EAAO,gBAAgB,KAAK,EAAQ,EAAO,EAAK,CAClD,QACR,CACD,OAAoB,EAAO,QAAQ,cAAc,KAAM,EAAY,EAAO,MAAM,WAAW,EAAM,CAC/F,WAAY,IAAU,EAAO,MAAM,aACnC,WAAY,IAAU,EAAO,MAAM,aACpC,CAAC,CAAC,EACH,CAjCO,EAAE,EAmCd,CAAE,CACD,IAAK,iBACL,MAAO,UAA0B,CAC/B,IAAI,EAAS,KAET,EAAc,KAAK,MACnB,EAAiB,EAAY,eAC7B,EAAS,EAAY,OACrB,EAAkB,EAAY,gBAC9B,EAAW,EAAY,SAM3B,OAJK,EAIe,EAAO,QAAQ,cAAc,KAAM,CACrD,UAAW,eACZ,CAAE,EAAO,SAAS,IAAI,EAAU,SAAU,EAAG,EAAO,CACnD,OAAO,GAAmB,EAAgB,EAAO,WAAW,EAAM,CAAE,IAAU,EAAO,MAAM,aAAc,EAAO,EAAO,KAAK,EAC5H,CAAC,CAPM,MASZ,CAAE,CACD,IAAK,eACL,MAAO,UAAwB,CAK7B,OAJK,KAAK,MAAM,WAII,EAAO,QAAQ,cAAc,IAAK,CACpD,UAAW,kBACZ,CAAE,KAAK,MAAM,gBAAgB,KAAK,MAAM,aAAe,EAAG,EAAO,SAAS,MAAM,KAAK,MAAM,SAAS,CAAC,CAAC,CAL9F,MAOZ,CAAE,CACD,IAAK,eACL,MAAO,UAAwB,CAK7B,MAJI,CAAC,KAAK,MAAM,YAAc,CAAC,KAAK,MAAM,UAAY,EAAO,SAAS,MAAM,KAAK,MAAM,SAAS,GAAK,EAC5F,KAGW,EAAO,QAAQ,cAAc,EAAQ,QAAS,CAChE,IAAK,KAAK,aACV,aAAc,KAAK,iBACnB,aAAc,KAAK,MAAM,aACzB,eAAgB,KAAK,MAAM,eAC3B,WAAY,KAAK,MAAM,WACvB,OAAQ,KAAK,MAAM,OACnB,aAAc,KAAK,MAAM,aAC1B,CAAE,KAAK,MAAM,aAAa,KAAK,MAAM,SAAS,CAAC,EAEnD,CAAE,CACD,IAAK,SACL,MAAO,UAAkB,CACvB,IAAI,EAAS,KAEb,GAAI,CAAC,KAAK,MAAM,UAAY,EAAO,SAAS,MAAM,KAAK,MAAM,SAAS,GAAK,EACzE,OAAO,KAGT,IAAI,EAAc,KAAK,MAAM,WAAa,EAAO,SAAS,MAAM,KAAK,MAAM,SAAS,CAAG,EACnF,EAAe,KAAK,MAAM,OAAS,aACnC,EAAgB,KAAK,MAAM,YAAc,EAAO,SAAS,MAAM,KAAK,MAAM,SAAS,CAAG,EAEtF,EAAU,IAAkB,KAAK,MAAM,aAAe,GAAK,KAAK,MAAM,eAAiB,GAEvF,EAAU,IAAkB,KAAK,MAAM,aAAe,EAAO,SAAS,MAAM,KAAK,MAAM,SAAS,CAAG,GAAK,KAAK,MAAM,eAAiB,GACpI,EAAa,KAAK,YAAY,GAAK,CACnC,EAAa,EAAW,OAAO,CAC/B,EAAY,EAAW,KAAK,CAC5B,EAAc,CAChB,UAAW,EAAY,QAAQ,OAAO,GAAM,KAAK,MAAM,QAAQ,CAC/D,YAAa,KAAK,YAClB,aAAc,KAAK,aACnB,WAAY,KAAK,WACjB,MAAO,KAAK,MAAM,cAClB,UAAW,KAAK,MAAM,qBACvB,CACG,EAAkB,EAAE,CAoBxB,OAlBI,GACF,EAAY,YAAc,KAAK,eAC/B,EAAY,aAAe,KAAK,iBAE5B,KAAK,MAAM,gBAGb,EAAgB,OAFC,KAAK,sBAAsB,KAAK,MAAM,aAAa,EAE7B,UAGzC,EAAY,UAAY,KAAK,MAAM,gBAAkB,UAAY,KAAK,iBAAmB,KAAK,eAC9F,EAAY,YAAc,KAAK,MAAM,gBAAkB,UAAY,KAAK,eAAiB,KAAK,iBAC9F,EAAY,MAAQ,EAAc,EAAc,EAAE,CAAE,EAAY,MAAM,CAAE,EAAE,CAAE,CAC1E,OAAQ,KAAK,MAAM,SACpB,CAAC,CACF,EAAgB,OAAS,KAAK,MAAM,UAGlB,EAAO,QAAQ,cAAc,MAAO,CACtD,aAAc,KAAK,MAAM,UACzB,UAAW,EAAY,QAAQ,KAAK,KAAK,MAAM,UAAU,CACzD,IAAK,KAAK,sBACV,SAAU,KAAK,MAAM,kBAAoB,EAAI,OAC9C,CAAe,EAAO,QAAQ,cAAc,MAAO,CAClD,UAAW,EAAY,QAAQ,SAAS,GAAK,CAC7C,MAAO,CACL,MAAO,KAAK,MAAM,MACnB,CACF,CAAE,KAAK,gBAAgB,CAAE,KAAK,MAAM,gBAAgB,KAAK,YAAa,EAAS,KAAK,MAAM,OAAO,UAAU,CAAe,EAAO,QAAQ,cAAc,MAAO,CAC7J,UAAW,EAAY,QAAQ,QAAQ,GAAM,KAAK,MAAM,KAAK,CAC7D,MAAO,EACR,CAAE,EAA2B,EAAO,QAAQ,cAAc,EAAgB,QAAS,EAAS,CAC3F,QAAS,KACT,SAAU,KAAK,WAChB,CAAE,EAAa,CACd,iBAAkB,KAAK,MAAM,aAC9B,CAAC,CAAE,KAAK,MAAM,cAAgB,EAAW,KAAK,aAAa,CAAE,KAAK,MAAM,cAAgB,EAAW,CAAgB,EAAO,QAAQ,cAAc,KAAM,CACrJ,UAAW,EAAY,QAAQ,OAAO,GAAM,KAAK,MAAM,QAAQ,CAC/D,IAAK,SAAa,EAAM,CACtB,OAAO,EAAO,WAAW,EAAK,EAEhC,MAAO,KAAK,MAAM,eAAiB,EAAE,CACtC,CAAE,KAAK,MAAM,cAAgB,EAAW,KAAK,aAAa,CAAE,KAAK,MAAM,cAAgB,EAAW,CAAC,CAAE,KAAK,MAAM,gBAAgB,KAAK,YAAa,EAAS,KAAK,MAAM,OAAO,WAAW,CAAE,KAAK,cAAc,CAAC,CAAE,KAAK,cAAc,CAAC,EAExO,CAAC,CAAC,CAEI,GACP,EAAO,QAAQ,UAAU,CAE3B,EAAQ,QAAU,EAElB,EAAgB,EAAU,cAAe,WAAW,CAEpD,EAAgB,EAAU,eAAgB,CACxC,UAAW,OACX,KAAM,aACN,sBAAuB,GACvB,SAAU,IACV,OAAQ,CACN,UAAW,wBACX,WAAY,oBACZ,KAAM,aACP,CACD,YAAa,EAAO,KACpB,aAAc,EAAO,KACrB,SAAU,EAAO,KACjB,aAAc,UAAwB,GACtC,WAAY,UAAsB,GAClC,YAAa,UAAuB,CAClC,MAAO,IAET,yCAA0C,GAC1C,gBAAiB,SAAyB,EAAgB,EAAS,EAAO,CACxE,OAAoB,EAAO,QAAQ,cAAc,SAAU,CACzD,KAAM,SACN,aAAc,EACd,UAAW,EAAY,QAAQ,WAAW,CAAC,EAAQ,CACnD,QAAS,EACV,CAAC,EAEJ,gBAAiB,SAAyB,EAAgB,EAAS,EAAO,CACxE,OAAoB,EAAO,QAAQ,cAAc,SAAU,CACzD,KAAM,SACN,aAAc,EACd,UAAW,EAAY,QAAQ,WAAW,CAAC,EAAQ,CACnD,QAAS,EACV,CAAC,EAEJ,gBAAiB,SAAyB,EAAgB,EAAY,EAAO,EAAO,CAClF,OAAoB,EAAO,QAAQ,cAAc,KAAM,CACrD,UAAW,EAAY,QAAQ,IAAI,EAAW,CAC9C,QAAS,EACT,UAAW,EACX,MAAO,EACP,IAAK,EACL,KAAM,SACN,SAAU,EACV,aAAc,GAAU,KAAmB,EAAQ,IACpD,CAAC,EAEJ,WAAY,SAAoB,EAAM,CACpC,OAAO,GAET,aAAc,SAAsB,EAAU,CAC5C,IAAI,EAAS,EAAO,SAAS,IAAI,EAAU,SAAU,EAAM,CACzD,IAAI,EAAM,EAEV,GAAI,EAAK,OAAS,QAChB,EAAM,EAAO,SAAS,QAAQ,EAAK,MAAM,SAAS,CAAC,KAAK,SAAU,EAAU,CAC1E,OAAO,EAAS,OAAS,OACzB,EAGC,EAIL,OAAO,GACP,CASF,OAPI,EAAO,OAAO,SAAU,EAAO,CACjC,OAAO,GACP,CAAC,SAAW,GACZ,QAAQ,KAAK,gTAAgT,CACtT,EAAE,EAGJ,GAET,gBAAiB,EAAO,uBACxB,aAAc,EACd,WAAY,GACZ,eAAgB,GAChB,WAAY,GACZ,WAAY,GACZ,YAAa,GACb,qBAAsB,EACtB,UAAW,GACX,eAAgB,IAChB,cAAe,WACf,MAAO,OACP,iBAAkB,QAClB,sBAAuB,EAAY,2BACnC,mBAAoB,EAAY,wBACjC,CAAC,6BC3zBF,OAAO,eAAe,EAAS,aAAc,CAC3C,MAAO,GACR,CAAC,CACF,OAAO,eAAe,EAAS,WAAY,CACzC,WAAY,GACZ,IAAK,UAAe,CAClB,OAAO,EAAU,SAEpB,CAAC,CACF,OAAO,eAAe,EAAS,gBAAiB,CAC9C,WAAY,GACZ,IAAK,UAAe,CAClB,OAAO,EAAO,eAEjB,CAAC,CACF,OAAO,eAAe,EAAS,SAAU,CACvC,WAAY,GACZ,IAAK,UAAe,CAClB,OAAO,EAAQ,SAElB,CAAC,CAEF,IAAI,EAAY,OAAwD,CAEpE,OAEA,EAAU,OAAsD,CAEpE,SAAS,EAAuB,EAAK,CAAE,OAAO,GAAO,EAAI,WAAa,EAAM,CAAE,QAAS,EAAK,mBC9B5F,IAAI,OAsBJ,EAAO,QAJG,UAAW,CACnB,OAAO,EAAK,KAAK,KAAK,mBClBxB,IAAI,EAAe,KAUnB,SAAS,EAAgB,EAAQ,CAG/B,IAFA,IAAI,EAAQ,EAAO,OAEZ,KAAW,EAAa,KAAK,EAAO,OAAO,EAAM,CAAC,GACzD,OAAO,EAGT,EAAO,QAAU,mBClBjB,IAAI,OAGA,EAAc,OASlB,SAAS,EAAS,EAAQ,CACxB,OAAO,GACH,EAAO,MAAM,EAAG,EAAgB,EAAO,CAAG,EAAE,CAAC,QAAQ,EAAa,GAAG,CAI3E,EAAO,QAAU,mBClBjB,IAAI,OACA,MACA,OAGA,EAAM,IAGN,EAAa,qBAGb,EAAa,aAGb,EAAY,cAGZ,EAAe,SAyBnB,SAAS,EAAS,EAAO,CACvB,GAAI,OAAO,GAAS,SAClB,OAAO,EAET,GAAI,EAAS,EAAM,CACjB,OAAO,EAET,GAAI,EAAS,EAAM,CAAE,CACnB,IAAI,EAAQ,OAAO,EAAM,SAAW,WAAa,EAAM,SAAS,CAAG,EACnE,EAAQ,EAAS,EAAM,CAAI,EAAQ,GAAM,EAE3C,GAAI,OAAO,GAAS,SAClB,OAAO,IAAU,EAAI,EAAQ,CAAC,EAEhC,EAAQ,EAAS,EAAM,CACvB,IAAI,EAAW,EAAW,KAAK,EAAM,CACrC,OAAQ,GAAY,EAAU,KAAK,EAAM,CACrC,EAAa,EAAM,MAAM,EAAE,CAAE,EAAW,EAAI,EAAE,CAC7C,EAAW,KAAK,EAAM,CAAG,EAAM,CAAC,EAGvC,EAAO,QAAU,mBC/DjB,IAAI,MACA,OACA,OAGA,EAAkB,sBAGlB,EAAY,KAAK,IACjB,EAAY,KAAK,IAwDrB,SAAS,EAAS,EAAM,EAAM,EAAS,CACrC,IAAI,EACA,EACA,EACA,EACA,EACA,EACA,EAAiB,EACjB,EAAU,GACV,EAAS,GACT,EAAW,GAEf,GAAI,OAAO,GAAQ,WACjB,MAAU,UAAU,EAAgB,CAEtC,EAAO,EAAS,EAAK,EAAI,EACrB,EAAS,EAAQ,GACnB,EAAU,CAAC,CAAC,EAAQ,QACpB,EAAS,YAAa,EACtB,EAAU,EAAS,EAAU,EAAS,EAAQ,QAAQ,EAAI,EAAG,EAAK,CAAG,EACrE,EAAW,aAAc,EAAU,CAAC,CAAC,EAAQ,SAAW,GAG1D,SAAS,EAAW,EAAM,CACxB,IAAI,EAAO,EACP,EAAU,EAKd,MAHA,GAAW,EAAW,OACtB,EAAiB,EACjB,EAAS,EAAK,MAAM,EAAS,EAAK,CAC3B,EAGT,SAAS,EAAY,EAAM,CAMzB,MAJA,GAAiB,EAEjB,EAAU,WAAW,EAAc,EAAK,CAEjC,EAAU,EAAW,EAAK,CAAG,EAGtC,SAAS,EAAc,EAAM,CAC3B,IAAI,EAAoB,EAAO,EAC3B,EAAsB,EAAO,EAC7B,EAAc,EAAO,EAEzB,OAAO,EACH,EAAU,EAAa,EAAU,EAAoB,CACrD,EAGN,SAAS,EAAa,EAAM,CAC1B,IAAI,EAAoB,EAAO,EAC3B,EAAsB,EAAO,EAKjC,OAAQ,IAAiB,QAAc,GAAqB,GACzD,EAAoB,GAAO,GAAU,GAAuB,EAGjE,SAAS,GAAe,CACtB,IAAI,EAAO,GAAK,CAChB,GAAI,EAAa,EAAK,CACpB,OAAO,EAAa,EAAK,CAG3B,EAAU,WAAW,EAAc,EAAc,EAAK,CAAC,CAGzD,SAAS,EAAa,EAAM,CAS1B,MARA,GAAU,OAIN,GAAY,EACP,EAAW,EAAK,EAEzB,EAAW,EAAW,OACf,GAGT,SAAS,GAAS,CACZ,IAAY,QACd,aAAa,EAAQ,CAEvB,EAAiB,EACjB,EAAW,EAAe,EAAW,EAAU,OAGjD,SAAS,GAAQ,CACf,OAAO,IAAY,OAAY,EAAS,EAAa,GAAK,CAAC,CAG7D,SAAS,GAAY,CACnB,IAAI,EAAO,GAAK,CACZ,EAAa,EAAa,EAAK,CAMnC,GAJA,EAAW,UACX,EAAW,KACX,EAAe,EAEX,EAAY,CACd,GAAI,IAAY,OACd,OAAO,EAAY,EAAa,CAElC,GAAI,EAIF,OAFA,aAAa,EAAQ,CACrB,EAAU,WAAW,EAAc,EAAK,CACjC,EAAW,EAAa,CAMnC,OAHI,IAAY,SACd,EAAU,WAAW,EAAc,EAAK,EAEnC,EAIT,MAFA,GAAU,OAAS,EACnB,EAAU,MAAQ,EACX,EAGT,EAAO,QAAU,kBC3LjB,SAAgB,GAAiB,EAAW,EAAS,EAAS,EAAS,EAAU,GAAO,CAEpF,IAAM,IAAqB,QAAQ,CAKnC,EAAa,QAAU,EACvB,EAAM,cAAgB,CAElB,GAAI,IAAY,MAAQ,EAAQ,mBAAqB,OACjD,OACJ,IAAM,EAAK,EAEL,EAAiB,GAAU,CAC7B,EAAa,SAAS,KAAK,EAAI,EAAM,EAIzC,OAFA,EAAG,iBAAiB,EAAW,EAAe,CAAE,UAAS,UAAS,CAAC,KAEtD,CACT,EAAG,oBAAoB,EAAW,EAAe,CAAE,UAAS,CAAC,GAElE,CAAC,EAAW,EAAS,EAAS,EAAQ,CACxC,CAEL,SAAgB,GAAY,EAAK,EAAQ,CACrC,OAAO,IAAQ,OAAY,OAAY,EAE3C,IAAM,GAAK,KAAK,GAChB,SAAgB,GAAiB,EAAS,CACtC,OAAQ,EAAU,GAAM,IAE5B,IAAa,IAAe,EAAM,EAAM,KAAsB,CAC1D,GAAI,EAAO,EAAmB,EAC9B,GAAI,EAAO,EAAmB,EAC9B,GAAI,EAAO,EAAmB,EAC9B,GAAI,EAAO,EAAmB,EACjC,EACY,IAA0B,EAAW,EAAY,EAAgB,EAAmB,IAAgB,CAC7G,OAAQ,EAAR,CACI,IAAK,OACD,OAAO,KAAK,MAAM,EAAW,CAAG,EAAoB,EAAc,EACtE,IAAK,SACD,OAAO,KAAK,MAAM,EAAa,EAAiB,EAAE,CACtD,IAAK,QACD,OAAO,KAAK,MAAM,EAAa,EAAe,CAAG,EAAoB,EAAc,IAGlF,IAAkB,EAAS,EAAiB,IAAoB,KAAK,IAAI,EAAS,EAAkB,EAAkB,EAAE,CACxH,IAAmB,EAAG,EAAG,IAAO,EAAG,IAAM,GAAK,GAAK,EAAG,IAAM,EAAG,IAAM,GAAK,GAAK,EAAG,GAClF,GAAc,GAAU,CACjC,IAAM,EAAK,EAAM,SAAW,eAC5B,SAAc,cAAc,MAAO,CAAE,QAAS,YAAa,KAAM,OAAQ,MAAO,6BAA8B,GACpG,cAAc,OAAQ,CAAE,EAAG,kQAAmQ,OAAQ,EAAI,YAAa,MAAO,cAAe,QAAS,eAAgB,QAAS,KAAM,OAAQ,aAAc,qBAAsB,CAAC,GACla,cAAc,OAAQ,CAAE,EAAG,gNAAiN,OAAQ,EAAI,YAAa,MAAO,cAAe,QAAS,eAAgB,QAAS,KAAM,OAAQ,aAAc,qBAAsB,CAAC,CAAC,EAElX,GAAa,GAAU,CAChC,IAAM,EAAK,EAAM,SAAW,eAC5B,SAAc,cAAc,MAAO,CAAE,QAAS,YAAa,KAAM,OAAQ,MAAO,6BAA8B,GACpG,cAAc,OAAQ,CAAE,EAAG,mCAAoC,aAAc,qBAAsB,OAAQ,EAAI,YAAa,MAAO,cAAe,QAAS,eAAgB,QAAS,CAAC,CAAC,EAEpM,SAAgB,GAAiB,EAAS,EAAM,EAAM,CAClD,GAAM,CAAC,EAAO,KAAkB,SAAS,EAAQ,CAC3C,IAAmB,OAAO,GAAK,CACrC,EAAM,kBAAsB,CACxB,EAAW,QAAU,IACtB,EAAE,CAAC,CACN,IAAM,IAA0B,sBAAgB,GAAK,CAC7C,EAAW,SACX,EAAS,EAAE,EAEhB,EAAK,CAAC,CAOT,OANA,EAAM,oBAAsB,CACpB,EAAW,SACX,EAAkB,YAAc,GAAS,CAAC,EAG/C,EAAK,CACD,EAQX,IAAM,GAAU,OAAO,kDAA0C,CAEjE,SAAgB,GAAU,EAAO,CAC7B,OAAO,GAAI,KAAK,EAAM,CAAG,MAAQ,UAErC,IAAI,GAAsB,OAC1B,SAAgB,IAAoB,CAChC,GAAI,OAAO,SAAa,IACpB,MAAO,GACX,GAAI,KAAwB,OACxB,OAAO,GACX,IAAM,EAAQ,SAAS,cAAc,IAAI,CACzC,EAAM,MAAM,MAAQ,OACpB,EAAM,MAAM,OAAS,QACrB,IAAM,EAAQ,SAAS,cAAc,MAAM,CAC3C,EAAM,GAAK,gBACX,EAAM,MAAM,SAAW,WACvB,EAAM,MAAM,IAAM,MAClB,EAAM,MAAM,KAAO,MACnB,EAAM,MAAM,WAAa,SACzB,EAAM,MAAM,MAAQ,QACpB,EAAM,MAAM,OAAS,QACrB,EAAM,MAAM,SAAW,SACvB,EAAM,OAAO,EAAM,CACnB,SAAS,KAAK,OAAO,EAAM,CAC3B,IAAM,EAAK,EAAM,YACjB,EAAM,MAAM,SAAW,SACvB,IAAI,EAAK,EAAM,YAMf,OALI,IAAO,IACP,EAAK,EAAM,aAEf,EAAM,QAAQ,CACd,GAAsB,EAAK,EACpB,GAQX,IAAM,GAAQ,QAAQ,CACtB,SAAgB,GAA0B,EAAY,CAElD,IAAM,IAAsB,OAAO,CAAC,GAAO,EAAW,CAAC,CACnD,EAAc,QAAQ,KAAO,IAE7B,EAAc,QAAQ,GAAK,GAE/B,EAAc,QAAQ,GAAK,EAC3B,GAAM,CAAC,EAAO,KAAkB,SAAS,EAAW,CAE9C,EAAG,KAAqB,UAAU,CAClC,IAAsB,YAAY,GAAM,CAK1C,IAAM,EAAI,EAAc,QAAQ,GAC5B,IAAM,KACN,EAAK,OAAO,GAAO,WAAa,EAAG,EAAE,CAAG,EACpC,IAAO,KAGX,IAAM,IACN,EAAY,EAAE,CAAC,CACnB,EAAS,GACD,OAAO,GAAO,WACP,EAAG,IAAM,GAAQ,EAAK,EAAE,CAE5B,EACT,CACF,EAAc,QAAQ,GAAK,KAC5B,EAAE,CAAC,CACA,IAAgB,gBAAkB,CACpC,EAAc,QAAQ,GAAK,GAC3B,EAAY,EAAE,CAAC,EAChB,EAAE,CAAC,CACN,MAAO,CAAC,EAAc,QAAQ,KAAO,GAAQ,EAAQ,EAAc,QAAQ,GAAI,EAAe,EAAQ,CAE1G,SAAgB,GAAgC,EAAK,CAGjD,GAAI,EAAI,SAAW,EACf,MAAO,GAEX,IAAI,EAAQ,EACR,EAAQ,EACZ,IAAK,IAAM,KAAO,EAAK,CAEnB,GADA,GAAS,EAAI,OACT,EAAQ,IACR,MACJ,IAEJ,OAAO,EAAI,MAAM,EAAG,EAAM,CAAC,KAAK,KAAK,CAEzC,SAAgB,GAAY,EAAO,CAC/B,IAAM,IAAY,OAAO,EAAM,CAI/B,OAHK,EAAU,EAAO,EAAI,QAAQ,GAC9B,EAAI,QAAU,GAEX,EAAI,oBCzLF,GAAqB,GAAK,CACnC,GAAM,CAAE,OAAM,WAAU,cAAa,eAAgB,EAC/C,EAAW,EAAK,OAAO,GAAK,IAAM,GAAG,CAC3C,GAAI,EAAS,SAAW,EACpB,OAAO,KAEX,IAAM,EAAY,EAAS,OAAS,EACpC,SAAc,cAAc,GAAyB,CAAE,cAAe,mCAAoC,GAChG,cAAcC,YAAU,CAAE,WAAY,EAAW,WAAY,GAAO,UAAW,EAAW,aAAc,EAAW,aAAc,EAAW,CAAE,EAAS,IAAI,GAAO,CACpK,IAAM,EAAe,IAAc,EAAI,IAAU,cAAc,MAAO,CAAE,UAAW,GAAO,IAAK,EAAK,CAAC,CACrG,SAAc,cAAc,MAAO,CAAE,UAAW,0BAA2B,IAAK,EAAK,CAAE,EAAa,EACtG,CAAC,CACH,GAAY,KAAsB,cAAc,SAAU,CAAE,UAAW,gBAAiB,QAAS,EAAa,GACpG,cAAc,GAAY,KAAK,CAAC,CAAE,ECjBvC,GAAiCF,EAAO,MAAM,CAAC,CAC1D,KAAM,oBACN,MAAO,cACP,UAAW,GACZ,CAAC,CCDmB,GAArB,gBAA+C,aAAc,CACzD,cAAgB,KAChB,uBAAwB,CACpB,GAAM,CAAE,gBAAe,SAAU,KACjC,GAAI,IAAkB,KAClB,OACJ,GAAM,CAAE,WAAU,cAAe,EAC3B,EAAYG,EAAO,EAAS,CAC5B,EAAa,SAAS,aAAa,CACzC,EAAW,mBAAmB,EAAc,CAC5C,EAAW,gBAAgB,CAC3B,IAAI,EAAW,IAAa,EAAU,CACtC,GAAI,IAAa,OAAW,CACxB,IAAM,EAAW,SAAS,cAAc,WAAW,CACnD,EAAS,UAAY,EACrB,EAAW,EAAS,QAExB,EAAc,OAAO,EAAS,CAC9B,IAAM,EAAO,EAAc,qBAAqB,IAAI,CACpD,IAAK,IAAM,KAAO,EACd,EAAI,OAAS,SACb,EAAI,IAAM,sBAGlB,iBAAoB,GAAY,CAC5B,KAAK,cAAgB,EACrB,KAAK,uBAAuB,EAEhC,QAAS,CAKL,OADA,KAAK,uBAAuB,CAC5B,EAAa,cAAc,GAAmB,CAAE,IAAK,KAAK,iBAAkB,CAAC,GCpCxE,GAAwBH,EAAO,WAAW,CAAC,CACtD,KAAM,WACN,MAAO,cACP,UAAW,GACZ,CAAC,CACW,GAAyBA,EAAO,MAAM,CAAC,CAClD,KAAM,YACN,MAAO,cACP,UAAW,GACZ,CAAC,CACW,GAAiCA,EAAO,MAAM,CAAC,CAC1D,KAAM,oBACN,MAAO,eACP,UAAW,GACZ,CAAC,CCZE,GAAgB,EAEP,GAAgB,GAAU,CACnC,GAAM,CAAE,cAAa,QAAO,YAAW,YAAW,aAAY,qBAAoB,GAAG,GAAS,EACxF,CAAE,WAAU,aAAc,EAC1B,IAAiB,OAAO,KAAK,CAC7B,EAAU,GAAS,GACzB,GAAO,IAAa,OAAW,+CAA+C,CAE9E,GAAM,CAAC,KAAiB,aAAe,cAAgB,IAAiB,GAAgB,GAAK,KAAU,CACvG,EAAM,cAAgB,CAClB,IAAM,EAAK,EAAS,QAGpB,GAFI,IAAO,MAEP,EAAG,SACH,OACJ,IAAM,EAAS,EAAQ,UAAU,CAAC,OAClC,EAAG,OAAO,CACV,EAAG,kBAAkB,EAAY,EAAI,EAAQ,EAAO,EAErD,EAAE,CAAC,CACN,EAAM,oBAAsB,CACxB,GAAI,IAAuB,OAAW,CAClC,IAAM,EAAQ,OAAO,GAAuB,SAAW,CAAC,EAAoB,KAAK,CAAG,EACpF,EAAS,SAAS,kBAAkB,EAAM,GAAI,EAAM,GAAG,GAE5D,CAAC,EAAmB,CAAC,CACxB,IAAM,IAAuB,YAAY,GAAK,CACtC,EAAE,MAAQ,SAAW,EAAE,UAAY,IAAe,IAGtD,IAAY,EAAE,EACf,CAAC,EAAY,EAAU,CAAC,CAC3B,SAAc,cAAc,GAAmB,CAAE,UAAW,oBAAqB,GACvE,cAAc,GAAW,CAAa,YAAW,CAAE,EAAU;EAAK,GAClE,cAAc,GAAU,CAAE,GAAG,EAAM,WAAY,GAAa,IAAM,aAAc,GAAI,EAAS,IAAK,EAAU,UAAW,EAAgB,MAAO,EAAsB,cAAa,IAAK,OAAQ,CAAC,CAAC,ECtC7L,GAAE,IAAI,IAAI,GAAE,IAAI,IAAI,GAAE,IAAI,IAAI,SAAS,IAAG,CAAC,GAAE,OAAO,CAAC,GAAE,OAAO,CAAC,GAAE,OAAO,CAAC,SAAS,GAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAW,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,IAAI,KAAK,EAAE,GAAM,EAAE,IAAI,EAAE,EAAU,EAAE,EAAE,IAAO,EAAE,IAAY,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,IAAI,KAAK,OAAO,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,EAAK,EAAE,IAAI,EAAE,EAAU,EAAoB,EAAE,EAAV,GAAR,EAAE,EAAE,GAAQ,EAAE,EAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,GAAE,EAAE,EAAE,CAAO,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,IAAI,uEAAuE,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,KAAS,GAAG,EAAE,EAAE,GAAI,EAAK,EAAE,EAAE,MAAM,CAAC,IAAI,IAAI,KAAK,EAAE,EAAE,IAAI,GAAM,EAAE,IAAI,EAAE,EAAU,GAAG,EAAE,CAAC,OAAO,EAAE,SAAS,GAAE,EAAE,EAAE,EAAE,EAAE,CAAS,IAAI,EAAE,GAAE,IAAI,EAAE,CAAC,GAAG,GAAG,IAAI,IAAK,IAAG,EAAE,MAAM,IAAI,CAAC,IAAI,EAAE,GAAE,IAAI,EAAE,CAAC,GAAG,IAAI,IAAK,KAAI,EAAE,GAAE,EAAE,EAAE,KAAK,CAAC,GAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,IAAI,KAAK,EAAE,GAAM,EAAE,IAAI,EAAE,EAAU,EAAE,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,EAAE,YAAY,EAAE,CAAC,OAAO,GAAE,EAAE,EAAE,MAAM,EAAE,KAAK,IAAI,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC,EAAE,KAAK,CAAC,GAAE,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,MAAM,IAAI,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,IAAO,GAAiB,OAAe,GAAG,IAAI,OAAO,EAAE,MAAM,GAAG,IAAI,IAAK,GAAE,GAAE,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,GAAE,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,SAAS,GAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,GAAE,EAAE,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAiB,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,IAAI,EAAE,GAAE,EAAE,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,IAAK,GAAI,EAAE,YAAY,IAAI,EAAE,EAAE,CAAxB,EAAyB,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,GAAE,EAAE,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,IAAK,GAAE,EAAE,EAAE,YAAY,IAAI,EAAE,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAE,IAAI,EAAE,CAAC,GAAG,IAAI,IAAK,GAAE,OAAO,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM;EAC9uD,CAAC,EAAE,GAAE,IAAI,EAAE,CAAC,EAAE,IAAI,IAAK,GAAE,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI,EAAE,GAAG,IAAI,IAAK,IAAG,EAAE,MAAM,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC,IAAI,EAAE,GAAE,EAAE,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,IAAI,EAAE,OAAO,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,GAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAE,EAAE,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,MAAO,GAAE,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,CAAC,GAAE,IAAI,EAAE,EAAE,CAAC,GAAE,KAAK,KAAK,GAAE,OAAO,GAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,ECGrc,SAAgB,GAAiB,EAAS,EAAe,CACrD,SAAa,YAAc,EAAQ,KAAK,EAAG,KAAO,CAC9C,MAAO,EAAE,MACT,KAAM,EAAE,KACR,QAAS,EAAE,QACX,KAAM,EAAE,KACR,GAAI,EAAE,GACN,SAAU,EAAE,SACZ,YAAa,EAAE,YACf,YAAa,EACb,OAAQ,EAAI,EACZ,MAAO,EAAE,MACT,cAAe,EAAE,cACjB,MAAO,EAAE,MACT,mBAAoB,EAAE,mBACtB,MAAO,EAAE,MACT,WAAY,EAAE,WACd,UAAW,EAAE,UACb,iBAAkB,EAAE,iBACvB,EAAE,CAAE,CAAC,EAAS,EAAc,CAAC,CAElC,SAAgB,GAAqB,EAAK,EAAM,CAC5C,GAAM,CAAC,EAAK,GAAO,EACnB,GAAI,EAAI,QAAQ,SAAS,EAAI,EAAI,EAAI,KAAK,SAAS,EAAI,CACnD,MAAO,GACX,GAAI,EAAI,UAAY,OAAW,CAC3B,GAAI,GAAc,EAAI,QAAQ,KAAM,EAAK,CACrC,MAAO,GACX,IAAM,EAAU,CAAC,EAAI,QAAQ,MAAO,GAAG,EAAI,QAAQ,WAAW,CAC9D,IAAK,IAAM,KAAK,EAEZ,GAAI,GAAO,EAAE,GAAK,EAAM,EAAE,EAAI,EAAE,OAAS,GAAO,EAAE,GAAK,EAAM,EAAE,EAAI,EAAE,OACjE,MAAO,GAGnB,MAAO,GAEX,SAAgB,GAAa,EAAM,EAAO,CACtC,OAAQ,GAAQ,OAAS,GAAS,IAEtC,SAAgB,GAAe,EAAU,EAAM,EAAW,CAQtD,OAPI,EAAU,UAAY,QAEtB,EAAS,KAAO,EAAU,QAAQ,KAAK,GAChC,GACP,EAAK,OAAS,OACP,EAAU,QAAQ,KAAK,KAAO,EAAS,GAE3C,EAAU,QAAQ,KAAK,IAAM,EAAK,KAAK,IAAM,EAAU,QAAQ,KAAK,IAAM,EAAK,KAAK,GAE/F,SAAgB,GAAa,EAAU,EAAM,CACzC,GAAM,CAAC,EAAG,GAAK,EACf,OAAO,GAAK,EAAK,GAAK,EAAI,EAAK,EAAI,EAAK,OAAS,GAAK,EAAK,GAAK,EAAI,EAAK,EAAI,EAAK,OAEtF,SAAgB,GAAc,EAAG,EAAG,CAChC,OAAO,IAAI,KAAO,IAAI,IAAM,IAAI,KAAO,IAAI,GAE/C,SAAgB,GAAgB,EAAM,CAClC,MAAO,CAAC,EAAK,EAAI,EAAK,MAAQ,EAAG,EAAK,EAAI,EAAK,OAAS,EAAE,CAE9D,SAAS,GAAa,EAAU,EAAM,EAAM,CACxC,IAAM,EAAS,EAAK,EACd,EAAO,EAAK,EAAI,EAAK,MAAQ,EAC7B,EAAS,EAAK,EACd,EAAO,EAAK,EAAI,EAAK,OAAS,EAC9B,CAAC,EAAS,GAAW,EAC3B,GAAI,EAAU,GAAU,EAAU,EAC9B,MAAO,GACX,GAAI,EAAK,OAAS,OACd,OAAO,GAAW,GAAU,GAAW,EAE3C,GAAM,CAAC,EAAW,GAAW,EAAK,KAClC,OAAS,GAAa,GAAU,GAAa,GACxC,GAAW,GAAU,GAAa,GAClC,EAAY,GAAU,EAAU,EAEzC,SAAgB,GAAc,EAAU,EAAM,EAAW,EAAwB,CAC7E,IAAI,EAAS,EACb,GAAI,EAAU,UAAY,OACtB,OAAO,EACX,IAAM,EAAQ,EAAU,QAAQ,OAC3B,GAA0B,EAAM,OAAS,EAAM,MAAQ,IAAM,GAAa,EAAU,EAAM,EAAM,EACjG,IAEJ,IAAK,IAAM,KAAK,EAAU,QAAQ,WAC1B,GAAa,EAAU,EAAM,EAAE,EAC/B,IAGR,OAAO,EAEX,SAAgB,GAAiB,EAAS,EAAU,CAChD,IAAI,EAAa,EACjB,GAAI,IAAa,OAAW,CACxB,IAAI,EAAW,CAAC,GAAG,EAAQ,CACrB,EAAO,EAAW,EAAS,KAC7B,EAAS,IAAM,EAAS,MACxB,EAAS,OAAO,EAAS,IAAK,EAAE,CAChC,EAAS,OAAO,EAAS,KAAM,EAAG,EAAK,GAGvC,EAAS,OAAO,EAAS,KAAO,EAAG,EAAG,EAAK,CAC3C,EAAS,OAAO,EAAS,IAAK,EAAE,EAEpC,EAAW,EAAS,KAAK,EAAG,KAAO,CAC/B,GAAG,EACH,OAAQ,EAAQ,GAAG,OACtB,EAAE,CACH,EAAa,EAEjB,OAAO,EAEX,SAAgB,EAAe,EAAS,EAAU,CAC9C,IAAI,EAAS,EACP,EAAW,GAAiB,EAAS,EAAS,CACpD,IAAK,IAAI,EAAI,EAAG,EAAI,EAAS,OAAQ,IAAK,CACtC,IAAM,EAAI,EAAS,GACnB,GAAI,EAAE,OACF,GAAU,EAAE,WAEZ,MAER,OAAO,EAEX,SAAgB,GAAwB,EAAM,EAAoB,EAAc,CAC5E,GAAI,OAAO,GAAiB,SACxB,OAAO,EAAqB,EAE3B,CACD,IAAI,EAAS,EACb,IAAK,IAAI,EAAI,EAAO,EAAoB,EAAI,EAAM,IAC9C,GAAU,EAAa,EAAE,CAE7B,OAAO,GAGf,SAAgB,GAAoB,EAAS,EAAa,EAAO,EAAU,EAAI,CAC3E,IAAM,EAAa,GAAiB,EAAS,EAAS,CAChD,EAAS,EAAE,CACjB,IAAK,IAAM,KAAK,EACZ,GAAI,EAAE,OACF,EAAO,KAAK,EAAE,MAGd,MAGR,GAAI,EAAO,OAAS,EAChB,IAAK,IAAM,KAAK,EACZ,GAAS,EAAE,MAGnB,IAAI,EAAW,EACX,EAAO,GAAM,EACjB,KAAO,GAAQ,GAAS,EAAW,EAAW,QAC1C,GAAQ,EAAW,GAAU,MAC7B,IAEJ,IAAK,IAAI,EAAI,EAAa,EAAI,EAAU,IAAK,CACzC,IAAM,EAAI,EAAW,GAChB,EAAE,QACH,EAAO,KAAK,EAAE,CAGtB,OAAO,EAEX,SAAgB,GAAmB,EAAS,EAAkB,EAAY,CACtE,IAAI,EAAI,EACR,IAAK,IAAM,KAAK,EAAkB,CAE9B,GAAI,IADO,EAAE,OAAS,EAAI,GAAK,GAAc,IACzB,EAAE,MAClB,OAAO,EAAE,YAEb,GAAK,EAAE,MAEX,MAAO,GAEX,SAAgB,GAAgB,EAAS,EAAQ,EAAW,EAAc,EAAmB,EAAM,EAAW,EAAa,EAAY,EAAoB,CACvJ,IAAM,EAAoB,EAAe,EACzC,GAAI,GAAa,GAAW,EACxB,MAAO,GACX,GAAI,GAAW,EACX,MAAO,GACX,IAAI,EAAI,EACR,IAAK,IAAI,EAAK,EAAG,EAAK,EAAoB,IAAM,CAC5C,IAAM,EAAM,EAAO,EAAI,EACjB,EAAK,OAAO,GAAc,SAAW,EAAY,EAAU,EAAI,CAErE,GADA,GAAK,EACD,GAAW,EACX,OAAO,EAGf,IAAM,EAAgB,EAAO,EACvB,EAAK,GAAW,GAAc,GACpC,GAAI,OAAO,GAAc,SAAU,CAC/B,IAAM,EAAS,KAAK,OAAO,EAAK,GAAqB,EAAU,CAAG,EAGlE,OAFI,GAAU,EACV,OACG,MAEN,CACD,IAAI,EAAO,EACX,IAAK,IAAI,EAAI,EAAa,EAAI,EAAe,IAAK,CAC9C,IAAM,EAAK,EAAU,EAAE,CACvB,GAAI,GAAM,EAAO,EACb,OAAO,EACX,GAAQ,EAEZ,QAGR,IAAI,GAAc,EACd,GAAe,EAAE,CACf,GAAQ,OAAO,OAAW,IAChC,eAAe,IAAmB,CAC1B,IAAS,UAAU,OAAO,QAAU,SAExC,MAAM,SAAS,MAAM,MACrB,GAAc,EACd,GAAe,EAAE,CACjB,IAAY,EAEX,IAAkB,CACvB,SAAS,GAAa,EAAG,EAAK,EAAU,EAAM,CAC1C,MAAO,GAAG,EAAE,GAAG,GAAQ,GAAK,KAAK,GAAG,IAGxC,SAAgB,GAAkB,EAAG,EAAK,EAAM,EAAW,SAAU,CACjE,IAAM,EAAM,GAAa,EAAG,EAAK,EAAU,EAAK,CAC5C,EAAU,GAAa,GAU3B,OATI,IAAY,SACZ,EAAU,EAAI,YAAY,EAAE,CAC5B,GAAa,GAAO,EACpB,MAEA,GAAc,MACd,GAAe,EAAE,CACjB,GAAc,GAEX,EAEX,SAAgB,GAAqB,EAAG,EAAM,CAC1C,IAAM,EAAM,GAAa,EAAG,OAAW,SAAU,EAAK,CACtD,OAAO,GAAa,GAGxB,SAAgB,GAAoB,EAAK,EAAM,CAI3C,OAHI,OAAO,GAAS,WAChB,EAAO,EAAK,cAET,GAAyB,EAAK,EAAK,CAE9C,SAAS,GAAW,EAAK,EAAU,CAE/B,EAAI,MAAM,CACV,EAAI,aAAe,EACnB,IAAM,EAAS,EAAI,YAAY,6BAAO,CAEtC,OADA,EAAI,SAAS,CACN,EAEX,IAAM,GAAY,EAAE,CACpB,SAAS,GAAyB,EAAK,EAAM,CACzC,IAAK,IAAM,KAAK,GACZ,GAAI,EAAE,MAAQ,EACV,OAAO,EAAE,IAEjB,IAAM,EAAoB,GAAW,EAAK,aAAa,CAEjD,EAAO,EADS,GAAW,EAAK,SAAS,CAClB,yBAA2B,EAAkB,0BACtE,EAAkB,wBAA0B,EAKhD,OAJA,GAAU,KAAK,CACX,IAAK,EACL,IAAK,EACR,CAAC,CACK,EAEX,SAAgB,GAAuB,EAAM,EAAY,EAAW,EAAU,EAAW,EAAW,CAChG,GAAM,CAAE,MAAK,OAAM,SAAU,EACzB,UAeJ,OAbI,IAAe,SACf,EAAW,EAAY,EACnB,EAAW,MAEX,EAAI,YADS,EAAI,EAAW,IAE5B,EAAI,UAAY,EAAM,eACtB,EAAI,SAAS,EAAK,EAAI,EAAG,EAAK,EAAI,EAAG,EAAK,OAAS,EAAY,EAAI,GAAI,EAAK,QAAU,EAAY,EAAI,GAAG,CACzG,EAAI,YAAc,EACd,IAAa,SACb,EAAS,UAAY,EAAM,kBAIhC,EAAW,IAEtB,SAAgB,GAAa,EAAM,EAAU,EAAe,CACxD,GAAM,CAAE,MAAK,SAAU,EACjB,EAAS,GAAY,EAAE,CACvB,EAAU,GAAiB,EAAM,SAKvC,OAJI,IAAY,EAAO,YACnB,EAAI,UAAY,EAChB,EAAO,UAAY,GAEhB,EAYX,SAAS,GAAmB,EAAK,EAAM,EAAG,EAAG,EAAG,EAAG,EAAM,EAAO,EAAc,CACtE,IAAiB,QACjB,EAAI,SAAS,EAAM,EAAI,GAAK,EAAM,sBAAwB,IAAM,EAAI,EAAI,EAAI,EAAK,CAE5E,IAAiB,SACtB,EAAI,SAAS,EAAM,EAAI,EAAI,EAAG,EAAI,EAAI,EAAI,EAAK,CAG/C,EAAI,SAAS,EAAM,EAAI,EAAM,sBAAwB,GAAK,EAAI,EAAI,EAAI,EAAK,CAGnF,SAAgB,GAAY,EAAK,EAAW,CACxC,IAAM,EAAc,GAAkB,cAAe,EAAK,EAAU,CACpE,OAAO,EAAY,wBAA0B,EAAY,yBAE7D,SAAS,GAAe,EAAM,EAAG,CACzB,EAAK,SAAS;EAAK,GAInB,EAAO,EAAK,MAAM,QAAS,EAAE,CAAC,IAElC,IAAM,EAAM,EAAI,EAIhB,OAHI,EAAK,OAAS,IACd,EAAO,EAAK,MAAM,EAAG,EAAI,EAEtB,EAEX,SAAS,GAAkB,EAAK,EAAM,EAAG,EAAG,EAAG,EAAG,EAAM,EAAO,EAAc,EAAe,CACxF,IAAM,EAAY,EAAM,aAClB,EAAQI,EAAU,EAAK,EAAM,EAAW,EAAI,EAAM,sBAAwB,EAAG,GAAiB,GAAM,CACpG,EAAW,GAAY,EAAK,EAAU,CACtC,EAAa,EAAM,WAAa,EAChC,EAAe,EAAW,GAAc,EAAM,OAAS,GACvD,EAAW,EAAe,EAAM,oBAAsB,EACxD,IAEA,EAAI,MAAM,CACV,EAAI,KAAK,EAAG,EAAG,EAAG,EAAE,CACpB,EAAI,MAAM,EAEd,IAAM,EAAW,EAAI,EAAI,EAAI,EAAe,EACxC,EAAQ,KAAK,IAAI,EAAI,EAAM,oBAAqB,EAAS,CAC7D,IAAK,IAAM,KAAQ,EAGf,GAFA,GAAmB,EAAK,EAAM,EAAG,EAAO,EAAG,EAAU,EAAM,EAAO,EAAa,CAC/E,GAAS,EACL,EAAQ,EAAI,EACZ,MAEJ,GACA,EAAI,SAAS,CAIrB,SAAgB,GAAa,EAAM,EAAM,EAAc,EAAe,EAAe,CACjF,GAAM,CAAE,MAAK,OAAM,SAAU,EACvB,CAAE,IAAG,IAAG,MAAO,EAAG,OAAQ,GAAM,EACtC,IAAiC,GAC5B,IACD,EAAO,GAAe,EAAM,EAAE,EAElC,IAAM,EAAO,GAAoB,EAAK,EAAM,CACtC,EAAQ,GAAU,EAAK,GAAK,MAOlC,GANI,IAAiB,QAAa,IAC9B,EAAe,SAEf,IACA,EAAI,UAAY,OAEhB,EAAK,OAAS,EAAG,CACjB,IAAI,EAAU,GACV,IAAiB,SAEjB,EAAI,UAAY,QAChB,EAAU,IAEL,IAAiB,QAAa,IAAiB,SAEpD,EAAI,UAAY,EAChB,EAAU,IAET,EAID,GAAkB,EAAK,EAAM,EAAG,EAAG,EAAG,EAAG,EAAM,EAAO,EAAc,EAAc,CAHlF,GAAmB,EAAK,EAAM,EAAG,EAAG,EAAG,EAAG,EAAM,EAAO,EAAa,CAKpE,IAEA,EAAI,UAAY,SAEhB,IACA,EAAI,UAAY,YAI5B,SAAgB,GAAY,EAAK,EAAG,EAAG,EAAO,EAAQ,EAAQ,CACtD,OAAO,GAAW,WAClB,EAAS,CAAE,GAAI,EAAQ,GAAI,EAAQ,GAAI,EAAQ,GAAI,EAAQ,EAG/D,EAAS,CACL,GAAI,KAAK,IAAI,EAAG,KAAK,IAAI,EAAO,GAAI,EAAS,EAAG,EAAQ,EAAE,CAAC,CAC3D,GAAI,KAAK,IAAI,EAAG,KAAK,IAAI,EAAO,GAAI,EAAS,EAAG,EAAQ,EAAE,CAAC,CAC3D,GAAI,KAAK,IAAI,EAAG,KAAK,IAAI,EAAO,GAAI,EAAS,EAAG,EAAQ,EAAE,CAAC,CAC3D,GAAI,KAAK,IAAI,EAAG,KAAK,IAAI,EAAO,GAAI,EAAS,EAAG,EAAQ,EAAE,CAAC,CAC9D,CACD,EAAI,OAAO,EAAI,EAAO,GAAI,EAAE,CAC5B,EAAI,MAAM,EAAI,EAAO,EAAG,EAAI,EAAO,EAAI,EAAO,GAAI,EAAO,GAAG,CAC5D,EAAI,MAAM,EAAI,EAAO,EAAI,EAAQ,EAAI,EAAQ,EAAO,GAAI,EAAI,EAAQ,EAAO,GAAG,CAC9E,EAAI,MAAM,EAAG,EAAI,EAAQ,EAAG,EAAI,EAAS,EAAO,GAAI,EAAO,GAAG,CAC9D,EAAI,MAAM,EAAG,EAAG,EAAI,EAAO,GAAI,EAAG,EAAO,GAAG,CAEhD,SAAgB,GAAa,EAAK,EAAO,EAAO,CAC5C,IAAM,EAAS,KACf,EAAI,IAAI,EAAO,EAAQ,EAAS,IAAK,EAAQ,EAAG,EAAI,KAAK,GAAI,GAAM,CACnE,EAAI,IAAI,EAAO,EAAO,EAAQ,EAAG,EAAI,KAAK,GAAI,GAAM,CACpD,EAAI,IAAI,EAAO,EAAQ,EAAS,IAAK,EAAQ,EAAG,EAAI,KAAK,GAAI,GAAM,CAEvE,SAAgB,GAAY,EAAK,EAAQ,EAAW,CAEhD,IAAM,EAAQ,SAAU,EAAG,EAAI,CAC3B,IAAM,EAAK,EAAG,EAAI,EAAE,EACd,EAAK,EAAG,EAAI,EAAE,EACd,EAAO,KAAK,KAAK,EAAK,EAAK,EAAK,EAAG,CACnC,EAAM,EAAK,EACX,EAAM,EAAK,EACjB,MAAO,CACH,EAAG,EACH,EAAG,EAAG,EAAI,EAAE,EACZ,IAAK,EACL,GAAI,EACJ,GAAI,EACJ,IAAK,KAAK,MAAM,EAAK,EAAI,CAC5B,EAED,EAGE,EAAM,EAAO,OACf,EAAK,EAAO,EAAM,GAEtB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,IAAK,CAC1B,IAAI,EAAK,EAAO,EAAI,GACd,EAAK,GAAQ,EAAI,GAAK,GAGtB,EAAK,EAAM,EAAI,EAAG,CAClB,EAAK,EAAM,EAAI,EAAG,CAClB,EAAO,EAAG,GAAK,EAAG,GAAK,EAAG,GAAK,EAAG,GAClC,EAAS,EAAG,GAAK,EAAG,GAAK,EAAG,GAAK,CAAC,EAAG,GACvC,EAAQ,KAAK,KAAK,EAAO,GAAK,GAAK,EAAO,EAAI,EAAI,EAAK,CAEvD,EAAe,EACf,EAAgB,GAChB,EAAS,EACL,EAAQ,EACR,EAAQ,KAAK,GAAK,GAGlB,EAAQ,KAAK,GAAK,EAClB,EAAe,GACf,EAAgB,IAIhB,EAAQ,IACR,EAAe,GACf,EAAgB,IAGxB,EAAS,EAAG,SAAW,OAAwB,EAAZ,EAAG,OAGtC,IAAM,EAAY,EAAQ,EAItB,EAAS,KAAK,IAAK,KAAK,IAAI,EAAU,CAAG,EAAU,KAAK,IAAI,EAAU,CAAC,CAIvE,EACA,EAAS,KAAK,IAAI,EAAG,IAAM,EAAG,EAAG,IAAM,EAAE,EACzC,EAAS,KAAK,IAAI,EAAG,IAAM,EAAG,EAAG,IAAM,EAAE,CACzC,EAAU,KAAK,IAAK,EAAS,KAAK,IAAI,EAAU,CAAI,KAAK,IAAI,EAAU,CAAC,EAGxE,EAAU,EAId,IAAI,EAAI,EAAG,EAAI,EAAG,GAAK,EACnB,EAAI,EAAG,EAAI,EAAG,GAAK,EAGvB,GAAK,CAAC,EAAG,GAAK,EAAU,EACxB,GAAK,EAAG,GAAK,EAAU,EAGvB,EAAI,IAAI,EAAG,EAAG,EAAS,EAAG,IAAO,KAAK,GAAK,EAAK,EAAc,EAAG,IAAO,KAAK,GAAK,EAAK,EAAc,EAAc,CAEnH,EAAK,EACL,EAAK,EAET,EAAI,WAAW,CAEnB,SAAgB,GAAc,EAAK,EAAK,EAAO,EAAQ,EAAmB,EAAmB,EAAa,EAAa,EAAY,EAAY,EAAM,EAAe,EAAoB,EAAe,EAAW,CAC9M,IAAM,EAAS,CACX,EAAG,EACH,EAAG,EAAoB,EACvB,MAAO,EACP,OAAQ,EACX,CACD,GAAI,GAAO,EAAc,QAAU,GAAO,GAAQ,EAAM,IAAM,EAAM,EAChE,OAAO,EAEX,IAAM,EAAe,EAAoB,EACzC,GAAI,GAAO,EAAe,CACtB,IAAM,EAAM,EAAc,EAAM,GAAK,EAC/B,EAAc,EAAe,EAAc,CACjD,EAAO,GAAK,EAAc,EAC1B,IAAK,IAAI,EAAI,EAAa,IAAM,EAAK,GAAK,EACtC,EAAO,GAAK,EAAc,IAAQ,EAAI,EAAI,EAAI,GAAG,MAAQ,OAI7D,IAAK,IAAI,EAAI,EAAG,EAAI,EAAK,IACrB,EAAO,GAAK,EAAc,GAAG,MAIrC,GADA,EAAO,MAAQ,EAAc,GAAK,MAAQ,EACtC,IAAQ,GACR,EAAO,EAAI,EACX,EAAO,OAAS,UAEX,IAAQ,GAAI,CACjB,EAAO,EAAI,EACX,EAAO,OAAS,EAChB,IAAI,EAAQ,EACN,EAAQ,EAAc,GAAK,MAC3B,EAAS,EAAc,GAAK,OAClC,KAAO,EAAQ,GACX,GAAa,EAAc,EAAQ,GAAG,MAAO,EAAM,EACnD,EAAc,EAAQ,GAAG,SAAW,GAAQ,CAC5C,IAAM,EAAI,EAAc,EAAQ,GAChC,EAAO,GAAK,EAAE,MACd,EAAO,OAAS,EAAE,MAClB,IAEJ,IAAI,EAAM,EACV,KAAO,EAAM,EAAI,EAAc,QAC3B,GAAa,EAAc,EAAM,GAAG,MAAO,EAAM,EACjD,EAAc,EAAM,GAAG,SAAW,GAAQ,CAC1C,IAAM,EAAI,EAAc,EAAM,GAC9B,EAAO,OAAS,EAAE,MAClB,IAEJ,GAAI,CAAC,EAAQ,CACT,IAAM,EAAc,EAAe,EAAc,CAC3C,EAAO,EAAO,EAAI,EACpB,EAAO,IACP,EAAO,GAAK,EACZ,EAAO,OAAS,GAEhB,EAAO,EAAI,EAAO,MAAQ,IAC1B,EAAO,MAAQ,EAAQ,EAAO,YAIjC,GAAO,EAAO,EAAoB,CACvC,IAAI,EAAK,EAAO,EAEhB,IADA,EAAO,EAAI,EACJ,EAAK,GAAG,CACX,IAAM,EAAI,EAAM,EAAK,EACrB,EAAO,OAAS,OAAO,GAAc,SAAW,EAAY,EAAU,EAAE,CACxE,EAAO,GAAK,EAAO,OACnB,IAEJ,EAAO,QAAU,MAEhB,CACD,IAAM,EAAM,EAAc,EAAM,GAAK,EACrC,GAAI,OAAO,GAAc,SAAU,CAC/B,IAAM,EAAQ,EAAM,EACpB,EAAO,GAAK,EAAQ,OAGpB,IAAK,IAAI,EAAI,EAAa,IAAM,EAAK,GAAK,EACtC,EAAO,GAAK,EAAU,EAAE,CAAG,EAGnC,EAAO,QAAU,OAAO,GAAc,SAAW,EAAY,EAAU,EAAI,EAAI,EAEnF,OAAO,EC9lBX,IAAM,GAAW,GAAK,GACtB,SAAgB,EAAmB,EAAK,EAAK,CACzC,OAAQ,EAAM,GAAK,GAAW,EAElC,SAAgB,GAAU,EAAQ,CAC9B,OAAO,EAAS,GAEpB,SAAgB,GAAU,EAAQ,CAC9B,OAAO,KAAK,MAAM,EAAS,GAAS,CAAG,EAE3C,SAAgB,GAAqB,EAAQ,CAGzC,MAAO,CAFK,GAAU,EAAO,CACjB,GAAU,EAAO,CACZ,CAErB,IAAa,GAAb,KAAkC,CAC9B,cAAgB,CACZ,EAAG,EACH,EAAG,EACH,MAAO,EACP,OAAQ,EACX,CACD,WAAa,EACb,WAAa,EAAE,CACf,WAAc,GAAW,CACrB,IAAM,EAAM,GAAU,EAAO,CACvB,EAAM,GAAU,EAAO,CACvB,EAAI,KAAK,cACT,EAAe,GAAO,EAAE,GAAK,GAAO,EAAE,EAAI,EAAE,OAAU,EAAM,KAAK,WACjE,EAAe,GAAO,EAAE,GAAK,GAAO,EAAE,EAAI,EAAE,QAAW,KAAK,WAAW,SAAS,EAAI,CAC1F,OAAO,GAAe,GAE1B,UAAU,EAAW,EAAY,EAAY,CACrC,KAAK,cAAc,IAAM,EAAU,GACnC,KAAK,cAAc,IAAM,EAAU,GACnC,KAAK,cAAc,QAAU,EAAU,OACvC,KAAK,cAAc,SAAW,EAAU,QACxC,KAAK,aAAe,GACpB,EAAU,KAAK,WAAY,EAAW,GAE1C,KAAK,cAAgB,EACrB,KAAK,WAAa,EAClB,KAAK,WAAa,EAClB,KAAK,kBAAkB,IAGlB,GAAb,cAAyC,EAAqB,CAC1D,MAAQ,IAAI,IACZ,UAAY,EAAU,IAAU,CAC5B,KAAK,MAAM,IAAI,EAAmB,EAAS,GAAI,EAAS,GAAG,CAAE,EAAM,EAEvE,SAAY,GACD,KAAK,MAAM,IAAI,EAAmB,EAAS,GAAI,EAAS,GAAG,CAAC,CAEvE,qBAAyB,CACrB,IAAK,GAAM,CAAC,KAAQ,KAAK,MAAM,SAAS,CAC/B,KAAK,WAAW,EAAI,EACrB,KAAK,MAAM,OAAO,EAAI,GC/DzB,GAAb,KAAqB,CACjB,MACA,YAAY,EAAQ,EAAE,CAAE,CACpB,KAAK,MAAQ,IAAI,IAAI,EAAM,IAAI,GAAK,EAAmB,EAAE,GAAI,EAAE,GAAG,CAAC,CAAC,CAExE,IAAI,EAAM,CACN,KAAK,MAAM,IAAI,EAAmB,EAAK,GAAI,EAAK,GAAG,CAAC,CAExD,IAAI,EAAM,CAGN,OAFI,IAAS,OACF,GACJ,KAAK,MAAM,IAAI,EAAmB,EAAK,GAAI,EAAK,GAAG,CAAC,CAE/D,OAAO,EAAM,CACT,KAAK,MAAM,OAAO,EAAmB,EAAK,GAAI,EAAK,GAAG,CAAC,CAE3D,OAAQ,CACJ,KAAK,MAAM,OAAO,CAEtB,IAAI,MAAO,CACP,OAAO,KAAK,MAAM,KAEtB,WAAY,CACR,IAAK,IAAM,KAAc,KAAK,MAE1B,GADY,GAAU,EAAW,CACvB,EACN,MAAO,GAEf,MAAO,GAEX,mBAAmB,EAAM,CACrB,IAAK,IAAI,EAAM,EAAK,EAAG,EAAM,EAAK,EAAI,EAAK,OAAQ,IAC/C,IAAK,IAAI,EAAM,EAAK,EAAG,EAAM,EAAK,EAAI,EAAK,MAAO,IAC9C,GAAI,KAAK,MAAM,IAAI,EAAmB,EAAK,EAAI,CAAC,CAC5C,MAAO,GAInB,MAAO,GAEX,gBAAgB,EAAM,CAClB,IAAK,IAAM,KAAK,EACZ,GAAI,KAAK,mBAAmB,EAAE,CAC1B,MAAO,GAGf,MAAO,GAEX,CAAC,QAAS,CACN,IAAK,IAAM,KAAc,KAAK,MAC1B,MAAM,GAAqB,EAAW,GCjD5C,GAAc,IACpB,SAAS,GAAY,EAAK,EAAM,EAAO,EAAiB,CAEpD,OADU,EAAgB,EAAK,EACrB,UAAU,EAAK,EAAM,EAAM,EAAI,GAE7C,SAAgB,GAAc,EAAK,EAAO,EAAG,EAAU,EAAc,EAAgB,EAAgB,EAAgB,EAAiB,CAClI,IAAI,EAAM,EACJ,EAAQ,IAAiB,OACzB,EAAE,CACF,EAAa,IAAI,GAAO,CACtB,IAAM,EAAI,GAAY,EAAK,EAAI,GAAW,EAAO,EAAgB,CAEjE,MADA,GAAM,KAAK,IAAI,EAAK,EAAE,CACf,GACT,CACN,GAAI,EAAM,OAAS,GAAK,EAAgB,CACpC,EAAM,EAEN,IAAI,EAAM,EACV,IAAK,IAAM,KAAQ,EACf,GAAO,EAEX,IAAM,EAAU,EAAM,EAAM,OAE5B,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,IAC1B,EAAM,IAAM,EAAU,EACtB,EAAM,GAAK,EAGX,EAAM,KAAK,IAAI,EAAK,EAAM,GAAG,CAIzC,EAAM,KAAK,IAAI,EAAK,EAAI,YAAY,EAAE,MAAM,CAAC,MAAQ,IAAM,EAAE,OAAS,OAAY,EAAI,IAAI,CAC1F,IAAM,EAAQ,KAAK,IAAI,KAAK,KAAK,EAAe,CAAE,KAAK,IAAI,KAAK,MAAM,EAAe,CAAE,KAAK,KAAK,EAAI,CAAC,CAAC,CACvG,MAAO,CACH,GAAG,EACH,MAAO,EACV,CAGL,SAAgB,GAAe,EAAS,EAAM,EAAsB,EAAa,EAAgB,EAAgB,EAAO,EAAiB,EAAiB,CACtJ,IAAM,IAAgB,OAAO,EAAK,CAC5B,IAAgC,OAAO,EAAqB,CAC5D,IAAiB,OAAO,EAAM,CACpC,EAAQ,QAAU,EAClB,EAAwB,QAAU,EAClC,EAAS,QAAU,EACnB,GAAM,CAAC,EAAQ,KAAa,YAAc,CACtC,GAAI,OAAO,OAAW,IAClB,MAAO,CAAC,KAAM,KAAK,CACvB,IAAM,EAAY,SAAS,cAAc,SAAS,CAIlD,MAHA,GAAU,MAAM,QAAa,OAC7B,EAAU,MAAM,QAAa,IAC7B,EAAU,MAAM,SAAc,QACvB,CAAC,EAAW,EAAU,WAAW,KAAM,CAAE,MAAO,GAAO,CAAC,CAAC,EACjE,EAAE,CAAC,CACN,EAAM,qBACE,GACA,SAAS,gBAAgB,OAAO,EAAO,KAC9B,CACT,GAAQ,QAAQ,GAErB,CAAC,EAAO,CAAC,CACZ,IAAM,IAAgB,OAAO,EAAE,CAAC,CAC1B,IAAoB,QAAQ,CAC5B,CAAC,EAAc,KAA0B,UAAU,CAgDzD,OA/CA,EAAM,oBAAsB,CACxB,IAAM,EAAW,EAAwB,QACzC,GAAI,IAAa,QAAa,EAAQ,MAAM,GAAkB,CAC1D,OACJ,IAAI,EAAc,KAAK,IAAI,EAAG,GAAK,KAAK,MAAM,EAAQ,OAAS,IAAM,CAAC,CAClE,EAAW,EACX,EAAc,EAAQ,SAAW,EAAc,IAC/C,IACA,EAAW,GAEf,IAAM,EAAc,CAChB,EAAG,EACH,EAAG,EACH,MAAO,EAAQ,OACf,OAAQ,KAAK,IAAI,EAAQ,QAAS,EAAY,CACjD,CACK,EAAkB,CACpB,EAAG,EACH,EAAG,EAAQ,QAAU,EACrB,MAAO,EAAQ,OACf,OAAQ,EACX,EACU,SAAY,CACnB,IAAM,EAAY,EAAS,EAAa,EAAgB,OAAO,CACzD,EAAgB,EAAW,EAAI,EAAS,EAAiB,EAAgB,OAAO,CAAG,OACrF,EAEJ,CAII,CAJA,OAAO,GAAc,SACb,EAGA,MAAM,GAAkB,EAAU,CAE1C,IAAkB,SAElB,CAII,CAJA,OAAO,GAAkB,SACjB,CAAC,GAAG,EAAO,GAAG,EAAc,CAG5B,CAAC,GAAG,EAAO,GAAI,MAAM,GAAkB,EAAc,CAAE,EAGvE,EAAY,QAAU,EACtB,EAAiB,EAAM,IAElB,EACV,CAAC,EAAgB,OAAQ,EAAQ,CAAC,CACrC,EAAa,YAAc,CAoCvB,IAAI,EAlCI,EAAQ,MAAM,GAAkB,CACzB,EAEP,IAAQ,KACD,EAAQ,IAAI,GACX,GAAkB,EAAE,CACb,EACJ,CACH,GAAG,EACH,MAAO,GACV,CACH,EAEN,EAAI,KAAO,EAAS,QAAQ,aACrB,EAAQ,KAAK,EAAG,IAAa,CAChC,GAAI,GAAkB,EAAE,CACpB,OAAO,EACX,GAAI,EAAQ,QAAQ,EAAE,MAAQ,OAC1B,MAAO,CACH,GAAG,EACH,MAAO,EAAQ,QAAQ,EAAE,IAC5B,CAEL,GAAI,IAAiB,QAAa,EAAY,UAAY,GAAW,EAAE,KAAO,OAC1E,MAAO,CACH,GAAG,EACH,MAAO,GACV,CAEL,IAAM,EAAI,GAAc,EAAK,EAAO,EAAG,EAAU,EAAc,EAAgB,EAAgB,GAAM,EAAgB,CAErH,MADA,GAAQ,QAAQ,EAAE,IAAM,EAAE,MACnB,GACT,EAGF,EAAa,EACb,EAAY,EACV,EAAa,EAAE,CACrB,IAAK,GAAM,CAAC,EAAG,KAAM,EAAO,SAAS,CACjC,GAAc,EAAE,MACZ,EAAE,OAAS,QAAa,EAAE,KAAO,IACjC,GAAa,EAAE,KACf,EAAW,KAAK,EAAE,EAG1B,GAAI,EAAa,GAAe,EAAW,OAAS,EAAG,CACnD,IAAM,EAAY,CAAC,GAAG,EAAO,CACvB,EAAQ,EAAc,EACxB,EAAY,EAChB,IAAK,IAAI,EAAK,EAAG,EAAK,EAAW,OAAQ,IAAM,CAC3C,IAAM,EAAI,EAAW,GACf,GAAY,EAAO,GAAG,MAAQ,GAAK,EACnC,EAAQ,IAAO,EAAW,OAAS,EAAI,EAAY,KAAK,IAAI,EAAW,KAAK,MAAM,EAAQ,EAAS,CAAC,CAC1G,EAAU,GAAK,CACX,GAAG,EAAO,GACV,WAAY,EACZ,MAAO,EAAO,GAAG,MAAQ,EAC5B,CACD,GAAa,EAEjB,EAAS,EAEb,MAAO,CACH,aAAc,EACd,aAAc,EACjB,EACF,CAAC,EAAa,EAAS,EAAK,EAAc,EAAO,EAAgB,EAAgB,EAAgB,CAAC,mBC9KzG,SAAS,EAAU,EAAQ,EAAO,EAAO,CASvC,OARI,IAAW,IACT,IAAU,SACZ,EAAS,GAAU,EAAQ,EAAS,GAElC,IAAU,SACZ,EAAS,GAAU,EAAQ,EAAS,IAGjC,EAGT,EAAO,QAAU,mBCrBjB,IAAI,OACA,OAqBJ,SAAS,EAAM,EAAQ,EAAO,EAAO,CAanC,OAZI,IAAU,SACZ,EAAQ,EACR,EAAQ,QAEN,IAAU,SACZ,EAAQ,EAAS,EAAM,CACvB,EAAQ,IAAU,EAAQ,EAAQ,GAEhC,IAAU,SACZ,EAAQ,EAAS,EAAM,CACvB,EAAQ,IAAU,EAAQ,EAAQ,GAE7B,EAAU,EAAS,EAAO,CAAE,EAAO,EAAM,CAGlD,EAAO,QAAU,mBCrCjB,IAAI,EAAiB,4BAYrB,SAAS,EAAY,EAAO,CAE1B,OADA,KAAK,SAAS,IAAI,EAAO,EAAe,CACjC,KAGT,EAAO,QAAU,mBCTjB,SAAS,EAAY,EAAO,CAC1B,OAAO,KAAK,SAAS,IAAI,EAAM,CAGjC,EAAO,QAAU,mBCbjB,IAAI,OACA,OACA,OAUJ,SAAS,EAAS,EAAQ,CACxB,IAAI,EAAQ,GACR,EAAS,GAAU,KAAO,EAAI,EAAO,OAGzC,IADA,KAAK,SAAW,IAAI,EACb,EAAE,EAAQ,GACf,KAAK,IAAI,EAAO,GAAO,CAK3B,EAAS,UAAU,IAAM,EAAS,UAAU,KAAO,EACnD,EAAS,UAAU,IAAM,EAEzB,EAAO,QAAU,mBCfjB,SAAS,EAAc,EAAO,EAAW,EAAW,EAAW,CAI7D,IAHA,IAAI,EAAS,EAAM,OACf,EAAQ,GAAa,EAAY,EAAI,IAEjC,EAAY,IAAU,EAAE,EAAQ,GACtC,GAAI,EAAU,EAAM,GAAQ,EAAO,EAAM,CACvC,OAAO,EAGX,MAAO,GAGT,EAAO,QAAU,mBChBjB,SAAS,EAAU,EAAO,CACxB,OAAO,IAAU,EAGnB,EAAO,QAAU,mBCDjB,SAAS,EAAc,EAAO,EAAO,EAAW,CAI9C,IAHA,IAAI,EAAQ,EAAY,EACpB,EAAS,EAAM,OAEZ,EAAE,EAAQ,GACf,GAAI,EAAM,KAAW,EACnB,OAAO,EAGX,MAAO,GAGT,EAAO,QAAU,mBCtBjB,IAAI,OACA,OACA,OAWJ,SAAS,EAAY,EAAO,EAAO,EAAW,CAC5C,OAAO,IAAU,EACb,EAAc,EAAO,EAAO,EAAU,CACtC,EAAc,EAAO,EAAW,EAAU,CAGhD,EAAO,QAAU,mBCnBjB,IAAI,OAWJ,SAAS,EAAc,EAAO,EAAO,CAEnC,MAAO,CAAC,EADK,GAAS,MAAW,EAAM,SACpB,EAAY,EAAO,EAAO,EAAE,CAAG,GAGpD,EAAO,QAAU,mBCPjB,SAAS,EAAkB,EAAO,EAAO,EAAY,CAInD,IAHA,IAAI,EAAQ,GACR,EAAS,GAAS,KAAO,EAAI,EAAM,OAEhC,EAAE,EAAQ,GACf,GAAI,EAAW,EAAO,EAAM,GAAO,CACjC,MAAO,GAGX,MAAO,GAGT,EAAO,QAAU,mBCbjB,SAAS,EAAS,EAAO,EAAK,CAC5B,OAAO,EAAM,IAAI,EAAI,CAGvB,EAAO,QAAU,mBCNjB,EAAO,QAFH,SAAsB,MAAM,kBCQhC,SAAS,GAAO,EAIhB,EAAO,QAAU,mBCTjB,SAAS,EAAW,EAAK,CACvB,IAAI,EAAQ,GACR,EAAS,MAAM,EAAI,KAAK,CAK5B,OAHA,EAAI,QAAQ,SAAS,EAAO,CAC1B,EAAO,EAAE,GAAS,GAClB,CACK,EAGT,EAAO,QAAU,mBCjBjB,IAAI,OACA,OACA,OAgBJ,EAAO,QAJW,GAAQ,EAAI,EAAW,IAAI,EAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAT1C,IASoE,SAAS,EAAQ,CAClG,OAAO,IAAI,EAAI,EAAO,EADoD,mBCd5E,IAAI,OACA,OACA,OACA,OACA,OACA,OAGA,EAAmB,IAWvB,SAAS,EAAS,EAAO,EAAU,EAAY,CAC7C,IAAI,EAAQ,GACR,EAAW,EACX,EAAS,EAAM,OACf,EAAW,GACX,EAAS,EAAE,CACX,EAAO,EAEX,GAAI,EACF,EAAW,GACX,EAAW,UAEJ,GAAU,EAAkB,CACnC,IAAI,EAAM,EAAW,KAAO,EAAU,EAAM,CAC5C,GAAI,EACF,OAAO,EAAW,EAAI,CAExB,EAAW,GACX,EAAW,EACX,EAAO,IAAI,OAGX,EAAO,EAAW,EAAE,CAAG,EAEzB,MACA,KAAO,EAAE,EAAQ,GAAQ,CACvB,IAAI,EAAQ,EAAM,GACd,EAAW,EAAW,EAAS,EAAM,CAAG,EAG5C,GADA,EAAS,GAAc,IAAU,EAAK,EAAQ,EAC1C,GAAY,IAAa,EAAU,CAErC,IADA,IAAI,EAAY,EAAK,OACd,KACL,GAAI,EAAK,KAAe,EACtB,SAAS,MAGT,GACF,EAAK,KAAK,EAAS,CAErB,EAAO,KAAK,EAAM,MAEV,EAAS,EAAM,EAAU,EAAW,GACxC,IAAS,GACX,EAAK,KAAK,EAAS,CAErB,EAAO,KAAK,EAAM,EAGtB,OAAO,EAGT,EAAO,QAAU,mBCvEjB,IAAI,OAoBJ,SAAS,EAAK,EAAO,CACnB,OAAQ,GAAS,EAAM,OAAU,EAAS,EAAM,CAAG,EAAE,CAGvD,EAAO,QAAU,mBChBjB,SAAS,EAAU,EAAO,EAAQ,CAKhC,IAJA,IAAI,EAAQ,GACR,EAAS,EAAO,OAChB,EAAS,EAAM,OAEZ,EAAE,EAAQ,GACf,EAAM,EAAS,GAAS,EAAO,GAEjC,OAAO,EAGT,EAAO,QAAU,mBCnBjB,IAAI,MACA,MACA,MAGA,EAAmB,EAAS,EAAO,mBAAqB,OAS5D,SAAS,EAAc,EAAO,CAC5B,OAAO,EAAQ,EAAM,EAAI,EAAY,EAAM,EACzC,CAAC,EAAE,GAAoB,GAAS,EAAM,IAG1C,EAAO,QAAU,mBCnBjB,IAAI,OACA,OAaJ,SAAS,EAAY,EAAO,EAAO,EAAW,EAAU,EAAQ,CAC9D,IAAI,EAAQ,GACR,EAAS,EAAM,OAKnB,IAHA,CAAc,GAAY,EAC1B,CAAW,GAAS,EAAE,CAEf,EAAE,EAAQ,GAAQ,CACvB,IAAI,EAAQ,EAAM,GACd,EAAQ,GAAK,EAAU,EAAM,CAC3B,EAAQ,EAEV,EAAY,EAAO,EAAQ,EAAG,EAAW,EAAU,EAAO,CAE1D,EAAU,EAAQ,EAAM,CAEhB,IACV,EAAO,EAAO,QAAU,GAG5B,OAAO,EAGT,EAAO,QAAU,mBCrCjB,IAAI,OAgBJ,SAAS,EAAQ,EAAO,CAEtB,OADa,GAAS,MAAW,EAAM,OACvB,EAAY,EAAO,EAAE,CAAG,EAAE,CAG5C,EAAO,QAAU,mBCpBjB,IAAI,EAAa,KAAK,KAClB,EAAY,KAAK,IAarB,SAAS,EAAU,EAAO,EAAK,EAAM,EAAW,CAK9C,IAJA,IAAI,EAAQ,GACR,EAAS,EAAU,GAAY,EAAM,IAAU,GAAQ,GAAG,CAAE,EAAE,CAC9D,EAAS,MAAM,EAAO,CAEnB,KACL,EAAO,EAAY,EAAS,EAAE,GAAS,EACvC,GAAS,EAEX,OAAO,EAGT,EAAO,QAAU,mBC3BjB,IAAI,MACA,OA2BJ,SAAS,EAAY,EAAO,CAC1B,OAAO,GAAS,MAAQ,EAAS,EAAM,OAAO,EAAI,CAAC,EAAW,EAAM,CAGtE,EAAO,QAAU,mBChCjB,IAAI,OACA,OACA,OACA,MAYJ,SAAS,EAAe,EAAO,EAAO,EAAQ,CAC5C,GAAI,CAAC,EAAS,EAAO,CACnB,MAAO,GAET,IAAI,EAAO,OAAO,EAOlB,OANI,GAAQ,SACH,EAAY,EAAO,EAAI,EAAQ,EAAO,EAAO,OAAO,CACpD,GAAQ,UAAY,KAAS,GAE7B,EAAG,EAAO,GAAQ,EAAM,CAE1B,GAGT,EAAO,QAAU,mBC7BjB,IAAI,OAGA,EAAW,IACX,EAAc,sBAyBlB,SAAS,EAAS,EAAO,CASvB,OARK,GAGL,EAAQ,EAAS,EAAM,CACnB,IAAU,GAAY,IAAU,CAAC,GACvB,EAAQ,EAAI,GAAK,GACf,EAET,IAAU,EAAQ,EAAQ,GAPxB,IAAU,EAAI,EAAQ,EAUjC,EAAO,QAAU,mBCzCjB,IAAI,OACA,OACA,OASJ,SAAS,EAAY,EAAW,CAC9B,OAAO,SAAS,EAAO,EAAK,EAAM,CAahC,OAZI,GAAQ,OAAO,GAAQ,UAAY,EAAe,EAAO,EAAK,EAAK,GACrE,EAAM,EAAO,QAGf,EAAQ,EAAS,EAAM,CACnB,IAAQ,QACV,EAAM,EACN,EAAQ,GAER,EAAM,EAAS,EAAI,CAErB,EAAO,IAAS,OAAa,EAAQ,EAAM,EAAI,GAAM,EAAS,EAAK,CAC5D,EAAU,EAAO,EAAK,EAAM,EAAU,EAIjD,EAAO,QAAU,mBCgBjB,EAAO,QAFH,MAAqB,IC3CnB,EAAW,8EACX,GAAe,GAAU,CAC3B,IAAM,EAAK,EAAM,QAEjB,MAAO;MACL,EAAS,wDAFA,EAAM,QAEqD,4SAA4S,EAAG,YAEnX,GAAc,GAAU,CAC1B,IAAM,EAAK,EAAM,QAEjB,MAAO;MACL,EAAS,wDAFA,EAAM,QAEqD,2YAA2Y,EAAG,YAEld,GAAgB,GAAU,CAC5B,IAAM,EAAK,EAAM,QAEjB,MAAO,GAAG;gJADC,EAAM,QAE8H;uuCAColC,EAAG;WAGpuC,GAAgB,GAAU,CAC5B,IAAM,EAAK,EAAM,QAEjB,MAAO,GAAG;wJADC,EAAM,QAEsI;wHACnC,EAAG;SAGrH,GAAiB,GAAU,CAC7B,IAAM,EAAK,EAAM,QAEjB,MAAO,GAAG;;;gBADC,EAAM,QAIF;;;;;;gBAMH,EAAG;;SAIb,GAAa,GAAU,CACzB,IAAM,EAAK,EAAM,QAEjB,MAAO,GAAG;sJADC,EAAM,QAEoI;iVACwL,EAAG;6UACP,EAAG;;KA6MnU,GAAU,CACnB,eACA,gBACA,cACA,gBACA,iBACA,eAtMmB,GAuMnB,eAtMoB,GAAU,CAC9B,IAAM,EAAK,EAAM,QAEjB,MAAO,GAAG;wJADC,EAAM,QAEsI;wJACH,EAAG;SAkMvJ,YA/LiB,GAAU,CAC3B,IAAM,EAAK,EAAM,QAEjB,MAAO;MACL;qKAC+J,EAAG;gIACxC,EAAG;wIACK,EAAG;gJAL5H,EAAM,QAM8H;qGAC9C,EAAG;oGACJ,EAAG;wIACiC,EAAG;WAqLvI,YAlLiB,GAAU,CAC3B,IAAM,EAAK,EAAM,QAEjB,MAAO,GAAG;wJADC,EAAM,QAEsI;8KACmB,EAAG;yNACwC,EAAG;SA6KxN,aACA,YA3KiB,GAGV;MACL;kBAHS,EAAM,QAIA;gbAHN,EAAM,QAI8Z;UAsK/a,eAnKoB,GAAU,CAC9B,IAAM,EAAK,EAAM,QAEjB,MAAO;MACL;gJAFS,EAAM,QAG8H;8HACrB,EAAG;WA8J7H,WA3JgB,GAAU,CAC1B,IAAM,EAAK,EAAM,QAEjB,MAAO,GAAG;wJADC,EAAM,QAEsI;oNACyD,EAAG;SAuJnN,WApJgB,GAAU,CAC1B,IAAM,EAAK,EAAM,QAEjB,MAAO;MACL;gJAFS,EAAM,QAG8H;wIACX,EAAG;2DAChF,EAAG;WA8I1D,YA3IiB,GAAU,CAC3B,IAAM,EAAK,EAAM,QAEjB,MAAO,GAAG;0DADC,EAAM,QAEwC;kLACqH,EAAG;kQAC6E,EAAG;SAsIjQ,gBAnIqB,GAAU,CAC/B,IAAM,EAAK,EAAM,QACX,EAAK,EAAM,QACjB,MAAO;MACL;2DACqD,EAAG;2DACH,EAAG;kHACoD,EAAG;WA6HjH,iBA1HsB,GAGf,GAAG;gBAFC,EAAM,QAGF;06BAFJ,EAAM,QAGw5B;QAsHz6B,kBAnHuB,GAAU,CACjC,IAAM,EAAK,EAAM,QAEjB,MAAO;MACL;4DAFS,EAAM,QAG0C;6eAC8a,EAAG;WA8G5e,aA3GkB,GAAU,CAC5B,IAAM,EAAK,EAAM,QAEjB,MAAO;MACL;4DAFS,EAAM,QAG0C;icACkY,EAAG;WAsGhc,mBAnGwB,GAAU,CAClC,IAAM,EAAK,EAAM,QAEjB,MAAO,GAAG;0DADC,EAAM,QAEwC;oOACuK,EAAG;SA+FnO,WA5FgB,GAAU,CAC1B,IAAM,EAAK,EAAM,QAEjB,MAAO,GAAG;0DADC,EAAM,QAEwC;gIACmE,EAAG;gSAC6J,EAAG;uJAC5I,EAAG;iNACuD,EAAG;SAqFhN,aAlFkB,GAAU,CAC5B,IAAM,EAAK,EAAM,QAEjB,MAAO;MACL;gJAFS,EAAM,QAG8H;seACmV,EAAG;WA6Ere,kBA1EuB,GAAU,CACjC,IAAM,EAAK,EAAM,QAEjB,MAAO,GAAG;0DADC,EAAM,QAEwC;sOACyK,EAAG;SAsErO,kBAnEuB,GAAU,CACjC,IAAM,EAAK,EAAM,QAEjB,MAAO;MACL;4DAFS,EAAM,QAG0C;+LACgI,EAAG;WA8D9L,kBA3DuB,GAAU,CACjC,IAAM,EAAK,EAAM,QAEjB,MAAO,GAAG;wJADC,EAAM,QAEsI;iPACsF,EAAG;yaACqL,EAAG;SAsDxa,YAnDiB,GAAU,CAC3B,IAAM,EAAK,EAAM,QAEjB,MAAO,GAAG;0DADC,EAAM,QAEwC;mXACsT,EAAG;SA+ClX,gBA5CqB,GAAU,CAC/B,IAAM,EAAK,EAAM,QAEjB,MAAO;;0NADI,EAAM,QAGwM,YAAY,EAAG;WAwCxO,uBArC4B,GAAU,CACtC,IAAM,EAAK,EAAM,QAEjB,MAAO;;yNADI,EAAM,QAGuM,YAAY,EAAG;;GAiCvO,WAtOgB,GAAU,CAC1B,IAAM,EAAK,EAAM,QACjB,MAAO,GAAG;oBACM,EAAG;oBACH,EAAG;2LACoK,EAAG;;GAkO7L,CC7RD,SAAS,GAAU,EAAS,EAAO,CAQ3B,OAPA,IAAY,SACL,CAAC,EAAM,aAAc,EAAM,aAAa,CAE1C,IAAY,WACV,CAAC,QAAS,EAAM,YAAY,CAG5B,CAAC,EAAM,YAAa,EAAM,SAAS,CAIlD,IAAa,GAAb,KAA2B,CACvB,UACA,UAAY,IAAI,IAChB,YACA,SAAW,EACX,YAAY,EAAa,EAAW,CAChC,KAAK,UAAY,EACjB,KAAK,YAAc,GAAe,EAAE,CAExC,WAAW,EAAQ,EAAS,EAAK,EAAG,EAAG,EAAM,EAAO,EAAQ,EAAG,CAC3D,GAAM,CAAC,EAAS,GAAW,GAAU,EAAS,EAAM,CAC9C,EAAQ,EAAO,KAAK,KAAK,OAAO,iBAAiB,CACjD,EAAM,GAAG,EAAQ,GAAG,EAAQ,GAAG,EAAM,GAAG,IAC1C,EAAe,KAAK,UAAU,IAAI,EAAI,CAC1C,GAAI,IAAiB,OAAW,CAC5B,IAAM,EAAW,KAAK,YAAY,GAClC,GAAI,IAAa,OACb,OACJ,EAAe,SAAS,cAAc,SAAS,CAC/C,IAAM,EAAY,EAAa,WAAW,KAAK,CAC/C,GAAI,IAAc,KACd,OACJ,IAAM,EAAY,IAAI,MACtB,EAAU,IAAM,oCAAoC,mBAAmB,EAAS,CAAE,UAAS,UAAS,CAAC,CAAC,GACtG,KAAK,UAAU,IAAI,EAAK,EAAa,CACrC,IAAM,EAAU,EAAU,QAAQ,CAClC,GAAI,IAAY,OACZ,OACJ,KAAK,WACL,EACK,SAAW,CACZ,EAAU,UAAU,EAAW,EAAG,EAAG,EAAO,EAAM,EACpD,CACG,YAAc,CACf,KAAK,WACD,KAAK,WAAa,GAClB,KAAK,WAAW,EAEtB,MAGE,EAAQ,IACR,EAAI,YAAc,GAEtB,EAAI,UAAU,EAAc,EAAG,EAAG,EAAO,EAAO,EAAG,EAAG,EAAM,EAAK,CAC7D,EAAQ,IACR,EAAI,YAAc,KCzDlC,SAAgB,GAAa,EAAa,CACtC,GAAI,EAAY,SAAW,EACvB,OACJ,IAAI,EACJ,IAAK,IAAM,KAAM,EACb,EAAqB,KAAK,IAAI,GAAsB,EAAG,EAAG,EAAG,EAAE,CAGvE,SAAgB,GAAc,EAAU,EAAO,EAAQ,EAAM,EAAc,EAAoB,EAAc,EAAS,EAAI,CACtH,IAAqB,EACrB,IAAI,EAAI,EACJ,EAAM,EACJ,EAAS,EAAO,EAClB,EAAW,GACf,KAAO,EAAI,GAAU,EAAM,GAAQ,CAC/B,IAAM,EAAK,EAAa,EAAI,CAC5B,GAAI,EAAI,EAAK,GAAW,EAAG,EAAG,EAAK,EAAI,GAAO,GAAgB,IAAQ,EAAO,EAAE,GAAK,GAAM,CACtF,EAAW,GACX,MAEJ,GAAK,EACL,IAEA,MAEJ,GAAI,EACJ,IAAK,IAAI,EAAK,EAAG,EAAK,EAAoB,IAAM,CAC5C,EAAM,EAAO,EAAI,EACjB,IAAM,EAAK,EAAa,EAAI,CAC5B,GAAK,EACL,EAAG,EAAG,EAAK,EAAI,GAAM,GAAgB,IAAQ,EAAO,EAAE,GAG9D,SAAgB,GAAY,EAAe,EAAa,EAAY,EAAY,EAAmB,EAAI,CACnG,IAAI,EAAI,EACJ,EAAQ,EACN,EAAQ,EAAoB,EAClC,IAAK,IAAM,KAAK,EAAe,CAE3B,GAAI,EAAG,EADO,EAAE,OAAS,EAAQ,EAAI,EACpB,EAAO,EAAE,OAAS,EAAI,EAAO,EAAY,GAAK,GAC3D,MAEJ,GAAK,EAAE,MACP,GAAS,EAAE,OAAS,EAAE,MAAQ,GAGtC,SAAgB,GAAW,EAAe,EAAO,EAAY,EAAmB,EAAI,CAChF,IAAI,EAAI,EACJ,EAAQ,EACZ,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAc,OAAQ,IAAS,CACvD,IAAM,EAAW,EAAc,GAC3B,EAAM,EAAQ,EACd,EAAW,EAAS,MAIxB,IAHI,EAAS,SACT,GAAS,GAEN,EAAM,EAAc,QACvB,GAAa,EAAc,GAAK,MAAO,EAAS,MAAM,EACtD,EAAc,GAAK,SAAW,EAAc,GAAO,QAAQ,CAC3D,IAAM,EAAS,EAAc,GAC7B,GAAY,EAAO,MACnB,IACA,IACI,EAAO,SACP,GAAS,EAAO,OAGxB,IAAM,EAAI,EAAS,OAAS,EAAI,EAC1B,EAAS,EAAI,EACb,EAAQ,EAAS,OAAS,EAAI,KAAK,IAAI,EAAG,EAAQ,EAAO,CACzD,EAAI,KAAK,IAAI,EAAW,EAAO,GAAS,EAAS,GAAO,CAC9D,EAAG,CAAC,EAAS,YAAa,EAAc,EAAM,GAAG,YAAY,CAAE,EAAS,OAAS,GAAI,EAAS,EAAO,EAAG,EAAG,EAAkB,CAC7H,GAAK,GAGb,SAAgB,GAAc,EAAM,EAAO,EAAO,EAAO,EAAO,EAAQ,EAAY,CAChF,GAAM,CAAC,EAAU,GAAU,EACvB,EACA,EACE,EAAiB,EAAW,KAAK,GAAK,CAAC,EAAE,OAAO,EAAE,aAAe,EACvE,GAAI,EAAS,EAAgB,CACzB,IAAM,EAAgB,KAAK,IAAI,EAAU,EAAe,CACpD,EAAQ,EACR,EAAQ,EACZ,IAAK,IAAI,EAAI,EAAO,YAAc,EAAG,GAAK,EAAe,IACrD,GAAS,EAAW,GAAG,MACvB,GAAS,EAAW,GAAG,MAE3B,IAAK,IAAI,EAAI,EAAO,YAAc,EAAG,GAAK,EAAQ,IAC9C,GAAS,EAAW,GAAG,MAE3B,EAAc,CACV,EAAG,EACH,EAAG,EACH,MAAO,EACP,OAAQ,EACX,CAEL,GAAI,EAAiB,EAAU,CAC3B,IAAM,EAAc,KAAK,IAAI,EAAQ,EAAiB,EAAE,CACpD,EAAQ,EACR,EAAQ,EACZ,IAAK,IAAI,EAAI,EAAO,YAAc,EAAG,GAAK,EAAU,IAChD,GAAS,EAAW,GAAG,MACvB,GAAS,EAAW,GAAG,MAE3B,IAAK,IAAI,EAAI,EAAO,YAAc,EAAG,GAAK,EAAa,IACnD,GAAS,EAAW,GAAG,MAE3B,EAAa,CACT,EAAG,EACH,EAAG,EACH,MAAO,EACP,OAAQ,EACX,CAEL,MAAO,CAAC,EAAY,EAAY,CCpHpC,SAAgB,GAAe,EAAM,EAAI,EAAI,EAAmB,CAC5D,GAAI,IAAsB,MACtB,OAAO,GAAa,EAAM,CAAE,EAAG,EAAI,EAAG,EAAI,MAAO,EAAG,OAAQ,EAAG,CAAC,CAMpE,GALI,IAAsB,aACtB,EAAK,EAAK,GACV,IAAsB,eACtB,EAAK,EAAK,GAEV,GAAa,CAAC,EAAI,EAAG,CAAE,EAAK,CAC5B,OAGJ,IAAM,EAAiB,EAAK,EAAK,EAC3B,EAAkB,EAAK,EAAI,EAAK,MAAQ,EACxC,EAAgB,EAAK,EAAK,EAAI,EAC9B,EAAmB,EAAK,EAAI,EAAK,OAAS,EAE1C,EAAc,KAAK,IAAI,IAAsB,mBAAuC,EAAgB,IAAsB,mBAAuC,EAAiB,IAAsB,qBAAyC,EAAe,IAAsB,qBAAyC,EAAiB,CAYlV,OAVA,IAAgB,EACT,CAAE,EAAG,EAAK,EAAG,EAAG,EAAK,EAAI,EAAK,OAAQ,MAAO,EAAK,MAAO,OAAQ,EAAK,EAAK,EAAI,EAAK,OAAS,EAAG,CAElG,IAAgB,EACd,CAAE,EAAG,EAAK,EAAG,EAAG,EAAI,MAAO,EAAK,MAAO,OAAQ,EAAK,EAAI,EAAI,CAE9D,IAAgB,EACd,CAAE,EAAG,EAAK,EAAI,EAAK,MAAO,EAAG,EAAK,EAAG,MAAO,EAAK,EAAK,EAAI,EAAK,MAAQ,EAAG,OAAQ,EAAK,OAAQ,CAG/F,CAAE,EAAG,EAAI,EAAG,EAAK,EAAG,MAAO,EAAK,EAAI,EAAI,OAAQ,EAAK,OAAQ,CAG5E,SAAgB,GAAc,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,EAAI,CAC1D,OAAO,GAAM,EAAK,GAAM,GAAM,EAAK,GAAM,GAAM,EAAK,GAAM,GAAM,EAAK,EAEzE,SAAgB,GAAY,EAAM,EAAG,EAAG,CACpC,OAAO,GAAK,EAAK,GAAK,GAAK,EAAK,EAAI,EAAK,OAAS,GAAK,EAAK,GAAK,GAAK,EAAK,EAAI,EAAK,OAExF,SAAgB,GAAa,EAAG,EAAG,CAC/B,IAAM,EAAI,KAAK,IAAI,EAAE,EAAG,EAAE,EAAE,CACtB,EAAI,KAAK,IAAI,EAAE,EAAG,EAAE,EAAE,CAG5B,MAAO,CAAE,IAAG,IAAG,MAFD,KAAK,IAAI,EAAE,EAAI,EAAE,MAAO,EAAE,EAAI,EAAE,MAAM,CAAG,EAEjC,OADP,KAAK,IAAI,EAAE,EAAI,EAAE,OAAQ,EAAE,EAAI,EAAE,OAAO,CAAG,EAC5B,CAElC,SAAgB,GAAa,EAAG,EAAG,CAC/B,OAAO,EAAE,GAAK,EAAE,GAAK,EAAE,GAAK,EAAE,GAAK,EAAE,EAAI,EAAE,OAAS,EAAE,EAAI,EAAE,OAAS,EAAE,EAAI,EAAE,QAAU,EAAE,EAAI,EAAE,OAQnG,SAAgB,GAAgB,EAAM,EAAO,EAAQ,EAAK,CAEtD,GAAI,EAAK,EAAI,GACT,EAAK,EAAI,GACR,EAAK,EAAI,GAAK,EAAK,EAAI,GAAK,EAAK,EAAI,EAAK,MAAQ,GAAS,EAAK,EAAI,EAAK,OAAS,EACnF,OAGJ,GAAI,EAAK,GAAK,GAAK,EAAK,GAAK,GAAK,EAAK,EAAI,EAAK,OAAS,GAAS,EAAK,EAAI,EAAK,QAAU,EACtF,OAAO,EAIX,IAEM,EAAW,EAAQ,EACnB,EAAY,EAAS,EAErB,EAAe,GAAU,EAAK,EAC9B,EAAgB,EAAK,EAAI,EAAK,MAAQ,EACtC,EAAc,GAAS,EAAK,EAC5B,EAAiB,EAAK,EAAI,EAAK,OAAS,EAExC,EAAO,EAAe,EAAI,EAAK,EAAI,KAAK,MAAM,EAAe,EAAI,CAAG,EAAM,EAAK,EAC/E,EAAQ,EAAgB,EAAI,EAAK,EAAI,EAAK,MAAQ,KAAK,MAAM,EAAgB,EAAI,CAAG,EAAM,EAAK,EAAI,EAAK,MACxG,EAAM,EAAc,EAAI,EAAK,EAAI,KAAK,MAAM,EAAc,EAAI,CAAG,EAAM,EAAK,EAC5E,EAAS,EAAiB,EAAI,EAAK,EAAI,EAAK,OAAS,KAAK,MAAM,EAAiB,EAAI,CAAG,EAAM,EAAK,EAAI,EAAK,OAClH,MAAO,CAAE,EAAG,EAAM,EAAG,EAAK,MAAO,EAAQ,EAAM,OAAQ,EAAS,EAAK,CAEzE,SAAgB,GAAqB,EAAM,EAAe,EAAO,EAAQ,EAAgB,CACrF,GAAM,CAAC,EAAQ,EAAQ,EAAQ,GAAU,EACnC,CAAC,EAAO,EAAO,EAAO,GAAS,EAC/B,CAAE,EAAG,EAAK,EAAG,EAAK,MAAO,EAAK,OAAQ,GAAQ,EAC9C,EAAS,EAAE,CACjB,GAAI,GAAO,GAAK,GAAO,EACnB,OAAO,EACX,IAAM,EAAU,EAAM,EAChB,EAAW,EAAM,EAMjB,EAAa,EAAM,EACnB,EAAY,EAAM,EAClB,EAAc,EAAM,EAAM,EAC1B,EAAe,EAAM,EAAM,EAC3B,EAAoB,GAAO,GAAU,EAAM,GAC5C,EAAU,GAAU,GAAW,GAC/B,EAAM,GAAU,EAAU,EACzB,EAAqB,GAAO,GAAU,EAAM,GAC7C,EAAW,GAAU,GAAY,GACjC,EAAM,GAAU,EAAW,EAGhC,GAFqB,GAAoB,EAEvB,CACd,IAAM,EAAI,KAAK,IAAI,EAAK,EAAO,CACzB,EAAI,KAAK,IAAI,EAAK,EAAO,CACzB,EAAQ,KAAK,IAAI,EAAS,EAAO,CACjC,EAAS,KAAK,IAAI,EAAU,EAAO,CACzC,EAAO,KAAK,CACR,KAAM,CAAE,IAAG,IAAG,MAAO,EAAQ,EAAG,OAAQ,EAAS,EAAG,CACpD,KAAM,CACF,EAAG,EACH,EAAG,EACH,MAAO,EAAQ,EAAQ,EACvB,OAAQ,EAAQ,EAAQ,EAC3B,CACJ,CAAC,CAGN,GAAI,GAAc,EAAW,CACzB,IAAM,EAAI,EACJ,EAAI,EACJ,EAAQ,KAAK,IAAI,EAAS,EAAO,CACjC,EAAS,KAAK,IAAI,EAAU,EAAO,CACzC,EAAO,KAAK,CACR,KAAM,CACF,IACA,IACA,MAAO,EAAQ,EACf,OAAQ,EAAS,EACpB,CACD,KAAM,CACF,EAAG,EACH,EAAG,EACH,MAAO,EAAQ,EACf,OAAQ,EAAQ,EACnB,CACJ,CAAC,CAGN,GAAI,GAAa,EAAkB,CAC/B,IAAM,EAAI,KAAK,IAAI,EAAK,EAAO,CACzB,EAAI,EACJ,EAAQ,KAAK,IAAI,EAAS,EAAO,CACjC,EAAS,KAAK,IAAI,EAAU,EAAO,CACzC,EAAO,KAAK,CACR,KAAM,CACF,IACA,IACA,MAAO,EAAQ,EACf,OAAQ,EAAS,EACpB,CACD,KAAM,CACF,EAAG,EACH,EAAG,EACH,MAAO,EAAQ,EAAQ,EACvB,OAAQ,EAAQ,EACnB,CACJ,CAAC,CAGN,GAAI,GAAa,EAAa,CAC1B,IAAM,EAAI,KAAK,IAAI,EAAK,EAAO,CACzB,EAAI,EACJ,EAAQ,EACR,EAAS,KAAK,IAAI,EAAU,EAAO,CACzC,EAAO,KAAK,CACR,KAAM,CACF,IACA,IACA,MAAO,EAAQ,EACf,OAAQ,EAAS,EACpB,CACD,KAAM,CACF,EAAG,EACH,EAAG,EACH,MAAO,EAAQ,EAAQ,EACvB,OAAQ,EAAQ,EACnB,CACJ,CAAC,CAGN,GAAI,GAAc,EAAmB,CACjC,IAAM,EAAI,EACJ,EAAI,KAAK,IAAI,EAAK,EAAO,CACzB,EAAQ,KAAK,IAAI,EAAS,EAAO,CACjC,EAAS,KAAK,IAAI,EAAU,EAAO,CACzC,EAAO,KAAK,CACR,KAAM,CACF,IACA,IACA,MAAO,EAAQ,EACf,OAAQ,EAAS,EACpB,CACD,KAAM,CACF,EAAG,EACH,EAAG,EACH,MAAO,EAAQ,EACf,OAAQ,EAAQ,EAAQ,EAC3B,CACJ,CAAC,CAGN,GAAI,GAAe,EAAmB,CAClC,IAAM,EAAI,KAAK,IAAI,EAAK,EAAO,CACzB,EAAI,KAAK,IAAI,EAAK,EAAO,CACzB,EAAQ,EACR,EAAS,KAAK,IAAI,EAAU,EAAO,CACzC,EAAO,KAAK,CACR,KAAM,CACF,IACA,IACA,MAAO,EAAQ,EACf,OAAQ,EAAS,EACpB,CACD,KAAM,CACF,EAAG,EACH,EAAG,EACH,MAAO,EAAQ,EAAQ,EACvB,OAAQ,EAAQ,EAAQ,EAC3B,CACJ,CAAC,CAGN,GAAI,GAAc,EAAc,CAC5B,IAAM,EAAI,EACJ,EAAI,KAAK,IAAI,EAAK,EAAO,CACzB,EAAQ,KAAK,IAAI,EAAS,EAAO,CACjC,EAAS,EACf,EAAO,KAAK,CACR,KAAM,CACF,IACA,IACA,MAAO,EAAQ,EACf,OAAQ,EAAS,EACpB,CACD,KAAM,CACF,EAAG,EACH,EAAG,EACH,MAAO,EAAQ,EACf,OAAQ,EAAS,EAAQ,EAC5B,CACJ,CAAC,CAGN,GAAI,GAAgB,EAAkB,CAClC,IAAM,EAAI,KAAK,IAAI,EAAK,EAAO,CACzB,EAAI,KAAK,IAAI,EAAK,EAAO,CACzB,EAAQ,KAAK,IAAI,EAAS,EAAO,CACjC,EAAS,EACf,EAAO,KAAK,CACR,KAAM,CACF,IACA,IACA,MAAO,EAAQ,EACf,OAAQ,EAAS,EACpB,CACD,KAAM,CACF,EAAG,EACH,EAAG,EACH,MAAO,EAAQ,EAAQ,EACvB,OAAQ,EAAS,EAAQ,EAC5B,CACJ,CAAC,CAGN,GAAI,GAAe,EAAc,CAC7B,IAAM,EAAI,KAAK,IAAI,EAAK,EAAO,CACzB,EAAI,KAAK,IAAI,EAAK,EAAO,CACzB,EAAQ,EACR,EAAS,EACf,EAAO,KAAK,CACR,KAAM,CACF,IACA,IACA,MAAO,EAAQ,EACf,OAAQ,EAAS,EACpB,CACD,KAAM,CACF,EAAG,EACH,EAAG,EACH,MAAO,EAAQ,EAAQ,EACvB,OAAQ,EAAS,EAAQ,EAC5B,CACJ,CAAC,CAEN,OAAO,EC7RX,IAAMC,GAAc,CAChB,KAAM,EAAa,QACnB,aAAc,GACjB,CAaD,SAAgB,GAAU,EAAK,EAAkB,EAAY,EAAQ,EAAmB,EAAY,EAAY,EAAa,EAAM,EAAc,EAAgB,EAAiB,EAAqB,EAAc,EAAW,EAAW,EAAoB,EAAc,EAAa,EAAQ,EAAW,EAAe,EAAkB,EAAa,EAAe,EAAa,EAAW,EAAkB,EAAe,EAAY,EAAS,GAAqB,GAAiB,GAAgB,EAAkB,CAC5f,IAAI,GAAS,GAAQ,cACf,GAAY,YAAY,KAAK,CAC/B,EAAO,EAAW,aACtB,EAAI,KAAO,EACX,IAAM,GAAY,CAAE,MAAK,CACnB,EAAY,CAAC,EAAG,EAAE,CAClB,EAA2B,EAAqB,EAAI,GAAwB,EAAM,EAAoB,EAAa,CAAG,EACxH,GACA,GACE,GAAY,GAAa,EAAY,CAkQ3C,OAjQA,GAAY,EAAkB,EAAa,EAAY,EAAY,GAAoB,EAAG,EAAO,EAAe,EAAO,IAAa,CAChI,IAAM,EAAO,KAAK,IAAI,EAAG,EAAQ,EAAM,CACjC,GAAW,EAAQ,EACnB,GAAW,EAAoB,EAC/B,GAAW,EAAE,MAAQ,EACrB,GAAY,EAAS,EAAoB,EAC/C,GAAI,EAAY,OAAS,EAAG,CACxB,IAAI,EAAQ,GACZ,IAAK,IAAI,EAAI,EAAG,EAAI,EAAY,OAAQ,IAAK,CACzC,IAAM,EAAK,EAAY,GACvB,GAAI,GAAc,GAAU,GAAU,GAAU,GAAW,EAAG,EAAG,EAAG,EAAG,EAAG,MAAO,EAAG,OAAO,CAAE,CACzF,EAAQ,GACR,OAGR,GAAI,CAAC,EACD,OAER,IAAM,OAAe,CACjB,EAAI,MAAM,CACV,EAAI,WAAW,CACf,EAAI,KAAK,GAAU,GAAU,GAAU,GAAU,CACjD,EAAI,MAAM,EAER,GAAc,EAAU,QAAQ,SAAS,EAAE,YAAY,CACvD,GAAa,EAAgB,EAAE,OAAS,GAAG,CAAC,cAC5C,GAAW,EAAE,gBAAkB,QAAa,KAAe,OAC3D,EACA,GAAqB,EAAY,GAAY,EAAE,cAAc,CAC7D,EAAU,GAAS,aACrB,IAAY,IACZ,EAAO,EACP,EAAI,KAAO,GAEf,IAAQ,CACR,IAAI,GA4NJ,OA3NA,GAAc,EAAU,EAAe,EAAQ,EAAM,EAAc,EAAoB,EAAc,IAAY,EAAO,EAAK,EAAI,EAAU,IAAkB,CAoBzJ,GAnBI,EAAM,IAEV,EAAU,GAAK,EAAE,YACjB,EAAU,GAAK,EAgBX,IAAW,QAAa,CAAC,EAAO,IAAI,EAAU,EAC9C,OAEJ,GAAI,EAAY,OAAS,EAAG,CACxB,IAAI,EAAQ,GACZ,IAAK,IAAI,EAAI,EAAG,EAAI,EAAY,OAAQ,IAAK,CACzC,IAAM,EAAK,EAAY,GACvB,GAAI,GAAc,EAAO,EAAO,EAAE,MAAO,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,MAAO,EAAG,OAAO,CAAE,CAC3E,EAAQ,GACR,OAGR,GAAI,CAAC,EACD,OAER,IAAM,EAAc,EAAU,KAAK,SAAS,EAAI,CAC1C,GAAc,EAAa,SAAS,EAAI,CACxC,EAAO,EAAM,EAAO,EAAe,EAAU,CAAGA,GAClD,EAAQ,EACR,GAAY,EAAE,MACd,GAAc,GACd,GAAe,GACnB,GAAI,EAAK,OAAS,OAAW,CACzB,GAAM,CAAC,EAAU,GAAU,EAAK,KAC1B,EAAU,GAAG,EAAI,GAAG,EAAS,GAAG,EAAO,GAAG,EAAE,SAGlD,GAFI,KAAiB,SACjB,GAAe,IAAI,KAClB,GAAa,IAAI,EAAQ,CA6BzB,CACD,KACA,WA/B4B,CAC5B,IAAM,EAAQ,GAAc,EAAK,KAAM,EAAO,EAAO,EAAE,MAAO,EAAI,EAAG,EAAW,CAC1E,EAAO,EAAE,OAAS,EAAM,GAAK,EAAM,GAIzC,GAHI,CAAC,EAAE,QAAU,EAAM,KAAO,SAC1B,GAAe,IAEf,IAAS,OAAW,CACpB,EAAQ,EAAK,EACb,GAAY,EAAK,MACjB,GAAa,IAAI,EAAQ,CACzB,EAAI,SAAS,CACb,GAAa,OACb,EAAI,MAAM,CACV,EAAI,WAAW,CACf,IAAM,EAAI,KAAK,IAAI,EAAG,EAAQ,EAAK,EAAE,CACrC,EAAI,KAAK,EAAK,EAAI,EAAG,EAAO,EAAK,MAAQ,EAAG,EAAG,CAC3C,KAAW,SACX,GAAS,EAAE,EAEf,GAAO,KAAK,CACR,EAAG,EAAK,EAAI,EACZ,EAAG,EACH,MAAO,EAAK,MAAQ,EACpB,OAAQ,EACX,CAAC,CACF,EAAI,MAAM,CACV,GAAc,KAQ1B,IAAM,GAAW,IAAsB,EAAI,CACrC,GAAgB,GAAiB,EAAE,oBAAoB,gBAAkB,OACzE,EAAE,oBAAoB,cACtB,OACA,GAAQ,EAAK,gBAAkB,QAAa,KAAa,QAAa,KAAkB,OACxF,GACA,GAAqB,GAAU,GAAU,GAAe,EAAK,cAAc,CACjF,EAAI,WAAW,CACf,IAAM,GAAa,GAAe,EAAW,EAAM,EAAU,CACzD,EAAc,GAAc,EAAW,EAAM,EAAW,EAAU,CAChE,GAAoB,EAAK,OAAS,QACpC,EAAU,QAAQ,KAAK,GAAS,EAAK,OAAS,QAAa,GAAS,EAAK,KAAK,IAAM,GAAS,EAAK,KAAK,GACtG,CACD,IAAc,CAAC,GAAa,EAC5B,EAAc,EAET,IAAc,IACnB,EAAc,KAAK,IAAI,EAAa,EAAE,EAEtC,IACA,IAEC,KACG,GACA,IACA,IAAe,CAAC,GAChB,KAER,IAAM,GAAS,EAAK,OAAS,EAAa,UAAY,GAAM,aAAe,GAAM,OAC7E,EAIJ,IAHI,GAAY,KAAW,EAAW,UAClC,EAAO,GAAM,GAAQ,EAAK,EAE1B,EAAc,GAAK,GAAa,CAC5B,KACA,EAAO,GAAM,GAAM,SAAU,EAAK,EAEtC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAa,IAC7B,EAAO,GAAM,GAAM,YAAa,EAAK,SAGpC,IAAkB,YAClB,IAAM,KAAO,EACd,GAAI,EAAI,KAAO,EAAE,aAAe,EAAI,KAAO,EAAK,CAC5C,EAAO,GAAM,GAAM,eAAgB,EAAK,CACxC,OAIZ,GAAI,IAAqB,OACrB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAiB,OAAQ,IAAK,CAC9C,IAAM,EAAS,EAAiB,GAC1B,EAAI,EAAO,MACb,EAAO,QAAU,iBACjB,EAAE,GAAK,EAAE,aACT,EAAE,YAAc,EAAE,EAAI,EAAE,OACxB,EAAE,GAAK,GACP,EAAM,EAAE,EAAI,EAAE,SACd,EAAO,GAAM,EAAO,MAAO,EAAK,EAI5C,IAAI,GAAgB,GACpB,GAAI,IAAW,OAAW,CAItB,IAAM,EAAM,EAAQ,EAId,GAHS,EACT,EAAM,EAAK,EACX,KAAK,IAAI,EAAM,EAAK,EAAG,EAAS,EAAyB,EAC5C,GAGf,IAAM,EAAK,GAAK,EAAQ,GAAK,KAC7B,GAAgB,GAChB,EAAI,MAAM,CACV,EAAI,WAAW,CACf,EAAI,KAAK,EAAQ,EAAG,EAAK,GAAY,EAAG,EAAE,CAC1C,EAAI,MAAM,EAId,EAAO,IAAS,OAAY,GAAM,OAAS,GAAM,EAAM,GAAM,OAAO,CAExE,IAAM,EAAe,EAAE,cAAgB,EAAW,OAAS,EACrD,EAAY,IAAQ,EAAO,EAC7B,IAAS,SACT,EAAI,UAAY,EACZ,KAAe,SACf,GAAW,UAAY,GAEvB,IAAW,OAMX,EAAI,SAAS,EAAO,EAAO,GAAW,EAAG,CAHzC,EAAI,SAAS,EAAQ,EAAG,EAAQ,EAAG,IAAa,EAAe,EAAI,GAAI,GAAM,EAAY,EAAI,GAAG,EAMpG,EAAK,QAAU,UACf,EAAI,YAAc,IAEtB,IAAI,EACJ,IAAK,IAAI,EAAI,EAAG,EAAI,EAAY,OAAQ,IAAK,CACzC,IAAM,EAAK,EAAY,GACvB,GAAI,EAAG,KAAK,KAAO,EAAE,aAAe,EAAG,KAAK,KAAO,EAAK,CACpD,EAAa,EACb,OAGR,GAAI,GAAY,GAAoB,CAAC,GAAc,CAC/C,IAAM,EAAW,GAAM,aACnB,IAAa,IACb,EAAI,KAAO,EACX,EAAO,GAEX,GAAa,GAAS,EAAK,EAAM,EAAE,YAAa,EAAK,EAAc,EAAW,EAAO,EAAO,GAAW,EAAI,EAAc,EAAG,GAAO,GAAQ,GAAM,OAAQ,EAAa,EAAe,GAAY,aAAe,EAAG,EAAW,EAAe,GAAW,EAAkB,GAAY,EAAS,GAAqB,GAAiB,GAAe,CAiBxV,OAfI,IACA,EAAI,SAAS,CAEb,EAAK,QAAU,UACf,EAAI,YAAc,GAEtB,KACI,KACA,EAAI,SAAS,CACb,IAAY,SAAS,GAAU,CAC/B,GAAa,OACb,IAAQ,CACR,EAAO,EACP,EAAI,KAAO,GAER,IAAU,GACnB,CACF,EAAI,SAAS,CACN,IAAU,GACnB,CACK,GAEX,IAAM,GAAgB,CAAC,EAAG,EAAE,CACtB,GAAe,CAAE,EAAG,EAAG,EAAG,EAAG,MAAO,EAAG,OAAQ,EAAG,CAClD,GAAY,CAAC,WAAiB,OAAU,CAC1C,GAA0B,GAC9B,SAAS,IAAc,CACnB,GAA0B,GAE9B,SAAgB,GAAS,EAAK,EAAM,EAAK,EAAK,EAAW,EAAW,EAAG,EAAG,EAAG,EAAG,EAAa,EAAO,EAAoB,EAAa,EAAe,EAAa,EAAW,EAAe,EAAW,EAAkB,EAAU,EAAS,EAAqB,EAAiB,EAAgB,CAC7R,IAAI,EACA,EACA,IAAc,QAAa,EAAU,GAAG,KAAO,GAAO,EAAU,GAAG,KAAO,IAC1E,EAAS,EAAU,GAAG,GACtB,EAAS,EAAU,GAAG,IAE1B,IAAI,EACJ,GAAc,GAAK,EACnB,GAAc,GAAK,EACnB,GAAa,EAAI,EACjB,GAAa,EAAI,EACjB,GAAa,MAAQ,EACrB,GAAa,OAAS,EACtB,GAAU,GAAK,EAAoB,SAAS,GAAc,CAC1D,GAAU,GAAM,GAAQ,EAAoB,SAAS,GAAe,EAAI,CACxE,GAA0B,GAC1B,IAAM,EAAO,CAET,MACA,QACA,MACA,MACA,OACA,KAAM,GACN,cACA,cAAe,EACf,cACA,YACA,SACA,aACA,SACA,cACA,gBACA,gBACA,eAAgB,IAAW,OAA6B,OAAjB,EACvC,sBAAuB,GAC1B,CACK,EAAY,GAAuB,EAAM,EAAK,YAAa,EAAW,EAAU,EAAW,EAAU,CACrG,EAAI,EAAgB,EAAK,CAC/B,GAAI,IAAM,OAAW,CACb,GAAU,WAAa,IACvB,GAAU,SAAS,EAAK,CACxB,EAAW,QAEf,IAAM,EAAoB,EAAE,WAAW,EAAM,EAAS,CAClD,IAAqB,QAAa,CAAC,EAAgB,EAAK,KAAK,CAC7D,EAAiB,MAAY,EAAE,KAAK,EAAM,EAAK,CAAC,CAGhD,EAAE,KAAK,EAAM,EAAK,CAEtB,EACI,IAAsB,OAChB,OACA,CACE,OAAQ,GAAmB,OAC3B,UAAW,GAAmB,UAC9B,KAAM,GAAmB,KACzB,SAAU,EACb,CAIb,OAFI,GAAa,KACb,IAAU,GAAc,CACrB,EC1WX,SAAgB,GAAa,EAAK,EAAO,EAAS,EAAG,EAAG,EAAO,EAAQ,EAAa,EAAS,IAAK,EAAS,IAAK,EAAU,GAAI,EAAY,SAAU,EAAQ,SAAU,CAClK,IAAM,EAAU,KAAK,MAAM,EAAI,EAAS,EAAE,CACpC,EAAiB,IAAU,SAAW,IAAQ,EAAM,gBAAkB,EACxE,EAAgB,GAAe,EAAS,EAAQ,EAAM,oBAAoB,CAC1E,EAAoB,EAAgB,EAClC,EAAO,GAAuB,EAAW,EAAG,EAAO,EAAM,sBAAuB,EAAc,CAC9F,EAAK,GAAY,EAAM,EAAS,EAAc,CAC9C,EAAU,GAAgB,EAAI,EAAQ,EAAI,EAAQ,EAAG,CAC3D,OAAQ,EAAR,CACI,IAAK,GACD,EAAI,WAAW,CACf,GAAY,EAAK,EAAO,EAAgB,EAAG,EAAU,EAAgB,EAAG,EAAe,EAAe,EAAe,CACjH,IAAU,WACV,GAAqB,GACrB,GAAiB,IAErB,EAAI,UAAY,EAAc,EAAM,YAAc,EAAM,WACxD,EAAI,MAAM,CACV,EAAI,WAAW,CACf,EAAI,OAAO,EAAO,EAAoB,EAAgB,KAAM,EAAU,EAAoB,EAAgB,KAAK,CAC/G,EAAI,OAAO,EAAO,EAAoB,EAAgB,KAAM,EAAU,EAAoB,EAAgB,KAAK,CAC/G,EAAI,OAAO,EAAO,EAAoB,EAAgB,KAAM,EAAU,EAAoB,EAAgB,KAAK,CAC/G,EAAI,YAAc,EAAM,OACxB,EAAI,SAAW,QACf,EAAI,QAAU,QACd,EAAI,UAAY,IAChB,EAAI,QAAQ,CACZ,MAEJ,UACA,IAAK,GACD,EAAI,WAAW,CACf,GAAY,EAAK,EAAO,EAAgB,EAAI,GAAK,EAAU,EAAgB,EAAI,GAAK,EAAgB,EAAG,EAAgB,EAAG,EAAe,CACzI,EAAI,UAAY,EAChB,EAAI,YAAc,EAAU,EAAM,SAAW,EAAM,WACnD,EAAI,QAAQ,CACZ,MAEJ,YACI,EAAI,WAAW,CACf,GAAY,EAAK,EAAO,EAAgB,EAAG,EAAU,EAAgB,EAAG,EAAe,EAAe,EAAe,CACrH,EAAI,UAAY,EAAU,EAAM,WAAa,EAAM,UACnD,EAAI,MAAM,CACN,IAAU,WACV,GAAqB,GACrB,GAAiB,IAErB,EAAI,WAAW,CACf,EAAI,OAAO,EAAO,EAAgB,EAAG,EAAQ,CAC7C,EAAI,OAAO,EAAO,EAAgB,EAAG,EAAQ,CAC7C,EAAI,YAAc,EAAM,OACxB,EAAI,QAAU,QACd,EAAI,UAAY,IAChB,EAAI,QAAQ,CACZ,MAEJ,QACI,GAAY,EAAQ,ECrDhC,SAAgB,GAAgB,EAAK,EAAe,EAAc,EAAS,EAAO,EAAY,EAAc,EAAmB,EAAkB,EAAY,EAAW,EAAY,EAAe,EAAa,EAAgB,EAAiB,EAAQ,EAAoB,EAAW,CACpR,IAAM,EAAoB,EAAe,EACzC,GAAI,GAAqB,EACrB,OACJ,EAAI,UAAY,EAAW,SAC3B,EAAI,SAAS,EAAG,EAAG,EAAO,EAAkB,CAC5C,GAAM,CAAC,EAAM,GAAQ,IAAU,IAAM,EAAE,CAGvC,EAAI,KAFS,EAAW,eAGxB,GAAY,EAAe,EAAG,EAAY,EAAG,GAAoB,EAAG,EAAG,EAAI,IAAU,CACjF,GAAI,IAAW,QAAa,CAAC,EAAO,IAAI,CAAC,EAAE,YAAa,GAAG,CAAC,CACxD,OACJ,IAAM,EAAO,KAAK,IAAI,EAAG,EAAQ,EAAE,CACnC,EAAI,MAAM,CACV,EAAI,WAAW,CACf,EAAI,KAAK,EAAI,EAAM,EAAmB,EAAE,MAAQ,EAAM,EAAa,CACnE,EAAI,MAAM,CACV,IAAM,EAAa,EAAgB,EAAE,OAAS,GAAG,CAAC,cAC5C,EAAQ,EAAE,gBAAkB,QAAa,IAAe,OACxD,EACA,GAAqB,EAAY,EAAY,EAAE,cAAc,CAC/D,EAAM,WAAa,EAAW,WAC9B,EAAI,UAAY,EAAM,SACtB,EAAI,MAAM,EAEV,IAAU,IACV,EAAI,KAAO,EAAM,cAErB,IAAM,EAAW,EAAU,QAAQ,SAAS,EAAE,YAAY,CACpD,EAAU,IAAqB,QAAa,EAC5C,EAAiB,CAAC,GAAW,IAAS,IAAM,IAAS,EAAE,YACvD,EAAQ,EACR,EACA,EAAY,KAAK,GAAK,EAAE,KAAK,KAAO,EAAE,aAAe,EAAE,KAAK,KAAO,GAAG,EAAE,aAAe,EACvF,EAAkB,GAAW,UAAY,QAAa,EAAU,QAAQ,KAAK,KAAO,EAAE,YACtF,EAAc,EAAW,EAAM,YAAc,EAAkB,EAAM,iBAAmB,EAAM,SAC9F,EAAI,EAAe,EAAoB,EACvC,EAAU,EAAE,cAAgB,EAAI,EAAI,EACtC,GACA,EAAI,UAAY,EAChB,EAAI,SAAS,EAAI,EAAS,EAAG,EAAE,MAAQ,EAAS,EAAa,GAExD,GAAmB,EAAQ,KAChC,EAAI,WAAW,CACf,EAAI,KAAK,EAAI,EAAS,EAAG,EAAE,MAAQ,EAAS,EAAa,CACrD,IACA,EAAI,UAAY,EAAM,iBACtB,EAAI,MAAM,EAEV,EAAQ,IACR,EAAI,YAAc,EAClB,EAAI,UAAY,EAAM,gBACtB,EAAI,MAAM,CACV,EAAI,YAAc,IAG1B,GAAW,EAAK,EAAG,EAAG,EAAE,MAAO,EAAc,EAAG,EAAU,EAAO,EAAgB,EAAiB,EAAO,EAAe,EAAoB,EAAU,CACtJ,EAAI,SAAS,EACf,CACE,GACA,GAAW,EAAK,EAAe,EAAO,EAAY,EAAmB,EAAS,EAAY,EAAe,EAAa,EAAgB,EAAiB,EAAO,CAGtK,SAAgB,GAAW,EAAK,EAAe,EAAO,EAAY,EAAmB,EAAS,EAAO,EAAe,EAAc,EAAgB,EAAiB,EAAQ,CACvK,GACM,CAAC,EAAM,GAAQ,IAAU,IAAM,EAAE,CACnC,EAAS,EACb,GAAW,EAAe,EAAO,EAAY,GAAoB,EAAM,EAAW,EAAG,EAAG,EAAG,IAAM,CAC7F,GAAI,IAAW,QACX,CAAC,EAAO,mBAAmB,CACvB,EAAG,EAAK,GACR,EAAG,GACH,MAAO,EAAK,GAAK,EAAK,GAAK,EAC3B,OAAQ,EACX,CAAC,CACF,OACJ,EAAI,MAAM,CACV,EAAI,WAAW,CACf,EAAI,KAAK,EAAG,EAAG,EAAG,EAAE,CACpB,EAAI,MAAM,CACV,IAAM,EAAQ,EAAgB,EAAU,CAClC,EAAa,GAAO,gBAAkB,OAAY,EAAQ,GAAqB,EAAO,EAAM,cAAc,CAC1G,EAAY,IAAS,IAAM,IAAS,QAAa,GAAQ,EAAK,IAAM,GAAQ,EAAK,GACjF,EAAY,EAAY,EAAW,gBAAkB,EAAW,SAMtE,GALI,IAAc,EAAM,WACpB,EAAI,UAAY,EAChB,EAAI,MAAM,EAEd,EAAI,UAAY,EAAW,iBAAmB,EAAW,WACrD,IAAU,OAAW,CACrB,IAAI,EAAQ,EAMZ,GALI,EAAM,OAAS,SACf,EAAc,WAAW,EAAM,KAAM,SAAU,EAAK,EAAQ,GAAO,EAAoB,IAAM,EAAG,GAAI,EAAW,CAC/G,GAAS,IAEb,EAAI,SAAS,EAAM,KAAM,EAAQ,EAAM,EAAoB,EAAI,GAAoB,EAAK,EAAM,eAAe,CAAC,CAC1G,EAAM,UAAY,QAAa,EAAW,CAC1C,IAAM,EAAc,GAAwB,CAAE,IAAG,IAAG,MAAO,EAAG,OAAQ,EAAG,CAAE,EAAM,QAAQ,CACzF,EAAI,WAAW,CACf,IAAM,EAAa,EAAY,GAAG,EAAI,GAChC,EAAY,EAAI,EAAI,EAC1B,EAAI,KAAK,EAAY,EAAG,EAAW,EAAkB,CACrD,IAAM,EAAO,EAAI,qBAAqB,EAAY,EAAG,EAAa,EAAW,EAAE,CACzE,EAAQC,GAAU,EAAW,EAAE,CACrC,EAAK,aAAa,EAAG,EAAM,CAC3B,EAAK,aAAa,GAAK,EAAW,EAAU,CAC5C,EAAK,aAAa,EAAG,EAAU,CAC/B,EAAI,UAAY,EAChB,EAAI,MAAM,CACV,EAAI,YAAc,GAElB,GAAM,CAAC,EAAQ,GAAU,IAAU,IAAM,CAAC,GAAI,GAAG,CACjD,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,QAAQ,OAAQ,IAAK,CAC3C,IAAM,EAAS,EAAM,QAAQ,GACvB,EAAM,EAAY,GAClB,EAAgB,GAAY,EAAK,EAAS,EAAG,EAAO,CACtD,IACA,EAAI,YAAc,GAEtB,EAAc,WAAW,EAAO,KAAM,SAAU,EAAK,EAAI,EAAI,EAAI,MAAQ,EAAI,GAAI,EAAI,EAAI,EAAI,OAAS,EAAI,GAAI,GAAI,EAAW,CACzH,IACA,EAAI,YAAc,IAG1B,EAAI,YAAc,GAGtB,IAAM,GAAK,EAAe,EAAK,GAAG,GAClC,EAAI,WAAW,CACf,EAAI,OAAO,EAAI,GAAK,EAAE,CACtB,EAAI,OAAO,EAAI,GAAK,EAAkB,CACtC,EAAI,YAAc,EAAM,YACxB,EAAI,UAAY,EAChB,EAAI,QAAQ,EAEhB,EAAI,SAAS,CACb,EAAS,EAAI,GACf,CACF,EAAI,WAAW,CACf,EAAI,OAAO,EAAS,GAAK,EAAE,CAC3B,EAAI,OAAO,EAAS,GAAK,EAAkB,CAC3C,EAAI,OAAO,EAAG,EAAoB,GAAI,CACtC,EAAI,OAAO,EAAO,EAAoB,GAAI,CAC1C,EAAI,YAAc,EAAM,YACxB,EAAI,UAAY,EAChB,EAAI,QAAQ,CAEhB,IAAM,GAAiB,GACvB,SAAgB,GAAoB,EAAG,EAAG,EAAO,EAAQ,EAAO,CAG5D,OAFI,EACO,CAAE,IAAG,IAAG,MAAO,GAAgB,OAAQ,KAAK,IAAI,GAAgB,EAAO,CAAE,CAC7E,CACH,EAAG,EAAI,EAAQ,GACf,EAAG,KAAK,IAAI,EAAG,EAAI,EAAS,EAAI,GAAiB,EAAE,CACnD,MAAO,GACP,OAAQ,KAAK,IAAI,GAAgB,EAAO,CAC3C,CAEL,SAAgB,GAAwB,EAAK,EAAS,CAClD,IAAM,EAAS,EAAE,CACb,EAAI,EAAI,EAAI,EAAI,MAAQ,GAAK,EAAQ,OACnC,EAAI,EAAI,EAAI,EAAI,OAAS,EAAI,GAGnC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,OAAQ,IAChC,EAAO,KAAK,CACR,IACA,IACA,SACA,UACH,CAAC,CACF,GAAK,GAET,OAAO,EAEX,SAAS,GAAgB,EAAK,EAAG,EAAG,EAAO,EAAQ,EAAG,EAAU,EAAO,EAAW,EAAa,EAAe,EAAW,EAAO,EAAY,CACxI,GAAI,EAAE,YAAc,OAAW,CAC3B,IAAM,EAAU,EAAE,iBACd,IAAY,KACZ,EAAI,YAAc,GAEtB,GAAa,EAAK,EAAO,EAAS,EAAG,EAAG,EAAO,EAAQ,GAAO,OAAW,OAAW,GAAI,SAAU,EAAE,UAAU,CAC1G,IAAY,KACZ,EAAI,YAAc,GAEtB,OAEJ,IAAM,EAAO,EAAM,sBACb,EAAY,EAAW,EAAM,mBAAqB,EAAM,WACxD,EAAiB,EAAE,UAAY,KAAS,GAAc,GAAa,GACnE,EAAY,EAAQ,GAAK,EAC3B,EAAQ,EAAQ,EAAI,EAAQ,EAAO,EAAI,EAC3C,GAAI,EAAE,OAAS,OAAW,CACtB,IAAI,EAAU,EAAW,WAAa,SAClC,EAAE,QAAU,cACZ,EAAU,EAAW,WAAa,WAEtC,IAAM,EAAa,EAAM,eACzB,EAAc,WAAW,EAAE,KAAM,EAAS,EAAK,EAAQ,EAAQ,EAAa,EAAO,GAAK,EAAS,GAAc,EAAG,EAAY,EAAM,CAChI,EAAE,cAAgB,QAClB,EAAc,WAAW,EAAE,YAAa,EAAW,WAAa,UAAW,EAAK,EAAQ,EAAQ,EAAa,EAAI,EAAQ,EAAG,IAAM,EAAS,IAAM,EAAI,GAAI,GAAI,EAAM,CAEvK,GAAS,KAAK,KAAK,EAAa,IAAI,CAAG,EAE3C,GAAI,GAAkB,EAAE,UAAY,IAAQ,EAAQ,GAAI,CACpD,IACM,EAAY,EAAQ,GAAY,EAAQ,GACxC,EAAU,EAAQ,GAAY,GAAM,EAAQ,GAAY,GACxD,EAAmB,EAAY,EAC/B,EAAiB,EAAU,EAC3B,EAAO,EAAI,qBAAqB,EAAG,EAAG,EAAI,EAAO,EAAE,CACnD,EAAQA,GAAU,EAAW,EAAE,CACrC,EAAK,aAAa,EAAQ,EAAI,EAAG,EAAU,CAC3C,EAAK,aAAa,EAAkB,EAAU,CAC9C,EAAK,aAAa,EAAgB,EAAM,CACxC,EAAK,aAAa,EAAQ,EAAI,EAAG,EAAM,CACvC,EAAI,UAAY,OAGhB,EAAI,UAAY,EASpB,GAPI,IACA,EAAI,UAAY,SAEpB,EAAI,SAAS,EAAE,MAAO,EAAO,EAAI,EAAS,EAAI,GAAoB,EAAK,EAAM,eAAe,CAAC,CACzF,IACA,EAAI,UAAY,QAEhB,GAAkB,EAAE,UAAY,GAChC,GAAI,EAAE,WAAa,QAAa,EAAE,WAAa,EAAmB,SAAU,CAExE,EAAI,WAAW,CACf,IAAM,EAAY,EAAW,EAAI,EAAW,MAAQ,EAAI,IAClD,EAAY,EAAW,EAAI,EAAW,OAAS,EAAI,EACzD,GAAY,EAAK,CACb,CACI,EAAG,EACH,EAAG,EACN,CACD,CACI,EAAG,EAAY,GACf,EAAG,EACN,CACD,CACI,EAAG,EAAY,IACf,EAAG,EAAY,EAClB,CACJ,CAAE,EAAE,CACL,EAAI,UAAY,EAChB,EAAI,MAAM,SAEL,EAAE,WAAa,EAAmB,KAEvC,EAAI,WAAW,CAGf,GAAa,EAFC,EAAW,EAAI,EAAW,MAAQ,EAClC,EAAW,EAAI,EAAW,OAAS,EAClB,CAC/B,EAAI,UAAY,EAChB,EAAI,MAAM,KAET,CAED,IAAM,EAAQ,EAAW,GAAK,EAAW,MAAQ,EAAM,gBAAkB,EACnE,EAAQ,EAAW,GAAK,EAAW,OAAS,EAAM,gBAAkB,EAC1E,EAAc,WAAW,EAAE,SAAU,SAAU,EAAK,EAAO,EAAO,EAAM,eAAgB,EAAM,EAI1G,SAAgB,GAAW,EAAK,EAAG,EAAG,EAAO,EAAQ,EAAG,EAAU,EAAO,EAAW,EAAiB,EAAa,EAAe,EAAoB,EAAW,CAC5J,IAAM,EAAQ,GAAU,EAAE,MAAM,GAAK,MAC/B,EAAa,GAAoB,EAAG,EAAG,EAAO,EAAQ,EAAM,CAC9D,IAAuB,OAgBvB,GAAgB,EAAK,EAAG,EAAG,EAAO,EAAQ,EAAG,EAAU,EAAO,EAAW,EAAa,EAAe,EAAW,EAAO,EAAW,CAflI,EAAmB,CACf,MACA,QACA,KAAM,CAAE,IAAG,IAAG,QAAO,SAAQ,CAC7B,OAAQ,EACR,YAAa,EAAE,YACf,WAAY,EACZ,cACA,YACA,kBACA,gBACA,aACH,KAAQ,GAAgB,EAAK,EAAG,EAAG,EAAO,EAAQ,EAAG,EAAU,EAAO,EAAW,EAAa,EAAe,EAAW,EAAO,EAAW,CAAC,mBCrSpJ,IAAI,MAUJ,EAAO,QARe,UAAW,CAC/B,GAAI,CACF,IAAI,EAAO,EAAU,OAAQ,iBAAiB,CAE9C,OADA,EAAK,EAAE,CAAE,GAAI,EAAE,CAAC,CACT,OACG,KACX,kBCRH,IAAI,OAWJ,SAAS,EAAgB,EAAQ,EAAK,EAAO,CACvC,GAAO,aAAe,EACxB,EAAe,EAAQ,EAAK,CAC1B,aAAgB,GAChB,WAAc,GACd,MAAS,EACT,SAAY,GACb,CAAC,CAEF,EAAO,GAAO,EAIlB,EAAO,QAAU,mBCdjB,SAAS,EAAgB,EAAO,EAAQ,EAAU,EAAa,CAI7D,IAHA,IAAI,EAAQ,GACR,EAAS,GAAS,KAAO,EAAI,EAAM,OAEhC,EAAE,EAAQ,GAAQ,CACvB,IAAI,EAAQ,EAAM,GAClB,EAAO,EAAa,EAAO,EAAS,EAAM,CAAE,EAAM,CAEpD,OAAO,EAGT,EAAO,QAAU,mBCdjB,SAAS,EAAc,EAAW,CAChC,OAAO,SAAS,EAAQ,EAAU,EAAU,CAM1C,IALA,IAAI,EAAQ,GACR,EAAW,OAAO,EAAO,CACzB,EAAQ,EAAS,EAAO,CACxB,EAAS,EAAM,OAEZ,KAAU,CACf,IAAI,EAAM,EAAM,EAAY,EAAS,EAAE,GACvC,GAAI,EAAS,EAAS,GAAM,EAAK,EAAS,GAAK,GAC7C,MAGJ,OAAO,GAIX,EAAO,QAAU,mBCTjB,EAAO,QAFH,MAAyB,kBCJ7B,SAAS,EAAU,EAAG,EAAU,CAI9B,IAHA,IAAI,EAAQ,GACR,EAAS,MAAM,EAAE,CAEd,EAAE,EAAQ,GACf,EAAO,GAAS,EAAS,EAAM,CAEjC,OAAO,EAGT,EAAO,QAAU,mBCNjB,SAAS,GAAY,CACnB,MAAO,GAGT,EAAO,QAAU,mBCjBjB,IAAI,OACA,OAGA,EAAc,OAAO,GAAW,UAAY,GAAW,CAAC,EAAQ,UAAY,EAG5E,EAAa,GAAe,OAAO,GAAU,UAAY,GAAU,CAAC,EAAO,UAAY,EAMvF,EAHgB,GAAc,EAAW,UAAY,EAG5B,EAAK,OAAS,OAwB3C,EAAO,SArBc,EAAS,EAAO,SAAW,SAmBf,mBCnCjC,IAAI,MACA,OACA,OAGA,EAAU,qBACV,EAAW,iBACX,EAAU,mBACV,EAAU,gBACV,EAAW,iBACX,EAAU,oBACV,EAAS,eACT,EAAY,kBACZ,EAAY,kBACZ,EAAY,kBACZ,EAAS,eACT,EAAY,kBACZ,EAAa,mBAEb,EAAiB,uBACjB,EAAc,oBACd,EAAa,wBACb,EAAa,wBACb,EAAU,qBACV,EAAW,sBACX,EAAW,sBACX,EAAW,sBACX,EAAkB,6BAClB,EAAY,uBACZ,EAAY,uBAGZ,EAAiB,EAAE,CACvB,EAAe,GAAc,EAAe,GAC5C,EAAe,GAAW,EAAe,GACzC,EAAe,GAAY,EAAe,GAC1C,EAAe,GAAmB,EAAe,GACjD,EAAe,GAAa,GAC5B,EAAe,GAAW,EAAe,GACzC,EAAe,GAAkB,EAAe,GAChD,EAAe,GAAe,EAAe,GAC7C,EAAe,GAAY,EAAe,GAC1C,EAAe,GAAU,EAAe,GACxC,EAAe,GAAa,EAAe,GAC3C,EAAe,GAAU,EAAe,GACxC,EAAe,GAAc,GAS7B,SAAS,EAAiB,EAAO,CAC/B,OAAO,EAAa,EAAM,EACxB,EAAS,EAAM,OAAO,EAAI,CAAC,CAAC,EAAe,EAAW,EAAM,EAGhE,EAAO,QAAU,mBCpDjB,SAAS,EAAU,EAAM,CACvB,OAAO,SAAS,EAAO,CACrB,OAAO,EAAK,EAAM,EAItB,EAAO,QAAU,mBCbjB,IAAI,MAGA,EAAc,OAAO,GAAW,UAAY,GAAW,CAAC,EAAQ,UAAY,EAG5E,EAAa,GAAe,OAAO,GAAU,UAAY,GAAU,CAAC,EAAO,UAAY,EAMvF,EAHgB,GAAc,EAAW,UAAY,GAGtB,EAAW,QAiB9C,EAAO,QAdS,UAAW,CACzB,GAAI,CASF,OAPY,GAAc,EAAW,SAAW,EAAW,QAAQ,OAAO,CAAC,OAOpE,GAAe,EAAY,SAAW,EAAY,QAAQ,OAAO,MAC9D,KACX,kBC3BH,IAAI,OACA,OACA,OAGA,EAAmB,GAAY,EAAS,aAqB5C,EAAO,QAFY,EAAmB,EAAU,EAAiB,CAAG,mBCxBpE,IAAI,OACA,MACA,MACA,OACA,OACA,OAMA,EAHc,OAAO,UAGQ,eAUjC,SAAS,EAAc,EAAO,EAAW,CACvC,IAAI,EAAQ,EAAQ,EAAM,CACtB,EAAQ,CAAC,GAAS,EAAY,EAAM,CACpC,EAAS,CAAC,GAAS,CAAC,GAAS,EAAS,EAAM,CAC5C,EAAS,CAAC,GAAS,CAAC,GAAS,CAAC,GAAU,EAAa,EAAM,CAC3D,EAAc,GAAS,GAAS,GAAU,EAC1C,EAAS,EAAc,EAAU,EAAM,OAAQ,OAAO,CAAG,EAAE,CAC3D,EAAS,EAAO,OAEpB,IAAK,IAAI,KAAO,GACT,GAAa,EAAe,KAAK,EAAO,EAAI,GAC7C,EAAE,IAEC,GAAO,UAEN,IAAW,GAAO,UAAY,GAAO,WAErC,IAAW,GAAO,UAAY,GAAO,cAAgB,GAAO,eAE7D,EAAQ,EAAK,EAAO,IAEzB,EAAO,KAAK,EAAI,CAGpB,OAAO,EAGT,EAAO,QAAU,mBC/CjB,IAAI,EAAc,OAAO,UASzB,SAAS,EAAY,EAAO,CAC1B,IAAI,EAAO,GAAS,EAAM,YAG1B,OAAO,KAFM,OAAO,GAAQ,YAAc,EAAK,WAAc,GAK/D,EAAO,QAAU,mBCTjB,SAAS,EAAQ,EAAM,EAAW,CAChC,OAAO,SAAS,EAAK,CACnB,OAAO,EAAK,EAAU,EAAI,CAAC,EAI/B,EAAO,QAAU,mBCTjB,EAAO,QAFH,KAAqB,OAAO,KAAM,OAAO,kBCH7C,IAAI,OACA,OAMA,EAHc,OAAO,UAGQ,eASjC,SAAS,EAAS,EAAQ,CACxB,GAAI,CAAC,EAAY,EAAO,CACtB,OAAO,EAAW,EAAO,CAE3B,IAAI,EAAS,EAAE,CACf,IAAK,IAAI,KAAO,OAAO,EAAO,CACxB,EAAe,KAAK,EAAQ,EAAI,EAAI,GAAO,eAC7C,EAAO,KAAK,EAAI,CAGpB,OAAO,EAGT,EAAO,QAAU,mBC7BjB,IAAI,OACA,OACA,OA8BJ,SAAS,EAAK,EAAQ,CACpB,OAAO,EAAY,EAAO,CAAG,EAAc,EAAO,CAAG,EAAS,EAAO,CAGvE,EAAO,QAAU,mBCpCjB,IAAI,OACA,OAUJ,SAAS,EAAW,EAAQ,EAAU,CACpC,OAAO,GAAU,EAAQ,EAAQ,EAAU,EAAK,CAGlD,EAAO,QAAU,mBCfjB,IAAI,OAUJ,SAAS,EAAe,EAAU,EAAW,CAC3C,OAAO,SAAS,EAAY,EAAU,CACpC,GAAI,GAAc,KAChB,OAAO,EAET,GAAI,CAAC,EAAY,EAAW,CAC1B,OAAO,EAAS,EAAY,EAAS,CAMvC,IAJA,IAAI,EAAS,EAAW,OACpB,EAAQ,EAAY,EAAS,GAC7B,EAAW,OAAO,EAAW,EAEzB,EAAY,IAAU,EAAE,EAAQ,IAClC,EAAS,EAAS,GAAQ,EAAO,EAAS,GAAK,KAIrD,OAAO,GAIX,EAAO,QAAU,mBC/BjB,IAAI,OAaJ,EAAO,QAFH,KAA0B,EAAW,kBCXzC,IAAI,OAaJ,SAAS,EAAe,EAAY,EAAQ,EAAU,EAAa,CAIjE,OAHA,EAAS,EAAY,SAAS,EAAO,EAAK,EAAY,CACpD,EAAO,EAAa,EAAO,EAAS,EAAM,CAAE,EAAW,EACvD,CACK,EAGT,EAAO,QAAU,mBCpBjB,IAAI,OASJ,SAAS,GAAa,CACpB,KAAK,SAAW,IAAI,EACpB,KAAK,KAAO,EAGd,EAAO,QAAU,mBCLjB,SAAS,EAAY,EAAK,CACxB,IAAI,EAAO,KAAK,SACZ,EAAS,EAAK,OAAU,EAAI,CAGhC,MADA,MAAK,KAAO,EAAK,KACV,EAGT,EAAO,QAAU,mBCRjB,SAAS,EAAS,EAAK,CACrB,OAAO,KAAK,SAAS,IAAI,EAAI,CAG/B,EAAO,QAAU,mBCJjB,SAAS,EAAS,EAAK,CACrB,OAAO,KAAK,SAAS,IAAI,EAAI,CAG/B,EAAO,QAAU,mBCbjB,IAAI,OACA,OACA,OAGA,EAAmB,IAYvB,SAAS,EAAS,EAAK,EAAO,CAC5B,IAAI,EAAO,KAAK,SAChB,GAAI,aAAgB,EAAW,CAC7B,IAAI,EAAQ,EAAK,SACjB,GAAI,CAAC,GAAQ,EAAM,OAAS,EAAmB,EAG7C,OAFA,EAAM,KAAK,CAAC,EAAK,EAAM,CAAC,CACxB,KAAK,KAAO,EAAE,EAAK,KACZ,KAET,EAAO,KAAK,SAAW,IAAI,EAAS,EAAM,CAI5C,OAFA,EAAK,IAAI,EAAK,EAAM,CACpB,KAAK,KAAO,EAAK,KACV,KAGT,EAAO,QAAU,mBCjCjB,IAAI,OACA,OACA,OACA,OACA,OACA,OASJ,SAAS,EAAM,EAAS,CAEtB,KAAK,MADM,KAAK,SAAW,IAAI,EAAU,EAAQ,EAChC,KAInB,EAAM,UAAU,MAAQ,EACxB,EAAM,UAAU,OAAY,EAC5B,EAAM,UAAU,IAAM,EACtB,EAAM,UAAU,IAAM,EACtB,EAAM,UAAU,IAAM,EAEtB,EAAO,QAAU,mBChBjB,SAAS,EAAU,EAAO,EAAW,CAInC,IAHA,IAAI,EAAQ,GACR,EAAS,GAAS,KAAO,EAAI,EAAM,OAEhC,EAAE,EAAQ,GACf,GAAI,EAAU,EAAM,GAAQ,EAAO,EAAM,CACvC,MAAO,GAGX,MAAO,GAGT,EAAO,QAAU,mBCtBjB,IAAI,OACA,OACA,OAGA,EAAuB,EACvB,EAAyB,EAe7B,SAAS,EAAY,EAAO,EAAO,EAAS,EAAY,EAAW,EAAO,CACxE,IAAI,EAAY,EAAU,EACtB,EAAY,EAAM,OAClB,EAAY,EAAM,OAEtB,GAAI,GAAa,GAAa,EAAE,GAAa,EAAY,GACvD,MAAO,GAGT,IAAI,EAAa,EAAM,IAAI,EAAM,CAC7B,EAAa,EAAM,IAAI,EAAM,CACjC,GAAI,GAAc,EAChB,OAAO,GAAc,GAAS,GAAc,EAE9C,IAAI,EAAQ,GACR,EAAS,GACT,EAAQ,EAAU,EAA0B,IAAI,EAAW,OAM/D,IAJA,EAAM,IAAI,EAAO,EAAM,CACvB,EAAM,IAAI,EAAO,EAAM,CAGhB,EAAE,EAAQ,GAAW,CAC1B,IAAI,EAAW,EAAM,GACjB,EAAW,EAAM,GAErB,GAAI,EACF,IAAI,EAAW,EACX,EAAW,EAAU,EAAU,EAAO,EAAO,EAAO,EAAM,CAC1D,EAAW,EAAU,EAAU,EAAO,EAAO,EAAO,EAAM,CAEhE,GAAI,IAAa,OAAW,CAC1B,GAAI,EACF,SAEF,EAAS,GACT,MAGF,GAAI,MACE,CAAC,EAAU,EAAO,SAAS,EAAU,EAAU,CAC7C,GAAI,CAAC,EAAS,EAAM,EAAS,GACxB,IAAa,GAAY,EAAU,EAAU,EAAU,EAAS,EAAY,EAAM,EACrF,OAAO,EAAK,KAAK,EAAS,EAE5B,CAAE,CACN,EAAS,GACT,eAEO,EACL,IAAa,GACX,EAAU,EAAU,EAAU,EAAS,EAAY,EAAM,EAC1D,CACL,EAAS,GACT,OAKJ,OAFA,EAAM,OAAU,EAAM,CACtB,EAAM,OAAU,EAAM,CACf,EAGT,EAAO,QAAU,mBC9EjB,EAAO,QAFH,KAAkB,4BCItB,SAAS,EAAW,EAAK,CACvB,IAAI,EAAQ,GACR,EAAS,MAAM,EAAI,KAAK,CAK5B,OAHA,EAAI,QAAQ,SAAS,EAAO,EAAK,CAC/B,EAAO,EAAE,GAAS,CAAC,EAAK,EAAM,EAC9B,CACK,EAGT,EAAO,QAAU,mBCjBjB,IAAI,MACA,OACA,OACA,OACA,OACA,OAGA,EAAuB,EACvB,EAAyB,EAGzB,EAAU,mBACV,EAAU,gBACV,EAAW,iBACX,EAAS,eACT,EAAY,kBACZ,EAAY,kBACZ,EAAS,eACT,EAAY,kBACZ,EAAY,kBAEZ,EAAiB,uBACjB,EAAc,oBAGd,EAAc,EAAS,EAAO,UAAY,OAC1C,EAAgB,EAAc,EAAY,QAAU,OAmBxD,SAAS,EAAW,EAAQ,EAAO,EAAK,EAAS,EAAY,EAAW,EAAO,CAC7E,OAAQ,EAAR,CACE,KAAK,EACH,GAAK,EAAO,YAAc,EAAM,YAC3B,EAAO,YAAc,EAAM,WAC9B,MAAO,GAET,EAAS,EAAO,OAChB,EAAQ,EAAM,OAEhB,KAAK,EAKH,MAJA,EAAK,EAAO,YAAc,EAAM,YAC5B,CAAC,EAAU,IAAI,EAAW,EAAO,CAAE,IAAI,EAAW,EAAM,CAAC,EAK/D,KAAK,EACL,KAAK,EACL,KAAK,EAGH,OAAO,EAAG,CAAC,EAAQ,CAAC,EAAM,CAE5B,KAAK,EACH,OAAO,EAAO,MAAQ,EAAM,MAAQ,EAAO,SAAW,EAAM,QAE9D,KAAK,EACL,KAAK,EAIH,OAAO,GAAW,EAAQ,GAE5B,KAAK,EACH,IAAI,EAAU,EAEhB,KAAK,EACH,IAAI,EAAY,EAAU,EAG1B,GAFA,CAAY,GAAU,EAElB,EAAO,MAAQ,EAAM,MAAQ,CAAC,EAChC,MAAO,GAGT,IAAI,EAAU,EAAM,IAAI,EAAO,CAC/B,GAAI,EACF,OAAO,GAAW,EAEpB,GAAW,EAGX,EAAM,IAAI,EAAQ,EAAM,CACxB,IAAI,EAAS,EAAY,EAAQ,EAAO,CAAE,EAAQ,EAAM,CAAE,EAAS,EAAY,EAAW,EAAM,CAEhG,OADA,EAAM,OAAU,EAAO,CAChB,EAET,KAAK,EACH,GAAI,EACF,OAAO,EAAc,KAAK,EAAO,EAAI,EAAc,KAAK,EAAM,CAGpE,MAAO,GAGT,EAAO,QAAU,mBC/GjB,IAAI,OACA,MAaJ,SAAS,EAAe,EAAQ,EAAU,EAAa,CACrD,IAAI,EAAS,EAAS,EAAO,CAC7B,OAAO,EAAQ,EAAO,CAAG,EAAS,EAAU,EAAQ,EAAY,EAAO,CAAC,CAG1E,EAAO,QAAU,mBCVjB,SAAS,EAAY,EAAO,EAAW,CAMrC,IALA,IAAI,EAAQ,GACR,EAAS,GAAS,KAAO,EAAI,EAAM,OACnC,EAAW,EACX,EAAS,EAAE,CAER,EAAE,EAAQ,GAAQ,CACvB,IAAI,EAAQ,EAAM,GACd,EAAU,EAAO,EAAO,EAAM,GAChC,EAAO,KAAc,GAGzB,OAAO,EAGT,EAAO,QAAU,mBCNjB,SAAS,GAAY,CACnB,MAAO,EAAE,CAGX,EAAO,QAAU,mBCtBjB,IAAI,OACA,OAMA,EAHc,OAAO,UAGc,qBAGnC,EAAmB,OAAO,sBAmB9B,EAAO,QAVW,EAA+B,SAAS,EAAQ,CAKhE,OAJI,GAAU,KACL,EAAE,EAEX,EAAS,OAAO,EAAO,CAChB,EAAY,EAAiB,EAAO,CAAE,SAAS,EAAQ,CAC5D,OAAO,EAAqB,KAAK,EAAQ,EAAO,EAChD,GAPiC,mBCnBrC,IAAI,OACA,OACA,OASJ,SAAS,EAAW,EAAQ,CAC1B,OAAO,EAAe,EAAQ,EAAM,EAAW,CAGjD,EAAO,QAAU,mBCfjB,IAAI,OAGA,EAAuB,EAMvB,EAHc,OAAO,UAGQ,eAejC,SAAS,EAAa,EAAQ,EAAO,EAAS,EAAY,EAAW,EAAO,CAC1E,IAAI,EAAY,EAAU,EACtB,EAAW,EAAW,EAAO,CAC7B,EAAY,EAAS,OAIzB,GAAI,GAHW,EAAW,EAAM,CACP,QAEK,CAAC,EAC7B,MAAO,GAGT,IADA,IAAI,EAAQ,EACL,KAAS,CACd,IAAI,EAAM,EAAS,GACnB,GAAI,EAAE,EAAY,KAAO,EAAQ,EAAe,KAAK,EAAO,EAAI,EAC9D,MAAO,GAIX,IAAI,EAAa,EAAM,IAAI,EAAO,CAC9B,EAAa,EAAM,IAAI,EAAM,CACjC,GAAI,GAAc,EAChB,OAAO,GAAc,GAAS,GAAc,EAE9C,IAAI,EAAS,GACb,EAAM,IAAI,EAAQ,EAAM,CACxB,EAAM,IAAI,EAAO,EAAO,CAGxB,IADA,IAAI,EAAW,EACR,EAAE,EAAQ,GAAW,CAC1B,EAAM,EAAS,GACf,IAAI,EAAW,EAAO,GAClB,EAAW,EAAM,GAErB,GAAI,EACF,IAAI,EAAW,EACX,EAAW,EAAU,EAAU,EAAK,EAAO,EAAQ,EAAM,CACzD,EAAW,EAAU,EAAU,EAAK,EAAQ,EAAO,EAAM,CAG/D,GAAI,EAAE,IAAa,OACV,IAAa,GAAY,EAAU,EAAU,EAAU,EAAS,EAAY,EAAM,CACnF,GACD,CACL,EAAS,GACT,MAEF,CAAa,GAAW,GAAO,cAEjC,GAAI,GAAU,CAAC,EAAU,CACvB,IAAI,EAAU,EAAO,YACjB,EAAU,EAAM,YAGhB,GAAW,GACV,gBAAiB,GAAU,gBAAiB,GAC7C,EAAE,OAAO,GAAW,YAAc,aAAmB,GACnD,OAAO,GAAW,YAAc,aAAmB,KACvD,EAAS,IAKb,OAFA,EAAM,OAAU,EAAO,CACvB,EAAM,OAAU,EAAM,CACf,EAGT,EAAO,QAAU,mBCnFjB,EAAO,QAFH,SAA2B,WAAW,kBCE1C,EAAO,QAFH,SAA0B,UAAU,kBCExC,EAAO,QAFH,SAA0B,UAAU,kBCJxC,IAAI,OACA,OACA,OACA,OACA,OACA,MACA,OAGA,EAAS,eACT,EAAY,kBACZ,EAAa,mBACb,EAAS,eACT,EAAa,mBAEb,EAAc,oBAGd,EAAqB,EAAS,EAAS,CACvC,EAAgB,EAAS,EAAI,CAC7B,EAAoB,EAAS,EAAQ,CACrC,EAAgB,EAAS,EAAI,CAC7B,EAAoB,EAAS,EAAQ,CASrC,EAAS,GAGR,GAAY,EAAO,IAAI,EAAS,IAAI,YAAY,EAAE,CAAC,CAAC,EAAI,GACxD,GAAO,EAAO,IAAI,EAAI,EAAI,GAC1B,GAAW,EAAO,EAAQ,SAAS,CAAC,EAAI,GACxC,GAAO,EAAO,IAAI,EAAI,EAAI,GAC1B,GAAW,EAAO,IAAI,EAAQ,EAAI,KACrC,EAAS,SAAS,EAAO,CACvB,IAAI,EAAS,EAAW,EAAM,CAC1B,EAAO,GAAU,EAAY,EAAM,YAAc,OACjD,EAAa,EAAO,EAAS,EAAK,CAAG,GAEzC,GAAI,EACF,OAAQ,EAAR,CACE,KAAK,EAAoB,OAAO,EAChC,KAAK,EAAe,OAAO,EAC3B,KAAK,EAAmB,OAAO,EAC/B,KAAK,EAAe,OAAO,EAC3B,KAAK,EAAmB,OAAO,EAGnC,OAAO,IAIX,EAAO,QAAU,mBCzDjB,IAAI,OACA,OACA,OACA,OACA,OACA,MACA,OACA,OAGA,EAAuB,EAGvB,EAAU,qBACV,EAAW,iBACX,EAAY,kBAMZ,EAHc,OAAO,UAGQ,eAgBjC,SAAS,EAAgB,EAAQ,EAAO,EAAS,EAAY,EAAW,EAAO,CAC7E,IAAI,EAAW,EAAQ,EAAO,CAC1B,EAAW,EAAQ,EAAM,CACzB,EAAS,EAAW,EAAW,EAAO,EAAO,CAC7C,EAAS,EAAW,EAAW,EAAO,EAAM,CAEhD,EAAS,GAAU,EAAU,EAAY,EACzC,EAAS,GAAU,EAAU,EAAY,EAEzC,IAAI,EAAW,GAAU,EACrB,EAAW,GAAU,EACrB,EAAY,GAAU,EAE1B,GAAI,GAAa,EAAS,EAAO,CAAE,CACjC,GAAI,CAAC,EAAS,EAAM,CAClB,MAAO,GAET,EAAW,GACX,EAAW,GAEb,GAAI,GAAa,CAAC,EAEhB,MADA,CAAU,IAAQ,IAAI,EACd,GAAY,EAAa,EAAO,CACpC,EAAY,EAAQ,EAAO,EAAS,EAAY,EAAW,EAAM,CACjE,EAAW,EAAQ,EAAO,EAAQ,EAAS,EAAY,EAAW,EAAM,CAE9E,GAAI,EAAE,EAAU,GAAuB,CACrC,IAAI,EAAe,GAAY,EAAe,KAAK,EAAQ,cAAc,CACrE,EAAe,GAAY,EAAe,KAAK,EAAO,cAAc,CAExE,GAAI,GAAgB,EAAc,CAChC,IAAI,EAAe,EAAe,EAAO,OAAO,CAAG,EAC/C,EAAe,EAAe,EAAM,OAAO,CAAG,EAGlD,MADA,CAAU,IAAQ,IAAI,EACf,EAAU,EAAc,EAAc,EAAS,EAAY,EAAM,EAO5E,OAJK,GAGL,CAAU,GAAQ,IAAI,EACf,EAAa,EAAQ,EAAO,EAAS,EAAY,EAAW,EAAM,EAHhE,GAMX,EAAO,QAAU,mBClFjB,IAAI,OACA,OAgBJ,SAAS,EAAY,EAAO,EAAO,EAAS,EAAY,EAAO,CAO7D,OANI,IAAU,EACL,GAEL,GAAS,MAAQ,GAAS,MAAS,CAAC,EAAa,EAAM,EAAI,CAAC,EAAa,EAAM,CAC1E,IAAU,GAAS,IAAU,EAE/B,EAAgB,EAAO,EAAO,EAAS,EAAY,EAAa,EAAM,CAG/E,EAAO,QAAU,mBC3BjB,IAAI,OACA,OAGA,EAAuB,EACvB,EAAyB,EAY7B,SAAS,EAAY,EAAQ,EAAQ,EAAW,EAAY,CAC1D,IAAI,EAAQ,EAAU,OAClB,EAAS,EACT,EAAe,CAAC,EAEpB,GAAI,GAAU,KACZ,MAAO,CAAC,EAGV,IADA,EAAS,OAAO,EAAO,CAChB,KAAS,CACd,IAAI,EAAO,EAAU,GACrB,GAAK,GAAgB,EAAK,GAClB,EAAK,KAAO,EAAO,EAAK,IACxB,EAAE,EAAK,KAAM,GAEnB,MAAO,GAGX,KAAO,EAAE,EAAQ,GAAQ,CACvB,EAAO,EAAU,GACjB,IAAI,EAAM,EAAK,GACX,EAAW,EAAO,GAClB,EAAW,EAAK,GAEpB,GAAI,GAAgB,EAAK,OACnB,IAAa,QAAa,EAAE,KAAO,GACrC,MAAO,OAEJ,CACL,IAAI,EAAQ,IAAI,EAChB,GAAI,EACF,IAAI,EAAS,EAAW,EAAU,EAAU,EAAK,EAAQ,EAAQ,EAAM,CAEzE,GAAI,EAAE,IAAW,OACT,EAAY,EAAU,EAAU,EAAuB,EAAwB,EAAY,EAAM,CACjG,GAEN,MAAO,IAIb,MAAO,GAGT,EAAO,QAAU,mBC7DjB,IAAI,MAUJ,SAAS,EAAmB,EAAO,CACjC,OAAO,IAAU,GAAS,CAAC,EAAS,EAAM,CAG5C,EAAO,QAAU,mBCdjB,IAAI,OACA,OASJ,SAAS,EAAa,EAAQ,CAI5B,IAHA,IAAI,EAAS,EAAK,EAAO,CACrB,EAAS,EAAO,OAEb,KAAU,CACf,IAAI,EAAM,EAAO,GACb,EAAQ,EAAO,GAEnB,EAAO,GAAU,CAAC,EAAK,EAAO,EAAmB,EAAM,CAAC,CAE1D,OAAO,EAGT,EAAO,QAAU,mBCdjB,SAAS,EAAwB,EAAK,EAAU,CAC9C,OAAO,SAAS,EAAQ,CAItB,OAHI,GAAU,KACL,GAEF,EAAO,KAAS,IACpB,IAAa,QAAc,KAAO,OAAO,EAAO,GAIvD,EAAO,QAAU,mBCnBjB,IAAI,OACA,OACA,OASJ,SAAS,EAAY,EAAQ,CAC3B,IAAI,EAAY,EAAa,EAAO,CAIpC,OAHI,EAAU,QAAU,GAAK,EAAU,GAAG,GACjC,EAAwB,EAAU,GAAG,GAAI,EAAU,GAAG,GAAG,CAE3D,SAAS,EAAQ,CACtB,OAAO,IAAW,GAAU,EAAY,EAAQ,EAAQ,EAAU,EAItE,EAAO,QAAU,mBCrBjB,IAAI,OACA,OAUJ,SAAS,EAAQ,EAAQ,EAAM,CAC7B,EAAO,EAAS,EAAM,EAAO,CAK7B,IAHA,IAAI,EAAQ,EACR,EAAS,EAAK,OAEX,GAAU,MAAQ,EAAQ,GAC/B,EAAS,EAAO,EAAM,EAAK,KAAS,EAEtC,OAAQ,GAAS,GAAS,EAAU,EAAS,OAG/C,EAAO,QAAU,mBCvBjB,IAAI,OA2BJ,SAAS,EAAI,EAAQ,EAAM,EAAc,CACvC,IAAI,EAAS,GAAU,KAAO,OAAY,EAAQ,EAAQ,EAAK,CAC/D,OAAO,IAAW,OAAY,EAAe,EAG/C,EAAO,QAAU,mBCxBjB,SAAS,EAAU,EAAQ,EAAK,CAC9B,OAAO,GAAU,MAAQ,KAAO,OAAO,EAAO,CAGhD,EAAO,QAAU,mBCZjB,IAAI,OACA,OA4BJ,SAAS,EAAM,EAAQ,EAAM,CAC3B,OAAO,GAAU,MAAQ,EAAQ,EAAQ,EAAM,EAAU,CAG3D,EAAO,QAAU,mBCjCjB,IAAI,OACA,OACA,OACA,MACA,OACA,OACA,OAGA,EAAuB,EACvB,EAAyB,EAU7B,SAAS,EAAoB,EAAM,EAAU,CAI3C,OAHI,EAAM,EAAK,EAAI,EAAmB,EAAS,CACtC,EAAwB,EAAM,EAAK,CAAE,EAAS,CAEhD,SAAS,EAAQ,CACtB,IAAI,EAAW,EAAI,EAAQ,EAAK,CAChC,OAAQ,IAAa,QAAa,IAAa,EAC3C,EAAM,EAAQ,EAAK,CACnB,EAAY,EAAU,EAAU,EAAuB,EAAuB,EAItF,EAAO,QAAU,mBChBjB,SAAS,EAAS,EAAO,CACvB,OAAO,EAGT,EAAO,QAAU,mBCbjB,SAAS,EAAa,EAAK,CACzB,OAAO,SAAS,EAAQ,CACtB,OAAO,IAAoC,IAI/C,EAAO,QAAU,mBCbjB,IAAI,OASJ,SAAS,EAAiB,EAAM,CAC9B,OAAO,SAAS,EAAQ,CACtB,OAAO,EAAQ,EAAQ,EAAK,EAIhC,EAAO,QAAU,mBCfjB,IAAI,OACA,OACA,MACA,OAwBJ,SAAS,EAAS,EAAM,CACtB,OAAO,EAAM,EAAK,CAAG,EAAa,EAAM,EAAK,CAAC,CAAG,EAAiB,EAAK,CAGzE,EAAO,QAAU,mBC/BjB,IAAI,OACA,OACA,OACA,MACA,OASJ,SAAS,EAAa,EAAO,CAc3B,OAXI,OAAO,GAAS,WACX,EAEL,GAAS,KACJ,EAEL,OAAO,GAAS,SACX,EAAQ,EAAM,CACjB,EAAoB,EAAM,GAAI,EAAM,GAAG,CACvC,EAAY,EAAM,CAEjB,EAAS,EAAM,CAGxB,EAAO,QAAU,mBC9BjB,IAAI,OACA,OACA,OACA,MAUJ,SAAS,EAAiB,EAAQ,EAAa,CAC7C,OAAO,SAAS,EAAY,EAAU,CACpC,IAAI,EAAO,EAAQ,EAAW,CAAG,EAAkB,EAC/C,EAAc,EAAc,GAAa,CAAG,EAAE,CAElD,OAAO,EAAK,EAAY,EAAQ,EAAa,EAAU,EAAE,CAAE,EAAY,EAI3E,EAAO,QAAU,qBCtBjB,IAAI,OACA,OAMA,EAHc,OAAO,UAGQ,eAiCjC,EAAO,QARO,EAAiB,SAAS,EAAQ,EAAO,EAAK,CACtD,EAAe,KAAK,EAAQ,EAAI,CAClC,EAAO,GAAK,KAAK,EAAM,CAEvB,EAAgB,EAAQ,EAAK,CAAC,EAAM,CAAC,EAEvC,SC3BF,SAAgB,GAAW,EAAK,EAAkB,EAAY,EAAO,EAAQ,EAAmB,EAAY,EAAY,EAAa,EAAM,EAAc,EAAa,EAAc,EAAc,EAAoB,EAAc,EAAa,EAAQ,EAAO,CAC5P,GAAI,IAAW,QACX,EAAiB,EAAiB,OAAS,KAAO,EAAW,EAAiB,OAAS,GACvF,OACJ,IAAM,EAAY,GAAa,EAAY,CAC3C,GAAY,EAAkB,EAAa,EAAY,EAAY,GAAoB,EAAG,EAAO,EAAU,EAAO,IAAa,CAC3H,GAAI,IAAM,EAAiB,EAAiB,OAAS,GACjD,OACJ,GAAS,EAAE,MACX,IAAM,EAAI,KAAK,IAAI,EAAO,EAAM,CAC5B,EAAI,IAER,EAAI,MAAM,CACV,EAAI,WAAW,CACf,EAAI,KAAK,EAAG,EAAoB,EAAG,IAAO,EAAS,EAAoB,EAAE,CACzE,EAAI,MAAM,CACV,GAAc,EAAU,EAAU,EAAQ,EAAM,EAAc,EAAoB,EAAc,GAAY,EAAO,EAAK,EAAI,IAAa,CACrI,GAAI,CAAC,GACD,EAAY,OAAS,GACrB,CAAC,EAAY,KAAK,GAAM,GAAc,EAAO,EAAO,IAAO,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,MAAO,EAAG,OAAO,CAAC,CAChG,OAEJ,IAAM,EAAc,EAAa,SAAS,EAAI,CACxC,EAAc,EAAa,SAAS,EAAI,CAC9C,EAAI,WAAW,CACf,IAAM,EAAW,IAAc,EAAI,CAC7B,EAAa,IAAa,OAAY,EAAQ,GAAqB,EAAO,EAAS,CACrF,EAAW,SAAW,EAAM,SAC5B,EAAI,UAAY,EAAW,OAC3B,EAAI,SAAS,EAAO,EAAO,IAAO,EAAG,EAErC,IACA,EAAI,UAAY,EAAW,SAC3B,EAAI,SAAS,EAAO,EAAO,IAAO,EAAG,EAErC,IACA,EAAI,UAAY,EAAW,YAC3B,EAAI,SAAS,EAAO,EAAO,IAAO,EAAG,GAE3C,CACF,EAAI,SAAS,GACf,CAEN,SAAgB,GAAyB,EAAK,EAAe,EAAO,EAAQ,EAAoB,EAAM,EAAgB,EAAc,EAAO,CACvI,IAAI,EAAmB,GACvB,IAAK,IAAM,KAAK,EACR,MAAE,OAEN,GAAmB,EAAe,EAAE,YAAY,CAChD,MAEJ,IAAM,EAAS,EAAM,uBAAyB,EAAM,YAC9C,EAAS,EAAM,YACf,EAAQ,EAAmB,EAAe,EAAc,CAAG,EAC7D,EASJ,GARI,IAAU,IACV,EAAU,GAAW,EAAQ,EAAM,OAAO,CAC1C,EAAI,WAAW,CACf,EAAI,OAAO,EAAQ,GAAK,EAAE,CAC1B,EAAI,OAAO,EAAQ,GAAK,EAAO,CAC/B,EAAI,YAAc,EAClB,EAAI,QAAQ,EAEZ,EAAqB,EAAG,CACxB,IAAM,EAAU,IAAW,GAAU,IAAY,OAAY,EAAU,GAAW,EAAQ,EAAM,OAAO,CACjG,EAAI,GAAwB,EAAM,EAAoB,EAAa,CACzE,EAAI,WAAW,CACf,EAAI,OAAO,EAAG,EAAS,EAAI,GAAI,CAC/B,EAAI,OAAO,EAAO,EAAS,EAAI,GAAI,CACnC,EAAI,YAAc,EAClB,EAAI,QAAQ,EAGpB,IAAM,IAAe,EAAa,EAAO,IAAW,CAChD,IAAI,EAAO,EACP,EAAO,EACP,EAAO,EACP,EAAO,EACX,GAAI,IAAgB,QAAa,EAAY,OAAS,EAAG,CACrD,UACA,UACA,EAAO,WACP,EAAO,WACP,IAAK,IAAM,KAAK,EACZ,EAAO,KAAK,IAAI,EAAM,EAAE,EAAI,EAAE,CAC9B,EAAO,KAAK,IAAI,EAAM,EAAE,EAAI,EAAE,MAAQ,EAAE,CACxC,EAAO,KAAK,IAAI,EAAM,EAAE,EAAI,EAAE,CAC9B,EAAO,KAAK,IAAI,EAAM,EAAE,EAAI,EAAE,OAAS,EAAE,CAGjD,MAAO,CAAE,OAAM,OAAM,OAAM,OAAM,EAErC,SAAgB,GAAmB,EAAK,EAAe,EAAa,EAAY,EAAY,EAAO,EAAQ,EAAa,EAAmB,EAAc,EAAqB,EAAgB,EAAoB,EAAM,EAAO,CAC3N,IAAM,EAAS,EAAM,OACf,CAAE,OAAM,OAAM,OAAM,QAAS,GAAY,EAAa,EAAO,EAAO,CACpE,EAAS,EAAE,CACX,EAAU,EAAS,GAAwB,EAAM,EAAoB,EAAa,CAEpF,EAAI,EACJ,EAAM,EACN,EAAkB,EACtB,KAAO,EAAI,EAAa,GAAS,CAC7B,IAAM,EAAK,EAAI,EACT,EAAK,EAAa,EAAI,CAC5B,GAAI,GAAM,GAAQ,GAAM,EAAO,EAAG,CAE9B,IAAM,EADW,IAAsB,EAAI,EACV,OAChB,IAAmB,QAAa,IAAmB,GAAU,GAAO,EAAO,GAExF,EAAO,KAAK,CACR,EAAG,EACH,EAAG,EACH,EAAG,EAAO,EACV,EAAG,EACH,MAAO,EACV,CAAC,CAGV,GAAK,EACD,EAAM,EAAO,IACb,EAAkB,GACtB,IAGJ,IAAI,EAAI,EACF,EAAI,KAAK,IAAI,EAAS,EAAK,CAAG,EACpC,GAAI,EAAI,EACJ,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAc,OAAQ,IAAS,CACvD,IAAM,EAAI,EAAc,GACxB,GAAI,EAAE,QAAU,EACZ,SACJ,IAAM,EAAK,EAAE,OAAS,EAAI,EAAI,EACxB,EAAiB,EAAE,eAAe,OACpC,IAAmB,QACnB,IAAmB,GACnB,GAAM,GACN,GAAM,GACN,EAAe,EAAQ,EAAE,EACzB,EAAO,KAAK,CACR,EAAG,EACH,EAAG,EACH,EAAG,EAAE,MACL,IACA,MAAO,EACV,CAAC,CAEN,GAAK,EAAE,MAGf,GAAI,EAAO,SAAW,EAClB,OACJ,IAAI,EACJ,EAAI,WAAW,CAGf,IAAK,IAAI,EAAI,EAAO,OAAS,EAAG,GAAK,EAAG,IAAK,CACzC,IAAM,EAAI,EAAO,GACb,IAAU,OACV,EAAQ,EAAE,MAEL,EAAE,QAAU,IACjB,EAAI,UAAY,EAChB,EAAI,MAAM,CACV,EAAI,WAAW,CACf,EAAQ,EAAE,OAEd,EAAI,KAAK,EAAE,EAAG,EAAE,EAAG,EAAE,EAAG,EAAE,EAAE,CAE5B,IAAU,SACV,EAAI,UAAY,EAChB,EAAI,MAAM,EAEd,EAAI,WAAW,CAGnB,SAAgB,GAAc,EAAK,EAAe,EAAa,EAAY,EAAY,EAAO,EAAQ,EAAa,EAAO,EAAmB,EAAmB,EAAc,EAAqB,EAAgB,EAAoB,EAAM,EAAO,EAAe,GAAO,CACtQ,GAAI,IAAU,OAAW,CACrB,EAAI,WAAW,CACf,EAAI,MAAM,CACV,EAAI,KAAK,EAAG,EAAG,EAAO,EAAO,CAC7B,IAAK,IAAM,KAAQ,EACf,EAAI,KAAK,EAAK,EAAI,EAAG,EAAK,EAAI,EAAG,EAAK,MAAQ,EAAG,EAAK,OAAS,EAAE,CAErE,EAAI,KAAK,UAAU,CAEvB,IAAM,EAAS,EAAM,uBAAyB,EAAM,YAC9C,EAAS,EAAM,YACf,CAAE,OAAM,OAAM,OAAM,QAAS,GAAY,EAAa,EAAO,EAAO,CACpE,EAAS,EAAE,CACjB,EAAI,WAAW,CAEf,IAAI,EAAI,GACR,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAc,OAAQ,IAAS,CACvD,IAAM,EAAI,EAAc,GACxB,GAAI,EAAE,QAAU,EACZ,SACJ,GAAK,EAAE,MACP,IAAM,EAAK,EAAE,OAAS,EAAI,EAAI,EAC1B,GAAM,GAAQ,GAAM,GAAQ,EAAe,EAAQ,EAAE,EACrD,EAAO,KAAK,CACR,GAAI,EACJ,GAAI,KAAK,IAAI,EAAmB,EAAK,CACrC,GAAI,EACJ,GAAI,KAAK,IAAI,EAAQ,EAAK,CAC1B,MAAO,EACV,CAAC,CAGV,IAAI,EAAU,EAAS,GACvB,IAAK,IAAI,EAAI,EAAO,EAAoB,EAAI,EAAM,IAAK,CACnD,IAAM,EAAK,EAAa,EAAE,CAC1B,GAAW,EACX,EAAO,KAAK,CAAE,GAAI,EAAM,GAAI,EAAS,GAAI,EAAM,GAAI,EAAS,MAAO,EAAQ,CAAC,CAEhF,GAAI,IAAiB,GAAM,CAEvB,IAAI,EAAI,EAAoB,GACxB,EAAM,EACJ,EAAS,EACf,KAAO,EAAI,EAAa,GAAQ,CAC5B,IAAM,EAAK,EAAI,EACf,GAAI,GAAM,GAAQ,GAAM,EAAO,EAAG,CAC9B,IAAM,EAAW,IAAsB,EAAI,CAC3C,EAAO,KAAK,CACR,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,MAAO,GAAU,uBAAyB,GAAU,aAAe,EACtE,CAAC,CAEN,GAAK,EAAa,EAAI,CACtB,KAGR,IAAM,iBAAiB,EAAQ,GAAQ,EAAK,MAAM,CAClD,IAAK,IAAM,KAAK,OAAO,KAAK,EAAO,CAAE,CACjC,EAAI,YAAc,EAClB,IAAK,IAAM,KAAQ,EAAO,GACtB,EAAI,OAAO,EAAK,GAAI,EAAK,GAAG,CAC5B,EAAI,OAAO,EAAK,GAAI,EAAK,GAAG,CAEhC,EAAI,QAAQ,CACZ,EAAI,WAAW,CAEf,IAAU,QACV,EAAI,SAAS,CC3PrB,SAAgB,GAAc,EAAK,EAAY,EAAkB,EAAc,EAAM,EAAa,EAAa,EAAY,EAAY,EAAoB,EAAO,EAAQ,EAAM,EAAmB,EAAK,EAAe,EAAe,EAAc,EAAc,CAC9P,IAAM,EAAc,EAAE,CACtB,EAAI,sBAAwB,GAC5B,IAAM,EAAO,KAAK,IAAI,EAAK,YAAa,EAAY,CAC9C,EAAO,KAAK,IAAI,EAAK,YAAa,EAAY,CAChD,EAAS,EACb,GAAI,OAAO,GAAiB,SACxB,IAAW,EAAO,GAAQ,OAG1B,IAAK,IAAI,EAAI,EAAM,EAAI,EAAM,IACzB,GAAU,EAAa,EAAE,CAG7B,EAAc,EAAK,cACnB,EAAS,CAAC,GAEd,GAAU,EAAa,EAAK,WAC5B,IAAM,EAAO,KAAK,IAAI,EAAK,YAAa,EAAY,CAC9C,EAAO,KAAK,IAAI,EAAK,YAAa,EAAY,CAChD,EAAS,EACb,IAAK,IAAI,EAAI,EAAM,EAAI,EAAM,IACzB,GAAU,EAAc,GAAG,MAE3B,EAAc,EAAK,cACnB,EAAS,CAAC,GAEd,GAAU,EAAa,EAAK,WAC5B,IAAM,EAAc,EAAe,EAAc,CACjD,GAAI,IAAW,GAAK,IAAW,EAC3B,MAAO,CACH,QAAS,EAAE,CACd,CAEL,IAAM,EAA2B,EAAqB,EAAI,GAAwB,EAAM,EAAoB,EAAa,CAAG,EACtH,EAAY,EAAQ,EAAc,KAAK,IAAI,EAAO,CAClD,EAAa,EAAS,EAAoB,EAA2B,KAAK,IAAI,EAAO,CAAG,EAC9F,GAAI,EAAY,KAAO,EAAa,IAAK,CACrC,IAAM,EAAO,CACT,GAAI,EACJ,GAAI,EACJ,GAAI,EAAQ,EACZ,GAAI,EAAS,EACb,GAAI,EACJ,GAAI,EACJ,GAAI,EAAQ,EACZ,GAAI,EAAS,EAChB,CAwDD,GAtDI,EAAS,GAET,EAAK,IAAM,EAAoB,GAAK,EACpC,EAAK,GAAK,EAAa,EACvB,EAAK,IAAM,EAAS,EAAoB,GAAK,EAC7C,EAAK,GAAK,EAAa,EACvB,EAAY,KAAK,CACb,EAAG,EACH,EAAG,EACI,QACP,OAAQ,EAAS,EACpB,CAAC,EAEG,EAAS,IAEd,EAAK,IAAM,CAAC,EAAS,EAAoB,GAAK,EAC9C,EAAK,GAAK,EAAa,EACvB,EAAK,IAAM,EAAoB,GAAK,EACpC,EAAK,GAAK,EAAa,EACvB,EAAY,KAAK,CACb,EAAG,EACH,EAAG,EAAS,EAAS,EACd,QACP,OAAQ,CAAC,EAAS,EACrB,CAAC,EAGF,EAAS,GAET,EAAK,GAAK,EAAc,EACxB,EAAK,GAAK,EAAY,EACtB,EAAK,IAAM,EAAS,GAAe,EACnC,EAAK,GAAK,EAAY,EACtB,EAAY,KAAK,CACb,EAAG,EAAc,EACjB,EAAG,EACH,MAAO,EAAS,EACR,SACX,CAAC,EAEG,EAAS,IAEd,EAAK,IAAM,EAAc,GAAU,EACnC,EAAK,GAAK,EAAY,EACtB,EAAK,GAAK,EAAc,EACxB,EAAK,GAAK,EAAY,EACtB,EAAY,KAAK,CACb,EAAG,EAAQ,EACX,EAAG,EACH,MAAO,CAAC,EACA,SACX,CAAC,EAEN,EAAI,aAAa,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CAC9B,EAAc,CACd,GAAI,EAAc,GACd,IAAW,GACX,IAAW,IACV,IAAiB,QAAa,IAAmB,KAAO,IAAQ,CAGjE,IAAM,EAAI,EAAc,EAClB,EAAI,EAAS,EACnB,EAAI,UAAU,EAAY,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CAErD,GAAI,EAA2B,GAC3B,IAAW,GACX,IAAW,IACV,IAAiB,QAAa,IAAmB,KAAO,IAAQ,CACjE,IAAM,GAAK,EAAS,GAA4B,EAC1C,EAAI,EAAQ,EACZ,EAAI,EAA2B,EACrC,EAAI,UAAU,EAAY,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,EAGzD,EAAI,UAAU,EAAY,EAAK,GAAI,EAAK,GAAI,EAAK,GAAI,EAAK,GAAI,EAAK,GAAI,EAAK,GAAI,EAAK,GAAI,EAAK,GAAG,CACjG,EAAI,MAAM,EAAK,EAAI,CAGvB,MADA,GAAI,sBAAwB,GACrB,CACH,QAAS,EACZ,CAEL,SAAgB,GAAe,EAAM,EAAa,EAAa,EAAY,EAAY,EAAO,EAAQ,EAAmB,EAAe,EAAc,CAClJ,IAAM,EAAc,EAAE,CAoBtB,OAlBI,IAAgB,EAAK,aACrB,IAAgB,EAAK,aACrB,IAAe,EAAK,YACpB,IAAe,EAAK,YAGxB,GAAY,EAAe,EAAa,EAAY,EAAY,GAAoB,EAAG,EAAO,EAAQ,IAAU,CAC5G,GAAI,EAAE,cAAgB,EAAc,CAChC,IAAM,EAAI,KAAK,IAAI,EAAO,EAAM,CAAG,EAOnC,OANA,EAAY,KAAK,CACb,IACA,EAAG,EACH,MAAO,EAAQ,EACf,SACH,CAAC,CACK,KAEb,CAbS,EAgBf,SAAgB,GAAe,EAAS,EAAM,CAG1C,GAFI,IAAS,QAET,EAAQ,QAAU,EAAK,OACvB,EAAQ,SAAW,EAAK,QACxB,EAAQ,QAAU,EAAK,OACvB,EAAQ,eAAiB,EAAK,cAC9B,EAAQ,YAAc,EAAK,WAC3B,EAAQ,OAAS,EAAK,MACtB,EAAQ,gBAAkB,EAAK,eAC/B,EAAQ,sBAAwB,EAAK,qBACrC,EAAQ,YAAc,EAAK,WAC3B,EAAQ,aAAe,EAAK,YAC5B,EAAQ,iBAAmB,EAAK,gBAChC,EAAQ,iBAAmB,EAAK,gBAChC,EAAQ,mBAAqB,EAAK,kBAClC,EAAQ,YAAc,EAAK,WAC3B,EAAQ,mBAAqB,EAAK,kBAClC,EAAQ,gBAAkB,EAAK,eAC/B,EAAQ,YAAc,EAAK,WAC3B,EAAQ,iBAAmB,EAAK,eAChC,MAAO,GAEX,GAAI,EAAQ,gBAAkB,EAAK,cAAe,CAC9C,GAAI,EAAQ,cAAc,OAAS,KAAO,EAAQ,cAAc,SAAW,EAAK,cAAc,OAG1F,MAAO,GAIX,IAAI,EACJ,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,cAAc,OAAQ,IAAK,CACnD,IAAM,EAAS,EAAQ,cAAc,GAC/B,EAAU,EAAK,cAAc,GACnC,GAAI,EAAU,EAAQ,EAAQ,CAC1B,SAIJ,GAFI,IAAY,QAEZ,EAAO,QAAU,EAAQ,MACzB,MAAO,GACX,GAAM,CAAE,QAAO,GAAG,GAAY,EACxB,CAAE,MAAO,EAAW,GAAG,GAAa,EAE1C,GAAI,CAAC,EAAU,EAAS,EAAS,CAC7B,MAAO,GACX,EAAU,EAMd,OAJI,IAAY,OAEL,GAEJ,EAEX,MAAO,GC/MX,SAAgB,GAAmB,EAAK,EAAO,EAAQ,EAAa,EAAa,EAAY,EAAY,EAAe,EAAe,EAAc,EAAmB,EAAW,EAAoB,EAAM,EAAqB,EAAO,CACrO,IAAM,EAAmB,GAAqB,OAAO,GAAK,EAAE,QAAU,aAAa,CACnF,GAAI,IAAqB,QAAa,EAAiB,SAAW,EAC9D,OACJ,IAAM,EAAa,EAAe,EAAc,CAC1C,EAAe,GAAwB,EAAM,EAAoB,EAAU,CAC3E,EAAgB,CAAC,EAAe,EAAG,EAAc,OAAQ,EAAO,EAAmB,CACnF,EAAiB,CAAC,EAAY,EAAG,EAAO,EAAS,EAAa,CAC9D,EAAY,EAAiB,IAAI,GAAK,CACxC,IAAM,EAAI,EAAE,MACN,EAAQ,EAAE,OAAS,SACzB,OAAO,GAAqB,EAAG,EAAe,EAAO,EAAQ,EAAe,CAAC,IAAI,GAAO,CACpF,IAAM,EAAO,EAAI,KACX,EAAgB,GAAc,EAAK,EAAG,EAAK,EAAG,EAAO,EAAQ,EAAmB,EAAe,EAAmB,EAAa,EAAa,EAAY,EAAY,EAAM,EAAe,EAAoB,EAAe,EAAU,CACtO,EAAoB,EAAK,QAAU,GAAK,EAAK,SAAW,EACxD,EACA,GAAc,EAAK,EAAI,EAAK,MAAQ,EAAG,EAAK,EAAI,EAAK,OAAS,EAAG,EAAO,EAAQ,EAAmB,EAAe,EAAmB,EAAa,EAAa,EAAY,EAAY,EAAM,EAAe,EAAoB,EAAe,EAAU,CAO/P,OANI,EAAK,EAAI,EAAK,OAAS,EAAc,QACrC,IAAkB,MAElB,EAAK,EAAI,EAAK,QAAU,GACxB,IAAkB,OAEf,CACH,MAAO,EAAE,MACT,QACA,KAAM,EAAI,KACV,KAAM,GAAgB,CAClB,EAAG,EAAc,EACjB,EAAG,EAAc,EACjB,MAAO,EAAkB,EAAI,EAAkB,MAAQ,EAAc,EACrE,OAAQ,EAAkB,EAAI,EAAkB,OAAS,EAAc,EAC1E,CAAE,EAAO,EAAQ,EAAE,CACvB,EACH,EACJ,CACI,MAAe,CACjB,EAAI,UAAY,EAChB,IAAI,EAAS,GACb,IAAK,IAAM,KAAM,EACb,IAAK,IAAM,KAAK,EACZ,GAAI,GAAG,OAAS,QACZ,GAAc,EAAG,EAAG,EAAO,EAAQ,EAAE,KAAK,EAAG,EAAE,KAAK,EAAG,EAAE,KAAK,MAAO,EAAE,KAAK,OAAO,CAAE,CACrF,IAAM,EAAY,EACZ,EAAY,CAAC,GAAa,EAAE,KAAM,EAAE,KAAK,CAC3C,IACA,EAAI,MAAM,CACV,EAAI,KAAK,EAAE,KAAK,EAAG,EAAE,KAAK,EAAG,EAAE,KAAK,MAAO,EAAE,KAAK,OAAO,CACzD,EAAI,MAAM,EAEV,EAAE,QAAU,UAAY,CAAC,GACzB,EAAI,YAAY,CAAC,EAAG,EAAE,CAAC,CACvB,EAAS,KAEH,EAAE,QAAU,SAAW,EAAE,QAAU,kBAAoB,IAC7D,EAAI,YAAY,EAAE,CAAC,CACnB,EAAS,IAEb,EAAI,YACA,EAAE,QAAU,gBACN,GAAM,GAAM,EAAE,MAAO,EAAM,YAAY,CAAE,EAAM,OAAO,CACtDA,GAAU,EAAE,MAAO,EAAE,CAC/B,EAAI,WAAW,EAAE,KAAK,EAAI,GAAK,EAAE,KAAK,EAAI,GAAK,EAAE,KAAK,MAAQ,EAAG,EAAE,KAAK,OAAS,EAAE,CAC/E,IACA,EAAI,SAAS,CACb,EAAS,GAKrB,GACA,EAAI,YAAY,EAAE,CAAC,EAI3B,OADA,GAAQ,CACD,EAEX,SAAgB,GAAwB,EAAK,EAAS,EAAS,EAAQ,EAAO,CAC1E,EAAI,WAAW,CACf,EAAI,OAAO,EAAS,EAAQ,CAC5B,EAAI,OAAO,EAAS,EAAO,CAC3B,EAAI,UAAY,EAChB,EAAI,YAAc,EAClB,EAAI,QAAQ,CACZ,EAAI,YAAc,EAEtB,SAAgB,GAAe,EAAK,EAAO,EAAQ,EAAa,EAAY,EAAY,EAAe,EAAY,EAAO,EAAmB,EAAc,EAAc,EAAgB,EAAoB,EAAc,EAAY,EAAM,CACzO,GAAI,EAAa,UAAY,OACzB,OACJ,IAAM,EAAQ,EAAa,QAAQ,MAC7B,EAAc,EAAa,QAAQ,KACnC,EAAmB,CAAC,EAAM,EAAI,EAAM,MAAQ,EAAG,EAAM,EAAI,EAAM,OAAS,EAAE,CAKhF,GAHI,EAAY,IAAM,GAAQ,EAAiB,IAAM,GAGjD,CADa,EAAc,KAAK,GAAK,EAAE,cAAgB,EAAY,IAAM,EAAE,cAAgB,EAAiB,GAAG,CAE/G,OACJ,GAAM,CAAC,EAAW,GAAa,EAAa,QAAQ,KAC9C,EAAO,EAAe,EAAa,QAAQ,KAAK,CAChD,EAAgB,EAAK,MAAQ,CAAC,EAAW,EAAU,CACnD,EAAc,GAAa,EAAO,EAClC,EAAiB,EAAqB,GAAK,CAAC,EAC5C,GAAwB,EAAM,EAAoB,EAAa,CAAG,EAClE,EACA,EAAgB,EAAiB,GACnC,EA2CJ,GA1CA,GAAY,EAAe,EAAa,EAAY,EAAY,GAAoB,EAAK,EAAO,EAAU,EAAO,IAAa,CAE1H,GAAI,EAAI,QAAU,EAAY,EAAI,YAC9B,OACJ,IAAM,EAAiB,EAAI,YAAc,EAAc,GACjD,EAAgB,EAAI,YAAc,EAAc,GAChD,EAAkB,EAAI,cAAgB,EAAiB,GACzD,MAAC,IAAoB,GAAkB,IAiC3C,OA7BA,GAAc,EAAU,EAAU,EAAQ,EAAM,EAAc,EAAoB,EAAc,QAAY,EAAO,EAAK,IAAO,CAC3H,GAAI,IAAQ,GAAa,IAAQ,EAC7B,OACJ,IAAI,EAAQ,EACR,EAAY,EAAI,MACpB,GAAI,EAAK,OAAS,OAAW,CACzB,IAAM,EAAQ,GAAc,EAAK,KAAM,EAAO,EAAO,EAAI,MAAO,EAAI,EAAK,EAAW,CAC9E,EAAO,EAAI,OAAS,EAAM,GAAK,EAAM,GACvC,IAAS,SACT,EAAQ,EAAK,EACb,EAAY,EAAK,OAiBzB,OAdiB,IAAQ,GAAiB,GAAmB,IAEzD,MAAqB,CACb,EAAQ,GAAS,CAAC,EAAI,SACtB,EAAI,WAAW,CACf,EAAI,KAAK,EAAO,EAAG,EAAQ,EAAO,EAAO,CACzC,EAAI,MAAM,EAEd,EAAI,WAAW,CACf,EAAI,KAAK,EAAQ,EAAY,EAAG,EAAQ,EAAK,EAAG,EAAG,EAAE,CACrD,EAAI,UAAY,EAAI,eAAe,aAAe,EAAM,YACxD,EAAI,MAAM,GAGX,IAAiB,QAC1B,CACK,IAAiB,QAC1B,CACE,IAAiB,OACjB,OACJ,IAAM,MAAe,CACjB,EAAI,MAAM,CACV,EAAI,WAAW,CACf,EAAI,KAAK,EAAG,EAAmB,EAAO,EAAS,EAAoB,EAAe,CAClF,EAAI,MAAM,CACV,KAAgB,CAChB,EAAI,SAAS,EAGjB,OADA,GAAQ,CACD,EClJX,SAAS,GAAiB,EAAK,EAAkB,EAAO,EAAmB,EAAmB,EAAY,EAAY,EAAa,EAAQ,CACnI,IAAW,QAAa,EAAO,OAAS,IAE5C,EAAI,WAAW,CACf,GAAW,EAAkB,EAAO,EAAY,GAAoB,EAAM,EAAQ,EAAG,EAAG,EAAG,IAAM,CACvE,EAAO,mBAAmB,CAC5C,EAAG,EAAK,GACR,EAAG,GACH,MAAO,EAAK,GAAK,EAAK,GAAK,EAC3B,OAAQ,EACX,CAAC,EAEE,EAAI,KAAK,EAAG,EAAG,EAAG,EAAE,EAE1B,CACF,GAAY,EAAkB,EAAa,EAAY,EAAY,GAAoB,EAAG,EAAO,EAAW,IAAU,CAClH,IAAM,EAAO,KAAK,IAAI,EAAG,EAAQ,EAAM,CACjC,EAAS,EAAQ,EAAO,EACxB,EAAa,EAAE,MAAQ,EAAO,EAChC,EAAO,IAAI,CAAC,EAAE,YAAa,GAAG,CAAC,EAC/B,EAAI,KAAK,EAAQ,EAAmB,EAAY,EAAoB,EAAkB,EAE5F,CACF,EAAI,MAAM,EAEd,SAAS,GAAW,EAAkB,EAAQ,EAAmB,EAAY,EAAY,EAAa,EAAM,EAAc,EAAoB,EAAc,CACxJ,IAAI,EAAS,EASb,OARA,GAAY,EAAkB,EAAa,EAAY,EAAY,GAAoB,EAAI,EAAS,EAAU,EAAQ,KAClH,GAAc,EAAU,EAAU,EAAQ,EAAM,EAAc,EAAoB,EAAc,QAAY,EAAQ,EAAK,EAAK,IAAa,CAClI,IACD,EAAS,KAAK,IAAI,EAAK,EAAO,GAEpC,CACK,IACT,CACK,EAEX,SAAgB,GAAS,EAAK,EAAS,CACnC,GAAM,CAAE,YAAW,kBAAiB,QAAO,SAAQ,cAAa,cAAa,aAAY,aAAY,gBAAe,eAAc,gBAAe,mBAAkB,QAAO,YAAW,eAAc,oBAAmB,eAAc,YAAW,iBAAgB,iBAAgB,aAAY,YAAW,aAAY,qBAAoB,OAAM,iBAAgB,kBAAiB,sBAAqB,YAAW,sBAAoB,iBAAe,oBAAkB,mBAAkB,aAAW,eAAa,eAAc,eAAa,gBAAe,YAAW,iBAAe,kBAAgB,eAAc,YAAW,WAAS,uBAAqB,mBAAiB,kBAAgB,cAAY,cAAY,UAAQ,qBAAsB,EAC9sB,GAAI,IAAU,GAAK,IAAW,EAC1B,OACJ,IAAM,GAAe,KAAmB,gBAClC,EAAM,KAAK,IAAI,GAAgB,KAAK,KAAK,OAAO,kBAAoB,EAAE,CAAC,CAEvE,GAAU,KAAmB,UAAY,GAAe,EAAK,EAAQ,CACrE,GAAS,EAAU,QACrB,GAAO,QAAU,EAAQ,GAAO,GAAO,SAAW,EAAS,KAC3D,GAAO,MAAQ,EAAQ,EACvB,GAAO,OAAS,EAAS,EACzB,GAAO,MAAM,MAAQ,EAAQ,KAC7B,GAAO,MAAM,OAAS,EAAS,MAEnC,IAAM,GAAgB,EAAgB,OAChC,EAAoB,EAAe,EAAoB,EAAe,EACtE,GAAgB,EAAoB,GACtC,GAAc,QAAU,EAAQ,GAAO,GAAc,SAAW,GAAgB,KAChF,GAAc,MAAQ,EAAQ,EAC9B,GAAc,OAAS,GAAgB,EACvC,GAAc,MAAM,MAAQ,EAAQ,KACpC,GAAc,MAAM,OAAS,GAAgB,MAEjD,IAAM,GAAU,GAAW,OACrB,EAAU,GAAW,OACvB,KAAiB,GAAQ,QAAU,EAAQ,GAAO,GAAQ,SAAW,EAAS,KAC9E,GAAQ,MAAQ,EAAQ,EACxB,GAAQ,OAAS,EAAS,EACtB,EAAa,UAAY,SACzB,EAAa,QAAQ,cAAgB,SAEzC,KAAiB,EAAQ,QAAU,EAAQ,GAAO,EAAQ,SAAW,EAAS,KAC9E,EAAQ,MAAQ,EAAQ,EACxB,EAAQ,OAAS,EAAS,EACtB,EAAa,UAAY,SACzB,EAAa,QAAQ,cAAgB,SAE7C,IAAM,EAAO,EAAa,QAC1B,GAAI,KAAY,IACZ,IAAgB,GAAM,aACtB,IAAgB,GAAM,aACtB,IAAe,GAAM,YACrB,IAAe,GAAM,WACrB,OACJ,IAAI,GAAU,KACV,KACA,GAAU,GAEd,IAAM,EAAa,EACf,EACJ,CACI,CADC,GAGI,KAAW,OAIJ,GAAM,aAAe,IAAM,GAAa,GAHxC,GAAM,aAAe,IAAM,GAAa,GAHxC,EAQhB,IAAM,EAAe,EAAU,OACzB,GAAa,GAAgB,IAAiB,GAAU,EAAU,GAAW,GAC7E,GAAe,OAAO,GAAc,aAAiB,EAAY,EACvE,EAAW,MAAM,CACjB,EAAU,MAAM,CAChB,EAAW,WAAW,CACtB,EAAU,WAAW,CACrB,EAAW,aAAe,SAC1B,EAAU,aAAe,SACrB,IAAQ,IACR,EAAW,MAAM,EAAK,EAAI,CAC1B,EAAU,MAAM,EAAK,EAAI,EAE7B,IAAM,EAAgB,GAAoB,EAAe,EAAa,EAAO,EAAkB,EAAW,CACtG,GAAc,EAAE,CACd,GAAwB,GAAa,EAAU,SAAS,KAAK,KAAO,GAAe,IAAe,EACpG,GAAiC,GACrC,GAAI,IAAqB,YAChB,IAAM,KAAK,EACZ,GAAI,EAAE,QAAU,cAAgB,EAAE,MAAM,IAAM,GAAe,IAAe,EAAG,CAC3E,GAAiC,GACjC,OAIZ,IAAM,MAA0B,CAC5B,GAAgB,EAAY,EAAe,EAAc,EAAW,EAAO,EAAY,EAAc,EAAmB,EAAkB,EAAY,EAAW,EAAO,GAAe,GAAa,EAAgB,EAAiB,GAAQ,GAAoB,EAAU,CAC3Q,GAAc,EAAY,EAAe,EAAa,EAAY,EAAY,EAAO,EAAQ,OAAW,OAAW,EAAmB,EAAmB,GAAc,EAAqB,EAAgB,EAAoB,EAAM,EAAO,GAAK,CAClP,EAAW,WAAW,CACtB,EAAW,OAAO,EAAG,GAAgB,GAAI,CACzC,EAAW,OAAO,EAAO,GAAgB,GAAI,CAC7C,EAAW,YAAc,GAAM,EAAM,yBAA2B,EAAM,uBAAyB,EAAM,YAAa,EAAM,SAAS,CACjI,EAAW,QAAQ,CACf,IACA,GAAmB,EAAY,EAAO,EAAQ,EAAa,EAAa,EAAY,EAAY,EAAe,EAAe,EAAc,EAAmB,EAAW,EAAoB,EAAM,EAAkB,EAAM,CAE5N,IACA,GAAe,EAAY,EAAO,EAAQ,EAAa,EAAY,EAAY,EAAe,EAAe,EAAO,EAAmB,EAAW,GAAc,EAAgB,EAAoB,EAAc,EAAY,EAAK,EAI3O,GAAI,KAAW,OAAW,CACtB,IAAM,EAAkB,EAAc,EAAc,OAAS,GAAG,YAAc,EACxE,EAAe,GAAO,gBAAgB,CACxC,CACI,EAAG,EACH,EAAG,GACH,MAAO,EACP,OAAQ,EACX,CACD,CACI,EAAG,EACH,EAAG,EACH,MAAO,EACP,OAAQ,IACX,CACD,CACI,EAAG,EACH,EAAG,EACH,MAAO,EACP,OAAQ,IACX,CACD,CACI,EAAG,EACH,EAAG,GACH,MAAO,EACP,OAAQ,EACX,CACD,CACI,EAAG,EACH,EAAG,EAAO,EACV,MAAO,EACP,OAAQ,EACR,KAAM,EAAqB,EAC9B,CACJ,CAAC,CACI,EAAY,GAAQ,CACtB,GAAU,EAAK,EAAe,EAAe,EAAQ,EAAmB,EAAY,EAAY,EAAa,EAAM,GAAc,EAAgB,EAAiB,EAAqB,EAAc,EAAW,EAAW,EAAoB,EAAc,GAAa,GAAQ,EAAW,GAAe,EAAkB,GAAa,GAAe,GAAa,EAAW,GAAkB,EAAe,EAAO,GAAS,GAAqB,GAAiB,EAAgB,GAAiB,CAC1e,IAAM,EAAmB,EAAU,QAC/B,GACA,GACA,IAAqB,QACrB,GAAO,IAAI,GAAgB,EAAiB,MAAM,CAAC,EACnD,GAAe,EAAK,EAAO,EAAQ,EAAa,EAAY,EAAY,EAAe,EAAe,EAAO,EAAmB,EAAW,GAAc,EAAgB,EAAoB,EAAc,EAAY,EAAK,EAGhO,IACA,EAAS,EAAU,CACf,KAAY,OACZ,GAAQ,MAAM,CACd,GAAQ,MAAM,EAAK,EAAI,CACvB,GAAQ,aAAe,SACvB,EAAS,GAAQ,CACjB,GAAQ,SAAS,EAEH,GAAO,WAAW,GAEhC,GAAiB,EAAY,EAAe,EAAO,EAAmB,EAAmB,EAAY,EAAY,EAAa,GAAO,CACrI,GAAmB,GAG3B,EAAU,SAAS,CACnB,EAAW,SAAS,CACpB,OASJ,IAPI,KAAY,IACZ,IAAgB,GAAM,aACtB,IAAe,GAAM,YACrB,KAA0B,GAAM,uBAChC,KAAmC,GAAM,iCACzC,GAAmB,CAEnB,KAAY,GAAM,CAClB,GAAO,KAAe,QAAa,IAAS,OAAU,CACtD,GAAM,CAAE,WAAY,GAAc,EAAW,GAAY,KAAe,GAAU,EAAK,cAAgB,EAAK,cAAe,KAAe,GAAU,EAAK,cAAgB,EAAK,cAAe,EAAM,EAAa,EAAa,EAAY,EAAY,EAAoB,EAAO,EAAQ,EAAM,EAAmB,EAAK,EAAe,EAAe,EAAW,GAAa,CAC5W,GAAc,OAET,KAAY,KACjB,GAAO,IAAS,OAAU,CAE1B,GAAc,GAAe,EAAM,EAAa,EAAa,EAAY,EAAY,EAAO,EAAQ,EAAmB,EADpG,GAC8H,EAErJ,GAAyB,EAAW,EAAe,EAAO,EAAQ,EAAoB,EAAM,EAAgB,GAAc,EAAM,CAChI,IAAM,GAAkB,GAAmB,EAAW,EAAO,EAAQ,EAAa,EAAa,EAAY,EAAY,EAAe,EAAe,EAAc,EAAmB,EAAW,EAAoB,EAAM,EAAkB,EAAM,CAE7O,GAAc,EACd,GAAe,EAAW,EAAO,EAAQ,EAAa,EAAY,EAAY,EAAe,EAAe,EAAO,EAAmB,EAAW,GAAc,EAAgB,EAAoB,EAAc,EAAY,EAAK,CAClO,OAEN,GADA,EAAU,UAAY,EAAM,OACxB,GAAY,OAAS,EAAG,CACxB,EAAU,WAAW,CACrB,IAAK,IAAM,KAAK,GACZ,EAAU,KAAK,EAAE,EAAG,EAAE,EAAG,EAAE,MAAO,EAAE,OAAO,CAE/C,EAAU,MAAM,CAChB,EAAU,MAAM,CAChB,EAAU,WAAW,MAGrB,EAAU,SAAS,EAAG,EAAG,EAAO,EAAO,CAE3C,IAAM,GAAQ,GAAU,EAAW,EAAe,EAAe,EAAQ,EAAmB,EAAY,EAAY,EAAa,EAAM,GAAc,EAAgB,EAAiB,EAAqB,EAAc,EAAW,EAAW,EAAoB,EAAc,GAAa,GAAQ,EAAW,GAAe,EAAkB,GAAa,GAAe,GAAa,EAAW,GAAkB,EAAe,EAAO,GAAS,GAAqB,GAAiB,EAAgB,GAAiB,CAC9f,GAAW,EAAW,EAAe,EAAe,EAAO,EAAQ,EAAmB,EAAY,EAAY,EAAa,EAAM,GAAc,EAAqB,EAAU,KAAM,EAAc,EAAoB,EAAc,GAAa,GAAQ,EAAM,CAC/P,GAAmB,EAAW,EAAe,EAAa,EAAY,EAAY,EAAO,EAAQ,GAAa,EAAmB,GAAc,EAAqB,EAAgB,EAAoB,EAAM,EAAM,CACpN,GAAc,EAAW,EAAe,EAAa,EAAY,EAAY,EAAO,EAAQ,GAAa,GAAO,EAAmB,EAAmB,GAAc,EAAqB,EAAgB,EAAoB,EAAM,EAAM,CACzO,MAAmB,CACnB,MAAe,CACX,GACA,GAAY,EAAe,EAAG,EAAY,EAAG,GAAoB,EAAG,IAC5D,EAAE,cAAgB,IAClB,GAAwB,EAAY,EAAI,EAAE,MAAO,EAAG,EAAoB,EAAG,GAAM,EAAM,sBAAwB,EAAM,YAAa,EAAM,SAAS,CAAC,CAClJ,GAAwB,EAAW,EAAI,EAAE,MAAO,EAAmB,EAAQ,GAAM,EAAM,sBAAwB,EAAM,YAAa,EAAM,OAAO,CAAC,CACzI,IAEJ,GACT,CAEF,KAAY,OACZ,GAAQ,UAAY,EAAM,OAC1B,GAAQ,SAAS,EAAG,EAAG,EAAO,EAAO,CACrC,GAAQ,UAAU,EAAU,OAAQ,EAAG,EAAE,EAE7C,IAAM,GAAe,GAAW,EAAe,EAAQ,EAAmB,EAAY,EAAY,EAAa,EAAM,GAAc,EAAoB,EAAa,CACpK,IAAa,UAAU,CACnB,EAAG,EACH,EAAG,EACH,MAAO,EAAc,OACrB,OAAQ,GAAe,EAC1B,CAAE,EAAe,MAAM,KAAK,CAAE,OAAQ,EAAoB,EAAG,EAAG,IAAM,EAAO,EAAI,EAAE,CAAC,CACrF,IAAM,GAAU,IAAS,SAAc,IAAgB,EAAK,aAAe,IAAe,EAAK,YACzF,GAAU,IAAS,SAAc,IAAgB,EAAK,aAAe,IAAe,EAAK,YAC/F,EAAa,QAAU,CACnB,cACA,cACA,aACA,aACA,yBACA,kCACA,WAAY,GAAgB,IAAiB,GAAU,IAAM,IAAO,OACpE,cAAe,IAAiB,GAAU,CAAC,GAAS,GAAQ,CAAG,GAAM,cACrE,cAAe,IAAiB,EAAU,CAAC,GAAS,GAAQ,CAAG,GAAM,cACxE,CACD,EAAU,SAAS,CACnB,EAAW,SAAS,kBC7SlB,GAAY,GAClB,SAAS,GAAa,EAAG,CACrB,IAAM,EAAK,EAAI,EACf,OAAO,EAAK,EAAK,EAAK,EAE1B,IAAa,GAAb,KAA8B,CAC1B,SACA,YAAY,EAAU,CAClB,KAAK,SAAW,EAEpB,mBAAqB,OACrB,aAAe,EAAE,CACjB,kBACA,kBAAqB,GAAS,CACD,KAAK,aAAa,KAAK,GAAK,GAAc,EAAE,KAAM,EAAK,KAAK,CAAC,EAItF,KAAK,aAAa,KAAK,EAAK,EAKhC,uBAA0B,GAAS,CAC/B,IAAM,EAAc,KAAK,aAAa,KAAK,GAAK,GAAc,EAAE,KAAM,EAAK,CAAC,CAE5E,MADA,MAAK,aAAe,KAAK,aAAa,OAAO,GAAK,IAAM,EAAY,CAC7D,GAAa,aAAe,GAEvC,2BAA+B,CAC3B,KAAK,aAAe,KAAK,aAAa,OAAO,GAAK,EAAE,YAAc,EAAE,EAExE,eAAmB,CACf,IAAM,EAAkB,KAAK,aAAa,OAAS,EAC7C,EAA4B,KAAK,qBAAuB,QAAa,KAAK,mBAAmB,YAAc,EACjH,OAAO,GAAmB,GAE9B,sBAIQ,KAAK,qBAAuB,OAGzB,KAAK,aAAa,IAAI,IAAM,CAAE,GAAG,EAAG,YAAa,GAAa,EAAE,YAAY,CAAE,EAAE,CAF5E,CAAC,GAAG,KAAK,aAAc,KAAK,mBAAmB,CAI9D,KAAQ,GAAc,CAClB,GAAI,KAAK,oBAAsB,OAC3B,KAAK,kBAAoB,MAExB,CAED,IAAM,GADO,EAAY,KAAK,mBACT,GACrB,IAAK,IAAM,KAAQ,KAAK,aACpB,EAAK,2BAAoB,EAAK,YAAc,EAAO,EAAG,EAAE,CAExD,KAAK,qBAAuB,SAC5B,KAAK,mBAAmB,2BAAoB,KAAK,mBAAmB,YAAc,EAAO,EAAG,EAAE,EAElG,IAAM,EAAY,KAAK,mBAAmB,CAC1C,KAAK,SAAS,EAAU,CACxB,KAAK,wBAAwB,CAE7B,KAAK,YAAY,EACjB,KAAK,kBAAoB,EACzB,OAAO,sBAAsB,KAAK,KAAK,EAGvC,KAAK,kBAAoB,QAGjC,WAAc,GAAS,CACf,GAAc,KAAK,oBAAoB,KAAM,EAAK,GAGlD,KAAK,qBAAuB,QAC5B,KAAK,kBAAkB,KAAK,mBAAmB,CAE/C,IAAS,OAQT,KAAK,mBAAqB,OAN1B,KAAK,mBAAqB,CACtB,OACA,YAHgB,KAAK,uBAAuB,EAAK,CAIpD,CAKD,KAAK,oBAAsB,QAC3B,OAAO,sBAAsB,KAAK,KAAK,IC1F7C,GAAN,KAAW,CACP,GACA,IACA,YAAY,EAAI,CACZ,KAAK,GAAK,EAEd,IAAI,OAAQ,CACR,MAAO,CAAa,KAAK,MAAM,KAAK,IAAI,GAGhD,SAAS,GAAK,EAAI,CACd,OAAO,IAAI,GAAK,EAAG,CAGvB,IAAa,GAAmB,OAAW,OAAO,UAAU,UAAU,SAAS,UAAU,CAAC,CAC7E,GAAkB,OAAW,OAAO,UAAU,UAAU,SAAS,SAAS,EACnF,OAAO,UAAU,UAAU,SAAS,SAAS,EAC7C,CAAC,OAAO,UAAU,UAAU,SAAS,SAAS,CAAC,CACtC,GAAe,OAAW,OAAO,UAAU,SAAS,aAAa,CAAC,WAAW,MAAM,CAAC,CCdjG,SAAgB,GAAkB,EAAM,CACpC,IAAM,IAAc,OAAO,EAAE,CAAC,CACxB,IAAY,OAAO,EAAE,CACrB,IAAgB,OAAO,EAAK,CAClC,EAAQ,QAAU,EAClB,IAAM,IAAa,gBAAkB,CACjC,IAAM,MAAgB,OAAO,sBAAsB,EAAG,CAChD,MAAW,CACb,IAAM,EAAS,EAAM,QAAQ,IAAI,GAAqB,CACtD,EAAM,QAAU,EAAE,CAClB,EAAQ,QAAQ,IAAI,GAAQ,EAAO,CAAC,CAChC,EAAM,QAAQ,OAAS,EACvB,EAAI,UAGJ,EAAI,QAAU,GAGtB,OAAO,sBAAsB,EAAI,QAAU,IAAM,EAAU,EAAG,EAC/D,EAAE,CAAC,CACN,SAAa,YAAa,GAAS,CAC3B,EAAM,QAAQ,SAAW,GACzB,GAAM,CACV,IAAM,EAAS,EAAmB,EAAK,GAAI,EAAK,GAAG,CAC/C,EAAM,QAAQ,SAAS,EAAO,EAElC,EAAM,QAAQ,KAAK,EAAO,EAC3B,CAAC,EAAK,CAAC,CC9Bd,IAAa,GAAa,SAEb,GAAkB,eAElB,GAAkB,gBAEpB,IACV,SAAU,EAAuB,CAC9B,EAAsB,EAAsB,MAAW,IAAM,QAC7D,EAAsB,EAAsB,aAAkB,IAAM,eACpE,EAAsB,EAAsB,OAAY,GAAK,SAC7D,EAAsB,EAAsB,WAAgB,GAAK,aACjE,EAAsB,EAAsB,IAAS,GAAK,QAC3D,EAA0B,GAAwB,EAAE,CAAE,CACzD,SAAgB,GAAuB,EAAM,EAAO,CAUhD,OATI,IAAS,EACF,GACP,GAAM,OAAS,gBACP,GAAM,OAAS,GAAO,MAC1B,GAAM,SAAS,KAAO,GAAO,SAAS,IACtC,GAAM,SAAS,KAAO,GAAO,SAAS,IACtC,GAAM,OAAO,KAAO,GAAO,OAAO,IAClC,GAAM,OAAO,KAAO,GAAO,OAAO,GAElC,GAAM,OAAS,GAAO,MAC1B,GAAM,SAAS,KAAO,GAAO,SAAS,IACtC,GAAM,SAAS,KAAO,GAAO,SAAS,oBCRxC,GAAsB,EACtB,IAAc,EAAM,IAClB,EAAK,OAAS,EAAa,OACpB,EAAK,UACN,IAAkB,EAAK,GACvB,uBAAuB,EAAK,EAAI,GA+mC9C,KAAqB,OAAW,YA7mCd,EAAG,IAAiB,CAClC,GAAM,CAAE,QAAO,SAAQ,sBAAqB,UAAS,YAAa,EAAiB,cAAa,eAAc,aAAa,GAAO,oBAAmB,YAAW,OAAM,iBAAgB,sBAAqB,oBAAmB,eAAc,YAAW,kBAAiB,eAAc,YAAW,YAAW,gBAAe,gBAAe,qBAAoB,eAAe,GAAM,eAAe,GAAM,gBAAe,cAAa,YAAW,iBAAgB,eAAa,iBAAe,oBAAkB,qBAAoB,aAAW,WAAS,oBAAkB,YAAW,eAAa,YAAW,iBAAgB,cAAY,aAAc,GAAW,aAAY,cAAc,GAAO,eAAa,gBAAc,gBAAc,mBAAiB,SAAO,iBAAe,eAAa,kBAAgB,SAAU,EAAkB,WAAY,GAAoB,iBAAe,iBAAgB,UAAQ,cAAa,qBAAmB,gBAAgB,GAAO,iBAAgB,GAAO,gBAAc,mBAAqB,EAC39B,GAAa,EAAE,YAAc,EAC7B,GAAa,EAAE,YAAc,EAC7B,GAAc,KAAK,IAAI,EAAe,KAAK,IAAI,EAAQ,OAAS,EAAG,EAAgB,CAAC,CACpF,IAAY,OAAO,KAAK,CACxB,GAAc,GACd,KAAqB,QAAQ,CAC7B,CAAC,GAAW,MAAsB,SAAS,GAAM,CACjD,KAAoB,OAAO,EAAE,CAAC,CAC9B,KAAqB,QAAQ,CAC7B,CAAC,GAAiB,MAA4B,UAAU,CACxD,CAAC,GAAe,MAA0B,UAAU,CACpD,KAAmB,OAAO,KAAK,CAC/B,CAAC,GAAoB,MAA+B,UAAU,CAC9D,CAAC,GAAc,MAAyB,SAAS,GAAM,CACvD,KAAwB,OAAO,GAAa,CAClD,GAAgB,QAAU,GAC1B,IAAM,KAAsB,YAAc,IAAI,GAAc,OAAmB,CAC3E,GAAY,QAAU,OACtB,GAAY,SAAS,EACvB,CAAE,CAAC,GAAY,CAAC,CACZ,GAAoB,EAAe,EAAoB,EAAe,EACtE,IAAyB,OAAO,GAAG,CACnC,IAA0B,IAAc,wBAA0B,KAAU,GAAiB,MAC7F,IAAyB,IAAc,uBAAyB,KAAU,GAAgB,MAChG,EAAM,oBAAsB,CACpB,OAAO,mBAAqB,GAAM,CAAC,IAA0B,CAAC,KAG9D,EAAiB,UAAY,IAC7B,GAAa,GAAK,CAEtB,OAAO,aAAa,EAAiB,QAAQ,CAC7C,EAAiB,QAAU,OAAO,eAAiB,CAC/C,GAAa,GAAM,CACnB,EAAiB,QAAU,IAC5B,IAAI,GACR,CAAC,EAAa,GAAa,GAAY,GAAY,GAAwB,GAAsB,CAAC,CACrG,IAAM,GAAgB,GAAiB,EAAS,EAAc,CACxD,GAAU,EAAe,EAAe,GAAe,GAAiB,CAAG,EAE3E,KAAyB,aAAa,EAAQ,EAAK,IAAQ,CAC7D,IAAM,EAAO,EAAO,uBAAuB,CAC3C,GAAI,GAAO,GAAc,QAAU,GAAO,EACtC,OAEJ,IAAM,EAAQ,EAAK,MAAQ,EACrB,EAAS,GAAc,EAAK,EAAK,EAAO,EAAQ,EAAmB,GAAmB,GAAa,EAAa,GAAY,GAAY,EAAM,EAAe,EAAoB,GAAe,EAAU,CAShN,OARI,IAAU,IACV,EAAO,GAAK,EACZ,EAAO,GAAK,EACZ,EAAO,OAAS,EAChB,EAAO,QAAU,GAErB,EAAO,GAAK,EAAK,EACjB,EAAO,GAAK,EAAK,EACV,GACR,CACC,EACA,EACA,EACA,GACA,GACA,EACA,GACA,GACA,EACA,EACA,EACA,GACA,EACH,CAAC,CACI,KAAgC,aAAa,EAAQ,EAAM,EAAM,IAAO,CAC1E,IAAM,EAAO,EAAO,uBAAuB,CACrC,EAAQ,EAAK,MAAQ,EACrB,GAAK,EAAO,EAAK,MAAQ,EACzB,GAAK,EAAO,EAAK,KAAO,EAExB,EAAgB,GAAoB,GAAe,GAAa,EAAO,OAAW,GAAW,CAC/F,EAAS,EACT,EAAU,EACV,aAAc,aACd,EAAS,EAAG,OACZ,EAAU,EAAG,SAGjB,IAAM,EAAM,GAAmB,EAAG,EAAe,GAAW,CAGtD,EAAM,GAAgB,EAAG,EAAQ,EAAc,EAAc,EAAmB,EAAM,EAAW,EAAa,GAAY,EAAmB,CAC7I,EAAW,GAAI,WAAa,GAC5B,EAAU,GAAI,UAAY,GAC1B,EAAU,GAAI,UAAY,GAC1B,EAAW,IAAO,QAAa,EAAE,aAAc,aAAgB,GAAI,cAAgB,QACnF,EAAa,CACf,EAAI,EAAI,GAAK,EAAQ,EAAI,EAAI,EAC7B,EAAI,GAAoB,GAAK,EAAS,EAAI,EAAI,EACjD,CACG,EACJ,GAAI,IAAQ,IAAM,EAAI,GAAK,EAAI,GAAK,IAAQ,QAAa,EAAI,GAAS,EAAI,EAAQ,CAC9E,IAAM,EAAa,EAAI,EAAQ,EAAI,EAAI,EAAI,GAAK,EAC1C,EAAW,EAAI,EAAS,EAAI,EAAI,EAAI,GAAK,EAC3C,EAAkB,EAAa,EAC/B,EAAgB,EAAW,EAC3B,IAAe,IACf,EAAkB,IAAQ,GAAK,GAAsB,WAAa,GAAsB,QACxF,IAAa,IACb,EAAgB,IAAQ,OAAY,GAAsB,WAAa,GAAsB,QACjG,IAAI,EAAS,GACb,GAAI,IAAQ,IAAM,IAAQ,GAAI,CAC1B,IAAM,EAAI,GAAiB,EAAQ,GAAc,OAAS,EAAG,GAAG,CAChE,GAAO,IAAM,OAAU,CACvB,EAAS,EAAO,EAAE,EAAI,EAAE,MAAQ,EAKpC,IAAM,EAAoB,EAAI,GAAS,EAAI,EAAQ,IAAmB,EAAM,EAAI,GAAU,EAAI,EAAS,IAAmB,CAC1H,EAAS,CACL,KAAM,GACN,SAAU,CAAC,IAAQ,GAAW,EAAI,EAAI,EAAI,GAAc,OAAS,EAAzC,EAA4C,GAAO,EAAO,EAAE,CACpF,OAAQ,CAAC,EAAiB,EAAc,CACxC,WACA,UACA,UACA,SACA,UACA,SACA,UACA,aACA,mBACH,SAEI,GAAO,GAAI,CAChB,IAAI,EAAS,GAAiB,EAAQ,EAAK,EAAI,CAC/C,GAAO,IAAW,OAAU,CAC5B,IAAI,EAAS,IAAW,QAAa,EAAO,EAAI,EAAO,MAAQ,GAAQ,EACjE,EAAc,EAAM,EACtB,EAAO,EAAO,GAAK,GAAuB,GAAe,GACzD,EAAS,GACT,EAAS,GAAiB,EAAQ,EAAa,EAAI,CACnD,GAAO,IAAW,OAAU,CAC5B,EAAS,CACL,KAAM,GAAgB,IAAQ,GAAK,GAAkB,GACrD,SAAU,CAAC,EAAa,EAAI,CACpB,SACR,MAAO,GAAc,GAAa,OAAS,GAC3C,SACA,WACA,UACA,UACA,UACA,YAAa,EAAO,EAAO,EAC3B,YAAa,EAAO,EAAO,EAC3B,SACA,UACA,aACH,EAGD,EAAS,CACL,KAAM,GAAgB,IAAQ,GAAK,GAAkB,GACrD,MAAO,GAAc,GAAK,OAAS,GACnC,SAAU,CAAC,EAAK,EAAI,CACZ,SACR,SACA,WACA,UACA,UACA,UACA,YAAa,EAAO,EAAO,EAC3B,YAAa,EAAO,EAAO,EAC3B,SACA,UACA,aACH,KAGJ,CACD,IAAM,EAAS,GAAiB,EAAQ,EAAK,EAAI,CACjD,GAAO,IAAW,OAAU,CAC5B,IAAM,EAAS,IAAW,QAAa,EAAO,EAAI,EAAO,MAAQ,EAAO,EACpE,EAAe,GACnB,GAAI,GAAc,EAAU,UAAY,OAAW,CAC/C,IAAM,EAAqB,GAAgB,EAAU,QAAQ,MAAM,CAC7D,EAAuB,GAAiB,EAAQ,EAAmB,GAAI,EAAmB,GAAG,CACnG,GAAI,IAAyB,OAAW,CACpC,IAAM,EAAuB,EAAqB,EAAI,EAAqB,MAAQ,EAC7E,EAAuB,EAAqB,EAAI,EAAqB,OAAS,EAEpF,EACI,KAAK,IAAI,EAAuB,EAAK,CAAG,IACpC,KAAK,IAAI,EAAuB,EAAK,CAAG,IAGxD,EAAS,CACL,KAAM,OACN,SAAU,CAAC,EAAK,EAAI,CACZ,SACR,SACA,WACA,UACA,eACA,UACA,UACA,YAAa,EAAO,EAAO,EAC3B,YAAa,EAAO,EAAO,EAC3B,SACA,UACA,aACH,CAEL,OAAO,GACR,CACC,EACA,GACA,GACA,GACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,EACA,GACA,EACA,EACA,GACH,CAAC,CACI,CAAC,IAAe,IAAmB,EAAE,CACrC,KAAmB,WAAa,GAEpC,CACI,KAAqB,OAAO,GAAgB,CAClD,GAAa,QAAU,GACvB,GAAM,CAAC,GAAY,MAAoB,YAAc,CACjD,IAAM,EAAI,SAAS,cAAc,SAAS,CACpC,EAAI,SAAS,cAAc,SAAS,CAO1C,MANA,GAAE,MAAM,QAAa,OACrB,EAAE,MAAM,QAAa,IACrB,EAAE,MAAM,SAAc,QACtB,EAAE,MAAM,QAAa,OACrB,EAAE,MAAM,QAAa,IACrB,EAAE,MAAM,SAAc,QACf,CAAC,EAAE,WAAW,KAAM,CAAE,MAAO,GAAO,CAAC,CAAE,EAAE,WAAW,KAAM,CAAE,MAAO,GAAO,CAAC,CAAC,EACpF,EAAE,CAAC,CACN,EAAM,oBAAsB,CACpB,UAAe,MAAQ,KAAe,MAI1C,OAFA,SAAS,gBAAgB,OAAO,GAAW,OAAO,CAClD,SAAS,gBAAgB,OAAO,GAAW,OAAO,KACrC,CACT,GAAW,OAAO,QAAQ,CAC1B,GAAW,OAAO,QAAQ,GAE/B,CAAC,GAAY,GAAW,CAAC,CAC5B,IAAM,KAA4B,YAAc,IAAI,GAAuB,EAAE,CAAC,CACxE,GAAS,IAA0B,GAAY,EAAI,IAAyB,GAAY,EAAI,EAC5F,GAAmB,IAAc,0BAA4B,GAAO,EAAI,GACxE,KAAoB,QAAQ,CAC5B,KAAkB,OAAO,KAAK,CAC9B,KAAmB,OAAO,KAAK,CAC/B,KAAa,gBAAkB,CACjC,IAAM,EAAS,EAAI,QACb,EAAU,GAAW,QAa3B,GAZI,IAAW,MAAQ,IAAY,OAE/B,GAAU,UAAY,OACtB,GAAU,QAAU,EAAO,WAAW,KAAM,CAAE,MAAO,GAAO,CAAC,CAC7D,EAAO,MAAQ,EACf,EAAO,OAAS,GAEhB,GAAW,UAAY,OACvB,GAAW,QAAU,EAAQ,WAAW,KAAM,CAAE,MAAO,GAAO,CAAC,CAC/D,EAAQ,MAAQ,EAChB,EAAQ,OAAS,GAEjB,GAAU,UAAY,MAAQ,GAAW,UAAY,MAAQ,KAAe,MAAQ,KAAe,MACnG,OAEJ,IAAI,EAAc,GACZ,EAAkB,GAAW,CAC/B,EAAc,GACd,GAAsB,EAAO,EAE3B,EAAO,GAAY,QACnB,EAAU,CACZ,gBAAiB,GAAW,QAC5B,UAAW,GAAU,QACrB,cACA,cACA,QACA,SACA,eACA,cACA,WAAY,KAAK,MAAM,GAAW,CAClC,WAAY,KAAK,MAAM,GAAW,CAClC,iBACA,eACA,gBACA,oBACA,SACA,eACA,oBACA,aAAc,IAAgB,EAAiB,OAAO,CACtD,YACA,kBACA,cACA,aACA,YACA,YACA,aACA,mBACA,gBACA,iBACA,eAAgB,GAChB,qBACA,OACA,UAAW,EACX,iBACA,gBAAiB,KAAoB,IAAS,CAAE,OAAM,GACtD,sBACA,sBACA,iBACA,oBACA,eACA,gBACA,OAAQ,GAAa,QACrB,YAAa,GAAY,QACzB,UAAW,GAAa,QACxB,iBACA,aACA,cAAe,IAAc,eAAiB,GAC9C,UAAW,GACX,QAAS,GAAW,QACpB,uBACA,eAAgB,IAAc,iBAAmB,GAAgB,MAAQ,gBAAkB,iBAC3F,kBACA,oBACH,CAQG,EAAQ,SAAW,QACnB,GAAY,QAAU,EACtB,GAAS,EAAS,EAAK,EAGvB,GAAS,EAAS,OAAU,CAG5B,CAAC,IAAgB,EAAQ,SAAW,QAAa,EAAQ,OAAO,IAAI,IAAc,UAAU,GAAG,GAC/F,GAAsB,OAAU,EAErC,CACC,GACA,GACA,EACA,EACA,GACA,EACA,GACA,GACA,GACA,EACA,EACA,GACA,GACA,EACA,EACA,GACA,EACA,GACA,GACA,GACA,GACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,EACA,GACA,EACA,EACA,GACA,GACA,GACA,GACA,GACA,GACA,IAAc,cACd,IAAc,eACd,GACA,GACA,EACA,GACH,CAAC,CACI,KAAoB,OAAO,GAAK,CACtC,EAAM,oBAAsB,CACxB,IAAM,CACN,GAAY,QAAU,IACvB,CAAC,GAAK,CAAC,CACV,EAAM,oBAAsB,EACb,SAAY,CACf,UAAU,OAAO,QAAU,SAE/B,MAAM,SAAS,MAAM,MACrB,GAAY,QAAU,OACtB,GAAY,SAAS,KAEhB,EACV,EAAE,CAAC,CACN,IAAM,KAAuB,YAAa,GAAc,CACpD,GAAa,QAAU,EACvB,GAAY,SAAS,CACrB,GAAa,QAAU,QACxB,EAAE,CAAC,CAEN,GAAW,QADK,GAAkB,GAAe,CAEjD,IAAM,KAAe,YAAa,GAAU,CACxC,GAAe,IAAI,GAAQ,EAAM,IAAI,GAAK,EAAE,KAAK,CAAC,CAAC,EACpD,CAAC,GAAe,CAAC,CACpB,GAAY,YAAY,GAAe,CACvC,GAAM,CAAC,GAAU,MAAqB,SAAS,GAAM,CAC/C,CAAC,GAAM,IAAQ,IAAe,EAAE,CAChC,GAAgB,KAAS,QAAa,KAAS,GAC/C,GAAqB,KAAS,QAAa,KAAS,GACtD,GAA4B,GAC5B,GAAsB,GACtB,GAAiB,GACrB,GAAI,KAAmB,QAAa,KAAS,QAAa,KAAS,QAAa,GAAO,IAAM,GAAO,EAAM,CACtG,IAAM,EAAO,EAAe,CAAC,GAAM,GAAK,CAAE,GAAK,CAC/C,GACI,EAAK,OAAS,GAAkB,QAC3B,EAAK,OAAS,GAAkB,QAAU,EAAK,aAAe,SACvE,GAAsB,EAAK,OAAS,EAAa,SAAW,GAAsB,EAAK,CACvF,GAAiB,EAAK,OAG1B,IAAM,GAAS,EACT,YAFU,IAAiB,KAGhB,GACP,aACA,IAAY,EACR,YACA,KAAmB,OAEf,IAAiB,IAA6B,IAAuB,GACjE,UACA,UAHJ,GAIZ,KAAc,aAAe,CAG/B,QAAS,SACT,QAAS,QACT,UACH,EAAG,CAAC,GAAO,CAAC,CACP,KAAsB,OAAO,UAAU,CACvC,GAAS,GAAgB,QAC3B,IAAW,MAAgC,GAAc,UAAY,GAAM,SAE3E,GAAO,MAAM,OAAS,GAAc,QAAU,GAAM,QAExD,IAAM,KAAkC,aAAa,EAAO,EAAQ,EAAa,IAAgB,CAC7F,GAAI,KAAoB,OACpB,OACJ,IAAM,EAAY,GAAgB,EAAM,CACxC,GAAI,EAAU,UAAY,OAAW,CACjC,IAAM,EAAQ,GAAwB,EAAQ,EAAU,QAAQ,CAChE,IAAK,GAAM,CAAC,EAAG,KAAQ,EAAM,SAAS,CAClC,GAAI,GAAY,EAAK,EAAc,EAAO,EAAG,EAAc,EAAI,EAAE,CAC7D,OAAO,EAAU,QAAQ,KAKtC,CAAC,GAAgB,CAAC,CACf,KAAyB,aAAa,EAAQ,EAAK,EAAS,IAAY,CAC1E,IAAM,EAAS,EAAQ,GACvB,GAAI,CAAC,GAAc,CAAC,IAAc,EAAO,UAAY,IAAQ,EAAE,IAAiB,IAAQ,CACpF,IAAM,EAAe,GAAiB,EAAQ,EAAK,GAAG,CACtD,GAAO,IAAiB,OAAU,CAClC,IAAM,EAAa,GAAoB,EAAa,EAAG,EAAa,EAAG,EAAa,MAAO,EAAa,OAAQ,GAAU,EAAO,MAAM,GAAK,MAAM,CAClJ,GAAI,EAAU,EAAW,GACrB,EAAU,EAAW,EAAI,EAAW,OACpC,EAAU,EAAW,GACrB,EAAU,EAAW,EAAI,EAAW,OACpC,OAAO,IAIhB,CAAC,EAAS,GAAkB,GAAe,EAAY,GAAW,CAAC,CAChE,KAAiB,OAAO,EAAE,CAC1B,KAAqB,QAAQ,CAC7B,KAAkB,OAAO,GAAM,CAC/B,KAAwB,YAAa,GAAO,CAC9C,IAAM,EAAS,EAAI,QACb,EAAc,GAAgB,QACpC,GAAI,IAAW,MAAS,EAAG,SAAW,GAAU,EAAG,SAAW,EAC1D,OACJ,GAAU,QAAU,GACpB,IAAI,EACA,EASJ,GARI,aAAc,YACd,EAAU,EAAG,QACb,EAAU,EAAG,UAGb,EAAU,EAAG,QAAQ,GAAG,QACxB,EAAU,EAAG,QAAQ,GAAG,SAExB,EAAG,SAAW,GAAe,IAAgB,KAAM,CACnD,IAAM,EAAS,EAAY,uBAAuB,CAClD,GAAI,EAAU,EAAO,OAAS,EAAU,EAAO,OAC3C,OAER,IAAM,EAAO,GAAwB,EAAQ,EAAS,EAAS,EAAG,CAClE,GAAa,QAAU,EAAK,SACxB,EAAK,UACL,GAAS,QAAU,KAAK,KAAK,EAE7B,GAAgB,UAAY,EAAK,SACjC,GAAgB,EAAK,QAAQ,CAE7B,IAAK,iBACL,GAAiB,EAAQ,EAAK,SAAS,GAAI,EAAS,EAAQ,GAAK,UAG5D,EAAK,uBACK,GAA0B,EAAK,MAAO,EAAK,OAAQ,EAAK,YAAa,EAAK,YAAY,GACtF,SAInB,IAAc,EAAK,CACf,CAAC,EAAK,SACN,IAAgB,IAChB,IAAgB,EAAK,MACrB,EAAK,OAAS,GACd,EAAK,SAAW,GAEhB,EAAG,gBAAgB,IAExB,CAAC,EAAgB,EAAa,GAAyB,GAA2B,GAAkB,EAAY,CAAC,CACpH,GAAiB,aAAc,GAAiB,OAAQ,GAAM,CAC9D,GAAiB,YAAa,GAAiB,OAAQ,GAAM,CAC7D,IAAM,KAAmB,OAAO,EAAE,CAC5B,KAAsB,YAAa,GAAO,CAC5C,IAAM,EAAkB,GAAW,QACnC,GAAW,QAAU,KAAK,KAAK,CAC/B,IAAM,EAAS,EAAI,QAEnB,GADA,GAAU,QAAU,GAChB,IAAc,QAAa,IAAW,KACtC,OACJ,IAAM,EAAc,GAAgB,QAC9B,EAAY,EAAG,SAAW,GAAU,EAAG,SAAW,EACpD,EACA,EACA,EAAY,GAChB,GAAI,aAAc,WAId,IAHA,EAAU,EAAG,QACb,EAAU,EAAG,QACb,EAAY,EAAG,OAAS,EACpB,EAAG,cAAgB,QACnB,YAIJ,EAAU,EAAG,eAAe,GAAG,QAC/B,EAAU,EAAG,eAAe,GAAG,QAEnC,IAAI,EAAO,GAAwB,EAAQ,EAAS,EAAS,EAAG,CAC5D,EAAK,SAAW,GAAS,UAAY,GAAK,KAAK,KAAK,CAAG,GAAS,QAAU,MAC1E,EAAO,CACH,GAAG,EACH,YAAa,GAChB,EAED,IAAoB,GAAK,KAAK,KAAK,CAAG,GAAmB,EAAK,QAAU,IAAO,OAC/E,EAAO,CACH,GAAG,EACH,cAAe,GAClB,EAED,GAAgB,UAAY,EAAK,SACjC,GAAgB,EAAK,QAAQ,CAE7B,CAAC,GAAa,EAAG,YAAc,GAC/B,EAAG,gBAAgB,CAEvB,GAAM,CAAC,GAAO,EAAK,SACb,EAAe,GAAiB,EAAQ,EAAK,EAAS,EAAQ,CACpE,GAAI,EAAK,iBAAuB,IAAiB,OAAW,EACpD,EAAK,SAAW,GAAK,GAAa,UAAU,KAAO,GAAO,GAAa,UAAU,KAAO,KAExF,EAAU,EAAM,GAAK,CAEzB,eAEK,EAAK,sBAA0B,CACpC,IAAM,EAAS,GAA0B,EAAK,MAAO,EAAK,OAAQ,EAAK,YAAa,EAAK,YAAY,CACrG,GAAI,IAAW,OAAW,CAClB,EAAK,SAAW,GAChB,EAAO,QAAQ,EAAK,CAExB,QAGR,EAAU,EAAM,EAAU,EAC3B,CAAC,EAAW,EAAgB,GAAyB,GAAkB,GAA0B,CAAC,CACrG,GAAiB,UAAW,GAAe,OAAQ,GAAM,CACzD,GAAiB,WAAY,GAAe,OAAQ,GAAM,CAwC1D,GAAiB,UAvCS,YAAa,GAAO,CAC1C,IAAM,EAAS,EAAI,QACnB,GAAI,IAAW,KACX,OACJ,IAAM,EAAc,GAAgB,QAC9B,EAAY,EAAG,SAAW,GAAU,EAAG,SAAW,EACpD,EACA,EACA,EAAY,GACZ,aAAc,YACd,EAAU,EAAG,QACb,EAAU,EAAG,QACb,EAAY,EAAG,OAAS,IAGxB,EAAU,EAAG,eAAe,GAAG,QAC/B,EAAU,EAAG,eAAe,GAAG,SAEnC,IAAM,EAAO,GAAwB,EAAQ,EAAS,EAAS,EAAG,CAC9D,GAAgB,UAAY,EAAK,SACjC,GAAgB,EAAK,QAAQ,CAE7B,CAAC,GAAa,EAAG,YAAc,GAC/B,EAAG,gBAAgB,CAEvB,GAAM,CAAC,GAAO,EAAK,SACb,EAAe,GAAiB,EAAQ,EAAK,EAAS,EAAQ,CACpE,GAAI,EAAK,iBAAuB,IAAiB,OACzC,EAAK,SAAW,GAAK,GAAa,UAAU,KAAO,GAAO,GAAa,UAAU,KAAO,IACxF,IAAoB,EAAK,EAAa,SAGrC,EAAK,sBAA0B,CACpC,IAAM,EAAS,GAA0B,EAAK,MAAO,EAAK,OAAQ,EAAK,YAAa,EAAK,YAAY,CACjG,IAAW,QAAa,EAAK,SAAW,GACxC,EAAO,QAAQ,EAAK,GAG7B,CAAC,EAAgB,GAAyB,GAAkB,EAAmB,GAA0B,CAAC,CACtE,OAAQ,GAAM,CAYrD,GAAiB,gBAXe,YAAa,GAAO,CAChD,IAAM,EAAS,EAAI,QACb,EAAc,GAAgB,QAChC,IAAW,MAAS,EAAG,SAAW,GAAU,EAAG,SAAW,GAAgB,IAAkB,QAGhG,EADa,GAAwB,EAAQ,EAAG,QAAS,EAAG,QAAS,EAAG,KAC9C,CAClB,EAAG,YACH,EAAG,gBAAgB,EACzB,EACH,CAAC,EAAgB,GAAyB,EAAc,CAAC,CACT,GAAgB,SAAW,KAAM,GAAM,CAC1F,IAAM,KAAyB,YAAY,GAAU,CACjD,GAAa,QAAU,IAAI,GAAQ,EAAO,IAAI,GAAK,EAAE,KAAK,CAAC,CAC3D,GAAY,QAAU,EACtB,GAAY,SAAS,CACrB,GAAa,QAAU,QACxB,EAAE,CAAC,CACA,KAAyB,YAAc,IAAI,GAAiB,GAAiB,CAAE,CAAC,GAAiB,CAAC,CAClG,KAAyB,OAAO,GAAiB,CACvD,GAAiB,QAAU,GAC3B,EAAM,oBAAsB,CACxB,IAAM,EAAK,GAAiB,QAC5B,GAAI,KAAgB,QAAa,GAAY,GAAK,EAAG,CACjD,EAAG,WAAW,GAAY,CAC1B,OAEJ,IAAM,EAAO,EAAe,GAAa,GAAK,CACxC,EAAI,EAAgB,EAAK,CACzB,EAAkB,IAAM,QAAa,EAAK,OAAS,EAAa,QACjE,GAAG,aAAe,SAAc,OAAO,EAAE,YAAe,UAAY,EAAE,WAAa,EAAE,WAAW,EAAK,EAC1G,EAAG,WAAW,EAAiB,GAAc,OAAU,EACxD,CAAC,EAAgB,EAAiB,GAAY,CAAC,CAClD,IAAM,KAAmB,QAAQ,CAuEjC,GAAiB,cAtEa,YAAa,GAAO,CAC9C,IAAM,EAAS,EAAI,QACnB,GAAI,IAAW,KACX,OACJ,IAAM,EAAc,GAAgB,QAC9B,EAAa,EAAG,SAAW,GAAU,EAAG,SAAW,EACnD,EAAO,GAAwB,EAAQ,EAAG,QAAS,EAAG,QAAS,EAAG,CACxE,GAAI,EAAK,OAAS,iBAAmB,GAAc,CAAC,GAAU,SAAW,CAAC,EAAK,QAG3E,OAIJ,IAAM,GAAuB,EAAQ,IAAiB,CAClD,GAAmB,GACX,IAAO,GAEP,IAAK,GAAG,KAAO,IAAS,GAAG,IAC3B,IAAK,GAAG,KAAO,IAAS,GAAG,KACzB,IAAK,GAAG,KAAO,IAAS,GAAG,IAAM,IAAK,GAAG,KAAO,IAAS,GAAG,IAAO,CAAC,GAC/D,EAEJ,EACT,EAEN,GAAI,CAAC,GAAuB,EAAM,GAAW,QAAQ,CACjD,GAAsB,OAAU,CAChC,KAAgB,EAAK,CACrB,EAAoB,EAAK,uBAA2B,OAAY,CAAC,EAAK,SAAU,CAAC,EAAK,YAAa,EAAK,YAAY,CAAC,CAAE,GAAK,CAC5H,GAAW,QAAU,UAEhB,EAAK,OAAS,QAAU,EAAK,iBAAuB,EAAK,sBAA0B,CACxF,IAAI,EAAkB,GAClB,EAAqB,GACzB,GAAI,EAAK,OAAS,OAAQ,CACtB,IAAM,EAAU,EAAe,EAAK,SAAS,CAI7C,EAHsB,EAAgB,EAAQ,EAAE,oBAGV,EAAQ,OAAS,EAAa,OACpE,EAAkB,OAEb,EAAK,wBACV,EAAkB,IAEtB,IAAM,EAAU,CAAC,EAAK,SAAU,CAAC,EAAK,YAAa,EAAK,YAAY,CAAC,CACrE,EAAoB,EAAS,EAAmB,CAChD,GAAa,QAAU,EACnB,GACA,GAAe,IAAI,GAAQ,CAAC,EAAK,SAAS,CAAC,CAAC,CAGpD,IAAM,EAAkB,EAAK,SAAS,KAAO,EAAqB,EAAI,GACtE,GAAiB,EAAK,iBAAuB,EAAK,QAAU,GAAmB,KAAgB,GAAK,CACpG,GAAY,EAAK,OAAS,QAAU,EAAK,aAAa,CACtD,IAAiB,EAAG,CACpB,GAAY,EAAK,EAClB,CACC,EACA,GACA,EACA,GACA,EACA,GACA,GACA,EACA,EACA,GACH,CAAC,CAC6C,OAAQ,GAAK,CAC5D,IAAM,KAAsB,YAAa,GAAU,CAC/C,IAAM,EAAS,EAAI,QACnB,GAAI,IAAW,KACX,OACJ,IAAI,EACA,EACA,EAAU,UAAY,SACtB,EAAS,GAAiB,EAAQ,EAAU,QAAQ,KAAK,GAAI,EAAU,QAAQ,KAAK,GAAG,CACvF,EAAW,EAAU,QAAQ,MAEjC,KAAY,CACR,SACA,oBAAuB,EAAM,iBAAiB,CAC9C,mBAAsB,EAAM,gBAAgB,CAC5C,WAAc,OACd,QAAS,EAAM,QACf,QAAS,EAAM,QACf,SAAU,EAAM,SAChB,OAAQ,EAAM,OACd,IAAK,EAAM,IACX,QAAS,EAAM,QACf,SAAU,EACV,WACH,CAAC,EACH,CAAC,GAAW,EAAW,GAAiB,CAAC,CACtC,KAAoB,YAAa,GAAU,CAC7C,IAAM,EAAS,EAAI,QACnB,GAAI,IAAW,KACX,OACJ,IAAI,EACA,EACA,EAAU,UAAY,SACtB,EAAS,GAAiB,EAAQ,EAAU,QAAQ,KAAK,GAAI,EAAU,QAAQ,KAAK,GAAG,CACvF,EAAW,EAAU,QAAQ,MAEjC,KAAU,CACN,SACA,oBAAuB,EAAM,iBAAiB,CAC9C,mBAAsB,EAAM,gBAAgB,CAC5C,WAAc,OACd,QAAS,EAAM,QACf,QAAS,EAAM,QACf,SAAU,EAAM,SAChB,OAAQ,EAAM,OACd,IAAK,EAAM,IACX,QAAS,EAAM,QACf,SAAU,EACV,WACH,CAAC,EACH,CAAC,GAAS,EAAW,GAAiB,CAAC,CACpC,KAAgB,YAAa,GAAa,CAC5C,EAAI,QAAU,EACV,IAAc,SACd,EAAU,QAAU,IAEzB,CAAC,EAAU,CAAC,CAgGf,GAAiB,cA/Fa,YAAa,GAAU,CACjD,IAAM,EAAS,EAAI,QACnB,GAAI,IAAW,MAAQ,IAAgB,IAAS,GAAY,CACxD,EAAM,gBAAgB,CACtB,OAEJ,IAAI,EACA,EACE,EAAO,GAAwB,EAAQ,EAAM,QAAS,EAAM,QAAQ,CAC1E,GAAI,IAAgB,IAAQ,EAAK,OAAS,EAAa,CACnD,EAAM,gBAAgB,CACtB,OAEJ,IAAM,GAAW,EAAM,IAAY,CAC/B,EAAW,EACX,EAAW,GAEX,EACA,EACA,EACE,GAAgB,EAAO,EAAG,IAAM,CAClC,EAAY,EACZ,EAAa,EACb,EAAa,GAEb,EAAY,GAQhB,GAPA,KAAc,CACV,GAAG,EACH,UACA,eACA,mBAAuB,EAAY,GACnC,qBAAwB,EAC3B,CAAC,CACE,CAAC,GAAa,IAAa,QAAa,IAAa,QAAa,EAAM,eAAiB,KAGzF,GAFA,EAAM,aAAa,QAAQ,EAAU,EAAS,CAC9C,EAAM,aAAa,cAAgB,WAC/B,IAAc,QAAa,IAAe,QAAa,IAAe,OACtE,EAAM,aAAa,aAAa,EAAW,EAAY,EAAW,KAEjE,CACD,GAAM,CAAC,EAAK,GAAO,EAAK,SACxB,GAAI,IAAQ,OAAW,CACnB,IAAM,EAAY,SAAS,cAAc,SAAS,CAC5C,EAAsB,GAAiB,EAAQ,EAAK,EAAI,CAC9D,GAAO,IAAwB,OAAU,CACzC,IAAM,EAAM,KAAK,KAAK,OAAO,kBAAoB,EAAE,CACnD,EAAU,MAAQ,EAAoB,MAAQ,EAC9C,EAAU,OAAS,EAAoB,OAAS,EAChD,IAAM,EAAM,EAAU,WAAW,KAAK,CAClC,IAAQ,OACR,EAAI,MAAM,EAAK,EAAI,CACnB,EAAI,aAAe,SACf,IAAQ,IACR,EAAI,KAAO,GAAM,eACjB,EAAI,UAAY,GAAM,SACtB,EAAI,SAAS,EAAG,EAAG,EAAU,MAAO,EAAU,OAAO,CACrD,GAAW,EAAK,EAAG,EAAG,EAAoB,MAAO,EAAoB,OAAQ,GAAc,GAAM,GAAO,GAAO,GAAO,GAAO,EAAG,GAAe,GAAoB,GAAM,GAGzK,EAAI,KAAO,GAAM,aACjB,EAAI,UAAY,GAAM,OACtB,EAAI,SAAS,EAAG,EAAG,EAAU,MAAO,EAAU,OAAO,CACrD,GAAS,EAAK,EAAe,CAAC,EAAK,EAAI,CAAC,CAAE,EAAG,EAAK,GAAO,GAAO,EAAG,EAAG,EAAoB,MAAO,EAAoB,OAAQ,GAAO,GAAO,GAAM,OAAQ,GAAa,GAAe,EAAG,OAAW,GAAO,EAAG,OAAW,OAAW,OAAW,GAAqB,MAAuB,OAAU,GAG5S,EAAU,MAAM,KAAO,QACvB,EAAU,MAAM,SAAW,WAC3B,EAAU,MAAM,MAAQ,GAAG,EAAoB,MAAM,IACrD,EAAU,MAAM,OAAS,GAAG,EAAoB,OAAO,IACvD,SAAS,KAAK,OAAO,EAAU,CAC/B,EAAM,aAAa,aAAa,EAAW,EAAoB,MAAQ,EAAG,EAAoB,OAAS,EAAE,CACzG,OAAO,eAAiB,CACpB,EAAU,QAAQ,EACnB,EAAE,OAKb,EAAM,gBAAgB,EAE3B,CACC,EACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,EACA,GACA,GACA,EACH,CAAC,CAC6C,GAAgB,SAAW,KAAM,GAAO,GAAM,CAC7F,IAAM,KAAyB,QAAQ,CAmBvC,GAAiB,aAlBY,YAAa,GAAU,CAChD,IAAM,EAAS,EAAI,QAKnB,GAJI,KAAW,QAEX,EAAM,gBAAgB,CAEtB,IAAW,MAAQ,IAAmB,OACtC,OAGJ,GAAM,CAAC,EAAQ,GADF,GAAwB,EAAQ,EAAM,QAAS,EAAM,QAAQ,CAC/C,SACrB,EAAM,GAAU,EAAqB,EAAI,GACzC,CAAC,EAAW,GAAa,GAAiB,SAAW,EAAE,EACzD,IAAc,GAAO,IAAc,KACnC,GAAiB,QAAU,CAAC,EAAK,EAAI,CACrC,EAAe,CAAC,EAAK,EAAI,CAAE,EAAM,aAAa,GAEnD,CAAC,EAAoB,GAAyB,EAAgB,GAAO,CAAC,CAC5B,GAAgB,SAAW,KAAM,GAAO,GAAM,CAK3F,GAAiB,YAJW,gBAAkB,CAC1C,GAAiB,QAAU,OAC3B,KAAa,EACd,CAAC,EAAU,CAAC,CAC4B,GAAgB,SAAW,KAAM,GAAO,GAAM,CAazF,GAAiB,SAZQ,YAAa,GAAU,CAC5C,IAAM,EAAS,EAAI,QACnB,GAAI,IAAW,MAAQ,KAAW,OAC9B,OAGJ,EAAM,gBAAgB,CAEtB,GAAM,CAAC,EAAQ,GADF,GAAwB,EAAQ,EAAM,QAAS,EAAM,QAAQ,CAC/C,SAE3B,GAAO,CADK,GAAU,EAAqB,EAAI,GAClC,EAAI,CAAE,EAAM,aAAa,EACvC,CAAC,EAAoB,GAAyB,GAAO,CAAC,CACpB,GAAgB,SAAW,KAAM,GAAO,GAAM,CAInF,GAAiB,cAHa,gBAAkB,CAC5C,KAAe,EAChB,CAAC,EAAY,CAAC,CAC8B,GAAgB,SAAW,KAAM,GAAO,GAAM,CAC7F,IAAM,KAAqB,OAAO,EAAU,CAC5C,GAAa,QAAU,EACvB,IAAM,KAAiB,OAAO,KAAK,CAC7B,KAAqB,YAAa,GAAO,CAEvC,EAAI,UAAY,MAAQ,CAAC,EAAI,QAAQ,SAAS,SAAS,cAAc,GAErE,IAAO,MAAQ,GAAa,QAAQ,UAAY,OAChD,GAAW,SAAS,MAAM,CACtB,cAAe,GAClB,CAAC,CAEG,IAAO,MACZ,EAAG,MAAM,CACL,cAAe,GAClB,CAAC,CAEN,GAAS,QAAU,IACpB,CAAC,EAAU,CAAC,CACf,EAAM,oBAAoB,OAAqB,CAC3C,UAAa,CACT,IAAM,EAAK,GAAS,QAKhB,IAAO,MAAQ,CAAC,SAAS,SAAS,EAAG,CACrC,GAAW,SAAS,MAAM,CACtB,cAAe,GAClB,CAAC,CAGF,EAAG,MAAM,CACL,cAAe,GAClB,CAAC,EAGV,WAAY,EAAK,IAAQ,CACjB,SAAc,QAAa,EAAU,UAAY,MAGrD,OAAO,GAAiB,EAAU,QAAS,GAAO,EAAG,GAAO,GAAG,EAEnE,UACH,EAAG,CAAC,EAAW,GAAQ,GAAiB,CAAC,CAC1C,IAAM,KAA8B,QAAQ,CACtC,GAAoB,OAAuB,CAC7C,GAAI,EAAQ,IAAM,IAAc,2BAA6B,GACzD,OAAO,KACX,IAAI,EAAgB,GAAoB,GAAe,GAAa,EAAO,GAAkB,GAAW,CAClG,EAAY,EAAqB,EAAI,GACvC,CAAC,GAAsB,EAAc,IAAI,cAAgB,IACzD,EAAgB,EAAc,MAAM,EAAE,EAE1C,GAAM,CAAC,EAAM,GAAQ,EAAU,SAAS,MAAQ,EAAE,CAC5C,EAAQ,EAAU,SAAS,MAC3B,EAAc,EAAc,IAAI,GAAK,EAAE,YAAY,CACnD,iBAAwB,EAAa,KAAK,IAAI,EAAM,EAAc,EAAoB,CAAC,CAQ7F,OALI,IAAS,QACT,IAAS,QACT,EAAE,EAAY,SAAS,EAAK,EAAI,EAAY,SAAS,EAAK,GAC1D,GAAa,KAAK,CAEtB,EAAc,cAAc,QAAS,CAAE,IAAK,cAAe,KAAM,OAAQ,gBAAiB,EAAO,EAAG,uBAAwB,OAAQ,gBAAiB,GAAc,OAAS,EAAW,GAC7K,cAAc,QAAS,CAAE,KAAM,WAAY,GACvC,cAAc,KAAM,CAAE,KAAM,MAAO,gBAAiB,EAAG,CAAE,EAAc,IAAI,KAAY,cAAc,KAAM,CAAE,KAAM,eAAgB,gBAAiB,EAAU,QAAQ,SAAS,EAAE,YAAY,CAAE,gBAAiB,EAAE,YAAc,EAAI,EAAW,SAAU,GAAI,QAAS,GAAK,CACrQ,KAAE,SAAW,GAAS,QAE1B,OAAO,KAAgB,CAAC,EAAE,YAAa,GAAG,CAAC,EAC5C,IAAK,EAAE,YAAa,CAAE,EAAE,MAAM,CAAE,CAAC,CAAC,GACvC,cAAc,QAAS,CAAE,KAAM,WAAY,CAAE,EAAY,IAAI,KAAc,cAAc,KAAM,CAAE,KAAM,MAAO,gBAAiB,EAAU,KAAK,SAAS,EAAI,CAAE,IAAK,EAAK,gBAAiB,EAAM,EAAG,CAAE,EAAc,IAAI,GAAK,CAC5N,IAAM,EAAM,EAAE,YACR,EAAM,EAAmB,EAAK,EAAI,CAClC,EAAU,IAAS,GAAO,IAAS,EACnC,EAAW,IAAU,QACvB,GAAO,EAAM,GACb,EAAM,EAAM,EAAI,EAAM,OACtB,GAAO,EAAM,GACb,EAAM,EAAM,EAAI,EAAM,OACpB,EAAK,cAAc,EAAI,GAAG,IAC1B,EAAW,CAAC,EAAK,EAAI,CACrB,EAAc,EAAe,EAAU,GAAK,CAClD,SAAc,cAAc,KAAM,CAAO,MAAK,KAAM,WAAY,gBAAiB,EAAM,EAAI,EAAW,gBAAiB,EAAU,gBAAiB,EAAgB,EAAY,EAAI,CAAC,GAAgB,EAAY,CAAM,KAAI,cAAe,EAAI,YAAe,CACnP,IAAM,EAAS,GAAW,QACtB,MAAW,KAEf,OAAO,KAAY,CACf,OAAQ,GAAiB,EAAQ,EAAK,EAAI,CAC1C,WAAc,OACd,mBAAsB,OACtB,oBAAuB,OACvB,QAAS,GACT,IAAK,QACL,QAAS,GACT,QAAS,GACT,SAAU,GACV,OAAQ,GACR,SAAU,OACV,WACH,CAAC,EACH,eAAgB,GAAK,CAChB,OAAE,SAAW,GAAS,SACrB,GAAsB,UAAU,KAAO,GACpC,GAAsB,UAAU,KAAO,GAG/C,MADA,IAAsB,QAAU,EACzB,KAAgB,EAAS,EACjC,IAAK,EAAU,GAAe,OAAW,SAAU,GAAI,CAAE,GAAW,EAAa,EAAgB,CAAC,EAC3G,CAAC,CAAE,CAAC,CAAC,EACZ,CACC,EACA,GACA,GACA,GACA,GACA,EACA,EACA,EACA,EACA,GACA,EACA,EACA,GACA,GACA,GACH,CAAE,IAAI,CACD,GAAW,IAAkB,GAAK,CAAC,EAAe,EAAI,GAAc,EAAgB,iBAAU,CAAC,GAAa,IAAK,EAAG,EAAE,CACtH,GAAkB,CAAC,EAAc,GAAK,GACtC,GAAY,GAAe,cAAU,CAAC,GAAkB,IAAK,EAAG,EAAE,CAAvC,EAC3B,IAAqB,YAAc,CACrC,GAAI,CAAC,IAAY,CAAC,GACd,OAAO,KAEX,IAAM,EAAS,CACX,SAAU,WACV,IAAK,EACL,KAAM,GACN,MAAO,EAAQ,GACP,SACR,QAAS,GACT,cAAe,OACf,WAAa,EAAiC,OAAjB,eAC7B,UAAW,6CACd,CACK,EAAS,CACX,SAAU,WACV,IAAK,GACL,KAAM,EACC,QACC,SACR,QAAS,GACT,cAAe,OACf,WAAa,GAAiC,OAAjB,eAC7B,UAAW,6CACd,CACD,SAAc,gBAAoB,SAAU,KACxC,GAAW,KAAW,cAAc,MAAO,CAAE,GAAI,WAAY,MAAO,EAAQ,CAAC,CAC7E,GAAW,KAAW,cAAc,MAAO,CAAE,GAAI,WAAY,MAAO,EAAQ,CAAC,CAAC,EACnF,CAAC,GAAU,GAAU,GAAS,EAAO,EAAe,GAAmB,EAAQ,GAAc,CAAC,CAC3F,KAAqB,aAAe,CACtC,SAAU,WACV,IAAK,EACL,KAAM,EACT,EAAG,EAAE,CAAC,CACP,SAAc,gBAAoB,SAAU,OAClC,cAAc,SAAU,CAAE,cAAe,mBAAoB,SAAU,EAAG,UAAW,GAAe,QAAS,GAAa,QAAS,EAAiB,OAAQ,EAAc,IAAK,GAAgB,SAAO,CAAE,GAAkB,GAC1N,cAAc,SAAU,CAAE,IAAK,GAAY,MAAO,GAAc,CAAC,CACvE,EAAa,EAE+B,CAAC,CChoCrD,SAAS,GAAiB,EAAQ,EAAO,EAAK,EAAK,CAC/C,qBAAa,KAAK,MAAM,GAAS,EAAO,YAAc,GAAG,CAAE,KAAK,KAAK,EAAI,CAAE,KAAK,MAAM,EAAI,CAAC,CAE/F,IAAM,GAAc,GAAK,CACrB,GAAM,CAAC,EAAiB,KAA4B,UAAU,CACxD,CAAC,EAAW,KAAsB,UAAU,CAC5C,CAAC,EAAS,KAAoB,UAAU,CACxC,CAAC,EAAS,KAAoB,UAAU,CACxC,CAAC,EAAe,KAA0B,SAAS,GAAM,CACzD,CAAC,EAAY,KAAuB,UAAU,CAC9C,CAAC,EAAS,KAAoB,UAAU,CACxC,CAAC,EAAS,KAAoB,UAAU,CACxC,CAAC,EAAe,KAA0B,SAAS,GAAM,CACzD,CAAC,EAAY,KAAuB,UAAU,CAC9C,CAAE,oBAAmB,iBAAgB,gBAAe,iBAAgB,sBAAqB,oBAAmB,UAAS,iBAAgB,iBAAgB,aAAY,eAAa,uBAAqB,eAAa,YAAW,iBAAe,eAAa,cAAe,EACtQ,GAAa,GAAkB,GAAqB,KAAyB,OAC7E,CAAE,WAAS,aAAc,EACzB,EAAkB,EAAU,QAC5B,KAA0B,YAAa,GAAS,CAClD,GAAM,CAAC,EAAK,GAAO,EAAK,SACpB,IAAY,QAAa,IAAY,GAAO,GAAO,IACnD,EAAiB,GAAK,CACtB,EAAW,EAAI,EAEV,IAAY,QAAa,IAAQ,QACtC,EAAiB,GAAK,CACtB,EAAW,KAAK,IAAI,EAAG,EAAI,CAAC,EAGvB,IAAc,QAAa,CAAC,GAAiB,CAAC,GACnD,KAAgB,EAAK,EAE1B,CAAC,EAAS,EAAS,EAAS,GAAe,GAAa,EAAW,EAAe,EAAc,CAAC,CAC9F,GAAa,IAAkB,OAC/B,KAAwB,YAAa,GAAS,CAChD,GAAI,EAAK,SAAW,EAAG,CACnB,GAAM,CAAC,EAAK,GAAO,EAAK,SACxB,GAAI,EAAK,OAAS,iBAAmB,EAAK,QAAU,EAAW,CAC3D,IAAM,EAAS,GAAS,SAAS,UAAU,GAAQ,OAAS,EAAG,GAAG,CAC9D,IAAW,SACX,EAAmB,EAAO,EAAE,CAC5B,EAAa,GAAQ,OAAS,EAAE,UAG/B,EAAK,OAAS,UAAY,GAAO,GAAa,CACnD,IAAM,EAAS,IAAW,QAC1B,GAAI,EAAK,QAAU,GAAa,EAAQ,CACpC,EAAmB,EAAK,OAAO,EAAE,CACjC,EAAa,EAAI,CAEjB,IAAM,EADO,EAAO,uBAAuB,CACxB,MAAQ,EAAO,YAC5B,EAAQ,EAAK,OAAO,MAAQ,EAClC,IAAsB,GAAQ,GAAM,EAAO,EAAK,GAAS,GAAQ,GAAK,YAAc,GAAG,MAElF,EAAK,OAAS,UAAY,KAC/B,EAAc,EAAK,OAAO,EAAE,CAC5B,EAAW,EAAI,OAGd,EAAK,OAAS,QACnB,GAAc,GACd,IAAQ,GACR,IAAQ,QACR,IAAe,SACf,EAAc,EAAK,OAAO,EAAE,CAC5B,EAAW,EAAI,EAGvB,KAAc,EAAK,EACpB,CAAC,GAAa,EAAW,GAAa,EAAY,EAAS,GAAS,GAAY,EAAqB,GAAU,CAAC,CAC7G,IAAiC,aAAa,EAAK,IAAmB,CACpE,GAAiB,GAErB,IAAoB,EAAK,EAAe,EACzC,CAAC,EAAe,EAAe,EAAkB,CAAC,CAC/C,IAA2B,OAAO,GAAG,CACrC,KAAiB,gBAAkB,CACrC,EAAmB,QAAU,GAC7B,EAAW,OAAU,CACrB,EAAW,OAAU,CACrB,EAAc,OAAU,CACxB,EAAiB,GAAM,CACvB,EAAW,OAAU,CACrB,EAAW,OAAU,CACrB,EAAc,OAAU,CACxB,EAAiB,GAAM,CACvB,EAAa,OAAU,CACvB,EAAmB,OAAU,EAC9B,EAAE,CAAC,CACA,KAAsB,aAAa,EAAM,IAAc,CACzD,GAAI,EAAK,SAAW,EAAG,CACnB,GAAI,IAAc,OAAW,CAGzB,GAAI,GAAiB,SAAS,EAAU,GAAK,GACzC,IAAK,IAAM,KAAK,EAAiB,CAC7B,GAAI,IAAM,EACN,SACJ,IAAM,EAAM,GAAQ,GACd,EAAU,GAAiB,EAAK,EAAmB,QAAS,EAAgB,EAAe,CACjG,IAAiB,EAAK,EAAS,EAAG,GAAW,EAAI,YAAc,GAAG,CAG1E,IAAM,EAAK,GAAiB,GAAQ,GAAY,EAAmB,QAAS,EAAgB,EAAe,CAE3G,GADA,IAAoB,GAAQ,GAAY,EAAI,EAAW,GAAM,GAAQ,GAAW,YAAc,GAAG,CAC7F,EAAgB,SAAS,EAAU,CACnC,IAAK,IAAM,KAAK,EAAiB,CAC7B,GAAI,IAAM,EACN,SACJ,IAAM,EAAM,GAAQ,GACd,EAAI,GAAiB,EAAK,EAAmB,QAAS,EAAgB,EAAe,CAC3F,IAAoB,EAAK,EAAG,EAAG,GAAK,EAAI,YAAc,GAAG,EAIrE,IAAU,CACN,IAAY,QAAa,IAAY,QACrC,IAAgB,EAAS,EAAQ,CAEjC,IAAY,QAAa,IAAY,QACrC,IAAa,EAAS,EAAQ,CAGtC,IAAY,EAAM,EAAU,EAC7B,CACC,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,EACA,EACA,EACA,EACA,EACA,GACH,CAAC,CACI,KAAmB,YAAc,CAC/B,SAAY,QAAa,IAAY,SAErC,IAAY,GAEZ,KAAsB,EAAS,EAAQ,GAAK,GAEhD,MAAO,CACH,IAAK,EACL,KAAM,EACT,EACF,CAAC,EAAS,EAAS,GAAoB,CAAC,CACrC,KAAoB,YAAa,GAAU,CAC7C,IAAM,EAAS,IAAW,QAC1B,GAAI,IAAY,QAAa,IAAe,OAC3B,KAAK,IAAI,EAAM,QAAU,EAAW,CACtC,IACP,EAAiB,GAAK,SAGrB,IAAY,QAAa,IAAe,OAChC,KAAK,IAAI,EAAM,QAAU,EAAW,CACtC,IACP,EAAiB,GAAK,SAGrB,IAAc,QAAa,IAAoB,QAAa,EAAQ,CAEzE,IAAM,EADO,EAAO,uBAAuB,CACxB,MAAQ,EAAO,YAC5B,GAAY,EAAM,QAAU,GAAmB,EAC/C,EAAS,GAAQ,GACjB,EAAK,GAAiB,EAAQ,EAAU,EAAgB,EAAe,CAG7E,GAFA,IAAiB,EAAQ,EAAI,EAAW,GAAM,EAAO,YAAc,GAAG,CACtE,EAAmB,QAAU,EACzB,GAAiB,OAAO,GAAK,EAC7B,IAAK,IAAM,KAAK,EAAiB,CAC7B,GAAI,IAAM,EACN,SACJ,IAAM,EAAM,GAAQ,GACd,EAAI,GAAiB,EAAK,EAAmB,QAAS,EAAgB,EAAe,CAC3F,IAAiB,EAAK,EAAG,EAAG,GAAK,EAAI,YAAc,GAAG,IAInE,CACC,EACA,EACA,EACA,EACA,EACA,EACA,GACA,EACA,EACA,EACA,EACA,GACH,CAAC,CACI,KAA8B,aAAa,EAAM,IAAgB,CACnE,GAAI,IAAY,QAAa,IAAY,OACrC,OAAO,EAAe,EAAM,EAAY,CAE5C,GAAI,CAAC,EAAK,GAAO,EAUjB,OATI,IAAQ,EACR,EAAM,GAGF,EAAM,GACN,IACA,GAAO,IACP,GAAO,IAER,EAAe,CAAC,EAAK,EAAI,CAAE,EAAY,EAC/C,CAAC,EAAS,EAAS,EAAe,CAAC,CAChC,KAAwB,YAAY,GAAQ,CAC9C,KAAc,EAAK,CACd,EAAK,kBAAkB,EACxB,IAAU,EAEf,CAAC,GAAU,GAAY,CAAC,CAC3B,SAAc,cAAcC,GAAU,CAAE,oBAAqB,EAAE,oBAAqB,UAAW,EAAE,UAAW,YAAa,EAAE,YAAa,YAAa,EAAE,YAAa,QAAS,EAAE,QAAS,aAAc,EAAE,aAAc,cAAe,EAAE,cAAe,WAAY,EAAE,WAAY,SAAU,EAAE,SAAU,aAAc,EAAE,aAAc,eAAgB,EAAE,eAAgB,aAAc,EAAE,aAAc,WAAY,EAAE,WAAY,mBAAoB,EAAE,mBAAoB,aAAc,EAAE,aAAc,aAAc,EAAE,aAAc,cAAe,EAAE,cAAe,gBAAiB,EAAE,gBAAiB,gBAAiB,EAAE,gBAAiB,oBAAqB,EAAE,oBAAqB,kBAAmB,EAAE,kBAAmB,aAAc,EAAE,aAAc,YAAa,EAAE,YAAa,OAAQ,EAAE,OAAQ,iBAAkB,EAAE,iBAAkB,kBAAmB,EAAE,kBAAmB,aAAc,EAAW,YAAa,EAAE,YAAa,UAAW,EAAE,UAAW,UAAW,EAAE,UAAW,aAAc,EAAE,aAAc,gBAAiB,EAAE,gBAAiB,cAAe,EAAE,cAAe,cAAe,EAAE,cAAe,UAAW,EAAE,UAAW,YAAa,EAAE,YAAa,eAAgB,EAAE,eAAgB,OAAQ,EAAE,OAAQ,UAAW,EAAE,UAAW,QAAS,EAAE,QAAS,YAAa,EAAE,YAAa,cAAe,EAAE,cAAe,UAAW,EAAE,UAAW,KAAM,EAAE,KAAM,UAAW,EAAE,UAAW,cAAe,EAAE,cAAe,cAAe,EAAE,cAAe,MAAO,EAAE,MAAO,mBAAoB,EAAE,mBAAoB,aAAc,EAAE,aAAc,WAAY,EAAE,WAAY,WAAY,EAAE,WAAY,eAAgB,EAAE,eAAgB,MAAO,EAAE,MAAO,eAAgB,GAAuB,WAAY,IAAc,OAAW,kBAAmB,EAA0B,WAAY,EAAe,cAAe,GAAmB,YAAa,GAAiB,YAAa,GAAiB,YAAa,EAAW,UAAW,GAAe,iBAAkB,GAAY,eAAgB,GAAa,IAAK,EAAS,CAAC,EClO/7D,SAAgB,GAAkB,EAAa,CAC3C,IAAM,eAAa,KAAK,CAClB,CAAC,EAAM,kBAAoB,CAC7B,MAAO,IAAc,GACrB,OAAQ,IAAc,GACzB,CAAC,CAiBF,OAhBA,yBAAsB,CAOlB,IAAM,EAAiB,IAAI,OAAO,eANX,GAAW,CAC9B,IAAK,IAAM,KAAS,EAAS,CACzB,GAAM,CAAE,QAAO,UAAY,GAAS,EAAM,aAAgB,EAAE,CAC5D,EAAQ,GAAO,EAAG,QAAU,GAAS,EAAG,SAAW,EAAS,EAAK,CAAE,QAAO,SAAQ,CAAE,GAG5B,CAIhE,OAHI,EAAI,SACJ,EAAe,QAAQ,EAAI,QAAS,OAAU,KAErC,CACT,EAAe,YAAY,GAGhC,CAAC,EAAI,QAAQ,CAAC,CACV,CAAE,MAAK,GAAG,EAAM,CCvB3B,IAAM,IAAoB,EAAW,EAAU,IAAmB,CAC9D,IAAM,eAAe,KAAK,CACpB,eAAoB,KAAK,CACzB,eAA4B,KAAK,CACjC,eAAmB,EAAE,CACrB,eAAqB,EAAS,CACpC,EAAY,QAAU,EACtB,IAAM,EAAW,EAAe,SAChC,mBAAgB,CACZ,IAAM,MAAqB,CACvB,GAAI,EAAW,UAAY,IAAS,IAAa,KAAM,CACnD,IAAM,EAAwB,CAAC,EAAS,WAAY,EAAS,UAAU,CACvE,GAAI,EAAmB,UAAU,KAAO,EAAsB,IAC1D,EAAmB,UAAU,KAAO,EAAsB,GAC1D,GAAI,EAAU,QAAU,GAAI,CAExB,EAAmB,QAAU,KAC7B,EAAW,QAAU,KACrB,YAGA,EAAU,eAId,EAAU,QAAU,EACpB,EAAY,QAAQ,EAAsB,GAAI,EAAsB,GAAG,CACvE,EAAmB,QAAU,EAEjC,EAAM,QAAU,OAAO,WAAW,EAAc,IAAO,IAAI,GAG7D,MAAmB,CACrB,EAAW,QAAU,GACrB,EAAmB,QAAU,KACzB,EAAM,UAAY,OAClB,OAAO,aAAa,EAAM,QAAQ,CAClC,EAAM,QAAU,OAGlB,EAAY,GAAU,CACpB,EAAM,QAAQ,SAAW,IAEzB,EAAW,QAAU,GACrB,EAAU,QAAU,EACpB,EAAM,QAAU,OAAO,WAAW,EAAc,IAAO,IAAI,GAGnE,GAAI,GAAa,IAAa,KAAM,CAChC,IAAM,EAAU,EAGhB,OAFA,EAAQ,iBAAiB,aAAc,EAAW,CAClD,EAAQ,iBAAiB,WAAY,EAAS,KACjC,CACT,EAAQ,oBAAoB,aAAc,EAAW,CACrD,EAAQ,oBAAoB,WAAY,EAAS,CAC7C,EAAM,UAAY,MAClB,OAAO,aAAa,EAAM,QAAQ,IAI/C,CAAC,EAAW,EAAS,CAAC,ECvDvBC,OAA0B,GAAK,EAAE,SAAW,SAAW,OACvD,GAAiCR,EAAO,MAAM,CAAC,CACnD,KAAM,oBACN,MAAO,eACP,UAAW,GACX,KAAM,CACJ,aAAc,CAACQ,IAAM,CAAC,CACvB,CACF,CAAC,CACF,SAAS,GAAkB,EAAO,CAChC,GAAM,CAAC,EAAY,KAAuB,SAAS,GAAM,CACnD,EAAa,OAAO,OAAW,IAAc,KAAO,OACpD,IAAgB,OAAO,EAAE,CAU/B,OATA,GAAiB,eAAoB,gBAAkB,CACrD,OAAO,aAAa,EAAQ,QAAQ,CACpC,EAAc,GAAK,EAClB,EAAE,CAAC,CAAE,EAAY,GAAM,GAAM,CAChC,GAAiB,aAAkB,YAAY,GAAK,CAC9C,EAAE,QAAQ,SAAW,IACvB,EAAQ,QAAU,OAAO,eAAiB,EAAc,GAAM,CAAE,EAAM,GAEvE,CAAC,EAAM,CAAC,CAAE,EAAY,GAAM,GAAM,CAC9B,EAET,IAAa,GAAmB,GAAK,CACnC,GAAM,CACJ,WACA,eACA,eACA,cACA,SACA,YACA,YACA,2BAA2B,GAC3B,gBAAgB,EAChB,eAAe,EACf,eACA,oBACA,wBAAwB,GACxB,YACA,eACE,EACE,EAAU,EAAE,CACZ,EAAqB,GAAmB,QAAU,GAClD,EAAmB,GAAmB,MAAQ,GAC9C,IAAgB,OAAO,EAAE,CACzB,IAAoB,OAAO,EAAE,CAC7B,IAAiB,OAAO,KAAK,CAC7B,EAAM,OAAO,OAAW,IAAc,EAAI,OAAO,iBACjD,IAA2B,OAAO,CACtC,WAAY,EACZ,UAAW,EACX,cAAe,OAChB,CAAC,CACI,IAAqB,OAAO,KAAK,CACjC,EAAa,GAAkB,IAAI,CACnC,CAAC,EAAQ,KAAmB,SAAS,GAAK,CAC1C,IAAkB,OAAO,EAAE,CACjC,EAAM,oBAAsB,CAC1B,GAAI,CAAC,GAAU,GAAc,EAAmB,QAAQ,gBAAkB,OAAW,OACrF,IAAM,EAAK,EAAS,QACpB,GAAI,IAAO,KAAM,OACjB,GAAM,CAAC,EAAI,GAAM,EAAmB,QAAQ,cACxC,IAAO,OAEA,IAAO,SAChB,EAAG,UAAY,GAFf,EAAG,WAAa,EAIlB,EAAmB,QAAQ,cAAgB,QAC1C,CAAC,EAAY,EAAO,CAAC,CACxB,IAAM,IAAiB,aAAa,EAAY,IAAc,CAC5D,IAAM,EAAK,EAAS,QACpB,GAAI,IAAO,KAAM,OACjB,IAAyB,EAAG,UAC5B,IAA2B,EAAG,WAC9B,IAAM,EAAgB,EAAmB,QAAQ,UAC3C,EAAiB,EAAmB,QAAQ,WAC5C,EAAK,EAAa,EAClB,EAAK,EAAY,EACnB,GAAc,IAAO,GAAK,IAAO,IAAM,KAAK,IAAI,EAAG,CAAG,GAAK,KAAK,IAAI,EAAG,CAAG,IAAM,GAA4B,EAAmB,QAAQ,gBAAkB,SAC3J,EAAmB,QAAQ,cAAgB,KAAK,IAAI,EAAG,CAAG,KAAK,IAAI,EAAG,CAAG,CAAC,EAAgB,OAAU,CAAG,CAAC,OAAW,EAAc,EAEnI,IAAM,EAAO,EAAmB,QAAQ,cACxC,EAAa,IAAO,IAAM,EAC1B,EAAY,IAAO,IAAM,EACzB,EAAmB,QAAQ,WAAa,EACxC,EAAmB,QAAQ,UAAY,EACvC,IAAM,EAAS,EAAG,YACZ,EAAU,EAAG,aACb,EAAO,EACP,EAAQ,EAAY,QAAU,EAC9B,EAAmB,EAAG,aAAe,EAE3C,GADA,EAAY,QAAU,EAClB,EAAmB,IAAM,KAAK,IAAI,EAAM,CAAG,KAAQ,IAAS,GAAK,IAAS,IAAqB,EAAe,EAAG,aAAe,EAAG,CACrI,IAAM,EAAO,EAAO,EAEpB,EAAQ,SADY,EAAe,GAAW,EACf,EAE7B,IAAS,SACX,OAAO,aAAa,EAAU,QAAQ,CACtC,EAAU,GAAM,CAChB,EAAU,QAAU,OAAO,eAAiB,EAAU,GAAK,CAAE,IAAI,EAEnE,EAAO,CACL,EAAG,EACH,EAAG,EAAO,EAAQ,QAClB,MAAO,EAAS,EAChB,OAAQ,EAAU,EAClB,aAAc,EAAa,SAAS,aAAe,EACpD,CAAC,EACD,CAAC,EAAe,EAAc,EAAc,EAAQ,EAA0B,EAAW,CAAC,CAC7F,GAAiB,GAAyB,GAAgB,MAAO,EAAU,EAAS,CACpF,IAAM,IAAoB,OAAO,EAAS,CAC1C,EAAY,QAAU,EACtB,IAAM,KAAkB,QAAQ,CAC1B,KAAuB,OAAO,GAAM,CAG1C,EAAM,oBAAsB,CACtB,GAAe,QAAS,GAAU,CAAM,GAAe,QAAU,IACpE,CAAC,EAAU,EAAe,EAAa,CAAC,CAC3C,IAAM,KAAgB,YAAY,GAAY,CAC5C,EAAS,QAAU,EACf,IAAc,SAChB,EAAU,QAAU,IAErB,CAAC,EAAU,CAAC,CACX,EAAM,EACN,GAAI,EAQR,IAPA,EAAQ,OAAW,cAAc,MAAO,CACtC,IAAK,IACL,MAAO,CACL,MAAO,EACP,OAAQ,EACT,CACF,CAAC,CAAC,CACI,GAAI,GAAc,CACvB,IAAM,EAAQ,KAAK,IAAI,IAAS,EAAe,GAAE,CACjD,EAAQ,OAAW,cAAc,MAAO,CACtC,IAAK,IACL,MAAO,CACL,MAAO,EACP,OAAQ,EACT,CACF,CAAC,CAAC,CACH,IAAK,EAEP,GAAM,CACJ,OACA,SACA,UACE,GAAkB,EAAY,CAWlC,OAVI,OAAO,OAAW,MAAgB,GAAU,SAAS,SAAW,GAAU,GAAU,SAAS,QAAU,MACzG,OAAO,eAAiB,EAAY,SAAS,CAAE,EAAE,CACjD,GAAU,QAAU,CAClB,SACA,SACD,GAEE,IAAS,KAAO,IAAM,GAAU,KAAO,EAAG,EAAa,cAAc,MAAO,CAC1E,OACN,CAAC,CACF,EAAa,cAAc,MAAO,CAC3B,OACN,GAAQ,cAAc,GAAmB,CACxC,SAAU,GAAgB,MAC3B,GAAQ,cAAc,MAAO,CAC5B,UAAW,eACZ,CAAE,EAAS,GAAQ,cAAc,MAAO,CACvC,IAAK,GACL,MAAO,GAAU,QACN,YACX,YAAa,GAAK,CACX,IACH,EAAE,iBAAiB,CACnB,EAAE,gBAAgB,GAGtB,UAAW,iBAAmB,GAAa,IAC3C,aAAgB,GAAU,CAC3B,GAAQ,cAAc,MAAO,CAC5B,UAAW,oBAAsB,IAAiB,OAAY,cAAgB,IAC/E,GAAQ,cAAc,MAAO,CAC5B,UAAW,YACZ,CAAE,EAAQ,CAAE,IAAiB,UAAmB,gBAAoB,SAAU,KAAM,CAAC,KAA0B,cAAc,MAAO,CACnI,UAAW,aACZ,CAAC,GAAQ,cAAc,MAAO,CAC7B,IAAK,EACL,MAAO,CACL,SACA,UAAW,EAAe,KAAK,KAAK,EAAM,EAAE,CAC5C,SAAU,SACV,IAAK,EACL,YAAa,EACb,aAAc,IACd,YAAa,EACb,SAAU,EAAmB,EAAI,OACjC,MAAO,EAAqB,GAAgB,EAAI,OAChD,cAAe,OAChB,CACF,CAAE,EAAa,CAAC,CAAC,CAAC,CAAC,CAAC,EC3MjB,GAAe,GAAK,CACtB,GAAM,CAAE,UAAS,OAAM,YAAW,eAAc,oBAAmB,eAAc,gBAAe,eAAc,eAAc,aAAY,YAAW,yBAAwB,YAAW,2BAA0B,eAAc,oBAAmB,cAAa,cAAa,cAAa,gBAAgB,GAAO,gBAAgB,GAAO,eAAiB,EACjV,CAAE,eAAc,iBAAkB,GAAgB,EAAE,CACpD,CAAC,EAAa,GAAgB,EAC9B,IAAa,QAAQ,CACrB,IAAc,QAAQ,CACtB,IAAc,QAAQ,CACtB,IAAiB,QAAQ,CACzB,GAAQ,EAAe,KAAK,IAAI,EAAG,GAAe,EAAE,CACtD,GAAS,EAAe,EAAe,EAAoB,EAC/D,GAAI,OAAO,GAAc,SACrB,IAAU,EAAO,OAGjB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,IACtB,IAAU,EAAU,EAAE,CAG1B,IAAgB,SAChB,IAAU,GAEd,IAAM,KAAiB,QAAQ,CACzB,IAAoB,gBAAkB,CACxC,GAAI,GAAS,UAAY,OACrB,OACJ,IAAM,EAAO,CAAE,GAAG,GAAS,QAAS,CAChC,EAAI,EACJ,EAAK,EAAK,EAAI,EAAI,CAAC,EAAK,EAAI,EAC5B,EAAY,EACZ,EAAQ,EACZ,EAAK,EAAI,EAAK,EAAI,EAAI,EAAI,EAAK,EAC/B,IAAI,EAAiB,EACrB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAe,IAC/B,GAAkB,EAAQ,GAAG,MAEjC,IAAK,IAAM,KAAK,EAAS,CACrB,IAAM,EAAK,EAAI,EACf,GAAI,EAAK,GAAK,EAAK,EAAE,MACjB,GAAK,EAAE,MACP,IACA,YAEK,EAAK,EAAI,EACd,GAAK,EAAE,MACH,EACA,GAAM,EAAK,EAAK,EAGhB,IAEJ,YAEK,EAAK,EAAI,EAAK,MAAQ,EAC3B,GAAK,EAAE,MACP,SAGA,MAGR,IAAI,EAAK,EACL,EAAQ,EACR,EAAa,EACjB,GAAI,OAAO,GAAc,SACjB,GACA,EAAQ,KAAK,MAAM,EAAK,EAAI,EAAU,CACtC,EAAK,EAAQ,EAAY,EAAK,GAG9B,EAAQ,KAAK,KAAK,EAAK,EAAI,EAAU,CAEzC,EAAa,KAAK,KAAK,EAAK,OAAS,EAAU,CAAG,EAC9C,EAAK,GACL,QAEH,CACD,IAAI,EAAI,EACR,IAAK,IAAI,EAAM,EAAG,EAAM,EAAM,IAAO,CACjC,IAAM,EAAK,EAAU,EAAI,CACnB,EAAK,GAAK,EAAgB,EAAI,EAAK,GACzC,GAAI,EAAK,GAAK,EAAI,EACd,GAAK,EACL,IACA,YAEK,EAAK,EAAI,EACd,GAAK,EACD,EACA,GAAM,EAAK,EAAK,EAGhB,IAEJ,YAEK,EAAK,EAAI,EAAK,OAAS,EAAK,EAAI,EACrC,GAAK,EACL,SAGA,OAIZ,IAAM,EAAO,CACT,EAAG,EACH,EAAG,EACH,MAAO,EAAY,EACnB,OAAQ,EAAa,EACxB,CACK,EAAU,EAAK,SACjB,IAAY,QACZ,EAAQ,IAAM,EAAK,GACnB,EAAQ,IAAM,EAAK,GACnB,EAAQ,SAAW,EAAK,QACxB,EAAQ,QAAU,EAAK,OACvB,EAAM,UAAY,GAClB,EAAM,UAAY,GAClB,EAAK,QAAU,EAAS,UAAU,IAClC,EAAK,SAAW,EAAS,UAAU,MACnC,IAAyB,CACrB,EAAG,EACH,EAAG,EACH,MAAO,EAAY,EACnB,OAAQ,EAAa,EACxB,CAAE,EAAK,MAAO,EAAK,OAAQ,EAAK,cAAgB,EAAG,EAAI,EAAG,CAC3D,EAAK,QAAU,EACf,EAAM,QAAU,EAChB,EAAM,QAAU,EAChB,EAAS,QAAU,CAAC,EAAK,MAAO,EAAK,OAAO,GAEjD,CAAC,EAAS,EAAW,EAAM,EAAwB,EAAe,EAAe,EAAc,CAAC,CAC7F,KAAuB,YAAa,GAAS,CAC/C,GAAS,QAAU,EACnB,GAAa,EACd,CAAC,EAAY,CAAC,CAIjB,OAHA,EAAM,cAAgB,CAClB,GAAa,EACd,CAAC,EAAY,CAAC,CACjB,EAAc,cAAc,GAAkB,CAAa,YAAsB,YAAW,sBAAuB,GAAc,sBAAiD,2BAA0B,UAAW,IAAgB,IAAQ,OAAO,GAAgB,SAAU,YAAa,IAAS,GAAgB,GAAI,aAAc,IAAU,GAAiB,GAAkB,eAA4B,eAA6B,gBAA6B,eAAiC,oBAAmB,OAAQ,GAA6B,cAAa,GACviB,cAAc,GAAa,CAAE,eAAgB,EAAW,MAAO,EAAa,OAAQ,EAAc,oBAAqB,EAAE,oBAAqB,UAAW,EAAE,UAAW,YAAa,EAAE,YAAa,YAAa,EAAE,YAAa,QAAS,EAAE,QAAS,aAAc,EAAE,aAAc,aAAc,EAAE,aAAc,WAAY,EAAE,WAAY,mBAAoB,EAAE,mBAAoB,aAAc,EAAE,aAAc,aAAc,EAAE,aAAc,cAAe,EAAE,cAAe,eAAgB,EAAE,eAAgB,gBAAiB,EAAE,gBAAiB,gBAAiB,EAAE,gBAAiB,oBAAqB,EAAE,oBAAqB,kBAAmB,EAAE,kBAAmB,aAAc,EAAE,aAAc,iBAAkB,EAAE,iBAAkB,kBAAmB,EAAE,kBAAmB,UAAW,EAAE,UAAW,UAAW,EAAE,UAAW,YAAa,EAAE,YAAa,eAAgB,EAAE,eAAgB,eAAgB,EAAE,eAAgB,kBAAmB,EAAE,kBAAmB,YAAa,EAAE,YAAa,cAAe,EAAE,cAAe,UAAW,EAAE,UAAW,KAAM,EAAE,KAAM,UAAW,EAAE,UAAW,MAAO,EAAE,MAAO,mBAAoB,EAAE,mBAAoB,aAAc,EAAE,aAAc,WAAY,EAAE,WAAY,WAAY,EAAE,WAAY,oBAAqB,EAAE,oBAAqB,eAAgB,EAAE,eAAgB,cAAe,EAAE,cAAe,WAAY,EAAE,WAAY,SAAU,EAAE,SAAU,aAAc,EAAE,aAAc,QAAS,EAAE,QAAS,YAAa,EAAE,YAAa,YAAa,EAAE,YAAa,aAAc,EAAE,aAAc,gBAAiB,EAAE,gBAAiB,cAAe,EAAE,cAAe,cAAe,EAAE,cAAe,eAAgB,EAAE,eAAgB,kBAAmB,EAAE,kBAAmB,oBAAqB,EAAE,oBAAqB,cAAe,EAAE,cAAe,UAAW,EAAE,UAAW,YAAa,EAAE,YAAa,eAAgB,EAAE,eAAgB,YAAa,EAAE,YAAa,OAAQ,EAAE,OAAQ,cAAe,EAAE,cAAe,UAAW,EAAE,UAAW,QAAS,EAAE,QAAS,YAAa,EAAE,YAAa,UAAW,EAAE,UAAW,WAAY,EAAE,WAAY,cAAe,EAAE,cAAe,cAAe,EAAE,cAAe,CAAC,CAAC,EC9IvjE,GAA6BR,EAAO,MAAM,CAAC,CACtD,KAAM,gBACN,MAAO,cACP,UAAW,GACZ,CAAC,CCEI,KAAiB,cAAc,MAAO,CAAE,UAAW,cAAe,QAAS,cAAe,GACtF,cAAc,OAAQ,CAAE,KAAM,OAAQ,OAAQ,eAAgB,cAAe,QAAS,eAAgB,QAAS,YAAa,KAAM,EAAG,uCAAwC,CAAC,CAAC,CACnL,KAAmB,cAAc,MAAO,CAAE,UAAW,cAAe,QAAS,cAAe,GACxF,cAAc,OAAQ,CAAE,KAAM,OAAQ,OAAQ,eAAgB,cAAe,QAAS,eAAgB,QAAS,YAAa,KAAM,EAAG,uCAAwC,CAAC,CAAC,CACnL,KAAgB,cAAc,MAAO,CAAE,UAAW,cAAe,QAAS,cAAe,GACrF,cAAc,OAAQ,CAAE,KAAM,OAAQ,OAAQ,eAAgB,cAAe,QAAS,eAAgB,QAAS,YAAa,KAAM,EAAG,mCAAoC,CAAC,CAAC,CAC/K,GAAqB,GACrB,GAAiB,GAAK,CACxB,GAAM,CAAE,YAAW,cAAa,OAAM,UAAS,iBAAgB,cAAa,cAAe,EAAiB,sBAAqB,uBAAsB,yBAAwB,aAAa,GAAO,iBAAmB,EAChN,CAAC,KAAkB,aAAe,cAAgB,KAAK,MAAM,KAAK,QAAQ,CAAG,IAAK,CAAC,CACnF,CAAC,EAAmB,KAA8B,SAAS,GAAG,CAC9D,EAAe,GAAe,EAE9B,IAAwB,YAAa,GAAW,CAClD,EAAqB,EAAO,CAC5B,IAAsB,EAAO,EAC9B,CAAC,EAAoB,CAAC,CACnB,CAAC,EAAc,KAAyB,UAAU,CAClD,IAAwB,OAAO,EAAa,CAClD,EAAgB,QAAU,EAC1B,EAAM,cAAgB,CACd,IAAoB,SAEpB,EAAgB,OAAS,EACzB,EAAgB,IAAO,CACnB,aAAc,EACd,QAAS,EAAgB,OACzB,cAAe,GAAI,eAAiB,GACvC,EAAE,CAGH,EAAgB,OAAU,GAE/B,CAAC,EAAM,EAAgB,CAAC,CAC3B,IAAM,IAA2B,QAAQ,CACrC,EAAmB,UAAY,SAC/B,EAAmB,QAAU,IAAI,iBACrC,IAAM,IAAqB,QAAQ,CAC7B,CAAC,EAAoB,KAA+B,SAAS,EAAE,CAAC,CAChE,EAAgB,GAAmB,EACnC,IAAqB,gBAAkB,CACrC,EAAa,UAAY,SACzB,OAAO,qBAAqB,EAAa,QAAQ,CACjD,EAAa,QAAU,OACvB,EAAmB,QAAQ,OAAO,GAEvC,EAAE,CAAC,CACA,IAAuB,OAAO,EAAY,CAChD,EAAe,QAAU,EACzB,IAAM,IAAoB,YAAa,GAAQ,CAC3C,IAAM,EAAQ,IAAI,OAAO,EAAI,QAAQ,yBAA0B,OAAO,CAAE,IAAI,CACxE,EAAS,EAAe,QAIxB,EAAe,KAAK,IAAI,GAAI,EAAK,CACjC,EAAe,EACnB,EAAgB,OAAU,CAC1B,EAAsB,EAAE,CAAC,CACzB,IAAM,EAAgB,EAAE,CAClB,EAAO,SAAY,CACrB,GAAI,IAAyB,OACzB,OACJ,IAAM,EAAS,YAAY,KAAK,CAC1B,EAAW,EAAO,EACpB,EAAO,EAAqB,CAC5B,EAAG,EACH,EAAG,EACH,MAAO,EAAQ,OACf,OAAQ,KAAK,IAAI,EAAc,EAAU,EAAO,EAAO,CAC1D,CAAE,EAAmB,QAAQ,OAAO,CACjC,OAAO,GAAS,aAChB,EAAO,MAAM,GAAM,EAEvB,IAAI,EAAQ,GACZ,IAAK,GAAM,CAAC,EAAK,KAAM,EAAK,SAAS,CACjC,IAAK,GAAM,CAAC,EAAK,KAAS,EAAE,SAAS,CAAE,CACnC,IAAI,EACJ,OAAQ,EAAK,KAAb,CACI,KAAK,EAAa,KAClB,KAAK,EAAa,OACd,EAAa,EAAK,YAClB,MACJ,KAAK,EAAa,IAClB,KAAK,EAAa,SACd,EAAa,EAAK,KAClB,MACJ,KAAK,EAAa,QACd,EAAa,OAAO,EAAK,MAAS,UAAY,EAAK,KAAK,UAAU,CAAG,OACrE,MACJ,KAAK,EAAa,MAClB,KAAK,EAAa,OAId,EAAa,EAAK,KAAK,KAAK,KAAK,CACjC,MACJ,KAAK,EAAa,OACd,EAAa,EAAK,SAClB,MAEJ,IAAe,QAAa,EAAM,KAAK,EAAW,GAClD,EAAc,KAAK,CAAC,EAAK,EAAM,EAAO,CAAC,CACvC,EAAQ,IAIpB,IAAM,EAAO,YAAY,KAAK,CAC1B,GACA,EAAsB,CAAC,GAAG,EAAc,CAAC,CAE7C,GAAgB,EAAK,OACrB,GAAO,GAAgB,EAAK,CAC5B,IAAM,EAAgB,EAAgB,SAAS,eAAiB,GAChE,EAAgB,CACZ,QAAS,EAAc,OACvB,eACA,gBACH,CAAC,CACF,IAAyB,EAAe,EAAc,CAClD,EAAS,GAAgB,EACzB,EAAS,EAGT,GAAU,EAEd,IAAM,EAAW,EAAO,EAElB,EAAS,GADC,KAAK,IAAI,EAAU,EAAE,CAErC,EAAe,KAAK,KAAK,EAAe,EAAO,CAC3C,EAAe,GAAQ,EAAc,OAAS,MAC9C,EAAa,QAAU,OAAO,sBAAsB,EAAK,GAGjE,GAAc,CACd,EAAa,QAAU,OAAO,sBAAsB,EAAK,EAC1D,CAAC,EAAc,EAAQ,OAAQ,EAAsB,EAAwB,EAAK,CAAC,CAChF,IAAgB,gBAAkB,CACpC,KAAiB,CACjB,EAAgB,OAAU,CAC1B,EAAsB,EAAE,CAAC,CACzB,IAAyB,EAAE,CAAE,GAAG,CAChC,GAAc,CACd,GAAW,SAAS,OAAO,EAC5B,CAAC,EAAc,EAAW,EAAe,EAAuB,CAAC,CAC9D,IAAuB,YAAa,GAAU,CAChD,EAAgB,EAAM,OAAO,MAAM,CAC/B,IAAoB,SAEpB,EAAM,OAAO,QAAU,IACvB,EAAgB,OAAU,CAC1B,EAAsB,EAAE,CAAC,CACzB,GAAc,EAGd,EAAY,EAAM,OAAO,MAAM,GAEpC,CAAC,EAAa,EAAc,EAAiB,EAAgB,CAAC,CACjE,EAAM,cAAgB,CACd,GAAc,EAAe,UAAY,OACzC,EAAgB,GAAG,CACnB,EAAe,QAAQ,MAAM,CAAE,cAAe,GAAM,CAAC,GAE1D,CAAC,EAAY,EAAgB,EAAgB,CAAC,CACjD,IAAM,KAAe,YAAa,GAAO,CAErC,GADA,GAAI,mBAAmB,CACnB,IAAiB,OACjB,OACJ,IAAM,GAAY,EAAa,cAAgB,GAAK,EAAa,QACjE,EAAgB,CACZ,GAAG,EACH,cAAe,EAClB,CAAC,CACF,IAAyB,EAAe,EAAS,EAClD,CAAC,EAAc,EAAwB,EAAc,CAAC,CACnD,KAAe,YAAa,GAAO,CAErC,GADA,GAAI,mBAAmB,CACnB,IAAiB,OACjB,OACJ,IAAI,GAAY,EAAa,cAAgB,GAAK,EAAa,QAC3D,EAAW,IACX,GAAY,EAAa,SAC7B,EAAgB,CACZ,GAAG,EACH,cAAe,EAClB,CAAC,CACF,IAAyB,EAAe,EAAS,EAClD,CAAC,EAAwB,EAAe,EAAa,CAAC,CACnD,KAAwB,YAAa,GAAU,EAC3C,EAAM,SAAW,EAAM,UAAY,EAAM,YAAY,OAAS,QAAW,EAAM,MAAQ,UACzF,GAAS,CACT,EAAM,iBAAiB,CACvB,EAAM,gBAAgB,EAEjB,EAAM,MAAQ,UACf,EAAM,SACN,IAAQ,CAGR,IAAQ,GAGjB,CAAC,EAAS,GAAQ,GAAO,CAAC,CAE7B,EAAM,kBACW,CACT,GAAc,EAEnB,CAAC,EAAa,CAAC,CAClB,GAAM,CAAC,EAAgB,MAA2B,SAAS,GAAM,CACjE,EAAM,cAAgB,CAClB,GAAI,EACA,GAAkB,GAAK,KAEtB,CACD,IAAM,EAAY,eAAiB,GAAkB,GAAM,CAAE,IAAI,CACjE,UAAa,aAAa,EAAU,GAEzC,CAAC,EAAW,CAAC,CAChB,IAAM,KAAkB,YAAc,CAClC,GAAI,CAAC,GAAc,CAAC,EAChB,OAAO,KAEX,IAAI,EACA,IAAiB,SACjB,EACI,EAAa,SAAW,IAClB,YACA,GAAG,EAAa,QAAQ,SAAS,EAAa,UAAY,EAAU,GAAN,MACpE,EAAa,eAAiB,IAC9B,EAAe,GAAG,EAAa,cAAgB,EAAE,MAAM,MAG/D,IAAM,EAAe,GAAO,CACxB,EAAG,iBAAiB,EAGlB,EAAgB,CAClB,MAAO,GAFkB,KAAK,OAAQ,GAAc,cAAgB,GAAK,EAAQ,IAAI,CAEtD,GAClC,CACD,SAAc,cAAc,GAAe,CAAE,UAAW,EAAa,GAAK,MAAO,YAAa,EAAa,YAAa,EAAa,UAAW,EAAa,QAAS,EAAa,GACzK,cAAc,MAAO,CAAE,UAAW,uBAAwB,GACtD,cAAc,QAAS,CAAE,GAAI,EAAU,cAAe,CAAC,EAAY,cAAe,eAAgB,IAAK,EAAgB,SAAU,EAAgB,MAAO,EAAc,SAAU,EAAa,OAAY,GAAI,iBAAkB,GAAiB,CAAC,GACjP,cAAc,SAAU,CAAE,aAAc,kBAAmB,cAAe,CAAC,EAAY,SAAU,EAAa,OAAY,GAAI,QAAS,GAAQ,UAAW,GAAc,SAAW,KAAO,EAAG,CAAE,GAAQ,GACvM,cAAc,SAAU,CAAE,aAAc,cAAe,cAAe,CAAC,EAAY,SAAU,EAAa,OAAY,GAAI,QAAS,GAAQ,UAAW,GAAc,SAAW,KAAO,EAAG,CAAE,GAAU,CAC3M,IAAkB,UAAoB,cAAc,SAAU,CAAE,aAAc,eAAgB,cAAe,CAAC,EAAY,cAAe,sBAAuB,SAAU,EAAa,OAAY,GAAI,QAAS,EAAS,CAAE,GAAO,CAAE,CACxO,IAAiB,OAG0E,EAAW,cAAc,MAAO,CAAE,UAAW,oBAAqB,GACnJ,cAAc,QAAS,CAAE,QAAS,EAAU,CAAE,iBAAiB,CAAC,CAJzD,EAAmB,gBAAoB,SAAU,OACxD,cAAc,MAAO,CAAE,UAAW,oBAAqB,GACnD,cAAc,MAAO,CAAE,cAAe,qBAAsB,CAAE,EAAa,CAAC,GAChF,cAAc,MAAO,CAAE,UAAW,sBAAuB,MAAO,EAAe,CAAC,CAAC,CACf,EACjF,CACC,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,GACA,GACA,EACA,EACH,CAAC,CACF,SAAc,gBAAoB,SAAU,OAClC,cAAcS,GAAmB,CAAE,cAAe,EAAe,oBAAqB,EAAE,oBAAqB,UAAW,EAAE,UAAW,YAAa,EAAE,YAAa,YAAa,EAAE,YAAa,UAAW,EAAE,UAAW,WAAY,EAAE,WAAY,QAAS,EAAE,QAAS,aAAc,EAAE,aAAc,aAAc,EAAE,aAAc,WAAY,EAAE,WAAY,mBAAoB,EAAE,mBAAoB,aAAc,EAAE,aAAc,aAAc,EAAE,aAAc,aAAc,EAAE,aAAc,cAAe,EAAE,cAAe,eAAgB,EAAE,eAAgB,gBAAiB,EAAE,gBAAiB,gBAAiB,EAAE,gBAAiB,oBAAqB,EAAE,oBAAqB,kBAAmB,EAAE,kBAAmB,aAAc,EAAE,aAAc,iBAAkB,EAAE,iBAAkB,kBAAmB,EAAE,kBAAmB,YAAa,EAAE,YAAa,UAAW,EAAE,UAAW,UAAW,EAAE,UAAW,YAAa,EAAE,YAAa,eAAgB,EAAE,eAAgB,eAAgB,EAAE,eAAgB,kBAAmB,EAAE,kBAAmB,YAAa,EAAE,YAAa,uBAAwB,EAAE,uBAAwB,YAAa,EAAE,YAAa,YAAa,EAAE,YAAa,yBAA0B,EAAE,yBAA0B,aAAc,EAAE,aAAc,kBAAmB,EAAE,kBAAmB,UAAW,EAAE,UAAW,KAAM,EAAE,KAAM,UAAW,EAAE,UAAW,UAAW,EAAE,UAAW,MAAO,EAAE,MAAO,mBAAoB,EAAE,mBAAoB,aAAc,EAAE,aAAc,WAAY,EAAE,WAAY,WAAY,EAAE,WAAY,eAAgB,EAAE,eAAgB,oBAAqB,EAAE,oBAAqB,cAAe,EAAE,cAAe,SAAU,EAAE,SAAU,WAAY,EAAE,WAAY,aAAc,EAAE,aAAc,QAAS,EAAE,QAAS,YAAa,EAAE,YAAa,YAAa,EAAE,YAAa,aAAc,EAAE,aAAc,gBAAiB,EAAE,gBAAiB,cAAe,EAAE,cAAe,cAAe,EAAE,cAAe,eAAgB,EAAE,eAAgB,kBAAmB,EAAE,kBAAmB,oBAAqB,EAAE,oBAAqB,cAAe,EAAE,cAAe,UAAW,EAAE,UAAW,YAAa,EAAE,YAAa,eAAgB,EAAE,eAAgB,YAAa,EAAE,YAAa,OAAQ,EAAE,OAAQ,cAAe,EAAE,cAAe,UAAW,EAAE,UAAW,QAAS,EAAE,QAAS,YAAa,EAAE,YAAa,UAAW,EAAE,UAAW,WAAY,EAAE,WAAY,cAAe,EAAE,cAAe,cAAe,EAAE,cAAe,CAAC,CACp2E,GAAU,EChRZD,OAA0B,GAAK,KAAK,IAAI,GAAI,EAAE,aAAe,GAAG,CAChE,GAA2BR,EAAO,QAAQ,CAAC,CAC/C,KAAM,cACN,MAAO,eACP,UAAW,GACX,KAAM,CACJ,aAAc,CAACQ,IAAM,CAAE,KAAK,CAC7B,CACF,CAAC,CACW,GAAc,GAAK,CAC9B,GAAM,CACJ,SACA,QACA,UACA,eACA,YACE,EACE,CAAC,EAAO,KAAkB,SAAS,EAAM,CAC/C,SAAa,cAAc,GAAuB,CAChD,MAAO,CACL,SAAU,WACV,KAAM,EAAO,EAAI,EAAa,KAAO,EACrC,IAAK,EAAO,EAAI,EAAa,IAC7B,MAAO,EAAO,MAAQ,EACtB,OAAQ,EAAO,OAChB,CACD,UAAW,eACX,eAAgB,EACjB,GAAQ,cAAc,GAAa,CAClC,aAAc,EAAO,OACrB,cAAe,qBACR,QACP,OAAQ,EACR,QAAS,GAAK,EAAE,OAAO,kBAAkB,EAAG,EAAM,OAAO,CACzD,SAAU,GAAK,EAAS,EAAE,OAAO,MAAM,CACvC,UAAW,GAAK,CACV,EAAE,MAAQ,QACZ,EAAS,EAAM,CACN,EAAE,MAAQ,UACnB,GAAS,EAGb,UAAW,GACZ,CAAC,CAAC,ECpCL,SAAS,GAAS,EAAK,EAAM,CAUzB,OATI,IAAQ,OACD,GACP,EAAI,OAAS,GAAK,EAAI,WAAW,IAAI,CACrB,OAAO,SAAS,EAAI,MAAM,EAAE,CAAC,GAC1B,EAAK,QAExB,EAAI,SAAW,GAAK,GAAO,KAAO,GAAO,IAClC,EAAI,aAAa,CAAC,YAAY,EAAE,GAAK,EAAK,QAE9C,IAAQ,EAAK,IAExB,SAAgB,EAAS,EAAQ,EAAM,EAAS,CAC5C,IAAM,EAAS,GAAc,EAAQ,EAAK,CAG1C,OAFI,IACA,EAAQ,SAAW,IAChB,EAEX,SAAS,GAAc,EAAQ,EAAM,CACjC,GAAI,EAAO,SAAW,EAClB,MAAO,GACX,GAAI,EAAO,SAAS,IAAI,CAAE,CACtB,IAAM,EAAQ,EAAO,MAAM,IAAI,CAC/B,IAAK,IAAM,KAAQ,EACf,GAAI,GAAc,EAAM,EAAK,CACzB,MAAO,GAEf,MAAO,GAEX,IAAI,EAAW,GACX,EAAY,GACZ,EAAU,GACV,EAAW,GACT,EAAQ,EAAO,MAAM,IAAI,CAE/B,GAAI,CAAC,GADO,EAAM,KAAK,CACJ,EAAK,CACpB,MAAO,GACX,GAAI,EAAM,KAAO,MACb,MAAO,GACX,IAAK,IAAM,KAAS,EAChB,OAAQ,EAAR,CACI,IAAK,OACD,EAAW,GACX,MACJ,IAAK,QACD,EAAY,GACZ,MACJ,IAAK,MACD,EAAU,GACV,MACJ,IAAK,OACD,EAAW,GACX,MACJ,IAAK,UACG,GAAa,MACb,EAAW,GAGX,EAAW,GAEf,MAGZ,OAAQ,EAAK,SAAW,GAAW,EAAK,UAAY,GAAY,EAAK,WAAa,GAAa,EAAK,UAAY,ECvEpH,SAAgB,GAAqB,EAAe,EAAkB,EAAe,EAAgB,EAAa,EAAa,CAyF3H,MAAO,GAvFkB,aAAa,EAAO,EAAQ,EAAQ,IAAY,EAChE,IAAgB,QAAU,IAAgB,eAAiB,IAAU,SACtE,EAAQ,CACJ,GAAG,EACH,MAAO,CACH,EAAG,EAAM,KAAK,GACd,EAAG,EAAM,KAAK,GACd,MAAO,EACP,OAAQ,EACX,CACJ,EAEL,IAAM,EAAe,IAAkB,UAAY,GAAU,IAAY,QACnE,EAAsB,IAAmB,SAAW,EACpD,EAAmB,IAAgB,SAAW,EAChD,EAAS,CACT,QAAS,IAAU,OACb,OACA,CACE,GAAG,EACH,WAAY,IAAY,OAAS,EAAc,SAAS,YAAc,EAAE,CAAG,EAAE,CAChF,CACL,QAAS,EAAsB,EAAc,QAAU,EAAiB,OAAO,CAC/E,KAAM,EAAmB,EAAc,KAAO,EAAiB,OAAO,CACzE,CACoB,IAAW,IAAgB,cAAgB,IAAgB,eAC5D,EAAO,UAAY,QAAa,EAAc,UAAY,SAC1E,EAAS,CACL,GAAG,EACH,QAAS,CACL,GAAG,EAAO,QACV,WAAY,CAAC,GAAG,EAAc,QAAQ,WAAY,EAAc,QAAQ,MAAM,CACjF,CACJ,EAEL,EAAiB,EAAQ,EAAO,EACjC,CAAC,EAAgB,EAAe,EAAe,EAAa,EAAa,EAAiB,CAAC,GAChE,aAAa,EAAS,EAAQ,IAAe,CACvE,IAAqB,EAAc,KAC/B,IAAW,SACX,EAAU,EAAQ,IAAI,EAAO,EAEjC,IAAI,EACJ,GAAI,IAAgB,aAAe,EAAQ,OAAS,EAChD,EAAS,CACL,QAAS,OACT,QAAS,EAAiB,OAAO,CACjC,KAAM,EACT,KAEA,CACD,IAAM,EAAa,GAAc,IAAkB,QAC7C,EAAc,GAAc,IAAmB,QAErD,EAAS,CACL,QAFa,EAAyB,EAAc,QAA1B,OAG1B,QAAS,EAAc,EAAc,QAAU,EAAiB,OAAO,CACvE,KAAM,EACT,CAEL,EAAiB,EAAQ,GAAM,EAChC,CAAC,EAAgB,EAAe,EAAe,EAAa,EAAiB,CAAC,GAChD,aAAa,EAAS,EAAQ,IAAe,CAC1E,IAAqB,EAAc,QAC/B,IAAW,SACX,EAAU,EAAQ,IAAI,EAAO,EAEjC,IAAI,EACJ,GAAI,IAAmB,aAAe,EAAQ,OAAS,EACnD,EAAS,CACL,QAAS,OACT,KAAM,EAAiB,OAAO,CAC9B,QAAS,EACZ,KAEA,CACD,IAAM,EAAa,GAAc,IAAkB,QAC7C,EAAW,GAAc,IAAgB,QAE/C,EAAS,CACL,QAFa,EAAyB,EAAc,QAA1B,OAG1B,KAAM,EAAW,EAAc,KAAO,EAAiB,OAAO,CAC9D,QAAS,EACZ,CAEL,EAAiB,EAAQ,GAAM,EAChC,CAAC,EAAgB,EAAe,EAAe,EAAa,EAAiB,CAAC,CACzB,CCzF5D,SAAgB,GAAqB,EAAwB,EAAgB,EAAiB,EAAiB,EAAM,CACjH,IAAM,IAA4C,YAAY,GAAQ,CAClE,GAAI,IAA2B,GAAM,CACjC,IAAM,EAAS,EAAE,CACjB,IAAK,IAAI,EAAI,EAAK,EAAG,EAAI,EAAK,EAAI,EAAK,OAAQ,IAAK,CAChD,IAAM,EAAM,EAAE,CACd,IAAK,IAAI,EAAI,EAAK,EAAG,EAAI,EAAK,EAAI,EAAK,MAAO,IACtC,EAAI,GAAK,GAAK,EACd,EAAI,KAAK,CACL,KAAM,EAAa,QACnB,aAAc,GACjB,CAAC,CAGF,EAAI,KAAK,EAAe,CAAC,EAAG,EAAE,CAAC,CAAC,CAGxC,EAAO,KAAK,EAAI,CAEpB,OAAO,EAEX,OAAO,IAAyB,EAAM,EAAgB,OAAO,EAAI,EAAE,EACpE,CAAC,EAAgB,OAAQ,EAAgB,EAAwB,EAAK,CAAC,CACpE,EAA6B,IAA2B,OAAkD,OAAtC,EACpE,IAAoC,YAAY,GAAQ,CAC1D,GAAI,IAA+B,OAC/B,MAAO,EAAE,CACb,IAAM,EAAU,CACZ,GAAG,EACH,EAAG,EAAK,EAAI,EACf,CACD,GAAI,EAAQ,EAAI,EAAG,CACf,EAAQ,EAAI,EACZ,EAAQ,QACR,IAAM,EAAI,EAA2B,EAAS,EAAgB,OAAO,CASrE,OARI,OAAO,GAAM,WACN,UAEN,MAAM,GAAG,EAAE,IAAI,GAAO,CACnB,CAAE,KAAM,EAAa,QAAS,aAAc,GAAO,CACnD,GAAG,EACN,CAAC,CAEC,EAAE,IAAI,GAAO,CAAC,CAAE,KAAM,EAAa,QAAS,aAAc,GAAO,CAAE,GAAG,EAAI,CAAC,CAEtF,OAAO,EAA2B,EAAS,EAAgB,OAAO,EACnE,CAAC,EAAgB,OAAQ,EAA4B,EAAgB,CAAC,CAEzE,MAAO,CADsB,IAA2B,OAA0C,OAA9B,EACtC,EAA2B,CC/C7D,SAAS,GAAoB,EAAM,CAC/B,GAAI,EAAK,WAAa,OAClB,MAAO,CACH,UAAW,EAAK,SAChB,SAAU,EAAK,SACf,OAAQ,SACX,CAEL,OAAQ,EAAK,KAAb,CACI,KAAK,EAAa,QACd,MAAO,CACH,UAAW,EAAK,OAAS,GACnB,OACA,EAAK,OAAS,GACV,QACA,EAAK,cACD,gBACA,GACd,SAAU,EAAK,KACf,OAAQ,UACX,CACL,KAAK,EAAa,OACd,MAAO,CACH,UAAW,EAAK,SAChB,SAAU,EAAK,SACf,OAAQ,SACX,CACL,KAAK,EAAa,MAClB,KAAK,EAAa,OACd,MAAO,CACH,UAAW,EAAK,KAChB,SAAU,EAAK,KACf,OAAQ,eACX,CACL,KAAK,EAAa,UACd,MAAO,CACH,UAAW,EAAK,KAAK,IAAI,GAAK,EAAE,KAAK,CACrC,SAAU,EAAK,KAAK,IAAI,GAAK,EAAE,KAAK,CACpC,OAAQ,eACX,CACL,KAAK,EAAa,KACd,MAAO,CACH,UAAW,EAAK,aAAe,EAAK,KACpC,SAAU,EAAK,KACf,OAAQ,SACX,CACL,KAAK,EAAa,IACd,MAAO,CACH,UAAW,EAAK,aAAe,EAAK,KACpC,SAAU,EAAK,KACf,OAAQ,MACX,CACL,KAAK,EAAa,SAClB,KAAK,EAAa,MACd,MAAO,CACH,UAAW,EAAK,KAChB,SAAU,EAAK,KACf,OAAQ,SACX,CACL,KAAK,EAAa,OACd,MAAO,CACH,UAAW,EAAK,YAChB,SAAU,EAAK,KACf,OAAQ,SACX,CACL,KAAK,EAAa,QACd,MAAO,CACH,UAAW,WACX,SAAU,GACV,OAAQ,SACX,CACL,KAAK,EAAa,UACd,MAAO,CACH,UAAW,eACX,SAAU,GACV,OAAQ,SACX,CACL,QACI,GAAY,EAAK,EAG7B,SAAS,GAA0B,EAAO,EAAe,CAarD,OAZmB,EAAM,KAAK,EAAK,IAAU,CACzC,IAAM,EAAc,EAAc,GAClC,OAAO,EAAI,IAAI,GACP,EAAK,OAAS,QAAa,EAAK,KAAK,KAAO,EACrC,CACH,UAAW,GACX,SAAU,GACV,OAAQ,SACX,CACE,GAAoB,EAAK,CAClC,EACJ,CAGN,SAAS,GAAe,EAAK,EAAW,CAIpC,OAHK,EAAY,WAAa,WAAW,KAAK,EAAI,GAC9C,EAAM,IAAI,EAAI,QAAQ,KAAM,KAAK,CAAC,IAE/B,EAEX,SAAS,GAAiB,EAAY,CAClC,IAAM,EAAQ,EAAE,CAChB,IAAK,IAAM,KAAO,EAAY,CAC1B,IAAM,EAAO,EAAE,CACf,IAAK,IAAM,KAAQ,EACX,EAAK,SAAW,MAChB,EAAK,KAAK,EAAK,UAAU,UAAU,EAAI,GAAG,CAErC,EAAK,SAAW,eACrB,EAAK,KAAK,EAAK,UAAU,IAAI,GAAK,GAAe,EAAG,GAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAGrE,EAAK,KAAK,GAAe,EAAK,UAAW,GAAM,CAAC,CAGxD,EAAM,KAAK,EAAK,KAAK,IAAK,CAAC,CAE/B,OAAO,EAAM,KAAK;EAAK,CAE3B,SAAS,GAAsB,EAAM,CAMjC,OAAO,EAAK,QAAQ,MAAO,OAAO,CAAC,QAAQ,SAAU,GAAS,iBAAiB,OAAO,EAAM,OAAO,CAAC,CAExG,SAAS,GAA2B,EAAU,CAE1C,MAAQ,IAAM,EAAS,QAAQ,KAAM,QAAQ,CAAC,QAAQ,KAAM,SAAS,CAAC,QAAQ,KAAM,OAAO,CAAC,QAAQ,KAAM,OAAO,CAAG,IAExH,SAAS,GAAoB,EAAK,CAE9B,OAAO,EACF,QAAQ,UAAW,IAAI,CACvB,QAAQ,QAAS,IAAI,CACrB,QAAQ,QAAS,IAAI,CACrB,QAAQ,SAAU,IAAI,CAE/B,SAAS,GAAiB,EAAY,CAClC,IAAM,EAAQ,EAAE,CAChB,EAAM,KAAK,2EAA4E,iBAAiB,CACxG,IAAK,IAAM,KAAO,EAAY,CAC1B,EAAM,KAAK,OAAO,CAClB,IAAK,IAAM,KAAQ,EAAK,CACpB,IAAM,EAAY,eAAe,EAAK,OAAO,GACzC,EAAK,SAAW,MAChB,EAAM,KAAK,OAAO,EAAU,YAAY,EAAK,SAAS,IAAI,GAAsB,EAAK,UAAU,CAAC,WAAW,CAGvG,EAAK,SAAW,eAChB,EAAM,KAAK,OAAO,EAAU,OAAO,EAAK,UACnC,KAAK,EAAG,IAAQ,qBAAqB,GAA2B,EAAK,SAAS,GAAK,CAAC,GACrF,GAAsB,EAAE,CACxB,QAAQ,CACP,KAAK,GAAG,CAAC,YAAY,CAG1B,EAAM,KAAK,qBAAqB,GAA2B,EAAK,UAAU,UAAU,EAAI,GAAG,CAAC,GAAG,EAAU,GAAG,GAAsB,EAAK,UAAU,CAAC,OAAO,CAIrK,EAAM,KAAK,QAAQ,CAGvB,OADA,EAAM,KAAK,mBAAmB,CACvB,EAAM,KAAK,GAAG,CAOzB,SAAgB,GAAsB,EAAO,EAAe,CACxD,IAAM,EAAa,GAA0B,EAAO,EAAc,CAGlE,MAAO,CACH,UAHc,GAAiB,EAAW,CAI1C,SAHa,GAAiB,EAAW,CAI5C,CAEL,SAAgB,GAAW,EAAM,CAC7B,IAAM,EAAW,SAAS,cAAc,OAAO,CAE/C,EAAS,UAAY,EAAK,QAAQ,UAAW,IAAI,CACjD,IAAM,EAAU,EAAS,cAAc,QAAQ,CAC/C,GAAI,IAAY,KACZ,OACJ,IAAM,EAAS,CAAC,EAAQ,CAClB,EAAS,EAAE,CACb,EACJ,KAAO,EAAO,OAAS,GAAG,CACtB,IAAM,EAAK,EAAO,KAAK,CACvB,GAAI,IAAO,OACP,MACJ,GAAI,aAAc,kBAAoB,EAAG,WAAa,QAClD,EAAO,KAAK,GAAG,CAAC,GAAG,EAAG,SAAS,CAAC,SAAS,CAAC,SAErC,aAAc,oBACf,IAAY,QACZ,EAAO,KAAK,EAAQ,CAExB,EAAU,EAAE,CACZ,EAAO,KAAK,GAAG,CAAC,GAAG,EAAG,SAAS,CAAC,SAAS,CAAC,SAErC,aAAc,qBAAsB,CAEzC,IAAM,EAAQ,EAAG,UAAU,GAAK,CAI1B,EADiB,EAAM,SAAS,SAAW,GAAK,EAAM,SAAS,GAAG,WAAa,IACvD,EAAM,SAAS,GAAK,KAC5C,EAAiB,GAAM,SAAS,SAAW,GAAK,EAAK,SAAS,GAAG,WAAa,OAC9E,EAAM,EAAM,iBAAiB,KAAK,CACxC,IAAK,IAAM,KAAM,EACb,EAAG,YAAY;EAAK,CAExB,IAAM,EAAiB,EAAM,aAAa,gBAAgB,CACpD,EAAe,EAAM,aAAa,aAAa,EAAI,SACzD,GAAI,EAAM,cAAc,IAAI,GAAK,KAC7B,GAAS,KAAK,CAEV,SAAU,EAAM,cAAc,IAAI,EAAE,aAAa,OAAO,EAAI,GAC5D,UAAW,EAAM,aAAe,GAChC,OAAQ,EACX,CAAC,SAEG,EAAM,cAAc,KAAK,GAAK,KAAM,CACzC,IAAM,EAAY,EAAM,iBAAiB,KAAK,CAC9C,GAAS,KAAK,CACV,SAAU,CAAC,GAAG,EAAU,CAAC,IAAI,GAAK,EAAE,aAAa,gBAAgB,EAAI,GAAG,CACxE,UAAW,CAAC,GAAG,EAAU,CAAC,IAAI,GAAK,EAAE,aAAe,GAAG,CACvD,OAAQ,eACX,CAAC,SAEG,IAAmB,KACxB,GAAS,KAAK,CACV,SAAU,GAAoB,EAAe,CAC7C,UAAW,EAAM,aAAe,GAChC,OAAQ,EACX,CAAC,KAED,CACD,IAAI,EAAc,EAAM,aAAe,GACnC,IAEA,EAAc,EAAY,QAAQ,YAAa,GAAG,EAEtD,GAAS,KAAK,CACV,SAAU,GAAe,GACzB,UAAW,GAAe,GAC1B,OAAQ,EACX,CAAC,GAOd,OAHI,IAAY,QACZ,EAAO,KAAK,EAAQ,CAEjB,ECtQX,SAAgB,GAAgB,EAAQ,EAAsB,EAAiB,EAAmB,EAAiB,CAC/G,IAAM,EAAU,EAChB,GAAI,IAAsB,gBAAkB,EAAO,UAAY,QAAa,IAAyB,OACjG,OAAO,EACX,IAAI,EAAW,GACf,EAAG,CACC,GAAI,GAAQ,UAAY,OACpB,MACJ,IAAM,EAAI,EAAO,SAAS,MACpB,EAAQ,EAAE,CAChB,GAAI,EAAE,MAAQ,EAAG,CACb,IAAM,EAAY,EAAqB,CACnC,EAAG,EAAE,EACL,EAAG,EAAE,EACL,MAAO,EACP,OAAQ,EAAE,OACb,CAAE,EAAgB,OAAO,CAC1B,GAAI,OAAO,GAAc,WACrB,OAAO,EAEX,EAAM,KAAK,GAAG,EAAU,CACxB,IAAM,EAAa,EAAqB,CACpC,EAAG,EAAE,EAAI,EAAE,MAAQ,EACnB,EAAG,EAAE,EACL,MAAO,EACP,OAAQ,EAAE,OACb,CAAE,EAAgB,OAAO,CAC1B,GAAI,OAAO,GAAe,WACtB,OAAO,EAEX,EAAM,KAAK,GAAG,EAAW,KAExB,CACD,IAAM,EAAS,EAAqB,CAChC,EAAG,EAAE,EACL,EAAG,EAAE,EACL,MAAO,EAAE,MACT,OAAQ,EAAE,OACb,CAAE,EAAgB,OAAO,CAC1B,GAAI,OAAO,GAAW,WAClB,OAAO,EAEX,EAAM,KAAK,GAAG,EAAO,CAEzB,IAAI,EAAO,EAAE,EAAI,EACb,EAAQ,EAAE,EAAI,EAAE,MAAQ,EAAI,EAChC,IAAK,IAAM,KAAO,EACd,IAAK,IAAM,KAAQ,EACX,EAAK,OAAS,SAElB,EAAO,KAAK,IAAI,EAAK,KAAK,GAAI,EAAK,CACnC,EAAQ,KAAK,IAAI,EAAK,KAAK,GAAI,EAAM,EAGzC,IAAS,EAAE,EAAI,GAAmB,IAAU,EAAE,EAAI,EAAE,MAAQ,EAAI,EAChE,EAAW,GAGX,EAAS,CACL,QAAS,CACL,KAAM,EAAO,QAAQ,MAAQ,CAAC,EAAG,EAAE,CACnC,MAAO,CACH,EAAG,EAAO,EACV,EAAG,EAAE,EACL,MAAO,EAAQ,EAAO,EACtB,OAAQ,EAAE,OACb,CACD,WAAY,EAAO,QAAQ,WAC9B,CACD,QAAS,EAAO,QAChB,KAAM,EAAO,KAChB,OAEA,CAAC,GACV,OAAO,EAEX,SAAS,GAAQ,EAAG,CAIhB,OAHI,EAAE,WAAW,IAAI,EAAI,EAAE,SAAS,IAAI,GACpC,EAAI,EAAE,MAAM,EAAG,GAAG,CAAC,QAAQ,MAAO,IAAI,EAEnC,EAEX,SAAgB,GAAQ,EAAK,CACzB,IAAI,GACH,SAAU,EAAO,CACd,EAAM,EAAM,KAAU,GAAK,OAC3B,EAAM,EAAM,SAAc,GAAK,WAC/B,EAAM,EAAM,kBAAuB,GAAK,sBACzC,CAAU,GAAQ,EAAE,CAAE,CACzB,IAAM,EAAS,EAAE,CACb,EAAU,EAAE,CACZ,EAAQ,EACR,EAAQ,EAAM,KAClB,EAAM,EAAI,QAAQ,QAAS;EAAK,CAChC,IAAI,EAAQ,EACZ,IAAK,IAAM,KAAQ,EAAK,CACpB,OAAQ,EAAR,CACI,KAAK,EAAM,KACH,IAAS,KAAQ,IAAS;GAC1B,EAAQ,KAAK,EAAI,MAAM,EAAO,EAAM,CAAC,CACrC,EAAQ,EAAQ,EACZ,IAAS;IACT,EAAO,KAAK,EAAQ,CACpB,EAAU,EAAE,GAGX,IAAS,MACd,EAAQ,EAAM,UAElB,MACJ,KAAK,EAAM,SACH,IAAS,MACT,EAAQ,EAAM,mBAElB,MACJ,KAAK,EAAM,kBACH,IAAS,IACT,EAAQ,EAAM,SAET,IAAS,KAAQ,IAAS;GAC/B,EAAQ,KAAK,GAAQ,EAAI,MAAM,EAAO,EAAM,CAAC,CAAC,CAC9C,EAAQ,EAAQ,EACZ,IAAS;IACT,EAAO,KAAK,EAAQ,CACpB,EAAU,EAAE,EAEhB,EAAQ,EAAM,MAGd,EAAQ,EAAM,KAElB,MAER,IAMJ,OAJI,EAAQ,EAAI,QACZ,EAAQ,KAAK,GAAQ,EAAI,MAAM,EAAO,EAAI,OAAO,CAAC,CAAC,CAEvD,EAAO,KAAK,EAAQ,CACb,EAAO,IAAI,GAAK,EAAE,IAAI,IAAM,CAAE,SAAU,EAAG,UAAW,EAAG,OAAQ,SAAU,EAAE,CAAC,CAEzF,SAAgB,GAAgB,EAAO,EAAe,EAAG,CACrD,IAAM,EAAa,GAAsB,EAAO,EAAc,CAExD,EAAqB,GAAM,CACxB,OAAO,UAAU,WAAW,UAAU,EAAE,EAE3C,GAAiB,EAAG,IAClB,OAAO,UAAU,WAAW,QAAU,OAC/B,IACN,OAAO,UAAU,UAAU,MAAM,CAClC,IAAI,cAAc,CAEd,aAAc,IAAI,KAAK,CAAC,EAAE,CAAE,CAAE,KAAM,aAAc,CAAC,CACnD,YAAa,IAAI,KAAK,CAAC,EAAK,CAAE,CAC1B,KAAM,YACT,CAAC,CACL,CAAC,CACL,CAAC,CACK,IAgBP,OAAO,UAAU,WAAW,QAAU,QAAa,GAAG,gBAAkB,SAd7C,EAAG,IAAS,CACvC,GAAI,CACA,GAAI,IAAM,QAAa,EAAE,gBAAkB,KACvC,MAAU,MAAM,oBAAoB,CAExC,GAAG,eAAe,QAAQ,aAAc,EAAE,CAC1C,GAAG,eAAe,QAAQ,YAAa,EAAK,MAE1C,CACG,EAAc,EAAG,EAAK,EACvB,EAAkB,EAAE,IAKD,EAAW,UAAW,EAAW,SAAS,CAGhE,EAAkB,EAAW,UAAU,CAEhD,GAAG,gBAAgB,CAUvB,SAAgB,GAAc,EAAM,CAChC,OAAO,IAAS,GChMpB,SAAS,GAAM,EAAG,CAEhB,OADI,OAAO,GAAM,SAAiB,EAC3B,GAAG,EAAE,IAEd,IAAMA,OAA0B,GAAK,EAAE,WACjC,OAA2B,GAAK,EAAE,YAClC,GAAuBR,EAAO,MAAM,CAAC,CACzC,KAAM,UACN,MAAO,cACP,UAAW,GACX,KAAM,CACJ,YAAa,CAACQ,IAAM,CAAC,CACrB,YAAa,CAAC,IAAO,CAAC,CACvB,CACF,CAAC,CACW,GAAsB,GAAK,CACtC,GAAM,CACJ,UACA,WACA,WACA,GAAG,GACD,EACJ,SAAa,cAAc,GAAS,CAClC,YAAa,GAAM,EAAS,CAC5B,WAAY,GAAM,EAAQ,CAC1B,GAAG,EACJ,CAAE,EAAS,EC3BR,GAAa,EACb,GAAgB,KACtB,SAAgB,GAAc,EAAiB,EAAW,EAAU,CAChE,IAAM,IAAoB,OAAO,EAAE,CAC7B,CAAC,EAAM,GAAQ,GAAmB,CAAC,EAAG,EAAE,CAC9C,EAAM,cAAgB,CAClB,GAAI,IAAS,GAAK,IAAS,EAAG,CAC1B,EAAY,QAAU,EACtB,OAEJ,IAAI,EAAY,GACZ,EAAW,EACT,EAAY,GAAY,CACtB,MAEJ,IAAI,IAAa,EACb,EAAW,MAEV,CACD,IAAM,EAAO,EAAU,EACvB,EAAY,QAAU,KAAK,IAAI,EAAG,EAAY,QAAU,EAAO,GAAc,CAC7E,IAAM,EAAS,EAAY,SAAW,MAAQ,EAAO,GACrD,EAAU,SAAS,SAAS,EAAO,EAAQ,EAAO,EAAO,CACzD,EAAW,EACX,KAAY,CAEhB,OAAO,sBAAsB,EAAS,GAG1C,OADA,OAAO,sBAAsB,EAAS,KACzB,CACT,EAAY,KAEjB,CAAC,EAAW,EAAM,EAAM,EAAS,CAAC,CC/BzC,SAAgB,GAAe,CAAE,UAAW,EAAa,aAAc,EAAgB,kBAAmB,EAAqB,MAAO,EAAS,YAAa,EAAe,YAAa,EAAe,aAAY,WAAY,CAC3N,GAAM,CAAC,EAAW,EAAc,EAAmB,EAAO,EAAa,KAAqB,YAAc,CACtG,GAAI,CAAC,GAAc,IAAY,GAC3B,MAAO,CAAC,EAAa,EAAgB,EAAqB,EAAS,EAAe,EAAc,CACpG,IAAM,EAAS,EAAU,GACnB,EAAK,EACL,EAAK,IAAoB,CAC/B,MAAO,CACH,OAAO,GAAO,SAAW,EAAK,EAAU,GAAM,KAAK,KAAK,EAAG,EAAE,CAAG,EAAO,CACvE,KAAK,KAAK,EAAiB,EAAO,CAClC,KAAK,KAAK,EAAsB,EAAO,CACvC,CACI,GAAG,EACH,gBAAiB,GAAS,gBAAkB,EAAG,gBAAkB,EACjE,uBAAwB,GAAS,uBAAyB,EAAG,uBAAyB,EACtF,qBAAsB,GAAS,qBAAuB,EAAG,qBAAuB,EACnF,CACD,KAAK,MAAM,GAAiB,GAAK,EAAO,CACxC,KAAK,MAAM,GAAiB,GAAK,EAAO,CAC3C,EACF,CAAC,EAAqB,EAAgB,EAAe,EAAe,EAAS,EAAa,EAAY,EAAQ,CAAC,CAClH,MAAO,CAAE,YAAW,eAAc,oBAAmB,QAAO,cAAa,cAAa,CCpB1F,IAAa,GAAqB,CAC9B,SAAU,GACV,UAAW,GACX,MAAO,GACP,aAAc,GACd,kBAAmB,GACnB,gBAAiB,GACjB,kBAAmB,GACnB,mBAAoB,GACpB,KAAM,GACN,MAAO,GACP,IAAK,GACL,OAAQ,GACR,OAAQ,GACR,aAAc,GACd,qBAAsB,GACtB,cAAe,GACf,gBAAiB,GACjB,aAAc,GACd,aAAc,GACd,eAAgB,GAChB,YAAa,GACb,aAAc,GACd,iBAAkB,GAClB,kBAAmB,GACnB,oBAAqB,GACrB,iBAAkB,GAClB,iBAAkB,GAClB,mBAAoB,GACpB,gBAAiB,GACjB,UAAW,GACX,UAAW,GACX,aAAc,GACd,SAAU,GACV,YAAa,GACb,WAAY,GACZ,WAAY,GACZ,wBAAyB,GACzB,2BAA4B,GAC5B,0BAA2B,GAC3B,0BAA2B,GAC3B,aAAc,GACd,gBAAiB,GACjB,eAAgB,GAChB,eAAgB,GACnB,CACD,SAAS,EAAe,EAAS,EAAY,CAKzC,OAJI,IAAY,GACL,EACP,IAAY,GACL,GACJ,EAEX,SAAgB,GAAgB,EAAU,CACtC,IAAM,EAAQ,GAAa,MAC3B,MAAO,CACH,aAAc,EAAe,EAAS,aAAc,sBAAsB,CAC1E,MAAO,EAAe,EAAS,MAAO,aAAa,CACnD,aAAc,EAAe,EAAS,aAAc,aAAa,CACjE,kBAAmB,EAAe,EAAS,kBAAmB,QAAQ,CACtE,gBAAiB,EAAe,EAAS,gBAAiB,cAAc,CACxE,kBAAmB,EAAe,EAAS,kBAAmB,YAAY,CAC1E,mBAAoB,EAAe,EAAS,mBAAoB,MAAM,CACtE,KAAM,EAAS,KACf,IAAK,EAAS,IACd,OAAQ,EAAe,EAAS,OAAQ,EAAQ,mBAAqB,SAAS,CAC9E,SAAU,EAAe,EAAS,SAAU,cAAc,CAC1D,qBAAsB,EAAe,EAAS,qBAAsB,gBAAgB,CACpF,WAAY,EAAe,EAAS,WAAY,YAAY,CAC5D,0BAA2B,EAAe,EAAS,0BAA2B,gBAAgB,CAC9F,WAAY,EAAe,EAAS,WAAY,sBAAsB,CACtE,0BAA2B,EAAe,EAAS,0BAA2B,gBAAgB,CAC9F,YAAa,EAAe,EAAS,YAAa,iBAAiB,CACnE,2BAA4B,EAAe,EAAS,2BAA4B,iBAAiB,CACjG,SAAU,EAAe,EAAS,SAAU,UAAU,CACtD,wBAAyB,EAAe,EAAS,wBAAyB,cAAc,CACxF,cAAe,EAAe,EAAS,cAAe,eAAe,CACrE,gBAAiB,EAAe,EAAS,gBAAiB,yBAAyB,CACnF,aAAc,EAAe,EAAS,aAAc,kBAAkB,CACtE,aAAc,EAAe,EAAS,aAAc,cAAc,CAClE,eAAgB,EAAe,EAAS,eAAgB,yBAAyB,CACjF,YAAa,EAAe,EAAS,YAAa,oBAAoB,CACtE,aAAc,EAAe,EAAS,aAAc,WAAW,CAC/D,iBAAkB,EAAe,EAAS,iBAAkB,SAAS,CACrE,MAAO,EAAS,MAChB,UAAW,EAAe,EAAS,UAAW,cAAc,CAC5D,OAAQ,EAAe,EAAS,OAAQ,YAAY,CACpD,UAAW,EAAe,EAAS,UAAW,YAAY,CAC1D,aAAc,EAAe,EAAS,aAAc,SAAS,CAC7D,eAAgB,EAAe,EAAS,eAAgB,kBAAkB,CAC1E,eAAgB,EAAe,EAAS,eAAgB,kBAAkB,CAC1E,gBAAiB,EAAe,EAAS,gBAAiB,mBAAmB,CAC7E,aAAc,EAAe,EAAS,aAAc,gBAAgB,CACpE,UAAW,EAAe,EAAS,UAAW,UAAU,CACxD,kBAAmB,EAAe,EAAS,kBAAmB,qBAAqB,CACnF,oBAAqB,EAAe,EAAS,oBAAqB,0BAA0B,CAC5F,iBAAkB,EAAe,EAAS,iBAAkB,wBAAwB,CACpF,iBAAkB,EAAe,EAAS,iBAAkB,oBAAoB,CAChF,mBAAoB,EAAe,EAAS,mBAAoB,2BAA2B,CAC3F,gBAAiB,EAAe,EAAS,gBAAiB,0BAA0B,CACvF,CAEL,SAAgB,GAA2B,EAAe,CACtD,IAAM,EAAO,GAAY,EAAc,CACvC,SAAa,YAAc,CACvB,GAAI,IAAS,OACT,OAAO,GAAgB,GAAmB,CAC9C,IAAM,EAAwB,CAC1B,GAAG,EACH,aAAc,GAAM,cAAgB,GAAM,UAAY,GAAmB,aACzE,iBAAkB,GAAM,kBAAoB,GAAM,QAAU,GAAmB,iBAC/E,cAAe,GAAM,eAAiB,GAAM,OAAS,GAAmB,cACxE,aAAc,GAAM,cAAgB,GAAM,MAAQ,GAAmB,aACrE,kBAAmB,GAAM,mBAAqB,GAAM,OAAS,GAAmB,kBAChF,iBAAkB,GAAM,kBAAoB,GAAM,MAAQ,GAAmB,iBAChF,CACD,OAAO,GAAgB,CACnB,GAAG,GACH,GAAG,EACN,CAAC,EACH,CAAC,EAAK,CAAC,+BC/FR,KAA8B,KAAK,SAAY,YAAM,OAAO,0EAAoE,CAElI,GAAY,EAChB,SAAS,GAAa,EAAO,CACzB,mDAA4B,EAAM,CAC7B,OAAO,GAAK,EAAE,OAAS,OAAU,CACjC,IAAI,mBAAY,EAAE,OAAO,IAAM,GAAK,GAAI,EAAE,OAAO,IAAM,GAAK,EAAE,CAAC,CAAC,CAAC,CAE1E,SAAS,GAAe,EAAO,EAAQ,CAGnC,OAFI,IAAU,QAAa,IAAW,GAAM,EAAM,QAAQ,SAAW,GAAK,EAAM,UAAY,OACjF,EACJ,CACH,QAAS,EAAM,UAAY,OACrB,OACA,CACE,KAAM,CAAC,EAAM,QAAQ,KAAK,GAAK,EAAQ,EAAM,QAAQ,KAAK,GAAG,CAC7D,MAAO,CACH,GAAG,EAAM,QAAQ,MACjB,EAAG,EAAM,QAAQ,MAAM,EAAI,EAC9B,CACD,WAAY,EAAM,QAAQ,WAAW,IAAI,IAAM,CAC3C,GAAG,EACH,EAAG,EAAE,EAAI,EACZ,EAAE,CACN,CACL,KAAM,EAAM,KACZ,QAAS,EAAM,QAAQ,OAAO,EAAO,CACxC,CAEL,IAAM,GAAc,CAChB,KAAM,EAAa,QACnB,aAAc,GACjB,CACK,GAAqB,CACvB,QAAS,EAAiB,OAAO,CACjC,KAAM,EAAiB,OAAO,CAC9B,QAAS,OACZ,CA0hFY,KAAmB,YAzhFR,EAAG,IAAiB,CACxC,GAAM,CAAC,EAAoB,KAA+B,SAAS,GAAmB,CAChF,CAAC,EAAS,KAAoB,UAAU,CACxC,IAAuB,OAAO,KAAK,CACnC,IAAkB,OAAO,KAAK,CAC9B,CAAC,EAAY,KAAuB,UAAU,CAC9C,IAAkB,OAAO,KAAK,CAC9B,IAAiB,QAAQ,CACzB,EAAa,OAAO,OAAW,IAAc,KAAO,OACpD,CAAE,sBAAqB,sBAAqB,wBAAuB,QAAO,SAAQ,QAAS,EAAW,OAAM,iBAAgB,gBAAe,kBAAiB,gBAAe,oBAAmB,mBAAkB,WAAY,EAAc,SAAU,EAAY,cAAa,kBAAiB,sBAAqB,qBAAoB,UAAW,wBAAsB,oBAAmB,aAAW,uBAAqB,qBAAsB,EAAwB,2BAA0B,uBAAsB,gBAAc,gBAAe,uBAAwB,EAA0B,iBAAe,uBAAqB,eAAa,UAAW,GAAa,QAAS,GAAW,YAAa,GAAe,aAAa,GAAM,iBAAe,iBAAe,aAAc,EAAgB,iBAAkB,GAAoB,eAAc,OAAQ,eAAe,QAAS,aAAY,QAAS,0BAAyB,YAAa,0BAA0B,YAAa,wBAAuB,YAAa,SAAU,GAAY,cAAa,eAAa,WAAS,eAAc,GAAO,iBAAgB,EAAG,0BAAyB,eAAgB,oBAAmB,OAAQ,qBAAmB,mBAAiB,cAAe,GAAiB,iBAAe,sBAAoB,WAAY,GAAc,0BAAwB,cAAe,GAAoB,yBAAuB,eAAgB,GAAmB,GAAI,eAAgB,GAAmB,IAAK,mBAAoB,GAAsB,gBAAe,sBAAoB,sBAAqB,EAAG,yBAAwB,aAAc,iBAAe,iBAAe,kBAAgB,kBAAgB,UAAQ,eAAgB,GAAkB,kBAAmB,GAAqB,oBAAqB,GAAuB,gBAAiB,GAAqB,cAAY,iBAAgB,GAAM,gBAAc,gBAAc,gBAAc,eAAa,qBAAmB,eAAa,eAAa,eAAa,cAAY,YAAa,GAAe,YAAa,GAAe,4BAA0B,gBAAc,qBAAmB,aAAY,GAAO,iBAAe,iBAAe,cAAa,GAAO,UAAW,GAAc,GAAI,aAAc,GAAiB,GAAI,kBAAmB,GAAsB,GAAgB,MAAO,GAAS,kBAAgB,cAAe,EAC7xE,GAAgB,OAAO,EAAE,YAAe,SAAW,OAAY,EAAE,WACjE,GAAa,IAAe,MAAQ,EAAE,YAAc,OACpD,GAAoB,IAAe,OAAS,EAAE,eAC9C,GAAsB,IAAe,YAAc,EAAE,qBAAuB,EAC5E,GAAiB,IAAe,OAAS,EAAE,eAC3C,GAAyB,IAAe,eAAiB,SACzD,GAAiB,KAAK,IAAI,GAAkB,GAAG,CAC/C,GAAiB,KAAK,IAAI,GAAkB,GAAe,CAC3D,GAAqB,KAAK,IAAI,IAAwB,GAAgB,GAAe,CACrF,KAAiB,YACf,OAAO,OAAW,IACX,CAAE,SAAU,OAAQ,CACxB,OAAO,iBAAiB,SAAS,gBAAgB,CACzD,EAAE,CAAC,CAEA,CAAE,aAAW,gBAAc,qBAAmB,SAAO,eAAa,gBAAgB,GAAe,CACnG,kBAAmB,GACnB,aAAc,GACd,YAAa,GACb,YAAa,GACb,UANkB,YAAc,OAAO,WAAW,GAAS,SAAS,CAAE,CAAC,GAAS,CAAC,CAOjF,UAAW,GACX,cACA,MAAO,GACV,CAAC,CACI,GAAc,GAA2B,GAAc,CACvD,GAAiB,KAAsB,EAAO,IAAQ,GAAK,EAAO,IAAO,GAAK,EAAO,IAAM,GAAK,IAChG,GAAgB,KAAe,OAC/B,EAAkB,GAAgB,EAAI,EACtC,GAAuB,KAAkB,OACzC,GAAgB,IAAoB,SAAW,GAC/C,CAAC,GAAiB,MAA4B,SAAS,GAAM,CAC7D,GAAa,IAAgB,GAC7B,KAAsB,gBAAkB,CACtC,KAAoB,OAIpB,GAAmB,GAAM,CAHzB,IAAiB,EAKtB,CAAC,GAAgB,CAAC,CAIf,IAHkC,YAC7B,KAAuB,OAAY,OAAY,GAAe,GAAoB,EAAgB,CAC1G,CAAC,GAAoB,EAAgB,CAAC,EACU,EAC7C,KAA2B,QAAQ,CACrC,GAAmB,UAAY,SAC/B,GAAmB,QAAU,IAAI,iBACrC,EAAM,kBAAsB,IAAoB,QAAQ,OAAO,CAAE,EAAE,CAAC,CACpE,GAAM,CAAC,GAAsB,IAA6B,GAAqB,EAAwB,EAAgB,EAAiB,GAAmB,QAAS,EAAK,CACnK,KAAqB,aAAa,EAAM,EAAU,IAAc,CAClE,GAAI,IAAmB,OACnB,MAAO,GACX,IAAM,EAAO,CAAC,EAAK,GAAK,EAAiB,EAAK,GAAG,CACjD,OAAO,IAAiB,EAAM,EAAU,EAAU,EACnD,CAAC,EAAiB,EAAe,CAAC,CAC/B,KAAsC,OAAO,GAAmB,CAChE,KAAyB,aAAa,EAAQ,IAAW,CACvD,IACA,EAAS,GAAgB,EAAQ,GAAsB,EAAiB,GAAmB,GAAmB,QAAQ,EAEtH,KAA0B,OAK1B,EAAsB,EAAO,EAJ7B,GAA8B,QAAU,GAAe,EAAQ,CAAC,EAAgB,CAChF,GAAsB,GAA8B,QAAQ,GAKjE,CAAC,GAAuB,GAAsB,EAAiB,GAAkB,CAAC,CAC/E,GAAiB,GAAY,KAAwB,aAAa,EAAG,EAAG,EAAK,IAAO,CACtF,KAAmB,EAAU,EAAM,GAAkB,EAAG,EAAM,EAAiB,EAAG,EACnF,CAAC,GAAkB,EAAiB,EAAU,CAAC,CAAC,CAC7C,GAAoB,GAAY,KAA2B,aAAa,EAAG,EAAG,EAAK,IAAO,CAC5F,KAAsB,EAAU,EAAM,GAAkB,EAAG,EAAM,EAAiB,EAAG,EACtF,CAAC,GAAqB,EAAiB,EAAU,CAAC,CAAC,CAChD,GAAsB,GAAY,KAA6B,aAAa,EAAG,EAAG,EAAK,IAAO,CAChG,KAAwB,EAAU,EAAM,GAAkB,EAAG,EAAM,EAAiB,EAAG,EACxF,CAAC,GAAuB,EAAiB,EAAU,CAAC,CAAC,CAClD,GAAa,GAAY,IAAoB,aAAa,EAAM,IAC3D,IAAe,CAAE,GAAG,EAAM,YAAa,EAAK,YAAc,EAAiB,CAAE,EAAK,EAAI,GAC9F,CAAC,EAAc,EAAgB,CAAC,CAAC,CAC9B,GAAW,GAAY,IAAkB,aAAa,EAAM,IACvD,IAAa,CAAE,GAAG,EAAM,IAAK,EAAK,IAAM,EAAiB,CAAE,EAAK,EAAI,GAC5E,CAAC,EAAY,EAAgB,CAAC,CAAC,CAC5B,KAAiB,YAAY,GAAO,CACtC,GAAI,KAAe,OAAW,CAC1B,IAAM,EAAS,GAAW,GAAe,EAAK,CAAC,EAAgB,CAAC,CAIhE,OAHI,OAAO,GAAW,UACX,EAEJ,GAAe,EAAQ,EAAgB,CAElD,MAAO,IACR,CAAC,GAAY,EAAgB,CAAC,CAC3B,CAAC,GAAY,GAAiB,IAAsB,GAAqB,EAAe,GAAkB,GAAwB,EAAyB,GAAsB,GAAY,CAC7L,KAAoB,YACf,GAAqB,IAAoB,CAAE,GAAM,CACzD,CAAC,GAAM,CAAC,CACL,CAAC,GAAY,MAAuB,SAAS,CAAC,EAAG,EAAG,EAAE,CAAC,CACvD,KAAoB,YAAc,CACpC,GAAI,KAAc,OACd,MAAO,EAAE,CACb,IAAM,EAAS,EAAE,CACjB,IAAK,IAAM,KAAK,GACZ,EAAO,EAAE,MAAQ,EAErB,OAAO,GACR,CAAC,GAAU,CAAC,CACT,KAAwB,YAAa,GACnC,EAAK,OAAS,EAAa,OAGxB,IAAqB,KAAK,GAAK,EAAE,QAAQ,EAAK,CAAC,CAF3C,GAAY,EAAK,MAG7B,CAAC,GAAqB,GAAY,CAAC,CAElC,CAAE,aAAc,GAAS,iBAAiB,GAAe,EAAW,EAAM,GAA2B,GAAW,IAAM,IAAoB,EAAI,EAAI,IAAkB,GAAW,GAAI,GAAgB,GAAoB,GAAa,GAAiB,GAAmB,QAAQ,CAChR,KAAe,SACf,IAAgB,IACpB,IAAM,KAAqB,YAChB,GAAQ,KAAK,GAAK,EAAE,QAAU,OAAU,CAChD,CAAC,GAAQ,CAAC,CACP,GAAoB,GAAe,GAAe,GAAoB,GACtE,GAAkB,EAAc,KAAK,OACrC,GAAmB,KAAe,OAAS,OAAY,KAAoB,EAAI,GAAQ,KAAoB,EAAO,GAAO,OACzH,IAAoB,YAClB,KAAe,OACR,GACJ,CACH,CACI,MAAO,GACP,MAAO,GACP,KAAM,OACN,QAAS,GACT,MAAO,SACP,cAAe,GACf,UAAW,GACX,oBACH,CACD,GAAG,GACN,CACF,CAAC,GAAY,GAAS,GAAgB,GAAgB,GAAwB,GAAiB,CAAC,CAC7F,CAAC,GAAgB,MAAyB,YACrC,CACH,KAAkB,QAAa,OAAO,IAAc,SAAW,KAAK,MAAM,GAAgB,GAAU,CAAG,EACvG,KAAkB,QAAa,OAAO,IAAc,SAAW,EAAE,GAAgB,IAAa,EACjG,CACF,CAAC,GAAe,GAAU,CAAC,CACxB,KAAyB,OAAO,CAClC,OAAQ,EACR,MAAO,EACP,EAAG,EACH,EAAG,EACN,CAAC,CACI,KAA2B,aAAe,CAC5C,EAAG,GAAiB,QAAQ,EAC5B,EAAG,GACH,MAAO,GAAiB,QAAQ,OAAS,EACzC,OAAQ,GAAiB,QAAQ,QAAU,EAE3C,GAAI,GACP,EAAG,CAAC,GAAiB,GAAe,CAAC,CAChC,KAAwB,OAAO,GAAM,CACrC,CAAC,GAAe,GAAkB,IAAS,GAA0B,GAAmB,CAC9F,GAAiB,QAAU,GAC3B,IAAM,IAAgB,GAAc,QAAU,GAAK,EACnD,EAAM,oBAAsB,CACxB,GAAI,KAAkB,QAAa,EAAU,UAAY,MAAQ,GAAc,CAC3E,GAAI,EAAU,QAAQ,YAAc,GAChC,OACJ,EAAU,QAAQ,UAAY,GAC1B,EAAU,QAAQ,YAAc,IAChC,IAAO,CAEX,GAAgB,QAAU,KAE/B,CAAC,GAAe,GAAc,GAAM,CAAC,CACxC,IAAM,IAAgB,GAAc,OAAS,GAAK,EAClD,EAAM,oBAAsB,CACxB,GAAI,KAAkB,QAAa,EAAU,UAAY,MAAQ,GAAc,CAC3E,GAAI,EAAU,QAAQ,aAAe,GACjC,OACJ,EAAU,QAAQ,WAAa,GAC3B,EAAU,QAAQ,aAAe,IACjC,IAAO,CAEX,GAAgB,QAAU,KAE/B,CAAC,GAAe,GAAc,GAAM,CAAC,CACxC,IAAM,GAAc,GAAc,EAAI,EAChC,GAAc,GAAc,EAC5B,KAAgB,OAAO,KAAK,CAC5B,KAAc,YAAa,GAAc,CACvC,IAAc,GACd,GAAQ,SAAS,OAAO,CAGxB,OAAO,0BAA4B,CAC/B,GAAQ,SAAS,OAAO,EAC1B,EAEP,EAAE,CAAC,CACA,GAAc,GAAuB,EAAO,EAAI,EAChD,KAA6B,YAAa,GAAU,CACtD,IAAM,EAAe,IAAoB,EACnC,EACA,EAAM,IAAI,IAAM,CACd,GAAG,EACH,SAAU,CAAC,EAAE,SAAS,GAAK,EAAiB,EAAE,SAAS,GAAG,CAC7D,EAAE,CACD,EAAI,IAAgB,EAAa,CACvC,GAAI,IAAM,GACN,IAAK,IAAM,KAAK,EACZ,KAAe,EAAE,SAAU,EAAE,MAAM,CAE3C,OAAO,GACR,CAAC,GAAc,EAAe,EAAgB,CAAC,CAC5C,CAAC,GAAqB,MAAgC,UAAU,CAEhE,GAAiB,EAAc,UAAY,QAC7C,EAAc,QAAQ,MAAM,MAAQ,EAAc,QAAQ,MAAM,OAAS,EACvE,EAAc,QAAQ,MACtB,OACA,GAAiB,GAAgB,EAAc,SAAS,KAAO,OAC/D,GAAoB,KAAiB,GACrC,GAAoB,KAAiB,GACrC,KAAyB,YAAc,CACzC,IAAK,KAAuB,QAAa,GAAmB,SAAW,KAClE,IAAkB,IAAqB,IAAqB,MAAyB,OACtF,OACJ,IAAM,EAAU,EAAE,CAClB,GAAI,KAAuB,OACvB,IAAK,IAAM,KAAK,GAAoB,CAChC,IAAM,EAAW,EAAY,OAAS,EAAE,MAAM,EAAI,EAC9C,EAAW,GACX,EAAQ,KAAK,CACT,MAAO,EAAE,MACT,MAAO,CACH,GAAG,EAAE,MACL,EAAG,EAAE,MAAM,EAAI,EACf,MAAO,KAAK,IAAI,EAAU,EAAE,MAAM,MAAM,CAC3C,CACD,MAAO,EAAE,MACZ,CAAC,CA8Bd,OA1BI,KAAwB,QACxB,EAAQ,KAAK,CACT,MAAOF,GAAU,GAAY,YAAa,EAAE,CAC5C,MAAO,GACP,MAAO,SACV,CAAC,CAEF,KAAmB,QACnB,EAAQ,KAAK,CACT,MAAOA,GAAU,GAAY,YAAa,GAAI,CAC9C,MAAO,GACP,MAAO,gBACV,CAAC,CAEF,KAAsB,QAAa,KAAsB,QACzD,EAAQ,KAAK,CACT,MAAO,GAAY,YACnB,MAAO,CACH,EAAG,GACH,EAAG,GACH,MAAO,EACP,OAAQ,EACX,CACD,MAAO,gBACV,CAAC,CAEC,EAAQ,OAAS,EAAI,EAAU,QACvC,CACC,GACA,GACA,GACA,GACA,GACA,EAAY,OACZ,GAAY,YACZ,EACH,CAAC,CACI,KAAuB,OAAO,EAAY,CAChD,GAAe,QAAU,EACzB,IAAM,KAA8B,aAAa,CAAC,EAAK,GAAM,EAAc,KAAU,CACjF,IAAM,EAAa,IAAwB,IAAQ,GAAc,EAEjE,GADuB,IAAQ,GAAK,GAKhC,OAHI,EACO,GAEJ,CACH,KAAM,GAAkB,OACxB,aAAc,GACd,cAAe,GACf,QAAS,GAAe,KAAK,SAAS,EAAI,GAAK,GAC/C,WAAY,KAAe,mBAAqB,SAAW,GAC3D,IAAK,GAAsB,EAC3B,WAAY,KAAe,OAC3B,OAAQ,KAAe,mBAAqB,UAAY,OAC3D,IAEI,EAAY,CAGjB,IAAM,EADU,IAAQ,EACe,IAAoB,MAAQ,GAAK,GAClE,EAAI,GAAe,QAAQ,GACjC,GAAI,GAAG,oBAAoB,WAAa,GACpC,OAAO,GAEN,CACD,IAAM,EAAO,GAAG,oBAAoB,MAAQ,EACtC,EAAO,GAAG,oBAAoB,SAAW,IAAoB,QACnE,MAAO,CACH,KAAM,GAAkB,OACxB,OACA,aAAc,GACd,OACH,MAGJ,CACD,IAAM,EAAW,EAAM,EACvB,GAAI,GAAe,IAAc,SAAW,GAAM,CAC9C,IAAM,EAAK,GAAiB,QACtB,EAAoB,EAAG,EAAI,GAC7B,EAAW,EAAG,EAAI,EAAG,OACrB,EAAG,EAAI,GACP,EAAM,EAAG,EAAI,EAAG,QAChB,GAAO,GAAQ,QACb,EAAa,IAAa,EAAG,QAAQ,WAAW,IAAM,IAAQ,EAAG,QAAQ,SAAS,GACpF,EAAiB,GACrB,GAAI,EAAG,QAAQ,gBAAkB,YACxB,IAAM,KAAM,EAAG,OAAO,cACvB,GAAI,GAAY,EAAI,EAAU,EAAI,CAAE,CAChC,EAAiB,GACjB,OAIZ,GAAI,GAAqB,CAAC,GAAc,CAAC,EACrC,OAAO,GAGf,IAAI,EAAS,EAAe,CAAC,EAAU,EAAI,CAAC,CAO5C,OANI,IAAoB,GAAK,EAAO,OAAS,SACzC,EAAS,CACL,GAAG,EACH,KAAM,CAAC,EAAO,KAAK,GAAK,EAAiB,EAAO,KAAK,GAAK,EAAgB,CAC7E,EAEE,IAEZ,CACC,GACA,GACA,GACA,GACA,GAAe,KACf,GACA,GACA,GACA,EACA,IAAoB,KACpB,IAAoB,QACpB,IAAc,OACd,EACH,CAAC,CACI,KAA+B,YAAY,GAAS,CACtD,IAAI,EAAS,KAAkB,EAAM,EAAI,CAAE,KAAM,EAAO,CAoBxD,OAnBI,IAAyB,QAAa,IAAU,KAChD,EAAS,CAEL,KAAM,EAAO,KACb,KAAM,EAAO,KACb,cAAe,EAAO,cACtB,QAAS,CACL,GAAI,EAAO,SAAW,EAAE,CACxB,CACI,MAAO,SACP,KAAM,aACN,QAAS,GAAK,GAAe,CACzB,MAAO,EAAO,KACd,OAAQ,EAAE,OACb,CAAC,CACL,CACJ,CACJ,EAEE,GACR,CAAC,GAAiB,EAAqB,CAAC,CACrC,KAAyB,YAAa,GAAQ,CAChD,GAAM,CAAC,EAAK,GAAO,EAAI,KACjB,EAAS,EAAY,GACrB,EAAa,GAAQ,QAAU,OAAkE,OAAtD,GAAuB,EAAO,MAAM,EAAE,cACjF,EAAW,GAAQ,cACnB,EAAW,IAAsB,EAAI,CAC3C,EAAW,CACP,GAAG,EACH,MAAO,GAAqB,GAAa,EAAY,EAAU,EAAU,EAAI,QAAQ,cAAc,CACtG,CAAC,EACH,CAAC,EAAqB,EAAa,GAAwB,GAAY,CAAC,CACrE,KAAiB,aAAa,EAAQ,EAAc,IAAiB,CACvE,GAAI,EAAc,UAAY,OAC1B,OACJ,GAAM,CAAC,EAAK,GAAO,EAAc,QAAQ,KACnC,EAAI,GAAsB,CAAC,EAAK,EAAI,CAAC,CAC3C,GAAI,EAAE,OAAS,EAAa,SAAW,EAAE,aAAc,CACnD,IAAI,EAAU,EACd,GAAI,IAAiB,OACjB,OAAQ,EAAQ,KAAhB,CACI,KAAK,EAAa,OAAQ,CACtB,IAAM,EAAI,OAAa,IAAiB,IAAM,GAAK,OAAO,WAAW,EAAa,CAAG,EAAE,CACvF,EAAU,CACN,GAAG,EACH,KAAM,OAAO,MAAM,EAAE,CAAG,EAAI,EAC/B,CACD,MAEJ,KAAK,EAAa,KAClB,KAAK,EAAa,SAClB,KAAK,EAAa,IACd,EAAU,CACN,GAAG,EACH,KAAM,EACT,CACD,MAGZ,GAAiB,CACb,OAAQ,EACR,UACA,eACA,KAAM,CAAC,EAAK,EAAI,CAChB,UAAW,IAAiB,OAC5B,cAAe,IAAiB,OACnC,CAAC,MAEG,EAAE,OAAS,EAAa,SAAW,GAAgB,EAAE,WAAa,KACvE,GAAqB,CACjB,CACI,SAAU,EAAc,QAAQ,KAChC,MAAO,CACH,GAAG,EACH,KAAM,GAAc,EAAE,KAAK,CAC9B,CACJ,CACJ,CAAC,CACF,GAAQ,SAAS,OAAO,CAAC,CAAE,KAAM,EAAc,QAAQ,KAAM,CAAC,CAAC,GAEpE,CAAC,GAAuB,EAAe,GAAsB,GAAiB,CAAC,CAC5E,KAAuC,aAAa,EAAK,IAAQ,CACnE,IAAM,EAAS,GAAQ,SAAS,UAAU,EAAK,EAAI,CACnD,GAAI,IAAW,QAAa,EAAU,UAAY,KAC9C,OAEJ,IAAM,EAAU,GAAsB,CAAC,EAAK,EAAI,CAAC,CAC5C,EAAQ,cAGb,GAAiB,CACb,OAAQ,EACR,UACA,aAAc,OACd,UAAW,GACX,KAAM,CAAC,EAAK,EAAI,CAChB,cAAe,GAClB,CAAC,EACH,CAAC,GAAuB,GAAiB,CAAC,CACvC,KAAiB,aAAa,EAAK,EAAK,EAAM,OAAQ,EAAW,EAAG,EAAW,EAAG,EAAU,SAAc,CAC5G,GAAI,EAAU,UAAY,KAAM,CAC5B,IAAM,EAAO,GAAQ,QACf,EAAS,EAAU,QACnB,EAAU,OAAO,GAAQ,SAA4D,EAAhD,EAAI,OAAS,OAAS,EAAI,OAAS,OACxE,EAAU,OAAO,GAAQ,SAA4D,EAAhD,EAAI,OAAS,OAAS,EAAI,OAAS,OACxE,EAAW,OAAO,GAAQ,UAAY,EAAI,OAAS,KAAO,EAAI,OAAS,OACvE,EAAW,OAAO,GAAQ,UAAY,EAAI,OAAS,KAAO,EAAI,OAAS,OAC7E,GAAI,IAAS,MAAQ,IAAW,KAAM,CAClC,IAAI,EAAa,CACb,EAAG,EACH,EAAG,EACH,MAAO,EACP,OAAQ,EACX,CACG,EAAU,EACV,EAAU,EACd,IAAI,IAAY,QAAa,IAAY,UACrC,EAAa,EAAK,WAAW,GAAW,GAAK,EAAiB,GAAW,EAAE,EAAI,EAC3E,EAAW,QAAU,GAAK,EAAW,SAAW,GAChD,OAER,IAAM,EAAe,EAAO,uBAAuB,CAC7C,EAAQ,EAAa,MAAQ,EAAO,YAe1C,GAdI,IAAa,SACb,EAAa,CACT,GAAG,EACH,EAAG,EAAW,EAAa,KAAO,EAAU,QAAQ,WACpD,MAAO,EACV,EAED,IAAa,SACb,EAAa,CACT,GAAG,EACH,EAAG,EAAW,EAAa,IAAM,EAAU,QAAQ,UACnD,OAAQ,EACX,EAED,IAAe,OAAW,CAC1B,IAAM,EAAS,CACX,EAAG,EAAW,EAAI,EAClB,EAAG,EAAW,EAAI,EAClB,MAAO,EAAW,MAAQ,EAAI,EAC9B,OAAQ,EAAW,OAAS,EAAI,EACnC,CACG,EAAc,EAClB,IAAK,IAAI,EAAI,EAAG,EAAI,GAAe,IAC/B,GAAe,GAAQ,GAAG,MAE9B,IAAI,EAAoB,EAClB,EAA8B,IAAsB,GAAgB,EAAI,GAC1E,EAA8B,IAC9B,EAAoB,GAAwB,GAAa,EAA6B,GAAU,EAGpG,IAAI,EAAQ,EAAc,EAAQ,EAAa,KAAO,EAAkB,GAAiB,EACrF,EAAS,EAAa,MACtB,EAAO,EAAa,IAAM,GAAoB,EAC9C,EAAU,EAAa,OAAS,EAAoB,EAClD,EAAO,EAAW,MAAQ,EAAW,EAC3C,OAAQ,GAAS,OAAjB,CACI,IAAK,QACD,EAAS,EAAQ,EACjB,MACJ,IAAK,MACD,EAAQ,EAAS,EACjB,MACJ,IAAK,SACD,EAAQ,KAAK,OAAO,EAAQ,GAAU,EAAE,CAAG,EAAO,EAClD,EAAS,EAAQ,EACjB,MAER,IAAM,EAAO,EAAW,OAAS,EAAW,EAC5C,OAAQ,GAAS,OAAjB,CACI,IAAK,QACD,EAAU,EAAO,EACjB,MACJ,IAAK,MACD,EAAO,EAAU,EACjB,MACJ,IAAK,SACD,EAAO,KAAK,OAAO,EAAO,GAAW,EAAE,CAAG,EAAO,EACjD,EAAU,EAAO,EACjB,MAEJ,EAAQ,EAAO,EACf,EAAU,EAAO,EAAI,EAEhB,EAAS,EAAO,EAAI,EAAO,QAChC,EAAU,EAAO,EAAI,EAAO,MAAQ,GAEpC,EAAO,EAAO,EACd,EAAU,EAAO,EAAI,EAEhB,EAAU,EAAO,EAAI,EAAO,SACjC,EAAU,EAAO,EAAI,EAAO,OAAS,GAErC,IAAQ,YAAe,OAAO,GAAQ,UAAY,EAAM,GACxD,EAAU,GAEL,IAAQ,cACZ,OAAO,GAAQ,UAAY,GAAO,GAAc,KACjD,EAAU,IAEV,IAAY,GAAK,IAAY,KAEzB,IAAU,IACV,GAAW,EACX,GAAW,GAEf,EAAU,QAAQ,SAAS,EAAU,EAAU,QAAQ,WAAY,EAAU,EAAU,QAAQ,UAAU,MAK1H,CACC,EACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACH,CAAC,CACI,KAAsB,OAAO,GAA+B,CAC5D,KAA0B,OAAO,EAAe,CAChD,KAAgB,OAAO,EAAK,CAClC,GAAc,QAAU,GACxB,GAAkB,QAAU,EAC5B,GAAQ,QAAU,EAClB,IAAM,KAAkB,YAAY,MAAO,EAAK,EAAc,KAAS,CAEnE,GADU,EAAY,IACf,oBAAoB,WAAa,GACpC,OAEJ,IAAM,EAAe,MAAiB,CAClC,EACA,EAAS,GACT,IAAiB,SACjB,EAAI,MAAM,EACN,IAAM,QACN,EAAS,IACT,OAAO,GAAM,WACb,EAAS,KAEjB,IAAI,EAAU,EACR,MAAgB,CAClB,GAAI,GAAQ,SAAW,EAAM,CACrB,EAAU,KACV,OAAO,WAAW,EAAS,EAAQ,CAEvC,EAAU,GAAK,EAAU,EACzB,OAEJ,IAAM,EAAM,OAAO,GAAM,SAAW,EAAI,EAAS,EAAO,EACxD,GAAY,QAAQ,EAAM,EAAiB,EAAI,CAC/C,GAAW,CACP,KAAM,CAAC,EAAK,EAAI,CAChB,MAAO,CACH,EAAG,EACH,EAAG,EACH,MAAO,EACP,OAAQ,EACX,CACJ,CAAE,GAAO,GAAO,OAAO,CACxB,IAAM,EAAO,GAAkB,QAAQ,CAAC,EAAM,EAAiB,EAAI,CAAC,CAChE,EAAK,cAAgB,GAAgB,EAAK,EAAI,EAAK,WAAa,IAAQ,GAExE,OAAO,eAAiB,CACpB,GAAc,QAAQ,EAAK,EAAI,EAChC,EAAE,EAIb,GAAS,EACV,CAAC,EAAa,GAAe,EAAiB,EAAM,GAAW,CAAC,CAC7D,KAAoC,YAAa,GAAQ,CAC3D,IAAM,EAAqB,GAAQ,IAAM,oBAAoB,cAAgB,IAAoB,aACjG,GAAI,OAAO,GAAuB,SAE9B,OAAO,GADoB,GAAgB,EAAI,GAGnD,GAAI,OAAO,GAAuB,SAAU,CACxC,IAAM,EAAa,EAAU,QAAQ,EAAmB,CACxD,GAAI,GAAc,EAEd,OAAO,GADoB,GAAgB,EAAI,KAKxD,CAAC,GAAS,EAAW,GAAe,IAAoB,aAAa,CAAC,CACnE,KAA2B,QAAQ,CACnC,IAA2B,QAAQ,CACnC,KAAqB,aAAa,EAAM,IAAQ,CAClD,GAAM,CAAC,EAAK,GAAO,EACnB,OAAO,GAAqB,GAAa,EAAY,IAAM,cAAe,IAAsB,EAAI,CAAE,EAAK,cAAc,EAC1H,CAAC,EAAqB,EAAa,GAAY,CAAC,CAC7C,KAAqB,YAAa,GAAS,CAC7C,IAAM,EAAa,GAAa,MAAQ,EAAK,QAAU,EAAK,QACtD,EAAa,GAAc,KAAc,QACzC,EAAa,GAAc,IAAiB,QAC5C,CAAC,EAAK,GAAO,EAAK,SAClB,EAAkB,EAAc,QAChC,EAAe,EAAc,KAC7B,CAAC,EAAS,GAAW,EAAc,SAAS,MAAQ,EAAE,CAE5D,GAAI,EAAK,OAAS,OAGd,IAFA,EAAmB,QAAU,OAC7B,GAAwB,QAAU,CAAC,EAAK,EAAI,CACxC,IAAQ,GAAK,GAAe,CAC5B,GAAK,KAAyB,IAAQ,IAAQ,GAC1C,KAAe,UACf,KAAc,OACd,OACJ,IAAM,EAAa,GAAsB,EAAK,SAAS,CACvD,GAAI,EAAW,OAAS,GAAkB,OACtC,OAEJ,GAAI,KAAe,OAAW,CAC1B,IAAM,EAAW,GAAgB,EAAW,CAC5C,GAAO,GAAU,OAAS,GAAkB,OAAO,CACnD,IAAM,EAAY,GAAU,UAAU,CAClC,GAAG,EACH,KAAM,EACN,KAAM,EAAK,YACX,KAAM,EAAK,YACX,OAAQ,EAAK,OACb,MAAO,GAAa,EAAY,EAAK,SAAS,CAC9C,mBAAsB,OACzB,CAAC,CACF,GAAI,IAAc,QAAa,EAAU,UAAY,EAAW,QAC5D,OAER,EAAW,OAAU,CACrB,IAAO,CACP,IAAM,EAAa,EAAa,SAAS,EAAI,CACvC,EAAkB,GAAmB,QAC3C,GAAI,KAAc,UACb,EAAK,UAAY,EAAK,cAAgB,KACvC,IAAoB,QACpB,EAAa,SAAS,EAAgB,CAAE,CACxC,IAAM,EAAW,CAAC,KAAK,IAAI,EAAiB,EAAI,CAAE,KAAK,IAAI,EAAiB,EAAI,CAAG,EAAE,CACjF,GAAc,KAAqB,QACnC,GAAgB,OAAW,EAAU,GAAK,CAG1C,GAAgB,EAAiB,oBAAoB,EAAS,CAAE,OAAW,EAAW,MAGrF,GAAc,EAAK,SAAW,KAAqB,QACpD,EACA,GAAgB,EAAa,OAAO,EAAI,CAAE,OAAW,GAAK,EAG1D,GAAgB,OAAW,EAAK,GAAK,CACrC,GAAmB,QAAU,GAG5B,GAAc,EAAa,SAAW,EAC3C,GAAgB,EAAiB,OAAO,CAAE,OAAW,EAAW,EAGhE,GAAgB,EAAiB,oBAAoB,EAAI,CAAE,OAAW,EAAW,CACjF,GAAmB,QAAU,WAG5B,GAAO,GAAmB,IAAwB,IAAQ,EAE1D,GADsB,GAA4B,EAAI,EACtB,EAAI,SAGrC,IAAY,GAAO,IAAY,EAAK,CACpC,IAAM,EAAO,GAAsB,EAAK,SAAS,CAC3C,EAAW,GAAgB,EAAK,CACtC,GAAI,GAAU,WAAa,OAAW,CAClC,IAAI,EAAY,GAUhB,GATA,EAAS,SAAS,CACd,GAAG,EACH,OACA,KAAM,EAAK,YACX,KAAM,EAAK,YACX,OAAQ,EAAK,OACb,mBAAuB,EAAY,GACnC,MAAO,GAAa,EAAM,EAAK,SAAS,CAC3C,CAAC,CACE,EACA,OAGR,IAAM,EAAkB,IAAiB,IAAQ,EAC3C,EAAwB,IAAiB,IAAkB,QAAa,EAAc,SAAS,KAAK,KAAO,EACjH,IAAK,EAAK,UAAY,EAAK,cAAgB,KACvC,IAAY,QACZ,IAAY,QACZ,EAAc,UAAY,QAC1B,CAAC,EAAuB,CACxB,GAAI,EAGA,OAEJ,IAAM,EAAO,KAAK,IAAI,EAAK,EAAQ,CAC7B,EAAQ,KAAK,IAAI,EAAK,EAAQ,CAC9B,EAAM,KAAK,IAAI,EAAK,EAAQ,CAC5B,EAAS,KAAK,IAAI,EAAK,EAAQ,CACrC,GAAW,CACP,GAAG,EAAc,QACjB,MAAO,CACH,EAAG,EACH,EAAG,EACH,MAAO,EAAQ,EAAO,EACtB,OAAQ,EAAS,EAAM,EAC1B,CACJ,CAAE,GAAM,EAAY,QAAQ,CAC7B,GAAmB,QAAU,OAC7B,IAAO,MAGP,GAAW,CACP,KAAM,CAAC,EAAK,EAAI,CAChB,MAAO,CAAE,EAAG,EAAK,EAAG,EAAK,MAAO,EAAG,OAAQ,EAAG,CACjD,CAAE,GAAM,EAAY,QAAQ,CAC7B,GAAmB,QAAU,OAC7B,EAAW,OAAU,CACrB,IAAO,UAKd,EAAK,OAAS,SAGnB,GAFA,GAAwB,QAAU,CAAC,EAAK,EAAI,CAC5C,EAAW,OAAU,CACjB,IAAiB,IAAQ,EACzB,GAAmB,QAAU,OAC7B,EAAmB,QAAU,OACzB,KAAc,UACV,EAAa,SAAW,EAIxB,GAAgB,EAAiB,OAAO,CAAE,OAAW,EAAW,CAHhE,GAAgB,EAAiB,oBAAoB,CAAC,EAAG,EAAK,CAAC,CAAE,OAAW,EAAW,CAK3F,IAAO,MAGV,CACD,IAAM,EAAU,EAAmB,QACnC,GAAI,IAAiB,UAChB,EAAK,UAAY,EAAK,cAAgB,KACvC,IAAY,QACZ,EAAgB,SAAS,EAAQ,CAAE,CACnC,IAAM,EAAW,CAAC,KAAK,IAAI,EAAS,EAAI,CAAE,KAAK,IAAI,EAAS,EAAI,CAAG,EAAE,CACjE,EACA,GAAmB,OAAW,EAAU,EAAW,CAGnD,GAAmB,EAAiB,oBAAoB,EAAS,CAAE,OAAW,EAAW,MAGxF,GACD,EAAgB,SAAS,EAAI,CAC7B,GAAmB,EAAgB,OAAO,EAAI,CAAE,OAAW,EAAW,CAGtE,GAAmB,OAAW,EAAK,EAAW,CAElD,EAAmB,QAAU,GAExB,IAAiB,SACtB,GAAmB,EAAiB,oBAAoB,EAAI,CAAE,OAAW,EAAW,CACpF,EAAmB,QAAU,GAEjC,GAAmB,QAAU,OAC7B,IAAO,MAGN,EAAK,sBACV,GAAwB,QAAU,CAAC,EAAK,EAAI,CAEvC,EAAK,wBAA4B,CAAC,EAAK,mBAC5C,GAAiB,GAAoB,GAAM,CAC3C,EAAW,OAAU,CACrB,IAAO,CACP,MAAsB,CACtB,GAAmB,QAAU,OAC7B,EAAmB,QAAU,SAElC,CACC,GACA,EACA,GACA,GACA,GACA,GACA,EACA,GACA,GACA,GACA,GACA,EACA,GACA,GACA,GACA,EACA,GACA,GACA,GACA,GACA,GACA,GACH,CAAC,CACI,KAAiC,OAAO,GAAM,CAC9C,KAAgC,QAAQ,CACxC,KAAsB,OAAO,GAAc,CAC3C,KAAsB,QAAQ,CAC9B,KAAoB,YAAa,GAAS,CAG5C,GAFA,GAAY,QAAU,GACtB,GAAc,QAAU,GAAiB,QACrC,EAAK,SAAW,GAAK,EAAK,SAAW,EAAG,CACxC,GAAc,QAAU,OACxB,OAEJ,IAAM,EAAO,YAAY,KAAK,CAC9B,GAAc,QAAU,CACpB,OAAQ,EAAK,OACb,OACA,SAAU,EAAK,SAClB,CACG,GAAM,OAAS,WACf,GAAyB,QAAU,IAEvC,IAAM,EAAK,EAAK,OAAS,QAAU,EAAK,aACpC,CAAC,GAAM,EAAK,OAAS,QAAU,EAAK,SAExC,EAAc,CACV,kBAAmB,EACnB,WAAY,EACf,CAAC,CACF,GAAwB,QAAU,OAC9B,CAAC,EAAK,SAAW,EAAK,SAAW,GAAK,CAAC,EACvC,GAAa,EAAK,CAEb,CAAC,EAAK,SAAW,EAAK,SAAW,IACtC,GAAwB,QAAU,EAAK,YAE5C,CAAC,EAAe,GAAa,CAAC,CAC3B,CAAC,GAAa,MAAwB,UAAU,CAChD,KAAmC,YAAa,GAAS,CAC3D,GAAI,EAAK,uBAA4B,IAAiB,QAClD,OAEJ,IAAM,EAAa,GAAa,MAAQ,EAAK,QAAU,EAAK,QACtD,CAAC,GAAO,EAAK,SACb,EAAkB,EAAc,QACtC,GAAI,EAAM,EACN,OACJ,IAAM,EAAS,EAAY,GACvB,EAAQ,EACR,EAAM,EACV,IAAK,IAAI,EAAI,EAAM,EAAG,GAAK,GAClB,GAAa,EAAO,MAAO,EAAY,GAAG,MAAM,CADb,IAGxC,IAEJ,IAAK,IAAI,EAAI,EAAM,EAAG,EAAI,EAAY,QAC7B,GAAa,EAAO,MAAO,EAAY,GAAG,MAAM,CADX,IAG1C,IAGJ,GADA,IAAO,CACH,EACA,GAAI,EAAgB,OAAO,CAAC,EAAO,EAAM,EAAE,CAAC,CAAE,CAC1C,IAAI,EAAS,EACb,IAAK,IAAI,EAAQ,EAAO,GAAS,EAAK,IAClC,EAAS,EAAO,OAAO,EAAM,CAEjC,GAAmB,EAAQ,OAAW,EAAW,MAGjD,GAAmB,OAAW,CAAC,EAAO,EAAM,EAAE,CAAE,EAAW,MAI/D,GAAmB,EAAiB,oBAAoB,CAAC,EAAO,EAAM,EAAE,CAAC,CAAE,OAAW,EAAW,EAEtG,CAAC,EAAc,GAAO,EAAc,QAAS,EAAa,EAAiB,GAAmB,CAAC,CAC5F,KAAoB,OAAO,GAAM,CACjC,KAAyB,YAAY,KAAO,IAAQ,CACtD,GAAI,KAAyB,QAAa,KAAmB,OAAW,CACpE,IAAM,EAAQ,GAAiB,QAAQ,EACjC,EAAM,GAAiB,QAAQ,OACjC,EAAQ,GAAqB,CAC7B,EAAG,EACH,EAAG,EACH,MAAO,EACP,OAAQ,KAAK,IAAI,EAAK,EAAO,EAAM,CACtC,CAAE,GAAmB,QAAQ,OAAO,CACjC,OAAO,GAAU,WACjB,EAAQ,MAAM,GAAO,EAEzB,IAAM,EAAW,GAAQ,EAAM,GAEzB,EADY,SAAS,cAAc,SAAS,CAC5B,WAAW,KAAM,CAAE,MAAO,GAAO,CAAC,CACxD,GAAI,IAAQ,KAAM,CACd,EAAI,KAAO,GAAY,aACvB,IAAM,EAAS,GAAc,EAAK,GAAa,EAAU,EAAG,EAAO,GAAgB,GAAgB,GAAO,GAAgB,CAC1H,KAAiB,EAAU,EAAO,MAAO,EAAK,EAAO,MAAM,IAGpE,CACC,GACA,GACA,GACA,GACA,GACA,GACA,EACA,EACA,GACH,CAAC,CACI,CAAC,GAAW,MAAsB,UAAU,CAC5C,KAAoB,YAAY,MAAO,EAAmB,IAAqB,CACjF,IAAM,EAAe,EAAkB,SAAS,MAChD,GAAI,IAAiB,QACjB,KAAyB,QACzB,EAAiB,UAAY,OAC7B,OAEJ,IAAM,EAAe,EAAiB,QAAQ,MAC9C,GAAI,IAAkB,OAAW,CAC7B,IAAI,EAAW,GAMf,GALA,EAAc,CACV,gBAAiB,CAAE,GAAG,EAAc,EAAG,EAAa,EAAI,EAAiB,CACzE,cAAe,CAAE,GAAG,EAAc,EAAG,EAAa,EAAI,EAAiB,CACvE,mBAAuB,EAAW,GACrC,CAAC,CACE,EACA,OAER,IAAI,EAAQ,GAAqB,EAAc,GAAmB,QAAQ,OAAO,CAC7E,OAAO,GAAU,WACjB,EAAQ,MAAM,GAAO,EACzB,IAAM,EAAU,EAEV,EAAe,EAAE,CACvB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAa,MAAO,IACpC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAa,OAAQ,IAAK,CAC1C,IAAM,EAAO,CAAC,EAAa,EAAI,EAAG,EAAa,EAAI,EAAE,CACrD,GAAI,GAAa,EAAM,EAAa,CAChC,SACJ,IAAM,EAAc,EAAQ,EAAI,EAAa,QAAQ,EAAI,EAAa,OAClE,EAAgB,EAAY,EAAI,CAAC,GAAgB,EAAY,EAEjE,EAAa,KAAK,CACd,SAAU,EACV,MAAO,CAAE,GAAG,EAAa,CAC5B,CAAC,CAGV,GAAqB,EAAa,CAClC,GAAQ,SAAS,OAAO,EAAa,IAAI,IAAM,CAC3C,KAAM,EAAE,SACX,EAAE,CAAC,EACL,CAAC,GAAsB,GAAsB,EAAe,EAAgB,CAAC,CAC1E,KAAkB,gBAAkB,CAClC,EAAc,UAAY,QAAa,EAAc,QAAQ,MAAM,OAAS,GAY3E,GAVqB,CACtB,GAAG,EACH,QAAS,CACL,GAAG,EAAc,QACjB,MAAO,CACH,GAAG,EAAc,QAAQ,MACzB,MAAO,EACV,CACJ,CACJ,CACmC,EAAc,EACnD,CAAC,GAAa,EAAc,CAAC,CAC1B,KAAiB,gBAAkB,CACjC,EAAc,UAAY,QAAa,EAAc,QAAQ,MAAM,QAAU,GAY5E,GAVqB,CACtB,GAAG,EACH,QAAS,CACL,GAAG,EAAc,QACjB,MAAO,CACH,GAAG,EAAc,QAAQ,MACzB,OAAQ,EACX,CACJ,CACJ,CACmC,EAAc,EACnD,CAAC,GAAa,EAAc,CAAC,CAC1B,KAAkB,aAAa,EAAM,IAAc,CACrD,IAAM,EAAQ,EAKd,GAJA,EAAc,OAAU,CACxB,GAAuB,OAAU,CACjC,GAAa,OAAU,CACvB,GAAyB,QAAU,GAC/B,EACA,OACJ,GAAI,GAAO,aAAe,IACtB,EAAc,UAAY,QAC1B,EAAM,mBAAmB,UAAY,OAAW,CAChD,GAAI,KAAwB,OACxB,OACJ,IAAM,EAAW,CACb,GAAG,EACH,QAAS,CACL,GAAG,EAAc,QACjB,MAAO,GAAa,EAAM,kBAAkB,QAAQ,MAAO,GAAoB,CAClF,CACJ,CACI,GAAY,EAAM,kBAAmB,EAAS,CACnD,GAAiB,EAAU,GAAK,CAChC,OAEJ,GAAM,CAAC,EAAK,GAAO,EAAK,SAClB,CAAC,EAAkB,GAAoB,GAAwB,SAAW,EAAE,CAC5E,MAAuB,CACzB,GAAY,QAAU,IAEpB,EAAoB,GAAM,CAC5B,IAAM,EAAe,EAAE,SAAY,IAAqB,GAAO,IAAqB,EAOpF,GANI,GACA,IAAgB,CAAC,EAAM,EAAiB,EAAI,CAAE,CAC1C,GAAG,EACH,iBACH,CAAC,CAEF,EAAE,SAAW,EACb,MAAO,CAAC,GAAY,QACxB,GAAI,CAAC,GAAY,QAAS,CACtB,IAAM,EAAI,GAAsB,EAAK,SAAS,CACxC,EAAI,GAAgB,EAAE,CAC5B,GAAI,IAAM,QAAa,EAAE,UAAY,QAAa,EAAc,CAC5D,IAAM,EAAS,EAAE,QAAQ,CACrB,GAAG,EACH,KAAM,EACN,KAAM,EAAE,YACR,KAAM,EAAE,YACR,OAAQ,EAAE,OACV,MAAO,GAAa,EAAG,EAAK,SAAS,CACrC,iBACH,CAAC,CACE,IAAW,QAAa,CAAC,EAAgB,EAAO,EAAI,EAAmB,EAAO,GAC9E,GAAqB,CAAC,CAAE,SAAU,EAAE,SAAU,MAAO,EAAQ,CAAC,CAAC,CAC/D,GAAQ,SAAS,OAAO,CACpB,CACI,KAAM,EAAE,SACX,CACJ,CAAC,EAGV,GAAI,GAAY,SAAW,EAAc,UAAY,OACjD,MAAO,GACX,IAAI,EAAiB,GACrB,OAAQ,EAAE,4BAA8B,GAAxC,CACI,IAAK,eACL,IAAK,eAAgB,CACjB,GAAI,GAAO,mBAAmB,SAAS,OAAS,OAC5C,MACJ,GAAM,CAAC,EAAa,GAAe,EAAc,QAAQ,KACnD,CAAC,EAAS,GAAW,EAAM,kBAAkB,QAAQ,KAE3D,EAD0B,IAAQ,GAAe,IAAQ,GAAW,IAAQ,GAAe,IAAQ,IAG1F,EAAE,gBAAkB,IAAQ,KAA2B,gBAChE,MAEJ,IAAK,eACD,EAAiB,GACjB,MAGR,GAAI,EAGA,OAFA,IAAkB,CAAC,EAAM,EAAiB,EAAI,CAAC,CAC/C,GAAS,EAAE,OAAQ,GAAM,CAClB,GAGf,MAAO,IAEL,EAAgB,EAAK,SAAS,GAAK,EACzC,GAAI,EAAK,QAAS,CACd,IAAM,EAAK,GAAiB,QACtB,EAAU,GAAc,QAC9B,GAAI,EAAG,IAAM,EAAQ,GAAK,EAAG,IAAM,EAAQ,EAEvC,OAGJ,GAAI,EAAK,cAAgB,OACjB,EAAK,OAAS,QAAU,GAAc,EAAc,SAAS,KAAM,EAAK,SAAS,CAAE,CACnF,IAAoB,CAAC,EAAe,EAAK,SAAS,GAAG,CAAE,CACnD,GAAG,EACH,iBACH,CAAC,CACF,eAEK,EAAK,OAAS,UAAY,EAAc,QAAQ,SAAS,EAAI,CAAE,CACpE,KAAsB,EAAe,CAAE,GAAG,EAAM,iBAAgB,CAAC,CACjE,eAEK,EAAK,sBAA0B,CACpC,GAAI,EAAgB,EAChB,OAEJ,IAA2B,EAAe,CAAE,GAAG,EAAM,iBAAgB,CAAC,CACtE,QAGJ,EAAK,OAAS,OAET,EAAiB,EAAK,EACvB,GAAa,EAAK,CAGjB,EAAK,sBACV,KAAuB,EAAe,CAAE,GAAG,EAAM,iBAAgB,CAAC,EAG9D,EAAK,iBACL,IAAkB,EAAe,CAC7B,GAAG,EACH,iBACH,CAAC,CAEN,GAAa,EAAK,EAEtB,OAEJ,GAAI,EAAK,OAAS,SAAU,CACxB,GAAI,EAAgB,EAChB,OAEA,EAAK,OACD,EAAK,gBAAkB,IAClB,GAAiB,EAAI,CAGzB,EAAK,SAAW,GAAK,IAAQ,GAAoB,IAAQ,GAC9D,IAAkB,EAAe,CAAE,GAAG,EAAM,iBAAgB,CAAC,CAGrE,GAAI,EAAK,sBAA0B,CAC/B,GAAI,EAAgB,EAChB,OAEA,EAAK,SAAW,GAAK,IAAQ,GAAoB,IAAQ,IACzD,KAAuB,EAAe,CAAE,GAAG,EAAM,iBAAgB,CAAC,CAC7D,GAAY,SACb,GAA2B,EAAK,EAIxC,EAAK,OAAS,SAAW,EAAK,SAAW,GAAK,EAAK,SAAW,IAC9D,EAAiB,EAAK,CAE1B,GAAwB,QAAU,QACnC,CACC,EACA,EACA,EACA,GACA,GACA,GACA,EACA,GACA,GACA,GACA,GACA,GACA,EACA,GACA,EACA,GACA,EACA,GACA,GACA,EACA,GACA,GACH,CAAC,CACI,KAAwB,YAAa,GAAS,CAChD,IAAM,EAAI,CACN,GAAG,EACH,SAAU,CAAC,EAAK,SAAS,GAAK,EAAiB,EAAK,SAAS,GAAG,CACnE,CACD,KAAc,EAAE,CACZ,IAAe,QAAa,EAAK,UAAY,IAC7C,EAAc,OAAU,CACxB,GAAuB,OAAU,CACjC,GAAa,OAAU,CACvB,GAAyB,QAAU,IAEvC,GAAa,GACL,GAAyB,QAClB,CAAC,EAAK,WAAW,GAAI,EAAE,CAC9B,EAAK,WAAW,KAAO,IAAK,IAAM,EAAK,WAAW,KAAO,EAAG,GACrD,EACJ,IAAe,SAAc,GAAc,SAAS,SAAS,IAAM,GAAK,EACzE,OACA,EAAK,WACb,EACH,CAAC,EAAY,GAAa,EAAgB,CAAC,CACxC,KAA+B,aAAa,EAAK,IAAmB,CACtE,KAAoB,EAAM,EAAiB,EAAe,EAC3D,CAAC,GAAmB,EAAgB,CAAC,CAClC,GAAc,GAAe,SAAS,KACtC,KAAmC,aAAa,EAAQ,EAAa,EAAc,EAAc,EAAI,IAAO,CAC9G,GAAgB,QAAU,GAC1B,IAAI,EAAW,GACX,IAAa,SACb,EAAW,CAAC,EAAS,GAAK,EAAiB,EAAS,GAAG,EAE3D,IAAM,EAAe,KAAkB,EACjC,OACA,CACE,EAAG,EACH,EAAG,EAAO,EACV,MAAO,GACP,OAAQ,EAAO,OAClB,CACC,EAAgB,EAAE,CACpB,IAAiB,QACjB,EAAc,KAAK,EAAa,CAChC,GAAqB,IACrB,EAAc,KAAK,CACf,EAAG,EAAO,EAAI,EACd,EAAG,EAAO,GACV,MAAO,EAAO,MACd,OAAQ,GACX,CAAC,CACE,GAAgB,GAChB,EAAc,KAAK,CACf,EAAG,EACH,EAAG,EAAO,GACV,MAAO,GACP,OAAQ,GACX,CAAC,EAGV,IAAM,EAAY,CACd,EAAG,EAAO,EAAI,EACd,EAAG,EAAO,EACV,MAAO,EAAO,MACd,OAAQ,IAAwB,EAAO,EAAI,EAAO,QAAU,EAAO,EAAO,OAAS,EAAI,EAAO,OAC9F,KACA,KACA,OAAQ,CACJ,WACA,eACA,gBACH,CACJ,CACD,GAAiB,QAAU,EAC3B,GAAiB,EAAU,CAC3B,GAAc,CAAC,EAAa,EAAc,EAAa,CAAC,CACxD,KAAyB,EAAW,EAAU,GAAI,EAAU,GAAI,EAAU,OAAO,EAClF,CACC,GACA,EACA,GACA,EACA,GACA,GACA,GACA,GACH,CAAC,CACI,GAAoB,GAAY,KAAqB,aAAa,EAAY,IAAa,CAC7F,KAAgB,EAAa,EAAiB,EAAW,EAAgB,CACrE,IAAiB,QACjB,GAAmB,EAAiB,oBAAoB,EAAS,CAAE,OAAW,GAAK,EAExF,CAAC,EAAc,GAAe,EAAiB,GAAmB,CAAC,CAAC,CACjE,KAA2B,OAAO,GAAM,CACxC,KAAwB,YAAa,GAAS,CAChD,GAAI,EAAK,SAAS,KAAO,GAAK,EAAkB,EAAG,CAC/C,EAAK,gBAAgB,CACrB,OAEJ,IAAc,CACV,GAAG,EACH,SAAU,CAAC,EAAK,SAAS,GAAK,EAAiB,EAAK,SAAS,GAAG,CACnE,CAAC,CACG,EAAK,kBAAkB,GACxB,GAAmB,QAAU,IAEjC,EAAc,OAAU,EACzB,CAAC,EAAa,EAAgB,CAAC,CAC5B,KAAkB,gBAAkB,CACtC,GAAmB,QAAU,IAC9B,EAAE,CAAC,CACA,KAAmB,QAAQ,CAC3B,KAA0B,YAAa,GAAS,CAE9C,OAAuB,EAAM,GAAW,QAAQ,GAEpD,GAAW,QAAU,EACjB,MAAe,SAAS,SAAW,QAAa,GAAc,QAAQ,QAAU,IAEpF,IAAI,EAAK,UAAY,GACjB,IAAe,QACf,GAAc,SAAS,SAAS,KAAO,GACvC,EAAK,SAAS,KAAO,GACrB,IAAoB,GACpB,KAAc,SACd,EAAW,mBACX,CAAC,EAAW,kBAAkB,KAAK,SAAS,GAAc,QAAQ,SAAS,GAAG,EAC9E,EAAc,KAAK,SAAS,GAAc,QAAQ,SAAS,GAAG,CAAE,CAChE,IAAM,EAAQ,KAAK,IAAI,GAAc,QAAQ,SAAS,GAAI,EAAK,SAAS,GAAG,CACrE,EAAM,KAAK,IAAI,GAAc,QAAQ,SAAS,GAAI,EAAK,SAAS,GAAG,CAAG,EAC5E,GAAgB,EAAiB,oBAAoB,CAAC,EAAO,EAAI,CAAC,CAAE,OAAW,GAAM,CAEzF,GAAI,EAAK,UAAY,GACjB,IAAe,QACf,EAAc,UAAY,QAC1B,CAAC,GAAmB,SACpB,CAAC,GAAyB,UACzB,KAAgB,QAAU,KAAgB,cAAe,CAC1D,GAAM,CAAC,EAAa,GAAe,EAAc,QAAQ,KAErD,CAAC,EAAK,GAAO,EAAK,SAItB,GAHI,EAAM,IACN,EAAM,GAAiB,QAAQ,GAE/B,EAAW,aAAe,IAAQ,EAAW,mBAAmB,UAAY,OAAW,CACvF,IAAM,EAAY,EAAW,kBAAkB,QAAQ,MACvD,EAAM,KAAK,IAAI,EAAK,GAAuB,EAAO,EAAI,EAAK,CAE3D,GADa,GAAe,EAAW,EAAK,EAAK,GAAsB,CAC3C,KAE3B,CAED,GADiC,IAAwB,IAAgB,EAErE,OAEJ,GAD8B,IAAwB,IAAQ,EAE1D,GAAI,EAAK,uBACL,SAEA,OAER,EAAM,KAAK,IAAI,EAAK,EAAgB,CACpC,IAAM,EAAS,EAAM,EACf,EAAS,EAAM,EACf,EAAW,CACb,EAAG,GAAU,EAAI,EAAc,EAC/B,EAAG,GAAU,EAAI,EAAc,EAC/B,MAAO,KAAK,IAAI,EAAO,CAAG,EAC1B,OAAQ,KAAK,IAAI,EAAO,CAAG,EAC9B,CACD,GAAW,CACP,GAAG,EAAc,QACjB,MAAO,EACV,CAAE,GAAM,GAAO,OAAO,EAG/B,KAAgB,CAAE,GAAG,EAAM,SAAU,CAAC,EAAK,SAAS,GAAK,EAAiB,EAAK,SAAS,GAAG,CAAE,CAAC,GAC/F,CACC,GACA,EACA,EACA,GACA,EACA,GACA,GACA,GACA,GACA,EACA,GACH,CAAC,CA2BF,GAAc,GAAW,IA1Ba,gBAAkB,CACpD,IAAM,EAAO,GAAW,QACxB,GAAI,IAAS,OACT,OACJ,GAAM,CAAC,EAAM,GAAQ,EAAK,WACtB,CAAC,EAAK,GAAO,EAAK,SAChB,EAAU,GAAiB,QAC7B,IAAS,GACT,EAAM,EAAQ,QAAQ,cAAc,GAAK,EAAQ,EAE5C,IAAS,IACd,EAAM,EAAQ,EAAI,EAAQ,OAE1B,IAAS,GACT,EAAM,KAAK,IAAI,EAAG,EAAQ,EAAE,CAEvB,IAAS,IACd,EAAM,KAAK,IAAI,EAAO,EAAG,EAAQ,EAAI,EAAQ,OAAO,EAExD,iBAAY,EAAK,EAAG,EAAY,OAAS,EAAE,CAC3C,iBAAY,EAAK,EAAG,EAAO,EAAE,CAC7B,GAAkB,CACd,GAAG,EACH,SAAU,CAAC,EAAK,EAAI,CACvB,CAAC,EACH,CAAC,EAAY,OAAQ,GAAmB,EAAK,CAAC,CACW,CAG5D,IAAM,KAAwB,YAAa,GAAc,CACrD,GAAI,EAAc,UAAY,OAC1B,OACJ,GAAM,CAAC,EAAG,GAAK,EACT,CAAC,EAAK,GAAO,EAAc,QAAQ,KACnC,EAAM,EAAc,QAAQ,MAC9B,EAAO,EAAI,EACX,EAAQ,EAAI,EAAI,EAAI,MACpB,EAAM,EAAI,EACV,EAAS,EAAI,EAAI,EAAI,OAEzB,GAAI,IAAM,EACN,OAAQ,EAAR,CACI,IAAK,GAED,EAAS,EACT,EAAM,EACN,GAAS,EAAG,EAAQ,WAAW,CAC/B,MAEJ,IAAK,GAED,EAAM,EACN,EAAS,EAAM,EACf,GAAS,EAAG,EAAK,WAAW,CAC5B,MAEJ,IAAK,GAEG,EAAM,GACN,IACA,GAAS,EAAG,EAAK,WAAW,GAG5B,EAAS,KAAK,IAAI,EAAM,EAAS,EAAE,CACnC,GAAS,EAAG,EAAQ,WAAW,EAEnC,MAEJ,IAAK,GAEG,EAAS,EAAM,GACf,IACA,GAAS,EAAG,EAAQ,WAAW,GAG/B,EAAM,KAAK,IAAI,EAAG,EAAM,EAAE,CAC1B,GAAS,EAAG,EAAK,WAAW,EAEhC,MAEJ,QACI,GAAY,EAAE,CAI1B,GAAI,IAAM,EACN,GAAI,IAAM,EACN,EAAQ,EAAY,OACpB,EAAO,EACP,GAAS,EAAQ,EAAI,EAAiB,EAAG,aAAa,SAEjD,IAAM,GACX,EAAO,EACP,EAAQ,EAAM,EACd,GAAS,EAAO,EAAiB,EAAG,aAAa,KAEhD,CACD,IAAI,EAAa,EAAE,CACnB,GAAI,KAAyB,OAAW,CACpC,IAAM,EAAQ,GAAqB,CAC/B,EAAG,EACH,EAAG,EACH,MAAO,EAAQ,EAAO,EACtB,OAAQ,EAAS,EACpB,CAAE,GAAmB,QAAQ,OAAO,CACjC,OAAO,GAAU,WACjB,EAAa,GAAa,EAAM,EAGxC,GAAI,IAAM,EAAG,CAET,IAAI,EAAO,GACX,GAAI,EAAO,EAAK,CACZ,GAAI,EAAW,OAAS,EAAG,CACvB,IAAM,iBAAe,EAAO,EAAG,EAAM,EAAE,CAAC,KAAK,GAAK,CAAC,EAAW,SAAS,EAAI,EAAgB,CAAC,CACxF,IAAW,SACX,EAAO,EACP,EAAO,SAIX,IACA,EAAO,GAEP,GACA,GAAS,EAAM,EAAG,aAAa,CAElC,IACD,EAAQ,KAAK,IAAI,EAAY,OAAQ,EAAQ,EAAE,CAC/C,GAAS,EAAQ,EAAI,EAAiB,EAAG,aAAa,UAGrD,IAAM,GAAI,CAEf,IAAI,EAAO,GACX,GAAI,EAAQ,EAAM,EAAG,CACjB,GAAI,EAAW,OAAS,EAAG,CACvB,IAAM,iBAAe,EAAQ,EAAG,EAAK,GAAG,CAAC,KAAK,GAAK,CAAC,EAAW,SAAS,EAAI,EAAgB,CAAC,CACzF,IAAW,SACX,EAAQ,EACR,EAAO,SAIX,IACA,EAAO,GAEP,GACA,GAAS,EAAQ,EAAiB,EAAG,aAAa,CAErD,IACD,EAAO,KAAK,IAAI,EAAiB,EAAO,EAAE,CAC1C,GAAS,EAAO,EAAiB,EAAG,aAAa,OAIrD,GAAY,EAAE,CAI1B,GAAW,CACP,KAAM,EAAc,QAAQ,KAC5B,MAAO,CACH,EAAG,EACH,EAAG,EACH,MAAO,EAAQ,EACf,OAAQ,EAAS,EACpB,CACJ,CAAE,GAAM,GAAO,kBAAkB,EACnC,CAAC,GAAsB,EAAe,EAAY,OAAQ,EAAiB,EAAM,GAAU,GAAW,CAAC,CACpG,KAA2B,aAAa,EAAK,EAAK,EAAwB,IAAa,CACzF,IAAM,EAAS,IAAe,EAAyB,EAAI,GAG3D,GAFA,iBAAY,EAAK,EAAiB,GAAQ,OAAS,EAAI,EAAgB,CACvE,iBAAY,EAAK,EAAG,EAAO,CACvB,IAAQ,KAAc,IAAM,IAAQ,KAAc,GAClD,MAAO,GACX,GAAI,GAAY,EAAc,UAAY,OAAW,CACjD,IAAM,EAAW,CAAC,GAAG,EAAc,QAAQ,WAAW,EAClD,EAAc,QAAQ,MAAM,MAAQ,GAAK,EAAc,QAAQ,MAAM,OAAS,IAC9E,EAAS,KAAK,EAAc,QAAQ,MAAM,CAE9C,GAAiB,CACb,GAAG,EACH,QAAS,CACL,KAAM,CAAC,EAAK,EAAI,CAChB,MAAO,CAAE,EAAG,EAAK,EAAG,EAAK,MAAO,EAAG,OAAQ,EAAG,CAC9C,WAAY,EACf,CACJ,CAAE,GAAK,MAGR,GAAW,CACP,KAAM,CAAC,EAAK,EAAI,CAChB,MAAO,CAAE,EAAG,EAAK,EAAG,EAAK,MAAO,EAAG,OAAQ,EAAG,CACjD,CAAE,GAAM,GAAO,eAAe,CAMnC,OAJI,EAAS,UAAY,QAAa,EAAS,QAAQ,KAAO,GAAO,EAAS,QAAQ,KAAO,IACzF,EAAS,QAAU,QAEvB,GAAS,EAAM,EAAiB,EAAI,CAC7B,IACR,CACC,GACA,EACA,GAAQ,OACR,GACA,EACA,GACA,GACA,GACH,CAAC,CACI,KAAwB,aAAa,EAAU,IAAa,CAC1D,GAAS,OAAS,QAAa,IAAa,QAAa,EAAmB,EAAS,GACrF,GAAqB,CAAC,CAAE,SAAU,EAAQ,KAAM,MAAO,EAAU,CAAC,CAAC,CACnE,OAAO,0BAA4B,CAC/B,GAAQ,SAAS,OAAO,CACpB,CACI,KAAM,EAAQ,KACjB,CACJ,CAAC,EACJ,EAEN,GAAM,GAAK,CACX,EAAW,OAAU,CACrB,GAAM,CAAC,EAAM,GAAQ,EACrB,GAAI,EAAc,UAAY,SAAc,IAAS,GAAK,IAAS,GAAI,CACnE,IAAM,EAAuB,EAAc,QAAQ,KAAK,KAAO,GAAc,GAAK,IAAa,OAC/F,kBAAyB,EAAc,QAAQ,KAAK,GAAK,EAAM,EAAG,EAAY,OAAS,EAAE,gBAAQ,EAAc,QAAQ,KAAK,GAAK,EAAM,EAAG,GAAc,EAAE,CAAE,EAAsB,GAAM,CAE5L,IAAoB,EAAU,EAAS,EACxC,CACC,GAAS,KACT,GACA,EACA,EACA,GACA,GACA,GACA,EAAY,OACf,CAAC,CACI,KAAkB,YACb,eAAe,OACvB,EAAE,CAAC,CACA,KAAoB,YAAa,GAAM,CACzC,IAAO,CACP,IAAM,EAAW,EAAE,CACnB,IAAK,IAAI,EAAI,EAAE,EAAG,EAAI,EAAE,EAAI,EAAE,MAAO,IACjC,IAAK,IAAI,EAAI,EAAE,EAAG,EAAI,EAAE,EAAI,EAAE,OAAQ,IAAK,CACvC,IAAM,EAAY,EAAe,CAAC,EAAI,EAAiB,EAAE,CAAC,CAC1D,GAAI,CAAC,EAAU,cAAgB,EAAU,OAAS,EAAa,QAC3D,SACJ,IAAI,EACJ,GAAI,EAAU,OAAS,EAAa,OAAQ,CACxC,IAAM,EAAW,GAAgB,EAAU,CACrC,EAAS,GAAU,gBAAgB,EAAU,CAC/C,GAAU,WAAa,OAGlB,GAA6B,EAAO,GACzC,EAAS,GAAQ,eAAe,EAAU,EAH1C,EAAS,EAAS,SAAS,EAAU,OAMnC,EAAmB,EAAU,EAAI,EAAU,cACjD,EAAU,OAAS,EAAa,WAEhC,EADiB,GAAgB,EAAU,EACxB,WAAW,EAAU,EAExC,IAAW,QAAa,CAAC,EAAgB,EAAO,EAAI,EAAmB,EAAO,EAC9E,EAAS,KAAK,CAAE,SAAU,CAAC,EAAG,EAAE,CAAE,MAAO,EAAQ,CAAC,CAI9D,GAAqB,EAAS,CAC9B,GAAQ,SAAS,OAAO,EAAS,IAAI,IAAM,CAAE,KAAM,EAAE,SAAU,EAAE,CAAC,EACnE,CAAC,GAAO,EAAgB,GAAiB,GAAsB,EAAgB,CAAC,CAC7E,GAAc,IAAY,OAC1B,KAA+B,YAAa,GAAU,CACxD,IAAM,MAAe,CACjB,EAAM,iBAAiB,CACvB,EAAM,gBAAgB,EAEpB,EAAU,CACZ,SAAU,GACb,CACK,CAAE,UAAW,EACb,EAAkB,EAAc,QAChC,EAAe,EAAc,KAC7B,EAAO,GACb,GAAI,CAAC,IAAe,EAAS,EAAK,MAAO,EAAO,EAAQ,CACpD,GAAiB,GAAoB,GAAM,CAC3C,MAAsB,SAEjB,CAAC,IAAe,EAAS,EAAK,UAAW,EAAO,EAAQ,CAC7D,GAAiB,CACb,QAAS,EAAiB,OAAO,CACjC,KAAM,EAAiB,OAAO,CAC9B,QAAS,CACL,KAAM,EAAc,SAAS,MAAQ,CAAC,EAAiB,EAAE,CACzD,MAAO,CACH,EAAG,EACH,EAAG,EACH,MAAO,EAAU,OACjB,OAAQ,EACX,CACD,WAAY,EAAE,CACjB,CACJ,CAAE,GAAM,SAEJ,EAAS,EAAK,OAAQ,EAAO,EAAQ,CAC1C,GAAgB,SAAS,MAAM,CAAE,cAAe,GAAM,CAAC,CACvD,GAAmB,GAAK,SAEnB,EAAS,EAAK,OAAQ,EAAO,EAAQ,CAAE,CAC5C,IAAM,EAAiB,KAAW,EAAc,EAAI,GACpD,GAAI,IAAmB,GAAO,CAC1B,IAAM,EAAW,IAAmB,GAAO,EAAgB,EAM3D,GAAI,EAAS,UAAY,OAAW,CAChC,GAAY,EAAS,QAAQ,MAAM,CACnC,IAAK,IAAM,KAAK,EAAS,QAAQ,WAC7B,GAAY,EAAE,CAGtB,IAAK,IAAM,KAAK,EAAS,KACrB,GAAY,CACR,EAAG,EACH,EAAG,EACH,MAAO,EAAU,OACjB,OAAQ,EACX,CAAC,CAEN,IAAK,IAAM,KAAO,EAAS,QACvB,GAAY,CACR,EAAG,EACH,EAAG,EACH,MAAO,EACP,OAAQ,EACX,CAAC,EAId,GAAI,EAAQ,SAER,OADA,GAAQ,CACD,GAEX,GAAI,EAAc,UAAY,OAC1B,MAAO,GACX,GAAI,CAAC,EAAK,GAAO,EAAc,QAAQ,KACnC,EAAW,GACX,EAAmB,GACnB,EAAS,EAAK,qBAAsB,EAAO,EAAQ,CACnD,GAAY,QAAQ,EAAM,EAAiB,EAAI,CAE1C,IAAiB,QAAU,EAAS,EAAK,aAAc,EAAO,EAAQ,CACvE,EAAgB,SAAS,EAAI,CAC7B,GAAmB,EAAgB,OAAO,EAAI,CAAE,OAAW,GAAK,CAG5D,IAAiB,SACjB,GAAmB,EAAiB,oBAAoB,EAAI,CAAE,OAAW,GAAK,CAG9E,GAAmB,OAAW,EAAK,GAAK,CAI3C,KAAc,QAAU,EAAS,EAAK,UAAW,EAAO,EAAQ,CACjE,EAAa,SAAS,EAAI,CAC1B,GAAgB,EAAa,OAAO,EAAI,CAAE,OAAW,GAAK,CAGtD,KAAc,SACd,GAAgB,EAAiB,oBAAoB,EAAI,CAAE,OAAW,GAAK,CAG3E,GAAgB,OAAW,EAAK,GAAK,CAIxC,CAAC,IAAe,IAAW,QAAa,EAAS,EAAK,aAAc,EAAO,EAAQ,CACpF,IAAQ,GAAQ,GAChB,OAAO,eAAiB,CAEf,GADsB,GAA4B,EAAI,EACtB,EAAI,EAC1C,EAAE,EAGL,IAAkB,CAAC,EAAM,EAAiB,EAAI,CAAC,CAC/C,GAAS,EAAQ,GAAK,EAGrB,EAAc,QAAQ,MAAM,OAAS,GAAK,EAAS,EAAK,SAAU,EAAO,EAAQ,CACtF,IAAU,CAEL,EAAc,QAAQ,MAAM,MAAQ,GAAK,EAAS,EAAK,UAAW,EAAO,EAAQ,CACtF,IAAW,CAEN,EAAS,EAAK,aAAc,EAAO,EAAQ,CAChD,GAAO,KAAK,IAAI,EAAG,GAAiB,QAAQ,OAAS,EAAE,CAElD,EAAS,EAAK,iBAAkB,EAAO,EAAQ,CACpD,GAAO,KAAK,IAAI,EAAG,GAAiB,QAAQ,OAAS,EAAE,CAElD,EAAS,EAAK,cAAe,EAAO,EAAQ,EACjD,EAAW,OAAU,CACrB,EAAM,EACN,EAAM,GAED,EAAS,EAAK,aAAc,EAAO,EAAQ,EAChD,EAAW,OAAU,CACrB,UACA,WAEK,EAAS,EAAK,kBAAmB,EAAO,EAAQ,EACrD,EAAW,OAAU,CACrB,GAAgB,CAAC,GAAI,GAAG,CAAC,EAEpB,EAAS,EAAK,iBAAkB,EAAO,EAAQ,EACpD,EAAW,OAAU,CACrB,GAAgB,CAAC,EAAG,EAAE,CAAC,EAEjB,IAsEF,EAAS,EAAK,aAAc,EAAO,EAAQ,EAC3C,EAAW,OAAU,CAErB,EAAS,EAAK,kBAAmB,EAAO,EAAQ,GAChD,EAAW,OAAU,CACrB,KAEA,EAAS,EAAK,gBAAiB,EAAO,EAAQ,GAC9C,EAAW,OAAU,CACrB,KAEA,EAAS,EAAK,kBAAmB,EAAO,EAAQ,GAChD,EAAW,OAAU,CACrB,KAEA,EAAS,EAAK,mBAAoB,EAAO,EAAQ,GACjD,EAAW,OAAU,CACrB,OAtFA,EAAS,EAAK,WAAY,EAAO,EAAQ,CACzC,GAAO,EAEF,EAAS,EAAK,SAAU,EAAO,EAAQ,CAC5C,IAEK,EAAS,EAAK,YAAa,EAAO,EAAQ,CAC/C,GAAO,EAEF,EAAS,EAAK,WAAY,EAAO,EAAQ,CAC9C,IAEK,EAAS,EAAK,0BAA2B,EAAO,EAAQ,EAC7D,GAAO,EACP,EAAW,IAEN,EAAS,EAAK,wBAAyB,EAAO,EAAQ,EAC3D,IACA,EAAW,IAEN,EAAS,EAAK,2BAA4B,EAAO,EAAQ,EAC9D,GAAO,EACP,EAAW,IAEN,EAAS,EAAK,0BAA2B,EAAO,EAAQ,EAC7D,IACA,EAAW,IAEN,EAAS,EAAK,YAAa,EAAO,EAAQ,CAC/C,EAAM,EAAO,EAER,EAAS,EAAK,aAAc,EAAO,EAAQ,CAChD,EAAM,WAED,EAAS,EAAK,eAAgB,EAAO,EAAQ,CAClD,UAEK,EAAS,EAAK,gBAAiB,EAAO,EAAQ,CACnD,EAAM,YAED,KAAgB,QAAU,KAAgB,gBAC3C,EAAS,EAAK,eAAgB,EAAO,EAAQ,CAC7C,GAAgB,CAAC,EAAG,EAAE,CAAC,CAElB,EAAS,EAAK,aAAc,EAAO,EAAQ,CAChD,GAAgB,CAAC,EAAG,GAAG,CAAC,CAEnB,EAAS,EAAK,gBAAiB,EAAO,EAAQ,CACnD,GAAgB,CAAC,EAAG,EAAE,CAAC,CAElB,EAAS,EAAK,eAAgB,EAAO,EAAQ,CAClD,GAAgB,CAAC,GAAI,EAAE,CAAC,CAEnB,EAAS,EAAK,gBAAiB,EAAO,EAAQ,CACnD,GAAgB,CAAC,EAAG,EAAE,CAAC,CAElB,EAAS,EAAK,iBAAkB,EAAO,EAAQ,CACpD,GAAgB,CAAC,EAAG,GAAG,CAAC,CAEnB,EAAS,EAAK,mBAAoB,EAAO,EAAQ,CACtD,GAAgB,CAAC,EAAG,EAAE,CAAC,CAElB,EAAS,EAAK,oBAAqB,EAAO,EAAQ,EACvD,GAAgB,CAAC,GAAI,EAAE,CAAC,EAGhC,EAAmB,EAAQ,UAwB/B,IAAM,EAAQ,GAAmB,EAAK,EAAK,GAAO,EAAS,CACrD,EAAW,EAAQ,SAIzB,OAHI,IAAa,GAAS,CAAC,GAAoB,KAC3C,GAAQ,CAEL,GACR,CACC,GACA,EACA,GACA,EACA,GACA,GACA,EACA,EACA,GACA,GACA,GACA,EAAU,OACV,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,EACA,GACA,GACA,GACA,GACH,CAAC,CACI,KAAkB,YAAa,GAAU,CAC3C,IAAI,EAAY,GAahB,GAZI,KAAgB,QAChB,GAAY,CACR,GAAG,EACH,WAAc,CACV,EAAY,IAEnB,CAAC,CAEF,GAEA,GAAuB,EAAM,EAE7B,EAAc,UAAY,OAC1B,OACJ,GAAM,CAAC,EAAK,GAAO,EAAc,QAAQ,KACnC,EAAK,GAAiB,QAC5B,GAAI,GACA,CAAC,EAAM,SACP,CAAC,EAAM,SACP,EAAc,UAAY,QAC1B,EAAM,IAAI,SAAW,GACrB,SAAS,KAAK,EAAM,IAAI,EACxB,EAAM,SAAW,QACjB,GAAgB,EAAe,CAAC,EAAM,EAAiB,KAAK,IAAI,EAAG,KAAK,IAAI,EAAK,EAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAChG,IAAK,CAAC,IAAwB,IAAQ,KACjC,EAAG,EAAI,GAAO,EAAM,EAAG,EAAI,EAAG,QAAU,EAAG,EAAI,GAAO,EAAM,EAAG,EAAI,EAAG,OACvE,OAEJ,GAAS,EAAM,OAAQ,GAAM,EAAM,IAAI,CACvC,EAAM,iBAAiB,CACvB,EAAM,gBAAgB,GAE3B,CACC,EACA,GACA,GACA,EACA,EACA,EACA,EACA,GACA,GACH,CAAC,CACI,KAAsB,aAAa,EAAM,IAAmB,CAC9D,IAAM,EAAc,EAAK,SAAS,GAAK,EAIvC,GAHI,EAAK,OAAS,UACd,KAAsB,EAAa,CAAE,GAAG,EAAM,iBAAgB,CAAC,CAE/D,EAAK,sBAA0B,CAC/B,GAAI,EAAc,EACd,OAEJ,IAA2B,EAAa,CAAE,GAAG,EAAM,iBAAgB,CAAC,CAExE,GAAI,EAAK,OAAS,OAAQ,CACtB,GAAM,CAAC,EAAK,GAAO,EAAK,SACxB,IAAoB,CAAC,EAAa,EAAI,CAAE,CACpC,GAAG,EACH,iBACH,CAAC,CACG,GAAqB,EAAe,EAAK,SAAS,EACnD,GAAmB,EAAK,EAAK,GAAO,GAAM,GAGnD,CACC,EACA,EACA,EACA,GACA,EACA,GACH,CAAC,CACI,KAAwB,YAAY,KAAO,IAAM,CACnD,GAAI,CAAC,GAAY,MACb,OACJ,SAAS,EAAY,EAAO,EAAQ,EAAU,EAAW,CACrD,IAAM,EAAsB,OAAO,GAAa,SAAW,GAAU,KAAK;EAAK,EAAI,GAAK,GAAU,UAAU,EAAI,GAChH,GAAI,CAAC,EAAgB,EAAM,EAAI,GAAgB,EAAM,EAAI,EAAM,WAAa,GAAM,CAC9E,IAAM,EAAU,IAAmB,EAAqB,EAAM,CAC9D,GAAI,IAAY,QAAa,EAAmB,EAAQ,CAKpD,MAAO,CACH,SAAU,EACV,MAAO,EACV,CAEL,IAAM,EAAI,GAAgB,EAAM,CAChC,GAAI,IAAM,OACN,OACJ,GAAI,EAAE,OAAS,EAAa,OAAQ,CAChC,GAAO,EAAM,OAAS,EAAa,OAAO,CAC1C,IAAM,EAAS,EAAE,UAAU,EAAqB,EAAM,KAAK,CAG3D,OAFI,IAAW,OACX,OACG,CACH,SAAU,EACV,MAAO,CACH,GAAG,EACH,KAAM,EACT,CACJ,KAEA,CACD,IAAM,EAAS,EAAE,UAAU,EAAqB,EAAO,CACnD,YACA,gBAAiB,OAAO,GAAc,SAAW,EAAY,GAAW,KAAK;EAAK,CAClF,WACH,CAAC,CAIF,OAHI,IAAW,OACX,QACJ,GAAO,EAAO,OAAS,EAAM,KAAK,CAC3B,CACH,SAAU,EACV,MAAO,EACV,IAKb,IAAM,EAAkB,EAAc,QAChC,EAAe,EAAc,KAC7B,EAAU,EAAU,SAAS,SAAS,SAAS,cAAc,GAAK,IACpE,EAAU,SAAS,SAAS,SAAS,cAAc,GAAK,GACxD,EAUJ,GATI,EAAc,UAAY,OAGrB,EAAgB,SAAW,EAChC,EAAS,CAAC,EAAgB,OAAO,EAAI,EAAG,EAAE,CAErC,EAAa,SAAW,IAC7B,EAAS,CAAC,EAAiB,EAAa,OAAO,EAAI,EAAE,EANrD,EAAS,CAAC,EAAc,QAAQ,MAAM,EAAG,EAAc,QAAQ,MAAM,EAAE,CAQvE,GAAW,IAAW,OAAW,CACjC,IAAI,EACA,EACE,EAAY,aACZ,EAAW,YACjB,GAAI,UAAU,UAAU,OAAS,OAAW,CACxC,IAAM,EAAmB,MAAM,UAAU,UAAU,MAAM,CACzD,IAAK,IAAM,KAAQ,EAAkB,CACjC,GAAI,EAAK,MAAM,SAAS,EAAS,CAAE,CAG/B,IAAM,EAAU,GADH,MADI,MAAM,EAAK,QAAQ,EAAS,EACjB,MAAM,CACF,CAChC,GAAI,IAAY,OAAW,CACvB,EAAO,EACP,OAGJ,EAAK,MAAM,SAAS,EAAU,GAE9B,EAAO,MAAO,MAAM,EAAK,QAAQ,EAAU,EAAE,MAAM,WAItD,UAAU,UAAU,WAAa,OACtC,EAAO,MAAM,UAAU,UAAU,UAAU,SAEtC,IAAM,QAAa,GAAG,gBAAkB,KACzC,EAAE,cAAc,MAAM,SAAS,EAAS,GAExC,EAAO,GADM,EAAE,cAAc,QAAQ,EAAS,CACvB,EAEvB,IAAS,QAAa,EAAE,cAAc,MAAM,SAAS,EAAU,GAC/D,EAAO,EAAE,cAAc,QAAQ,EAAU,OAI7C,OAEJ,GAAM,CAAC,EAAW,GAAa,EACzB,EAAW,EAAE,CACnB,EAAG,CACC,GAAI,KAAY,OAAW,CACvB,IAAM,EAAW,GAAsB,EAAO,CACxC,EAAW,GAAQ,GAAM,IAAI,GAAK,EAAE,IAAI,GAAM,EAAG,SAAS,CAAC,KAAK,IAAK,CAAC,CAAC,KAAK,IAAK,EAAI,GACrF,EAAS,EAAY,EAAU,EAAQ,EAAU,OAAU,CAC7D,IAAW,QACX,EAAS,KAAK,EAAO,CAEzB,MAEJ,GAAI,IAAS,OAAW,CACpB,GAAI,IAAS,OACT,OACJ,EAAO,GAAQ,EAAK,CAExB,GAAI,KAAY,IACX,OAAO,IAAY,YAChB,KAAU,CAAC,EAAO,GAAK,EAAiB,EAAO,GAAG,CAAE,EAAK,IAAI,GAAK,EAAE,IAAI,GAAM,EAAG,UAAU,UAAU,EAAI,GAAG,CAAC,CAAC,GAAK,GACvH,OAEJ,IAAK,GAAM,CAAC,EAAK,KAAY,EAAK,SAAS,CAAE,CACzC,GAAI,EAAM,GAAa,EACnB,MACJ,IAAK,GAAM,CAAC,EAAK,KAAa,EAAQ,SAAS,CAAE,CAC7C,IAAM,EAAQ,CAAC,EAAM,EAAW,EAAM,EAAU,CAC1C,CAAC,EAAU,GAAY,EAG7B,GAFI,GAAY,EAAY,QAExB,GAAY,GACZ,SAEJ,IAAM,EAAS,EADE,GAAsB,EAAM,CACR,EAAO,EAAS,SAAU,EAAS,UAAU,CAC9E,IAAW,QACX,EAAS,KAAK,EAAO,SAK5B,IACT,GAAqB,EAAS,CAC9B,GAAQ,SAAS,OAAO,EAAS,IAAI,IAAM,CACvC,KAAM,EAAE,SACX,EAAE,CAAC,GAET,CACC,EACA,GACA,GACA,EACA,GAAY,MACZ,EAAY,OACZ,GACA,GACA,GACA,EACA,EACH,CAAC,CACF,GAAiB,QAAS,GAAiB,EAAY,GAAO,GAAK,CAInE,IAAM,KAAe,YAAY,MAAO,EAAG,IAAgB,CACvD,GAAI,CAAC,GAAY,KACb,OACJ,IAAM,EAAU,IAAgB,IAC5B,EAAU,SAAS,SAAS,SAAS,cAAc,GAAK,IACxD,EAAU,SAAS,SAAS,SAAS,cAAc,GAAK,GACtD,EAAkB,EAAc,QAChC,EAAe,EAAc,KAC7B,GAA8B,EAAO,IAAkB,CAWrD,GAVC,GAUe,CANA,EAAc,IAAI,IAAU,CACxC,KAAM,EAAa,KACnB,KAAM,EAAU,GAAO,MACvB,YAAa,EAAU,GAAO,MAC9B,aAAc,GACjB,EAAE,CACuB,GAAG,EAAM,CATnB,EASqB,EAAe,EAAE,EAG9D,GAAI,GAAW,KAAyB,WAChC,EAAc,UAAY,OAAW,CACrC,IAAI,EAAQ,GAAqB,EAAc,QAAQ,MAAO,GAAmB,QAAQ,OAAO,CAC5F,OAAO,GAAU,WACjB,EAAQ,MAAM,GAAO,EAEzB,EAA2B,iBAAa,EAAc,QAAQ,MAAM,EAAI,EAAiB,EAAc,QAAQ,MAAM,EAAI,EAAc,QAAQ,MAAM,MAAQ,EAAgB,CAAC,SAEzK,IAAiB,QAAa,EAAa,OAAS,EAAG,CAE5D,IAAM,EADS,CAAC,GAAG,EAAa,CACX,IAAI,GAAY,CACjC,IAAM,EAAQ,GAAqB,CAC/B,EAAG,EACH,EAAG,EACH,MAAO,EAAU,OACjB,OAAQ,EACX,CAAE,GAAmB,QAAQ,OAAO,CAIrC,OAHI,OAAO,GAAU,SACV,EAAM,GAEV,GAAO,CAAC,KAAK,GAAK,EAAE,GAAG,EAChC,CACE,EAAM,KAAK,GAAK,aAAa,QAAQ,CAErC,EADgB,MAAM,QAAQ,IAAI,EAAM,gBACE,EAAU,OAAO,CAAC,CAG5D,EAA2B,iBAAa,EAAU,OAAO,CAAC,SAGzD,EAAgB,OAAS,EAAG,CACjC,IAAM,EAAU,EAAE,CACZ,EAAO,EAAE,CACf,IAAK,IAAM,KAAO,EAAiB,CAC/B,IAAI,EAAQ,GAAqB,CAC7B,EAAG,EACH,EAAG,EACH,MAAO,EACP,OAAQ,EACX,CAAE,GAAmB,QAAQ,OAAO,CACjC,OAAO,GAAU,WACjB,EAAQ,MAAM,GAAO,EAEzB,EAAQ,KAAK,EAAM,CACnB,EAAK,KAAK,EAAM,EAAgB,CAEhC,EAAQ,SAAW,EACnB,EAA2B,EAAQ,GAAI,EAAK,CAK5C,EADe,EAAQ,QAAQ,EAAI,IAAO,EAAG,KAAK,EAAK,IAAU,CAAC,GAAG,EAAK,GAAG,EAAG,GAAO,CAAC,CAAC,CACtD,EAAK,IAIrD,CAAC,EAAW,GAAsB,EAAe,GAAY,KAAM,EAAiB,EAAM,GAAY,CAAC,CAC1G,GAAiB,OAAQ,GAAQ,EAAY,GAAO,GAAM,CA4B1D,GAAiB,QA3BG,YAAY,KAAO,IAAM,CACpC,MAAY,MAED,EAAU,SAAS,SAAS,SAAS,cAAc,GAAK,IACpE,EAAU,SAAS,SAAS,SAAS,cAAc,GAAK,MAG5D,MAAM,GAAO,EAAE,CACX,EAAc,UAAY,QAAW,CACrC,IAAI,EAAqB,CACrB,QAAS,CACL,KAAM,EAAc,QAAQ,KAC5B,MAAO,EAAc,QAAQ,MAC7B,WAAY,EAAE,CACjB,CACD,KAAM,EAAiB,OAAO,CAC9B,QAAS,EAAiB,OAAO,CACpC,CACK,EAAiB,KAAW,EAAmB,CAIrD,GAHI,IAAmB,KAEvB,EAAqB,IAAmB,GAAO,EAAqB,EAChE,EAAmB,UAAY,QAC/B,OACJ,GAAY,EAAmB,QAAQ,MAAM,GAElD,CAAC,GAAa,EAAe,GAAY,IAAK,GAAQ,GAAS,CAAC,CACpC,EAAY,GAAO,GAAM,CACxD,IAAM,KAA+B,aAAa,EAAS,IAAa,CACpE,GAAI,IAA6B,OAAW,CACpC,IAAoB,IACpB,EAAU,EAAQ,IAAI,GAAQ,CAAC,EAAK,GAAK,EAAiB,EAAK,GAAG,CAAC,EAEvE,EAAyB,EAAS,EAAS,CAC3C,OAEJ,GAAI,EAAQ,SAAW,GAAK,IAAa,GACrC,OACJ,GAAM,CAAC,EAAK,GAAO,EAAQ,GACvB,EAAS,UAAY,QAAa,EAAS,QAAQ,KAAO,GAAO,EAAS,QAAQ,KAAO,IAG7F,EAAS,QAAU,CAAC,EAAK,EAAI,CAC7B,GAAmB,EAAK,EAAK,GAAO,GAAM,GAC3C,CAAC,EAA0B,EAAiB,GAAmB,CAAC,CAI7D,CAAC,GAAQ,IAAU,IAAoB,SAAS,MAAQ,EAAE,CAC1D,KAAoB,OAAO,GAAS,CAC1C,GAAY,QAAU,GACtB,EAAM,oBAAsB,CACpB,CAAC,GAAgB,SACjB,KAAW,QACX,KAAW,SACV,KAAW,GAA8B,SAAS,SAAS,KAAK,IAC7D,KAAW,GAA8B,SAAS,SAAS,KAAK,KACpE,GAAY,QAAQ,GAAQ,GAAO,CAEvC,GAAgB,QAAU,IAC3B,CAAC,GAAQ,GAAO,CAAC,CACpB,IAAM,GAAuB,EAAc,UAAY,SAClD,EAAc,QAAQ,KAAK,IAAM,EAAY,QAAU,EAAc,QAAQ,KAAK,IAAM,IAC7F,EAAM,oBAAsB,CACpB,IACA,GAAiB,GAAoB,GAAM,EAEhD,CAAC,GAAsB,GAAiB,CAAC,CAC5C,IAAM,KAAqB,YACnB,KAAyB,IAAQ,IAAoB,OAAS,GACvD,EAAiB,oBAAoB,GAAc,EAAE,CAEzD,EAAiB,OAAO,CAChC,CAAC,GAAa,GAAsB,IAAoB,KAAK,CAAC,CAC3D,KAA8B,YAAa,GACtC,OAAO,IAAmB,UAC3B,GACA,KAAiB,EAAM,EAAgB,EAAI,GAClD,CAAC,EAAiB,GAAe,CAAC,CAC/B,KAAwB,YAAc,CACxC,GAAI,KAAgB,QAAa,EAAU,UAAY,KACnD,OAAO,KACX,GAAM,CAAE,SAAQ,SAAU,GACpB,EAAe,EAAU,QAAQ,uBAAuB,CAC9D,SAAc,cAAc,GAAa,CAAU,SAAe,QAAqB,eAAc,YAAe,GAAe,OAAU,CAAE,SAAU,GAAU,CAC3J,GAAe,OAAU,CACzB,IAAuB,EAAO,EAAO,EACtC,CAAC,EACT,CAAC,EAAsB,GAAY,CAAC,CACjC,GAAuB,KAAK,IAAI,EAAY,OAAQ,IAAiB,GAAgB,EAAI,GAAG,CAClG,EAAM,oBAAoB,OAAqB,CAC3C,WAAY,EAAK,IAAgB,GAAU,EAAM,EAAiB,EAAY,CAC9E,YAAa,IACL,IAAoB,IACpB,EAAa,EAAW,IAAI,IAAM,CAAE,KAAM,CAAC,EAAE,KAAK,GAAK,EAAiB,EAAE,KAAK,GAAG,CAAE,EAAE,EAEnF,GAAQ,SAAS,OAAO,EAAW,EAE9C,WAAY,EAAK,IAAQ,CACjB,QAAW,UAAY,MAAQ,GAAW,UAAY,MAG1D,IAAI,IAAQ,QAAa,IAAQ,OAAW,CAExC,IAAM,EAAO,EAAU,QAAQ,uBAAuB,CAChD,EAAQ,EAAK,MAAQ,EAAU,QAAQ,YAC7C,MAAO,CACH,EAAG,EAAK,EAAI,EAAU,QAAQ,WAAa,EAC3C,EAAG,EAAK,EAAI,EAAU,QAAQ,UAAY,EAC1C,MAAO,EAAU,QAAQ,YAAc,EACvC,OAAQ,EAAU,QAAQ,aAAe,EAC5C,CAEL,OAAO,GAAQ,SAAS,WAAW,GAAO,GAAK,EAAiB,EAAI,GAExE,UAAa,GAAQ,SAAS,OAAO,CACrC,KAAM,KAAO,IAAM,CACf,OAAQ,EAAR,CACI,IAAK,SACD,GAAU,CACN,OAAQ,OACR,WAAc,OACd,oBAAuB,OACvB,mBAAsB,OACtB,QAAS,GACT,IAAK,SACL,QAAS,GACT,QAAS,GACT,SAAU,GACV,OAAQ,GACR,SAAU,OACV,SAAU,OACb,CAAC,CACF,MACJ,IAAK,aACD,GAAU,CACN,OAAQ,OACR,WAAc,OACd,oBAAuB,OACvB,mBAAsB,OACtB,QAAS,GACT,IAAK,IACL,QAAS,GACT,QAAS,GACT,SAAU,GACV,OAAQ,GACR,SAAU,OACV,SAAU,OACb,CAAC,CACF,MACJ,IAAK,YACD,GAAU,CACN,OAAQ,OACR,WAAc,OACd,oBAAuB,OACvB,mBAAsB,OACtB,QAAS,GACT,IAAK,IACL,QAAS,GACT,QAAS,GACT,SAAU,GACV,OAAQ,GACR,SAAU,OACV,SAAU,OACb,CAAC,CACF,MACJ,IAAK,OACD,MAAM,GAAO,OAAW,GAAK,CAC7B,MACJ,IAAK,QACD,MAAM,IAAiB,CACvB,QAGZ,YACA,iBAAkB,GAAQ,CACtB,IAAK,IAAM,KAAO,EACT,GAAiB,EAAM,EAAgB,EAGvD,EAAG,CAAC,GAAW,GAAkB,GAAQ,GAAW,GAAiB,EAAiB,GAAS,CAAC,CACjG,GAAM,CAAC,GAAQ,IAAU,IAAe,EAAE,CACpC,KAAsB,YAAa,GAAS,CAC9C,GAAM,CAAC,EAAK,GAAO,EACnB,GAAI,IAAQ,GAAI,CACR,IAAiB,SACjB,GAAmB,EAAiB,oBAAoB,EAAI,CAAE,OAAW,GAAM,CAC/E,IAAO,EAEX,OAEA,KAAW,GAAO,KAAW,IAEjC,GAAW,CACP,OACA,MAAO,CAAE,EAAG,EAAK,EAAG,EAAK,MAAO,EAAG,OAAQ,EAAG,CACjD,CAAE,GAAM,GAAO,eAAe,CAC/B,GAAS,EAAK,EAAI,GACnB,CAAC,EAAc,GAAO,GAAU,GAAQ,GAAQ,GAAY,GAAmB,CAAC,CAC7E,CAAC,GAAW,MAAsB,SAAS,GAAM,CACjD,KAA8B,sBAAiB,GAAQ,CACzD,GAAa,EAAI,EAClB,EAAE,CAAC,CACA,KAAwB,gBAAkB,CAC5C,GAAsB,QAAQ,GAAK,CAE/B,EAAc,UAAY,QAC1B,EAAc,QAAQ,SAAW,GACjC,EAAc,KAAK,SAAW,GAC9B,IAAe,QACf,GAAW,CACP,KAAM,CAAC,EAAiB,GAAY,CACpC,MAAO,CACH,EAAG,EACH,EAAG,GACH,MAAO,EACP,OAAQ,EACX,CACJ,CAAE,GAAM,GAAO,kBAAkB,EAEvC,CAAC,GAAa,EAAe,EAAY,EAAiB,GAAW,CAAC,CACnE,KAAmB,gBAAkB,CACvC,GAAsB,QAAQ,GAAM,EACrC,EAAE,CAAC,CACA,CAAC,GAAY,MAAqB,YAAc,CAClD,IAAI,EACE,EAAiB,IAAc,wBAA0B,IAAmB,CAC5E,EAA2B,GAAQ,GAAuB,EAAI,GACpE,GAAI,OAAO,IAAc,SACrB,EAAI,GAAoB,EAA2B,OAElD,CACD,IAAI,EAAM,EACJ,EAAY,KAAK,IAAI,EAA0B,GAAG,CACxD,IAAK,IAAI,EAAI,EAAG,EAAI,EAAW,IAC3B,GAAO,GAAU,EAAE,CAEvB,EAAM,KAAK,MAAM,EAAM,EAAU,CACjC,EAAI,GAAoB,EAA2B,EAEvD,GAAK,EACL,IAAM,EAAI,EAAY,QAAQ,EAAK,IAAM,EAAE,MAAQ,EAAK,EAAE,CAAG,EAG7D,MAAO,CAAC,GAAG,KAAK,IAAI,IAAQ,EAAE,CAAC,IAAK,GAAG,KAAK,IAAI,IAAQ,EAAE,CAAC,IAAI,EAChE,CAAC,EAAa,IAAc,uBAAwB,GAAW,EAAM,GAAsB,GAAkB,CAAC,CAC3G,KAAiB,YACZ,GAAa,GAAY,CACjC,CAAC,GAAY,CAAC,CACjB,SAAc,cAAc,GAAa,SAAU,CAAE,MAAO,GAAa,GAC/D,cAAc,GAAqB,CAAE,MAAO,GAAqB,aAAW,QAAS,GAAS,GAAY,SAAU,GAAU,GAAa,GACvI,cAAc,GAAgB,CAAc,cAA2B,iBAA6B,gBAA4B,gBAA4B,gBAAmC,sBAAkC,eAAgC,qBAAgC,eAA0B,eAA0B,eAAyB,cAAyB,eAA0B,eAAuC,4BAAwC,gBAAiC,qBAAkC,iBAA8B,iBAA0B,aAAyB,gBAA+B,mBAAiB,aAAc,GAAuB,YAA0B,iBAAe,MAAO,GAA0B,eAA0B,eAAa,oBAAqB,GAAc,OAAmB,aAAW,QAAS,EAA2B,gBAA0B,cAAiC,sBAA+B,YAAwB,gBAAc,cAAe,GAAsB,YAAa,EAAiB,mBAAoB,IAAoB,EAAG,eAAgB,GAAuC,kBAAgC,kBAAgC,iBAA4B,cAA2B,iBAAiC,oBAAwC,wBAAsB,gBAAiB,GAAsC,gBAAyB,aAAW,kBAAmB,GAAe,GAAoB,EAAG,mBAAoB,IAAsB,IAAwB,IAAoB,SAAW,GAAO,EAAI,GAAI,aAAc,GAAsC,kBAAmC,qBAAwC,uBAAoC,iBAAe,cAAe,GAAmB,YAAa,GAAiB,kBAAmB,GAAwB,cAAe,GAAmB,UAAW,GAAY,aAAe,GAAM,YAAa,GAA4B,aAAW,QAAS,GAAwB,eAAwB,aAA2B,kBAAwB,UAAgC,0BAAwB,uBAAwB,GAAwC,cAAuB,aAA0B,iBAA4B,eAAkC,uBAAqB,KAAM,GAAwB,YAAW,UAAW,EAAe,WAAY,GAAc,GAAI,WAAY,GAAc,GAAI,eAAgB,GAAgC,WAA0B,mBAAiB,CAAC,CACtpF,GACA,IAAY,UAAoB,gBAAoB,SAAU,CAAE,SAAU,KAAM,GACtE,cAAc,GAAuB,CAAE,GAAG,EAAuB,gBAAc,MAAO,EAAa,GAAI,GAA4B,mBAAiB,UAAW,IAAc,YAAc,GAAO,uBAAyB,OAA0B,gBAAoC,sBAAsC,mBAAwC,wBAAuC,kBAAgB,CAAC,CAAC,CAAE,CAAC,EAO/X,CCvlFpD,GAAqB,GACd,GAAsB,CAC/B,uBAAwB,GAAK,EAAE,MAAM,UAAU,EAAI,QACnD,KAAM,EAAa,QACnB,WAAY,GACZ,SAAU,GACV,mBAAoB,GACpB,YAAe,GACf,KAAM,GAAK,GAAY,EAAG,EAAE,KAAK,KAAM,GAAsB,EAAE,KAAK,CAAE,EAAE,KAAK,SAAW,GAAmB,CAC3G,SAAU,IAAM,CACZ,GAAG,EACH,KAAM,GACT,EACD,QAAS,GAAK,CACV,GAAM,CAAE,OAAM,KAAM,EAAU,KAAM,EAAU,SAAQ,SAAU,EAC1D,CAAE,QAAO,SAAQ,EAAG,EAAO,EAAG,GAAU,EACxC,EAAW,EAAK,SAAW,GAC3B,EAAc,KAAK,MAAM,EAAO,EAAI,EAAS,EAAE,CAC/C,EAAgB,GAAe,EAAU,EAAQ,EAAM,oBAAoB,CAE3E,EAAK,GADE,GAAuB,EAAK,cAAgB,SAAU,EAAO,EAAO,EAAM,sBAAuB,EAAc,CAC/F,EAAa,EAAc,CAClD,EAAkB,GAAgB,EAAQ,EAAU,EAAQ,EAAU,EAAG,CAC/E,GAAI,GAAsB,EAAK,EAAI,EAC/B,MAAO,CACH,GAAG,EACH,KAAM,GAAc,EAAK,KAAK,CACjC,EAIT,SAAU,EAAS,IAAS,CACxB,IAAI,OAUJ,OATI,EAAQ,aAAa,GAAK,OAC1B,EAAS,GAEJ,EAAQ,aAAa,GAAK,QAC/B,EAAS,GAEJ,EAAQ,aAAa,GAAK,kBAC/B,UAEG,IAAW,EAAK,KACjB,OACA,CACE,GAAG,EACH,KAAM,EACT,EAEZ,CACD,SAAS,GAAY,EAAM,EAAM,EAAS,EAAS,CAC/C,GAAI,CAAC,GAAW,SACZ,OAEJ,GAAM,CAAE,MAAK,cAAa,QAAO,OAAM,cAAa,SAAQ,SAAQ,KAAM,CAAE,iBAAoB,EAC1F,CAAE,IAAG,IAAG,MAAO,EAAG,OAAQ,GAAM,EAChC,EAAc,IAChB,EAAQ,EAAU,EAAI,EAAc,EAAc,EAAc,GAChE,WACA,GAAS,GAET,IAAU,IAGd,EAAI,YAAc,EAClB,GAAa,EAAK,EAAO,EAAM,EAAG,EAAG,EAAG,EAAG,EAAa,EAAQ,EAAQ,EAAS,EAAa,CAC9F,EAAI,YAAc,GCpEtB,IAAa,GAAyCN,EAAO,MAAM,CAAC,CAClE,KAAM,4BACN,MAAO,eACP,UAAW,GACZ,CAAC,CCHI,GAAuB,GAAK,CAC9B,GAAM,CAAE,WAAY,EACpB,SAAc,cAAc,GAA2B,KACnD,EAAQ,KAAK,EAAG,MAAa,cAAc,MAAO,CAAE,IAAK,EAAG,UAAW,aAAc,CAAE,EAAE,CAAE,GACrF,cAAc,WAAY,CAAE,UAAW,YAAa,UAAW,GAAM,CAAC,CAAC,ECAxE,GAAqB,CAC9B,uBAAwB,GAAK,GAAgC,EAAE,KAAK,CACpE,KAAM,EAAa,OACnB,WAAY,GACZ,SAAU,GACV,mBAAoB,GACpB,SAAU,EAAK,EAAM,IAAM,EAAK,KAAK,QAAQ,EAAK,IAAS,EAAI,YAAY,EAAK,CAAC,MAAQ,EAAM,GAAI,EAAE,CAAG,EAAI,EAAE,sBAAwB,EACtI,KAAM,GAAK,GAAY,EAAG,EAAE,KAAK,KAAK,CACtC,kBAAqB,GAAK,CACtB,GAAM,CAAE,SAAU,EAClB,SAAa,cAAc,GAAsB,CAAE,QAAS,EAAM,KAAM,CAAC,EAE7E,YAAe,OAClB,CACKU,GAAa,EACnB,SAAS,GAAY,EAAM,EAAM,CAC7B,GAAM,CAAE,OAAM,QAAO,MAAK,eAAgB,EACpC,CAAE,IAAG,IAAG,MAAO,EAAG,OAAQ,GAAM,EAGhC,EAAeA,GACjB,EAAU,EAAI,EAAM,sBAClB,EAAc,EAAE,CACtB,IAAK,IAAM,KAAK,EAAM,CAClB,GAAI,EAAU,EAAI,EACd,MACJ,IAAM,EAAY,GAAkB,EAAG,EAAK,EAAM,aAAa,CAAC,MAChE,EAAY,KAAK,CACb,EAAG,EACH,MAAO,EACV,CAAC,CACF,GAAW,EAAY,GAAgB,EAE3C,EAAI,WAAW,CACf,IAAK,IAAM,KAAY,EACnB,GAAY,EAAK,EAAS,EAAG,GAAK,EAAI,IAAgB,EAAG,EAAS,MAAQ,GAAe,GAAc,EAAM,gBAAkB,GAAe,EAAE,CAEpJ,EAAI,UAAY,EAAc,EAAM,iBAAmB,EAAM,SAC7D,EAAI,MAAM,CACV,IAAK,GAAM,CAAC,EAAG,KAAa,EAAY,SAAS,CAC7C,EAAI,WAAW,CACf,EAAI,UAAY,EAAM,WACtB,EAAI,SAAS,EAAK,GAAI,EAAS,EAAI,EAAW,EAAI,EAAI,EAAI,GAAoB,EAAK,EAAM,CAAC,CC9ClG,IAAM,GAA2CV,EAAO,MAAM,CAAC,CAC7D,KAAM,8BACN,MAAO,cACP,UAAW,GACZ,CAAC,CACI,GAAyB,GAAK,CAClC,GAAM,CACJ,cACE,EACJ,SAAa,cAAc,GAA6B,KAAM,EAAW,KAAK,EAAG,MAAY,cAAc,MAAO,CAChH,IAAK,EACL,UAAW,aACZ,CAAE,EAAE,MAAQ,UAAmB,cAAc,MAAO,CACnD,IAAK,EAAE,IACR,CAAC,GAAQ,cAAc,MAAO,KAAM,EAAE,KAAK,CAAC,CAAC,CAAC,ECVpC,GAAwB,CACjC,uBAAwB,GAAK,GAAgC,EAAE,KAAK,IAAI,GAAK,EAAE,KAAK,CAAC,CACrF,KAAM,EAAa,UACnB,WAAY,GACZ,SAAU,GACV,mBAAoB,GACpB,SAAU,EAAK,EAAM,IAAM,EAAK,KAAK,QAAQ,EAAK,IAAS,EAAI,YAAY,EAAK,KAAK,CAAC,MAAQ,EAAM,IAAM,EAAK,MAAQ,OAAiB,EAAL,IAAS,EAAE,CAC1I,EAAI,EAAE,sBACN,EACJ,KAAM,GAAK,GAAkB,EAAG,EAAE,KAAK,KAAK,CAC5C,kBAAqB,GAAK,CACtB,GAAM,CAAE,SAAU,EAClB,SAAa,cAAc,GAAwB,CAAE,WAAY,EAAM,KAAM,CAAC,EAElF,YAAe,OAClB,CACKU,GAAa,EACb,GAAiB,EAAE,CACzB,SAAS,GAA2B,EAAQ,EAAQ,EAAQ,EAAU,CAClE,IAAM,EAAM,KAAK,KAAK,OAAO,iBAAiB,CAExC,EAAe,EAAS,GAExB,EAAc,EAAS,EACvB,EAAY,EAAW,EACvB,EAAc,EAAW,EACzB,GAAc,EAAc,IAAkB,EAC9C,EAAM,GAAG,EAAO,GAAG,EAAO,GAAG,EAAI,GAAG,IAC1C,GAAI,GAAe,KAAS,OACxB,MAAO,CACH,GAAI,GAAe,GACnB,OAAQ,EACR,MAAO,EACP,YAAa,EAAc,EAC3B,UAAW,EAAY,EACvB,QAAS,EAAa,EACtB,MACH,CAEL,IAAM,EAAS,SAAS,cAAc,SAAS,CACzC,EAAM,EAAO,WAAW,KAAK,CA0BnC,OAzBI,IAAQ,KACD,MACX,EAAO,MAAQ,EACf,EAAO,OAAS,EAChB,EAAI,MAAM,EAAK,EAAI,CACnB,GAAe,GAAO,EACtB,EAAI,WAAW,CACf,GAAY,EAAK,EAAY,EAAY,EAAa,EAAc,EAAS,CAC7E,EAAI,YAAc,wBAClB,EAAI,WAAa,EACjB,EAAI,UAAY,EAChB,EAAI,MAAM,CACV,EAAI,YAAc,wBAClB,EAAI,cAAgB,EACpB,EAAI,WAAa,EACjB,EAAI,UAAY,EAChB,EAAI,MAAM,CACV,EAAI,cAAgB,EACpB,EAAI,WAAa,EACjB,EAAI,WAAa,EACjB,EAAI,WAAW,CACf,GAAY,EAAK,IAAkB,IAAkB,EAAa,EAAc,EAAS,CACzF,EAAI,YAAc,EAClB,EAAI,UAAY,EAChB,EAAI,QAAQ,CACL,CACH,GAAI,EACJ,OAAQ,EACR,MAAO,EACP,UAAW,EAAY,EACvB,YAAa,EAAW,EACxB,QAAS,EAAa,EACtB,MACH,EAEL,SAAS,GAAkB,EAAM,EAAM,CACnC,GAAM,CAAE,OAAM,QAAO,MAAK,cAAa,MAAK,OAAQ,EAC9C,CAAE,IAAG,MAAO,GAAM,EAClB,EAAO,EAAM,aACb,EAAW,GAAY,EAAK,EAAK,CACjC,EAAI,KAAK,IAAI,EAAK,OAAQ,KAAK,IAAI,GAAI,KAAK,KAAK,EAAW,EAAM,WAAW,CAAG,EAAE,CAAC,CACnF,EAAI,KAAK,MAAM,EAAK,GAAK,EAAK,OAAS,GAAK,EAAE,CAC9C,EAAe,EAAI,GAEnB,EAAeA,GACjB,EAAU,EAAI,EAAM,sBAClB,EAAW,EAAM,gBAAkB,EACnC,EAAU,GAA2B,EAAM,OAAQ,EAAM,gBAAiB,EAAG,EAAS,CACtF,EAAc,EAAE,CACtB,IAAK,IAAM,KAAM,EAAM,CACnB,GAAI,EAAU,EAAI,EACd,MAEJ,IAAM,EADc,GAAkB,EAAG,KAAM,EAAK,EAAK,CAC3B,MAC1B,EAAW,EACX,EAAG,MAAQ,QACC,EAAY,eAAe,EAAG,IAAK,EAAK,EAAI,GAC5C,SACR,EAAW,EAAe,EAAI,GAGtC,IAAM,EAAc,EAAY,EAAW,GAC3C,EAAY,KAAK,CACb,EAAG,EACH,MAAO,EACV,CAAC,CACF,GAAW,EAAc,EAE7B,GAAI,IAAY,KAAM,CAClB,GAAM,CAAE,KAAI,SAAQ,cAAa,YAAW,QAAO,MAAK,WAAY,EAC9D,EAAiB,EAAY,EAC7B,EAAe,EAAU,EAC/B,IAAK,IAAM,KAAY,EAAa,CAChC,IAAM,EAAK,KAAK,MAAM,EAAS,EAAE,CAC3B,EAAK,KAAK,MAAM,EAAS,MAAM,CAC/B,EAAmB,GAAM,EAAiB,GAAgB,EAChE,EAAI,sBAAwB,GAC5B,EAAI,UAAU,EAAI,EAAG,EAAG,EAAW,EAAQ,EAAK,EAAc,EAAG,EAAgB,EAAE,CAC/E,EAAmB,GACnB,EAAI,UAAU,EAAI,EAAW,EAAG,EAAa,EAAQ,GAAM,EAAiB,GAAe,EAAG,EAAkB,EAAE,CACtH,EAAI,UAAU,EAAI,EAAQ,EAAW,EAAG,EAAW,EAAQ,EAAK,GAAM,EAAiB,GAAe,EAAG,EAAgB,EAAE,CAC3H,EAAI,sBAAwB,IAGpC,EAAI,WAAW,CACf,IAAK,GAAM,CAAC,EAAG,KAAa,EAAY,SAAS,CAAE,CAC/C,IAAM,EAAI,EAAK,GACX,EAAQ,EAAS,EAAI,EACzB,GAAI,EAAE,MAAQ,OAAW,CACrB,IAAM,EAAM,EAAY,eAAe,EAAE,IAAK,EAAK,EAAI,CACvD,GAAI,IAAQ,OAAW,CACnB,IAAM,EAAU,EAAe,EAC3B,EAAO,EACP,EAAO,EACP,EAAW,EAAI,MACf,EAAY,EAAI,OAChB,EAAW,GAEX,IAAS,EAAW,GAAa,EACjC,EAAW,GAEN,EAAY,IAEjB,IAAS,EAAY,GAAY,EACjC,EAAY,GAEhB,EAAI,WAAW,CACf,GAAY,EAAK,EAAO,EAAI,EAAI,EAAI,EAAU,EAAG,EAAS,EAAS,EAAM,gBAAkB,EAAE,CAC7F,EAAI,MAAM,CACV,EAAI,MAAM,CACV,EAAI,UAAU,EAAK,EAAM,EAAM,EAAU,EAAW,EAAO,EAAI,EAAI,EAAI,EAAU,EAAG,EAAS,EAAQ,CACrG,EAAI,SAAS,CACb,GAAS,EAAU,GAG3B,EAAI,WAAW,CACf,EAAI,UAAY,EAAM,WACtB,EAAI,SAAS,EAAE,KAAM,EAAO,EAAI,EAAI,EAAI,GAAoB,EAAK,EAAM,CAAC,EC/JhF,IAAa,GAAoB,CAC7B,uBAAwB,GAAK,EAAE,KAAK,KAAK,KAAK,CAC9C,KAAM,EAAa,MACnB,WAAY,GACZ,SAAU,GACV,mBAAoB,GACpB,KAAM,GAAK,GAAU,EAAG,EAAE,KAAK,aAAe,EAAE,KAAK,KAAM,EAAE,KAAK,UAAY,EAAE,MAAM,gBAAkB,EAAG,EAAE,KAAK,aAAa,CAC/H,SAAU,EAAM,IAAS,EAAK,KAAK,OAAS,GAC5C,SAAU,IAAM,CACZ,GAAG,EACH,KAAM,EAAE,CACX,EACD,kBAAqB,GAAK,CACtB,GAAM,CAAE,QAAO,oBAAmB,uBAAwB,EACpD,EAAc,GAAuB,GAC3C,SAAc,cAAc,EAAa,CAAE,KAAM,EAAM,KAAM,SAAU,EAAM,WAAa,GAAO,SAAU,EAAmB,SAAU,GAAY,CAC5I,EAAkB,CACd,GAAG,EACH,KAAM,CAAC,EAAS,CACnB,CAAC,EACH,CAAC,EAEZ,SAAU,EAAS,IAAS,CACxB,EAAU,EAAQ,MAAM,CAExB,IAAM,EADY,EAAQ,MAAM,IAAI,CAE/B,IAAI,GAAK,CACV,GAAI,CAEA,OADA,IAAI,IAAI,EAAE,CACH,OAEL,CACF,SAEN,CACG,OAAO,GAAK,IAAM,OAAU,CAC7B,OAAK,SAAW,EAAK,KAAK,QAAU,EAAK,OAAO,EAAG,IAAM,IAAM,EAAK,KAAK,GAAG,EAEhF,MAAO,CACH,GAAG,EACH,KAAM,EACT,EAER,CACK,GAAa,EACnB,SAAgB,GAAU,EAAM,EAAM,EAAU,EAAc,CAC1D,GAAM,CAAE,OAAM,MAAK,MAAK,QAAO,MAAK,eAAgB,EAC9C,CAAE,IAAG,IAAG,OAAQ,EAAG,MAAO,GAAM,EAChC,EAAY,EAAI,EAAM,oBAAsB,EAC5C,EAAS,EAAE,CACb,EAAa,EAEjB,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAK,OAAQ,IAAS,CAC9C,IAAM,EAAI,EAAK,GACf,GAAI,EAAE,SAAW,EACb,SACJ,IAAM,EAAM,EAAY,eAAe,EAAG,EAAK,EAAI,CACnD,GAAI,IAAQ,OAAW,CACnB,EAAO,GAAS,EAChB,IAAM,EAAW,EAAI,OAAS,EAAY,EAAI,QAC9C,GAAc,EAAW,IAGjC,GAAI,IAAe,EACf,OACJ,GAAc,GACd,IAAI,EAAQ,EAAI,EAAM,sBAClB,IAAiB,QACjB,EAAQ,KAAK,MAAM,EAAI,EAAI,EAAM,sBAAwB,EAAW,CAC/D,IAAiB,WACtB,EAAQ,KAAK,MAAM,EAAI,EAAI,EAAI,EAAa,EAAE,EAClD,IAAK,IAAM,KAAO,EAAQ,CACtB,GAAI,IAAQ,OACR,SACJ,IAAM,EAAW,EAAI,OAAS,EAAY,EAAI,QAC1C,EAAW,IACX,EAAI,WAAW,CACf,GAAY,EAAK,EAAO,EAAI,EAAM,oBAAqB,EAAU,EAAW,EAAS,CACrF,EAAI,MAAM,CACV,EAAI,MAAM,EAEd,EAAI,UAAU,EAAK,EAAO,EAAI,EAAM,oBAAqB,EAAU,EAAU,CACzE,EAAW,GACX,EAAI,SAAS,CAEjB,GAAS,EAAW,ICtF5B,SAAS,GAAgB,EAAG,EAAG,CAC3B,IAAI,EAAO,EAAI,MAAQ,EAAI,OAM3B,MAJA,IAAQ,GAAQ,GAChB,GAAQ,GAAQ,GAChB,GAAQ,GAAQ,EAER,EAAO,WAAc,EAEjC,IAAa,GAAsB,CAC/B,2BAA8B,GAC9B,KAAM,EAAa,QACnB,WAAY,GACZ,SAAU,GACV,mBAAoB,GACpB,YAAe,IACf,KAAM,GAAK,CACP,GAAM,CAAE,OAAM,MAAK,MAAK,MAAK,OAAM,SAAU,EAC7C,GAAI,EAAK,gBAAkB,QAAa,EAAK,gBAAkB,EAC3D,OAEJ,IAAI,EAAQ,EAAK,cACb,EAAK,2BAA6B,QAAa,EAAK,yBAA2B,IAC/E,GAAS,KAAK,MAAM,GAAgB,EAAK,EAAI,CAAG,EAAK,yBAAyB,EAElF,IAAM,EAAO,EAAM,sBACb,EAAa,EAAK,gBAAkB,KAAK,IAAI,GAAI,EAAK,OAAS,EAAI,EAAM,oBAAoB,CACnG,GAAY,EAAK,EAAK,EAAI,EAAM,EAAK,GAAK,EAAK,OAAS,GAAc,EAAG,EAAO,EAAY,EAAM,gBAAkB,EAAE,CACtH,EAAI,UAAYJ,GAAU,EAAM,SAAU,GAAI,CAC9C,EAAI,MAAM,EAEd,YAAe,OAClB,CCnCK,OAA0B,GAAK,EAAE,YAC1B,GAA0CN,EAAO,MAAM,CAAC,CACnE,KAAM,6BACN,MAAO,eACP,UAAW,GACX,KAAM,CACJ,aAAc,CAAC,IAAM,CAAE,KAAK,CAC7B,CACF,CAAC,CCJW,GAAwB,GAAK,CACtC,GAAM,CAAE,QAAO,WAAU,gBAAe,aAAY,aAAY,WAAU,sBAAuB,EAC3F,EAAW,EAAM,KACjB,EAAW,EAAM,WAAa,GAC9B,CAAC,EAAU,KAAqB,SAAS,IAAa,IAAM,EAAc,CAC1E,IAAoB,gBAAkB,CACxC,EAAY,GAAK,CAAC,EAAE,EACrB,EAAE,CAAC,CACA,EAAa,EAAW,WAAa,GAU3C,OATI,EACA,EAAc,cAAc,GAA4B,CAAE,YAAa,EAAW,MAAQ,GAAI,GACpF,cAAc,GAAc,CAAE,UAAW,GAAM,UAAW,GAA2B,qBAAoB,MAAO,EAAU,UAAW,GAAK,CACpI,EAAE,MAAQ,SACV,EAAE,iBAAiB,EACd,WAAU,CAAC,GACtB,cAAc,MAAO,CAAE,UAAW,qCAAqC,IAAc,YAAe,EAAS,EAAM,CAAE,GACjH,cAAc,GAAW,KAAK,CAAC,CAAC,CAElD,EAAc,cAAc,GAA4B,CAAE,YAAa,EAAW,MAAO,GAC/E,cAAc,GAAa,CAAE,SAAU,EAAsB,aAAY,CAAC,CAChF,CAAC,KAAmB,gBAAoB,SAAU,OACxC,cAAc,MAAO,CAAE,UAAW,SAAU,CAAC,GAC7C,cAAc,MAAO,CAAE,UAAW,gCAAgC,IAAc,QAAS,EAAa,GAClG,cAAc,GAAY,KAAK,CAAC,CAAC,GACzC,cAAc,WAAY,CAAE,UAAW,iCAAkC,UAAW,GAAM,CAAC,CAAC,ECxB7F,GAAuB,CAChC,uBAAwB,GAAK,EAAE,MAAM,UAAU,EAAI,GACnD,KAAM,EAAa,SACnB,WAAY,GACZ,mBAAoB,GACpB,SAAU,GACV,SAAU,EAAK,EAAM,IAAM,CACvB,IAAM,EAAY,EAAK,KAAK,MAAM;EAAK,CAAC,GACxC,OAAO,EAAI,YAAY,EAAU,CAAC,MAAQ,EAAI,EAAE,uBAEpD,KAAM,GAAK,GAAa,EAAG,EAAE,KAAK,KAAM,EAAE,KAAK,aAAa,CAC5D,SAAU,IAAM,CACZ,GAAG,EACH,KAAM,GACT,EACD,kBAAqB,GAAK,CACtB,GAAM,CAAE,WAAU,QAAO,SAAQ,oBAAmB,wBAAuB,gBAAe,sBAAuB,EACjH,SAAc,cAAc,GAAuB,CAAE,SAAU,EAAmB,WAAY,EAAe,QAA2B,qBAAoB,SAAU,GAAK,EAAS,CAC5K,GAAG,EACH,KAAM,EAAE,OAAO,MAClB,CAAC,CAAiB,gBAAe,WAAY,EAAuB,CAAC,EAE9E,SAAU,EAAS,IAAU,IAAY,EAAK,KAAO,OAAY,CAAE,GAAG,EAAM,KAAM,EAAS,CAC9F,CCzBY,GAAqB,CAC9B,uBAAwB,GAAK,EAAE,IAAI,UAAU,CAC7C,KAAM,GAAkB,OACxB,WAAY,GACZ,mBAAoB,GACpB,SAAU,GACV,YAAe,GACf,KAAM,GAAK,GAAkB,EAAG,EAAE,KAAK,IAAK,EAAE,KAAK,QAAS,EAAE,KAAK,WAAY,EAAE,KAAK,WAAY,EAAE,KAAK,cAAc,CACvH,QAAS,GAAK,CACV,GAAM,CAAE,SAAQ,OAAM,KAAM,EAAG,KAAM,GAAM,EACrC,CAAE,QAAO,UAAW,EACpB,EAAU,EAAK,WAAa,GAAK,EAAQ,GAAK,EAAI,EAAQ,EAC1D,EAAU,EAAS,EACzB,GAAI,KAAK,IAAI,EAAI,EAAQ,EAAI,IAAM,KAAK,IAAI,EAAI,EAAQ,EAAI,GACxD,MAAO,CACH,GAAG,EACH,QAAS,CAAC,EAAK,QAClB,EAIT,YAAe,OAClB,CACD,SAAS,GAAkB,EAAM,EAAU,CACvC,GAAM,CAAE,MAAK,SAAU,EACjB,EAAU,EAAM,eAChB,EAAS,GAAY,EAAE,CAO7B,OANI,GAAQ,OAAS,IACjB,EAAI,KAAO,EACX,EAAO,KAAO,GAElB,EAAO,OAAS,GAChB,EAAI,UAAY,SACT,EAEX,SAAS,GAAoB,EAAM,CAC/B,GAAM,CAAE,OAAQ,EAChB,EAAI,UAAY,QAEpB,SAAS,GAAkB,EAAM,EAAO,EAAS,EAAY,EAAY,EAAO,CAC5E,GAAM,CAAE,MAAK,OAAM,cAAa,SAAU,EACpC,CAAE,IAAG,IAAG,QAAO,UAAW,EAC1B,EAAkB,EAAU,EAAI,IAAe,mBAAqB,GAAM,GAAM,EAAc,EACpG,GAAI,IAAe,UAAY,EAAkB,EAAG,CAChD,EAAI,YAAc,EAClB,IAAM,EAAe,GAAK,EAAU,EAAc,GAElD,GADA,GAAa,EAAK,EAAO,EAAS,EAAa,EAAI,EAAe,EAAG,EAAG,EAAa,EAAQ,EAAe,EAAO,EAAQ,GAAM,OAAW,OAAW,GAAI,SAAU,EAAM,CACvK,EAAY,CACZ,EAAI,YAAc,EAClB,EAAI,WAAW,CACf,IAAK,IAAM,IAAW,CAAC,EAAG,EAAE,CACxB,IAAK,IAAM,IAAW,CAAC,GAAI,GAAI,EAAE,CAC7B,EAAI,KAAK,EAAI,EAAS,EAAI,EAAS,EAAI,EAAS,EAAG,EAAE,CAG7D,EAAI,UAAY,EAAM,UACtB,EAAI,MAAM,CACV,EAAI,WAAW,CAEnB,EAAI,YAAc,EAEtB,GAAI,IAAe,UAAa,IAAe,QAAU,CAAC,EAAU,CAChE,IAAM,EAAO,EAAM,UAAU,CACvB,EAAY,EAAM,eAClB,EAAQ,EAAI,EAAQ,EACtB,IAAe,QAAU,IAAgB,IACzC,EAAI,YAAc,EAAI,GAE1B,EAAI,UAAY,EAAM,UACtB,EAAI,KAAO,EACX,EAAI,SAAS,EAAM,EAAO,EAAI,EAAS,EAAI,GAAoB,EAAK,EAAU,CAAC,CAC3E,IAAgB,IAChB,EAAI,YAAc,ICzE9B,IAAa,GAAqB,CAC9B,2BAA8B,GAC9B,KAAM,GAAkB,OACxB,WAAY,GACZ,mBAAoB,GACpB,YAAe,IACf,KAAM,GAAK,GAAe,EAAG,EAAE,KAAK,KAAM,EAAE,KAAK,KAAK,CACtD,YAAe,OAClB,CACD,SAAS,GAAe,EAAM,EAAM,EAAM,CACtC,GAAM,CAAE,MAAK,OAAM,cAAa,QAAO,iBAAkB,EACnD,CAAE,IAAG,IAAG,MAAO,EAAG,OAAQ,GAAM,EACtC,EAAI,WAAW,CACf,EAAI,YAAc,EAClB,EAAI,KAAK,EAAI,EAAG,EAAI,EAAG,EAAG,EAAI,EAAE,CAChC,EAAI,UAAY,EAAM,gBACtB,EAAI,MAAM,CACV,EAAI,YAAc,EAClB,EAAI,WAAW,CACf,IAAM,EAAiB,IAAS,GAC5B,EAAQ,EACZ,GAAI,IAAS,OAAW,CACpB,IACM,EAAO,EAAI,EACX,EAAK,EAAI,EAAU,EACnB,EAAK,EAAI,EAAU,EACzB,EAAc,WAAW,EAAM,SAAU,EAAK,EAAI,EAAI,EAAM,EAAO,EAAiB,EAAI,EAAY,CACpG,EAAQ,MAEP,CACD,EAAQ,GACR,IACM,EAAW,EAAiB,GAAgB,EAAc,GAC1D,EAAa,EAAiB,GAAK,EAAI,GAAe,GAAgB,GACtE,EAAU,EAAM,sBAAwB,EAC1C,EAAW,IACX,EAAI,OAAO,EAAI,EAAU,EAAY,EAAI,EAAI,EAAE,CAC/C,EAAI,OAAO,EAAI,EAAU,EAAa,EAAU,EAAI,EAAI,EAAE,CAC1D,EAAI,OAAO,EAAI,EAAU,EAAa,EAAW,GAAK,EAAI,EAAI,EAAI,EAAW,GAAI,CACjF,EAAI,OAAO,EAAI,EAAU,EAAa,EAAW,GAAK,EAAI,EAAI,EAAI,EAAW,GAAI,CACjF,EAAI,UAAY,EAChB,EAAI,YAAc,EAAM,aACxB,EAAI,QAAU,QACd,EAAI,QAAQ,EAGpB,EAAI,UAAY,EAAM,WACtB,EAAI,SAAS,EAAM,EAAQ,EAAI,EAAM,sBAAwB,GAAK,EAAI,EAAI,EAAI,GAAoB,EAAK,EAAM,CAAC,CAC9G,EAAI,WAAW,CC9CnB,IAAM,KAA4B,KAAK,SAAY,YAAM,OAAO,mEAAyE,CAC5H,GAAqB,CAC9B,uBAAwB,GAAK,EAAE,MAAM,UAAU,EAAI,GACnD,KAAM,EAAa,OACnB,WAAY,GACZ,mBAAoB,GACpB,SAAU,GACV,SAAU,GACV,KAAM,GAAK,GAAa,EAAG,EAAE,KAAK,YAAa,EAAE,KAAK,aAAa,CACnE,SAAU,EAAK,EAAM,IAAU,EAAI,YAAY,EAAK,YAAY,CAAC,MAAQ,EAAM,sBAAwB,EACvG,SAAU,IAAM,CACZ,GAAG,EACH,KAAM,OACT,EACD,kBAAqB,GAAK,CACtB,GAAM,CAAE,gBAAe,WAAU,QAAO,sBAAuB,EAC/D,SAAc,gBAAoB,SAAU,CAAE,SAAU,KAAM,GACpD,cAAc,GAAqB,CAAE,UAAW,EAAe,SAAU,EAAM,WAAa,GAAM,MAAO,EAAM,KAAM,cAAe,EAAM,cAAe,cAAe,EAAM,cAAe,kBAAmB,EAAM,kBAAmB,iBAAkB,EAAM,iBAAsC,qBAAoB,SAAU,GAAK,EAAS,CACjV,GAAG,EACH,KAAM,OAAO,MAAM,EAAE,YAAc,EAAE,CAAG,EAAI,EAAE,WACjD,CAAC,CAAE,CAAC,CAAC,EAElB,SAAU,EAAS,EAAM,IAAY,CACjC,IAAM,EAAY,OAAO,EAAQ,UAAa,SACxC,EAAQ,SACR,OAAO,WAAW,OAAO,EAAQ,UAAa,SAAW,EAAQ,SAAW,EAAQ,CACtF,YAAO,MAAM,EAAU,EAAI,EAAK,OAAS,GAE7C,MAAO,CAAE,GAAG,EAAM,KAAM,EAAW,YAAa,EAAQ,iBAAmB,EAAK,YAAa,EAEpG,CChCY,GAAwB,CACjC,2BAA8B,GAC9B,YAAe,IACf,KAAM,EAAa,UACnB,WAAY,GACZ,mBAAoB,GACpB,KAAM,GACN,YAAe,OAClB,CACD,SAAS,GAAkB,EAAM,CAC7B,GAAM,CAAE,MAAK,QAAO,QAAS,EACvB,CAAE,IAAG,IAAG,OAAQ,GAAM,EAC5B,EAAI,WAAW,CACf,IAAM,EAAS,IACX,EAAS,EAAI,EAAM,sBAAwB,EACzC,EAAS,EAAI,EAAI,EACjB,EAAI,KAAK,IAAI,GAAiB,GAAG,CAAC,CAAG,EACrC,EAAI,KAAK,IAAI,GAAiB,GAAG,CAAC,CAAG,EAC3C,IAAK,IAAI,EAAI,EAAG,EAAI,GAAI,IACpB,EAAI,OAAO,EAAQ,EAAS,EAAO,CACnC,EAAI,OAAO,EAAQ,EAAS,EAAO,CACnC,EAAI,OAAO,EAAS,EAAG,EAAS,EAAE,CAClC,EAAI,OAAO,EAAS,EAAG,EAAS,EAAE,CAClC,EAAI,OAAO,EAAS,EAAG,EAAS,EAAE,CAClC,EAAI,OAAO,EAAS,EAAG,EAAS,EAAE,CAClC,GAAU,EAEd,EAAI,UAAY,IAChB,EAAI,QAAU,SACd,EAAI,YAAc,EAAM,UACxB,EAAI,QAAQ,CC5BhB,IAAa,GAAoB,CAC7B,uBAAwB,GAAK,EAAE,MAAM,UAAU,EAAI,GACnD,KAAM,EAAa,MACnB,WAAY,GACZ,mBAAoB,GACpB,UAAW,EAAG,IAAM,GAAa,EAAG,EAAG,EAAE,MAAM,UAAU,CACzD,KAAM,GAAK,GAAa,EAAG,EAAE,KAAK,KAAM,EAAE,KAAK,aAAa,CAC5D,SAAU,EAAK,EAAM,IAAU,EAAI,YAAY,EAAK,KAAK,CAAC,MAAQ,EAAM,sBAAwB,EAEhG,kBAAqB,GAAK,CACtB,GAAM,CAAE,gBAAe,WAAU,QAAO,sBAAuB,EAC/D,SAAc,cAAc,GAAc,CAAE,UAAW,EAAe,UAAW,EAAM,WAAa,GAAM,SAAU,EAAM,WAAa,GAAO,MAAO,EAAM,KAA0B,qBAAoB,SAAU,GAAK,EAAS,CACzN,GAAG,EACH,KAAM,EAAE,OAAO,MAClB,CAAC,CAAE,CAAC,EAEb,YAAe,OAClB,CCfY,GAAmB,CAC5B,uBAAwB,GAAK,EAAE,MAAM,UAAU,EAAI,GACnD,KAAM,EAAa,KACnB,WAAY,GAAY,EAAS,cAAgB,GACjD,mBAAoB,GACpB,SAAU,GACV,SAAU,GACV,KAAM,GAAK,CACP,GAAM,CAAE,OAAM,cAAa,gBAAe,MAAK,OAAM,QAAO,kBAAmB,EACzE,CAAE,cAAa,eAAc,cAAa,iBAAkB,EAClE,GAAI,IAAgB,IAAQ,EAAc,EAAG,CACzC,EAAI,aAAe,aACnB,IAAM,EAAO,EAAM,sBACb,EAAO,EAAM,oBACb,EAAI,GAAkB,EAAa,EAAK,EAAM,aAAc,aAAa,CACzE,EAAO,EAAK,OAAS,EACrB,EAAI,KAAK,IAAI,EAAM,EAAE,wBAA0B,IAAI,CACzD,EAAI,WAAW,CACf,GAAY,EAAK,EAAK,EAAI,EAAO,EAAG,EAAK,GAAK,EAAK,OAAS,GAAK,EAAI,EAAG,EAAE,MAAQ,EAAO,EAAG,EAAI,EAAG,EAAM,gBAAkB,EAAE,CAC7H,EAAI,YAAc,EAClB,EAAI,UAAYM,GAAU,EAAM,SAAU,GAAI,CAC9C,EAAI,MAAM,CAEV,EAAI,YAAc,EAClB,EAAI,UAAY,EAAM,SACtB,EAAI,aAAe,SACnB,IAAiB,OAAO,CAE5B,GAAa,EAAG,EAAa,EAAc,EAAe,EAAc,EAE5E,SAAU,EAAK,EAAM,IAAM,CACvB,IAAM,EAAQ,EAAK,YAAY,MAAM;EAAM,EAAK,gBAAkB,GAAO,OAAY,EAAE,CACnF,EAAe,EACnB,IAAK,IAAM,KAAQ,EACf,EAAe,KAAK,IAAI,EAAc,EAAI,YAAY,EAAK,CAAC,MAAM,CAEtE,OAAO,EAAe,EAAI,EAAE,uBAEhC,SAAU,IAAM,CACZ,GAAG,EACH,KAAM,GACT,EACD,cAAe,IAAS,CACpB,eAAgB,EAAK,gBAAkB,GACvC,OAAQ,GAAK,CACT,GAAM,CAAE,gBAAe,WAAU,QAAO,sBAAuB,EAC/D,SAAc,cAAc,GAAc,CAAE,MAAO,EAAK,gBAAkB,GAAO,CAAE,QAAS,YAAa,CAAG,OAAW,UAAW,EAAe,UAAW,EAAM,WAAa,GAAM,SAAU,EAAM,WAAa,GAAM,WAAY,GAAM,MAAO,EAAM,KAA0B,qBAAoB,SAAU,GAAK,EAAS,CACrT,GAAG,EACH,KAAM,EAAE,OAAO,MAClB,CAAC,CAAE,CAAC,EAEhB,EACD,SAAU,EAAS,EAAM,IAAY,IAAY,EAAK,KAChD,OACA,CAAE,GAAG,EAAM,KAAM,EAAS,YAAa,EAAQ,iBAAmB,EAAK,YAAa,CAC7F,CC5DY,GAAqCN,EAAO,MAAM,CAAC,CAC9D,KAAM,wBACN,MAAO,cACP,UAAW,GACZ,CAAC,CCDI,GAAmB,GAAK,CAC1B,GAAM,CAAE,MAAK,WAAU,gBAAe,WAAU,qBAAoB,WAAY,EAC1E,CAAC,EAAU,KAAqB,SAAS,CAAC,IAAa,IAAQ,IAAM,GAAe,CACpF,IAAoB,gBAAkB,CACxC,EAAY,GAAK,EAClB,EAAE,CAAC,CAIN,OAHI,EACA,EAAc,cAAc,GAAc,CAAsB,qBAAoB,UAAW,GAAM,UAAW,GAAM,MAAO,EAAe,WAAU,CAAC,CAE3J,EAAc,cAAc,GAAuB,OACzC,cAAc,IAAK,CAAE,UAAW,gBAAiB,KAAM,EAAK,OAAQ,SAAU,IAAK,sBAAuB,CAAE,EAAQ,CAC1H,CAAC,KAAmB,cAAc,MAAO,CAAE,UAAW,gBAAiB,QAAS,EAAa,GACnF,cAAc,GAAY,KAAK,CAAC,GACpC,cAAc,WAAY,CAAE,UAAW,YAAa,UAAW,GAAM,CAAC,CAAC,ECXrF,SAAS,GAAY,EAAS,EAAM,EAAO,EAAc,CACrD,IAAI,EAAI,EAAM,sBACR,EAAI,EAAK,OAAS,EAAI,EAAQ,wBAA0B,EACxD,EAAQ,EAAQ,MAChB,EAAS,EAAQ,wBAOvB,OANI,IAAiB,QACjB,EAAI,EAAK,MAAQ,EAAQ,EAAM,sBAE1B,IAAiB,WACtB,EAAI,EAAK,MAAQ,EAAI,EAAQ,GAE1B,CAAE,IAAG,IAAG,QAAO,SAAQ,CCHlC,IAAa,GAAmB,CAC5B,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GDP2B,CAC3B,uBAAwB,GAAK,EAAE,MAAM,UAAU,EAAI,GACnD,KAAM,EAAa,IACnB,WAAY,GAAW,EAAQ,cAAgB,GAC/C,mBAAoB,GACpB,SAAU,GACV,SAAU,GACV,KAAM,GAAK,CACP,GAAM,CAAE,OAAM,QAAO,iBAAgB,SAAQ,SAAQ,OAAM,OAAQ,EAC7D,EAAM,EAAK,aAAe,EAAK,KAC/B,EAAU,EAAK,cAAgB,GACrC,GAAI,IAAmB,QAAa,GAAW,IAAW,QAAa,IAAW,OAAW,CAGzF,GAAM,CAAE,IAAG,IAAG,MAAO,EAAG,OAAQ,GADf,GADP,GAAkB,EAAK,EAAK,EAAM,aAAa,CACzB,EAAM,EAAO,EAAK,aAAa,CAG/D,GAAI,GAAU,EAAI,GAAK,GAAU,EAAI,EAAI,EAAI,GAAK,GAAU,EAAI,GAAK,GAAU,EAAI,EAAI,EAAI,EAAG,CAC1F,IAAM,EAAmB,GAAoB,EAAK,EAAM,aAAa,CACrE,EAAe,UAAU,CACzB,IACM,EAAQ,EAAI,EAClB,EAAI,WAAW,CACf,EAAI,OAAO,EAAK,EAAI,EAAG,KAAK,MAAM,EAAK,EAAI,EAAQ,EAAI,EAAgB,CAAG,GAAI,CAC9E,EAAI,OAAO,EAAK,EAAI,EAAI,EAAG,KAAK,MAAM,EAAK,EAAI,EAAQ,EAAI,EAAgB,CAAG,GAAI,CAClF,EAAI,YAAc,EAAM,UACxB,EAAI,QAAQ,CACZ,EAAI,MAAM,CACV,EAAI,UAAY,EAAE,cAClB,GAAa,CAAE,GAAG,EAAG,KAAM,CAAE,GAAG,EAAM,EAAG,EAAK,EAAI,EAAG,CAAE,CAAE,EAAK,EAAK,aAAa,CAChF,GAAa,CAAE,GAAG,EAAG,KAAM,CAAE,GAAG,EAAM,EAAG,EAAK,EAAI,EAAG,CAAE,CAAE,EAAK,EAAK,aAAa,CAChF,GAAa,CAAE,GAAG,EAAG,KAAM,CAAE,GAAG,EAAM,EAAG,EAAK,EAAI,EAAG,CAAE,CAAE,EAAK,EAAK,aAAa,CAChF,GAAa,CAAE,GAAG,EAAG,KAAM,CAAE,GAAG,EAAM,EAAG,EAAK,EAAI,EAAG,CAAE,CAAE,EAAK,EAAK,aAAa,CAChF,EAAI,SAAS,EAGrB,EAAI,UAAY,EAAU,EAAM,UAAY,EAAM,SAClD,GAAa,EAAG,EAAK,EAAK,aAAa,EAE3C,QAAS,GAAK,CACV,GAAM,CAAE,OAAM,SAAQ,OAAM,OAAM,SAAU,EACtC,EAAM,EAAK,aAAe,EAAK,KACrC,GAAI,EAAK,cAAgB,IAAQ,EAAK,aAAe,OACjD,OACJ,IAAM,EAAI,GAAqB,EAAK,EAAM,aAAa,CACvD,GAAI,IAAM,OACN,OACJ,IAAM,EAAW,GAAY,EAAG,EAAQ,EAAO,EAAK,aAAa,CAChD,GAAY,CACzB,EAAG,EAAS,EAAI,EAChB,EAAG,EAAS,EAAI,EAChB,MAAO,EAAS,MAAQ,EACxB,OAAQ,EAAS,OAAS,EAC7B,CAAE,EAAM,EAAK,EAEV,EAAK,WAAW,EAAE,EAI1B,SAAU,EAAK,EAAM,IAAU,EAAI,YAAY,EAAK,aAAe,EAAK,KAAK,CAAC,MAAQ,EAAM,sBAAwB,EACpH,SAAU,IAAM,CACZ,GAAG,EACH,KAAM,GACT,EACD,cAAe,GAAQ,GAAK,CACxB,GAAM,CAAE,WAAU,QAAO,gBAAe,sBAAuB,EAC/D,SAAc,cAAc,GAAkB,CAAE,cAAe,EAAM,WAAa,KACzE,GAAkB,EAAK,cAAgB,IAAQ,EAAK,aAAe,QAAa,IAAK,EAAM,KAAM,QAAS,EAAM,aAAe,EAAM,KAA0B,qBAAoB,SAAU,EAAM,WAAa,GAAM,SAAU,GAAK,EAAS,CAC/O,GAAG,EACH,KAAM,EAAE,OAAO,MAClB,CAAC,CAAE,CAAC,EAEb,SAAU,EAAS,EAAM,IAAY,IAAY,EAAK,KAChD,OACA,CAAE,GAAG,EAAM,KAAM,EAAS,YAAa,EAAQ,iBAAmB,EAAK,YAAa,CAC7F,CCjEA,iBC5BD,IAAI,OACA,MAGA,EAAkB,sBA8CtB,SAAS,EAAS,EAAM,EAAM,EAAS,CACrC,IAAI,EAAU,GACV,EAAW,GAEf,GAAI,OAAO,GAAQ,WACjB,MAAU,UAAU,EAAgB,CAMtC,OAJI,EAAS,EAAQ,GACnB,EAAU,YAAa,EAAU,CAAC,CAAC,EAAQ,QAAU,EACrD,EAAW,aAAc,EAAU,CAAC,CAAC,EAAQ,SAAW,GAEnD,EAAS,EAAM,EAAM,CAC1B,QAAW,EACX,QAAW,EACX,SAAY,EACb,CAAC,CAGJ,EAAO,QAAU,UCjEX,GAAU,EAAE,CACZ,GAAN,cAAoC,EAAqB,CACrD,gBAAoB,OACpB,gBAAkB,EAAE,CACpB,MAAQ,EAAE,CACV,YAAY,EAAa,CACrB,KAAK,YAAc,EAGvB,8BAA4B,CACxB,KAAK,YAAY,IAAI,GAAQ,KAAK,gBAAgB,CAAC,CACnD,KAAK,gBAAkB,EAAE,EAC1B,GAAG,CACN,qBAAyB,CACrB,IAAM,EAAO,OAAO,KAAK,KAAK,MAAM,CACpC,IAAK,IAAM,KAAO,EAAM,CACpB,IAAM,EAAM,KAAK,MAAM,GACnB,EAAO,GACX,IAAK,IAAI,EAAI,EAAG,EAAI,EAAI,MAAM,OAAQ,IAAK,CACvC,IAAM,EAAS,EAAI,MAAM,GACzB,GAAI,KAAK,WAAW,EAAO,CAAE,CACzB,EAAO,GACP,OAGJ,EACA,EAAI,MAAQ,EAAI,MAAM,OAAO,KAAK,WAAW,EAG7C,EAAI,QAAQ,CACZ,OAAO,KAAK,MAAM,MAI9B,UAAU,EAAK,EAAK,EAAK,EAAK,CAC1B,IAAI,EAAS,GACP,EAAM,GAAQ,KAAK,EAAI,IAAI,MAC7B,EAAW,GACT,EAAS,CACX,IAAK,OACL,MAAO,CAAC,EAAmB,EAAK,EAAI,CAAC,CACrC,MACA,WAAc,CACN,IAEJ,EAAW,GACP,GAAQ,OAAS,GACjB,GAAQ,QAAQ,EAAI,CAEd,IACN,EAAI,IAAM,MAGrB,CACK,EAAc,IAAI,QAAQ,GAAK,EAAI,iBAAiB,WAAc,EAAE,KAAK,CAAC,CAAC,CAEjF,sBAAsB,SAAY,CAC9B,GAAI,CACA,EAAI,IAAM,EACV,MAAM,EACN,MAAM,EAAI,QAAQ,CAClB,IAAM,EAAU,KAAK,MAAM,GAC3B,GAAI,IAAY,QAAa,CAAC,EAAU,CACpC,EAAQ,IAAM,EACd,IAAK,IAAM,KAAU,EAAQ,MACzB,KAAK,gBAAgB,KAAK,GAAqB,EAAO,CAAC,CAE3D,EAAS,GACT,KAAK,YAAY,OAGnB,CACF,EAAO,QAAQ,GAErB,CACF,KAAK,MAAM,GAAO,EAEtB,eAAe,EAAK,EAAK,EAAK,CAC1B,IAAM,EAAM,EACN,EAAU,KAAK,MAAM,GAC3B,GAAI,IAAY,OAAW,CACvB,IAAM,EAAS,EAAmB,EAAK,EAAI,CAI3C,OAHK,EAAQ,MAAM,SAAS,EAAO,EAC/B,EAAQ,MAAM,KAAK,EAAO,CAEvB,EAAQ,SAGf,KAAK,UAAU,EAAK,EAAK,EAAK,EAAI,GC7EjC,KAAsB,YATR,EAAG,IAAQ,CAClC,IAAM,IAAmB,aACd,CAAE,GAAG,GAAS,GAAG,EAAE,YAAa,EACxC,CAAC,EAAE,YAAY,CAAC,CACb,IAA0B,YACrB,EAAE,mBAAqB,IAAI,GACnC,CAAC,EAAE,kBAAkB,CAAC,CACzB,SAAc,cAAc,GAAY,CAAE,GAAG,EAAG,UAAW,GAAkB,YAAa,EAAiB,MAAwB,oBAAmB,CAAC,EAE3F,CCThE,SAAS,GAAO,EAAsB,CACpC,OAAO,iBAAiB,SAAS,gBAAgB,CAAC,iBAAiB,EAAK,CAAC,MAAM,CAIjF,SAAS,GAAU,EAAe,EAAuB,CACvD,GAAI,EAAM,WAAW,IAAI,CAAE,CACzB,IAAM,EAAM,EAAM,MAAM,EAAE,CAI1B,MAAO,QAHG,SAAS,EAAI,MAAM,EAAG,EAAE,CAAE,GAAG,CAGtB,IAFP,SAAS,EAAI,MAAM,EAAG,EAAE,CAAE,GAAG,CAEhB,IADb,SAAS,EAAI,MAAM,EAAG,EAAE,CAAE,GAAG,CACV,IAAI,EAAM,GAEzC,OAAO,EAIT,SAAS,IAA6B,CACpC,IAAM,EAAK,GAAO,qBAAqB,CACjC,EAAK,GAAO,qBAAqB,CACjC,EAAQ,GAAO,gBAAgB,CAC/B,EAAU,GAAO,2BAA2B,CAC5C,EAAU,GAAO,kBAAkB,CACnC,EAAY,GAAO,6BAA6B,CAChD,EAAS,GAAO,iBAAiB,CACjC,EAAS,GAAO,iBAAiB,CACjC,EAAgB,GAAO,yBAAyB,CAChD,EAAa,GAAO,sBAAsB,CAC1C,EAAW,GAAO,cAAc,EAAI,+BAE1C,MAAO,CACL,OAAQ,EACR,aAAc,EACd,SAAU,EACV,iBAAkB,EAClB,gBAAiB,EACjB,SAAU,EACV,iBAAkB,EAClB,SAAU,EACV,WAAY,EACZ,UAAW,EACX,WAAY,EACZ,gBAAiB,EACjB,mBAAoB,EACpB,WAAY,EACZ,YAAa,EACb,SAAU,EACV,YAAa,GAAU,EAAS,IAAK,CACrC,YAAa,EACb,sBAAuB,EACvB,WAAY,EACZ,cAAe,OACf,gBAAiB,WACjB,eAAgB,OAChB,WAAY,IACZ,sBAAuB,EACvB,oBAAqB,EACrB,eAAgB,GACjB,CAOH,SAAgB,IAAgC,CAE9C,GAAM,CAAC,EAAK,kBAAmB,EAAE,CAQjC,OANA,mBAAgB,CACd,IAAM,EAAW,IAAI,qBAAuB,EAAQ,GAAM,EAAI,EAAE,CAAC,CAEjE,OADA,EAAS,QAAQ,SAAS,gBAAiB,CAAE,WAAY,GAAM,gBAAiB,CAAC,QAAQ,CAAE,CAAC,KAC/E,EAAS,YAAY,EACjC,EAAE,CAAC,EAEN,iBAAqB,IAAY,CAAE,CAAC,EAAI,CAAC,CClE3C,SAAS,GAAiB,EAAc,EAAiC,EAAsB,CAC7F,IAAM,EAAU,EAAK,OAAS,EAAI,GAC9B,EAAc,EACZ,EAAc,KAAK,IAAI,EAAK,OAAQ,GAAG,CAC7C,IAAK,IAAI,EAAI,EAAG,EAAI,EAAa,IAAK,CACpC,IAAM,EAAM,EAAK,KAAK,GACtB,GAAI,GAAO,KAAM,SACjB,IAAM,EAAM,OAAO,GAAQ,SAAW,GAAK,OAAO,EAAI,CAAC,OACvD,EAAc,KAAK,IAAI,EAAa,EAAM,EAAE,CAG9C,IAAM,EADY,6EAA6E,KAAK,EAAK,aAAa,CAAC,CAC9F,GAAK,IAC9B,OAAO,KAAK,IAAI,EAAM,KAAK,IAAI,KAAK,IAAI,EAAS,EAAY,CAAG,GAAI,IAAI,CAAC,CAO3E,SAAgB,GACd,EACA,EACA,EACA,EACA,EACA,EACA,EACuB,CACvB,wBAAqB,CACnB,IAAM,EAAS,EAAY,OAAQ,GAAM,EAAW,IAAI,EAAE,CAAC,CACrD,EAAW,EAAY,OAAQ,GAAM,CAAC,EAAW,IAAI,EAAE,CAAC,CACxD,EAAU,CAAC,GAAG,EAAQ,GAAG,EAAS,CAElC,EAAY,IAAI,IAAI,EAAO,IAAK,GAAM,CAAC,EAAE,KAAM,EAAE,CAAC,CAAC,CAmBzD,MAAO,CAAE,QAjBqB,EAAQ,IAAK,GAAS,CAClD,IAAM,EAAM,EAAU,IAAI,EAAK,CACzB,EAAO,GAAK,IAAM,GAEpB,EAUJ,OATI,IAAY,EACd,EAAO,IAAa,MAAQ,UAAY,WAC/B,EACT,EAAO,cACE,GAAK,KACd,EAAO,YAIF,CAAE,MAAO,EAAM,GAAI,EAAM,MADlB,EAAU,IAAI,EAAK,EAAI,GAAiB,EAAM,EAAM,GAAK,MAAQ,OAAO,CAC/C,QAAS,GAAM,OAAM,EAC5D,CAEgB,cAAe,EAAO,OAAQ,YAAa,EAAS,EACrE,CAAC,EAAQ,EAAa,EAAY,EAAW,EAAM,EAAS,EAAS,CAAC,CCd3E,SAAgB,GAAY,EAAuB,CACjD,GAAI,GAAO,KAAM,MAAO,GACxB,GAAI,OAAO,GAAQ,SAAU,MAAO,GACpC,IAAM,EAAI,OAAO,EAAI,CACrB,GAAI,EAAE,YAA2B,MAAO,GACxC,IAAM,EAAU,EAAE,WAAW,CAG7B,MADA,IADK,EAAQ,KAAO,KAAO,EAAQ,KAAO,OAAS,EAAQ,SAAS,IAAI,EAAI,EAAQ,SAAS,IAAI,GAC7F,EAAQ,WAAW,QAAQ,EAAK,EAAQ,WAAW,IAAI,EAAI,EAAQ,SAAS,IAAI,EAKtF,SAAgB,GAAgB,EAAsB,CAGpD,OAFI,GAAO,KAAa,OACpB,OAAO,GAAQ,SAAiB,KAAK,UAAU,EAAI,CAChD,OAAO,EAAI,CAIpB,SAAgB,GAAW,EAAsB,CAC/C,IAAM,EAAI,EAAK,WAAW,CAC1B,GAAI,EAAE,KAAO,KAAO,EAAE,KAAO,IAC3B,GAAI,CAAiB,OAAf,KAAK,MAAM,EAAE,CAAS,YAAgB,EAI9C,OAFI,EAAE,WAAW,QAAQ,EAAK,EAAE,WAAW,IAAI,EAAI,UAAU,KAAK,EAAE,CAAU,MAC1E,EAAE,WAAW,MAAM,EAAI,WAAW,KAAK,EAAE,CAAS,OAC/C,YCxET,SAAS,GAAa,EAA4B,CAChD,IAAM,EAAI,EAAK,aAAa,CAK5B,MAJI,wEAAwE,KAAK,EAAE,CAC1E,EAAa,OAElB,QAAQ,KAAK,EAAE,CAAS,EAAa,QAClC,EAAa,KAItB,SAAS,GAAgB,EAAgC,CACvD,IAAM,EAAI,EAAI,KAAK,aAAa,CAKhC,MADA,GAHI,kCAAkC,KAAK,EAAE,EACzC,iCAAiC,KAAK,EAAE,EAAI,EAAI,cAAgB,mCAAmC,KAAK,EAAI,aAAa,EAEzH,IAAM,WAAa,EAAI,IAAM,CAAC,EAAI,cAKxC,SAAS,GAAgB,EAAa,EAAM,IAAa,CACvD,OAAO,EAAI,OAAS,EAAM,EAAI,MAAM,EAAG,EAAI,CAAG,IAAM,EAItD,IAAM,GAAgB,CAAE,OAAQ,2BAA4B,CAY5D,SAAgB,GACd,EACA,EACA,EACA,EACA,EACA,EAC2B,CAC3B,IAAM,eAAiB,EAAK,CAC5B,EAAQ,QAAU,EAClB,IAAM,eAAqB,EAAY,CACvC,EAAY,QAAU,EAEtB,IAAM,eAAmB,IAAI,IAAgC,CAoG7D,MAnGA,GAAU,QAAU,IAAI,IAAI,EAAO,IAAK,GAAM,CAAC,EAAE,KAAM,EAAE,CAAC,CAAC,CAmGpD,CAAE,kCAjG2B,CAAC,EAAQ,KAA4B,CACvE,IAAM,EAAU,EAAY,QAAQ,GAC9B,EAAM,EAAQ,QAAQ,GAC5B,GAAI,CAAC,GAAW,CAAC,EACf,MAAO,CAAE,KAAM,EAAa,KAAM,KAAM,GAAI,YAAa,GAAI,aAAc,GAAO,CAGpF,IAAM,EAAY,EAAU,QAAQ,IAAI,EAAQ,CAC1C,EAAO,EAAY,GAAa,EAAU,KAAK,CAAG,EAAa,KAC/D,EAAO,GAAW,IAAM,GAGxB,EAAQ,EAAQ,EAAI,GAAS,OAC7B,EAAW,OAAO,GAAU,UAAY,EAAM,WAAW,SAAS,CAClE,EAAa,GAAG,EAAM,GAAG,IACzB,EAAU,EAAW,QAAQ,IAAI,EAAW,CAC5C,EAAM,IAAY,OAA6B,EAAI,GAArB,EAAQ,OACtC,EAAa,IAAY,OAG/B,GAAI,GAAQ,EAAU,CAEpB,GADe,GAAY,GAAgB,EAAU,CAEnD,MAAO,CAAE,KAAM,EAAa,KAAM,KAAM,GAAI,YAAa,OAAQ,aAAc,GAAO,SAAU,GAC9F,cAAe,CAAE,SAAU,UAAW,CAAE,CAG5C,IAAM,EAAY,IAAY,OAA2C,GAA/B,OAAO,EAAQ,QAAU,GAAG,CACtE,MAAO,CAAE,KAAM,EAAa,KAAM,KAAM,EAAW,YAAa,GAAa,YAC3E,aAAc,GAAM,SAAU,GAC9B,cAAe,EAAa,EAAa,GAAgB,OAAa,CAAE,SAAU,UAAW,CAAE,CAInG,GAAI,GAAO,KAAM,CACf,IAAI,EAAc,EAAW,GAAK,OAClC,GAAI,GAAY,CAAC,GAAc,EAAW,CACxC,IAAM,EAAI,EAAU,KAAK,aAAa,CAClC,EAAU,aACZ,EAAc,EAAU,aACf,6BAA6B,KAAK,EAAE,CAC7C,EAAc,QACL,UAAU,KAAK,EAAE,GAC1B,EAAc,qBAGlB,MAAO,CACL,KAAM,EAAa,KAAM,KAAM,GAAI,YAAa,EAChD,aAAc,CAAC,EAAM,SAAU,EAC/B,cAAe,EAAa,GAAiB,GAAY,IAAgB,OAAS,CAAE,SAAU,UAAW,CAAG,CAAE,SAAU,UAAW,CACpI,CAIH,GAAI,IAAS,EAAa,QAAU,OAAO,GAAQ,SACjD,MAAO,CACL,KAAM,EAAa,OAAQ,KAAM,EAAK,YAAa,OAAO,EAAI,CAC9D,aAAc,CAAC,EAAM,SAAU,EAC/B,cAAe,EAAa,GAAgB,OAC7C,CAIH,GAAI,IAAS,EAAa,SAAW,OAAO,GAAQ,UAClD,MAAO,CAAE,KAAM,EAAa,QAAS,KAAM,EAAK,SAAU,EAAM,aAAc,GAAO,CAIvF,IAAM,EAAS,GAAgB,EAAI,CACnC,MAAO,CACL,KAAM,EAAa,KAAM,KAAM,EAAQ,YAAa,GAAgB,EAAO,CAC3E,aAAc,CAAC,EAAM,SAAU,EAC/B,cAAe,EAAa,GAAgB,OAC7C,EACA,EAAE,CAAC,CAuBmB,gCArBS,CAAC,EAAQ,GAAe,IAA+B,CACvF,GAAI,CAAC,EAAO,OACZ,IAAM,EAAU,EAAY,QAAQ,GAC9B,EAAM,EAAQ,QAAQ,GAC5B,GAAI,CAAC,GAAW,CAAC,EAAK,OAEtB,IAAM,EAAQ,EAAI,GACd,EACJ,GAAI,EAAS,OAAS,EAAa,KACjC,EAAS,EAAS,OAAS,GAAK,KAAO,EAAS,aACvC,EAAS,OAAS,EAAa,OACxC,EAAS,EAAS,aACT,EAAS,OAAS,EAAa,QACxC,EAAS,EAAS,UAElB,OAGF,EAAe,EAAO,EAAS,EAAO,EACrC,CAAC,EAAO,EAAe,CAAC,CAEY,CC1JzC,IAAM,GAAiC,CACrC,QAAS,EAAiB,OAAO,CACjC,KAAM,EAAiB,OAAO,CAC/B,CAcD,SAAgB,IAA6C,CAC3D,GAAM,CAAC,EAAe,kBAA4C,GAAgB,CAyBlF,MAAO,CAAE,gBAAe,wCAvBmB,GAA0B,CACnE,EAAiB,EAAO,EACvB,EAAE,CAAC,CAqByC,qCAnBN,CACvC,IAAM,EAAoB,EAAE,CAC5B,GAAI,EAAc,KAChB,IAAK,IAAM,KAAS,EAAc,KAEhC,GAAI,MAAM,QAAQ,EAAM,CACtB,IAAK,IAAI,EAAI,EAAM,GAAI,EAAI,EAAM,GAAI,IAAK,EAAQ,KAAK,EAAE,MAEzD,EAAQ,KAAK,EAAM,CAIzB,OAAO,GACN,CAAC,EAAc,KAAK,CAAC,CAM2C,qCAJ1B,CACvC,EAAiB,GAAgB,EAChC,EAAE,CAAC,CAE6E,CCrBrF,SAAgB,GACd,EACA,EACA,EAC4B,CAC5B,GAAM,CAAC,EAAc,kBAAsD,IAAI,IAAM,CAC/E,eAAoB,EAAa,CACvC,EAAW,QAAU,EACrB,IAAM,eAAsB,GAAM,CAiClC,MAAO,CACL,eAAc,aAAY,2BAhCC,EAAgB,EAAa,IAAoB,CAC5E,IAAM,EAAM,GAAG,EAAM,GAAG,IACxB,EAAiB,GAAS,IAAI,IAAI,EAAK,CAAC,IAAI,EAAK,CAAE,QAAO,MAAK,SAAQ,CAAC,CAAC,EACxE,EAAE,CAAC,CA6B+B,4BA3BP,SAAY,CACxC,GAAI,CAAC,EAAO,OACZ,IAAM,EAAU,IAAI,IACpB,IAAK,IAAM,KAAQ,EAAW,QAAQ,QAAQ,CAAE,CAC9C,IAAM,EAAQ,OAAO,EAAK,MAAM,CAC5B,EAAM,WAAW,SAAS,EACvB,EAAQ,IAAI,EAAM,EAAE,EAAQ,IAAI,EAAO,EAAE,CAAC,CAC/C,EAAQ,IAAI,EAAM,CAAE,EAAK,KAAO,EAAK,QAErC,EAAa,EAAO,EAAK,MAAO,EAAK,IAAK,EAAK,OAAO,CAG1D,GAAI,EACF,IAAK,IAAM,KAAU,EAAQ,QAAQ,CACnC,MAAM,EAAY,EAAO,CAG7B,EAAa,QAAU,IAEtB,CAAC,EAAO,EAAc,EAAY,CAAC,CAQU,iCANX,CACnC,EAAgB,IAAI,IAAM,CAC1B,EAAa,QAAU,IACtB,EAAE,CAAC,CAIJ,WAAY,EAAa,KAAO,EAAG,aAAc,EAAa,KAC9D,eACD,CCvDH,SAAgB,GACd,EACA,EAC0B,CAC1B,GAAM,CAAC,EAAW,kBAAsC,IAAI,IAAM,CAclE,MAAO,CAAE,gCAZ2B,CAClC,GAAI,EAAU,OAAS,GAAK,CAAC,EAAO,OAAO,EAC3C,IAAM,EAAoC,EAAE,CACtC,EAAoC,EAAE,CAC5C,IAAK,IAAM,KAAO,EACZ,EAAU,IAAI,OAAO,EAAI,IAAU,GAAG,CAAC,CAAE,EAAO,KAAK,EAAI,CAAO,EAAO,KAAK,EAAI,CAEtF,MAAO,CAAC,GAAG,EAAQ,GAAG,EAAO,EAC5B,CAAC,EAAM,EAAW,EAAM,CAAC,CAIJ,YAFJ,EAAU,KAEO,YAAW,eAAc,CCLhE,SAAgB,GAAoB,EAAmC,CACrE,GAAM,CAAE,cAAa,cAAa,SAAQ,QAAO,eAAc,iBAAgB,gBAAe,iBAAgB,UAAS,gBAAe,gBAAiB,EACjJ,CAAE,WAAY,EAAY,EAAY,IAAO,CAAE,QAAS,EAAE,QAAS,EAAE,CAAC,CACtE,CAAC,EAAa,kBAA+C,KAAK,CAGlE,eAAwB,EAAY,CAC1C,EAAe,QAAU,EACzB,IAAM,eAAwB,EAAY,CAC1C,EAAe,QAAU,EAGzB,IAAM,oBAA8B,GAAmB,CACrD,IAAM,EAAM,EAAY,GAAS,GAAI,CAAC,EAAK,OAC3C,IAAM,EAAK,EAAQ,OAAO,EAAI,IAAU,GAAG,CAAG,GACxC,EAAQ,GAAiB,GACzB,EAAU,KAAK,UAAU,EAAK,KAAM,EAAE,CAC5C,EAAe,CAAE,MAAO,EAAK,QAAQ,IAAK,EAAQ,MAAM,IAAU,KAAO,SAAS,IAChF,UAAS,SAAU,OAAQ,UAAW,GAAG,EAAa,GAAG,EAAM,OAAO,IAAM,CAAC,EAC9E,CAAC,EAAa,EAAO,EAAe,EAAa,CAAC,CAE/C,qBAA+B,EAAgB,IAAmB,CACtE,IAAM,EAAM,EAAY,GAAS,GAAI,CAAC,EAAK,OAC3C,IAAM,EAAU,EAAY,GAAS,GAAI,CAAC,EAAS,OACnD,IAAM,EAAM,GAAgB,EAAI,GAAS,CACnC,EAAK,EAAQ,OAAO,EAAI,IAAU,EAAO,CAAG,OAAO,EAAO,CAC1D,EAAQ,GAAiB,GAC/B,EAAe,CAAE,MAAO,GAAG,EAAQ,IAAI,IAAK,EAAQ,MAAM,IAAU,KAClE,QAAS,EAAK,SAAU,GAAW,EAAI,CAAE,UAAW,GAAG,EAAa,GAAG,EAAM,GAAG,EAAQ,GAAG,IAAM,CAAC,EACnG,CAAC,EAAa,EAAa,EAAO,EAAe,EAAa,CAAC,CAE5D,wBAAqC,CACpC,GACL,EAAQ,CAAE,KAAM,SAAU,MAAO,EAAY,MAAO,UAAW,KAAM,SAAU,GAC7E,SAAU,CAAE,cAAe,EAAY,QAAS,eAAgB,EAAY,SAAU,UAAW,EAAY,UAAW,CAAE,CAAC,EAC5H,CAAC,EAAS,EAAY,CAAC,CAGpB,qBAA2B,EAAc,IAA2C,CACxF,GAAI,CAAC,EAAO,MAAO,GACnB,GAAM,CAAC,EAAU,GAAY,EAC7B,IAAK,IAAI,EAAI,EAAG,EAAI,EAAO,OAAQ,IAAK,CACtC,IAAM,EAAM,EAAe,QAAQ,EAAW,GAC9C,GAAI,CAAC,EAAK,SACV,IAAM,EAAK,EAAI,GACf,IAAK,IAAI,EAAI,EAAG,EAAI,EAAO,GAAI,OAAQ,IAAK,CAC1C,IAAM,EAAU,EAAe,QAAQ,EAAW,GAGlD,GAFI,CAAC,GACU,EAAO,KAAM,GAAM,EAAE,OAAS,EAAQ,EACzC,GAAI,SAChB,IAAM,EAAM,EAAO,GAAI,GACvB,EAAQ,EAAI,EAAS,IAAQ,GAAK,KAAO,EAAI,EAGjD,MAAO,IACN,CAAC,EAAO,EAAQ,EAAQ,CAAC,CAGtB,eAAmB,EAAO,CAChC,EAAU,QAAU,EACpB,IAAM,eAAoB,EAAc,CACxC,EAAW,QAAU,EACrB,IAAM,eAAoB,EAAQ,CAClC,EAAW,QAAU,EACrB,IAAM,eAAkB,EAAM,CAkE9B,MAjEA,GAAS,QAAU,GAEnB,mBAAgB,CACd,GAAI,CAAC,EAAc,OACnB,IAAM,EAAW,GAAsB,CACrC,IAAM,EAAY,EAAa,QAC/B,GAAI,CAAC,GAAa,CAAC,EAAU,SAAS,SAAS,cAAc,CAAE,OAE/D,IAAM,EAAO,SAAS,eAA+B,QACrD,GAAI,IAAQ,SAAW,IAAQ,WAAY,OAC3C,IAAM,EAAK,EAAS,QACpB,GAAI,CAAC,EAAI,OACT,IAAM,EAAM,EAAW,SAAS,QAChC,GAAI,CAAC,EAAK,OACV,IAAM,EAAO,EAAE,eAAe,QAAQ,aAAa,CACnD,GAAI,CAAC,EAAM,OACX,IAAM,EAAU,EAAK,MAAM,QAAQ,CAAC,OAAQ,GAAM,EAAE,OAAS,EAAE,CAAC,IAAK,GAAM,EAAE,MAAM,IAAK,CAAC,CACzF,GAAI,EAAQ,SAAW,EAAG,OAC1B,GAAM,CAAC,EAAU,GAAY,EAAI,KACjC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,OAAQ,IAAK,CACvC,IAAM,EAAM,EAAe,QAAQ,EAAW,GAC9C,GAAI,CAAC,EAAK,SACV,IAAM,EAAQ,EAAI,GAClB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAQ,GAAI,OAAQ,IAAK,CAC3C,IAAM,EAAU,EAAe,QAAQ,EAAW,GAGlD,GAFI,CAAC,GACU,EAAU,QAAQ,KAAM,GAAM,EAAE,OAAS,EAAQ,EACpD,GAAI,SAChB,IAAM,EAAM,EAAQ,GAAI,GACxB,EAAW,QAAQ,EAAO,EAAS,IAAQ,GAAK,KAAO,EAAI,EAG/D,EAAE,gBAAgB,EAGpB,OADA,SAAS,iBAAiB,QAAS,EAAQ,KAC9B,SAAS,oBAAoB,QAAS,EAAQ,EAC1D,CAAC,EAAa,CAAC,CA6BX,CACL,cAAa,iBACb,iBAAgB,kBAAiB,mBACjC,cAAa,+BA7BmB,GAC3B,EACE,EAAO,KAAM,GAAM,EAAE,OAAS,EAAQ,EAAE,IAAM,KADhC,KAEpB,CAAC,EAAO,CAAC,CA0BiB,kCAxBO,EAAqC,IAChE,GAAO,EAAU,GAAY,EAAI,GAAS,CAAG,GACnD,EAAE,CAAC,CAsBuC,+BAnBZ,EAAuC,IAAuB,CACzF,GAAa,MAAQ,CAAC,GAC1B,EAAQ,CACN,KAAM,WACN,MAAO,GAAG,GAAkB,KAAK,KAAK,EAAG,QACzC,UAAW,KACX,SAAU,GACV,SAAU,CACR,eAAc,iBACd,UAAW,EAAG,MACd,WAAY,GAAkB,SAC9B,WAAY,kBAAkB,EAAG,MAAM,WAAW,EAAG,OAAO,OAAO,OAAO,EAAU,CAAC,QAAQ,KAAM,KAAK,CAAC,GAC1G,CACF,CAAC,EACD,CAAC,EAAc,EAAgB,EAAgB,EAAQ,CAAC,CAM1D,CC7IH,SAAgB,GAAgB,CAC9B,UAAS,SAAQ,WAAU,cAAa,YACxC,WAAU,SAAQ,cAAa,cAAa,WAC1B,CAClB,GAAM,CAAC,EAAa,kBAA2B,EAAY,CACrD,eAA6B,KAAK,CAClC,eAAoD,OAAU,EAGpE,mBAAgB,CACd,IAAM,EAAW,GAAkB,CAC7B,EAAI,SAAW,CAAC,EAAI,QAAQ,SAAS,EAAE,OAAe,EAAE,GAAS,EAGvE,OADA,SAAS,iBAAiB,YAAa,EAAQ,KAClC,SAAS,oBAAoB,YAAa,EAAQ,EAC9D,CAAC,EAAQ,CAAC,EAGb,mBAAgB,CACd,IAAM,EAAW,GAAqB,CAAM,EAAE,MAAQ,UAAU,GAAS,EAEzE,OADA,SAAS,iBAAiB,UAAW,EAAQ,KAChC,SAAS,oBAAoB,UAAW,EAAQ,EAC5D,CAAC,EAAQ,CAAC,CAGb,IAAM,EAAsB,GAAgB,CAC1C,EAAe,EAAI,CACnB,aAAa,EAAY,QAAQ,CACjC,EAAY,QAAU,eAAiB,EAAS,EAAI,CAAE,IAAI,EAKtD,EAAO,KAAK,IAAI,EAAO,EAAG,OAAO,WADrB,IAC8C,EAAE,CAC5D,EAAM,EAAO,EAAI,EAAO,OAAS,EAEjC,EAAS,SAAS,eAAe,SAAS,CAGhD,OAFK,GAEL,8BACG,MAAD,CAAU,MAAK,MAAO,CAAE,SAAU,QAAS,OAAM,MAAK,OAAQ,IAAO,CACnE,UAAU,kGADZ,WAGG,MAAD,CAAK,UAAU,yFACZ,EACG,YAGL,MAAD,CAAK,UAAU,yDACZ,MAAD,CAAK,UAAU,mCAAf,WACG,GAAD,CAAQ,UAAU,wCAA0C,YAC3D,QAAD,CACE,aAAU,KAAK,OAAO,MAAO,EAC7B,SAAW,GAAM,EAAmB,EAAE,OAAO,MAAM,CACnD,YAAY,kBACZ,UAAU,+FACV,EACD,aACE,SAAD,CAAQ,KAAK,SAAS,YAAe,EAAmB,GAAG,CACzD,UAAU,iEACT,EAAD,CAAG,UAAU,SAAW,EACjB,EAEP,GACF,aAGL,MAAD,CAAK,UAAU,gBAAf,YACG,SAAD,CAAQ,KAAK,SAAS,YAAe,CAAE,GAAQ,CAAE,GAAS,EACxD,UAAU,+FADZ,CAEG,IAAc,gBAAS,EAAD,CAAW,UAAU,SAAW,YAAI,EAAD,CAAS,UAAU,SAAW,EACvF,IAAc,MAAQ,kBAAoB,iBACpC,GACR,GAAa,cACX,SAAD,CAAQ,KAAK,SAAS,YAAe,CAAE,GAAa,CAAE,GAAS,EAC7D,UAAU,+FADZ,WAEG,EAAD,CAAG,UAAU,SAAW,eAEjB,cAEV,SAAD,CAAQ,KAAK,SAAS,YAAe,CAAE,GAAa,CAAE,GAAS,EAC7D,UAAU,+FADZ,CAEG,YAAY,EAAD,CAAQ,UAAU,SAAW,YAAI,EAAD,CAAK,UAAU,SAAW,EACrE,EAAW,eAAiB,aACtB,GACL,GACF,GACN,EACD,CAnDmB,KCpCtB,SAAgB,GAAiB,CAC/B,WAAU,WAAU,YAAW,aAAY,WAAU,cAAa,gBAAe,UAAS,WACvE,CACnB,GAAM,CAAC,EAAe,kBAA6B,GAAM,CACnD,eAA6B,KAAK,EAGxC,mBAAgB,CACd,IAAM,EAAW,GAAkB,CAC7B,EAAI,SAAW,CAAC,EAAI,QAAQ,SAAS,EAAE,OAAe,EAAE,GAAS,EAGvE,OADA,SAAS,iBAAiB,YAAa,EAAQ,KAClC,SAAS,oBAAoB,YAAa,EAAQ,EAC9D,CAAC,EAAQ,CAAC,EAGb,mBAAgB,CACd,IAAM,EAAW,GAAqB,CAAM,EAAE,MAAQ,UAAU,GAAS,EAEzE,OADA,SAAS,iBAAiB,UAAW,EAAQ,KAChC,SAAS,oBAAoB,UAAW,EAAQ,EAC5D,CAAC,EAAQ,CAAC,CAGb,IAEM,EAAO,KAAK,IAAI,EAAS,EAAG,OAAO,WAAa,IAAY,EAAE,CAC9D,EAAM,KAAK,IAAI,EAAS,EAAG,OAAO,YAAc,IAAa,EAAE,CAE/D,EAAS,SAAS,eAAe,SAAS,CAGhD,OAFK,GAEL,8BACG,MAAD,CAAU,MAAK,MAAO,CAAE,SAAU,QAAS,OAAM,MAAK,OAAQ,IAAO,CACnE,UAAU,uGADZ,YAEG,SAAD,CAAQ,KAAK,SAAS,YAAe,CAAE,GAAW,CAAE,GAAS,EAC3D,UAAU,+FADZ,WAEG,EAAD,CAAK,UAAU,SAAW,kBACnB,GACR,cACE,SAAD,CAAQ,KAAK,SAAS,YAAe,CAAE,GAAY,CAAE,GAAS,EAC5D,UAAU,+FADZ,WAEG,EAAD,CAAK,UAAU,SAAW,eACnB,GAEV,cACE,SAAD,CAAQ,KAAK,SAAS,YAAe,CAAE,GAAe,CAAE,GAAS,EAC/D,UAAU,6FADZ,WAEG,EAAD,CAAc,UAAU,SAAW,MAAE,GAAW,wBACzC,cAEV,SAAD,CAAQ,KAAK,SAAS,YAAe,CAAE,GAAU,CAAE,GAAS,EAC1D,UAAU,+FADZ,CAEG,YAAY,EAAD,CAAQ,UAAU,SAAW,YAAI,EAAD,CAAK,UAAU,SAAW,EACrE,EAAW,YAAc,UACnB,aACR,MAAD,CAAK,UAAU,gCAAkC,EAChD,aACE,MAAD,CAAK,UAAU,+CAAf,WACG,SAAD,CAAQ,KAAK,SAAS,YAAe,CAAE,GAAa,CAAE,GAAS,EAC7D,UAAU,wDAA+C,UAAgB,YAC1E,SAAD,CAAQ,KAAK,SAAS,YAAe,EAAiB,GAAM,CAC1D,UAAU,iDAAwC,SAAe,EAC/D,cAEL,SAAD,CAAQ,KAAK,SAAS,YAAe,EAAiB,GAAK,CACzD,UAAU,gGADZ,WAEG,EAAD,CAAQ,UAAU,SAAW,gBACtB,GAEP,GACN,EACD,CA1CmB,KCxCtB,SAAgB,GAAkB,CAAE,UAAS,WAAU,UAAS,cAAiC,CAC/F,GAAM,CAAC,EAAQ,kBAAsB,GAAG,CAClC,CAAC,EAAW,kBAAyB,EAAE,CACvC,eAA6B,KAAK,CAClC,eAAiC,KAAK,CAEtC,EAAW,EACb,EAAQ,OAAQ,GAAM,EAAE,aAAa,CAAC,SAAS,EAAO,aAAa,CAAC,CAAC,CACrE,GAGJ,mBAAgB,CAAE,EAAa,EAAE,EAAK,CAAC,EAAO,CAAC,EAG/C,mBAAgB,CACd,IAAM,EAAO,EAAQ,QAChB,GACU,EAAK,SAAS,IACrB,eAAe,CAAE,MAAO,UAAW,CAAC,EAC3C,CAAC,EAAU,CAAC,EAGf,mBAAgB,CACd,IAAM,EAAW,GAAkB,CAC7B,EAAI,SAAW,CAAC,EAAI,QAAQ,SAAS,EAAE,OAAe,EAAE,GAAS,EAGvE,OADA,SAAS,iBAAiB,YAAa,EAAQ,KAClC,SAAS,oBAAoB,YAAa,EAAQ,EAC9D,CAAC,EAAQ,CAAC,CAEb,IAAM,oBAA6B,GAA2B,CAC5D,GAAI,EAAE,MAAQ,SAAU,CAAE,GAAS,CAAE,OACrC,GAAI,EAAE,MAAQ,YAAa,CAAE,EAAE,gBAAgB,CAAE,EAAc,GAAM,KAAK,IAAI,EAAI,EAAG,EAAS,OAAS,EAAE,CAAC,CAAE,OAC5G,GAAI,EAAE,MAAQ,UAAW,CAAE,EAAE,gBAAgB,CAAE,EAAc,GAAM,KAAK,IAAI,EAAI,EAAG,EAAE,CAAC,CAAE,OACxF,GAAI,EAAE,MAAQ,QAAS,CACrB,EAAE,gBAAgB,CAClB,IAAM,EAAM,EAAS,GACjB,IAAO,EAAS,EAAI,CAAE,GAAS,IAEpC,CAAC,EAAU,EAAW,EAAU,EAAQ,CAAC,CAEtC,EAAS,SAAS,eAAe,SAAS,CAGhD,OAFK,GAEL,8BACG,MAAD,CAAU,MAAK,MAAO,CAAE,SAAU,QAAS,KAAM,KAAK,IAAI,EAAW,EAAG,OAAO,WAAa,IAAI,CAAE,IAAK,KAAK,IAAI,EAAW,EAAG,OAAO,YAAc,IAAI,CAAE,OAAQ,IAAO,CACtK,UAAU,8HADZ,WAEG,MAAD,CAAK,UAAU,wDACZ,QAAD,CAAO,aAAU,MAAO,EAAQ,SAAW,GAAM,EAAU,EAAE,OAAO,MAAM,CACxE,UAAW,EACX,YAAY,kBACZ,UAAU,+FAAiG,EACzG,aACL,MAAD,CAAK,IAAK,EAAS,UAAU,gCAA7B,CACG,EAAS,KAAK,EAAK,cACjB,SAAD,CAAkB,KAAK,SACrB,YAAe,CAAE,EAAS,EAAI,CAAE,GAAS,EACzC,iBAAoB,EAAa,EAAE,CACnC,UAAW,uDAAuD,IAAM,EAAY,WAAa,4BAChG,EACM,CALI,EAKJ,CACT,CACD,EAAS,SAAW,aAClB,MAAD,CAAK,UAAU,2CAAkC,mBAAsB,EAErE,GACF,GACN,EACD,CA1BmB,KC7BtB,SAAgB,GAAiB,CAC/B,eAAc,gBAAe,eAAc,cAC3C,UAAS,eAAc,iBACvB,aAAY,iBAAgB,eAC5B,cAAe,EAAc,qBACd,CACf,GAAM,CAAC,EAAmB,kBAAiC,GAAM,CAC3D,CAAC,EAAc,kBAA4B,GAAM,CACjD,EAAgB,GAAgB,EAChC,EAAmB,GAAqB,EACxC,eAA4C,KAAK,CAEjD,EAAe,EAAgB,aAC1B,CAAE,IAAM,EAAI,EAAgB,QAAS,uBAAuB,CAAE,MAAO,CAAE,EAAG,EAAE,KAAM,EAAG,EAAE,OAAS,EAAG,IAAM,CAChH,CAAE,EAAG,EAAG,EAAG,EAAG,CAElB,iBACG,MAAD,CAAK,UAAU,2FAAf,CAEG,cACE,MAAD,CAAK,UAAU,6CAAf,YACG,OAAD,CAAM,UAAU,iCAAhB,CAAyC,EAAc,YAAgB,GACtE,IACC,aACG,OAAD,CAAM,UAAU,mCAAhB,YACG,SAAD,CAAQ,KAAK,SAAS,YAAe,CAAE,GAAc,CAAE,EAAqB,GAAM,EAChF,UAAU,oEADZ,CACuE,UAC7D,EAAc,IACf,aACR,SAAD,CAAQ,KAAK,SAAS,YAAe,EAAqB,GAAM,CAC9D,UAAU,6DAAoD,SAAe,EAC1E,aAEN,SAAD,CAAQ,KAAK,SAAS,YAAe,EAAqB,GAAK,CAC7D,UAAU,wEACT,EAAD,CAAQ,UAAU,SAAW,EACtB,aAGZ,GAAD,CAAuB,UAAS,KAAM,EAAc,SAAU,GAAG,GAAkB,KAAK,WAAc,EAClG,aAGP,MAAD,CAAK,UAAU,SAAW,aAGzB,MAAD,CAAK,UAAU,2CAAf,WACG,EAAD,CAAQ,UAAU,+BAAiC,YAClD,QAAD,CAAO,MAAO,EAAY,SAAW,GAAM,EAAe,EAAE,OAAO,MAAM,CACvE,YAAY,eACZ,UAAU,6FAA+F,EAC1G,aACE,SAAD,CAAQ,KAAK,SAAS,YAAe,EAAe,GAAG,CACrD,UAAU,iEACT,EAAD,CAAG,UAAU,SAAW,EACjB,EAEP,GAGL,aACE,SAAD,CAAQ,IAAK,EAAiB,KAAK,SAAS,YAAe,EAAiB,CAAC,EAAc,CACzF,UAAU,8EAA8E,MAAM,wCAC7F,EAAD,CAAS,UAAU,WAAa,EACzB,EAIV,aACE,SAAD,CAAQ,KAAK,SAAS,QAAS,EAC7B,UAAU,2EAA2E,MAAM,gCAC1F,EAAD,CAAM,UAAU,WAAa,EACtB,EAGV,GAAiB,aACf,GAAD,CAA4B,UAAS,SAAU,EAAc,YAAe,EAAiB,GAAM,CAAE,WAAY,EAAgB,EAE/H,GC1FV,SAAgB,GAAa,CAAE,eAAc,SAAQ,aAA2B,CAG9E,OAFI,IAAiB,EAAU,MAE/B,UACG,MAAD,CAAK,UAAU,8HAAf,YACG,OAAD,CAAM,UAAU,0DAAhB,CACG,EAAa,gBAAc,EAAe,EAAI,IAAM,GAChD,aACN,MAAD,CAAK,UAAU,SAAW,aACzB,SAAD,CAAQ,KAAK,SAAS,QAAS,EAC7B,UAAU,oIADZ,WAEG,EAAD,CAAO,UAAU,SAAW,aACrB,cACR,SAAD,CAAQ,KAAK,SAAS,QAAS,EAC7B,UAAU,gIADZ,WAEG,GAAD,CAAM,UAAU,SAAW,oBAC1B,MAAD,CAAK,UAAU,sCAA6B,KAAQ,EAC7C,GACL,GCpBV,SAAgB,GAAoB,CAAE,QAAO,OAAM,aAAY,gBAAiC,CAC9F,iBACG,MAAD,CAAK,UAAU,qIAAf,YACG,OAAD,WAAO,EAAM,gBAAgB,CAAC,QAAY,cAEzC,MAAD,CAAK,UAAU,kFAAf,YACG,OAAD,qBAAO,MAAD,CAAK,UAAU,mDAA0C,IAAO,aAAe,cACpF,OAAD,sBAAO,MAAD,CAAK,UAAU,mDAAf,CAA0D,IAAS,IAAO,iBAAkB,cACjG,OAAD,sBAAO,MAAD,CAAK,UAAU,mDAAf,CAA0D,IAAS,IAAO,WAAY,GACxF,cACL,MAAD,CAAK,UAAU,mCAAf,WACG,SAAD,CAAQ,KAAK,SAAS,SAAU,GAAQ,EAAG,YAAe,EAAa,EAAO,EAAE,CAC9E,UAAU,sEACT,EAAD,CAAa,UAAU,WAAa,EAC7B,aACR,OAAD,WAAO,EAAK,MAAI,EAAkB,aACjC,SAAD,CAAQ,KAAK,SAAS,SAAU,GAAQ,EAAY,YAAe,EAAa,EAAO,EAAE,CACvF,UAAU,sEACT,EAAD,CAAc,UAAU,WAAa,EAC9B,EACL,GACF,GCXV,SAAgB,GAAsB,CAAE,OAAM,UAAS,eAAkC,CACvF,IAAM,EAAc,IAAgB,CAC9B,CAAC,EAAU,kBAAwB,GAAK,CACxC,CAAC,EAAgB,kBAA8B,EAAK,QAAQ,CAC5D,CAAC,EAAY,kBAA0B,GAAM,CAC7C,EAAc,EAAK,WAAa,QAAU,EAAK,WAAa,MAG5D,eAAiB,EAAK,MAAM,CAC9B,EAAQ,UAAY,EAAK,QAC3B,EAAQ,QAAU,EAAK,MACvB,EAAkB,EAAK,QAAQ,CAC/B,EAAc,GAAM,EAGtB,IAAM,wBAAmC,CACvC,GAAI,EACF,EAAkB,EAAK,QAAQ,CAC/B,EAAc,GAAM,SACX,EAAK,WAAa,OAC3B,GAAI,CAAE,EAAkB,KAAK,UAAU,KAAK,MAAM,EAAK,QAAQ,MAAM,CAAC,CAAE,KAAM,EAAE,CAAC,CAAE,EAAc,GAAK,MAAU,UACvG,EAAK,WAAa,MAAO,CAClC,IAAI,EAAQ,EAQZ,EAPkB,EAAK,QAAQ,MAAM,CAAC,QAAQ,SAAU;GAAO,CAAC,MAAM;EAAK,CAAC,IAAK,GAAS,CACxF,IAAM,EAAU,EAAK,MAAM,CACvB,EAAQ,WAAW,KAAK,GAAE,EAAQ,KAAK,IAAI,EAAG,EAAQ,EAAE,EAC5D,IAAM,EAAW,KAAK,OAAO,EAAM,CAAG,EAEtC,OADI,EAAQ,WAAW,IAAI,EAAI,CAAC,EAAQ,WAAW,KAAK,EAAI,CAAC,EAAQ,SAAS,KAAK,EAAI,CAAC,EAAQ,WAAW,KAAK,EAAE,IAC3G,GACP,CAAC,KAAK;EAAK,CACe,CAC5B,EAAc,GAAK,GAEpB,CAAC,EAAY,EAAK,QAAS,EAAK,SAAS,CAAC,CAEvC,CAAC,EAAa,kBAA2B,IAAI,CAC7C,oBAA0B,GAAwB,CACtD,EAAE,gBAAgB,CAClB,IAAM,EAAS,EAAE,QACX,EAAS,EACT,EAAU,GAAmB,EAAe,KAAK,IAAI,GAAI,GAAU,EAAS,EAAG,SAAS,CAAC,CACzF,MAAa,CAAE,SAAS,oBAAoB,YAAa,EAAO,CAAE,SAAS,oBAAoB,UAAW,EAAK,EACrH,SAAS,iBAAiB,YAAa,EAAO,CAC9C,SAAS,iBAAiB,UAAW,EAAK,EACzC,CAAC,EAAY,CAAC,CAEjB,iBACG,MAAD,CAAK,UAAU,gDAAgD,MAAO,CAAE,OAAQ,EAAa,UAA7F,WACG,MAAD,CAAK,YAAa,EAChB,UAAU,0IACT,EAAD,CAAgB,UAAU,kCAAoC,EAC1D,aACL,MAAD,CAAK,UAAU,yFAAf,WACG,EAAD,CAAK,UAAU,+BAAiC,YAC/C,OAAD,CAAM,UAAU,+DAAuD,EAAK,MAAa,EACxF,aACE,SAAD,CAAQ,KAAK,SAAS,QAAS,EAAgB,MAAO,EAAa,MAAQ,WACzE,UAAW,mCAAmC,EAAa,eAAiB,mEAC3E,EAAD,CAAU,UAAU,SAAW,EACxB,YAEV,SAAD,CAAQ,KAAK,SAAS,YAAe,EAAY,CAAC,EAAS,CAAE,MAAO,EAAW,UAAY,YACzF,UAAW,mCAAmC,EAAW,eAAiB,mEACzE,EAAD,CAAU,UAAU,SAAW,EACxB,aACR,SAAD,CAAQ,KAAK,SAAS,QAAS,EAAa,MAAM,kBAChD,UAAU,kJADZ,WAEG,EAAD,CAAc,UAAU,SAAW,YAClC,OAAD,CAAM,UAAU,4BAAmB,cAAkB,EAC9C,aACR,SAAD,CAAQ,KAAK,SAAS,QAAS,EAAS,MAAM,sBAC5C,UAAU,iGACT,EAAD,CAAG,UAAU,SAAW,EACjB,EACL,aACL,MAAD,CAAK,UAAU,oCACZ,GAAD,CACE,OAAO,OACP,SAAU,EAAK,WAAa,YAAc,OAAY,EAAK,SAC3D,MAAO,EACP,MAAO,EACP,QAAS,CACP,SAAU,GAAM,QAAS,CAAE,QAAS,GAAO,CAAE,qBAAsB,GACnE,SAAU,EAAW,KAAO,MAAO,YAAa,KAAM,SAAU,GAChE,QAAS,GAAM,wBAAyB,CAAE,QAAS,GAAM,CACzD,YAAa,GAAM,YAAa,GAAO,mBAAoB,EAC5D,CACD,kBAAU,EAAD,CAAS,UAAU,4CAA8C,EAC1E,EACE,EACF,GC5FV,IAAM,GAAmE,CACvE,QAAU,GAAM,kCAAkC,EAAE,QAAQ,iCAC5D,SAAW,GAAM,kCAAkC,EAAE,QAAQ,kCAC7D,aAAgB,wNACjB,CAMD,SAAgB,GAAc,EAAuB,CACnD,GAAM,CACJ,QAAS,EAAgB,OAAM,QAAO,QAAO,SAAQ,UACrD,OAAM,eAAc,eAAc,cAAa,eAAc,cAC7D,UAAS,WAAU,eAAc,cAAa,gBAAgB,EAAE,CAAE,iBAClE,eAAc,gBAAe,iBAAgB,kBAC3C,EAEE,EAAQ,IAAe,CACvB,eAAsB,KAAK,CAC3B,eAAsC,KAAK,CAE3C,oBAA4B,CAChC,IAAM,EAAQ,IAAI,IAAI,EAAO,IAAK,GAAM,EAAE,KAAK,CAAC,CAChD,OAAO,EAAe,OAAQ,GAAM,EAAM,IAAI,EAAE,CAAC,EAChD,CAAC,EAAgB,EAAO,CAAC,CAGtB,CAAC,EAAY,kBAAuC,IAAI,IAAM,CAC9D,CAAC,EAAW,mBAA8C,IAAI,IAAM,CACpE,CAAC,GAAY,mBAAuH,KAAK,CACzI,CAAC,EAAa,mBAA0G,KAAK,CAC7H,CAAC,GAAY,mBAA0B,GAAG,CAC1C,CAAC,EAAc,mBAAuD,EAAE,CAAC,CAEzE,oBACG,EAAO,KAAM,GAAM,EAAE,GAAG,EAAE,MAAQ,EAAO,KAAM,GAAM,EAAE,KAAK,aAAa,GAAK,KAAK,EAAE,MAAQ,KACnG,CAAC,EAAO,CAAC,CAGN,CAAE,gBAAe,eAAa,aAAW,iBAAiB,GAAmB,EAAM,EAAM,CAGzF,oBAAwB,CAC5B,GAAI,KAAgB,EAAG,MAAO,CAAC,GAAG,EAAe,GAAG,EAAa,CACjE,IAAM,EAAW,EAAc,MAAM,EAAG,EAAc,OAAS,GAAY,CACrE,EAAS,EAAc,MAAM,EAAc,OAAS,GAAY,CACtE,MAAO,CAAC,GAAG,EAAU,GAAG,EAAc,GAAG,EAAO,EAC/C,CAAC,EAAe,EAAc,GAAY,CAAC,CACxC,oBAA4B,CAChC,GAAI,CAAC,GAAW,MAAM,CAAE,OAAO,EAC/B,IAAM,EAAO,GAAW,aAAa,CACrC,OAAO,EAAQ,OAAQ,GAAQ,EAAY,KAAM,GAAQ,OAAO,EAAI,IAAQ,GAAG,CAAC,aAAa,CAAC,SAAS,EAAK,CAAC,CAAC,EAC7G,CAAC,EAAS,EAAa,GAAW,CAAC,CAEhC,qBACA,KAAgB,GAAK,CAAC,EAAc,EACnC,GAAW,MAAM,CACf,EAAY,OAAQ,GAAQ,GAAU,IAAI,OAAO,EAAI,IAAU,GAAG,CAAC,CAAC,CAAC,OAD7C,GAE9B,CAAC,GAAa,EAAO,GAAY,EAAa,GAAU,CAAC,CAGtD,CAAE,cAAY,WAAS,aAAW,cAAY,cAAY,gBAAc,iBAAiB,GAAqB,EAAO,EAAc,EAAY,CAC/I,CAAE,WAAS,gBAAe,gBAAgB,GAAgB,EAAQ,EAAa,EAAY,EAAW,EAAa,EAAS,EAAS,CACrI,CAAE,kBAAgB,iBAAiB,GAAoB,EAAa,GAAa,EAAQ,EAAO,GAAS,GAAW,CACpH,CAAE,gBAAe,yBAAuB,sBAAoB,kBAAmB,IAAmB,CAClG,CACJ,cAAa,kBAAgB,iBAAgB,kBAAiB,mBAC9D,eAAa,gBAAc,iBAAgB,gBACzC,GAAoB,CAAE,cAAa,eAAa,SAAQ,QAAO,eAAc,iBAAgB,gBAAe,iBAAgB,WAAS,gBAAe,eAAc,CAAC,EAEvK,mBAAgB,CACV,GAAa,UAAW,GAAa,QAAU,GAAO,IAAY,CAAE,GAAgB,EAAE,CAAC,GAC1F,CAAC,EAAK,CAAC,CAEV,IAAM,sBAAkC,EAAiB,IAAoB,CAC3E,GAAc,GAAS,IAAI,IAAI,EAAK,CAAC,IAAI,EAAI,IAAM,EAAI,MAAO,EAAQ,CAAC,EACtE,EAAE,CAAC,CACA,sBAAqC,EAAgB,IAAoE,CAC7H,IAAM,EAAU,GAAY,GAAa,GAAS,GAAc,CAAE,UAAS,SAAQ,CAAC,EACnF,CAAC,GAAY,CAAC,CACX,qBAAqC,CAAC,EAAQ,GAAe,IAAsH,CACvL,EAAM,gBAAgB,CACtB,GAAe,CAAE,SAAU,CAAE,EAAG,EAAM,OAAO,EAAI,EAAM,YAAa,EAAG,EAAM,OAAO,EAAI,EAAM,YAAa,CAAE,SAAQ,SAAQ,CAAC,EAC7H,EAAE,CAAC,CACA,qBAA+B,GAAoB,CACvD,EAAe,GAAS,CAAE,IAAM,EAAI,IAAI,IAAI,EAAK,CAA8D,OAAxD,EAAE,IAAI,EAAQ,CAAE,EAAE,OAAO,EAAQ,CAAO,EAAE,IAAI,EAAQ,CAAS,GAAK,EAC1H,EAAE,CAAC,CACA,qBAA4B,GAAmB,CACnD,GAAI,CAAC,EAAO,OACZ,IAAM,EAAM,EAAY,GAAS,GAAI,CAAC,EAAK,OAC3C,IAAM,EAAK,OAAO,EAAI,IAAU,GAAG,CACnC,GAAc,GAAS,CAAE,IAAM,EAAI,IAAI,IAAI,EAAK,CAA+C,OAAzC,EAAE,IAAI,EAAG,CAAE,EAAE,OAAO,EAAG,CAAO,EAAE,IAAI,EAAG,CAAS,GAAK,EAC1G,CAAC,EAAO,EAAa,GAAa,CAAC,CAChC,qBAAmC,GAAmB,CAC1D,GAAI,GAAU,OAAS,GAAK,CAAC,EAAO,OACpC,IAAM,EAAM,EAAY,GACxB,GAAI,GAAO,GAAU,IAAI,OAAO,EAAI,IAAU,GAAG,CAAC,CAAE,MAAO,CAAE,OAAQ,EAAM,cAAgB,EAAM,SAAU,EAE1G,CAAC,GAAW,EAAO,EAAa,EAAM,CAAC,CACpC,yBAAqC,CACrC,CAAC,GAAS,CAAC,IACf,EAAa,EAAO,GAAmB,IAAK,GAAM,EAAY,KAAK,GAAO,CAAC,OAAQ,GAAM,GAAK,KAAK,CAAC,CACpG,GAAgB,GACf,CAAC,EAAO,EAAc,GAAoB,EAAa,EAAe,CAAC,CAEpE,CAAC,GAAe,mBAA6B,GAAM,CACnD,qBAA6B,GAA2B,CAC5D,GAAI,EAAE,MAAQ,SAAU,CAAE,GAAe,KAAK,CAAE,GAAiB,GAAM,CAAE,QACpE,EAAE,SAAW,EAAE,UAAY,EAAE,MAAQ,SAAW,KAAc,EAAE,gBAAgB,CAAE,IAAW,EAClG,IAAM,EAAO,EAAE,QAAwB,QACnC,EAAE,MAAQ,KAAO,IAAQ,SAAW,IAAQ,aAAc,EAAE,gBAAgB,CAAE,GAAiB,GAAK,GACvG,CAAC,GAAY,GAAU,CAAC,CACrB,yBAAsC,CACtC,CAAC,GAAS,CAAC,GACf,GAAiB,GAAS,CAAC,GAAG,EAAM,EAAG,GAAQ,SAAS,KAAK,KAAK,GAAI,CAAC,CAAC,EACvE,CAAC,EAAO,EAAY,CAAC,CAClB,qBAAgC,GAAoB,CACxD,IAAM,EAAM,GAAY,QAAQ,EAAQ,CACpC,GAAO,GAAK,EAAQ,SAAS,UAAU,EAAQ,QAAQ,SAAS,EAAK,EAAE,EAC1E,CAAC,GAAY,CAAC,CAGX,GAAa,EAAc,EAAY,EAAY,QAAU,KAC7D,GAAY,IAAc,EAAQ,OAAO,GAAW,IAAU,GAAG,CAAG,GACpE,GAAiB,EAAc,GAAY,EAAY,QAAU,KACjE,GAAsB,EAAe,IAAc,KAAM,IAAkB,KAAK,CAChF,GAAY,GAAa,IAAkB,KAAK,CAChD,GAAmB,IAAc,GAAiB,GAAW,IAAkB,KAQrF,OANK,EAAY,QAMjB,UACG,MAAD,CAAK,IAAK,EAAc,UAAU,gDAAgD,SAAU,EAAG,UAAW,YAA1G,WACG,GAAD,CAAkB,aAAc,GAAmB,OAAS,EAAG,cAAe,GAAmB,OAC/F,aAAc,GAAgB,EAAQ,GAAmB,OACzD,YAAa,GAAe,EAAQ,GAAoB,OACxD,QAAS,EAAa,aAAc,GAAmB,IAAK,GAAM,EAAY,GAAI,CAAC,OAAO,QAAQ,CAAkB,iBACxG,cAAY,eAAgB,GAAe,aAAc,GACtD,iBAAe,kBAAmB,GAAoB,EAEtE,aAAY,MAAD,CAAK,UAAU,6FAA2E,EAAD,CAAS,UAAU,mCAAqC,EAAM,YAElK,MAAD,CAAK,UAAU,oCACZ,GAAD,CAAY,IAAK,EAAkB,WAAS,KAAM,EAAY,OAC5C,kBAAgB,qBAAsB,GACxC,gBAAc,QAAS,GAC9B,QAAsB,gBAAe,mBAAoB,GAChE,WAAY,EAAQ,mBAAqB,SAC1B,gBAAsC,yBACrD,eAAgB,GAChB,kBAAmB,GAA8B,kBAAmB,EAC/C,uBACrB,mBAAoB,GAAe,EAAQ,CAAE,OAAQ,GAAM,KAAM,GAAM,CAAG,OAC1E,cAAe,EAAc,GAAoB,OACjD,YAAa,GAAc,iBAAc,iBAAc,MAAM,OAAO,OAAO,OAAS,EAClF,EAEL,cAAe,GAAD,CAA4B,gBAAc,OAAQ,GAAW,cAAiB,CAAE,IAAY,CAAE,GAAgB,EAAE,CAAC,EAAO,EACtI,aAAgB,GAAD,CAAuB,KAAM,EAAa,YAAe,GAAe,KAAK,CAAE,YAAa,EAAoB,YAC/H,GAAD,CAA4B,QAAa,OAAM,WAAY,KAAK,KAAK,EAAQ,EAAM,EAAI,EAAiB,eAAgB,EAEvH,cACE,GAAD,CAAiB,QAAS,GAAW,QAAS,OAAQ,GAAW,OAC/D,SAAU,EAAW,IAAI,GAAW,QAAQ,CAAE,YAAa,EAAc,GAAW,UAAY,GAChG,UAAW,IAAY,GAAW,QAAW,IAAa,MAAQ,MAAQ,OAAU,KACpF,SAAW,GAAQ,CAAE,GAAI,CAAC,EAAgB,OAAQ,IAAM,EAAI,CAAE,GAAG,EAAe,CAAM,EAAK,EAAE,GAAW,SAAW,EAAU,OAAO,EAAE,GAAW,SAAU,EAAe,EAAE,EAC5K,WAAc,CAAM,GAAc,EAAa,GAAW,QAAQ,EACrD,cACb,gBAAmB,GAAgB,GAAW,QAAQ,CAAE,YAAe,GAAc,KAAK,CAAI,EAGjG,GAAe,cACb,GAAD,CAAkB,SAAU,EAAY,SAAU,SAAU,GAAU,IAAI,GAAU,CAClF,cAAiB,EAAe,EAAY,OAAO,CACnD,WAAY,OAA4B,EAAgB,EAAY,OAAQ,EAAY,OAAO,CAAG,OAClG,aAAgB,GAAa,EAAY,OAAO,CAChD,gBAAmB,CAAM,GAAS,GAAe,IAAY,EAAY,EAAO,GAAW,GAAO,EAClG,cAAe,IAAa,IAAoB,MAAQ,MAAqB,GAAY,GAAW,GAAiB,CAAG,OACxH,QAAS,GAAY,QAAQ,GAAU,MAAM,GAAG,GAAU,SAAW,OACrE,YAAe,GAAe,KAAK,CAAI,EAEvC,IAvDN,SAAQ,MAAD,CAAK,UAAU,iFACnB,YAAW,EAAD,CAAS,UAAU,sBAAwB,EAAG,iBACrD","names":["styled","exports","Carousel","marked","splitText","loadingCell","withAlpha","DataGrid","_exp","ScrollingDataGrid","itemMargin"],"ignoreList":[0,1,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184],"sources":["../../../node_modules/.bun/lucide-react@0.577.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/funnel.js","../../../node_modules/.bun/lucide-react@0.577.0+b1ab299f0a400331/node_modules/lucide-react/dist/esm/icons/save.js","../../../src/web/components/database/sql-completion-provider.ts","../../../src/web/components/database/export-button.tsx","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid-overlay-editor/private/image-overlay-editor-style.js","../../../node_modules/.bun/prop-types@15.8.1/node_modules/prop-types/lib/ReactPropTypesSecret.js","../../../node_modules/.bun/prop-types@15.8.1/node_modules/prop-types/factoryWithThrowingShims.js","../../../node_modules/.bun/prop-types@15.8.1/node_modules/prop-types/index.js","../../../node_modules/.bun/react-easy-swipe@0.0.21/node_modules/react-easy-swipe/lib/react-swipe.js","../../../node_modules/.bun/react-easy-swipe@0.0.21/node_modules/react-easy-swipe/lib/index.js","../../../node_modules/.bun/classnames@2.5.1/node_modules/classnames/index.js","../../../node_modules/.bun/react-responsive-carousel@3.2.23/node_modules/react-responsive-carousel/lib/js/cssClasses.js","../../../node_modules/.bun/react-responsive-carousel@3.2.23/node_modules/react-responsive-carousel/lib/js/dimensions.js","../../../node_modules/.bun/react-responsive-carousel@3.2.23/node_modules/react-responsive-carousel/lib/js/CSSTranslate.js","../../../node_modules/.bun/react-responsive-carousel@3.2.23/node_modules/react-responsive-carousel/lib/js/shims/window.js","../../../node_modules/.bun/react-responsive-carousel@3.2.23/node_modules/react-responsive-carousel/lib/js/components/Thumbs.js","../../../node_modules/.bun/react-responsive-carousel@3.2.23/node_modules/react-responsive-carousel/lib/js/shims/document.js","../../../node_modules/.bun/react-responsive-carousel@3.2.23/node_modules/react-responsive-carousel/lib/js/components/Carousel/utils.js","../../../node_modules/.bun/react-responsive-carousel@3.2.23/node_modules/react-responsive-carousel/lib/js/components/Carousel/animations.js","../../../node_modules/.bun/react-responsive-carousel@3.2.23/node_modules/react-responsive-carousel/lib/js/components/Carousel/index.js","../../../node_modules/.bun/react-responsive-carousel@3.2.23/node_modules/react-responsive-carousel/lib/js/index.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/now.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_trimmedEndIndex.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseTrim.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/toNumber.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/debounce.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/common/utils.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid-overlay-editor/private/image-overlay-editor.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/markdown-div/private/markdown-container.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/markdown-div/markdown-div.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/growing-entry/growing-entry-style.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/growing-entry/growing-entry.js","../../../node_modules/.bun/canvas-hypertxt@1.0.3/node_modules/canvas-hypertxt/dist/js/index.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid/render/data-grid-lib.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/common/render-state-provider.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid/cell-set.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/data-editor/use-column-sizer.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseClamp.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/clamp.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_setCacheAdd.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_setCacheHas.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_SetCache.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseFindIndex.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseIsNaN.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_strictIndexOf.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseIndexOf.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_arrayIncludes.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_arrayIncludesWith.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_cacheHas.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_Set.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/noop.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_setToArray.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_createSet.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseUniq.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/uniq.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_arrayPush.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_isFlattenable.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseFlatten.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/flatten.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseRange.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/isArrayLike.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_isIterateeCall.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/toFinite.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_createRange.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/range.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid/sprites.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid/data-grid-sprites.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid/render/data-grid-render.walk.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/common/math.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid/render/data-grid-render.cells.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid/render/draw-checkbox.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid/render/data-grid-render.header.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_defineProperty.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseAssignValue.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_arrayAggregator.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_createBaseFor.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseFor.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseTimes.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/stubFalse.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/isBuffer.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseIsTypedArray.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseUnary.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_nodeUtil.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/isTypedArray.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_arrayLikeKeys.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_isPrototype.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_overArg.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_nativeKeys.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseKeys.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/keys.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseForOwn.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_createBaseEach.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseEach.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseAggregator.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_stackClear.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_stackDelete.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_stackGet.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_stackHas.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_stackSet.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_Stack.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_arraySome.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_equalArrays.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_Uint8Array.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_mapToArray.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_equalByTag.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseGetAllKeys.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_arrayFilter.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/stubArray.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_getSymbols.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_getAllKeys.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_equalObjects.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_DataView.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_Promise.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_WeakMap.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_getTag.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseIsEqualDeep.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseIsEqual.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseIsMatch.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_isStrictComparable.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_getMatchData.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_matchesStrictComparable.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseMatches.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseGet.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/get.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseHasIn.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/hasIn.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseMatchesProperty.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/identity.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseProperty.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_basePropertyDeep.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/property.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_baseIteratee.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/_createAggregator.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/groupBy.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid/render/data-grid-render.lines.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid/render/data-grid-render.blit.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid/render/data-grid.render.rings.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid/render/data-grid-render.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid/animation-manager.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/common/browser-detect.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid/use-animation-queue.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid/event-args.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid/data-grid.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid-dnd/data-grid-dnd.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/common/resize-detector.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/scrolling-data-grid/use-kinetic-scroll.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/scrolling-data-grid/infinite-scroller.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/scrolling-data-grid/scrolling-data-grid.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid-search/data-grid-search-style.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid-search/data-grid-search.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/data-editor/group-rename.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/common/is-hotkey.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid/use-selection-behavior.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/data-editor/use-cells-for-selection.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/data-editor/copy-paste.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/data-editor/data-editor-fns.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-editor-container/data-grid-container.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/data-editor/use-autoscroll.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/data-editor/use-rem-adjuster.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/data-editor/data-editor-keybindings.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/data-editor/data-editor.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/cells/boolean-cell.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid-overlay-editor/private/bubbles-overlay-editor-style.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid-overlay-editor/private/bubbles-overlay-editor.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/cells/bubble-cell.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid-overlay-editor/private/drilldown-overlay-editor.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/cells/drilldown-cell.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/cells/image-cell.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/cells/loading-cell.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid-overlay-editor/private/markdown-overlay-editor-style.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid-overlay-editor/private/markdown-overlay-editor.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/cells/markdown-cell.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/cells/marker-cell.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/cells/new-row-cell.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/cells/number-cell.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/cells/protected-cell.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/cells/row-id-cell.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/cells/text-cell.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid-overlay-editor/private/uri-overlay-editor-style.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/internal/data-grid-overlay-editor/private/uri-overlay-editor.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/cells/uri-cell.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/cells/index.js","../../../node_modules/.bun/lodash@4.17.23/node_modules/lodash/throttle.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/common/image-window-loader.js","../../../node_modules/.bun/@glideapps+glide-data-grid@6.0.3+20f18e448220509f/node_modules/@glideapps/glide-data-grid/dist/esm/data-editor-all.js","../../../src/web/components/database/glide-grid-theme.ts","../../../src/web/components/database/use-glide-columns.ts","../../../src/web/components/database/glide-grid-types.ts","../../../src/web/components/database/use-glide-cell-content.ts","../../../src/web/components/database/use-glide-selection.ts","../../../src/web/components/database/use-glide-pending-edits.ts","../../../src/web/components/database/use-glide-row-pinning.ts","../../../src/web/components/database/use-glide-grid-actions.ts","../../../src/web/components/database/glide-header-menu.tsx","../../../src/web/components/database/glide-context-menu.tsx","../../../src/web/components/database/glide-column-search.tsx","../../../src/web/components/database/glide-grid-toolbar.tsx","../../../src/web/components/database/glide-save-bar.tsx","../../../src/web/components/database/glide-grid-pagination.tsx","../../../src/web/components/database/glide-data-preview-panel.tsx","../../../src/web/components/database/glide-data-grid.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z\",\n key: \"sc7q7i\"\n }\n ]\n];\nconst Funnel = createLucideIcon(\"funnel\", __iconNode);\n\nexport { __iconNode, Funnel as default };\n//# sourceMappingURL=funnel.js.map\n","/**\n * @license lucide-react v0.577.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z\",\n key: \"1c8476\"\n }\n ],\n [\"path\", { d: \"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7\", key: \"1ydtos\" }],\n [\"path\", { d: \"M7 3v4a1 1 0 0 0 1 1h7\", key: \"t51u73\" }]\n];\nconst Save = createLucideIcon(\"save\", __iconNode);\n\nexport { __iconNode, Save as default };\n//# sourceMappingURL=save.js.map\n","import type * as MonacoType from \"monaco-editor\";\n\nexport interface SchemaInfo {\n tables: { name: string; schema: string }[];\n getColumns: (table: string, schema?: string) => Promise<{ name: string; type: string }[]>;\n}\n\nexport const SQL_KEYWORDS = [\n \"SELECT\", \"FROM\", \"WHERE\", \"INSERT\", \"INTO\", \"VALUES\",\n \"UPDATE\", \"SET\", \"DELETE\", \"CREATE\", \"TABLE\", \"ALTER\",\n \"DROP\", \"INDEX\", \"JOIN\", \"LEFT\", \"RIGHT\", \"INNER\",\n \"OUTER\", \"ON\", \"AND\", \"OR\", \"NOT\", \"NULL\", \"IS\",\n \"IN\", \"LIKE\", \"BETWEEN\", \"HAVING\", \"LIMIT\", \"OFFSET\",\n \"AS\", \"DISTINCT\", \"COUNT\", \"SUM\", \"AVG\", \"MIN\", \"MAX\",\n \"CASE\", \"WHEN\", \"THEN\", \"ELSE\", \"END\", \"EXISTS\",\n \"UNION\", \"ALL\", \"ASC\", \"DESC\", \"ORDER BY\", \"GROUP BY\",\n \"LEFT JOIN\", \"RIGHT JOIN\", \"INNER JOIN\", \"CROSS JOIN\",\n \"FULL OUTER JOIN\", \"IS NULL\", \"IS NOT NULL\",\n];\n\nexport const AGGREGATE_FNS = [\"COUNT\", \"SUM\", \"AVG\", \"MIN\", \"MAX\"];\nexport const OPERATORS = [\"=\", \"!=\", \"<>\", \">\", \"<\", \">=\", \"<=\", \"LIKE\", \"ILIKE\", \"IN\", \"NOT IN\", \"BETWEEN\", \"IS NULL\", \"IS NOT NULL\"];\nexport const SORT_DIRS = [\"ASC\", \"DESC\"];\n\n/** Client-side column cache to avoid redundant fetches */\nconst columnCache = new Map<string, { name: string; type: string }[]>();\n\nconst TABLE_KW_SET = new Set([\n \"WHERE\", \"SET\", \"ON\", \"ORDER\", \"GROUP\", \"HAVING\", \"LIMIT\", \"LEFT\", \"RIGHT\",\n \"INNER\", \"OUTER\", \"CROSS\", \"FULL\", \"JOIN\", \"AND\", \"OR\", \"VALUES\", \"SELECT\",\n \"FROM\", \"INTO\", \"UPDATE\", \"DELETE\", \"INSERT\", \"CREATE\", \"ALTER\", \"DROP\",\n]);\n\n/** Extract tables referenced in FROM/JOIN/UPDATE/INTO clauses */\nexport function extractTableRefs(text: string) {\n const tableRefs = new Set<string>();\n const aliasMap = new Map<string, string>(); // alias → realTableName\n // Match: FROM/JOIN/UPDATE/INTO \"tablename\" [AS] alias\n // Use non-greedy alias capture to avoid consuming the next keyword\n const matches = text.matchAll(/\\b(?:FROM|JOIN|UPDATE|INTO)\\s+\"?(\\w+)\"?(?:\\s+AS\\s+(\\w+)|\\s+(?!(?:FROM|JOIN|UPDATE|INTO|WHERE|SET|ON|ORDER|GROUP|HAVING|LIMIT|LEFT|RIGHT|INNER|OUTER|CROSS|FULL|AND|OR|VALUES|SELECT)\\b)(\\w+))?/gi);\n for (const m of matches) {\n const tbl = m[1]!;\n tableRefs.add(tbl);\n const alias = m[2] ?? m[3]; // m[2] = explicit AS alias, m[3] = implicit alias\n if (alias && !TABLE_KW_SET.has(alias.toUpperCase())) {\n aliasMap.set(alias.toLowerCase(), tbl);\n }\n }\n return { tableRefs, aliasMap };\n}\n\n/** Resolve alias or table name to real table name */\nexport function resolveTable(name: string, aliasMap: Map<string, string>): string {\n return aliasMap.get(name.toLowerCase()) ?? name;\n}\n\n/** Fetch columns for a table (cached) */\nasync function getColumns(tableName: string, schemaInfo: SchemaInfo): Promise<{ name: string; type: string }[]> {\n const key = tableName.toLowerCase();\n let cols = columnCache.get(key);\n if (!cols) {\n try {\n cols = await schemaInfo.getColumns(tableName);\n columnCache.set(key, cols);\n } catch { cols = []; }\n }\n return cols;\n}\n\n/** Build column suggestions from all referenced tables */\nasync function columnSuggestions(\n tableRefs: Set<string>,\n schemaInfo: SchemaInfo,\n monaco: typeof MonacoType,\n range: MonacoType.IRange,\n): Promise<MonacoType.languages.CompletionItem[]> {\n const items: MonacoType.languages.CompletionItem[] = [];\n const seen = new Set<string>();\n for (const tbl of tableRefs) {\n const cols = await getColumns(tbl, schemaInfo);\n for (const col of cols) {\n if (seen.has(col.name)) continue;\n seen.add(col.name);\n const needsQuote = /[A-Z]/.test(col.name);\n items.push({\n label: col.name,\n kind: monaco.languages.CompletionItemKind.Field,\n detail: `${tbl} · ${col.type}`,\n insertText: needsQuote ? `\"${col.name}\"` : col.name,\n range,\n sortText: \"0\" + col.name,\n });\n }\n }\n return items;\n}\n\n/**\n * Determine the SQL completion context from text before cursor.\n * Returns a context tag used to decide which suggestions to show.\n * Exported for testing.\n */\nexport function getCompletionContext(textUntilPosition: string): string {\n // 1. After \"alias.\" or \"table.\" → dot completion\n if (/(\\w+)\\.\\s*$/.test(textUntilPosition)) return \"dot\";\n\n // 2. After ORDER BY col or GROUP BY col → direction (ASC/DESC)\n // Pattern: ORDER BY <col> <partial_word> — but NOT if partial is already ASC/DESC\n const orderByColMatch = textUntilPosition.match(/\\b(?:ORDER|GROUP)\\s+BY\\s+(?:[\\w\"]+\\s+(?:ASC|DESC)\\s*,\\s*)*[\\w\"]+\\s+(\\w*)$/i);\n if (orderByColMatch) {\n const partial = orderByColMatch[1]!.toUpperCase();\n if (partial === \"ASC\" || partial === \"DESC\") return \"after-direction\";\n return \"sort-direction\";\n }\n\n // 3. After ORDER BY col ASC/DESC, → more columns after comma\n if (/\\b(?:ORDER|GROUP)\\s+BY\\s+.*(?:ASC|DESC)\\s*,\\s*\\w*$/i.test(textUntilPosition)) return \"order-by-next-col\";\n\n // 4. After WHERE/AND/OR <col> → operators\n if (/\\b(?:WHERE|AND|OR)\\s+[\\w\"]+\\s+\\S*$/i.test(textUntilPosition)) return \"operator\";\n\n // 5. After FROM/JOIN/INTO/UPDATE/TABLE → table names\n if (/\\b(?:FROM|JOIN|INTO|UPDATE|TABLE)\\s+\\w*$/i.test(textUntilPosition)) return \"table\";\n\n // 6. After INSERT INTO table ( → columns for insert\n if (/\\bINSERT\\s+INTO\\s+[\\w\"]+\\s*\\(\\s*(?:[\\w\"]+\\s*,\\s*)*\\w*$/i.test(textUntilPosition)) return \"insert-cols\";\n\n // 7. After SELECT/WHERE/ORDER BY/GROUP BY/HAVING/SET/ON/AND/OR → columns\n if (/\\b(?:SELECT|WHERE|ORDER\\s+BY|GROUP\\s+BY|HAVING|SET|ON|AND|OR)\\s+(?:[\\w\"]+\\s*,\\s*)*\\w*$/i.test(textUntilPosition)) return \"columns\";\n\n // 8. After comma with table refs → more columns\n if (/,\\s*\\w*$/.test(textUntilPosition)) return \"comma-cols\";\n\n // 9. Default\n return \"default\";\n}\n\nexport function createSqlCompletionProvider(\n monaco: typeof MonacoType,\n schemaInfo: SchemaInfo,\n): MonacoType.languages.CompletionItemProvider {\n return {\n triggerCharacters: [\".\", \",\"],\n provideCompletionItems: async (model, position) => {\n try {\n const textUntilPosition = model.getValueInRange({\n startLineNumber: 1, startColumn: 1,\n endLineNumber: position.lineNumber, endColumn: position.column,\n });\n const word = model.getWordUntilPosition(position);\n const range: MonacoType.IRange = {\n startLineNumber: position.lineNumber, endLineNumber: position.lineNumber,\n startColumn: word.startColumn, endColumn: word.endColumn,\n };\n const fullText = model.getValue();\n const { tableRefs, aliasMap } = extractTableRefs(fullText);\n const suggestions: MonacoType.languages.CompletionItem[] = [];\n const ctx = getCompletionContext(textUntilPosition);\n\n // ─── 1. After \"alias.\" or \"table.\" → columns of that table ───\n if (ctx === \"dot\") {\n const dotMatch = textUntilPosition.match(/(\\w+)\\.\\s*$/);\n if (dotMatch) {\n const ref = dotMatch[1]!;\n const realTable = resolveTable(ref, aliasMap);\n const cols = await getColumns(realTable, schemaInfo);\n for (const col of cols) {\n const needsQuote = /[A-Z]/.test(col.name);\n suggestions.push({\n label: col.name,\n kind: monaco.languages.CompletionItemKind.Field,\n detail: col.type,\n insertText: needsQuote ? `\"${col.name}\"` : col.name,\n range,\n });\n }\n }\n return { suggestions };\n }\n\n // ─── 2. After ORDER BY col → ASC, DESC ───\n if (ctx === \"sort-direction\") {\n for (const dir of SORT_DIRS) {\n suggestions.push({\n label: dir,\n kind: monaco.languages.CompletionItemKind.Keyword,\n insertText: dir,\n range,\n sortText: \"0\" + dir,\n });\n }\n return { suggestions };\n }\n\n // ─── 3. After ASC/DESC → nothing special ───\n if (ctx === \"after-direction\") return { suggestions: [] };\n\n // ─── 4. After ORDER BY col ASC/DESC, → more columns ───\n if (ctx === \"order-by-next-col\") {\n suggestions.push(...await columnSuggestions(tableRefs, schemaInfo, monaco, range));\n return { suggestions };\n }\n\n // ─── 5. After WHERE/AND/OR col → operators ───\n if (ctx === \"operator\") {\n for (const op of OPERATORS) {\n suggestions.push({\n label: op,\n kind: monaco.languages.CompletionItemKind.Operator,\n insertText: op,\n range,\n sortText: \"0\" + op,\n });\n }\n return { suggestions };\n }\n\n // ─── 6. After FROM/JOIN/INTO/UPDATE/TABLE → table names ───\n if (ctx === \"table\") {\n for (const t of schemaInfo.tables) {\n suggestions.push({\n label: t.name,\n kind: monaco.languages.CompletionItemKind.Struct,\n detail: t.schema,\n insertText: t.name,\n range,\n sortText: \"0\" + t.name,\n });\n }\n return { suggestions };\n }\n\n // ─── 7. After INSERT INTO table ( → columns ───\n if (ctx === \"insert-cols\") {\n suggestions.push(...await columnSuggestions(tableRefs, schemaInfo, monaco, range));\n return { suggestions };\n }\n\n // ─── 8. After SELECT/WHERE/ORDER BY/... → columns + keywords ───\n if (ctx === \"columns\") {\n suggestions.push(...await columnSuggestions(tableRefs, schemaInfo, monaco, range));\n if (/\\bSELECT\\s+/i.test(textUntilPosition)) {\n suggestions.push({\n label: \"*\",\n kind: monaco.languages.CompletionItemKind.Value,\n insertText: \"*\",\n range,\n sortText: \"00*\",\n });\n for (const fn of AGGREGATE_FNS) {\n suggestions.push({\n label: `${fn}()`,\n kind: monaco.languages.CompletionItemKind.Function,\n insertText: `${fn}($0)`,\n insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet,\n range,\n sortText: \"1\" + fn,\n });\n }\n }\n for (const kw of SQL_KEYWORDS) {\n suggestions.push({\n label: kw, kind: monaco.languages.CompletionItemKind.Keyword,\n insertText: kw, range, sortText: \"3\" + kw,\n });\n }\n return { suggestions };\n }\n\n // ─── 9. After comma → more columns ───\n if (ctx === \"comma-cols\" && tableRefs.size > 0) {\n suggestions.push(...await columnSuggestions(tableRefs, schemaInfo, monaco, range));\n return { suggestions };\n }\n\n // ─── 10. Default: keywords + table names ───\n for (const kw of SQL_KEYWORDS) {\n suggestions.push({\n label: kw, kind: monaco.languages.CompletionItemKind.Keyword,\n insertText: kw, range, sortText: \"2\" + kw,\n });\n }\n for (const t of schemaInfo.tables) {\n suggestions.push({\n label: t.name, kind: monaco.languages.CompletionItemKind.Struct,\n detail: t.schema, insertText: t.name, range, sortText: \"1\" + t.name,\n });\n }\n return { suggestions };\n } catch {\n // Never let the provider throw — Monaco silently falls back to word-based suggestions\n return { suggestions: [] };\n }\n },\n };\n}\n\n/** Clear the internal column cache (call on connection change) */\nexport function clearCompletionCache() {\n columnCache.clear();\n}\n","import { useState, useRef, useEffect, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Download } from \"lucide-react\";\nimport { serializeCsv } from \"@/lib/csv-parser\";\n\ninterface ExportButtonProps {\n columns: string[];\n rows: Record<string, unknown>[];\n filename?: string;\n /** Optional: connection ID + table for server-side \"Export All\" */\n exportAllUrl?: string;\n}\n\nfunction downloadFile(name: string, content: string, mimeType: string) {\n const blob = new Blob([content], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = name;\n a.click();\n URL.revokeObjectURL(url);\n}\n\nexport function ExportButton({ columns, rows, filename = \"export\", exportAllUrl }: ExportButtonProps) {\n const [open, setOpen] = useState(false);\n const [exporting, setExporting] = useState(false);\n const btnRef = useRef<HTMLButtonElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Close dropdown on outside click\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(e.target as Node) &&\n btnRef.current && !btnRef.current.contains(e.target as Node)) setOpen(false);\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [open]);\n\n const toggle = useCallback(() => setOpen((v) => !v), []);\n\n const exportPageCsv = () => {\n const csvRows = rows.map((r) => columns.map((c) => String(r[c] ?? \"\")));\n const csv = serializeCsv(columns, csvRows);\n downloadFile(`${filename}.csv`, csv, \"text/csv\");\n setOpen(false);\n };\n\n const exportPageJson = () => {\n const json = JSON.stringify(rows, null, 2);\n downloadFile(`${filename}.json`, json, \"application/json\");\n setOpen(false);\n };\n\n const copyToClipboard = async () => {\n const header = columns.join(\"\\t\");\n const body = rows.map((r) => columns.map((c) => String(r[c] ?? \"\")).join(\"\\t\")).join(\"\\n\");\n await navigator.clipboard.writeText(header + \"\\n\" + body);\n setOpen(false);\n };\n\n const exportAll = async (format: \"csv\" | \"json\") => {\n if (!exportAllUrl) return;\n setExporting(true);\n try {\n const res = await fetch(`${exportAllUrl}&format=${format}&limit=10000`);\n const text = await res.text();\n const mimeType = format === \"csv\" ? \"text/csv\" : \"application/json\";\n downloadFile(`${filename}-all.${format}`, text, mimeType);\n } catch { /* ignore */ }\n setExporting(false);\n setOpen(false);\n };\n\n if (columns.length === 0 || rows.length === 0) return null;\n\n // Compute dropdown position from button\n const rect = btnRef.current?.getBoundingClientRect();\n const portal = document.getElementById(\"portal\");\n\n return (\n <>\n <button ref={btnRef} type=\"button\" onClick={toggle}\n className=\"p-1 rounded text-muted-foreground hover:text-foreground transition-colors\" title=\"Export\">\n <Download className=\"size-3.5\" />\n </button>\n\n {open && portal && rect && createPortal(\n <div ref={dropdownRef}\n style={{ position: \"fixed\", left: Math.min(rect.left, window.innerWidth - 170), top: rect.bottom + 4, zIndex: 10000 }}\n className=\"bg-popover border border-border rounded-md shadow-md py-1 min-w-[160px] text-xs\">\n <button onClick={copyToClipboard} className=\"w-full text-left px-3 py-1.5 hover:bg-muted transition-colors text-foreground\">\n Copy to Clipboard (TSV)\n </button>\n <button onClick={exportPageCsv} className=\"w-full text-left px-3 py-1.5 hover:bg-muted transition-colors text-foreground\">\n Export Page (CSV)\n </button>\n <button onClick={exportPageJson} className=\"w-full text-left px-3 py-1.5 hover:bg-muted transition-colors text-foreground\">\n Export Page (JSON)\n </button>\n {exportAllUrl && (\n <>\n <div className=\"border-t border-border my-1\" />\n <button onClick={() => exportAll(\"csv\")} disabled={exporting}\n className=\"w-full text-left px-3 py-1.5 hover:bg-muted transition-colors disabled:opacity-50 text-foreground\">\n {exporting ? \"Exporting…\" : \"Export All (CSV)\"}\n </button>\n <button onClick={() => exportAll(\"json\")} disabled={exporting}\n className=\"w-full text-left px-3 py-1.5 hover:bg-muted transition-colors disabled:opacity-50 text-foreground\">\n {exporting ? \"Exporting…\" : \"Export All (JSON)\"}\n </button>\n </>\n )}\n </div>,\n portal,\n )}\n </>\n );\n}\n","import { styled } from \"@linaria/react\";\nexport const ImageOverlayEditorStyle = /*#__PURE__*/styled('div')({\n name: \"ImageOverlayEditorStyle\",\n class: \"gdg-i2iowwq\",\n propsAsIs: false\n});\n\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","(function (global, factory) {\n if (typeof define === \"function\" && define.amd) {\n define(['exports', 'react', 'prop-types'], factory);\n } else if (typeof exports !== \"undefined\") {\n factory(exports, require('react'), require('prop-types'));\n } else {\n var mod = {\n exports: {}\n };\n factory(mod.exports, global.react, global.propTypes);\n global.reactSwipe = mod.exports;\n }\n})(this, function (exports, _react, _propTypes) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.setHasSupportToCaptureOption = setHasSupportToCaptureOption;\n\n var _react2 = _interopRequireDefault(_react);\n\n var _propTypes2 = _interopRequireDefault(_propTypes);\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n }\n\n var _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n function _objectWithoutProperties(obj, keys) {\n var target = {};\n\n for (var i in obj) {\n if (keys.indexOf(i) >= 0) continue;\n if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;\n target[i] = obj[i];\n }\n\n return target;\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n }();\n\n function _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n }\n\n var supportsCaptureOption = false;\n function setHasSupportToCaptureOption(hasSupport) {\n supportsCaptureOption = hasSupport;\n }\n\n try {\n addEventListener('test', null, Object.defineProperty({}, 'capture', { get: function get() {\n setHasSupportToCaptureOption(true);\n } }));\n } catch (e) {} // eslint-disable-line no-empty\n\n function getSafeEventHandlerOpts() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { capture: true };\n\n return supportsCaptureOption ? options : options.capture;\n }\n\n /**\n * [getPosition returns a position element that works for mouse or touch events]\n * @param {[Event]} event [the received event]\n * @return {[Object]} [x and y coords]\n */\n function getPosition(event) {\n if ('touches' in event) {\n var _event$touches$ = event.touches[0],\n pageX = _event$touches$.pageX,\n pageY = _event$touches$.pageY;\n\n return { x: pageX, y: pageY };\n }\n\n var screenX = event.screenX,\n screenY = event.screenY;\n\n return { x: screenX, y: screenY };\n }\n\n var ReactSwipe = function (_Component) {\n _inherits(ReactSwipe, _Component);\n\n function ReactSwipe() {\n var _ref;\n\n _classCallCheck(this, ReactSwipe);\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var _this = _possibleConstructorReturn(this, (_ref = ReactSwipe.__proto__ || Object.getPrototypeOf(ReactSwipe)).call.apply(_ref, [this].concat(args)));\n\n _this._handleSwipeStart = _this._handleSwipeStart.bind(_this);\n _this._handleSwipeMove = _this._handleSwipeMove.bind(_this);\n _this._handleSwipeEnd = _this._handleSwipeEnd.bind(_this);\n\n _this._onMouseDown = _this._onMouseDown.bind(_this);\n _this._onMouseMove = _this._onMouseMove.bind(_this);\n _this._onMouseUp = _this._onMouseUp.bind(_this);\n\n _this._setSwiperRef = _this._setSwiperRef.bind(_this);\n return _this;\n }\n\n _createClass(ReactSwipe, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n if (this.swiper) {\n this.swiper.addEventListener('touchmove', this._handleSwipeMove, getSafeEventHandlerOpts({\n capture: true,\n passive: false\n }));\n }\n }\n }, {\n key: 'componentWillUnmount',\n value: function componentWillUnmount() {\n if (this.swiper) {\n this.swiper.removeEventListener('touchmove', this._handleSwipeMove, getSafeEventHandlerOpts({\n capture: true,\n passive: false\n }));\n }\n }\n }, {\n key: '_onMouseDown',\n value: function _onMouseDown(event) {\n if (!this.props.allowMouseEvents) {\n return;\n }\n\n this.mouseDown = true;\n\n document.addEventListener('mouseup', this._onMouseUp);\n document.addEventListener('mousemove', this._onMouseMove);\n\n this._handleSwipeStart(event);\n }\n }, {\n key: '_onMouseMove',\n value: function _onMouseMove(event) {\n if (!this.mouseDown) {\n return;\n }\n\n this._handleSwipeMove(event);\n }\n }, {\n key: '_onMouseUp',\n value: function _onMouseUp(event) {\n this.mouseDown = false;\n\n document.removeEventListener('mouseup', this._onMouseUp);\n document.removeEventListener('mousemove', this._onMouseMove);\n\n this._handleSwipeEnd(event);\n }\n }, {\n key: '_handleSwipeStart',\n value: function _handleSwipeStart(event) {\n var _getPosition = getPosition(event),\n x = _getPosition.x,\n y = _getPosition.y;\n\n this.moveStart = { x: x, y: y };\n this.props.onSwipeStart(event);\n }\n }, {\n key: '_handleSwipeMove',\n value: function _handleSwipeMove(event) {\n if (!this.moveStart) {\n return;\n }\n\n var _getPosition2 = getPosition(event),\n x = _getPosition2.x,\n y = _getPosition2.y;\n\n var deltaX = x - this.moveStart.x;\n var deltaY = y - this.moveStart.y;\n this.moving = true;\n\n // handling the responsability of cancelling the scroll to\n // the component handling the event\n var shouldPreventDefault = this.props.onSwipeMove({\n x: deltaX,\n y: deltaY\n }, event);\n\n if (shouldPreventDefault && event.cancelable) {\n event.preventDefault();\n }\n\n this.movePosition = { deltaX: deltaX, deltaY: deltaY };\n }\n }, {\n key: '_handleSwipeEnd',\n value: function _handleSwipeEnd(event) {\n this.props.onSwipeEnd(event);\n\n var tolerance = this.props.tolerance;\n\n\n if (this.moving && this.movePosition) {\n if (this.movePosition.deltaX < -tolerance) {\n this.props.onSwipeLeft(1, event);\n } else if (this.movePosition.deltaX > tolerance) {\n this.props.onSwipeRight(1, event);\n }\n if (this.movePosition.deltaY < -tolerance) {\n this.props.onSwipeUp(1, event);\n } else if (this.movePosition.deltaY > tolerance) {\n this.props.onSwipeDown(1, event);\n }\n }\n\n this.moveStart = null;\n this.moving = false;\n this.movePosition = null;\n }\n }, {\n key: '_setSwiperRef',\n value: function _setSwiperRef(node) {\n this.swiper = node;\n this.props.innerRef(node);\n }\n }, {\n key: 'render',\n value: function render() {\n var _props = this.props,\n tagName = _props.tagName,\n className = _props.className,\n style = _props.style,\n children = _props.children,\n allowMouseEvents = _props.allowMouseEvents,\n onSwipeUp = _props.onSwipeUp,\n onSwipeDown = _props.onSwipeDown,\n onSwipeLeft = _props.onSwipeLeft,\n onSwipeRight = _props.onSwipeRight,\n onSwipeStart = _props.onSwipeStart,\n onSwipeMove = _props.onSwipeMove,\n onSwipeEnd = _props.onSwipeEnd,\n innerRef = _props.innerRef,\n tolerance = _props.tolerance,\n props = _objectWithoutProperties(_props, ['tagName', 'className', 'style', 'children', 'allowMouseEvents', 'onSwipeUp', 'onSwipeDown', 'onSwipeLeft', 'onSwipeRight', 'onSwipeStart', 'onSwipeMove', 'onSwipeEnd', 'innerRef', 'tolerance']);\n\n return _react2.default.createElement(\n this.props.tagName,\n _extends({\n ref: this._setSwiperRef,\n onMouseDown: this._onMouseDown,\n onTouchStart: this._handleSwipeStart,\n onTouchEnd: this._handleSwipeEnd,\n className: className,\n style: style\n }, props),\n children\n );\n }\n }]);\n\n return ReactSwipe;\n }(_react.Component);\n\n ReactSwipe.displayName = 'ReactSwipe';\n ReactSwipe.propTypes = {\n tagName: _propTypes2.default.string,\n className: _propTypes2.default.string,\n style: _propTypes2.default.object,\n children: _propTypes2.default.node,\n allowMouseEvents: _propTypes2.default.bool,\n onSwipeUp: _propTypes2.default.func,\n onSwipeDown: _propTypes2.default.func,\n onSwipeLeft: _propTypes2.default.func,\n onSwipeRight: _propTypes2.default.func,\n onSwipeStart: _propTypes2.default.func,\n onSwipeMove: _propTypes2.default.func,\n onSwipeEnd: _propTypes2.default.func,\n innerRef: _propTypes2.default.func,\n tolerance: _propTypes2.default.number.isRequired\n };\n ReactSwipe.defaultProps = {\n tagName: 'div',\n allowMouseEvents: false,\n onSwipeUp: function onSwipeUp() {},\n onSwipeDown: function onSwipeDown() {},\n onSwipeLeft: function onSwipeLeft() {},\n onSwipeRight: function onSwipeRight() {},\n onSwipeStart: function onSwipeStart() {},\n onSwipeMove: function onSwipeMove() {},\n onSwipeEnd: function onSwipeEnd() {},\n innerRef: function innerRef() {},\n\n tolerance: 0\n };\n exports.default = ReactSwipe;\n});","(function (global, factory) {\n if (typeof define === \"function\" && define.amd) {\n define(['exports', './react-swipe'], factory);\n } else if (typeof exports !== \"undefined\") {\n factory(exports, require('./react-swipe'));\n } else {\n var mod = {\n exports: {}\n };\n factory(mod.exports, global.reactSwipe);\n global.index = mod.exports;\n }\n})(this, function (exports, _reactSwipe) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n var _reactSwipe2 = _interopRequireDefault(_reactSwipe);\n\n function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n }\n\n exports.default = _reactSwipe2.default;\n});","/*!\n\tCopyright (c) 2018 Jed Watson.\n\tLicensed under the MIT License (MIT), see\n\thttp://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = '';\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (arg) {\n\t\t\t\tclasses = appendClass(classes, parseValue(arg));\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction parseValue (arg) {\n\t\tif (typeof arg === 'string' || typeof arg === 'number') {\n\t\t\treturn arg;\n\t\t}\n\n\t\tif (typeof arg !== 'object') {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (Array.isArray(arg)) {\n\t\t\treturn classNames.apply(null, arg);\n\t\t}\n\n\t\tif (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes('[native code]')) {\n\t\t\treturn arg.toString();\n\t\t}\n\n\t\tvar classes = '';\n\n\t\tfor (var key in arg) {\n\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\tclasses = appendClass(classes, key);\n\t\t\t}\n\t\t}\n\n\t\treturn classes;\n\t}\n\n\tfunction appendClass (value, newClass) {\n\t\tif (!newClass) {\n\t\t\treturn value;\n\t\t}\n\t\n\t\tif (value) {\n\t\t\treturn value + ' ' + newClass;\n\t\t}\n\t\n\t\treturn value + newClass;\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\tdefine('classnames', [], function () {\n\t\t\treturn classNames;\n\t\t});\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _classnames = _interopRequireDefault(require(\"classnames\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar _default = {\n ROOT: function ROOT(customClassName) {\n return (0, _classnames.default)(_defineProperty({\n 'carousel-root': true\n }, customClassName || '', !!customClassName));\n },\n CAROUSEL: function CAROUSEL(isSlider) {\n return (0, _classnames.default)({\n carousel: true,\n 'carousel-slider': isSlider\n });\n },\n WRAPPER: function WRAPPER(isSlider, axis) {\n return (0, _classnames.default)({\n 'thumbs-wrapper': !isSlider,\n 'slider-wrapper': isSlider,\n 'axis-horizontal': axis === 'horizontal',\n 'axis-vertical': axis !== 'horizontal'\n });\n },\n SLIDER: function SLIDER(isSlider, isSwiping) {\n return (0, _classnames.default)({\n thumbs: !isSlider,\n slider: isSlider,\n animated: !isSwiping\n });\n },\n ITEM: function ITEM(isSlider, selected, previous) {\n return (0, _classnames.default)({\n thumb: !isSlider,\n slide: isSlider,\n selected: selected,\n previous: previous\n });\n },\n ARROW_PREV: function ARROW_PREV(disabled) {\n return (0, _classnames.default)({\n 'control-arrow control-prev': true,\n 'control-disabled': disabled\n });\n },\n ARROW_NEXT: function ARROW_NEXT(disabled) {\n return (0, _classnames.default)({\n 'control-arrow control-next': true,\n 'control-disabled': disabled\n });\n },\n DOT: function DOT(selected) {\n return (0, _classnames.default)({\n dot: true,\n selected: selected\n });\n }\n};\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.outerWidth = void 0;\n\nvar outerWidth = function outerWidth(el) {\n var width = el.offsetWidth;\n var style = getComputedStyle(el);\n width += parseInt(style.marginLeft) + parseInt(style.marginRight);\n return width;\n};\n\nexports.outerWidth = outerWidth;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _default = function _default(position, metric, axis) {\n var positionPercent = position === 0 ? position : position + metric;\n var positionCss = axis === 'horizontal' ? [positionPercent, 0, 0] : [0, positionPercent, 0];\n var transitionProp = 'translate3d';\n var translatedPosition = '(' + positionCss.join(',') + ')';\n return transitionProp + translatedPosition;\n};\n\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _default = function _default() {\n return window;\n};\n\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _react = _interopRequireWildcard(require(\"react\"));\n\nvar _cssClasses = _interopRequireDefault(require(\"../cssClasses\"));\n\nvar _dimensions = require(\"../dimensions\");\n\nvar _CSSTranslate = _interopRequireDefault(require(\"../CSSTranslate\"));\n\nvar _reactEasySwipe = _interopRequireDefault(require(\"react-easy-swipe\"));\n\nvar _window = _interopRequireDefault(require(\"../shims/window\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar isKeyboardEvent = function isKeyboardEvent(e) {\n return e.hasOwnProperty('key');\n};\n\nvar Thumbs = /*#__PURE__*/function (_Component) {\n _inherits(Thumbs, _Component);\n\n var _super = _createSuper(Thumbs);\n\n function Thumbs(_props) {\n var _this;\n\n _classCallCheck(this, Thumbs);\n\n _this = _super.call(this, _props);\n\n _defineProperty(_assertThisInitialized(_this), \"itemsWrapperRef\", void 0);\n\n _defineProperty(_assertThisInitialized(_this), \"itemsListRef\", void 0);\n\n _defineProperty(_assertThisInitialized(_this), \"thumbsRef\", void 0);\n\n _defineProperty(_assertThisInitialized(_this), \"setItemsWrapperRef\", function (node) {\n _this.itemsWrapperRef = node;\n });\n\n _defineProperty(_assertThisInitialized(_this), \"setItemsListRef\", function (node) {\n _this.itemsListRef = node;\n });\n\n _defineProperty(_assertThisInitialized(_this), \"setThumbsRef\", function (node, index) {\n if (!_this.thumbsRef) {\n _this.thumbsRef = [];\n }\n\n _this.thumbsRef[index] = node;\n });\n\n _defineProperty(_assertThisInitialized(_this), \"updateSizes\", function () {\n if (!_this.props.children || !_this.itemsWrapperRef || !_this.thumbsRef) {\n return;\n }\n\n var total = _react.Children.count(_this.props.children);\n\n var wrapperSize = _this.itemsWrapperRef.clientWidth;\n var itemSize = _this.props.thumbWidth ? _this.props.thumbWidth : (0, _dimensions.outerWidth)(_this.thumbsRef[0]);\n var visibleItems = Math.floor(wrapperSize / itemSize);\n var showArrows = visibleItems < total;\n var lastPosition = showArrows ? total - visibleItems : 0;\n\n _this.setState(function (_state, props) {\n return {\n itemSize: itemSize,\n visibleItems: visibleItems,\n firstItem: showArrows ? _this.getFirstItem(props.selectedItem) : 0,\n lastPosition: lastPosition,\n showArrows: showArrows\n };\n });\n });\n\n _defineProperty(_assertThisInitialized(_this), \"handleClickItem\", function (index, item, e) {\n if (!isKeyboardEvent(e) || e.key === 'Enter') {\n var handler = _this.props.onSelectItem;\n\n if (typeof handler === 'function') {\n handler(index, item);\n }\n }\n });\n\n _defineProperty(_assertThisInitialized(_this), \"onSwipeStart\", function () {\n _this.setState({\n swiping: true\n });\n });\n\n _defineProperty(_assertThisInitialized(_this), \"onSwipeEnd\", function () {\n _this.setState({\n swiping: false\n });\n });\n\n _defineProperty(_assertThisInitialized(_this), \"onSwipeMove\", function (delta) {\n var deltaX = delta.x;\n\n if (!_this.state.itemSize || !_this.itemsWrapperRef || !_this.state.visibleItems) {\n return false;\n }\n\n var leftBoundary = 0;\n\n var childrenLength = _react.Children.count(_this.props.children);\n\n var currentPosition = -(_this.state.firstItem * 100) / _this.state.visibleItems;\n var lastLeftItem = Math.max(childrenLength - _this.state.visibleItems, 0);\n var lastLeftBoundary = -lastLeftItem * 100 / _this.state.visibleItems; // prevent user from swiping left out of boundaries\n\n if (currentPosition === leftBoundary && deltaX > 0) {\n deltaX = 0;\n } // prevent user from swiping right out of boundaries\n\n\n if (currentPosition === lastLeftBoundary && deltaX < 0) {\n deltaX = 0;\n }\n\n var wrapperSize = _this.itemsWrapperRef.clientWidth;\n var position = currentPosition + 100 / (wrapperSize / deltaX); // if 3d isn't available we will use left to move\n\n if (_this.itemsListRef) {\n ['WebkitTransform', 'MozTransform', 'MsTransform', 'OTransform', 'transform', 'msTransform'].forEach(function (prop) {\n _this.itemsListRef.style[prop] = (0, _CSSTranslate.default)(position, '%', _this.props.axis);\n });\n }\n\n return true;\n });\n\n _defineProperty(_assertThisInitialized(_this), \"slideRight\", function (positions) {\n _this.moveTo(_this.state.firstItem - (typeof positions === 'number' ? positions : 1));\n });\n\n _defineProperty(_assertThisInitialized(_this), \"slideLeft\", function (positions) {\n _this.moveTo(_this.state.firstItem + (typeof positions === 'number' ? positions : 1));\n });\n\n _defineProperty(_assertThisInitialized(_this), \"moveTo\", function (position) {\n // position can't be lower than 0\n position = position < 0 ? 0 : position; // position can't be higher than last postion\n\n position = position >= _this.state.lastPosition ? _this.state.lastPosition : position;\n\n _this.setState({\n firstItem: position\n });\n });\n\n _this.state = {\n selectedItem: _props.selectedItem,\n swiping: false,\n showArrows: false,\n firstItem: 0,\n visibleItems: 0,\n lastPosition: 0\n };\n return _this;\n }\n\n _createClass(Thumbs, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n this.setupThumbs();\n }\n }, {\n key: \"componentDidUpdate\",\n value: function componentDidUpdate(prevProps) {\n if (this.props.selectedItem !== this.state.selectedItem) {\n this.setState({\n selectedItem: this.props.selectedItem,\n firstItem: this.getFirstItem(this.props.selectedItem)\n });\n }\n\n if (this.props.children === prevProps.children) {\n return;\n } // This will capture any size changes for arrow adjustments etc.\n // usually in the same render cycle so we don't see any flickers\n\n\n this.updateSizes();\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n this.destroyThumbs();\n }\n }, {\n key: \"setupThumbs\",\n value: function setupThumbs() {\n // as the widths are calculated, we need to resize\n // the carousel when the window is resized\n (0, _window.default)().addEventListener('resize', this.updateSizes); // issue #2 - image loading smaller\n\n (0, _window.default)().addEventListener('DOMContentLoaded', this.updateSizes); // when the component is rendered we need to calculate\n // the container size to adjust the responsive behaviour\n\n this.updateSizes();\n }\n }, {\n key: \"destroyThumbs\",\n value: function destroyThumbs() {\n // removing listeners\n (0, _window.default)().removeEventListener('resize', this.updateSizes);\n (0, _window.default)().removeEventListener('DOMContentLoaded', this.updateSizes);\n }\n }, {\n key: \"getFirstItem\",\n value: function getFirstItem(selectedItem) {\n var firstItem = selectedItem;\n\n if (selectedItem >= this.state.lastPosition) {\n firstItem = this.state.lastPosition;\n }\n\n if (selectedItem < this.state.firstItem + this.state.visibleItems) {\n firstItem = this.state.firstItem;\n }\n\n if (selectedItem < this.state.firstItem) {\n firstItem = selectedItem;\n }\n\n return firstItem;\n }\n }, {\n key: \"renderItems\",\n value: function renderItems() {\n var _this2 = this;\n\n return this.props.children.map(function (img, index) {\n var itemClass = _cssClasses.default.ITEM(false, index === _this2.state.selectedItem);\n\n var thumbProps = {\n key: index,\n ref: function ref(e) {\n return _this2.setThumbsRef(e, index);\n },\n className: itemClass,\n onClick: _this2.handleClickItem.bind(_this2, index, _this2.props.children[index]),\n onKeyDown: _this2.handleClickItem.bind(_this2, index, _this2.props.children[index]),\n 'aria-label': \"\".concat(_this2.props.labels.item, \" \").concat(index + 1),\n style: {\n width: _this2.props.thumbWidth\n }\n };\n return /*#__PURE__*/_react.default.createElement(\"li\", _extends({}, thumbProps, {\n role: \"button\",\n tabIndex: 0\n }), img);\n });\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this3 = this;\n\n if (!this.props.children) {\n return null;\n }\n\n var isSwipeable = _react.Children.count(this.props.children) > 1; // show left arrow?\n\n var hasPrev = this.state.showArrows && this.state.firstItem > 0; // show right arrow\n\n var hasNext = this.state.showArrows && this.state.firstItem < this.state.lastPosition; // obj to hold the transformations and styles\n\n var itemListStyles = {};\n var currentPosition = -this.state.firstItem * (this.state.itemSize || 0);\n var transformProp = (0, _CSSTranslate.default)(currentPosition, 'px', this.props.axis);\n var transitionTime = this.props.transitionTime + 'ms';\n itemListStyles = {\n WebkitTransform: transformProp,\n MozTransform: transformProp,\n MsTransform: transformProp,\n OTransform: transformProp,\n transform: transformProp,\n msTransform: transformProp,\n WebkitTransitionDuration: transitionTime,\n MozTransitionDuration: transitionTime,\n MsTransitionDuration: transitionTime,\n OTransitionDuration: transitionTime,\n transitionDuration: transitionTime,\n msTransitionDuration: transitionTime\n };\n return /*#__PURE__*/_react.default.createElement(\"div\", {\n className: _cssClasses.default.CAROUSEL(false)\n }, /*#__PURE__*/_react.default.createElement(\"div\", {\n className: _cssClasses.default.WRAPPER(false),\n ref: this.setItemsWrapperRef\n }, /*#__PURE__*/_react.default.createElement(\"button\", {\n type: \"button\",\n className: _cssClasses.default.ARROW_PREV(!hasPrev),\n onClick: function onClick() {\n return _this3.slideRight();\n },\n \"aria-label\": this.props.labels.leftArrow\n }), isSwipeable ? /*#__PURE__*/_react.default.createElement(_reactEasySwipe.default, {\n tagName: \"ul\",\n className: _cssClasses.default.SLIDER(false, this.state.swiping),\n onSwipeLeft: this.slideLeft,\n onSwipeRight: this.slideRight,\n onSwipeMove: this.onSwipeMove,\n onSwipeStart: this.onSwipeStart,\n onSwipeEnd: this.onSwipeEnd,\n style: itemListStyles,\n innerRef: this.setItemsListRef,\n allowMouseEvents: this.props.emulateTouch\n }, this.renderItems()) : /*#__PURE__*/_react.default.createElement(\"ul\", {\n className: _cssClasses.default.SLIDER(false, this.state.swiping),\n ref: function ref(node) {\n return _this3.setItemsListRef(node);\n },\n style: itemListStyles\n }, this.renderItems()), /*#__PURE__*/_react.default.createElement(\"button\", {\n type: \"button\",\n className: _cssClasses.default.ARROW_NEXT(!hasNext),\n onClick: function onClick() {\n return _this3.slideLeft();\n },\n \"aria-label\": this.props.labels.rightArrow\n })));\n }\n }]);\n\n return Thumbs;\n}(_react.Component);\n\nexports.default = Thumbs;\n\n_defineProperty(Thumbs, \"displayName\", 'Thumbs');\n\n_defineProperty(Thumbs, \"defaultProps\", {\n axis: 'horizontal',\n labels: {\n leftArrow: 'previous slide / item',\n rightArrow: 'next slide / item',\n item: 'slide item'\n },\n selectedItem: 0,\n thumbWidth: 80,\n transitionTime: 350\n});","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _default = function _default() {\n return document;\n};\n\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.setPosition = exports.getPosition = exports.isKeyboardEvent = exports.defaultStatusFormatter = exports.noop = void 0;\n\nvar _react = require(\"react\");\n\nvar _CSSTranslate = _interopRequireDefault(require(\"../../CSSTranslate\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar noop = function noop() {};\n\nexports.noop = noop;\n\nvar defaultStatusFormatter = function defaultStatusFormatter(current, total) {\n return \"\".concat(current, \" of \").concat(total);\n};\n\nexports.defaultStatusFormatter = defaultStatusFormatter;\n\nvar isKeyboardEvent = function isKeyboardEvent(e) {\n return e ? e.hasOwnProperty('key') : false;\n};\n/**\n * Gets the list 'position' relative to a current index\n * @param index\n */\n\n\nexports.isKeyboardEvent = isKeyboardEvent;\n\nvar getPosition = function getPosition(index, props) {\n if (props.infiniteLoop) {\n // index has to be added by 1 because of the first cloned slide\n ++index;\n }\n\n if (index === 0) {\n return 0;\n }\n\n var childrenLength = _react.Children.count(props.children);\n\n if (props.centerMode && props.axis === 'horizontal') {\n var currentPosition = -index * props.centerSlidePercentage;\n var lastPosition = childrenLength - 1;\n\n if (index && (index !== lastPosition || props.infiniteLoop)) {\n currentPosition += (100 - props.centerSlidePercentage) / 2;\n } else if (index === lastPosition) {\n currentPosition += 100 - props.centerSlidePercentage;\n }\n\n return currentPosition;\n }\n\n return -index * 100;\n};\n/**\n * Sets the 'position' transform for sliding animations\n * @param position\n * @param forceReflow\n */\n\n\nexports.getPosition = getPosition;\n\nvar setPosition = function setPosition(position, axis) {\n var style = {};\n ['WebkitTransform', 'MozTransform', 'MsTransform', 'OTransform', 'transform', 'msTransform'].forEach(function (prop) {\n // @ts-ignore\n style[prop] = (0, _CSSTranslate.default)(position, '%', axis);\n });\n return style;\n};\n\nexports.setPosition = setPosition;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.fadeAnimationHandler = exports.slideStopSwipingHandler = exports.slideSwipeAnimationHandler = exports.slideAnimationHandler = void 0;\n\nvar _react = require(\"react\");\n\nvar _CSSTranslate = _interopRequireDefault(require(\"../../CSSTranslate\"));\n\nvar _utils = require(\"./utils\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\n/**\n * Main animation handler for the default 'sliding' style animation\n * @param props\n * @param state\n */\nvar slideAnimationHandler = function slideAnimationHandler(props, state) {\n var returnStyles = {};\n var selectedItem = state.selectedItem;\n var previousItem = selectedItem;\n var lastPosition = _react.Children.count(props.children) - 1;\n var needClonedSlide = props.infiniteLoop && (selectedItem < 0 || selectedItem > lastPosition); // Handle list position if it needs a clone\n\n if (needClonedSlide) {\n if (previousItem < 0) {\n if (props.centerMode && props.centerSlidePercentage && props.axis === 'horizontal') {\n returnStyles.itemListStyle = (0, _utils.setPosition)(-(lastPosition + 2) * props.centerSlidePercentage - (100 - props.centerSlidePercentage) / 2, props.axis);\n } else {\n returnStyles.itemListStyle = (0, _utils.setPosition)(-(lastPosition + 2) * 100, props.axis);\n }\n } else if (previousItem > lastPosition) {\n returnStyles.itemListStyle = (0, _utils.setPosition)(0, props.axis);\n }\n\n return returnStyles;\n }\n\n var currentPosition = (0, _utils.getPosition)(selectedItem, props); // if 3d is available, let's take advantage of the performance of transform\n\n var transformProp = (0, _CSSTranslate.default)(currentPosition, '%', props.axis);\n var transitionTime = props.transitionTime + 'ms';\n returnStyles.itemListStyle = {\n WebkitTransform: transformProp,\n msTransform: transformProp,\n OTransform: transformProp,\n transform: transformProp\n };\n\n if (!state.swiping) {\n returnStyles.itemListStyle = _objectSpread(_objectSpread({}, returnStyles.itemListStyle), {}, {\n WebkitTransitionDuration: transitionTime,\n MozTransitionDuration: transitionTime,\n OTransitionDuration: transitionTime,\n transitionDuration: transitionTime,\n msTransitionDuration: transitionTime\n });\n }\n\n return returnStyles;\n};\n/**\n * Swiping animation handler for the default 'sliding' style animation\n * @param delta\n * @param props\n * @param state\n * @param setState\n */\n\n\nexports.slideAnimationHandler = slideAnimationHandler;\n\nvar slideSwipeAnimationHandler = function slideSwipeAnimationHandler(delta, props, state, setState) {\n var returnStyles = {};\n var isHorizontal = props.axis === 'horizontal';\n\n var childrenLength = _react.Children.count(props.children);\n\n var initialBoundry = 0;\n var currentPosition = (0, _utils.getPosition)(state.selectedItem, props);\n var finalBoundry = props.infiniteLoop ? (0, _utils.getPosition)(childrenLength - 1, props) - 100 : (0, _utils.getPosition)(childrenLength - 1, props);\n var axisDelta = isHorizontal ? delta.x : delta.y;\n var handledDelta = axisDelta; // prevent user from swiping left out of boundaries\n\n if (currentPosition === initialBoundry && axisDelta > 0) {\n handledDelta = 0;\n } // prevent user from swiping right out of boundaries\n\n\n if (currentPosition === finalBoundry && axisDelta < 0) {\n handledDelta = 0;\n }\n\n var position = currentPosition + 100 / (state.itemSize / handledDelta);\n var hasMoved = Math.abs(axisDelta) > props.swipeScrollTolerance;\n\n if (props.infiniteLoop && hasMoved) {\n // When allowing infinite loop, if we slide left from position 0 we reveal the cloned last slide that appears before it\n // if we slide even further we need to jump to other side so it can continue - and vice versa for the last slide\n if (state.selectedItem === 0 && position > -100) {\n position -= childrenLength * 100;\n } else if (state.selectedItem === childrenLength - 1 && position < -childrenLength * 100) {\n position += childrenLength * 100;\n }\n }\n\n if (!props.preventMovementUntilSwipeScrollTolerance || hasMoved || state.swipeMovementStarted) {\n if (!state.swipeMovementStarted) {\n setState({\n swipeMovementStarted: true\n });\n }\n\n returnStyles.itemListStyle = (0, _utils.setPosition)(position, props.axis);\n } //allows scroll if the swipe was within the tolerance\n\n\n if (hasMoved && !state.cancelClick) {\n setState({\n cancelClick: true\n });\n }\n\n return returnStyles;\n};\n/**\n * Default 'sliding' style animination handler for when a swipe action stops.\n * @param props\n * @param state\n */\n\n\nexports.slideSwipeAnimationHandler = slideSwipeAnimationHandler;\n\nvar slideStopSwipingHandler = function slideStopSwipingHandler(props, state) {\n var currentPosition = (0, _utils.getPosition)(state.selectedItem, props);\n var itemListStyle = (0, _utils.setPosition)(currentPosition, props.axis);\n return {\n itemListStyle: itemListStyle\n };\n};\n/**\n * Main animation handler for the default 'fade' style animation\n * @param props\n * @param state\n */\n\n\nexports.slideStopSwipingHandler = slideStopSwipingHandler;\n\nvar fadeAnimationHandler = function fadeAnimationHandler(props, state) {\n var transitionTime = props.transitionTime + 'ms';\n var transitionTimingFunction = 'ease-in-out';\n var slideStyle = {\n position: 'absolute',\n display: 'block',\n zIndex: -2,\n minHeight: '100%',\n opacity: 0,\n top: 0,\n right: 0,\n left: 0,\n bottom: 0,\n transitionTimingFunction: transitionTimingFunction,\n msTransitionTimingFunction: transitionTimingFunction,\n MozTransitionTimingFunction: transitionTimingFunction,\n WebkitTransitionTimingFunction: transitionTimingFunction,\n OTransitionTimingFunction: transitionTimingFunction\n };\n\n if (!state.swiping) {\n slideStyle = _objectSpread(_objectSpread({}, slideStyle), {}, {\n WebkitTransitionDuration: transitionTime,\n MozTransitionDuration: transitionTime,\n OTransitionDuration: transitionTime,\n transitionDuration: transitionTime,\n msTransitionDuration: transitionTime\n });\n }\n\n return {\n slideStyle: slideStyle,\n selectedStyle: _objectSpread(_objectSpread({}, slideStyle), {}, {\n opacity: 1,\n position: 'relative'\n }),\n prevStyle: _objectSpread({}, slideStyle)\n };\n};\n\nexports.fadeAnimationHandler = fadeAnimationHandler;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar _react = _interopRequireWildcard(require(\"react\"));\n\nvar _reactEasySwipe = _interopRequireDefault(require(\"react-easy-swipe\"));\n\nvar _cssClasses = _interopRequireDefault(require(\"../../cssClasses\"));\n\nvar _Thumbs = _interopRequireDefault(require(\"../Thumbs\"));\n\nvar _document = _interopRequireDefault(require(\"../../shims/document\"));\n\nvar _window = _interopRequireDefault(require(\"../../shims/window\"));\n\nvar _utils = require(\"./utils\");\n\nvar _animations = require(\"./animations\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _getRequireWildcardCache() { if (typeof WeakMap !== \"function\") return null; var cache = new WeakMap(); _getRequireWildcardCache = function _getRequireWildcardCache() { return cache; }; return cache; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar Carousel = /*#__PURE__*/function (_React$Component) {\n _inherits(Carousel, _React$Component);\n\n var _super = _createSuper(Carousel);\n\n // @ts-ignore\n function Carousel(props) {\n var _this;\n\n _classCallCheck(this, Carousel);\n\n _this = _super.call(this, props);\n\n _defineProperty(_assertThisInitialized(_this), \"thumbsRef\", void 0);\n\n _defineProperty(_assertThisInitialized(_this), \"carouselWrapperRef\", void 0);\n\n _defineProperty(_assertThisInitialized(_this), \"listRef\", void 0);\n\n _defineProperty(_assertThisInitialized(_this), \"itemsRef\", void 0);\n\n _defineProperty(_assertThisInitialized(_this), \"timer\", void 0);\n\n _defineProperty(_assertThisInitialized(_this), \"animationHandler\", void 0);\n\n _defineProperty(_assertThisInitialized(_this), \"setThumbsRef\", function (node) {\n _this.thumbsRef = node;\n });\n\n _defineProperty(_assertThisInitialized(_this), \"setCarouselWrapperRef\", function (node) {\n _this.carouselWrapperRef = node;\n });\n\n _defineProperty(_assertThisInitialized(_this), \"setListRef\", function (node) {\n _this.listRef = node;\n });\n\n _defineProperty(_assertThisInitialized(_this), \"setItemsRef\", function (node, index) {\n if (!_this.itemsRef) {\n _this.itemsRef = [];\n }\n\n _this.itemsRef[index] = node;\n });\n\n _defineProperty(_assertThisInitialized(_this), \"autoPlay\", function () {\n if (_react.Children.count(_this.props.children) <= 1) {\n return;\n }\n\n _this.clearAutoPlay();\n\n if (!_this.props.autoPlay) {\n return;\n }\n\n _this.timer = setTimeout(function () {\n _this.increment();\n }, _this.props.interval);\n });\n\n _defineProperty(_assertThisInitialized(_this), \"clearAutoPlay\", function () {\n if (_this.timer) clearTimeout(_this.timer);\n });\n\n _defineProperty(_assertThisInitialized(_this), \"resetAutoPlay\", function () {\n _this.clearAutoPlay();\n\n _this.autoPlay();\n });\n\n _defineProperty(_assertThisInitialized(_this), \"stopOnHover\", function () {\n _this.setState({\n isMouseEntered: true\n }, _this.clearAutoPlay);\n });\n\n _defineProperty(_assertThisInitialized(_this), \"startOnLeave\", function () {\n _this.setState({\n isMouseEntered: false\n }, _this.autoPlay);\n });\n\n _defineProperty(_assertThisInitialized(_this), \"isFocusWithinTheCarousel\", function () {\n if (!_this.carouselWrapperRef) {\n return false;\n }\n\n if ((0, _document.default)().activeElement === _this.carouselWrapperRef || _this.carouselWrapperRef.contains((0, _document.default)().activeElement)) {\n return true;\n }\n\n return false;\n });\n\n _defineProperty(_assertThisInitialized(_this), \"navigateWithKeyboard\", function (e) {\n if (!_this.isFocusWithinTheCarousel()) {\n return;\n }\n\n var axis = _this.props.axis;\n var isHorizontal = axis === 'horizontal';\n var keyNames = {\n ArrowUp: 38,\n ArrowRight: 39,\n ArrowDown: 40,\n ArrowLeft: 37\n };\n var nextKey = isHorizontal ? keyNames.ArrowRight : keyNames.ArrowDown;\n var prevKey = isHorizontal ? keyNames.ArrowLeft : keyNames.ArrowUp;\n\n if (nextKey === e.keyCode) {\n _this.increment();\n } else if (prevKey === e.keyCode) {\n _this.decrement();\n }\n });\n\n _defineProperty(_assertThisInitialized(_this), \"updateSizes\", function () {\n if (!_this.state.initialized || !_this.itemsRef || _this.itemsRef.length === 0) {\n return;\n }\n\n var isHorizontal = _this.props.axis === 'horizontal';\n var firstItem = _this.itemsRef[0];\n\n if (!firstItem) {\n return;\n }\n\n var itemSize = isHorizontal ? firstItem.clientWidth : firstItem.clientHeight;\n\n _this.setState({\n itemSize: itemSize\n });\n\n if (_this.thumbsRef) {\n _this.thumbsRef.updateSizes();\n }\n });\n\n _defineProperty(_assertThisInitialized(_this), \"setMountState\", function () {\n _this.setState({\n hasMount: true\n });\n\n _this.updateSizes();\n });\n\n _defineProperty(_assertThisInitialized(_this), \"handleClickItem\", function (index, item) {\n if (_react.Children.count(_this.props.children) === 0) {\n return;\n }\n\n if (_this.state.cancelClick) {\n _this.setState({\n cancelClick: false\n });\n\n return;\n }\n\n _this.props.onClickItem(index, item);\n\n if (index !== _this.state.selectedItem) {\n _this.setState({\n selectedItem: index\n });\n }\n });\n\n _defineProperty(_assertThisInitialized(_this), \"handleOnChange\", function (index, item) {\n if (_react.Children.count(_this.props.children) <= 1) {\n return;\n }\n\n _this.props.onChange(index, item);\n });\n\n _defineProperty(_assertThisInitialized(_this), \"handleClickThumb\", function (index, item) {\n _this.props.onClickThumb(index, item);\n\n _this.moveTo(index);\n });\n\n _defineProperty(_assertThisInitialized(_this), \"onSwipeStart\", function (event) {\n _this.setState({\n swiping: true\n });\n\n _this.props.onSwipeStart(event);\n });\n\n _defineProperty(_assertThisInitialized(_this), \"onSwipeEnd\", function (event) {\n _this.setState({\n swiping: false,\n cancelClick: false,\n swipeMovementStarted: false\n });\n\n _this.props.onSwipeEnd(event);\n\n _this.clearAutoPlay();\n\n if (_this.state.autoPlay) {\n _this.autoPlay();\n }\n });\n\n _defineProperty(_assertThisInitialized(_this), \"onSwipeMove\", function (delta, event) {\n _this.props.onSwipeMove(event);\n\n var animationHandlerResponse = _this.props.swipeAnimationHandler(delta, _this.props, _this.state, _this.setState.bind(_assertThisInitialized(_this)));\n\n _this.setState(_objectSpread({}, animationHandlerResponse)); // If we have not moved, we should have an empty object returned\n // Return false to allow scrolling when not swiping\n\n\n return !!Object.keys(animationHandlerResponse).length;\n });\n\n _defineProperty(_assertThisInitialized(_this), \"decrement\", function () {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n\n _this.moveTo(_this.state.selectedItem - (typeof positions === 'number' ? positions : 1));\n });\n\n _defineProperty(_assertThisInitialized(_this), \"increment\", function () {\n var positions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n\n _this.moveTo(_this.state.selectedItem + (typeof positions === 'number' ? positions : 1));\n });\n\n _defineProperty(_assertThisInitialized(_this), \"moveTo\", function (position) {\n if (typeof position !== 'number') {\n return;\n }\n\n var lastPosition = _react.Children.count(_this.props.children) - 1;\n\n if (position < 0) {\n position = _this.props.infiniteLoop ? lastPosition : 0;\n }\n\n if (position > lastPosition) {\n position = _this.props.infiniteLoop ? 0 : lastPosition;\n }\n\n _this.selectItem({\n // if it's not a slider, we don't need to set position here\n selectedItem: position\n }); // don't reset auto play when stop on hover is enabled, doing so will trigger a call to auto play more than once\n // and will result in the interval function not being cleared correctly.\n\n\n if (_this.state.autoPlay && _this.state.isMouseEntered === false) {\n _this.resetAutoPlay();\n }\n });\n\n _defineProperty(_assertThisInitialized(_this), \"onClickNext\", function () {\n _this.increment(1);\n });\n\n _defineProperty(_assertThisInitialized(_this), \"onClickPrev\", function () {\n _this.decrement(1);\n });\n\n _defineProperty(_assertThisInitialized(_this), \"onSwipeForward\", function () {\n _this.increment(1);\n\n if (_this.props.emulateTouch) {\n _this.setState({\n cancelClick: true\n });\n }\n });\n\n _defineProperty(_assertThisInitialized(_this), \"onSwipeBackwards\", function () {\n _this.decrement(1);\n\n if (_this.props.emulateTouch) {\n _this.setState({\n cancelClick: true\n });\n }\n });\n\n _defineProperty(_assertThisInitialized(_this), \"changeItem\", function (newIndex) {\n return function (e) {\n if (!(0, _utils.isKeyboardEvent)(e) || e.key === 'Enter') {\n _this.moveTo(newIndex);\n }\n };\n });\n\n _defineProperty(_assertThisInitialized(_this), \"selectItem\", function (state) {\n // Merge in the new state while updating updating previous item\n _this.setState(_objectSpread({\n previousItem: _this.state.selectedItem\n }, state), function () {\n // Run animation handler and update styles based on it\n _this.setState(_this.animationHandler(_this.props, _this.state));\n });\n\n _this.handleOnChange(state.selectedItem, _react.Children.toArray(_this.props.children)[state.selectedItem]);\n });\n\n _defineProperty(_assertThisInitialized(_this), \"getInitialImage\", function () {\n var selectedItem = _this.props.selectedItem;\n var item = _this.itemsRef && _this.itemsRef[selectedItem];\n var images = item && item.getElementsByTagName('img') || [];\n return images[0];\n });\n\n _defineProperty(_assertThisInitialized(_this), \"getVariableItemHeight\", function (position) {\n var item = _this.itemsRef && _this.itemsRef[position];\n\n if (_this.state.hasMount && item && item.children.length) {\n var slideImages = item.children[0].getElementsByTagName('img') || [];\n\n if (slideImages.length > 0) {\n var image = slideImages[0];\n\n if (!image.complete) {\n // if the image is still loading, the size won't be available so we trigger a new render after it's done\n var onImageLoad = function onImageLoad() {\n _this.forceUpdate();\n\n image.removeEventListener('load', onImageLoad);\n };\n\n image.addEventListener('load', onImageLoad);\n }\n } // try to get img first, if img not there find first display tag\n\n\n var displayItem = slideImages[0] || item.children[0];\n var height = displayItem.clientHeight;\n return height > 0 ? height : null;\n }\n\n return null;\n });\n\n var initState = {\n initialized: false,\n previousItem: props.selectedItem,\n selectedItem: props.selectedItem,\n hasMount: false,\n isMouseEntered: false,\n autoPlay: props.autoPlay,\n swiping: false,\n swipeMovementStarted: false,\n cancelClick: false,\n itemSize: 1,\n itemListStyle: {},\n slideStyle: {},\n selectedStyle: {},\n prevStyle: {}\n };\n _this.animationHandler = typeof props.animationHandler === 'function' && props.animationHandler || props.animationHandler === 'fade' && _animations.fadeAnimationHandler || _animations.slideAnimationHandler;\n _this.state = _objectSpread(_objectSpread({}, initState), _this.animationHandler(props, initState));\n return _this;\n }\n\n _createClass(Carousel, [{\n key: \"componentDidMount\",\n value: function componentDidMount() {\n if (!this.props.children) {\n return;\n }\n\n this.setupCarousel();\n }\n }, {\n key: \"componentDidUpdate\",\n value: function componentDidUpdate(prevProps, prevState) {\n if (!prevProps.children && this.props.children && !this.state.initialized) {\n this.setupCarousel();\n }\n\n if (!prevProps.autoFocus && this.props.autoFocus) {\n this.forceFocus();\n }\n\n if (prevState.swiping && !this.state.swiping) {\n // We stopped swiping, ensure we are heading to the new/current slide and not stuck\n this.setState(_objectSpread({}, this.props.stopSwipingHandler(this.props, this.state)));\n }\n\n if (prevProps.selectedItem !== this.props.selectedItem || prevProps.centerMode !== this.props.centerMode) {\n this.updateSizes();\n this.moveTo(this.props.selectedItem);\n }\n\n if (prevProps.autoPlay !== this.props.autoPlay) {\n if (this.props.autoPlay) {\n this.setupAutoPlay();\n } else {\n this.destroyAutoPlay();\n }\n\n this.setState({\n autoPlay: this.props.autoPlay\n });\n }\n }\n }, {\n key: \"componentWillUnmount\",\n value: function componentWillUnmount() {\n this.destroyCarousel();\n }\n }, {\n key: \"setupCarousel\",\n value: function setupCarousel() {\n var _this2 = this;\n\n this.bindEvents();\n\n if (this.state.autoPlay && _react.Children.count(this.props.children) > 1) {\n this.setupAutoPlay();\n }\n\n if (this.props.autoFocus) {\n this.forceFocus();\n }\n\n this.setState({\n initialized: true\n }, function () {\n var initialImage = _this2.getInitialImage();\n\n if (initialImage && !initialImage.complete) {\n // if it's a carousel of images, we set the mount state after the first image is loaded\n initialImage.addEventListener('load', _this2.setMountState);\n } else {\n _this2.setMountState();\n }\n });\n }\n }, {\n key: \"destroyCarousel\",\n value: function destroyCarousel() {\n if (this.state.initialized) {\n this.unbindEvents();\n this.destroyAutoPlay();\n }\n }\n }, {\n key: \"setupAutoPlay\",\n value: function setupAutoPlay() {\n this.autoPlay();\n var carouselWrapper = this.carouselWrapperRef;\n\n if (this.props.stopOnHover && carouselWrapper) {\n carouselWrapper.addEventListener('mouseenter', this.stopOnHover);\n carouselWrapper.addEventListener('mouseleave', this.startOnLeave);\n }\n }\n }, {\n key: \"destroyAutoPlay\",\n value: function destroyAutoPlay() {\n this.clearAutoPlay();\n var carouselWrapper = this.carouselWrapperRef;\n\n if (this.props.stopOnHover && carouselWrapper) {\n carouselWrapper.removeEventListener('mouseenter', this.stopOnHover);\n carouselWrapper.removeEventListener('mouseleave', this.startOnLeave);\n }\n }\n }, {\n key: \"bindEvents\",\n value: function bindEvents() {\n // as the widths are calculated, we need to resize\n // the carousel when the window is resized\n (0, _window.default)().addEventListener('resize', this.updateSizes); // issue #2 - image loading smaller\n\n (0, _window.default)().addEventListener('DOMContentLoaded', this.updateSizes);\n\n if (this.props.useKeyboardArrows) {\n (0, _document.default)().addEventListener('keydown', this.navigateWithKeyboard);\n }\n }\n }, {\n key: \"unbindEvents\",\n value: function unbindEvents() {\n // removing listeners\n (0, _window.default)().removeEventListener('resize', this.updateSizes);\n (0, _window.default)().removeEventListener('DOMContentLoaded', this.updateSizes);\n var initialImage = this.getInitialImage();\n\n if (initialImage) {\n initialImage.removeEventListener('load', this.setMountState);\n }\n\n if (this.props.useKeyboardArrows) {\n (0, _document.default)().removeEventListener('keydown', this.navigateWithKeyboard);\n }\n }\n }, {\n key: \"forceFocus\",\n value: function forceFocus() {\n var _this$carouselWrapper;\n\n (_this$carouselWrapper = this.carouselWrapperRef) === null || _this$carouselWrapper === void 0 ? void 0 : _this$carouselWrapper.focus();\n }\n }, {\n key: \"renderItems\",\n value: function renderItems(isClone) {\n var _this3 = this;\n\n if (!this.props.children) {\n return [];\n }\n\n return _react.Children.map(this.props.children, function (item, index) {\n var isSelected = index === _this3.state.selectedItem;\n var isPrevious = index === _this3.state.previousItem;\n var style = isSelected && _this3.state.selectedStyle || isPrevious && _this3.state.prevStyle || _this3.state.slideStyle || {};\n\n if (_this3.props.centerMode && _this3.props.axis === 'horizontal') {\n style = _objectSpread(_objectSpread({}, style), {}, {\n minWidth: _this3.props.centerSlidePercentage + '%'\n });\n }\n\n if (_this3.state.swiping && _this3.state.swipeMovementStarted) {\n style = _objectSpread(_objectSpread({}, style), {}, {\n pointerEvents: 'none'\n });\n }\n\n var slideProps = {\n ref: function ref(e) {\n return _this3.setItemsRef(e, index);\n },\n key: 'itemKey' + index + (isClone ? 'clone' : ''),\n className: _cssClasses.default.ITEM(true, index === _this3.state.selectedItem, index === _this3.state.previousItem),\n onClick: _this3.handleClickItem.bind(_this3, index, item),\n style: style\n };\n return /*#__PURE__*/_react.default.createElement(\"li\", slideProps, _this3.props.renderItem(item, {\n isSelected: index === _this3.state.selectedItem,\n isPrevious: index === _this3.state.previousItem\n }));\n });\n }\n }, {\n key: \"renderControls\",\n value: function renderControls() {\n var _this4 = this;\n\n var _this$props = this.props,\n showIndicators = _this$props.showIndicators,\n labels = _this$props.labels,\n renderIndicator = _this$props.renderIndicator,\n children = _this$props.children;\n\n if (!showIndicators) {\n return null;\n }\n\n return /*#__PURE__*/_react.default.createElement(\"ul\", {\n className: \"control-dots\"\n }, _react.Children.map(children, function (_, index) {\n return renderIndicator && renderIndicator(_this4.changeItem(index), index === _this4.state.selectedItem, index, labels.item);\n }));\n }\n }, {\n key: \"renderStatus\",\n value: function renderStatus() {\n if (!this.props.showStatus) {\n return null;\n }\n\n return /*#__PURE__*/_react.default.createElement(\"p\", {\n className: \"carousel-status\"\n }, this.props.statusFormatter(this.state.selectedItem + 1, _react.Children.count(this.props.children)));\n }\n }, {\n key: \"renderThumbs\",\n value: function renderThumbs() {\n if (!this.props.showThumbs || !this.props.children || _react.Children.count(this.props.children) === 0) {\n return null;\n }\n\n return /*#__PURE__*/_react.default.createElement(_Thumbs.default, {\n ref: this.setThumbsRef,\n onSelectItem: this.handleClickThumb,\n selectedItem: this.state.selectedItem,\n transitionTime: this.props.transitionTime,\n thumbWidth: this.props.thumbWidth,\n labels: this.props.labels,\n emulateTouch: this.props.emulateTouch\n }, this.props.renderThumbs(this.props.children));\n }\n }, {\n key: \"render\",\n value: function render() {\n var _this5 = this;\n\n if (!this.props.children || _react.Children.count(this.props.children) === 0) {\n return null;\n }\n\n var isSwipeable = this.props.swipeable && _react.Children.count(this.props.children) > 1;\n var isHorizontal = this.props.axis === 'horizontal';\n var canShowArrows = this.props.showArrows && _react.Children.count(this.props.children) > 1; // show left arrow?\n\n var hasPrev = canShowArrows && (this.state.selectedItem > 0 || this.props.infiniteLoop) || false; // show right arrow\n\n var hasNext = canShowArrows && (this.state.selectedItem < _react.Children.count(this.props.children) - 1 || this.props.infiniteLoop) || false;\n var itemsClone = this.renderItems(true);\n var firstClone = itemsClone.shift();\n var lastClone = itemsClone.pop();\n var swiperProps = {\n className: _cssClasses.default.SLIDER(true, this.state.swiping),\n onSwipeMove: this.onSwipeMove,\n onSwipeStart: this.onSwipeStart,\n onSwipeEnd: this.onSwipeEnd,\n style: this.state.itemListStyle,\n tolerance: this.props.swipeScrollTolerance\n };\n var containerStyles = {};\n\n if (isHorizontal) {\n swiperProps.onSwipeLeft = this.onSwipeForward;\n swiperProps.onSwipeRight = this.onSwipeBackwards;\n\n if (this.props.dynamicHeight) {\n var itemHeight = this.getVariableItemHeight(this.state.selectedItem); // swiperProps.style.height = itemHeight || 'auto';\n\n containerStyles.height = itemHeight || 'auto';\n }\n } else {\n swiperProps.onSwipeUp = this.props.verticalSwipe === 'natural' ? this.onSwipeBackwards : this.onSwipeForward;\n swiperProps.onSwipeDown = this.props.verticalSwipe === 'natural' ? this.onSwipeForward : this.onSwipeBackwards;\n swiperProps.style = _objectSpread(_objectSpread({}, swiperProps.style), {}, {\n height: this.state.itemSize\n });\n containerStyles.height = this.state.itemSize;\n }\n\n return /*#__PURE__*/_react.default.createElement(\"div\", {\n \"aria-label\": this.props.ariaLabel,\n className: _cssClasses.default.ROOT(this.props.className),\n ref: this.setCarouselWrapperRef,\n tabIndex: this.props.useKeyboardArrows ? 0 : undefined\n }, /*#__PURE__*/_react.default.createElement(\"div\", {\n className: _cssClasses.default.CAROUSEL(true),\n style: {\n width: this.props.width\n }\n }, this.renderControls(), this.props.renderArrowPrev(this.onClickPrev, hasPrev, this.props.labels.leftArrow), /*#__PURE__*/_react.default.createElement(\"div\", {\n className: _cssClasses.default.WRAPPER(true, this.props.axis),\n style: containerStyles\n }, isSwipeable ? /*#__PURE__*/_react.default.createElement(_reactEasySwipe.default, _extends({\n tagName: \"ul\",\n innerRef: this.setListRef\n }, swiperProps, {\n allowMouseEvents: this.props.emulateTouch\n }), this.props.infiniteLoop && lastClone, this.renderItems(), this.props.infiniteLoop && firstClone) : /*#__PURE__*/_react.default.createElement(\"ul\", {\n className: _cssClasses.default.SLIDER(true, this.state.swiping),\n ref: function ref(node) {\n return _this5.setListRef(node);\n },\n style: this.state.itemListStyle || {}\n }, this.props.infiniteLoop && lastClone, this.renderItems(), this.props.infiniteLoop && firstClone)), this.props.renderArrowNext(this.onClickNext, hasNext, this.props.labels.rightArrow), this.renderStatus()), this.renderThumbs());\n }\n }]);\n\n return Carousel;\n}(_react.default.Component);\n\nexports.default = Carousel;\n\n_defineProperty(Carousel, \"displayName\", 'Carousel');\n\n_defineProperty(Carousel, \"defaultProps\", {\n ariaLabel: undefined,\n axis: 'horizontal',\n centerSlidePercentage: 80,\n interval: 3000,\n labels: {\n leftArrow: 'previous slide / item',\n rightArrow: 'next slide / item',\n item: 'slide item'\n },\n onClickItem: _utils.noop,\n onClickThumb: _utils.noop,\n onChange: _utils.noop,\n onSwipeStart: function onSwipeStart() {},\n onSwipeEnd: function onSwipeEnd() {},\n onSwipeMove: function onSwipeMove() {\n return false;\n },\n preventMovementUntilSwipeScrollTolerance: false,\n renderArrowPrev: function renderArrowPrev(onClickHandler, hasPrev, label) {\n return /*#__PURE__*/_react.default.createElement(\"button\", {\n type: \"button\",\n \"aria-label\": label,\n className: _cssClasses.default.ARROW_PREV(!hasPrev),\n onClick: onClickHandler\n });\n },\n renderArrowNext: function renderArrowNext(onClickHandler, hasNext, label) {\n return /*#__PURE__*/_react.default.createElement(\"button\", {\n type: \"button\",\n \"aria-label\": label,\n className: _cssClasses.default.ARROW_NEXT(!hasNext),\n onClick: onClickHandler\n });\n },\n renderIndicator: function renderIndicator(onClickHandler, isSelected, index, label) {\n return /*#__PURE__*/_react.default.createElement(\"li\", {\n className: _cssClasses.default.DOT(isSelected),\n onClick: onClickHandler,\n onKeyDown: onClickHandler,\n value: index,\n key: index,\n role: \"button\",\n tabIndex: 0,\n \"aria-label\": \"\".concat(label, \" \").concat(index + 1)\n });\n },\n renderItem: function renderItem(item) {\n return item;\n },\n renderThumbs: function renderThumbs(children) {\n var images = _react.Children.map(children, function (item) {\n var img = item; // if the item is not an image, try to find the first image in the item's children.\n\n if (item.type !== 'img') {\n img = _react.Children.toArray(item.props.children).find(function (children) {\n return children.type === 'img';\n });\n }\n\n if (!img) {\n return undefined;\n }\n\n return img;\n });\n\n if (images.filter(function (image) {\n return image;\n }).length === 0) {\n console.warn(\"No images found! Can't build the thumb list without images. If you don't need thumbs, set showThumbs={false} in the Carousel. Note that it's not possible to get images rendered inside custom components. More info at https://github.com/leandrowd/react-responsive-carousel/blob/master/TROUBLESHOOTING.md\");\n return [];\n }\n\n return images;\n },\n statusFormatter: _utils.defaultStatusFormatter,\n selectedItem: 0,\n showArrows: true,\n showIndicators: true,\n showStatus: true,\n showThumbs: true,\n stopOnHover: true,\n swipeScrollTolerance: 5,\n swipeable: true,\n transitionTime: 350,\n verticalSwipe: 'standard',\n width: '100%',\n animationHandler: 'slide',\n swipeAnimationHandler: _animations.slideSwipeAnimationHandler,\n stopSwipingHandler: _animations.slideStopSwipingHandler\n});","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nObject.defineProperty(exports, \"Carousel\", {\n enumerable: true,\n get: function get() {\n return _Carousel.default;\n }\n});\nObject.defineProperty(exports, \"CarouselProps\", {\n enumerable: true,\n get: function get() {\n return _types.CarouselProps;\n }\n});\nObject.defineProperty(exports, \"Thumbs\", {\n enumerable: true,\n get: function get() {\n return _Thumbs.default;\n }\n});\n\nvar _Carousel = _interopRequireDefault(require(\"./components/Carousel\"));\n\nvar _types = require(\"./components/Carousel/types\");\n\nvar _Thumbs = _interopRequireDefault(require(\"./components/Thumbs\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }","var root = require('./_root');\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nmodule.exports = now;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","var isObject = require('./isObject'),\n now = require('./now'),\n toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nmodule.exports = debounce;\n","import * as React from \"react\";\nimport debounce from \"lodash/debounce.js\";\nimport { deepEqual } from \"./support.js\";\nexport function useEventListener(eventName, handler, element, passive, capture = false) {\n // Create a ref that stores handler\n const savedHandler = React.useRef();\n // Update ref.current value if handler changes.\n // This allows our effect below to always get latest handler ...\n // ... without us needing to pass it in effect deps array ...\n // ... and potentially cause effect to re-run every render.\n savedHandler.current = handler;\n React.useEffect(() => {\n // Make sure element supports addEventListener\n if (element === null || element.addEventListener === undefined)\n return;\n const el = element;\n // Create event listener that calls handler function stored in ref\n const eventListener = (event) => {\n savedHandler.current?.call(el, event);\n };\n el.addEventListener(eventName, eventListener, { passive, capture });\n // Remove event listener on cleanup\n return () => {\n el.removeEventListener(eventName, eventListener, { capture });\n };\n }, [eventName, element, passive, capture] // Re-run if eventName or element changes\n );\n}\nexport function whenDefined(obj, result) {\n return obj === undefined ? undefined : result;\n}\nconst PI = Math.PI;\nexport function degreesToRadians(degrees) {\n return (degrees * PI) / 180;\n}\nexport const getSquareBB = (posX, posY, squareSideLength) => ({\n x1: posX - squareSideLength / 2,\n y1: posY - squareSideLength / 2,\n x2: posX + squareSideLength / 2,\n y2: posY + squareSideLength / 2,\n});\nexport const getSquareXPosFromAlign = (alignment, containerX, containerWidth, horizontalPadding, squareWidth) => {\n switch (alignment) {\n case \"left\":\n return Math.floor(containerX) + horizontalPadding + squareWidth / 2;\n case \"center\":\n return Math.floor(containerX + containerWidth / 2);\n case \"right\":\n return Math.floor(containerX + containerWidth) - horizontalPadding - squareWidth / 2;\n }\n};\nexport const getSquareWidth = (maxSize, containerHeight, verticalPadding) => Math.min(maxSize, containerHeight - verticalPadding * 2);\nexport const pointIsWithinBB = (x, y, bb) => bb.x1 <= x && x <= bb.x2 && bb.y1 <= y && y <= bb.y2;\nexport const EditPencil = (props) => {\n const fg = props.fgColor ?? \"currentColor\";\n return (React.createElement(\"svg\", { viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\" },\n React.createElement(\"path\", { d: \"M12.7073 7.05029C7.87391 11.8837 10.4544 9.30322 6.03024 13.7273C5.77392 13.9836 5.58981 14.3071 5.50189 14.6587L4.52521 18.5655C4.38789 19.1148 4.88543 19.6123 5.43472 19.475L9.34146 18.4983C9.69313 18.4104 10.0143 18.2286 10.2706 17.9722L16.9499 11.2929\", stroke: fg, strokeWidth: \"1.5\", strokeLinecap: \"round\", strokeLinejoin: \"round\", fill: \"none\", vectorEffect: \"non-scaling-stroke\" }),\n React.createElement(\"path\", { d: \"M20.4854 4.92901L19.0712 3.5148C18.2901 2.73375 17.0238 2.73375 16.2428 3.5148L14.475 5.28257C15.5326 7.71912 16.4736 8.6278 18.7176 9.52521L20.4854 7.75744C21.2665 6.97639 21.2665 5.71006 20.4854 4.92901Z\", stroke: fg, strokeWidth: \"1.5\", strokeLinecap: \"round\", strokeLinejoin: \"round\", fill: \"none\", vectorEffect: \"non-scaling-stroke\" })));\n};\nexport const Checkmark = (props) => {\n const fg = props.fgColor ?? \"currentColor\";\n return (React.createElement(\"svg\", { viewBox: \"0 0 24 24\", fill: \"none\", xmlns: \"http://www.w3.org/2000/svg\" },\n React.createElement(\"path\", { d: \"M19 6L10.3802 17L5.34071 11.8758\", vectorEffect: \"non-scaling-stroke\", stroke: fg, strokeWidth: \"1.5\", strokeLinecap: \"round\", strokeLinejoin: \"round\" })));\n};\nexport function useDebouncedMemo(factory, deps, time) {\n const [state, setState] = React.useState(factory);\n const mountedRef = React.useRef(true);\n React.useEffect(() => () => {\n mountedRef.current = false;\n }, []);\n const debouncedSetState = React.useRef(debounce(x => {\n if (mountedRef.current) {\n setState(x);\n }\n }, time));\n React.useLayoutEffect(() => {\n if (mountedRef.current) {\n debouncedSetState.current(() => factory());\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps);\n return state;\n}\n// Shamelessly inline direction to avoid conflicts with 1.0 and 2.0.\nconst rtlRange = \"\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC\";\nconst ltrRange = \"A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\" +\n \"\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF\\u200E\\u2C00-\\uFB1C\" +\n \"\\uFE00-\\uFE6F\\uFEFD-\\uFFFF\";\n/* eslint-disable no-misleading-character-class */\nconst rtl = new RegExp(\"^[^\" + ltrRange + \"]*[\" + rtlRange + \"]\");\n/* eslint-enable no-misleading-character-class */\nexport function direction(value) {\n return rtl.test(value) ? \"rtl\" : \"not-rtl\";\n}\nlet scrollbarWidthCache = undefined;\nexport function getScrollBarWidth() {\n if (typeof document === \"undefined\")\n return 0;\n if (scrollbarWidthCache !== undefined)\n return scrollbarWidthCache;\n const inner = document.createElement(\"p\");\n inner.style.width = \"100%\";\n inner.style.height = \"200px\";\n const outer = document.createElement(\"div\");\n outer.id = \"testScrollbar\";\n outer.style.position = \"absolute\";\n outer.style.top = \"0px\";\n outer.style.left = \"0px\";\n outer.style.visibility = \"hidden\";\n outer.style.width = \"200px\";\n outer.style.height = \"150px\";\n outer.style.overflow = \"hidden\";\n outer.append(inner);\n document.body.append(outer);\n const w1 = inner.offsetWidth;\n outer.style.overflow = \"scroll\";\n let w2 = inner.offsetWidth;\n if (w1 === w2) {\n w2 = outer.clientWidth;\n }\n outer.remove();\n scrollbarWidthCache = w1 - w2;\n return scrollbarWidthCache;\n}\n// Dear future reader,\n// This dumb hook is to make sure if the inputState changes, that effectively behaves like an instant \"setState\" call.\n// This is useful in a wide variety of situations. I'm too dumb to know if this is a good idea or a really dumb one.\n// I can't tell. It's like poes law but for code.\n//\n// I'm sorry.\nconst empty = Symbol();\nexport function useStateWithReactiveInput(inputState) {\n // When [0] is not empty we will return it, [1] is always the last value we saw\n const inputStateRef = React.useRef([empty, inputState]);\n if (inputStateRef.current[1] !== inputState) {\n // it changed, we must use thee!\n inputStateRef.current[0] = inputState;\n }\n inputStateRef.current[1] = inputState;\n const [state, setState] = React.useState(inputState);\n // crimes against humanity here\n const [, forceRender] = React.useState();\n const setStateOuter = React.useCallback(nv => {\n // this takes care of the case where the inputState was set, then setState gets called again but back to what\n // the state was before the inputState changed. Since the useState effect wont trigger a render in this case\n // we need to be very naughty and force it to see the change. Technically this may not be needed some chunk of\n // the time (in fact most of it) but checking for it is likely to be more expensive than just over-doing it\n const s = inputStateRef.current[0];\n if (s !== empty) {\n nv = typeof nv === \"function\" ? nv(s) : nv;\n if (nv === s)\n return; // they are setting it to what the inputState is anyway so we can just do nothing\n }\n if (s !== empty)\n forceRender({});\n setState(pv => {\n if (typeof nv === \"function\") {\n return nv(s === empty ? pv : s);\n }\n return nv;\n });\n inputStateRef.current[0] = empty;\n }, []);\n const onEmpty = React.useCallback(() => {\n inputStateRef.current[0] = empty;\n forceRender({});\n }, []);\n return [inputStateRef.current[0] === empty ? state : inputStateRef.current[0], setStateOuter, onEmpty];\n}\nexport function makeAccessibilityStringForArray(arr) {\n // this is basically just .join(\", \") but checks to make sure it is not going to allocate\n // a string that is so large it might crash the browser\n if (arr.length === 0) {\n return \"\";\n }\n let index = 0;\n let count = 0;\n for (const str of arr) {\n count += str.length;\n if (count > 10000)\n break;\n index++;\n }\n return arr.slice(0, index).join(\", \");\n}\nexport function useDeepMemo(value) {\n const ref = React.useRef(value);\n if (!deepEqual(value, ref.current)) {\n ref.current = value;\n }\n return ref.current;\n}\n//# sourceMappingURL=utils.js.map","import * as React from \"react\";\nimport { ImageOverlayEditorStyle } from \"./image-overlay-editor-style.js\";\nimport { Carousel } from \"react-responsive-carousel\";\nimport { EditPencil } from \"../../../common/utils.js\";\n/** @category Renderers */\nexport const ImageOverlayEditor = p => {\n const { urls, canWrite, onEditClick, renderImage } = p;\n const filtered = urls.filter(u => u !== \"\");\n if (filtered.length === 0) {\n return null;\n }\n const allowMove = filtered.length > 1;\n return (React.createElement(ImageOverlayEditorStyle, { \"data-testid\": \"GDG-default-image-overlay-editor\" },\n React.createElement(Carousel, { showArrows: allowMove, showThumbs: false, swipeable: allowMove, emulateTouch: allowMove, infiniteLoop: allowMove }, filtered.map(url => {\n const innerContent = renderImage?.(url) ?? React.createElement(\"img\", { draggable: false, src: url });\n return (React.createElement(\"div\", { className: \"gdg-centering-container\", key: url }, innerContent));\n })),\n canWrite && onEditClick && (React.createElement(\"button\", { className: \"gdg-edit-icon\", onClick: onEditClick },\n React.createElement(EditPencil, null)))));\n};\n//# sourceMappingURL=image-overlay-editor.js.map","import { styled } from \"@linaria/react\";\nexport const MarkdownContainer = /*#__PURE__*/styled('div')({\n name: \"MarkdownContainer\",\n class: \"gdg-mnuv029\",\n propsAsIs: false\n});\n\n","import React from \"react\";\nimport { marked } from \"marked\";\nimport { MarkdownContainer } from \"./private/markdown-container.js\";\n/** @category Renderers */\nexport default class MarkdownDiv extends React.PureComponent {\n targetElement = null;\n renderMarkdownIntoDiv() {\n const { targetElement, props } = this;\n if (targetElement === null)\n return;\n const { contents, createNode } = props;\n const innerHTML = marked(contents);\n const childRange = document.createRange();\n childRange.selectNodeContents(targetElement);\n childRange.deleteContents();\n let newChild = createNode?.(innerHTML);\n if (newChild === undefined) {\n const childDoc = document.createElement(\"template\");\n childDoc.innerHTML = innerHTML;\n newChild = childDoc.content;\n }\n targetElement.append(newChild);\n const tags = targetElement.getElementsByTagName(\"a\");\n for (const tag of tags) {\n tag.target = \"_blank\";\n tag.rel = \"noreferrer noopener\";\n }\n }\n containerRefHook = (element) => {\n this.targetElement = element;\n this.renderMarkdownIntoDiv();\n };\n render() {\n // Doing this in the ref hook works great when we first render, but never again.\n // This only works great after the first render, but not in the first render.\n // Putting the two together makes the full solution.\n this.renderMarkdownIntoDiv();\n return React.createElement(MarkdownContainer, { ref: this.containerRefHook });\n }\n}\n//# sourceMappingURL=markdown-div.js.map","import { styled } from \"@linaria/react\";\nexport const InputBox = /*#__PURE__*/styled('textarea')({\n name: \"InputBox\",\n class: \"gdg-izpuzkl\",\n propsAsIs: false\n});\nexport const ShadowBox = /*#__PURE__*/styled('div')({\n name: \"ShadowBox\",\n class: \"gdg-s69h75o\",\n propsAsIs: false\n});\nexport const GrowingEntryStyle = /*#__PURE__*/styled('div')({\n name: \"GrowingEntryStyle\",\n class: \"gdg-g1y0xocz\",\n propsAsIs: false\n});\n\n","import * as React from \"react\";\nimport { GrowingEntryStyle, ShadowBox, InputBox } from \"./growing-entry-style.js\";\nimport { assert } from \"../../common/support.js\";\nlet globalInputID = 0;\n/** @category Renderers */\nexport const GrowingEntry = (props) => {\n const { placeholder, value, onKeyDown, highlight, altNewline, validatedSelection, ...rest } = props;\n const { onChange, className } = rest;\n const inputRef = React.useRef(null);\n const useText = value ?? \"\";\n assert(onChange !== undefined, \"GrowingEntry must be a controlled input area\");\n // 10 million id's aught to be enough for anybody\n const [inputID] = React.useState(() => \"input-box-\" + (globalInputID = (globalInputID + 1) % 10000000));\n React.useEffect(() => {\n const ta = inputRef.current;\n if (ta === null)\n return;\n if (ta.disabled)\n return;\n const length = useText.toString().length;\n ta.focus();\n ta.setSelectionRange(highlight ? 0 : length, length);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n React.useLayoutEffect(() => {\n if (validatedSelection !== undefined) {\n const range = typeof validatedSelection === \"number\" ? [validatedSelection, null] : validatedSelection;\n inputRef.current?.setSelectionRange(range[0], range[1]);\n }\n }, [validatedSelection]);\n const onKeyDownInner = React.useCallback(e => {\n if (e.key === \"Enter\" && e.shiftKey && altNewline === true) {\n return;\n }\n onKeyDown?.(e);\n }, [altNewline, onKeyDown]);\n return (React.createElement(GrowingEntryStyle, { className: \"gdg-growing-entry\" },\n React.createElement(ShadowBox, { className: className }, useText + \"\\n\"),\n React.createElement(InputBox, { ...rest, className: (className ?? \"\") + \" gdg-input\", id: inputID, ref: inputRef, onKeyDown: onKeyDownInner, value: useText, placeholder: placeholder, dir: \"auto\" })));\n};\n//# sourceMappingURL=growing-entry.js.map","\"use strict\";var d=new Map,b=new Map,z=new Map;function v(){d.clear(),z.clear(),b.clear()}function w(l,s,e,c,t){var n,r,o;let f=0,a={};for(let i of l)f+=(n=e.get(i))!=null?n:t,a[i]=((r=a[i])!=null?r:0)+1;let g=s-f;for(let i of Object.keys(a)){let m=a[i],u=(o=e.get(i))!=null?o:t,h=u*m/f,M=g*h*c/m,C=u+M;e.set(i,C)}}function R(l,s){var n;let e=new Map,c=0;for(let r of\"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890,.-+=?\"){let o=l.measureText(r).width;e.set(r,o),c+=o}let t=c/e.size,f=3,a=(s/t+f)/(f+1),g=e.keys();for(let r of g)e.set(r,((n=e.get(r))!=null?n:t)*a);return e}function p(l,s,e,c){var g,n;let t=b.get(e);if(c&&t!==void 0&&t.count>2e4){let r=z.get(e);if(r===void 0&&(r=R(l,t.size),z.set(e,r)),t.count>5e5){let i=0;for(let m of s)i+=(g=r.get(m))!=null?g:t.size;return i*1.01}let o=l.measureText(s);return w(s,o.width,r,Math.max(.05,1-t.count/2e5),t.size),b.set(e,{count:t.count+s.length,size:t.size}),o.width}let f=l.measureText(s),a=f.width/s.length;if(((n=t==null?void 0:t.count)!=null?n:0)>2e4)return f.width;if(t===void 0)b.set(e,{count:s.length,size:a});else{let r=a-t.size,o=s.length/(t.count+s.length),i=t.size+r*o;b.set(e,{count:t.count+s.length,size:i})}return f.width}function T(l,s,e,c,t,f,a,g){if(s.length<=1)return s.length;if(t<e)return-1;let n=Math.floor(e/t*f),r=p(l,s.slice(0,Math.max(0,n)),c,a),o=g==null?void 0:g(s);if(r!==e)if(r<e){for(;r<e;)n++,r=p(l,s.slice(0,Math.max(0,n)),c,a);n--}else for(;r>e;){let i=o!==void 0?0:s.lastIndexOf(\" \",n-1);i>0?n=i:n--,r=p(l,s.slice(0,Math.max(0,n)),c,a)}if(s[n]!==\" \"){let i=0;if(o===void 0)i=s.lastIndexOf(\" \",n);else for(let m of o){if(m>n)break;i=m}i>0&&(n=i)}return n}function _(l,s,e,c,t,f){let a=`${s}_${e}_${c}px`,g=d.get(a);if(g!==void 0)return g;if(c<=0)return[];let n=[],r=s.split(`\n`),o=b.get(e),i=o===void 0?s.length:c/o.size*1.5,m=t&&o!==void 0&&o.count>2e4;for(let u of r){let h=p(l,u.slice(0,Math.max(0,i)),e,m),M=Math.min(u.length,i);if(h<=c)n.push(u);else{for(;h>c;){let C=T(l,u,c,e,h,M,m,f),k=u.slice(0,Math.max(0,C));u=u.slice(k.length),n.push(k),h=p(l,u.slice(0,Math.max(0,i)),e,m),M=Math.min(u.length,i)}h>0&&n.push(u)}}return n=n.map((u,h)=>h===0?u.trimEnd():u.trim()),d.set(a,n),d.size>500&&d.delete(d.keys().next().value),n}export{v as clearCache,_ as split};\n//# sourceMappingURL=index.js.map\n","import {} from \"../data-grid-types.js\";\nimport { direction } from \"../../../common/utils.js\";\nimport React from \"react\";\nimport { split as splitText, clearCache } from \"canvas-hypertxt\";\nexport function useMappedColumns(columns, freezeColumns) {\n return React.useMemo(() => columns.map((c, i) => ({\n group: c.group,\n grow: c.grow,\n hasMenu: c.hasMenu,\n icon: c.icon,\n id: c.id,\n menuIcon: c.menuIcon,\n overlayIcon: c.overlayIcon,\n sourceIndex: i,\n sticky: i < freezeColumns,\n style: c.style,\n themeOverride: c.themeOverride,\n title: c.title,\n trailingRowOptions: c.trailingRowOptions,\n width: c.width,\n growOffset: c.growOffset,\n rowMarker: c.rowMarker,\n rowMarkerChecked: c.rowMarkerChecked,\n })), [columns, freezeColumns]);\n}\nexport function gridSelectionHasItem(sel, item) {\n const [col, row] = item;\n if (sel.columns.hasIndex(col) || sel.rows.hasIndex(row))\n return true;\n if (sel.current !== undefined) {\n if (itemsAreEqual(sel.current.cell, item))\n return true;\n const toCheck = [sel.current.range, ...sel.current.rangeStack]; // FIXME: pointless alloc\n for (const r of toCheck) {\n // dont we have a function for this?\n if (col >= r.x && col < r.x + r.width && row >= r.y && row < r.y + r.height)\n return true;\n }\n }\n return false;\n}\nexport function isGroupEqual(left, right) {\n return (left ?? \"\") === (right ?? \"\");\n}\nexport function cellIsSelected(location, cell, selection) {\n if (selection.current === undefined)\n return false;\n if (location[1] !== selection.current.cell[1])\n return false;\n if (cell.span === undefined) {\n return selection.current.cell[0] === location[0];\n }\n return selection.current.cell[0] >= cell.span[0] && selection.current.cell[0] <= cell.span[1];\n}\nexport function itemIsInRect(location, rect) {\n const [x, y] = location;\n return x >= rect.x && x < rect.x + rect.width && y >= rect.y && y < rect.y + rect.height;\n}\nexport function itemsAreEqual(a, b) {\n return a?.[0] === b?.[0] && a?.[1] === b?.[1];\n}\nexport function rectBottomRight(rect) {\n return [rect.x + rect.width - 1, rect.y + rect.height - 1];\n}\nfunction cellIsInRect(location, cell, rect) {\n const startX = rect.x;\n const endX = rect.x + rect.width - 1;\n const startY = rect.y;\n const endY = rect.y + rect.height - 1;\n const [cellCol, cellRow] = location;\n if (cellRow < startY || cellRow > endY)\n return false;\n if (cell.span === undefined) {\n return cellCol >= startX && cellCol <= endX;\n }\n const [spanStart, spanEnd] = cell.span;\n return ((spanStart >= startX && spanStart <= endX) ||\n (spanEnd >= startX && spanStart <= endX) ||\n (spanStart < startX && spanEnd > endX));\n}\nexport function cellIsInRange(location, cell, selection, includeSingleSelection) {\n let result = 0;\n if (selection.current === undefined)\n return result;\n const range = selection.current.range;\n if ((includeSingleSelection || range.height * range.width > 1) && cellIsInRect(location, cell, range)) {\n result++;\n }\n for (const r of selection.current.rangeStack) {\n if (cellIsInRect(location, cell, r)) {\n result++;\n }\n }\n return result;\n}\nexport function remapForDnDState(columns, dndState) {\n let mappedCols = columns;\n if (dndState !== undefined) {\n let writable = [...columns];\n const temp = mappedCols[dndState.src];\n if (dndState.src > dndState.dest) {\n writable.splice(dndState.src, 1);\n writable.splice(dndState.dest, 0, temp);\n }\n else {\n writable.splice(dndState.dest + 1, 0, temp);\n writable.splice(dndState.src, 1);\n }\n writable = writable.map((c, i) => ({\n ...c,\n sticky: columns[i].sticky,\n }));\n mappedCols = writable;\n }\n return mappedCols;\n}\nexport function getStickyWidth(columns, dndState) {\n let result = 0;\n const remapped = remapForDnDState(columns, dndState);\n for (let i = 0; i < remapped.length; i++) {\n const c = remapped[i];\n if (c.sticky)\n result += c.width;\n else\n break;\n }\n return result;\n}\nexport function getFreezeTrailingHeight(rows, freezeTrailingRows, getRowHeight) {\n if (typeof getRowHeight === \"number\") {\n return freezeTrailingRows * getRowHeight;\n }\n else {\n let result = 0;\n for (let i = rows - freezeTrailingRows; i < rows; i++) {\n result += getRowHeight(i);\n }\n return result;\n }\n}\nexport function getEffectiveColumns(columns, cellXOffset, width, dndState, tx) {\n const mappedCols = remapForDnDState(columns, dndState);\n const sticky = [];\n for (const c of mappedCols) {\n if (c.sticky) {\n sticky.push(c);\n }\n else {\n break;\n }\n }\n if (sticky.length > 0) {\n for (const c of sticky) {\n width -= c.width;\n }\n }\n let endIndex = cellXOffset;\n let curX = tx ?? 0;\n while (curX <= width && endIndex < mappedCols.length) {\n curX += mappedCols[endIndex].width;\n endIndex++;\n }\n for (let i = cellXOffset; i < endIndex; i++) {\n const c = mappedCols[i];\n if (!c.sticky) {\n sticky.push(c);\n }\n }\n return sticky;\n}\nexport function getColumnIndexForX(targetX, effectiveColumns, translateX) {\n let x = 0;\n for (const c of effectiveColumns) {\n const cx = c.sticky ? x : x + (translateX ?? 0);\n if (targetX <= cx + c.width) {\n return c.sourceIndex;\n }\n x += c.width;\n }\n return -1;\n}\nexport function getRowIndexForY(targetY, height, hasGroups, headerHeight, groupHeaderHeight, rows, rowHeight, cellYOffset, translateY, freezeTrailingRows) {\n const totalHeaderHeight = headerHeight + groupHeaderHeight;\n if (hasGroups && targetY <= groupHeaderHeight)\n return -2;\n if (targetY <= totalHeaderHeight)\n return -1;\n let y = height;\n for (let fr = 0; fr < freezeTrailingRows; fr++) {\n const row = rows - 1 - fr;\n const rh = typeof rowHeight === \"number\" ? rowHeight : rowHeight(row);\n y -= rh;\n if (targetY >= y) {\n return row;\n }\n }\n const effectiveRows = rows - freezeTrailingRows;\n const ty = targetY - (translateY ?? 0);\n if (typeof rowHeight === \"number\") {\n const target = Math.floor((ty - totalHeaderHeight) / rowHeight) + cellYOffset;\n if (target >= effectiveRows)\n return undefined;\n return target;\n }\n else {\n let curY = totalHeaderHeight;\n for (let i = cellYOffset; i < effectiveRows; i++) {\n const rh = rowHeight(i);\n if (ty <= curY + rh)\n return i;\n curY += rh;\n }\n return undefined;\n }\n}\nlet metricsSize = 0;\nlet metricsCache = {};\nconst isSSR = typeof window === \"undefined\";\nasync function clearCacheOnLoad() {\n if (isSSR || document?.fonts?.ready === undefined)\n return;\n await document.fonts.ready;\n metricsSize = 0;\n metricsCache = {};\n clearCache();\n}\nvoid clearCacheOnLoad();\nfunction makeCacheKey(s, ctx, baseline, font) {\n return `${s}_${font ?? ctx?.font}_${baseline}`;\n}\n/** @category Drawing */\nexport function measureTextCached(s, ctx, font, baseline = \"middle\") {\n const key = makeCacheKey(s, ctx, baseline, font);\n let metrics = metricsCache[key];\n if (metrics === undefined) {\n metrics = ctx.measureText(s);\n metricsCache[key] = metrics;\n metricsSize++;\n }\n if (metricsSize > 10000) {\n metricsCache = {};\n metricsSize = 0;\n }\n return metrics;\n}\nexport function getMeasuredTextCache(s, font) {\n const key = makeCacheKey(s, undefined, \"middle\", font);\n return metricsCache[key];\n}\n/** @category Drawing */\nexport function getMiddleCenterBias(ctx, font) {\n if (typeof font !== \"string\") {\n font = font.baseFontFull;\n }\n return getMiddleCenterBiasInner(ctx, font);\n}\nfunction loadMetric(ctx, baseline) {\n const sample = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n ctx.save();\n ctx.textBaseline = baseline;\n const result = ctx.measureText(sample);\n ctx.restore();\n return result;\n}\nconst biasCache = [];\nfunction getMiddleCenterBiasInner(ctx, font) {\n for (const x of biasCache) {\n if (x.key === font)\n return x.val;\n }\n const alphabeticMetrics = loadMetric(ctx, \"alphabetic\");\n const middleMetrics = loadMetric(ctx, \"middle\");\n const bias = -(middleMetrics.actualBoundingBoxDescent - alphabeticMetrics.actualBoundingBoxDescent) +\n alphabeticMetrics.actualBoundingBoxAscent / 2;\n biasCache.push({\n key: font,\n val: bias,\n });\n return bias;\n}\nexport function drawLastUpdateUnderlay(args, lastUpdate, frameTime, lastPrep, isLastCol, isLastRow) {\n const { ctx, rect, theme } = args;\n let progress = Number.MAX_SAFE_INTEGER;\n const animTime = 500;\n if (lastUpdate !== undefined) {\n progress = frameTime - lastUpdate;\n if (progress < animTime) {\n const fade = 1 - progress / animTime;\n ctx.globalAlpha = fade;\n ctx.fillStyle = theme.bgSearchResult;\n ctx.fillRect(rect.x + 1, rect.y + 1, rect.width - (isLastCol ? 2 : 1), rect.height - (isLastRow ? 2 : 1));\n ctx.globalAlpha = 1;\n if (lastPrep !== undefined) {\n lastPrep.fillStyle = theme.bgSearchResult;\n }\n }\n }\n return progress < animTime;\n}\nexport function prepTextCell(args, lastPrep, overrideColor) {\n const { ctx, theme } = args;\n const result = lastPrep ?? {};\n const newFill = overrideColor ?? theme.textDark;\n if (newFill !== result.fillStyle) {\n ctx.fillStyle = newFill;\n result.fillStyle = newFill;\n }\n return result;\n}\n/** @category Drawing */\nexport function drawTextCellExternal(args, data, contentAlign) {\n const { rect, ctx, theme } = args;\n ctx.fillStyle = theme.textDark;\n drawTextCell({\n ctx: ctx,\n rect,\n theme: theme,\n }, data, contentAlign);\n}\nfunction drawSingleTextLine(ctx, data, x, y, w, h, bias, theme, contentAlign) {\n if (contentAlign === \"right\") {\n ctx.fillText(data, x + w - (theme.cellHorizontalPadding + 0.5), y + h / 2 + bias);\n }\n else if (contentAlign === \"center\") {\n ctx.fillText(data, x + w / 2, y + h / 2 + bias);\n }\n else {\n ctx.fillText(data, x + theme.cellHorizontalPadding + 0.5, y + h / 2 + bias);\n }\n}\nexport function getEmHeight(ctx, fontStyle) {\n const textMetrics = measureTextCached(\"ABCi09jgqpy\", ctx, fontStyle); // do not question the magic string\n return textMetrics.actualBoundingBoxAscent + textMetrics.actualBoundingBoxDescent;\n}\nfunction truncateString(data, w) {\n if (data.includes(\"\\n\")) {\n // new lines are rare and split is relatively expensive compared to the search\n // it pays off to not do the split contantly. More accurately... it pays off not to run the regex.\n // what even is the point of this? So what if there is a /r at the end of a line? It wont be drawn anyway.\n data = data.split(/\\r?\\n/, 1)[0];\n }\n const max = w / 4; // no need to round, slice will just truncate this\n if (data.length > max) {\n data = data.slice(0, max);\n }\n return data;\n}\nfunction drawMultiLineText(ctx, data, x, y, w, h, bias, theme, contentAlign, hyperWrapping) {\n const fontStyle = theme.baseFontFull;\n const split = splitText(ctx, data, fontStyle, w - theme.cellHorizontalPadding * 2, hyperWrapping ?? false);\n const emHeight = getEmHeight(ctx, fontStyle);\n const lineHeight = theme.lineHeight * emHeight;\n const actualHeight = emHeight + lineHeight * (split.length - 1);\n const mustClip = actualHeight + theme.cellVerticalPadding > h;\n if (mustClip) {\n // well now we have to clip because we might render outside the cell vertically\n ctx.save();\n ctx.rect(x, y, w, h);\n ctx.clip();\n }\n const optimalY = y + h / 2 - actualHeight / 2;\n let drawY = Math.max(y + theme.cellVerticalPadding, optimalY);\n for (const line of split) {\n drawSingleTextLine(ctx, line, x, drawY, w, emHeight, bias, theme, contentAlign);\n drawY += lineHeight;\n if (drawY > y + h)\n break;\n }\n if (mustClip) {\n ctx.restore();\n }\n}\n/** @category Drawing */\nexport function drawTextCell(args, data, contentAlign, allowWrapping, hyperWrapping) {\n const { ctx, rect, theme } = args;\n const { x, y, width: w, height: h } = rect;\n allowWrapping = allowWrapping ?? false;\n if (!allowWrapping) {\n data = truncateString(data, w);\n }\n const bias = getMiddleCenterBias(ctx, theme);\n const isRtl = direction(data) === \"rtl\";\n if (contentAlign === undefined && isRtl) {\n contentAlign = \"right\";\n }\n if (isRtl) {\n ctx.direction = \"rtl\";\n }\n if (data.length > 0) {\n let changed = false;\n if (contentAlign === \"right\") {\n // Use right alignment as default for RTL text\n ctx.textAlign = \"right\";\n changed = true;\n }\n else if (contentAlign !== undefined && contentAlign !== \"left\") {\n // Since default is start (=left), only apply if alignment is center or right\n ctx.textAlign = contentAlign;\n changed = true;\n }\n if (!allowWrapping) {\n drawSingleTextLine(ctx, data, x, y, w, h, bias, theme, contentAlign);\n }\n else {\n drawMultiLineText(ctx, data, x, y, w, h, bias, theme, contentAlign, hyperWrapping);\n }\n if (changed) {\n // Reset alignment to default\n ctx.textAlign = \"start\";\n }\n if (isRtl) {\n ctx.direction = \"inherit\";\n }\n }\n}\nexport function roundedRect(ctx, x, y, width, height, radius) {\n if (typeof radius === \"number\") {\n radius = { tl: radius, tr: radius, br: radius, bl: radius };\n }\n // restrict radius to a reasonable max\n radius = {\n tl: Math.max(0, Math.min(radius.tl, height / 2, width / 2)),\n tr: Math.max(0, Math.min(radius.tr, height / 2, width / 2)),\n bl: Math.max(0, Math.min(radius.bl, height / 2, width / 2)),\n br: Math.max(0, Math.min(radius.br, height / 2, width / 2)),\n };\n ctx.moveTo(x + radius.tl, y);\n ctx.arcTo(x + width, y, x + width, y + radius.tr, radius.tr);\n ctx.arcTo(x + width, y + height, x + width - radius.br, y + height, radius.br);\n ctx.arcTo(x, y + height, x, y + height - radius.bl, radius.bl);\n ctx.arcTo(x, y, x + radius.tl, y, radius.tl);\n}\nexport function drawMenuDots(ctx, dotsX, dotsY) {\n const radius = 1.25;\n ctx.arc(dotsX, dotsY - radius * 3.5, radius, 0, 2 * Math.PI, false);\n ctx.arc(dotsX, dotsY, radius, 0, 2 * Math.PI, false);\n ctx.arc(dotsX, dotsY + radius * 3.5, radius, 0, 2 * Math.PI, false);\n}\nexport function roundedPoly(ctx, points, radiusAll) {\n // convert 2 points into vector form, polar form, and normalised\n const asVec = function (p, pp) {\n const vx = pp.x - p.x;\n const vy = pp.y - p.y;\n const vlen = Math.sqrt(vx * vx + vy * vy);\n const vnx = vx / vlen;\n const vny = vy / vlen;\n return {\n x: vx,\n y: pp.y - p.y,\n len: vlen,\n nx: vnx,\n ny: vny,\n ang: Math.atan2(vny, vnx),\n };\n };\n let radius;\n // const v1: Vector = {} as any;\n // const v2: Vector = {} as any;\n const len = points.length;\n let p1 = points[len - 1];\n // for each point\n for (let i = 0; i < len; i++) {\n let p2 = points[i % len];\n const p3 = points[(i + 1) % len];\n //-----------------------------------------\n // Part 1\n const v1 = asVec(p2, p1);\n const v2 = asVec(p2, p3);\n const sinA = v1.nx * v2.ny - v1.ny * v2.nx;\n const sinA90 = v1.nx * v2.nx - v1.ny * -v2.ny;\n let angle = Math.asin(sinA < -1 ? -1 : sinA > 1 ? 1 : sinA);\n //-----------------------------------------\n let radDirection = 1;\n let drawDirection = false;\n if (sinA90 < 0) {\n if (angle < 0) {\n angle = Math.PI + angle;\n }\n else {\n angle = Math.PI - angle;\n radDirection = -1;\n drawDirection = true;\n }\n }\n else {\n if (angle > 0) {\n radDirection = -1;\n drawDirection = true;\n }\n }\n radius = p2.radius !== undefined ? p2.radius : radiusAll;\n //-----------------------------------------\n // Part 2\n const halfAngle = angle / 2;\n //-----------------------------------------\n //-----------------------------------------\n // Part 3\n let lenOut = Math.abs((Math.cos(halfAngle) * radius) / Math.sin(halfAngle));\n //-----------------------------------------\n //-----------------------------------------\n // Special part A\n let cRadius;\n if (lenOut > Math.min(v1.len / 2, v2.len / 2)) {\n lenOut = Math.min(v1.len / 2, v2.len / 2);\n cRadius = Math.abs((lenOut * Math.sin(halfAngle)) / Math.cos(halfAngle));\n }\n else {\n cRadius = radius;\n }\n //-----------------------------------------\n // Part 4\n let x = p2.x + v2.nx * lenOut;\n let y = p2.y + v2.ny * lenOut;\n //-----------------------------------------\n // Part 5\n x += -v2.ny * cRadius * radDirection;\n y += v2.nx * cRadius * radDirection;\n //-----------------------------------------\n // Part 6\n ctx.arc(x, y, cRadius, v1.ang + (Math.PI / 2) * radDirection, v2.ang - (Math.PI / 2) * radDirection, drawDirection);\n //-----------------------------------------\n p1 = p2;\n p2 = p3;\n }\n ctx.closePath();\n}\nexport function computeBounds(col, row, width, height, groupHeaderHeight, totalHeaderHeight, cellXOffset, cellYOffset, translateX, translateY, rows, freezeColumns, freezeTrailingRows, mappedColumns, rowHeight) {\n const result = {\n x: 0,\n y: totalHeaderHeight + translateY,\n width: 0,\n height: 0,\n };\n if (col >= mappedColumns.length || row >= rows || row < -2 || col < 0) {\n return result;\n }\n const headerHeight = totalHeaderHeight - groupHeaderHeight;\n if (col >= freezeColumns) {\n const dir = cellXOffset > col ? -1 : 1;\n const freezeWidth = getStickyWidth(mappedColumns);\n result.x += freezeWidth + translateX;\n for (let i = cellXOffset; i !== col; i += dir) {\n result.x += mappedColumns[dir === 1 ? i : i - 1].width * dir;\n }\n }\n else {\n for (let i = 0; i < col; i++) {\n result.x += mappedColumns[i].width;\n }\n }\n result.width = mappedColumns[col].width + 1;\n if (row === -1) {\n result.y = groupHeaderHeight;\n result.height = headerHeight;\n }\n else if (row === -2) {\n result.y = 0;\n result.height = groupHeaderHeight;\n let start = col;\n const group = mappedColumns[col].group;\n const sticky = mappedColumns[col].sticky;\n while (start > 0 &&\n isGroupEqual(mappedColumns[start - 1].group, group) &&\n mappedColumns[start - 1].sticky === sticky) {\n const c = mappedColumns[start - 1];\n result.x -= c.width;\n result.width += c.width;\n start--;\n }\n let end = col;\n while (end + 1 < mappedColumns.length &&\n isGroupEqual(mappedColumns[end + 1].group, group) &&\n mappedColumns[end + 1].sticky === sticky) {\n const c = mappedColumns[end + 1];\n result.width += c.width;\n end++;\n }\n if (!sticky) {\n const freezeWidth = getStickyWidth(mappedColumns);\n const clip = result.x - freezeWidth;\n if (clip < 0) {\n result.x -= clip;\n result.width += clip;\n }\n if (result.x + result.width > width) {\n result.width = width - result.x;\n }\n }\n }\n else if (row >= rows - freezeTrailingRows) {\n let dy = rows - row;\n result.y = height;\n while (dy > 0) {\n const r = row + dy - 1;\n result.height = typeof rowHeight === \"number\" ? rowHeight : rowHeight(r);\n result.y -= result.height;\n dy--;\n }\n result.height += 1;\n }\n else {\n const dir = cellYOffset > row ? -1 : 1;\n if (typeof rowHeight === \"number\") {\n const delta = row - cellYOffset;\n result.y += delta * rowHeight;\n }\n else {\n for (let r = cellYOffset; r !== row; r += dir) {\n result.y += rowHeight(r) * dir;\n }\n }\n result.height = (typeof rowHeight === \"number\" ? rowHeight : rowHeight(row)) + 1;\n }\n return result;\n}\n//# sourceMappingURL=data-grid-lib.js.map","import { deepEqual } from \"./support.js\";\n// max safe int 2^53 - 1 (minus 1 omitted from here on)\n// max safe columns is 2^21 or 2,097,151\n// max safe rows is 2^32 or 4,294,967,295\n// If 3 rows render as an inch, then the max safe height is 1,431,655,765 inches or 22,426,868 miles\n// the distance to the moon is 238,900 miles, so this would give you a data grid that goes to the moon and back 94 times\n// seems fine\nconst rowShift = 1 << 21;\nexport function packColRowToNumber(col, row) {\n return (row + 2) * rowShift + col;\n}\nexport function unpackCol(packed) {\n return packed % rowShift;\n}\nexport function unpackRow(packed) {\n return Math.floor(packed / rowShift) - 2;\n}\nexport function unpackNumberToColRow(packed) {\n const col = unpackCol(packed);\n const row = unpackRow(packed);\n return [col, row];\n}\nexport class WindowingTrackerBase {\n visibleWindow = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n };\n freezeCols = 0;\n freezeRows = [];\n isInWindow = (packed) => {\n const col = unpackCol(packed);\n const row = unpackRow(packed);\n const w = this.visibleWindow;\n const colInWindow = (col >= w.x && col <= w.x + w.width) || col < this.freezeCols;\n const rowInWindow = (row >= w.y && row <= w.y + w.height) || this.freezeRows.includes(row);\n return colInWindow && rowInWindow;\n };\n setWindow(newWindow, freezeCols, freezeRows) {\n if (this.visibleWindow.x === newWindow.x &&\n this.visibleWindow.y === newWindow.y &&\n this.visibleWindow.width === newWindow.width &&\n this.visibleWindow.height === newWindow.height &&\n this.freezeCols === freezeCols &&\n deepEqual(this.freezeRows, freezeRows))\n return;\n this.visibleWindow = newWindow;\n this.freezeCols = freezeCols;\n this.freezeRows = freezeRows;\n this.clearOutOfWindow();\n }\n}\nexport class RenderStateProvider extends WindowingTrackerBase {\n cache = new Map();\n setValue = (location, state) => {\n this.cache.set(packColRowToNumber(location[0], location[1]), state);\n };\n getValue = (location) => {\n return this.cache.get(packColRowToNumber(location[0], location[1]));\n };\n clearOutOfWindow = () => {\n for (const [key] of this.cache.entries()) {\n if (!this.isInWindow(key)) {\n this.cache.delete(key);\n }\n }\n };\n}\n//# sourceMappingURL=render-state-provider.js.map","import { packColRowToNumber, unpackNumberToColRow, unpackRow } from \"../../common/render-state-provider.js\";\nexport class CellSet {\n cells;\n constructor(items = []) {\n this.cells = new Set(items.map(x => packColRowToNumber(x[0], x[1])));\n }\n add(cell) {\n this.cells.add(packColRowToNumber(cell[0], cell[1]));\n }\n has(cell) {\n if (cell === undefined)\n return false;\n return this.cells.has(packColRowToNumber(cell[0], cell[1]));\n }\n remove(cell) {\n this.cells.delete(packColRowToNumber(cell[0], cell[1]));\n }\n clear() {\n this.cells.clear();\n }\n get size() {\n return this.cells.size;\n }\n hasHeader() {\n for (const cellNumber of this.cells) {\n const row = unpackRow(cellNumber);\n if (row < 0)\n return true;\n }\n return false;\n }\n hasItemInRectangle(rect) {\n for (let row = rect.y; row < rect.y + rect.height; row++) {\n for (let col = rect.x; col < rect.x + rect.width; col++) {\n if (this.cells.has(packColRowToNumber(col, row))) {\n return true;\n }\n }\n }\n return false;\n }\n hasItemInRegion(rect) {\n for (const r of rect) {\n if (this.hasItemInRectangle(r)) {\n return true;\n }\n }\n return false;\n }\n *values() {\n for (const cellNumber of this.cells) {\n yield unpackNumberToColRow(cellNumber);\n }\n }\n}\n//# sourceMappingURL=cell-set.js.map","import * as React from \"react\";\nimport { isSizedGridColumn, resolveCellsThunk, } from \"../internal/data-grid/data-grid-types.js\";\nconst defaultSize = 150;\nfunction measureCell(ctx, cell, theme, getCellRenderer) {\n const r = getCellRenderer(cell);\n return r?.measure?.(ctx, cell, theme) ?? defaultSize;\n}\nexport function measureColumn(ctx, theme, c, colIndex, selectedData, minColumnWidth, maxColumnWidth, removeOutliers, getCellRenderer) {\n let max = 0;\n const sizes = selectedData === undefined\n ? []\n : selectedData.map(row => {\n const r = measureCell(ctx, row[colIndex], theme, getCellRenderer);\n max = Math.max(max, r);\n return r;\n });\n if (sizes.length > 5 && removeOutliers) {\n max = 0;\n // Filter out outliers\n let sum = 0;\n for (const size of sizes) {\n sum += size;\n }\n const average = sum / sizes.length;\n // Set sizes that are considered outliers to zero\n for (let i = 0; i < sizes.length; i++) {\n if (sizes[i] >= average * 2) {\n sizes[i] = 0;\n }\n else {\n max = Math.max(max, sizes[i]);\n }\n }\n }\n max = Math.max(max, ctx.measureText(c.title).width + 16 + (c.icon === undefined ? 0 : 28));\n const final = Math.max(Math.ceil(minColumnWidth), Math.min(Math.floor(maxColumnWidth), Math.ceil(max)));\n return {\n ...c,\n width: final,\n };\n}\n/** @category Hooks */\nexport function useColumnSizer(columns, rows, getCellsForSelection, clientWidth, minColumnWidth, maxColumnWidth, theme, getCellRenderer, abortController) {\n const rowsRef = React.useRef(rows);\n const getCellsForSelectionRef = React.useRef(getCellsForSelection);\n const themeRef = React.useRef(theme);\n rowsRef.current = rows;\n getCellsForSelectionRef.current = getCellsForSelection;\n themeRef.current = theme;\n const [canvas, ctx] = React.useMemo(() => {\n if (typeof window === \"undefined\")\n return [null, null];\n const offscreen = document.createElement(\"canvas\");\n offscreen.style[\"display\"] = \"none\";\n offscreen.style[\"opacity\"] = \"0\";\n offscreen.style[\"position\"] = \"fixed\";\n return [offscreen, offscreen.getContext(\"2d\", { alpha: false })];\n }, []);\n React.useLayoutEffect(() => {\n if (canvas)\n document.documentElement.append(canvas);\n return () => {\n canvas?.remove();\n };\n }, [canvas]);\n const memoMap = React.useRef({});\n const lastColumns = React.useRef();\n const [selectedData, setSelectionData] = React.useState();\n React.useLayoutEffect(() => {\n const getCells = getCellsForSelectionRef.current;\n if (getCells === undefined || columns.every(isSizedGridColumn))\n return;\n let computeRows = Math.max(1, 10 - Math.floor(columns.length / 10000));\n let tailRows = 0;\n if (computeRows < rowsRef.current && computeRows > 1) {\n computeRows--;\n tailRows = 1;\n }\n const computeArea = {\n x: 0,\n y: 0,\n width: columns.length,\n height: Math.min(rowsRef.current, computeRows),\n };\n const tailComputeArea = {\n x: 0,\n y: rowsRef.current - 1,\n width: columns.length,\n height: 1,\n };\n const fn = async () => {\n const getResult = getCells(computeArea, abortController.signal);\n const tailGetResult = tailRows > 0 ? getCells(tailComputeArea, abortController.signal) : undefined;\n let toSet;\n // eslint-disable-next-line unicorn/prefer-ternary\n if (typeof getResult === \"object\") {\n toSet = getResult;\n }\n else {\n toSet = await resolveCellsThunk(getResult);\n }\n if (tailGetResult !== undefined) {\n // eslint-disable-next-line unicorn/prefer-ternary\n if (typeof tailGetResult === \"object\") {\n toSet = [...toSet, ...tailGetResult];\n }\n else {\n toSet = [...toSet, ...(await resolveCellsThunk(tailGetResult))];\n }\n }\n lastColumns.current = columns;\n setSelectionData(toSet);\n };\n void fn();\n }, [abortController.signal, columns]);\n return React.useMemo(() => {\n const getRaw = () => {\n if (columns.every(isSizedGridColumn)) {\n return columns;\n }\n if (ctx === null) {\n return columns.map(c => {\n if (isSizedGridColumn(c))\n return c;\n return {\n ...c,\n width: defaultSize,\n };\n });\n }\n ctx.font = themeRef.current.baseFontFull;\n return columns.map((c, colIndex) => {\n if (isSizedGridColumn(c))\n return c;\n if (memoMap.current[c.id] !== undefined) {\n return {\n ...c,\n width: memoMap.current[c.id],\n };\n }\n if (selectedData === undefined || lastColumns.current !== columns || c.id === undefined) {\n return {\n ...c,\n width: defaultSize,\n };\n }\n const r = measureColumn(ctx, theme, c, colIndex, selectedData, minColumnWidth, maxColumnWidth, true, getCellRenderer);\n memoMap.current[c.id] = r.width;\n return r;\n });\n };\n let result = getRaw();\n let totalWidth = 0;\n let totalGrow = 0;\n const distribute = [];\n for (const [i, c] of result.entries()) {\n totalWidth += c.width;\n if (c.grow !== undefined && c.grow > 0) {\n totalGrow += c.grow;\n distribute.push(i);\n }\n }\n if (totalWidth < clientWidth && distribute.length > 0) {\n const writeable = [...result];\n const extra = clientWidth - totalWidth;\n let remaining = extra;\n for (let di = 0; di < distribute.length; di++) {\n const i = distribute[di];\n const weighted = (result[i].grow ?? 0) / totalGrow;\n const toAdd = di === distribute.length - 1 ? remaining : Math.min(remaining, Math.floor(extra * weighted));\n writeable[i] = {\n ...result[i],\n growOffset: toAdd,\n width: result[i].width + toAdd,\n };\n remaining -= toAdd;\n }\n result = writeable;\n }\n return {\n sizedColumns: result,\n nonGrowWidth: totalWidth,\n };\n }, [clientWidth, columns, ctx, selectedData, theme, minColumnWidth, maxColumnWidth, getCellRenderer]);\n}\n//# sourceMappingURL=use-column-sizer.js.map","/**\n * The base implementation of `_.clamp` which doesn't coerce arguments.\n *\n * @private\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n */\nfunction baseClamp(number, lower, upper) {\n if (number === number) {\n if (upper !== undefined) {\n number = number <= upper ? number : upper;\n }\n if (lower !== undefined) {\n number = number >= lower ? number : lower;\n }\n }\n return number;\n}\n\nmodule.exports = baseClamp;\n","var baseClamp = require('./_baseClamp'),\n toNumber = require('./toNumber');\n\n/**\n * Clamps `number` within the inclusive `lower` and `upper` bounds.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Number\n * @param {number} number The number to clamp.\n * @param {number} [lower] The lower bound.\n * @param {number} upper The upper bound.\n * @returns {number} Returns the clamped number.\n * @example\n *\n * _.clamp(-10, -5, 5);\n * // => -5\n *\n * _.clamp(10, -5, 5);\n * // => 5\n */\nfunction clamp(number, lower, upper) {\n if (upper === undefined) {\n upper = lower;\n lower = undefined;\n }\n if (upper !== undefined) {\n upper = toNumber(upper);\n upper = upper === upper ? upper : 0;\n }\n if (lower !== undefined) {\n lower = toNumber(lower);\n lower = lower === lower ? lower : 0;\n }\n return baseClamp(toNumber(number), lower, upper);\n}\n\nmodule.exports = clamp;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nmodule.exports = setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n","var MapCache = require('./_MapCache'),\n setCacheAdd = require('./_setCacheAdd'),\n setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n","/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = baseFindIndex;\n","/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n","/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = strictIndexOf;\n","var baseFindIndex = require('./_baseFindIndex'),\n baseIsNaN = require('./_baseIsNaN'),\n strictIndexOf = require('./_strictIndexOf');\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n","var baseIndexOf = require('./_baseIndexOf');\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n","/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arrayIncludesWith;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n // No operation performed.\n}\n\nmodule.exports = noop;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nmodule.exports = setToArray;\n","var Set = require('./_Set'),\n noop = require('./noop'),\n setToArray = require('./_setToArray');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n};\n\nmodule.exports = createSet;\n","var SetCache = require('./_SetCache'),\n arrayIncludes = require('./_arrayIncludes'),\n arrayIncludesWith = require('./_arrayIncludesWith'),\n cacheHas = require('./_cacheHas'),\n createSet = require('./_createSet'),\n setToArray = require('./_setToArray');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseUniq;\n","var baseUniq = require('./_baseUniq');\n\n/**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each element\n * is kept. The order of result values is determined by the order they occur\n * in the array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */\nfunction uniq(array) {\n return (array && array.length) ? baseUniq(array) : [];\n}\n\nmodule.exports = uniq;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n","var Symbol = require('./_Symbol'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray');\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n return isArray(value) || isArguments(value) ||\n !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n","var arrayPush = require('./_arrayPush'),\n isFlattenable = require('./_isFlattenable');\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n var index = -1,\n length = array.length;\n\n predicate || (predicate = isFlattenable);\n result || (result = []);\n\n while (++index < length) {\n var value = array[index];\n if (depth > 0 && predicate(value)) {\n if (depth > 1) {\n // Recursively flatten arrays (susceptible to call stack limits).\n baseFlatten(value, depth - 1, predicate, isStrict, result);\n } else {\n arrayPush(result, value);\n }\n } else if (!isStrict) {\n result[result.length] = value;\n }\n }\n return result;\n}\n\nmodule.exports = baseFlatten;\n","var baseFlatten = require('./_baseFlatten');\n\n/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\nfunction flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\n}\n\nmodule.exports = flatten;\n","/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeCeil = Math.ceil,\n nativeMax = Math.max;\n\n/**\n * The base implementation of `_.range` and `_.rangeRight` which doesn't\n * coerce arguments.\n *\n * @private\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @param {number} step The value to increment or decrement by.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the range of numbers.\n */\nfunction baseRange(start, end, step, fromRight) {\n var index = -1,\n length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n result = Array(length);\n\n while (length--) {\n result[fromRight ? length : ++index] = start;\n start += step;\n }\n return result;\n}\n\nmodule.exports = baseRange;\n","var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","var eq = require('./eq'),\n isArrayLike = require('./isArrayLike'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject');\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nmodule.exports = isIterateeCall;\n","var toNumber = require('./toNumber');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nmodule.exports = toFinite;\n","var baseRange = require('./_baseRange'),\n isIterateeCall = require('./_isIterateeCall'),\n toFinite = require('./toFinite');\n\n/**\n * Creates a `_.range` or `_.rangeRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new range function.\n */\nfunction createRange(fromRight) {\n return function(start, end, step) {\n if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n end = step = undefined;\n }\n // Ensure the sign of `-0` is preserved.\n start = toFinite(start);\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n return baseRange(start, end, step, fromRight);\n };\n}\n\nmodule.exports = createRange;\n","var createRange = require('./_createRange');\n\n/**\n * Creates an array of numbers (positive and/or negative) progressing from\n * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n * `start` is specified without an `end` or `step`. If `end` is not specified,\n * it's set to `start` with `start` then set to `0`.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @param {number} [step=1] The value to increment or decrement by.\n * @returns {Array} Returns the range of numbers.\n * @see _.inRange, _.rangeRight\n * @example\n *\n * _.range(4);\n * // => [0, 1, 2, 3]\n *\n * _.range(-4);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 5);\n * // => [1, 2, 3, 4]\n *\n * _.range(0, 20, 5);\n * // => [0, 5, 10, 15]\n *\n * _.range(0, -4, -1);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 4, 0);\n * // => [1, 1, 1]\n *\n * _.range(0);\n * // => []\n */\nvar range = createRange();\n\nmodule.exports = range;\n","const iconHead = `<svg width=\"20\" height=\"20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">`;\nconst headerRowID = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `\n ${iconHead}<rect x=\"2\" y=\"2\" width=\"16\" height=\"16\" rx=\"2\" fill=\"${bg}\"/><path d=\"M15.75 4h-1.5a.25.25 0 0 0-.177.074L9.308 8.838a3.75 3.75 0 1 0 1.854 1.854l1.155-1.157.967.322a.5.5 0 0 0 .65-.55l-.18-1.208.363-.363.727.331a.5.5 0 0 0 .69-.59l-.254-.904.647-.647A.25.25 0 0 0 16 5.75v-1.5a.25.25 0 0 0-.25-.25zM7.5 13.25a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0z\" fill=\"${fg}\"/></svg>`;\n};\nconst headerCode = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `\n ${iconHead}<rect x=\"2\" y=\"2\" width=\"16\" height=\"16\" rx=\"4\" fill=\"${bg}\"/><path d=\"m12.223 13.314 3.052-2.826a.65.65 0 0 0 0-.984l-3.052-2.822c-.27-.25-.634-.242-.865.022-.232.263-.206.636.056.882l2.601 2.41-2.601 2.41c-.262.245-.288.619-.056.882.231.263.595.277.865.026Zm-4.444.005c.266.25.634.241.866-.027.231-.263.206-.636-.06-.882L5.983 10l2.602-2.405c.266-.25.291-.62.06-.887-.232-.263-.596-.272-.866-.022L4.723 9.51a.653.653 0 0 0 0 .983l3.056 2.827Z\" fill=\"${fg}\"/></svg>`;\n};\nconst headerNumber = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `${iconHead}\n <path d=\"M16.22 2H3.78C2.8 2 2 2.8 2 3.78v12.44C2 17.2 2.8 18 3.78 18h12.44c.98 0 1.77-.8 1.77-1.78L18 3.78C18 2.8 17.2 2 16.22 2z\" fill=\"${bg}\"/>\n <path d=\"M6.52 12.78H5.51V8.74l-1.33.47v-.87l2.29-.83h.05v5.27zm5.2 0H8.15v-.69l1.7-1.83a6.38 6.38 0 0 0 .34-.4c.09-.11.16-.22.22-.32s.1-.19.12-.27a.9.9 0 0 0 0-.56.63.63 0 0 0-.15-.23.58.58 0 0 0-.22-.15.75.75 0 0 0-.29-.05c-.27 0-.48.08-.62.23a.95.95 0 0 0-.2.65H8.03c0-.24.04-.46.13-.67a1.67 1.67 0 0 1 .97-.91c.23-.1.49-.14.77-.14.26 0 .5.04.7.11.21.08.38.18.52.32.14.13.25.3.32.48a1.74 1.74 0 0 1 .03 1.13 2.05 2.05 0 0 1-.24.47 4.16 4.16 0 0 1-.35.47l-.47.5-1 1.05h2.32v.8zm1.8-3.08h.55c.28 0 .48-.06.61-.2a.76.76 0 0 0 .2-.55.8.8 0 0 0-.05-.28.56.56 0 0 0-.13-.22.6.6 0 0 0-.23-.15.93.93 0 0 0-.32-.05.92.92 0 0 0-.29.05.72.72 0 0 0-.23.12.57.57 0 0 0-.21.46H12.4a1.3 1.3 0 0 1 .5-1.04c.15-.13.33-.23.54-.3a2.48 2.48 0 0 1 1.4 0c.2.06.4.15.55.28.15.13.27.28.36.47.08.19.13.4.13.65a1.15 1.15 0 0 1-.2.65 1.36 1.36 0 0 1-.58.49c.15.05.28.12.38.2a1.14 1.14 0 0 1 .43.62c.03.13.05.26.05.4 0 .25-.05.47-.14.66a1.42 1.42 0 0 1-.4.49c-.16.13-.35.23-.58.3a2.51 2.51 0 0 1-.73.1c-.22 0-.44-.03-.65-.09a1.8 1.8 0 0 1-.57-.28 1.43 1.43 0 0 1-.4-.47 1.41 1.41 0 0 1-.15-.66h1a.66.66 0 0 0 .22.5.87.87 0 0 0 .58.2c.25 0 .45-.07.6-.2a.71.71 0 0 0 .21-.56.97.97 0 0 0-.06-.36.61.61 0 0 0-.18-.25.74.74 0 0 0-.28-.15 1.33 1.33 0 0 0-.37-.04h-.55V9.7z\" fill=\"${fg}\"/>\n </svg>`;\n};\nconst headerString = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `${iconHead}\n <path d=\"M16.222 2H3.778C2.8 2 2 2.8 2 3.778v12.444C2 17.2 2.8 18 3.778 18h12.444c.978 0 1.77-.8 1.77-1.778L18 3.778C18 2.8 17.2 2 16.222 2z\" fill=\"${bg}\"/>\n <path d=\"M8.182 12.4h3.636l.655 1.6H14l-3.454-8H9.455L6 14h1.527l.655-1.6zM10 7.44l1.36 3.651H8.64L10 7.441z\" fill=\"${fg}\"/>\n</svg>`;\n};\nconst headerBoolean = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `${iconHead}\n <path\n d=\"M16.2222 2H3.77778C2.8 2 2 2.8 2 3.77778V16.2222C2 17.2 2.8 18 3.77778 18H16.2222C17.2 18 17.9911 17.2 17.9911 16.2222L18 3.77778C18 2.8 17.2 2 16.2222 2Z\"\n fill=\"${bg}\"\n />\n <path\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M7.66667 6.66669C5.73368 6.66669 4.16667 8.15907 4.16667 10C4.16667 11.841 5.73368 13.3334 7.66667 13.3334H12.3333C14.2663 13.3334 15.8333 11.841 15.8333 10C15.8333 8.15907 14.2663 6.66669 12.3333 6.66669H7.66667ZM12.5 12.5C13.8807 12.5 15 11.3807 15 10C15 8.61931 13.8807 7.50002 12.5 7.50002C11.1193 7.50002 10 8.61931 10 10C10 11.3807 11.1193 12.5 12.5 12.5Z\"\n fill=\"${fg}\"\n />\n</svg>`;\n};\nconst headerUri = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `${iconHead}\n<path d=\"M16.222 2H3.778C2.8 2 2 2.8 2 3.778v12.444C2 17.2 2.8 18 3.778 18h12.444c.978 0 1.77-.8 1.77-1.778L18 3.778C18 2.8 17.2 2 16.222 2z\" fill=\"${bg}\"/>\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M10.29 4.947a3.368 3.368 0 014.723.04 3.375 3.375 0 01.041 4.729l-.009.009-1.596 1.597a3.367 3.367 0 01-5.081-.364.71.71 0 011.136-.85 1.95 1.95 0 002.942.21l1.591-1.593a1.954 1.954 0 00-.027-2.733 1.95 1.95 0 00-2.732-.027l-.91.907a.709.709 0 11-1.001-1.007l.915-.911.007-.007z\" fill=\"${fg}\"/>\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M6.55 8.678a3.368 3.368 0 015.082.364.71.71 0 01-1.136.85 1.95 1.95 0 00-2.942-.21l-1.591 1.593a1.954 1.954 0 00.027 2.733 1.95 1.95 0 002.73.028l.906-.906a.709.709 0 111.003 1.004l-.91.91-.008.01a3.368 3.368 0 01-4.724-.042 3.375 3.375 0 01-.041-4.728l.009-.009L6.55 8.678z\" fill=\"${fg}\"/>\n</svg>\n `;\n};\nconst renameIcon = (props) => {\n const bg = props.bgColor;\n return `${iconHead}\n <path stroke=\"${bg}\" stroke-width=\"2\" d=\"M12 3v14\"/>\n <path stroke=\"${bg}\" stroke-width=\"2\" stroke-linecap=\"round\" d=\"M10 4h4m-4 12h4\"/>\n <path d=\"M11 14h4a3 3 0 0 0 3-3V9a3 3 0 0 0-3-3h-4v2h4a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-4v2ZM9.5 8H5a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1h4.5v2H5a3 3 0 0 1-3-3V9a3 3 0 0 1 3-3h4.5v2Z\" fill=\"${bg}\"/>\n </svg>\n`;\n};\nconst headerAudioUri = headerUri;\nconst headerVideoUri = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `${iconHead}\n <path d=\"M16.222 2H3.778C2.8 2 2 2.8 2 3.778v12.444C2 17.2 2.8 18 3.778 18h12.444c.978 0 1.77-.8 1.77-1.778L18 3.778C18 2.8 17.2 2 16.222 2z\" fill=\"${bg}\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M7 13.138a.5.5 0 00.748.434l5.492-3.138a.5.5 0 000-.868L7.748 6.427A.5.5 0 007 6.862v6.276z\" fill=\"${fg}\"/>\n</svg>`;\n};\nconst headerEmoji = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `\n ${iconHead}\n <path d=\"M10 5a5 5 0 1 0 0 10 5 5 0 0 0 0-10zm0 9.17A4.17 4.17 0 0 1 5.83 10 4.17 4.17 0 0 1 10 5.83 4.17 4.17 0 0 1 14.17 10 4.17 4.17 0 0 1 10 14.17z\" fill=\"${fg}\"/>\n <path d=\"M8.33 8.21a.83.83 0 1 0-.03 1.67.83.83 0 0 0 .03-1.67zm3.34 0a.83.83 0 1 0-.04 1.67.83.83 0 0 0 .04-1.67z\" fill=\"${fg}\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M14.53 13.9a2.82 2.82 0 0 1-5.06 0l.77-.38a1.97 1.97 0 0 0 3.52 0l.77.39z\" fill=\"${fg}\"/>\n <path d=\"M16.22 2H3.78C2.8 2 2 2.8 2 3.78v12.44C2 17.2 2.8 18 3.78 18h12.44c.98 0 1.77-.8 1.77-1.78L18 3.78C18 2.8 17.2 2 16.22 2z\" fill=\"${bg}\"/>\n <path d=\"M10 4a6 6 0 1 0 0 12 6 6 0 0 0 0-12zm0 11a5 5 0 1 1 .01-10.01A5 5 0 0 1 10 15z\" fill=\"${fg}\"/>\n <path d=\"M8 7.86a1 1 0 1 0-.04 2 1 1 0 0 0 .04-2zm4 0a1 1 0 1 0-.04 2 1 1 0 0 0 .04-2z\" fill=\"${fg}\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M12.53 11.9a2.82 2.82 0 0 1-5.06 0l.77-.38a1.97 1.97 0 0 0 3.52 0l.77.39z\" fill=\"${fg}\"/>\n </svg>`;\n};\nconst headerImage = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `${iconHead}\n <path d=\"M16.222 2H3.778C2.8 2 2 2.8 2 3.778v12.444C2 17.2 2.8 18 3.778 18h12.444c.978 0 1.77-.8 1.77-1.778L18 3.778C18 2.8 17.2 2 16.222 2z\" fill=\"${bg}\"/>\n <path opacity=\".5\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M12.499 10.801a.5.5 0 01.835 0l2.698 4.098a.5.5 0 01-.418.775H10.22a.5.5 0 01-.417-.775l2.697-4.098z\" fill=\"${fg}\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M8.07 8.934a.5.5 0 01.824 0l4.08 5.958a.5.5 0 01-.412.782h-8.16a.5.5 0 01-.413-.782l4.08-5.958zM13.75 8.333a2.083 2.083 0 100-4.166 2.083 2.083 0 000 4.166z\" fill=\"${fg}\"/>\n</svg>`;\n};\nconst headerPhone = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `\n ${iconHead}\n <path fill=\"${fg}\" d=\"M3 3h14v14H3z\"/>\n <path d=\"M16.22 2H3.78C2.8 2 2 2.8 2 3.78v12.44C2 17.2 2.8 18 3.78 18h12.44c.98 0 1.77-.8 1.77-1.78L18 3.78C18 2.8 17.2 2 16.22 2zm-7.24 9.78h1.23c.15 0 .27.06.36.18l.98 1.28a.43.43 0 0 1-.05.58l-1.2 1.21a.45.45 0 0 1-.6.04A6.72 6.72 0 0 1 7.33 10c0-.61.1-1.2.25-1.78a6.68 6.68 0 0 1 2.12-3.3.44.44 0 0 1 .6.04l1.2 1.2c.16.17.18.42.05.59l-.98 1.29a.43.43 0 0 1-.36.17H8.98A5.38 5.38 0 0 0 8.67 10c0 .62.11 1.23.3 1.79z\" fill=\"${bg}\"/>\n </svg>`;\n};\nconst headerMarkdown = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `\n ${iconHead}\n <path d=\"M16.22 2H3.78C2.8 2 2 2.8 2 3.78v12.44C2 17.2 2.8 18 3.78 18h12.44c.98 0 1.77-.8 1.77-1.78L18 3.78C18 2.8 17.2 2 16.22 2z\" fill=\"${bg}\"/>\n <path d=\"m13.49 13.15-2.32-3.27h1.4V7h1.86v2.88h1.4l-2.34 3.27zM11 13H9v-3l-1.5 1.92L6 10v3H4V7h2l1.5 2L9 7h2v6z\" fill=\"${fg}\"/>\n </svg>`;\n};\nconst headerDate = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `${iconHead}\n <path d=\"M16.222 2H3.778C2.8 2 2 2.8 2 3.778v12.444C2 17.2 2.8 18 3.778 18h12.444c.978 0 1.77-.8 1.77-1.778L18 3.778C18 2.8 17.2 2 16.222 2z\" fill=\"${bg}\"/>\n <path d=\"M14.8 4.182h-.6V3H13v1.182H7V3H5.8v1.182h-.6c-.66 0-1.2.532-1.2 1.182v9.454C4 15.468 4.54 16 5.2 16h9.6c.66 0 1.2-.532 1.2-1.182V5.364c0-.65-.54-1.182-1.2-1.182zm0 10.636H5.2V7.136h9.6v7.682z\" fill=\"${fg}\"/>\n</svg>`;\n};\nconst headerTime = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `\n ${iconHead}\n <path d=\"M16.22 2H3.78C2.8 2 2 2.8 2 3.78v12.44C2 17.2 2.8 18 3.78 18h12.44c.98 0 1.77-.8 1.77-1.78L18 3.78C18 2.8 17.2 2 16.22 2z\" fill=\"${bg}\"/>\n <path d=\"M10 4a6 6 0 0 0-6 6 6 6 0 0 0 6 6 6 6 0 0 0 6-6 6 6 0 0 0-6-6zm0 10.8A4.8 4.8 0 0 1 5.2 10a4.8 4.8 0 1 1 4.8 4.8z\" fill=\"${fg}\"/>\n <path d=\"M10 7H9v3.93L12.5 13l.5-.8-3-1.76V7z\" fill=\"${fg}\"/>\n </svg>`;\n};\nconst headerEmail = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `${iconHead}\n <rect x=\"2\" y=\"2\" width=\"16\" height=\"16\" rx=\"2\" fill=\"${bg}\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M10 8.643a1.357 1.357 0 100 2.714 1.357 1.357 0 000-2.714zM7.357 10a2.643 2.643 0 115.286 0 2.643 2.643 0 01-5.286 0z\" fill=\"${fg}\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M7.589 4.898A5.643 5.643 0 0115.643 10v.5a2.143 2.143 0 01-4.286 0V8a.643.643 0 011.286 0v2.5a.857.857 0 001.714 0V10a4.357 4.357 0 10-1.708 3.46.643.643 0 01.782 1.02 5.643 5.643 0 11-5.842-9.582z\" fill=\"${fg}\"/>\n</svg>`;\n};\nconst headerReference = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `\n ${iconHead}\n <rect x=\"2\" y=\"8\" width=\"10\" height=\"8\" rx=\"2\" fill=\"${bg}\"/>\n <rect x=\"8\" y=\"4\" width=\"10\" height=\"8\" rx=\"2\" fill=\"${bg}\"/>\n <path d=\"M10.68 7.73V6l2.97 3.02-2.97 3.02v-1.77c-2.13 0-3.62.7-4.68 2.2.43-2.15 1.7-4.31 4.68-4.74z\" fill=\"${fg}\"/>\n </svg>`;\n};\nconst headerIfThenElse = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `${iconHead}\n <path fill=\"${fg}\" d=\"M4 3h12v14H4z\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M3.6 2A1.6 1.6 0 002 3.6v12.8A1.6 1.6 0 003.6 18h12.8a1.6 1.6 0 001.6-1.6V3.6A1.6 1.6 0 0016.4 2H3.6zm11.3 10.8a.7.7 0 01.7.7v1.4a.7.7 0 01-.7.7h-1.4a.7.7 0 01-.7-.7v-1.4a.7.7 0 01.6-.693.117.117 0 00.1-.115V10.35a.117.117 0 00-.117-.116h-2.8a.117.117 0 00-.117.116v2.333c0 .064.053.117.117.117h.117a.7.7 0 01.7.7v1.4a.7.7 0 01-.7.7H9.3a.7.7 0 01-.7-.7v-1.4a.7.7 0 01.7-.7h.117a.117.117 0 00.117-.117V10.35a.117.117 0 00-.117-.117h-2.8a.117.117 0 00-.117.117v2.342c0 .058.042.106.1.115a.7.7 0 01.6.693v1.4a.7.7 0 01-.7.7H5.1a.7.7 0 01-.7-.7v-1.4a.7.7 0 01.7-.7h.35a.116.116 0 00.116-.117v-2.45c0-.515.418-.933.934-.933h2.917a.117.117 0 00.117-.117V6.85a.117.117 0 00-.117-.116h-2.45a.7.7 0 01-.7-.7V5.1a.7.7 0 01.7-.7h6.067a.7.7 0 01.7.7v.934a.7.7 0 01-.7.7h-2.45a.117.117 0 00-.118.116v2.333c0 .064.053.117.117.117H13.5c.516 0 .934.418.934.934v2.45c0 .063.052.116.116.116h.35z\" fill=\"${bg}\"/>\n</svg>`;\n};\nconst headerSingleValue = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `\n ${iconHead}\n <rect x=\"2\" y=\"2\" width=\"16\" height=\"16\" rx=\"2\" fill=\"${bg}\"/>\n <path d=\"M9.98 13.33c.45 0 .74-.3.73-.75l-.01-.1-.16-1.67 1.45 1.05a.81.81 0 0 0 .5.18c.37 0 .72-.32.72-.76 0-.3-.17-.54-.49-.68l-1.63-.77 1.63-.77c.32-.14.49-.37.49-.67 0-.45-.34-.76-.71-.76a.81.81 0 0 0-.5.18l-1.47 1.03.16-1.74.01-.08c.01-.46-.27-.76-.72-.76-.46 0-.76.32-.75.76l.01.08.16 1.74-1.47-1.03a.77.77 0 0 0-.5-.18.74.74 0 0 0-.72.76c0 .3.17.53.49.67l1.63.77-1.62.77c-.32.14-.5.37-.5.68 0 .44.35.75.72.75a.78.78 0 0 0 .5-.17L9.4 10.8l-.16 1.68v.09c-.02.44.28.75.74.75z\" fill=\"${fg}\"/>\n </svg>`;\n};\nconst headerLookup = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `\n ${iconHead}\n <rect x=\"2\" y=\"2\" width=\"16\" height=\"16\" rx=\"2\" fill=\"${bg}\"/>\n <path d=\"M8 5.83H5.83a.83.83 0 0 0 0 1.67h1.69A4.55 4.55 0 0 1 8 5.83zm-.33 3.34H5.83a.83.83 0 0 0 0 1.66h2.72a4.57 4.57 0 0 1-.88-1.66zM5.83 12.5a.83.83 0 0 0 0 1.67h7.5a.83.83 0 1 0 0-1.67h-7.5zm8.8-2.9a3.02 3.02 0 0 0 .46-1.6c0-1.66-1.32-3-2.94-3C10.52 5 9.2 6.34 9.2 8s1.31 3 2.93 3c.58 0 1.11-.17 1.56-.47l2.04 2.08.93-.94-2.04-2.08zm-2.48.07c-.9 0-1.63-.75-1.63-1.67s.73-1.67 1.63-1.67c.9 0 1.63.75 1.63 1.67s-.73 1.67-1.63 1.67z\" fill=\"${fg}\"/>\n </svg>`;\n};\nconst headerTextTemplate = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `${iconHead}\n <rect x=\"2\" y=\"2\" width=\"16\" height=\"16\" rx=\"2\" fill=\"${bg}\"/>\n <path d=\"M7.676 4.726V3l2.976 3.021-2.976 3.022v-1.77c-2.125 0-3.613.69-4.676 2.201.425-2.158 1.7-4.316 4.676-4.748zM10.182 14.4h3.636l.655 1.6H16l-3.454-8h-1.091L8 16h1.527l.655-1.6zM12 9.44l1.36 3.65h-2.72L12 9.44z\" fill=\"${fg}\"/>\n</svg>`;\n};\nconst headerMath = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `${iconHead}\n <rect x=\"2\" y=\"2\" width=\"16\" height=\"16\" rx=\"2\" fill=\"${bg}\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M4.167 5.417a.833.833 0 100 1.666h4.166a.833.833 0 100-1.666H4.167z\" fill=\"${fg}\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M7.083 4.167a.833.833 0 10-1.666 0v4.166a.833.833 0 101.666 0V4.167zM11.667 5.417a.833.833 0 100 1.666h4.166a.833.833 0 100-1.666h-4.166zM5.367 11.688a.833.833 0 00-1.179 1.179l2.947 2.946a.833.833 0 001.178-1.178l-2.946-2.947z\" fill=\"${fg}\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M8.313 12.867a.833.833 0 10-1.178-1.179l-2.947 2.947a.833.833 0 101.179 1.178l2.946-2.946z\" fill=\"${fg}\"/>\n <path d=\"M10.833 12.5c0-.46.373-.833.834-.833h4.166a.833.833 0 110 1.666h-4.166a.833.833 0 01-.834-.833zM10.833 15c0-.46.373-.833.834-.833h4.166a.833.833 0 110 1.666h-4.166a.833.833 0 01-.834-.833z\" fill=\"${fg}\"/>\n</svg>`;\n};\nconst headerRollup = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `\n ${iconHead}\n <path d=\"M16.22 2H3.78C2.8 2 2 2.8 2 3.78v12.44C2 17.2 2.8 18 3.78 18h12.44c.98 0 1.77-.8 1.77-1.78L18 3.78C18 2.8 17.2 2 16.22 2z\" fill=\"${bg}\"/>\n <path d=\"M10 8.84a1.16 1.16 0 1 0 0 2.32 1.16 1.16 0 0 0 0-2.32zm3.02 3.61a3.92 3.92 0 0 0 .78-3.28.49.49 0 1 0-.95.2c.19.87-.02 1.78-.58 2.47a2.92 2.92 0 1 1-4.13-4.08 2.94 2.94 0 0 1 2.43-.62.49.49 0 1 0 .17-.96 3.89 3.89 0 1 0 2.28 6.27zM10 4.17a5.84 5.84 0 0 0-5.44 7.93.49.49 0 1 0 .9-.35 4.86 4.86 0 1 1 2.5 2.67.49.49 0 1 0-.4.88c.76.35 1.6.54 2.44.53a5.83 5.83 0 0 0 0-11.66zm3.02 3.5a.7.7 0 1 0-1.4 0 .7.7 0 0 0 1.4 0zm-6.97 5.35a.7.7 0 1 1 0 1.4.7.7 0 0 1 0-1.4z\" fill=\"${fg}\"/>\n </svg>`;\n};\nconst headerJoinStrings = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `${iconHead}\n <rect x=\"2\" y=\"2\" width=\"16\" height=\"16\" rx=\"2\" fill=\"${bg}\"/>\n <path d=\"M12.4 13.565c1.865-.545 3.645-2.083 3.645-4.396 0-1.514-.787-2.604-2.071-2.604C12.69 6.565 12 7.63 12 8.939c1.114.072 1.865.726 1.865 1.683 0 .933-.8 1.647-1.84 2.023l.375.92zM4 5h6v2H4zM4 9h5v2H4zM4 13h4v2H4z\" fill=\"${fg}\"/>\n</svg>`;\n};\nconst headerSplitString = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `\n ${iconHead}\n <rect x=\"2\" y=\"2\" width=\"16\" height=\"16\" rx=\"2\" fill=\"${bg}\"/>\n <path d=\"M12.4 13.56c1.86-.54 3.65-2.08 3.65-4.4 0-1.5-.8-2.6-2.08-2.6S12 7.64 12 8.95c1.11.07 1.86.73 1.86 1.68 0 .94-.8 1.65-1.83 2.03l.37.91zM4 5h6v2H4zm0 4h5v2H4zm0 4h4v2H4z\" fill=\"${fg}\"/>\n </svg>`;\n};\nconst headerGeoDistance = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `${iconHead}\n <path d=\"M16.222 2H3.778C2.8 2 2 2.8 2 3.778v12.444C2 17.2 2.8 18 3.778 18h12.444c.978 0 1.77-.8 1.77-1.778L18 3.778C18 2.8 17.2 2 16.222 2z\" fill=\"${bg}\"/>\n <path d=\"M10 7a1 1 0 100-2v2zm0 6a1 1 0 100 2v-2zm0-8H7v2h3V5zm-3 6h5V9H7v2zm5 2h-2v2h2v-2zm1-1a1 1 0 01-1 1v2a3 3 0 003-3h-2zm-1-1a1 1 0 011 1h2a3 3 0 00-3-3v2zM4 8a3 3 0 003 3V9a1 1 0 01-1-1H4zm3-3a3 3 0 00-3 3h2a1 1 0 011-1V5z\" fill=\"${fg}\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M4.856 12.014a.5.5 0 00-.712.702L5.409 14l-1.265 1.284a.5.5 0 00.712.702l1.255-1.274 1.255 1.274a.5.5 0 00.712-.702L6.813 14l1.265-1.284a.5.5 0 00-.712-.702L6.11 13.288l-1.255-1.274zM12.856 4.014a.5.5 0 00-.712.702L13.409 6l-1.265 1.284a.5.5 0 10.712.702l1.255-1.274 1.255 1.274a.5.5 0 10.712-.702L14.813 6l1.265-1.284a.5.5 0 00-.712-.702L14.11 5.288l-1.255-1.274z\" fill=\"${fg}\"/>\n</svg>`;\n};\nconst headerArray = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `${iconHead}\n <rect x=\"2\" y=\"2\" width=\"16\" height=\"16\" rx=\"2\" fill=\"${bg}\"/>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M14.25 7.25a.75.75 0 000-1.5h-6.5a.75.75 0 100 1.5h6.5zM15 10a.75.75 0 01-.75.75h-6.5a.75.75 0 010-1.5h6.5A.75.75 0 0115 10zm-.75 4.25a.75.75 0 000-1.5h-6.5a.75.75 0 000 1.5h6.5zm-8.987-7a.75.75 0 100-1.5.75.75 0 000 1.5zm.75 2.75a.75.75 0 11-1.5 0 .75.75 0 011.5 0zm-.75 4.25a.75.75 0 100-1.5.75.75 0 000 1.5z\" fill=\"${fg}\"/>\n</svg>`;\n};\nconst rowOwnerOverlay = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `\n <svg width=\"18\" height=\"18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2 15v1h14v-2.5c0-.87-.44-1.55-.98-2.04a6.19 6.19 0 0 0-1.9-1.14 12.1 12.1 0 0 0-2.48-.67A4 4 0 1 0 5 6a4 4 0 0 0 2.36 3.65c-.82.13-1.7.36-2.48.67-.69.28-1.37.65-1.9 1.13A2.8 2.8 0 0 0 2 13.5V15z\" fill=\"${bg}\" stroke=\"${fg}\" stroke-width=\"2\"/>\n </svg>`;\n};\nconst protectedColumnOverlay = (props) => {\n const fg = props.fgColor;\n const bg = props.bgColor;\n return `\n <svg width=\"18\" height=\"18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M12.43 6.04v-.18a3.86 3.86 0 0 0-7.72 0v.18A2.15 2.15 0 0 0 3 8.14v5.72C3 15.04 3.96 16 5.14 16H12c1.18 0 2.14-.96 2.14-2.14V8.14c0-1.03-.73-1.9-1.71-2.1zM7.86 6v-.14a.71.71 0 1 1 1.43 0V6H7.86z\" fill=\"${bg}\" stroke=\"${fg}\" stroke-width=\"2\"/>\n </svg>\n`;\n};\nexport const sprites = {\n headerRowID,\n headerNumber,\n headerCode,\n headerString,\n headerBoolean,\n headerAudioUri,\n headerVideoUri,\n headerEmoji,\n headerImage,\n headerUri,\n headerPhone,\n headerMarkdown,\n headerDate,\n headerTime,\n headerEmail,\n headerReference,\n headerIfThenElse,\n headerSingleValue,\n headerLookup,\n headerTextTemplate,\n headerMath,\n headerRollup,\n headerJoinStrings,\n headerSplitString,\n headerGeoDistance,\n headerArray,\n rowOwnerOverlay,\n protectedColumnOverlay,\n renameIcon,\n};\n//# sourceMappingURL=sprites.js.map","import {} from \"./sprites.js\";\nfunction getColors(variant, theme) {\n if (variant === \"normal\") {\n return [theme.bgIconHeader, theme.fgIconHeader];\n }\n else if (variant === \"selected\") {\n return [\"white\", theme.accentColor];\n }\n else {\n return [theme.accentColor, theme.bgHeader];\n }\n}\n/** @category Columns */\nexport class SpriteManager {\n onSettled;\n spriteMap = new Map();\n headerIcons;\n inFlight = 0;\n constructor(headerIcons, onSettled) {\n this.onSettled = onSettled;\n this.headerIcons = headerIcons ?? {};\n }\n drawSprite(sprite, variant, ctx, x, y, size, theme, alpha = 1) {\n const [bgColor, fgColor] = getColors(variant, theme);\n const rSize = size * Math.ceil(window.devicePixelRatio);\n const key = `${bgColor}_${fgColor}_${rSize}_${sprite}`;\n let spriteCanvas = this.spriteMap.get(key);\n if (spriteCanvas === undefined) {\n const spriteCb = this.headerIcons[sprite];\n if (spriteCb === undefined)\n return;\n spriteCanvas = document.createElement(\"canvas\");\n const spriteCtx = spriteCanvas.getContext(\"2d\");\n if (spriteCtx === null)\n return;\n const imgSource = new Image();\n imgSource.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(spriteCb({ fgColor, bgColor }))}`;\n this.spriteMap.set(key, spriteCanvas);\n const promise = imgSource.decode();\n if (promise === undefined)\n return;\n this.inFlight++;\n promise\n .then(() => {\n spriteCtx.drawImage(imgSource, 0, 0, rSize, rSize);\n })\n .finally(() => {\n this.inFlight--;\n if (this.inFlight === 0) {\n this.onSettled();\n }\n });\n }\n else {\n if (alpha < 1) {\n ctx.globalAlpha = alpha;\n }\n ctx.drawImage(spriteCanvas, 0, 0, rSize, rSize, x, y, size, size);\n if (alpha < 1) {\n ctx.globalAlpha = 1;\n }\n }\n }\n}\n//# sourceMappingURL=data-grid-sprites.js.map","import {} from \"../data-grid-types.js\";\nimport { isGroupEqual } from \"./data-grid-lib.js\";\nexport function getSkipPoint(drawRegions) {\n if (drawRegions.length === 0)\n return undefined;\n let drawRegionsLowestY;\n for (const dr of drawRegions) {\n drawRegionsLowestY = Math.min(drawRegionsLowestY ?? dr.y, dr.y);\n }\n}\nexport function walkRowsInCol(startRow, drawY, height, rows, getRowHeight, freezeTrailingRows, hasAppendRow, skipToY, cb) {\n skipToY = skipToY ?? drawY;\n let y = drawY;\n let row = startRow;\n const rowEnd = rows - freezeTrailingRows;\n let didBreak = false;\n while (y < height && row < rowEnd) {\n const rh = getRowHeight(row);\n if (y + rh > skipToY && cb(y, row, rh, false, hasAppendRow && row === rows - 1) === true) {\n didBreak = true;\n break;\n }\n y += rh;\n row++;\n }\n if (didBreak)\n return;\n y = height;\n for (let fr = 0; fr < freezeTrailingRows; fr++) {\n row = rows - 1 - fr;\n const rh = getRowHeight(row);\n y -= rh;\n cb(y, row, rh, true, hasAppendRow && row === rows - 1);\n }\n}\nexport function walkColumns(effectiveCols, cellYOffset, translateX, translateY, totalHeaderHeight, cb) {\n let x = 0;\n let clipX = 0; // this tracks the total width of sticky cols\n const drawY = totalHeaderHeight + translateY;\n for (const c of effectiveCols) {\n const drawX = c.sticky ? clipX : x + translateX;\n if (cb(c, drawX, drawY, c.sticky ? 0 : clipX, cellYOffset) === true) {\n break;\n }\n x += c.width;\n clipX += c.sticky ? c.width : 0;\n }\n}\nexport function walkGroups(effectiveCols, width, translateX, groupHeaderHeight, cb) {\n let x = 0;\n let clipX = 0;\n for (let index = 0; index < effectiveCols.length; index++) {\n const startCol = effectiveCols[index];\n let end = index + 1;\n let boxWidth = startCol.width;\n if (startCol.sticky) {\n clipX += boxWidth;\n }\n while (end < effectiveCols.length &&\n isGroupEqual(effectiveCols[end].group, startCol.group) &&\n effectiveCols[end].sticky === effectiveCols[index].sticky) {\n const endCol = effectiveCols[end];\n boxWidth += endCol.width;\n end++;\n index++;\n if (endCol.sticky) {\n clipX += endCol.width;\n }\n }\n const t = startCol.sticky ? 0 : translateX;\n const localX = x + t;\n const delta = startCol.sticky ? 0 : Math.max(0, clipX - localX);\n const w = Math.min(boxWidth - delta, width - (localX + delta));\n cb([startCol.sourceIndex, effectiveCols[end - 1].sourceIndex], startCol.group ?? \"\", localX + delta, 0, w, groupHeaderHeight);\n x += boxWidth;\n }\n}\nexport function getSpanBounds(span, cellX, cellY, cellW, cellH, column, allColumns) {\n const [startCol, endCol] = span;\n let frozenRect;\n let contentRect;\n const firstNonSticky = allColumns.find(x => !x.sticky)?.sourceIndex ?? 0;\n if (endCol > firstNonSticky) {\n const renderFromCol = Math.max(startCol, firstNonSticky);\n let tempX = cellX;\n let tempW = cellW;\n for (let x = column.sourceIndex - 1; x >= renderFromCol; x--) {\n tempX -= allColumns[x].width;\n tempW += allColumns[x].width;\n }\n for (let x = column.sourceIndex + 1; x <= endCol; x++) {\n tempW += allColumns[x].width;\n }\n contentRect = {\n x: tempX,\n y: cellY,\n width: tempW,\n height: cellH,\n };\n }\n if (firstNonSticky > startCol) {\n const renderToCol = Math.min(endCol, firstNonSticky - 1);\n let tempX = cellX;\n let tempW = cellW;\n for (let x = column.sourceIndex - 1; x >= startCol; x--) {\n tempX -= allColumns[x].width;\n tempW += allColumns[x].width;\n }\n for (let x = column.sourceIndex + 1; x <= renderToCol; x++) {\n tempW += allColumns[x].width;\n }\n frozenRect = {\n x: tempX,\n y: cellY,\n width: tempW,\n height: cellH,\n };\n }\n return [frozenRect, contentRect];\n}\n//# sourceMappingURL=data-grid-render.walk.js.map","/* eslint-disable unicorn/prefer-ternary */\nimport { itemIsInRect } from \"../internal/data-grid/render/data-grid-lib.js\";\nexport function getClosestRect(rect, px, py, allowedDirections) {\n if (allowedDirections === \"any\")\n return combineRects(rect, { x: px, y: py, width: 1, height: 1 });\n if (allowedDirections === \"vertical\")\n px = rect.x;\n if (allowedDirections === \"horizontal\")\n py = rect.y;\n // Check if the point is inside the rectangle\n if (itemIsInRect([px, py], rect)) {\n return undefined;\n }\n // Calculate distances to the closest edges\n const distanceToLeft = px - rect.x;\n const distanceToRight = rect.x + rect.width - px;\n const distanceToTop = py - rect.y + 1;\n const distanceToBottom = rect.y + rect.height - py;\n // Find the minimum distance\n const minDistance = Math.min(allowedDirections === \"vertical\" ? Number.MAX_SAFE_INTEGER : distanceToLeft, allowedDirections === \"vertical\" ? Number.MAX_SAFE_INTEGER : distanceToRight, allowedDirections === \"horizontal\" ? Number.MAX_SAFE_INTEGER : distanceToTop, allowedDirections === \"horizontal\" ? Number.MAX_SAFE_INTEGER : distanceToBottom);\n // eslint-disable-next-line unicorn/prefer-switch\n if (minDistance === distanceToBottom) {\n return { x: rect.x, y: rect.y + rect.height, width: rect.width, height: py - rect.y - rect.height + 1 };\n }\n else if (minDistance === distanceToTop) {\n return { x: rect.x, y: py, width: rect.width, height: rect.y - py };\n }\n else if (minDistance === distanceToRight) {\n return { x: rect.x + rect.width, y: rect.y, width: px - rect.x - rect.width + 1, height: rect.height };\n }\n else {\n return { x: px, y: rect.y, width: rect.x - px, height: rect.height };\n }\n}\nexport function intersectRect(x1, y1, w1, h1, x2, y2, w2, h2) {\n return x1 <= x2 + w2 && x2 <= x1 + w1 && y1 <= y2 + h2 && y2 <= y1 + h1;\n}\nexport function pointInRect(rect, x, y) {\n return x >= rect.x && x <= rect.x + rect.width && y >= rect.y && y <= rect.y + rect.height;\n}\nexport function combineRects(a, b) {\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n const width = Math.max(a.x + a.width, b.x + b.width) - x;\n const height = Math.max(a.y + a.height, b.y + b.height) - y;\n return { x, y, width, height };\n}\nexport function rectContains(a, b) {\n return a.x <= b.x && a.y <= b.y && a.x + a.width >= b.x + b.width && a.y + a.height >= b.y + b.height;\n}\n/**\n * This function is absolutely critical for the performance of the fill handle and highlight regions. If you don't\n * hug rectanges when they are dashed and they are huge you will get giant GPU stalls. The reason for the mod is\n * if you don't respect the dash stroke size you will get weird artificts as the rectangle changes sizes (the dashes\n * won't line up from one frame to the next)\n */\nexport function hugRectToTarget(rect, width, height, mod) {\n // Combine checks for early return\n if (rect.x > width ||\n rect.y > height ||\n (rect.x < 0 && rect.y < 0 && rect.x + rect.width > width && rect.y + rect.height > height)) {\n return undefined;\n }\n // Direct return if the rectangle is completely within bounds\n if (rect.x >= 0 && rect.y >= 0 && rect.x + rect.width <= width && rect.y + rect.height <= height) {\n return rect;\n }\n // Pre-compute constants for boundaries, we are giving ourselves slop here because we don't want to have weird\n // issues when scaling is applied. 4px is more than enough slop.\n const leftMax = -4;\n const topMax = -4;\n const rightMax = width + 4;\n const bottomMax = height + 4;\n // Pre-compute boundary overflows\n const leftOverflow = leftMax - rect.x;\n const rightOverflow = rect.x + rect.width - rightMax;\n const topOverflow = topMax - rect.y;\n const bottomOverflow = rect.y + rect.height - bottomMax;\n // Adjust if necessary, using simplified calculations\n const left = leftOverflow > 0 ? rect.x + Math.floor(leftOverflow / mod) * mod : rect.x;\n const right = rightOverflow > 0 ? rect.x + rect.width - Math.floor(rightOverflow / mod) * mod : rect.x + rect.width;\n const top = topOverflow > 0 ? rect.y + Math.floor(topOverflow / mod) * mod : rect.y;\n const bottom = bottomOverflow > 0 ? rect.y + rect.height - Math.floor(bottomOverflow / mod) * mod : rect.y + rect.height;\n return { x: left, y: top, width: right - left, height: bottom - top };\n}\nexport function splitRectIntoRegions(rect, splitIndicies, width, height, splitLocations) {\n const [lSplit, tSplit, rSplit, bSplit] = splitIndicies;\n const [lClip, tClip, rClip, bClip] = splitLocations;\n const { x: inX, y: inY, width: inW, height: inH } = rect;\n const result = [];\n if (inW <= 0 || inH <= 0)\n return result;\n const inRight = inX + inW;\n const inBottom = inY + inH;\n // The goal is to split the inbound rect into up to 9 regions based on the provided split indicies which are\n // more or less cut lines. The cut lines are whole numbers as is the rect. We are dividing cells on a table.\n // In theory there can be up to 9 regions returned, so we need to be careful to make sure we get them all and\n // not return any empty regions.\n // compute some handy values\n const isOverLeft = inX < lSplit;\n const isOverTop = inY < tSplit;\n const isOverRight = inX + inW > rSplit;\n const isOverBottom = inY + inH > bSplit;\n const isOverCenterVert = (inX >= lSplit && inX < rSplit) ||\n (inRight > lSplit && inRight <= rSplit) ||\n (inX < lSplit && inRight > rSplit);\n const isOverCenterHoriz = (inY >= tSplit && inY < bSplit) ||\n (inBottom > tSplit && inBottom <= bSplit) ||\n (inY < tSplit && inBottom > bSplit);\n const isOverCenter = isOverCenterVert && isOverCenterHoriz;\n // center\n if (isOverCenter) {\n const x = Math.max(inX, lSplit);\n const y = Math.max(inY, tSplit);\n const right = Math.min(inRight, rSplit);\n const bottom = Math.min(inBottom, bSplit);\n result.push({\n rect: { x, y, width: right - x, height: bottom - y },\n clip: {\n x: lClip,\n y: tClip,\n width: rClip - lClip + 1,\n height: bClip - tClip + 1,\n },\n });\n }\n // top left\n if (isOverLeft && isOverTop) {\n const x = inX;\n const y = inY;\n const right = Math.min(inRight, lSplit);\n const bottom = Math.min(inBottom, tSplit);\n result.push({\n rect: {\n x,\n y,\n width: right - x,\n height: bottom - y,\n },\n clip: {\n x: 0,\n y: 0,\n width: lClip + 1,\n height: tClip + 1,\n },\n });\n }\n // top center\n if (isOverTop && isOverCenterVert) {\n const x = Math.max(inX, lSplit);\n const y = inY;\n const right = Math.min(inRight, rSplit);\n const bottom = Math.min(inBottom, tSplit);\n result.push({\n rect: {\n x,\n y,\n width: right - x,\n height: bottom - y,\n },\n clip: {\n x: lClip,\n y: 0,\n width: rClip - lClip + 1,\n height: tClip + 1,\n },\n });\n }\n // top right\n if (isOverTop && isOverRight) {\n const x = Math.max(inX, rSplit);\n const y = inY;\n const right = inRight;\n const bottom = Math.min(inBottom, tSplit);\n result.push({\n rect: {\n x,\n y,\n width: right - x,\n height: bottom - y,\n },\n clip: {\n x: rClip,\n y: 0,\n width: width - rClip + 1,\n height: tClip + 1,\n },\n });\n }\n // center left\n if (isOverLeft && isOverCenterHoriz) {\n const x = inX;\n const y = Math.max(inY, tSplit);\n const right = Math.min(inRight, lSplit);\n const bottom = Math.min(inBottom, bSplit);\n result.push({\n rect: {\n x,\n y,\n width: right - x,\n height: bottom - y,\n },\n clip: {\n x: 0,\n y: tClip,\n width: lClip + 1,\n height: bClip - tClip + 1,\n },\n });\n }\n // center right\n if (isOverRight && isOverCenterHoriz) {\n const x = Math.max(inX, rSplit);\n const y = Math.max(inY, tSplit);\n const right = inRight;\n const bottom = Math.min(inBottom, bSplit);\n result.push({\n rect: {\n x,\n y,\n width: right - x,\n height: bottom - y,\n },\n clip: {\n x: rClip,\n y: tClip,\n width: width - rClip + 1,\n height: bClip - tClip + 1,\n },\n });\n }\n // bottom left\n if (isOverLeft && isOverBottom) {\n const x = inX;\n const y = Math.max(inY, bSplit);\n const right = Math.min(inRight, lSplit);\n const bottom = inBottom;\n result.push({\n rect: {\n x,\n y,\n width: right - x,\n height: bottom - y,\n },\n clip: {\n x: 0,\n y: bClip,\n width: lClip + 1,\n height: height - bClip + 1,\n },\n });\n }\n // bottom center\n if (isOverBottom && isOverCenterVert) {\n const x = Math.max(inX, lSplit);\n const y = Math.max(inY, bSplit);\n const right = Math.min(inRight, rSplit);\n const bottom = inBottom;\n result.push({\n rect: {\n x,\n y,\n width: right - x,\n height: bottom - y,\n },\n clip: {\n x: lClip,\n y: bClip,\n width: rClip - lClip + 1,\n height: height - bClip + 1,\n },\n });\n }\n // bottom right\n if (isOverRight && isOverBottom) {\n const x = Math.max(inX, rSplit);\n const y = Math.max(inY, bSplit);\n const right = inRight;\n const bottom = inBottom;\n result.push({\n rect: {\n x,\n y,\n width: right - x,\n height: bottom - y,\n },\n clip: {\n x: rClip,\n y: bClip,\n width: width - rClip + 1,\n height: height - bClip + 1,\n },\n });\n }\n return result;\n}\n//# sourceMappingURL=math.js.map","/* eslint-disable sonarjs/no-duplicate-string */\n/* eslint-disable unicorn/no-for-loop */\nimport { CompactSelection, GridColumnIcon, GridCellKind, isInnerOnlyCell, } from \"../data-grid-types.js\";\nimport { CellSet } from \"../cell-set.js\";\nimport { cellIsSelected, cellIsInRange, getFreezeTrailingHeight, drawLastUpdateUnderlay, } from \"./data-grid-lib.js\";\nimport { mergeAndRealizeTheme } from \"../../../common/styles.js\";\nimport { blend } from \"../color-parser.js\";\nimport { intersectRect } from \"../../../common/math.js\";\nimport { getSkipPoint, getSpanBounds, walkColumns, walkRowsInCol } from \"./data-grid-render.walk.js\";\nconst loadingCell = {\n kind: GridCellKind.Loading,\n allowOverlay: false,\n};\n// preppable items:\n// - font\n// - fillStyle\n// Column draw loop prep cycle\n// - Prep item\n// - Prep sets props\n// - Prep returns list of cared about props\n// - Draw item\n// - Loop may set some items, if present in args list, set undefined\n// - Prep next item, giving previous result\n// - If next item type is different, de-prep\n// - Result per column\nexport function drawCells(ctx, effectiveColumns, allColumns, height, totalHeaderHeight, translateX, translateY, cellYOffset, rows, getRowHeight, getCellContent, getGroupDetails, getRowThemeOverride, disabledRows, isFocused, drawFocus, freezeTrailingRows, hasAppendRow, drawRegions, damage, selection, prelightCells, highlightRegions, imageLoader, spriteManager, hoverValues, hoverInfo, drawCellCallback, hyperWrapping, outerTheme, enqueue, renderStateProvider, getCellRenderer, overrideCursor, minimumCellWidth) {\n let toDraw = damage?.size ?? Number.MAX_SAFE_INTEGER;\n const frameTime = performance.now();\n let font = outerTheme.baseFontFull;\n ctx.font = font;\n const deprepArg = { ctx };\n const cellIndex = [0, 0];\n const freezeTrailingRowsHeight = freezeTrailingRows > 0 ? getFreezeTrailingHeight(rows, freezeTrailingRows, getRowHeight) : 0;\n let result;\n let handledSpans = undefined;\n const skipPoint = getSkipPoint(drawRegions);\n walkColumns(effectiveColumns, cellYOffset, translateX, translateY, totalHeaderHeight, (c, drawX, colDrawStartY, clipX, startRow) => {\n const diff = Math.max(0, clipX - drawX);\n const colDrawX = drawX + diff;\n const colDrawY = totalHeaderHeight + 1;\n const colWidth = c.width - diff;\n const colHeight = height - totalHeaderHeight - 1;\n if (drawRegions.length > 0) {\n let found = false;\n for (let i = 0; i < drawRegions.length; i++) {\n const dr = drawRegions[i];\n if (intersectRect(colDrawX, colDrawY, colWidth, colHeight, dr.x, dr.y, dr.width, dr.height)) {\n found = true;\n break;\n }\n }\n if (!found)\n return;\n }\n const reclip = () => {\n ctx.save();\n ctx.beginPath();\n ctx.rect(colDrawX, colDrawY, colWidth, colHeight);\n ctx.clip();\n };\n const colSelected = selection.columns.hasIndex(c.sourceIndex);\n const groupTheme = getGroupDetails(c.group ?? \"\").overrideTheme;\n const colTheme = c.themeOverride === undefined && groupTheme === undefined\n ? outerTheme\n : mergeAndRealizeTheme(outerTheme, groupTheme, c.themeOverride);\n const colFont = colTheme.baseFontFull;\n if (colFont !== font) {\n font = colFont;\n ctx.font = colFont;\n }\n reclip();\n let prepResult = undefined;\n walkRowsInCol(startRow, colDrawStartY, height, rows, getRowHeight, freezeTrailingRows, hasAppendRow, skipPoint, (drawY, row, rh, isSticky, isTrailingRow) => {\n if (row < 0)\n return;\n cellIndex[0] = c.sourceIndex;\n cellIndex[1] = row;\n // if (damage !== undefined && !damage.some(d => d[0] === c.sourceIndex && d[1] === row)) {\n // return;\n // }\n // if (\n // drawRegions.length > 0 &&\n // !drawRegions.some(dr => intersectRect(drawX, drawY, c.width, rh, dr.x, dr.y, dr.width, dr.height))\n // ) {\n // return;\n // }\n // These are dumb versions of the above. I cannot for the life of believe that this matters but this is\n // the tightest part of the draw loop and the allocations above actually has a very measurable impact\n // on performance. For the love of all that is unholy please keep checking this again in the future.\n // As soon as this doesn't have any impact of note go back to the saner looking code. The smoke test\n // here is to scroll to the bottom of a test case first, then scroll back up while profiling and see\n // how many major GC collections you get. These allocate a lot of objects.\n if (damage !== undefined && !damage.has(cellIndex)) {\n return;\n }\n if (drawRegions.length > 0) {\n let found = false;\n for (let i = 0; i < drawRegions.length; i++) {\n const dr = drawRegions[i];\n if (intersectRect(drawX, drawY, c.width, rh, dr.x, dr.y, dr.width, dr.height)) {\n found = true;\n break;\n }\n }\n if (!found)\n return;\n }\n const rowSelected = selection.rows.hasIndex(row);\n const rowDisabled = disabledRows.hasIndex(row);\n const cell = row < rows ? getCellContent(cellIndex) : loadingCell;\n let cellX = drawX;\n let cellWidth = c.width;\n let drawingSpan = false;\n let skipContents = false;\n if (cell.span !== undefined) {\n const [startCol, endCol] = cell.span;\n const spanKey = `${row},${startCol},${endCol},${c.sticky}`; //alloc\n if (handledSpans === undefined)\n handledSpans = new Set();\n if (!handledSpans.has(spanKey)) {\n const areas = getSpanBounds(cell.span, drawX, drawY, c.width, rh, c, allColumns);\n const area = c.sticky ? areas[0] : areas[1];\n if (!c.sticky && areas[0] !== undefined) {\n skipContents = true;\n }\n if (area !== undefined) {\n cellX = area.x;\n cellWidth = area.width;\n handledSpans.add(spanKey);\n ctx.restore();\n prepResult = undefined;\n ctx.save();\n ctx.beginPath();\n const d = Math.max(0, clipX - area.x);\n ctx.rect(area.x + d, drawY, area.width - d, rh);\n if (result === undefined) {\n result = [];\n }\n result.push({\n x: area.x + d,\n y: drawY,\n width: area.width - d,\n height: rh,\n });\n ctx.clip();\n drawingSpan = true;\n }\n }\n else {\n toDraw--;\n return;\n }\n }\n const rowTheme = getRowThemeOverride?.(row);\n const trailingTheme = isTrailingRow && c.trailingRowOptions?.themeOverride !== undefined\n ? c.trailingRowOptions?.themeOverride\n : undefined;\n const theme = cell.themeOverride === undefined && rowTheme === undefined && trailingTheme === undefined\n ? colTheme\n : mergeAndRealizeTheme(colTheme, rowTheme, trailingTheme, cell.themeOverride); //alloc\n ctx.beginPath();\n const isSelected = cellIsSelected(cellIndex, cell, selection);\n let accentCount = cellIsInRange(cellIndex, cell, selection, drawFocus);\n const spanIsHighlighted = cell.span !== undefined &&\n selection.columns.some(index => cell.span !== undefined && index >= cell.span[0] && index <= cell.span[1] //alloc\n );\n if (isSelected && !isFocused && drawFocus) {\n accentCount = 0;\n }\n else if (isSelected && drawFocus) {\n accentCount = Math.max(accentCount, 1);\n }\n if (spanIsHighlighted) {\n accentCount++;\n }\n if (!isSelected) {\n if (rowSelected)\n accentCount++;\n if (colSelected && !isTrailingRow)\n accentCount++;\n }\n const bgCell = cell.kind === GridCellKind.Protected ? theme.bgCellMedium : theme.bgCell;\n let fill;\n if (isSticky || bgCell !== outerTheme.bgCell) {\n fill = blend(bgCell, fill);\n }\n if (accentCount > 0 || rowDisabled) {\n if (rowDisabled) {\n fill = blend(theme.bgHeader, fill);\n }\n for (let i = 0; i < accentCount; i++) {\n fill = blend(theme.accentLight, fill);\n }\n }\n else if (prelightCells !== undefined) {\n for (const pre of prelightCells) {\n if (pre[0] === c.sourceIndex && pre[1] === row) {\n fill = blend(theme.bgSearchResult, fill);\n break;\n }\n }\n }\n if (highlightRegions !== undefined) {\n for (let i = 0; i < highlightRegions.length; i++) {\n const region = highlightRegions[i];\n const r = region.range;\n if (region.style !== \"solid-outline\" &&\n r.x <= c.sourceIndex &&\n c.sourceIndex < r.x + r.width &&\n r.y <= row &&\n row < r.y + r.height) {\n fill = blend(region.color, fill);\n }\n }\n }\n let didDamageClip = false;\n if (damage !== undefined) {\n // we want to clip each cell individually rather than form a super clip region. The reason for\n // this is passing too many clip regions to the GPU at once can cause a performance hit. This\n // allows us to damage a large number of cells at once without issue.\n const top = drawY + 1;\n const bottom = isSticky\n ? top + rh - 1\n : Math.min(top + rh - 1, height - freezeTrailingRowsHeight);\n const h = bottom - top;\n // however, not clipping at all is even better. We want to clip if we are the left most col\n // or overlapping the bottom clip area.\n if (h !== rh - 1 || cellX + 1 <= clipX) {\n didDamageClip = true;\n ctx.save();\n ctx.beginPath();\n ctx.rect(cellX + 1, top, cellWidth - 1, h);\n ctx.clip();\n }\n // we also need to make sure to wipe the contents. Since the fill can do that lets repurpose\n // that call to avoid an extra draw call.\n fill = fill === undefined ? theme.bgCell : blend(fill, theme.bgCell);\n }\n const isLastColumn = c.sourceIndex === allColumns.length - 1;\n const isLastRow = row === rows - 1;\n if (fill !== undefined) {\n ctx.fillStyle = fill;\n if (prepResult !== undefined) {\n prepResult.fillStyle = fill;\n }\n if (damage !== undefined) {\n // this accounts for the fill handle outline being drawn inset on these cells. We do this\n // because technically the bottom right corner of the outline are on other cells.\n ctx.fillRect(cellX + 1, drawY + 1, cellWidth - (isLastColumn ? 2 : 1), rh - (isLastRow ? 2 : 1));\n }\n else {\n ctx.fillRect(cellX, drawY, cellWidth, rh);\n }\n }\n if (cell.style === \"faded\") {\n ctx.globalAlpha = 0.6;\n }\n let hoverValue;\n for (let i = 0; i < hoverValues.length; i++) {\n const hv = hoverValues[i];\n if (hv.item[0] === c.sourceIndex && hv.item[1] === row) {\n hoverValue = hv;\n break;\n }\n }\n if (cellWidth > minimumCellWidth && !skipContents) {\n const cellFont = theme.baseFontFull;\n if (cellFont !== font) {\n ctx.font = cellFont;\n font = cellFont;\n }\n prepResult = drawCell(ctx, cell, c.sourceIndex, row, isLastColumn, isLastRow, cellX, drawY, cellWidth, rh, accentCount > 0, theme, fill ?? theme.bgCell, imageLoader, spriteManager, hoverValue?.hoverAmount ?? 0, hoverInfo, hyperWrapping, frameTime, drawCellCallback, prepResult, enqueue, renderStateProvider, getCellRenderer, overrideCursor);\n }\n if (didDamageClip) {\n ctx.restore();\n }\n if (cell.style === \"faded\") {\n ctx.globalAlpha = 1;\n }\n toDraw--;\n if (drawingSpan) {\n ctx.restore();\n prepResult?.deprep?.(deprepArg);\n prepResult = undefined;\n reclip();\n font = colFont;\n ctx.font = colFont;\n }\n return toDraw <= 0;\n });\n ctx.restore();\n return toDraw <= 0;\n });\n return result;\n}\nconst allocatedItem = [0, 0];\nconst reusableRect = { x: 0, y: 0, width: 0, height: 0 };\nconst drawState = [undefined, () => undefined];\nlet animationFrameRequested = false;\nfunction animRequest() {\n animationFrameRequested = true;\n}\nexport function drawCell(ctx, cell, col, row, isLastCol, isLastRow, x, y, w, h, highlighted, theme, finalCellFillColor, imageLoader, spriteManager, hoverAmount, hoverInfo, hyperWrapping, frameTime, drawCellCallback, lastPrep, enqueue, renderStateProvider, getCellRenderer, overrideCursor) {\n let hoverX;\n let hoverY;\n if (hoverInfo !== undefined && hoverInfo[0][0] === col && hoverInfo[0][1] === row) {\n hoverX = hoverInfo[1][0];\n hoverY = hoverInfo[1][1];\n }\n let result = undefined;\n allocatedItem[0] = col;\n allocatedItem[1] = row;\n reusableRect.x = x;\n reusableRect.y = y;\n reusableRect.width = w;\n reusableRect.height = h;\n drawState[0] = renderStateProvider.getValue(allocatedItem);\n drawState[1] = (val) => renderStateProvider.setValue(allocatedItem, val); //alloc\n animationFrameRequested = false;\n const args = {\n //alloc\n ctx,\n theme,\n col,\n row,\n cell,\n rect: reusableRect,\n highlighted,\n cellFillColor: finalCellFillColor,\n hoverAmount,\n frameTime,\n hoverX,\n drawState,\n hoverY,\n imageLoader,\n spriteManager,\n hyperWrapping,\n overrideCursor: hoverX !== undefined ? overrideCursor : undefined,\n requestAnimationFrame: animRequest,\n };\n const needsAnim = drawLastUpdateUnderlay(args, cell.lastUpdated, frameTime, lastPrep, isLastCol, isLastRow);\n const r = getCellRenderer(cell);\n if (r !== undefined) {\n if (lastPrep?.renderer !== r) {\n lastPrep?.deprep?.(args);\n lastPrep = undefined;\n }\n const partialPrepResult = r.drawPrep?.(args, lastPrep);\n if (drawCellCallback !== undefined && !isInnerOnlyCell(args.cell)) {\n drawCellCallback(args, () => r.draw(args, cell));\n }\n else {\n r.draw(args, cell);\n }\n result =\n partialPrepResult === undefined\n ? undefined\n : {\n deprep: partialPrepResult?.deprep,\n fillStyle: partialPrepResult?.fillStyle,\n font: partialPrepResult?.font,\n renderer: r,\n };\n }\n if (needsAnim || animationFrameRequested)\n enqueue?.(allocatedItem);\n return result;\n}\n//# sourceMappingURL=data-grid-render.cells.js.map","import { assertNever } from \"../../../common/support.js\";\nimport { getSquareWidth, getSquareXPosFromAlign, getSquareBB, pointIsWithinBB } from \"../../../common/utils.js\";\nimport { roundedRect } from \"./data-grid-lib.js\";\nimport { BooleanEmpty, BooleanIndeterminate } from \"../data-grid-types.js\";\nexport function drawCheckbox(ctx, theme, checked, x, y, width, height, highlighted, hoverX = -20, hoverY = -20, maxSize = 32, alignment = \"center\", style = \"square\") {\n const centerY = Math.floor(y + height / 2);\n const rectBordRadius = style === \"circle\" ? 10000 : theme.roundingRadius ?? 4;\n let checkBoxWidth = getSquareWidth(maxSize, height, theme.cellVerticalPadding);\n let checkBoxHalfWidth = checkBoxWidth / 2;\n const posX = getSquareXPosFromAlign(alignment, x, width, theme.cellHorizontalPadding, checkBoxWidth);\n const bb = getSquareBB(posX, centerY, checkBoxWidth);\n const hovered = pointIsWithinBB(x + hoverX, y + hoverY, bb);\n switch (checked) {\n case true: {\n ctx.beginPath();\n roundedRect(ctx, posX - checkBoxWidth / 2, centerY - checkBoxWidth / 2, checkBoxWidth, checkBoxWidth, rectBordRadius);\n if (style === \"circle\") {\n checkBoxHalfWidth *= 0.8;\n checkBoxWidth *= 0.8;\n }\n ctx.fillStyle = highlighted ? theme.accentColor : theme.textMedium;\n ctx.fill();\n ctx.beginPath();\n ctx.moveTo(posX - checkBoxHalfWidth + checkBoxWidth / 4.23, centerY - checkBoxHalfWidth + checkBoxWidth / 1.97);\n ctx.lineTo(posX - checkBoxHalfWidth + checkBoxWidth / 2.42, centerY - checkBoxHalfWidth + checkBoxWidth / 1.44);\n ctx.lineTo(posX - checkBoxHalfWidth + checkBoxWidth / 1.29, centerY - checkBoxHalfWidth + checkBoxWidth / 3.25);\n ctx.strokeStyle = theme.bgCell;\n ctx.lineJoin = \"round\";\n ctx.lineCap = \"round\";\n ctx.lineWidth = 1.9;\n ctx.stroke();\n break;\n }\n case BooleanEmpty:\n case false: {\n ctx.beginPath();\n roundedRect(ctx, posX - checkBoxWidth / 2 + 0.5, centerY - checkBoxWidth / 2 + 0.5, checkBoxWidth - 1, checkBoxWidth - 1, rectBordRadius);\n ctx.lineWidth = 1;\n ctx.strokeStyle = hovered ? theme.textDark : theme.textMedium;\n ctx.stroke();\n break;\n }\n case BooleanIndeterminate: {\n ctx.beginPath();\n roundedRect(ctx, posX - checkBoxWidth / 2, centerY - checkBoxWidth / 2, checkBoxWidth, checkBoxWidth, rectBordRadius);\n ctx.fillStyle = hovered ? theme.textMedium : theme.textLight;\n ctx.fill();\n if (style === \"circle\") {\n checkBoxHalfWidth *= 0.8;\n checkBoxWidth *= 0.8;\n }\n ctx.beginPath();\n ctx.moveTo(posX - checkBoxWidth / 3, centerY);\n ctx.lineTo(posX + checkBoxWidth / 3, centerY);\n ctx.strokeStyle = theme.bgCell;\n ctx.lineCap = \"round\";\n ctx.lineWidth = 1.9;\n ctx.stroke();\n break;\n }\n default:\n assertNever(checked);\n }\n}\n//# sourceMappingURL=draw-checkbox.js.map","import { pointInRect } from \"../../../common/math.js\";\nimport { mergeAndRealizeTheme } from \"../../../common/styles.js\";\nimport { direction } from \"../../../common/utils.js\";\nimport { withAlpha } from \"../color-parser.js\";\nimport { GridColumnMenuIcon } from \"../data-grid-types.js\";\nimport { drawMenuDots, getMiddleCenterBias, roundedPoly } from \"./data-grid-lib.js\";\nimport { walkColumns, walkGroups } from \"./data-grid-render.walk.js\";\nimport { drawCheckbox } from \"./draw-checkbox.js\";\nexport function drawGridHeaders(ctx, effectiveCols, enableGroups, hovered, width, translateX, headerHeight, groupHeaderHeight, dragAndDropState, isResizing, selection, outerTheme, spriteManager, hoverValues, verticalBorder, getGroupDetails, damage, drawHeaderCallback, touchMode) {\n const totalHeaderHeight = headerHeight + groupHeaderHeight;\n if (totalHeaderHeight <= 0)\n return;\n ctx.fillStyle = outerTheme.bgHeader;\n ctx.fillRect(0, 0, width, totalHeaderHeight);\n const [hCol, hRow] = hovered?.[0] ?? [];\n const font = outerTheme.headerFontFull;\n // Assinging the context font too much can be expensive, it can be worth it to minimze this\n ctx.font = font;\n walkColumns(effectiveCols, 0, translateX, 0, totalHeaderHeight, (c, x, _y, clipX) => {\n if (damage !== undefined && !damage.has([c.sourceIndex, -1]))\n return;\n const diff = Math.max(0, clipX - x);\n ctx.save();\n ctx.beginPath();\n ctx.rect(x + diff, groupHeaderHeight, c.width - diff, headerHeight);\n ctx.clip();\n const groupTheme = getGroupDetails(c.group ?? \"\").overrideTheme;\n const theme = c.themeOverride === undefined && groupTheme === undefined\n ? outerTheme\n : mergeAndRealizeTheme(outerTheme, groupTheme, c.themeOverride);\n if (theme.bgHeader !== outerTheme.bgHeader) {\n ctx.fillStyle = theme.bgHeader;\n ctx.fill();\n }\n if (theme !== outerTheme) {\n ctx.font = theme.baseFontFull;\n }\n const selected = selection.columns.hasIndex(c.sourceIndex);\n const noHover = dragAndDropState !== undefined || isResizing;\n const hoveredBoolean = !noHover && hRow === -1 && hCol === c.sourceIndex;\n const hover = noHover\n ? 0\n : hoverValues.find(s => s.item[0] === c.sourceIndex && s.item[1] === -1)?.hoverAmount ?? 0;\n const hasSelectedCell = selection?.current !== undefined && selection.current.cell[0] === c.sourceIndex;\n const bgFillStyle = selected ? theme.accentColor : hasSelectedCell ? theme.bgHeaderHasFocus : theme.bgHeader;\n const y = enableGroups ? groupHeaderHeight : 0;\n const xOffset = c.sourceIndex === 0 ? 0 : 1;\n if (selected) {\n ctx.fillStyle = bgFillStyle;\n ctx.fillRect(x + xOffset, y, c.width - xOffset, headerHeight);\n }\n else if (hasSelectedCell || hover > 0) {\n ctx.beginPath();\n ctx.rect(x + xOffset, y, c.width - xOffset, headerHeight);\n if (hasSelectedCell) {\n ctx.fillStyle = theme.bgHeaderHasFocus;\n ctx.fill();\n }\n if (hover > 0) {\n ctx.globalAlpha = hover;\n ctx.fillStyle = theme.bgHeaderHovered;\n ctx.fill();\n ctx.globalAlpha = 1;\n }\n }\n drawHeader(ctx, x, y, c.width, headerHeight, c, selected, theme, hoveredBoolean, hasSelectedCell, hover, spriteManager, drawHeaderCallback, touchMode);\n ctx.restore();\n });\n if (enableGroups) {\n drawGroups(ctx, effectiveCols, width, translateX, groupHeaderHeight, hovered, outerTheme, spriteManager, hoverValues, verticalBorder, getGroupDetails, damage);\n }\n}\nexport function drawGroups(ctx, effectiveCols, width, translateX, groupHeaderHeight, hovered, theme, spriteManager, _hoverValues, verticalBorder, getGroupDetails, damage) {\n const xPad = 8;\n const [hCol, hRow] = hovered?.[0] ?? [];\n let finalX = 0;\n walkGroups(effectiveCols, width, translateX, groupHeaderHeight, (span, groupName, x, y, w, h) => {\n if (damage !== undefined &&\n !damage.hasItemInRectangle({\n x: span[0],\n y: -2,\n width: span[1] - span[0] + 1,\n height: 1,\n }))\n return;\n ctx.save();\n ctx.beginPath();\n ctx.rect(x, y, w, h);\n ctx.clip();\n const group = getGroupDetails(groupName);\n const groupTheme = group?.overrideTheme === undefined ? theme : mergeAndRealizeTheme(theme, group.overrideTheme);\n const isHovered = hRow === -2 && hCol !== undefined && hCol >= span[0] && hCol <= span[1];\n const fillColor = isHovered ? groupTheme.bgHeaderHovered : groupTheme.bgHeader;\n if (fillColor !== theme.bgHeader) {\n ctx.fillStyle = fillColor;\n ctx.fill();\n }\n ctx.fillStyle = groupTheme.textGroupHeader ?? groupTheme.textHeader;\n if (group !== undefined) {\n let drawX = x;\n if (group.icon !== undefined) {\n spriteManager.drawSprite(group.icon, \"normal\", ctx, drawX + xPad, (groupHeaderHeight - 20) / 2, 20, groupTheme);\n drawX += 26;\n }\n ctx.fillText(group.name, drawX + xPad, groupHeaderHeight / 2 + getMiddleCenterBias(ctx, theme.headerFontFull));\n if (group.actions !== undefined && isHovered) {\n const actionBoxes = getActionBoundsForGroup({ x, y, width: w, height: h }, group.actions);\n ctx.beginPath();\n const fadeStartX = actionBoxes[0].x - 10;\n const fadeWidth = x + w - fadeStartX;\n ctx.rect(fadeStartX, 0, fadeWidth, groupHeaderHeight);\n const grad = ctx.createLinearGradient(fadeStartX, 0, fadeStartX + fadeWidth, 0);\n const trans = withAlpha(fillColor, 0);\n grad.addColorStop(0, trans);\n grad.addColorStop(10 / fadeWidth, fillColor);\n grad.addColorStop(1, fillColor);\n ctx.fillStyle = grad;\n ctx.fill();\n ctx.globalAlpha = 0.6;\n // eslint-disable-next-line prefer-const\n const [mouseX, mouseY] = hovered?.[1] ?? [-1, -1];\n for (let i = 0; i < group.actions.length; i++) {\n const action = group.actions[i];\n const box = actionBoxes[i];\n const actionHovered = pointInRect(box, mouseX + x, mouseY);\n if (actionHovered) {\n ctx.globalAlpha = 1;\n }\n spriteManager.drawSprite(action.icon, \"normal\", ctx, box.x + box.width / 2 - 10, box.y + box.height / 2 - 10, 20, groupTheme);\n if (actionHovered) {\n ctx.globalAlpha = 0.6;\n }\n }\n ctx.globalAlpha = 1;\n }\n }\n if (x !== 0 && verticalBorder(span[0])) {\n ctx.beginPath();\n ctx.moveTo(x + 0.5, 0);\n ctx.lineTo(x + 0.5, groupHeaderHeight);\n ctx.strokeStyle = theme.borderColor;\n ctx.lineWidth = 1;\n ctx.stroke();\n }\n ctx.restore();\n finalX = x + w;\n });\n ctx.beginPath();\n ctx.moveTo(finalX + 0.5, 0);\n ctx.lineTo(finalX + 0.5, groupHeaderHeight);\n ctx.moveTo(0, groupHeaderHeight + 0.5);\n ctx.lineTo(width, groupHeaderHeight + 0.5);\n ctx.strokeStyle = theme.borderColor;\n ctx.lineWidth = 1;\n ctx.stroke();\n}\nconst menuButtonSize = 30;\nexport function getHeaderMenuBounds(x, y, width, height, isRtl) {\n if (isRtl)\n return { x, y, width: menuButtonSize, height: Math.min(menuButtonSize, height) };\n return {\n x: x + width - menuButtonSize,\n y: Math.max(y, y + height / 2 - menuButtonSize / 2),\n width: menuButtonSize,\n height: Math.min(menuButtonSize, height),\n };\n}\nexport function getActionBoundsForGroup(box, actions) {\n const result = [];\n let x = box.x + box.width - 26 * actions.length;\n const y = box.y + box.height / 2 - 13;\n const height = 26;\n const width = 26;\n for (let i = 0; i < actions.length; i++) {\n result.push({\n x,\n y,\n width,\n height,\n });\n x += 26;\n }\n return result;\n}\nfunction drawHeaderInner(ctx, x, y, width, height, c, selected, theme, isHovered, hoverAmount, spriteManager, touchMode, isRtl, menuBounds) {\n if (c.rowMarker !== undefined) {\n const checked = c.rowMarkerChecked;\n if (checked !== true) {\n ctx.globalAlpha = hoverAmount;\n }\n drawCheckbox(ctx, theme, checked, x, y, width, height, false, undefined, undefined, 18, \"center\", c.rowMarker);\n if (checked !== true) {\n ctx.globalAlpha = 1;\n }\n return;\n }\n const xPad = theme.cellHorizontalPadding;\n const fillStyle = selected ? theme.textHeaderSelected : theme.textHeader;\n const shouldDrawMenu = c.hasMenu === true && (isHovered || (touchMode && selected));\n const dirScalar = isRtl ? -1 : 1;\n let drawX = isRtl ? x + width - xPad : x + xPad;\n if (c.icon !== undefined) {\n let variant = selected ? \"selected\" : \"normal\";\n if (c.style === \"highlight\") {\n variant = selected ? \"selected\" : \"special\";\n }\n const headerSize = theme.headerIconSize;\n spriteManager.drawSprite(c.icon, variant, ctx, isRtl ? drawX - headerSize : drawX, y + (height - headerSize) / 2, headerSize, theme);\n if (c.overlayIcon !== undefined) {\n spriteManager.drawSprite(c.overlayIcon, selected ? \"selected\" : \"special\", ctx, isRtl ? drawX - headerSize + 9 : drawX + 9, y + ((height - 18) / 2 + 6), 18, theme);\n }\n drawX += Math.ceil(headerSize * 1.3) * dirScalar;\n }\n if (shouldDrawMenu && c.hasMenu === true && width > 35) {\n const fadeWidth = 35;\n const fadeStart = isRtl ? fadeWidth : width - fadeWidth;\n const fadeEnd = isRtl ? fadeWidth * 0.7 : width - fadeWidth * 0.7;\n const fadeStartPercent = fadeStart / width;\n const fadeEndPercent = fadeEnd / width;\n const grad = ctx.createLinearGradient(x, 0, x + width, 0);\n const trans = withAlpha(fillStyle, 0);\n grad.addColorStop(isRtl ? 1 : 0, fillStyle);\n grad.addColorStop(fadeStartPercent, fillStyle);\n grad.addColorStop(fadeEndPercent, trans);\n grad.addColorStop(isRtl ? 0 : 1, trans);\n ctx.fillStyle = grad;\n }\n else {\n ctx.fillStyle = fillStyle;\n }\n if (isRtl) {\n ctx.textAlign = \"right\";\n }\n ctx.fillText(c.title, drawX, y + height / 2 + getMiddleCenterBias(ctx, theme.headerFontFull));\n if (isRtl) {\n ctx.textAlign = \"left\";\n }\n if (shouldDrawMenu && c.hasMenu === true) {\n if (c.menuIcon === undefined || c.menuIcon === GridColumnMenuIcon.Triangle) {\n // Draw the default triangle menu icon:\n ctx.beginPath();\n const triangleX = menuBounds.x + menuBounds.width / 2 - 5.5;\n const triangleY = menuBounds.y + menuBounds.height / 2 - 3;\n roundedPoly(ctx, [\n {\n x: triangleX,\n y: triangleY,\n },\n {\n x: triangleX + 11,\n y: triangleY,\n },\n {\n x: triangleX + 5.5,\n y: triangleY + 6,\n },\n ], 1);\n ctx.fillStyle = fillStyle;\n ctx.fill();\n }\n else if (c.menuIcon === GridColumnMenuIcon.Dots) {\n // Draw the three dots menu icon:\n ctx.beginPath();\n const dotsX = menuBounds.x + menuBounds.width / 2;\n const dotsY = menuBounds.y + menuBounds.height / 2;\n drawMenuDots(ctx, dotsX, dotsY);\n ctx.fillStyle = fillStyle;\n ctx.fill();\n }\n else {\n // Assume that the user has specified a valid sprite image as header icon:\n const iconX = menuBounds.x + (menuBounds.width - theme.headerIconSize) / 2;\n const iconY = menuBounds.y + (menuBounds.height - theme.headerIconSize) / 2;\n spriteManager.drawSprite(c.menuIcon, \"normal\", ctx, iconX, iconY, theme.headerIconSize, theme);\n }\n }\n}\nexport function drawHeader(ctx, x, y, width, height, c, selected, theme, isHovered, hasSelectedCell, hoverAmount, spriteManager, drawHeaderCallback, touchMode) {\n const isRtl = direction(c.title) === \"rtl\";\n const menuBounds = getHeaderMenuBounds(x, y, width, height, isRtl);\n if (drawHeaderCallback !== undefined) {\n drawHeaderCallback({\n ctx,\n theme,\n rect: { x, y, width, height },\n column: c,\n columnIndex: c.sourceIndex,\n isSelected: selected,\n hoverAmount,\n isHovered,\n hasSelectedCell,\n spriteManager,\n menuBounds,\n }, () => drawHeaderInner(ctx, x, y, width, height, c, selected, theme, isHovered, hoverAmount, spriteManager, touchMode, isRtl, menuBounds));\n }\n else {\n drawHeaderInner(ctx, x, y, width, height, c, selected, theme, isHovered, hoverAmount, spriteManager, touchMode, isRtl, menuBounds);\n }\n}\n//# sourceMappingURL=data-grid-render.header.js.map","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","var defineProperty = require('./_defineProperty');\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nmodule.exports = baseAssignValue;\n","/**\n * A specialized version of `baseAggregator` for arrays.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction arrayAggregator(array, setter, iteratee, accumulator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n var value = array[index];\n setter(accumulator, value, iteratee(value), array);\n }\n return accumulator;\n}\n\nmodule.exports = arrayAggregator;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nmodule.exports = createBaseFor;\n","var createBaseFor = require('./_createBaseFor');\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","var root = require('./_root'),\n stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n","var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","var baseTimes = require('./_baseTimes'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isIndex = require('./_isIndex'),\n isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = arrayLikeKeys;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeys = require('./_baseKeys'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n","var baseFor = require('./_baseFor'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n","var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nmodule.exports = createBaseEach;\n","var baseForOwn = require('./_baseForOwn'),\n createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n","var baseEach = require('./_baseEach');\n\n/**\n * Aggregates elements of `collection` on `accumulator` with keys transformed\n * by `iteratee` and values set by `setter`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction baseAggregator(collection, setter, iteratee, accumulator) {\n baseEach(collection, function(value, key, collection) {\n setter(accumulator, value, iteratee(value), collection);\n });\n return accumulator;\n}\n\nmodule.exports = baseAggregator;\n","var ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nmodule.exports = stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nmodule.exports = stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n","var ListCache = require('./_ListCache'),\n Map = require('./_Map'),\n MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nmodule.exports = stackSet;\n","var ListCache = require('./_ListCache'),\n stackClear = require('./_stackClear'),\n stackDelete = require('./_stackDelete'),\n stackGet = require('./_stackGet'),\n stackHas = require('./_stackHas'),\n stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arraySome;\n","var SetCache = require('./_SetCache'),\n arraySome = require('./_arraySome'),\n cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Check that cyclic values are equal.\n var arrStacked = stack.get(array);\n var othStacked = stack.get(other);\n if (arrStacked && othStacked) {\n return arrStacked == other && othStacked == array;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalArrays;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nmodule.exports = mapToArray;\n","var Symbol = require('./_Symbol'),\n Uint8Array = require('./_Uint8Array'),\n eq = require('./eq'),\n equalArrays = require('./_equalArrays'),\n mapToArray = require('./_mapToArray'),\n setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nmodule.exports = equalByTag;\n","var arrayPush = require('./_arrayPush'),\n isArray = require('./isArray');\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nmodule.exports = stubArray;\n","var arrayFilter = require('./_arrayFilter'),\n stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nmodule.exports = getSymbols;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbols = require('./_getSymbols'),\n keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n","var getAllKeys = require('./_getAllKeys');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Check that cyclic values are equal.\n var objStacked = stack.get(object);\n var othStacked = stack.get(other);\n if (objStacked && othStacked) {\n return objStacked == other && othStacked == object;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalObjects;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","var DataView = require('./_DataView'),\n Map = require('./_Map'),\n Promise = require('./_Promise'),\n Set = require('./_Set'),\n WeakMap = require('./_WeakMap'),\n baseGetTag = require('./_baseGetTag'),\n toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nmodule.exports = getTag;\n","var Stack = require('./_Stack'),\n equalArrays = require('./_equalArrays'),\n equalByTag = require('./_equalByTag'),\n equalObjects = require('./_equalObjects'),\n getTag = require('./_getTag'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n","var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n","var Stack = require('./_Stack'),\n baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\nmodule.exports = baseIsMatch;\n","var isObject = require('./isObject');\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n","var isStrictComparable = require('./_isStrictComparable'),\n keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\nmodule.exports = getMatchData;\n","/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\nmodule.exports = matchesStrictComparable;\n","var baseIsMatch = require('./_baseIsMatch'),\n getMatchData = require('./_getMatchData'),\n matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\nmodule.exports = baseMatches;\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","var baseHasIn = require('./_baseHasIn'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n","var baseIsEqual = require('./_baseIsEqual'),\n get = require('./get'),\n hasIn = require('./hasIn'),\n isKey = require('./_isKey'),\n isStrictComparable = require('./_isStrictComparable'),\n matchesStrictComparable = require('./_matchesStrictComparable'),\n toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n}\n\nmodule.exports = baseMatchesProperty;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = baseProperty;\n","var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\nmodule.exports = basePropertyDeep;\n","var baseProperty = require('./_baseProperty'),\n basePropertyDeep = require('./_basePropertyDeep'),\n isKey = require('./_isKey'),\n toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n","var baseMatches = require('./_baseMatches'),\n baseMatchesProperty = require('./_baseMatchesProperty'),\n identity = require('./identity'),\n isArray = require('./isArray'),\n property = require('./property');\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\nmodule.exports = baseIteratee;\n","var arrayAggregator = require('./_arrayAggregator'),\n baseAggregator = require('./_baseAggregator'),\n baseIteratee = require('./_baseIteratee'),\n isArray = require('./isArray');\n\n/**\n * Creates a function like `_.groupBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} [initializer] The accumulator object initializer.\n * @returns {Function} Returns the new aggregator function.\n */\nfunction createAggregator(setter, initializer) {\n return function(collection, iteratee) {\n var func = isArray(collection) ? arrayAggregator : baseAggregator,\n accumulator = initializer ? initializer() : {};\n\n return func(collection, setter, baseIteratee(iteratee, 2), accumulator);\n };\n}\n\nmodule.exports = createAggregator;\n","var baseAssignValue = require('./_baseAssignValue'),\n createAggregator = require('./_createAggregator');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': [4.2], '6': [6.1, 6.3] }\n *\n * // The `_.property` iteratee shorthand.\n * _.groupBy(['one', 'two', 'three'], 'length');\n * // => { '3': ['one', 'two'], '5': ['three'] }\n */\nvar groupBy = createAggregator(function(result, value, key) {\n if (hasOwnProperty.call(result, key)) {\n result[key].push(value);\n } else {\n baseAssignValue(result, key, [value]);\n }\n});\n\nmodule.exports = groupBy;\n","/* eslint-disable sonarjs/no-duplicate-string */\n/* eslint-disable unicorn/no-for-loop */\nimport { CompactSelection } from \"../data-grid-types.js\";\nimport { CellSet } from \"../cell-set.js\";\nimport groupBy from \"lodash/groupBy.js\";\nimport { getStickyWidth, getFreezeTrailingHeight } from \"./data-grid-lib.js\";\nimport { mergeAndRealizeTheme } from \"../../../common/styles.js\";\nimport { blendCache } from \"../color-parser.js\";\nimport { intersectRect } from \"../../../common/math.js\";\nimport { getSkipPoint, walkColumns, walkRowsInCol } from \"./data-grid-render.walk.js\";\nimport {} from \"./data-grid-render.cells.js\";\nexport function drawBlanks(ctx, effectiveColumns, allColumns, width, height, totalHeaderHeight, translateX, translateY, cellYOffset, rows, getRowHeight, getRowTheme, selectedRows, disabledRows, freezeTrailingRows, hasAppendRow, drawRegions, damage, theme) {\n if (damage !== undefined ||\n effectiveColumns[effectiveColumns.length - 1] !== allColumns[effectiveColumns.length - 1])\n return;\n const skipPoint = getSkipPoint(drawRegions);\n walkColumns(effectiveColumns, cellYOffset, translateX, translateY, totalHeaderHeight, (c, drawX, colDrawY, clipX, startRow) => {\n if (c !== effectiveColumns[effectiveColumns.length - 1])\n return;\n drawX += c.width;\n const x = Math.max(drawX, clipX);\n if (x > width)\n return;\n ctx.save();\n ctx.beginPath();\n ctx.rect(x, totalHeaderHeight + 1, 10000, height - totalHeaderHeight - 1);\n ctx.clip();\n walkRowsInCol(startRow, colDrawY, height, rows, getRowHeight, freezeTrailingRows, hasAppendRow, skipPoint, (drawY, row, rh, isSticky) => {\n if (!isSticky &&\n drawRegions.length > 0 &&\n !drawRegions.some(dr => intersectRect(drawX, drawY, 10000, rh, dr.x, dr.y, dr.width, dr.height))) {\n return;\n }\n const rowSelected = selectedRows.hasIndex(row);\n const rowDisabled = disabledRows.hasIndex(row);\n ctx.beginPath();\n const rowTheme = getRowTheme?.(row);\n const blankTheme = rowTheme === undefined ? theme : mergeAndRealizeTheme(theme, rowTheme);\n if (blankTheme.bgCell !== theme.bgCell) {\n ctx.fillStyle = blankTheme.bgCell;\n ctx.fillRect(drawX, drawY, 10000, rh);\n }\n if (rowDisabled) {\n ctx.fillStyle = blankTheme.bgHeader;\n ctx.fillRect(drawX, drawY, 10000, rh);\n }\n if (rowSelected) {\n ctx.fillStyle = blankTheme.accentLight;\n ctx.fillRect(drawX, drawY, 10000, rh);\n }\n });\n ctx.restore();\n });\n}\nexport function overdrawStickyBoundaries(ctx, effectiveCols, width, height, freezeTrailingRows, rows, verticalBorder, getRowHeight, theme) {\n let drawFreezeBorder = false;\n for (const c of effectiveCols) {\n if (c.sticky)\n continue;\n drawFreezeBorder = verticalBorder(c.sourceIndex);\n break;\n }\n const hColor = theme.horizontalBorderColor ?? theme.borderColor;\n const vColor = theme.borderColor;\n const drawX = drawFreezeBorder ? getStickyWidth(effectiveCols) : 0;\n let vStroke;\n if (drawX !== 0) {\n vStroke = blendCache(vColor, theme.bgCell);\n ctx.beginPath();\n ctx.moveTo(drawX + 0.5, 0);\n ctx.lineTo(drawX + 0.5, height);\n ctx.strokeStyle = vStroke;\n ctx.stroke();\n }\n if (freezeTrailingRows > 0) {\n const hStroke = vColor === hColor && vStroke !== undefined ? vStroke : blendCache(hColor, theme.bgCell);\n const h = getFreezeTrailingHeight(rows, freezeTrailingRows, getRowHeight);\n ctx.beginPath();\n ctx.moveTo(0, height - h + 0.5);\n ctx.lineTo(width, height - h + 0.5);\n ctx.strokeStyle = hStroke;\n ctx.stroke();\n }\n}\nconst getMinMaxXY = (drawRegions, width, height) => {\n let minX = 0;\n let maxX = width;\n let minY = 0;\n let maxY = height;\n if (drawRegions !== undefined && drawRegions.length > 0) {\n minX = Number.MAX_SAFE_INTEGER;\n minY = Number.MAX_SAFE_INTEGER;\n maxX = Number.MIN_SAFE_INTEGER;\n maxY = Number.MIN_SAFE_INTEGER;\n for (const r of drawRegions) {\n minX = Math.min(minX, r.x - 1);\n maxX = Math.max(maxX, r.x + r.width + 1);\n minY = Math.min(minY, r.y - 1);\n maxY = Math.max(maxY, r.y + r.height + 1);\n }\n }\n return { minX, maxX, minY, maxY };\n};\nexport function drawExtraRowThemes(ctx, effectiveCols, cellYOffset, translateX, translateY, width, height, drawRegions, totalHeaderHeight, getRowHeight, getRowThemeOverride, verticalBorder, freezeTrailingRows, rows, theme) {\n const bgCell = theme.bgCell;\n const { minX, maxX, minY, maxY } = getMinMaxXY(drawRegions, width, height);\n const toDraw = [];\n const freezeY = height - getFreezeTrailingHeight(rows, freezeTrailingRows, getRowHeight);\n // row overflow\n let y = totalHeaderHeight;\n let row = cellYOffset;\n let extraRowsStartY = 0;\n while (y + translateY < freezeY) {\n const ty = y + translateY;\n const rh = getRowHeight(row);\n if (ty >= minY && ty <= maxY - 1) {\n const rowTheme = getRowThemeOverride?.(row);\n const rowThemeBgCell = rowTheme?.bgCell;\n const needDraw = rowThemeBgCell !== undefined && rowThemeBgCell !== bgCell && row >= rows - freezeTrailingRows;\n if (needDraw) {\n toDraw.push({\n x: minX,\n y: ty,\n w: maxX - minX,\n h: rh,\n color: rowThemeBgCell,\n });\n }\n }\n y += rh;\n if (row < rows - freezeTrailingRows)\n extraRowsStartY = y;\n row++;\n }\n // column overflow\n let x = 0;\n const h = Math.min(freezeY, maxY) - extraRowsStartY;\n if (h > 0) {\n for (let index = 0; index < effectiveCols.length; index++) {\n const c = effectiveCols[index];\n if (c.width === 0)\n continue;\n const tx = c.sticky ? x : x + translateX;\n const colThemeBgCell = c.themeOverride?.bgCell;\n if (colThemeBgCell !== undefined &&\n colThemeBgCell !== bgCell &&\n tx >= minX &&\n tx <= maxX &&\n verticalBorder(index + 1)) {\n toDraw.push({\n x: tx,\n y: extraRowsStartY,\n w: c.width,\n h,\n color: colThemeBgCell,\n });\n }\n x += c.width;\n }\n }\n if (toDraw.length === 0)\n return;\n let color;\n ctx.beginPath();\n // render in reverse order because we computed and added the columns last, but they should actually be lower\n // priority than the rows.\n for (let i = toDraw.length - 1; i >= 0; i--) {\n const r = toDraw[i];\n if (color === undefined) {\n color = r.color;\n }\n else if (r.color !== color) {\n ctx.fillStyle = color;\n ctx.fill();\n ctx.beginPath();\n color = r.color;\n }\n ctx.rect(r.x, r.y, r.w, r.h);\n }\n if (color !== undefined) {\n ctx.fillStyle = color;\n ctx.fill();\n }\n ctx.beginPath();\n}\n// lines are effectively drawn on the top left edge of a cell.\nexport function drawGridLines(ctx, effectiveCols, cellYOffset, translateX, translateY, width, height, drawRegions, spans, groupHeaderHeight, totalHeaderHeight, getRowHeight, getRowThemeOverride, verticalBorder, freezeTrailingRows, rows, theme, verticalOnly = false) {\n if (spans !== undefined) {\n ctx.beginPath();\n ctx.save();\n ctx.rect(0, 0, width, height);\n for (const span of spans) {\n ctx.rect(span.x + 1, span.y + 1, span.width - 1, span.height - 1);\n }\n ctx.clip(\"evenodd\");\n }\n const hColor = theme.horizontalBorderColor ?? theme.borderColor;\n const vColor = theme.borderColor;\n const { minX, maxX, minY, maxY } = getMinMaxXY(drawRegions, width, height);\n const toDraw = [];\n ctx.beginPath();\n // vertical lines\n let x = 0.5;\n for (let index = 0; index < effectiveCols.length; index++) {\n const c = effectiveCols[index];\n if (c.width === 0)\n continue;\n x += c.width;\n const tx = c.sticky ? x : x + translateX;\n if (tx >= minX && tx <= maxX && verticalBorder(index + 1)) {\n toDraw.push({\n x1: tx,\n y1: Math.max(groupHeaderHeight, minY),\n x2: tx,\n y2: Math.min(height, maxY),\n color: vColor,\n });\n }\n }\n let freezeY = height + 0.5;\n for (let i = rows - freezeTrailingRows; i < rows; i++) {\n const rh = getRowHeight(i);\n freezeY -= rh;\n toDraw.push({ x1: minX, y1: freezeY, x2: maxX, y2: freezeY, color: hColor });\n }\n if (verticalOnly !== true) {\n // horizontal lines\n let y = totalHeaderHeight + 0.5;\n let row = cellYOffset;\n const target = freezeY;\n while (y + translateY < target) {\n const ty = y + translateY;\n if (ty >= minY && ty <= maxY - 1) {\n const rowTheme = getRowThemeOverride?.(row);\n toDraw.push({\n x1: minX,\n y1: ty,\n x2: maxX,\n y2: ty,\n color: rowTheme?.horizontalBorderColor ?? rowTheme?.borderColor ?? hColor,\n });\n }\n y += getRowHeight(row);\n row++;\n }\n }\n const groups = groupBy(toDraw, line => line.color);\n for (const g of Object.keys(groups)) {\n ctx.strokeStyle = g;\n for (const line of groups[g]) {\n ctx.moveTo(line.x1, line.y1);\n ctx.lineTo(line.x2, line.y2);\n }\n ctx.stroke();\n ctx.beginPath();\n }\n if (spans !== undefined) {\n ctx.restore();\n }\n}\n//# sourceMappingURL=data-grid-render.lines.js.map","/* eslint-disable sonarjs/no-duplicate-string */\n/* eslint-disable unicorn/no-for-loop */\nimport { deepEqual } from \"../../../common/support.js\";\nimport {} from \"../data-grid-types.js\";\nimport { getStickyWidth, getFreezeTrailingHeight } from \"./data-grid-lib.js\";\nimport { walkColumns } from \"./data-grid-render.walk.js\";\nexport function blitLastFrame(ctx, blitSource, blitSourceScroll, targetScroll, last, cellXOffset, cellYOffset, translateX, translateY, freezeTrailingRows, width, height, rows, totalHeaderHeight, dpr, mappedColumns, effectiveCols, getRowHeight, doubleBuffer) {\n const drawRegions = [];\n ctx.imageSmoothingEnabled = false;\n const minY = Math.min(last.cellYOffset, cellYOffset);\n const maxY = Math.max(last.cellYOffset, cellYOffset);\n let deltaY = 0;\n if (typeof getRowHeight === \"number\") {\n deltaY += (maxY - minY) * getRowHeight;\n }\n else {\n for (let i = minY; i < maxY; i++) {\n deltaY += getRowHeight(i);\n }\n }\n if (cellYOffset > last.cellYOffset) {\n deltaY = -deltaY;\n }\n deltaY += translateY - last.translateY;\n const minX = Math.min(last.cellXOffset, cellXOffset);\n const maxX = Math.max(last.cellXOffset, cellXOffset);\n let deltaX = 0;\n for (let i = minX; i < maxX; i++) {\n deltaX += mappedColumns[i].width;\n }\n if (cellXOffset > last.cellXOffset) {\n deltaX = -deltaX;\n }\n deltaX += translateX - last.translateX;\n const stickyWidth = getStickyWidth(effectiveCols);\n if (deltaX !== 0 && deltaY !== 0) {\n return {\n regions: [],\n };\n }\n const freezeTrailingRowsHeight = freezeTrailingRows > 0 ? getFreezeTrailingHeight(rows, freezeTrailingRows, getRowHeight) : 0;\n const blitWidth = width - stickyWidth - Math.abs(deltaX);\n const blitHeight = height - totalHeaderHeight - freezeTrailingRowsHeight - Math.abs(deltaY) - 1;\n if (blitWidth > 150 && blitHeight > 150) {\n const args = {\n sx: 0,\n sy: 0,\n sw: width * dpr,\n sh: height * dpr,\n dx: 0,\n dy: 0,\n dw: width * dpr,\n dh: height * dpr,\n };\n // blit Y\n if (deltaY > 0) {\n // scrolling up\n args.sy = (totalHeaderHeight + 1) * dpr;\n args.sh = blitHeight * dpr;\n args.dy = (deltaY + totalHeaderHeight + 1) * dpr;\n args.dh = blitHeight * dpr;\n drawRegions.push({\n x: 0,\n y: totalHeaderHeight,\n width: width,\n height: deltaY + 1,\n });\n }\n else if (deltaY < 0) {\n // scrolling down\n args.sy = (-deltaY + totalHeaderHeight + 1) * dpr;\n args.sh = blitHeight * dpr;\n args.dy = (totalHeaderHeight + 1) * dpr;\n args.dh = blitHeight * dpr;\n drawRegions.push({\n x: 0,\n y: height + deltaY - freezeTrailingRowsHeight,\n width: width,\n height: -deltaY + freezeTrailingRowsHeight,\n });\n }\n // blit X\n if (deltaX > 0) {\n // pixels moving right\n args.sx = stickyWidth * dpr;\n args.sw = blitWidth * dpr;\n args.dx = (deltaX + stickyWidth) * dpr;\n args.dw = blitWidth * dpr;\n drawRegions.push({\n x: stickyWidth - 1,\n y: 0,\n width: deltaX + 2,\n height: height,\n });\n }\n else if (deltaX < 0) {\n // pixels moving left\n args.sx = (stickyWidth - deltaX) * dpr;\n args.sw = blitWidth * dpr;\n args.dx = stickyWidth * dpr;\n args.dw = blitWidth * dpr;\n drawRegions.push({\n x: width + deltaX,\n y: 0,\n width: -deltaX,\n height: height,\n });\n }\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n if (doubleBuffer) {\n if (stickyWidth > 0 &&\n deltaX !== 0 &&\n deltaY === 0 &&\n (targetScroll === undefined || blitSourceScroll?.[1] !== false)) {\n // When double buffering the freeze columns can be offset by a couple pixels vertically between the two\n // buffers. We don't want to redraw them so we need to make sure to copy them between the buffers.\n const w = stickyWidth * dpr;\n const h = height * dpr;\n ctx.drawImage(blitSource, 0, 0, w, h, 0, 0, w, h);\n }\n if (freezeTrailingRowsHeight > 0 &&\n deltaX === 0 &&\n deltaY !== 0 &&\n (targetScroll === undefined || blitSourceScroll?.[0] !== false)) {\n const y = (height - freezeTrailingRowsHeight) * dpr;\n const w = width * dpr;\n const h = freezeTrailingRowsHeight * dpr;\n ctx.drawImage(blitSource, 0, y, w, h, 0, y, w, h);\n }\n }\n ctx.drawImage(blitSource, args.sx, args.sy, args.sw, args.sh, args.dx, args.dy, args.dw, args.dh);\n ctx.scale(dpr, dpr);\n }\n ctx.imageSmoothingEnabled = true;\n return {\n regions: drawRegions,\n };\n}\nexport function blitResizedCol(last, cellXOffset, cellYOffset, translateX, translateY, width, height, totalHeaderHeight, effectiveCols, resizedIndex) {\n const drawRegions = [];\n // ctx.imageSmoothingEnabled = false;\n if (cellXOffset !== last.cellXOffset ||\n cellYOffset !== last.cellYOffset ||\n translateX !== last.translateX ||\n translateY !== last.translateY) {\n return drawRegions;\n }\n walkColumns(effectiveCols, cellYOffset, translateX, translateY, totalHeaderHeight, (c, drawX, _drawY, clipX) => {\n if (c.sourceIndex === resizedIndex) {\n const x = Math.max(drawX, clipX) + 1;\n drawRegions.push({\n x,\n y: 0,\n width: width - x,\n height,\n });\n return true;\n }\n });\n return drawRegions;\n}\nexport function computeCanBlit(current, last) {\n if (last === undefined)\n return false;\n if (current.width !== last.width ||\n current.height !== last.height ||\n current.theme !== last.theme ||\n current.headerHeight !== last.headerHeight ||\n current.rowHeight !== last.rowHeight ||\n current.rows !== last.rows ||\n current.freezeColumns !== last.freezeColumns ||\n current.getRowThemeOverride !== last.getRowThemeOverride ||\n current.isFocused !== last.isFocused ||\n current.isResizing !== last.isResizing ||\n current.verticalBorder !== last.verticalBorder ||\n current.getCellContent !== last.getCellContent ||\n current.highlightRegions !== last.highlightRegions ||\n current.selection !== last.selection ||\n current.dragAndDropState !== last.dragAndDropState ||\n current.prelightCells !== last.prelightCells ||\n current.touchMode !== last.touchMode ||\n current.maxScaleFactor !== last.maxScaleFactor) {\n return false;\n }\n if (current.mappedColumns !== last.mappedColumns) {\n if (current.mappedColumns.length > 100 || current.mappedColumns.length !== last.mappedColumns.length) {\n // The array is big, let's just redraw the damned thing rather than check these all. Or the number of cols\n // changed in which case I dont want to figure out what happened.\n return false;\n }\n // We want to know if only one column has resized. If this is the case we can do a special left/right sliding\n // blit. Or just not redraw shit on the left.\n let resized;\n for (let i = 0; i < current.mappedColumns.length; i++) {\n const curCol = current.mappedColumns[i];\n const lastCol = last.mappedColumns[i];\n if (deepEqual(curCol, lastCol))\n continue;\n // two columns changed, abort\n if (resized !== undefined)\n return false;\n if (curCol.width === lastCol.width)\n return false;\n const { width, ...curRest } = curCol;\n const { width: lastWidth, ...lastRest } = lastCol;\n // more than width changed, abort\n if (!deepEqual(curRest, lastRest))\n return false;\n resized = i;\n }\n if (resized === undefined) {\n // we never found a changed column, cool, we can blit\n return true;\n }\n return resized;\n }\n return true;\n}\n//# sourceMappingURL=data-grid-render.blit.js.map","/* eslint-disable sonarjs/no-duplicate-string */\n/* eslint-disable unicorn/no-for-loop */\nimport {} from \"../data-grid-types.js\";\nimport { getStickyWidth, computeBounds, getFreezeTrailingHeight } from \"./data-grid-lib.js\";\nimport {} from \"../../../common/styles.js\";\nimport { blend, withAlpha } from \"../color-parser.js\";\nimport { hugRectToTarget, intersectRect, rectContains, splitRectIntoRegions } from \"../../../common/math.js\";\nimport { getSpanBounds, walkColumns, walkRowsInCol } from \"./data-grid-render.walk.js\";\nimport {} from \"./data-grid-render.cells.js\";\nexport function drawHighlightRings(ctx, width, height, cellXOffset, cellYOffset, translateX, translateY, mappedColumns, freezeColumns, headerHeight, groupHeaderHeight, rowHeight, freezeTrailingRows, rows, allHighlightRegions, theme) {\n const highlightRegions = allHighlightRegions?.filter(x => x.style !== \"no-outline\");\n if (highlightRegions === undefined || highlightRegions.length === 0)\n return undefined;\n const freezeLeft = getStickyWidth(mappedColumns);\n const freezeBottom = getFreezeTrailingHeight(rows, freezeTrailingRows, rowHeight);\n const splitIndicies = [freezeColumns, 0, mappedColumns.length, rows - freezeTrailingRows];\n const splitLocations = [freezeLeft, 0, width, height - freezeBottom];\n const drawRects = highlightRegions.map(h => {\n const r = h.range;\n const style = h.style ?? \"dashed\";\n return splitRectIntoRegions(r, splitIndicies, width, height, splitLocations).map(arg => {\n const rect = arg.rect;\n const topLeftBounds = computeBounds(rect.x, rect.y, width, height, groupHeaderHeight, headerHeight + groupHeaderHeight, cellXOffset, cellYOffset, translateX, translateY, rows, freezeColumns, freezeTrailingRows, mappedColumns, rowHeight);\n const bottomRightBounds = rect.width === 1 && rect.height === 1\n ? topLeftBounds\n : computeBounds(rect.x + rect.width - 1, rect.y + rect.height - 1, width, height, groupHeaderHeight, headerHeight + groupHeaderHeight, cellXOffset, cellYOffset, translateX, translateY, rows, freezeColumns, freezeTrailingRows, mappedColumns, rowHeight);\n if (rect.x + rect.width >= mappedColumns.length) {\n bottomRightBounds.width -= 1;\n }\n if (rect.y + rect.height >= rows) {\n bottomRightBounds.height -= 1;\n }\n return {\n color: h.color,\n style,\n clip: arg.clip,\n rect: hugRectToTarget({\n x: topLeftBounds.x,\n y: topLeftBounds.y,\n width: bottomRightBounds.x + bottomRightBounds.width - topLeftBounds.x,\n height: bottomRightBounds.y + bottomRightBounds.height - topLeftBounds.y,\n }, width, height, 8),\n };\n });\n });\n const drawCb = () => {\n ctx.lineWidth = 1;\n let dashed = false;\n for (const dr of drawRects) {\n for (const s of dr) {\n if (s?.rect !== undefined &&\n intersectRect(0, 0, width, height, s.rect.x, s.rect.y, s.rect.width, s.rect.height)) {\n const wasDashed = dashed;\n const needsClip = !rectContains(s.clip, s.rect);\n if (needsClip) {\n ctx.save();\n ctx.rect(s.clip.x, s.clip.y, s.clip.width, s.clip.height);\n ctx.clip();\n }\n if (s.style === \"dashed\" && !dashed) {\n ctx.setLineDash([5, 3]);\n dashed = true;\n }\n else if ((s.style === \"solid\" || s.style === \"solid-outline\") && dashed) {\n ctx.setLineDash([]);\n dashed = false;\n }\n ctx.strokeStyle =\n s.style === \"solid-outline\"\n ? blend(blend(s.color, theme.borderColor), theme.bgCell)\n : withAlpha(s.color, 1);\n ctx.strokeRect(s.rect.x + 0.5, s.rect.y + 0.5, s.rect.width - 1, s.rect.height - 1);\n if (needsClip) {\n ctx.restore();\n dashed = wasDashed;\n }\n }\n }\n }\n if (dashed) {\n ctx.setLineDash([]);\n }\n };\n drawCb();\n return drawCb;\n}\nexport function drawColumnResizeOutline(ctx, yOffset, xOffset, height, style) {\n ctx.beginPath();\n ctx.moveTo(yOffset, xOffset);\n ctx.lineTo(yOffset, height);\n ctx.lineWidth = 2;\n ctx.strokeStyle = style;\n ctx.stroke();\n ctx.globalAlpha = 1;\n}\nexport function drawFillHandle(ctx, width, height, cellYOffset, translateX, translateY, effectiveCols, allColumns, theme, totalHeaderHeight, selectedCell, getRowHeight, getCellContent, freezeTrailingRows, hasAppendRow, fillHandle, rows) {\n if (selectedCell.current === undefined)\n return undefined;\n const range = selectedCell.current.range;\n const currentItem = selectedCell.current.cell;\n const fillHandleTarget = [range.x + range.width - 1, range.y + range.height - 1];\n // if the currentItem row greater than rows and the fill handle row is greater than rows, we dont need to draw\n if (currentItem[1] >= rows && fillHandleTarget[1] >= rows)\n return undefined;\n const mustDraw = effectiveCols.some(c => c.sourceIndex === currentItem[0] || c.sourceIndex === fillHandleTarget[0]);\n if (!mustDraw)\n return undefined;\n const [targetCol, targetRow] = selectedCell.current.cell;\n const cell = getCellContent(selectedCell.current.cell);\n const targetColSpan = cell.span ?? [targetCol, targetCol];\n const isStickyRow = targetRow >= rows - freezeTrailingRows;\n const stickRowHeight = freezeTrailingRows > 0 && !isStickyRow\n ? getFreezeTrailingHeight(rows, freezeTrailingRows, getRowHeight) - 1\n : 0;\n const fillHandleRow = fillHandleTarget[1];\n let drawHandleCb = undefined;\n walkColumns(effectiveCols, cellYOffset, translateX, translateY, totalHeaderHeight, (col, drawX, colDrawY, clipX, startRow) => {\n clipX;\n if (col.sticky && targetCol > col.sourceIndex)\n return;\n const isBeforeTarget = col.sourceIndex < targetColSpan[0];\n const isAfterTarget = col.sourceIndex > targetColSpan[1];\n const isFillHandleCol = col.sourceIndex === fillHandleTarget[0];\n if (!isFillHandleCol && (isBeforeTarget || isAfterTarget)) {\n // we dont need to do any drawing on this column but may yet need to draw\n return;\n }\n walkRowsInCol(startRow, colDrawY, height, rows, getRowHeight, freezeTrailingRows, hasAppendRow, undefined, (drawY, row, rh) => {\n if (row !== targetRow && row !== fillHandleRow)\n return;\n let cellX = drawX;\n let cellWidth = col.width;\n if (cell.span !== undefined) {\n const areas = getSpanBounds(cell.span, drawX, drawY, col.width, rh, col, allColumns);\n const area = col.sticky ? areas[0] : areas[1];\n if (area !== undefined) {\n cellX = area.x;\n cellWidth = area.width;\n }\n }\n const doHandle = row === fillHandleRow && isFillHandleCol && fillHandle;\n if (doHandle) {\n drawHandleCb = () => {\n if (clipX > cellX && !col.sticky) {\n ctx.beginPath();\n ctx.rect(clipX, 0, width - clipX, height);\n ctx.clip();\n }\n ctx.beginPath();\n ctx.rect(cellX + cellWidth - 4, drawY + rh - 4, 4, 4);\n ctx.fillStyle = col.themeOverride?.accentColor ?? theme.accentColor;\n ctx.fill();\n };\n }\n return drawHandleCb !== undefined;\n });\n return drawHandleCb !== undefined;\n });\n if (drawHandleCb === undefined)\n return undefined;\n const result = () => {\n ctx.save();\n ctx.beginPath();\n ctx.rect(0, totalHeaderHeight, width, height - totalHeaderHeight - stickRowHeight);\n ctx.clip();\n drawHandleCb?.();\n ctx.restore();\n };\n result();\n return result;\n}\n//# sourceMappingURL=data-grid.render.rings.js.map","/* eslint-disable sonarjs/no-duplicate-string */\n/* eslint-disable unicorn/no-for-loop */\nimport {} from \"../data-grid-types.js\";\nimport { CellSet } from \"../cell-set.js\";\nimport { getEffectiveColumns, rectBottomRight } from \"./data-grid-lib.js\";\nimport { blend } from \"../color-parser.js\";\nimport { assert } from \"../../../common/support.js\";\nimport { walkColumns, walkGroups, walkRowsInCol } from \"./data-grid-render.walk.js\";\nimport { drawCells } from \"./data-grid-render.cells.js\";\nimport { drawGridHeaders } from \"./data-grid-render.header.js\";\nimport { drawGridLines, overdrawStickyBoundaries, drawBlanks, drawExtraRowThemes } from \"./data-grid-render.lines.js\";\nimport { blitLastFrame, blitResizedCol, computeCanBlit } from \"./data-grid-render.blit.js\";\nimport { drawHighlightRings, drawFillHandle, drawColumnResizeOutline } from \"./data-grid.render.rings.js\";\n// Future optimization opportunities\n// - Create a cache of a buffer used to render the full view of a partially displayed column so that when\n// scrolling horizontally you can simply blit the pre-drawn column instead of continually paying the draw\n// cost as it slides into view.\n// - The same as above but for partially displayed rows\n// - Blit headers on horizontal scroll\n// - Use webworker to load images, helpful with lots of large images\n// - Retain mode for drawing cells. Instead of drawing cells as we come across them, first build a data\n// structure which contains all operations to perform, then sort them all by \"prep\" requirement, then do\n// all like operations at once.\nfunction clipHeaderDamage(ctx, effectiveColumns, width, groupHeaderHeight, totalHeaderHeight, translateX, translateY, cellYOffset, damage) {\n if (damage === undefined || damage.size === 0)\n return;\n ctx.beginPath();\n walkGroups(effectiveColumns, width, translateX, groupHeaderHeight, (span, _group, x, y, w, h) => {\n const hasItemInSpan = damage.hasItemInRectangle({\n x: span[0],\n y: -2,\n width: span[1] - span[0] + 1,\n height: 1,\n });\n if (hasItemInSpan) {\n ctx.rect(x, y, w, h);\n }\n });\n walkColumns(effectiveColumns, cellYOffset, translateX, translateY, totalHeaderHeight, (c, drawX, _colDrawY, clipX) => {\n const diff = Math.max(0, clipX - drawX);\n const finalX = drawX + diff + 1;\n const finalWidth = c.width - diff - 1;\n if (damage.has([c.sourceIndex, -1])) {\n ctx.rect(finalX, groupHeaderHeight, finalWidth, totalHeaderHeight - groupHeaderHeight);\n }\n });\n ctx.clip();\n}\nfunction getLastRow(effectiveColumns, height, totalHeaderHeight, translateX, translateY, cellYOffset, rows, getRowHeight, freezeTrailingRows, hasAppendRow) {\n let result = 0;\n walkColumns(effectiveColumns, cellYOffset, translateX, translateY, totalHeaderHeight, (_c, __drawX, colDrawY, _clipX, startRow) => {\n walkRowsInCol(startRow, colDrawY, height, rows, getRowHeight, freezeTrailingRows, hasAppendRow, undefined, (_drawY, row, _rh, isSticky) => {\n if (!isSticky) {\n result = Math.max(row, result);\n }\n });\n return true;\n });\n return result;\n}\nexport function drawGrid(arg, lastArg) {\n const { canvasCtx, headerCanvasCtx, width, height, cellXOffset, cellYOffset, translateX, translateY, mappedColumns, enableGroups, freezeColumns, dragAndDropState, theme, drawFocus, headerHeight, groupHeaderHeight, disabledRows, rowHeight, verticalBorder, overrideCursor, isResizing, selection, fillHandle, freezeTrailingRows, rows, getCellContent, getGroupDetails, getRowThemeOverride, isFocused, drawHeaderCallback, prelightCells, drawCellCallback, highlightRegions, resizeCol, imageLoader, lastBlitData, hoverValues, hyperWrapping, hoverInfo, spriteManager, maxScaleFactor, hasAppendRow, touchMode, enqueue, renderStateProvider, getCellRenderer, renderStrategy, bufferACtx, bufferBCtx, damage, minimumCellWidth, } = arg;\n if (width === 0 || height === 0)\n return;\n const doubleBuffer = renderStrategy === \"double-buffer\";\n const dpr = Math.min(maxScaleFactor, Math.ceil(window.devicePixelRatio ?? 1));\n // if we are double buffering we need to make sure we can blit. If we can't we need to redraw the whole thing\n const canBlit = renderStrategy !== \"direct\" && computeCanBlit(arg, lastArg);\n const canvas = canvasCtx.canvas;\n if (canvas.width !== width * dpr || canvas.height !== height * dpr) {\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n canvas.style.width = width + \"px\";\n canvas.style.height = height + \"px\";\n }\n const overlayCanvas = headerCanvasCtx.canvas;\n const totalHeaderHeight = enableGroups ? groupHeaderHeight + headerHeight : headerHeight;\n const overlayHeight = totalHeaderHeight + 1; // border\n if (overlayCanvas.width !== width * dpr || overlayCanvas.height !== overlayHeight * dpr) {\n overlayCanvas.width = width * dpr;\n overlayCanvas.height = overlayHeight * dpr;\n overlayCanvas.style.width = width + \"px\";\n overlayCanvas.style.height = overlayHeight + \"px\";\n }\n const bufferA = bufferACtx.canvas;\n const bufferB = bufferBCtx.canvas;\n if (doubleBuffer && (bufferA.width !== width * dpr || bufferA.height !== height * dpr)) {\n bufferA.width = width * dpr;\n bufferA.height = height * dpr;\n if (lastBlitData.current !== undefined)\n lastBlitData.current.aBufferScroll = undefined;\n }\n if (doubleBuffer && (bufferB.width !== width * dpr || bufferB.height !== height * dpr)) {\n bufferB.width = width * dpr;\n bufferB.height = height * dpr;\n if (lastBlitData.current !== undefined)\n lastBlitData.current.bBufferScroll = undefined;\n }\n const last = lastBlitData.current;\n if (canBlit === true &&\n cellXOffset === last?.cellXOffset &&\n cellYOffset === last?.cellYOffset &&\n translateX === last?.translateX &&\n translateY === last?.translateY)\n return;\n let mainCtx = null;\n if (doubleBuffer) {\n mainCtx = canvasCtx;\n }\n const overlayCtx = headerCanvasCtx;\n let targetCtx;\n if (!doubleBuffer) {\n targetCtx = canvasCtx;\n }\n else if (damage !== undefined) {\n targetCtx = last?.lastBuffer === \"b\" ? bufferBCtx : bufferACtx;\n }\n else {\n targetCtx = last?.lastBuffer === \"b\" ? bufferACtx : bufferBCtx;\n }\n const targetBuffer = targetCtx.canvas;\n const blitSource = doubleBuffer ? (targetBuffer === bufferA ? bufferB : bufferA) : canvas;\n const getRowHeight = typeof rowHeight === \"number\" ? () => rowHeight : rowHeight;\n overlayCtx.save();\n targetCtx.save();\n overlayCtx.beginPath();\n targetCtx.beginPath();\n overlayCtx.textBaseline = \"middle\";\n targetCtx.textBaseline = \"middle\";\n if (dpr !== 1) {\n overlayCtx.scale(dpr, dpr);\n targetCtx.scale(dpr, dpr);\n }\n const effectiveCols = getEffectiveColumns(mappedColumns, cellXOffset, width, dragAndDropState, translateX);\n let drawRegions = [];\n const mustDrawFocusOnHeader = drawFocus && selection.current?.cell[1] === cellYOffset && translateY === 0;\n let mustDrawHighlightRingsOnHeader = false;\n if (highlightRegions !== undefined) {\n for (const r of highlightRegions) {\n if (r.style !== \"no-outline\" && r.range.y === cellYOffset && translateY === 0) {\n mustDrawHighlightRingsOnHeader = true;\n break;\n }\n }\n }\n const drawHeaderTexture = () => {\n drawGridHeaders(overlayCtx, effectiveCols, enableGroups, hoverInfo, width, translateX, headerHeight, groupHeaderHeight, dragAndDropState, isResizing, selection, theme, spriteManager, hoverValues, verticalBorder, getGroupDetails, damage, drawHeaderCallback, touchMode);\n drawGridLines(overlayCtx, effectiveCols, cellYOffset, translateX, translateY, width, height, undefined, undefined, groupHeaderHeight, totalHeaderHeight, getRowHeight, getRowThemeOverride, verticalBorder, freezeTrailingRows, rows, theme, true);\n overlayCtx.beginPath();\n overlayCtx.moveTo(0, overlayHeight - 0.5);\n overlayCtx.lineTo(width, overlayHeight - 0.5);\n overlayCtx.strokeStyle = blend(theme.headerBottomBorderColor ?? theme.horizontalBorderColor ?? theme.borderColor, theme.bgHeader);\n overlayCtx.stroke();\n if (mustDrawHighlightRingsOnHeader) {\n drawHighlightRings(overlayCtx, width, height, cellXOffset, cellYOffset, translateX, translateY, mappedColumns, freezeColumns, headerHeight, groupHeaderHeight, rowHeight, freezeTrailingRows, rows, highlightRegions, theme);\n }\n if (mustDrawFocusOnHeader) {\n drawFillHandle(overlayCtx, width, height, cellYOffset, translateX, translateY, effectiveCols, mappedColumns, theme, totalHeaderHeight, selection, getRowHeight, getCellContent, freezeTrailingRows, hasAppendRow, fillHandle, rows);\n }\n };\n // handle damage updates by directly drawing to the target to avoid large blits\n if (damage !== undefined) {\n const viewRegionWidth = effectiveCols[effectiveCols.length - 1].sourceIndex + 1;\n const damageInView = damage.hasItemInRegion([\n {\n x: cellXOffset,\n y: -2,\n width: viewRegionWidth,\n height: 2,\n },\n {\n x: cellXOffset,\n y: cellYOffset,\n width: viewRegionWidth,\n height: 300,\n },\n {\n x: 0,\n y: cellYOffset,\n width: freezeColumns,\n height: 300,\n },\n {\n x: 0,\n y: -2,\n width: freezeColumns,\n height: 2,\n },\n {\n x: cellXOffset,\n y: rows - freezeTrailingRows,\n width: viewRegionWidth,\n height: freezeTrailingRows,\n when: freezeTrailingRows > 0,\n },\n ]);\n const doDamage = (ctx) => {\n drawCells(ctx, effectiveCols, mappedColumns, height, totalHeaderHeight, translateX, translateY, cellYOffset, rows, getRowHeight, getCellContent, getGroupDetails, getRowThemeOverride, disabledRows, isFocused, drawFocus, freezeTrailingRows, hasAppendRow, drawRegions, damage, selection, prelightCells, highlightRegions, imageLoader, spriteManager, hoverValues, hoverInfo, drawCellCallback, hyperWrapping, theme, enqueue, renderStateProvider, getCellRenderer, overrideCursor, minimumCellWidth);\n const selectionCurrent = selection.current;\n if (fillHandle &&\n drawFocus &&\n selectionCurrent !== undefined &&\n damage.has(rectBottomRight(selectionCurrent.range))) {\n drawFillHandle(ctx, width, height, cellYOffset, translateX, translateY, effectiveCols, mappedColumns, theme, totalHeaderHeight, selection, getRowHeight, getCellContent, freezeTrailingRows, hasAppendRow, fillHandle, rows);\n }\n };\n if (damageInView) {\n doDamage(targetCtx);\n if (mainCtx !== null) {\n mainCtx.save();\n mainCtx.scale(dpr, dpr);\n mainCtx.textBaseline = \"middle\";\n doDamage(mainCtx);\n mainCtx.restore();\n }\n const doHeaders = damage.hasHeader();\n if (doHeaders) {\n clipHeaderDamage(overlayCtx, effectiveCols, width, groupHeaderHeight, totalHeaderHeight, translateX, translateY, cellYOffset, damage);\n drawHeaderTexture();\n }\n }\n targetCtx.restore();\n overlayCtx.restore();\n return;\n }\n if (canBlit !== true ||\n cellXOffset !== last?.cellXOffset ||\n translateX !== last?.translateX ||\n mustDrawFocusOnHeader !== last?.mustDrawFocusOnHeader ||\n mustDrawHighlightRingsOnHeader !== last?.mustDrawHighlightRingsOnHeader) {\n drawHeaderTexture();\n }\n if (canBlit === true) {\n assert(blitSource !== undefined && last !== undefined);\n const { regions } = blitLastFrame(targetCtx, blitSource, blitSource === bufferA ? last.aBufferScroll : last.bBufferScroll, blitSource === bufferA ? last.bBufferScroll : last.aBufferScroll, last, cellXOffset, cellYOffset, translateX, translateY, freezeTrailingRows, width, height, rows, totalHeaderHeight, dpr, mappedColumns, effectiveCols, rowHeight, doubleBuffer);\n drawRegions = regions;\n }\n else if (canBlit !== false) {\n assert(last !== undefined);\n const resizedCol = canBlit;\n drawRegions = blitResizedCol(last, cellXOffset, cellYOffset, translateX, translateY, width, height, totalHeaderHeight, effectiveCols, resizedCol);\n }\n overdrawStickyBoundaries(targetCtx, effectiveCols, width, height, freezeTrailingRows, rows, verticalBorder, getRowHeight, theme);\n const highlightRedraw = drawHighlightRings(targetCtx, width, height, cellXOffset, cellYOffset, translateX, translateY, mappedColumns, freezeColumns, headerHeight, groupHeaderHeight, rowHeight, freezeTrailingRows, rows, highlightRegions, theme);\n // the overdraw may have nuked out our focus ring right edge.\n const focusRedraw = drawFocus\n ? drawFillHandle(targetCtx, width, height, cellYOffset, translateX, translateY, effectiveCols, mappedColumns, theme, totalHeaderHeight, selection, getRowHeight, getCellContent, freezeTrailingRows, hasAppendRow, fillHandle, rows)\n : undefined;\n targetCtx.fillStyle = theme.bgCell;\n if (drawRegions.length > 0) {\n targetCtx.beginPath();\n for (const r of drawRegions) {\n targetCtx.rect(r.x, r.y, r.width, r.height);\n }\n targetCtx.clip();\n targetCtx.fill();\n targetCtx.beginPath();\n }\n else {\n targetCtx.fillRect(0, 0, width, height);\n }\n const spans = drawCells(targetCtx, effectiveCols, mappedColumns, height, totalHeaderHeight, translateX, translateY, cellYOffset, rows, getRowHeight, getCellContent, getGroupDetails, getRowThemeOverride, disabledRows, isFocused, drawFocus, freezeTrailingRows, hasAppendRow, drawRegions, damage, selection, prelightCells, highlightRegions, imageLoader, spriteManager, hoverValues, hoverInfo, drawCellCallback, hyperWrapping, theme, enqueue, renderStateProvider, getCellRenderer, overrideCursor, minimumCellWidth);\n drawBlanks(targetCtx, effectiveCols, mappedColumns, width, height, totalHeaderHeight, translateX, translateY, cellYOffset, rows, getRowHeight, getRowThemeOverride, selection.rows, disabledRows, freezeTrailingRows, hasAppendRow, drawRegions, damage, theme);\n drawExtraRowThemes(targetCtx, effectiveCols, cellYOffset, translateX, translateY, width, height, drawRegions, totalHeaderHeight, getRowHeight, getRowThemeOverride, verticalBorder, freezeTrailingRows, rows, theme);\n drawGridLines(targetCtx, effectiveCols, cellYOffset, translateX, translateY, width, height, drawRegions, spans, groupHeaderHeight, totalHeaderHeight, getRowHeight, getRowThemeOverride, verticalBorder, freezeTrailingRows, rows, theme);\n highlightRedraw?.();\n focusRedraw?.();\n if (isResizing) {\n walkColumns(effectiveCols, 0, translateX, 0, totalHeaderHeight, (c, x) => {\n if (c.sourceIndex === resizeCol) {\n drawColumnResizeOutline(overlayCtx, x + c.width, 0, totalHeaderHeight + 1, blend(theme.resizeIndicatorColor ?? theme.accentLight, theme.bgHeader));\n drawColumnResizeOutline(targetCtx, x + c.width, totalHeaderHeight, height, blend(theme.resizeIndicatorColor ?? theme.accentLight, theme.bgCell));\n return true;\n }\n return false;\n });\n }\n if (mainCtx !== null) {\n mainCtx.fillStyle = theme.bgCell;\n mainCtx.fillRect(0, 0, width, height);\n mainCtx.drawImage(targetCtx.canvas, 0, 0);\n }\n const lastRowDrawn = getLastRow(effectiveCols, height, totalHeaderHeight, translateX, translateY, cellYOffset, rows, getRowHeight, freezeTrailingRows, hasAppendRow);\n imageLoader?.setWindow({\n x: cellXOffset,\n y: cellYOffset,\n width: effectiveCols.length,\n height: lastRowDrawn - cellYOffset,\n }, freezeColumns, Array.from({ length: freezeTrailingRows }, (_, i) => rows - 1 - i));\n const scrollX = last !== undefined && (cellXOffset !== last.cellXOffset || translateX !== last.translateX);\n const scrollY = last !== undefined && (cellYOffset !== last.cellYOffset || translateY !== last.translateY);\n lastBlitData.current = {\n cellXOffset,\n cellYOffset,\n translateX,\n translateY,\n mustDrawFocusOnHeader,\n mustDrawHighlightRingsOnHeader,\n lastBuffer: doubleBuffer ? (targetBuffer === bufferA ? \"a\" : \"b\") : undefined,\n aBufferScroll: targetBuffer === bufferA ? [scrollX, scrollY] : last?.aBufferScroll,\n bBufferScroll: targetBuffer === bufferB ? [scrollX, scrollY] : last?.bBufferScroll,\n };\n targetCtx.restore();\n overlayCtx.restore();\n}\n//# sourceMappingURL=data-grid-render.js.map","import clamp from \"lodash/clamp.js\";\nimport { itemsAreEqual } from \"./render/data-grid-lib.js\";\nconst hoverTime = 80;\nfunction easeOutCubic(x) {\n const x1 = x - 1;\n return x1 * x1 * x1 + 1;\n}\nexport class AnimationManager {\n callback;\n constructor(callback) {\n this.callback = callback;\n }\n currentHoveredItem = undefined;\n leavingItems = [];\n lastAnimationTime;\n addToLeavingItems = (item) => {\n const isAlreadyLeaving = this.leavingItems.some(i => itemsAreEqual(i.item, item.item));\n if (isAlreadyLeaving) {\n return;\n }\n this.leavingItems.push(item);\n };\n /**\n * @returns the hover amount of the item, if it was leaving (0 if not).\n */\n removeFromLeavingItems = (item) => {\n const leavingItem = this.leavingItems.find(e => itemsAreEqual(e.item, item));\n this.leavingItems = this.leavingItems.filter(i => i !== leavingItem);\n return leavingItem?.hoverAmount ?? 0;\n };\n cleanUpLeavingElements = () => {\n this.leavingItems = this.leavingItems.filter(i => i.hoverAmount > 0);\n };\n shouldStep = () => {\n const hasLeavingItems = this.leavingItems.length > 0;\n const currentHoveredIsAnimating = this.currentHoveredItem !== undefined && this.currentHoveredItem.hoverAmount < 1;\n return hasLeavingItems || currentHoveredIsAnimating;\n };\n getAnimatingItems = () => {\n // this is horrible. We shoudl be mutating the array in place. The reason we don't right now is because the\n // hoveramount is used as both the tweened value and the raw value. We should separate these two things.\n // Then we can stop doing the allocation insanity dance.\n if (this.currentHoveredItem !== undefined) {\n return [...this.leavingItems, this.currentHoveredItem];\n }\n return this.leavingItems.map(x => ({ ...x, hoverAmount: easeOutCubic(x.hoverAmount) }));\n };\n step = (timestamp) => {\n if (this.lastAnimationTime === undefined) {\n this.lastAnimationTime = timestamp;\n }\n else {\n const step = timestamp - this.lastAnimationTime;\n const delta = step / hoverTime;\n for (const item of this.leavingItems) {\n item.hoverAmount = clamp(item.hoverAmount - delta, 0, 1);\n }\n if (this.currentHoveredItem !== undefined) {\n this.currentHoveredItem.hoverAmount = clamp(this.currentHoveredItem.hoverAmount + delta, 0, 1);\n }\n const animating = this.getAnimatingItems();\n this.callback(animating);\n this.cleanUpLeavingElements();\n }\n if (this.shouldStep()) {\n this.lastAnimationTime = timestamp;\n window.requestAnimationFrame(this.step);\n }\n else {\n this.lastAnimationTime = undefined;\n }\n };\n setHovered = (item) => {\n if (itemsAreEqual(this.currentHoveredItem?.item, item)) {\n return;\n }\n if (this.currentHoveredItem !== undefined) {\n this.addToLeavingItems(this.currentHoveredItem);\n }\n if (item !== undefined) {\n const hoverAmount = this.removeFromLeavingItems(item);\n this.currentHoveredItem = {\n item,\n hoverAmount,\n };\n }\n else {\n this.currentHoveredItem = undefined;\n }\n if (this.lastAnimationTime === undefined) {\n window.requestAnimationFrame(this.step);\n }\n };\n}\n//# sourceMappingURL=animation-manager.js.map","class Lazy {\n fn;\n val;\n constructor(fn) {\n this.fn = fn;\n }\n get value() {\n return this.val ?? (this.val = this.fn());\n }\n}\nfunction lazy(fn) {\n return new Lazy(fn);\n}\n// next.js apps don't have window available at import time, so this will fail if its not lazy.\nexport const browserIsFirefox = lazy(() => window.navigator.userAgent.includes(\"Firefox\"));\nexport const browserIsSafari = lazy(() => window.navigator.userAgent.includes(\"Mac OS\") &&\n window.navigator.userAgent.includes(\"Safari\") &&\n !window.navigator.userAgent.includes(\"Chrome\"));\nexport const browserIsOSX = lazy(() => window.navigator.platform.toLowerCase().startsWith(\"mac\"));\n//# sourceMappingURL=browser-detect.js.map","import * as React from \"react\";\nimport {} from \"./data-grid-types.js\";\nimport { CellSet } from \"./cell-set.js\";\nimport { packColRowToNumber, unpackNumberToColRow } from \"../../common/render-state-provider.js\";\nexport function useAnimationQueue(draw) {\n const queue = React.useRef([]);\n const seq = React.useRef(0);\n const drawRef = React.useRef(draw);\n drawRef.current = draw;\n const loop = React.useCallback(() => {\n const requeue = () => window.requestAnimationFrame(fn);\n const fn = () => {\n const toDraw = queue.current.map(unpackNumberToColRow);\n queue.current = [];\n drawRef.current(new CellSet(toDraw));\n if (queue.current.length > 0) {\n seq.current++;\n }\n else {\n seq.current = 0;\n }\n };\n window.requestAnimationFrame(seq.current > 600 ? requeue : fn);\n }, []);\n return React.useCallback((item) => {\n if (queue.current.length === 0)\n loop();\n const packed = packColRowToNumber(item[0], item[1]);\n if (queue.current.includes(packed))\n return;\n queue.current.push(packed);\n }, [loop]);\n}\n//# sourceMappingURL=use-animation-queue.js.map","/** @category Types */\nexport const headerKind = \"header\";\n/** @category Types */\nexport const groupHeaderKind = \"group-header\";\n/** @category Types */\nexport const outOfBoundsKind = \"out-of-bounds\";\n/** @category Types */\nexport var OutOfBoundsRegionAxis;\n(function (OutOfBoundsRegionAxis) {\n OutOfBoundsRegionAxis[OutOfBoundsRegionAxis[\"Start\"] = -2] = \"Start\";\n OutOfBoundsRegionAxis[OutOfBoundsRegionAxis[\"StartPadding\"] = -1] = \"StartPadding\";\n OutOfBoundsRegionAxis[OutOfBoundsRegionAxis[\"Center\"] = 0] = \"Center\";\n OutOfBoundsRegionAxis[OutOfBoundsRegionAxis[\"EndPadding\"] = 1] = \"EndPadding\";\n OutOfBoundsRegionAxis[OutOfBoundsRegionAxis[\"End\"] = 2] = \"End\";\n})(OutOfBoundsRegionAxis || (OutOfBoundsRegionAxis = {}));\nexport function mouseEventArgsAreEqual(args, other) {\n if (args === other)\n return true;\n if (args?.kind === \"out-of-bounds\") {\n return (args?.kind === other?.kind &&\n args?.location[0] === other?.location[0] &&\n args?.location[1] === other?.location[1] &&\n args?.region[0] === other?.region[0] &&\n args?.region[1] === other?.region[1]);\n }\n return (args?.kind === other?.kind &&\n args?.location[0] === other?.location[0] &&\n args?.location[1] === other?.location[1]);\n}\n//# sourceMappingURL=event-args.js.map","import * as React from \"react\";\nimport { computeBounds, getColumnIndexForX, getEffectiveColumns, getRowIndexForY, getStickyWidth, rectBottomRight, useMappedColumns, } from \"./render/data-grid-lib.js\";\nimport { GridCellKind, InnerGridCellKind, CompactSelection, isReadWriteCell, isInnerOnlyCell, booleanCellIsEditable, } from \"./data-grid-types.js\";\nimport { CellSet } from \"./cell-set.js\";\nimport { SpriteManager } from \"./data-grid-sprites.js\";\nimport { direction, getScrollBarWidth, useDebouncedMemo, useEventListener } from \"../../common/utils.js\";\nimport clamp from \"lodash/clamp.js\";\nimport makeRange from \"lodash/range.js\";\nimport { drawGrid } from \"./render/data-grid-render.js\";\nimport {} from \"./render/data-grid-render.blit.js\";\nimport { AnimationManager } from \"./animation-manager.js\";\nimport { RenderStateProvider, packColRowToNumber } from \"../../common/render-state-provider.js\";\nimport { browserIsFirefox, browserIsSafari } from \"../../common/browser-detect.js\";\nimport { useAnimationQueue } from \"./use-animation-queue.js\";\nimport { assert } from \"../../common/support.js\";\nimport { OutOfBoundsRegionAxis, outOfBoundsKind, groupHeaderKind, headerKind, mouseEventArgsAreEqual, } from \"./event-args.js\";\nimport { pointInRect } from \"../../common/math.js\";\nimport { drawCell, } from \"./render/data-grid-render.cells.js\";\nimport { getActionBoundsForGroup, getHeaderMenuBounds, drawHeader } from \"./render/data-grid-render.header.js\";\nconst fillHandleClickSize = 6;\nconst getRowData = (cell, getCellRenderer) => {\n if (cell.kind === GridCellKind.Custom)\n return cell.copyData;\n const r = getCellRenderer?.(cell);\n return r?.getAccessibilityString(cell) ?? \"\";\n};\nconst DataGrid = (p, forwardedRef) => {\n const { width, height, accessibilityHeight, columns, cellXOffset: cellXOffsetReal, cellYOffset, headerHeight, fillHandle = false, groupHeaderHeight, rowHeight, rows, getCellContent, getRowThemeOverride, onHeaderMenuClick, enableGroups, isFilling, onCanvasFocused, onCanvasBlur, isFocused, selection, freezeColumns, onContextMenu, freezeTrailingRows, fixedShadowX = true, fixedShadowY = true, drawFocusRing, onMouseDown, onMouseUp, onMouseMoveRaw, onMouseMove, onItemHovered, dragAndDropState, firstColAccessible, onKeyDown, onKeyUp, highlightRegions, canvasRef, onDragStart, onDragEnd, eventTargetRef, isResizing, resizeColumn: resizeCol, isDragging, isDraggable = false, allowResize, disabledRows, hasAppendRow, getGroupDetails, theme, prelightCells, headerIcons, verticalBorder, drawCell: drawCellCallback, drawHeader: drawHeaderCallback, onCellFocused, onDragOverCell, onDrop, onDragLeave, imageWindowLoader, smoothScrollX = false, smoothScrollY = false, experimental, getCellRenderer, } = p;\n const translateX = p.translateX ?? 0;\n const translateY = p.translateY ?? 0;\n const cellXOffset = Math.max(freezeColumns, Math.min(columns.length - 1, cellXOffsetReal));\n const ref = React.useRef(null);\n const imageLoader = imageWindowLoader;\n const damageRegion = React.useRef();\n const [scrolling, setScrolling] = React.useState(false);\n const hoverValues = React.useRef([]);\n const lastBlitData = React.useRef();\n const [hoveredItemInfo, setHoveredItemInfo] = React.useState();\n const [hoveredOnEdge, setHoveredOnEdge] = React.useState();\n const overlayRef = React.useRef(null);\n const [drawCursorOverride, setDrawCursorOverride] = React.useState();\n const [lastWasTouch, setLastWasTouch] = React.useState(false);\n const lastWasTouchRef = React.useRef(lastWasTouch);\n lastWasTouchRef.current = lastWasTouch;\n const spriteManager = React.useMemo(() => new SpriteManager(headerIcons, () => {\n lastArgsRef.current = undefined;\n lastDrawRef.current();\n }), [headerIcons]);\n const totalHeaderHeight = enableGroups ? groupHeaderHeight + headerHeight : headerHeight;\n const scrollingStopRef = React.useRef(-1);\n const enableFirefoxRescaling = (experimental?.enableFirefoxRescaling ?? false) && browserIsFirefox.value;\n const enableSafariRescaling = (experimental?.enableSafariRescaling ?? false) && browserIsSafari.value;\n React.useLayoutEffect(() => {\n if (window.devicePixelRatio === 1 || (!enableFirefoxRescaling && !enableSafariRescaling))\n return;\n // We don't want to go into scroll mode for a single repaint\n if (scrollingStopRef.current !== -1) {\n setScrolling(true);\n }\n window.clearTimeout(scrollingStopRef.current);\n scrollingStopRef.current = window.setTimeout(() => {\n setScrolling(false);\n scrollingStopRef.current = -1;\n }, 200);\n }, [cellYOffset, cellXOffset, translateX, translateY, enableFirefoxRescaling, enableSafariRescaling]);\n const mappedColumns = useMappedColumns(columns, freezeColumns);\n const stickyX = fixedShadowX ? getStickyWidth(mappedColumns, dragAndDropState) : 0;\n // row: -1 === columnHeader, -2 === groupHeader\n const getBoundsForItem = React.useCallback((canvas, col, row) => {\n const rect = canvas.getBoundingClientRect();\n if (col >= mappedColumns.length || row >= rows) {\n return undefined;\n }\n const scale = rect.width / width;\n const result = computeBounds(col, row, width, height, groupHeaderHeight, totalHeaderHeight, cellXOffset, cellYOffset, translateX, translateY, rows, freezeColumns, freezeTrailingRows, mappedColumns, rowHeight);\n if (scale !== 1) {\n result.x *= scale;\n result.y *= scale;\n result.width *= scale;\n result.height *= scale;\n }\n result.x += rect.x;\n result.y += rect.y;\n return result;\n }, [\n width,\n height,\n groupHeaderHeight,\n totalHeaderHeight,\n cellXOffset,\n cellYOffset,\n translateX,\n translateY,\n rows,\n freezeColumns,\n freezeTrailingRows,\n mappedColumns,\n rowHeight,\n ]);\n const getMouseArgsForPosition = React.useCallback((canvas, posX, posY, ev) => {\n const rect = canvas.getBoundingClientRect();\n const scale = rect.width / width;\n const x = (posX - rect.left) / scale;\n const y = (posY - rect.top) / scale;\n const edgeDetectionBuffer = 5;\n const effectiveCols = getEffectiveColumns(mappedColumns, cellXOffset, width, undefined, translateX);\n let button = 0;\n let buttons = 0;\n if (ev instanceof MouseEvent) {\n button = ev.button;\n buttons = ev.buttons;\n }\n // -1 === off right edge\n const col = getColumnIndexForX(x, effectiveCols, translateX);\n // -1: header or above\n // undefined: offbottom\n const row = getRowIndexForY(y, height, enableGroups, headerHeight, groupHeaderHeight, rows, rowHeight, cellYOffset, translateY, freezeTrailingRows);\n const shiftKey = ev?.shiftKey === true;\n const ctrlKey = ev?.ctrlKey === true;\n const metaKey = ev?.metaKey === true;\n const isTouch = (ev !== undefined && !(ev instanceof MouseEvent)) || ev?.pointerType === \"touch\";\n const scrollEdge = [\n x < 0 ? -1 : width < x ? 1 : 0,\n y < totalHeaderHeight ? -1 : height < y ? 1 : 0,\n ];\n let result;\n if (col === -1 || y < 0 || x < 0 || row === undefined || x > width || y > height) {\n const horizontal = x > width ? 1 : x < 0 ? -1 : 0;\n const vertical = y > height ? 1 : y < 0 ? -1 : 0;\n let innerHorizontal = horizontal * 2;\n let innerVertical = vertical * 2;\n if (horizontal === 0)\n innerHorizontal = col === -1 ? OutOfBoundsRegionAxis.EndPadding : OutOfBoundsRegionAxis.Center;\n if (vertical === 0)\n innerVertical = row === undefined ? OutOfBoundsRegionAxis.EndPadding : OutOfBoundsRegionAxis.Center;\n let isEdge = false;\n if (col === -1 && row === -1) {\n const b = getBoundsForItem(canvas, mappedColumns.length - 1, -1);\n assert(b !== undefined);\n isEdge = posX < b.x + b.width + edgeDetectionBuffer;\n }\n // This is used to ensure that clicking on the scrollbar doesn't unset the selection.\n // Unfortunately this doesn't work for overlay scrollbars because they are just a broken interaction\n // by design.\n const isMaybeScrollbar = (x > width && x < width + getScrollBarWidth()) || (y > height && y < height + getScrollBarWidth());\n result = {\n kind: outOfBoundsKind,\n location: [col !== -1 ? col : x < 0 ? 0 : mappedColumns.length - 1, row ?? rows - 1],\n region: [innerHorizontal, innerVertical],\n shiftKey,\n ctrlKey,\n metaKey,\n isEdge,\n isTouch,\n button,\n buttons,\n scrollEdge,\n isMaybeScrollbar,\n };\n }\n else if (row <= -1) {\n let bounds = getBoundsForItem(canvas, col, row);\n assert(bounds !== undefined);\n let isEdge = bounds !== undefined && bounds.x + bounds.width - posX <= edgeDetectionBuffer;\n const previousCol = col - 1;\n if (posX - bounds.x <= edgeDetectionBuffer && previousCol >= 0) {\n isEdge = true;\n bounds = getBoundsForItem(canvas, previousCol, row);\n assert(bounds !== undefined);\n result = {\n kind: enableGroups && row === -2 ? groupHeaderKind : headerKind,\n location: [previousCol, row],\n bounds: bounds,\n group: mappedColumns[previousCol].group ?? \"\",\n isEdge,\n shiftKey,\n ctrlKey,\n metaKey,\n isTouch,\n localEventX: posX - bounds.x,\n localEventY: posY - bounds.y,\n button,\n buttons,\n scrollEdge,\n };\n }\n else {\n result = {\n kind: enableGroups && row === -2 ? groupHeaderKind : headerKind,\n group: mappedColumns[col].group ?? \"\",\n location: [col, row],\n bounds: bounds,\n isEdge,\n shiftKey,\n ctrlKey,\n metaKey,\n isTouch,\n localEventX: posX - bounds.x,\n localEventY: posY - bounds.y,\n button,\n buttons,\n scrollEdge,\n };\n }\n }\n else {\n const bounds = getBoundsForItem(canvas, col, row);\n assert(bounds !== undefined);\n const isEdge = bounds !== undefined && bounds.x + bounds.width - posX < edgeDetectionBuffer;\n let isFillHandle = false;\n if (fillHandle && selection.current !== undefined) {\n const fillHandleLocation = rectBottomRight(selection.current.range);\n const fillHandleCellBounds = getBoundsForItem(canvas, fillHandleLocation[0], fillHandleLocation[1]);\n if (fillHandleCellBounds !== undefined) {\n const handleLogicalCenterX = fillHandleCellBounds.x + fillHandleCellBounds.width - 2;\n const handleLogicalCenterY = fillHandleCellBounds.y + fillHandleCellBounds.height - 2;\n //check if posX and posY are within fillHandleClickSize from handleLogicalCenter\n isFillHandle =\n Math.abs(handleLogicalCenterX - posX) < fillHandleClickSize &&\n Math.abs(handleLogicalCenterY - posY) < fillHandleClickSize;\n }\n }\n result = {\n kind: \"cell\",\n location: [col, row],\n bounds: bounds,\n isEdge,\n shiftKey,\n ctrlKey,\n isFillHandle,\n metaKey,\n isTouch,\n localEventX: posX - bounds.x,\n localEventY: posY - bounds.y,\n button,\n buttons,\n scrollEdge,\n };\n }\n return result;\n }, [\n width,\n mappedColumns,\n cellXOffset,\n translateX,\n height,\n enableGroups,\n headerHeight,\n groupHeaderHeight,\n rows,\n rowHeight,\n cellYOffset,\n translateY,\n freezeTrailingRows,\n getBoundsForItem,\n fillHandle,\n selection,\n totalHeaderHeight,\n ]);\n const [hoveredItem] = hoveredItemInfo ?? [];\n const enqueueRef = React.useRef(() => {\n // do nothing\n });\n const hoverInfoRef = React.useRef(hoveredItemInfo);\n hoverInfoRef.current = hoveredItemInfo;\n const [bufferACtx, bufferBCtx] = React.useMemo(() => {\n const a = document.createElement(\"canvas\");\n const b = document.createElement(\"canvas\");\n a.style[\"display\"] = \"none\";\n a.style[\"opacity\"] = \"0\";\n a.style[\"position\"] = \"fixed\";\n b.style[\"display\"] = \"none\";\n b.style[\"opacity\"] = \"0\";\n b.style[\"position\"] = \"fixed\";\n return [a.getContext(\"2d\", { alpha: false }), b.getContext(\"2d\", { alpha: false })];\n }, []);\n React.useLayoutEffect(() => {\n if (bufferACtx === null || bufferBCtx === null)\n return;\n document.documentElement.append(bufferACtx.canvas);\n document.documentElement.append(bufferBCtx.canvas);\n return () => {\n bufferACtx.canvas.remove();\n bufferBCtx.canvas.remove();\n };\n }, [bufferACtx, bufferBCtx]);\n const renderStateProvider = React.useMemo(() => new RenderStateProvider(), []);\n const maxDPR = enableFirefoxRescaling && scrolling ? 1 : enableSafariRescaling && scrolling ? 2 : 5;\n const minimumCellWidth = experimental?.disableMinimumCellWidth === true ? 1 : 10;\n const lastArgsRef = React.useRef();\n const canvasCtx = React.useRef(null);\n const overlayCtx = React.useRef(null);\n const draw = React.useCallback(() => {\n const canvas = ref.current;\n const overlay = overlayRef.current;\n if (canvas === null || overlay === null)\n return;\n if (canvasCtx.current === null) {\n canvasCtx.current = canvas.getContext(\"2d\", { alpha: false });\n canvas.width = 0;\n canvas.height = 0;\n }\n if (overlayCtx.current === null) {\n overlayCtx.current = overlay.getContext(\"2d\", { alpha: false });\n overlay.width = 0;\n overlay.height = 0;\n }\n if (canvasCtx.current === null || overlayCtx.current === null || bufferACtx === null || bufferBCtx === null) {\n return;\n }\n let didOverride = false;\n const overrideCursor = (cursor) => {\n didOverride = true;\n setDrawCursorOverride(cursor);\n };\n const last = lastArgsRef.current;\n const current = {\n headerCanvasCtx: overlayCtx.current,\n canvasCtx: canvasCtx.current,\n bufferACtx,\n bufferBCtx,\n width,\n height,\n cellXOffset,\n cellYOffset,\n translateX: Math.round(translateX),\n translateY: Math.round(translateY),\n mappedColumns,\n enableGroups,\n freezeColumns,\n dragAndDropState,\n theme,\n headerHeight,\n groupHeaderHeight,\n disabledRows: disabledRows ?? CompactSelection.empty(),\n rowHeight,\n verticalBorder,\n isResizing,\n resizeCol,\n isFocused,\n selection,\n fillHandle,\n drawCellCallback,\n hasAppendRow,\n overrideCursor,\n maxScaleFactor: maxDPR,\n freezeTrailingRows,\n rows,\n drawFocus: drawFocusRing,\n getCellContent,\n getGroupDetails: getGroupDetails ?? (name => ({ name })),\n getRowThemeOverride,\n drawHeaderCallback,\n prelightCells,\n highlightRegions,\n imageLoader,\n lastBlitData,\n damage: damageRegion.current,\n hoverValues: hoverValues.current,\n hoverInfo: hoverInfoRef.current,\n spriteManager,\n scrolling,\n hyperWrapping: experimental?.hyperWrapping ?? false,\n touchMode: lastWasTouch,\n enqueue: enqueueRef.current,\n renderStateProvider,\n renderStrategy: experimental?.renderStrategy ?? (browserIsSafari.value ? \"double-buffer\" : \"single-buffer\"),\n getCellRenderer,\n minimumCellWidth,\n };\n // This confusing bit of code due to some poor design. Long story short, the damage property is only used\n // with what is effectively the \"last args\" for the last normal draw anyway. We don't want the drawing code\n // to look at this and go \"shit dawg, nothing changed\" so we force it to draw frash, but the damage restricts\n // the draw anyway.\n //\n // Dear future Jason, I'm sorry. It was expedient, it worked, and had almost zero perf overhead. THe universe\n // basically made me do it. What choice did I have?\n if (current.damage === undefined) {\n lastArgsRef.current = current;\n drawGrid(current, last);\n }\n else {\n drawGrid(current, undefined);\n }\n // don't reset on damage events\n if (!didOverride && (current.damage === undefined || current.damage.has(hoverInfoRef?.current?.[0]))) {\n setDrawCursorOverride(undefined);\n }\n }, [\n bufferACtx,\n bufferBCtx,\n width,\n height,\n cellXOffset,\n cellYOffset,\n translateX,\n translateY,\n mappedColumns,\n enableGroups,\n freezeColumns,\n dragAndDropState,\n theme,\n headerHeight,\n groupHeaderHeight,\n disabledRows,\n rowHeight,\n verticalBorder,\n isResizing,\n hasAppendRow,\n resizeCol,\n isFocused,\n selection,\n fillHandle,\n freezeTrailingRows,\n rows,\n drawFocusRing,\n maxDPR,\n getCellContent,\n getGroupDetails,\n getRowThemeOverride,\n drawCellCallback,\n drawHeaderCallback,\n prelightCells,\n highlightRegions,\n imageLoader,\n spriteManager,\n scrolling,\n experimental?.hyperWrapping,\n experimental?.renderStrategy,\n lastWasTouch,\n renderStateProvider,\n getCellRenderer,\n minimumCellWidth,\n ]);\n const lastDrawRef = React.useRef(draw);\n React.useLayoutEffect(() => {\n draw();\n lastDrawRef.current = draw;\n }, [draw]);\n React.useLayoutEffect(() => {\n const fn = async () => {\n if (document?.fonts?.ready === undefined)\n return;\n await document.fonts.ready;\n lastArgsRef.current = undefined;\n lastDrawRef.current();\n };\n void fn();\n }, []);\n const damageInternal = React.useCallback((locations) => {\n damageRegion.current = locations;\n lastDrawRef.current();\n damageRegion.current = undefined;\n }, []);\n const enqueue = useAnimationQueue(damageInternal);\n enqueueRef.current = enqueue;\n const damage = React.useCallback((cells) => {\n damageInternal(new CellSet(cells.map(x => x.cell)));\n }, [damageInternal]);\n imageLoader.setCallback(damageInternal);\n const [overFill, setOverFill] = React.useState(false);\n const [hCol, hRow] = hoveredItem ?? [];\n const headerHovered = hCol !== undefined && hRow === -1;\n const groupHeaderHovered = hCol !== undefined && hRow === -2;\n let clickableInnerCellHovered = false;\n let editableBoolHovered = false;\n let cursorOverride = drawCursorOverride;\n if (cursorOverride === undefined && hCol !== undefined && hRow !== undefined && hRow > -1 && hRow < rows) {\n const cell = getCellContent([hCol, hRow], true);\n clickableInnerCellHovered =\n cell.kind === InnerGridCellKind.NewRow ||\n (cell.kind === InnerGridCellKind.Marker && cell.markerKind !== \"number\");\n editableBoolHovered = cell.kind === GridCellKind.Boolean && booleanCellIsEditable(cell);\n cursorOverride = cell.cursor;\n }\n const canDrag = hoveredOnEdge ?? false;\n const cursor = isDragging\n ? \"grabbing\"\n : canDrag || isResizing\n ? \"col-resize\"\n : overFill || isFilling\n ? \"crosshair\"\n : cursorOverride !== undefined\n ? cursorOverride\n : headerHovered || clickableInnerCellHovered || editableBoolHovered || groupHeaderHovered\n ? \"pointer\"\n : \"default\";\n const style = React.useMemo(() => ({\n // width,\n // height,\n contain: \"strict\",\n display: \"block\",\n cursor,\n }), [cursor]);\n const lastSetCursor = React.useRef(\"default\");\n const target = eventTargetRef?.current;\n if (target !== null && target !== undefined && lastSetCursor.current !== style.cursor) {\n // because we have an event target we need to set its cursor instead.\n target.style.cursor = lastSetCursor.current = style.cursor;\n }\n const groupHeaderActionForEvent = React.useCallback((group, bounds, localEventX, localEventY) => {\n if (getGroupDetails === undefined)\n return undefined;\n const groupDesc = getGroupDetails(group);\n if (groupDesc.actions !== undefined) {\n const boxes = getActionBoundsForGroup(bounds, groupDesc.actions);\n for (const [i, box] of boxes.entries()) {\n if (pointInRect(box, localEventX + bounds.x, localEventY + box.y)) {\n return groupDesc.actions[i];\n }\n }\n }\n return undefined;\n }, [getGroupDetails]);\n const isOverHeaderMenu = React.useCallback((canvas, col, clientX, clientY) => {\n const header = columns[col];\n if (!isDragging && !isResizing && header.hasMenu === true && !(hoveredOnEdge ?? false)) {\n const headerBounds = getBoundsForItem(canvas, col, -1);\n assert(headerBounds !== undefined);\n const menuBounds = getHeaderMenuBounds(headerBounds.x, headerBounds.y, headerBounds.width, headerBounds.height, direction(header.title) === \"rtl\");\n if (clientX > menuBounds.x &&\n clientX < menuBounds.x + menuBounds.width &&\n clientY > menuBounds.y &&\n clientY < menuBounds.y + menuBounds.height) {\n return headerBounds;\n }\n }\n return undefined;\n }, [columns, getBoundsForItem, hoveredOnEdge, isDragging, isResizing]);\n const downTime = React.useRef(0);\n const downPosition = React.useRef();\n const mouseDown = React.useRef(false);\n const onMouseDownImpl = React.useCallback((ev) => {\n const canvas = ref.current;\n const eventTarget = eventTargetRef?.current;\n if (canvas === null || (ev.target !== canvas && ev.target !== eventTarget))\n return;\n mouseDown.current = true;\n let clientX;\n let clientY;\n if (ev instanceof MouseEvent) {\n clientX = ev.clientX;\n clientY = ev.clientY;\n }\n else {\n clientX = ev.touches[0].clientX;\n clientY = ev.touches[0].clientY;\n }\n if (ev.target === eventTarget && eventTarget !== null) {\n const bounds = eventTarget.getBoundingClientRect();\n if (clientX > bounds.right || clientY > bounds.bottom)\n return;\n }\n const args = getMouseArgsForPosition(canvas, clientX, clientY, ev);\n downPosition.current = args.location;\n if (args.isTouch) {\n downTime.current = Date.now();\n }\n if (lastWasTouchRef.current !== args.isTouch) {\n setLastWasTouch(args.isTouch);\n }\n if (args.kind === headerKind &&\n isOverHeaderMenu(canvas, args.location[0], clientX, clientY) !== undefined) {\n return;\n }\n else if (args.kind === groupHeaderKind) {\n const action = groupHeaderActionForEvent(args.group, args.bounds, args.localEventX, args.localEventY);\n if (action !== undefined) {\n return;\n }\n }\n onMouseDown?.(args);\n if (!args.isTouch &&\n isDraggable !== true &&\n isDraggable !== args.kind &&\n args.button < 3 &&\n args.button !== 1) {\n // preventing default in touch events stops scroll\n ev.preventDefault();\n }\n }, [eventTargetRef, isDraggable, getMouseArgsForPosition, groupHeaderActionForEvent, isOverHeaderMenu, onMouseDown]);\n useEventListener(\"touchstart\", onMouseDownImpl, window, false);\n useEventListener(\"mousedown\", onMouseDownImpl, window, false);\n const lastUpTime = React.useRef(0);\n const onMouseUpImpl = React.useCallback((ev) => {\n const lastUpTimeValue = lastUpTime.current;\n lastUpTime.current = Date.now();\n const canvas = ref.current;\n mouseDown.current = false;\n if (onMouseUp === undefined || canvas === null)\n return;\n const eventTarget = eventTargetRef?.current;\n const isOutside = ev.target !== canvas && ev.target !== eventTarget;\n let clientX;\n let clientY;\n let canCancel = true;\n if (ev instanceof MouseEvent) {\n clientX = ev.clientX;\n clientY = ev.clientY;\n canCancel = ev.button < 3;\n if (ev.pointerType === \"touch\") {\n return;\n }\n }\n else {\n clientX = ev.changedTouches[0].clientX;\n clientY = ev.changedTouches[0].clientY;\n }\n let args = getMouseArgsForPosition(canvas, clientX, clientY, ev);\n if (args.isTouch && downTime.current !== 0 && Date.now() - downTime.current > 500) {\n args = {\n ...args,\n isLongTouch: true,\n };\n }\n if (lastUpTimeValue !== 0 && Date.now() - lastUpTimeValue < (args.isTouch ? 1000 : 500)) {\n args = {\n ...args,\n isDoubleClick: true,\n };\n }\n if (lastWasTouchRef.current !== args.isTouch) {\n setLastWasTouch(args.isTouch);\n }\n if (!isOutside && ev.cancelable && canCancel) {\n ev.preventDefault();\n }\n const [col] = args.location;\n const headerBounds = isOverHeaderMenu(canvas, col, clientX, clientY);\n if (args.kind === headerKind && headerBounds !== undefined) {\n if (args.button !== 0 || downPosition.current?.[0] !== col || downPosition.current?.[1] !== -1) {\n // force outside so that click will not process\n onMouseUp(args, true);\n }\n return;\n }\n else if (args.kind === groupHeaderKind) {\n const action = groupHeaderActionForEvent(args.group, args.bounds, args.localEventX, args.localEventY);\n if (action !== undefined) {\n if (args.button === 0) {\n action.onClick(args);\n }\n return;\n }\n }\n onMouseUp(args, isOutside);\n }, [onMouseUp, eventTargetRef, getMouseArgsForPosition, isOverHeaderMenu, groupHeaderActionForEvent]);\n useEventListener(\"mouseup\", onMouseUpImpl, window, false);\n useEventListener(\"touchend\", onMouseUpImpl, window, false);\n const onClickImpl = React.useCallback((ev) => {\n const canvas = ref.current;\n if (canvas === null)\n return;\n const eventTarget = eventTargetRef?.current;\n const isOutside = ev.target !== canvas && ev.target !== eventTarget;\n let clientX;\n let clientY;\n let canCancel = true;\n if (ev instanceof MouseEvent) {\n clientX = ev.clientX;\n clientY = ev.clientY;\n canCancel = ev.button < 3;\n }\n else {\n clientX = ev.changedTouches[0].clientX;\n clientY = ev.changedTouches[0].clientY;\n }\n const args = getMouseArgsForPosition(canvas, clientX, clientY, ev);\n if (lastWasTouchRef.current !== args.isTouch) {\n setLastWasTouch(args.isTouch);\n }\n if (!isOutside && ev.cancelable && canCancel) {\n ev.preventDefault();\n }\n const [col] = args.location;\n const headerBounds = isOverHeaderMenu(canvas, col, clientX, clientY);\n if (args.kind === headerKind && headerBounds !== undefined) {\n if (args.button === 0 && downPosition.current?.[0] === col && downPosition.current?.[1] === -1) {\n onHeaderMenuClick?.(col, headerBounds);\n }\n }\n else if (args.kind === groupHeaderKind) {\n const action = groupHeaderActionForEvent(args.group, args.bounds, args.localEventX, args.localEventY);\n if (action !== undefined && args.button === 0) {\n action.onClick(args);\n }\n }\n }, [eventTargetRef, getMouseArgsForPosition, isOverHeaderMenu, onHeaderMenuClick, groupHeaderActionForEvent]);\n useEventListener(\"click\", onClickImpl, window, false);\n const onContextMenuImpl = React.useCallback((ev) => {\n const canvas = ref.current;\n const eventTarget = eventTargetRef?.current;\n if (canvas === null || (ev.target !== canvas && ev.target !== eventTarget) || onContextMenu === undefined)\n return;\n const args = getMouseArgsForPosition(canvas, ev.clientX, ev.clientY, ev);\n onContextMenu(args, () => {\n if (ev.cancelable)\n ev.preventDefault();\n });\n }, [eventTargetRef, getMouseArgsForPosition, onContextMenu]);\n useEventListener(\"contextmenu\", onContextMenuImpl, eventTargetRef?.current ?? null, false);\n const onAnimationFrame = React.useCallback(values => {\n damageRegion.current = new CellSet(values.map(x => x.item));\n hoverValues.current = values;\n lastDrawRef.current();\n damageRegion.current = undefined;\n }, []);\n const animManagerValue = React.useMemo(() => new AnimationManager(onAnimationFrame), [onAnimationFrame]);\n const animationManager = React.useRef(animManagerValue);\n animationManager.current = animManagerValue;\n React.useLayoutEffect(() => {\n const am = animationManager.current;\n if (hoveredItem === undefined || hoveredItem[1] < 0) {\n am.setHovered(hoveredItem);\n return;\n }\n const cell = getCellContent(hoveredItem, true);\n const r = getCellRenderer(cell);\n const cellNeedsHover = (r === undefined && cell.kind === GridCellKind.Custom) ||\n (r?.needsHover !== undefined && (typeof r.needsHover === \"boolean\" ? r.needsHover : r.needsHover(cell)));\n am.setHovered(cellNeedsHover ? hoveredItem : undefined);\n }, [getCellContent, getCellRenderer, hoveredItem]);\n const hoveredRef = React.useRef();\n const onMouseMoveImpl = React.useCallback((ev) => {\n const canvas = ref.current;\n if (canvas === null)\n return;\n const eventTarget = eventTargetRef?.current;\n const isIndirect = ev.target !== canvas && ev.target !== eventTarget;\n const args = getMouseArgsForPosition(canvas, ev.clientX, ev.clientY, ev);\n if (args.kind !== \"out-of-bounds\" && isIndirect && !mouseDown.current && !args.isTouch) {\n // we are obscured by something else, so we want to not register events if we are not doing anything\n // important already\n return;\n }\n // the point here is not to trigger re-renders every time the mouse moves over a cell\n // that doesn't care about the mouse positon.\n const maybeSetHoveredInfo = (newVal, needPosition) => {\n setHoveredItemInfo(cv => {\n if (cv === newVal)\n return cv;\n if (cv?.[0][0] === newVal?.[0][0] &&\n cv?.[0][1] === newVal?.[0][1] &&\n ((cv?.[1][0] === newVal?.[1][0] && cv?.[1][1] === newVal?.[1][1]) || !needPosition)) {\n return cv;\n }\n return newVal;\n });\n };\n if (!mouseEventArgsAreEqual(args, hoveredRef.current)) {\n setDrawCursorOverride(undefined);\n onItemHovered?.(args);\n maybeSetHoveredInfo(args.kind === outOfBoundsKind ? undefined : [args.location, [args.localEventX, args.localEventY]], true);\n hoveredRef.current = args;\n }\n else if (args.kind === \"cell\" || args.kind === headerKind || args.kind === groupHeaderKind) {\n let needsDamageCell = false;\n let needsHoverPosition = true;\n if (args.kind === \"cell\") {\n const toCheck = getCellContent(args.location);\n const rendererNeeds = getCellRenderer(toCheck)?.needsHoverPosition;\n // custom cells we will assume need the position if they don't explicitly say they don't, everything\n // else we will assume doesn't need it.\n needsHoverPosition = rendererNeeds ?? toCheck.kind === GridCellKind.Custom;\n needsDamageCell = needsHoverPosition;\n }\n else if (args.kind === groupHeaderKind) {\n needsDamageCell = true;\n }\n const newInfo = [args.location, [args.localEventX, args.localEventY]];\n maybeSetHoveredInfo(newInfo, needsHoverPosition);\n hoverInfoRef.current = newInfo;\n if (needsDamageCell) {\n damageInternal(new CellSet([args.location]));\n }\n }\n const notRowMarkerCol = args.location[0] >= (firstColAccessible ? 0 : 1);\n setHoveredOnEdge(args.kind === headerKind && args.isEdge && notRowMarkerCol && allowResize === true);\n setOverFill(args.kind === \"cell\" && args.isFillHandle);\n onMouseMoveRaw?.(ev);\n onMouseMove(args);\n }, [\n eventTargetRef,\n getMouseArgsForPosition,\n firstColAccessible,\n allowResize,\n onMouseMoveRaw,\n onMouseMove,\n onItemHovered,\n getCellContent,\n getCellRenderer,\n damageInternal,\n ]);\n useEventListener(\"mousemove\", onMouseMoveImpl, window, true);\n const onKeyDownImpl = React.useCallback((event) => {\n const canvas = ref.current;\n if (canvas === null)\n return;\n let bounds;\n let location = undefined;\n if (selection.current !== undefined) {\n bounds = getBoundsForItem(canvas, selection.current.cell[0], selection.current.cell[1]);\n location = selection.current.cell;\n }\n onKeyDown?.({\n bounds,\n stopPropagation: () => event.stopPropagation(),\n preventDefault: () => event.preventDefault(),\n cancel: () => undefined,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n shiftKey: event.shiftKey,\n altKey: event.altKey,\n key: event.key,\n keyCode: event.keyCode,\n rawEvent: event,\n location,\n });\n }, [onKeyDown, selection, getBoundsForItem]);\n const onKeyUpImpl = React.useCallback((event) => {\n const canvas = ref.current;\n if (canvas === null)\n return;\n let bounds;\n let location = undefined;\n if (selection.current !== undefined) {\n bounds = getBoundsForItem(canvas, selection.current.cell[0], selection.current.cell[1]);\n location = selection.current.cell;\n }\n onKeyUp?.({\n bounds,\n stopPropagation: () => event.stopPropagation(),\n preventDefault: () => event.preventDefault(),\n cancel: () => undefined,\n ctrlKey: event.ctrlKey,\n metaKey: event.metaKey,\n shiftKey: event.shiftKey,\n altKey: event.altKey,\n key: event.key,\n keyCode: event.keyCode,\n rawEvent: event,\n location,\n });\n }, [onKeyUp, selection, getBoundsForItem]);\n const refImpl = React.useCallback((instance) => {\n ref.current = instance;\n if (canvasRef !== undefined) {\n canvasRef.current = instance;\n }\n }, [canvasRef]);\n const onDragStartImpl = React.useCallback((event) => {\n const canvas = ref.current;\n if (canvas === null || isDraggable === false || isResizing) {\n event.preventDefault();\n return;\n }\n let dragMime;\n let dragData;\n const args = getMouseArgsForPosition(canvas, event.clientX, event.clientY);\n if (isDraggable !== true && args.kind !== isDraggable) {\n event.preventDefault();\n return;\n }\n const setData = (mime, payload) => {\n dragMime = mime;\n dragData = payload;\n };\n let dragImage;\n let dragImageX;\n let dragImageY;\n const setDragImage = (image, x, y) => {\n dragImage = image;\n dragImageX = x;\n dragImageY = y;\n };\n let prevented = false;\n onDragStart?.({\n ...args,\n setData,\n setDragImage,\n preventDefault: () => (prevented = true),\n defaultPrevented: () => prevented,\n });\n if (!prevented && dragMime !== undefined && dragData !== undefined && event.dataTransfer !== null) {\n event.dataTransfer.setData(dragMime, dragData);\n event.dataTransfer.effectAllowed = \"copyLink\";\n if (dragImage !== undefined && dragImageX !== undefined && dragImageY !== undefined) {\n event.dataTransfer.setDragImage(dragImage, dragImageX, dragImageY);\n }\n else {\n const [col, row] = args.location;\n if (row !== undefined) {\n const offscreen = document.createElement(\"canvas\");\n const boundsForDragTarget = getBoundsForItem(canvas, col, row);\n assert(boundsForDragTarget !== undefined);\n const dpr = Math.ceil(window.devicePixelRatio ?? 1);\n offscreen.width = boundsForDragTarget.width * dpr;\n offscreen.height = boundsForDragTarget.height * dpr;\n const ctx = offscreen.getContext(\"2d\");\n if (ctx !== null) {\n ctx.scale(dpr, dpr);\n ctx.textBaseline = \"middle\";\n if (row === -1) {\n ctx.font = theme.headerFontFull;\n ctx.fillStyle = theme.bgHeader;\n ctx.fillRect(0, 0, offscreen.width, offscreen.height);\n drawHeader(ctx, 0, 0, boundsForDragTarget.width, boundsForDragTarget.height, mappedColumns[col], false, theme, false, false, 0, spriteManager, drawHeaderCallback, false);\n }\n else {\n ctx.font = theme.baseFontFull;\n ctx.fillStyle = theme.bgCell;\n ctx.fillRect(0, 0, offscreen.width, offscreen.height);\n drawCell(ctx, getCellContent([col, row]), 0, row, false, false, 0, 0, boundsForDragTarget.width, boundsForDragTarget.height, false, theme, theme.bgCell, imageLoader, spriteManager, 1, undefined, false, 0, undefined, undefined, undefined, renderStateProvider, getCellRenderer, () => undefined);\n }\n }\n offscreen.style.left = \"-100%\";\n offscreen.style.position = \"absolute\";\n offscreen.style.width = `${boundsForDragTarget.width}px`;\n offscreen.style.height = `${boundsForDragTarget.height}px`;\n document.body.append(offscreen);\n event.dataTransfer.setDragImage(offscreen, boundsForDragTarget.width / 2, boundsForDragTarget.height / 2);\n window.setTimeout(() => {\n offscreen.remove();\n }, 0);\n }\n }\n }\n else {\n event.preventDefault();\n }\n }, [\n isDraggable,\n isResizing,\n getMouseArgsForPosition,\n onDragStart,\n getBoundsForItem,\n theme,\n mappedColumns,\n spriteManager,\n drawHeaderCallback,\n getCellContent,\n imageLoader,\n renderStateProvider,\n getCellRenderer,\n ]);\n useEventListener(\"dragstart\", onDragStartImpl, eventTargetRef?.current ?? null, false, false);\n const activeDropTarget = React.useRef();\n const onDragOverImpl = React.useCallback((event) => {\n const canvas = ref.current;\n if (onDrop !== undefined) {\n // Need to preventDefault to allow drop\n event.preventDefault();\n }\n if (canvas === null || onDragOverCell === undefined) {\n return;\n }\n const args = getMouseArgsForPosition(canvas, event.clientX, event.clientY);\n const [rawCol, row] = args.location;\n const col = rawCol - (firstColAccessible ? 0 : 1);\n const [activeCol, activeRow] = activeDropTarget.current ?? [];\n if (activeCol !== col || activeRow !== row) {\n activeDropTarget.current = [col, row];\n onDragOverCell([col, row], event.dataTransfer);\n }\n }, [firstColAccessible, getMouseArgsForPosition, onDragOverCell, onDrop]);\n useEventListener(\"dragover\", onDragOverImpl, eventTargetRef?.current ?? null, false, false);\n const onDragEndImpl = React.useCallback(() => {\n activeDropTarget.current = undefined;\n onDragEnd?.();\n }, [onDragEnd]);\n useEventListener(\"dragend\", onDragEndImpl, eventTargetRef?.current ?? null, false, false);\n const onDropImpl = React.useCallback((event) => {\n const canvas = ref.current;\n if (canvas === null || onDrop === undefined) {\n return;\n }\n // Default can mess up sometimes.\n event.preventDefault();\n const args = getMouseArgsForPosition(canvas, event.clientX, event.clientY);\n const [rawCol, row] = args.location;\n const col = rawCol - (firstColAccessible ? 0 : 1);\n onDrop([col, row], event.dataTransfer);\n }, [firstColAccessible, getMouseArgsForPosition, onDrop]);\n useEventListener(\"drop\", onDropImpl, eventTargetRef?.current ?? null, false, false);\n const onDragLeaveImpl = React.useCallback(() => {\n onDragLeave?.();\n }, [onDragLeave]);\n useEventListener(\"dragleave\", onDragLeaveImpl, eventTargetRef?.current ?? null, false, false);\n const selectionRef = React.useRef(selection);\n selectionRef.current = selection;\n const focusRef = React.useRef(null);\n const focusElement = React.useCallback((el) => {\n // We don't want to steal the focus if we don't currently own the focus.\n if (ref.current === null || !ref.current.contains(document.activeElement))\n return;\n if (el === null && selectionRef.current.current !== undefined) {\n canvasRef?.current?.focus({\n preventScroll: true,\n });\n }\n else if (el !== null) {\n el.focus({\n preventScroll: true,\n });\n }\n focusRef.current = el;\n }, [canvasRef]);\n React.useImperativeHandle(forwardedRef, () => ({\n focus: () => {\n const el = focusRef.current;\n // The element in the ref may have been removed however our callback method ref\n // won't see the removal so bad things happen. Checking to see if the element is\n // no longer attached is enough to resolve the problem. In the future this\n // should be replaced with something much more robust.\n if (el === null || !document.contains(el)) {\n canvasRef?.current?.focus({\n preventScroll: true,\n });\n }\n else {\n el.focus({\n preventScroll: true,\n });\n }\n },\n getBounds: (col, row) => {\n if (canvasRef === undefined || canvasRef.current === null) {\n return undefined;\n }\n return getBoundsForItem(canvasRef.current, col ?? 0, row ?? -1);\n },\n damage,\n }), [canvasRef, damage, getBoundsForItem]);\n const lastFocusedSubdomNode = React.useRef();\n const accessibilityTree = useDebouncedMemo(() => {\n if (width < 50 || experimental?.disableAccessibilityTree === true)\n return null;\n let effectiveCols = getEffectiveColumns(mappedColumns, cellXOffset, width, dragAndDropState, translateX);\n const colOffset = firstColAccessible ? 0 : -1;\n if (!firstColAccessible && effectiveCols[0]?.sourceIndex === 0) {\n effectiveCols = effectiveCols.slice(1);\n }\n const [fCol, fRow] = selection.current?.cell ?? [];\n const range = selection.current?.range;\n const visibleCols = effectiveCols.map(c => c.sourceIndex);\n const visibleRows = makeRange(cellYOffset, Math.min(rows, cellYOffset + accessibilityHeight));\n // Maintain focus within grid if we own it but focused cell is outside visible viewport\n // and not rendered.\n if (fCol !== undefined &&\n fRow !== undefined &&\n !(visibleCols.includes(fCol) && visibleRows.includes(fRow))) {\n focusElement(null);\n }\n return (React.createElement(\"table\", { key: \"access-tree\", role: \"grid\", \"aria-rowcount\": rows + 1, \"aria-multiselectable\": \"true\", \"aria-colcount\": mappedColumns.length + colOffset },\n React.createElement(\"thead\", { role: \"rowgroup\" },\n React.createElement(\"tr\", { role: \"row\", \"aria-rowindex\": 1 }, effectiveCols.map(c => (React.createElement(\"th\", { role: \"columnheader\", \"aria-selected\": selection.columns.hasIndex(c.sourceIndex), \"aria-colindex\": c.sourceIndex + 1 + colOffset, tabIndex: -1, onFocus: e => {\n if (e.target === focusRef.current)\n return;\n return onCellFocused?.([c.sourceIndex, -1]);\n }, key: c.sourceIndex }, c.title))))),\n React.createElement(\"tbody\", { role: \"rowgroup\" }, visibleRows.map(row => (React.createElement(\"tr\", { role: \"row\", \"aria-selected\": selection.rows.hasIndex(row), key: row, \"aria-rowindex\": row + 2 }, effectiveCols.map(c => {\n const col = c.sourceIndex;\n const key = packColRowToNumber(col, row);\n const focused = fCol === col && fRow === row;\n const selected = range !== undefined &&\n col >= range.x &&\n col < range.x + range.width &&\n row >= range.y &&\n row < range.y + range.height;\n const id = `glide-cell-${col}-${row}`;\n const location = [col, row];\n const cellContent = getCellContent(location, true);\n return (React.createElement(\"td\", { key: key, role: \"gridcell\", \"aria-colindex\": col + 1 + colOffset, \"aria-selected\": selected, \"aria-readonly\": isInnerOnlyCell(cellContent) || !isReadWriteCell(cellContent), id: id, \"data-testid\": id, onClick: () => {\n const canvas = canvasRef?.current;\n if (canvas === null || canvas === undefined)\n return;\n return onKeyDown?.({\n bounds: getBoundsForItem(canvas, col, row),\n cancel: () => undefined,\n preventDefault: () => undefined,\n stopPropagation: () => undefined,\n ctrlKey: false,\n key: \"Enter\",\n keyCode: 13,\n metaKey: false,\n shiftKey: false,\n altKey: false,\n rawEvent: undefined,\n location,\n });\n }, onFocusCapture: e => {\n if (e.target === focusRef.current ||\n (lastFocusedSubdomNode.current?.[0] === col &&\n lastFocusedSubdomNode.current?.[1] === row))\n return;\n lastFocusedSubdomNode.current = location;\n return onCellFocused?.(location);\n }, ref: focused ? focusElement : undefined, tabIndex: -1 }, getRowData(cellContent, getCellRenderer)));\n })))))));\n }, [\n width,\n mappedColumns,\n cellXOffset,\n dragAndDropState,\n translateX,\n rows,\n cellYOffset,\n accessibilityHeight,\n selection,\n focusElement,\n getCellContent,\n canvasRef,\n onKeyDown,\n getBoundsForItem,\n onCellFocused,\n ], 200);\n const opacityX = freezeColumns === 0 || !fixedShadowX ? 0 : cellXOffset > freezeColumns ? 1 : clamp(-translateX / 100, 0, 1);\n const absoluteOffsetY = -cellYOffset * 32 + translateY;\n const opacityY = !fixedShadowY ? 0 : clamp(-absoluteOffsetY / 100, 0, 1);\n const stickyShadow = React.useMemo(() => {\n if (!opacityX && !opacityY) {\n return null;\n }\n const styleX = {\n position: \"absolute\",\n top: 0,\n left: stickyX,\n width: width - stickyX,\n height: height,\n opacity: opacityX,\n pointerEvents: \"none\",\n transition: !smoothScrollX ? \"opacity 0.2s\" : undefined,\n boxShadow: \"inset 13px 0 10px -13px rgba(0, 0, 0, 0.2)\",\n };\n const styleY = {\n position: \"absolute\",\n top: totalHeaderHeight,\n left: 0,\n width: width,\n height: height,\n opacity: opacityY,\n pointerEvents: \"none\",\n transition: !smoothScrollY ? \"opacity 0.2s\" : undefined,\n boxShadow: \"inset 0 13px 10px -13px rgba(0, 0, 0, 0.2)\",\n };\n return (React.createElement(React.Fragment, null,\n opacityX > 0 && React.createElement(\"div\", { id: \"shadow-x\", style: styleX }),\n opacityY > 0 && React.createElement(\"div\", { id: \"shadow-y\", style: styleY })));\n }, [opacityX, opacityY, stickyX, width, smoothScrollX, totalHeaderHeight, height, smoothScrollY]);\n const overlayStyle = React.useMemo(() => ({\n position: \"absolute\",\n top: 0,\n left: 0,\n }), []);\n return (React.createElement(React.Fragment, null,\n React.createElement(\"canvas\", { \"data-testid\": \"data-grid-canvas\", tabIndex: 0, onKeyDown: onKeyDownImpl, onKeyUp: onKeyUpImpl, onFocus: onCanvasFocused, onBlur: onCanvasBlur, ref: refImpl, style: style }, accessibilityTree),\n React.createElement(\"canvas\", { ref: overlayRef, style: overlayStyle }),\n stickyShadow));\n};\nexport default React.memo(React.forwardRef(DataGrid));\n//# sourceMappingURL=data-grid.js.map","/* eslint-disable unicorn/consistent-destructuring */\nimport clamp from \"lodash/clamp.js\";\nimport * as React from \"react\";\nimport DataGrid, {} from \"../data-grid/data-grid.js\";\n// Dear Past Jason,\n// Wtf does this function do? If you remember in the future come back and add a comment\n// -- Future-Past Jason\nfunction offsetColumnSize(column, width, min, max) {\n return clamp(Math.round(width - (column.growOffset ?? 0)), Math.ceil(min), Math.floor(max));\n}\nconst DataGridDnd = p => {\n const [resizeColStartX, setResizeColStartX] = React.useState();\n const [resizeCol, setResizeCol] = React.useState();\n const [dragCol, setDragCol] = React.useState();\n const [dropCol, setDropCol] = React.useState();\n const [dragColActive, setDragColActive] = React.useState(false);\n const [dragStartX, setDragStartX] = React.useState();\n const [dragRow, setDragRow] = React.useState();\n const [dropRow, setDropRow] = React.useState();\n const [dragRowActive, setDragRowActive] = React.useState(false);\n const [dragStartY, setDragStartY] = React.useState();\n const { onHeaderMenuClick, getCellContent, onColumnMoved, onColumnResize, onColumnResizeStart, onColumnResizeEnd, gridRef, maxColumnWidth, minColumnWidth, onRowMoved, lockColumns, onColumnProposeMove, onMouseDown, onMouseUp, onItemHovered, onDragStart, canvasRef, } = p;\n const canResize = (onColumnResize ?? onColumnResizeEnd ?? onColumnResizeStart) !== undefined;\n const { columns, selection } = p;\n const selectedColumns = selection.columns;\n const onItemHoveredImpl = React.useCallback((args) => {\n const [col, row] = args.location;\n if (dragCol !== undefined && dropCol !== col && col >= lockColumns) {\n setDragColActive(true);\n setDropCol(col);\n }\n else if (dragRow !== undefined && row !== undefined) {\n setDragRowActive(true);\n setDropRow(Math.max(0, row));\n // Don't emit onItemHovered if resizing or reordering a column or row.\n }\n else if (resizeCol === undefined && !dragColActive && !dragRowActive) {\n onItemHovered?.(args);\n }\n }, [dragCol, dragRow, dropCol, onItemHovered, lockColumns, resizeCol, dragColActive, dragRowActive]);\n const canDragCol = onColumnMoved !== undefined;\n const onMouseDownImpl = React.useCallback((args) => {\n if (args.button === 0) {\n const [col, row] = args.location;\n if (args.kind === \"out-of-bounds\" && args.isEdge && canResize) {\n const bounds = gridRef?.current?.getBounds(columns.length - 1, -1);\n if (bounds !== undefined) {\n setResizeColStartX(bounds.x);\n setResizeCol(columns.length - 1);\n }\n }\n else if (args.kind === \"header\" && col >= lockColumns) {\n const canvas = canvasRef?.current;\n if (args.isEdge && canResize && canvas) {\n setResizeColStartX(args.bounds.x);\n setResizeCol(col);\n const rect = canvas.getBoundingClientRect();\n const scale = rect.width / canvas.offsetWidth;\n const width = args.bounds.width / scale;\n onColumnResizeStart?.(columns[col], width, col, width + (columns[col].growOffset ?? 0));\n }\n else if (args.kind === \"header\" && canDragCol) {\n setDragStartX(args.bounds.x);\n setDragCol(col);\n }\n }\n else if (args.kind === \"cell\" &&\n lockColumns > 0 &&\n col === 0 &&\n row !== undefined &&\n onRowMoved !== undefined) {\n setDragStartY(args.bounds.y);\n setDragRow(row);\n }\n }\n onMouseDown?.(args);\n }, [onMouseDown, canResize, lockColumns, onRowMoved, gridRef, columns, canDragCol, onColumnResizeStart, canvasRef]);\n const onHeaderMenuClickMangled = React.useCallback((col, screenPosition) => {\n if (dragColActive || dragRowActive)\n return;\n onHeaderMenuClick?.(col, screenPosition);\n }, [dragColActive, dragRowActive, onHeaderMenuClick]);\n const lastResizeWidthRef = React.useRef(-1);\n const clearAll = React.useCallback(() => {\n lastResizeWidthRef.current = -1;\n setDragRow(undefined);\n setDropRow(undefined);\n setDragStartY(undefined);\n setDragRowActive(false);\n setDragCol(undefined);\n setDropCol(undefined);\n setDragStartX(undefined);\n setDragColActive(false);\n setResizeCol(undefined);\n setResizeColStartX(undefined);\n }, []);\n const onMouseUpImpl = React.useCallback((args, isOutside) => {\n if (args.button === 0) {\n if (resizeCol !== undefined) {\n // if the column is in selection, the selection may contain extra cols, so lets just re-send the last\n // resize event to all those columns.\n if (selectedColumns?.hasIndex(resizeCol) === true) {\n for (const c of selectedColumns) {\n if (c === resizeCol)\n continue;\n const col = columns[c];\n const newSize = offsetColumnSize(col, lastResizeWidthRef.current, minColumnWidth, maxColumnWidth);\n onColumnResize?.(col, newSize, c, newSize + (col.growOffset ?? 0));\n }\n }\n const ns = offsetColumnSize(columns[resizeCol], lastResizeWidthRef.current, minColumnWidth, maxColumnWidth);\n onColumnResizeEnd?.(columns[resizeCol], ns, resizeCol, ns + (columns[resizeCol].growOffset ?? 0));\n if (selectedColumns.hasIndex(resizeCol)) {\n for (const c of selectedColumns) {\n if (c === resizeCol)\n continue;\n const col = columns[c];\n const s = offsetColumnSize(col, lastResizeWidthRef.current, minColumnWidth, maxColumnWidth);\n onColumnResizeEnd?.(col, s, c, s + (col.growOffset ?? 0));\n }\n }\n }\n clearAll();\n if (dragCol !== undefined && dropCol !== undefined) {\n onColumnMoved?.(dragCol, dropCol);\n }\n if (dragRow !== undefined && dropRow !== undefined) {\n onRowMoved?.(dragRow, dropRow);\n }\n }\n onMouseUp?.(args, isOutside);\n }, [\n onMouseUp,\n resizeCol,\n dragCol,\n dropCol,\n dragRow,\n dropRow,\n selectedColumns,\n onColumnResizeEnd,\n columns,\n minColumnWidth,\n maxColumnWidth,\n onColumnResize,\n onColumnMoved,\n onRowMoved,\n clearAll,\n ]);\n const dragOffset = React.useMemo(() => {\n if (dragCol === undefined || dropCol === undefined)\n return undefined;\n if (dragCol === dropCol)\n return undefined;\n if (onColumnProposeMove?.(dragCol, dropCol) === false)\n return undefined;\n return {\n src: dragCol,\n dest: dropCol,\n };\n }, [dragCol, dropCol, onColumnProposeMove]);\n const onMouseMove = React.useCallback((event) => {\n const canvas = canvasRef?.current;\n if (dragCol !== undefined && dragStartX !== undefined) {\n const diff = Math.abs(event.clientX - dragStartX);\n if (diff > 20) {\n setDragColActive(true);\n }\n }\n else if (dragRow !== undefined && dragStartY !== undefined) {\n const diff = Math.abs(event.clientY - dragStartY);\n if (diff > 20) {\n setDragRowActive(true);\n }\n }\n else if (resizeCol !== undefined && resizeColStartX !== undefined && canvas) {\n const rect = canvas.getBoundingClientRect();\n const scale = rect.width / canvas.offsetWidth;\n const newWidth = (event.clientX - resizeColStartX) / scale;\n const column = columns[resizeCol];\n const ns = offsetColumnSize(column, newWidth, minColumnWidth, maxColumnWidth);\n onColumnResize?.(column, ns, resizeCol, ns + (column.growOffset ?? 0));\n lastResizeWidthRef.current = newWidth;\n if (selectedColumns?.first() === resizeCol) {\n for (const c of selectedColumns) {\n if (c === resizeCol)\n continue;\n const col = columns[c];\n const s = offsetColumnSize(col, lastResizeWidthRef.current, minColumnWidth, maxColumnWidth);\n onColumnResize?.(col, s, c, s + (col.growOffset ?? 0));\n }\n }\n }\n }, [\n dragCol,\n dragStartX,\n dragRow,\n dragStartY,\n resizeCol,\n resizeColStartX,\n columns,\n minColumnWidth,\n maxColumnWidth,\n onColumnResize,\n selectedColumns,\n canvasRef,\n ]);\n const getMangledCellContent = React.useCallback((cell, forceStrict) => {\n if (dragRow === undefined || dropRow === undefined)\n return getCellContent(cell, forceStrict);\n // eslint-disable-next-line prefer-const\n let [col, row] = cell;\n if (row === dropRow) {\n row = dragRow;\n }\n else {\n if (row > dropRow)\n row -= 1;\n if (row >= dragRow)\n row += 1;\n }\n return getCellContent([col, row], forceStrict);\n }, [dragRow, dropRow, getCellContent]);\n const onDragStartImpl = React.useCallback(args => {\n onDragStart?.(args);\n if (!args.defaultPrevented()) {\n clearAll();\n }\n }, [clearAll, onDragStart]);\n return (React.createElement(DataGrid, { accessibilityHeight: p.accessibilityHeight, canvasRef: p.canvasRef, cellXOffset: p.cellXOffset, cellYOffset: p.cellYOffset, columns: p.columns, disabledRows: p.disabledRows, drawFocusRing: p.drawFocusRing, drawHeader: p.drawHeader, drawCell: p.drawCell, enableGroups: p.enableGroups, eventTargetRef: p.eventTargetRef, experimental: p.experimental, fillHandle: p.fillHandle, firstColAccessible: p.firstColAccessible, fixedShadowX: p.fixedShadowX, fixedShadowY: p.fixedShadowY, freezeColumns: p.freezeColumns, getCellRenderer: p.getCellRenderer, getGroupDetails: p.getGroupDetails, getRowThemeOverride: p.getRowThemeOverride, groupHeaderHeight: p.groupHeaderHeight, headerHeight: p.headerHeight, headerIcons: p.headerIcons, height: p.height, highlightRegions: p.highlightRegions, imageWindowLoader: p.imageWindowLoader, resizeColumn: resizeCol, isDraggable: p.isDraggable, isFilling: p.isFilling, isFocused: p.isFocused, onCanvasBlur: p.onCanvasBlur, onCanvasFocused: p.onCanvasFocused, onCellFocused: p.onCellFocused, onContextMenu: p.onContextMenu, onDragEnd: p.onDragEnd, onDragLeave: p.onDragLeave, onDragOverCell: p.onDragOverCell, onDrop: p.onDrop, onKeyDown: p.onKeyDown, onKeyUp: p.onKeyUp, onMouseMove: p.onMouseMove, prelightCells: p.prelightCells, rowHeight: p.rowHeight, rows: p.rows, selection: p.selection, smoothScrollX: p.smoothScrollX, smoothScrollY: p.smoothScrollY, theme: p.theme, freezeTrailingRows: p.freezeTrailingRows, hasAppendRow: p.hasAppendRow, translateX: p.translateX, translateY: p.translateY, verticalBorder: p.verticalBorder, width: p.width, getCellContent: getMangledCellContent, isResizing: resizeCol !== undefined, onHeaderMenuClick: onHeaderMenuClickMangled, isDragging: dragColActive, onItemHovered: onItemHoveredImpl, onDragStart: onDragStartImpl, onMouseDown: onMouseDownImpl, allowResize: canResize, onMouseUp: onMouseUpImpl, dragAndDropState: dragOffset, onMouseMoveRaw: onMouseMove, ref: gridRef }));\n};\nexport default DataGridDnd;\n//# sourceMappingURL=data-grid-dnd.js.map","/* eslint-disable @typescript-eslint/strict-boolean-expressions */\nimport { useLayoutEffect, useState, useRef } from \"react\";\nexport function useResizeDetector(initialSize) {\n const ref = useRef(null);\n const [size, setSize] = useState({\n width: initialSize?.[0],\n height: initialSize?.[1],\n });\n useLayoutEffect(() => {\n const resizeCallback = entries => {\n for (const entry of entries) {\n const { width, height } = (entry && entry.contentRect) || {};\n setSize(cv => (cv.width === width && cv.height === height ? cv : { width, height }));\n }\n };\n const resizeObserver = new window.ResizeObserver(resizeCallback);\n if (ref.current) {\n resizeObserver.observe(ref.current, undefined);\n }\n return () => {\n resizeObserver.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ref.current]);\n return { ref, ...size };\n}\n//# sourceMappingURL=resize-detector.js.map","import { useEffect, useRef } from \"react\";\nconst useKineticScroll = (isEnabled, callback, targetScroller) => {\n const rafId = useRef(null);\n const isTouching = useRef(null);\n const lastScrollPosition = useRef(null);\n const sameCount = useRef(0);\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n const scrollEl = targetScroller.current;\n useEffect(() => {\n const handleScroll = () => {\n if (isTouching.current === false && scrollEl !== null) {\n const currentScrollPosition = [scrollEl.scrollLeft, scrollEl.scrollTop];\n if (lastScrollPosition.current?.[0] === currentScrollPosition[0] &&\n lastScrollPosition.current?.[1] === currentScrollPosition[1]) {\n if (sameCount.current > 10) {\n // Scroll position hasn't changed, stop the animation frame\n lastScrollPosition.current = null;\n isTouching.current = null;\n return;\n }\n else {\n sameCount.current++;\n }\n }\n else {\n sameCount.current = 0;\n callbackRef.current(currentScrollPosition[0], currentScrollPosition[1]);\n lastScrollPosition.current = currentScrollPosition;\n }\n rafId.current = window.setTimeout(handleScroll, 1000 / 120);\n }\n };\n const startTouch = () => {\n isTouching.current = true;\n lastScrollPosition.current = null; // Reset last scroll position on touch start\n if (rafId.current !== null) {\n window.clearTimeout(rafId.current);\n rafId.current = null;\n }\n };\n const endTouch = (event) => {\n if (event.touches.length === 0) {\n // All touches have ended\n isTouching.current = false;\n sameCount.current = 0;\n rafId.current = window.setTimeout(handleScroll, 1000 / 120);\n }\n };\n if (isEnabled && scrollEl !== null) {\n const element = scrollEl;\n element.addEventListener(\"touchstart\", startTouch);\n element.addEventListener(\"touchend\", endTouch);\n return () => {\n element.removeEventListener(\"touchstart\", startTouch);\n element.removeEventListener(\"touchend\", endTouch);\n if (rafId.current !== null) {\n window.clearTimeout(rafId.current);\n }\n };\n }\n }, [isEnabled, scrollEl]);\n};\nexport default useKineticScroll;\n//# sourceMappingURL=use-kinetic-scroll.js.map","import { styled } from \"@linaria/react\";\nimport * as React from \"react\";\nimport { useResizeDetector } from \"../../common/resize-detector.js\";\nimport { browserIsSafari } from \"../../common/browser-detect.js\";\nimport { useEventListener } from \"../../common/utils.js\";\nimport useKineticScroll from \"./use-kinetic-scroll.js\";\nconst _exp = /*#__PURE__*/() => p => p.isSafari ? \"scroll\" : \"auto\";\nconst ScrollRegionStyle = /*#__PURE__*/styled('div')({\n name: \"ScrollRegionStyle\",\n class: \"gdg-s1dgczr6\",\n propsAsIs: false,\n vars: {\n \"s1dgczr6-0\": [_exp()]\n }\n});\nfunction useTouchUpDelayed(delay) {\n const [hasTouches, setHasTouches] = React.useState(false);\n const safeWindow = typeof window === \"undefined\" ? null : window;\n const cbTimer = React.useRef(0);\n useEventListener(\"touchstart\", React.useCallback(() => {\n window.clearTimeout(cbTimer.current);\n setHasTouches(true);\n }, []), safeWindow, true, false);\n useEventListener(\"touchend\", React.useCallback(e => {\n if (e.touches.length === 0) {\n cbTimer.current = window.setTimeout(() => setHasTouches(false), delay);\n }\n }, [delay]), safeWindow, true, false);\n return hasTouches;\n}\nexport const InfiniteScroller = p => {\n const {\n children,\n clientHeight,\n scrollHeight,\n scrollWidth,\n update,\n draggable,\n className,\n preventDiagonalScrolling = false,\n paddingBottom = 0,\n paddingRight = 0,\n rightElement,\n rightElementProps,\n kineticScrollPerfHack = false,\n scrollRef,\n initialSize\n } = p;\n const padders = [];\n const rightElementSticky = rightElementProps?.sticky ?? false;\n const rightElementFill = rightElementProps?.fill ?? false;\n const offsetY = React.useRef(0);\n const lastScrollY = React.useRef(0);\n const scroller = React.useRef(null);\n const dpr = typeof window === \"undefined\" ? 1 : window.devicePixelRatio;\n const lastScrollPosition = React.useRef({\n scrollLeft: 0,\n scrollTop: 0,\n lockDirection: undefined\n });\n const rightWrapRef = React.useRef(null);\n const hasTouches = useTouchUpDelayed(200);\n const [isIdle, setIsIdle] = React.useState(true);\n const idleTimer = React.useRef(0);\n React.useLayoutEffect(() => {\n if (!isIdle || hasTouches || lastScrollPosition.current.lockDirection === undefined) return;\n const el = scroller.current;\n if (el === null) return;\n const [lx, ly] = lastScrollPosition.current.lockDirection;\n if (lx !== undefined) {\n el.scrollLeft = lx;\n } else if (ly !== undefined) {\n el.scrollTop = ly;\n }\n lastScrollPosition.current.lockDirection = undefined;\n }, [hasTouches, isIdle]);\n const onScroll = React.useCallback((scrollLeft, scrollTop) => {\n const el = scroller.current;\n if (el === null) return;\n scrollTop = scrollTop ?? el.scrollTop;\n scrollLeft = scrollLeft ?? el.scrollLeft;\n const lastScrollTop = lastScrollPosition.current.scrollTop;\n const lastScrollLeft = lastScrollPosition.current.scrollLeft;\n const dx = scrollLeft - lastScrollLeft;\n const dy = scrollTop - lastScrollTop;\n if (hasTouches && dx !== 0 && dy !== 0 && (Math.abs(dx) > 3 || Math.abs(dy) > 3) && preventDiagonalScrolling && lastScrollPosition.current.lockDirection === undefined) {\n lastScrollPosition.current.lockDirection = Math.abs(dx) < Math.abs(dy) ? [lastScrollLeft, undefined] : [undefined, lastScrollTop];\n }\n const lock = lastScrollPosition.current.lockDirection;\n scrollLeft = lock?.[0] ?? scrollLeft;\n scrollTop = lock?.[1] ?? scrollTop;\n lastScrollPosition.current.scrollLeft = scrollLeft;\n lastScrollPosition.current.scrollTop = scrollTop;\n const cWidth = el.clientWidth;\n const cHeight = el.clientHeight;\n const newY = scrollTop;\n const delta = lastScrollY.current - newY;\n const scrollableHeight = el.scrollHeight - cHeight;\n lastScrollY.current = newY;\n if (scrollableHeight > 0 && (Math.abs(delta) > 2000 || newY === 0 || newY === scrollableHeight) && scrollHeight > el.scrollHeight + 5) {\n const prog = newY / scrollableHeight;\n const recomputed = (scrollHeight - cHeight) * prog;\n offsetY.current = recomputed - newY;\n }\n if (lock !== undefined) {\n window.clearTimeout(idleTimer.current);\n setIsIdle(false);\n idleTimer.current = window.setTimeout(() => setIsIdle(true), 200);\n }\n update({\n x: scrollLeft,\n y: newY + offsetY.current,\n width: cWidth - paddingRight,\n height: cHeight - paddingBottom,\n paddingRight: rightWrapRef.current?.clientWidth ?? 0\n });\n }, [paddingBottom, paddingRight, scrollHeight, update, preventDiagonalScrolling, hasTouches]);\n useKineticScroll(kineticScrollPerfHack && browserIsSafari.value, onScroll, scroller);\n const onScrollRef = React.useRef(onScroll);\n onScrollRef.current = onScroll;\n const lastProps = React.useRef();\n const didFirstScroll = React.useRef(false);\n // if this is not a layout effect there will be a flicker when changing the number of freezeColumns\n // we need to document what this is needed at all.\n React.useLayoutEffect(() => {\n if (didFirstScroll.current) onScroll();else didFirstScroll.current = true;\n }, [onScroll, paddingBottom, paddingRight]);\n const setRefs = React.useCallback(instance => {\n scroller.current = instance;\n if (scrollRef !== undefined) {\n scrollRef.current = instance;\n }\n }, [scrollRef]);\n let key = 0;\n let h = 0;\n padders.push(React.createElement(\"div\", {\n key: key++,\n style: {\n width: scrollWidth,\n height: 0\n }\n }));\n while (h < scrollHeight) {\n const toAdd = Math.min(5000000, scrollHeight - h);\n padders.push(React.createElement(\"div\", {\n key: key++,\n style: {\n width: 0,\n height: toAdd\n }\n }));\n h += toAdd;\n }\n const {\n ref,\n width,\n height\n } = useResizeDetector(initialSize);\n if (typeof window !== \"undefined\" && (lastProps.current?.height !== height || lastProps.current?.width !== width)) {\n window.setTimeout(() => onScrollRef.current(), 0);\n lastProps.current = {\n width,\n height\n };\n }\n if ((width ?? 0) === 0 || (height ?? 0) === 0) return React.createElement(\"div\", {\n ref: ref\n });\n return React.createElement(\"div\", {\n ref: ref\n }, React.createElement(ScrollRegionStyle, {\n isSafari: browserIsSafari.value\n }, React.createElement(\"div\", {\n className: \"dvn-underlay\"\n }, children), React.createElement(\"div\", {\n ref: setRefs,\n style: lastProps.current,\n draggable: draggable,\n onDragStart: e => {\n if (!draggable) {\n e.stopPropagation();\n e.preventDefault();\n }\n },\n className: \"dvn-scroller \" + (className ?? \"\"),\n onScroll: () => onScroll()\n }, React.createElement(\"div\", {\n className: \"dvn-scroll-inner\" + (rightElement === undefined ? \" dvn-hidden\" : \"\")\n }, React.createElement(\"div\", {\n className: \"dvn-stack\"\n }, padders), rightElement !== undefined && React.createElement(React.Fragment, null, !rightElementFill && React.createElement(\"div\", {\n className: \"dvn-spacer\"\n }), React.createElement(\"div\", {\n ref: rightWrapRef,\n style: {\n height,\n maxHeight: clientHeight - Math.ceil(dpr % 1),\n position: \"sticky\",\n top: 0,\n paddingLeft: 1,\n marginBottom: -40,\n marginRight: paddingRight,\n flexGrow: rightElementFill ? 1 : undefined,\n right: rightElementSticky ? paddingRight ?? 0 : undefined,\n pointerEvents: \"auto\"\n }\n }, rightElement))))));\n};\n\n","import * as React from \"react\";\nimport DataGridDnd, {} from \"../data-grid-dnd/data-grid-dnd.js\";\nimport { InfiniteScroller } from \"./infinite-scroller.js\";\nconst GridScroller = p => {\n const { columns, rows, rowHeight, headerHeight, groupHeaderHeight, enableGroups, freezeColumns, experimental, nonGrowWidth, clientSize, className, onVisibleRegionChanged, scrollRef, preventDiagonalScrolling, rightElement, rightElementProps, overscrollX, overscrollY, initialSize, smoothScrollX = false, smoothScrollY = false, isDraggable, } = p;\n const { paddingRight, paddingBottom } = experimental ?? {};\n const [clientWidth, clientHeight] = clientSize;\n const last = React.useRef();\n const lastX = React.useRef();\n const lastY = React.useRef();\n const lastSize = React.useRef();\n const width = nonGrowWidth + Math.max(0, overscrollX ?? 0);\n let height = enableGroups ? headerHeight + groupHeaderHeight : headerHeight;\n if (typeof rowHeight === \"number\") {\n height += rows * rowHeight;\n }\n else {\n for (let r = 0; r < rows; r++) {\n height += rowHeight(r);\n }\n }\n if (overscrollY !== undefined) {\n height += overscrollY;\n }\n const lastArgs = React.useRef();\n const processArgs = React.useCallback(() => {\n if (lastArgs.current === undefined)\n return;\n const args = { ...lastArgs.current };\n let x = 0;\n let tx = args.x < 0 ? -args.x : 0;\n let cellRight = 0;\n let cellX = 0;\n args.x = args.x < 0 ? 0 : args.x;\n let stickyColWidth = 0;\n for (let i = 0; i < freezeColumns; i++) {\n stickyColWidth += columns[i].width;\n }\n for (const c of columns) {\n const cx = x - stickyColWidth;\n if (args.x >= cx + c.width) {\n x += c.width;\n cellX++;\n cellRight++;\n }\n else if (args.x > cx) {\n x += c.width;\n if (smoothScrollX) {\n tx += cx - args.x;\n }\n else {\n cellX++;\n }\n cellRight++;\n }\n else if (args.x + args.width > cx) {\n x += c.width;\n cellRight++;\n }\n else {\n break;\n }\n }\n let ty = 0;\n let cellY = 0;\n let cellBottom = 0;\n if (typeof rowHeight === \"number\") {\n if (smoothScrollY) {\n cellY = Math.floor(args.y / rowHeight);\n ty = cellY * rowHeight - args.y;\n }\n else {\n cellY = Math.ceil(args.y / rowHeight);\n }\n cellBottom = Math.ceil(args.height / rowHeight) + cellY;\n if (ty < 0)\n cellBottom++;\n }\n else {\n let y = 0;\n for (let row = 0; row < rows; row++) {\n const rh = rowHeight(row);\n const cy = y + (smoothScrollY ? 0 : rh / 2);\n if (args.y >= y + rh) {\n y += rh;\n cellY++;\n cellBottom++;\n }\n else if (args.y > cy) {\n y += rh;\n if (smoothScrollY) {\n ty += cy - args.y;\n }\n else {\n cellY++;\n }\n cellBottom++;\n }\n else if (args.y + args.height > rh / 2 + y) {\n y += rh;\n cellBottom++;\n }\n else {\n break;\n }\n }\n }\n const rect = {\n x: cellX,\n y: cellY,\n width: cellRight - cellX,\n height: cellBottom - cellY,\n };\n const oldRect = last.current;\n if (oldRect === undefined ||\n oldRect.y !== rect.y ||\n oldRect.x !== rect.x ||\n oldRect.height !== rect.height ||\n oldRect.width !== rect.width ||\n lastX.current !== tx ||\n lastY.current !== ty ||\n args.width !== lastSize.current?.[0] ||\n args.height !== lastSize.current?.[1]) {\n onVisibleRegionChanged?.({\n x: cellX,\n y: cellY,\n width: cellRight - cellX,\n height: cellBottom - cellY,\n }, args.width, args.height, args.paddingRight ?? 0, tx, ty);\n last.current = rect;\n lastX.current = tx;\n lastY.current = ty;\n lastSize.current = [args.width, args.height];\n }\n }, [columns, rowHeight, rows, onVisibleRegionChanged, freezeColumns, smoothScrollX, smoothScrollY]);\n const onScrollUpdate = React.useCallback((args) => {\n lastArgs.current = args;\n processArgs();\n }, [processArgs]);\n React.useEffect(() => {\n processArgs();\n }, [processArgs]);\n return (React.createElement(InfiniteScroller, { scrollRef: scrollRef, className: className, kineticScrollPerfHack: experimental?.kineticScrollPerfHack, preventDiagonalScrolling: preventDiagonalScrolling, draggable: isDraggable === true || typeof isDraggable === \"string\", scrollWidth: width + (paddingRight ?? 0), scrollHeight: height + (paddingBottom ?? 0), clientHeight: clientHeight, rightElement: rightElement, paddingBottom: paddingBottom, paddingRight: paddingRight, rightElementProps: rightElementProps, update: onScrollUpdate, initialSize: initialSize },\n React.createElement(DataGridDnd, { eventTargetRef: scrollRef, width: clientWidth, height: clientHeight, accessibilityHeight: p.accessibilityHeight, canvasRef: p.canvasRef, cellXOffset: p.cellXOffset, cellYOffset: p.cellYOffset, columns: p.columns, disabledRows: p.disabledRows, enableGroups: p.enableGroups, fillHandle: p.fillHandle, firstColAccessible: p.firstColAccessible, fixedShadowX: p.fixedShadowX, fixedShadowY: p.fixedShadowY, freezeColumns: p.freezeColumns, getCellContent: p.getCellContent, getCellRenderer: p.getCellRenderer, getGroupDetails: p.getGroupDetails, getRowThemeOverride: p.getRowThemeOverride, groupHeaderHeight: p.groupHeaderHeight, headerHeight: p.headerHeight, highlightRegions: p.highlightRegions, imageWindowLoader: p.imageWindowLoader, isFilling: p.isFilling, isFocused: p.isFocused, lockColumns: p.lockColumns, maxColumnWidth: p.maxColumnWidth, minColumnWidth: p.minColumnWidth, onHeaderMenuClick: p.onHeaderMenuClick, onMouseMove: p.onMouseMove, prelightCells: p.prelightCells, rowHeight: p.rowHeight, rows: p.rows, selection: p.selection, theme: p.theme, freezeTrailingRows: p.freezeTrailingRows, hasAppendRow: p.hasAppendRow, translateX: p.translateX, translateY: p.translateY, onColumnProposeMove: p.onColumnProposeMove, verticalBorder: p.verticalBorder, drawFocusRing: p.drawFocusRing, drawHeader: p.drawHeader, drawCell: p.drawCell, experimental: p.experimental, gridRef: p.gridRef, headerIcons: p.headerIcons, isDraggable: p.isDraggable, onCanvasBlur: p.onCanvasBlur, onCanvasFocused: p.onCanvasFocused, onCellFocused: p.onCellFocused, onColumnMoved: p.onColumnMoved, onColumnResize: p.onColumnResize, onColumnResizeEnd: p.onColumnResizeEnd, onColumnResizeStart: p.onColumnResizeStart, onContextMenu: p.onContextMenu, onDragEnd: p.onDragEnd, onDragLeave: p.onDragLeave, onDragOverCell: p.onDragOverCell, onDragStart: p.onDragStart, onDrop: p.onDrop, onItemHovered: p.onItemHovered, onKeyDown: p.onKeyDown, onKeyUp: p.onKeyUp, onMouseDown: p.onMouseDown, onMouseUp: p.onMouseUp, onRowMoved: p.onRowMoved, smoothScrollX: p.smoothScrollX, smoothScrollY: p.smoothScrollY })));\n};\nexport default GridScroller;\n//# sourceMappingURL=scrolling-data-grid.js.map","import { styled } from \"@linaria/react\";\nexport const SearchWrapper = /*#__PURE__*/styled('div')({\n name: \"SearchWrapper\",\n class: \"gdg-seveqep\",\n propsAsIs: false\n});\n\n","/* eslint-disable unicorn/consistent-destructuring */\nimport * as React from \"react\";\nimport { GridCellKind, } from \"../data-grid/data-grid-types.js\";\nimport ScrollingDataGrid, {} from \"../scrolling-data-grid/scrolling-data-grid.js\";\nimport { SearchWrapper } from \"./data-grid-search-style.js\";\nimport { assert } from \"../../common/support.js\";\n// icons\nconst upArrow = (React.createElement(\"svg\", { className: \"button-icon\", viewBox: \"0 0 512 512\" },\n React.createElement(\"path\", { fill: \"none\", stroke: \"currentColor\", strokeLinecap: \"round\", strokeLinejoin: \"round\", strokeWidth: \"48\", d: \"M112 244l144-144 144 144M256 120v292\" })));\nconst downArrow = (React.createElement(\"svg\", { className: \"button-icon\", viewBox: \"0 0 512 512\" },\n React.createElement(\"path\", { fill: \"none\", stroke: \"currentColor\", strokeLinecap: \"round\", strokeLinejoin: \"round\", strokeWidth: \"48\", d: \"M112 268l144 144 144-144M256 392V100\" })));\nconst closeX = (React.createElement(\"svg\", { className: \"button-icon\", viewBox: \"0 0 512 512\" },\n React.createElement(\"path\", { fill: \"none\", stroke: \"currentColor\", strokeLinecap: \"round\", strokeLinejoin: \"round\", strokeWidth: \"32\", d: \"M368 368L144 144M368 144L144 368\" })));\nconst targetSearchTimeMS = 10;\nconst DataGridSearch = p => {\n const { canvasRef, cellYOffset, rows, columns, searchInputRef, searchValue, searchResults: searchResultsIn, onSearchValueChange, getCellsForSelection, onSearchResultsChanged, showSearch = false, onSearchClose, } = p;\n const [searchID] = React.useState(() => \"search-box-\" + Math.round(Math.random() * 1000));\n const [searchStringInner, setSearchStringInner] = React.useState(\"\");\n const searchString = searchValue ?? searchStringInner;\n // always emit both, this allows the user to spy on the search value without controlling it.\n const setSearchString = React.useCallback((newVal) => {\n setSearchStringInner(newVal);\n onSearchValueChange?.(newVal);\n }, [onSearchValueChange]);\n const [searchStatus, setSearchStatus] = React.useState();\n const searchStatusRef = React.useRef(searchStatus);\n searchStatusRef.current = searchStatus;\n React.useEffect(() => {\n if (searchResultsIn === undefined)\n return;\n if (searchResultsIn.length > 0) {\n setSearchStatus(cv => ({\n rowsSearched: rows,\n results: searchResultsIn.length,\n selectedIndex: cv?.selectedIndex ?? -1,\n }));\n }\n else {\n setSearchStatus(undefined);\n }\n }, [rows, searchResultsIn]);\n const abortControllerRef = React.useRef();\n if (abortControllerRef.current === undefined)\n abortControllerRef.current = new AbortController();\n const searchHandle = React.useRef();\n const [searchResultsInner, setSearchResultsInner] = React.useState([]);\n const searchResults = searchResultsIn ?? searchResultsInner;\n const cancelSearch = React.useCallback(() => {\n if (searchHandle.current !== undefined) {\n window.cancelAnimationFrame(searchHandle.current);\n searchHandle.current = undefined;\n abortControllerRef.current.abort();\n }\n }, []);\n const cellYOffsetRef = React.useRef(cellYOffset);\n cellYOffsetRef.current = cellYOffset;\n const beginSearch = React.useCallback((str) => {\n const regex = new RegExp(str.replace(/([$()*+.?[\\\\\\]^{|}-])/g, \"\\\\$1\"), \"i\");\n let startY = cellYOffsetRef.current;\n // Lets assume we can do 10 rows at a time\n // This is usually very safe and limits the damage for bad\n // performing sheets.\n let searchStride = Math.min(10, rows);\n let rowsSearched = 0;\n setSearchStatus(undefined);\n setSearchResultsInner([]);\n const runningResult = [];\n const tick = async () => {\n if (getCellsForSelection === undefined)\n return;\n const tStart = performance.now();\n const rowsLeft = rows - rowsSearched;\n let data = getCellsForSelection({\n x: 0,\n y: startY,\n width: columns.length,\n height: Math.min(searchStride, rowsLeft, rows - startY),\n }, abortControllerRef.current.signal);\n if (typeof data === \"function\") {\n data = await data();\n }\n let added = false;\n for (const [row, d] of data.entries()) {\n for (const [col, cell] of d.entries()) {\n let testString;\n switch (cell.kind) {\n case GridCellKind.Text:\n case GridCellKind.Number:\n testString = cell.displayData;\n break;\n case GridCellKind.Uri:\n case GridCellKind.Markdown:\n testString = cell.data;\n break;\n case GridCellKind.Boolean:\n testString = typeof cell.data === \"boolean\" ? cell.data.toString() : undefined;\n break;\n case GridCellKind.Image:\n case GridCellKind.Bubble:\n // I know its lazy, but unless someone is actually\n // searching for the whale emoji, this is pretty side effect\n // free. And ya know... it's nice and easy to do...\n testString = cell.data.join(\"🐳\");\n break;\n case GridCellKind.Custom:\n testString = cell.copyData;\n break;\n }\n if (testString !== undefined && regex.test(testString)) {\n runningResult.push([col, row + startY]);\n added = true;\n }\n }\n }\n const tEnd = performance.now();\n if (added) {\n setSearchResultsInner([...runningResult]);\n }\n rowsSearched += data.length;\n assert(rowsSearched <= rows);\n const selectedIndex = searchStatusRef.current?.selectedIndex ?? -1;\n setSearchStatus({\n results: runningResult.length,\n rowsSearched,\n selectedIndex,\n });\n onSearchResultsChanged?.(runningResult, selectedIndex);\n if (startY + searchStride >= rows) {\n startY = 0;\n }\n else {\n startY += searchStride;\n }\n const tElapsed = tEnd - tStart;\n const rounded = Math.max(tElapsed, 1);\n const scalar = targetSearchTimeMS / rounded;\n searchStride = Math.ceil(searchStride * scalar);\n if (rowsSearched < rows && runningResult.length < 1000) {\n searchHandle.current = window.requestAnimationFrame(tick);\n }\n };\n cancelSearch();\n searchHandle.current = window.requestAnimationFrame(tick);\n }, [cancelSearch, columns.length, getCellsForSelection, onSearchResultsChanged, rows]);\n const onClose = React.useCallback(() => {\n onSearchClose?.();\n setSearchStatus(undefined);\n setSearchResultsInner([]);\n onSearchResultsChanged?.([], -1);\n cancelSearch();\n canvasRef?.current?.focus();\n }, [cancelSearch, canvasRef, onSearchClose, onSearchResultsChanged]);\n const onSearchChange = React.useCallback((event) => {\n setSearchString(event.target.value);\n if (searchResultsIn !== undefined)\n return;\n if (event.target.value === \"\") {\n setSearchStatus(undefined);\n setSearchResultsInner([]);\n cancelSearch();\n }\n else {\n beginSearch(event.target.value);\n }\n }, [beginSearch, cancelSearch, setSearchString, searchResultsIn]);\n React.useEffect(() => {\n if (showSearch && searchInputRef.current !== null) {\n setSearchString(\"\");\n searchInputRef.current.focus({ preventScroll: true });\n }\n }, [showSearch, searchInputRef, setSearchString]);\n const onNext = React.useCallback((ev) => {\n ev?.stopPropagation?.();\n if (searchStatus === undefined)\n return;\n const newIndex = (searchStatus.selectedIndex + 1) % searchStatus.results;\n setSearchStatus({\n ...searchStatus,\n selectedIndex: newIndex,\n });\n onSearchResultsChanged?.(searchResults, newIndex);\n }, [searchStatus, onSearchResultsChanged, searchResults]);\n const onPrev = React.useCallback((ev) => {\n ev?.stopPropagation?.();\n if (searchStatus === undefined)\n return;\n let newIndex = (searchStatus.selectedIndex - 1) % searchStatus.results;\n if (newIndex < 0)\n newIndex += searchStatus.results;\n setSearchStatus({\n ...searchStatus,\n selectedIndex: newIndex,\n });\n onSearchResultsChanged?.(searchResults, newIndex);\n }, [onSearchResultsChanged, searchResults, searchStatus]);\n const onSearchKeyDown = React.useCallback((event) => {\n if (((event.ctrlKey || event.metaKey) && event.nativeEvent.code === \"KeyF\") || event.key === \"Escape\") {\n onClose();\n event.stopPropagation();\n event.preventDefault();\n }\n else if (event.key === \"Enter\") {\n if (event.shiftKey) {\n onPrev();\n }\n else {\n onNext();\n }\n }\n }, [onClose, onNext, onPrev]);\n // cancel search if the component is unmounted\n React.useEffect(() => {\n return () => {\n cancelSearch();\n };\n }, [cancelSearch]);\n const [isAnimatingOut, setIsAnimatingOut] = React.useState(false);\n React.useEffect(() => {\n if (showSearch) {\n setIsAnimatingOut(true);\n }\n else {\n const timeoutId = setTimeout(() => setIsAnimatingOut(false), 150);\n return () => clearTimeout(timeoutId);\n }\n }, [showSearch]);\n const searchbox = React.useMemo(() => {\n if (!showSearch && !isAnimatingOut) {\n return null;\n }\n let resultString;\n if (searchStatus !== undefined) {\n resultString =\n searchStatus.results >= 1000\n ? `over 1000`\n : `${searchStatus.results} result${searchStatus.results !== 1 ? \"s\" : \"\"}`;\n if (searchStatus.selectedIndex >= 0) {\n resultString = `${searchStatus.selectedIndex + 1} of ${resultString}`;\n }\n }\n const cancelEvent = (ev) => {\n ev.stopPropagation();\n };\n const rowsSearchedProgress = Math.floor(((searchStatus?.rowsSearched ?? 0) / rows) * 100);\n const progressStyle = {\n width: `${rowsSearchedProgress}%`,\n };\n return (React.createElement(SearchWrapper, { className: showSearch ? \"\" : \"out\", onMouseDown: cancelEvent, onMouseMove: cancelEvent, onMouseUp: cancelEvent, onClick: cancelEvent },\n React.createElement(\"div\", { className: \"gdg-search-bar-inner\" },\n React.createElement(\"input\", { id: searchID, \"aria-hidden\": !showSearch, \"data-testid\": \"search-input\", ref: searchInputRef, onChange: onSearchChange, value: searchString, tabIndex: showSearch ? undefined : -1, onKeyDownCapture: onSearchKeyDown }),\n React.createElement(\"button\", { \"aria-label\": \"Previous Result\", \"aria-hidden\": !showSearch, tabIndex: showSearch ? undefined : -1, onClick: onPrev, disabled: (searchStatus?.results ?? 0) === 0 }, upArrow),\n React.createElement(\"button\", { \"aria-label\": \"Next Result\", \"aria-hidden\": !showSearch, tabIndex: showSearch ? undefined : -1, onClick: onNext, disabled: (searchStatus?.results ?? 0) === 0 }, downArrow),\n onSearchClose !== undefined && (React.createElement(\"button\", { \"aria-label\": \"Close Search\", \"aria-hidden\": !showSearch, \"data-testid\": \"search-close-button\", tabIndex: showSearch ? undefined : -1, onClick: onClose }, closeX))),\n searchStatus !== undefined ? (React.createElement(React.Fragment, null,\n React.createElement(\"div\", { className: \"gdg-search-status\" },\n React.createElement(\"div\", { \"data-testid\": \"search-result-area\" }, resultString)),\n React.createElement(\"div\", { className: \"gdg-search-progress\", style: progressStyle }))) : (React.createElement(\"div\", { className: \"gdg-search-status\" },\n React.createElement(\"label\", { htmlFor: searchID }, \"Type to search\")))));\n }, [\n showSearch,\n isAnimatingOut,\n searchStatus,\n rows,\n searchID,\n searchInputRef,\n onSearchChange,\n searchString,\n onSearchKeyDown,\n onPrev,\n onNext,\n onSearchClose,\n onClose,\n ]);\n return (React.createElement(React.Fragment, null,\n React.createElement(ScrollingDataGrid, { prelightCells: searchResults, accessibilityHeight: p.accessibilityHeight, canvasRef: p.canvasRef, cellXOffset: p.cellXOffset, cellYOffset: p.cellYOffset, className: p.className, clientSize: p.clientSize, columns: p.columns, disabledRows: p.disabledRows, enableGroups: p.enableGroups, fillHandle: p.fillHandle, firstColAccessible: p.firstColAccessible, nonGrowWidth: p.nonGrowWidth, fixedShadowX: p.fixedShadowX, fixedShadowY: p.fixedShadowY, freezeColumns: p.freezeColumns, getCellContent: p.getCellContent, getCellRenderer: p.getCellRenderer, getGroupDetails: p.getGroupDetails, getRowThemeOverride: p.getRowThemeOverride, groupHeaderHeight: p.groupHeaderHeight, headerHeight: p.headerHeight, highlightRegions: p.highlightRegions, imageWindowLoader: p.imageWindowLoader, initialSize: p.initialSize, isFilling: p.isFilling, isFocused: p.isFocused, lockColumns: p.lockColumns, maxColumnWidth: p.maxColumnWidth, minColumnWidth: p.minColumnWidth, onHeaderMenuClick: p.onHeaderMenuClick, onMouseMove: p.onMouseMove, onVisibleRegionChanged: p.onVisibleRegionChanged, overscrollX: p.overscrollX, overscrollY: p.overscrollY, preventDiagonalScrolling: p.preventDiagonalScrolling, rightElement: p.rightElement, rightElementProps: p.rightElementProps, rowHeight: p.rowHeight, rows: p.rows, scrollRef: p.scrollRef, selection: p.selection, theme: p.theme, freezeTrailingRows: p.freezeTrailingRows, hasAppendRow: p.hasAppendRow, translateX: p.translateX, translateY: p.translateY, verticalBorder: p.verticalBorder, onColumnProposeMove: p.onColumnProposeMove, drawFocusRing: p.drawFocusRing, drawCell: p.drawCell, drawHeader: p.drawHeader, experimental: p.experimental, gridRef: p.gridRef, headerIcons: p.headerIcons, isDraggable: p.isDraggable, onCanvasBlur: p.onCanvasBlur, onCanvasFocused: p.onCanvasFocused, onCellFocused: p.onCellFocused, onColumnMoved: p.onColumnMoved, onColumnResize: p.onColumnResize, onColumnResizeEnd: p.onColumnResizeEnd, onColumnResizeStart: p.onColumnResizeStart, onContextMenu: p.onContextMenu, onDragEnd: p.onDragEnd, onDragLeave: p.onDragLeave, onDragOverCell: p.onDragOverCell, onDragStart: p.onDragStart, onDrop: p.onDrop, onItemHovered: p.onItemHovered, onKeyDown: p.onKeyDown, onKeyUp: p.onKeyUp, onMouseDown: p.onMouseDown, onMouseUp: p.onMouseUp, onRowMoved: p.onRowMoved, smoothScrollX: p.smoothScrollX, smoothScrollY: p.smoothScrollY }),\n searchbox));\n};\nexport default DataGridSearch;\n//# sourceMappingURL=data-grid-search.js.map","import React from \"react\";\nimport { styled } from \"@linaria/react\";\nimport ClickOutsideContainer from \"../internal/click-outside-container/click-outside-container.js\";\nconst _exp = /*#__PURE__*/() => p => Math.max(16, p.targetHeight - 10);\nconst RenameInput = /*#__PURE__*/styled('input')({\n name: \"RenameInput\",\n class: \"gdg-r17m35ur\",\n propsAsIs: false,\n vars: {\n \"r17m35ur-0\": [_exp(), \"px\"]\n }\n});\nexport const GroupRename = p => {\n const {\n bounds,\n group,\n onClose,\n canvasBounds,\n onFinish\n } = p;\n const [value, setValue] = React.useState(group);\n return React.createElement(ClickOutsideContainer, {\n style: {\n position: \"absolute\",\n left: bounds.x - canvasBounds.left + 1,\n top: bounds.y - canvasBounds.top,\n width: bounds.width - 2,\n height: bounds.height\n },\n className: \"gdg-c1tqibwd\",\n onClickOutside: onClose\n }, React.createElement(RenameInput, {\n targetHeight: bounds.height,\n \"data-testid\": \"group-rename-input\",\n value: value,\n onBlur: onClose,\n onFocus: e => e.target.setSelectionRange(0, value.length),\n onChange: e => setValue(e.target.value),\n onKeyDown: e => {\n if (e.key === \"Enter\") {\n onFinish(value);\n } else if (e.key === \"Escape\") {\n onClose();\n }\n },\n autoFocus: true\n }));\n};\n\n","import { browserIsOSX } from \"./browser-detect.js\";\n// brain dead syntax, find your deps, and make buggy replacements with 5 times the effort\n// all lower case\n// ctrl+shift+alt+d or ctrl+x or shift+c or shift+Backspace or alt+_53\n// you get it, last one is always event.key, nothing fancy\n// special: primary === ctrl on windows, meta on mac\n// no to lower, its a waste, we're the only consumer, don't use caps\n// and before you ask, yes space is \" \", e.g. \"ctrl+alt+ \", whatacountry.gif\n// load bearing whitespace, it's basically python\n// if the char starts with a _ it is the event.keycode instead\nfunction checkKey(key, args) {\n if (key === undefined)\n return false;\n if (key.length > 1 && key.startsWith(\"_\")) {\n const keycode = Number.parseInt(key.slice(1));\n return keycode === args.keyCode;\n }\n if (key.length === 1 && key >= \"a\" && key <= \"z\") {\n return key.toUpperCase().codePointAt(0) === args.keyCode;\n }\n return key === args.key;\n}\nexport function isHotkey(hotkey, args, details) {\n const result = isHotkeyInner(hotkey, args);\n if (result)\n details.didMatch = true;\n return result;\n}\nfunction isHotkeyInner(hotkey, args) {\n if (hotkey.length === 0)\n return false;\n if (hotkey.includes(\"|\")) {\n const parts = hotkey.split(\"|\");\n for (const part of parts) {\n if (isHotkeyInner(part, args))\n return true;\n }\n return false;\n }\n let wantCtrl = false;\n let wantShift = false;\n let wantAlt = false;\n let wantMeta = false;\n const split = hotkey.split(\"+\");\n const key = split.pop();\n if (!checkKey(key, args))\n return false;\n if (split[0] === \"any\")\n return true;\n for (const accel of split) {\n switch (accel) {\n case \"ctrl\":\n wantCtrl = true;\n break;\n case \"shift\":\n wantShift = true;\n break;\n case \"alt\":\n wantAlt = true;\n break;\n case \"meta\":\n wantMeta = true;\n break;\n case \"primary\":\n if (browserIsOSX.value) {\n wantMeta = true;\n }\n else {\n wantCtrl = true;\n }\n break;\n }\n }\n return (args.altKey === wantAlt && args.ctrlKey === wantCtrl && args.shiftKey === wantShift && args.metaKey === wantMeta);\n}\n//# sourceMappingURL=is-hotkey.js.map","import React from \"react\";\nimport { CompactSelection } from \"./data-grid-types.js\";\nexport function useSelectionBehavior(gridSelection, setGridSelection, rangeBehavior, columnBehavior, rowBehavior, rangeSelect) {\n // if append is true, the current range will be added to the rangeStack\n const setCurrent = React.useCallback((value, expand, append, trigger) => {\n if ((rangeSelect === \"cell\" || rangeSelect === \"multi-cell\") && value !== undefined) {\n value = {\n ...value,\n range: {\n x: value.cell[0],\n y: value.cell[1],\n width: 1,\n height: 1,\n },\n };\n }\n const rangeMixable = rangeBehavior === \"mixed\" && (append || trigger === \"drag\");\n const allowColumnCoSelect = columnBehavior === \"mixed\" && rangeMixable;\n const allowRowCoSelect = rowBehavior === \"mixed\" && rangeMixable;\n let newVal = {\n current: value === undefined\n ? undefined\n : {\n ...value,\n rangeStack: trigger === \"drag\" ? gridSelection.current?.rangeStack ?? [] : [],\n },\n columns: allowColumnCoSelect ? gridSelection.columns : CompactSelection.empty(),\n rows: allowRowCoSelect ? gridSelection.rows : CompactSelection.empty(),\n };\n const addLastRange = append && (rangeSelect === \"multi-rect\" || rangeSelect === \"multi-cell\");\n if (addLastRange && newVal.current !== undefined && gridSelection.current !== undefined) {\n newVal = {\n ...newVal,\n current: {\n ...newVal.current,\n rangeStack: [...gridSelection.current.rangeStack, gridSelection.current.range],\n },\n };\n }\n setGridSelection(newVal, expand);\n }, [columnBehavior, gridSelection, rangeBehavior, rangeSelect, rowBehavior, setGridSelection]);\n const setSelectedRows = React.useCallback((newRows, append, allowMixed) => {\n newRows = newRows ?? gridSelection.rows;\n if (append !== undefined) {\n newRows = newRows.add(append);\n }\n let newVal;\n if (rowBehavior === \"exclusive\" && newRows.length > 0) {\n newVal = {\n current: undefined,\n columns: CompactSelection.empty(),\n rows: newRows,\n };\n }\n else {\n const rangeMixed = allowMixed && rangeBehavior === \"mixed\";\n const columnMixed = allowMixed && columnBehavior === \"mixed\";\n const current = !rangeMixed ? undefined : gridSelection.current;\n newVal = {\n current,\n columns: columnMixed ? gridSelection.columns : CompactSelection.empty(),\n rows: newRows,\n };\n }\n setGridSelection(newVal, false);\n }, [columnBehavior, gridSelection, rangeBehavior, rowBehavior, setGridSelection]);\n const setSelectedColumns = React.useCallback((newCols, append, allowMixed) => {\n newCols = newCols ?? gridSelection.columns;\n if (append !== undefined) {\n newCols = newCols.add(append);\n }\n let newVal;\n if (columnBehavior === \"exclusive\" && newCols.length > 0) {\n newVal = {\n current: undefined,\n rows: CompactSelection.empty(),\n columns: newCols,\n };\n }\n else {\n const rangeMixed = allowMixed && rangeBehavior === \"mixed\";\n const rowMixed = allowMixed && rowBehavior === \"mixed\";\n const current = !rangeMixed ? undefined : gridSelection.current;\n newVal = {\n current,\n rows: rowMixed ? gridSelection.rows : CompactSelection.empty(),\n columns: newCols,\n };\n }\n setGridSelection(newVal, false);\n }, [columnBehavior, gridSelection, rangeBehavior, rowBehavior, setGridSelection]);\n return [setCurrent, setSelectedRows, setSelectedColumns];\n}\n//# sourceMappingURL=use-selection-behavior.js.map","import * as React from \"react\";\nimport { GridCellKind } from \"../internal/data-grid/data-grid-types.js\";\nexport function useCellsForSelection(getCellsForSelectionIn, getCellContent, rowMarkerOffset, abortController, rows) {\n const getCellsForSelectionDirectWhenValid = React.useCallback(rect => {\n if (getCellsForSelectionIn === true) {\n const result = [];\n for (let y = rect.y; y < rect.y + rect.height; y++) {\n const row = [];\n for (let x = rect.x; x < rect.x + rect.width; x++) {\n if (x < 0 || y >= rows) {\n row.push({\n kind: GridCellKind.Loading,\n allowOverlay: false,\n });\n }\n else {\n row.push(getCellContent([x, y]));\n }\n }\n result.push(row);\n }\n return result;\n }\n return getCellsForSelectionIn?.(rect, abortController.signal) ?? [];\n }, [abortController.signal, getCellContent, getCellsForSelectionIn, rows]);\n const getCellsForSelectionDirect = getCellsForSelectionIn !== undefined ? getCellsForSelectionDirectWhenValid : undefined;\n const getCellsForSelectionMangled = React.useCallback(rect => {\n if (getCellsForSelectionDirect === undefined)\n return [];\n const newRect = {\n ...rect,\n x: rect.x - rowMarkerOffset,\n };\n if (newRect.x < 0) {\n newRect.x = 0;\n newRect.width--;\n const r = getCellsForSelectionDirect(newRect, abortController.signal);\n if (typeof r === \"function\") {\n return async () => \n // eslint-disable-next-line unicorn/no-await-expression-member\n (await r()).map(row => [\n { kind: GridCellKind.Loading, allowOverlay: false },\n ...row,\n ]);\n }\n return r.map(row => [{ kind: GridCellKind.Loading, allowOverlay: false }, ...row]);\n }\n return getCellsForSelectionDirect(newRect, abortController.signal);\n }, [abortController.signal, getCellsForSelectionDirect, rowMarkerOffset]);\n const getCellsForSelection = getCellsForSelectionIn !== undefined ? getCellsForSelectionMangled : undefined;\n return [getCellsForSelection, getCellsForSelectionDirect];\n}\n//# sourceMappingURL=use-cells-for-selection.js.map","/* eslint-disable sonarjs/no-duplicate-string */\nimport { assertNever } from \"../common/support.js\";\nimport { GridCellKind, BooleanEmpty, BooleanIndeterminate, } from \"../internal/data-grid/data-grid-types.js\";\nfunction convertCellToBuffer(cell) {\n if (cell.copyData !== undefined) {\n return {\n formatted: cell.copyData,\n rawValue: cell.copyData,\n format: \"string\",\n };\n }\n switch (cell.kind) {\n case GridCellKind.Boolean:\n return {\n formatted: cell.data === true\n ? \"TRUE\"\n : cell.data === false\n ? \"FALSE\"\n : cell.data === BooleanIndeterminate\n ? \"INDETERMINATE\"\n : \"\",\n rawValue: cell.data,\n format: \"boolean\",\n };\n case GridCellKind.Custom:\n return {\n formatted: cell.copyData,\n rawValue: cell.copyData,\n format: \"string\",\n };\n case GridCellKind.Image:\n case GridCellKind.Bubble:\n return {\n formatted: cell.data,\n rawValue: cell.data,\n format: \"string-array\",\n };\n case GridCellKind.Drilldown:\n return {\n formatted: cell.data.map(x => x.text),\n rawValue: cell.data.map(x => x.text),\n format: \"string-array\",\n };\n case GridCellKind.Text:\n return {\n formatted: cell.displayData ?? cell.data,\n rawValue: cell.data,\n format: \"string\",\n };\n case GridCellKind.Uri:\n return {\n formatted: cell.displayData ?? cell.data,\n rawValue: cell.data,\n format: \"url\",\n };\n case GridCellKind.Markdown:\n case GridCellKind.RowID:\n return {\n formatted: cell.data,\n rawValue: cell.data,\n format: \"string\",\n };\n case GridCellKind.Number:\n return {\n formatted: cell.displayData,\n rawValue: cell.data,\n format: \"number\",\n };\n case GridCellKind.Loading:\n return {\n formatted: \"#LOADING\",\n rawValue: \"\",\n format: \"string\",\n };\n case GridCellKind.Protected:\n return {\n formatted: \"************\",\n rawValue: \"\",\n format: \"string\",\n };\n default:\n assertNever(cell);\n }\n}\nfunction createBufferFromGridCells(cells, columnIndexes) {\n const copyBuffer = cells.map((row, index) => {\n const mappedIndex = columnIndexes[index];\n return row.map(cell => {\n if (cell.span !== undefined && cell.span[0] !== mappedIndex)\n return {\n formatted: \"\",\n rawValue: \"\",\n format: \"string\",\n };\n return convertCellToBuffer(cell);\n });\n });\n return copyBuffer;\n}\nfunction escapeIfNeeded(str, withComma) {\n if ((withComma ? /[\\t\\n\",]/ : /[\\t\\n\"]/).test(str)) {\n str = `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n return str;\n}\nfunction createTextBuffer(copyBuffer) {\n const lines = [];\n for (const row of copyBuffer) {\n const line = [];\n for (const cell of row) {\n if (cell.format === \"url\") {\n line.push(cell.rawValue?.toString() ?? \"\");\n }\n else if (cell.format === \"string-array\") {\n line.push(cell.formatted.map(x => escapeIfNeeded(x, true)).join(\",\"));\n }\n else {\n line.push(escapeIfNeeded(cell.formatted, false));\n }\n }\n lines.push(line.join(\"\\t\"));\n }\n return lines.join(\"\\n\");\n}\nfunction formatHtmlTextContent(text) {\n // The following formatting for the `html` variable ensures that when pasting,\n // spaces are preserved in both Google Sheets and Excel. This is done by:\n // 1. Replacing tabs with four spaces for consistency. Also google sheets disallows any tabs.\n // 2. Wrapping each space with a span element to prevent them from being collapsed or ignored during the\n // paste operation\n return text.replace(/\\t/g, \" \").replace(/ {2,}/g, match => \"<span> </span>\".repeat(match.length));\n}\nfunction formatHtmlAttributeContent(attrText) {\n // Escape all quotes, lt, gt, and other special characters\n return ('\"' + attrText.replace(/&/g, \"&\").replace(/\"/g, \""\").replace(/</g, \"<\").replace(/>/g, \">\") + '\"');\n}\nfunction restoreHtmlEntities(str) {\n // Unescape all quotes, lt, gt, and other special characters\n return str\n .replace(/"/g, '\"')\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\");\n}\nfunction createHtmlBuffer(copyBuffer) {\n const lines = [];\n lines.push(`<style type=\"text/css\"><!--br {mso-data-placement:same-cell;}--></style>`, \"<table><tbody>\");\n for (const row of copyBuffer) {\n lines.push(\"<tr>\");\n for (const cell of row) {\n const formatStr = `gdg-format=\"${cell.format}\"`;\n if (cell.format === \"url\") {\n lines.push(`<td ${formatStr}><a href=\"${cell.rawValue}\">${formatHtmlTextContent(cell.formatted)}</a></td>`);\n }\n else {\n if (cell.format === \"string-array\") {\n lines.push(`<td ${formatStr}><ol>${cell.formatted\n .map((x, ind) => `<li gdg-raw-value=${formatHtmlAttributeContent(cell.rawValue[ind])}>` +\n formatHtmlTextContent(x) +\n \"</li>\")\n .join(\"\")}</ol></td>`);\n }\n else {\n lines.push(`<td gdg-raw-value=${formatHtmlAttributeContent(cell.rawValue?.toString() ?? \"\")} ${formatStr}>${formatHtmlTextContent(cell.formatted)}</td>`);\n }\n }\n }\n lines.push(\"</tr>\");\n }\n lines.push(\"</tbody></table>\");\n return lines.join(\"\");\n}\n// This function encodes grid cells to a table object.\n// Each td in the table contains one of 3 things\n// - A string directly and the td has a `gdg-raw-value` attribute with the raw value\n// - An anchor tag with a href and the text is the formatted value\n// - An ordered list with each item containing a `gdg-raw-value` attribute with the raw value\nexport function getCopyBufferContents(cells, columnIndexes) {\n const copyBuffer = createBufferFromGridCells(cells, columnIndexes);\n const textPlain = createTextBuffer(copyBuffer);\n const textHtml = createHtmlBuffer(copyBuffer);\n return {\n textPlain,\n textHtml,\n };\n}\nexport function decodeHTML(html) {\n const fragment = document.createElement(\"html\");\n // we dont want to retain the pasted non-breaking spaces\n fragment.innerHTML = html.replace(/ /g, \" \");\n const tableEl = fragment.querySelector(\"table\");\n if (tableEl === null)\n return undefined;\n const walkEl = [tableEl];\n const result = [];\n let current;\n while (walkEl.length > 0) {\n const el = walkEl.pop();\n if (el === undefined)\n break;\n if (el instanceof HTMLTableElement || el.nodeName === \"TBODY\") {\n walkEl.push(...[...el.children].reverse());\n }\n else if (el instanceof HTMLTableRowElement) {\n if (current !== undefined) {\n result.push(current);\n }\n current = [];\n walkEl.push(...[...el.children].reverse());\n }\n else if (el instanceof HTMLTableCellElement) {\n // be careful not to use innerText here as its behavior is not well defined for non DOM attached nodes\n const clone = el.cloneNode(true);\n // Apple numbers seems to always wrap the cell in a p tag and a font tag. It also puts both <br> and \\n\n // linebreak markers in the code. This is both unneeded and causes issues with the paste code.\n const firstTagIsPara = clone.children.length === 1 && clone.children[0].nodeName === \"P\";\n const para = firstTagIsPara ? clone.children[0] : null;\n const isAppleNumbers = para?.children.length === 1 && para.children[0].nodeName === \"FONT\";\n const brs = clone.querySelectorAll(\"br\");\n for (const br of brs) {\n br.replaceWith(\"\\n\");\n }\n const attributeValue = clone.getAttribute(\"gdg-raw-value\");\n const formatValue = (clone.getAttribute(\"gdg-format\") ?? \"string\"); // fix me at some point\n if (clone.querySelector(\"a\") !== null) {\n current?.push({\n // raw value is the href\n rawValue: clone.querySelector(\"a\")?.getAttribute(\"href\") ?? \"\",\n formatted: clone.textContent ?? \"\",\n format: formatValue,\n });\n }\n else if (clone.querySelector(\"ol\") !== null) {\n const rawValues = clone.querySelectorAll(\"li\");\n current?.push({\n rawValue: [...rawValues].map(x => x.getAttribute(\"gdg-raw-value\") ?? \"\"),\n formatted: [...rawValues].map(x => x.textContent ?? \"\"),\n format: \"string-array\",\n });\n }\n else if (attributeValue !== null) {\n current?.push({\n rawValue: restoreHtmlEntities(attributeValue),\n formatted: clone.textContent ?? \"\",\n format: formatValue,\n });\n }\n else {\n let textContent = clone.textContent ?? \"\";\n if (isAppleNumbers) {\n // replace any newline not preceded by a newline\n textContent = textContent.replace(/\\n(?!\\n)/g, \"\");\n }\n current?.push({\n rawValue: textContent ?? \"\",\n formatted: textContent ?? \"\",\n format: formatValue,\n });\n }\n }\n }\n if (current !== undefined) {\n result.push(current);\n }\n return result;\n}\n//# sourceMappingURL=copy-paste.js.map","import {} from \"../internal/data-grid/data-grid-types.js\";\nimport { getCopyBufferContents } from \"./copy-paste.js\";\nexport function expandSelection(newVal, getCellsForSelection, rowMarkerOffset, spanRangeBehavior, abortController) {\n const origVal = newVal;\n if (spanRangeBehavior === \"allowPartial\" || newVal.current === undefined || getCellsForSelection === undefined)\n return newVal;\n let isFilled = false;\n do {\n if (newVal?.current === undefined)\n break;\n const r = newVal.current?.range;\n const cells = [];\n if (r.width > 2) {\n const leftCells = getCellsForSelection({\n x: r.x,\n y: r.y,\n width: 1,\n height: r.height,\n }, abortController.signal);\n if (typeof leftCells === \"function\") {\n return origVal;\n }\n cells.push(...leftCells);\n const rightCells = getCellsForSelection({\n x: r.x + r.width - 1,\n y: r.y,\n width: 1,\n height: r.height,\n }, abortController.signal);\n if (typeof rightCells === \"function\") {\n return origVal;\n }\n cells.push(...rightCells);\n }\n else {\n const rCells = getCellsForSelection({\n x: r.x,\n y: r.y,\n width: r.width,\n height: r.height,\n }, abortController.signal);\n if (typeof rCells === \"function\") {\n return origVal;\n }\n cells.push(...rCells);\n }\n let left = r.x - rowMarkerOffset;\n let right = r.x + r.width - 1 - rowMarkerOffset;\n for (const row of cells) {\n for (const cell of row) {\n if (cell.span === undefined)\n continue;\n left = Math.min(cell.span[0], left);\n right = Math.max(cell.span[1], right);\n }\n }\n if (left === r.x - rowMarkerOffset && right === r.x + r.width - 1 - rowMarkerOffset) {\n isFilled = true;\n }\n else {\n newVal = {\n current: {\n cell: newVal.current.cell ?? [0, 0],\n range: {\n x: left + rowMarkerOffset,\n y: r.y,\n width: right - left + 1,\n height: r.height,\n },\n rangeStack: newVal.current.rangeStack,\n },\n columns: newVal.columns,\n rows: newVal.rows,\n };\n }\n } while (!isFilled);\n return newVal;\n}\nfunction descape(s) {\n if (s.startsWith('\"') && s.endsWith('\"')) {\n s = s.slice(1, -1).replace(/\"\"/g, '\"');\n }\n return s;\n}\nexport function unquote(str) {\n let State;\n (function (State) {\n State[State[\"None\"] = 0] = \"None\";\n State[State[\"inString\"] = 1] = \"inString\";\n State[State[\"inStringPostQuote\"] = 2] = \"inStringPostQuote\";\n })(State || (State = {}));\n const result = [];\n let current = [];\n let start = 0;\n let state = State.None;\n str = str.replace(/\\r\\n/g, \"\\n\");\n let index = 0;\n for (const char of str) {\n switch (state) {\n case State.None:\n if (char === \"\\t\" || char === \"\\n\") {\n current.push(str.slice(start, index));\n start = index + 1;\n if (char === \"\\n\") {\n result.push(current);\n current = [];\n }\n }\n else if (char === `\"`) {\n state = State.inString;\n }\n break;\n case State.inString:\n if (char === `\"`) {\n state = State.inStringPostQuote;\n }\n break;\n case State.inStringPostQuote:\n if (char === '\"') {\n state = State.inString;\n }\n else if (char === \"\\t\" || char === \"\\n\") {\n current.push(descape(str.slice(start, index)));\n start = index + 1;\n if (char === \"\\n\") {\n result.push(current);\n current = [];\n }\n state = State.None;\n }\n else {\n state = State.None;\n }\n break;\n }\n index++;\n }\n if (start < str.length) {\n current.push(descape(str.slice(start, str.length)));\n }\n result.push(current);\n return result.map(r => r.map(c => ({ rawValue: c, formatted: c, format: \"string\" })));\n}\nexport function copyToClipboard(cells, columnIndexes, e) {\n const copyBuffer = getCopyBufferContents(cells, columnIndexes);\n // eslint-disable-next-line unicorn/consistent-function-scoping\n const copyWithWriteText = (s) => {\n void window.navigator.clipboard?.writeText(s);\n };\n const copyWithWrite = (s, html) => {\n if (window.navigator.clipboard?.write === undefined)\n return false;\n void window.navigator.clipboard.write([\n new ClipboardItem({\n // eslint-disable-next-line sonarjs/no-duplicate-string\n \"text/plain\": new Blob([s], { type: \"text/plain\" }),\n \"text/html\": new Blob([html], {\n type: \"text/html\",\n }),\n }),\n ]);\n return true;\n };\n const copyWithClipboardData = (s, html) => {\n try {\n if (e === undefined || e.clipboardData === null)\n throw new Error(\"No clipboard data\");\n // This might fail if we had to await the thunk\n e?.clipboardData?.setData(\"text/plain\", s);\n e?.clipboardData?.setData(\"text/html\", html);\n }\n catch {\n if (!copyWithWrite(s, html)) {\n copyWithWriteText(s);\n }\n }\n };\n if (window.navigator.clipboard?.write !== undefined || e?.clipboardData !== undefined) {\n void copyWithClipboardData(copyBuffer.textPlain, copyBuffer.textHtml);\n }\n else {\n void copyWithWriteText(copyBuffer.textPlain);\n }\n e?.preventDefault();\n}\n/**\n * Checkbox behavior:\n *\n * true + click -> unchecked\n * false + click -> checked\n * indeterminate + click -> checked\n * empty + click -> checked\n */\nexport function toggleBoolean(data) {\n return data !== true;\n}\n//# sourceMappingURL=data-editor-fns.js.map","import { styled } from \"@linaria/react\";\nimport * as React from \"react\";\nfunction toCss(x) {\n if (typeof x === \"string\") return x;\n return `${x}px`;\n}\nconst _exp = /*#__PURE__*/() => p => p.innerWidth;\nconst _exp2 = /*#__PURE__*/() => p => p.innerHeight;\nconst Wrapper = /*#__PURE__*/styled('div')({\n name: \"Wrapper\",\n class: \"gdg-wmyidgi\",\n propsAsIs: false,\n vars: {\n \"wmyidgi-0\": [_exp()],\n \"wmyidgi-1\": [_exp2()]\n }\n});\nexport const DataEditorContainer = p => {\n const {\n inWidth,\n inHeight,\n children,\n ...rest\n } = p;\n return React.createElement(Wrapper, {\n innerHeight: toCss(inHeight),\n innerWidth: toCss(inWidth),\n ...rest\n }, children);\n};\n\n","import React from \"react\";\nconst maxPxPerMs = 2;\nconst msToFullSpeed = 1300;\nexport function useAutoscroll(scrollDirection, scrollRef, onScroll) {\n const speedScalar = React.useRef(0);\n const [xDir, yDir] = scrollDirection ?? [0, 0];\n React.useEffect(() => {\n if (xDir === 0 && yDir === 0) {\n speedScalar.current = 0;\n return;\n }\n let cancelled = false;\n let lastTime = 0;\n const scrollFn = (curTime) => {\n if (cancelled)\n return;\n if (lastTime === 0) {\n lastTime = curTime;\n }\n else {\n const step = curTime - lastTime;\n speedScalar.current = Math.min(1, speedScalar.current + step / msToFullSpeed);\n const motion = speedScalar.current ** 1.618 * step * maxPxPerMs;\n scrollRef.current?.scrollBy(xDir * motion, yDir * motion);\n lastTime = curTime;\n onScroll?.();\n }\n window.requestAnimationFrame(scrollFn);\n };\n window.requestAnimationFrame(scrollFn);\n return () => {\n cancelled = true;\n };\n }, [scrollRef, xDir, yDir, onScroll]);\n}\n//# sourceMappingURL=use-autoscroll.js.map","import React from \"react\";\nimport { getDataEditorTheme } from \"../common/styles.js\";\nexport function useRemAdjuster({ rowHeight: rowHeightIn, headerHeight: headerHeightIn, groupHeaderHeight: groupHeaderHeightIn, theme: themeIn, overscrollX: overscrollXIn, overscrollY: overscrollYIn, scaleToRem, remSize, }) {\n const [rowHeight, headerHeight, groupHeaderHeight, theme, overscrollX, overscrollY] = React.useMemo(() => {\n if (!scaleToRem || remSize === 16)\n return [rowHeightIn, headerHeightIn, groupHeaderHeightIn, themeIn, overscrollXIn, overscrollYIn];\n const scaler = remSize / 16;\n const rh = rowHeightIn;\n const bt = getDataEditorTheme();\n return [\n typeof rh === \"number\" ? rh * scaler : (n) => Math.ceil(rh(n) * scaler),\n Math.ceil(headerHeightIn * scaler),\n Math.ceil(groupHeaderHeightIn * scaler),\n {\n ...themeIn,\n headerIconSize: (themeIn?.headerIconSize ?? bt.headerIconSize) * scaler,\n cellHorizontalPadding: (themeIn?.cellHorizontalPadding ?? bt.cellHorizontalPadding) * scaler,\n cellVerticalPadding: (themeIn?.cellVerticalPadding ?? bt.cellVerticalPadding) * scaler,\n },\n Math.ceil((overscrollXIn ?? 0) * scaler),\n Math.ceil((overscrollYIn ?? 0) * scaler),\n ];\n }, [groupHeaderHeightIn, headerHeightIn, overscrollXIn, overscrollYIn, remSize, rowHeightIn, scaleToRem, themeIn]);\n return { rowHeight, headerHeight, groupHeaderHeight, theme, overscrollX, overscrollY };\n}\n//# sourceMappingURL=use-rem-adjuster.js.map","import React from \"react\";\nimport { browserIsOSX } from \"../common/browser-detect.js\";\nimport { useDeepMemo } from \"../common/utils.js\";\nexport const keybindingDefaults = {\n downFill: false,\n rightFill: false,\n clear: true,\n closeOverlay: true,\n acceptOverlayDown: true,\n acceptOverlayUp: true,\n acceptOverlayLeft: true,\n acceptOverlayRight: true,\n copy: true,\n paste: true,\n cut: true,\n search: false,\n delete: true,\n activateCell: true,\n scrollToSelectedCell: true,\n goToFirstCell: true,\n goToFirstColumn: true,\n goToFirstRow: true,\n goToLastCell: true,\n goToLastColumn: true,\n goToLastRow: true,\n goToNextPage: true,\n goToPreviousPage: true,\n selectToFirstCell: true,\n selectToFirstColumn: true,\n selectToFirstRow: true,\n selectToLastCell: true,\n selectToLastColumn: true,\n selectToLastRow: true,\n selectAll: true,\n selectRow: true,\n selectColumn: true,\n goUpCell: true,\n goRightCell: true,\n goDownCell: true,\n goLeftCell: true,\n goUpCellRetainSelection: true,\n goRightCellRetainSelection: true,\n goDownCellRetainSelection: true,\n goLeftCellRetainSelection: true,\n selectGrowUp: true,\n selectGrowRight: true,\n selectGrowDown: true,\n selectGrowLeft: true,\n};\nfunction realizeKeybind(keybind, defaultVal) {\n if (keybind === true)\n return defaultVal;\n if (keybind === false)\n return \"\";\n return keybind;\n}\nexport function realizeKeybinds(keybinds) {\n const isOSX = browserIsOSX.value;\n return {\n activateCell: realizeKeybind(keybinds.activateCell, \" |Enter|shift+Enter\"),\n clear: realizeKeybind(keybinds.clear, \"any+Escape\"),\n closeOverlay: realizeKeybind(keybinds.closeOverlay, \"any+Escape\"),\n acceptOverlayDown: realizeKeybind(keybinds.acceptOverlayDown, \"Enter\"),\n acceptOverlayUp: realizeKeybind(keybinds.acceptOverlayUp, \"shift+Enter\"),\n acceptOverlayLeft: realizeKeybind(keybinds.acceptOverlayLeft, \"shift+Tab\"),\n acceptOverlayRight: realizeKeybind(keybinds.acceptOverlayRight, \"Tab\"),\n copy: keybinds.copy,\n cut: keybinds.cut,\n delete: realizeKeybind(keybinds.delete, isOSX ? \"Backspace|Delete\" : \"Delete\"),\n downFill: realizeKeybind(keybinds.downFill, \"primary+_68\"),\n scrollToSelectedCell: realizeKeybind(keybinds.scrollToSelectedCell, \"primary+Enter\"),\n goDownCell: realizeKeybind(keybinds.goDownCell, \"ArrowDown\"),\n goDownCellRetainSelection: realizeKeybind(keybinds.goDownCellRetainSelection, \"alt+ArrowDown\"),\n goLeftCell: realizeKeybind(keybinds.goLeftCell, \"ArrowLeft|shift+Tab\"),\n goLeftCellRetainSelection: realizeKeybind(keybinds.goLeftCellRetainSelection, \"alt+ArrowLeft\"),\n goRightCell: realizeKeybind(keybinds.goRightCell, \"ArrowRight|Tab\"),\n goRightCellRetainSelection: realizeKeybind(keybinds.goRightCellRetainSelection, \"alt+ArrowRight\"),\n goUpCell: realizeKeybind(keybinds.goUpCell, \"ArrowUp\"),\n goUpCellRetainSelection: realizeKeybind(keybinds.goUpCellRetainSelection, \"alt+ArrowUp\"),\n goToFirstCell: realizeKeybind(keybinds.goToFirstCell, \"primary+Home\"),\n goToFirstColumn: realizeKeybind(keybinds.goToFirstColumn, \"Home|primary+ArrowLeft\"),\n goToFirstRow: realizeKeybind(keybinds.goToFirstRow, \"primary+ArrowUp\"),\n goToLastCell: realizeKeybind(keybinds.goToLastCell, \"primary+End\"),\n goToLastColumn: realizeKeybind(keybinds.goToLastColumn, \"End|primary+ArrowRight\"),\n goToLastRow: realizeKeybind(keybinds.goToLastRow, \"primary+ArrowDown\"),\n goToNextPage: realizeKeybind(keybinds.goToNextPage, \"PageDown\"),\n goToPreviousPage: realizeKeybind(keybinds.goToPreviousPage, \"PageUp\"),\n paste: keybinds.paste,\n rightFill: realizeKeybind(keybinds.rightFill, \"primary+_82\"),\n search: realizeKeybind(keybinds.search, \"primary+f\"),\n selectAll: realizeKeybind(keybinds.selectAll, \"primary+a\"),\n selectColumn: realizeKeybind(keybinds.selectColumn, \"ctrl+ \"),\n selectGrowDown: realizeKeybind(keybinds.selectGrowDown, \"shift+ArrowDown\"),\n selectGrowLeft: realizeKeybind(keybinds.selectGrowLeft, \"shift+ArrowLeft\"),\n selectGrowRight: realizeKeybind(keybinds.selectGrowRight, \"shift+ArrowRight\"),\n selectGrowUp: realizeKeybind(keybinds.selectGrowUp, \"shift+ArrowUp\"),\n selectRow: realizeKeybind(keybinds.selectRow, \"shift+ \"),\n selectToFirstCell: realizeKeybind(keybinds.selectToFirstCell, \"primary+shift+Home\"),\n selectToFirstColumn: realizeKeybind(keybinds.selectToFirstColumn, \"primary+shift+ArrowLeft\"),\n selectToFirstRow: realizeKeybind(keybinds.selectToFirstRow, \"primary+shift+ArrowUp\"),\n selectToLastCell: realizeKeybind(keybinds.selectToLastCell, \"primary+shift+End\"),\n selectToLastColumn: realizeKeybind(keybinds.selectToLastColumn, \"primary+shift+ArrowRight\"),\n selectToLastRow: realizeKeybind(keybinds.selectToLastRow, \"primary+shift+ArrowDown\"),\n };\n}\nexport function useKeybindingsWithDefaults(keybindingsIn) {\n const keys = useDeepMemo(keybindingsIn);\n return React.useMemo(() => {\n if (keys === undefined)\n return realizeKeybinds(keybindingDefaults);\n const withBackCompatApplied = {\n ...keys,\n goToNextPage: keys?.goToNextPage ?? keys?.pageDown ?? keybindingDefaults.goToNextPage,\n goToPreviousPage: keys?.goToPreviousPage ?? keys?.pageUp ?? keybindingDefaults.goToPreviousPage,\n goToFirstCell: keys?.goToFirstCell ?? keys?.first ?? keybindingDefaults.goToFirstCell,\n goToLastCell: keys?.goToLastCell ?? keys?.last ?? keybindingDefaults.goToLastCell,\n selectToFirstCell: keys?.selectToFirstCell ?? keys?.first ?? keybindingDefaults.selectToFirstCell,\n selectToLastCell: keys?.selectToLastCell ?? keys?.last ?? keybindingDefaults.selectToLastCell,\n };\n return realizeKeybinds({\n ...keybindingDefaults,\n ...withBackCompatApplied,\n });\n }, [keys]);\n}\n//# sourceMappingURL=data-editor-keybindings.js.map","/* eslint-disable sonarjs/no-duplicate-string */\nimport * as React from \"react\";\nimport { assert, assertNever, maybe } from \"../common/support.js\";\nimport clamp from \"lodash/clamp.js\";\nimport uniq from \"lodash/uniq.js\";\nimport flatten from \"lodash/flatten.js\";\nimport range from \"lodash/range.js\";\nimport debounce from \"lodash/debounce.js\";\nimport { GridCellKind, isEditableGridCell, isReadWriteCell, InnerGridCellKind, CompactSelection, isInnerOnlyCell, isObjectEditorCallbackResult, BooleanEmpty, BooleanIndeterminate, } from \"../internal/data-grid/data-grid-types.js\";\nimport DataGridSearch, {} from \"../internal/data-grid-search/data-grid-search.js\";\nimport { browserIsOSX } from \"../common/browser-detect.js\";\nimport { getDataEditorTheme, makeCSSStyle, ThemeContext, mergeAndRealizeTheme, } from \"../common/styles.js\";\nimport { getScrollBarWidth, useEventListener, useStateWithReactiveInput, whenDefined } from \"../common/utils.js\";\nimport { isGroupEqual, itemsAreEqual, itemIsInRect, gridSelectionHasItem, getFreezeTrailingHeight, } from \"../internal/data-grid/render/data-grid-lib.js\";\nimport { GroupRename } from \"./group-rename.js\";\nimport { measureColumn, useColumnSizer } from \"./use-column-sizer.js\";\nimport { isHotkey } from \"../common/is-hotkey.js\";\nimport { useSelectionBehavior } from \"../internal/data-grid/use-selection-behavior.js\";\nimport { useCellsForSelection } from \"./use-cells-for-selection.js\";\nimport { unquote, expandSelection, copyToClipboard, toggleBoolean } from \"./data-editor-fns.js\";\nimport { DataEditorContainer } from \"../internal/data-editor-container/data-grid-container.js\";\nimport { useAutoscroll } from \"./use-autoscroll.js\";\nimport { decodeHTML } from \"./copy-paste.js\";\nimport { useRemAdjuster } from \"./use-rem-adjuster.js\";\nimport { withAlpha } from \"../internal/data-grid/color-parser.js\";\nimport { combineRects, getClosestRect, pointInRect } from \"../common/math.js\";\nimport { groupHeaderKind, outOfBoundsKind, headerKind, mouseEventArgsAreEqual, } from \"../internal/data-grid/event-args.js\";\nimport { useKeybindingsWithDefaults } from \"./data-editor-keybindings.js\";\nconst DataGridOverlayEditor = React.lazy(async () => await import(\"../internal/data-grid-overlay-editor/data-grid-overlay-editor.js\"));\n// There must be a better way\nlet idCounter = 0;\nfunction getSpanStops(cells) {\n return uniq(flatten(flatten(cells)\n .filter(c => c.span !== undefined)\n .map(c => range((c.span?.[0] ?? 0) + 1, (c.span?.[1] ?? 0) + 1))));\n}\nfunction shiftSelection(input, offset) {\n if (input === undefined || offset === 0 || (input.columns.length === 0 && input.current === undefined))\n return input;\n return {\n current: input.current === undefined\n ? undefined\n : {\n cell: [input.current.cell[0] + offset, input.current.cell[1]],\n range: {\n ...input.current.range,\n x: input.current.range.x + offset,\n },\n rangeStack: input.current.rangeStack.map(r => ({\n ...r,\n x: r.x + offset,\n })),\n },\n rows: input.rows,\n columns: input.columns.offset(offset),\n };\n}\nconst loadingCell = {\n kind: GridCellKind.Loading,\n allowOverlay: false,\n};\nconst emptyGridSelection = {\n columns: CompactSelection.empty(),\n rows: CompactSelection.empty(),\n current: undefined,\n};\nconst DataEditorImpl = (p, forwardedRef) => {\n const [gridSelectionInner, setGridSelectionInner] = React.useState(emptyGridSelection);\n const [overlay, setOverlay] = React.useState();\n const searchInputRef = React.useRef(null);\n const canvasRef = React.useRef(null);\n const [mouseState, setMouseState] = React.useState();\n const scrollRef = React.useRef(null);\n const lastSent = React.useRef();\n const safeWindow = typeof window === \"undefined\" ? null : window;\n const { imageEditorOverride, getRowThemeOverride, markdownDivCreateNode, width, height, columns: columnsIn, rows, getCellContent, onCellClicked, onCellActivated, onFillPattern, onFinishedEditing, coercePasteValue, drawHeader: drawHeaderIn, drawCell: drawCellIn, editorBloom, onHeaderClicked, onColumnProposeMove, spanRangeBehavior = \"default\", onGroupHeaderClicked, onCellContextMenu, className, onHeaderContextMenu, getCellsForSelection: getCellsForSelectionIn, onGroupHeaderContextMenu, onGroupHeaderRenamed, onCellEdited, onCellsEdited, onSearchResultsChanged: onSearchResultsChangedIn, searchResults, onSearchValueChange, searchValue, onKeyDown: onKeyDownIn, onKeyUp: onKeyUpIn, keybindings: keybindingsIn, editOnType = true, onRowAppended, onColumnMoved, validateCell: validateCellIn, highlightRegions: highlightRegionsIn, rangeSelect = \"rect\", columnSelect = \"multi\", rowSelect = \"multi\", rangeSelectionBlending = \"exclusive\", columnSelectionBlending = \"exclusive\", rowSelectionBlending = \"exclusive\", onDelete: onDeleteIn, onDragStart, onMouseMove, onPaste, copyHeaders = false, freezeColumns = 0, cellActivationBehavior = \"second-click\", rowSelectionMode = \"auto\", onHeaderMenuClick, getGroupDetails, onSearchClose: onSearchCloseIn, onItemHovered, onSelectionCleared, showSearch: showSearchIn, onVisibleRegionChanged, gridSelection: gridSelectionOuter, onGridSelectionChange, minColumnWidth: minColumnWidthIn = 50, maxColumnWidth: maxColumnWidthIn = 500, maxColumnAutoWidth: maxColumnAutoWidthIn, provideEditor, trailingRowOptions, freezeTrailingRows = 0, allowedFillDirections = \"orthogonal\", scrollOffsetX, scrollOffsetY, verticalBorder, onDragOverCell, onDrop, onColumnResize: onColumnResizeIn, onColumnResizeEnd: onColumnResizeEndIn, onColumnResizeStart: onColumnResizeStartIn, customRenderers: additionalRenderers, fillHandle, drawFocusRing = true, experimental, fixedShadowX, fixedShadowY, headerIcons, imageWindowLoader, initialSize, isDraggable, onDragLeave, onRowMoved, overscrollX: overscrollXIn, overscrollY: overscrollYIn, preventDiagonalScrolling, rightElement, rightElementProps, trapFocus = false, smoothScrollX, smoothScrollY, scaleToRem = false, rowHeight: rowHeightIn = 34, headerHeight: headerHeightIn = 36, groupHeaderHeight: groupHeaderHeightIn = headerHeightIn, theme: themeIn, isOutsideClick, renderers, } = p;\n const rowMarkersObj = typeof p.rowMarkers === \"string\" ? undefined : p.rowMarkers;\n const rowMarkers = rowMarkersObj?.kind ?? p.rowMarkers ?? \"none\";\n const rowMarkerWidthRaw = rowMarkersObj?.width ?? p.rowMarkerWidth;\n const rowMarkerStartIndex = rowMarkersObj?.startIndex ?? p.rowMarkerStartIndex ?? 1;\n const rowMarkerTheme = rowMarkersObj?.theme ?? p.rowMarkerTheme;\n const rowMarkerCheckboxStyle = rowMarkersObj?.checkboxStyle ?? \"square\";\n const minColumnWidth = Math.max(minColumnWidthIn, 20);\n const maxColumnWidth = Math.max(maxColumnWidthIn, minColumnWidth);\n const maxColumnAutoWidth = Math.max(maxColumnAutoWidthIn ?? maxColumnWidth, minColumnWidth);\n const docStyle = React.useMemo(() => {\n if (typeof window === \"undefined\")\n return { fontSize: \"16px\" };\n return window.getComputedStyle(document.documentElement);\n }, []);\n const remSize = React.useMemo(() => Number.parseFloat(docStyle.fontSize), [docStyle]);\n const { rowHeight, headerHeight, groupHeaderHeight, theme, overscrollX, overscrollY } = useRemAdjuster({\n groupHeaderHeight: groupHeaderHeightIn,\n headerHeight: headerHeightIn,\n overscrollX: overscrollXIn,\n overscrollY: overscrollYIn,\n remSize,\n rowHeight: rowHeightIn,\n scaleToRem,\n theme: themeIn,\n });\n const keybindings = useKeybindingsWithDefaults(keybindingsIn);\n const rowMarkerWidth = rowMarkerWidthRaw ?? (rows > 10000 ? 48 : rows > 1000 ? 44 : rows > 100 ? 36 : 32);\n const hasRowMarkers = rowMarkers !== \"none\";\n const rowMarkerOffset = hasRowMarkers ? 1 : 0;\n const showTrailingBlankRow = onRowAppended !== undefined;\n const lastRowSticky = trailingRowOptions?.sticky === true;\n const [showSearchInner, setShowSearchInner] = React.useState(false);\n const showSearch = showSearchIn ?? showSearchInner;\n const onSearchClose = React.useCallback(() => {\n if (onSearchCloseIn !== undefined) {\n onSearchCloseIn();\n }\n else {\n setShowSearchInner(false);\n }\n }, [onSearchCloseIn]);\n const gridSelectionOuterMangled = React.useMemo(() => {\n return gridSelectionOuter === undefined ? undefined : shiftSelection(gridSelectionOuter, rowMarkerOffset);\n }, [gridSelectionOuter, rowMarkerOffset]);\n const gridSelection = gridSelectionOuterMangled ?? gridSelectionInner;\n const abortControllerRef = React.useRef();\n if (abortControllerRef.current === undefined)\n abortControllerRef.current = new AbortController();\n React.useEffect(() => () => abortControllerRef?.current.abort(), []);\n const [getCellsForSelection, getCellsForSeletionDirect] = useCellsForSelection(getCellsForSelectionIn, getCellContent, rowMarkerOffset, abortControllerRef.current, rows);\n const validateCell = React.useCallback((cell, newValue, prevValue) => {\n if (validateCellIn === undefined)\n return true;\n const item = [cell[0] - rowMarkerOffset, cell[1]];\n return validateCellIn?.(item, newValue, prevValue);\n }, [rowMarkerOffset, validateCellIn]);\n const expectedExternalGridSelection = React.useRef(gridSelectionOuter);\n const setGridSelection = React.useCallback((newVal, expand) => {\n if (expand) {\n newVal = expandSelection(newVal, getCellsForSelection, rowMarkerOffset, spanRangeBehavior, abortControllerRef.current);\n }\n if (onGridSelectionChange !== undefined) {\n expectedExternalGridSelection.current = shiftSelection(newVal, -rowMarkerOffset);\n onGridSelectionChange(expectedExternalGridSelection.current);\n }\n else {\n setGridSelectionInner(newVal);\n }\n }, [onGridSelectionChange, getCellsForSelection, rowMarkerOffset, spanRangeBehavior]);\n const onColumnResize = whenDefined(onColumnResizeIn, React.useCallback((_, w, ind, wg) => {\n onColumnResizeIn?.(columnsIn[ind - rowMarkerOffset], w, ind - rowMarkerOffset, wg);\n }, [onColumnResizeIn, rowMarkerOffset, columnsIn]));\n const onColumnResizeEnd = whenDefined(onColumnResizeEndIn, React.useCallback((_, w, ind, wg) => {\n onColumnResizeEndIn?.(columnsIn[ind - rowMarkerOffset], w, ind - rowMarkerOffset, wg);\n }, [onColumnResizeEndIn, rowMarkerOffset, columnsIn]));\n const onColumnResizeStart = whenDefined(onColumnResizeStartIn, React.useCallback((_, w, ind, wg) => {\n onColumnResizeStartIn?.(columnsIn[ind - rowMarkerOffset], w, ind - rowMarkerOffset, wg);\n }, [onColumnResizeStartIn, rowMarkerOffset, columnsIn]));\n const drawHeader = whenDefined(drawHeaderIn, React.useCallback((args, draw) => {\n return drawHeaderIn?.({ ...args, columnIndex: args.columnIndex - rowMarkerOffset }, draw) ?? false;\n }, [drawHeaderIn, rowMarkerOffset]));\n const drawCell = whenDefined(drawCellIn, React.useCallback((args, draw) => {\n return drawCellIn?.({ ...args, col: args.col - rowMarkerOffset }, draw) ?? false;\n }, [drawCellIn, rowMarkerOffset]));\n const onDelete = React.useCallback(sel => {\n if (onDeleteIn !== undefined) {\n const result = onDeleteIn(shiftSelection(sel, -rowMarkerOffset));\n if (typeof result === \"boolean\") {\n return result;\n }\n return shiftSelection(result, rowMarkerOffset);\n }\n return true;\n }, [onDeleteIn, rowMarkerOffset]);\n const [setCurrent, setSelectedRows, setSelectedColumns] = useSelectionBehavior(gridSelection, setGridSelection, rangeSelectionBlending, columnSelectionBlending, rowSelectionBlending, rangeSelect);\n const mergedTheme = React.useMemo(() => {\n return mergeAndRealizeTheme(getDataEditorTheme(), theme);\n }, [theme]);\n const [clientSize, setClientSize] = React.useState([0, 0, 0]);\n const rendererMap = React.useMemo(() => {\n if (renderers === undefined)\n return {};\n const result = {};\n for (const r of renderers) {\n result[r.kind] = r;\n }\n return result;\n }, [renderers]);\n const getCellRenderer = React.useCallback((cell) => {\n if (cell.kind !== GridCellKind.Custom) {\n return rendererMap[cell.kind];\n }\n return additionalRenderers?.find(x => x.isMatch(cell));\n }, [additionalRenderers, rendererMap]);\n // eslint-disable-next-line prefer-const\n let { sizedColumns: columns, nonGrowWidth } = useColumnSizer(columnsIn, rows, getCellsForSeletionDirect, clientSize[0] - (rowMarkerOffset === 0 ? 0 : rowMarkerWidth) - clientSize[2], minColumnWidth, maxColumnAutoWidth, mergedTheme, getCellRenderer, abortControllerRef.current);\n if (rowMarkers !== \"none\")\n nonGrowWidth += rowMarkerWidth;\n const enableGroups = React.useMemo(() => {\n return columns.some(c => c.group !== undefined);\n }, [columns]);\n const totalHeaderHeight = enableGroups ? headerHeight + groupHeaderHeight : headerHeight;\n const numSelectedRows = gridSelection.rows.length;\n const rowMarkerChecked = rowMarkers === \"none\" ? undefined : numSelectedRows === 0 ? false : numSelectedRows === rows ? true : undefined;\n const mangledCols = React.useMemo(() => {\n if (rowMarkers === \"none\")\n return columns;\n return [\n {\n title: \"\",\n width: rowMarkerWidth,\n icon: undefined,\n hasMenu: false,\n style: \"normal\",\n themeOverride: rowMarkerTheme,\n rowMarker: rowMarkerCheckboxStyle,\n rowMarkerChecked,\n },\n ...columns,\n ];\n }, [rowMarkers, columns, rowMarkerWidth, rowMarkerTheme, rowMarkerCheckboxStyle, rowMarkerChecked]);\n const [visibleRegionY, visibleRegionTy] = React.useMemo(() => {\n return [\n scrollOffsetY !== undefined && typeof rowHeight === \"number\" ? Math.floor(scrollOffsetY / rowHeight) : 0,\n scrollOffsetY !== undefined && typeof rowHeight === \"number\" ? -(scrollOffsetY % rowHeight) : 0,\n ];\n }, [scrollOffsetY, rowHeight]);\n const visibleRegionRef = React.useRef({\n height: 1,\n width: 1,\n x: 0,\n y: 0,\n });\n const visibleRegionInput = React.useMemo(() => ({\n x: visibleRegionRef.current.x,\n y: visibleRegionY,\n width: visibleRegionRef.current.width ?? 1,\n height: visibleRegionRef.current.height ?? 1,\n // tx: 'TODO',\n ty: visibleRegionTy,\n }), [visibleRegionTy, visibleRegionY]);\n const hasJustScrolled = React.useRef(false);\n const [visibleRegion, setVisibleRegion, empty] = useStateWithReactiveInput(visibleRegionInput);\n visibleRegionRef.current = visibleRegion;\n const vScrollReady = (visibleRegion.height ?? 1) > 1;\n React.useLayoutEffect(() => {\n if (scrollOffsetY !== undefined && scrollRef.current !== null && vScrollReady) {\n if (scrollRef.current.scrollTop === scrollOffsetY)\n return;\n scrollRef.current.scrollTop = scrollOffsetY;\n if (scrollRef.current.scrollTop !== scrollOffsetY) {\n empty();\n }\n hasJustScrolled.current = true;\n }\n }, [scrollOffsetY, vScrollReady, empty]);\n const hScrollReady = (visibleRegion.width ?? 1) > 1;\n React.useLayoutEffect(() => {\n if (scrollOffsetX !== undefined && scrollRef.current !== null && hScrollReady) {\n if (scrollRef.current.scrollLeft === scrollOffsetX)\n return;\n scrollRef.current.scrollLeft = scrollOffsetX;\n if (scrollRef.current.scrollLeft !== scrollOffsetX) {\n empty();\n }\n hasJustScrolled.current = true;\n }\n }, [scrollOffsetX, hScrollReady, empty]);\n const cellXOffset = visibleRegion.x + rowMarkerOffset;\n const cellYOffset = visibleRegion.y;\n const gridRef = React.useRef(null);\n const focus = React.useCallback((immediate) => {\n if (immediate === true) {\n gridRef.current?.focus();\n }\n else {\n window.requestAnimationFrame(() => {\n gridRef.current?.focus();\n });\n }\n }, []);\n const mangledRows = showTrailingBlankRow ? rows + 1 : rows;\n const mangledOnCellsEdited = React.useCallback((items) => {\n const mangledItems = rowMarkerOffset === 0\n ? items\n : items.map(x => ({\n ...x,\n location: [x.location[0] - rowMarkerOffset, x.location[1]],\n }));\n const r = onCellsEdited?.(mangledItems);\n if (r !== true) {\n for (const i of mangledItems)\n onCellEdited?.(i.location, i.value);\n }\n return r;\n }, [onCellEdited, onCellsEdited, rowMarkerOffset]);\n const [fillHighlightRegion, setFillHighlightRegion] = React.useState();\n // this will generally be undefined triggering the memo less often\n const highlightRange = gridSelection.current !== undefined &&\n gridSelection.current.range.width * gridSelection.current.range.height > 1\n ? gridSelection.current.range\n : undefined;\n const highlightFocus = drawFocusRing ? gridSelection.current?.cell : undefined;\n const highlightFocusCol = highlightFocus?.[0];\n const highlightFocusRow = highlightFocus?.[1];\n const highlightRegions = React.useMemo(() => {\n if ((highlightRegionsIn === undefined || highlightRegionsIn.length === 0) &&\n (highlightRange ?? highlightFocusCol ?? highlightFocusRow ?? fillHighlightRegion) === undefined)\n return undefined;\n const regions = [];\n if (highlightRegionsIn !== undefined) {\n for (const r of highlightRegionsIn) {\n const maxWidth = mangledCols.length - r.range.x - rowMarkerOffset;\n if (maxWidth > 0) {\n regions.push({\n color: r.color,\n range: {\n ...r.range,\n x: r.range.x + rowMarkerOffset,\n width: Math.min(maxWidth, r.range.width),\n },\n style: r.style,\n });\n }\n }\n }\n if (fillHighlightRegion !== undefined) {\n regions.push({\n color: withAlpha(mergedTheme.accentColor, 0),\n range: fillHighlightRegion,\n style: \"dashed\",\n });\n }\n if (highlightRange !== undefined) {\n regions.push({\n color: withAlpha(mergedTheme.accentColor, 0.5),\n range: highlightRange,\n style: \"solid-outline\",\n });\n }\n if (highlightFocusCol !== undefined && highlightFocusRow !== undefined) {\n regions.push({\n color: mergedTheme.accentColor,\n range: {\n x: highlightFocusCol,\n y: highlightFocusRow,\n width: 1,\n height: 1,\n },\n style: \"solid-outline\",\n });\n }\n return regions.length > 0 ? regions : undefined;\n }, [\n fillHighlightRegion,\n highlightRange,\n highlightFocusCol,\n highlightFocusRow,\n highlightRegionsIn,\n mangledCols.length,\n mergedTheme.accentColor,\n rowMarkerOffset,\n ]);\n const mangledColsRef = React.useRef(mangledCols);\n mangledColsRef.current = mangledCols;\n const getMangledCellContent = React.useCallback(([col, row], forceStrict = false) => {\n const isTrailing = showTrailingBlankRow && row === mangledRows - 1;\n const isRowMarkerCol = col === 0 && hasRowMarkers;\n if (isRowMarkerCol) {\n if (isTrailing) {\n return loadingCell;\n }\n return {\n kind: InnerGridCellKind.Marker,\n allowOverlay: false,\n checkboxStyle: rowMarkerCheckboxStyle,\n checked: gridSelection?.rows.hasIndex(row) === true,\n markerKind: rowMarkers === \"clickable-number\" ? \"number\" : rowMarkers,\n row: rowMarkerStartIndex + row,\n drawHandle: onRowMoved !== undefined,\n cursor: rowMarkers === \"clickable-number\" ? \"pointer\" : undefined,\n };\n }\n else if (isTrailing) {\n //If the grid is empty, we will return text\n const isFirst = col === rowMarkerOffset;\n const maybeFirstColumnHint = isFirst ? trailingRowOptions?.hint ?? \"\" : \"\";\n const c = mangledColsRef.current[col];\n if (c?.trailingRowOptions?.disabled === true) {\n return loadingCell;\n }\n else {\n const hint = c?.trailingRowOptions?.hint ?? maybeFirstColumnHint;\n const icon = c?.trailingRowOptions?.addIcon ?? trailingRowOptions?.addIcon;\n return {\n kind: InnerGridCellKind.NewRow,\n hint,\n allowOverlay: false,\n icon,\n };\n }\n }\n else {\n const outerCol = col - rowMarkerOffset;\n if (forceStrict || experimental?.strict === true) {\n const vr = visibleRegionRef.current;\n const isOutsideMainArea = vr.x > outerCol ||\n outerCol > vr.x + vr.width ||\n vr.y > row ||\n row > vr.y + vr.height ||\n row >= rowsRef.current;\n const isSelected = outerCol === vr.extras?.selected?.[0] && row === vr.extras?.selected[1];\n let isInFreezeArea = false;\n if (vr.extras?.freezeRegions !== undefined) {\n for (const fr of vr.extras.freezeRegions) {\n if (pointInRect(fr, outerCol, row)) {\n isInFreezeArea = true;\n break;\n }\n }\n }\n if (isOutsideMainArea && !isSelected && !isInFreezeArea) {\n return loadingCell;\n }\n }\n let result = getCellContent([outerCol, row]);\n if (rowMarkerOffset !== 0 && result.span !== undefined) {\n result = {\n ...result,\n span: [result.span[0] + rowMarkerOffset, result.span[1] + rowMarkerOffset],\n };\n }\n return result;\n }\n }, [\n showTrailingBlankRow,\n mangledRows,\n hasRowMarkers,\n rowMarkerCheckboxStyle,\n gridSelection?.rows,\n rowMarkers,\n rowMarkerStartIndex,\n onRowMoved,\n rowMarkerOffset,\n trailingRowOptions?.hint,\n trailingRowOptions?.addIcon,\n experimental?.strict,\n getCellContent,\n ]);\n const mangledGetGroupDetails = React.useCallback(group => {\n let result = getGroupDetails?.(group) ?? { name: group };\n if (onGroupHeaderRenamed !== undefined && group !== \"\") {\n result = {\n // FIXME: Mutate\n icon: result.icon,\n name: result.name,\n overrideTheme: result.overrideTheme,\n actions: [\n ...(result.actions ?? []),\n {\n title: \"Rename\",\n icon: \"renameIcon\",\n onClick: e => setRenameGroup({\n group: result.name,\n bounds: e.bounds,\n }),\n },\n ],\n };\n }\n return result;\n }, [getGroupDetails, onGroupHeaderRenamed]);\n const setOverlaySimple = React.useCallback((val) => {\n const [col, row] = val.cell;\n const column = mangledCols[col];\n const groupTheme = column?.group !== undefined ? mangledGetGroupDetails(column.group)?.overrideTheme : undefined;\n const colTheme = column?.themeOverride;\n const rowTheme = getRowThemeOverride?.(row);\n setOverlay({\n ...val,\n theme: mergeAndRealizeTheme(mergedTheme, groupTheme, colTheme, rowTheme, val.content.themeOverride),\n });\n }, [getRowThemeOverride, mangledCols, mangledGetGroupDetails, mergedTheme]);\n const reselect = React.useCallback((bounds, fromKeyboard, initialValue) => {\n if (gridSelection.current === undefined)\n return;\n const [col, row] = gridSelection.current.cell;\n const c = getMangledCellContent([col, row]);\n if (c.kind !== GridCellKind.Boolean && c.allowOverlay) {\n let content = c;\n if (initialValue !== undefined) {\n switch (content.kind) {\n case GridCellKind.Number: {\n const d = maybe(() => (initialValue === \"-\" ? -0 : Number.parseFloat(initialValue)), 0);\n content = {\n ...content,\n data: Number.isNaN(d) ? 0 : d,\n };\n break;\n }\n case GridCellKind.Text:\n case GridCellKind.Markdown:\n case GridCellKind.Uri:\n content = {\n ...content,\n data: initialValue,\n };\n break;\n }\n }\n setOverlaySimple({\n target: bounds,\n content,\n initialValue,\n cell: [col, row],\n highlight: initialValue === undefined,\n forceEditMode: initialValue !== undefined,\n });\n }\n else if (c.kind === GridCellKind.Boolean && fromKeyboard && c.readonly !== true) {\n mangledOnCellsEdited([\n {\n location: gridSelection.current.cell,\n value: {\n ...c,\n data: toggleBoolean(c.data),\n },\n },\n ]);\n gridRef.current?.damage([{ cell: gridSelection.current.cell }]);\n }\n }, [getMangledCellContent, gridSelection, mangledOnCellsEdited, setOverlaySimple]);\n const focusOnRowFromTrailingBlankRow = React.useCallback((col, row) => {\n const bounds = gridRef.current?.getBounds(col, row);\n if (bounds === undefined || scrollRef.current === null) {\n return;\n }\n const content = getMangledCellContent([col, row]);\n if (!content.allowOverlay) {\n return;\n }\n setOverlaySimple({\n target: bounds,\n content,\n initialValue: undefined,\n highlight: true,\n cell: [col, row],\n forceEditMode: true,\n });\n }, [getMangledCellContent, setOverlaySimple]);\n const scrollTo = React.useCallback((col, row, dir = \"both\", paddingX = 0, paddingY = 0, options = undefined) => {\n if (scrollRef.current !== null) {\n const grid = gridRef.current;\n const canvas = canvasRef.current;\n const trueCol = typeof col !== \"number\" ? (col.unit === \"cell\" ? col.amount : undefined) : col;\n const trueRow = typeof row !== \"number\" ? (row.unit === \"cell\" ? row.amount : undefined) : row;\n const desiredX = typeof col !== \"number\" && col.unit === \"px\" ? col.amount : undefined;\n const desiredY = typeof row !== \"number\" && row.unit === \"px\" ? row.amount : undefined;\n if (grid !== null && canvas !== null) {\n let targetRect = {\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n };\n let scrollX = 0;\n let scrollY = 0;\n if (trueCol !== undefined || trueRow !== undefined) {\n targetRect = grid.getBounds((trueCol ?? 0) + rowMarkerOffset, trueRow ?? 0) ?? targetRect;\n if (targetRect.width === 0 || targetRect.height === 0)\n return;\n }\n const scrollBounds = canvas.getBoundingClientRect();\n const scale = scrollBounds.width / canvas.offsetWidth;\n if (desiredX !== undefined) {\n targetRect = {\n ...targetRect,\n x: desiredX - scrollBounds.left - scrollRef.current.scrollLeft,\n width: 1,\n };\n }\n if (desiredY !== undefined) {\n targetRect = {\n ...targetRect,\n y: desiredY + scrollBounds.top - scrollRef.current.scrollTop,\n height: 1,\n };\n }\n if (targetRect !== undefined) {\n const bounds = {\n x: targetRect.x - paddingX,\n y: targetRect.y - paddingY,\n width: targetRect.width + 2 * paddingX,\n height: targetRect.height + 2 * paddingY,\n };\n let frozenWidth = 0;\n for (let i = 0; i < freezeColumns; i++) {\n frozenWidth += columns[i].width;\n }\n let trailingRowHeight = 0;\n const freezeTrailingRowsEffective = freezeTrailingRows + (lastRowSticky ? 1 : 0);\n if (freezeTrailingRowsEffective > 0) {\n trailingRowHeight = getFreezeTrailingHeight(mangledRows, freezeTrailingRowsEffective, rowHeight);\n }\n // scrollBounds is already scaled\n let sLeft = frozenWidth * scale + scrollBounds.left + rowMarkerOffset * rowMarkerWidth * scale;\n let sRight = scrollBounds.right;\n let sTop = scrollBounds.top + totalHeaderHeight * scale;\n let sBottom = scrollBounds.bottom - trailingRowHeight * scale;\n const minx = targetRect.width + paddingX * 2;\n switch (options?.hAlign) {\n case \"start\":\n sRight = sLeft + minx;\n break;\n case \"end\":\n sLeft = sRight - minx;\n break;\n case \"center\":\n sLeft = Math.floor((sLeft + sRight) / 2) - minx / 2;\n sRight = sLeft + minx;\n break;\n }\n const miny = targetRect.height + paddingY * 2;\n switch (options?.vAlign) {\n case \"start\":\n sBottom = sTop + miny;\n break;\n case \"end\":\n sTop = sBottom - miny;\n break;\n case \"center\":\n sTop = Math.floor((sTop + sBottom) / 2) - miny / 2;\n sBottom = sTop + miny;\n break;\n }\n if (sLeft > bounds.x) {\n scrollX = bounds.x - sLeft;\n }\n else if (sRight < bounds.x + bounds.width) {\n scrollX = bounds.x + bounds.width - sRight;\n }\n if (sTop > bounds.y) {\n scrollY = bounds.y - sTop;\n }\n else if (sBottom < bounds.y + bounds.height) {\n scrollY = bounds.y + bounds.height - sBottom;\n }\n if (dir === \"vertical\" || (typeof col === \"number\" && col < freezeColumns)) {\n scrollX = 0;\n }\n else if (dir === \"horizontal\" ||\n (typeof row === \"number\" && row >= mangledRows - freezeTrailingRowsEffective)) {\n scrollY = 0;\n }\n if (scrollX !== 0 || scrollY !== 0) {\n // Remove scaling as scrollTo method is unaffected by transform scale.\n if (scale !== 1) {\n scrollX /= scale;\n scrollY /= scale;\n }\n scrollRef.current.scrollTo(scrollX + scrollRef.current.scrollLeft, scrollY + scrollRef.current.scrollTop);\n }\n }\n }\n }\n }, [\n rowMarkerOffset,\n freezeTrailingRows,\n rowMarkerWidth,\n totalHeaderHeight,\n freezeColumns,\n columns,\n mangledRows,\n lastRowSticky,\n rowHeight,\n ]);\n const focusCallback = React.useRef(focusOnRowFromTrailingBlankRow);\n const getCellContentRef = React.useRef(getCellContent);\n const rowsRef = React.useRef(rows);\n focusCallback.current = focusOnRowFromTrailingBlankRow;\n getCellContentRef.current = getCellContent;\n rowsRef.current = rows;\n const appendRow = React.useCallback(async (col, openOverlay = true) => {\n const c = mangledCols[col];\n if (c?.trailingRowOptions?.disabled === true) {\n return;\n }\n const appendResult = onRowAppended?.();\n let r = undefined;\n let bottom = true;\n if (appendResult !== undefined) {\n r = await appendResult;\n if (r === \"top\")\n bottom = false;\n if (typeof r === \"number\")\n bottom = false;\n }\n let backoff = 0;\n const doFocus = () => {\n if (rowsRef.current <= rows) {\n if (backoff < 500) {\n window.setTimeout(doFocus, backoff);\n }\n backoff = 50 + backoff * 2;\n return;\n }\n const row = typeof r === \"number\" ? r : bottom ? rows : 0;\n scrollToRef.current(col - rowMarkerOffset, row);\n setCurrent({\n cell: [col, row],\n range: {\n x: col,\n y: row,\n width: 1,\n height: 1,\n },\n }, false, false, \"edit\");\n const cell = getCellContentRef.current([col - rowMarkerOffset, row]);\n if (cell.allowOverlay && isReadWriteCell(cell) && cell.readonly !== true && openOverlay) {\n // wait for scroll to have a chance to process\n window.setTimeout(() => {\n focusCallback.current(col, row);\n }, 0);\n }\n };\n // Queue up to allow the consumer to react to the event and let us check if they did\n doFocus();\n }, [mangledCols, onRowAppended, rowMarkerOffset, rows, setCurrent]);\n const getCustomNewRowTargetColumn = React.useCallback((col) => {\n const customTargetColumn = columns[col]?.trailingRowOptions?.targetColumn ?? trailingRowOptions?.targetColumn;\n if (typeof customTargetColumn === \"number\") {\n const customTargetOffset = hasRowMarkers ? 1 : 0;\n return customTargetColumn + customTargetOffset;\n }\n if (typeof customTargetColumn === \"object\") {\n const maybeIndex = columnsIn.indexOf(customTargetColumn);\n if (maybeIndex >= 0) {\n const customTargetOffset = hasRowMarkers ? 1 : 0;\n return maybeIndex + customTargetOffset;\n }\n }\n return undefined;\n }, [columns, columnsIn, hasRowMarkers, trailingRowOptions?.targetColumn]);\n const lastSelectedRowRef = React.useRef();\n const lastSelectedColRef = React.useRef();\n const themeForCell = React.useCallback((cell, pos) => {\n const [col, row] = pos;\n return mergeAndRealizeTheme(mergedTheme, mangledCols[col]?.themeOverride, getRowThemeOverride?.(row), cell.themeOverride);\n }, [getRowThemeOverride, mangledCols, mergedTheme]);\n const handleSelect = React.useCallback((args) => {\n const isMultiKey = browserIsOSX.value ? args.metaKey : args.ctrlKey;\n const isMultiRow = isMultiKey && rowSelect === \"multi\";\n const isMultiCol = isMultiKey && columnSelect === \"multi\";\n const [col, row] = args.location;\n const selectedColumns = gridSelection.columns;\n const selectedRows = gridSelection.rows;\n const [cellCol, cellRow] = gridSelection.current?.cell ?? [];\n // eslint-disable-next-line unicorn/prefer-switch\n if (args.kind === \"cell\") {\n lastSelectedColRef.current = undefined;\n lastMouseSelectLocation.current = [col, row];\n if (col === 0 && hasRowMarkers) {\n if ((showTrailingBlankRow === true && row === rows) ||\n rowMarkers === \"number\" ||\n rowSelect === \"none\")\n return;\n const markerCell = getMangledCellContent(args.location);\n if (markerCell.kind !== InnerGridCellKind.Marker) {\n return;\n }\n if (onRowMoved !== undefined) {\n const renderer = getCellRenderer(markerCell);\n assert(renderer?.kind === InnerGridCellKind.Marker);\n const postClick = renderer?.onClick?.({\n ...args,\n cell: markerCell,\n posX: args.localEventX,\n posY: args.localEventY,\n bounds: args.bounds,\n theme: themeForCell(markerCell, args.location),\n preventDefault: () => undefined,\n });\n if (postClick === undefined || postClick.checked === markerCell.checked)\n return;\n }\n setOverlay(undefined);\n focus();\n const isSelected = selectedRows.hasIndex(row);\n const lastHighlighted = lastSelectedRowRef.current;\n if (rowSelect === \"multi\" &&\n (args.shiftKey || args.isLongTouch === true) &&\n lastHighlighted !== undefined &&\n selectedRows.hasIndex(lastHighlighted)) {\n const newSlice = [Math.min(lastHighlighted, row), Math.max(lastHighlighted, row) + 1];\n if (isMultiRow || rowSelectionMode === \"multi\") {\n setSelectedRows(undefined, newSlice, true);\n }\n else {\n setSelectedRows(CompactSelection.fromSingleSelection(newSlice), undefined, isMultiRow);\n }\n }\n else if (isMultiRow || args.isTouch || rowSelectionMode === \"multi\") {\n if (isSelected) {\n setSelectedRows(selectedRows.remove(row), undefined, true);\n }\n else {\n setSelectedRows(undefined, row, true);\n lastSelectedRowRef.current = row;\n }\n }\n else if (isSelected && selectedRows.length === 1) {\n setSelectedRows(CompactSelection.empty(), undefined, isMultiKey);\n }\n else {\n setSelectedRows(CompactSelection.fromSingleSelection(row), undefined, isMultiKey);\n lastSelectedRowRef.current = row;\n }\n }\n else if (col >= rowMarkerOffset && showTrailingBlankRow && row === rows) {\n const customTargetColumn = getCustomNewRowTargetColumn(col);\n void appendRow(customTargetColumn ?? col);\n }\n else {\n if (cellCol !== col || cellRow !== row) {\n const cell = getMangledCellContent(args.location);\n const renderer = getCellRenderer(cell);\n if (renderer?.onSelect !== undefined) {\n let prevented = false;\n renderer.onSelect({\n ...args,\n cell,\n posX: args.localEventX,\n posY: args.localEventY,\n bounds: args.bounds,\n preventDefault: () => (prevented = true),\n theme: themeForCell(cell, args.location),\n });\n if (prevented) {\n return;\n }\n }\n const isLastStickyRow = lastRowSticky && row === rows;\n const startedFromLastSticky = lastRowSticky && gridSelection !== undefined && gridSelection.current?.cell[1] === rows;\n if ((args.shiftKey || args.isLongTouch === true) &&\n cellCol !== undefined &&\n cellRow !== undefined &&\n gridSelection.current !== undefined &&\n !startedFromLastSticky) {\n if (isLastStickyRow) {\n // If we're making a selection and shift click in to the last sticky row,\n // just drop the event. Don't kill the selection.\n return;\n }\n const left = Math.min(col, cellCol);\n const right = Math.max(col, cellCol);\n const top = Math.min(row, cellRow);\n const bottom = Math.max(row, cellRow);\n setCurrent({\n ...gridSelection.current,\n range: {\n x: left,\n y: top,\n width: right - left + 1,\n height: bottom - top + 1,\n },\n }, true, isMultiKey, \"click\");\n lastSelectedRowRef.current = undefined;\n focus();\n }\n else {\n setCurrent({\n cell: [col, row],\n range: { x: col, y: row, width: 1, height: 1 },\n }, true, isMultiKey, \"click\");\n lastSelectedRowRef.current = undefined;\n setOverlay(undefined);\n focus();\n }\n }\n }\n }\n else if (args.kind === \"header\") {\n lastMouseSelectLocation.current = [col, row];\n setOverlay(undefined);\n if (hasRowMarkers && col === 0) {\n lastSelectedRowRef.current = undefined;\n lastSelectedColRef.current = undefined;\n if (rowSelect === \"multi\") {\n if (selectedRows.length !== rows) {\n setSelectedRows(CompactSelection.fromSingleSelection([0, rows]), undefined, isMultiKey);\n }\n else {\n setSelectedRows(CompactSelection.empty(), undefined, isMultiKey);\n }\n focus();\n }\n }\n else {\n const lastCol = lastSelectedColRef.current;\n if (columnSelect === \"multi\" &&\n (args.shiftKey || args.isLongTouch === true) &&\n lastCol !== undefined &&\n selectedColumns.hasIndex(lastCol)) {\n const newSlice = [Math.min(lastCol, col), Math.max(lastCol, col) + 1];\n if (isMultiCol) {\n setSelectedColumns(undefined, newSlice, isMultiKey);\n }\n else {\n setSelectedColumns(CompactSelection.fromSingleSelection(newSlice), undefined, isMultiKey);\n }\n }\n else if (isMultiCol) {\n if (selectedColumns.hasIndex(col)) {\n setSelectedColumns(selectedColumns.remove(col), undefined, isMultiKey);\n }\n else {\n setSelectedColumns(undefined, col, isMultiKey);\n }\n lastSelectedColRef.current = col;\n }\n else if (columnSelect !== \"none\") {\n setSelectedColumns(CompactSelection.fromSingleSelection(col), undefined, isMultiKey);\n lastSelectedColRef.current = col;\n }\n lastSelectedRowRef.current = undefined;\n focus();\n }\n }\n else if (args.kind === groupHeaderKind) {\n lastMouseSelectLocation.current = [col, row];\n }\n else if (args.kind === outOfBoundsKind && !args.isMaybeScrollbar) {\n setGridSelection(emptyGridSelection, false);\n setOverlay(undefined);\n focus();\n onSelectionCleared?.();\n lastSelectedRowRef.current = undefined;\n lastSelectedColRef.current = undefined;\n }\n }, [\n appendRow,\n columnSelect,\n focus,\n getCellRenderer,\n getCustomNewRowTargetColumn,\n getMangledCellContent,\n gridSelection,\n hasRowMarkers,\n lastRowSticky,\n onSelectionCleared,\n onRowMoved,\n rowMarkerOffset,\n rowMarkers,\n rowSelect,\n rowSelectionMode,\n rows,\n setCurrent,\n setGridSelection,\n setSelectedColumns,\n setSelectedRows,\n showTrailingBlankRow,\n themeForCell,\n ]);\n const isActivelyDraggingHeader = React.useRef(false);\n const lastMouseSelectLocation = React.useRef();\n const touchDownArgs = React.useRef(visibleRegion);\n const mouseDownData = React.useRef();\n const onMouseDown = React.useCallback((args) => {\n isPrevented.current = false;\n touchDownArgs.current = visibleRegionRef.current;\n if (args.button !== 0 && args.button !== 1) {\n mouseDownData.current = undefined;\n return;\n }\n const time = performance.now();\n mouseDownData.current = {\n button: args.button,\n time,\n location: args.location,\n };\n if (args?.kind === \"header\") {\n isActivelyDraggingHeader.current = true;\n }\n const fh = args.kind === \"cell\" && args.isFillHandle;\n if (!fh && args.kind !== \"cell\" && args.isEdge)\n return;\n setMouseState({\n previousSelection: gridSelection,\n fillHandle: fh,\n });\n lastMouseSelectLocation.current = undefined;\n if (!args.isTouch && args.button === 0 && !fh) {\n handleSelect(args);\n }\n else if (!args.isTouch && args.button === 1) {\n lastMouseSelectLocation.current = args.location;\n }\n }, [gridSelection, handleSelect]);\n const [renameGroup, setRenameGroup] = React.useState();\n const handleGroupHeaderSelection = React.useCallback((args) => {\n if (args.kind !== groupHeaderKind || columnSelect !== \"multi\") {\n return;\n }\n const isMultiKey = browserIsOSX.value ? args.metaKey : args.ctrlKey;\n const [col] = args.location;\n const selectedColumns = gridSelection.columns;\n if (col < rowMarkerOffset)\n return;\n const needle = mangledCols[col];\n let start = col;\n let end = col;\n for (let i = col - 1; i >= rowMarkerOffset; i--) {\n if (!isGroupEqual(needle.group, mangledCols[i].group))\n break;\n start--;\n }\n for (let i = col + 1; i < mangledCols.length; i++) {\n if (!isGroupEqual(needle.group, mangledCols[i].group))\n break;\n end++;\n }\n focus();\n if (isMultiKey) {\n if (selectedColumns.hasAll([start, end + 1])) {\n let newVal = selectedColumns;\n for (let index = start; index <= end; index++) {\n newVal = newVal.remove(index);\n }\n setSelectedColumns(newVal, undefined, isMultiKey);\n }\n else {\n setSelectedColumns(undefined, [start, end + 1], isMultiKey);\n }\n }\n else {\n setSelectedColumns(CompactSelection.fromSingleSelection([start, end + 1]), undefined, isMultiKey);\n }\n }, [columnSelect, focus, gridSelection.columns, mangledCols, rowMarkerOffset, setSelectedColumns]);\n const isPrevented = React.useRef(false);\n const normalSizeColumn = React.useCallback(async (col) => {\n if (getCellsForSelection !== undefined && onColumnResize !== undefined) {\n const start = visibleRegionRef.current.y;\n const end = visibleRegionRef.current.height;\n let cells = getCellsForSelection({\n x: col,\n y: start,\n width: 1,\n height: Math.min(end, rows - start),\n }, abortControllerRef.current.signal);\n if (typeof cells !== \"object\") {\n cells = await cells();\n }\n const inputCol = columns[col - rowMarkerOffset];\n const offscreen = document.createElement(\"canvas\");\n const ctx = offscreen.getContext(\"2d\", { alpha: false });\n if (ctx !== null) {\n ctx.font = mergedTheme.baseFontFull;\n const newCol = measureColumn(ctx, mergedTheme, inputCol, 0, cells, minColumnWidth, maxColumnWidth, false, getCellRenderer);\n onColumnResize?.(inputCol, newCol.width, col, newCol.width);\n }\n }\n }, [\n columns,\n getCellsForSelection,\n maxColumnWidth,\n mergedTheme,\n minColumnWidth,\n onColumnResize,\n rowMarkerOffset,\n rows,\n getCellRenderer,\n ]);\n const [scrollDir, setScrollDir] = React.useState();\n const fillPattern = React.useCallback(async (previousSelection, currentSelection) => {\n const patternRange = previousSelection.current?.range;\n if (patternRange === undefined ||\n getCellsForSelection === undefined ||\n currentSelection.current === undefined) {\n return;\n }\n const currentRange = currentSelection.current.range;\n if (onFillPattern !== undefined) {\n let canceled = false;\n onFillPattern({\n fillDestination: { ...currentRange, x: currentRange.x - rowMarkerOffset },\n patternSource: { ...patternRange, x: patternRange.x - rowMarkerOffset },\n preventDefault: () => (canceled = true),\n });\n if (canceled)\n return;\n }\n let cells = getCellsForSelection(patternRange, abortControllerRef.current.signal);\n if (typeof cells !== \"object\")\n cells = await cells();\n const pattern = cells;\n // loop through all cells in currentSelection.current.range\n const editItemList = [];\n for (let x = 0; x < currentRange.width; x++) {\n for (let y = 0; y < currentRange.height; y++) {\n const cell = [currentRange.x + x, currentRange.y + y];\n if (itemIsInRect(cell, patternRange))\n continue;\n const patternCell = pattern[y % patternRange.height][x % patternRange.width];\n if (isInnerOnlyCell(patternCell) || !isReadWriteCell(patternCell))\n continue;\n editItemList.push({\n location: cell,\n value: { ...patternCell },\n });\n }\n }\n mangledOnCellsEdited(editItemList);\n gridRef.current?.damage(editItemList.map(c => ({\n cell: c.location,\n })));\n }, [getCellsForSelection, mangledOnCellsEdited, onFillPattern, rowMarkerOffset]);\n const fillRight = React.useCallback(() => {\n if (gridSelection.current === undefined || gridSelection.current.range.width <= 1)\n return;\n const firstColSelection = {\n ...gridSelection,\n current: {\n ...gridSelection.current,\n range: {\n ...gridSelection.current.range,\n width: 1,\n },\n },\n };\n void fillPattern(firstColSelection, gridSelection);\n }, [fillPattern, gridSelection]);\n const fillDown = React.useCallback(() => {\n if (gridSelection.current === undefined || gridSelection.current.range.height <= 1)\n return;\n const firstRowSelection = {\n ...gridSelection,\n current: {\n ...gridSelection.current,\n range: {\n ...gridSelection.current.range,\n height: 1,\n },\n },\n };\n void fillPattern(firstRowSelection, gridSelection);\n }, [fillPattern, gridSelection]);\n const onMouseUp = React.useCallback((args, isOutside) => {\n const mouse = mouseState;\n setMouseState(undefined);\n setFillHighlightRegion(undefined);\n setScrollDir(undefined);\n isActivelyDraggingHeader.current = false;\n if (isOutside)\n return;\n if (mouse?.fillHandle === true &&\n gridSelection.current !== undefined &&\n mouse.previousSelection?.current !== undefined) {\n if (fillHighlightRegion === undefined)\n return;\n const newRange = {\n ...gridSelection,\n current: {\n ...gridSelection.current,\n range: combineRects(mouse.previousSelection.current.range, fillHighlightRegion),\n },\n };\n void fillPattern(mouse.previousSelection, newRange);\n setGridSelection(newRange, true);\n return;\n }\n const [col, row] = args.location;\n const [lastMouseDownCol, lastMouseDownRow] = lastMouseSelectLocation.current ?? [];\n const preventDefault = () => {\n isPrevented.current = true;\n };\n const handleMaybeClick = (a) => {\n const isValidClick = a.isTouch || (lastMouseDownCol === col && lastMouseDownRow === row);\n if (isValidClick) {\n onCellClicked?.([col - rowMarkerOffset, row], {\n ...a,\n preventDefault,\n });\n }\n if (a.button === 1)\n return !isPrevented.current;\n if (!isPrevented.current) {\n const c = getMangledCellContent(args.location);\n const r = getCellRenderer(c);\n if (r !== undefined && r.onClick !== undefined && isValidClick) {\n const newVal = r.onClick({\n ...a,\n cell: c,\n posX: a.localEventX,\n posY: a.localEventY,\n bounds: a.bounds,\n theme: themeForCell(c, args.location),\n preventDefault,\n });\n if (newVal !== undefined && !isInnerOnlyCell(newVal) && isEditableGridCell(newVal)) {\n mangledOnCellsEdited([{ location: a.location, value: newVal }]);\n gridRef.current?.damage([\n {\n cell: a.location,\n },\n ]);\n }\n }\n if (isPrevented.current || gridSelection.current === undefined)\n return false;\n let shouldActivate = false;\n switch (c.activationBehaviorOverride ?? cellActivationBehavior) {\n case \"double-click\":\n case \"second-click\": {\n if (mouse?.previousSelection?.current?.cell === undefined)\n break;\n const [selectedCol, selectedRow] = gridSelection.current.cell;\n const [prevCol, prevRow] = mouse.previousSelection.current.cell;\n const isClickOnSelected = col === selectedCol && col === prevCol && row === selectedRow && row === prevRow;\n shouldActivate =\n isClickOnSelected &&\n (a.isDoubleClick === true || cellActivationBehavior === \"second-click\");\n break;\n }\n case \"single-click\": {\n shouldActivate = true;\n break;\n }\n }\n if (shouldActivate) {\n onCellActivated?.([col - rowMarkerOffset, row]);\n reselect(a.bounds, false);\n return true;\n }\n }\n return false;\n };\n const clickLocation = args.location[0] - rowMarkerOffset;\n if (args.isTouch) {\n const vr = visibleRegionRef.current;\n const touchVr = touchDownArgs.current;\n if (vr.x !== touchVr.x || vr.y !== touchVr.y) {\n // we scrolled, abort\n return;\n }\n // take care of context menus first if long pressed item is already selected\n if (args.isLongTouch === true) {\n if (args.kind === \"cell\" && itemsAreEqual(gridSelection.current?.cell, args.location)) {\n onCellContextMenu?.([clickLocation, args.location[1]], {\n ...args,\n preventDefault,\n });\n return;\n }\n else if (args.kind === \"header\" && gridSelection.columns.hasIndex(col)) {\n onHeaderContextMenu?.(clickLocation, { ...args, preventDefault });\n return;\n }\n else if (args.kind === groupHeaderKind) {\n if (clickLocation < 0) {\n return;\n }\n onGroupHeaderContextMenu?.(clickLocation, { ...args, preventDefault });\n return;\n }\n }\n if (args.kind === \"cell\") {\n // click that cell\n if (!handleMaybeClick(args)) {\n handleSelect(args);\n }\n }\n else if (args.kind === groupHeaderKind) {\n onGroupHeaderClicked?.(clickLocation, { ...args, preventDefault });\n }\n else {\n if (args.kind === headerKind) {\n onHeaderClicked?.(clickLocation, {\n ...args,\n preventDefault,\n });\n }\n handleSelect(args);\n }\n return;\n }\n if (args.kind === \"header\") {\n if (clickLocation < 0) {\n return;\n }\n if (args.isEdge) {\n if (args.isDoubleClick === true) {\n void normalSizeColumn(col);\n }\n }\n else if (args.button === 0 && col === lastMouseDownCol && row === lastMouseDownRow) {\n onHeaderClicked?.(clickLocation, { ...args, preventDefault });\n }\n }\n if (args.kind === groupHeaderKind) {\n if (clickLocation < 0) {\n return;\n }\n if (args.button === 0 && col === lastMouseDownCol && row === lastMouseDownRow) {\n onGroupHeaderClicked?.(clickLocation, { ...args, preventDefault });\n if (!isPrevented.current) {\n handleGroupHeaderSelection(args);\n }\n }\n }\n if (args.kind === \"cell\" && (args.button === 0 || args.button === 1)) {\n handleMaybeClick(args);\n }\n lastMouseSelectLocation.current = undefined;\n }, [\n mouseState,\n gridSelection,\n rowMarkerOffset,\n fillHighlightRegion,\n fillPattern,\n setGridSelection,\n onCellClicked,\n getMangledCellContent,\n getCellRenderer,\n cellActivationBehavior,\n themeForCell,\n mangledOnCellsEdited,\n onCellActivated,\n reselect,\n onCellContextMenu,\n onHeaderContextMenu,\n onGroupHeaderContextMenu,\n handleSelect,\n onGroupHeaderClicked,\n onHeaderClicked,\n normalSizeColumn,\n handleGroupHeaderSelection,\n ]);\n const onMouseMoveImpl = React.useCallback((args) => {\n const a = {\n ...args,\n location: [args.location[0] - rowMarkerOffset, args.location[1]],\n };\n onMouseMove?.(a);\n if (mouseState !== undefined && args.buttons === 0) {\n setMouseState(undefined);\n setFillHighlightRegion(undefined);\n setScrollDir(undefined);\n isActivelyDraggingHeader.current = false;\n }\n setScrollDir(cv => {\n if (isActivelyDraggingHeader.current)\n return [args.scrollEdge[0], 0];\n if (args.scrollEdge[0] === cv?.[0] && args.scrollEdge[1] === cv[1])\n return cv;\n return mouseState === undefined || (mouseDownData.current?.location[0] ?? 0) < rowMarkerOffset\n ? undefined\n : args.scrollEdge;\n });\n }, [mouseState, onMouseMove, rowMarkerOffset]);\n const onHeaderMenuClickInner = React.useCallback((col, screenPosition) => {\n onHeaderMenuClick?.(col - rowMarkerOffset, screenPosition);\n }, [onHeaderMenuClick, rowMarkerOffset]);\n const currentCell = gridSelection?.current?.cell;\n const onVisibleRegionChangedImpl = React.useCallback((region, clientWidth, clientHeight, rightElWidth, tx, ty) => {\n hasJustScrolled.current = false;\n let selected = currentCell;\n if (selected !== undefined) {\n selected = [selected[0] - rowMarkerOffset, selected[1]];\n }\n const freezeRegion = freezeColumns === 0\n ? undefined\n : {\n x: 0,\n y: region.y,\n width: freezeColumns,\n height: region.height,\n };\n const freezeRegions = [];\n if (freezeRegion !== undefined)\n freezeRegions.push(freezeRegion);\n if (freezeTrailingRows > 0) {\n freezeRegions.push({\n x: region.x - rowMarkerOffset,\n y: rows - freezeTrailingRows,\n width: region.width,\n height: freezeTrailingRows,\n });\n if (freezeColumns > 0) {\n freezeRegions.push({\n x: 0,\n y: rows - freezeTrailingRows,\n width: freezeColumns,\n height: freezeTrailingRows,\n });\n }\n }\n const newRegion = {\n x: region.x - rowMarkerOffset,\n y: region.y,\n width: region.width,\n height: showTrailingBlankRow && region.y + region.height >= rows ? region.height - 1 : region.height,\n tx,\n ty,\n extras: {\n selected,\n freezeRegion,\n freezeRegions,\n },\n };\n visibleRegionRef.current = newRegion;\n setVisibleRegion(newRegion);\n setClientSize([clientWidth, clientHeight, rightElWidth]);\n onVisibleRegionChanged?.(newRegion, newRegion.tx, newRegion.ty, newRegion.extras);\n }, [\n currentCell,\n rowMarkerOffset,\n showTrailingBlankRow,\n rows,\n freezeColumns,\n freezeTrailingRows,\n setVisibleRegion,\n onVisibleRegionChanged,\n ]);\n const onColumnMovedImpl = whenDefined(onColumnMoved, React.useCallback((startIndex, endIndex) => {\n onColumnMoved?.(startIndex - rowMarkerOffset, endIndex - rowMarkerOffset);\n if (columnSelect !== \"none\") {\n setSelectedColumns(CompactSelection.fromSingleSelection(endIndex), undefined, true);\n }\n }, [columnSelect, onColumnMoved, rowMarkerOffset, setSelectedColumns]));\n const isActivelyDragging = React.useRef(false);\n const onDragStartImpl = React.useCallback((args) => {\n if (args.location[0] === 0 && rowMarkerOffset > 0) {\n args.preventDefault();\n return;\n }\n onDragStart?.({\n ...args,\n location: [args.location[0] - rowMarkerOffset, args.location[1]],\n });\n if (!args.defaultPrevented()) {\n isActivelyDragging.current = true;\n }\n setMouseState(undefined);\n }, [onDragStart, rowMarkerOffset]);\n const onDragEnd = React.useCallback(() => {\n isActivelyDragging.current = false;\n }, []);\n const hoveredRef = React.useRef();\n const onItemHoveredImpl = React.useCallback((args) => {\n // make sure we still have a button down\n if (mouseEventArgsAreEqual(args, hoveredRef.current))\n return;\n hoveredRef.current = args;\n if (mouseDownData?.current?.button !== undefined && mouseDownData.current.button >= 1)\n return;\n if (args.buttons !== 0 &&\n mouseState !== undefined &&\n mouseDownData.current?.location[0] === 0 &&\n args.location[0] === 0 &&\n rowMarkerOffset === 1 &&\n rowSelect === \"multi\" &&\n mouseState.previousSelection &&\n !mouseState.previousSelection.rows.hasIndex(mouseDownData.current.location[1]) &&\n gridSelection.rows.hasIndex(mouseDownData.current.location[1])) {\n const start = Math.min(mouseDownData.current.location[1], args.location[1]);\n const end = Math.max(mouseDownData.current.location[1], args.location[1]) + 1;\n setSelectedRows(CompactSelection.fromSingleSelection([start, end]), undefined, false);\n }\n if (args.buttons !== 0 &&\n mouseState !== undefined &&\n gridSelection.current !== undefined &&\n !isActivelyDragging.current &&\n !isActivelyDraggingHeader.current &&\n (rangeSelect === \"rect\" || rangeSelect === \"multi-rect\")) {\n const [selectedCol, selectedRow] = gridSelection.current.cell;\n // eslint-disable-next-line prefer-const\n let [col, row] = args.location;\n if (row < 0) {\n row = visibleRegionRef.current.y;\n }\n if (mouseState.fillHandle === true && mouseState.previousSelection?.current !== undefined) {\n const prevRange = mouseState.previousSelection.current.range;\n row = Math.min(row, showTrailingBlankRow ? rows - 1 : rows);\n const rect = getClosestRect(prevRange, col, row, allowedFillDirections);\n setFillHighlightRegion(rect);\n }\n else {\n const startedFromLastStickyRow = showTrailingBlankRow && selectedRow === rows;\n if (startedFromLastStickyRow)\n return;\n const landedOnLastStickyRow = showTrailingBlankRow && row === rows;\n if (landedOnLastStickyRow) {\n if (args.kind === outOfBoundsKind)\n row--;\n else\n return;\n }\n col = Math.max(col, rowMarkerOffset);\n const deltaX = col - selectedCol;\n const deltaY = row - selectedRow;\n const newRange = {\n x: deltaX >= 0 ? selectedCol : col,\n y: deltaY >= 0 ? selectedRow : row,\n width: Math.abs(deltaX) + 1,\n height: Math.abs(deltaY) + 1,\n };\n setCurrent({\n ...gridSelection.current,\n range: newRange,\n }, true, false, \"drag\");\n }\n }\n onItemHovered?.({ ...args, location: [args.location[0] - rowMarkerOffset, args.location[1]] });\n }, [\n allowedFillDirections,\n mouseState,\n rowMarkerOffset,\n rowSelect,\n gridSelection,\n rangeSelect,\n onItemHovered,\n setSelectedRows,\n showTrailingBlankRow,\n rows,\n setCurrent,\n ]);\n const adjustSelectionOnScroll = React.useCallback(() => {\n const args = hoveredRef.current;\n if (args === undefined)\n return;\n const [xDir, yDir] = args.scrollEdge;\n let [col, row] = args.location;\n const visible = visibleRegionRef.current;\n if (xDir === -1) {\n col = visible.extras?.freezeRegion?.x ?? visible.x;\n }\n else if (xDir === 1) {\n col = visible.x + visible.width;\n }\n if (yDir === -1) {\n row = Math.max(0, visible.y);\n }\n else if (yDir === 1) {\n row = Math.min(rows - 1, visible.y + visible.height);\n }\n col = clamp(col, 0, mangledCols.length - 1);\n row = clamp(row, 0, rows - 1);\n onItemHoveredImpl({\n ...args,\n location: [col, row],\n });\n }, [mangledCols.length, onItemHoveredImpl, rows]);\n useAutoscroll(scrollDir, scrollRef, adjustSelectionOnScroll);\n // 1 === move one\n // 2 === move to end\n const adjustSelection = React.useCallback((direction) => {\n if (gridSelection.current === undefined)\n return;\n const [x, y] = direction;\n const [col, row] = gridSelection.current.cell;\n const old = gridSelection.current.range;\n let left = old.x;\n let right = old.x + old.width;\n let top = old.y;\n let bottom = old.y + old.height;\n // take care of vertical first in case new spans come in\n if (y !== 0) {\n switch (y) {\n case 2: {\n // go to end\n bottom = rows;\n top = row;\n scrollTo(0, bottom, \"vertical\");\n break;\n }\n case -2: {\n // go to start\n top = 0;\n bottom = row + 1;\n scrollTo(0, top, \"vertical\");\n break;\n }\n case 1: {\n // motion down\n if (top < row) {\n top++;\n scrollTo(0, top, \"vertical\");\n }\n else {\n bottom = Math.min(rows, bottom + 1);\n scrollTo(0, bottom, \"vertical\");\n }\n break;\n }\n case -1: {\n // motion up\n if (bottom > row + 1) {\n bottom--;\n scrollTo(0, bottom, \"vertical\");\n }\n else {\n top = Math.max(0, top - 1);\n scrollTo(0, top, \"vertical\");\n }\n break;\n }\n default: {\n assertNever(y);\n }\n }\n }\n if (x !== 0) {\n if (x === 2) {\n right = mangledCols.length;\n left = col;\n scrollTo(right - 1 - rowMarkerOffset, 0, \"horizontal\");\n }\n else if (x === -2) {\n left = rowMarkerOffset;\n right = col + 1;\n scrollTo(left - rowMarkerOffset, 0, \"horizontal\");\n }\n else {\n let disallowed = [];\n if (getCellsForSelection !== undefined) {\n const cells = getCellsForSelection({\n x: left,\n y: top,\n width: right - left - rowMarkerOffset,\n height: bottom - top,\n }, abortControllerRef.current.signal);\n if (typeof cells === \"object\") {\n disallowed = getSpanStops(cells);\n }\n }\n if (x === 1) {\n // motion right\n let done = false;\n if (left < col) {\n if (disallowed.length > 0) {\n const target = range(left + 1, col + 1).find(n => !disallowed.includes(n - rowMarkerOffset));\n if (target !== undefined) {\n left = target;\n done = true;\n }\n }\n else {\n left++;\n done = true;\n }\n if (done)\n scrollTo(left, 0, \"horizontal\");\n }\n if (!done) {\n right = Math.min(mangledCols.length, right + 1);\n scrollTo(right - 1 - rowMarkerOffset, 0, \"horizontal\");\n }\n }\n else if (x === -1) {\n // motion left\n let done = false;\n if (right > col + 1) {\n if (disallowed.length > 0) {\n const target = range(right - 1, col, -1).find(n => !disallowed.includes(n - rowMarkerOffset));\n if (target !== undefined) {\n right = target;\n done = true;\n }\n }\n else {\n right--;\n done = true;\n }\n if (done)\n scrollTo(right - rowMarkerOffset, 0, \"horizontal\");\n }\n if (!done) {\n left = Math.max(rowMarkerOffset, left - 1);\n scrollTo(left - rowMarkerOffset, 0, \"horizontal\");\n }\n }\n else {\n assertNever(x);\n }\n }\n }\n setCurrent({\n cell: gridSelection.current.cell,\n range: {\n x: left,\n y: top,\n width: right - left,\n height: bottom - top,\n },\n }, true, false, \"keyboard-select\");\n }, [getCellsForSelection, gridSelection, mangledCols.length, rowMarkerOffset, rows, scrollTo, setCurrent]);\n const updateSelectedCell = React.useCallback((col, row, fromEditingTrailingRow, freeMove) => {\n const rowMax = mangledRows - (fromEditingTrailingRow ? 0 : 1);\n col = clamp(col, rowMarkerOffset, columns.length - 1 + rowMarkerOffset);\n row = clamp(row, 0, rowMax);\n if (col === currentCell?.[0] && row === currentCell?.[1])\n return false;\n if (freeMove && gridSelection.current !== undefined) {\n const newStack = [...gridSelection.current.rangeStack];\n if (gridSelection.current.range.width > 1 || gridSelection.current.range.height > 1) {\n newStack.push(gridSelection.current.range);\n }\n setGridSelection({\n ...gridSelection,\n current: {\n cell: [col, row],\n range: { x: col, y: row, width: 1, height: 1 },\n rangeStack: newStack,\n },\n }, true);\n }\n else {\n setCurrent({\n cell: [col, row],\n range: { x: col, y: row, width: 1, height: 1 },\n }, true, false, \"keyboard-nav\");\n }\n if (lastSent.current !== undefined && lastSent.current[0] === col && lastSent.current[1] === row) {\n lastSent.current = undefined;\n }\n scrollTo(col - rowMarkerOffset, row);\n return true;\n }, [\n mangledRows,\n rowMarkerOffset,\n columns.length,\n currentCell,\n gridSelection,\n scrollTo,\n setGridSelection,\n setCurrent,\n ]);\n const onFinishEditing = React.useCallback((newValue, movement) => {\n if (overlay?.cell !== undefined && newValue !== undefined && isEditableGridCell(newValue)) {\n mangledOnCellsEdited([{ location: overlay.cell, value: newValue }]);\n window.requestAnimationFrame(() => {\n gridRef.current?.damage([\n {\n cell: overlay.cell,\n },\n ]);\n });\n }\n focus(true);\n setOverlay(undefined);\n const [movX, movY] = movement;\n if (gridSelection.current !== undefined && (movX !== 0 || movY !== 0)) {\n const isEditingTrailingRow = gridSelection.current.cell[1] === mangledRows - 1 && newValue !== undefined;\n updateSelectedCell(clamp(gridSelection.current.cell[0] + movX, 0, mangledCols.length - 1), clamp(gridSelection.current.cell[1] + movY, 0, mangledRows - 1), isEditingTrailingRow, false);\n }\n onFinishedEditing?.(newValue, movement);\n }, [\n overlay?.cell,\n focus,\n gridSelection,\n onFinishedEditing,\n mangledOnCellsEdited,\n mangledRows,\n updateSelectedCell,\n mangledCols.length,\n ]);\n const overlayID = React.useMemo(() => {\n return `gdg-overlay-${idCounter++}`;\n }, []);\n const deleteRange = React.useCallback((r) => {\n focus();\n const editList = [];\n for (let x = r.x; x < r.x + r.width; x++) {\n for (let y = r.y; y < r.y + r.height; y++) {\n const cellValue = getCellContent([x - rowMarkerOffset, y]);\n if (!cellValue.allowOverlay && cellValue.kind !== GridCellKind.Boolean)\n continue;\n let newVal = undefined;\n if (cellValue.kind === GridCellKind.Custom) {\n const toDelete = getCellRenderer(cellValue);\n const editor = toDelete?.provideEditor?.(cellValue);\n if (toDelete?.onDelete !== undefined) {\n newVal = toDelete.onDelete(cellValue);\n }\n else if (isObjectEditorCallbackResult(editor)) {\n newVal = editor?.deletedValue?.(cellValue);\n }\n }\n else if ((isEditableGridCell(cellValue) && cellValue.allowOverlay) ||\n cellValue.kind === GridCellKind.Boolean) {\n const toDelete = getCellRenderer(cellValue);\n newVal = toDelete?.onDelete?.(cellValue);\n }\n if (newVal !== undefined && !isInnerOnlyCell(newVal) && isEditableGridCell(newVal)) {\n editList.push({ location: [x, y], value: newVal });\n }\n }\n }\n mangledOnCellsEdited(editList);\n gridRef.current?.damage(editList.map(x => ({ cell: x.location })));\n }, [focus, getCellContent, getCellRenderer, mangledOnCellsEdited, rowMarkerOffset]);\n const overlayOpen = overlay !== undefined;\n const handleFixedKeybindings = React.useCallback((event) => {\n const cancel = () => {\n event.stopPropagation();\n event.preventDefault();\n };\n const details = {\n didMatch: false,\n };\n const { bounds } = event;\n const selectedColumns = gridSelection.columns;\n const selectedRows = gridSelection.rows;\n const keys = keybindings;\n if (!overlayOpen && isHotkey(keys.clear, event, details)) {\n setGridSelection(emptyGridSelection, false);\n onSelectionCleared?.();\n }\n else if (!overlayOpen && isHotkey(keys.selectAll, event, details)) {\n setGridSelection({\n columns: CompactSelection.empty(),\n rows: CompactSelection.empty(),\n current: {\n cell: gridSelection.current?.cell ?? [rowMarkerOffset, 0],\n range: {\n x: rowMarkerOffset,\n y: 0,\n width: columnsIn.length,\n height: rows,\n },\n rangeStack: [],\n },\n }, false);\n }\n else if (isHotkey(keys.search, event, details)) {\n searchInputRef?.current?.focus({ preventScroll: true });\n setShowSearchInner(true);\n }\n else if (isHotkey(keys.delete, event, details)) {\n const callbackResult = onDelete?.(gridSelection) ?? true;\n if (callbackResult !== false) {\n const toDelete = callbackResult === true ? gridSelection : callbackResult;\n // delete order:\n // 1) primary range\n // 2) secondary ranges\n // 3) columns\n // 4) rows\n if (toDelete.current !== undefined) {\n deleteRange(toDelete.current.range);\n for (const r of toDelete.current.rangeStack) {\n deleteRange(r);\n }\n }\n for (const r of toDelete.rows) {\n deleteRange({\n x: rowMarkerOffset,\n y: r,\n width: columnsIn.length,\n height: 1,\n });\n }\n for (const col of toDelete.columns) {\n deleteRange({\n x: col,\n y: 0,\n width: 1,\n height: rows,\n });\n }\n }\n }\n if (details.didMatch) {\n cancel();\n return true;\n }\n if (gridSelection.current === undefined)\n return false;\n let [col, row] = gridSelection.current.cell;\n let freeMove = false;\n let cancelOnlyOnMove = false;\n if (isHotkey(keys.scrollToSelectedCell, event, details)) {\n scrollToRef.current(col - rowMarkerOffset, row);\n }\n else if (columnSelect !== \"none\" && isHotkey(keys.selectColumn, event, details)) {\n if (selectedColumns.hasIndex(col)) {\n setSelectedColumns(selectedColumns.remove(col), undefined, true);\n }\n else {\n if (columnSelect === \"single\") {\n setSelectedColumns(CompactSelection.fromSingleSelection(col), undefined, true);\n }\n else {\n setSelectedColumns(undefined, col, true);\n }\n }\n }\n else if (rowSelect !== \"none\" && isHotkey(keys.selectRow, event, details)) {\n if (selectedRows.hasIndex(row)) {\n setSelectedRows(selectedRows.remove(row), undefined, true);\n }\n else {\n if (rowSelect === \"single\") {\n setSelectedRows(CompactSelection.fromSingleSelection(row), undefined, true);\n }\n else {\n setSelectedRows(undefined, row, true);\n }\n }\n }\n else if (!overlayOpen && bounds !== undefined && isHotkey(keys.activateCell, event, details)) {\n if (row === rows && showTrailingBlankRow) {\n window.setTimeout(() => {\n const customTargetColumn = getCustomNewRowTargetColumn(col);\n void appendRow(customTargetColumn ?? col);\n }, 0);\n }\n else {\n onCellActivated?.([col - rowMarkerOffset, row]);\n reselect(bounds, true);\n }\n }\n else if (gridSelection.current.range.height > 1 && isHotkey(keys.downFill, event, details)) {\n fillDown();\n }\n else if (gridSelection.current.range.width > 1 && isHotkey(keys.rightFill, event, details)) {\n fillRight();\n }\n else if (isHotkey(keys.goToNextPage, event, details)) {\n row += Math.max(1, visibleRegionRef.current.height - 4); // partial cell accounting\n }\n else if (isHotkey(keys.goToPreviousPage, event, details)) {\n row -= Math.max(1, visibleRegionRef.current.height - 4); // partial cell accounting\n }\n else if (isHotkey(keys.goToFirstCell, event, details)) {\n setOverlay(undefined);\n row = 0;\n col = 0;\n }\n else if (isHotkey(keys.goToLastCell, event, details)) {\n setOverlay(undefined);\n row = Number.MAX_SAFE_INTEGER;\n col = Number.MAX_SAFE_INTEGER;\n }\n else if (isHotkey(keys.selectToFirstCell, event, details)) {\n setOverlay(undefined);\n adjustSelection([-2, -2]);\n }\n else if (isHotkey(keys.selectToLastCell, event, details)) {\n setOverlay(undefined);\n adjustSelection([2, 2]);\n }\n else if (!overlayOpen) {\n if (isHotkey(keys.goDownCell, event, details)) {\n row += 1;\n }\n else if (isHotkey(keys.goUpCell, event, details)) {\n row -= 1;\n }\n else if (isHotkey(keys.goRightCell, event, details)) {\n col += 1;\n }\n else if (isHotkey(keys.goLeftCell, event, details)) {\n col -= 1;\n }\n else if (isHotkey(keys.goDownCellRetainSelection, event, details)) {\n row += 1;\n freeMove = true;\n }\n else if (isHotkey(keys.goUpCellRetainSelection, event, details)) {\n row -= 1;\n freeMove = true;\n }\n else if (isHotkey(keys.goRightCellRetainSelection, event, details)) {\n col += 1;\n freeMove = true;\n }\n else if (isHotkey(keys.goLeftCellRetainSelection, event, details)) {\n col -= 1;\n freeMove = true;\n }\n else if (isHotkey(keys.goToLastRow, event, details)) {\n row = rows - 1;\n }\n else if (isHotkey(keys.goToFirstRow, event, details)) {\n row = Number.MIN_SAFE_INTEGER;\n }\n else if (isHotkey(keys.goToLastColumn, event, details)) {\n col = Number.MAX_SAFE_INTEGER;\n }\n else if (isHotkey(keys.goToFirstColumn, event, details)) {\n col = Number.MIN_SAFE_INTEGER;\n }\n else if (rangeSelect === \"rect\" || rangeSelect === \"multi-rect\") {\n if (isHotkey(keys.selectGrowDown, event, details)) {\n adjustSelection([0, 1]);\n }\n else if (isHotkey(keys.selectGrowUp, event, details)) {\n adjustSelection([0, -1]);\n }\n else if (isHotkey(keys.selectGrowRight, event, details)) {\n adjustSelection([1, 0]);\n }\n else if (isHotkey(keys.selectGrowLeft, event, details)) {\n adjustSelection([-1, 0]);\n }\n else if (isHotkey(keys.selectToLastRow, event, details)) {\n adjustSelection([0, 2]);\n }\n else if (isHotkey(keys.selectToFirstRow, event, details)) {\n adjustSelection([0, -2]);\n }\n else if (isHotkey(keys.selectToLastColumn, event, details)) {\n adjustSelection([2, 0]);\n }\n else if (isHotkey(keys.selectToFirstColumn, event, details)) {\n adjustSelection([-2, 0]);\n }\n }\n cancelOnlyOnMove = details.didMatch;\n }\n else {\n if (isHotkey(keys.closeOverlay, event, details)) {\n setOverlay(undefined);\n }\n if (isHotkey(keys.acceptOverlayDown, event, details)) {\n setOverlay(undefined);\n row++;\n }\n if (isHotkey(keys.acceptOverlayUp, event, details)) {\n setOverlay(undefined);\n row--;\n }\n if (isHotkey(keys.acceptOverlayLeft, event, details)) {\n setOverlay(undefined);\n col--;\n }\n if (isHotkey(keys.acceptOverlayRight, event, details)) {\n setOverlay(undefined);\n col++;\n }\n }\n // #endregion\n const moved = updateSelectedCell(col, row, false, freeMove);\n const didMatch = details.didMatch;\n if (didMatch && (moved || !cancelOnlyOnMove || trapFocus)) {\n cancel();\n }\n return didMatch;\n }, [\n overlayOpen,\n gridSelection,\n keybindings,\n columnSelect,\n rowSelect,\n rangeSelect,\n rowMarkerOffset,\n rows,\n updateSelectedCell,\n setGridSelection,\n onSelectionCleared,\n columnsIn.length,\n onDelete,\n trapFocus,\n deleteRange,\n setSelectedColumns,\n setSelectedRows,\n showTrailingBlankRow,\n getCustomNewRowTargetColumn,\n appendRow,\n onCellActivated,\n reselect,\n fillDown,\n fillRight,\n adjustSelection,\n ]);\n const onKeyDown = React.useCallback((event) => {\n let cancelled = false;\n if (onKeyDownIn !== undefined) {\n onKeyDownIn({\n ...event,\n cancel: () => {\n cancelled = true;\n },\n });\n }\n if (cancelled)\n return;\n if (handleFixedKeybindings(event))\n return;\n if (gridSelection.current === undefined)\n return;\n const [col, row] = gridSelection.current.cell;\n const vr = visibleRegionRef.current;\n if (editOnType &&\n !event.metaKey &&\n !event.ctrlKey &&\n gridSelection.current !== undefined &&\n event.key.length === 1 &&\n /[ -~]/g.test(event.key) &&\n event.bounds !== undefined &&\n isReadWriteCell(getCellContent([col - rowMarkerOffset, Math.max(0, Math.min(row, rows - 1))]))) {\n if ((!showTrailingBlankRow || row !== rows) &&\n (vr.y > row || row > vr.y + vr.height || vr.x > col || col > vr.x + vr.width)) {\n return;\n }\n reselect(event.bounds, true, event.key);\n event.stopPropagation();\n event.preventDefault();\n }\n }, [\n editOnType,\n onKeyDownIn,\n handleFixedKeybindings,\n gridSelection,\n getCellContent,\n rowMarkerOffset,\n rows,\n showTrailingBlankRow,\n reselect,\n ]);\n const onContextMenu = React.useCallback((args, preventDefault) => {\n const adjustedCol = args.location[0] - rowMarkerOffset;\n if (args.kind === \"header\") {\n onHeaderContextMenu?.(adjustedCol, { ...args, preventDefault });\n }\n if (args.kind === groupHeaderKind) {\n if (adjustedCol < 0) {\n return;\n }\n onGroupHeaderContextMenu?.(adjustedCol, { ...args, preventDefault });\n }\n if (args.kind === \"cell\") {\n const [col, row] = args.location;\n onCellContextMenu?.([adjustedCol, row], {\n ...args,\n preventDefault,\n });\n if (!gridSelectionHasItem(gridSelection, args.location)) {\n updateSelectedCell(col, row, false, false);\n }\n }\n }, [\n gridSelection,\n onCellContextMenu,\n onGroupHeaderContextMenu,\n onHeaderContextMenu,\n rowMarkerOffset,\n updateSelectedCell,\n ]);\n const onPasteInternal = React.useCallback(async (e) => {\n if (!keybindings.paste)\n return;\n function pasteToCell(inner, target, rawValue, formatted) {\n const stringifiedRawValue = typeof rawValue === \"object\" ? rawValue?.join(\"\\n\") ?? \"\" : rawValue?.toString() ?? \"\";\n if (!isInnerOnlyCell(inner) && isReadWriteCell(inner) && inner.readonly !== true) {\n const coerced = coercePasteValue?.(stringifiedRawValue, inner);\n if (coerced !== undefined && isEditableGridCell(coerced)) {\n if (process.env.NODE_ENV !== \"production\" && coerced.kind !== inner.kind) {\n // eslint-disable-next-line no-console\n console.warn(\"Coercion should not change cell kind.\");\n }\n return {\n location: target,\n value: coerced,\n };\n }\n const r = getCellRenderer(inner);\n if (r === undefined)\n return undefined;\n if (r.kind === GridCellKind.Custom) {\n assert(inner.kind === GridCellKind.Custom);\n const newVal = r.onPaste?.(stringifiedRawValue, inner.data);\n if (newVal === undefined)\n return undefined;\n return {\n location: target,\n value: {\n ...inner,\n data: newVal,\n },\n };\n }\n else {\n const newVal = r.onPaste?.(stringifiedRawValue, inner, {\n formatted,\n formattedString: typeof formatted === \"string\" ? formatted : formatted?.join(\"\\n\"),\n rawValue,\n });\n if (newVal === undefined)\n return undefined;\n assert(newVal.kind === inner.kind);\n return {\n location: target,\n value: newVal,\n };\n }\n }\n return undefined;\n }\n const selectedColumns = gridSelection.columns;\n const selectedRows = gridSelection.rows;\n const focused = scrollRef.current?.contains(document.activeElement) === true ||\n canvasRef.current?.contains(document.activeElement) === true;\n let target;\n if (gridSelection.current !== undefined) {\n target = [gridSelection.current.range.x, gridSelection.current.range.y];\n }\n else if (selectedColumns.length === 1) {\n target = [selectedColumns.first() ?? 0, 0];\n }\n else if (selectedRows.length === 1) {\n target = [rowMarkerOffset, selectedRows.first() ?? 0];\n }\n if (focused && target !== undefined) {\n let data;\n let text;\n const textPlain = \"text/plain\";\n const textHtml = \"text/html\";\n if (navigator.clipboard.read !== undefined) {\n const clipboardContent = await navigator.clipboard.read();\n for (const item of clipboardContent) {\n if (item.types.includes(textHtml)) {\n const htmlBlob = await item.getType(textHtml);\n const html = await htmlBlob.text();\n const decoded = decodeHTML(html);\n if (decoded !== undefined) {\n data = decoded;\n break;\n }\n }\n if (item.types.includes(textPlain)) {\n // eslint-disable-next-line unicorn/no-await-expression-member\n text = await (await item.getType(textPlain)).text();\n }\n }\n }\n else if (navigator.clipboard.readText !== undefined) {\n text = await navigator.clipboard.readText();\n }\n else if (e !== undefined && e?.clipboardData !== null) {\n if (e.clipboardData.types.includes(textHtml)) {\n const html = e.clipboardData.getData(textHtml);\n data = decodeHTML(html);\n }\n if (data === undefined && e.clipboardData.types.includes(textPlain)) {\n text = e.clipboardData.getData(textPlain);\n }\n }\n else {\n return; // I didn't want to read that paste value anyway\n }\n const [targetCol, targetRow] = target;\n const editList = [];\n do {\n if (onPaste === undefined) {\n const cellData = getMangledCellContent(target);\n const rawValue = text ?? data?.map(r => r.map(cb => cb.rawValue).join(\"\\t\")).join(\"\\t\") ?? \"\";\n const newVal = pasteToCell(cellData, target, rawValue, undefined);\n if (newVal !== undefined) {\n editList.push(newVal);\n }\n break;\n }\n if (data === undefined) {\n if (text === undefined)\n return;\n data = unquote(text);\n }\n if (onPaste === false ||\n (typeof onPaste === \"function\" &&\n onPaste?.([target[0] - rowMarkerOffset, target[1]], data.map(r => r.map(cb => cb.rawValue?.toString() ?? \"\"))) !== true)) {\n return;\n }\n for (const [row, dataRow] of data.entries()) {\n if (row + targetRow >= rows)\n break;\n for (const [col, dataItem] of dataRow.entries()) {\n const index = [col + targetCol, row + targetRow];\n const [writeCol, writeRow] = index;\n if (writeCol >= mangledCols.length)\n continue;\n if (writeRow >= mangledRows)\n continue;\n const cellData = getMangledCellContent(index);\n const newVal = pasteToCell(cellData, index, dataItem.rawValue, dataItem.formatted);\n if (newVal !== undefined) {\n editList.push(newVal);\n }\n }\n }\n // eslint-disable-next-line no-constant-condition\n } while (false);\n mangledOnCellsEdited(editList);\n gridRef.current?.damage(editList.map(c => ({\n cell: c.location,\n })));\n }\n }, [\n coercePasteValue,\n getCellRenderer,\n getMangledCellContent,\n gridSelection,\n keybindings.paste,\n mangledCols.length,\n mangledOnCellsEdited,\n mangledRows,\n onPaste,\n rowMarkerOffset,\n rows,\n ]);\n useEventListener(\"paste\", onPasteInternal, safeWindow, false, true);\n // While this function is async, we deeply prefer not to await if we don't have to. This will lead to unpacking\n // promises in rather awkward ways when possible to avoid awaiting. We have to use fallback copy mechanisms when\n // an await has happened.\n const onCopy = React.useCallback(async (e, ignoreFocus) => {\n if (!keybindings.copy)\n return;\n const focused = ignoreFocus === true ||\n scrollRef.current?.contains(document.activeElement) === true ||\n canvasRef.current?.contains(document.activeElement) === true;\n const selectedColumns = gridSelection.columns;\n const selectedRows = gridSelection.rows;\n const copyToClipboardWithHeaders = (cells, columnIndexes) => {\n if (!copyHeaders) {\n copyToClipboard(cells, columnIndexes, e);\n }\n else {\n const headers = columnIndexes.map(index => ({\n kind: GridCellKind.Text,\n data: columnsIn[index].title,\n displayData: columnsIn[index].title,\n allowOverlay: false,\n }));\n copyToClipboard([headers, ...cells], columnIndexes, e);\n }\n };\n if (focused && getCellsForSelection !== undefined) {\n if (gridSelection.current !== undefined) {\n let thunk = getCellsForSelection(gridSelection.current.range, abortControllerRef.current.signal);\n if (typeof thunk !== \"object\") {\n thunk = await thunk();\n }\n copyToClipboardWithHeaders(thunk, range(gridSelection.current.range.x - rowMarkerOffset, gridSelection.current.range.x + gridSelection.current.range.width - rowMarkerOffset));\n }\n else if (selectedRows !== undefined && selectedRows.length > 0) {\n const toCopy = [...selectedRows];\n const cells = toCopy.map(rowIndex => {\n const thunk = getCellsForSelection({\n x: rowMarkerOffset,\n y: rowIndex,\n width: columnsIn.length,\n height: 1,\n }, abortControllerRef.current.signal);\n if (typeof thunk === \"object\") {\n return thunk[0];\n }\n return thunk().then(v => v[0]);\n });\n if (cells.some(x => x instanceof Promise)) {\n const settled = await Promise.all(cells);\n copyToClipboardWithHeaders(settled, range(columnsIn.length));\n }\n else {\n copyToClipboardWithHeaders(cells, range(columnsIn.length));\n }\n }\n else if (selectedColumns.length > 0) {\n const results = [];\n const cols = [];\n for (const col of selectedColumns) {\n let thunk = getCellsForSelection({\n x: col,\n y: 0,\n width: 1,\n height: rows,\n }, abortControllerRef.current.signal);\n if (typeof thunk !== \"object\") {\n thunk = await thunk();\n }\n results.push(thunk);\n cols.push(col - rowMarkerOffset);\n }\n if (results.length === 1) {\n copyToClipboardWithHeaders(results[0], cols);\n }\n else {\n // FIXME: this is dumb\n const toCopy = results.reduce((pv, cv) => pv.map((row, index) => [...row, ...cv[index]]));\n copyToClipboardWithHeaders(toCopy, cols);\n }\n }\n }\n }, [columnsIn, getCellsForSelection, gridSelection, keybindings.copy, rowMarkerOffset, rows, copyHeaders]);\n useEventListener(\"copy\", onCopy, safeWindow, false, false);\n const onCut = React.useCallback(async (e) => {\n if (!keybindings.cut)\n return;\n const focused = scrollRef.current?.contains(document.activeElement) === true ||\n canvasRef.current?.contains(document.activeElement) === true;\n if (!focused)\n return;\n await onCopy(e);\n if (gridSelection.current !== undefined) {\n let effectiveSelection = {\n current: {\n cell: gridSelection.current.cell,\n range: gridSelection.current.range,\n rangeStack: [],\n },\n rows: CompactSelection.empty(),\n columns: CompactSelection.empty(),\n };\n const onDeleteResult = onDelete?.(effectiveSelection);\n if (onDeleteResult === false)\n return;\n effectiveSelection = onDeleteResult === true ? effectiveSelection : onDeleteResult;\n if (effectiveSelection.current === undefined)\n return;\n deleteRange(effectiveSelection.current.range);\n }\n }, [deleteRange, gridSelection, keybindings.cut, onCopy, onDelete]);\n useEventListener(\"cut\", onCut, safeWindow, false, false);\n const onSearchResultsChanged = React.useCallback((results, navIndex) => {\n if (onSearchResultsChangedIn !== undefined) {\n if (rowMarkerOffset !== 0) {\n results = results.map(item => [item[0] - rowMarkerOffset, item[1]]);\n }\n onSearchResultsChangedIn(results, navIndex);\n return;\n }\n if (results.length === 0 || navIndex === -1)\n return;\n const [col, row] = results[navIndex];\n if (lastSent.current !== undefined && lastSent.current[0] === col && lastSent.current[1] === row) {\n return;\n }\n lastSent.current = [col, row];\n updateSelectedCell(col, row, false, false);\n }, [onSearchResultsChangedIn, rowMarkerOffset, updateSelectedCell]);\n // this effects purpose in life is to scroll the newly selected cell into view when and ONLY when that cell\n // is from an external gridSelection change. Also note we want the unmangled out selection because scrollTo\n // expects unmangled indexes\n const [outCol, outRow] = gridSelectionOuter?.current?.cell ?? [];\n const scrollToRef = React.useRef(scrollTo);\n scrollToRef.current = scrollTo;\n React.useLayoutEffect(() => {\n if (!hasJustScrolled.current &&\n outCol !== undefined &&\n outRow !== undefined &&\n (outCol !== expectedExternalGridSelection.current?.current?.cell[0] ||\n outRow !== expectedExternalGridSelection.current?.current?.cell[1])) {\n scrollToRef.current(outCol, outRow);\n }\n hasJustScrolled.current = false; //only allow skipping a single scroll\n }, [outCol, outRow]);\n const selectionOutOfBounds = gridSelection.current !== undefined &&\n (gridSelection.current.cell[0] >= mangledCols.length || gridSelection.current.cell[1] >= mangledRows);\n React.useLayoutEffect(() => {\n if (selectionOutOfBounds) {\n setGridSelection(emptyGridSelection, false);\n }\n }, [selectionOutOfBounds, setGridSelection]);\n const disabledRows = React.useMemo(() => {\n if (showTrailingBlankRow === true && trailingRowOptions?.tint === true) {\n return CompactSelection.fromSingleSelection(mangledRows - 1);\n }\n return CompactSelection.empty();\n }, [mangledRows, showTrailingBlankRow, trailingRowOptions?.tint]);\n const mangledVerticalBorder = React.useCallback((col) => {\n return typeof verticalBorder === \"boolean\"\n ? verticalBorder\n : verticalBorder?.(col - rowMarkerOffset) ?? true;\n }, [rowMarkerOffset, verticalBorder]);\n const renameGroupNode = React.useMemo(() => {\n if (renameGroup === undefined || canvasRef.current === null)\n return null;\n const { bounds, group } = renameGroup;\n const canvasBounds = canvasRef.current.getBoundingClientRect();\n return (React.createElement(GroupRename, { bounds: bounds, group: group, canvasBounds: canvasBounds, onClose: () => setRenameGroup(undefined), onFinish: newVal => {\n setRenameGroup(undefined);\n onGroupHeaderRenamed?.(group, newVal);\n } }));\n }, [onGroupHeaderRenamed, renameGroup]);\n const mangledFreezeColumns = Math.min(mangledCols.length, freezeColumns + (hasRowMarkers ? 1 : 0));\n React.useImperativeHandle(forwardedRef, () => ({\n appendRow: (col, openOverlay) => appendRow(col + rowMarkerOffset, openOverlay),\n updateCells: damageList => {\n if (rowMarkerOffset !== 0) {\n damageList = damageList.map(x => ({ cell: [x.cell[0] + rowMarkerOffset, x.cell[1]] }));\n }\n return gridRef.current?.damage(damageList);\n },\n getBounds: (col, row) => {\n if (canvasRef?.current === null || scrollRef?.current === null) {\n return undefined;\n }\n if (col === undefined && row === undefined) {\n // Return the bounds of the entire scroll area:\n const rect = canvasRef.current.getBoundingClientRect();\n const scale = rect.width / scrollRef.current.clientWidth;\n return {\n x: rect.x - scrollRef.current.scrollLeft * scale,\n y: rect.y - scrollRef.current.scrollTop * scale,\n width: scrollRef.current.scrollWidth * scale,\n height: scrollRef.current.scrollHeight * scale,\n };\n }\n return gridRef.current?.getBounds((col ?? 0) + rowMarkerOffset, row);\n },\n focus: () => gridRef.current?.focus(),\n emit: async (e) => {\n switch (e) {\n case \"delete\":\n onKeyDown({\n bounds: undefined,\n cancel: () => undefined,\n stopPropagation: () => undefined,\n preventDefault: () => undefined,\n ctrlKey: false,\n key: \"Delete\",\n keyCode: 46,\n metaKey: false,\n shiftKey: false,\n altKey: false,\n rawEvent: undefined,\n location: undefined,\n });\n break;\n case \"fill-right\":\n onKeyDown({\n bounds: undefined,\n cancel: () => undefined,\n stopPropagation: () => undefined,\n preventDefault: () => undefined,\n ctrlKey: true,\n key: \"r\",\n keyCode: 82,\n metaKey: false,\n shiftKey: false,\n altKey: false,\n rawEvent: undefined,\n location: undefined,\n });\n break;\n case \"fill-down\":\n onKeyDown({\n bounds: undefined,\n cancel: () => undefined,\n stopPropagation: () => undefined,\n preventDefault: () => undefined,\n ctrlKey: true,\n key: \"d\",\n keyCode: 68,\n metaKey: false,\n shiftKey: false,\n altKey: false,\n rawEvent: undefined,\n location: undefined,\n });\n break;\n case \"copy\":\n await onCopy(undefined, true);\n break;\n case \"paste\":\n await onPasteInternal();\n break;\n }\n },\n scrollTo,\n remeasureColumns: cols => {\n for (const col of cols) {\n void normalSizeColumn(col + rowMarkerOffset);\n }\n },\n }), [appendRow, normalSizeColumn, onCopy, onKeyDown, onPasteInternal, rowMarkerOffset, scrollTo]);\n const [selCol, selRow] = currentCell ?? [];\n const onCellFocused = React.useCallback((cell) => {\n const [col, row] = cell;\n if (row === -1) {\n if (columnSelect !== \"none\") {\n setSelectedColumns(CompactSelection.fromSingleSelection(col), undefined, false);\n focus();\n }\n return;\n }\n if (selCol === col && selRow === row)\n return;\n setCurrent({\n cell,\n range: { x: col, y: row, width: 1, height: 1 },\n }, true, false, \"keyboard-nav\");\n scrollTo(col, row);\n }, [columnSelect, focus, scrollTo, selCol, selRow, setCurrent, setSelectedColumns]);\n const [isFocused, setIsFocused] = React.useState(false);\n const setIsFocusedDebounced = React.useRef(debounce((val) => {\n setIsFocused(val);\n }, 5));\n const onCanvasFocused = React.useCallback(() => {\n setIsFocusedDebounced.current(true);\n // check for mouse state, don't do anything if the user is clicked to focus.\n if (gridSelection.current === undefined &&\n gridSelection.columns.length === 0 &&\n gridSelection.rows.length === 0 &&\n mouseState === undefined) {\n setCurrent({\n cell: [rowMarkerOffset, cellYOffset],\n range: {\n x: rowMarkerOffset,\n y: cellYOffset,\n width: 1,\n height: 1,\n },\n }, true, false, \"keyboard-select\");\n }\n }, [cellYOffset, gridSelection, mouseState, rowMarkerOffset, setCurrent]);\n const onFocusOut = React.useCallback(() => {\n setIsFocusedDebounced.current(false);\n }, []);\n const [idealWidth, idealHeight] = React.useMemo(() => {\n let h;\n const scrollbarWidth = experimental?.scrollbarWidthOverride ?? getScrollBarWidth();\n const rowsCountWithTrailingRow = rows + (showTrailingBlankRow ? 1 : 0);\n if (typeof rowHeight === \"number\") {\n h = totalHeaderHeight + rowsCountWithTrailingRow * rowHeight;\n }\n else {\n let avg = 0;\n const toAverage = Math.min(rowsCountWithTrailingRow, 10);\n for (let i = 0; i < toAverage; i++) {\n avg += rowHeight(i);\n }\n avg = Math.floor(avg / toAverage);\n h = totalHeaderHeight + rowsCountWithTrailingRow * avg;\n }\n h += scrollbarWidth;\n const w = mangledCols.reduce((acc, x) => x.width + acc, 0) + scrollbarWidth;\n // We need to set a reasonable cap here as some browsers will just ignore huge values\n // rather than treat them as huge values.\n return [`${Math.min(100000, w)}px`, `${Math.min(100000, h)}px`];\n }, [mangledCols, experimental?.scrollbarWidthOverride, rowHeight, rows, showTrailingBlankRow, totalHeaderHeight]);\n const cssStyle = React.useMemo(() => {\n return makeCSSStyle(mergedTheme);\n }, [mergedTheme]);\n return (React.createElement(ThemeContext.Provider, { value: mergedTheme },\n React.createElement(DataEditorContainer, { style: cssStyle, className: className, inWidth: width ?? idealWidth, inHeight: height ?? idealHeight },\n React.createElement(DataGridSearch, { fillHandle: fillHandle, drawFocusRing: drawFocusRing, experimental: experimental, fixedShadowX: fixedShadowX, fixedShadowY: fixedShadowY, getRowThemeOverride: getRowThemeOverride, headerIcons: headerIcons, imageWindowLoader: imageWindowLoader, initialSize: initialSize, isDraggable: isDraggable, onDragLeave: onDragLeave, onRowMoved: onRowMoved, overscrollX: overscrollX, overscrollY: overscrollY, preventDiagonalScrolling: preventDiagonalScrolling, rightElement: rightElement, rightElementProps: rightElementProps, smoothScrollX: smoothScrollX, smoothScrollY: smoothScrollY, className: className, enableGroups: enableGroups, onCanvasFocused: onCanvasFocused, onCanvasBlur: onFocusOut, canvasRef: canvasRef, onContextMenu: onContextMenu, theme: mergedTheme, cellXOffset: cellXOffset, cellYOffset: cellYOffset, accessibilityHeight: visibleRegion.height, onDragEnd: onDragEnd, columns: mangledCols, nonGrowWidth: nonGrowWidth, drawHeader: drawHeader, onColumnProposeMove: onColumnProposeMove, drawCell: drawCell, disabledRows: disabledRows, freezeColumns: mangledFreezeColumns, lockColumns: rowMarkerOffset, firstColAccessible: rowMarkerOffset === 0, getCellContent: getMangledCellContent, minColumnWidth: minColumnWidth, maxColumnWidth: maxColumnWidth, searchInputRef: searchInputRef, showSearch: showSearch, onSearchClose: onSearchClose, highlightRegions: highlightRegions, getCellsForSelection: getCellsForSelection, getGroupDetails: mangledGetGroupDetails, headerHeight: headerHeight, isFocused: isFocused, groupHeaderHeight: enableGroups ? groupHeaderHeight : 0, freezeTrailingRows: freezeTrailingRows + (showTrailingBlankRow && trailingRowOptions?.sticky === true ? 1 : 0), hasAppendRow: showTrailingBlankRow, onColumnResize: onColumnResize, onColumnResizeEnd: onColumnResizeEnd, onColumnResizeStart: onColumnResizeStart, onCellFocused: onCellFocused, onColumnMoved: onColumnMovedImpl, onDragStart: onDragStartImpl, onHeaderMenuClick: onHeaderMenuClickInner, onItemHovered: onItemHoveredImpl, isFilling: mouseState?.fillHandle === true, onMouseMove: onMouseMoveImpl, onKeyDown: onKeyDown, onKeyUp: onKeyUpIn, onMouseDown: onMouseDown, onMouseUp: onMouseUp, onDragOverCell: onDragOverCell, onDrop: onDrop, onSearchResultsChanged: onSearchResultsChanged, onVisibleRegionChanged: onVisibleRegionChangedImpl, clientSize: clientSize, rowHeight: rowHeight, searchResults: searchResults, searchValue: searchValue, onSearchValueChange: onSearchValueChange, rows: mangledRows, scrollRef: scrollRef, selection: gridSelection, translateX: visibleRegion.tx, translateY: visibleRegion.ty, verticalBorder: mangledVerticalBorder, gridRef: gridRef, getCellRenderer: getCellRenderer }),\n renameGroupNode,\n overlay !== undefined && (React.createElement(React.Suspense, { fallback: null },\n React.createElement(DataGridOverlayEditor, { ...overlay, validateCell: validateCell, bloom: editorBloom, id: overlayID, getCellRenderer: getCellRenderer, className: experimental?.isSubGrid === true ? \"click-outside-ignore\" : undefined, provideEditor: provideEditor, imageEditorOverride: imageEditorOverride, onFinishEditing: onFinishEditing, markdownDivCreateNode: markdownDivCreateNode, isOutsideClick: isOutsideClick }))))));\n};\n/**\n * The primary component of Glide Data Grid.\n * @category DataEditor\n * @param {DataEditorProps} props\n */\nexport const DataEditor = React.forwardRef(DataEditorImpl);\n//# sourceMappingURL=data-editor.js.map","import { getSquareWidth, getSquareXPosFromAlign, getSquareBB, pointIsWithinBB } from \"../common/utils.js\";\nimport { toggleBoolean } from \"../data-editor/data-editor-fns.js\";\nimport { GridCellKind, booleanCellIsEditable, BooleanEmpty, BooleanIndeterminate, } from \"../internal/data-grid/data-grid-types.js\";\nimport { drawCheckbox } from \"../internal/data-grid/render/draw-checkbox.js\";\nconst defaultCellMaxSize = 20;\nexport const booleanCellRenderer = {\n getAccessibilityString: c => c.data?.toString() ?? \"false\",\n kind: GridCellKind.Boolean,\n needsHover: true,\n useLabel: false,\n needsHoverPosition: true,\n measure: () => 50,\n draw: a => drawBoolean(a, a.cell.data, booleanCellIsEditable(a.cell), a.cell.maxSize ?? defaultCellMaxSize),\n onDelete: c => ({\n ...c,\n data: false,\n }),\n onClick: e => {\n const { cell, posX: pointerX, posY: pointerY, bounds, theme } = e;\n const { width, height, x: cellX, y: cellY } = bounds;\n const maxWidth = cell.maxSize ?? defaultCellMaxSize;\n const cellCenterY = Math.floor(bounds.y + height / 2);\n const checkBoxWidth = getSquareWidth(maxWidth, height, theme.cellVerticalPadding);\n const posX = getSquareXPosFromAlign(cell.contentAlign ?? \"center\", cellX, width, theme.cellHorizontalPadding, checkBoxWidth);\n const bb = getSquareBB(posX, cellCenterY, checkBoxWidth);\n const checkBoxClicked = pointIsWithinBB(cellX + pointerX, cellY + pointerY, bb);\n if (booleanCellIsEditable(cell) && checkBoxClicked) {\n return {\n ...cell,\n data: toggleBoolean(cell.data),\n };\n }\n return undefined;\n },\n onPaste: (toPaste, cell) => {\n let newVal = BooleanEmpty;\n if (toPaste.toLowerCase() === \"true\") {\n newVal = true;\n }\n else if (toPaste.toLowerCase() === \"false\") {\n newVal = false;\n }\n else if (toPaste.toLowerCase() === \"indeterminate\") {\n newVal = BooleanIndeterminate;\n }\n return newVal === cell.data\n ? undefined\n : {\n ...cell,\n data: newVal,\n };\n },\n};\nfunction drawBoolean(args, data, canEdit, maxSize) {\n if (!canEdit && data === BooleanEmpty) {\n return;\n }\n const { ctx, hoverAmount, theme, rect, highlighted, hoverX, hoverY, cell: { contentAlign }, } = args;\n const { x, y, width: w, height: h } = rect;\n const hoverEffect = 0.35;\n let alpha = canEdit ? 1 - hoverEffect + hoverEffect * hoverAmount : 0.4;\n if (data === BooleanEmpty) {\n alpha *= hoverAmount;\n }\n if (alpha === 0) {\n return;\n }\n ctx.globalAlpha = alpha;\n drawCheckbox(ctx, theme, data, x, y, w, h, highlighted, hoverX, hoverY, maxSize, contentAlign);\n ctx.globalAlpha = 1;\n}\n//# sourceMappingURL=boolean-cell.js.map","import { styled } from \"@linaria/react\";\nexport const BubblesOverlayEditorStyle = /*#__PURE__*/styled('div')({\n name: \"BubblesOverlayEditorStyle\",\n class: \"gdg-b1ygi5by\",\n propsAsIs: false\n});\n\n","import * as React from \"react\";\nimport { BubblesOverlayEditorStyle } from \"./bubbles-overlay-editor-style.js\";\nconst BubblesOverlayEditor = p => {\n const { bubbles } = p;\n return (React.createElement(BubblesOverlayEditorStyle, null,\n bubbles.map((b, i) => (React.createElement(\"div\", { key: i, className: \"boe-bubble\" }, b))),\n React.createElement(\"textarea\", { className: \"gdg-input\", autoFocus: true })));\n};\nexport default BubblesOverlayEditor;\n//# sourceMappingURL=bubbles-overlay-editor.js.map","/* eslint-disable react/display-name */\nimport * as React from \"react\";\nimport BubblesOverlayEditor from \"../internal/data-grid-overlay-editor/private/bubbles-overlay-editor.js\";\nimport { getMiddleCenterBias, measureTextCached, roundedRect } from \"../internal/data-grid/render/data-grid-lib.js\";\nimport { GridCellKind } from \"../internal/data-grid/data-grid-types.js\";\nimport { makeAccessibilityStringForArray } from \"../common/utils.js\";\nexport const bubbleCellRenderer = {\n getAccessibilityString: c => makeAccessibilityStringForArray(c.data),\n kind: GridCellKind.Bubble,\n needsHover: false,\n useLabel: false,\n needsHoverPosition: false,\n measure: (ctx, cell, t) => cell.data.reduce((acc, data) => ctx.measureText(data).width + acc + 20, 0) + 2 * t.cellHorizontalPadding - 4,\n draw: a => drawBubbles(a, a.cell.data),\n provideEditor: () => p => {\n const { value } = p;\n return React.createElement(BubblesOverlayEditor, { bubbles: value.data });\n },\n onPaste: () => undefined,\n};\nconst itemMargin = 4;\nfunction drawBubbles(args, data) {\n const { rect, theme, ctx, highlighted } = args;\n const { x, y, width: w, height: h } = rect;\n const bubbleHeight = 20;\n const bubblePad = 8;\n const bubbleMargin = itemMargin;\n let renderX = x + theme.cellHorizontalPadding;\n const renderBoxes = [];\n for (const s of data) {\n if (renderX > x + w)\n break;\n const textWidth = measureTextCached(s, ctx, theme.baseFontFull).width;\n renderBoxes.push({\n x: renderX,\n width: textWidth,\n });\n renderX += textWidth + bubblePad * 2 + bubbleMargin;\n }\n ctx.beginPath();\n for (const rectInfo of renderBoxes) {\n roundedRect(ctx, rectInfo.x, y + (h - bubbleHeight) / 2, rectInfo.width + bubblePad * 2, bubbleHeight, theme.roundingRadius ?? bubbleHeight / 2);\n }\n ctx.fillStyle = highlighted ? theme.bgBubbleSelected : theme.bgBubble;\n ctx.fill();\n for (const [i, rectInfo] of renderBoxes.entries()) {\n ctx.beginPath();\n ctx.fillStyle = theme.textBubble;\n ctx.fillText(data[i], rectInfo.x + bubblePad, y + h / 2 + getMiddleCenterBias(ctx, theme));\n }\n}\n//# sourceMappingURL=bubble-cell.js.map","import * as React from \"react\";\nimport { styled } from \"@linaria/react\";\nconst DrilldownOverlayEditorStyle = /*#__PURE__*/styled('div')({\n name: \"DrilldownOverlayEditorStyle\",\n class: \"gdg-d4zsq0x\",\n propsAsIs: false\n});\nconst DrilldownOverlayEditor = p => {\n const {\n drilldowns\n } = p;\n return React.createElement(DrilldownOverlayEditorStyle, null, drilldowns.map((d, i) => React.createElement(\"div\", {\n key: i,\n className: \"doe-bubble\"\n }, d.img !== undefined && React.createElement(\"img\", {\n src: d.img\n }), React.createElement(\"div\", null, d.text))));\n};\nexport default DrilldownOverlayEditor;\n\n","/* eslint-disable react/display-name */\nimport * as React from \"react\";\nimport DrilldownOverlayEditor from \"../internal/data-grid-overlay-editor/private/drilldown-overlay-editor.js\";\nimport { getEmHeight, getMiddleCenterBias, measureTextCached, roundedRect, } from \"../internal/data-grid/render/data-grid-lib.js\";\nimport { GridCellKind } from \"../internal/data-grid/data-grid-types.js\";\nimport { makeAccessibilityStringForArray } from \"../common/utils.js\";\nexport const drilldownCellRenderer = {\n getAccessibilityString: c => makeAccessibilityStringForArray(c.data.map(d => d.text)),\n kind: GridCellKind.Drilldown,\n needsHover: false,\n useLabel: false,\n needsHoverPosition: false,\n measure: (ctx, cell, t) => cell.data.reduce((acc, data) => ctx.measureText(data.text).width + acc + 20 + (data.img !== undefined ? 18 : 0), 0) +\n 2 * t.cellHorizontalPadding -\n 4,\n draw: a => drawDrilldownCell(a, a.cell.data),\n provideEditor: () => p => {\n const { value } = p;\n return React.createElement(DrilldownOverlayEditor, { drilldowns: value.data });\n },\n onPaste: () => undefined,\n};\nconst itemMargin = 4;\nconst drilldownCache = {};\nfunction getAndCacheDrilldownBorder(bgCell, border, height, rounding) {\n const dpr = Math.ceil(window.devicePixelRatio);\n const shadowBlur = 5;\n const targetHeight = height - shadowBlur * 2;\n const middleWidth = 4;\n const innerHeight = height * dpr;\n const sideWidth = rounding + shadowBlur;\n const targetWidth = rounding * 3;\n const innerWidth = (targetWidth + shadowBlur * 2) * dpr;\n const key = `${bgCell},${border},${dpr},${height}`;\n if (drilldownCache[key] !== undefined) {\n return {\n el: drilldownCache[key],\n height: innerHeight,\n width: innerWidth,\n middleWidth: middleWidth * dpr,\n sideWidth: sideWidth * dpr,\n padding: shadowBlur * dpr,\n dpr,\n };\n }\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\"); // alpha needed\n if (ctx === null)\n return null;\n canvas.width = innerWidth;\n canvas.height = innerHeight;\n ctx.scale(dpr, dpr);\n drilldownCache[key] = canvas;\n ctx.beginPath();\n roundedRect(ctx, shadowBlur, shadowBlur, targetWidth, targetHeight, rounding);\n ctx.shadowColor = \"rgba(24, 25, 34, 0.4)\";\n ctx.shadowBlur = 1;\n ctx.fillStyle = bgCell;\n ctx.fill();\n ctx.shadowColor = \"rgba(24, 25, 34, 0.3)\";\n ctx.shadowOffsetY = 1;\n ctx.shadowBlur = 5;\n ctx.fillStyle = bgCell;\n ctx.fill();\n ctx.shadowOffsetY = 0;\n ctx.shadowBlur = 0;\n ctx.shadowBlur = 0;\n ctx.beginPath();\n roundedRect(ctx, shadowBlur + 0.5, shadowBlur + 0.5, targetWidth, targetHeight, rounding);\n ctx.strokeStyle = border;\n ctx.lineWidth = 1;\n ctx.stroke();\n return {\n el: canvas,\n height: innerHeight,\n width: innerWidth,\n sideWidth: sideWidth * dpr,\n middleWidth: rounding * dpr,\n padding: shadowBlur * dpr,\n dpr,\n };\n}\nfunction drawDrilldownCell(args, data) {\n const { rect, theme, ctx, imageLoader, col, row } = args;\n const { x, width: w } = rect;\n const font = theme.baseFontFull;\n const emHeight = getEmHeight(ctx, font);\n const h = Math.min(rect.height, Math.max(16, Math.ceil(emHeight * theme.lineHeight) * 2));\n const y = Math.floor(rect.y + (rect.height - h) / 2);\n const bubbleHeight = h - 10;\n const bubblePad = 8;\n const bubbleMargin = itemMargin;\n let renderX = x + theme.cellHorizontalPadding;\n const rounding = theme.roundingRadius ?? 6;\n const tileMap = getAndCacheDrilldownBorder(theme.bgCell, theme.drilldownBorder, h, rounding);\n const renderBoxes = [];\n for (const el of data) {\n if (renderX > x + w)\n break;\n const textMetrics = measureTextCached(el.text, ctx, font);\n const textWidth = textMetrics.width;\n let imgWidth = 0;\n if (el.img !== undefined) {\n const img = imageLoader.loadOrGetImage(el.img, col, row);\n if (img !== undefined) {\n imgWidth = bubbleHeight - 8 + 4;\n }\n }\n const renderWidth = textWidth + imgWidth + bubblePad * 2;\n renderBoxes.push({\n x: renderX,\n width: renderWidth,\n });\n renderX += renderWidth + bubbleMargin;\n }\n if (tileMap !== null) {\n const { el, height, middleWidth, sideWidth, width, dpr, padding } = tileMap;\n const outerSideWidth = sideWidth / dpr;\n const outerPadding = padding / dpr;\n for (const rectInfo of renderBoxes) {\n const rx = Math.floor(rectInfo.x);\n const rw = Math.floor(rectInfo.width);\n const outerMiddleWidth = rw - (outerSideWidth - outerPadding) * 2;\n ctx.imageSmoothingEnabled = false;\n ctx.drawImage(el, 0, 0, sideWidth, height, rx - outerPadding, y, outerSideWidth, h);\n if (outerMiddleWidth > 0)\n ctx.drawImage(el, sideWidth, 0, middleWidth, height, rx + (outerSideWidth - outerPadding), y, outerMiddleWidth, h);\n ctx.drawImage(el, width - sideWidth, 0, sideWidth, height, rx + rw - (outerSideWidth - outerPadding), y, outerSideWidth, h);\n ctx.imageSmoothingEnabled = true;\n }\n }\n ctx.beginPath();\n for (const [i, rectInfo] of renderBoxes.entries()) {\n const d = data[i];\n let drawX = rectInfo.x + bubblePad;\n if (d.img !== undefined) {\n const img = imageLoader.loadOrGetImage(d.img, col, row);\n if (img !== undefined) {\n const imgSize = bubbleHeight - 8;\n let srcX = 0;\n let srcY = 0;\n let srcWidth = img.width;\n let srcHeight = img.height;\n if (srcWidth > srcHeight) {\n // landscape\n srcX += (srcWidth - srcHeight) / 2;\n srcWidth = srcHeight;\n }\n else if (srcHeight > srcWidth) {\n //portrait\n srcY += (srcHeight - srcWidth) / 2;\n srcHeight = srcWidth;\n }\n ctx.beginPath();\n roundedRect(ctx, drawX, y + h / 2 - imgSize / 2, imgSize, imgSize, theme.roundingRadius ?? 3);\n ctx.save();\n ctx.clip();\n ctx.drawImage(img, srcX, srcY, srcWidth, srcHeight, drawX, y + h / 2 - imgSize / 2, imgSize, imgSize);\n ctx.restore();\n drawX += imgSize + 4;\n }\n }\n ctx.beginPath();\n ctx.fillStyle = theme.textBubble;\n ctx.fillText(d.text, drawX, y + h / 2 + getMiddleCenterBias(ctx, theme));\n }\n}\n//# sourceMappingURL=drilldown-cell.js.map","/* eslint-disable react/display-name */\nimport * as React from \"react\";\nimport { ImageOverlayEditor } from \"../internal/data-grid-overlay-editor/private/image-overlay-editor.js\";\nimport { roundedRect } from \"../internal/data-grid/render/data-grid-lib.js\";\nimport { GridCellKind } from \"../internal/data-grid/data-grid-types.js\";\nexport const imageCellRenderer = {\n getAccessibilityString: c => c.data.join(\", \"),\n kind: GridCellKind.Image,\n needsHover: false,\n useLabel: false,\n needsHoverPosition: false,\n draw: a => drawImage(a, a.cell.displayData ?? a.cell.data, a.cell.rounding ?? a.theme.roundingRadius ?? 4, a.cell.contentAlign),\n measure: (_ctx, cell) => cell.data.length * 50,\n onDelete: c => ({\n ...c,\n data: [],\n }),\n provideEditor: () => p => {\n const { value, onFinishedEditing, imageEditorOverride } = p;\n const ImageEditor = imageEditorOverride ?? ImageOverlayEditor;\n return (React.createElement(ImageEditor, { urls: value.data, canWrite: value.readonly !== false, onCancel: onFinishedEditing, onChange: newImage => {\n onFinishedEditing({\n ...value,\n data: [newImage],\n });\n } }));\n },\n onPaste: (toPaste, cell) => {\n toPaste = toPaste.trim();\n const fragments = toPaste.split(\",\");\n const uris = fragments\n .map(f => {\n try {\n new URL(f);\n return f;\n }\n catch {\n return undefined;\n }\n })\n .filter(x => x !== undefined);\n if (uris.length === cell.data.length && uris.every((u, i) => u === cell.data[i]))\n return undefined;\n return {\n ...cell,\n data: uris,\n };\n },\n};\nconst itemMargin = 4;\nexport function drawImage(args, data, rounding, contentAlign) {\n const { rect, col, row, theme, ctx, imageLoader } = args;\n const { x, y, height: h, width: w } = rect;\n const imgHeight = h - theme.cellVerticalPadding * 2;\n const images = [];\n let totalWidth = 0;\n // eslint-disable-next-line unicorn/no-for-loop\n for (let index = 0; index < data.length; index++) {\n const i = data[index];\n if (i.length === 0)\n continue;\n const img = imageLoader.loadOrGetImage(i, col, row);\n if (img !== undefined) {\n images[index] = img;\n const imgWidth = img.width * (imgHeight / img.height);\n totalWidth += imgWidth + itemMargin;\n }\n }\n if (totalWidth === 0)\n return;\n totalWidth -= itemMargin;\n let drawX = x + theme.cellHorizontalPadding;\n if (contentAlign === \"right\")\n drawX = Math.floor(x + w - theme.cellHorizontalPadding - totalWidth);\n else if (contentAlign === \"center\")\n drawX = Math.floor(x + w / 2 - totalWidth / 2);\n for (const img of images) {\n if (img === undefined)\n continue; //array is sparse\n const imgWidth = img.width * (imgHeight / img.height);\n if (rounding > 0) {\n ctx.beginPath();\n roundedRect(ctx, drawX, y + theme.cellVerticalPadding, imgWidth, imgHeight, rounding);\n ctx.save();\n ctx.clip();\n }\n ctx.drawImage(img, drawX, y + theme.cellVerticalPadding, imgWidth, imgHeight);\n if (rounding > 0) {\n ctx.restore();\n }\n drawX += imgWidth + itemMargin;\n }\n}\n//# sourceMappingURL=image-cell.js.map","import { withAlpha } from \"../internal/data-grid/color-parser.js\";\nimport { roundedRect } from \"../internal/data-grid/render/data-grid-lib.js\";\nimport { GridCellKind } from \"../internal/data-grid/data-grid-types.js\";\n// returns a \"random\" number between -1 and 1\nfunction getRandomNumber(x, y) {\n let seed = x * 49632 + y * 325176;\n // Inline Xorshift algorithm\n seed ^= seed << 13;\n seed ^= seed >> 17;\n seed ^= seed << 5;\n // eslint-disable-next-line unicorn/number-literal-case\n return (seed / 4294967295) * 2;\n}\nexport const loadingCellRenderer = {\n getAccessibilityString: () => \"\",\n kind: GridCellKind.Loading,\n needsHover: false,\n useLabel: false,\n needsHoverPosition: false,\n measure: () => 120,\n draw: a => {\n const { cell, col, row, ctx, rect, theme } = a;\n if (cell.skeletonWidth === undefined || cell.skeletonWidth === 0) {\n return;\n }\n let width = cell.skeletonWidth;\n if (cell.skeletonWidthVariability !== undefined && cell.skeletonWidthVariability > 0) {\n width += Math.round(getRandomNumber(col, row) * cell.skeletonWidthVariability);\n }\n const hpad = theme.cellHorizontalPadding;\n const rectHeight = cell.skeletonHeight ?? Math.min(18, rect.height - 2 * theme.cellVerticalPadding);\n roundedRect(ctx, rect.x + hpad, rect.y + (rect.height - rectHeight) / 2, width, rectHeight, theme.roundingRadius ?? 3);\n ctx.fillStyle = withAlpha(theme.textDark, 0.1);\n ctx.fill();\n },\n onPaste: () => undefined,\n};\n//# sourceMappingURL=loading-cell.js.map","import { styled } from \"@linaria/react\";\nconst _exp = /*#__PURE__*/() => p => p.targetWidth;\nexport const MarkdownOverlayEditorStyle = /*#__PURE__*/styled('div')({\n name: \"MarkdownOverlayEditorStyle\",\n class: \"gdg-m1pnx84e\",\n propsAsIs: false,\n vars: {\n \"m1pnx84e-0\": [_exp(), \"px\"]\n }\n});\n\n","import * as React from \"react\";\nimport MarkdownDiv from \"../../markdown-div/markdown-div.js\";\nimport { GrowingEntry } from \"../../growing-entry/growing-entry.js\";\nimport { MarkdownOverlayEditorStyle } from \"./markdown-overlay-editor-style.js\";\nimport { EditPencil, Checkmark } from \"../../../common/utils.js\";\nexport const MarkdownOverlayEditor = p => {\n const { value, onChange, forceEditMode, createNode, targetRect, onFinish, validatedSelection } = p;\n const markdown = value.data;\n const readonly = value.readonly === true;\n const [editMode, setEditMode] = React.useState(markdown === \"\" || forceEditMode);\n const onEditClick = React.useCallback(() => {\n setEditMode(e => !e);\n }, []);\n const addLeftPad = markdown ? \"gdg-ml-6\" : \"\";\n if (editMode) {\n return (React.createElement(MarkdownOverlayEditorStyle, { targetWidth: targetRect.width - 20 },\n React.createElement(GrowingEntry, { autoFocus: true, highlight: false, validatedSelection: validatedSelection, value: markdown, onKeyDown: e => {\n if (e.key === \"Enter\")\n e.stopPropagation();\n }, onChange: onChange }),\n React.createElement(\"div\", { className: `gdg-edit-icon gdg-checkmark-hover ${addLeftPad}`, onClick: () => onFinish(value) },\n React.createElement(Checkmark, null))));\n }\n return (React.createElement(MarkdownOverlayEditorStyle, { targetWidth: targetRect.width },\n React.createElement(MarkdownDiv, { contents: markdown, createNode: createNode }),\n !readonly && (React.createElement(React.Fragment, null,\n React.createElement(\"div\", { className: \"spacer\" }),\n React.createElement(\"div\", { className: `gdg-edit-icon gdg-edit-hover ${addLeftPad}`, onClick: onEditClick },\n React.createElement(EditPencil, null)))),\n React.createElement(\"textarea\", { className: \"gdg-md-edit-textarea gdg-input\", autoFocus: true })));\n};\n//# sourceMappingURL=markdown-overlay-editor.js.map","/* eslint-disable react/display-name */\nimport * as React from \"react\";\nimport { MarkdownOverlayEditor } from \"../internal/data-grid-overlay-editor/private/markdown-overlay-editor.js\";\nimport { drawTextCell, prepTextCell } from \"../internal/data-grid/render/data-grid-lib.js\";\nimport { GridCellKind } from \"../internal/data-grid/data-grid-types.js\";\nexport const markdownCellRenderer = {\n getAccessibilityString: c => c.data?.toString() ?? \"\",\n kind: GridCellKind.Markdown,\n needsHover: false,\n needsHoverPosition: false,\n drawPrep: prepTextCell,\n measure: (ctx, cell, t) => {\n const firstLine = cell.data.split(\"\\n\")[0];\n return ctx.measureText(firstLine).width + 2 * t.cellHorizontalPadding;\n },\n draw: a => drawTextCell(a, a.cell.data, a.cell.contentAlign),\n onDelete: c => ({\n ...c,\n data: \"\",\n }),\n provideEditor: () => p => {\n const { onChange, value, target, onFinishedEditing, markdownDivCreateNode, forceEditMode, validatedSelection } = p;\n return (React.createElement(MarkdownOverlayEditor, { onFinish: onFinishedEditing, targetRect: target, value: value, validatedSelection: validatedSelection, onChange: e => onChange({\n ...value,\n data: e.target.value,\n }), forceEditMode: forceEditMode, createNode: markdownDivCreateNode }));\n },\n onPaste: (toPaste, cell) => (toPaste === cell.data ? undefined : { ...cell, data: toPaste }),\n};\n//# sourceMappingURL=markdown-cell.js.map","import { getMiddleCenterBias } from \"../internal/data-grid/render/data-grid-lib.js\";\nimport { InnerGridCellKind } from \"../internal/data-grid/data-grid-types.js\";\nimport { drawCheckbox } from \"../internal/data-grid/render/draw-checkbox.js\";\nexport const markerCellRenderer = {\n getAccessibilityString: c => c.row.toString(),\n kind: InnerGridCellKind.Marker,\n needsHover: true,\n needsHoverPosition: false,\n drawPrep: prepMarkerRowCell,\n measure: () => 44,\n draw: a => drawMarkerRowCell(a, a.cell.row, a.cell.checked, a.cell.markerKind, a.cell.drawHandle, a.cell.checkboxStyle),\n onClick: e => {\n const { bounds, cell, posX: x, posY: y } = e;\n const { width, height } = bounds;\n const centerX = cell.drawHandle ? 7 + (width - 7) / 2 : width / 2;\n const centerY = height / 2;\n if (Math.abs(x - centerX) <= 10 && Math.abs(y - centerY) <= 10) {\n return {\n ...cell,\n checked: !cell.checked,\n };\n }\n return undefined;\n },\n onPaste: () => undefined,\n};\nfunction prepMarkerRowCell(args, lastPrep) {\n const { ctx, theme } = args;\n const newFont = theme.markerFontFull;\n const result = lastPrep ?? {};\n if (result?.font !== newFont) {\n ctx.font = newFont;\n result.font = newFont;\n }\n result.deprep = deprepMarkerRowCell;\n ctx.textAlign = \"center\";\n return result;\n}\nfunction deprepMarkerRowCell(args) {\n const { ctx } = args;\n ctx.textAlign = \"start\";\n}\nfunction drawMarkerRowCell(args, index, checked, markerKind, drawHandle, style) {\n const { ctx, rect, hoverAmount, theme } = args;\n const { x, y, width, height } = rect;\n const checkedboxAlpha = checked ? 1 : markerKind === \"checkbox-visible\" ? 0.6 + 0.4 * hoverAmount : hoverAmount;\n if (markerKind !== \"number\" && checkedboxAlpha > 0) {\n ctx.globalAlpha = checkedboxAlpha;\n const offsetAmount = 7 * (checked ? hoverAmount : 1);\n drawCheckbox(ctx, theme, checked, drawHandle ? x + offsetAmount : x, y, drawHandle ? width - offsetAmount : width, height, true, undefined, undefined, 18, \"center\", style);\n if (drawHandle) {\n ctx.globalAlpha = hoverAmount;\n ctx.beginPath();\n for (const xOffset of [3, 6]) {\n for (const yOffset of [-5, -1, 3]) {\n ctx.rect(x + xOffset, y + height / 2 + yOffset, 2, 2);\n }\n }\n ctx.fillStyle = theme.textLight;\n ctx.fill();\n ctx.beginPath();\n }\n ctx.globalAlpha = 1;\n }\n if (markerKind === \"number\" || (markerKind === \"both\" && !checked)) {\n const text = index.toString();\n const fontStyle = theme.markerFontFull;\n const start = x + width / 2;\n if (markerKind === \"both\" && hoverAmount !== 0) {\n ctx.globalAlpha = 1 - hoverAmount;\n }\n ctx.fillStyle = theme.textLight;\n ctx.font = fontStyle;\n ctx.fillText(text, start, y + height / 2 + getMiddleCenterBias(ctx, fontStyle));\n if (hoverAmount !== 0) {\n ctx.globalAlpha = 1;\n }\n }\n}\n//# sourceMappingURL=marker-cell.js.map","import { getMiddleCenterBias } from \"../internal/data-grid/render/data-grid-lib.js\";\nimport { InnerGridCellKind } from \"../internal/data-grid/data-grid-types.js\";\nexport const newRowCellRenderer = {\n getAccessibilityString: () => \"\",\n kind: InnerGridCellKind.NewRow,\n needsHover: true,\n needsHoverPosition: false,\n measure: () => 200,\n draw: a => drawNewRowCell(a, a.cell.hint, a.cell.icon),\n onPaste: () => undefined,\n};\nfunction drawNewRowCell(args, data, icon) {\n const { ctx, rect, hoverAmount, theme, spriteManager } = args;\n const { x, y, width: w, height: h } = rect;\n ctx.beginPath();\n ctx.globalAlpha = hoverAmount;\n ctx.rect(x + 1, y + 1, w, h - 2);\n ctx.fillStyle = theme.bgHeaderHovered;\n ctx.fill();\n ctx.globalAlpha = 1;\n ctx.beginPath();\n const alwaysShowIcon = data !== \"\";\n let textX = 0;\n if (icon !== undefined) {\n const padding = 8;\n const size = h - padding;\n const px = x + padding / 2;\n const py = y + padding / 2;\n spriteManager.drawSprite(icon, \"normal\", ctx, px, py, size, theme, alwaysShowIcon ? 1 : hoverAmount);\n textX = size;\n }\n else {\n textX = 24;\n const finalLineSize = 12;\n const lineSize = alwaysShowIcon ? finalLineSize : hoverAmount * finalLineSize;\n const xTranslate = alwaysShowIcon ? 0 : (1 - hoverAmount) * finalLineSize * 0.5;\n const padPlus = theme.cellHorizontalPadding + 4;\n if (lineSize > 0) {\n ctx.moveTo(x + padPlus + xTranslate, y + h / 2);\n ctx.lineTo(x + padPlus + xTranslate + lineSize, y + h / 2);\n ctx.moveTo(x + padPlus + xTranslate + lineSize * 0.5, y + h / 2 - lineSize * 0.5);\n ctx.lineTo(x + padPlus + xTranslate + lineSize * 0.5, y + h / 2 + lineSize * 0.5);\n ctx.lineWidth = 2;\n ctx.strokeStyle = theme.bgIconHeader;\n ctx.lineCap = \"round\";\n ctx.stroke();\n }\n }\n ctx.fillStyle = theme.textMedium;\n ctx.fillText(data, textX + x + theme.cellHorizontalPadding + 0.5, y + h / 2 + getMiddleCenterBias(ctx, theme));\n ctx.beginPath();\n}\n//# sourceMappingURL=new-row-cell.js.map","/* eslint-disable react/display-name */\nimport * as React from \"react\";\nimport { drawTextCell, prepTextCell } from \"../internal/data-grid/render/data-grid-lib.js\";\nimport { GridCellKind } from \"../internal/data-grid/data-grid-types.js\";\nconst NumberOverlayEditor = React.lazy(async () => await import(\"../internal/data-grid-overlay-editor/private/number-overlay-editor.js\"));\nexport const numberCellRenderer = {\n getAccessibilityString: c => c.data?.toString() ?? \"\",\n kind: GridCellKind.Number,\n needsHover: false,\n needsHoverPosition: false,\n useLabel: true,\n drawPrep: prepTextCell,\n draw: a => drawTextCell(a, a.cell.displayData, a.cell.contentAlign),\n measure: (ctx, cell, theme) => ctx.measureText(cell.displayData).width + theme.cellHorizontalPadding * 2,\n onDelete: c => ({\n ...c,\n data: undefined,\n }),\n provideEditor: () => p => {\n const { isHighlighted, onChange, value, validatedSelection } = p;\n return (React.createElement(React.Suspense, { fallback: null },\n React.createElement(NumberOverlayEditor, { highlight: isHighlighted, disabled: value.readonly === true, value: value.data, fixedDecimals: value.fixedDecimals, allowNegative: value.allowNegative, thousandSeparator: value.thousandSeparator, decimalSeparator: value.decimalSeparator, validatedSelection: validatedSelection, onChange: x => onChange({\n ...value,\n data: Number.isNaN(x.floatValue ?? 0) ? 0 : x.floatValue,\n }) })));\n },\n onPaste: (toPaste, cell, details) => {\n const newNumber = typeof details.rawValue === \"number\"\n ? details.rawValue\n : Number.parseFloat(typeof details.rawValue === \"string\" ? details.rawValue : toPaste);\n if (Number.isNaN(newNumber) || cell.data === newNumber)\n return undefined;\n return { ...cell, data: newNumber, displayData: details.formattedString ?? cell.displayData };\n },\n};\n//# sourceMappingURL=number-cell.js.map","import { degreesToRadians } from \"../common/utils.js\";\nimport { GridCellKind } from \"../internal/data-grid/data-grid-types.js\";\nexport const protectedCellRenderer = {\n getAccessibilityString: () => \"\",\n measure: () => 108,\n kind: GridCellKind.Protected,\n needsHover: false,\n needsHoverPosition: false,\n draw: drawProtectedCell,\n onPaste: () => undefined,\n};\nfunction drawProtectedCell(args) {\n const { ctx, theme, rect } = args;\n const { x, y, height: h } = rect;\n ctx.beginPath();\n const radius = 2.5;\n let xStart = x + theme.cellHorizontalPadding + radius;\n const center = y + h / 2;\n const p = Math.cos(degreesToRadians(30)) * radius;\n const q = Math.sin(degreesToRadians(30)) * radius;\n for (let i = 0; i < 12; i++) {\n ctx.moveTo(xStart, center - radius);\n ctx.lineTo(xStart, center + radius);\n ctx.moveTo(xStart + p, center - q);\n ctx.lineTo(xStart - p, center + q);\n ctx.moveTo(xStart - p, center - q);\n ctx.lineTo(xStart + p, center + q);\n xStart += 8;\n }\n ctx.lineWidth = 1.1;\n ctx.lineCap = \"square\";\n ctx.strokeStyle = theme.textLight;\n ctx.stroke();\n}\n//# sourceMappingURL=protected-cell.js.map","import React from \"react\";\nimport { GrowingEntry } from \"../internal/growing-entry/growing-entry.js\";\nimport { drawTextCell, prepTextCell } from \"../internal/data-grid/render/data-grid-lib.js\";\nimport { GridCellKind } from \"../internal/data-grid/data-grid-types.js\";\nexport const rowIDCellRenderer = {\n getAccessibilityString: c => c.data?.toString() ?? \"\",\n kind: GridCellKind.RowID,\n needsHover: false,\n needsHoverPosition: false,\n drawPrep: (a, b) => prepTextCell(a, b, a.theme.textLight),\n draw: a => drawTextCell(a, a.cell.data, a.cell.contentAlign),\n measure: (ctx, cell, theme) => ctx.measureText(cell.data).width + theme.cellHorizontalPadding * 2,\n // eslint-disable-next-line react/display-name\n provideEditor: () => p => {\n const { isHighlighted, onChange, value, validatedSelection } = p;\n return (React.createElement(GrowingEntry, { highlight: isHighlighted, autoFocus: value.readonly !== true, disabled: value.readonly !== false, value: value.data, validatedSelection: validatedSelection, onChange: e => onChange({\n ...value,\n data: e.target.value,\n }) }));\n },\n onPaste: () => undefined,\n};\n//# sourceMappingURL=row-id-cell.js.map","/* eslint-disable react/display-name */\nimport * as React from \"react\";\nimport { GrowingEntry } from \"../internal/growing-entry/growing-entry.js\";\nimport { drawTextCell, measureTextCached, prepTextCell, roundedRect, } from \"../internal/data-grid/render/data-grid-lib.js\";\nimport { GridCellKind } from \"../internal/data-grid/data-grid-types.js\";\nimport { withAlpha } from \"../internal/data-grid/color-parser.js\";\nexport const textCellRenderer = {\n getAccessibilityString: c => c.data?.toString() ?? \"\",\n kind: GridCellKind.Text,\n needsHover: textCell => textCell.hoverEffect === true,\n needsHoverPosition: false,\n drawPrep: prepTextCell,\n useLabel: true,\n draw: a => {\n const { cell, hoverAmount, hyperWrapping, ctx, rect, theme, overrideCursor } = a;\n const { displayData, contentAlign, hoverEffect, allowWrapping } = cell;\n if (hoverEffect === true && hoverAmount > 0) {\n ctx.textBaseline = \"alphabetic\";\n const padX = theme.cellHorizontalPadding;\n const padY = theme.cellVerticalPadding;\n const m = measureTextCached(displayData, ctx, theme.baseFontFull, \"alphabetic\");\n const maxH = rect.height - padY;\n const h = Math.min(maxH, m.actualBoundingBoxAscent * 2.5);\n ctx.beginPath();\n roundedRect(ctx, rect.x + padX / 2, rect.y + (rect.height - h) / 2 + 1, m.width + padX * 3, h - 1, theme.roundingRadius ?? 4);\n ctx.globalAlpha = hoverAmount;\n ctx.fillStyle = withAlpha(theme.textDark, 0.1);\n ctx.fill();\n // restore\n ctx.globalAlpha = 1;\n ctx.fillStyle = theme.textDark;\n ctx.textBaseline = \"middle\";\n overrideCursor?.(\"text\");\n }\n drawTextCell(a, displayData, contentAlign, allowWrapping, hyperWrapping);\n },\n measure: (ctx, cell, t) => {\n const lines = cell.displayData.split(\"\\n\", cell.allowWrapping === true ? undefined : 1);\n let maxLineWidth = 0;\n for (const line of lines) {\n maxLineWidth = Math.max(maxLineWidth, ctx.measureText(line).width);\n }\n return maxLineWidth + 2 * t.cellHorizontalPadding;\n },\n onDelete: c => ({\n ...c,\n data: \"\",\n }),\n provideEditor: cell => ({\n disablePadding: cell.allowWrapping === true,\n editor: p => {\n const { isHighlighted, onChange, value, validatedSelection } = p;\n return (React.createElement(GrowingEntry, { style: cell.allowWrapping === true ? { padding: \"3px 8.5px\" } : undefined, highlight: isHighlighted, autoFocus: value.readonly !== true, disabled: value.readonly === true, altNewline: true, value: value.data, validatedSelection: validatedSelection, onChange: e => onChange({\n ...value,\n data: e.target.value,\n }) }));\n },\n }),\n onPaste: (toPaste, cell, details) => toPaste === cell.data\n ? undefined\n : { ...cell, data: toPaste, displayData: details.formattedString ?? cell.displayData },\n};\n//# sourceMappingURL=text-cell.js.map","import { styled } from \"@linaria/react\";\nexport const UriOverlayEditorStyle = /*#__PURE__*/styled('div')({\n name: \"UriOverlayEditorStyle\",\n class: \"gdg-u1rrojo\",\n propsAsIs: false\n});\n\n","import { EditPencil } from \"../../../common/utils.js\";\nimport * as React from \"react\";\nimport { GrowingEntry } from \"../../growing-entry/growing-entry.js\";\nimport { UriOverlayEditorStyle } from \"./uri-overlay-editor-style.js\";\nconst UriOverlayEditor = p => {\n const { uri, onChange, forceEditMode, readonly, validatedSelection, preview } = p;\n const [editMode, setEditMode] = React.useState(!readonly && (uri === \"\" || forceEditMode));\n const onEditClick = React.useCallback(() => {\n setEditMode(true);\n }, []);\n if (editMode) {\n return (React.createElement(GrowingEntry, { validatedSelection: validatedSelection, highlight: true, autoFocus: true, value: uri, onChange: onChange }));\n }\n return (React.createElement(UriOverlayEditorStyle, null,\n React.createElement(\"a\", { className: \"gdg-link-area\", href: uri, target: \"_blank\", rel: \"noopener noreferrer\" }, preview),\n !readonly && (React.createElement(\"div\", { className: \"gdg-edit-icon\", onClick: onEditClick },\n React.createElement(EditPencil, null))),\n React.createElement(\"textarea\", { className: \"gdg-input\", autoFocus: true })));\n};\nexport default UriOverlayEditor;\n//# sourceMappingURL=uri-overlay-editor.js.map","/* eslint-disable react/display-name */\nimport * as React from \"react\";\nimport UriOverlayEditor from \"../internal/data-grid-overlay-editor/private/uri-overlay-editor.js\";\nimport { drawTextCell, getMeasuredTextCache, getMiddleCenterBias, measureTextCached, prepTextCell, } from \"../internal/data-grid/render/data-grid-lib.js\";\nimport { GridCellKind, } from \"../internal/data-grid/data-grid-types.js\";\nimport { pointInRect } from \"../common/math.js\";\nfunction getTextRect(metrics, rect, theme, contentAlign) {\n let x = theme.cellHorizontalPadding;\n const y = rect.height / 2 - metrics.actualBoundingBoxAscent / 2;\n const width = metrics.width;\n const height = metrics.actualBoundingBoxAscent;\n if (contentAlign === \"right\") {\n x = rect.width - width - theme.cellHorizontalPadding;\n }\n else if (contentAlign === \"center\") {\n x = rect.width / 2 - width / 2;\n }\n return { x, y, width, height };\n}\nexport const uriCellRenderer = {\n getAccessibilityString: c => c.data?.toString() ?? \"\",\n kind: GridCellKind.Uri,\n needsHover: uriCell => uriCell.hoverEffect === true,\n needsHoverPosition: true,\n useLabel: true,\n drawPrep: prepTextCell,\n draw: a => {\n const { cell, theme, overrideCursor, hoverX, hoverY, rect, ctx } = a;\n const txt = cell.displayData ?? cell.data;\n const isLinky = cell.hoverEffect === true;\n if (overrideCursor !== undefined && isLinky && hoverX !== undefined && hoverY !== undefined) {\n const m = measureTextCached(txt, ctx, theme.baseFontFull);\n const textRect = getTextRect(m, rect, theme, cell.contentAlign);\n const { x, y, width: w, height: h } = textRect;\n // check if hoverX and hoverY inside the box\n if (hoverX >= x - 4 && hoverX <= x - 4 + w + 8 && hoverY >= y - 4 && hoverY <= y - 4 + h + 8) {\n const middleCenterBias = getMiddleCenterBias(ctx, theme.baseFontFull);\n overrideCursor(\"pointer\");\n const underlineOffset = 5;\n const drawY = y - middleCenterBias;\n ctx.beginPath();\n ctx.moveTo(rect.x + x, Math.floor(rect.y + drawY + h + underlineOffset) + 0.5);\n ctx.lineTo(rect.x + x + w, Math.floor(rect.y + drawY + h + underlineOffset) + 0.5);\n ctx.strokeStyle = theme.linkColor;\n ctx.stroke();\n ctx.save();\n ctx.fillStyle = a.cellFillColor;\n drawTextCell({ ...a, rect: { ...rect, x: rect.x - 1 } }, txt, cell.contentAlign);\n drawTextCell({ ...a, rect: { ...rect, x: rect.x - 2 } }, txt, cell.contentAlign);\n drawTextCell({ ...a, rect: { ...rect, x: rect.x + 1 } }, txt, cell.contentAlign);\n drawTextCell({ ...a, rect: { ...rect, x: rect.x + 2 } }, txt, cell.contentAlign);\n ctx.restore();\n }\n }\n ctx.fillStyle = isLinky ? theme.linkColor : theme.textDark;\n drawTextCell(a, txt, cell.contentAlign);\n },\n onClick: a => {\n const { cell, bounds, posX, posY, theme } = a;\n const txt = cell.displayData ?? cell.data;\n if (cell.hoverEffect !== true || cell.onClickUri === undefined)\n return;\n const m = getMeasuredTextCache(txt, theme.baseFontFull);\n if (m === undefined)\n return;\n const textRect = getTextRect(m, bounds, theme, cell.contentAlign);\n const didClick = pointInRect({\n x: textRect.x - 4,\n y: textRect.y - 4,\n width: textRect.width + 8,\n height: textRect.height + 8,\n }, posX, posY);\n if (didClick) {\n cell.onClickUri(a);\n }\n return undefined;\n },\n measure: (ctx, cell, theme) => ctx.measureText(cell.displayData ?? cell.data).width + theme.cellHorizontalPadding * 2,\n onDelete: c => ({\n ...c,\n data: \"\",\n }),\n provideEditor: cell => p => {\n const { onChange, value, forceEditMode, validatedSelection } = p;\n return (React.createElement(UriOverlayEditor, { forceEditMode: value.readonly !== true &&\n (forceEditMode || (cell.hoverEffect === true && cell.onClickUri !== undefined)), uri: value.data, preview: value.displayData ?? value.data, validatedSelection: validatedSelection, readonly: value.readonly === true, onChange: e => onChange({\n ...value,\n data: e.target.value,\n }) }));\n },\n onPaste: (toPaste, cell, details) => toPaste === cell.data\n ? undefined\n : { ...cell, data: toPaste, displayData: details.formattedString ?? cell.displayData },\n};\n//# sourceMappingURL=uri-cell.js.map","import {} from \"../internal/data-grid/data-grid-types.js\";\nimport { booleanCellRenderer } from \"./boolean-cell.js\";\nimport { bubbleCellRenderer } from \"./bubble-cell.js\";\nimport { drilldownCellRenderer } from \"./drilldown-cell.js\";\nimport { imageCellRenderer } from \"./image-cell.js\";\nimport { loadingCellRenderer } from \"./loading-cell.js\";\nimport { markdownCellRenderer } from \"./markdown-cell.js\";\nimport { markerCellRenderer } from \"./marker-cell.js\";\nimport { newRowCellRenderer } from \"./new-row-cell.js\";\nimport { numberCellRenderer } from \"./number-cell.js\";\nimport { protectedCellRenderer } from \"./protected-cell.js\";\nimport { rowIDCellRenderer } from \"./row-id-cell.js\";\nimport { textCellRenderer } from \"./text-cell.js\";\nimport { uriCellRenderer } from \"./uri-cell.js\";\nexport const AllCellRenderers = [\n markerCellRenderer,\n newRowCellRenderer,\n booleanCellRenderer,\n bubbleCellRenderer,\n drilldownCellRenderer,\n imageCellRenderer,\n loadingCellRenderer,\n markdownCellRenderer,\n numberCellRenderer,\n protectedCellRenderer,\n rowIDCellRenderer,\n textCellRenderer,\n uriCellRenderer,\n];\n//# sourceMappingURL=index.js.map","var debounce = require('./debounce'),\n isObject = require('./isObject');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\nmodule.exports = throttle;\n","import { CellSet } from \"../internal/data-grid/cell-set.js\";\nimport throttle from \"lodash/throttle.js\";\nimport { packColRowToNumber, unpackNumberToColRow, WindowingTrackerBase } from \"./render-state-provider.js\";\nconst imgPool = [];\nclass ImageWindowLoaderImpl extends WindowingTrackerBase {\n imageLoaded = () => undefined;\n loadedLocations = [];\n cache = {};\n setCallback(imageLoaded) {\n this.imageLoaded = imageLoaded;\n }\n // eslint-disable-next-line unicorn/consistent-function-scoping\n sendLoaded = throttle(() => {\n this.imageLoaded(new CellSet(this.loadedLocations));\n this.loadedLocations = [];\n }, 20);\n clearOutOfWindow = () => {\n const keys = Object.keys(this.cache);\n for (const key of keys) {\n const obj = this.cache[key];\n let keep = false;\n for (let j = 0; j < obj.cells.length; j++) {\n const packed = obj.cells[j];\n if (this.isInWindow(packed)) {\n keep = true;\n break;\n }\n }\n if (keep) {\n obj.cells = obj.cells.filter(this.isInWindow);\n }\n else {\n obj.cancel();\n delete this.cache[key];\n }\n }\n };\n loadImage(url, col, row, key) {\n let loaded = false;\n const img = imgPool.pop() ?? new Image();\n let canceled = false;\n const result = {\n img: undefined,\n cells: [packColRowToNumber(col, row)],\n url,\n cancel: () => {\n if (canceled)\n return;\n canceled = true;\n if (imgPool.length < 12) {\n imgPool.unshift(img); // never retain more than 12\n }\n else if (!loaded) {\n img.src = \"\";\n }\n },\n };\n const loadPromise = new Promise(r => img.addEventListener(\"load\", () => r(null)));\n // use request animation time to avoid paying src set costs during draw calls\n requestAnimationFrame(async () => {\n try {\n img.src = url;\n await loadPromise;\n await img.decode();\n const toWrite = this.cache[key];\n if (toWrite !== undefined && !canceled) {\n toWrite.img = img;\n for (const packed of toWrite.cells) {\n this.loadedLocations.push(unpackNumberToColRow(packed));\n }\n loaded = true;\n this.sendLoaded();\n }\n }\n catch {\n result.cancel();\n }\n });\n this.cache[key] = result;\n }\n loadOrGetImage(url, col, row) {\n const key = url;\n const current = this.cache[key];\n if (current !== undefined) {\n const packed = packColRowToNumber(col, row);\n if (!current.cells.includes(packed)) {\n current.cells.push(packed);\n }\n return current.img;\n }\n else {\n this.loadImage(url, col, row, key);\n }\n return undefined;\n }\n}\nexport default ImageWindowLoaderImpl;\n//# sourceMappingURL=image-window-loader.js.map","import * as React from \"react\";\nimport { DataEditor } from \"./data-editor/data-editor.js\";\nimport { AllCellRenderers } from \"./cells/index.js\";\nimport { sprites } from \"./internal/data-grid/sprites.js\";\nimport ImageWindowLoaderImpl from \"./common/image-window-loader.js\";\nconst DataEditorAllImpl = (p, ref) => {\n const allSprites = React.useMemo(() => {\n return { ...sprites, ...p.headerIcons };\n }, [p.headerIcons]);\n const imageWindowLoader = React.useMemo(() => {\n return p.imageWindowLoader ?? new ImageWindowLoaderImpl();\n }, [p.imageWindowLoader]);\n return (React.createElement(DataEditor, { ...p, renderers: AllCellRenderers, headerIcons: allSprites, ref: ref, imageWindowLoader: imageWindowLoader }));\n};\nexport const DataEditorAll = React.forwardRef(DataEditorAllImpl);\n//# sourceMappingURL=data-editor-all.js.map","import { useState, useEffect, useMemo } from \"react\";\nimport type { Theme } from \"@glideapps/glide-data-grid\";\nimport \"@glideapps/glide-data-grid/dist/index.css\";\n\n/** Read a CSS custom property from :root */\nfunction cssVar(name: string): string {\n return getComputedStyle(document.documentElement).getPropertyValue(name).trim();\n}\n\n/** Add alpha channel to a hex/rgb color string */\nfunction withAlpha(color: string, alpha: number): string {\n if (color.startsWith(\"#\")) {\n const hex = color.slice(1);\n const r = parseInt(hex.slice(0, 2), 16);\n const g = parseInt(hex.slice(2, 4), 16);\n const b = parseInt(hex.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n }\n return color;\n}\n\n/** Build Glide theme from current CSS variables */\nfunction buildTheme(): Partial<Theme> {\n const bg = cssVar(\"--color-background\");\n const fg = cssVar(\"--color-foreground\");\n const muted = cssVar(\"--color-muted\");\n const mutedFg = cssVar(\"--color-muted-foreground\");\n const primary = cssVar(\"--color-primary\");\n const primaryFg = cssVar(\"--color-primary-foreground\");\n const border = cssVar(\"--color-border\");\n const accent = cssVar(\"--color-accent\");\n const textSecondary = cssVar(\"--color-text-secondary\");\n const textSubtle = cssVar(\"--color-text-subtle\");\n const fontSans = cssVar(\"--font-sans\") || \"Geist, system-ui, sans-serif\";\n\n return {\n bgCell: bg,\n bgCellMedium: muted,\n bgHeader: muted,\n bgHeaderHasFocus: accent,\n bgHeaderHovered: accent,\n bgBubble: accent,\n bgBubbleSelected: primary,\n textDark: fg,\n textMedium: textSecondary,\n textLight: textSubtle,\n textHeader: mutedFg,\n textGroupHeader: mutedFg,\n textHeaderSelected: fg,\n textBubble: fg,\n accentColor: primary,\n accentFg: primaryFg,\n accentLight: withAlpha(primary, 0.12),\n borderColor: border,\n horizontalBorderColor: border,\n fontFamily: fontSans,\n baseFontStyle: \"13px\",\n headerFontStyle: \"600 12px\",\n editorFontSize: \"13px\",\n lineHeight: 1.5,\n cellHorizontalPadding: 8,\n cellVerticalPadding: 4,\n headerIconSize: 16,\n };\n}\n\n/**\n * Hook that returns a Glide Data Grid theme synced to PPM's dark/light mode.\n * Watches <html> class changes via MutationObserver to rebuild on theme toggle.\n */\nexport function useGlideTheme(): Partial<Theme> {\n // Bump counter on theme class change to trigger rebuild\n const [rev, setRev] = useState(0);\n\n useEffect(() => {\n const observer = new MutationObserver(() => setRev((r) => r + 1));\n observer.observe(document.documentElement, { attributes: true, attributeFilter: [\"class\"] });\n return () => observer.disconnect();\n }, []);\n\n return useMemo(() => buildTheme(), [rev]); // eslint-disable-line react-hooks/exhaustive-deps\n}\n","import { useMemo } from \"react\";\nimport type { GridColumn } from \"@glideapps/glide-data-grid\";\nimport type { GridColumnSchema } from \"./glide-grid-types\";\n\ninterface UseGlideColumnsResult {\n /** Ordered GridColumn definitions (pinned first) */\n columns: GridColumn[];\n /** Number of frozen columns from left */\n freezeColumns: number;\n /** Column name order matching GridColumn indices */\n columnOrder: string[];\n}\n\n/** Estimate column width from header name and sample row values */\nfunction estimateColWidth(name: string, rows: Record<string, unknown>[], type: string): number {\n const headerW = name.length * 9 + 40; // header text + sort icon + menu icon padding\n let maxContentW = 0;\n const sampleCount = Math.min(rows.length, 20);\n for (let i = 0; i < sampleCount; i++) {\n const val = rows[i]?.[name];\n if (val == null) continue;\n const len = typeof val === \"object\" ? 12 : String(val).length;\n maxContentW = Math.max(maxContentW, len * 8);\n }\n const isNumeric = /^(int|serial|bigint|smallint|float|double|decimal|numeric|real|money|bool)/.test(type.toLowerCase());\n const minW = isNumeric ? 80 : 100;\n return Math.max(minW, Math.min(Math.max(headerW, maxContentW) + 16, 400));\n}\n\n/**\n * Build Glide Data Grid column definitions from schema.\n * Reorders columns: pinned first, then unpinned. Auto-sizes widths.\n */\nexport function useGlideColumns(\n schema: GridColumnSchema[],\n columnNames: string[],\n pinnedCols: Set<string>,\n colWidths: Map<string, number>,\n rows: Record<string, unknown>[],\n orderBy?: string | null,\n orderDir?: \"ASC\" | \"DESC\",\n): UseGlideColumnsResult {\n return useMemo(() => {\n const pinned = columnNames.filter((c) => pinnedCols.has(c));\n const unpinned = columnNames.filter((c) => !pinnedCols.has(c));\n const ordered = [...pinned, ...unpinned];\n\n const schemaMap = new Map(schema.map((s) => [s.name, s]));\n\n const columns: GridColumn[] = ordered.map((name) => {\n const col = schemaMap.get(name);\n const isPk = col?.pk ?? false;\n\n let icon: string | undefined;\n if (orderBy === name) {\n icon = orderDir === \"ASC\" ? \"sortAsc\" : \"sortDesc\";\n } else if (isPk) {\n icon = \"headerRowID\";\n } else if (col?.fk) {\n icon = \"headerFk\";\n }\n\n const width = colWidths.get(name) ?? estimateColWidth(name, rows, col?.type ?? \"text\");\n return { title: name, id: name, width, hasMenu: true, icon };\n });\n\n return { columns, freezeColumns: pinned.length, columnOrder: ordered };\n }, [schema, columnNames, pinnedCols, colWidths, rows, orderBy, orderDir]);\n}\n","/** Shared types for Glide Data Grid wrapper used by database-viewer and sqlite-viewer */\n\n/** Unified column schema — superset of DbColumnInfo and sqlite ColumnInfo */\nexport interface GridColumnSchema {\n name: string;\n type: string;\n nullable: boolean;\n pk: boolean;\n defaultValue?: string | null;\n fk?: { table: string; column: string } | null;\n}\n\n/** Unified props interface for the Glide Data Grid wrapper component */\nexport interface GlideGridProps {\n /** Column names in display order */\n columns: string[];\n /** Row data array (current page) */\n rows: Record<string, unknown>[];\n /** Total row count across all pages */\n total: number;\n /** Rows per page */\n limit: number;\n /** Column schema metadata */\n schema: GridColumnSchema[];\n /** Whether data is currently loading */\n loading: boolean;\n /** Current page number (1-based) */\n page: number;\n onPageChange: (page: number) => void;\n /** Cell edit: (pkColumn, pkValue, editedColumn, newValue) */\n onCellUpdate: (pkCol: string, pkVal: unknown, col: string, val: unknown) => void;\n onRowDelete?: (pkCol: string, pkVal: unknown) => void;\n onBulkDelete?: (pkCol: string, pkValues: unknown[]) => void;\n onInsertRow?: (values: Record<string, unknown>) => Promise<void>;\n /** Current sort column */\n orderBy?: string | null;\n orderDir?: \"ASC\" | \"DESC\";\n onToggleSort?: (column: string) => void;\n onClearSort?: () => void;\n /** Per-column ILIKE filters (server-side) */\n columnFilters?: Record<string, string>;\n onColumnFilter?: (filters: Record<string, string>) => void;\n /** Metadata for export/viewer features */\n connectionId?: number;\n selectedTable?: string | null;\n selectedSchema?: string;\n connectionName?: string;\n}\n\n/** Threshold in bytes for showing cell viewer (eye button) */\nexport const LARGE_THRESHOLD = 200;\n\n/** Check if a cell value needs the large data viewer */\nexport function needsViewer(val: unknown): boolean {\n if (val == null) return false;\n if (typeof val === \"object\") return true;\n const s = String(val);\n if (s.length >= LARGE_THRESHOLD) return true;\n const trimmed = s.trimStart();\n if ((trimmed[0] === \"{\" || trimmed[0] === \"[\") && (trimmed.endsWith(\"}\") || trimmed.endsWith(\"]\"))) return true;\n if (trimmed.startsWith(\"<?xml\") || (trimmed.startsWith(\"<\") && trimmed.endsWith(\">\"))) return true;\n return false;\n}\n\n/** Format cell value for display — JSON-stringify objects, otherwise String() */\nexport function formatCellValue(val: unknown): string {\n if (val == null) return \"NULL\";\n if (typeof val === \"object\") return JSON.stringify(val);\n return String(val);\n}\n\n/** Detect language from cell content for syntax highlighting in viewer */\nexport function detectLang(text: string): string {\n const t = text.trimStart();\n if (t[0] === \"{\" || t[0] === \"[\") {\n try { JSON.parse(t); return \"json\"; } catch { /* not json */ }\n }\n if (t.startsWith(\"<?xml\") || (t.startsWith(\"<\") && /<\\/\\w+>/.test(t))) return \"xml\";\n if (t.startsWith(\"---\") || /^\\w+:\\s/m.test(t)) return \"yaml\";\n return \"plaintext\";\n}\n","import { useCallback, useRef } from \"react\";\nimport { GridCellKind, type GridCell, type EditableGridCell, type Item } from \"@glideapps/glide-data-grid\";\nimport type { GridColumnSchema } from \"./glide-grid-types\";\nimport { formatCellValue } from \"./glide-grid-types\";\nimport type { PendingEdit } from \"./use-glide-pending-edits\";\n\n/** Map DB type string to Glide cell kind */\nfunction dbTypeToKind(type: string): GridCellKind {\n const t = type.toLowerCase();\n if (/^(int|serial|bigint|smallint|float|double|decimal|numeric|real|money)/.test(t)) {\n return GridCellKind.Number;\n }\n if (/^bool/.test(t)) return GridCellKind.Boolean;\n return GridCellKind.Text;\n}\n\n/** Check if a PK column is auto-increment (serial, identity, nextval default) */\nfunction isAutoIncrement(col: GridColumnSchema): boolean {\n const t = col.type.toLowerCase();\n if (/^(serial|bigserial|smallserial)/.test(t)) return true;\n if (/^(int|bigint|smallint|integer)/.test(t) && col.defaultValue && /nextval|identity|auto_increment/i.test(col.defaultValue)) return true;\n // SQLite: INTEGER PRIMARY KEY is auto-increment by default\n if (t === \"integer\" && col.pk && !col.defaultValue) return true;\n return false;\n}\n\n/** Truncate display string for canvas rendering performance */\nfunction truncateDisplay(val: string, max = 200): string {\n return val.length > max ? val.slice(0, max) + \"…\" : val;\n}\n\n/** Amber background for cells with pending unsaved edits */\nconst PENDING_THEME = { bgCell: \"rgba(251, 191, 36, 0.15)\" };\n\ninterface UseGlideCellContentResult {\n getCellContent: (cell: Item) => GridCell;\n onCellEdited: (cell: Item, newValue: EditableGridCell) => void;\n}\n\n/**\n * Provides getCellContent and onCellEdited callbacks for Glide Data Grid.\n * Uses refs for rows/columnOrder to avoid stale closures in canvas render loop.\n * Integrates with pending edits — shows pending values with amber highlight.\n */\nexport function useGlideCellContent(\n rows: Record<string, unknown>[],\n columnOrder: string[],\n schema: GridColumnSchema[],\n pkCol: string | null,\n addPendingEdit: (pkVal: unknown, col: string, newVal: unknown) => void,\n pendingRef: React.RefObject<Map<string, PendingEdit>>,\n): UseGlideCellContentResult {\n const rowsRef = useRef(rows);\n rowsRef.current = rows;\n const colOrderRef = useRef(columnOrder);\n colOrderRef.current = columnOrder;\n\n const schemaMap = useRef(new Map<string, GridColumnSchema>());\n schemaMap.current = new Map(schema.map((s) => [s.name, s]));\n\n const getCellContent = useCallback(([colIdx, rowIdx]: Item): GridCell => {\n const colName = colOrderRef.current[colIdx];\n const row = rowsRef.current[rowIdx];\n if (!colName || !row) {\n return { kind: GridCellKind.Text, data: \"\", displayData: \"\", allowOverlay: false };\n }\n\n const colSchema = schemaMap.current.get(colName);\n const kind = colSchema ? dbTypeToKind(colSchema.type) : GridCellKind.Text;\n const isPk = colSchema?.pk ?? false;\n\n // Check for pending edit value\n const pkVal = pkCol ? row[pkCol] : undefined;\n const isNewRow = typeof pkVal === \"string\" && pkVal.startsWith(\"__new_\");\n const pendingKey = `${pkVal}:${colName}`;\n const pending = pendingRef.current.get(pendingKey);\n const val = pending !== undefined ? pending.newVal : row[colName];\n const hasPending = pending !== undefined;\n\n // New row PK column — auto-increment PKs show \"NEW\" (readonly), text PKs are editable\n if (isPk && isNewRow) {\n const isAuto = colSchema ? isAutoIncrement(colSchema) : false;\n if (isAuto) {\n return { kind: GridCellKind.Text, data: \"\", displayData: \"AUTO\", allowOverlay: false, readonly: true,\n themeOverride: { textDark: \"#6b7280\" } };\n }\n // Editable PK (text, uuid, etc.) — show pending value or placeholder\n const editedVal = pending !== undefined ? String(pending.newVal ?? \"\") : \"\";\n return { kind: GridCellKind.Text, data: editedVal, displayData: editedVal || \"Enter ID…\",\n allowOverlay: true, readonly: false,\n themeOverride: editedVal ? (hasPending ? PENDING_THEME : undefined) : { textDark: \"#9ca3af\" } };\n }\n\n // NULL values — for new rows show default/type hints\n if (val == null) {\n let placeholder = isNewRow ? \"\" : \"NULL\";\n if (isNewRow && !hasPending && colSchema) {\n const t = colSchema.type.toLowerCase();\n if (colSchema.defaultValue) {\n placeholder = colSchema.defaultValue;\n } else if (/^(timestamp|datetime|date)/.test(t)) {\n placeholder = \"NOW()\";\n } else if (/^(uuid)/.test(t)) {\n placeholder = \"gen_random_uuid()\";\n }\n }\n return {\n kind: GridCellKind.Text, data: \"\", displayData: placeholder,\n allowOverlay: !isPk, readonly: isPk,\n themeOverride: hasPending ? PENDING_THEME : (isNewRow || placeholder !== \"NULL\" ? { textDark: \"#9ca3af\" } : { textDark: \"#6b7280\" }),\n };\n }\n\n // Number cells\n if (kind === GridCellKind.Number && typeof val === \"number\") {\n return {\n kind: GridCellKind.Number, data: val, displayData: String(val),\n allowOverlay: !isPk, readonly: isPk,\n themeOverride: hasPending ? PENDING_THEME : undefined,\n };\n }\n\n // Boolean cells\n if (kind === GridCellKind.Boolean && typeof val === \"boolean\") {\n return { kind: GridCellKind.Boolean, data: val, readonly: isPk, allowOverlay: false };\n }\n\n // Text cell\n const strVal = formatCellValue(val);\n return {\n kind: GridCellKind.Text, data: strVal, displayData: truncateDisplay(strVal),\n allowOverlay: !isPk, readonly: isPk,\n themeOverride: hasPending ? PENDING_THEME : undefined,\n };\n }, []); // stable — reads from refs\n\n const onCellEdited = useCallback(([colIdx, rowIdx]: Item, newValue: EditableGridCell) => {\n if (!pkCol) return;\n const colName = colOrderRef.current[colIdx];\n const row = rowsRef.current[rowIdx];\n if (!colName || !row) return;\n\n const pkVal = row[pkCol];\n let parsed: unknown;\n if (newValue.kind === GridCellKind.Text) {\n parsed = newValue.data === \"\" ? null : newValue.data;\n } else if (newValue.kind === GridCellKind.Number) {\n parsed = newValue.data;\n } else if (newValue.kind === GridCellKind.Boolean) {\n parsed = newValue.data;\n } else {\n return;\n }\n\n addPendingEdit(pkVal, colName, parsed);\n }, [pkCol, addPendingEdit]);\n\n return { getCellContent, onCellEdited };\n}\n","import { useState, useCallback, useMemo } from \"react\";\nimport { CompactSelection, type GridSelection } from \"@glideapps/glide-data-grid\";\n\nconst EMPTY_SELECTION: GridSelection = {\n columns: CompactSelection.empty(),\n rows: CompactSelection.empty(),\n};\n\ninterface UseGlideSelectionResult {\n gridSelection: GridSelection;\n onGridSelectionChange: (newSel: GridSelection) => void;\n /** Array of selected row indices (derived from CompactSelection) */\n selectedRowIndices: number[];\n clearSelection: () => void;\n}\n\n/**\n * Manages controlled selection state for Glide Data Grid.\n * Provides row indices array for bulk operations (delete, export).\n */\nexport function useGlideSelection(): UseGlideSelectionResult {\n const [gridSelection, setGridSelection] = useState<GridSelection>(EMPTY_SELECTION);\n\n const onGridSelectionChange = useCallback((newSel: GridSelection) => {\n setGridSelection(newSel);\n }, []);\n\n const selectedRowIndices = useMemo(() => {\n const indices: number[] = [];\n if (gridSelection.rows) {\n for (const range of gridSelection.rows) {\n // CompactSelection stores [start, end) ranges\n if (Array.isArray(range)) {\n for (let i = range[0]; i < range[1]; i++) indices.push(i);\n } else {\n indices.push(range);\n }\n }\n }\n return indices;\n }, [gridSelection.rows]);\n\n const clearSelection = useCallback(() => {\n setGridSelection(EMPTY_SELECTION);\n }, []);\n\n return { gridSelection, onGridSelectionChange, selectedRowIndices, clearSelection };\n}\n","import { useState, useCallback, useRef } from \"react\";\n\nexport interface PendingEdit {\n pkVal: unknown;\n col: string;\n newVal: unknown;\n}\n\ninterface UseGlidePendingEditsResult {\n pendingEdits: Map<string, PendingEdit>;\n pendingRef: React.RefObject<Map<string, PendingEdit>>;\n addEdit: (pkVal: unknown, col: string, newVal: unknown) => void;\n commitAll: () => Promise<void>;\n discardAll: () => void;\n hasPending: boolean;\n pendingCount: number;\n /** True after commitAll until cleared — used to clear edits on rows refresh */\n committedRef: React.RefObject<boolean>;\n}\n\n/**\n * Tracks cell edits locally until the user explicitly saves.\n * After commit, keeps pending values visible until rows refresh (avoids flash of stale data).\n * Supports inline insert: edits with PK starting \"__new_\" are routed to onInsertRow.\n */\nexport function useGlidePendingEdits(\n pkCol: string | null,\n onCellUpdate: (pkCol: string, pkVal: unknown, col: string, val: unknown) => void,\n onInsertRow?: (values: Record<string, unknown>) => Promise<void>,\n): UseGlidePendingEditsResult {\n const [pendingEdits, setPendingEdits] = useState<Map<string, PendingEdit>>(new Map());\n const pendingRef = useRef(pendingEdits);\n pendingRef.current = pendingEdits;\n const committedRef = useRef(false);\n\n const addEdit = useCallback((pkVal: unknown, col: string, newVal: unknown) => {\n const key = `${pkVal}:${col}`;\n setPendingEdits((prev) => new Map(prev).set(key, { pkVal, col, newVal }));\n }, []);\n\n const commitAll = useCallback(async () => {\n if (!pkCol) return;\n const newRows = new Map<string, Record<string, unknown>>();\n for (const edit of pendingRef.current.values()) {\n const pkStr = String(edit.pkVal);\n if (pkStr.startsWith(\"__new_\")) {\n if (!newRows.has(pkStr)) newRows.set(pkStr, {});\n newRows.get(pkStr)![edit.col] = edit.newVal;\n } else {\n onCellUpdate(pkCol, edit.pkVal, edit.col, edit.newVal);\n }\n }\n if (onInsertRow) {\n for (const values of newRows.values()) {\n await onInsertRow(values);\n }\n }\n committedRef.current = true;\n // Don't clear — wait for rows prop to refresh so grid doesn't flash stale data\n }, [pkCol, onCellUpdate, onInsertRow]);\n\n const discardAll = useCallback(() => {\n setPendingEdits(new Map());\n committedRef.current = false;\n }, []);\n\n return {\n pendingEdits, pendingRef, addEdit, commitAll, discardAll,\n hasPending: pendingEdits.size > 0, pendingCount: pendingEdits.size,\n committedRef,\n };\n}\n","import { useState, useMemo } from \"react\";\n\ninterface UseGlideRowPinningResult {\n /** Rows reordered: unpinned first, pinned at end (frozen via freezeTrailingRows) */\n effectiveRows: Record<string, unknown>[];\n /** Number of pinned rows — pass to DataEditor's freezeTrailingRows */\n pinnedCount: number;\n pinnedPks: Set<string>;\n setPinnedPks: React.Dispatch<React.SetStateAction<Set<string>>>;\n}\n\n/**\n * Manages row pinning state — pinned rows placed at the end of the array\n * so they can be frozen at the bottom via Glide's freezeTrailingRows.\n */\nexport function useGlideRowPinning(\n rows: Record<string, unknown>[],\n pkCol: string | null,\n): UseGlideRowPinningResult {\n const [pinnedPks, setPinnedPks] = useState<Set<string>>(new Set());\n\n const effectiveRows = useMemo(() => {\n if (pinnedPks.size === 0 || !pkCol) return rows;\n const normal: Record<string, unknown>[] = [];\n const pinned: Record<string, unknown>[] = [];\n for (const row of rows) {\n if (pinnedPks.has(String(row[pkCol] ?? \"\"))) pinned.push(row); else normal.push(row);\n }\n return [...normal, ...pinned];\n }, [rows, pinnedPks, pkCol]);\n\n const pinnedCount = pinnedPks.size;\n\n return { effectiveRows, pinnedCount, pinnedPks, setPinnedPks };\n}\n","import { useState, useCallback, useRef, useEffect } from \"react\";\nimport { useShallow } from \"zustand/react/shallow\";\nimport { useTabStore } from \"@/stores/tab-store\";\nimport type { Item, GridSelection } from \"@glideapps/glide-data-grid\";\nimport type { GridColumnSchema } from \"./glide-grid-types\";\nimport { formatCellValue, detectLang, needsViewer } from \"./glide-grid-types\";\nimport type { PreviewData } from \"./glide-data-preview-panel\";\n\ninterface UseGlideGridActionsParams {\n displayRows: Record<string, unknown>[];\n columnOrder: string[];\n schema: GridColumnSchema[];\n pkCol: string | null;\n connectionId?: number;\n connectionName?: string;\n selectedTable?: string | null;\n selectedSchema?: string;\n addEdit: (pkVal: unknown, col: string, newVal: unknown) => void;\n /** Current grid selection — needed for document-level paste */\n gridSelection?: GridSelection;\n /** Container ref — paste only fires when focus is inside */\n containerRef?: React.RefObject<HTMLElement | null>;\n}\n\n/**\n * Extracts preview panel, paste handler, and FK navigation logic\n * from the main GlideDataGrid component to keep it under 200 lines.\n */\nexport function useGlideGridActions(params: UseGlideGridActionsParams) {\n const { displayRows, columnOrder, schema, pkCol, connectionId, connectionName, selectedTable, selectedSchema, addEdit, gridSelection, containerRef } = params;\n const { openTab } = useTabStore(useShallow((s) => ({ openTab: s.openTab })));\n const [previewData, setPreviewData] = useState<PreviewData | null>(null);\n\n // Refs to avoid stale closures in canvas callbacks\n const displayRowsRef = useRef(displayRows);\n displayRowsRef.current = displayRows;\n const columnOrderRef = useRef(columnOrder);\n columnOrderRef.current = columnOrder;\n\n // Preview panel — inline Monaco viewer for cell/row content\n const openRowPreview = useCallback((rowIdx: number) => {\n const row = displayRows[rowIdx]; if (!row) return;\n const pk = pkCol ? String(row[pkCol] ?? \"\") : \"\";\n const table = selectedTable ?? \"\";\n const content = JSON.stringify(row, null, 2);\n setPreviewData({ title: pk ? `Row #${pk}${table ? ` — ${table}` : \"\"}` : `Row — ${table}`,\n content, language: \"json\", viewerKey: `${connectionId}:${table}:row:${pk}` });\n }, [displayRows, pkCol, selectedTable, connectionId]);\n\n const openCellPreview = useCallback((rowIdx: number, colIdx: number) => {\n const row = displayRows[rowIdx]; if (!row) return;\n const colName = columnOrder[colIdx]; if (!colName) return;\n const val = formatCellValue(row[colName]);\n const pk = pkCol ? String(row[pkCol] ?? rowIdx) : String(rowIdx);\n const table = selectedTable ?? \"\";\n setPreviewData({ title: `${colName} #${pk}${table ? ` — ${table}` : \"\"}`,\n content: val, language: detectLang(val), viewerKey: `${connectionId}:${table}:${colName}:${pk}` });\n }, [displayRows, columnOrder, pkCol, selectedTable, connectionId]);\n\n const openPreviewInTab = useCallback(() => {\n if (!previewData) return;\n openTab({ type: \"editor\", title: previewData.title, projectId: null, closable: true,\n metadata: { inlineContent: previewData.content, inlineLanguage: previewData.language, viewerKey: previewData.viewerKey } });\n }, [openTab, previewData]);\n\n // Custom paste handler — routes pasted TSV cells through addEdit\n const handlePaste = useCallback((target: Item, values: readonly (readonly string[])[]) => {\n if (!pkCol) return false;\n const [startCol, startRow] = target;\n for (let r = 0; r < values.length; r++) {\n const row = displayRowsRef.current[startRow + r];\n if (!row) continue;\n const pk = row[pkCol];\n for (let c = 0; c < values[r]!.length; c++) {\n const colName = columnOrderRef.current[startCol + c];\n if (!colName) continue;\n const colDef = schema.find((s) => s.name === colName);\n if (colDef?.pk) continue;\n const raw = values[r]![c]!;\n addEdit(pk, colName, raw === \"\" ? null : raw);\n }\n }\n return false; // we handled it\n }, [pkCol, schema, addEdit]);\n\n // Document-level paste listener — works even when Glide canvas doesn't have focus\n const schemaRef = useRef(schema);\n schemaRef.current = schema;\n const gridSelRef = useRef(gridSelection);\n gridSelRef.current = gridSelection;\n const addEditRef = useRef(addEdit);\n addEditRef.current = addEdit;\n const pkColRef = useRef(pkCol);\n pkColRef.current = pkCol;\n\n useEffect(() => {\n if (!containerRef) return;\n const handler = (e: ClipboardEvent) => {\n const container = containerRef.current;\n if (!container || !container.contains(document.activeElement)) return;\n // Skip if an input/textarea is focused (e.g. search bar)\n const tag = (document.activeElement as HTMLElement)?.tagName;\n if (tag === \"INPUT\" || tag === \"TEXTAREA\") return;\n const pk = pkColRef.current;\n if (!pk) return;\n const sel = gridSelRef.current?.current;\n if (!sel) return; // need a selected cell as paste anchor\n const text = e.clipboardData?.getData(\"text/plain\");\n if (!text) return;\n const tsvRows = text.split(/\\r?\\n/).filter((r) => r.length > 0).map((r) => r.split(\"\\t\"));\n if (tsvRows.length === 0) return;\n const [startCol, startRow] = sel.cell;\n for (let r = 0; r < tsvRows.length; r++) {\n const row = displayRowsRef.current[startRow + r];\n if (!row) continue;\n const rowPk = row[pk];\n for (let c = 0; c < tsvRows[r]!.length; c++) {\n const colName = columnOrderRef.current[startCol + c];\n if (!colName) continue;\n const colDef = schemaRef.current.find((s) => s.name === colName);\n if (colDef?.pk) continue;\n const raw = tsvRows[r]![c]!;\n addEditRef.current(rowPk, colName, raw === \"\" ? null : raw);\n }\n }\n e.preventDefault();\n };\n document.addEventListener(\"paste\", handler);\n return () => document.removeEventListener(\"paste\", handler);\n }, [containerRef]);\n\n // FK detection helpers for context menu\n const getContextFk = useCallback((colName: string | null) => {\n if (!colName) return null;\n return schema.find((s) => s.name === colName)?.fk ?? null;\n }, [schema]);\n\n const isCellViewable = useCallback((row: Record<string, unknown> | null, colName: string | null) => {\n return row && colName ? needsViewer(row[colName]) : false;\n }, []);\n\n // FK navigation: open referenced table in new tab filtered by FK value\n const openFkTable = useCallback((fk: { table: string; column: string }, cellValue: unknown) => {\n if (cellValue == null || !connectionId) return;\n openTab({\n type: \"database\",\n title: `${connectionName ?? \"DB\"} · ${fk.table}`,\n projectId: null,\n closable: true,\n metadata: {\n connectionId, connectionName,\n tableName: fk.table,\n schemaName: selectedSchema ?? \"public\",\n initialSql: `SELECT * FROM \"${fk.table}\" WHERE \"${fk.column}\" = '${String(cellValue).replace(/'/g, \"''\")}'`,\n },\n });\n }, [connectionId, connectionName, selectedSchema, openTab]);\n\n return {\n previewData, setPreviewData,\n openRowPreview, openCellPreview, openPreviewInTab,\n handlePaste, getContextFk, isCellViewable, openFkTable,\n };\n}\n","import { useState, useEffect, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Filter, Pin, PinOff, ArrowUp, ArrowDown, X } from \"lucide-react\";\n\ninterface HeaderMenuProps {\n colName: string;\n bounds: { x: number; y: number; width: number; height: number };\n isPinned: boolean;\n filterValue: string;\n sortState: \"asc\" | \"desc\" | null;\n onFilter: (value: string) => void;\n onSort: () => void;\n onClearSort?: () => void;\n onTogglePin: () => void;\n onClose: () => void;\n}\n\n/**\n * Header column dropdown menu — filter input, sort toggle, pin/unpin.\n * Rendered via React portal into #portal div (required by Glide Data Grid).\n */\nexport function GlideHeaderMenu({\n colName, bounds, isPinned, filterValue, sortState,\n onFilter, onSort, onClearSort, onTogglePin, onClose,\n}: HeaderMenuProps) {\n const [localFilter, setLocalFilter] = useState(filterValue);\n const ref = useRef<HTMLDivElement>(null);\n const debounceRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n // Close on outside click\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) onClose();\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [onClose]);\n\n // Close on Escape\n useEffect(() => {\n const handler = (e: KeyboardEvent) => { if (e.key === \"Escape\") onClose(); };\n document.addEventListener(\"keydown\", handler);\n return () => document.removeEventListener(\"keydown\", handler);\n }, [onClose]);\n\n // Debounced filter\n const handleFilterChange = (val: string) => {\n setLocalFilter(val);\n clearTimeout(debounceRef.current);\n debounceRef.current = setTimeout(() => onFilter(val), 300);\n };\n\n // Clamp position to viewport\n const menuWidth = 220;\n const left = Math.min(bounds.x, window.innerWidth - menuWidth - 8);\n const top = bounds.y + bounds.height + 2;\n\n const portal = document.getElementById(\"portal\");\n if (!portal) return null;\n\n return createPortal(\n <div ref={ref} style={{ position: \"fixed\", left, top, zIndex: 10000 }}\n className=\"w-[220px] bg-popover border border-border rounded-md shadow-lg text-xs overflow-hidden\">\n {/* Column name header */}\n <div className=\"px-3 py-1.5 border-b border-border text-muted-foreground font-medium truncate\">\n {colName}\n </div>\n\n {/* Filter input */}\n <div className=\"px-2 py-1.5 border-b border-border\">\n <div className=\"flex items-center gap-1\">\n <Filter className=\"size-3 text-muted-foreground shrink-0\" />\n <input\n autoFocus type=\"text\" value={localFilter}\n onChange={(e) => handleFilterChange(e.target.value)}\n placeholder=\"Filter (ILIKE)…\"\n className=\"flex-1 bg-transparent outline-none text-foreground placeholder:text-muted-foreground text-xs\"\n />\n {localFilter && (\n <button type=\"button\" onClick={() => handleFilterChange(\"\")}\n className=\"text-muted-foreground hover:text-foreground\">\n <X className=\"size-3\" />\n </button>\n )}\n </div>\n </div>\n\n {/* Actions */}\n <div className=\"py-1\">\n <button type=\"button\" onClick={() => { onSort(); onClose(); }}\n className=\"w-full text-left px-3 py-1.5 hover:bg-muted flex items-center gap-2 text-foreground\">\n {sortState === \"asc\" ? <ArrowDown className=\"size-3\" /> : <ArrowUp className=\"size-3\" />}\n {sortState === \"asc\" ? \"Sort Descending\" : \"Sort Ascending\"}\n </button>\n {sortState && onClearSort && (\n <button type=\"button\" onClick={() => { onClearSort(); onClose(); }}\n className=\"w-full text-left px-3 py-1.5 hover:bg-muted flex items-center gap-2 text-foreground\">\n <X className=\"size-3\" />\n Clear Sort\n </button>\n )}\n <button type=\"button\" onClick={() => { onTogglePin(); onClose(); }}\n className=\"w-full text-left px-3 py-1.5 hover:bg-muted flex items-center gap-2 text-foreground\">\n {isPinned ? <PinOff className=\"size-3\" /> : <Pin className=\"size-3\" />}\n {isPinned ? \"Unpin Column\" : \"Pin Column\"}\n </button>\n </div>\n </div>,\n portal,\n );\n}\n","import { useState, useEffect, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Eye, Pin, PinOff, Trash2, ExternalLink } from \"lucide-react\";\n\ninterface ContextMenuProps {\n position: { x: number; y: number };\n isPinned: boolean;\n onViewRow: () => void;\n onViewCell?: () => void;\n onPinRow: () => void;\n onDeleteRow: () => void;\n /** FK navigation: open referenced table filtered by this cell's value */\n onOpenFkTable?: () => void;\n /** Label for FK menu item, e.g. \"Open users.id\" */\n fkLabel?: string;\n onClose: () => void;\n}\n\n/**\n * Right-click / long-press context menu for grid rows.\n * Rendered via portal. Includes View JSON, Pin/Unpin, Delete with confirm.\n */\nexport function GlideContextMenu({\n position, isPinned, onViewRow, onViewCell, onPinRow, onDeleteRow, onOpenFkTable, fkLabel, onClose,\n}: ContextMenuProps) {\n const [confirmDelete, setConfirmDelete] = useState(false);\n const ref = useRef<HTMLDivElement>(null);\n\n // Close on outside click\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) onClose();\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [onClose]);\n\n // Close on Escape\n useEffect(() => {\n const handler = (e: KeyboardEvent) => { if (e.key === \"Escape\") onClose(); };\n document.addEventListener(\"keydown\", handler);\n return () => document.removeEventListener(\"keydown\", handler);\n }, [onClose]);\n\n // Clamp to viewport\n const menuWidth = 180;\n const menuHeight = 130;\n const left = Math.min(position.x, window.innerWidth - menuWidth - 8);\n const top = Math.min(position.y, window.innerHeight - menuHeight - 8);\n\n const portal = document.getElementById(\"portal\");\n if (!portal) return null;\n\n return createPortal(\n <div ref={ref} style={{ position: \"fixed\", left, top, zIndex: 10000 }}\n className=\"w-[180px] bg-popover border border-border rounded-md shadow-lg text-xs overflow-hidden py-1\">\n <button type=\"button\" onClick={() => { onViewRow(); onClose(); }}\n className=\"w-full text-left px-3 py-1.5 hover:bg-muted flex items-center gap-2 text-foreground\">\n <Eye className=\"size-3\" /> View as JSON\n </button>\n {onViewCell && (\n <button type=\"button\" onClick={() => { onViewCell(); onClose(); }}\n className=\"w-full text-left px-3 py-1.5 hover:bg-muted flex items-center gap-2 text-foreground\">\n <Eye className=\"size-3\" /> View Cell\n </button>\n )}\n {onOpenFkTable && (\n <button type=\"button\" onClick={() => { onOpenFkTable(); onClose(); }}\n className=\"w-full text-left px-3 py-1.5 hover:bg-muted flex items-center gap-2 text-blue-400\">\n <ExternalLink className=\"size-3\" /> {fkLabel ?? \"Open Referenced Table\"}\n </button>\n )}\n <button type=\"button\" onClick={() => { onPinRow(); onClose(); }}\n className=\"w-full text-left px-3 py-1.5 hover:bg-muted flex items-center gap-2 text-foreground\">\n {isPinned ? <PinOff className=\"size-3\" /> : <Pin className=\"size-3\" />}\n {isPinned ? \"Unpin Row\" : \"Pin Row\"}\n </button>\n <div className=\"border-t border-border my-0.5\" />\n {confirmDelete ? (\n <div className=\"px-3 py-1.5 flex items-center gap-2\">\n <button type=\"button\" onClick={() => { onDeleteRow(); onClose(); }}\n className=\"text-destructive font-medium hover:underline\">Delete?</button>\n <button type=\"button\" onClick={() => setConfirmDelete(false)}\n className=\"text-muted-foreground hover:underline\">Cancel</button>\n </div>\n ) : (\n <button type=\"button\" onClick={() => setConfirmDelete(true)}\n className=\"w-full text-left px-3 py-1.5 hover:bg-muted flex items-center gap-2 text-destructive\">\n <Trash2 className=\"size-3\" /> Delete Row\n </button>\n )}\n </div>,\n portal,\n );\n}\n","import { useState, useEffect, useRef, useCallback } from \"react\";\nimport { createPortal } from \"react-dom\";\n\ninterface ColumnSearchProps {\n columns: string[];\n onSelect: (colName: string) => void;\n onClose: () => void;\n anchorRect: { x: number; y: number };\n}\n\n/** Portal dropdown for searching and jumping to a column in the grid */\nexport function GlideColumnSearch({ columns, onSelect, onClose, anchorRect }: ColumnSearchProps) {\n const [search, setSearch] = useState(\"\");\n const [activeIdx, setActiveIdx] = useState(0);\n const ref = useRef<HTMLDivElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n\n const filtered = search\n ? columns.filter((c) => c.toLowerCase().includes(search.toLowerCase()))\n : columns;\n\n // Reset active index when filter changes\n useEffect(() => { setActiveIdx(0); }, [search]);\n\n // Scroll active item into view\n useEffect(() => {\n const list = listRef.current;\n if (!list) return;\n const active = list.children[activeIdx] as HTMLElement | undefined;\n active?.scrollIntoView({ block: \"nearest\" });\n }, [activeIdx]);\n\n // Close on outside click\n useEffect(() => {\n const handler = (e: MouseEvent) => {\n if (ref.current && !ref.current.contains(e.target as Node)) onClose();\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [onClose]);\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === \"Escape\") { onClose(); return; }\n if (e.key === \"ArrowDown\") { e.preventDefault(); setActiveIdx((i) => Math.min(i + 1, filtered.length - 1)); return; }\n if (e.key === \"ArrowUp\") { e.preventDefault(); setActiveIdx((i) => Math.max(i - 1, 0)); return; }\n if (e.key === \"Enter\") {\n e.preventDefault();\n const col = filtered[activeIdx];\n if (col) { onSelect(col); onClose(); }\n }\n }, [filtered, activeIdx, onSelect, onClose]);\n\n const portal = document.getElementById(\"portal\");\n if (!portal) return null;\n\n return createPortal(\n <div ref={ref} style={{ position: \"fixed\", left: Math.min(anchorRect.x, window.innerWidth - 216), top: Math.min(anchorRect.y, window.innerHeight - 308), zIndex: 10000 }}\n className=\"w-[200px] max-h-[300px] bg-popover border border-border rounded-md shadow-lg text-xs overflow-hidden flex flex-col\">\n <div className=\"px-2 py-1.5 border-b border-border\">\n <input autoFocus value={search} onChange={(e) => setSearch(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"Search columns…\"\n className=\"w-full bg-transparent outline-none text-foreground placeholder:text-muted-foreground text-xs\" />\n </div>\n <div ref={listRef} className=\"overflow-y-auto py-1\">\n {filtered.map((col, i) => (\n <button key={col} type=\"button\"\n onClick={() => { onSelect(col); onClose(); }}\n onMouseEnter={() => setActiveIdx(i)}\n className={`w-full text-left px-3 py-1 truncate text-foreground ${i === activeIdx ? \"bg-muted\" : \"hover:bg-muted\"}`}>\n {col}\n </button>\n ))}\n {filtered.length === 0 && (\n <div className=\"px-3 py-2 text-muted-foreground\">No columns found</div>\n )}\n </div>\n </div>,\n portal,\n );\n}\n","import { useState, useRef } from \"react\";\nimport { Search, X, Trash2, Plus, Columns } from \"lucide-react\";\nimport { ExportButton } from \"./export-button\";\nimport { GlideColumnSearch } from \"./glide-column-search\";\n\ninterface ToolbarProps {\n hasSelection: boolean;\n selectedCount: number;\n onBulkDelete?: () => void;\n onInsertRow?: () => void;\n columns: string[];\n selectedRows: Record<string, unknown>[];\n connectionName?: string;\n searchTerm: string;\n onSearchChange: (term: string) => void;\n onColumnJump?: (colName: string) => void;\n /** Controlled column search open state (from parent \"/\" shortcut) */\n colSearchOpen?: boolean;\n onColSearchChange?: (open: boolean) => void;\n}\n\n/**\n * Toolbar above the Glide Data Grid — bulk actions, search, column jump, insert, export.\n */\nexport function GlideGridToolbar({\n hasSelection, selectedCount, onBulkDelete, onInsertRow,\n columns, selectedRows, connectionName,\n searchTerm, onSearchChange, onColumnJump,\n colSearchOpen: externalOpen, onColSearchChange,\n}: ToolbarProps) {\n const [confirmBulkDelete, setConfirmBulkDelete] = useState(false);\n const [internalOpen, setInternalOpen] = useState(false);\n const colSearchOpen = externalOpen ?? internalOpen;\n const setColSearchOpen = onColSearchChange ?? setInternalOpen;\n const colSearchBtnRef = useRef<HTMLButtonElement>(null);\n\n const colSearchPos = colSearchBtnRef.current\n ? (() => { const r = colSearchBtnRef.current!.getBoundingClientRect(); return { x: r.left, y: r.bottom + 4 }; })()\n : { x: 0, y: 0 };\n\n return (\n <div className=\"flex items-center gap-2 px-2 py-1 border-b border-border bg-background shrink-0\">\n {/* Selection info + bulk actions */}\n {hasSelection && (\n <div className=\"flex items-center gap-1.5 text-xs\">\n <span className=\"text-muted-foreground\">{selectedCount} selected</span>\n {onBulkDelete && (\n confirmBulkDelete ? (\n <span className=\"flex items-center gap-1\">\n <button type=\"button\" onClick={() => { onBulkDelete(); setConfirmBulkDelete(false); }}\n className=\"text-destructive text-[10px] font-medium hover:underline\">\n Delete {selectedCount}?\n </button>\n <button type=\"button\" onClick={() => setConfirmBulkDelete(false)}\n className=\"text-muted-foreground text-[10px] hover:underline\">Cancel</button>\n </span>\n ) : (\n <button type=\"button\" onClick={() => setConfirmBulkDelete(true)}\n className=\"p-0.5 text-muted-foreground hover:text-destructive\">\n <Trash2 className=\"size-3\" />\n </button>\n )\n )}\n <ExportButton columns={columns} rows={selectedRows} filename={`${connectionName ?? \"db\"}-selected`} />\n </div>\n )}\n\n <div className=\"flex-1\" />\n\n {/* Client-side search */}\n <div className=\"flex items-center gap-1 text-xs\">\n <Search className=\"size-3 text-muted-foreground\" />\n <input value={searchTerm} onChange={(e) => onSearchChange(e.target.value)}\n placeholder=\"Search page…\"\n className=\"w-24 bg-transparent outline-none text-foreground placeholder:text-muted-foreground text-xs\" />\n {searchTerm && (\n <button type=\"button\" onClick={() => onSearchChange(\"\")}\n className=\"text-muted-foreground hover:text-foreground\">\n <X className=\"size-3\" />\n </button>\n )}\n </div>\n\n {/* Column jump */}\n {onColumnJump && (\n <button ref={colSearchBtnRef} type=\"button\" onClick={() => setColSearchOpen(!colSearchOpen)}\n className=\"p-0.5 rounded text-muted-foreground hover:text-foreground transition-colors\" title=\"Jump to column (/)\">\n <Columns className=\"size-3.5\" />\n </button>\n )}\n\n {/* Insert row */}\n {onInsertRow && (\n <button type=\"button\" onClick={onInsertRow}\n className=\"p-0.5 rounded text-muted-foreground hover:text-primary transition-colors\" title=\"Insert row\">\n <Plus className=\"size-3.5\" />\n </button>\n )}\n\n {colSearchOpen && onColumnJump && (\n <GlideColumnSearch columns={columns} onSelect={onColumnJump} onClose={() => setColSearchOpen(false)} anchorRect={colSearchPos} />\n )}\n </div>\n );\n}\n","import { Save, Undo2 } from \"lucide-react\";\n\ninterface SaveBarProps {\n pendingCount: number;\n onSave: () => void;\n onDiscard: () => void;\n}\n\n/**\n * Floating save bar shown when there are pending cell edits.\n * Save with click or Mod+Enter. Discard with Escape.\n */\nexport function GlideSaveBar({ pendingCount, onSave, onDiscard }: SaveBarProps) {\n if (pendingCount === 0) return null;\n\n return (\n <div className=\"flex items-center gap-2 px-3 py-1.5 border-t border-amber-400/50 bg-amber-50 dark:bg-amber-950/30 shrink-0 text-xs\">\n <span className=\"text-amber-700 dark:text-amber-300 font-medium\">\n {pendingCount} pending edit{pendingCount > 1 ? \"s\" : \"\"}\n </span>\n <div className=\"flex-1\" />\n <button type=\"button\" onClick={onDiscard}\n className=\"flex items-center gap-1 px-2 py-0.5 rounded text-muted-foreground hover:text-foreground hover:bg-muted transition-colors\">\n <Undo2 className=\"size-3\" /> Discard\n </button>\n <button type=\"button\" onClick={onSave}\n className=\"flex items-center gap-1 px-2 py-0.5 rounded bg-primary text-primary-foreground hover:bg-primary/90 transition-colors\">\n <Save className=\"size-3\" /> Save\n <kbd className=\"ml-1 text-[9px] opacity-70\">⌘↵</kbd>\n </button>\n </div>\n );\n}\n","import { ChevronLeft, ChevronRight } from \"lucide-react\";\n\ninterface PaginationProps {\n total: number;\n page: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n}\n\n/** Pagination footer for Glide Data Grid — row count + page nav */\nexport function GlideGridPagination({ total, page, totalPages, onPageChange }: PaginationProps) {\n return (\n <div className=\"flex items-center justify-between px-3 py-1.5 border-t border-border bg-background shrink-0 text-xs text-muted-foreground\">\n <span>{total.toLocaleString()} rows</span>\n {/* Shortcut hints — desktop only */}\n <div className=\"hidden md:flex items-center gap-2 text-[10px] text-muted-foreground/50\">\n <span><kbd className=\"px-1 py-0.5 rounded bg-muted text-[9px]\">/</kbd> columns</span>\n <span><kbd className=\"px-1 py-0.5 rounded bg-muted text-[9px]\">{\"\\u2318\"}A</kbd> select all</span>\n <span><kbd className=\"px-1 py-0.5 rounded bg-muted text-[9px]\">{\"\\u2318\"}C</kbd> copy</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <button type=\"button\" disabled={page <= 1} onClick={() => onPageChange(page - 1)}\n className=\"p-0.5 rounded hover:bg-muted disabled:opacity-30\">\n <ChevronLeft className=\"size-3.5\" />\n </button>\n <span>{page} / {totalPages}</span>\n <button type=\"button\" disabled={page >= totalPages} onClick={() => onPageChange(page + 1)}\n className=\"p-0.5 rounded hover:bg-muted disabled:opacity-30\">\n <ChevronRight className=\"size-3.5\" />\n </button>\n </div>\n </div>\n );\n}\n","import { useState, useCallback, useRef } from \"react\";\nimport { Eye, Sparkles, WrapText, ExternalLink, X, GripHorizontal } from \"lucide-react\";\nimport Editor from \"@monaco-editor/react\";\nimport { Loader2 } from \"lucide-react\";\nimport { useMonacoTheme } from \"@/lib/use-monaco-theme\";\n\nexport interface PreviewData {\n title: string;\n content: string;\n language: string;\n viewerKey: string;\n}\n\ninterface PreviewPanelProps {\n data: PreviewData;\n onClose: () => void;\n onOpenInTab: () => void;\n}\n\n/** Inline preview panel for cell/row content with Monaco editor */\nexport function GlideDataPreviewPanel({ data, onClose, onOpenInTab }: PreviewPanelProps) {\n const monacoTheme = useMonacoTheme();\n const [wordWrap, setWordWrap] = useState(true);\n const [displayContent, setDisplayContent] = useState(data.content);\n const [beautified, setBeautified] = useState(false);\n const canBeautify = data.language === \"json\" || data.language === \"xml\";\n\n // Reset state when data changes\n const prevKey = useRef(data.title);\n if (prevKey.current !== data.title) {\n prevKey.current = data.title;\n setDisplayContent(data.content);\n setBeautified(false);\n }\n\n const toggleBeautify = useCallback(() => {\n if (beautified) {\n setDisplayContent(data.content);\n setBeautified(false);\n } else if (data.language === \"json\") {\n try { setDisplayContent(JSON.stringify(JSON.parse(data.content.trim()), null, 2)); setBeautified(true); } catch { /* invalid */ }\n } else if (data.language === \"xml\") {\n let depth = 0;\n const formatted = data.content.trim().replace(/>\\s*</g, \">\\n<\").split(\"\\n\").map((line) => {\n const trimmed = line.trim();\n if (trimmed.startsWith(\"</\")) depth = Math.max(0, depth - 1);\n const indented = \" \".repeat(depth) + trimmed;\n if (trimmed.startsWith(\"<\") && !trimmed.startsWith(\"</\") && !trimmed.endsWith(\"/>\") && !trimmed.startsWith(\"<?\")) depth++;\n return indented;\n }).join(\"\\n\");\n setDisplayContent(formatted);\n setBeautified(true);\n }\n }, [beautified, data.content, data.language]);\n\n const [panelHeight, setPanelHeight] = useState(200);\n const handleDrag = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n const startY = e.clientY;\n const startH = panelHeight;\n const onMove = (ev: MouseEvent) => setPanelHeight(Math.max(80, startH + (startY - ev.clientY)));\n const onUp = () => { document.removeEventListener(\"mousemove\", onMove); document.removeEventListener(\"mouseup\", onUp); };\n document.addEventListener(\"mousemove\", onMove);\n document.addEventListener(\"mouseup\", onUp);\n }, [panelHeight]);\n\n return (\n <div className=\"shrink-0 border-t border-border flex flex-col\" style={{ height: panelHeight }}>\n <div onMouseDown={handleDrag}\n className=\"shrink-0 h-1.5 cursor-row-resize bg-border/50 hover:bg-primary/30 flex items-center justify-center transition-colors\">\n <GripHorizontal className=\"size-3 text-muted-foreground/50\" />\n </div>\n <div className=\"flex items-center gap-1 px-2 py-1 bg-muted/50 border-b border-border shrink-0\">\n <Eye className=\"size-3 text-muted-foreground\" />\n <span className=\"text-xs font-medium text-foreground truncate flex-1\">{data.title}</span>\n {canBeautify && (\n <button type=\"button\" onClick={toggleBeautify} title={beautified ? \"Raw\" : \"Beautify\"}\n className={`p-0.5 rounded transition-colors ${beautified ? \"text-primary\" : \"text-muted-foreground hover:text-foreground\"}`}>\n <Sparkles className=\"size-3\" />\n </button>\n )}\n <button type=\"button\" onClick={() => setWordWrap(!wordWrap)} title={wordWrap ? \"No wrap\" : \"Word wrap\"}\n className={`p-0.5 rounded transition-colors ${wordWrap ? \"text-primary\" : \"text-muted-foreground hover:text-foreground\"}`}>\n <WrapText className=\"size-3\" />\n </button>\n <button type=\"button\" onClick={onOpenInTab} title=\"Open in new tab\"\n className=\"flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] text-muted-foreground hover:text-foreground hover:bg-muted transition-colors\">\n <ExternalLink className=\"size-3\" />\n <span className=\"hidden sm:inline\">Open in Tab</span>\n </button>\n <button type=\"button\" onClick={onClose} title=\"Close preview (Esc)\"\n className=\"p-0.5 rounded text-muted-foreground hover:text-foreground transition-colors\">\n <X className=\"size-3\" />\n </button>\n </div>\n <div className=\"flex-1 min-h-0\">\n <Editor\n height=\"100%\"\n language={data.language === \"plaintext\" ? undefined : data.language}\n value={displayContent}\n theme={monacoTheme}\n options={{\n readOnly: true, minimap: { enabled: false }, scrollBeyondLastLine: false,\n wordWrap: wordWrap ? \"on\" : \"off\", lineNumbers: \"on\", fontSize: 12,\n folding: true, bracketPairColorization: { enabled: true },\n domReadOnly: true, contextmenu: false, overviewRulerLanes: 0,\n }}\n loading={<Loader2 className=\"size-4 animate-spin text-muted-foreground\" />}\n />\n </div>\n </div>\n );\n}\n","import { useState, useCallback, useMemo, useRef, useEffect } from \"react\";\nimport DataEditor, { type GridColumn, type Item } from \"@glideapps/glide-data-grid\";\nimport { Loader2 } from \"lucide-react\";\nimport type { GlideGridProps } from \"./glide-grid-types\";\nimport { useGlideTheme } from \"./glide-grid-theme\";\nimport { useGlideColumns } from \"./use-glide-columns\";\nimport { useGlideCellContent } from \"./use-glide-cell-content\";\nimport { useGlideSelection } from \"./use-glide-selection\";\nimport { useGlidePendingEdits } from \"./use-glide-pending-edits\";\nimport { useGlideRowPinning } from \"./use-glide-row-pinning\";\nimport { useGlideGridActions } from \"./use-glide-grid-actions\";\nimport { GlideHeaderMenu } from \"./glide-header-menu\";\nimport { GlideContextMenu } from \"./glide-context-menu\";\nimport { GlideGridToolbar } from \"./glide-grid-toolbar\";\nimport { GlideSaveBar } from \"./glide-save-bar\";\nimport { GlideGridPagination } from \"./glide-grid-pagination\";\nimport { GlideDataPreviewPanel } from \"./glide-data-preview-panel\";\n\nconst HEADER_ICONS: Record<string, (p: { fgColor: string }) => string> = {\n sortAsc: (p) => `<svg viewBox=\"0 0 16 16\" fill=\"${p.fgColor}\"><path d=\"M8 4l4 6H4z\"/></svg>`,\n sortDesc: (p) => `<svg viewBox=\"0 0 16 16\" fill=\"${p.fgColor}\"><path d=\"M8 12l4-6H4z\"/></svg>`,\n headerFk: () => `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"#3b82f6\" stroke-width=\"1.5\" stroke-linecap=\"round\"><path d=\"M6 4.5H4.5a2.5 2.5 0 000 5H6M10 4.5h1.5a2.5 2.5 0 010 5H10M5 7h6\"/></svg>`,\n};\n\n/**\n * Glide Data Grid wrapper for PPM database viewers.\n * Shared by database-viewer (Postgres/MySQL) and sqlite-viewer.\n */\nexport function GlideDataGrid(props: GlideGridProps) {\n const {\n columns: rawColumnNames, rows, total, limit, schema, loading,\n page, onPageChange, onCellUpdate, onRowDelete, onBulkDelete, onInsertRow,\n orderBy, orderDir, onToggleSort, onClearSort, columnFilters = {}, onColumnFilter,\n connectionId, selectedTable, selectedSchema, connectionName,\n } = props;\n\n const theme = useGlideTheme();\n const gridRef = useRef<any>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const columnNames = useMemo(() => {\n const names = new Set(schema.map((s) => s.name));\n return rawColumnNames.filter((c) => names.has(c));\n }, [rawColumnNames, schema]);\n\n // State\n const [pinnedCols, setPinnedCols] = useState<Set<string>>(new Set());\n const [colWidths, setColWidths] = useState<Map<string, number>>(new Map());\n const [headerMenu, setHeaderMenu] = useState<{ colName: string; bounds: { x: number; y: number; width: number; height: number } } | null>(null);\n const [contextMenu, setContextMenu] = useState<{ position: { x: number; y: number }; rowIdx: number; colIdx: number } | null>(null);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [insertedRows, setInsertedRows] = useState<Record<string, unknown>[]>([]);\n\n const pkCol = useMemo(() => {\n return schema.find((c) => c.pk)?.name ?? schema.find((c) => c.name.toLowerCase() === \"id\")?.name ?? null;\n }, [schema]);\n\n // Row pinning (pinned rows frozen at bottom via freezeTrailingRows)\n const { effectiveRows, pinnedCount, pinnedPks, setPinnedPks } = useGlideRowPinning(rows, pkCol);\n\n // Merge rows: unpinned → inserted → pinned (pinned must be last for freezeTrailingRows)\n const allRows = useMemo(() => {\n if (pinnedCount === 0) return [...effectiveRows, ...insertedRows];\n const unpinned = effectiveRows.slice(0, effectiveRows.length - pinnedCount);\n const pinned = effectiveRows.slice(effectiveRows.length - pinnedCount);\n return [...unpinned, ...insertedRows, ...pinned];\n }, [effectiveRows, insertedRows, pinnedCount]);\n const displayRows = useMemo(() => {\n if (!searchTerm.trim()) return allRows;\n const term = searchTerm.toLowerCase();\n return allRows.filter((row) => columnNames.some((col) => String(row[col] ?? \"\").toLowerCase().includes(term)));\n }, [allRows, columnNames, searchTerm]);\n\n const frozenTrailingRows = useMemo(() => {\n if (pinnedCount === 0 || !pkCol) return 0;\n if (!searchTerm.trim()) return pinnedCount;\n return displayRows.filter((row) => pinnedPks.has(String(row[pkCol] ?? \"\"))).length;\n }, [pinnedCount, pkCol, searchTerm, displayRows, pinnedPks]);\n\n // Hooks\n const { pendingRef, addEdit, commitAll, discardAll, hasPending, pendingCount, committedRef } = useGlidePendingEdits(pkCol, onCellUpdate, onInsertRow);\n const { columns, freezeColumns, columnOrder } = useGlideColumns(schema, columnNames, pinnedCols, colWidths, displayRows, orderBy, orderDir);\n const { getCellContent, onCellEdited } = useGlideCellContent(displayRows, columnOrder, schema, pkCol, addEdit, pendingRef);\n const { gridSelection, onGridSelectionChange, selectedRowIndices, clearSelection } = useGlideSelection();\n const {\n previewData, setPreviewData, openRowPreview, openCellPreview, openPreviewInTab,\n handlePaste, getContextFk, isCellViewable, openFkTable,\n } = useGlideGridActions({ displayRows, columnOrder, schema, pkCol, connectionId, connectionName, selectedTable, selectedSchema, addEdit, gridSelection, containerRef });\n\n useEffect(() => {\n if (committedRef.current) { committedRef.current = false; discardAll(); setInsertedRows([]); }\n }, [rows]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const handleColumnResize = useCallback((col: GridColumn, newSize: number) => {\n setColWidths((prev) => new Map(prev).set(col.id ?? col.title, newSize));\n }, []);\n const handleHeaderMenuClick = useCallback((colIdx: number, bounds: { x: number; y: number; width: number; height: number }) => {\n const colName = columnOrder[colIdx]; if (colName) setHeaderMenu({ colName, bounds });\n }, [columnOrder]);\n const handleCellContextMenu = useCallback(([colIdx, rowIdx]: Item, event: { preventDefault: () => void; localEventX: number; localEventY: number; bounds: { x: number; y: number } }) => {\n event.preventDefault();\n setContextMenu({ position: { x: event.bounds.x + event.localEventX, y: event.bounds.y + event.localEventY }, rowIdx, colIdx });\n }, []);\n const togglePinColumn = useCallback((colName: string) => {\n setPinnedCols((prev) => { const n = new Set(prev); if (n.has(colName)) n.delete(colName); else n.add(colName); return n; });\n }, []);\n const togglePinRow = useCallback((rowIdx: number) => {\n if (!pkCol) return;\n const row = displayRows[rowIdx]; if (!row) return;\n const pk = String(row[pkCol] ?? \"\");\n setPinnedPks((prev) => { const n = new Set(prev); if (n.has(pk)) n.delete(pk); else n.add(pk); return n; });\n }, [pkCol, displayRows, setPinnedPks]);\n const getRowThemeOverride = useCallback((rowIdx: number) => {\n if (pinnedPks.size === 0 || !pkCol) return undefined;\n const row = displayRows[rowIdx];\n if (row && pinnedPks.has(String(row[pkCol] ?? \"\"))) return { bgCell: theme.bgCellMedium ?? theme.bgHeader };\n return undefined;\n }, [pinnedPks, pkCol, displayRows, theme]);\n const handleBulkDelete = useCallback(() => {\n if (!pkCol || !onBulkDelete) return;\n onBulkDelete(pkCol, selectedRowIndices.map((i) => displayRows[i]?.[pkCol]).filter((v) => v != null));\n clearSelection();\n }, [pkCol, onBulkDelete, selectedRowIndices, displayRows, clearSelection]);\n\n const [colSearchOpen, setColSearchOpen] = useState(false);\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === \"Escape\") { setPreviewData(null); setColSearchOpen(false); return; }\n if ((e.metaKey || e.ctrlKey) && e.key === \"Enter\" && hasPending) { e.preventDefault(); commitAll(); }\n const tag = (e.target as HTMLElement)?.tagName;\n if (e.key === \"/\" && tag !== \"INPUT\" && tag !== \"TEXTAREA\") { e.preventDefault(); setColSearchOpen(true); }\n }, [hasPending, commitAll]);\n const handleRowAppended = useCallback(() => {\n if (!pkCol || !onInsertRow) return;\n setInsertedRows((prev) => [...prev, { [pkCol]: `__new_${Date.now()}` }]);\n }, [pkCol, onInsertRow]);\n const handleColumnJump = useCallback((colName: string) => {\n const idx = columnOrder.indexOf(colName);\n if (idx >= 0 && gridRef.current?.scrollTo) gridRef.current.scrollTo(idx, 0);\n }, [columnOrder]);\n\n // Context menu derived state\n const contextRow = contextMenu ? displayRows[contextMenu.rowIdx] : null;\n const contextPk = contextRow && pkCol ? String(contextRow[pkCol] ?? \"\") : \"\";\n const contextColName = contextMenu ? columnOrder[contextMenu.colIdx] : null;\n const contextCellViewable = isCellViewable(contextRow ?? null, contextColName ?? null);\n const contextFk = getContextFk(contextColName ?? null);\n const contextCellValue = contextRow && contextColName ? contextRow[contextColName] : null;\n\n if (!columnNames.length) {\n return <div className=\"flex items-center justify-center h-full text-xs text-muted-foreground\">\n {loading ? <Loader2 className=\"size-4 animate-spin\" /> : \"Select a table\"}\n </div>;\n }\n\n return (\n <div ref={containerRef} className=\"flex flex-col h-full overflow-hidden relative\" tabIndex={0} onKeyDown={handleKeyDown}>\n <GlideGridToolbar hasSelection={selectedRowIndices.length > 0} selectedCount={selectedRowIndices.length}\n onBulkDelete={onBulkDelete && pkCol ? handleBulkDelete : undefined}\n onInsertRow={onInsertRow && pkCol ? handleRowAppended : undefined}\n columns={columnNames} selectedRows={selectedRowIndices.map((i) => displayRows[i]!).filter(Boolean)} connectionName={connectionName}\n searchTerm={searchTerm} onSearchChange={setSearchTerm} onColumnJump={handleColumnJump}\n colSearchOpen={colSearchOpen} onColSearchChange={setColSearchOpen} />\n\n {loading && <div className=\"absolute inset-0 z-30 flex items-center justify-center bg-background/60\"><Loader2 className=\"size-5 animate-spin text-primary\" /></div>}\n\n <div className=\"flex-1 min-h-0\">\n <DataEditor ref={gridRef} columns={columns} rows={displayRows.length}\n getCellContent={getCellContent} getCellsForSelection={true}\n onCellEdited={onCellEdited} onPaste={handlePaste}\n theme={theme} freezeColumns={freezeColumns} freezeTrailingRows={frozenTrailingRows}\n rowMarkers={pkCol ? \"checkbox-visible\" : \"number\"}\n gridSelection={gridSelection} onGridSelectionChange={onGridSelectionChange}\n onColumnResize={handleColumnResize as any}\n onHeaderMenuClick={handleHeaderMenuClick as any} onCellContextMenu={handleCellContextMenu as any}\n getRowThemeOverride={getRowThemeOverride as any}\n trailingRowOptions={onInsertRow && pkCol ? { sticky: true, tint: true } : undefined}\n onRowAppended={onInsertRow ? handleRowAppended : undefined}\n headerIcons={HEADER_ICONS} smoothScrollX smoothScrollY width=\"100%\" height=\"100%\" />\n </div>\n\n {hasPending && <GlideSaveBar pendingCount={pendingCount} onSave={commitAll} onDiscard={() => { discardAll(); setInsertedRows([]); }} />}\n {previewData && <GlideDataPreviewPanel data={previewData} onClose={() => setPreviewData(null)} onOpenInTab={openPreviewInTab} />}\n <GlideGridPagination total={total} page={page} totalPages={Math.ceil(total / limit) || 1} onPageChange={onPageChange} />\n\n {headerMenu && (\n <GlideHeaderMenu colName={headerMenu.colName} bounds={headerMenu.bounds}\n isPinned={pinnedCols.has(headerMenu.colName)} filterValue={columnFilters[headerMenu.colName] ?? \"\"}\n sortState={orderBy === headerMenu.colName ? (orderDir === \"ASC\" ? \"asc\" : \"desc\") : null}\n onFilter={(val) => { if (!onColumnFilter) return; const n = { ...columnFilters }; if (val) n[headerMenu.colName] = val; else delete n[headerMenu.colName]; onColumnFilter(n); }}\n onSort={() => { if (onToggleSort) onToggleSort(headerMenu.colName); }}\n onClearSort={onClearSort}\n onTogglePin={() => togglePinColumn(headerMenu.colName)} onClose={() => setHeaderMenu(null)} />\n )}\n\n {contextMenu && contextRow && (\n <GlideContextMenu position={contextMenu.position} isPinned={pinnedPks.has(contextPk)}\n onViewRow={() => openRowPreview(contextMenu.rowIdx)}\n onViewCell={contextCellViewable ? () => openCellPreview(contextMenu.rowIdx, contextMenu.colIdx) : undefined}\n onPinRow={() => togglePinRow(contextMenu.rowIdx)}\n onDeleteRow={() => { if (pkCol && onRowDelete && contextRow) onRowDelete(pkCol, contextRow[pkCol]); }}\n onOpenFkTable={contextFk && contextCellValue != null && connectionId ? () => openFkTable(contextFk, contextCellValue) : undefined}\n fkLabel={contextFk ? `Open ${contextFk.table}.${contextFk.column}` : undefined}\n onClose={() => setContextMenu(null)} />\n )}\n </div>\n );\n}\n"],"file":"glide-data-grid-D-qQqqp7.js"}
|