@rendra-ui/web 2.8.0 → 2.9.0

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.
Files changed (62) hide show
  1. package/README.md +3 -3
  2. package/dist/base.css +1 -1
  3. package/dist/{button-CrSlVIsY.js → button-BcCBrlnt.js} +6 -6
  4. package/dist/{button-CrSlVIsY.js.map → button-BcCBrlnt.js.map} +1 -1
  5. package/dist/chart.js +7 -7
  6. package/dist/cli/auditar.js +1 -1
  7. package/dist/cli/codigos.js +2 -2
  8. package/dist/cli/executar-auditar.js +1 -1
  9. package/dist/cli/help.js +1 -1
  10. package/dist/cli/trocar.js +2 -2
  11. package/dist/cli/typescript-loader.js +1 -1
  12. package/dist/{cn-BlJHpkDs.js → cn-CpdCvlkP.js} +2 -2
  13. package/dist/{cn-BlJHpkDs.js.map → cn-CpdCvlkP.js.map} +1 -1
  14. package/dist/{components-6RpoJ2Od.js → components-Bus_Jh2R.js} +7 -4
  15. package/dist/components-Bus_Jh2R.js.map +1 -0
  16. package/dist/components.css +67 -26
  17. package/dist/document-viewer.js +4 -4
  18. package/dist/{dropdown-menu-BUGKtR6k.js → dropdown-menu-B3L1XSDf.js} +5 -5
  19. package/dist/{dropdown-menu-BUGKtR6k.js.map → dropdown-menu-B3L1XSDf.js.map} +1 -1
  20. package/dist/{brand-feedback-icon-CVux4pNh.js → empty-state-Bcx4M0Me.js} +64 -4
  21. package/dist/empty-state-Bcx4M0Me.js.map +1 -0
  22. package/dist/{features-max-BCIy1Ic-.js → features-max-CoyJ_kuK.js} +1 -1
  23. package/dist/flow.js +2818 -868
  24. package/dist/flow.js.map +1 -1
  25. package/dist/index.js +80 -465
  26. package/dist/index.js.map +1 -1
  27. package/dist/{motion-context-PJPj6X4g.js → motion-context-DWFl2xRr.js} +4 -4
  28. package/dist/{motion-context-PJPj6X4g.js.map → motion-context-DWFl2xRr.js.map} +1 -1
  29. package/dist/{motion-on-Bocf4Smc.js → motion-on-zwsBqYZL.js} +2 -2
  30. package/dist/{motion-on-Bocf4Smc.js.map → motion-on-zwsBqYZL.js.map} +1 -1
  31. package/dist/motion.js +2 -2
  32. package/dist/{rendra-provider-Do_qWjJC.js → rendra-provider-DuIhBatD.js} +3 -3
  33. package/dist/{rendra-provider-Do_qWjJC.js.map → rendra-provider-DuIhBatD.js.map} +1 -1
  34. package/dist/rich-text-editor.js +4 -4
  35. package/dist/router-bridge.js +2 -2
  36. package/dist/{timeline-xrMHeV92.js → toast-C7qYslCp.js} +464 -80
  37. package/dist/toast-C7qYslCp.js.map +1 -0
  38. package/dist/tokens.css +1 -1
  39. package/dist/{tooltip-to0h6aPe.js → tooltip-BSPO-bH4.js} +5 -5
  40. package/dist/{tooltip-to0h6aPe.js.map → tooltip-BSPO-bH4.js.map} +1 -1
  41. package/dist/types/components/ui/flow-config-panels.d.ts +10 -0
  42. package/dist/types/components/ui/flow-editor.d.ts +5 -0
  43. package/dist/types/components/ui/flow-sidebar.d.ts +21 -0
  44. package/dist/types/components/ui/flow-simulation-panel.d.ts +20 -0
  45. package/dist/types/components/ui/flow-viewer.d.ts +27 -10
  46. package/dist/types/flow.d.ts +1 -1
  47. package/dist/types/lib/flow-blocks.d.ts +122 -0
  48. package/dist/types/lib/flow-edit.d.ts +88 -0
  49. package/dist/types/lib/flow-layout.d.ts +3 -0
  50. package/dist/types/lib/flow-sim.d.ts +24 -0
  51. package/dist/types/lib/flow.d.ts +30 -80
  52. package/dist/{use-breakpoint-CM-yeDHJ.js → use-breakpoint-BGmY3ir-.js} +2 -2
  53. package/dist/{use-breakpoint-CM-yeDHJ.js.map → use-breakpoint-BGmY3ir-.js.map} +1 -1
  54. package/dist/{use-motion-presets-I4StrsCi.js → use-motion-presets-CmMLBQLI.js} +3 -3
  55. package/dist/{use-motion-presets-I4StrsCi.js.map → use-motion-presets-CmMLBQLI.js.map} +1 -1
  56. package/dist/widget-grid.js +2 -2
  57. package/package.json +2 -1
  58. package/dist/brand-feedback-icon-CVux4pNh.js.map +0 -1
  59. package/dist/components-6RpoJ2Od.js.map +0 -1
  60. package/dist/empty-state-i4e-LacG.js +0 -67
  61. package/dist/empty-state-i4e-LacG.js.map +0 -1
  62. package/dist/timeline-xrMHeV92.js.map +0 -1
package/dist/flow.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"flow.js","names":[],"sources":["../src/lib/flow.ts","../src/components/ui/flow-viewer.tsx","../src/components/ui/flow-editor.tsx"],"sourcesContent":["/*\n * Fluxos de automação: contrato do JSON, validação, edição, serialização e simulação.\n * Funções puras e imutáveis, com tipos próprios do Rendra: nada daqui importa o React Flow,\n * então o item `core` do registry não depende dele. A conversão para os nós da biblioteca\n * mora só dentro de FlowEditor e FlowViewer.\n */\n\nexport type FlowNodeType = 'gatilho' | 'acao' | 'condicao' | 'espera' | 'fim'\nexport type FlowBranch = 'sim' | 'nao'\nexport type FlowWaitUnit = 'segundos' | 'minutos' | 'horas' | 'dias'\n\nexport interface FlowNode {\n id: string\n type: FlowNodeType\n position: { x: number; y: number }\n data: { label: string; config?: Record<string, unknown> }\n}\n\nexport interface FlowEdge {\n id: string\n source: string\n target: string\n /** Só a saída de uma condição usa o ramo. */\n branch?: FlowBranch\n}\n\nexport interface Flow {\n nodes: FlowNode[]\n edges: FlowEdge[]\n}\n\nexport interface FlowIssue {\n code: string\n message: string\n nodeId?: string\n edgeId?: string\n}\n\nexport interface SimulationStep {\n nodeId: string\n type: FlowNodeType\n label: string\n status: 'succeeded' | 'failed' | 'skipped'\n detail?: string\n}\n\nexport interface SimulationState {\n status: 'idle' | 'running' | 'waiting-choice' | 'finished' | 'error'\n steps: SimulationStep[]\n /** Bloco que o próximo avanço executa (o bloco ativo); `null` fora da simulação. */\n currentId: string | null\n issues: FlowIssue[]\n}\n\nexport const FLOW_NODE_TYPES: readonly FlowNodeType[] = [\n 'gatilho',\n 'acao',\n 'condicao',\n 'espera',\n 'fim',\n]\n\nexport const FLOW_WAIT_UNITS: readonly FlowWaitUnit[] = ['segundos', 'minutos', 'horas', 'dias']\n\n/** Nome do tipo de bloco, como aparece na interface. */\nexport const FLOW_TYPE_NAME: Record<FlowNodeType, string> = {\n gatilho: 'Gatilho',\n acao: 'Ação',\n condicao: 'Condição',\n espera: 'Espera',\n fim: 'Fim',\n}\n\nconst BRANCH_NAME: Record<FlowBranch, string> = { sim: 'Sim', nao: 'Não' }\n\nconst WAIT_SINGULAR: Record<FlowWaitUnit, string> = {\n segundos: 'segundo',\n minutos: 'minuto',\n horas: 'hora',\n dias: 'dia',\n}\n\nconst DEFAULT_WAIT: { duration: number; unit: FlowWaitUnit } = { duration: 5, unit: 'minutos' }\n\nconst isUnit = (v: unknown): v is FlowWaitUnit =>\n typeof v === 'string' && (FLOW_WAIT_UNITS as readonly string[]).includes(v)\n\n/** A duração do bloco de espera (\"5 minutos\"), ou `null` se o config não a define. */\nexport function formatWait(config: Record<string, unknown> | undefined): string | null {\n const duration = config?.duration\n const unit = config?.unit\n if (typeof duration !== 'number' || !Number.isFinite(duration) || !isUnit(unit)) return null\n return `${duration} ${duration === 1 ? WAIT_SINGULAR[unit] : unit}`\n}\n\n/** Texto da espera simulada: nunca espera de verdade. */\nexport function describeWait(config: Record<string, unknown> | undefined): string {\n const wait = formatWait(config)\n return wait ? `Aguardaria ${wait}` : 'Aguardaria o tempo definido no bloco'\n}\n\n/** Nome do bloco para mensagens e rótulos: o rótulo, ou o tipo quando ele está vazio. */\nexport const nodeName = (n: Pick<FlowNode, 'type' | 'data'>) =>\n n.data.label.trim() || FLOW_TYPE_NAME[n.type]\n\n/** Ligações que saem de cada bloco, na ordem do fluxo. */\nfunction outgoing(flow: Flow) {\n const map = new Map<string, FlowEdge[]>()\n for (const e of flow.edges) map.set(e.source, [...(map.get(e.source) ?? []), e])\n return map\n}\n\n/** Problemas do fluxo, em ordem estável: a mesma entrada dá sempre a mesma lista. */\nexport function validateFlow(flow: Flow): FlowIssue[] {\n const issues: FlowIssue[] = []\n const byId = new Map(flow.nodes.map((n) => [n.id, n]))\n const out = outgoing(flow)\n\n const triggers = flow.nodes.filter((n) => n.type === 'gatilho')\n if (triggers.length === 0)\n issues.push({\n code: 'sem-gatilho',\n message: 'O fluxo precisa de um bloco Gatilho para começar.',\n })\n else if (triggers.length > 1)\n issues.push({\n code: 'varios-gatilhos',\n message: `O fluxo tem ${triggers.length} gatilhos, mas deve ter só um.`,\n })\n\n // Integridade: ligações apontando para o que não existe, ou com o ramo errado.\n const sound: FlowEdge[] = []\n for (const e of flow.edges) {\n const from = byId.get(e.source)\n const to = byId.get(e.target)\n if (!from || !to) {\n issues.push({\n code: 'ligacao-invalida',\n message: 'Há uma ligação que aponta para um bloco que não existe.',\n edgeId: e.id,\n })\n continue\n }\n if (from.type === 'condicao' ? !e.branch : e.branch) {\n issues.push({\n code: 'ramo-invalido',\n message:\n from.type === 'condicao'\n ? `Uma saída da condição \"${nodeName(from)}\" não diz se é \"Sim\" ou \"Não\".`\n : `A ligação que sai de \"${nodeName(from)}\" não pode ter \"Sim\" ou \"Não\": isso só vale para condição.`,\n nodeId: from.id,\n edgeId: e.id,\n })\n continue\n }\n sound.push(e)\n }\n\n for (const n of flow.nodes) {\n const edges = out.get(n.id) ?? []\n const name = nodeName(n)\n if (n.type === 'fim') {\n if (edges.length > 0)\n issues.push({\n code: 'fim-com-saida',\n message: `O bloco Fim \"${name}\" não pode ter saída.`,\n nodeId: n.id,\n })\n } else if (n.type === 'condicao') {\n const sim = edges.filter((e) => e.branch === 'sim').length\n const nao = edges.filter((e) => e.branch === 'nao').length\n if (sim === 0)\n issues.push({\n code: 'condicao-sem-sim',\n message: `A condição \"${name}\" precisa de uma saída \"Sim\".`,\n nodeId: n.id,\n })\n if (nao === 0)\n issues.push({\n code: 'condicao-sem-nao',\n message: `A condição \"${name}\" precisa de uma saída \"Não\".`,\n nodeId: n.id,\n })\n if (sim > 1 || nao > 1)\n issues.push({\n code: 'condicao-saida-repetida',\n message: `A condição \"${name}\" tem mais de uma saída para o mesmo ramo.`,\n nodeId: n.id,\n })\n } else if (edges.length === 0) {\n issues.push({\n code: 'sem-saida',\n message: `O bloco \"${name}\" não leva a nenhum próximo bloco.`,\n nodeId: n.id,\n })\n } else if (edges.length > 1) {\n issues.push({\n code: 'varias-saidas',\n message: `O bloco \"${name}\" tem mais de uma saída; só a condição pode ter.`,\n nodeId: n.id,\n })\n }\n }\n\n const next = new Map<string, string[]>()\n for (const e of sound) next.set(e.source, [...(next.get(e.source) ?? []), e.target])\n\n // Alcançáveis a partir do gatilho (sem gatilho, nada é acusado: o problema já é outro).\n if (triggers.length > 0) {\n const seen = new Set<string>()\n const stack = triggers.map((t) => t.id)\n while (stack.length) {\n const id = stack.pop()!\n if (seen.has(id)) continue\n seen.add(id)\n stack.push(...(next.get(id) ?? []))\n }\n for (const n of flow.nodes)\n if (!seen.has(n.id))\n issues.push({\n code: 'inalcancavel',\n message: `O bloco \"${nodeName(n)}\" não é alcançado a partir do gatilho.`,\n nodeId: n.id,\n })\n }\n\n // Ciclos: busca em profundidade, uma queixa por laço encontrado.\n const state = new Map<string, 1 | 2>()\n const path: string[] = []\n const visit = (id: string) => {\n state.set(id, 1)\n path.push(id)\n for (const t of next.get(id) ?? []) {\n if (state.get(t) === 1) {\n const loop = [...path.slice(path.indexOf(t)), t].map((x) => `\"${nodeName(byId.get(x)!)}\"`)\n issues.push({\n code: 'ciclo',\n message: `O fluxo volta para um bloco por onde já passou: ${loop.join(' → ')}.`,\n nodeId: t,\n })\n } else if (!state.has(t)) visit(t)\n }\n path.pop()\n state.set(id, 2)\n }\n for (const n of flow.nodes) if (!state.has(n.id)) visit(n.id)\n\n return issues\n}\n\n/* ---------------------------------------------------------------- serialização */\n\nconst sortKeys = (v: unknown): unknown => {\n if (Array.isArray(v)) return v.map(sortKeys)\n if (v && typeof v === 'object')\n return Object.fromEntries(\n Object.keys(v)\n .sort()\n .map((k) => [k, sortKeys((v as Record<string, unknown>)[k])]),\n )\n return v\n}\n\n/** JSON do fluxo, com a ordem das chaves fixa: o mesmo fluxo dá sempre o mesmo texto. */\nexport function serializeFlow(flow: Flow): string {\n const nodes = flow.nodes.map((n) => ({\n id: n.id,\n type: n.type,\n position: { x: n.position.x, y: n.position.y },\n data: n.data.config\n ? { label: n.data.label, config: sortKeys(n.data.config) }\n : { label: n.data.label },\n }))\n const edges = flow.edges.map((e) =>\n e.branch\n ? { id: e.id, source: e.source, target: e.target, branch: e.branch }\n : { id: e.id, source: e.source, target: e.target },\n )\n return JSON.stringify({ nodes, edges }, null, 2)\n}\n\nexport type ParseResult = { ok: true; flow: Flow } | { ok: false; errors: string[] }\n\nconst isObject = (v: unknown): v is Record<string, unknown> =>\n typeof v === 'object' && v !== null && !Array.isArray(v)\n\n/** Lê o JSON de um fluxo. Nunca lança; campos que o contrato não conhece são ignorados. */\nexport function parseFlow(text: string): ParseResult {\n let raw: unknown\n try {\n raw = JSON.parse(text)\n } catch {\n return { ok: false, errors: ['O texto não é um JSON válido.'] }\n }\n if (!isObject(raw)) return { ok: false, errors: ['O JSON do fluxo precisa ser um objeto.'] }\n if (!Array.isArray(raw.nodes) || !Array.isArray(raw.edges)) {\n const falta = !Array.isArray(raw.nodes) ? 'nodes' : 'edges'\n return { ok: false, errors: [`O campo \"${falta}\" precisa ser uma lista.`] }\n }\n\n const errors: string[] = []\n const nodes: FlowNode[] = []\n const ids = new Set<string>()\n raw.nodes.forEach((item, i) => {\n const at = `Bloco ${i + 1}`\n if (!isObject(item)) return void errors.push(`${at}: precisa ser um objeto.`)\n const { id, type, position, data } = item\n let ok = true\n if (typeof id !== 'string' || id === '') {\n errors.push(`${at}: falta o \"id\".`)\n ok = false\n } else if (ids.has(id)) {\n errors.push(`${at}: o id \"${id}\" está repetido.`)\n ok = false\n } else ids.add(id)\n if (!(FLOW_NODE_TYPES as readonly unknown[]).includes(type)) {\n errors.push(`${at}: tipo desconhecido (${String(type)}).`)\n ok = false\n }\n const pos = isObject(position) ? position : null\n if (\n !pos ||\n typeof pos.x !== 'number' ||\n typeof pos.y !== 'number' ||\n !Number.isFinite(pos.x) ||\n !Number.isFinite(pos.y)\n ) {\n errors.push(`${at}: \"position\" precisa ter \"x\" e \"y\" numéricos.`)\n ok = false\n }\n if (!isObject(data) || typeof data.label !== 'string') {\n errors.push(`${at}: \"data.label\" precisa ser um texto.`)\n ok = false\n } else if (data.config !== undefined && !isObject(data.config)) {\n errors.push(`${at}: \"data.config\" precisa ser um objeto.`)\n ok = false\n }\n if (ok) {\n const d = data as { label: string; config?: Record<string, unknown> }\n nodes.push({\n id: id as string,\n type: type as FlowNodeType,\n position: { x: (pos as { x: number }).x, y: (pos as { y: number }).y },\n data: d.config ? { label: d.label, config: d.config } : { label: d.label },\n })\n }\n })\n\n const edges: FlowEdge[] = []\n const edgeIds = new Set<string>()\n raw.edges.forEach((item, i) => {\n const at = `Ligação ${i + 1}`\n if (!isObject(item)) return void errors.push(`${at}: precisa ser um objeto.`)\n const { id, source, target, branch } = item\n let ok = true\n for (const [campo, v] of [\n ['id', id],\n ['source', source],\n ['target', target],\n ] as const)\n if (typeof v !== 'string' || v === '') {\n errors.push(`${at}: falta o campo \"${campo}\".`)\n ok = false\n }\n if (ok && edgeIds.has(id as string)) {\n errors.push(`${at}: o id \"${id as string}\" está repetido.`)\n ok = false\n }\n if (branch !== undefined && branch !== 'sim' && branch !== 'nao') {\n errors.push(`${at}: \"branch\" só pode ser \"sim\" ou \"nao\".`)\n ok = false\n }\n if (ok) {\n edgeIds.add(id as string)\n edges.push(\n branch\n ? {\n id: id as string,\n source: source as string,\n target: target as string,\n branch: branch as FlowBranch,\n }\n : { id: id as string, source: source as string, target: target as string },\n )\n }\n })\n\n return errors.length > 0 ? { ok: false, errors } : { ok: true, flow: { nodes, edges } }\n}\n\n/* ---------------------------------------------------------------------- edição */\n\nexport interface AddNodeOptions {\n label?: string\n /** Ids que já existiram neste fluxo (mesmo apagados): não voltam a ser usados. */\n reservedIds?: Iterable<string>\n}\n\n/** Acrescenta um bloco com id único e determinístico (`tipo-N`). */\nexport function addNode(\n flow: Flow,\n type: FlowNodeType,\n position: { x: number; y: number },\n options: AddNodeOptions = {},\n): { flow: Flow; id: string } {\n const taken = new Set([...flow.nodes.map((n) => n.id), ...(options.reservedIds ?? [])])\n let n = 1\n while (taken.has(`${type}-${n}`)) n++\n const id = `${type}-${n}`\n const node: FlowNode = {\n id,\n type,\n position: { x: position.x, y: position.y },\n data:\n type === 'espera'\n ? { label: options.label ?? FLOW_TYPE_NAME[type], config: { ...DEFAULT_WAIT } }\n : { label: options.label ?? FLOW_TYPE_NAME[type] },\n }\n return { flow: { ...flow, nodes: [...flow.nodes, node] }, id }\n}\n\n/** Apaga o bloco e as ligações que chegam ou saem dele. */\nexport function removeNode(flow: Flow, id: string): Flow {\n if (!flow.nodes.some((n) => n.id === id)) return flow\n return {\n nodes: flow.nodes.filter((n) => n.id !== id),\n edges: flow.edges.filter((e) => e.source !== id && e.target !== id),\n }\n}\n\nexport function removeEdge(flow: Flow, id: string): Flow {\n return { ...flow, edges: flow.edges.filter((e) => e.id !== id) }\n}\n\nexport function moveNode(flow: Flow, id: string, position: { x: number; y: number }): Flow {\n return {\n ...flow,\n nodes: flow.nodes.map((n) =>\n n.id === id ? { ...n, position: { x: position.x, y: position.y } } : n,\n ),\n }\n}\n\n/** Troca o rótulo e/ou o config do bloco (o config informado substitui o anterior). */\nexport function updateNodeData(\n flow: Flow,\n id: string,\n patch: { label?: string; config?: Record<string, unknown> },\n): Flow {\n return {\n ...flow,\n nodes: flow.nodes.map((n) => {\n if (n.id !== id) return n\n const label = patch.label ?? n.data.label\n const config = patch.config ?? n.data.config\n return { ...n, data: config ? { label, config } : { label } }\n }),\n }\n}\n\nexport type ConnectResult = { ok: true; flow: Flow } | { ok: false; reason: string }\n\nconst edgeId = (source: string, target: string, branch?: FlowBranch) =>\n branch ? `${source}:${branch}->${target}` : `${source}->${target}`\n\n/**\n * Liga dois blocos. A segunda saída de um bloco comum (ou do mesmo ramo da condição) substitui\n * a primeira. Recusa, com o motivo, o que o fluxo nunca aceita.\n */\nexport function connectNodes(\n flow: Flow,\n source: string,\n target: string,\n branch?: FlowBranch,\n): ConnectResult {\n const from = flow.nodes.find((n) => n.id === source)\n const to = flow.nodes.find((n) => n.id === target)\n if (!from || !to) return { ok: false, reason: 'Esse bloco não existe mais.' }\n if (source === target) return { ok: false, reason: 'Um bloco não pode ligar a ele mesmo.' }\n if (from.type === 'fim')\n return { ok: false, reason: 'O bloco Fim termina o fluxo e não tem saída.' }\n if (to.type === 'gatilho')\n return { ok: false, reason: 'O gatilho começa o fluxo e não recebe ligação.' }\n if (from.type === 'condicao' && !branch)\n return { ok: false, reason: 'Escolha a saída \"Sim\" ou \"Não\" da condição.' }\n if (from.type !== 'condicao' && branch)\n return { ok: false, reason: '\"Sim\" e \"Não\" só existem na condição.' }\n const id = edgeId(source, target, branch)\n if (flow.edges.some((e) => e.id === id)) return { ok: false, reason: 'Essa ligação já existe.' }\n const kept = flow.edges.filter(\n (e) => !(e.source === source && (from.type === 'condicao' ? e.branch === branch : true)),\n )\n const edge: FlowEdge = branch ? { id, source, target, branch } : { id, source, target }\n return { ok: true, flow: { ...flow, edges: [...kept, edge] } }\n}\n\n/**\n * Define (ou, com `target` nulo, tira) o próximo bloco de `id`; na condição, o do ramo dado.\n * Uma ligação recusada devolve o próprio fluxo, sem mudança.\n */\nexport function setNext(flow: Flow, id: string, target: string | null, branch?: FlowBranch): Flow {\n if (target === null)\n return {\n ...flow,\n edges: flow.edges.filter((e) => !(e.source === id && (branch ? e.branch === branch : true))),\n }\n const r = connectNodes(flow, id, target, branch)\n return r.ok ? r.flow : flow\n}\n\n/** Blocos que `id` pode ter como próximo: nunca ele mesmo nem o gatilho. */\nexport function nextCandidates(flow: Flow, id: string): FlowNode[] {\n const from = flow.nodes.find((n) => n.id === id)\n if (!from || from.type === 'fim') return []\n return flow.nodes.filter((n) => n.id !== id && n.type !== 'gatilho')\n}\n\n/* -------------------------------------------------------------------- simulação */\n\nexport function resetSimulation(): SimulationState {\n return { status: 'idle', steps: [], currentId: null, issues: [] }\n}\n\n/** Começa no gatilho. Fluxo inválido não inicia: devolve `error` com os problemas. */\nexport function startSimulation(flow: Flow): SimulationState {\n const issues = validateFlow(flow)\n if (issues.length > 0) return { status: 'error', steps: [], currentId: null, issues }\n const trigger = flow.nodes.find((n) => n.type === 'gatilho')!\n return { status: 'running', steps: [], currentId: trigger.id, issues: [] }\n}\n\n/**\n * Executa o bloco ativo (um passo) e passa ao próximo. Na condição é preciso escolher o ramo:\n * sem escolha válida nada anda. A espera é instantânea; só o texto diz quanto aguardaria.\n */\nexport function advanceSimulation(\n flow: Flow,\n state: SimulationState,\n choice?: FlowBranch,\n): SimulationState {\n if ((state.status !== 'running' && state.status !== 'waiting-choice') || !state.currentId)\n return state\n const node = flow.nodes.find((n) => n.id === state.currentId)\n const edges = node ? flow.edges.filter((e) => e.source === node.id) : []\n const fail = (): SimulationState => ({\n ...state,\n status: 'error',\n currentId: null,\n issues: [\n {\n code: 'fluxo-mudou',\n message: 'O fluxo mudou durante o teste. Reinicie para testar de novo.',\n },\n ],\n })\n if (!node) return fail()\n\n let detail: string | undefined\n let target: string | undefined\n if (node.type === 'condicao') {\n if (choice !== 'sim' && choice !== 'nao') return state\n target = edges.find((e) => e.branch === choice)?.target\n detail = `Escolha: ${BRANCH_NAME[choice]}`\n if (!target) return fail()\n } else if (node.type !== 'fim') {\n target = edges[0]?.target\n if (node.type === 'espera') detail = describeWait(node.data.config)\n if (!target) return fail()\n }\n\n const step: SimulationStep = {\n nodeId: node.id,\n type: node.type,\n label: nodeName(node),\n status: 'succeeded',\n ...(detail ? { detail } : {}),\n }\n const steps = [...state.steps, step]\n if (!target) return { status: 'finished', steps, currentId: null, issues: [] }\n const next = flow.nodes.find((n) => n.id === target)\n if (!next) return fail()\n return {\n status: next.type === 'condicao' ? 'waiting-choice' : 'running',\n steps,\n currentId: target,\n issues: [],\n }\n}\n","import {\n ConnectionLineType,\n Handle,\n MarkerType,\n Position,\n ReactFlow,\n useReactFlow,\n useStore,\n type AriaLabelConfig,\n type Edge,\n type FitViewOptions,\n type Node,\n type NodeProps,\n type ReactFlowProps,\n} from '@xyflow/react'\nimport '@xyflow/react/dist/base.css'\nimport {\n Clock,\n Flag,\n GitBranch,\n Maximize2,\n Play,\n SquarePen,\n TriangleAlert,\n Zap,\n ZoomIn,\n ZoomOut,\n} from 'lucide-react'\nimport {\n useEffect,\n useId,\n useMemo,\n useRef,\n type ComponentType,\n type CSSProperties,\n type ReactNode,\n} from 'react'\nimport { Button } from '@/components/ui/button'\nimport { useFillHeight } from '@/hooks/use-fill-height'\nimport { cn } from '@/lib/cn'\nimport {\n FLOW_TYPE_NAME,\n formatWait,\n nodeName,\n type Flow,\n type FlowIssue,\n type FlowNodeType,\n} from '@/lib/flow'\nimport { useMotionLib, useMotionPresets } from '@/lib/motion'\n\n/*\n * Canvas de fluxos de automação (React Flow, MIT). Este arquivo tem o que o FlowViewer e o\n * FlowEditor dividem: o desenho dos cinco tipos de bloco, a conversão do `Flow` do Rendra para\n * os nós e ligações da biblioteca, o tema (as variáveis --xy-* apontam para os tokens do Rendra),\n * o zoom próprio de 44 px e os textos de acessibilidade em português.\n *\n * FlowViewer é só leitura: ver, aproximar, afastar e mover o canvas. O que muda o fluxo é do\n * FlowEditor. Fica fora da entrada principal (@rendra-ui/web/flow), porque depende de @xyflow/react.\n */\n\nexport interface FlowBlockData extends Record<string, unknown> {\n label: string\n kind: FlowNodeType\n config?: Record<string, unknown>\n /** Mensagens de validação deste bloco; vazio quando está tudo certo. */\n issues: string[]\n /** Bloco que a simulação executa agora. */\n active: boolean\n /** Alças grandes (montar com mouse ou toque) ou discretas (só ver). */\n handles: 'lg' | 'sm'\n /** Mostra o botão \"Editar bloco\" dentro do bloco. */\n edit: boolean\n}\n\nexport type FlowRfNode = Node<FlowBlockData, 'bloco'>\n\nexport const FLOW_ICON: Record<FlowNodeType, ComponentType<{ className?: string }>> = {\n gatilho: Zap,\n acao: Play,\n condicao: GitBranch,\n espera: Clock,\n fim: Flag,\n}\n\nconst TONE: Record<FlowNodeType, string> = {\n gatilho: 'bg-primary-soft text-primary-soft-foreground',\n acao: 'bg-info-soft text-info-soft-foreground',\n condicao: 'bg-warning-soft text-warning-soft-foreground',\n espera: 'bg-muted text-muted-foreground',\n fim: 'bg-success-soft text-success-soft-foreground',\n}\n\nconst DIRECTION: Record<string, string> = {\n up: 'para cima',\n down: 'para baixo',\n left: 'para a esquerda',\n right: 'para a direita',\n}\n\n/** Os textos que a biblioteca escreve no DOM (leitor de tela), em português. */\nexport const FLOW_ARIA: Partial<AriaLabelConfig> = {\n 'node.a11yDescription.default':\n 'Pressione Enter para abrir o bloco, Espaço para selecioná-lo e Delete para apagá-lo. Esc cancela.',\n 'node.a11yDescription.keyboardDisabled':\n 'Pressione Enter para abrir o bloco, Espaço para selecioná-lo e Delete para apagá-lo. Esc cancela.',\n 'node.a11yDescription.ariaLiveMessage': ({ direction, x, y }) =>\n `Bloco movido ${DIRECTION[direction] ?? direction}. Nova posição, x: ${x}, y: ${y}`,\n 'edge.a11yDescription.default':\n 'Pressione Espaço para selecionar a ligação e Delete para apagá-la. Esc cancela.',\n}\n\ninterface RfNodeOptions {\n activeId?: string | null\n issues?: FlowIssue[]\n handles: 'lg' | 'sm'\n edit: boolean\n}\n\n/** Os blocos do Rendra como nós do React Flow (a biblioteca só vê isto). */\nexport function toRfNodes(flow: Flow, opts: RfNodeOptions): FlowRfNode[] {\n const byNode = new Map<string, string[]>()\n for (const issue of opts.issues ?? [])\n if (issue.nodeId) byNode.set(issue.nodeId, [...(byNode.get(issue.nodeId) ?? []), issue.message])\n return flow.nodes.map((n) => ({\n id: n.id,\n type: 'bloco',\n position: n.position,\n ariaLabel: n.data.label,\n domAttributes: { 'aria-roledescription': 'bloco' },\n data: {\n label: n.data.label,\n kind: n.type,\n ...(n.data.config ? { config: n.data.config } : {}),\n issues: byNode.get(n.id) ?? [],\n active: opts.activeId === n.id,\n handles: opts.handles,\n edit: opts.edit,\n },\n }))\n}\n\n/** As ligações do Rendra como arestas do React Flow, com a descrição em português. */\nexport function toRfEdges(flow: Flow): Edge[] {\n const labelOf = new Map(flow.nodes.map((n) => [n.id, nodeName(n)]))\n return flow.edges.map((e) => ({\n id: e.id,\n source: e.source,\n target: e.target,\n ...(e.branch ? { sourceHandle: e.branch } : {}),\n ariaLabel: `De \"${labelOf.get(e.source) ?? e.source}\" para \"${labelOf.get(e.target) ?? e.target}\"${\n e.branch ? `, se ${e.branch === 'sim' ? 'sim' : 'não'}` : ''\n }`,\n domAttributes: { 'aria-roledescription': 'ligação' },\n }))\n}\n\nfunction FlowBlock({ id, data, selected, isConnectable }: NodeProps<FlowRfNode>) {\n const lib = useMotionLib()\n const presets = useMotionPresets()\n const uid = useId()\n const Icon = FLOW_ICON[data.kind]\n const wait = data.kind === 'espera' ? formatWait(data.config) : null\n const invalid = data.issues.length > 0\n const issueId = `${uid}-problema`\n const handle = cn(\n 'rounded-full border-2 border-card',\n data.handles === 'lg' ? 'size-6' : 'size-2',\n )\n const ring = 'pointer-events-none absolute -inset-1 rounded-block border-2 border-primary'\n return (\n <div\n data-flow-node\n data-kind={data.kind}\n data-block-id={id}\n data-active={data.active ? 'true' : undefined}\n data-invalid={invalid ? 'true' : undefined}\n data-selected={selected ? 'true' : undefined}\n aria-describedby={invalid ? issueId : undefined}\n className={cn(\n 'relative w-flow-node rounded-block border bg-card p-3 text-card-foreground shadow-sm',\n data.kind === 'condicao' && 'pr-12 pb-8',\n invalid && 'border-destructive',\n data.active && 'border-primary',\n selected && 'ring-2 ring-primary',\n )}\n >\n {data.active &&\n (lib ? (\n <lib.m.span\n aria-hidden\n data-flow-pulse\n className={ring}\n animate={presets.reduced ? { opacity: 1 } : { opacity: [1, 0.3, 1] }}\n transition={\n presets.reduced\n ? presets.fade.transition\n : {\n duration: presets.tokens.duration.pulse,\n ease: presets.tokens.ease.inOut,\n repeat: Infinity,\n }\n }\n />\n ) : (\n <span aria-hidden className={ring} />\n ))}\n {data.kind !== 'gatilho' && (\n <Handle\n type=\"target\"\n position={Position.Top}\n className={handle}\n isConnectable={isConnectable}\n />\n )}\n <div className=\"flex items-start gap-3\">\n <span\n className={cn(\n 'flex size-8 shrink-0 items-center justify-center rounded-block',\n TONE[data.kind],\n )}\n >\n <Icon className=\"size-icon-md\" aria-hidden />\n </span>\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"text-xs text-muted-foreground\">{FLOW_TYPE_NAME[data.kind]}</span>\n <span className=\"text-sm font-medium break-words\">{data.label}</span>\n {wait && <span className=\"text-xs text-muted-foreground\">{wait}</span>}\n {data.active && <span className=\"text-xs font-medium text-primary-text\">Ativo</span>}\n </div>\n {data.edit && (\n <Button\n data-flow-edit\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={`Editar bloco ${nodeName({ type: data.kind, data })}`}\n className=\"nodrag nopan -mt-1 -mr-1 min-h-touch min-w-touch shrink-0\"\n icon={<SquarePen />}\n />\n )}\n </div>\n {invalid && (\n <p\n id={issueId}\n className=\"mt-2 flex flex-wrap gap-x-1 rounded-block bg-destructive-soft p-2 text-xs text-destructive-soft-foreground\"\n >\n <TriangleAlert className=\"size-icon-sm shrink-0\" aria-hidden />\n <strong>Problema</strong> {data.issues.join(' ')}\n </p>\n )}\n {data.kind === 'condicao' && (\n <>\n <span className=\"absolute inset-y-0 right-4 flex items-center text-xs font-medium\">\n Sim\n </span>\n <span className=\"absolute inset-x-0 bottom-3 text-center text-xs font-medium\">Não</span>\n <Handle\n id=\"sim\"\n type=\"source\"\n position={Position.Right}\n className={handle}\n isConnectable={isConnectable}\n />\n <Handle\n id=\"nao\"\n type=\"source\"\n position={Position.Bottom}\n className={handle}\n isConnectable={isConnectable}\n />\n </>\n )}\n {data.kind !== 'condicao' && data.kind !== 'fim' && (\n <Handle\n type=\"source\"\n position={Position.Bottom}\n className={handle}\n isConnectable={isConnectable}\n />\n )}\n </div>\n )\n}\n\nconst nodeTypes = { bloco: FlowBlock }\n\nconst defaultEdgeOptions = { type: 'smoothstep', markerEnd: { type: MarkerType.ArrowClosed } }\n// Folga em cima e embaixo: o zoom fica no topo e a atribuição no canto de baixo, sem cobrir blocos.\nconst fitViewOptions: FitViewOptions = {\n padding: { top: '64px', right: '16px', bottom: '64px', left: '16px' },\n maxZoom: 1,\n}\n\n/** Aproximar, afastar e enquadrar, com 44 px de toque (os botões da biblioteca têm 26 px). */\nexport function FlowZoomControls() {\n const { zoomIn, zoomOut, fitView } = useReactFlow()\n const cls = 'min-h-touch min-w-touch'\n return (\n <div className=\"absolute top-2 left-2 z-10 flex gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n iconOnly\n aria-label=\"Aproximar\"\n className={cls}\n icon={<ZoomIn />}\n onClick={() => void zoomIn()}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n iconOnly\n aria-label=\"Afastar\"\n className={cls}\n icon={<ZoomOut />}\n onClick={() => void zoomOut()}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n iconOnly\n aria-label=\"Enquadrar\"\n className={cls}\n icon={<Maximize2 />}\n onClick={() => void fitView(fitViewOptions)}\n />\n </div>\n )\n}\n\n/** Enquadra de novo quando a largura do canvas muda (painel do teste abrindo, janela redimensionada). */\nfunction FlowAutoFit() {\n const { fitView } = useReactFlow()\n const width = useStore((st) => st.width)\n const before = useRef(0)\n useEffect(() => {\n if (before.current > 0 && width > 0 && width !== before.current) void fitView(fitViewOptions)\n if (width > 0) before.current = width\n }, [width, fitView])\n return null\n}\n\nexport interface FlowSurfaceProps extends ReactFlowProps<FlowRfNode, Edge> {\n children?: ReactNode\n}\n\n/**\n * O canvas: contêiner com a altura que sobra na tela (`h-board`), tema pelos tokens e a\n * biblioteca por dentro. A rolagem horizontal é do canvas (`data-allow-overflow`), nunca da página.\n */\nexport function FlowSurface({ className, children, ...props }: FlowSurfaceProps) {\n const ref = useFillHeight<HTMLDivElement>()\n return (\n <div\n ref={ref}\n data-allow-overflow\n className={cn(\n 'flow-surface relative h-board min-h-viewer w-full min-w-0 overflow-hidden rounded-surface border',\n className,\n )}\n style={\n {\n '--xy-edge-stroke': 'var(--rendra-muted-foreground)',\n '--xy-edge-stroke-selected': 'var(--rendra-primary)',\n '--xy-edge-stroke-width': '2',\n '--xy-connectionline-stroke': 'var(--rendra-primary)',\n '--xy-connectionline-stroke-width': '2',\n '--xy-handle-background-color': 'var(--rendra-primary)',\n '--xy-attribution-background-color': 'var(--rendra-card)',\n '--xy-background-color': 'var(--rendra-muted)',\n } as CSSProperties\n }\n >\n <ReactFlow\n className=\"flow-canvas\"\n nodeTypes={nodeTypes}\n defaultEdgeOptions={defaultEdgeOptions}\n defaultMarkerColor=\"var(--rendra-muted-foreground)\"\n connectionLineType={ConnectionLineType.SmoothStep}\n ariaLabelConfig={FLOW_ARIA}\n fitView\n fitViewOptions={fitViewOptions}\n minZoom={0.25}\n maxZoom={2}\n zoomOnDoubleClick={false}\n zoomOnScroll={false}\n preventScrolling={false}\n {...props}\n >\n <FlowZoomControls />\n <FlowAutoFit />\n {children}\n </ReactFlow>\n </div>\n )\n}\n\nexport interface FlowViewerProps {\n /** O fluxo a mostrar (o mesmo JSON do FlowEditor). */\n value: Flow\n /** Bloco destacado (por exemplo, o passo que a simulação está executando). */\n activeId?: string | null\n /** Problemas de validação (`validateFlow`): os blocos citados ganham marca e texto. */\n issues?: FlowIssue[]\n className?: string\n}\n\n/**\n * Fluxo de automação só para ler: aproximar, afastar e mover o canvas. Não arrasta, não liga,\n * não apaga. Para montar e editar, use o FlowEditor.\n */\nexport function FlowViewer({ value, activeId = null, issues, className }: FlowViewerProps) {\n const nodes = useMemo(\n () => toRfNodes(value, { activeId, issues, handles: 'sm', edit: false }),\n [value, activeId, issues],\n )\n const edges = useMemo(() => toRfEdges(value), [value])\n return (\n <div data-rendra=\"FLX-002\" className={cn('flow-viewer min-w-0', className)}>\n <FlowSurface\n nodes={nodes}\n edges={edges}\n nodesDraggable={false}\n nodesConnectable={false}\n elementsSelectable={false}\n edgesFocusable={false}\n deleteKeyCode={null}\n />\n </div>\n )\n}\n","import {\n ReactFlowProvider,\n applyEdgeChanges,\n applyNodeChanges,\n useReactFlow,\n type Connection,\n type Edge,\n type EdgeChange,\n type NodeChange,\n} from '@xyflow/react'\nimport { CheckCircle2, FlaskConical, ListChecks, Trash2, X } from 'lucide-react'\nimport {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type PointerEvent as ReactPointerEvent,\n} from 'react'\nimport { ActionBar } from '@/components/ui/action-bar'\nimport { Alert } from '@/components/ui/alert'\nimport { Button } from '@/components/ui/button'\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Drawer } from '@/components/ui/drawer'\nimport { Field } from '@/components/ui/field'\nimport {\n FLOW_ICON,\n FlowSurface,\n toRfEdges,\n toRfNodes,\n type FlowRfNode,\n} from '@/components/ui/flow-viewer'\nimport { Input } from '@/components/ui/input'\nimport { Modal } from '@/components/ui/modal'\nimport { Select } from '@/components/ui/select'\nimport { Timeline, type TimelineEvent } from '@/components/ui/timeline'\nimport { useBreakpoint } from '@/hooks/use-breakpoint'\nimport { cn } from '@/lib/cn'\nimport {\n FLOW_NODE_TYPES,\n FLOW_TYPE_NAME,\n nodeName,\n FLOW_WAIT_UNITS,\n addNode,\n advanceSimulation,\n connectNodes,\n moveNode,\n nextCandidates,\n removeEdge,\n removeNode,\n resetSimulation,\n setNext,\n startSimulation,\n updateNodeData,\n validateFlow,\n type Flow,\n type FlowBranch,\n type FlowNode,\n type FlowNodeType,\n type FlowWaitUnit,\n type SimulationState,\n} from '@/lib/flow'\n\n/*\n * Editor de fluxos de automação (React Flow, MIT): monta blocos (gatilho, ação, condição, espera\n * e fim), liga um ao próximo, apaga, valida e testa o caminho. O fluxo é CONTROLADO: `value`\n * entra, `onChange` devolve um fluxo novo (nunca muda o recebido). O JSON é o de `lib/flow.ts`.\n *\n * Largura: a partir do tablet (768 px) monta por mouse ou toque (paleta, arraste, alças). No\n * celular só se vê e se navega; tocar no bloco abre a gaveta, que é onde se edita, se liga ao\n * próximo bloco e se exclui. A gaveta também é o caminho por teclado. Arrastar nunca é o único\n * caminho. Fica fora da entrada principal (@rendra-ui/web/flow), porque depende de @xyflow/react.\n */\n\nexport interface FlowEditorProps {\n /** O fluxo (controlado). */\n value: Flow\n /** Recebe o fluxo novo a cada mudança. */\n onChange: (flow: Flow) => void\n /** Só ver, navegar e testar: nada se monta, liga ou apaga. */\n readOnly?: boolean\n className?: string\n}\n\nconst NODE_W = 256\nconst NODE_H = 72\nconst DRAG_START = 4\nconst NONE = '__nenhum'\n\n/** Reaproveita os objetos de nó que não mudaram (a biblioteca guarda medida e seleção neles). */\nfunction mergeNodes(prev: FlowRfNode[], next: FlowRfNode[]): FlowRfNode[] {\n const old = new Map(prev.map((n) => [n.id, n]))\n return next.map((n) => {\n const o = old.get(n.id)\n if (!o) return n\n const a = o.data\n const b = n.data\n const same =\n !o.dragging &&\n o.position.x === n.position.x &&\n o.position.y === n.position.y &&\n o.ariaLabel === n.ariaLabel &&\n a.label === b.label &&\n a.kind === b.kind &&\n a.config === b.config &&\n a.active === b.active &&\n a.handles === b.handles &&\n a.edit === b.edit &&\n a.issues.length === b.issues.length &&\n a.issues.every((m, i) => m === b.issues[i])\n if (same) return o\n return { ...o, position: o.dragging ? o.position : n.position, ariaLabel: n.ariaLabel, data: b }\n })\n}\n\nfunction mergeEdges(prev: Edge[], next: Edge[]): Edge[] {\n const old = new Map(prev.map((e) => [e.id, e]))\n return next.map((e) => {\n const o = old.get(e.id)\n if (!o) return e\n const same =\n o.source === e.source &&\n o.target === e.target &&\n o.sourceHandle === e.sourceHandle &&\n o.ariaLabel === e.ariaLabel\n return same ? o : { ...o, ...e }\n })\n}\n\n/* --------------------------------------------------------------------------- gaveta */\n\ninterface Draft {\n label: string\n duration: string\n unit: FlowWaitUnit\n next: string\n sim: string\n nao: string\n}\n\nfunction draftOf(node: FlowNode, flow: Flow): Draft {\n const target = (branch?: FlowBranch) =>\n flow.edges.find((e) => e.source === node.id && (branch ? e.branch === branch : true))?.target ??\n NONE\n const cfg = node.data.config\n const unit = FLOW_WAIT_UNITS.find((u) => u === cfg?.unit) ?? 'minutos'\n return {\n label: node.data.label,\n duration: typeof cfg?.duration === 'number' ? String(cfg.duration) : '',\n unit,\n next: node.type === 'condicao' ? NONE : target(),\n sim: node.type === 'condicao' ? target('sim') : NONE,\n nao: node.type === 'condicao' ? target('nao') : NONE,\n }\n}\n\nconst sameDraft = (a: Draft, b: Draft) =>\n a.label === b.label &&\n a.duration === b.duration &&\n a.unit === b.unit &&\n a.next === b.next &&\n a.sim === b.sim &&\n a.nao === b.nao\n\ninterface BlockDrawerProps {\n flow: Flow\n nodeId: string\n open: boolean\n onOpenChange: (open: boolean) => void\n onApply: (flow: Flow) => void\n onDelete: (nodeId: string) => void\n}\n\nfunction BlockDrawer({ flow, nodeId, open, onOpenChange, onApply, onDelete }: BlockDrawerProps) {\n const node = flow.nodes.find((n) => n.id === nodeId)\n const initial = useMemo(() => (node ? draftOf(node, flow) : null), [node, flow])\n const [draft, setDraft] = useState<Draft | null>(initial)\n const [discarding, setDiscarding] = useState(false)\n // O rascunho nasce quando a gaveta abre (key do pai) e não segue o fluxo depois disso.\n if (!node || !initial || !draft) return null\n\n const dirty = !sameDraft(draft, initial)\n const duration = Number(draft.duration)\n const durationError =\n node.type === 'espera' && (draft.duration.trim() === '' || !(duration > 0))\n ? 'Informe um número maior que zero.'\n : undefined\n const set = (patch: Partial<Draft>) => setDraft({ ...draft, ...patch })\n const options = [\n { value: NONE, label: 'Nenhum' },\n ...nextCandidates(flow, node.id).map((n) => ({\n value: n.id,\n label: `${FLOW_TYPE_NAME[n.type]}: ${nodeName(n)}`,\n })),\n ]\n const target = (value: string | null) => (value && value !== NONE ? value : null)\n\n const apply = () => {\n let next = updateNodeData(flow, node.id, {\n label: draft.label,\n ...(node.type === 'espera' ? { config: { duration, unit: draft.unit } } : {}),\n })\n if (node.type === 'condicao') {\n next = setNext(next, node.id, target(draft.sim), 'sim')\n next = setNext(next, node.id, target(draft.nao), 'nao')\n } else if (node.type !== 'fim') {\n next = setNext(next, node.id, target(draft.next))\n }\n onApply(next)\n }\n\n const nextField = (name: string, key: 'next' | 'sim' | 'nao') => (\n <Field label={name} span=\"full\">\n <Select\n label={name}\n options={options}\n value={draft[key]}\n onChange={(v) => set({ [key]: v ?? NONE })}\n />\n </Field>\n )\n\n return (\n <>\n <Drawer\n open={open}\n onOpenChange={onOpenChange}\n title={`Bloco: ${nodeName(node)}`}\n description={FLOW_TYPE_NAME[node.type]}\n dirty={dirty}\n footer={\n <ActionBar\n primary={{\n label: 'Aplicar',\n onClick: apply,\n disabled: draft.label.trim() === '' || Boolean(durationError),\n }}\n cancel={{\n label: 'Cancelar',\n onClick: () => (dirty ? setDiscarding(true) : onOpenChange(false)),\n }}\n secondary={[\n {\n label: 'Excluir bloco',\n icon: <Trash2 />,\n destructive: true,\n onClick: () => onDelete(node.id),\n },\n ]}\n />\n }\n >\n <div className=\"flex flex-col gap-4\">\n <Field\n label=\"Rótulo\"\n span=\"full\"\n error={draft.label.trim() === '' ? 'Informe um rótulo.' : undefined}\n >\n <Input value={draft.label} onChange={(v) => set({ label: v })} />\n </Field>\n {node.type === 'espera' && (\n <>\n <Field label=\"Duração\" span=\"full\" error={durationError}>\n <Input\n value={draft.duration}\n inputMode=\"numeric\"\n onChange={(v) => set({ duration: v })}\n />\n </Field>\n <Field label=\"Unidade\" span=\"full\">\n <Select\n label=\"Unidade\"\n options={FLOW_WAIT_UNITS.map((u) => ({ value: u, label: u }))}\n value={draft.unit}\n onChange={(v) => set({ unit: (v as FlowWaitUnit | null) ?? 'minutos' })}\n />\n </Field>\n </>\n )}\n {node.type === 'condicao' && (\n <>\n {nextField('Se sim', 'sim')}\n {nextField('Se não', 'nao')}\n </>\n )}\n {node.type !== 'condicao' && node.type !== 'fim' && nextField('Próximo bloco', 'next')}\n </div>\n </Drawer>\n <Modal\n open={discarding}\n onOpenChange={setDiscarding}\n type=\"destructive\"\n title=\"Descartar alterações?\"\n description=\"As informações preenchidas neste painel serão perdidas.\"\n confirmLabel=\"Descartar\"\n cancelLabel=\"Continuar editando\"\n onConfirm={() => onOpenChange(false)}\n />\n </>\n )\n}\n\n/* ---------------------------------------------------------------------- simulação */\n\nfunction SimulationPanel({\n flow,\n sim,\n onSim,\n onClose,\n}: {\n flow: Flow\n sim: SimulationState\n onSim: (sim: SimulationState) => void\n onClose: () => void\n}) {\n const waiting = sim.status === 'waiting-choice'\n const current = flow.nodes.find((n) => n.id === sim.currentId)\n const events: TimelineEvent[] = sim.steps.map((s, i) => ({\n id: `${i}-${s.nodeId}`,\n title: s.label,\n description: s.detail,\n date: `Passo ${i + 1}`,\n status: s.status,\n }))\n const choose = (choice: FlowBranch) => onSim(advanceSimulation(flow, sim, choice))\n return (\n <Card role=\"region\" aria-label=\"Teste do fluxo\" className=\"min-w-0 shrink-0 lg:w-popover\">\n <CardHeader\n actions={\n <Button\n size=\"sm\"\n variant=\"ghost\"\n iconOnly\n aria-label=\"Fechar teste\"\n icon={<X />}\n onClick={onClose}\n />\n }\n >\n <CardTitle>Teste do fluxo</CardTitle>\n <CardDescription>Um passo por vez, sem executar nada de verdade.</CardDescription>\n </CardHeader>\n <CardContent className=\"flex flex-col gap-4\">\n <ActionBar\n primary={{\n label: 'Avançar',\n disabled: sim.status !== 'running',\n onClick: () => onSim(advanceSimulation(flow, sim)),\n }}\n cancel={{ label: 'Reiniciar', onClick: () => onSim(startSimulation(flow)) }}\n />\n {sim.status === 'error' && (\n <div className=\"flex flex-col gap-3\">\n <Alert type=\"error\" title=\"O fluxo precisa de ajustes antes do teste\" />\n <ul className=\"flex list-disc flex-col gap-1 pl-4 text-sm\">\n {sim.issues.map((i, k) => (\n <li key={`${i.code}-${k}`}>{i.message}</li>\n ))}\n </ul>\n </div>\n )}\n {waiting && current && (\n <div\n role=\"group\"\n aria-label=\"Escolha o caminho da condição\"\n className=\"flex flex-col gap-3\"\n >\n <p className=\"text-sm font-medium\">{nodeName(current)}</p>\n <div className=\"grid grid-actions-2 gap-3\">\n <Button variant=\"outline\" onClick={() => choose('sim')}>\n Sim\n </Button>\n <Button variant=\"outline\" onClick={() => choose('nao')}>\n Não\n </Button>\n </div>\n </div>\n )}\n {sim.status === 'finished' && (\n <p\n role=\"status\"\n className=\"flex items-center gap-2 text-sm font-medium text-success-soft-foreground\"\n >\n <CheckCircle2 className=\"size-icon-md\" aria-hidden />\n Fluxo concluído\n </p>\n )}\n {events.length > 0 && <Timeline events={events} />}\n {events.length === 0 && sim.status !== 'error' && (\n <p className=\"text-sm text-muted-foreground\">Nenhum passo executado ainda.</p>\n )}\n </CardContent>\n </Card>\n )\n}\n\n/* ------------------------------------------------------------------------ editor */\n\nfunction FlowEditorInner({ value, onChange, readOnly = false, className }: FlowEditorProps) {\n const { isMobile } = useBreakpoint()\n const canEdit = !readOnly\n const canBuild = canEdit && !isMobile\n const { screenToFlowPosition, fitView } = useReactFlow()\n const canvasRef = useRef<HTMLDivElement>(null)\n const noticeId = useId()\n\n const valueRef = useRef(value)\n valueRef.current = value\n const everUsed = useRef(new Set<string>())\n value.nodes.forEach((n) => everUsed.current.add(n.id))\n\n const [validated, setValidated] = useState(false)\n const [sim, setSim] = useState<SimulationState>(resetSimulation)\n const [notice, setNotice] = useState<string | null>(null)\n const [drawer, setDrawer] = useState<{ id: string; session: number } | null>(null)\n const [drawerOpen, setDrawerOpen] = useState(false)\n const drawerOpenRef = useRef(false)\n drawerOpenRef.current = drawerOpen\n const [deleting, setDeleting] = useState<string | null>(null)\n const [drag, setDrag] = useState<{\n type: FlowNodeType\n x: number\n y: number\n over: boolean\n } | null>(null)\n const suppressClick = useRef(false)\n\n const issues = useMemo(() => validateFlow(value), [value])\n const shownIssues = validated ? issues : undefined\n const activeId =\n sim.status === 'running' || sim.status === 'waiting-choice' ? sim.currentId : null\n\n // Estado de interface da biblioteca (medida, seleção, arraste) guardado por bloco; o fluxo em\n // si nunca é copiado: sempre vem de `value`.\n const nextNodes = useMemo(\n () =>\n toRfNodes(value, {\n activeId,\n issues: shownIssues,\n handles: canBuild ? 'lg' : 'sm',\n edit: canBuild,\n }),\n [value, activeId, shownIssues, canBuild],\n )\n const nextEdges = useMemo(() => toRfEdges(value), [value])\n const [rfNodes, setRfNodes] = useState<FlowRfNode[]>(nextNodes)\n const [rfEdges, setRfEdges] = useState<Edge[]>(nextEdges)\n useEffect(() => setRfNodes((prev) => mergeNodes(prev, nextNodes)), [nextNodes])\n useEffect(() => setRfEdges((prev) => mergeEdges(prev, nextEdges)), [nextEdges])\n\n const emit = useCallback(\n (flow: Flow) => {\n setNotice(null)\n onChange(flow)\n },\n [onChange],\n )\n\n const commitMoves = useCallback(\n (moves: { id: string; position: { x: number; y: number } }[]) => {\n let flow = valueRef.current\n for (const m of moves) {\n const cur = flow.nodes.find((n) => n.id === m.id)\n if (cur && (cur.position.x !== m.position.x || cur.position.y !== m.position.y))\n flow = moveNode(flow, m.id, m.position)\n }\n if (flow !== valueRef.current) emit(flow)\n },\n [emit],\n )\n\n const onNodesChange = useCallback(\n (changes: NodeChange<FlowRfNode>[]) => {\n setRfNodes((nds) =>\n applyNodeChanges(\n changes.filter((c) => c.type !== 'remove'),\n nds,\n ),\n )\n const moves = changes.flatMap((c) =>\n c.type === 'position' && c.dragging === false && c.position\n ? [{ id: c.id, position: c.position }]\n : [],\n )\n if (moves.length > 0 && canBuild) commitMoves(moves)\n },\n [canBuild, commitMoves],\n )\n const onEdgesChange = useCallback(\n (changes: EdgeChange[]) =>\n setRfEdges((eds) =>\n applyEdgeChanges(\n changes.filter((c) => c.type !== 'remove'),\n eds,\n ),\n ),\n [],\n )\n\n const onConnect = useCallback(\n (c: Connection) => {\n if (!c.source || !c.target) return\n const branch =\n c.sourceHandle === 'sim' || c.sourceHandle === 'nao' ? c.sourceHandle : undefined\n const r = connectNodes(valueRef.current, c.source, c.target, branch)\n if (r.ok) emit(r.flow)\n else setNotice(r.reason)\n },\n [emit],\n )\n\n const addBlock = useCallback(\n (type: FlowNodeType, at?: { x: number; y: number }) => {\n const flow = valueRef.current\n if (type === 'gatilho' && flow.nodes.some((n) => n.type === 'gatilho')) {\n setNotice('Já existe um gatilho neste fluxo.')\n return\n }\n let pos = at\n if (!pos) {\n const rect = canvasRef.current?.getBoundingClientRect()\n const center = screenToFlowPosition({\n x: (rect?.left ?? 0) + (rect?.width ?? 0) / 2,\n y: (rect?.top ?? 0) + (rect?.height ?? 0) / 2,\n })\n pos = { x: center.x - NODE_W / 2, y: center.y - NODE_H / 2 }\n // Não empilha o bloco novo sobre outro que já esteja ali.\n while (\n flow.nodes.some(\n (n) => Math.abs(n.position.x - pos!.x) < 24 && Math.abs(n.position.y - pos!.y) < 24,\n )\n )\n pos = { x: pos.x + 24, y: pos.y + 24 }\n }\n emit(addNode(flow, type, pos, { reservedIds: everUsed.current }).flow)\n },\n [emit, screenToFlowPosition],\n )\n\n /** Arrastar um item da paleta até o canvas, por pointer events (funciona com mouse e toque). */\n const startPaletteDrag = (e: ReactPointerEvent<HTMLButtonElement>, type: FlowNodeType) => {\n if (e.pointerType === 'mouse' && e.button !== 0) return\n const origin = { x: e.clientX, y: e.clientY }\n let moved = false\n const inside = (x: number, y: number) => {\n const r = canvasRef.current?.getBoundingClientRect()\n return !!r && x >= r.left && x <= r.right && y >= r.top && y <= r.bottom\n }\n const stop = () => {\n window.removeEventListener('pointermove', move)\n window.removeEventListener('pointerup', up)\n window.removeEventListener('pointercancel', cancel)\n window.removeEventListener('keydown', key)\n setDrag(null)\n }\n const move = (ev: PointerEvent) => {\n if (!moved && Math.hypot(ev.clientX - origin.x, ev.clientY - origin.y) < DRAG_START) return\n moved = true\n setDrag({ type, x: ev.clientX, y: ev.clientY, over: inside(ev.clientX, ev.clientY) })\n }\n const up = (ev: PointerEvent) => {\n stop()\n if (!moved) return\n suppressClick.current = true\n setTimeout(() => (suppressClick.current = false), 0)\n if (inside(ev.clientX, ev.clientY)) {\n const p = screenToFlowPosition({ x: ev.clientX, y: ev.clientY })\n addBlock(type, { x: p.x - NODE_W / 2, y: p.y - NODE_H / 2 })\n }\n }\n const cancel = () => {\n stop()\n if (moved) {\n suppressClick.current = true\n setTimeout(() => (suppressClick.current = false), 0)\n }\n }\n const key = (ev: KeyboardEvent) => {\n if (ev.key === 'Escape') cancel()\n }\n window.addEventListener('pointermove', move)\n window.addEventListener('pointerup', up)\n window.addEventListener('pointercancel', cancel)\n window.addEventListener('keydown', key)\n }\n\n const openDrawer = (id: string) => {\n if (!canEdit) return\n setDrawer((d) => ({ id, session: (d?.session ?? 0) + 1 }))\n setDrawerOpen(true)\n }\n\n const viewBlock = (id: string) => {\n setRfNodes((nds) =>\n nds.map((n) => (n.selected === (n.id === id) ? n : { ...n, selected: n.id === id })),\n )\n void fitView({ nodes: [{ id }], padding: 0.5, maxZoom: 1 })\n }\n\n const startTest = () => setSim(startSimulation(value))\n const closeTest = () => setSim(resetSimulation())\n\n const deleteNode = deleting ? value.nodes.find((n) => n.id === deleting) : undefined\n\n return (\n <div data-rendra=\"FLX-001\" className={cn('flow-editor flex min-w-0 flex-col gap-4', className)}>\n <div className=\"flex min-w-0 flex-col gap-4 lg:flex-row lg:items-start\">\n <Card className=\"min-w-0 flex-1\">\n <CardHeader\n actions={\n <>\n <Button\n variant=\"outline\"\n iconOnly={isMobile}\n aria-label=\"Validar\"\n icon={<ListChecks />}\n onClick={() => setValidated(true)}\n >\n {isMobile ? null : 'Validar'}\n </Button>\n <Button\n iconOnly={isMobile}\n aria-label=\"Testar fluxo\"\n icon={<FlaskConical />}\n onClick={startTest}\n >\n {isMobile ? null : 'Testar fluxo'}\n </Button>\n </>\n }\n >\n <CardTitle>Fluxo de automação</CardTitle>\n <CardDescription>Blocos, ligações e teste do caminho.</CardDescription>\n </CardHeader>\n <CardContent className=\"flex flex-col gap-4\">\n {canBuild && (\n <div role=\"group\" aria-label=\"Blocos\" className=\"flex flex-wrap items-center gap-2\">\n {FLOW_NODE_TYPES.map((type) => {\n const Icon = FLOW_ICON[type]\n return (\n <Button\n key={type}\n variant=\"outline\"\n size=\"sm\"\n icon={<Icon />}\n className=\"cursor-grab touch-none\"\n onPointerDown={(e) => startPaletteDrag(e, type)}\n onClick={() => {\n if (suppressClick.current) return\n addBlock(type)\n }}\n >\n {FLOW_TYPE_NAME[type]}\n </Button>\n )\n })}\n </div>\n )}\n <div ref={canvasRef} className=\"min-w-0\">\n <FlowSurface\n className={cn(drag?.over && 'ring-2 ring-primary')}\n nodes={rfNodes}\n edges={rfEdges}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onConnect={onConnect}\n nodesDraggable={canBuild}\n nodesConnectable={canBuild}\n elementsSelectable={canEdit}\n deleteKeyCode={canEdit ? ['Delete', 'Backspace'] : null}\n onBeforeDelete={async () => canEdit && !drawerOpenRef.current}\n onDelete={({ nodes, edges }) => {\n let flow = valueRef.current\n for (const e of edges) flow = removeEdge(flow, e.id)\n for (const n of nodes) flow = removeNode(flow, n.id)\n if (flow !== valueRef.current) emit(flow)\n }}\n onNodeDragStop={(_, __, nodes) =>\n commitMoves(nodes.map((n) => ({ id: n.id, position: n.position })))\n }\n onNodeClick={(e, node) => {\n const fromEditButton = (e.target as HTMLElement).closest('[data-flow-edit]')\n if (isMobile || fromEditButton) openDrawer(node.id)\n }}\n onNodeDoubleClick={(_, node) => openDrawer(node.id)}\n onKeyDown={(e) => {\n const el = e.target as HTMLElement\n if (\n e.key === 'Enter' &&\n el.classList?.contains('react-flow__node') &&\n el.dataset.id\n ) {\n // O foco vai para a gaveta: sem isto o Enter ainda ativaria o primeiro botão dela.\n e.preventDefault()\n openDrawer(el.dataset.id)\n }\n }}\n />\n </div>\n <div\n role=\"status\"\n aria-live=\"polite\"\n id={noticeId}\n className={cn(!notice && 'sr-only')}\n >\n {notice && <Alert type=\"warning\" title={notice} onDismiss={() => setNotice(null)} />}\n </div>\n {validated && (\n <section\n aria-label=\"Validação do fluxo\"\n aria-live=\"polite\"\n className=\"flex flex-col gap-3\"\n >\n {issues.length === 0 ? (\n <Alert type=\"success\" title=\"Fluxo válido\" />\n ) : (\n <>\n <Alert\n type=\"error\"\n title={\n issues.length === 1\n ? '1 problema encontrado'\n : `${issues.length} problemas encontrados`\n }\n />\n <ul className=\"flex flex-col gap-2\">\n {issues.map((i, k) => (\n <li\n key={`${i.code}-${i.nodeId ?? i.edgeId ?? k}`}\n className=\"flex flex-wrap items-center justify-between gap-2 rounded-control border bg-card px-3 py-2 text-sm\"\n >\n <span>{i.message}</span>\n {i.nodeId && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n aria-label={`Ver bloco ${nodeName(\n value.nodes.find((n) => n.id === i.nodeId) ?? {\n type: 'acao',\n data: { label: i.nodeId },\n },\n )}`}\n onClick={() => viewBlock(i.nodeId!)}\n >\n Ver bloco\n </Button>\n )}\n </li>\n ))}\n </ul>\n </>\n )}\n </section>\n )}\n </CardContent>\n </Card>\n {sim.status !== 'idle' && (\n <SimulationPanel flow={value} sim={sim} onSim={setSim} onClose={closeTest} />\n )}\n </div>\n {drag && (\n <div\n aria-hidden\n data-flow-drag\n className=\"pointer-events-none fixed top-0 left-0 z-50 translate-x-(--flow-x) translate-y-(--flow-y) rounded-control border bg-card px-3 py-2 text-sm shadow-md\"\n style={{ '--flow-x': `${drag.x}px`, '--flow-y': `${drag.y}px` } as CSSProperties}\n >\n {FLOW_TYPE_NAME[drag.type]}\n </div>\n )}\n {canEdit && drawer && (\n <BlockDrawer\n key={drawer.session}\n flow={value}\n nodeId={drawer.id}\n open={drawerOpen}\n onOpenChange={setDrawerOpen}\n onApply={(flow) => {\n setDrawerOpen(false)\n emit(flow)\n }}\n onDelete={setDeleting}\n />\n )}\n <Modal\n open={Boolean(deleting)}\n onOpenChange={(o) => !o && setDeleting(null)}\n type=\"destructive\"\n title=\"Excluir este bloco?\"\n description={\n deleteNode\n ? `O bloco \"${nodeName(deleteNode)}\" e as ligações dele serão apagados.`\n : undefined\n }\n confirmLabel=\"Excluir\"\n onConfirm={() => {\n if (!deleting) return\n emit(removeNode(valueRef.current, deleting))\n setDeleting(null)\n setDrawerOpen(false)\n }}\n />\n </div>\n )\n}\n\nexport function FlowEditor(props: FlowEditorProps) {\n return (\n <ReactFlowProvider>\n <FlowEditorInner {...props} />\n </ReactFlowProvider>\n )\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"flow.js","names":[],"sources":["../src/lib/flow-blocks.ts","../src/lib/flow-layout.ts","../src/lib/flow.ts","../src/components/ui/flow-viewer.tsx","../src/components/ui/flow-sidebar.tsx","../src/lib/flow-edit.ts","../src/components/ui/flow-config-panels.tsx","../src/lib/flow-sim.ts","../src/components/ui/flow-simulation-panel.tsx","../src/components/ui/flow-editor.tsx"],"sourcesContent":["/*\n * Catálogo dos blocos de automação: nomes, grupos, configuração padrão, campos obrigatórios,\n * variáveis `{{x}}`, dados de exemplo e resumos de card. Funções puras; nada daqui importa o\n * React Flow nem valores de `flow.ts` (só tipos), para o item `core` do registry não depender\n * dele e para não haver ciclo de módulos.\n */\nimport type {\n Flow,\n FlowEdge,\n FlowNode,\n FlowNodeType,\n FlowRule,\n FlowRuleOperator,\n FlowWaitUnit,\n} from './flow'\n\n/* ----------------------------------------------------------------------- medidas */\n\n/** Largura do card do bloco em px (igual a `w-flow-node`, 21rem). */\nexport const FLOW_CARD_W = 336\nexport const FLOW_GAP_X = 96\nexport const FLOW_GAP_Y = 32\n/** Altura mínima de uma linha de saída da condição em px (alvo de toque, `min-h-touch`). */\nconst ROW_H = 44\n\n/* ------------------------------------------------------------------------ espera */\n\nexport const FLOW_WAIT_UNITS: readonly FlowWaitUnit[] = ['segundos', 'minutos', 'horas', 'dias']\n\nconst WAIT_SINGULAR: Record<FlowWaitUnit, string> = {\n segundos: 'segundo',\n minutos: 'minuto',\n horas: 'hora',\n dias: 'dia',\n}\n\nconst isUnit = (v: unknown): v is FlowWaitUnit =>\n typeof v === 'string' && (FLOW_WAIT_UNITS as readonly string[]).includes(v)\n\n/** A duração do bloco de espera (\"5 minutos\"), ou `null` se o config não a define. */\nexport function formatWait(config: Record<string, unknown> | undefined): string | null {\n const duration = config?.duration\n const unit = config?.unit\n if (typeof duration !== 'number' || !Number.isFinite(duration) || !isUnit(unit)) return null\n return `${duration} ${duration === 1 ? WAIT_SINGULAR[unit] : unit}`\n}\n\n/** Texto da espera simulada: nunca espera de verdade. */\nexport function describeWait(config: Record<string, unknown> | undefined): string {\n const wait = formatWait(config)\n return wait ? `Aguardaria ${wait}` : 'Aguardaria o tempo definido no bloco'\n}\n\n/* ------------------------------------------------------------------------ blocos */\n\nexport type FlowBlockGroupId = 'gatilhos' | 'mensagens' | 'condicionais' | 'integracoes' | 'acoes'\n\nexport interface FlowBlockDef {\n type: FlowNodeType\n group: FlowBlockGroupId\n name: string\n /** Texto curto do card. */\n description: string\n /** Dica usada na busca da barra de blocos. */\n hint: string\n defaultConfig: () => Record<string, unknown>\n /** Campos de `config` que não podem ficar vazios. */\n required: { key: string; label: string }[]\n /** Fora da barra de blocos (tipos legados). */\n hidden?: boolean\n}\n\nconst none = () => ({})\n\nexport const FLOW_BLOCKS: Record<FlowNodeType, FlowBlockDef> = {\n 'webhook-entrada': {\n type: 'webhook-entrada',\n group: 'gatilhos',\n name: 'Receber webhook',\n description: 'Inicia o fluxo quando outro sistema envia dados.',\n hint: 'dados de outro sistema, endereço e mapeamento de campos',\n defaultConfig: () => ({\n method: 'POST',\n path: '/hooks/novo-evento',\n responseCode: 200,\n received: false,\n mapping: [],\n }),\n required: [{ key: 'path', label: 'Endereço' }],\n },\n agendamento: {\n type: 'agendamento',\n group: 'gatilhos',\n name: 'Agendamento',\n description: 'Inicia o fluxo em dia e horário definidos.',\n hint: 'diário, semanal ou mensal, em um horário',\n defaultConfig: () => ({ frequency: 'diario', time: '09:00' }),\n required: [{ key: 'time', label: 'Horário' }],\n },\n 'registro-criado': {\n type: 'registro-criado',\n group: 'gatilhos',\n name: 'Registro criado',\n description: 'Inicia o fluxo quando um registro novo é criado.',\n hint: 'cliente, pedido ou negócio criado',\n defaultConfig: () => ({ record: 'cliente' }),\n required: [],\n },\n whatsapp: {\n type: 'whatsapp',\n group: 'mensagens',\n name: 'Enviar WhatsApp',\n description: 'Envia uma mensagem de WhatsApp.',\n hint: 'mensagem de texto para um telefone',\n defaultConfig: () => ({ to: '', message: '' }),\n required: [\n { key: 'to', label: 'Para' },\n { key: 'message', label: 'Mensagem' },\n ],\n },\n email: {\n type: 'email',\n group: 'mensagens',\n name: 'Enviar e-mail',\n description: 'Envia um e-mail.',\n hint: 'mensagem com assunto para um endereço',\n defaultConfig: () => ({ to: '', subject: '', message: '' }),\n required: [\n { key: 'to', label: 'Para' },\n { key: 'subject', label: 'Assunto' },\n { key: 'message', label: 'Mensagem' },\n ],\n },\n condicao: {\n type: 'condicao',\n group: 'condicionais',\n name: 'Condição',\n description: 'Escolhe o caminho pelas regras.',\n hint: 'regras com campo, operador e valor, e a saída Senão',\n defaultConfig: () => ({ rules: [{ id: 'r1', field: '', operator: 'igual', value: '' }] }),\n required: [],\n },\n espera: {\n type: 'espera',\n group: 'condicionais',\n name: 'Esperar',\n description: 'Aguarda um tempo antes de seguir.',\n hint: 'pausa por segundos, minutos, horas ou dias',\n defaultConfig: () => ({ duration: 5, unit: 'minutos' }),\n required: [],\n },\n 'webhook-saida': {\n type: 'webhook-saida',\n group: 'integracoes',\n name: 'Enviar webhook',\n description: 'Envia dados para outro sistema.',\n hint: 'requisição com corpo montado das variáveis',\n defaultConfig: () => ({ method: 'POST', url: '', headers: [], body: [] }),\n required: [{ key: 'url', label: 'Endereço' }],\n },\n tarefa: {\n type: 'tarefa',\n group: 'acoes',\n name: 'Criar tarefa',\n description: 'Cria uma tarefa para uma pessoa.',\n hint: 'título, responsável e prazo em dias',\n defaultConfig: () => ({ title: '', assignee: '', dueDays: 1 }),\n required: [{ key: 'title', label: 'Título' }],\n },\n gatilho: {\n type: 'gatilho',\n group: 'gatilhos',\n name: 'Gatilho personalizado',\n description: 'Gatilho sem configuração.',\n hint: '',\n defaultConfig: none,\n required: [],\n hidden: true,\n },\n acao: {\n type: 'acao',\n group: 'acoes',\n name: 'Ação personalizada',\n description: 'Ação sem configuração.',\n hint: '',\n defaultConfig: none,\n required: [],\n hidden: true,\n },\n fim: {\n type: 'fim',\n group: 'acoes',\n name: 'Fim',\n description: 'Encerra o caminho.',\n hint: '',\n defaultConfig: none,\n required: [],\n hidden: true,\n },\n}\n\nexport const FLOW_BLOCK_GROUPS: { id: FlowBlockGroupId; name: string; types: FlowNodeType[] }[] = [\n {\n id: 'gatilhos',\n name: 'Gatilhos',\n types: ['webhook-entrada', 'agendamento', 'registro-criado'],\n },\n { id: 'mensagens', name: 'Mensagens', types: ['whatsapp', 'email'] },\n { id: 'condicionais', name: 'Condicionais', types: ['condicao', 'espera'] },\n { id: 'integracoes', name: 'Integrações', types: ['webhook-saida'] },\n { id: 'acoes', name: 'Ações internas', types: ['tarefa'] },\n]\n\n/** Nome do tipo de bloco, como aparece na interface. */\nexport const FLOW_TYPE_NAME = Object.fromEntries(\n (Object.keys(FLOW_BLOCKS) as FlowNodeType[]).map((t) => [t, FLOW_BLOCKS[t].name]),\n) as Record<FlowNodeType, string>\n\n/** Gatilho é todo bloco do grupo Gatilhos (inclui o legado `gatilho`). */\nexport const isTrigger = (type: FlowNodeType) => FLOW_BLOCKS[type].group === 'gatilhos'\n\n/* --------------------------------------------------------------------- campos e dados */\n\nexport const FLOW_SYSTEM_FIELDS: { value: string; label: string }[] = [\n { value: 'cliente.nome', label: 'Cliente › Nome' },\n { value: 'cliente.email', label: 'Cliente › E-mail' },\n { value: 'cliente.telefone', label: 'Cliente › Telefone' },\n { value: 'cliente.plano', label: 'Cliente › Plano' },\n { value: 'negocio.valor', label: 'Negócio › Valor' },\n { value: 'pedido.id', label: 'Pedido › Número' },\n]\n\n/** O JSON de exemplo que \"chega\" no Receber webhook (simulado). */\nexport const FLOW_SAMPLE_PAYLOAD = {\n cliente: {\n nome: 'Ana Souza',\n email: 'ana@exemplo.com',\n telefone: '+55 11 98888-0000',\n plano: 'pro',\n },\n pedido: { id: 'PED-1042', valor: 1250, criado_em: '2026-10-24' },\n}\n\n/** Resposta de exemplo do Enviar webhook (simulado). */\nexport const FLOW_SAMPLE_RESPONSE = '200 OK { \"id\": \"crm-88\" }'\n\n/** Achata o JSON em caminhos (`cliente.nome`) e valores em texto, na ordem de leitura. */\nexport function flattenPayload(payload: unknown, prefix = ''): { path: string; value: string }[] {\n if (payload && typeof payload === 'object' && !Array.isArray(payload))\n return Object.entries(payload).flatMap(([k, v]) =>\n flattenPayload(v, prefix ? `${prefix}.${k}` : k),\n )\n return [{ path: prefix, value: String(payload) }]\n}\n\nconst SAMPLE_VALUES: Record<string, string> = {\n ...Object.fromEntries(flattenPayload(FLOW_SAMPLE_PAYLOAD).map((e) => [e.path, e.value])),\n 'negocio.titulo': 'Proposta Plano Pro',\n 'negocio.valor': '1250',\n 'agendamento.data': '24/10/2026',\n}\n\nconst RECORD_VARIABLES: Record<string, string[]> = {\n cliente: ['cliente.nome', 'cliente.email', 'cliente.telefone'],\n pedido: ['pedido.id', 'pedido.valor', 'cliente.nome'],\n negocio: ['negocio.titulo', 'negocio.valor', 'cliente.nome'],\n}\n\nconst VARIABLE_LABEL: Record<string, string> = {\n ...Object.fromEntries(FLOW_SYSTEM_FIELDS.map((f) => [f.value, f.label])),\n 'pedido.valor': 'Pedido › Valor',\n 'negocio.titulo': 'Negócio › Título',\n 'agendamento.data': 'Agendamento › Data',\n}\n\nexport interface FlowVariable {\n /** O que vai entre chaves: `{{id}}`. */\n id: string\n label: string\n}\n\nexport const asList = (v: unknown): Record<string, unknown>[] =>\n Array.isArray(v)\n ? v.filter((x): x is Record<string, unknown> => !!x && typeof x === 'object')\n : []\n\n/** Variáveis que os blocos podem usar: as do gatilho do fluxo (sem escopo por caminho). */\nexport function flowVariables(flow: Flow): FlowVariable[] {\n const trigger = flow.nodes.find((n) => isTrigger(n.type))\n if (!trigger) return []\n const cfg = trigger.data.config\n if (trigger.type === 'webhook-entrada')\n return asList(cfg?.mapping)\n .filter((m) => typeof m.from === 'string' && typeof m.to === 'string' && m.to !== '')\n .map((m) => ({\n id: m.from as string,\n label: VARIABLE_LABEL[m.to as string] ?? (m.to as string),\n }))\n if (trigger.type === 'registro-criado') {\n const ids = RECORD_VARIABLES[String(cfg?.record)] ?? RECORD_VARIABLES.cliente!\n return ids.map((id) => ({ id, label: VARIABLE_LABEL[id] ?? id }))\n }\n if (trigger.type === 'agendamento')\n return [{ id: 'agendamento.data', label: VARIABLE_LABEL['agendamento.data']! }]\n return []\n}\n\n/** Valores de exemplo de cada variável do fluxo (usados no teste e na simulação). */\nexport function flowSampleData(flow: Flow): Record<string, string> {\n return Object.fromEntries(flowVariables(flow).map((v) => [v.id, SAMPLE_VALUES[v.id] ?? '']))\n}\n\nexport interface TemplatePart {\n kind: 'text' | 'var'\n value: string\n}\n\nconst VARIABLE = /\\{\\{\\s*([\\w.]+)\\s*\\}\\}/g\n\n/** Parte o texto em trechos e variáveis `{{x}}` (as variáveis viram chips no card). */\nexport function splitVariables(text: string): TemplatePart[] {\n const parts: TemplatePart[] = []\n let last = 0\n for (const m of text.matchAll(VARIABLE)) {\n if (m.index > last) parts.push({ kind: 'text', value: text.slice(last, m.index) })\n parts.push({ kind: 'var', value: m[1]! })\n last = m.index + m[0].length\n }\n if (last < text.length) parts.push({ kind: 'text', value: text.slice(last) })\n return parts\n}\n\n/** Troca cada `{{x}}` pelo valor de exemplo; variável sem valor fica como está. */\nexport function renderTemplate(text: string, data: Record<string, string>): string {\n return text.replace(VARIABLE, (whole, id: string) => data[id] ?? whole)\n}\n\n/* ------------------------------------------------------------------------ regras */\n\nexport const FLOW_RULE_OPERATORS: { value: FlowRuleOperator; label: string; symbol: string }[] = [\n { value: 'igual', label: 'é igual a', symbol: '=' },\n { value: 'diferente', label: 'é diferente de', symbol: '≠' },\n { value: 'maior', label: 'é maior que', symbol: '>' },\n { value: 'menor', label: 'é menor que', symbol: '<' },\n { value: 'contem', label: 'contém', symbol: 'contém' },\n { value: 'vazio', label: 'está vazio', symbol: 'vazio' },\n { value: 'nao-vazio', label: 'não está vazio', symbol: 'preenchido' },\n]\n\n/** Operadores que dispensam o valor. */\nexport const operatorHasValue = (op: FlowRuleOperator) => op !== 'vazio' && op !== 'nao-vazio'\n\nconst operatorOf = (op: FlowRuleOperator) => FLOW_RULE_OPERATORS.find((o) => o.value === op)\n\nexport const isRuleComplete = (rule: FlowRule) =>\n rule.field.trim() !== '' &&\n !!operatorOf(rule.operator) &&\n (!operatorHasValue(rule.operator) || rule.value.trim() !== '')\n\n/** \"pedido.valor é maior que 500\". */\nexport function ruleSummary(rule: FlowRule): string {\n if (!isRuleComplete(rule)) return 'Regra incompleta'\n const op = operatorOf(rule.operator)!.label\n return operatorHasValue(rule.operator)\n ? `${rule.field} ${op} ${rule.value}`\n : `${rule.field} ${op}`\n}\n\n/** As regras do bloco condição (lista vazia se o config não as traz). */\nexport function rulesOf(node: Pick<FlowNode, 'data'>): FlowRule[] {\n return asList(node.data.config?.rules).map((r) => ({\n id: String(r.id ?? ''),\n ...(typeof r.label === 'string' ? { label: r.label } : {}),\n field: String(r.field ?? ''),\n operator: (operatorOf(r.operator as FlowRuleOperator)\n ? r.operator\n : 'igual') as FlowRuleOperator,\n value: String(r.value ?? ''),\n }))\n}\n\n/** Nome da saída: o rótulo da regra (ou \"Regra N\") e \"Senão\". */\nexport function branchName(node: Pick<FlowNode, 'data'>, branch: string): string {\n if (branch === 'senao') return 'Senão'\n const rules = rulesOf(node)\n const i = rules.findIndex((r) => r.id === branch)\n return i < 0 ? branch : rules[i]!.label || `Regra ${i + 1}`\n}\n\n/** Menor `rN` livre para uma regra nova. */\nexport function nextRuleId(rules: { id: string }[]): string {\n const taken = new Set(rules.map((r) => r.id))\n let n = 1\n while (taken.has(`r${n}`)) n++\n return `r${n}`\n}\n\n/** Texto curto na ligação que sai de uma condição (\"> 500\", \"= pro\", \"Senão\"). */\nexport function edgeLabel(flow: Flow, edge: FlowEdge): string | null {\n const from = flow.nodes.find((n) => n.id === edge.source)\n if (!from || from.type !== 'condicao' || !edge.branch) return null\n if (edge.branch === 'senao') return 'Senão'\n const rule = rulesOf(from).find((r) => r.id === edge.branch)\n if (!rule) return null\n if (!isRuleComplete(rule)) return branchName(from, edge.branch)\n const symbol = operatorOf(rule.operator)!.symbol\n return operatorHasValue(rule.operator) ? `${symbol} ${rule.value}` : symbol\n}\n\n/** Saídas de um bloco: as regras e \"Senão\" na condição; uma só nos demais. */\nexport function outputIds(node: Pick<FlowNode, 'type' | 'data'>): (string | undefined)[] {\n return node.type === 'condicao' ? [...rulesOf(node).map((r) => r.id), 'senao'] : [undefined]\n}\n\n/* ---------------------------------------------------------------------- resumo */\n\nconst FREQUENCY: Record<string, string> = { diario: 'Diário', semanal: 'Semanal', mensal: 'Mensal' }\nexport const RECORD_LABEL: Record<string, string> = {\n cliente: 'Cliente',\n pedido: 'Pedido',\n negocio: 'Negócio',\n}\n/** O texto, ou vazio quando o valor não é texto. */\nexport const str = (v: unknown) => (typeof v === 'string' ? v : '')\n\n/** Linhas \"rótulo e valor\" do resumo no card (variáveis `{{x}}` viram chips). */\nexport function summarizeConfig(node: Pick<FlowNode, 'type' | 'data'>): {\n label: string\n value: string\n}[] {\n const c = node.data.config\n switch (node.type) {\n case 'webhook-entrada': {\n const mapped = asList(c?.mapping)\n .filter((m) => str(m.to) !== '')\n .map((m) => `{{${str(m.from)}}}`)\n .join(' ')\n return [\n {\n label: 'Método e endereço',\n value: `${str(c?.method) || 'POST'} ${str(c?.path)}`.trim(),\n },\n { label: 'Campos mapeados', value: mapped },\n ]\n }\n case 'agendamento':\n return [\n { label: 'Frequência', value: FREQUENCY[str(c?.frequency)] ?? '' },\n { label: 'Horário', value: str(c?.time) },\n ]\n case 'registro-criado':\n return [{ label: 'Registro', value: RECORD_LABEL[str(c?.record)] ?? '' }]\n case 'whatsapp':\n return [\n { label: 'Para', value: str(c?.to) },\n { label: 'Mensagem', value: str(c?.message) },\n ]\n case 'email':\n return [\n { label: 'Para', value: str(c?.to) },\n { label: 'Assunto', value: str(c?.subject) },\n { label: 'Mensagem', value: str(c?.message) },\n ]\n case 'espera':\n return [{ label: 'Tempo', value: formatWait(c) ?? '' }]\n case 'webhook-saida':\n return [\n {\n label: 'Método e endereço',\n value: `${str(c?.method) || 'POST'} ${str(c?.url)}`.trim(),\n },\n {\n label: 'Corpo',\n value: asList(c?.body)\n .map((b) => str(b.value))\n .filter(Boolean)\n .join(' '),\n },\n ]\n case 'tarefa': {\n const days = typeof c?.dueDays === 'number' ? c.dueDays : 0\n return [\n { label: 'Título', value: str(c?.title) },\n { label: 'Responsável', value: str(c?.assignee) },\n { label: 'Prazo', value: `${days} ${days === 1 ? 'dia' : 'dias'}` },\n ]\n }\n default:\n return []\n }\n}\n\n/** Requisição simulada do Enviar webhook, com os valores de exemplo no corpo. */\nexport function buildWebhookRequest(\n config: Record<string, unknown> | undefined,\n data: Record<string, string>,\n): { method: string; url: string; body: Record<string, string> } {\n const body: Record<string, string> = {}\n for (const b of asList(config?.body))\n if (str(b.key) !== '') body[str(b.key)] = renderTemplate(str(b.value), data)\n return { method: str(config?.method) || 'POST', url: str(config?.url), body }\n}\n\n/** Linhas que o valor do resumo ocupa no card (chips largos quebram em mais de uma). */\nfunction valueLines(value: string): number {\n let width = 0\n for (const part of splitVariables(value))\n width += part.kind === 'var' ? (part.value.length + 4) * 6.6 + 20 : part.value.length * 6.4\n return Math.max(1, Math.ceil(width / 290))\n}\n\n/**\n * Altura estimada do card em px (medida no navegador e arredondada para cima), usada enquanto o\n * React Flow ainda não mediu o bloco: na arrumação automática e ao procurar espaço livre.\n */\nexport function estimateNodeHeight(node: Pick<FlowNode, 'type' | 'data'>): number {\n if (node.type === 'condicao') return 88 + ROW_H * (rulesOf(node).length + 1)\n const rows = summarizeConfig(node)\n let h = 86\n if (rows.length > 0)\n h +=\n 25 + rows.reduce((sum, r) => sum + 20 + 24 * valueLines(r.value), 0) + 8 * (rows.length - 1)\n if (node.type === 'webhook-entrada' && node.data.config?.received === true) h += 44\n return h\n}\n","/*\n * Arrumação automática da esquerda para a direita (usada ao abrir um JSON da 2.7.0, que era\n * vertical). Pura e determinística: sem DOM, termina com ciclo, sem gatilho e com vários gatilhos.\n */\nimport {\n FLOW_CARD_W,\n FLOW_GAP_X,\n FLOW_GAP_Y,\n estimateNodeHeight,\n isTrigger,\n outputIds,\n} from './flow-blocks'\nimport type { Flow, FlowEdge } from './flow'\n\n/** Camada de cada bloco (maior distância do início sem passar pelas ligações que fecham ciclo). */\nexport function layoutFlow(flow: Flow): Flow {\n const byId = new Map(flow.nodes.map((n) => [n.id, n]))\n const edges = flow.edges.filter((e) => byId.has(e.source) && byId.has(e.target))\n\n // Ligações de cada bloco na ordem de saída: as regras, depois \"Senão\".\n const out = new Map<string, FlowEdge[]>()\n for (const n of flow.nodes) {\n const mine = edges.filter((e) => e.source === n.id)\n const order = outputIds(n)\n mine.sort((a, b) => order.indexOf(a.branch) - order.indexOf(b.branch))\n out.set(n.id, mine)\n }\n\n const hasIncoming = new Set(edges.map((e) => e.target))\n let roots = flow.nodes.filter((n) => isTrigger(n.type)).map((n) => n.id)\n if (roots.length === 0) roots = flow.nodes.filter((n) => !hasIncoming.has(n.id)).map((n) => n.id)\n if (roots.length === 0 && flow.nodes[0]) roots = [flow.nodes[0].id]\n\n // Busca em profundidade: ordem de visita, ordem topológica e ligações que fecham ciclo.\n const state = new Map<string, 1 | 2>()\n const preorder = new Map<string, number>()\n const post: string[] = []\n const back = new Set<string>()\n const visit = (id: string) => {\n state.set(id, 1)\n preorder.set(id, preorder.size)\n for (const e of out.get(id) ?? []) {\n if (state.get(e.target) === 1) back.add(e.id)\n else if (!state.has(e.target)) visit(e.target)\n }\n state.set(id, 2)\n post.push(id)\n }\n for (const r of roots) if (!state.has(r)) visit(r)\n\n const layer = new Map<string, number>(roots.map((r) => [r, 0]))\n for (const id of [...post].reverse())\n for (const e of out.get(id) ?? [])\n if (!back.has(e.id))\n layer.set(e.target, Math.max(layer.get(e.target) ?? 0, layer.get(id)! + 1))\n\n const reached = Math.max(-1, ...layer.values())\n const unreachedLayer = reached + 1\n const columns = new Map<number, string[]>()\n const ordered = [...flow.nodes].sort((a, b) => {\n const pa = preorder.get(a.id) ?? Infinity\n const pb = preorder.get(b.id) ?? Infinity\n return pa === pb ? flow.nodes.indexOf(a) - flow.nodes.indexOf(b) : pa - pb\n })\n for (const n of ordered) {\n const l = layer.get(n.id) ?? unreachedLayer\n columns.set(l, [...(columns.get(l) ?? []), n.id])\n }\n\n const position = new Map<string, { x: number; y: number }>()\n for (const [l, ids] of columns) {\n let y = 0\n for (const id of ids) {\n position.set(id, { x: l * (FLOW_CARD_W + FLOW_GAP_X), y })\n y += estimateNodeHeight(byId.get(id)!) + FLOW_GAP_Y\n }\n }\n return { ...flow, nodes: flow.nodes.map((n) => ({ ...n, position: position.get(n.id)! })) }\n}\n","/*\n * Fluxos de automação: contrato do JSON (formato v2), validação, leitura, escrita e conversão da\n * 2.7.0. Funções puras e imutáveis, com tipos próprios do Rendra: nada daqui importa o React Flow,\n * então o item `core` do registry não depende dele. A edição está em `flow-edit.ts`, a simulação\n * em `flow-sim.ts`, o catálogo de blocos em `flow-blocks.ts` e a arrumação em `flow-layout.ts`.\n */\nimport { FLOW_BLOCKS, FLOW_TYPE_NAME, isRuleComplete, isTrigger, rulesOf } from './flow-blocks'\nimport { layoutFlow } from './flow-layout'\n\nexport type FlowNodeType =\n | 'webhook-entrada'\n | 'agendamento'\n | 'registro-criado'\n | 'whatsapp'\n | 'email'\n | 'condicao'\n | 'espera'\n | 'webhook-saida'\n | 'tarefa'\n // legados da 2.7.0: `gatilho` e `acao` seguem válidos; `fim` só existe na leitura da 2.7.0\n | 'gatilho'\n | 'acao'\n | 'fim'\n/** Id da regra da condição, ou `'senao'`. */\nexport type FlowBranch = string\nexport type FlowWaitUnit = 'segundos' | 'minutos' | 'horas' | 'dias'\nexport type FlowRuleOperator =\n 'igual' | 'diferente' | 'maior' | 'menor' | 'contem' | 'vazio' | 'nao-vazio'\n\nexport interface FlowRule {\n id: string\n label?: string\n field: string\n operator: FlowRuleOperator\n /** Vazio nos operadores `vazio` e `nao-vazio`. */\n value: string\n}\n\nexport interface FlowNode {\n id: string\n type: FlowNodeType\n position: { x: number; y: number }\n data: { label: string; config?: Record<string, unknown> }\n}\n\nexport interface FlowEdge {\n id: string\n source: string\n target: string\n /** Só a saída de uma condição usa o ramo: o id da regra ou `senao`. */\n branch?: FlowBranch\n}\n\nexport interface Flow {\n /** Ausente = formato da 2.7.0 (convertido ao ler). */\n version?: 2\n nodes: FlowNode[]\n edges: FlowEdge[]\n}\n\nexport interface FlowIssue {\n code: string\n message: string\n nodeId?: string\n edgeId?: string\n}\n\nconst V2_TYPES: readonly string[] = [\n 'webhook-entrada',\n 'agendamento',\n 'registro-criado',\n 'whatsapp',\n 'email',\n 'condicao',\n 'espera',\n 'webhook-saida',\n 'tarefa',\n 'gatilho',\n 'acao',\n]\nconst LEGACY_TYPES: readonly string[] = ['gatilho', 'acao', 'condicao', 'espera', 'fim']\n\n/** Nome do bloco para mensagens e rótulos: o rótulo, ou o tipo quando ele está vazio. */\nexport const nodeName = (n: Pick<FlowNode, 'type' | 'data'>) =>\n n.data.label.trim() || FLOW_TYPE_NAME[n.type]\n\n/* ---------------------------------------------------------------- conversão da 2.7.0 */\n\nfunction renameEdge(e: FlowEdge): FlowEdge {\n return {\n id: `${e.source}:senao->${e.target}`,\n source: e.source,\n target: e.target,\n branch: 'senao',\n }\n}\n\n/**\n * Leva um fluxo da 2.7.0 (sem `version`) ao formato v2: tira os blocos Fim, a condição vira uma\n * regra \"Sim\" mais \"Senão\", e os blocos são arrumados da esquerda para a direita. Quem já é v2\n * volta igual.\n */\nexport function migrateFlow(flow: Flow): Flow {\n if (flow.version === 2) return flow\n const fim = new Set(flow.nodes.filter((n) => n.type === 'fim').map((n) => n.id))\n const nodes = flow.nodes\n .filter((n) => !fim.has(n.id))\n .map((n) =>\n n.type === 'condicao' && !Array.isArray(n.data.config?.rules)\n ? {\n ...n,\n data: {\n ...n.data,\n config: {\n ...n.data.config,\n rules: [{ id: 'sim', label: 'Sim', field: '', operator: 'igual', value: '' }],\n },\n },\n }\n : n,\n )\n const edges = flow.edges\n .filter((e) => !fim.has(e.source) && !fim.has(e.target))\n .map((e) => (e.branch === 'nao' ? renameEdge(e) : e))\n return layoutFlow({ version: 2, nodes, edges })\n}\n\n/* ------------------------------------------------------------------------ validação */\n\n/** Ligações que saem de cada bloco, na ordem do fluxo. */\nfunction outgoing(flow: Flow) {\n const map = new Map<string, FlowEdge[]>()\n for (const e of flow.edges) map.set(e.source, [...(map.get(e.source) ?? []), e])\n return map\n}\n\nconst filled = (v: unknown) => typeof v === 'string' && v.trim() !== ''\n\n/** Problemas do fluxo, em ordem estável: a mesma entrada dá sempre a mesma lista. */\nexport function validateFlow(input: Flow): FlowIssue[] {\n const flow = migrateFlow(input)\n const issues: FlowIssue[] = []\n const byId = new Map(flow.nodes.map((n) => [n.id, n]))\n const out = outgoing(flow)\n\n const triggers = flow.nodes.filter((n) => isTrigger(n.type))\n if (triggers.length === 0)\n issues.push({ code: 'sem-gatilho', message: 'O fluxo precisa de um gatilho para começar.' })\n else if (triggers.length > 1)\n issues.push({\n code: 'varios-gatilhos',\n message: `O fluxo tem ${triggers.length} gatilhos, mas deve ter só um.`,\n })\n\n // Integridade: ligações apontando para o que não existe, ou com a saída errada.\n const sound: FlowEdge[] = []\n for (const e of flow.edges) {\n const from = byId.get(e.source)\n const to = byId.get(e.target)\n if (!from || !to) {\n issues.push({\n code: 'ligacao-invalida',\n message: 'Há uma ligação que aponta para um bloco que não existe.',\n edgeId: e.id,\n })\n continue\n }\n const validBranch =\n from.type === 'condicao'\n ? !!e.branch && (e.branch === 'senao' || rulesOf(from).some((r) => r.id === e.branch))\n : !e.branch\n if (!validBranch) {\n issues.push({\n code: 'ramo-invalido',\n message:\n from.type === 'condicao'\n ? `Uma saída da condição \"${nodeName(from)}\" não corresponde a nenhuma regra nem ao \"Senão\".`\n : `A ligação que sai de \"${nodeName(from)}\" não pode ter saída de regra: isso só vale para condição.`,\n nodeId: from.id,\n edgeId: e.id,\n })\n continue\n }\n sound.push(e)\n }\n\n for (const n of flow.nodes) {\n const edges = out.get(n.id) ?? []\n const name = nodeName(n)\n const cfg = n.data.config\n if (n.type === 'condicao') {\n const rules = rulesOf(n)\n if (rules.length === 0)\n issues.push({\n code: 'condicao-sem-regra',\n message: `A condição \"${name}\" precisa de ao menos uma regra.`,\n nodeId: n.id,\n })\n rules.forEach((r, i) => {\n if (!isRuleComplete(r))\n issues.push({\n code: 'regra-incompleta',\n message: `A regra ${i + 1} da condição \"${name}\" precisa de campo, operador e valor.`,\n nodeId: n.id,\n })\n })\n const seen = new Set<string>()\n let repeated = false\n for (const e of edges) {\n if (!e.branch) continue\n if (seen.has(e.branch)) repeated = true\n seen.add(e.branch)\n }\n if (repeated)\n issues.push({\n code: 'condicao-saida-repetida',\n message: `A condição \"${name}\" tem mais de uma ligação na mesma saída.`,\n nodeId: n.id,\n })\n } else if (edges.length > 1) {\n issues.push({\n code: 'varias-saidas',\n message: `O bloco \"${name}\" tem mais de uma saída; só a condição pode ter.`,\n nodeId: n.id,\n })\n }\n for (const f of FLOW_BLOCKS[n.type].required)\n if (!filled(cfg?.[f.key]))\n issues.push({\n code: 'config-obrigatoria-vazia',\n message: `O bloco \"${name}\" precisa do campo \"${f.label}\".`,\n nodeId: n.id,\n })\n if (n.type === 'espera' && !(typeof cfg?.duration === 'number' && cfg.duration > 0))\n issues.push({\n code: 'config-obrigatoria-vazia',\n message: `O bloco \"${name}\" precisa de uma duração maior que zero.`,\n nodeId: n.id,\n })\n }\n\n const next = new Map<string, string[]>()\n for (const e of sound) next.set(e.source, [...(next.get(e.source) ?? []), e.target])\n\n // Alcançáveis a partir do gatilho (sem gatilho, nada é acusado: o problema já é outro).\n if (triggers.length > 0) {\n const seen = new Set<string>()\n const stack = triggers.map((t) => t.id)\n while (stack.length) {\n const id = stack.pop()!\n if (seen.has(id)) continue\n seen.add(id)\n stack.push(...(next.get(id) ?? []))\n }\n for (const n of flow.nodes)\n if (!seen.has(n.id))\n issues.push({\n code: 'inalcancavel',\n message: `O bloco \"${nodeName(n)}\" não é alcançado a partir do gatilho.`,\n nodeId: n.id,\n })\n }\n\n // Ciclos: busca em profundidade, uma queixa por laço encontrado.\n const state = new Map<string, 1 | 2>()\n const path: string[] = []\n const visit = (id: string) => {\n state.set(id, 1)\n path.push(id)\n for (const t of next.get(id) ?? []) {\n if (state.get(t) === 1) {\n const loop = [...path.slice(path.indexOf(t)), t].map((x) => `\"${nodeName(byId.get(x)!)}\"`)\n issues.push({\n code: 'ciclo',\n message: `O fluxo volta para um bloco por onde já passou: ${loop.join(' → ')}.`,\n nodeId: t,\n })\n } else if (!state.has(t)) visit(t)\n }\n path.pop()\n state.set(id, 2)\n }\n for (const n of flow.nodes) if (!state.has(n.id)) visit(n.id)\n\n return issues\n}\n\n/* ---------------------------------------------------------------- serialização */\n\nconst sortKeys = (v: unknown): unknown => {\n if (Array.isArray(v)) return v.map(sortKeys)\n if (v && typeof v === 'object')\n return Object.fromEntries(\n Object.keys(v)\n .sort()\n .map((k) => [k, sortKeys((v as Record<string, unknown>)[k])]),\n )\n return v\n}\n\n/**\n * JSON do fluxo (sempre no formato v2, com `version` na primeira chave) e a ordem das chaves\n * fixa: o mesmo fluxo dá sempre o mesmo texto. Um fluxo da 2.7.0 é convertido antes.\n */\nexport function serializeFlow(input: Flow): string {\n const flow = migrateFlow(input)\n const nodes = flow.nodes.map((n) => ({\n id: n.id,\n type: n.type,\n position: { x: n.position.x, y: n.position.y },\n data: n.data.config\n ? { label: n.data.label, config: sortKeys(n.data.config) }\n : { label: n.data.label },\n }))\n const edges = flow.edges.map((e) =>\n e.branch\n ? { id: e.id, source: e.source, target: e.target, branch: e.branch }\n : { id: e.id, source: e.source, target: e.target },\n )\n return JSON.stringify({ version: 2, nodes, edges }, null, 2)\n}\n\nexport type ParseResult = { ok: true; flow: Flow } | { ok: false; errors: string[] }\n\nconst isObject = (v: unknown): v is Record<string, unknown> =>\n typeof v === 'object' && v !== null && !Array.isArray(v)\n\n/**\n * Lê o JSON de um fluxo. Nunca lança; campos que o contrato não conhece são ignorados. Texto sem\n * `version` é lido pelas regras da 2.7.0 e convertido; `version: 2` segue as regras do formato novo.\n */\nexport function parseFlow(text: string): ParseResult {\n let raw: unknown\n try {\n raw = JSON.parse(text)\n } catch {\n return { ok: false, errors: ['O texto não é um JSON válido.'] }\n }\n if (!isObject(raw)) return { ok: false, errors: ['O JSON do fluxo precisa ser um objeto.'] }\n if (raw.version !== undefined && raw.version !== 2)\n return { ok: false, errors: ['Versão do formato não suportada (use 2 ou deixe sem versão).'] }\n if (!Array.isArray(raw.nodes) || !Array.isArray(raw.edges)) {\n const falta = !Array.isArray(raw.nodes) ? 'nodes' : 'edges'\n return { ok: false, errors: [`O campo \"${falta}\" precisa ser uma lista.`] }\n }\n const v2 = raw.version === 2\n const types = v2 ? V2_TYPES : LEGACY_TYPES\n\n const errors: string[] = []\n const nodes: FlowNode[] = []\n const ids = new Set<string>()\n raw.nodes.forEach((item, i) => {\n const at = `Bloco ${i + 1}`\n if (!isObject(item)) return void errors.push(`${at}: precisa ser um objeto.`)\n const { id, type, position, data } = item\n let ok = true\n if (typeof id !== 'string' || id === '') {\n errors.push(`${at}: falta o \"id\".`)\n ok = false\n } else if (ids.has(id)) {\n errors.push(`${at}: o id \"${id}\" está repetido.`)\n ok = false\n } else ids.add(id)\n if (!types.includes(type as string)) {\n errors.push(`${at}: tipo desconhecido (${String(type)}).`)\n ok = false\n }\n const pos = isObject(position) ? position : null\n if (\n !pos ||\n typeof pos.x !== 'number' ||\n typeof pos.y !== 'number' ||\n !Number.isFinite(pos.x) ||\n !Number.isFinite(pos.y)\n ) {\n errors.push(`${at}: \"position\" precisa ter \"x\" e \"y\" numéricos.`)\n ok = false\n }\n if (!isObject(data) || typeof data.label !== 'string') {\n errors.push(`${at}: \"data.label\" precisa ser um texto.`)\n ok = false\n } else if (data.config !== undefined && !isObject(data.config)) {\n errors.push(`${at}: \"data.config\" precisa ser um objeto.`)\n ok = false\n }\n if (ok) {\n const d = data as { label: string; config?: Record<string, unknown> }\n nodes.push({\n id: id as string,\n type: type as FlowNodeType,\n position: { x: (pos as { x: number }).x, y: (pos as { y: number }).y },\n data: d.config ? { label: d.label, config: d.config } : { label: d.label },\n })\n }\n })\n\n const edges: FlowEdge[] = []\n const edgeIds = new Set<string>()\n raw.edges.forEach((item, i) => {\n const at = `Ligação ${i + 1}`\n if (!isObject(item)) return void errors.push(`${at}: precisa ser um objeto.`)\n const { id, source, target, branch } = item\n let ok = true\n for (const [campo, v] of [\n ['id', id],\n ['source', source],\n ['target', target],\n ] as const)\n if (typeof v !== 'string' || v === '') {\n errors.push(`${at}: falta o campo \"${campo}\".`)\n ok = false\n }\n if (ok && edgeIds.has(id as string)) {\n errors.push(`${at}: o id \"${id as string}\" está repetido.`)\n ok = false\n }\n if (branch !== undefined) {\n const valid = v2\n ? typeof branch === 'string' && branch !== ''\n : branch === 'sim' || branch === 'nao'\n if (!valid) {\n errors.push(\n v2\n ? `${at}: \"branch\" precisa ser o id de uma regra ou \"senao\".`\n : `${at}: \"branch\" só pode ser \"sim\" ou \"nao\".`,\n )\n ok = false\n }\n }\n if (ok) {\n edgeIds.add(id as string)\n edges.push(\n branch\n ? {\n id: id as string,\n source: source as string,\n target: target as string,\n branch: branch as FlowBranch,\n }\n : { id: id as string, source: source as string, target: target as string },\n )\n }\n })\n\n if (errors.length > 0) return { ok: false, errors }\n return { ok: true, flow: migrateFlow(v2 ? { version: 2, nodes, edges } : { nodes, edges }) }\n}\n","import {\n BaseEdge,\n ConnectionLineType,\n EdgeLabelRenderer,\n Handle,\n getBezierPath,\n MarkerType,\n Position,\n ReactFlow,\n getNodesBounds,\n useReactFlow,\n useStore,\n type AriaLabelConfig,\n type Edge,\n type EdgeProps,\n type FitViewOptions,\n type Node,\n type NodeProps,\n type ReactFlowProps,\n} from '@xyflow/react'\nimport '@xyflow/react/dist/base.css'\nimport {\n CalendarClock,\n CheckCircle2,\n Cog,\n Flag,\n GitBranch,\n Hourglass,\n Mail,\n MessageCircle,\n Maximize2,\n Play,\n Send,\n SquarePen,\n Trash2,\n TriangleAlert,\n UserPlus,\n Webhook,\n Zap,\n ZoomIn,\n ZoomOut,\n ListChecks,\n} from 'lucide-react'\nimport {\n createContext,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type CSSProperties,\n type ReactNode,\n} from 'react'\nimport { Button } from '@/components/ui/button'\nimport { useFillHeight } from '@/hooks/use-fill-height'\nimport { cn } from '@/lib/cn'\nimport {\n FLOW_BLOCKS,\n FLOW_TYPE_NAME,\n branchName,\n edgeLabel,\n rulesOf,\n ruleSummary,\n splitVariables,\n summarizeConfig,\n type FlowBlockGroupId,\n} from '@/lib/flow-blocks'\nimport { migrateFlow, nodeName, type Flow, type FlowIssue, type FlowNodeType } from '@/lib/flow'\nimport { useMotionLib, useMotionPresets } from '@/lib/motion'\n\n/*\n * Canvas de fluxos de automação (React Flow, MIT). Este arquivo tem o que o FlowViewer e o\n * FlowEditor dividem: o card do bloco, a ligação pontilhada animada, a conversão do `Flow` do\n * Rendra para os nós e ligações da biblioteca, o tema (as variáveis --xy-* apontam para os tokens\n * do Rendra), o zoom próprio de 44 px e os textos de acessibilidade em português.\n *\n * FlowViewer é só leitura: ver, aproximar, afastar e mover o canvas. O que muda o fluxo é do\n * FlowEditor. Fica fora da entrada principal (@rendra-ui/web/flow), porque depende de @xyflow/react.\n */\n\nexport interface FlowBlockData extends Record<string, unknown> {\n label: string\n kind: FlowNodeType\n config?: Record<string, unknown>\n /** Mensagens de validação deste bloco; vazio quando está tudo certo. */\n issues: string[]\n /** Bloco que a simulação executa agora. */\n active: boolean\n}\n\nexport type FlowRfNode = Node<FlowBlockData, 'bloco'>\n\n/** O que o card e a ligação podem pedir ao editor. No viewer não há nada (contexto nulo). */\nexport interface FlowActions {\n play: (id: string) => void\n edit?: (id: string) => void\n remove?: (id: string) => void\n /** Só com montagem liberada: a lixeira da ligação selecionada. */\n removeEdge?: (id: string) => void\n}\n\nexport const FlowActionsContext = createContext<FlowActions | null>(null)\n\n/** Raio de atração das alças em px: menor que o padrão da biblioteca (20), para não ligar sozinho. */\nexport const CONNECTION_RADIUS = 12\n\nexport const FLOW_ICON: Record<FlowNodeType, ComponentType<{ className?: string }>> = {\n 'webhook-entrada': Webhook,\n agendamento: CalendarClock,\n 'registro-criado': UserPlus,\n whatsapp: MessageCircle,\n email: Mail,\n condicao: GitBranch,\n espera: Hourglass,\n 'webhook-saida': Send,\n tarefa: ListChecks,\n gatilho: Zap,\n acao: Cog,\n fim: Flag,\n}\n\nconst TONE: Record<FlowBlockGroupId, string> = {\n gatilhos: 'bg-primary-soft text-primary-soft-foreground',\n mensagens: 'bg-success-soft text-success-soft-foreground',\n condicionais: 'bg-warning-soft text-warning-soft-foreground',\n integracoes: 'bg-info-soft text-info-soft-foreground',\n acoes: 'bg-muted text-muted-foreground',\n}\n\n/** Cor do ícone do bloco, por grupo (também usada na barra de blocos). */\nexport const flowTone = (type: FlowNodeType) => TONE[FLOW_BLOCKS[type].group]\n\nconst DIRECTION: Record<string, string> = {\n up: 'para cima',\n down: 'para baixo',\n left: 'para a esquerda',\n right: 'para a direita',\n}\n\n/** Os textos que a biblioteca escreve no DOM (leitor de tela), em português. */\nexport const FLOW_ARIA: Partial<AriaLabelConfig> = {\n 'node.a11yDescription.default':\n 'Pressione Enter para abrir o bloco, Espaço para selecioná-lo e Delete para apagá-lo. Esc cancela.',\n 'node.a11yDescription.keyboardDisabled':\n 'Pressione Enter para abrir o bloco, Espaço para selecioná-lo e Delete para apagá-lo. Esc cancela.',\n 'node.a11yDescription.ariaLiveMessage': ({ direction, x, y }) =>\n `Bloco movido ${DIRECTION[direction] ?? direction}. Nova posição, x: ${x}, y: ${y}`,\n 'edge.a11yDescription.default':\n 'Pressione Espaço para selecionar a ligação e Delete para apagá-la. Esc cancela.',\n}\n\ninterface RfNodeOptions {\n activeId?: string | null\n issues?: FlowIssue[]\n}\n\n/** Os blocos do Rendra como nós do React Flow (a biblioteca só vê isto). */\nexport function toRfNodes(flow: Flow, opts: RfNodeOptions = {}): FlowRfNode[] {\n const byNode = new Map<string, string[]>()\n for (const issue of opts.issues ?? [])\n if (issue.nodeId) byNode.set(issue.nodeId, [...(byNode.get(issue.nodeId) ?? []), issue.message])\n return flow.nodes.map((n) => ({\n id: n.id,\n type: 'bloco',\n position: n.position,\n ariaLabel: n.data.label,\n domAttributes: { 'aria-roledescription': 'bloco' },\n data: {\n label: n.data.label,\n kind: n.type,\n ...(n.data.config ? { config: n.data.config } : {}),\n issues: byNode.get(n.id) ?? [],\n active: opts.activeId === n.id,\n },\n }))\n}\n\nexport interface FlowEdgeData extends Record<string, unknown> {\n /** Rótulo da regra na ligação (\"> 500\", \"Senão\"); `null` fora da condição. */\n label: string | null\n from: string\n to: string\n}\n\n/** As ligações do Rendra como arestas do React Flow, com a descrição em português. */\nexport function toRfEdges(flow: Flow): Edge<FlowEdgeData>[] {\n const nameOf = new Map(flow.nodes.map((n) => [n.id, nodeName(n)]))\n return flow.edges.map((e) => {\n const label = edgeLabel(flow, e)\n const from = nameOf.get(e.source) ?? e.source\n const to = nameOf.get(e.target) ?? e.target\n return {\n id: e.id,\n source: e.source,\n target: e.target,\n type: 'ligacao',\n animated: true,\n ...(e.branch ? { sourceHandle: e.branch } : {}),\n ariaLabel: `De \"${from}\" para \"${to}\"${label ? `, se ${label}` : ''}`,\n domAttributes: { 'aria-roledescription': 'ligação' },\n data: { label, from, to },\n }\n })\n}\n\n/* --------------------------------------------------------------------------- card */\n\nfunction Port({\n type,\n id,\n isConnectable,\n position = type === 'target' ? Position.Left : Position.Right,\n}: {\n type: 'source' | 'target'\n id?: string\n isConnectable: boolean\n position?: Position\n}) {\n // O Handle é o alvo de 44 px (transparente); o ponto de 12 px é um filho que não recebe toque.\n return (\n <Handle\n id={id}\n type={type}\n position={position}\n className=\"size-touch\"\n isConnectable={isConnectable}\n >\n <span\n aria-hidden\n data-flow-dot\n className=\"pointer-events-none absolute inset-0 m-auto size-3 rounded-full border-2 border-card bg-primary-text\"\n />\n </Handle>\n )\n}\n\nfunction Value({ text }: { text: string }) {\n if (!text) return <span className=\"text-xs text-muted-foreground\">Não definido</span>\n return (\n <span className=\"flex flex-wrap items-center gap-1 text-xs break-words\">\n {splitVariables(text).map((part, i) =>\n part.kind === 'var' ? (\n <span\n key={i}\n data-flow-chip\n className=\"rounded-item bg-primary-soft px-2 py-1 text-primary-soft-foreground\"\n >{`{{${part.value}}}`}</span>\n ) : (\n <span key={i}>{part.value}</span>\n ),\n )}\n </span>\n )\n}\n\nfunction FlowBlock({ id, data, selected, isConnectable }: NodeProps<FlowRfNode>) {\n const lib = useMotionLib()\n const presets = useMotionPresets()\n const actions = useContext(FlowActionsContext)\n const uid = useId()\n const Icon = FLOW_ICON[data.kind]\n const def = FLOW_BLOCKS[data.kind]\n const shape = { type: data.kind, data: { label: data.label, config: data.config } }\n const name = nodeName(shape)\n const summary = summarizeConfig(shape)\n const rules = data.kind === 'condicao' ? rulesOf(shape) : []\n const received = data.kind === 'webhook-entrada' && data.config?.received === true\n const invalid = data.issues.length > 0\n const issueId = `${uid}-problema`\n const descId = `${uid}-descricao`\n const ring = 'pointer-events-none absolute -inset-1 rounded-block border-2 border-primary'\n const action = 'nodrag nopan min-h-touch min-w-touch'\n return (\n <div\n data-flow-node\n data-kind={data.kind}\n data-block-id={id}\n data-active={data.active ? 'true' : undefined}\n data-invalid={invalid ? 'true' : undefined}\n data-selected={selected ? 'true' : undefined}\n aria-describedby={invalid ? `${descId} ${issueId}` : descId}\n className={cn(\n 'relative w-flow-node rounded-block border bg-card text-card-foreground shadow-sm',\n invalid && 'border-destructive',\n data.active && 'border-primary',\n selected && 'ring-2 ring-primary',\n )}\n >\n {data.active &&\n (lib ? (\n <lib.m.span\n aria-hidden\n data-flow-pulse\n className={ring}\n animate={presets.reduced ? { opacity: 1 } : { opacity: [1, 0.3, 1] }}\n transition={\n presets.reduced\n ? presets.fade.transition\n : {\n duration: presets.tokens.duration.pulse,\n ease: presets.tokens.ease.inOut,\n repeat: Infinity,\n }\n }\n />\n ) : (\n <span aria-hidden className={ring} />\n ))}\n {!(def.group === 'gatilhos') && <Port type=\"target\" isConnectable={isConnectable} />}\n <div className=\"flex items-start gap-3 p-3 pb-2\">\n <span\n className={cn(\n 'flex size-8 shrink-0 items-center justify-center rounded-block',\n flowTone(data.kind),\n )}\n >\n <Icon className=\"size-icon-md\" aria-hidden />\n </span>\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span data-flow-title className=\"truncate text-sm font-medium\" title={name}>\n {name}\n </span>\n <span className=\"truncate text-xs text-muted-foreground\">\n {data.active ? 'Ativo' : FLOW_TYPE_NAME[data.kind]}\n </span>\n </div>\n {actions && (\n <div className=\"-mt-3 -mr-3 flex shrink-0\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={`Executar bloco ${name}`}\n className={action}\n icon={<Play />}\n onClick={() => actions.play(id)}\n />\n {actions.edit && (\n <Button\n data-flow-edit\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={`Editar bloco ${name}`}\n className={action}\n icon={<SquarePen />}\n onClick={() => actions.edit?.(id)}\n />\n )}\n {actions.remove && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={`Excluir bloco ${name}`}\n className={action}\n icon={<Trash2 />}\n onClick={() => actions.remove?.(id)}\n />\n )}\n </div>\n )}\n </div>\n <p id={descId} className=\"px-3 pb-3 text-xs text-muted-foreground\">\n {def.description}\n </p>\n {summary.length > 0 && (\n <dl className=\"flex flex-col gap-2 border-t p-3\">\n {summary.map((row) => (\n <div key={row.label} className=\"flex flex-col gap-1\">\n <dt className=\"text-xs text-muted-foreground\">{row.label}</dt>\n <dd>\n <Value text={row.value} />\n </dd>\n </div>\n ))}\n </dl>\n )}\n {received && (\n <p className=\"mx-3 mb-3 flex items-center gap-2 rounded-block bg-success-soft p-2 text-xs text-success-soft-foreground\">\n <CheckCircle2 className=\"size-icon-sm shrink-0\" aria-hidden />\n Dados de exemplo recebidos\n </p>\n )}\n {data.kind === 'condicao' && (\n <div className=\"flex flex-col border-t\">\n {rules.map((rule) => (\n <div\n key={rule.id}\n data-flow-output={rule.id}\n className=\"relative flex min-h-touch items-center justify-between gap-2 border-b px-3 pr-4\"\n >\n <span className=\"text-xs font-medium\">{branchName(shape, rule.id)}</span>\n <span\n className=\"min-w-0 truncate text-xs text-muted-foreground\"\n title={ruleSummary(rule)}\n >\n {ruleSummary(rule)}\n </span>\n <Port type=\"source\" id={rule.id} isConnectable={isConnectable} />\n </div>\n ))}\n <div\n data-flow-output=\"senao\"\n className=\"relative flex min-h-touch items-center justify-between gap-2 px-3 pr-4\"\n >\n <span className=\"text-xs font-medium\">Senão</span>\n <span className=\"min-w-0 truncate text-xs text-muted-foreground\">\n Nenhuma regra bateu\n </span>\n <Port type=\"source\" id=\"senao\" isConnectable={isConnectable} />\n </div>\n </div>\n )}\n {invalid && (\n <p\n id={issueId}\n className=\"m-3 mt-0 flex flex-wrap gap-x-1 rounded-block bg-destructive-soft p-2 text-xs text-destructive-soft-foreground\"\n >\n <TriangleAlert className=\"size-icon-sm shrink-0\" aria-hidden />\n <strong>Problema</strong> {data.issues.join(' ')}\n </p>\n )}\n {data.kind !== 'condicao' && <Port type=\"source\" isConnectable={isConnectable} />}\n </div>\n )\n}\n\n/* ------------------------------------------------------------------------ ligação */\n\n/** Ponto da curva de Bézier de uma ligação (t entre 0 e 1), com os mesmos controles da biblioteca. */\nfunction bezierAt(sx: number, sy: number, tx: number, ty: number, t: number) {\n const d = tx - sx\n const offset = d >= 0 ? 0.5 * d : 0.25 * 25 * Math.sqrt(-d)\n const mt = 1 - t\n const x =\n mt ** 3 * sx + 3 * mt ** 2 * t * (sx + offset) + 3 * mt * t ** 2 * (tx - offset) + t ** 3 * tx\n const y = mt ** 3 * sy + 3 * mt ** 2 * t * sy + 3 * mt * t ** 2 * ty + t ** 3 * ty\n return { x, y }\n}\n\nfunction FlowLink({\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n markerEnd,\n selected,\n data,\n}: EdgeProps<Edge<FlowEdgeData>>) {\n const actions = useContext(FlowActionsContext)\n const [confirming, setConfirming] = useState(false)\n const noRef = useRef<HTMLButtonElement>(null)\n useEffect(() => {\n if (confirming) noRef.current?.focus()\n }, [confirming])\n const [path, midX, midY] = getBezierPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n })\n const start = bezierAt(sourceX, sourceY, targetX, targetY, 0.18)\n const showTrash = Boolean(selected && actions?.removeEdge)\n const names = `${data?.from ?? ''} para ${data?.to ?? ''}`\n const label = data?.label\n return (\n <>\n <BaseEdge id={id} path={path} markerEnd={markerEnd} interactionWidth={24} />\n <EdgeLabelRenderer>\n {label && (\n <div\n className=\"pointer-events-none absolute top-0 left-0 translate-x-(--flow-x) translate-y-(--flow-y)\"\n style={{ '--flow-x': `${start.x}px`, '--flow-y': `${start.y}px` } as CSSProperties}\n >\n <span\n data-flow-edge-label\n className=\"block -translate-x-1/2 -translate-y-1/2 rounded-item border bg-card px-2 py-1 text-xs font-medium text-card-foreground\"\n >\n {label}\n </span>\n </div>\n )}\n {showTrash && actions?.removeEdge && (\n <div\n className=\"pointer-events-none absolute top-0 left-0 z-50 translate-x-(--flow-x) translate-y-(--flow-y)\"\n style={{ '--flow-x': `${midX}px`, '--flow-y': `${midY}px` } as CSSProperties}\n >\n <div\n data-flow-edge-actions\n role=\"presentation\"\n className=\"nodrag nopan pointer-events-auto flex -translate-x-1/2 -translate-y-1/2 items-center gap-2 rounded-control border bg-card p-1 shadow-md\"\n onKeyDown={(e) => {\n if (e.key === 'Escape' && confirming) {\n e.stopPropagation()\n setConfirming(false)\n }\n }}\n >\n {confirming ? (\n <>\n <span\n role=\"alertdialog\"\n aria-label=\"Confirmar exclusão da ligação\"\n className=\"px-2 text-xs font-medium\"\n >\n Excluir ligação?\n </span>\n <Button\n size=\"sm\"\n variant=\"destructive\"\n className=\"min-h-touch\"\n onClick={() => {\n setConfirming(false)\n actions.removeEdge?.(id)\n }}\n >\n Sim\n </Button>\n <Button\n size=\"sm\"\n variant=\"outline\"\n ref={noRef}\n className=\"min-h-touch\"\n onClick={(e) => {\n setConfirming(false)\n e.currentTarget.closest<HTMLElement>('.flow-surface')?.focus()\n }}\n >\n Não\n </Button>\n </>\n ) : (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n iconOnly\n aria-label={`Excluir ligação de ${names}`}\n className=\"min-h-touch min-w-touch\"\n icon={<Trash2 />}\n onClick={() => setConfirming(true)}\n />\n )}\n </div>\n </div>\n )}\n </EdgeLabelRenderer>\n </>\n )\n}\n\nconst nodeTypes = { bloco: FlowBlock }\nconst edgeTypes = { ligacao: FlowLink }\n\nconst defaultEdgeOptions = {\n type: 'ligacao',\n animated: true,\n markerEnd: { type: MarkerType.ArrowClosed },\n}\n// Folga em cima e embaixo: o zoom fica no topo e a atribuição no canto de baixo, sem cobrir blocos.\nconst fitViewOptions: FitViewOptions = {\n padding: { top: '64px', right: '16px', bottom: '64px', left: '16px' },\n maxZoom: 1,\n}\n\n/** Aproximar, afastar e enquadrar, com 44 px de toque (os botões da biblioteca têm 26 px). */\nexport function FlowZoomControls() {\n const { zoomIn, zoomOut, fitView } = useReactFlow()\n const cls = 'min-h-touch min-w-touch'\n return (\n <div className=\"absolute top-2 left-2 z-10 flex gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n iconOnly\n aria-label=\"Aproximar\"\n className={cls}\n icon={<ZoomIn />}\n onClick={() => void zoomIn()}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n iconOnly\n aria-label=\"Afastar\"\n className={cls}\n icon={<ZoomOut />}\n onClick={() => void zoomOut()}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n iconOnly\n aria-label=\"Enquadrar\"\n className={cls}\n icon={<Maximize2 />}\n onClick={() => void fitView(fitViewOptions)}\n />\n </div>\n )\n}\n\n/** Zoom mínimo do enquadramento inicial: abaixo disso os cards e as alças ficam ilegíveis e pequenos demais. */\nexport const MIN_FIT_ZOOM = 0.5\n\n/**\n * Enquadramento inicial e quando a largura do canvas muda. Cabe tudo se o zoom ficar em 50 % ou\n * mais; senão abre em 50 % começando pela esquerda (pelo gatilho) e a pessoa navega. O botão\n * \"Enquadrar\" continua mostrando o fluxo inteiro, sem piso de zoom.\n */\nfunction FlowAutoFit() {\n const { getNodes, setViewport } = useReactFlow()\n const width = useStore((st) => st.width)\n const height = useStore((st) => st.height)\n // `useNodesInitialized` nunca fica verdadeiro no viewer (sem alças conectáveis): basta ter medido os blocos\n const ready = useStore(\n (st) =>\n st.nodeLookup.size > 0 &&\n [...st.nodeLookup.values()].every((n) => (n.measured.width ?? 0) > 0),\n )\n const before = useRef(0)\n // o d3-zoom da biblioteca nasce depois do primeiro quadro: se o viewport ainda não aceitou, tenta de novo\n const [attempt, setAttempt] = useState(0)\n useEffect(() => {\n if (!ready || width <= 0 || height <= 0 || width === before.current) return\n const nodes = getNodes()\n if (nodes.length === 0) return\n const b = getNodesBounds(nodes)\n const fit = Math.min(1, (width - 32) / b.width, (height - 128) / b.height)\n const zoom = Math.max(fit, MIN_FIT_ZOOM)\n const x = zoom === fit ? (width - b.width * zoom) / 2 - b.x * zoom : 16 - b.x * zoom\n // centraliza na vertical, mas nunca abaixo da barra de zoom (64 px de folga no topo)\n const y = Math.max((height - b.height * zoom) / 2, 64) - b.y * zoom\n void setViewport({ x, y, zoom }).then((ok) => {\n if (ok) before.current = width\n else if (attempt < 20) setTimeout(() => setAttempt((a) => a + 1), 50)\n })\n }, [ready, width, height, attempt, getNodes, setViewport])\n return null\n}\n\nexport interface FlowSurfaceProps extends ReactFlowProps<FlowRfNode, Edge> {\n children?: ReactNode\n /** Falso quando o contêiner de fora já dá a altura (o FlowEditor): o canvas só o preenche. */\n fill?: boolean\n}\n\n/**\n * O canvas: contêiner com a altura que sobra na tela (`h-board`), tema pelos tokens e a\n * biblioteca por dentro. A rolagem horizontal é do canvas (`data-allow-overflow`), nunca da página.\n */\nexport function FlowSurface({ className, children, fill = true, ...props }: FlowSurfaceProps) {\n const ref = useFillHeight<HTMLDivElement>()\n return (\n <div\n ref={fill ? ref : undefined}\n tabIndex={-1}\n data-allow-overflow\n className={cn(\n 'flow-surface relative w-full min-w-0 overflow-hidden outline-none',\n fill ? 'h-board min-h-viewer rounded-surface border' : 'h-full',\n className,\n )}\n style={\n {\n '--xy-edge-stroke': 'var(--rendra-muted-foreground)',\n '--xy-edge-stroke-selected': 'var(--rendra-primary)',\n '--xy-edge-stroke-width': '2',\n '--xy-connectionline-stroke': 'var(--rendra-primary)',\n '--xy-connectionline-stroke-width': '2',\n '--xy-handle-background-color': 'var(--rendra-primary-text)',\n '--xy-attribution-background-color': 'var(--rendra-card)',\n '--xy-background-color': 'var(--rendra-muted)',\n } as CSSProperties\n }\n >\n <ReactFlow\n className=\"flow-canvas\"\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n defaultEdgeOptions={defaultEdgeOptions}\n defaultMarkerColor=\"var(--rendra-muted-foreground)\"\n connectionLineType={ConnectionLineType.Bezier}\n connectionRadius={CONNECTION_RADIUS}\n ariaLabelConfig={FLOW_ARIA}\n minZoom={0.1}\n maxZoom={2}\n zoomOnDoubleClick={false}\n zoomOnScroll={false}\n preventScrolling={false}\n {...props}\n >\n <FlowZoomControls />\n <FlowAutoFit />\n {children}\n </ReactFlow>\n </div>\n )\n}\n\nexport interface FlowViewerProps {\n /** O fluxo a mostrar (o mesmo JSON do FlowEditor; o da 2.7.0 também abre). */\n value: Flow\n /** Bloco destacado (por exemplo, o passo que a simulação está executando). */\n activeId?: string | null\n /** Problemas de validação (`validateFlow`): os blocos citados ganham marca e texto. */\n issues?: FlowIssue[]\n className?: string\n}\n\n/**\n * Fluxo de automação só para ler: aproximar, afastar e mover o canvas. Não arrasta, não liga,\n * não apaga. Para montar e editar, use o FlowEditor.\n */\nexport function FlowViewer({ value, activeId = null, issues, className }: FlowViewerProps) {\n const flow = useMemo(() => migrateFlow(value), [value])\n const nodes = useMemo(() => toRfNodes(flow, { activeId, issues }), [flow, activeId, issues])\n const edges = useMemo(() => toRfEdges(flow), [flow])\n return (\n <div data-rendra=\"FLX-002\" className={cn('flow-viewer min-w-0', className)}>\n <FlowSurface\n nodes={nodes}\n edges={edges}\n nodesDraggable={false}\n nodesConnectable={false}\n elementsSelectable={false}\n edgesFocusable={false}\n deleteKeyCode={null}\n />\n </div>\n )\n}\n","import { Search, X } from 'lucide-react'\nimport {\n useId,\n useState,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n type RefObject,\n} from 'react'\nimport { Button } from '@/components/ui/button'\nimport { EmptyState } from '@/components/ui/empty-state'\nimport { FLOW_ICON, flowTone } from '@/components/ui/flow-viewer'\nimport { Input } from '@/components/ui/input'\nimport { cn } from '@/lib/cn'\nimport type { FlowNodeType } from '@/lib/flow'\nimport { FLOW_BLOCKS, FLOW_BLOCK_GROUPS } from '@/lib/flow-blocks'\n\n/*\n * Peças internas da barra lateral do FlowEditor (sem uso direto em tela): a lista de blocos com\n * busca e grupos, e o cabeçalho que os painéis de configuração, teste e validação dividem.\n */\n\nconst normalize = (s: string) => s.normalize('NFD').replace(/\\p{M}/gu, '').toLowerCase()\n\nexport interface FlowBlockListProps {\n /** Clicar no bloco o acrescenta ao fluxo. */\n onAdd: (type: FlowNodeType) => void\n /** Arrastar o bloco até o canvas (só com montagem por mouse ou toque; ausente no celular). */\n onDragStart?: (e: ReactPointerEvent<HTMLButtonElement>, type: FlowNodeType) => void\n /** Vira `true` logo depois de um arraste, para o clique que o segue ser ignorado. */\n suppressClick?: RefObject<boolean>\n}\n\nexport function FlowBlockList({ onAdd, onDragStart, suppressClick }: FlowBlockListProps) {\n const [query, setQuery] = useState('')\n const q = normalize(query.trim())\n const groups = FLOW_BLOCK_GROUPS.map((g) => ({\n ...g,\n types: g.types.filter((t) => {\n const def = FLOW_BLOCKS[t]\n return !def.hidden && (q === '' || normalize(`${def.name} ${def.hint}`).includes(q))\n }),\n })).filter((g) => g.types.length > 0)\n\n return (\n <div className=\"flex flex-col gap-4\">\n <Input\n icon={<Search />}\n value={query}\n onChange={setQuery}\n placeholder=\"Buscar gatilho ou ação\"\n aria-label=\"Buscar bloco\"\n clearable\n />\n {groups.length === 0 && (\n <EmptyState\n size=\"compact\"\n title=\"Nenhum bloco encontrado\"\n description=\"Nenhum bloco tem esse nome.\"\n />\n )}\n {groups.map((g) => (\n <section key={g.id} role=\"group\" aria-label={g.name} className=\"flex flex-col gap-2\">\n <h3 className=\"text-xs font-medium text-muted-foreground\">{g.name}</h3>\n {g.types.map((type) => {\n const Icon = FLOW_ICON[type]\n return (\n <Button\n key={type}\n variant=\"outline\"\n size=\"sm\"\n data-flow-block={type}\n className={cn('w-full justify-start', onDragStart && 'cursor-grab touch-none')}\n icon={\n <span\n className={cn(\n 'flex size-6 items-center justify-center rounded-block',\n flowTone(type),\n )}\n >\n <Icon className=\"size-icon-sm\" aria-hidden />\n </span>\n }\n onPointerDown={onDragStart ? (e) => onDragStart(e, type) : undefined}\n onClick={() => {\n if (suppressClick?.current) return\n onAdd(type)\n }}\n >\n {FLOW_BLOCKS[type].name}\n </Button>\n )\n })}\n </section>\n ))}\n </div>\n )\n}\n\nexport interface FlowPanelShellProps {\n title: string\n /** Fecha o painel e volta à lista de blocos. */\n onClose?: () => void\n closeLabel?: string\n children: ReactNode\n className?: string\n}\n\n/** Cabeçalho comum dos painéis da barra lateral: título e o botão de fechar. */\nexport function FlowPanelShell({\n title,\n onClose,\n closeLabel = 'Fechar painel',\n children,\n className,\n}: FlowPanelShellProps) {\n const id = useId()\n return (\n <section aria-labelledby={id} className={cn('flex flex-col gap-4', className)}>\n <div className=\"flex items-center justify-between gap-2\">\n <h2 id={id} className=\"text-sm font-semibold\">\n {title}\n </h2>\n {onClose && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={closeLabel}\n className=\"min-h-touch min-w-touch\"\n icon={<X />}\n onClick={onClose}\n />\n )}\n </div>\n {children}\n </section>\n )\n}\n","/*\n * Edição pura do fluxo: acrescentar, mover, ligar, desligar e apagar blocos. Imutável, sem DOM.\n * Não é exportada pelo subcaminho `@rendra-ui/web/flow`: só o FlowEditor usa.\n */\nimport {\n FLOW_BLOCKS,\n FLOW_CARD_W,\n FLOW_GAP_X,\n FLOW_GAP_Y,\n FLOW_TYPE_NAME,\n branchName,\n estimateNodeHeight,\n isTrigger,\n outputIds,\n} from './flow-blocks'\nimport {\n migrateFlow,\n nodeName,\n type Flow,\n type FlowBranch,\n type FlowEdge,\n type FlowNode,\n type FlowNodeType,\n} from './flow'\n\nexport interface AddNodeOptions {\n label?: string\n /** Ids que já existiram neste fluxo (mesmo apagados): não voltam a ser usados. */\n reservedIds?: Iterable<string>\n}\n\n/** Acrescenta um bloco com id único e determinístico (`tipo-N`) e a configuração padrão do tipo. */\nexport function addNode(\n input: Flow,\n type: FlowNodeType,\n position: { x: number; y: number },\n options: AddNodeOptions = {},\n): { flow: Flow; id: string } {\n const flow = migrateFlow(input)\n const taken = new Set([...flow.nodes.map((n) => n.id), ...(options.reservedIds ?? [])])\n let n = 1\n while (taken.has(`${type}-${n}`)) n++\n const id = `${type}-${n}`\n const config = FLOW_BLOCKS[type].defaultConfig()\n const node: FlowNode = {\n id,\n type,\n position: { x: position.x, y: position.y },\n data:\n Object.keys(config).length > 0\n ? { label: options.label ?? FLOW_TYPE_NAME[type], config }\n : { label: options.label ?? FLOW_TYPE_NAME[type] },\n }\n return { flow: { ...flow, nodes: [...flow.nodes, node] }, id }\n}\n\nconst edgeId = (source: string, target: string, branch?: FlowBranch) =>\n branch ? `${source}:${branch}->${target}` : `${source}->${target}`\n\n/** Blocos que `id` alcança e que nenhum outro caminho do gatilho alcança sem passar por ele. */\nfunction exclusiveDescendants(flow: Flow, id: string): string[] {\n const reach = (starts: string[], skip?: string) => {\n const seen = new Set<string>()\n const stack = [...starts]\n while (stack.length) {\n const cur = stack.pop()!\n if (seen.has(cur) || cur === skip) continue\n seen.add(cur)\n for (const e of flow.edges) if (e.source === cur) stack.push(e.target)\n }\n return seen\n }\n const below = reach([id])\n below.delete(id)\n const triggers = flow.nodes.filter((n) => isTrigger(n.type) && n.id !== id).map((n) => n.id)\n const alive = reach(triggers, id)\n return flow.nodes.filter((n) => below.has(n.id) && !alive.has(n.id)).map((n) => n.id)\n}\n\nexport type RemoveMode = 'so-este' | 'daqui-para-frente'\n\n/**\n * Apaga o bloco. `so-este`: religa o anterior ao posterior quando o bloco tem uma entrada e uma\n * saída e não é condição. `daqui-para-frente`: apaga também tudo o que só existe por causa dele.\n */\nexport function removeNode(input: Flow, id: string, mode: RemoveMode = 'so-este'): Flow {\n const flow = migrateFlow(input)\n const node = flow.nodes.find((n) => n.id === id)\n if (!node) return flow\n const gone = new Set([\n id,\n ...(mode === 'daqui-para-frente' ? exclusiveDescendants(flow, id) : []),\n ])\n let edges = flow.edges.filter((e) => !gone.has(e.source) && !gone.has(e.target))\n if (mode === 'so-este' && node.type !== 'condicao') {\n const into = flow.edges.filter((e) => e.target === id)\n const from = flow.edges.filter((e) => e.source === id)\n if (into.length === 1 && from.length === 1) {\n const a = into[0]!\n const b = from[0]!\n const bridged: FlowEdge = {\n id: edgeId(a.source, b.target, a.branch),\n source: a.source,\n target: b.target,\n ...(a.branch ? { branch: a.branch } : {}),\n }\n if (a.source !== b.target && !edges.some((e) => e.id === bridged.id))\n edges = [...edges, bridged]\n }\n }\n return { ...flow, nodes: flow.nodes.filter((n) => !gone.has(n.id)), edges }\n}\n\nexport function removeEdge(flow: Flow, id: string): Flow {\n return { ...flow, edges: flow.edges.filter((e) => e.id !== id) }\n}\n\n/** Tira a ligação da saída `branch` de `source` (a única saída, nos blocos comuns). */\nexport function clearOutput(flow: Flow, source: string, branch?: FlowBranch): Flow {\n return {\n ...flow,\n edges: flow.edges.filter((e) => !(e.source === source && (e.branch ?? undefined) === branch)),\n }\n}\n\nexport function moveNode(flow: Flow, id: string, position: { x: number; y: number }): Flow {\n return {\n ...flow,\n nodes: flow.nodes.map((n) =>\n n.id === id ? { ...n, position: { x: position.x, y: position.y } } : n,\n ),\n }\n}\n\n/** Troca o rótulo e/ou o config do bloco (o config informado substitui o anterior). */\nexport function updateNodeData(\n flow: Flow,\n id: string,\n patch: { label?: string; config?: Record<string, unknown> },\n): Flow {\n return {\n ...flow,\n nodes: flow.nodes.map((n) => {\n if (n.id !== id) return n\n const label = patch.label ?? n.data.label\n const config = patch.config ?? n.data.config\n return { ...n, data: config ? { label, config } : { label } }\n }),\n }\n}\n\nexport type ConnectResult =\n | { ok: true; flow: Flow; replaced?: { source: string; target: string; branch?: FlowBranch } }\n | { ok: false; reason: string }\n\n/**\n * Liga dois blocos. A segunda ligação numa saída substitui a primeira e devolve a trocada em\n * `replaced`, para o editor avisar. Recusa, com o motivo, o que o fluxo nunca aceita.\n */\nexport function connectNodes(\n flow: Flow,\n source: string,\n target: string,\n branch?: FlowBranch,\n): ConnectResult {\n const from = flow.nodes.find((n) => n.id === source)\n const to = flow.nodes.find((n) => n.id === target)\n if (!from || !to) return { ok: false, reason: 'Esse bloco não existe mais.' }\n if (source === target) return { ok: false, reason: 'Um bloco não pode ligar a ele mesmo.' }\n if (isTrigger(to.type))\n return { ok: false, reason: 'O gatilho começa o fluxo e não recebe ligação.' }\n if (from.type === 'condicao') {\n if (!branch) return { ok: false, reason: 'Escolha a saída da condição: uma regra ou \"Senão\".' }\n if (!outputIds(from).includes(branch))\n return { ok: false, reason: 'Essa saída não existe mais na condição.' }\n } else if (branch) return { ok: false, reason: 'Só a condição tem saídas por regra.' }\n const id = edgeId(source, target, branch)\n if (flow.edges.some((e) => e.id === id)) return { ok: false, reason: 'Essa ligação já existe.' }\n const sameOutput = (e: FlowEdge) => e.source === source && (e.branch ?? undefined) === branch\n const old = flow.edges.find(sameOutput)\n const edge: FlowEdge = branch ? { id, source, target, branch } : { id, source, target }\n return {\n ok: true,\n flow: { ...flow, edges: [...flow.edges.filter((e) => !sameOutput(e)), edge] },\n ...(old\n ? {\n replaced: {\n source: old.source,\n target: old.target,\n ...(old.branch ? { branch: old.branch } : {}),\n },\n }\n : {}),\n }\n}\n\n/** Blocos que `id` pode ter como próximo: nunca ele mesmo nem um gatilho. */\nexport function nextCandidates(flow: Flow, id: string): FlowNode[] {\n if (!flow.nodes.some((n) => n.id === id)) return []\n return flow.nodes.filter((n) => n.id !== id && !isTrigger(n.type))\n}\n\nexport interface NodeLinks {\n anteriores: { node: FlowNode; saida?: string }[]\n posteriores: { node: FlowNode; saida?: string }[]\n /** Blocos que o modo `daqui-para-frente` apaga além do próprio. */\n descendentes: number\n}\n\n/** Onde o bloco está ligado: quem vem antes, quem vem depois e quantos cairiam junto. */\nexport function describeNodeLinks(flow: Flow, id: string): NodeLinks {\n const byId = new Map(flow.nodes.map((n) => [n.id, n]))\n const self = byId.get(id)\n const anteriores: NodeLinks['anteriores'] = []\n const posteriores: NodeLinks['posteriores'] = []\n for (const e of flow.edges) {\n if (e.target === id) {\n const node = byId.get(e.source)\n if (node)\n anteriores.push({\n node,\n ...(e.branch ? { saida: branchName(node, e.branch) } : {}),\n })\n }\n if (e.source === id && self) {\n const node = byId.get(e.target)\n if (node)\n posteriores.push({\n node,\n ...(e.branch ? { saida: branchName(self, e.branch) } : {}),\n })\n }\n }\n return { anteriores, posteriores, descendentes: exclusiveDescendants(flow, id).length }\n}\n\ntype Rect = { x: number; y: number; w: number; h: number }\n\n/**\n * Primeira posição livre a partir de `from`: desce em passos de `FLOW_GAP_Y` e, se a coluna\n * estiver cheia, passa à coluna da direita. Usa o tamanho medido dos blocos quando há, senão\n * a estimativa. Determinística: o mesmo fluxo e o mesmo ponto dão sempre a mesma posição.\n */\nexport function findFreePosition(\n flow: Flow,\n size: { w: number; h: number },\n from: { x: number; y: number },\n measured: Record<string, { w: number; h: number }> = {},\n): { x: number; y: number } {\n const rects: Rect[] = flow.nodes.map((n) => ({\n x: n.position.x,\n y: n.position.y,\n w: measured[n.id]?.w ?? FLOW_CARD_W,\n h: measured[n.id]?.h ?? estimateNodeHeight(n),\n }))\n const gap = FLOW_GAP_Y / 2\n const free = (x: number, y: number) =>\n rects.every(\n (r) =>\n x + size.w + gap <= r.x ||\n r.x + r.w + gap <= x ||\n y + size.h + gap <= r.y ||\n r.y + r.h + gap <= y,\n )\n for (let col = 0; col < 40; col++) {\n const x = from.x + col * (size.w + FLOW_GAP_X)\n for (let row = 0; row < 60; row++) {\n const y = from.y + row * FLOW_GAP_Y\n if (free(x, y)) return { x, y }\n }\n }\n return { x: from.x, y: from.y }\n}\n\n/** Aviso de troca: \"A ligação anterior de \"X\" para \"Y\" foi trocada.\" */\nexport function replacedMessage(flow: Flow, replaced: { source: string; target: string }): string {\n const name = (id: string) => {\n const n = flow.nodes.find((x) => x.id === id)\n return n ? nodeName(n) : id\n }\n return `A ligação anterior de \"${name(replaced.source)}\" para \"${name(replaced.target)}\" foi trocada.`\n}\n","import { Copy, Plus, Trash2 } from 'lucide-react'\nimport { useId, useState, type ReactNode } from 'react'\nimport { Button } from '@/components/ui/button'\nimport { EmptyState } from '@/components/ui/empty-state'\nimport { Field } from '@/components/ui/field'\nimport { FlowPanelShell } from '@/components/ui/flow-sidebar'\nimport { InfoHint } from '@/components/ui/info-hint'\nimport { Input } from '@/components/ui/input'\nimport { RadioGroup } from '@/components/ui/radio-group'\nimport { Select, type SelectOption } from '@/components/ui/select'\nimport { Tabs } from '@/components/ui/tabs'\nimport { Textarea } from '@/components/ui/textarea'\nimport { toast } from '@/components/ui/toast'\nimport type { Flow, FlowNode, FlowRule, FlowRuleOperator } from '@/lib/flow'\nimport {\n clearOutput,\n connectNodes,\n nextCandidates,\n removeEdge,\n replacedMessage,\n updateNodeData,\n} from '@/lib/flow-edit'\nimport {\n FLOW_BLOCKS,\n FLOW_RULE_OPERATORS,\n FLOW_SAMPLE_PAYLOAD,\n FLOW_SAMPLE_RESPONSE,\n FLOW_SYSTEM_FIELDS,\n FLOW_TYPE_NAME,\n FLOW_WAIT_UNITS,\n branchName,\n asList,\n buildWebhookRequest,\n flattenPayload,\n flowSampleData,\n flowVariables,\n nextRuleId,\n operatorHasValue,\n outputIds,\n rulesOf,\n str,\n type FlowVariable,\n} from '@/lib/flow-blocks'\nimport { nodeName } from '@/lib/flow'\n\n/*\n * Peça interna do FlowEditor: o painel de configuração do bloco selecionado, na barra lateral.\n * Cada alteração se aplica na hora (o card muda junto). Webhooks são simulados: nada é enviado\n * nem recebido de verdade.\n */\n\ntype Rec = Record<string, unknown>\n\nconst list = asList\nconst NONE = '__nenhum'\n\nexport interface BlockConfigPanelProps {\n flow: Flow\n nodeId: string\n /** Recebe o fluxo novo e, quando uma ligação foi trocada, o aviso para mostrar. */\n onApply: (flow: Flow, notice?: string) => void\n /** Ausente no Drawer do celular: quem fecha é o próprio Drawer. */\n onClose?: () => void\n}\n\ninterface PanelCtx {\n flow: Flow\n node: FlowNode\n cfg: Rec\n variables: FlowVariable[]\n set: (patch: Rec) => void\n}\n\nfunction VariableInsert({\n variables,\n label,\n onInsert,\n}: {\n variables: FlowVariable[]\n label: string\n onInsert: (token: string) => void\n}) {\n return (\n <Select\n label={`Inserir variável em ${label}`}\n placeholder=\"Inserir variável\"\n disabled={variables.length === 0}\n value={null}\n options={variables.map((v) => ({ value: v.id, label: v.id, description: v.label }))}\n onChange={(v) => v && onInsert(`{{${v}}}`)}\n />\n )\n}\n\n/** Campo de texto que aceita variáveis `{{x}}`: o texto e o seletor que acrescenta uma no fim. */\nfunction TemplateField({\n label,\n value,\n onChange,\n variables,\n multiline,\n help,\n}: {\n label: string\n value: string\n onChange: (v: string) => void\n variables: FlowVariable[]\n multiline?: boolean\n help?: string\n}) {\n return (\n <div className=\"flex flex-col gap-2\">\n <Field label={label} span=\"full\" help={help}>\n {multiline ? (\n <Textarea rows={3} value={value} onChange={onChange} />\n ) : (\n <Input value={value} onChange={onChange} />\n )}\n </Field>\n <VariableInsert\n variables={variables}\n label={label}\n onInsert={(token) => onChange(value + token)}\n />\n </div>\n )\n}\n\n/** Escolha de uma variável do fluxo para o corpo do webhook: guarda `{{id}}`. */\nfunction VariableSelect({\n label,\n value,\n variables,\n onChange,\n}: {\n label: string\n value: string\n variables: FlowVariable[]\n onChange: (token: string) => void\n}) {\n const current = /^\\{\\{\\s*([\\w.]+)\\s*\\}\\}$/.exec(value)?.[1] ?? null\n const options: SelectOption[] = variables.map((v) => ({\n value: v.id,\n label: v.id,\n description: v.label,\n }))\n if (current && !variables.some((v) => v.id === current))\n options.push({ value: current, label: current })\n return (\n <Select\n label={label}\n placeholder=\"Variável\"\n value={current}\n options={options}\n clearable\n onChange={(v) => onChange(v ? `{{${v}}}` : '')}\n />\n )\n}\n\n/* ------------------------------------------------------------------------ condição */\n\nfunction ConditionFields({\n flow,\n node,\n variables,\n onApply,\n}: PanelCtx & Pick<BlockConfigPanelProps, 'onApply'>) {\n const rules = rulesOf(node)\n const fieldOptions = (rule: FlowRule): SelectOption[] => {\n const opts = variables.map((v) => ({ value: v.id, label: v.id, description: v.label }))\n if (rule.field && !opts.some((o) => o.value === rule.field))\n opts.push({ value: rule.field, label: rule.field, description: '' })\n return opts\n }\n const save = (next: FlowRule[], base: Flow = flow) =>\n onApply(updateNodeData(base, node.id, { config: { ...node.data.config, rules: next } }))\n const patch = (i: number, p: Partial<FlowRule>) =>\n save(rules.map((r, k) => (k === i ? { ...r, ...p } : r)))\n const add = () =>\n save([...rules, { id: nextRuleId(rules), field: '', operator: 'igual', value: '' }])\n const remove = (i: number) => {\n const rule = rules[i]!\n let next = flow\n for (const e of flow.edges)\n if (e.source === node.id && e.branch === rule.id) next = removeEdge(next, e.id)\n save(\n rules.filter((_, k) => k !== i),\n next,\n )\n }\n return (\n <div className=\"flex flex-col gap-4\">\n {rules.map((rule, i) => (\n <div\n key={rule.id}\n role=\"group\"\n aria-label={branchName(node, rule.id)}\n className=\"flex flex-col gap-2 rounded-block border p-3\"\n >\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-sm font-medium\">{branchName(node, rule.id)}</span>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={`Excluir ${branchName(node, rule.id)}`}\n className=\"min-h-touch min-w-touch\"\n icon={<Trash2 />}\n onClick={() => remove(i)}\n />\n </div>\n <Select\n label={`Campo da regra ${i + 1}`}\n placeholder=\"Campo\"\n options={fieldOptions(rule)}\n value={rule.field || null}\n onChange={(v) => patch(i, { field: v ?? '' })}\n />\n <Select\n label={`Operador da regra ${i + 1}`}\n options={FLOW_RULE_OPERATORS.map((o) => ({ value: o.value, label: o.label }))}\n value={rule.operator}\n onChange={(v) => {\n const operator = (v ?? 'igual') as FlowRuleOperator\n patch(i, { operator, ...(operatorHasValue(operator) ? {} : { value: '' }) })\n }}\n />\n {operatorHasValue(rule.operator) && (\n <Input\n aria-label={`Valor da regra ${i + 1}`}\n placeholder=\"Valor\"\n value={rule.value}\n onChange={(v) => patch(i, { value: v })}\n />\n )}\n </div>\n ))}\n {rules.length === 0 && (\n <EmptyState\n size=\"compact\"\n title=\"Nenhuma regra\"\n description=\"A condição ainda não tem regras.\"\n />\n )}\n <Button variant=\"outline\" size=\"sm\" icon={<Plus />} onClick={add}>\n Adicionar regra\n </Button>\n <p className=\"rounded-block bg-muted p-3 text-sm\">\n <span className=\"font-medium\">Senão</span>\n <span className=\"text-muted-foreground\"> segue quando nenhuma regra bater.</span>\n </p>\n </div>\n )\n}\n\n/* -------------------------------------------------------------------------- webhooks */\n\nfunction CodeBlock({ children }: { children: ReactNode }) {\n return (\n <pre className=\"rounded-block bg-muted p-3 text-xs break-words whitespace-pre-wrap text-foreground\">\n {children}\n </pre>\n )\n}\n\nconst ENDPOINT_ORIGIN = 'https://app.exemplo.com'\n\nfunction WebhookInFields({ cfg, set }: PanelCtx) {\n const received = cfg.received === true\n const mapping = list(cfg.mapping)\n const sample = flattenPayload(FLOW_SAMPLE_PAYLOAD)\n const mapOf = (path: string) => mapping.find((m) => str(m.from) === path)\n const setMap = (path: string, to: string | null) =>\n set({\n mapping: [\n ...mapping.filter((m) => str(m.from) !== path),\n ...(to ? [{ from: path, to }] : []),\n ],\n })\n const copy = async () => {\n try {\n await navigator.clipboard.writeText(`${ENDPOINT_ORIGIN}${str(cfg.path)}`)\n toast.success('Endereço copiado')\n } catch {\n toast.error('Não foi possível copiar o endereço')\n }\n }\n return (\n <Tabs\n variant=\"pill\"\n aria-label=\"Webhook de entrada\"\n items={[\n {\n value: 'mapeamento',\n label: 'Mapeamento',\n content: (\n <div className=\"flex flex-col gap-4 pt-4\">\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => set({ received: true })}>\n Simular chegada\n </Button>\n <InfoHint title=\"Mapeamento de campos\">\n Simule a chegada de dados de exemplo e ligue cada campo recebido a um campo do\n sistema. Os campos mapeados viram variáveis para os blocos seguintes.\n </InfoHint>\n </div>\n {!received && (\n <EmptyState\n size=\"compact\"\n title=\"Nenhum dado recebido\"\n description=\"Os campos aparecem depois da chegada simulada.\"\n />\n )}\n {received && (\n <>\n <CodeBlock>{JSON.stringify(FLOW_SAMPLE_PAYLOAD, null, 2)}</CodeBlock>\n <ul aria-label=\"Campos recebidos\" className=\"flex flex-col gap-3\">\n {sample.map((f) => (\n <li key={f.path} className=\"flex flex-col gap-1\">\n <div className=\"flex items-center justify-between gap-2 text-xs\">\n <code className=\"font-medium\">{f.path}</code>\n <span className=\"truncate text-muted-foreground\">{f.value}</span>\n </div>\n <Select\n label={`Campo do sistema para ${f.path}`}\n placeholder=\"Não mapear\"\n searchable\n clearable\n options={FLOW_SYSTEM_FIELDS.map((o) => ({\n value: o.value,\n label: o.label,\n }))}\n value={str(mapOf(f.path)?.to) || null}\n onChange={(v) => setMap(f.path, v)}\n />\n </li>\n ))}\n </ul>\n </>\n )}\n </div>\n ),\n },\n {\n value: 'configuracoes',\n label: 'Configurações',\n content: (\n <div className=\"flex flex-col gap-4 pt-4\">\n <Field label=\"Método\" span=\"full\">\n <Select\n label=\"Método\"\n options={['POST', 'PUT'].map((m) => ({ value: m, label: m }))}\n value={str(cfg.method) || 'POST'}\n onChange={(v) => set({ method: v ?? 'POST' })}\n />\n </Field>\n <Field label=\"Endereço\" span=\"full\" required>\n <Input value={str(cfg.path)} onChange={(v) => set({ path: v })} />\n </Field>\n <Button variant=\"outline\" size=\"sm\" icon={<Copy />} onClick={() => void copy()}>\n Copiar endereço\n </Button>\n <Field label=\"Código de resposta\" span=\"full\">\n <Select\n label=\"Código de resposta\"\n options={[\n { value: '200', label: '200 OK' },\n { value: '202', label: '202 Accepted' },\n { value: '204', label: '204 No Content' },\n ]}\n value={String(cfg.responseCode ?? 200)}\n onChange={(v) => set({ responseCode: Number(v ?? 200) })}\n />\n </Field>\n </div>\n ),\n },\n ]}\n />\n )\n}\n\nfunction WebhookOutFields({ flow, cfg, variables, set }: PanelCtx) {\n const [simulated, setSimulated] = useState(false)\n const body = list(cfg.body)\n const headers = list(cfg.headers)\n const patchBody = (i: number, p: Rec) =>\n set({ body: body.map((b, k) => (k === i ? { ...b, ...p } : b)) })\n const patchHeader = (i: number, p: Rec) =>\n set({ headers: headers.map((h, k) => (k === i ? { ...h, ...p } : h)) })\n const request = buildWebhookRequest(cfg, flowSampleData(flow))\n return (\n <Tabs\n variant=\"pill\"\n aria-label=\"Webhook de saída\"\n items={[\n {\n value: 'corpo',\n label: 'Corpo',\n content: (\n <div className=\"flex flex-col gap-4 pt-4\">\n {body.map((b, i) => (\n <div\n key={i}\n role=\"group\"\n aria-label={`Campo enviado ${i + 1}`}\n className=\"flex flex-col gap-2 rounded-block border p-3\"\n >\n <div className=\"flex items-center gap-2\">\n <Input\n aria-label={`Nome do campo ${i + 1}`}\n placeholder=\"Nome do campo\"\n value={str(b.key)}\n onChange={(v) => patchBody(i, { key: v })}\n />\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={`Excluir campo ${i + 1}`}\n className=\"min-h-touch min-w-touch shrink-0\"\n icon={<Trash2 />}\n onClick={() => set({ body: body.filter((_, k) => k !== i) })}\n />\n </div>\n <VariableSelect\n label={`Variável do campo ${i + 1}`}\n value={str(b.value)}\n variables={variables}\n onChange={(token) => patchBody(i, { value: token })}\n />\n </div>\n ))}\n <Button\n variant=\"outline\"\n size=\"sm\"\n icon={<Plus />}\n onClick={() => set({ body: [...body, { key: '', value: '' }] })}\n >\n Adicionar campo\n </Button>\n <div className=\"flex items-center gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => setSimulated(true)}>\n Simular envio\n </Button>\n <InfoHint title=\"Simulação do envio\">\n Nada é enviado de verdade: a requisição é montada com os dados de exemplo e a\n resposta é uma amostra.\n </InfoHint>\n </div>\n {simulated && (\n <div role=\"region\" aria-label=\"Simulação do envio\" className=\"flex flex-col gap-2\">\n <CodeBlock>\n {`${request.method} ${request.url}\\n${JSON.stringify(request.body, null, 2)}`}\n </CodeBlock>\n <CodeBlock>{FLOW_SAMPLE_RESPONSE}</CodeBlock>\n </div>\n )}\n </div>\n ),\n },\n {\n value: 'configuracoes',\n label: 'Configurações',\n content: (\n <div className=\"flex flex-col gap-4 pt-4\">\n <Field label=\"Método\" span=\"full\">\n <Select\n label=\"Método\"\n options={['POST', 'PUT', 'PATCH'].map((m) => ({ value: m, label: m }))}\n value={str(cfg.method) || 'POST'}\n onChange={(v) => set({ method: v ?? 'POST' })}\n />\n </Field>\n <Field label=\"Endereço\" span=\"full\" required>\n <Input value={str(cfg.url)} onChange={(v) => set({ url: v })} />\n </Field>\n {headers.map((h, i) => (\n <div\n key={i}\n role=\"group\"\n aria-label={`Cabeçalho ${i + 1}`}\n className=\"flex flex-col gap-2 rounded-block border p-3\"\n >\n <Input\n aria-label={`Nome do cabeçalho ${i + 1}`}\n placeholder=\"Nome\"\n value={str(h.name)}\n onChange={(v) => patchHeader(i, { name: v })}\n />\n <div className=\"flex items-center gap-2\">\n <Input\n aria-label={`Valor do cabeçalho ${i + 1}`}\n placeholder=\"Valor\"\n value={str(h.value)}\n onChange={(v) => patchHeader(i, { value: v })}\n />\n <Button\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n aria-label={`Excluir cabeçalho ${i + 1}`}\n className=\"min-h-touch min-w-touch shrink-0\"\n icon={<Trash2 />}\n onClick={() => set({ headers: headers.filter((_, k) => k !== i) })}\n />\n </div>\n </div>\n ))}\n <Button\n variant=\"outline\"\n size=\"sm\"\n icon={<Plus />}\n onClick={() => set({ headers: [...headers, { name: '', value: '' }] })}\n >\n Adicionar cabeçalho\n </Button>\n </div>\n ),\n },\n ]}\n />\n )\n}\n\n/* --------------------------------------------------------------------------- ligações */\n\nfunction LinkFields({\n flow,\n node,\n onApply,\n}: {\n flow: Flow\n node: FlowNode\n onApply: BlockConfigPanelProps['onApply']\n}) {\n const options: SelectOption[] = [\n { value: NONE, label: 'Nenhum' },\n ...nextCandidates(flow, node.id).map((n) => ({\n value: n.id,\n label: `${FLOW_TYPE_NAME[n.type]}: ${nodeName(n)}`,\n })),\n ]\n return (\n <div className=\"flex flex-col gap-3\">\n {outputIds(node).map((out) => {\n const label = out ? `Próximo bloco: ${branchName(node, out)}` : 'Próximo bloco'\n const current = flow.edges.find(\n (e) => e.source === node.id && (e.branch ?? undefined) === out,\n )\n return (\n <Field key={out ?? 'unica'} label={label} span=\"full\">\n <Select\n label={label}\n options={options}\n value={current?.target ?? NONE}\n onChange={(v) => {\n if (!v || v === NONE) return onApply(clearOutput(flow, node.id, out))\n const r = connectNodes(flow, node.id, v, out)\n if (!r.ok) return onApply(flow, r.reason)\n onApply(r.flow, r.replaced ? replacedMessage(flow, r.replaced) : undefined)\n }}\n />\n </Field>\n )\n })}\n </div>\n )\n}\n\n/* ---------------------------------------------------------------------------- painel */\n\nexport function BlockConfigPanel({ flow, nodeId, onApply, onClose }: BlockConfigPanelProps) {\n const uid = useId()\n const node = flow.nodes.find((n) => n.id === nodeId)\n if (!node) return null\n const cfg: Rec = node.data.config ?? {}\n const variables = flowVariables(flow)\n const set = (patch: Rec) =>\n onApply(updateNodeData(flow, node.id, { config: { ...cfg, ...patch } }))\n const ctx: PanelCtx = { flow, node, cfg, variables, set }\n const t = (key: string, label: string, opts: { multiline?: boolean } = {}) => (\n <TemplateField\n key={`${uid}-${key}`}\n label={label}\n multiline={opts.multiline}\n value={str(cfg[key])}\n variables={variables}\n onChange={(v) => set({ [key]: v })}\n />\n )\n\n let fields: ReactNode = null\n switch (node.type) {\n case 'webhook-entrada':\n fields = <WebhookInFields {...ctx} />\n break\n case 'webhook-saida':\n fields = <WebhookOutFields {...ctx} />\n break\n case 'agendamento':\n fields = (\n <>\n <Field label=\"Frequência\" span=\"full\">\n <Select\n label=\"Frequência\"\n options={[\n { value: 'diario', label: 'Diário' },\n { value: 'semanal', label: 'Semanal' },\n { value: 'mensal', label: 'Mensal' },\n ]}\n value={str(cfg.frequency) || 'diario'}\n onChange={(v) => set({ frequency: v ?? 'diario' })}\n />\n </Field>\n <Field label=\"Horário\" span=\"full\" required>\n <Input type=\"time\" value={str(cfg.time)} onChange={(v) => set({ time: v })} />\n </Field>\n </>\n )\n break\n case 'registro-criado':\n fields = (\n <RadioGroup\n aria-label=\"Registro\"\n options={[\n { value: 'cliente', label: 'Cliente' },\n { value: 'pedido', label: 'Pedido' },\n { value: 'negocio', label: 'Negócio' },\n ]}\n value={str(cfg.record) || 'cliente'}\n onChange={(v) => set({ record: v })}\n />\n )\n break\n case 'whatsapp':\n fields = (\n <>\n {t('to', 'Para')}\n {t('message', 'Mensagem', { multiline: true })}\n </>\n )\n break\n case 'email':\n fields = (\n <>\n {t('to', 'Para')}\n {t('subject', 'Assunto')}\n {t('message', 'Mensagem', { multiline: true })}\n </>\n )\n break\n case 'tarefa':\n fields = (\n <>\n {t('title', 'Título')}\n <Field label=\"Responsável\" span=\"full\">\n <Input value={str(cfg.assignee)} onChange={(v) => set({ assignee: v })} />\n </Field>\n <Field label=\"Prazo em dias\" span=\"full\">\n <Input\n inputMode=\"numeric\"\n value={String(cfg.dueDays ?? '')}\n onChange={(v) => set({ dueDays: Number(v.replace(/\\D/g, '')) || 0 })}\n />\n </Field>\n </>\n )\n break\n case 'espera':\n fields = (\n <>\n <Field\n label=\"Duração\"\n span=\"full\"\n error={\n typeof cfg.duration === 'number' && cfg.duration > 0\n ? undefined\n : 'Informe um número maior que zero.'\n }\n >\n <Input\n inputMode=\"numeric\"\n value={cfg.duration === undefined ? '' : String(cfg.duration)}\n onChange={(v) => set({ duration: Number(v.replace(/\\D/g, '')) || 0 })}\n />\n </Field>\n <Field label=\"Unidade\" span=\"full\">\n <Select\n label=\"Unidade\"\n options={FLOW_WAIT_UNITS.map((u) => ({ value: u, label: u }))}\n value={str(cfg.unit) || 'minutos'}\n onChange={(v) => set({ unit: v ?? 'minutos' })}\n />\n </Field>\n </>\n )\n break\n case 'condicao':\n fields = <ConditionFields {...ctx} onApply={onApply} />\n break\n default:\n break\n }\n\n return (\n <FlowPanelShell\n title={FLOW_BLOCKS[node.type].name}\n onClose={onClose}\n closeLabel=\"Fechar configuração\"\n >\n <Field label=\"Nome do bloco\" span=\"full\">\n <Input\n value={node.data.label}\n onChange={(v) => onApply(updateNodeData(flow, node.id, { label: v }))}\n />\n </Field>\n {fields}\n <section aria-label=\"Ligações\" className=\"flex flex-col gap-3 border-t pt-4\">\n <h3 className=\"text-xs font-medium text-muted-foreground\">Ligações</h3>\n <LinkFields flow={flow} node={node} onApply={onApply} />\n </section>\n </FlowPanelShell>\n )\n}\n","/*\n * Simulação do fluxo, um passo por vez e sem executar nada: a espera só diz quanto aguardaria e\n * as mensagens só dizem o que enviariam, com os dados de exemplo do gatilho. Pura, sem DOM.\n */\nimport {\n buildWebhookRequest,\n describeWait,\n flowSampleData,\n isTrigger,\n RECORD_LABEL,\n renderTemplate,\n rulesOf,\n ruleSummary,\n str,\n} from './flow-blocks'\nimport {\n migrateFlow,\n nodeName,\n validateFlow,\n type Flow,\n type FlowIssue,\n type FlowNode,\n type FlowNodeType,\n type FlowRule,\n} from './flow'\n\nexport interface SimulationStep {\n nodeId: string\n type: FlowNodeType\n label: string\n status: 'succeeded' | 'failed' | 'skipped'\n detail?: string\n}\n\nexport interface SimulationState {\n status: 'idle' | 'running' | 'finished' | 'error'\n steps: SimulationStep[]\n /** Bloco que o próximo avanço executa (o bloco ativo); `null` fora da simulação. */\n currentId: string | null\n issues: FlowIssue[]\n}\n\nexport function resetSimulation(): SimulationState {\n return { status: 'idle', steps: [], currentId: null, issues: [] }\n}\n\n/** Começa no gatilho. Fluxo inválido não inicia: devolve `error` com os problemas. */\nexport function startSimulation(input: Flow): SimulationState {\n const flow = migrateFlow(input)\n const issues = validateFlow(flow)\n if (issues.length > 0) return { status: 'error', steps: [], currentId: null, issues }\n const trigger = flow.nodes.find((n) => isTrigger(n.type))!\n return { status: 'running', steps: [], currentId: trigger.id, issues: [] }\n}\n\n/** Avalia uma regra contra os dados de exemplo; campo que não existe conta como vazio. */\nexport function evaluateRule(rule: FlowRule, data: Record<string, string>): boolean {\n const actual = data[rule.field] ?? ''\n const wanted = rule.value\n switch (rule.operator) {\n case 'igual':\n return actual === wanted\n case 'diferente':\n return actual !== wanted\n case 'maior':\n case 'menor': {\n const a = Number(actual)\n const b = Number(wanted)\n if (actual.trim() === '' || wanted.trim() === '' || Number.isNaN(a) || Number.isNaN(b))\n return false\n return rule.operator === 'maior' ? a > b : a < b\n }\n case 'contem':\n return actual.includes(wanted)\n case 'vazio':\n return actual === ''\n case 'nao-vazio':\n return actual !== ''\n }\n}\n\nconst FREQUENCY: Record<string, string> = {\n diario: 'todo dia',\n semanal: 'toda semana',\n mensal: 'todo mês',\n}\n\n/** A regra que bate primeiro (ou `null`, e o caminho segue por \"Senão\"). */\nfunction matchedRule(node: FlowNode, data: Record<string, string>) {\n const rules = rulesOf(node)\n const index = rules.findIndex((r) => evaluateRule(r, data))\n return { rule: index < 0 ? null : rules[index]!, index }\n}\n\nfunction conditionDetail(node: FlowNode, data: Record<string, string>) {\n const { rule, index } = matchedRule(node, data)\n return rule\n ? `Regra ${index + 1} bateu: ${ruleSummary(rule)}, seguiu por ela`\n : 'Nenhuma regra bateu, seguiu por Senão'\n}\n\nfunction blockDetail(node: FlowNode, data: Record<string, string>): string {\n const c = node.data.config\n switch (node.type) {\n case 'webhook-entrada':\n return `Receberia ${str(c?.method) || 'POST'} em ${str(c?.path)}`\n case 'agendamento':\n return `Iniciaria ${FREQUENCY[str(c?.frequency)] ?? ''} às ${str(c?.time)}`.replace(' ', ' ')\n case 'registro-criado':\n return `Iniciaria quando um ${(RECORD_LABEL[str(c?.record)] ?? 'registro').toLowerCase()} fosse criado`\n case 'whatsapp':\n return `Enviaria WhatsApp para ${renderTemplate(str(c?.to), data)}: \"${renderTemplate(str(c?.message), data)}\"`\n case 'email':\n return `Enviaria e-mail para ${renderTemplate(str(c?.to), data)}, assunto \"${renderTemplate(str(c?.subject), data)}\": \"${renderTemplate(str(c?.message), data)}\"`\n case 'espera':\n return describeWait(c)\n case 'webhook-saida': {\n const r = buildWebhookRequest(c, data)\n return `Enviaria ${r.method} ${r.url} com ${JSON.stringify(r.body)}`\n }\n case 'tarefa': {\n const days = typeof c?.dueDays === 'number' ? c.dueDays : 0\n return `Criaria a tarefa \"${renderTemplate(str(c?.title), data)}\" para ${str(c?.assignee) || 'ninguém'} com prazo de ${days} ${days === 1 ? 'dia' : 'dias'}`\n }\n case 'condicao':\n return conditionDetail(node, data)\n default:\n return 'Executaria o bloco'\n }\n}\n\nconst stepOf = (node: FlowNode, detail: string): SimulationStep => ({\n nodeId: node.id,\n type: node.type,\n label: nodeName(node),\n status: 'succeeded',\n detail,\n})\n\n/** Roda só um bloco, com os mesmos dados de exemplo, e devolve o passo (o play do card). */\nexport function simulateBlock(input: Flow, nodeId: string): SimulationStep | null {\n const flow = migrateFlow(input)\n const node = flow.nodes.find((n) => n.id === nodeId)\n return node ? stepOf(node, blockDetail(node, flowSampleData(flow))) : null\n}\n\n/** Executa o bloco ativo (um passo) e passa ao próximo. A condição escolhe sozinha a saída. */\nexport function advanceSimulation(input: Flow, state: SimulationState): SimulationState {\n if (state.status !== 'running' || !state.currentId) return state\n const flow = migrateFlow(input)\n const node = flow.nodes.find((n) => n.id === state.currentId)\n const fail = (): SimulationState => ({\n ...state,\n status: 'error',\n currentId: null,\n issues: [\n {\n code: 'fluxo-mudou',\n message: 'O fluxo mudou durante o teste. Reinicie para testar de novo.',\n },\n ],\n })\n if (!node) return fail()\n\n const data = flowSampleData(flow)\n let output: string | undefined\n if (node.type === 'condicao') output = matchedRule(node, data).rule?.id ?? 'senao'\n const edge = flow.edges.find((e) => e.source === node.id && (e.branch ?? undefined) === output)\n const target = edge ? flow.nodes.find((n) => n.id === edge.target) : undefined\n if (edge && !target) return fail()\n\n const detail = blockDetail(node, data)\n const step = stepOf(node, target ? detail : `${detail}. Caminho encerrado`)\n const steps = [...state.steps, step]\n if (!target) return { status: 'finished', steps, currentId: null, issues: [] }\n return { status: 'running', steps, currentId: target.id, issues: [] }\n}\n","import { CheckCircle2 } from 'lucide-react'\nimport { ActionBar } from '@/components/ui/action-bar'\nimport { Alert } from '@/components/ui/alert'\nimport { Button } from '@/components/ui/button'\nimport { FlowPanelShell } from '@/components/ui/flow-sidebar'\nimport { Timeline, type TimelineEvent } from '@/components/ui/timeline'\nimport { nodeName, type Flow, type FlowIssue } from '@/lib/flow'\nimport {\n advanceSimulation,\n startSimulation,\n type SimulationState,\n type SimulationStep,\n} from '@/lib/flow-sim'\n\n/*\n * Peças internas do FlowEditor, na barra lateral: o teste do fluxo (um passo por vez, sem executar\n * nada) e a validação. A condição escolhe sozinha a saída, avaliando as regras contra os dados\n * de exemplo do gatilho, e o passo diz qual regra bateu.\n */\n\nfunction IssueList({\n flow,\n issues,\n onViewBlock,\n}: {\n flow: Flow\n issues: FlowIssue[]\n onViewBlock: (id: string) => void\n}) {\n return (\n <ul className=\"flex flex-col gap-2\">\n {issues.map((i, k) => {\n const node = flow.nodes.find((n) => n.id === i.nodeId)\n return (\n <li\n key={`${i.code}-${i.nodeId ?? i.edgeId ?? k}-${k}`}\n className=\"flex flex-wrap items-center justify-between gap-2 rounded-control border bg-card px-3 py-2 text-sm\"\n >\n <span>{i.message}</span>\n {i.nodeId && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n aria-label={`Ver bloco ${node ? nodeName(node) : i.nodeId}`}\n onClick={() => onViewBlock(i.nodeId!)}\n >\n Ver bloco\n </Button>\n )}\n </li>\n )\n })}\n </ul>\n )\n}\n\nexport interface FlowSimulationPanelProps {\n flow: Flow\n sim: SimulationState\n /** Resultado de rodar só um bloco (o play do card); aparece enquanto não há teste completo. */\n blockStep: SimulationStep | null\n onSim: (sim: SimulationState) => void\n /** Ausente no Drawer do celular: quem fecha é o próprio Drawer. */\n onClose?: () => void\n onViewBlock: (id: string) => void\n}\n\nexport function FlowSimulationPanel({\n flow,\n sim,\n blockStep,\n onSim,\n onClose,\n onViewBlock,\n}: FlowSimulationPanelProps) {\n const steps = sim.steps.length === 0 && blockStep ? [blockStep] : sim.steps\n const events: TimelineEvent[] = steps.map((s, i) => ({\n id: `${i}-${s.nodeId}`,\n title: s.label,\n description: s.detail,\n date: blockStep && sim.steps.length === 0 ? 'Só este bloco' : `Passo ${i + 1}`,\n status: s.status,\n }))\n return (\n <FlowPanelShell title=\"Teste do fluxo\" onClose={onClose} closeLabel=\"Fechar teste\">\n <ActionBar\n primary={{\n label: 'Avançar',\n disabled: sim.status !== 'running',\n onClick: () => onSim(advanceSimulation(flow, sim)),\n }}\n cancel={{ label: 'Reiniciar', onClick: () => onSim(startSimulation(flow)) }}\n />\n {sim.status === 'error' && (\n <div className=\"flex flex-col gap-3\">\n <Alert type=\"error\" title=\"O fluxo precisa de ajustes antes do teste\" />\n <IssueList flow={flow} issues={sim.issues} onViewBlock={onViewBlock} />\n </div>\n )}\n {sim.status === 'finished' && (\n <p\n role=\"status\"\n className=\"flex items-center gap-2 text-sm font-medium text-success-soft-foreground\"\n >\n <CheckCircle2 className=\"size-icon-md\" aria-hidden />\n Fluxo concluído\n </p>\n )}\n {events.length > 0 && <Timeline events={events} />}\n {events.length === 0 && sim.status !== 'error' && (\n <p className=\"text-sm text-muted-foreground\">Nenhum passo executado ainda.</p>\n )}\n </FlowPanelShell>\n )\n}\n\nexport interface FlowValidationPanelProps {\n flow: Flow\n issues: FlowIssue[]\n onClose?: () => void\n onViewBlock: (id: string) => void\n}\n\nexport function FlowValidationPanel({\n flow,\n issues,\n onClose,\n onViewBlock,\n}: FlowValidationPanelProps) {\n return (\n <FlowPanelShell title=\"Validação do fluxo\" onClose={onClose} closeLabel=\"Fechar validação\">\n <div aria-live=\"polite\" className=\"flex flex-col gap-3\">\n {issues.length === 0 ? (\n <Alert type=\"success\" title=\"Fluxo válido\" />\n ) : (\n <>\n <Alert\n type=\"error\"\n title={\n issues.length === 1\n ? '1 problema encontrado'\n : `${issues.length} problemas encontrados`\n }\n />\n <IssueList flow={flow} issues={issues} onViewBlock={onViewBlock} />\n </>\n )}\n </div>\n </FlowPanelShell>\n )\n}\n","import {\n ReactFlowProvider,\n applyEdgeChanges,\n applyNodeChanges,\n useReactFlow,\n useUpdateNodeInternals,\n type Connection,\n type Edge,\n type EdgeChange,\n type FinalConnectionState,\n type NodeChange,\n} from '@xyflow/react'\nimport { FlaskConical, ListChecks, Plus } from 'lucide-react'\nimport {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type PointerEvent as ReactPointerEvent,\n} from 'react'\nimport { Alert } from '@/components/ui/alert'\nimport { Button } from '@/components/ui/button'\nimport { Checkbox } from '@/components/ui/checkbox'\nimport { Drawer } from '@/components/ui/drawer'\nimport { Field } from '@/components/ui/field'\nimport { BlockConfigPanel } from '@/components/ui/flow-config-panels'\nimport { FlowSimulationPanel, FlowValidationPanel } from '@/components/ui/flow-simulation-panel'\nimport { FlowBlockList, FlowPanelShell } from '@/components/ui/flow-sidebar'\nimport {\n FlowActionsContext,\n FlowSurface,\n toRfEdges,\n toRfNodes,\n type FlowActions,\n type FlowRfNode,\n} from '@/components/ui/flow-viewer'\nimport { Input } from '@/components/ui/input'\nimport { Modal } from '@/components/ui/modal'\nimport { RadioGroup } from '@/components/ui/radio-group'\nimport { useBreakpoint } from '@/hooks/use-breakpoint'\nimport { useFillHeight } from '@/hooks/use-fill-height'\nimport { cn } from '@/lib/cn'\nimport { migrateFlow, nodeName, validateFlow, type Flow, type FlowNodeType } from '@/lib/flow'\nimport {\n FLOW_BLOCKS,\n FLOW_CARD_W,\n FLOW_TYPE_NAME,\n estimateNodeHeight,\n isTrigger,\n rulesOf,\n} from '@/lib/flow-blocks'\nimport {\n addNode,\n connectNodes,\n describeNodeLinks,\n findFreePosition,\n moveNode,\n removeEdge,\n removeNode,\n replacedMessage,\n type RemoveMode,\n} from '@/lib/flow-edit'\nimport {\n resetSimulation,\n simulateBlock,\n startSimulation,\n type SimulationState,\n type SimulationStep,\n} from '@/lib/flow-sim'\n\n/*\n * Editor de fluxos de automação (React Flow, MIT), estilo N8N: quadro à esquerda e barra lateral\n * à direita (blocos com busca e grupos, configuração do bloco, teste e validação). Monta blocos,\n * liga soltando em qualquer ponto do bloco de destino (com aviso do motivo e da troca), apaga com\n * confirmação e testa o caminho, tudo simulado: nada é executado de verdade. O fluxo é\n * CONTROLADO: `value` entra, `onChange` devolve um fluxo novo (nunca muda o recebido), sempre no\n * formato v2 (o da 2.7.0 também é aceito na entrada). O JSON é o de `lib/flow.ts`.\n *\n * Largura: a partir do tablet (768 px) monta por mouse ou toque (arraste, alças). No celular só\n * se vê e se navega; toda edição vai pela barra, que abre num Drawer. Arrastar nunca é o único\n * caminho. Fica fora da entrada principal (@rendra-ui/web/flow), porque depende de @xyflow/react.\n */\n\nexport interface FlowEditorProps {\n /** O fluxo (controlado). */\n value: Flow\n /** Recebe o fluxo novo a cada mudança. */\n onChange: (flow: Flow) => void\n /** Só ver, navegar e testar: nada se monta, liga ou apaga. */\n readOnly?: boolean\n /** Mostra \"Validar\" e \"Testar fluxo\" no canto do quadro. Padrão: `true`. */\n toolbar?: boolean\n /** Painel de teste aberto (controle de fora, por exemplo o botão \"Testar fluxo\" da tela). */\n testOpen?: boolean\n onTestOpenChange?: (open: boolean) => void\n className?: string\n}\n\nconst DRAG_START = 4\nconst NO_BLOCK = 'Exclua um bloco por vez.'\n\n/** Reaproveita os objetos de nó que não mudaram (a biblioteca guarda medida e seleção neles). */\nfunction mergeNodes(prev: FlowRfNode[], next: FlowRfNode[]): FlowRfNode[] {\n const old = new Map(prev.map((n) => [n.id, n]))\n return next.map((n) => {\n const o = old.get(n.id)\n if (!o) return n\n const a = o.data\n const b = n.data\n const same =\n !o.dragging &&\n o.position.x === n.position.x &&\n o.position.y === n.position.y &&\n o.ariaLabel === n.ariaLabel &&\n a.label === b.label &&\n a.kind === b.kind &&\n a.config === b.config &&\n a.active === b.active &&\n a.issues.length === b.issues.length &&\n a.issues.every((m, i) => m === b.issues[i])\n if (same) return o\n return { ...o, position: o.dragging ? o.position : n.position, ariaLabel: n.ariaLabel, data: b }\n })\n}\n\nfunction mergeEdges(prev: Edge[], next: Edge[]): Edge[] {\n const old = new Map(prev.map((e) => [e.id, e]))\n return next.map((e) => {\n const o = old.get(e.id)\n if (!o) return e\n const same =\n o.source === e.source &&\n o.target === e.target &&\n o.sourceHandle === e.sourceHandle &&\n o.ariaLabel === e.ariaLabel &&\n o.data?.label === e.data?.label\n return same ? o : { ...o, ...e }\n })\n}\n\n/* ---------------------------------------------------------------------------- exclusão */\n\ninterface DeleteBlockModalProps {\n flow: Flow\n nodeId: string\n onClose: () => void\n onConfirm: (mode: RemoveMode) => void\n}\n\n/**\n * Excluir bloco: mostra o bloco, onde ele está ligado e duas opções (só este, ou este e tudo o\n * que vem depois), com dupla verificação: a caixa CONFIRMO na primeira, a palavra digitada na\n * segunda. O Modal fica como está: sem a verificação, o botão avisa e o modal continua aberto.\n */\nfunction DeleteBlockModal({ flow, nodeId, onClose, onConfirm }: DeleteBlockModalProps) {\n const node = flow.nodes.find((n) => n.id === nodeId)\n const [mode, setMode] = useState<RemoveMode>('so-este')\n const [checked, setChecked] = useState(false)\n const [typed, setTyped] = useState('')\n const [error, setError] = useState(false)\n const keepOpen = useRef(false)\n if (!node) return null\n const links = describeNodeLinks(flow, node.id)\n const total = links.descendentes + 1\n const verified = mode === 'so-este' ? checked : typed.trim().toLowerCase() === 'confirmo'\n const list = (items: typeof links.anteriores, empty: string) =>\n items.length === 0 ? (\n <span className=\"text-muted-foreground\">{empty}</span>\n ) : (\n <ul className=\"flex flex-col gap-1\">\n {items.map((x) => (\n <li key={x.node.id}>\n {nodeName(x.node)}\n {x.saida ? <span className=\"text-muted-foreground\"> (saída {x.saida})</span> : null}\n </li>\n ))}\n </ul>\n )\n return (\n <Modal\n open\n size=\"md\"\n type=\"destructive\"\n title=\"Excluir este bloco?\"\n description={\n nodeName(node) === FLOW_TYPE_NAME[node.type]\n ? nodeName(node)\n : `${FLOW_TYPE_NAME[node.type]}: ${nodeName(node)}`\n }\n confirmLabel=\"Excluir\"\n onOpenChange={(open) => {\n if (open) return\n // o Modal fecha depois de qualquer confirmação; sem a verificação ele fica aberto\n if (keepOpen.current) {\n keepOpen.current = false\n return\n }\n onClose()\n }}\n onConfirm={() => {\n if (!verified) {\n keepOpen.current = true\n setError(true)\n return\n }\n onConfirm(mode)\n }}\n >\n <div className=\"flex w-full flex-col gap-4 text-left text-sm\">\n <p className=\"text-muted-foreground\">{FLOW_BLOCKS[node.type].description}</p>\n <dl className=\"flex flex-col gap-2\">\n <div>\n <dt className=\"text-xs text-muted-foreground\">Ligado depois de</dt>\n <dd>{list(links.anteriores, 'Nenhum bloco antes')}</dd>\n </div>\n <div>\n <dt className=\"text-xs text-muted-foreground\">Ligado antes de</dt>\n <dd>{list(links.posteriores, 'Nenhum bloco depois')}</dd>\n </div>\n </dl>\n <RadioGroup\n aria-label=\"O que excluir\"\n value={mode}\n onChange={(v) => {\n setMode(v as RemoveMode)\n setError(false)\n }}\n options={[\n { value: 'so-este', label: 'Excluir só este bloco' },\n {\n value: 'daqui-para-frente',\n label: `Excluir este bloco e tudo o que vem depois dele (${total} ${total === 1 ? 'bloco' : 'blocos'})`,\n },\n ]}\n />\n {mode === 'so-este' ? (\n <Checkbox\n checked={checked}\n onCheckedChange={(v) => {\n setChecked(v === true)\n setError(false)\n }}\n label=\"CONFIRMO\"\n />\n ) : (\n <Field label=\"Digite CONFIRMO para excluir\" span=\"full\">\n <Input\n value={typed}\n onChange={(v) => {\n setTyped(v)\n setError(false)\n }}\n />\n </Field>\n )}\n {error && (\n <p role=\"alert\" className=\"font-medium text-destructive\">\n {mode === 'so-este'\n ? 'Marque a caixa CONFIRMO para excluir.'\n : 'Digite CONFIRMO para excluir.'}\n </p>\n )}\n </div>\n </Modal>\n )\n}\n\n/* ------------------------------------------------------------------------------ editor */\n\ntype View = 'blocks' | 'config' | 'validate'\n\nfunction FlowEditorInner({\n value,\n onChange,\n readOnly = false,\n toolbar = true,\n testOpen: testOpenProp,\n onTestOpenChange,\n className,\n}: FlowEditorProps) {\n const { isMobile } = useBreakpoint()\n const canEdit = !readOnly\n const canBuild = canEdit && !isMobile\n const { screenToFlowPosition, fitView } = useReactFlow()\n const updateNodeInternals = useUpdateNodeInternals()\n const rootRef = useFillHeight<HTMLDivElement>()\n const canvasRef = useRef<HTMLDivElement>(null)\n const noticeId = useId()\n\n // O fluxo da 2.7.0 também entra: o primeiro `onChange` já sai no formato v2.\n const flow = useMemo(() => migrateFlow(value), [value])\n const flowRef = useRef(flow)\n flowRef.current = flow\n const everUsed = useRef(new Set<string>())\n flow.nodes.forEach((n) => everUsed.current.add(n.id))\n\n const [view, setView] = useState<View>('blocks')\n const [configId, setConfigId] = useState<string | null>(null)\n const [testState, setTestState] = useState(false)\n const testOpen = testOpenProp ?? testState\n const [sim, setSim] = useState<SimulationState>(resetSimulation)\n const [blockStep, setBlockStep] = useState<SimulationStep | null>(null)\n const blockStepRef = useRef<SimulationStep | null>(null)\n blockStepRef.current = blockStep\n const [validated, setValidated] = useState(false)\n const [notice, setNotice] = useState<string | null>(null)\n const [drawerOpen, setDrawerOpen] = useState(false)\n const [deleting, setDeleting] = useState<string | null>(null)\n const deletingRef = useRef<string | null>(null)\n deletingRef.current = deleting\n const [drag, setDrag] = useState<{\n type: FlowNodeType\n x: number\n y: number\n over: boolean\n } | null>(null)\n const suppressClick = useRef(false)\n\n const issues = useMemo(() => validateFlow(flow), [flow])\n const shownIssues = validated ? issues : undefined\n const activeId = sim.status === 'running' ? sim.currentId : null\n const configNode = configId ? flow.nodes.find((n) => n.id === configId) : undefined\n\n const setTestOpen = useCallback(\n (open: boolean) => {\n setTestState(open)\n onTestOpenChange?.(open)\n },\n [onTestOpenChange],\n )\n\n // Estado de interface da biblioteca (medida, seleção, arraste) guardado por bloco; o fluxo em\n // si nunca é copiado: sempre vem de `value`.\n const nextNodes = useMemo(\n () => toRfNodes(flow, { activeId, issues: shownIssues }),\n [flow, activeId, shownIssues],\n )\n const nextEdges = useMemo(() => toRfEdges(flow), [flow])\n const [rfNodes, setRfNodes] = useState<FlowRfNode[]>(nextNodes)\n const [rfEdges, setRfEdges] = useState<Edge[]>(nextEdges)\n useEffect(() => setRfNodes((prev) => mergeNodes(prev, nextNodes)), [nextNodes])\n useEffect(() => setRfEdges((prev) => mergeEdges(prev, nextEdges)), [nextEdges])\n\n // As saídas da condição mudam com as regras: a biblioteca precisa medir as alças de novo.\n const ruleKey = flow.nodes\n .filter((n) => n.type === 'condicao')\n .map(\n (n) =>\n `${n.id}:${rulesOf(n)\n .map((r) => r.id)\n .join(',')}`,\n )\n .join('|')\n useEffect(() => {\n for (const part of ruleKey.split('|')) if (part) updateNodeInternals(part.split(':')[0]!)\n }, [ruleKey, updateNodeInternals])\n\n const emit = useCallback(\n (next: Flow, message?: string) => {\n setNotice(message ?? null)\n onChange(next)\n },\n [onChange],\n )\n\n const commitMoves = useCallback(\n (moves: { id: string; position: { x: number; y: number } }[]) => {\n let next = flowRef.current\n for (const m of moves) {\n const cur = next.nodes.find((n) => n.id === m.id)\n if (cur && (cur.position.x !== m.position.x || cur.position.y !== m.position.y))\n next = moveNode(next, m.id, m.position)\n }\n if (next !== flowRef.current) emit(next)\n },\n [emit],\n )\n\n const onNodesChange = useCallback(\n (changes: NodeChange<FlowRfNode>[]) => {\n setRfNodes((nds) =>\n applyNodeChanges(\n changes.filter((c) => c.type !== 'remove'),\n nds,\n ),\n )\n const moves = changes.flatMap((c) =>\n c.type === 'position' && c.dragging === false && c.position\n ? [{ id: c.id, position: c.position }]\n : [],\n )\n if (moves.length > 0 && canBuild) commitMoves(moves)\n },\n [canBuild, commitMoves],\n )\n const onEdgesChange = useCallback(\n (changes: EdgeChange[]) =>\n setRfEdges((eds) =>\n applyEdgeChanges(\n changes.filter((c) => c.type !== 'remove'),\n eds,\n ),\n ),\n [],\n )\n\n /** Liga e avisa: o motivo da recusa, ou a ligação trocada. */\n const connect = useCallback(\n (source: string, target: string, branch?: string) => {\n const r = connectNodes(flowRef.current, source, target, branch)\n if (!r.ok) setNotice(r.reason)\n else emit(r.flow, r.replaced ? replacedMessage(flowRef.current, r.replaced) : undefined)\n },\n [emit],\n )\n\n const onConnect = useCallback(\n (c: Connection) => {\n if (c.source && c.target) connect(c.source, c.target, c.sourceHandle ?? undefined)\n },\n [connect],\n )\n\n /** Soltar em qualquer ponto do bloco liga; fora de qualquer bloco, nada acontece. */\n const onConnectEnd = useCallback(\n (event: MouseEvent | TouchEvent, state: FinalConnectionState) => {\n if (state.isValid || !state.fromNode || state.fromHandle?.type !== 'source') return\n let to = state.toNode?.id\n if (!to && typeof document.elementFromPoint === 'function') {\n // no toque o evento não tem clientX/clientY: a posição vem de changedTouches\n const p = 'changedTouches' in event ? event.changedTouches[0] : (event as MouseEvent)\n if (p) {\n const el = document.elementFromPoint(p.clientX, p.clientY)\n to = el?.closest('.react-flow__node')?.getAttribute('data-id') ?? undefined\n }\n }\n if (!to) return\n connect(state.fromNode.id, to, state.fromHandle.id ?? undefined)\n },\n [connect],\n )\n\n const showDrawer = () => {\n if (isMobile) setDrawerOpen(true)\n }\n\n const openBlocks = () => {\n setView('blocks')\n setTestOpen(false)\n showDrawer()\n }\n\n const openConfig = useCallback(\n (id: string) => {\n if (!canEdit) return\n setConfigId(id)\n setView('config')\n setTestOpen(false)\n if (isMobile) setDrawerOpen(true)\n },\n [canEdit, isMobile, setTestOpen],\n )\n\n const addBlock = useCallback(\n (type: FlowNodeType, at?: { x: number; y: number }) => {\n const cur = flowRef.current\n if (isTrigger(type) && cur.nodes.some((n) => isTrigger(n.type))) {\n setNotice('Já existe um gatilho neste fluxo.')\n return\n }\n const size = {\n w: FLOW_CARD_W,\n h: estimateNodeHeight({ type, data: { label: '' } }),\n }\n let from = at\n if (!from) {\n const rect = canvasRef.current?.getBoundingClientRect()\n const center = screenToFlowPosition({\n x: (rect?.left ?? 0) + (rect?.width ?? 0) / 2,\n y: (rect?.top ?? 0) + (rect?.height ?? 0) / 2,\n })\n from = { x: center.x - size.w / 2, y: center.y - size.h / 2 }\n }\n const measured = Object.fromEntries(\n rfNodes.flatMap((n) =>\n n.measured?.width && n.measured.height\n ? [[n.id, { w: n.measured.width, h: n.measured.height }]]\n : [],\n ),\n )\n const position = findFreePosition(cur, size, from, measured)\n const added = addNode(cur, type, position, { reservedIds: everUsed.current })\n emit(added.flow)\n setConfigId(added.id)\n setView('config')\n setTestOpen(false)\n if (isMobile) setDrawerOpen(true)\n },\n [emit, isMobile, rfNodes, screenToFlowPosition, setTestOpen],\n )\n\n /** Arrastar um bloco da barra até o canvas, por pointer events (funciona com mouse e toque). */\n const startPaletteDrag = (e: ReactPointerEvent<HTMLButtonElement>, type: FlowNodeType) => {\n if (e.pointerType === 'mouse' && e.button !== 0) return\n const origin = { x: e.clientX, y: e.clientY }\n let moved = false\n const inside = (x: number, y: number) => {\n const r = canvasRef.current?.getBoundingClientRect()\n return !!r && x >= r.left && x <= r.right && y >= r.top && y <= r.bottom\n }\n const stop = () => {\n window.removeEventListener('pointermove', move)\n window.removeEventListener('pointerup', up)\n window.removeEventListener('pointercancel', cancel)\n window.removeEventListener('keydown', key)\n setDrag(null)\n }\n const move = (ev: PointerEvent) => {\n if (!moved && Math.hypot(ev.clientX - origin.x, ev.clientY - origin.y) < DRAG_START) return\n moved = true\n setDrag({ type, x: ev.clientX, y: ev.clientY, over: inside(ev.clientX, ev.clientY) })\n }\n const up = (ev: PointerEvent) => {\n stop()\n if (!moved) return\n suppressClick.current = true\n setTimeout(() => (suppressClick.current = false), 0)\n if (inside(ev.clientX, ev.clientY)) {\n const p = screenToFlowPosition({ x: ev.clientX, y: ev.clientY })\n addBlock(type, {\n x: p.x - FLOW_CARD_W / 2,\n y: p.y - estimateNodeHeight({ type, data: { label: '' } }) / 2,\n })\n }\n }\n const cancel = () => {\n stop()\n if (moved) {\n suppressClick.current = true\n setTimeout(() => (suppressClick.current = false), 0)\n }\n }\n const key = (ev: KeyboardEvent) => {\n if (ev.key === 'Escape') cancel()\n }\n window.addEventListener('pointermove', move)\n window.addEventListener('pointerup', up)\n window.addEventListener('pointercancel', cancel)\n window.addEventListener('keydown', key)\n }\n\n const viewBlock = (id: string) => {\n setRfNodes((nds) =>\n nds.map((n) => (n.selected === (n.id === id) ? n : { ...n, selected: n.id === id })),\n )\n void fitView({ nodes: [{ id }], padding: 0.5, maxZoom: 1 })\n }\n\n // Abrir o teste de fora (`testOpen`) também começa o teste, a não ser que seja o play de um bloco.\n useEffect(() => {\n if (testOpen && !blockStepRef.current)\n setSim((s) => (s.status === 'idle' ? startSimulation(flowRef.current) : s))\n if (testOpen && isMobile) setDrawerOpen(true)\n if (!testOpen) {\n setSim(resetSimulation())\n setBlockStep(null)\n }\n }, [testOpen, isMobile])\n\n const openTest = () => {\n setTestOpen(true)\n showDrawer()\n }\n const playBlock = useCallback(\n (id: string) => {\n setSim(resetSimulation())\n const step = simulateBlock(flowRef.current, id)\n setBlockStep(step)\n blockStepRef.current = step\n setTestOpen(true)\n if (isMobile) setDrawerOpen(true)\n },\n [isMobile, setTestOpen],\n )\n\n const focusBoard = () => canvasRef.current?.querySelector<HTMLElement>('.flow-surface')?.focus()\n\n const actions = useMemo<FlowActions>(\n () => ({\n play: playBlock,\n ...(canEdit ? { edit: openConfig, remove: (id: string) => setDeleting(id) } : {}),\n ...(canBuild\n ? {\n removeEdge: (id: string) => {\n emit(removeEdge(flowRef.current, id))\n focusBoard()\n },\n }\n : {}),\n }),\n [canEdit, canBuild, playBlock, openConfig, emit],\n )\n\n const closeSidebarPanel = () => {\n setView('blocks')\n setValidated(false)\n setDrawerOpen(false)\n }\n\n /* ----------------------------------------------------------------- conteúdo da barra */\n\n const panel = testOpen ? (\n <FlowSimulationPanel\n flow={flow}\n sim={sim}\n blockStep={blockStep}\n onSim={(s) => {\n setBlockStep(null)\n setSim(s)\n }}\n onClose={\n isMobile\n ? undefined\n : () => {\n setTestOpen(false)\n setDrawerOpen(false)\n }\n }\n onViewBlock={viewBlock}\n />\n ) : view === 'validate' ? (\n <FlowValidationPanel\n flow={flow}\n issues={issues}\n onClose={isMobile ? undefined : closeSidebarPanel}\n onViewBlock={viewBlock}\n />\n ) : view === 'config' && configNode ? (\n <BlockConfigPanel\n key={configNode.id}\n flow={flow}\n nodeId={configNode.id}\n onApply={(next, message) => emit(next, message)}\n onClose={isMobile ? undefined : closeSidebarPanel}\n />\n ) : canEdit ? (\n <FlowPanelShell title=\"Adicionar bloco\">\n <FlowBlockList\n onAdd={(type) => addBlock(type)}\n onDragStart={canBuild ? startPaletteDrag : undefined}\n suppressClick={suppressClick}\n />\n </FlowPanelShell>\n ) : null\n // `nokey`: Delete e Backspace dentro da barra nunca apagam o bloco selecionado do quadro.\n const sidebarBody = panel && <div className=\"nokey\">{panel}</div>\n\n const showAside = !isMobile && sidebarBody !== null\n\n return (\n <div className=\"@container min-w-0\">\n <div\n ref={rootRef}\n data-rendra=\"FLX-001\"\n className={cn(\n 'flow-editor flex min-w-0 flex-col overflow-hidden rounded-surface border bg-card @5xl:h-board @5xl:min-h-viewer @5xl:flex-row',\n className,\n )}\n >\n <div\n ref={canvasRef}\n className={cn(\n 'relative h-board min-w-0 md:h-viewer @5xl:h-full @5xl:flex-1',\n drag?.over && 'ring-2 ring-primary ring-inset',\n )}\n >\n <FlowActionsContext.Provider value={actions}>\n <FlowSurface\n fill={false}\n nodes={rfNodes}\n edges={rfEdges}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onConnect={onConnect}\n onConnectEnd={onConnectEnd}\n nodesDraggable={canBuild}\n nodesConnectable={canBuild}\n elementsSelectable={canEdit}\n deleteKeyCode={canEdit ? ['Delete', 'Backspace'] : null}\n onBeforeDelete={async ({ nodes: gone }) => {\n if (!canEdit || drawerOpen || deletingRef.current) return false\n if (gone.length === 0) return true\n // bloco nunca sai direto: um bloco abre o modal, vários pedem um de cada vez\n if (gone.length === 1) setDeleting(gone[0]!.id)\n else setNotice(NO_BLOCK)\n return false\n }}\n onDelete={({ edges: gone }) => {\n let next = flowRef.current\n for (const e of gone) next = removeEdge(next, e.id)\n if (next !== flowRef.current) emit(next)\n }}\n onNodeDragStop={(_, __, nodes) =>\n commitMoves(nodes.map((n) => ({ id: n.id, position: n.position })))\n }\n onNodeClick={(e, node) => {\n if ((e.target as HTMLElement).closest('button')) return\n openConfig(node.id)\n }}\n onPaneClick={() => {\n if (view === 'config' && !isMobile) setView('blocks')\n }}\n onKeyDown={(e) => {\n const el = e.target as HTMLElement\n if (\n e.key === 'Enter' &&\n el.classList?.contains('react-flow__node') &&\n el.dataset.id\n ) {\n // o foco vai para a barra: sem isto o Enter ainda ativaria o primeiro botão dela\n e.preventDefault()\n openConfig(el.dataset.id)\n }\n }}\n />\n </FlowActionsContext.Provider>\n {(toolbar || (isMobile && canEdit)) && (\n <div className=\"absolute top-2 right-2 z-10 flex gap-2\">\n {isMobile && canEdit && (\n <Button\n variant=\"outline\"\n iconOnly\n aria-label=\"Blocos\"\n icon={<Plus />}\n onClick={openBlocks}\n />\n )}\n {toolbar && (\n <>\n <Button\n variant=\"outline\"\n iconOnly={isMobile}\n aria-label=\"Validar\"\n icon={<ListChecks />}\n onClick={() => {\n setValidated(true)\n setView('validate')\n setTestOpen(false)\n showDrawer()\n }}\n >\n {isMobile ? null : 'Validar'}\n </Button>\n <Button\n iconOnly={isMobile}\n aria-label=\"Testar fluxo\"\n icon={<FlaskConical />}\n onClick={openTest}\n >\n {isMobile ? null : 'Testar fluxo'}\n </Button>\n </>\n )}\n </div>\n )}\n <div\n role=\"status\"\n aria-live=\"polite\"\n id={noticeId}\n data-flow-notice\n className={cn(notice ? 'absolute inset-x-2 top-16 z-10' : 'sr-only')}\n >\n {notice && <Alert type=\"warning\" title={notice} onDismiss={() => setNotice(null)} />}\n </div>\n </div>\n {showAside && (\n <aside\n aria-label=\"Painel do fluxo\"\n className=\"w-full shrink-0 scrollbar-subtle border-t p-4 @5xl:h-full @5xl:w-flow-panel @5xl:overflow-y-auto @5xl:border-t-0 @5xl:border-l\"\n >\n <div\n role=\"presentation\"\n onKeyDown={(e) => {\n if (\n e.key === 'Escape' &&\n view === 'config' &&\n !testOpen &&\n !(e.target as HTMLElement).closest(\n '[role=\"combobox\"],[role=\"listbox\"],[role=\"dialog\"],[data-radix-popper-content-wrapper],[cmdk-root]',\n )\n )\n setView('blocks')\n }}\n >\n {sidebarBody}\n </div>\n </aside>\n )}\n {drag && (\n <div\n aria-hidden\n data-flow-drag\n className=\"pointer-events-none fixed top-0 left-0 z-50 translate-x-(--flow-x) translate-y-(--flow-y) rounded-control border bg-card px-3 py-2 text-sm shadow-md\"\n style={{ '--flow-x': `${drag.x}px`, '--flow-y': `${drag.y}px` } as CSSProperties}\n >\n {FLOW_TYPE_NAME[drag.type]}\n </div>\n )}\n {isMobile && sidebarBody !== null && (\n <Drawer\n open={drawerOpen}\n onOpenChange={(open) => {\n setDrawerOpen(open)\n if (!open) {\n if (testOpen) setTestOpen(false)\n setView('blocks')\n setValidated(false)\n }\n }}\n title=\"Fluxo de automação\"\n >\n {sidebarBody}\n </Drawer>\n )}\n {canEdit && deleting && (\n <DeleteBlockModal\n key={deleting}\n flow={flow}\n nodeId={deleting}\n onClose={() => setDeleting(null)}\n onConfirm={(mode) => {\n emit(removeNode(flowRef.current, deleting, mode))\n setDeleting(null)\n setConfigId((id) => (id === deleting ? null : id))\n setView('blocks')\n setDrawerOpen(false)\n }}\n />\n )}\n </div>\n </div>\n )\n}\n\nexport function FlowEditor(props: FlowEditorProps) {\n return (\n <ReactFlowProvider>\n <FlowEditorInner {...props} />\n </ReactFlowProvider>\n )\n}\n"],"mappings":";;;;;;;;;;;;;;;AAuBA,IAAM,QAAQ;AAId,IAAa,kBAA2C;CAAC;CAAY;CAAW;CAAS;AAAM;AAE/F,IAAM,gBAA8C;CAClD,UAAU;CACV,SAAS;CACT,OAAO;CACP,MAAM;AACR;AAEA,IAAM,UAAU,MACd,OAAO,MAAM,YAAa,gBAAsC,SAAS,CAAC;;AAG5E,SAAgB,WAAW,QAA4D;CACrF,MAAM,WAAW,QAAQ;CACzB,MAAM,OAAO,QAAQ;CACrB,IAAI,OAAO,aAAa,YAAY,CAAC,OAAO,SAAS,QAAQ,KAAK,CAAC,OAAO,IAAI,GAAG,OAAO;CACxF,OAAO,GAAG,SAAS,GAAG,aAAa,IAAI,cAAc,QAAQ;AAC/D;;AAGA,SAAgB,aAAa,QAAqD;CAChF,MAAM,OAAO,WAAW,MAAM;CAC9B,OAAO,OAAO,cAAc,SAAS;AACvC;AAqBA,IAAM,cAAc,CAAC;AAErB,IAAa,cAAkD;CAC7D,mBAAmB;EACjB,MAAM;EACN,OAAO;EACP,MAAM;EACN,aAAa;EACb,MAAM;EACN,sBAAsB;GACpB,QAAQ;GACR,MAAM;GACN,cAAc;GACd,UAAU;GACV,SAAS,CAAC;EACZ;EACA,UAAU,CAAC;GAAE,KAAK;GAAQ,OAAO;EAAW,CAAC;CAC/C;CACA,aAAa;EACX,MAAM;EACN,OAAO;EACP,MAAM;EACN,aAAa;EACb,MAAM;EACN,sBAAsB;GAAE,WAAW;GAAU,MAAM;EAAQ;EAC3D,UAAU,CAAC;GAAE,KAAK;GAAQ,OAAO;EAAU,CAAC;CAC9C;CACA,mBAAmB;EACjB,MAAM;EACN,OAAO;EACP,MAAM;EACN,aAAa;EACb,MAAM;EACN,sBAAsB,EAAE,QAAQ,UAAU;EAC1C,UAAU,CAAC;CACb;CACA,UAAU;EACR,MAAM;EACN,OAAO;EACP,MAAM;EACN,aAAa;EACb,MAAM;EACN,sBAAsB;GAAE,IAAI;GAAI,SAAS;EAAG;EAC5C,UAAU,CACR;GAAE,KAAK;GAAM,OAAO;EAAO,GAC3B;GAAE,KAAK;GAAW,OAAO;EAAW,CACtC;CACF;CACA,OAAO;EACL,MAAM;EACN,OAAO;EACP,MAAM;EACN,aAAa;EACb,MAAM;EACN,sBAAsB;GAAE,IAAI;GAAI,SAAS;GAAI,SAAS;EAAG;EACzD,UAAU;GACR;IAAE,KAAK;IAAM,OAAO;GAAO;GAC3B;IAAE,KAAK;IAAW,OAAO;GAAU;GACnC;IAAE,KAAK;IAAW,OAAO;GAAW;EACtC;CACF;CACA,UAAU;EACR,MAAM;EACN,OAAO;EACP,MAAM;EACN,aAAa;EACb,MAAM;EACN,sBAAsB,EAAE,OAAO,CAAC;GAAE,IAAI;GAAM,OAAO;GAAI,UAAU;GAAS,OAAO;EAAG,CAAC,EAAE;EACvF,UAAU,CAAC;CACb;CACA,QAAQ;EACN,MAAM;EACN,OAAO;EACP,MAAM;EACN,aAAa;EACb,MAAM;EACN,sBAAsB;GAAE,UAAU;GAAG,MAAM;EAAU;EACrD,UAAU,CAAC;CACb;CACA,iBAAiB;EACf,MAAM;EACN,OAAO;EACP,MAAM;EACN,aAAa;EACb,MAAM;EACN,sBAAsB;GAAE,QAAQ;GAAQ,KAAK;GAAI,SAAS,CAAC;GAAG,MAAM,CAAC;EAAE;EACvE,UAAU,CAAC;GAAE,KAAK;GAAO,OAAO;EAAW,CAAC;CAC9C;CACA,QAAQ;EACN,MAAM;EACN,OAAO;EACP,MAAM;EACN,aAAa;EACb,MAAM;EACN,sBAAsB;GAAE,OAAO;GAAI,UAAU;GAAI,SAAS;EAAE;EAC5D,UAAU,CAAC;GAAE,KAAK;GAAS,OAAO;EAAS,CAAC;CAC9C;CACA,SAAS;EACP,MAAM;EACN,OAAO;EACP,MAAM;EACN,aAAa;EACb,MAAM;EACN,eAAe;EACf,UAAU,CAAC;EACX,QAAQ;CACV;CACA,MAAM;EACJ,MAAM;EACN,OAAO;EACP,MAAM;EACN,aAAa;EACb,MAAM;EACN,eAAe;EACf,UAAU,CAAC;EACX,QAAQ;CACV;CACA,KAAK;EACH,MAAM;EACN,OAAO;EACP,MAAM;EACN,aAAa;EACb,MAAM;EACN,eAAe;EACf,UAAU,CAAC;EACX,QAAQ;CACV;AACF;AAEA,IAAa,oBAAqF;CAChG;EACE,IAAI;EACJ,MAAM;EACN,OAAO;GAAC;GAAmB;GAAe;EAAiB;CAC7D;CACA;EAAE,IAAI;EAAa,MAAM;EAAa,OAAO,CAAC,YAAY,OAAO;CAAE;CACnE;EAAE,IAAI;EAAgB,MAAM;EAAgB,OAAO,CAAC,YAAY,QAAQ;CAAE;CAC1E;EAAE,IAAI;EAAe,MAAM;EAAe,OAAO,CAAC,eAAe;CAAE;CACnE;EAAE,IAAI;EAAS,MAAM;EAAkB,OAAO,CAAC,QAAQ;CAAE;AAC3D;;AAGA,IAAa,iBAAiB,OAAO,YAClC,OAAO,KAAK,WAAW,CAAC,CAAoB,KAAK,MAAM,CAAC,GAAG,YAAY,EAAE,CAAC,IAAI,CAAC,CAClF;;AAGA,IAAa,aAAa,SAAuB,YAAY,KAAK,CAAC,UAAU;AAI7E,IAAa,qBAAyD;CACpE;EAAE,OAAO;EAAgB,OAAO;CAAiB;CACjD;EAAE,OAAO;EAAiB,OAAO;CAAmB;CACpD;EAAE,OAAO;EAAoB,OAAO;CAAqB;CACzD;EAAE,OAAO;EAAiB,OAAO;CAAkB;CACnD;EAAE,OAAO;EAAiB,OAAO;CAAkB;CACnD;EAAE,OAAO;EAAa,OAAO;CAAkB;AACjD;;AAGA,IAAa,sBAAsB;CACjC,SAAS;EACP,MAAM;EACN,OAAO;EACP,UAAU;EACV,OAAO;CACT;CACA,QAAQ;EAAE,IAAI;EAAY,OAAO;EAAM,WAAW;CAAa;AACjE;;AAMA,SAAgB,eAAe,SAAkB,SAAS,IAAuC;CAC/F,IAAI,WAAW,OAAO,YAAY,YAAY,CAAC,MAAM,QAAQ,OAAO,GAClE,OAAO,OAAO,QAAQ,OAAO,CAAC,CAAC,SAAS,CAAC,GAAG,OAC1C,eAAe,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC,CACjD;CACF,OAAO,CAAC;EAAE,MAAM;EAAQ,OAAO,OAAO,OAAO;CAAE,CAAC;AAClD;AAEA,IAAM,gBAAwC;CAC5C,GAAG,OAAO,YAAY,eAAe,mBAAmB,CAAC,CAAC,KAAK,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;CACvF,kBAAkB;CAClB,iBAAiB;CACjB,oBAAoB;AACtB;AAEA,IAAM,mBAA6C;CACjD,SAAS;EAAC;EAAgB;EAAiB;CAAkB;CAC7D,QAAQ;EAAC;EAAa;EAAgB;CAAc;CACpD,SAAS;EAAC;EAAkB;EAAiB;CAAc;AAC7D;AAEA,IAAM,iBAAyC;CAC7C,GAAG,OAAO,YAAY,mBAAmB,KAAK,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;CACvE,gBAAgB;CAChB,kBAAkB;CAClB,oBAAoB;AACtB;AAQA,IAAa,UAAU,MACrB,MAAM,QAAQ,CAAC,IACX,EAAE,QAAQ,MAAoC,CAAC,CAAC,KAAK,OAAO,MAAM,QAAQ,IAC1E,CAAC;;AAGP,SAAgB,cAAc,MAA4B;CACxD,MAAM,UAAU,KAAK,MAAM,MAAM,MAAM,UAAU,EAAE,IAAI,CAAC;CACxD,IAAI,CAAC,SAAS,OAAO,CAAC;CACtB,MAAM,MAAM,QAAQ,KAAK;CACzB,IAAI,QAAQ,SAAS,mBACnB,OAAO,OAAO,KAAK,OAAO,CAAC,CACxB,QAAQ,MAAM,OAAO,EAAE,SAAS,YAAY,OAAO,EAAE,OAAO,YAAY,EAAE,OAAO,EAAE,CAAC,CACpF,KAAK,OAAO;EACX,IAAI,EAAE;EACN,OAAO,eAAe,EAAE,OAAkB,EAAE;CAC9C,EAAE;CACN,IAAI,QAAQ,SAAS,mBAEnB,QADY,iBAAiB,OAAO,KAAK,MAAM,MAAM,iBAAiB,QAAA,CAC3D,KAAK,QAAQ;EAAE;EAAI,OAAO,eAAe,OAAO;CAAG,EAAE;CAElE,IAAI,QAAQ,SAAS,eACnB,OAAO,CAAC;EAAE,IAAI;EAAoB,OAAO,eAAe;CAAqB,CAAC;CAChF,OAAO,CAAC;AACV;;AAGA,SAAgB,eAAe,MAAoC;CACjE,OAAO,OAAO,YAAY,cAAc,IAAI,CAAC,CAAC,KAAK,MAAM,CAAC,EAAE,IAAI,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC;AAC7F;AAOA,IAAM,WAAW;;AAGjB,SAAgB,eAAe,MAA8B;CAC3D,MAAM,QAAwB,CAAC;CAC/B,IAAI,OAAO;CACX,KAAK,MAAM,KAAK,KAAK,SAAS,QAAQ,GAAG;EACvC,IAAI,EAAE,QAAQ,MAAM,MAAM,KAAK;GAAE,MAAM;GAAQ,OAAO,KAAK,MAAM,MAAM,EAAE,KAAK;EAAE,CAAC;EACjF,MAAM,KAAK;GAAE,MAAM;GAAO,OAAO,EAAE;EAAI,CAAC;EACxC,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC;CACxB;CACA,IAAI,OAAO,KAAK,QAAQ,MAAM,KAAK;EAAE,MAAM;EAAQ,OAAO,KAAK,MAAM,IAAI;CAAE,CAAC;CAC5E,OAAO;AACT;;AAGA,SAAgB,eAAe,MAAc,MAAsC;CACjF,OAAO,KAAK,QAAQ,WAAW,OAAO,OAAe,KAAK,OAAO,KAAK;AACxE;AAIA,IAAa,sBAAoF;CAC/F;EAAE,OAAO;EAAS,OAAO;EAAa,QAAQ;CAAI;CAClD;EAAE,OAAO;EAAa,OAAO;EAAkB,QAAQ;CAAI;CAC3D;EAAE,OAAO;EAAS,OAAO;EAAe,QAAQ;CAAI;CACpD;EAAE,OAAO;EAAS,OAAO;EAAe,QAAQ;CAAI;CACpD;EAAE,OAAO;EAAU,OAAO;EAAU,QAAQ;CAAS;CACrD;EAAE,OAAO;EAAS,OAAO;EAAc,QAAQ;CAAQ;CACvD;EAAE,OAAO;EAAa,OAAO;EAAkB,QAAQ;CAAa;AACtE;;AAGA,IAAa,oBAAoB,OAAyB,OAAO,WAAW,OAAO;AAEnF,IAAM,cAAc,OAAyB,oBAAoB,MAAM,MAAM,EAAE,UAAU,EAAE;AAE3F,IAAa,kBAAkB,SAC7B,KAAK,MAAM,KAAK,MAAM,MACtB,CAAC,CAAC,WAAW,KAAK,QAAQ,MACzB,CAAC,iBAAiB,KAAK,QAAQ,KAAK,KAAK,MAAM,KAAK,MAAM;;AAG7D,SAAgB,YAAY,MAAwB;CAClD,IAAI,CAAC,eAAe,IAAI,GAAG,OAAO;CAClC,MAAM,KAAK,WAAW,KAAK,QAAQ,CAAC,CAAE;CACtC,OAAO,iBAAiB,KAAK,QAAQ,IACjC,GAAG,KAAK,MAAM,GAAG,GAAG,GAAG,KAAK,UAC5B,GAAG,KAAK,MAAM,GAAG;AACvB;;AAGA,SAAgB,QAAQ,MAA0C;CAChE,OAAO,OAAO,KAAK,KAAK,QAAQ,KAAK,CAAC,CAAC,KAAK,OAAO;EACjD,IAAI,OAAO,EAAE,MAAM,EAAE;EACrB,GAAI,OAAO,EAAE,UAAU,WAAW,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;EACxD,OAAO,OAAO,EAAE,SAAS,EAAE;EAC3B,UAAW,WAAW,EAAE,QAA4B,IAChD,EAAE,WACF;EACJ,OAAO,OAAO,EAAE,SAAS,EAAE;CAC7B,EAAE;AACJ;;AAGA,SAAgB,WAAW,MAA8B,QAAwB;CAC/E,IAAI,WAAW,SAAS,OAAO;CAC/B,MAAM,QAAQ,QAAQ,IAAI;CAC1B,MAAM,IAAI,MAAM,WAAW,MAAM,EAAE,OAAO,MAAM;CAChD,OAAO,IAAI,IAAI,SAAS,MAAM,EAAE,CAAE,SAAS,SAAS,IAAI;AAC1D;;AAGA,SAAgB,WAAW,OAAiC;CAC1D,MAAM,QAAQ,IAAI,IAAI,MAAM,KAAK,MAAM,EAAE,EAAE,CAAC;CAC5C,IAAI,IAAI;CACR,OAAO,MAAM,IAAI,IAAI,GAAG,GAAG;CAC3B,OAAO,IAAI;AACb;;AAGA,SAAgB,UAAU,MAAY,MAA+B;CACnE,MAAM,OAAO,KAAK,MAAM,MAAM,MAAM,EAAE,OAAO,KAAK,MAAM;CACxD,IAAI,CAAC,QAAQ,KAAK,SAAS,cAAc,CAAC,KAAK,QAAQ,OAAO;CAC9D,IAAI,KAAK,WAAW,SAAS,OAAO;CACpC,MAAM,OAAO,QAAQ,IAAI,CAAC,CAAC,MAAM,MAAM,EAAE,OAAO,KAAK,MAAM;CAC3D,IAAI,CAAC,MAAM,OAAO;CAClB,IAAI,CAAC,eAAe,IAAI,GAAG,OAAO,WAAW,MAAM,KAAK,MAAM;CAC9D,MAAM,SAAS,WAAW,KAAK,QAAQ,CAAC,CAAE;CAC1C,OAAO,iBAAiB,KAAK,QAAQ,IAAI,GAAG,OAAO,GAAG,KAAK,UAAU;AACvE;;AAGA,SAAgB,UAAU,MAA+D;CACvF,OAAO,KAAK,SAAS,aAAa,CAAC,GAAG,QAAQ,IAAI,CAAC,CAAC,KAAK,MAAM,EAAE,EAAE,GAAG,OAAO,IAAI,CAAC,KAAA,CAAS;AAC7F;AAIA,IAAM,cAAoC;CAAE,QAAQ;CAAU,SAAS;CAAW,QAAQ;AAAS;AACnG,IAAa,eAAuC;CAClD,SAAS;CACT,QAAQ;CACR,SAAS;AACX;;AAEA,IAAa,OAAO,MAAgB,OAAO,MAAM,WAAW,IAAI;;AAGhE,SAAgB,gBAAgB,MAG5B;CACF,MAAM,IAAI,KAAK,KAAK;CACpB,QAAQ,KAAK,MAAb;EACE,KAAK,mBAAmB;GACtB,MAAM,SAAS,OAAO,GAAG,OAAO,CAAC,CAC9B,QAAQ,MAAM,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAC/B,KAAK,MAAM,KAAK,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAChC,KAAK,GAAG;GACX,OAAO,CACL;IACE,OAAO;IACP,OAAO,GAAG,IAAI,GAAG,MAAM,KAAK,OAAO,GAAG,IAAI,GAAG,IAAI,IAAI,KAAK;GAC5D,GACA;IAAE,OAAO;IAAmB,OAAO;GAAO,CAC5C;EACF;EACA,KAAK,eACH,OAAO,CACL;GAAE,OAAO;GAAc,OAAO,YAAU,IAAI,GAAG,SAAS,MAAM;EAAG,GACjE;GAAE,OAAO;GAAW,OAAO,IAAI,GAAG,IAAI;EAAE,CAC1C;EACF,KAAK,mBACH,OAAO,CAAC;GAAE,OAAO;GAAY,OAAO,aAAa,IAAI,GAAG,MAAM,MAAM;EAAG,CAAC;EAC1E,KAAK,YACH,OAAO,CACL;GAAE,OAAO;GAAQ,OAAO,IAAI,GAAG,EAAE;EAAE,GACnC;GAAE,OAAO;GAAY,OAAO,IAAI,GAAG,OAAO;EAAE,CAC9C;EACF,KAAK,SACH,OAAO;GACL;IAAE,OAAO;IAAQ,OAAO,IAAI,GAAG,EAAE;GAAE;GACnC;IAAE,OAAO;IAAW,OAAO,IAAI,GAAG,OAAO;GAAE;GAC3C;IAAE,OAAO;IAAY,OAAO,IAAI,GAAG,OAAO;GAAE;EAC9C;EACF,KAAK,UACH,OAAO,CAAC;GAAE,OAAO;GAAS,OAAO,WAAW,CAAC,KAAK;EAAG,CAAC;EACxD,KAAK,iBACH,OAAO,CACL;GACE,OAAO;GACP,OAAO,GAAG,IAAI,GAAG,MAAM,KAAK,OAAO,GAAG,IAAI,GAAG,GAAG,IAAI,KAAK;EAC3D,GACA;GACE,OAAO;GACP,OAAO,OAAO,GAAG,IAAI,CAAC,CACnB,KAAK,MAAM,IAAI,EAAE,KAAK,CAAC,CAAC,CACxB,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;EACb,CACF;EACF,KAAK,UAAU;GACb,MAAM,OAAO,OAAO,GAAG,YAAY,WAAW,EAAE,UAAU;GAC1D,OAAO;IACL;KAAE,OAAO;KAAU,OAAO,IAAI,GAAG,KAAK;IAAE;IACxC;KAAE,OAAO;KAAe,OAAO,IAAI,GAAG,QAAQ;IAAE;IAChD;KAAE,OAAO;KAAS,OAAO,GAAG,KAAK,GAAG,SAAS,IAAI,QAAQ;IAAS;GACpE;EACF;EACA,SACE,OAAO,CAAC;CACZ;AACF;;AAGA,SAAgB,oBACd,QACA,MAC+D;CAC/D,MAAM,OAA+B,CAAC;CACtC,KAAK,MAAM,KAAK,OAAO,QAAQ,IAAI,GACjC,IAAI,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,eAAe,IAAI,EAAE,KAAK,GAAG,IAAI;CAC7E,OAAO;EAAE,QAAQ,IAAI,QAAQ,MAAM,KAAK;EAAQ,KAAK,IAAI,QAAQ,GAAG;EAAG;CAAK;AAC9E;;AAGA,SAAS,WAAW,OAAuB;CACzC,IAAI,QAAQ;CACZ,KAAK,MAAM,QAAQ,eAAe,KAAK,GACrC,SAAS,KAAK,SAAS,SAAS,KAAK,MAAM,SAAS,KAAK,MAAM,KAAK,KAAK,MAAM,SAAS;CAC1F,OAAO,KAAK,IAAI,GAAG,KAAK,KAAK,QAAQ,GAAG,CAAC;AAC3C;;;;;AAMA,SAAgB,mBAAmB,MAA+C;CAChF,IAAI,KAAK,SAAS,YAAY,OAAO,KAAK,SAAS,QAAQ,IAAI,CAAC,CAAC,SAAS;CAC1E,MAAM,OAAO,gBAAgB,IAAI;CACjC,IAAI,IAAI;CACR,IAAI,KAAK,SAAS,GAChB,KACE,KAAK,KAAK,QAAQ,KAAK,MAAM,MAAM,KAAK,KAAK,WAAW,EAAE,KAAK,GAAG,CAAC,IAAI,KAAK,KAAK,SAAS;CAC9F,IAAI,KAAK,SAAS,qBAAqB,KAAK,KAAK,QAAQ,aAAa,MAAM,KAAK;CACjF,OAAO;AACT;;;;AC7fA,SAAgB,WAAW,MAAkB;CAC3C,MAAM,OAAO,IAAI,IAAI,KAAK,MAAM,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;CACrD,MAAM,QAAQ,KAAK,MAAM,QAAQ,MAAM,KAAK,IAAI,EAAE,MAAM,KAAK,KAAK,IAAI,EAAE,MAAM,CAAC;CAG/E,MAAM,sBAAM,IAAI,IAAwB;CACxC,KAAK,MAAM,KAAK,KAAK,OAAO;EAC1B,MAAM,OAAO,MAAM,QAAQ,MAAM,EAAE,WAAW,EAAE,EAAE;EAClD,MAAM,QAAQ,UAAU,CAAC;EACzB,KAAK,MAAM,GAAG,MAAM,MAAM,QAAQ,EAAE,MAAM,IAAI,MAAM,QAAQ,EAAE,MAAM,CAAC;EACrE,IAAI,IAAI,EAAE,IAAI,IAAI;CACpB;CAEA,MAAM,cAAc,IAAI,IAAI,MAAM,KAAK,MAAM,EAAE,MAAM,CAAC;CACtD,IAAI,QAAQ,KAAK,MAAM,QAAQ,MAAM,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,EAAE;CACvE,IAAI,MAAM,WAAW,GAAG,QAAQ,KAAK,MAAM,QAAQ,MAAM,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,EAAE;CAChG,IAAI,MAAM,WAAW,KAAK,KAAK,MAAM,IAAI,QAAQ,CAAC,KAAK,MAAM,EAAE,CAAC,EAAE;CAGlE,MAAM,wBAAQ,IAAI,IAAmB;CACrC,MAAM,2BAAW,IAAI,IAAoB;CACzC,MAAM,OAAiB,CAAC;CACxB,MAAM,uBAAO,IAAI,IAAY;CAC7B,MAAM,SAAS,OAAe;EAC5B,MAAM,IAAI,IAAI,CAAC;EACf,SAAS,IAAI,IAAI,SAAS,IAAI;EAC9B,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,KAAK,CAAC,GAC9B,IAAI,MAAM,IAAI,EAAE,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE,EAAE;OACvC,IAAI,CAAC,MAAM,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM;EAE/C,MAAM,IAAI,IAAI,CAAC;EACf,KAAK,KAAK,EAAE;CACd;CACA,KAAK,MAAM,KAAK,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,MAAM,CAAC;CAEjD,MAAM,QAAQ,IAAI,IAAoB,MAAM,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;CAC9D,KAAK,MAAM,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,QAAQ,GACjC,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,KAAK,CAAC,GAC9B,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,GAChB,MAAM,IAAI,EAAE,QAAQ,KAAK,IAAI,MAAM,IAAI,EAAE,MAAM,KAAK,GAAG,MAAM,IAAI,EAAE,IAAK,CAAC,CAAC;CAGhF,MAAM,iBADU,KAAK,IAAI,IAAI,GAAG,MAAM,OAAO,CACtB,IAAU;CACjC,MAAM,0BAAU,IAAI,IAAsB;CAC1C,MAAM,UAAU,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,MAAM,GAAG,MAAM;EAC7C,MAAM,KAAK,SAAS,IAAI,EAAE,EAAE,KAAK;EACjC,MAAM,KAAK,SAAS,IAAI,EAAE,EAAE,KAAK;EACjC,OAAO,OAAO,KAAK,KAAK,MAAM,QAAQ,CAAC,IAAI,KAAK,MAAM,QAAQ,CAAC,IAAI,KAAK;CAC1E,CAAC;CACD,KAAK,MAAM,KAAK,SAAS;EACvB,MAAM,IAAI,MAAM,IAAI,EAAE,EAAE,KAAK;EAC7B,QAAQ,IAAI,GAAG,CAAC,GAAI,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAI,EAAE,EAAE,CAAC;CAClD;CAEA,MAAM,2BAAW,IAAI,IAAsC;CAC3D,KAAK,MAAM,CAAC,GAAG,QAAQ,SAAS;EAC9B,IAAI,IAAI;EACR,KAAK,MAAM,MAAM,KAAK;GACpB,SAAS,IAAI,IAAI;IAAE,GAAG,IAAA;IAAgC;GAAE,CAAC;GACzD,KAAK,mBAAmB,KAAK,IAAI,EAAE,CAAE,IAAA;EACvC;CACF;CACA,OAAO;EAAE,GAAG;EAAM,OAAO,KAAK,MAAM,KAAK,OAAO;GAAE,GAAG;GAAG,UAAU,SAAS,IAAI,EAAE,EAAE;EAAG,EAAE;CAAE;AAC5F;;;ACXA,IAAM,WAA8B;CAClC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AACA,IAAM,eAAkC;CAAC;CAAW;CAAQ;CAAY;CAAU;AAAK;;AAGvF,IAAa,YAAY,MACvB,EAAE,KAAK,MAAM,KAAK,KAAK,eAAe,EAAE;AAI1C,SAAS,WAAW,GAAuB;CACzC,OAAO;EACL,IAAI,GAAG,EAAE,OAAO,UAAU,EAAE;EAC5B,QAAQ,EAAE;EACV,QAAQ,EAAE;EACV,QAAQ;CACV;AACF;;;;;;AAOA,SAAgB,YAAY,MAAkB;CAC5C,IAAI,KAAK,YAAY,GAAG,OAAO;CAC/B,MAAM,MAAM,IAAI,IAAI,KAAK,MAAM,QAAQ,MAAM,EAAE,SAAS,KAAK,CAAC,CAAC,KAAK,MAAM,EAAE,EAAE,CAAC;CAoB/E,OAAO,WAAW;EAAE,SAAS;EAAG,OAnBlB,KAAK,MAChB,QAAQ,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,CAC7B,KAAK,MACJ,EAAE,SAAS,cAAc,CAAC,MAAM,QAAQ,EAAE,KAAK,QAAQ,KAAK,IACxD;GACE,GAAG;GACH,MAAM;IACJ,GAAG,EAAE;IACL,QAAQ;KACN,GAAG,EAAE,KAAK;KACV,OAAO,CAAC;MAAE,IAAI;MAAO,OAAO;MAAO,OAAO;MAAI,UAAU;MAAS,OAAO;KAAG,CAAC;IAC9E;GACF;EACF,IACA,CAKwB;EAAO,OAHzB,KAAK,MAChB,QAAQ,MAAM,CAAC,IAAI,IAAI,EAAE,MAAM,KAAK,CAAC,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC,CACvD,KAAK,MAAO,EAAE,WAAW,QAAQ,WAAW,CAAC,IAAI,CACb;CAAM,CAAC;AAChD;;AAKA,SAAS,SAAS,MAAY;CAC5B,MAAM,sBAAM,IAAI,IAAwB;CACxC,KAAK,MAAM,KAAK,KAAK,OAAO,IAAI,IAAI,EAAE,QAAQ,CAAC,GAAI,IAAI,IAAI,EAAE,MAAM,KAAK,CAAC,GAAI,CAAC,CAAC;CAC/E,OAAO;AACT;AAEA,IAAM,UAAU,MAAe,OAAO,MAAM,YAAY,EAAE,KAAK,MAAM;;AAGrE,SAAgB,aAAa,OAA0B;CACrD,MAAM,OAAO,YAAY,KAAK;CAC9B,MAAM,SAAsB,CAAC;CAC7B,MAAM,OAAO,IAAI,IAAI,KAAK,MAAM,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;CACrD,MAAM,MAAM,SAAS,IAAI;CAEzB,MAAM,WAAW,KAAK,MAAM,QAAQ,MAAM,UAAU,EAAE,IAAI,CAAC;CAC3D,IAAI,SAAS,WAAW,GACtB,OAAO,KAAK;EAAE,MAAM;EAAe,SAAS;CAA8C,CAAC;MACxF,IAAI,SAAS,SAAS,GACzB,OAAO,KAAK;EACV,MAAM;EACN,SAAS,eAAe,SAAS,OAAO;CAC1C,CAAC;CAGH,MAAM,QAAoB,CAAC;CAC3B,KAAK,MAAM,KAAK,KAAK,OAAO;EAC1B,MAAM,OAAO,KAAK,IAAI,EAAE,MAAM;EAC9B,MAAM,KAAK,KAAK,IAAI,EAAE,MAAM;EAC5B,IAAI,CAAC,QAAQ,CAAC,IAAI;GAChB,OAAO,KAAK;IACV,MAAM;IACN,SAAS;IACT,QAAQ,EAAE;GACZ,CAAC;GACD;EACF;EAKA,IAAI,EAHF,KAAK,SAAS,aACV,CAAC,CAAC,EAAE,WAAW,EAAE,WAAW,WAAW,QAAQ,IAAI,CAAC,CAAC,MAAM,MAAM,EAAE,OAAO,EAAE,MAAM,KAClF,CAAC,EAAE,SACS;GAChB,OAAO,KAAK;IACV,MAAM;IACN,SACE,KAAK,SAAS,aACV,0BAA0B,SAAS,IAAI,EAAE,qDACzC,yBAAyB,SAAS,IAAI,EAAE;IAC9C,QAAQ,KAAK;IACb,QAAQ,EAAE;GACZ,CAAC;GACD;EACF;EACA,MAAM,KAAK,CAAC;CACd;CAEA,KAAK,MAAM,KAAK,KAAK,OAAO;EAC1B,MAAM,QAAQ,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC;EAChC,MAAM,OAAO,SAAS,CAAC;EACvB,MAAM,MAAM,EAAE,KAAK;EACnB,IAAI,EAAE,SAAS,YAAY;GACzB,MAAM,QAAQ,QAAQ,CAAC;GACvB,IAAI,MAAM,WAAW,GACnB,OAAO,KAAK;IACV,MAAM;IACN,SAAS,eAAe,KAAK;IAC7B,QAAQ,EAAE;GACZ,CAAC;GACH,MAAM,SAAS,GAAG,MAAM;IACtB,IAAI,CAAC,eAAe,CAAC,GACnB,OAAO,KAAK;KACV,MAAM;KACN,SAAS,WAAW,IAAI,EAAE,gBAAgB,KAAK;KAC/C,QAAQ,EAAE;IACZ,CAAC;GACL,CAAC;GACD,MAAM,uBAAO,IAAI,IAAY;GAC7B,IAAI,WAAW;GACf,KAAK,MAAM,KAAK,OAAO;IACrB,IAAI,CAAC,EAAE,QAAQ;IACf,IAAI,KAAK,IAAI,EAAE,MAAM,GAAG,WAAW;IACnC,KAAK,IAAI,EAAE,MAAM;GACnB;GACA,IAAI,UACF,OAAO,KAAK;IACV,MAAM;IACN,SAAS,eAAe,KAAK;IAC7B,QAAQ,EAAE;GACZ,CAAC;EACL,OAAO,IAAI,MAAM,SAAS,GACxB,OAAO,KAAK;GACV,MAAM;GACN,SAAS,YAAY,KAAK;GAC1B,QAAQ,EAAE;EACZ,CAAC;EAEH,KAAK,MAAM,KAAK,YAAY,EAAE,KAAK,CAAC,UAClC,IAAI,CAAC,OAAO,MAAM,EAAE,IAAI,GACtB,OAAO,KAAK;GACV,MAAM;GACN,SAAS,YAAY,KAAK,sBAAsB,EAAE,MAAM;GACxD,QAAQ,EAAE;EACZ,CAAC;EACL,IAAI,EAAE,SAAS,YAAY,EAAE,OAAO,KAAK,aAAa,YAAY,IAAI,WAAW,IAC/E,OAAO,KAAK;GACV,MAAM;GACN,SAAS,YAAY,KAAK;GAC1B,QAAQ,EAAE;EACZ,CAAC;CACL;CAEA,MAAM,uBAAO,IAAI,IAAsB;CACvC,KAAK,MAAM,KAAK,OAAO,KAAK,IAAI,EAAE,QAAQ,CAAC,GAAI,KAAK,IAAI,EAAE,MAAM,KAAK,CAAC,GAAI,EAAE,MAAM,CAAC;CAGnF,IAAI,SAAS,SAAS,GAAG;EACvB,MAAM,uBAAO,IAAI,IAAY;EAC7B,MAAM,QAAQ,SAAS,KAAK,MAAM,EAAE,EAAE;EACtC,OAAO,MAAM,QAAQ;GACnB,MAAM,KAAK,MAAM,IAAI;GACrB,IAAI,KAAK,IAAI,EAAE,GAAG;GAClB,KAAK,IAAI,EAAE;GACX,MAAM,KAAK,GAAI,KAAK,IAAI,EAAE,KAAK,CAAC,CAAE;EACpC;EACA,KAAK,MAAM,KAAK,KAAK,OACnB,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,GAChB,OAAO,KAAK;GACV,MAAM;GACN,SAAS,YAAY,SAAS,CAAC,EAAE;GACjC,QAAQ,EAAE;EACZ,CAAC;CACP;CAGA,MAAM,wBAAQ,IAAI,IAAmB;CACrC,MAAM,OAAiB,CAAC;CACxB,MAAM,SAAS,OAAe;EAC5B,MAAM,IAAI,IAAI,CAAC;EACf,KAAK,KAAK,EAAE;EACZ,KAAK,MAAM,KAAK,KAAK,IAAI,EAAE,KAAK,CAAC,GAC/B,IAAI,MAAM,IAAI,CAAC,MAAM,GAAG;GACtB,MAAM,OAAO,CAAC,GAAG,KAAK,MAAM,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI,SAAS,KAAK,IAAI,CAAC,CAAE,EAAE,EAAE;GACzF,OAAO,KAAK;IACV,MAAM;IACN,SAAS,mDAAmD,KAAK,KAAK,KAAK,EAAE;IAC7E,QAAQ;GACV,CAAC;EACH,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,MAAM,CAAC;EAEnC,KAAK,IAAI;EACT,MAAM,IAAI,IAAI,CAAC;CACjB;CACA,KAAK,MAAM,KAAK,KAAK,OAAO,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE;CAE5D,OAAO;AACT;AAIA,IAAM,YAAY,MAAwB;CACxC,IAAI,MAAM,QAAQ,CAAC,GAAG,OAAO,EAAE,IAAI,QAAQ;CAC3C,IAAI,KAAK,OAAO,MAAM,UACpB,OAAO,OAAO,YACZ,OAAO,KAAK,CAAC,CAAC,CACX,KAAK,CAAC,CACN,KAAK,MAAM,CAAC,GAAG,SAAU,EAA8B,EAAE,CAAC,CAAC,CAChE;CACF,OAAO;AACT;;;;;AAMA,SAAgB,cAAc,OAAqB;CACjD,MAAM,OAAO,YAAY,KAAK;CAC9B,MAAM,QAAQ,KAAK,MAAM,KAAK,OAAO;EACnC,IAAI,EAAE;EACN,MAAM,EAAE;EACR,UAAU;GAAE,GAAG,EAAE,SAAS;GAAG,GAAG,EAAE,SAAS;EAAE;EAC7C,MAAM,EAAE,KAAK,SACT;GAAE,OAAO,EAAE,KAAK;GAAO,QAAQ,SAAS,EAAE,KAAK,MAAM;EAAE,IACvD,EAAE,OAAO,EAAE,KAAK,MAAM;CAC5B,EAAE;CACF,MAAM,QAAQ,KAAK,MAAM,KAAK,MAC5B,EAAE,SACE;EAAE,IAAI,EAAE;EAAI,QAAQ,EAAE;EAAQ,QAAQ,EAAE;EAAQ,QAAQ,EAAE;CAAO,IACjE;EAAE,IAAI,EAAE;EAAI,QAAQ,EAAE;EAAQ,QAAQ,EAAE;CAAO,CACrD;CACA,OAAO,KAAK,UAAU;EAAE,SAAS;EAAG;EAAO;CAAM,GAAG,MAAM,CAAC;AAC7D;AAIA,IAAM,YAAY,MAChB,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,MAAM,QAAQ,CAAC;;;;;AAMzD,SAAgB,UAAU,MAA2B;CACnD,IAAI;CACJ,IAAI;EACF,MAAM,KAAK,MAAM,IAAI;CACvB,QAAQ;EACN,OAAO;GAAE,IAAI;GAAO,QAAQ,CAAC,+BAA+B;EAAE;CAChE;CACA,IAAI,CAAC,SAAS,GAAG,GAAG,OAAO;EAAE,IAAI;EAAO,QAAQ,CAAC,wCAAwC;CAAE;CAC3F,IAAI,IAAI,YAAY,KAAA,KAAa,IAAI,YAAY,GAC/C,OAAO;EAAE,IAAI;EAAO,QAAQ,CAAC,8DAA8D;CAAE;CAC/F,IAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,CAAC,MAAM,QAAQ,IAAI,KAAK,GAEvD,OAAO;EAAE,IAAI;EAAO,QAAQ,CAAC,YADf,CAAC,MAAM,QAAQ,IAAI,KAAK,IAAI,UAAU,QACL,yBAAyB;CAAE;CAE5E,MAAM,KAAK,IAAI,YAAY;CAC3B,MAAM,QAAQ,KAAK,WAAW;CAE9B,MAAM,SAAmB,CAAC;CAC1B,MAAM,QAAoB,CAAC;CAC3B,MAAM,sBAAM,IAAI,IAAY;CAC5B,IAAI,MAAM,SAAS,MAAM,MAAM;EAC7B,MAAM,KAAK,SAAS,IAAI;EACxB,IAAI,CAAC,SAAS,IAAI,GAAG,OAAO,KAAK,OAAO,KAAK,GAAG,GAAG,yBAAyB;EAC5E,MAAM,EAAE,IAAI,MAAM,UAAU,SAAS;EACrC,IAAI,KAAK;EACT,IAAI,OAAO,OAAO,YAAY,OAAO,IAAI;GACvC,OAAO,KAAK,GAAG,GAAG,gBAAgB;GAClC,KAAK;EACP,OAAO,IAAI,IAAI,IAAI,EAAE,GAAG;GACtB,OAAO,KAAK,GAAG,GAAG,UAAU,GAAG,iBAAiB;GAChD,KAAK;EACP,OAAO,IAAI,IAAI,EAAE;EACjB,IAAI,CAAC,MAAM,SAAS,IAAc,GAAG;GACnC,OAAO,KAAK,GAAG,GAAG,uBAAuB,OAAO,IAAI,EAAE,GAAG;GACzD,KAAK;EACP;EACA,MAAM,MAAM,SAAS,QAAQ,IAAI,WAAW;EAC5C,IACE,CAAC,OACD,OAAO,IAAI,MAAM,YACjB,OAAO,IAAI,MAAM,YACjB,CAAC,OAAO,SAAS,IAAI,CAAC,KACtB,CAAC,OAAO,SAAS,IAAI,CAAC,GACtB;GACA,OAAO,KAAK,GAAG,GAAG,8CAA8C;GAChE,KAAK;EACP;EACA,IAAI,CAAC,SAAS,IAAI,KAAK,OAAO,KAAK,UAAU,UAAU;GACrD,OAAO,KAAK,GAAG,GAAG,qCAAqC;GACvD,KAAK;EACP,OAAO,IAAI,KAAK,WAAW,KAAA,KAAa,CAAC,SAAS,KAAK,MAAM,GAAG;GAC9D,OAAO,KAAK,GAAG,GAAG,uCAAuC;GACzD,KAAK;EACP;EACA,IAAI,IAAI;GACN,MAAM,IAAI;GACV,MAAM,KAAK;IACL;IACE;IACN,UAAU;KAAE,GAAI,IAAsB;KAAG,GAAI,IAAsB;IAAE;IACrE,MAAM,EAAE,SAAS;KAAE,OAAO,EAAE;KAAO,QAAQ,EAAE;IAAO,IAAI,EAAE,OAAO,EAAE,MAAM;GAC3E,CAAC;EACH;CACF,CAAC;CAED,MAAM,QAAoB,CAAC;CAC3B,MAAM,0BAAU,IAAI,IAAY;CAChC,IAAI,MAAM,SAAS,MAAM,MAAM;EAC7B,MAAM,KAAK,WAAW,IAAI;EAC1B,IAAI,CAAC,SAAS,IAAI,GAAG,OAAO,KAAK,OAAO,KAAK,GAAG,GAAG,yBAAyB;EAC5E,MAAM,EAAE,IAAI,QAAQ,QAAQ,WAAW;EACvC,IAAI,KAAK;EACT,KAAK,MAAM,CAAC,OAAO,MAAM;GACvB,CAAC,MAAM,EAAE;GACT,CAAC,UAAU,MAAM;GACjB,CAAC,UAAU,MAAM;EACnB,GACE,IAAI,OAAO,MAAM,YAAY,MAAM,IAAI;GACrC,OAAO,KAAK,GAAG,GAAG,mBAAmB,MAAM,GAAG;GAC9C,KAAK;EACP;EACF,IAAI,MAAM,QAAQ,IAAI,EAAY,GAAG;GACnC,OAAO,KAAK,GAAG,GAAG,UAAU,GAAa,iBAAiB;GAC1D,KAAK;EACP;EACA,IAAI,WAAW,KAAA,GAIT;OAAA,EAHU,KACV,OAAO,WAAW,YAAY,WAAW,KACzC,WAAW,SAAS,WAAW,QACvB;IACV,OAAO,KACL,KACI,GAAG,GAAG,wDACN,GAAG,GAAG,uCACZ;IACA,KAAK;GACP;;EAEF,IAAI,IAAI;GACN,QAAQ,IAAI,EAAY;GACxB,MAAM,KACJ,SACI;IACM;IACI;IACA;IACA;GACV,IACA;IAAM;IAAsB;IAA0B;GAAiB,CAC7E;EACF;CACF,CAAC;CAED,IAAI,OAAO,SAAS,GAAG,OAAO;EAAE,IAAI;EAAO;CAAO;CAClD,OAAO;EAAE,IAAI;EAAM,MAAM,YAAY,KAAK;GAAE,SAAS;GAAG;GAAO;EAAM,IAAI;GAAE;GAAO;EAAM,CAAC;CAAE;AAC7F;;;ACvVA,IAAa,qBAAqB,cAAkC,IAAI;AAKxE,IAAa,YAAyE;CACpF,mBAAmB;CACnB,aAAa;CACb,mBAAmB;CACnB,UAAU;CACV,OAAO;CACP,UAAU;CACV,QAAQ;CACR,iBAAiB;CACjB,QAAQ;CACR,SAAS;CACT,MAAM;CACN,KAAK;AACP;AAEA,IAAM,OAAyC;CAC7C,UAAU;CACV,WAAW;CACX,cAAc;CACd,aAAa;CACb,OAAO;AACT;;AAGA,IAAa,YAAY,SAAuB,KAAK,YAAY,KAAK,CAAC;AAEvE,IAAM,YAAoC;CACxC,IAAI;CACJ,MAAM;CACN,MAAM;CACN,OAAO;AACT;;AAGA,IAAa,YAAsC;CACjD,gCACE;CACF,yCACE;CACF,yCAAyC,EAAE,WAAW,GAAG,QACvD,gBAAgB,UAAU,cAAc,UAAU,qBAAqB,EAAE,OAAO;CAClF,gCACE;AACJ;;AAQA,SAAgB,UAAU,MAAY,OAAsB,CAAC,GAAiB;CAC5E,MAAM,yBAAS,IAAI,IAAsB;CACzC,KAAK,MAAM,SAAS,KAAK,UAAU,CAAC,GAClC,IAAI,MAAM,QAAQ,OAAO,IAAI,MAAM,QAAQ,CAAC,GAAI,OAAO,IAAI,MAAM,MAAM,KAAK,CAAC,GAAI,MAAM,OAAO,CAAC;CACjG,OAAO,KAAK,MAAM,KAAK,OAAO;EAC5B,IAAI,EAAE;EACN,MAAM;EACN,UAAU,EAAE;EACZ,WAAW,EAAE,KAAK;EAClB,eAAe,EAAE,wBAAwB,QAAQ;EACjD,MAAM;GACJ,OAAO,EAAE,KAAK;GACd,MAAM,EAAE;GACR,GAAI,EAAE,KAAK,SAAS,EAAE,QAAQ,EAAE,KAAK,OAAO,IAAI,CAAC;GACjD,QAAQ,OAAO,IAAI,EAAE,EAAE,KAAK,CAAC;GAC7B,QAAQ,KAAK,aAAa,EAAE;EAC9B;CACF,EAAE;AACJ;;AAUA,SAAgB,UAAU,MAAkC;CAC1D,MAAM,SAAS,IAAI,IAAI,KAAK,MAAM,KAAK,MAAM,CAAC,EAAE,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC;CACjE,OAAO,KAAK,MAAM,KAAK,MAAM;EAC3B,MAAM,QAAQ,UAAU,MAAM,CAAC;EAC/B,MAAM,OAAO,OAAO,IAAI,EAAE,MAAM,KAAK,EAAE;EACvC,MAAM,KAAK,OAAO,IAAI,EAAE,MAAM,KAAK,EAAE;EACrC,OAAO;GACL,IAAI,EAAE;GACN,QAAQ,EAAE;GACV,QAAQ,EAAE;GACV,MAAM;GACN,UAAU;GACV,GAAI,EAAE,SAAS,EAAE,cAAc,EAAE,OAAO,IAAI,CAAC;GAC7C,WAAW,OAAO,KAAK,UAAU,GAAG,GAAG,QAAQ,QAAQ,UAAU;GACjE,eAAe,EAAE,wBAAwB,UAAU;GACnD,MAAM;IAAE;IAAO;IAAM;GAAG;EAC1B;CACF,CAAC;AACH;AAIA,SAAS,KAAK,EACZ,MACA,IACA,eACA,WAAW,SAAS,WAAW,SAAS,OAAO,SAAS,SAMvD;CAED,OACE,oBAAC,QAAD;EACM;EACE;EACI;EACV,WAAU;EACK;EAEf,UAAA,oBAAC,QAAD;GACE,eAAA;GACA,iBAAA;GACA,WAAU;EACX,CAAA;CACK,CAAA;AAEZ;AAEA,SAAS,MAAM,EAAE,QAA0B;CACzC,IAAI,CAAC,MAAM,OAAO,oBAAC,QAAD;EAAM,WAAU;EAAgC,UAAA;CAAkB,CAAA;CACpF,OACE,oBAAC,QAAD;EAAM,WAAU;EACb,UAAA,eAAe,IAAI,CAAC,CAAC,KAAK,MAAM,MAC/B,KAAK,SAAS,QACZ,oBAAC,QAAD;GAEE,kBAAA;GACA,WAAU;GACV,UAAA,KAAK,KAAK,MAAM;EAAU,GAHrB,CAGqB,IAE5B,oBAAC,QAAD,EAAA,UAAe,KAAK,MAAY,GAArB,CAAqB,CAEpC;CACI,CAAA;AAEV;AAEA,SAAS,UAAU,EAAE,IAAI,MAAM,UAAU,iBAAwC;CAC/E,MAAM,MAAM,aAAa;CACzB,MAAM,UAAU,iBAAiB;CACjC,MAAM,UAAU,WAAW,kBAAkB;CAC7C,MAAM,MAAM,MAAM;CAClB,MAAM,OAAO,UAAU,KAAK;CAC5B,MAAM,MAAM,YAAY,KAAK;CAC7B,MAAM,QAAQ;EAAE,MAAM,KAAK;EAAM,MAAM;GAAE,OAAO,KAAK;GAAO,QAAQ,KAAK;EAAO;CAAE;CAClF,MAAM,OAAO,SAAS,KAAK;CAC3B,MAAM,UAAU,gBAAgB,KAAK;CACrC,MAAM,QAAQ,KAAK,SAAS,aAAa,QAAQ,KAAK,IAAI,CAAC;CAC3D,MAAM,WAAW,KAAK,SAAS,qBAAqB,KAAK,QAAQ,aAAa;CAC9E,MAAM,UAAU,KAAK,OAAO,SAAS;CACrC,MAAM,UAAU,GAAG,IAAI;CACvB,MAAM,SAAS,GAAG,IAAI;CACtB,MAAM,OAAO;CACb,MAAM,SAAS;CACf,OACE,qBAAC,OAAD;EACE,kBAAA;EACA,aAAW,KAAK;EAChB,iBAAe;EACf,eAAa,KAAK,SAAS,SAAS,KAAA;EACpC,gBAAc,UAAU,SAAS,KAAA;EACjC,iBAAe,WAAW,SAAS,KAAA;EACnC,oBAAkB,UAAU,GAAG,OAAO,GAAG,YAAY;EACrD,WAAW,GACT,oFACA,WAAW,sBACX,KAAK,UAAU,kBACf,YAAY,qBACd;EAbF,UAAA;GAeG,KAAK,WACH,MACC,oBAAC,IAAI,EAAE,MAAP;IACE,eAAA;IACA,mBAAA;IACA,WAAW;IACX,SAAS,QAAQ,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS;KAAC;KAAG;KAAK;IAAC,EAAE;IACnE,YACE,QAAQ,UACJ,QAAQ,KAAK,aACb;KACE,UAAU,QAAQ,OAAO,SAAS;KAClC,MAAM,QAAQ,OAAO,KAAK;KAC1B,QAAQ;IACV;GAEP,CAAA,IAED,oBAAC,QAAD;IAAM,eAAA;IAAY,WAAW;GAAO,CAAA;GAEvC,EAAE,IAAI,UAAU,eAAe,oBAAC,MAAD;IAAM,MAAK;IAAwB;GAAgB,CAAA;GACnF,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,oBAAC,QAAD;MACE,WAAW,GACT,kEACA,SAAS,KAAK,IAAI,CACpB;MAEA,UAAA,oBAAC,MAAD;OAAM,WAAU;OAAe,eAAA;MAAa,CAAA;KACxC,CAAA;KACN,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,oBAAC,QAAD;OAAM,mBAAA;OAAgB,WAAU;OAA+B,OAAO;OACnE,UAAA;MACG,CAAA,GACN,oBAAC,QAAD;OAAM,WAAU;OACb,UAAA,KAAK,SAAS,UAAU,eAAe,KAAK;MACzC,CAAA,CACH;;KACJ,WACC,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA;OACE,oBAAC,QAAD;QACE,SAAQ;QACR,MAAK;QACL,UAAA;QACA,cAAY,kBAAkB;QAC9B,WAAW;QACX,MAAM,oBAAC,MAAD,CAAO,CAAA;QACb,eAAe,QAAQ,KAAK,EAAE;OAC/B,CAAA;OACA,QAAQ,QACP,oBAAC,QAAD;QACE,kBAAA;QACA,SAAQ;QACR,MAAK;QACL,UAAA;QACA,cAAY,gBAAgB;QAC5B,WAAW;QACX,MAAM,oBAAC,WAAD,CAAY,CAAA;QAClB,eAAe,QAAQ,OAAO,EAAE;OACjC,CAAA;OAEF,QAAQ,UACP,oBAAC,QAAD;QACE,SAAQ;QACR,MAAK;QACL,UAAA;QACA,cAAY,iBAAiB;QAC7B,WAAW;QACX,MAAM,oBAAC,QAAD,CAAS,CAAA;QACf,eAAe,QAAQ,SAAS,EAAE;OACnC,CAAA;MAEA;;IAEJ;;GACL,oBAAC,KAAD;IAAG,IAAI;IAAQ,WAAU;IACtB,UAAA,IAAI;GACJ,CAAA;GACF,QAAQ,SAAS,KAChB,oBAAC,MAAD;IAAI,WAAU;IACX,UAAA,QAAQ,KAAK,QACZ,qBAAC,OAAD;KAAqB,WAAU;KAA/B,UAAA,CACE,oBAAC,MAAD;MAAI,WAAU;MAAiC,UAAA,IAAI;KAAU,CAAA,GAC7D,oBAAC,MAAD,EAAA,UACE,oBAAC,OAAD,EAAO,MAAM,IAAI,MAAQ,CAAA,EACvB,CAAA,CACD;IALK,GAAA,IAAI,KAKT,CACN;GACC,CAAA;GAEL,YACC,qBAAC,KAAD;IAAG,WAAU;IAAb,UAAA,CACE,oBAAC,cAAD;KAAc,WAAU;KAAwB,eAAA;IAAa,CAAA,GAAC,4BAE7D;;GAEJ,KAAK,SAAS,cACb,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACG,MAAM,KAAK,SACV,qBAAC,OAAD;KAEE,oBAAkB,KAAK;KACvB,WAAU;KAHZ,UAAA;MAKE,oBAAC,QAAD;OAAM,WAAU;OAAuB,UAAA,WAAW,OAAO,KAAK,EAAE;MAAQ,CAAA;MACxE,oBAAC,QAAD;OACE,WAAU;OACV,OAAO,YAAY,IAAI;OAEtB,UAAA,YAAY,IAAI;MACb,CAAA;MACN,oBAAC,MAAD;OAAM,MAAK;OAAS,IAAI,KAAK;OAAmB;MAAgB,CAAA;KAC7D;IAZE,GAAA,KAAK,EAYP,CACN,GACD,qBAAC,OAAD;KACE,oBAAiB;KACjB,WAAU;KAFZ,UAAA;MAIE,oBAAC,QAAD;OAAM,WAAU;OAAsB,UAAA;MAAW,CAAA;MACjD,oBAAC,QAAD;OAAM,WAAU;OAAiD,UAAA;MAE3D,CAAA;MACN,oBAAC,MAAD;OAAM,MAAK;OAAS,IAAG;OAAuB;MAAgB,CAAA;KAC3D;IACF,CAAA,CAAA;;GAEN,WACC,qBAAC,KAAD;IACE,IAAI;IACJ,WAAU;IAFZ,UAAA;KAIE,oBAAC,eAAD;MAAe,WAAU;MAAwB,eAAA;KAAa,CAAA;KAC9D,oBAAC,UAAD,EAAA,UAAQ,WAAgB,CAAA;KAAC;KAAE,KAAK,OAAO,KAAK,GAAG;IAC9C;;GAEJ,KAAK,SAAS,cAAc,oBAAC,MAAD;IAAM,MAAK;IAAwB;GAAgB,CAAA;EAC7E;;AAET;;AAKA,SAAS,SAAS,IAAY,IAAY,IAAY,IAAY,GAAW;CAC3E,MAAM,IAAI,KAAK;CACf,MAAM,SAAS,KAAK,IAAI,KAAM,IAAI,OAAY,KAAK,KAAK,CAAC,CAAC;CAC1D,MAAM,KAAK,IAAI;CAIf,OAAO;EAAE,GAFP,MAAM,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,KAAK,KAAK,UAAU,KAAK,IAAI;EAElF,GADF,MAAM,IAAI,KAAK,IAAI,MAAM,IAAI,IAAI,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI;CAClE;AAChB;AAEA,SAAS,SAAS,EAChB,IACA,SACA,SACA,SACA,SACA,gBACA,gBACA,WACA,UACA,QACgC;CAChC,MAAM,UAAU,WAAW,kBAAkB;CAC7C,MAAM,CAAC,YAAY,iBAAiB,SAAS,KAAK;CAClD,MAAM,QAAQ,OAA0B,IAAI;CAC5C,gBAAgB;EACd,IAAI,YAAY,MAAM,SAAS,MAAM;CACvC,GAAG,CAAC,UAAU,CAAC;CACf,MAAM,CAAC,MAAM,MAAM,QAAQ,cAAc;EACvC;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CACD,MAAM,QAAQ,SAAS,SAAS,SAAS,SAAS,SAAS,GAAI;CAC/D,MAAM,YAAY,QAAQ,YAAY,SAAS,UAAU;CACzD,MAAM,QAAQ,GAAG,MAAM,QAAQ,GAAG,QAAQ,MAAM,MAAM;CACtD,MAAM,QAAQ,MAAM;CACpB,OACE,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,UAAD;EAAc;EAAU;EAAiB;EAAW,kBAAkB;CAAK,CAAA,GAC3E,qBAAC,mBAAD,EAAA,UAAA,CACG,SACC,oBAAC,OAAD;EACE,WAAU;EACV,OAAO;GAAE,YAAY,GAAG,MAAM,EAAE;GAAK,YAAY,GAAG,MAAM,EAAE;EAAI;EAEhE,UAAA,oBAAC,QAAD;GACE,wBAAA;GACA,WAAU;GAET,UAAA;EACG,CAAA;CACH,CAAA,GAEN,aAAa,SAAS,cACrB,oBAAC,OAAD;EACE,WAAU;EACV,OAAO;GAAE,YAAY,GAAG,KAAK;GAAK,YAAY,GAAG,KAAK;EAAI;EAE1D,UAAA,oBAAC,OAAD;GACE,0BAAA;GACA,MAAK;GACL,WAAU;GACV,YAAY,MAAM;IAChB,IAAI,EAAE,QAAQ,YAAY,YAAY;KACpC,EAAE,gBAAgB;KAClB,cAAc,KAAK;IACrB;GACF;GAEC,UAAA,aACC,qBAAA,YAAA,EAAA,UAAA;IACE,oBAAC,QAAD;KACE,MAAK;KACL,cAAW;KACX,WAAU;KACX,UAAA;IAEK,CAAA;IACN,oBAAC,QAAD;KACE,MAAK;KACL,SAAQ;KACR,WAAU;KACV,eAAe;MACb,cAAc,KAAK;MACnB,QAAQ,aAAa,EAAE;KACzB;KACD,UAAA;IAEO,CAAA;IACR,oBAAC,QAAD;KACE,MAAK;KACL,SAAQ;KACR,KAAK;KACL,WAAU;KACV,UAAU,MAAM;MACd,cAAc,KAAK;MACnB,EAAE,cAAc,QAAqB,eAAe,CAAC,EAAE,MAAM;KAC/D;KACD,UAAA;IAEO,CAAA;GACR,EAAA,CAAA,IAEF,oBAAC,QAAD;IACE,MAAK;IACL,SAAQ;IACR,UAAA;IACA,cAAY,sBAAsB;IAClC,WAAU;IACV,MAAM,oBAAC,QAAD,CAAS,CAAA;IACf,eAAe,cAAc,IAAI;GAClC,CAAA;EAEA,CAAA;CACF,CAAA,CAEU,EAAA,CAAA,CACnB,EAAA,CAAA;AAEN;AAEA,IAAM,YAAY,EAAE,OAAO,UAAU;AACrC,IAAM,YAAY,EAAE,SAAS,SAAS;AAEtC,IAAM,qBAAqB;CACzB,MAAM;CACN,UAAU;CACV,WAAW,EAAE,MAAM,WAAW,YAAY;AAC5C;AAEA,IAAM,iBAAiC;CACrC,SAAS;EAAE,KAAK;EAAQ,OAAO;EAAQ,QAAQ;EAAQ,MAAM;CAAO;CACpE,SAAS;AACX;;AAGA,SAAgB,mBAAmB;CACjC,MAAM,EAAE,QAAQ,SAAS,YAAY,aAAa;CAClD,MAAM,MAAM;CACZ,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACE,oBAAC,QAAD;IACE,SAAQ;IACR,MAAK;IACL,UAAA;IACA,cAAW;IACX,WAAW;IACX,MAAM,oBAAC,QAAD,CAAS,CAAA;IACf,eAAe,KAAK,OAAO;GAC5B,CAAA;GACD,oBAAC,QAAD;IACE,SAAQ;IACR,MAAK;IACL,UAAA;IACA,cAAW;IACX,WAAW;IACX,MAAM,oBAAC,SAAD,CAAU,CAAA;IAChB,eAAe,KAAK,QAAQ;GAC7B,CAAA;GACD,oBAAC,QAAD;IACE,SAAQ;IACR,MAAK;IACL,UAAA;IACA,cAAW;IACX,WAAW;IACX,MAAM,oBAAC,WAAD,CAAY,CAAA;IAClB,eAAe,KAAK,QAAQ,cAAc;GAC3C,CAAA;EACE;;AAET;;AAGA,IAAa,eAAe;;;;;;AAO5B,SAAS,cAAc;CACrB,MAAM,EAAE,UAAU,gBAAgB,aAAa;CAC/C,MAAM,QAAQ,UAAU,OAAO,GAAG,KAAK;CACvC,MAAM,SAAS,UAAU,OAAO,GAAG,MAAM;CAEzC,MAAM,QAAQ,UACX,OACC,GAAG,WAAW,OAAO,KACrB,CAAC,GAAG,GAAG,WAAW,OAAO,CAAC,CAAC,CAAC,OAAO,OAAO,EAAE,SAAS,SAAS,KAAK,CAAC,CACxE;CACA,MAAM,SAAS,OAAO,CAAC;CAEvB,MAAM,CAAC,SAAS,cAAc,SAAS,CAAC;CACxC,gBAAgB;EACd,IAAI,CAAC,SAAS,SAAS,KAAK,UAAU,KAAK,UAAU,OAAO,SAAS;EACrE,MAAM,QAAQ,SAAS;EACvB,IAAI,MAAM,WAAW,GAAG;EACxB,MAAM,IAAI,eAAe,KAAK;EAC9B,MAAM,MAAM,KAAK,IAAI,IAAI,QAAQ,MAAM,EAAE,QAAQ,SAAS,OAAO,EAAE,MAAM;EACzE,MAAM,OAAO,KAAK,IAAI,KAAK,YAAY;EACvC,MAAM,IAAI,SAAS,OAAO,QAAQ,EAAE,QAAQ,QAAQ,IAAI,EAAE,IAAI,OAAO,KAAK,EAAE,IAAI;EAEhF,MAAM,IAAI,KAAK,KAAK,SAAS,EAAE,SAAS,QAAQ,GAAG,EAAE,IAAI,EAAE,IAAI;EAC/D,YAAiB;GAAE;GAAG;GAAG;EAAK,CAAC,CAAC,CAAC,MAAM,OAAO;GAC5C,IAAI,IAAI,OAAO,UAAU;QACpB,IAAI,UAAU,IAAI,iBAAiB,YAAY,MAAM,IAAI,CAAC,GAAG,EAAE;EACtE,CAAC;CACH,GAAG;EAAC;EAAO;EAAO;EAAQ;EAAS;EAAU;CAAW,CAAC;CACzD,OAAO;AACT;;;;;AAYA,SAAgB,YAAY,EAAE,WAAW,UAAU,OAAO,MAAM,GAAG,SAA2B;CAC5F,MAAM,MAAM,cAA8B;CAC1C,OACE,oBAAC,OAAD;EACE,KAAK,OAAO,MAAM,KAAA;EAClB,UAAU;EACV,uBAAA;EACA,WAAW,GACT,qEACA,OAAO,gDAAgD,UACvD,SACF;EACA,OACE;GACE,oBAAoB;GACpB,6BAA6B;GAC7B,0BAA0B;GAC1B,8BAA8B;GAC9B,oCAAoC;GACpC,gCAAgC;GAChC,qCAAqC;GACrC,yBAAyB;EAC3B;EAGF,UAAA,qBAAC,WAAD;GACE,WAAU;GACC;GACA;GACS;GACpB,oBAAmB;GACnB,oBAAoB,mBAAmB;GACvC,kBAAA;GACA,iBAAiB;GACjB,SAAS;GACT,SAAS;GACT,mBAAmB;GACnB,cAAc;GACd,kBAAkB;GAClB,GAAI;GAdN,UAAA;IAgBE,oBAAC,kBAAD,CAAmB,CAAA;IACnB,oBAAC,aAAD,CAAc,CAAA;IACb;GACQ;;CACR,CAAA;AAET;;;;;AAgBA,SAAgB,WAAW,EAAE,OAAO,WAAW,MAAM,QAAQ,aAA8B;CACzF,MAAM,OAAO,cAAc,YAAY,KAAK,GAAG,CAAC,KAAK,CAAC;CACtD,MAAM,QAAQ,cAAc,UAAU,MAAM;EAAE;EAAU;CAAO,CAAC,GAAG;EAAC;EAAM;EAAU;CAAM,CAAC;CAC3F,MAAM,QAAQ,cAAc,UAAU,IAAI,GAAG,CAAC,IAAI,CAAC;CACnD,OACE,oBAAC,OAAD;EAAK,eAAY;EAAU,WAAW,GAAG,uBAAuB,SAAS;EACvE,UAAA,oBAAC,aAAD;GACS;GACA;GACP,gBAAgB;GAChB,kBAAkB;GAClB,oBAAoB;GACpB,gBAAgB;GAChB,eAAe;EAChB,CAAA;CACE,CAAA;AAET;;;AC7sBA,IAAM,aAAa,MAAc,EAAE,UAAU,KAAK,CAAC,CAAC,QAAQ,WAAW,EAAE,CAAC,CAAC,YAAY;AAWvF,SAAgB,cAAc,EAAE,OAAO,aAAa,iBAAqC;CACvF,MAAM,CAAC,OAAO,YAAY,SAAS,EAAE;CACrC,MAAM,IAAI,UAAU,MAAM,KAAK,CAAC;CAChC,MAAM,SAAS,kBAAkB,KAAK,OAAO;EAC3C,GAAG;EACH,OAAO,EAAE,MAAM,QAAQ,MAAM;GAC3B,MAAM,MAAM,YAAY;GACxB,OAAO,CAAC,IAAI,WAAW,MAAM,MAAM,UAAU,GAAG,IAAI,KAAK,GAAG,IAAI,MAAM,CAAC,CAAC,SAAS,CAAC;EACpF,CAAC;CACH,EAAE,CAAC,CAAC,QAAQ,MAAM,EAAE,MAAM,SAAS,CAAC;CAEpC,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACE,oBAAC,OAAD;IACE,MAAM,oBAAC,QAAD,CAAS,CAAA;IACf,OAAO;IACP,UAAU;IACV,aAAY;IACZ,cAAW;IACX,WAAA;GACD,CAAA;GACA,OAAO,WAAW,KACjB,oBAAC,YAAD;IACE,MAAK;IACL,OAAM;IACN,aAAY;GACb,CAAA;GAEF,OAAO,KAAK,MACX,qBAAC,WAAD;IAAoB,MAAK;IAAQ,cAAY,EAAE;IAAM,WAAU;IAA/D,UAAA,CACE,oBAAC,MAAD;KAAI,WAAU;KAA6C,UAAA,EAAE;IAAS,CAAA,GACrE,EAAE,MAAM,KAAK,SAAS;KACrB,MAAM,OAAO,UAAU;KACvB,OACE,oBAAC,QAAD;MAEE,SAAQ;MACR,MAAK;MACL,mBAAiB;MACjB,WAAW,GAAG,wBAAwB,eAAe,wBAAwB;MAC7E,MACE,oBAAC,QAAD;OACE,WAAW,GACT,yDACA,SAAS,IAAI,CACf;OAEA,UAAA,oBAAC,MAAD;QAAM,WAAU;QAAe,eAAA;OAAa,CAAA;MACxC,CAAA;MAER,eAAe,eAAe,MAAM,YAAY,GAAG,IAAI,IAAI,KAAA;MAC3D,eAAe;OACb,IAAI,eAAe,SAAS;OAC5B,MAAM,IAAI;MACZ;MAEC,UAAA,YAAY,KAAK,CAAC;KACb,GAtBD,IAsBC;IAEZ,CAAC,CACM;GA/BK,GAAA,EAAE,EA+BP,CACV;EACE;;AAET;;AAYA,SAAgB,eAAe,EAC7B,OACA,SACA,aAAa,iBACb,UACA,aACsB;CACtB,MAAM,KAAK,MAAM;CACjB,OACE,qBAAC,WAAD;EAAS,mBAAiB;EAAI,WAAW,GAAG,uBAAuB,SAAS;EAA5E,UAAA,CACE,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACE,oBAAC,MAAD;IAAQ;IAAI,WAAU;IACnB,UAAA;GACC,CAAA,GACH,WACC,oBAAC,QAAD;IACE,SAAQ;IACR,MAAK;IACL,UAAA;IACA,cAAY;IACZ,WAAU;IACV,MAAM,oBAAC,GAAD,CAAI,CAAA;IACV,SAAS;GACV,CAAA,CAEA;EACJ,CAAA,GAAA,QACM;;AAEb;;;;ACzGA,SAAgB,QACd,OACA,MACA,UACA,UAA0B,CAAC,GACC;CAC5B,MAAM,OAAO,YAAY,KAAK;CAC9B,MAAM,wBAAQ,IAAI,IAAI,CAAC,GAAG,KAAK,MAAM,KAAK,MAAM,EAAE,EAAE,GAAG,GAAI,QAAQ,eAAe,CAAC,CAAE,CAAC;CACtF,IAAI,IAAI;CACR,OAAO,MAAM,IAAI,GAAG,KAAK,GAAG,GAAG,GAAG;CAClC,MAAM,KAAK,GAAG,KAAK,GAAG;CACtB,MAAM,SAAS,YAAY,KAAK,CAAC,cAAc;CAC/C,MAAM,OAAiB;EACrB;EACA;EACA,UAAU;GAAE,GAAG,SAAS;GAAG,GAAG,SAAS;EAAE;EACzC,MACE,OAAO,KAAK,MAAM,CAAC,CAAC,SAAS,IACzB;GAAE,OAAO,QAAQ,SAAS,eAAe;GAAO;EAAO,IACvD,EAAE,OAAO,QAAQ,SAAS,eAAe,MAAM;CACvD;CACA,OAAO;EAAE,MAAM;GAAE,GAAG;GAAM,OAAO,CAAC,GAAG,KAAK,OAAO,IAAI;EAAE;EAAG;CAAG;AAC/D;AAEA,IAAM,UAAU,QAAgB,QAAgB,WAC9C,SAAS,GAAG,OAAO,GAAG,OAAO,IAAI,WAAW,GAAG,OAAO,IAAI;;AAG5D,SAAS,qBAAqB,MAAY,IAAsB;CAC9D,MAAM,SAAS,QAAkB,SAAkB;EACjD,MAAM,uBAAO,IAAI,IAAY;EAC7B,MAAM,QAAQ,CAAC,GAAG,MAAM;EACxB,OAAO,MAAM,QAAQ;GACnB,MAAM,MAAM,MAAM,IAAI;GACtB,IAAI,KAAK,IAAI,GAAG,KAAK,QAAQ,MAAM;GACnC,KAAK,IAAI,GAAG;GACZ,KAAK,MAAM,KAAK,KAAK,OAAO,IAAI,EAAE,WAAW,KAAK,MAAM,KAAK,EAAE,MAAM;EACvE;EACA,OAAO;CACT;CACA,MAAM,QAAQ,MAAM,CAAC,EAAE,CAAC;CACxB,MAAM,OAAO,EAAE;CAEf,MAAM,QAAQ,MADG,KAAK,MAAM,QAAQ,MAAM,UAAU,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,MAAM,EAAE,EACrE,GAAU,EAAE;CAChC,OAAO,KAAK,MAAM,QAAQ,MAAM,MAAM,IAAI,EAAE,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,EAAE;AACtF;;;;;AAQA,SAAgB,WAAW,OAAa,IAAY,OAAmB,WAAiB;CACtF,MAAM,OAAO,YAAY,KAAK;CAC9B,MAAM,OAAO,KAAK,MAAM,MAAM,MAAM,EAAE,OAAO,EAAE;CAC/C,IAAI,CAAC,MAAM,OAAO;CAClB,MAAM,uBAAO,IAAI,IAAI,CACnB,IACA,GAAI,SAAS,sBAAsB,qBAAqB,MAAM,EAAE,IAAI,CAAC,CACvE,CAAC;CACD,IAAI,QAAQ,KAAK,MAAM,QAAQ,MAAM,CAAC,KAAK,IAAI,EAAE,MAAM,KAAK,CAAC,KAAK,IAAI,EAAE,MAAM,CAAC;CAC/E,IAAI,SAAS,aAAa,KAAK,SAAS,YAAY;EAClD,MAAM,OAAO,KAAK,MAAM,QAAQ,MAAM,EAAE,WAAW,EAAE;EACrD,MAAM,OAAO,KAAK,MAAM,QAAQ,MAAM,EAAE,WAAW,EAAE;EACrD,IAAI,KAAK,WAAW,KAAK,KAAK,WAAW,GAAG;GAC1C,MAAM,IAAI,KAAK;GACf,MAAM,IAAI,KAAK;GACf,MAAM,UAAoB;IACxB,IAAI,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM;IACvC,QAAQ,EAAE;IACV,QAAQ,EAAE;IACV,GAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,IAAI,CAAC;GACzC;GACA,IAAI,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,MAAM,MAAM,EAAE,OAAO,QAAQ,EAAE,GACjE,QAAQ,CAAC,GAAG,OAAO,OAAO;EAC9B;CACF;CACA,OAAO;EAAE,GAAG;EAAM,OAAO,KAAK,MAAM,QAAQ,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;EAAG;CAAM;AAC5E;AAEA,SAAgB,WAAW,MAAY,IAAkB;CACvD,OAAO;EAAE,GAAG;EAAM,OAAO,KAAK,MAAM,QAAQ,MAAM,EAAE,OAAO,EAAE;CAAE;AACjE;;AAGA,SAAgB,YAAY,MAAY,QAAgB,QAA2B;CACjF,OAAO;EACL,GAAG;EACH,OAAO,KAAK,MAAM,QAAQ,MAAM,EAAE,EAAE,WAAW,WAAW,EAAE,UAAU,KAAA,OAAe,OAAO;CAC9F;AACF;AAEA,SAAgB,SAAS,MAAY,IAAY,UAA0C;CACzF,OAAO;EACL,GAAG;EACH,OAAO,KAAK,MAAM,KAAK,MACrB,EAAE,OAAO,KAAK;GAAE,GAAG;GAAG,UAAU;IAAE,GAAG,SAAS;IAAG,GAAG,SAAS;GAAE;EAAE,IAAI,CACvE;CACF;AACF;;AAGA,SAAgB,eACd,MACA,IACA,OACM;CACN,OAAO;EACL,GAAG;EACH,OAAO,KAAK,MAAM,KAAK,MAAM;GAC3B,IAAI,EAAE,OAAO,IAAI,OAAO;GACxB,MAAM,QAAQ,MAAM,SAAS,EAAE,KAAK;GACpC,MAAM,SAAS,MAAM,UAAU,EAAE,KAAK;GACtC,OAAO;IAAE,GAAG;IAAG,MAAM,SAAS;KAAE;KAAO;IAAO,IAAI,EAAE,MAAM;GAAE;EAC9D,CAAC;CACH;AACF;;;;;AAUA,SAAgB,aACd,MACA,QACA,QACA,QACe;CACf,MAAM,OAAO,KAAK,MAAM,MAAM,MAAM,EAAE,OAAO,MAAM;CACnD,MAAM,KAAK,KAAK,MAAM,MAAM,MAAM,EAAE,OAAO,MAAM;CACjD,IAAI,CAAC,QAAQ,CAAC,IAAI,OAAO;EAAE,IAAI;EAAO,QAAQ;CAA8B;CAC5E,IAAI,WAAW,QAAQ,OAAO;EAAE,IAAI;EAAO,QAAQ;CAAuC;CAC1F,IAAI,UAAU,GAAG,IAAI,GACnB,OAAO;EAAE,IAAI;EAAO,QAAQ;CAAiD;CAC/E,IAAI,KAAK,SAAS,YAAY;EAC5B,IAAI,CAAC,QAAQ,OAAO;GAAE,IAAI;GAAO,QAAQ;EAAqD;EAC9F,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,SAAS,MAAM,GAClC,OAAO;GAAE,IAAI;GAAO,QAAQ;EAA0C;CAC1E,OAAO,IAAI,QAAQ,OAAO;EAAE,IAAI;EAAO,QAAQ;CAAsC;CACrF,MAAM,KAAK,OAAO,QAAQ,QAAQ,MAAM;CACxC,IAAI,KAAK,MAAM,MAAM,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO;EAAE,IAAI;EAAO,QAAQ;CAA0B;CAC/F,MAAM,cAAc,MAAgB,EAAE,WAAW,WAAW,EAAE,UAAU,KAAA,OAAe;CACvF,MAAM,MAAM,KAAK,MAAM,KAAK,UAAU;CACtC,MAAM,OAAiB,SAAS;EAAE;EAAI;EAAQ;EAAQ;CAAO,IAAI;EAAE;EAAI;EAAQ;CAAO;CACtF,OAAO;EACL,IAAI;EACJ,MAAM;GAAE,GAAG;GAAM,OAAO,CAAC,GAAG,KAAK,MAAM,QAAQ,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;EAAE;EAC5E,GAAI,MACA,EACE,UAAU;GACR,QAAQ,IAAI;GACZ,QAAQ,IAAI;GACZ,GAAI,IAAI,SAAS,EAAE,QAAQ,IAAI,OAAO,IAAI,CAAC;EAC7C,EACF,IACA,CAAC;CACP;AACF;;AAGA,SAAgB,eAAe,MAAY,IAAwB;CACjE,IAAI,CAAC,KAAK,MAAM,MAAM,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;CAClD,OAAO,KAAK,MAAM,QAAQ,MAAM,EAAE,OAAO,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC;AACnE;;AAUA,SAAgB,kBAAkB,MAAY,IAAuB;CACnE,MAAM,OAAO,IAAI,IAAI,KAAK,MAAM,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;CACrD,MAAM,OAAO,KAAK,IAAI,EAAE;CACxB,MAAM,aAAsC,CAAC;CAC7C,MAAM,cAAwC,CAAC;CAC/C,KAAK,MAAM,KAAK,KAAK,OAAO;EAC1B,IAAI,EAAE,WAAW,IAAI;GACnB,MAAM,OAAO,KAAK,IAAI,EAAE,MAAM;GAC9B,IAAI,MACF,WAAW,KAAK;IACd;IACA,GAAI,EAAE,SAAS,EAAE,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC;GAC1D,CAAC;EACL;EACA,IAAI,EAAE,WAAW,MAAM,MAAM;GAC3B,MAAM,OAAO,KAAK,IAAI,EAAE,MAAM;GAC9B,IAAI,MACF,YAAY,KAAK;IACf;IACA,GAAI,EAAE,SAAS,EAAE,OAAO,WAAW,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC;GAC1D,CAAC;EACL;CACF;CACA,OAAO;EAAE;EAAY;EAAa,cAAc,qBAAqB,MAAM,EAAE,CAAC,CAAC;CAAO;AACxF;;;;;;AASA,SAAgB,iBACd,MACA,MACA,MACA,WAAqD,CAAC,GAC5B;CAC1B,MAAM,QAAgB,KAAK,MAAM,KAAK,OAAO;EAC3C,GAAG,EAAE,SAAS;EACd,GAAG,EAAE,SAAS;EACd,GAAG,SAAS,EAAE,GAAG,EAAE,KAAA;EACnB,GAAG,SAAS,EAAE,GAAG,EAAE,KAAK,mBAAmB,CAAC;CAC9C,EAAE;CACF,MAAM,MAAA;CACN,MAAM,QAAQ,GAAW,MACvB,MAAM,OACH,MACC,IAAI,KAAK,IAAI,OAAO,EAAE,KACtB,EAAE,IAAI,EAAE,IAAI,OAAO,KACnB,IAAI,KAAK,IAAI,OAAO,EAAE,KACtB,EAAE,IAAI,EAAE,IAAI,OAAO,CACvB;CACF,KAAK,IAAI,MAAM,GAAG,MAAM,IAAI,OAAO;EACjC,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,IAAA;EAC/B,KAAK,IAAI,MAAM,GAAG,MAAM,IAAI,OAAO;GACjC,MAAM,IAAI,KAAK,IAAI,MAAA;GACnB,IAAI,KAAK,GAAG,CAAC,GAAG,OAAO;IAAE;IAAG;GAAE;EAChC;CACF;CACA,OAAO;EAAE,GAAG,KAAK;EAAG,GAAG,KAAK;CAAE;AAChC;;AAGA,SAAgB,gBAAgB,MAAY,UAAsD;CAChG,MAAM,QAAQ,OAAe;EAC3B,MAAM,IAAI,KAAK,MAAM,MAAM,MAAM,EAAE,OAAO,EAAE;EAC5C,OAAO,IAAI,SAAS,CAAC,IAAI;CAC3B;CACA,OAAO,0BAA0B,KAAK,SAAS,MAAM,EAAE,UAAU,KAAK,SAAS,MAAM,EAAE;AACzF;;;ACpOA,IAAM,OAAO;AACb,IAAM,OAAO;AAmBb,SAAS,eAAe,EACtB,WACA,OACA,YAKC;CACD,OACE,oBAAC,QAAD;EACE,OAAO,uBAAuB;EAC9B,aAAY;EACZ,UAAU,UAAU,WAAW;EAC/B,OAAO;EACP,SAAS,UAAU,KAAK,OAAO;GAAE,OAAO,EAAE;GAAI,OAAO,EAAE;GAAI,aAAa,EAAE;EAAM,EAAE;EAClF,WAAW,MAAM,KAAK,SAAS,KAAK,EAAE,GAAG;CAC1C,CAAA;AAEL;;AAGA,SAAS,cAAc,EACrB,OACA,OACA,UACA,WACA,WACA,QAQC;CACD,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,oBAAC,OAAD;GAAc;GAAO,MAAK;GAAa;GACpC,UAAA,YACC,oBAAC,UAAD;IAAU,MAAM;IAAU;IAAiB;GAAW,CAAA,IAEtD,oBAAC,OAAD;IAAc;IAAiB;GAAW,CAAA;EAEvC,CAAA,GACP,oBAAC,gBAAD;GACa;GACJ;GACP,WAAW,UAAU,SAAS,QAAQ,KAAK;EAC5C,CAAA,CACE;;AAET;;AAGA,SAAS,eAAe,EACtB,OACA,OACA,WACA,YAMC;CACD,MAAM,UAAU,2BAA2B,KAAK,KAAK,CAAC,GAAG,MAAM;CAC/D,MAAM,UAA0B,UAAU,KAAK,OAAO;EACpD,OAAO,EAAE;EACT,OAAO,EAAE;EACT,aAAa,EAAE;CACjB,EAAE;CACF,IAAI,WAAW,CAAC,UAAU,MAAM,MAAM,EAAE,OAAO,OAAO,GACpD,QAAQ,KAAK;EAAE,OAAO;EAAS,OAAO;CAAQ,CAAC;CACjD,OACE,oBAAC,QAAD;EACS;EACP,aAAY;EACZ,OAAO;EACE;EACT,WAAA;EACA,WAAW,MAAM,SAAS,IAAI,KAAK,EAAE,MAAM,EAAE;CAC9C,CAAA;AAEL;AAIA,SAAS,gBAAgB,EACvB,MACA,MACA,WACA,WACoD;CACpD,MAAM,QAAQ,QAAQ,IAAI;CAC1B,MAAM,gBAAgB,SAAmC;EACvD,MAAM,OAAO,UAAU,KAAK,OAAO;GAAE,OAAO,EAAE;GAAI,OAAO,EAAE;GAAI,aAAa,EAAE;EAAM,EAAE;EACtF,IAAI,KAAK,SAAS,CAAC,KAAK,MAAM,MAAM,EAAE,UAAU,KAAK,KAAK,GACxD,KAAK,KAAK;GAAE,OAAO,KAAK;GAAO,OAAO,KAAK;GAAO,aAAa;EAAG,CAAC;EACrE,OAAO;CACT;CACA,MAAM,QAAQ,MAAkB,OAAa,SAC3C,QAAQ,eAAe,MAAM,KAAK,IAAI,EAAE,QAAQ;EAAE,GAAG,KAAK,KAAK;EAAQ,OAAO;CAAK,EAAE,CAAC,CAAC;CACzF,MAAM,SAAS,GAAW,MACxB,KAAK,MAAM,KAAK,GAAG,MAAO,MAAM,IAAI;EAAE,GAAG;EAAG,GAAG;CAAE,IAAI,CAAE,CAAC;CAC1D,MAAM,YACJ,KAAK,CAAC,GAAG,OAAO;EAAE,IAAI,WAAW,KAAK;EAAG,OAAO;EAAI,UAAU;EAAS,OAAO;CAAG,CAAC,CAAC;CACrF,MAAM,UAAU,MAAc;EAC5B,MAAM,OAAO,MAAM;EACnB,IAAI,OAAO;EACX,KAAK,MAAM,KAAK,KAAK,OACnB,IAAI,EAAE,WAAW,KAAK,MAAM,EAAE,WAAW,KAAK,IAAI,OAAO,WAAW,MAAM,EAAE,EAAE;EAChF,KACE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,GAC9B,IACF;CACF;CACA,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACG,MAAM,KAAK,MAAM,MAChB,qBAAC,OAAD;IAEE,MAAK;IACL,cAAY,WAAW,MAAM,KAAK,EAAE;IACpC,WAAU;IAJZ,UAAA;KAME,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,oBAAC,QAAD;OAAM,WAAU;OAAuB,UAAA,WAAW,MAAM,KAAK,EAAE;MAAQ,CAAA,GACvE,oBAAC,QAAD;OACE,SAAQ;OACR,MAAK;OACL,UAAA;OACA,cAAY,WAAW,WAAW,MAAM,KAAK,EAAE;OAC/C,WAAU;OACV,MAAM,oBAAC,QAAD,CAAS,CAAA;OACf,eAAe,OAAO,CAAC;MACxB,CAAA,CACE;;KACL,oBAAC,QAAD;MACE,OAAO,kBAAkB,IAAI;MAC7B,aAAY;MACZ,SAAS,aAAa,IAAI;MAC1B,OAAO,KAAK,SAAS;MACrB,WAAW,MAAM,MAAM,GAAG,EAAE,OAAO,KAAK,GAAG,CAAC;KAC7C,CAAA;KACD,oBAAC,QAAD;MACE,OAAO,qBAAqB,IAAI;MAChC,SAAS,oBAAoB,KAAK,OAAO;OAAE,OAAO,EAAE;OAAO,OAAO,EAAE;MAAM,EAAE;MAC5E,OAAO,KAAK;MACZ,WAAW,MAAM;OACf,MAAM,WAAY,KAAK;OACvB,MAAM,GAAG;QAAE;QAAU,GAAI,iBAAiB,QAAQ,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG;OAAG,CAAC;MAC7E;KACD,CAAA;KACA,iBAAiB,KAAK,QAAQ,KAC7B,oBAAC,OAAD;MACE,cAAY,kBAAkB,IAAI;MAClC,aAAY;MACZ,OAAO,KAAK;MACZ,WAAW,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,CAAC;KACvC,CAAA;IAEA;GAzCE,GAAA,KAAK,EAyCP,CACN;GACA,MAAM,WAAW,KAChB,oBAAC,YAAD;IACE,MAAK;IACL,OAAM;IACN,aAAY;GACb,CAAA;GAEH,oBAAC,QAAD;IAAQ,SAAQ;IAAU,MAAK;IAAK,MAAM,oBAAC,MAAD,CAAO,CAAA;IAAG,SAAS;IAAK,UAAA;GAE1D,CAAA;GACR,qBAAC,KAAD;IAAG,WAAU;IAAb,UAAA,CACE,oBAAC,QAAD;KAAM,WAAU;KAAc,UAAA;IAAW,CAAA,GACzC,oBAAC,QAAD;KAAM,WAAU;KAAwB,UAAA;IAAwC,CAAA,CAC/E;;EACA;;AAET;AAIA,SAAS,UAAU,EAAE,YAAqC;CACxD,OACE,oBAAC,OAAD;EAAK,WAAU;EACZ;CACE,CAAA;AAET;AAEA,IAAM,kBAAkB;AAExB,SAAS,gBAAgB,EAAE,KAAK,OAAiB;CAC/C,MAAM,WAAW,IAAI,aAAa;CAClC,MAAM,UAAU,KAAK,IAAI,OAAO;CAChC,MAAM,SAAS,eAAe,mBAAmB;CACjD,MAAM,SAAS,SAAiB,QAAQ,MAAM,MAAM,IAAI,EAAE,IAAI,MAAM,IAAI;CACxE,MAAM,UAAU,MAAc,OAC5B,IAAI,EACF,SAAS,CACP,GAAG,QAAQ,QAAQ,MAAM,IAAI,EAAE,IAAI,MAAM,IAAI,GAC7C,GAAI,KAAK,CAAC;EAAE,MAAM;EAAM;CAAG,CAAC,IAAI,CAAC,CACnC,EACF,CAAC;CACH,MAAM,OAAO,YAAY;EACvB,IAAI;GACF,MAAM,UAAU,UAAU,UAAU,GAAG,kBAAkB,IAAI,IAAI,IAAI,GAAG;GACxE,MAAM,QAAQ,kBAAkB;EAClC,QAAQ;GACN,MAAM,MAAM,oCAAoC;EAClD;CACF;CACA,OACE,oBAAC,MAAD;EACE,SAAQ;EACR,cAAW;EACX,OAAO,CACL;GACE,OAAO;GACP,OAAO;GACP,SACE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,oBAAC,QAAD;OAAQ,SAAQ;OAAU,MAAK;OAAK,eAAe,IAAI,EAAE,UAAU,KAAK,CAAC;OAAG,UAAA;MAEpE,CAAA,GACR,oBAAC,UAAD;OAAU,OAAM;OAAuB,UAAA;MAG7B,CAAA,CACP;;KACJ,CAAC,YACA,oBAAC,YAAD;MACE,MAAK;MACL,OAAM;MACN,aAAY;KACb,CAAA;KAEF,YACC,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,WAAD,EAAA,UAAY,KAAK,UAAU,qBAAqB,MAAM,CAAC,EAAa,CAAA,GACpE,oBAAC,MAAD;MAAI,cAAW;MAAmB,WAAU;MACzC,UAAA,OAAO,KAAK,MACX,qBAAC,MAAD;OAAiB,WAAU;OAA3B,UAAA,CACE,qBAAC,OAAD;QAAK,WAAU;QAAf,UAAA,CACE,oBAAC,QAAD;SAAM,WAAU;SAAe,UAAA,EAAE;QAAW,CAAA,GAC5C,oBAAC,QAAD;SAAM,WAAU;SAAkC,UAAA,EAAE;QAAY,CAAA,CAC7D;OACL,CAAA,GAAA,oBAAC,QAAD;QACE,OAAO,yBAAyB,EAAE;QAClC,aAAY;QACZ,YAAA;QACA,WAAA;QACA,SAAS,mBAAmB,KAAK,OAAO;SACtC,OAAO,EAAE;SACT,OAAO,EAAE;QACX,EAAE;QACF,OAAO,IAAI,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK;QACjC,WAAW,MAAM,OAAO,EAAE,MAAM,CAAC;OAClC,CAAA,CACC;MAjBK,GAAA,EAAE,IAiBP,CACL;KACC,CAAA,CACJ,EAAA,CAAA;IAED;;EAET,GACA;GACE,OAAO;GACP,OAAO;GACP,SACE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,oBAAC,OAAD;MAAO,OAAM;MAAS,MAAK;MACzB,UAAA,oBAAC,QAAD;OACE,OAAM;OACN,SAAS,CAAC,QAAQ,KAAK,CAAC,CAAC,KAAK,OAAO;QAAE,OAAO;QAAG,OAAO;OAAE,EAAE;OAC5D,OAAO,IAAI,IAAI,MAAM,KAAK;OAC1B,WAAW,MAAM,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC;MAC7C,CAAA;KACI,CAAA;KACP,oBAAC,OAAD;MAAO,OAAM;MAAW,MAAK;MAAO,UAAA;MAClC,UAAA,oBAAC,OAAD;OAAO,OAAO,IAAI,IAAI,IAAI;OAAG,WAAW,MAAM,IAAI,EAAE,MAAM,EAAE,CAAC;MAAI,CAAA;KAC5D,CAAA;KACP,oBAAC,QAAD;MAAQ,SAAQ;MAAU,MAAK;MAAK,MAAM,oBAAC,MAAD,CAAO,CAAA;MAAG,eAAe,KAAK,KAAK;MAAG,UAAA;KAExE,CAAA;KACR,oBAAC,OAAD;MAAO,OAAM;MAAqB,MAAK;MACrC,UAAA,oBAAC,QAAD;OACE,OAAM;OACN,SAAS;QACP;SAAE,OAAO;SAAO,OAAO;QAAS;QAChC;SAAE,OAAO;SAAO,OAAO;QAAe;QACtC;SAAE,OAAO;SAAO,OAAO;QAAiB;OAC1C;OACA,OAAO,OAAO,IAAI,gBAAgB,GAAG;OACrC,WAAW,MAAM,IAAI,EAAE,cAAc,OAAO,KAAK,GAAG,EAAE,CAAC;MACxD,CAAA;KACI,CAAA;IACJ;;EAET,CACF;CACD,CAAA;AAEL;AAEA,SAAS,iBAAiB,EAAE,MAAM,KAAK,WAAW,OAAiB;CACjE,MAAM,CAAC,WAAW,gBAAgB,SAAS,KAAK;CAChD,MAAM,OAAO,KAAK,IAAI,IAAI;CAC1B,MAAM,UAAU,KAAK,IAAI,OAAO;CAChC,MAAM,aAAa,GAAW,MAC5B,IAAI,EAAE,MAAM,KAAK,KAAK,GAAG,MAAO,MAAM,IAAI;EAAE,GAAG;EAAG,GAAG;CAAE,IAAI,CAAE,EAAE,CAAC;CAClE,MAAM,eAAe,GAAW,MAC9B,IAAI,EAAE,SAAS,QAAQ,KAAK,GAAG,MAAO,MAAM,IAAI;EAAE,GAAG;EAAG,GAAG;CAAE,IAAI,CAAE,EAAE,CAAC;CACxE,MAAM,UAAU,oBAAoB,KAAK,eAAe,IAAI,CAAC;CAC7D,OACE,oBAAC,MAAD;EACE,SAAQ;EACR,cAAW;EACX,OAAO,CACL;GACE,OAAO;GACP,OAAO;GACP,SACE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACG,KAAK,KAAK,GAAG,MACZ,qBAAC,OAAD;MAEE,MAAK;MACL,cAAY,iBAAiB,IAAI;MACjC,WAAU;MAJZ,UAAA,CAME,qBAAC,OAAD;OAAK,WAAU;OAAf,UAAA,CACE,oBAAC,OAAD;QACE,cAAY,iBAAiB,IAAI;QACjC,aAAY;QACZ,OAAO,IAAI,EAAE,GAAG;QAChB,WAAW,MAAM,UAAU,GAAG,EAAE,KAAK,EAAE,CAAC;OACzC,CAAA,GACD,oBAAC,QAAD;QACE,SAAQ;QACR,MAAK;QACL,UAAA;QACA,cAAY,iBAAiB,IAAI;QACjC,WAAU;QACV,MAAM,oBAAC,QAAD,CAAS,CAAA;QACf,eAAe,IAAI,EAAE,MAAM,KAAK,QAAQ,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC;OAC5D,CAAA,CACE;MACL,CAAA,GAAA,oBAAC,gBAAD;OACE,OAAO,qBAAqB,IAAI;OAChC,OAAO,IAAI,EAAE,KAAK;OACP;OACX,WAAW,UAAU,UAAU,GAAG,EAAE,OAAO,MAAM,CAAC;MACnD,CAAA,CACE;KA5BE,GAAA,CA4BF,CACN;KACD,oBAAC,QAAD;MACE,SAAQ;MACR,MAAK;MACL,MAAM,oBAAC,MAAD,CAAO,CAAA;MACb,eAAe,IAAI,EAAE,MAAM,CAAC,GAAG,MAAM;OAAE,KAAK;OAAI,OAAO;MAAG,CAAC,EAAE,CAAC;MAC/D,UAAA;KAEO,CAAA;KACR,qBAAC,OAAD;MAAK,WAAU;MAAf,UAAA,CACE,oBAAC,QAAD;OAAQ,SAAQ;OAAU,MAAK;OAAK,eAAe,aAAa,IAAI;OAAG,UAAA;MAE/D,CAAA,GACR,oBAAC,UAAD;OAAU,OAAM;OAAqB,UAAA;MAG3B,CAAA,CACP;;KACJ,aACC,qBAAC,OAAD;MAAK,MAAK;MAAS,cAAW;MAAqB,WAAU;MAA7D,UAAA,CACE,oBAAC,WAAD,EAAA,UACG,GAAG,QAAQ,OAAO,GAAG,QAAQ,IAAI,IAAI,KAAK,UAAU,QAAQ,MAAM,MAAM,CAAC,IACjE,CAAA,GACX,oBAAC,WAAD,EAAA,UAAA,gCAA4C,CAAA,CACzC;;IAEJ;;EAET,GACA;GACE,OAAO;GACP,OAAO;GACP,SACE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACE,oBAAC,OAAD;MAAO,OAAM;MAAS,MAAK;MACzB,UAAA,oBAAC,QAAD;OACE,OAAM;OACN,SAAS;QAAC;QAAQ;QAAO;OAAO,CAAC,CAAC,KAAK,OAAO;QAAE,OAAO;QAAG,OAAO;OAAE,EAAE;OACrE,OAAO,IAAI,IAAI,MAAM,KAAK;OAC1B,WAAW,MAAM,IAAI,EAAE,QAAQ,KAAK,OAAO,CAAC;MAC7C,CAAA;KACI,CAAA;KACP,oBAAC,OAAD;MAAO,OAAM;MAAW,MAAK;MAAO,UAAA;MAClC,UAAA,oBAAC,OAAD;OAAO,OAAO,IAAI,IAAI,GAAG;OAAG,WAAW,MAAM,IAAI,EAAE,KAAK,EAAE,CAAC;MAAI,CAAA;KAC1D,CAAA;KACN,QAAQ,KAAK,GAAG,MACf,qBAAC,OAAD;MAEE,MAAK;MACL,cAAY,aAAa,IAAI;MAC7B,WAAU;MAJZ,UAAA,CAME,oBAAC,OAAD;OACE,cAAY,qBAAqB,IAAI;OACrC,aAAY;OACZ,OAAO,IAAI,EAAE,IAAI;OACjB,WAAW,MAAM,YAAY,GAAG,EAAE,MAAM,EAAE,CAAC;MAC5C,CAAA,GACD,qBAAC,OAAD;OAAK,WAAU;OAAf,UAAA,CACE,oBAAC,OAAD;QACE,cAAY,sBAAsB,IAAI;QACtC,aAAY;QACZ,OAAO,IAAI,EAAE,KAAK;QAClB,WAAW,MAAM,YAAY,GAAG,EAAE,OAAO,EAAE,CAAC;OAC7C,CAAA,GACD,oBAAC,QAAD;QACE,SAAQ;QACR,MAAK;QACL,UAAA;QACA,cAAY,qBAAqB,IAAI;QACrC,WAAU;QACV,MAAM,oBAAC,QAAD,CAAS,CAAA;QACf,eAAe,IAAI,EAAE,SAAS,QAAQ,QAAQ,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC;OAClE,CAAA,CACE;MACF,CAAA,CAAA;KA5BE,GAAA,CA4BF,CACN;KACD,oBAAC,QAAD;MACE,SAAQ;MACR,MAAK;MACL,MAAM,oBAAC,MAAD,CAAO,CAAA;MACb,eAAe,IAAI,EAAE,SAAS,CAAC,GAAG,SAAS;OAAE,MAAM;OAAI,OAAO;MAAG,CAAC,EAAE,CAAC;MACtE,UAAA;KAEO,CAAA;IACL;;EAET,CACF;CACD,CAAA;AAEL;AAIA,SAAS,WAAW,EAClB,MACA,MACA,WAKC;CACD,MAAM,UAA0B,CAC9B;EAAE,OAAO;EAAM,OAAO;CAAS,GAC/B,GAAG,eAAe,MAAM,KAAK,EAAE,CAAC,CAAC,KAAK,OAAO;EAC3C,OAAO,EAAE;EACT,OAAO,GAAG,eAAe,EAAE,MAAM,IAAI,SAAS,CAAC;CACjD,EAAE,CACJ;CACA,OACE,oBAAC,OAAD;EAAK,WAAU;EACZ,UAAA,UAAU,IAAI,CAAC,CAAC,KAAK,QAAQ;GAC5B,MAAM,QAAQ,MAAM,kBAAkB,WAAW,MAAM,GAAG,MAAM;GAChE,MAAM,UAAU,KAAK,MAAM,MACxB,MAAM,EAAE,WAAW,KAAK,OAAO,EAAE,UAAU,KAAA,OAAe,GAC7D;GACA,OACE,oBAAC,OAAD;IAAmC;IAAO,MAAK;IAC7C,UAAA,oBAAC,QAAD;KACS;KACE;KACT,OAAO,SAAS,UAAU;KAC1B,WAAW,MAAM;MACf,IAAI,CAAC,KAAK,MAAM,MAAM,OAAO,QAAQ,YAAY,MAAM,KAAK,IAAI,GAAG,CAAC;MACpE,MAAM,IAAI,aAAa,MAAM,KAAK,IAAI,GAAG,GAAG;MAC5C,IAAI,CAAC,EAAE,IAAI,OAAO,QAAQ,MAAM,EAAE,MAAM;MACxC,QAAQ,EAAE,MAAM,EAAE,WAAW,gBAAgB,MAAM,EAAE,QAAQ,IAAI,KAAA,CAAS;KAC5E;IACD,CAAA;GACI,GAZK,OAAO,OAYZ;EAEX,CAAC;CACE,CAAA;AAET;AAIA,SAAgB,iBAAiB,EAAE,MAAM,QAAQ,SAAS,WAAkC;CAC1F,MAAM,MAAM,MAAM;CAClB,MAAM,OAAO,KAAK,MAAM,MAAM,MAAM,EAAE,OAAO,MAAM;CACnD,IAAI,CAAC,MAAM,OAAO;CAClB,MAAM,MAAW,KAAK,KAAK,UAAU,CAAC;CACtC,MAAM,YAAY,cAAc,IAAI;CACpC,MAAM,OAAO,UACX,QAAQ,eAAe,MAAM,KAAK,IAAI,EAAE,QAAQ;EAAE,GAAG;EAAK,GAAG;CAAM,EAAE,CAAC,CAAC;CACzE,MAAM,MAAgB;EAAE;EAAM;EAAM;EAAK;EAAW;CAAI;CACxD,MAAM,KAAK,KAAa,OAAe,OAAgC,CAAC,MACtE,oBAAC,eAAD;EAES;EACP,WAAW,KAAK;EAChB,OAAO,IAAI,IAAI,IAAI;EACR;EACX,WAAW,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC;CAClC,GANM,GAAG,IAAI,GAAG,KAMhB;CAGH,IAAI,SAAoB;CACxB,QAAQ,KAAK,MAAb;EACE,KAAK;GACH,SAAS,oBAAC,iBAAD,EAAiB,GAAI,IAAM,CAAA;GACpC;EACF,KAAK;GACH,SAAS,oBAAC,kBAAD,EAAkB,GAAI,IAAM,CAAA;GACrC;EACF,KAAK;GACH,SACE,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,OAAD;IAAO,OAAM;IAAa,MAAK;IAC7B,UAAA,oBAAC,QAAD;KACE,OAAM;KACN,SAAS;MACP;OAAE,OAAO;OAAU,OAAO;MAAS;MACnC;OAAE,OAAO;OAAW,OAAO;MAAU;MACrC;OAAE,OAAO;OAAU,OAAO;MAAS;KACrC;KACA,OAAO,IAAI,IAAI,SAAS,KAAK;KAC7B,WAAW,MAAM,IAAI,EAAE,WAAW,KAAK,SAAS,CAAC;IAClD,CAAA;GACI,CAAA,GACP,oBAAC,OAAD;IAAO,OAAM;IAAU,MAAK;IAAO,UAAA;IACjC,UAAA,oBAAC,OAAD;KAAO,MAAK;KAAO,OAAO,IAAI,IAAI,IAAI;KAAG,WAAW,MAAM,IAAI,EAAE,MAAM,EAAE,CAAC;IAAI,CAAA;GACxE,CAAA,CACP,EAAA,CAAA;GAEJ;EACF,KAAK;GACH,SACE,oBAAC,YAAD;IACE,cAAW;IACX,SAAS;KACP;MAAE,OAAO;MAAW,OAAO;KAAU;KACrC;MAAE,OAAO;MAAU,OAAO;KAAS;KACnC;MAAE,OAAO;MAAW,OAAO;KAAU;IACvC;IACA,OAAO,IAAI,IAAI,MAAM,KAAK;IAC1B,WAAW,MAAM,IAAI,EAAE,QAAQ,EAAE,CAAC;GACnC,CAAA;GAEH;EACF,KAAK;GACH,SACE,qBAAA,YAAA,EAAA,UAAA,CACG,EAAE,MAAM,MAAM,GACd,EAAE,WAAW,YAAY,EAAE,WAAW,KAAK,CAAC,CAC7C,EAAA,CAAA;GAEJ;EACF,KAAK;GACH,SACE,qBAAA,YAAA,EAAA,UAAA;IACG,EAAE,MAAM,MAAM;IACd,EAAE,WAAW,SAAS;IACtB,EAAE,WAAW,YAAY,EAAE,WAAW,KAAK,CAAC;GAC7C,EAAA,CAAA;GAEJ;EACF,KAAK;GACH,SACE,qBAAA,YAAA,EAAA,UAAA;IACG,EAAE,SAAS,QAAQ;IACpB,oBAAC,OAAD;KAAO,OAAM;KAAc,MAAK;KAC9B,UAAA,oBAAC,OAAD;MAAO,OAAO,IAAI,IAAI,QAAQ;MAAG,WAAW,MAAM,IAAI,EAAE,UAAU,EAAE,CAAC;KAAI,CAAA;IACpE,CAAA;IACP,oBAAC,OAAD;KAAO,OAAM;KAAgB,MAAK;KAChC,UAAA,oBAAC,OAAD;MACE,WAAU;MACV,OAAO,OAAO,IAAI,WAAW,EAAE;MAC/B,WAAW,MAAM,IAAI,EAAE,SAAS,OAAO,EAAE,QAAQ,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC;KACpE,CAAA;IACI,CAAA;GACP,EAAA,CAAA;GAEJ;EACF,KAAK;GACH,SACE,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,OAAD;IACE,OAAM;IACN,MAAK;IACL,OACE,OAAO,IAAI,aAAa,YAAY,IAAI,WAAW,IAC/C,KAAA,IACA;IAGN,UAAA,oBAAC,OAAD;KACE,WAAU;KACV,OAAO,IAAI,aAAa,KAAA,IAAY,KAAK,OAAO,IAAI,QAAQ;KAC5D,WAAW,MAAM,IAAI,EAAE,UAAU,OAAO,EAAE,QAAQ,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC;IACrE,CAAA;GACI,CAAA,GACP,oBAAC,OAAD;IAAO,OAAM;IAAU,MAAK;IAC1B,UAAA,oBAAC,QAAD;KACE,OAAM;KACN,SAAS,gBAAgB,KAAK,OAAO;MAAE,OAAO;MAAG,OAAO;KAAE,EAAE;KAC5D,OAAO,IAAI,IAAI,IAAI,KAAK;KACxB,WAAW,MAAM,IAAI,EAAE,MAAM,KAAK,UAAU,CAAC;IAC9C,CAAA;GACI,CAAA,CACP,EAAA,CAAA;GAEJ;EACF,KAAK,YACH,SAAS,oBAAC,iBAAD;GAAiB,GAAI;GAAc;EAAU,CAAA;CAI1D;CAEA,OACE,qBAAC,gBAAD;EACE,OAAO,YAAY,KAAK,KAAK,CAAC;EACrB;EACT,YAAW;EAHb,UAAA;GAKE,oBAAC,OAAD;IAAO,OAAM;IAAgB,MAAK;IAChC,UAAA,oBAAC,OAAD;KACE,OAAO,KAAK,KAAK;KACjB,WAAW,MAAM,QAAQ,eAAe,MAAM,KAAK,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACrE,CAAA;GACI,CAAA;GACN;GACD,qBAAC,WAAD;IAAS,cAAW;IAAW,WAAU;IAAzC,UAAA,CACE,oBAAC,MAAD;KAAI,WAAU;KAA4C,UAAA;IAAY,CAAA,GACtE,oBAAC,YAAD;KAAkB;KAAY;KAAe;IAAU,CAAA,CAChD;;EACK;;AAEpB;;;AC3qBA,SAAgB,kBAAmC;CACjD,OAAO;EAAE,QAAQ;EAAQ,OAAO,CAAC;EAAG,WAAW;EAAM,QAAQ,CAAC;CAAE;AAClE;;AAGA,SAAgB,gBAAgB,OAA8B;CAC5D,MAAM,OAAO,YAAY,KAAK;CAC9B,MAAM,SAAS,aAAa,IAAI;CAChC,IAAI,OAAO,SAAS,GAAG,OAAO;EAAE,QAAQ;EAAS,OAAO,CAAC;EAAG,WAAW;EAAM;CAAO;CAEpF,OAAO;EAAE,QAAQ;EAAW,OAAO,CAAC;EAAG,WADvB,KAAK,MAAM,MAAM,MAAM,UAAU,EAAE,IAAI,CACL,CAAA,CAAQ;EAAI,QAAQ,CAAC;CAAE;AAC3E;;AAGA,SAAgB,aAAa,MAAgB,MAAuC;CAClF,MAAM,SAAS,KAAK,KAAK,UAAU;CACnC,MAAM,SAAS,KAAK;CACpB,QAAQ,KAAK,UAAb;EACE,KAAK,SACH,OAAO,WAAW;EACpB,KAAK,aACH,OAAO,WAAW;EACpB,KAAK;EACL,KAAK,SAAS;GACZ,MAAM,IAAI,OAAO,MAAM;GACvB,MAAM,IAAI,OAAO,MAAM;GACvB,IAAI,OAAO,KAAK,MAAM,MAAM,OAAO,KAAK,MAAM,MAAM,OAAO,MAAM,CAAC,KAAK,OAAO,MAAM,CAAC,GACnF,OAAO;GACT,OAAO,KAAK,aAAa,UAAU,IAAI,IAAI,IAAI;EACjD;EACA,KAAK,UACH,OAAO,OAAO,SAAS,MAAM;EAC/B,KAAK,SACH,OAAO,WAAW;EACpB,KAAK,aACH,OAAO,WAAW;CACtB;AACF;AAEA,IAAM,YAAoC;CACxC,QAAQ;CACR,SAAS;CACT,QAAQ;AACV;;AAGA,SAAS,YAAY,MAAgB,MAA8B;CACjE,MAAM,QAAQ,QAAQ,IAAI;CAC1B,MAAM,QAAQ,MAAM,WAAW,MAAM,aAAa,GAAG,IAAI,CAAC;CAC1D,OAAO;EAAE,MAAM,QAAQ,IAAI,OAAO,MAAM;EAAS;CAAM;AACzD;AAEA,SAAS,gBAAgB,MAAgB,MAA8B;CACrE,MAAM,EAAE,MAAM,UAAU,YAAY,MAAM,IAAI;CAC9C,OAAO,OACH,SAAS,QAAQ,EAAE,UAAU,YAAY,IAAI,EAAE,oBAC/C;AACN;AAEA,SAAS,YAAY,MAAgB,MAAsC;CACzE,MAAM,IAAI,KAAK,KAAK;CACpB,QAAQ,KAAK,MAAb;EACE,KAAK,mBACH,OAAO,aAAa,IAAI,GAAG,MAAM,KAAK,OAAO,MAAM,IAAI,GAAG,IAAI;EAChE,KAAK,eACH,OAAO,aAAa,UAAU,IAAI,GAAG,SAAS,MAAM,GAAG,MAAM,IAAI,GAAG,IAAI,IAAI,QAAQ,MAAM,GAAG;EAC/F,KAAK,mBACH,OAAO,wBAAwB,aAAa,IAAI,GAAG,MAAM,MAAM,WAAA,CAAY,YAAY,EAAE;EAC3F,KAAK,YACH,OAAO,0BAA0B,eAAe,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,KAAK,eAAe,IAAI,GAAG,OAAO,GAAG,IAAI,EAAE;EAC/G,KAAK,SACH,OAAO,wBAAwB,eAAe,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE,aAAa,eAAe,IAAI,GAAG,OAAO,GAAG,IAAI,EAAE,MAAM,eAAe,IAAI,GAAG,OAAO,GAAG,IAAI,EAAE;EACjK,KAAK,UACH,OAAO,aAAa,CAAC;EACvB,KAAK,iBAAiB;GACpB,MAAM,IAAI,oBAAoB,GAAG,IAAI;GACrC,OAAO,YAAY,EAAE,OAAO,GAAG,EAAE,IAAI,OAAO,KAAK,UAAU,EAAE,IAAI;EACnE;EACA,KAAK,UAAU;GACb,MAAM,OAAO,OAAO,GAAG,YAAY,WAAW,EAAE,UAAU;GAC1D,OAAO,qBAAqB,eAAe,IAAI,GAAG,KAAK,GAAG,IAAI,EAAE,SAAS,IAAI,GAAG,QAAQ,KAAK,UAAU,gBAAgB,KAAK,GAAG,SAAS,IAAI,QAAQ;EACtJ;EACA,KAAK,YACH,OAAO,gBAAgB,MAAM,IAAI;EACnC,SACE,OAAO;CACX;AACF;AAEA,IAAM,UAAU,MAAgB,YAAoC;CAClE,QAAQ,KAAK;CACb,MAAM,KAAK;CACX,OAAO,SAAS,IAAI;CACpB,QAAQ;CACR;AACF;;AAGA,SAAgB,cAAc,OAAa,QAAuC;CAChF,MAAM,OAAO,YAAY,KAAK;CAC9B,MAAM,OAAO,KAAK,MAAM,MAAM,MAAM,EAAE,OAAO,MAAM;CACnD,OAAO,OAAO,OAAO,MAAM,YAAY,MAAM,eAAe,IAAI,CAAC,CAAC,IAAI;AACxE;;AAGA,SAAgB,kBAAkB,OAAa,OAAyC;CACtF,IAAI,MAAM,WAAW,aAAa,CAAC,MAAM,WAAW,OAAO;CAC3D,MAAM,OAAO,YAAY,KAAK;CAC9B,MAAM,OAAO,KAAK,MAAM,MAAM,MAAM,EAAE,OAAO,MAAM,SAAS;CAC5D,MAAM,cAA+B;EACnC,GAAG;EACH,QAAQ;EACR,WAAW;EACX,QAAQ,CACN;GACE,MAAM;GACN,SAAS;EACX,CACF;CACF;CACA,IAAI,CAAC,MAAM,OAAO,KAAK;CAEvB,MAAM,OAAO,eAAe,IAAI;CAChC,IAAI;CACJ,IAAI,KAAK,SAAS,YAAY,SAAS,YAAY,MAAM,IAAI,CAAC,CAAC,MAAM,MAAM;CAC3E,MAAM,OAAO,KAAK,MAAM,MAAM,MAAM,EAAE,WAAW,KAAK,OAAO,EAAE,UAAU,KAAA,OAAe,MAAM;CAC9F,MAAM,SAAS,OAAO,KAAK,MAAM,MAAM,MAAM,EAAE,OAAO,KAAK,MAAM,IAAI,KAAA;CACrE,IAAI,QAAQ,CAAC,QAAQ,OAAO,KAAK;CAEjC,MAAM,SAAS,YAAY,MAAM,IAAI;CACrC,MAAM,OAAO,OAAO,MAAM,SAAS,SAAS,GAAG,OAAO,oBAAoB;CAC1E,MAAM,QAAQ,CAAC,GAAG,MAAM,OAAO,IAAI;CACnC,IAAI,CAAC,QAAQ,OAAO;EAAE,QAAQ;EAAY;EAAO,WAAW;EAAM,QAAQ,CAAC;CAAE;CAC7E,OAAO;EAAE,QAAQ;EAAW;EAAO,WAAW,OAAO;EAAI,QAAQ,CAAC;CAAE;AACtE;;;AC5JA,SAAS,UAAU,EACjB,MACA,QACA,eAKC;CACD,OACE,oBAAC,MAAD;EAAI,WAAU;EACX,UAAA,OAAO,KAAK,GAAG,MAAM;GACpB,MAAM,OAAO,KAAK,MAAM,MAAM,MAAM,EAAE,OAAO,EAAE,MAAM;GACrD,OACE,qBAAC,MAAD;IAEE,WAAU;IAFZ,UAAA,CAIE,oBAAC,QAAD,EAAA,UAAO,EAAE,QAAc,CAAA,GACtB,EAAE,UACD,oBAAC,QAAD;KACE,MAAK;KACL,SAAQ;KACR,cAAY,aAAa,OAAO,SAAS,IAAI,IAAI,EAAE;KACnD,eAAe,YAAY,EAAE,MAAO;KACrC,UAAA;IAEO,CAAA,CAER;GAdG,GAAA,GAAG,EAAE,KAAK,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,GAc7C;EAER,CAAC;CACC,CAAA;AAER;AAaA,SAAgB,oBAAoB,EAClC,MACA,KACA,WACA,OACA,SACA,eAC2B;CAE3B,MAAM,UADQ,IAAI,MAAM,WAAW,KAAK,YAAY,CAAC,SAAS,IAAI,IAAI,MAAA,CAChC,KAAK,GAAG,OAAO;EACnD,IAAI,GAAG,EAAE,GAAG,EAAE;EACd,OAAO,EAAE;EACT,aAAa,EAAE;EACf,MAAM,aAAa,IAAI,MAAM,WAAW,IAAI,kBAAkB,SAAS,IAAI;EAC3E,QAAQ,EAAE;CACZ,EAAE;CACF,OACE,qBAAC,gBAAD;EAAgB,OAAM;EAA0B;EAAS,YAAW;EAApE,UAAA;GACE,oBAAC,WAAD;IACE,SAAS;KACP,OAAO;KACP,UAAU,IAAI,WAAW;KACzB,eAAe,MAAM,kBAAkB,MAAM,GAAG,CAAC;IACnD;IACA,QAAQ;KAAE,OAAO;KAAa,eAAe,MAAM,gBAAgB,IAAI,CAAC;IAAE;GAC3E,CAAA;GACA,IAAI,WAAW,WACd,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,oBAAC,OAAD;KAAO,MAAK;KAAQ,OAAM;IAA6C,CAAA,GACvE,oBAAC,WAAD;KAAiB;KAAM,QAAQ,IAAI;KAAqB;IAAc,CAAA,CACnE;;GAEN,IAAI,WAAW,cACd,qBAAC,KAAD;IACE,MAAK;IACL,WAAU;IAFZ,UAAA,CAIE,oBAAC,cAAD;KAAc,WAAU;KAAe,eAAA;IAAa,CAAA,GAAC,iBAEpD;;GAEJ,OAAO,SAAS,KAAK,oBAAC,UAAD,EAAkB,OAAS,CAAA;GAChD,OAAO,WAAW,KAAK,IAAI,WAAW,WACrC,oBAAC,KAAD;IAAG,WAAU;IAAgC,UAAA;GAAgC,CAAA;EAEjE;;AAEpB;AASA,SAAgB,oBAAoB,EAClC,MACA,QACA,SACA,eAC2B;CAC3B,OACE,oBAAC,gBAAD;EAAgB,OAAM;EAA8B;EAAS,YAAW;EACtE,UAAA,oBAAC,OAAD;GAAK,aAAU;GAAS,WAAU;GAC/B,UAAA,OAAO,WAAW,IACjB,oBAAC,OAAD;IAAO,MAAK;IAAU,OAAM;GAAgB,CAAA,IAE5C,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,OAAD;IACE,MAAK;IACL,OACE,OAAO,WAAW,IACd,0BACA,GAAG,OAAO,OAAO;GAExB,CAAA,GACD,oBAAC,WAAD;IAAiB;IAAc;IAAqB;GAAc,CAAA,CAClE,EAAA,CAAA;EAED,CAAA;CACS,CAAA;AAEpB;;;ACjDA,IAAM,aAAa;AACnB,IAAM,WAAW;;AAGjB,SAAS,WAAW,MAAoB,MAAkC;CACxE,MAAM,MAAM,IAAI,IAAI,KAAK,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;CAC9C,OAAO,KAAK,KAAK,MAAM;EACrB,MAAM,IAAI,IAAI,IAAI,EAAE,EAAE;EACtB,IAAI,CAAC,GAAG,OAAO;EACf,MAAM,IAAI,EAAE;EACZ,MAAM,IAAI,EAAE;EAYZ,IAVE,CAAC,EAAE,YACH,EAAE,SAAS,MAAM,EAAE,SAAS,KAC5B,EAAE,SAAS,MAAM,EAAE,SAAS,KAC5B,EAAE,cAAc,EAAE,aAClB,EAAE,UAAU,EAAE,SACd,EAAE,SAAS,EAAE,QACb,EAAE,WAAW,EAAE,UACf,EAAE,WAAW,EAAE,UACf,EAAE,OAAO,WAAW,EAAE,OAAO,UAC7B,EAAE,OAAO,OAAO,GAAG,MAAM,MAAM,EAAE,OAAO,EAAE,GAClC,OAAO;EACjB,OAAO;GAAE,GAAG;GAAG,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE;GAAU,WAAW,EAAE;GAAW,MAAM;EAAE;CACjG,CAAC;AACH;AAEA,SAAS,WAAW,MAAc,MAAsB;CACtD,MAAM,MAAM,IAAI,IAAI,KAAK,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;CAC9C,OAAO,KAAK,KAAK,MAAM;EACrB,MAAM,IAAI,IAAI,IAAI,EAAE,EAAE;EACtB,IAAI,CAAC,GAAG,OAAO;EAOf,OALE,EAAE,WAAW,EAAE,UACf,EAAE,WAAW,EAAE,UACf,EAAE,iBAAiB,EAAE,gBACrB,EAAE,cAAc,EAAE,aAClB,EAAE,MAAM,UAAU,EAAE,MAAM,QACd,IAAI;GAAE,GAAG;GAAG,GAAG;EAAE;CACjC,CAAC;AACH;;;;;;AAgBA,SAAS,iBAAiB,EAAE,MAAM,QAAQ,SAAS,aAAoC;CACrF,MAAM,OAAO,KAAK,MAAM,MAAM,MAAM,EAAE,OAAO,MAAM;CACnD,MAAM,CAAC,MAAM,WAAW,SAAqB,SAAS;CACtD,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAC5C,MAAM,CAAC,OAAO,YAAY,SAAS,EAAE;CACrC,MAAM,CAAC,OAAO,YAAY,SAAS,KAAK;CACxC,MAAM,WAAW,OAAO,KAAK;CAC7B,IAAI,CAAC,MAAM,OAAO;CAClB,MAAM,QAAQ,kBAAkB,MAAM,KAAK,EAAE;CAC7C,MAAM,QAAQ,MAAM,eAAe;CACnC,MAAM,WAAW,SAAS,YAAY,UAAU,MAAM,KAAK,CAAC,CAAC,YAAY,MAAM;CAC/E,MAAM,QAAQ,OAAgC,UAC5C,MAAM,WAAW,IACf,oBAAC,QAAD;EAAM,WAAU;EAAyB,UAAA;CAAY,CAAA,IAErD,oBAAC,MAAD;EAAI,WAAU;EACX,UAAA,MAAM,KAAK,MACV,qBAAC,MAAD,EAAA,UAAA,CACG,SAAS,EAAE,IAAI,GACf,EAAE,QAAQ,qBAAC,QAAD;GAAM,WAAU;GAAhB,UAAA;IAAwC;IAAS,EAAE;IAAM;GAAO;EAAI,CAAA,IAAA,IAC7E,EAAA,GAHK,EAAE,KAAK,EAGZ,CACL;CACC,CAAA;CAER,OACE,oBAAC,OAAD;EACE,MAAA;EACA,MAAK;EACL,MAAK;EACL,OAAM;EACN,aACE,SAAS,IAAI,MAAM,eAAe,KAAK,QACnC,SAAS,IAAI,IACb,GAAG,eAAe,KAAK,MAAM,IAAI,SAAS,IAAI;EAEpD,cAAa;EACb,eAAe,SAAS;GACtB,IAAI,MAAM;GAEV,IAAI,SAAS,SAAS;IACpB,SAAS,UAAU;IACnB;GACF;GACA,QAAQ;EACV;EACA,iBAAiB;GACf,IAAI,CAAC,UAAU;IACb,SAAS,UAAU;IACnB,SAAS,IAAI;IACb;GACF;GACA,UAAU,IAAI;EAChB;EAEA,UAAA,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,oBAAC,KAAD;KAAG,WAAU;KAAyB,UAAA,YAAY,KAAK,KAAK,CAAC;IAAe,CAAA;IAC5E,qBAAC,MAAD;KAAI,WAAU;KAAd,UAAA,CACE,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,MAAD;MAAI,WAAU;MAAgC,UAAA;KAAoB,CAAA,GAClE,oBAAC,MAAD,EAAA,UAAK,KAAK,MAAM,YAAY,oBAAoB,EAAM,CAAA,CACnD,EAAA,CAAA,GACL,qBAAC,OAAD,EAAA,UAAA,CACE,oBAAC,MAAD;MAAI,WAAU;MAAgC,UAAA;KAAmB,CAAA,GACjE,oBAAC,MAAD,EAAA,UAAK,KAAK,MAAM,aAAa,qBAAqB,EAAM,CAAA,CACrD,EAAA,CAAA,CACH;;IACJ,oBAAC,YAAD;KACE,cAAW;KACX,OAAO;KACP,WAAW,MAAM;MACf,QAAQ,CAAe;MACvB,SAAS,KAAK;KAChB;KACA,SAAS,CACP;MAAE,OAAO;MAAW,OAAO;KAAwB,GACnD;MACE,OAAO;MACP,OAAO,oDAAoD,MAAM,GAAG,UAAU,IAAI,UAAU,SAAS;KACvG,CACF;IACD,CAAA;IACA,SAAS,YACR,oBAAC,UAAD;KACW;KACT,kBAAkB,MAAM;MACtB,WAAW,MAAM,IAAI;MACrB,SAAS,KAAK;KAChB;KACA,OAAM;IACP,CAAA,IAED,oBAAC,OAAD;KAAO,OAAM;KAA+B,MAAK;KAC/C,UAAA,oBAAC,OAAD;MACE,OAAO;MACP,WAAW,MAAM;OACf,SAAS,CAAC;OACV,SAAS,KAAK;MAChB;KACD,CAAA;IACI,CAAA;IAER,SACC,oBAAC,KAAD;KAAG,MAAK;KAAQ,WAAU;KACvB,UAAA,SAAS,YACN,0CACA;IACH,CAAA;GAEF;;CACA,CAAA;AAEX;AAMA,SAAS,gBAAgB,EACvB,OACA,UACA,WAAW,OACX,UAAU,MACV,UAAU,cACV,kBACA,aACkB;CAClB,MAAM,EAAE,aAAa,cAAc;CACnC,MAAM,UAAU,CAAC;CACjB,MAAM,WAAW,WAAW,CAAC;CAC7B,MAAM,EAAE,sBAAsB,YAAY,aAAa;CACvD,MAAM,sBAAsB,uBAAuB;CACnD,MAAM,UAAU,cAA8B;CAC9C,MAAM,YAAY,OAAuB,IAAI;CAC7C,MAAM,WAAW,MAAM;CAGvB,MAAM,OAAO,cAAc,YAAY,KAAK,GAAG,CAAC,KAAK,CAAC;CACtD,MAAM,UAAU,OAAO,IAAI;CAC3B,QAAQ,UAAU;CAClB,MAAM,WAAW,uBAAO,IAAI,IAAY,CAAC;CACzC,KAAK,MAAM,SAAS,MAAM,SAAS,QAAQ,IAAI,EAAE,EAAE,CAAC;CAEpD,MAAM,CAAC,MAAM,WAAW,SAAe,QAAQ;CAC/C,MAAM,CAAC,UAAU,eAAe,SAAwB,IAAI;CAC5D,MAAM,CAAC,WAAW,gBAAgB,SAAS,KAAK;CAChD,MAAM,WAAW,gBAAgB;CACjC,MAAM,CAAC,KAAK,UAAU,SAA0B,eAAe;CAC/D,MAAM,CAAC,WAAW,gBAAgB,SAAgC,IAAI;CACtE,MAAM,eAAe,OAA8B,IAAI;CACvD,aAAa,UAAU;CACvB,MAAM,CAAC,WAAW,gBAAgB,SAAS,KAAK;CAChD,MAAM,CAAC,QAAQ,aAAa,SAAwB,IAAI;CACxD,MAAM,CAAC,YAAY,iBAAiB,SAAS,KAAK;CAClD,MAAM,CAAC,UAAU,eAAe,SAAwB,IAAI;CAC5D,MAAM,cAAc,OAAsB,IAAI;CAC9C,YAAY,UAAU;CACtB,MAAM,CAAC,MAAM,WAAW,SAKd,IAAI;CACd,MAAM,gBAAgB,OAAO,KAAK;CAElC,MAAM,SAAS,cAAc,aAAa,IAAI,GAAG,CAAC,IAAI,CAAC;CACvD,MAAM,cAAc,YAAY,SAAS,KAAA;CACzC,MAAM,WAAW,IAAI,WAAW,YAAY,IAAI,YAAY;CAC5D,MAAM,aAAa,WAAW,KAAK,MAAM,MAAM,MAAM,EAAE,OAAO,QAAQ,IAAI,KAAA;CAE1E,MAAM,cAAc,aACjB,SAAkB;EACjB,aAAa,IAAI;EACjB,mBAAmB,IAAI;CACzB,GACA,CAAC,gBAAgB,CACnB;CAIA,MAAM,YAAY,cACV,UAAU,MAAM;EAAE;EAAU,QAAQ;CAAY,CAAC,GACvD;EAAC;EAAM;EAAU;CAAW,CAC9B;CACA,MAAM,YAAY,cAAc,UAAU,IAAI,GAAG,CAAC,IAAI,CAAC;CACvD,MAAM,CAAC,SAAS,cAAc,SAAuB,SAAS;CAC9D,MAAM,CAAC,SAAS,cAAc,SAAiB,SAAS;CACxD,gBAAgB,YAAY,SAAS,WAAW,MAAM,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;CAC9E,gBAAgB,YAAY,SAAS,WAAW,MAAM,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;CAG9E,MAAM,UAAU,KAAK,MAClB,QAAQ,MAAM,EAAE,SAAS,UAAU,CAAC,CACpC,KACE,MACC,GAAG,EAAE,GAAG,GAAG,QAAQ,CAAC,CAAC,CAClB,KAAK,MAAM,EAAE,EAAE,CAAC,CAChB,KAAK,GAAG,GACf,CAAC,CACA,KAAK,GAAG;CACX,gBAAgB;EACd,KAAK,MAAM,QAAQ,QAAQ,MAAM,GAAG,GAAG,IAAI,MAAM,oBAAoB,KAAK,MAAM,GAAG,CAAC,CAAC,EAAG;CAC1F,GAAG,CAAC,SAAS,mBAAmB,CAAC;CAEjC,MAAM,OAAO,aACV,MAAY,YAAqB;EAChC,UAAU,WAAW,IAAI;EACzB,SAAS,IAAI;CACf,GACA,CAAC,QAAQ,CACX;CAEA,MAAM,cAAc,aACjB,UAAgE;EAC/D,IAAI,OAAO,QAAQ;EACnB,KAAK,MAAM,KAAK,OAAO;GACrB,MAAM,MAAM,KAAK,MAAM,MAAM,MAAM,EAAE,OAAO,EAAE,EAAE;GAChD,IAAI,QAAQ,IAAI,SAAS,MAAM,EAAE,SAAS,KAAK,IAAI,SAAS,MAAM,EAAE,SAAS,IAC3E,OAAO,SAAS,MAAM,EAAE,IAAI,EAAE,QAAQ;EAC1C;EACA,IAAI,SAAS,QAAQ,SAAS,KAAK,IAAI;CACzC,GACA,CAAC,IAAI,CACP;CAEA,MAAM,gBAAgB,aACnB,YAAsC;EACrC,YAAY,QACV,iBACE,QAAQ,QAAQ,MAAM,EAAE,SAAS,QAAQ,GACzC,GACF,CACF;EACA,MAAM,QAAQ,QAAQ,SAAS,MAC7B,EAAE,SAAS,cAAc,EAAE,aAAa,SAAS,EAAE,WAC/C,CAAC;GAAE,IAAI,EAAE;GAAI,UAAU,EAAE;EAAS,CAAC,IACnC,CAAC,CACP;EACA,IAAI,MAAM,SAAS,KAAK,UAAU,YAAY,KAAK;CACrD,GACA,CAAC,UAAU,WAAW,CACxB;CACA,MAAM,gBAAgB,aACnB,YACC,YAAY,QACV,iBACE,QAAQ,QAAQ,MAAM,EAAE,SAAS,QAAQ,GACzC,GACF,CACF,GACF,CAAC,CACH;;CAGA,MAAM,UAAU,aACb,QAAgB,QAAgB,WAAoB;EACnD,MAAM,IAAI,aAAa,QAAQ,SAAS,QAAQ,QAAQ,MAAM;EAC9D,IAAI,CAAC,EAAE,IAAI,UAAU,EAAE,MAAM;OACxB,KAAK,EAAE,MAAM,EAAE,WAAW,gBAAgB,QAAQ,SAAS,EAAE,QAAQ,IAAI,KAAA,CAAS;CACzF,GACA,CAAC,IAAI,CACP;CAEA,MAAM,YAAY,aACf,MAAkB;EACjB,IAAI,EAAE,UAAU,EAAE,QAAQ,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,KAAA,CAAS;CACnF,GACA,CAAC,OAAO,CACV;;CAGA,MAAM,eAAe,aAClB,OAAgC,UAAgC;EAC/D,IAAI,MAAM,WAAW,CAAC,MAAM,YAAY,MAAM,YAAY,SAAS,UAAU;EAC7E,IAAI,KAAK,MAAM,QAAQ;EACvB,IAAI,CAAC,MAAM,OAAO,SAAS,qBAAqB,YAAY;GAE1D,MAAM,IAAI,oBAAoB,QAAQ,MAAM,eAAe,KAAM;GACjE,IAAI,GAEF,KADW,SAAS,iBAAiB,EAAE,SAAS,EAAE,OAC7C,CAAA,EAAI,QAAQ,mBAAmB,CAAC,EAAE,aAAa,SAAS,KAAK,KAAA;EAEtE;EACA,IAAI,CAAC,IAAI;EACT,QAAQ,MAAM,SAAS,IAAI,IAAI,MAAM,WAAW,MAAM,KAAA,CAAS;CACjE,GACA,CAAC,OAAO,CACV;CAEA,MAAM,mBAAmB;EACvB,IAAI,UAAU,cAAc,IAAI;CAClC;CAEA,MAAM,mBAAmB;EACvB,QAAQ,QAAQ;EAChB,YAAY,KAAK;EACjB,WAAW;CACb;CAEA,MAAM,aAAa,aAChB,OAAe;EACd,IAAI,CAAC,SAAS;EACd,YAAY,EAAE;EACd,QAAQ,QAAQ;EAChB,YAAY,KAAK;EACjB,IAAI,UAAU,cAAc,IAAI;CAClC,GACA;EAAC;EAAS;EAAU;CAAW,CACjC;CAEA,MAAM,WAAW,aACd,MAAoB,OAAkC;EACrD,MAAM,MAAM,QAAQ;EACpB,IAAI,UAAU,IAAI,KAAK,IAAI,MAAM,MAAM,MAAM,UAAU,EAAE,IAAI,CAAC,GAAG;GAC/D,UAAU,mCAAmC;GAC7C;EACF;EACA,MAAM,OAAO;GACX,GAAA;GACA,GAAG,mBAAmB;IAAE;IAAM,MAAM,EAAE,OAAO,GAAG;GAAE,CAAC;EACrD;EACA,IAAI,OAAO;EACX,IAAI,CAAC,MAAM;GACT,MAAM,OAAO,UAAU,SAAS,sBAAsB;GACtD,MAAM,SAAS,qBAAqB;IAClC,IAAI,MAAM,QAAQ,MAAM,MAAM,SAAS,KAAK;IAC5C,IAAI,MAAM,OAAO,MAAM,MAAM,UAAU,KAAK;GAC9C,CAAC;GACD,OAAO;IAAE,GAAG,OAAO,IAAI,KAAK,IAAI;IAAG,GAAG,OAAO,IAAI,KAAK,IAAI;GAAE;EAC9D;EACA,MAAM,WAAW,OAAO,YACtB,QAAQ,SAAS,MACf,EAAE,UAAU,SAAS,EAAE,SAAS,SAC5B,CAAC,CAAC,EAAE,IAAI;GAAE,GAAG,EAAE,SAAS;GAAO,GAAG,EAAE,SAAS;EAAO,CAAC,CAAC,IACtD,CAAC,CACP,CACF;EAEA,MAAM,QAAQ,QAAQ,KAAK,MADV,iBAAiB,KAAK,MAAM,MAAM,QAClB,GAAU,EAAE,aAAa,SAAS,QAAQ,CAAC;EAC5E,KAAK,MAAM,IAAI;EACf,YAAY,MAAM,EAAE;EACpB,QAAQ,QAAQ;EAChB,YAAY,KAAK;EACjB,IAAI,UAAU,cAAc,IAAI;CAClC,GACA;EAAC;EAAM;EAAU;EAAS;EAAsB;CAAW,CAC7D;;CAGA,MAAM,oBAAoB,GAAyC,SAAuB;EACxF,IAAI,EAAE,gBAAgB,WAAW,EAAE,WAAW,GAAG;EACjD,MAAM,SAAS;GAAE,GAAG,EAAE;GAAS,GAAG,EAAE;EAAQ;EAC5C,IAAI,QAAQ;EACZ,MAAM,UAAU,GAAW,MAAc;GACvC,MAAM,IAAI,UAAU,SAAS,sBAAsB;GACnD,OAAO,CAAC,CAAC,KAAK,KAAK,EAAE,QAAQ,KAAK,EAAE,SAAS,KAAK,EAAE,OAAO,KAAK,EAAE;EACpE;EACA,MAAM,aAAa;GACjB,OAAO,oBAAoB,eAAe,IAAI;GAC9C,OAAO,oBAAoB,aAAa,EAAE;GAC1C,OAAO,oBAAoB,iBAAiB,MAAM;GAClD,OAAO,oBAAoB,WAAW,GAAG;GACzC,QAAQ,IAAI;EACd;EACA,MAAM,QAAQ,OAAqB;GACjC,IAAI,CAAC,SAAS,KAAK,MAAM,GAAG,UAAU,OAAO,GAAG,GAAG,UAAU,OAAO,CAAC,IAAI,YAAY;GACrF,QAAQ;GACR,QAAQ;IAAE;IAAM,GAAG,GAAG;IAAS,GAAG,GAAG;IAAS,MAAM,OAAO,GAAG,SAAS,GAAG,OAAO;GAAE,CAAC;EACtF;EACA,MAAM,MAAM,OAAqB;GAC/B,KAAK;GACL,IAAI,CAAC,OAAO;GACZ,cAAc,UAAU;GACxB,iBAAkB,cAAc,UAAU,OAAQ,CAAC;GACnD,IAAI,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG;IAClC,MAAM,IAAI,qBAAqB;KAAE,GAAG,GAAG;KAAS,GAAG,GAAG;IAAQ,CAAC;IAC/D,SAAS,MAAM;KACb,GAAG,EAAE,IAAA;KACL,GAAG,EAAE,IAAI,mBAAmB;MAAE;MAAM,MAAM,EAAE,OAAO,GAAG;KAAE,CAAC,IAAI;IAC/D,CAAC;GACH;EACF;EACA,MAAM,eAAe;GACnB,KAAK;GACL,IAAI,OAAO;IACT,cAAc,UAAU;IACxB,iBAAkB,cAAc,UAAU,OAAQ,CAAC;GACrD;EACF;EACA,MAAM,OAAO,OAAsB;GACjC,IAAI,GAAG,QAAQ,UAAU,OAAO;EAClC;EACA,OAAO,iBAAiB,eAAe,IAAI;EAC3C,OAAO,iBAAiB,aAAa,EAAE;EACvC,OAAO,iBAAiB,iBAAiB,MAAM;EAC/C,OAAO,iBAAiB,WAAW,GAAG;CACxC;CAEA,MAAM,aAAa,OAAe;EAChC,YAAY,QACV,IAAI,KAAK,MAAO,EAAE,cAAc,EAAE,OAAO,MAAM,IAAI;GAAE,GAAG;GAAG,UAAU,EAAE,OAAO;EAAG,CAAE,CACrF;EACA,QAAa;GAAE,OAAO,CAAC,EAAE,GAAG,CAAC;GAAG,SAAS;GAAK,SAAS;EAAE,CAAC;CAC5D;CAGA,gBAAgB;EACd,IAAI,YAAY,CAAC,aAAa,SAC5B,QAAQ,MAAO,EAAE,WAAW,SAAS,gBAAgB,QAAQ,OAAO,IAAI,CAAE;EAC5E,IAAI,YAAY,UAAU,cAAc,IAAI;EAC5C,IAAI,CAAC,UAAU;GACb,OAAO,gBAAgB,CAAC;GACxB,aAAa,IAAI;EACnB;CACF,GAAG,CAAC,UAAU,QAAQ,CAAC;CAEvB,MAAM,iBAAiB;EACrB,YAAY,IAAI;EAChB,WAAW;CACb;CACA,MAAM,YAAY,aACf,OAAe;EACd,OAAO,gBAAgB,CAAC;EACxB,MAAM,OAAO,cAAc,QAAQ,SAAS,EAAE;EAC9C,aAAa,IAAI;EACjB,aAAa,UAAU;EACvB,YAAY,IAAI;EAChB,IAAI,UAAU,cAAc,IAAI;CAClC,GACA,CAAC,UAAU,WAAW,CACxB;CAEA,MAAM,mBAAmB,UAAU,SAAS,cAA2B,eAAe,CAAC,EAAE,MAAM;CAE/F,MAAM,UAAU,eACP;EACL,MAAM;EACN,GAAI,UAAU;GAAE,MAAM;GAAY,SAAS,OAAe,YAAY,EAAE;EAAE,IAAI,CAAC;EAC/E,GAAI,WACA,EACE,aAAa,OAAe;GAC1B,KAAK,WAAW,QAAQ,SAAS,EAAE,CAAC;GACpC,WAAW;EACb,EACF,IACA,CAAC;CACP,IACA;EAAC;EAAS;EAAU;EAAW;EAAY;CAAI,CACjD;CAEA,MAAM,0BAA0B;EAC9B,QAAQ,QAAQ;EAChB,aAAa,KAAK;EAClB,cAAc,KAAK;CACrB;CAIA,MAAM,QAAQ,WACZ,oBAAC,qBAAD;EACQ;EACD;EACM;EACX,QAAQ,MAAM;GACZ,aAAa,IAAI;GACjB,OAAO,CAAC;EACV;EACA,SACE,WACI,KAAA,UACM;GACJ,YAAY,KAAK;GACjB,cAAc,KAAK;EACrB;EAEN,aAAa;CACd,CAAA,IACC,SAAS,aACX,oBAAC,qBAAD;EACQ;EACE;EACR,SAAS,WAAW,KAAA,IAAY;EAChC,aAAa;CACd,CAAA,IACC,SAAS,YAAY,aACvB,oBAAC,kBAAD;EAEQ;EACN,QAAQ,WAAW;EACnB,UAAU,MAAM,YAAY,KAAK,MAAM,OAAO;EAC9C,SAAS,WAAW,KAAA,IAAY;CACjC,GALM,WAAW,EAKjB,IACC,UACF,oBAAC,gBAAD;EAAgB,OAAM;EACpB,UAAA,oBAAC,eAAD;GACE,QAAQ,SAAS,SAAS,IAAI;GAC9B,aAAa,WAAW,mBAAmB,KAAA;GAC5B;EAChB,CAAA;CACa,CAAA,IACd;CAEJ,MAAM,cAAc,SAAS,oBAAC,OAAD;EAAK,WAAU;EAAS,UAAA;CAAW,CAAA;CAEhE,MAAM,YAAY,CAAC,YAAY,gBAAgB;CAE/C,OACE,oBAAC,OAAD;EAAK,WAAU;EACb,UAAA,qBAAC,OAAD;GACE,KAAK;GACL,eAAY;GACZ,WAAW,GACT,iIACA,SACF;GANF,UAAA;IAQE,qBAAC,OAAD;KACE,KAAK;KACL,WAAW,GACT,gEACA,MAAM,QAAQ,gCAChB;KALF,UAAA;MAOE,oBAAC,mBAAmB,UAApB;OAA6B,OAAO;OAClC,UAAA,oBAAC,aAAD;QACE,MAAM;QACN,OAAO;QACP,OAAO;QACQ;QACA;QACJ;QACG;QACd,gBAAgB;QAChB,kBAAkB;QAClB,oBAAoB;QACpB,eAAe,UAAU,CAAC,UAAU,WAAW,IAAI;QACnD,gBAAgB,OAAO,EAAE,OAAO,WAAW;SACzC,IAAI,CAAC,WAAW,cAAc,YAAY,SAAS,OAAO;SAC1D,IAAI,KAAK,WAAW,GAAG,OAAO;SAE9B,IAAI,KAAK,WAAW,GAAG,YAAY,KAAK,EAAE,CAAE,EAAE;cACzC,UAAU,QAAQ;SACvB,OAAO;QACT;QACA,WAAW,EAAE,OAAO,WAAW;SAC7B,IAAI,OAAO,QAAQ;SACnB,KAAK,MAAM,KAAK,MAAM,OAAO,WAAW,MAAM,EAAE,EAAE;SAClD,IAAI,SAAS,QAAQ,SAAS,KAAK,IAAI;QACzC;QACA,iBAAiB,GAAG,IAAI,UACtB,YAAY,MAAM,KAAK,OAAO;SAAE,IAAI,EAAE;SAAI,UAAU,EAAE;QAAS,EAAE,CAAC;QAEpE,cAAc,GAAG,SAAS;SACxB,IAAK,EAAE,OAAuB,QAAQ,QAAQ,GAAG;SACjD,WAAW,KAAK,EAAE;QACpB;QACA,mBAAmB;SACjB,IAAI,SAAS,YAAY,CAAC,UAAU,QAAQ,QAAQ;QACtD;QACA,YAAY,MAAM;SAChB,MAAM,KAAK,EAAE;SACb,IACE,EAAE,QAAQ,WACV,GAAG,WAAW,SAAS,kBAAkB,KACzC,GAAG,QAAQ,IACX;UAEA,EAAE,eAAe;UACjB,WAAW,GAAG,QAAQ,EAAE;SAC1B;QACF;OACD,CAAA;MAC0B,CAAA;OAC3B,WAAY,YAAY,YACxB,qBAAC,OAAD;OAAK,WAAU;OAAf,UAAA,CACG,YAAY,WACX,oBAAC,QAAD;QACE,SAAQ;QACR,UAAA;QACA,cAAW;QACX,MAAM,oBAAC,MAAD,CAAO,CAAA;QACb,SAAS;OACV,CAAA,GAEF,WACC,qBAAA,YAAA,EAAA,UAAA,CACE,oBAAC,QAAD;QACE,SAAQ;QACR,UAAU;QACV,cAAW;QACX,MAAM,oBAAC,YAAD,CAAa,CAAA;QACnB,eAAe;SACb,aAAa,IAAI;SACjB,QAAQ,UAAU;SAClB,YAAY,KAAK;SACjB,WAAW;QACb;QAEC,UAAA,WAAW,OAAO;OACb,CAAA,GACR,oBAAC,QAAD;QACE,UAAU;QACV,cAAW;QACX,MAAM,oBAAC,cAAD,CAAe,CAAA;QACrB,SAAS;QAER,UAAA,WAAW,OAAO;OACb,CAAA,CACR,EAAA,CAAA,CAED;;MAEP,oBAAC,OAAD;OACE,MAAK;OACL,aAAU;OACV,IAAI;OACJ,oBAAA;OACA,WAAW,GAAG,SAAS,mCAAmC,SAAS;OAElE,UAAA,UAAU,oBAAC,OAAD;QAAO,MAAK;QAAU,OAAO;QAAQ,iBAAiB,UAAU,IAAI;OAAI,CAAA;MAChF,CAAA;KACF;;IACJ,aACC,oBAAC,SAAD;KACE,cAAW;KACX,WAAU;KAEV,UAAA,oBAAC,OAAD;MACE,MAAK;MACL,YAAY,MAAM;OAChB,IACE,EAAE,QAAQ,YACV,SAAS,YACT,CAAC,YACD,CAAE,EAAE,OAAuB,QACzB,0GACF,GAEA,QAAQ,QAAQ;MACpB;MAEC,UAAA;KACE,CAAA;IACA,CAAA;IAER,QACC,oBAAC,OAAD;KACE,eAAA;KACA,kBAAA;KACA,WAAU;KACV,OAAO;MAAE,YAAY,GAAG,KAAK,EAAE;MAAK,YAAY,GAAG,KAAK,EAAE;KAAI;KAE7D,UAAA,eAAe,KAAK;IAClB,CAAA;IAEN,YAAY,gBAAgB,QAC3B,oBAAC,QAAD;KACE,MAAM;KACN,eAAe,SAAS;MACtB,cAAc,IAAI;MAClB,IAAI,CAAC,MAAM;OACT,IAAI,UAAU,YAAY,KAAK;OAC/B,QAAQ,QAAQ;OAChB,aAAa,KAAK;MACpB;KACF;KACA,OAAM;KAEL,UAAA;IACK,CAAA;IAET,WAAW,YACV,oBAAC,kBAAD;KAEQ;KACN,QAAQ;KACR,eAAe,YAAY,IAAI;KAC/B,YAAY,SAAS;MACnB,KAAK,WAAW,QAAQ,SAAS,UAAU,IAAI,CAAC;MAChD,YAAY,IAAI;MAChB,aAAa,OAAQ,OAAO,WAAW,OAAO,EAAG;MACjD,QAAQ,QAAQ;MAChB,cAAc,KAAK;KACrB;IACD,GAXM,QAWN;GAEA;;CACF,CAAA;AAET;AAEA,SAAgB,WAAW,OAAwB;CACjD,OACE,oBAAC,mBAAD,EAAA,UACE,oBAAC,iBAAD,EAAiB,GAAI,MAAQ,CAAA,EACZ,CAAA;AAEvB"}