@veploy/ploychat 0.1.1 → 0.1.3
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/dist/index.js +672 -565
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +2 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/App.jsx","../src/lib/useInbox.js","../src/lib/context.jsx","../src/lib/client.js","../src/lib/mappers.js","../src/components/ConnectChannel.jsx","../src/components/EmojiPicker.jsx","../src/components/TransferModal.jsx","../src/PloyChat.jsx"],"sourcesContent":["'use client'\n\nimport { useMemo, useRef, useState, useEffect } from 'react'\nimport { useInbox } from '@/lib/useInbox'\nimport ConnectChannel from '@/components/ConnectChannel'\nimport EmojiPicker from '@/components/EmojiPicker'\nimport TransferModal from '@/components/TransferModal'\n\n/* ---------- Ícones SVG inline (sem dependências) ---------- */\nconst Icon = ({ d, className = 'w-4 h-4', stroke = 1.8, fill = 'none' }) => (\n <svg viewBox=\"0 0 24 24\" className={className} fill={fill} stroke=\"currentColor\" strokeWidth={stroke} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {d}\n </svg>\n)\nconst I = {\n inbox: <Icon d={<><path d=\"M22 12h-6l-2 3h-4l-2-3H2\"/><path d=\"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11Z\"/></>} />,\n chat: <Icon d={<path d=\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5Z\"/>} />,\n contacts: <Icon d={<><path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"/><circle cx=\"9\" cy=\"7\" r=\"4\"/><path d=\"M22 21v-2a4 4 0 0 0-3-3.87M16 3.13a4 4 0 0 1 0 7.75\"/></>} />,\n send: <Icon d={<><line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"/><polygon points=\"22 2 15 22 11 13 2 9 22 2\"/></>} />,\n bolt: <Icon d={<polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\"/>} />,\n bulb: <Icon d={<><path d=\"M9 18h6\"/><path d=\"M10 22h4\"/><path d=\"M12 2a7 7 0 0 0-4 12.7c.6.5 1 1.3 1 2.1V18h6v-1.2c0-.8.4-1.6 1-2.1A7 7 0 0 0 12 2Z\"/></>} />,\n book: <Icon d={<><path d=\"M4 19.5A2.5 2.5 0 0 1 6.5 17H20\"/><path d=\"M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2Z\"/></>} />,\n chart: <Icon d={<><line x1=\"18\" y1=\"20\" x2=\"18\" y2=\"10\"/><line x1=\"12\" y1=\"20\" x2=\"12\" y2=\"4\"/><line x1=\"6\" y1=\"20\" x2=\"6\" y2=\"14\"/></>} />,\n users: <Icon d={<><path d=\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"/><circle cx=\"9\" cy=\"7\" r=\"4\"/><path d=\"M23 21v-2a4 4 0 0 0-3-3.87M16 3.13a4 4 0 0 1 0 7.75\"/></>} />,\n grid: <Icon d={<><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\"/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"/></>} />,\n briefcase: <Icon d={<><rect x=\"2\" y=\"7\" width=\"20\" height=\"14\" rx=\"2\"/><path d=\"M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16\"/></>} />,\n search: <Icon d={<><circle cx=\"11\" cy=\"11\" r=\"8\"/><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/></>} />,\n filter: <Icon d={<polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\"/>} />,\n sort: <Icon d={<><path d=\"m3 16 4 4 4-4\"/><path d=\"M7 20V4\"/><path d=\"m21 8-4-4-4 4\"/><path d=\"M17 4v16\"/></>} />,\n chevDown: <Icon d={<polyline points=\"6 9 12 15 18 9\"/>} />,\n chevRight: <Icon d={<polyline points=\"9 18 15 12 9 6\"/>} />,\n panel: <Icon d={<><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\"/></>} />,\n more: <Icon d={<><circle cx=\"12\" cy=\"12\" r=\"1\"/><circle cx=\"19\" cy=\"12\" r=\"1\"/><circle cx=\"5\" cy=\"12\" r=\"1\"/></>} />,\n star: <Icon d={<polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"/>} />,\n phone: <Icon d={<path d=\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92Z\"/>} />,\n moon: <Icon d={<path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79Z\"/>} />,\n check: <Icon d={<polyline points=\"20 6 9 17 4 12\"/>} />,\n paperclip: <Icon d={<path d=\"m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48\"/>} />,\n emoji: <Icon d={<><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M8 14s1.5 2 4 2 4-2 4-2\"/><line x1=\"9\" y1=\"9\" x2=\"9.01\" y2=\"9\"/><line x1=\"15\" y1=\"9\" x2=\"15.01\" y2=\"9\"/></>} />,\n mic: <Icon d={<><path d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3Z\"/><path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"/><line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\"/><line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\"/></>} />,\n image: <Icon d={<><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/><polyline points=\"21 15 16 10 5 21\"/></>} />,\n file: <Icon d={<><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/></>} />,\n pin: <Icon d={<><path d=\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z\"/><circle cx=\"12\" cy=\"10\" r=\"3\"/></>} />,\n tag: <Icon d={<><path d=\"M20.59 13.41 13.42 20.58a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82Z\"/><line x1=\"7\" y1=\"7\" x2=\"7.01\" y2=\"7\"/></>} />,\n link: <Icon d={<><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/></>} />,\n clock: <Icon d={<><circle cx=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"12 6 12 12 16 14\"/></>} />,\n forward: <Icon d={<><polyline points=\"15 17 20 12 15 7\"/><path d=\"M4 18v-2a4 4 0 0 1 4-4h12\"/></>} />,\n x: <Icon d={<><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></>} />,\n external: <Icon d={<><path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/><polyline points=\"15 3 21 3 21 9\"/><line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/></>} />,\n plus: <Icon d={<><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/></>} />,\n template: <Icon d={<><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"/><line x1=\"9\" y1=\"21\" x2=\"9\" y2=\"9\"/></>} />,\n reply: <Icon d={<><polyline points=\"9 17 4 12 9 7\"/><path d=\"M20 18v-2a4 4 0 0 0-4-4H4\"/></>} />,\n whatsapp: <Icon d={<><path d=\"M20.52 3.48A11.93 11.93 0 0 0 12.02 0C5.4 0 .03 5.37.03 11.99c0 2.11.55 4.18 1.6 6L0 24l6.18-1.62a12 12 0 0 0 5.84 1.49h.01c6.62 0 11.99-5.37 11.99-11.99 0-3.2-1.25-6.21-3.5-8.4Z\"/><path d=\"M9.3 7.4c-.2-.5-.4-.5-.6-.5h-.5c-.2 0-.5.07-.7.34-.27.27-.93.91-.93 2.22 0 1.31.95 2.58 1.08 2.76.13.18 1.86 2.96 4.58 4.04 2.27.89 2.73.71 3.22.67.49-.05 1.58-.65 1.8-1.27.22-.62.22-1.16.15-1.27-.07-.11-.25-.18-.52-.31-.27-.13-1.58-.78-1.83-.87-.24-.09-.42-.13-.6.13-.18.27-.69.87-.84 1.05-.16.18-.31.2-.58.07-.27-.13-1.14-.42-2.17-1.34-.8-.71-1.34-1.59-1.5-1.86-.16-.27-.02-.41.12-.55.12-.12.27-.31.4-.47.13-.16.18-.27.27-.45.09-.18.04-.34-.02-.47-.07-.13-.6-1.43-.82-1.96Z\"/></>} fill=\"currentColor\" stroke=\"none\" />,\n home: <Icon d={<><path d=\"M3 9.5 12 3l9 6.5V20a1 1 0 0 1-1 1h-5v-7h-6v7H4a1 1 0 0 1-1-1V9.5Z\"/></>} />,\n calendar: <Icon d={<><rect x=\"3\" y=\"4.5\" width=\"18\" height=\"16.5\" rx=\"2\"/><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"/><line x1=\"8\" y1=\"2.5\" x2=\"8\" y2=\"6\"/><line x1=\"16\" y1=\"2.5\" x2=\"16\" y2=\"6\"/></>} />,\n building: <Icon d={<><rect x=\"4\" y=\"2.5\" width=\"16\" height=\"19\" rx=\"1.5\"/><path d=\"M9 21.5v-4h6v4\"/><path d=\"M8.5 7h.01M12 7h.01M15.5 7h.01M8.5 11h.01M12 11h.01M15.5 11h.01M8.5 15h.01M15.5 15h.01\"/></>} />,\n target: <Icon d={<><circle cx=\"12\" cy=\"12\" r=\"9\"/><circle cx=\"12\" cy=\"12\" r=\"5\"/><circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/></>} />,\n kanban: <Icon d={<><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"14\"/><line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"10\"/></>} />,\n dollar: <Icon d={<><circle cx=\"12\" cy=\"12\" r=\"9.5\"/><path d=\"M15 9c-.6-1.3-1.7-2-3-2-1.7 0-3 1-3 2.3 0 2.7 6 1.3 6 4 0 1.3-1.3 2.3-3 2.3-1.3 0-2.4-.7-3-2\"/><line x1=\"12\" y1=\"5.5\" x2=\"12\" y2=\"18.5\"/></>} />,\n checkCircle: <Icon d={<><circle cx=\"12\" cy=\"12\" r=\"9.5\"/><polyline points=\"8.5 12 11 14.5 15.5 9.5\"/></>} />,\n globe: <Icon d={<><circle cx=\"12\" cy=\"12\" r=\"9.5\"/><line x1=\"2.5\" y1=\"12\" x2=\"21.5\" y2=\"12\"/><path d=\"M12 2.5c2.5 2.7 4 6.1 4 9.5s-1.5 6.8-4 9.5C9.5 18.8 8 15.4 8 12s1.5-6.8 4-9.5z\"/></>} />,\n rocket: <Icon d={<><path d=\"M4.5 16.5c-1.5 1.3-2 5-2 5s3.7-.5 5-2c.7-.8.7-2.1-.1-2.9-.8-.8-2.1-.8-2.9-.1z\"/><path d=\"M12 15l-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22 22 0 0 1-4 2z\"/><path d=\"M9 12H4s.55-3 2-4c1.6-1 5 0 5 0\"/><path d=\"M12 15v5s3-.5 4-2c1-1.6 0-5 0-5\"/></>} />,\n wand: <Icon d={<><path d=\"m3 21 9-9\"/><path d=\"M15 3v3\"/><path d=\"M19 7l-2 2\"/><path d=\"M21 11h-3\"/><path d=\"M19 15l-2-2\"/><path d=\"M15 17v-3\"/></>} />,\n doc: <Icon d={<><path d=\"M14 2.5H6.5A2 2 0 0 0 4.5 4.5v15a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V8.5z\"/><polyline points=\"14 2.5 14 8.5 20 8.5\"/><line x1=\"8\" y1=\"13\" x2=\"16\" y2=\"13\"/><line x1=\"8\" y1=\"17\" x2=\"14\" y2=\"17\"/></>} />,\n gear: <Icon d={<><circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 1 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.6 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 1 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 1 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 1 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z\"/></>} />,\n card: <Icon d={<><rect x=\"2\" y=\"5.5\" width=\"20\" height=\"13\" rx=\"2\"/><line x1=\"2\" y1=\"10\" x2=\"22\" y2=\"10\"/></>} />,\n chevDblL: <Icon d={<><path d=\"m11 17-5-5 5-5\"/><path d=\"m18 17-5-5 5-5\"/></>} />,\n chevDblR: <Icon d={<><path d=\"m13 17 5-5-5-5\"/><path d=\"m6 17 5-5-5-5\"/></>} />,\n chevUp: <Icon d={<polyline points=\"18 15 12 9 6 15\"/>} />,\n userPlus: <Icon d={<><path d=\"M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"/><circle cx=\"8.5\" cy=\"7\" r=\"4\"/><line x1=\"20\" y1=\"8\" x2=\"20\" y2=\"14\"/><line x1=\"23\" y1=\"11\" x2=\"17\" y2=\"11\"/></>} />,\n qrcode: <Icon d={<><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\"/><path d=\"M14 14h3v3\"/><path d=\"M21 14v.01\"/><path d=\"M14 21h.01\"/><path d=\"M21 21v-3.5\"/><path d=\"M17.5 21h.01\"/></>} />,\n}\n\n/* ---------- Logo Veploy ---------- */\nconst VeployLogo = ({ size = 28 }) => (\n <svg viewBox=\"0 0 40 32\" width={size} height={(size * 32) / 40} xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2 8 L13 28 L17 22 L8 8 Z\" fill=\"#2f4a2d\" />\n <path d=\"M13 28 L36 0 L26 0 L11 22 Z\" fill=\"#b4e234\" />\n </svg>\n)\n\n/* ---------- Estrutura do menu ---------- */\nconst NAV_DATA = [\n { kind: 'item', id: 'home', label: 'Início', icon: 'home' },\n { kind: 'item', id: 'agenda', label: 'Agenda', icon: 'calendar', badge: 'NOVO' },\n { kind: 'section', label: 'Imóveis' },\n { kind: 'item', id: 'imoveis', label: 'Imóveis', icon: 'building' },\n { kind: 'item', id: 'proprietarios', label: 'Proprietários', icon: 'contacts' },\n { kind: 'item', id: 'stats-im', label: 'Estatísticas', icon: 'chart' },\n { kind: 'section', label: 'CRM' },\n { kind: 'item', id: 'leads', label: 'Leads', icon: 'target' },\n { kind: 'item', id: 'pool', label: 'Pool', icon: 'bolt' },\n { kind: 'item', id: 'funil', label: 'Funil', icon: 'kanban' },\n { kind: 'item', id: 'visitas', label: 'Visitas', icon: 'calendar' },\n { kind: 'item', id: 'propostas', label: 'Propostas', icon: 'dollar' },\n { kind: 'item', id: 'tarefas', label: 'Tarefas', icon: 'checkCircle' },\n { kind: 'item', id: 'stats-crm', label: 'Estatísticas', icon: 'chart' },\n { kind: 'section', label: 'Divulgação' },\n { kind: 'item', id: 'portais', label: 'Portais', icon: 'globe' },\n { kind: 'item', id: 'lp', label: 'Landing Pages', icon: 'rocket', badge: 'NOVO' },\n { kind: 'group', id: 'mais-div', label: 'Mais', icon: 'more', children: [\n { id: 'qr', label: 'QR Codes' },\n { id: 'links', label: 'Links rastreáveis' },\n { id: 'criativos', label: 'Gerador de criativos', badge: 'BETA' },\n ]},\n { kind: 'section', label: 'Site' },\n { kind: 'item', id: 'editor', label: 'Editor de interface', icon: 'wand' },\n { kind: 'item', id: 'blog', label: 'Blog', icon: 'doc' },\n { kind: 'item', id: 'stats-site', label: 'Estatísticas', icon: 'chart' },\n { kind: 'section', label: 'Configurações' },\n { kind: 'item', id: 'geral', label: 'Geral', icon: 'gear' },\n { kind: 'item', id: 'usuarios', label: 'Usuários', icon: 'contacts' },\n { kind: 'item', id: 'plano', label: 'Meu plano', icon: 'card' },\n { kind: 'group', id: 'mais-cfg', label: 'Mais', icon: 'more', children: [\n { id: 'integ', label: 'Integrações' },\n { id: 'webhooks', label: 'Webhooks' },\n ]},\n]\n\n/* ---------- Helpers visuais ---------- */\nconst Avatar = ({ name, size = 'md', color = 'bg-violet-500', online }) => {\n const sizes = { sm: 'w-7 h-7 text-[11px]', md: 'w-9 h-9 text-xs', lg: 'w-11 h-11 text-sm', xl: 'w-14 h-14 text-base' }\n const initials = name.split(' ').map(p => p[0]).slice(0, 2).join('').toUpperCase()\n return (\n <div className=\"relative inline-flex\">\n <div className={`${sizes[size]} ${color} rounded-full text-white font-semibold inline-flex items-center justify-center select-none shrink-0`}>\n {initials}\n </div>\n {online && <span className=\"absolute bottom-0 right-0 w-2.5 h-2.5 rounded-full bg-emerald-500 ring-2 ring-white\" />}\n </div>\n )\n}\n\nconst Pill = ({ children, tone = 'slate' }) => {\n const tones = {\n slate: 'bg-slate-100 text-slate-700 ring-slate-200',\n amber: 'bg-amber-50 text-amber-700 ring-amber-200',\n emerald: 'bg-emerald-50 text-emerald-700 ring-emerald-200',\n rose: 'bg-rose-50 text-rose-700 ring-rose-200',\n violet: 'bg-violet-50 text-violet-700 ring-violet-200',\n sky: 'bg-sky-50 text-sky-700 ring-sky-200',\n yellow: 'bg-yellow-100 text-yellow-800 ring-yellow-200',\n }\n return (\n <span className={`inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-[11px] font-medium ring-1 ring-inset ${tones[tone]}`}>\n {children}\n </span>\n )\n}\n\nconst Dot = ({ tone = 'emerald' }) => <span className={`inline-block w-1.5 h-1.5 rounded-full bg-${tone}-500`} />\n\n/* ---------- Dados mock ---------- */\nconst conversations = [\n {\n id: 'c1', name: 'Samir Patel', phone: '+55 11 98452-1023', avatarColor: 'bg-violet-500',\n preview: 'Olá! Vi o apto de 2 dorm em Vila Mariana, ainda está…',\n waitFor: '4m', unread: 0, sla: 'risk', priority: 'high', status: 'in_progress',\n ticket: '#8743', tier: 'Gold', assignee: 'Você',\n },\n {\n id: 'c2', name: 'Jenifer Souza', phone: '+55 21 99201-7811', avatarColor: 'bg-rose-500',\n preview: 'Oi, tenho uma dúvida sobre a fatura desse mês 🤔',\n waitFor: '8m', unread: 2, sla: 'breach', priority: 'urgent', status: 'open',\n ticket: '#8744', tier: 'Platinum', assignee: 'Você', starred: true,\n },\n {\n id: 'c3', name: 'Ingrid Bahia', phone: '+55 71 98800-4421', avatarColor: 'bg-sky-500',\n preview: 'Boa tarde, vamos prosseguir com a troca do plano…',\n waitFor: '17m', unread: 0, sla: 'ok', priority: 'normal', status: 'waiting',\n ticket: '#8746', tier: 'Silver', assignee: 'Você',\n },\n {\n id: 'c4', name: 'Sven Ribeiro', phone: '+55 47 98112-7755', avatarColor: 'bg-slate-700',\n preview: 'Sim, será processado em até 24h corridas.',\n waitFor: '23m', unread: 0, sla: 'ok', priority: 'low', status: 'in_progress',\n ticket: '#8749', tier: 'Bronze', assignee: 'Você',\n },\n {\n id: 'c5', name: 'Marcelo Tavares', phone: '+55 11 95542-3398', avatarColor: 'bg-amber-500',\n preview: 'Áudio · 0:42',\n waitFor: '34m', unread: 1, sla: 'risk', priority: 'high', status: 'open',\n ticket: '#8751', tier: 'Gold', assignee: 'Fila — Vendas',\n },\n {\n id: 'c6', name: 'Helena Prado', phone: '+55 31 99776-2210', avatarColor: 'bg-emerald-600',\n preview: 'Documento · contrato_v3.pdf',\n waitFor: '52m', unread: 0, sla: 'ok', priority: 'normal', status: 'waiting',\n ticket: '#8755', tier: 'Silver', assignee: 'Você',\n },\n]\n\nconst INITIAL_MESSAGES = [\n { id: 'm1', side: 'in', kind: 'text', text: 'Olá! Vi no site de vocês o apartamento de 2 dormitórios em Vila Mariana. Ainda está disponível? Tenho interesse em visitar essa semana.', time: '10:02', day: 'Hoje' },\n { id: 'm2', side: 'out', kind: 'text', text: 'Olá Samir! Tudo bem? Aqui é a Maria, corretora responsável. Sim, o imóvel está disponível! Pra eu te ajudar melhor, posso te perguntar uma coisa rápida — é pra moradia ou investimento? E você já tem uma faixa de valor em mente?', time: '10:04', status: 'read' },\n { id: 'm3', side: 'in', kind: 'text', text: 'Pra morar mesmo. Sou casado, sem filhos, e tô olhando algo na Zona Sul até R$ 900 mil. Preciso de vaga de garagem e, se possível, varanda.', time: '10:05' },\n { id: 'm4', side: 'in', kind: 'image', caption: 'Esse é o estilo de planta que eu gostei', meta: '1.4 MB · referencia.jpg', time: '10:06' },\n { id: 'm5', side: 'note', text: '@Alissa esse cliente tem o perfil ideal pro 65m² da Vila Mariana (cód. 856301) e pro 95m² em Moema (cód. 858033). Os dois ainda estão liberados pra visita amanhã? Quero confirmar antes de oferecer.', author: 'Maria Eduarda', time: '10:09' },\n { id: 'm6', side: 'system', text: 'Alissa Mendes foi adicionada à conversa', time: '10:10' },\n { id: 'm7', side: 'out', kind: 'text', text: 'Samir, tenho duas ótimas opções pra você dentro do orçamento e com vaga + varanda: um 2 dorm em Vila Mariana e um 3 dorm em Moema. Os dois estão liberados pra visita amanhã. Te mando agora os detalhes e fotos?', time: '10:18', status: 'read', author: 'Alissa Mendes' },\n { id: 'm8', side: 'in', kind: 'text', text: 'Perfeito, manda sim! 🙏', time: '10:20' },\n { id: 'm9', side: 'in', kind: 'audio', duration: '0:18', time: '10:21' },\n { id: 'm10', side: 'out', kind: 'text', text: 'Maravilha! Qual período da semana funciona melhor pra você visitar — manhã ou final do dia? Já adianto o agendamento com os proprietários. 😊', time: '10:24', status: 'delivered' },\n]\n\nconst quickReplies = [\n { id: 'q1', label: 'Saudação', text: 'Olá! Aqui é da imobiliária, tudo bem? Como posso te ajudar a encontrar o imóvel ideal?' },\n { id: 'q2', label: 'Perfil', text: 'Pra eu te enviar as melhores opções, me conta: é pra moradia ou investimento? Qual região e faixa de valor?' },\n { id: 'q3', label: 'Agendar visita', text: 'Posso já agendar a visita pra você. Qual o melhor dia e horário essa semana?' },\n { id: 'q4', label: 'Documentos', text: 'Pra avançar com a proposta, vou precisar de RG, CPF, comprovante de renda e residência. Pode me enviar por aqui mesmo.' },\n]\n\n/* ---------- Tons utilitários ---------- */\nconst slaInfo = {\n ok: { tone: 'emerald', label: 'No prazo' },\n risk: { tone: 'amber', label: 'Em risco' },\n breach: { tone: 'rose', label: 'Estourado' },\n}\nconst statusInfo = {\n open: { tone: 'sky', label: 'Aberto' },\n in_progress: { tone: 'amber', label: 'Em atendimento' },\n waiting: { tone: 'violet', label: 'Aguardando cliente' },\n resolved: { tone: 'emerald', label: 'Resolvido' },\n}\n\n/* ---------- Componente raiz ---------- */\nexport default function App() {\n const inbox = useInbox()\n const live = inbox.live\n const [mockActiveId, setMockActiveId] = useState('c1')\n const activeId = live ? inbox.activeId : mockActiveId\n const setActiveId = live ? inbox.setActiveId : setMockActiveId\n const [connectOpen, setConnectOpen] = useState(false)\n const [transferOpen, setTransferOpen] = useState(false)\n const [emojiOpen, setEmojiOpen] = useState(false)\n const [filterOpen, setFilterOpen] = useState(false)\n const [unreadOnly, setUnreadOnly] = useState(false)\n const [mineOnly, setMineOnly] = useState(false)\n const [recording, setRecording] = useState(false)\n const [recSecs, setRecSecs] = useState(0)\n const [composeMode, setComposeMode] = useState('reply')\n const [text, setText] = useState('')\n const [filter, setFilter] = useState('all')\n const [detailsOpen, setDetailsOpen] = useState(true)\n const [quickOpen, setQuickOpen] = useState(false)\n const [searchOpen, setSearchOpen] = useState(false)\n const [searchQuery, setSearchQuery] = useState('')\n const [searchIndex, setSearchIndex] = useState(0)\n const [messages, setMessages] = useState(INITIAL_MESSAGES)\n const threadMessages = live ? inbox.messages : messages\n const convList = live ? inbox.conversations : conversations\n const scrollRef = useRef(null)\n const textareaRef = useRef(null)\n const imageInputRef = useRef(null)\n const fileInputRef = useRef(null)\n const mediaRecorderRef = useRef(null)\n const audioChunksRef = useRef([])\n const cancelAudioRef = useRef(false)\n const audioCtxRef = useRef(null)\n const analyserRef = useRef(null)\n const recTimerRef = useRef(null)\n\n // Lista de conversas redimensionável (arrasto estilo WhatsApp Web)\n const [listWidth, setListWidth] = useState(() => {\n if (typeof window !== 'undefined') {\n const v = parseInt(window.localStorage.getItem('veploy_chat_list_width') || '', 10)\n if (v >= 300 && v <= 600) return v\n }\n return 380\n })\n const resizingRef = useRef(false)\n const listWidthRef = useRef(listWidth)\n listWidthRef.current = listWidth\n useEffect(() => {\n const onMove = e => {\n if (!resizingRef.current) return\n setListWidth(Math.min(600, Math.max(300, e.clientX)))\n }\n const onUp = () => {\n if (!resizingRef.current) return\n resizingRef.current = false\n document.body.style.cursor = ''\n document.body.style.userSelect = ''\n try { window.localStorage.setItem('veploy_chat_list_width', String(listWidthRef.current)) } catch {}\n }\n window.addEventListener('mousemove', onMove)\n window.addEventListener('mouseup', onUp)\n return () => { window.removeEventListener('mousemove', onMove); window.removeEventListener('mouseup', onUp) }\n }, [])\n const startResize = e => {\n resizingRef.current = true\n document.body.style.cursor = 'col-resize'\n document.body.style.userSelect = 'none'\n e.preventDefault()\n }\n\n const formatNow = () => {\n const d = new Date()\n return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`\n }\n\n const fileToDataUrl = (file) => new Promise((res, rej) => {\n const r = new FileReader(); r.onload = () => res(r.result); r.onerror = rej; r.readAsDataURL(file)\n })\n\n const insertEmoji = (e) => { setText(t => t + e); setEmojiOpen(false); textareaRef.current?.focus() }\n\n const sendMediaFile = async (file, kind) => {\n if (!file) return\n const previewUrl = URL.createObjectURL(file)\n const data = await fileToDataUrl(file)\n if (live) {\n inbox.sendMedia({ data, mime: file.type, kind, filename: file.name, previewUrl })\n } else {\n setMessages(ms => [...ms, { id: `m${Date.now()}`, side: 'out', kind, mediaUrl: previewUrl, meta: file.name, time: formatNow(), status: 'sent' }])\n }\n }\n const onPickImage = async (e) => { const f = e.target.files?.[0]; e.target.value = ''; await sendMediaFile(f, 'image') }\n const onPickFile = async (e) => { const f = e.target.files?.[0]; e.target.value = ''; await sendMediaFile(f, 'document') }\n\n const startRecording = async () => {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true })\n const mr = new MediaRecorder(stream)\n audioChunksRef.current = []\n cancelAudioRef.current = false\n\n // medidor de nível ao vivo (waveform)\n const Ctx = window.AudioContext || window.webkitAudioContext\n const audioCtx = new Ctx()\n const source = audioCtx.createMediaStreamSource(stream)\n const analyser = audioCtx.createAnalyser()\n analyser.fftSize = 64\n source.connect(analyser)\n audioCtxRef.current = audioCtx\n analyserRef.current = analyser\n setRecSecs(0)\n clearInterval(recTimerRef.current)\n recTimerRef.current = setInterval(() => setRecSecs(s => s + 1), 1000)\n\n mr.ondataavailable = ev => { if (ev.data.size > 0) audioChunksRef.current.push(ev.data) }\n mr.onstop = async () => {\n stream.getTracks().forEach(t => t.stop())\n clearInterval(recTimerRef.current)\n try { audioCtxRef.current?.close() } catch {}\n analyserRef.current = null\n if (cancelAudioRef.current) return\n const blob = new Blob(audioChunksRef.current, { type: mr.mimeType || 'audio/webm' })\n const previewUrl = URL.createObjectURL(blob)\n const data = await fileToDataUrl(blob)\n if (live) inbox.sendMedia({ data, mime: blob.type, kind: 'audio', filename: 'audio', previewUrl })\n else setMessages(ms => [...ms, { id: `m${Date.now()}`, side: 'out', kind: 'audio', mediaUrl: previewUrl, time: formatNow(), status: 'sent' }])\n }\n mediaRecorderRef.current = mr\n mr.start()\n setRecording(true)\n } catch { alert('Não foi possível acessar o microfone') }\n }\n const stopRecording = (cancel = false) => {\n cancelAudioRef.current = cancel\n setRecording(false)\n try { mediaRecorderRef.current?.stop() } catch {}\n }\n\n // Esc cancela a gravação de voz\n useEffect(() => {\n if (!recording) return\n const onKey = e => { if (e.key === 'Escape') stopRecording(true) }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [recording])\n\n const handleSend = () => {\n const t = text.trim()\n if (!t) return\n if (live) {\n inbox.send(t, composeMode === 'note')\n setText('')\n return\n }\n const id = `m${Date.now()}`\n const time = formatNow()\n const msg = composeMode === 'note'\n ? { id, side: 'note', text: t, author: 'Maria Eduarda', time }\n : { id, side: 'out', kind: 'text', text: t, time, status: 'sent', author: 'Maria Eduarda' }\n setMessages(ms => [...ms, msg])\n setText('')\n }\n\n const searchMatches = useMemo(() => {\n const q = searchQuery.trim().toLowerCase()\n if (!q) return []\n return threadMessages.filter(m => {\n const t = (m.text || m.caption || '').toLowerCase()\n return t.includes(q)\n }).map(m => m.id)\n }, [searchQuery, threadMessages])\n\n useEffect(() => { setSearchIndex(0) }, [searchQuery])\n\n // Embed bridge: quando roda dentro de um host (iframe), recebe {token, workspace}\n // do host via postMessage e entra em modo live. Sem isso, fica em demo (não\n // utilizável \"por fora\"). Origens permitidas via NEXT_PUBLIC_EMBED_ORIGINS.\n useEffect(() => {\n if (typeof window === 'undefined' || window.parent === window) return\n const envOrigins = (typeof process !== 'undefined' && process.env && process.env.NEXT_PUBLIC_EMBED_ORIGINS) || ''\n const allowed = envOrigins.split(',').map(s => s.trim()).filter(Boolean)\n const onMsg = e => {\n if (allowed.length && !allowed.includes(e.origin)) return\n const d = e.data || {}\n if (d.type === 'veploy-chat-auth' && d.token && d.workspace) {\n const wasLive = !!localStorage.getItem('veploy_chat_token') && !!localStorage.getItem('veploy_chat_workspace')\n localStorage.setItem('veploy_chat_token', d.token)\n localStorage.setItem('veploy_chat_workspace', String(d.workspace))\n if (!wasLive) location.reload()\n }\n }\n window.addEventListener('message', onMsg)\n try { window.parent.postMessage({ type: 'veploy-chat-ready' }, '*') } catch {}\n return () => window.removeEventListener('message', onMsg)\n }, [])\n\n const currentMatchId = searchMatches[searchIndex]\n const openSearch = () => { setSearchOpen(true); setSearchQuery('') }\n const closeSearch = () => { setSearchOpen(false); setSearchQuery('') }\n const nextMatch = () => searchMatches.length && setSearchIndex(i => (i + 1) % searchMatches.length)\n const prevMatch = () => searchMatches.length && setSearchIndex(i => (i - 1 + searchMatches.length) % searchMatches.length)\n\n const active = convList.find(c => c.id === activeId)\n\n useEffect(() => {\n if (scrollRef.current) scrollRef.current.scrollTop = scrollRef.current.scrollHeight\n }, [activeId, threadMessages.length])\n\n const counts = useMemo(() => ({\n open: convList.filter(c => c.status !== 'resolved' && c.status !== 'waiting').length,\n pending: convList.filter(c => c.status === 'waiting').length,\n all: convList.length,\n }), [convList])\n\n const filtered = useMemo(() => {\n let list = convList\n if (filter === 'pending') list = list.filter(c => c.status === 'waiting')\n else if (filter !== 'all') list = list.filter(c => c.status !== 'resolved' && c.status !== 'waiting')\n if (unreadOnly) list = list.filter(c => c.unread > 0)\n if (mineOnly) list = list.filter(c => c._raw?.assignee_user_id && c._raw.assignee_user_id === inbox.me)\n return list\n }, [filter, convList, unreadOnly, mineOnly, inbox.me])\n\n return (\n <div className=\"h-full w-full bg-slate-100 flex text-slate-900\">\n {/* ---------- App container ---------- */}\n <main className=\"flex-1 flex overflow-hidden\">\n {/* ---------- Lista de conversas ---------- */}\n <section style={{ width: listWidth }} className=\"relative bg-white border-r border-slate-200 flex flex-col shrink-0\">\n <header className=\"px-4 pt-4 pb-3 border-b border-slate-100\">\n <div className=\"flex items-center justify-between mb-3\">\n <h1 className=\"font-semibold text-[15px]\">Caixa de entrada</h1>\n <div className=\"flex items-center gap-1\">\n {live && (\n <button onClick={() => setConnectOpen(true)} title=\"Conectar WhatsApp\"\n className=\"p-1.5 rounded-md hover:bg-emerald-50 text-emerald-600\">{I.qrcode}</button>\n )}\n <div className=\"relative\">\n <button onClick={() => setFilterOpen(v => !v)} title=\"Filtros\"\n className={`p-1.5 rounded-md ${(unreadOnly || mineOnly) ? 'bg-slate-900 text-white' : 'hover:bg-slate-100 text-slate-500'}`}>{I.filter}</button>\n {filterOpen && (\n <div className=\"absolute right-0 top-[calc(100%+6px)] z-20 w-52 bg-white border border-slate-200 rounded-xl shadow-lg py-1.5 text-[13px]\">\n <label className=\"flex items-center gap-2 px-3 py-1.5 hover:bg-slate-50 cursor-pointer\">\n <input type=\"checkbox\" checked={unreadOnly} onChange={e => setUnreadOnly(e.target.checked)} /> Só não lidas\n </label>\n {live && (\n <label className=\"flex items-center gap-2 px-3 py-1.5 hover:bg-slate-50 cursor-pointer\">\n <input type=\"checkbox\" checked={mineOnly} onChange={e => setMineOnly(e.target.checked)} /> Atribuídas a mim\n </label>\n )}\n {(unreadOnly || mineOnly) && (\n <button onClick={() => { setUnreadOnly(false); setMineOnly(false) }}\n className=\"w-full text-left px-3 py-1.5 text-slate-500 hover:bg-slate-50 border-t border-slate-100 mt-1\">Limpar filtros</button>\n )}\n </div>\n )}\n </div>\n <button className=\"p-1.5 rounded-md text-slate-300 cursor-not-allowed\" title=\"Ordenar (em breve)\">{I.sort}</button>\n </div>\n </div>\n <div className=\"relative\">\n <span className=\"absolute left-2.5 top-1/2 -translate-y-1/2 text-slate-400\">{I.search}</span>\n <input placeholder=\"Buscar conversas, nº ou ticket…\" className=\"w-full pl-8 pr-3 py-1.5 text-[13px] rounded-lg bg-slate-50 border border-slate-200 focus:bg-white focus:border-slate-300 outline-none\" />\n </div>\n <div className=\"flex items-center gap-2 mt-3 text-[12px]\">\n {[\n ['all', 'Todas', counts.all],\n ['pending', 'Pendentes', counts.pending],\n ['open', 'Abertas', counts.open],\n ].map(([k, l, n]) => (\n <button key={k} onClick={() => setFilter(k)}\n className={`relative px-3 py-1.5 rounded-full font-medium transition-colors\n ${filter === k ? 'bg-slate-900 text-white' : 'text-slate-600 hover:bg-slate-100'}`}>\n {l}\n {n > 0 && (\n <span className=\"absolute -top-1.5 -right-1.5 min-w-[18px] h-[18px] px-1 rounded-full bg-slate-500 text-white text-[10px] font-bold inline-flex items-center justify-center ring-2 ring-white tabular-nums\">\n {n > 99 ? '99+' : n}\n </span>\n )}\n </button>\n ))}\n </div>\n </header>\n\n <div className=\"flex-1 overflow-y-auto\">\n {filtered.map(c => (\n <ConversationItem key={c.id} c={c} active={c.id === activeId} onClick={() => { setActiveId(c.id); if (live) inbox.markRead(c.id) }} />\n ))}\n </div>\n\n <footer className=\"border-t border-slate-100 px-3 py-2 flex items-center justify-between text-[11px] text-slate-500\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-emerald-500 animate-pulse\" />\n Disponível para atender\n </div>\n <button className=\"hover:text-slate-700\">Pausar</button>\n </footer>\n\n {/* Handle de arrasto p/ redimensionar a lista (estilo WhatsApp Web) */}\n <div onMouseDown={startResize} title=\"Arraste para redimensionar\"\n className=\"absolute top-0 right-0 h-full w-1.5 cursor-col-resize hover:bg-emerald-400/40 active:bg-emerald-500/50 z-10\" />\n </section>\n\n {/* ---------- Chat ---------- */}\n <section className=\"flex-1 flex flex-col bg-slate-50 min-w-0\">\n {active && <ChatHeader c={active} onToggleDetails={() => setDetailsOpen(v => !v)} detailsOpen={detailsOpen} onOpenSearch={openSearch} onTransfer={() => setTransferOpen(true)} />}\n\n {searchOpen && (\n <SearchBar\n query={searchQuery}\n onChange={setSearchQuery}\n matches={searchMatches}\n currentIndex={searchIndex}\n onPrev={prevMatch}\n onNext={nextMatch}\n onClose={closeSearch}\n />\n )}\n\n {/* Thread */}\n <div ref={scrollRef} className=\"flex-1 overflow-y-auto px-6 py-5 space-y-1\">\n <DayDivider label=\"Hoje\" />\n {threadMessages.map((m, i) => (\n <Message\n key={m.id}\n m={m}\n prev={threadMessages[i - 1]}\n searchQuery={searchOpen ? searchQuery : ''}\n isCurrentMatch={m.id === currentMatchId}\n />\n ))}\n <div className=\"text-center mt-4\">\n <span className=\"text-[11px] text-slate-400 inline-flex items-center gap-1\">\n <Avatar name={active?.name || ''} size=\"sm\" color={active?.avatarColor} /> Conversa criada por você · agora\n </span>\n </div>\n </div>\n\n {/* Compose */}\n <div className=\"px-6 pb-5\">\n <div className=\"bg-white border border-slate-200 rounded-2xl shadow-soft\">\n <div className=\"flex items-center gap-1 px-3 pt-2 text-[12px]\">\n {[\n ['reply', 'Mensagem'],\n ['note', 'Nota interna'],\n ].map(([k, l]) => (\n <button key={k} onClick={() => setComposeMode(k)}\n className={`px-2.5 py-1 rounded-md font-medium ${composeMode === k\n ? k === 'note' ? 'bg-yellow-100 text-yellow-800' : 'bg-slate-900 text-white'\n : 'text-slate-600 hover:bg-slate-100'}`}>\n {l}\n </button>\n ))}\n <div className=\"flex-1\" />\n <button onClick={() => setQuickOpen(v => !v)} className=\"px-2.5 py-1 text-slate-600 hover:bg-slate-100 rounded-md inline-flex items-center gap-1 font-medium\">\n ⌘K <span className=\"text-slate-400\">para respostas rápidas</span>\n </button>\n </div>\n\n {quickOpen && (\n <div className=\"px-3 py-2 border-t border-slate-100 bg-slate-50/60 flex flex-wrap gap-1.5\">\n {quickReplies.map(q => (\n <button key={q.id} onClick={() => { setText(q.text); setQuickOpen(false) }}\n className=\"text-[12px] bg-white border border-slate-200 hover:border-slate-300 px-2.5 py-1 rounded-md text-slate-700\">\n <span className=\"text-slate-400 mr-1\">/</span>{q.label}\n </button>\n ))}\n </div>\n )}\n\n <div className={`px-4 py-3 ${composeMode === 'note' ? 'bg-yellow-50' : ''}`}>\n <textarea\n ref={textareaRef}\n rows={3}\n value={text}\n onChange={e => setText(e.target.value)}\n onKeyDown={e => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSend()\n }\n }}\n placeholder={\n composeMode === 'note'\n ? 'Adicione uma nota interna — visível só para o time…'\n : 'Digite uma mensagem para Samir…'\n }\n className={`w-full text-[14px] resize-none bg-transparent outline-none placeholder:text-slate-400 ${composeMode === 'note' ? 'text-yellow-900 placeholder:text-yellow-600' : ''}`}\n />\n </div>\n\n <div className=\"flex items-center gap-1 px-3 py-2 border-t border-slate-100\">\n {recording ? (\n <div className=\"flex items-center gap-3 flex-1\">\n <span className=\"w-2 h-2 rounded-full bg-rose-500 animate-pulse shrink-0\" />\n <span className=\"text-[12.5px] text-rose-600 font-medium tabular-nums shrink-0\">{fmtSecs(recSecs)}</span>\n <AudioWave analyserRef={analyserRef} />\n <span className=\"text-[11px] text-slate-400 shrink-0 hidden sm:inline\">Esc cancela</span>\n <button onClick={() => stopRecording(true)} className=\"text-[12.5px] text-slate-500 px-2.5 py-1.5 rounded-lg hover:bg-slate-100 shrink-0\">Cancelar</button>\n <button onClick={() => stopRecording(false)} className=\"text-[13px] font-medium bg-emerald-600 hover:bg-emerald-700 text-white px-3 py-1.5 rounded-lg inline-flex items-center gap-1.5 shrink-0\">Enviar <span className=\"opacity-90\">{I.send}</span></button>\n </div>\n ) : (\n <>\n <div className=\"relative\">\n <button onClick={() => setEmojiOpen(v => !v)} title=\"Emoji\"\n className={`px-1.5 py-1.5 rounded-md inline-flex items-center ${emojiOpen ? 'bg-slate-100 text-slate-900' : 'text-slate-500 hover:bg-slate-100'}`}>{I.emoji}</button>\n {emojiOpen && <EmojiPicker onPick={insertEmoji} />}\n </div>\n <AttachMenu onImage={() => imageInputRef.current?.click()} onFile={() => fileInputRef.current?.click()} />\n <button onClick={startRecording} title=\"Gravar áudio\"\n className=\"text-slate-500 hover:bg-slate-100 px-1.5 py-1.5 rounded-md inline-flex items-center\">{I.mic}</button>\n <div className=\"flex-1\" />\n <button\n onClick={handleSend}\n disabled={!text.trim()}\n className={`text-[13px] font-medium px-3.5 py-1.5 rounded-lg inline-flex items-center gap-1.5 disabled:opacity-50 disabled:cursor-not-allowed ${\n composeMode === 'note'\n ? 'bg-yellow-500 hover:bg-yellow-600 text-white'\n : 'bg-emerald-600 hover:bg-emerald-700 text-white'\n }`}>\n {composeMode === 'note' ? 'Salvar nota' : 'Enviar'}\n <span className=\"opacity-90\">{I.send}</span>\n </button>\n </>\n )}\n <input ref={imageInputRef} type=\"file\" accept=\"image/*\" className=\"hidden\" onChange={onPickImage} />\n <input ref={fileInputRef} type=\"file\" className=\"hidden\" onChange={onPickFile} />\n </div>\n </div>\n </div>\n </section>\n\n {/* ---------- Detalhes ---------- */}\n {detailsOpen && active && <DetailsPanel c={active} onClose={() => setDetailsOpen(false)} />}\n </main>\n {connectOpen && <ConnectChannel inbox={inbox} onClose={() => setConnectOpen(false)} />}\n {transferOpen && active && (\n <TransferModal inbox={inbox} conversationId={active.id} currentAssignee={active._raw?.assignee_user_id} onClose={() => setTransferOpen(false)} />\n )}\n </div>\n )\n}\n\n/* ---------- Sidebar (recolhível) ---------- */\nfunction Sidebar({ collapsed, onToggle, activeId, onSelect }) {\n return collapsed\n ? <SidebarCollapsed onToggle={onToggle} activeId={activeId} onSelect={onSelect} />\n : <SidebarExpanded onToggle={onToggle} activeId={activeId} onSelect={onSelect} />\n}\n\nfunction SidebarCollapsed({ onToggle, activeId, onSelect }) {\n return (\n <aside className=\"w-16 bg-white border-r border-slate-200 flex flex-col items-center py-3 shrink-0\">\n <button onClick={onToggle} title=\"Expandir menu\"\n className=\"w-10 h-10 rounded-xl flex items-center justify-center text-slate-500 hover:bg-slate-100 hover:text-slate-900 mb-2\">\n {I.chevDblR}\n </button>\n <div className=\"flex-1 w-full overflow-y-auto flex flex-col items-center gap-0.5 px-3 pb-3\">\n {NAV_DATA.map((n, i) => {\n if (n.kind === 'section') return <div key={i} className=\"w-6 h-px bg-slate-200 my-2\" />\n if (n.kind === 'group') {\n return (\n <SidebarIconBtn key={n.id} icon={I[n.icon]} title={n.label} />\n )\n }\n return (\n <SidebarIconBtn key={n.id} icon={I[n.icon]} title={n.label}\n active={activeId === n.id} onClick={() => onSelect(n.id)} badge={n.badge} />\n )\n })}\n </div>\n </aside>\n )\n}\n\nfunction SidebarIconBtn({ icon, title, active, onClick, badge }) {\n return (\n <button onClick={onClick} title={title}\n className={`relative w-10 h-10 rounded-xl flex items-center justify-center transition-colors\n ${active ? 'bg-lime-300 text-slate-900' : 'text-slate-500 hover:bg-slate-100 hover:text-slate-900'}`}>\n {icon}\n {badge && (\n <span className=\"absolute -top-0.5 -right-0.5 w-2 h-2 bg-lime-400 rounded-full ring-2 ring-white\" />\n )}\n </button>\n )\n}\n\nfunction SidebarExpanded({ onToggle, activeId, onSelect }) {\n const [openGroups, setOpenGroups] = useState({ 'mais-div': true })\n const toggleGroup = id => setOpenGroups(g => ({ ...g, [id]: !g[id] }))\n\n return (\n <aside className=\"w-64 bg-white border-r border-slate-200 flex flex-col shrink-0\">\n <header className=\"px-4 pt-4 pb-3 flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <VeployLogo size={26} />\n <span className=\"font-bold text-[18px] tracking-tight text-slate-900\">veploy</span>\n </div>\n <button onClick={onToggle} title=\"Recolher menu\"\n className=\"p-1.5 rounded-md text-slate-400 hover:bg-slate-100 hover:text-slate-700\">\n {I.chevDblL}\n </button>\n </header>\n\n <nav className=\"flex-1 overflow-y-auto px-3 pb-4 space-y-0.5\">\n {NAV_DATA.map((n, i) => {\n if (n.kind === 'section') {\n return (\n <div key={i} className=\"px-3 pt-4 pb-1.5 text-[10.5px] font-semibold uppercase tracking-[0.12em] text-slate-400\">\n {n.label}\n </div>\n )\n }\n if (n.kind === 'group') {\n const isOpen = openGroups[n.id]\n return (\n <div key={n.id}>\n <button onClick={() => toggleGroup(n.id)}\n className=\"w-full flex items-center gap-2.5 px-3 py-2 rounded-xl text-[13.5px] text-slate-500 hover:bg-slate-50 hover:text-slate-900\">\n <span className=\"w-5 h-5 flex items-center justify-center\">{I[n.icon]}</span>\n <span className=\"flex-1 text-left\">{n.label}</span>\n <span className={`text-slate-400 transition-transform ${isOpen ? '' : '-rotate-90'}`}>{I.chevDown}</span>\n </button>\n {isOpen && (\n <div className=\"ml-5 pl-4 border-l border-slate-200 mt-0.5 mb-1 space-y-0.5\">\n {n.children.map(child => (\n <button key={child.id} onClick={() => onSelect(child.id)}\n className={`w-full flex items-center gap-2 px-3 py-1.5 rounded-lg text-[13px]\n ${activeId === child.id ? 'bg-lime-300 text-slate-900 font-medium' : 'text-slate-600 hover:bg-slate-50 hover:text-slate-900'}`}>\n <span className=\"flex-1 text-left\">{child.label}</span>\n {child.badge && <NavBadge>{child.badge}</NavBadge>}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n }\n const active = activeId === n.id\n return (\n <button key={n.id} onClick={() => onSelect(n.id)}\n className={`w-full flex items-center gap-2.5 px-3 py-2 rounded-xl text-[13.5px] transition-colors\n ${active ? 'bg-lime-300 text-slate-900 font-semibold' : 'text-slate-700 hover:bg-slate-50'}`}>\n <span className={`w-5 h-5 flex items-center justify-center ${active ? 'text-slate-900' : 'text-slate-500'}`}>\n {I[n.icon]}\n </span>\n <span className=\"flex-1 text-left\">{n.label}</span>\n {n.badge && <NavBadge>{n.badge}</NavBadge>}\n </button>\n )\n })}\n </nav>\n </aside>\n )\n}\n\nfunction NavBadge({ children }) {\n return (\n <span className=\"text-[9.5px] font-bold tracking-wide bg-lime-300 text-slate-800 px-1.5 py-0.5 rounded-full\">\n {children}\n </span>\n )\n}\n\n/* ---------- Subcomponentes ---------- */\nfunction ConversationItem({ c, active, onClick }) {\n return (\n <button onClick={onClick}\n className={`w-full text-left px-3 py-3 border-l-2 transition-colors flex gap-3 ${\n active ? 'bg-slate-50 border-emerald-500' : 'border-transparent hover:bg-slate-50'\n }`}>\n <Avatar name={c.name} color={c.avatarColor} />\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-1.5 min-w-0\">\n <span className={`text-[13.5px] truncate ${c.unread ? 'font-semibold' : 'font-medium text-slate-800'}`}>{c.name}</span>\n {c.starred && <span className=\"text-amber-400\">{I.star}</span>}\n </div>\n <span className={`text-[11px] shrink-0 ${c.unread ? 'text-emerald-600 font-semibold' : 'text-slate-400'}`}>{c.waitFor}</span>\n </div>\n <div className=\"flex items-center justify-between gap-2 mt-0.5\">\n <p className={`text-[12.5px] truncate ${c.unread ? 'text-slate-700' : 'text-slate-500'}`}>{c.preview}</p>\n {c.unread > 0 && (\n <span className=\"shrink-0 min-w-[18px] h-[18px] px-1.5 rounded-full bg-emerald-500 text-white text-[10px] font-bold inline-flex items-center justify-center\">\n {c.unread}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-1.5 mt-1.5\">\n <Pill tone=\"slate\">{c.ticket}</Pill>\n </div>\n </div>\n </button>\n )\n}\n\nfunction ChatHeader({ c, onToggleDetails, detailsOpen, onOpenSearch, onTransfer }) {\n const [menuOpen, setMenuOpen] = useState(false)\n const menuRef = useRef(null)\n useEffect(() => {\n if (!menuOpen) return\n const onDoc = e => { if (menuRef.current && !menuRef.current.contains(e.target)) setMenuOpen(false) }\n document.addEventListener('mousedown', onDoc)\n return () => document.removeEventListener('mousedown', onDoc)\n }, [menuOpen])\n\n return (\n <header className=\"bg-white border-b border-slate-200 px-5 py-3 flex items-center gap-3 min-w-0\">\n <Avatar name={c.name} color={c.avatarColor} size=\"lg\" online />\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <h2 className=\"font-semibold text-[15px] truncate\">{c.name}</h2>\n </div>\n <div className=\"flex items-center gap-2 text-[12px] text-slate-500 mt-0.5 min-w-0\">\n <span className=\"inline-flex items-center gap-1 shrink-0\">{I.phone} {c.phone}</span>\n <span className=\"hidden lg:inline text-slate-300 shrink-0\">·</span>\n <span className=\"hidden lg:inline-flex items-center gap-1 shrink-0\">{I.tag} {c.ticket}</span>\n </div>\n </div>\n\n <div className=\"hidden 2xl:flex items-center gap-4 text-[12px] pr-3 border-r border-slate-200 shrink-0\">\n <div className=\"flex flex-col items-end leading-tight\">\n <span className=\"text-[9.5px] uppercase tracking-wide text-slate-400\">SLA</span>\n <span className=\"font-semibold text-amber-600 tabular-nums\">02:14</span>\n </div>\n <div className=\"flex flex-col items-end leading-tight\">\n <span className=\"text-[9.5px] uppercase tracking-wide text-slate-400\">1ª resposta</span>\n <span className=\"font-semibold text-emerald-600 tabular-nums\">00:48</span>\n </div>\n </div>\n\n <button className=\"shrink-0 text-[12.5px] font-medium bg-emerald-600 hover:bg-emerald-700 text-white px-3 py-1.5 rounded-lg inline-flex items-center gap-1.5\">\n {I.check} <span className=\"hidden lg:inline\">Resolver</span>\n </button>\n\n <div className=\"w-px h-6 bg-slate-200 shrink-0\" />\n\n <div className=\"flex items-center gap-0.5 shrink-0\">\n <button onClick={onToggleDetails} title=\"Detalhes\"\n className={`p-1.5 rounded-md ${detailsOpen ? 'bg-slate-900 text-white' : 'text-slate-500 hover:bg-slate-100'}`}>\n {I.panel}\n </button>\n <div ref={menuRef} className=\"relative\">\n <button onClick={() => setMenuOpen(v => !v)} title=\"Mais opções\"\n className={`p-1.5 rounded-md ${menuOpen ? 'bg-slate-100 text-slate-900' : 'text-slate-500 hover:bg-slate-100'}`}>\n {I.more}\n </button>\n {menuOpen && (\n <div className=\"absolute right-0 top-[calc(100%+6px)] z-20 w-56 bg-white border border-slate-200 rounded-xl shadow-lg py-1.5 text-[13px]\">\n <MenuItem icon={I.phone} label=\"Ligar\" onClick={() => setMenuOpen(false)} />\n <MenuItem icon={I.forward} label=\"Transferir\" onClick={() => { setMenuOpen(false); onTransfer?.() }} />\n <MenuItem icon={I.userPlus} label=\"Adicionar participantes\" onClick={() => setMenuOpen(false)} />\n <div className=\"my-1 h-px bg-slate-100\" />\n <MenuItem icon={I.search} label=\"Procurar na conversa\" onClick={() => { setMenuOpen(false); onOpenSearch?.() }} />\n <MenuItem icon={I.star} label=\"Marcar com estrela\" onClick={() => setMenuOpen(false)} />\n <MenuItem icon={I.tag} label=\"Editar tags\" onClick={() => setMenuOpen(false)} />\n <MenuItem icon={I.link} label=\"Copiar link da conversa\" onClick={() => setMenuOpen(false)} />\n <div className=\"my-1 h-px bg-slate-100\" />\n <MenuItem icon={I.x} label=\"Encerrar sem resolver\" tone=\"danger\" onClick={() => setMenuOpen(false)} />\n </div>\n )}\n </div>\n </div>\n </header>\n )\n}\n\nfunction MenuItem({ icon, label, onClick, tone }) {\n const color = tone === 'danger' ? 'text-rose-600 hover:bg-rose-50' : 'text-slate-700 hover:bg-slate-50'\n return (\n <button onClick={onClick}\n className={`w-full flex items-center gap-2.5 px-3 py-1.5 ${color}`}>\n <span className={tone === 'danger' ? 'text-rose-500' : 'text-slate-500'}>{icon}</span>\n <span className=\"flex-1 text-left\">{label}</span>\n </button>\n )\n}\n\nfunction SearchBar({ query, onChange, matches, currentIndex, onPrev, onNext, onClose }) {\n const inputRef = useRef(null)\n useEffect(() => { inputRef.current?.focus() }, [])\n useEffect(() => {\n const onKey = e => {\n if (e.key === 'Escape') onClose()\n if (e.key === 'Enter') { e.preventDefault(); e.shiftKey ? onPrev() : onNext() }\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [onClose, onPrev, onNext])\n\n return (\n <div className=\"bg-white border-b border-slate-200 px-5 py-2 flex items-center gap-3\">\n <span className=\"text-slate-400 shrink-0\">{I.search}</span>\n <input\n ref={inputRef}\n value={query}\n onChange={e => onChange(e.target.value)}\n placeholder=\"Procurar na conversa…\"\n className=\"flex-1 bg-transparent outline-none text-[13.5px] placeholder:text-slate-400 min-w-0\"\n />\n {query && (\n <span className=\"text-[12px] text-slate-500 tabular-nums shrink-0\">\n {matches.length === 0 ? 'sem resultados' : `${currentIndex + 1} de ${matches.length}`}\n </span>\n )}\n <div className=\"flex items-center gap-0.5 shrink-0\">\n <button onClick={onPrev} disabled={matches.length === 0}\n title=\"Anterior (Shift+Enter)\"\n className=\"p-1 rounded-md text-slate-500 hover:bg-slate-100 disabled:opacity-30 disabled:hover:bg-transparent\">\n {I.chevUp}\n </button>\n <button onClick={onNext} disabled={matches.length === 0}\n title=\"Próximo (Enter)\"\n className=\"p-1 rounded-md text-slate-500 hover:bg-slate-100 disabled:opacity-30 disabled:hover:bg-transparent\">\n {I.chevDown}\n </button>\n <button onClick={onClose} title=\"Fechar (Esc)\"\n className=\"p-1 rounded-md text-slate-500 hover:bg-slate-100 ml-1\">\n {I.x}\n </button>\n </div>\n </div>\n )\n}\n\nfunction highlightText(text, query, isCurrent) {\n if (!query) return text\n const q = query.trim()\n if (!q) return text\n const lower = text.toLowerCase()\n const ql = q.toLowerCase()\n if (!lower.includes(ql)) return text\n const parts = []\n let last = 0\n let idx = lower.indexOf(ql)\n let key = 0\n while (idx !== -1) {\n if (idx > last) parts.push(text.slice(last, idx))\n parts.push(\n <mark key={key++} className={`rounded px-0.5 ${isCurrent ? 'bg-amber-400 text-slate-900' : 'bg-yellow-200 text-slate-900'}`}>\n {text.slice(idx, idx + ql.length)}\n </mark>\n )\n last = idx + ql.length\n idx = lower.indexOf(ql, last)\n }\n if (last < text.length) parts.push(text.slice(last))\n return parts\n}\n\nfunction DayDivider({ label }) {\n return (\n <div className=\"flex items-center justify-center my-3\">\n <span className=\"text-[11px] font-medium text-slate-600 bg-white border border-slate-200 rounded-full px-2.5 py-0.5 shadow-soft\">{label}</span>\n </div>\n )\n}\n\nfunction Ticks({ status }) {\n if (status === 'sent') return <span className=\"text-slate-400\">✓</span>\n if (status === 'delivered') return <span className=\"text-slate-400\">✓✓</span>\n if (status === 'read') return <span className=\"text-sky-500\">✓✓</span>\n return null\n}\n\nfunction Message({ m, searchQuery = '', isCurrentMatch = false }) {\n if (m.side === 'system') {\n return (\n <div className=\"flex justify-center my-2\">\n <span className=\"text-[11px] text-slate-500 bg-slate-100 rounded-full px-2.5 py-0.5\">{m.text} · {m.time}</span>\n </div>\n )\n }\n if (m.side === 'note') {\n return (\n <div className=\"flex justify-end my-2\">\n <div className={`max-w-[70%] bg-yellow-50 border rounded-2xl rounded-tr-sm px-3.5 py-2.5 shadow-soft ${isCurrentMatch ? 'border-amber-500 ring-2 ring-amber-300' : 'border-yellow-200'}`}>\n <div className=\"flex items-center justify-between gap-3 mb-1\">\n <span className=\"text-[11px] font-semibold text-yellow-800 inline-flex items-center gap-1\">{I.pin} Nota interna · {m.author}</span>\n <span className=\"text-[11px] text-yellow-700\">{m.time}</span>\n </div>\n <p className=\"text-[13.5px] text-yellow-900 leading-relaxed\">{highlightText(m.text, searchQuery, isCurrentMatch)}</p>\n </div>\n </div>\n )\n }\n\n const isOut = m.side === 'out'\n return (\n <div className={`flex ${isOut ? 'justify-end' : 'justify-start'} group`}>\n {!isOut && <Avatar name=\"Samir Patel\" color=\"bg-violet-500\" size=\"sm\" />}\n <div className={`mx-2 max-w-[68%] ${isOut ? 'order-first' : ''}`}>\n <div className={`relative px-3.5 py-2.5 rounded-2xl shadow-soft ${\n isOut\n ? 'bg-emerald-600 text-white rounded-tr-sm'\n : 'bg-white border border-slate-200 text-slate-800 rounded-tl-sm'\n } ${isCurrentMatch ? 'ring-2 ring-amber-400' : ''}`}>\n {m.kind === 'text' && <p className=\"text-[13.5px] leading-relaxed whitespace-pre-wrap\">{highlightText(m.text, searchQuery, isCurrentMatch)}</p>}\n\n {m.kind === 'image' && (\n <div className=\"-mx-1 -mt-1\">\n {m.mediaUrl ? (\n <a href={m.mediaUrl} target=\"_blank\" rel=\"noreferrer\">\n <img src={m.mediaUrl} alt={m.caption || 'imagem'} className=\"w-64 max-h-72 object-cover rounded-lg\" />\n </a>\n ) : (\n <div className=\"w-64 h-40 rounded-lg bg-gradient-to-br from-slate-200 to-slate-300 flex items-center justify-center text-slate-500\">\n {I.image}\n </div>\n )}\n {m.caption && <p className=\"text-[13px] mt-2\">{highlightText(m.caption, searchQuery, isCurrentMatch)}</p>}\n </div>\n )}\n\n {m.kind === 'video' && (\n <div className=\"-mx-1 -mt-1\">\n {m.mediaUrl\n ? <video src={m.mediaUrl} controls className=\"w-64 rounded-lg\" />\n : <div className=\"w-64 h-40 rounded-lg bg-slate-200 flex items-center justify-center text-slate-500\">🎥</div>}\n {m.caption && <p className=\"text-[13px] mt-2\">{highlightText(m.caption, searchQuery, isCurrentMatch)}</p>}\n </div>\n )}\n\n {m.kind === 'document' && (\n <a href={m.mediaUrl || '#'} target=\"_blank\" rel=\"noreferrer\"\n className={`flex items-center gap-2.5 min-w-[200px] rounded-lg px-2 py-1.5 ${isOut ? 'bg-emerald-700/40' : 'bg-slate-100'}`}>\n <span className={isOut ? 'text-emerald-100' : 'text-slate-500'}>{I.file}</span>\n <span className=\"text-[13px] truncate flex-1\">{m.meta || m.caption || 'arquivo'}</span>\n </a>\n )}\n\n {m.kind === 'audio' && (\n <div className=\"flex items-center gap-3 min-w-[220px]\">\n <button className={`w-9 h-9 rounded-full inline-flex items-center justify-center ${isOut ? 'bg-emerald-700' : 'bg-slate-100 text-slate-700'}`}>\n ▶\n </button>\n <div className=\"flex-1\">\n <div className={`h-1 rounded-full ${isOut ? 'bg-emerald-700' : 'bg-slate-200'} relative overflow-hidden`}>\n <div className={`h-full w-2/5 ${isOut ? 'bg-white' : 'bg-emerald-500'}`} />\n </div>\n <div className={`text-[11px] mt-1 ${isOut ? 'text-emerald-100' : 'text-slate-500'}`}>{m.duration}</div>\n </div>\n <span className={isOut ? 'text-emerald-100' : 'text-slate-400'}>{I.mic}</span>\n </div>\n )}\n\n <div className={`flex items-center gap-1 justify-end mt-1 text-[10.5px] ${isOut ? 'text-emerald-100' : 'text-slate-400'}`}>\n {m.author && !isOut === false && <span className=\"mr-1\">{m.author}</span>}\n <span>{m.time}</span>\n {isOut && <Ticks status={m.status} />}\n </div>\n </div>\n\n {/* Hover actions */}\n <div className={`flex gap-1 mt-1 opacity-0 group-hover:opacity-100 transition-opacity ${isOut ? 'justify-end' : 'justify-start'}`}>\n <HoverBtn icon={I.reply} />\n <HoverBtn icon={I.forward} />\n <HoverBtn icon={I.emoji} />\n <HoverBtn icon={I.more} />\n </div>\n </div>\n {isOut && <Avatar name={m.author || 'Maria Eduarda'} color={m.author === 'Alissa Mendes' ? 'bg-sky-500' : 'bg-amber-500'} size=\"sm\" />}\n </div>\n )\n}\n\nfunction HoverBtn({ icon }) {\n return (\n <button className=\"p-1 rounded-md text-slate-400 bg-white border border-slate-200 hover:text-slate-700 shadow-soft\">{icon}</button>\n )\n}\n\nfunction ComposeBtn({ icon, label }) {\n return (\n <button className=\"text-slate-500 hover:bg-slate-100 px-1.5 py-1.5 rounded-md inline-flex items-center gap-1 text-[12px]\">\n {icon} {label && <span>{label}</span>}\n </button>\n )\n}\n\nfunction fmtSecs(s) {\n const m = Math.floor(s / 60)\n return `${m}:${String(s % 60).padStart(2, '0')}`\n}\n\n// Waveform estilo WhatsApp: acumula amostras de volume ao longo do tempo e\n// rola da direita p/ esquerda, mostrando o áudio \"passando\".\nfunction AudioWave({ analyserRef }) {\n const MAX = 56\n const [samples, setSamples] = useState([])\n useEffect(() => {\n let raf\n let last = 0\n const buf = []\n const loop = (ts) => {\n const an = analyserRef?.current\n if (an && ts - last > 70) {\n last = ts\n const data = new Uint8Array(an.fftSize)\n an.getByteTimeDomainData(data)\n let sum = 0\n for (let i = 0; i < data.length; i++) {\n const v = (data[i] - 128) / 128\n sum += v * v\n }\n const rms = Math.sqrt(sum / data.length)\n buf.push(Math.min(1, rms * 2.4))\n if (buf.length > MAX) buf.shift()\n setSamples([...buf])\n }\n raf = requestAnimationFrame(loop)\n }\n raf = requestAnimationFrame(loop)\n return () => cancelAnimationFrame(raf)\n }, [analyserRef])\n return (\n <div className=\"flex items-center justify-start gap-[2px] h-7 flex-1 min-w-0 overflow-hidden\">\n {samples.map((v, i) => (\n <span key={i} style={{ height: `${Math.max(2, v * 26)}px` }}\n className=\"w-[2px] bg-rose-400 rounded-full shrink-0\" />\n ))}\n </div>\n )\n}\n\nfunction AttachMenu({ onImage, onFile }) {\n const [open, setOpen] = useState(false)\n const ref = useRef(null)\n useEffect(() => {\n if (!open) return\n const onDoc = e => { if (ref.current && !ref.current.contains(e.target)) setOpen(false) }\n document.addEventListener('mousedown', onDoc)\n return () => document.removeEventListener('mousedown', onDoc)\n }, [open])\n\n return (\n <div ref={ref} className=\"relative\">\n <button onClick={() => setOpen(v => !v)} title=\"Anexar\"\n className={`px-1.5 py-1.5 rounded-md inline-flex items-center ${open ? 'bg-slate-100 text-slate-900' : 'text-slate-500 hover:bg-slate-100'}`}>\n {I.paperclip}\n </button>\n {open && (\n <div className=\"absolute bottom-[calc(100%+6px)] left-0 z-20 w-44 bg-white border border-slate-200 rounded-xl shadow-lg py-1.5 text-[13px]\">\n <MenuItem icon={I.image} label=\"Imagem\" onClick={() => { setOpen(false); onImage?.() }} />\n <MenuItem icon={I.file} label=\"Documento\" onClick={() => { setOpen(false); onFile?.() }} />\n </div>\n )}\n </div>\n )\n}\n\n/* ---------- Painel de detalhes ---------- */\nfunction DetailsPanel({ c, onClose }) {\n const [tab, setTab] = useState('details')\n return (\n <aside className=\"w-[340px] bg-white border-l border-slate-200 flex flex-col\">\n <header className=\"px-4 py-3 border-b border-slate-200 flex items-center justify-between\">\n <div className=\"flex gap-3 text-[12.5px]\">\n {[\n ['details', 'Detalhes'],\n ['notes', 'Notas'],\n ['history', 'Histórico'],\n ].map(([k, l]) => (\n <button key={k} onClick={() => setTab(k)}\n className={`pb-2 -mb-3 font-medium border-b-2 ${tab === k ? 'border-slate-900 text-slate-900' : 'border-transparent text-slate-500 hover:text-slate-800'}`}>\n {l}\n </button>\n ))}\n </div>\n <div className=\"flex items-center gap-1\">\n <button className=\"p-1.5 rounded-md text-slate-500 hover:bg-slate-100\">{I.external}</button>\n <button onClick={onClose} className=\"p-1.5 rounded-md text-slate-500 hover:bg-slate-100\">{I.x}</button>\n </div>\n </header>\n\n <div className=\"flex-1 overflow-y-auto\">\n {tab === 'details' && <DetailsTab c={c} />}\n {tab === 'notes' && <NotesTab />}\n {tab === 'history' && <HistoryTab />}\n </div>\n </aside>\n )\n}\n\nfunction Section({ title, action, children, defaultOpen = true }) {\n const [open, setOpen] = useState(defaultOpen)\n return (\n <div className=\"border-b border-slate-100\">\n <button onClick={() => setOpen(v => !v)} className=\"w-full px-4 pt-4 pb-2 flex items-center justify-between\">\n <span className=\"text-[11px] font-semibold uppercase tracking-wider text-slate-500\">{title}</span>\n <span className={`text-slate-400 transition-transform ${open ? '' : '-rotate-90'}`}>{I.chevDown}</span>\n </button>\n {open && <div className=\"px-4 pb-4 space-y-2.5\">{children}{action}</div>}\n </div>\n )\n}\n\nfunction Row({ label, children }) {\n return (\n <div className=\"flex items-start gap-3 text-[12.5px]\">\n <span className=\"w-28 shrink-0 text-slate-500 pt-0.5\">{label}</span>\n <div className=\"flex-1 min-w-0 text-slate-800\">{children}</div>\n </div>\n )\n}\n\nconst PROPERTY_CATALOG = [\n { id: '856235', title: 'Apto 80m² · Jardins · 2 dorm' },\n { id: '856301', title: 'Apto 65m² · Vila Mariana · 2 dorm' },\n { id: '857188', title: 'Cobertura 120m² · Itaim · 3 dorm' },\n { id: '854902', title: 'Casa 180m² · Alto de Pinheiros · 4 dorm' },\n { id: '855417', title: 'Studio 35m² · Pinheiros · 1 dorm' },\n { id: '858033', title: 'Apto 95m² · Moema · 3 dorm' },\n { id: '858720', title: 'Apto 110m² · Perdizes · 3 dorm' },\n]\n\nfunction PropertyLinker() {\n const [linked, setLinked] = useState([PROPERTY_CATALOG[0], PROPERTY_CATALOG[5]])\n const [query, setQuery] = useState('')\n const [adding, setAdding] = useState(false)\n const inputRef = useRef(null)\n const wrapRef = useRef(null)\n\n useEffect(() => { if (adding) inputRef.current?.focus() }, [adding])\n\n useEffect(() => {\n if (!adding) return\n const onDoc = e => { if (wrapRef.current && !wrapRef.current.contains(e.target)) closeAdd() }\n document.addEventListener('mousedown', onDoc)\n return () => document.removeEventListener('mousedown', onDoc)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [adding])\n\n const suggestions = useMemo(() => {\n const q = query.trim().toLowerCase()\n const linkedIds = new Set(linked.map(p => p.id))\n return PROPERTY_CATALOG.filter(p =>\n !linkedIds.has(p.id) &&\n (q === '' || p.id.toLowerCase().includes(q) || p.title.toLowerCase().includes(q))\n ).slice(0, 5)\n }, [query, linked])\n\n const closeAdd = () => { setAdding(false); setQuery('') }\n const addProperty = p => { setLinked(l => [...l, p]); closeAdd() }\n const removeProperty = id => setLinked(l => l.filter(p => p.id !== id))\n\n return (\n <div ref={wrapRef} className=\"w-full\">\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1\">\n {linked.map(p => (\n <div key={p.id} className=\"group inline-flex items-center gap-0.5 text-[13px] leading-tight\">\n <a href=\"#\" title={p.title}\n className=\"text-slate-700 underline underline-offset-2 hover:text-emerald-700 inline-flex items-center gap-1 tabular-nums\">\n {p.id}\n <span className=\"text-slate-400 group-hover:text-emerald-600\">{I.external}</span>\n </a>\n <button onClick={() => removeProperty(p.id)} title=\"Desvincular\"\n className=\"opacity-0 group-hover:opacity-100 p-0.5 text-slate-400 hover:text-rose-500 transition-opacity\">\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth=\"2.5\" fill=\"none\" strokeLinecap=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n <line x1=\"6\" y1=\"18\" x2=\"18\" y2=\"6\"/>\n </svg>\n </button>\n </div>\n ))}\n {!adding && (\n <button onClick={() => setAdding(true)} title=\"Vincular imóvel\"\n className=\"text-[11px] text-slate-500 hover:text-slate-800 inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded-full border border-dashed border-slate-300 hover:border-slate-400 hover:bg-slate-50\">\n + imóvel\n </button>\n )}\n </div>\n\n {adding && (\n <div className=\"relative mt-2\">\n <span className=\"absolute left-2 top-1/2 -translate-y-1/2 text-slate-400 pointer-events-none\">{I.search}</span>\n <input\n ref={inputRef}\n value={query}\n onChange={e => setQuery(e.target.value)}\n onKeyDown={e => { if (e.key === 'Escape') closeAdd() }}\n placeholder=\"Código ou bairro…\"\n className=\"w-full pl-7 pr-2 py-1.5 text-[12px] rounded-lg bg-white border border-slate-300 outline-none focus:border-slate-400 placeholder:text-slate-400\"\n />\n {suggestions.length > 0 && (\n <div className=\"absolute top-full left-0 right-0 mt-1 z-30 bg-white border border-slate-200 rounded-lg shadow-lg overflow-hidden\">\n {suggestions.map(p => (\n <button key={p.id} onClick={() => addProperty(p)}\n className=\"w-full text-left px-2.5 py-1.5 hover:bg-slate-50 flex items-center gap-2 border-b border-slate-100 last:border-b-0\">\n <span className=\"text-[12.5px] font-mono font-semibold text-slate-700 tabular-nums\">{p.id}</span>\n <span className=\"text-slate-300\">·</span>\n <span className=\"text-[11.5px] text-slate-500 truncate flex-1 min-w-0\">{p.title}</span>\n <span className=\"text-slate-300 shrink-0\">{I.plus}</span>\n </button>\n ))}\n </div>\n )}\n {query.trim() && suggestions.length === 0 && (\n <div className=\"absolute top-full left-0 right-0 mt-1 z-30 bg-white border border-slate-200 rounded-lg shadow-lg px-3 py-2 text-[12px] text-slate-500\">\n Nenhum imóvel encontrado para \"{query.trim()}\".\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n\nfunction LinkRow({ icon, label }) {\n return (\n <button className=\"w-full flex items-center gap-2 text-[13px] text-slate-700 hover:bg-slate-50 -mx-1 px-1 py-1 rounded-md\">\n <span className=\"text-slate-500\">{icon}</span>\n <span className=\"flex-1 text-left\">{label}</span>\n <span className=\"text-slate-400\">{I.plus}</span>\n </button>\n )\n}\n\nfunction ActionRow({ icon, label, children, onClick }) {\n const [open, setOpen] = useState(false)\n const hasSubmenu = !!children\n const handle = () => hasSubmenu ? setOpen(v => !v) : onClick?.()\n return (\n <div>\n <button onClick={handle}\n className=\"w-full flex items-center gap-2 text-[13px] text-slate-700 hover:bg-slate-50 -mx-1 px-1 py-1 rounded-md\">\n <span className=\"text-slate-500\">{icon}</span>\n <span className=\"flex-1 text-left\">{label}</span>\n <span className={`text-slate-400 transition-transform ${hasSubmenu && open ? 'rotate-90' : ''}`}>\n {hasSubmenu ? I.chevRight : I.plus}\n </span>\n </button>\n {hasSubmenu && open && (\n <div className=\"ml-7 mt-0.5 mb-1 border-l border-slate-200 pl-3 space-y-0.5\">\n {children}\n </div>\n )}\n </div>\n )\n}\n\nfunction SubAction({ label, onClick }) {\n return (\n <button onClick={onClick}\n className=\"w-full text-left text-[12.5px] text-slate-600 hover:text-slate-900 hover:bg-slate-50 -mx-1 px-1.5 py-1 rounded-md\">\n {label}\n </button>\n )\n}\n\nfunction DetailsTab({ c }) {\n const palette = ['sky', 'rose', 'violet', 'emerald', 'amber', 'slate']\n const [tags, setTags] = useState([\n { label: 'Comprador', tone: 'sky' },\n { label: 'Quente', tone: 'rose' },\n { label: 'Apto 2-3 dorm', tone: 'violet' },\n { label: 'Zona Sul', tone: 'emerald' },\n { label: 'Até R$ 900k', tone: 'amber' },\n ])\n const [expanded, setExpanded] = useState(false)\n const [adding, setAdding] = useState(false)\n const [newTag, setNewTag] = useState('')\n const tagInputRef = useRef(null)\n useEffect(() => { if (adding) tagInputRef.current?.focus() }, [adding])\n\n const VISIBLE = 3\n const shownTags = expanded ? tags : tags.slice(0, VISIBLE)\n const hiddenCount = Math.max(0, tags.length - VISIBLE)\n\n const addTag = () => {\n const v = newTag.trim()\n if (v) setTags(t => [...t, { label: v, tone: palette[t.length % palette.length] }])\n setNewTag('')\n setAdding(false)\n }\n const removeTag = i => setTags(t => t.filter((_, idx) => idx !== i))\n\n return (\n <>\n <div className=\"px-4 pt-4 pb-3 flex items-start gap-3\">\n <Avatar name={c.name} color={c.avatarColor} size=\"xl\" online />\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-semibold truncate\">{c.name}</div>\n <div className=\"text-[12px] text-slate-500 truncate\">{c.phone}</div>\n <div className=\"flex flex-wrap gap-1 mt-1.5\">\n {shownTags.map((t, i) => (\n <Pill key={`${t.label}-${i}`} tone={t.tone}>\n {t.label}\n <button onClick={() => removeTag(i)} title=\"Remover\"\n className=\"ml-0.5 -mr-0.5 opacity-60 hover:opacity-100\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth=\"3\" fill=\"none\" strokeLinecap=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n <line x1=\"6\" y1=\"18\" x2=\"18\" y2=\"6\"/>\n </svg>\n </button>\n </Pill>\n ))}\n {!expanded && hiddenCount > 0 && (\n <button onClick={() => setExpanded(true)}\n className=\"text-[11px] text-slate-500 hover:text-slate-800 px-1.5 py-0.5 rounded-full hover:bg-slate-100 self-center\">\n +{hiddenCount}\n </button>\n )}\n {expanded && tags.length > VISIBLE && (\n <button onClick={() => setExpanded(false)}\n className=\"text-[11px] text-slate-500 hover:text-slate-800 px-1.5 py-0.5 rounded-full hover:bg-slate-100 self-center\">\n mostrar menos\n </button>\n )}\n {adding ? (\n <input\n ref={tagInputRef}\n value={newTag}\n onChange={e => setNewTag(e.target.value)}\n onBlur={addTag}\n onKeyDown={e => {\n if (e.key === 'Enter') { e.preventDefault(); addTag() }\n if (e.key === 'Escape') { setNewTag(''); setAdding(false) }\n }}\n placeholder=\"nova tag…\"\n className=\"text-[11px] px-2 py-0.5 rounded-full bg-white border border-slate-300 outline-none focus:border-slate-500 w-24\"\n />\n ) : (\n <button onClick={() => { setExpanded(true); setAdding(true) }} title=\"Adicionar tag\"\n className=\"text-[11px] text-slate-500 hover:text-slate-800 inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded-full border border-dashed border-slate-300 hover:border-slate-400 hover:bg-slate-50\">\n + tag\n </button>\n )}\n </div>\n </div>\n </div>\n\n <Section title=\"Atribuição\">\n <Row label=\"Atendente\">\n <span className=\"inline-flex items-center gap-1.5\">\n <Avatar name=\"Maria Eduarda\" size=\"sm\" color=\"bg-amber-500\" /> Maria Eduarda\n </span>\n </Row>\n <Row label=\"Departamento\">\n <span className=\"inline-flex items-center gap-1.5\">\n <span className=\"w-5 h-5 rounded-md bg-rose-500 text-white text-[10px] flex items-center justify-center font-bold\">CO</span>\n Comercial\n </span>\n </Row>\n <Row label=\"Origem\">\n <span className=\"inline-flex items-center gap-1.5 text-emerald-700\">{I.whatsapp} WhatsApp Business</span>\n </Row>\n </Section>\n\n <Section title=\"Ticket\">\n <Row label=\"Tipo\"><Pill tone=\"rose\">🏠 Interesse em compra</Pill></Row>\n <Row label=\"Status\"><Pill tone={statusInfo[c.status].tone}>{statusInfo[c.status].label}</Pill></Row>\n <Row label=\"Prioridade\"><Pill tone={c.priority === 'urgent' ? 'rose' : c.priority === 'high' ? 'amber' : 'slate'}>Alta</Pill></Row>\n <Row label=\"Imóveis\"><PropertyLinker /></Row>\n <Row label=\"Aberto\">há 18 min</Row>\n </Section>\n\n <Section title=\"Ações\">\n <ActionRow icon={I.userPlus} label=\"Adicionar cliente\">\n <SubAction label=\"Proprietário\" />\n <SubAction label=\"Cliente\" />\n </ActionRow>\n <ActionRow icon={I.checkCircle} label=\"Criar tarefa\" />\n <ActionRow icon={I.calendar} label=\"Agendar visita\" />\n <ActionRow icon={I.file} label=\"Enviar documentos\" />\n </Section>\n\n </>\n )\n}\n\nfunction NotesTab() {\n return (\n <div className=\"p-4 space-y-3\">\n <div className=\"bg-yellow-50 border border-yellow-200 rounded-xl p-3\">\n <div className=\"flex items-center justify-between mb-1.5\">\n <span className=\"text-[11.5px] font-semibold text-yellow-800 inline-flex items-center gap-1\">{I.pin} Maria Eduarda</span>\n <span className=\"text-[11px] text-yellow-700\">há 11 min</span>\n </div>\n <p className=\"text-[13px] text-yellow-900\">Cliente Gold — perfil quente, decisão rápida. Já visitou conosco em fev/26 (ticket #7892), gostou da região mas o imóvel estava acima do orçamento.</p>\n </div>\n <div className=\"bg-yellow-50 border border-yellow-200 rounded-xl p-3\">\n <div className=\"flex items-center justify-between mb-1.5\">\n <span className=\"text-[11.5px] font-semibold text-yellow-800 inline-flex items-center gap-1\">{I.pin} Alissa Mendes</span>\n <span className=\"text-[11px] text-yellow-700\">há 4 min</span>\n </div>\n <p className=\"text-[13px] text-yellow-900\">Confirmei com os proprietários — Vila Mariana e Moema liberados pra visita amanhã das 10h às 17h.</p>\n </div>\n <button className=\"w-full text-[12.5px] py-2 rounded-lg border border-dashed border-slate-300 text-slate-500 hover:bg-slate-50 inline-flex items-center justify-center gap-1\">\n {I.plus} Nova nota\n </button>\n </div>\n )\n}\n\nfunction HistoryTab() {\n const items = [\n { t: 'Ticket #7892 — Visita apto Itaim', s: 'Sem proposta', when: 'fev/26', tone: 'slate' },\n { t: 'Ticket #7541 — Interesse em cobertura', s: 'Resolvido', when: 'jan/26', tone: 'emerald' },\n { t: 'Ticket #7233 — Pedido de matrícula', s: 'Resolvido', when: 'dez/25', tone: 'emerald' },\n { t: 'Ticket #6890 — Primeira simulação', s: 'Resolvido', when: 'out/25', tone: 'emerald' },\n ]\n return (\n <div className=\"p-4 space-y-2\">\n {items.map((it, i) => (\n <button key={i} className=\"w-full text-left bg-white border border-slate-200 hover:border-slate-300 rounded-xl p-3 flex items-start gap-3\">\n <span className=\"w-8 h-8 rounded-lg bg-slate-100 text-slate-500 flex items-center justify-center\">{I.chat}</span>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-[13px] font-medium truncate\">{it.t}</p>\n <div className=\"flex items-center gap-2 mt-1\">\n <Pill tone={it.tone}>{it.s}</Pill>\n <span className=\"text-[11.5px] text-slate-500\">{it.when}</span>\n </div>\n </div>\n <span className=\"text-slate-400 mt-1\">{I.chevRight}</span>\n </button>\n ))}\n </div>\n )\n}\n","// src/lib/useInbox.js\n// Live inbox data layer, driven by the injected config (via <PloyChat>).\n'use client'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { usePloy } from './context'\nimport { mapConversation, mapMessage, nowHHMM } from './mappers'\n\nexport function useInbox() {\n const { client } = usePloy()\n const live = client.live\n\n const [conversations, setConversations] = useState([])\n const [activeId, setActiveId] = useState(null)\n const [messages, setMessages] = useState([])\n const [channels, setChannels] = useState([])\n const [agents, setAgents] = useState([])\n const [me, setMe] = useState(null)\n const [tenantId, setTenantId] = useState(null)\n const [loading, setLoading] = useState(live)\n const [error, setError] = useState(null)\n const activeIdRef = useRef(null)\n activeIdRef.current = activeId\n\n const api = client.apiFetch\n\n // identity + tenant (tenant drives the realtime topic; may differ from workspace)\n useEffect(() => {\n if (!live) return\n api('/v1/me')\n .then((m) => { if (m?.user?.id) setMe(m.user.id); if (m?.tenant_id) setTenantId(m.tenant_id) })\n .catch(() => {})\n }, [live, api])\n\n const loadConversations = useCallback(async () => {\n if (!live) return\n try {\n const data = await api('/v1/conversations?limit=50')\n const mapped = (data || []).map(mapConversation)\n setConversations(mapped)\n setActiveId((a) => a || mapped[0]?.id || null)\n } catch (e) { setError(e.message) } finally { setLoading(false) }\n }, [live, api])\n\n const loadMessages = useCallback(async (convId) => {\n if (!live || !convId) return\n try {\n const res = await api(`/v1/conversations/${convId}/messages?limit=50`)\n setMessages((res?.messages || []).slice().reverse().map(mapMessage))\n } catch (e) { setError(e.message) }\n }, [live, api])\n\n const loadChannels = useCallback(async () => {\n if (!live) return []\n try { const l = (await api('/v1/channels')) || []; setChannels(l); return l } catch { return [] }\n }, [live, api])\n\n const loadAgents = useCallback(async () => {\n if (!live) return []\n try { const l = (await api('/v1/agents')) || []; setAgents(l); return l } catch { return [] }\n }, [live, api])\n\n useEffect(() => { loadConversations(); loadChannels(); loadAgents() }, [loadConversations, loadChannels, loadAgents])\n useEffect(() => { loadMessages(activeId) }, [activeId, loadMessages])\n\n const markRead = useCallback(async (convId) => {\n if (!live || !convId) return\n setConversations((cs) => cs.map((c) => (c.id === convId ? { ...c, unread: 0 } : c)))\n try { await api(`/v1/conversations/${convId}/read`, { method: 'POST' }) } catch {}\n }, [live, api])\n\n const assign = useCallback(async (convId, userId) => {\n if (!live || !convId) return\n setConversations((cs) => cs.map((c) => (c.id === convId ? { ...c, _raw: { ...c._raw, assignee_user_id: userId } } : c)))\n try { await api(`/v1/conversations/${convId}/assign`, { method: 'POST', body: { assignee_user_id: userId } }) }\n catch (e) { setError(e.message) }\n }, [live, api])\n\n const send = useCallback(async (text, isNote = false) => {\n const t = (text || '').trim()\n if (!t || !live || !activeIdRef.current) return\n const tmpId = `tmp${Date.now()}`\n setMessages((ms) => [...ms, isNote\n ? { id: tmpId, side: 'note', kind: 'text', text: t, time: nowHHMM() }\n : { id: tmpId, side: 'out', kind: 'text', text: t, time: nowHHMM(), status: 'pending' }])\n try {\n const saved = await api(`/v1/conversations/${activeIdRef.current}/messages`, {\n method: 'POST', body: isNote ? { text: t, note: true } : { text: t },\n })\n setMessages((ms) => ms.map((m) => (m.id === tmpId ? mapMessage(saved) : m)))\n } catch {\n setMessages((ms) => ms.map((m) => (m.id === tmpId ? { ...m, status: 'failed' } : m)))\n }\n }, [live, api])\n\n const sendMedia = useCallback(async ({ data, mime, kind, filename, previewUrl, caption }) => {\n if (!live || !activeIdRef.current || !data) return\n const tmpId = `tmp${Date.now()}`\n setMessages((ms) => [...ms, { id: tmpId, side: 'out', kind, mediaUrl: previewUrl || '', caption: caption || '', meta: filename || mime || '', time: nowHHMM(), status: 'pending' }])\n try {\n const saved = await api(`/v1/conversations/${activeIdRef.current}/messages`, {\n method: 'POST', body: { media: { data, mime, kind, filename }, caption },\n })\n const mapped = mapMessage(saved)\n setMessages((ms) => ms.map((m) => (m.id === tmpId ? { ...mapped, mediaUrl: mapped.mediaUrl || previewUrl || '' } : m)))\n } catch {\n setMessages((ms) => ms.map((m) => (m.id === tmpId ? { ...m, status: 'failed' } : m)))\n }\n }, [live, api])\n\n const createChannel = useCallback((displayName) => api('/v1/channels', { method: 'POST', body: { display_name: displayName } }), [api])\n const connect = useCallback((id) => api(`/v1/channels/${id}/connect`, { method: 'POST' }), [api])\n const channelStatus = useCallback((id) => api(`/v1/channels/${id}/status`), [api])\n\n // realtime fan-out (Supabase broadcast on inbox:{tenant})\n useEffect(() => {\n if (!live || !tenantId) return\n const sb = client.supabase\n if (!sb) return\n const ch = sb\n .channel(`inbox:${tenantId}`)\n .on('broadcast', { event: 'message.created' }, ({ payload }) => {\n if (payload?.conversation_id === activeIdRef.current) {\n setMessages((ms) => (ms.some((m) => m.id === payload.id) ? ms : [...ms, mapMessage(payload)]))\n }\n loadConversations()\n })\n .on('broadcast', { event: 'message.updated' }, ({ payload }) => {\n setMessages((ms) => ms.map((m) => (m.id === payload?.id ? { ...m, status: payload.status || m.status } : m)))\n })\n .on('broadcast', { event: 'conversation.updated' }, () => loadConversations())\n .on('broadcast', { event: 'channel.updated' }, () => loadChannels())\n .subscribe()\n return () => { sb.removeChannel(ch) }\n }, [live, tenantId, client, loadConversations, loadChannels])\n\n return {\n live, loading, error,\n conversations, activeId, setActiveId, messages,\n send, sendMedia, markRead, assign, me, agents, loadAgents,\n channels, loadChannels, createChannel, connect, channelStatus,\n }\n}\n","'use client'\nimport { createContext, useContext, useMemo } from 'react'\nimport { createPloyClient } from './client'\n\n// Config is injected by the host via <PloyChat> props — no env, no localStorage.\nconst PloyContext = createContext(null)\n\nexport function PloyConfigProvider({ config, children }) {\n // memo by the identity-relevant fields so the client isn't rebuilt each render\n const value = useMemo(() => {\n const client = createPloyClient(config)\n return { config, client }\n }, [config.apiBase, config.workspaceId, config.getToken, config.supabase, config.supabaseUrl, config.supabaseAnonKey])\n return <PloyContext.Provider value={value}>{children}</PloyContext.Provider>\n}\n\nexport function usePloy() {\n const ctx = useContext(PloyContext)\n if (!ctx) throw new Error('PloyChat components must be used within <PloyChat>')\n return ctx\n}\n","// src/lib/client.js\n// Builds a config-driven client (HTTP + realtime) from the injected config.\n// config: {\n// apiBase: string, // chat-api base URL\n// workspaceId: string, // host workspace/tenant the user is in\n// getToken: () => Promise<string|null>, // host session access_token\n// supabase?: SupabaseClient, // host's client (preferred, for realtime)\n// supabaseUrl?, supabaseAnonKey?, // OR url+anon to create one\n// }\nimport { createClient } from '@supabase/supabase-js'\n\nexport function createPloyClient(config = {}) {\n const apiBase = (config.apiBase || '').replace(/\\/+$/, '')\n\n async function apiFetch(path, { method = 'GET', body } = {}) {\n const headers = {}\n if (body) headers['Content-Type'] = 'application/json'\n const token = config.getToken ? await config.getToken() : null\n if (token) headers['Authorization'] = `Bearer ${token}`\n if (config.workspaceId) headers['X-Workspace'] = config.workspaceId\n\n const res = await fetch(`${apiBase}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n })\n const txt = await res.text()\n let json\n try { json = txt ? JSON.parse(txt) : null } catch { json = txt }\n if (!res.ok) {\n const err = new Error(json?.message || json?.error || `HTTP ${res.status}`)\n err.status = res.status\n err.body = json\n throw err\n }\n return json\n }\n\n // realtime client: prefer the host's supabase client; else build from url+anon\n let supabase = config.supabase || null\n if (!supabase && config.supabaseUrl && config.supabaseAnonKey) {\n supabase = createClient(config.supabaseUrl, config.supabaseAnonKey, {\n auth: { persistSession: false, autoRefreshToken: false },\n })\n }\n\n const live = !!(config.apiBase && config.workspaceId && config.getToken)\n\n return { apiFetch, supabase, live }\n}\n","// src/lib/mappers.js — backend (inbox_*) shapes -> the UI shapes App.jsx expects.\nconst PALETTE = ['bg-violet-500', 'bg-rose-500', 'bg-sky-500', 'bg-amber-500', 'bg-emerald-600', 'bg-slate-700']\nfunction hash(s = '') { let h = 0; for (let i = 0; i < s.length; i++) h = (h * 31 + s.charCodeAt(i)) >>> 0; return h }\nexport function colorFor(id = '') { return PALETTE[hash(id) % PALETTE.length] }\n\nconst pad = (n) => String(n).padStart(2, '0')\nexport function timeOf(iso) { if (!iso) return ''; const d = new Date(iso); return `${pad(d.getHours())}:${pad(d.getMinutes())}` }\nexport function dayOf(iso) {\n if (!iso) return ''\n const d = new Date(iso); const now = new Date()\n if (d.toDateString() === now.toDateString()) return 'Hoje'\n const y = new Date(now); y.setDate(now.getDate() - 1)\n if (d.toDateString() === y.toDateString()) return 'Ontem'\n return d.toLocaleDateString('pt-BR')\n}\nexport function relTime(iso) {\n if (!iso) return ''\n const m = Math.floor((Date.now() - new Date(iso).getTime()) / 60000)\n if (m < 1) return 'agora'\n if (m < 60) return `${m}m`\n const h = Math.floor(m / 60); if (h < 24) return `${h}h`\n return `${Math.floor(h / 24)}d`\n}\nexport function nowHHMM() { const d = new Date(); return `${pad(d.getHours())}:${pad(d.getMinutes())}` }\n\n// backend conversation.status -> UI status enum (statusInfo keys in App.jsx)\nconst STATUS_MAP = { open: 'open', pending: 'in_progress', resolved: 'resolved', snoozed: 'waiting' }\n\nexport function mapConversation(c) {\n const contact = c.contact || {}\n const name = contact.name || contact.push_name || contact.phone_e164 || contact.external_id || 'Contato'\n return {\n id: c.id,\n name,\n phone: contact.phone_e164 || '',\n avatarColor: colorFor(c.id),\n preview: c.last_message_preview || '',\n waitFor: relTime(c.last_message_at),\n unread: c.unread_count || 0,\n sla: 'ok',\n priority: c.priority || 'normal',\n status: STATUS_MAP[c.status] || 'open',\n ticket: c.property_ref ? `REF ${c.property_ref}` : `#${String(c.id).slice(0, 4)}`,\n starred: false,\n _raw: c,\n }\n}\n\nexport function mapMessage(m) {\n const ts = m.sent_at || m.created_at\n // internal note: kind='note', no direction, team-only\n if (m.kind === 'note') {\n return { id: m.id, side: 'note', kind: 'text', text: m.text || '', time: timeOf(ts), day: dayOf(ts), author: m.author_name, _raw: m }\n }\n if (m.kind === 'system') {\n return { id: m.id, side: 'system', kind: 'text', text: m.text || '', time: timeOf(ts), day: dayOf(ts), _raw: m }\n }\n let kind = m.kind || 'text'\n let text = m.text || ''\n if (!['text', 'image', 'audio', 'video', 'document'].includes(kind)) {\n text = m.text || m.caption || `[${kind}]`\n kind = 'text'\n }\n return {\n id: m.id,\n side: m.direction, // 'in' | 'out'\n kind,\n text,\n caption: m.caption || '',\n meta: m.media_mime || '',\n mediaUrl: m.media_url || '',\n time: timeOf(ts),\n day: dayOf(ts),\n status: m.status,\n _raw: m,\n }\n}\n","'use client'\nimport { useEffect, useRef, useState } from 'react'\n\n// Minimal \"connect a WhatsApp number\" modal: create channel -> QR -> poll status.\nexport default function ConnectChannel({ inbox, onClose }) {\n const [channel, setChannel] = useState(null)\n const [qr, setQr] = useState(null)\n const [status, setStatus] = useState('idle')\n const [error, setError] = useState(null)\n const [busy, setBusy] = useState(false)\n const pollRef = useRef(null)\n\n const asDataUrl = (q) => (!q ? null : q.startsWith('data:') ? q : `data:image/png;base64,${q}`)\n\n useEffect(() => {\n (async () => {\n try {\n const list = await inbox.loadChannels()\n const c = (list || [])[0] || null\n setChannel(c)\n if (c) setStatus(c.status)\n } catch (e) { setError(e.message) }\n })()\n return () => clearInterval(pollRef.current)\n }, [inbox])\n\n const poll = (id) => {\n clearInterval(pollRef.current)\n pollRef.current = setInterval(async () => {\n try {\n const s = await inbox.channelStatus(id)\n setStatus(s.status)\n if (s.status === 'connected') { clearInterval(pollRef.current); inbox.loadChannels() }\n else { const res = await inbox.connect(id); if (res?.qr) setQr(asDataUrl(res.qr)) }\n } catch {}\n }, 3000)\n }\n\n const startConnect = async (ch) => {\n setError(null); setBusy(true); setStatus('connecting')\n try {\n const res = await inbox.connect(ch.id)\n setQr(asDataUrl(res?.qr))\n setStatus(res?.status || 'qr')\n poll(ch.id)\n } catch (e) { setError(e.message); setStatus('error') } finally { setBusy(false) }\n }\n\n // Um clique só: o \"canal\" é a instância Evolution que hospeda a sessão e gera\n // o QR — necessário, mas não precisa ser um passo manual. Cria se não existir\n // e já parte pro QR.\n const handleConnect = async () => {\n setError(null); setBusy(true)\n try {\n let ch = channel\n if (!ch) { ch = await inbox.createChannel('WhatsApp'); setChannel(ch) }\n await startConnect(ch)\n } catch (e) { setError(e.message) } finally { setBusy(false) }\n }\n\n return (\n <div className=\"fixed inset-0 z-50 bg-black/40 flex items-center justify-center\" onClick={onClose}>\n <div className=\"bg-white rounded-2xl shadow-xl w-[380px] p-5\" onClick={(e) => e.stopPropagation()}>\n <div className=\"flex items-center justify-between mb-3\">\n <h3 className=\"font-semibold text-[15px]\">Conectar WhatsApp</h3>\n <button onClick={onClose} className=\"text-slate-400 hover:text-slate-700 text-lg leading-none\">×</button>\n </div>\n\n {error && <div className=\"text-[12px] text-rose-600 mb-2 break-words\">{error}</div>}\n\n {status === 'connected' ? (\n <div className=\"text-center py-8 text-emerald-600 font-medium\">✓ Número conectado</div>\n ) : qr ? (\n <div className=\"text-center\">\n <img src={qr} alt=\"QR Code\" className=\"w-56 h-56 mx-auto rounded-lg border border-slate-200\" />\n <p className=\"text-[12px] text-slate-500 mt-3\">\n WhatsApp › Aparelhos conectados › Conectar um aparelho, e escaneie. ({status})\n </p>\n </div>\n ) : (\n <div className=\"text-center py-4\">\n <p className=\"text-[13px] text-slate-600 mb-3\">\n Conecte um número de WhatsApp para começar a atender.\n </p>\n <button disabled={busy} onClick={handleConnect}\n className=\"bg-emerald-600 hover:bg-emerald-700 disabled:opacity-50 text-white px-4 py-2 rounded-lg text-[13px] font-medium\">\n {busy ? 'Gerando…' : 'Gerar QR Code'}\n </button>\n </div>\n )}\n </div>\n </div>\n )\n}\n","'use client'\nimport { lazy, Suspense } from 'react'\n\n// Lazy-load emoji-picker-react (client-only; touches window). No next/dynamic so\n// the lib stays framework-agnostic. Category enum values used as string literals\n// to avoid a static import of the module on SSR.\nconst Picker = lazy(() => import('emoji-picker-react'))\n\nconst CATEGORIES_PT = [\n { category: 'suggested', name: 'Recentes' },\n { category: 'smileys_people', name: 'Rostos e pessoas' },\n { category: 'animals_nature', name: 'Animais e natureza' },\n { category: 'food_drink', name: 'Comidas e bebidas' },\n { category: 'travel_places', name: 'Viagens e lugares' },\n { category: 'activities', name: 'Atividades' },\n { category: 'objects', name: 'Objetos' },\n { category: 'symbols', name: 'Símbolos' },\n { category: 'flags', name: 'Bandeiras' },\n]\n\nexport default function EmojiPicker({ onPick }) {\n return (\n <div className=\"absolute bottom-[calc(100%+6px)] left-0 z-30 shadow-xl rounded-xl overflow-hidden\">\n <Suspense fallback={<div className=\"w-[340px] h-[420px] bg-white\" />}>\n <Picker\n onEmojiClick={(e) => onPick(e.emoji)}\n lazyLoadEmojis\n width={340}\n height={420}\n categories={CATEGORIES_PT}\n searchPlaceholder=\"Buscar emoji…\"\n previewConfig={{ showPreview: false }}\n />\n </Suspense>\n </div>\n )\n}\n","'use client'\nimport { useEffect, useState } from 'react'\n\n// Transferir conversa para outro agente do workspace.\nexport default function TransferModal({ inbox, conversationId, currentAssignee, onClose }) {\n const [agents, setAgents] = useState(inbox.agents || [])\n const [q, setQ] = useState('')\n\n useEffect(() => { inbox.loadAgents().then((a) => a && setAgents(a)) }, [inbox])\n\n const filtered = agents.filter((a) => {\n const s = q.trim().toLowerCase()\n if (!s) return true\n return (a.name || '').toLowerCase().includes(s) || (a.email || '').toLowerCase().includes(s)\n })\n\n const pick = (userId) => { inbox.assign(conversationId, userId); onClose() }\n const initials = (n) => (n || '?').split(' ').map((p) => p[0]).slice(0, 2).join('').toUpperCase()\n\n return (\n <div className=\"fixed inset-0 z-50 bg-black/40 flex items-center justify-center\" onClick={onClose}>\n <div className=\"bg-white rounded-2xl shadow-xl w-[380px] max-h-[72vh] flex flex-col\" onClick={(e) => e.stopPropagation()}>\n <div className=\"px-4 py-3 border-b border-slate-200 flex items-center justify-between\">\n <h3 className=\"font-semibold text-[15px]\">Transferir conversa</h3>\n <button onClick={onClose} className=\"text-slate-400 hover:text-slate-700 text-lg leading-none\">×</button>\n </div>\n <div className=\"p-3 border-b border-slate-100\">\n <input value={q} onChange={(e) => setQ(e.target.value)} placeholder=\"Buscar agente…\"\n className=\"w-full px-3 py-1.5 text-[13px] rounded-lg bg-slate-50 border border-slate-200 outline-none focus:bg-white focus:border-slate-300\" />\n </div>\n <div className=\"flex-1 overflow-y-auto p-2\">\n <button onClick={() => pick(null)}\n className=\"w-full text-left px-3 py-2 rounded-lg hover:bg-slate-50 text-[13px] text-slate-500\">\n Sem atribuição\n </button>\n {filtered.map((a) => (\n <button key={a.user_id} onClick={() => pick(a.user_id)}\n className={`w-full text-left px-3 py-2 rounded-lg hover:bg-slate-50 flex items-center gap-2.5 ${currentAssignee === a.user_id ? 'bg-emerald-50' : ''}`}>\n <span className=\"w-8 h-8 rounded-full bg-slate-200 text-slate-600 text-[11px] font-semibold flex items-center justify-center shrink-0\">\n {initials(a.name)}\n </span>\n <span className=\"flex-1 min-w-0\">\n <span className=\"block text-[13px] truncate\">{a.name}</span>\n <span className=\"block text-[11px] text-slate-400 truncate\">{[a.email, a.role].filter(Boolean).join(' · ')}</span>\n </span>\n {currentAssignee === a.user_id && <span className=\"text-emerald-600 text-[11px] font-medium shrink-0\">atual</span>}\n </button>\n ))}\n {filtered.length === 0 && <p className=\"text-center text-[12px] text-slate-400 py-6\">Nenhum agente encontrado</p>}\n </div>\n </div>\n </div>\n )\n}\n","'use client'\nimport App from './components/App'\nimport { PloyConfigProvider } from './lib/context'\n\n/**\n * <PloyChat> — embeddable WhatsApp inbox.\n *\n * Props:\n * - apiBase: string chat-api base URL\n * - workspaceId: string host workspace/tenant the user is in\n * - getToken: () => Promise<string|null> host session access_token\n * - supabase?: SupabaseClient host's client (preferred, for realtime)\n * - supabaseUrl?, supabaseAnonKey? OR create one for realtime\n * - className?: string wrapper class (fills its container; give it a height)\n */\nexport function PloyChat({\n apiBase,\n workspaceId,\n getToken,\n supabase,\n supabaseUrl,\n supabaseAnonKey,\n className,\n}) {\n const config = { apiBase, workspaceId, getToken, supabase, supabaseUrl, supabaseAnonKey }\n // .ploychat-root: scope hook for the bundled reset in styles.css (@layer base).\n const rootClass = ['ploychat-root', className].filter(Boolean).join(' ')\n return (\n <PloyConfigProvider config={config}>\n <div className={rootClass} style={{ height: '100%', width: '100%' }}>\n <App />\n </div>\n </PloyConfigProvider>\n )\n}\n\nexport default PloyChat\n"],"mappings":"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","names":["useMemo","useRef","useState","useEffect","conversations","useEffect","useRef","useState","jsx","jsx","useEffect","useState","jsx","jsxs","jsx","jsxs","jsxs","jsx","useState","useRef","useEffect","_a","useMemo","jsxs","jsx","jsxs","jsx","useState","useRef","useEffect","useState","useEffect","jsx","useRef","jsxs","useMemo","useState","jsxs","jsx","useRef","useEffect","jsx"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/App.jsx","../src/lib/useInbox.js","../src/lib/context.jsx","../src/lib/client.js","../src/lib/mappers.js","../src/components/ConnectChannel.jsx","../src/components/EmojiPicker.jsx","../src/components/TransferModal.jsx","../src/PloyChat.jsx"],"sourcesContent":["'use client'\n\nimport { useMemo, useRef, useState, useEffect } from 'react'\nimport { useInbox } from '@/lib/useInbox'\nimport ConnectChannel from '@/components/ConnectChannel'\nimport EmojiPicker from '@/components/EmojiPicker'\nimport TransferModal from '@/components/TransferModal'\n\nconst REGEN_EVERY = 3 // regenera o resumo IA a cada N mensagens novas\n\n/* ---------- Ícones SVG inline (sem dependências) ---------- */\nconst Icon = ({ d, className = 'w-4 h-4', stroke = 1.8, fill = 'none' }) => (\n <svg viewBox=\"0 0 24 24\" className={className} fill={fill} stroke=\"currentColor\" strokeWidth={stroke} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {d}\n </svg>\n)\nconst I = {\n inbox: <Icon d={<><path d=\"M22 12h-6l-2 3h-4l-2-3H2\"/><path d=\"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11Z\"/></>} />,\n chat: <Icon d={<path d=\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5Z\"/>} />,\n contacts: <Icon d={<><path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\"/><circle cx=\"9\" cy=\"7\" r=\"4\"/><path d=\"M22 21v-2a4 4 0 0 0-3-3.87M16 3.13a4 4 0 0 1 0 7.75\"/></>} />,\n send: <Icon d={<><line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"/><polygon points=\"22 2 15 22 11 13 2 9 22 2\"/></>} />,\n bolt: <Icon d={<polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\"/>} />,\n bulb: <Icon d={<><path d=\"M9 18h6\"/><path d=\"M10 22h4\"/><path d=\"M12 2a7 7 0 0 0-4 12.7c.6.5 1 1.3 1 2.1V18h6v-1.2c0-.8.4-1.6 1-2.1A7 7 0 0 0 12 2Z\"/></>} />,\n book: <Icon d={<><path d=\"M4 19.5A2.5 2.5 0 0 1 6.5 17H20\"/><path d=\"M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2Z\"/></>} />,\n chart: <Icon d={<><line x1=\"18\" y1=\"20\" x2=\"18\" y2=\"10\"/><line x1=\"12\" y1=\"20\" x2=\"12\" y2=\"4\"/><line x1=\"6\" y1=\"20\" x2=\"6\" y2=\"14\"/></>} />,\n users: <Icon d={<><path d=\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"/><circle cx=\"9\" cy=\"7\" r=\"4\"/><path d=\"M23 21v-2a4 4 0 0 0-3-3.87M16 3.13a4 4 0 0 1 0 7.75\"/></>} />,\n grid: <Icon d={<><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\"/><rect x=\"14\" y=\"14\" width=\"7\" height=\"7\"/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\"/></>} />,\n briefcase: <Icon d={<><rect x=\"2\" y=\"7\" width=\"20\" height=\"14\" rx=\"2\"/><path d=\"M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16\"/></>} />,\n search: <Icon d={<><circle cx=\"11\" cy=\"11\" r=\"8\"/><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/></>} />,\n filter: <Icon d={<polygon points=\"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\"/>} />,\n sort: <Icon d={<><path d=\"m3 16 4 4 4-4\"/><path d=\"M7 20V4\"/><path d=\"m21 8-4-4-4 4\"/><path d=\"M17 4v16\"/></>} />,\n chevDown: <Icon d={<polyline points=\"6 9 12 15 18 9\"/>} />,\n chevRight: <Icon d={<polyline points=\"9 18 15 12 9 6\"/>} />,\n panel: <Icon d={<><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\"/></>} />,\n more: <Icon d={<><circle cx=\"12\" cy=\"12\" r=\"1\"/><circle cx=\"19\" cy=\"12\" r=\"1\"/><circle cx=\"5\" cy=\"12\" r=\"1\"/></>} />,\n star: <Icon d={<polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"/>} />,\n phone: <Icon d={<path d=\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92Z\"/>} />,\n moon: <Icon d={<path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79Z\"/>} />,\n check: <Icon d={<polyline points=\"20 6 9 17 4 12\"/>} />,\n paperclip: <Icon d={<path d=\"m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48\"/>} />,\n emoji: <Icon d={<><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M8 14s1.5 2 4 2 4-2 4-2\"/><line x1=\"9\" y1=\"9\" x2=\"9.01\" y2=\"9\"/><line x1=\"15\" y1=\"9\" x2=\"15.01\" y2=\"9\"/></>} />,\n mic: <Icon d={<><path d=\"M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3Z\"/><path d=\"M19 10v2a7 7 0 0 1-14 0v-2\"/><line x1=\"12\" y1=\"19\" x2=\"12\" y2=\"23\"/><line x1=\"8\" y1=\"23\" x2=\"16\" y2=\"23\"/></>} />,\n image: <Icon d={<><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/><circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/><polyline points=\"21 15 16 10 5 21\"/></>} />,\n file: <Icon d={<><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><polyline points=\"14 2 14 8 20 8\"/></>} />,\n pin: <Icon d={<><path d=\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z\"/><circle cx=\"12\" cy=\"10\" r=\"3\"/></>} />,\n tag: <Icon d={<><path d=\"M20.59 13.41 13.42 20.58a2 2 0 0 1-2.83 0L2 12V2h10l8.59 8.59a2 2 0 0 1 0 2.82Z\"/><line x1=\"7\" y1=\"7\" x2=\"7.01\" y2=\"7\"/></>} />,\n link: <Icon d={<><path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"/><path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"/></>} />,\n clock: <Icon d={<><circle cx=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"12 6 12 12 16 14\"/></>} />,\n forward: <Icon d={<><polyline points=\"15 17 20 12 15 7\"/><path d=\"M4 18v-2a4 4 0 0 1 4-4h12\"/></>} />,\n x: <Icon d={<><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></>} />,\n external: <Icon d={<><path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"/><polyline points=\"15 3 21 3 21 9\"/><line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/></>} />,\n plus: <Icon d={<><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"/></>} />,\n template: <Icon d={<><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"/><line x1=\"9\" y1=\"21\" x2=\"9\" y2=\"9\"/></>} />,\n reply: <Icon d={<><polyline points=\"9 17 4 12 9 7\"/><path d=\"M20 18v-2a4 4 0 0 0-4-4H4\"/></>} />,\n whatsapp: <Icon d={<><path d=\"M20.52 3.48A11.93 11.93 0 0 0 12.02 0C5.4 0 .03 5.37.03 11.99c0 2.11.55 4.18 1.6 6L0 24l6.18-1.62a12 12 0 0 0 5.84 1.49h.01c6.62 0 11.99-5.37 11.99-11.99 0-3.2-1.25-6.21-3.5-8.4Z\"/><path d=\"M9.3 7.4c-.2-.5-.4-.5-.6-.5h-.5c-.2 0-.5.07-.7.34-.27.27-.93.91-.93 2.22 0 1.31.95 2.58 1.08 2.76.13.18 1.86 2.96 4.58 4.04 2.27.89 2.73.71 3.22.67.49-.05 1.58-.65 1.8-1.27.22-.62.22-1.16.15-1.27-.07-.11-.25-.18-.52-.31-.27-.13-1.58-.78-1.83-.87-.24-.09-.42-.13-.6.13-.18.27-.69.87-.84 1.05-.16.18-.31.2-.58.07-.27-.13-1.14-.42-2.17-1.34-.8-.71-1.34-1.59-1.5-1.86-.16-.27-.02-.41.12-.55.12-.12.27-.31.4-.47.13-.16.18-.27.27-.45.09-.18.04-.34-.02-.47-.07-.13-.6-1.43-.82-1.96Z\"/></>} fill=\"currentColor\" stroke=\"none\" />,\n home: <Icon d={<><path d=\"M3 9.5 12 3l9 6.5V20a1 1 0 0 1-1 1h-5v-7h-6v7H4a1 1 0 0 1-1-1V9.5Z\"/></>} />,\n calendar: <Icon d={<><rect x=\"3\" y=\"4.5\" width=\"18\" height=\"16.5\" rx=\"2\"/><line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\"/><line x1=\"8\" y1=\"2.5\" x2=\"8\" y2=\"6\"/><line x1=\"16\" y1=\"2.5\" x2=\"16\" y2=\"6\"/></>} />,\n building: <Icon d={<><rect x=\"4\" y=\"2.5\" width=\"16\" height=\"19\" rx=\"1.5\"/><path d=\"M9 21.5v-4h6v4\"/><path d=\"M8.5 7h.01M12 7h.01M15.5 7h.01M8.5 11h.01M12 11h.01M15.5 11h.01M8.5 15h.01M15.5 15h.01\"/></>} />,\n target: <Icon d={<><circle cx=\"12\" cy=\"12\" r=\"9\"/><circle cx=\"12\" cy=\"12\" r=\"5\"/><circle cx=\"12\" cy=\"12\" r=\"1.5\" fill=\"currentColor\"/></>} />,\n kanban: <Icon d={<><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"14\"/><line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"10\"/></>} />,\n dollar: <Icon d={<><circle cx=\"12\" cy=\"12\" r=\"9.5\"/><path d=\"M15 9c-.6-1.3-1.7-2-3-2-1.7 0-3 1-3 2.3 0 2.7 6 1.3 6 4 0 1.3-1.3 2.3-3 2.3-1.3 0-2.4-.7-3-2\"/><line x1=\"12\" y1=\"5.5\" x2=\"12\" y2=\"18.5\"/></>} />,\n checkCircle: <Icon d={<><circle cx=\"12\" cy=\"12\" r=\"9.5\"/><polyline points=\"8.5 12 11 14.5 15.5 9.5\"/></>} />,\n globe: <Icon d={<><circle cx=\"12\" cy=\"12\" r=\"9.5\"/><line x1=\"2.5\" y1=\"12\" x2=\"21.5\" y2=\"12\"/><path d=\"M12 2.5c2.5 2.7 4 6.1 4 9.5s-1.5 6.8-4 9.5C9.5 18.8 8 15.4 8 12s1.5-6.8 4-9.5z\"/></>} />,\n rocket: <Icon d={<><path d=\"M4.5 16.5c-1.5 1.3-2 5-2 5s3.7-.5 5-2c.7-.8.7-2.1-.1-2.9-.8-.8-2.1-.8-2.9-.1z\"/><path d=\"M12 15l-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22 22 0 0 1-4 2z\"/><path d=\"M9 12H4s.55-3 2-4c1.6-1 5 0 5 0\"/><path d=\"M12 15v5s3-.5 4-2c1-1.6 0-5 0-5\"/></>} />,\n wand: <Icon d={<><path d=\"m3 21 9-9\"/><path d=\"M15 3v3\"/><path d=\"M19 7l-2 2\"/><path d=\"M21 11h-3\"/><path d=\"M19 15l-2-2\"/><path d=\"M15 17v-3\"/></>} />,\n doc: <Icon d={<><path d=\"M14 2.5H6.5A2 2 0 0 0 4.5 4.5v15a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V8.5z\"/><polyline points=\"14 2.5 14 8.5 20 8.5\"/><line x1=\"8\" y1=\"13\" x2=\"16\" y2=\"13\"/><line x1=\"8\" y1=\"17\" x2=\"14\" y2=\"17\"/></>} />,\n gear: <Icon d={<><circle cx=\"12\" cy=\"12\" r=\"3\"/><path d=\"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 1 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06A1.65 1.65 0 0 0 4.6 15a1.65 1.65 0 0 0-1.51-1H3a2 2 0 1 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 1 1 4 0v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 1 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z\"/></>} />,\n card: <Icon d={<><rect x=\"2\" y=\"5.5\" width=\"20\" height=\"13\" rx=\"2\"/><line x1=\"2\" y1=\"10\" x2=\"22\" y2=\"10\"/></>} />,\n chevDblL: <Icon d={<><path d=\"m11 17-5-5 5-5\"/><path d=\"m18 17-5-5 5-5\"/></>} />,\n chevDblR: <Icon d={<><path d=\"m13 17 5-5-5-5\"/><path d=\"m6 17 5-5-5-5\"/></>} />,\n chevUp: <Icon d={<polyline points=\"18 15 12 9 6 15\"/>} />,\n userPlus: <Icon d={<><path d=\"M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\"/><circle cx=\"8.5\" cy=\"7\" r=\"4\"/><line x1=\"20\" y1=\"8\" x2=\"20\" y2=\"14\"/><line x1=\"23\" y1=\"11\" x2=\"17\" y2=\"11\"/></>} />,\n qrcode: <Icon d={<><rect x=\"3\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"14\" y=\"3\" width=\"7\" height=\"7\" rx=\"1\"/><rect x=\"3\" y=\"14\" width=\"7\" height=\"7\" rx=\"1\"/><path d=\"M14 14h3v3\"/><path d=\"M21 14v.01\"/><path d=\"M14 21h.01\"/><path d=\"M21 21v-3.5\"/><path d=\"M17.5 21h.01\"/></>} />,\n back: <Icon d={<><path d=\"M19 12H5\"/><path d=\"M12 19l-7-7 7-7\"/></>} />,\n trash: <Icon d={<><polyline points=\"3 6 5 6 21 6\"/><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"/></>} />,\n sparkle: <Icon d={<path d=\"M12 3l1.9 5.1L19 10l-5.1 1.9L12 17l-1.9-5.1L5 10l5.1-1.9L12 3Z\"/>} />,\n warn: <Icon d={<><path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0Z\"/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"/></>} />,\n}\n\n/* ---------- Logo Veploy ---------- */\nconst VeployLogo = ({ size = 28 }) => (\n <svg viewBox=\"0 0 40 32\" width={size} height={(size * 32) / 40} xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2 8 L13 28 L17 22 L8 8 Z\" fill=\"#2f4a2d\" />\n <path d=\"M13 28 L36 0 L26 0 L11 22 Z\" fill=\"#b4e234\" />\n </svg>\n)\n\n/* ---------- Estrutura do menu ---------- */\nconst NAV_DATA = [\n { kind: 'item', id: 'home', label: 'Início', icon: 'home' },\n { kind: 'item', id: 'agenda', label: 'Agenda', icon: 'calendar', badge: 'NOVO' },\n { kind: 'section', label: 'Imóveis' },\n { kind: 'item', id: 'imoveis', label: 'Imóveis', icon: 'building' },\n { kind: 'item', id: 'proprietarios', label: 'Proprietários', icon: 'contacts' },\n { kind: 'item', id: 'stats-im', label: 'Estatísticas', icon: 'chart' },\n { kind: 'section', label: 'CRM' },\n { kind: 'item', id: 'leads', label: 'Leads', icon: 'target' },\n { kind: 'item', id: 'pool', label: 'Pool', icon: 'bolt' },\n { kind: 'item', id: 'funil', label: 'Funil', icon: 'kanban' },\n { kind: 'item', id: 'visitas', label: 'Visitas', icon: 'calendar' },\n { kind: 'item', id: 'propostas', label: 'Propostas', icon: 'dollar' },\n { kind: 'item', id: 'tarefas', label: 'Tarefas', icon: 'checkCircle' },\n { kind: 'item', id: 'stats-crm', label: 'Estatísticas', icon: 'chart' },\n { kind: 'section', label: 'Divulgação' },\n { kind: 'item', id: 'portais', label: 'Portais', icon: 'globe' },\n { kind: 'item', id: 'lp', label: 'Landing Pages', icon: 'rocket', badge: 'NOVO' },\n { kind: 'group', id: 'mais-div', label: 'Mais', icon: 'more', children: [\n { id: 'qr', label: 'QR Codes' },\n { id: 'links', label: 'Links rastreáveis' },\n { id: 'criativos', label: 'Gerador de criativos', badge: 'BETA' },\n ]},\n { kind: 'section', label: 'Site' },\n { kind: 'item', id: 'editor', label: 'Editor de interface', icon: 'wand' },\n { kind: 'item', id: 'blog', label: 'Blog', icon: 'doc' },\n { kind: 'item', id: 'stats-site', label: 'Estatísticas', icon: 'chart' },\n { kind: 'section', label: 'Configurações' },\n { kind: 'item', id: 'geral', label: 'Geral', icon: 'gear' },\n { kind: 'item', id: 'usuarios', label: 'Usuários', icon: 'contacts' },\n { kind: 'item', id: 'plano', label: 'Meu plano', icon: 'card' },\n { kind: 'group', id: 'mais-cfg', label: 'Mais', icon: 'more', children: [\n { id: 'integ', label: 'Integrações' },\n { id: 'webhooks', label: 'Webhooks' },\n ]},\n]\n\n/* ---------- Helpers visuais ---------- */\nconst Avatar = ({ name = '', src, size = 'md', color = 'bg-violet-500', online, dot }) => {\n const sizes = { xs: 'w-5 h-5 text-[9px]', sm: 'w-7 h-7 text-[11px]', md: 'w-9 h-9 text-xs', lg: 'w-11 h-11 text-sm', xl: 'w-14 h-14 text-base' }\n const initials = (name || '').split(' ').filter(Boolean).map(p => p[0]).slice(0, 2).join('').toUpperCase() || '?'\n // dot = classe de cor (ex.: 'bg-emerald-500'); online = atalho p/ dot verde.\n const dotColor = dot || (online ? 'bg-emerald-500' : null)\n return (\n <div className=\"relative inline-flex\">\n {src ? (\n <img src={src} alt={name} className={`${sizes[size]} rounded-full object-cover select-none shrink-0`} />\n ) : (\n <div className={`${sizes[size]} ${color} rounded-full text-white font-semibold inline-flex items-center justify-center select-none shrink-0`}>\n {initials}\n </div>\n )}\n {dotColor && <span className={`absolute bottom-0 right-0 w-2.5 h-2.5 rounded-full ${dotColor} ring-2 ring-white`} />}\n </div>\n )\n}\n\nconst Pill = ({ children, tone = 'slate' }) => {\n const tones = {\n slate: 'bg-slate-100 text-slate-700 ring-slate-200',\n amber: 'bg-amber-50 text-amber-700 ring-amber-200',\n emerald: 'bg-emerald-50 text-emerald-700 ring-emerald-200',\n rose: 'bg-rose-50 text-rose-700 ring-rose-200',\n violet: 'bg-violet-50 text-violet-700 ring-violet-200',\n sky: 'bg-sky-50 text-sky-700 ring-sky-200',\n yellow: 'bg-yellow-100 text-yellow-800 ring-yellow-200',\n }\n return (\n <span className={`inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-[11px] font-medium ring-1 ring-inset ${tones[tone]}`}>\n {children}\n </span>\n )\n}\n\nconst Dot = ({ tone = 'emerald' }) => <span className={`inline-block w-1.5 h-1.5 rounded-full bg-${tone}-500`} />\n\n/* ---------- Dados mock ---------- */\nconst conversations = [\n {\n id: 'c1', name: 'Samir Patel', phone: '+55 11 98452-1023', avatarColor: 'bg-violet-500',\n preview: 'Olá! Vi o apto de 2 dorm em Vila Mariana, ainda está…',\n waitFor: '4m', unread: 0, sla: 'risk', priority: 'high', status: 'in_progress',\n ticket: '#8743', tier: 'Gold', assignee: 'Você',\n },\n {\n id: 'c2', name: 'Jenifer Souza', phone: '+55 21 99201-7811', avatarColor: 'bg-rose-500',\n preview: 'Oi, tenho uma dúvida sobre a fatura desse mês 🤔',\n waitFor: '8m', unread: 2, sla: 'breach', priority: 'urgent', status: 'open',\n ticket: '#8744', tier: 'Platinum', assignee: 'Você', starred: true,\n },\n {\n id: 'c3', name: 'Ingrid Bahia', phone: '+55 71 98800-4421', avatarColor: 'bg-sky-500',\n preview: 'Boa tarde, vamos prosseguir com a troca do plano…',\n waitFor: '17m', unread: 0, sla: 'ok', priority: 'normal', status: 'waiting',\n ticket: '#8746', tier: 'Silver', assignee: 'Você',\n },\n {\n id: 'c4', name: 'Sven Ribeiro', phone: '+55 47 98112-7755', avatarColor: 'bg-slate-700',\n preview: 'Sim, será processado em até 24h corridas.',\n waitFor: '23m', unread: 0, sla: 'ok', priority: 'low', status: 'in_progress',\n ticket: '#8749', tier: 'Bronze', assignee: 'Você',\n },\n {\n id: 'c5', name: 'Marcelo Tavares', phone: '+55 11 95542-3398', avatarColor: 'bg-amber-500',\n preview: 'Áudio · 0:42',\n waitFor: '34m', unread: 1, sla: 'risk', priority: 'high', status: 'open',\n ticket: '#8751', tier: 'Gold', assignee: 'Fila — Vendas',\n },\n {\n id: 'c6', name: 'Helena Prado', phone: '+55 31 99776-2210', avatarColor: 'bg-emerald-600',\n preview: 'Documento · contrato_v3.pdf',\n waitFor: '52m', unread: 0, sla: 'ok', priority: 'normal', status: 'waiting',\n ticket: '#8755', tier: 'Silver', assignee: 'Você',\n },\n]\n\nconst INITIAL_MESSAGES = [\n { id: 'm1', side: 'in', kind: 'text', text: 'Olá! Vi no site de vocês o apartamento de 2 dormitórios em Vila Mariana. Ainda está disponível? Tenho interesse em visitar essa semana.', time: '10:02', day: 'Hoje' },\n { id: 'm2', side: 'out', kind: 'text', text: 'Olá Samir! Tudo bem? Aqui é a Maria, corretora responsável. Sim, o imóvel está disponível! Pra eu te ajudar melhor, posso te perguntar uma coisa rápida — é pra moradia ou investimento? E você já tem uma faixa de valor em mente?', time: '10:04', status: 'read' },\n { id: 'm3', side: 'in', kind: 'text', text: 'Pra morar mesmo. Sou casado, sem filhos, e tô olhando algo na Zona Sul até R$ 900 mil. Preciso de vaga de garagem e, se possível, varanda.', time: '10:05' },\n { id: 'm4', side: 'in', kind: 'image', caption: 'Esse é o estilo de planta que eu gostei', meta: '1.4 MB · referencia.jpg', time: '10:06' },\n { id: 'm5', side: 'note', text: '@Alissa esse cliente tem o perfil ideal pro 65m² da Vila Mariana (cód. 856301) e pro 95m² em Moema (cód. 858033). Os dois ainda estão liberados pra visita amanhã? Quero confirmar antes de oferecer.', author: 'Maria Eduarda', time: '10:09' },\n { id: 'm6', side: 'system', text: 'Alissa Mendes foi adicionada à conversa', time: '10:10' },\n { id: 'm7', side: 'out', kind: 'text', text: 'Samir, tenho duas ótimas opções pra você dentro do orçamento e com vaga + varanda: um 2 dorm em Vila Mariana e um 3 dorm em Moema. Os dois estão liberados pra visita amanhã. Te mando agora os detalhes e fotos?', time: '10:18', status: 'read', author: 'Alissa Mendes' },\n { id: 'm8', side: 'in', kind: 'text', text: 'Perfeito, manda sim! 🙏', time: '10:20' },\n { id: 'm9', side: 'in', kind: 'audio', duration: '0:18', time: '10:21' },\n { id: 'm10', side: 'out', kind: 'text', text: 'Maravilha! Qual período da semana funciona melhor pra você visitar — manhã ou final do dia? Já adianto o agendamento com os proprietários. 😊', time: '10:24', status: 'delivered' },\n]\n\nconst quickReplies = [\n { id: 'q1', label: 'Saudação', text: 'Olá! Aqui é da imobiliária, tudo bem? Como posso te ajudar a encontrar o imóvel ideal?' },\n { id: 'q2', label: 'Perfil', text: 'Pra eu te enviar as melhores opções, me conta: é pra moradia ou investimento? Qual região e faixa de valor?' },\n { id: 'q3', label: 'Agendar visita', text: 'Posso já agendar a visita pra você. Qual o melhor dia e horário essa semana?' },\n { id: 'q4', label: 'Documentos', text: 'Pra avançar com a proposta, vou precisar de RG, CPF, comprovante de renda e residência. Pode me enviar por aqui mesmo.' },\n]\n\n/* ---------- Tons utilitários ---------- */\nconst slaInfo = {\n ok: { tone: 'emerald', label: 'No prazo' },\n risk: { tone: 'amber', label: 'Em risco' },\n breach: { tone: 'rose', label: 'Estourado' },\n}\nconst statusInfo = {\n open: { tone: 'sky', label: 'Aberto' },\n in_progress: { tone: 'amber', label: 'Em atendimento' },\n waiting: { tone: 'violet', label: 'Aguardando cliente' },\n resolved: { tone: 'emerald', label: 'Resolvido' },\n}\n\n/* ---------- Componente raiz ---------- */\nexport default function App({ onBack, agent, onUnreadChange }) {\n const inbox = useInbox()\n const [available, setAvailable] = useState(true) // status do atendente (UI)\n const typingSentRef = useRef(0) // throttle do \"composing\" outbound\n const typingStopRef = useRef(null) // timer p/ enviar \"paused\" no idle\n const live = inbox.live\n const [mockActiveId, setMockActiveId] = useState('c1')\n const activeId = live ? inbox.activeId : mockActiveId\n const setActiveId = live ? inbox.setActiveId : setMockActiveId\n const [connectOpen, setConnectOpen] = useState(false)\n const [transferOpen, setTransferOpen] = useState(false)\n const [emojiOpen, setEmojiOpen] = useState(false)\n const emojiRef = useRef(null)\n const [mediaPreview, setMediaPreview] = useState(null) // { file, kind, previewUrl, caption }\n const [selectMode, setSelectMode] = useState(false)\n const [selectedMsgs, setSelectedMsgs] = useState(() => new Set())\n const [confirmDelete, setConfirmDelete] = useState(false)\n const [newConv, setNewConv] = useState(null) // { phone, text, busy, error } | null\n const [aiSummary, setAiSummary] = useState(null) // { loading, text, error } | null (modal)\n const [convSummary, setConvSummary] = useState(null) // { convId, text, loading, error } (tarja)\n const curConvRef = useRef(null) // conversa ativa atual (p/ não dropar resumo por outras deps)\n const summarizingRef = useRef(null) // conversa sendo resumida agora (evita chamada duplicada)\n const [filterOpen, setFilterOpen] = useState(false)\n const [unreadOnly, setUnreadOnly] = useState(false)\n const [mineOnly, setMineOnly] = useState(false)\n const [recording, setRecording] = useState(false)\n const [recSecs, setRecSecs] = useState(0)\n const [composeMode, setComposeMode] = useState('reply')\n const [text, setText] = useState('')\n const [filter, setFilter] = useState('all')\n const [detailsOpen, setDetailsOpen] = useState(false)\n const [quickOpen, setQuickOpen] = useState(false)\n const [searchOpen, setSearchOpen] = useState(false)\n const [searchQuery, setSearchQuery] = useState('')\n const [searchIndex, setSearchIndex] = useState(0)\n const [messages, setMessages] = useState(INITIAL_MESSAGES)\n const threadMessages = live ? inbox.messages : messages\n const convList = live ? inbox.conversations : conversations\n const scrollRef = useRef(null)\n const textareaRef = useRef(null)\n const imageInputRef = useRef(null)\n const fileInputRef = useRef(null)\n const mediaRecorderRef = useRef(null)\n const audioChunksRef = useRef([])\n const cancelAudioRef = useRef(false)\n const audioCtxRef = useRef(null)\n const analyserRef = useRef(null)\n const recTimerRef = useRef(null)\n\n // Lista de conversas redimensionável (arrasto estilo WhatsApp Web)\n const [listWidth, setListWidth] = useState(() => {\n if (typeof window !== 'undefined') {\n const v = parseInt(window.localStorage.getItem('veploy_chat_list_width') || '', 10)\n if (v >= 300 && v <= 600) return v\n }\n return 380\n })\n const resizingRef = useRef(false)\n const listWidthRef = useRef(listWidth)\n listWidthRef.current = listWidth\n useEffect(() => {\n const onMove = e => {\n if (!resizingRef.current) return\n setListWidth(Math.min(600, Math.max(300, e.clientX)))\n }\n const onUp = () => {\n if (!resizingRef.current) return\n resizingRef.current = false\n document.body.style.cursor = ''\n document.body.style.userSelect = ''\n try { window.localStorage.setItem('veploy_chat_list_width', String(listWidthRef.current)) } catch {}\n }\n window.addEventListener('mousemove', onMove)\n window.addEventListener('mouseup', onUp)\n return () => { window.removeEventListener('mousemove', onMove); window.removeEventListener('mouseup', onUp) }\n }, [])\n const startResize = e => {\n resizingRef.current = true\n document.body.style.cursor = 'col-resize'\n document.body.style.userSelect = 'none'\n e.preventDefault()\n }\n\n const formatNow = () => {\n const d = new Date()\n return `${String(d.getHours()).padStart(2, '0')}:${String(d.getMinutes()).padStart(2, '0')}`\n }\n\n const fileToDataUrl = (file) => new Promise((res, rej) => {\n const r = new FileReader(); r.onload = () => res(r.result); r.onerror = rej; r.readAsDataURL(file)\n })\n\n const insertEmoji = (e) => { setText(t => t + e); setEmojiOpen(false); textareaRef.current?.focus() }\n // seleção múltipla (estilo WhatsApp)\n const enterSelect = (id) => { setSelectMode(true); setSelectedMsgs(new Set([id])) }\n const toggleSelect = (id) => setSelectedMsgs(s => {\n const n = new Set(s); n.has(id) ? n.delete(id) : n.add(id)\n if (n.size === 0) setSelectMode(false)\n return n\n })\n const exitSelect = () => { setSelectMode(false); setSelectedMsgs(new Set()) }\n const doDeleteSelected = async () => {\n const ids = [...selectedMsgs]\n setConfirmDelete(false); exitSelect()\n await Promise.all(ids.map(id => inbox.deleteMessage(id)))\n }\n\n const handleSummarize = async () => {\n if (!active) return\n setAiSummary({ loading: true })\n try { const s = await inbox.summarize(active.id); setAiSummary({ text: s }) }\n catch (e) { setAiSummary({ error: e.message || 'Falha ao gerar o resumo' }) }\n }\n\n const submitNewConv = async () => {\n const phone = (newConv?.phone || '').trim()\n if (!phone) return\n setNewConv(c => ({ ...c, busy: true, error: '' }))\n try {\n await inbox.createConversation(phone, newConv.text)\n setNewConv(null)\n } catch (e) {\n setNewConv(c => ({ ...c, busy: false, error: e.message || 'Falha ao iniciar conversa' }))\n }\n }\n\n // fecha o emoji picker ao clicar fora\n useEffect(() => {\n if (!emojiOpen) return\n const onDoc = (e) => { if (emojiRef.current && !emojiRef.current.contains(e.target)) setEmojiOpen(false) }\n document.addEventListener('mousedown', onDoc)\n return () => document.removeEventListener('mousedown', onDoc)\n }, [emojiOpen])\n\n // sai do modo seleção ao trocar de conversa\n useEffect(() => { setSelectMode(false); setSelectedMsgs(new Set()) }, [activeId])\n\n // total de não lidas → host pode mostrar no título da aba (\"(XX) Mensagens - ...\")\n useEffect(() => {\n if (typeof onUnreadChange !== 'function') return\n onUnreadChange((convList || []).reduce((s, c) => s + (c.unread || 0), 0))\n }, [convList, onUnreadChange])\n\n\n // abre o preview de confirmação antes de enviar (estilo WhatsApp)\n const openMediaPreview = (file, kind) => {\n if (!file) return\n setMediaPreview({ file, kind, previewUrl: URL.createObjectURL(file), caption: '' })\n }\n const confirmMediaSend = async () => {\n const p = mediaPreview\n if (!p) return\n setMediaPreview(null)\n const data = await fileToDataUrl(p.file)\n const caption = p.caption?.trim() || undefined\n if (live) {\n inbox.sendMedia({ data, mime: p.file.type, kind: p.kind, filename: p.file.name, previewUrl: p.previewUrl, caption })\n } else {\n setMessages(ms => [...ms, { id: `m${Date.now()}`, side: 'out', kind: p.kind, mediaUrl: p.previewUrl, filename: p.file.name, caption: caption || '', time: nowHHMM(), status: 'sent' }])\n }\n }\n const onPickImage = (e) => { const f = e.target.files?.[0]; e.target.value = ''; openMediaPreview(f, 'image') }\n const onPickFile = (e) => { const f = e.target.files?.[0]; e.target.value = ''; openMediaPreview(f, 'document') }\n\n const startRecording = async () => {\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true })\n const mr = new MediaRecorder(stream)\n audioChunksRef.current = []\n cancelAudioRef.current = false\n\n // medidor de nível ao vivo (waveform)\n const Ctx = window.AudioContext || window.webkitAudioContext\n const audioCtx = new Ctx()\n const source = audioCtx.createMediaStreamSource(stream)\n const analyser = audioCtx.createAnalyser()\n analyser.fftSize = 64\n source.connect(analyser)\n audioCtxRef.current = audioCtx\n analyserRef.current = analyser\n setRecSecs(0)\n clearInterval(recTimerRef.current)\n recTimerRef.current = setInterval(() => setRecSecs(s => s + 1), 1000)\n\n mr.ondataavailable = ev => { if (ev.data.size > 0) audioChunksRef.current.push(ev.data) }\n mr.onstop = async () => {\n stream.getTracks().forEach(t => t.stop())\n clearInterval(recTimerRef.current)\n try { audioCtxRef.current?.close() } catch {}\n analyserRef.current = null\n if (cancelAudioRef.current) return\n const blob = new Blob(audioChunksRef.current, { type: mr.mimeType || 'audio/webm' })\n const previewUrl = URL.createObjectURL(blob)\n const data = await fileToDataUrl(blob)\n if (live) inbox.sendMedia({ data, mime: blob.type, kind: 'audio', filename: 'audio', previewUrl })\n else setMessages(ms => [...ms, { id: `m${Date.now()}`, side: 'out', kind: 'audio', mediaUrl: previewUrl, time: formatNow(), status: 'sent' }])\n }\n mediaRecorderRef.current = mr\n mr.start()\n setRecording(true)\n } catch { alert('Não foi possível acessar o microfone') }\n }\n const stopRecording = (cancel = false) => {\n cancelAudioRef.current = cancel\n setRecording(false)\n try { mediaRecorderRef.current?.stop() } catch {}\n }\n\n // Esc cancela a gravação de voz\n useEffect(() => {\n if (!recording) return\n const onKey = e => { if (e.key === 'Escape') stopRecording(true) }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [recording])\n\n const handleSend = () => {\n const t = text.trim()\n if (!t) return\n if (live) {\n inbox.send(t, composeMode === 'note')\n setText('')\n return\n }\n const id = `m${Date.now()}`\n const time = formatNow()\n const msg = composeMode === 'note'\n ? { id, side: 'note', text: t, author: 'Maria Eduarda', time }\n : { id, side: 'out', kind: 'text', text: t, time, status: 'sent', author: 'Maria Eduarda' }\n setMessages(ms => [...ms, msg])\n setText('')\n }\n\n const searchMatches = useMemo(() => {\n const q = searchQuery.trim().toLowerCase()\n if (!q) return []\n return threadMessages.filter(m => {\n const t = (m.text || m.caption || '').toLowerCase()\n return t.includes(q)\n }).map(m => m.id)\n }, [searchQuery, threadMessages])\n\n useEffect(() => { setSearchIndex(0) }, [searchQuery])\n\n // Embed bridge: quando roda dentro de um host (iframe), recebe {token, workspace}\n // do host via postMessage e entra em modo live. Sem isso, fica em demo (não\n // utilizável \"por fora\"). Origens permitidas via NEXT_PUBLIC_EMBED_ORIGINS.\n useEffect(() => {\n if (typeof window === 'undefined' || window.parent === window) return\n const envOrigins = (typeof process !== 'undefined' && process.env && process.env.NEXT_PUBLIC_EMBED_ORIGINS) || ''\n const allowed = envOrigins.split(',').map(s => s.trim()).filter(Boolean)\n const onMsg = e => {\n if (allowed.length && !allowed.includes(e.origin)) return\n const d = e.data || {}\n if (d.type === 'veploy-chat-auth' && d.token && d.workspace) {\n const wasLive = !!localStorage.getItem('veploy_chat_token') && !!localStorage.getItem('veploy_chat_workspace')\n localStorage.setItem('veploy_chat_token', d.token)\n localStorage.setItem('veploy_chat_workspace', String(d.workspace))\n if (!wasLive) location.reload()\n }\n }\n window.addEventListener('message', onMsg)\n try { window.parent.postMessage({ type: 'veploy-chat-ready' }, '*') } catch {}\n return () => window.removeEventListener('message', onMsg)\n }, [])\n\n const currentMatchId = searchMatches[searchIndex]\n const openSearch = () => { setSearchOpen(true); setSearchQuery('') }\n const closeSearch = () => { setSearchOpen(false); setSearchQuery('') }\n const nextMatch = () => searchMatches.length && setSearchIndex(i => (i + 1) % searchMatches.length)\n const prevMatch = () => searchMatches.length && setSearchIndex(i => (i - 1 + searchMatches.length) % searchMatches.length)\n\n const active = convList.find(c => c.id === activeId)\n || (inbox.draftConv && inbox.draftConv.id === activeId ? inbox.draftConv : null)\n\n // tarja de status com IA: mostra o resumo SALVO no banco; regenera só quando\n // não existe ou há ≥3 msgs novas (o backend persiste + guarda também).\n useEffect(() => {\n curConvRef.current = activeId\n if (!live || !active || threadMessages.length === 0) { setConvSummary(null); return }\n const convId = activeId\n const saved = active.aiSummary || ''\n const savedCount = active.aiSummaryCount || 0\n const count = threadMessages.length\n setConvSummary({ convId, text: saved })\n const stale = !saved || (count - savedCount) >= REGEN_EVERY\n if (!stale || summarizingRef.current === convId) return\n summarizingRef.current = convId\n setConvSummary({ convId, loading: true, text: saved })\n // só descarta o resultado se o usuário TROCOU de conversa (não por outras deps,\n // ex.: mensagens carregando) — senão a tarja nunca aparecia (corrida).\n inbox.summarize(convId)\n .then(text => {\n summarizingRef.current = null\n if (curConvRef.current !== convId || !text) return\n setConvSummary({ convId, text }); inbox.loadConversations()\n })\n .catch(e => {\n summarizingRef.current = null\n if (curConvRef.current === convId) setConvSummary({ convId, text: saved, error: e.message })\n })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeId, threadMessages.length, live, active?.aiSummary, active?.aiSummaryCount])\n\n useEffect(() => {\n if (scrollRef.current) scrollRef.current.scrollTop = scrollRef.current.scrollHeight\n }, [activeId, threadMessages.length])\n\n const counts = useMemo(() => ({\n all: convList.length,\n unread: convList.filter(c => c.unread > 0).length,\n mine: convList.filter(c => c._raw?.assignee_user_id && c._raw.assignee_user_id === inbox.me).length,\n }), [convList, inbox.me])\n\n const filtered = useMemo(() => {\n let list = convList\n if (filter === 'unread') list = list.filter(c => c.unread > 0)\n else if (filter === 'mine') list = list.filter(c => c._raw?.assignee_user_id && c._raw.assignee_user_id === inbox.me)\n if (unreadOnly) list = list.filter(c => c.unread > 0)\n if (mineOnly) list = list.filter(c => c._raw?.assignee_user_id && c._raw.assignee_user_id === inbox.me)\n return list\n }, [filter, convList, unreadOnly, mineOnly, inbox.me])\n\n // Estado de conexão do número (MVP: 1 canal). Sem canal conectado → mostra QR;\n // com canal existente porém fora do ar → badge de aviso + barra de reconexão.\n const channelList = inbox.channels || []\n const isConnected = channelList.some(c => c.status === 'connected')\n const hasChannel = channelList.length > 0\n // só avalia conexão DEPOIS que os canais carregaram (evita flash de \"não conectado\" no boot)\n const channelsReady = inbox.channelsLoaded\n const needsReconnect = live && channelsReady && hasChannel && !isConnected\n const needsConnect = live && channelsReady && !hasChannel\n const agentOf = (id) => (id ? (inbox.agents || []).find(a => a.user_id === id) : null)\n\n // Avisa o contato que o atendente está digitando (só no modo mensagem).\n // Throttle: \"composing\" no máx. a cada 2.5s; \"paused\" após 3s sem digitar.\n const notifyTyping = () => {\n if (!live || !activeId || composeMode !== 'reply') return\n const now = Date.now()\n if (now - typingSentRef.current > 2500) { typingSentRef.current = now; inbox.setTyping(activeId, 'composing') }\n clearTimeout(typingStopRef.current)\n typingStopRef.current = setTimeout(() => { inbox.setTyping(activeId, 'paused'); typingSentRef.current = 0 }, 3000)\n }\n\n return (\n <div className=\"h-full w-full bg-slate-100 flex flex-col text-slate-900\">\n {/* Barra superior de alerta de conexão */}\n {needsReconnect && (\n <div className=\"flex items-center gap-2 px-4 py-2 bg-amber-50 border-b border-amber-200 text-amber-800 text-[13px] shrink-0\">\n <span className=\"shrink-0\">{I.warn}</span>\n <span className=\"min-w-0\">WhatsApp desconectado. Reconecte o número para continuar recebendo mensagens.</span>\n <button onClick={() => setConnectOpen(true)}\n className=\"ml-auto shrink-0 font-medium bg-amber-500 hover:bg-amber-600 text-white px-3 py-1 rounded-lg\">\n Reconectar\n </button>\n </div>\n )}\n {needsConnect && (\n <div className=\"flex items-center gap-2 px-4 py-2 bg-emerald-50 border-b border-emerald-200 text-emerald-800 text-[13px] shrink-0\">\n <span className=\"min-w-0\">Conecte um número de WhatsApp para começar a atender.</span>\n <button onClick={() => setConnectOpen(true)}\n className=\"ml-auto shrink-0 font-medium bg-emerald-600 hover:bg-emerald-700 text-white px-3 py-1 rounded-lg\">\n Conectar\n </button>\n </div>\n )}\n\n {/* ---------- App container ---------- */}\n <main className=\"flex-1 flex overflow-hidden min-h-0\">\n {/* ---------- Lista de conversas ---------- */}\n <section style={{ width: listWidth }} className=\"relative bg-white border-r border-slate-200 flex flex-col shrink-0\">\n <header className=\"px-4 pt-4 pb-3 border-b border-slate-100\">\n <div className=\"flex items-center justify-between mb-3 gap-2\">\n <div className=\"flex items-center gap-1.5 min-w-0\">\n {onBack && (\n <button onClick={onBack} title=\"Voltar\"\n className=\"-ml-1.5 p-1.5 rounded-md text-slate-500 hover:bg-slate-100 shrink-0\">{I.back}</button>\n )}\n <h1 className=\"font-semibold text-[15px] truncate\">Caixa de entrada</h1>\n {live && (\n <button onClick={() => setAvailable(v => !v)}\n title={`${agent?.name || 'Você'} — ${available ? 'Disponível (clique para pausar)' : 'Pausado (clique para voltar a atender)'}`}\n className=\"shrink-0 inline-flex items-center gap-1.5 pl-0.5 pr-2 py-0.5 rounded-full hover:bg-slate-100 transition-colors\">\n <Avatar name={agent?.name || 'Você'} src={agent?.avatar} size=\"xs\" dot={available ? 'bg-emerald-500' : 'bg-slate-400'} />\n <span className=\"text-[11.5px] font-medium text-slate-600 truncate max-w-[84px]\">{agent?.name || 'Você'}</span>\n </button>\n )}\n </div>\n <div className=\"flex items-center gap-1 shrink-0\">\n {live && isConnected && (\n <button onClick={() => setNewConv({ phone: '', text: '', busy: false, error: '' })}\n title=\"Nova conversa\"\n className=\"p-1.5 rounded-md text-slate-500 hover:bg-slate-100 hover:text-slate-900\">{I.plus}</button>\n )}\n {live && channelsReady && !isConnected && (\n <button onClick={() => setConnectOpen(true)}\n title={needsReconnect ? 'WhatsApp desconectado — reconectar' : 'Conectar WhatsApp'}\n className=\"relative p-1.5 rounded-md hover:bg-emerald-50 text-emerald-600\">\n {I.qrcode}\n {needsReconnect && (\n <span className=\"absolute -top-1 -right-1 w-3.5 h-3.5 rounded-full bg-amber-500 text-white text-[9px] font-bold inline-flex items-center justify-center ring-2 ring-white\">!</span>\n )}\n </button>\n )}\n {/* Filtro e Ordenar removidos por enquanto (as abas Todas/Não lidas/Minhas\n já cobrem o filtro; sort sem back-end). Reativar quando fizer sentido. */}\n </div>\n </div>\n <div className=\"relative\">\n <span className=\"absolute left-2.5 top-1/2 -translate-y-1/2 text-slate-400\">{I.search}</span>\n <input placeholder=\"Buscar conversas, nº ou ticket…\" className=\"w-full pl-8 pr-3 py-1.5 text-[13px] rounded-lg bg-slate-50 border border-slate-200 focus:bg-white focus:border-slate-300 outline-none\" />\n </div>\n <div className=\"flex items-center gap-2 mt-3 text-[12px]\">\n {[\n ['all', 'Todas', counts.all],\n ['unread', 'Não lidas', counts.unread],\n ['mine', 'Minhas', counts.mine],\n ].map(([k, l, n]) => (\n <button key={k} onClick={() => setFilter(k)}\n className={`relative px-3 py-1.5 rounded-full font-medium transition-colors\n ${filter === k ? 'bg-slate-900 text-white' : 'text-slate-600 hover:bg-slate-100'}`}>\n {l}\n {n > 0 && (\n <span className=\"absolute -top-1.5 -right-1.5 min-w-[18px] h-[18px] px-1 rounded-full bg-slate-500 text-white text-[10px] font-bold inline-flex items-center justify-center ring-2 ring-white tabular-nums\">\n {n > 99 ? '99+' : n}\n </span>\n )}\n </button>\n ))}\n </div>\n </header>\n\n <div className=\"flex-1 overflow-y-auto\">\n {live && inbox.loading && filtered.length === 0\n ? [...Array(7)].map((_, i) => <ConversationSkeleton key={i} />)\n : filtered.map(c => (\n <ConversationItem\n key={c.id}\n c={c}\n active={c.id === activeId}\n assignee={inbox.scope === 'all' ? agentOf(c._raw?.assignee_user_id) : null}\n onClick={() => { setActiveId(c.id); if (live) inbox.markRead(c.id) }}\n />\n ))}\n </div>\n\n {/* Handle de arrasto p/ redimensionar a lista (estilo WhatsApp Web) */}\n <div onMouseDown={startResize} title=\"Arraste para redimensionar\"\n className=\"absolute top-0 right-0 h-full w-1.5 cursor-col-resize hover:bg-emerald-400/40 active:bg-emerald-500/50 z-10\" />\n </section>\n\n {/* ---------- Chat ---------- */}\n <section className=\"flex-1 flex flex-col bg-slate-50 min-w-0\">\n {active ? (\n <>\n <ChatHeader c={active} onToggleDetails={() => setDetailsOpen(v => !v)} detailsOpen={detailsOpen} onOpenSearch={openSearch} onTransfer={() => setTransferOpen(true)} typing={live && inbox.typingConvId === active?.id} onSummarize={live ? handleSummarize : null} />\n\n {selectMode && (\n <div className=\"flex items-center gap-3 px-5 py-2.5 bg-slate-900 text-white\">\n <button onClick={exitSelect} title=\"Cancelar\" className=\"p-1 rounded hover:bg-white/10\">{I.x}</button>\n <span className=\"text-[14px] font-medium flex-1\">{selectedMsgs.size} selecionada{selectedMsgs.size === 1 ? '' : 's'}</span>\n <button onClick={() => selectedMsgs.size && setConfirmDelete(true)} disabled={!selectedMsgs.size}\n title=\"Apagar selecionadas\" className=\"p-1.5 rounded-md hover:bg-white/10 disabled:opacity-40\">{I.trash}</button>\n </div>\n )}\n\n {/* Tarja de status com IA (sempre o resumo mais recente) */}\n {!selectMode && convSummary && (convSummary.text || convSummary.loading) && (\n <button onClick={() => convSummary.text && setAiSummary({ text: convSummary.text })}\n title=\"Ver resumo completo\"\n className=\"w-full text-left flex items-start gap-2 px-5 py-2 bg-violet-50 border-b border-violet-100 hover:bg-violet-100/70 transition-colors\">\n <span className=\"text-violet-500 shrink-0 mt-0.5\">{I.sparkle}</span>\n {convSummary.loading && !convSummary.text ? (\n <span className=\"text-[12.5px] text-violet-400 animate-pulse\">Resumindo a conversa…</span>\n ) : (\n <span className=\"text-[12.5px] text-violet-900 leading-snug line-clamp-2 flex-1\">\n <strong className=\"font-semibold text-violet-700\">Resumo:</strong> {convSummary.text}\n </span>\n )}\n {convSummary.loading && convSummary.text && <span className=\"text-[11px] text-violet-400 shrink-0\">atualizando…</span>}\n </button>\n )}\n\n {searchOpen && (\n <SearchBar\n query={searchQuery}\n onChange={setSearchQuery}\n matches={searchMatches}\n currentIndex={searchIndex}\n onPrev={prevMatch}\n onNext={nextMatch}\n onClose={closeSearch}\n />\n )}\n\n {/* Thread */}\n <div ref={scrollRef} className=\"flex-1 overflow-y-auto px-8 py-6 space-y-1.5\">\n {live && inbox.messagesLoading && threadMessages.length === 0 && (\n <div className=\"space-y-3 py-2\">\n {[['in','w-40'],['in','w-56'],['out','w-48'],['in','w-32'],['out','w-60'],['out','w-36']].map(([side, w], i) => (\n <div key={i} className={`flex ${side === 'out' ? 'justify-end' : 'justify-start'}`}>\n <div className={`h-9 ${w} max-w-[70%] rounded-2xl animate-pulse ${side === 'out' ? 'bg-emerald-200/70' : 'bg-slate-200'}`} />\n </div>\n ))}\n </div>\n )}\n {threadMessages.length > 0 && <DayDivider label=\"Hoje\" />}\n {threadMessages.map((m, i) => (\n <Message\n key={m.id}\n m={m}\n prev={threadMessages[i - 1]}\n searchQuery={searchOpen ? searchQuery : ''}\n isCurrentMatch={m.id === currentMatchId}\n isGroup={!!active?.isGroup}\n selectable={live && inbox.canDelete}\n selectMode={selectMode}\n selected={selectedMsgs.has(m.id)}\n onEnterSelect={() => enterSelect(m.id)}\n onToggleSelect={() => toggleSelect(m.id)}\n />\n ))}\n </div>\n\n {/* Compose */}\n <div className=\"px-8 pb-6\">\n <div className=\"bg-white border border-slate-200 rounded-2xl shadow-soft\">\n <div className=\"flex items-center gap-1 px-3 pt-2 text-[12px]\">\n {[\n ['reply', 'Mensagem'],\n ['note', 'Nota interna'],\n ].map(([k, l]) => (\n <button key={k} onClick={() => setComposeMode(k)}\n className={`px-2.5 py-1 rounded-md font-medium ${composeMode === k\n ? k === 'note' ? 'bg-yellow-100 text-yellow-800' : 'bg-slate-900 text-white'\n : 'text-slate-600 hover:bg-slate-100'}`}>\n {l}\n </button>\n ))}\n <div className=\"flex-1\" />\n <button onClick={() => setQuickOpen(v => !v)} className=\"px-2.5 py-1 text-slate-600 hover:bg-slate-100 rounded-md inline-flex items-center gap-1 font-medium\">\n ⌘K <span className=\"text-slate-400\">para respostas rápidas</span>\n </button>\n </div>\n\n {quickOpen && (\n <div className=\"px-3 py-2 border-t border-slate-100 bg-slate-50/60 flex flex-wrap gap-1.5\">\n {quickReplies.map(q => (\n <button key={q.id} onClick={() => { setText(q.text); setQuickOpen(false) }}\n className=\"text-[12px] bg-white border border-slate-200 hover:border-slate-300 px-2.5 py-1 rounded-md text-slate-700\">\n <span className=\"text-slate-400 mr-1\">/</span>{q.label}\n </button>\n ))}\n </div>\n )}\n\n <div className={`px-4 py-3 ${composeMode === 'note' ? 'bg-yellow-50' : ''}`}>\n <textarea\n ref={textareaRef}\n rows={3}\n value={text}\n onChange={e => { setText(e.target.value); notifyTyping() }}\n onKeyDown={e => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSend()\n }\n }}\n placeholder={\n composeMode === 'note'\n ? 'Adicione uma nota interna — visível só para o time…'\n : 'Digite uma mensagem…'\n }\n className={`w-full text-[14px] resize-none bg-transparent outline-none placeholder:text-slate-400 ${composeMode === 'note' ? 'text-yellow-900 placeholder:text-yellow-600' : ''}`}\n />\n </div>\n\n <div className=\"flex items-center gap-1 px-3 py-2 border-t border-slate-100\">\n {recording ? (\n <div className=\"flex items-center gap-3 flex-1\">\n <span className=\"w-2 h-2 rounded-full bg-rose-500 animate-pulse shrink-0\" />\n <span className=\"text-[12.5px] text-rose-600 font-medium tabular-nums shrink-0\">{fmtSecs(recSecs)}</span>\n <AudioWave analyserRef={analyserRef} />\n <span className=\"text-[11px] text-slate-400 shrink-0 hidden sm:inline\">Esc cancela</span>\n <button onClick={() => stopRecording(true)} className=\"text-[12.5px] text-slate-500 px-2.5 py-1.5 rounded-lg hover:bg-slate-100 shrink-0\">Cancelar</button>\n <button onClick={() => stopRecording(false)} className=\"text-[13px] font-medium bg-emerald-600 hover:bg-emerald-700 text-white px-3 py-1.5 rounded-lg inline-flex items-center gap-1.5 shrink-0\">Enviar <span className=\"opacity-90\">{I.send}</span></button>\n </div>\n ) : (\n <>\n <div className=\"relative\" ref={emojiRef}>\n <button onClick={() => setEmojiOpen(v => !v)} title=\"Emoji\"\n className={`px-1.5 py-1.5 rounded-md inline-flex items-center ${emojiOpen ? 'bg-slate-100 text-slate-900' : 'text-slate-500 hover:bg-slate-100'}`}>{I.emoji}</button>\n {emojiOpen && <EmojiPicker onPick={insertEmoji} />}\n </div>\n <AttachMenu onImage={() => imageInputRef.current?.click()} onFile={() => fileInputRef.current?.click()} />\n <button onClick={startRecording} title=\"Gravar áudio\"\n className=\"text-slate-500 hover:bg-slate-100 px-1.5 py-1.5 rounded-md inline-flex items-center\">{I.mic}</button>\n <div className=\"flex-1\" />\n <button\n onClick={handleSend}\n disabled={!text.trim()}\n className={`text-[13px] font-medium px-3.5 py-1.5 rounded-lg inline-flex items-center gap-1.5 disabled:opacity-50 disabled:cursor-not-allowed ${\n composeMode === 'note'\n ? 'bg-yellow-500 hover:bg-yellow-600 text-white'\n : 'bg-emerald-600 hover:bg-emerald-700 text-white'\n }`}>\n {composeMode === 'note' ? 'Salvar nota' : 'Enviar'}\n <span className=\"opacity-90\">{I.send}</span>\n </button>\n </>\n )}\n <input ref={imageInputRef} type=\"file\" accept=\"image/*\" className=\"hidden\" onChange={onPickImage} />\n <input ref={fileInputRef} type=\"file\" className=\"hidden\" onChange={onPickFile} />\n </div>\n </div>\n </div>\n </>\n ) : (\n <EmptyConversation />\n )}\n </section>\n\n {/* ---------- Detalhes ---------- */}\n {detailsOpen && active && <DetailsPanel c={active} onClose={() => setDetailsOpen(false)} />}\n </main>\n {connectOpen && <ConnectChannel inbox={inbox} onClose={() => setConnectOpen(false)} />}\n {transferOpen && active && (\n <TransferModal inbox={inbox} conversationId={active.id} currentAssignee={active._raw?.assignee_user_id} onClose={() => setTransferOpen(false)} />\n )}\n {mediaPreview && (\n <div className=\"fixed inset-0 z-50 bg-black/50 flex items-center justify-center p-4\" onClick={() => setMediaPreview(null)}>\n <div className=\"bg-white rounded-2xl shadow-xl w-[420px] max-w-full p-4\" onClick={e => e.stopPropagation()}>\n <div className=\"flex items-center justify-between mb-3\">\n <h3 className=\"font-semibold text-[15px]\">Enviar {mediaPreview.kind === 'image' ? 'imagem' : 'arquivo'}</h3>\n <button onClick={() => setMediaPreview(null)} className=\"text-slate-400 hover:text-slate-700 text-xl leading-none\">×</button>\n </div>\n {mediaPreview.kind === 'image' ? (\n <img src={mediaPreview.previewUrl} alt=\"\" className=\"w-full max-h-72 object-contain rounded-lg bg-slate-50\" />\n ) : (\n <div className=\"flex items-center gap-3 bg-slate-50 rounded-lg p-3\">\n <span className=\"text-slate-500\">{I.file}</span>\n <span className=\"text-[13px] truncate flex-1\">{mediaPreview.file.name}</span>\n </div>\n )}\n <input\n autoFocus\n value={mediaPreview.caption}\n onChange={e => setMediaPreview(p => ({ ...p, caption: e.target.value }))}\n onKeyDown={e => { if (e.key === 'Enter') confirmMediaSend(); if (e.key === 'Escape') setMediaPreview(null) }}\n placeholder=\"Legenda (opcional)…\"\n className=\"w-full mt-3 px-3 py-2 text-[14px] rounded-lg border border-slate-200 outline-none focus:border-slate-300\"\n />\n <div className=\"flex justify-end gap-2 mt-3\">\n <button onClick={() => setMediaPreview(null)} className=\"text-[13px] px-3 py-1.5 rounded-lg text-slate-600 hover:bg-slate-100\">Cancelar</button>\n <button onClick={confirmMediaSend} className=\"text-[13px] font-medium bg-emerald-600 hover:bg-emerald-700 text-white px-4 py-1.5 rounded-lg inline-flex items-center gap-1.5\">\n Enviar <span className=\"opacity-90\">{I.send}</span>\n </button>\n </div>\n </div>\n </div>\n )}\n {confirmDelete && (\n <div className=\"fixed inset-0 z-50 bg-black/50 flex items-center justify-center p-4\" onClick={() => setConfirmDelete(false)}>\n <div className=\"bg-white rounded-2xl shadow-xl w-[360px] max-w-full p-5\" onClick={e => e.stopPropagation()}>\n <h3 className=\"font-semibold text-[16px] text-slate-900\">Apagar {selectedMsgs.size} {selectedMsgs.size === 1 ? 'mensagem' : 'mensagens'}?</h3>\n <p className=\"text-[13px] text-slate-500 mt-1 mb-4\">Será removida para todos no WhatsApp e do seu inbox. Não dá pra desfazer.</p>\n <div className=\"flex justify-end gap-2\">\n <button onClick={() => setConfirmDelete(false)} className=\"text-[13px] px-3.5 py-2 rounded-lg text-slate-600 hover:bg-slate-100\">Cancelar</button>\n <button onClick={doDeleteSelected} className=\"text-[13px] font-medium bg-rose-600 hover:bg-rose-700 text-white px-4 py-2 rounded-lg\">Apagar</button>\n </div>\n </div>\n </div>\n )}\n {newConv && (\n <div className=\"fixed inset-0 z-50 bg-black/50 flex items-center justify-center p-4\" onClick={() => !newConv.busy && setNewConv(null)}>\n <div className=\"bg-white rounded-2xl shadow-xl w-[400px] max-w-full p-5\" onClick={e => e.stopPropagation()}>\n <div className=\"flex items-center justify-between mb-3\">\n <h3 className=\"font-semibold text-[15px]\">Nova conversa</h3>\n <button onClick={() => setNewConv(null)} className=\"text-slate-400 hover:text-slate-700 text-xl leading-none\">×</button>\n </div>\n {newConv.error && <div className=\"text-[12px] text-rose-600 mb-2 break-words\">{newConv.error}</div>}\n <label className=\"block text-[12px] text-slate-500 mb-1\">Número (DDD + número; o DDI 55 é adicionado automaticamente)</label>\n <input\n autoFocus\n value={newConv.phone}\n onChange={e => setNewConv(c => ({ ...c, phone: e.target.value }))}\n placeholder=\"11 99999-9999\"\n className=\"w-full px-3 py-2 text-[14px] rounded-lg border border-slate-200 outline-none focus:border-slate-300\"\n />\n <label className=\"block text-[12px] text-slate-500 mt-3 mb-1\">Primeira mensagem (opcional)</label>\n <textarea\n rows={3}\n value={newConv.text}\n onChange={e => setNewConv(c => ({ ...c, text: e.target.value }))}\n placeholder=\"Olá! ...\"\n className=\"w-full px-3 py-2 text-[14px] rounded-lg border border-slate-200 outline-none focus:border-slate-300 resize-none\"\n />\n <div className=\"flex justify-end gap-2 mt-4\">\n <button onClick={() => setNewConv(null)} disabled={newConv.busy} className=\"text-[13px] px-3.5 py-2 rounded-lg text-slate-600 hover:bg-slate-100\">Cancelar</button>\n <button onClick={submitNewConv} disabled={newConv.busy || !newConv.phone.trim()}\n className=\"text-[13px] font-medium bg-emerald-600 hover:bg-emerald-700 disabled:opacity-50 text-white px-4 py-2 rounded-lg\">\n {newConv.busy ? 'Iniciando…' : 'Iniciar'}\n </button>\n </div>\n </div>\n </div>\n )}\n {aiSummary && (\n <div className=\"fixed inset-0 z-50 bg-black/50 flex items-center justify-center p-4\" onClick={() => setAiSummary(null)}>\n <div className=\"bg-white rounded-2xl shadow-xl w-[440px] max-w-full p-5\" onClick={e => e.stopPropagation()}>\n <div className=\"flex items-center justify-between mb-3\">\n <h3 className=\"font-semibold text-[15px] inline-flex items-center gap-1.5 text-violet-700\">{I.sparkle} Resumo da conversa</h3>\n <button onClick={() => setAiSummary(null)} className=\"text-slate-400 hover:text-slate-700 text-xl leading-none\">×</button>\n </div>\n {aiSummary.loading && (\n <div className=\"py-8 flex items-center justify-center text-violet-300\">\n <svg className=\"animate-spin w-6 h-6\" viewBox=\"0 0 24 24\" fill=\"none\"><circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\" opacity=\"0.25\"/><path d=\"M22 12a10 10 0 0 1-10 10\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\"/></svg>\n </div>\n )}\n {aiSummary.error && <div className=\"text-[13px] text-rose-600\">{aiSummary.error}</div>}\n {aiSummary.text != null && !aiSummary.loading && (\n <div className=\"text-[13.5px] text-slate-700 whitespace-pre-wrap leading-relaxed max-h-80 overflow-y-auto\">{aiSummary.text}</div>\n )}\n </div>\n </div>\n )}\n </div>\n )\n}\n\n/* ---------- Sidebar (recolhível) ---------- */\nfunction Sidebar({ collapsed, onToggle, activeId, onSelect }) {\n return collapsed\n ? <SidebarCollapsed onToggle={onToggle} activeId={activeId} onSelect={onSelect} />\n : <SidebarExpanded onToggle={onToggle} activeId={activeId} onSelect={onSelect} />\n}\n\nfunction SidebarCollapsed({ onToggle, activeId, onSelect }) {\n return (\n <aside className=\"w-16 bg-white border-r border-slate-200 flex flex-col items-center py-3 shrink-0\">\n <button onClick={onToggle} title=\"Expandir menu\"\n className=\"w-10 h-10 rounded-xl flex items-center justify-center text-slate-500 hover:bg-slate-100 hover:text-slate-900 mb-2\">\n {I.chevDblR}\n </button>\n <div className=\"flex-1 w-full overflow-y-auto flex flex-col items-center gap-0.5 px-3 pb-3\">\n {NAV_DATA.map((n, i) => {\n if (n.kind === 'section') return <div key={i} className=\"w-6 h-px bg-slate-200 my-2\" />\n if (n.kind === 'group') {\n return (\n <SidebarIconBtn key={n.id} icon={I[n.icon]} title={n.label} />\n )\n }\n return (\n <SidebarIconBtn key={n.id} icon={I[n.icon]} title={n.label}\n active={activeId === n.id} onClick={() => onSelect(n.id)} badge={n.badge} />\n )\n })}\n </div>\n </aside>\n )\n}\n\nfunction SidebarIconBtn({ icon, title, active, onClick, badge }) {\n return (\n <button onClick={onClick} title={title}\n className={`relative w-10 h-10 rounded-xl flex items-center justify-center transition-colors\n ${active ? 'bg-lime-300 text-slate-900' : 'text-slate-500 hover:bg-slate-100 hover:text-slate-900'}`}>\n {icon}\n {badge && (\n <span className=\"absolute -top-0.5 -right-0.5 w-2 h-2 bg-lime-400 rounded-full ring-2 ring-white\" />\n )}\n </button>\n )\n}\n\nfunction SidebarExpanded({ onToggle, activeId, onSelect }) {\n const [openGroups, setOpenGroups] = useState({ 'mais-div': true })\n const toggleGroup = id => setOpenGroups(g => ({ ...g, [id]: !g[id] }))\n\n return (\n <aside className=\"w-64 bg-white border-r border-slate-200 flex flex-col shrink-0\">\n <header className=\"px-4 pt-4 pb-3 flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <VeployLogo size={26} />\n <span className=\"font-bold text-[18px] tracking-tight text-slate-900\">veploy</span>\n </div>\n <button onClick={onToggle} title=\"Recolher menu\"\n className=\"p-1.5 rounded-md text-slate-400 hover:bg-slate-100 hover:text-slate-700\">\n {I.chevDblL}\n </button>\n </header>\n\n <nav className=\"flex-1 overflow-y-auto px-3 pb-4 space-y-0.5\">\n {NAV_DATA.map((n, i) => {\n if (n.kind === 'section') {\n return (\n <div key={i} className=\"px-3 pt-4 pb-1.5 text-[10.5px] font-semibold uppercase tracking-[0.12em] text-slate-400\">\n {n.label}\n </div>\n )\n }\n if (n.kind === 'group') {\n const isOpen = openGroups[n.id]\n return (\n <div key={n.id}>\n <button onClick={() => toggleGroup(n.id)}\n className=\"w-full flex items-center gap-2.5 px-3 py-2 rounded-xl text-[13.5px] text-slate-500 hover:bg-slate-50 hover:text-slate-900\">\n <span className=\"w-5 h-5 flex items-center justify-center\">{I[n.icon]}</span>\n <span className=\"flex-1 text-left\">{n.label}</span>\n <span className={`text-slate-400 transition-transform ${isOpen ? '' : '-rotate-90'}`}>{I.chevDown}</span>\n </button>\n {isOpen && (\n <div className=\"ml-5 pl-4 border-l border-slate-200 mt-0.5 mb-1 space-y-0.5\">\n {n.children.map(child => (\n <button key={child.id} onClick={() => onSelect(child.id)}\n className={`w-full flex items-center gap-2 px-3 py-1.5 rounded-lg text-[13px]\n ${activeId === child.id ? 'bg-lime-300 text-slate-900 font-medium' : 'text-slate-600 hover:bg-slate-50 hover:text-slate-900'}`}>\n <span className=\"flex-1 text-left\">{child.label}</span>\n {child.badge && <NavBadge>{child.badge}</NavBadge>}\n </button>\n ))}\n </div>\n )}\n </div>\n )\n }\n const active = activeId === n.id\n return (\n <button key={n.id} onClick={() => onSelect(n.id)}\n className={`w-full flex items-center gap-2.5 px-3 py-2 rounded-xl text-[13.5px] transition-colors\n ${active ? 'bg-lime-300 text-slate-900 font-semibold' : 'text-slate-700 hover:bg-slate-50'}`}>\n <span className={`w-5 h-5 flex items-center justify-center ${active ? 'text-slate-900' : 'text-slate-500'}`}>\n {I[n.icon]}\n </span>\n <span className=\"flex-1 text-left\">{n.label}</span>\n {n.badge && <NavBadge>{n.badge}</NavBadge>}\n </button>\n )\n })}\n </nav>\n </aside>\n )\n}\n\nfunction NavBadge({ children }) {\n return (\n <span className=\"text-[9.5px] font-bold tracking-wide bg-lime-300 text-slate-800 px-1.5 py-0.5 rounded-full\">\n {children}\n </span>\n )\n}\n\n/* ---------- Subcomponentes ---------- */\nfunction ConversationItem({ c, active, onClick, assignee }) {\n return (\n <button onClick={onClick}\n className={`w-full text-left px-3 py-3 border-l-2 transition-colors flex gap-3 ${\n active ? 'bg-slate-50 border-emerald-500' : 'border-transparent hover:bg-slate-50'\n }`}>\n <Avatar name={c.name} src={c.avatar} color={c.avatarColor} />\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-1.5 min-w-0\">\n <span className={`text-[13.5px] truncate ${c.unread ? 'font-semibold' : 'font-medium text-slate-800'}`}>{c.name}</span>\n {c.starred && <span className=\"text-amber-400\">{I.star}</span>}\n </div>\n <span className={`text-[11px] shrink-0 ${c.unread ? 'text-emerald-600 font-semibold' : 'text-slate-400'}`}>{c.waitFor}</span>\n </div>\n <div className=\"flex items-center justify-between gap-2 mt-0.5\">\n <p className={`text-[12.5px] truncate ${c.unread ? 'text-slate-700' : 'text-slate-500'} ${c.preview ? '' : 'italic text-slate-400'}`}>\n {c.preview || 'Sem mensagens'}\n </p>\n {c.unread > 0 && (\n <span className=\"shrink-0 min-w-[18px] h-[18px] px-1.5 rounded-full bg-emerald-500 text-white text-[10px] font-bold inline-flex items-center justify-center\">\n {c.unread}\n </span>\n )}\n </div>\n {c.ticket && (\n <div className=\"flex items-center gap-1.5 mt-1.5\">\n <Pill tone=\"slate\">{c.ticket}</Pill>\n </div>\n )}\n </div>\n {assignee && (\n <span className=\"self-center shrink-0\" title={`Responsável: ${assignee.name}`}>\n <Avatar name={assignee.name} src={assignee.avatar} size=\"xs\" />\n </span>\n )}\n </button>\n )\n}\n\n// Skeleton de item de conversa (enquanto a lista carrega)\nfunction ConversationSkeleton() {\n return (\n <div className=\"px-3 py-3 flex gap-3 items-center\">\n <div className=\"w-9 h-9 rounded-full bg-slate-200 animate-pulse shrink-0\" />\n <div className=\"flex-1 min-w-0 space-y-2\">\n <div className=\"h-3 w-1/3 rounded bg-slate-200 animate-pulse\" />\n <div className=\"h-2.5 w-2/3 rounded bg-slate-100 animate-pulse\" />\n </div>\n </div>\n )\n}\n\nfunction ChatHeader({ c, onToggleDetails, detailsOpen, onOpenSearch, onTransfer, typing, onSummarize }) {\n const [menuOpen, setMenuOpen] = useState(false)\n const menuRef = useRef(null)\n useEffect(() => {\n if (!menuOpen) return\n const onDoc = e => { if (menuRef.current && !menuRef.current.contains(e.target)) setMenuOpen(false) }\n document.addEventListener('mousedown', onDoc)\n return () => document.removeEventListener('mousedown', onDoc)\n }, [menuOpen])\n\n return (\n <header className=\"bg-white border-b border-slate-200 px-5 py-3 flex items-center gap-3 min-w-0\">\n <Avatar name={c.name} src={c.avatar} color={c.avatarColor} size=\"lg\" />\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <h2 className=\"font-semibold text-[15px] truncate\">{c.name}</h2>\n </div>\n <div className=\"flex items-center gap-2 text-[12px] mt-0.5 min-w-0\">\n {typing ? (\n <span className=\"text-emerald-600 font-medium\">digitando…</span>\n ) : c.phone ? (\n <span className=\"inline-flex items-center gap-1 shrink-0 text-slate-500\">{I.phone} {c.phone}</span>\n ) : null}\n {/* ticket mock (CRM) — reativar quando ligado:\n <span className=\"hidden lg:inline text-slate-300 shrink-0\">·</span>\n <span className=\"hidden lg:inline-flex items-center gap-1 shrink-0\">{I.tag} {c.ticket}</span>\n */}\n </div>\n </div>\n\n {/* SLA / 1ª resposta / Resolver — mock (CRM), comentado p/ não exibir dados falsos:\n <div className=\"hidden 2xl:flex items-center gap-4 text-[12px] pr-3 border-r border-slate-200 shrink-0\">\n <div className=\"flex flex-col items-end leading-tight\">\n <span className=\"text-[9.5px] uppercase tracking-wide text-slate-400\">SLA</span>\n <span className=\"font-semibold text-amber-600 tabular-nums\">02:14</span>\n </div>\n <div className=\"flex flex-col items-end leading-tight\">\n <span className=\"text-[9.5px] uppercase tracking-wide text-slate-400\">1ª resposta</span>\n <span className=\"font-semibold text-emerald-600 tabular-nums\">00:48</span>\n </div>\n </div>\n <button className=\"shrink-0 text-[12.5px] font-medium bg-emerald-600 hover:bg-emerald-700 text-white px-3 py-1.5 rounded-lg inline-flex items-center gap-1.5\">\n {I.check} <span className=\"hidden lg:inline\">Resolver</span>\n </button>\n <div className=\"w-px h-6 bg-slate-200 shrink-0\" />\n */}\n\n <div className=\"flex items-center gap-0.5 shrink-0\">\n {onSummarize && (\n <button onClick={onSummarize} title=\"Resumo IA da conversa\"\n className=\"p-1.5 rounded-md text-violet-500 hover:bg-violet-50\">{I.sparkle}</button>\n )}\n <button onClick={onToggleDetails} title=\"Detalhes\"\n className={`p-1.5 rounded-md ${detailsOpen ? 'bg-slate-900 text-white' : 'text-slate-500 hover:bg-slate-100'}`}>\n {I.panel}\n </button>\n <div ref={menuRef} className=\"relative\">\n <button onClick={() => setMenuOpen(v => !v)} title=\"Mais opções\"\n className={`p-1.5 rounded-md ${menuOpen ? 'bg-slate-100 text-slate-900' : 'text-slate-500 hover:bg-slate-100'}`}>\n {I.more}\n </button>\n {menuOpen && (\n <div className=\"absolute right-0 top-[calc(100%+6px)] z-20 w-56 bg-white border border-slate-200 rounded-xl shadow-lg py-1.5 text-[13px]\">\n <MenuItem icon={I.forward} label=\"Transferir\" onClick={() => { setMenuOpen(false); onTransfer?.() }} />\n <MenuItem icon={I.search} label=\"Procurar na conversa\" onClick={() => { setMenuOpen(false); onOpenSearch?.() }} />\n {/* Ações ainda sem back-end (mock) — reativar quando implementadas:\n <MenuItem icon={I.phone} label=\"Ligar\" onClick={() => setMenuOpen(false)} />\n <MenuItem icon={I.userPlus} label=\"Adicionar participantes\" onClick={() => setMenuOpen(false)} />\n <MenuItem icon={I.star} label=\"Marcar com estrela\" onClick={() => setMenuOpen(false)} />\n <MenuItem icon={I.tag} label=\"Editar tags\" onClick={() => setMenuOpen(false)} />\n <MenuItem icon={I.link} label=\"Copiar link da conversa\" onClick={() => setMenuOpen(false)} />\n <MenuItem icon={I.x} label=\"Encerrar sem resolver\" tone=\"danger\" onClick={() => setMenuOpen(false)} />\n */}\n </div>\n )}\n </div>\n </div>\n </header>\n )\n}\n\nfunction MenuItem({ icon, label, onClick, tone }) {\n const color = tone === 'danger' ? 'text-rose-600 hover:bg-rose-50' : 'text-slate-700 hover:bg-slate-50'\n return (\n <button onClick={onClick}\n className={`w-full flex items-center gap-2.5 px-3 py-1.5 ${color}`}>\n <span className={tone === 'danger' ? 'text-rose-500' : 'text-slate-500'}>{icon}</span>\n <span className=\"flex-1 text-left\">{label}</span>\n </button>\n )\n}\n\nfunction SearchBar({ query, onChange, matches, currentIndex, onPrev, onNext, onClose }) {\n const inputRef = useRef(null)\n useEffect(() => { inputRef.current?.focus() }, [])\n useEffect(() => {\n const onKey = e => {\n if (e.key === 'Escape') onClose()\n if (e.key === 'Enter') { e.preventDefault(); e.shiftKey ? onPrev() : onNext() }\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [onClose, onPrev, onNext])\n\n return (\n <div className=\"bg-white border-b border-slate-200 px-5 py-2 flex items-center gap-3\">\n <span className=\"text-slate-400 shrink-0\">{I.search}</span>\n <input\n ref={inputRef}\n value={query}\n onChange={e => onChange(e.target.value)}\n placeholder=\"Procurar na conversa…\"\n className=\"flex-1 bg-transparent outline-none text-[13.5px] placeholder:text-slate-400 min-w-0\"\n />\n {query && (\n <span className=\"text-[12px] text-slate-500 tabular-nums shrink-0\">\n {matches.length === 0 ? 'sem resultados' : `${currentIndex + 1} de ${matches.length}`}\n </span>\n )}\n <div className=\"flex items-center gap-0.5 shrink-0\">\n <button onClick={onPrev} disabled={matches.length === 0}\n title=\"Anterior (Shift+Enter)\"\n className=\"p-1 rounded-md text-slate-500 hover:bg-slate-100 disabled:opacity-30 disabled:hover:bg-transparent\">\n {I.chevUp}\n </button>\n <button onClick={onNext} disabled={matches.length === 0}\n title=\"Próximo (Enter)\"\n className=\"p-1 rounded-md text-slate-500 hover:bg-slate-100 disabled:opacity-30 disabled:hover:bg-transparent\">\n {I.chevDown}\n </button>\n <button onClick={onClose} title=\"Fechar (Esc)\"\n className=\"p-1 rounded-md text-slate-500 hover:bg-slate-100 ml-1\">\n {I.x}\n </button>\n </div>\n </div>\n )\n}\n\nfunction highlightText(text, query, isCurrent) {\n if (!query) return text\n const q = query.trim()\n if (!q) return text\n const lower = text.toLowerCase()\n const ql = q.toLowerCase()\n if (!lower.includes(ql)) return text\n const parts = []\n let last = 0\n let idx = lower.indexOf(ql)\n let key = 0\n while (idx !== -1) {\n if (idx > last) parts.push(text.slice(last, idx))\n parts.push(\n <mark key={key++} className={`rounded px-0.5 ${isCurrent ? 'bg-amber-400 text-slate-900' : 'bg-yellow-200 text-slate-900'}`}>\n {text.slice(idx, idx + ql.length)}\n </mark>\n )\n last = idx + ql.length\n idx = lower.indexOf(ql, last)\n }\n if (last < text.length) parts.push(text.slice(last))\n return parts\n}\n\nfunction DayDivider({ label }) {\n return (\n <div className=\"flex items-center justify-center my-3\">\n <span className=\"text-[11px] font-medium text-slate-600 bg-white border border-slate-200 rounded-full px-2.5 py-0.5 shadow-soft\">{label}</span>\n </div>\n )\n}\n\n// Placeholder do painel direito quando nenhuma conversa está aberta (estilo WhatsApp).\nfunction EmptyConversation() {\n return (\n <div className=\"flex-1 flex flex-col items-center justify-center text-center px-8 select-none\">\n <div className=\"w-20 h-20 rounded-full bg-slate-100 flex items-center justify-center text-slate-300 mb-5\">\n <Icon\n d={<path d=\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5Z\" />}\n className=\"w-9 h-9\"\n />\n </div>\n <h3 className=\"text-[15px] font-semibold text-slate-700\">Nenhuma conversa aberta</h3>\n <p className=\"text-[13px] text-slate-400 mt-1 max-w-xs leading-relaxed\">\n Selecione uma conversa na lista ao lado para ver as mensagens e responder.\n </p>\n </div>\n )\n}\n\nfunction Ticks({ status }) {\n // pending: relógio (enviando…), igual WhatsApp — cor herda da linha (emerald no out)\n if (status === 'pending' || !status) return (\n <svg className=\"inline w-3 h-3 opacity-70\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"12\" r=\"9\" /><path d=\"M12 7.5V12l3 1.5\" />\n </svg>\n )\n if (status === 'failed') return <span className=\"text-rose-200 font-bold\" title=\"Falha ao enviar\">!</span>\n // ticks no balão verde (out): claros p/ sent/delivered, azul vivo p/ read (estilo WhatsApp)\n if (status === 'sent') return <span className=\"text-emerald-100/80\">✓</span>\n if (status === 'delivered') return <span className=\"text-emerald-100/80\" style={{ letterSpacing: '-0.18em' }}>✓✓</span>\n if (status === 'read') return <span className=\"text-sky-300\" style={{ letterSpacing: '-0.18em' }}>✓✓</span>\n return null\n}\n\nfunction Message({ m, searchQuery = '', isCurrentMatch = false, isGroup, selectable, selectMode, selected, onEnterSelect, onToggleSelect }) {\n if (m.side === 'system') {\n return (\n <div className=\"flex justify-center my-2\">\n <span className=\"text-[11px] text-slate-500 bg-slate-100 rounded-full px-2.5 py-0.5\">{m.text} · {m.time}</span>\n </div>\n )\n }\n if (m.side === 'note') {\n return (\n <div className=\"flex justify-end my-2\">\n <div className={`max-w-[70%] bg-yellow-50 border rounded-2xl rounded-tr-sm px-3.5 py-2.5 shadow-soft ${isCurrentMatch ? 'border-amber-500 ring-2 ring-amber-300' : 'border-yellow-200'}`}>\n <div className=\"flex items-center justify-between gap-3 mb-1\">\n <span className=\"text-[11px] font-semibold text-yellow-800 inline-flex items-center gap-1\">{I.pin} Nota interna · {m.author}</span>\n <span className=\"text-[11px] text-yellow-700\">{m.time}</span>\n </div>\n <p className=\"text-[13.5px] text-yellow-900 leading-relaxed\">{highlightText(m.text, searchQuery, isCurrentMatch)}</p>\n </div>\n </div>\n )\n }\n\n const isOut = m.side === 'out'\n return (\n <div\n className={`flex items-center gap-2 group ${selectMode ? 'cursor-pointer -mx-2 px-2 py-0.5 rounded-lg' : ''} ${selected ? 'bg-emerald-50' : ''}`}\n onClick={selectMode ? onToggleSelect : undefined}\n >\n {selectMode && (\n <span className={`shrink-0 w-5 h-5 rounded-full border-2 flex items-center justify-center ${selected ? 'bg-emerald-500 border-emerald-500 text-white' : 'border-slate-300 bg-white'}`}>\n {selected && <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"3.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"/></svg>}\n </span>\n )}\n <div className={`flex-1 min-w-0 flex ${isOut ? 'justify-end' : 'justify-start'} items-center`}>\n <div className=\"max-w-[70%]\">\n <div className={`relative px-3.5 py-2.5 rounded-2xl shadow-soft ${\n isOut\n ? 'bg-emerald-600 text-white rounded-tr-sm'\n : 'bg-white border border-slate-200 text-slate-800 rounded-tl-sm'\n } ${isCurrentMatch ? 'ring-2 ring-amber-400' : ''}`}>\n {!isOut && isGroup && m.author && (\n <div className=\"text-[11.5px] font-semibold text-emerald-700 mb-0.5\">{m.author}</div>\n )}\n {m.kind === 'text' && <p className=\"text-[13.5px] leading-relaxed whitespace-pre-wrap\">{highlightText(m.text, searchQuery, isCurrentMatch)}</p>}\n\n {m.kind === 'image' && (\n <div className=\"-mx-1 -mt-1\">\n {m.mediaUrl ? (\n <a href={m.mediaUrl} target=\"_blank\" rel=\"noreferrer\">\n <img src={m.mediaUrl} alt={m.caption || 'imagem'} className=\"w-64 max-h-72 object-cover rounded-lg\" />\n </a>\n ) : (\n <div className=\"w-64 h-40 rounded-lg bg-gradient-to-br from-slate-200 to-slate-300 flex items-center justify-center text-slate-500\">\n {I.image}\n </div>\n )}\n {m.caption && <p className=\"text-[13px] mt-2\">{highlightText(m.caption, searchQuery, isCurrentMatch)}</p>}\n </div>\n )}\n\n {m.kind === 'video' && (\n <div className=\"-mx-1 -mt-1\">\n {m.mediaUrl\n ? <video src={m.mediaUrl} controls className=\"w-64 rounded-lg\" />\n : <div className=\"w-64 h-40 rounded-lg bg-slate-200 flex items-center justify-center text-slate-500\">🎥</div>}\n {m.caption && <p className=\"text-[13px] mt-2\">{highlightText(m.caption, searchQuery, isCurrentMatch)}</p>}\n </div>\n )}\n\n {m.kind === 'document' && (\n <a href={m.mediaUrl || '#'} target=\"_blank\" rel=\"noreferrer\"\n className={`flex items-center gap-2.5 min-w-[200px] rounded-lg px-2 py-1.5 ${isOut ? 'bg-emerald-700/40' : 'bg-slate-100'}`}>\n <span className={isOut ? 'text-emerald-100' : 'text-slate-500'}>{I.file}</span>\n <span className=\"text-[13px] truncate flex-1\">{m.filename || m.caption || 'Documento'}</span>\n </a>\n )}\n\n {m.kind === 'audio' && (\n m.mediaUrl ? (\n // player real (quando a mídia estiver armazenada — R2)\n <audio src={m.mediaUrl} controls className=\"w-60 max-w-full\" />\n ) : (\n // sem mídia guardada ainda: chip honesto, sem player falso\n <div className={`flex items-center gap-2 min-w-[140px] ${isOut ? 'text-emerald-50' : 'text-slate-600'}`}>\n <span className={isOut ? 'text-emerald-100' : 'text-slate-500'}>{I.mic}</span>\n <span className=\"text-[13px]\">Áudio{m.caption ? ` · ${m.caption}` : ''}</span>\n </div>\n )\n )}\n\n <div className={`flex items-center gap-1 justify-end mt-1 text-[10.5px] ${isOut ? 'text-emerald-100' : 'text-slate-400'}`}>\n {m.author && !isOut === false && <span className=\"mr-1\">{m.author}</span>}\n <span>{m.time}</span>\n {isOut && <Ticks status={m.status} />}\n </div>\n </div>\n\n {/* Hover actions (responder/encaminhar/reagir/mais) — sem back-end ainda,\n comentado p/ não atrapalhar. Reativar quando implementadas:\n <div className={`flex gap-1 mt-1 opacity-0 group-hover:opacity-100 transition-opacity ${isOut ? 'justify-end' : 'justify-start'}`}>\n <HoverBtn icon={I.reply} />\n <HoverBtn icon={I.forward} />\n <HoverBtn icon={I.emoji} />\n <HoverBtn icon={I.more} />\n </div>\n */}\n </div>\n {!selectMode && selectable && (\n <button onClick={(e) => { e.stopPropagation(); onEnterSelect() }} title=\"Selecionar mensagem\"\n className=\"opacity-0 group-hover:opacity-100 transition-opacity self-center mx-1 p-1 rounded-md text-slate-400 hover:text-slate-700 hover:bg-slate-100 shrink-0\">\n {I.check}\n </button>\n )}\n </div>\n </div>\n )\n}\n\nfunction HoverBtn({ icon }) {\n return (\n <button className=\"p-1 rounded-md text-slate-400 bg-white border border-slate-200 hover:text-slate-700 shadow-soft\">{icon}</button>\n )\n}\n\nfunction ComposeBtn({ icon, label }) {\n return (\n <button className=\"text-slate-500 hover:bg-slate-100 px-1.5 py-1.5 rounded-md inline-flex items-center gap-1 text-[12px]\">\n {icon} {label && <span>{label}</span>}\n </button>\n )\n}\n\nfunction fmtSecs(s) {\n const m = Math.floor(s / 60)\n return `${m}:${String(s % 60).padStart(2, '0')}`\n}\n\n// Waveform estilo WhatsApp: acumula amostras de volume ao longo do tempo e\n// rola da direita p/ esquerda, mostrando o áudio \"passando\".\nfunction AudioWave({ analyserRef }) {\n const MAX = 56\n const [samples, setSamples] = useState([])\n useEffect(() => {\n let raf\n let last = 0\n const buf = []\n const loop = (ts) => {\n const an = analyserRef?.current\n if (an && ts - last > 70) {\n last = ts\n const data = new Uint8Array(an.fftSize)\n an.getByteTimeDomainData(data)\n let sum = 0\n for (let i = 0; i < data.length; i++) {\n const v = (data[i] - 128) / 128\n sum += v * v\n }\n const rms = Math.sqrt(sum / data.length)\n buf.push(Math.min(1, rms * 2.4))\n if (buf.length > MAX) buf.shift()\n setSamples([...buf])\n }\n raf = requestAnimationFrame(loop)\n }\n raf = requestAnimationFrame(loop)\n return () => cancelAnimationFrame(raf)\n }, [analyserRef])\n return (\n <div className=\"flex items-center justify-start gap-[2px] h-7 flex-1 min-w-0 overflow-hidden\">\n {samples.map((v, i) => (\n <span key={i} style={{ height: `${Math.max(2, v * 26)}px` }}\n className=\"w-[2px] bg-rose-400 rounded-full shrink-0\" />\n ))}\n </div>\n )\n}\n\nfunction AttachMenu({ onImage, onFile }) {\n const [open, setOpen] = useState(false)\n const ref = useRef(null)\n useEffect(() => {\n if (!open) return\n const onDoc = e => { if (ref.current && !ref.current.contains(e.target)) setOpen(false) }\n document.addEventListener('mousedown', onDoc)\n return () => document.removeEventListener('mousedown', onDoc)\n }, [open])\n\n return (\n <div ref={ref} className=\"relative\">\n <button onClick={() => setOpen(v => !v)} title=\"Anexar\"\n className={`px-1.5 py-1.5 rounded-md inline-flex items-center ${open ? 'bg-slate-100 text-slate-900' : 'text-slate-500 hover:bg-slate-100'}`}>\n {I.paperclip}\n </button>\n {open && (\n <div className=\"absolute bottom-[calc(100%+6px)] left-0 z-20 w-44 bg-white border border-slate-200 rounded-xl shadow-lg py-1.5 text-[13px]\">\n <MenuItem icon={I.image} label=\"Imagem\" onClick={() => { setOpen(false); onImage?.() }} />\n <MenuItem icon={I.file} label=\"Documento\" onClick={() => { setOpen(false); onFile?.() }} />\n </div>\n )}\n </div>\n )\n}\n\n/* ---------- Painel de detalhes ---------- */\nfunction DetailsPanel({ c, onClose }) {\n const [tab, setTab] = useState('details')\n return (\n <aside className=\"w-[340px] bg-white border-l border-slate-200 flex flex-col\">\n <header className=\"px-4 py-3 border-b border-slate-200 flex items-center justify-between\">\n <div className=\"flex gap-3 text-[12.5px]\">\n {[\n ['details', 'Detalhes'],\n ['notes', 'Notas'],\n ['history', 'Histórico'],\n ].map(([k, l]) => (\n <button key={k} onClick={() => setTab(k)}\n className={`pb-2 -mb-3 font-medium border-b-2 ${tab === k ? 'border-slate-900 text-slate-900' : 'border-transparent text-slate-500 hover:text-slate-800'}`}>\n {l}\n </button>\n ))}\n </div>\n <div className=\"flex items-center gap-1\">\n <button className=\"p-1.5 rounded-md text-slate-500 hover:bg-slate-100\">{I.external}</button>\n <button onClick={onClose} className=\"p-1.5 rounded-md text-slate-500 hover:bg-slate-100\">{I.x}</button>\n </div>\n </header>\n\n <div className=\"flex-1 overflow-y-auto\">\n {tab === 'details' && <DetailsTab c={c} />}\n {tab === 'notes' && <NotesTab />}\n {tab === 'history' && <HistoryTab />}\n </div>\n </aside>\n )\n}\n\nfunction Section({ title, action, children, defaultOpen = true }) {\n const [open, setOpen] = useState(defaultOpen)\n return (\n <div className=\"border-b border-slate-100\">\n <button onClick={() => setOpen(v => !v)} className=\"w-full px-4 pt-4 pb-2 flex items-center justify-between\">\n <span className=\"text-[11px] font-semibold uppercase tracking-wider text-slate-500\">{title}</span>\n <span className={`text-slate-400 transition-transform ${open ? '' : '-rotate-90'}`}>{I.chevDown}</span>\n </button>\n {open && <div className=\"px-4 pb-4 space-y-2.5\">{children}{action}</div>}\n </div>\n )\n}\n\nfunction Row({ label, children }) {\n return (\n <div className=\"flex items-start gap-3 text-[12.5px]\">\n <span className=\"w-28 shrink-0 text-slate-500 pt-0.5\">{label}</span>\n <div className=\"flex-1 min-w-0 text-slate-800\">{children}</div>\n </div>\n )\n}\n\nconst PROPERTY_CATALOG = [\n { id: '856235', title: 'Apto 80m² · Jardins · 2 dorm' },\n { id: '856301', title: 'Apto 65m² · Vila Mariana · 2 dorm' },\n { id: '857188', title: 'Cobertura 120m² · Itaim · 3 dorm' },\n { id: '854902', title: 'Casa 180m² · Alto de Pinheiros · 4 dorm' },\n { id: '855417', title: 'Studio 35m² · Pinheiros · 1 dorm' },\n { id: '858033', title: 'Apto 95m² · Moema · 3 dorm' },\n { id: '858720', title: 'Apto 110m² · Perdizes · 3 dorm' },\n]\n\nfunction PropertyLinker() {\n const [linked, setLinked] = useState([PROPERTY_CATALOG[0], PROPERTY_CATALOG[5]])\n const [query, setQuery] = useState('')\n const [adding, setAdding] = useState(false)\n const inputRef = useRef(null)\n const wrapRef = useRef(null)\n\n useEffect(() => { if (adding) inputRef.current?.focus() }, [adding])\n\n useEffect(() => {\n if (!adding) return\n const onDoc = e => { if (wrapRef.current && !wrapRef.current.contains(e.target)) closeAdd() }\n document.addEventListener('mousedown', onDoc)\n return () => document.removeEventListener('mousedown', onDoc)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [adding])\n\n const suggestions = useMemo(() => {\n const q = query.trim().toLowerCase()\n const linkedIds = new Set(linked.map(p => p.id))\n return PROPERTY_CATALOG.filter(p =>\n !linkedIds.has(p.id) &&\n (q === '' || p.id.toLowerCase().includes(q) || p.title.toLowerCase().includes(q))\n ).slice(0, 5)\n }, [query, linked])\n\n const closeAdd = () => { setAdding(false); setQuery('') }\n const addProperty = p => { setLinked(l => [...l, p]); closeAdd() }\n const removeProperty = id => setLinked(l => l.filter(p => p.id !== id))\n\n return (\n <div ref={wrapRef} className=\"w-full\">\n <div className=\"flex flex-wrap items-center gap-x-3 gap-y-1\">\n {linked.map(p => (\n <div key={p.id} className=\"group inline-flex items-center gap-0.5 text-[13px] leading-tight\">\n <a href=\"#\" title={p.title}\n className=\"text-slate-700 underline underline-offset-2 hover:text-emerald-700 inline-flex items-center gap-1 tabular-nums\">\n {p.id}\n <span className=\"text-slate-400 group-hover:text-emerald-600\">{I.external}</span>\n </a>\n <button onClick={() => removeProperty(p.id)} title=\"Desvincular\"\n className=\"opacity-0 group-hover:opacity-100 p-0.5 text-slate-400 hover:text-rose-500 transition-opacity\">\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth=\"2.5\" fill=\"none\" strokeLinecap=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n <line x1=\"6\" y1=\"18\" x2=\"18\" y2=\"6\"/>\n </svg>\n </button>\n </div>\n ))}\n {!adding && (\n <button onClick={() => setAdding(true)} title=\"Vincular imóvel\"\n className=\"text-[11px] text-slate-500 hover:text-slate-800 inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded-full border border-dashed border-slate-300 hover:border-slate-400 hover:bg-slate-50\">\n + imóvel\n </button>\n )}\n </div>\n\n {adding && (\n <div className=\"relative mt-2\">\n <span className=\"absolute left-2 top-1/2 -translate-y-1/2 text-slate-400 pointer-events-none\">{I.search}</span>\n <input\n ref={inputRef}\n value={query}\n onChange={e => setQuery(e.target.value)}\n onKeyDown={e => { if (e.key === 'Escape') closeAdd() }}\n placeholder=\"Código ou bairro…\"\n className=\"w-full pl-7 pr-2 py-1.5 text-[12px] rounded-lg bg-white border border-slate-300 outline-none focus:border-slate-400 placeholder:text-slate-400\"\n />\n {suggestions.length > 0 && (\n <div className=\"absolute top-full left-0 right-0 mt-1 z-30 bg-white border border-slate-200 rounded-lg shadow-lg overflow-hidden\">\n {suggestions.map(p => (\n <button key={p.id} onClick={() => addProperty(p)}\n className=\"w-full text-left px-2.5 py-1.5 hover:bg-slate-50 flex items-center gap-2 border-b border-slate-100 last:border-b-0\">\n <span className=\"text-[12.5px] font-mono font-semibold text-slate-700 tabular-nums\">{p.id}</span>\n <span className=\"text-slate-300\">·</span>\n <span className=\"text-[11.5px] text-slate-500 truncate flex-1 min-w-0\">{p.title}</span>\n <span className=\"text-slate-300 shrink-0\">{I.plus}</span>\n </button>\n ))}\n </div>\n )}\n {query.trim() && suggestions.length === 0 && (\n <div className=\"absolute top-full left-0 right-0 mt-1 z-30 bg-white border border-slate-200 rounded-lg shadow-lg px-3 py-2 text-[12px] text-slate-500\">\n Nenhum imóvel encontrado para \"{query.trim()}\".\n </div>\n )}\n </div>\n )}\n </div>\n )\n}\n\nfunction LinkRow({ icon, label }) {\n return (\n <button className=\"w-full flex items-center gap-2 text-[13px] text-slate-700 hover:bg-slate-50 -mx-1 px-1 py-1 rounded-md\">\n <span className=\"text-slate-500\">{icon}</span>\n <span className=\"flex-1 text-left\">{label}</span>\n <span className=\"text-slate-400\">{I.plus}</span>\n </button>\n )\n}\n\nfunction ActionRow({ icon, label, children, onClick }) {\n const [open, setOpen] = useState(false)\n const hasSubmenu = !!children\n const handle = () => hasSubmenu ? setOpen(v => !v) : onClick?.()\n return (\n <div>\n <button onClick={handle}\n className=\"w-full flex items-center gap-2 text-[13px] text-slate-700 hover:bg-slate-50 -mx-1 px-1 py-1 rounded-md\">\n <span className=\"text-slate-500\">{icon}</span>\n <span className=\"flex-1 text-left\">{label}</span>\n <span className={`text-slate-400 transition-transform ${hasSubmenu && open ? 'rotate-90' : ''}`}>\n {hasSubmenu ? I.chevRight : I.plus}\n </span>\n </button>\n {hasSubmenu && open && (\n <div className=\"ml-7 mt-0.5 mb-1 border-l border-slate-200 pl-3 space-y-0.5\">\n {children}\n </div>\n )}\n </div>\n )\n}\n\nfunction SubAction({ label, onClick }) {\n return (\n <button onClick={onClick}\n className=\"w-full text-left text-[12.5px] text-slate-600 hover:text-slate-900 hover:bg-slate-50 -mx-1 px-1.5 py-1 rounded-md\">\n {label}\n </button>\n )\n}\n\nfunction DetailsTab({ c }) {\n // Por enquanto só o cabeçalho do contato (avatar/nome/telefone) é real.\n // Tags, Atribuição, Ticket e Ações são da fase CRM e ainda são MOCK (não\n // ligados ao backend) — comentados p/ não exibir dados falsos. A interface\n // fica preservada no bloco /* CRM (MOCK) */ abaixo; é só descomentar e ligar\n // aos dados reais quando o CRM estiver pronto.\n return (\n <>\n <div className=\"px-4 pt-4 pb-3 flex items-start gap-3\">\n <Avatar name={c.name} src={c.avatar} color={c.avatarColor} size=\"xl\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-semibold truncate\">{c.name}</div>\n {c.phone && <div className=\"text-[12px] text-slate-500 truncate\">{c.phone}</div>}\n </div>\n </div>\n </>\n )\n\n /* ===== CRM (MOCK — ainda não em uso; preservado p/ reativar) =============\n const palette = ['sky', 'rose', 'violet', 'emerald', 'amber', 'slate']\n const [tags, setTags] = useState([\n { label: 'Comprador', tone: 'sky' },\n { label: 'Quente', tone: 'rose' },\n { label: 'Apto 2-3 dorm', tone: 'violet' },\n { label: 'Zona Sul', tone: 'emerald' },\n { label: 'Até R$ 900k', tone: 'amber' },\n ])\n const [expanded, setExpanded] = useState(false)\n const [adding, setAdding] = useState(false)\n const [newTag, setNewTag] = useState('')\n const tagInputRef = useRef(null)\n useEffect(() => { if (adding) tagInputRef.current?.focus() }, [adding])\n\n const VISIBLE = 3\n const shownTags = expanded ? tags : tags.slice(0, VISIBLE)\n const hiddenCount = Math.max(0, tags.length - VISIBLE)\n\n const addTag = () => {\n const v = newTag.trim()\n if (v) setTags(t => [...t, { label: v, tone: palette[t.length % palette.length] }])\n setNewTag('')\n setAdding(false)\n }\n const removeTag = i => setTags(t => t.filter((_, idx) => idx !== i))\n\n return (\n <>\n <div className=\"px-4 pt-4 pb-3 flex items-start gap-3\">\n <Avatar name={c.name} color={c.avatarColor} size=\"xl\" online />\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-semibold truncate\">{c.name}</div>\n <div className=\"text-[12px] text-slate-500 truncate\">{c.phone}</div>\n <div className=\"flex flex-wrap gap-1 mt-1.5\">\n {shownTags.map((t, i) => (\n <Pill key={`${t.label}-${i}`} tone={t.tone}>\n {t.label}\n <button onClick={() => removeTag(i)} title=\"Remover\"\n className=\"ml-0.5 -mr-0.5 opacity-60 hover:opacity-100\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth=\"3\" fill=\"none\" strokeLinecap=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/>\n <line x1=\"6\" y1=\"18\" x2=\"18\" y2=\"6\"/>\n </svg>\n </button>\n </Pill>\n ))}\n {!expanded && hiddenCount > 0 && (\n <button onClick={() => setExpanded(true)}\n className=\"text-[11px] text-slate-500 hover:text-slate-800 px-1.5 py-0.5 rounded-full hover:bg-slate-100 self-center\">\n +{hiddenCount}\n </button>\n )}\n {expanded && tags.length > VISIBLE && (\n <button onClick={() => setExpanded(false)}\n className=\"text-[11px] text-slate-500 hover:text-slate-800 px-1.5 py-0.5 rounded-full hover:bg-slate-100 self-center\">\n mostrar menos\n </button>\n )}\n {adding ? (\n <input\n ref={tagInputRef}\n value={newTag}\n onChange={e => setNewTag(e.target.value)}\n onBlur={addTag}\n onKeyDown={e => {\n if (e.key === 'Enter') { e.preventDefault(); addTag() }\n if (e.key === 'Escape') { setNewTag(''); setAdding(false) }\n }}\n placeholder=\"nova tag…\"\n className=\"text-[11px] px-2 py-0.5 rounded-full bg-white border border-slate-300 outline-none focus:border-slate-500 w-24\"\n />\n ) : (\n <button onClick={() => { setExpanded(true); setAdding(true) }} title=\"Adicionar tag\"\n className=\"text-[11px] text-slate-500 hover:text-slate-800 inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded-full border border-dashed border-slate-300 hover:border-slate-400 hover:bg-slate-50\">\n + tag\n </button>\n )}\n </div>\n </div>\n </div>\n\n <Section title=\"Atribuição\">\n <Row label=\"Atendente\">\n <span className=\"inline-flex items-center gap-1.5\">\n <Avatar name=\"Maria Eduarda\" size=\"sm\" color=\"bg-amber-500\" /> Maria Eduarda\n </span>\n </Row>\n <Row label=\"Departamento\">\n <span className=\"inline-flex items-center gap-1.5\">\n <span className=\"w-5 h-5 rounded-md bg-rose-500 text-white text-[10px] flex items-center justify-center font-bold\">CO</span>\n Comercial\n </span>\n </Row>\n <Row label=\"Origem\">\n <span className=\"inline-flex items-center gap-1.5 text-emerald-700\">{I.whatsapp} WhatsApp Business</span>\n </Row>\n </Section>\n\n <Section title=\"Ticket\">\n <Row label=\"Tipo\"><Pill tone=\"rose\">🏠 Interesse em compra</Pill></Row>\n <Row label=\"Status\"><Pill tone={statusInfo[c.status].tone}>{statusInfo[c.status].label}</Pill></Row>\n <Row label=\"Prioridade\"><Pill tone={c.priority === 'urgent' ? 'rose' : c.priority === 'high' ? 'amber' : 'slate'}>Alta</Pill></Row>\n <Row label=\"Imóveis\"><PropertyLinker /></Row>\n <Row label=\"Aberto\">há 18 min</Row>\n </Section>\n\n <Section title=\"Ações\">\n <ActionRow icon={I.userPlus} label=\"Adicionar cliente\">\n <SubAction label=\"Proprietário\" />\n <SubAction label=\"Cliente\" />\n </ActionRow>\n <ActionRow icon={I.checkCircle} label=\"Criar tarefa\" />\n <ActionRow icon={I.calendar} label=\"Agendar visita\" />\n <ActionRow icon={I.file} label=\"Enviar documentos\" />\n </Section>\n\n </>\n )\n ========================================================================== */\n}\n\n// Empty state genérico (ícone + título + texto) p/ abas ainda sem dados reais.\nfunction EmptyTab({ icon, title, hint }) {\n return (\n <div className=\"flex flex-col items-center justify-center text-center px-8 py-16 select-none\">\n <div className=\"w-12 h-12 rounded-full bg-slate-100 flex items-center justify-center text-slate-300 mb-3\">{icon}</div>\n <p className=\"text-[13px] font-medium text-slate-600\">{title}</p>\n {hint && <p className=\"text-[12px] text-slate-400 mt-1 max-w-[220px]\">{hint}</p>}\n </div>\n )\n}\n\nfunction NotesTab() {\n // Vazio até ligar às notas reais (inbox_messages kind='note' da conversa).\n return <EmptyTab icon={I.pin} title=\"Nenhuma nota ainda\" hint=\"Use “Nota interna” no compositor do chat para registrar algo visível só para o time.\" />\n\n /* ===== MOCK (preservado p/ reativar quando ligar às notas reais) ==========\n return (\n <div className=\"p-4 space-y-3\">\n <div className=\"bg-yellow-50 border border-yellow-200 rounded-xl p-3\">\n <div className=\"flex items-center justify-between mb-1.5\">\n <span className=\"text-[11.5px] font-semibold text-yellow-800 inline-flex items-center gap-1\">{I.pin} Maria Eduarda</span>\n <span className=\"text-[11px] text-yellow-700\">há 11 min</span>\n </div>\n <p className=\"text-[13px] text-yellow-900\">Cliente Gold — perfil quente, decisão rápida. Já visitou conosco em fev/26 (ticket #7892), gostou da região mas o imóvel estava acima do orçamento.</p>\n </div>\n <div className=\"bg-yellow-50 border border-yellow-200 rounded-xl p-3\">\n <div className=\"flex items-center justify-between mb-1.5\">\n <span className=\"text-[11.5px] font-semibold text-yellow-800 inline-flex items-center gap-1\">{I.pin} Alissa Mendes</span>\n <span className=\"text-[11px] text-yellow-700\">há 4 min</span>\n </div>\n <p className=\"text-[13px] text-yellow-900\">Confirmei com os proprietários — Vila Mariana e Moema liberados pra visita amanhã das 10h às 17h.</p>\n </div>\n <button className=\"w-full text-[12.5px] py-2 rounded-lg border border-dashed border-slate-300 text-slate-500 hover:bg-slate-50 inline-flex items-center justify-center gap-1\">\n {I.plus} Nova nota\n </button>\n </div>\n )\n ========================================================================== */\n}\n\nfunction HistoryTab() {\n // Vazio até ligar ao histórico real de tickets/atendimentos do contato.\n return <EmptyTab icon={I.chat} title=\"Sem histórico\" hint=\"Atendimentos anteriores deste contato aparecerão aqui.\" />\n\n /* ===== MOCK (preservado p/ reativar) ======================================\n const items = [\n { t: 'Ticket #7892 — Visita apto Itaim', s: 'Sem proposta', when: 'fev/26', tone: 'slate' },\n { t: 'Ticket #7541 — Interesse em cobertura', s: 'Resolvido', when: 'jan/26', tone: 'emerald' },\n { t: 'Ticket #7233 — Pedido de matrícula', s: 'Resolvido', when: 'dez/25', tone: 'emerald' },\n { t: 'Ticket #6890 — Primeira simulação', s: 'Resolvido', when: 'out/25', tone: 'emerald' },\n ]\n return (\n <div className=\"p-4 space-y-2\">\n {items.map((it, i) => (\n <button key={i} className=\"w-full text-left bg-white border border-slate-200 hover:border-slate-300 rounded-xl p-3 flex items-start gap-3\">\n <span className=\"w-8 h-8 rounded-lg bg-slate-100 text-slate-500 flex items-center justify-center\">{I.chat}</span>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-[13px] font-medium truncate\">{it.t}</p>\n <div className=\"flex items-center gap-2 mt-1\">\n <Pill tone={it.tone}>{it.s}</Pill>\n <span className=\"text-[11.5px] text-slate-500\">{it.when}</span>\n </div>\n </div>\n <span className=\"text-slate-400 mt-1\">{I.chevRight}</span>\n </button>\n ))}\n </div>\n )\n ========================================================================== */\n}\n","// src/lib/useInbox.js\n// Live inbox data layer, driven by the injected config (via <PloyChat>).\n'use client'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport { usePloy } from './context'\nimport { mapConversation, mapMessage, nowHHMM } from './mappers'\n\nexport function useInbox() {\n const { client } = usePloy()\n const live = client.live\n\n const [conversations, setConversations] = useState([])\n const [activeId, setActiveId] = useState(null)\n const [messages, setMessages] = useState([])\n const [messagesLoading, setMessagesLoading] = useState(false)\n const [channels, setChannels] = useState([])\n const [channelsLoaded, setChannelsLoaded] = useState(false)\n const [agents, setAgents] = useState([])\n const [me, setMe] = useState(null)\n const [canDelete, setCanDelete] = useState(false)\n const [scope, setScope] = useState('all') // 'all' = vê todas; 'own' = só as minhas\n const [draftConv, setDraftConv] = useState(null) // conversa nova sem mensagem: abre, mas não lista\n const [tenantId, setTenantId] = useState(null)\n const [typingConvId, setTypingConvId] = useState(null) // conversa onde o contato está digitando\n const [loading, setLoading] = useState(live)\n const [error, setError] = useState(null)\n const activeIdRef = useRef(null)\n activeIdRef.current = activeId\n const typingTimerRef = useRef(null)\n\n const api = client.apiFetch\n\n // identity + tenant (tenant drives the realtime topic; may differ from workspace)\n useEffect(() => {\n if (!live) return\n api('/v1/me')\n .then((m) => { if (m?.user?.id) setMe(m.user.id); if (m?.tenant_id) setTenantId(m.tenant_id); setCanDelete(!!m?.can_delete); if (m?.inbox_scope) setScope(m.inbox_scope) })\n .catch(() => {})\n }, [live, api])\n\n const loadConversations = useCallback(async () => {\n if (!live) return\n try {\n const data = await api('/v1/conversations?limit=50')\n const mapped = (data || []).map(mapConversation)\n setConversations(mapped)\n setActiveId((a) => a || mapped[0]?.id || null)\n } catch (e) { setError(e.message) } finally { setLoading(false) }\n }, [live, api])\n\n // cache por conversa → trocar/reabrir conversa fica instantâneo (refetch em bg)\n const msgCacheRef = useRef({})\n const loadMessages = useCallback(async (convId, opts = {}) => {\n if (!live || !convId) return\n // silent: refetch sem trocar pro cache (evita \"piscar\" ao receber/enviar na conversa aberta)\n if (!opts.silent) {\n const cached = msgCacheRef.current[convId]\n if (cached) { setMessages(cached); setMessagesLoading(false) }\n else { setMessages([]); setMessagesLoading(true) }\n }\n try {\n const res = await api(`/v1/conversations/${convId}/messages?limit=50`)\n const mapped = (res?.messages || []).slice().reverse().map(mapMessage)\n msgCacheRef.current[convId] = mapped\n if (activeIdRef.current === convId) setMessages(mapped) // ignora respostas de conversa antiga\n } catch (e) { setError(e.message) }\n finally { if (activeIdRef.current === convId) setMessagesLoading(false) }\n }, [live, api])\n\n const loadChannels = useCallback(async () => {\n if (!live) return []\n try { const l = (await api('/v1/channels')) || []; setChannels(l); return l } catch { return [] } finally { setChannelsLoaded(true) }\n }, [live, api])\n\n const loadAgents = useCallback(async () => {\n if (!live) return []\n try { const l = (await api('/v1/agents')) || []; setAgents(l); return l } catch { return [] }\n }, [live, api])\n\n useEffect(() => { loadConversations(); loadChannels(); loadAgents() }, [loadConversations, loadChannels, loadAgents])\n useEffect(() => { loadMessages(activeId) }, [activeId, loadMessages])\n // rascunho virou conversa real (ganhou mensagem) → some o draft\n useEffect(() => { if (draftConv && conversations.some(c => c.id === draftConv.id)) setDraftConv(null) }, [conversations, draftConv])\n\n const markRead = useCallback(async (convId) => {\n if (!live || !convId) return\n setConversations((cs) => cs.map((c) => (c.id === convId ? { ...c, unread: 0 } : c)))\n try { await api(`/v1/conversations/${convId}/read`, { method: 'POST' }) } catch {}\n }, [live, api])\n\n const assign = useCallback(async (convId, userId) => {\n if (!live || !convId) return\n setConversations((cs) => cs.map((c) => (c.id === convId ? { ...c, _raw: { ...c._raw, assignee_user_id: userId } } : c)))\n try { await api(`/v1/conversations/${convId}/assign`, { method: 'POST', body: { assignee_user_id: userId } }) }\n catch (e) { setError(e.message) }\n }, [live, api])\n\n const send = useCallback(async (text, isNote = false) => {\n const t = (text || '').trim()\n if (!t || !live || !activeIdRef.current) return\n const cid = (typeof crypto !== 'undefined' && crypto.randomUUID) ? crypto.randomUUID() : null\n const tmpId = cid || `tmp${Date.now()}`\n setMessages((ms) => [...ms, isNote\n ? { id: tmpId, side: 'note', kind: 'text', text: t, time: nowHHMM() }\n : { id: tmpId, side: 'out', kind: 'text', text: t, time: nowHHMM(), status: 'pending' }])\n try {\n const saved = await api(`/v1/conversations/${activeIdRef.current}/messages`, {\n method: 'POST', body: isNote ? { text: t, note: true, client_id: cid || undefined } : { text: t, author_name: client.agentName || undefined, client_id: cid || undefined },\n })\n setMessages((ms) => ms.map((m) => (m.id === tmpId ? mapMessage(saved) : m)))\n } catch {\n setMessages((ms) => ms.map((m) => (m.id === tmpId ? { ...m, status: 'failed' } : m)))\n }\n }, [live, api])\n\n const sendMedia = useCallback(async ({ data, mime, kind, filename, previewUrl, caption }) => {\n if (!live || !activeIdRef.current || !data) return\n const cid = (typeof crypto !== 'undefined' && crypto.randomUUID) ? crypto.randomUUID() : null\n const tmpId = cid || `tmp${Date.now()}`\n setMessages((ms) => [...ms, { id: tmpId, side: 'out', kind, mediaUrl: previewUrl || '', caption: caption || '', filename: filename || '', meta: mime || '', time: nowHHMM(), status: 'pending' }])\n try {\n const saved = await api(`/v1/conversations/${activeIdRef.current}/messages`, {\n method: 'POST', body: { media: { data, mime, kind, filename }, caption, author_name: client.agentName || undefined, client_id: cid || undefined },\n })\n const mapped = mapMessage(saved)\n setMessages((ms) => ms.map((m) => (m.id === tmpId ? { ...mapped, mediaUrl: mapped.mediaUrl || previewUrl || '' } : m)))\n } catch {\n setMessages((ms) => ms.map((m) => (m.id === tmpId ? { ...m, status: 'failed' } : m)))\n }\n }, [live, api])\n\n // Apaga mensagem (revoga no WhatsApp + remove do inbox). Otimista; reverte no erro.\n const deleteMessage = useCallback(async (messageId) => {\n if (!live || !messageId || !activeIdRef.current) return\n const convId = activeIdRef.current\n setMessages((ms) => ms.filter((m) => m.id !== messageId))\n try { await api(`/v1/conversations/${convId}/messages/${messageId}`, { method: 'DELETE' }) }\n catch (e) { setError(e.message); loadMessages(convId) }\n }, [live, api, loadMessages])\n\n // Outbound typing: avisa o contato que o atendente está digitando (best-effort).\n const setTyping = useCallback((convId, state) => {\n if (!live || !convId) return\n api(`/v1/conversations/${convId}/typing`, { method: 'POST', body: { state } }).catch(() => {})\n }, [live, api])\n\n // inicia nova conversa para um número (1ª mensagem opcional). Lança no erro (modal trata).\n const createConversation = useCallback(async (phone, text) => {\n if (!live) return null\n const conv = await api('/v1/conversations', {\n method: 'POST',\n body: { phone, text: text || undefined, author_name: client.agentName || undefined },\n })\n const mapped = mapConversation(conv)\n if (conv?.last_message_at) {\n // teve 1ª mensagem → entra na lista de verdade\n setDraftConv(null)\n await loadConversations()\n } else {\n // sem mensagem → rascunho: abre na janela, mas NÃO entra na lista\n setDraftConv(mapped)\n }\n if (mapped?.id) setActiveId(mapped.id)\n return conv\n }, [live, api, loadConversations])\n\n // IA: resumo da conversa\n const summarize = useCallback(async (convId) => {\n if (!live || !convId) return ''\n const r = await api(`/v1/ai/conversations/${convId}/summary`, { method: 'POST' })\n return r?.summary || ''\n }, [live, api])\n\n const createChannel = useCallback((displayName) => api('/v1/channels', { method: 'POST', body: { display_name: displayName } }), [api])\n const connect = useCallback((id) => api(`/v1/channels/${id}/connect`, { method: 'POST' }), [api])\n const channelStatus = useCallback((id) => api(`/v1/channels/${id}/status`), [api])\n\n // realtime fan-out (Supabase broadcast on inbox:{tenant}).\n // Broadcasts são CONTENT-FREE (só ids/status) — o conteúdo nunca trafega no WS.\n // Ao receber um sinal, refetchamos via REST (já filtrado por escopo no backend),\n // então um usuário \"own\" nunca recebe mensagens de conversas de outros.\n useEffect(() => {\n if (!live || !tenantId) return\n const sb = client.supabase\n if (!sb) return\n const ch = sb\n .channel(`inbox:${tenantId}`)\n .on('broadcast', { event: 'message.created' }, ({ payload }) => {\n if (payload?.conversation_id === activeIdRef.current) loadMessages(activeIdRef.current, { silent: true })\n loadConversations()\n })\n .on('broadcast', { event: 'message.updated' }, ({ payload }) => {\n // status (sent/delivered/read) não é conteúdo — atualiza os ticks na hora.\n setMessages((ms) => ms.map((m) => (m.id === payload?.id ? { ...m, status: payload.status || m.status } : m)))\n })\n .on('broadcast', { event: 'conversation.updated' }, () => loadConversations())\n .on('broadcast', { event: 'channel.updated' }, () => loadChannels())\n .on('broadcast', { event: 'message.deleted' }, ({ payload }) => {\n setMessages((ms) => ms.filter((m) => m.id !== payload?.id))\n })\n .on('broadcast', { event: 'presence.update' }, ({ payload }) => {\n // contato digitando → marca a conversa; auto-limpa após 6s se \"paused\" não chegar\n if (payload?.state === 'composing') {\n setTypingConvId(payload.conversation_id)\n clearTimeout(typingTimerRef.current)\n typingTimerRef.current = setTimeout(() => setTypingConvId(null), 6000)\n } else {\n setTypingConvId((cur) => (cur === payload?.conversation_id ? null : cur))\n }\n })\n .subscribe()\n return () => { sb.removeChannel(ch); clearTimeout(typingTimerRef.current) }\n }, [live, tenantId, client, loadConversations, loadChannels, loadMessages])\n\n return {\n live, loading, error,\n conversations, activeId, setActiveId, messages, messagesLoading, scope, draftConv,\n send, sendMedia, markRead, assign, me, agents, loadAgents,\n channels, channelsLoaded, loadChannels, createChannel, createConversation, connect, channelStatus,\n setTyping, typingConvId, deleteMessage, canDelete, summarize,\n }\n}\n","'use client'\nimport { createContext, useContext, useMemo } from 'react'\nimport { createPloyClient } from './client'\n\n// Config is injected by the host via <PloyChat> props — no env, no localStorage.\nconst PloyContext = createContext(null)\n\nexport function PloyConfigProvider({ config, children }) {\n // memo by the identity-relevant fields so the client isn't rebuilt each render\n const value = useMemo(() => {\n const client = createPloyClient(config)\n return { config, client }\n }, [config.apiBase, config.workspaceId, config.getToken, config.supabase, config.supabaseUrl, config.supabaseAnonKey, config.agentName])\n return <PloyContext.Provider value={value}>{children}</PloyContext.Provider>\n}\n\nexport function usePloy() {\n const ctx = useContext(PloyContext)\n if (!ctx) throw new Error('PloyChat components must be used within <PloyChat>')\n return ctx\n}\n","// src/lib/client.js\n// Builds a config-driven client (HTTP + realtime) from the injected config.\n// config: {\n// apiBase: string, // chat-api base URL\n// workspaceId: string, // host workspace/tenant the user is in\n// getToken: () => Promise<string|null>, // host session access_token\n// supabase?: SupabaseClient, // host's client (preferred, for realtime)\n// supabaseUrl?, supabaseAnonKey?, // OR url+anon to create one\n// }\nimport { createClient } from '@supabase/supabase-js'\n\nexport function createPloyClient(config = {}) {\n const apiBase = (config.apiBase || '').replace(/\\/+$/, '')\n\n async function apiFetch(path, { method = 'GET', body } = {}) {\n const headers = {}\n if (body) headers['Content-Type'] = 'application/json'\n const token = config.getToken ? await config.getToken() : null\n if (token) headers['Authorization'] = `Bearer ${token}`\n if (config.workspaceId) headers['X-Workspace'] = config.workspaceId\n\n const res = await fetch(`${apiBase}${path}`, {\n method,\n headers,\n body: body ? JSON.stringify(body) : undefined,\n })\n const txt = await res.text()\n let json\n try { json = txt ? JSON.parse(txt) : null } catch { json = txt }\n if (!res.ok) {\n const err = new Error(json?.message || json?.error || `HTTP ${res.status}`)\n err.status = res.status\n err.body = json\n throw err\n }\n return json\n }\n\n // realtime client: prefer the host's supabase client; else build from url+anon\n let supabase = config.supabase || null\n if (!supabase && config.supabaseUrl && config.supabaseAnonKey) {\n supabase = createClient(config.supabaseUrl, config.supabaseAnonKey, {\n auth: { persistSession: false, autoRefreshToken: false },\n })\n }\n\n const live = !!(config.apiBase && config.workspaceId && config.getToken)\n\n // nome do atendente (host) — usado p/ prefixar \"*Nome:*\\n\" nas mensagens enviadas\n return { apiFetch, supabase, live, agentName: config.agentName || null }\n}\n","// src/lib/mappers.js — backend (inbox_*) shapes -> the UI shapes App.jsx expects.\nconst PALETTE = ['bg-violet-500', 'bg-rose-500', 'bg-sky-500', 'bg-amber-500', 'bg-emerald-600', 'bg-slate-700']\nfunction hash(s = '') { let h = 0; for (let i = 0; i < s.length; i++) h = (h * 31 + s.charCodeAt(i)) >>> 0; return h }\nexport function colorFor(id = '') { return PALETTE[hash(id) % PALETTE.length] }\n\nconst pad = (n) => String(n).padStart(2, '0')\nexport function timeOf(iso) { if (!iso) return ''; const d = new Date(iso); return `${pad(d.getHours())}:${pad(d.getMinutes())}` }\nexport function dayOf(iso) {\n if (!iso) return ''\n const d = new Date(iso); const now = new Date()\n if (d.toDateString() === now.toDateString()) return 'Hoje'\n const y = new Date(now); y.setDate(now.getDate() - 1)\n if (d.toDateString() === y.toDateString()) return 'Ontem'\n return d.toLocaleDateString('pt-BR')\n}\nexport function relTime(iso) {\n if (!iso) return ''\n const m = Math.floor((Date.now() - new Date(iso).getTime()) / 60000)\n if (m < 1) return 'agora'\n if (m < 60) return `${m}m`\n const h = Math.floor(m / 60); if (h < 24) return `${h}h`\n return `${Math.floor(h / 24)}d`\n}\nexport function nowHHMM() { const d = new Date(); return `${pad(d.getHours())}:${pad(d.getMinutes())}` }\n\n// backend conversation.status -> UI status enum (statusInfo keys in App.jsx)\nconst STATUS_MAP = { open: 'open', pending: 'in_progress', resolved: 'resolved', snoozed: 'waiting' }\n\nexport function mapConversation(c) {\n const contact = c.contact || {}\n const isGroup = String(contact.external_id || '').endsWith('@g.us')\n const name = contact.name\n || (isGroup ? 'Grupo' : (contact.push_name || contact.phone_e164 || contact.external_id || 'Contato'))\n return {\n id: c.id,\n name,\n isGroup,\n phone: isGroup ? '' : (contact.phone_e164 || ''),\n avatar: contact.profile_pic_url || null,\n avatarColor: colorFor(c.id),\n preview: c.last_message_preview || '',\n waitFor: relTime(c.last_message_at),\n unread: c.unread_count || 0,\n sla: 'ok',\n priority: c.priority || 'normal',\n status: STATUS_MAP[c.status] || 'open',\n // só mostra \"ticket\" quando há REF real de imóvel; senão nada (o #id era ruído)\n ticket: c.property_ref ? `REF ${c.property_ref}` : null,\n starred: false,\n aiSummary: c.ai_summary || '', // resumo IA persistido (tarja)\n aiSummaryCount: c.ai_summary_msg_count || 0,\n _raw: c,\n }\n}\n\nexport function mapMessage(m) {\n const ts = m.sent_at || m.created_at\n // internal note: kind='note', no direction, team-only\n if (m.kind === 'note') {\n return { id: m.id, side: 'note', kind: 'text', text: m.text || '', time: timeOf(ts), day: dayOf(ts), author: m.author_name, _raw: m }\n }\n if (m.kind === 'system') {\n return { id: m.id, side: 'system', kind: 'text', text: m.text || '', time: timeOf(ts), day: dayOf(ts), _raw: m }\n }\n let kind = m.kind || 'text'\n let text = m.text || ''\n if (!['text', 'image', 'audio', 'video', 'document'].includes(kind)) {\n text = m.text || m.caption || `[${kind}]`\n kind = 'text'\n }\n return {\n id: m.id,\n side: m.direction, // 'in' | 'out'\n kind,\n text,\n // em grupos, quem enviou (participante) — vem do pushName no payload bruto\n author: m.direction === 'in' ? (m.raw?.pushName || m.raw?.push_name || '') : '',\n caption: m.caption || '',\n meta: m.media_mime || '',\n filename: m.media_filename || '',\n mediaUrl: m.media_url || '',\n time: timeOf(ts),\n day: dayOf(ts),\n status: m.status,\n _raw: m,\n }\n}\n","'use client'\nimport { useEffect, useRef, useState } from 'react'\n\n// Minimal \"connect a WhatsApp number\" modal: create channel -> QR -> poll status.\nexport default function ConnectChannel({ inbox, onClose }) {\n const [channel, setChannel] = useState(null)\n const [qr, setQr] = useState(null)\n const [status, setStatus] = useState('idle')\n const [error, setError] = useState(null)\n const [busy, setBusy] = useState(false)\n const pollRef = useRef(null)\n\n const asDataUrl = (q) => (!q ? null : q.startsWith('data:') ? q : `data:image/png;base64,${q}`)\n\n useEffect(() => {\n (async () => {\n try {\n const list = await inbox.loadChannels()\n const c = (list || [])[0] || null\n setChannel(c)\n if (c) setStatus(c.status)\n } catch (e) { setError(e.message) }\n })()\n return () => clearInterval(pollRef.current)\n }, [inbox])\n\n const poll = (id) => {\n clearInterval(pollRef.current)\n pollRef.current = setInterval(async () => {\n try {\n const s = await inbox.channelStatus(id)\n setStatus(s.status)\n if (s.status === 'connected') { clearInterval(pollRef.current); inbox.loadChannels() }\n else { const res = await inbox.connect(id); if (res?.qr) setQr(asDataUrl(res.qr)) }\n } catch {}\n }, 3000)\n }\n\n const startConnect = async (ch) => {\n setError(null); setBusy(true); setStatus('connecting')\n try {\n const res = await inbox.connect(ch.id)\n setQr(asDataUrl(res?.qr))\n setStatus(res?.status || 'qr')\n poll(ch.id)\n } catch (e) { setError(e.message); setStatus('error') } finally { setBusy(false) }\n }\n\n // Um clique só: o \"canal\" é a instância Evolution que hospeda a sessão e gera\n // o QR — necessário, mas não precisa ser um passo manual. Cria se não existir\n // e já parte pro QR.\n const handleConnect = async () => {\n setError(null); setBusy(true)\n try {\n let ch = channel\n if (!ch) { ch = await inbox.createChannel('WhatsApp'); setChannel(ch) }\n await startConnect(ch)\n } catch (e) { setError(e.message) } finally { setBusy(false) }\n }\n\n return (\n <div className=\"fixed inset-0 z-50 bg-black/40 flex items-center justify-center\" onClick={onClose}>\n <div className=\"bg-white rounded-2xl shadow-xl w-[380px] p-5\" onClick={(e) => e.stopPropagation()}>\n <div className=\"flex items-center justify-between mb-3\">\n <h3 className=\"font-semibold text-[15px]\">Conectar WhatsApp</h3>\n <button onClick={onClose} className=\"text-slate-400 hover:text-slate-700 text-lg leading-none\">×</button>\n </div>\n\n {error && <div className=\"text-[12px] text-rose-600 mb-2 break-words\">{error}</div>}\n\n {status === 'connected' ? (\n <div className=\"text-center py-8 text-emerald-600 font-medium\">✓ Número conectado</div>\n ) : qr ? (\n <div className=\"text-center\">\n <img src={qr} alt=\"QR Code\" className=\"w-56 h-56 mx-auto rounded-lg border border-slate-200\" />\n <p className=\"text-[12px] text-slate-500 mt-3\">\n WhatsApp › Aparelhos conectados › Conectar um aparelho, e escaneie. ({status})\n </p>\n </div>\n ) : (\n <div className=\"text-center py-4\">\n <p className=\"text-[13px] text-slate-600 mb-3\">\n Conecte um número de WhatsApp para começar a atender.\n </p>\n <button disabled={busy} onClick={handleConnect}\n className=\"bg-emerald-600 hover:bg-emerald-700 disabled:opacity-50 text-white px-4 py-2 rounded-lg text-[13px] font-medium\">\n {busy ? 'Gerando…' : 'Gerar QR Code'}\n </button>\n </div>\n )}\n </div>\n </div>\n )\n}\n","'use client'\nimport { lazy, Suspense } from 'react'\n\n// Lazy-load emoji-picker-react (client-only; touches window). No next/dynamic so\n// the lib stays framework-agnostic. Category enum values used as string literals\n// to avoid a static import of the module on SSR.\nconst Picker = lazy(() => import('emoji-picker-react'))\n\nconst CATEGORIES_PT = [\n { category: 'suggested', name: 'Recentes' },\n { category: 'smileys_people', name: 'Rostos e pessoas' },\n { category: 'animals_nature', name: 'Animais e natureza' },\n { category: 'food_drink', name: 'Comidas e bebidas' },\n { category: 'travel_places', name: 'Viagens e lugares' },\n { category: 'activities', name: 'Atividades' },\n { category: 'objects', name: 'Objetos' },\n { category: 'symbols', name: 'Símbolos' },\n { category: 'flags', name: 'Bandeiras' },\n]\n\nexport default function EmojiPicker({ onPick }) {\n return (\n <div className=\"absolute bottom-[calc(100%+6px)] left-0 z-30 shadow-xl rounded-xl overflow-hidden\">\n <Suspense fallback={<div className=\"w-[340px] h-[420px] bg-white\" />}>\n <Picker\n onEmojiClick={(e) => onPick(e.emoji)}\n lazyLoadEmojis\n width={340}\n height={420}\n categories={CATEGORIES_PT}\n searchPlaceholder=\"Buscar emoji…\"\n previewConfig={{ showPreview: false }}\n />\n </Suspense>\n </div>\n )\n}\n","'use client'\nimport { useEffect, useState } from 'react'\n\n// Transferir conversa para outro agente do workspace.\nexport default function TransferModal({ inbox, conversationId, currentAssignee, onClose }) {\n const [agents, setAgents] = useState(inbox.agents || [])\n const [q, setQ] = useState('')\n\n useEffect(() => { inbox.loadAgents().then((a) => a && setAgents(a)) }, [inbox])\n\n const filtered = agents.filter((a) => {\n const s = q.trim().toLowerCase()\n if (!s) return true\n return (a.name || '').toLowerCase().includes(s) || (a.email || '').toLowerCase().includes(s)\n })\n\n const pick = (userId) => { inbox.assign(conversationId, userId); onClose() }\n const initials = (n) => (n || '?').split(' ').map((p) => p[0]).slice(0, 2).join('').toUpperCase()\n\n return (\n <div className=\"fixed inset-0 z-50 bg-black/40 flex items-center justify-center\" onClick={onClose}>\n <div className=\"bg-white rounded-2xl shadow-xl w-[380px] max-h-[72vh] flex flex-col\" onClick={(e) => e.stopPropagation()}>\n <div className=\"px-4 py-3 border-b border-slate-200 flex items-center justify-between\">\n <h3 className=\"font-semibold text-[15px]\">Transferir conversa</h3>\n <button onClick={onClose} className=\"text-slate-400 hover:text-slate-700 text-lg leading-none\">×</button>\n </div>\n <div className=\"p-3 border-b border-slate-100\">\n <input value={q} onChange={(e) => setQ(e.target.value)} placeholder=\"Buscar agente…\"\n className=\"w-full px-3 py-1.5 text-[13px] rounded-lg bg-slate-50 border border-slate-200 outline-none focus:bg-white focus:border-slate-300\" />\n </div>\n <div className=\"flex-1 overflow-y-auto p-2\">\n <button onClick={() => pick(null)}\n className=\"w-full text-left px-3 py-2 rounded-lg hover:bg-slate-50 text-[13px] text-slate-500\">\n Sem atribuição\n </button>\n {filtered.map((a) => (\n <button key={a.user_id} onClick={() => pick(a.user_id)}\n className={`w-full text-left px-3 py-2 rounded-lg hover:bg-slate-50 flex items-center gap-2.5 ${currentAssignee === a.user_id ? 'bg-emerald-50' : ''}`}>\n <span className=\"w-8 h-8 rounded-full bg-slate-200 text-slate-600 text-[11px] font-semibold flex items-center justify-center shrink-0\">\n {initials(a.name)}\n </span>\n <span className=\"flex-1 min-w-0\">\n <span className=\"block text-[13px] truncate\">{a.name}</span>\n <span className=\"block text-[11px] text-slate-400 truncate\">{[a.email, a.role].filter(Boolean).join(' · ')}</span>\n </span>\n {currentAssignee === a.user_id && <span className=\"text-emerald-600 text-[11px] font-medium shrink-0\">atual</span>}\n </button>\n ))}\n {filtered.length === 0 && <p className=\"text-center text-[12px] text-slate-400 py-6\">Nenhum agente encontrado</p>}\n </div>\n </div>\n </div>\n )\n}\n","'use client'\nimport App from './components/App'\nimport { PloyConfigProvider } from './lib/context'\n\n/**\n * <PloyChat> — embeddable WhatsApp inbox.\n *\n * Props:\n * - apiBase: string chat-api base URL\n * - workspaceId: string host workspace/tenant the user is in\n * - getToken: () => Promise<string|null> host session access_token\n * - supabase?: SupabaseClient host's client (preferred, for realtime)\n * - supabaseUrl?, supabaseAnonKey? OR create one for realtime\n * - className?: string wrapper class (fills its container; give it a height)\n */\nexport function PloyChat({\n apiBase,\n workspaceId,\n getToken,\n supabase,\n supabaseUrl,\n supabaseAnonKey,\n className,\n onBack,\n agent,\n onUnreadChange,\n}) {\n const config = { apiBase, workspaceId, getToken, supabase, supabaseUrl, supabaseAnonKey, agentName: agent?.name }\n // .ploychat-root: scope hook for the bundled reset in styles.css (@layer base).\n const rootClass = ['ploychat-root', className].filter(Boolean).join(' ')\n return (\n <PloyConfigProvider config={config}>\n <div className={rootClass} style={{ height: '100%', width: '100%' }}>\n <App onBack={onBack} agent={agent} onUnreadChange={onUnreadChange} />\n </div>\n </PloyConfigProvider>\n )\n}\n\nexport default PloyChat\n"],"mappings":";;;AAEA,SAAS,WAAAA,UAAS,UAAAC,SAAQ,YAAAC,WAAU,aAAAC,kBAAiB;;;ACCrD,SAAS,aAAa,WAAW,QAAQ,gBAAgB;;;ACFzD,SAAS,eAAe,YAAY,eAAe;;;ACQnD,SAAS,oBAAoB;AAEtB,SAAS,iBAAiB,SAAS,CAAC,GAAG;AAC5C,QAAM,WAAW,OAAO,WAAW,IAAI,QAAQ,QAAQ,EAAE;AAEzD,iBAAe,SAAS,MAAM,EAAE,SAAS,OAAO,KAAK,IAAI,CAAC,GAAG;AAC3D,UAAM,UAAU,CAAC;AACjB,QAAI,KAAM,SAAQ,cAAc,IAAI;AACpC,UAAM,QAAQ,OAAO,WAAW,MAAM,OAAO,SAAS,IAAI;AAC1D,QAAI,MAAO,SAAQ,eAAe,IAAI,UAAU,KAAK;AACrD,QAAI,OAAO,YAAa,SAAQ,aAAa,IAAI,OAAO;AAExD,UAAM,MAAM,MAAM,MAAM,GAAG,OAAO,GAAG,IAAI,IAAI;AAAA,MAC3C;AAAA,MACA;AAAA,MACA,MAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,IACtC,CAAC;AACD,UAAM,MAAM,MAAM,IAAI,KAAK;AAC3B,QAAI;AACJ,QAAI;AAAE,aAAO,MAAM,KAAK,MAAM,GAAG,IAAI;AAAA,IAAK,QAAQ;AAAE,aAAO;AAAA,IAAI;AAC/D,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,MAAM,IAAI,OAAM,6BAAM,aAAW,6BAAM,UAAS,QAAQ,IAAI,MAAM,EAAE;AAC1E,UAAI,SAAS,IAAI;AACjB,UAAI,OAAO;AACX,YAAM;AAAA,IACR;AACA,WAAO;AAAA,EACT;AAGA,MAAI,WAAW,OAAO,YAAY;AAClC,MAAI,CAAC,YAAY,OAAO,eAAe,OAAO,iBAAiB;AAC7D,eAAW,aAAa,OAAO,aAAa,OAAO,iBAAiB;AAAA,MAClE,MAAM,EAAE,gBAAgB,OAAO,kBAAkB,MAAM;AAAA,IACzD,CAAC;AAAA,EACH;AAEA,QAAM,OAAO,CAAC,EAAE,OAAO,WAAW,OAAO,eAAe,OAAO;AAG/D,SAAO,EAAE,UAAU,UAAU,MAAM,WAAW,OAAO,aAAa,KAAK;AACzE;;;ADrCS;AART,IAAM,cAAc,cAAc,IAAI;AAE/B,SAAS,mBAAmB,EAAE,QAAQ,SAAS,GAAG;AAEvD,QAAM,QAAQ,QAAQ,MAAM;AAC1B,UAAM,SAAS,iBAAiB,MAAM;AACtC,WAAO,EAAE,QAAQ,OAAO;AAAA,EAC1B,GAAG,CAAC,OAAO,SAAS,OAAO,aAAa,OAAO,UAAU,OAAO,UAAU,OAAO,aAAa,OAAO,iBAAiB,OAAO,SAAS,CAAC;AACvI,SAAO,oBAAC,YAAY,UAAZ,EAAqB,OAAe,UAAS;AACvD;AAEO,SAAS,UAAU;AACxB,QAAM,MAAM,WAAW,WAAW;AAClC,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,oDAAoD;AAC9E,SAAO;AACT;;;AEnBA,IAAM,UAAU,CAAC,iBAAiB,eAAe,cAAc,gBAAgB,kBAAkB,cAAc;AAC/G,SAAS,KAAK,IAAI,IAAI;AAAE,MAAI,IAAI;AAAG,WAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,IAAK,KAAK,IAAI,KAAK,EAAE,WAAW,CAAC,MAAO;AAAG,SAAO;AAAE;AAC9G,SAAS,SAAS,KAAK,IAAI;AAAE,SAAO,QAAQ,KAAK,EAAE,IAAI,QAAQ,MAAM;AAAE;AAE9E,IAAM,MAAM,CAAC,MAAM,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG;AACrC,SAAS,OAAO,KAAK;AAAE,MAAI,CAAC,IAAK,QAAO;AAAI,QAAM,IAAI,IAAI,KAAK,GAAG;AAAG,SAAO,GAAG,IAAI,EAAE,SAAS,CAAC,CAAC,IAAI,IAAI,EAAE,WAAW,CAAC,CAAC;AAAG;AAC1H,SAAS,MAAM,KAAK;AACzB,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,IAAI,IAAI,KAAK,GAAG;AAAG,QAAM,MAAM,oBAAI,KAAK;AAC9C,MAAI,EAAE,aAAa,MAAM,IAAI,aAAa,EAAG,QAAO;AACpD,QAAM,IAAI,IAAI,KAAK,GAAG;AAAG,IAAE,QAAQ,IAAI,QAAQ,IAAI,CAAC;AACpD,MAAI,EAAE,aAAa,MAAM,EAAE,aAAa,EAAG,QAAO;AAClD,SAAO,EAAE,mBAAmB,OAAO;AACrC;AACO,SAAS,QAAQ,KAAK;AAC3B,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,IAAI,KAAK,OAAO,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,EAAE,QAAQ,KAAK,GAAK;AACnE,MAAI,IAAI,EAAG,QAAO;AAClB,MAAI,IAAI,GAAI,QAAO,GAAG,CAAC;AACvB,QAAM,IAAI,KAAK,MAAM,IAAI,EAAE;AAAG,MAAI,IAAI,GAAI,QAAO,GAAG,CAAC;AACrD,SAAO,GAAG,KAAK,MAAM,IAAI,EAAE,CAAC;AAC9B;AACO,SAASC,WAAU;AAAE,QAAM,IAAI,oBAAI,KAAK;AAAG,SAAO,GAAG,IAAI,EAAE,SAAS,CAAC,CAAC,IAAI,IAAI,EAAE,WAAW,CAAC,CAAC;AAAG;AAGvG,IAAM,aAAa,EAAE,MAAM,QAAQ,SAAS,eAAe,UAAU,YAAY,SAAS,UAAU;AAE7F,SAAS,gBAAgB,GAAG;AACjC,QAAM,UAAU,EAAE,WAAW,CAAC;AAC9B,QAAM,UAAU,OAAO,QAAQ,eAAe,EAAE,EAAE,SAAS,OAAO;AAClE,QAAM,OAAO,QAAQ,SACf,UAAU,UAAW,QAAQ,aAAa,QAAQ,cAAc,QAAQ,eAAe;AAC7F,SAAO;AAAA,IACL,IAAI,EAAE;AAAA,IACN;AAAA,IACA;AAAA,IACA,OAAO,UAAU,KAAM,QAAQ,cAAc;AAAA,IAC7C,QAAQ,QAAQ,mBAAmB;AAAA,IACnC,aAAa,SAAS,EAAE,EAAE;AAAA,IAC1B,SAAS,EAAE,wBAAwB;AAAA,IACnC,SAAS,QAAQ,EAAE,eAAe;AAAA,IAClC,QAAQ,EAAE,gBAAgB;AAAA,IAC1B,KAAK;AAAA,IACL,UAAU,EAAE,YAAY;AAAA,IACxB,QAAQ,WAAW,EAAE,MAAM,KAAK;AAAA;AAAA,IAEhC,QAAQ,EAAE,eAAe,OAAO,EAAE,YAAY,KAAK;AAAA,IACnD,SAAS;AAAA,IACT,WAAW,EAAE,cAAc;AAAA;AAAA,IAC3B,gBAAgB,EAAE,wBAAwB;AAAA,IAC1C,MAAM;AAAA,EACR;AACF;AAEO,SAAS,WAAW,GAAG;AAvD9B;AAwDE,QAAM,KAAK,EAAE,WAAW,EAAE;AAE1B,MAAI,EAAE,SAAS,QAAQ;AACrB,WAAO,EAAE,IAAI,EAAE,IAAI,MAAM,QAAQ,MAAM,QAAQ,MAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,EAAE,GAAG,KAAK,MAAM,EAAE,GAAG,QAAQ,EAAE,aAAa,MAAM,EAAE;AAAA,EACtI;AACA,MAAI,EAAE,SAAS,UAAU;AACvB,WAAO,EAAE,IAAI,EAAE,IAAI,MAAM,UAAU,MAAM,QAAQ,MAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,EAAE,GAAG,KAAK,MAAM,EAAE,GAAG,MAAM,EAAE;AAAA,EACjH;AACA,MAAI,OAAO,EAAE,QAAQ;AACrB,MAAI,OAAO,EAAE,QAAQ;AACrB,MAAI,CAAC,CAAC,QAAQ,SAAS,SAAS,SAAS,UAAU,EAAE,SAAS,IAAI,GAAG;AACnE,WAAO,EAAE,QAAQ,EAAE,WAAW,IAAI,IAAI;AACtC,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,IAAI,EAAE;AAAA,IACN,MAAM,EAAE;AAAA;AAAA,IACR;AAAA,IACA;AAAA;AAAA,IAEA,QAAQ,EAAE,cAAc,SAAQ,OAAE,QAAF,mBAAO,eAAY,OAAE,QAAF,mBAAO,cAAa,KAAM;AAAA,IAC7E,SAAS,EAAE,WAAW;AAAA,IACtB,MAAM,EAAE,cAAc;AAAA,IACtB,UAAU,EAAE,kBAAkB;AAAA,IAC9B,UAAU,EAAE,aAAa;AAAA,IACzB,MAAM,OAAO,EAAE;AAAA,IACf,KAAK,MAAM,EAAE;AAAA,IACb,QAAQ,EAAE;AAAA,IACV,MAAM;AAAA,EACR;AACF;;;AH/EO,SAAS,WAAW;AACzB,QAAM,EAAE,OAAO,IAAI,QAAQ;AAC3B,QAAM,OAAO,OAAO;AAEpB,QAAM,CAACC,gBAAe,gBAAgB,IAAI,SAAS,CAAC,CAAC;AACrD,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,IAAI;AAC7C,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,CAAC,CAAC;AAC3C,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAS,KAAK;AAC5D,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,CAAC,CAAC;AAC3C,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,KAAK;AAC1D,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,CAAC,CAAC;AACvC,QAAM,CAAC,IAAI,KAAK,IAAI,SAAS,IAAI;AACjC,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,KAAK;AACxC,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,IAAI;AAC/C,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,IAAI;AAC7C,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,IAAI;AACrD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAC3C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,IAAI;AACvC,QAAM,cAAc,OAAO,IAAI;AAC/B,cAAY,UAAU;AACtB,QAAM,iBAAiB,OAAO,IAAI;AAElC,QAAM,MAAM,OAAO;AAGnB,YAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,QAAI,QAAQ,EACT,KAAK,CAAC,MAAM;AApCnB;AAoCqB,WAAI,4BAAG,SAAH,mBAAS,GAAI,OAAM,EAAE,KAAK,EAAE;AAAG,UAAI,uBAAG,UAAW,aAAY,EAAE,SAAS;AAAG,mBAAa,CAAC,EAAC,uBAAG,WAAU;AAAG,UAAI,uBAAG,YAAa,UAAS,EAAE,WAAW;AAAA,IAAE,CAAC,EACzK,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACnB,GAAG,CAAC,MAAM,GAAG,CAAC;AAEd,QAAM,oBAAoB,YAAY,YAAY;AAChD,QAAI,CAAC,KAAM;AACX,QAAI;AACF,YAAM,OAAO,MAAM,IAAI,4BAA4B;AACnD,YAAM,UAAU,QAAQ,CAAC,GAAG,IAAI,eAAe;AAC/C,uBAAiB,MAAM;AACvB,kBAAY,CAAC,MAAG;AA9CtB;AA8CyB,sBAAK,YAAO,CAAC,MAAR,mBAAW,OAAM;AAAA,OAAI;AAAA,IAC/C,SAAS,GAAG;AAAE,eAAS,EAAE,OAAO;AAAA,IAAE,UAAE;AAAU,iBAAW,KAAK;AAAA,IAAE;AAAA,EAClE,GAAG,CAAC,MAAM,GAAG,CAAC;AAGd,QAAM,cAAc,OAAO,CAAC,CAAC;AAC7B,QAAM,eAAe,YAAY,OAAO,QAAQ,OAAO,CAAC,MAAM;AAC5D,QAAI,CAAC,QAAQ,CAAC,OAAQ;AAEtB,QAAI,CAAC,KAAK,QAAQ;AAChB,YAAM,SAAS,YAAY,QAAQ,MAAM;AACzC,UAAI,QAAQ;AAAE,oBAAY,MAAM;AAAG,2BAAmB,KAAK;AAAA,MAAE,OACxD;AAAE,oBAAY,CAAC,CAAC;AAAG,2BAAmB,IAAI;AAAA,MAAE;AAAA,IACnD;AACA,QAAI;AACF,YAAM,MAAM,MAAM,IAAI,qBAAqB,MAAM,oBAAoB;AACrE,YAAM,WAAU,2BAAK,aAAY,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,IAAI,UAAU;AACrE,kBAAY,QAAQ,MAAM,IAAI;AAC9B,UAAI,YAAY,YAAY,OAAQ,aAAY,MAAM;AAAA,IACxD,SAAS,GAAG;AAAE,eAAS,EAAE,OAAO;AAAA,IAAE,UAClC;AAAU,UAAI,YAAY,YAAY,OAAQ,oBAAmB,KAAK;AAAA,IAAE;AAAA,EAC1E,GAAG,CAAC,MAAM,GAAG,CAAC;AAEd,QAAM,eAAe,YAAY,YAAY;AAC3C,QAAI,CAAC,KAAM,QAAO,CAAC;AACnB,QAAI;AAAE,YAAM,IAAK,MAAM,IAAI,cAAc,KAAM,CAAC;AAAG,kBAAY,CAAC;AAAG,aAAO;AAAA,IAAE,QAAQ;AAAE,aAAO,CAAC;AAAA,IAAE,UAAE;AAAU,wBAAkB,IAAI;AAAA,IAAE;AAAA,EACtI,GAAG,CAAC,MAAM,GAAG,CAAC;AAEd,QAAM,aAAa,YAAY,YAAY;AACzC,QAAI,CAAC,KAAM,QAAO,CAAC;AACnB,QAAI;AAAE,YAAM,IAAK,MAAM,IAAI,YAAY,KAAM,CAAC;AAAG,gBAAU,CAAC;AAAG,aAAO;AAAA,IAAE,QAAQ;AAAE,aAAO,CAAC;AAAA,IAAE;AAAA,EAC9F,GAAG,CAAC,MAAM,GAAG,CAAC;AAEd,YAAU,MAAM;AAAE,sBAAkB;AAAG,iBAAa;AAAG,eAAW;AAAA,EAAE,GAAG,CAAC,mBAAmB,cAAc,UAAU,CAAC;AACpH,YAAU,MAAM;AAAE,iBAAa,QAAQ;AAAA,EAAE,GAAG,CAAC,UAAU,YAAY,CAAC;AAEpE,YAAU,MAAM;AAAE,QAAI,aAAaA,eAAc,KAAK,OAAK,EAAE,OAAO,UAAU,EAAE,EAAG,cAAa,IAAI;AAAA,EAAE,GAAG,CAACA,gBAAe,SAAS,CAAC;AAEnI,QAAM,WAAW,YAAY,OAAO,WAAW;AAC7C,QAAI,CAAC,QAAQ,CAAC,OAAQ;AACtB,qBAAiB,CAAC,OAAO,GAAG,IAAI,CAAC,MAAO,EAAE,OAAO,SAAS,EAAE,GAAG,GAAG,QAAQ,EAAE,IAAI,CAAE,CAAC;AACnF,QAAI;AAAE,YAAM,IAAI,qBAAqB,MAAM,SAAS,EAAE,QAAQ,OAAO,CAAC;AAAA,IAAE,QAAQ;AAAA,IAAC;AAAA,EACnF,GAAG,CAAC,MAAM,GAAG,CAAC;AAEd,QAAM,SAAS,YAAY,OAAO,QAAQ,WAAW;AACnD,QAAI,CAAC,QAAQ,CAAC,OAAQ;AACtB,qBAAiB,CAAC,OAAO,GAAG,IAAI,CAAC,MAAO,EAAE,OAAO,SAAS,EAAE,GAAG,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,kBAAkB,OAAO,EAAE,IAAI,CAAE,CAAC;AACvH,QAAI;AAAE,YAAM,IAAI,qBAAqB,MAAM,WAAW,EAAE,QAAQ,QAAQ,MAAM,EAAE,kBAAkB,OAAO,EAAE,CAAC;AAAA,IAAE,SACvG,GAAG;AAAE,eAAS,EAAE,OAAO;AAAA,IAAE;AAAA,EAClC,GAAG,CAAC,MAAM,GAAG,CAAC;AAEd,QAAM,OAAO,YAAY,OAAO,MAAM,SAAS,UAAU;AACvD,UAAM,KAAK,QAAQ,IAAI,KAAK;AAC5B,QAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,QAAS;AACzC,UAAM,MAAO,OAAO,WAAW,eAAe,OAAO,aAAc,OAAO,WAAW,IAAI;AACzF,UAAM,QAAQ,OAAO,MAAM,KAAK,IAAI,CAAC;AACrC,gBAAY,CAAC,OAAO,CAAC,GAAG,IAAI,SACxB,EAAE,IAAI,OAAO,MAAM,QAAQ,MAAM,QAAQ,MAAM,GAAG,MAAMC,SAAQ,EAAE,IAClE,EAAE,IAAI,OAAO,MAAM,OAAO,MAAM,QAAQ,MAAM,GAAG,MAAMA,SAAQ,GAAG,QAAQ,UAAU,CAAC,CAAC;AAC1F,QAAI;AACF,YAAM,QAAQ,MAAM,IAAI,qBAAqB,YAAY,OAAO,aAAa;AAAA,QAC3E,QAAQ;AAAA,QAAQ,MAAM,SAAS,EAAE,MAAM,GAAG,MAAM,MAAM,WAAW,OAAO,OAAU,IAAI,EAAE,MAAM,GAAG,aAAa,OAAO,aAAa,QAAW,WAAW,OAAO,OAAU;AAAA,MAC3K,CAAC;AACD,kBAAY,CAAC,OAAO,GAAG,IAAI,CAAC,MAAO,EAAE,OAAO,QAAQ,WAAW,KAAK,IAAI,CAAE,CAAC;AAAA,IAC7E,QAAQ;AACN,kBAAY,CAAC,OAAO,GAAG,IAAI,CAAC,MAAO,EAAE,OAAO,QAAQ,EAAE,GAAG,GAAG,QAAQ,SAAS,IAAI,CAAE,CAAC;AAAA,IACtF;AAAA,EACF,GAAG,CAAC,MAAM,GAAG,CAAC;AAEd,QAAM,YAAY,YAAY,OAAO,EAAE,MAAM,MAAM,MAAM,UAAU,YAAY,QAAQ,MAAM;AAC3F,QAAI,CAAC,QAAQ,CAAC,YAAY,WAAW,CAAC,KAAM;AAC5C,UAAM,MAAO,OAAO,WAAW,eAAe,OAAO,aAAc,OAAO,WAAW,IAAI;AACzF,UAAM,QAAQ,OAAO,MAAM,KAAK,IAAI,CAAC;AACrC,gBAAY,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,IAAI,OAAO,MAAM,OAAO,MAAM,UAAU,cAAc,IAAI,SAAS,WAAW,IAAI,UAAU,YAAY,IAAI,MAAM,QAAQ,IAAI,MAAMA,SAAQ,GAAG,QAAQ,UAAU,CAAC,CAAC;AACjM,QAAI;AACF,YAAM,QAAQ,MAAM,IAAI,qBAAqB,YAAY,OAAO,aAAa;AAAA,QAC3E,QAAQ;AAAA,QAAQ,MAAM,EAAE,OAAO,EAAE,MAAM,MAAM,MAAM,SAAS,GAAG,SAAS,aAAa,OAAO,aAAa,QAAW,WAAW,OAAO,OAAU;AAAA,MAClJ,CAAC;AACD,YAAM,SAAS,WAAW,KAAK;AAC/B,kBAAY,CAAC,OAAO,GAAG,IAAI,CAAC,MAAO,EAAE,OAAO,QAAQ,EAAE,GAAG,QAAQ,UAAU,OAAO,YAAY,cAAc,GAAG,IAAI,CAAE,CAAC;AAAA,IACxH,QAAQ;AACN,kBAAY,CAAC,OAAO,GAAG,IAAI,CAAC,MAAO,EAAE,OAAO,QAAQ,EAAE,GAAG,GAAG,QAAQ,SAAS,IAAI,CAAE,CAAC;AAAA,IACtF;AAAA,EACF,GAAG,CAAC,MAAM,GAAG,CAAC;AAGd,QAAM,gBAAgB,YAAY,OAAO,cAAc;AACrD,QAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,YAAY,QAAS;AACjD,UAAM,SAAS,YAAY;AAC3B,gBAAY,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS,CAAC;AACxD,QAAI;AAAE,YAAM,IAAI,qBAAqB,MAAM,aAAa,SAAS,IAAI,EAAE,QAAQ,SAAS,CAAC;AAAA,IAAE,SACpF,GAAG;AAAE,eAAS,EAAE,OAAO;AAAG,mBAAa,MAAM;AAAA,IAAE;AAAA,EACxD,GAAG,CAAC,MAAM,KAAK,YAAY,CAAC;AAG5B,QAAM,YAAY,YAAY,CAAC,QAAQ,UAAU;AAC/C,QAAI,CAAC,QAAQ,CAAC,OAAQ;AACtB,QAAI,qBAAqB,MAAM,WAAW,EAAE,QAAQ,QAAQ,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EAC/F,GAAG,CAAC,MAAM,GAAG,CAAC;AAGd,QAAM,qBAAqB,YAAY,OAAO,OAAO,SAAS;AAC5D,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,OAAO,MAAM,IAAI,qBAAqB;AAAA,MAC1C,QAAQ;AAAA,MACR,MAAM,EAAE,OAAO,MAAM,QAAQ,QAAW,aAAa,OAAO,aAAa,OAAU;AAAA,IACrF,CAAC;AACD,UAAM,SAAS,gBAAgB,IAAI;AACnC,QAAI,6BAAM,iBAAiB;AAEzB,mBAAa,IAAI;AACjB,YAAM,kBAAkB;AAAA,IAC1B,OAAO;AAEL,mBAAa,MAAM;AAAA,IACrB;AACA,QAAI,iCAAQ,GAAI,aAAY,OAAO,EAAE;AACrC,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,KAAK,iBAAiB,CAAC;AAGjC,QAAM,YAAY,YAAY,OAAO,WAAW;AAC9C,QAAI,CAAC,QAAQ,CAAC,OAAQ,QAAO;AAC7B,UAAM,IAAI,MAAM,IAAI,wBAAwB,MAAM,YAAY,EAAE,QAAQ,OAAO,CAAC;AAChF,YAAO,uBAAG,YAAW;AAAA,EACvB,GAAG,CAAC,MAAM,GAAG,CAAC;AAEd,QAAM,gBAAgB,YAAY,CAAC,gBAAgB,IAAI,gBAAgB,EAAE,QAAQ,QAAQ,MAAM,EAAE,cAAc,YAAY,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;AACtI,QAAM,UAAU,YAAY,CAAC,OAAO,IAAI,gBAAgB,EAAE,YAAY,EAAE,QAAQ,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;AAChG,QAAM,gBAAgB,YAAY,CAAC,OAAO,IAAI,gBAAgB,EAAE,SAAS,GAAG,CAAC,GAAG,CAAC;AAMjF,YAAU,MAAM;AACd,QAAI,CAAC,QAAQ,CAAC,SAAU;AACxB,UAAM,KAAK,OAAO;AAClB,QAAI,CAAC,GAAI;AACT,UAAM,KAAK,GACR,QAAQ,SAAS,QAAQ,EAAE,EAC3B,GAAG,aAAa,EAAE,OAAO,kBAAkB,GAAG,CAAC,EAAE,QAAQ,MAAM;AAC9D,WAAI,mCAAS,qBAAoB,YAAY,QAAS,cAAa,YAAY,SAAS,EAAE,QAAQ,KAAK,CAAC;AACxG,wBAAkB;AAAA,IACpB,CAAC,EACA,GAAG,aAAa,EAAE,OAAO,kBAAkB,GAAG,CAAC,EAAE,QAAQ,MAAM;AAE9D,kBAAY,CAAC,OAAO,GAAG,IAAI,CAAC,MAAO,EAAE,QAAO,mCAAS,MAAK,EAAE,GAAG,GAAG,QAAQ,QAAQ,UAAU,EAAE,OAAO,IAAI,CAAE,CAAC;AAAA,IAC9G,CAAC,EACA,GAAG,aAAa,EAAE,OAAO,uBAAuB,GAAG,MAAM,kBAAkB,CAAC,EAC5E,GAAG,aAAa,EAAE,OAAO,kBAAkB,GAAG,MAAM,aAAa,CAAC,EAClE,GAAG,aAAa,EAAE,OAAO,kBAAkB,GAAG,CAAC,EAAE,QAAQ,MAAM;AAC9D,kBAAY,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,QAAO,mCAAS,GAAE,CAAC;AAAA,IAC5D,CAAC,EACA,GAAG,aAAa,EAAE,OAAO,kBAAkB,GAAG,CAAC,EAAE,QAAQ,MAAM;AAE9D,WAAI,mCAAS,WAAU,aAAa;AAClC,wBAAgB,QAAQ,eAAe;AACvC,qBAAa,eAAe,OAAO;AACnC,uBAAe,UAAU,WAAW,MAAM,gBAAgB,IAAI,GAAG,GAAI;AAAA,MACvE,OAAO;AACL,wBAAgB,CAAC,QAAS,SAAQ,mCAAS,mBAAkB,OAAO,GAAI;AAAA,MAC1E;AAAA,IACF,CAAC,EACA,UAAU;AACb,WAAO,MAAM;AAAE,SAAG,cAAc,EAAE;AAAG,mBAAa,eAAe,OAAO;AAAA,IAAE;AAAA,EAC5E,GAAG,CAAC,MAAM,UAAU,QAAQ,mBAAmB,cAAc,YAAY,CAAC;AAE1E,SAAO;AAAA,IACL;AAAA,IAAM;AAAA,IAAS;AAAA,IACf,eAAAD;AAAA,IAAe;AAAA,IAAU;AAAA,IAAa;AAAA,IAAU;AAAA,IAAiB;AAAA,IAAO;AAAA,IACxE;AAAA,IAAM;AAAA,IAAW;AAAA,IAAU;AAAA,IAAQ;AAAA,IAAI;AAAA,IAAQ;AAAA,IAC/C;AAAA,IAAU;AAAA,IAAgB;AAAA,IAAc;AAAA,IAAe;AAAA,IAAoB;AAAA,IAAS;AAAA,IACpF;AAAA,IAAW;AAAA,IAAc;AAAA,IAAe;AAAA,IAAW;AAAA,EACrD;AACF;;;AI5NA,SAAS,aAAAE,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;AA8DpC,SACE,OAAAC,MADF;AA3DO,SAAR,eAAgC,EAAE,OAAO,QAAQ,GAAG;AACzD,QAAM,CAAC,SAAS,UAAU,IAAID,UAAS,IAAI;AAC3C,QAAM,CAAC,IAAI,KAAK,IAAIA,UAAS,IAAI;AACjC,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAS,MAAM;AAC3C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,IAAI;AACvC,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,KAAK;AACtC,QAAM,UAAUD,QAAO,IAAI;AAE3B,QAAM,YAAY,CAAC,MAAO,CAAC,IAAI,OAAO,EAAE,WAAW,OAAO,IAAI,IAAI,yBAAyB,CAAC;AAE5F,EAAAD,WAAU,MAAM;AACd,KAAC,YAAY;AACX,UAAI;AACF,cAAM,OAAO,MAAM,MAAM,aAAa;AACtC,cAAM,KAAK,QAAQ,CAAC,GAAG,CAAC,KAAK;AAC7B,mBAAW,CAAC;AACZ,YAAI,EAAG,WAAU,EAAE,MAAM;AAAA,MAC3B,SAAS,GAAG;AAAE,iBAAS,EAAE,OAAO;AAAA,MAAE;AAAA,IACpC,GAAG;AACH,WAAO,MAAM,cAAc,QAAQ,OAAO;AAAA,EAC5C,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,OAAO,CAAC,OAAO;AACnB,kBAAc,QAAQ,OAAO;AAC7B,YAAQ,UAAU,YAAY,YAAY;AACxC,UAAI;AACF,cAAM,IAAI,MAAM,MAAM,cAAc,EAAE;AACtC,kBAAU,EAAE,MAAM;AAClB,YAAI,EAAE,WAAW,aAAa;AAAE,wBAAc,QAAQ,OAAO;AAAG,gBAAM,aAAa;AAAA,QAAE,OAChF;AAAE,gBAAM,MAAM,MAAM,MAAM,QAAQ,EAAE;AAAG,cAAI,2BAAK,GAAI,OAAM,UAAU,IAAI,EAAE,CAAC;AAAA,QAAE;AAAA,MACpF,QAAQ;AAAA,MAAC;AAAA,IACX,GAAG,GAAI;AAAA,EACT;AAEA,QAAM,eAAe,OAAO,OAAO;AACjC,aAAS,IAAI;AAAG,YAAQ,IAAI;AAAG,cAAU,YAAY;AACrD,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,QAAQ,GAAG,EAAE;AACrC,YAAM,UAAU,2BAAK,EAAE,CAAC;AACxB,iBAAU,2BAAK,WAAU,IAAI;AAC7B,WAAK,GAAG,EAAE;AAAA,IACZ,SAAS,GAAG;AAAE,eAAS,EAAE,OAAO;AAAG,gBAAU,OAAO;AAAA,IAAE,UAAE;AAAU,cAAQ,KAAK;AAAA,IAAE;AAAA,EACnF;AAKA,QAAM,gBAAgB,YAAY;AAChC,aAAS,IAAI;AAAG,YAAQ,IAAI;AAC5B,QAAI;AACF,UAAI,KAAK;AACT,UAAI,CAAC,IAAI;AAAE,aAAK,MAAM,MAAM,cAAc,UAAU;AAAG,mBAAW,EAAE;AAAA,MAAE;AACtE,YAAM,aAAa,EAAE;AAAA,IACvB,SAAS,GAAG;AAAE,eAAS,EAAE,OAAO;AAAA,IAAE,UAAE;AAAU,cAAQ,KAAK;AAAA,IAAE;AAAA,EAC/D;AAEA,SACE,gBAAAG,KAAC,SAAI,WAAU,mEAAkE,SAAS,SACxF,+BAAC,SAAI,WAAU,gDAA+C,SAAS,CAAC,MAAM,EAAE,gBAAgB,GAC9F;AAAA,yBAAC,SAAI,WAAU,0CACb;AAAA,sBAAAA,KAAC,QAAG,WAAU,6BAA4B,+BAAiB;AAAA,MAC3D,gBAAAA,KAAC,YAAO,SAAS,SAAS,WAAU,4DAA2D,kBAAC;AAAA,OAClG;AAAA,IAEC,SAAS,gBAAAA,KAAC,SAAI,WAAU,8CAA8C,iBAAM;AAAA,IAE5E,WAAW,cACV,gBAAAA,KAAC,SAAI,WAAU,iDAAgD,wCAAkB,IAC/E,KACF,qBAAC,SAAI,WAAU,eACb;AAAA,sBAAAA,KAAC,SAAI,KAAK,IAAI,KAAI,WAAU,WAAU,wDAAuD;AAAA,MAC7F,qBAAC,OAAE,WAAU,mCAAkC;AAAA;AAAA,QACyB;AAAA,QAAO;AAAA,SAC/E;AAAA,OACF,IAEA,qBAAC,SAAI,WAAU,oBACb;AAAA,sBAAAA,KAAC,OAAE,WAAU,mCAAkC,yEAE/C;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAAO,UAAU;AAAA,UAAM,SAAS;AAAA,UAC/B,WAAU;AAAA,UACT,iBAAO,kBAAa;AAAA;AAAA,MACvB;AAAA,OACF;AAAA,KAEJ,GACF;AAEJ;;;AC5FA,SAAS,MAAM,gBAAgB;AAsBL,gBAAAC,YAAA;AAjB1B,IAAM,SAAS,KAAK,MAAM,OAAO,oBAAoB,CAAC;AAEtD,IAAM,gBAAgB;AAAA,EACpB,EAAE,UAAU,aAAa,MAAM,WAAW;AAAA,EAC1C,EAAE,UAAU,kBAAkB,MAAM,mBAAmB;AAAA,EACvD,EAAE,UAAU,kBAAkB,MAAM,qBAAqB;AAAA,EACzD,EAAE,UAAU,cAAc,MAAM,oBAAoB;AAAA,EACpD,EAAE,UAAU,iBAAiB,MAAM,oBAAoB;AAAA,EACvD,EAAE,UAAU,cAAc,MAAM,aAAa;AAAA,EAC7C,EAAE,UAAU,WAAW,MAAM,UAAU;AAAA,EACvC,EAAE,UAAU,WAAW,MAAM,cAAW;AAAA,EACxC,EAAE,UAAU,SAAS,MAAM,YAAY;AACzC;AAEe,SAAR,YAA6B,EAAE,OAAO,GAAG;AAC9C,SACE,gBAAAA,KAAC,SAAI,WAAU,qFACb,0BAAAA,KAAC,YAAS,UAAU,gBAAAA,KAAC,SAAI,WAAU,gCAA+B,GAChE,0BAAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAc,CAAC,MAAM,OAAO,EAAE,KAAK;AAAA,MACnC,gBAAc;AAAA,MACd,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,mBAAkB;AAAA,MAClB,eAAe,EAAE,aAAa,MAAM;AAAA;AAAA,EACtC,GACF,GACF;AAEJ;;;ACnCA,SAAS,aAAAC,YAAW,YAAAC,iBAAgB;AAqB5B,SACE,OAAAC,MADF,QAAAC,aAAA;AAlBO,SAAR,cAA+B,EAAE,OAAO,gBAAgB,iBAAiB,QAAQ,GAAG;AACzF,QAAM,CAAC,QAAQ,SAAS,IAAIF,UAAS,MAAM,UAAU,CAAC,CAAC;AACvD,QAAM,CAAC,GAAG,IAAI,IAAIA,UAAS,EAAE;AAE7B,EAAAD,WAAU,MAAM;AAAE,UAAM,WAAW,EAAE,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;AAAA,EAAE,GAAG,CAAC,KAAK,CAAC;AAE9E,QAAM,WAAW,OAAO,OAAO,CAAC,MAAM;AACpC,UAAM,IAAI,EAAE,KAAK,EAAE,YAAY;AAC/B,QAAI,CAAC,EAAG,QAAO;AACf,YAAQ,EAAE,QAAQ,IAAI,YAAY,EAAE,SAAS,CAAC,MAAM,EAAE,SAAS,IAAI,YAAY,EAAE,SAAS,CAAC;AAAA,EAC7F,CAAC;AAED,QAAM,OAAO,CAAC,WAAW;AAAE,UAAM,OAAO,gBAAgB,MAAM;AAAG,YAAQ;AAAA,EAAE;AAC3E,QAAM,WAAW,CAAC,OAAO,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY;AAEhG,SACE,gBAAAE,KAAC,SAAI,WAAU,mEAAkE,SAAS,SACxF,0BAAAC,MAAC,SAAI,WAAU,uEAAsE,SAAS,CAAC,MAAM,EAAE,gBAAgB,GACrH;AAAA,oBAAAA,MAAC,SAAI,WAAU,yEACb;AAAA,sBAAAD,KAAC,QAAG,WAAU,6BAA4B,iCAAmB;AAAA,MAC7D,gBAAAA,KAAC,YAAO,SAAS,SAAS,WAAU,4DAA2D,kBAAC;AAAA,OAClG;AAAA,IACA,gBAAAA,KAAC,SAAI,WAAU,iCACb,0BAAAA;AAAA,MAAC;AAAA;AAAA,QAAM,OAAO;AAAA,QAAG,UAAU,CAAC,MAAM,KAAK,EAAE,OAAO,KAAK;AAAA,QAAG,aAAY;AAAA,QAClE,WAAU;AAAA;AAAA,IAAmI,GACjJ;AAAA,IACA,gBAAAC,MAAC,SAAI,WAAU,8BACb;AAAA,sBAAAD;AAAA,QAAC;AAAA;AAAA,UAAO,SAAS,MAAM,KAAK,IAAI;AAAA,UAC9B,WAAU;AAAA,UAAqF;AAAA;AAAA,MAEjG;AAAA,MACC,SAAS,IAAI,CAAC,MACb,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAAuB,SAAS,MAAM,KAAK,EAAE,OAAO;AAAA,UACnD,WAAW,qFAAqF,oBAAoB,EAAE,UAAU,kBAAkB,EAAE;AAAA,UACpJ;AAAA,4BAAAD,KAAC,UAAK,WAAU,wHACb,mBAAS,EAAE,IAAI,GAClB;AAAA,YACA,gBAAAC,MAAC,UAAK,WAAU,kBACd;AAAA,8BAAAD,KAAC,UAAK,WAAU,8BAA8B,YAAE,MAAK;AAAA,cACrD,gBAAAA,KAAC,UAAK,WAAU,6CAA6C,WAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK,GAAE;AAAA,eAC7G;AAAA,YACC,oBAAoB,EAAE,WAAW,gBAAAA,KAAC,UAAK,WAAU,qDAAoD,mBAAK;AAAA;AAAA;AAAA,QAThG,EAAE;AAAA,MAUf,CACD;AAAA,MACA,SAAS,WAAW,KAAK,gBAAAA,KAAC,OAAE,WAAU,+CAA8C,sCAAwB;AAAA,OAC/G;AAAA,KACF,GACF;AAEJ;;;APzCE,SAKgB,UALhB,OAAAE,MAKgB,QAAAC,aALhB;AAJF,IAAM,cAAc;AAGpB,IAAM,OAAO,CAAC,EAAE,GAAG,YAAY,WAAW,SAAS,KAAK,OAAO,OAAO,MACpE,gBAAAD,KAAC,SAAI,SAAQ,aAAY,WAAsB,MAAY,QAAO,gBAAe,aAAa,QAAQ,eAAc,SAAQ,gBAAe,SACxI,aACH;AAEF,IAAM,IAAI;AAAA,EACR,OAAO,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,4BAA0B;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,8GAA4G;AAAA,KAAE,GAAK;AAAA,EACjL,MAAM,gBAAAA,KAAC,QAAK,GAAG,gBAAAA,KAAC,UAAK,GAAE,4LAA0L,GAAI;AAAA,EACrN,UAAU,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,6CAA2C;AAAA,IAAE,gBAAAA,KAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAG;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,uDAAqD;AAAA,KAAE,GAAK;AAAA,EAC3K,MAAM,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAI;AAAA,IAAE,gBAAAA,KAAC,aAAQ,QAAO,6BAA2B;AAAA,KAAE,GAAK;AAAA,EACzG,MAAM,gBAAAA,KAAC,QAAK,GAAG,gBAAAA,KAAC,aAAQ,QAAO,0CAAwC,GAAI;AAAA,EAC3E,MAAM,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,WAAS;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,YAAU;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,sFAAoF;AAAA,KAAE,GAAK;AAAA,EAC3J,MAAM,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,mCAAiC;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,kEAAgE;AAAA,KAAE,GAAK;AAAA,EAC3I,OAAO,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAI;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAG;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,KAAI,IAAG,MAAI;AAAA,KAAE,GAAK;AAAA,EACzI,OAAO,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,6CAA2C;AAAA,IAAE,gBAAAA,KAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAG;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,uDAAqD;AAAA,KAAE,GAAK;AAAA,EACxK,MAAM,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,KAAI,QAAO,KAAG;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,MAAK,GAAE,KAAI,OAAM,KAAI,QAAO,KAAG;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,MAAK,GAAE,MAAK,OAAM,KAAI,QAAO,KAAG;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,KAAI,GAAE,MAAK,OAAM,KAAI,QAAO,KAAG;AAAA,KAAE,GAAK;AAAA,EAC1L,WAAW,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAG;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,8CAA4C;AAAA,KAAE,GAAK;AAAA,EAClI,QAAQ,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAG;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,SAAQ,IAAG,SAAO;AAAA,KAAE,GAAK;AAAA,EACpG,QAAQ,gBAAAA,KAAC,QAAK,GAAG,gBAAAA,KAAC,aAAQ,QAAO,+CAA6C,GAAI;AAAA,EAClF,MAAM,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,iBAAe;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,WAAS;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,iBAAe;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,YAAU;AAAA,KAAE,GAAK;AAAA,EAC/G,UAAU,gBAAAA,KAAC,QAAK,GAAG,gBAAAA,KAAC,cAAS,QAAO,kBAAgB,GAAI;AAAA,EACxD,WAAW,gBAAAA,KAAC,QAAK,GAAG,gBAAAA,KAAC,cAAS,QAAO,kBAAgB,GAAI;AAAA,EACzD,OAAO,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAG;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,MAAI;AAAA,KAAE,GAAK;AAAA,EAC5G,MAAM,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAG;AAAA,IAAE,gBAAAA,KAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAG;AAAA,IAAE,gBAAAA,KAAC,YAAO,IAAG,KAAI,IAAG,MAAK,GAAE,KAAG;AAAA,KAAE,GAAK;AAAA,EAClH,MAAM,gBAAAA,KAAC,QAAK,GAAG,gBAAAA,KAAC,aAAQ,QAAO,kGAAgG,GAAI;AAAA,EACnI,OAAO,gBAAAA,KAAC,QAAK,GAAG,gBAAAA,KAAC,UAAK,GAAE,iSAA+R,GAAI;AAAA,EAC3T,MAAM,gBAAAA,KAAC,QAAK,GAAG,gBAAAA,KAAC,UAAK,GAAE,mDAAiD,GAAI;AAAA,EAC5E,OAAO,gBAAAA,KAAC,QAAK,GAAG,gBAAAA,KAAC,cAAS,QAAO,kBAAgB,GAAI;AAAA,EACrD,WAAW,gBAAAA,KAAC,QAAK,GAAG,gBAAAA,KAAC,UAAK,GAAE,oHAAkH,GAAI;AAAA,EAClJ,OAAO,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAI;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,2BAAyB;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,QAAO,IAAG,KAAG;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,SAAQ,IAAG,KAAG;AAAA,KAAE,GAAK;AAAA,EACxK,KAAK,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,wDAAsD;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,8BAA4B;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAI;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAI;AAAA,KAAE,GAAK;AAAA,EACxM,OAAO,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,IAAG,KAAG;AAAA,IAAE,gBAAAA,KAAC,YAAO,IAAG,OAAM,IAAG,OAAM,GAAE,OAAK;AAAA,IAAE,gBAAAA,KAAC,cAAS,QAAO,oBAAkB;AAAA,KAAE,GAAK;AAAA,EACvJ,MAAM,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,8DAA4D;AAAA,IAAE,gBAAAA,KAAC,cAAS,QAAO,kBAAgB;AAAA,KAAE,GAAK;AAAA,EAC/H,KAAK,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,kDAAgD;AAAA,IAAE,gBAAAA,KAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAG;AAAA,KAAE,GAAK;AAAA,EAC9G,KAAK,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,mFAAiF;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,QAAO,IAAG,KAAG;AAAA,KAAE,GAAK;AAAA,EACtJ,MAAM,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,+DAA6D;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,gEAA8D;AAAA,KAAE,GAAK;AAAA,EACrK,OAAO,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAI;AAAA,IAAE,gBAAAA,KAAC,cAAS,QAAO,oBAAkB;AAAA,KAAE,GAAK;AAAA,EAC5F,SAAS,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,cAAS,QAAO,oBAAkB;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,6BAA2B;AAAA,KAAE,GAAK;AAAA,EACnG,GAAG,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAI;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK,IAAG,MAAI;AAAA,KAAE,GAAK;AAAA,EAC7F,UAAU,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,4DAA0D;AAAA,IAAE,gBAAAA,KAAC,cAAS,QAAO,kBAAgB;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,KAAG;AAAA,KAAE,GAAK;AAAA,EACvK,MAAM,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAI;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAI;AAAA,KAAE,GAAK;AAAA,EAClG,UAAU,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAG;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,MAAK,IAAG,KAAG;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,KAAI,IAAG,KAAG;AAAA,KAAE,GAAK;AAAA,EACnJ,OAAO,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,cAAS,QAAO,iBAAe;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,6BAA2B;AAAA,KAAE,GAAK;AAAA,EAC9F,UAAU,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,sLAAoL;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,+dAA6d;AAAA,KAAE,GAAK,MAAK,gBAAe,QAAO,QAAO;AAAA,EACjuB,MAAM,gBAAAA,KAAC,QAAK,GAAG,gBAAAA,KAAA,YAAE,0BAAAA,KAAC,UAAK,GAAE,sEAAoE,GAAE,GAAK;AAAA,EACpG,UAAU,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,KAAI,GAAE,OAAM,OAAM,MAAK,QAAO,QAAO,IAAG,KAAG;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAI;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,KAAI,IAAG,OAAM,IAAG,KAAI,IAAG,KAAG;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,MAAK,IAAG,OAAM,IAAG,MAAK,IAAG,KAAG;AAAA,KAAE,GAAK;AAAA,EACjM,UAAU,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,KAAI,GAAE,OAAM,OAAM,MAAK,QAAO,MAAK,IAAG,OAAK;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,kBAAgB;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,0FAAwF;AAAA,KAAE,GAAK;AAAA,EAC3M,QAAQ,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAG;AAAA,IAAE,gBAAAA,KAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAG;AAAA,IAAE,gBAAAA,KAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,OAAM,MAAK,gBAAc;AAAA,KAAE,GAAK;AAAA,EAC3I,QAAQ,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,KAAG;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,MAAI;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAI;AAAA,KAAE,GAAK;AAAA,EACnJ,QAAQ,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,OAAK;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,gGAA8F;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,MAAK,IAAG,OAAM,IAAG,MAAK,IAAG,QAAM;AAAA,KAAE,GAAK;AAAA,EAC3M,aAAa,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,OAAK;AAAA,IAAE,gBAAAA,KAAC,cAAS,QAAO,2BAAyB;AAAA,KAAE,GAAK;AAAA,EAC1G,OAAO,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,OAAK;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,OAAM,IAAG,MAAK,IAAG,QAAO,IAAG,MAAI;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,kFAAgF;AAAA,KAAE,GAAK;AAAA,EAC5L,QAAQ,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,iFAA+E;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,8FAA4F;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,mCAAiC;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,mCAAiC;AAAA,KAAE,GAAK;AAAA,EAC7S,MAAM,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,aAAW;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,WAAS;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,cAAY;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,aAAW;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,eAAa;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,aAAW;AAAA,KAAE,GAAK;AAAA,EACrJ,KAAK,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,wEAAsE;AAAA,IAAE,gBAAAA,KAAC,cAAS,QAAO,wBAAsB;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAI;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAI;AAAA,KAAE,GAAK;AAAA,EAC1N,MAAM,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAG;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,gnBAA8mB;AAAA,KAAE,GAAK;AAAA,EAC7qB,MAAM,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,KAAI,GAAE,OAAM,OAAM,MAAK,QAAO,MAAK,IAAG,KAAG;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAK,IAAG,MAAI;AAAA,KAAE,GAAK;AAAA,EAC/G,UAAU,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,kBAAgB;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,kBAAgB;AAAA,KAAE,GAAK;AAAA,EAC9E,UAAU,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,kBAAgB;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,iBAAe;AAAA,KAAE,GAAK;AAAA,EAC7E,QAAQ,gBAAAA,KAAC,QAAK,GAAG,gBAAAA,KAAC,cAAS,QAAO,mBAAiB,GAAI;AAAA,EACvD,UAAU,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,6CAA2C;AAAA,IAAE,gBAAAA,KAAC,YAAO,IAAG,OAAM,IAAG,KAAI,GAAE,KAAG;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAI;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAK,IAAG,MAAI;AAAA,KAAE,GAAK;AAAA,EAC3L,QAAQ,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,KAAI,QAAO,KAAI,IAAG,KAAG;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,MAAK,GAAE,KAAI,OAAM,KAAI,QAAO,KAAI,IAAG,KAAG;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,KAAI,GAAE,MAAK,OAAM,KAAI,QAAO,KAAI,IAAG,KAAG;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,cAAY;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,cAAY;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,cAAY;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,eAAa;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,gBAAc;AAAA,KAAE,GAAK;AAAA,EACxR,MAAM,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,YAAU;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,mBAAiB;AAAA,KAAE,GAAK;AAAA,EACrE,OAAO,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,cAAS,QAAO,gBAAc;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,kFAAgF;AAAA,KAAE,GAAK;AAAA,EAClJ,SAAS,gBAAAA,KAAC,QAAK,GAAG,gBAAAA,KAAC,UAAK,GAAE,kEAAgE,GAAI;AAAA,EAC9F,MAAM,gBAAAA,KAAC,QAAK,GAAG,gBAAAC,MAAA,YAAE;AAAA,oBAAAD,KAAC,UAAK,GAAE,4FAA0F;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,MAAK,IAAG,KAAI,IAAG,MAAK,IAAG,MAAI;AAAA,IAAE,gBAAAA,KAAC,UAAK,IAAG,MAAK,IAAG,MAAK,IAAG,SAAQ,IAAG,MAAI;AAAA,KAAE,GAAK;AAC5M;AAiDA,IAAM,SAAS,CAAC,EAAE,OAAO,IAAI,KAAK,OAAO,MAAM,QAAQ,iBAAiB,QAAQ,IAAI,MAAM;AACxF,QAAM,QAAQ,EAAE,IAAI,sBAAsB,IAAI,uBAAuB,IAAI,mBAAmB,IAAI,qBAAqB,IAAI,sBAAsB;AAC/I,QAAM,YAAY,QAAQ,IAAI,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,IAAI,OAAK,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,KAAK;AAE9G,QAAM,WAAW,QAAQ,SAAS,mBAAmB;AACrD,SACE,gBAAAE,MAAC,SAAI,WAAU,wBACZ;AAAA,UACC,gBAAAC,KAAC,SAAI,KAAU,KAAK,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,mDAAmD,IAEtG,gBAAAA,KAAC,SAAI,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,KAAK,uGACpC,oBACH;AAAA,IAED,YAAY,gBAAAA,KAAC,UAAK,WAAW,sDAAsD,QAAQ,sBAAsB;AAAA,KACpH;AAEJ;AAEA,IAAM,OAAO,CAAC,EAAE,UAAU,OAAO,QAAQ,MAAM;AAC7C,QAAM,QAAQ;AAAA,IACZ,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,QAAQ;AAAA,EACV;AACA,SACE,gBAAAA,KAAC,UAAK,WAAW,qGAAqG,MAAM,IAAI,CAAC,IAC9H,UACH;AAEJ;AAKA,IAAM,gBAAgB;AAAA,EACpB;AAAA,IACE,IAAI;AAAA,IAAM,MAAM;AAAA,IAAe,OAAO;AAAA,IAAqB,aAAa;AAAA,IACxE,SAAS;AAAA,IACT,SAAS;AAAA,IAAM,QAAQ;AAAA,IAAG,KAAK;AAAA,IAAQ,UAAU;AAAA,IAAQ,QAAQ;AAAA,IACjE,QAAQ;AAAA,IAAS,MAAM;AAAA,IAAQ,UAAU;AAAA,EAC3C;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IAAM,MAAM;AAAA,IAAiB,OAAO;AAAA,IAAqB,aAAa;AAAA,IAC1E,SAAS;AAAA,IACT,SAAS;AAAA,IAAM,QAAQ;AAAA,IAAG,KAAK;AAAA,IAAU,UAAU;AAAA,IAAU,QAAQ;AAAA,IACrE,QAAQ;AAAA,IAAS,MAAM;AAAA,IAAY,UAAU;AAAA,IAAQ,SAAS;AAAA,EAChE;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IAAM,MAAM;AAAA,IAAgB,OAAO;AAAA,IAAqB,aAAa;AAAA,IACzE,SAAS;AAAA,IACT,SAAS;AAAA,IAAO,QAAQ;AAAA,IAAG,KAAK;AAAA,IAAM,UAAU;AAAA,IAAU,QAAQ;AAAA,IAClE,QAAQ;AAAA,IAAS,MAAM;AAAA,IAAU,UAAU;AAAA,EAC7C;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IAAM,MAAM;AAAA,IAAgB,OAAO;AAAA,IAAqB,aAAa;AAAA,IACzE,SAAS;AAAA,IACT,SAAS;AAAA,IAAO,QAAQ;AAAA,IAAG,KAAK;AAAA,IAAM,UAAU;AAAA,IAAO,QAAQ;AAAA,IAC/D,QAAQ;AAAA,IAAS,MAAM;AAAA,IAAU,UAAU;AAAA,EAC7C;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IAAM,MAAM;AAAA,IAAmB,OAAO;AAAA,IAAqB,aAAa;AAAA,IAC5E,SAAS;AAAA,IACT,SAAS;AAAA,IAAO,QAAQ;AAAA,IAAG,KAAK;AAAA,IAAQ,UAAU;AAAA,IAAQ,QAAQ;AAAA,IAClE,QAAQ;AAAA,IAAS,MAAM;AAAA,IAAQ,UAAU;AAAA,EAC3C;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IAAM,MAAM;AAAA,IAAgB,OAAO;AAAA,IAAqB,aAAa;AAAA,IACzE,SAAS;AAAA,IACT,SAAS;AAAA,IAAO,QAAQ;AAAA,IAAG,KAAK;AAAA,IAAM,UAAU;AAAA,IAAU,QAAQ;AAAA,IAClE,QAAQ;AAAA,IAAS,MAAM;AAAA,IAAU,UAAU;AAAA,EAC7C;AACF;AAEA,IAAM,mBAAmB;AAAA,EACvB,EAAE,IAAI,MAAM,MAAM,MAAM,MAAM,QAAQ,MAAM,0JAA2I,MAAM,SAAS,KAAK,OAAO;AAAA,EAClN,EAAE,IAAI,MAAM,MAAM,OAAO,MAAM,QAAQ,MAAM,0QAAuO,MAAM,SAAS,QAAQ,OAAO;AAAA,EAClT,EAAE,IAAI,MAAM,MAAM,MAAM,MAAM,QAAQ,MAAM,uJAA8I,MAAM,QAAQ;AAAA,EACxM,EAAE,IAAI,MAAM,MAAM,MAAM,MAAM,SAAS,SAAS,8CAA2C,MAAM,8BAA2B,MAAM,QAAQ;AAAA,EAC1I,EAAE,IAAI,MAAM,MAAM,QAAQ,MAAM,2NAAyM,QAAQ,iBAAiB,MAAM,QAAQ;AAAA,EAChR,EAAE,IAAI,MAAM,MAAM,UAAU,MAAM,8CAA2C,MAAM,QAAQ;AAAA,EAC3F,EAAE,IAAI,MAAM,MAAM,OAAO,MAAM,QAAQ,MAAM,0OAAqN,MAAM,SAAS,QAAQ,QAAQ,QAAQ,gBAAgB;AAAA,EACzT,EAAE,IAAI,MAAM,MAAM,MAAM,MAAM,QAAQ,MAAM,kCAA2B,MAAM,QAAQ;AAAA,EACrF,EAAE,IAAI,MAAM,MAAM,MAAM,MAAM,SAAS,UAAU,QAAQ,MAAM,QAAQ;AAAA,EACvE,EAAE,IAAI,OAAO,MAAM,OAAO,MAAM,QAAQ,MAAM,4KAAiJ,MAAM,SAAS,QAAQ,YAAY;AACpO;AAEA,IAAM,eAAe;AAAA,EACnB,EAAE,IAAI,MAAM,OAAO,kBAAY,MAAM,qGAAyF;AAAA,EAC9H,EAAE,IAAI,MAAM,OAAO,UAAU,MAAM,0HAA8G;AAAA,EACjJ,EAAE,IAAI,MAAM,OAAO,kBAAkB,MAAM,wFAA+E;AAAA,EAC1H,EAAE,IAAI,MAAM,OAAO,cAAc,MAAM,+HAAyH;AAClK;AAgBe,SAAR,IAAqB,EAAE,QAAQ,OAAO,eAAe,GAAG;AA9O/D;AA+OE,QAAM,QAAQ,SAAS;AACvB,QAAM,CAAC,WAAW,YAAY,IAAIC,UAAS,IAAI;AAC/C,QAAM,gBAAgBC,QAAO,CAAC;AAC9B,QAAM,gBAAgBA,QAAO,IAAI;AACjC,QAAM,OAAO,MAAM;AACnB,QAAM,CAAC,cAAc,eAAe,IAAID,UAAS,IAAI;AACrD,QAAM,WAAW,OAAO,MAAM,WAAW;AACzC,QAAM,cAAc,OAAO,MAAM,cAAc;AAC/C,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK;AACpD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAChD,QAAM,WAAWC,QAAO,IAAI;AAC5B,QAAM,CAAC,cAAc,eAAe,IAAID,UAAS,IAAI;AACrD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAClD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,MAAM,oBAAI,IAAI,CAAC;AAChE,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAS,KAAK;AACxD,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,IAAI;AAC3C,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,IAAI;AAC/C,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,IAAI;AACnD,QAAM,aAAaC,QAAO,IAAI;AAC9B,QAAM,iBAAiBA,QAAO,IAAI;AAClC,QAAM,CAAC,YAAY,aAAa,IAAID,UAAS,KAAK;AAClD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAClD,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,KAAK;AAC9C,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAChD,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,CAAC;AACxC,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,OAAO;AACtD,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,EAAE;AACnC,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAS,KAAK;AAC1C,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,KAAK;AACpD,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAS,KAAK;AAChD,QAAM,CAAC,YAAY,aAAa,IAAIA,UAAS,KAAK;AAClD,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,EAAE;AACjD,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAS,CAAC;AAChD,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAS,gBAAgB;AACzD,QAAM,iBAAiB,OAAO,MAAM,WAAW;AAC/C,QAAM,WAAW,OAAO,MAAM,gBAAgB;AAC9C,QAAM,YAAYC,QAAO,IAAI;AAC7B,QAAM,cAAcA,QAAO,IAAI;AAC/B,QAAM,gBAAgBA,QAAO,IAAI;AACjC,QAAM,eAAeA,QAAO,IAAI;AAChC,QAAM,mBAAmBA,QAAO,IAAI;AACpC,QAAM,iBAAiBA,QAAO,CAAC,CAAC;AAChC,QAAM,iBAAiBA,QAAO,KAAK;AACnC,QAAM,cAAcA,QAAO,IAAI;AAC/B,QAAM,cAAcA,QAAO,IAAI;AAC/B,QAAM,cAAcA,QAAO,IAAI;AAG/B,QAAM,CAAC,WAAW,YAAY,IAAID,UAAS,MAAM;AAC/C,QAAI,OAAO,WAAW,aAAa;AACjC,YAAM,IAAI,SAAS,OAAO,aAAa,QAAQ,wBAAwB,KAAK,IAAI,EAAE;AAClF,UAAI,KAAK,OAAO,KAAK,IAAK,QAAO;AAAA,IACnC;AACA,WAAO;AAAA,EACT,CAAC;AACD,QAAM,cAAcC,QAAO,KAAK;AAChC,QAAM,eAAeA,QAAO,SAAS;AACrC,eAAa,UAAU;AACvB,EAAAC,WAAU,MAAM;AACd,UAAM,SAAS,OAAK;AAClB,UAAI,CAAC,YAAY,QAAS;AAC1B,mBAAa,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,EAAE,OAAO,CAAC,CAAC;AAAA,IACtD;AACA,UAAM,OAAO,MAAM;AACjB,UAAI,CAAC,YAAY,QAAS;AAC1B,kBAAY,UAAU;AACtB,eAAS,KAAK,MAAM,SAAS;AAC7B,eAAS,KAAK,MAAM,aAAa;AACjC,UAAI;AAAE,eAAO,aAAa,QAAQ,0BAA0B,OAAO,aAAa,OAAO,CAAC;AAAA,MAAE,QAAQ;AAAA,MAAC;AAAA,IACrG;AACA,WAAO,iBAAiB,aAAa,MAAM;AAC3C,WAAO,iBAAiB,WAAW,IAAI;AACvC,WAAO,MAAM;AAAE,aAAO,oBAAoB,aAAa,MAAM;AAAG,aAAO,oBAAoB,WAAW,IAAI;AAAA,IAAE;AAAA,EAC9G,GAAG,CAAC,CAAC;AACL,QAAM,cAAc,OAAK;AACvB,gBAAY,UAAU;AACtB,aAAS,KAAK,MAAM,SAAS;AAC7B,aAAS,KAAK,MAAM,aAAa;AACjC,MAAE,eAAe;AAAA,EACnB;AAEA,QAAM,YAAY,MAAM;AACtB,UAAM,IAAI,oBAAI,KAAK;AACnB,WAAO,GAAG,OAAO,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,EAAE,WAAW,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,EAC5F;AAEA,QAAM,gBAAgB,CAAC,SAAS,IAAI,QAAQ,CAAC,KAAK,QAAQ;AACxD,UAAM,IAAI,IAAI,WAAW;AAAG,MAAE,SAAS,MAAM,IAAI,EAAE,MAAM;AAAG,MAAE,UAAU;AAAK,MAAE,cAAc,IAAI;AAAA,EACnG,CAAC;AAED,QAAM,cAAc,CAAC,MAAM;AA1U7B,QAAAC;AA0U+B,YAAQ,OAAK,IAAI,CAAC;AAAG,iBAAa,KAAK;AAAG,KAAAA,MAAA,YAAY,YAAZ,gBAAAA,IAAqB;AAAA,EAAQ;AAEpG,QAAM,cAAc,CAAC,OAAO;AAAE,kBAAc,IAAI;AAAG,oBAAgB,oBAAI,IAAI,CAAC,EAAE,CAAC,CAAC;AAAA,EAAE;AAClF,QAAM,eAAe,CAAC,OAAO,gBAAgB,OAAK;AAChD,UAAM,IAAI,IAAI,IAAI,CAAC;AAAG,MAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE;AACzD,QAAI,EAAE,SAAS,EAAG,eAAc,KAAK;AACrC,WAAO;AAAA,EACT,CAAC;AACD,QAAM,aAAa,MAAM;AAAE,kBAAc,KAAK;AAAG,oBAAgB,oBAAI,IAAI,CAAC;AAAA,EAAE;AAC5E,QAAM,mBAAmB,YAAY;AACnC,UAAM,MAAM,CAAC,GAAG,YAAY;AAC5B,qBAAiB,KAAK;AAAG,eAAW;AACpC,UAAM,QAAQ,IAAI,IAAI,IAAI,QAAM,MAAM,cAAc,EAAE,CAAC,CAAC;AAAA,EAC1D;AAEA,QAAM,kBAAkB,YAAY;AAClC,QAAI,CAAC,OAAQ;AACb,iBAAa,EAAE,SAAS,KAAK,CAAC;AAC9B,QAAI;AAAE,YAAM,IAAI,MAAM,MAAM,UAAU,OAAO,EAAE;AAAG,mBAAa,EAAE,MAAM,EAAE,CAAC;AAAA,IAAE,SACrE,GAAG;AAAE,mBAAa,EAAE,OAAO,EAAE,WAAW,0BAA0B,CAAC;AAAA,IAAE;AAAA,EAC9E;AAEA,QAAM,gBAAgB,YAAY;AAChC,UAAM,UAAS,mCAAS,UAAS,IAAI,KAAK;AAC1C,QAAI,CAAC,MAAO;AACZ,eAAW,QAAM,EAAE,GAAG,GAAG,MAAM,MAAM,OAAO,GAAG,EAAE;AACjD,QAAI;AACF,YAAM,MAAM,mBAAmB,OAAO,QAAQ,IAAI;AAClD,iBAAW,IAAI;AAAA,IACjB,SAAS,GAAG;AACV,iBAAW,QAAM,EAAE,GAAG,GAAG,MAAM,OAAO,OAAO,EAAE,WAAW,4BAA4B,EAAE;AAAA,IAC1F;AAAA,EACF;AAGA,EAAAD,WAAU,MAAM;AACd,QAAI,CAAC,UAAW;AAChB,UAAM,QAAQ,CAAC,MAAM;AAAE,UAAI,SAAS,WAAW,CAAC,SAAS,QAAQ,SAAS,EAAE,MAAM,EAAG,cAAa,KAAK;AAAA,IAAE;AACzG,aAAS,iBAAiB,aAAa,KAAK;AAC5C,WAAO,MAAM,SAAS,oBAAoB,aAAa,KAAK;AAAA,EAC9D,GAAG,CAAC,SAAS,CAAC;AAGd,EAAAA,WAAU,MAAM;AAAE,kBAAc,KAAK;AAAG,oBAAgB,oBAAI,IAAI,CAAC;AAAA,EAAE,GAAG,CAAC,QAAQ,CAAC;AAGhF,EAAAA,WAAU,MAAM;AACd,QAAI,OAAO,mBAAmB,WAAY;AAC1C,oBAAgB,YAAY,CAAC,GAAG,OAAO,CAAC,GAAG,MAAM,KAAK,EAAE,UAAU,IAAI,CAAC,CAAC;AAAA,EAC1E,GAAG,CAAC,UAAU,cAAc,CAAC;AAI7B,QAAM,mBAAmB,CAAC,MAAM,SAAS;AACvC,QAAI,CAAC,KAAM;AACX,oBAAgB,EAAE,MAAM,MAAM,YAAY,IAAI,gBAAgB,IAAI,GAAG,SAAS,GAAG,CAAC;AAAA,EACpF;AACA,QAAM,mBAAmB,YAAY;AAnYvC,QAAAC;AAoYI,UAAM,IAAI;AACV,QAAI,CAAC,EAAG;AACR,oBAAgB,IAAI;AACpB,UAAM,OAAO,MAAM,cAAc,EAAE,IAAI;AACvC,UAAM,YAAUA,MAAA,EAAE,YAAF,gBAAAA,IAAW,WAAU;AACrC,QAAI,MAAM;AACR,YAAM,UAAU,EAAE,MAAM,MAAM,EAAE,KAAK,MAAM,MAAM,EAAE,MAAM,UAAU,EAAE,KAAK,MAAM,YAAY,EAAE,YAAY,QAAQ,CAAC;AAAA,IACrH,OAAO;AACL,kBAAY,QAAM,CAAC,GAAG,IAAI,EAAE,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,OAAO,MAAM,EAAE,MAAM,UAAU,EAAE,YAAY,UAAU,EAAE,KAAK,MAAM,SAAS,WAAW,IAAI,MAAM,QAAQ,GAAG,QAAQ,OAAO,CAAC,CAAC;AAAA,IACxL;AAAA,EACF;AACA,QAAM,cAAc,CAAC,MAAM;AA/Y7B,QAAAA;AA+Y+B,UAAM,KAAIA,MAAA,EAAE,OAAO,UAAT,gBAAAA,IAAiB;AAAI,MAAE,OAAO,QAAQ;AAAI,qBAAiB,GAAG,OAAO;AAAA,EAAE;AAC9G,QAAM,aAAa,CAAC,MAAM;AAhZ5B,QAAAA;AAgZ8B,UAAM,KAAIA,MAAA,EAAE,OAAO,UAAT,gBAAAA,IAAiB;AAAI,MAAE,OAAO,QAAQ;AAAI,qBAAiB,GAAG,UAAU;AAAA,EAAE;AAEhH,QAAM,iBAAiB,YAAY;AACjC,QAAI;AACF,YAAM,SAAS,MAAM,UAAU,aAAa,aAAa,EAAE,OAAO,KAAK,CAAC;AACxE,YAAM,KAAK,IAAI,cAAc,MAAM;AACnC,qBAAe,UAAU,CAAC;AAC1B,qBAAe,UAAU;AAGzB,YAAM,MAAM,OAAO,gBAAgB,OAAO;AAC1C,YAAM,WAAW,IAAI,IAAI;AACzB,YAAM,SAAS,SAAS,wBAAwB,MAAM;AACtD,YAAM,WAAW,SAAS,eAAe;AACzC,eAAS,UAAU;AACnB,aAAO,QAAQ,QAAQ;AACvB,kBAAY,UAAU;AACtB,kBAAY,UAAU;AACtB,iBAAW,CAAC;AACZ,oBAAc,YAAY,OAAO;AACjC,kBAAY,UAAU,YAAY,MAAM,WAAW,OAAK,IAAI,CAAC,GAAG,GAAI;AAEpE,SAAG,kBAAkB,QAAM;AAAE,YAAI,GAAG,KAAK,OAAO,EAAG,gBAAe,QAAQ,KAAK,GAAG,IAAI;AAAA,MAAE;AACxF,SAAG,SAAS,YAAY;AAva9B,YAAAA;AAwaQ,eAAO,UAAU,EAAE,QAAQ,OAAK,EAAE,KAAK,CAAC;AACxC,sBAAc,YAAY,OAAO;AACjC,YAAI;AAAE,WAAAA,MAAA,YAAY,YAAZ,gBAAAA,IAAqB;AAAA,QAAQ,QAAQ;AAAA,QAAC;AAC5C,oBAAY,UAAU;AACtB,YAAI,eAAe,QAAS;AAC5B,cAAM,OAAO,IAAI,KAAK,eAAe,SAAS,EAAE,MAAM,GAAG,YAAY,aAAa,CAAC;AACnF,cAAM,aAAa,IAAI,gBAAgB,IAAI;AAC3C,cAAM,OAAO,MAAM,cAAc,IAAI;AACrC,YAAI,KAAM,OAAM,UAAU,EAAE,MAAM,MAAM,KAAK,MAAM,MAAM,SAAS,UAAU,SAAS,WAAW,CAAC;AAAA,YAC5F,aAAY,QAAM,CAAC,GAAG,IAAI,EAAE,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,MAAM,OAAO,MAAM,SAAS,UAAU,YAAY,MAAM,UAAU,GAAG,QAAQ,OAAO,CAAC,CAAC;AAAA,MAC/I;AACA,uBAAiB,UAAU;AAC3B,SAAG,MAAM;AACT,mBAAa,IAAI;AAAA,IACnB,QAAQ;AAAE,YAAM,4CAAsC;AAAA,IAAE;AAAA,EAC1D;AACA,QAAM,gBAAgB,CAAC,SAAS,UAAU;AAxb5C,QAAAA;AAybI,mBAAe,UAAU;AACzB,iBAAa,KAAK;AAClB,QAAI;AAAE,OAAAA,MAAA,iBAAiB,YAAjB,gBAAAA,IAA0B;AAAA,IAAO,QAAQ;AAAA,IAAC;AAAA,EAClD;AAGA,EAAAD,WAAU,MAAM;AACd,QAAI,CAAC,UAAW;AAChB,UAAM,QAAQ,OAAK;AAAE,UAAI,EAAE,QAAQ,SAAU,eAAc,IAAI;AAAA,IAAE;AACjE,WAAO,iBAAiB,WAAW,KAAK;AACxC,WAAO,MAAM,OAAO,oBAAoB,WAAW,KAAK;AAAA,EAC1D,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,aAAa,MAAM;AACvB,UAAM,IAAI,KAAK,KAAK;AACpB,QAAI,CAAC,EAAG;AACR,QAAI,MAAM;AACR,YAAM,KAAK,GAAG,gBAAgB,MAAM;AACpC,cAAQ,EAAE;AACV;AAAA,IACF;AACA,UAAM,KAAK,IAAI,KAAK,IAAI,CAAC;AACzB,UAAM,OAAO,UAAU;AACvB,UAAM,MAAM,gBAAgB,SACxB,EAAE,IAAI,MAAM,QAAQ,MAAM,GAAG,QAAQ,iBAAiB,KAAK,IAC3D,EAAE,IAAI,MAAM,OAAO,MAAM,QAAQ,MAAM,GAAG,MAAM,QAAQ,QAAQ,QAAQ,gBAAgB;AAC5F,gBAAY,QAAM,CAAC,GAAG,IAAI,GAAG,CAAC;AAC9B,YAAQ,EAAE;AAAA,EACZ;AAEA,QAAM,gBAAgBE,SAAQ,MAAM;AAClC,UAAM,IAAI,YAAY,KAAK,EAAE,YAAY;AACzC,QAAI,CAAC,EAAG,QAAO,CAAC;AAChB,WAAO,eAAe,OAAO,OAAK;AAChC,YAAM,KAAK,EAAE,QAAQ,EAAE,WAAW,IAAI,YAAY;AAClD,aAAO,EAAE,SAAS,CAAC;AAAA,IACrB,CAAC,EAAE,IAAI,OAAK,EAAE,EAAE;AAAA,EAClB,GAAG,CAAC,aAAa,cAAc,CAAC;AAEhC,EAAAF,WAAU,MAAM;AAAE,mBAAe,CAAC;AAAA,EAAE,GAAG,CAAC,WAAW,CAAC;AAKpD,EAAAA,WAAU,MAAM;AACd,QAAI,OAAO,WAAW,eAAe,OAAO,WAAW,OAAQ;AAC/D,UAAM,aAAc,OAAO,YAAY,eAAe,QAAQ,OAAO,QAAQ,IAAI,6BAA8B;AAC/G,UAAM,UAAU,WAAW,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AACvE,UAAM,QAAQ,OAAK;AACjB,UAAI,QAAQ,UAAU,CAAC,QAAQ,SAAS,EAAE,MAAM,EAAG;AACnD,YAAM,IAAI,EAAE,QAAQ,CAAC;AACrB,UAAI,EAAE,SAAS,sBAAsB,EAAE,SAAS,EAAE,WAAW;AAC3D,cAAM,UAAU,CAAC,CAAC,aAAa,QAAQ,mBAAmB,KAAK,CAAC,CAAC,aAAa,QAAQ,uBAAuB;AAC7G,qBAAa,QAAQ,qBAAqB,EAAE,KAAK;AACjD,qBAAa,QAAQ,yBAAyB,OAAO,EAAE,SAAS,CAAC;AACjE,YAAI,CAAC,QAAS,UAAS,OAAO;AAAA,MAChC;AAAA,IACF;AACA,WAAO,iBAAiB,WAAW,KAAK;AACxC,QAAI;AAAE,aAAO,OAAO,YAAY,EAAE,MAAM,oBAAoB,GAAG,GAAG;AAAA,IAAE,QAAQ;AAAA,IAAC;AAC7E,WAAO,MAAM,OAAO,oBAAoB,WAAW,KAAK;AAAA,EAC1D,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAiB,cAAc,WAAW;AAChD,QAAM,aAAa,MAAM;AAAE,kBAAc,IAAI;AAAG,mBAAe,EAAE;AAAA,EAAE;AACnE,QAAM,cAAc,MAAM;AAAE,kBAAc,KAAK;AAAG,mBAAe,EAAE;AAAA,EAAE;AACrE,QAAM,YAAY,MAAM,cAAc,UAAU,eAAe,QAAM,IAAI,KAAK,cAAc,MAAM;AAClG,QAAM,YAAY,MAAM,cAAc,UAAU,eAAe,QAAM,IAAI,IAAI,cAAc,UAAU,cAAc,MAAM;AAEzH,QAAM,SAAS,SAAS,KAAK,OAAK,EAAE,OAAO,QAAQ,MAC7C,MAAM,aAAa,MAAM,UAAU,OAAO,WAAW,MAAM,YAAY;AAI7E,EAAAA,WAAU,MAAM;AACd,eAAW,UAAU;AACrB,QAAI,CAAC,QAAQ,CAAC,UAAU,eAAe,WAAW,GAAG;AAAE,qBAAe,IAAI;AAAG;AAAA,IAAO;AACpF,UAAM,SAAS;AACf,UAAM,QAAQ,OAAO,aAAa;AAClC,UAAM,aAAa,OAAO,kBAAkB;AAC5C,UAAM,QAAQ,eAAe;AAC7B,mBAAe,EAAE,QAAQ,MAAM,MAAM,CAAC;AACtC,UAAM,QAAQ,CAAC,SAAU,QAAQ,cAAe;AAChD,QAAI,CAAC,SAAS,eAAe,YAAY,OAAQ;AACjD,mBAAe,UAAU;AACzB,mBAAe,EAAE,QAAQ,SAAS,MAAM,MAAM,MAAM,CAAC;AAGrD,UAAM,UAAU,MAAM,EACnB,KAAK,CAAAG,UAAQ;AACZ,qBAAe,UAAU;AACzB,UAAI,WAAW,YAAY,UAAU,CAACA,MAAM;AAC5C,qBAAe,EAAE,QAAQ,MAAAA,MAAK,CAAC;AAAG,YAAM,kBAAkB;AAAA,IAC5D,CAAC,EACA,MAAM,OAAK;AACV,qBAAe,UAAU;AACzB,UAAI,WAAW,YAAY,OAAQ,gBAAe,EAAE,QAAQ,MAAM,OAAO,OAAO,EAAE,QAAQ,CAAC;AAAA,IAC7F,CAAC;AAAA,EAEL,GAAG,CAAC,UAAU,eAAe,QAAQ,MAAM,iCAAQ,WAAW,iCAAQ,cAAc,CAAC;AAErF,EAAAH,WAAU,MAAM;AACd,QAAI,UAAU,QAAS,WAAU,QAAQ,YAAY,UAAU,QAAQ;AAAA,EACzE,GAAG,CAAC,UAAU,eAAe,MAAM,CAAC;AAEpC,QAAM,SAASE,SAAQ,OAAO;AAAA,IAC5B,KAAK,SAAS;AAAA,IACd,QAAQ,SAAS,OAAO,OAAK,EAAE,SAAS,CAAC,EAAE;AAAA,IAC3C,MAAM,SAAS,OAAO,OAAE;AAriB5B,UAAAD;AAqiB+B,eAAAA,MAAA,EAAE,SAAF,gBAAAA,IAAQ,qBAAoB,EAAE,KAAK,qBAAqB,MAAM;AAAA,KAAE,EAAE;AAAA,EAC/F,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC;AAExB,QAAM,WAAWC,SAAQ,MAAM;AAC7B,QAAI,OAAO;AACX,QAAI,WAAW,SAAU,QAAO,KAAK,OAAO,OAAK,EAAE,SAAS,CAAC;AAAA,aACpD,WAAW,OAAQ,QAAO,KAAK,OAAO,OAAE;AA3iBrD,UAAAD;AA2iBwD,eAAAA,MAAA,EAAE,SAAF,gBAAAA,IAAQ,qBAAoB,EAAE,KAAK,qBAAqB,MAAM;AAAA,KAAE;AACpH,QAAI,WAAY,QAAO,KAAK,OAAO,OAAK,EAAE,SAAS,CAAC;AACpD,QAAI,SAAU,QAAO,KAAK,OAAO,OAAE;AA7iBvC,UAAAA;AA6iB0C,eAAAA,MAAA,EAAE,SAAF,gBAAAA,IAAQ,qBAAoB,EAAE,KAAK,qBAAqB,MAAM;AAAA,KAAE;AACtG,WAAO;AAAA,EACT,GAAG,CAAC,QAAQ,UAAU,YAAY,UAAU,MAAM,EAAE,CAAC;AAIrD,QAAM,cAAc,MAAM,YAAY,CAAC;AACvC,QAAM,cAAc,YAAY,KAAK,OAAK,EAAE,WAAW,WAAW;AAClE,QAAM,aAAa,YAAY,SAAS;AAExC,QAAM,gBAAgB,MAAM;AAC5B,QAAM,iBAAiB,QAAQ,iBAAiB,cAAc,CAAC;AAC/D,QAAM,eAAe,QAAQ,iBAAiB,CAAC;AAC/C,QAAM,UAAU,CAAC,OAAQ,MAAM,MAAM,UAAU,CAAC,GAAG,KAAK,OAAK,EAAE,YAAY,EAAE,IAAI;AAIjF,QAAM,eAAe,MAAM;AACzB,QAAI,CAAC,QAAQ,CAAC,YAAY,gBAAgB,QAAS;AACnD,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,MAAM,cAAc,UAAU,MAAM;AAAE,oBAAc,UAAU;AAAK,YAAM,UAAU,UAAU,WAAW;AAAA,IAAE;AAC9G,iBAAa,cAAc,OAAO;AAClC,kBAAc,UAAU,WAAW,MAAM;AAAE,YAAM,UAAU,UAAU,QAAQ;AAAG,oBAAc,UAAU;AAAA,IAAE,GAAG,GAAI;AAAA,EACnH;AAEA,SACE,gBAAAG,MAAC,SAAI,WAAU,2DAEZ;AAAA,sBACC,gBAAAA,MAAC,SAAI,WAAU,+GACb;AAAA,sBAAAC,KAAC,UAAK,WAAU,YAAY,YAAE,MAAK;AAAA,MACnC,gBAAAA,KAAC,UAAK,WAAU,WAAU,8FAA6E;AAAA,MACvG,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAAO,SAAS,MAAM,eAAe,IAAI;AAAA,UACxC,WAAU;AAAA,UAA+F;AAAA;AAAA,MAE3G;AAAA,OACF;AAAA,IAED,gBACC,gBAAAD,MAAC,SAAI,WAAU,qHACb;AAAA,sBAAAC,KAAC,UAAK,WAAU,WAAU,yEAAqD;AAAA,MAC/E,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAAO,SAAS,MAAM,eAAe,IAAI;AAAA,UACxC,WAAU;AAAA,UAAmG;AAAA;AAAA,MAE/G;AAAA,OACF;AAAA,IAIF,gBAAAD,MAAC,UAAK,WAAU,uCAEd;AAAA,sBAAAA,MAAC,aAAQ,OAAO,EAAE,OAAO,UAAU,GAAG,WAAU,sEAC9C;AAAA,wBAAAA,MAAC,YAAO,WAAU,4CAChB;AAAA,0BAAAA,MAAC,SAAI,WAAU,gDACb;AAAA,4BAAAA,MAAC,SAAI,WAAU,qCACZ;AAAA,wBACC,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBAAO,SAAS;AAAA,kBAAQ,OAAM;AAAA,kBAC7B,WAAU;AAAA,kBAAuE,YAAE;AAAA;AAAA,cAAK;AAAA,cAE5F,gBAAAA,KAAC,QAAG,WAAU,sCAAqC,8BAAgB;AAAA,cAClE,QACC,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBAAO,SAAS,MAAM,aAAa,OAAK,CAAC,CAAC;AAAA,kBACzC,OAAO,IAAG,+BAAO,SAAQ,SAAM,WAAM,YAAY,uCAAoC,wCAAwC;AAAA,kBAC7H,WAAU;AAAA,kBACV;AAAA,oCAAAC,KAAC,UAAO,OAAM,+BAAO,SAAQ,WAAQ,KAAK,+BAAO,QAAQ,MAAK,MAAK,KAAK,YAAY,mBAAmB,gBAAgB;AAAA,oBACvH,gBAAAA,KAAC,UAAK,WAAU,kEAAkE,0CAAO,SAAQ,WAAO;AAAA;AAAA;AAAA,cAC1G;AAAA,eAEJ;AAAA,YACA,gBAAAD,MAAC,SAAI,WAAU,oCACZ;AAAA,sBAAQ,eACP,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBAAO,SAAS,MAAM,WAAW,EAAE,OAAO,IAAI,MAAM,IAAI,MAAM,OAAO,OAAO,GAAG,CAAC;AAAA,kBAC/E,OAAM;AAAA,kBACN,WAAU;AAAA,kBAA2E,YAAE;AAAA;AAAA,cAAK;AAAA,cAE/F,QAAQ,iBAAiB,CAAC,eACzB,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBAAO,SAAS,MAAM,eAAe,IAAI;AAAA,kBACxC,OAAO,iBAAiB,4CAAuC;AAAA,kBAC/D,WAAU;AAAA,kBACT;AAAA,sBAAE;AAAA,oBACF,kBACC,gBAAAC,KAAC,UAAK,WAAU,4JAA2J,eAAC;AAAA;AAAA;AAAA,cAEhL;AAAA,eAIJ;AAAA,aACF;AAAA,UACA,gBAAAD,MAAC,SAAI,WAAU,YACb;AAAA,4BAAAC,KAAC,UAAK,WAAU,6DAA6D,YAAE,QAAO;AAAA,YACtF,gBAAAA,KAAC,WAAM,aAAY,2CAAkC,WAAU,yIAAwI;AAAA,aACzM;AAAA,UACA,gBAAAA,KAAC,SAAI,WAAU,4CACZ;AAAA,YACC,CAAC,OAAO,SAAS,OAAO,GAAG;AAAA,YAC3B,CAAC,UAAU,gBAAa,OAAO,MAAM;AAAA,YACrC,CAAC,QAAQ,UAAU,OAAO,IAAI;AAAA,UAChC,EAAE,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,MACb,gBAAAD;AAAA,YAAC;AAAA;AAAA,cAAe,SAAS,MAAM,UAAU,CAAC;AAAA,cACxC,WAAW;AAAA,sBACP,WAAW,IAAI,4BAA4B,mCAAmC;AAAA,cACjF;AAAA;AAAA,gBACA,IAAI,KACH,gBAAAC,KAAC,UAAK,WAAU,6LACb,cAAI,KAAK,QAAQ,GACpB;AAAA;AAAA;AAAA,YAPS;AAAA,UASb,CACD,GACH;AAAA,WACF;AAAA,QAEA,gBAAAA,KAAC,SAAI,WAAU,0BACZ,kBAAQ,MAAM,WAAW,SAAS,WAAW,IAC1C,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,MAAM,gBAAAA,KAAC,0BAA0B,CAAG,CAAE,IAC5D,SAAS,IAAI,OAAE;AAjqB/B,cAAAJ;AAkqBkB,iCAAAI;AAAA,YAAC;AAAA;AAAA,cAEC;AAAA,cACA,QAAQ,EAAE,OAAO;AAAA,cACjB,UAAU,MAAM,UAAU,QAAQ,SAAQJ,MAAA,EAAE,SAAF,gBAAAA,IAAQ,gBAAgB,IAAI;AAAA,cACtE,SAAS,MAAM;AAAE,4BAAY,EAAE,EAAE;AAAG,oBAAI,KAAM,OAAM,SAAS,EAAE,EAAE;AAAA,cAAE;AAAA;AAAA,YAJ9D,EAAE;AAAA,UAKT;AAAA,SACD,GACP;AAAA,QAGA,gBAAAI;AAAA,UAAC;AAAA;AAAA,YAAI,aAAa;AAAA,YAAa,OAAM;AAAA,YACnC,WAAU;AAAA;AAAA,QAA8G;AAAA,SAC5H;AAAA,MAGA,gBAAAA,KAAC,aAAQ,WAAU,4CAChB,mBACD,gBAAAD,MAAA,YACA;AAAA,wBAAAC,KAAC,cAAW,GAAG,QAAQ,iBAAiB,MAAM,eAAe,OAAK,CAAC,CAAC,GAAG,aAA0B,cAAc,YAAY,YAAY,MAAM,gBAAgB,IAAI,GAAG,QAAQ,QAAQ,MAAM,kBAAiB,iCAAQ,KAAI,aAAa,OAAO,kBAAkB,MAAM;AAAA,QAElQ,cACC,gBAAAD,MAAC,SAAI,WAAU,+DACb;AAAA,0BAAAC,KAAC,YAAO,SAAS,YAAY,OAAM,YAAW,WAAU,iCAAiC,YAAE,GAAE;AAAA,UAC7F,gBAAAD,MAAC,UAAK,WAAU,kCAAkC;AAAA,yBAAa;AAAA,YAAK;AAAA,YAAa,aAAa,SAAS,IAAI,KAAK;AAAA,aAAI;AAAA,UACpH,gBAAAC;AAAA,YAAC;AAAA;AAAA,cAAO,SAAS,MAAM,aAAa,QAAQ,iBAAiB,IAAI;AAAA,cAAG,UAAU,CAAC,aAAa;AAAA,cAC1F,OAAM;AAAA,cAAsB,WAAU;AAAA,cAA0D,YAAE;AAAA;AAAA,UAAM;AAAA,WAC5G;AAAA,QAID,CAAC,cAAc,gBAAgB,YAAY,QAAQ,YAAY,YAC9D,gBAAAD;AAAA,UAAC;AAAA;AAAA,YAAO,SAAS,MAAM,YAAY,QAAQ,aAAa,EAAE,MAAM,YAAY,KAAK,CAAC;AAAA,YAChF,OAAM;AAAA,YACN,WAAU;AAAA,YACV;AAAA,8BAAAC,KAAC,UAAK,WAAU,mCAAmC,YAAE,SAAQ;AAAA,cAC5D,YAAY,WAAW,CAAC,YAAY,OACnC,gBAAAA,KAAC,UAAK,WAAU,+CAA8C,wCAAqB,IAEnF,gBAAAD,MAAC,UAAK,WAAU,kEACd;AAAA,gCAAAC,KAAC,YAAO,WAAU,iCAAgC,qBAAO;AAAA,gBAAS;AAAA,gBAAE,YAAY;AAAA,iBAClF;AAAA,cAED,YAAY,WAAW,YAAY,QAAQ,gBAAAA,KAAC,UAAK,WAAU,wCAAuC,+BAAY;AAAA;AAAA;AAAA,QACjH;AAAA,QAGD,cACC,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAO;AAAA,YACP,UAAU;AAAA,YACV,SAAS;AAAA,YACT,cAAc;AAAA,YACd,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,SAAS;AAAA;AAAA,QACX;AAAA,QAIF,gBAAAD,MAAC,SAAI,KAAK,WAAW,WAAU,gDAC5B;AAAA,kBAAQ,MAAM,mBAAmB,eAAe,WAAW,KAC1D,gBAAAC,KAAC,SAAI,WAAU,kBACZ,WAAC,CAAC,MAAK,MAAM,GAAE,CAAC,MAAK,MAAM,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,MAAK,MAAM,GAAE,CAAC,OAAM,MAAM,GAAE,CAAC,OAAM,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,MACxG,gBAAAA,KAAC,SAAY,WAAW,QAAQ,SAAS,QAAQ,gBAAgB,eAAe,IAC9E,0BAAAA,KAAC,SAAI,WAAW,OAAO,CAAC,0CAA0C,SAAS,QAAQ,sBAAsB,cAAc,IAAI,KADnH,CAEV,CACD,GACH;AAAA,UAED,eAAe,SAAS,KAAK,gBAAAA,KAAC,cAAW,OAAM,QAAO;AAAA,UACtD,eAAe,IAAI,CAAC,GAAG,MACtB,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAEC;AAAA,cACA,MAAM,eAAe,IAAI,CAAC;AAAA,cAC1B,aAAa,aAAa,cAAc;AAAA,cACxC,gBAAgB,EAAE,OAAO;AAAA,cACzB,SAAS,CAAC,EAAC,iCAAQ;AAAA,cACnB,YAAY,QAAQ,MAAM;AAAA,cAC1B;AAAA,cACA,UAAU,aAAa,IAAI,EAAE,EAAE;AAAA,cAC/B,eAAe,MAAM,YAAY,EAAE,EAAE;AAAA,cACrC,gBAAgB,MAAM,aAAa,EAAE,EAAE;AAAA;AAAA,YAVlC,EAAE;AAAA,UAWT,CACD;AAAA,WACH;AAAA,QAGA,gBAAAA,KAAC,SAAI,WAAU,aACb,0BAAAD,MAAC,SAAI,WAAU,4DACb;AAAA,0BAAAA,MAAC,SAAI,WAAU,iDACZ;AAAA;AAAA,cACC,CAAC,SAAS,UAAU;AAAA,cACpB,CAAC,QAAQ,cAAc;AAAA,YACzB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MACV,gBAAAC;AAAA,cAAC;AAAA;AAAA,gBAAe,SAAS,MAAM,eAAe,CAAC;AAAA,gBAC7C,WAAW,sCAAsC,gBAAgB,IAC7D,MAAM,SAAS,kCAAkC,4BACjD,mCAAmC;AAAA,gBACtC;AAAA;AAAA,cAJU;AAAA,YAKb,CACD;AAAA,YACD,gBAAAA,KAAC,SAAI,WAAU,UAAS;AAAA,YACxB,gBAAAD,MAAC,YAAO,SAAS,MAAM,aAAa,OAAK,CAAC,CAAC,GAAG,WAAU,uGAAsG;AAAA;AAAA,cACzJ,gBAAAC,KAAC,UAAK,WAAU,kBAAiB,uCAAsB;AAAA,eAC5D;AAAA,aACF;AAAA,UAEC,aACC,gBAAAA,KAAC,SAAI,WAAU,6EACZ,uBAAa,IAAI,OAChB,gBAAAD;AAAA,YAAC;AAAA;AAAA,cAAkB,SAAS,MAAM;AAAE,wBAAQ,EAAE,IAAI;AAAG,6BAAa,KAAK;AAAA,cAAE;AAAA,cACvE,WAAU;AAAA,cACV;AAAA,gCAAAC,KAAC,UAAK,WAAU,uBAAsB,eAAC;AAAA,gBAAQ,EAAE;AAAA;AAAA;AAAA,YAFtC,EAAE;AAAA,UAGf,CACD,GACH;AAAA,UAGF,gBAAAA,KAAC,SAAI,WAAW,aAAa,gBAAgB,SAAS,iBAAiB,EAAE,IACvE,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,MAAM;AAAA,cACN,OAAO;AAAA,cACP,UAAU,OAAK;AAAE,wBAAQ,EAAE,OAAO,KAAK;AAAG,6BAAa;AAAA,cAAE;AAAA,cACzD,WAAW,OAAK;AACd,oBAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,UAAU;AACpC,oBAAE,eAAe;AACjB,6BAAW;AAAA,gBACb;AAAA,cACF;AAAA,cACA,aACE,gBAAgB,SACZ,wEACA;AAAA,cAEN,WAAW,yFAAyF,gBAAgB,SAAS,gDAAgD,EAAE;AAAA;AAAA,UACjL,GACF;AAAA,UAEA,gBAAAD,MAAC,SAAI,WAAU,+DACZ;AAAA,wBACC,gBAAAA,MAAC,SAAI,WAAU,kCACb;AAAA,8BAAAC,KAAC,UAAK,WAAU,2DAA0D;AAAA,cAC1E,gBAAAA,KAAC,UAAK,WAAU,iEAAiE,kBAAQ,OAAO,GAAE;AAAA,cAClG,gBAAAA,KAAC,aAAU,aAA0B;AAAA,cACrC,gBAAAA,KAAC,UAAK,WAAU,wDAAuD,yBAAW;AAAA,cAClF,gBAAAA,KAAC,YAAO,SAAS,MAAM,cAAc,IAAI,GAAG,WAAU,qFAAoF,sBAAQ;AAAA,cAClJ,gBAAAD,MAAC,YAAO,SAAS,MAAM,cAAc,KAAK,GAAG,WAAU,2IAA0I;AAAA;AAAA,gBAAO,gBAAAC,KAAC,UAAK,WAAU,cAAc,YAAE,MAAK;AAAA,iBAAO;AAAA,eACtP,IAEA,gBAAAD,MAAA,YACE;AAAA,8BAAAA,MAAC,SAAI,WAAU,YAAW,KAAK,UAC7B;AAAA,gCAAAC;AAAA,kBAAC;AAAA;AAAA,oBAAO,SAAS,MAAM,aAAa,OAAK,CAAC,CAAC;AAAA,oBAAG,OAAM;AAAA,oBAClD,WAAW,qDAAqD,YAAY,gCAAgC,mCAAmC;AAAA,oBAAK,YAAE;AAAA;AAAA,gBAAM;AAAA,gBAC7J,aAAa,gBAAAA,KAAC,eAAY,QAAQ,aAAa;AAAA,iBAClD;AAAA,cACA,gBAAAA,KAAC,cAAW,SAAS,MAAG;AAh0B5C,oBAAAJ;AAg0B+C,wBAAAA,MAAA,cAAc,YAAd,gBAAAA,IAAuB;AAAA,iBAAS,QAAQ,MAAG;AAh0B1F,oBAAAA;AAg0B6F,wBAAAA,MAAA,aAAa,YAAb,gBAAAA,IAAsB;AAAA,iBAAS;AAAA,cACxG,gBAAAI;AAAA,gBAAC;AAAA;AAAA,kBAAO,SAAS;AAAA,kBAAgB,OAAM;AAAA,kBACrC,WAAU;AAAA,kBAAuF,YAAE;AAAA;AAAA,cAAI;AAAA,cACzG,gBAAAA,KAAC,SAAI,WAAU,UAAS;AAAA,cACxB,gBAAAD;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAS;AAAA,kBACT,UAAU,CAAC,KAAK,KAAK;AAAA,kBACrB,WAAW,qIACT,gBAAgB,SACZ,iDACA,gDACN;AAAA,kBACC;AAAA,oCAAgB,SAAS,gBAAgB;AAAA,oBAC1C,gBAAAC,KAAC,UAAK,WAAU,cAAc,YAAE,MAAK;AAAA;AAAA;AAAA,cACvC;AAAA,eACF;AAAA,YAEF,gBAAAA,KAAC,WAAM,KAAK,eAAe,MAAK,QAAO,QAAO,WAAU,WAAU,UAAS,UAAU,aAAa;AAAA,YAClG,gBAAAA,KAAC,WAAM,KAAK,cAAc,MAAK,QAAO,WAAU,UAAS,UAAU,YAAY;AAAA,aACjF;AAAA,WACF,GACF;AAAA,SACA,IAEE,gBAAAA,KAAC,qBAAkB,GAEvB;AAAA,MAGC,eAAe,UAAU,gBAAAA,KAAC,gBAAa,GAAG,QAAQ,SAAS,MAAM,eAAe,KAAK,GAAG;AAAA,OAC3F;AAAA,IACC,eAAe,gBAAAA,KAAC,kBAAe,OAAc,SAAS,MAAM,eAAe,KAAK,GAAG;AAAA,IACnF,gBAAgB,UACf,gBAAAA,KAAC,iBAAc,OAAc,gBAAgB,OAAO,IAAI,kBAAiB,YAAO,SAAP,mBAAa,kBAAkB,SAAS,MAAM,gBAAgB,KAAK,GAAG;AAAA,IAEhJ,gBACC,gBAAAA,KAAC,SAAI,WAAU,uEAAsE,SAAS,MAAM,gBAAgB,IAAI,GACtH,0BAAAD,MAAC,SAAI,WAAU,2DAA0D,SAAS,OAAK,EAAE,gBAAgB,GACvG;AAAA,sBAAAA,MAAC,SAAI,WAAU,0CACb;AAAA,wBAAAA,MAAC,QAAG,WAAU,6BAA4B;AAAA;AAAA,UAAQ,aAAa,SAAS,UAAU,WAAW;AAAA,WAAU;AAAA,QACvG,gBAAAC,KAAC,YAAO,SAAS,MAAM,gBAAgB,IAAI,GAAG,WAAU,4DAA2D,kBAAC;AAAA,SACtH;AAAA,MACC,aAAa,SAAS,UACrB,gBAAAA,KAAC,SAAI,KAAK,aAAa,YAAY,KAAI,IAAG,WAAU,yDAAwD,IAE5G,gBAAAD,MAAC,SAAI,WAAU,sDACb;AAAA,wBAAAC,KAAC,UAAK,WAAU,kBAAkB,YAAE,MAAK;AAAA,QACzC,gBAAAA,KAAC,UAAK,WAAU,+BAA+B,uBAAa,KAAK,MAAK;AAAA,SACxE;AAAA,MAEF,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAS;AAAA,UACT,OAAO,aAAa;AAAA,UACpB,UAAU,OAAK,gBAAgB,QAAM,EAAE,GAAG,GAAG,SAAS,EAAE,OAAO,MAAM,EAAE;AAAA,UACvE,WAAW,OAAK;AAAE,gBAAI,EAAE,QAAQ,QAAS,kBAAiB;AAAG,gBAAI,EAAE,QAAQ,SAAU,iBAAgB,IAAI;AAAA,UAAE;AAAA,UAC3G,aAAY;AAAA,UACZ,WAAU;AAAA;AAAA,MACZ;AAAA,MACA,gBAAAD,MAAC,SAAI,WAAU,+BACb;AAAA,wBAAAC,KAAC,YAAO,SAAS,MAAM,gBAAgB,IAAI,GAAG,WAAU,wEAAuE,sBAAQ;AAAA,QACvI,gBAAAD,MAAC,YAAO,SAAS,kBAAkB,WAAU,kIAAiI;AAAA;AAAA,UACrK,gBAAAC,KAAC,UAAK,WAAU,cAAc,YAAE,MAAK;AAAA,WAC9C;AAAA,SACF;AAAA,OACF,GACF;AAAA,IAED,iBACC,gBAAAA,KAAC,SAAI,WAAU,uEAAsE,SAAS,MAAM,iBAAiB,KAAK,GACxH,0BAAAD,MAAC,SAAI,WAAU,2DAA0D,SAAS,OAAK,EAAE,gBAAgB,GACvG;AAAA,sBAAAA,MAAC,QAAG,WAAU,4CAA2C;AAAA;AAAA,QAAQ,aAAa;AAAA,QAAK;AAAA,QAAE,aAAa,SAAS,IAAI,aAAa;AAAA,QAAY;AAAA,SAAC;AAAA,MACzI,gBAAAC,KAAC,OAAE,WAAU,wCAAuC,gGAAyE;AAAA,MAC7H,gBAAAD,MAAC,SAAI,WAAU,0BACb;AAAA,wBAAAC,KAAC,YAAO,SAAS,MAAM,iBAAiB,KAAK,GAAG,WAAU,wEAAuE,sBAAQ;AAAA,QACzI,gBAAAA,KAAC,YAAO,SAAS,kBAAkB,WAAU,yFAAwF,oBAAM;AAAA,SAC7I;AAAA,OACF,GACF;AAAA,IAED,WACC,gBAAAA,KAAC,SAAI,WAAU,uEAAsE,SAAS,MAAM,CAAC,QAAQ,QAAQ,WAAW,IAAI,GAClI,0BAAAD,MAAC,SAAI,WAAU,2DAA0D,SAAS,OAAK,EAAE,gBAAgB,GACvG;AAAA,sBAAAA,MAAC,SAAI,WAAU,0CACb;AAAA,wBAAAC,KAAC,QAAG,WAAU,6BAA4B,2BAAa;AAAA,QACvD,gBAAAA,KAAC,YAAO,SAAS,MAAM,WAAW,IAAI,GAAG,WAAU,4DAA2D,kBAAC;AAAA,SACjH;AAAA,MACC,QAAQ,SAAS,gBAAAA,KAAC,SAAI,WAAU,8CAA8C,kBAAQ,OAAM;AAAA,MAC7F,gBAAAA,KAAC,WAAM,WAAU,yCAAwC,mFAA4D;AAAA,MACrH,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,WAAS;AAAA,UACT,OAAO,QAAQ;AAAA,UACf,UAAU,OAAK,WAAW,QAAM,EAAE,GAAG,GAAG,OAAO,EAAE,OAAO,MAAM,EAAE;AAAA,UAChE,aAAY;AAAA,UACZ,WAAU;AAAA;AAAA,MACZ;AAAA,MACA,gBAAAA,KAAC,WAAM,WAAU,8CAA6C,0CAA4B;AAAA,MAC1F,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAM;AAAA,UACN,OAAO,QAAQ;AAAA,UACf,UAAU,OAAK,WAAW,QAAM,EAAE,GAAG,GAAG,MAAM,EAAE,OAAO,MAAM,EAAE;AAAA,UAC/D,aAAY;AAAA,UACZ,WAAU;AAAA;AAAA,MACZ;AAAA,MACA,gBAAAD,MAAC,SAAI,WAAU,+BACb;AAAA,wBAAAC,KAAC,YAAO,SAAS,MAAM,WAAW,IAAI,GAAG,UAAU,QAAQ,MAAM,WAAU,wEAAuE,sBAAQ;AAAA,QAC1J,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAAO,SAAS;AAAA,YAAe,UAAU,QAAQ,QAAQ,CAAC,QAAQ,MAAM,KAAK;AAAA,YAC5E,WAAU;AAAA,YACT,kBAAQ,OAAO,oBAAe;AAAA;AAAA,QACjC;AAAA,SACF;AAAA,OACF,GACF;AAAA,IAED,aACC,gBAAAA,KAAC,SAAI,WAAU,uEAAsE,SAAS,MAAM,aAAa,IAAI,GACnH,0BAAAD,MAAC,SAAI,WAAU,2DAA0D,SAAS,OAAK,EAAE,gBAAgB,GACvG;AAAA,sBAAAA,MAAC,SAAI,WAAU,0CACb;AAAA,wBAAAA,MAAC,QAAG,WAAU,8EAA8E;AAAA,YAAE;AAAA,UAAQ;AAAA,WAAmB;AAAA,QACzH,gBAAAC,KAAC,YAAO,SAAS,MAAM,aAAa,IAAI,GAAG,WAAU,4DAA2D,kBAAC;AAAA,SACnH;AAAA,MACC,UAAU,WACT,gBAAAA,KAAC,SAAI,WAAU,yDACb,0BAAAD,MAAC,SAAI,WAAU,wBAAuB,SAAQ,aAAY,MAAK,QAAO;AAAA,wBAAAC,KAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK,QAAO,gBAAe,aAAY,KAAI,SAAQ,QAAM;AAAA,QAAE,gBAAAA,KAAC,UAAK,GAAE,4BAA2B,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAO;AAAA,SAAE,GAC7P;AAAA,MAED,UAAU,SAAS,gBAAAA,KAAC,SAAI,WAAU,6BAA6B,oBAAU,OAAM;AAAA,MAC/E,UAAU,QAAQ,QAAQ,CAAC,UAAU,WACpC,gBAAAA,KAAC,SAAI,WAAU,6FAA6F,oBAAU,MAAK;AAAA,OAE/H,GACF;AAAA,KAEJ;AAEJ;AA6HA,SAAS,iBAAiB,EAAE,GAAG,QAAQ,SAAS,SAAS,GAAG;AAC1D,SACE,gBAAAC;AAAA,IAAC;AAAA;AAAA,MAAO;AAAA,MACN,WAAW,sEACT,SAAS,mCAAmC,sCAC9C;AAAA,MACA;AAAA,wBAAAC,KAAC,UAAO,MAAM,EAAE,MAAM,KAAK,EAAE,QAAQ,OAAO,EAAE,aAAa;AAAA,QAC3D,gBAAAD,MAAC,SAAI,WAAU,kBACb;AAAA,0BAAAA,MAAC,SAAI,WAAU,2CACb;AAAA,4BAAAA,MAAC,SAAI,WAAU,qCACb;AAAA,8BAAAC,KAAC,UAAK,WAAW,0BAA0B,EAAE,SAAS,kBAAkB,4BAA4B,IAAK,YAAE,MAAK;AAAA,cAC/G,EAAE,WAAW,gBAAAA,KAAC,UAAK,WAAU,kBAAkB,YAAE,MAAK;AAAA,eACzD;AAAA,YACA,gBAAAA,KAAC,UAAK,WAAW,wBAAwB,EAAE,SAAS,mCAAmC,gBAAgB,IAAK,YAAE,SAAQ;AAAA,aACxH;AAAA,UACA,gBAAAD,MAAC,SAAI,WAAU,kDACb;AAAA,4BAAAC,KAAC,OAAE,WAAW,0BAA0B,EAAE,SAAS,mBAAmB,gBAAgB,IAAI,EAAE,UAAU,KAAK,uBAAuB,IAC/H,YAAE,WAAW,iBAChB;AAAA,YACC,EAAE,SAAS,KACV,gBAAAA,KAAC,UAAK,WAAU,8IACb,YAAE,QACL;AAAA,aAEJ;AAAA,UACC,EAAE,UACD,gBAAAA,KAAC,SAAI,WAAU,oCACb,0BAAAA,KAAC,QAAK,MAAK,SAAS,YAAE,QAAO,GAC/B;AAAA,WAEJ;AAAA,QACC,YACC,gBAAAA,KAAC,UAAK,WAAU,wBAAuB,OAAO,mBAAgB,SAAS,IAAI,IACzE,0BAAAA,KAAC,UAAO,MAAM,SAAS,MAAM,KAAK,SAAS,QAAQ,MAAK,MAAK,GAC/D;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAGA,SAAS,uBAAuB;AAC9B,SACE,gBAAAD,MAAC,SAAI,WAAU,qCACb;AAAA,oBAAAC,KAAC,SAAI,WAAU,4DAA2D;AAAA,IAC1E,gBAAAD,MAAC,SAAI,WAAU,4BACb;AAAA,sBAAAC,KAAC,SAAI,WAAU,gDAA+C;AAAA,MAC9D,gBAAAA,KAAC,SAAI,WAAU,kDAAiD;AAAA,OAClE;AAAA,KACF;AAEJ;AAEA,SAAS,WAAW,EAAE,GAAG,iBAAiB,aAAa,cAAc,YAAY,QAAQ,YAAY,GAAG;AACtG,QAAM,CAAC,UAAU,WAAW,IAAIC,UAAS,KAAK;AAC9C,QAAM,UAAUC,QAAO,IAAI;AAC3B,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,SAAU;AACf,UAAM,QAAQ,OAAK;AAAE,UAAI,QAAQ,WAAW,CAAC,QAAQ,QAAQ,SAAS,EAAE,MAAM,EAAG,aAAY,KAAK;AAAA,IAAE;AACpG,aAAS,iBAAiB,aAAa,KAAK;AAC5C,WAAO,MAAM,SAAS,oBAAoB,aAAa,KAAK;AAAA,EAC9D,GAAG,CAAC,QAAQ,CAAC;AAEb,SACE,gBAAAJ,MAAC,YAAO,WAAU,gFAChB;AAAA,oBAAAC,KAAC,UAAO,MAAM,EAAE,MAAM,KAAK,EAAE,QAAQ,OAAO,EAAE,aAAa,MAAK,MAAK;AAAA,IAErE,gBAAAD,MAAC,SAAI,WAAU,kBACb;AAAA,sBAAAC,KAAC,SAAI,WAAU,mCACb,0BAAAA,KAAC,QAAG,WAAU,sCAAsC,YAAE,MAAK,GAC7D;AAAA,MACA,gBAAAA,KAAC,SAAI,WAAU,sDACZ,mBACC,gBAAAA,KAAC,UAAK,WAAU,gCAA+B,6BAAU,IACvD,EAAE,QACJ,gBAAAD,MAAC,UAAK,WAAU,0DAA0D;AAAA,UAAE;AAAA,QAAM;AAAA,QAAE,EAAE;AAAA,SAAM,IAC1F,MAKN;AAAA,OACF;AAAA,IAmBA,gBAAAA,MAAC,SAAI,WAAU,sCACZ;AAAA,qBACC,gBAAAC;AAAA,QAAC;AAAA;AAAA,UAAO,SAAS;AAAA,UAAa,OAAM;AAAA,UAClC,WAAU;AAAA,UAAuD,YAAE;AAAA;AAAA,MAAQ;AAAA,MAE/E,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAAO,SAAS;AAAA,UAAiB,OAAM;AAAA,UACtC,WAAW,oBAAoB,cAAc,4BAA4B,mCAAmC;AAAA,UAC3G,YAAE;AAAA;AAAA,MACL;AAAA,MACA,gBAAAD,MAAC,SAAI,KAAK,SAAS,WAAU,YAC3B;AAAA,wBAAAC;AAAA,UAAC;AAAA;AAAA,YAAO,SAAS,MAAM,YAAY,OAAK,CAAC,CAAC;AAAA,YAAG,OAAM;AAAA,YACjD,WAAW,oBAAoB,WAAW,gCAAgC,mCAAmC;AAAA,YAC5G,YAAE;AAAA;AAAA,QACL;AAAA,QACC,YACC,gBAAAD,MAAC,SAAI,WAAU,4HACb;AAAA,0BAAAC,KAAC,YAAS,MAAM,EAAE,SAAS,OAAM,cAAa,SAAS,MAAM;AAAE,wBAAY,KAAK;AAAG;AAAA,UAAe,GAAG;AAAA,UACrG,gBAAAA,KAAC,YAAS,MAAM,EAAE,QAAQ,OAAM,wBAAuB,SAAS,MAAM;AAAE,wBAAY,KAAK;AAAG;AAAA,UAAiB,GAAG;AAAA,WASlH;AAAA,SAEJ;AAAA,OACF;AAAA,KACF;AAEJ;AAEA,SAAS,SAAS,EAAE,MAAM,OAAO,SAAS,KAAK,GAAG;AAChD,QAAM,QAAQ,SAAS,WAAW,mCAAmC;AACrE,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MAAO;AAAA,MACN,WAAW,gDAAgD,KAAK;AAAA,MAChE;AAAA,wBAAAC,KAAC,UAAK,WAAW,SAAS,WAAW,kBAAkB,kBAAmB,gBAAK;AAAA,QAC/E,gBAAAA,KAAC,UAAK,WAAU,oBAAoB,iBAAM;AAAA;AAAA;AAAA,EAC5C;AAEJ;AAEA,SAAS,UAAU,EAAE,OAAO,UAAU,SAAS,cAAc,QAAQ,QAAQ,QAAQ,GAAG;AACtF,QAAM,WAAWE,QAAO,IAAI;AAC5B,EAAAC,WAAU,MAAM;AAvtClB;AAutCoB,mBAAS,YAAT,mBAAkB;AAAA,EAAQ,GAAG,CAAC,CAAC;AACjD,EAAAA,WAAU,MAAM;AACd,UAAM,QAAQ,OAAK;AACjB,UAAI,EAAE,QAAQ,SAAU,SAAQ;AAChC,UAAI,EAAE,QAAQ,SAAS;AAAE,UAAE,eAAe;AAAG,UAAE,WAAW,OAAO,IAAI,OAAO;AAAA,MAAE;AAAA,IAChF;AACA,WAAO,iBAAiB,WAAW,KAAK;AACxC,WAAO,MAAM,OAAO,oBAAoB,WAAW,KAAK;AAAA,EAC1D,GAAG,CAAC,SAAS,QAAQ,MAAM,CAAC;AAE5B,SACE,gBAAAJ,MAAC,SAAI,WAAU,wEACb;AAAA,oBAAAC,KAAC,UAAK,WAAU,2BAA2B,YAAE,QAAO;AAAA,IACpD,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU,OAAK,SAAS,EAAE,OAAO,KAAK;AAAA,QACtC,aAAY;AAAA,QACZ,WAAU;AAAA;AAAA,IACZ;AAAA,IACC,SACC,gBAAAA,KAAC,UAAK,WAAU,oDACb,kBAAQ,WAAW,IAAI,mBAAmB,GAAG,eAAe,CAAC,OAAO,QAAQ,MAAM,IACrF;AAAA,IAEF,gBAAAD,MAAC,SAAI,WAAU,sCACb;AAAA,sBAAAC;AAAA,QAAC;AAAA;AAAA,UAAO,SAAS;AAAA,UAAQ,UAAU,QAAQ,WAAW;AAAA,UACpD,OAAM;AAAA,UACN,WAAU;AAAA,UACT,YAAE;AAAA;AAAA,MACL;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAAO,SAAS;AAAA,UAAQ,UAAU,QAAQ,WAAW;AAAA,UACpD,OAAM;AAAA,UACN,WAAU;AAAA,UACT,YAAE;AAAA;AAAA,MACL;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAAO,SAAS;AAAA,UAAS,OAAM;AAAA,UAC9B,WAAU;AAAA,UACT,YAAE;AAAA;AAAA,MACL;AAAA,OACF;AAAA,KACF;AAEJ;AAEA,SAAS,cAAc,MAAM,OAAO,WAAW;AAC7C,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,IAAI,MAAM,KAAK;AACrB,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,QAAQ,KAAK,YAAY;AAC/B,QAAM,KAAK,EAAE,YAAY;AACzB,MAAI,CAAC,MAAM,SAAS,EAAE,EAAG,QAAO;AAChC,QAAM,QAAQ,CAAC;AACf,MAAI,OAAO;AACX,MAAI,MAAM,MAAM,QAAQ,EAAE;AAC1B,MAAI,MAAM;AACV,SAAO,QAAQ,IAAI;AACjB,QAAI,MAAM,KAAM,OAAM,KAAK,KAAK,MAAM,MAAM,GAAG,CAAC;AAChD,UAAM;AAAA,MACJ,gBAAAA,KAAC,UAAiB,WAAW,kBAAkB,YAAY,gCAAgC,8BAA8B,IACtH,eAAK,MAAM,KAAK,MAAM,GAAG,MAAM,KADvB,KAEX;AAAA,IACF;AACA,WAAO,MAAM,GAAG;AAChB,UAAM,MAAM,QAAQ,IAAI,IAAI;AAAA,EAC9B;AACA,MAAI,OAAO,KAAK,OAAQ,OAAM,KAAK,KAAK,MAAM,IAAI,CAAC;AACnD,SAAO;AACT;AAEA,SAAS,WAAW,EAAE,MAAM,GAAG;AAC7B,SACE,gBAAAA,KAAC,SAAI,WAAU,yCACb,0BAAAA,KAAC,UAAK,WAAU,kHAAkH,iBAAM,GAC1I;AAEJ;AAGA,SAAS,oBAAoB;AAC3B,SACE,gBAAAD,MAAC,SAAI,WAAU,iFACb;AAAA,oBAAAC,KAAC,SAAI,WAAU,4FACb,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAG,gBAAAA,KAAC,UAAK,GAAE,4LAA2L;AAAA,QACtM,WAAU;AAAA;AAAA,IACZ,GACF;AAAA,IACA,gBAAAA,KAAC,QAAG,WAAU,4CAA2C,qCAAuB;AAAA,IAChF,gBAAAA,KAAC,OAAE,WAAU,4DAA2D,wFAExE;AAAA,KACF;AAEJ;AAEA,SAAS,MAAM,EAAE,OAAO,GAAG;AAEzB,MAAI,WAAW,aAAa,CAAC,OAAQ,QACnC,gBAAAD,MAAC,SAAI,WAAU,6BAA4B,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,KAAI,eAAc,SAAQ,gBAAe,SACpJ;AAAA,oBAAAC,KAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI;AAAA,IAAE,gBAAAA,KAAC,UAAK,GAAE,oBAAmB;AAAA,KAC7D;AAEF,MAAI,WAAW,SAAU,QAAO,gBAAAA,KAAC,UAAK,WAAU,2BAA0B,OAAM,mBAAkB,eAAC;AAEnG,MAAI,WAAW,OAAQ,QAAO,gBAAAA,KAAC,UAAK,WAAU,uBAAsB,oBAAC;AACrE,MAAI,WAAW,YAAa,QAAO,gBAAAA,KAAC,UAAK,WAAU,uBAAsB,OAAO,EAAE,eAAe,UAAU,GAAG,0BAAE;AAChH,MAAI,WAAW,OAAQ,QAAO,gBAAAA,KAAC,UAAK,WAAU,gBAAe,OAAO,EAAE,eAAe,UAAU,GAAG,0BAAE;AACpG,SAAO;AACT;AAEA,SAAS,QAAQ,EAAE,GAAG,cAAc,IAAI,iBAAiB,OAAO,SAAS,YAAY,YAAY,UAAU,eAAe,eAAe,GAAG;AAC1I,MAAI,EAAE,SAAS,UAAU;AACvB,WACE,gBAAAA,KAAC,SAAI,WAAU,4BACb,0BAAAD,MAAC,UAAK,WAAU,sEAAsE;AAAA,QAAE;AAAA,MAAK;AAAA,MAAI,EAAE;AAAA,OAAK,GAC1G;AAAA,EAEJ;AACA,MAAI,EAAE,SAAS,QAAQ;AACrB,WACE,gBAAAC,KAAC,SAAI,WAAU,yBACb,0BAAAD,MAAC,SAAI,WAAW,uFAAuF,iBAAiB,2CAA2C,mBAAmB,IACpL;AAAA,sBAAAA,MAAC,SAAI,WAAU,gDACb;AAAA,wBAAAA,MAAC,UAAK,WAAU,4EAA4E;AAAA,YAAE;AAAA,UAAI;AAAA,UAAiB,EAAE;AAAA,WAAO;AAAA,QAC5H,gBAAAC,KAAC,UAAK,WAAU,+BAA+B,YAAE,MAAK;AAAA,SACxD;AAAA,MACA,gBAAAA,KAAC,OAAE,WAAU,iDAAiD,wBAAc,EAAE,MAAM,aAAa,cAAc,GAAE;AAAA,OACnH,GACF;AAAA,EAEJ;AAEA,QAAM,QAAQ,EAAE,SAAS;AACzB,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,iCAAiC,aAAa,gDAAgD,EAAE,IAAI,WAAW,kBAAkB,EAAE;AAAA,MAC9I,SAAS,aAAa,iBAAiB;AAAA,MAEtC;AAAA,sBACC,gBAAAC,KAAC,UAAK,WAAW,2EAA2E,WAAW,iDAAiD,2BAA2B,IAChL,sBAAY,gBAAAA,KAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAO,gBAAe,aAAY,OAAM,eAAc,SAAQ,gBAAe,SAAQ,0BAAAA,KAAC,cAAS,QAAO,kBAAgB,GAAE,GACnM;AAAA,QAEF,gBAAAD,MAAC,SAAI,WAAW,uBAAuB,QAAQ,gBAAgB,eAAe,iBAC5E;AAAA,0BAAAC,KAAC,SAAI,WAAU,eACf,0BAAAD,MAAC,SAAI,WAAW,kDACd,QACI,4CACA,+DACN,IAAI,iBAAiB,0BAA0B,EAAE,IAC9C;AAAA,aAAC,SAAS,WAAW,EAAE,UACtB,gBAAAC,KAAC,SAAI,WAAU,uDAAuD,YAAE,QAAO;AAAA,YAEhF,EAAE,SAAS,UAAU,gBAAAA,KAAC,OAAE,WAAU,qDAAqD,wBAAc,EAAE,MAAM,aAAa,cAAc,GAAE;AAAA,YAE1I,EAAE,SAAS,WACV,gBAAAD,MAAC,SAAI,WAAU,eACZ;AAAA,gBAAE,WACD,gBAAAC,KAAC,OAAE,MAAM,EAAE,UAAU,QAAO,UAAS,KAAI,cACvC,0BAAAA,KAAC,SAAI,KAAK,EAAE,UAAU,KAAK,EAAE,WAAW,UAAU,WAAU,yCAAwC,GACtG,IAEA,gBAAAA,KAAC,SAAI,WAAU,sHACZ,YAAE,OACL;AAAA,cAED,EAAE,WAAW,gBAAAA,KAAC,OAAE,WAAU,oBAAoB,wBAAc,EAAE,SAAS,aAAa,cAAc,GAAE;AAAA,eACvG;AAAA,YAGD,EAAE,SAAS,WACV,gBAAAD,MAAC,SAAI,WAAU,eACZ;AAAA,gBAAE,WACC,gBAAAC,KAAC,WAAM,KAAK,EAAE,UAAU,UAAQ,MAAC,WAAU,mBAAkB,IAC7D,gBAAAA,KAAC,SAAI,WAAU,qFAAoF,uBAAE;AAAA,cACxG,EAAE,WAAW,gBAAAA,KAAC,OAAE,WAAU,oBAAoB,wBAAc,EAAE,SAAS,aAAa,cAAc,GAAE;AAAA,eACvG;AAAA,YAGD,EAAE,SAAS,cACV,gBAAAD;AAAA,cAAC;AAAA;AAAA,gBAAE,MAAM,EAAE,YAAY;AAAA,gBAAK,QAAO;AAAA,gBAAS,KAAI;AAAA,gBAC9C,WAAW,kEAAkE,QAAQ,sBAAsB,cAAc;AAAA,gBACzH;AAAA,kCAAAC,KAAC,UAAK,WAAW,QAAQ,qBAAqB,kBAAmB,YAAE,MAAK;AAAA,kBACxE,gBAAAA,KAAC,UAAK,WAAU,+BAA+B,YAAE,YAAY,EAAE,WAAW,aAAY;AAAA;AAAA;AAAA,YACxF;AAAA,YAGD,EAAE,SAAS,YACV,EAAE;AAAA;AAAA,cAEA,gBAAAA,KAAC,WAAM,KAAK,EAAE,UAAU,UAAQ,MAAC,WAAU,mBAAkB;AAAA;AAAA;AAAA,cAG7D,gBAAAD,MAAC,SAAI,WAAW,yCAAyC,QAAQ,oBAAoB,gBAAgB,IACnG;AAAA,gCAAAC,KAAC,UAAK,WAAW,QAAQ,qBAAqB,kBAAmB,YAAE,KAAI;AAAA,gBACvE,gBAAAD,MAAC,UAAK,WAAU,eAAc;AAAA;AAAA,kBAAM,EAAE,UAAU,SAAM,EAAE,OAAO,KAAK;AAAA,mBAAG;AAAA,iBACzE;AAAA;AAAA,YAIJ,gBAAAA,MAAC,SAAI,WAAW,0DAA0D,QAAQ,qBAAqB,gBAAgB,IACpH;AAAA,gBAAE,UAAU,CAAC,UAAU,SAAS,gBAAAC,KAAC,UAAK,WAAU,QAAQ,YAAE,QAAO;AAAA,cAClE,gBAAAA,KAAC,UAAM,YAAE,MAAK;AAAA,cACb,SAAS,gBAAAA,KAAC,SAAM,QAAQ,EAAE,QAAQ;AAAA,eACrC;AAAA,aACF,GAWA;AAAA,UACC,CAAC,cAAc,cACd,gBAAAA;AAAA,YAAC;AAAA;AAAA,cAAO,SAAS,CAAC,MAAM;AAAE,kBAAE,gBAAgB;AAAG,8BAAc;AAAA,cAAE;AAAA,cAAG,OAAM;AAAA,cACtE,WAAU;AAAA,cACT,YAAE;AAAA;AAAA,UACL;AAAA,WAEJ;AAAA;AAAA;AAAA,EACF;AAEJ;AAgBA,SAAS,QAAQ,GAAG;AAClB,QAAM,IAAI,KAAK,MAAM,IAAI,EAAE;AAC3B,SAAO,GAAG,CAAC,IAAI,OAAO,IAAI,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC;AAChD;AAIA,SAAS,UAAU,EAAE,YAAY,GAAG;AAClC,QAAM,MAAM;AACZ,QAAM,CAAC,SAAS,UAAU,IAAII,UAAS,CAAC,CAAC;AACzC,EAAAC,WAAU,MAAM;AACd,QAAI;AACJ,QAAI,OAAO;AACX,UAAM,MAAM,CAAC;AACb,UAAM,OAAO,CAAC,OAAO;AACnB,YAAM,KAAK,2CAAa;AACxB,UAAI,MAAM,KAAK,OAAO,IAAI;AACxB,eAAO;AACP,cAAM,OAAO,IAAI,WAAW,GAAG,OAAO;AACtC,WAAG,sBAAsB,IAAI;AAC7B,YAAI,MAAM;AACV,iBAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,gBAAM,KAAK,KAAK,CAAC,IAAI,OAAO;AAC5B,iBAAO,IAAI;AAAA,QACb;AACA,cAAM,MAAM,KAAK,KAAK,MAAM,KAAK,MAAM;AACvC,YAAI,KAAK,KAAK,IAAI,GAAG,MAAM,GAAG,CAAC;AAC/B,YAAI,IAAI,SAAS,IAAK,KAAI,MAAM;AAChC,mBAAW,CAAC,GAAG,GAAG,CAAC;AAAA,MACrB;AACA,YAAM,sBAAsB,IAAI;AAAA,IAClC;AACA,UAAM,sBAAsB,IAAI;AAChC,WAAO,MAAM,qBAAqB,GAAG;AAAA,EACvC,GAAG,CAAC,WAAW,CAAC;AAChB,SACE,gBAAAC,KAAC,SAAI,WAAU,gFACZ,kBAAQ,IAAI,CAAC,GAAG,MACf,gBAAAA;AAAA,IAAC;AAAA;AAAA,MAAa,OAAO,EAAE,QAAQ,GAAG,KAAK,IAAI,GAAG,IAAI,EAAE,CAAC,KAAK;AAAA,MACxD,WAAU;AAAA;AAAA,IADD;AAAA,EAC6C,CACzD,GACH;AAEJ;AAEA,SAAS,WAAW,EAAE,SAAS,OAAO,GAAG;AACvC,QAAM,CAAC,MAAM,OAAO,IAAIF,UAAS,KAAK;AACtC,QAAM,MAAMG,QAAO,IAAI;AACvB,EAAAF,WAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,QAAQ,OAAK;AAAE,UAAI,IAAI,WAAW,CAAC,IAAI,QAAQ,SAAS,EAAE,MAAM,EAAG,SAAQ,KAAK;AAAA,IAAE;AACxF,aAAS,iBAAiB,aAAa,KAAK;AAC5C,WAAO,MAAM,SAAS,oBAAoB,aAAa,KAAK;AAAA,EAC9D,GAAG,CAAC,IAAI,CAAC;AAET,SACE,gBAAAG,MAAC,SAAI,KAAU,WAAU,YACvB;AAAA,oBAAAF;AAAA,MAAC;AAAA;AAAA,QAAO,SAAS,MAAM,QAAQ,OAAK,CAAC,CAAC;AAAA,QAAG,OAAM;AAAA,QAC7C,WAAW,qDAAqD,OAAO,gCAAgC,mCAAmC;AAAA,QACzI,YAAE;AAAA;AAAA,IACL;AAAA,IACC,QACC,gBAAAE,MAAC,SAAI,WAAU,8HACb;AAAA,sBAAAF,KAAC,YAAS,MAAM,EAAE,OAAO,OAAM,UAAS,SAAS,MAAM;AAAE,gBAAQ,KAAK;AAAG;AAAA,MAAY,GAAG;AAAA,MACxF,gBAAAA,KAAC,YAAS,MAAM,EAAE,MAAM,OAAM,aAAY,SAAS,MAAM;AAAE,gBAAQ,KAAK;AAAG;AAAA,MAAW,GAAG;AAAA,OAC3F;AAAA,KAEJ;AAEJ;AAGA,SAAS,aAAa,EAAE,GAAG,QAAQ,GAAG;AACpC,QAAM,CAAC,KAAK,MAAM,IAAIF,UAAS,SAAS;AACxC,SACE,gBAAAI,MAAC,WAAM,WAAU,8DACf;AAAA,oBAAAA,MAAC,YAAO,WAAU,yEAChB;AAAA,sBAAAF,KAAC,SAAI,WAAU,4BACZ;AAAA,QACC,CAAC,WAAW,UAAU;AAAA,QACtB,CAAC,SAAS,OAAO;AAAA,QACjB,CAAC,WAAW,cAAW;AAAA,MACzB,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MACV,gBAAAA;AAAA,QAAC;AAAA;AAAA,UAAe,SAAS,MAAM,OAAO,CAAC;AAAA,UACrC,WAAW,qCAAqC,QAAQ,IAAI,oCAAoC,wDAAwD;AAAA,UACvJ;AAAA;AAAA,QAFU;AAAA,MAGb,CACD,GACH;AAAA,MACA,gBAAAE,MAAC,SAAI,WAAU,2BACb;AAAA,wBAAAF,KAAC,YAAO,WAAU,sDAAsD,YAAE,UAAS;AAAA,QACnF,gBAAAA,KAAC,YAAO,SAAS,SAAS,WAAU,sDAAsD,YAAE,GAAE;AAAA,SAChG;AAAA,OACF;AAAA,IAEA,gBAAAE,MAAC,SAAI,WAAU,0BACZ;AAAA,cAAQ,aAAa,gBAAAF,KAAC,cAAW,GAAM;AAAA,MACvC,QAAQ,WAAW,gBAAAA,KAAC,YAAS;AAAA,MAC7B,QAAQ,aAAa,gBAAAA,KAAC,cAAW;AAAA,OACpC;AAAA,KACF;AAEJ;AAwKA,SAAS,WAAW,EAAE,EAAE,GAAG;AAMzB,SACE,gBAAAG,KAAA,YACE,0BAAAC,MAAC,SAAI,WAAU,yCACb;AAAA,oBAAAD,KAAC,UAAO,MAAM,EAAE,MAAM,KAAK,EAAE,QAAQ,OAAO,EAAE,aAAa,MAAK,MAAK;AAAA,IACrE,gBAAAC,MAAC,SAAI,WAAU,kBACb;AAAA,sBAAAD,KAAC,SAAI,WAAU,0BAA0B,YAAE,MAAK;AAAA,MAC/C,EAAE,SAAS,gBAAAA,KAAC,SAAI,WAAU,uCAAuC,YAAE,OAAM;AAAA,OAC5E;AAAA,KACF,GACF;AA2HJ;AAGA,SAAS,SAAS,EAAE,MAAM,OAAO,KAAK,GAAG;AACvC,SACE,gBAAAC,MAAC,SAAI,WAAU,gFACb;AAAA,oBAAAD,KAAC,SAAI,WAAU,4FAA4F,gBAAK;AAAA,IAChH,gBAAAA,KAAC,OAAE,WAAU,0CAA0C,iBAAM;AAAA,IAC5D,QAAQ,gBAAAA,KAAC,OAAE,WAAU,iDAAiD,gBAAK;AAAA,KAC9E;AAEJ;AAEA,SAAS,WAAW;AAElB,SAAO,gBAAAA,KAAC,YAAS,MAAM,EAAE,KAAK,OAAM,sBAAqB,MAAK,wGAAuF;AAyBvJ;AAEA,SAAS,aAAa;AAEpB,SAAO,gBAAAA,KAAC,YAAS,MAAM,EAAE,MAAM,OAAM,oBAAgB,MAAK,6DAAyD;AA2BrH;;;AQx4DQ,gBAAAE,YAAA;AAlBD,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAG;AACD,QAAM,SAAS,EAAE,SAAS,aAAa,UAAU,UAAU,aAAa,iBAAiB,WAAW,+BAAO,KAAK;AAEhH,QAAM,YAAY,CAAC,iBAAiB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AACvE,SACE,gBAAAA,KAAC,sBAAmB,QAClB,0BAAAA,KAAC,SAAI,WAAW,WAAW,OAAO,EAAE,QAAQ,QAAQ,OAAO,OAAO,GAChE,0BAAAA,KAAC,OAAI,QAAgB,OAAc,gBAAgC,GACrE,GACF;AAEJ;AAEA,IAAO,mBAAQ;","names":["useMemo","useRef","useState","useEffect","nowHHMM","conversations","nowHHMM","useEffect","useRef","useState","jsx","jsx","useEffect","useState","jsx","jsxs","jsx","jsxs","jsxs","jsx","useState","useRef","useEffect","_a","useMemo","text","jsxs","jsx","jsxs","jsx","useState","useRef","useEffect","useState","useEffect","jsx","useRef","jsxs","jsx","jsxs","jsx"]}
|