@fayz-ai/admin 0.67.2 → 0.67.4
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/{ConnectedUserProfile-2PP755RY.js → ConnectedUserProfile-HL6Q6ECE.js} +3 -3
- package/dist/{ConnectedUserProfile-2PP755RY.js.map → ConnectedUserProfile-HL6Q6ECE.js.map} +1 -1
- package/dist/{TeamTab-M5SAKV6M.js → TeamTab-EIP4QLIV.js} +4 -4
- package/dist/{TeamTab-M5SAKV6M.js.map → TeamTab-EIP4QLIV.js.map} +1 -1
- package/dist/{chunk-RLZCH4NU.js → chunk-F54JFP54.js} +56 -19
- package/dist/chunk-F54JFP54.js.map +1 -0
- package/dist/{chunk-AIDRTAXD.js → chunk-LO26TZS3.js} +3 -3
- package/dist/{chunk-AIDRTAXD.js.map → chunk-LO26TZS3.js.map} +1 -1
- package/dist/crud/RelatedSection.d.ts.map +1 -1
- package/dist/crud/price-table-lookup.d.ts +50 -0
- package/dist/crud/price-table-lookup.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +100 -7
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/dist/chunk-RLZCH4NU.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/units/MemberAccessRailPage.tsx","../src/units/UnitSwitcher.tsx","../src/units/UnitDetailTabs.tsx","../src/units/UnitSuggestField.tsx","../src/components/settings/LocationsCrudPage.ts","../src/units/UnitsSettingsPage.tsx","../src/units/UnitRailPage.tsx","../src/units/MemberUnitsCell.tsx","../src/units/geo.ts","../src/units/UnitSwitching.tsx","../src/units/UnitSwitchingHost.tsx","../src/units/picker.store.ts","../src/units/UnitPickerDialog.tsx","../src/units/UnitMenuSection.tsx","../src/impersonation/session.ts"],"names":["React2","jsx","Building2","jsxs","Button","Fragment","React","Input","getSupabaseClientOptional","maskCpfCnpj","create","Badge","React4","useDataVersion","AlertTriangle","React5","Layers","React6","React7","DropdownItem","DropdownSeparator","DropdownLabel","ChevronsUpDown","cn","Check"],"mappings":"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","file":"chunk-AIDRTAXD.js","sourcesContent":["import * as React from 'react'\nimport { useDataVersion } from '@fayz-ai/core'\nimport { create } from 'zustand'\nimport {\n Button, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, Badge,\n} from '@fayz-ai/ui'\nimport { AlertTriangle, Building2, Plus, X } from 'lucide-react'\nimport { usePermissionsStore } from '../permissions'\nimport { toast } from '../components/notifications/ToastProvider'\nimport { RightRailPage } from '../components/RightRailPage'\nimport { useUnitStore } from './store'\nimport { bindUserToUnit, fetchMemberUnits, unbindUserFromUnit, type UnitBinding, UNIT_ACCESS_CHANGED } from './data'\n\n// ---------------------------------------------------------------------------\n// \"Acesso por unidade\" — em quais unidades a pessoa trabalha, e o que ela pode\n// fazer a mais em cada uma.\n//\n// Na COLUNA da direita, e não numa gaveta própria. Era uma gaveta deslizando da\n// mesma borda que o assistente já ocupa, com largura, cabeçalho e botão de\n// fechar próprios — dois painéis com dois vocabulários disputando um lado da\n// tela. E é uma consulta, não um destino: quem abre isso quer ver as unidades\n// de alguém SEM perder de vista a lista de equipe que estava lendo.\n//\n// A frase do rodapé é o modelo inteiro, escrita por extenso em vez de\n// subentendida: função por unidade SOMA à da organização e nunca tira nada.\n// Quem já configurou Salesforce ou SAP espera poder subtrair aqui, e descobrir\n// por acidente que não dá é pior do que ser avisado.\n// ---------------------------------------------------------------------------\n\nconst NO_EXTRA_ROLE = '__none__'\n\ninterface MemberAccessPanelState {\n member: { userId: string; name: string; email?: string } | null\n openMember: (member: { userId: string; name: string; email?: string }) => void\n close: () => void\n}\n\n/** Uma pessoa aberta ao lado da lista, do mesmo jeito que uma unidade. */\nexport const useMemberAccessPanel = create<MemberAccessPanelState>((set) => ({\n member: null,\n openMember: (member) => set({ member }),\n close: () => set({ member: null }),\n}))\n\nexport function MemberAccessRailPage() {\n const member = useMemberAccessPanel((s) => s.member)\n const close = useMemberAccessPanel((s) => s.close)\n if (!member) return null\n return (\n <MemberAccessBody\n key={member.userId}\n userId={member.userId}\n displayName={member.name}\n email={member.email}\n onClose={close}\n />\n )\n}\n\nfunction MemberAccessBody({\n userId,\n displayName,\n email,\n onClose,\n}: {\n userId: string\n displayName: string\n email?: string\n onClose: () => void\n}) {\n const units = useUnitStore((s) => s.units)\n const byId = useUnitStore((s) => s.byId)\n const profiles = usePermissionsStore((s) => s.profiles)\n\n const [bindings, setBindings] = React.useState<UnitBinding[]>([])\n const [loading, setLoading] = React.useState(false)\n const [adding, setAdding] = React.useState(false)\n\n const branches = React.useMemo(() => units.filter((u) => u.isActive !== false), [units])\n const unbound = React.useMemo(\n () => branches.filter((u) => !bindings.some((b) => b.locationId === u.id)),\n [branches, bindings],\n )\n\n const reload = React.useCallback(async () => {\n if (!userId) return\n setLoading(true)\n try {\n setBindings(await fetchMemberUnits(userId))\n } finally {\n setLoading(false)\n }\n }, [userId])\n\n // Sem `open` na dependência: o painel só existe quando há alguém aberto, e a\n // `key` no id remonta ao trocar de pessoa. Uma pessoa por montagem, e nenhum\n // estado da anterior sobrevivendo à troca.\n // Inclui o sinal: o vínculo também muda pela aba Unidades da ficha e pela\n // lista de membros da unidade, e este painel fica aberto durante isso.\n const version = useDataVersion(UNIT_ACCESS_CHANGED)\n React.useEffect(() => { void reload() }, [reload, version])\n\n async function add(unitId: string) {\n try {\n await bindUserToUnit(unitId, userId, null)\n await reload()\n setAdding(false)\n } catch (err: any) {\n toast.error('Não deu para dar o acesso', { description: err?.message })\n }\n }\n\n async function setRole(unitId: string, role: string) {\n try {\n await bindUserToUnit(unitId, userId, role === NO_EXTRA_ROLE ? null : role)\n await reload()\n } catch (err: any) {\n toast.error('Não deu para mudar a função', { description: err?.message })\n }\n }\n\n async function remove(unitId: string) {\n try {\n await unbindUserFromUnit(unitId, userId)\n await reload()\n } catch (err: any) {\n toast.error('Não deu para tirar o acesso', { description: err?.message })\n }\n }\n\n return (\n <RightRailPage title={displayName} open onClose={onClose} width=\"max-w-md\">\n <div className=\"min-h-0 flex-1 space-y-4 overflow-y-auto p-4\">\n {email && <p className=\"text-xs text-muted-foreground\">{email}</p>}\n {!loading && bindings.length === 0 && (\n <div className=\"flex gap-3 rounded-lg border border-amber-400/40 bg-amber-400/10 p-3 text-sm\">\n <AlertTriangle className=\"mt-0.5 h-4 w-4 shrink-0 text-amber-600 dark:text-amber-400\" />\n <div className=\"space-y-2\">\n <p>Sem unidade — não vê agendamentos, pedidos nem caixa de nenhuma unidade.</p>\n {branches.find((u) => u.isHeadquarters) && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => void add(branches.find((u) => u.isHeadquarters)!.id)}\n >\n Dar acesso à matriz\n </Button>\n )}\n </div>\n </div>\n )}\n\n <div className=\"space-y-2\">\n {bindings.map((b) => {\n const unit = byId[b.locationId]\n return (\n <div key={b.locationId} className=\"flex items-center gap-2 rounded-lg border border-border p-2\">\n <Building2 className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm\">{unit?.name ?? b.locationId}</div>\n {unit?.kind === 'region' && (\n <Badge variant=\"secondary\" className=\"mt-0.5 text-[10px]\">região — alcança as unidades abaixo</Badge>\n )}\n </div>\n <Select value={b.role ?? NO_EXTRA_ROLE} onValueChange={(v: string) => void setRole(b.locationId, v)}>\n <SelectTrigger className=\"h-8 w-36 text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={NO_EXTRA_ROLE}>sem função extra</SelectItem>\n {profiles.map((p) => (\n <SelectItem key={p.id} value={p.id}>{p.name}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button size=\"icon\" variant=\"ghost\" onClick={() => void remove(b.locationId)} aria-label=\"Remover\">\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n )\n })}\n </div>\n\n {adding ? (\n <Select onValueChange={(v: string) => void add(v)}>\n <SelectTrigger className=\"h-9\">\n <SelectValue placeholder=\"Escolha a unidade ou região\" />\n </SelectTrigger>\n <SelectContent>\n {unbound.map((u) => (\n <SelectItem key={u.id} value={u.id}>\n {u.name}{u.kind === 'region' ? ' (região)' : ''}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : (\n <Button size=\"sm\" variant=\"outline\" onClick={() => setAdding(true)} disabled={unbound.length === 0}>\n <Plus className=\"mr-1.5 h-3.5 w-3.5\" />\n Adicionar unidade\n </Button>\n )}\n </div>\n\n {/* Fixo no rodapé da coluna: é a regra que a pessoa precisa ter na frente\n enquanto mexe, não depois de rolar até o fim. */}\n {/* pr-12: o botão do assistente flutua neste canto e cobria o fim da\n frase. Folga local em vez de mexer na posição do FAB, que é da casca. */}\n <div className=\"border-t border-border p-4 pr-12\">\n <p className=\"text-xs text-muted-foreground\">\n As funções por unidade <strong>somam</strong> à função da organização; nunca removem.\n Vincular alguém a uma região dá acesso a todas as unidades dentro dela.\n </p>\n </div>\n </RightRailPage>\n )\n}\n","import * as React from 'react'\nimport {\n Button, Dropdown, DropdownTrigger, DropdownContent, DropdownItem, DropdownLabel, DropdownSeparator,\n Skeleton, cn,\n Input,\n} from '@fayz-ai/ui'\nimport { Building2, Check, ChevronsUpDown, Layers, Search } from 'lucide-react'\nimport { useUnitStore, type UnitNode } from './store'\nimport { useUnitBootstrap } from './useUnitBootstrap'\nimport { useUnitSwitchingStore } from './switching.store'\nimport { useTranslation } from '../hooks/useTranslation'\n\n// ---------------------------------------------------------------------------\n// The unit line, under the workspace line.\n//\n// Not inside the workspace menu, and that is the whole design decision: the\n// unit changes what every number on screen means, and for a franchise reading\n// the wrong unit's till is the single most expensive mistake available. A\n// person must never have to click to find out where they are standing.\n//\n// It renders NOTHING when the tenant does not work with units, so the cost to\n// everyone else is zero pixels.\n// ---------------------------------------------------------------------------\n\nfunction label(t: (k: string) => string, key: string, fallback: string): string {\n const v = t(key)\n return !v || v === key ? fallback : v\n}\n\nfunction initials(name: string): string {\n const parts = name.trim().split(/\\s+/)\n return ((parts[0]?.[0] ?? '') + (parts[1]?.[0] ?? '')).toUpperCase() || name.slice(0, 2).toUpperCase()\n}\n\nexport function UnitSwitcher({ collapsed = false, className }: {\n collapsed?: boolean\n /**\n * Restyles the TRIGGER for a surface that is not the rail.\n *\n * The defaults below are written in `sidebar-*` tokens, which are the right\n * ink in the only place this used to be meant for. The POS band paints from\n * its own `--pos-*` palette, so a host mounting this there hands over the\n * classes instead of inheriting colours that resolve to nothing.\n */\n className?: string\n}) {\n // Asked for here rather than from an app-root initializer: the surface that\n // needs the tree is the one that should load it, and the store dedupes.\n useUnitBootstrap()\n const { t } = useTranslation()\n const unitMode = useUnitStore((s) => s.unitMode)\n const loading = useUnitStore((s) => s.loading)\n const units = useUnitStore((s) => s.units)\n const tree = useUnitStore((s) => s.tree)\n const byId = useUnitStore((s) => s.byId)\n const myUnitIds = useUnitStore((s) => s.myUnitIds)\n const activeUnitId = useUnitStore((s) => s.activeUnitId)\n // A troca passa pela transição, não por `setActive` direto: mudar de unidade\n // termina num reload (ver switching.store), e sem cobertura isso lê como\n // travamento. `begin` grava o pino ANTES de levantar a cobertura.\n const beginSwitch = useUnitSwitchingStore((s) => s.begin)\n\n // Uma rede de franquia tem dezenas de unidades — o Espaço Facial tem 65.\n // Rolar uma lista dessas para achar \"Copacabana\" não é escolher, é procurar.\n const [query, setQuery] = React.useState('')\n\n const singular = label(t, 'unit.singular', 'unidade')\n const plural = label(t, 'unit.plural', 'unidades')\n\n if (!unitMode) return null\n\n if (loading) {\n // Same height as the resolved row, so the sidebar does not jump.\n return collapsed\n ? <Skeleton className=\"mx-auto h-5 w-5 rounded bg-sidebar-accent\" />\n : <Skeleton className=\"h-5 w-28 rounded-button bg-sidebar-accent\" />\n }\n\n const reachable = myUnitIds.length > 0 ? myUnitIds : units.filter((u) => u.kind !== 'region').map((u) => u.id)\n const current = activeUnitId ? byId[activeUnitId] : undefined\n const allLabel = `${label(t, 'units.all', 'Todas as')} ${plural}`\n const currentLabel = current?.name ?? allLabel\n\n // A busca aparece quando a lista deixa de caber na cabeça de alguém. Abaixo\n // disso ela é um campo a mais entre a pessoa e o clique que ela já sabia dar.\n const searchable = reachable.length > 8\n const term = query.trim().toLowerCase()\n const matches = term\n ? units.filter((u) => u.kind !== 'region' && reachable.includes(u.id) && u.name.toLowerCase().includes(term))\n : []\n\n if (reachable.length === 0) return null\n\n // One unit is not a choice. A dropdown holding a single item is a control that\n // lies about what it can do.\n if (reachable.length === 1) {\n const only = byId[reachable[0]!]\n if (!only) return null\n return collapsed ? (\n <div className=\"flex justify-center py-0.5\" title={only.name}>\n <Building2 className=\"h-3.5 w-3.5 text-sidebar-muted\" />\n </div>\n ) : (\n <div className=\"flex items-center gap-1.5 px-1.5 py-0.5\" title={only.name}>\n <Building2 className=\"h-3.5 w-3.5 shrink-0 text-sidebar-muted\" />\n <span className=\"min-w-0 truncate text-xs text-sidebar-muted\">{only.name}</span>\n </div>\n )\n }\n\n const renderNode = (node: UnitNode, depth: number): React.ReactNode => {\n // A region groups; it is not somewhere you can stand. Selecting one would\n // mean sending its children as a filter from the browser, which is exactly\n // the shape this whole feature exists to avoid.\n if (node.kind === 'region') {\n return (\n <React.Fragment key={node.id}>\n <DropdownLabel className=\"px-2 pt-2 text-[10px] uppercase tracking-wide text-muted-foreground\">\n {node.name}\n </DropdownLabel>\n {node.children.map((child) => renderNode(child, depth + 1))}\n </React.Fragment>\n )\n }\n if (!reachable.includes(node.id)) return null\n return (\n <React.Fragment key={node.id}>\n <DropdownItem\n onSelect={() => beginSwitch({ unitId: node.id, unitName: node.name })}\n className={cn('flex items-center gap-2', depth > 0 && 'pl-6')}\n >\n <Building2 className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate\">{node.name}</span>\n {node.isHeadquarters && (\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">{label(t, 'units.hq', 'matriz')}</span>\n )}\n {activeUnitId === node.id && <Check className=\"h-3.5 w-3.5 shrink-0\" />}\n </DropdownItem>\n {node.children.map((child) => renderNode(child, depth + 1))}\n </React.Fragment>\n )\n }\n\n return (\n <Dropdown>\n <DropdownTrigger asChild>\n <Button\n variant=\"bare\"\n size=\"bare\"\n className={cn(\n 'group flex items-center rounded-lg text-left transition-colors hover:bg-sidebar-accent/60 justify-start whitespace-normal text-[length:inherit] font-normal',\n collapsed ? 'justify-center p-1' : 'w-full gap-1.5 px-1.5 py-0.5',\n className,\n )}\n title={currentLabel}\n aria-label={`${singular}: ${currentLabel}`}\n >\n {collapsed ? (\n <span className=\"text-[10px] font-semibold text-sidebar-muted\">\n {current ? initials(current.name) : '••'}\n </span>\n ) : (\n <>\n <Building2 className=\"h-3.5 w-3.5 shrink-0 text-sidebar-muted\" />\n <span className=\"min-w-0 flex-1 truncate text-xs text-sidebar-muted\">{currentLabel}</span>\n <ChevronsUpDown className=\"h-3 w-3 shrink-0 text-sidebar-muted transition-colors group-hover:text-sidebar-foreground\" />\n </>\n )}\n </Button>\n </DropdownTrigger>\n <DropdownContent align=\"start\" className=\"w-64\">\n <DropdownItem\n onSelect={() => beginSwitch({ unitId: undefined, unitName: allLabel })}\n className=\"flex items-center gap-2\"\n >\n <Layers className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate\">{allLabel}</span>\n {!activeUnitId && <Check className=\"h-3.5 w-3.5 shrink-0\" />}\n </DropdownItem>\n <DropdownSeparator />\n {searchable && (\n <div className=\"relative px-2 py-1.5\">\n <Search className=\"pointer-events-none absolute left-4 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\" />\n <Input\n type=\"search\"\n autoFocus\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n // O menu fecha na tecla; sem isto não dá para digitar dentro dele.\n onKeyDown={(e) => e.stopPropagation()}\n placeholder={label(t, 'units.search', 'Buscar unidade')}\n className=\"h-auto rounded-md border-border bg-background py-1 pl-7 pr-2 text-xs shadow-none focus:border-primary focus-visible:ring-0 focus-visible:ring-offset-0\"\n />\n </div>\n )}\n {/* Buscando, a ÁRVORE SAI DO CAMINHO: uma lista achatada dos que casam\n responde \"onde está a Copacabana\", que é a pergunta. Sem busca, a\n hierarquia volta, porque aí ela é o que dá sentido à ordem. */}\n <div className={cn(searchable && 'max-h-72 overflow-y-auto')}>\n {term\n ? (matches.length > 0\n ? matches.map((u) => (\n <DropdownItem\n key={u.id}\n onSelect={() => beginSwitch({ unitId: u.id, unitName: u.name })}\n className=\"flex items-center gap-2\"\n >\n <Building2 className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate\">{u.name}</span>\n {activeUnitId === u.id && <Check className=\"h-3.5 w-3.5 shrink-0\" />}\n </DropdownItem>\n ))\n : (\n <p className=\"px-3 py-2 text-xs text-muted-foreground\">\n {label(t, 'units.searchEmpty', 'Nenhuma unidade com esse nome')}\n </p>\n ))\n : tree.map((node) => renderNode(node, 0))}\n </div>\n </DropdownContent>\n </Dropdown>\n )\n}\n","import React from 'react'\nimport type { DetailTab } from '@fayz-ai/core'\nimport { usePluginRuntimeOptional, getWidgetsForZone } from '@fayz-ai/core'\n\n/**\n * The tabs of the V1 company form that belong to OTHER modules: rooms (registry),\n * stock locations (inventory), the turn queue (agenda), the A1 certificate and\n * fiscal issuing (fiscal-br). The unit screen only names the slot; the plugin\n * that owns the data contributes the widget. Without the plugin the tab does\n * not exist, instead of existing empty.\n */\nexport const UNIT_DETAIL_ZONES = {\n rooms: 'unit.detail.rooms',\n stockLocations: 'unit.detail.stock-locations',\n turnQueue: 'unit.detail.turn-queue',\n certificate: 'unit.detail.certificate',\n fiscal: 'unit.detail.fiscal',\n} as const\n\nfunction zoneTab(zone: string) {\n return function UnitZoneTab({ item }: { item?: any }) {\n const runtime = usePluginRuntimeOptional()\n const widgets = runtime ? getWidgetsForZone(runtime, zone) : []\n if (!widgets.length || !item?.id) return null\n return (\n <div className=\"space-y-4\">\n {widgets.map((w) => {\n const Widget = w.component as React.ComponentType<any>\n return <Widget key={w.id} item={item} config={w.config} runtime={runtime?.context} plugin={w.plugin} widget={w} />\n })}\n </div>\n )\n }\n}\n\n/**\n * Rooms and stock locations are two tables (`public.rooms`, owned by registry;\n * `plg_inventory_stock_locations`, owned by inventory) answering two questions\n * — where people are attended, where goods are kept — so they share a tab but\n * not a list: one section each, with a line saying what it is for.\n */\nconst LOCATION_SECTIONS = [\n {\n zone: UNIT_DETAIL_ZONES.rooms,\n title: 'Locais operacionais',\n description: 'Salas, cadeiras e boxes onde se atende. A lotação limita quantas pessoas a agenda marca no mesmo horário.',\n },\n {\n zone: UNIT_DETAIL_ZONES.stockLocations,\n title: 'Locais de estoque',\n description: 'Onde os produtos ficam guardados nesta unidade. Entradas, saídas e contagens dizem de qual local.',\n },\n]\n\nfunction UnitLocationsTab({ item }: { item?: any }) {\n const runtime = usePluginRuntimeOptional()\n if (!item?.id || !runtime) return null\n const sections = LOCATION_SECTIONS\n .map((s) => ({ ...s, widgets: getWidgetsForZone(runtime, s.zone) }))\n .filter((s) => s.widgets.length > 0)\n return (\n <div className=\"space-y-8\">\n {sections.map((s) => (\n <section key={s.zone} className=\"space-y-3\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">{s.title}</h3>\n <p className=\"text-xs text-muted-foreground\">{s.description}</p>\n </div>\n {s.widgets.map((w) => {\n const Widget = w.component as React.ComponentType<any>\n return <Widget key={w.id} item={item} config={w.config} runtime={runtime.context} plugin={w.plugin} widget={w} />\n })}\n </section>\n ))}\n </div>\n )\n}\n\nexport const UNIT_DETAIL_TABS: DetailTab[] = [\n {\n id: 'locations', label: 'Locais', icon: 'MapPin', component: UnitLocationsTab,\n aliases: ['rooms', 'stock-locations'],\n // Keyed on rooms: registry is universal, so the tab exists wherever there are units.\n requiresWidgetZone: UNIT_DETAIL_ZONES.rooms,\n },\n { id: 'turn-queue', label: 'Lista da vez', icon: 'ListOrdered', component: zoneTab(UNIT_DETAIL_ZONES.turnQueue), requiresWidgetZone: UNIT_DETAIL_ZONES.turnQueue },\n // The archetype placeholders (\"coming soon\") answer nothing the V1 asked here.\n { id: 'schedule', label: 'Hours', hidden: true },\n { id: 'stats', label: 'Statistics', hidden: true },\n { id: 'activity', label: 'Activity', hidden: true },\n]\n","import React from 'react'\nimport { Input, SearchSelect, type SearchSelectOption } from '@fayz-ai/ui'\nimport { getSupabaseClientOptional, maskCpfCnpj } from '@fayz-ai/core'\nimport type { FieldDef } from '@fayz-ai/core'\n\n/**\n * Free text with the values other units already use as suggestions — the V1\n * \"Selecione ou digite\" of Tipo de loja and Categoria de loja. A `select` would\n * freeze a vocabulary nobody declared; plain text would let \"Shopping\" and\n * \"shopping \" become two categories in the network report.\n */\nfunction SuggestInput({ column, value, onChange, placeholder }: {\n column: string\n value: string\n onChange: (next: string | null) => void\n placeholder?: string\n}) {\n const search = React.useCallback(async (query: string): Promise<SearchSelectOption[]> => {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return []\n const { data } = await supabase.from('v_units').select(column).not(column, 'is', null).limit(500)\n const seen = new Map<string, string>()\n for (const row of (data ?? []) as Record<string, string>[]) {\n const v = String(row[column] ?? '').trim()\n if (v && !seen.has(v.toLowerCase())) seen.set(v.toLowerCase(), v)\n }\n const q = query.trim().toLowerCase()\n return [...seen.values()]\n .filter((v) => !q || v.toLowerCase().includes(q))\n .sort((a, b) => a.localeCompare(b, 'pt-BR'))\n .map((v) => ({ id: v, label: v }))\n }, [column])\n\n return (\n <SearchSelect\n value={value || undefined}\n displayValue={value || undefined}\n onChange={(id) => onChange(id || null)}\n onSearch={search}\n minChars={0}\n placeholder={placeholder ?? 'Selecione ou digite'}\n noResultsLabel=\"Nenhum valor usado ainda\"\n searchingLabel=\"Buscando…\"\n clearLabel=\"Limpar\"\n allowCreate\n createLabel=\"Usar\"\n onCreate={(query) => onChange(query.trim() || null)}\n />\n )\n}\n\nexport function suggestedTextField(field: Omit<FieldDef, 'type' | 'renderInput'> & { column: string }): FieldDef {\n const { column, ...rest } = field\n return {\n ...rest,\n type: 'custom',\n renderInput: ({ value, onChange }) => (\n <SuggestInput column={column} value={(value as string) ?? ''} onChange={onChange} placeholder={rest.placeholder} />\n ),\n }\n}\n\n/** CNPJ typed with the mask, stored as digits (the v_units trigger strips the rest). */\nexport function cnpjField(field: Omit<FieldDef, 'type' | 'renderInput'>): FieldDef {\n return {\n ...field,\n type: 'custom',\n renderInput: ({ value, onChange }) => (\n <Input\n inputMode=\"numeric\"\n value={maskCpfCnpj(String(value ?? ''))}\n placeholder={field.placeholder ?? '00.000.000/0000-00'}\n onChange={(e) => onChange(e.target.value.replace(/\\D/g, '').slice(0, 14) || null)}\n />\n ),\n }\n}\n","import { createCrudPage } from '../../crud/createCrudPage'\n// Core's EntityDef (the type createCrudPage consumes) carries `limitKey` for\n// plan quantity gating; the shell alias does not.\nimport type { EntityDef } from '@fayz-ai/core'\nimport { RECORD_GROUP, recordRailFields, activeFacet, getSupabaseClientOptional, maskCpfCnpj } from '@fayz-ai/core'\nimport { UNIT_DETAIL_TABS, UNIT_DETAIL_ZONES } from '../../units/UnitDetailTabs'\nimport { suggestedTextField, cnpjField } from '../../units/UnitSuggestField'\n\n// V1 lib/timezones.ts — the official Brazilian zones, no DST since 2019.\nconst BR_TIMEZONES = [\n { value: 'America/Noronha', label: 'UTC−2 · Fernando de Noronha' },\n { value: 'America/Sao_Paulo', label: 'UTC−3 · Brasília (SP, RJ, MG, ES, PR, SC, RS, GO, DF)' },\n { value: 'America/Bahia', label: 'UTC−3 · Bahia' },\n { value: 'America/Fortaleza', label: 'UTC−3 · Fortaleza (CE, MA, PI, RN, PB)' },\n { value: 'America/Recife', label: 'UTC−3 · Recife (PE)' },\n { value: 'America/Maceio', label: 'UTC−3 · Maceió (AL, SE)' },\n { value: 'America/Belem', label: 'UTC−3 · Belém (PA, AP)' },\n { value: 'America/Araguaina', label: 'UTC−3 · Araguaína (TO)' },\n { value: 'America/Cuiaba', label: 'UTC−4 · Cuiabá (MT)' },\n { value: 'America/Campo_Grande', label: 'UTC−4 · Campo Grande (MS)' },\n { value: 'America/Manaus', label: 'UTC−4 · Manaus (AM)' },\n { value: 'America/Porto_Velho', label: 'UTC−4 · Porto Velho (RO)' },\n { value: 'America/Boa_Vista', label: 'UTC−4 · Boa Vista (RR)' },\n { value: 'America/Rio_Branco', label: 'UTC−5 · Rio Branco (AC)' },\n { value: 'America/Eirunepe', label: 'UTC−5 · Oeste do Amazonas (Eirunepé)' },\n]\n\nconst LOGO_BUCKET = 'avatars'\n\nasync function uploadUnitLogo(file: File, row: Record<string, any>): Promise<string> {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('O armazenamento não está configurado.')\n const ext = (file.name.split('.').pop() ?? 'png').toLowerCase().replace(/[^a-z0-9]/g, '') || 'png'\n // A fresh name each time: a stable one is overwritten while the old URL is still cached on screen.\n const path = `units/${row.id}/logo-${Date.now()}.${ext}`\n const { error } = await supabase.storage.from(LOGO_BUCKET).upload(path, file, { upsert: true })\n if (error) throw error\n const url = supabase.storage.from(LOGO_BUCKET).getPublicUrl(path).data.publicUrl as string\n const { error: saveError } = await supabase.from('v_units').update({ logo_url: url }).eq('id', row.id)\n if (saveError) throw saveError\n return url\n}\n\nasync function removeUnitLogo(row: Record<string, any>): Promise<void> {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return\n const { error } = await supabase.from('v_units').update({ logo_url: null }).eq('id', row.id)\n if (error) throw error\n}\n\nexport const locationEntityDef: EntityDef = {\n // V1 calls the screen \"Empresas\" (Configurações → Empresa): each row is a\n // company — HQ or branch — and becomes a unit everywhere else.\n name: 'Empresa',\n namePlural: 'Empresas',\n icon: 'Building2',\n layout: 'location',\n displayField: 'name',\n subtitleField: 'city',\n defaultSort: 'name',\n // Plan quantity cap — the generic CRUD (CrudFormPage/CrudPage/CrudListView)\n // guards create/import and dims \"+ Add\" at the cap. Core declares 'locations'.\n limitKey: 'locations',\n formColumns: 2,\n facets: [activeFacet({ active: 'Ativas', inactive: 'Inativas', all: 'Todas' })],\n image: {\n get: (row) => row.logoUrl ?? undefined,\n upload: uploadUnitLogo,\n remove: removeUnitLogo,\n accept: 'image/png,image/jpeg,image/webp,image/svg+xml',\n },\n // The V1 company form (Configurações → Empresa), block by block. The tabs that\n // belong to other modules — rooms, stock locations, turn queue, certificate,\n // fiscal issuing — are detail tabs, contributed by the plugin that owns them.\n fieldGroups: [\n { id: 'identity', label: 'Identificação', columns: 3, imageSlot: true },\n { id: 'where', label: 'Endereço', columns: 1 },\n { id: 'network', label: 'Classificação na rede', description: 'Alimenta os filtros dos relatórios de rede. Escolha um valor já usado ou digite um novo.', columns: 3 },\n { id: 'contacts', label: 'Contatos', columns: 2 },\n { id: 'channels', label: 'Canais de divulgação', description: 'Perfis e contatos usados nas peças de campanha e no atendimento.', columns: 3 },\n { id: 'settings', label: 'Configurações', description: 'Valem só para esta unidade. Sem mexer, ela segue o padrão da casa.', columns: 2 },\n { id: 'notes', label: 'Observações', columns: 1 },\n { id: 'tax', label: 'Identidade fiscal', description: 'Do CNPJ desta unidade. Unidades com o mesmo CNPJ dividem estes dados.', columns: 3, tab: 'Fiscal', tabIcon: 'FileText',\n // The certificate and the issuer config are fiscal-br's; they draw here, under the CNPJ's fields.\n detailZones: [UNIT_DETAIL_ZONES.certificate, UNIT_DETAIL_ZONES.fiscal] },\n { ...RECORD_GROUP },\n ],\n fields: [\n // V1's first column: the matriz/filial badge.\n { key: 'unitType', label: 'Tipo', type: 'text', showInForm: false, showInDetail: false,\n renderCell: (_v, row) => {\n const r = row as { isHeadquarters?: boolean; kind?: string }\n return r.isHeadquarters ? 'Matriz' : r.kind === 'region' ? 'Região' : 'Filial'\n } },\n { key: 'legalName', label: 'Razão social', type: 'text', showInTable: true, searchable: true, group: 'identity', span: 2 },\n { key: 'name', label: 'Nome fantasia', type: 'text', required: true, showInTable: true, searchable: true, group: 'identity', hint: 'É o nome que aparece nos filtros e no seletor de unidade.' },\n { key: 'abbreviation', label: 'Abreviação', type: 'text', group: 'identity', placeholder: 'Ex.: TIJ' },\n { ...cnpjField({ key: 'cnpj', label: 'CNPJ', showInTable: true, searchable: true, group: 'identity', hint: 'Opcional. Obrigatório para emitir nota ou receber DANFes.' }),\n renderCell: (v) => (v ? maskCpfCnpj(String(v)) : '—') },\n // The two columns migration 039 added. A `region` groups branches and is\n // never somewhere anyone stands — bind a manager to it and they reach every\n // branch under it, which is the whole reason regions exist.\n {\n key: 'kind',\n label: 'Tipo',\n type: 'segmented',\n defaultValue: 'branch',\n // The view reads `hq` for the headquarters, which this segmented does not\n // offer: the matriz is the \"Esta é a matriz?\" toggle, as in V1.\n showInTable: false,\n showInDetail: false,\n group: 'identity',\n visibleWhen: (values) => !values.isHeadquarters,\n options: [\n { label: 'Unidade', value: 'branch', description: 'Onde o atendimento acontece' },\n { label: 'Região', value: 'region', description: 'Agrupa unidades; ninguém trabalha nela' },\n ],\n },\n {\n key: 'parentId',\n label: 'Região',\n type: 'relation',\n showInTable: true,\n group: 'network',\n relation: { table: 'v_units', labelField: 'name', filter: { kind: 'region' } },\n hint: 'Deixe vazio se a unidade não pertence a uma região.',\n },\n { key: 'code', label: 'Código', type: 'text', searchable: true, hint: 'O código que a rede já usa no papel (ex. RJ-042).', group: 'identity' },\n { key: 'address', label: 'Endereço', type: 'address', showInTable: false, showInDetail: false, group: 'where' },\n { key: 'phone', label: 'Telefone 1', type: 'phone', group: 'contacts' },\n { key: 'phone2', label: 'Telefone 2', type: 'phone', group: 'contacts' },\n { key: 'mobile1', label: 'Celular 1', type: 'phone', group: 'contacts' },\n { key: 'mobile2', label: 'Celular 2', type: 'phone', group: 'contacts' },\n // O endereço vem de `public.addresses` (141) e se edita no bloco próprio,\n // igual ao da ficha da pessoa. Continua aqui para a LISTA — cidade e UF são\n // como se reconhece uma unidade numa rede — mas não como campo solto na\n // ficha nem no formulário: rua, número e CEP separados por outros campos\n // não se leem como endereço, e dois lugares para escrever a mesma coisa\n // foi o que deixou um JSON inteiro dentro do input de uma linha.\n { key: 'city', label: 'Cidade', type: 'text', showInTable: true, showInForm: false, showInDetail: false, group: 'identity' },\n { key: 'state', label: 'UF', type: 'text', showInTable: true, showInForm: false, showInDetail: false, group: 'identity' },\n { key: 'country', label: 'País', type: 'text', defaultValue: 'BR', showInForm: false, showInDetail: false, group: 'identity' },\n { key: 'postalCode', label: 'CEP', type: 'text', showInForm: false, showInDetail: false, group: 'identity' },\n // Servem a uma coisa só: oferecer \"a unidade mais perto de mim\" a quem\n // entra pela primeira vez e alcança várias. Editam-se no bloco de endereço\n // (142) — coordenada é a posição de UM endereço, e separada dele a\n // primeira mudança de rua deixa o ponteiro na loja antiga. Continuam\n // declaradas porque a view as publica e o `geo` as lê.\n { key: 'latitude', label: 'Latitude', type: 'number', showInForm: false, showInDetail: false, group: 'identity' },\n { key: 'longitude', label: 'Longitude', type: 'number', showInForm: false, showInDetail: false, group: 'identity' },\n { key: 'email', label: 'E-mail 1', type: 'email', group: 'contacts' },\n { key: 'email2', label: 'E-mail 2', type: 'email', group: 'contacts' },\n { key: 'isHeadquarters', label: 'Esta é a matriz?', type: 'boolean', showInTable: true, group: 'identity', inlineToggle: true },\n\n { key: 'coordinatorPersonId', label: 'Coordenador(a)', type: 'relation', group: 'network',\n relation: { table: 'people', labelField: 'name' } },\n suggestedTextField({ key: 'storeType', column: 'store_type', label: 'Tipo de loja', group: 'network', placeholder: 'Ex.: Rua, Shopping' }),\n suggestedTextField({ key: 'storeCategory', column: 'store_category', label: 'Categoria de loja', group: 'network', placeholder: 'Ex.: A, B, C' }),\n\n { key: 'instagramHandle', label: 'Instagram (@)', type: 'text', group: 'channels', placeholder: '@suaempresa' },\n { key: 'facebookHandle', label: 'Facebook', type: 'text', group: 'channels', placeholder: '/suaempresa' },\n { key: 'tiktokHandle', label: 'TikTok', type: 'text', group: 'channels', placeholder: '@suaempresa' },\n { key: 'website', label: 'Site', type: 'url', group: 'channels', placeholder: 'www.suaempresa.com' },\n { key: 'whatsappNumber', label: 'WhatsApp (divulgação)', type: 'phone', group: 'channels' },\n { key: 'marketingPhone', label: 'Telefone de marketing', type: 'phone', group: 'channels' },\n\n { key: 'timezone', label: 'Fuso horário', type: 'select', group: 'settings', span: 2, options: BR_TIMEZONES, showInDetail: false },\n { key: 'autoDdd', label: 'DDD automático', type: 'boolean', inlineToggle: true, group: 'settings', hint: 'Telefone digitado sem DDD recebe o desta unidade.', showInDetail: false },\n { key: 'daylightSaving', label: 'Horário de verão', type: 'boolean', inlineToggle: true, group: 'settings', showInDetail: false },\n { key: 'onlineBookingEnabled', label: 'Agendamento online', type: 'boolean', inlineToggle: true, group: 'settings', hint: 'A unidade aparece para quem agenda pela internet.', showInDetail: false },\n { key: 'requireOpenCashSession', label: 'Receber só com caixinha aberto', type: 'boolean', inlineToggle: true, group: 'settings', hint: 'Maquininha e Balcão recusam a cobrança de quem não abriu o próprio caixinha nesta unidade.', showInDetail: false },\n\n\n { key: 'municipalRegistration', label: 'Inscrição municipal', type: 'text', group: 'tax', hint: 'No padrão nacional da NFS-e é opcional. Na dúvida, deixe em branco.' },\n { key: 'stateRegistration', label: 'Inscrição estadual', type: 'text', group: 'tax', placeholder: 'ISENTO se for o caso' },\n { key: 'taxRegime', label: 'Regime tributário', type: 'select', group: 'tax', options: [\n { label: 'Simples Nacional', value: 'simples_nacional' },\n { label: 'Simples Nacional — excesso', value: 'simples_nacional_excesso' },\n { label: 'Regime normal (Lucro Presumido / Real)', value: 'regime_normal' },\n ] },\n { key: 'cnae', label: 'CNAE principal', type: 'text', group: 'tax', placeholder: '0000-0/00' },\n { key: 'ibgeCityCode', label: 'Código IBGE do município', type: 'text', group: 'tax', hint: 'A NFS-e é roteada pela prefeitura deste código.' },\n { key: 'fiscalEmail', label: 'E-mail fiscal', type: 'email', group: 'tax', hint: 'Para onde a prefeitura e a SEFAZ mandam retorno.' },\n { key: 'logoUrl', label: 'Logo', type: 'image', showInForm: false, showInDetail: false, showInTable: false },\n // O rail padrão de todo cadastro. Sem `unit`: esta ficha É a unidade.\n ...recordRailFields({ tagsTable: 'v_units', activeLabel: 'Ativa', unit: false }),\n ],\n data: {\n // `public.locations` is gone: units live in schema `app` and `v_units` is the\n // public bridge. It reads every field below and, since 140, writes them\n // too: an INSTEAD OF trigger folds the address back into `app.units`\n // metadata and puts a `kind` outside hq|branch into `legacy_kind`.\n table: 'v_units',\n tenantScoped: true,\n searchColumns: ['name', 'legal_name', 'cnpj', 'city', 'state', 'code'],\n addressOwnerType: 'unit',\n // camelCase→snake does not split a digit off: `email2` would look for column `email2`.\n columnMap: { phone_2: 'phone2', mobile_1: 'mobile1', mobile_2: 'mobile2', email_2: 'email2' },\n defaults: { kind: 'branch' },\n // The tree is never narrowed by the unit you are standing in: the switcher\n // has to be able to name a unit whose data you cannot see, and so does the\n // \"Unidade: Ipanema\" line on a record.\n unitScoped: false,\n },\n}\n\nlocationEntityDef.detailTabs = UNIT_DETAIL_TABS\n\n// The V1 list columns, in its order: Tipo · Razão Social · Nome Fantasia · CNPJ ·\n// Cidade · UF · Status. Every other field is form/detail only.\nconst LIST_COLUMNS = ['unitType', 'legalName', 'name', 'cnpj', 'city', 'state', 'isActive']\nlocationEntityDef.fields = locationEntityDef.fields.map((f) => ({ ...f, showInTable: LIST_COLUMNS.includes(f.key) }))\n\nexport const LocationsCrudPage = createCrudPage(locationEntityDef)\n// Set basePath for hash-based sub-routing inside settings tab\n;(LocationsCrudPage as any).__crudBasePath = '/settings/locations'\n","import * as React from 'react'\nimport { LocationsCrudPage } from '../components/settings/LocationsCrudPage'\nimport { useUnitBootstrap } from './useUnitBootstrap'\n\n// Settings → Unidades: the list of them.\n//\n// The switch that decides whether units MEAN anything moved to Settings →\n// Geral, next to name, timezone and currency — that shelf is for how this\n// business is shaped, and this one is for the things themselves. Keeping both\n// here made the screen answer two different questions at once.\nexport function UnitsSettingsPage() {\n useUnitBootstrap()\n return <LocationsCrudPage />\n}\n","import * as React from 'react'\nimport { create } from 'zustand'\nimport { Badge, Button } from '@fayz-ai/ui'\nimport { Building2, MapPin, Settings2 } from 'lucide-react'\nimport { RightRailPage } from '../components/RightRailPage'\nimport { useUnitStore } from './store'\nimport { UnitMembersTab } from './UnitMembersTab'\nimport { navigateApp } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// A unit, opened beside what you were reading instead of instead of it.\n//\n// Clicking \"Ipanema\" on a team row used to have to mean leaving the team\n// screen. It is a lookup, not a destination: you want to know who is in that\n// unit while still looking at the person who is in it. The right column already\n// hosts pages from elsewhere in the app for exactly this reason, so this is one\n// more of them rather than a fourth kind of panel.\n// ---------------------------------------------------------------------------\n\ninterface UnitPanelState {\n unitId: string | null\n openUnit: (id: string) => void\n close: () => void\n}\n\nexport const useUnitPanel = create<UnitPanelState>((set) => ({\n unitId: null,\n openUnit: (id) => set({ unitId: id }),\n close: () => set({ unitId: null }),\n}))\n\nexport function UnitRailPage() {\n const unitId = useUnitPanel((s) => s.unitId)\n const close = useUnitPanel((s) => s.close)\n const byId = useUnitStore((s) => s.byId)\n const unitMode = useUnitStore((s) => s.unitMode)\n\n const unit = unitId ? byId[unitId] : undefined\n const region = unit?.parentId ? byId[unit.parentId] : undefined\n const isRegion = unit?.kind === 'region'\n\n if (!unit) return null\n\n const address = [unit.address, unit.city, unit.state].filter(Boolean).join(', ')\n\n return (\n <RightRailPage title={unit.name} open onClose={close}>\n <div className=\"min-h-0 flex-1 space-y-4 overflow-y-auto p-4\">\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-muted\">\n <Building2 className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-1.5\">\n {isRegion && <Badge variant=\"outline\" className=\"text-[10px]\">região</Badge>}\n {unit.isHeadquarters && <Badge variant=\"secondary\" className=\"text-[10px]\">matriz</Badge>}\n {unit.isActive === false && <Badge variant=\"outline\" className=\"text-[10px]\">inativa</Badge>}\n {unit.code && <Badge variant=\"outline\" className=\"text-[10px]\">{unit.code}</Badge>}\n {region && <Badge variant=\"outline\" className=\"text-[10px]\">em {region.name}</Badge>}\n </div>\n {address && (\n <p className=\"mt-1.5 flex items-start gap-1.5 text-xs text-muted-foreground\">\n <MapPin className=\"mt-0.5 h-3 w-3 shrink-0\" />\n <span className=\"min-w-0\">{address}</span>\n </p>\n )}\n {!unitMode && (\n <p className=\"mt-2 text-xs text-muted-foreground\">\n A gestão por unidades está desligada — estes vínculos ainda não restringem nada.\n </p>\n )}\n </div>\n </div>\n\n {/* The roster is the same component the unit's own detail tab renders,\n so the two never drift. */}\n <UnitMembersTab item={unit} />\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"w-full\"\n onClick={() => {\n close()\n navigateApp(`#/settings/locations/${unit.id}`)\n }}\n >\n <Settings2 className=\"mr-1.5 h-3.5 w-3.5\" />\n Abrir a ficha da {isRegion ? 'região' : 'unidade'}\n </Button>\n </div>\n </RightRailPage>\n )\n}\n","import * as React from 'react'\nimport { useDataVersion } from '@fayz-ai/core'\nimport { Badge, Button } from '@fayz-ai/ui'\nimport { AlertTriangle, Building2, Plus } from 'lucide-react'\nimport { useUnitStore } from './store'\nimport { useUnitPanel } from './UnitRailPage'\nimport { fetchMemberUnits, UNIT_ACCESS_CHANGED } from './data'\n\n// ---------------------------------------------------------------------------\n// The units column on the team screen.\n//\n// A menu item would have been cheaper, and wrong: \"who can see which unit\" is\n// the thing an admin scans a team list FOR once a franchise turns this on, and\n// a fact you have to open a menu to learn is a fact nobody checks. The empty\n// state is loud on purpose — an unbound person sees nothing, and that is worth\n// spotting before they tell you.\n// ---------------------------------------------------------------------------\n\nexport function MemberUnitsCell({\n userId,\n onManage,\n}: {\n userId?: string\n onManage?: () => void\n}) {\n const byId = useUnitStore((s) => s.byId)\n const unitMode = useUnitStore((s) => s.unitMode)\n const openUnit = useUnitPanel((s) => s.openUnit)\n const [unitIds, setUnitIds] = React.useState<string[] | null>(null)\n // Relê quando alguém mexe num vínculo em qualquer lugar — tirar a pessoa de\n // uma unidade pelo painel da direita deixava esta coluna mostrando o mundo de\n // antes, lado a lado com o painel mostrando o novo.\n const version = useDataVersion(UNIT_ACCESS_CHANGED)\n\n React.useEffect(() => {\n if (!userId) { setUnitIds([]); return }\n let alive = true\n void fetchMemberUnits(userId).then((b) => { if (alive) setUnitIds(b.map((x) => x.locationId)) })\n return () => { alive = false }\n }, [userId, version])\n\n if (!unitMode || !userId) return <span className=\"text-xs text-muted-foreground\">—</span>\n if (unitIds === null) return <span className=\"text-xs text-muted-foreground\">…</span>\n\n if (unitIds.length === 0) {\n return (\n <Button\n variant=\"bare\"\n size=\"bare\"\n type=\"button\"\n onClick={onManage}\n className=\"inline-flex items-center gap-1.5 rounded-md px-1.5 py-1 text-xs text-amber-600 transition-colors hover:bg-amber-400/10 dark:text-amber-400 font-normal\"\n title=\"Sem unidade — esta pessoa não vê dados de nenhuma unidade\"\n >\n <AlertTriangle className=\"h-3.5 w-3.5\" />\n sem unidade\n </Button>\n )\n }\n\n const shownIds = unitIds.slice(0, 2)\n const rest = unitIds.length - shownIds.length\n const allNames = unitIds.map((id) => byId[id]?.name ?? '—')\n\n // Each badge opens THAT unit in the right column; the overflow chip opens the\n // person's own sheet, because \"+3\" is a question about the person, not a unit.\n return (\n <div className=\"flex flex-wrap items-center gap-1\" title={allNames.join(' · ')}>\n {shownIds.map((id) => (\n <Button variant=\"bare\" size=\"bare\" key={id} type=\"button\" onClick={() => openUnit(id)} className=\"focus:outline-none text-[length:inherit] font-normal\">\n <Badge variant=\"secondary\" className=\"gap-1 text-[10px] transition-colors hover:bg-muted\">\n <Building2 className=\"h-3 w-3\" />\n {byId[id]?.name ?? '—'}\n </Badge>\n </Button>\n ))}\n {rest > 0 && (\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={onManage} className=\"focus:outline-none text-[length:inherit] font-normal\">\n <Badge variant=\"outline\" className=\"text-[10px] transition-colors hover:bg-muted\">+{rest}</Badge>\n </Button>\n )}\n </div>\n )\n}\n\n/** The \"+ unidade\" affordance for a row that has none, used where a full cell\n * would be too heavy (a person card rather than a table row). */\nexport function AddUnitButton({ onClick }: { onClick: () => void }) {\n return (\n <Button size=\"sm\" variant=\"outline\" onClick={onClick}>\n <Plus className=\"mr-1.5 h-3.5 w-3.5\" />\n Unidades\n </Button>\n )\n}\n","import type { Unit } from './data'\n\n/**\n * \"A unidade mais perto de mim\" — o último recurso, e o único que pede algo.\n *\n * Nunca é chamado sozinho. A entrada resolve por hábito (esta máquina, depois\n * esta pessoa) e por aritmética (só existe uma unidade ao alcance); a\n * localização só entra quando nada disso respondeu E a rede preencheu as\n * coordenadas E a pessoa apertou o botão. Um pedido de GPS disparado pelo login\n * é hostil, e a resposta (\"permitir para sempre?\") custa mais atenção do que a\n * escolha que ela evita.\n *\n * Também não pode dar errado de forma cara: negar, demorar ou não existir\n * termina em `undefined` e a lista continua exatamente como estava.\n */\n\n/** Depois disto o botão já custou mais do que rolar a lista. */\nconst TIMEOUT_MS = 8000\n\n/** Distância em km entre dois pontos. Haversine, esfera — o erro contra o\n * elipsoide é de metros, e a pergunta é \"qual das lojas\", não \"quantos metros\". */\nfunction distanceKm(aLat: number, aLon: number, bLat: number, bLon: number): number {\n const R = 6371\n const toRad = (d: number) => (d * Math.PI) / 180\n const dLat = toRad(bLat - aLat)\n const dLon = toRad(bLon - aLon)\n const h =\n Math.sin(dLat / 2) ** 2 +\n Math.cos(toRad(aLat)) * Math.cos(toRad(bLat)) * Math.sin(dLon / 2) ** 2\n return 2 * R * Math.asin(Math.min(1, Math.sqrt(h)))\n}\n\n/** Se vale a pena sequer oferecer o botão: duas ou mais unidades alcançáveis\n * com coordenada. Com uma só não há o que comparar, e com nenhuma o botão\n * seria um pedido de permissão que não responde nada. */\nexport function canOfferNearest(units: Unit[], reachable: string[]): boolean {\n if (typeof navigator === 'undefined' || !navigator.geolocation) return false\n const withCoords = units.filter(\n (u) => reachable.includes(u.id) && u.latitude != null && u.longitude != null,\n )\n return withCoords.length > 1\n}\n\nexport interface NearestUnit {\n unitId: string\n km: number\n}\n\n/**\n * A unidade alcançável mais próxima, ou `undefined` se a pessoa negou, o\n * aparelho não respondeu a tempo, ou nenhuma unidade tem coordenada.\n *\n * Nunca lança: quem chama está numa lista aberta, e uma exceção aqui derrubaria\n * o menu inteiro por causa de um botão opcional.\n */\nexport async function findNearestUnit(\n units: Unit[],\n reachable: string[],\n): Promise<NearestUnit | undefined> {\n const candidates = units.filter(\n (u) => reachable.includes(u.id) && u.latitude != null && u.longitude != null,\n )\n if (candidates.length === 0) return undefined\n if (typeof navigator === 'undefined' || !navigator.geolocation) return undefined\n\n const position = await new Promise<GeolocationPosition | undefined>((resolve) => {\n let settled = false\n const done = (p?: GeolocationPosition) => {\n if (settled) return\n settled = true\n resolve(p)\n }\n // Timeout próprio além do da API: em alguns navegadores o callback de erro\n // simplesmente não chega quando a permissão fica pendente, e a promessa\n // ficaria aberta com o botão girando para sempre.\n const timer = setTimeout(() => done(undefined), TIMEOUT_MS)\n try {\n navigator.geolocation.getCurrentPosition(\n (p) => { clearTimeout(timer); done(p) },\n () => { clearTimeout(timer); done(undefined) },\n // Precisão grosseira de propósito: a pergunta é em qual bairro, e o modo\n // preciso liga o GPS, gasta bateria e demora mais para responder o mesmo.\n { enableHighAccuracy: false, timeout: TIMEOUT_MS, maximumAge: 5 * 60 * 1000 },\n )\n } catch {\n clearTimeout(timer)\n done(undefined)\n }\n })\n\n if (!position) return undefined\n\n let best: NearestUnit | undefined\n for (const u of candidates) {\n const km = distanceKm(\n position.coords.latitude, position.coords.longitude,\n Number(u.latitude), Number(u.longitude),\n )\n if (!best || km < best.km) best = { unitId: u.id, km }\n }\n return best\n}\n","import * as React from 'react'\nimport { Store, Layers } from 'lucide-react'\nimport { useTranslation } from '../hooks/useTranslation'\n\n/** Quanto a cobertura fica na tela antes de entregar o reload. */\nconst HOLD_MS = 900\n\nexport interface UnitSwitchingProps {\n /** A unidade sendo entrada, nomeada. */\n unitName: string\n /** \"Todas as unidades\" ganha outra marca — é uma abertura, não um lugar. */\n isAll?: boolean\n /** Roda quando a cobertura cumpriu o tempo dela. Na prática, recarrega. */\n onDone: () => void\n}\n\n/**\n * A tela entre duas unidades.\n *\n * Irmã mais curta de `WorkspaceSwitching`, e de propósito: trocar de unidade é\n * um movimento MENOR do que trocar de conta — a pessoa continua na mesma\n * empresa, com as mesmas permissões — então não merece três etapas nem dois\n * segundos e meio. Merece cobrir o reload, dizer para onde está indo, e sair\n * do caminho.\n *\n * O que ela tem em comum com a irmã é o motivo de existir: o reload é\n * obrigatório (ver `switching.store`), e um reload sem cobertura lê como\n * travamento.\n */\nexport function UnitSwitching({ unitName, isAll, onDone }: UnitSwitchingProps) {\n const { t } = useTranslation()\n const tr = (key: string, fallback: string) => {\n const v = t(key)\n return !v || v === key ? fallback : v\n }\n\n // Uma referência e não a prop direta: o reload derruba esta árvore, e o\n // timer não pode carregar uma closure velha até lá.\n const doneRef = React.useRef(onDone)\n doneRef.current = onDone\n React.useEffect(() => {\n const id = window.setTimeout(() => doneRef.current(), HOLD_MS)\n return () => window.clearTimeout(id)\n }, [])\n\n const Icon = isAll ? Layers : Store\n\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label={`${tr('unit.switching.eyebrow', 'Mudando para')} ${unitName}`}\n className=\"saas-switch-veil fixed inset-0 z-[140] flex items-center justify-center bg-background px-6\"\n >\n <div className=\"saas-switch-rise flex w-full max-w-sm flex-col items-center\">\n <div className=\"relative flex h-16 w-16 items-center justify-center\">\n <span aria-hidden className=\"saas-switch-pulse absolute inset-0 rounded-2xl bg-primary/25\" />\n <span className=\"relative flex h-14 w-14 items-center justify-center rounded-2xl bg-primary text-primary-foreground shadow-sm\">\n <Icon className=\"h-6 w-6\" strokeWidth={2} />\n </span>\n </div>\n\n <p className=\"mt-6 text-xs font-medium uppercase tracking-[0.14em] text-muted-foreground\">\n {tr('unit.switching.eyebrow', 'Mudando para')}\n </p>\n {/* Quebra em vez de reticências: o nome cortado é justamente a\n confirmação que esta tela existe para dar, cortada ao meio. */}\n <h1 className=\"mt-1.5 text-pretty text-center text-2xl font-semibold leading-tight tracking-tight text-foreground sm:text-3xl\">\n {unitName}\n </h1>\n <p className=\"mt-4 flex items-center gap-2 text-sm text-muted-foreground\">\n <span aria-hidden className=\"saas-switch-dot h-2 w-2 rounded-full bg-primary\" />\n {tr('unit.switching.loading', 'Carregando os dados desta unidade')}\n </p>\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { useUnitSwitchingStore } from './switching.store'\nimport { UnitSwitching } from './UnitSwitching'\n\n/**\n * Desenha a transição de unidade por cima do que estiver na tela, e executa o\n * reload que ela existe para cobrir.\n *\n * Montado uma vez, no alto da casca: a troca pode partir do seletor da barra,\n * do menu lateral ou de qualquer lugar que venha a crescer um — e nenhum deles\n * deveria ser dono de uma cobertura de tela inteira.\n */\nexport function UnitSwitchingHost() {\n const target = useUnitSwitchingStore((s) => s.target)\n if (!target) return null\n\n return (\n <UnitSwitching\n unitName={target.unitName}\n isAll={target.unitId === undefined}\n // Reload de verdade, não navegação de rota: o objetivo é descartar todo\n // store de plugin e todo cache que ainda segura as linhas da unidade\n // anterior, e só um documento novo faz isso. `reload()` preserva a URL,\n // então quem trocou cai na MESMA tela, na unidade nova.\n onDone={() => window.location.reload()}\n />\n )\n}\n","import { create } from 'zustand'\n\ninterface UnitPickerStore {\n open: boolean\n setOpen: (open: boolean) => void\n}\n\n/** The dialog lives OUTSIDE the menu that opens it: picking a unit closes the\n * dropdown, and a dialog mounted inside it would unmount on the same click. */\nexport const useUnitPickerStore = create<UnitPickerStore>((set) => ({\n open: false,\n setOpen: (open) => set({ open }),\n}))\n\nexport function openUnitPicker() {\n useUnitPickerStore.getState().setOpen(true)\n}\n","import * as React from 'react'\nimport { PickerDialog, type PickerGroup, type PickerOption } from '@fayz-ai/ui'\nimport { useUnitStore, type UnitNode } from './store'\nimport { useUnitSwitchingStore } from './switching.store'\nimport { useUnitPickerStore } from './picker.store'\n\nexport const ALL_UNITS = '__all__'\n\n// Mounted once at the top of the shell, like the switching overlay: sixty-five\n// units do not fit in a popover anchored to the bottom of the rail.\nexport function UnitPickerDialog() {\n const open = useUnitPickerStore((s) => s.open)\n const setOpen = useUnitPickerStore((s) => s.setOpen)\n const unitMode = useUnitStore((s) => s.unitMode)\n const units = useUnitStore((s) => s.units)\n const tree = useUnitStore((s) => s.tree)\n const byId = useUnitStore((s) => s.byId)\n const myUnitIds = useUnitStore((s) => s.myUnitIds)\n const activeUnitId = useUnitStore((s) => s.activeUnitId)\n const beginSwitch = useUnitSwitchingStore((s) => s.begin)\n\n const reachable = React.useMemo(\n () => (myUnitIds.length > 0 ? myUnitIds : units.filter((u) => u.kind !== 'region').map((u) => u.id)),\n [myUnitIds, units],\n )\n\n const groups = React.useMemo<PickerGroup[]>(() => {\n const out: PickerGroup[] = []\n if (reachable.length > 1) {\n out.push({ id: '_all', options: [{ id: ALL_UNITS, label: 'Todas as unidades' }] })\n }\n // A region is a heading, not a destination.\n const collect = (nodes: UnitNode[], bucket: PickerOption[]) => {\n for (const n of nodes) {\n if (n.kind !== 'region' && reachable.includes(n.id)) {\n bucket.push({\n id: n.id,\n label: n.name,\n sublabel: n.city ?? null,\n hint: n.isHeadquarters ? 'matriz' : null,\n keywords: [n.code ?? '', n.city ?? ''].filter(Boolean),\n })\n }\n collect(n.children, bucket)\n }\n }\n for (const root of tree) {\n if (root.kind === 'region') {\n const options: PickerOption[] = []\n collect(root.children, options)\n if (options.length > 0) out.push({ id: root.id, label: root.name, options })\n } else {\n const options: PickerOption[] = []\n collect([root], options)\n if (options.length > 0) out.push({ id: root.id, options })\n }\n }\n return out\n }, [tree, reachable])\n\n if (!unitMode) return null\n\n return (\n <PickerDialog\n open={open}\n onOpenChange={setOpen}\n title=\"Trocar de unidade\"\n description=\"Digite para buscar, use ↑ ↓ para navegar.\"\n searchPlaceholder=\"Buscar unidade…\"\n emptyLabel=\"Nenhuma unidade com esse nome.\"\n searchThreshold={6}\n groups={groups}\n value={activeUnitId ?? ALL_UNITS}\n onSelect={(id) => {\n if (id === ALL_UNITS) {\n if (activeUnitId !== undefined) beginSwitch({ unitId: undefined, unitName: 'Todas as unidades' })\n return\n }\n if (id !== activeUnitId) beginSwitch({ unitId: id, unitName: byId[id]?.name ?? '' })\n }}\n />\n )\n}\n","import * as React from 'react'\nimport { DropdownItem, DropdownLabel, DropdownSeparator, cn } from '@fayz-ai/ui'\nimport { Building2, Check, ChevronsUpDown, Layers, LocateFixed, Loader2 } from 'lucide-react'\nimport { useUnitStore, type UnitNode } from './store'\nimport { useUnitBootstrap } from './useUnitBootstrap'\nimport { useUnitSwitchingStore } from './switching.store'\nimport { canOfferNearest, findNearestUnit } from './geo'\nimport { openUnitPicker } from './picker.store'\n\n// ---------------------------------------------------------------------------\n// The \"Unidades\" half of the identity menu.\n//\n// One menu, not two. Workspace and unit are the same question asked twice —\n// \"where am I?\" — and answering it in two different popovers means learning two\n// controls to do one thing. The always-visible second line says where you are;\n// this section is how you move.\n// ---------------------------------------------------------------------------\n\n/** Above this the menu stops listing units and hands the job to the dialog:\n * a franchise with fifteen units is the normal case, not the edge one. */\nconst MENU_LIST_CAP = 5\n\nexport function UnitMenuSection() {\n useUnitBootstrap()\n const [locating, setLocating] = React.useState(false)\n const unitMode = useUnitStore((s) => s.unitMode)\n const units = useUnitStore((s) => s.units)\n const tree = useUnitStore((s) => s.tree)\n const byId = useUnitStore((s) => s.byId)\n const myUnitIds = useUnitStore((s) => s.myUnitIds)\n const activeUnitId = useUnitStore((s) => s.activeUnitId)\n const needsChoice = useUnitStore((s) => s.needsChoice)\n // Trocar de unidade termina num reload — todo store de plugin ainda segura as\n // linhas da unidade anterior (ver switching.store). `begin` grava o pino e\n // levanta a cobertura; ninguém aqui chama `setActive` direto.\n const beginSwitch = useUnitSwitchingStore((s) => s.begin)\n\n if (!unitMode) return null\n\n const reachable = myUnitIds.length > 0\n ? myUnitIds\n : units.filter((u) => u.kind !== 'region').map((u) => u.id)\n if (reachable.length === 0) return null\n\n const current = activeUnitId ? byId[activeUnitId] : undefined\n const currentLabel = current?.name ?? 'Todas as unidades'\n\n const nearestItem = needsChoice && canOfferNearest(units, reachable) && (\n // O último recurso, e o único que pede alguma coisa. A entrada já tentou o\n // hábito desta máquina, o desta pessoa e a aritmética de \"só existe uma\".\n <DropdownItem\n disabled={locating}\n onClick={async (e: React.MouseEvent) => {\n // O menu fecharia no clique e desmontaria isto no meio do caminho, com\n // a permissão do navegador ainda aberta na tela.\n e.preventDefault()\n setLocating(true)\n const nearest = await findNearestUnit(units, reachable)\n setLocating(false)\n if (nearest) beginSwitch({ unitId: nearest.unitId, unitName: byId[nearest.unitId]?.name ?? '' })\n }}\n className=\"flex items-center gap-2\"\n >\n {locating\n ? <Loader2 className=\"h-4 w-4 shrink-0 animate-spin text-muted-foreground\" />\n : <LocateFixed className=\"h-4 w-4 shrink-0 text-muted-foreground\" />}\n <span className=\"min-w-0 flex-1 truncate\">\n {locating ? 'Procurando…' : 'A unidade mais perto de mim'}\n </span>\n </DropdownItem>\n )\n\n // Passando disto a lista para de ser um menu e vira uma busca: o diálogo tem\n // campo, setas e a tela inteira, e o menu fica com a resposta — onde estou e\n // por onde troco. Ver UnitPickerDialog.\n if (reachable.length > MENU_LIST_CAP) {\n return (\n <>\n <DropdownSeparator />\n <DropdownLabel>Unidades</DropdownLabel>\n {/* One row: where I am IS the button that changes it. */}\n <DropdownItem onClick={() => openUnitPicker()} className=\"flex items-center gap-2\" title={currentLabel}>\n {current\n ? <Building2 className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n : <Layers className=\"h-4 w-4 shrink-0 text-muted-foreground\" />}\n <span className=\"min-w-0 flex-1 truncate font-medium\">{currentLabel}</span>\n <span className=\"shrink-0 text-[10px] tabular-nums text-muted-foreground\">{reachable.length}</span>\n <ChevronsUpDown className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n </DropdownItem>\n {nearestItem}\n </>\n )\n }\n\n const renderNode = (node: UnitNode, depth: number): React.ReactNode => {\n // A region is a heading, not a destination: standing \"in\" one would mean\n // sending its children as a filter from the browser, which is the one thing\n // this design refuses to do.\n if (node.kind === 'region') {\n const visibleChildren = node.children.filter((c) => c.kind === 'region' || reachable.includes(c.id))\n if (visibleChildren.length === 0) return null\n return (\n <React.Fragment key={node.id}>\n <DropdownLabel className=\"px-2 pt-2 text-[10px] uppercase tracking-wide text-muted-foreground\">\n {node.name}\n </DropdownLabel>\n {visibleChildren.map((child) => renderNode(child, depth + 1))}\n </React.Fragment>\n )\n }\n if (!reachable.includes(node.id)) return null\n return (\n <React.Fragment key={node.id}>\n <DropdownItem\n onClick={() => beginSwitch({ unitId: node.id, unitName: node.name })}\n className={cn('flex items-center gap-2', depth > 0 && 'pl-6')}\n >\n <Building2 className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate\">{node.name}</span>\n {node.isHeadquarters && <span className=\"shrink-0 text-[10px] text-muted-foreground\">matriz</span>}\n {activeUnitId === node.id && <Check className=\"h-4 w-4 shrink-0\" />}\n </DropdownItem>\n {node.children.map((child) => renderNode(child, depth + 1))}\n </React.Fragment>\n )\n }\n\n return (\n <>\n <DropdownSeparator />\n <DropdownLabel>Unidades</DropdownLabel>\n {/* Only offered when there is more than one to choose between — \"todas\"\n next to a single unit is a choice that changes nothing. */}\n {reachable.length > 1 && (\n <DropdownItem onClick={() => beginSwitch({ unitId: undefined, unitName: 'Todas as unidades' })} className=\"flex items-center gap-2\">\n <Layers className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate\">Todas as unidades</span>\n {!activeUnitId && <Check className=\"h-4 w-4 shrink-0\" />}\n </DropdownItem>\n )}\n {nearestItem}\n {tree.map((node) => renderNode(node, 0))}\n </>\n )\n}\n\n/** The always-visible line under the workspace name: where you are, not a\n * control. Indented to sit under the NAME rather than under the mark, so the\n * two lines read as one address instead of two unrelated rows. */\nexport function UnitIndicator({\n collapsed = false,\n inline = false,\n}: {\n collapsed?: boolean\n /** Rendered as the second line INSIDE the account button, which is the only\n * place it fits: the mark is 32px and centres on whatever is beside it, so a\n * line added below the button always lands outside the square. As a sibling\n * of the name inside one column, name (20px) + unit (12px) = the mark's own\n * height, and the mark centres across both without a single magic number. */\n inline?: boolean\n}) {\n useUnitBootstrap()\n const unitMode = useUnitStore((s) => s.unitMode)\n const byId = useUnitStore((s) => s.byId)\n const myUnitIds = useUnitStore((s) => s.myUnitIds)\n const units = useUnitStore((s) => s.units)\n const activeUnitId = useUnitStore((s) => s.activeUnitId)\n\n if (!unitMode) return null\n\n const reachable = myUnitIds.length > 0\n ? myUnitIds\n : units.filter((u) => u.kind !== 'region').map((u) => u.id)\n if (reachable.length === 0) return null\n\n const current = activeUnitId ? byId[activeUnitId] : undefined\n const text = current?.name ?? (reachable.length > 1 ? 'Todas as unidades' : byId[reachable[0]!]?.name ?? '')\n if (!text) return null\n\n if (collapsed) {\n return (\n <div className=\"flex justify-center pt-0.5\" title={text}>\n <Building2 className=\"h-3 w-3 text-sidebar-muted\" />\n </div>\n )\n }\n\n const body = (\n <>\n <Building2 className=\"h-3 w-3 shrink-0 text-sidebar-muted/70\" />\n <span className=\"min-w-0 truncate text-[11px] leading-none text-sidebar-muted/90\">{text}</span>\n </>\n )\n\n // Inside the button: no padding and no margin of its own. The column it sits\n // in owns the layout, which is the whole reason this stopped needing a magic\n // offset to look right.\n if (inline) {\n return <span className=\"mt-0.5 flex min-w-0 items-center gap-1\" title={text}>{body}</span>\n }\n\n // Standalone fallback for a shell that composes the account row some other\n // way. Indented to the column the name starts on: px-1.5 (6) + mark (32) +\n // gap-2.5 (10) = 48px.\n return <div className=\"flex min-w-0 items-center gap-1.5 pl-12 pr-1.5 pb-1\" title={text}>{body}</div>\n}\n","import { readImpersonation, writeImpersonation, replaceApp, type ImpersonationTarget } from '@fayz-ai/core'\nimport { getFayzSupabaseClient } from '../data/client'\nimport { markWorkspaceSwitch } from '../org/choice'\n\nconst FALLBACK_TTL_SECONDS = 30 * 60\n\n/** Put the address on `path` without navigating, then reload the page there. */\nfunction reloadTo(path: string): void {\n replaceApp(path)\n window.location.reload()\n}\n\n/**\n * Enter as a member of this tenant. The server authorises, writes the trail\n * and returns a one-time token hash; the browser trades it for that person's\n * session. Every store is rebuilt by the reload, so nothing of the admin's\n * state leaks into the borrowed view.\n */\nexport async function startImpersonation(input: {\n tenantId: string\n userId: string\n reason?: string\n returnTo?: string\n}): Promise<void> {\n const supabase = getFayzSupabaseClient()\n const { data: current } = await supabase.auth.getSession()\n const origin = current.session\n if (!origin?.refresh_token) throw new Error('Sua sessão expirou. Entre de novo.')\n\n const { data, error } = await supabase.functions.invoke('platform-admin', {\n body: { verb: 'member.impersonate', params: { tenant_id: input.tenantId, user_id: input.userId, reason: input.reason } },\n })\n if (error) {\n const body = await (error as { context?: Response }).context?.json?.().catch(() => null)\n throw new Error(body?.error ?? error.message)\n }\n const { token_hash, target, expires_in } = data as {\n token_hash: string\n target: { user_id: string; email: string; name: string; role?: string }\n expires_in?: number\n }\n\n const now = Date.now()\n const person: ImpersonationTarget = { userId: target.user_id, email: target.email, name: target.name, role: target.role }\n writeImpersonation({\n tenantId: input.tenantId,\n target: person,\n startedAt: now,\n expiresAt: now + (expires_in ?? FALLBACK_TTL_SECONDS) * 1000,\n returnTo: input.returnTo,\n origin: { access_token: origin.access_token, refresh_token: origin.refresh_token },\n })\n\n const { error: verifyErr } = await supabase.auth.verifyOtp({ type: 'magiclink', token_hash })\n if (verifyErr) {\n writeImpersonation(null)\n await supabase.auth.setSession({ access_token: origin.access_token, refresh_token: origin.refresh_token })\n throw new Error(verifyErr.message)\n }\n\n markWorkspaceSwitch(input.tenantId)\n reloadTo('/')\n}\n\n/** Leave: revoke only the borrowed session, then put the admin's back. */\nexport async function stopImpersonation(): Promise<void> {\n const state = readImpersonation()\n if (!state) return\n const supabase = getFayzSupabaseClient()\n try {\n await supabase.auth.signOut({ scope: 'local' })\n } catch {\n // the borrowed session may already be gone; restoring is what matters\n }\n writeImpersonation(null)\n const { error } = await supabase.auth.setSession(state.origin)\n markWorkspaceSwitch(state.tenantId)\n reloadTo(error ? '/login' : state.returnTo ?? '/settings/team')\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/units/MemberAccessRailPage.tsx","../src/units/UnitSwitcher.tsx","../src/units/UnitDetailTabs.tsx","../src/units/UnitSuggestField.tsx","../src/components/settings/LocationsCrudPage.ts","../src/units/UnitsSettingsPage.tsx","../src/units/UnitRailPage.tsx","../src/units/MemberUnitsCell.tsx","../src/units/geo.ts","../src/units/UnitSwitching.tsx","../src/units/UnitSwitchingHost.tsx","../src/units/picker.store.ts","../src/units/UnitPickerDialog.tsx","../src/units/UnitMenuSection.tsx","../src/impersonation/session.ts"],"names":["React2","jsx","Building2","jsxs","Button","Fragment","React","Input","getSupabaseClientOptional","maskCpfCnpj","create","Badge","React4","useDataVersion","AlertTriangle","React5","Layers","React6","React7","DropdownItem","DropdownSeparator","DropdownLabel","ChevronsUpDown","cn","Check"],"mappings":";;;;;;;;;;;;;;;;AA6BA,IAAM,aAAA,GAAgB,UAAA;AASf,IAAM,oBAAA,GAAuB,MAAA,CAA+B,CAAC,GAAA,MAAS;AAAA,EAC3E,MAAA,EAAQ,IAAA;AAAA,EACR,YAAY,CAAC,MAAA,KAAW,GAAA,CAAI,EAAE,QAAQ,CAAA;AAAA,EACtC,OAAO,MAAM,GAAA,CAAI,EAAE,MAAA,EAAQ,MAAM;AACnC,CAAA,CAAE;AAEK,SAAS,oBAAA,GAAuB;AACrC,EAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AACnD,EAAA,MAAM,KAAA,GAAQ,oBAAA,CAAqB,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AACjD,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,uBACE,GAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MAEC,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,aAAa,MAAA,CAAO,IAAA;AAAA,MACpB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,OAAA,EAAS;AAAA,KAAA;AAAA,IAJJ,MAAA,CAAO;AAAA,GAKd;AAEJ;AAEA,SAAS,gBAAA,CAAiB;AAAA,EACxB,MAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACvC,EAAA,MAAM,QAAA,GAAW,mBAAA,CAAoB,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AAEtD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAU,KAAA,CAAA,QAAA,CAAwB,EAAE,CAAA;AAChE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAU,eAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAU,eAAS,KAAK,CAAA;AAEhD,EAAA,MAAM,QAAA,GAAiB,KAAA,CAAA,OAAA,CAAQ,MAAM,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,KAAa,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACvF,EAAA,MAAM,OAAA,GAAgB,KAAA,CAAA,OAAA;AAAA,IACpB,MAAM,QAAA,CAAS,MAAA,CAAO,CAAC,MAAM,CAAC,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,KAAe,CAAA,CAAE,EAAE,CAAC,CAAA;AAAA,IACzE,CAAC,UAAU,QAAQ;AAAA,GACrB;AAEA,EAAA,MAAM,MAAA,GAAe,kBAAY,YAAY;AAC3C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,IAAI;AACF,MAAA,WAAA,CAAY,MAAM,gBAAA,CAAiB,MAAM,CAAC,CAAA;AAAA,IAC5C,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAOX,EAAA,MAAM,OAAA,GAAU,eAAe,mBAAmB,CAAA;AAClD,EAAM,gBAAU,MAAM;AAAE,IAAA,KAAK,MAAA,EAAO;AAAA,EAAE,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAO,CAAC,CAAA;AAE1D,EAAA,eAAe,IAAI,MAAA,EAAgB;AACjC,IAAA,IAAI;AACF,MAAA,MAAM,cAAA,CAAe,MAAA,EAAQ,MAAA,EAAQ,IAAI,CAAA;AACzC,MAAA,MAAM,MAAA,EAAO;AACb,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB,SAAS,GAAA,EAAU;AACjB,MAAA,KAAA,CAAM,MAAM,8BAAA,EAA6B,EAAE,WAAA,EAAa,GAAA,EAAK,SAAS,CAAA;AAAA,IACxE;AAAA,EACF;AAEA,EAAA,eAAe,OAAA,CAAQ,QAAgB,IAAA,EAAc;AACnD,IAAA,IAAI;AACF,MAAA,MAAM,eAAe,MAAA,EAAQ,MAAA,EAAQ,IAAA,KAAS,aAAA,GAAgB,OAAO,IAAI,CAAA;AACzE,MAAA,MAAM,MAAA,EAAO;AAAA,IACf,SAAS,GAAA,EAAU;AACjB,MAAA,KAAA,CAAM,MAAM,sCAAA,EAA+B,EAAE,WAAA,EAAa,GAAA,EAAK,SAAS,CAAA;AAAA,IAC1E;AAAA,EACF;AAEA,EAAA,eAAe,OAAO,MAAA,EAAgB;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,kBAAA,CAAmB,QAAQ,MAAM,CAAA;AACvC,MAAA,MAAM,MAAA,EAAO;AAAA,IACf,SAAS,GAAA,EAAU;AACjB,MAAA,KAAA,CAAM,MAAM,gCAAA,EAA+B,EAAE,WAAA,EAAa,GAAA,EAAK,SAAS,CAAA;AAAA,IAC1E;AAAA,EACF;AAEA,EAAA,uBACE,IAAA,CAAC,iBAAc,KAAA,EAAO,WAAA,EAAa,MAAI,IAAA,EAAC,OAAA,EAAkB,OAAM,UAAA,EAC9D,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8CAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,oBAAS,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAiC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAC3D,CAAC,WAAW,QAAA,CAAS,MAAA,KAAW,qBAC/B,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8EAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,WAAU,4DAAA,EAA6D,CAAA;AAAA,wBACtF,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,OAAE,QAAA,EAAA,qFAAA,EAAwE,CAAA;AAAA,UAC1E,SAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,CAAA,oBACpC,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,IAAA;AAAA,cACL,OAAA,EAAQ,SAAA;AAAA,cACR,OAAA,EAAS,MAAM,KAAK,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,CAAA,CAAG,EAAE,CAAA;AAAA,cACnE,QAAA,EAAA;AAAA;AAAA;AAED,SAAA,EAEJ;AAAA,OAAA,EACF,CAAA;AAAA,0BAGD,KAAA,EAAA,EAAI,SAAA,EAAU,aACZ,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM;AACnB,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,CAAE,UAAU,CAAA;AAC9B,QAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAuB,SAAA,EAAU,6DAAA,EAChC,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,SAAA,EAAA,EAAU,WAAU,wCAAA,EAAyC,CAAA;AAAA,0BAC9D,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,SAAI,SAAA,EAAU,kBAAA,EAAoB,QAAA,EAAA,IAAA,EAAM,IAAA,IAAQ,EAAE,UAAA,EAAW,CAAA;AAAA,YAC7D,IAAA,EAAM,SAAS,QAAA,oBACd,GAAA,CAAC,SAAM,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAU,oBAAA,EAAqB,QAAA,EAAA,gDAAA,EAAmC;AAAA,WAAA,EAEjG,CAAA;AAAA,0BACA,IAAA,CAAC,MAAA,EAAA,EAAO,KAAA,EAAO,CAAA,CAAE,QAAQ,aAAA,EAAe,aAAA,EAAe,CAAC,CAAA,KAAc,KAAK,OAAA,CAAQ,CAAA,CAAE,UAAA,EAAY,CAAC,CAAA,EAChG,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,kBAAA,EACvB,QAAA,kBAAA,GAAA,CAAC,eAAY,CAAA,EACf,CAAA;AAAA,iCACC,aAAA,EAAA,EACC,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EAAO,aAAA,EAAe,QAAA,EAAA,wBAAA,EAAgB,CAAA;AAAA,cACjD,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,qBACb,GAAA,CAAC,UAAA,EAAA,EAAsB,KAAA,EAAO,CAAA,CAAE,EAAA,EAAK,QAAA,EAAA,CAAA,CAAE,IAAA,EAAA,EAAtB,CAAA,CAAE,EAAyB,CAC7C;AAAA,aAAA,EACH;AAAA,WAAA,EACF,CAAA;AAAA,8BACC,MAAA,EAAA,EAAO,IAAA,EAAK,QAAO,OAAA,EAAQ,OAAA,EAAQ,SAAS,MAAM,KAAK,OAAO,CAAA,CAAE,UAAU,GAAG,YAAA,EAAW,SAAA,EACvF,8BAAC,CAAA,EAAA,EAAE,SAAA,EAAU,WAAU,CAAA,EACzB;AAAA,SAAA,EAAA,EArBQ,EAAE,UAsBZ,CAAA;AAAA,MAEJ,CAAC,CAAA,EACH,CAAA;AAAA,MAEC,MAAA,wBACE,MAAA,EAAA,EAAO,aAAA,EAAe,CAAC,CAAA,KAAc,KAAK,GAAA,CAAI,CAAC,CAAA,EAC9C,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,iBAAc,SAAA,EAAU,KAAA,EACvB,8BAAC,WAAA,EAAA,EAAY,WAAA,EAAY,kCAA8B,CAAA,EACzD,CAAA;AAAA,wBACA,GAAA,CAAC,aAAA,EAAA,EACE,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,sBACZ,IAAA,CAAC,UAAA,EAAA,EAAsB,KAAA,EAAO,CAAA,CAAE,EAAA,EAC7B,QAAA,EAAA;AAAA,UAAA,CAAA,CAAE,IAAA;AAAA,UAAM,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,cAAA,GAAc;AAAA,SAAA,EAAA,EAD9B,CAAA,CAAE,EAEnB,CACD,CAAA,EACH;AAAA,OAAA,EACF,CAAA,mBAEA,IAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,MAAK,OAAA,EAAQ,SAAA,EAAU,OAAA,EAAS,MAAM,UAAU,IAAI,CAAA,EAAG,QAAA,EAAU,OAAA,CAAQ,WAAW,CAAA,EAC/F,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,WAAU,oBAAA,EAAqB,CAAA;AAAA,QAAE;AAAA,OAAA,EAEzC;AAAA,KAAA,EAEN,CAAA;AAAA,wBAMC,KAAA,EAAA,EAAI,SAAA,EAAU,oCACb,QAAA,kBAAA,IAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+BAAA,EAAgC,QAAA,EAAA;AAAA,MAAA,+BAAA;AAAA,sBACpB,GAAA,CAAC,YAAO,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,MAAS;AAAA,KAAA,EAE/C,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AChMA,SAAS,KAAA,CAAM,CAAA,EAA0B,GAAA,EAAa,QAAA,EAA0B;AAC9E,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,CAAA;AACf,EAAA,OAAO,CAAC,CAAA,IAAK,CAAA,KAAM,GAAA,GAAM,QAAA,GAAW,CAAA;AACtC;AAEA,SAAS,SAAS,IAAA,EAAsB;AACtC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA;AACrC,EAAA,OAAA,CAAA,CAAS,MAAM,CAAC,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA,KAAO,MAAM,CAAC,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA,CAAA,EAAK,aAAY,IAAK,IAAA,CAAK,MAAM,CAAA,EAAG,CAAC,EAAE,WAAA,EAAY;AACvG;AAEO,SAAS,YAAA,CAAa,EAAE,SAAA,GAAY,KAAA,EAAO,WAAU,EAWzD;AAGD,EAAA,gBAAA,EAAiB;AACjB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AAC/C,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAC7C,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACvC,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACvC,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AACjD,EAAA,MAAM,YAAA,GAAe,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AAIvD,EAAA,MAAM,WAAA,GAAc,qBAAA,CAAsB,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AAIxD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAUA,eAAS,EAAE,CAAA;AAE3C,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,CAAA,EAAG,eAAA,EAAiB,SAAS,CAAA;AACpD,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,CAAA,EAAG,aAAA,EAAe,UAAU,CAAA;AAEjD,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,IAAI,OAAA,EAAS;AAEX,IAAA,OAAO,SAAA,mBACHC,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,2CAAA,EAA4C,CAAA,mBAChEA,GAAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAU,2CAAA,EAA4C,CAAA;AAAA,EACtE;AAEA,EAAA,MAAM,YAAY,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,MAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,QAAQ,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAC7G,EAAA,MAAM,OAAA,GAAU,YAAA,GAAe,IAAA,CAAK,YAAY,CAAA,GAAI,MAAA;AACpD,EAAA,MAAM,QAAA,GAAW,GAAG,KAAA,CAAM,CAAA,EAAG,aAAa,UAAU,CAAC,IAAI,MAAM,CAAA,CAAA;AAC/D,EAAA,MAAM,YAAA,GAAe,SAAS,IAAA,IAAQ,QAAA;AAItC,EAAA,MAAM,UAAA,GAAa,UAAU,MAAA,GAAS,CAAA;AACtC,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACtC,EAAA,MAAM,OAAA,GAAU,OACZ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,SAAA,CAAU,QAAA,CAAS,EAAE,EAAE,CAAA,IAAK,EAAE,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,IAAI,CAAC,CAAA,GAC1G,EAAC;AAEL,EAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAInC,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,CAAC,CAAE,CAAA;AAC/B,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,IAAA,OAAO,SAAA,mBACLA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAA6B,KAAA,EAAO,IAAA,CAAK,IAAA,EACtD,QAAA,kBAAAA,GAAAA,CAACC,SAAAA,EAAA,EAAU,SAAA,EAAU,gCAAA,EAAiC,CAAA,EACxD,CAAA,mBAEAC,IAAAA,CAAC,SAAI,SAAA,EAAU,yCAAA,EAA0C,KAAA,EAAO,IAAA,CAAK,IAAA,EACnE,QAAA,EAAA;AAAA,sBAAAF,GAAAA,CAACC,SAAAA,EAAA,EAAU,SAAA,EAAU,yCAAA,EAA0C,CAAA;AAAA,sBAC/DD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6CAAA,EAA+C,eAAK,IAAA,EAAK;AAAA,KAAA,EAC3E,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,EAAgB,KAAA,KAAmC;AAIrE,IAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,MAAA,uBACEE,IAAAA,CAAOH,KAAA,CAAA,QAAA,EAAN,EACC,QAAA,EAAA;AAAA,wBAAAC,GAAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,qEAAA,EACtB,eAAK,IAAA,EACR,CAAA;AAAA,QACC,IAAA,CAAK,SAAS,GAAA,CAAI,CAAC,UAAU,UAAA,CAAW,KAAA,EAAO,KAAA,GAAQ,CAAC,CAAC;AAAA,OAAA,EAAA,EAJvC,KAAK,EAK1B,CAAA;AAAA,IAEJ;AACA,IAAA,IAAI,CAAC,SAAA,CAAU,QAAA,CAAS,IAAA,CAAK,EAAE,GAAG,OAAO,IAAA;AACzC,IAAA,uBACEE,IAAAA,CAAOH,KAAA,CAAA,QAAA,EAAN,EACC,QAAA,EAAA;AAAA,sBAAAG,IAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAU,MAAM,WAAA,CAAY,EAAE,MAAA,EAAQ,KAAK,EAAA,EAAI,QAAA,EAAU,IAAA,CAAK,IAAA,EAAM,CAAA;AAAA,UACpE,SAAA,EAAW,EAAA,CAAG,yBAAA,EAA2B,KAAA,GAAQ,KAAK,MAAM,CAAA;AAAA,UAE5D,QAAA,EAAA;AAAA,4BAAAF,GAAAA,CAACC,SAAAA,EAAA,EAAU,SAAA,EAAU,4CAAA,EAA6C,CAAA;AAAA,4BAClED,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA2B,eAAK,IAAA,EAAK,CAAA;AAAA,YACpD,IAAA,CAAK,cAAA,oBACJA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4CAAA,EAA8C,QAAA,EAAA,KAAA,CAAM,CAAA,EAAG,UAAA,EAAY,QAAQ,CAAA,EAAE,CAAA;AAAA,YAE9F,iBAAiB,IAAA,CAAK,EAAA,oBAAMA,GAAAA,CAAC,KAAA,EAAA,EAAM,WAAU,sBAAA,EAAuB;AAAA;AAAA;AAAA,OACvE;AAAA,MACC,IAAA,CAAK,SAAS,GAAA,CAAI,CAAC,UAAU,UAAA,CAAW,KAAA,EAAO,KAAA,GAAQ,CAAC,CAAC;AAAA,KAAA,EAAA,EAZvC,KAAK,EAa1B,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,uBACEE,KAAC,QAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAF,GAAAA,CAAC,eAAA,EAAA,EAAgB,OAAA,EAAO,IAAA,EACtB,QAAA,kBAAAA,GAAAA;AAAA,MAACG,MAAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAK,MAAA;AAAA,QACL,SAAA,EAAW,EAAA;AAAA,UACT,6JAAA;AAAA,UACA,YAAY,oBAAA,GAAuB,8BAAA;AAAA,UACnC;AAAA,SACF;AAAA,QACA,KAAA,EAAO,YAAA;AAAA,QACP,YAAA,EAAY,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,YAAY,CAAA,CAAA;AAAA,QAEvC,sCACCH,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDACb,QAAA,EAAA,OAAA,GAAU,QAAA,CAAS,OAAA,CAAQ,IAAI,IAAI,cAAA,EACtC,CAAA,mBAEAE,IAAAA,CAAAE,UAAA,EACE,QAAA,EAAA;AAAA,0BAAAJ,GAAAA,CAACC,SAAAA,EAAA,EAAU,SAAA,EAAU,yCAAA,EAA0C,CAAA;AAAA,0BAC/DD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sDAAsD,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,0BACnFA,GAAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,2FAAA,EAA4F;AAAA,SAAA,EACxH;AAAA;AAAA,KAEJ,EACF,CAAA;AAAA,oBACAE,IAAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAM,OAAA,EAAQ,WAAU,MAAA,EACvC,QAAA,EAAA;AAAA,sBAAAA,IAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAU,MAAM,WAAA,CAAY,EAAE,QAAQ,MAAA,EAAW,QAAA,EAAU,UAAU,CAAA;AAAA,UACrE,SAAA,EAAU,yBAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAF,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,4CAAA,EAA6C,CAAA;AAAA,4BAC/DA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAA2B,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,YACnD,CAAC,YAAA,oBAAgBA,GAAAA,CAAC,KAAA,EAAA,EAAM,WAAU,sBAAA,EAAuB;AAAA;AAAA;AAAA,OAC5D;AAAA,sBACAA,IAAC,iBAAA,EAAA,EAAkB,CAAA;AAAA,MAClB,UAAA,oBACCE,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,sBAAA,EACb,QAAA,EAAA;AAAA,wBAAAF,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,gGAAA,EAAiG,CAAA;AAAA,wBACnHA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAS,IAAA;AAAA,YACT,KAAA,EAAO,KAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YAExC,SAAA,EAAW,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,YACpC,WAAA,EAAa,KAAA,CAAM,CAAA,EAAG,cAAA,EAAgB,gBAAgB,CAAA;AAAA,YACtD,SAAA,EAAU;AAAA;AAAA;AACZ,OAAA,EACF,CAAA;AAAA,sBAKFA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,cAAc,0BAA0B,CAAA,EACxD,QAAA,EAAA,IAAA,GACI,OAAA,CAAQ,SAAS,CAAA,GACd,OAAA,CAAQ,GAAA,CAAI,CAAC,sBACXE,IAAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UAEC,QAAA,EAAU,MAAM,WAAA,CAAY,EAAE,MAAA,EAAQ,EAAE,EAAA,EAAI,QAAA,EAAU,CAAA,CAAE,IAAA,EAAM,CAAA;AAAA,UAC9D,SAAA,EAAU,yBAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAF,GAAAA,CAACC,SAAAA,EAAA,EAAU,SAAA,EAAU,4CAAA,EAA6C,CAAA;AAAA,4BAClED,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA2B,YAAE,IAAA,EAAK,CAAA;AAAA,YACjD,iBAAiB,CAAA,CAAE,EAAA,oBAAMA,GAAAA,CAAC,KAAA,EAAA,EAAM,WAAU,sBAAA,EAAuB;AAAA;AAAA,SAAA;AAAA,QAN7D,CAAA,CAAE;AAAA,OAQV,oBAEDA,GAAAA,CAAC,OAAE,SAAA,EAAU,yCAAA,EACV,gBAAM,CAAA,EAAG,mBAAA,EAAqB,+BAA+B,CAAA,EAChE,CAAA,GAEJ,KAAK,GAAA,CAAI,CAAC,SAAS,UAAA,CAAW,IAAA,EAAM,CAAC,CAAC,CAAA,EAC5C;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;ACnNO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,KAAA,EAAO,mBAAA;AAAA,EACP,cAAA,EAAgB,6BAAA;AAAA,EAChB,SAAA,EAAW,wBAAA;AAAA,EACX,WAAA,EAAa,yBAAA;AAAA,EACb,MAAA,EAAQ;AACV;AAEA,SAAS,QAAQ,IAAA,EAAc;AAC7B,EAAA,OAAO,SAAS,WAAA,CAAY,EAAE,IAAA,EAAK,EAAmB;AACpD,IAAA,MAAM,UAAU,wBAAA,EAAyB;AACzC,IAAA,MAAM,UAAU,OAAA,GAAU,iBAAA,CAAkB,OAAA,EAAS,IAAI,IAAI,EAAC;AAC9D,IAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,IAAU,CAAC,IAAA,EAAM,IAAI,OAAO,IAAA;AACzC,IAAA,uBACEA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM;AAClB,MAAA,MAAM,SAAS,CAAA,CAAE,SAAA;AACjB,MAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAkB,IAAA,EAAY,MAAA,EAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,QAAQ,CAAA,CAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA,EAAA,EAAzF,EAAE,EAA0F,CAAA;AAAA,IAClH,CAAC,CAAA,EACH,CAAA;AAAA,EAEJ,CAAA;AACF;AAQA,IAAM,iBAAA,GAAoB;AAAA,EACxB;AAAA,IACE,MAAM,iBAAA,CAAkB,KAAA;AAAA,IACxB,KAAA,EAAO,qBAAA;AAAA,IACP,WAAA,EAAa;AAAA,GACf;AAAA,EACA;AAAA,IACE,MAAM,iBAAA,CAAkB,cAAA;AAAA,IACxB,KAAA,EAAO,mBAAA;AAAA,IACP,WAAA,EAAa;AAAA;AAEjB,CAAA;AAEA,SAAS,gBAAA,CAAiB,EAAE,IAAA,EAAK,EAAmB;AAClD,EAAA,MAAM,UAAU,wBAAA,EAAyB;AACzC,EAAA,IAAI,CAAC,IAAA,EAAM,EAAA,IAAM,CAAC,SAAS,OAAO,IAAA;AAClC,EAAA,MAAM,QAAA,GAAW,kBACd,GAAA,CAAI,CAAC,OAAO,EAAE,GAAG,CAAA,EAAG,OAAA,EAAS,iBAAA,CAAkB,OAAA,EAAS,EAAE,IAAI,CAAA,GAAI,CAAA,CAClE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AACrC,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,qBACbE,IAAAA,CAAC,SAAA,EAAA,EAAqB,WAAU,WAAA,EAC9B,QAAA,EAAA;AAAA,oBAAAA,KAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAF,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uCAAA,EAAyC,YAAE,KAAA,EAAM,CAAA;AAAA,sBAC/DA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAiC,YAAE,WAAA,EAAY;AAAA,KAAA,EAC9D,CAAA;AAAA,IACC,CAAA,CAAE,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM;AACpB,MAAA,MAAM,SAAS,CAAA,CAAE,SAAA;AACjB,MAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAkB,IAAA,EAAY,MAAA,EAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAS,QAAQ,CAAA,CAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA,EAAA,EAAxF,EAAE,EAAyF,CAAA;AAAA,IACjH,CAAC;AAAA,GAAA,EAAA,EARW,CAAA,CAAE,IAShB,CACD,CAAA,EACH,CAAA;AAEJ;AAEO,IAAM,gBAAA,GAAgC;AAAA,EAC3C;AAAA,IACE,EAAA,EAAI,WAAA;AAAA,IAAa,KAAA,EAAO,QAAA;AAAA,IAAU,IAAA,EAAM,QAAA;AAAA,IAAU,SAAA,EAAW,gBAAA;AAAA,IAC7D,OAAA,EAAS,CAAC,OAAA,EAAS,iBAAiB,CAAA;AAAA;AAAA,IAEpC,oBAAoB,iBAAA,CAAkB;AAAA,GACxC;AAAA,EACA,EAAE,EAAA,EAAI,YAAA,EAAc,KAAA,EAAO,gBAAgB,IAAA,EAAM,aAAA,EAAe,SAAA,EAAW,OAAA,CAAQ,iBAAA,CAAkB,SAAS,CAAA,EAAG,kBAAA,EAAoB,kBAAkB,SAAA,EAAU;AAAA;AAAA,EAEjK,EAAE,EAAA,EAAI,UAAA,EAAY,KAAA,EAAO,OAAA,EAAS,QAAQ,IAAA,EAAK;AAAA,EAC/C,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,YAAA,EAAc,QAAQ,IAAA,EAAK;AAAA,EACjD,EAAE,EAAA,EAAI,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,QAAQ,IAAA;AAC/C,CAAA;AC/EA,SAAS,aAAa,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,aAAY,EAK1D;AACD,EAAA,MAAM,MAAA,GAASK,cAAAA,CAAM,WAAA,CAAY,OAAO,KAAA,KAAiD;AACvF,IAAA,MAAM,WAAW,yBAAA,EAA0B;AAC3C,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AACvB,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,QAAA,CAAS,KAAK,SAAS,CAAA,CAAE,MAAA,CAAO,MAAM,EAAE,GAAA,CAAI,MAAA,EAAQ,MAAM,IAAI,CAAA,CAAE,MAAM,GAAG,CAAA;AAChG,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAoB;AACrC,IAAA,KAAA,MAAW,GAAA,IAAQ,IAAA,IAAQ,EAAC,EAAgC;AAC1D,MAAA,MAAM,IAAI,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA,IAAK,EAAE,EAAE,IAAA,EAAK;AACzC,MAAA,IAAI,CAAA,IAAK,CAAC,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,WAAA,EAAa,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,WAAA,IAAe,CAAC,CAAA;AAAA,IAClE;AACA,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY;AACnC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,MAAA,EAAQ,EACrB,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,KAAK,CAAA,CAAE,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA,CAC/C,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAA,EAAG,OAAO,CAAC,CAAA,CAC1C,GAAA,CAAI,CAAC,OAAO,EAAE,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,GAAE,CAAE,CAAA;AAAA,EACrC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,uBACEL,GAAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,OAAO,KAAA,IAAS,MAAA;AAAA,MAChB,cAAc,KAAA,IAAS,MAAA;AAAA,MACvB,QAAA,EAAU,CAAC,EAAA,KAAO,QAAA,CAAS,MAAM,IAAI,CAAA;AAAA,MACrC,QAAA,EAAU,MAAA;AAAA,MACV,QAAA,EAAU,CAAA;AAAA,MACV,aAAa,WAAA,IAAe,qBAAA;AAAA,MAC5B,cAAA,EAAe,0BAAA;AAAA,MACf,cAAA,EAAe,gBAAA;AAAA,MACf,UAAA,EAAW,QAAA;AAAA,MACX,WAAA,EAAW,IAAA;AAAA,MACX,WAAA,EAAY,MAAA;AAAA,MACZ,UAAU,CAAC,KAAA,KAAU,SAAS,KAAA,CAAM,IAAA,MAAU,IAAI;AAAA;AAAA,GACpD;AAEJ;AAEO,SAAS,mBAAmB,KAAA,EAA8E;AAC/G,EAAA,MAAM,EAAE,MAAA,EAAQ,GAAG,IAAA,EAAK,GAAI,KAAA;AAC5B,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,IAAA,EAAM,QAAA;AAAA,IACN,aAAa,CAAC,EAAE,KAAA,EAAO,QAAA,uBACrBA,GAAAA,CAAC,YAAA,EAAA,EAAa,MAAA,EAAgB,OAAQ,KAAA,IAAoB,EAAA,EAAI,QAAA,EAAoB,WAAA,EAAa,KAAK,WAAA,EAAa;AAAA,GAErH;AACF;AAGO,SAAS,UAAU,KAAA,EAAyD;AACjF,EAAA,OAAO;AAAA,IACL,GAAG,KAAA;AAAA,IACH,IAAA,EAAM,QAAA;AAAA,IACN,aAAa,CAAC,EAAE,KAAA,EAAO,QAAA,uBACrBA,GAAAA;AAAA,MAACM,KAAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,SAAA;AAAA,QACV,KAAA,EAAO,WAAA,CAAY,MAAA,CAAO,KAAA,IAAS,EAAE,CAAC,CAAA;AAAA,QACtC,WAAA,EAAa,MAAM,WAAA,IAAe,oBAAA;AAAA,QAClC,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,EAAE,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,KAAK,IAAI;AAAA;AAAA;AAClF,GAEJ;AACF;;;ACnEA,IAAM,YAAA,GAAe;AAAA,EACnB,EAAE,KAAA,EAAO,iBAAA,EAAmB,KAAA,EAAO,qCAAA,EAA8B;AAAA,EACjE,EAAE,KAAA,EAAO,mBAAA,EAAqB,KAAA,EAAO,kEAAA,EAAwD;AAAA,EAC7F,EAAE,KAAA,EAAO,eAAA,EAAiB,KAAA,EAAO,uBAAA,EAAgB;AAAA,EACjD,EAAE,KAAA,EAAO,mBAAA,EAAqB,KAAA,EAAO,gDAAA,EAAyC;AAAA,EAC9E,EAAE,KAAA,EAAO,gBAAA,EAAkB,KAAA,EAAO,6BAAA,EAAsB;AAAA,EACxD,EAAE,KAAA,EAAO,gBAAA,EAAkB,KAAA,EAAO,oCAAA,EAA0B;AAAA,EAC5D,EAAE,KAAA,EAAO,eAAA,EAAiB,KAAA,EAAO,mCAAA,EAAyB;AAAA,EAC1D,EAAE,KAAA,EAAO,mBAAA,EAAqB,KAAA,EAAO,mCAAA,EAAyB;AAAA,EAC9D,EAAE,KAAA,EAAO,gBAAA,EAAkB,KAAA,EAAO,gCAAA,EAAsB;AAAA,EACxD,EAAE,KAAA,EAAO,sBAAA,EAAwB,KAAA,EAAO,mCAAA,EAA4B;AAAA,EACpE,EAAE,KAAA,EAAO,gBAAA,EAAkB,KAAA,EAAO,6BAAA,EAAsB;AAAA,EACxD,EAAE,KAAA,EAAO,qBAAA,EAAuB,KAAA,EAAO,kCAAA,EAA2B;AAAA,EAClE,EAAE,KAAA,EAAO,mBAAA,EAAqB,KAAA,EAAO,gCAAA,EAAyB;AAAA,EAC9D,EAAE,KAAA,EAAO,oBAAA,EAAsB,KAAA,EAAO,iCAAA,EAA0B;AAAA,EAChE,EAAE,KAAA,EAAO,kBAAA,EAAoB,KAAA,EAAO,iDAAA;AACtC,CAAA;AAEA,IAAM,WAAA,GAAc,SAAA;AAEpB,eAAe,cAAA,CAAe,MAAY,GAAA,EAA2C;AACnF,EAAA,MAAM,WAAWC,yBAAAA,EAA0B;AAC3C,EAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,6CAAuC,CAAA;AACtE,EAAA,MAAM,GAAA,GAAA,CAAO,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,IAAK,KAAA,EAAO,WAAA,EAAY,CAAE,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA,IAAK,KAAA;AAE7F,EAAA,MAAM,IAAA,GAAO,SAAS,GAAA,CAAI,EAAE,SAAS,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AACtD,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,SAAS,OAAA,CAAQ,IAAA,CAAK,WAAW,CAAA,CAAE,OAAO,IAAA,EAAM,IAAA,EAAM,EAAE,MAAA,EAAQ,MAAM,CAAA;AAC9F,EAAA,IAAI,OAAO,MAAM,KAAA;AACjB,EAAA,MAAM,GAAA,GAAM,SAAS,OAAA,CAAQ,IAAA,CAAK,WAAW,CAAA,CAAE,YAAA,CAAa,IAAI,CAAA,CAAE,IAAA,CAAK,SAAA;AACvE,EAAA,MAAM,EAAE,KAAA,EAAO,SAAA,KAAc,MAAM,QAAA,CAAS,KAAK,SAAS,CAAA,CAAE,MAAA,CAAO,EAAE,UAAU,GAAA,EAAK,EAAE,EAAA,CAAG,IAAA,EAAM,IAAI,EAAE,CAAA;AACrG,EAAA,IAAI,WAAW,MAAM,SAAA;AACrB,EAAA,OAAO,GAAA;AACT;AAEA,eAAe,eAAe,GAAA,EAAyC;AACrE,EAAA,MAAM,WAAWA,yBAAAA,EAA0B;AAC3C,EAAA,IAAI,CAAC,QAAA,EAAU;AACf,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,QAAA,CAAS,KAAK,SAAS,CAAA,CAAE,MAAA,CAAO,EAAE,UAAU,IAAA,EAAM,EAAE,EAAA,CAAG,IAAA,EAAM,IAAI,EAAE,CAAA;AAC3F,EAAA,IAAI,OAAO,MAAM,KAAA;AACnB;AAEO,IAAM,iBAAA,GAA+B;AAAA;AAAA;AAAA,EAG1C,IAAA,EAAM,SAAA;AAAA,EACN,UAAA,EAAY,UAAA;AAAA,EACZ,IAAA,EAAM,WAAA;AAAA,EACN,MAAA,EAAQ,UAAA;AAAA,EACR,YAAA,EAAc,MAAA;AAAA,EACd,aAAA,EAAe,MAAA;AAAA,EACf,WAAA,EAAa,MAAA;AAAA;AAAA;AAAA,EAGb,QAAA,EAAU,WAAA;AAAA,EACV,WAAA,EAAa,CAAA;AAAA,EACb,MAAA,EAAQ,CAAC,WAAA,CAAY,EAAE,MAAA,EAAQ,QAAA,EAAU,QAAA,EAAU,UAAA,EAAY,GAAA,EAAK,OAAA,EAAS,CAAC,CAAA;AAAA,EAC9E,KAAA,EAAO;AAAA,IACL,GAAA,EAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,OAAA,IAAW,MAAA;AAAA,IAC7B,MAAA,EAAQ,cAAA;AAAA,IACR,MAAA,EAAQ,cAAA;AAAA,IACR,MAAA,EAAQ;AAAA,GACV;AAAA;AAAA;AAAA;AAAA,EAIA,WAAA,EAAa;AAAA,IACX,EAAE,IAAI,UAAA,EAAY,KAAA,EAAO,uBAAiB,OAAA,EAAS,CAAA,EAAG,WAAW,IAAA,EAAK;AAAA,IACtE,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,aAAA,EAAY,SAAS,CAAA,EAAE;AAAA,IAC7C,EAAE,IAAI,SAAA,EAAW,KAAA,EAAO,+BAAyB,WAAA,EAAa,gGAAA,EAA4F,SAAS,CAAA,EAAE;AAAA,IACrK,EAAE,EAAA,EAAI,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,SAAS,CAAA,EAAE;AAAA,IAChD,EAAE,IAAI,UAAA,EAAY,KAAA,EAAO,8BAAwB,WAAA,EAAa,qEAAA,EAAoE,SAAS,CAAA,EAAE;AAAA,IAC7I,EAAE,IAAI,UAAA,EAAY,KAAA,EAAO,uBAAiB,WAAA,EAAa,0EAAA,EAAsE,SAAS,CAAA,EAAE;AAAA,IACxI,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,mBAAA,EAAe,SAAS,CAAA,EAAE;AAAA,IAChD;AAAA,MAAE,EAAA,EAAI,KAAA;AAAA,MAAO,KAAA,EAAO,mBAAA;AAAA,MAAqB,WAAA,EAAa,uEAAA;AAAA,MAAyE,OAAA,EAAS,CAAA;AAAA,MAAG,GAAA,EAAK,QAAA;AAAA,MAAU,OAAA,EAAS,UAAA;AAAA;AAAA,MAEjK,WAAA,EAAa,CAAC,iBAAA,CAAkB,WAAA,EAAa,kBAAkB,MAAM;AAAA,KAAE;AAAA,IACzE,EAAE,GAAG,YAAA;AAAa,GACpB;AAAA,EACA,MAAA,EAAQ;AAAA;AAAA,IAEN;AAAA,MAAE,GAAA,EAAK,UAAA;AAAA,MAAY,KAAA,EAAO,MAAA;AAAA,MAAQ,IAAA,EAAM,MAAA;AAAA,MAAQ,UAAA,EAAY,KAAA;AAAA,MAAO,YAAA,EAAc,KAAA;AAAA,MAC/E,UAAA,EAAY,CAAC,EAAA,EAAI,GAAA,KAAQ;AACvB,QAAA,MAAM,CAAA,GAAI,GAAA;AACV,QAAA,OAAO,EAAE,cAAA,GAAiB,QAAA,GAAW,CAAA,CAAE,IAAA,KAAS,WAAW,WAAA,GAAW,QAAA;AAAA,MACxE;AAAA,KAAE;AAAA,IACJ,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,mBAAgB,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,MAAM,CAAA,EAAE;AAAA,IACzH,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,eAAA,EAAiB,MAAM,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,WAAA,EAAa,MAAM,UAAA,EAAY,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,MAAM,8DAAA,EAA4D;AAAA,IAC/L,EAAE,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,kBAAA,EAAc,MAAM,MAAA,EAAQ,KAAA,EAAO,UAAA,EAAY,WAAA,EAAa,UAAA,EAAW;AAAA,IACrG;AAAA,MAAE,GAAG,SAAA,CAAU,EAAE,GAAA,EAAK,QAAQ,KAAA,EAAO,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAM,YAAY,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,IAAA,EAAM,gEAA6D,CAAA;AAAA,MACtK,UAAA,EAAY,CAAC,CAAA,KAAO,CAAA,GAAIC,YAAY,MAAA,CAAO,CAAC,CAAC,CAAA,GAAI;AAAA,KAAK;AAAA;AAAA;AAAA;AAAA,IAIxD;AAAA,MACE,GAAA,EAAK,MAAA;AAAA,MACL,KAAA,EAAO,MAAA;AAAA,MACP,IAAA,EAAM,WAAA;AAAA,MACN,YAAA,EAAc,QAAA;AAAA;AAAA;AAAA,MAGd,WAAA,EAAa,KAAA;AAAA,MACb,YAAA,EAAc,KAAA;AAAA,MACd,KAAA,EAAO,UAAA;AAAA,MACP,WAAA,EAAa,CAAC,MAAA,KAAW,CAAC,MAAA,CAAO,cAAA;AAAA,MACjC,OAAA,EAAS;AAAA,QACP,EAAE,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,QAAA,EAAU,aAAa,6BAAA,EAA8B;AAAA,QAChF,EAAE,KAAA,EAAO,WAAA,EAAU,KAAA,EAAO,QAAA,EAAU,aAAa,2CAAA;AAAyC;AAC5F,KACF;AAAA,IACA;AAAA,MACE,GAAA,EAAK,UAAA;AAAA,MACL,KAAA,EAAO,WAAA;AAAA,MACP,IAAA,EAAM,UAAA;AAAA,MACN,WAAA,EAAa,IAAA;AAAA,MACb,KAAA,EAAO,SAAA;AAAA,MACP,QAAA,EAAU,EAAE,KAAA,EAAO,SAAA,EAAW,UAAA,EAAY,QAAQ,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAS,EAAE;AAAA,MAC7E,IAAA,EAAM;AAAA,KACR;AAAA,IACA,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,WAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,UAAA,EAAY,IAAA,EAAM,IAAA,EAAM,yDAAA,EAAqD,KAAA,EAAO,UAAA,EAAW;AAAA,IAC7I,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,aAAA,EAAY,IAAA,EAAM,SAAA,EAAW,WAAA,EAAa,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,KAAA,EAAO,OAAA,EAAQ;AAAA,IAC9G,EAAE,KAAK,OAAA,EAAS,KAAA,EAAO,cAAc,IAAA,EAAM,OAAA,EAAS,OAAO,UAAA,EAAW;AAAA,IACtE,EAAE,KAAK,QAAA,EAAU,KAAA,EAAO,cAAc,IAAA,EAAM,OAAA,EAAS,OAAO,UAAA,EAAW;AAAA,IACvE,EAAE,KAAK,SAAA,EAAW,KAAA,EAAO,aAAa,IAAA,EAAM,OAAA,EAAS,OAAO,UAAA,EAAW;AAAA,IACvE,EAAE,KAAK,SAAA,EAAW,KAAA,EAAO,aAAa,IAAA,EAAM,OAAA,EAAS,OAAO,UAAA,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOvE,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,UAAU,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,OAAO,UAAA,EAAW;AAAA,IAC3H,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,MAAM,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAa,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,OAAO,UAAA,EAAW;AAAA,IACxH,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,WAAQ,IAAA,EAAM,MAAA,EAAQ,YAAA,EAAc,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,OAAO,UAAA,EAAW;AAAA,IAC7H,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,UAAA,EAAY,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,KAAA,EAAO,UAAA,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAM3G,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,KAAA,EAAO,UAAA,EAAW;AAAA,IAChH,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,WAAA,EAAa,IAAA,EAAM,QAAA,EAAU,UAAA,EAAY,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,KAAA,EAAO,UAAA,EAAW;AAAA,IAClH,EAAE,KAAK,OAAA,EAAS,KAAA,EAAO,YAAY,IAAA,EAAM,OAAA,EAAS,OAAO,UAAA,EAAW;AAAA,IACpE,EAAE,KAAK,QAAA,EAAU,KAAA,EAAO,YAAY,IAAA,EAAM,OAAA,EAAS,OAAO,UAAA,EAAW;AAAA,IACrE,EAAE,GAAA,EAAK,gBAAA,EAAkB,KAAA,EAAO,qBAAA,EAAoB,IAAA,EAAM,SAAA,EAAW,WAAA,EAAa,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,YAAA,EAAc,IAAA,EAAK;AAAA,IAE9H;AAAA,MAAE,GAAA,EAAK,qBAAA;AAAA,MAAuB,KAAA,EAAO,gBAAA;AAAA,MAAkB,IAAA,EAAM,UAAA;AAAA,MAAY,KAAA,EAAO,SAAA;AAAA,MAC9E,QAAA,EAAU,EAAE,KAAA,EAAO,QAAA,EAAU,YAAY,MAAA;AAAO,KAAE;AAAA,IACpD,kBAAA,CAAmB,EAAE,GAAA,EAAK,WAAA,EAAa,MAAA,EAAQ,YAAA,EAAc,KAAA,EAAO,cAAA,EAAgB,KAAA,EAAO,SAAA,EAAW,WAAA,EAAa,oBAAA,EAAsB,CAAA;AAAA,IACzI,kBAAA,CAAmB,EAAE,GAAA,EAAK,eAAA,EAAiB,MAAA,EAAQ,gBAAA,EAAkB,KAAA,EAAO,mBAAA,EAAqB,KAAA,EAAO,SAAA,EAAW,WAAA,EAAa,cAAA,EAAgB,CAAA;AAAA,IAEhJ,EAAE,GAAA,EAAK,iBAAA,EAAmB,KAAA,EAAO,eAAA,EAAiB,MAAM,MAAA,EAAQ,KAAA,EAAO,UAAA,EAAY,WAAA,EAAa,aAAA,EAAc;AAAA,IAC9G,EAAE,GAAA,EAAK,gBAAA,EAAkB,KAAA,EAAO,UAAA,EAAY,MAAM,MAAA,EAAQ,KAAA,EAAO,UAAA,EAAY,WAAA,EAAa,aAAA,EAAc;AAAA,IACxG,EAAE,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,QAAA,EAAU,MAAM,MAAA,EAAQ,KAAA,EAAO,UAAA,EAAY,WAAA,EAAa,aAAA,EAAc;AAAA,IACpG,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,MAAA,EAAQ,MAAM,KAAA,EAAO,KAAA,EAAO,UAAA,EAAY,WAAA,EAAa,oBAAA,EAAqB;AAAA,IACnG,EAAE,KAAK,gBAAA,EAAkB,KAAA,EAAO,+BAAyB,IAAA,EAAM,OAAA,EAAS,OAAO,UAAA,EAAW;AAAA,IAC1F,EAAE,KAAK,gBAAA,EAAkB,KAAA,EAAO,yBAAyB,IAAA,EAAM,OAAA,EAAS,OAAO,UAAA,EAAW;AAAA,IAE1F,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,mBAAgB,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,UAAA,EAAY,IAAA,EAAM,CAAA,EAAG,OAAA,EAAS,YAAA,EAAc,cAAc,KAAA,EAAM;AAAA,IACjI,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,qBAAkB,IAAA,EAAM,SAAA,EAAW,YAAA,EAAc,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,IAAA,EAAM,mDAAA,EAAqD,cAAc,KAAA,EAAM;AAAA,IAClL,EAAE,GAAA,EAAK,gBAAA,EAAkB,KAAA,EAAO,wBAAA,EAAoB,IAAA,EAAM,SAAA,EAAW,YAAA,EAAc,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,YAAA,EAAc,KAAA,EAAM;AAAA,IAChI,EAAE,GAAA,EAAK,sBAAA,EAAwB,KAAA,EAAO,sBAAsB,IAAA,EAAM,SAAA,EAAW,YAAA,EAAc,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,IAAA,EAAM,mDAAA,EAAqD,cAAc,KAAA,EAAM;AAAA,IACnM,EAAE,GAAA,EAAK,wBAAA,EAA0B,KAAA,EAAO,qCAAkC,IAAA,EAAM,SAAA,EAAW,YAAA,EAAc,IAAA,EAAM,KAAA,EAAO,UAAA,EAAY,IAAA,EAAM,wGAAA,EAA8F,cAAc,KAAA,EAAM;AAAA,IAG1P,EAAE,GAAA,EAAK,uBAAA,EAAyB,KAAA,EAAO,2BAAA,EAAuB,MAAM,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,8EAAA,EAAsE;AAAA,IACtK,EAAE,GAAA,EAAK,mBAAA,EAAqB,KAAA,EAAO,0BAAA,EAAsB,MAAM,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,WAAA,EAAa,sBAAA,EAAuB;AAAA,IACzH,EAAE,KAAK,WAAA,EAAa,KAAA,EAAO,wBAAqB,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS;AAAA,MACrF,EAAE,KAAA,EAAO,kBAAA,EAAoB,KAAA,EAAO,kBAAA,EAAmB;AAAA,MACvD,EAAE,KAAA,EAAO,iCAAA,EAA8B,KAAA,EAAO,0BAAA,EAA2B;AAAA,MACzE,EAAE,KAAA,EAAO,wCAAA,EAA0C,KAAA,EAAO,eAAA;AAAgB,KAC5E,EAAE;AAAA,IACF,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,gBAAA,EAAkB,MAAM,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,WAAA,EAAa,WAAA,EAAY;AAAA,IAC7F,EAAE,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,gCAAA,EAA4B,MAAM,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,uDAAA,EAAkD;AAAA,IAC9I,EAAE,GAAA,EAAK,aAAA,EAAe,KAAA,EAAO,eAAA,EAAiB,MAAM,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,kDAAA,EAAmD;AAAA,IACpI,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,UAAA,EAAY,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,WAAA,EAAa,KAAA,EAAM;AAAA;AAAA,IAE3G,GAAG,iBAAiB,EAAE,SAAA,EAAW,WAAW,WAAA,EAAa,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO;AAAA,GACjF;AAAA,EACA,IAAA,EAAM;AAAA;AAAA;AAAA;AAAA;AAAA,IAKJ,KAAA,EAAO,SAAA;AAAA,IACP,YAAA,EAAc,IAAA;AAAA,IACd,eAAe,CAAC,MAAA,EAAQ,cAAc,MAAA,EAAQ,MAAA,EAAQ,SAAS,MAAM,CAAA;AAAA,IACrE,gBAAA,EAAkB,MAAA;AAAA;AAAA,IAElB,SAAA,EAAW,EAAE,OAAA,EAAS,QAAA,EAAU,UAAU,SAAA,EAAW,QAAA,EAAU,SAAA,EAAW,OAAA,EAAS,QAAA,EAAS;AAAA,IAC5F,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA;AAAA;AAAA;AAAA,IAI3B,UAAA,EAAY;AAAA;AAEhB,CAAA;AAEA,iBAAA,CAAkB,UAAA,GAAa,gBAAA;AAI/B,IAAM,YAAA,GAAe,CAAC,UAAA,EAAY,WAAA,EAAa,QAAQ,MAAA,EAAQ,MAAA,EAAQ,SAAS,UAAU,CAAA;AAC1F,iBAAA,CAAkB,MAAA,GAAS,iBAAA,CAAkB,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,aAAa,YAAA,CAAa,QAAA,CAAS,CAAA,CAAE,GAAG,GAAE,CAAE,CAAA;AAE7G,IAAM,iBAAA,GAAoB,eAAe,iBAAiB,CAAA;AAE/D,iBAAA,CAA0B,cAAA,GAAiB,qBAAA;AC7MtC,SAAS,iBAAA,GAAoB;AAClC,EAAA,gBAAA,EAAiB;AACjB,EAAA,uBAAOR,IAAC,iBAAA,EAAA,EAAkB,CAAA;AAC5B;ACYO,IAAM,YAAA,GAAeS,MAAAA,CAAuB,CAAC,GAAA,MAAS;AAAA,EAC3D,MAAA,EAAQ,IAAA;AAAA,EACR,UAAU,CAAC,EAAA,KAAO,IAAI,EAAE,MAAA,EAAQ,IAAI,CAAA;AAAA,EACpC,OAAO,MAAM,GAAA,CAAI,EAAE,MAAA,EAAQ,MAAM;AACnC,CAAA,CAAE,CAAA;AAEK,SAAS,YAAA,GAAe;AAC7B,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAC3C,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACvC,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AAE/C,EAAA,MAAM,IAAA,GAAO,MAAA,GAAS,IAAA,CAAK,MAAM,CAAA,GAAI,MAAA;AACrC,EAAA,MAAM,SAAS,IAAA,EAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,GAAI,MAAA;AACtD,EAAA,MAAM,QAAA,GAAW,MAAM,IAAA,KAAS,QAAA;AAEhC,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,KAAK,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AAE/E,EAAA,uBACET,GAAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAO,KAAK,IAAA,EAAM,IAAA,EAAI,IAAA,EAAC,OAAA,EAAS,KAAA,EAC7C,QAAA,kBAAAE,IAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8CAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,sBAAAF,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yEAAA,EACb,QAAA,kBAAAA,IAACC,SAAAA,EAAA,EAAU,SAAA,EAAU,+BAAA,EAAgC,CAAA,EACvD,CAAA;AAAA,sBACAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACZ,QAAA,EAAA;AAAA,UAAA,QAAA,oBAAYF,IAACU,KAAAA,EAAA,EAAM,SAAQ,SAAA,EAAU,SAAA,EAAU,eAAc,QAAA,EAAA,WAAA,EAAM,CAAA;AAAA,UACnE,IAAA,CAAK,cAAA,oBAAkBV,GAAAA,CAACU,KAAAA,EAAA,EAAM,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAU,aAAA,EAAc,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,UAChF,IAAA,CAAK,QAAA,KAAa,KAAA,oBAASV,GAAAA,CAACU,KAAAA,EAAA,EAAM,OAAA,EAAQ,SAAA,EAAU,SAAA,EAAU,aAAA,EAAc,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,UACnF,IAAA,CAAK,IAAA,oBAAQV,GAAAA,CAACU,KAAAA,EAAA,EAAM,OAAA,EAAQ,SAAA,EAAU,SAAA,EAAU,aAAA,EAAe,QAAA,EAAA,IAAA,CAAK,IAAA,EAAK,CAAA;AAAA,UACzE,MAAA,oBAAUR,IAAAA,CAACQ,KAAAA,EAAA,EAAM,OAAA,EAAQ,SAAA,EAAU,WAAU,aAAA,EAAc,QAAA,EAAA;AAAA,YAAA,KAAA;AAAA,YAAI,MAAA,CAAO;AAAA,WAAA,EAAK;AAAA,SAAA,EAC9E,CAAA;AAAA,QACC,OAAA,oBACCR,IAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+DAAA,EACX,QAAA,EAAA;AAAA,0BAAAF,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,yBAAA,EAA0B,CAAA;AAAA,0BAC5CA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAW,QAAA,EAAA,OAAA,EAAQ;AAAA,SAAA,EACrC,CAAA;AAAA,QAED,CAAC,QAAA,oBACAA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAqC,QAAA,EAAA,mGAAA,EAElD;AAAA,OAAA,EAEJ;AAAA,KAAA,EACF,CAAA;AAAA,oBAIAA,GAAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAM,IAAA,EAAM,CAAA;AAAA,oBAE5BE,IAAAA;AAAA,MAACC,MAAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAK,IAAA;AAAA,QACL,SAAA,EAAU,QAAA;AAAA,QACV,SAAS,MAAM;AACb,UAAA,KAAA,EAAM;AACN,UAAA,WAAA,CAAY,CAAA,qBAAA,EAAwB,IAAA,CAAK,EAAE,CAAA,CAAE,CAAA;AAAA,QAC/C,CAAA;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,oBAAA,EAAqB,CAAA;AAAA,UAAE,mBAAA;AAAA,UAC1B,WAAW,WAAA,GAAW;AAAA;AAAA;AAAA;AAC1C,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AC3EO,SAAS,eAAA,CAAgB;AAAA,EAC9B,MAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACvC,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AAC/C,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AAC/C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAUW,eAA0B,IAAI,CAAA;AAIlE,EAAA,MAAM,OAAA,GAAUC,eAAe,mBAAmB,CAAA;AAElD,EAAMD,gBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,MAAA,EAAQ;AAAE,MAAA,UAAA,CAAW,EAAE,CAAA;AAAG,MAAA;AAAA,IAAO;AACtC,IAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,IAAA,KAAK,gBAAA,CAAiB,MAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM;AAAE,MAAA,IAAI,KAAA,aAAkB,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAC,CAAA;AAAA,IAAE,CAAC,CAAA;AAC/F,IAAA,OAAO,MAAM;AAAE,MAAA,KAAA,GAAQ,KAAA;AAAA,IAAM,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAO,CAAC,CAAA;AAEpB,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,MAAA,EAAQ,uBAAOX,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,QAAA,EAAC,CAAA;AAClF,EAAA,IAAI,OAAA,KAAY,MAAM,uBAAOA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAgC,QAAA,EAAA,QAAA,EAAC,CAAA;AAE9E,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,uBACEE,IAAAA;AAAA,MAACC,MAAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAK,MAAA;AAAA,QACL,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,QAAA;AAAA,QACT,SAAA,EAAU,wJAAA;AAAA,QACV,KAAA,EAAM,sEAAA;AAAA,QAEN,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAACa,aAAAA,EAAA,EAAc,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,UAAE;AAAA;AAAA;AAAA,KAE3C;AAAA,EAEJ;AAEA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACnC,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAA,GAAS,QAAA,CAAS,MAAA;AACvC,EAAA,MAAM,QAAA,GAAW,QAAQ,GAAA,CAAI,CAAC,OAAO,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,IAAQ,QAAG,CAAA;AAI1D,EAAA,uBACEX,KAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAoC,KAAA,EAAO,QAAA,CAAS,IAAA,CAAK,QAAK,CAAA,EAC1E,QAAA,EAAA;AAAA,IAAA,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,qBACbF,GAAAA,CAACG,MAAAA,EAAA,EAAO,OAAA,EAAQ,MAAA,EAAO,IAAA,EAAK,MAAA,EAAgB,IAAA,EAAK,QAAA,EAAS,OAAA,EAAS,MAAM,QAAA,CAAS,EAAE,CAAA,EAAG,SAAA,EAAU,sDAAA,EAC/F,QAAA,kBAAAD,IAAAA,CAACQ,KAAAA,EAAA,EAAM,OAAA,EAAQ,WAAA,EAAY,SAAA,EAAU,oDAAA,EACnC,QAAA,EAAA;AAAA,sBAAAV,GAAAA,CAACC,SAAAA,EAAA,EAAU,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,MAC9B,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,IAAQ;AAAA,KAAA,EACrB,CAAA,EAAA,EAJsC,EAKxC,CACD,CAAA;AAAA,IACA,IAAA,GAAO,qBACND,GAAAA,CAACG,QAAA,EAAO,OAAA,EAAQ,MAAA,EAAO,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,UAAS,OAAA,EAAS,QAAA,EAAU,SAAA,EAAU,sDAAA,EAC5E,QAAA,kBAAAD,IAAAA,CAACQ,OAAA,EAAM,OAAA,EAAQ,SAAA,EAAU,SAAA,EAAU,8CAAA,EAA+C,QAAA,EAAA;AAAA,MAAA,GAAA;AAAA,MAAE;AAAA,KAAA,EAAK,CAAA,EAC3F;AAAA,GAAA,EAEJ,CAAA;AAEJ;;;AClEA,IAAM,UAAA,GAAa,GAAA;AAInB,SAAS,UAAA,CAAW,IAAA,EAAc,IAAA,EAAc,IAAA,EAAc,IAAA,EAAsB;AAClF,EAAA,MAAM,CAAA,GAAI,IAAA;AACV,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAe,CAAA,GAAI,KAAK,EAAA,GAAM,GAAA;AAC7C,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,GAAO,IAAI,CAAA;AAC9B,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,GAAO,IAAI,CAAA;AAC9B,EAAA,MAAM,CAAA,GACJ,KAAK,GAAA,CAAI,IAAA,GAAO,CAAC,CAAA,IAAK,CAAA,GACtB,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,IAAI,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,IAAI,CAAC,IAAI,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,CAAC,CAAA,IAAK,CAAA;AACxE,EAAA,OAAO,CAAA,GAAI,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA;AACpD;AAKO,SAAS,eAAA,CAAgB,OAAe,SAAA,EAA8B;AAC3E,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,CAAC,SAAA,CAAU,aAAa,OAAO,KAAA;AACvE,EAAA,MAAM,aAAa,KAAA,CAAM,MAAA;AAAA,IACvB,CAAC,CAAA,KAAM,SAAA,CAAU,QAAA,CAAS,CAAA,CAAE,EAAE,CAAA,IAAK,CAAA,CAAE,QAAA,IAAY,IAAA,IAAQ,CAAA,CAAE,SAAA,IAAa;AAAA,GAC1E;AACA,EAAA,OAAO,WAAW,MAAA,GAAS,CAAA;AAC7B;AAcA,eAAsB,eAAA,CACpB,OACA,SAAA,EACkC;AAClC,EAAA,MAAM,aAAa,KAAA,CAAM,MAAA;AAAA,IACvB,CAAC,CAAA,KAAM,SAAA,CAAU,QAAA,CAAS,CAAA,CAAE,EAAE,CAAA,IAAK,CAAA,CAAE,QAAA,IAAY,IAAA,IAAQ,CAAA,CAAE,SAAA,IAAa;AAAA,GAC1E;AACA,EAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AACpC,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,CAAC,SAAA,CAAU,aAAa,OAAO,MAAA;AAEvE,EAAA,MAAM,QAAA,GAAW,MAAM,IAAI,OAAA,CAAyC,CAAC,OAAA,KAAY;AAC/E,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAA4B;AACxC,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,IACX,CAAA;AAIA,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,IAAA,CAAK,MAAS,GAAG,UAAU,CAAA;AAC1D,IAAA,IAAI;AACF,MAAA,SAAA,CAAU,WAAA,CAAY,kBAAA;AAAA,QACpB,CAAC,CAAA,KAAM;AAAE,UAAA,YAAA,CAAa,KAAK,CAAA;AAAG,UAAA,IAAA,CAAK,CAAC,CAAA;AAAA,QAAE,CAAA;AAAA,QACtC,MAAM;AAAE,UAAA,YAAA,CAAa,KAAK,CAAA;AAAG,UAAA,IAAA,CAAK,KAAA,CAAS,CAAA;AAAA,QAAE,CAAA;AAAA;AAAA;AAAA,QAG7C,EAAE,oBAAoB,KAAA,EAAO,OAAA,EAAS,YAAY,UAAA,EAAY,CAAA,GAAI,KAAK,GAAA;AAAK,OAC9E;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,IAAA,CAAK,MAAS,CAAA;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,IAAI,CAAC,UAAU,OAAO,MAAA;AAEtB,EAAA,IAAI,IAAA;AACJ,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,MAAM,EAAA,GAAK,UAAA;AAAA,MACT,SAAS,MAAA,CAAO,QAAA;AAAA,MAAU,SAAS,MAAA,CAAO,SAAA;AAAA,MAC1C,MAAA,CAAO,EAAE,QAAQ,CAAA;AAAA,MAAG,MAAA,CAAO,EAAE,SAAS;AAAA,KACxC;AACA,IAAA,IAAI,CAAC,IAAA,IAAQ,EAAA,GAAK,IAAA,CAAK,EAAA,SAAW,EAAE,MAAA,EAAQ,CAAA,CAAE,EAAA,EAAI,EAAA,EAAG;AAAA,EACvD;AACA,EAAA,OAAO,IAAA;AACT;AChGA,IAAM,OAAA,GAAU,GAAA;AAwBT,SAAS,aAAA,CAAc,EAAE,QAAA,EAAU,KAAA,EAAO,QAAO,EAAuB;AAC7E,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,cAAA,EAAe;AAC7B,EAAA,MAAM,EAAA,GAAK,CAAC,GAAA,EAAa,QAAA,KAAqB;AAC5C,IAAA,MAAM,CAAA,GAAI,EAAE,GAAG,CAAA;AACf,IAAA,OAAO,CAAC,CAAA,IAAK,CAAA,KAAM,GAAA,GAAM,QAAA,GAAW,CAAA;AAAA,EACtC,CAAA;AAIA,EAAA,MAAM,OAAA,GAAgBI,aAAO,MAAM,CAAA;AACnC,EAAA,OAAA,CAAQ,OAAA,GAAU,MAAA;AAClB,EAAMA,gBAAU,MAAM;AACpB,IAAA,MAAM,KAAK,MAAA,CAAO,UAAA,CAAW,MAAM,OAAA,CAAQ,OAAA,IAAW,OAAO,CAAA;AAC7D,IAAA,OAAO,MAAM,MAAA,CAAO,YAAA,CAAa,EAAE,CAAA;AAAA,EACrC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,IAAA,GAAO,QAAQC,MAAAA,GAAS,KAAA;AAE9B,EAAA,uBACEf,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,WAAA,EAAU,QAAA;AAAA,MACV,cAAY,CAAA,EAAG,EAAA,CAAG,0BAA0B,cAAc,CAAC,IAAI,QAAQ,CAAA,CAAA;AAAA,MACvE,SAAA,EAAU,4FAAA;AAAA,MAEV,QAAA,kBAAAE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6DAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDAAA,EACb,QAAA,EAAA;AAAA,0BAAAF,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EAAC,WAAU,8DAAA,EAA+D,CAAA;AAAA,0BAC3FA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8GAAA,EACd,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,WAAA,EAAa,CAAA,EAAG,CAAA,EAC5C;AAAA,SAAA,EACF,CAAA;AAAA,wBAEAA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAU,8EACV,QAAA,EAAA,EAAA,CAAG,wBAAA,EAA0B,cAAc,CAAA,EAC9C,CAAA;AAAA,wBAGAA,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,kHACX,QAAA,EAAA,QAAA,EACH,CAAA;AAAA,wBACAE,IAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4DAAA,EACX,QAAA,EAAA;AAAA,0BAAAF,GAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EAAC,WAAU,iDAAA,EAAkD,CAAA;AAAA,UAC7E,EAAA,CAAG,0BAA0B,mCAAmC;AAAA,SAAA,EACnE;AAAA,OAAA,EACF;AAAA;AAAA,GACF;AAEJ;ACjEO,SAAS,iBAAA,GAAoB;AAClC,EAAA,MAAM,MAAA,GAAS,qBAAA,CAAsB,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AACpD,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,uBACEA,GAAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,KAAA,EAAO,OAAO,MAAA,KAAW,MAAA;AAAA,MAKzB,MAAA,EAAQ,MAAM,MAAA,CAAO,QAAA,CAAS,MAAA;AAAO;AAAA,GACvC;AAEJ;AClBO,IAAM,kBAAA,GAAqBS,MAAAA,CAAwB,CAAC,GAAA,MAAS;AAAA,EAClE,IAAA,EAAM,KAAA;AAAA,EACN,SAAS,CAAC,IAAA,KAAS,GAAA,CAAI,EAAE,MAAM;AACjC,CAAA,CAAE,CAAA;AAEK,SAAS,cAAA,GAAiB;AAC/B,EAAA,kBAAA,CAAmB,QAAA,EAAS,CAAE,OAAA,CAAQ,IAAI,CAAA;AAC5C;ACVO,IAAM,SAAA,GAAY,SAAA;AAIlB,SAAS,gBAAA,GAAmB;AACjC,EAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAC7C,EAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AACnD,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACvC,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACvC,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AACjD,EAAA,MAAM,YAAA,GAAe,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AACvD,EAAA,MAAM,WAAA,GAAc,qBAAA,CAAsB,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AAExD,EAAA,MAAM,SAAA,GAAkBO,KAAA,CAAA,OAAA;AAAA,IACtB,MAAO,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,MAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,QAAQ,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAAA,IAClG,CAAC,WAAW,KAAK;AAAA,GACnB;AAEA,EAAA,MAAM,MAAA,GAAeA,cAAuB,MAAM;AAChD,IAAA,MAAM,MAAqB,EAAC;AAC5B,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,EAAA,EAAI,MAAA,EAAQ,OAAA,EAAS,CAAC,EAAE,EAAA,EAAI,SAAA,EAAW,KAAA,EAAO,mBAAA,EAAqB,GAAG,CAAA;AAAA,IACnF;AAEA,IAAA,MAAM,OAAA,GAAU,CAAC,KAAA,EAAmB,MAAA,KAA2B;AAC7D,MAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,QAAA,IAAI,EAAE,IAAA,KAAS,QAAA,IAAY,UAAU,QAAA,CAAS,CAAA,CAAE,EAAE,CAAA,EAAG;AACnD,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,IAAI,CAAA,CAAE,EAAA;AAAA,YACN,OAAO,CAAA,CAAE,IAAA;AAAA,YACT,QAAA,EAAU,EAAE,IAAA,IAAQ,IAAA;AAAA,YACpB,IAAA,EAAM,CAAA,CAAE,cAAA,GAAiB,QAAA,GAAW,IAAA;AAAA,YACpC,QAAA,EAAU,CAAC,CAAA,CAAE,IAAA,IAAQ,EAAA,EAAI,EAAE,IAAA,IAAQ,EAAE,CAAA,CAAE,MAAA,CAAO,OAAO;AAAA,WACtD,CAAA;AAAA,QACH;AACA,QAAA,OAAA,CAAQ,CAAA,CAAE,UAAU,MAAM,CAAA;AAAA,MAC5B;AAAA,IACF,CAAA;AACA,IAAA,KAAA,MAAW,QAAQ,IAAA,EAAM;AACvB,MAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,QAAA,MAAM,UAA0B,EAAC;AACjC,QAAA,OAAA,CAAQ,IAAA,CAAK,UAAU,OAAO,CAAA;AAC9B,QAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,EAAE,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,KAAA,EAAO,IAAA,CAAK,IAAA,EAAM,SAAS,CAAA;AAAA,MAC7E,CAAA,MAAO;AACL,QAAA,MAAM,UAA0B,EAAC;AACjC,QAAA,OAAA,CAAQ,CAAC,IAAI,CAAA,EAAG,OAAO,CAAA;AACvB,QAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,EAAE,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,OAAA,EAAS,CAAA;AAAA,MAC3D;AAAA,IACF;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,IAAA,EAAM,SAAS,CAAC,CAAA;AAEpB,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,uBACEhB,GAAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,YAAA,EAAc,OAAA;AAAA,MACd,KAAA,EAAM,mBAAA;AAAA,MACN,WAAA,EAAY,qDAAA;AAAA,MACZ,iBAAA,EAAkB,sBAAA;AAAA,MAClB,UAAA,EAAW,gCAAA;AAAA,MACX,eAAA,EAAiB,CAAA;AAAA,MACjB,MAAA;AAAA,MACA,OAAO,YAAA,IAAgB,SAAA;AAAA,MACvB,QAAA,EAAU,CAAC,EAAA,KAAO;AAChB,QAAA,IAAI,OAAO,SAAA,EAAW;AACpB,UAAA,IAAI,YAAA,KAAiB,QAAW,WAAA,CAAY,EAAE,QAAQ,MAAA,EAAW,QAAA,EAAU,qBAAqB,CAAA;AAChG,UAAA;AAAA,QACF;AACA,QAAA,IAAI,EAAA,KAAO,YAAA,EAAc,WAAA,CAAY,EAAE,MAAA,EAAQ,EAAA,EAAI,QAAA,EAAU,IAAA,CAAK,EAAE,CAAA,EAAG,IAAA,IAAQ,EAAA,EAAI,CAAA;AAAA,MACrF;AAAA;AAAA,GACF;AAEJ;AC9DA,IAAM,aAAA,GAAgB,CAAA;AAEf,SAAS,eAAA,GAAkB;AAChC,EAAA,gBAAA,EAAiB;AACjB,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAUiB,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AAC/C,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACvC,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACvC,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AACjD,EAAA,MAAM,YAAA,GAAe,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AACvD,EAAA,MAAM,WAAA,GAAc,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,WAAW,CAAA;AAIrD,EAAA,MAAM,WAAA,GAAc,qBAAA,CAAsB,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AAExD,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,MAAM,YAAY,SAAA,CAAU,MAAA,GAAS,CAAA,GACjC,SAAA,GACA,MAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,QAAQ,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAC5D,EAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEnC,EAAA,MAAM,OAAA,GAAU,YAAA,GAAe,IAAA,CAAK,YAAY,CAAA,GAAI,MAAA;AACpD,EAAA,MAAM,YAAA,GAAe,SAAS,IAAA,IAAQ,mBAAA;AAEtC,EAAA,MAAM,WAAA,GAAc,WAAA,IAAe,eAAA,CAAgB,KAAA,EAAO,SAAS,CAAA;AAAA;AAAA,kBAGjEf,IAAAA;AAAA,IAACgB,YAAAA;AAAA,IAAA;AAAA,MACC,QAAA,EAAU,QAAA;AAAA,MACV,OAAA,EAAS,OAAO,CAAA,KAAwB;AAGtC,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,WAAA,CAAY,IAAI,CAAA;AAChB,QAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,KAAA,EAAO,SAAS,CAAA;AACtD,QAAA,WAAA,CAAY,KAAK,CAAA;AACjB,QAAA,IAAI,OAAA,EAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,QAAA,EAAU,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,EAAG,IAAA,IAAQ,IAAI,CAAA;AAAA,MACjG,CAAA;AAAA,MACA,SAAA,EAAU,yBAAA;AAAA,MAET,QAAA,EAAA;AAAA,QAAA,QAAA,mBACGlB,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,qDAAA,EAAsD,oBACzEA,GAAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,wCAAA,EAAyC,CAAA;AAAA,wBACpEA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,yBAAA,EACb,QAAA,EAAA,QAAA,GAAW,qBAAgB,6BAAA,EAC9B;AAAA;AAAA;AAAA,GACF;AAMF,EAAA,IAAI,SAAA,CAAU,SAAS,aAAA,EAAe;AACpC,IAAA,uBACEE,IAAAA,CAAAE,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAACmB,mBAAA,EAAkB,CAAA;AAAA,sBACnBnB,GAAAA,CAACoB,aAAAA,EAAA,EAAc,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,sBAEvBlB,IAAAA,CAACgB,YAAAA,EAAA,EAAa,OAAA,EAAS,MAAM,cAAA,EAAe,EAAG,SAAA,EAAU,yBAAA,EAA0B,KAAA,EAAO,YAAA,EACvF,QAAA,EAAA;AAAA,QAAA,OAAA,mBACGlB,GAAAA,CAACC,SAAAA,EAAA,EAAU,SAAA,EAAU,wCAAA,EAAyC,CAAA,mBAC9DD,GAAAA,CAACe,MAAAA,EAAA,EAAO,SAAA,EAAU,wCAAA,EAAyC,CAAA;AAAA,wBAC/Df,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uCAAuC,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,wBACpEA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yDAAA,EAA2D,oBAAU,MAAA,EAAO,CAAA;AAAA,wBAC5FA,GAAAA,CAACqB,cAAAA,EAAA,EAAe,WAAU,4CAAA,EAA6C;AAAA,OAAA,EACzE,CAAA;AAAA,MACC;AAAA,KAAA,EACH,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,EAAgB,KAAA,KAAmC;AAIrE,IAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,SAAA,CAAU,QAAA,CAAS,CAAA,CAAE,EAAE,CAAC,CAAA;AACnG,MAAA,IAAI,eAAA,CAAgB,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACzC,MAAA,uBACEnB,IAAAA,CAAOe,KAAA,CAAA,QAAA,EAAN,EACC,QAAA,EAAA;AAAA,wBAAAjB,IAACoB,aAAAA,EAAA,EAAc,SAAA,EAAU,qEAAA,EACtB,eAAK,IAAA,EACR,CAAA;AAAA,QACC,eAAA,CAAgB,IAAI,CAAC,KAAA,KAAU,WAAW,KAAA,EAAO,KAAA,GAAQ,CAAC,CAAC;AAAA,OAAA,EAAA,EAJzC,KAAK,EAK1B,CAAA;AAAA,IAEJ;AACA,IAAA,IAAI,CAAC,SAAA,CAAU,QAAA,CAAS,IAAA,CAAK,EAAE,GAAG,OAAO,IAAA;AACzC,IAAA,uBACElB,IAAAA,CAAOe,KAAA,CAAA,QAAA,EAAN,EACC,QAAA,EAAA;AAAA,sBAAAf,IAAAA;AAAA,QAACgB,YAAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,MAAM,WAAA,CAAY,EAAE,MAAA,EAAQ,KAAK,EAAA,EAAI,QAAA,EAAU,IAAA,CAAK,IAAA,EAAM,CAAA;AAAA,UACnE,SAAA,EAAWI,EAAAA,CAAG,yBAAA,EAA2B,KAAA,GAAQ,KAAK,MAAM,CAAA;AAAA,UAE5D,QAAA,EAAA;AAAA,4BAAAtB,GAAAA,CAACC,SAAAA,EAAA,EAAU,SAAA,EAAU,wCAAA,EAAyC,CAAA;AAAA,4BAC9DD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAA,EAA2B,eAAK,IAAA,EAAK,CAAA;AAAA,YACpD,KAAK,cAAA,oBAAkBA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8CAA6C,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,YAC1F,YAAA,KAAiB,KAAK,EAAA,oBAAMA,IAACuB,KAAAA,EAAA,EAAM,WAAU,kBAAA,EAAmB;AAAA;AAAA;AAAA,OACnE;AAAA,MACC,IAAA,CAAK,SAAS,GAAA,CAAI,CAAC,UAAU,UAAA,CAAW,KAAA,EAAO,KAAA,GAAQ,CAAC,CAAC;AAAA,KAAA,EAAA,EAVvC,KAAK,EAW1B,CAAA;AAAA,EAEJ,CAAA;AAEA,EAAA,uBACErB,IAAAA,CAAAE,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAJ,GAAAA,CAACmB,mBAAA,EAAkB,CAAA;AAAA,oBACnBnB,GAAAA,CAACoB,aAAAA,EAAA,EAAc,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,IAGtB,UAAU,MAAA,GAAS,CAAA,oBAClBlB,IAAAA,CAACgB,YAAAA,EAAA,EAAa,OAAA,EAAS,MAAM,WAAA,CAAY,EAAE,QAAQ,MAAA,EAAW,QAAA,EAAU,qBAAqB,CAAA,EAAG,WAAU,yBAAA,EACxG,QAAA,EAAA;AAAA,sBAAAlB,GAAAA,CAACe,MAAAA,EAAA,EAAO,SAAA,EAAU,wCAAA,EAAyC,CAAA;AAAA,sBAC3Df,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2BAA0B,QAAA,EAAA,mBAAA,EAAiB,CAAA;AAAA,MAC1D,CAAC,YAAA,oBAAgBA,IAACuB,KAAAA,EAAA,EAAM,WAAU,kBAAA,EAAmB;AAAA,KAAA,EACxD,CAAA;AAAA,IAED,WAAA;AAAA,IACA,KAAK,GAAA,CAAI,CAAC,SAAS,UAAA,CAAW,IAAA,EAAM,CAAC,CAAC;AAAA,GAAA,EACzC,CAAA;AAEJ;AAKO,SAAS,aAAA,CAAc;AAAA,EAC5B,SAAA,GAAY,KAAA;AAAA,EACZ,MAAA,GAAS;AACX,CAAA,EAQG;AACD,EAAA,gBAAA,EAAiB;AACjB,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AAC/C,EAAA,MAAM,IAAA,GAAO,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACvC,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,SAAS,CAAA;AACjD,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AACzC,EAAA,MAAM,YAAA,GAAe,YAAA,CAAa,CAAC,CAAA,KAAM,EAAE,YAAY,CAAA;AAEvD,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,MAAM,YAAY,SAAA,CAAU,MAAA,GAAS,CAAA,GACjC,SAAA,GACA,MAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,QAAQ,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,EAAE,EAAE,CAAA;AAC5D,EAAA,IAAI,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEnC,EAAA,MAAM,OAAA,GAAU,YAAA,GAAe,IAAA,CAAK,YAAY,CAAA,GAAI,MAAA;AACpD,EAAA,MAAM,IAAA,GAAO,OAAA,EAAS,IAAA,KAAS,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,mBAAA,GAAsB,IAAA,CAAK,SAAA,CAAU,CAAC,CAAE,CAAA,EAAG,IAAA,IAAQ,EAAA,CAAA;AACzG,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBACEvB,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,KAAA,EAAO,IAAA,EACjD,QAAA,kBAAAA,GAAAA,CAACC,SAAAA,EAAA,EAAU,SAAA,EAAU,8BAA6B,CAAA,EACpD,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,IAAA,mBACJC,IAAAA,CAAAE,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAJ,GAAAA,CAACC,SAAAA,EAAA,EAAU,SAAA,EAAU,wCAAA,EAAyC,CAAA;AAAA,oBAC9DD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mEAAmE,QAAA,EAAA,IAAA,EAAK;AAAA,GAAA,EAC1F,CAAA;AAMF,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,wCAAA,EAAyC,KAAA,EAAO,MAAO,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,EACrF;AAKA,EAAA,uBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qDAAA,EAAsD,KAAA,EAAO,MAAO,QAAA,EAAA,IAAA,EAAK,CAAA;AACjG;ACzMA,IAAM,uBAAuB,EAAA,GAAK,EAAA;AAGlC,SAAS,SAAS,IAAA,EAAoB;AACpC,EAAA,UAAA,CAAW,IAAI,CAAA;AACf,EAAA,MAAA,CAAO,SAAS,MAAA,EAAO;AACzB;AAQA,eAAsB,mBAAmB,KAAA,EAKvB;AAChB,EAAA,MAAM,WAAW,qBAAA,EAAsB;AACvC,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,KAAY,MAAM,QAAA,CAAS,KAAK,UAAA,EAAW;AACzD,EAAA,MAAM,SAAS,OAAA,CAAQ,OAAA;AACvB,EAAA,IAAI,CAAC,MAAA,EAAQ,aAAA,EAAe,MAAM,IAAI,MAAM,uCAAoC,CAAA;AAEhF,EAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,QAAA,CAAS,SAAA,CAAU,OAAO,gBAAA,EAAkB;AAAA,IACxE,IAAA,EAAM,EAAE,IAAA,EAAM,oBAAA,EAAsB,QAAQ,EAAE,SAAA,EAAW,KAAA,CAAM,QAAA,EAAU,SAAS,KAAA,CAAM,MAAA,EAAQ,MAAA,EAAQ,KAAA,CAAM,QAAO;AAAE,GACxH,CAAA;AACD,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,IAAA,GAAO,MAAO,KAAA,CAAiC,OAAA,EAAS,QAAO,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AACvF,IAAA,MAAM,IAAI,KAAA,CAAM,IAAA,EAAM,KAAA,IAAS,MAAM,OAAO,CAAA;AAAA,EAC9C;AACA,EAAA,MAAM,EAAE,UAAA,EAAY,MAAA,EAAQ,UAAA,EAAW,GAAI,IAAA;AAM3C,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,MAAM,MAAA,GAA8B,EAAE,MAAA,EAAQ,MAAA,CAAO,OAAA,EAAS,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,IAAA,EAAM,MAAA,CAAO,IAAA,EAAM,IAAA,EAAM,OAAO,IAAA,EAAK;AACxH,EAAA,kBAAA,CAAmB;AAAA,IACjB,UAAU,KAAA,CAAM,QAAA;AAAA,IAChB,MAAA,EAAQ,MAAA;AAAA,IACR,SAAA,EAAW,GAAA;AAAA,IACX,SAAA,EAAW,GAAA,GAAA,CAAO,UAAA,IAAc,oBAAA,IAAwB,GAAA;AAAA,IACxD,UAAU,KAAA,CAAM,QAAA;AAAA,IAChB,QAAQ,EAAE,YAAA,EAAc,OAAO,YAAA,EAAc,aAAA,EAAe,OAAO,aAAA;AAAc,GAClF,CAAA;AAED,EAAA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAU,GAAI,MAAM,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,WAAA,EAAa,UAAA,EAAY,CAAA;AAC5F,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,IAAA,MAAM,QAAA,CAAS,IAAA,CAAK,UAAA,CAAW,EAAE,YAAA,EAAc,OAAO,YAAA,EAAc,aAAA,EAAe,MAAA,CAAO,aAAA,EAAe,CAAA;AACzG,IAAA,MAAM,IAAI,KAAA,CAAM,SAAA,CAAU,OAAO,CAAA;AAAA,EACnC;AAEA,EAAA,mBAAA,CAAoB,MAAM,QAAQ,CAAA;AAClC,EAAA,QAAA,CAAS,GAAG,CAAA;AACd;AAGA,eAAsB,iBAAA,GAAmC;AACvD,EAAA,MAAM,QAAQ,iBAAA,EAAkB;AAChC,EAAA,IAAI,CAAC,KAAA,EAAO;AACZ,EAAA,MAAM,WAAW,qBAAA,EAAsB;AACvC,EAAA,IAAI;AACF,IAAA,MAAM,SAAS,IAAA,CAAK,OAAA,CAAQ,EAAE,KAAA,EAAO,SAAS,CAAA;AAAA,EAChD,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,EAAA,MAAM,EAAE,OAAM,GAAI,MAAM,SAAS,IAAA,CAAK,UAAA,CAAW,MAAM,MAAM,CAAA;AAC7D,EAAA,mBAAA,CAAoB,MAAM,QAAQ,CAAA;AAClC,EAAA,QAAA,CAAS,KAAA,GAAQ,QAAA,GAAW,KAAA,CAAM,QAAA,IAAY,gBAAgB,CAAA;AAChE","file":"chunk-LO26TZS3.js","sourcesContent":["import * as React from 'react'\nimport { useDataVersion } from '@fayz-ai/core'\nimport { create } from 'zustand'\nimport {\n Button, Select, SelectTrigger, SelectValue, SelectContent, SelectItem, Badge,\n} from '@fayz-ai/ui'\nimport { AlertTriangle, Building2, Plus, X } from 'lucide-react'\nimport { usePermissionsStore } from '../permissions'\nimport { toast } from '../components/notifications/ToastProvider'\nimport { RightRailPage } from '../components/RightRailPage'\nimport { useUnitStore } from './store'\nimport { bindUserToUnit, fetchMemberUnits, unbindUserFromUnit, type UnitBinding, UNIT_ACCESS_CHANGED } from './data'\n\n// ---------------------------------------------------------------------------\n// \"Acesso por unidade\" — em quais unidades a pessoa trabalha, e o que ela pode\n// fazer a mais em cada uma.\n//\n// Na COLUNA da direita, e não numa gaveta própria. Era uma gaveta deslizando da\n// mesma borda que o assistente já ocupa, com largura, cabeçalho e botão de\n// fechar próprios — dois painéis com dois vocabulários disputando um lado da\n// tela. E é uma consulta, não um destino: quem abre isso quer ver as unidades\n// de alguém SEM perder de vista a lista de equipe que estava lendo.\n//\n// A frase do rodapé é o modelo inteiro, escrita por extenso em vez de\n// subentendida: função por unidade SOMA à da organização e nunca tira nada.\n// Quem já configurou Salesforce ou SAP espera poder subtrair aqui, e descobrir\n// por acidente que não dá é pior do que ser avisado.\n// ---------------------------------------------------------------------------\n\nconst NO_EXTRA_ROLE = '__none__'\n\ninterface MemberAccessPanelState {\n member: { userId: string; name: string; email?: string } | null\n openMember: (member: { userId: string; name: string; email?: string }) => void\n close: () => void\n}\n\n/** Uma pessoa aberta ao lado da lista, do mesmo jeito que uma unidade. */\nexport const useMemberAccessPanel = create<MemberAccessPanelState>((set) => ({\n member: null,\n openMember: (member) => set({ member }),\n close: () => set({ member: null }),\n}))\n\nexport function MemberAccessRailPage() {\n const member = useMemberAccessPanel((s) => s.member)\n const close = useMemberAccessPanel((s) => s.close)\n if (!member) return null\n return (\n <MemberAccessBody\n key={member.userId}\n userId={member.userId}\n displayName={member.name}\n email={member.email}\n onClose={close}\n />\n )\n}\n\nfunction MemberAccessBody({\n userId,\n displayName,\n email,\n onClose,\n}: {\n userId: string\n displayName: string\n email?: string\n onClose: () => void\n}) {\n const units = useUnitStore((s) => s.units)\n const byId = useUnitStore((s) => s.byId)\n const profiles = usePermissionsStore((s) => s.profiles)\n\n const [bindings, setBindings] = React.useState<UnitBinding[]>([])\n const [loading, setLoading] = React.useState(false)\n const [adding, setAdding] = React.useState(false)\n\n const branches = React.useMemo(() => units.filter((u) => u.isActive !== false), [units])\n const unbound = React.useMemo(\n () => branches.filter((u) => !bindings.some((b) => b.locationId === u.id)),\n [branches, bindings],\n )\n\n const reload = React.useCallback(async () => {\n if (!userId) return\n setLoading(true)\n try {\n setBindings(await fetchMemberUnits(userId))\n } finally {\n setLoading(false)\n }\n }, [userId])\n\n // Sem `open` na dependência: o painel só existe quando há alguém aberto, e a\n // `key` no id remonta ao trocar de pessoa. Uma pessoa por montagem, e nenhum\n // estado da anterior sobrevivendo à troca.\n // Inclui o sinal: o vínculo também muda pela aba Unidades da ficha e pela\n // lista de membros da unidade, e este painel fica aberto durante isso.\n const version = useDataVersion(UNIT_ACCESS_CHANGED)\n React.useEffect(() => { void reload() }, [reload, version])\n\n async function add(unitId: string) {\n try {\n await bindUserToUnit(unitId, userId, null)\n await reload()\n setAdding(false)\n } catch (err: any) {\n toast.error('Não deu para dar o acesso', { description: err?.message })\n }\n }\n\n async function setRole(unitId: string, role: string) {\n try {\n await bindUserToUnit(unitId, userId, role === NO_EXTRA_ROLE ? null : role)\n await reload()\n } catch (err: any) {\n toast.error('Não deu para mudar a função', { description: err?.message })\n }\n }\n\n async function remove(unitId: string) {\n try {\n await unbindUserFromUnit(unitId, userId)\n await reload()\n } catch (err: any) {\n toast.error('Não deu para tirar o acesso', { description: err?.message })\n }\n }\n\n return (\n <RightRailPage title={displayName} open onClose={onClose} width=\"max-w-md\">\n <div className=\"min-h-0 flex-1 space-y-4 overflow-y-auto p-4\">\n {email && <p className=\"text-xs text-muted-foreground\">{email}</p>}\n {!loading && bindings.length === 0 && (\n <div className=\"flex gap-3 rounded-lg border border-amber-400/40 bg-amber-400/10 p-3 text-sm\">\n <AlertTriangle className=\"mt-0.5 h-4 w-4 shrink-0 text-amber-600 dark:text-amber-400\" />\n <div className=\"space-y-2\">\n <p>Sem unidade — não vê agendamentos, pedidos nem caixa de nenhuma unidade.</p>\n {branches.find((u) => u.isHeadquarters) && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => void add(branches.find((u) => u.isHeadquarters)!.id)}\n >\n Dar acesso à matriz\n </Button>\n )}\n </div>\n </div>\n )}\n\n <div className=\"space-y-2\">\n {bindings.map((b) => {\n const unit = byId[b.locationId]\n return (\n <div key={b.locationId} className=\"flex items-center gap-2 rounded-lg border border-border p-2\">\n <Building2 className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"truncate text-sm\">{unit?.name ?? b.locationId}</div>\n {unit?.kind === 'region' && (\n <Badge variant=\"secondary\" className=\"mt-0.5 text-[10px]\">região — alcança as unidades abaixo</Badge>\n )}\n </div>\n <Select value={b.role ?? NO_EXTRA_ROLE} onValueChange={(v: string) => void setRole(b.locationId, v)}>\n <SelectTrigger className=\"h-8 w-36 text-xs\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value={NO_EXTRA_ROLE}>sem função extra</SelectItem>\n {profiles.map((p) => (\n <SelectItem key={p.id} value={p.id}>{p.name}</SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Button size=\"icon\" variant=\"ghost\" onClick={() => void remove(b.locationId)} aria-label=\"Remover\">\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n )\n })}\n </div>\n\n {adding ? (\n <Select onValueChange={(v: string) => void add(v)}>\n <SelectTrigger className=\"h-9\">\n <SelectValue placeholder=\"Escolha a unidade ou região\" />\n </SelectTrigger>\n <SelectContent>\n {unbound.map((u) => (\n <SelectItem key={u.id} value={u.id}>\n {u.name}{u.kind === 'region' ? ' (região)' : ''}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : (\n <Button size=\"sm\" variant=\"outline\" onClick={() => setAdding(true)} disabled={unbound.length === 0}>\n <Plus className=\"mr-1.5 h-3.5 w-3.5\" />\n Adicionar unidade\n </Button>\n )}\n </div>\n\n {/* Fixo no rodapé da coluna: é a regra que a pessoa precisa ter na frente\n enquanto mexe, não depois de rolar até o fim. */}\n {/* pr-12: o botão do assistente flutua neste canto e cobria o fim da\n frase. Folga local em vez de mexer na posição do FAB, que é da casca. */}\n <div className=\"border-t border-border p-4 pr-12\">\n <p className=\"text-xs text-muted-foreground\">\n As funções por unidade <strong>somam</strong> à função da organização; nunca removem.\n Vincular alguém a uma região dá acesso a todas as unidades dentro dela.\n </p>\n </div>\n </RightRailPage>\n )\n}\n","import * as React from 'react'\nimport {\n Button, Dropdown, DropdownTrigger, DropdownContent, DropdownItem, DropdownLabel, DropdownSeparator,\n Skeleton, cn,\n Input,\n} from '@fayz-ai/ui'\nimport { Building2, Check, ChevronsUpDown, Layers, Search } from 'lucide-react'\nimport { useUnitStore, type UnitNode } from './store'\nimport { useUnitBootstrap } from './useUnitBootstrap'\nimport { useUnitSwitchingStore } from './switching.store'\nimport { useTranslation } from '../hooks/useTranslation'\n\n// ---------------------------------------------------------------------------\n// The unit line, under the workspace line.\n//\n// Not inside the workspace menu, and that is the whole design decision: the\n// unit changes what every number on screen means, and for a franchise reading\n// the wrong unit's till is the single most expensive mistake available. A\n// person must never have to click to find out where they are standing.\n//\n// It renders NOTHING when the tenant does not work with units, so the cost to\n// everyone else is zero pixels.\n// ---------------------------------------------------------------------------\n\nfunction label(t: (k: string) => string, key: string, fallback: string): string {\n const v = t(key)\n return !v || v === key ? fallback : v\n}\n\nfunction initials(name: string): string {\n const parts = name.trim().split(/\\s+/)\n return ((parts[0]?.[0] ?? '') + (parts[1]?.[0] ?? '')).toUpperCase() || name.slice(0, 2).toUpperCase()\n}\n\nexport function UnitSwitcher({ collapsed = false, className }: {\n collapsed?: boolean\n /**\n * Restyles the TRIGGER for a surface that is not the rail.\n *\n * The defaults below are written in `sidebar-*` tokens, which are the right\n * ink in the only place this used to be meant for. The POS band paints from\n * its own `--pos-*` palette, so a host mounting this there hands over the\n * classes instead of inheriting colours that resolve to nothing.\n */\n className?: string\n}) {\n // Asked for here rather than from an app-root initializer: the surface that\n // needs the tree is the one that should load it, and the store dedupes.\n useUnitBootstrap()\n const { t } = useTranslation()\n const unitMode = useUnitStore((s) => s.unitMode)\n const loading = useUnitStore((s) => s.loading)\n const units = useUnitStore((s) => s.units)\n const tree = useUnitStore((s) => s.tree)\n const byId = useUnitStore((s) => s.byId)\n const myUnitIds = useUnitStore((s) => s.myUnitIds)\n const activeUnitId = useUnitStore((s) => s.activeUnitId)\n // A troca passa pela transição, não por `setActive` direto: mudar de unidade\n // termina num reload (ver switching.store), e sem cobertura isso lê como\n // travamento. `begin` grava o pino ANTES de levantar a cobertura.\n const beginSwitch = useUnitSwitchingStore((s) => s.begin)\n\n // Uma rede de franquia tem dezenas de unidades — o Espaço Facial tem 65.\n // Rolar uma lista dessas para achar \"Copacabana\" não é escolher, é procurar.\n const [query, setQuery] = React.useState('')\n\n const singular = label(t, 'unit.singular', 'unidade')\n const plural = label(t, 'unit.plural', 'unidades')\n\n if (!unitMode) return null\n\n if (loading) {\n // Same height as the resolved row, so the sidebar does not jump.\n return collapsed\n ? <Skeleton className=\"mx-auto h-5 w-5 rounded bg-sidebar-accent\" />\n : <Skeleton className=\"h-5 w-28 rounded-button bg-sidebar-accent\" />\n }\n\n const reachable = myUnitIds.length > 0 ? myUnitIds : units.filter((u) => u.kind !== 'region').map((u) => u.id)\n const current = activeUnitId ? byId[activeUnitId] : undefined\n const allLabel = `${label(t, 'units.all', 'Todas as')} ${plural}`\n const currentLabel = current?.name ?? allLabel\n\n // A busca aparece quando a lista deixa de caber na cabeça de alguém. Abaixo\n // disso ela é um campo a mais entre a pessoa e o clique que ela já sabia dar.\n const searchable = reachable.length > 8\n const term = query.trim().toLowerCase()\n const matches = term\n ? units.filter((u) => u.kind !== 'region' && reachable.includes(u.id) && u.name.toLowerCase().includes(term))\n : []\n\n if (reachable.length === 0) return null\n\n // One unit is not a choice. A dropdown holding a single item is a control that\n // lies about what it can do.\n if (reachable.length === 1) {\n const only = byId[reachable[0]!]\n if (!only) return null\n return collapsed ? (\n <div className=\"flex justify-center py-0.5\" title={only.name}>\n <Building2 className=\"h-3.5 w-3.5 text-sidebar-muted\" />\n </div>\n ) : (\n <div className=\"flex items-center gap-1.5 px-1.5 py-0.5\" title={only.name}>\n <Building2 className=\"h-3.5 w-3.5 shrink-0 text-sidebar-muted\" />\n <span className=\"min-w-0 truncate text-xs text-sidebar-muted\">{only.name}</span>\n </div>\n )\n }\n\n const renderNode = (node: UnitNode, depth: number): React.ReactNode => {\n // A region groups; it is not somewhere you can stand. Selecting one would\n // mean sending its children as a filter from the browser, which is exactly\n // the shape this whole feature exists to avoid.\n if (node.kind === 'region') {\n return (\n <React.Fragment key={node.id}>\n <DropdownLabel className=\"px-2 pt-2 text-[10px] uppercase tracking-wide text-muted-foreground\">\n {node.name}\n </DropdownLabel>\n {node.children.map((child) => renderNode(child, depth + 1))}\n </React.Fragment>\n )\n }\n if (!reachable.includes(node.id)) return null\n return (\n <React.Fragment key={node.id}>\n <DropdownItem\n onSelect={() => beginSwitch({ unitId: node.id, unitName: node.name })}\n className={cn('flex items-center gap-2', depth > 0 && 'pl-6')}\n >\n <Building2 className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate\">{node.name}</span>\n {node.isHeadquarters && (\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">{label(t, 'units.hq', 'matriz')}</span>\n )}\n {activeUnitId === node.id && <Check className=\"h-3.5 w-3.5 shrink-0\" />}\n </DropdownItem>\n {node.children.map((child) => renderNode(child, depth + 1))}\n </React.Fragment>\n )\n }\n\n return (\n <Dropdown>\n <DropdownTrigger asChild>\n <Button\n variant=\"bare\"\n size=\"bare\"\n className={cn(\n 'group flex items-center rounded-lg text-left transition-colors hover:bg-sidebar-accent/60 justify-start whitespace-normal text-[length:inherit] font-normal',\n collapsed ? 'justify-center p-1' : 'w-full gap-1.5 px-1.5 py-0.5',\n className,\n )}\n title={currentLabel}\n aria-label={`${singular}: ${currentLabel}`}\n >\n {collapsed ? (\n <span className=\"text-[10px] font-semibold text-sidebar-muted\">\n {current ? initials(current.name) : '••'}\n </span>\n ) : (\n <>\n <Building2 className=\"h-3.5 w-3.5 shrink-0 text-sidebar-muted\" />\n <span className=\"min-w-0 flex-1 truncate text-xs text-sidebar-muted\">{currentLabel}</span>\n <ChevronsUpDown className=\"h-3 w-3 shrink-0 text-sidebar-muted transition-colors group-hover:text-sidebar-foreground\" />\n </>\n )}\n </Button>\n </DropdownTrigger>\n <DropdownContent align=\"start\" className=\"w-64\">\n <DropdownItem\n onSelect={() => beginSwitch({ unitId: undefined, unitName: allLabel })}\n className=\"flex items-center gap-2\"\n >\n <Layers className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate\">{allLabel}</span>\n {!activeUnitId && <Check className=\"h-3.5 w-3.5 shrink-0\" />}\n </DropdownItem>\n <DropdownSeparator />\n {searchable && (\n <div className=\"relative px-2 py-1.5\">\n <Search className=\"pointer-events-none absolute left-4 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\" />\n <Input\n type=\"search\"\n autoFocus\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n // O menu fecha na tecla; sem isto não dá para digitar dentro dele.\n onKeyDown={(e) => e.stopPropagation()}\n placeholder={label(t, 'units.search', 'Buscar unidade')}\n className=\"h-auto rounded-md border-border bg-background py-1 pl-7 pr-2 text-xs shadow-none focus:border-primary focus-visible:ring-0 focus-visible:ring-offset-0\"\n />\n </div>\n )}\n {/* Buscando, a ÁRVORE SAI DO CAMINHO: uma lista achatada dos que casam\n responde \"onde está a Copacabana\", que é a pergunta. Sem busca, a\n hierarquia volta, porque aí ela é o que dá sentido à ordem. */}\n <div className={cn(searchable && 'max-h-72 overflow-y-auto')}>\n {term\n ? (matches.length > 0\n ? matches.map((u) => (\n <DropdownItem\n key={u.id}\n onSelect={() => beginSwitch({ unitId: u.id, unitName: u.name })}\n className=\"flex items-center gap-2\"\n >\n <Building2 className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate\">{u.name}</span>\n {activeUnitId === u.id && <Check className=\"h-3.5 w-3.5 shrink-0\" />}\n </DropdownItem>\n ))\n : (\n <p className=\"px-3 py-2 text-xs text-muted-foreground\">\n {label(t, 'units.searchEmpty', 'Nenhuma unidade com esse nome')}\n </p>\n ))\n : tree.map((node) => renderNode(node, 0))}\n </div>\n </DropdownContent>\n </Dropdown>\n )\n}\n","import React from 'react'\nimport type { DetailTab } from '@fayz-ai/core'\nimport { usePluginRuntimeOptional, getWidgetsForZone } from '@fayz-ai/core'\n\n/**\n * The tabs of the V1 company form that belong to OTHER modules: rooms (registry),\n * stock locations (inventory), the turn queue (agenda), the A1 certificate and\n * fiscal issuing (fiscal-br). The unit screen only names the slot; the plugin\n * that owns the data contributes the widget. Without the plugin the tab does\n * not exist, instead of existing empty.\n */\nexport const UNIT_DETAIL_ZONES = {\n rooms: 'unit.detail.rooms',\n stockLocations: 'unit.detail.stock-locations',\n turnQueue: 'unit.detail.turn-queue',\n certificate: 'unit.detail.certificate',\n fiscal: 'unit.detail.fiscal',\n} as const\n\nfunction zoneTab(zone: string) {\n return function UnitZoneTab({ item }: { item?: any }) {\n const runtime = usePluginRuntimeOptional()\n const widgets = runtime ? getWidgetsForZone(runtime, zone) : []\n if (!widgets.length || !item?.id) return null\n return (\n <div className=\"space-y-4\">\n {widgets.map((w) => {\n const Widget = w.component as React.ComponentType<any>\n return <Widget key={w.id} item={item} config={w.config} runtime={runtime?.context} plugin={w.plugin} widget={w} />\n })}\n </div>\n )\n }\n}\n\n/**\n * Rooms and stock locations are two tables (`public.rooms`, owned by registry;\n * `plg_inventory_stock_locations`, owned by inventory) answering two questions\n * — where people are attended, where goods are kept — so they share a tab but\n * not a list: one section each, with a line saying what it is for.\n */\nconst LOCATION_SECTIONS = [\n {\n zone: UNIT_DETAIL_ZONES.rooms,\n title: 'Locais operacionais',\n description: 'Salas, cadeiras e boxes onde se atende. A lotação limita quantas pessoas a agenda marca no mesmo horário.',\n },\n {\n zone: UNIT_DETAIL_ZONES.stockLocations,\n title: 'Locais de estoque',\n description: 'Onde os produtos ficam guardados nesta unidade. Entradas, saídas e contagens dizem de qual local.',\n },\n]\n\nfunction UnitLocationsTab({ item }: { item?: any }) {\n const runtime = usePluginRuntimeOptional()\n if (!item?.id || !runtime) return null\n const sections = LOCATION_SECTIONS\n .map((s) => ({ ...s, widgets: getWidgetsForZone(runtime, s.zone) }))\n .filter((s) => s.widgets.length > 0)\n return (\n <div className=\"space-y-8\">\n {sections.map((s) => (\n <section key={s.zone} className=\"space-y-3\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">{s.title}</h3>\n <p className=\"text-xs text-muted-foreground\">{s.description}</p>\n </div>\n {s.widgets.map((w) => {\n const Widget = w.component as React.ComponentType<any>\n return <Widget key={w.id} item={item} config={w.config} runtime={runtime.context} plugin={w.plugin} widget={w} />\n })}\n </section>\n ))}\n </div>\n )\n}\n\nexport const UNIT_DETAIL_TABS: DetailTab[] = [\n {\n id: 'locations', label: 'Locais', icon: 'MapPin', component: UnitLocationsTab,\n aliases: ['rooms', 'stock-locations'],\n // Keyed on rooms: registry is universal, so the tab exists wherever there are units.\n requiresWidgetZone: UNIT_DETAIL_ZONES.rooms,\n },\n { id: 'turn-queue', label: 'Lista da vez', icon: 'ListOrdered', component: zoneTab(UNIT_DETAIL_ZONES.turnQueue), requiresWidgetZone: UNIT_DETAIL_ZONES.turnQueue },\n // The archetype placeholders (\"coming soon\") answer nothing the V1 asked here.\n { id: 'schedule', label: 'Hours', hidden: true },\n { id: 'stats', label: 'Statistics', hidden: true },\n { id: 'activity', label: 'Activity', hidden: true },\n]\n","import React from 'react'\nimport { Input, SearchSelect, type SearchSelectOption } from '@fayz-ai/ui'\nimport { getSupabaseClientOptional, maskCpfCnpj } from '@fayz-ai/core'\nimport type { FieldDef } from '@fayz-ai/core'\n\n/**\n * Free text with the values other units already use as suggestions — the V1\n * \"Selecione ou digite\" of Tipo de loja and Categoria de loja. A `select` would\n * freeze a vocabulary nobody declared; plain text would let \"Shopping\" and\n * \"shopping \" become two categories in the network report.\n */\nfunction SuggestInput({ column, value, onChange, placeholder }: {\n column: string\n value: string\n onChange: (next: string | null) => void\n placeholder?: string\n}) {\n const search = React.useCallback(async (query: string): Promise<SearchSelectOption[]> => {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return []\n const { data } = await supabase.from('v_units').select(column).not(column, 'is', null).limit(500)\n const seen = new Map<string, string>()\n for (const row of (data ?? []) as Record<string, string>[]) {\n const v = String(row[column] ?? '').trim()\n if (v && !seen.has(v.toLowerCase())) seen.set(v.toLowerCase(), v)\n }\n const q = query.trim().toLowerCase()\n return [...seen.values()]\n .filter((v) => !q || v.toLowerCase().includes(q))\n .sort((a, b) => a.localeCompare(b, 'pt-BR'))\n .map((v) => ({ id: v, label: v }))\n }, [column])\n\n return (\n <SearchSelect\n value={value || undefined}\n displayValue={value || undefined}\n onChange={(id) => onChange(id || null)}\n onSearch={search}\n minChars={0}\n placeholder={placeholder ?? 'Selecione ou digite'}\n noResultsLabel=\"Nenhum valor usado ainda\"\n searchingLabel=\"Buscando…\"\n clearLabel=\"Limpar\"\n allowCreate\n createLabel=\"Usar\"\n onCreate={(query) => onChange(query.trim() || null)}\n />\n )\n}\n\nexport function suggestedTextField(field: Omit<FieldDef, 'type' | 'renderInput'> & { column: string }): FieldDef {\n const { column, ...rest } = field\n return {\n ...rest,\n type: 'custom',\n renderInput: ({ value, onChange }) => (\n <SuggestInput column={column} value={(value as string) ?? ''} onChange={onChange} placeholder={rest.placeholder} />\n ),\n }\n}\n\n/** CNPJ typed with the mask, stored as digits (the v_units trigger strips the rest). */\nexport function cnpjField(field: Omit<FieldDef, 'type' | 'renderInput'>): FieldDef {\n return {\n ...field,\n type: 'custom',\n renderInput: ({ value, onChange }) => (\n <Input\n inputMode=\"numeric\"\n value={maskCpfCnpj(String(value ?? ''))}\n placeholder={field.placeholder ?? '00.000.000/0000-00'}\n onChange={(e) => onChange(e.target.value.replace(/\\D/g, '').slice(0, 14) || null)}\n />\n ),\n }\n}\n","import { createCrudPage } from '../../crud/createCrudPage'\n// Core's EntityDef (the type createCrudPage consumes) carries `limitKey` for\n// plan quantity gating; the shell alias does not.\nimport type { EntityDef } from '@fayz-ai/core'\nimport { RECORD_GROUP, recordRailFields, activeFacet, getSupabaseClientOptional, maskCpfCnpj } from '@fayz-ai/core'\nimport { UNIT_DETAIL_TABS, UNIT_DETAIL_ZONES } from '../../units/UnitDetailTabs'\nimport { suggestedTextField, cnpjField } from '../../units/UnitSuggestField'\n\n// V1 lib/timezones.ts — the official Brazilian zones, no DST since 2019.\nconst BR_TIMEZONES = [\n { value: 'America/Noronha', label: 'UTC−2 · Fernando de Noronha' },\n { value: 'America/Sao_Paulo', label: 'UTC−3 · Brasília (SP, RJ, MG, ES, PR, SC, RS, GO, DF)' },\n { value: 'America/Bahia', label: 'UTC−3 · Bahia' },\n { value: 'America/Fortaleza', label: 'UTC−3 · Fortaleza (CE, MA, PI, RN, PB)' },\n { value: 'America/Recife', label: 'UTC−3 · Recife (PE)' },\n { value: 'America/Maceio', label: 'UTC−3 · Maceió (AL, SE)' },\n { value: 'America/Belem', label: 'UTC−3 · Belém (PA, AP)' },\n { value: 'America/Araguaina', label: 'UTC−3 · Araguaína (TO)' },\n { value: 'America/Cuiaba', label: 'UTC−4 · Cuiabá (MT)' },\n { value: 'America/Campo_Grande', label: 'UTC−4 · Campo Grande (MS)' },\n { value: 'America/Manaus', label: 'UTC−4 · Manaus (AM)' },\n { value: 'America/Porto_Velho', label: 'UTC−4 · Porto Velho (RO)' },\n { value: 'America/Boa_Vista', label: 'UTC−4 · Boa Vista (RR)' },\n { value: 'America/Rio_Branco', label: 'UTC−5 · Rio Branco (AC)' },\n { value: 'America/Eirunepe', label: 'UTC−5 · Oeste do Amazonas (Eirunepé)' },\n]\n\nconst LOGO_BUCKET = 'avatars'\n\nasync function uploadUnitLogo(file: File, row: Record<string, any>): Promise<string> {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) throw new Error('O armazenamento não está configurado.')\n const ext = (file.name.split('.').pop() ?? 'png').toLowerCase().replace(/[^a-z0-9]/g, '') || 'png'\n // A fresh name each time: a stable one is overwritten while the old URL is still cached on screen.\n const path = `units/${row.id}/logo-${Date.now()}.${ext}`\n const { error } = await supabase.storage.from(LOGO_BUCKET).upload(path, file, { upsert: true })\n if (error) throw error\n const url = supabase.storage.from(LOGO_BUCKET).getPublicUrl(path).data.publicUrl as string\n const { error: saveError } = await supabase.from('v_units').update({ logo_url: url }).eq('id', row.id)\n if (saveError) throw saveError\n return url\n}\n\nasync function removeUnitLogo(row: Record<string, any>): Promise<void> {\n const supabase = getSupabaseClientOptional() as any\n if (!supabase) return\n const { error } = await supabase.from('v_units').update({ logo_url: null }).eq('id', row.id)\n if (error) throw error\n}\n\nexport const locationEntityDef: EntityDef = {\n // V1 calls the screen \"Empresas\" (Configurações → Empresa): each row is a\n // company — HQ or branch — and becomes a unit everywhere else.\n name: 'Empresa',\n namePlural: 'Empresas',\n icon: 'Building2',\n layout: 'location',\n displayField: 'name',\n subtitleField: 'city',\n defaultSort: 'name',\n // Plan quantity cap — the generic CRUD (CrudFormPage/CrudPage/CrudListView)\n // guards create/import and dims \"+ Add\" at the cap. Core declares 'locations'.\n limitKey: 'locations',\n formColumns: 2,\n facets: [activeFacet({ active: 'Ativas', inactive: 'Inativas', all: 'Todas' })],\n image: {\n get: (row) => row.logoUrl ?? undefined,\n upload: uploadUnitLogo,\n remove: removeUnitLogo,\n accept: 'image/png,image/jpeg,image/webp,image/svg+xml',\n },\n // The V1 company form (Configurações → Empresa), block by block. The tabs that\n // belong to other modules — rooms, stock locations, turn queue, certificate,\n // fiscal issuing — are detail tabs, contributed by the plugin that owns them.\n fieldGroups: [\n { id: 'identity', label: 'Identificação', columns: 3, imageSlot: true },\n { id: 'where', label: 'Endereço', columns: 1 },\n { id: 'network', label: 'Classificação na rede', description: 'Alimenta os filtros dos relatórios de rede. Escolha um valor já usado ou digite um novo.', columns: 3 },\n { id: 'contacts', label: 'Contatos', columns: 2 },\n { id: 'channels', label: 'Canais de divulgação', description: 'Perfis e contatos usados nas peças de campanha e no atendimento.', columns: 3 },\n { id: 'settings', label: 'Configurações', description: 'Valem só para esta unidade. Sem mexer, ela segue o padrão da casa.', columns: 2 },\n { id: 'notes', label: 'Observações', columns: 1 },\n { id: 'tax', label: 'Identidade fiscal', description: 'Do CNPJ desta unidade. Unidades com o mesmo CNPJ dividem estes dados.', columns: 3, tab: 'Fiscal', tabIcon: 'FileText',\n // The certificate and the issuer config are fiscal-br's; they draw here, under the CNPJ's fields.\n detailZones: [UNIT_DETAIL_ZONES.certificate, UNIT_DETAIL_ZONES.fiscal] },\n { ...RECORD_GROUP },\n ],\n fields: [\n // V1's first column: the matriz/filial badge.\n { key: 'unitType', label: 'Tipo', type: 'text', showInForm: false, showInDetail: false,\n renderCell: (_v, row) => {\n const r = row as { isHeadquarters?: boolean; kind?: string }\n return r.isHeadquarters ? 'Matriz' : r.kind === 'region' ? 'Região' : 'Filial'\n } },\n { key: 'legalName', label: 'Razão social', type: 'text', showInTable: true, searchable: true, group: 'identity', span: 2 },\n { key: 'name', label: 'Nome fantasia', type: 'text', required: true, showInTable: true, searchable: true, group: 'identity', hint: 'É o nome que aparece nos filtros e no seletor de unidade.' },\n { key: 'abbreviation', label: 'Abreviação', type: 'text', group: 'identity', placeholder: 'Ex.: TIJ' },\n { ...cnpjField({ key: 'cnpj', label: 'CNPJ', showInTable: true, searchable: true, group: 'identity', hint: 'Opcional. Obrigatório para emitir nota ou receber DANFes.' }),\n renderCell: (v) => (v ? maskCpfCnpj(String(v)) : '—') },\n // The two columns migration 039 added. A `region` groups branches and is\n // never somewhere anyone stands — bind a manager to it and they reach every\n // branch under it, which is the whole reason regions exist.\n {\n key: 'kind',\n label: 'Tipo',\n type: 'segmented',\n defaultValue: 'branch',\n // The view reads `hq` for the headquarters, which this segmented does not\n // offer: the matriz is the \"Esta é a matriz?\" toggle, as in V1.\n showInTable: false,\n showInDetail: false,\n group: 'identity',\n visibleWhen: (values) => !values.isHeadquarters,\n options: [\n { label: 'Unidade', value: 'branch', description: 'Onde o atendimento acontece' },\n { label: 'Região', value: 'region', description: 'Agrupa unidades; ninguém trabalha nela' },\n ],\n },\n {\n key: 'parentId',\n label: 'Região',\n type: 'relation',\n showInTable: true,\n group: 'network',\n relation: { table: 'v_units', labelField: 'name', filter: { kind: 'region' } },\n hint: 'Deixe vazio se a unidade não pertence a uma região.',\n },\n { key: 'code', label: 'Código', type: 'text', searchable: true, hint: 'O código que a rede já usa no papel (ex. RJ-042).', group: 'identity' },\n { key: 'address', label: 'Endereço', type: 'address', showInTable: false, showInDetail: false, group: 'where' },\n { key: 'phone', label: 'Telefone 1', type: 'phone', group: 'contacts' },\n { key: 'phone2', label: 'Telefone 2', type: 'phone', group: 'contacts' },\n { key: 'mobile1', label: 'Celular 1', type: 'phone', group: 'contacts' },\n { key: 'mobile2', label: 'Celular 2', type: 'phone', group: 'contacts' },\n // O endereço vem de `public.addresses` (141) e se edita no bloco próprio,\n // igual ao da ficha da pessoa. Continua aqui para a LISTA — cidade e UF são\n // como se reconhece uma unidade numa rede — mas não como campo solto na\n // ficha nem no formulário: rua, número e CEP separados por outros campos\n // não se leem como endereço, e dois lugares para escrever a mesma coisa\n // foi o que deixou um JSON inteiro dentro do input de uma linha.\n { key: 'city', label: 'Cidade', type: 'text', showInTable: true, showInForm: false, showInDetail: false, group: 'identity' },\n { key: 'state', label: 'UF', type: 'text', showInTable: true, showInForm: false, showInDetail: false, group: 'identity' },\n { key: 'country', label: 'País', type: 'text', defaultValue: 'BR', showInForm: false, showInDetail: false, group: 'identity' },\n { key: 'postalCode', label: 'CEP', type: 'text', showInForm: false, showInDetail: false, group: 'identity' },\n // Servem a uma coisa só: oferecer \"a unidade mais perto de mim\" a quem\n // entra pela primeira vez e alcança várias. Editam-se no bloco de endereço\n // (142) — coordenada é a posição de UM endereço, e separada dele a\n // primeira mudança de rua deixa o ponteiro na loja antiga. Continuam\n // declaradas porque a view as publica e o `geo` as lê.\n { key: 'latitude', label: 'Latitude', type: 'number', showInForm: false, showInDetail: false, group: 'identity' },\n { key: 'longitude', label: 'Longitude', type: 'number', showInForm: false, showInDetail: false, group: 'identity' },\n { key: 'email', label: 'E-mail 1', type: 'email', group: 'contacts' },\n { key: 'email2', label: 'E-mail 2', type: 'email', group: 'contacts' },\n { key: 'isHeadquarters', label: 'Esta é a matriz?', type: 'boolean', showInTable: true, group: 'identity', inlineToggle: true },\n\n { key: 'coordinatorPersonId', label: 'Coordenador(a)', type: 'relation', group: 'network',\n relation: { table: 'people', labelField: 'name' } },\n suggestedTextField({ key: 'storeType', column: 'store_type', label: 'Tipo de loja', group: 'network', placeholder: 'Ex.: Rua, Shopping' }),\n suggestedTextField({ key: 'storeCategory', column: 'store_category', label: 'Categoria de loja', group: 'network', placeholder: 'Ex.: A, B, C' }),\n\n { key: 'instagramHandle', label: 'Instagram (@)', type: 'text', group: 'channels', placeholder: '@suaempresa' },\n { key: 'facebookHandle', label: 'Facebook', type: 'text', group: 'channels', placeholder: '/suaempresa' },\n { key: 'tiktokHandle', label: 'TikTok', type: 'text', group: 'channels', placeholder: '@suaempresa' },\n { key: 'website', label: 'Site', type: 'url', group: 'channels', placeholder: 'www.suaempresa.com' },\n { key: 'whatsappNumber', label: 'WhatsApp (divulgação)', type: 'phone', group: 'channels' },\n { key: 'marketingPhone', label: 'Telefone de marketing', type: 'phone', group: 'channels' },\n\n { key: 'timezone', label: 'Fuso horário', type: 'select', group: 'settings', span: 2, options: BR_TIMEZONES, showInDetail: false },\n { key: 'autoDdd', label: 'DDD automático', type: 'boolean', inlineToggle: true, group: 'settings', hint: 'Telefone digitado sem DDD recebe o desta unidade.', showInDetail: false },\n { key: 'daylightSaving', label: 'Horário de verão', type: 'boolean', inlineToggle: true, group: 'settings', showInDetail: false },\n { key: 'onlineBookingEnabled', label: 'Agendamento online', type: 'boolean', inlineToggle: true, group: 'settings', hint: 'A unidade aparece para quem agenda pela internet.', showInDetail: false },\n { key: 'requireOpenCashSession', label: 'Receber só com caixinha aberto', type: 'boolean', inlineToggle: true, group: 'settings', hint: 'Maquininha e Balcão recusam a cobrança de quem não abriu o próprio caixinha nesta unidade.', showInDetail: false },\n\n\n { key: 'municipalRegistration', label: 'Inscrição municipal', type: 'text', group: 'tax', hint: 'No padrão nacional da NFS-e é opcional. Na dúvida, deixe em branco.' },\n { key: 'stateRegistration', label: 'Inscrição estadual', type: 'text', group: 'tax', placeholder: 'ISENTO se for o caso' },\n { key: 'taxRegime', label: 'Regime tributário', type: 'select', group: 'tax', options: [\n { label: 'Simples Nacional', value: 'simples_nacional' },\n { label: 'Simples Nacional — excesso', value: 'simples_nacional_excesso' },\n { label: 'Regime normal (Lucro Presumido / Real)', value: 'regime_normal' },\n ] },\n { key: 'cnae', label: 'CNAE principal', type: 'text', group: 'tax', placeholder: '0000-0/00' },\n { key: 'ibgeCityCode', label: 'Código IBGE do município', type: 'text', group: 'tax', hint: 'A NFS-e é roteada pela prefeitura deste código.' },\n { key: 'fiscalEmail', label: 'E-mail fiscal', type: 'email', group: 'tax', hint: 'Para onde a prefeitura e a SEFAZ mandam retorno.' },\n { key: 'logoUrl', label: 'Logo', type: 'image', showInForm: false, showInDetail: false, showInTable: false },\n // O rail padrão de todo cadastro. Sem `unit`: esta ficha É a unidade.\n ...recordRailFields({ tagsTable: 'v_units', activeLabel: 'Ativa', unit: false }),\n ],\n data: {\n // `public.locations` is gone: units live in schema `app` and `v_units` is the\n // public bridge. It reads every field below and, since 140, writes them\n // too: an INSTEAD OF trigger folds the address back into `app.units`\n // metadata and puts a `kind` outside hq|branch into `legacy_kind`.\n table: 'v_units',\n tenantScoped: true,\n searchColumns: ['name', 'legal_name', 'cnpj', 'city', 'state', 'code'],\n addressOwnerType: 'unit',\n // camelCase→snake does not split a digit off: `email2` would look for column `email2`.\n columnMap: { phone_2: 'phone2', mobile_1: 'mobile1', mobile_2: 'mobile2', email_2: 'email2' },\n defaults: { kind: 'branch' },\n // The tree is never narrowed by the unit you are standing in: the switcher\n // has to be able to name a unit whose data you cannot see, and so does the\n // \"Unidade: Ipanema\" line on a record.\n unitScoped: false,\n },\n}\n\nlocationEntityDef.detailTabs = UNIT_DETAIL_TABS\n\n// The V1 list columns, in its order: Tipo · Razão Social · Nome Fantasia · CNPJ ·\n// Cidade · UF · Status. Every other field is form/detail only.\nconst LIST_COLUMNS = ['unitType', 'legalName', 'name', 'cnpj', 'city', 'state', 'isActive']\nlocationEntityDef.fields = locationEntityDef.fields.map((f) => ({ ...f, showInTable: LIST_COLUMNS.includes(f.key) }))\n\nexport const LocationsCrudPage = createCrudPage(locationEntityDef)\n// Set basePath for hash-based sub-routing inside settings tab\n;(LocationsCrudPage as any).__crudBasePath = '/settings/locations'\n","import * as React from 'react'\nimport { LocationsCrudPage } from '../components/settings/LocationsCrudPage'\nimport { useUnitBootstrap } from './useUnitBootstrap'\n\n// Settings → Unidades: the list of them.\n//\n// The switch that decides whether units MEAN anything moved to Settings →\n// Geral, next to name, timezone and currency — that shelf is for how this\n// business is shaped, and this one is for the things themselves. Keeping both\n// here made the screen answer two different questions at once.\nexport function UnitsSettingsPage() {\n useUnitBootstrap()\n return <LocationsCrudPage />\n}\n","import * as React from 'react'\nimport { create } from 'zustand'\nimport { Badge, Button } from '@fayz-ai/ui'\nimport { Building2, MapPin, Settings2 } from 'lucide-react'\nimport { RightRailPage } from '../components/RightRailPage'\nimport { useUnitStore } from './store'\nimport { UnitMembersTab } from './UnitMembersTab'\nimport { navigateApp } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// A unit, opened beside what you were reading instead of instead of it.\n//\n// Clicking \"Ipanema\" on a team row used to have to mean leaving the team\n// screen. It is a lookup, not a destination: you want to know who is in that\n// unit while still looking at the person who is in it. The right column already\n// hosts pages from elsewhere in the app for exactly this reason, so this is one\n// more of them rather than a fourth kind of panel.\n// ---------------------------------------------------------------------------\n\ninterface UnitPanelState {\n unitId: string | null\n openUnit: (id: string) => void\n close: () => void\n}\n\nexport const useUnitPanel = create<UnitPanelState>((set) => ({\n unitId: null,\n openUnit: (id) => set({ unitId: id }),\n close: () => set({ unitId: null }),\n}))\n\nexport function UnitRailPage() {\n const unitId = useUnitPanel((s) => s.unitId)\n const close = useUnitPanel((s) => s.close)\n const byId = useUnitStore((s) => s.byId)\n const unitMode = useUnitStore((s) => s.unitMode)\n\n const unit = unitId ? byId[unitId] : undefined\n const region = unit?.parentId ? byId[unit.parentId] : undefined\n const isRegion = unit?.kind === 'region'\n\n if (!unit) return null\n\n const address = [unit.address, unit.city, unit.state].filter(Boolean).join(', ')\n\n return (\n <RightRailPage title={unit.name} open onClose={close}>\n <div className=\"min-h-0 flex-1 space-y-4 overflow-y-auto p-4\">\n <div className=\"flex items-start gap-3\">\n <div className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-muted\">\n <Building2 className=\"h-5 w-5 text-muted-foreground\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-center gap-1.5\">\n {isRegion && <Badge variant=\"outline\" className=\"text-[10px]\">região</Badge>}\n {unit.isHeadquarters && <Badge variant=\"secondary\" className=\"text-[10px]\">matriz</Badge>}\n {unit.isActive === false && <Badge variant=\"outline\" className=\"text-[10px]\">inativa</Badge>}\n {unit.code && <Badge variant=\"outline\" className=\"text-[10px]\">{unit.code}</Badge>}\n {region && <Badge variant=\"outline\" className=\"text-[10px]\">em {region.name}</Badge>}\n </div>\n {address && (\n <p className=\"mt-1.5 flex items-start gap-1.5 text-xs text-muted-foreground\">\n <MapPin className=\"mt-0.5 h-3 w-3 shrink-0\" />\n <span className=\"min-w-0\">{address}</span>\n </p>\n )}\n {!unitMode && (\n <p className=\"mt-2 text-xs text-muted-foreground\">\n A gestão por unidades está desligada — estes vínculos ainda não restringem nada.\n </p>\n )}\n </div>\n </div>\n\n {/* The roster is the same component the unit's own detail tab renders,\n so the two never drift. */}\n <UnitMembersTab item={unit} />\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"w-full\"\n onClick={() => {\n close()\n navigateApp(`#/settings/locations/${unit.id}`)\n }}\n >\n <Settings2 className=\"mr-1.5 h-3.5 w-3.5\" />\n Abrir a ficha da {isRegion ? 'região' : 'unidade'}\n </Button>\n </div>\n </RightRailPage>\n )\n}\n","import * as React from 'react'\nimport { useDataVersion } from '@fayz-ai/core'\nimport { Badge, Button } from '@fayz-ai/ui'\nimport { AlertTriangle, Building2, Plus } from 'lucide-react'\nimport { useUnitStore } from './store'\nimport { useUnitPanel } from './UnitRailPage'\nimport { fetchMemberUnits, UNIT_ACCESS_CHANGED } from './data'\n\n// ---------------------------------------------------------------------------\n// The units column on the team screen.\n//\n// A menu item would have been cheaper, and wrong: \"who can see which unit\" is\n// the thing an admin scans a team list FOR once a franchise turns this on, and\n// a fact you have to open a menu to learn is a fact nobody checks. The empty\n// state is loud on purpose — an unbound person sees nothing, and that is worth\n// spotting before they tell you.\n// ---------------------------------------------------------------------------\n\nexport function MemberUnitsCell({\n userId,\n onManage,\n}: {\n userId?: string\n onManage?: () => void\n}) {\n const byId = useUnitStore((s) => s.byId)\n const unitMode = useUnitStore((s) => s.unitMode)\n const openUnit = useUnitPanel((s) => s.openUnit)\n const [unitIds, setUnitIds] = React.useState<string[] | null>(null)\n // Relê quando alguém mexe num vínculo em qualquer lugar — tirar a pessoa de\n // uma unidade pelo painel da direita deixava esta coluna mostrando o mundo de\n // antes, lado a lado com o painel mostrando o novo.\n const version = useDataVersion(UNIT_ACCESS_CHANGED)\n\n React.useEffect(() => {\n if (!userId) { setUnitIds([]); return }\n let alive = true\n void fetchMemberUnits(userId).then((b) => { if (alive) setUnitIds(b.map((x) => x.locationId)) })\n return () => { alive = false }\n }, [userId, version])\n\n if (!unitMode || !userId) return <span className=\"text-xs text-muted-foreground\">—</span>\n if (unitIds === null) return <span className=\"text-xs text-muted-foreground\">…</span>\n\n if (unitIds.length === 0) {\n return (\n <Button\n variant=\"bare\"\n size=\"bare\"\n type=\"button\"\n onClick={onManage}\n className=\"inline-flex items-center gap-1.5 rounded-md px-1.5 py-1 text-xs text-amber-600 transition-colors hover:bg-amber-400/10 dark:text-amber-400 font-normal\"\n title=\"Sem unidade — esta pessoa não vê dados de nenhuma unidade\"\n >\n <AlertTriangle className=\"h-3.5 w-3.5\" />\n sem unidade\n </Button>\n )\n }\n\n const shownIds = unitIds.slice(0, 2)\n const rest = unitIds.length - shownIds.length\n const allNames = unitIds.map((id) => byId[id]?.name ?? '—')\n\n // Each badge opens THAT unit in the right column; the overflow chip opens the\n // person's own sheet, because \"+3\" is a question about the person, not a unit.\n return (\n <div className=\"flex flex-wrap items-center gap-1\" title={allNames.join(' · ')}>\n {shownIds.map((id) => (\n <Button variant=\"bare\" size=\"bare\" key={id} type=\"button\" onClick={() => openUnit(id)} className=\"focus:outline-none text-[length:inherit] font-normal\">\n <Badge variant=\"secondary\" className=\"gap-1 text-[10px] transition-colors hover:bg-muted\">\n <Building2 className=\"h-3 w-3\" />\n {byId[id]?.name ?? '—'}\n </Badge>\n </Button>\n ))}\n {rest > 0 && (\n <Button variant=\"bare\" size=\"bare\" type=\"button\" onClick={onManage} className=\"focus:outline-none text-[length:inherit] font-normal\">\n <Badge variant=\"outline\" className=\"text-[10px] transition-colors hover:bg-muted\">+{rest}</Badge>\n </Button>\n )}\n </div>\n )\n}\n\n/** The \"+ unidade\" affordance for a row that has none, used where a full cell\n * would be too heavy (a person card rather than a table row). */\nexport function AddUnitButton({ onClick }: { onClick: () => void }) {\n return (\n <Button size=\"sm\" variant=\"outline\" onClick={onClick}>\n <Plus className=\"mr-1.5 h-3.5 w-3.5\" />\n Unidades\n </Button>\n )\n}\n","import type { Unit } from './data'\n\n/**\n * \"A unidade mais perto de mim\" — o último recurso, e o único que pede algo.\n *\n * Nunca é chamado sozinho. A entrada resolve por hábito (esta máquina, depois\n * esta pessoa) e por aritmética (só existe uma unidade ao alcance); a\n * localização só entra quando nada disso respondeu E a rede preencheu as\n * coordenadas E a pessoa apertou o botão. Um pedido de GPS disparado pelo login\n * é hostil, e a resposta (\"permitir para sempre?\") custa mais atenção do que a\n * escolha que ela evita.\n *\n * Também não pode dar errado de forma cara: negar, demorar ou não existir\n * termina em `undefined` e a lista continua exatamente como estava.\n */\n\n/** Depois disto o botão já custou mais do que rolar a lista. */\nconst TIMEOUT_MS = 8000\n\n/** Distância em km entre dois pontos. Haversine, esfera — o erro contra o\n * elipsoide é de metros, e a pergunta é \"qual das lojas\", não \"quantos metros\". */\nfunction distanceKm(aLat: number, aLon: number, bLat: number, bLon: number): number {\n const R = 6371\n const toRad = (d: number) => (d * Math.PI) / 180\n const dLat = toRad(bLat - aLat)\n const dLon = toRad(bLon - aLon)\n const h =\n Math.sin(dLat / 2) ** 2 +\n Math.cos(toRad(aLat)) * Math.cos(toRad(bLat)) * Math.sin(dLon / 2) ** 2\n return 2 * R * Math.asin(Math.min(1, Math.sqrt(h)))\n}\n\n/** Se vale a pena sequer oferecer o botão: duas ou mais unidades alcançáveis\n * com coordenada. Com uma só não há o que comparar, e com nenhuma o botão\n * seria um pedido de permissão que não responde nada. */\nexport function canOfferNearest(units: Unit[], reachable: string[]): boolean {\n if (typeof navigator === 'undefined' || !navigator.geolocation) return false\n const withCoords = units.filter(\n (u) => reachable.includes(u.id) && u.latitude != null && u.longitude != null,\n )\n return withCoords.length > 1\n}\n\nexport interface NearestUnit {\n unitId: string\n km: number\n}\n\n/**\n * A unidade alcançável mais próxima, ou `undefined` se a pessoa negou, o\n * aparelho não respondeu a tempo, ou nenhuma unidade tem coordenada.\n *\n * Nunca lança: quem chama está numa lista aberta, e uma exceção aqui derrubaria\n * o menu inteiro por causa de um botão opcional.\n */\nexport async function findNearestUnit(\n units: Unit[],\n reachable: string[],\n): Promise<NearestUnit | undefined> {\n const candidates = units.filter(\n (u) => reachable.includes(u.id) && u.latitude != null && u.longitude != null,\n )\n if (candidates.length === 0) return undefined\n if (typeof navigator === 'undefined' || !navigator.geolocation) return undefined\n\n const position = await new Promise<GeolocationPosition | undefined>((resolve) => {\n let settled = false\n const done = (p?: GeolocationPosition) => {\n if (settled) return\n settled = true\n resolve(p)\n }\n // Timeout próprio além do da API: em alguns navegadores o callback de erro\n // simplesmente não chega quando a permissão fica pendente, e a promessa\n // ficaria aberta com o botão girando para sempre.\n const timer = setTimeout(() => done(undefined), TIMEOUT_MS)\n try {\n navigator.geolocation.getCurrentPosition(\n (p) => { clearTimeout(timer); done(p) },\n () => { clearTimeout(timer); done(undefined) },\n // Precisão grosseira de propósito: a pergunta é em qual bairro, e o modo\n // preciso liga o GPS, gasta bateria e demora mais para responder o mesmo.\n { enableHighAccuracy: false, timeout: TIMEOUT_MS, maximumAge: 5 * 60 * 1000 },\n )\n } catch {\n clearTimeout(timer)\n done(undefined)\n }\n })\n\n if (!position) return undefined\n\n let best: NearestUnit | undefined\n for (const u of candidates) {\n const km = distanceKm(\n position.coords.latitude, position.coords.longitude,\n Number(u.latitude), Number(u.longitude),\n )\n if (!best || km < best.km) best = { unitId: u.id, km }\n }\n return best\n}\n","import * as React from 'react'\nimport { Store, Layers } from 'lucide-react'\nimport { useTranslation } from '../hooks/useTranslation'\n\n/** Quanto a cobertura fica na tela antes de entregar o reload. */\nconst HOLD_MS = 900\n\nexport interface UnitSwitchingProps {\n /** A unidade sendo entrada, nomeada. */\n unitName: string\n /** \"Todas as unidades\" ganha outra marca — é uma abertura, não um lugar. */\n isAll?: boolean\n /** Roda quando a cobertura cumpriu o tempo dela. Na prática, recarrega. */\n onDone: () => void\n}\n\n/**\n * A tela entre duas unidades.\n *\n * Irmã mais curta de `WorkspaceSwitching`, e de propósito: trocar de unidade é\n * um movimento MENOR do que trocar de conta — a pessoa continua na mesma\n * empresa, com as mesmas permissões — então não merece três etapas nem dois\n * segundos e meio. Merece cobrir o reload, dizer para onde está indo, e sair\n * do caminho.\n *\n * O que ela tem em comum com a irmã é o motivo de existir: o reload é\n * obrigatório (ver `switching.store`), e um reload sem cobertura lê como\n * travamento.\n */\nexport function UnitSwitching({ unitName, isAll, onDone }: UnitSwitchingProps) {\n const { t } = useTranslation()\n const tr = (key: string, fallback: string) => {\n const v = t(key)\n return !v || v === key ? fallback : v\n }\n\n // Uma referência e não a prop direta: o reload derruba esta árvore, e o\n // timer não pode carregar uma closure velha até lá.\n const doneRef = React.useRef(onDone)\n doneRef.current = onDone\n React.useEffect(() => {\n const id = window.setTimeout(() => doneRef.current(), HOLD_MS)\n return () => window.clearTimeout(id)\n }, [])\n\n const Icon = isAll ? Layers : Store\n\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n aria-label={`${tr('unit.switching.eyebrow', 'Mudando para')} ${unitName}`}\n className=\"saas-switch-veil fixed inset-0 z-[140] flex items-center justify-center bg-background px-6\"\n >\n <div className=\"saas-switch-rise flex w-full max-w-sm flex-col items-center\">\n <div className=\"relative flex h-16 w-16 items-center justify-center\">\n <span aria-hidden className=\"saas-switch-pulse absolute inset-0 rounded-2xl bg-primary/25\" />\n <span className=\"relative flex h-14 w-14 items-center justify-center rounded-2xl bg-primary text-primary-foreground shadow-sm\">\n <Icon className=\"h-6 w-6\" strokeWidth={2} />\n </span>\n </div>\n\n <p className=\"mt-6 text-xs font-medium uppercase tracking-[0.14em] text-muted-foreground\">\n {tr('unit.switching.eyebrow', 'Mudando para')}\n </p>\n {/* Quebra em vez de reticências: o nome cortado é justamente a\n confirmação que esta tela existe para dar, cortada ao meio. */}\n <h1 className=\"mt-1.5 text-pretty text-center text-2xl font-semibold leading-tight tracking-tight text-foreground sm:text-3xl\">\n {unitName}\n </h1>\n <p className=\"mt-4 flex items-center gap-2 text-sm text-muted-foreground\">\n <span aria-hidden className=\"saas-switch-dot h-2 w-2 rounded-full bg-primary\" />\n {tr('unit.switching.loading', 'Carregando os dados desta unidade')}\n </p>\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { useUnitSwitchingStore } from './switching.store'\nimport { UnitSwitching } from './UnitSwitching'\n\n/**\n * Desenha a transição de unidade por cima do que estiver na tela, e executa o\n * reload que ela existe para cobrir.\n *\n * Montado uma vez, no alto da casca: a troca pode partir do seletor da barra,\n * do menu lateral ou de qualquer lugar que venha a crescer um — e nenhum deles\n * deveria ser dono de uma cobertura de tela inteira.\n */\nexport function UnitSwitchingHost() {\n const target = useUnitSwitchingStore((s) => s.target)\n if (!target) return null\n\n return (\n <UnitSwitching\n unitName={target.unitName}\n isAll={target.unitId === undefined}\n // Reload de verdade, não navegação de rota: o objetivo é descartar todo\n // store de plugin e todo cache que ainda segura as linhas da unidade\n // anterior, e só um documento novo faz isso. `reload()` preserva a URL,\n // então quem trocou cai na MESMA tela, na unidade nova.\n onDone={() => window.location.reload()}\n />\n )\n}\n","import { create } from 'zustand'\n\ninterface UnitPickerStore {\n open: boolean\n setOpen: (open: boolean) => void\n}\n\n/** The dialog lives OUTSIDE the menu that opens it: picking a unit closes the\n * dropdown, and a dialog mounted inside it would unmount on the same click. */\nexport const useUnitPickerStore = create<UnitPickerStore>((set) => ({\n open: false,\n setOpen: (open) => set({ open }),\n}))\n\nexport function openUnitPicker() {\n useUnitPickerStore.getState().setOpen(true)\n}\n","import * as React from 'react'\nimport { PickerDialog, type PickerGroup, type PickerOption } from '@fayz-ai/ui'\nimport { useUnitStore, type UnitNode } from './store'\nimport { useUnitSwitchingStore } from './switching.store'\nimport { useUnitPickerStore } from './picker.store'\n\nexport const ALL_UNITS = '__all__'\n\n// Mounted once at the top of the shell, like the switching overlay: sixty-five\n// units do not fit in a popover anchored to the bottom of the rail.\nexport function UnitPickerDialog() {\n const open = useUnitPickerStore((s) => s.open)\n const setOpen = useUnitPickerStore((s) => s.setOpen)\n const unitMode = useUnitStore((s) => s.unitMode)\n const units = useUnitStore((s) => s.units)\n const tree = useUnitStore((s) => s.tree)\n const byId = useUnitStore((s) => s.byId)\n const myUnitIds = useUnitStore((s) => s.myUnitIds)\n const activeUnitId = useUnitStore((s) => s.activeUnitId)\n const beginSwitch = useUnitSwitchingStore((s) => s.begin)\n\n const reachable = React.useMemo(\n () => (myUnitIds.length > 0 ? myUnitIds : units.filter((u) => u.kind !== 'region').map((u) => u.id)),\n [myUnitIds, units],\n )\n\n const groups = React.useMemo<PickerGroup[]>(() => {\n const out: PickerGroup[] = []\n if (reachable.length > 1) {\n out.push({ id: '_all', options: [{ id: ALL_UNITS, label: 'Todas as unidades' }] })\n }\n // A region is a heading, not a destination.\n const collect = (nodes: UnitNode[], bucket: PickerOption[]) => {\n for (const n of nodes) {\n if (n.kind !== 'region' && reachable.includes(n.id)) {\n bucket.push({\n id: n.id,\n label: n.name,\n sublabel: n.city ?? null,\n hint: n.isHeadquarters ? 'matriz' : null,\n keywords: [n.code ?? '', n.city ?? ''].filter(Boolean),\n })\n }\n collect(n.children, bucket)\n }\n }\n for (const root of tree) {\n if (root.kind === 'region') {\n const options: PickerOption[] = []\n collect(root.children, options)\n if (options.length > 0) out.push({ id: root.id, label: root.name, options })\n } else {\n const options: PickerOption[] = []\n collect([root], options)\n if (options.length > 0) out.push({ id: root.id, options })\n }\n }\n return out\n }, [tree, reachable])\n\n if (!unitMode) return null\n\n return (\n <PickerDialog\n open={open}\n onOpenChange={setOpen}\n title=\"Trocar de unidade\"\n description=\"Digite para buscar, use ↑ ↓ para navegar.\"\n searchPlaceholder=\"Buscar unidade…\"\n emptyLabel=\"Nenhuma unidade com esse nome.\"\n searchThreshold={6}\n groups={groups}\n value={activeUnitId ?? ALL_UNITS}\n onSelect={(id) => {\n if (id === ALL_UNITS) {\n if (activeUnitId !== undefined) beginSwitch({ unitId: undefined, unitName: 'Todas as unidades' })\n return\n }\n if (id !== activeUnitId) beginSwitch({ unitId: id, unitName: byId[id]?.name ?? '' })\n }}\n />\n )\n}\n","import * as React from 'react'\nimport { DropdownItem, DropdownLabel, DropdownSeparator, cn } from '@fayz-ai/ui'\nimport { Building2, Check, ChevronsUpDown, Layers, LocateFixed, Loader2 } from 'lucide-react'\nimport { useUnitStore, type UnitNode } from './store'\nimport { useUnitBootstrap } from './useUnitBootstrap'\nimport { useUnitSwitchingStore } from './switching.store'\nimport { canOfferNearest, findNearestUnit } from './geo'\nimport { openUnitPicker } from './picker.store'\n\n// ---------------------------------------------------------------------------\n// The \"Unidades\" half of the identity menu.\n//\n// One menu, not two. Workspace and unit are the same question asked twice —\n// \"where am I?\" — and answering it in two different popovers means learning two\n// controls to do one thing. The always-visible second line says where you are;\n// this section is how you move.\n// ---------------------------------------------------------------------------\n\n/** Above this the menu stops listing units and hands the job to the dialog:\n * a franchise with fifteen units is the normal case, not the edge one. */\nconst MENU_LIST_CAP = 5\n\nexport function UnitMenuSection() {\n useUnitBootstrap()\n const [locating, setLocating] = React.useState(false)\n const unitMode = useUnitStore((s) => s.unitMode)\n const units = useUnitStore((s) => s.units)\n const tree = useUnitStore((s) => s.tree)\n const byId = useUnitStore((s) => s.byId)\n const myUnitIds = useUnitStore((s) => s.myUnitIds)\n const activeUnitId = useUnitStore((s) => s.activeUnitId)\n const needsChoice = useUnitStore((s) => s.needsChoice)\n // Trocar de unidade termina num reload — todo store de plugin ainda segura as\n // linhas da unidade anterior (ver switching.store). `begin` grava o pino e\n // levanta a cobertura; ninguém aqui chama `setActive` direto.\n const beginSwitch = useUnitSwitchingStore((s) => s.begin)\n\n if (!unitMode) return null\n\n const reachable = myUnitIds.length > 0\n ? myUnitIds\n : units.filter((u) => u.kind !== 'region').map((u) => u.id)\n if (reachable.length === 0) return null\n\n const current = activeUnitId ? byId[activeUnitId] : undefined\n const currentLabel = current?.name ?? 'Todas as unidades'\n\n const nearestItem = needsChoice && canOfferNearest(units, reachable) && (\n // O último recurso, e o único que pede alguma coisa. A entrada já tentou o\n // hábito desta máquina, o desta pessoa e a aritmética de \"só existe uma\".\n <DropdownItem\n disabled={locating}\n onClick={async (e: React.MouseEvent) => {\n // O menu fecharia no clique e desmontaria isto no meio do caminho, com\n // a permissão do navegador ainda aberta na tela.\n e.preventDefault()\n setLocating(true)\n const nearest = await findNearestUnit(units, reachable)\n setLocating(false)\n if (nearest) beginSwitch({ unitId: nearest.unitId, unitName: byId[nearest.unitId]?.name ?? '' })\n }}\n className=\"flex items-center gap-2\"\n >\n {locating\n ? <Loader2 className=\"h-4 w-4 shrink-0 animate-spin text-muted-foreground\" />\n : <LocateFixed className=\"h-4 w-4 shrink-0 text-muted-foreground\" />}\n <span className=\"min-w-0 flex-1 truncate\">\n {locating ? 'Procurando…' : 'A unidade mais perto de mim'}\n </span>\n </DropdownItem>\n )\n\n // Passando disto a lista para de ser um menu e vira uma busca: o diálogo tem\n // campo, setas e a tela inteira, e o menu fica com a resposta — onde estou e\n // por onde troco. Ver UnitPickerDialog.\n if (reachable.length > MENU_LIST_CAP) {\n return (\n <>\n <DropdownSeparator />\n <DropdownLabel>Unidades</DropdownLabel>\n {/* One row: where I am IS the button that changes it. */}\n <DropdownItem onClick={() => openUnitPicker()} className=\"flex items-center gap-2\" title={currentLabel}>\n {current\n ? <Building2 className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n : <Layers className=\"h-4 w-4 shrink-0 text-muted-foreground\" />}\n <span className=\"min-w-0 flex-1 truncate font-medium\">{currentLabel}</span>\n <span className=\"shrink-0 text-[10px] tabular-nums text-muted-foreground\">{reachable.length}</span>\n <ChevronsUpDown className=\"h-3.5 w-3.5 shrink-0 text-muted-foreground\" />\n </DropdownItem>\n {nearestItem}\n </>\n )\n }\n\n const renderNode = (node: UnitNode, depth: number): React.ReactNode => {\n // A region is a heading, not a destination: standing \"in\" one would mean\n // sending its children as a filter from the browser, which is the one thing\n // this design refuses to do.\n if (node.kind === 'region') {\n const visibleChildren = node.children.filter((c) => c.kind === 'region' || reachable.includes(c.id))\n if (visibleChildren.length === 0) return null\n return (\n <React.Fragment key={node.id}>\n <DropdownLabel className=\"px-2 pt-2 text-[10px] uppercase tracking-wide text-muted-foreground\">\n {node.name}\n </DropdownLabel>\n {visibleChildren.map((child) => renderNode(child, depth + 1))}\n </React.Fragment>\n )\n }\n if (!reachable.includes(node.id)) return null\n return (\n <React.Fragment key={node.id}>\n <DropdownItem\n onClick={() => beginSwitch({ unitId: node.id, unitName: node.name })}\n className={cn('flex items-center gap-2', depth > 0 && 'pl-6')}\n >\n <Building2 className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate\">{node.name}</span>\n {node.isHeadquarters && <span className=\"shrink-0 text-[10px] text-muted-foreground\">matriz</span>}\n {activeUnitId === node.id && <Check className=\"h-4 w-4 shrink-0\" />}\n </DropdownItem>\n {node.children.map((child) => renderNode(child, depth + 1))}\n </React.Fragment>\n )\n }\n\n return (\n <>\n <DropdownSeparator />\n <DropdownLabel>Unidades</DropdownLabel>\n {/* Only offered when there is more than one to choose between — \"todas\"\n next to a single unit is a choice that changes nothing. */}\n {reachable.length > 1 && (\n <DropdownItem onClick={() => beginSwitch({ unitId: undefined, unitName: 'Todas as unidades' })} className=\"flex items-center gap-2\">\n <Layers className=\"h-4 w-4 shrink-0 text-muted-foreground\" />\n <span className=\"min-w-0 flex-1 truncate\">Todas as unidades</span>\n {!activeUnitId && <Check className=\"h-4 w-4 shrink-0\" />}\n </DropdownItem>\n )}\n {nearestItem}\n {tree.map((node) => renderNode(node, 0))}\n </>\n )\n}\n\n/** The always-visible line under the workspace name: where you are, not a\n * control. Indented to sit under the NAME rather than under the mark, so the\n * two lines read as one address instead of two unrelated rows. */\nexport function UnitIndicator({\n collapsed = false,\n inline = false,\n}: {\n collapsed?: boolean\n /** Rendered as the second line INSIDE the account button, which is the only\n * place it fits: the mark is 32px and centres on whatever is beside it, so a\n * line added below the button always lands outside the square. As a sibling\n * of the name inside one column, name (20px) + unit (12px) = the mark's own\n * height, and the mark centres across both without a single magic number. */\n inline?: boolean\n}) {\n useUnitBootstrap()\n const unitMode = useUnitStore((s) => s.unitMode)\n const byId = useUnitStore((s) => s.byId)\n const myUnitIds = useUnitStore((s) => s.myUnitIds)\n const units = useUnitStore((s) => s.units)\n const activeUnitId = useUnitStore((s) => s.activeUnitId)\n\n if (!unitMode) return null\n\n const reachable = myUnitIds.length > 0\n ? myUnitIds\n : units.filter((u) => u.kind !== 'region').map((u) => u.id)\n if (reachable.length === 0) return null\n\n const current = activeUnitId ? byId[activeUnitId] : undefined\n const text = current?.name ?? (reachable.length > 1 ? 'Todas as unidades' : byId[reachable[0]!]?.name ?? '')\n if (!text) return null\n\n if (collapsed) {\n return (\n <div className=\"flex justify-center pt-0.5\" title={text}>\n <Building2 className=\"h-3 w-3 text-sidebar-muted\" />\n </div>\n )\n }\n\n const body = (\n <>\n <Building2 className=\"h-3 w-3 shrink-0 text-sidebar-muted/70\" />\n <span className=\"min-w-0 truncate text-[11px] leading-none text-sidebar-muted/90\">{text}</span>\n </>\n )\n\n // Inside the button: no padding and no margin of its own. The column it sits\n // in owns the layout, which is the whole reason this stopped needing a magic\n // offset to look right.\n if (inline) {\n return <span className=\"mt-0.5 flex min-w-0 items-center gap-1\" title={text}>{body}</span>\n }\n\n // Standalone fallback for a shell that composes the account row some other\n // way. Indented to the column the name starts on: px-1.5 (6) + mark (32) +\n // gap-2.5 (10) = 48px.\n return <div className=\"flex min-w-0 items-center gap-1.5 pl-12 pr-1.5 pb-1\" title={text}>{body}</div>\n}\n","import { readImpersonation, writeImpersonation, replaceApp, type ImpersonationTarget } from '@fayz-ai/core'\nimport { getFayzSupabaseClient } from '../data/client'\nimport { markWorkspaceSwitch } from '../org/choice'\n\nconst FALLBACK_TTL_SECONDS = 30 * 60\n\n/** Put the address on `path` without navigating, then reload the page there. */\nfunction reloadTo(path: string): void {\n replaceApp(path)\n window.location.reload()\n}\n\n/**\n * Enter as a member of this tenant. The server authorises, writes the trail\n * and returns a one-time token hash; the browser trades it for that person's\n * session. Every store is rebuilt by the reload, so nothing of the admin's\n * state leaks into the borrowed view.\n */\nexport async function startImpersonation(input: {\n tenantId: string\n userId: string\n reason?: string\n returnTo?: string\n}): Promise<void> {\n const supabase = getFayzSupabaseClient()\n const { data: current } = await supabase.auth.getSession()\n const origin = current.session\n if (!origin?.refresh_token) throw new Error('Sua sessão expirou. Entre de novo.')\n\n const { data, error } = await supabase.functions.invoke('platform-admin', {\n body: { verb: 'member.impersonate', params: { tenant_id: input.tenantId, user_id: input.userId, reason: input.reason } },\n })\n if (error) {\n const body = await (error as { context?: Response }).context?.json?.().catch(() => null)\n throw new Error(body?.error ?? error.message)\n }\n const { token_hash, target, expires_in } = data as {\n token_hash: string\n target: { user_id: string; email: string; name: string; role?: string }\n expires_in?: number\n }\n\n const now = Date.now()\n const person: ImpersonationTarget = { userId: target.user_id, email: target.email, name: target.name, role: target.role }\n writeImpersonation({\n tenantId: input.tenantId,\n target: person,\n startedAt: now,\n expiresAt: now + (expires_in ?? FALLBACK_TTL_SECONDS) * 1000,\n returnTo: input.returnTo,\n origin: { access_token: origin.access_token, refresh_token: origin.refresh_token },\n })\n\n const { error: verifyErr } = await supabase.auth.verifyOtp({ type: 'magiclink', token_hash })\n if (verifyErr) {\n writeImpersonation(null)\n await supabase.auth.setSession({ access_token: origin.access_token, refresh_token: origin.refresh_token })\n throw new Error(verifyErr.message)\n }\n\n markWorkspaceSwitch(input.tenantId)\n reloadTo('/')\n}\n\n/** Leave: revoke only the borrowed session, then put the admin's back. */\nexport async function stopImpersonation(): Promise<void> {\n const state = readImpersonation()\n if (!state) return\n const supabase = getFayzSupabaseClient()\n try {\n await supabase.auth.signOut({ scope: 'local' })\n } catch {\n // the borrowed session may already be gone; restoring is what matters\n }\n writeImpersonation(null)\n const { error } = await supabase.auth.setSession(state.origin)\n markWorkspaceSwitch(state.tenantId)\n reloadTo(error ? '/login' : state.returnTo ?? '/settings/team')\n}\n"]}
|