@aintela/bi 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +32 -1
  2. package/dist/ChartCardDefaultsContext-BDRsVljO.js +34 -0
  3. package/dist/ChartCardDefaultsContext-BDRsVljO.js.map +1 -0
  4. package/dist/{ScriptDashboardViewerVertical-CuwnxisJ.js → ScriptDashboardViewerVertical-Rr_4adpH.js} +3 -3
  5. package/dist/{ScriptDashboardViewerVertical-CuwnxisJ.js.map → ScriptDashboardViewerVertical-Rr_4adpH.js.map} +1 -1
  6. package/dist/{biModuleSurface--gLAiZ9Z.js → biModuleSurface-BdJK7sSL.js} +5 -5
  7. package/dist/{biModuleSurface--gLAiZ9Z.js.map → biModuleSurface-BdJK7sSL.js.map} +1 -1
  8. package/dist/cards.js +1 -1
  9. package/dist/composer/index.d.ts +3 -1
  10. package/dist/composer/view/ComposerView.d.ts +20 -1
  11. package/dist/composer/view/SessionVisualizationsPanel.d.ts +19 -0
  12. package/dist/composer.js +73 -71
  13. package/dist/data/ChartCardDefaultsContext.d.ts +9 -0
  14. package/dist/data.js +1 -1
  15. package/dist/{index-DeiweWw8.js → index-9LcZjCK0.js} +54 -50
  16. package/dist/index-9LcZjCK0.js.map +1 -0
  17. package/dist/index-C4_VSDeU.js +3856 -0
  18. package/dist/index-C4_VSDeU.js.map +1 -0
  19. package/dist/{index-K50t61iI.js → index-DChE_l-p.js} +2 -2
  20. package/dist/index-DChE_l-p.js.map +1 -0
  21. package/dist/{index-DOpx0R4Y.js → index-Dy6hwDjs.js} +2 -2
  22. package/dist/index-Dy6hwDjs.js.map +1 -0
  23. package/dist/index.js +123 -117
  24. package/dist/runtime/index.d.ts +2 -0
  25. package/dist/runtime/sessionVisualizations.d.ts +61 -0
  26. package/dist/runtime/version.d.ts +1 -1
  27. package/dist/runtime.js +16 -11
  28. package/dist/runtime.js.map +1 -1
  29. package/dist/version-BTc4ElDG.js +122 -0
  30. package/dist/version-BTc4ElDG.js.map +1 -0
  31. package/dist/viewer.js +1 -1
  32. package/package.json +1 -1
  33. package/dist/ChartCardDefaultsContext-Cl5T25H0.js +0 -32
  34. package/dist/ChartCardDefaultsContext-Cl5T25H0.js.map +0 -1
  35. package/dist/index-DOpx0R4Y.js.map +0 -1
  36. package/dist/index-DULVx84u.js +0 -3630
  37. package/dist/index-DULVx84u.js.map +0 -1
  38. package/dist/index-DeiweWw8.js.map +0 -1
  39. package/dist/index-K50t61iI.js.map +0 -1
  40. package/dist/version-BpSiNdYv.js +0 -84
  41. package/dist/version-BpSiNdYv.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-9LcZjCK0.js","sources":["../src/cards/MetricCard.tsx","../src/cards/MetricGroupCard.tsx","../src/cards/GaugeCard.tsx","../src/cards/GaugeGroup.tsx","../src/cards/licenseGuard.ts","../src/cards/DataTableCard.tsx","../src/cards/ChartCard.tsx","../src/cards/TreeMapCard.tsx","../src/cards/mapUtils.ts","../src/cards/geoLayers.ts","../src/cards/MapBubbles.tsx","../src/cards/MapConnections.tsx","../src/cards/worldMapPath.ts"],"sourcesContent":["import React from 'react';\nimport { Box, Skeleton, Stack, Typography } from '@mui/material';\nimport { formatCompact, percentChange, trendArrow } from '../data/dataUtils';\nimport { useBiPalette } from '../theme/createBiTheme';\nimport { useChartContext } from '../grid/ChartContext';\n\nexport interface MetricCardProps {\n currentValue: number;\n previousValue?: number;\n prefix?: string;\n suffix?: string;\n differenceStyle?: 'percentage' | 'value' | 'absolute';\n description?: string;\n icon?: React.ReactNode;\n label?: string;\n formatValue?: (value: number) => string;\n loading?: boolean;\n}\n\nexport function MetricCard({\n currentValue,\n previousValue,\n prefix = '',\n suffix = '',\n differenceStyle = 'percentage',\n description,\n icon,\n label,\n formatValue,\n loading = false,\n}: MetricCardProps) {\n const bi = useBiPalette();\n const fmt = formatValue ?? formatCompact;\n const { naked } = useChartContext() ?? {};\n\n if (loading) {\n return (\n <Box data-testid=\"loading\" sx={{ height: '100%', p: 2 }}>\n <Stack spacing={1} sx={{ height: '100%' }}>\n <Skeleton variant=\"text\" width={100} sx={{ fontSize: '0.75rem' }} />\n <Box sx={{ flex: 1, display: 'flex', alignItems: 'center' }}>\n <Skeleton variant=\"text\" width=\"60%\" sx={{ fontSize: '2.5rem' }} />\n </Box>\n <Skeleton variant=\"text\" width={140} sx={{ fontSize: '0.875rem' }} />\n </Stack>\n </Box>\n );\n }\n\n const change = previousValue != null ? percentChange(previousValue, currentValue) : null;\n const diff = previousValue != null ? currentValue - previousValue : null;\n\n const changeDisplay = change != null\n ? differenceStyle === 'percentage'\n ? `${(change * 100).toFixed(1)}%`\n : `${prefix}${fmt(diff!)}${suffix}`\n : null;\n\n const arrow = diff != null ? trendArrow(diff) : null;\n const changeColor = diff != null ? (diff > 0 ? bi.positive : diff < 0 ? bi.negative : bi.neutral) : undefined;\n\n return (\n <Box className=\"bi-metric-card\" sx={{ height: '100%', p: 1, alignContent: 'center' }}>\n <Stack spacing={1} sx={{ height: '100%' }} alignContent=\"center\">\n {label && naked && (\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n {icon && (\n <Box sx={{ color: 'primary.main', display: 'flex', alignItems: 'center' }}>\n <Typography variant=\"body2\">{icon}</Typography>\n </Box>\n )}\n <Typography variant=\"body2\" color=\"text.secondary\" sx={{ letterSpacing: 0.6, lineHeight: 1.4, overflow: 'clip' }}>\n {label}\n </Typography>\n </Stack>\n )}\n\n <Box sx={{ flex: 1, display: 'flex', alignItems: 'center', minWidth: '100%', justifyContent: 'center' }}>\n <Typography variant=\"h5\" sx={{ fontWeight: 800, fontSize: '28px', letterSpacing: -0.5 }}>\n {prefix}{fmt(currentValue)}{suffix}\n </Typography>\n </Box>\n\n {changeDisplay && (\n <Stack direction=\"row\" spacing={0.5} alignItems=\"center\" justifyContent=\"center\">\n <Typography variant=\"body1\" className=\"bi-metric-change\" sx={{ color: changeColor, fontWeight: 700 }}>\n {arrow} {changeDisplay}\n </Typography>\n {previousValue != null && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n vs {prefix}{fmt(previousValue)}{suffix}\n </Typography>\n )}\n </Stack>\n )}\n\n {description && (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ opacity: 0.8 }}>\n {description}\n </Typography>\n )}\n </Stack>\n </Box>\n );\n}\n\nexport default MetricCard;\n","import React from 'react';\nimport { Box, Skeleton, Stack, Typography } from '@mui/material';\nimport { MetricCard } from './MetricCard';\nimport type { MetricCardProps } from './MetricCard';\n\nexport interface MetricGroupCardProps {\n title?: string;\n metrics: MetricCardProps[];\n columns?: 2 | 3 | 4;\n loading?: boolean;\n}\n\nexport function MetricGroupCard({ title, metrics, columns = 3, loading = false }: MetricGroupCardProps) {\n if (loading) {\n return (\n <Box data-testid=\"loading\" sx={{ height: '100%', p: 2 }}>\n {title && <Skeleton variant=\"text\" width={160} sx={{ fontSize: '1.25rem', mb: 2 }} />}\n <Box sx={{ display: 'grid', gridTemplateColumns: `repeat(${columns}, 1fr)`, gap: 2 }}>\n {Array.from({ length: columns }).map((_, i) => (\n <Stack key={i} spacing={1} sx={{ p: 1 }}>\n <Skeleton variant=\"text\" width={80} sx={{ fontSize: '0.75rem' }} />\n <Skeleton variant=\"text\" width=\"70%\" sx={{ fontSize: '2rem' }} />\n <Skeleton variant=\"text\" width={100} sx={{ fontSize: '0.75rem' }} />\n </Stack>\n ))}\n </Box>\n </Box>\n );\n }\n\n return (\n <Box sx={{ height: '100%', p: 2 }}>\n {title && (\n <Typography variant=\"h6\" sx={{ mb: 2 }}>\n {title}\n </Typography>\n )}\n <Box sx={{ display: 'grid', gridTemplateColumns: `repeat(${columns}, 1fr)`, gap: 2 }}>\n {metrics.map((props, i) => (\n <MetricCard key={i} {...props} />\n ))}\n </Box>\n </Box>\n );\n}\n\nexport default MetricGroupCard;\n","import React from 'react';\nimport { Box, Typography, useTheme } from '@mui/material';\nimport { formatCompact } from '../data/dataUtils';\n\nexport interface GaugeThreshold {\n /** Upper bound of the band as a ratio in `[0, 1]`. */\n value: number;\n color: string;\n}\n\nexport interface GaugeCardProps {\n value: number;\n min?: number;\n max?: number;\n label?: string;\n prefix?: string;\n suffix?: string;\n /** Bands from low to high. Defaults to error / warning / success at 33 % / 66 % / 100 %. */\n thresholds?: GaugeThreshold[];\n formatValue?: (value: number) => string;\n loading?: boolean;\n}\n\nconst ARC_START = Math.PI;\nconst ARC_END = 2 * Math.PI;\nconst R = 50;\nconst CX = R + 10;\nconst CY = R + 10;\nconst STROKEWIDTH = 10;\n\nconst viewBoxWidth = 2 * R + STROKEWIDTH + 10;\nconst viewBoxHeight = R + 40;\n\nfunction polarToXY(angle: number): [number, number] {\n return [CX + R * Math.cos(angle), CY + R * Math.sin(angle)];\n}\n\nfunction describeArc(startAngle: number, endAngle: number): string {\n const [sx, sy] = polarToXY(startAngle);\n const [ex, ey] = polarToXY(endAngle);\n const large = endAngle - startAngle > Math.PI ? 1 : 0;\n return `M ${sx} ${sy} A ${R} ${R} 0 ${large} 1 ${ex} ${ey}`;\n}\n\ninterface GaugeSvgProps {\n zones: GaugeThreshold[];\n ratio: number;\n needleColor: string;\n strokeWidth: number;\n textPrimaryColor: string;\n textSecondaryColor: string;\n min: string;\n max: string;\n elementsClass?: string;\n className?: string;\n valueComponent: string;\n strokeLinecap?: 'round' | 'inherit' | 'butt' | 'square';\n}\n\nfunction GaugeSvg({ zones, ratio, needleColor, strokeWidth, textPrimaryColor, textSecondaryColor, elementsClass, min, max, valueComponent, className, strokeLinecap = 'round' }: GaugeSvgProps) {\n const needleAngle = ARC_START + ratio * (ARC_END - ARC_START);\n const [nx, ny] = polarToXY(needleAngle);\n\n return (\n <svg className={className} x=\"0\" y=\"0\" viewBox={`0 0 ${viewBoxWidth} ${viewBoxHeight}`} width=\"100%\" height=\"100%\" preserveAspectRatio=\"xMidYMid meet\">\n {zones.map((zone, i) => {\n const prevVal = Math.min(i > 0 ? zones[i - 1].value : 0, 1);\n const segStart = ARC_START + prevVal * (ARC_END - ARC_START);\n const segEnd = Math.min(ARC_START + zone.value * (ARC_END - ARC_START), ARC_END);\n return (\n <path\n className={elementsClass}\n key={i}\n d={describeArc(segStart, segEnd)}\n fill=\"none\"\n stroke={zone.color}\n strokeWidth={strokeWidth}\n strokeLinecap={i === zones.length - 1 ? 'round' : strokeLinecap}\n />\n );\n })}\n\n {ratio > 0.005 && (\n <path className={elementsClass} d={describeArc(ARC_START, needleAngle)} fill=\"none\" stroke={needleColor} strokeWidth={strokeWidth} strokeLinecap=\"round\" />\n )}\n\n <line className={elementsClass} x1={CX} y1={CY} x2={nx} y2={ny} stroke={textPrimaryColor} strokeWidth={2.5} strokeLinecap=\"round\" />\n <circle className={elementsClass} cx={CX} cy={CY} r={4} fill={textPrimaryColor} />\n\n <text x={CX} y={CY + 20} textAnchor=\"middle\" fill={textPrimaryColor} fontSize=\"14\" fontWeight=\"bold\">\n {valueComponent}\n </text>\n\n <text x={CX - R} y={CY + 12} textAnchor=\"end\" fill={textSecondaryColor} fontSize=\"8\">\n {min}\n </text>\n <text x={CX + R - 10} y={CY + 12} textAnchor=\"start\" fill={textSecondaryColor} fontSize=\"8\">\n {max}\n </text>\n </svg>\n );\n}\n\nexport function GaugeCard({ value, min = 0, max = 100, label, prefix = '', suffix = '', thresholds, formatValue, loading = false }: GaugeCardProps) {\n const theme = useTheme();\n const fmt = formatValue ?? formatCompact;\n\n if (loading) {\n const skeleton = theme.palette.action.disabledBackground;\n return (\n <Box className=\"parallax-wrapper parallax-group\" data-testid=\"loading\" sx={{ height: '100%', p: 0, display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <GaugeSvg\n className=\"parallax-layer layer-fg skeleton-card\"\n elementsClass=\"svgElement\"\n zones={[{ color: skeleton, value: 0.33 }, { color: skeleton, value: 0.7 }, { color: skeleton, value: 1 }]}\n ratio={0.5}\n strokeLinecap=\"butt\"\n needleColor=\"inherit\"\n strokeWidth={20}\n textPrimaryColor={theme.palette.text.disabled}\n textSecondaryColor={theme.palette.text.disabled}\n min=\"\"\n max=\"\"\n valueComponent=\"Loading\"\n />\n </Box>\n );\n }\n\n const range = max - min || 1;\n const ratio = Math.max(0, Math.min(1, (value - min) / range));\n\n const zones = thresholds ?? [\n { value: 0.33, color: theme.palette.error.main },\n { value: 0.66, color: theme.palette.warning.main },\n { value: 1.0, color: theme.palette.success.main },\n ];\n\n let needleColor = zones[zones.length - 1]?.color ?? theme.palette.primary.main;\n for (const z of zones) {\n if (ratio <= z.value) {\n needleColor = z.color;\n break;\n }\n }\n\n return (\n <Box sx={{ position: 'relative', m: 0, height: '100%', p: 0, display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n {label && (\n <Box sx={{ position: 'absolute', top: 100, left: 10 }}>\n <Typography variant=\"overline\" color=\"text.secondary\" sx={{ letterSpacing: 0.6 }}>\n {label}\n </Typography>\n </Box>\n )}\n\n <Box sx={{ display: 'inline-flex', mt: 0, alignItems: 'normal', width: '100%', height: 'inherit', alignContent: 'center' }}>\n <GaugeSvg\n zones={zones}\n ratio={ratio}\n needleColor={needleColor}\n strokeWidth={20}\n textPrimaryColor={theme.palette.text.primary}\n textSecondaryColor={theme.palette.text.secondary}\n min={fmt(min)}\n max={fmt(max)}\n valueComponent={`${prefix}${fmt(value)}${suffix}`}\n />\n </Box>\n </Box>\n );\n}\n\nexport default GaugeCard;\n","import React from 'react';\nimport { Stack } from '@mui/material';\nimport type { GaugeCardProps } from './GaugeCard';\n\nexport interface GaugeGroupProps {\n title?: string;\n materialIcon?: string;\n footNote?: string;\n partial?: boolean;\n loading?: boolean;\n gauges: React.ReactElement<GaugeCardProps>[];\n}\n\nexport const GaugeGroup: React.FC<GaugeGroupProps> = (props) => (\n <div style={{ height: '100%' }}>\n <Stack direction=\"row\" gap={1} sx={{ height: '100%' }}>\n {props.gauges.map((g, i) => (\n <div key={g.key ?? i}>{g}</div>\n ))}\n </Stack>\n {props.footNote && (\n <div className=\"ds-card-footer\">\n <small>{props.footNote}</small>\n </div>\n )}\n </div>\n);\n\nexport default GaugeGroup;\n","import { LicenseInfo } from '@mui/x-license';\n\nlet warned = false;\n\n/**\n * `DataTableCard` renders MUI X DataGrid **Pro**, whose licence key must be set\n * by the HOST before first render (`LicenseInfo.setLicenseKey(...)` at boot —\n * this package never ships a key). Without one the grid draws a watermark and\n * logs a licence error; this guard makes the cause obvious once per session.\n */\nexport function warnIfMuiXLicenseMissing(): void {\n if (warned) return;\n warned = true;\n let key: string | undefined;\n try {\n key = LicenseInfo.getLicenseKey?.();\n } catch {\n key = undefined;\n }\n if (!key) {\n console.warn(\n '[@aintela/bi] MUI X licence key not set. DataTableCard uses @mui/x-data-grid-pro; call ' +\n \"LicenseInfo.setLicenseKey('<your key>') (from '@mui/x-license' or '@mui/x-data-grid-pro') in the host \" +\n 'before the first BI render, or the grid renders a watermark.',\n );\n }\n}\n\n/** Test seam. */\nexport function resetMuiXLicenseWarning(): void {\n warned = false;\n}\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { Alert, Box, Button, CircularProgress, MenuItem, Snackbar, Typography, useTheme } from '@mui/material';\nimport { alpha } from '@mui/material/styles';\nimport DownloadIcon from '@mui/icons-material/FileDownloadOutlined';\nimport TableViewIcon from '@mui/icons-material/TableViewOutlined';\nimport FilterAltOffIcon from '@mui/icons-material/FilterAltOffOutlined';\n// Pro variant — same surface as the community `DataGrid` plus column pinning\n// and reorder. The licence key is set by the HOST (see licenseGuard.ts).\nimport {\n DataGridPro,\n GridToolbarContainer,\n GridToolbarColumnsButton,\n GridToolbarFilterButton,\n GridToolbarDensitySelector,\n GridToolbarExportContainer,\n getGridSingleSelectOperators,\n gridClasses,\n gridFilterModelSelector,\n useGridApiContext,\n useGridSelector,\n} from '@mui/x-data-grid-pro';\nimport type {\n GridCellClassNamePropType, GridCellParams, GridColDef, GridColumnHeaderParams, GridFilterItem, GridFilterOperator,\n GridRowClassNameParams, GridRowHeightParams, GridRowHeightReturnValue, GridValidRowModel,\n} from '@mui/x-data-grid-pro';\nimport { formatCompact, formatNumber, formatCurrency, formatPercent, formatDate, toStr, formatBoolean, DataResult } from '../data/dataUtils';\nimport { useChartContext } from '../grid/ChartContext';\nimport type { LazyDataResult } from '../hooks/useDashboardLazyData';\nimport { warnIfMuiXLicenseMissing } from './licenseGuard';\n\n// ─── Types ───────────────────────────────────────────────────\n\nexport type ColumnFormats = 'compact' | 'number' | 'currency' | 'check' | 'percent' | 'date';\n\nexport interface DataTableColumn<TModel extends GridValidRowModel = any, T = any> {\n field: string;\n label: string;\n align?: 'left' | 'center' | 'right';\n width?: number;\n minWidth?: number;\n format?: ColumnFormats | ((value: unknown) => string);\n sortable?: boolean;\n filterable?: boolean;\n headerClassName?: string;\n cellClassName?: string | GridCellClassNamePropType<TModel, T>;\n renderHeader?: (params: GridColumnHeaderParams<TModel, T>) => React.ReactNode;\n renderCell?: (params: GridCellParams<TModel, T, string>) => React.ReactNode;\n /** `'singleSelect'` renders a dropdown filter (with {@link valueOptions}). */\n type?: 'singleSelect';\n valueOptions?: ReadonlyArray<unknown>;\n /** `true` → restrict the singleSelect filter to `isAnyOf` (multi-select). */\n multiSelectDropdown?: boolean;\n}\n\nexport interface DataTableCardProps<TModel extends Record<string, any> = Record<string, any>> {\n /** Local mode — full rowset already in memory (`useDashboardData(...).toDataResult(schema)`). */\n data?: DataResult<TModel> | null;\n /** Server mode (mutually exclusive with `data`) — `useDashboardLazyData(viewId, schema)`. */\n lazyData?: LazyDataResult<TModel>;\n /** Column schema (`defineSchema(...)`). Loosely typed on purpose: an untyped `DataResult` + a typed schema is the common LLM pattern. */\n schema?: { build(): DataTableColumn<any>[] };\n title?: string;\n pageSize?: number;\n dense?: boolean;\n striped?: boolean;\n /** Override for the even-row stripe (defaults to `theme.palette.action.hover`). */\n stripedColorEven?: string;\n stripedColorOdd?: string;\n maxHeight?: number | string;\n /** Header background (defaults to a translucent `primary.main`). */\n headerColor?: string;\n loading?: boolean;\n autoFitHeaders?: boolean;\n getRowHeight?: (params: GridRowHeightParams) => GridRowHeightReturnValue;\n getRowClassName?: (params: GridRowClassNameParams<TModel & GridValidRowModel>) => string;\n /** Default pinned columns at first render (`{ left?: string[]; right?: string[] }`). */\n initialPinnedColumns?: { left?: string[]; right?: string[] };\n}\n\n// ─── Helpers ─────────────────────────────────────────────────\n\nfunction resolveFormatter(format: DataTableColumn['format']): ((value: unknown) => string) | undefined {\n if (!format) return undefined;\n if (typeof format === 'function') return format;\n switch (format) {\n case 'compact': return (v) => (v != null && typeof v === 'number' ? formatCompact(v) : toStr(v));\n case 'number': return (v) => (v != null && typeof v === 'number' ? formatNumber(v) : toStr(v));\n case 'currency': return (v) => (v != null && typeof v === 'number' ? formatCurrency(v) : toStr(v));\n case 'percent': return (v) => (v != null && typeof v === 'number' ? formatPercent(v) : toStr(v));\n case 'check': return (v) => (v != null && typeof v === 'boolean' ? formatBoolean(v) : toStr(v));\n case 'date': return (v) => (v instanceof Date ? formatDate(v) : toStr(v));\n }\n}\n\n// ─── Toolbar (server-side export) ────────────────────────────\n// Composed from the legacy toolbar pieces so our server-side CSV / XLSX\n// items sit inside the export menu (see the source app's DataTableCard for\n// why `<GridToolbar />` itself does not work here).\n\ninterface ServerExportToolbarProps {\n onCsvExport?: () => void;\n onXlsxExport?: () => void;\n onClearFilters?: () => void;\n exporting?: boolean;\n}\n\nfunction isActiveFilterItem(item: GridFilterItem): boolean {\n if (item.operator === 'isEmpty' || item.operator === 'isNotEmpty') return true;\n if (Array.isArray(item.value)) return item.value.length > 0;\n return item.value !== undefined && item.value !== null && item.value !== '';\n}\n\nfunction ServerExportToolbar({ onCsvExport, onXlsxExport, onClearFilters, exporting }: ServerExportToolbarProps) {\n const apiRef = useGridApiContext();\n const filterModel = useGridSelector(apiRef, gridFilterModelSelector);\n const hasActiveFilters = (filterModel?.items ?? []).some(isActiveFilterItem) || (filterModel?.quickFilterValues?.length ?? 0) > 0;\n\n return (\n <GridToolbarContainer>\n <GridToolbarColumnsButton />\n <GridToolbarFilterButton />\n <GridToolbarDensitySelector />\n {onClearFilters && hasActiveFilters && (\n <Button size=\"small\" startIcon={<FilterAltOffIcon fontSize=\"small\" />} onClick={onClearFilters} sx={{ textTransform: 'none' }}>\n Limpar filtros\n </Button>\n )}\n <GridToolbarExportContainer>\n {/* Each MenuItem must be a DIRECT child so the container can clone it with `hideMenu`. */}\n {onCsvExport && (\n <MenuItem key=\"server-csv\" disabled={exporting} onClick={onCsvExport}>\n <DownloadIcon fontSize=\"small\" style={{ marginRight: 8 }} />\n Exportar CSV (todos os dados)\n </MenuItem>\n )}\n {onXlsxExport && (\n <MenuItem key=\"server-xlsx\" disabled={exporting} onClick={onXlsxExport}>\n <TableViewIcon fontSize=\"small\" style={{ marginRight: 8 }} />\n Exportar Excel (todos os dados)\n </MenuItem>\n )}\n </GridToolbarExportContainer>\n </GridToolbarContainer>\n );\n}\n\nconst CHAR_WIDTH_PX = 11;\nconst HEADER_PADDING_PX = 30;\nconst MIN_COL_WIDTH = 80;\n\nfunction estimateHeaderWidth(label: string): number {\n return Math.max(MIN_COL_WIDTH, label.length * CHAR_WIDTH_PX + HEADER_PADDING_PX);\n}\n\nfunction toGridColumns(columns: DataTableColumn[], autoFitHeaders: boolean): GridColDef[] {\n return columns.map((col) => {\n const formatter = resolveFormatter(col.format);\n const label = col.label ?? col.field;\n const baseMinWidth = col.minWidth ?? MIN_COL_WIDTH;\n const minWidth = autoFitHeaders ? Math.max(baseMinWidth, estimateHeaderWidth(label)) : baseMinWidth;\n\n const def: GridColDef = {\n field: col.field,\n headerName: label,\n align: col.align,\n headerAlign: col.align,\n headerClassName: col.headerClassName ?? 'bi-datatable--header',\n width: col.width,\n minWidth,\n sortable: col.sortable !== false,\n filterable: col.filterable !== false,\n flex: col.width ? undefined : 1,\n cellClassName: col.cellClassName,\n renderCell: col.renderCell,\n renderHeader: col.renderHeader,\n };\n if (formatter) def.valueFormatter = (value: unknown) => formatter(value);\n if (col.type === 'singleSelect') {\n const selectDef = def as unknown as { type: string; valueOptions: unknown; filterOperators?: GridFilterOperator[] };\n selectDef.type = 'singleSelect';\n selectDef.valueOptions = col.valueOptions;\n if (col.multiSelectDropdown) {\n selectDef.filterOperators = getGridSingleSelectOperators().filter((op: GridFilterOperator) => op.value === 'isAnyOf');\n }\n }\n return def;\n });\n}\n\ntype ExportNotice = { kind: 'progress' | 'success' | 'error'; message: string } | null;\n\nexport function DataTableCard<TModel extends Record<string, any>>({\n data,\n lazyData,\n schema,\n getRowClassName,\n title,\n striped,\n stripedColorEven,\n stripedColorOdd,\n getRowHeight,\n headerColor,\n pageSize,\n dense = true,\n loading = false,\n autoFitHeaders = true,\n initialPinnedColumns,\n}: DataTableCardProps<TModel>) {\n const theme = useTheme();\n const containerRef = React.useRef<HTMLDivElement | null>(null);\n const isLazy = !!lazyData;\n\n useEffect(() => { warnIfMuiXLicenseMissing(); }, []);\n\n if (data && lazyData) {\n console.warn('[DataTableCard] Both `data` and `lazyData` were provided. These props are mutually exclusive. Using `lazyData` and ignoring `data`.');\n }\n\n const initialPageSize = pageSize ?? (isLazy ? 50 : 20);\n const [paginationModel, setPaginationModel] = useState({ page: 0, pageSize: initialPageSize });\n\n const columns: DataTableColumn<TModel>[] = useMemo(() => {\n const source = schema ?? lazyData?.columnSchema ?? data?.columnSchema;\n return source ? (source.build() as DataTableColumn<TModel>[]) : [];\n }, [schema, data?.columnSchema, lazyData?.columnSchema]);\n\n // `dataSource` must be a stable reference or the grid re-fetches forever.\n const lazyGetRows = lazyData?.getRows;\n const dataSource = useMemo(() => (lazyGetRows ? { getRows: lazyGetRows } : undefined), [lazyGetRows]);\n\n const { naked } = useChartContext() ?? {};\n const multiplier = naked ? 1 : 0.9;\n const containerHeight = useContainerMeasurements({ containerRef, multiplier, naked, minHeight: 300 });\n\n const gridColumns = useMemo(() => toGridColumns(columns, autoFitHeaders), [columns, autoFitHeaders]);\n\n const downloadCsv = lazyData?.downloadCsv;\n const downloadXlsx = lazyData?.downloadXlsx;\n const isExporting = lazyData?.exporting ?? false;\n\n // Export feedback through a self-contained MUI Snackbar (the legacy card\n // used notistack, which would have been another peer).\n const [notice, setNotice] = useState<ExportNotice>(null);\n\n const runExport = React.useCallback(\n async (format: 'csv' | 'xlsx') => {\n const fn = format === 'xlsx' ? downloadXlsx : downloadCsv;\n if (!fn) return;\n const formatLabel = format === 'xlsx' ? 'Excel' : 'CSV';\n setNotice({ kind: 'progress', message: `Exportando ${formatLabel}…` });\n try {\n await fn();\n setNotice({ kind: 'success', message: `${formatLabel} exportado com sucesso` });\n } catch (err) {\n console.error(`[DataTableCard] ${formatLabel} export failed`, err);\n setNotice({ kind: 'error', message: err instanceof Error ? err.message : `Falha ao exportar ${formatLabel}` });\n }\n },\n [downloadCsv, downloadXlsx],\n );\n\n const onCsvExport = useMemo(() => (downloadCsv ? () => runExport('csv') : undefined), [downloadCsv, runExport]);\n const onXlsxExport = useMemo(() => (downloadXlsx ? () => runExport('xlsx') : undefined), [downloadXlsx, runExport]);\n\n const lazyApiRef = lazyData?.apiRef;\n const onClearFilters = useMemo(\n () => (lazyApiRef ? () => lazyApiRef.current?.setFilterModel({ items: [], quickFilterValues: [] }) : undefined),\n [lazyApiRef],\n );\n\n const toolbarSlotProps: ServerExportToolbarProps | undefined = useMemo(() => {\n if (!onCsvExport && !onXlsxExport && !onClearFilters) return undefined;\n return { onCsvExport, onXlsxExport, onClearFilters, exporting: isExporting };\n }, [onCsvExport, onXlsxExport, onClearFilters, isExporting]);\n\n // Consumed ONCE by DataGridPro on mount (\"seed, then user controls\").\n const initialState = useMemo(() => {\n const state: Record<string, unknown> = { density: dense ? 'compact' : 'standard' };\n if (initialPinnedColumns) state.pinnedColumns = initialPinnedColumns;\n return state;\n }, []);\n\n const rows: GridValidRowModel[] = useMemo(() => {\n if (!data) return [];\n return (data.rows as Record<string, unknown>[]).map((row, i) => ({ id: i, ...row }));\n }, [data]);\n\n const evenStripe = stripedColorEven ?? theme.palette.action.hover;\n const oddStripe = stripedColorOdd ?? 'transparent';\n const headerBg = headerColor ?? alpha(theme.palette.primary.main, theme.palette.mode === 'dark' ? 0.24 : 0.1);\n\n return (\n <Box data-testid={loading ? 'loading' : ''} sx={{ width: '100%', height: '100%', p: dense ? 1 : 2, display: 'flex', flexDirection: 'column', overflow: 'auto' }} ref={containerRef}>\n {title && naked && <Typography variant=\"h6\" sx={{ mb: 1 }}>{title}</Typography>}\n <Box\n sx={{\n overflow: 'auto',\n height: `${containerHeight}px`,\n '& .bi-datatable-row-even': { backgroundColor: evenStripe },\n '& .bi-datatable-row-odd': { backgroundColor: oddStripe },\n }}\n >\n <DataGridPro\n {...(isLazy\n ? {\n apiRef: lazyData!.apiRef,\n dataSource,\n onDataSourceError: lazyData!.onError,\n loading: lazyData!.loading || loading,\n }\n : { rows, loading })}\n initialState={initialState}\n showToolbar={!!toolbarSlotProps}\n slots={toolbarSlotProps ? { toolbar: ServerExportToolbar as any } : undefined}\n getRowHeight={getRowHeight}\n columns={gridColumns}\n getRowClassName={(params) => {\n let result = getRowClassName ? getRowClassName(params) : '';\n if (result.length > 0) result += ' ';\n if (striped) result += params.indexRelativeToCurrentPage % 2 === 0 ? 'bi-datatable-row-even' : 'bi-datatable-row-odd';\n return result;\n }}\n disableRowSelectionOnClick\n filterDebounceMs={300}\n pagination\n paginationModel={paginationModel}\n pageSizeOptions={[20, 35, 50, 100]}\n onPaginationModelChange={setPaginationModel}\n slotProps={{\n baseIconButton: { style: { backgroundColor: 'transparent' } },\n ...(toolbarSlotProps ? { toolbar: toolbarSlotProps as any } : {}),\n }}\n sx={{\n fontSize: '14px',\n maxHeight: '100%',\n border: 'none',\n color: 'text.primary',\n [`& .${gridClasses.columnSeparator}`]: { color: 'divider' },\n [`& .${gridClasses.sortIcon}`]: { color: 'text.primary' },\n '& .bi-datatable--header': { backgroundColor: headerBg },\n '& .MuiDataGrid-columnHeaders': { borderColor: 'divider' },\n '& .MuiDataGrid-cell': { borderColor: 'divider' },\n '& .MuiDataGrid-row:hover': { backgroundColor: 'action.selected' },\n '& .MuiDataGrid-footerContainer': { borderTop: 'none' },\n }}\n />\n </Box>\n\n <Snackbar\n open={notice !== null}\n autoHideDuration={notice?.kind === 'progress' ? null : notice?.kind === 'error' ? 6000 : 3000}\n onClose={() => setNotice(null)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }}\n >\n <Alert\n onClose={() => setNotice(null)}\n severity={notice?.kind === 'error' ? 'error' : notice?.kind === 'success' ? 'success' : 'info'}\n icon={notice?.kind === 'progress' ? <CircularProgress size={16} color=\"inherit\" /> : undefined}\n variant=\"outlined\"\n sx={{ bgcolor: 'background.paper' }}\n >\n {notice?.message}\n </Alert>\n </Snackbar>\n </Box>\n );\n}\n\nfunction useContainerMeasurements({ containerRef, multiplier = 1, naked, minHeight = 200 }: {\n containerRef: React.RefObject<HTMLElement | null>;\n multiplier: number;\n naked: boolean | undefined;\n minHeight: number;\n}) {\n const [containerHeight, setContainerHeight] = useState(minHeight);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const getParentGridCard = (element: HTMLElement | null): HTMLElement | null => {\n if (element?.parentElement == null) return null;\n if (element?.classList.contains('ds-card')) return element;\n return getParentGridCard(element?.parentElement ?? null);\n };\n\n useEffect(() => {\n const refElement = containerRef.current;\n if (!refElement || typeof ResizeObserver === 'undefined') return;\n const target = getParentGridCard(refElement);\n\n const observer = new ResizeObserver((entries) => {\n if (timeoutRef.current) clearTimeout(timeoutRef.current);\n const height = Math.floor(entries[0].contentRect.height) * multiplier;\n timeoutRef.current = setTimeout(() => {\n setContainerHeight(() => height);\n timeoutRef.current = null;\n }, 50);\n });\n if (target) observer.observe(target);\n\n if (containerHeight !== 200 && target) {\n setContainerHeight((prev) => prev * multiplier);\n }\n\n return () => observer.disconnect();\n }, [containerRef?.current, naked, multiplier]);\n\n return containerHeight;\n}\n\nexport default DataTableCard;\n","import React, { useMemo, useRef, useState } from 'react';\nimport { Box, Skeleton, Typography, useTheme } from '@mui/material';\nimport { alpha } from '@mui/material/styles';\nimport {\n ResponsiveContainer, CartesianGrid, Tooltip, Legend,\n LineChart, Line,\n BarChart, Bar,\n AreaChart, Area,\n PieChart, Pie, Cell,\n ScatterChart, Scatter,\n ComposedChart,\n XAxis, YAxis,\n} from 'recharts';\nimport type { PieLabelRenderProps } from 'recharts';\nimport type { DataResult } from '../data/dataUtils';\nimport { formatCompact, formatDate } from '../data/dataUtils';\nimport { useChartCardDefaults } from '../data/ChartCardDefaultsContext';\nimport { resolveBiPalette } from '../theme/createBiTheme';\nimport { useChartContext } from '../grid/ChartContext';\nimport { useContainerRectangle } from './useContainerRectangle';\n\n// ─── Types ───────────────────────────────────────────────────\n\nexport interface ChartSeries {\n dataKey: string;\n name?: string;\n color?: string;\n type?: 'line' | 'bar' | 'area';\n}\n\nexport type ChartType = 'line' | 'bar' | 'barH' | 'barV' | 'donut' | 'pie' | 'scatter' | 'area' | 'stackedArea' | 'stackedBar' | 'combo';\n\ntype DomainValue = number | 'auto' | 'dataMin' | 'dataMax';\n\nexport interface AxisConfig {\n hide?: boolean;\n label?: string;\n tickAngle?: number;\n tickCount?: number;\n interval?: number | 'preserveStart' | 'preserveEnd' | 'preserveStartEnd';\n tickSize?: number;\n tickLine?: boolean;\n axisLine?: boolean;\n domain?: [DomainValue, DomainValue];\n unit?: string;\n reversed?: boolean;\n fontSize?: number;\n color?: string;\n width?: number;\n height?: number;\n scale?: 'auto' | 'linear' | 'pow' | 'sqrt' | 'log' | 'time' | 'band' | 'point';\n}\n\nexport interface ChartCardProps<TModel extends Record<string, any> = Record<string, any>> {\n data?: DataResult<TModel> | null;\n type: ChartType;\n xAxis?: string;\n series: ChartSeries[];\n title?: string;\n height?: number;\n stacked?: boolean;\n showLegend?: boolean;\n showGrid?: boolean;\n showTooltip?: boolean;\n formatXAxis?: (value: unknown) => string;\n formatYAxis?: (value: number) => string;\n xAxisConfig?: AxisConfig;\n yAxisConfig?: AxisConfig;\n loading?: boolean;\n /** Max visible slices for pie/donut charts. Smaller slices are grouped into \"Others\". Default 4. */\n maxSlices?: number;\n /** Overrides the palette from chartDefaults / the theme when set. */\n palette?: string[];\n /** Background colour of the chart container (a theme token string is fine). */\n backgroundColor?: string;\n /** Colour of the grid lines; defaults to a translucent `text.primary`. */\n gridColor?: string;\n}\n\n// ─── Helpers ─────────────────────────────────────────────────\n\nfunction defaultXFormatter(v: unknown): string {\n if (v instanceof Date) return formatDate(v, 'MM/DD');\n return String(v ?? '');\n}\n\n/**\n * Modulates the alpha of `baseColor` by `index/total`, returning a colour in\n * `[minAlpha, maxAlpha]`. Used to render mono-shaded bars / slices where every\n * mark shares one hue but varies in intensity. Built on MUI's `alpha()`, so it\n * accepts hex, functional and keyword CSS colours alike.\n */\nexport function chartShade(baseColor: string, index: number, total: number, minAlpha = 0.25, maxAlpha = 1): string {\n if (total <= 1) return baseColor;\n const t = index / Math.max(1, total - 1);\n const a = minAlpha + (maxAlpha - minAlpha) * t;\n try {\n return alpha(baseColor, a);\n } catch {\n return baseColor;\n }\n}\n\n// ─── Component ───────────────────────────────────────────────\n\nexport function ChartCard<TModel extends Record<string, any> = Record<string, any>>({\n data,\n type,\n xAxis,\n series,\n title,\n height = 300,\n stacked = false,\n showLegend = true,\n showGrid = true,\n showTooltip = true,\n formatXAxis,\n formatYAxis,\n xAxisConfig,\n yAxisConfig,\n loading = false,\n maxSlices = 4,\n palette: paletteOverride,\n backgroundColor,\n gridColor: gridColorOverride,\n}: ChartCardProps<TModel>) {\n const theme = useTheme();\n const { naked } = useChartContext() ?? {};\n\n const rows = !data ? [] : Array.isArray(data) ? (data as Record<string, unknown>[]) : data.rows;\n const chartData: Record<string, unknown>[] = useMemo(() => {\n if (!xAxis) return rows;\n return rows.map((row) => ({\n ...row,\n __xLabel: (formatXAxis ?? defaultXFormatter)(row[xAxis]),\n }));\n }, [rows, xAxis, formatXAxis]);\n\n const fmtY = formatYAxis ?? ((v: number) => formatCompact(v, 0));\n const axisColor = theme.palette.text.secondary;\n // prop → the host's ChartCardDefaults → a 12% tint of the ink. Resolved after `chartDefaults` below.\n let gridColor = gridColorOverride ?? alpha(theme.palette.text.primary, 0.12);\n const xKey = xAxis ? '__xLabel' : undefined;\n\n const resolveAxisProps = (cfg: AxisConfig | undefined, defaults: Record<string, unknown>) => {\n if (!cfg) return defaults;\n const props: Record<string, unknown> = { ...defaults };\n const tickFill = cfg.color ?? (defaults.tick as Record<string, unknown>)?.fill ?? axisColor;\n const tickFs = cfg.fontSize ?? (defaults.tick as Record<string, unknown>)?.fontSize ?? 12;\n props.tick = { fill: tickFill, fontSize: tickFs };\n if (cfg.hide !== undefined) props.hide = cfg.hide;\n if (cfg.label !== undefined) props.label = { value: cfg.label, position: 'insideBottom', offset: -4, fill: tickFill, fontSize: tickFs };\n if (cfg.tickAngle !== undefined) {\n (props.tick as Record<string, unknown>).angle = cfg.tickAngle;\n (props.tick as Record<string, unknown>).textAnchor = cfg.tickAngle < 0 ? 'end' : cfg.tickAngle > 0 ? 'start' : 'middle';\n }\n if (cfg.tickCount !== undefined) props.tickCount = cfg.tickCount;\n if (cfg.interval !== undefined) props.interval = cfg.interval;\n if (cfg.tickSize !== undefined) props.tickSize = cfg.tickSize;\n if (cfg.tickLine !== undefined) props.tickLine = cfg.tickLine;\n if (cfg.axisLine !== undefined) props.axisLine = cfg.axisLine;\n if (cfg.domain) props.domain = cfg.domain;\n if (cfg.unit !== undefined) props.unit = cfg.unit;\n if (cfg.reversed !== undefined) props.reversed = cfg.reversed;\n if (cfg.width !== undefined) props.width = cfg.width;\n if (cfg.height !== undefined) props.height = cfg.height;\n if (cfg.scale !== undefined) props.scale = cfg.scale;\n return props;\n };\n\n const MAX_LENGTH_LABEL = 10;\n const truncateLabel = (label: string) => (label.length > MAX_LENGTH_LABEL ? label.slice(0, MAX_LENGTH_LABEL) : label);\n\n const tooltipStyle = {\n contentStyle: {\n background: theme.palette.background.paper,\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: theme.shape.borderRadius,\n color: theme.palette.text.primary,\n },\n itemStyle: { color: theme.palette.text.primary },\n labelStyle: { color: axisColor },\n // Recharts' default cursor is a hard-coded light grey overlay; give it\n // both `fill` (BarChart hover rectangle) and `stroke` (Line/Area\n // crosshair) from the theme so it belongs to either canvas.\n cursor: {\n fill: theme.palette.action.hover,\n stroke: theme.palette.action.selected,\n strokeWidth: 1,\n },\n };\n\n // Palette resolution: prop → ChartCardDefaults → theme.palette.bi.series.\n const chartDefaults = useChartCardDefaults();\n gridColor = gridColorOverride ?? chartDefaults.gridColor ?? gridColor;\n const palette = paletteOverride ?? chartDefaults.palette ?? resolveBiPalette(theme).series;\n const monoShade = chartDefaults.monoShadePerCategory ?? true;\n const rotateBase = (chartDefaults.rotateBasePerChart ?? true) && palette.length > 0;\n\n const [slotIndex] = useState<number>(() => (rotateBase ? (chartDefaults.allocateChartSlot?.() ?? 0) : 0));\n const pickPaletteColor = (i: number) => palette[((rotateBase ? slotIndex : 0) + i) % palette.length];\n\n const RADIAN = Math.PI / 180;\n const renderCustomizedLabel = ({ cx, cy, midAngle, innerRadius, outerRadius, percent, fill }: PieLabelRenderProps & { fill?: string }) => {\n if (cx == null || cy == null || innerRadius == null || outerRadius == null) return null;\n const radius = (innerRadius as number) + ((outerRadius as number) - (innerRadius as number)) * 0.5;\n const ncx = Number(cx);\n const x = ncx + radius * Math.cos(-(midAngle ?? 0) * RADIAN);\n const ncy = Number(cy);\n const y = ncy + radius * Math.sin(-(midAngle ?? 0) * RADIAN);\n let labelFill = theme.palette.text.primary;\n if (fill) {\n try { labelFill = theme.palette.getContrastText(fill); } catch { /* keep text.primary */ }\n }\n return (\n <text x={x} y={y} fill={labelFill} fontSize={14} textAnchor={x > ncx ? 'start' : 'end'} dominantBaseline=\"central\">\n {`${((percent ?? 1) * 100).toFixed(0)}%`}\n </text>\n );\n };\n\n const seriesColors = series.map((s, i) => s.color ?? pickPaletteColor(i));\n const useMonoShadeBars = monoShade && series.length === 1;\n\n const pieData = useMemo(() => {\n if (type !== 'pie' && type !== 'donut') return [];\n const raw = chartData.map((row, i) => ({\n name: truncateLabel(xKey ? String(row[xKey] ?? row[xAxis!] ?? i) : `#${i}`),\n value: Number(series[0] ? row[series[0].dataKey] : 0) || 0,\n }));\n if (raw.length <= maxSlices) return raw;\n const sorted = [...raw].sort((a, b) => b.value - a.value);\n const top = sorted.slice(0, maxSlices - 1);\n const othersTotal = sorted.slice(maxSlices - 1).reduce((sum, d) => sum + d.value, 0);\n return [...top, { name: 'Others', value: othersTotal }];\n }, [type, chartData, xKey, xAxis, series, maxSlices]);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const [, containerHeight] = useContainerRectangle(containerRef);\n\n if (loading || !data) {\n const isPie = type === 'pie' || type === 'donut';\n return (\n <Box data-testid=\"loading\" sx={{ height: '100%', p: 2, width: '100%', backgroundColor }}>\n {title && naked && <Skeleton variant=\"text\" width={180} sx={{ fontSize: '1.25rem', mb: 1 }} />}\n {isPie ? (\n <Box sx={{ display: 'flex', justifyContent: 'center', alignItems: 'center', height }}>\n <Skeleton variant=\"circular\" width={Math.min(height * 0.7, 200)} height={Math.min(height * 0.7, 200)} />\n </Box>\n ) : (\n <Skeleton variant=\"rounded\" width=\"100%\" height={height} />\n )}\n </Box>\n );\n }\n\n // ─── Pie / Donut ─────────────────────────────────────────\n if (type === 'pie' || type === 'donut') {\n return (\n <Box ref={containerRef} sx={{ height: '100%', width: '100%', px: 0, backgroundColor }}>\n {title && naked && <Typography variant=\"h6\" sx={{ mb: 0.5 }}>{title}</Typography>}\n <ResponsiveContainer width=\"100%\" height={containerHeight || height}>\n <PieChart>\n <Pie\n data={pieData}\n dataKey=\"value\"\n nameKey=\"name\"\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={type === 'donut' ? '50%' : 0}\n outerRadius=\"70%\"\n label={renderCustomizedLabel}\n labelLine={false}\n paddingAngle={1}\n >\n {pieData.map((_, i) => (\n <Cell\n key={i}\n fill={monoShade && pieData.length > 1 ? chartShade(pickPaletteColor(0), i, pieData.length) : pickPaletteColor(i)}\n />\n ))}\n {showTooltip && <Tooltip {...tooltipStyle} />}\n </Pie>\n <Legend wrapperStyle={{ color: theme.palette.text.secondary }} />\n </PieChart>\n </ResponsiveContainer>\n </Box>\n );\n }\n\n // ─── Scatter ─────────────────────────────────────────────\n if (type === 'scatter') {\n return (\n <Box sx={{ height: '100%', p: 0, backgroundColor }}>\n {title && naked && <Typography variant=\"h6\" sx={{ mb: 1 }}>{title}</Typography>}\n <ResponsiveContainer width=\"100%\" height={height}>\n <ScatterChart margin={{ top: 8, right: 16, bottom: xAxisConfig?.tickAngle ? 24 : 8, left: 0 }}>\n {showGrid && <CartesianGrid stroke={gridColor} />}\n <XAxis dataKey={xAxis} name={xAxis} {...resolveAxisProps(xAxisConfig, { tick: { fill: axisColor, fontSize: 12 } })} />\n <YAxis dataKey={series[0]?.dataKey} tickFormatter={fmtY} name={series[0]?.name} {...resolveAxisProps(yAxisConfig, { tick: { fill: axisColor, fontSize: 12 } })} />\n {showTooltip && <Tooltip {...tooltipStyle} />}\n {showLegend && <Legend wrapperStyle={{ color: theme.palette.text.secondary }} />}\n {series.map((s, i) => (\n <Scatter key={s.dataKey} name={s.name ?? s.dataKey} data={chartData} fill={seriesColors[i]} />\n ))}\n </ScatterChart>\n </ResponsiveContainer>\n </Box>\n );\n }\n\n // ─── Cartesian ───────────────────────────────────────────\n const chartType: ChartType = type === 'bar' ? 'barH' : type;\n const isHorizontal = chartType === 'barH';\n const forceStacked = chartType === 'stackedArea' || chartType === 'stackedBar';\n\n const ChartComp = chartType === 'combo' ? ComposedChart\n : chartType === 'barH' || chartType === 'barV' || chartType === 'stackedBar' ? BarChart\n : chartType === 'area' || chartType === 'stackedArea' ? AreaChart\n : LineChart;\n\n const layout = isHorizontal ? ('vertical' as const) : ('horizontal' as const);\n const effectiveStacked = stacked || forceStacked;\n\n const resolveSeriesType = (s: ChartSeries): 'line' | 'bar' | 'area' => {\n if (s.type) return s.type;\n if (chartType === 'combo') return 'bar';\n if (chartType === 'barV' || chartType === 'barH' || chartType === 'stackedBar') return 'bar';\n if (chartType === 'area' || chartType === 'stackedArea') return 'area';\n return 'line';\n };\n\n return (\n <Box sx={{ height: '100%', p: 0.3, backgroundColor }} ref={containerRef}>\n {title && naked && <Typography variant=\"h6\" sx={{ mb: 1 }}>{title}</Typography>}\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <ChartComp data={chartData} layout={layout} margin={{ top: 0, right: 16, bottom: xAxisConfig?.tickAngle ? 24 : 8, left: 0 }} style={{ maxHeight: '95%' }}>\n {showGrid && <CartesianGrid stroke={gridColor} strokeDasharray=\"3 3\" />}\n\n {isHorizontal ? (\n <>\n <XAxis type=\"number\" tickFormatter={fmtY} {...resolveAxisProps(xAxisConfig, { tick: { fill: axisColor, fontSize: 12 } })} />\n <YAxis type=\"category\" dataKey={xKey ?? xAxis} {...resolveAxisProps(yAxisConfig, { tick: { fill: axisColor, fontSize: 12 }, width: 80 })} />\n </>\n ) : (\n <>\n <XAxis dataKey={xKey ?? xAxis} {...resolveAxisProps(xAxisConfig, { tick: { fill: axisColor, fontSize: 12 } })} />\n <YAxis tickFormatter={fmtY} {...resolveAxisProps(yAxisConfig, { tick: { fill: axisColor, fontSize: 12 } })} />\n </>\n )}\n\n {showTooltip && <Tooltip {...tooltipStyle} />}\n {showLegend && <Legend wrapperStyle={{ color: theme.palette.text.secondary }} />}\n\n {series.map((s, i) => {\n const color = seriesColors[i];\n const seriesType = resolveSeriesType(s);\n\n if (seriesType === 'bar') {\n return (\n <Bar\n key={s.dataKey}\n dataKey={s.dataKey}\n name={s.name ?? s.dataKey}\n fill={color}\n stackId={effectiveStacked ? 'stack' : undefined}\n radius={isHorizontal ? [0, 4, 4, 0] : [4, 4, 0, 0]}\n maxBarSize={24}\n >\n {useMonoShadeBars && chartData.map((_, ri) => (\n // Bars are typically sorted descending, so invert the shade\n // index: the largest bar gets the strongest alpha.\n <Cell key={ri} fill={chartShade(color, chartData.length - 1 - ri, chartData.length)} />\n ))}\n </Bar>\n );\n }\n if (seriesType === 'area') {\n return (\n <Area\n key={s.dataKey}\n type=\"monotone\"\n dataKey={s.dataKey}\n name={s.name ?? s.dataKey}\n stroke={color}\n fill={color}\n fillOpacity={effectiveStacked ? 0.6 : 0.15}\n stackId={effectiveStacked ? 'stack' : undefined}\n strokeWidth={2}\n />\n );\n }\n return (\n <Line key={s.dataKey} type=\"monotone\" dataKey={s.dataKey} name={s.name ?? s.dataKey} stroke={color} strokeWidth={2} dot={false} activeDot={{ r: 4 }} />\n );\n })}\n </ChartComp>\n </ResponsiveContainer>\n </Box>\n );\n}\n\nexport default ChartCard;\n","import React, { useMemo } from 'react';\nimport { Box, Skeleton, Typography, useTheme } from '@mui/material';\nimport { alpha } from '@mui/material/styles';\nimport { ResponsiveContainer, Treemap } from 'recharts';\nimport type { DataResult } from '../data/dataUtils';\nimport { formatCompact } from '../data/dataUtils';\nimport { resolveBiPalette } from '../theme/createBiTheme';\n\nexport interface TreeMapCardProps<TModel extends Record<string, any> = Record<string, any>> {\n data?: DataResult<TModel> | null;\n nameKey: keyof TModel & string;\n valueKey: keyof TModel & string;\n title?: string;\n height?: number;\n formatValue?: (value: number) => string;\n loading?: boolean;\n /** Overrides `theme.palette.bi.series`. */\n palette?: readonly string[];\n}\n\ninterface TreeNode {\n name: string;\n size: number;\n fill: string;\n // recharts 3 types `Treemap`'s `data` as `readonly TreemapDataType[]`, which carries a string index\n // signature; recharts 2 constrains it to nothing. Declaring one here typechecks against BOTH majors\n // (see the `recharts` peer range) and costs nothing at runtime — every field a node actually holds is\n // already a string or a number.\n [key: string]: string | number;\n}\n\nfunction CustomContent(props: {\n x?: number; y?: number; width?: number; height?: number;\n name?: string; size?: number; fill?: string;\n formatValue?: (v: number) => string;\n strokeColor: string;\n labelFor: (fill: string) => string;\n}) {\n const { x = 0, y = 0, width = 0, height = 0, name, size, fill, strokeColor, labelFor } = props;\n const fmt = props.formatValue ?? formatCompact;\n if (width < 20 || height < 20) return null;\n const labelColor = fill ? labelFor(fill) : strokeColor;\n\n return (\n <g>\n <rect x={x} y={y} width={width} height={height} rx={4} fill={fill} stroke={strokeColor} strokeWidth={1} />\n {width > 50 && height > 30 && (\n <>\n <text x={x + 6} y={y + 16} fill={labelColor} fontSize={12} fontWeight={600}>\n {(name ?? '').length > width / 7 ? (name ?? '').slice(0, Math.floor(width / 7)) + '…' : name}\n </text>\n {height > 44 && (\n <text x={x + 6} y={y + 32} fill={alpha(labelColor, 0.7)} fontSize={11}>\n {fmt(size ?? 0)}\n </text>\n )}\n </>\n )}\n </g>\n );\n}\n\nexport function TreeMapCard<TModel extends Record<string, any> = Record<string, any>>({\n data,\n nameKey,\n valueKey,\n title,\n height = 300,\n formatValue,\n loading = false,\n palette: paletteOverride,\n}: TreeMapCardProps<TModel>) {\n const theme = useTheme();\n const palette = paletteOverride ?? resolveBiPalette(theme).series;\n\n const treeData: TreeNode[] = useMemo(() => {\n if (!data) return [];\n return (data.rows as Record<string, unknown>[]).map((row, i) => ({\n name: String(row[nameKey] ?? ''),\n size: Math.max(0, Number(row[valueKey]) || 0),\n fill: palette[i % palette.length],\n }));\n }, [data, nameKey, valueKey, palette]);\n\n const labelFor = (fill: string) => {\n try { return theme.palette.getContrastText(fill); } catch { return theme.palette.text.primary; }\n };\n\n if (loading || !data) {\n return (\n <Box data-testid=\"loading\" sx={{ height: '100%', p: 2 }}>\n {title && <Skeleton variant=\"text\" width={180} sx={{ fontSize: '1.25rem', mb: 1 }} />}\n <Skeleton variant=\"rounded\" width=\"100%\" height={height} />\n </Box>\n );\n }\n\n return (\n <Box sx={{ height: '100%', p: 2 }}>\n {title && <Typography variant=\"h6\" sx={{ mb: 1 }}>{title}</Typography>}\n {treeData.length === 0 ? (\n <Typography variant=\"body2\" color=\"text.secondary\">No data</Typography>\n ) : (\n <ResponsiveContainer width=\"100%\" height={height}>\n <Treemap\n data={treeData}\n dataKey=\"size\"\n nameKey=\"name\"\n stroke={theme.palette.background.paper}\n content={<CustomContent formatValue={formatValue} strokeColor={theme.palette.background.paper} labelFor={labelFor} />}\n />\n </ResponsiveContainer>\n )}\n </Box>\n );\n}\n\nexport default TreeMapCard;\n","// Map projection helpers shared by MapBubblesCard and MapConnectionsCard.\n// Geography layer URLs live in `./geoLayers.ts`.\n\nexport const BASE_SCALE = 150;\n\nconst BASE_LNG_SPAN = 300;\nconst BASE_LAT_SPAN = 140;\n\nexport interface MapViewport {\n center: [number, number];\n zoom: number;\n}\n\n/**\n * Computes the projection center and zoom multiplier to best fit a set of\n * coordinates.\n *\n * Priority:\n * 1. Both `center` and `defaultZoom` provided → use them directly.\n * 2. `autoFit` enabled (default) → derive center/zoom from coordinates.\n * 3. `defaultZoom` only → derive center from data, apply the given zoom.\n * 4. `center` only → use it, derive zoom from data.\n */\nexport function computeMapViewport(\n coords: { lat: number; lng: number }[],\n opts: {\n autoFit?: boolean;\n defaultZoom?: number;\n center?: [number, number];\n } = {},\n): MapViewport {\n const { autoFit = true, defaultZoom, center: userCenter } = opts;\n\n if (userCenter && defaultZoom != null) {\n return { center: userCenter, zoom: defaultZoom };\n }\n\n if (!autoFit || coords.length === 0) {\n return {\n center: userCenter ?? [0, 20],\n zoom: defaultZoom ?? 1,\n };\n }\n\n const lats = coords.map(c => c.lat);\n const lngs = coords.map(c => c.lng);\n\n const minLat = Math.min(...lats);\n const maxLat = Math.max(...lats);\n const minLng = Math.min(...lngs);\n const maxLng = Math.max(...lngs);\n\n const center: [number, number] = userCenter ?? [\n (minLng + maxLng) / 2,\n (minLat + maxLat) / 2,\n ];\n\n if (defaultZoom != null) {\n return { center, zoom: defaultZoom };\n }\n\n if (coords.length === 1) {\n return { center, zoom: 4 };\n }\n\n const padding = 1.5;\n const latSpan = Math.max(maxLat - minLat, 5) * padding;\n const lngSpan = Math.max(maxLng - minLng, 5) * padding;\n\n const zoomByLat = BASE_LAT_SPAN / latSpan;\n const zoomByLng = BASE_LNG_SPAN / lngSpan;\n const zoom = Math.max(1, Math.min(zoomByLat, zoomByLng, 20));\n\n return { center, zoom };\n}\n","import { createContext, useContext } from 'react';\n\n/** World countries (world-atlas, ~110 m). */\nexport const GEO_URL_WORLD = 'https://cdn.jsdelivr.net/npm/world-atlas@2/countries-110m.json';\n\n/** IBGE — Brazilian states at maximum quality (~1 MB). */\nexport const GEO_URL_BRAZIL_STATES =\n 'https://servicodados.ibge.gov.br/api/v3/malhas/paises/BR?formato=application/vnd.geo+json&qualidade=maxima&intrarregiao=UF';\n\n/** IBGE — Brazilian municipalities at minimum quality (~3.5 MB). Use sparingly. */\nexport const GEO_URL_BRAZIL_MUNICIPALITIES =\n 'https://servicodados.ibge.gov.br/api/v3/malhas/paises/BR?formato=application/vnd.geo+json&qualidade=minima&intrarregiao=municipio';\n\n/**\n * The layer set the legacy app used everywhere: world countries as the base\n * fill + Brazilian state boundaries as an overlay. Exported as a *named*\n * default a host opts into (`<GeoLayersProvider layers={brazilGeoLayers}>`\n * or `geoUrl={brazilGeoLayers}`); the cards' built-in default is the world\n * base alone.\n */\nexport const brazilGeoLayers: readonly string[] = [GEO_URL_WORLD, GEO_URL_BRAZIL_STATES];\n\n/** Cards' built-in default when neither a prop nor a provider sets layers. */\nexport const worldGeoLayers: readonly string[] = [GEO_URL_WORLD];\n\nconst GeoLayersContext = createContext<readonly string[] | null>(null);\n\n/** Sets the geography layer URLs for every map card in a subtree. */\nexport const GeoLayersProvider = GeoLayersContext.Provider;\n\n/**\n * Resolves the layers for a map card: explicit prop → nearest provider →\n * {@link worldGeoLayers}.\n */\nexport function useGeoLayers(override?: string | readonly string[]): readonly string[] {\n const fromContext = useContext(GeoLayersContext);\n if (override !== undefined) return Array.isArray(override) ? (override as readonly string[]) : [override as string];\n return fromContext ?? worldGeoLayers;\n}\n","import React, { useMemo, useState, useCallback } from 'react';\nimport { Box, Skeleton, Typography, useTheme } from '@mui/material';\nimport { alpha } from '@mui/material/styles';\nimport { ComposableMap, Geographies, Geography, Marker, ZoomableGroup, useZoomPanContext } from 'react-simple-maps';\nimport { formatCompact } from '../data/dataUtils';\nimport { BASE_SCALE, computeMapViewport } from './mapUtils';\nimport { useGeoLayers } from './geoLayers';\nimport { resolveBiPalette } from '../theme/createBiTheme';\n\nexport interface MapBubble {\n lat: number;\n lng: number;\n value: number;\n label?: string;\n}\n\nexport interface MapBubblesProps {\n data?: { rows: MapBubble[] };\n title?: string;\n height?: number;\n minBubbleSize?: number;\n maxBubbleSize?: number;\n /** Bubble colour; defaults to the first BI series colour. */\n color?: string;\n formatValue?: (value: number) => string;\n loading?: boolean;\n /** Zoom multiplier (1 = whole world). Overrides auto-fit zoom when set. */\n defaultZoom?: number;\n /** Map center as [longitude, latitude]. Overrides auto-fit center when set. */\n center?: [number, number];\n /** When true (default), automatically centers and zooms to fit all bubbles. */\n autoFit?: boolean;\n /**\n * Geography topology URL(s). The first layer is the base (filled); further\n * layers render as boundary overlays. Defaults to the nearest\n * `GeoLayersProvider`, else the world base layer (`worldGeoLayers`).\n * Pass `brazilGeoLayers` for the legacy world + Brazil-states pair.\n */\n geoUrl?: string | readonly string[];\n}\n\nfunction BubbleMarkers({ bubbles, maxVal, minBubbleSize, maxBubbleSize, fillColor, fmt, onHover, onLeave }: {\n bubbles: MapBubble[];\n maxVal: number;\n minBubbleSize: number;\n maxBubbleSize: number;\n fillColor: string;\n fmt: (v: number) => string;\n onHover: (e: React.MouseEvent, text: string) => void;\n onLeave: () => void;\n}) {\n const { k } = useZoomPanContext();\n return (\n <>\n {bubbles.map((b, i) => {\n const ratio = Math.abs(b.value) / maxVal;\n const r = minBubbleSize + ratio * (maxBubbleSize - minBubbleSize);\n const label = `${b.label ?? ''} ${fmt(b.value)}`.trim();\n return (\n <Marker key={i} coordinates={[b.lng, b.lat]}>\n <g transform={`scale(${1 / k})`} style={{ cursor: 'pointer' }} onMouseEnter={(e) => onHover(e, label)} onMouseMove={(e) => onHover(e, label)} onMouseLeave={onLeave}>\n <circle r={r} fill={fillColor} opacity={0.45} />\n <circle r={r * 0.6} fill={fillColor} opacity={0.85} />\n </g>\n </Marker>\n );\n })}\n </>\n );\n}\n\nexport function MapBubblesCard({\n data,\n title,\n height = 340,\n minBubbleSize = 4,\n maxBubbleSize = 28,\n color,\n formatValue,\n loading = false,\n defaultZoom,\n center: centerProp,\n autoFit = true,\n geoUrl,\n}: MapBubblesProps) {\n const theme = useTheme();\n const bubbles = data?.rows ?? [];\n const [tooltip, setTooltip] = useState<{ x: number; y: number; text: string } | null>(null);\n const fmt = formatValue ?? formatCompact;\n const fillColor = color ?? resolveBiPalette(theme).series[0];\n const layers = useGeoLayers(geoUrl);\n\n const landFill = alpha(theme.palette.text.primary, 0.06);\n const landHover = alpha(theme.palette.text.primary, 0.09);\n const landStroke = theme.palette.divider;\n const overlayStroke = theme.palette.text.disabled;\n\n const maxVal = useMemo(() => Math.max(1, ...bubbles.map((b) => Math.abs(b.value))), [bubbles]);\n const viewport = useMemo(() => computeMapViewport(bubbles, { autoFit, defaultZoom, center: centerProp }), [bubbles, autoFit, defaultZoom, centerProp]);\n\n const handleHover = useCallback((e: React.MouseEvent, text: string) => {\n const svg = (e.currentTarget as Element).closest('svg');\n if (!svg) return;\n const rect = svg.getBoundingClientRect();\n setTooltip({ x: e.clientX - rect.left, y: e.clientY - rect.top, text });\n }, []);\n const clearTooltip = useCallback(() => setTooltip(null), []);\n\n if (loading) {\n return (\n <Box data-testid=\"loading\" sx={{ height: '100%', p: 2 }}>\n {title && <Skeleton variant=\"text\" width={180} sx={{ fontSize: '1.25rem', mb: 1 }} />}\n <Skeleton variant=\"rounded\" width=\"100%\" height={height} />\n </Box>\n );\n }\n\n const noInteraction = { default: { outline: 'none' }, hover: { outline: 'none' }, pressed: { outline: 'none' } } as const;\n\n return (\n <Box sx={{ height: '100%', p: 0.5, overflow: 'auto' }}>\n {title && <Typography variant=\"h6\" sx={{ mb: 1 }}>{title}</Typography>}\n <Box sx={{ position: 'relative' }}>\n <ComposableMap\n projection=\"geoMercator\"\n projectionConfig={{ scale: BASE_SCALE }}\n width={800}\n height={500}\n style={{ width: '100%', height: '100%', display: 'block', background: theme.palette.background.default, borderRadius: theme.shape.borderRadius }}\n >\n <ZoomableGroup center={viewport.center} zoom={viewport.zoom} minZoom={1} maxZoom={40}>\n {layers.map((url, idx) =>\n idx === 0 ? (\n <Geographies key={url} geography={url}>\n {({ geographies }) =>\n geographies.map((geo) => (\n <Geography key={geo.rsmKey} geography={geo} fill={landFill} stroke={landStroke} strokeWidth={0.5} style={{ ...noInteraction, hover: { outline: 'none', fill: landHover } }} />\n ))\n }\n </Geographies>\n ) : (\n <Geographies key={url} geography={url}>\n {({ geographies }) =>\n geographies.map((geo) => (\n <Geography key={geo.rsmKey} geography={geo} fill=\"none\" stroke={overlayStroke} strokeWidth={0.3} style={noInteraction} />\n ))\n }\n </Geographies>\n ),\n )}\n\n <BubbleMarkers bubbles={bubbles} maxVal={maxVal} minBubbleSize={minBubbleSize} maxBubbleSize={maxBubbleSize} fillColor={fillColor} fmt={fmt} onHover={handleHover} onLeave={clearTooltip} />\n </ZoomableGroup>\n </ComposableMap>\n\n {tooltip && (\n <Box\n sx={{\n position: 'absolute',\n left: tooltip.x,\n top: tooltip.y - 34,\n transform: 'translateX(-50%)',\n bgcolor: 'background.paper',\n color: 'text.primary',\n px: 1,\n py: 0.5,\n borderRadius: 1,\n fontSize: 12,\n pointerEvents: 'none',\n border: '1px solid',\n borderColor: 'divider',\n whiteSpace: 'nowrap',\n zIndex: 10,\n boxShadow: 2,\n }}\n >\n {tooltip.text}\n </Box>\n )}\n </Box>\n </Box>\n );\n}\n\nexport default MapBubblesCard;\n","import React, { useMemo, useState, useCallback } from 'react';\nimport { Box, Skeleton, Typography, useTheme } from '@mui/material';\nimport { alpha } from '@mui/material/styles';\nimport { ComposableMap, Geographies, Geography, Marker, ZoomableGroup, useMapContext, useZoomPanContext } from 'react-simple-maps';\nimport { formatCompact } from '../data/dataUtils';\nimport { BASE_SCALE, computeMapViewport } from './mapUtils';\nimport { useGeoLayers } from './geoLayers';\nimport { resolveBiPalette } from '../theme/createBiTheme';\n\nexport interface MapConnection {\n fromLat: number;\n fromLng: number;\n toLat: number;\n toLng: number;\n value?: number;\n label?: string;\n}\n\nexport interface MapConnectionsProps {\n data?: { rows: MapConnection[] };\n title?: string;\n height?: number;\n /** Arc colour; defaults to the second BI series colour. */\n color?: string;\n showEndpoints?: boolean;\n formatValue?: (value: number) => string;\n loading?: boolean;\n defaultZoom?: number;\n center?: [number, number];\n autoFit?: boolean;\n /** See `MapBubblesProps.geoUrl`. */\n geoUrl?: string | readonly string[];\n}\n\ninterface ProjectedConnection extends MapConnection {\n x1: number; y1: number; x2: number; y2: number;\n width: number;\n d: string;\n}\n\nfunction curvedPath(x1: number, y1: number, x2: number, y2: number): string {\n const mx = (x1 + x2) / 2;\n const my = Math.min(y1, y2) - Math.abs(x2 - x1) * 0.15;\n return `M${x1},${y1} Q${mx},${my} ${x2},${y2}`;\n}\n\nfunction ConnectionArcs({ connections, maxVal, strokeColor, hoveredIdx, onHover, onLeave }: {\n connections: MapConnection[];\n maxVal: number;\n strokeColor: string;\n hoveredIdx: number | null;\n onHover: (i: number, e: React.MouseEvent) => void;\n onLeave: () => void;\n}) {\n const { projection } = useMapContext();\n const { k } = useZoomPanContext();\n\n const lines = useMemo<ProjectedConnection[]>(\n () =>\n connections.map((c) => {\n const from = projection([c.fromLng, c.fromLat]);\n const to = projection([c.toLng, c.toLat]);\n const x1 = from?.[0] ?? 0;\n const y1 = from?.[1] ?? 0;\n const x2 = to?.[0] ?? 0;\n const y2 = to?.[1] ?? 0;\n const ratio = Math.abs(c.value ?? 1) / maxVal;\n const width = 1 + ratio * 3;\n return { ...c, x1, y1, x2, y2, width, d: curvedPath(x1, y1, x2, y2) };\n }),\n [connections, projection, maxVal],\n );\n\n return (\n <g>\n {lines.map((ln, i) => (\n <g key={i} onMouseEnter={(e) => onHover(i, e)} onMouseMove={(e) => onHover(i, e)} onMouseLeave={onLeave} style={{ cursor: 'pointer' }}>\n <path d={ln.d} fill=\"none\" stroke=\"transparent\" strokeWidth={(ln.width + 8) / k} />\n <path d={ln.d} fill=\"none\" stroke={strokeColor} strokeWidth={ln.width / k} opacity={hoveredIdx === i ? 0.9 : 0.4} strokeLinecap=\"round\" />\n </g>\n ))}\n </g>\n );\n}\n\nfunction EndpointMarkers({ connections, strokeColor }: { connections: MapConnection[]; strokeColor: string }) {\n const { k } = useZoomPanContext();\n return (\n <>\n {connections.map((c, i) => (\n <React.Fragment key={i}>\n <Marker coordinates={[c.fromLng, c.fromLat]}>\n <circle r={3 / k} fill={strokeColor} opacity={0.8} />\n </Marker>\n <Marker coordinates={[c.toLng, c.toLat]}>\n <circle r={3 / k} fill={strokeColor} opacity={0.8} />\n </Marker>\n </React.Fragment>\n ))}\n </>\n );\n}\n\nexport function MapConnectionsCard({\n data,\n title,\n height = 340,\n color,\n showEndpoints = true,\n formatValue,\n loading = false,\n defaultZoom,\n center: centerProp,\n autoFit = true,\n geoUrl,\n}: MapConnectionsProps) {\n const theme = useTheme();\n const connections = data?.rows ?? [];\n const [tooltip, setTooltip] = useState<{ x: number; y: number; text: string } | null>(null);\n const [hoveredIdx, setHoveredIdx] = useState<number | null>(null);\n const fmt = formatValue ?? formatCompact;\n const series = resolveBiPalette(theme).series;\n const strokeColor = color ?? series[1 % series.length];\n const layers = useGeoLayers(geoUrl);\n\n const landFill = alpha(theme.palette.text.primary, 0.06);\n const landHover = alpha(theme.palette.text.primary, 0.09);\n const landStroke = theme.palette.divider;\n const overlayStroke = theme.palette.text.disabled;\n\n const maxVal = useMemo(() => Math.max(1, ...connections.map((c) => Math.abs(c.value ?? 1))), [connections]);\n const allCoords = useMemo(() => connections.flatMap((c) => [{ lat: c.fromLat, lng: c.fromLng }, { lat: c.toLat, lng: c.toLng }]), [connections]);\n const viewport = useMemo(() => computeMapViewport(allCoords, { autoFit, defaultZoom, center: centerProp }), [allCoords, autoFit, defaultZoom, centerProp]);\n\n const handleArcHover = useCallback(\n (i: number, e: React.MouseEvent) => {\n const c = connections[i];\n const text = `${c.label ?? ''} ${c.value != null ? fmt(c.value) : ''}`.trim();\n if (!text) return;\n const svg = (e.currentTarget as Element).closest('svg');\n if (!svg) return;\n const rect = svg.getBoundingClientRect();\n setHoveredIdx(i);\n setTooltip({ x: e.clientX - rect.left, y: e.clientY - rect.top, text });\n },\n [connections, fmt],\n );\n const clearTooltip = useCallback(() => {\n setHoveredIdx(null);\n setTooltip(null);\n }, []);\n\n if (loading) {\n return (\n <Box data-testid=\"loading\" sx={{ height: '100%', p: 2 }}>\n {title && <Skeleton variant=\"text\" width={180} sx={{ fontSize: '1.25rem', mb: 1 }} />}\n <Skeleton variant=\"rounded\" width=\"100%\" height={height} />\n </Box>\n );\n }\n\n const noInteraction = { default: { outline: 'none' }, hover: { outline: 'none' }, pressed: { outline: 'none' } } as const;\n\n return (\n <Box sx={{ height: '100%', p: 2, overflow: 'auto' }}>\n {title && <Typography variant=\"h6\" sx={{ mb: 1 }}>{title}</Typography>}\n <Box sx={{ position: 'relative' }}>\n <ComposableMap\n projection=\"geoMercator\"\n projectionConfig={{ scale: BASE_SCALE }}\n width={800}\n style={{ width: '100%', height: '100%', display: 'block', background: theme.palette.background.default, borderRadius: theme.shape.borderRadius }}\n >\n <ZoomableGroup center={viewport.center} zoom={viewport.zoom} minZoom={1} maxZoom={40}>\n {layers.map((url, idx) =>\n idx === 0 ? (\n <Geographies key={url} geography={url}>\n {({ geographies }) =>\n geographies.map((geo) => (\n <Geography key={geo.rsmKey} geography={geo} fill={landFill} stroke={landStroke} strokeWidth={0.5} style={{ ...noInteraction, hover: { outline: 'none', fill: landHover } }} />\n ))\n }\n </Geographies>\n ) : (\n <Geographies key={url} geography={url}>\n {({ geographies }) =>\n geographies.map((geo) => (\n <Geography key={geo.rsmKey} geography={geo} fill=\"none\" stroke={overlayStroke} strokeWidth={0.3} style={noInteraction} />\n ))\n }\n </Geographies>\n ),\n )}\n\n <ConnectionArcs connections={connections} maxVal={maxVal} strokeColor={strokeColor} hoveredIdx={hoveredIdx} onHover={handleArcHover} onLeave={clearTooltip} />\n {showEndpoints && <EndpointMarkers connections={connections} strokeColor={strokeColor} />}\n </ZoomableGroup>\n </ComposableMap>\n\n {tooltip && (\n <Box\n sx={{\n position: 'absolute',\n left: tooltip.x,\n top: tooltip.y - 34,\n transform: 'translateX(-50%)',\n bgcolor: 'background.paper',\n color: 'text.primary',\n px: 1,\n py: 0.5,\n borderRadius: 1,\n fontSize: 12,\n pointerEvents: 'none',\n border: '1px solid',\n borderColor: 'divider',\n whiteSpace: 'nowrap',\n zIndex: 10,\n boxShadow: 2,\n }}\n >\n {tooltip.text}\n </Box>\n )}\n </Box>\n </Box>\n );\n}\n\nexport default MapConnectionsCard;\n","/**\n * Simplified equirectangular world map for dashboard visualizations.\n * Coordinates: viewBox 0 0 1000 500, where x = (lng+180)/360*1000, y = (90-lat)/180*500.\n */\n\nfunction ll(lat: number, lng: number): [number, number] {\n return [(lng + 180) / 360 * 1000, (90 - lat) / 180 * 500];\n}\n\nfunction toPath(coords: [number, number][]): string {\n return coords.map(([x, y], i) => `${i === 0 ? 'M' : 'L'}${x.toFixed(0)},${y.toFixed(0)}`).join(' ') + ' Z';\n}\n\nconst northAmerica = toPath([\n ll(70, -165), ll(72, -140), ll(73, -100), ll(70, -80), ll(65, -60),\n ll(50, -55), ll(44, -65), ll(40, -73), ll(30, -80), ll(25, -80),\n ll(18, -88), ll(15, -92), ll(18, -105), ll(25, -110), ll(32, -117),\n ll(48, -125), ll(55, -130), ll(60, -140), ll(60, -165),\n]);\n\nconst southAmerica = toPath([\n ll(12, -75), ll(10, -60), ll(5, -52), ll(0, -50), ll(-5, -35),\n ll(-15, -38), ll(-23, -42), ll(-33, -52), ll(-42, -63), ll(-55, -68),\n ll(-50, -75), ll(-40, -73), ll(-18, -70), ll(-5, -77), ll(5, -77),\n]);\n\nconst europe = toPath([\n ll(36, -10), ll(38, 0), ll(43, 5), ll(48, -5), ll(51, -10),\n ll(55, -7), ll(58, 5), ll(55, 15), ll(56, 25), ll(60, 30),\n ll(70, 30), ll(70, 15), ll(65, 10), ll(56, 10), ll(52, 5),\n ll(48, 5), ll(44, 10), ll(40, 10), ll(38, 0), ll(36, -5),\n]);\n\nconst africa = toPath([\n ll(35, -10), ll(37, 10), ll(32, 32), ll(30, 33), ll(20, 38),\n ll(12, 44), ll(5, 42), ll(-5, 40), ll(-12, 45), ll(-25, 35),\n ll(-35, 20), ll(-34, 18), ll(-25, 15), ll(-15, 12), ll(-5, 10),\n ll(5, -5), ll(10, -15), ll(15, -17), ll(22, -17), ll(28, -13),\n]);\n\nconst asia = toPath([\n ll(70, 30), ll(72, 60), ll(75, 100), ll(72, 130), ll(65, 170),\n ll(55, 165), ll(50, 140), ll(45, 130), ll(35, 130), ll(30, 120),\n ll(22, 115), ll(10, 105), ll(5, 100), ll(8, 80), ll(12, 75),\n ll(25, 68), ll(28, 60), ll(30, 48), ll(32, 36), ll(38, 28),\n ll(42, 28), ll(48, 40), ll(55, 38), ll(60, 30),\n]);\n\nconst australia = toPath([\n ll(-12, 130), ll(-15, 140), ll(-20, 148), ll(-28, 153),\n ll(-35, 150), ll(-38, 145), ll(-35, 137), ll(-32, 130),\n ll(-25, 115), ll(-22, 115), ll(-15, 122),\n]);\n\nexport const CONTINENT_PATHS = [northAmerica, southAmerica, europe, africa, asia, australia];\n\nexport const MAP_VIEWBOX = '0 0 1000 500';\n\nexport function latLngToXY(lat: number, lng: number): [number, number] {\n return ll(lat, lng);\n}\n"],"names":["MetricCard","currentValue","previousValue","prefix","suffix","differenceStyle","description","icon","label","formatValue","loading","bi","useBiPalette","fmt","formatCompact","naked","useChartContext","Box","jsxs","Stack","jsx","Skeleton","change","percentChange","diff","changeDisplay","arrow","trendArrow","changeColor","Typography","__name","MetricGroupCard","title","metrics","columns","_","i","props","ARC_START","ARC_END","R","CX","CY","STROKEWIDTH","viewBoxWidth","viewBoxHeight","polarToXY","angle","describeArc","startAngle","endAngle","sx","sy","ex","ey","large","GaugeSvg","zones","ratio","needleColor","strokeWidth","textPrimaryColor","textSecondaryColor","elementsClass","min","max","valueComponent","className","strokeLinecap","needleAngle","nx","ny","zone","prevVal","segStart","segEnd","GaugeCard","value","thresholds","theme","useTheme","skeleton","range","_a","z","GaugeGroup","g","warned","warnIfMuiXLicenseMissing","key","_b","LicenseInfo","resolveFormatter","format","v","toStr","formatNumber","formatCurrency","formatPercent","formatBoolean","formatDate","isActiveFilterItem","item","ServerExportToolbar","onCsvExport","onXlsxExport","onClearFilters","exporting","apiRef","useGridApiContext","filterModel","useGridSelector","gridFilterModelSelector","hasActiveFilters","GridToolbarContainer","GridToolbarColumnsButton","GridToolbarFilterButton","GridToolbarDensitySelector","Button","FilterAltOffIcon","GridToolbarExportContainer","MenuItem","DownloadIcon","TableViewIcon","CHAR_WIDTH_PX","HEADER_PADDING_PX","MIN_COL_WIDTH","estimateHeaderWidth","toGridColumns","autoFitHeaders","col","formatter","baseMinWidth","minWidth","def","selectDef","getGridSingleSelectOperators","op","DataTableCard","data","lazyData","schema","getRowClassName","striped","stripedColorEven","stripedColorOdd","getRowHeight","headerColor","pageSize","dense","initialPinnedColumns","containerRef","React","isLazy","useEffect","initialPageSize","paginationModel","setPaginationModel","useState","useMemo","source","lazyGetRows","dataSource","containerHeight","useContainerMeasurements","gridColumns","downloadCsv","downloadXlsx","isExporting","notice","setNotice","runExport","fn","formatLabel","err","lazyApiRef","toolbarSlotProps","initialState","state","rows","row","evenStripe","oddStripe","headerBg","alpha","DataGridPro","params","result","gridClasses","Snackbar","Alert","CircularProgress","multiplier","minHeight","setContainerHeight","timeoutRef","useRef","getParentGridCard","element","refElement","target","observer","entries","height","prev","defaultXFormatter","chartShade","baseColor","index","total","minAlpha","maxAlpha","t","a","ChartCard","type","xAxis","series","stacked","showLegend","showGrid","showTooltip","formatXAxis","formatYAxis","xAxisConfig","yAxisConfig","maxSlices","paletteOverride","backgroundColor","gridColorOverride","chartData","fmtY","axisColor","gridColor","xKey","resolveAxisProps","cfg","defaults","tickFill","tickFs","MAX_LENGTH_LABEL","truncateLabel","tooltipStyle","chartDefaults","useChartCardDefaults","palette","resolveBiPalette","monoShade","rotateBase","slotIndex","pickPaletteColor","RADIAN","renderCustomizedLabel","cx","cy","midAngle","innerRadius","outerRadius","percent","fill","radius","ncx","x","y","labelFill","seriesColors","s","useMonoShadeBars","pieData","raw","sorted","b","top","othersTotal","sum","d","useContainerRectangle","ResponsiveContainer","PieChart","Pie","Cell","Tooltip","Legend","ScatterChart","CartesianGrid","XAxis","YAxis","Scatter","chartType","isHorizontal","forceStacked","ChartComp","ComposedChart","BarChart","AreaChart","LineChart","layout","effectiveStacked","resolveSeriesType","Fragment","color","seriesType","Bar","ri","Area","Line","CustomContent","width","name","size","strokeColor","labelFor","labelColor","TreeMapCard","nameKey","valueKey","treeData","Treemap","BASE_SCALE","BASE_LNG_SPAN","BASE_LAT_SPAN","computeMapViewport","coords","opts","autoFit","defaultZoom","userCenter","lats","c","lngs","minLat","maxLat","minLng","maxLng","center","padding","latSpan","lngSpan","zoomByLat","zoomByLng","zoom","GEO_URL_WORLD","GEO_URL_BRAZIL_STATES","GEO_URL_BRAZIL_MUNICIPALITIES","brazilGeoLayers","worldGeoLayers","GeoLayersContext","createContext","GeoLayersProvider","useGeoLayers","override","fromContext","useContext","BubbleMarkers","bubbles","maxVal","minBubbleSize","maxBubbleSize","fillColor","onHover","onLeave","k","useZoomPanContext","r","Marker","e","MapBubblesCard","centerProp","geoUrl","tooltip","setTooltip","layers","landFill","landHover","landStroke","overlayStroke","viewport","handleHover","useCallback","text","svg","rect","clearTooltip","noInteraction","ComposableMap","ZoomableGroup","url","idx","Geographies","geographies","geo","Geography","curvedPath","x1","y1","x2","y2","mx","my","ConnectionArcs","connections","hoveredIdx","projection","useMapContext","lines","from","to","ln","EndpointMarkers","MapConnectionsCard","showEndpoints","setHoveredIdx","allCoords","handleArcHover","ll","lat","lng","toPath","northAmerica","southAmerica","europe","africa","asia","australia","CONTINENT_PATHS","MAP_VIEWBOX","latLngToXY"],"mappings":";;;;;;;;;;;;;;;;;;AAmBO,SAASA,GAAW;AAAA,EACvB,cAAAC;AAAA,EACA,eAAAC;AAAA,EACA,QAAAC,IAAS;AAAA,EACT,QAAAC,IAAS;AAAA,EACT,iBAAAC,IAAkB;AAAA,EAClB,aAAAC;AAAA,EACA,MAAAC;AAAA,EACA,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,SAAAC,IAAU;AACd,GAAoB;AAChB,QAAMC,IAAKC,GAAA,GACLC,IAAMJ,KAAeK,IACrB,EAAE,OAAAC,EAAA,IAAUC,GAAA,KAAqB,CAAA;AAEvC,MAAIN;AACA,6BACKO,GAAA,EAAI,eAAY,WAAU,IAAI,EAAE,QAAQ,QAAQ,GAAG,KAChD,UAAA,gBAAAC,EAACC,MAAM,SAAS,GAAG,IAAI,EAAE,QAAQ,UAC7B,UAAA;AAAA,MAAA,gBAAAC,EAACC,GAAA,EAAS,SAAQ,QAAO,OAAO,KAAK,IAAI,EAAE,UAAU,UAAA,EAAU,CAAG;AAAA,MAClE,gBAAAD,EAACH,KAAI,IAAI,EAAE,MAAM,GAAG,SAAS,QAAQ,YAAY,SAAA,GAC7C,4BAACI,GAAA,EAAS,SAAQ,QAAO,OAAM,OAAM,IAAI,EAAE,UAAU,SAAA,EAAS,CAAG,EAAA,CACrE;AAAA,MACA,gBAAAD,EAACC,GAAA,EAAS,SAAQ,QAAO,OAAO,KAAK,IAAI,EAAE,UAAU,aAAW,CAAG;AAAA,IAAA,EAAA,CACvE,EAAA,CACJ;AAIR,QAAMC,IAASpB,KAAiB,OAAOqB,GAAcrB,GAAeD,CAAY,IAAI,MAC9EuB,IAAOtB,KAAiB,OAAOD,IAAeC,IAAgB,MAE9DuB,IAAgBH,KAAU,OAC1BjB,MAAoB,eAChB,IAAIiB,IAAS,KAAK,QAAQ,CAAC,CAAC,MAC5B,GAAGnB,CAAM,GAAGU,EAAIW,CAAK,CAAC,GAAGpB,CAAM,KACnC,MAEAsB,IAAQF,KAAQ,OAAOG,GAAWH,CAAI,IAAI,MAC1CI,IAAcJ,KAAQ,OAAQA,IAAO,IAAIb,EAAG,WAAWa,IAAO,IAAIb,EAAG,WAAWA,EAAG,UAAW;AAEpG,SACI,gBAAAS,EAACH,KAAI,WAAU,kBAAiB,IAAI,EAAE,QAAQ,QAAQ,GAAG,GAAG,cAAc,YACtE,UAAA,gBAAAC,EAACC,IAAA,EAAM,SAAS,GAAG,IAAI,EAAE,QAAQ,OAAA,GAAU,cAAa,UACnD,UAAA;AAAA,IAAAX,KAASO,uBACLI,IAAA,EAAM,WAAU,OAAM,SAAS,GAAG,YAAW,UACzC,UAAA;AAAA,MAAAZ,uBACIU,GAAA,EAAI,IAAI,EAAE,OAAO,gBAAgB,SAAS,QAAQ,YAAY,SAAA,GAC3D,UAAA,gBAAAG,EAACS,GAAA,EAAW,SAAQ,SAAS,aAAK,GACtC;AAAA,MAEJ,gBAAAT,EAACS,GAAA,EAAW,SAAQ,SAAQ,OAAM,kBAAiB,IAAI,EAAE,eAAe,KAAK,YAAY,KAAK,UAAU,OAAA,GACnG,UAAArB,EAAA,CACL;AAAA,IAAA,GACJ;AAAA,IAGJ,gBAAAY,EAACH,GAAA,EAAI,IAAI,EAAE,MAAM,GAAG,SAAS,QAAQ,YAAY,UAAU,UAAU,QAAQ,gBAAgB,SAAA,GACzF,UAAA,gBAAAC,EAACW,GAAA,EAAW,SAAQ,MAAK,IAAI,EAAE,YAAY,KAAK,UAAU,QAAQ,eAAe,KAAA,GAC5E,UAAA;AAAA,MAAA1B;AAAA,MAAQU,EAAIZ,CAAY;AAAA,MAAGG;AAAA,IAAA,EAAA,CAChC,EAAA,CACJ;AAAA,IAECqB,KACG,gBAAAP,EAACC,IAAA,EAAM,WAAU,OAAM,SAAS,KAAK,YAAW,UAAS,gBAAe,UACpE,UAAA;AAAA,MAAA,gBAAAD,EAACW,GAAA,EAAW,SAAQ,SAAQ,WAAU,oBAAmB,IAAI,EAAE,OAAOD,GAAa,YAAY,IAAA,GAC1F,UAAA;AAAA,QAAAF;AAAA,QAAM;AAAA,QAAED;AAAA,MAAA,GACb;AAAA,MACCvB,KAAiB,QACd,gBAAAgB,EAACW,KAAW,SAAQ,WAAU,OAAM,kBAAiB,UAAA;AAAA,QAAA;AAAA,QAC7C1B;AAAA,QAAQU,EAAIX,CAAa;AAAA,QAAGE;AAAA,MAAA,EAAA,CACpC;AAAA,IAAA,GAER;AAAA,IAGHE,KACG,gBAAAc,EAACS,GAAA,EAAW,SAAQ,WAAU,OAAM,kBAAiB,IAAI,EAAE,SAAS,IAAA,GAC/D,UAAAvB,EAAA,CACL;AAAA,EAAA,EAAA,CAER,EAAA,CACJ;AAER;AArFgBwB,EAAA9B,IAAA;ACPT,SAAS+B,GAAgB,EAAE,OAAAC,GAAO,SAAAC,GAAS,SAAAC,IAAU,GAAG,SAAAxB,IAAU,MAA+B;AACpG,SAAIA,IAEI,gBAAAQ,EAACD,GAAA,EAAI,eAAY,WAAU,IAAI,EAAE,QAAQ,QAAQ,GAAG,EAAA,GAC/C,UAAA;AAAA,IAAAe,KAAS,gBAAAZ,EAACC,GAAA,EAAS,SAAQ,QAAO,OAAO,KAAK,IAAI,EAAE,UAAU,WAAW,IAAI,EAAA,EAAE,CAAG;AAAA,IACnF,gBAAAD,EAACH,GAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,qBAAqB,UAAUiB,CAAO,UAAU,KAAK,EAAA,GAC5E,gBAAM,KAAK,EAAE,QAAQA,EAAA,CAAS,EAAE,IAAI,CAACC,GAAGC,MACrC,gBAAAlB,EAACC,IAAA,EAAc,SAAS,GAAG,IAAI,EAAE,GAAG,KAChC,UAAA;AAAA,MAAA,gBAAAC,EAACC,GAAA,EAAS,SAAQ,QAAO,OAAO,IAAI,IAAI,EAAE,UAAU,UAAA,EAAU,CAAG;AAAA,MACjE,gBAAAD,EAACC,GAAA,EAAS,SAAQ,QAAO,OAAM,OAAM,IAAI,EAAE,UAAU,OAAA,EAAO,CAAG;AAAA,MAC/D,gBAAAD,EAACC,GAAA,EAAS,SAAQ,QAAO,OAAO,KAAK,IAAI,EAAE,UAAU,YAAU,CAAG;AAAA,IAAA,EAAA,GAH1De,CAIZ,CACH,EAAA,CACL;AAAA,EAAA,GACJ,IAKJ,gBAAAlB,EAACD,KAAI,IAAI,EAAE,QAAQ,QAAQ,GAAG,KACzB,UAAA;AAAA,IAAAe,KACG,gBAAAZ,EAACS,KAAW,SAAQ,MAAK,IAAI,EAAE,IAAI,EAAA,GAC9B,UAAAG,EAAA,CACL;AAAA,IAEJ,gBAAAZ,EAACH,GAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,qBAAqB,UAAUiB,CAAO,UAAU,KAAK,KAC5E,UAAAD,EAAQ,IAAI,CAACI,GAAOD,MACjB,gBAAAhB,EAACpB,MAAoB,GAAGqC,KAAPD,CAAc,CAClC,EAAA,CACL;AAAA,EAAA,GACJ;AAER;AAhCgBN,EAAAC,IAAA;ACWhB,MAAMO,KAAY,KAAK,IACjBC,KAAU,IAAI,KAAK,IACnBC,IAAI,IACJC,KAAKD,IAAI,IACTE,KAAKF,IAAI,IACTG,KAAc,IAEdC,KAAe,IAAIJ,IAAIG,KAAc,IACrCE,KAAgBL,IAAI;AAE1B,SAASM,GAAUC,GAAiC;AAChD,SAAO,CAACN,KAAKD,IAAI,KAAK,IAAIO,CAAK,GAAGL,KAAKF,IAAI,KAAK,IAAIO,CAAK,CAAC;AAC9D;AAFSjB,EAAAgB,IAAA;AAIT,SAASE,GAAYC,GAAoBC,GAA0B;AAC/D,QAAM,CAACC,GAAIC,CAAE,IAAIN,GAAUG,CAAU,GAC/B,CAACI,GAAIC,CAAE,IAAIR,GAAUI,CAAQ,GAC7BK,IAAQL,IAAWD,IAAa,KAAK,KAAK,IAAI;AACpD,SAAO,KAAKE,CAAE,IAAIC,CAAE,MAAMZ,CAAC,IAAIA,CAAC,MAAMe,CAAK,MAAMF,CAAE,IAAIC,CAAE;AAC7D;AALSxB,EAAAkB,IAAA;AAsBT,SAASQ,GAAS,EAAE,OAAAC,GAAO,OAAAC,GAAO,aAAAC,GAAa,aAAAC,GAAa,kBAAAC,GAAkB,oBAAAC,GAAoB,eAAAC,GAAe,KAAAC,GAAK,KAAAC,GAAK,gBAAAC,GAAgB,WAAAC,GAAW,eAAAC,IAAgB,WAA0B;AAC5L,QAAMC,IAAc/B,KAAYoB,KAASnB,KAAUD,KAC7C,CAACgC,GAAIC,CAAE,IAAIzB,GAAUuB,CAAW;AAEtC,2BACK,OAAA,EAAI,WAAAF,GAAsB,GAAE,KAAI,GAAE,KAAI,SAAS,OAAOvB,EAAY,IAAIC,EAAa,IAAI,OAAM,QAAO,QAAO,QAAO,qBAAoB,iBAClI,UAAA;AAAA,IAAAY,EAAM,IAAI,CAACe,GAAMpC,MAAM;AACpB,YAAMqC,IAAU,KAAK,IAAIrC,IAAI,IAAIqB,EAAMrB,IAAI,CAAC,EAAE,QAAQ,GAAG,CAAC,GACpDsC,IAAWpC,KAAYmC,KAAWlC,KAAUD,KAC5CqC,IAAS,KAAK,IAAIrC,KAAYkC,EAAK,SAASjC,KAAUD,KAAYC,EAAO;AAC/E,aACI,gBAAAnB;AAAA,QAAC;AAAA,QAAA;AAAA,UACG,WAAW2C;AAAA,UAEX,GAAGf,GAAY0B,GAAUC,CAAM;AAAA,UAC/B,MAAK;AAAA,UACL,QAAQH,EAAK;AAAA,UACb,aAAAZ;AAAA,UACA,eAAexB,MAAMqB,EAAM,SAAS,IAAI,UAAUW;AAAA,QAAA;AAAA,QAL7ChC;AAAA,MAAA;AAAA,IAQjB,CAAC;AAAA,IAEAsB,IAAQ,QACL,gBAAAtC,EAAC,QAAA,EAAK,WAAW2C,GAAe,GAAGf,GAAYV,IAAW+B,CAAW,GAAG,MAAK,QAAO,QAAQV,GAAa,aAAAC,GAA0B,eAAc,SAAQ;AAAA,sBAG5J,QAAA,EAAK,WAAWG,GAAe,IAAItB,IAAI,IAAIC,IAAI,IAAI4B,GAAI,IAAIC,GAAI,QAAQV,GAAkB,aAAa,KAAK,eAAc,SAAQ;AAAA,IAClI,gBAAAzC,EAAC,UAAA,EAAO,WAAW2C,GAAe,IAAItB,IAAI,IAAIC,IAAI,GAAG,GAAG,MAAMmB,EAAA,CAAkB;AAAA,IAEhF,gBAAAzC,EAAC,QAAA,EAAK,GAAGqB,IAAI,GAAGC,KAAK,IAAI,YAAW,UAAS,MAAMmB,GAAkB,UAAS,MAAK,YAAW,QACzF,UAAAK,GACL;AAAA,IAEA,gBAAA9C,EAAC,QAAA,EAAK,GAAGqB,KAAKD,GAAG,GAAGE,KAAK,IAAI,YAAW,OAAM,MAAMoB,GAAoB,UAAS,KAC5E,UAAAE,GACL;AAAA,IACA,gBAAA5C,EAAC,QAAA,EAAK,GAAGqB,KAAKD,IAAI,IAAI,GAAGE,KAAK,IAAI,YAAW,SAAQ,MAAMoB,GAAoB,UAAS,KACnF,UAAAG,EAAA,CACL;AAAA,EAAA,GACJ;AAER;AA1CSnC,EAAA0B,IAAA;AA4CF,SAASoB,GAAU,EAAE,OAAAC,GAAO,KAAAb,IAAM,GAAG,KAAAC,IAAM,KAAK,OAAAzD,GAAO,QAAAL,IAAS,IAAI,QAAAC,IAAS,IAAI,YAAA0E,GAAY,aAAArE,GAAa,SAAAC,IAAU,MAAyB;;AAChJ,QAAMqE,IAAQC,GAAA,GACRnE,IAAMJ,KAAeK;AAE3B,MAAIJ,GAAS;AACT,UAAMuE,IAAWF,EAAM,QAAQ,OAAO;AACtC,6BACK9D,GAAA,EAAI,WAAU,mCAAkC,eAAY,WAAU,IAAI,EAAE,QAAQ,QAAQ,GAAG,GAAG,SAAS,QAAQ,eAAe,UAAU,YAAY,YACrJ,UAAA,gBAAAG;AAAA,MAACoC;AAAA,MAAA;AAAA,QACG,WAAU;AAAA,QACV,eAAc;AAAA,QACd,OAAO,CAAC,EAAE,OAAOyB,GAAU,OAAO,QAAQ,EAAE,OAAOA,GAAU,OAAO,OAAO,EAAE,OAAOA,GAAU,OAAO,GAAG;AAAA,QACxG,OAAO;AAAA,QACP,eAAc;AAAA,QACd,aAAY;AAAA,QACZ,aAAa;AAAA,QACb,kBAAkBF,EAAM,QAAQ,KAAK;AAAA,QACrC,oBAAoBA,EAAM,QAAQ,KAAK;AAAA,QACvC,KAAI;AAAA,QACJ,KAAI;AAAA,QACJ,gBAAe;AAAA,MAAA;AAAA,IAAA,GAEvB;AAAA,EAER;AAEA,QAAMG,IAAQjB,IAAMD,KAAO,GACrBN,IAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,IAAImB,IAAQb,KAAOkB,CAAK,CAAC,GAEtDzB,IAAQqB,KAAc;AAAA,IACxB,EAAE,OAAO,MAAM,OAAOC,EAAM,QAAQ,MAAM,KAAA;AAAA,IAC1C,EAAE,OAAO,MAAM,OAAOA,EAAM,QAAQ,QAAQ,KAAA;AAAA,IAC5C,EAAE,OAAO,GAAK,OAAOA,EAAM,QAAQ,QAAQ,KAAA;AAAA,EAAK;AAGpD,MAAIpB,MAAcwB,IAAA1B,EAAMA,EAAM,SAAS,CAAC,MAAtB,gBAAA0B,EAAyB,UAASJ,EAAM,QAAQ,QAAQ;AAC1E,aAAWK,KAAK3B;AACZ,QAAIC,KAAS0B,EAAE,OAAO;AAClB,MAAAzB,IAAcyB,EAAE;AAChB;AAAA,IACJ;AAGJ,2BACKnE,GAAA,EAAI,IAAI,EAAE,UAAU,YAAY,GAAG,GAAG,QAAQ,QAAQ,GAAG,GAAG,SAAS,QAAQ,eAAe,UAAU,YAAY,YAC9G,UAAA;AAAA,IAAAT,KACG,gBAAAY,EAACH,KAAI,IAAI,EAAE,UAAU,YAAY,KAAK,KAAK,MAAM,GAAA,GAC7C,4BAACY,GAAA,EAAW,SAAQ,YAAW,OAAM,kBAAiB,IAAI,EAAE,eAAe,IAAA,GACtE,UAAArB,EAAA,CACL,EAAA,CACJ;AAAA,sBAGHS,GAAA,EAAI,IAAI,EAAE,SAAS,eAAe,IAAI,GAAG,YAAY,UAAU,OAAO,QAAQ,QAAQ,WAAW,cAAc,YAC5G,UAAA,gBAAAG;AAAA,MAACoC;AAAA,MAAA;AAAA,QACG,OAAAC;AAAA,QACA,OAAAC;AAAA,QACA,aAAAC;AAAA,QACA,aAAa;AAAA,QACb,kBAAkBoB,EAAM,QAAQ,KAAK;AAAA,QACrC,oBAAoBA,EAAM,QAAQ,KAAK;AAAA,QACvC,KAAKlE,EAAImD,CAAG;AAAA,QACZ,KAAKnD,EAAIoD,CAAG;AAAA,QACZ,gBAAgB,GAAG9D,CAAM,GAAGU,EAAIgE,CAAK,CAAC,GAAGzE,CAAM;AAAA,MAAA;AAAA,IAAA,EACnD,CACJ;AAAA,EAAA,GACJ;AAER;AApEgB0B,EAAA8C,IAAA;AC1FT,MAAMS,KAAwC,gBAAAvD,EAAA,CAACO,MAClD,gBAAAnB,EAAC,SAAI,OAAO,EAAE,QAAQ,OAAA,GAClB,UAAA;AAAA,EAAA,gBAAAE,EAACD,IAAA,EAAM,WAAU,OAAM,KAAK,GAAG,IAAI,EAAE,QAAQ,UACxC,UAAAkB,EAAM,OAAO,IAAI,CAACiD,GAAGlD,MAClB,gBAAAhB,EAAC,OAAA,EAAsB,eAAbkE,EAAE,OAAOlD,CAAM,CAC5B,EAAA,CACL;AAAA,EACCC,EAAM,YACH,gBAAAjB,EAAC,OAAA,EAAI,WAAU,kBACX,UAAA,gBAAAA,EAAC,SAAA,EAAO,UAAAiB,EAAM,SAAA,CAAS,EAAA,CAC3B;AAAA,EAAA,CAER,GAZiD;ACXrD,IAAIkD,KAAS;AAQN,SAASC,KAAiC;;AAC7C,MAAID,GAAQ;AACZ,EAAAA,KAAS;AACT,MAAIE;AACJ,MAAI;AACA,IAAAA,KAAMC,KAAAP,IAAAQ,IAAY,kBAAZ,gBAAAD,EAAA,KAAAP;AAAA,EACV,QAAQ;AACJ,IAAAM,IAAM;AAAA,EACV;AACA,EAAKA,KACD,QAAQ;AAAA,IACJ;AAAA,EAAA;AAKZ;AAhBgB3D,EAAA0D,IAAA;ACuEhB,SAASI,GAAiBC,GAA6E;AACnG,MAAKA,GACL;AAAA,QAAI,OAAOA,KAAW,WAAY,QAAOA;AACzC,YAAQA,GAAA;AAAA,MACJ,KAAK;AAAW,eAAO,CAACC,MAAOA,KAAK,QAAQ,OAAOA,KAAM,WAAWhF,GAAcgF,CAAC,IAAIC,GAAMD,CAAC;AAAA,MAC9F,KAAK;AAAU,eAAO,CAACA,MAAOA,KAAK,QAAQ,OAAOA,KAAM,WAAWE,GAAaF,CAAC,IAAIC,GAAMD,CAAC;AAAA,MAC5F,KAAK;AAAY,eAAO,CAACA,MAAOA,KAAK,QAAQ,OAAOA,KAAM,WAAWG,GAAeH,CAAC,IAAIC,GAAMD,CAAC;AAAA,MAChG,KAAK;AAAW,eAAO,CAACA,MAAOA,KAAK,QAAQ,OAAOA,KAAM,WAAWI,GAAcJ,CAAC,IAAIC,GAAMD,CAAC;AAAA,MAC9F,KAAK;AAAS,eAAO,CAACA,MAAOA,KAAK,QAAQ,OAAOA,KAAM,YAAYK,GAAcL,CAAC,IAAIC,GAAMD,CAAC;AAAA,MAC7F,KAAK;AAAQ,eAAO,CAACA,MAAOA,aAAa,OAAOM,GAAWN,CAAC,IAAIC,GAAMD,CAAC;AAAA,IAAA;AAAA;AAE/E;AAXShE,EAAA8D,IAAA;AAyBT,SAASS,GAAmBC,GAA+B;AACvD,SAAIA,EAAK,aAAa,aAAaA,EAAK,aAAa,eAAqB,KACtE,MAAM,QAAQA,EAAK,KAAK,IAAUA,EAAK,MAAM,SAAS,IACnDA,EAAK,UAAU,UAAaA,EAAK,UAAU,QAAQA,EAAK,UAAU;AAC7E;AAJSxE,EAAAuE,IAAA;AAMT,SAASE,GAAoB,EAAE,aAAAC,GAAa,cAAAC,GAAc,gBAAAC,GAAgB,WAAAC,KAAuC;;AAC7G,QAAMC,IAASC,GAAA,GACTC,IAAcC,GAAgBH,GAAQI,EAAuB,GAC7DC,MAAoBH,KAAA,gBAAAA,EAAa,UAAS,CAAA,GAAI,KAAKT,EAAkB,QAAMlB,IAAA2B,KAAA,gBAAAA,EAAa,sBAAb,gBAAA3B,EAAgC,WAAU,KAAK;AAEhI,2BACK+B,IAAA,EACG,UAAA;AAAA,IAAA,gBAAA9F,EAAC+F,IAAA,EAAyB;AAAA,sBACzBC,IAAA,EAAwB;AAAA,sBACxBC,IAAA,EAA2B;AAAA,IAC3BX,KAAkBO,KACf,gBAAA7F,EAACkG,MAAO,MAAK,SAAQ,WAAW,gBAAAlG,EAACmG,IAAA,EAAiB,UAAS,SAAQ,GAAI,SAASb,GAAgB,IAAI,EAAE,eAAe,OAAA,GAAU,UAAA,kBAE/H;AAAA,sBAEHc,IAAA,EAEI,UAAA;AAAA,MAAAhB,KACG,gBAAAtF,EAACuG,IAAA,EAA0B,UAAUd,GAAW,SAASH,GACrD,UAAA;AAAA,QAAA,gBAAApF,EAACsG,MAAa,UAAS,SAAQ,OAAO,EAAE,aAAa,KAAK;AAAA,QAAE;AAAA,MAAA,EAAA,GADlD,YAGd;AAAA,MAEHjB,KACG,gBAAAvF,EAACuG,IAAA,EAA2B,UAAUd,GAAW,SAASF,GACtD,UAAA;AAAA,QAAA,gBAAArF,EAACuG,MAAc,UAAS,SAAQ,OAAO,EAAE,aAAa,KAAK;AAAA,QAAE;AAAA,MAAA,EAAA,GADnD,aAGd;AAAA,IAAA,EAAA,CAER;AAAA,EAAA,GACJ;AAER;AAhCS7F,EAAAyE,IAAA;AAkCT,MAAMqB,KAAgB,IAChBC,KAAoB,IACpBC,KAAgB;AAEtB,SAASC,GAAoBvH,GAAuB;AAChD,SAAO,KAAK,IAAIsH,IAAetH,EAAM,SAASoH,KAAgBC,EAAiB;AACnF;AAFS/F,EAAAiG,IAAA;AAIT,SAASC,GAAc9F,GAA4B+F,GAAuC;AACtF,SAAO/F,EAAQ,IAAI,CAACgG,MAAQ;AACxB,UAAMC,IAAYvC,GAAiBsC,EAAI,MAAM,GACvC1H,IAAQ0H,EAAI,SAASA,EAAI,OACzBE,IAAeF,EAAI,YAAYJ,IAC/BO,IAAWJ,IAAiB,KAAK,IAAIG,GAAcL,GAAoBvH,CAAK,CAAC,IAAI4H,GAEjFE,IAAkB;AAAA,MACpB,OAAOJ,EAAI;AAAA,MACX,YAAY1H;AAAA,MACZ,OAAO0H,EAAI;AAAA,MACX,aAAaA,EAAI;AAAA,MACjB,iBAAiBA,EAAI,mBAAmB;AAAA,MACxC,OAAOA,EAAI;AAAA,MACX,UAAAG;AAAA,MACA,UAAUH,EAAI,aAAa;AAAA,MAC3B,YAAYA,EAAI,eAAe;AAAA,MAC/B,MAAMA,EAAI,QAAQ,SAAY;AAAA,MAC9B,eAAeA,EAAI;AAAA,MACnB,YAAYA,EAAI;AAAA,MAChB,cAAcA,EAAI;AAAA,IAAA;AAGtB,QADIC,MAAWG,EAAI,iBAAiB,CAACzD,MAAmBsD,EAAUtD,CAAK,IACnEqD,EAAI,SAAS,gBAAgB;AAC7B,YAAMK,IAAYD;AAClB,MAAAC,EAAU,OAAO,gBACjBA,EAAU,eAAeL,EAAI,cACzBA,EAAI,wBACJK,EAAU,kBAAkBC,KAA+B,OAAO,CAACC,MAA2BA,EAAG,UAAU,SAAS;AAAA,IAE5H;AACA,WAAOH;AAAA,EACX,CAAC;AACL;AAjCSxG,EAAAkG,IAAA;AAqCF,SAASU,GAAkD;AAAA,EAC9D,MAAAC;AAAA,EACA,UAAAC;AAAA,EACA,QAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,OAAA9G;AAAA,EACA,SAAA+G;AAAA,EACA,kBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,aAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,SAAA3I,IAAU;AAAA,EACV,gBAAAuH,IAAiB;AAAA,EACjB,sBAAAqB;AACJ,GAA+B;AAC3B,QAAMvE,IAAQC,GAAA,GACRuE,IAAeC,GAAM,OAA8B,IAAI,GACvDC,IAAS,CAAC,CAACb;AAEjB,EAAAc,GAAU,MAAM;AAAE,IAAAlE,GAAA;AAAA,EAA4B,GAAG,CAAA,CAAE,GAE/CmD,KAAQC,KACR,QAAQ,KAAK,qIAAqI;AAGtJ,QAAMe,IAAkBP,MAAaK,IAAS,KAAK,KAC7C,CAACG,GAAiBC,CAAkB,IAAIC,GAAS,EAAE,MAAM,GAAG,UAAUH,GAAiB,GAEvFzH,IAAqC6H,EAAQ,MAAM;AACrD,UAAMC,IAASnB,MAAUD,KAAA,gBAAAA,EAAU,kBAAgBD,KAAA,gBAAAA,EAAM;AACzD,WAAOqB,IAAUA,EAAO,MAAA,IAAwC,CAAA;AAAA,EACpE,GAAG,CAACnB,GAAQF,KAAA,gBAAAA,EAAM,cAAcC,KAAA,gBAAAA,EAAU,YAAY,CAAC,GAGjDqB,IAAcrB,KAAA,gBAAAA,EAAU,SACxBsB,IAAaH,EAAQ,MAAOE,IAAc,EAAE,SAASA,MAAgB,QAAY,CAACA,CAAW,CAAC,GAE9F,EAAE,OAAAlJ,EAAA,IAAUC,GAAA,KAAqB,CAAA,GAEjCmJ,IAAkBC,GAAyB,EAAE,cAAAb,GAAc,YAD9CxI,IAAQ,IAAI,KAC8C,OAAAA,GAAO,WAAW,KAAK,GAE9FsJ,IAAcN,EAAQ,MAAM/B,GAAc9F,GAAS+F,CAAc,GAAG,CAAC/F,GAAS+F,CAAc,CAAC,GAE7FqC,IAAc1B,KAAA,gBAAAA,EAAU,aACxB2B,IAAe3B,KAAA,gBAAAA,EAAU,cACzB4B,KAAc5B,KAAA,gBAAAA,EAAU,cAAa,IAIrC,CAAC6B,GAAQC,CAAS,IAAIZ,GAAuB,IAAI,GAEjDa,IAAYnB,GAAM;AAAA,IACpB,OAAO3D,MAA2B;AAC9B,YAAM+E,IAAK/E,MAAW,SAAS0E,IAAeD;AAC9C,UAAI,CAACM,EAAI;AACT,YAAMC,KAAchF,MAAW,SAAS,UAAU;AAClD,MAAA6E,EAAU,EAAE,MAAM,YAAY,SAAS,cAAcG,EAAW,KAAK;AACrE,UAAI;AACA,cAAMD,EAAA,GACNF,EAAU,EAAE,MAAM,WAAW,SAAS,GAAGG,EAAW,0BAA0B;AAAA,MAClF,SAASC,IAAK;AACV,gBAAQ,MAAM,mBAAmBD,EAAW,kBAAkBC,EAAG,GACjEJ,EAAU,EAAE,MAAM,SAAS,SAASI,cAAe,QAAQA,GAAI,UAAU,qBAAqBD,EAAW,GAAA,CAAI;AAAA,MACjH;AAAA,IACJ;AAAA,IACA,CAACP,GAAaC,CAAY;AAAA,EAAA,GAGxB/D,IAAcuD,EAAQ,MAAOO,IAAc,MAAMK,EAAU,KAAK,IAAI,QAAY,CAACL,GAAaK,CAAS,CAAC,GACxGlE,IAAesD,EAAQ,MAAOQ,IAAe,MAAMI,EAAU,MAAM,IAAI,QAAY,CAACJ,GAAcI,CAAS,CAAC,GAE5GI,IAAanC,KAAA,gBAAAA,EAAU,QACvBlC,KAAiBqD;AAAA,IACnB,MAAOgB,IAAa,MAAA;;AAAM,cAAA5F,IAAA4F,EAAW,YAAX,gBAAA5F,EAAoB,eAAe,EAAE,OAAO,IAAI,mBAAmB,CAAA,EAAC;AAAA,QAAO;AAAA,IACrG,CAAC4F,CAAU;AAAA,EAAA,GAGTC,KAAyDjB,EAAQ,MAAM;AACzE,QAAI,GAACvD,KAAe,CAACC,KAAgB,CAACC;AACtC,aAAO,EAAE,aAAAF,GAAa,cAAAC,GAAc,gBAAAC,IAAgB,WAAW8D,EAAA;AAAA,EACnE,GAAG,CAAChE,GAAaC,GAAcC,IAAgB8D,CAAW,CAAC,GAGrDS,KAAelB,EAAQ,MAAM;AAC/B,UAAMmB,IAAiC,EAAE,SAAS7B,IAAQ,YAAY,WAAA;AACtE,WAAIC,QAA4B,gBAAgBA,IACzC4B;AAAA,EACX,GAAG,CAAA,CAAE,GAECC,KAA4BpB,EAAQ,MACjCpB,IACGA,EAAK,KAAmC,IAAI,CAACyC,GAAKhJ,OAAO,EAAE,IAAIA,GAAG,GAAGgJ,EAAA,EAAM,IADjE,CAAA,GAEnB,CAACzC,CAAI,CAAC,GAEH0C,KAAarC,KAAoBjE,EAAM,QAAQ,OAAO,OACtDuG,KAAYrC,KAAmB,eAC/BsC,KAAWpC,KAAeqC,GAAMzG,EAAM,QAAQ,QAAQ,MAAMA,EAAM,QAAQ,SAAS,SAAS,OAAO,GAAG;AAE5G,SACI,gBAAA7D,EAACD,GAAA,EAAI,eAAaP,IAAU,YAAY,IAAI,IAAI,EAAE,OAAO,QAAQ,QAAQ,QAAQ,GAAG2I,IAAQ,IAAI,GAAG,SAAS,QAAQ,eAAe,UAAU,UAAU,OAAA,GAAU,KAAKE,GACjK,UAAA;AAAA,IAAAvH,KAASjB,KAAS,gBAAAK,EAACS,GAAA,EAAW,SAAQ,MAAK,IAAI,EAAE,IAAI,EAAA,GAAM,UAAAG,EAAA,CAAM;AAAA,IAClE,gBAAAZ;AAAA,MAACH;AAAA,MAAA;AAAA,QACG,IAAI;AAAA,UACA,UAAU;AAAA,UACV,QAAQ,GAAGkJ,CAAe;AAAA,UAC1B,4BAA4B,EAAE,iBAAiBkB,GAAA;AAAA,UAC/C,2BAA2B,EAAE,iBAAiBC,GAAA;AAAA,QAAU;AAAA,QAG5D,UAAA,gBAAAlK;AAAA,UAACqK;AAAA,UAAA;AAAA,YACI,GAAIhC,IACC;AAAA,cACE,QAAQb,EAAU;AAAA,cAClB,YAAAsB;AAAA,cACA,mBAAmBtB,EAAU;AAAA,cAC7B,SAASA,EAAU,WAAWlI;AAAA,YAAA,IAEhC,EAAE,MAAAyK,IAAM,SAAAzK,EAAA;AAAA,YACd,cAAAuK;AAAA,YACA,aAAa,CAAC,CAACD;AAAA,YACf,OAAOA,KAAmB,EAAE,SAASzE,OAA+B;AAAA,YACpE,cAAA2C;AAAA,YACA,SAASmB;AAAA,YACT,iBAAiB,gBAAAvI,EAAA,CAAC4J,MAAW;AACzB,kBAAIC,IAAS7C,IAAkBA,EAAgB4C,CAAM,IAAI;AACzD,qBAAIC,EAAO,SAAS,MAAGA,KAAU,MAC7B5C,MAAS4C,KAAUD,EAAO,6BAA6B,MAAM,IAAI,0BAA0B,yBACxFC;AAAA,YACX,GALiB;AAAA,YAMjB,4BAA0B;AAAA,YAC1B,kBAAkB;AAAA,YAClB,YAAU;AAAA,YACV,iBAAA/B;AAAA,YACA,iBAAiB,CAAC,IAAI,IAAI,IAAI,GAAG;AAAA,YACjC,yBAAyBC;AAAA,YACzB,WAAW;AAAA,cACP,gBAAgB,EAAE,OAAO,EAAE,iBAAiB,gBAAc;AAAA,cAC1D,GAAImB,KAAmB,EAAE,SAASA,OAA4B,CAAA;AAAA,YAAC;AAAA,YAEnE,IAAI;AAAA,cACA,UAAU;AAAA,cACV,WAAW;AAAA,cACX,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,CAAC,MAAMY,GAAY,eAAe,EAAE,GAAG,EAAE,OAAO,UAAA;AAAA,cAChD,CAAC,MAAMA,GAAY,QAAQ,EAAE,GAAG,EAAE,OAAO,eAAA;AAAA,cACzC,2BAA2B,EAAE,iBAAiBL,GAAA;AAAA,cAC9C,gCAAgC,EAAE,aAAa,UAAA;AAAA,cAC/C,uBAAuB,EAAE,aAAa,UAAA;AAAA,cACtC,4BAA4B,EAAE,iBAAiB,kBAAA;AAAA,cAC/C,kCAAkC,EAAE,WAAW,OAAA;AAAA,YAAO;AAAA,UAC1D;AAAA,QAAA;AAAA,MACJ;AAAA,IAAA;AAAA,IAGJ,gBAAAnK;AAAA,MAACyK;AAAA,MAAA;AAAA,QACG,MAAMpB,MAAW;AAAA,QACjB,mBAAkBA,KAAA,gBAAAA,EAAQ,UAAS,aAAa,QAAOA,KAAA,gBAAAA,EAAQ,UAAS,UAAU,MAAO;AAAA,QACzF,SAAS,gBAAA3I,EAAA,MAAM4I,EAAU,IAAI,GAApB;AAAA,QACT,cAAc,EAAE,UAAU,UAAU,YAAY,SAAA;AAAA,QAEhD,UAAA,gBAAAtJ;AAAA,UAAC0K;AAAA,UAAA;AAAA,YACG,SAAS,gBAAAhK,EAAA,MAAM4I,EAAU,IAAI,GAApB;AAAA,YACT,WAAUD,KAAA,gBAAAA,EAAQ,UAAS,UAAU,WAAUA,KAAA,gBAAAA,EAAQ,UAAS,YAAY,YAAY;AAAA,YACxF,OAAMA,KAAA,gBAAAA,EAAQ,UAAS,aAAa,gBAAArJ,EAAC2K,MAAiB,MAAM,IAAI,OAAM,UAAA,CAAU,IAAK;AAAA,YACrF,SAAQ;AAAA,YACR,IAAI,EAAE,SAAS,mBAAA;AAAA,YAEd,UAAAtB,KAAA,gBAAAA,EAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,MACb;AAAA,IAAA;AAAA,EACJ,GACJ;AAER;AA/KgB3I,EAAA4G,IAAA;AAiLhB,SAAS0B,GAAyB,EAAE,cAAAb,GAAc,YAAAyC,IAAa,GAAG,OAAAjL,GAAO,WAAAkL,IAAY,OAKlF;AACC,QAAM,CAAC9B,GAAiB+B,CAAkB,IAAIpC,GAASmC,CAAS,GAC1DE,IAAaC,GAA6C,IAAI,GAE9DC,IAAoB,gBAAAvK,EAAA,CAACwK,OACnBA,KAAA,gBAAAA,EAAS,kBAAiB,OAAa,OACvCA,KAAA,QAAAA,EAAS,UAAU,SAAS,aAAmBA,IAC5CD,GAAkBC,KAAA,gBAAAA,EAAS,kBAAiB,IAAI,GAHjC;AAM1B,SAAA5C,GAAU,MAAM;AACZ,UAAM6C,IAAahD,EAAa;AAChC,QAAI,CAACgD,KAAc,OAAO,iBAAmB,IAAa;AAC1D,UAAMC,IAASH,EAAkBE,CAAU,GAErCE,IAAW,IAAI,eAAe,CAACC,MAAY;AAC7C,MAAIP,EAAW,WAAS,aAAaA,EAAW,OAAO;AACvD,YAAMQ,IAAS,KAAK,MAAMD,EAAQ,CAAC,EAAE,YAAY,MAAM,IAAIV;AAC3D,MAAAG,EAAW,UAAU,WAAW,MAAM;AAClC,QAAAD,EAAmB,MAAMS,CAAM,GAC/BR,EAAW,UAAU;AAAA,MACzB,GAAG,EAAE;AAAA,IACT,CAAC;AACD,WAAIK,KAAQC,EAAS,QAAQD,CAAM,GAE/BrC,MAAoB,OAAOqC,KAC3BN,EAAmB,CAACU,MAASA,IAAOZ,CAAU,GAG3C,MAAMS,EAAS,WAAA;AAAA,EAC1B,GAAG,CAAClD,KAAA,gBAAAA,EAAc,SAASxI,GAAOiL,CAAU,CAAC,GAEtC7B;AACX;AAtCSrI,EAAAsI,IAAA;AC/RT,SAASyC,GAAkB/G,GAAoB;AAC3C,SAAIA,aAAa,OAAaM,GAAWN,GAAG,OAAO,IAC5C,OAAOA,KAAK,EAAE;AACzB;AAHShE,EAAA+K,IAAA;AAWF,SAASC,GAAWC,GAAmBC,GAAeC,GAAeC,IAAW,MAAMC,IAAW,GAAW;AAC/G,MAAIF,KAAS,EAAG,QAAOF;AACvB,QAAMK,IAAIJ,IAAQ,KAAK,IAAI,GAAGC,IAAQ,CAAC,GACjCI,IAAIH,KAAYC,IAAWD,KAAYE;AAC7C,MAAI;AACA,WAAO5B,GAAMuB,GAAWM,CAAC;AAAA,EAC7B,QAAQ;AACJ,WAAON;AAAA,EACX;AACJ;AATgBjL,EAAAgL,IAAA;AAaT,SAASQ,GAAoE;AAAA,EAChF,MAAA3E;AAAA,EACA,MAAA4E;AAAA,EACA,OAAAC;AAAA,EACA,QAAAC;AAAA,EACA,OAAAzL;AAAA,EACA,QAAA2K,IAAS;AAAA,EACT,SAAAe,IAAU;AAAA,EACV,YAAAC,IAAa;AAAA,EACb,UAAAC,IAAW;AAAA,EACX,aAAAC,IAAc;AAAA,EACd,aAAAC;AAAA,EACA,aAAAC;AAAA,EACA,aAAAC;AAAA,EACA,aAAAC;AAAA,EACA,SAAAvN,IAAU;AAAA,EACV,WAAAwN,IAAY;AAAA,EACZ,SAASC;AAAA,EACT,iBAAAC;AAAA,EACA,WAAWC;AACf,GAA2B;;AACvB,QAAMtJ,IAAQC,GAAA,GACR,EAAE,OAAAjE,EAAA,IAAUC,GAAA,KAAqB,CAAA,GAEjCmK,IAAQxC,IAAY,MAAM,QAAQA,CAAI,IAAKA,IAAqCA,EAAK,OAAtE,IACf2F,IAAuCvE,EAAQ,MAC5CyD,IACErC,EAAK,IAAI,CAACC,OAAS;AAAA,IACtB,GAAGA;AAAA,IACH,WAAW0C,KAAejB,IAAmBzB,EAAIoC,CAAK,CAAC;AAAA,EAAA,EACzD,IAJiBrC,GAKpB,CAACA,GAAMqC,GAAOM,CAAW,CAAC,GAEvBS,IAAOR,MAAgB,CAACjI,MAAchF,GAAcgF,GAAG,CAAC,IACxD0I,IAAYzJ,EAAM,QAAQ,KAAK;AAErC,MAAI0J,IAAYJ,KAAqB7C,GAAMzG,EAAM,QAAQ,KAAK,SAAS,IAAI;AAC3E,QAAM2J,IAAOlB,IAAQ,aAAa,QAE5BmB,IAAmB,gBAAA7M,EAAA,CAAC8M,GAA6BC,MAAsC;;AACzF,QAAI,CAACD,EAAK,QAAOC;AACjB,UAAMxM,IAAiC,EAAE,GAAGwM,EAAA,GACtCC,IAAWF,EAAI,WAAUzJ,IAAA0J,EAAS,SAAT,gBAAA1J,EAA2C,SAAQqJ,GAC5EO,IAASH,EAAI,cAAalJ,KAAAmJ,EAAS,SAAT,gBAAAnJ,GAA2C,aAAY;AACvF,WAAArD,EAAM,OAAO,EAAE,MAAMyM,GAAU,UAAUC,EAAA,GACrCH,EAAI,SAAS,WAAWvM,EAAM,OAAOuM,EAAI,OACzCA,EAAI,UAAU,WAAWvM,EAAM,QAAQ,EAAE,OAAOuM,EAAI,OAAO,UAAU,gBAAgB,QAAQ,IAAI,MAAME,GAAU,UAAUC,EAAA,IAC3HH,EAAI,cAAc,WACjBvM,EAAM,KAAiC,QAAQuM,EAAI,WACnDvM,EAAM,KAAiC,aAAauM,EAAI,YAAY,IAAI,QAAQA,EAAI,YAAY,IAAI,UAAU,WAE/GA,EAAI,cAAc,WAAWvM,EAAM,YAAYuM,EAAI,YACnDA,EAAI,aAAa,WAAWvM,EAAM,WAAWuM,EAAI,WACjDA,EAAI,aAAa,WAAWvM,EAAM,WAAWuM,EAAI,WACjDA,EAAI,aAAa,WAAWvM,EAAM,WAAWuM,EAAI,WACjDA,EAAI,aAAa,WAAWvM,EAAM,WAAWuM,EAAI,WACjDA,EAAI,WAAQvM,EAAM,SAASuM,EAAI,SAC/BA,EAAI,SAAS,WAAWvM,EAAM,OAAOuM,EAAI,OACzCA,EAAI,aAAa,WAAWvM,EAAM,WAAWuM,EAAI,WACjDA,EAAI,UAAU,WAAWvM,EAAM,QAAQuM,EAAI,QAC3CA,EAAI,WAAW,WAAWvM,EAAM,SAASuM,EAAI,SAC7CA,EAAI,UAAU,WAAWvM,EAAM,QAAQuM,EAAI,QACxCvM;AAAA,EACX,GAxByB,qBA0BnB2M,IAAmB,IACnBC,IAAgB,gBAAAnN,EAAA,CAACtB,MAAmBA,EAAM,SAASwO,IAAmBxO,EAAM,MAAM,GAAGwO,CAAgB,IAAIxO,GAAzF,kBAEhB0O,IAAe;AAAA,IACjB,cAAc;AAAA,MACV,YAAYnK,EAAM,QAAQ,WAAW;AAAA,MACrC,QAAQ,aAAaA,EAAM,QAAQ,OAAO;AAAA,MAC1C,cAAcA,EAAM,MAAM;AAAA,MAC1B,OAAOA,EAAM,QAAQ,KAAK;AAAA,IAAA;AAAA,IAE9B,WAAW,EAAE,OAAOA,EAAM,QAAQ,KAAK,QAAA;AAAA,IACvC,YAAY,EAAE,OAAOyJ,EAAA;AAAA;AAAA;AAAA;AAAA,IAIrB,QAAQ;AAAA,MACJ,MAAMzJ,EAAM,QAAQ,OAAO;AAAA,MAC3B,QAAQA,EAAM,QAAQ,OAAO;AAAA,MAC7B,aAAa;AAAA,IAAA;AAAA,EACjB,GAIEoK,IAAgBC,GAAA;AACtB,EAAAX,IAAYJ,KAAqBc,EAAc,aAAaV;AAC5D,QAAMY,IAAUlB,KAAmBgB,EAAc,WAAWG,GAAiBvK,CAAK,EAAE,QAC9EwK,IAAYJ,EAAc,wBAAwB,IAClDK,KAAcL,EAAc,sBAAsB,OAASE,EAAQ,SAAS,GAE5E,CAACI,CAAS,IAAI3F,GAAiB,MAAA;;AAAO,WAAA0F,MAAcrK,IAAAgK,EAAc,sBAAd,gBAAAhK,EAAA,KAAAgK,OAAuC,IAAK;AAAA,GAAE,GAClGO,IAAmB,gBAAA5N,EAAA,CAACM,MAAciN,IAAUG,IAAaC,IAAY,KAAKrN,KAAKiN,EAAQ,MAAM,GAA1E,qBAEnBM,KAAS,KAAK,KAAK,KACnBC,KAAwB,gBAAA9N,EAAA,CAAC,EAAE,IAAA+N,GAAI,IAAAC,GAAI,UAAAC,GAAU,aAAAC,GAAa,aAAAC,GAAa,SAAAC,GAAS,MAAAC,SAAoD;AACtI,QAAIN,KAAM,QAAQC,KAAM,QAAQE,KAAe,QAAQC,KAAe,KAAM,QAAO;AACnF,UAAMG,KAAUJ,KAA2BC,IAA0BD,KAA0B,KACzFK,KAAM,OAAOR,CAAE,GACfS,KAAID,KAAMD,KAAS,KAAK,IAAI,EAAEL,KAAY,KAAKJ,EAAM,GAErDY,KADM,OAAOT,CAAE,IACLM,KAAS,KAAK,IAAI,EAAEL,KAAY,KAAKJ,EAAM;AAC3D,QAAIa,KAAYzL,EAAM,QAAQ,KAAK;AACnC,QAAIoL;AACA,UAAI;AAAE,QAAAK,KAAYzL,EAAM,QAAQ,gBAAgBoL,EAAI;AAAA,MAAG,QAAQ;AAAA,MAA0B;AAE7F,WACI,gBAAA/O,EAAC,UAAK,GAAAkP,IAAM,GAAAC,IAAM,MAAMC,IAAW,UAAU,IAAI,YAAYF,KAAID,KAAM,UAAU,OAAO,kBAAiB,WACpG,UAAA,KAAKH,KAAW,KAAK,KAAK,QAAQ,CAAC,CAAC,IAAA,CACzC;AAAA,EAER,GAhB8B,0BAkBxBO,KAAehD,EAAO,IAAI,CAACiD,GAAGtO,MAAMsO,EAAE,SAAShB,EAAiBtN,CAAC,CAAC,GAClEuO,KAAmBpB,KAAa9B,EAAO,WAAW,GAElDmD,KAAU7G,EAAQ,MAAM;AAC1B,QAAIwD,MAAS,SAASA,MAAS,gBAAgB,CAAA;AAC/C,UAAMsD,IAAMvC,EAAU,IAAI,CAAClD,GAAKhJ,OAAO;AAAA,MACnC,MAAM6M,EAAcP,IAAO,OAAOtD,EAAIsD,CAAI,KAAKtD,EAAIoC,CAAM,KAAKpL,CAAC,IAAI,IAAIA,CAAC,EAAE;AAAA,MAC1E,OAAO,OAAOqL,EAAO,CAAC,IAAIrC,EAAIqC,EAAO,CAAC,EAAE,OAAO,IAAI,CAAC,KAAK;AAAA,IAAA,EAC3D;AACF,QAAIoD,EAAI,UAAU3C,EAAW,QAAO2C;AACpC,UAAMC,IAAS,CAAC,GAAGD,CAAG,EAAE,KAAK,CAACxD,GAAG0D,MAAMA,EAAE,QAAQ1D,EAAE,KAAK,GAClD2D,IAAMF,EAAO,MAAM,GAAG5C,IAAY,CAAC,GACnC+C,IAAcH,EAAO,MAAM5C,IAAY,CAAC,EAAE,OAAO,CAACgD,GAAKC,MAAMD,IAAMC,EAAE,OAAO,CAAC;AACnF,WAAO,CAAC,GAAGH,GAAK,EAAE,MAAM,UAAU,OAAOC,GAAa;AAAA,EAC1D,GAAG,CAAC1D,GAAMe,GAAWI,GAAMlB,GAAOC,GAAQS,CAAS,CAAC,GAE9C3E,KAAe6C,GAAuB,IAAI,GAC1C,GAAGjC,EAAe,IAAIiH,GAAsB7H,EAAY;AAE9D,MAAI7I,KAAW,CAACiI;AAEZ,WACI,gBAAAzH,EAACD,GAAA,EAAI,eAAY,WAAU,IAAI,EAAE,QAAQ,QAAQ,GAAG,GAAG,OAAO,QAAQ,iBAAAmN,KACjE,UAAA;AAAA,MAAApM,KAASjB,KAAS,gBAAAK,EAACC,GAAA,EAAS,SAAQ,QAAO,OAAO,KAAK,IAAI,EAAE,UAAU,WAAW,IAAI,KAAK;AAAA,MAHtFkM,MAAS,SAASA,MAAS,UAK7B,gBAAAnM,EAACH,GAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,gBAAgB,UAAU,YAAY,UAAU,QAAA0L,EAAA,GACxE,4BAACtL,GAAA,EAAS,SAAQ,YAAW,OAAO,KAAK,IAAIsL,IAAS,KAAK,GAAG,GAAG,QAAQ,KAAK,IAAIA,IAAS,KAAK,GAAG,EAAA,CAAG,GAC1G,IAEA,gBAAAvL,EAACC,GAAA,EAAS,SAAQ,WAAU,OAAM,QAAO,QAAAsL,EAAA,CAAgB;AAAA,IAAA,GAEjE;AAKR,MAAIY,MAAS,SAASA,MAAS;AAC3B,WACI,gBAAArM,EAACD,GAAA,EAAI,KAAKsI,IAAc,IAAI,EAAE,QAAQ,QAAQ,OAAO,QAAQ,IAAI,GAAG,iBAAA6E,KAC/D,UAAA;AAAA,MAAApM,KAASjB,KAAS,gBAAAK,EAACS,GAAA,EAAW,SAAQ,MAAK,IAAI,EAAE,IAAI,IAAA,GAAQ,UAAAG,EAAA,CAAM;AAAA,MACpE,gBAAAZ,EAACiQ,MAAoB,OAAM,QAAO,QAAQlH,MAAmBwC,GACzD,4BAAC2E,IAAA,EACG,UAAA;AAAA,QAAA,gBAAApQ;AAAA,UAACqQ;AAAA,UAAA;AAAA,YACG,MAAMX;AAAA,YACN,SAAQ;AAAA,YACR,SAAQ;AAAA,YACR,IAAG;AAAA,YACH,IAAG;AAAA,YACH,aAAarD,MAAS,UAAU,QAAQ;AAAA,YACxC,aAAY;AAAA,YACZ,OAAOqC;AAAA,YACP,WAAW;AAAA,YACX,cAAc;AAAA,YAEb,UAAA;AAAA,cAAAgB,GAAQ,IAAI,CAACzO,GAAGC,MACb,gBAAAhB;AAAA,gBAACoQ;AAAA,gBAAA;AAAA,kBAEG,MAAMjC,KAAaqB,GAAQ,SAAS,IAAI9D,GAAW4C,EAAiB,CAAC,GAAGtN,GAAGwO,GAAQ,MAAM,IAAIlB,EAAiBtN,CAAC;AAAA,gBAAA;AAAA,gBAD1GA;AAAA,cAAA,CAGZ;AAAA,cACAyL,KAAe,gBAAAzM,EAACqQ,IAAA,EAAS,GAAGvC,EAAA,CAAc;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAE/C,gBAAA9N,EAACsQ,MAAO,cAAc,EAAE,OAAO3M,EAAM,QAAQ,KAAK,YAAU,CAAG;AAAA,MAAA,EAAA,CACnE,EAAA,CACJ;AAAA,IAAA,GACJ;AAKR,MAAIwI,MAAS;AACT,WACI,gBAAArM,EAACD,KAAI,IAAI,EAAE,QAAQ,QAAQ,GAAG,GAAG,iBAAAmN,EAAA,GAC5B,UAAA;AAAA,MAAApM,KAASjB,KAAS,gBAAAK,EAACS,GAAA,EAAW,SAAQ,MAAK,IAAI,EAAE,IAAI,EAAA,GAAM,UAAAG,EAAA,CAAM;AAAA,MAClE,gBAAAZ,EAACiQ,MAAoB,OAAM,QAAO,QAAA1E,GAC9B,UAAA,gBAAAzL,EAACyQ,IAAA,EAAa,QAAQ,EAAE,KAAK,GAAG,OAAO,IAAI,QAAQ3D,KAAA,QAAAA,EAAa,YAAY,KAAK,GAAG,MAAM,KACrF,UAAA;AAAA,QAAAJ,KAAY,gBAAAxM,EAACwQ,IAAA,EAAc,QAAQnD,EAAA,CAAW;AAAA,0BAC9CoD,IAAA,EAAM,SAASrE,GAAO,MAAMA,GAAQ,GAAGmB,EAAiBX,GAAa,EAAE,MAAM,EAAE,MAAMQ,GAAW,UAAU,GAAA,EAAG,CAAG,GAAG;AAAA,QACpH,gBAAApN,EAAC0Q,IAAA,EAAM,UAAS3M,KAAAsI,EAAO,CAAC,MAAR,gBAAAtI,GAAW,SAAS,eAAeoJ,GAAM,OAAM7I,KAAA+H,EAAO,CAAC,MAAR,gBAAA/H,GAAW,MAAO,GAAGiJ,EAAiBV,GAAa,EAAE,MAAM,EAAE,MAAMO,GAAW,UAAU,GAAA,EAAG,CAAG,EAAA,CAAG;AAAA,QAC/JX,KAAe,gBAAAzM,EAACqQ,IAAA,EAAS,GAAGvC,EAAA,CAAc;AAAA,QAC1CvB,KAAc,gBAAAvM,EAACsQ,IAAA,EAAO,cAAc,EAAE,OAAO3M,EAAM,QAAQ,KAAK,UAAA,EAAU,CAAG;AAAA,QAC7E0I,EAAO,IAAI,CAACiD,GAAGtO,MACZ,gBAAAhB,EAAC2Q,IAAA,EAAwB,MAAMrB,EAAE,QAAQA,EAAE,SAAS,MAAMpC,GAAW,MAAMmC,GAAarO,CAAC,EAAA,GAA3EsO,EAAE,OAA4E,CAC/F;AAAA,MAAA,EAAA,CACL,EAAA,CACJ;AAAA,IAAA,GACJ;AAKR,QAAMsB,IAAuBzE,MAAS,QAAQ,SAASA,GACjD0E,IAAeD,MAAc,QAC7BE,KAAeF,MAAc,iBAAiBA,MAAc,cAE5DG,KAAYH,MAAc,UAAUI,KACpCJ,MAAc,UAAUA,MAAc,UAAUA,MAAc,eAAeK,KACzEL,MAAc,UAAUA,MAAc,gBAAgBM,KAClDC,IAERC,KAASP,IAAgB,aAAwB,cACjDQ,KAAmB/E,KAAWwE,IAE9BQ,KAAoB,gBAAA5Q,EAAA,CAAC4O,MACnBA,EAAE,OAAaA,EAAE,OACjBsB,MAAc,WACdA,MAAc,UAAUA,MAAc,UAAUA,MAAc,eAAqB,QACnFA,MAAc,UAAUA,MAAc,gBAAsB,SACzD,QALe;AAQ1B,SACI,gBAAA9Q,EAACD,GAAA,EAAI,IAAI,EAAE,QAAQ,QAAQ,GAAG,KAAK,iBAAAmN,EAAA,GAAmB,KAAK7E,IACtD,UAAA;AAAA,IAAAvH,KAASjB,KAAS,gBAAAK,EAACS,GAAA,EAAW,SAAQ,MAAK,IAAI,EAAE,IAAI,EAAA,GAAM,UAAAG,EAAA,CAAM;AAAA,IAClE,gBAAAZ,EAACiQ,IAAA,EAAoB,OAAM,QAAO,QAAO,QACrC,UAAA,gBAAAnQ,EAACiR,IAAA,EAAU,MAAM7D,GAAW,QAAAkE,IAAgB,QAAQ,EAAE,KAAK,GAAG,OAAO,IAAI,QAAQxE,KAAA,QAAAA,EAAa,YAAY,KAAK,GAAG,MAAM,EAAA,GAAK,OAAO,EAAE,WAAW,SAC5I,UAAA;AAAA,MAAAJ,KAAY,gBAAAxM,EAACwQ,IAAA,EAAc,QAAQnD,GAAW,iBAAgB,OAAM;AAAA,MAEpEwD,IACG,gBAAA/Q,EAAAyR,IAAA,EACI,UAAA;AAAA,QAAA,gBAAAvR,EAACyQ,MAAM,MAAK,UAAS,eAAetD,GAAO,GAAGI,EAAiBX,GAAa,EAAE,MAAM,EAAE,MAAMQ,GAAW,UAAU,GAAA,EAAG,CAAG,GAAG;AAAA,QAC1H,gBAAApN,EAAC0Q,MAAM,MAAK,YAAW,SAASpD,KAAQlB,GAAQ,GAAGmB,EAAiBV,GAAa,EAAE,MAAM,EAAE,MAAMO,GAAW,UAAU,MAAM,OAAO,GAAA,CAAI,EAAA,CAAG;AAAA,MAAA,EAAA,CAC9I,IAEA,gBAAAtN,EAAAyR,IAAA,EACI,UAAA;AAAA,QAAA,gBAAAvR,EAACyQ,MAAM,SAASnD,KAAQlB,GAAQ,GAAGmB,EAAiBX,GAAa,EAAE,MAAM,EAAE,MAAMQ,GAAW,UAAU,GAAA,EAAG,CAAG,GAAG;AAAA,0BAC9GsD,IAAA,EAAM,eAAevD,GAAO,GAAGI,EAAiBV,GAAa,EAAE,MAAM,EAAE,MAAMO,GAAW,UAAU,GAAA,EAAG,CAAG,EAAA,CAAG;AAAA,MAAA,GAChH;AAAA,MAGHX,KAAe,gBAAAzM,EAACqQ,IAAA,EAAS,GAAGvC,EAAA,CAAc;AAAA,MAC1CvB,KAAc,gBAAAvM,EAACsQ,IAAA,EAAO,cAAc,EAAE,OAAO3M,EAAM,QAAQ,KAAK,UAAA,EAAU,CAAG;AAAA,MAE7E0I,EAAO,IAAI,CAACiD,GAAGtO,MAAM;AAClB,cAAMwQ,IAAQnC,GAAarO,CAAC,GACtByQ,IAAaH,GAAkBhC,CAAC;AAEtC,eAAImC,MAAe,QAEX,gBAAAzR;AAAA,UAAC0R;AAAA,UAAA;AAAA,YAEG,SAASpC,EAAE;AAAA,YACX,MAAMA,EAAE,QAAQA,EAAE;AAAA,YAClB,MAAMkC;AAAA,YACN,SAASH,KAAmB,UAAU;AAAA,YACtC,QAAQR,IAAe,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;AAAA,YACjD,YAAY;AAAA,YAEX,UAAAtB,MAAoBrC,EAAU,IAAI,CAACnM,GAAG4Q;AAAA;AAAA;AAAA,cAGnC,gBAAA3R,EAACoQ,IAAA,EAAc,MAAM1E,GAAW8F,GAAOtE,EAAU,SAAS,IAAIyE,GAAIzE,EAAU,MAAM,EAAA,GAAvEyE,CAA0E;AAAA,aACxF;AAAA,UAAA;AAAA,UAZIrC,EAAE;AAAA,QAAA,IAgBfmC,MAAe,SAEX,gBAAAzR;AAAA,UAAC4R;AAAA,UAAA;AAAA,YAEG,MAAK;AAAA,YACL,SAAStC,EAAE;AAAA,YACX,MAAMA,EAAE,QAAQA,EAAE;AAAA,YAClB,QAAQkC;AAAA,YACR,MAAMA;AAAA,YACN,aAAaH,KAAmB,MAAM;AAAA,YACtC,SAASA,KAAmB,UAAU;AAAA,YACtC,aAAa;AAAA,UAAA;AAAA,UARR/B,EAAE;AAAA,QAAA,IAaf,gBAAAtP,EAAC6R,IAAA,EAAqB,MAAK,YAAW,SAASvC,EAAE,SAAS,MAAMA,EAAE,QAAQA,EAAE,SAAS,QAAQkC,GAAO,aAAa,GAAG,KAAK,IAAO,WAAW,EAAE,GAAG,EAAA,KAArIlC,EAAE,OAAwI;AAAA,MAE7J,CAAC;AAAA,IAAA,EAAA,CACL,EAAA,CACJ;AAAA,EAAA,GACJ;AAER;AAvSgB5O,EAAAwL,IAAA;AC1EhB,SAAS4F,GAAc7Q,GAMpB;AACC,QAAM,EAAE,GAAAiO,IAAI,GAAG,GAAAC,IAAI,GAAG,OAAA4C,IAAQ,GAAG,QAAAxG,IAAS,GAAG,MAAAyG,GAAM,MAAAC,GAAM,MAAAlD,GAAM,aAAAmD,GAAa,UAAAC,MAAalR,GACnFxB,IAAMwB,EAAM,eAAevB;AACjC,MAAIqS,IAAQ,MAAMxG,IAAS,GAAI,QAAO;AACtC,QAAM6G,IAAarD,IAAOoD,EAASpD,CAAI,IAAImD;AAE3C,2BACK,KAAA,EACG,UAAA;AAAA,IAAA,gBAAAlS,EAAC,QAAA,EAAK,GAAAkP,GAAM,GAAAC,GAAM,OAAA4C,GAAc,QAAAxG,GAAgB,IAAI,GAAG,MAAAwD,GAAY,QAAQmD,GAAa,aAAa,EAAA,CAAG;AAAA,IACvGH,IAAQ,MAAMxG,IAAS,MACpB,gBAAAzL,EAAAyR,IAAA,EACI,UAAA;AAAA,MAAA,gBAAAvR,EAAC,QAAA,EAAK,GAAGkP,IAAI,GAAG,GAAGC,IAAI,IAAI,MAAMiD,GAAY,UAAU,IAAI,YAAY,KACjE,WAAAJ,KAAQ,IAAI,SAASD,IAAQ,KAAKC,KAAQ,IAAI,MAAM,GAAG,KAAK,MAAMD,IAAQ,CAAC,CAAC,IAAI,MAAMC,GAC5F;AAAA,MACCzG,IAAS,MACN,gBAAAvL,EAAC,QAAA,EAAK,GAAGkP,IAAI,GAAG,GAAGC,IAAI,IAAI,MAAM/E,GAAMgI,GAAY,GAAG,GAAG,UAAU,IAC9D,UAAA3S,EAAIwS,KAAQ,CAAC,EAAA,CAClB;AAAA,IAAA,EAAA,CAER;AAAA,EAAA,GAER;AAER;AA7BSvR,EAAAoR,IAAA;AA+BF,SAASO,GAAsE;AAAA,EAClF,MAAA9K;AAAA,EACA,SAAA+K;AAAA,EACA,UAAAC;AAAA,EACA,OAAA3R;AAAA,EACA,QAAA2K,IAAS;AAAA,EACT,aAAAlM;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,SAASyN;AACb,GAA6B;AACzB,QAAMpJ,IAAQC,GAAA,GACRqK,IAAUlB,KAAmBmB,GAAiBvK,CAAK,EAAE,QAErD6O,IAAuB7J,EAAQ,MAC5BpB,IACGA,EAAK,KAAmC,IAAI,CAACyC,GAAKhJ,OAAO;AAAA,IAC7D,MAAM,OAAOgJ,EAAIsI,CAAO,KAAK,EAAE;AAAA,IAC/B,MAAM,KAAK,IAAI,GAAG,OAAOtI,EAAIuI,CAAQ,CAAC,KAAK,CAAC;AAAA,IAC5C,MAAMtE,EAAQjN,IAAIiN,EAAQ,MAAM;AAAA,EAAA,EAClC,IALgB,CAAA,GAMnB,CAAC1G,GAAM+K,GAASC,GAAUtE,CAAO,CAAC,GAE/BkE,IAAW,gBAAAzR,EAAA,CAACqO,MAAiB;AAC/B,QAAI;AAAE,aAAOpL,EAAM,QAAQ,gBAAgBoL,CAAI;AAAA,IAAG,QAAQ;AAAE,aAAOpL,EAAM,QAAQ,KAAK;AAAA,IAAS;AAAA,EACnG,GAFiB;AAIjB,SAAIrE,KAAW,CAACiI,IAER,gBAAAzH,EAACD,GAAA,EAAI,eAAY,WAAU,IAAI,EAAE,QAAQ,QAAQ,GAAG,EAAA,GAC/C,UAAA;AAAA,IAAAe,KAAS,gBAAAZ,EAACC,GAAA,EAAS,SAAQ,QAAO,OAAO,KAAK,IAAI,EAAE,UAAU,WAAW,IAAI,EAAA,EAAE,CAAG;AAAA,sBAClFA,GAAA,EAAS,SAAQ,WAAU,OAAM,QAAO,QAAAsL,EAAA,CAAgB;AAAA,EAAA,GAC7D,IAKJ,gBAAAzL,EAACD,KAAI,IAAI,EAAE,QAAQ,QAAQ,GAAG,KACzB,UAAA;AAAA,IAAAe,KAAS,gBAAAZ,EAACS,KAAW,SAAQ,MAAK,IAAI,EAAE,IAAI,EAAA,GAAM,UAAAG,EAAA,CAAM;AAAA,IACxD4R,EAAS,WAAW,IACjB,gBAAAxS,EAACS,KAAW,SAAQ,SAAQ,OAAM,kBAAiB,qBAAO,IAE1D,gBAAAT,EAACiQ,IAAA,EAAoB,OAAM,QAAO,QAAA1E,GAC9B,UAAA,gBAAAvL;AAAA,MAACyS;AAAA,MAAA;AAAA,QACG,MAAMD;AAAA,QACN,SAAQ;AAAA,QACR,SAAQ;AAAA,QACR,QAAQ7O,EAAM,QAAQ,WAAW;AAAA,QACjC,2BAAUmO,IAAA,EAAc,aAAAzS,GAA0B,aAAasE,EAAM,QAAQ,WAAW,OAAO,UAAAwO,EAAA,CAAoB;AAAA,MAAA;AAAA,IAAA,EACvH,CACJ;AAAA,EAAA,GAER;AAER;AArDgBzR,EAAA2R,IAAA;AC3DT,MAAMK,KAAa,KAEpBC,KAAgB,KAChBC,KAAgB;AAiBf,SAASC,GACZC,GACAC,IAII,IACO;AACX,QAAM,EAAE,SAAAC,IAAU,IAAM,aAAAC,GAAa,QAAQC,MAAeH;AAE5D,MAAIG,KAAcD,KAAe;AAC7B,WAAO,EAAE,QAAQC,GAAY,MAAMD,EAAA;AAGvC,MAAI,CAACD,KAAWF,EAAO,WAAW;AAC9B,WAAO;AAAA,MACH,QAAQI,KAAc,CAAC,GAAG,EAAE;AAAA,MAC5B,MAAMD,KAAe;AAAA,IAAA;AAI7B,QAAME,IAAOL,EAAO,IAAI,CAAAM,MAAKA,EAAE,GAAG,GAC5BC,IAAOP,EAAO,IAAI,CAAAM,MAAKA,EAAE,GAAG,GAE5BE,IAAS,KAAK,IAAI,GAAGH,CAAI,GACzBI,IAAS,KAAK,IAAI,GAAGJ,CAAI,GACzBK,IAAS,KAAK,IAAI,GAAGH,CAAI,GACzBI,IAAS,KAAK,IAAI,GAAGJ,CAAI,GAEzBK,IAA2BR,KAAc;AAAA,KAC1CM,IAASC,KAAU;AAAA,KACnBH,IAASC,KAAU;AAAA,EAAA;AAGxB,MAAIN,KAAe;AACf,WAAO,EAAE,QAAAS,GAAQ,MAAMT,EAAA;AAG3B,MAAIH,EAAO,WAAW;AAClB,WAAO,EAAE,QAAAY,GAAQ,MAAM,EAAA;AAG3B,QAAMC,IAAU,KACVC,IAAU,KAAK,IAAIL,IAASD,GAAQ,CAAC,IAAIK,GACzCE,IAAU,KAAK,IAAIJ,IAASD,GAAQ,CAAC,IAAIG,GAEzCG,IAAYlB,KAAgBgB,GAC5BG,IAAYpB,KAAgBkB,GAC5BG,IAAO,KAAK,IAAI,GAAG,KAAK,IAAIF,GAAWC,GAAW,EAAE,CAAC;AAE3D,SAAO,EAAE,QAAAL,GAAQ,MAAAM,EAAA;AACrB;AAnDgBtT,EAAAmS,IAAA;ACpBT,MAAMoB,KAAgB,kEAGhBC,KACT,8HAGSC,KACT,qIASSC,KAAqC,CAACH,IAAeC,EAAqB,GAG1EG,KAAoC,CAACJ,EAAa,GAEzDK,KAAmBC,GAAwC,IAAI,GAGxDC,KAAoBF,GAAiB;AAM3C,SAASG,GAAaC,GAA0D;AACnF,QAAMC,IAAcC,GAAWN,EAAgB;AAC/C,SAAII,MAAa,SAAkB,MAAM,QAAQA,CAAQ,IAAKA,IAAiC,CAACA,CAAkB,IAC3GC,KAAeN;AAC1B;AAJgB3T,EAAA+T,IAAA;ACOhB,SAASI,GAAc,EAAE,SAAAC,GAAS,QAAAC,GAAQ,eAAAC,GAAe,eAAAC,GAAe,WAAAC,GAAW,KAAAzV,GAAK,SAAA0V,GAAS,SAAAC,KAS9F;AACC,QAAM,EAAE,GAAAC,EAAA,IAAMC,GAAA;AACd,SACI,gBAAAtV,EAAAuR,IAAA,EACK,UAAAuD,EAAQ,IAAI,CAACnF,GAAG3O,MAAM;AACnB,UAAMsB,IAAQ,KAAK,IAAIqN,EAAE,KAAK,IAAIoF,GAC5BQ,IAAIP,IAAgB1S,KAAS2S,IAAgBD,IAC7C5V,IAAQ,GAAGuQ,EAAE,SAAS,EAAE,IAAIlQ,EAAIkQ,EAAE,KAAK,CAAC,GAAG,KAAA;AACjD,6BACK6F,IAAA,EAAe,aAAa,CAAC7F,EAAE,KAAKA,EAAE,GAAG,GACtC,UAAA,gBAAA7P,EAAC,OAAE,WAAW,SAAS,IAAIuV,CAAC,KAAK,OAAO,EAAE,QAAQ,aAAa,cAAc,gBAAA3U,EAAA,CAAC+U,MAAMN,EAAQM,GAAGrW,CAAK,GAAvB,iBAA0B,aAAa,gBAAAsB,EAAA,CAAC+U,MAAMN,EAAQM,GAAGrW,CAAK,GAAvB,gBAA0B,cAAcgW,GACxJ,UAAA;AAAA,MAAA,gBAAApV,EAAC,UAAA,EAAO,GAAAuV,GAAM,MAAML,GAAW,SAAS,MAAM;AAAA,MAC9C,gBAAAlV,EAAC,YAAO,GAAGuV,IAAI,KAAK,MAAML,GAAW,SAAS,KAAA,CAAM;AAAA,IAAA,EAAA,CACxD,KAJSlU,CAKb;AAAA,EAER,CAAC,EAAA,CACL;AAER;AA5BSN,EAAAmU,IAAA;AA8BF,SAASa,GAAe;AAAA,EAC3B,MAAAnO;AAAA,EACA,OAAA3G;AAAA,EACA,QAAA2K,IAAS;AAAA,EACT,eAAAyJ,IAAgB;AAAA,EAChB,eAAAC,IAAgB;AAAA,EAChB,OAAAzD;AAAA,EACA,aAAAnS;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,aAAA2T;AAAA,EACA,QAAQ0C;AAAA,EACR,SAAA3C,IAAU;AAAA,EACV,QAAA4C;AACJ,GAAoB;AAChB,QAAMjS,IAAQC,GAAA,GACRkR,KAAUvN,KAAA,gBAAAA,EAAM,SAAQ,CAAA,GACxB,CAACsO,GAASC,CAAU,IAAIpN,GAAwD,IAAI,GACpFjJ,IAAMJ,KAAeK,IACrBwV,IAAY1D,KAAStD,GAAiBvK,CAAK,EAAE,OAAO,CAAC,GACrDoS,IAAStB,GAAamB,CAAM,GAE5BI,IAAW5L,GAAMzG,EAAM,QAAQ,KAAK,SAAS,IAAI,GACjDsS,IAAY7L,GAAMzG,EAAM,QAAQ,KAAK,SAAS,IAAI,GAClDuS,IAAavS,EAAM,QAAQ,SAC3BwS,IAAgBxS,EAAM,QAAQ,KAAK,UAEnCoR,IAASpM,EAAQ,MAAM,KAAK,IAAI,GAAG,GAAGmM,EAAQ,IAAI,CAACnF,MAAM,KAAK,IAAIA,EAAE,KAAK,CAAC,CAAC,GAAG,CAACmF,CAAO,CAAC,GACvFsB,IAAWzN,EAAQ,MAAMkK,GAAmBiC,GAAS,EAAE,SAAA9B,GAAS,aAAAC,GAAa,QAAQ0C,EAAA,CAAY,GAAG,CAACb,GAAS9B,GAASC,GAAa0C,CAAU,CAAC,GAE/IU,IAAcC,GAAY,CAACb,GAAqBc,MAAiB;AACnE,UAAMC,IAAOf,EAAE,cAA0B,QAAQ,KAAK;AACtD,QAAI,CAACe,EAAK;AACV,UAAMC,IAAOD,EAAI,sBAAA;AACjB,IAAAV,EAAW,EAAE,GAAGL,EAAE,UAAUgB,EAAK,MAAM,GAAGhB,EAAE,UAAUgB,EAAK,KAAK,MAAAF,EAAA,CAAM;AAAA,EAC1E,GAAG,CAAA,CAAE,GACCG,IAAeJ,GAAY,MAAMR,EAAW,IAAI,GAAG,CAAA,CAAE;AAE3D,MAAIxW;AACA,WACI,gBAAAQ,EAACD,GAAA,EAAI,eAAY,WAAU,IAAI,EAAE,QAAQ,QAAQ,GAAG,EAAA,GAC/C,UAAA;AAAA,MAAAe,KAAS,gBAAAZ,EAACC,GAAA,EAAS,SAAQ,QAAO,OAAO,KAAK,IAAI,EAAE,UAAU,WAAW,IAAI,EAAA,EAAE,CAAG;AAAA,wBAClFA,GAAA,EAAS,SAAQ,WAAU,OAAM,QAAO,QAAAsL,EAAA,CAAgB;AAAA,IAAA,GAC7D;AAIR,QAAMoL,IAAgB,EAAE,SAAS,EAAE,SAAS,UAAU,OAAO,EAAE,SAAS,UAAU,SAAS,EAAE,SAAS,SAAO;AAE7G,SACI,gBAAA7W,EAACD,GAAA,EAAI,IAAI,EAAE,QAAQ,QAAQ,GAAG,KAAK,UAAU,OAAA,GACxC,UAAA;AAAA,IAAAe,KAAS,gBAAAZ,EAACS,KAAW,SAAQ,MAAK,IAAI,EAAE,IAAI,EAAA,GAAM,UAAAG,EAAA,CAAM;AAAA,sBACxDf,GAAA,EAAI,IAAI,EAAE,UAAU,cACjB,UAAA;AAAA,MAAA,gBAAAG;AAAA,QAAC4W;AAAA,QAAA;AAAA,UACG,YAAW;AAAA,UACX,kBAAkB,EAAE,OAAOlE,GAAA;AAAA,UAC3B,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,SAAS,SAAS,YAAY/O,EAAM,QAAQ,WAAW,SAAS,cAAcA,EAAM,MAAM,aAAA;AAAA,UAElI,UAAA,gBAAA7D,EAAC+W,IAAA,EAAc,QAAQT,EAAS,QAAQ,MAAMA,EAAS,MAAM,SAAS,GAAG,SAAS,IAC7E,UAAA;AAAA,YAAAL,EAAO;AAAA,cAAI,CAACe,GAAKC,MACdA,MAAQ,IACJ,gBAAA/W,EAACgX,IAAA,EAAsB,WAAWF,GAC7B,6BAAC,EAAE,aAAAG,EAAA,MACAA,EAAY,IAAI,CAACC,MACb,gBAAAlX,EAACmX,IAAA,EAA2B,WAAWD,GAAK,MAAMlB,GAAU,QAAQE,GAAY,aAAa,KAAK,OAAO,EAAE,GAAGS,GAAe,OAAO,EAAE,SAAS,QAAQ,MAAMV,EAAA,EAAU,EAAE,GAAzJiB,EAAI,MAAwJ,CAC/K,kBAJSJ,CAMlB,IAEA,gBAAA9W,EAACgX,IAAA,EAAsB,WAAWF,GAC7B,UAAA,gBAAApW,EAAA,CAAC,EAAE,aAAAuW,EAAA,MACAA,EAAY,IAAI,CAACC,wBACZC,IAAA,EAA2B,WAAWD,GAAK,MAAK,QAAO,QAAQf,GAAe,aAAa,KAAK,OAAOQ,EAAA,GAAxFO,EAAI,MAAmG,CAC1H,GAHJ,eADaJ,CAMlB;AAAA,YAAA;AAAA,YAIR,gBAAA9W,EAAC6U,IAAA,EAAc,SAAAC,GAAkB,QAAAC,GAAgB,eAAAC,GAA8B,eAAAC,GAA8B,WAAAC,GAAsB,KAAAzV,GAAU,SAAS4W,GAAa,SAASK,EAAA,CAAc;AAAA,UAAA,EAAA,CAC9L;AAAA,QAAA;AAAA,MAAA;AAAA,MAGHb,KACG,gBAAA7V;AAAA,QAACH;AAAA,QAAA;AAAA,UACG,IAAI;AAAA,YACA,UAAU;AAAA,YACV,MAAMgW,EAAQ;AAAA,YACd,KAAKA,EAAQ,IAAI;AAAA,YACjB,WAAW;AAAA,YACX,SAAS;AAAA,YACT,OAAO;AAAA,YACP,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,cAAc;AAAA,YACd,UAAU;AAAA,YACV,eAAe;AAAA,YACf,QAAQ;AAAA,YACR,aAAa;AAAA,YACb,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,WAAW;AAAA,UAAA;AAAA,UAGd,UAAAA,EAAQ;AAAA,QAAA;AAAA,MAAA;AAAA,IACb,EAAA,CAER;AAAA,EAAA,GACJ;AAER;AA/GgBnV,EAAAgV,IAAA;AC/BhB,SAAS0B,GAAWC,GAAYC,GAAYC,GAAYC,GAAoB;AACxE,QAAMC,KAAMJ,IAAKE,KAAM,GACjBG,IAAK,KAAK,IAAIJ,GAAIE,CAAE,IAAI,KAAK,IAAID,IAAKF,CAAE,IAAI;AAClD,SAAO,IAAIA,CAAE,IAAIC,CAAE,KAAKG,CAAE,IAAIC,CAAE,IAAIH,CAAE,IAAIC,CAAE;AAChD;AAJS9W,EAAA0W,IAAA;AAMT,SAASO,GAAe,EAAE,aAAAC,GAAa,QAAA7C,GAAQ,aAAA7C,GAAa,YAAA2F,GAAY,SAAA1C,GAAS,SAAAC,KAO9E;AACC,QAAM,EAAE,YAAA0C,EAAA,IAAeC,GAAA,GACjB,EAAE,GAAA1C,EAAA,IAAMC,GAAA,GAER0C,IAAQrP;AAAA,IACV,MACIiP,EAAY,IAAI,CAACxE,MAAM;AACnB,YAAM6E,IAAOH,EAAW,CAAC1E,EAAE,SAASA,EAAE,OAAO,CAAC,GACxC8E,IAAKJ,EAAW,CAAC1E,EAAE,OAAOA,EAAE,KAAK,CAAC,GAClCiE,KAAKY,KAAA,gBAAAA,EAAO,OAAM,GAClBX,KAAKW,KAAA,gBAAAA,EAAO,OAAM,GAClBV,KAAKW,KAAA,gBAAAA,EAAK,OAAM,GAChBV,KAAKU,KAAA,gBAAAA,EAAK,OAAM,GAEhBnG,IAAQ,IADA,KAAK,IAAIqB,EAAE,SAAS,CAAC,IAAI2B,IACb;AAC1B,aAAO,EAAE,GAAG3B,GAAG,IAAAiE,GAAI,IAAAC,GAAI,IAAAC,GAAI,IAAAC,GAAI,OAAAzF,GAAO,GAAGqF,GAAWC,GAAIC,GAAIC,GAAIC,CAAE,EAAA;AAAA,IACtE,CAAC;AAAA,IACL,CAACI,GAAaE,GAAY/C,CAAM;AAAA,EAAA;AAGpC,SACI,gBAAA/U,EAAC,KAAA,EACI,UAAAgY,EAAM,IAAI,CAACG,GAAInX,MACZ,gBAAAlB,EAAC,KAAA,EAAU,cAAc,gBAAAY,EAAA,CAAC+U,MAAMN,EAAQnU,GAAGyU,CAAC,GAAnB,iBAAsB,aAAa,gBAAA/U,EAAA,CAAC+U,MAAMN,EAAQnU,GAAGyU,CAAC,GAAnB,gBAAsB,cAAcL,GAAS,OAAO,EAAE,QAAQ,aACtH,UAAA;AAAA,IAAA,gBAAApV,EAAC,QAAA,EAAK,GAAGmY,EAAG,GAAG,MAAK,QAAO,QAAO,eAAc,cAAcA,EAAG,QAAQ,KAAK9C,GAAG;AAAA,sBAChF,QAAA,EAAK,GAAG8C,EAAG,GAAG,MAAK,QAAO,QAAQjG,GAAa,aAAaiG,EAAG,QAAQ9C,GAAG,SAASwC,MAAe7W,IAAI,MAAM,KAAK,eAAc,QAAA,CAAQ;AAAA,EAAA,KAFpIA,CAGR,CACH,GACL;AAER;AArCSN,EAAAiX,IAAA;AAuCT,SAASS,GAAgB,EAAE,aAAAR,GAAa,aAAA1F,KAAsE;AAC1G,QAAM,EAAE,GAAAmD,EAAA,IAAMC,GAAA;AACd,SACI,gBAAAtV,EAAAuR,IAAA,EACK,YAAY,IAAI,CAAC6B,GAAGpS,MACjB,gBAAAlB,EAACsI,GAAM,UAAN,EACG,UAAA;AAAA,IAAA,gBAAApI,EAACwV,MAAO,aAAa,CAACpC,EAAE,SAASA,EAAE,OAAO,GACtC,UAAA,gBAAApT,EAAC,UAAA,EAAO,GAAG,IAAIqV,GAAG,MAAMnD,GAAa,SAAS,KAAK,GACvD;AAAA,sBACCsD,IAAA,EAAO,aAAa,CAACpC,EAAE,OAAOA,EAAE,KAAK,GAClC,UAAA,gBAAApT,EAAC,UAAA,EAAO,GAAG,IAAIqV,GAAG,MAAMnD,GAAa,SAAS,KAAK,EAAA,CACvD;AAAA,EAAA,KANiBlR,CAOrB,CACH,GACL;AAER;AAhBSN,EAAA0X,IAAA;AAkBF,SAASC,GAAmB;AAAA,EAC/B,MAAA9Q;AAAA,EACA,OAAA3G;AAAA,EACA,QAAA2K,IAAS;AAAA,EACT,OAAAiG;AAAA,EACA,eAAA8G,IAAgB;AAAA,EAChB,aAAAjZ;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,aAAA2T;AAAA,EACA,QAAQ0C;AAAA,EACR,SAAA3C,IAAU;AAAA,EACV,QAAA4C;AACJ,GAAwB;AACpB,QAAMjS,IAAQC,GAAA,GACRgU,KAAcrQ,KAAA,gBAAAA,EAAM,SAAQ,CAAA,GAC5B,CAACsO,GAASC,CAAU,IAAIpN,GAAwD,IAAI,GACpF,CAACmP,GAAYU,CAAa,IAAI7P,GAAwB,IAAI,GAC1DjJ,IAAMJ,KAAeK,IACrB2M,IAAS6B,GAAiBvK,CAAK,EAAE,QACjCuO,IAAcV,KAASnF,EAAO,IAAIA,EAAO,MAAM,GAC/C0J,IAAStB,GAAamB,CAAM,GAE5BI,IAAW5L,GAAMzG,EAAM,QAAQ,KAAK,SAAS,IAAI,GACjDsS,IAAY7L,GAAMzG,EAAM,QAAQ,KAAK,SAAS,IAAI,GAClDuS,IAAavS,EAAM,QAAQ,SAC3BwS,IAAgBxS,EAAM,QAAQ,KAAK,UAEnCoR,IAASpM,EAAQ,MAAM,KAAK,IAAI,GAAG,GAAGiP,EAAY,IAAI,CAACxE,MAAM,KAAK,IAAIA,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAACwE,CAAW,CAAC,GACpGY,IAAY7P,EAAQ,MAAMiP,EAAY,QAAQ,CAACxE,MAAM,CAAC,EAAE,KAAKA,EAAE,SAAS,KAAKA,EAAE,WAAW,EAAE,KAAKA,EAAE,OAAO,KAAKA,EAAE,MAAA,CAAO,CAAC,GAAG,CAACwE,CAAW,CAAC,GACzIxB,IAAWzN,EAAQ,MAAMkK,GAAmB2F,GAAW,EAAE,SAAAxF,GAAS,aAAAC,GAAa,QAAQ0C,EAAA,CAAY,GAAG,CAAC6C,GAAWxF,GAASC,GAAa0C,CAAU,CAAC,GAEnJ8C,IAAiBnC;AAAA,IACnB,CAACtV,GAAWyU,MAAwB;AAChC,YAAMrC,IAAIwE,EAAY5W,CAAC,GACjBuV,IAAO,GAAGnD,EAAE,SAAS,EAAE,IAAIA,EAAE,SAAS,OAAO3T,EAAI2T,EAAE,KAAK,IAAI,EAAE,GAAG,KAAA;AACvE,UAAI,CAACmD,EAAM;AACX,YAAMC,IAAOf,EAAE,cAA0B,QAAQ,KAAK;AACtD,UAAI,CAACe,EAAK;AACV,YAAMC,IAAOD,EAAI,sBAAA;AACjB,MAAA+B,EAAcvX,CAAC,GACf8U,EAAW,EAAE,GAAGL,EAAE,UAAUgB,EAAK,MAAM,GAAGhB,EAAE,UAAUgB,EAAK,KAAK,MAAAF,EAAA,CAAM;AAAA,IAC1E;AAAA,IACA,CAACqB,GAAanY,CAAG;AAAA,EAAA,GAEfiX,IAAeJ,GAAY,MAAM;AACnC,IAAAiC,EAAc,IAAI,GAClBzC,EAAW,IAAI;AAAA,EACnB,GAAG,CAAA,CAAE;AAEL,MAAIxW;AACA,WACI,gBAAAQ,EAACD,GAAA,EAAI,eAAY,WAAU,IAAI,EAAE,QAAQ,QAAQ,GAAG,EAAA,GAC/C,UAAA;AAAA,MAAAe,KAAS,gBAAAZ,EAACC,GAAA,EAAS,SAAQ,QAAO,OAAO,KAAK,IAAI,EAAE,UAAU,WAAW,IAAI,EAAA,EAAE,CAAG;AAAA,wBAClFA,GAAA,EAAS,SAAQ,WAAU,OAAM,QAAO,QAAAsL,EAAA,CAAgB;AAAA,IAAA,GAC7D;AAIR,QAAMoL,IAAgB,EAAE,SAAS,EAAE,SAAS,UAAU,OAAO,EAAE,SAAS,UAAU,SAAS,EAAE,SAAS,SAAO;AAE7G,SACI,gBAAA7W,EAACD,GAAA,EAAI,IAAI,EAAE,QAAQ,QAAQ,GAAG,GAAG,UAAU,OAAA,GACtC,UAAA;AAAA,IAAAe,KAAS,gBAAAZ,EAACS,KAAW,SAAQ,MAAK,IAAI,EAAE,IAAI,EAAA,GAAM,UAAAG,EAAA,CAAM;AAAA,sBACxDf,GAAA,EAAI,IAAI,EAAE,UAAU,cACjB,UAAA;AAAA,MAAA,gBAAAG;AAAA,QAAC4W;AAAA,QAAA;AAAA,UACG,YAAW;AAAA,UACX,kBAAkB,EAAE,OAAOlE,GAAA;AAAA,UAC3B,OAAO;AAAA,UACP,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,SAAS,SAAS,YAAY/O,EAAM,QAAQ,WAAW,SAAS,cAAcA,EAAM,MAAM,aAAA;AAAA,UAElI,UAAA,gBAAA7D,EAAC+W,IAAA,EAAc,QAAQT,EAAS,QAAQ,MAAMA,EAAS,MAAM,SAAS,GAAG,SAAS,IAC7E,UAAA;AAAA,YAAAL,EAAO;AAAA,cAAI,CAACe,GAAKC,MACdA,MAAQ,IACJ,gBAAA/W,EAACgX,IAAA,EAAsB,WAAWF,GAC7B,6BAAC,EAAE,aAAAG,EAAA,MACAA,EAAY,IAAI,CAACC,MACb,gBAAAlX,EAACmX,IAAA,EAA2B,WAAWD,GAAK,MAAMlB,GAAU,QAAQE,GAAY,aAAa,KAAK,OAAO,EAAE,GAAGS,GAAe,OAAO,EAAE,SAAS,QAAQ,MAAMV,EAAA,EAAU,EAAE,GAAzJiB,EAAI,MAAwJ,CAC/K,kBAJSJ,CAMlB,IAEA,gBAAA9W,EAACgX,IAAA,EAAsB,WAAWF,GAC7B,UAAA,gBAAApW,EAAA,CAAC,EAAE,aAAAuW,EAAA,MACAA,EAAY,IAAI,CAACC,wBACZC,IAAA,EAA2B,WAAWD,GAAK,MAAK,QAAO,QAAQf,GAAe,aAAa,KAAK,OAAOQ,EAAA,GAAxFO,EAAI,MAAmG,CAC1H,GAHJ,eADaJ,CAMlB;AAAA,YAAA;AAAA,YAIR,gBAAA9W,EAAC2X,MAAe,aAAAC,GAA0B,QAAA7C,GAAgB,aAAA7C,GAA0B,YAAA2F,GAAwB,SAASY,GAAgB,SAAS/B,EAAA,CAAc;AAAA,YAC3J4B,KAAiB,gBAAAtY,EAACoY,IAAA,EAAgB,aAAAR,GAA0B,aAAA1F,EAAA,CAA0B;AAAA,UAAA,EAAA,CAC3F;AAAA,QAAA;AAAA,MAAA;AAAA,MAGH2D,KACG,gBAAA7V;AAAA,QAACH;AAAA,QAAA;AAAA,UACG,IAAI;AAAA,YACA,UAAU;AAAA,YACV,MAAMgW,EAAQ;AAAA,YACd,KAAKA,EAAQ,IAAI;AAAA,YACjB,WAAW;AAAA,YACX,SAAS;AAAA,YACT,OAAO;AAAA,YACP,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,cAAc;AAAA,YACd,UAAU;AAAA,YACV,eAAe;AAAA,YACf,QAAQ;AAAA,YACR,aAAa;AAAA,YACb,YAAY;AAAA,YACZ,QAAQ;AAAA,YACR,WAAW;AAAA,UAAA;AAAA,UAGd,UAAAA,EAAQ;AAAA,QAAA;AAAA,MAAA;AAAA,IACb,EAAA,CAER;AAAA,EAAA,GACJ;AAER;AA3HgBnV,EAAA2X,IAAA;AClGhB,SAASK,EAAGC,GAAaC,GAA+B;AACpD,SAAO,EAAEA,IAAM,OAAO,MAAM,MAAO,KAAKD,KAAO,MAAM,GAAG;AAC5D;AAFSjY,EAAAgY,GAAA;AAIT,SAASG,GAAO/F,GAAoC;AAChD,SAAOA,EAAO,IAAI,CAAC,CAAC5D,GAAGC,CAAC,GAAG,MAAM,GAAG,MAAM,IAAI,MAAM,GAAG,GAAGD,EAAE,QAAQ,CAAC,CAAC,IAAIC,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG,IAAI;AAC1G;AAFSzO,EAAAmY,IAAA;AAIT,MAAMC,KAAeD,GAAO;AAAA,EACxBH,EAAG,IAAI,IAAI;AAAA,EAAGA,EAAG,IAAI,IAAI;AAAA,EAAGA,EAAG,IAAI,IAAI;AAAA,EAAGA,EAAG,IAAI,GAAG;AAAA,EAAGA,EAAG,IAAI,GAAG;AAAA,EACjEA,EAAG,IAAI,GAAG;AAAA,EAAGA,EAAG,IAAI,GAAG;AAAA,EAAGA,EAAG,IAAI,GAAG;AAAA,EAAGA,EAAG,IAAI,GAAG;AAAA,EAAGA,EAAG,IAAI,GAAG;AAAA,EAC9DA,EAAG,IAAI,GAAG;AAAA,EAAGA,EAAG,IAAI,GAAG;AAAA,EAAGA,EAAG,IAAI,IAAI;AAAA,EAAGA,EAAG,IAAI,IAAI;AAAA,EAAGA,EAAG,IAAI,IAAI;AAAA,EACjEA,EAAG,IAAI,IAAI;AAAA,EAAGA,EAAG,IAAI,IAAI;AAAA,EAAGA,EAAG,IAAI,IAAI;AAAA,EAAGA,EAAG,IAAI,IAAI;AACzD,CAAC,GAEKK,KAAeF,GAAO;AAAA,EACxBH,EAAG,IAAI,GAAG;AAAA,EAAGA,EAAG,IAAI,GAAG;AAAA,EAAGA,EAAG,GAAG,GAAG;AAAA,EAAGA,EAAG,GAAG,GAAG;AAAA,EAAGA,EAAG,IAAI,GAAG;AAAA,EAC5DA,EAAG,KAAK,GAAG;AAAA,EAAGA,EAAG,KAAK,GAAG;AAAA,EAAGA,EAAG,KAAK,GAAG;AAAA,EAAGA,EAAG,KAAK,GAAG;AAAA,EAAGA,EAAG,KAAK,GAAG;AAAA,EACnEA,EAAG,KAAK,GAAG;AAAA,EAAGA,EAAG,KAAK,GAAG;AAAA,EAAGA,EAAG,KAAK,GAAG;AAAA,EAAGA,EAAG,IAAI,GAAG;AAAA,EAAGA,EAAG,GAAG,GAAG;AACpE,CAAC,GAEKM,KAASH,GAAO;AAAA,EAClBH,EAAG,IAAI,GAAG;AAAA,EAAGA,EAAG,IAAI,CAAC;AAAA,EAAGA,EAAG,IAAI,CAAC;AAAA,EAAGA,EAAG,IAAI,EAAE;AAAA,EAAGA,EAAG,IAAI,GAAG;AAAA,EACzDA,EAAG,IAAI,EAAE;AAAA,EAAGA,EAAG,IAAI,CAAC;AAAA,EAAGA,EAAG,IAAI,EAAE;AAAA,EAAGA,EAAG,IAAI,EAAE;AAAA,EAAGA,EAAG,IAAI,EAAE;AAAA,EACxDA,EAAG,IAAI,EAAE;AAAA,EAAGA,EAAG,IAAI,EAAE;AAAA,EAAGA,EAAG,IAAI,EAAE;AAAA,EAAGA,EAAG,IAAI,EAAE;AAAA,EAAGA,EAAG,IAAI,CAAC;AAAA,EACxDA,EAAG,IAAI,CAAC;AAAA,EAAGA,EAAG,IAAI,EAAE;AAAA,EAAGA,EAAG,IAAI,EAAE;AAAA,EAAGA,EAAG,IAAI,CAAC;AAAA,EAAGA,EAAG,IAAI,EAAE;AAC3D,CAAC,GAEKO,KAASJ,GAAO;AAAA,EAClBH,EAAG,IAAI,GAAG;AAAA,EAAGA,EAAG,IAAI,EAAE;AAAA,EAAGA,EAAG,IAAI,EAAE;AAAA,EAAGA,EAAG,IAAI,EAAE;AAAA,EAAGA,EAAG,IAAI,EAAE;AAAA,EAC1DA,EAAG,IAAI,EAAE;AAAA,EAAGA,EAAG,GAAG,EAAE;AAAA,EAAGA,EAAG,IAAI,EAAE;AAAA,EAAGA,EAAG,KAAK,EAAE;AAAA,EAAGA,EAAG,KAAK,EAAE;AAAA,EAC1DA,EAAG,KAAK,EAAE;AAAA,EAAGA,EAAG,KAAK,EAAE;AAAA,EAAGA,EAAG,KAAK,EAAE;AAAA,EAAGA,EAAG,KAAK,EAAE;AAAA,EAAGA,EAAG,IAAI,EAAE;AAAA,EAC7DA,EAAG,GAAG,EAAE;AAAA,EAAGA,EAAG,IAAI,GAAG;AAAA,EAAGA,EAAG,IAAI,GAAG;AAAA,EAAGA,EAAG,IAAI,GAAG;AAAA,EAAGA,EAAG,IAAI,GAAG;AAChE,CAAC,GAEKQ,KAAOL,GAAO;AAAA,EAChBH,EAAG,IAAI,EAAE;AAAA,EAAGA,EAAG,IAAI,EAAE;AAAA,EAAGA,EAAG,IAAI,GAAG;AAAA,EAAGA,EAAG,IAAI,GAAG;AAAA,EAAGA,EAAG,IAAI,GAAG;AAAA,EAC5DA,EAAG,IAAI,GAAG;AAAA,EAAGA,EAAG,IAAI,GAAG;AAAA,EAAGA,EAAG,IAAI,GAAG;AAAA,EAAGA,EAAG,IAAI,GAAG;AAAA,EAAGA,EAAG,IAAI,GAAG;AAAA,EAC9DA,EAAG,IAAI,GAAG;AAAA,EAAGA,EAAG,IAAI,GAAG;AAAA,EAAGA,EAAG,GAAG,GAAG;AAAA,EAAGA,EAAG,GAAG,EAAE;AAAA,EAAGA,EAAG,IAAI,EAAE;AAAA,EAC1DA,EAAG,IAAI,EAAE;AAAA,EAAGA,EAAG,IAAI,EAAE;AAAA,EAAGA,EAAG,IAAI,EAAE;AAAA,EAAGA,EAAG,IAAI,EAAE;AAAA,EAAGA,EAAG,IAAI,EAAE;AAAA,EACzDA,EAAG,IAAI,EAAE;AAAA,EAAGA,EAAG,IAAI,EAAE;AAAA,EAAGA,EAAG,IAAI,EAAE;AAAA,EAAGA,EAAG,IAAI,EAAE;AACjD,CAAC,GAEKS,KAAYN,GAAO;AAAA,EACrBH,EAAG,KAAK,GAAG;AAAA,EAAGA,EAAG,KAAK,GAAG;AAAA,EAAGA,EAAG,KAAK,GAAG;AAAA,EAAGA,EAAG,KAAK,GAAG;AAAA,EACrDA,EAAG,KAAK,GAAG;AAAA,EAAGA,EAAG,KAAK,GAAG;AAAA,EAAGA,EAAG,KAAK,GAAG;AAAA,EAAGA,EAAG,KAAK,GAAG;AAAA,EACrDA,EAAG,KAAK,GAAG;AAAA,EAAGA,EAAG,KAAK,GAAG;AAAA,EAAGA,EAAG,KAAK,GAAG;AAC3C,CAAC,GAEYU,KAAkB,CAACN,IAAcC,IAAcC,IAAQC,IAAQC,IAAMC,EAAS,GAE9EE,KAAc;AAEpB,SAASC,GAAWX,GAAaC,GAA+B;AACnE,SAAOF,EAAGC,GAAKC,CAAG;AACtB;AAFgBlY,EAAA4Y,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}