{"version":3,"file":"index.cjs","sources":["../src/context.js","../src/helpers/reorder.js","../src/components/grid/GroupCellText.jsx","../src/components/grid/TextCell.jsx","../src/components/grid/ActionCell.jsx","../src/components/grid/ResourcesCell.jsx","../src/components/grid/EditorResourcesCell.jsx","../src/helpers/setTaskResources.js","../src/helpers/grid.js","../src/components/grid/Grid.jsx","../src/components/chart/CellGrid.jsx","../src/components/chart/Links.jsx","../src/components/chart/BarSegments.jsx","../src/components/chart/Rollups.jsx","../src/components/chart/Bars.jsx","../src/components/chart/TimeScale.jsx","../src/helpers/zoom.js","../src/helpers/debug.js","../src/components/chart/Chart.jsx","../src/components/Resizer.jsx","../src/components/Layout.jsx","../src/helpers/prepareConfig.js","../src/components/Gantt.jsx","../src/components/Toolbar.jsx","../src/components/ContextMenu.jsx","../src/components/editor/GridSection.jsx","../src/components/editor/LinkTypeCell.jsx","../src/components/editor/Links.jsx","../src/components/editor/DateTimePicker.jsx","../src/components/editor/ResourcesEditorCell.jsx","../src/components/editor/Resources.jsx","../src/components/editor/Segments.jsx","../src/components/Editor.jsx","../src/components/grid/HeaderMenu.jsx","../src/components/resource/NameCell.jsx","../src/components/resource/NameCellCompact.jsx","../src/components/resource/LoadCell.jsx","../src/components/resource/ResourceLoad.jsx","../src/widgets/Tooltip.jsx","../src/themes/Material.jsx","../src/themes/Willow.jsx","../src/themes/WillowDark.jsx","../src/index.js"],"sourcesContent":["import { createContext } from 'react';\n\nconst store = createContext(null);\nexport default store;\n","import { locate, getID } from '@svar-ui/lib-dom';\n\nfunction getOffset(node, relative, ev) {\n  const box = node.getBoundingClientRect();\n  const base = relative.querySelector('.wx-body').getBoundingClientRect();\n\n  return {\n    top: box.top - base.top,\n    left: box.left - base.left,\n    dt: box.bottom - ev.clientY,\n    db: ev.clientY - box.top,\n  };\n}\n\nfunction checkSource(node) {\n  return node && getID(node, 'data-context-id');\n}\n\nconst SHIFT = 5;\n\nexport function reorder(node, config) {\n  let source, clone, sid;\n  let x, y, base, detail;\n  let touched, touchTimer;\n\n  function down(event) {\n    x = event.clientX;\n    y = event.clientY;\n    base = {\n      ...getOffset(source, node, event),\n      y: config.getTask(sid).$y,\n    };\n\n    document.body.style.userSelect = 'none';\n  }\n\n  function handleTouchstart(event) {\n    if (config.isDisabled?.()) return;\n    source = locate(event);\n    if (!checkSource(source)) return;\n\n    sid = getID(source);\n\n    touchTimer = setTimeout(() => {\n      touched = true;\n      if (config && config.touchStart) config.touchStart();\n      down(event.touches[0]);\n    }, 500);\n\n    node.addEventListener('touchmove', handleTouchmove);\n    node.addEventListener('contextmenu', handleContext);\n    window.addEventListener('touchend', handleTouchend);\n  }\n\n  function handleContext(event) {\n    if (touched || touchTimer) {\n      event.preventDefault();\n      return false;\n    }\n  }\n\n  function handleMousedown(event) {\n    if (config.isDisabled?.() || event.which !== 1) return;\n\n    source = locate(event);\n    if (!checkSource(source)) return;\n\n    sid = getID(source);\n\n    node.addEventListener('mousemove', handleMousemove);\n    window.addEventListener('mouseup', handleMouseup);\n\n    down(event);\n  }\n\n  function end(full) {\n    node.removeEventListener('mousemove', handleMousemove);\n    node.removeEventListener('touchmove', handleTouchmove);\n    document.body.removeEventListener('mouseup', handleMouseup);\n    document.body.removeEventListener('touchend', handleTouchend);\n    document.body.style.userSelect = '';\n\n    if (full) {\n      node.removeEventListener('mousedown', handleMousedown);\n      node.removeEventListener('touchstart', handleTouchstart);\n    }\n  }\n\n  function move(event) {\n    const dx = event.clientX - x;\n    const dy = event.clientY - y;\n    if (!clone) {\n      if (Math.abs(dx) < SHIFT && Math.abs(dy) < SHIFT) return;\n      if (config && config.start) {\n        if (config.start({ id: sid, e: event }) === false) return;\n      }\n\n      clone = source.cloneNode(true);\n      clone.style.pointerEvents = 'none';\n      clone.classList.add('wx-reorder-task');\n      clone.style.position = 'absolute';\n      clone.style.left = base.left + 'px';\n      clone.style.top = base.top + 'px';\n\n      source.style.visibility = 'hidden';\n      source.parentNode.insertBefore(clone, source);\n    }\n\n    if (clone) {\n      const top = Math.round(Math.max(0, base.top + dy));\n\n      if (config && config.move) {\n        if (config.move({ id: sid, top, detail }) === false) return;\n      }\n\n      const task = config.getTask(sid);\n      const y = task.$y;\n      //dnd may be blocked\n      if (!base.start && base.y === y) return up();\n\n      base.start = true;\n      base.y = task.$y - 4;\n      clone.style.top = top + 'px'; //task.$y - scroll\n\n      const targetNode = document.elementFromPoint(\n        event.clientX,\n        event.clientY,\n      );\n      const target = locate(targetNode);\n\n      if (target && target !== source) {\n        const tid = getID(target);\n        const box = target.getBoundingClientRect();\n        const line = box.top + box.height / 2;\n\n        const after =\n          event.clientY + base.db > line &&\n          target.nextElementSibling !== source;\n        const before =\n          event.clientY - base.dt < line &&\n          target.previousElementSibling !== source;\n\n        if (detail?.after === tid || detail?.before === tid) {\n          // avoid duplicate calls\n          detail = null;\n        } else if (after) {\n          // move down\n          detail = { id: sid, after: tid };\n        } else if (before) {\n          // move up\n          detail = { id: sid, before: tid };\n        }\n      }\n    }\n  }\n\n  function handleMousemove(event) {\n    move(event);\n  }\n\n  function handleTouchmove(event) {\n    if (touched) {\n      event.preventDefault();\n      move(event.touches[0]);\n    } else if (touchTimer) {\n      clearTimeout(touchTimer);\n      touchTimer = null;\n    }\n  }\n\n  function handleTouchend() {\n    touched = null;\n    if (touchTimer) {\n      clearTimeout(touchTimer);\n      touchTimer = null;\n    }\n    up();\n  }\n\n  function handleMouseup() {\n    up();\n  }\n\n  function up() {\n    if (source) {\n      source.style.visibility = '';\n    }\n    if (clone) {\n      clone.parentNode.removeChild(clone);\n      if (config && config.end) config.end({ id: sid, top: base.top });\n    }\n\n    sid = source = clone = base = detail = null;\n    end();\n  }\n\n  if (node.style.position !== 'absolute') node.style.position = 'relative';\n\n  node.addEventListener('mousedown', handleMousedown);\n  node.addEventListener('touchstart', handleTouchstart);\n\n  return {\n    destroy() {\n      end(true);\n    },\n  };\n}\n","import { useContext, useMemo } from 'react';\nimport { Avatar, context } from '@svar-ui/react-core';\nimport { useStore } from '@svar-ui/lib-react';\nimport storeContext from '../../context';\nimport './GroupCellText.css';\n\nfunction GroupCellText(props) {\n\tconst { row } = props;\n\n\tconst i18n = useContext(context.i18n);\n\tconst _ = useMemo(() => i18n.getGroup('gantt'), [i18n]);\n\n\tconst api = useContext(storeContext);\n\tconst groupBy = useStore(api, 'groupBy');\n\tconst resources = useStore(api, 'resources');\n\n\tconst resourceData = useMemo(() => {\n\t\tif (groupBy?.field === 'resource') {\n\t\t\tlet value = row.$groupValue;\n\t\t\tif (!Array.isArray(value)) value = [value];\n\t\t\treturn value.map(id => resources.byId(id)).filter(Boolean);\n\t\t}\n\t\treturn null;\n\t}, [groupBy, resources, row]);\n\n\tconst ungroupLabel = useMemo(\n\t\t() => (groupBy?.field === 'resource' ? _('Unassigned') : _('Ungrouped')),\n\t\t[groupBy, _]\n\t);\n\n\treturn (\n\t\t<div className=\"wx-group-text wx-aab2WKOu\">\n\t\t\t{row.$groupValue === '$ungrouped' ? (\n\t\t\t\tungroupLabel\n\t\t\t) : resourceData?.length ? (\n\t\t\t\t<>\n\t\t\t\t\t<Avatar value={resourceData} size={28}></Avatar>\n\t\t\t\t\t{resourceData.length === 1 && (\n\t\t\t\t\t\t<span className=\"wx-name wx-aab2WKOu\">\n\t\t\t\t\t\t\t{resourceData[0].name}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t)}\n\t\t\t\t</>\n\t\t\t) : (\n\t\t\t\trow.text\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nexport default GroupCellText;\n","import './TextCell.css';\nimport GroupCellText from './GroupCellText.jsx';\n\nfunction TextCell({ row, column }) {\n  function getStyle(row, col) {\n    return {\n      justifyContent: col.align,\n      paddingLeft: `${(row.$level - 1) * 20}px`,\n    };\n  }\n\n  const CellComponent = column && column._cell;\n\n  return (\n    <div className=\"wx-pqc08MHU wx-content\" style={getStyle(row, column)}>\n      {!row.$empty && (row.data?.length || row.lazy) ? (\n        <i\n          className={`wx-pqc08MHU wx-toggle-icon wxi-menu-${row.open ? 'down' : 'right'}`}\n          data-action=\"open-task\"\n        />\n      ) : (\n        <i className=\"wx-pqc08MHU wx-toggle-placeholder\" />\n      )}\n      <div className=\"wx-pqc08MHU wx-text\">\n        {CellComponent ? (\n          <CellComponent row={row} column={column} />\n        ) : row.$group ? (\n          <GroupCellText row={row} />\n        ) : (\n          row.text\n        )}\n      </div>\n    </div>\n  );\n}\n\nexport default TextCell;\n","import { useMemo } from 'react';\nimport './ActionCell.css';\n\nfunction ActionCell({ column, row, cell }) {\n  const action = useMemo(() => column.id, [column?.id]);\n\n  const icon = useMemo(() => {\n    if (action.includes('edit')) return 'wxi-edit';\n    if (action.includes('add')) return 'wxi-plus';\n    if (action.includes('delete')) return 'wxi-delete';\n    return '';\n  }, [action]);\n\n  const disabled = useMemo(() => {\n    if (!action.includes('add')) return false;\n    const gValue = row.$groupValue;\n    return (\n      (!row.$group && typeof gValue !== 'undefined') ||\n      (row.$group && typeof gValue === 'undefined')\n    );\n  }, [action, row]);\n\n  return cell || icon ? (\n    <div style={{ textAlign: column.align }}>\n      <i\n        className={`wx-9DAESAHW wx-action-icon ${icon}${\n          disabled ? ' wx-disabled' : ''\n        }`}\n        data-action={!disabled && action}\n      ></i>\n    </div>\n  ) : null;\n}\n\nexport default ActionCell;\n","import { useContext, useMemo } from 'react';\nimport { Avatar } from '@svar-ui/react-core';\nimport { useStore } from '@svar-ui/lib-react';\nimport storeContext from '../../context';\nimport './ResourcesCell.css';\n\nfunction ResourcesCell({ row }) {\n  const api = useContext(storeContext);\n  const assignmentsVal = useStore(api, 'assignments');\n\n  const assigned = useMemo(\n    () => api.getTaskResources(row.$id || row.id),\n    [api, assignmentsVal, row]\n  );\n\n  return (\n    <div className=\"wx-aadpwBM9 wx-avatar\">\n      <Avatar value={assigned} size={28} />\n    </div>\n  );\n}\n\nexport default ResourcesCell;\n","import { useMemo } from 'react';\nimport { Avatar } from '@svar-ui/react-core';\n\nimport './EditorResourcesCell.css';\n\nfunction EditorResourcesCell(props) {\n\tconst { data } = props;\n\tconst count = useMemo(() => data.length, [data]);\n\n\tif (Array.isArray(data)) {\n\t\treturn (\n\t\t\t<div className=\"wx-avatar-box wx-aaexf6PM\">\n\t\t\t\t{count ? <Avatar value={data} size={28} /> : null}\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"wx-resource-option wx-aaexf6PM\">\n\t\t\t<div className=\"wx-aaexf6PM\">\n\t\t\t\t<Avatar value={data} size={28} />\n\t\t\t</div>\n\t\t\t<div className=\"wx-name wx-aaexf6PM\">{data.name}</div>\n\t\t</div>\n\t);\n}\n\nexport default EditorResourcesCell;\n","export function setTaskResources(taskId, resourceIds, api) {\n  const { _assignments } = api.getState();\n  const assigned = _assignments.byTask[taskId];\n  const prevResources = assigned?.map((a) => a.resource);\n  const prev = new Set(prevResources || []);\n  const next = new Set(resourceIds || []);\n  // Assign and unassign resources\n  const history = api.getHistory();\n  if (history) history.startBatch();\n  for (const rId of prev) {\n    if (!next.has(rId)) {\n      const assignment = assigned.find((a) => a.resource === rId);\n      api.exec('delete-assignment', { id: assignment.id });\n    }\n  }\n  for (const rId of next) {\n    if (!prev.has(rId)) {\n      api.exec('add-assignment', {\n        assignment: {\n          resource: rId,\n          task: taskId,\n        },\n      });\n    }\n  }\n  if (history) history.endBatch();\n}\n","export function getGridMinHeight(gridHeight, cellHeight) {\n  return `min-height:${gridHeight + cellHeight * 4}px;`;\n}\n\nexport function getGridStyle(displayMode, columnWidth, scrollX) {\n  return scrollX && displayMode === 'all'\n    ? `width:${columnWidth}px;`\n    : displayMode === 'grid'\n      ? scrollX\n        ? `width:${columnWidth}px;`\n        : `width:100%;`\n      : ``;\n}\n\nexport function getFlexBasis(columns, displayMode, gridWidth) {\n  const addCol = columns.find((c) => c.id === 'add-task');\n  return displayMode === 'all'\n    ? `${gridWidth}px`\n    : displayMode === 'grid'\n      ? 'calc(100% - 4px)'\n      : addCol\n        ? `${addCol.width}px`\n        : '0';\n}\n\nexport function getScrollX(\n  compactMode,\n  displayMode,\n  columnWidth,\n  containerWidth,\n  gridWidth,\n) {\n  return !compactMode && displayMode !== 'grid'\n    ? columnWidth > gridWidth\n    : columnWidth > containerWidth;\n}\n\nexport function getFitColumns(columns, displayMode, colId = 'add-task') {\n  return displayMode === 'chart'\n    ? [\n        {\n          ...columns.filter((c) => c.id === colId)[0],\n          resize: false,\n        },\n      ]\n    : columns;\n}\n\nexport function getFillColumn(columns, id) {\n  const ok = (c) => c.id !== 'add-task' && c.id !== id && !c.hidden;\n  return columns\n    .filter(ok)\n    .reduce((max, c) => (!max || c.width > max.width ? c : max), null)?.id;\n}\n\nexport function getColumnsWidth(columns) {\n  return columns.reduce((acc, c) => acc + (c.hidden ? 0 : c.width), 0);\n}\n\nexport function getSortMarks(tasks, sort) {\n  if (tasks && sort?.length) {\n    const marks = {};\n    sort.forEach(({ key, order }, index) => {\n      marks[key] = {\n        order,\n        ...(sort.length > 1 && { index }),\n      };\n    });\n    return marks;\n  }\n  return {};\n}\n\nexport function getResourceLoadColumns(scales, LoadCell, template) {\n  if (!scales) return [];\n  const lowestRow = scales.rows[scales.rows.length - 1];\n  const { cells } = lowestRow;\n  const unit = scales.minUnit;\n\n  if (unit === 'day') return getLoadColumns(cells, LoadCell, template);\n\n  const dayMs = 24 * 60 * 60 * 1000;\n  const stepMs = cells.length\n    ? (cells.length > 1 ? cells[1].date.getTime() : scales.end.getTime()) -\n      cells[0].date.getTime()\n    : 0;\n  const isSubDayStep = stepMs && stepMs < dayMs;\n\n  if (isSubDayStep) {\n    const dayCols = [];\n    let group = null;\n    cells.forEach((cell) => {\n      if (!group || group.key !== cell.key) {\n        group = {\n          id: cell.key,\n          key: cell.key,\n          width: 0,\n          date: cell.date,\n          unit: cell.unit,\n        };\n        dayCols.push(group);\n      }\n      group.width += cell.width;\n    });\n\n    return getLoadColumns(dayCols, LoadCell, template);\n  } else return getLoadColumns(cells, LoadCell, template, true);\n}\n\nfunction getLoadColumns(cells, LoadCell, template, unitLoad) {\n  return cells.map((cell) => ({\n    id: cell.key,\n    width: cell.width,\n    date: cell.date,\n    unit: cell.unit,\n    getter: (row) =>\n      unitLoad ? row.$unitLoad?.[cell.key] : row.$load?.[cell.key],\n    template: (v) => {\n      if (!v) return '';\n      return template ? template(v) : `${v.hours}h`;\n    },\n    cell: LoadCell,\n  }));\n}\n\nexport function getScrollbarWidth() {\n  const div = document.createElement('div');\n  div.style.cssText =\n    'position:absolute;left:-1000px;width:100px;padding:0;margin:0;min-height:100px;overflow-y:scroll;';\n  document.body.appendChild(div);\n  const w = div.offsetWidth - div.clientWidth;\n  document.body.removeChild(div);\n  return w;\n}\n","import {\n  useCallback,\n  useContext,\n  useEffect,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'react';\nimport { context } from '@svar-ui/react-core';\nimport { locateID } from '@svar-ui/lib-dom';\nimport { reorder } from '../../helpers/reorder';\nimport { prepareEditTask } from '@svar-ui/gantt-store';\nimport { Grid as WxGrid } from '@svar-ui/react-grid';\nimport TextCell from './TextCell.jsx';\nimport ActionCell from './ActionCell.jsx';\nimport ResourcesCell from './ResourcesCell.jsx';\nimport EditorResourcesCell from './EditorResourcesCell.jsx';\nimport { setTaskResources } from '../../helpers/setTaskResources.js';\nimport {\n  getGridMinHeight,\n  getGridStyle,\n  getFlexBasis,\n  getScrollX,\n  getFitColumns,\n  getFillColumn,\n  getColumnsWidth,\n  getSortMarks,\n} from '../../helpers/grid';\nimport { useStore } from '@svar-ui/lib-react';\nimport storeContext from '../../context';\nimport './Grid.css';\n\nfunction cssTextToStyle(cssText) {\n  const style = {};\n  cssText.split(';').forEach((decl) => {\n    const idx = decl.indexOf(':');\n    if (idx === -1) return;\n    const prop = decl.slice(0, idx).trim();\n    const value = decl.slice(idx + 1).trim();\n    if (!prop) return;\n    const key = prop.startsWith('--')\n      ? prop\n      : prop.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n    style[key] = value;\n  });\n  return style;\n}\n\nexport default function Grid(props) {\n  const { readonly, onTableAPIChange } = props;\n  const [columnWidth, setColumnWidth] = useState(0);\n  const [tableAPI, setTableAPI] = useState();\n\n  const i18n = useContext(context.i18n);\n  const _ = useMemo(() => i18n.getGroup('gantt'), [i18n]);\n  const api = useContext(storeContext);\n\n  const scrollTopVal = useStore(api, 'scrollTop');\n  const cellHeightVal = useStore(api, 'cellHeight');\n  const focusTask = useStore(api, 'focusTask');\n  const selectedVal = useStore(api, '_selected');\n  const areaVal = useStore(api, 'area');\n  const rTasksVal = useStore(api, '_tasks');\n  const scalesVal = useStore(api, '_scales');\n  const headerLengthVal = useStore(api, '_headerLength');\n  const columnsVal = useStore(api, 'columns');\n  const sortVal = useStore(api, '_sort');\n  const durationUnitVal = useStore(api, 'durationUnit');\n  const splitTasksVal = useStore(api, 'splitTasks');\n  const filterValuesVal = useStore(api, 'filterValues');\n  const groupByVal = useStore(api, 'groupBy');\n  const gridWidthVal = useStore(api, 'gridWidth');\n  const displayModeVal = useStore(api, 'displayMode');\n  const compactModeVal = useStore(api, '_compactMode');\n\n  const [dragTask, setDragTask] = useState(null);\n\n  const tasks = useMemo(() => {\n    if (!rTasksVal || !areaVal) return [];\n    return rTasksVal.slice(areaVal.start, areaVal.end);\n  }, [rTasksVal, areaVal]);\n\n  const execAction = useCallback(\n    (id, action) => {\n      if (action === 'add-task') {\n        api.exec(action, {\n          target: id,\n          task: { text: _('New Task') },\n          mode: 'child',\n          show: true,\n          focus: id ? 'grid' : null,\n        });\n      } else if (action === 'open-task') {\n        const task = tasks.find((a) => a.id === id);\n        if (task?.data || task?.lazy)\n          api.exec(action, { id, mode: !task.open });\n      }\n    },\n    [tasks],\n  );\n\n  const onClick = useCallback(\n    (e) => {\n      if (e.detail > 1) return;\n      const id = locateID(e);\n      const action = e.target.dataset.action;\n      if (action) e.preventDefault();\n      if (id) {\n        if (action === 'add-task' || action === 'open-task') {\n          execAction(id, action);\n        } else {\n          api.exec('select-task', {\n            id,\n            toggle: e.ctrlKey || e.metaKey,\n            range: e.shiftKey,\n            show: 'xy',\n            focus: 'grid',\n          });\n        }\n      } else if (action === 'add-task') {\n        execAction(null, action);\n      }\n    },\n    [api, execAction],\n  );\n\n  const tableRef = useRef(null);\n  const tableContainerRef = useRef(null);\n  const [gridClientWidth, setGridClientWidth] = useState(0);\n  const [gridClientHeight, setGridClientHeight] = useState(0);\n\n  useEffect(() => {\n    const node = tableContainerRef.current;\n    if (!node || typeof ResizeObserver === 'undefined') return;\n    const update = () => {\n      setGridClientWidth(node.clientWidth);\n      setGridClientHeight(node.clientHeight);\n    };\n    update();\n    const ro = new ResizeObserver(update);\n    ro.observe(node);\n    return () => ro.disconnect();\n  }, []);\n\n  const allTasks = useMemo(() => {\n    const rows =\n      dragTask && !tasks.find((t) => t.id === dragTask.id)\n        ? [...tasks, dragTask]\n        : tasks;\n    return rows.map((t) => ({ ...t }));\n  }, [tasks, dragTask]);\n\n  const allTasksRef = useRef(allTasks);\n  useEffect(() => {\n    allTasksRef.current = allTasks;\n  }, [allTasks]);\n\n  const lastDetailRef = useRef(null);\n\n  const reorderTasks = useCallback(\n    (detail) => {\n      const id = detail.id;\n      const { before, after } = detail;\n      const inProgress = detail.onMove;\n\n      let target = before || after;\n      let mode = before ? 'before' : 'after';\n\n      if (inProgress) {\n        if (mode === 'after') {\n          const index = allTasksRef.current.findIndex((t) => t.id === id);\n          const targetIndex = allTasksRef.current.findIndex(\n            (t) => t.id === target,\n          );\n          const task = allTasksRef.current[targetIndex];\n          if (index - targetIndex === 1) {\n            mode = 'before';\n          } else if (task && task.data && task.open) {\n            mode = 'before';\n            target = task.data[0].id;\n          }\n        }\n        lastDetailRef.current = { id, [mode]: target };\n      } else lastDetailRef.current = null;\n\n      api.exec('move-task', {\n        id,\n        mode,\n        target,\n        inProgress,\n      });\n    },\n    [api],\n  );\n\n  // COLUMNS\n  // --------\n\n  const cols = useMemo(() => {\n    let cols = (columnsVal || []).map((col) => {\n      col = { ...col };\n      const header = [...col.header];\n      header.forEach((line) => {\n        if (line.text) line.text = _(line.text);\n      });\n      col.header = header;\n      return col;\n    });\n\n    const ti = cols.findIndex((c) => c.id === 'text');\n    const ai = cols.findIndex((c) => c.id === 'add-task');\n    const ri = cols.findIndex((c) => c.id === 'resources');\n\n    if (ti !== -1) {\n      if (cols[ti].cell) cols[ti]._cell = cols[ti].cell;\n      cols[ti].cell = TextCell;\n    }\n    if (ri !== -1) {\n      const resCol = cols[ri];\n      if (!resCol.cell) resCol.cell = ResourcesCell;\n      if (resCol.editor && typeof resCol.editor !== 'function') {\n        const editor = resCol.editor;\n        const config = editor.config;\n        if (!config.cell) config.cell = EditorResourcesCell;\n        config.cell = EditorResourcesCell;\n        if (!config.dropdown) config.dropdown = { width: 'auto' };\n        resCol.editor = (row) => {\n          if (row.type !== 'summary') return editor;\n        };\n      }\n    }\n    if (ai !== -1) {\n      cols[ai].cell = cols[ai].cell || ActionCell;\n      const header = cols[ai].header[0];\n      cols[ai].header[0].cell = header.cell || ActionCell;\n\n      if (readonly) {\n        cols.splice(ai, 1);\n      } else {\n        if (compactModeVal) {\n          const [actionCol] = cols.splice(ai, 1);\n          cols.unshift(actionCol);\n        }\n      }\n    }\n\n    if (cols.length > 0) cols[cols.length - 1].resize = false;\n    return cols;\n  }, [columnsVal, _, readonly, compactModeVal]);\n\n  useLayoutEffect(() => {\n    setColumnWidth(getColumnsWidth(cols));\n  }, [cols]);\n\n  const getColumnStyle = useCallback((col) => {\n    let style = `wx-rHj6070p wx-text-${col.align} `;\n\n    if (col.id === 'add-task') style += 'wx-action ';\n    else if (col.id === 'wbs') style += 'wx-wbs ';\n\n    return style.trim();\n  }, []);\n\n  // SIZES\n  // --------\n\n  const scrollDelta = useMemo(() => areaVal?.from ?? 0, [areaVal]);\n  const headerHeight = useMemo(() => scalesVal?.height ?? 0, [scalesVal]);\n\n  const flexBasis = useMemo(\n    () => getFlexBasis(columnsVal || [], displayModeVal, gridWidthVal),\n    [columnsVal, displayModeVal, gridWidthVal],\n  );\n\n  const scrollX = useMemo(\n    () =>\n      getScrollX(\n        compactModeVal,\n        displayModeVal,\n        columnWidth,\n        gridClientWidth,\n        gridWidthVal,\n      ),\n    [compactModeVal, displayModeVal, columnWidth, gridClientWidth, gridWidthVal],\n  );\n\n  const bodyOffset = useMemo(\n    () => (scrollDelta ?? 0) - (scrollTopVal ?? 0),\n    [scrollDelta, scrollTopVal],\n  );\n\n  const tableStyle = useMemo(() => {\n    const css =\n      getGridMinHeight(gridClientHeight, cellHeightVal ?? 0) +\n      getGridStyle(displayModeVal, columnWidth, scrollX);\n    const style = cssTextToStyle(css);\n    style['--wx-body-offset'] = `${bodyOffset}px`;\n    return style;\n  }, [\n    gridClientHeight,\n    cellHeightVal,\n    displayModeVal,\n    columnWidth,\n    scrollX,\n    bodyOffset,\n  ]);\n\n  // SELECTION\n  // --------\n  const sel = useMemo(\n    () => (Array.isArray(selectedVal) ? selectedVal.map((o) => o.id) : []),\n    [selectedVal],\n  );\n\n  const fitColumns = useMemo(\n    () => getFitColumns(cols, displayModeVal),\n    [cols, displayModeVal],\n  );\n\n  const onDblClick = useCallback(\n    (e) => {\n      if (!readonly) {\n        const id = locateID(e);\n        const column = locateID(e, 'data-col-id');\n        const columnObj = column && cols.find((c) => c.id === column);\n        if (!columnObj?.editor && id) api.exec('show-editor', { id });\n      }\n    },\n    [api, readonly, cols],\n  );\n\n  const sortMarks = useMemo(\n    () => getSortMarks(allTasks, sortVal),\n    [allTasks, sortVal],\n  );\n\n  const filters = useMemo(() => {\n    return sortMarks ? { ...filterValuesVal } : filterValuesVal;\n  }, [sortMarks, filterValuesVal]);\n\n  const pendingFocusRef = useRef(false);\n  useEffect(() => {\n    if (!focusTask || !tableAPI) return;\n\n    const { id, column } = focusTask;\n    if (column) {\n      if (!pendingFocusRef.current) {\n        pendingFocusRef.current = true;\n        requestAnimationFrame(() => {\n          const { focusCell, editor } = tableAPI.getState();\n          if (!editor) {\n            tableAPI.exec('focus-cell', {\n              row: id,\n              column: focusCell?.column || cols[0]?.id,\n            });\n            pendingFocusRef.current = false;\n          }\n        });\n      }\n    }\n  }, [focusTask, tableAPI]);\n\n  const startReorder = useCallback(\n    ({ id }) => {\n      if (readonly) return false;\n\n      if (api.getTask(id).open) api.exec('open-task', { id, mode: false });\n\n      const t = api.getState()._tasks.find((t) => t.id === id);\n      setDragTask(t || null);\n      if (!t) return false;\n    },\n    [api, readonly],\n  );\n\n  const endReorder = useCallback(\n    ({ id, top }) => {\n      if (lastDetailRef.current) {\n        reorderTasks({ ...lastDetailRef.current, onMove: false });\n      } else {\n        api.exec('drag-task', {\n          id,\n          top: top + (scrollDelta ?? 0),\n          inProgress: false,\n        });\n      }\n      setDragTask(null);\n    },\n    [api, reorderTasks, scrollDelta],\n  );\n\n  const moveReorder = useCallback(\n    ({ id, top, detail }) => {\n      if (detail) {\n        reorderTasks({ ...detail, onMove: true });\n      }\n      api.exec('drag-task', {\n        id,\n        top: top + (scrollDelta ?? 0),\n        inProgress: true,\n      });\n    },\n    [api, reorderTasks, scrollDelta],\n  );\n\n  const groupByRef = useRef(groupByVal);\n  useEffect(() => {\n    groupByRef.current = groupByVal;\n  }, [groupByVal]);\n\n  useEffect(() => {\n    const node = tableRef.current;\n    if (!node) return;\n    const action = reorder(node, {\n      isDisabled: () => !!groupByRef.current?.field,\n      start: startReorder,\n      end: endReorder,\n      move: moveReorder,\n      getTask: api.getTask,\n    });\n    return action.destroy;\n  }, [api, startReorder, endReorder, moveReorder]);\n\n  const handleHotkey = useCallback(\n    (ev) => {\n      const { key, isInput } = ev;\n      if (!isInput && (key === 'arrowup' || key === 'arrowdown')) {\n        ev.eventSource = 'grid';\n        api.exec('hotkey', ev);\n        return false;\n      } else if (key === 'enter') {\n        const focusCell = tableAPI?.getState().focusCell;\n        if (focusCell) {\n          const { row, column } = focusCell;\n          if (column === 'add-task') {\n            execAction(row, 'add-task');\n          } else if (column === 'text') {\n            execAction(row, 'open-task');\n          }\n        }\n      }\n    },\n    [api, execAction, tableAPI],\n  );\n\n  // FIXME - temporary hack to provide fresh values to grid's handlers\n  const handlersStateRef = useRef(null);\n  const setHandlersState = () => {\n    handlersStateRef.current = {\n      setTableAPI,\n      handleHotkey,\n      sortVal,\n      api,\n      cols,\n      setColumnWidth,\n      tasks,\n      durationUnitVal,\n      splitTasksVal,\n      onTableAPIChange,\n    };\n  };\n  setHandlersState();\n  useEffect(() => {\n    setHandlersState();\n  }, [\n    setTableAPI,\n    handleHotkey,\n    sortVal,\n    api,\n    cols,\n    setColumnWidth,\n    tasks,\n    durationUnitVal,\n    splitTasksVal,\n    onTableAPIChange,\n  ]);\n\n  const init = useCallback((tapi) => {\n    setTableAPI(tapi);\n    tapi.intercept('hotkey', (ev) => handlersStateRef.current.handleHotkey(ev));\n    tapi.intercept('select-row', () => false);\n    tapi.intercept('scroll', () => false);\n    tapi.intercept('sort-rows', (e) => {\n      const sortVal = handlersStateRef.current.sortVal;\n      const { key, add } = e;\n      const keySort = sortVal ? sortVal.find((s) => s.key === key) : null;\n      let order = 'asc';\n      if (keySort) order = !keySort || keySort.order === 'asc' ? 'desc' : 'asc';\n\n      api.exec('sort-tasks', {\n        key,\n        order,\n        add,\n      });\n      return false;\n    });\n    tapi.intercept('filter-rows', (ev) => {\n      const { key, value } = ev;\n\n      api.exec('filter-tasks', {\n        key,\n        value,\n        open: true,\n      });\n      return false;\n    });\n\n    tapi.intercept('resize-column', (ev) => {\n      ev.flexgrowFallback = getFillColumn(handlersStateRef.current.cols, ev.id);\n    });\n\n    tapi.on('resize-column', (ev) => {\n      const columns = tapi.getState().columns;\n      handlersStateRef.current.setColumnWidth(getColumnsWidth(columns));\n      if (ev.inProgress !== true) api.exec('set-columns', { columns });\n    });\n\n    tapi.on('hide-column', () => {\n      const columns = tapi.getState().columns;\n      handlersStateRef.current.setColumnWidth(getColumnsWidth(columns));\n      api.exec('set-columns', { columns });\n    });\n\n    tapi.intercept('update-cell', (e) => {\n      const { id, column, value } = e;\n      const task = handlersStateRef.current.tasks.find((t) => t.id === id);\n\n      if (task) {\n        if (column === 'resources') {\n          setTaskResources(id, value, api);\n          return;\n        }\n\n        const update = { ...task };\n        let v = value;\n        if (v && !isNaN(v) && !(v instanceof Date)) v *= 1;\n        update[column] = v;\n\n        prepareEditTask(\n          update,\n          {\n            durationUnit: handlersStateRef.current.durationUnitVal,\n            splitTasks: handlersStateRef.current.splitTasksVal,\n          },\n          api.getTaskCalendar(update),\n          column,\n        );\n\n        api.exec('update-task', {\n          id: id,\n          task: update,\n        });\n      }\n      return false;\n    });\n\n    onTableAPIChange && onTableAPIChange(tapi);\n  }, []);\n\n  return (\n    <div\n      className=\"wx-rHj6070p wx-table-container\"\n      style={{ flex: `0 0 ${flexBasis}` }}\n      ref={tableContainerRef}\n    >\n      <div\n        ref={tableRef}\n        style={tableStyle}\n        className=\"wx-rHj6070p wx-table\"\n        onClick={onClick}\n        onDoubleClick={onDblClick}\n      >\n        <WxGrid\n          init={init}\n          sizes={{\n            rowHeight: cellHeightVal,\n            headerHeight: (headerHeight ?? 0) / (headerLengthVal ?? 1),\n          }}\n          rowStyle={(row) =>\n            row.$reorder ? 'wx-rHj6070p wx-reorder-task' : 'wx-rHj6070p'\n          }\n          columnStyle={getColumnStyle}\n          data={allTasks}\n          columns={fitColumns}\n          selectedRows={[...sel]}\n          sortMarks={sortMarks}\n          filterValues={filters}\n        />\n      </div>\n    </div>\n  );\n}\n","import { useContext, useEffect, useRef, useState } from 'react';\nimport storeContext from '../../context';\nimport { grid } from '@svar-ui/gantt-store';\nimport { useStore } from '@svar-ui/lib-react';\n\nfunction CellGrid() {\n  const api = useContext(storeContext);\n  const cellWidth = useStore(api, 'cellWidth');\n  const cellHeight = useStore(api, 'cellHeight');\n  const cellBorders = useStore(api, 'cellBorders');\n\n  const nodeRef = useRef(null);\n  const [color, setColor] = useState('#e4e4e4');\n\n  useEffect(() => {\n    if (typeof getComputedStyle !== 'undefined' && nodeRef.current) {\n      const border = getComputedStyle(nodeRef.current).getPropertyValue(\n        '--wx-gantt-border',\n      );\n      setColor(border ? border.substring(border.indexOf('#')) : '#1d1e261a');\n    }\n  }, []);\n\n  const style = {\n    width: '100%',\n    height: '100%',\n    background:\n      cellWidth != null && cellHeight != null\n        ? `url(${grid(cellWidth, cellHeight, color, cellBorders)})`\n        : undefined,\n    position: 'absolute',\n  };\n\n  return <div ref={nodeRef} style={style} />;\n}\n\nexport default CellGrid;\n","import { useCallback, useContext, useEffect, useRef } from 'react';\nimport storeContext from '../../context';\nimport { useStore } from '@svar-ui/lib-react';\nimport { setID } from '@svar-ui/lib-dom';\nimport './Links.css';\n\nexport default function Links({ onSelectLink, selectedLink, readonly }) {\n  const api = useContext(storeContext);\n  const links = useStore(api, '_visibleLinks');\n  const criticalPath = useStore(api, 'criticalPath');\n\n  const selectedLineRef = useRef(null);\n\n  const onClickOutside = useCallback(\n    (event) => {\n      const css = event?.target?.classList;\n      if (\n        !css?.contains('wx-line-hitbox') &&\n        !css?.contains('wx-delete-button')\n      ) {\n        onSelectLink(null);\n      }\n    },\n    [onSelectLink],\n  );\n\n  useEffect(() => {\n    if (!readonly && selectedLink && selectedLineRef.current) {\n      const handler = (event) => {\n        if (\n          selectedLineRef.current &&\n          !selectedLineRef.current.contains(event.target)\n        ) {\n          onClickOutside(event);\n        }\n      };\n      document.addEventListener('click', handler);\n      return () => {\n        document.removeEventListener('click', handler);\n      };\n    }\n  }, [readonly, selectedLink, onClickOutside]);\n\n  return (\n    <svg className=\"wx-dkx3NwEn wx-links\">\n      {(links || []).map((link) => {\n        const className =\n          'wx-dkx3NwEn wx-line' +\n          (criticalPath && link.critical ? ' wx-critical' : '') +\n          (!readonly ? ' wx-line-selectable' : '');\n        return (\n          <g\n            className={className}\n            key={link.id}\n            onClick={() => !readonly && onSelectLink(link.id)}\n            data-link-id={setID(link.id)}\n          >\n            <polyline className=\"wx-dkx3NwEn wx-line-draw\" points={link.$p} />\n            <polyline className=\"wx-dkx3NwEn wx-line-hitbox\" points={link.$p} />\n          </g>\n        );\n      })}\n      {!readonly && selectedLink && (\n        <g\n          ref={selectedLineRef}\n          className=\"wx-dkx3NwEn wx-line wx-line-selected wx-line-selectable wx-delete-link\"\n          data-link-id={setID(selectedLink.id)}\n        >\n          <polyline\n            className=\"wx-dkx3NwEn wx-line-draw\"\n            points={selectedLink.$p}\n          />\n          <polyline\n            className=\"wx-dkx3NwEn wx-line-hitbox\"\n            points={selectedLink.$p}\n          />\n        </g>\n      )}\n    </svg>\n  );\n}\n","import './BarSegments.css';\n\nfunction BarSegments(props) {\n  const { task, type } = props;\n\n  function segmentStyle(i) {\n    const s = task.segments[i];\n    return {\n      left: `${s.$x}px`,\n      top: '0px',\n      width: `${s.$w}px`,\n      height: '100%',\n    };\n  }\n\n  function getSegProgress(segmentIndex) {\n    if (!task.progress) return 0;\n\n    const progress = (task.duration * task.progress) / 100;\n    const segments = task.segments;\n    let duration = 0,\n      i = 0,\n      result = null;\n    do {\n      const s = segments[i];\n      if (i === segmentIndex) {\n        if (duration > progress) result = 0;\n        else result = Math.min((progress - duration) / s.duration, 1) * 100;\n      }\n      duration += s.duration;\n      i++;\n    } while (result === null && i < segments.length);\n    return result || 0;\n  }\n\n  return (\n    <div className=\"wx-segments wx-GKbcLEGA\">\n      {task.segments.map((seg, i) => (\n        <div\n          key={i}\n          className={`wx-segment wx-bar wx-${type} wx-GKbcLEGA`}\n          data-segment={i}\n          style={segmentStyle(i)}\n        >\n          {task.progress ? (\n            <div className=\"wx-progress-wrapper\">\n              <div\n                className=\"wx-progress-percent wx-GKbcLEGA\"\n                style={{ width: `${getSegProgress(i)}%` }}\n              ></div>\n            </div>\n          ) : null}\n          <div className=\"wx-content\">{seg.text || ''}</div>\n        </div>\n      ))}\n    </div>\n  );\n}\n\nexport default BarSegments;\n","import { setID } from '@svar-ui/lib-dom';\n\nfunction Rollups(props) {\n  const { rollup, parent } = props;\n\n  return (\n    <div\n      data-rollup-id={setID(rollup.id)}\n      className={`wx-GKbcLEGA wx-rollup wx-${rollup.type}-rollup`}\n      style={{\n        left: `${rollup.$x_rollup}px`,\n        top: `${parent.$y + parent.$h + rollup.$y_rollup_relative}px`,\n        width: `${rollup.$w_rollup}px`,\n        height: `${rollup.$h_rollup}px`,\n      }}\n    ></div>\n  );\n}\n\nexport default Rollups;\n","import {\n  Fragment,\n  useCallback,\n  useContext,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'react';\nimport { locate, locateID, getID, setID } from '@svar-ui/lib-dom';\nimport storeContext from '../../context';\nimport { useStore, useStoreWithCounter } from '@svar-ui/lib-react';\nimport { isSegmentMoveAllowed, extendDragOptions } from '@svar-ui/gantt-store';\nimport { Button } from '@svar-ui/react-core';\nimport Links from './Links.jsx';\nimport BarSegments from './BarSegments.jsx';\nimport Rollups from './Rollups.jsx';\nimport './Bars.css';\n\nfunction Bars(props) {\n  const { readonly, taskTemplate: TaskTemplate } = props;\n\n  const api = useContext(storeContext);\n\n  const [rTasksValue, rTasksCounter] = useStoreWithCounter(api, '_tasks');\n  const [rLinksValue, rLinksCounter] = useStoreWithCounter(api, '_links');\n  const areaValue = useStore(api, 'area');\n  const scalesValue = useStore(api, '_scales');\n  const taskTypesValue = useStore(api, 'taskTypes');\n  const baselinesValue = useStore(api, 'baselines');\n  const selectedValue = useStore(api, '_selected');\n  const rollups = useStore(api, 'rollups');\n  const rRollups = useStore(api, '_rollups');\n  const focusTaskStore = useStore(api, 'focusTask');\n  const criticalPath = useStore(api, 'criticalPath');\n  const tree = useStore(api, 'tree');\n  const schedule = useStore(api, 'schedule');\n  const splitTasks = useStore(api, 'splitTasks');\n  const summary = useStore(api, 'summary');\n  const slack = useStore(api, 'slack');\n\n  const tasks = useMemo(() => {\n    if (!areaValue || !Array.isArray(rTasksValue)) return [];\n    const start = areaValue.start ?? 0;\n    const end = areaValue.end ?? 0;\n    return rTasksValue.slice(start, end).map((a) => ({ ...a }));\n  }, [rTasksCounter, areaValue]);\n\n  const lengthUnitWidth = useMemo(\n    () => scalesValue.lengthUnitWidth,\n    [scalesValue],\n  );\n\n  const hasDuplicatedIds = useMemo(\n    () => tasks.some((task) => task.$id && task.$id !== task.id),\n    [tasks],\n  );\n\n  const ignoreNextClickRef = useRef(false);\n\n  const [linkFrom, setLinkFrom] = useState(undefined);\n  const [taskMove, setTaskMove] = useState(null);\n  const progressFromRef = useRef(null);\n\n  const [selectedLinkId, setSelectedLinkId] = useState(null);\n\n  const selectedLink = useMemo(() => {\n    return (\n      selectedLinkId && {\n        ...rLinksValue.find((link) => link.id === selectedLinkId),\n      }\n    );\n  }, [selectedLinkId, rLinksCounter]);\n\n  const [touched, setTouched] = useState(undefined);\n  const touchTimerRef = useRef(null);\n\n  const [totalWidth, setTotalWidth] = useState(0);\n\n  const containerRef = useRef(null);\n\n  const hasFocus = useMemo(() => {\n    const el = containerRef.current;\n    return !!(\n      selectedValue.length &&\n      el &&\n      el.contains(document.activeElement)\n    );\n  }, [selectedValue, containerRef.current]);\n\n  const focused = useMemo(() => {\n    return hasFocus && selectedValue[selectedValue.length - 1]?.id;\n  }, [hasFocus, selectedValue]);\n\n  useEffect(() => {\n    if (!focusTaskStore) return;\n    if (focusTaskStore.column === false) {\n      const { id } = focusTaskStore;\n      const node = containerRef.current?.querySelector(\n        `.wx-bar[data-id='${setID(id)}']`,\n      );\n      if (node) node.focus({ preventScroll: true });\n    }\n  }, [focusTaskStore]);\n\n  useEffect(() => {\n    const el = containerRef.current;\n    if (!el) return;\n    setTotalWidth(el.offsetWidth || 0);\n    if (typeof ResizeObserver !== 'undefined') {\n      const ro = new ResizeObserver((entries) => {\n        if (entries[0]) {\n          setTotalWidth(entries[0].contentRect.width);\n        }\n      });\n      ro.observe(el);\n      return () => ro.disconnect();\n    }\n  }, [containerRef.current]);\n\n  const startDrag = useCallback(() => {\n    document.body.style.userSelect = 'none';\n  }, []);\n\n  const endDrag = useCallback(() => {\n    document.body.style.userSelect = '';\n  }, []);\n\n  const getMoveMode = useCallback(\n    (node, e, task) => {\n      if (e.target.classList.contains('wx-line')) return '';\n      if (!task) task = api.getTask(getID(node));\n      if (task.type === 'milestone' || task.type === 'summary') return '';\n\n      const segmentNode = locate(e, 'data-segment');\n      if (segmentNode) node = segmentNode;\n\n      const { left, width } = node.getBoundingClientRect();\n      const p = (e.clientX - left) / width;\n      let delta = 0.2 / (width > 200 ? width / 200 : 1);\n      if (p < delta) return 'start';\n      if (p > 1 - delta) return 'end';\n      return '';\n    },\n    [api],\n  );\n\n  const down = useCallback(\n    (node, point) => {\n      const { clientX } = point;\n      const id = getID(node);\n      const task = api.getTask(id);\n      const css = point.target.classList;\n      if (point.target.closest('.wx-delete-button')) return;\n      if (!readonly) {\n        if (css.contains('wx-progress-marker')) {\n          const { progress } = api.getTask(id);\n          progressFromRef.current = {\n            id,\n            x: clientX,\n            progress,\n            dx: 0,\n            node,\n            marker: point.target,\n          };\n          point.target.classList.add('wx-progress-in-drag');\n        } else {\n          const mode = getMoveMode(node, point, task) || 'move';\n\n          const newTaskMove = {\n            id,\n            mode,\n            x: clientX,\n            dx: 0,\n            l: task.$x,\n            w: task.$w,\n          };\n\n          if (splitTasks && task.segments?.length) {\n            const segNode = locate(point, 'data-segment');\n            if (segNode) {\n              newTaskMove.segmentIndex = segNode.dataset['segment'] * 1;\n              extendDragOptions(task, newTaskMove);\n            }\n          }\n\n          setTaskMove(newTaskMove);\n        }\n        startDrag();\n      }\n    },\n    [api, readonly, getMoveMode, startDrag, splitTasks],\n  );\n\n  const mousedown = useCallback(\n    (e) => {\n      if (e.button !== 0) return;\n\n      const node = locate(e);\n      if (!node) return;\n\n      down(node, e);\n    },\n    [down],\n  );\n\n  const touchstart = useCallback(\n    (e) => {\n      const node = locate(e);\n      if (node) {\n        touchTimerRef.current = setTimeout(() => {\n          setTouched(true);\n          down(node, e.touches[0]);\n        }, 300);\n      }\n    },\n    [down],\n  );\n\n  const onSelectLink = useCallback((id) => {\n    setSelectedLinkId(id);\n  }, []);\n\n  const up = useCallback(() => {\n    if (progressFromRef.current) {\n      const { dx, id, marker, value } = progressFromRef.current;\n      progressFromRef.current = null;\n      if (typeof value !== 'undefined' && dx)\n        api.exec('update-task', {\n          id,\n          task: { progress: value },\n          inProgress: false,\n        });\n      marker.classList.remove('wx-progress-in-drag');\n\n      ignoreNextClickRef.current = true;\n      endDrag();\n    } else if (taskMove) {\n      const { id, mode, dx, l, w, start, segment, index } = taskMove;\n      setTaskMove(null);\n      if (start) {\n        const diff = Math.round(dx / lengthUnitWidth);\n\n        if (!diff) {\n          api.exec('drag-task', {\n            id,\n            width: w,\n            left: l,\n            inProgress: false,\n            ...(segment && { segmentIndex: index }),\n          });\n        } else {\n          let update = {};\n          let task = api.getTask(id);\n          if (segment) task = task.segments[index];\n\n          if (mode === 'move') {\n            update.start = task.start;\n            update.end = task.end;\n          } else update[mode] = task[mode];\n\n          api.exec('update-task', {\n            id,\n            diff,\n            task: update,\n            ...(segment && { segmentIndex: index }),\n          });\n        }\n        ignoreNextClickRef.current = true;\n      }\n\n      endDrag();\n    }\n  }, [api, endDrag, taskMove, lengthUnitWidth]);\n\n  const move = useCallback(\n    (e, point) => {\n      const { clientX } = point;\n\n      if (!readonly) {\n        if (progressFromRef.current) {\n          const { node, x, id } = progressFromRef.current;\n          const dx = (progressFromRef.current.dx = clientX - x);\n\n          const diff = Math.round((dx / node.offsetWidth) * 100);\n          let progress = progressFromRef.current.progress + diff;\n          progressFromRef.current.value = progress = Math.min(\n            Math.max(0, progress),\n            100,\n          );\n\n          api.exec('update-task', {\n            id,\n            task: { progress },\n            inProgress: true,\n          });\n        } else if (taskMove) {\n          onSelectLink(null);\n          const { mode, l, w, x, id, start, segment, index } = taskMove;\n          const task = api.getTask(id);\n          const dx = clientX - x;\n          const minWidth = Math.round(lengthUnitWidth) || 1;\n          if (\n            (!start && Math.abs(dx) < 20) ||\n            (mode === 'start' && w - dx < minWidth) ||\n            (mode === 'end' && w + dx < minWidth) ||\n            (mode === 'move' &&\n              ((dx < 0 && l + dx < 0) ||\n                (dx > 0 && l + w + dx > totalWidth))) ||\n            (taskMove.segment && !isSegmentMoveAllowed(task, taskMove))\n          )\n            return;\n\n          const nextTaskMove = { ...taskMove, dx };\n\n          let left, width;\n          if (mode === 'start') {\n            left = l + dx;\n            width = w - dx;\n          } else if (mode === 'end') {\n            left = l;\n            width = w + dx;\n          } else if (mode === 'move') {\n            left = l + dx;\n            width = w;\n          }\n\n          api.exec('drag-task', {\n            id,\n            width: width,\n            left: left,\n            inProgress: true,\n            start,\n            ...(segment && { segmentIndex: index }),\n          });\n\n          if (\n            !nextTaskMove.start &&\n            ((mode === 'move' && task.$x === l) ||\n              (mode !== 'move' && task.$w === w))\n          ) {\n            ignoreNextClickRef.current = true;\n            up();\n            return;\n          }\n          nextTaskMove.start = true;\n          setTaskMove(nextTaskMove);\n        } else {\n          const taskNode = locate(e);\n          if (taskNode) {\n            const task = api.getTask(getID(taskNode));\n            const segNode = locate(e, 'data-segment');\n            const barNode = segNode || taskNode;\n            const mode = getMoveMode(barNode, point, task);\n            barNode.style.cursor = mode && !readonly ? 'col-resize' : 'pointer';\n          }\n        }\n      }\n    },\n    [\n      api,\n      readonly,\n      taskMove,\n      lengthUnitWidth,\n      totalWidth,\n      getMoveMode,\n      onSelectLink,\n      up,\n    ],\n  );\n\n  const mousemove = useCallback(\n    (e) => {\n      move(e, e);\n    },\n    [move],\n  );\n\n  const touchmove = useCallback(\n    (e) => {\n      if (touched) {\n        e.preventDefault();\n        move(e, e.touches[0]);\n      } else if (touchTimerRef.current) {\n        clearTimeout(touchTimerRef.current);\n        touchTimerRef.current = null;\n      }\n    },\n    [touched, move],\n  );\n\n  const mouseup = useCallback(() => {\n    up();\n  }, [up]);\n\n  const touchend = useCallback(() => {\n    setTouched(null);\n    if (touchTimerRef.current) {\n      clearTimeout(touchTimerRef.current);\n      touchTimerRef.current = null;\n    }\n    up();\n  }, [up]);\n\n  useEffect(() => {\n    window.addEventListener('mouseup', mouseup);\n    return () => {\n      window.removeEventListener('mouseup', mouseup);\n    };\n  }, [mouseup]);\n\n  const onDblClick = useCallback(\n    (e) => {\n      if (!readonly) {\n        const id = locateID(e.target);\n        if (id && !e.target.classList.contains('wx-link')) {\n          const segmentIndex = locateID(e.target, 'data-segment');\n          api.exec('show-editor', {\n            id,\n            ...(segmentIndex !== null && { segmentIndex }),\n          });\n        }\n      }\n    },\n    [api, readonly],\n  );\n\n  const types = ['e2s', 's2s', 'e2e', 's2e'];\n  const getLinkType = useCallback((fromStart, toStart) => {\n    return types[(fromStart ? 1 : 0) + (toStart ? 0 : 2)];\n  }, []);\n\n  const alreadyLinked = useCallback(\n    (target, toStart) => {\n      const source = linkFrom.id;\n      const fromStart = linkFrom.start;\n\n      if (target === source) return true;\n\n      return !!rLinksValue.find((l) => {\n        return (\n          l.target === target &&\n          l.source === source &&\n          l.type === getLinkType(fromStart, toStart)\n        );\n      });\n    },\n    [linkFrom, rLinksCounter, getLinkType],\n  );\n\n  const removeLinkMarker = useCallback(() => {\n    if (linkFrom) {\n      setLinkFrom(null);\n    }\n  }, [linkFrom]);\n\n  const onClick = useCallback(\n    (e) => {\n      if (ignoreNextClickRef.current) {\n        ignoreNextClickRef.current = false;\n        return;\n      }\n\n      const id = locateID(e.target);\n      if (id) {\n        const css = e.target.classList;\n        if (css.contains('wx-link')) {\n          const toStart = css.contains('wx-left');\n          if (!linkFrom) {\n            setLinkFrom({ id, start: toStart });\n            return;\n          }\n\n          if (linkFrom.id !== id && !alreadyLinked(id, toStart)) {\n            api.exec('add-link', {\n              link: {\n                source: linkFrom.id,\n                target: id,\n                type: getLinkType(linkFrom.start, toStart),\n              },\n            });\n          }\n        } else if (css.contains('wx-delete-button-icon')) {\n          api.exec('delete-link', { id: selectedLinkId });\n          setSelectedLinkId(null);\n        } else {\n          const segmentIndex = locateID(e.target, 'data-segment');\n          api.exec('select-task', {\n            id,\n            toggle: e.ctrlKey || e.metaKey,\n            range: e.shiftKey,\n            ...(segmentIndex !== null && { segmentIndex }),\n          });\n        }\n      }\n      removeLinkMarker();\n    },\n    [\n      api,\n      linkFrom,\n      rLinksCounter,\n      selectedLink,\n      alreadyLinked,\n      getLinkType,\n      removeLinkMarker,\n    ],\n  );\n\n  const taskStyle = useCallback((task) => {\n    return {\n      left: `${task.$x}px`,\n      top: `${task.$y}px`,\n      width: `${task.$w}px`,\n      height: `${task.$h}px`,\n      lineHeight: `${task.$h}px`,\n    };\n  }, []);\n\n  const baselineStyle = useCallback((task) => {\n    return {\n      left: `${task.$x_base}px`,\n      top: `${task.$y_base}px`,\n      width: `${task.$w_base}px`,\n      height: `${task.$h_base}px`,\n    };\n  }, []);\n\n  const slackStyle = useCallback((task) => {\n    return {\n      left: `${task.$x_slack}px`,\n      top: `${task.$y}px`,\n      width: `${Math.max(task.$w_slack, 0)}px`,\n      height: `${task.$h}px`,\n    };\n  }, []);\n\n  const contextmenu = useCallback(\n    (ev) => {\n      if (touched || touchTimerRef.current) {\n        ev.preventDefault();\n        return false;\n      }\n    },\n    [touched],\n  );\n\n  const taskTypeIds = useMemo(\n    () => taskTypesValue.map((t) => t.id),\n    [taskTypesValue],\n  );\n\n  const taskTypeCss = useCallback(\n    (type) => {\n      let css = taskTypeIds.includes(type) ? type : 'task';\n      if (!['task', 'milestone', 'summary'].includes(type)) {\n        css = `task ${css}`;\n      }\n      return css;\n    },\n    [taskTypeIds],\n  );\n\n  const forward = useCallback(\n    (ev) => {\n      api.exec(ev.action, ev.data);\n    },\n    [api],\n  );\n\n  const isTaskCritical = useCallback(\n    (task) => {\n      return criticalPath && task.critical;\n    },\n    [criticalPath],\n  );\n\n  const isLinkMarkerVisible = useCallback(\n    (id) => {\n      if (schedule?.auto) {\n        const summaryIds = tree.getSummaryId(id, true);\n        const linkFromSummaryIds = tree.getSummaryId(linkFrom.id, true);\n        return (\n          linkFrom?.id &&\n          !(Array.isArray(summaryIds) ? summaryIds : [summaryIds]).includes(\n            linkFrom.id,\n          ) &&\n          !(\n            Array.isArray(linkFromSummaryIds)\n              ? linkFromSummaryIds\n              : [linkFromSummaryIds]\n          ).includes(id)\n        );\n      }\n      return linkFrom;\n    },\n    [schedule, tree, linkFrom],\n  );\n\n  return (\n    <div\n      className=\"wx-GKbcLEGA wx-bars\"\n      ref={containerRef}\n      onContextMenu={contextmenu}\n      onMouseDown={mousedown}\n      onMouseMove={mousemove}\n      onTouchStart={touchstart}\n      onTouchMove={touchmove}\n      onTouchEnd={touchend}\n      onClick={onClick}\n      onDoubleClick={onDblClick}\n      onDragStart={(e) => {\n        e.preventDefault();\n        return false;\n      }}\n    >\n      {slack\n        ? tasks.map((task) =>\n            task.$visibleSlack ? (\n              <div\n                key={task.id}\n                className={`wx-GKbcLEGA wx-slack wx-slack-${task.type}`}\n                style={slackStyle(task)}\n              ></div>\n            ) : null,\n          )\n        : null}\n      <Links\n        onSelectLink={onSelectLink}\n        selectedLink={selectedLink}\n        readonly={readonly}\n      />\n      {tasks.map((task) => {\n        if (task.$skip && task.$skip_baseline && !(rollups && rRollups?.[task.id])) return null;\n        const barClass =\n          `wx-bar wx-${taskTypeCss(task.type)}` +\n          (touched && taskMove && task.id === taskMove.id ? ' wx-touch' : '') +\n          (linkFrom && linkFrom.id === task.id ? ' wx-selected' : '') +\n          (isTaskCritical(task) ? ' wx-critical' : '') +\n          (task.$reorder ? ' wx-reorder-task' : '') +\n          (splitTasks && task.segments ? ' wx-split' : '');\n        const leftLinkClass =\n          'wx-link wx-left' +\n          (linkFrom ? ' wx-visible' : '') +\n          (!linkFrom ||\n            (!alreadyLinked(task.id, true) && isLinkMarkerVisible(task.id))\n            ? ' wx-target'\n            : '') +\n          (linkFrom && linkFrom.id === task.id && linkFrom.start\n            ? ' wx-selected'\n            : '') +\n          (isTaskCritical(task) ? ' wx-critical' : '');\n        const rightLinkClass =\n          'wx-link wx-right' +\n          (linkFrom ? ' wx-visible' : '') +\n          (!linkFrom ||\n            (!alreadyLinked(task.id, false) && isLinkMarkerVisible(task.id))\n            ? ' wx-target'\n            : '') +\n          (linkFrom && linkFrom.id === task.id && !linkFrom.start\n            ? ' wx-selected'\n            : '') +\n          (isTaskCritical(task) ? ' wx-critical' : '');\n        return (\n          <Fragment key={task.id}>\n            {!task.$skip && (\n              <div\n                className={'wx-GKbcLEGA ' + barClass}\n                style={taskStyle(task)}\n                data-id={setID(task.id)}\n                data-task-id={setID(task.id)}\n                tabIndex={focused === task.id ? 0 : -1}\n              >\n                {!readonly && !hasDuplicatedIds ? (\n                  task.id === selectedLink?.target &&\n                    selectedLink?.type[2] === 's' ? (\n                    <Button\n                      type=\"danger\"\n                      css=\"wx-left wx-delete-button wx-delete-link\"\n                    >\n                      <i className=\"wxi-close wx-delete-button-icon\"></i>\n                    </Button>\n                  ) : (\n                    <div className={'wx-GKbcLEGA ' + leftLinkClass}>\n                      <div className=\"wx-GKbcLEGA wx-inner\"></div>\n                    </div>\n                  )\n                ) : null}\n\n                {task.type !== 'milestone' ? (\n                  <>\n                    {task.progress && !(splitTasks && task.segments) ? (\n                      <div className=\"wx-GKbcLEGA wx-progress-wrapper\">\n                        <div\n                          className=\"wx-GKbcLEGA wx-progress-percent\"\n                          style={{ width: `${task.progress}%` }}\n                        ></div>\n                      </div>\n                    ) : null}\n                    {!readonly &&\n                      !(splitTasks && task.segments) &&\n                      !(task.type === 'summary' && summary?.autoProgress) ? (\n                      <div\n                        className=\"wx-GKbcLEGA wx-progress-marker\"\n                        style={{ left: `calc(${task.progress}% - 10px)` }}\n                      >\n                        {task.progress}\n                      </div>\n                    ) : null}\n                    {TaskTemplate ? (\n                      <TaskTemplate data={task} api={api} onAction={forward} />\n                    ) : splitTasks && task.segments ? (\n                      <BarSegments task={task} type={taskTypeCss(task.type)} />\n                    ) : (\n                      <div className=\"wx-GKbcLEGA wx-content\">\n                        {task.text || ''}\n                      </div>\n                    )}\n                  </>\n                ) : (\n                  <>\n                    <div className=\"wx-GKbcLEGA wx-content\"></div>\n                    {TaskTemplate ? (\n                      <TaskTemplate data={task} api={api} onAction={forward} />\n                    ) : (\n                      <div className=\"wx-GKbcLEGA wx-text-out\">{task.text}</div>\n                    )}\n                  </>\n                )}\n\n                {!readonly && !hasDuplicatedIds ? (\n                  task.id === selectedLink?.target &&\n                    selectedLink?.type[2] === 'e' ? (\n                    <Button\n                      type=\"danger\"\n                      css=\"wx-right wx-delete-button wx-delete-link\"\n                    >\n                      <i className=\"wxi-close wx-delete-button-icon\"></i>\n                    </Button>\n                  ) : (\n                    <div className={'wx-GKbcLEGA ' + rightLinkClass}>\n                      <div className=\"wx-GKbcLEGA wx-inner\"></div>\n                    </div>\n                  )\n                ) : null}\n              </div>\n            )}\n            {rollups && rRollups?.[task.id]\n              ? rRollups[task.id].map((rollup, i) => (\n                  <Rollups key={i} rollup={rollup} parent={task} />\n                ))\n              : null}\n            {baselinesValue && !task.$skip_baseline ? (\n              <div\n                className={\n                  'wx-GKbcLEGA wx-baseline' +\n                  (task.type === 'milestone' ? ' wx-milestone' : '')\n                }\n                style={baselineStyle(task)}\n              ></div>\n            ) : null}\n          </Fragment>\n        );\n      })}\n    </div>\n  );\n}\n\nexport default Bars;\n","import { useMemo } from 'react';\nimport { useStore } from '@svar-ui/lib-react';\nimport './TimeScale.css';\n\n// Upper-row cells span multiple lowest-row cells. Walk widths so a span\n// whose left edge has scrolled off is still rendered while its body is visible.\nfunction mapRow(row, xFrom, xEnd) {\n  const cells = row.cells;\n  let from = 0;\n  let start = cells.length;\n  let acc = 0;\n  for (let i = 0; i < cells.length; i++) {\n    if (acc + cells[i].width > xFrom) {\n      start = i;\n      from = acc;\n      break;\n    }\n    acc += cells[i].width;\n  }\n  let end = start;\n  while (end < cells.length && acc < xEnd) {\n    acc += cells[end].width;\n    end++;\n  }\n  return { from, slice: cells.slice(start, end) };\n}\n\nfunction TimeScale(props) {\n  const { api } = props;\n\n  const scales = useStore(api, '_scales');\n  const xArea = useStore(api, 'xArea');\n  const highlightTime = useStore(api, 'highlightTime');\n\n  const renderedRows = useMemo(() => {\n    const rows = scales.rows;\n    const lastIndex = rows.length - 1;\n\n    return rows.map((row, ri) => {\n      if (ri === lastIndex) {\n        return {\n          height: row.height,\n          from: xArea.from,\n          slice: row.cells.slice(xArea.start, xArea.end),\n        };\n      }\n      return {\n        height: row.height,\n        ...mapRow(row, xArea.from, xArea.to),\n      };\n    });\n  }, [scales, xArea]);\n\n  return (\n    <div className=\"wx-ZkvhDKir wx-scale\" style={{ width: scales.width }}>\n      {renderedRows.map((r, rowIdx) => (\n        <div\n          className=\"wx-ZkvhDKir wx-row\"\n          style={{ height: `${r.height}px`, paddingLeft: `${r.from}px` }}\n          key={rowIdx}\n        >\n          {r.slice.map((cell, cellIdx) => {\n            const extraClass = highlightTime\n              ? highlightTime(cell.date, cell.unit)\n              : '';\n            const className =\n              'wx-cell ' + (cell.css || '') + ' ' + (extraClass || '');\n            return (\n              <div\n                className={'wx-ZkvhDKir ' + className}\n                style={{ width: `${cell.width}px` }}\n                key={cellIdx}\n              >\n                <span\n                  className={\n                    'wx-ZkvhDKir' + (cell.width > 100 ? ' wx-cell-value' : '')\n                  }\n                >\n                  {cell.value}\n                </span>\n              </div>\n            );\n          })}\n        </div>\n      ))}\n    </div>\n  );\n}\n\nexport default TimeScale;\n","const MAX_ZOOM_RATE = 0.003; // per ms\n\nfunction clamp(value, min, max) {\n  return Math.max(Math.min(value, max), min);\n}\n\nexport function createZoomWheelHandler(api, getZoom, getContainer) {\n  let pending = false;\n  let lastWheelTime = performance.now();\n\n  function getZoomFactor(evDelta) {\n    const isTouchpad = Math.abs(evDelta) < 50; // or mouse with smooth scrolling\n    const SENSITIVITY = isTouchpad ? 0.004 : 0.01; // smaller - slower\n    const now = performance.now();\n    const dt = Math.min(now - lastWheelTime, 50);\n    lastWheelTime = now;\n    const normalized = clamp(\n      -evDelta * SENSITIVITY,\n      -MAX_ZOOM_RATE * dt,\n      MAX_ZOOM_RATE * dt,\n    );\n    return Math.exp(normalized);\n  }\n\n  return function onWheel(e) {\n    if (getZoom() && (e.ctrlKey || e.metaKey)) {\n      e.preventDefault();\n      const ratio = getZoomFactor(e.deltaY);\n      const offset = e.clientX - getContainer().getBoundingClientRect().left;\n      if (!pending) {\n        pending = true;\n        requestAnimationFrame(() => {\n          api.exec('zoom-scale', {\n            dir: ratio > 1 ? 1 : -1,\n            ratio: Math.abs(1 - ratio),\n            offset,\n          });\n          pending = false;\n        });\n      }\n    }\n  };\n}\n","import { useRef, useEffect } from 'react';\n\nconst renderMetrics = new Map();\n\nexport function useRenderTime(label) {\n  const startTime = useRef(null);\n  const renderCount = useRef(0);\n  const rafRef = useRef(null);\n\n  const enabled =\n    typeof window !== 'undefined' && window.__RENDER_METRICS_ENABLED__;\n\n  if (startTime.current === null) {\n    startTime.current = performance.now();\n  }\n  renderCount.current++;\n\n  useEffect(() => {\n    if (!enabled) return;\n\n    cancelAnimationFrame(rafRef.current);\n\n    rafRef.current = requestAnimationFrame(() => {\n      const metric = {\n        label,\n        time: performance.now() - startTime.current,\n        renders: renderCount.current,\n        timestamp: Date.now(),\n      };\n\n      renderMetrics.set(label, metric);\n\n      window.dispatchEvent(\n        new CustomEvent('render-metric', { detail: metric }),\n      );\n    });\n\n    return () => cancelAnimationFrame(rafRef.current);\n  });\n}\n","import {\n  useState,\n  useEffect,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useContext,\n  useCallback,\n} from 'react';\nimport CellGrid from './CellGrid.jsx';\nimport Bars from './Bars.jsx';\nimport { hotkeys } from '@svar-ui/grid-store';\nimport { setID } from '@svar-ui/lib-dom';\nimport storeContext from '../../context';\nimport { useStore, useStoreWithCounter } from '@svar-ui/lib-react';\nimport './Chart.css';\nimport TimeScales from './TimeScale.jsx';\nimport { createZoomWheelHandler } from '../../helpers/zoom';\nimport { useRenderTime } from '../../helpers/debug.js';\n\nfunction Chart(props) {\n  const { readonly, fullWidth, fullHeight, taskTemplate } = props;\n\n  const api = useContext(storeContext);\n\n  const [selected, selectedCounter] = useStoreWithCounter(api, '_selected');\n  const rScrollTop = useStore(api, 'scrollTop');\n  const rScrollLeft = useStore(api, 'scrollLeft');\n  const cellHeight = useStore(api, 'cellHeight');\n  const rTasks = useStore(api, '_tasks');\n  const resources = useStore(api, 'resources');\n  const scales = useStore(api, '_scales');\n  const area = useStore(api, 'area');\n  const groupBy = useStore(api, 'groupBy');\n  const xArea = useStore(api, 'xArea');\n  const zoom = useStore(api, 'zoom');\n  const calendars = useStore(api, '_calendars');\n  const markers = useStore(api, '_markers');\n  const highlightTime = useStore(api, 'highlightTime');\n\n  const [chartHeight, setChartHeight] = useState();\n  const chartRef = useRef(null);\n  const expectedScroll = useRef({ top: null, left: null });\n  const isUserScrollRef = useRef(false);\n\n  const extraRows = 1;\n  const selectStyle = useMemo(() => {\n    const t = [];\n    if (selected && selected.length && cellHeight) {\n      selected.forEach((obj) => {\n        t.push({ height: `${cellHeight}px`, top: `${obj.$y - 3}px` });\n      });\n    }\n    return t;\n  }, [selectedCounter, cellHeight]);\n\n  const chartGridHeight = useMemo(\n    () => Math.max(chartHeight || 0, fullHeight),\n    [chartHeight, fullHeight],\n  );\n\n  useLayoutEffect(() => {\n    const el = chartRef.current;\n    if (!el) return;\n\n    if (isUserScrollRef.current) {\n      isUserScrollRef.current = false;\n      return;\n    }\n\n    if (typeof rScrollTop === 'number') {\n      expectedScroll.current.top = rScrollTop;\n      el.scrollTop = rScrollTop;\n    }\n    if (typeof rScrollLeft === 'number') {\n      expectedScroll.current.left = rScrollLeft;\n      el.scrollLeft = rScrollLeft;\n    }\n  }, [rScrollTop, rScrollLeft]);\n\n  const onScroll = () => {\n    const el = chartRef.current;\n    if (!el) return;\n    if (el.scrollLeft !== expectedScroll.current.left) {\n      expectedScroll.current.left = el.scrollLeft;\n      isUserScrollRef.current = true;\n      api.exec('scroll-chart', { left: el.scrollLeft });\n    }\n  };\n\n  function dataRequest() {\n    const clientHeightLocal = chartHeight || 0;\n    const num = Math.ceil(clientHeightLocal / (cellHeight || 1)) + 1;\n    const pos = Math.floor((rScrollTop || 0) / (cellHeight || 1));\n    const start = Math.max(0, pos - extraRows);\n    const end = pos + num + extraRows;\n    const from = start * (cellHeight || 0);\n    api.exec('render-data', {\n      start,\n      end,\n      from,\n    });\n  }\n\n  useEffect(() => {\n    dataRequest();\n  }, [rScrollTop, chartHeight, cellHeight]);\n\n  const zoomRef = useRef(zoom);\n  zoomRef.current = zoom;\n\n  const onWheel = useMemo(\n    () =>\n      createZoomWheelHandler(\n        api,\n        () => zoomRef.current,\n        () => chartRef.current,\n      ),\n    [api],\n  );\n\n  function getHoliday(cell) {\n    const style = highlightTime?.(cell.date, cell.unit);\n    if (style)\n      return {\n        css: style,\n        width: cell.width,\n      };\n    return null;\n  }\n\n  const holidays = useMemo(() => {\n    if (!highlightTime) return null;\n    const cells = scales.rows[scales.rows.length - 1].cells;\n    return cells.slice(xArea.start, xArea.end).map(getHoliday);\n  }, [scales, highlightTime, xArea]);\n\n  const timelineCells = useMemo(() => {\n    const row = scales.rows[scales.rows.length - 1];\n    const cells = row?.cells;\n    return (scales.minUnit === 'hour' || scales.minUnit === 'day') && cells\n      ? cells.slice(xArea.start, xArea.end)\n      : [];\n  }, [scales, xArea]);\n\n  const visibleTasks = useMemo(\n    () => rTasks.slice(area.start, area.end),\n    [rTasks, area],\n  );\n\n  function getRowCalendars(task) {\n    if (groupBy?.field === 'resource') {\n      if (task.$resource) {\n        const calendar = api.getResourceCalendar(task);\n        return calendar ? [calendar] : [];\n      }\n\n      const groupValue = task.$groupValue;\n      if (groupValue === undefined || groupValue === '$ungrouped') return [];\n\n      const resourceIds = Array.isArray(groupValue) ? groupValue : [groupValue];\n\n      return resourceIds.flatMap((id) => {\n        const resource = resources?.byId(id);\n        if (!resource) return [];\n        const calendar = api.getResourceCalendar(resource);\n        return calendar ? [calendar] : [];\n      });\n    }\n\n    const calendar = task.calendar ? api.getTaskCalendar(task) : undefined;\n    return calendar ? [calendar] : [];\n  }\n\n  const rowHighlights = useMemo(() => {\n    const result = [];\n    if (!calendars) return result;\n    const globalCalendar = api.getCalendar();\n    visibleTasks.forEach((task, index) => {\n      const rowCalendars = getRowCalendars(task);\n      if (!rowCalendars.length) return;\n      timelineCells.forEach((cell, cellIndex) => {\n        const nonWorkingCalendars = rowCalendars.filter(\n          (cal) => !cal.isWorkingDay(cell.date),\n        );\n        const isRowWorkingDay = nonWorkingCalendars.length === 0;\n        const isGlobalHoliday =\n          globalCalendar && !globalCalendar.isWorkingDay(cell.date);\n\n        const cellConfig = {\n          width: cell.width,\n          height: cellHeight,\n          left: (cellIndex + xArea.start) * cell.width,\n          top: area.from + index * cellHeight,\n        };\n\n        let css = '';\n        if (!isRowWorkingDay) {\n          const extra = nonWorkingCalendars\n            .map((cal) => cal.css)\n            .filter(Boolean);\n          css = ['wx-weekend', ...extra].join(' ');\n        }\n        if (isRowWorkingDay && isGlobalHoliday) css = 'wx-weekend-override';\n\n        if (css) result.push({ ...cellConfig, css });\n      });\n    });\n    return result;\n  }, [\n    calendars,\n    visibleTasks,\n    timelineCells,\n    cellHeight,\n    xArea,\n    area,\n    groupBy,\n    resources,\n    api,\n  ]);\n\n  const handleHotkey = useCallback(\n    (ev) => {\n      ev.eventSource = 'chart';\n      api.exec('hotkey', ev);\n    },\n    [api],\n  );\n\n  useEffect(() => {\n    const el = chartRef.current;\n    if (!el) return;\n    const update = () => setChartHeight(el.clientHeight);\n    update();\n    const ro = new ResizeObserver(() => update());\n    ro.observe(el);\n    return () => {\n      ro.disconnect();\n    };\n  }, [chartRef.current]);\n\n  useEffect(() => {\n    const el = chartRef.current;\n    if (!el) return;\n    const cleanup = hotkeys(el, {\n      keys: {\n        arrowup: true,\n        arrowdown: true,\n      },\n      exec: (v) => handleHotkey(v),\n    });\n    return () => {\n      cleanup?.destroy();\n    };\n  }, []);\n\n  useEffect(() => {\n    const node = chartRef.current;\n    if (!node) return;\n\n    const handler = onWheel;\n    node.addEventListener('wheel', handler);\n    return () => {\n      node.removeEventListener('wheel', handler);\n    };\n  }, [onWheel]);\n\n  useRenderTime(\"chart\");\n\n  return (\n    <div\n      className=\"wx-mR7v2Xag wx-chart\"\n      tabIndex={-1}\n      ref={chartRef}\n      onScroll={onScroll}\n    >\n      <TimeScales api={api} />\n      {markers && markers.length ? (\n        <div\n          className=\"wx-mR7v2Xag wx-markers\"\n          style={{ height: `${chartGridHeight}px` }}\n        >\n          {markers.map((marker, i) => (\n            <div\n              key={i}\n              className={`wx-mR7v2Xag wx-marker ${marker.css || ''}`}\n              style={{ left: `${marker.left}px` }}\n            >\n              <div className=\"wx-mR7v2Xag wx-content\">{marker.text}</div>\n            </div>\n          ))}\n        </div>\n      ) : null}\n\n      <div\n        className=\"wx-mR7v2Xag wx-area\"\n        style={{ width: `${fullWidth}px`, height: `${chartGridHeight}px` }}\n      >\n        {holidays ? (\n          <div\n            className=\"wx-mR7v2Xag wx-gantt-holidays\"\n            style={{ height: '100%' }}\n          >\n            {holidays.map((holiday, i) =>\n              holiday ? (\n                <div\n                  key={i}\n                  className={'wx-mR7v2Xag ' + holiday.css}\n                  style={{\n                    width: `${holiday.width}px`,\n                    left: `${xArea.from + i * holiday.width}px`,\n                  }}\n                />\n              ) : null,\n            )}\n          </div>\n        ) : null}\n\n        {rowHighlights.map((row, index) => (\n          <div\n            key={index}\n            className={'wx-mR7v2Xag ' + row.css}\n            style={{\n              position: 'absolute',\n              pointerEvents: 'none',\n              width: `${row.width}px`,\n              height: `${row.height}px`,\n              left: `${row.left}px`,\n              top: `${row.top}px`,\n            }}\n          />\n        ))}\n\n        {selected && selected.length\n          ? selected.map((obj, index) =>\n              obj.$y ? (\n                <div\n                  key={obj.id}\n                  className=\"wx-mR7v2Xag wx-selected\"\n                  data-id={setID(obj.id)}\n                  style={selectStyle[index]}\n                ></div>\n              ) : null,\n            )\n          : null}\n\n        <CellGrid />\n\n        <Bars readonly={readonly} taskTemplate={taskTemplate} />\n      </div>\n    </div>\n  );\n}\n\nexport default Chart;\n","import { useMemo, useRef, useCallback } from 'react';\nimport { useStore } from '@svar-ui/lib-react';\nimport './Resizer.css';\n\nfunction Resizer(props) {\n  const {\n    api,\n    position = 'after',\n    size = 4,\n    dir = 'x',\n    onMove,\n    containerWidth = 0,\n    rightThreshold = 50,\n  } = props;\n\n  const gridWidth = useStore(api, 'gridWidth');\n  const displayMode = useStore(api, 'displayMode');\n  const gridCollapseThreshold = useStore(api, '_gridCollapseThreshold');\n  const compactMode = useStore(api, '_compactMode');\n\n  function getBox(value) {\n    let offset = 0;\n    if (position === 'center') offset = size / 2;\n    else if (position === 'before') offset = size;\n\n    const box = {\n      size: [size + 'px', 'auto'],\n      p: [value - offset + 'px', '0px'],\n      p2: ['auto', '0px'],\n    };\n\n    if (dir !== 'x') {\n      for (let name in box) box[name] = box[name].reverse();\n    }\n    return box;\n  }\n\n  const startRef = useRef(0);\n  const posRef = useRef();\n  const timeoutRef = useRef();\n\n  const gridWidthRef = useRef(gridWidth);\n  gridWidthRef.current = gridWidth;\n  const displayModeRef = useRef(displayMode);\n  displayModeRef.current = displayMode;\n  const compactModeRef = useRef(compactMode);\n  compactModeRef.current = compactMode;\n  const gridCollapseThresholdRef = useRef(gridCollapseThreshold);\n  gridCollapseThresholdRef.current = gridCollapseThreshold;\n\n  function getEventPos(ev) {\n    return dir === 'x' ? ev.clientX : ev.clientY;\n  }\n\n  const cursor = useMemo(\n    () =>\n      displayMode !== 'all' ? 'auto' : dir === 'x' ? 'ew-resize' : 'ns-resize',\n    [displayMode, dir],\n  );\n\n  const move = useCallback(\n    (ev) => {\n      const newPos = posRef.current + getEventPos(ev) - startRef.current;\n\n      api.exec('resize-grid', {\n        width: newPos,\n      });\n      let nextDisplay;\n\n      if (newPos <= gridCollapseThresholdRef.current) {\n        nextDisplay = 'chart';\n      } else if (containerWidth - newPos <= rightThreshold) {\n        nextDisplay = 'grid';\n      } else {\n        nextDisplay = 'all';\n      }\n\n      if (displayModeRef.current !== nextDisplay) {\n        api.exec('set-display-mode', {\n          mode: nextDisplay,\n        });\n      }\n\n      if (timeoutRef.current) clearTimeout(timeoutRef.current);\n      timeoutRef.current = setTimeout(\n        () => onMove && onMove(newPos),\n        100,\n      );\n    },\n    [api, containerWidth, rightThreshold, onMove, dir],\n  );\n\n  const up = useCallback(() => {\n    document.body.style.cursor = '';\n    document.body.style.userSelect = '';\n    window.removeEventListener('mousemove', move);\n    window.removeEventListener('mouseup', up);\n  }, [move]);\n\n  const down = useCallback(\n    (ev) => {\n      // Prevent dragging when in normal mode and only one view is visible\n      if (\n        compactModeRef.current ||\n        displayModeRef.current === 'grid' ||\n        displayModeRef.current === 'chart'\n      ) {\n        return;\n      }\n\n      startRef.current = getEventPos(ev);\n      posRef.current = gridWidthRef.current;\n\n      document.body.style.cursor = cursor;\n      document.body.style.userSelect = 'none';\n\n      window.addEventListener('mousemove', move);\n      window.addEventListener('mouseup', up);\n    },\n    [cursor, move, up, dir],\n  );\n\n  function handleExpand(direction) {\n    let mode;\n    if (compactMode) {\n      mode = displayMode === 'chart' ? 'grid' : 'chart';\n    } else {\n      if (displayMode === 'grid' || displayMode === 'chart') {\n        mode = 'all';\n      } else mode = direction === 'left' ? 'chart' : 'grid';\n    }\n\n    api.exec('set-display-mode', { mode });\n  }\n\n  function handleExpandLeft() {\n    handleExpand('left');\n  }\n\n  function handleExpandRight() {\n    handleExpand('right');\n  }\n\n  const b = useMemo(\n    () => getBox(gridWidth),\n    [gridWidth, position, size, dir],\n  );\n\n  const rootClassName = [\n    'wx-resizer',\n    `wx-resizer-${dir}`,\n    `wx-resizer-display-${displayMode}`,\n  ]\n    .filter(Boolean)\n    .join(' ');\n\n  return (\n    <div\n      className={'wx-pFykzMlT ' + rootClassName}\n      onMouseDown={down}\n      style={{ width: b.size[0], height: b.size[1], cursor }}\n    >\n      <div className=\"wx-pFykzMlT wx-button-expand-box\">\n        <div className=\"wx-pFykzMlT wx-button-expand-content wx-button-expand-left\">\n          <i\n            className=\"wx-pFykzMlT wxi-menu-left\"\n            onClick={handleExpandLeft}\n          ></i>\n        </div>\n        <div className=\"wx-pFykzMlT wx-button-expand-content wx-button-expand-right\">\n          <i\n            className=\"wx-pFykzMlT wxi-menu-right\"\n            onClick={handleExpandRight}\n          ></i>\n        </div>\n      </div>\n      <div className=\"wx-pFykzMlT wx-resizer-line\"></div>\n    </div>\n  );\n}\n\nexport default Resizer;\n","import {\n  useState,\n  useEffect,\n  useMemo,\n  useRef,\n  useCallback,\n  useContext,\n} from 'react';\nimport { hotkeys } from '@svar-ui/grid-store';\nimport { useStore, useWritableProp } from '@svar-ui/lib-react';\nimport Grid from './grid/Grid.jsx';\nimport Chart from './chart/Chart.jsx';\nimport Resizer from './Resizer.jsx';\nimport storeContext from '../context';\nimport './Layout.css';\nimport { flushSync } from 'react-dom';\n\nfunction Layout(props) {\n  const { taskTemplate, readonly, onTableAPIChange, onGanttWidthChange } = props;\n\n  const api = useContext(storeContext);\n\n  const rTasks = useStore(api, '_tasks');\n  const rScales = useStore(api, '_scales');\n  const rCellHeight = useStore(api, 'cellHeight');\n  const rColumns = useStore(api, 'columns');\n  const rScrollTop = useStore(api, 'scrollTop');\n  const undo = useStore(api, 'undo');\n  const columnsWidth = useStore(api, '_columnsWidth');\n\n  const [ganttWidth, setGanttWidth] = useWritableProp(props.ganttWidth);\n  const [ganttHeight, setGanttHeight] = useState(0);\n  const [innerWidth, setInnerWidth] = useState(undefined);\n\n  const scrollSize = useMemo(\n    () => (ganttWidth ?? 0) - (innerWidth ?? 0),\n    [ganttWidth, innerWidth],\n  );\n  const fullWidth = useMemo(() => rScales.width, [rScales]);\n  const fullHeight = useMemo(\n    () => rTasks.length * rCellHeight,\n    [rTasks, rCellHeight],\n  );\n  const scrollHeight = useMemo(\n    () => rScales.height + fullHeight + scrollSize,\n    [rScales, fullHeight, scrollSize],\n  );\n\n  const chartRef = useRef(null);\n\n  const latestLayout = useRef({\n    ganttWidth: 0,\n    columnsWidth: 0,\n    ganttHeight: 0,\n    rScalesHeight: 0,\n    scrollSize: 0,\n  });\n\n  useEffect(() => {\n    latestLayout.current = {\n      ganttWidth: ganttWidth ?? 0,\n      columnsWidth,\n      ganttHeight: ganttHeight ?? 0,\n      rScalesHeight: rScales.height,\n      scrollSize,\n    };\n  }, [ganttWidth, columnsWidth, ganttHeight, rScales, scrollSize]);\n\n  const chartResizeHandler = useCallback(() => {\n    const {\n      ganttWidth: gw,\n      columnsWidth: cw,\n      ganttHeight: gh,\n      rScalesHeight: sh,\n      scrollSize: ss,\n    } = latestLayout.current;\n    api.exec('resize-chart', {\n      width: gw - cw - ss - 4, // resizer width\n      height: gh - sh,\n      scrollSize: ss,\n    });\n  }, [api]);\n\n  useEffect(() => {\n    let ro;\n    if (chartRef.current) {\n      ro = new ResizeObserver(chartResizeHandler);\n      ro.observe(chartRef.current);\n    }\n    return () => {\n      if (ro) ro.disconnect();\n    };\n  }, [chartRef.current, chartResizeHandler]);\n\n  const ganttDivRef = useRef(null);\n  const pseudoRowsRef = useRef(null);\n  const expectedScrollTop = useRef(null);\n  const isUserScrollRef = useRef(false);\n\n  const onScroll = useCallback(() => {\n    const el = ganttDivRef.current;\n    if (el && el.scrollTop !== expectedScrollTop.current) {\n      expectedScrollTop.current = el.scrollTop;\n      isUserScrollRef.current = true;\n      api.exec('scroll-chart', {\n        top: el.scrollTop,\n      });\n    }\n  }, [api]);\n\n  useEffect(() => {\n    const ganttDiv = ganttDivRef.current;\n    const pseudoRows = pseudoRowsRef.current;\n    if (!ganttDiv || !pseudoRows) return;\n    const update = () => {\n      flushSync(() => {\n        setGanttHeight(ganttDiv.offsetHeight);\n        setGanttWidth(ganttDiv.offsetWidth);\n        setInnerWidth(pseudoRows.offsetWidth);\n      });\n    };\n    const ro = new ResizeObserver(update);\n    ro.observe(ganttDiv);\n    return () => ro.disconnect();\n  }, [ganttDivRef.current]);\n\n  useEffect(() => {\n    if (onGanttWidthChange) onGanttWidthChange(ganttWidth);\n  }, [ganttWidth, onGanttWidthChange]);\n\n  useEffect(() => {\n    const ganttDiv = ganttDivRef.current;\n    if (!ganttDiv) return;\n    // change originated from the user's own scroll — don't write it back,\n    // otherwise we re-trigger onScroll and loop (see Layout.svelte FIXME)\n    if (isUserScrollRef.current) {\n      isUserScrollRef.current = false;\n      return;\n    }\n    // only programmatic scrolls (scrollToTask, etc.) reach here\n    if (rScrollTop !== ganttDiv.scrollTop) {\n      expectedScrollTop.current = rScrollTop;\n      ganttDiv.scrollTop = rScrollTop;\n    }\n  }, [rScrollTop]);\n\n  const layoutRef = useRef(null);\n\n  useEffect(() => {\n    const node = layoutRef.current;\n    if (!node) return;\n\n    const cleanup = hotkeys(node, {\n      keys: {\n        'ctrl+c': true,\n        'ctrl+v': true,\n        'ctrl+x': true,\n        'ctrl+d': true,\n        backspace: true,\n        'ctrl+z': undo,\n        'ctrl+y': undo,\n      },\n      exec: (ev) => {\n        if (!ev.isInput) api.exec('hotkey', ev);\n      },\n    });\n\n    return () => {\n      cleanup?.destroy();\n    };\n  }, [undo]);\n\n  return (\n    <div className=\"wx-jlbQoHOz wx-gantt\" ref={ganttDivRef} onScroll={onScroll}>\n      <div\n        className=\"wx-jlbQoHOz wx-pseudo-rows\"\n        style={{ height: scrollHeight, width: '100%' }}\n        ref={pseudoRowsRef}\n      >\n        <div\n          className=\"wx-jlbQoHOz wx-stuck\"\n          style={{\n            height: ganttHeight,\n            width: innerWidth,\n          }}\n        >\n          <div tabIndex={0} className=\"wx-jlbQoHOz wx-layout\" ref={layoutRef}>\n            {rColumns.length ? (\n              <>\n                <Grid\n                  readonly={readonly}\n                  fullHeight={fullHeight}\n                  onTableAPIChange={onTableAPIChange}\n                />\n                <Resizer containerWidth={ganttWidth} api={api} />\n              </>\n            ) : null}\n\n            <div className=\"wx-jlbQoHOz wx-content\" ref={chartRef}>\n              <Chart\n                readonly={readonly}\n                fullWidth={fullWidth}\n                fullHeight={fullHeight}\n                taskTemplate={taskTemplate}\n              />\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n\nexport default Layout;\n","import { dateToString } from '@svar-ui/lib-dom';\n\nexport function getUnitFormats(_) {\n  return {\n    year: '%Y',\n    quarter: `${_('Q')} %Q`,\n    month: '%M',\n    week: `${_('Week')} %w`,\n    day: '%M %j',\n    hour: '%H:%i',\n  };\n}\n\nfunction normalizeFormatter(value, calendarLocale) {\n  return typeof value === 'function'\n    ? value\n    : dateToString(value, calendarLocale);\n}\n\nexport function prepareScales(scales, calendarLocale) {\n  return scales.map(({ format, ...scale }) => ({\n    ...scale,\n    format: normalizeFormatter(format, calendarLocale),\n  }));\n}\n\nexport function prepareFormats(calendarLocale, _) {\n  const formats = getUnitFormats(_);\n  for (let unit in formats) {\n    formats[unit] = dateToString(formats[unit], calendarLocale);\n  }\n  return formats;\n}\n\nexport function prepareColumns(columns, calendarLocale) {\n  if (!columns || !columns.length) return columns;\n  const format = dateToString('%d-%m-%Y', calendarLocale);\n\n  return columns.map((col) => {\n    if (col.template) return col;\n\n    if (col.id === 'start' || col.id === 'end') {\n      return {\n        ...col,\n        //store locale template for unscheduled tasks\n        _template: (b) => format(b),\n        template: (b) => format(b),\n      };\n    }\n    if (col.id === 'duration') {\n      return {\n        ...col,\n        _template: (b) => b,\n        template: (b) => b,\n      };\n    }\n    return col;\n  });\n}\n\nexport function prepareZoom(zoom, calendarLocale) {\n  if (!zoom.levels) {\n    return zoom;\n  }\n\n  return {\n    ...zoom,\n    levels: zoom.levels.map((level) => ({\n      ...level,\n      scales: prepareScales(level.scales, calendarLocale),\n    })),\n  };\n}\n","import {\n  forwardRef,\n  useEffect,\n  useMemo,\n  useRef,\n  useImperativeHandle,\n  useState,\n  useContext,\n  useCallback,\n} from 'react';\n\n// core widgets lib\nimport { context } from '@svar-ui/react-core';\n\n// locales\nimport { locale as l } from '@svar-ui/lib-dom';\nimport { en } from '@svar-ui/gantt-locales';\nimport { en as coreEn } from '@svar-ui/core-locales';\n\n// stores\nimport { EventBusRouter } from '@svar-ui/lib-state';\nimport {\n  DataStore,\n  getDefaultColumns,\n  getDefaultGridWidth,\n  defaultTaskTypes,\n  normalizeZoom,\n} from '@svar-ui/gantt-store';\n\n// context\nimport StoreContext from '../context';\n\n// store factory\nimport { writable } from '@svar-ui/lib-react';\n\n// ui\nimport Layout from './Layout.jsx';\n\n// helpers\nimport {\n  prepareScales,\n  prepareFormats,\n  prepareColumns,\n  prepareZoom,\n} from '../helpers/prepareConfig.js';\n\nconst camelize = (s) =>\n  s\n    .split('-')\n    .map((part) => (part ? part.charAt(0).toUpperCase() + part.slice(1) : ''))\n    .join('');\n\nconst defaultScales = [\n  { unit: 'month', step: 1, format: '%F %Y' },\n  { unit: 'day', step: 1, format: '%j' },\n];\n\nconst EMPTY_ARRAY = [];\nconst DEFAULT_SCHEDULE = { type: 'forward' };\nconst ROLLUPS_CLOSEST = { type: 'closest' };\n\nconst COMPACT_WIDTH = 650;\n\nconst Gantt = forwardRef(function Gantt(\n  {\n    taskTemplate = null,\n    markers = EMPTY_ARRAY,\n    taskTypes = defaultTaskTypes,\n    tasks = EMPTY_ARRAY,\n    selected = EMPTY_ARRAY,\n    activeTask = null,\n    links = EMPTY_ARRAY,\n    resources = null,\n    assignments = EMPTY_ARRAY,\n    scales = defaultScales,\n    columns = null,\n    start = null,\n    end = null,\n    lengthUnit = 'day',\n    durationUnit = 'day',\n    cellWidth = 100,\n    cellHeight = 38,\n    scaleHeight = 36,\n    gridWidth = null,\n    displayMode = 'all',\n    readonly = false,\n    cellBorders = 'full',\n    zoom = false,\n    baselines = false,\n    rollups = false,\n    highlightTime = null,\n    init = null,\n    autoScale = true,\n    unscheduledTasks = false,\n    criticalPath = null,\n    schedule = DEFAULT_SCHEDULE,\n    projectStart = null,\n    projectEnd = null,\n    calendar = null,\n    calendars = EMPTY_ARRAY,\n    undo = false,\n    splitTasks = false,\n    summary = null,\n    slack = false,\n    groupBy = null,\n    wbs = false,\n    ...restProps\n  },\n  ref,\n) {\n  // keep latest rest props for event routing\n  const restPropsRef = useRef();\n  restPropsRef.current = restProps;\n\n  // init stores\n  const dataStore = useMemo(() => new DataStore(writable), []);\n\n  // locale and formats\n  // uses same logic as the Locale component\n  const words = useMemo(() => ({ ...coreEn, ...en }), []);\n  const i18nCtx = useContext(context.i18n);\n  const locale = useMemo(() => {\n    if (!i18nCtx) return l(words);\n    return i18nCtx.extend(words, true);\n  }, [i18nCtx, words]);\n\n  // prepare configuration objects\n  const lCalendar = useMemo(() => locale.getRaw().calendar, [locale]);\n\n  // default column set (incl. auto-added resources/wbs columns) drives the\n  // default grid width when none is provided by the user\n  const defaultGridColumns = useMemo(\n    () => getDefaultColumns({ resources: !!resources, wbs }),\n    [resources, wbs],\n  );\n  const resolvedGridWidth = useMemo(\n    () => gridWidth ?? getDefaultGridWidth(defaultGridColumns),\n    [gridWidth, defaultGridColumns],\n  );\n\n  const normalizedConfig = useMemo(() => {\n    let config = {\n      zoom: prepareZoom(zoom, lCalendar),\n      scales: prepareScales(scales, lCalendar),\n      columns: prepareColumns(columns ?? defaultGridColumns, lCalendar),\n      links,\n      cellWidth,\n    };\n    if (config.zoom) {\n      config = {\n        ...config,\n        ...normalizeZoom(\n          config.zoom,\n          prepareFormats(lCalendar, locale.getGroup('gantt')),\n          config.scales,\n          cellWidth,\n        ),\n      };\n    }\n    return config;\n  }, [zoom, scales, columns, defaultGridColumns, links, cellWidth, lCalendar, locale]);\n\n  const firstInRoute = useMemo(() => dataStore.in, [dataStore]);\n\n  const lastInRouteRef = useRef(null);\n  if (lastInRouteRef.current === null) {\n    lastInRouteRef.current = new EventBusRouter((a, b) => {\n      const name = 'on' + camelize(a);\n      if (restPropsRef.current && restPropsRef.current[name]) {\n        restPropsRef.current[name](b);\n      }\n    });\n    firstInRoute.setNext(lastInRouteRef.current);\n  }\n\n  // two-way binding for tableAPI\n  const [tableAPI, setTableAPI] = useState(null);\n  const tableAPIRef = useRef(null);\n  tableAPIRef.current = tableAPI;\n\n  // compact mode (only changes when width crosses COMPACT_WIDTH)\n  const [compactMode, setCompactMode] = useState(false);\n  const onGanttWidthChange = useCallback((width) => {\n    const next = width != null && width <= COMPACT_WIDTH;\n    setCompactMode((prev) => (prev === next ? prev : next));\n  }, []);\n\n  // public API\n  const api = useMemo(\n    () => ({\n      getState: dataStore.getState.bind(dataStore),\n      getReactiveState: dataStore.getReactive.bind(dataStore),\n      getStores: () => ({ data: dataStore }),\n      exec: firstInRoute.exec,\n      setNext: (ev) => {\n        lastInRouteRef.current = lastInRouteRef.current.setNext(ev);\n        return lastInRouteRef.current;\n      },\n      intercept: firstInRoute.intercept.bind(firstInRoute),\n      on: firstInRoute.on.bind(firstInRoute),\n      detach: firstInRoute.detach.bind(firstInRoute),\n      getTask: (id) => dataStore.getTask(id),\n      getResource: (id) => dataStore.getResource(id),\n      serialize: (config) => dataStore.serialize(config),\n      getTable: (waitRender) =>\n        waitRender\n          ? new Promise((res) => setTimeout(() => res(tableAPIRef.current), 1))\n          : tableAPIRef.current,\n      getHistory: () => dataStore.getHistory(),\n      getCalendar: (id) => dataStore.getCalendar(id),\n      getTaskCalendar: (task) => dataStore.getTaskCalendar(task),\n      getResourceCalendar: (resource) =>\n        dataStore.getResourceCalendar(resource),\n      getTaskResources: (id) => dataStore.getTaskResources(id),\n      getResourceTasks: (id) => dataStore.getResourceTasks(id),\n    }),\n    [dataStore, firstInRoute],\n  );\n\n  // common API available in components\n  const storeApi = useMemo(\n    () => ({\n      getReactiveState: dataStore.getReactive.bind(dataStore),\n      getState: dataStore.getState.bind(dataStore),\n      exec: firstInRoute.exec.bind(firstInRoute),\n      getTask: dataStore.getTask.bind(dataStore),\n      getTaskCalendar: dataStore.getTaskCalendar.bind(dataStore),\n      getResourceCalendar: dataStore.getResourceCalendar.bind(dataStore),\n      getCalendar: dataStore.getCalendar.bind(dataStore),\n      getTaskResources: dataStore.getTaskResources.bind(dataStore),\n      getHistory: dataStore.getHistory.bind(dataStore),\n    }),\n    [dataStore, firstInRoute],\n  );\n\n  // expose API via ref\n  useImperativeHandle(\n    ref,\n    () => ({\n      ...api,\n    }),\n    [api],\n  );\n\n  const rollupsConfig = useMemo(\n    () => (rollups === true ? ROLLUPS_CLOSEST : rollups),\n    [rollups],\n  );\n\n  const storeConfig = useMemo(\n    () => ({\n      tasks,\n      links: normalizedConfig.links,\n      resources,\n      assignments,\n      start,\n      columns: normalizedConfig.columns,\n      end,\n      lengthUnit,\n      cellWidth: normalizedConfig.cellWidth,\n      cellHeight,\n      scaleHeight,\n      scales: normalizedConfig.scales,\n      taskTypes,\n      zoom: normalizedConfig.zoom,\n      selected,\n      activeTask,\n      baselines,\n      rollups: rollupsConfig,\n      autoScale,\n      unscheduledTasks,\n      markers,\n      durationUnit,\n      criticalPath,\n      schedule,\n      projectStart,\n      projectEnd,\n      calendar,\n      calendars,\n      slack,\n      undo,\n      _weekStart: lCalendar.weekStart,\n      splitTasks,\n      summary,\n      groupBy,\n      highlightTime,\n      wbs,\n      displayMode,\n      gridWidth: resolvedGridWidth,\n      cellBorders,\n      _compactMode: compactMode,\n    }),\n    [\n      tasks,\n      normalizedConfig,\n      resources,\n      assignments,\n      start,\n      end,\n      lengthUnit,\n      cellHeight,\n      scaleHeight,\n      taskTypes,\n      selected,\n      activeTask,\n      baselines,\n      rollupsConfig,\n      autoScale,\n      unscheduledTasks,\n      markers,\n      durationUnit,\n      criticalPath,\n      schedule,\n      projectStart,\n      projectEnd,\n      calendar,\n      calendars,\n      slack,\n      undo,\n      lCalendar,\n      splitTasks,\n      summary,\n      groupBy,\n      highlightTime,\n      wbs,\n      displayMode,\n      resolvedGridWidth,\n      cellBorders,\n      compactMode,\n    ],\n  );\n\n  const initOnceRef = useRef(0);\n  useEffect(() => {\n    if (!initOnceRef.current) {\n      if (init) init(api);\n    } else {\n      dataStore.init(storeConfig);\n    }\n    initOnceRef.current++;\n  }, [api, init, storeConfig, dataStore]);\n\n  if (initOnceRef.current === 0) {\n    dataStore.init(storeConfig);\n  }\n\n  return (\n    <context.i18n.Provider value={locale}>\n      <StoreContext.Provider value={storeApi}>\n        <Layout\n          taskTemplate={taskTemplate}\n          readonly={readonly}\n          onTableAPIChange={setTableAPI}\n          onGanttWidthChange={onGanttWidthChange}\n        />\n      </StoreContext.Provider>\n    </context.i18n.Provider>\n  );\n});\n\nexport default Gantt;\n","import { useContext, useMemo } from 'react';\nimport { Toolbar as WxToolbar } from '@svar-ui/react-toolbar';\nimport { useStoreLater } from '@svar-ui/lib-react';\nimport {\n  handleAction,\n  getToolbarButtons,\n  isHandledAction,\n} from '@svar-ui/gantt-store';\nimport { locale } from '@svar-ui/lib-dom';\nimport { en } from '@svar-ui/gantt-locales';\nimport { context } from '@svar-ui/react-core';\n\nexport default function Toolbar({ api = null, items = [] }) {\n  const i18nCtx = useContext(context.i18n);\n  const i18nLocal = useMemo(() => (i18nCtx ? i18nCtx : locale(en)), [i18nCtx]);\n  const _ = useMemo(() => i18nLocal.getGroup('gantt'), [i18nLocal]);\n\n  const _selected = useStoreLater(api, '_selected');\n  const undo = useStoreLater(api, 'undo');\n  const history = useStoreLater(api, 'history');\n  const splitTasks = useStoreLater(api, 'splitTasks');\n  const groupBy = useStoreLater(api, 'groupBy');\n\n  const historyActions = ['undo', 'redo'];\n\n  const finalItems = useMemo(() => {\n    const fullButtons = getToolbarButtons({ undo: true, splitTasks: true });\n    const buttons = items.length\n      ? items\n      : getToolbarButtons({\n          undo,\n          splitTasks,\n          group: !!groupBy?.field,\n        });\n    return buttons.map((b) => {\n      let item = { ...b, disabled: false };\n      item.handler = isHandledAction(fullButtons, item.id)\n        ? (it) => handleAction(api, it.id, null, _)\n        : item.handler;\n      if (item.text) item.text = _(item.text);\n      if (item.menuText) item.menuText = _(item.menuText);\n      return item;\n    });\n  }, [items, api, _, undo, splitTasks, groupBy]);\n\n  const buttons = useMemo(() => {\n    const finalButtons = [];\n    finalItems.forEach((item) => {\n      const action = item.id;\n\n      if (action === 'add-task' || !historyActions.includes(action)) {\n        if (!_selected?.length || !api) {\n          if (action !== 'add-task') return;\n          finalButtons.push(item);\n        } else {\n          finalButtons.push({\n            ...item,\n            disabled:\n              item.isDisabled &&\n              _selected.some((task) =>\n                item.isDisabled(\n                  task,\n                  api.getState(),\n                  api.getTaskCalendar(task)\n                )\n              ),\n          });\n        }\n      } else if (historyActions.includes(action)) {\n        finalButtons.push({\n          ...item,\n          disabled: item.isDisabled(history),\n        });\n      }\n    });\n    // filter out consecutive separators\n    return finalButtons.filter((button, index) => {\n      if (api && button.isHidden)\n        return !_selected.some((task) => button.isHidden(task, api.getState()));\n      if (button.comp === 'separator') {\n        const nextButton = finalButtons[index + 1];\n        if (!nextButton || nextButton.comp === 'separator') return false;\n      }\n      return true;\n    });\n  }, [api, _selected, history, finalItems]);\n\n  if (!i18nCtx) {\n    return (\n      <context.i18n.Provider value={i18nLocal}>\n        <WxToolbar items={buttons} />\n      </context.i18n.Provider>\n    );\n  }\n\n  return <WxToolbar items={buttons} />;\n}\n","import {\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n  useCallback,\n  useContext,\n  forwardRef,\n  useImperativeHandle,\n} from 'react';\nimport { ContextMenu as WxContextMenu } from '@svar-ui/react-menu';\nimport { handleAction, getMenuOptions, isHandledAction } from '@svar-ui/gantt-store';\nimport { locale, locateID, locate } from '@svar-ui/lib-dom';\nimport { en } from '@svar-ui/gantt-locales';\nimport { en as coreEn } from '@svar-ui/core-locales';\nimport { context } from '@svar-ui/react-core';\nimport { useStoreLater } from '@svar-ui/lib-react';\nimport './ContextMenu.css';\n\nfunction cloneMenuItems(items) {\n  return items.map((op) => {\n    const copy = { ...op };\n    if (op.data) copy.data = cloneMenuItems(op.data);\n    return copy;\n  });\n}\n\nconst ContextMenu = forwardRef(function ContextMenu(\n  {\n    options: optionsInit = [],\n    api = null,\n    resolver = null,\n    filter = null,\n    at = 'point',\n    children,\n    onClick,\n    css,\n  },\n  ref,\n) {\n  const menuRef = useRef(null);\n  const activeIdRef = useRef(null);\n  const [activeTask, setActiveTask] = useState(null);\n  // built imperatively before the menu opens, not derived from the store\n  // (avoids rebuild churn on every store tick)\n  const [menuOptions, setMenuOptions] = useState([]);\n\n  // i18n context\n  const i18nCtx = useContext(context.i18n);\n  const l = useMemo(() => i18nCtx || locale({ ...en, ...coreEn }), [i18nCtx]);\n  const _ = useMemo(() => l.getGroup('gantt'), [l]);\n\n  const taskTypesVal = useStoreLater(api, 'taskTypes');\n  const selectedVal = useStoreLater(api, 'selected');\n  const selectedTasksVal = useStoreLater(api, '_selected');\n  const splitTasksVal = useStoreLater(api, 'splitTasks');\n  const summaryVal = useStoreLater(api, 'summary');\n  const groupByVal = useStoreLater(api, 'groupBy');\n\n  const config = useMemo(\n    () => ({\n      splitTasks: splitTasksVal,\n      taskTypes: taskTypesVal,\n      summary: summaryVal,\n      group: !!groupByVal?.field,\n    }),\n    [splitTasksVal, taskTypesVal, summaryVal, groupByVal],\n  );\n\n  const fullOptions = useMemo(() => getMenuOptions(config), [config]);\n\n  const customOptions = useMemo(\n    () => (optionsInit.length ? optionsInit : null),\n    [optionsInit],\n  );\n  const localizedOptions = useMemo(\n    () => applyLocaleFn(customOptions ?? fullOptions),\n    [customOptions, fullOptions, _],\n  );\n\n  useEffect(() => {\n    if (!api) return;\n\n    api.on('scroll-chart', () => {\n      if (menuRef.current && menuRef.current.show) menuRef.current.show();\n    });\n    api.on('drag-task', () => {\n      if (menuRef.current && menuRef.current.show) menuRef.current.show();\n    });\n  }, [api]);\n\n  function applyLocaleFn(opts) {\n    return opts.map((op) => {\n      op = { ...op };\n      if (op.text) op.text = _(op.text);\n      if (op.subtext) op.subtext = _(op.subtext);\n      if (op.data) op.data = applyLocaleFn(op.data);\n      return op;\n    });\n  }\n\n  // _selected lags behind single selection from resolver (setAsyncState)\n  const tasks = useMemo(\n    () =>\n      selectedTasksVal && selectedTasksVal.length\n        ? selectedTasksVal\n        : activeTask\n          ? [activeTask]\n          : [],\n    [selectedTasksVal, activeTask],\n  );\n\n  const buildOptions = useCallback(\n    (tasksArg = tasks) => {\n      if (!api) return [];\n      const items = cloneMenuItems(localizedOptions);\n      const setDisabled = (data) => {\n        data.forEach((item) => {\n          if (item.isDisabled) {\n            item.disabled = tasksArg.some((task) =>\n              item.isDisabled(\n                task,\n                api.getState(),\n                api.getTaskCalendar(task),\n                activeIdRef.current,\n              ),\n            );\n          }\n          if (item.data) setDisabled(item.data);\n        });\n      };\n      setDisabled(items);\n      return items;\n    },\n    [api, localizedOptions, tasks],\n  );\n\n  const itemResolver = useCallback(\n    (id, ev) => {\n      if (\n        locate(ev.target, 'data-menu-ignore')?.classList.contains(\n          'wx-resource-load',\n        )\n      )\n        return null;\n\n      let task = id ? api?.getTask(id) : null;\n      if (resolver) {\n        const result = resolver(id, ev);\n        task = result === true ? task : result;\n      }\n      setActiveTask(task);\n\n      if (task) {\n        const segmentIndex = locateID(ev.target, 'data-segment');\n        if (segmentIndex !== null)\n          activeIdRef.current = { id: task.id, segmentIndex };\n        else activeIdRef.current = task.id;\n\n        if (!Array.isArray(selectedVal) || !selectedVal.includes(task.id)) {\n          api && api.exec && api.exec('select-task', { id: task.id });\n        }\n\n        // activeTask state update is async, so build with the freshly\n        // resolved task to mirror the Svelte `tasks` derived\n        const effectiveTasks =\n          selectedTasksVal && selectedTasksVal.length\n            ? selectedTasksVal\n            : [task];\n        setMenuOptions(buildOptions(effectiveTasks));\n      }\n      return task;\n    },\n    [api, resolver, selectedVal, selectedTasksVal, buildOptions],\n  );\n\n  const menuAction = useCallback(\n    (ev) => {\n      const action = ev.action;\n      if (action) {\n        const isAction = isHandledAction(fullOptions, action.id);\n        if (isAction) handleAction(api, action.id, activeIdRef.current, _);\n        onClick && onClick(ev);\n      }\n    },\n    [api, _, onClick, fullOptions],\n  );\n\n  const filterMenu = useCallback(\n    (item) => {\n      if (!api) return true;\n      let result = filter ? tasks.every((t) => filter(item, t)) : true;\n\n      if (result) {\n        if (item.isHidden)\n          result = !tasks.some((t) =>\n            item.isHidden(t, api.getState(), activeIdRef.current),\n          );\n      }\n      return result;\n    },\n    [filter, tasks, api],\n  );\n\n  useImperativeHandle(ref, () => ({\n    show: (ev, obj) => {\n      setMenuOptions(buildOptions());\n      if (menuRef.current && menuRef.current.show) {\n        menuRef.current.show(ev, obj);\n      }\n    },\n  }));\n\n  const onContextMenu = useCallback((e) => {\n    if (menuRef.current && menuRef.current.show) {\n      menuRef.current.show(e);\n    }\n  }, []);\n\n  const content = (\n    <>\n      <WxContextMenu\n        filter={filterMenu}\n        options={menuOptions}\n        dataKey={'id'}\n        resolver={itemResolver}\n        onClick={menuAction}\n        at={at}\n        ref={menuRef}\n        css={css}\n      />\n      <span onContextMenu={onContextMenu} data-menu-ignore=\"true\">\n        {typeof children === 'function' ? children() : children}\n      </span>\n    </>\n  );\n\n  if (!i18nCtx && context.i18n?.Provider) {\n    const Provider = context.i18n.Provider;\n    return <Provider value={l}>{content}</Provider>;\n  }\n\n  return content;\n});\n\nexport default ContextMenu;\n","import { useCallback, useEffect, useRef } from 'react';\nimport { Grid } from '@svar-ui/react-grid';\nimport { locateID } from '@svar-ui/lib-dom';\nimport './GridSection.css';\n\nfunction GridSection(props) {\n\tconst { columns, data, onAction, onEdit, sizes, onInit } = props;\n\n\tconst onActionRef = useRef(onAction);\n\tconst onEditRef = useRef(onEdit);\n\tconst onInitRef = useRef(onInit);\n\n\tuseEffect(() => {\n\t\tonActionRef.current = onAction;\n\t\tonEditRef.current = onEdit;\n\t\tonInitRef.current = onInit;\n\t}, [onAction, onEdit, onInit]);\n\n\tfunction onClick(e) {\n\t\tconst id = locateID(e);\n\t\tconst action = e.target.dataset.action;\n\t\tif (action) e.preventDefault();\n\t\tif (id && action) onActionRef.current?.(id, action);\n\t}\n\n\tconst init = useCallback((tApi) => {\n\t\tonInitRef.current?.(tApi);\n\t\ttApi.on('update-cell', (ev) => {\n\t\t\tconst { id, column, value } = ev;\n\t\t\tonEditRef.current?.(id, column, value);\n\t\t});\n\t}, []);\n\n\treturn (\n\t\t<div className=\"wx-table wx-aaadQkXy\" onClick={onClick}>\n\t\t\t<Grid\n\t\t\t\tinit={init}\n\t\t\t\tcolumns={columns}\n\t\t\t\tdata={data}\n\t\t\t\tselect={false}\n\t\t\t\tcolumnStyle={col =>\n\t\t\t\t\t`wx-editor-cell wx-text-${col.align} ${col.id === 'delete' ? 'wx-action' : ''}`}\n\t\t\t\tsizes={sizes || {}}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\nexport default GridSection;\n","import { useMemo } from 'react';\nimport './LinkTypeCell.css';\n\nfunction LinkTypeCell(props) {\n\tconst { row, column, data } = props;\n\n\tconst label = useMemo(() => {\n\t\tif (data) return data.label;\n\t\treturn column.options.find(op => op.id === row.type)?.label || '';\n\t}, [data, column, row]);\n\n\treturn (\n\t\t<div className=\"wx-wrapper wx-aadwz4ed\">\n\t\t\t<div className=\"wx-text wx-aadwz4ed\">{label}</div>\n\t\t\t{row && <i className=\"wxi-angle-down wx-aadwz4ed\"></i>}\n\t\t</div>\n\t);\n}\n\nexport default LinkTypeCell;\n","import { Fragment, useState, useEffect, useMemo, useContext } from 'react';\nimport { context } from '@svar-ui/react-core';\nimport { useStore, useStoreWithCounter } from '@svar-ui/lib-react';\n\nimport ActionCell from '../grid/ActionCell.jsx';\nimport GridSection from './GridSection.jsx';\nimport LinkTypeCell from './LinkTypeCell.jsx';\nimport './Links.css';\n\nexport default function Links({\n  api,\n  autoSave,\n  onExtChange,\n  predecessors = null,\n  successors = null,\n  batch = 'links',\n}) {\n  const i18n = useContext(context.i18n);\n  const _ = useMemo(() => i18n.getGroup('gantt'), [i18n]);\n\n  const activeTask = useStore(api, 'activeTask');\n  const _activeTask = useStore(api, '_activeTask');\n  const [links, linksCounter] = useStoreWithCounter(api, 'links');\n  const tasks = useStore(api, 'tasks');\n  const schedule = useStore(api, 'schedule');\n  const unscheduledTasks = useStore(api, 'unscheduledTasks');\n\n  const list = useMemo(\n    () => [\n      { id: 'e2s', label: _('End-to-start') },\n      { id: 's2s', label: _('Start-to-start') },\n      { id: 'e2e', label: _('End-to-end') },\n      { id: 's2e', label: _('Start-to-end') },\n    ],\n    [_],\n  );\n\n  function lagEditorHandler(row) {\n    return row.type === 'e2s'\n      ? { type: 'text', config: { type: 'number' } }\n      : null;\n  }\n\n  const isLagHidden = useMemo(\n    () =>\n      !schedule?.auto || (unscheduledTasks && _activeTask?.unscheduled),\n    [schedule, unscheduledTasks, _activeTask],\n  );\n\n  function getColumns() {\n    return [\n      {\n        id: 'taskText',\n        header: _('Task name'),\n        flexgrow: 2,\n      },\n      {\n        id: 'lag',\n        header: _('Lag'),\n        editor: lagEditorHandler,\n        flexgrow: 1,\n        hidden: isLagHidden,\n      },\n      {\n        id: 'type',\n        header: _('Type'),\n        width: 124,\n        options: list,\n        editor: {\n          type: 'richselect',\n          config: {\n            cell: LinkTypeCell,\n          },\n        },\n        cell: LinkTypeCell,\n      },\n      {\n        id: 'delete',\n        header: '',\n        cell: ActionCell,\n        width: 50,\n        align: 'center',\n      },\n    ];\n  }\n\n  function getLinksData() {\n    if (activeTask) {\n      const il = [];\n      const ol = [];\n\n      if (!predecessors || !successors) {\n        links.forEach((l) => {\n          if (!predecessors && l.target === activeTask) il.push(l);\n          if (!successors && l.source === activeTask) ol.push(l);\n        });\n      }\n\n      const inLinks =\n        predecessors ||\n        il.map((link) => {\n          const { id, lag, type, source } = link;\n          return {\n            id,\n            type,\n            lag,\n            taskText: tasks.byId(source).text,\n          };\n        });\n\n      const outLinks =\n        successors ||\n        ol.map((link) => {\n          const { id, lag, type, target } = link;\n          return {\n            id,\n            type,\n            lag,\n            taskText: tasks.byId(target).text,\n          };\n        });\n\n      return [\n        { title: _('Predecessors'), data: inLinks },\n        { title: _('Successors'), data: outLinks },\n      ];\n    }\n  }\n\n  const [linksData, setLinksData] = useState();\n\n  useEffect(() => {\n    setLinksData(getLinksData());\n  }, [activeTask, links, linksCounter, tasks, predecessors, successors]);\n\n  function onDeleteAction(id) {\n    if (autoSave) {\n      api.exec('delete-link', { id });\n    } else {\n      setLinksData((prev) => {\n        const next = (prev || []).map((group) => ({\n          ...group,\n          data: group.data.filter((item) => item.id !== id),\n        }));\n        onExtChange &&\n          onExtChange({\n            view: 'links',\n            event: {\n              id,\n              action: 'delete-link',\n              data: { id },\n            },\n            values: {\n              predecessors: next[0].data,\n              successors: next[1].data,\n            },\n          });\n        return next;\n      });\n    }\n  }\n\n  function onEdit(id, column, value) {\n    const update = { [column]: value };\n    if (column === 'type' && schedule?.auto) {\n      if (value !== 'e2s') update.lag = '';\n    }\n\n    if (autoSave) {\n      api.exec('update-link', {\n        id,\n        link: update,\n      });\n    } else {\n      setLinksData((prev) => {\n        const next = (prev || []).map((group) => ({\n          ...group,\n          data: group.data.map((item) =>\n            item.id === id ? { ...item, ...update } : item,\n          ),\n        }));\n        onExtChange &&\n          onExtChange({\n            view: 'links',\n            event: {\n              id,\n              action: 'update-link',\n              data: {\n                id,\n                link: update,\n              },\n            },\n            values: {\n              predecessors: next[0].data,\n              successors: next[1].data,\n            },\n          });\n        return next;\n      });\n    }\n  }\n\n  const columns = useMemo(() => getColumns(), [_, list, isLagHidden]);\n\n  const isMessage =\n    linksData && !linksData[0].data.length && !linksData[1].data.length;\n\n  const wrapperClassName = [\n    'wx-j93aYGQf',\n    'wx-wrapper',\n    batch !== 'links' ? 'wx-nobatch' : '',\n  ]\n    .filter(Boolean)\n    .join(' ');\n\n  return (\n    <div className={wrapperClassName}>\n      {(linksData || []).map((group, idx) =>\n        group.data.length ? (\n          <Fragment key={idx}>\n            <div className=\"wx-j93aYGQf wx-title\">{group.title}</div>\n            <GridSection\n              columns={columns}\n              onAction={onDeleteAction}\n              onEdit={onEdit}\n              data={group.data}\n              sizes={{\n                rowHeight: 44,\n              }}\n            />\n          </Fragment>\n        ) : null,\n      )}\n      {isMessage ? (\n        <div className=\"wx-j93aYGQf wx-nodata\">{_('No links')}</div>\n      ) : null}\n    </div>\n  );\n}\n","import { DatePicker, TimePicker } from '@svar-ui/react-core';\nimport './DateTimePicker.css';\n\nexport default function DateTimePicker(props) {\n  const { value, time, format, onchange, onChange, ...restProps } = props;\n  const onChangeHandler = onChange ?? onchange;\n\n  function handleDateChange(ev) {\n    const current = new Date(ev.value);\n    current.setHours(value.getHours());\n    current.setMinutes(value.getMinutes());\n\n    onChangeHandler && onChangeHandler({ value: current });\n  }\n\n  return (\n    <div className=\"wx-hFsbgDln date-time-controll\">\n      <DatePicker\n        {...restProps}\n        value={value}\n        onChange={handleDateChange}\n        format={format}\n        buttons={['today']}\n        clear={false}\n      />\n      {time ? (\n        <TimePicker value={value} onChange={onChangeHandler} format={format} />\n      ) : null}\n    </div>\n  );\n}\n","import { useMemo } from 'react';\nimport { Avatar } from '@svar-ui/react-core';\nimport './ResourcesEditorCell.css';\n\nfunction ResourcesEditorCell(props) {\n\tconst { row, data } = props;\n\n\tconst item = useMemo(() => data || row, [data, row]);\n\n\tif (!item) return null;\n\n\treturn (\n\t\t<>\n\t\t\t<div className=\"wx-avatar wx-aadUoSB7\">\n\t\t\t\t<Avatar value={item} size={40} />\n\t\t\t</div>\n\t\t\t<div className=\"wx-text wx-aadUoSB7\">\n\t\t\t\t<div className=\"wx-name wx-aadUoSB7\">{item.name}</div>\n\t\t\t\t{item.role ? (\n\t\t\t\t\t<div className=\"wx-role wx-aadUoSB7\">{item.role}</div>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t</>\n\t);\n}\n\nexport default ResourcesEditorCell;\n","import { useState, useEffect, useMemo, useRef, useContext } from 'react';\nimport { Button } from '@svar-ui/react-core';\nimport { context } from '@svar-ui/react-core';\nimport { useStore } from '@svar-ui/lib-react';\nimport { tempID } from '@svar-ui/lib-state';\n\nimport GridSection from './GridSection.jsx';\nimport ActionCell from '../grid/ActionCell.jsx';\nimport ResourcesEditorCell from './ResourcesEditorCell.jsx';\nimport './Resources.css';\n\nexport default function Resources({\n  api,\n  autoSave,\n  onExtChange: onChange,\n  taskAssignments = null,\n}) {\n  const i18n = useContext(context.i18n);\n  const _ = useMemo(() => i18n.getGroup('gantt'), [i18n]);\n\n  const activeTask = useStore(api, 'activeTask');\n  const resources = useStore(api, 'resources');\n  const _assignments = useStore(api, '_assignments');\n  const assignments = useStore(api, 'assignments');\n\n  const [gridApi, setGridApi] = useState();\n  const [newRowId, setNewRowId] = useState(null);\n  const [taskResources, setTaskResources] = useState([]);\n\n  useEffect(() => {\n    setTaskResources(\n      taskAssignments ||\n        api.getTaskResources(activeTask).map((r) => {\n          return { ...r, resource: r.id, id: r.assignmentId };\n        }),\n    );\n  }, [api, activeTask, _assignments, taskAssignments]);\n\n  const allOptions = useMemo(() => {\n    const items = [];\n    resources.eachChild((item) => {\n      if (!item.data) items.push({ ...item, label: item.name });\n    }, 0);\n    return items;\n  }, [resources]);\n\n  const filteredOptions = useMemo(() => {\n    return allOptions.filter(\n      (r) => !taskResources.find((a) => a.resource === r.id),\n    );\n  }, [allOptions, taskResources]);\n\n  function getActionData(evData) {\n    return {\n      view: 'resources',\n      event: evData,\n      values: {\n        taskAssignments: taskResources,\n      },\n    };\n  }\n\n  function deleteAssignment(id) {\n    gridApi.exec('close-editor', { ignore: true });\n    if (autoSave) {\n      api.exec('delete-assignment', { id });\n    } else {\n      setTaskResources((prev) => prev.filter((a) => a.id !== id));\n      onChange &&\n        onChange(\n          getActionData({\n            id,\n            action: 'delete-assignment',\n            data: { id },\n          }),\n        );\n    }\n    setNewRowId(null);\n  }\n\n  function addAssignment(id, assignment) {\n    assignment = { ...assignment, units: 100, task: activeTask, id };\n    const item = { assignment };\n    if (autoSave) {\n      api.exec('add-assignment', item);\n    } else {\n      const r = resources?.byId(assignment.resource);\n      setTaskResources((prev) => [...prev, { ...r, ...assignment }]);\n      onChange &&\n        onChange(\n          getActionData({\n            id: r.id,\n            action: 'add-assignment',\n            data: item,\n          }),\n        );\n    }\n  }\n\n  function getRowOptions(row) {\n    if (row.id === newRowId) return filteredOptions;\n    const rowOption = allOptions.find((op) => op.id === row.resource);\n    return [rowOption].concat(filteredOptions);\n  }\n\n  function updateAssignment(id, assignment) {\n    let item = assignments.byId(id);\n    if (!item) item = taskResources.find((a) => a.id === id);\n    const update = {\n      id,\n      assignment: { units: item.units || 100, ...assignment, id },\n    };\n\n    if (autoSave) {\n      api.exec('update-assignment', update);\n    } else {\n      if (assignment.resource && assignment.resource !== item.resource) {\n        const r = resources?.byId(assignment.resource);\n        assignment = { ...r, ...update.assignment };\n      }\n\n      setTaskResources((prev) =>\n        prev.map((row) => (row.id === id ? { ...row, ...assignment } : row)),\n      );\n      onChange &&\n        onChange(\n          getActionData({\n            id,\n            action: 'update-assignment',\n            data: update,\n          }),\n        );\n    }\n  }\n\n  const columns = useMemo(() => {\n    filteredOptions;\n    return [\n      {\n        id: 'resource',\n        header: _('Resource'),\n        cell: ResourcesEditorCell,\n        type: 'string',\n        flexgrow: 3,\n        editor: (row) => {\n          return {\n            type: 'combo',\n            config: {\n              options: getRowOptions(row),\n              cell: ResourcesEditorCell,\n            },\n          };\n        },\n        options: allOptions,\n      },\n      {\n        id: 'units',\n        header: _('Units'),\n        flexgrow: 1,\n        editor: {\n          type: 'text',\n          config: { type: 'number' },\n        },\n        template: (v) => `${v}%`,\n      },\n      {\n        id: 'delete',\n        header: '',\n        cell: ActionCell,\n        width: 50,\n        align: 'center',\n      },\n    ];\n  }, [filteredOptions, allOptions, _, newRowId]);\n\n  function onAction(id, action) {\n    if (id && action === 'delete') deleteAssignment(id);\n  }\n\n  function onEdit(id, column, value) {\n    if (column === 'units') updateAssignment(id, { units: value * 1 });\n    else if (column === 'resource') {\n      const assignmentData = { resource: value };\n      if (id === newRowId) {\n        addAssignment(id, assignmentData);\n      } else {\n        updateAssignment(id, assignmentData);\n      }\n    }\n\n    setNewRowId(null);\n  }\n\n  const newRowIdRef = useRef(newRowId);\n  useEffect(() => {\n    newRowIdRef.current = newRowId;\n  }, [newRowId]);\n\n  function onInit(tApi) {\n    setGridApi(tApi);\n    // delete a new empty row if an editor closed without resource selection\n    tApi.on('close-editor', () => {\n      if (newRowIdRef.current) {\n        tApi.exec('delete-row', { id: newRowIdRef.current });\n        setNewRowId(null);\n      }\n    });\n  }\n\n  const addingDisabled = useMemo(\n    () => newRowId || !filteredOptions.length,\n    [newRowId, filteredOptions],\n  );\n\n  const pendingRef = useRef(false);\n  function onAddClick() {\n    gridApi?.exec('close-editor', { ignore: true });\n    if (!pendingRef.current) {\n      pendingRef.current = true;\n      const id = tempID();\n      setNewRowId(id);\n      requestAnimationFrame(() => {\n        addRow(id);\n        pendingRef.current = false;\n      });\n    }\n  }\n\n  function addRow(id) {\n    gridApi.exec('add-row', { id, row: { units: 100 } });\n    setTimeout(() => {\n      gridApi.exec('open-editor', { id, column: 'resource' });\n    });\n  }\n\n  return (\n    <div className=\"wx-aabce6pu wx-section\">\n      {taskResources.length || newRowId ? (\n        <GridSection\n          onInit={onInit}\n          columns={columns}\n          onAction={onAction}\n          onEdit={onEdit}\n          data={taskResources}\n          sizes={{\n            rowHeight: 52,\n          }}\n        />\n      ) : (\n        <div className=\"wx-aabce6pu wx-nodata\">{_('No assignments')}</div>\n      )}\n      <div className=\"wx-aabce6pu wx-button-wrapper\">\n        <Button\n          disabled={addingDisabled}\n          icon=\"wxi-plus\"\n          css=\"wx-button\"\n          onClick={onAddClick}\n        >\n          {_('Add resource')}\n        </Button>\n      </div>\n    </div>\n  );\n}\n","import { useState, useEffect, useMemo, useContext } from 'react';\nimport { dateToString } from '@svar-ui/lib-dom';\nimport { prepareEditTask } from '@svar-ui/gantt-store';\nimport { tempID } from '@svar-ui/lib-state';\nimport { context } from '@svar-ui/react-core';\nimport { useStore } from '@svar-ui/lib-react';\nimport GridSection from './GridSection.jsx';\nimport ActionCell from '../grid/ActionCell.jsx';\nimport './Segments.css';\n\nexport default function Segments({ api, autoSave, segments, onExtChange }) {\n  const onChange = onExtChange;\n\n  const l = useContext(context.i18n);\n  const _ = useMemo(() => l.getGroup('gantt'), [l]);\n  const dateFormat = useMemo(() => {\n    const i18nData = l.getRaw();\n    const f = i18nData.gantt?.dateFormat || i18nData.formats?.dateFormat;\n    return dateToString(f, i18nData.calendar);\n  }, [l]);\n\n  const _activeTask = useStore(api, '_activeTask');\n\n  const [segmentsState, setSegmentsState] = useState([]);\n\n  function getSegmentsData() {\n    if (!_activeTask || segments === null) return [];\n    return segments\n      ? [...segments]\n      : _activeTask?.segments?.map((s) => ({\n          ...s,\n          id: s.id || tempID(),\n        }));\n  }\n\n  useEffect(() => {\n    setSegmentsState(getSegmentsData());\n  }, [_activeTask, segments]);\n\n  const columns = useMemo(() => {\n    return [\n      {\n        id: 'text',\n        header: _('Name'),\n        type: 'string',\n        flexgrow: 3,\n        editor: 'text',\n      },\n      {\n        id: 'start',\n        header: _('Start'),\n        flexgrow: 2,\n        template: (v) => dateFormat(v),\n        editor: 'datepicker',\n      },\n      {\n        id: 'duration',\n        header: _('Duration'),\n        flexgrow: 2,\n        editor: {\n          type: 'text',\n          config: { type: 'number' },\n        },\n      },\n      {\n        id: 'delete',\n        header: '',\n        cell: ActionCell,\n        width: 50,\n        align: 'center',\n      },\n    ];\n  }, [_, dateFormat]);\n\n  const [gridApi, setGridApi] = useState(null);\n\n  function onInit(t) {\n    setGridApi(t);\n  }\n\n  function getActionData(evData) {\n    return {\n      view: 'segments',\n      event: evData,\n      values: {\n        segments: segmentsState.length ? [...segmentsState] : null,\n      },\n    };\n  }\n\n  function deleteSegment(id) {\n    const index = segmentsState.findIndex((s) => s.id === id);\n    const next = segmentsState.filter((s, i) => i !== index);\n    setSegmentsState(next);\n\n    const update = {\n      id: _activeTask.id,\n      task: {\n        segments: next.length ? [...next] : null,\n      },\n    };\n    if (autoSave) {\n      api.exec('update-task', update);\n    } else {\n      onChange &&\n        onChange(\n          getActionData({\n            id,\n            action: 'update-task',\n            data: update,\n          }),\n        );\n    }\n  }\n\n  function onAction(id, action) {\n    if (action === 'delete') deleteSegment(id);\n  }\n\n  function onEdit(id, column, value) {\n    const { data } = gridApi.getState();\n    let index = data.findIndex((s) => s.id === id);\n    if (column === 'duration') value = value * 1;\n    const segment = { ...segmentsState[index], [column]: value };\n    prepareEditTask(\n      segment,\n      api.getState(),\n      api.getTaskCalendar(_activeTask),\n      column,\n    );\n    const update = {\n      id: _activeTask.id,\n      segmentIndex: index,\n      task: segment,\n    };\n\n    if (autoSave) {\n      api.exec('update-task', update);\n    } else {\n      setSegmentsState((prev) =>\n        prev.map((s) => (s.id === id ? { ...s, ...segment } : s)),\n      );\n      onChange &&\n        onChange(\n          getActionData({\n            id,\n            action: 'update-task',\n            data: update,\n          }),\n        );\n    }\n  }\n\n  return (\n    <div className=\"wx-section wx-aabvtaY1\">\n      {segmentsState.length ? (\n        <GridSection\n          columns={columns}\n          onInit={onInit}\n          onAction={onAction}\n          data={segmentsState}\n          onEdit={onEdit}\n        />\n      ) : (\n        <div className=\"wx-nodata wx-aabvtaY1\">{_('No segments')}</div>\n      )}\n    </div>\n  );\n}\n","import { useState, useEffect, useMemo, useCallback, useContext } from 'react';\nimport { Editor as WxEditor, registerEditorItem } from '@svar-ui/react-editor';\nimport { registerToolbarItem } from '@svar-ui/react-toolbar';\nimport { Locale, Tabs, RichSelect, Slider, Counter, TwoState, Checkbox } from '@svar-ui/react-core';\nimport {\n  getEditorItems,\n  prepareEditTask,\n  getEditorButtons,\n  filterEditorButtons,\n} from '@svar-ui/gantt-store';\nimport { dateToString, locale } from '@svar-ui/lib-dom';\nimport { en } from '@svar-ui/gantt-locales';\nimport { en as coreEn } from '@svar-ui/core-locales';\nimport { context } from '@svar-ui/react-core';\n\nimport Links from './editor/Links.jsx';\nimport DateTimePicker from './editor/DateTimePicker.jsx';\nimport Resources from './editor/Resources.jsx';\nimport Segments from './editor/Segments.jsx';\nimport { useStore } from '@svar-ui/lib-react';\n\nimport './Editor.css';\n\nregisterEditorItem('select', RichSelect);\nregisterEditorItem('date', DateTimePicker);\nregisterEditorItem('twostate', TwoState);\nregisterEditorItem('slider', Slider);\nregisterEditorItem('counter', Counter);\nregisterEditorItem('links', Links);\nregisterEditorItem('checkbox', Checkbox);\nregisterEditorItem('resources', Resources);\nregisterEditorItem('segments', Segments);\nregisterToolbarItem('tabs', Tabs);\n\nconst defBatch = 'general';\n\nconst externalValues = {\n  taskAssignments: null,\n  predecessors: null,\n  successors: null,\n};\n\nfunction Editor({\n  api,\n  items = [],\n  css = '',\n  layout = 'default',\n  readonly = false,\n  placement = 'sidebar',\n  bottomBar = false,\n  topBar = true,\n  autoSave = true,\n  focus = false,\n  hotkeys = {},\n}) {\n  const lFromCtx = useContext(context.i18n);\n  const l = useMemo(() => lFromCtx || locale({ ...en, ...coreEn }), [lFromCtx]);\n  const _ = useMemo(() => l.getGroup('gantt'), [l]);\n  const i18nData = l.getRaw();\n  const dateFormat = useMemo(() => {\n    const f = i18nData.gantt?.dateFormat || i18nData.formats?.dateFormat;\n    return dateToString(f, i18nData.calendar);\n  }, [i18nData]);\n\n  const activeTask = useStore(api, '_activeTask');\n  const taskId = useStore(api, 'activeTask');\n  const unscheduledTasks = useStore(api, 'unscheduledTasks');\n  const rollups = useStore(api, 'rollups');\n  const summary = useStore(api, 'summary');\n  const links = useStore(api, 'links');\n  const splitTasks = useStore(api, 'splitTasks');\n  const taskTypes = useStore(api, 'taskTypes');\n  const resources = useStore(api, 'resources') ?? null;\n  const undo = useStore(api, 'undo');\n  const compactMode = useStore(api, '_compactMode');\n\n  const [activeBatch, setActiveBatch] = useState(defBatch);\n  const styleCss = useMemo(\n    () => (compactMode ? 'wx-full-screen' : ''),\n    [compactMode],\n  );\n\n  const baseItems = useMemo(\n    () =>\n      getEditorItems({\n        unscheduledTasks,\n        rollups,\n        summary,\n        taskTypes,\n        resources,\n        splitTasks,\n      }),\n    [unscheduledTasks, rollups, summary, taskTypes, resources, splitTasks],\n  );\n\n  const [linksActions, setLinksActions] = useState(() => new Map());\n  const [assignmentsActions, setAssignmentsActions] = useState(() => new Map());\n  const [segmentsActions, setSegmentsActions] = useState(() => new Map());\n  const [inProgress, setInProgress] = useState(null);\n\n  const [editorValues, setEditorValues] = useState();\n  const [editorErrors, setEditorErrors] = useState(null);\n\n  const [notSavedValues, setNotSavedValues] = useState({ ...externalValues });\n\n  const task = useMemo(() => {\n    if (!activeTask) return null;\n    const data = { ...activeTask };\n\n    if (readonly) {\n      // preserve parent to differentiate between segment and task\n      let values = { parent: data.parent };\n      baseItems.forEach(({ key, comp }) => {\n        if (comp !== 'links' && comp !== 'resources') {\n          const value = data[key];\n          if (comp === 'date' && value instanceof Date) {\n            values[key] = dateFormat(value);\n          } else if (comp === 'slider' && key === 'progress') {\n            values[key] = `${value}%`;\n          } else {\n            values[key] = value;\n          }\n        }\n      });\n      return values;\n    }\n    return data || null;\n  }, [activeTask, readonly, baseItems, dateFormat]);\n\n  useEffect(() => {\n    setEditorValues(task);\n  }, [task]);\n\n  useEffect(() => {\n    setLinksActions(new Map());\n    setAssignmentsActions(new Map());\n    setSegmentsActions(new Map());\n    setEditorErrors(null);\n    setInProgress(null);\n    setActiveBatch((prev) => prev || defBatch);\n    setNotSavedValues({ ...externalValues });\n  }, [taskId]);\n\n  // items\n\n  const handleExternalChange = useCallback(({ view, event, values }) => {\n    const { id, action, data } = event;\n    if (view === 'links') {\n      setLinksActions((prev) => {\n        const next = new Map(prev);\n        next.set(id, { action, data });\n        return next;\n      });\n    } else if (view === 'resources') {\n      setAssignmentsActions((prev) => {\n        const next = new Map(prev);\n        next.set(id, { action, data });\n        return next;\n      });\n    } else if (view === 'segments') {\n      setSegmentsActions((prev) => {\n        const next = new Map(prev);\n        next.set(id, { action, data });\n        return next;\n      });\n    }\n    setNotSavedValues((prev) => {\n      const next = { ...prev };\n      Object.keys(values).forEach((key) => {\n        next[key] = values[key];\n      });\n      return next;\n    });\n  }, []);\n\n  const onTabChange = useCallback((ev) => {\n    setActiveBatch(ev.value);\n  }, []);\n\n  const normalizeItems = useCallback(\n    function normalizeItems(srcItems, area = 'form') {\n      if (!api || !srcItems || !Array.isArray(srcItems)) return srcItems;\n      return srcItems\n        .filter((b) => {\n          if (!editorValues) return true;\n          return !b.isHidden || !b.isHidden(editorValues, api.getState());\n        })\n        .map((b) => {\n          const item = { ...b };\n          if (item.items && Array.isArray(item.items)) {\n            item.items = normalizeItems(item.items);\n            return item;\n          }\n          if (area === 'form' && !item.batch) {\n            item.batch = defBatch;\n          }\n\n          if (\n            ['links', 'resources', 'segments'].includes(item.key) &&\n            api\n          ) {\n            item.api = api;\n            item.autoSave = autoSave;\n            if (item.key === 'resources') {\n              item.taskAssignments = notSavedValues.taskAssignments;\n            } else if (item.key === 'links') {\n              item.successors = notSavedValues.successors;\n              item.predecessors = notSavedValues.predecessors;\n            } else if (item.key === 'segments') {\n              item.segments = notSavedValues.segments;\n            }\n            item.onExtChange = handleExternalChange;\n          }\n          if (item.id === 'tabs') {\n            item.api = api;\n            item.css = 'wx-gantt-tabs';\n            item.value = activeBatch;\n            item.onChange = item.onChange || onTabChange;\n          }\n\n          if (item.comp === 'slider' && item.key === 'progress') {\n            item.labelTemplate = (value) => `${_(item.label)} ${value}%`;\n          }\n          if (item.text) item.text = _(item.text);\n          if (item.label) item.label = _(item.label);\n          if (item.options) item.options = normalizeItems(item.options);\n\n          if (item.config) item.config = { ...item.config };\n          if (item.config?.placeholder)\n            item.config.placeholder = _(item.config.placeholder);\n\n          if (\n            editorValues &&\n            item.isDisabled &&\n            item.isDisabled(\n              editorValues,\n              api.getState(),\n              api.getTaskCalendar(editorValues),\n            )\n          ) {\n            item.disabled = true;\n          } else delete item.disabled;\n          return item;\n        });\n    },\n    [api, editorValues, autoSave, notSavedValues, activeBatch, _, handleExternalChange, onTabChange],\n  );\n\n  const editorItems = useMemo(() => {\n    const eItems = items.length ? items : baseItems;\n    return normalizeItems(eItems);\n  }, [items, baseItems, normalizeItems]);\n\n  const editorBatches = useMemo(\n    () => new Set(editorItems.map((i) => i.batch)),\n    [editorItems],\n  );\n\n  // Reset activeBatch\n  // (ex. Segments removed when all segments merged/removed)\n  useEffect(() => {\n    if (!editorBatches.has(activeBatch)) setActiveBatch(defBatch);\n  }, [editorBatches, activeBatch]);\n\n  const editorKeys = useMemo(\n    () => editorItems.map((i) => i.key),\n    [editorItems],\n  );\n\n  const normalizeBar = useCallback(\n    (bar, batches, type) => {\n      bar = typeof bar !== 'object' ? {} : { ...bar };\n      if (!bar.items) {\n        bar.items = getEditorButtons({\n          resources,\n          autoSave,\n          splitTasks,\n        });\n      }\n      bar.items = filterEditorButtons(bar.items, (item) => {\n        if (item.id === 'tabs') {\n          item.type = item.type || type;\n          // filter options by batches and hide tabs with one tab\n          item.options = item.options.filter((op) => batches.has(op.id));\n          if (item.options.length < 2) return false;\n        }\n        return true;\n      });\n      bar.items = normalizeItems(bar.items, 'toolbar');\n      if (!bar.layout) {\n        const isColumn = bar.items.some((i) => i.items);\n        bar.layout = isColumn ? 'column' : 'row';\n      }\n      return bar;\n    },\n    [resources, autoSave, splitTasks, normalizeItems],\n  );\n\n  const normalizedTopBar = useMemo(() => {\n    if (!topBar || readonly) return false;\n    return normalizeBar(topBar, editorBatches, 'top');\n  }, [topBar, readonly, normalizeBar, editorBatches]);\n\n  const normalizedBottomBar = useMemo(() => {\n    if (!bottomBar || readonly) return false;\n    return normalizeBar(bottomBar, editorBatches, 'bottom');\n  }, [bottomBar, readonly, normalizeBar, editorBatches]);\n\n  const saveSections = useCallback(() => {\n    for (let [linkId, value] of linksActions) {\n      if (links.byId(linkId)) {\n        const { action, data } = value;\n        api.exec(action, data);\n      }\n    }\n    [assignmentsActions, segmentsActions].forEach((actions) => {\n      for (let [, value] of actions) {\n        const { action, data } = value;\n        api.exec(action, data);\n      }\n    });\n  }, [api, links, linksActions, assignmentsActions, segmentsActions]);\n\n  const deleteTask = useCallback(() => {\n    api.exec('delete-task', { id: taskId });\n  }, [api, taskId]);\n\n  const hide = useCallback(() => {\n    api.exec('show-editor', { id: null });\n  }, [api]);\n\n  const handleAction = useCallback(\n    (ev) => {\n      const { item } = ev;\n      if (item.id === 'delete') {\n        deleteTask();\n      } else if (item.id === 'save') {\n        saveSections();\n      }\n      if (item.comp) hide();\n    },\n    [deleteTask, saveSections, hide],\n  );\n\n  const normalizeTask = useCallback(\n    (t, key, input) => {\n      if (unscheduledTasks && t.type === 'summary') t.unscheduled = false;\n\n      prepareEditTask(t, api.getState(), api.getTaskCalendar(t), key);\n      if (!input) setInProgress(false);\n      return t;\n    },\n    [unscheduledTasks, api],\n  );\n\n  const save = useCallback(\n    (values, changes) => {\n      delete values.links;\n      delete values.data;\n\n      if (\n        editorKeys.indexOf('duration') === -1 ||\n        (values.segments && !values.duration)\n      )\n        delete values.duration;\n\n      const data = {\n        id: taskId,\n        task: values,\n      };\n      if (autoSave && inProgress) data.inProgress = inProgress;\n\n      api.exec('update-task', data);\n\n      // when changes is not empty, Editor calls onSave and onAction({id: \"save\"})\n      if (!autoSave && !changes?.length) saveSections();\n    },\n    [api, taskId, autoSave, inProgress, editorKeys, saveSections],\n  );\n\n  const handleChange = useCallback(\n    (ev) => {\n      let { update, key, input } = ev;\n\n      if (input) setInProgress(true);\n\n      ev.update = normalizeTask({ ...update }, key, input);\n\n      if (!autoSave) setEditorValues(ev.update);\n      else if (!editorErrors && !input) {\n        const item = editorItems.find((i) => i.key === key);\n        const v = update[key];\n        const isValid = !item.validation || item.validation(v);\n        if (isValid && (!item.required || v)) save(ev.update);\n      }\n    },\n    [autoSave, normalizeTask, editorErrors, editorItems, save],\n  );\n\n  const handleSave = useCallback(\n    (ev) => {\n      if (!autoSave) save(ev.values, ev.changes);\n    },\n    [autoSave, save],\n  );\n\n  const handleValidation = useCallback((check) => {\n    // get all errors after onchange action\n    setEditorErrors(check.errors);\n  }, []);\n\n  const defaultHotkeys = useMemo(\n    () =>\n      undo\n        ? {\n            'ctrl+z': (ev) => {\n              ev.preventDefault();\n              api.exec('undo');\n            },\n            'ctrl+y': (ev) => {\n              ev.preventDefault();\n              api.exec('redo');\n            },\n          }\n        : {},\n    [undo, api],\n  );\n\n  return task ? (\n    <Locale>\n      <WxEditor\n        css={`wx-XkvqDXuw wx-gantt-editor ${styleCss} ${css}`}\n        items={editorItems}\n        values={task}\n        topBar={normalizedTopBar}\n        bottomBar={normalizedBottomBar}\n        placement={placement}\n        layout={layout}\n        readonly={readonly}\n        autoSave={autoSave}\n        focus={focus}\n        activeBatch={activeBatch}\n        onAction={handleAction}\n        onSave={handleSave}\n        onValidation={handleValidation}\n        onChange={handleChange}\n        hotkeys={hotkeys && { ...defaultHotkeys, ...hotkeys }}\n      />\n    </Locale>\n  ) : null;\n}\n\nexport default Editor;\n","import { useState, useEffect } from 'react';\nimport { HeaderMenu as HeaderMenuInner } from '@svar-ui/react-grid';\n\nconst HeaderMenu = ({ children, columns = null, api }) => {\n  const [tableAPI, setTableAPI] = useState(null);\n  useEffect(() => {\n    if (!api) return;\n    api.getTable(true).then(setTableAPI);\n  }, [api]);\n\n  return (\n    <HeaderMenuInner api={tableAPI} columns={columns}>\n      {children}\n    </HeaderMenuInner>\n  );\n};\n\nexport default HeaderMenu;\n","import { Avatar } from '@svar-ui/react-core';\nimport './NameCell.css';\n\nfunction NameCell(props) {\n\tconst { row, column } = props;\n\n\tfunction getStyle(row, col) {\n\t\treturn {\n\t\t\tjustifyContent: col.align,\n\t\t\tpaddingLeft: `${(row.$level - 1) * 20}px`,\n\t\t};\n\t}\n\n\tconst Cell = column._cell;\n\n\treturn (\n\t\t<div className=\"wx-content wx-aadwWvd3\" style={getStyle(row, column)}>\n\t\t\t{row.data ? (\n\t\t\t\t<i\n\t\t\t\t\tclassName={`wx-toggle-icon wxi-menu-${row.open ? 'down' : 'right'} wx-aadwWvd3`}\n\t\t\t\t\tdata-action=\"open-resource-row\"\n\t\t\t\t></i>\n\t\t\t) : (\n\t\t\t\t<i className=\"wx-toggle-placeholder wx-aadwWvd3\"></i>\n\t\t\t)}\n\t\t\t<div className=\"wx-name wx-aadwWvd3\">\n\t\t\t\t{Cell ? (\n\t\t\t\t\t<Cell row={row} column={column} />\n\t\t\t\t) : row.role ? (\n\t\t\t\t\t<div className=\"wx-avatar-name wx-aadwWvd3\">\n\t\t\t\t\t\t<Avatar value={row} size={28} />\n\t\t\t\t\t\t<span className=\"wx-aadwWvd3\">{row.name}</span>\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\trow.name\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nexport default NameCell;\n","import { Avatar } from '@svar-ui/react-core';\nimport './NameCellCompact.css';\n\nfunction NameCellCompact(props) {\n\tconst { row, column } = props;\n\n\tconst Cell = column._cell;\n\n\treturn (\n\t\t<div className=\"wx-content wx-compact wx-aacXLb2S\" data-tooltip={row.name}>\n\t\t\t<div className=\"wx-name wx-aacXLb2S\">\n\t\t\t\t{Cell ? (\n\t\t\t\t\t<Cell row={row} column={column} />\n\t\t\t\t) : row.role ? (\n\t\t\t\t\t<div className=\"wx-avatar wx-aacXLb2S\">\n\t\t\t\t\t\t<Avatar value={row} size={20} />\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\trow.name\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nexport default NameCellCompact;\n","import { getValue } from '@svar-ui/grid-store';\nimport { setID } from '@svar-ui/lib-dom';\n\nfunction LoadCell(props) {\n\tconst { row, column } = props;\n\n\treturn (\n\t\t<div className=\"wx-aadMkg5o\" data-resource-id={setID(row.id)}>\n\t\t\t{column.template(getValue(row, column))}\n\t\t</div>\n\t);\n}\n\nexport default LoadCell;\n","import {\n  useState,\n  useEffect,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useContext,\n  useCallback,\n} from 'react';\nimport { locateID } from '@svar-ui/lib-dom';\nimport { getResourceColumns, normalizeResourceColumns } from '@svar-ui/gantt-store';\nimport { locale } from '@svar-ui/lib-dom';\nimport { en } from '@svar-ui/gantt-locales';\nimport { en as coreEn } from '@svar-ui/core-locales';\nimport { getValue } from '@svar-ui/grid-store';\nimport { useStore } from '@svar-ui/lib-react';\nimport { context } from '@svar-ui/react-core';\n\nimport { Grid } from '@svar-ui/react-grid';\nimport TimeScales from '../chart/TimeScale.jsx';\nimport Resizer from '../Resizer.jsx';\nimport NameCell from './NameCell.jsx';\nimport NameCellCompact from './NameCellCompact.jsx';\nimport LoadCell from './LoadCell.jsx';\n\nimport {\n  getFlexBasis,\n  getFitColumns,\n  getFillColumn,\n  getColumnsWidth,\n  getSortMarks,\n  getResourceLoadColumns,\n  getScrollbarWidth,\n} from '../../helpers/grid';\nimport { createZoomWheelHandler } from '../../helpers/zoom';\n\nimport './ResourceLoad.css';\n\nfunction ResourceLoad(props) {\n  const { api, mode = 'grid', template } = props;\n\n  const columns = useMemo(\n    () => props.columns || getResourceColumns(),\n    [props.columns],\n  );\n\n  // detect scrollbar width that may differ in browsers\n  const [scrollbarWidth, setScrollbarWidth] = useState(17);\n  useEffect(() => {\n    const width = getScrollbarWidth();\n    setScrollbarWidth((prev) => (prev === width ? prev : width));\n  }, []);\n\n  const rResources = useStore(api, '_resources');\n  const rScales = useStore(api, '_scales');\n  const rResourceSort = useStore(api, '_resourceSort');\n  const cellHeight = useStore(api, 'cellHeight');\n  const ganttColumns = useStore(api, 'columns');\n  const gridWidth = useStore(api, 'gridWidth');\n  const displayMode = useStore(api, 'displayMode');\n  const headerLength = useStore(api, '_headerLength');\n  const highlightTime = useStore(api, 'highlightTime');\n  const columnsWidth = useStore(api, '_columnsWidth');\n  const gridCollapseThreshold = useStore(api, '_gridCollapseThreshold');\n  const cellBorders = useStore(api, 'cellBorders');\n  const zoom = useStore(api, 'zoom');\n\n  const lFromCtx = useContext(context.i18n);\n  const l = useMemo(() => lFromCtx || locale({ ...en, ...coreEn }), [lFromCtx]);\n  const _ = useMemo(() => l.getGroup('gantt'), [l]);\n\n  const [containerWidth, setContainerWidth] = useState(0);\n  const [gridClientWidth, setGridClientWidth] = useState(0);\n  const [rightContainerHeight, setRightContainerHeight] = useState(0);\n\n  const containerRef = useRef(null);\n  const gridContainerRef = useRef(null);\n  const scaleContainerRef = useRef(null);\n  const scalesDiv = useRef(null);\n  const chartContainerRef = useRef(null);\n\n  const zoomRef = useRef(zoom);\n  zoomRef.current = zoom;\n\n  const leftApiRef = useRef(null);\n  const rightApiRef = useRef(null);\n  const scrollLeftRef = useRef(0);\n  const expectedScrollLeftRef = useRef(0);\n  const isUserScrollRef = useRef(false);\n\n  const [selectedRows, setSelectedRows] = useState([]);\n\n  const finalColumns = useMemo(() => {\n    if (!columns || !columns.length) return [];\n    let cols = normalizeResourceColumns(columns).map((col) => {\n      col = { ...col };\n      const header = col.header;\n      if (typeof header === 'object') {\n        const text = header.text && _(header.text);\n        col.header = { ...header, text };\n      } else col.header = _(header);\n\n      col.align = col.align || 'left';\n      col.editor = false;\n      return col;\n    });\n    const ni = cols.findIndex((c) => c.id === 'name');\n\n    if (ni !== -1) {\n      if (cols[ni].cell) cols[ni]._cell = cols[ni].cell;\n      cols[ni] = {\n        ...cols[ni],\n        header: displayMode === 'chart' ? '' : cols[ni].header,\n        cell: displayMode === 'chart' ? NameCellCompact : NameCell,\n      };\n    }\n\n    if (cols.length > 0) cols[cols.length - 1].resize = false;\n    return cols;\n  }, [columns, _, displayMode]);\n\n  const sortMarks = useMemo(\n    () => getSortMarks(rResources, rResourceSort),\n    [rResources, rResourceSort]\n  );\n\n  const [columnWidth, setColumnWidth] = useState(0);\n\n  useEffect(() => {\n    let width;\n    if (columnsWidth) width = columnsWidth;\n    else if (displayMode === 'chart') width = gridCollapseThreshold || 0;\n    else width = gridWidth;\n    setColumnWidth((prev) => (prev === width ? prev : width));\n  }, [columnsWidth, displayMode, gridCollapseThreshold, gridWidth]);\n\n  const fitColumns = useMemo(\n    () => getFitColumns(finalColumns, displayMode, 'name'),\n    [finalColumns, displayMode]\n  );\n\n  const finalColumnsRef = useRef(finalColumns);\n  useEffect(() => {\n    finalColumnsRef.current = finalColumns;\n  }, [finalColumns]);\n\n  const rightColumns = useMemo(\n    () => getResourceLoadColumns(rScales, LoadCell, template),\n    [rScales, template]\n  );\n\n  const flexBasis = useMemo(\n    () => getFlexBasis(ganttColumns || [], displayMode, gridWidth),\n    [ganttColumns, displayMode, gridWidth]\n  );\n\n  // right grid V-scroll eats one scrollbar width on the right; timescales\n  // must match so the time axis aligns at horizontal-max.\n  const rightHasHScroll = useMemo(\n    () => (rScales?.width ?? 0) > containerWidth - gridClientWidth,\n    [rScales, containerWidth, gridClientWidth]\n  );\n\n  const rightHasVScroll = useMemo(() => {\n    const contentH = rResources?.length * cellHeight;\n    const viewportH =\n      rightContainerHeight - (rightHasHScroll ? scrollbarWidth : 0);\n    return contentH > viewportH;\n  }, [\n    rResources,\n    cellHeight,\n    rightContainerHeight,\n    rightHasHScroll,\n    scrollbarWidth,\n  ]);\n\n  // left grid only overflows once its own X scrollbar appears. If the Y\n  // scrollbar is clipped, that hidden strip also delays the X overflow.\n  const leftHasHScroll = useMemo(\n    () => columnWidth > gridClientWidth + (rightHasVScroll ? scrollbarWidth : 0),\n    [columnWidth, gridClientWidth, rightHasVScroll, scrollbarWidth]\n  );\n\n  const syncHorizontalScroll = useCallback((left) => {\n    expectedScrollLeftRef.current = left;\n\n    rightApiRef.current?.exec('scroll-to', { left });\n    if (scalesDiv.current && Math.abs(scalesDiv.current.scrollLeft - left) > 1)\n      scalesDiv.current.scrollLeft = left;\n  }, []);\n\n  useLayoutEffect(() => {\n    if (!api) return;\n\n    const scrollLeftStore = api.getReactiveState?.().scrollLeft;\n    if (!scrollLeftStore?.subscribe) return;\n\n    const handleScrollLeft = (value) => {\n      const left = value ?? 0;\n      scrollLeftRef.current = left;\n      if (isUserScrollRef.current) {\n        isUserScrollRef.current = false;\n        return;\n      }\n      syncHorizontalScroll(left);\n    };\n\n    const unsubscribe = scrollLeftStore.subscribe(handleScrollLeft);\n    const currentLeft = api.getState?.().scrollLeft;\n    if (currentLeft !== undefined) handleScrollLeft(currentLeft);\n\n    return () => {\n      if (typeof unsubscribe === 'function') unsubscribe();\n      else unsubscribe?.unsubscribe?.();\n    };\n  }, [api, syncHorizontalScroll]);\n\n  // FIXME - temporary hack to provide fresh values to grid's handlers\n  const handlersStateRef = useRef(null);\n  const setHandlersState = () => {\n    handlersStateRef.current = {\n      api,\n      rResourceSort,\n      syncHorizontalScroll,\n    };\n  };\n  setHandlersState();\n  useEffect(() => {\n    setHandlersState();\n  }, [api, rResourceSort, syncHorizontalScroll]);\n\n  // track container/grid sizes (offsetWidth / clientWidth / clientHeight)\n  useEffect(() => {\n    const ro = new ResizeObserver(() => {\n      if (containerRef.current)\n        setContainerWidth(containerRef.current.offsetWidth);\n      if (gridContainerRef.current)\n        setGridClientWidth(gridContainerRef.current.clientWidth);\n      if (scaleContainerRef.current)\n        setRightContainerHeight(scaleContainerRef.current.clientHeight);\n    });\n    if (containerRef.current) ro.observe(containerRef.current);\n    if (gridContainerRef.current) ro.observe(gridContainerRef.current);\n    if (scaleContainerRef.current) ro.observe(scaleContainerRef.current);\n    // initial read\n    if (containerRef.current)\n      setContainerWidth(containerRef.current.offsetWidth);\n    if (gridContainerRef.current)\n      setGridClientWidth(gridContainerRef.current.clientWidth);\n    if (scaleContainerRef.current)\n      setRightContainerHeight(scaleContainerRef.current.clientHeight);\n    return () => ro.disconnect();\n  }, []);\n\n  function onClick(ev) {\n    const action = ev.target.dataset.action;\n    if (action === 'open-resource-row') {\n      ev.preventDefault();\n      const id = locateID(ev);\n      const task = rResources.find((a) => a.id === id);\n      if (task.data) api.exec(action, { id, mode: !task.open });\n    }\n  }\n\n  const initLeft = useCallback((lapi) => {\n    leftApiRef.current = lapi;\n    lapi.on('select-row', (ev) => {\n      setSelectedRows((prev) => (prev[0] === ev.id ? prev : [ev.id]));\n    });\n    lapi.intercept('sort-rows', (ev) => {\n      const { key, add } = ev;\n      const { api, rResourceSort } = handlersStateRef.current;\n      const keySort = rResourceSort\n        ? rResourceSort.find((s) => s.key === key)\n        : null;\n      let order = 'asc';\n      if (keySort) order = !keySort || keySort.order === 'asc' ? 'desc' : 'asc';\n\n      api.exec('sort-resources', {\n        key,\n        order,\n        add,\n        _columns: finalColumnsRef.current,\n      });\n      return false;\n    });\n\n    lapi.intercept('resize-column', (ev) => {\n      ev.flexgrowFallback = getFillColumn(finalColumnsRef.current, ev.id);\n    });\n\n    lapi.on('resize-column', () => {\n      setColumnWidth(getColumnsWidth(lapi.getState().columns));\n    });\n\n    lapi.on('scroll-to', (ev) => {\n      if (ev.top !== undefined && !ev.rSync)\n        rightApiRef.current?.exec('scroll-to', {\n          top: ev.top,\n          rSync: true,\n        });\n    });\n  }, []);\n\n  const initRight = useCallback((rapi) => {\n    rightApiRef.current = rapi;\n    handlersStateRef.current.syncHorizontalScroll(expectedScrollLeftRef.current);\n\n    rapi.on('select-row', (ev) => {\n      setSelectedRows((prev) => (prev[0] === ev.id ? prev : [ev.id]));\n    });\n\n    rapi.on('scroll-to', (ev) => {\n      if (\n        ev.left !== undefined &&\n        !ev.rSync &&\n        Math.abs(ev.left - expectedScrollLeftRef.current) > 1\n      ) {\n        expectedScrollLeftRef.current = ev.left;\n        scrollLeftRef.current = ev.left;\n        isUserScrollRef.current = true;\n        if (\n          scalesDiv.current &&\n          Math.abs(scalesDiv.current.scrollLeft - ev.left) > 1\n        )\n          scalesDiv.current.scrollLeft = ev.left;\n        handlersStateRef.current.api.exec('scroll-chart', { left: ev.left });\n      }\n      if (ev.top !== undefined && !ev.rSync)\n        leftApiRef.current?.exec('scroll-to', {\n          top: ev.top,\n          rSync: true,\n        });\n    });\n  }, []);\n\n  function getCellStyle(row, col) {\n    const value = getValue(row, col);\n    if (value) {\n      return value.percent > 100 ? ' wx-overload' : ' wx-normal';\n    }\n\n    if (col.unit !== 'day' && col.unit !== 'hour') return '';\n\n    const resourceCalendar = api.getResourceCalendar(row);\n    if (resourceCalendar) {\n      const isWorkingDay = resourceCalendar.isWorkingDay(col.date);\n      if (!isWorkingDay) return resourceCalendar.css ?? 'wx-weekend';\n    } else if (highlightTime) return highlightTime(col.date, col.unit);\n\n    return '';\n  }\n\n  const onWheel = useMemo(\n    () =>\n      api\n        ? createZoomWheelHandler(\n            api,\n            () => zoomRef.current,\n            () => chartContainerRef.current,\n          )\n        : null,\n    [api],\n  );\n\n  // attach wheel manually: React's onWheel prop is passive and can't preventDefault\n  useEffect(() => {\n    const node = chartContainerRef.current;\n    if (!node || !onWheel) return;\n    node.addEventListener('wheel', onWheel);\n    return () => node.removeEventListener('wheel', onWheel);\n  }, [onWheel]);\n\n  if (!api) return null;\n\n  return (\n    <div\n      className=\"wx-resource-load wx-aacPnv3E\"\n      style={{ '--wx-scrollbar-width': `${scrollbarWidth}px` }}\n      ref={containerRef}\n      data-menu-ignore=\"true\"\n    >\n      <div className=\"wx-layout wx-aacPnv3E\">\n        {columns && columns.length ? (\n          <>\n            <div\n              className={[\n                'wx-grid-container',\n                'wx-aacPnv3E',\n                rightHasVScroll ? 'wx-y-scroll' : '',\n                rightHasHScroll && !leftHasHScroll ? 'wx-h-scroll-reserve' : '',\n              ]\n                .filter(Boolean)\n                .join(' ')}\n              style={{ flex: `0 0 ${flexBasis}` }}\n              ref={gridContainerRef}\n            >\n              <div className=\"wx-y-bar-clip wx-aacPnv3E\">\n                <div\n                  className=\"wx-resource-grid wx-aacPnv3E\"\n                  onClick={onClick}\n                >\n                  <Grid\n                    init={initLeft}\n                    sizes={{\n                      rowHeight: cellHeight,\n                      headerHeight: rScales ? rScales.height / headerLength : 0,\n                    }}\n                    columnStyle={(col) => `wx-text-${col.align}`}\n                    data={rResources || []}\n                    columns={fitColumns}\n                    sortMarks={sortMarks}\n                    selectedRows={selectedRows}\n                  />\n                </div>\n              </div>\n            </div>\n\n            <Resizer containerWidth={containerWidth} api={api} />\n          </>\n        ) : null}\n\n        <div className=\"wx-chart wx-aacPnv3E\" ref={chartContainerRef}>\n          <div\n            className={[\n              'wx-timescale-viewport',\n              'wx-aacPnv3E',\n              rightHasVScroll ? 'wx-v-scroll-reserve' : '',\n            ]\n              .filter(Boolean)\n              .join(' ')}\n            ref={scalesDiv}\n          >\n            <TimeScales api={api} />\n          </div>\n          {mode === 'grid' ? (\n            <div\n              className=\"wx-grid-scale-container wx-aacPnv3E\"\n              ref={scaleContainerRef}\n            >\n              <Grid\n                init={initRight}\n                columns={rightColumns}\n                data={rResources || []}\n                sizes={{\n                  rowHeight: cellHeight,\n                  headerHeight: 0,\n                }}\n                selectedRows={selectedRows}\n                rowStyle={() =>\n                  cellBorders === 'column' ? 'wx-column-border' : ''\n                }\n                cellStyle={getCellStyle}\n              />\n            </div>\n          ) : null}\n        </div>\n      </div>\n    </div>\n  );\n}\n\nexport default ResourceLoad;\n","import { Tooltip } from '@svar-ui/react-core';\nimport { getID, locateID } from '@svar-ui/lib-dom';\n\nfunction GanttTooltip(props) {\n  const {\n    api,\n    at = 'point',\n    overflow = false,\n    content: Content,\n    resolver,\n    ...restProps\n  } = props;\n\n  function defaultResolver(element, ev) {\n    if (!api) return null;\n\n    // (1) Match against tasks / segments\n    const taskId = getID(element, 'data-task-id');\n    if (taskId) {\n      const task = api.getTask(taskId);\n      if (!task) return null;\n      if (overflow) {\n        const node = element.querySelector('.wx-content');\n        if (node && node.scrollWidth <= node.clientWidth) return null;\n      }\n      const segmentIndex = locateID(ev.target, 'data-segment');\n      if (Content) {\n        return { api, data: { task, segmentIndex } };\n      } else {\n        if (segmentIndex !== null) {\n          return task.segments?.[segmentIndex]?.text ?? '';\n        } else {\n          return task.text ?? '';\n        }\n      }\n    }\n\n    // (2) Match against links\n    const linkId = getID(element, 'data-link-id');\n    if (linkId) {\n      const state = api.getState();\n      const link = state.links.byId(linkId);\n      if (!link) return null;\n      if (Content) {\n        return { api, data: { link } };\n      } else {\n        return null;\n      }\n    }\n\n    // (3) Match against rollups\n    const rollupId = getID(element, 'data-rollup-id');\n    if (rollupId) {\n      const task = api.getTask(rollupId);\n      if (!task) return null;\n      if (Content) {\n        return { api, data: { rollup: task } };\n      } else {\n        return task.text ?? '';\n      }\n    }\n\n    // (4) Match against resources\n    const resourceId = getID(element, 'data-resource-id');\n    if (resourceId) {\n      const resource = api.getResource(resourceId);\n      if (!resource) return null;\n      if (Content) {\n        return {\n          api,\n          data: { resource },\n        };\n      } else {\n        return resource.name ?? '';\n      }\n    }\n\n    // (5) No match, continue\n    return null;\n  }\n\n  return (\n    <Tooltip\n      at={at}\n      content={Content}\n      resolver={resolver || defaultResolver}\n      {...restProps}\n    />\n  );\n}\n\nexport default GanttTooltip;\n","import { Material as CoreMaterial } from '@svar-ui/react-core';\nimport './Material.css';\n\nfunction Material({ fonts = true, children }) {\n  if (children) {\n    return <CoreMaterial fonts={fonts}>{children()}</CoreMaterial>;\n  } else {\n    return <CoreMaterial fonts={fonts} />;\n  }\n}\n\nexport default Material;\n","import { Willow as CoreWillow } from '@svar-ui/react-core';\nimport { Willow as GridWillow } from '@svar-ui/react-grid';\nimport './Willow.css';\n\nfunction Willow({ fonts = true, children }) {\n  return children ? (\n    <CoreWillow fonts={fonts}>\n      <GridWillow>{children}</GridWillow>\n    </CoreWillow>\n  ) : (\n    <>\n      <GridWillow />\n      <CoreWillow fonts={fonts} />\n    </>\n  );\n}\n\nexport default Willow;\n","import { WillowDark as WillowDarkCore } from '@svar-ui/react-core';\nimport { WillowDark as GridWillowDark } from '@svar-ui/react-grid';\nimport './WillowDark.css';\n\nexport default function WillowDark({ fonts = true, children }) {\n  if (children) {\n    return (\n      <WillowDarkCore fonts={fonts}>\n        <GridWillowDark>{children}</GridWillowDark>\n      </WillowDarkCore>\n    );\n  } else {\n    return (\n      <>\n        <GridWillowDark fonts={fonts} />\n        <WillowDarkCore fonts={fonts} />\n      </>\n    );\n  }\n}\n","import Gantt from './components/Gantt.jsx';\nimport Toolbar from './components/Toolbar.jsx';\nimport ContextMenu from './components/ContextMenu.jsx';\nimport Editor from './components/Editor.jsx';\nimport HeaderMenu from './components/grid/HeaderMenu.jsx';\nimport ResourceLoad from './components/resource/ResourceLoad.jsx';\n\nimport Tooltip from './widgets/Tooltip.jsx';\n\nimport Material from './themes/Material.jsx';\nimport Willow from './themes/Willow.jsx';\nimport WillowDark from './themes/WillowDark.jsx';\n\nimport pkg from '../package.json' with { type: 'json' };\n\nexport {\n  defaultEditorItems,\n  defaultToolbarButtons,\n  defaultMenuOptions,\n  defaultColumns,\n  defaultTaskTypes,\n  getDefaultColumns,\n  getResourceColumns,\n  getEditorItems,\n  getToolbarButtons,\n  getEditorButtons,\n  getMenuOptions,\n  registerScaleUnit,\n} from '@svar-ui/gantt-store';\n\nexport { registerEditorItem } from '@svar-ui/react-editor';\n\nexport const version = pkg.version;\n\nexport {\n  Gantt,\n  ContextMenu,\n  HeaderMenu,\n  Toolbar,\n  Tooltip,\n  Editor,\n  ResourceLoad,\n  Material,\n  Willow,\n  WillowDark,\n};\n"],"names":["store","createContext","getOffset","node","relative","ev","box","base","checkSource","getID","SHIFT","reorder","config","source","clone","sid","x","y","detail","touched","touchTimer","down","event","handleTouchstart","locate","handleTouchmove","handleContext","handleTouchend","handleMousedown","handleMousemove","handleMouseup","end","full","move","dx","dy","top","task","up","targetNode","target","tid","line","after","before","GroupCellText","props","row","i18n","useContext","context","_","useMemo","api","storeContext","groupBy","useStore","resources","resourceData","value","id","ungroupLabel","jsx","jsxs","Fragment","Avatar","TextCell","column","getStyle","col","CellComponent","ActionCell","cell","action","icon","disabled","gValue","ResourcesCell","assignmentsVal","assigned","EditorResourcesCell","data","count","setTaskResources","taskId","resourceIds","_assignments","prevResources","a","prev","next","history","rId","assignment","getGridMinHeight","gridHeight","cellHeight","getGridStyle","displayMode","columnWidth","scrollX","getFlexBasis","columns","gridWidth","addCol","c","getScrollX","compactMode","containerWidth","getFitColumns","colId","getFillColumn","ok","max","getColumnsWidth","acc","getSortMarks","tasks","sort","marks","key","order","index","getResourceLoadColumns","scales","LoadCell","template","lowestRow","cells","getLoadColumns","dayMs","stepMs","dayCols","group","unitLoad","v","getScrollbarWidth","div","w","cssTextToStyle","cssText","style","decl","idx","prop","Grid","readonly","onTableAPIChange","setColumnWidth","useState","tableAPI","setTableAPI","scrollTopVal","cellHeightVal","focusTask","selectedVal","areaVal","rTasksVal","scalesVal","headerLengthVal","columnsVal","sortVal","durationUnitVal","splitTasksVal","filterValuesVal","groupByVal","gridWidthVal","displayModeVal","compactModeVal","dragTask","setDragTask","execAction","useCallback","onClick","e","locateID","tableRef","useRef","tableContainerRef","gridClientWidth","setGridClientWidth","gridClientHeight","setGridClientHeight","useEffect","update","ro","allTasks","t","allTasksRef","lastDetailRef","reorderTasks","inProgress","mode","targetIndex","cols","header","ti","ai","ri","resCol","editor","actionCol","useLayoutEffect","getColumnStyle","scrollDelta","headerHeight","flexBasis","bodyOffset","tableStyle","css","sel","o","fitColumns","onDblClick","sortMarks","filters","pendingFocusRef","focusCell","startReorder","endReorder","moveReorder","groupByRef","handleHotkey","isInput","handlersStateRef","setHandlersState","init","tapi","add","keySort","s","prepareEditTask","WxGrid","CellGrid","cellWidth","cellBorders","nodeRef","color","setColor","border","grid","Links","onSelectLink","selectedLink","links","criticalPath","selectedLineRef","onClickOutside","handler","link","className","setID","BarSegments","type","segmentStyle","i","getSegProgress","segmentIndex","progress","segments","duration","result","seg","Rollups","rollup","parent","Bars","TaskTemplate","rTasksValue","rTasksCounter","useStoreWithCounter","rLinksValue","rLinksCounter","areaValue","scalesValue","taskTypesValue","baselinesValue","selectedValue","rollups","rRollups","focusTaskStore","tree","schedule","splitTasks","summary","slack","start","lengthUnitWidth","hasDuplicatedIds","ignoreNextClickRef","linkFrom","setLinkFrom","taskMove","setTaskMove","progressFromRef","selectedLinkId","setSelectedLinkId","setTouched","touchTimerRef","totalWidth","setTotalWidth","containerRef","hasFocus","el","focused","entries","startDrag","endDrag","getMoveMode","segmentNode","left","width","p","delta","point","clientX","newTaskMove","segNode","extendDragOptions","mousedown","touchstart","marker","l","segment","diff","minWidth","isSegmentMoveAllowed","nextTaskMove","taskNode","barNode","mousemove","touchmove","mouseup","touchend","types","getLinkType","fromStart","toStart","alreadyLinked","removeLinkMarker","taskStyle","baselineStyle","slackStyle","contextmenu","taskTypeIds","taskTypeCss","forward","isTaskCritical","isLinkMarkerVisible","summaryIds","linkFromSummaryIds","barClass","leftLinkClass","rightLinkClass","Button","mapRow","xFrom","xEnd","from","TimeScale","xArea","highlightTime","renderedRows","rows","lastIndex","r","rowIdx","cellIdx","extraClass","MAX_ZOOM_RATE","clamp","min","createZoomWheelHandler","getZoom","getContainer","pending","lastWheelTime","getZoomFactor","evDelta","SENSITIVITY","now","dt","normalized","ratio","offset","renderMetrics","useRenderTime","label","startTime","renderCount","rafRef","enabled","metric","Chart","fullWidth","fullHeight","taskTemplate","selected","selectedCounter","rScrollTop","rScrollLeft","rTasks","area","zoom","calendars","markers","chartHeight","setChartHeight","chartRef","expectedScroll","isUserScrollRef","extraRows","selectStyle","obj","chartGridHeight","onScroll","dataRequest","num","pos","zoomRef","onWheel","getHoliday","holidays","timelineCells","visibleTasks","getRowCalendars","calendar","groupValue","resource","rowHighlights","globalCalendar","rowCalendars","cellIndex","nonWorkingCalendars","cal","isRowWorkingDay","isGlobalHoliday","cellConfig","cleanup","hotkeys","TimeScales","holiday","Resizer","position","size","dir","onMove","rightThreshold","gridCollapseThreshold","getBox","name","startRef","posRef","timeoutRef","gridWidthRef","displayModeRef","compactModeRef","gridCollapseThresholdRef","getEventPos","cursor","newPos","nextDisplay","handleExpand","direction","handleExpandLeft","handleExpandRight","b","rootClassName","Layout","onGanttWidthChange","rScales","rCellHeight","rColumns","undo","columnsWidth","ganttWidth","setGanttWidth","useWritableProp","ganttHeight","setGanttHeight","innerWidth","setInnerWidth","scrollSize","scrollHeight","latestLayout","chartResizeHandler","gw","cw","gh","sh","ss","ganttDivRef","pseudoRowsRef","expectedScrollTop","ganttDiv","pseudoRows","flushSync","layoutRef","getUnitFormats","normalizeFormatter","calendarLocale","dateToString","prepareScales","format","scale","prepareFormats","formats","unit","prepareColumns","prepareZoom","level","camelize","part","defaultScales","EMPTY_ARRAY","DEFAULT_SCHEDULE","ROLLUPS_CLOSEST","COMPACT_WIDTH","Gantt","forwardRef","taskTypes","defaultTaskTypes","activeTask","assignments","lengthUnit","durationUnit","scaleHeight","baselines","autoScale","unscheduledTasks","projectStart","projectEnd","wbs","restProps","ref","restPropsRef","dataStore","DataStore","writable","words","coreEn","en","i18nCtx","locale","lCalendar","defaultGridColumns","getDefaultColumns","resolvedGridWidth","getDefaultGridWidth","normalizedConfig","normalizeZoom","firstInRoute","lastInRouteRef","EventBusRouter","tableAPIRef","setCompactMode","waitRender","res","storeApi","useImperativeHandle","rollupsConfig","storeConfig","initOnceRef","StoreContext","Toolbar","items","i18nLocal","_selected","useStoreLater","historyActions","finalItems","fullButtons","getToolbarButtons","item","isHandledAction","it","handleAction","buttons","finalButtons","button","nextButton","WxToolbar","cloneMenuItems","op","copy","ContextMenu","optionsInit","resolver","filter","at","children","menuRef","activeIdRef","setActiveTask","menuOptions","setMenuOptions","taskTypesVal","selectedTasksVal","summaryVal","fullOptions","getMenuOptions","customOptions","localizedOptions","applyLocaleFn","opts","buildOptions","tasksArg","setDisabled","itemResolver","effectiveTasks","menuAction","filterMenu","onContextMenu","content","WxContextMenu","Provider","GridSection","onAction","onEdit","sizes","onInit","onActionRef","onEditRef","onInitRef","tApi","LinkTypeCell","autoSave","onExtChange","predecessors","successors","batch","_activeTask","linksCounter","list","lagEditorHandler","isLagHidden","getColumns","getLinksData","il","ol","inLinks","lag","outLinks","linksData","setLinksData","onDeleteAction","isMessage","wrapperClassName","DateTimePicker","time","onchange","onChange","onChangeHandler","handleDateChange","current","DatePicker","TimePicker","ResourcesEditorCell","Resources","taskAssignments","gridApi","setGridApi","newRowId","setNewRowId","taskResources","allOptions","filteredOptions","getActionData","evData","deleteAssignment","addAssignment","getRowOptions","updateAssignment","assignmentData","newRowIdRef","addingDisabled","pendingRef","onAddClick","tempID","addRow","Segments","dateFormat","i18nData","f","segmentsState","setSegmentsState","getSegmentsData","deleteSegment","registerEditorItem","RichSelect","TwoState","Slider","Counter","Checkbox","registerToolbarItem","Tabs","defBatch","externalValues","Editor","layout","placement","bottomBar","topBar","focus","lFromCtx","activeBatch","setActiveBatch","styleCss","baseItems","getEditorItems","linksActions","setLinksActions","assignmentsActions","setAssignmentsActions","segmentsActions","setSegmentsActions","setInProgress","editorValues","setEditorValues","editorErrors","setEditorErrors","notSavedValues","setNotSavedValues","values","comp","handleExternalChange","view","onTabChange","normalizeItems","srcItems","editorItems","eItems","editorBatches","editorKeys","normalizeBar","bar","batches","getEditorButtons","filterEditorButtons","isColumn","normalizedTopBar","normalizedBottomBar","saveSections","linkId","actions","deleteTask","hide","normalizeTask","input","save","changes","handleChange","handleSave","handleValidation","check","defaultHotkeys","Locale","WxEditor","HeaderMenu","HeaderMenuInner","NameCell","Cell","NameCellCompact","getValue","ResourceLoad","getResourceColumns","scrollbarWidth","setScrollbarWidth","rResources","rResourceSort","ganttColumns","headerLength","setContainerWidth","rightContainerHeight","setRightContainerHeight","gridContainerRef","scaleContainerRef","scalesDiv","chartContainerRef","leftApiRef","rightApiRef","scrollLeftRef","expectedScrollLeftRef","selectedRows","setSelectedRows","finalColumns","normalizeResourceColumns","text","ni","finalColumnsRef","rightColumns","rightHasHScroll","rightHasVScroll","contentH","viewportH","leftHasHScroll","syncHorizontalScroll","scrollLeftStore","handleScrollLeft","unsubscribe","currentLeft","initLeft","lapi","initRight","rapi","getCellStyle","resourceCalendar","GanttTooltip","overflow","Content","defaultResolver","element","rollupId","resourceId","Tooltip","Material","fonts","CoreMaterial","Willow","CoreWillow","GridWillow","WillowDark","WillowDarkCore","GridWillowDark","version","pkg"],"mappings":"4jBAEMA,GAAQC,EAAAA,cAAc,IAAI,ECAhC,SAASC,GAAUC,EAAMC,EAAUC,EAAI,CACrC,MAAMC,EAAMH,EAAK,sBAAqB,EAChCI,EAAOH,EAAS,cAAc,UAAU,EAAE,sBAAqB,EAErE,MAAO,CACL,IAAKE,EAAI,IAAMC,EAAK,IACpB,KAAMD,EAAI,KAAOC,EAAK,KACtB,GAAID,EAAI,OAASD,EAAG,QACpB,GAAIA,EAAG,QAAUC,EAAI,GACzB,CACA,CAEA,SAASE,GAAYL,EAAM,CACzB,OAAOA,GAAQM,EAAAA,MAAMN,EAAM,iBAAiB,CAC9C,CAEA,MAAMO,GAAQ,EAEP,SAASC,GAAQR,EAAMS,EAAQ,CACpC,IAAIC,EAAQC,EAAOC,EACfC,EAAGC,EAAGV,EAAMW,EACZC,EAASC,EAEb,SAASC,EAAKC,EAAO,CACnBN,EAAIM,EAAM,QACVL,EAAIK,EAAM,QACVf,EAAO,CACL,GAAGL,GAAUW,EAAQV,EAAMmB,CAAK,EAChC,EAAGV,EAAO,QAAQG,CAAG,EAAE,EAC7B,EAEI,SAAS,KAAK,MAAM,WAAa,MACnC,CAEA,SAASQ,EAAiBD,EAAO,CAC3BV,EAAO,iBACXC,EAASW,EAAAA,OAAOF,CAAK,EAChBd,GAAYK,CAAM,IAEvBE,EAAMN,EAAAA,MAAMI,CAAM,EAElBO,EAAa,WAAW,IAAM,CAC5BD,EAAU,GACNP,GAAUA,EAAO,YAAYA,EAAO,WAAU,EAClDS,EAAKC,EAAM,QAAQ,CAAC,CAAC,CACvB,EAAG,GAAG,EAENnB,EAAK,iBAAiB,YAAasB,EAAe,EAClDtB,EAAK,iBAAiB,cAAeuB,CAAa,EAClD,OAAO,iBAAiB,WAAYC,CAAc,GACpD,CAEA,SAASD,EAAcJ,EAAO,CAC5B,GAAIH,GAAWC,EACb,OAAAE,EAAM,eAAc,EACb,EAEX,CAEA,SAASM,EAAgBN,EAAO,CAC1BV,EAAO,aAAU,GAAQU,EAAM,QAAU,IAE7CT,EAASW,EAAAA,OAAOF,CAAK,EAChBd,GAAYK,CAAM,IAEvBE,EAAMN,EAAAA,MAAMI,CAAM,EAElBV,EAAK,iBAAiB,YAAa0B,CAAe,EAClD,OAAO,iBAAiB,UAAWC,CAAa,EAEhDT,EAAKC,CAAK,GACZ,CAEA,SAASS,EAAIC,EAAM,CACjB7B,EAAK,oBAAoB,YAAa0B,CAAe,EACrD1B,EAAK,oBAAoB,YAAasB,EAAe,EACrD,SAAS,KAAK,oBAAoB,UAAWK,CAAa,EAC1D,SAAS,KAAK,oBAAoB,WAAYH,CAAc,EAC5D,SAAS,KAAK,MAAM,WAAa,GAE7BK,IACF7B,EAAK,oBAAoB,YAAayB,CAAe,EACrDzB,EAAK,oBAAoB,aAAcoB,CAAgB,EAE3D,CAEA,SAASU,EAAKX,EAAO,CACnB,MAAMY,EAAKZ,EAAM,QAAUN,EACrBmB,GAAKb,EAAM,QAAUL,EAC3B,GAAI,CAACH,EAAO,CAEV,GADI,KAAK,IAAIoB,CAAE,EAAIxB,IAAS,KAAK,IAAIyB,EAAE,EAAIzB,IACvCE,GAAUA,EAAO,OACfA,EAAO,MAAM,CAAE,GAAIG,EAAK,EAAGO,EAAO,IAAM,GAAO,OAGrDR,EAAQD,EAAO,UAAU,EAAI,EAC7BC,EAAM,MAAM,cAAgB,OAC5BA,EAAM,UAAU,IAAI,iBAAiB,EACrCA,EAAM,MAAM,SAAW,WACvBA,EAAM,MAAM,KAAOP,EAAK,KAAO,KAC/BO,EAAM,MAAM,IAAMP,EAAK,IAAM,KAE7BM,EAAO,MAAM,WAAa,SAC1BA,EAAO,WAAW,aAAaC,EAAOD,CAAM,CAC9C,CAEA,GAAIC,EAAO,CACT,MAAMsB,EAAM,KAAK,MAAM,KAAK,IAAI,EAAG7B,EAAK,IAAM4B,EAAE,CAAC,EAEjD,GAAIvB,GAAUA,EAAO,MACfA,EAAO,KAAK,CAAE,GAAIG,EAAK,IAAAqB,EAAK,OAAAlB,EAAQ,IAAM,GAAO,OAGvD,MAAMmB,EAAOzB,EAAO,QAAQG,CAAG,EACzBE,EAAIoB,EAAK,GAEf,GAAI,CAAC9B,EAAK,OAASA,EAAK,IAAMU,EAAG,OAAOqB,EAAE,EAE1C/B,EAAK,MAAQ,GACbA,EAAK,EAAI8B,EAAK,GAAK,EACnBvB,EAAM,MAAM,IAAMsB,EAAM,KAExB,MAAMG,EAAa,SAAS,iBAC1BjB,EAAM,QACNA,EAAM,OACd,EACYkB,EAAShB,EAAAA,OAAOe,CAAU,EAEhC,GAAIC,GAAUA,IAAW3B,EAAQ,CAC/B,MAAM4B,EAAMhC,EAAAA,MAAM+B,CAAM,EAClBlC,EAAMkC,EAAO,sBAAqB,EAClCE,EAAOpC,EAAI,IAAMA,EAAI,OAAS,EAE9BqC,EACJrB,EAAM,QAAUf,EAAK,GAAKmC,GAC1BF,EAAO,qBAAuB3B,EAC1B+B,EACJtB,EAAM,QAAUf,EAAK,GAAKmC,GAC1BF,EAAO,yBAA2B3B,EAEhCK,GAAQ,QAAUuB,GAAOvB,GAAQ,SAAWuB,EAE9CvB,EAAS,KACAyB,EAETzB,EAAS,CAAE,GAAIH,EAAK,MAAO0B,CAAG,EACrBG,IAET1B,EAAS,CAAE,GAAIH,EAAK,OAAQ0B,CAAG,EAEnC,CACF,CACF,CAEA,SAASZ,EAAgBP,EAAO,CAC9BW,EAAKX,CAAK,CACZ,CAEA,SAASG,GAAgBH,EAAO,CAC1BH,GACFG,EAAM,eAAc,EACpBW,EAAKX,EAAM,QAAQ,CAAC,CAAC,GACZF,IACT,aAAaA,CAAU,EACvBA,EAAa,KAEjB,CAEA,SAASO,GAAiB,CACxBR,EAAU,KACNC,IACF,aAAaA,CAAU,EACvBA,EAAa,MAEfkB,EAAE,CACJ,CAEA,SAASR,GAAgB,CACvBQ,EAAE,CACJ,CAEA,SAASA,GAAK,CACRzB,IACFA,EAAO,MAAM,WAAa,IAExBC,IACFA,EAAM,WAAW,YAAYA,CAAK,EAC9BF,GAAUA,EAAO,KAAKA,EAAO,IAAI,CAAE,GAAIG,EAAK,IAAKR,EAAK,GAAG,CAAE,GAGjEQ,EAAMF,EAASC,EAAQP,EAAOW,EAAS,KACvCa,EAAG,CACL,CAEA,OAAI5B,EAAK,MAAM,WAAa,aAAYA,EAAK,MAAM,SAAW,YAE9DA,EAAK,iBAAiB,YAAayB,CAAe,EAClDzB,EAAK,iBAAiB,aAAcoB,CAAgB,EAE7C,CACL,SAAU,CACRQ,EAAI,EAAI,CACV,CACJ,CACA,CCxMA,SAASc,GAAcC,EAAO,CAC7B,KAAM,CAAE,IAAAC,GAAQD,EAEVE,EAAOC,EAAAA,WAAWC,GAAAA,QAAQ,IAAI,EAC9BC,EAAIC,EAAAA,QAAQ,IAAMJ,EAAK,SAAS,OAAO,EAAG,CAACA,CAAI,CAAC,EAEhDK,EAAMJ,EAAAA,WAAWK,EAAY,EAC7BC,EAAUC,EAAAA,SAASH,EAAK,SAAS,EACjCI,EAAYD,EAAAA,SAASH,EAAK,WAAW,EAErCK,EAAeN,EAAAA,QAAQ,IAAM,CAClC,GAAIG,GAAS,QAAU,WAAY,CAClC,IAAII,EAAQZ,EAAI,YAChB,OAAK,MAAM,QAAQY,CAAK,IAAGA,EAAQ,CAACA,CAAK,GAClCA,EAAM,IAAIC,GAAMH,EAAU,KAAKG,CAAE,CAAC,EAAE,OAAO,OAAO,CAC1D,CACA,OAAO,IACR,EAAG,CAACL,EAASE,EAAWV,CAAG,CAAC,EAEtBc,EAAeT,EAAAA,QACpB,IAAOG,GAAS,QAAU,WAAaJ,EAAE,YAAY,EAAIA,EAAE,WAAW,EACtE,CAACI,EAASJ,CAAC,CAAA,EAGZ,OACCW,EAAAA,IAAC,MAAA,CAAI,UAAU,4BACb,SAAAf,EAAI,cAAgB,aACpBc,EACGH,GAAc,OACjBK,EAAAA,KAAAC,EAAAA,SAAA,CACC,SAAA,CAAAF,EAAAA,IAACG,GAAAA,OAAA,CAAO,MAAOP,EAAc,KAAM,GAAI,EACtCA,EAAa,SAAW,GACxBI,EAAAA,IAAC,OAAA,CAAK,UAAU,sBACd,SAAAJ,EAAa,CAAC,EAAE,IAAA,CAClB,CAAA,EAEF,EAEAX,EAAI,KAEN,CAEF,CC7CA,SAASmB,GAAS,CAAE,IAAAnB,EAAK,OAAAoB,GAAU,CACjC,SAASC,EAASrB,EAAKsB,EAAK,CAC1B,MAAO,CACL,eAAgBA,EAAI,MACpB,YAAa,IAAItB,EAAI,OAAS,GAAK,EAAE,IAAA,CAEzC,CAEA,MAAMuB,EAAgBH,GAAUA,EAAO,MAEvC,OACEJ,OAAC,OAAI,UAAU,yBAAyB,MAAOK,EAASrB,EAAKoB,CAAM,EAChE,SAAA,CAAA,CAACpB,EAAI,SAAWA,EAAI,MAAM,QAAUA,EAAI,MACvCe,EAAAA,IAAC,IAAA,CACC,UAAW,uCAAuCf,EAAI,KAAO,OAAS,OAAO,GAC7E,cAAY,WAAA,CAAA,EAGde,EAAAA,IAAC,IAAA,CAAE,UAAU,mCAAA,CAAoC,QAElD,MAAA,CAAI,UAAU,sBACZ,SAAAQ,QACEA,EAAA,CAAc,IAAAvB,EAAU,OAAAoB,CAAA,CAAgB,EACvCpB,EAAI,OACNe,MAACjB,IAAc,IAAAE,CAAA,CAAU,EAEzBA,EAAI,IAAA,CAER,CAAA,EACF,CAEJ,CC/BA,SAASwB,GAAW,CAAE,OAAAJ,EAAQ,IAAApB,EAAK,KAAAyB,GAAQ,CACzC,MAAMC,EAASrB,EAAAA,QAAQ,IAAMe,EAAO,GAAI,CAACA,GAAQ,EAAE,CAAC,EAE9CO,EAAOtB,EAAAA,QAAQ,IACfqB,EAAO,SAAS,MAAM,EAAU,WAChCA,EAAO,SAAS,KAAK,EAAU,WAC/BA,EAAO,SAAS,QAAQ,EAAU,aAC/B,GACN,CAACA,CAAM,CAAC,EAELE,EAAWvB,EAAAA,QAAQ,IAAM,CAC7B,GAAI,CAACqB,EAAO,SAAS,KAAK,EAAG,MAAO,GACpC,MAAMG,EAAS7B,EAAI,YACnB,MACG,CAACA,EAAI,QAAU,OAAO6B,EAAW,KACjC7B,EAAI,QAAU,OAAO6B,EAAW,GAErC,EAAG,CAACH,EAAQ1B,CAAG,CAAC,EAEhB,OAAOyB,GAAQE,EACbZ,EAAAA,IAAC,MAAA,CAAI,MAAO,CAAE,UAAWK,EAAO,KAAA,EAC9B,SAAAL,EAAAA,IAAC,IAAA,CACC,UAAW,8BAA8BY,CAAI,GAC3CC,EAAW,eAAiB,EAC9B,GACA,cAAa,CAACA,GAAYF,CAAA,CAAA,EAE9B,EACE,IACN,CC1BA,SAASI,GAAc,CAAE,IAAA9B,GAAO,CAC9B,MAAMM,EAAMJ,EAAAA,WAAWK,EAAY,EAC7BwB,EAAiBtB,EAAAA,SAASH,EAAK,aAAa,EAE5C0B,EAAW3B,EAAAA,QACf,IAAMC,EAAI,iBAAiBN,EAAI,KAAOA,EAAI,EAAE,EAC5C,CAACM,EAAKyB,EAAgB/B,CAAG,CAAA,EAG3B,OACEe,EAAAA,IAAC,MAAA,CAAI,UAAU,wBACb,SAAAA,EAAAA,IAACG,GAAAA,QAAO,MAAOc,EAAU,KAAM,EAAA,CAAI,CAAA,CACrC,CAEJ,CCfA,SAASC,GAAoBlC,EAAO,CACnC,KAAM,CAAE,KAAAmC,GAASnC,EACXoC,EAAQ9B,EAAAA,QAAQ,IAAM6B,EAAK,OAAQ,CAACA,CAAI,CAAC,EAE/C,OAAI,MAAM,QAAQA,CAAI,EAEpBnB,EAAAA,IAAC,MAAA,CAAI,UAAU,4BACb,SAAAoB,EAAQpB,EAAAA,IAACG,GAAAA,OAAA,CAAO,MAAOgB,EAAM,KAAM,EAAA,CAAI,EAAK,KAC9C,EAKDlB,EAAAA,KAAC,MAAA,CAAI,UAAU,iCACd,SAAA,CAAAD,EAAAA,IAAC,MAAA,CAAI,UAAU,cACd,SAAAA,EAAAA,IAACG,WAAO,MAAOgB,EAAM,KAAM,EAAA,CAAI,CAAA,CAChC,EACAnB,EAAAA,IAAC,MAAA,CAAI,UAAU,sBAAuB,WAAK,IAAA,CAAK,CAAA,EACjD,CAEF,CCzBO,SAASqB,GAAiBC,EAAQC,EAAahC,EAAK,CACzD,KAAM,CAAE,aAAAiC,CAAY,EAAKjC,EAAI,SAAQ,EAC/B0B,EAAWO,EAAa,OAAOF,CAAM,EACrCG,EAAgBR,GAAU,IAAKS,GAAMA,EAAE,QAAQ,EAC/CC,EAAO,IAAI,IAAIF,GAAiB,CAAA,CAAE,EAClCG,EAAO,IAAI,IAAIL,GAAe,CAAA,CAAE,EAEhCM,EAAUtC,EAAI,WAAU,EAC1BsC,GAASA,EAAQ,WAAU,EAC/B,UAAWC,KAAOH,EAChB,GAAI,CAACC,EAAK,IAAIE,CAAG,EAAG,CAClB,MAAMC,EAAad,EAAS,KAAMS,GAAMA,EAAE,WAAaI,CAAG,EAC1DvC,EAAI,KAAK,oBAAqB,CAAE,GAAIwC,EAAW,GAAI,CACrD,CAEF,UAAWD,KAAOF,EACXD,EAAK,IAAIG,CAAG,GACfvC,EAAI,KAAK,iBAAkB,CACzB,WAAY,CACV,SAAUuC,EACV,KAAMR,CAChB,CACA,CAAO,EAGDO,GAASA,EAAQ,SAAQ,CAC/B,CC1BO,SAASG,GAAiBC,EAAYC,EAAY,CACvD,MAAO,cAAcD,EAAaC,EAAa,CAAC,KAClD,CAEO,SAASC,GAAaC,EAAaC,EAAaC,EAAS,CAC9D,OAAOA,GAAWF,IAAgB,MAC9B,SAASC,CAAW,MACpBD,IAAgB,OACdE,EACE,SAASD,CAAW,MACpB,cACF,EACR,CAEO,SAASE,GAAaC,EAASJ,EAAaK,EAAW,CAC5D,MAAMC,EAASF,EAAQ,KAAMG,GAAMA,EAAE,KAAO,UAAU,EACtD,OAAOP,IAAgB,MACnB,GAAGK,CAAS,KACZL,IAAgB,OACd,mBACAM,EACE,GAAGA,EAAO,KAAK,KACf,GACV,CAEO,SAASE,GACdC,EACAT,EACAC,EACAS,EACAL,EACA,CACA,MAAO,CAACI,GAAeT,IAAgB,OACnCC,EAAcI,EACdJ,EAAcS,CACpB,CAEO,SAASC,GAAcP,EAASJ,EAAaY,EAAQ,WAAY,CACtE,OAAOZ,IAAgB,QACnB,CACE,CACE,GAAGI,EAAQ,OAAQG,GAAMA,EAAE,KAAOK,CAAK,EAAE,CAAC,EAC1C,OAAQ,EAClB,CACA,EACMR,CACN,CAEO,SAASS,GAAcT,EAAS1C,EAAI,CACzC,MAAMoD,EAAMP,GAAMA,EAAE,KAAO,YAAcA,EAAE,KAAO7C,GAAM,CAAC6C,EAAE,OAC3D,OAAOH,EACJ,OAAOU,CAAE,EACT,OAAO,CAACC,EAAKR,IAAO,CAACQ,GAAOR,EAAE,MAAQQ,EAAI,MAAQR,EAAIQ,EAAM,IAAI,GAAG,EACxE,CAEO,SAASC,GAAgBZ,EAAS,CACvC,OAAOA,EAAQ,OAAO,CAACa,EAAKV,IAAMU,GAAOV,EAAE,OAAS,EAAIA,EAAE,OAAQ,CAAC,CACrE,CAEO,SAASW,GAAaC,EAAOC,EAAM,CACxC,GAAID,GAASC,GAAM,OAAQ,CACzB,MAAMC,EAAQ,CAAA,EACd,OAAAD,EAAK,QAAQ,CAAC,CAAE,IAAAE,EAAK,MAAAC,CAAK,EAAIC,IAAU,CACtCH,EAAMC,CAAG,EAAI,CACX,MAAAC,EACA,GAAIH,EAAK,OAAS,GAAK,CAAE,MAAAI,CAAK,CACtC,CACI,CAAC,EACMH,CACT,CACA,MAAO,CAAA,CACT,CAEO,SAASI,GAAuBC,EAAQC,EAAUC,EAAU,CACjE,GAAI,CAACF,EAAQ,MAAO,CAAA,EACpB,MAAMG,EAAYH,EAAO,KAAKA,EAAO,KAAK,OAAS,CAAC,EAC9C,CAAE,MAAAI,CAAK,EAAKD,EAGlB,GAFaH,EAAO,UAEP,MAAO,OAAOK,GAAeD,EAAOH,EAAUC,CAAQ,EAEnE,MAAMI,EAAQ,KAAU,GAAK,IACvBC,EAASH,EAAM,QAChBA,EAAM,OAAS,EAAIA,EAAM,CAAC,EAAE,KAAK,QAAO,EAAKJ,EAAO,IAAI,QAAO,GAChEI,EAAM,CAAC,EAAE,KAAK,QAAO,EACrB,EAGJ,GAFqBG,GAAUA,EAASD,EAEtB,CAChB,MAAME,EAAU,CAAA,EAChB,IAAIC,EAAQ,KACZ,OAAAL,EAAM,QAASxD,GAAS,EAClB,CAAC6D,GAASA,EAAM,MAAQ7D,EAAK,OAC/B6D,EAAQ,CACN,GAAI7D,EAAK,IACT,IAAKA,EAAK,IACV,MAAO,EACP,KAAMA,EAAK,KACX,KAAMA,EAAK,IACrB,EACQ4D,EAAQ,KAAKC,CAAK,GAEpBA,EAAM,OAAS7D,EAAK,KACtB,CAAC,EAEMyD,GAAeG,EAASP,EAAUC,CAAQ,CACnD,KAAO,QAAOG,GAAeD,EAAOH,EAAUC,EAAU,EAAI,CAC9D,CAEA,SAASG,GAAeD,EAAOH,EAAUC,EAAUQ,EAAU,CAC3D,OAAON,EAAM,IAAKxD,IAAU,CAC1B,GAAIA,EAAK,IACT,MAAOA,EAAK,MACZ,KAAMA,EAAK,KACX,KAAMA,EAAK,KACX,OAASzB,GACPuF,EAAWvF,EAAI,YAAYyB,EAAK,GAAG,EAAIzB,EAAI,QAAQyB,EAAK,GAAG,EAC7D,SAAW+D,GACJA,EACET,EAAWA,EAASS,CAAC,EAAI,GAAGA,EAAE,KAAK,IAD3B,GAGjB,KAAMV,CACV,EAAI,CACJ,CAEO,SAASW,IAAoB,CAClC,MAAMC,EAAM,SAAS,cAAc,KAAK,EACxCA,EAAI,MAAM,QACR,oGACF,SAAS,KAAK,YAAYA,CAAG,EAC7B,MAAMC,EAAID,EAAI,YAAcA,EAAI,YAChC,gBAAS,KAAK,YAAYA,CAAG,EACtBC,CACT,CCpGA,SAASC,GAAeC,EAAS,CAC/B,MAAMC,EAAQ,CAAA,EACd,OAAAD,EAAQ,MAAM,GAAG,EAAE,QAASE,GAAS,CACnC,MAAMC,EAAMD,EAAK,QAAQ,GAAG,EAC5B,GAAIC,IAAQ,GAAI,OAChB,MAAMC,EAAOF,EAAK,MAAM,EAAGC,CAAG,EAAE,KAAA,EAC1BpF,EAAQmF,EAAK,MAAMC,EAAM,CAAC,EAAE,KAAA,EAClC,GAAI,CAACC,EAAM,OACX,MAAMxB,EAAMwB,EAAK,WAAW,IAAI,EAC5BA,EACAA,EAAK,QAAQ,YAAa,CAAC7F,EAAGsD,IAAMA,EAAE,aAAa,EACvDoC,EAAMrB,CAAG,EAAI7D,CACf,CAAC,EACMkF,CACT,CAEA,SAAwBI,GAAKnG,EAAO,CAClC,KAAM,CAAE,SAAAoG,EAAU,iBAAAC,CAAA,EAAqBrG,EACjC,CAACqD,EAAaiD,CAAc,EAAIC,EAAAA,SAAS,CAAC,EAC1C,CAACC,EAAUC,CAAW,EAAIF,WAAA,EAE1BrG,EAAOC,EAAAA,WAAWC,GAAAA,QAAQ,IAAI,EAC9BC,EAAIC,EAAAA,QAAQ,IAAMJ,EAAK,SAAS,OAAO,EAAG,CAACA,CAAI,CAAC,EAChDK,EAAMJ,EAAAA,WAAWK,EAAY,EAE7BkG,EAAehG,EAAAA,SAASH,EAAK,WAAW,EACxCoG,EAAgBjG,EAAAA,SAASH,EAAK,YAAY,EAC1CqG,EAAYlG,EAAAA,SAASH,EAAK,WAAW,EACrCsG,EAAcnG,EAAAA,SAASH,EAAK,WAAW,EACvCuG,EAAUpG,EAAAA,SAASH,EAAK,MAAM,EAC9BwG,EAAYrG,EAAAA,SAASH,EAAK,QAAQ,EAClCyG,EAAYtG,EAAAA,SAASH,EAAK,SAAS,EACnC0G,EAAkBvG,EAAAA,SAASH,EAAK,eAAe,EAC/C2G,GAAaxG,EAAAA,SAASH,EAAK,SAAS,EACpC4G,EAAUzG,EAAAA,SAASH,EAAK,OAAO,EAC/B6G,EAAkB1G,EAAAA,SAASH,EAAK,cAAc,EAC9C8G,EAAgB3G,EAAAA,SAASH,EAAK,YAAY,EAC1C+G,EAAkB5G,EAAAA,SAASH,EAAK,cAAc,EAC9CgH,EAAa7G,EAAAA,SAASH,EAAK,SAAS,EACpCiH,GAAe9G,EAAAA,SAASH,EAAK,WAAW,EACxCkH,EAAiB/G,EAAAA,SAASH,EAAK,aAAa,EAC5CmH,EAAiBhH,EAAAA,SAASH,EAAK,cAAc,EAE7C,CAACoH,EAAUC,CAAW,EAAIrB,EAAAA,SAAS,IAAI,EAEvChC,EAAQjE,EAAAA,QAAQ,IAChB,CAACyG,GAAa,CAACD,EAAgB,CAAA,EAC5BC,EAAU,MAAMD,EAAQ,MAAOA,EAAQ,GAAG,EAChD,CAACC,EAAWD,CAAO,CAAC,EAEjBe,EAAaC,EAAAA,YACjB,CAAChH,EAAIa,IAAW,CACd,GAAIA,IAAW,WACbpB,EAAI,KAAKoB,EAAQ,CACf,OAAQb,EACR,KAAM,CAAE,KAAMT,EAAE,UAAU,CAAA,EAC1B,KAAM,QACN,KAAM,GACN,MAAOS,EAAK,OAAS,IAAA,CACtB,UACQa,IAAW,YAAa,CACjC,MAAMpC,EAAOgF,EAAM,KAAM7B,GAAMA,EAAE,KAAO5B,CAAE,GACtCvB,GAAM,MAAQA,GAAM,OACtBgB,EAAI,KAAKoB,EAAQ,CAAE,GAAAb,EAAI,KAAM,CAACvB,EAAK,KAAM,CAC7C,CACF,EACA,CAACgF,CAAK,CAAA,EAGFwD,EAAUD,EAAAA,YACbE,GAAM,CACL,GAAIA,EAAE,OAAS,EAAG,OAClB,MAAMlH,EAAKmH,EAAAA,SAASD,CAAC,EACfrG,EAASqG,EAAE,OAAO,QAAQ,OAC5BrG,KAAU,eAAA,EACVb,EACEa,IAAW,YAAcA,IAAW,YACtCkG,EAAW/G,EAAIa,CAAM,EAErBpB,EAAI,KAAK,cAAe,CACtB,GAAAO,EACA,OAAQkH,EAAE,SAAWA,EAAE,QACvB,MAAOA,EAAE,SACT,KAAM,KACN,MAAO,MAAA,CACR,EAEMrG,IAAW,YACpBkG,EAAW,KAAMlG,CAAM,CAE3B,EACA,CAACpB,EAAKsH,CAAU,CAAA,EAGZK,EAAWC,EAAAA,OAAO,IAAI,EACtBC,EAAoBD,EAAAA,OAAO,IAAI,EAC/B,CAACE,EAAiBC,EAAkB,EAAI/B,EAAAA,SAAS,CAAC,EAClD,CAACgC,GAAkBC,EAAmB,EAAIjC,EAAAA,SAAS,CAAC,EAE1DkC,EAAAA,UAAU,IAAM,CACd,MAAMpL,EAAO+K,EAAkB,QAC/B,GAAI,CAAC/K,GAAQ,OAAO,eAAmB,IAAa,OACpD,MAAMqL,EAAS,IAAM,CACnBJ,GAAmBjL,EAAK,WAAW,EACnCmL,GAAoBnL,EAAK,YAAY,CACvC,EACAqL,EAAA,EACA,MAAMC,EAAK,IAAI,eAAeD,CAAM,EACpC,OAAAC,EAAG,QAAQtL,CAAI,EACR,IAAMsL,EAAG,WAAA,CAClB,EAAG,CAAA,CAAE,EAEL,MAAMC,EAAWtI,EAAAA,QAAQ,KAErBqH,GAAY,CAACpD,EAAM,KAAMsE,GAAMA,EAAE,KAAOlB,EAAS,EAAE,EAC/C,CAAC,GAAGpD,EAAOoD,CAAQ,EACnBpD,GACM,IAAKsE,IAAO,CAAE,GAAGA,GAAI,EAChC,CAACtE,EAAOoD,CAAQ,CAAC,EAEdmB,EAAcX,EAAAA,OAAOS,CAAQ,EACnCH,EAAAA,UAAU,IAAM,CACdK,EAAY,QAAUF,CACxB,EAAG,CAACA,CAAQ,CAAC,EAEb,MAAMG,EAAgBZ,EAAAA,OAAO,IAAI,EAE3Ba,EAAelB,EAAAA,YAClB1J,GAAW,CACV,MAAM0C,EAAK1C,EAAO,GACZ,CAAE,OAAA0B,EAAQ,MAAAD,CAAA,EAAUzB,EACpB6K,EAAa7K,EAAO,OAE1B,IAAIsB,EAASI,GAAUD,EACnBqJ,EAAOpJ,EAAS,SAAW,QAE/B,GAAImJ,EAAY,CACd,GAAIC,IAAS,QAAS,CACpB,MAAMtE,EAAQkE,EAAY,QAAQ,UAAWD,IAAMA,GAAE,KAAO/H,CAAE,EACxDqI,EAAcL,EAAY,QAAQ,UACrCD,IAAMA,GAAE,KAAOnJ,CAAA,EAEZH,EAAOuJ,EAAY,QAAQK,CAAW,EACxCvE,EAAQuE,IAAgB,EAC1BD,EAAO,SACE3J,GAAQA,EAAK,MAAQA,EAAK,OACnC2J,EAAO,SACPxJ,EAASH,EAAK,KAAK,CAAC,EAAE,GAE1B,CACAwJ,EAAc,QAAU,CAAE,GAAAjI,EAAI,CAACoI,CAAI,EAAGxJ,CAAA,CACxC,QAAqB,QAAU,KAE/Ba,EAAI,KAAK,YAAa,CACpB,GAAAO,EACA,KAAAoI,EACA,OAAAxJ,EACA,WAAAuJ,CAAA,CACD,CACH,EACA,CAAC1I,CAAG,CAAA,EAMA6I,GAAO9I,EAAAA,QAAQ,IAAM,CACzB,IAAI8I,GAAQlC,IAAc,CAAA,GAAI,IAAK3F,GAAQ,CACzCA,EAAM,CAAE,GAAGA,CAAA,EACX,MAAM8H,EAAS,CAAC,GAAG9H,EAAI,MAAM,EAC7B,OAAA8H,EAAO,QAASzJ,GAAS,CACnBA,EAAK,OAAMA,EAAK,KAAOS,EAAET,EAAK,IAAI,EACxC,CAAC,EACD2B,EAAI,OAAS8H,EACN9H,CACT,CAAC,EAED,MAAM+H,EAAKF,EAAK,UAAWzF,GAAMA,EAAE,KAAO,MAAM,EAC1C4F,EAAKH,EAAK,UAAWzF,GAAMA,EAAE,KAAO,UAAU,EAC9C6F,EAAKJ,EAAK,UAAWzF,GAAMA,EAAE,KAAO,WAAW,EAMrD,GAJI2F,IAAO,KACLF,EAAKE,CAAE,EAAE,OAAMF,EAAKE,CAAE,EAAE,MAAQF,EAAKE,CAAE,EAAE,MAC7CF,EAAKE,CAAE,EAAE,KAAOlI,IAEdoI,IAAO,GAAI,CACb,MAAMC,EAASL,EAAKI,CAAE,EAEtB,GADKC,EAAO,OAAMA,EAAO,KAAO1H,IAC5B0H,EAAO,QAAU,OAAOA,EAAO,QAAW,WAAY,CACxD,MAAMC,EAASD,EAAO,OAChB3L,EAAS4L,EAAO,OACjB5L,EAAO,OAAMA,EAAO,KAAOoE,IAChCpE,EAAO,KAAOoE,GACTpE,EAAO,aAAiB,SAAW,CAAE,MAAO,MAAA,GACjD2L,EAAO,OAAUxJ,GAAQ,CACvB,GAAIA,EAAI,OAAS,UAAW,OAAOyJ,CACrC,CACF,CACF,CACA,GAAIH,IAAO,GAAI,CACbH,EAAKG,CAAE,EAAE,KAAOH,EAAKG,CAAE,EAAE,MAAQ9H,GACjC,MAAM4H,EAASD,EAAKG,CAAE,EAAE,OAAO,CAAC,EAGhC,GAFAH,EAAKG,CAAE,EAAE,OAAO,CAAC,EAAE,KAAOF,EAAO,MAAQ5H,GAErC2E,EACFgD,EAAK,OAAOG,EAAI,CAAC,UAEb7B,EAAgB,CAClB,KAAM,CAACiC,CAAS,EAAIP,EAAK,OAAOG,EAAI,CAAC,EACrCH,EAAK,QAAQO,CAAS,CACxB,CAEJ,CAEA,OAAIP,EAAK,OAAS,IAAGA,EAAKA,EAAK,OAAS,CAAC,EAAE,OAAS,IAC7CA,CACT,EAAG,CAAClC,GAAY7G,EAAG+F,EAAUsB,CAAc,CAAC,EAE5CkC,EAAAA,gBAAgB,IAAM,CACpBtD,EAAelC,GAAgBgF,EAAI,CAAC,CACtC,EAAG,CAACA,EAAI,CAAC,EAET,MAAMS,GAAiB/B,cAAavG,GAAQ,CAC1C,IAAIwE,EAAQ,uBAAuBxE,EAAI,KAAK,IAE5C,OAAIA,EAAI,KAAO,WAAYwE,GAAS,aAC3BxE,EAAI,KAAO,QAAOwE,GAAS,WAE7BA,EAAM,KAAA,CACf,EAAG,CAAA,CAAE,EAKC+D,GAAcxJ,EAAAA,QAAQ,IAAMwG,GAAS,MAAQ,EAAG,CAACA,CAAO,CAAC,EACzDiD,EAAezJ,EAAAA,QAAQ,IAAM0G,GAAW,QAAU,EAAG,CAACA,CAAS,CAAC,EAEhEgD,GAAY1J,EAAAA,QAChB,IAAMiD,GAAa2D,IAAc,GAAIO,EAAgBD,EAAY,EACjE,CAACN,GAAYO,EAAgBD,EAAY,CAAA,EAGrClE,GAAUhD,EAAAA,QACd,IACEsD,GACE8D,EACAD,EACApE,EACAgF,EACAb,EAAA,EAEJ,CAACE,EAAgBD,EAAgBpE,EAAagF,EAAiBb,EAAY,CAAA,EAGvEyC,GAAa3J,EAAAA,QACjB,KAAOwJ,IAAe,IAAMpD,GAAgB,GAC5C,CAACoD,GAAapD,CAAY,CAAA,EAGtBwD,GAAa5J,EAAAA,QAAQ,IAAM,CAC/B,MAAM6J,EACJnH,GAAiBuF,GAAkB5B,GAAiB,CAAC,EACrDxD,GAAasE,EAAgBpE,EAAaC,EAAO,EAC7CyC,EAAQF,GAAesE,CAAG,EAChC,OAAApE,EAAM,kBAAkB,EAAI,GAAGkE,EAAU,KAClClE,CACT,EAAG,CACDwC,GACA5B,EACAc,EACApE,EACAC,GACA2G,EAAA,CACD,EAIKG,GAAM9J,EAAAA,QACV,IAAO,MAAM,QAAQuG,CAAW,EAAIA,EAAY,IAAKwD,GAAMA,EAAE,EAAE,EAAI,CAAA,EACnE,CAACxD,CAAW,CAAA,EAGRyD,GAAahK,EAAAA,QACjB,IAAMyD,GAAcqF,GAAM3B,CAAc,EACxC,CAAC2B,GAAM3B,CAAc,CAAA,EAGjB8C,GAAazC,EAAAA,YAChBE,GAAM,CACL,GAAI,CAAC5B,EAAU,CACb,MAAMtF,EAAKmH,EAAAA,SAASD,CAAC,EACf3G,EAAS4G,EAAAA,SAASD,EAAG,aAAa,EAEpC,EADc3G,GAAU+H,GAAK,KAAMzF,GAAMA,EAAE,KAAOtC,CAAM,IAC5C,QAAUP,KAAQ,KAAK,cAAe,CAAE,GAAAA,EAAI,CAC9D,CACF,EACA,CAACP,EAAK6F,EAAUgD,EAAI,CAAA,EAGhBoB,GAAYlK,EAAAA,QAChB,IAAMgE,GAAasE,EAAUzB,CAAO,EACpC,CAACyB,EAAUzB,CAAO,CAAA,EAGdsD,GAAUnK,EAAAA,QAAQ,IACfkK,GAAY,CAAE,GAAGlD,CAAA,EAAoBA,EAC3C,CAACkD,GAAWlD,CAAe,CAAC,EAEzBoD,GAAkBvC,EAAAA,OAAO,EAAK,EACpCM,EAAAA,UAAU,IAAM,CACd,GAAI,CAAC7B,GAAa,CAACJ,EAAU,OAE7B,KAAM,CAAE,GAAA1F,EAAI,OAAAO,CAAA,EAAWuF,EACnBvF,IACGqJ,GAAgB,UACnBA,GAAgB,QAAU,GAC1B,sBAAsB,IAAM,CAC1B,KAAM,CAAE,UAAAC,EAAW,OAAAjB,GAAWlD,EAAS,SAAA,EAClCkD,IACHlD,EAAS,KAAK,aAAc,CAC1B,IAAK1F,EACL,OAAQ6J,GAAW,QAAUvB,GAAK,CAAC,GAAG,EAAA,CACvC,EACDsB,GAAgB,QAAU,GAE9B,CAAC,GAGP,EAAG,CAAC9D,EAAWJ,CAAQ,CAAC,EAExB,MAAMoE,GAAe9C,EAAAA,YACnB,CAAC,CAAE,GAAAhH,CAAA,IAAS,CACV,GAAIsF,EAAU,MAAO,GAEjB7F,EAAI,QAAQO,CAAE,EAAE,MAAMP,EAAI,KAAK,YAAa,CAAE,GAAAO,EAAI,KAAM,EAAA,CAAO,EAEnE,MAAM+H,EAAItI,EAAI,SAAA,EAAW,OAAO,KAAMsI,GAAMA,EAAE,KAAO/H,CAAE,EAEvD,GADA8G,EAAYiB,GAAK,IAAI,EACjB,CAACA,EAAG,MAAO,EACjB,EACA,CAACtI,EAAK6F,CAAQ,CAAA,EAGVyE,GAAa/C,EAAAA,YACjB,CAAC,CAAE,GAAAhH,EAAI,IAAAxB,KAAU,CACXyJ,EAAc,QAChBC,EAAa,CAAE,GAAGD,EAAc,QAAS,OAAQ,GAAO,EAExDxI,EAAI,KAAK,YAAa,CACpB,GAAAO,EACA,IAAKxB,GAAOwK,IAAe,GAC3B,WAAY,EAAA,CACb,EAEHlC,EAAY,IAAI,CAClB,EACA,CAACrH,EAAKyI,EAAcc,EAAW,CAAA,EAG3BgB,GAAchD,EAAAA,YAClB,CAAC,CAAE,GAAAhH,EAAI,IAAAxB,EAAK,OAAAlB,KAAa,CACnBA,GACF4K,EAAa,CAAE,GAAG5K,EAAQ,OAAQ,GAAM,EAE1CmC,EAAI,KAAK,YAAa,CACpB,GAAAO,EACA,IAAKxB,GAAOwK,IAAe,GAC3B,WAAY,EAAA,CACb,CACH,EACA,CAACvJ,EAAKyI,EAAcc,EAAW,CAAA,EAG3BiB,GAAa5C,EAAAA,OAAOZ,CAAU,EACpCkB,EAAAA,UAAU,IAAM,CACdsC,GAAW,QAAUxD,CACvB,EAAG,CAACA,CAAU,CAAC,EAEfkB,EAAAA,UAAU,IAAM,CACd,MAAMpL,EAAO6K,EAAS,QACtB,OAAK7K,EACUQ,GAAQR,EAAM,CAC3B,WAAY,IAAM,CAAC,CAAC0N,GAAW,SAAS,MACxC,MAAOH,GACP,IAAKC,GACL,KAAMC,GACN,QAASvK,EAAI,OAAA,CACd,EACa,QARH,MASb,EAAG,CAACA,EAAKqK,GAAcC,GAAYC,EAAW,CAAC,EAE/C,MAAME,GAAelD,EAAAA,YAClBvK,GAAO,CACN,KAAM,CAAE,IAAAmH,EAAK,QAAAuG,CAAA,EAAY1N,EACzB,GAAI,CAAC0N,IAAYvG,IAAQ,WAAaA,IAAQ,aAC5C,OAAAnH,EAAG,YAAc,OACjBgD,EAAI,KAAK,SAAUhD,CAAE,EACd,GACT,GAAWmH,IAAQ,QAAS,CAC1B,MAAMiG,EAAYnE,GAAU,SAAA,EAAW,UACvC,GAAImE,EAAW,CACb,KAAM,CAAE,IAAA1K,EAAK,OAAAoB,CAAA,EAAWsJ,EACpBtJ,IAAW,WACbwG,EAAW5H,EAAK,UAAU,EACjBoB,IAAW,QACpBwG,EAAW5H,EAAK,WAAW,CAE/B,CACF,CACF,EACA,CAACM,EAAKsH,EAAYrB,CAAQ,CAAA,EAItB0E,EAAmB/C,EAAAA,OAAO,IAAI,EAC9BgD,EAAmB,IAAM,CAC7BD,EAAiB,QAAU,CACzB,YAAAzE,EACA,aAAAuE,GACA,QAAA7D,EACA,IAAA5G,EACA,KAAA6I,GACA,eAAA9C,EACA,MAAA/B,EACA,gBAAA6C,EACA,cAAAC,EACA,iBAAAhB,CAAA,CAEJ,EACA8E,EAAA,EACA1C,EAAAA,UAAU,IAAM,CACd0C,EAAA,CACF,EAAG,CACD1E,EACAuE,GACA7D,EACA5G,EACA6I,GACA9C,EACA/B,EACA6C,EACAC,EACAhB,CAAA,CACD,EAED,MAAM+E,GAAOtD,cAAauD,GAAS,CACjC5E,EAAY4E,CAAI,EAChBA,EAAK,UAAU,SAAW9N,GAAO2N,EAAiB,QAAQ,aAAa3N,CAAE,CAAC,EAC1E8N,EAAK,UAAU,aAAc,IAAM,EAAK,EACxCA,EAAK,UAAU,SAAU,IAAM,EAAK,EACpCA,EAAK,UAAU,YAAcrD,GAAM,CACjC,MAAMb,EAAU+D,EAAiB,QAAQ,QACnC,CAAE,IAAAxG,EAAK,IAAA4G,CAAA,EAAQtD,EACfuD,EAAUpE,EAAUA,EAAQ,KAAMqE,GAAMA,EAAE,MAAQ9G,CAAG,EAAI,KAC/D,IAAIC,EAAQ,MACZ,OAAI4G,IAAS5G,EAAQ,CAAC4G,GAAWA,EAAQ,QAAU,MAAQ,OAAS,OAEpEhL,EAAI,KAAK,aAAc,CACrB,IAAAmE,EACA,MAAAC,EACA,IAAA2G,CAAA,CACD,EACM,EACT,CAAC,EACDD,EAAK,UAAU,cAAgB9N,GAAO,CACpC,KAAM,CAAE,IAAAmH,EAAK,MAAA7D,CAAA,EAAUtD,EAEvB,OAAAgD,EAAI,KAAK,eAAgB,CACvB,IAAAmE,EACA,MAAA7D,EACA,KAAM,EAAA,CACP,EACM,EACT,CAAC,EAEDwK,EAAK,UAAU,gBAAkB9N,GAAO,CACtCA,EAAG,iBAAmB0G,GAAciH,EAAiB,QAAQ,KAAM3N,EAAG,EAAE,CAC1E,CAAC,EAED8N,EAAK,GAAG,gBAAkB9N,GAAO,CAC/B,MAAMiG,EAAU6H,EAAK,SAAA,EAAW,QAChCH,EAAiB,QAAQ,eAAe9G,GAAgBZ,CAAO,CAAC,EAC5DjG,EAAG,aAAe,IAAMgD,EAAI,KAAK,cAAe,CAAE,QAAAiD,EAAS,CACjE,CAAC,EAED6H,EAAK,GAAG,cAAe,IAAM,CAC3B,MAAM7H,EAAU6H,EAAK,SAAA,EAAW,QAChCH,EAAiB,QAAQ,eAAe9G,GAAgBZ,CAAO,CAAC,EAChEjD,EAAI,KAAK,cAAe,CAAE,QAAAiD,CAAA,CAAS,CACrC,CAAC,EAED6H,EAAK,UAAU,cAAgBrD,GAAM,CACnC,KAAM,CAAE,GAAAlH,EAAI,OAAAO,EAAQ,MAAAR,CAAA,EAAUmH,EACxBzI,EAAO2L,EAAiB,QAAQ,MAAM,KAAMrC,GAAMA,EAAE,KAAO/H,CAAE,EAEnE,GAAIvB,EAAM,CACR,GAAI8B,IAAW,YAAa,CAC1BgB,GAAiBvB,EAAID,EAAON,CAAG,EAC/B,MACF,CAEA,MAAMmI,EAAS,CAAE,GAAGnJ,CAAA,EACpB,IAAI,EAAIsB,EACJ,GAAK,CAAC,MAAM,CAAC,GAAK,EAAE,aAAa,QAAO,GAAK,GACjD6H,EAAOrH,CAAM,EAAI,EAEjBoK,GAAAA,gBACE/C,EACA,CACE,aAAcwC,EAAiB,QAAQ,gBACvC,WAAYA,EAAiB,QAAQ,aAAA,EAEvC3K,EAAI,gBAAgBmI,CAAM,EAC1BrH,CAAA,EAGFd,EAAI,KAAK,cAAe,CACtB,GAAAO,EACA,KAAM4H,CAAA,CACP,CACH,CACA,MAAO,EACT,CAAC,EAEDrC,GAAoBA,EAAiBgF,CAAI,CAC3C,EAAG,CAAA,CAAE,EAEL,OACErK,EAAAA,IAAC,MAAA,CACC,UAAU,iCACV,MAAO,CAAE,KAAM,OAAOgJ,EAAS,EAAA,EAC/B,IAAK5B,EAEL,SAAApH,EAAAA,IAAC,MAAA,CACC,IAAKkH,EACL,MAAOgC,GACP,UAAU,uBACV,QAAAnC,EACA,cAAewC,GAEf,SAAAvJ,EAAAA,IAAC0K,GAAAA,KAAA,CACC,KAAAN,GACA,MAAO,CACL,UAAWzE,EACX,cAAeoD,GAAgB,IAAM9C,GAAmB,EAAA,EAE1D,SAAWhH,GACTA,EAAI,SAAW,8BAAgC,cAEjD,YAAa4J,GACb,KAAMjB,EACN,QAAS0B,GACT,aAAc,CAAC,GAAGF,EAAG,EACrB,UAAAI,GACA,aAAcC,EAAA,CAAA,CAChB,CAAA,CACF,CAAA,CAGN,CC3kBA,SAASkB,IAAW,CAClB,MAAMpL,EAAMJ,EAAAA,WAAWK,EAAY,EAC7BoL,EAAYlL,EAAAA,SAASH,EAAK,WAAW,EACrC2C,EAAaxC,EAAAA,SAASH,EAAK,YAAY,EACvCsL,EAAcnL,EAAAA,SAASH,EAAK,aAAa,EAEzCuL,EAAU3D,EAAAA,OAAO,IAAI,EACrB,CAAC4D,EAAOC,CAAQ,EAAIzF,EAAAA,SAAS,SAAS,EAE5CkC,EAAAA,UAAU,IAAM,CACd,GAAI,OAAO,iBAAqB,KAAeqD,EAAQ,QAAS,CAC9D,MAAMG,EAAS,iBAAiBH,EAAQ,OAAO,EAAE,iBAC/C,mBAAA,EAEFE,EAASC,EAASA,EAAO,UAAUA,EAAO,QAAQ,GAAG,CAAC,EAAI,WAAW,CACvE,CACF,EAAG,CAAA,CAAE,EAEL,MAAMlG,EAAQ,CACZ,MAAO,OACP,OAAQ,OACR,WACE6F,GAAa,MAAQ1I,GAAc,KAC/B,OAAOgJ,GAAAA,KAAKN,EAAW1I,EAAY6I,EAAOF,CAAW,CAAC,IACtD,OACN,SAAU,UAAA,EAGZ,OAAO7K,EAAAA,IAAC,MAAA,CAAI,IAAK8K,EAAS,MAAA/F,CAAA,CAAc,CAC1C,CC5BA,SAAwBoG,GAAM,CAAE,aAAAC,EAAc,aAAAC,EAAc,SAAAjG,GAAY,CACtE,MAAM7F,EAAMJ,EAAAA,WAAWK,EAAY,EAC7B8L,EAAQ5L,EAAAA,SAASH,EAAK,eAAe,EACrCgM,EAAe7L,EAAAA,SAASH,EAAK,cAAc,EAE3CiM,EAAkBrE,EAAAA,OAAO,IAAI,EAE7BsE,EAAiB3E,EAAAA,YACpBtJ,GAAU,CACT,MAAM2L,EAAM3L,GAAO,QAAQ,UAEzB,CAAC2L,GAAK,SAAS,gBAAgB,GAC/B,CAACA,GAAK,SAAS,kBAAkB,GAEjCiC,EAAa,IAAI,CAErB,EACA,CAACA,CAAY,CAAA,EAGf3D,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAI,CAACrC,GAAYiG,GAAgBG,EAAgB,QAAS,CACxD,MAAME,EAAWlO,GAAU,CAEvBgO,EAAgB,SAChB,CAACA,EAAgB,QAAQ,SAAShO,EAAM,MAAM,GAE9CiO,EAAejO,CAAK,CAExB,EACA,gBAAS,iBAAiB,QAASkO,CAAO,EACnC,IAAM,CACX,SAAS,oBAAoB,QAASA,CAAO,CAC/C,CACF,CACF,EAAG,CAACtG,EAAUiG,EAAcI,CAAc,CAAC,EAGzCxL,EAAAA,KAAC,MAAA,CAAI,UAAU,uBACX,SAAA,EAAAqL,GAAS,CAAA,GAAI,IAAKK,GAAS,CAC3B,MAAMC,EACJ,uBACCL,GAAgBI,EAAK,SAAW,eAAiB,KAChDvG,EAAmC,GAAxB,uBACf,OACEnF,EAAAA,KAAC,IAAA,CACC,UAAA2L,EAEA,QAAS,IAAM,CAACxG,GAAYgG,EAAaO,EAAK,EAAE,EAChD,eAAcE,EAAAA,MAAMF,EAAK,EAAE,EAE3B,SAAA,CAAA3L,EAAAA,IAAC,WAAA,CAAS,UAAU,2BAA2B,OAAQ2L,EAAK,GAAI,QAC/D,WAAA,CAAS,UAAU,6BAA6B,OAAQA,EAAK,EAAA,CAAI,CAAA,CAAA,EAL7DA,EAAK,EAAA,CAQhB,CAAC,EACA,CAACvG,GAAYiG,GACZpL,EAAAA,KAAC,IAAA,CACC,IAAKuL,EACL,UAAU,yEACV,eAAcK,EAAAA,MAAMR,EAAa,EAAE,EAEnC,SAAA,CAAArL,EAAAA,IAAC,WAAA,CACC,UAAU,2BACV,OAAQqL,EAAa,EAAA,CAAA,EAEvBrL,EAAAA,IAAC,WAAA,CACC,UAAU,6BACV,OAAQqL,EAAa,EAAA,CAAA,CACvB,CAAA,CAAA,CACF,EAEJ,CAEJ,CC9EA,SAASS,GAAY9M,EAAO,CAC1B,KAAM,CAAE,KAAAT,EAAM,KAAAwN,CAAA,EAAS/M,EAEvB,SAASgN,EAAaC,EAAG,CACvB,MAAMzB,EAAIjM,EAAK,SAAS0N,CAAC,EACzB,MAAO,CACL,KAAM,GAAGzB,EAAE,EAAE,KACb,IAAK,MACL,MAAO,GAAGA,EAAE,EAAE,KACd,OAAQ,MAAA,CAEZ,CAEA,SAAS0B,EAAeC,EAAc,CACpC,GAAI,CAAC5N,EAAK,SAAU,MAAO,GAE3B,MAAM6N,EAAY7N,EAAK,SAAWA,EAAK,SAAY,IAC7C8N,EAAW9N,EAAK,SACtB,IAAI+N,EAAW,EACb,EAAI,EACJC,EAAS,KACX,EAAG,CACD,MAAM/B,EAAI6B,EAAS,CAAC,EAChB,IAAMF,IACJG,EAAWF,EAAUG,EAAS,EAC7BA,EAAS,KAAK,KAAKH,EAAWE,GAAY9B,EAAE,SAAU,CAAC,EAAI,KAElE8B,GAAY9B,EAAE,SACd,GACF,OAAS+B,IAAW,MAAQ,EAAIF,EAAS,QACzC,OAAOE,GAAU,CACnB,CAEA,OACEvM,MAAC,OAAI,UAAU,0BACZ,WAAK,SAAS,IAAI,CAACwM,EAAKP,IACvBhM,EAAAA,KAAC,MAAA,CAEC,UAAW,wBAAwB8L,CAAI,eACvC,eAAcE,EACd,MAAOD,EAAaC,CAAC,EAEpB,SAAA,CAAA1N,EAAK,SACJyB,MAAC,MAAA,CAAI,UAAU,sBACb,SAAAA,EAAAA,IAAC,MAAA,CACC,UAAU,kCACV,MAAO,CAAE,MAAO,GAAGkM,EAAeD,CAAC,CAAC,GAAA,CAAI,CAAA,EAE5C,EACE,WACH,MAAA,CAAI,UAAU,aAAc,SAAAO,EAAI,MAAQ,EAAA,CAAG,CAAA,CAAA,EAbvCP,CAAA,CAeR,EACH,CAEJ,CCvDA,SAASQ,GAAQzN,EAAO,CACtB,KAAM,CAAE,OAAA0N,EAAQ,OAAAC,CAAA,EAAW3N,EAE3B,OACEgB,EAAAA,IAAC,MAAA,CACC,iBAAgB6L,EAAAA,MAAMa,EAAO,EAAE,EAC/B,UAAW,4BAA4BA,EAAO,IAAI,UAClD,MAAO,CACL,KAAM,GAAGA,EAAO,SAAS,KACzB,IAAK,GAAGC,EAAO,GAAKA,EAAO,GAAKD,EAAO,kBAAkB,KACzD,MAAO,GAAGA,EAAO,SAAS,KAC1B,OAAQ,GAAGA,EAAO,SAAS,IAAA,CAC7B,CAAA,CAGN,CCEA,SAASE,GAAK5N,EAAO,CACnB,KAAM,CAAE,SAAAoG,EAAU,aAAcyH,CAAA,EAAiB7N,EAE3CO,EAAMJ,EAAAA,WAAWK,EAAY,EAE7B,CAACsN,EAAaC,CAAa,EAAIC,EAAAA,oBAAoBzN,EAAK,QAAQ,EAChE,CAAC0N,EAAaC,CAAa,EAAIF,EAAAA,oBAAoBzN,EAAK,QAAQ,EAChE4N,EAAYzN,EAAAA,SAASH,EAAK,MAAM,EAChC6N,EAAc1N,EAAAA,SAASH,EAAK,SAAS,EACrC8N,EAAiB3N,EAAAA,SAASH,EAAK,WAAW,EAC1C+N,EAAiB5N,EAAAA,SAASH,EAAK,WAAW,EAC1CgO,EAAgB7N,EAAAA,SAASH,EAAK,WAAW,EACzCiO,EAAU9N,EAAAA,SAASH,EAAK,SAAS,EACjCkO,EAAW/N,EAAAA,SAASH,EAAK,UAAU,EACnCmO,EAAiBhO,EAAAA,SAASH,EAAK,WAAW,EAC1CgM,EAAe7L,EAAAA,SAASH,EAAK,cAAc,EAC3CoO,EAAOjO,EAAAA,SAASH,EAAK,MAAM,EAC3BqO,GAAWlO,EAAAA,SAASH,EAAK,UAAU,EACnCsO,EAAanO,EAAAA,SAASH,EAAK,YAAY,EACvCuO,EAAUpO,EAAAA,SAASH,EAAK,SAAS,EACjCwO,EAAQrO,EAAAA,SAASH,EAAK,OAAO,EAE7BgE,EAAQjE,EAAAA,QAAQ,IAAM,CAC1B,GAAI,CAAC6N,GAAa,CAAC,MAAM,QAAQL,CAAW,QAAU,CAAA,EACtD,MAAMkB,EAAQb,EAAU,OAAS,EAC3BlP,EAAMkP,EAAU,KAAO,EAC7B,OAAOL,EAAY,MAAMkB,EAAO/P,CAAG,EAAE,IAAKyD,IAAO,CAAE,GAAGA,CAAA,EAAI,CAC5D,EAAG,CAACqL,EAAeI,CAAS,CAAC,EAEvBc,EAAkB3O,EAAAA,QACtB,IAAM8N,EAAY,gBAClB,CAACA,CAAW,CAAA,EAGRc,GAAmB5O,EAAAA,QACvB,IAAMiE,EAAM,KAAMhF,GAASA,EAAK,KAAOA,EAAK,MAAQA,EAAK,EAAE,EAC3D,CAACgF,CAAK,CAAA,EAGF4K,EAAqBhH,EAAAA,OAAO,EAAK,EAEjC,CAACiH,EAAUC,CAAW,EAAI9I,EAAAA,SAAS,MAAS,EAC5C,CAAC+I,EAAUC,CAAW,EAAIhJ,EAAAA,SAAS,IAAI,EACvCiJ,EAAkBrH,EAAAA,OAAO,IAAI,EAE7B,CAACsH,EAAgBC,CAAiB,EAAInJ,EAAAA,SAAS,IAAI,EAEnD8F,EAAe/L,EAAAA,QAAQ,IAEzBmP,GAAkB,CAChB,GAAGxB,EAAY,KAAMtB,GAASA,EAAK,KAAO8C,CAAc,CAAA,EAG3D,CAACA,EAAgBvB,CAAa,CAAC,EAE5B,CAAC7P,EAASsR,EAAU,EAAIpJ,EAAAA,SAAS,MAAS,EAC1CqJ,GAAgBzH,EAAAA,OAAO,IAAI,EAE3B,CAAC0H,GAAYC,CAAa,EAAIvJ,EAAAA,SAAS,CAAC,EAExCwJ,EAAe5H,EAAAA,OAAO,IAAI,EAE1B6H,EAAW1P,EAAAA,QAAQ,IAAM,CAC7B,MAAM2P,EAAKF,EAAa,QACxB,MAAO,CAAC,EACNxB,EAAc,QACd0B,GACAA,EAAG,SAAS,SAAS,aAAa,EAEtC,EAAG,CAAC1B,EAAewB,EAAa,OAAO,CAAC,EAElCG,EAAU5P,EAAAA,QAAQ,IACf0P,GAAYzB,EAAcA,EAAc,OAAS,CAAC,GAAG,GAC3D,CAACyB,EAAUzB,CAAa,CAAC,EAE5B9F,EAAAA,UAAU,IAAM,CACd,GAAKiG,GACDA,EAAe,SAAW,GAAO,CACnC,KAAM,CAAE,GAAA5N,GAAO4N,EACTrR,EAAO0S,EAAa,SAAS,cACjC,oBAAoBlD,EAAAA,MAAM/L,CAAE,CAAC,IAAA,EAE3BzD,GAAMA,EAAK,MAAM,CAAE,cAAe,GAAM,CAC9C,CACF,EAAG,CAACqR,CAAc,CAAC,EAEnBjG,EAAAA,UAAU,IAAM,CACd,MAAMwH,EAAKF,EAAa,QACxB,GAAKE,IACLH,EAAcG,EAAG,aAAe,CAAC,EAC7B,OAAO,eAAmB,KAAa,CACzC,MAAMtH,EAAK,IAAI,eAAgBwH,GAAY,CACrCA,EAAQ,CAAC,GACXL,EAAcK,EAAQ,CAAC,EAAE,YAAY,KAAK,CAE9C,CAAC,EACD,OAAAxH,EAAG,QAAQsH,CAAE,EACN,IAAMtH,EAAG,WAAA,CAClB,CACF,EAAG,CAACoH,EAAa,OAAO,CAAC,EAEzB,MAAMK,GAAYtI,EAAAA,YAAY,IAAM,CAClC,SAAS,KAAK,MAAM,WAAa,MACnC,EAAG,CAAA,CAAE,EAECuI,GAAUvI,EAAAA,YAAY,IAAM,CAChC,SAAS,KAAK,MAAM,WAAa,EACnC,EAAG,CAAA,CAAE,EAECwI,GAAcxI,EAAAA,YAClB,CAACzK,EAAM2K,EAAGzI,IAAS,CAGjB,GAFIyI,EAAE,OAAO,UAAU,SAAS,SAAS,IACpCzI,IAAMA,EAAOgB,EAAI,QAAQ5C,EAAAA,MAAMN,CAAI,CAAC,GACrCkC,EAAK,OAAS,aAAeA,EAAK,OAAS,WAAW,MAAO,GAEjE,MAAMgR,EAAc7R,EAAAA,OAAOsJ,EAAG,cAAc,EACxCuI,IAAalT,EAAOkT,GAExB,KAAM,CAAE,KAAAC,GAAM,MAAAC,IAAUpT,EAAK,sBAAA,EACvBqT,IAAK1I,EAAE,QAAUwI,IAAQC,GAC/B,IAAIE,GAAQ,IAAOF,GAAQ,IAAMA,GAAQ,IAAM,GAC/C,OAAIC,GAAIC,GAAc,QAClBD,GAAI,EAAIC,GAAc,MACnB,EACT,EACA,CAACpQ,CAAG,CAAA,EAGAhC,EAAOuJ,EAAAA,YACX,CAACzK,EAAMuT,IAAU,CACf,KAAM,CAAE,QAAAC,GAAYD,EACd9P,EAAKnD,EAAAA,MAAMN,CAAI,EACfkC,GAAOgB,EAAI,QAAQO,CAAE,EACrBqJ,GAAMyG,EAAM,OAAO,UACzB,GAAI,CAAAA,EAAM,OAAO,QAAQ,mBAAmB,GACxC,CAACxK,EAAU,CACb,GAAI+D,GAAI,SAAS,oBAAoB,EAAG,CACtC,KAAM,CAAE,SAAAiD,EAAA,EAAa7M,EAAI,QAAQO,CAAE,EACnC0O,EAAgB,QAAU,CACxB,GAAA1O,EACA,EAAG+P,EACH,SAAAzD,GACA,GAAI,EACJ,KAAA/P,EACA,OAAQuT,EAAM,MAAA,EAEhBA,EAAM,OAAO,UAAU,IAAI,qBAAqB,CAClD,KAAO,CACL,MAAM1H,GAAOoH,GAAYjT,EAAMuT,EAAOrR,EAAI,GAAK,OAEzCuR,GAAc,CAClB,GAAAhQ,EACA,KAAAoI,GACA,EAAG2H,EACH,GAAI,EACJ,EAAGtR,GAAK,GACR,EAAGA,GAAK,EAAA,EAGV,GAAIsP,GAActP,GAAK,UAAU,OAAQ,CACvC,MAAMwR,GAAUrS,EAAAA,OAAOkS,EAAO,cAAc,EACxCG,KACFD,GAAY,aAAeC,GAAQ,QAAQ,QAAa,EACxDC,GAAAA,kBAAkBzR,GAAMuR,EAAW,EAEvC,CAEAvB,EAAYuB,EAAW,CACzB,CACAV,GAAA,CACF,CACF,EACA,CAAC7P,EAAK6F,EAAUkK,GAAaF,GAAWvB,CAAU,CAAA,EAG9CoC,GAAYnJ,EAAAA,YACfE,GAAM,CACL,GAAIA,EAAE,SAAW,EAAG,OAEpB,MAAM3K,EAAOqB,EAAAA,OAAOsJ,CAAC,EAChB3K,GAELkB,EAAKlB,EAAM2K,CAAC,CACd,EACA,CAACzJ,CAAI,CAAA,EAGD2S,GAAapJ,EAAAA,YAChBE,GAAM,CACL,MAAM3K,EAAOqB,EAAAA,OAAOsJ,CAAC,EACjB3K,IACFuS,GAAc,QAAU,WAAW,IAAM,CACvCD,GAAW,EAAI,EACfpR,EAAKlB,EAAM2K,EAAE,QAAQ,CAAC,CAAC,CACzB,EAAG,GAAG,EAEV,EACA,CAACzJ,CAAI,CAAA,EAGD6N,GAAetE,cAAahH,GAAO,CACvC4O,EAAkB5O,CAAE,CACtB,EAAG,CAAA,CAAE,EAECtB,GAAKsI,EAAAA,YAAY,IAAM,CAC3B,GAAI0H,EAAgB,QAAS,CAC3B,KAAM,CAAE,GAAApQ,EAAI,GAAA0B,EAAI,OAAAqQ,EAAQ,MAAAtQ,CAAA,EAAU2O,EAAgB,QAClDA,EAAgB,QAAU,KACtB,OAAO3O,EAAU,KAAezB,GAClCmB,EAAI,KAAK,cAAe,CACtB,GAAAO,EACA,KAAM,CAAE,SAAUD,CAAA,EAClB,WAAY,EAAA,CACb,EACHsQ,EAAO,UAAU,OAAO,qBAAqB,EAE7ChC,EAAmB,QAAU,GAC7BkB,GAAA,CACF,SAAWf,EAAU,CACnB,KAAM,CAAE,GAAAxO,EAAI,KAAAoI,EAAM,GAAA9J,EAAI,EAAAgS,EAAG,EAAAxL,GAAG,MAAAoJ,GAAO,QAAAqC,GAAS,MAAAzM,EAAA,EAAU0K,EAEtD,GADAC,EAAY,IAAI,EACZP,GAAO,CACT,MAAMsC,GAAO,KAAK,MAAMlS,EAAK6P,CAAe,EAE5C,GAAI,CAACqC,GACH/Q,EAAI,KAAK,YAAa,CACpB,GAAAO,EACA,MAAO8E,GACP,KAAMwL,EACN,WAAY,GACZ,GAAIC,IAAW,CAAE,aAAczM,EAAA,CAAM,CACtC,MACI,CACL,IAAI8D,GAAS,CAAA,EACTnJ,GAAOgB,EAAI,QAAQO,CAAE,EACrBuQ,KAAS9R,GAAOA,GAAK,SAASqF,EAAK,GAEnCsE,IAAS,QACXR,GAAO,MAAQnJ,GAAK,MACpBmJ,GAAO,IAAMnJ,GAAK,KACbmJ,GAAOQ,CAAI,EAAI3J,GAAK2J,CAAI,EAE/B3I,EAAI,KAAK,cAAe,CACtB,GAAAO,EACA,KAAAwQ,GACA,KAAM5I,GACN,GAAI2I,IAAW,CAAE,aAAczM,EAAA,CAAM,CACtC,CACH,CACAuK,EAAmB,QAAU,EAC/B,CAEAkB,GAAA,CACF,CACF,EAAG,CAAC9P,EAAK8P,GAASf,EAAUL,CAAe,CAAC,EAEtC9P,GAAO2I,EAAAA,YACX,CAACE,EAAG4I,IAAU,CACZ,KAAM,CAAE,QAAAC,GAAYD,EAEpB,GAAI,CAACxK,EACH,GAAIoJ,EAAgB,QAAS,CAC3B,KAAM,CAAE,KAAAnS,EAAM,EAAAa,GAAG,GAAA4C,EAAA,EAAO0O,EAAgB,QAClCpQ,GAAMoQ,EAAgB,QAAQ,GAAKqB,EAAU3S,GAE7CoT,GAAO,KAAK,MAAOlS,GAAK/B,EAAK,YAAe,GAAG,EACrD,IAAI+P,GAAWoC,EAAgB,QAAQ,SAAW8B,GAClD9B,EAAgB,QAAQ,MAAQpC,GAAW,KAAK,IAC9C,KAAK,IAAI,EAAGA,EAAQ,EACpB,GAAA,EAGF7M,EAAI,KAAK,cAAe,CACtB,GAAAO,GACA,KAAM,CAAE,SAAAsM,EAAA,EACR,WAAY,EAAA,CACb,CACH,SAAWkC,EAAU,CACnBlD,GAAa,IAAI,EACjB,KAAM,CAAE,KAAAlD,EAAM,EAAAkI,GAAG,EAAAxL,GAAG,EAAA1H,GAAG,GAAA4C,GAAI,MAAAkO,GAAO,QAAAqC,GAAS,MAAAzM,EAAA,EAAU0K,EAC/C/P,GAAOgB,EAAI,QAAQO,EAAE,EACrB1B,GAAKyR,EAAU3S,GACfqT,GAAW,KAAK,MAAMtC,CAAe,GAAK,EAChD,GACG,CAACD,IAAS,KAAK,IAAI5P,EAAE,EAAI,IACzB8J,IAAS,SAAWtD,GAAIxG,GAAKmS,IAC7BrI,IAAS,OAAStD,GAAIxG,GAAKmS,IAC3BrI,IAAS,SACN9J,GAAK,GAAKgS,GAAIhS,GAAK,GAClBA,GAAK,GAAKgS,GAAIxL,GAAIxG,GAAKyQ,KAC3BP,EAAS,SAAW,CAACkC,GAAAA,qBAAqBjS,GAAM+P,CAAQ,EAEzD,OAEF,MAAMmC,GAAe,CAAE,GAAGnC,EAAU,GAAAlQ,EAAA,EAEpC,IAAIoR,GAAMC,GAqBV,GApBIvH,IAAS,SACXsH,GAAOY,GAAIhS,GACXqR,GAAQ7K,GAAIxG,IACH8J,IAAS,OAClBsH,GAAOY,GACPX,GAAQ7K,GAAIxG,IACH8J,IAAS,SAClBsH,GAAOY,GAAIhS,GACXqR,GAAQ7K,IAGVrF,EAAI,KAAK,YAAa,CACpB,GAAAO,GACA,MAAA2P,GACA,KAAAD,GACA,WAAY,GACZ,MAAAxB,GACA,GAAIqC,IAAW,CAAE,aAAczM,EAAA,CAAM,CACtC,EAGC,CAAC6M,GAAa,QACZvI,IAAS,QAAU3J,GAAK,KAAO6R,IAC9BlI,IAAS,QAAU3J,GAAK,KAAOqG,IAClC,CACAuJ,EAAmB,QAAU,GAC7B3P,GAAA,EACA,MACF,CACAiS,GAAa,MAAQ,GACrBlC,EAAYkC,EAAY,CAC1B,KAAO,CACL,MAAMC,EAAWhT,EAAAA,OAAOsJ,CAAC,EACzB,GAAI0J,EAAU,CACZ,MAAMnS,GAAOgB,EAAI,QAAQ5C,EAAAA,MAAM+T,CAAQ,CAAC,EAElCC,GADUjT,EAAAA,OAAOsJ,EAAG,cAAc,GACb0J,EACrBxI,GAAOoH,GAAYqB,GAASf,EAAOrR,EAAI,EAC7CoS,GAAQ,MAAM,OAASzI,IAAQ,CAAC9C,EAAW,aAAe,SAC5D,CACF,CAEJ,EACA,CACE7F,EACA6F,EACAkJ,EACAL,EACAY,GACAS,GACAlE,GACA5M,EAAA,CACF,EAGIoS,GAAY9J,EAAAA,YACfE,GAAM,CACL7I,GAAK6I,EAAGA,CAAC,CACX,EACA,CAAC7I,EAAI,CAAA,EAGD0S,GAAY/J,EAAAA,YACfE,GAAM,CACD3J,GACF2J,EAAE,eAAA,EACF7I,GAAK6I,EAAGA,EAAE,QAAQ,CAAC,CAAC,GACX4H,GAAc,UACvB,aAAaA,GAAc,OAAO,EAClCA,GAAc,QAAU,KAE5B,EACA,CAACvR,EAASc,EAAI,CAAA,EAGV2S,GAAUhK,EAAAA,YAAY,IAAM,CAChCtI,GAAA,CACF,EAAG,CAACA,EAAE,CAAC,EAEDuS,GAAWjK,EAAAA,YAAY,IAAM,CACjC6H,GAAW,IAAI,EACXC,GAAc,UAChB,aAAaA,GAAc,OAAO,EAClCA,GAAc,QAAU,MAE1BpQ,GAAA,CACF,EAAG,CAACA,EAAE,CAAC,EAEPiJ,EAAAA,UAAU,KACR,OAAO,iBAAiB,UAAWqJ,EAAO,EACnC,IAAM,CACX,OAAO,oBAAoB,UAAWA,EAAO,CAC/C,GACC,CAACA,EAAO,CAAC,EAEZ,MAAMvH,GAAazC,EAAAA,YAChBE,GAAM,CACL,GAAI,CAAC5B,EAAU,CACb,MAAMtF,EAAKmH,EAAAA,SAASD,EAAE,MAAM,EAC5B,GAAIlH,GAAM,CAACkH,EAAE,OAAO,UAAU,SAAS,SAAS,EAAG,CACjD,MAAMmF,EAAelF,EAAAA,SAASD,EAAE,OAAQ,cAAc,EACtDzH,EAAI,KAAK,cAAe,CACtB,GAAAO,EACA,GAAIqM,IAAiB,MAAQ,CAAE,aAAAA,CAAA,CAAa,CAC7C,CACH,CACF,CACF,EACA,CAAC5M,EAAK6F,CAAQ,CAAA,EAGV4L,GAAQ,CAAC,MAAO,MAAO,MAAO,KAAK,EACnCC,GAAcnK,EAAAA,YAAY,CAACoK,EAAWC,IACnCH,IAAOE,EAAY,EAAI,IAAMC,EAAU,EAAI,EAAE,EACnD,CAAA,CAAE,EAECC,GAAgBtK,EAAAA,YACpB,CAACpI,EAAQyS,IAAY,CACnB,MAAMpU,EAASqR,EAAS,GAClB8C,EAAY9C,EAAS,MAE3B,OAAI1P,IAAW3B,EAAe,GAEvB,CAAC,CAACkQ,EAAY,KAAMmD,IAEvBA,GAAE,SAAW1R,GACb0R,GAAE,SAAWrT,GACbqT,GAAE,OAASa,GAAYC,EAAWC,CAAO,CAE5C,CACH,EACA,CAAC/C,EAAUlB,EAAe+D,EAAW,CAAA,EAGjCI,GAAmBvK,EAAAA,YAAY,IAAM,CACrCsH,GACFC,EAAY,IAAI,CAEpB,EAAG,CAACD,CAAQ,CAAC,EAEPrH,GAAUD,EAAAA,YACbE,GAAM,CACL,GAAImH,EAAmB,QAAS,CAC9BA,EAAmB,QAAU,GAC7B,MACF,CAEA,MAAMrO,EAAKmH,EAAAA,SAASD,EAAE,MAAM,EAC5B,GAAIlH,EAAI,CACN,MAAMqJ,EAAMnC,EAAE,OAAO,UACrB,GAAImC,EAAI,SAAS,SAAS,EAAG,CAC3B,MAAMgI,EAAUhI,EAAI,SAAS,SAAS,EACtC,GAAI,CAACiF,EAAU,CACbC,EAAY,CAAE,GAAAvO,EAAI,MAAOqR,CAAA,CAAS,EAClC,MACF,CAEI/C,EAAS,KAAOtO,GAAM,CAACsR,GAActR,EAAIqR,CAAO,GAClD5R,EAAI,KAAK,WAAY,CACnB,KAAM,CACJ,OAAQ6O,EAAS,GACjB,OAAQtO,EACR,KAAMmR,GAAY7C,EAAS,MAAO+C,CAAO,CAAA,CAC3C,CACD,CAEL,SAAWhI,EAAI,SAAS,uBAAuB,EAC7C5J,EAAI,KAAK,cAAe,CAAE,GAAIkP,EAAgB,EAC9CC,EAAkB,IAAI,MACjB,CACL,MAAMvC,EAAelF,EAAAA,SAASD,EAAE,OAAQ,cAAc,EACtDzH,EAAI,KAAK,cAAe,CACtB,GAAAO,EACA,OAAQkH,EAAE,SAAWA,EAAE,QACvB,MAAOA,EAAE,SACT,GAAImF,IAAiB,MAAQ,CAAE,aAAAA,CAAA,CAAa,CAC7C,CACH,CACF,CACAkF,GAAA,CACF,EACA,CACE9R,EACA6O,EACAlB,EACA7B,EACA+F,GACAH,GACAI,EAAA,CACF,EAGIC,EAAYxK,cAAavI,IACtB,CACL,KAAM,GAAGA,EAAK,EAAE,KAChB,IAAK,GAAGA,EAAK,EAAE,KACf,MAAO,GAAGA,EAAK,EAAE,KACjB,OAAQ,GAAGA,EAAK,EAAE,KAClB,WAAY,GAAGA,EAAK,EAAE,IAAA,GAEvB,CAAA,CAAE,EAECgT,EAAgBzK,cAAavI,IAC1B,CACL,KAAM,GAAGA,EAAK,OAAO,KACrB,IAAK,GAAGA,EAAK,OAAO,KACpB,MAAO,GAAGA,EAAK,OAAO,KACtB,OAAQ,GAAGA,EAAK,OAAO,IAAA,GAExB,CAAA,CAAE,EAECiT,GAAa1K,cAAavI,IACvB,CACL,KAAM,GAAGA,EAAK,QAAQ,KACtB,IAAK,GAAGA,EAAK,EAAE,KACf,MAAO,GAAG,KAAK,IAAIA,EAAK,SAAU,CAAC,CAAC,KACpC,OAAQ,GAAGA,EAAK,EAAE,IAAA,GAEnB,CAAA,CAAE,EAECkT,EAAc3K,EAAAA,YACjBvK,GAAO,CACN,GAAIc,GAAWuR,GAAc,QAC3B,OAAArS,EAAG,eAAA,EACI,EAEX,EACA,CAACc,CAAO,CAAA,EAGJqU,EAAcpS,EAAAA,QAClB,IAAM+N,EAAe,IAAKxF,GAAMA,EAAE,EAAE,EACpC,CAACwF,CAAc,CAAA,EAGXsE,EAAc7K,EAAAA,YACjBiF,GAAS,CACR,IAAI5C,EAAMuI,EAAY,SAAS3F,CAAI,EAAIA,EAAO,OAC9C,MAAK,CAAC,OAAQ,YAAa,SAAS,EAAE,SAASA,CAAI,IACjD5C,EAAM,QAAQA,CAAG,IAEZA,CACT,EACA,CAACuI,CAAW,CAAA,EAGRE,EAAU9K,EAAAA,YACbvK,GAAO,CACNgD,EAAI,KAAKhD,EAAG,OAAQA,EAAG,IAAI,CAC7B,EACA,CAACgD,CAAG,CAAA,EAGAsS,EAAiB/K,EAAAA,YACpBvI,GACQgN,GAAgBhN,EAAK,SAE9B,CAACgN,CAAY,CAAA,EAGTuG,EAAsBhL,EAAAA,YACzBhH,GAAO,CACN,GAAI8N,IAAU,KAAM,CAClB,MAAMmE,EAAapE,EAAK,aAAa7N,EAAI,EAAI,EACvCkS,EAAqBrE,EAAK,aAAaS,EAAS,GAAI,EAAI,EAC9D,OACEA,GAAU,IACV,EAAE,MAAM,QAAQ2D,CAAU,EAAIA,EAAa,CAACA,CAAU,GAAG,SACvD3D,EAAS,EAAA,GAEX,EACE,MAAM,QAAQ4D,CAAkB,EAC5BA,EACA,CAACA,CAAkB,GACvB,SAASlS,CAAE,CAEjB,CACA,OAAOsO,CACT,EACA,CAACR,GAAUD,EAAMS,CAAQ,CAAA,EAG3B,OACEnO,EAAAA,KAAC,MAAA,CACC,UAAU,sBACV,IAAK8O,EACL,cAAe0C,EACf,YAAaxB,GACb,YAAaW,GACb,aAAcV,GACd,YAAaW,GACb,WAAYE,GACZ,QAAAhK,GACA,cAAewC,GACf,YAAcvC,IACZA,EAAE,eAAA,EACK,IAGR,SAAA,CAAA+G,EACGxK,EAAM,IAAKhF,GACTA,EAAK,cACHyB,EAAAA,IAAC,MAAA,CAEC,UAAW,iCAAiCzB,EAAK,IAAI,GACrD,MAAOiT,GAAWjT,CAAI,CAAA,EAFjBA,EAAK,EAAA,EAIV,IAAA,EAEN,KACJyB,EAAAA,IAACmL,GAAA,CACC,aAAAC,GACA,aAAAC,EACA,SAAAjG,CAAA,CAAA,EAED7B,EAAM,IAAKhF,GAAS,CACnB,GAAIA,EAAK,OAASA,EAAK,gBAAkB,EAAEiP,GAAWC,IAAWlP,EAAK,EAAE,GAAI,OAAO,KACnF,MAAM0T,EACJ,aAAaN,EAAYpT,EAAK,IAAI,CAAC,IAClClB,GAAWiR,GAAY/P,EAAK,KAAO+P,EAAS,GAAK,YAAc,KAC/DF,GAAYA,EAAS,KAAO7P,EAAK,GAAK,eAAiB,KACvDsT,EAAetT,CAAI,EAAI,eAAiB,KACxCA,EAAK,SAAW,mBAAqB,KACrCsP,GAActP,EAAK,SAAW,YAAc,IACzC2T,EACJ,mBACC9D,EAAW,cAAgB,KAC3B,CAACA,GACC,CAACgD,GAAc7S,EAAK,GAAI,EAAI,GAAKuT,EAAoBvT,EAAK,EAAE,EAC3D,aACA,KACH6P,GAAYA,EAAS,KAAO7P,EAAK,IAAM6P,EAAS,MAC7C,eACA,KACHyD,EAAetT,CAAI,EAAI,eAAiB,IACrC4T,EACJ,oBACC/D,EAAW,cAAgB,KAC3B,CAACA,GACC,CAACgD,GAAc7S,EAAK,GAAI,EAAK,GAAKuT,EAAoBvT,EAAK,EAAE,EAC5D,aACA,KACH6P,GAAYA,EAAS,KAAO7P,EAAK,IAAM,CAAC6P,EAAS,MAC9C,eACA,KACHyD,EAAetT,CAAI,EAAI,eAAiB,IAC3C,OACE0B,EAAAA,KAACC,WAAA,CACE,SAAA,CAAA,CAAC3B,EAAK,OACL0B,EAAAA,KAAC,MAAA,CACC,UAAW,eAAiBgS,EAC5B,MAAOX,EAAU/S,CAAI,EACrB,UAASsN,EAAAA,MAAMtN,EAAK,EAAE,EACtB,eAAcsN,EAAAA,MAAMtN,EAAK,EAAE,EAC3B,SAAU2Q,IAAY3Q,EAAK,GAAK,EAAI,GAEnC,SAAA,CAAA,CAAC6G,GAAY,CAAC8I,GACb3P,EAAK,KAAO8M,GAAc,QACxBA,GAAc,KAAK,CAAC,IAAM,IAC1BrL,EAAAA,IAACoS,GAAAA,OAAA,CACC,KAAK,SACL,IAAI,0CAEJ,SAAApS,EAAAA,IAAC,IAAA,CAAE,UAAU,iCAAA,CAAkC,CAAA,CAAA,EAGjDA,EAAAA,IAAC,MAAA,CAAI,UAAW,eAAiBkS,EAC/B,SAAAlS,EAAAA,IAAC,MAAA,CAAI,UAAU,sBAAA,CAAuB,CAAA,CACxC,EAEA,KAEHzB,EAAK,OAAS,YACb0B,EAAAA,KAAAC,EAAAA,SAAA,CACG,SAAA,CAAA3B,EAAK,UAAY,EAAEsP,GAActP,EAAK,UACrCyB,EAAAA,IAAC,MAAA,CAAI,UAAU,kCACb,SAAAA,EAAAA,IAAC,MAAA,CACC,UAAU,kCACV,MAAO,CAAE,MAAO,GAAGzB,EAAK,QAAQ,GAAA,CAAI,CAAA,EAExC,EACE,KACH,CAAC6G,GACA,EAAEyI,GAActP,EAAK,WACrB,EAAEA,EAAK,OAAS,WAAauP,GAAS,cACtC9N,EAAAA,IAAC,MAAA,CACC,UAAU,iCACV,MAAO,CAAE,KAAM,QAAQzB,EAAK,QAAQ,WAAA,EAEnC,SAAAA,EAAK,QAAA,CAAA,EAEN,KACHsO,EACC7M,EAAAA,IAAC6M,EAAA,CAAa,KAAMtO,EAAM,IAAAgB,EAAU,SAAUqS,CAAA,CAAS,EACrD/D,GAActP,EAAK,SACrByB,EAAAA,IAAC8L,GAAA,CAAY,KAAAvN,EAAY,KAAMoT,EAAYpT,EAAK,IAAI,CAAA,CAAG,EAEvDyB,EAAAA,IAAC,MAAA,CAAI,UAAU,yBACZ,SAAAzB,EAAK,MAAQ,EAAA,CAChB,CAAA,CAAA,CAEJ,EAEA0B,EAAAA,KAAAC,EAAAA,SAAA,CACE,SAAA,CAAAF,EAAAA,IAAC,MAAA,CAAI,UAAU,wBAAA,CAAyB,EACvC6M,EACC7M,EAAAA,IAAC6M,EAAA,CAAa,KAAMtO,EAAM,IAAAgB,EAAU,SAAUqS,CAAA,CAAS,EAEvD5R,EAAAA,IAAC,MAAA,CAAI,UAAU,0BAA2B,WAAK,IAAA,CAAK,CAAA,EAExD,EAGD,CAACoF,GAAY,CAAC8I,GACb3P,EAAK,KAAO8M,GAAc,QACxBA,GAAc,KAAK,CAAC,IAAM,IAC1BrL,EAAAA,IAACoS,GAAAA,OAAA,CACC,KAAK,SACL,IAAI,2CAEJ,SAAApS,EAAAA,IAAC,IAAA,CAAE,UAAU,iCAAA,CAAkC,CAAA,CAAA,EAGjDA,EAAAA,IAAC,MAAA,CAAI,UAAW,eAAiBmS,EAC/B,SAAAnS,EAAAA,IAAC,MAAA,CAAI,UAAU,sBAAA,CAAuB,CAAA,CACxC,EAEA,IAAA,CAAA,CAAA,EAGPwN,GAAWC,IAAWlP,EAAK,EAAE,EAC1BkP,EAASlP,EAAK,EAAE,EAAE,IAAI,CAACmO,GAAQT,WAC5BQ,GAAA,CAAgB,OAAAC,GAAgB,OAAQnO,CAAA,EAA3B0N,EAAiC,CAChD,EACD,KACHqB,GAAkB,CAAC/O,EAAK,eACvByB,EAAAA,IAAC,MAAA,CACC,UACE,2BACCzB,EAAK,OAAS,YAAc,gBAAkB,IAEjD,MAAOgT,EAAchT,CAAI,CAAA,CAAA,EAEzB,IAAA,CAAA,EAhGSA,EAAK,EAiGpB,CAEJ,CAAC,CAAA,CAAA,CAAA,CAGP,CCvvBA,SAAS8T,GAAOpT,EAAKqT,EAAOC,EAAM,CAChC,MAAMrO,EAAQjF,EAAI,MAClB,IAAIuT,EAAO,EACPxE,EAAQ9J,EAAM,OACdb,EAAM,EACV,QAAS4I,EAAI,EAAGA,EAAI/H,EAAM,OAAQ+H,IAAK,CACrC,GAAI5I,EAAMa,EAAM+H,CAAC,EAAE,MAAQqG,EAAO,CAChCtE,EAAQ/B,EACRuG,EAAOnP,EACP,KACF,CACAA,GAAOa,EAAM+H,CAAC,EAAE,KAClB,CACA,IAAIhO,EAAM+P,EACV,KAAO/P,EAAMiG,EAAM,QAAUb,EAAMkP,GACjClP,GAAOa,EAAMjG,CAAG,EAAE,MAClBA,IAEF,MAAO,CAAE,KAAAuU,EAAM,MAAOtO,EAAM,MAAM8J,EAAO/P,CAAG,CAAA,CAC9C,CAEA,SAASwU,GAAUzT,EAAO,CACxB,KAAM,CAAE,IAAAO,GAAQP,EAEV8E,EAASpE,EAAAA,SAASH,EAAK,SAAS,EAChCmT,EAAQhT,EAAAA,SAASH,EAAK,OAAO,EAC7BoT,EAAgBjT,EAAAA,SAASH,EAAK,eAAe,EAE7CqT,EAAetT,EAAAA,QAAQ,IAAM,CACjC,MAAMuT,EAAO/O,EAAO,KACdgP,EAAYD,EAAK,OAAS,EAEhC,OAAOA,EAAK,IAAI,CAAC5T,EAAKuJ,IAChBA,IAAOsK,EACF,CACL,OAAQ7T,EAAI,OACZ,KAAMyT,EAAM,KACZ,MAAOzT,EAAI,MAAM,MAAMyT,EAAM,MAAOA,EAAM,GAAG,CAAA,EAG1C,CACL,OAAQzT,EAAI,OACZ,GAAGoT,GAAOpT,EAAKyT,EAAM,KAAMA,EAAM,EAAE,CAAA,CAEtC,CACH,EAAG,CAAC5O,EAAQ4O,CAAK,CAAC,EAElB,OACE1S,EAAAA,IAAC,MAAA,CAAI,UAAU,uBAAuB,MAAO,CAAE,MAAO8D,EAAO,KAAA,EAC1D,SAAA8O,EAAa,IAAI,CAACG,EAAGC,IACpBhT,EAAAA,IAAC,MAAA,CACC,UAAU,qBACV,MAAO,CAAE,OAAQ,GAAG+S,EAAE,MAAM,KAAM,YAAa,GAAGA,EAAE,IAAI,IAAA,EAGvD,SAAAA,EAAE,MAAM,IAAI,CAACrS,EAAMuS,IAAY,CAC9B,MAAMC,EAAaP,EACfA,EAAcjS,EAAK,KAAMA,EAAK,IAAI,EAClC,GACEkL,EACJ,YAAclL,EAAK,KAAO,IAAM,KAAOwS,GAAc,IACvD,OACElT,EAAAA,IAAC,MAAA,CACC,UAAW,eAAiB4L,EAC5B,MAAO,CAAE,MAAO,GAAGlL,EAAK,KAAK,IAAA,EAG7B,SAAAV,EAAAA,IAAC,OAAA,CACC,UACE,eAAiBU,EAAK,MAAQ,IAAM,iBAAmB,IAGxD,SAAAA,EAAK,KAAA,CAAA,CACR,EARKuS,CAAA,CAWX,CAAC,CAAA,EAvBID,CAAA,CAyBR,EACH,CAEJ,CCvFA,MAAMG,GAAgB,KAEtB,SAASC,GAAMvT,EAAOwT,EAAKlQ,EAAK,CAC9B,OAAO,KAAK,IAAI,KAAK,IAAItD,EAAOsD,CAAG,EAAGkQ,CAAG,CAC3C,CAEO,SAASC,GAAuB/T,EAAKgU,EAASC,EAAc,CACjE,IAAIC,EAAU,GACVC,EAAgB,YAAY,IAAG,EAEnC,SAASC,EAAcC,EAAS,CAE9B,MAAMC,EADa,KAAK,IAAID,CAAO,EAAI,GACN,KAAQ,IACnCE,EAAM,YAAY,IAAG,EACrBC,EAAK,KAAK,IAAID,EAAMJ,EAAe,EAAE,EAC3CA,EAAgBI,EAChB,MAAME,EAAaZ,GACjB,CAACQ,EAAUC,EACX,CAACV,GAAgBY,EACjBZ,GAAgBY,CACtB,EACI,OAAO,KAAK,IAAIC,CAAU,CAC5B,CAEA,OAAO,SAAiBhN,EAAG,CACzB,GAAIuM,EAAO,IAAOvM,EAAE,SAAWA,EAAE,SAAU,CACzCA,EAAE,eAAc,EAChB,MAAMiN,EAAQN,EAAc3M,EAAE,MAAM,EAC9BkN,EAASlN,EAAE,QAAUwM,EAAY,EAAG,sBAAqB,EAAG,KAC7DC,IACHA,EAAU,GACV,sBAAsB,IAAM,CAC1BlU,EAAI,KAAK,aAAc,CACrB,IAAK0U,EAAQ,EAAI,EAAI,GACrB,MAAO,KAAK,IAAI,EAAIA,CAAK,EACzB,OAAAC,CACZ,CAAW,EACDT,EAAU,EACZ,CAAC,EAEL,CACF,CACF,CCxCA,MAAMU,GAAgB,IAAI,IAEnB,SAASC,GAAcC,EAAO,CACnC,MAAMC,EAAYnN,EAAAA,OAAO,IAAI,EACvBoN,EAAcpN,EAAAA,OAAO,CAAC,EACtBqN,EAASrN,EAAAA,OAAO,IAAI,EAEpBsN,EACJ,OAAO,OAAW,KAAe,OAAO,2BAEtCH,EAAU,UAAY,OACxBA,EAAU,QAAU,YAAY,IAAG,GAErCC,EAAY,UAEZ9M,EAAAA,UAAU,IAAM,CACd,GAAKgN,EAEL,4BAAqBD,EAAO,OAAO,EAEnCA,EAAO,QAAU,sBAAsB,IAAM,CAC3C,MAAME,EAAS,CACb,MAAAL,EACA,KAAM,YAAY,IAAG,EAAKC,EAAU,QACpC,QAASC,EAAY,QACrB,UAAW,KAAK,IAAG,CAC3B,EAEMJ,GAAc,IAAIE,EAAOK,CAAM,EAE/B,OAAO,cACL,IAAI,YAAY,gBAAiB,CAAE,OAAQA,CAAM,CAAE,CAC3D,CACI,CAAC,EAEM,IAAM,qBAAqBF,EAAO,OAAO,CAClD,CAAC,CACH,CCnBA,SAASG,GAAM3V,EAAO,CACpB,KAAM,CAAE,SAAAoG,EAAU,UAAAwP,EAAW,WAAAC,EAAY,aAAAC,GAAiB9V,EAEpDO,EAAMJ,EAAAA,WAAWK,EAAY,EAE7B,CAACuV,EAAUC,CAAe,EAAIhI,EAAAA,oBAAoBzN,EAAK,WAAW,EAClE0V,EAAavV,EAAAA,SAASH,EAAK,WAAW,EACtC2V,EAAcxV,EAAAA,SAASH,EAAK,YAAY,EACxC2C,EAAaxC,EAAAA,SAASH,EAAK,YAAY,EACvC4V,EAASzV,EAAAA,SAASH,EAAK,QAAQ,EAC/BI,EAAYD,EAAAA,SAASH,EAAK,WAAW,EACrCuE,EAASpE,EAAAA,SAASH,EAAK,SAAS,EAChC6V,EAAO1V,EAAAA,SAASH,EAAK,MAAM,EAC3BE,EAAUC,EAAAA,SAASH,EAAK,SAAS,EACjCmT,EAAQhT,EAAAA,SAASH,EAAK,OAAO,EAC7B8V,EAAO3V,EAAAA,SAASH,EAAK,MAAM,EAC3B+V,GAAY5V,EAAAA,SAASH,EAAK,YAAY,EACtCgW,EAAU7V,EAAAA,SAASH,EAAK,UAAU,EAClCoT,EAAgBjT,EAAAA,SAASH,EAAK,eAAe,EAE7C,CAACiW,EAAaC,CAAc,EAAIlQ,WAAA,EAChCmQ,EAAWvO,EAAAA,OAAO,IAAI,EACtBwO,GAAiBxO,EAAAA,OAAO,CAAE,IAAK,KAAM,KAAM,KAAM,EACjDyO,EAAkBzO,EAAAA,OAAO,EAAK,EAE9B0O,EAAY,EACZC,EAAcxW,EAAAA,QAAQ,IAAM,CAChC,MAAMuI,EAAI,CAAA,EACV,OAAIkN,GAAYA,EAAS,QAAU7S,GACjC6S,EAAS,QAASgB,GAAQ,CACxBlO,EAAE,KAAK,CAAE,OAAQ,GAAG3F,CAAU,KAAM,IAAK,GAAG6T,EAAI,GAAK,CAAC,IAAA,CAAM,CAC9D,CAAC,EAEIlO,CACT,EAAG,CAACmN,EAAiB9S,CAAU,CAAC,EAE1B8T,EAAkB1W,EAAAA,QACtB,IAAM,KAAK,IAAIkW,GAAe,EAAGX,CAAU,EAC3C,CAACW,EAAaX,CAAU,CAAA,EAG1BjM,EAAAA,gBAAgB,IAAM,CACpB,MAAMqG,EAAKyG,EAAS,QACpB,GAAKzG,EAEL,IAAI2G,EAAgB,QAAS,CAC3BA,EAAgB,QAAU,GAC1B,MACF,CAEI,OAAOX,GAAe,WACxBU,GAAe,QAAQ,IAAMV,EAC7BhG,EAAG,UAAYgG,GAEb,OAAOC,GAAgB,WACzBS,GAAe,QAAQ,KAAOT,EAC9BjG,EAAG,WAAaiG,GAEpB,EAAG,CAACD,EAAYC,CAAW,CAAC,EAE5B,MAAMe,EAAW,IAAM,CACrB,MAAMhH,EAAKyG,EAAS,QACfzG,GACDA,EAAG,aAAe0G,GAAe,QAAQ,OAC3CA,GAAe,QAAQ,KAAO1G,EAAG,WACjC2G,EAAgB,QAAU,GAC1BrW,EAAI,KAAK,eAAgB,CAAE,KAAM0P,EAAG,WAAY,EAEpD,EAEA,SAASiH,GAAc,CAErB,MAAMC,EAAM,KAAK,MADSX,GAAe,IACEtT,GAAc,EAAE,EAAI,EACzDkU,GAAM,KAAK,OAAOnB,GAAc,IAAM/S,GAAc,EAAE,EACtD8L,GAAQ,KAAK,IAAI,EAAGoI,GAAMP,CAAS,EACnC5X,GAAMmY,GAAMD,EAAMN,EAClBrD,EAAOxE,IAAS9L,GAAc,GACpC3C,EAAI,KAAK,cAAe,CACtB,MAAAyO,GACA,IAAA/P,GACA,KAAAuU,CAAA,CACD,CACH,CAEA/K,EAAAA,UAAU,IAAM,CACdyO,EAAA,CACF,EAAG,CAACjB,EAAYO,EAAatT,CAAU,CAAC,EAExC,MAAMmU,EAAUlP,EAAAA,OAAOkO,CAAI,EAC3BgB,EAAQ,QAAUhB,EAElB,MAAMiB,EAAUhX,EAAAA,QACd,IACEgU,GACE/T,EACA,IAAM8W,EAAQ,QACd,IAAMX,EAAS,OAAA,EAEnB,CAACnW,CAAG,CAAA,EAGN,SAASgX,EAAW7V,EAAM,CACxB,MAAMqE,EAAQ4N,IAAgBjS,EAAK,KAAMA,EAAK,IAAI,EAClD,OAAIqE,EACK,CACL,IAAKA,EACL,MAAOrE,EAAK,KAAA,EAET,IACT,CAEA,MAAM8V,EAAWlX,EAAAA,QAAQ,IAClBqT,EACS7O,EAAO,KAAKA,EAAO,KAAK,OAAS,CAAC,EAAE,MACrC,MAAM4O,EAAM,MAAOA,EAAM,GAAG,EAAE,IAAI6D,CAAU,EAF9B,KAG1B,CAACzS,EAAQ6O,EAAeD,CAAK,CAAC,EAE3B+D,GAAgBnX,EAAAA,QAAQ,IAAM,CAElC,MAAM4E,EADMJ,EAAO,KAAKA,EAAO,KAAK,OAAS,CAAC,GAC3B,MACnB,OAAQA,EAAO,UAAY,QAAUA,EAAO,UAAY,QAAUI,EAC9DA,EAAM,MAAMwO,EAAM,MAAOA,EAAM,GAAG,EAClC,CAAA,CACN,EAAG,CAAC5O,EAAQ4O,CAAK,CAAC,EAEZgE,GAAepX,EAAAA,QACnB,IAAM6V,EAAO,MAAMC,EAAK,MAAOA,EAAK,GAAG,EACvC,CAACD,EAAQC,CAAI,CAAA,EAGf,SAASuB,GAAgBpY,EAAM,CAC7B,GAAIkB,GAAS,QAAU,WAAY,CACjC,GAAIlB,EAAK,UAAW,CAClB,MAAMqY,GAAWrX,EAAI,oBAAoBhB,CAAI,EAC7C,OAAOqY,GAAW,CAACA,EAAQ,EAAI,CAAA,CACjC,CAEA,MAAMC,GAAatY,EAAK,YACxB,OAAIsY,KAAe,QAAaA,KAAe,aAAqB,CAAA,GAEhD,MAAM,QAAQA,EAAU,EAAIA,GAAa,CAACA,EAAU,GAErD,QAAS/W,IAAO,CACjC,MAAMgX,EAAWnX,GAAW,KAAKG,EAAE,EACnC,GAAI,CAACgX,EAAU,MAAO,CAAA,EACtB,MAAMF,GAAWrX,EAAI,oBAAoBuX,CAAQ,EACjD,OAAOF,GAAW,CAACA,EAAQ,EAAI,CAAA,CACjC,CAAC,CACH,CAEA,MAAMA,EAAWrY,EAAK,SAAWgB,EAAI,gBAAgBhB,CAAI,EAAI,OAC7D,OAAOqY,EAAW,CAACA,CAAQ,EAAI,CAAA,CACjC,CAEA,MAAMG,EAAgBzX,EAAAA,QAAQ,IAAM,CAClC,MAAMiN,EAAS,CAAA,EACf,GAAI,CAAC+I,GAAW,OAAO/I,EACvB,MAAMyK,EAAiBzX,EAAI,YAAA,EAC3B,OAAAmX,GAAa,QAAQ,CAACnY,GAAMqF,KAAU,CACpC,MAAMqT,GAAeN,GAAgBpY,EAAI,EACpC0Y,GAAa,QAClBR,GAAc,QAAQ,CAAC/V,EAAMwW,KAAc,CACzC,MAAMC,GAAsBF,GAAa,OACtCG,IAAQ,CAACA,GAAI,aAAa1W,EAAK,IAAI,CAAA,EAEhC2W,GAAkBF,GAAoB,SAAW,EACjDG,GACJN,GAAkB,CAACA,EAAe,aAAatW,EAAK,IAAI,EAEpD6W,GAAa,CACjB,MAAO7W,EAAK,MACZ,OAAQwB,EACR,MAAOgV,GAAYxE,EAAM,OAAShS,EAAK,MACvC,IAAK0U,EAAK,KAAOxR,GAAQ1B,CAAA,EAG3B,IAAIiH,GAAM,GACLkO,KAIHlO,GAAM,CAAC,aAAc,GAHPgO,GACX,IAAKC,IAAQA,GAAI,GAAG,EACpB,OAAO,OAAO,CACY,EAAE,KAAK,GAAG,GAErCC,IAAmBC,KAAiBnO,GAAM,uBAE1CA,IAAKoD,EAAO,KAAK,CAAE,GAAGgL,GAAY,IAAApO,GAAK,CAC7C,CAAC,CACH,CAAC,EACMoD,CACT,EAAG,CACD+I,GACAoB,GACAD,GACAvU,EACAwQ,EACA0C,EACA3V,EACAE,EACAJ,CAAA,CACD,EAEKyK,EAAelD,EAAAA,YAClBvK,GAAO,CACNA,EAAG,YAAc,QACjBgD,EAAI,KAAK,SAAUhD,CAAE,CACvB,EACA,CAACgD,CAAG,CAAA,EAGNkI,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMwH,EAAKyG,EAAS,QACpB,GAAI,CAACzG,EAAI,OACT,MAAMvH,EAAS,IAAM+N,EAAexG,EAAG,YAAY,EACnDvH,EAAA,EACA,MAAMC,GAAK,IAAI,eAAe,IAAMD,GAAQ,EAC5C,OAAAC,GAAG,QAAQsH,CAAE,EACN,IAAM,CACXtH,GAAG,WAAA,CACL,CACF,EAAG,CAAC+N,EAAS,OAAO,CAAC,EAErBjO,EAAAA,UAAU,IAAM,CACd,MAAMwH,EAAKyG,EAAS,QACpB,GAAI,CAACzG,EAAI,OACT,MAAMuI,EAAUC,GAAAA,QAAQxI,EAAI,CAC1B,KAAM,CACJ,QAAS,GACT,UAAW,EAAA,EAEb,KAAOxK,IAAMuF,EAAavF,EAAC,CAAA,CAC5B,EACD,MAAO,IAAM,CACX+S,GAAS,QAAA,CACX,CACF,EAAG,CAAA,CAAE,EAEL/P,EAAAA,UAAU,IAAM,CACd,MAAMpL,EAAOqZ,EAAS,QACtB,GAAI,CAACrZ,EAAM,OAEX,MAAMqP,EAAU4K,EAChB,OAAAja,EAAK,iBAAiB,QAASqP,CAAO,EAC/B,IAAM,CACXrP,EAAK,oBAAoB,QAASqP,CAAO,CAC3C,CACF,EAAG,CAAC4K,CAAO,CAAC,EAEZlC,GAAc,OAAO,EAGnBnU,EAAAA,KAAC,MAAA,CACC,UAAU,uBACV,SAAU,GACV,IAAKyV,EACL,SAAAO,EAEA,SAAA,CAAAjW,MAAC0X,IAAW,IAAAnY,EAAU,EACrBgW,GAAWA,EAAQ,OAClBvV,EAAAA,IAAC,MAAA,CACC,UAAU,yBACV,MAAO,CAAE,OAAQ,GAAGgW,CAAe,IAAA,EAElC,SAAAT,EAAQ,IAAI,CAACpF,EAAQlE,IACpBjM,EAAAA,IAAC,MAAA,CAEC,UAAW,yBAAyBmQ,EAAO,KAAO,EAAE,GACpD,MAAO,CAAE,KAAM,GAAGA,EAAO,IAAI,IAAA,EAE7B,SAAAnQ,EAAAA,IAAC,MAAA,CAAI,UAAU,yBAA0B,WAAO,IAAA,CAAK,CAAA,EAJhDiM,CAAA,CAMR,CAAA,CAAA,EAED,KAEJhM,EAAAA,KAAC,MAAA,CACC,UAAU,sBACV,MAAO,CAAE,MAAO,GAAG2U,CAAS,KAAM,OAAQ,GAAGoB,CAAe,IAAA,EAE3D,SAAA,CAAAQ,EACCxW,EAAAA,IAAC,MAAA,CACC,UAAU,gCACV,MAAO,CAAE,OAAQ,MAAA,EAEhB,SAAAwW,EAAS,IAAI,CAACmB,EAAS1L,IACtB0L,EACE3X,EAAAA,IAAC,MAAA,CAEC,UAAW,eAAiB2X,EAAQ,IACpC,MAAO,CACL,MAAO,GAAGA,EAAQ,KAAK,KACvB,KAAM,GAAGjF,EAAM,KAAOzG,EAAI0L,EAAQ,KAAK,IAAA,CACzC,EALK1L,CAAA,EAOL,IAAA,CACN,CAAA,EAEA,KAEH8K,EAAc,IAAI,CAAC9X,EAAK2E,IACvB5D,EAAAA,IAAC,MAAA,CAEC,UAAW,eAAiBf,EAAI,IAChC,MAAO,CACL,SAAU,WACV,cAAe,OACf,MAAO,GAAGA,EAAI,KAAK,KACnB,OAAQ,GAAGA,EAAI,MAAM,KACrB,KAAM,GAAGA,EAAI,IAAI,KACjB,IAAK,GAAGA,EAAI,GAAG,IAAA,CACjB,EATK2E,CAAA,CAWR,EAEAmR,GAAYA,EAAS,OAClBA,EAAS,IAAI,CAACgB,EAAKnS,IACjBmS,EAAI,GACF/V,EAAAA,IAAC,MAAA,CAEC,UAAU,0BACV,UAAS6L,EAAAA,MAAMkK,EAAI,EAAE,EACrB,MAAOD,EAAYlS,CAAK,CAAA,EAHnBmS,EAAI,EAAA,EAKT,IAAA,EAEN,WAEHpL,GAAA,EAAS,EAEV3K,EAAAA,IAAC4M,GAAA,CAAK,SAAAxH,EAAoB,aAAA0P,CAAA,CAA4B,CAAA,CAAA,CAAA,CACxD,CAAA,CAAA,CAGN,CC5VA,SAAS8C,GAAQ5Y,EAAO,CACtB,KAAM,CACJ,IAAAO,EACA,SAAAsY,EAAW,QACX,KAAAC,EAAO,EACP,IAAAC,EAAM,IACN,OAAAC,EACA,eAAAlV,EAAiB,EACjB,eAAAmV,EAAiB,EAAA,EACfjZ,EAEEyD,EAAY/C,EAAAA,SAASH,EAAK,WAAW,EACrC6C,EAAc1C,EAAAA,SAASH,EAAK,aAAa,EACzC2Y,EAAwBxY,EAAAA,SAASH,EAAK,wBAAwB,EAC9DsD,EAAcnD,EAAAA,SAASH,EAAK,cAAc,EAEhD,SAAS4Y,EAAOtY,EAAO,CACrB,IAAIqU,EAAS,EACT2D,IAAa,SAAU3D,EAAS4D,EAAO,EAClCD,IAAa,WAAU3D,EAAS4D,GAEzC,MAAMtb,EAAM,CACV,KAAM,CAACsb,EAAO,KAAM,MAAM,EAC1B,EAAG,CAACjY,EAAQqU,EAAS,KAAM,KAAK,EAChC,GAAI,CAAC,OAAQ,KAAK,CAAA,EAGpB,GAAI6D,IAAQ,IACV,QAASK,KAAQ5b,EAAKA,EAAI4b,CAAI,EAAI5b,EAAI4b,CAAI,EAAE,QAAA,EAE9C,OAAO5b,CACT,CAEA,MAAM6b,EAAWlR,EAAAA,OAAO,CAAC,EACnBmR,EAASnR,EAAAA,OAAA,EACToR,EAAapR,EAAAA,OAAA,EAEbqR,EAAerR,EAAAA,OAAO1E,CAAS,EACrC+V,EAAa,QAAU/V,EACvB,MAAMgW,EAAiBtR,EAAAA,OAAO/E,CAAW,EACzCqW,EAAe,QAAUrW,EACzB,MAAMsW,GAAiBvR,EAAAA,OAAOtE,CAAW,EACzC6V,GAAe,QAAU7V,EACzB,MAAM8V,EAA2BxR,EAAAA,OAAO+Q,CAAqB,EAC7DS,EAAyB,QAAUT,EAEnC,SAASU,EAAYrc,EAAI,CACvB,OAAOwb,IAAQ,IAAMxb,EAAG,QAAUA,EAAG,OACvC,CAEA,MAAMsc,EAASvZ,EAAAA,QACb,IACE8C,IAAgB,MAAQ,OAAS2V,IAAQ,IAAM,YAAc,YAC/D,CAAC3V,EAAa2V,CAAG,CAAA,EAGb5Z,EAAO2I,EAAAA,YACVvK,GAAO,CACN,MAAMuc,EAASR,EAAO,QAAUM,EAAYrc,CAAE,EAAI8b,EAAS,QAE3D9Y,EAAI,KAAK,cAAe,CACtB,MAAOuZ,CAAA,CACR,EACD,IAAIC,EAEAD,GAAUH,EAAyB,QACrCI,EAAc,QACLjW,EAAiBgW,GAAUb,EACpCc,EAAc,OAEdA,EAAc,MAGZN,EAAe,UAAYM,GAC7BxZ,EAAI,KAAK,mBAAoB,CAC3B,KAAMwZ,CAAA,CACP,EAGCR,EAAW,SAAS,aAAaA,EAAW,OAAO,EACvDA,EAAW,QAAU,WACnB,IAAMP,GAAUA,EAAOc,CAAM,EAC7B,GAAA,CAEJ,EACA,CAACvZ,EAAKuD,EAAgBmV,EAAgBD,EAAQD,CAAG,CAAA,EAG7CvZ,EAAKsI,EAAAA,YAAY,IAAM,CAC3B,SAAS,KAAK,MAAM,OAAS,GAC7B,SAAS,KAAK,MAAM,WAAa,GACjC,OAAO,oBAAoB,YAAa3I,CAAI,EAC5C,OAAO,oBAAoB,UAAWK,CAAE,CAC1C,EAAG,CAACL,CAAI,CAAC,EAEHZ,GAAOuJ,EAAAA,YACVvK,GAAO,CAGJmc,GAAe,SACfD,EAAe,UAAY,QAC3BA,EAAe,UAAY,UAK7BJ,EAAS,QAAUO,EAAYrc,CAAE,EACjC+b,EAAO,QAAUE,EAAa,QAE9B,SAAS,KAAK,MAAM,OAASK,EAC7B,SAAS,KAAK,MAAM,WAAa,OAEjC,OAAO,iBAAiB,YAAa1a,CAAI,EACzC,OAAO,iBAAiB,UAAWK,CAAE,EACvC,EACA,CAACqa,EAAQ1a,EAAMK,EAAIuZ,CAAG,CAAA,EAGxB,SAASiB,EAAaC,EAAW,CAC/B,IAAI/Q,EACArF,EACFqF,EAAO9F,IAAgB,QAAU,OAAS,QAEtCA,IAAgB,QAAUA,IAAgB,QAC5C8F,EAAO,MACFA,EAAO+Q,IAAc,OAAS,QAAU,OAGjD1Z,EAAI,KAAK,mBAAoB,CAAE,KAAA2I,CAAA,CAAM,CACvC,CAEA,SAASgR,GAAmB,CAC1BF,EAAa,MAAM,CACrB,CAEA,SAASG,GAAoB,CAC3BH,EAAa,OAAO,CACtB,CAEA,MAAMI,EAAI9Z,EAAAA,QACR,IAAM6Y,EAAO1V,CAAS,EACtB,CAACA,EAAWoV,EAAUC,EAAMC,CAAG,CAAA,EAG3BsB,EAAgB,CACpB,aACA,cAActB,CAAG,GACjB,sBAAsB3V,CAAW,EAAA,EAEhC,OAAO,OAAO,EACd,KAAK,GAAG,EAEX,OACEnC,EAAAA,KAAC,MAAA,CACC,UAAW,eAAiBoZ,EAC5B,YAAa9b,GACb,MAAO,CAAE,MAAO6b,EAAE,KAAK,CAAC,EAAG,OAAQA,EAAE,KAAK,CAAC,EAAG,OAAAP,CAAA,EAE9C,SAAA,CAAA5Y,EAAAA,KAAC,MAAA,CAAI,UAAU,mCACb,SAAA,CAAAD,EAAAA,IAAC,MAAA,CAAI,UAAU,6DACb,SAAAA,EAAAA,IAAC,IAAA,CACC,UAAU,4BACV,QAASkZ,CAAA,CAAA,EAEb,EACAlZ,EAAAA,IAAC,MAAA,CAAI,UAAU,8DACb,SAAAA,EAAAA,IAAC,IAAA,CACC,UAAU,6BACV,QAASmZ,CAAA,CAAA,CACV,CACH,CAAA,EACF,EACAnZ,EAAAA,IAAC,MAAA,CAAI,UAAU,6BAAA,CAA8B,CAAA,CAAA,CAAA,CAGnD,CClKA,SAASsZ,GAAOta,EAAO,CACrB,KAAM,CAAE,aAAA8V,EAAc,SAAA1P,EAAU,iBAAAC,EAAkB,mBAAAkU,GAAuBva,EAEnEO,EAAMJ,EAAAA,WAAWK,EAAY,EAE7B2V,EAASzV,EAAAA,SAASH,EAAK,QAAQ,EAC/Bia,EAAU9Z,EAAAA,SAASH,EAAK,SAAS,EACjCka,EAAc/Z,EAAAA,SAASH,EAAK,YAAY,EACxCma,EAAWha,EAAAA,SAASH,EAAK,SAAS,EAClC0V,EAAavV,EAAAA,SAASH,EAAK,WAAW,EACtCoa,EAAOja,EAAAA,SAASH,EAAK,MAAM,EAC3Bqa,EAAela,EAAAA,SAASH,EAAK,eAAe,EAE5C,CAACsa,EAAYC,CAAa,EAAIC,EAAAA,gBAAgB/a,EAAM,UAAU,EAC9D,CAACgb,EAAaC,CAAc,EAAI1U,EAAAA,SAAS,CAAC,EAC1C,CAAC2U,EAAYC,EAAa,EAAI5U,EAAAA,SAAS,MAAS,EAEhD6U,EAAa9a,EAAAA,QACjB,KAAOua,GAAc,IAAMK,GAAc,GACzC,CAACL,EAAYK,CAAU,CAAA,EAEnBtF,EAAYtV,EAAAA,QAAQ,IAAMka,EAAQ,MAAO,CAACA,CAAO,CAAC,EAClD3E,EAAavV,EAAAA,QACjB,IAAM6V,EAAO,OAASsE,EACtB,CAACtE,EAAQsE,CAAW,CAAA,EAEhBY,EAAe/a,EAAAA,QACnB,IAAMka,EAAQ,OAAS3E,EAAauF,EACpC,CAACZ,EAAS3E,EAAYuF,CAAU,CAAA,EAG5B1E,EAAWvO,EAAAA,OAAO,IAAI,EAEtBmT,GAAenT,EAAAA,OAAO,CAC1B,WAAY,EACZ,aAAc,EACd,YAAa,EACb,cAAe,EACf,WAAY,CAAA,CACb,EAEDM,EAAAA,UAAU,IAAM,CACd6S,GAAa,QAAU,CACrB,WAAYT,GAAc,EAC1B,aAAAD,EACA,YAAaI,GAAe,EAC5B,cAAeR,EAAQ,OACvB,WAAAY,CAAA,CAEJ,EAAG,CAACP,EAAYD,EAAcI,EAAaR,EAASY,CAAU,CAAC,EAE/D,MAAMG,EAAqBzT,EAAAA,YAAY,IAAM,CAC3C,KAAM,CACJ,WAAY0T,EACZ,aAAcC,EACd,YAAaC,EACb,cAAeC,GACf,WAAYC,EAAA,EACVN,GAAa,QACjB/a,EAAI,KAAK,eAAgB,CACvB,MAAOib,EAAKC,EAAKG,GAAK,EACtB,OAAQF,EAAKC,GACb,WAAYC,EAAA,CACb,CACH,EAAG,CAACrb,CAAG,CAAC,EAERkI,EAAAA,UAAU,IAAM,CACd,IAAIE,EACJ,OAAI+N,EAAS,UACX/N,EAAK,IAAI,eAAe4S,CAAkB,EAC1C5S,EAAG,QAAQ+N,EAAS,OAAO,GAEtB,IAAM,CACP/N,KAAO,WAAA,CACb,CACF,EAAG,CAAC+N,EAAS,QAAS6E,CAAkB,CAAC,EAEzC,MAAMM,EAAc1T,EAAAA,OAAO,IAAI,EACzB2T,EAAgB3T,EAAAA,OAAO,IAAI,EAC3B4T,EAAoB5T,EAAAA,OAAO,IAAI,EAC/ByO,EAAkBzO,EAAAA,OAAO,EAAK,EAE9B8O,EAAWnP,EAAAA,YAAY,IAAM,CACjC,MAAMmI,EAAK4L,EAAY,QACnB5L,GAAMA,EAAG,YAAc8L,EAAkB,UAC3CA,EAAkB,QAAU9L,EAAG,UAC/B2G,EAAgB,QAAU,GAC1BrW,EAAI,KAAK,eAAgB,CACvB,IAAK0P,EAAG,SAAA,CACT,EAEL,EAAG,CAAC1P,CAAG,CAAC,EAERkI,EAAAA,UAAU,IAAM,CACd,MAAMuT,EAAWH,EAAY,QACvBI,EAAaH,EAAc,QACjC,GAAI,CAACE,GAAY,CAACC,EAAY,OAC9B,MAAMvT,EAAS,IAAM,CACnBwT,GAAAA,UAAU,IAAM,CACdjB,EAAee,EAAS,YAAY,EACpClB,EAAckB,EAAS,WAAW,EAClCb,GAAcc,EAAW,WAAW,CACtC,CAAC,CACH,EACMtT,GAAK,IAAI,eAAeD,CAAM,EACpC,OAAAC,GAAG,QAAQqT,CAAQ,EACZ,IAAMrT,GAAG,WAAA,CAClB,EAAG,CAACkT,EAAY,OAAO,CAAC,EAExBpT,EAAAA,UAAU,IAAM,CACV8R,KAAuCM,CAAU,CACvD,EAAG,CAACA,EAAYN,CAAkB,CAAC,EAEnC9R,EAAAA,UAAU,IAAM,CACd,MAAMuT,EAAWH,EAAY,QAC7B,GAAKG,EAGL,IAAIpF,EAAgB,QAAS,CAC3BA,EAAgB,QAAU,GAC1B,MACF,CAEIX,IAAe+F,EAAS,YAC1BD,EAAkB,QAAU9F,EAC5B+F,EAAS,UAAY/F,GAEzB,EAAG,CAACA,CAAU,CAAC,EAEf,MAAMkG,EAAYhU,EAAAA,OAAO,IAAI,EAE7BM,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMpL,EAAO8e,EAAU,QACvB,GAAI,CAAC9e,EAAM,OAEX,MAAMmb,EAAUC,GAAAA,QAAQpb,EAAM,CAC5B,KAAM,CACJ,SAAU,GACV,SAAU,GACV,SAAU,GACV,SAAU,GACV,UAAW,GACX,SAAUsd,EACV,SAAUA,CAAA,EAEZ,KAAOpd,GAAO,CACPA,EAAG,SAASgD,EAAI,KAAK,SAAUhD,CAAE,CACxC,CAAA,CACD,EAED,MAAO,IAAM,CACXib,GAAS,QAAA,CACX,CACF,EAAG,CAACmC,CAAI,CAAC,QAGN,MAAA,CAAI,UAAU,uBAAuB,IAAKkB,EAAa,SAAA5E,EACtD,SAAAjW,EAAAA,IAAC,MAAA,CACC,UAAU,6BACV,MAAO,CAAE,OAAQqa,EAAc,MAAO,MAAA,EACtC,IAAKS,EAEL,SAAA9a,EAAAA,IAAC,MAAA,CACC,UAAU,uBACV,MAAO,CACL,OAAQga,EACR,MAAOE,CAAA,EAGT,gBAAC,MAAA,CAAI,SAAU,EAAG,UAAU,wBAAwB,IAAKiB,EACtD,SAAA,CAAAzB,EAAS,OACRzZ,EAAAA,KAAAC,EAAAA,SAAA,CACE,SAAA,CAAAF,EAAAA,IAACmF,GAAA,CACC,SAAAC,EACA,WAAAyP,EACA,iBAAAxP,CAAA,CAAA,EAEFrF,EAAAA,IAAC4X,GAAA,CAAQ,eAAgBiC,EAAY,IAAAta,CAAA,CAAU,CAAA,CAAA,CACjD,EACE,KAEJS,EAAAA,IAAC,MAAA,CAAI,UAAU,yBAAyB,IAAK0V,EAC3C,SAAA1V,EAAAA,IAAC2U,GAAA,CACC,SAAAvP,EACA,UAAAwP,EACA,WAAAC,EACA,aAAAC,CAAA,CAAA,CACF,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,EAEJ,CAEJ,CCjNO,SAASsG,GAAe/b,EAAG,CAChC,MAAO,CACL,KAAM,KACN,QAAS,GAAGA,EAAE,GAAG,CAAC,MAClB,MAAO,KACP,KAAM,GAAGA,EAAE,MAAM,CAAC,MAClB,IAAK,QACL,KAAM,OACV,CACA,CAEA,SAASgc,GAAmBxb,EAAOyb,EAAgB,CACjD,OAAO,OAAOzb,GAAU,WACpBA,EACA0b,EAAAA,aAAa1b,EAAOyb,CAAc,CACxC,CAEO,SAASE,GAAc1X,EAAQwX,EAAgB,CACpD,OAAOxX,EAAO,IAAI,CAAC,CAAE,OAAA2X,EAAQ,GAAGC,CAAK,KAAQ,CAC3C,GAAGA,EACH,OAAQL,GAAmBI,EAAQH,CAAc,CACrD,EAAI,CACJ,CAEO,SAASK,GAAeL,EAAgBjc,EAAG,CAChD,MAAMuc,EAAUR,GAAe/b,CAAC,EAChC,QAASwc,KAAQD,EACfA,EAAQC,CAAI,EAAIN,EAAAA,aAAaK,EAAQC,CAAI,EAAGP,CAAc,EAE5D,OAAOM,CACT,CAEO,SAASE,GAAetZ,EAAS8Y,EAAgB,CACtD,GAAI,CAAC9Y,GAAW,CAACA,EAAQ,OAAQ,OAAOA,EACxC,MAAMiZ,EAASF,EAAAA,aAAa,WAAYD,CAAc,EAEtD,OAAO9Y,EAAQ,IAAKjC,GACdA,EAAI,SAAiBA,EAErBA,EAAI,KAAO,SAAWA,EAAI,KAAO,MAC5B,CACL,GAAGA,EAEH,UAAY6Y,GAAMqC,EAAOrC,CAAC,EAC1B,SAAWA,GAAMqC,EAAOrC,CAAC,CACjC,EAEQ7Y,EAAI,KAAO,WACN,CACL,GAAGA,EACH,UAAY6Y,GAAMA,EAClB,SAAWA,GAAMA,CACzB,EAEW7Y,CACR,CACH,CAEO,SAASwb,GAAY1G,EAAMiG,EAAgB,CAChD,OAAKjG,EAAK,OAIH,CACL,GAAGA,EACH,OAAQA,EAAK,OAAO,IAAK2G,IAAW,CAClC,GAAGA,EACH,OAAQR,GAAcQ,EAAM,OAAQV,CAAc,CACxD,EAAM,CACN,EATWjG,CAUX,CC1BA,MAAM4G,GAAY,GAChB,EACG,MAAM,GAAG,EACT,IAAKC,GAAUA,EAAOA,EAAK,OAAO,CAAC,EAAE,YAAA,EAAgBA,EAAK,MAAM,CAAC,EAAI,EAAG,EACxE,KAAK,EAAE,EAENC,GAAgB,CACpB,CAAE,KAAM,QAAS,KAAM,EAAG,OAAQ,OAAA,EAClC,CAAE,KAAM,MAAO,KAAM,EAAG,OAAQ,IAAA,CAClC,EAEMC,GAAc,CAAA,EACdC,GAAmB,CAAE,KAAM,SAAA,EAC3BC,GAAkB,CAAE,KAAM,SAAA,EAE1BC,GAAgB,IAEhBC,GAAQC,EAAAA,WAAW,SACvB,CACE,aAAA3H,EAAe,KACf,QAAAS,EAAU6G,GACV,UAAAM,EAAYC,GAAAA,iBACZ,MAAApZ,EAAQ6Y,GACR,SAAArH,EAAWqH,GACX,WAAAQ,EAAa,KACb,MAAAtR,EAAQ8Q,GACR,UAAAzc,EAAY,KACZ,YAAAkd,EAAcT,GACd,OAAAtY,EAASqY,GACT,QAAA3Z,EAAU,KACV,MAAAwL,EAAQ,KACR,IAAA/P,EAAM,KACN,WAAA6e,EAAa,MACb,aAAAC,EAAe,MACf,UAAAnS,EAAY,IACZ,WAAA1I,EAAa,GACb,YAAA8a,GAAc,GACd,UAAAva,EAAY,KACZ,YAAAL,EAAc,MACd,SAAAgD,EAAW,GACX,YAAAyF,EAAc,OACd,KAAAwK,EAAO,GACP,UAAA4H,GAAY,GACZ,QAAAzP,EAAU,GACV,cAAAmF,EAAgB,KAChB,KAAAvI,EAAO,KACP,UAAA8S,EAAY,GACZ,iBAAAC,EAAmB,GACnB,aAAA5R,EAAe,KACf,SAAAqC,EAAWyO,GACX,aAAAe,EAAe,KACf,WAAAC,EAAa,KACb,SAAAzG,EAAW,KACX,UAAAtB,GAAY8G,GACZ,KAAAzC,GAAO,GACP,WAAA9L,GAAa,GACb,QAAAC,EAAU,KACV,MAAAC,EAAQ,GACR,QAAAtO,EAAU,KACV,IAAA6d,EAAM,GACN,GAAGC,EACL,EACAC,GACA,CAEA,MAAMC,GAAetW,EAAAA,OAAA,EACrBsW,GAAa,QAAUF,GAGvB,MAAMG,EAAYpe,EAAAA,QAAQ,IAAM,IAAIqe,GAAAA,UAAUC,EAAAA,QAAQ,EAAG,EAAE,EAIrDC,GAAQve,EAAAA,QAAQ,KAAO,CAAE,GAAGwe,GAAAA,GAAQ,GAAGC,GAAAA,EAAA,GAAO,EAAE,EAChDC,GAAU7e,EAAAA,WAAWC,GAAAA,QAAQ,IAAI,EACjC6e,GAAS3e,EAAAA,QAAQ,IAChB0e,GACEA,GAAQ,OAAOH,GAAO,EAAI,EADZzN,EAAAA,OAAEyN,EAAK,EAE3B,CAACG,GAASH,EAAK,CAAC,EAGbK,GAAY5e,EAAAA,QAAQ,IAAM2e,GAAO,SAAS,SAAU,CAACA,EAAM,CAAC,EAI5DE,GAAqB7e,EAAAA,QACzB,IAAM8e,GAAAA,kBAAkB,CAAE,UAAW,CAAC,CAACze,EAAW,IAAA2d,EAAK,EACvD,CAAC3d,EAAW2d,CAAG,CAAA,EAEXe,GAAoB/e,EAAAA,QACxB,IAAMmD,GAAa6b,GAAAA,oBAAoBH,EAAkB,EACzD,CAAC1b,EAAW0b,EAAkB,CAAA,EAG1BI,GAAmBjf,EAAAA,QAAQ,IAAM,CACrC,IAAIxC,EAAS,CACX,KAAMif,GAAY1G,EAAM6I,EAAS,EACjC,OAAQ1C,GAAc1X,EAAQoa,EAAS,EACvC,QAASpC,GAAetZ,GAAW2b,GAAoBD,EAAS,EAChE,MAAA5S,EACA,UAAAV,CAAA,EAEF,OAAI9N,EAAO,OACTA,EAAS,CACP,GAAGA,EACH,GAAG0hB,GAAAA,cACD1hB,EAAO,KACP6e,GAAeuC,GAAWD,GAAO,SAAS,OAAO,CAAC,EAClDnhB,EAAO,OACP8N,CAAA,CACF,GAGG9N,CACT,EAAG,CAACuY,EAAMvR,EAAQtB,EAAS2b,GAAoB7S,EAAOV,EAAWsT,GAAWD,EAAM,CAAC,EAE7EQ,GAAenf,EAAAA,QAAQ,IAAMoe,EAAU,GAAI,CAACA,CAAS,CAAC,EAEtDgB,GAAiBvX,EAAAA,OAAO,IAAI,EAC9BuX,GAAe,UAAY,OAC7BA,GAAe,QAAU,IAAIC,GAAAA,eAAe,CAACjd,EAAG0X,IAAM,CACpD,MAAMhB,EAAO,KAAO6D,GAASva,CAAC,EAC1B+b,GAAa,SAAWA,GAAa,QAAQrF,CAAI,GACnDqF,GAAa,QAAQrF,CAAI,EAAEgB,CAAC,CAEhC,CAAC,EACDqF,GAAa,QAAQC,GAAe,OAAO,GAI7C,KAAM,CAAClZ,GAAUC,EAAW,EAAIF,EAAAA,SAAS,IAAI,EACvCqZ,GAAczX,EAAAA,OAAO,IAAI,EAC/ByX,GAAY,QAAUpZ,GAGtB,KAAM,CAAC3C,GAAagc,EAAc,EAAItZ,EAAAA,SAAS,EAAK,EAC9CgU,GAAqBzS,cAAa2I,GAAU,CAChD,MAAM7N,EAAO6N,GAAS,MAAQA,GAAS8M,GACvCsC,GAAgBld,GAAUA,IAASC,EAAOD,EAAOC,CAAK,CACxD,EAAG,CAAA,CAAE,EAGCrC,EAAMD,EAAAA,QACV,KAAO,CACL,SAAUoe,EAAU,SAAS,KAAKA,CAAS,EAC3C,iBAAkBA,EAAU,YAAY,KAAKA,CAAS,EACtD,UAAW,KAAO,CAAE,KAAMA,IAC1B,KAAMe,GAAa,KACnB,QAAUliB,IACRmiB,GAAe,QAAUA,GAAe,QAAQ,QAAQniB,CAAE,EACnDmiB,GAAe,SAExB,UAAWD,GAAa,UAAU,KAAKA,EAAY,EACnD,GAAIA,GAAa,GAAG,KAAKA,EAAY,EACrC,OAAQA,GAAa,OAAO,KAAKA,EAAY,EAC7C,QAAU3e,GAAO4d,EAAU,QAAQ5d,CAAE,EACrC,YAAcA,GAAO4d,EAAU,YAAY5d,CAAE,EAC7C,UAAYhD,GAAW4gB,EAAU,UAAU5gB,CAAM,EACjD,SAAWgiB,GACTA,EACI,IAAI,QAASC,GAAQ,WAAW,IAAMA,EAAIH,GAAY,OAAO,EAAG,CAAC,CAAC,EAClEA,GAAY,QAClB,WAAY,IAAMlB,EAAU,WAAA,EAC5B,YAAc5d,GAAO4d,EAAU,YAAY5d,CAAE,EAC7C,gBAAkBvB,GAASmf,EAAU,gBAAgBnf,CAAI,EACzD,oBAAsBuY,GACpB4G,EAAU,oBAAoB5G,CAAQ,EACxC,iBAAmBhX,GAAO4d,EAAU,iBAAiB5d,CAAE,EACvD,iBAAmBA,GAAO4d,EAAU,iBAAiB5d,CAAE,CAAA,GAEzD,CAAC4d,EAAWe,EAAY,CAAA,EAIpBO,EAAW1f,EAAAA,QACf,KAAO,CACL,iBAAkBoe,EAAU,YAAY,KAAKA,CAAS,EACtD,SAAUA,EAAU,SAAS,KAAKA,CAAS,EAC3C,KAAMe,GAAa,KAAK,KAAKA,EAAY,EACzC,QAASf,EAAU,QAAQ,KAAKA,CAAS,EACzC,gBAAiBA,EAAU,gBAAgB,KAAKA,CAAS,EACzD,oBAAqBA,EAAU,oBAAoB,KAAKA,CAAS,EACjE,YAAaA,EAAU,YAAY,KAAKA,CAAS,EACjD,iBAAkBA,EAAU,iBAAiB,KAAKA,CAAS,EAC3D,WAAYA,EAAU,WAAW,KAAKA,CAAS,CAAA,GAEjD,CAACA,EAAWe,EAAY,CAAA,EAI1BQ,EAAAA,oBACEzB,GACA,KAAO,CACL,GAAGje,CAAA,GAEL,CAACA,CAAG,CAAA,EAGN,MAAM2f,GAAgB5f,EAAAA,QACpB,IAAOkO,IAAY,GAAO8O,GAAkB9O,EAC5C,CAACA,CAAO,CAAA,EAGJ2R,EAAc7f,EAAAA,QAClB,KAAO,CACL,MAAAiE,EACA,MAAOgb,GAAiB,MACxB,UAAA5e,EACA,YAAAkd,EACA,MAAA7O,EACA,QAASuQ,GAAiB,QAC1B,IAAAtgB,EACA,WAAA6e,EACA,UAAWyB,GAAiB,UAC5B,WAAArc,EACA,YAAA8a,GACA,OAAQuB,GAAiB,OACzB,UAAA7B,EACA,KAAM6B,GAAiB,KACvB,SAAAxJ,EACA,WAAA6H,EACA,UAAAK,GACA,QAASiC,GACT,UAAAhC,EACA,iBAAAC,EACA,QAAA5H,EACA,aAAAwH,EACA,aAAAxR,EACA,SAAAqC,EACA,aAAAwP,EACA,WAAAC,EACA,SAAAzG,EACA,UAAAtB,GACA,MAAAvH,EACA,KAAA4L,GACA,WAAYuE,GAAU,UACtB,WAAArQ,GACA,QAAAC,EACA,QAAArO,EACA,cAAAkT,EACA,IAAA2K,EACA,YAAAlb,EACA,UAAWic,GACX,YAAAxT,EACA,aAAchI,EAAA,GAEhB,CACEU,EACAgb,GACA5e,EACAkd,EACA7O,EACA/P,EACA6e,EACA5a,EACA8a,GACAN,EACA3H,EACA6H,EACAK,GACAiC,GACAhC,EACAC,EACA5H,EACAwH,EACAxR,EACAqC,EACAwP,EACAC,EACAzG,EACAtB,GACAvH,EACA4L,GACAuE,GACArQ,GACAC,EACArO,EACAkT,EACA2K,EACAlb,EACAic,GACAxT,EACAhI,EAAA,CACF,EAGIuc,EAAcjY,EAAAA,OAAO,CAAC,EAC5BM,OAAAA,EAAAA,UAAU,IAAM,CACT2X,EAAY,QAGf1B,EAAU,KAAKyB,CAAW,EAFtB/U,KAAW7K,CAAG,EAIpB6f,EAAY,SACd,EAAG,CAAC7f,EAAK6K,EAAM+U,EAAazB,CAAS,CAAC,EAElC0B,EAAY,UAAY,GAC1B1B,EAAU,KAAKyB,CAAW,EAI1Bnf,EAAAA,IAACZ,GAAAA,QAAQ,KAAK,SAAb,CAAsB,MAAO6e,GAC5B,SAAAje,EAAAA,IAACqf,GAAa,SAAb,CAAsB,MAAOL,EAC5B,SAAAhf,EAAAA,IAACsZ,GAAA,CACC,aAAAxE,EACA,SAAA1P,EACA,iBAAkBK,GAClB,mBAAA8T,EAAA,CAAA,EAEJ,CAAA,CACF,CAEJ,CAAC,EC1VD,SAAwB+F,GAAQ,CAAE,IAAA/f,EAAM,KAAM,MAAAggB,EAAQ,CAAA,GAAM,CAC1D,MAAMvB,EAAU7e,EAAAA,WAAWC,GAAAA,QAAQ,IAAI,EACjCogB,EAAYlgB,UAAQ,IAAO0e,GAAoBC,EAAAA,OAAOF,GAAAA,EAAE,EAAI,CAACC,CAAO,CAAC,EACrE3e,EAAIC,EAAAA,QAAQ,IAAMkgB,EAAU,SAAS,OAAO,EAAG,CAACA,CAAS,CAAC,EAE1DC,EAAYC,EAAAA,cAAcngB,EAAK,WAAW,EAC1Coa,EAAO+F,EAAAA,cAAcngB,EAAK,MAAM,EAChCsC,EAAU6d,EAAAA,cAAcngB,EAAK,SAAS,EACtCsO,EAAa6R,EAAAA,cAAcngB,EAAK,YAAY,EAC5CE,EAAUigB,EAAAA,cAAcngB,EAAK,SAAS,EAEtCogB,EAAiB,CAAC,OAAQ,MAAM,EAEhCC,EAAatgB,EAAAA,QAAQ,IAAM,CAC/B,MAAMugB,EAAcC,GAAAA,kBAAkB,CAAE,KAAM,GAAM,WAAY,GAAM,EAQtE,OAPgBP,EAAM,OAClBA,EACAO,GAAAA,kBAAkB,CAChB,KAAAnG,EACA,WAAA9L,EACA,MAAO,CAAC,CAACpO,GAAS,KAAA,CACnB,GACU,IAAK2Z,GAAM,CACxB,IAAI2G,EAAO,CAAE,GAAG3G,EAAG,SAAU,EAAA,EAC7B,OAAA2G,EAAK,QAAUC,GAAAA,gBAAgBH,EAAaE,EAAK,EAAE,EAC9CE,GAAOC,GAAAA,aAAa3gB,EAAK0gB,EAAG,GAAI,KAAM5gB,CAAC,EACxC0gB,EAAK,QACLA,EAAK,OAAMA,EAAK,KAAO1gB,EAAE0gB,EAAK,IAAI,GAClCA,EAAK,WAAUA,EAAK,SAAW1gB,EAAE0gB,EAAK,QAAQ,GAC3CA,CACT,CAAC,CACH,EAAG,CAACR,EAAOhgB,EAAKF,EAAGsa,EAAM9L,EAAYpO,CAAO,CAAC,EAEvC0gB,EAAU7gB,EAAAA,QAAQ,IAAM,CAC5B,MAAM8gB,EAAe,CAAA,EACrB,OAAAR,EAAW,QAASG,GAAS,CAC3B,MAAMpf,EAASof,EAAK,GAEpB,GAAIpf,IAAW,YAAc,CAACgf,EAAe,SAAShf,CAAM,EAC1D,GAAI,CAAC8e,GAAW,QAAU,CAAClgB,EAAK,CAC9B,GAAIoB,IAAW,WAAY,OAC3Byf,EAAa,KAAKL,CAAI,CACxB,MACEK,EAAa,KAAK,CAChB,GAAGL,EACH,SACEA,EAAK,YACLN,EAAU,KAAMlhB,GACdwhB,EAAK,WACHxhB,EACAgB,EAAI,SAAA,EACJA,EAAI,gBAAgBhB,CAAI,CAAA,CAC1B,CACF,CACH,OAEMohB,EAAe,SAAShf,CAAM,GACvCyf,EAAa,KAAK,CAChB,GAAGL,EACH,SAAUA,EAAK,WAAWle,CAAO,CAAA,CAClC,CAEL,CAAC,EAEMue,EAAa,OAAO,CAACC,EAAQzc,IAAU,CAC5C,GAAIrE,GAAO8gB,EAAO,SAChB,MAAO,CAACZ,EAAU,KAAMlhB,GAAS8hB,EAAO,SAAS9hB,EAAMgB,EAAI,SAAA,CAAU,CAAC,EACxE,GAAI8gB,EAAO,OAAS,YAAa,CAC/B,MAAMC,EAAaF,EAAaxc,EAAQ,CAAC,EACzC,GAAI,CAAC0c,GAAcA,EAAW,OAAS,YAAa,MAAO,EAC7D,CACA,MAAO,EACT,CAAC,CACH,EAAG,CAAC/gB,EAAKkgB,EAAW5d,EAAS+d,CAAU,CAAC,EAExC,OAAK5B,EAQEhe,EAAAA,IAACugB,GAAAA,QAAA,CAAU,MAAOJ,CAAA,CAAS,EAN9BngB,EAAAA,IAACZ,GAAAA,QAAQ,KAAK,SAAb,CAAsB,MAAOogB,EAC5B,SAAAxf,EAAAA,IAACugB,GAAAA,QAAA,CAAU,MAAOJ,CAAA,CAAS,CAAA,CAC7B,CAKN,CC7EA,SAASK,GAAejB,EAAO,CAC7B,OAAOA,EAAM,IAAKkB,GAAO,CACvB,MAAMC,EAAO,CAAE,GAAGD,CAAA,EAClB,OAAIA,EAAG,OAAMC,EAAK,KAAOF,GAAeC,EAAG,IAAI,GACxCC,CACT,CAAC,CACH,CAEA,MAAMC,GAAclE,EAAAA,WAAW,SAC7B,CACE,QAASmE,EAAc,CAAA,EACvB,IAAArhB,EAAM,KACN,SAAAshB,EAAW,KACX,OAAAC,EAAS,KACT,GAAAC,EAAK,QACL,SAAAC,EACA,QAAAja,EACA,IAAAoC,CACF,EACAqU,EACA,CACA,MAAMyD,EAAU9Z,EAAAA,OAAO,IAAI,EACrB+Z,EAAc/Z,EAAAA,OAAO,IAAI,EACzB,CAACyV,EAAYuE,CAAa,EAAI5b,EAAAA,SAAS,IAAI,EAG3C,CAAC6b,EAAaC,CAAc,EAAI9b,EAAAA,SAAS,CAAA,CAAE,EAG3CyY,EAAU7e,EAAAA,WAAWC,GAAAA,QAAQ,IAAI,EACjCgR,EAAI9Q,EAAAA,QAAQ,IAAM0e,GAAWC,EAAAA,OAAO,CAAE,GAAGF,GAAAA,GAAI,GAAGD,GAAAA,EAAA,CAAQ,EAAG,CAACE,CAAO,CAAC,EACpE3e,GAAIC,EAAAA,QAAQ,IAAM8Q,EAAE,SAAS,OAAO,EAAG,CAACA,CAAC,CAAC,EAE1CkR,EAAe5B,EAAAA,cAAcngB,EAAK,WAAW,EAC7CsG,EAAc6Z,EAAAA,cAAcngB,EAAK,UAAU,EAC3CgiB,EAAmB7B,EAAAA,cAAcngB,EAAK,WAAW,EACjD8G,EAAgBqZ,EAAAA,cAAcngB,EAAK,YAAY,EAC/CiiB,EAAa9B,EAAAA,cAAcngB,EAAK,SAAS,EACzCgH,GAAamZ,EAAAA,cAAcngB,EAAK,SAAS,EAEzCzC,EAASwC,EAAAA,QACb,KAAO,CACL,WAAY+G,EACZ,UAAWib,EACX,QAASE,EACT,MAAO,CAAC,CAACjb,IAAY,KAAA,GAEvB,CAACF,EAAeib,EAAcE,EAAYjb,EAAU,CAAA,EAGhDkb,EAAcniB,EAAAA,QAAQ,IAAMoiB,GAAAA,eAAe5kB,CAAM,EAAG,CAACA,CAAM,CAAC,EAE5D6kB,EAAgBriB,EAAAA,QACpB,IAAOshB,EAAY,OAASA,EAAc,KAC1C,CAACA,CAAW,CAAA,EAERgB,EAAmBtiB,EAAAA,QACvB,IAAMuiB,EAAcF,GAAiBF,CAAW,EAChD,CAACE,EAAeF,EAAapiB,EAAC,CAAA,EAGhCoI,EAAAA,UAAU,IAAM,CACTlI,IAELA,EAAI,GAAG,eAAgB,IAAM,CACvB0hB,EAAQ,SAAWA,EAAQ,QAAQ,MAAMA,EAAQ,QAAQ,KAAA,CAC/D,CAAC,EACD1hB,EAAI,GAAG,YAAa,IAAM,CACpB0hB,EAAQ,SAAWA,EAAQ,QAAQ,MAAMA,EAAQ,QAAQ,KAAA,CAC/D,CAAC,EACH,EAAG,CAAC1hB,CAAG,CAAC,EAER,SAASsiB,EAAcC,GAAM,CAC3B,OAAOA,GAAK,IAAKrB,IACfA,EAAK,CAAE,GAAGA,CAAA,EACNA,EAAG,OAAMA,EAAG,KAAOphB,GAAEohB,EAAG,IAAI,GAC5BA,EAAG,UAASA,EAAG,QAAUphB,GAAEohB,EAAG,OAAO,GACrCA,EAAG,OAAMA,EAAG,KAAOoB,EAAcpB,EAAG,IAAI,GACrCA,EACR,CACH,CAGA,MAAMld,EAAQjE,EAAAA,QACZ,IACEiiB,GAAoBA,EAAiB,OACjCA,EACA3E,EACE,CAACA,CAAU,EACX,CAAA,EACR,CAAC2E,EAAkB3E,CAAU,CAAA,EAGzBmF,EAAejb,EAAAA,YACnB,CAACkb,GAAWze,IAAU,CACpB,GAAI,CAAChE,EAAK,MAAO,CAAA,EACjB,MAAMggB,EAAQiB,GAAeoB,CAAgB,EACvCK,EAAe9gB,GAAS,CAC5BA,EAAK,QAAS4e,GAAS,CACjBA,EAAK,aACPA,EAAK,SAAWiC,GAAS,KAAMzjB,IAC7BwhB,EAAK,WACHxhB,GACAgB,EAAI,SAAA,EACJA,EAAI,gBAAgBhB,EAAI,EACxB2iB,EAAY,OAAA,CACd,GAGAnB,EAAK,MAAMkC,EAAYlC,EAAK,IAAI,CACtC,CAAC,CACH,EACA,OAAAkC,EAAY1C,CAAK,EACVA,CACT,EACA,CAAChgB,EAAKqiB,EAAkBre,CAAK,CAAA,EAGzB2e,EAAepb,EAAAA,YACnB,CAAChH,GAAIvD,IAAO,CACV,GACEmB,EAAAA,OAAOnB,EAAG,OAAQ,kBAAkB,GAAG,UAAU,SAC/C,kBAAA,EAGF,OAAO,KAET,IAAIgC,EAAOuB,GAAKP,GAAK,QAAQO,EAAE,EAAI,KACnC,GAAI+gB,EAAU,CACZ,MAAMtU,EAASsU,EAAS/gB,GAAIvD,CAAE,EAC9BgC,EAAOgO,IAAW,GAAOhO,EAAOgO,CAClC,CAGA,GAFA4U,EAAc5iB,CAAI,EAEdA,EAAM,CACR,MAAM4N,EAAelF,EAAAA,SAAS1K,EAAG,OAAQ,cAAc,EACnD4P,IAAiB,KACnB+U,EAAY,QAAU,CAAE,GAAI3iB,EAAK,GAAI,aAAA4N,CAAA,EAClC+U,EAAY,QAAU3iB,EAAK,IAE5B,CAAC,MAAM,QAAQsH,CAAW,GAAK,CAACA,EAAY,SAAStH,EAAK,EAAE,IAC9DgB,GAAOA,EAAI,MAAQA,EAAI,KAAK,cAAe,CAAE,GAAIhB,EAAK,GAAI,EAK5D,MAAM4jB,EACJZ,GAAoBA,EAAiB,OACjCA,EACA,CAAChjB,CAAI,EACX8iB,EAAeU,EAAaI,CAAc,CAAC,CAC7C,CACA,OAAO5jB,CACT,EACA,CAACgB,EAAKshB,EAAUhb,EAAa0b,EAAkBQ,CAAY,CAAA,EAGvDK,EAAatb,EAAAA,YAChBvK,IAAO,CACN,MAAMoE,EAASpE,GAAG,OACdoE,IACeqf,GAAAA,gBAAgByB,EAAa9gB,EAAO,EAAE,GACzCuf,GAAAA,aAAa3gB,EAAKoB,EAAO,GAAIugB,EAAY,QAAS7hB,EAAC,EACjE0H,GAAWA,EAAQxK,EAAE,EAEzB,EACA,CAACgD,EAAKF,GAAG0H,EAAS0a,CAAW,CAAA,EAGzBY,EAAavb,EAAAA,YAChBiZ,IAAS,CACR,GAAI,CAACxgB,EAAK,MAAO,GACjB,IAAIgN,EAASuU,EAASvd,EAAM,MAAOsE,GAAMiZ,EAAOf,GAAMlY,CAAC,CAAC,EAAI,GAE5D,OAAI0E,GACEwT,GAAK,WACPxT,EAAS,CAAChJ,EAAM,KAAMsE,GACpBkY,GAAK,SAASlY,EAAGtI,EAAI,SAAA,EAAY2hB,EAAY,OAAO,CAAA,GAGnD3U,CACT,EACA,CAACuU,EAAQvd,EAAOhE,CAAG,CAAA,EAGrB0f,EAAAA,oBAAoBzB,EAAK,KAAO,CAC9B,KAAM,CAACjhB,GAAIwZ,IAAQ,CACjBsL,EAAeU,GAAc,EACzBd,EAAQ,SAAWA,EAAQ,QAAQ,MACrCA,EAAQ,QAAQ,KAAK1kB,GAAIwZ,CAAG,CAEhC,CAAA,EACA,EAEF,MAAMuM,GAAgBxb,cAAaE,IAAM,CACnCia,EAAQ,SAAWA,EAAQ,QAAQ,MACrCA,EAAQ,QAAQ,KAAKja,EAAC,CAE1B,EAAG,CAAA,CAAE,EAECub,GACJtiB,EAAAA,KAAAC,EAAAA,SAAA,CACE,SAAA,CAAAF,EAAAA,IAACwiB,GAAAA,YAAA,CACC,OAAQH,EACR,QAASjB,EACT,QAAS,KACT,SAAUc,EACV,QAASE,EACT,GAAArB,EACA,IAAKE,EACL,IAAA9X,CAAA,CAAA,EAEFnJ,EAAAA,IAAC,OAAA,CAAK,cAAAsiB,GAA8B,mBAAiB,OAClD,gBAAOtB,GAAa,WAAaA,EAAA,EAAaA,CAAA,CACjD,CAAA,EACF,EAGF,GAAI,CAAChD,GAAW5e,WAAQ,MAAM,SAAU,CACtC,MAAMqjB,GAAWrjB,WAAQ,KAAK,SAC9B,OAAOY,EAAAA,IAACyiB,GAAA,CAAS,MAAOrS,EAAI,SAAAmS,GAAQ,CACtC,CAEA,OAAOA,EACT,CAAC,EC9OD,SAASG,GAAY1jB,EAAO,CAC3B,KAAM,CAAE,QAAAwD,EAAS,KAAArB,EAAM,SAAAwhB,EAAU,OAAAC,EAAQ,MAAAC,EAAO,OAAAC,GAAW9jB,EAErD+jB,EAAc5b,EAAAA,OAAOwb,CAAQ,EAC7BK,EAAY7b,EAAAA,OAAOyb,CAAM,EACzBK,EAAY9b,EAAAA,OAAO2b,CAAM,EAE/Brb,EAAAA,UAAU,IAAM,CACfsb,EAAY,QAAUJ,EACtBK,EAAU,QAAUJ,EACpBK,EAAU,QAAUH,CACrB,EAAG,CAACH,EAAUC,EAAQE,CAAM,CAAC,EAE7B,SAAS/b,EAAQC,EAAG,CACnB,MAAMlH,EAAKmH,EAAAA,SAASD,CAAC,EACfrG,EAASqG,EAAE,OAAO,QAAQ,OAC5BrG,KAAU,eAAA,EACVb,GAAMa,GAAQoiB,EAAY,UAAUjjB,EAAIa,CAAM,CACnD,CAEA,MAAMyJ,EAAOtD,cAAaoc,GAAS,CAClCD,EAAU,UAAUC,CAAI,EACxBA,EAAK,GAAG,cAAgB3mB,GAAO,CAC9B,KAAM,CAAE,GAAAuD,EAAI,OAAAO,EAAQ,MAAAR,CAAA,EAAUtD,EAC9BymB,EAAU,UAAUljB,EAAIO,EAAQR,CAAK,CACtC,CAAC,CACF,EAAG,CAAA,CAAE,EAEL,OACCG,EAAAA,IAAC,MAAA,CAAI,UAAU,uBAAuB,QAAA+G,EACrC,SAAA/G,EAAAA,IAACmF,GAAAA,KAAA,CACA,KAAAiF,EACA,QAAA5H,EACA,KAAArB,EACA,OAAQ,GACR,YAAaZ,GACZ,0BAA0BA,EAAI,KAAK,IAAIA,EAAI,KAAO,SAAW,YAAc,EAAE,GAC9E,MAAOsiB,GAAS,CAAA,CAAC,CAAA,EAEnB,CAEF,CC3CA,SAASM,GAAankB,EAAO,CAC5B,KAAM,CAAE,IAAAC,EAAK,OAAAoB,EAAQ,KAAAc,CAAA,EAASnC,EAExBqV,EAAQ/U,EAAAA,QAAQ,IACjB6B,EAAaA,EAAK,MACfd,EAAO,QAAQ,KAAKogB,GAAMA,EAAG,KAAOxhB,EAAI,IAAI,GAAG,OAAS,GAC7D,CAACkC,EAAMd,EAAQpB,CAAG,CAAC,EAEtB,OACCgB,EAAAA,KAAC,MAAA,CAAI,UAAU,yBACd,SAAA,CAAAD,EAAAA,IAAC,MAAA,CAAI,UAAU,sBAAuB,SAAAqU,EAAM,EAC3CpV,GAAOe,EAAAA,IAAC,IAAA,CAAE,UAAU,4BAAA,CAA6B,CAAA,EACnD,CAEF,CCRA,SAAwBmL,GAAM,CAC5B,IAAA5L,EACA,SAAA6jB,EACA,YAAAC,EACA,aAAAC,EAAe,KACf,WAAAC,EAAa,KACb,MAAAC,EAAQ,OACV,EAAG,CACD,MAAMtkB,EAAOC,EAAAA,WAAWC,GAAAA,QAAQ,IAAI,EAC9BC,EAAIC,EAAAA,QAAQ,IAAMJ,EAAK,SAAS,OAAO,EAAG,CAACA,CAAI,CAAC,EAEhD0d,EAAald,EAAAA,SAASH,EAAK,YAAY,EACvCkkB,EAAc/jB,EAAAA,SAASH,EAAK,aAAa,EACzC,CAAC+L,EAAOoY,CAAY,EAAI1W,EAAAA,oBAAoBzN,EAAK,OAAO,EACxDgE,EAAQ7D,EAAAA,SAASH,EAAK,OAAO,EAC7BqO,EAAWlO,EAAAA,SAASH,EAAK,UAAU,EACnC4d,EAAmBzd,EAAAA,SAASH,EAAK,kBAAkB,EAEnDokB,EAAOrkB,EAAAA,QACX,IAAM,CACJ,CAAE,GAAI,MAAO,MAAOD,EAAE,cAAc,CAAA,EACpC,CAAE,GAAI,MAAO,MAAOA,EAAE,gBAAgB,CAAA,EACtC,CAAE,GAAI,MAAO,MAAOA,EAAE,YAAY,CAAA,EAClC,CAAE,GAAI,MAAO,MAAOA,EAAE,cAAc,CAAA,CAAE,EAExC,CAACA,CAAC,CAAA,EAGJ,SAASukB,EAAiB3kB,EAAK,CAC7B,OAAOA,EAAI,OAAS,MAChB,CAAE,KAAM,OAAQ,OAAQ,CAAE,KAAM,QAAA,CAAS,EACzC,IACN,CAEA,MAAM4kB,EAAcvkB,EAAAA,QAClB,IACE,CAACsO,GAAU,MAASuP,GAAoBsG,GAAa,YACvD,CAAC7V,EAAUuP,EAAkBsG,CAAW,CAAA,EAG1C,SAASK,IAAa,CACpB,MAAO,CACL,CACE,GAAI,WACJ,OAAQzkB,EAAE,WAAW,EACrB,SAAU,CAAA,EAEZ,CACE,GAAI,MACJ,OAAQA,EAAE,KAAK,EACf,OAAQukB,EACR,SAAU,EACV,OAAQC,CAAA,EAEV,CACE,GAAI,OACJ,OAAQxkB,EAAE,MAAM,EAChB,MAAO,IACP,QAASskB,EACT,OAAQ,CACN,KAAM,aACN,OAAQ,CACN,KAAMR,EAAA,CACR,EAEF,KAAMA,EAAA,EAER,CACE,GAAI,SACJ,OAAQ,GACR,KAAM1iB,GACN,MAAO,GACP,MAAO,QAAA,CACT,CAEJ,CAEA,SAASsjB,GAAe,CACtB,GAAInH,EAAY,CACd,MAAMoH,EAAK,CAAA,EACLC,EAAK,CAAA,GAEP,CAACX,GAAgB,CAACC,IACpBjY,EAAM,QAAS8E,GAAM,CACf,CAACkT,GAAgBlT,EAAE,SAAWwM,GAAYoH,EAAG,KAAK5T,CAAC,EACnD,CAACmT,GAAcnT,EAAE,SAAWwM,GAAYqH,EAAG,KAAK7T,CAAC,CACvD,CAAC,EAGH,MAAM8T,EACJZ,GACAU,EAAG,IAAKrY,GAAS,CACf,KAAM,CAAE,GAAA7L,EAAI,IAAAqkB,EAAK,KAAApY,EAAM,OAAAhP,IAAW4O,EAClC,MAAO,CACL,GAAA7L,EACA,KAAAiM,EACA,IAAAoY,EACA,SAAU5gB,EAAM,KAAKxG,EAAM,EAAE,IAAA,CAEjC,CAAC,EAEGqnB,EACJb,GACAU,EAAG,IAAKtY,GAAS,CACf,KAAM,CAAE,GAAA7L,EAAI,IAAAqkB,EAAK,KAAApY,EAAM,OAAArN,IAAWiN,EAClC,MAAO,CACL,GAAA7L,EACA,KAAAiM,EACA,IAAAoY,EACA,SAAU5gB,EAAM,KAAK7E,EAAM,EAAE,IAAA,CAEjC,CAAC,EAEH,MAAO,CACL,CAAE,MAAOW,EAAE,cAAc,EAAG,KAAM6kB,CAAA,EAClC,CAAE,MAAO7kB,EAAE,YAAY,EAAG,KAAM+kB,CAAA,CAAS,CAE7C,CACF,CAEA,KAAM,CAACC,EAAWC,CAAY,EAAI/e,WAAA,EAElCkC,EAAAA,UAAU,IAAM,CACd6c,EAAaP,GAAc,CAC7B,EAAG,CAACnH,EAAYtR,EAAOoY,EAAcngB,EAAO+f,EAAcC,CAAU,CAAC,EAErE,SAASgB,EAAezkB,EAAI,CACtBsjB,EACF7jB,EAAI,KAAK,cAAe,CAAE,GAAAO,CAAA,CAAI,EAE9BwkB,EAAc3iB,GAAS,CACrB,MAAMC,GAAQD,GAAQ,CAAA,GAAI,IAAK4C,IAAW,CACxC,GAAGA,EACH,KAAMA,EAAM,KAAK,OAAQwb,GAASA,EAAK,KAAOjgB,CAAE,CAAA,EAChD,EACF,OAAAujB,GACEA,EAAY,CACV,KAAM,QACN,MAAO,CACL,GAAAvjB,EACA,OAAQ,cACR,KAAM,CAAE,GAAAA,CAAA,CAAG,EAEb,OAAQ,CACN,aAAc8B,EAAK,CAAC,EAAE,KACtB,WAAYA,EAAK,CAAC,EAAE,IAAA,CACtB,CACD,EACIA,CACT,CAAC,CAEL,CAEA,SAASghB,EAAO9iB,EAAIO,EAAQR,EAAO,CACjC,MAAM6H,EAAS,CAAE,CAACrH,CAAM,EAAGR,CAAA,EACvBQ,IAAW,QAAUuN,GAAU,MAC7B/N,IAAU,QAAO6H,EAAO,IAAM,IAGhC0b,EACF7jB,EAAI,KAAK,cAAe,CACtB,GAAAO,EACA,KAAM4H,CAAA,CACP,EAED4c,EAAc3iB,GAAS,CACrB,MAAMC,GAAQD,GAAQ,CAAA,GAAI,IAAK4C,IAAW,CACxC,GAAGA,EACH,KAAMA,EAAM,KAAK,IAAKwb,GACpBA,EAAK,KAAOjgB,EAAK,CAAE,GAAGigB,EAAM,GAAGrY,GAAWqY,CAAA,CAC5C,EACA,EACF,OAAAsD,GACEA,EAAY,CACV,KAAM,QACN,MAAO,CACL,GAAAvjB,EACA,OAAQ,cACR,KAAM,CACJ,GAAAA,EACA,KAAM4H,CAAA,CACR,EAEF,OAAQ,CACN,aAAc9F,EAAK,CAAC,EAAE,KACtB,WAAYA,EAAK,CAAC,EAAE,IAAA,CACtB,CACD,EACIA,CACT,CAAC,CAEL,CAEA,MAAMY,GAAUlD,EAAAA,QAAQ,IAAMwkB,GAAA,EAAc,CAACzkB,EAAGskB,EAAME,CAAW,CAAC,EAE5DW,EACJH,GAAa,CAACA,EAAU,CAAC,EAAE,KAAK,QAAU,CAACA,EAAU,CAAC,EAAE,KAAK,OAEzDI,EAAmB,CACvB,cACA,aACAjB,IAAU,QAAU,aAAe,EAAA,EAElC,OAAO,OAAO,EACd,KAAK,GAAG,EAEX,OACEvjB,EAAAA,KAAC,MAAA,CAAI,UAAWwkB,EACZ,SAAA,EAAAJ,GAAa,CAAA,GAAI,IAAI,CAAC9f,EAAOU,IAC7BV,EAAM,KAAK,cACRrE,WAAA,CACC,SAAA,CAAAF,EAAAA,IAAC,MAAA,CAAI,UAAU,uBAAwB,SAAAuE,EAAM,MAAM,EACnDvE,EAAAA,IAAC0iB,GAAA,CACC,QAAAlgB,GACA,SAAU+hB,EACV,OAAA3B,EACA,KAAMre,EAAM,KACZ,MAAO,CACL,UAAW,EAAA,CACb,CAAA,CACF,CAAA,EAVaU,CAWf,EACE,IAAA,EAELuf,QACE,MAAA,CAAI,UAAU,wBAAyB,SAAAnlB,EAAE,UAAU,EAAE,EACpD,IAAA,EACN,CAEJ,CC3OA,SAAwBqlB,GAAe1lB,EAAO,CAC5C,KAAM,CAAE,MAAAa,EAAO,KAAA8kB,EAAM,OAAAlJ,EAAQ,SAAAmJ,EAAU,SAAAC,EAAU,GAAGtH,GAAcve,EAC5D8lB,EAAkBD,GAAYD,EAEpC,SAASG,EAAiBxoB,EAAI,CAC5B,MAAMyoB,EAAU,IAAI,KAAKzoB,EAAG,KAAK,EACjCyoB,EAAQ,SAASnlB,EAAM,UAAU,EACjCmlB,EAAQ,WAAWnlB,EAAM,YAAY,EAErCilB,GAAmBA,EAAgB,CAAE,MAAOE,CAAA,CAAS,CACvD,CAEA,OACE/kB,EAAAA,KAAC,MAAA,CAAI,UAAU,iCACb,SAAA,CAAAD,EAAAA,IAACilB,GAAAA,WAAA,CACE,GAAG1H,EACJ,MAAA1d,EACA,SAAUklB,EACV,OAAAtJ,EACA,QAAS,CAAC,OAAO,EACjB,MAAO,EAAA,CAAA,EAERkJ,EACC3kB,EAAAA,IAACklB,GAAAA,WAAA,CAAW,MAAArlB,EAAc,SAAUilB,EAAiB,OAAArJ,EAAgB,EACnE,IAAA,EACN,CAEJ,CC1BA,SAAS0J,GAAoBnmB,EAAO,CACnC,KAAM,CAAE,IAAAC,EAAK,KAAAkC,CAAA,EAASnC,EAEhB+gB,EAAOzgB,EAAAA,QAAQ,IAAM6B,GAAQlC,EAAK,CAACkC,EAAMlC,CAAG,CAAC,EAEnD,OAAK8gB,EAGJ9f,EAAAA,KAAAC,WAAA,CACC,SAAA,CAAAF,EAAAA,IAAC,MAAA,CAAI,UAAU,wBACd,SAAAA,EAAAA,IAACG,WAAO,MAAO4f,EAAM,KAAM,EAAA,CAAI,CAAA,CAChC,EACA9f,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAD,EAAAA,IAAC,MAAA,CAAI,UAAU,sBAAuB,SAAA+f,EAAK,KAAK,EAC/CA,EAAK,KACL/f,MAAC,MAAA,CAAI,UAAU,sBAAuB,SAAA+f,EAAK,KAAK,EAC7C,IAAA,CAAA,CACL,CAAA,EACD,EAbiB,IAenB,CCbA,SAAwBqF,GAAU,CAChC,IAAA7lB,EACA,SAAA6jB,EACA,YAAayB,EACb,gBAAAQ,EAAkB,IACpB,EAAG,CACD,MAAMnmB,EAAOC,EAAAA,WAAWC,GAAAA,QAAQ,IAAI,EAC9BC,EAAIC,EAAAA,QAAQ,IAAMJ,EAAK,SAAS,OAAO,EAAG,CAACA,CAAI,CAAC,EAEhD0d,EAAald,EAAAA,SAASH,EAAK,YAAY,EACvCI,EAAYD,EAAAA,SAASH,EAAK,WAAW,EACrCiC,EAAe9B,EAAAA,SAASH,EAAK,cAAc,EAC3Csd,EAAcnd,EAAAA,SAASH,EAAK,aAAa,EAEzC,CAAC+lB,EAASC,CAAU,EAAIhgB,WAAA,EACxB,CAACigB,EAAUC,CAAW,EAAIlgB,EAAAA,SAAS,IAAI,EACvC,CAACmgB,EAAerkB,CAAgB,EAAIkE,EAAAA,SAAS,CAAA,CAAE,EAErDkC,EAAAA,UAAU,IAAM,CACdpG,EACEgkB,GACE9lB,EAAI,iBAAiBqd,CAAU,EAAE,IAAK7J,IAC7B,CAAE,GAAGA,EAAG,SAAUA,EAAE,GAAI,GAAIA,EAAE,YAAA,EACtC,CAAA,CAEP,EAAG,CAACxT,EAAKqd,EAAYpb,EAAc6jB,CAAe,CAAC,EAEnD,MAAMM,EAAarmB,EAAAA,QAAQ,IAAM,CAC/B,MAAMigB,EAAQ,CAAA,EACd,OAAA5f,EAAU,UAAWogB,GAAS,CACvBA,EAAK,MAAMR,EAAM,KAAK,CAAE,GAAGQ,EAAM,MAAOA,EAAK,KAAM,CAC1D,EAAG,CAAC,EACGR,CACT,EAAG,CAAC5f,CAAS,CAAC,EAERimB,EAAkBtmB,EAAAA,QAAQ,IACvBqmB,EAAW,OACf5S,GAAM,CAAC2S,EAAc,KAAMhkB,GAAMA,EAAE,WAAaqR,EAAE,EAAE,CAAA,EAEtD,CAAC4S,EAAYD,CAAa,CAAC,EAE9B,SAASG,GAAcC,EAAQ,CAC7B,MAAO,CACL,KAAM,YACN,MAAOA,EACP,OAAQ,CACN,gBAAiBJ,CAAA,CACnB,CAEJ,CAEA,SAASK,EAAiBjmB,EAAI,CAC5BwlB,EAAQ,KAAK,eAAgB,CAAE,OAAQ,GAAM,EACzClC,EACF7jB,EAAI,KAAK,oBAAqB,CAAE,GAAAO,CAAA,CAAI,GAEpCuB,EAAkBM,GAASA,EAAK,OAAQD,GAAMA,EAAE,KAAO5B,CAAE,CAAC,EAC1D+kB,GACEA,EACEgB,GAAc,CACZ,GAAA/lB,EACA,OAAQ,oBACR,KAAM,CAAE,GAAAA,CAAA,CAAG,CACZ,CAAA,GAGP2lB,EAAY,IAAI,CAClB,CAEA,SAASO,EAAclmB,EAAIiC,EAAY,CACrCA,EAAa,CAAE,GAAGA,EAAY,MAAO,IAAK,KAAM6a,EAAY,GAAA9c,CAAA,EAC5D,MAAMigB,EAAO,CAAE,WAAAhe,CAAA,EACf,GAAIqhB,EACF7jB,EAAI,KAAK,iBAAkBwgB,CAAI,MAC1B,CACL,MAAMhN,GAAIpT,GAAW,KAAKoC,EAAW,QAAQ,EAC7CV,EAAkBM,IAAS,CAAC,GAAGA,GAAM,CAAE,GAAGoR,GAAG,GAAGhR,CAAA,CAAY,CAAC,EAC7D8iB,GACEA,EACEgB,GAAc,CACZ,GAAI9S,GAAE,GACN,OAAQ,iBACR,KAAMgN,CAAA,CACP,CAAA,CAEP,CACF,CAEA,SAASkG,EAAchnB,EAAK,CAC1B,OAAIA,EAAI,KAAOumB,EAAiBI,EAEzB,CADWD,EAAW,KAAMlF,GAAOA,EAAG,KAAOxhB,EAAI,QAAQ,CAC/C,EAAE,OAAO2mB,CAAe,CAC3C,CAEA,SAASM,EAAiBpmB,EAAIiC,EAAY,CACxC,IAAIge,EAAOlD,EAAY,KAAK/c,CAAE,EACzBigB,IAAMA,EAAO2F,EAAc,KAAMhkB,IAAMA,GAAE,KAAO5B,CAAE,GACvD,MAAM4H,GAAS,CACb,GAAA5H,EACA,WAAY,CAAE,MAAOigB,EAAK,OAAS,IAAK,GAAGhe,EAAY,GAAAjC,CAAA,CAAG,EAGxDsjB,EACF7jB,EAAI,KAAK,oBAAqBmI,EAAM,GAEhC3F,EAAW,UAAYA,EAAW,WAAage,EAAK,WAEtDhe,EAAa,CAAE,GADLpC,GAAW,KAAKoC,EAAW,QAAQ,EACxB,GAAG2F,GAAO,UAAA,GAGjCrG,EAAkBM,IAChBA,GAAK,IAAK1C,IAASA,GAAI,KAAOa,EAAK,CAAE,GAAGb,GAAK,GAAG8C,CAAA,EAAe9C,EAAI,CAAA,EAErE4lB,GACEA,EACEgB,GAAc,CACZ,GAAA/lB,EACA,OAAQ,oBACR,KAAM4H,EAAA,CACP,CAAA,EAGT,CAEA,MAAMlF,EAAUlD,EAAAA,QAAQ,IAEf,CACL,CACE,GAAI,WACJ,OAAQD,EAAE,UAAU,EACpB,KAAM8lB,GACN,KAAM,SACN,SAAU,EACV,OAASlmB,IACA,CACL,KAAM,QACN,OAAQ,CACN,QAASgnB,EAAchnB,CAAG,EAC1B,KAAMkmB,EAAA,CACR,GAGJ,QAASQ,CAAA,EAEX,CACE,GAAI,QACJ,OAAQtmB,EAAE,OAAO,EACjB,SAAU,EACV,OAAQ,CACN,KAAM,OACN,OAAQ,CAAE,KAAM,QAAA,CAAS,EAE3B,SAAWoF,GAAM,GAAGA,CAAC,GAAA,EAEvB,CACE,GAAI,SACJ,OAAQ,GACR,KAAMhE,GACN,MAAO,GACP,MAAO,QAAA,CACT,EAED,CAACmlB,EAAiBD,EAAYtmB,EAAGmmB,CAAQ,CAAC,EAE7C,SAAS7C,GAAS7iB,EAAIa,EAAQ,CACxBb,GAAMa,IAAW,UAAUolB,EAAiBjmB,CAAE,CACpD,CAEA,SAAS8iB,EAAO9iB,EAAIO,EAAQR,EAAO,CACjC,GAAIQ,IAAW,QAAS6lB,EAAiBpmB,EAAI,CAAE,MAAOD,EAAQ,EAAG,UACxDQ,IAAW,WAAY,CAC9B,MAAM8lB,GAAiB,CAAE,SAAUtmB,CAAA,EAC/BC,IAAO0lB,EACTQ,EAAclmB,EAAIqmB,EAAc,EAEhCD,EAAiBpmB,EAAIqmB,EAAc,CAEvC,CAEAV,EAAY,IAAI,CAClB,CAEA,MAAMW,EAAcjf,EAAAA,OAAOqe,CAAQ,EACnC/d,EAAAA,UAAU,IAAM,CACd2e,EAAY,QAAUZ,CACxB,EAAG,CAACA,CAAQ,CAAC,EAEb,SAAS1C,EAAOI,EAAM,CACpBqC,EAAWrC,CAAI,EAEfA,EAAK,GAAG,eAAgB,IAAM,CACxBkD,EAAY,UACdlD,EAAK,KAAK,aAAc,CAAE,GAAIkD,EAAY,QAAS,EACnDX,EAAY,IAAI,EAEpB,CAAC,CACH,CAEA,MAAMY,EAAiB/mB,EAAAA,QACrB,IAAMkmB,GAAY,CAACI,EAAgB,OACnC,CAACJ,EAAUI,CAAe,CAAA,EAGtBU,EAAanf,EAAAA,OAAO,EAAK,EAC/B,SAASof,GAAa,CAEpB,GADAjB,GAAS,KAAK,eAAgB,CAAE,OAAQ,GAAM,EAC1C,CAACgB,EAAW,QAAS,CACvBA,EAAW,QAAU,GACrB,MAAMxmB,EAAK0mB,GAAAA,OAAA,EACXf,EAAY3lB,CAAE,EACd,sBAAsB,IAAM,CAC1B2mB,EAAO3mB,CAAE,EACTwmB,EAAW,QAAU,EACvB,CAAC,CACH,CACF,CAEA,SAASG,EAAO3mB,EAAI,CAClBwlB,EAAQ,KAAK,UAAW,CAAE,GAAAxlB,EAAI,IAAK,CAAE,MAAO,GAAA,EAAO,EACnD,WAAW,IAAM,CACfwlB,EAAQ,KAAK,cAAe,CAAE,GAAAxlB,EAAI,OAAQ,WAAY,CACxD,CAAC,CACH,CAEA,OACEG,EAAAA,KAAC,MAAA,CAAI,UAAU,yBACZ,SAAA,CAAAylB,EAAc,QAAUF,EACvBxlB,EAAAA,IAAC0iB,GAAA,CACC,OAAAI,EACA,QAAAtgB,EACA,SAAAmgB,GACA,OAAAC,EACA,KAAM8C,EACN,MAAO,CACL,UAAW,EAAA,CACb,CAAA,EAGF1lB,EAAAA,IAAC,MAAA,CAAI,UAAU,wBAAyB,SAAAX,EAAE,gBAAgB,EAAE,EAE9DW,EAAAA,IAAC,MAAA,CAAI,UAAU,gCACb,SAAAA,EAAAA,IAACoS,GAAAA,OAAA,CACC,SAAUiU,EACV,KAAK,WACL,IAAI,YACJ,QAASE,EAER,WAAE,cAAc,CAAA,CAAA,CACnB,CACF,CAAA,EACF,CAEJ,CC7PA,SAAwBG,GAAS,CAAE,IAAAnnB,EAAK,SAAA6jB,EAAU,SAAA/W,EAAU,YAAAgX,GAAe,CACzE,MAAMwB,EAAWxB,EAEXjT,EAAIjR,EAAAA,WAAWC,GAAAA,QAAQ,IAAI,EAC3BC,EAAIC,EAAAA,QAAQ,IAAM8Q,EAAE,SAAS,OAAO,EAAG,CAACA,CAAC,CAAC,EAC1CuW,EAAarnB,EAAAA,QAAQ,IAAM,CAC/B,MAAMsnB,EAAWxW,EAAE,OAAA,EACbyW,EAAID,EAAS,OAAO,YAAcA,EAAS,SAAS,WAC1D,OAAOrL,eAAasL,EAAGD,EAAS,QAAQ,CAC1C,EAAG,CAACxW,CAAC,CAAC,EAEAqT,EAAc/jB,EAAAA,SAASH,EAAK,aAAa,EAEzC,CAACunB,EAAeC,CAAgB,EAAIxhB,EAAAA,SAAS,CAAA,CAAE,EAErD,SAASyhB,GAAkB,CACzB,MAAI,CAACvD,GAAepX,IAAa,KAAa,CAAA,EACvCA,EACH,CAAC,GAAGA,CAAQ,EACZoX,GAAa,UAAU,IAAKjZ,IAAO,CACjC,GAAGA,EACH,GAAIA,EAAE,IAAMgc,GAAAA,OAAA,CAAO,EACnB,CACR,CAEA/e,EAAAA,UAAU,IAAM,CACdsf,EAAiBC,GAAiB,CACpC,EAAG,CAACvD,EAAapX,CAAQ,CAAC,EAE1B,MAAM7J,EAAUlD,EAAAA,QAAQ,IACf,CACL,CACE,GAAI,OACJ,OAAQD,EAAE,MAAM,EAChB,KAAM,SACN,SAAU,EACV,OAAQ,MAAA,EAEV,CACE,GAAI,QACJ,OAAQA,EAAE,OAAO,EACjB,SAAU,EACV,SAAWoF,GAAMkiB,EAAWliB,CAAC,EAC7B,OAAQ,YAAA,EAEV,CACE,GAAI,WACJ,OAAQpF,EAAE,UAAU,EACpB,SAAU,EACV,OAAQ,CACN,KAAM,OACN,OAAQ,CAAE,KAAM,QAAA,CAAS,CAC3B,EAEF,CACE,GAAI,SACJ,OAAQ,GACR,KAAMoB,GACN,MAAO,GACP,MAAO,QAAA,CACT,EAED,CAACpB,EAAGsnB,CAAU,CAAC,EAEZ,CAACrB,EAASC,CAAU,EAAIhgB,EAAAA,SAAS,IAAI,EAE3C,SAASud,EAAOjb,EAAG,CACjB0d,EAAW1d,CAAC,CACd,CAEA,SAASge,EAAcC,EAAQ,CAC7B,MAAO,CACL,KAAM,WACN,MAAOA,EACP,OAAQ,CACN,SAAUgB,EAAc,OAAS,CAAC,GAAGA,CAAa,EAAI,IAAA,CACxD,CAEJ,CAEA,SAASG,EAAcnnB,EAAI,CACzB,MAAM8D,EAAQkjB,EAAc,UAAWtc,IAAMA,GAAE,KAAO1K,CAAE,EAClD8B,EAAOklB,EAAc,OAAO,CAACtc,GAAGyB,IAAMA,IAAMrI,CAAK,EACvDmjB,EAAiBnlB,CAAI,EAErB,MAAM8F,EAAS,CACb,GAAI+b,EAAY,GAChB,KAAM,CACJ,SAAU7hB,EAAK,OAAS,CAAC,GAAGA,CAAI,EAAI,IAAA,CACtC,EAEEwhB,EACF7jB,EAAI,KAAK,cAAemI,CAAM,EAE9Bmd,GACEA,EACEgB,EAAc,CACZ,GAAA/lB,EACA,OAAQ,cACR,KAAM4H,CAAA,CACP,CAAA,CAGT,CAEA,SAASib,GAAS7iB,EAAIa,EAAQ,CACxBA,IAAW,UAAUsmB,EAAcnnB,CAAE,CAC3C,CAEA,SAAS8iB,EAAO9iB,EAAIO,EAAQR,EAAO,CACjC,KAAM,CAAE,KAAAsB,CAAA,EAASmkB,EAAQ,SAAA,EACzB,IAAI1hB,GAAQzC,EAAK,UAAWqJ,GAAMA,EAAE,KAAO1K,CAAE,EACzCO,IAAW,aAAYR,EAAQA,EAAQ,GAC3C,MAAMwQ,EAAU,CAAE,GAAGyW,EAAcljB,EAAK,EAAG,CAACvD,CAAM,EAAGR,CAAA,EACrD4K,GAAAA,gBACE4F,EACA9Q,EAAI,SAAA,EACJA,EAAI,gBAAgBkkB,CAAW,EAC/BpjB,CAAA,EAEF,MAAMqH,EAAS,CACb,GAAI+b,EAAY,GAChB,aAAc7f,GACd,KAAMyM,CAAA,EAGJ+S,EACF7jB,EAAI,KAAK,cAAemI,CAAM,GAE9Bqf,EAAkBplB,GAChBA,EAAK,IAAK6I,GAAOA,EAAE,KAAO1K,EAAK,CAAE,GAAG0K,EAAG,GAAG6F,CAAA,EAAY7F,CAAE,CAAA,EAE1Dqa,GACEA,EACEgB,EAAc,CACZ,GAAA/lB,EACA,OAAQ,cACR,KAAM4H,CAAA,CACP,CAAA,EAGT,CAEA,OACE1H,EAAAA,IAAC,MAAA,CAAI,UAAU,yBACZ,WAAc,OACbA,EAAAA,IAAC0iB,GAAA,CACC,QAAAlgB,EACA,OAAAsgB,EACA,SAAAH,GACA,KAAMmE,EACN,OAAAlE,CAAA,CAAA,QAGD,MAAA,CAAI,UAAU,wBAAyB,SAAAvjB,EAAE,aAAa,EAAE,EAE7D,CAEJ,CCjJA6nB,GAAAA,mBAAmB,SAAUC,GAAAA,UAAU,EACvCD,GAAAA,mBAAmB,OAAQxC,EAAc,EACzCwC,GAAAA,mBAAmB,WAAYE,GAAAA,QAAQ,EACvCF,GAAAA,mBAAmB,SAAUG,GAAAA,MAAM,EACnCH,GAAAA,mBAAmB,UAAWI,GAAAA,OAAO,EACrCJ,GAAAA,mBAAmB,QAAS/b,EAAK,EACjC+b,GAAAA,mBAAmB,WAAYK,GAAAA,QAAQ,EACvCL,GAAAA,mBAAmB,YAAa9B,EAAS,EACzC8B,GAAAA,mBAAmB,WAAYR,EAAQ,EACvCc,GAAAA,oBAAoB,OAAQC,GAAAA,IAAI,EAEhC,MAAMC,GAAW,UAEXC,GAAiB,CACrB,gBAAiB,KACjB,aAAc,KACd,WAAY,IACd,EAEA,SAASC,GAAO,CACd,IAAAroB,EACA,MAAAggB,EAAQ,CAAA,EACR,IAAApW,EAAM,GACN,OAAA0e,EAAS,UACT,SAAAziB,EAAW,GACX,UAAA0iB,EAAY,UACZ,UAAAC,EAAY,GACZ,OAAAC,EAAS,GACT,SAAA5E,EAAW,GACX,MAAA6E,EAAQ,GACR,QAAAxQ,EAAU,CAAA,CACZ,EAAG,CACD,MAAMyQ,EAAW/oB,EAAAA,WAAWC,GAAAA,QAAQ,IAAI,EAClCgR,EAAI9Q,EAAAA,QAAQ,IAAM4oB,GAAYjK,EAAAA,OAAO,CAAE,GAAGF,GAAAA,GAAI,GAAGD,GAAAA,EAAA,CAAQ,EAAG,CAACoK,CAAQ,CAAC,EACtE7oB,EAAIC,EAAAA,QAAQ,IAAM8Q,EAAE,SAAS,OAAO,EAAG,CAACA,CAAC,CAAC,EAC1CwW,EAAWxW,EAAE,OAAA,EACbuW,EAAarnB,EAAAA,QAAQ,IAAM,CAC/B,MAAMunB,EAAID,EAAS,OAAO,YAAcA,EAAS,SAAS,WAC1D,OAAOrL,eAAasL,EAAGD,EAAS,QAAQ,CAC1C,EAAG,CAACA,CAAQ,CAAC,EAEPhK,EAAald,EAAAA,SAASH,EAAK,aAAa,EACxC+B,EAAS5B,EAAAA,SAASH,EAAK,YAAY,EACnC4d,GAAmBzd,EAAAA,SAASH,EAAK,kBAAkB,EACnDiO,EAAU9N,EAAAA,SAASH,EAAK,SAAS,EACjCuO,EAAUpO,EAAAA,SAASH,EAAK,SAAS,EACjC+L,EAAQ5L,EAAAA,SAASH,EAAK,OAAO,EAC7BsO,EAAanO,EAAAA,SAASH,EAAK,YAAY,EACvCmd,EAAYhd,EAAAA,SAASH,EAAK,WAAW,EACrCI,GAAYD,EAAAA,SAASH,EAAK,WAAW,GAAK,KAC1Coa,EAAOja,EAAAA,SAASH,EAAK,MAAM,EAC3BsD,EAAcnD,EAAAA,SAASH,EAAK,cAAc,EAE1C,CAAC4oB,EAAaC,CAAc,EAAI7iB,EAAAA,SAASmiB,EAAQ,EACjDW,EAAW/oB,EAAAA,QACf,IAAOuD,EAAc,iBAAmB,GACxC,CAACA,CAAW,CAAA,EAGRylB,EAAYhpB,EAAAA,QAChB,IACEipB,kBAAe,CACb,iBAAApL,GACA,QAAA3P,EACA,QAAAM,EACA,UAAA4O,EACA,UAAA/c,GACA,WAAAkO,CAAA,CACD,EACH,CAACsP,GAAkB3P,EAASM,EAAS4O,EAAW/c,GAAWkO,CAAU,CAAA,EAGjE,CAAC2a,EAAcC,CAAe,EAAIljB,EAAAA,SAAS,IAAM,IAAI,GAAK,EAC1D,CAACmjB,EAAoBC,CAAqB,EAAIpjB,EAAAA,SAAS,IAAM,IAAI,GAAK,EACtE,CAACqjB,GAAiBC,EAAkB,EAAItjB,EAAAA,SAAS,IAAM,IAAI,GAAK,EAChE,CAAC0C,GAAY6gB,CAAa,EAAIvjB,EAAAA,SAAS,IAAI,EAE3C,CAACwjB,EAAcC,CAAe,EAAIzjB,WAAA,EAClC,CAAC0jB,EAAcC,EAAe,EAAI3jB,EAAAA,SAAS,IAAI,EAE/C,CAAC4jB,GAAgBC,EAAiB,EAAI7jB,EAAAA,SAAS,CAAE,GAAGoiB,GAAgB,EAEpEppB,EAAOe,EAAAA,QAAQ,IAAM,CACzB,GAAI,CAACsd,EAAY,OAAO,KACxB,MAAMzb,EAAO,CAAE,GAAGyb,CAAA,EAElB,GAAIxX,EAAU,CAEZ,IAAIikB,EAAS,CAAE,OAAQloB,EAAK,MAAA,EAC5B,OAAAmnB,EAAU,QAAQ,CAAC,CAAE,IAAA5kB,EAAK,KAAA4lB,KAAW,CACnC,GAAIA,IAAS,SAAWA,IAAS,YAAa,CAC5C,MAAMzpB,EAAQsB,EAAKuC,CAAG,EAClB4lB,IAAS,QAAUzpB,aAAiB,KACtCwpB,EAAO3lB,CAAG,EAAIijB,EAAW9mB,CAAK,EACrBypB,IAAS,UAAY5lB,IAAQ,WACtC2lB,EAAO3lB,CAAG,EAAI,GAAG7D,CAAK,IAEtBwpB,EAAO3lB,CAAG,EAAI7D,CAElB,CACF,CAAC,EACMwpB,CACT,CACA,OAAOloB,GAAQ,IACjB,EAAG,CAACyb,EAAYxX,EAAUkjB,EAAW3B,CAAU,CAAC,EAEhDlf,EAAAA,UAAU,IAAM,CACduhB,EAAgBzqB,CAAI,CACtB,EAAG,CAACA,CAAI,CAAC,EAETkJ,EAAAA,UAAU,IAAM,CACdghB,EAAgB,IAAI,GAAK,EACzBE,EAAsB,IAAI,GAAK,EAC/BE,GAAmB,IAAI,GAAK,EAC5BK,GAAgB,IAAI,EACpBJ,EAAc,IAAI,EAClBV,EAAgBzmB,GAASA,GAAQ+lB,EAAQ,EACzC0B,GAAkB,CAAE,GAAGzB,GAAgB,CACzC,EAAG,CAACrmB,CAAM,CAAC,EAIX,MAAMioB,GAAuBziB,EAAAA,YAAY,CAAC,CAAE,KAAA0iB,EAAM,MAAAhsB,EAAO,OAAA6rB,KAAa,CACpE,KAAM,CAAE,GAAAvpB,EAAI,OAAAa,EAAQ,KAAAQ,CAAA,EAAS3D,EACzBgsB,IAAS,QACXf,EAAiB9mB,GAAS,CACxB,MAAMC,EAAO,IAAI,IAAID,CAAI,EACzB,OAAAC,EAAK,IAAI9B,EAAI,CAAE,OAAAa,EAAQ,KAAAQ,EAAM,EACtBS,CACT,CAAC,EACQ4nB,IAAS,YAClBb,EAAuBhnB,GAAS,CAC9B,MAAMC,EAAO,IAAI,IAAID,CAAI,EACzB,OAAAC,EAAK,IAAI9B,EAAI,CAAE,OAAAa,EAAQ,KAAAQ,EAAM,EACtBS,CACT,CAAC,EACQ4nB,IAAS,YAClBX,GAAoBlnB,GAAS,CAC3B,MAAMC,EAAO,IAAI,IAAID,CAAI,EACzB,OAAAC,EAAK,IAAI9B,EAAI,CAAE,OAAAa,EAAQ,KAAAQ,EAAM,EACtBS,CACT,CAAC,EAEHwnB,GAAmBznB,GAAS,CAC1B,MAAMC,EAAO,CAAE,GAAGD,CAAA,EAClB,cAAO,KAAK0nB,CAAM,EAAE,QAAS3lB,GAAQ,CACnC9B,EAAK8B,CAAG,EAAI2lB,EAAO3lB,CAAG,CACxB,CAAC,EACM9B,CACT,CAAC,CACH,EAAG,CAAA,CAAE,EAEC6nB,GAAc3iB,cAAavK,GAAO,CACtC6rB,EAAe7rB,EAAG,KAAK,CACzB,EAAG,CAAA,CAAE,EAECmtB,GAAiB5iB,EAAAA,YACrB,SAAS4iB,EAAeC,EAAUvU,EAAO,OAAQ,CAC/C,MAAI,CAAC7V,GAAO,CAACoqB,GAAY,CAAC,MAAM,QAAQA,CAAQ,EAAUA,EACnDA,EACJ,OAAQvQ,GACF2P,EACE,CAAC3P,EAAE,UAAY,CAACA,EAAE,SAAS2P,EAAcxpB,EAAI,UAAU,EADpC,EAE3B,EACA,IAAK6Z,GAAM,CACV,MAAM2G,EAAO,CAAE,GAAG3G,CAAA,EAClB,OAAI2G,EAAK,OAAS,MAAM,QAAQA,EAAK,KAAK,GACxCA,EAAK,MAAQ2J,EAAe3J,EAAK,KAAK,EAC/BA,IAEL3K,IAAS,QAAU,CAAC2K,EAAK,QAC3BA,EAAK,MAAQ2H,IAIb,CAAC,QAAS,YAAa,UAAU,EAAE,SAAS3H,EAAK,GAAG,GACpDxgB,IAEAwgB,EAAK,IAAMxgB,EACXwgB,EAAK,SAAWqD,EACZrD,EAAK,MAAQ,YACfA,EAAK,gBAAkBoJ,GAAe,gBAC7BpJ,EAAK,MAAQ,SACtBA,EAAK,WAAaoJ,GAAe,WACjCpJ,EAAK,aAAeoJ,GAAe,cAC1BpJ,EAAK,MAAQ,aACtBA,EAAK,SAAWoJ,GAAe,UAEjCpJ,EAAK,YAAcwJ,IAEjBxJ,EAAK,KAAO,SACdA,EAAK,IAAMxgB,EACXwgB,EAAK,IAAM,gBACXA,EAAK,MAAQoI,EACbpI,EAAK,SAAWA,EAAK,UAAY0J,IAG/B1J,EAAK,OAAS,UAAYA,EAAK,MAAQ,aACzCA,EAAK,cAAiBlgB,GAAU,GAAGR,EAAE0gB,EAAK,KAAK,CAAC,IAAIlgB,CAAK,KAEvDkgB,EAAK,OAAMA,EAAK,KAAO1gB,EAAE0gB,EAAK,IAAI,GAClCA,EAAK,QAAOA,EAAK,MAAQ1gB,EAAE0gB,EAAK,KAAK,GACrCA,EAAK,UAASA,EAAK,QAAU2J,EAAe3J,EAAK,OAAO,GAExDA,EAAK,SAAQA,EAAK,OAAS,CAAE,GAAGA,EAAK,MAAA,GACrCA,EAAK,QAAQ,cACfA,EAAK,OAAO,YAAc1gB,EAAE0gB,EAAK,OAAO,WAAW,GAGnDgJ,GACAhJ,EAAK,YACLA,EAAK,WACHgJ,EACAxpB,EAAI,SAAA,EACJA,EAAI,gBAAgBwpB,CAAY,CAAA,EAGlChJ,EAAK,SAAW,UACJA,EAAK,SACZA,EACT,CAAC,CACL,EACA,CAACxgB,EAAKwpB,EAAc3F,EAAU+F,GAAgBhB,EAAa9oB,EAAGkqB,GAAsBE,EAAW,CAAA,EAG3FG,GAActqB,EAAAA,QAAQ,IAAM,CAChC,MAAMuqB,EAAStK,EAAM,OAASA,EAAQ+I,EACtC,OAAOoB,GAAeG,CAAM,CAC9B,EAAG,CAACtK,EAAO+I,EAAWoB,EAAc,CAAC,EAE/BI,GAAgBxqB,EAAAA,QACpB,IAAM,IAAI,IAAIsqB,GAAY,IAAK3d,GAAMA,EAAE,KAAK,CAAC,EAC7C,CAAC2d,EAAW,CAAA,EAKdniB,EAAAA,UAAU,IAAM,CACTqiB,GAAc,IAAI3B,CAAW,KAAkBT,EAAQ,CAC9D,EAAG,CAACoC,GAAe3B,CAAW,CAAC,EAE/B,MAAM4B,GAAazqB,EAAAA,QACjB,IAAMsqB,GAAY,IAAK3d,GAAMA,EAAE,GAAG,EAClC,CAAC2d,EAAW,CAAA,EAGRI,GAAeljB,EAAAA,YACnB,CAACmjB,EAAKC,EAASne,IAAS,CAmBtB,GAlBAke,EAAM,OAAOA,GAAQ,SAAW,CAAA,EAAK,CAAE,GAAGA,CAAA,EACrCA,EAAI,QACPA,EAAI,MAAQE,oBAAiB,CAC3B,UAAAxqB,GACA,SAAAyjB,EACA,WAAAvV,CAAA,CACD,GAEHoc,EAAI,MAAQG,GAAAA,oBAAoBH,EAAI,MAAQlK,GACtC,EAAAA,EAAK,KAAO,SACdA,EAAK,KAAOA,EAAK,MAAQhU,EAEzBgU,EAAK,QAAUA,EAAK,QAAQ,OAAQU,GAAOyJ,EAAQ,IAAIzJ,EAAG,EAAE,CAAC,EACzDV,EAAK,QAAQ,OAAS,GAG7B,EACDkK,EAAI,MAAQP,GAAeO,EAAI,MAAO,SAAS,EAC3C,CAACA,EAAI,OAAQ,CACf,MAAMI,EAAWJ,EAAI,MAAM,KAAMhe,GAAMA,EAAE,KAAK,EAC9Cge,EAAI,OAASI,EAAW,SAAW,KACrC,CACA,OAAOJ,CACT,EACA,CAACtqB,GAAWyjB,EAAUvV,EAAY6b,EAAc,CAAA,EAG5CY,GAAmBhrB,EAAAA,QAAQ,IAC3B,CAAC0oB,GAAU5iB,EAAiB,GACzB4kB,GAAahC,EAAQ8B,GAAe,KAAK,EAC/C,CAAC9B,EAAQ5iB,EAAU4kB,GAAcF,EAAa,CAAC,EAE5CS,GAAsBjrB,EAAAA,QAAQ,IAC9B,CAACyoB,GAAa3iB,EAAiB,GAC5B4kB,GAAajC,EAAW+B,GAAe,QAAQ,EACrD,CAAC/B,EAAW3iB,EAAU4kB,GAAcF,EAAa,CAAC,EAE/CU,GAAe1jB,EAAAA,YAAY,IAAM,CACrC,OAAS,CAAC2jB,EAAQ5qB,CAAK,IAAK2oB,EAC1B,GAAIld,EAAM,KAAKmf,CAAM,EAAG,CACtB,KAAM,CAAE,OAAA9pB,EAAQ,KAAAQ,CAAA,EAAStB,EACzBN,EAAI,KAAKoB,EAAQQ,CAAI,CACvB,CAEF,CAACunB,EAAoBE,EAAe,EAAE,QAAS8B,GAAY,CACzD,OAAS,CAAA,CAAG7qB,CAAK,IAAK6qB,EAAS,CAC7B,KAAM,CAAE,OAAA/pB,EAAQ,KAAAQ,CAAA,EAAStB,EACzBN,EAAI,KAAKoB,EAAQQ,CAAI,CACvB,CACF,CAAC,CACH,EAAG,CAAC5B,EAAK+L,EAAOkd,EAAcE,EAAoBE,EAAe,CAAC,EAE5D+B,GAAa7jB,EAAAA,YAAY,IAAM,CACnCvH,EAAI,KAAK,cAAe,CAAE,GAAI+B,EAAQ,CACxC,EAAG,CAAC/B,EAAK+B,CAAM,CAAC,EAEVspB,GAAO9jB,EAAAA,YAAY,IAAM,CAC7BvH,EAAI,KAAK,cAAe,CAAE,GAAI,KAAM,CACtC,EAAG,CAACA,CAAG,CAAC,EAEF2gB,GAAepZ,EAAAA,YAClBvK,GAAO,CACN,KAAM,CAAE,KAAAwjB,GAASxjB,EACbwjB,EAAK,KAAO,SACd4K,GAAA,EACS5K,EAAK,KAAO,QACrByK,GAAA,EAEEzK,EAAK,MAAM6K,GAAA,CACjB,EACA,CAACD,GAAYH,GAAcI,EAAI,CAAA,EAG3BC,GAAgB/jB,EAAAA,YACpB,CAACe,EAAGnE,EAAKonB,KACH3N,IAAoBtV,EAAE,OAAS,cAAa,YAAc,IAE9D4C,mBAAgB5C,EAAGtI,EAAI,SAAA,EAAYA,EAAI,gBAAgBsI,CAAC,EAAGnE,CAAG,EACzDonB,GAAOhC,EAAc,EAAK,EACxBjhB,GAET,CAACsV,GAAkB5d,CAAG,CAAA,EAGlBwrB,GAAOjkB,EAAAA,YACX,CAACuiB,EAAQ2B,IAAY,CACnB,OAAO3B,EAAO,MACd,OAAOA,EAAO,MAGZU,GAAW,QAAQ,UAAU,IAAM,IAClCV,EAAO,UAAY,CAACA,EAAO,WAE5B,OAAOA,EAAO,SAEhB,MAAMloB,EAAO,CACX,GAAIG,EACJ,KAAM+nB,CAAA,EAEJjG,GAAYnb,KAAY9G,EAAK,WAAa8G,IAE9C1I,EAAI,KAAK,cAAe4B,CAAI,EAGxB,CAACiiB,GAAY,CAAC4H,GAAS,QAAQR,GAAA,CACrC,EACA,CAACjrB,EAAK+B,EAAQ8hB,EAAUnb,GAAY8hB,GAAYS,EAAY,CAAA,EAGxDS,EAAenkB,EAAAA,YAClBvK,GAAO,CACN,GAAI,CAAE,OAAAmL,EAAQ,IAAAhE,EAAK,MAAAonB,CAAA,EAAUvuB,EAM7B,GAJIuuB,KAAqB,EAAI,EAE7BvuB,EAAG,OAASsuB,GAAc,CAAE,GAAGnjB,CAAA,EAAUhE,EAAKonB,CAAK,EAE/C,CAAC1H,EAAU4F,EAAgBzsB,EAAG,MAAM,UAC/B,CAAC0sB,GAAgB,CAAC6B,EAAO,CAChC,MAAM/K,EAAO6J,GAAY,KAAM3d,GAAMA,EAAE,MAAQvI,CAAG,EAC5Ce,EAAIiD,EAAOhE,CAAG,GACJ,CAACqc,EAAK,YAAcA,EAAK,WAAWtb,CAAC,KACrC,CAACsb,EAAK,UAAYtb,IAAIsmB,GAAKxuB,EAAG,MAAM,CACtD,CACF,EACA,CAAC6mB,EAAUyH,GAAe5B,EAAcW,GAAamB,EAAI,CAAA,EAGrDG,EAAapkB,EAAAA,YAChBvK,GAAO,CACD6mB,GAAU2H,GAAKxuB,EAAG,OAAQA,EAAG,OAAO,CAC3C,EACA,CAAC6mB,EAAU2H,EAAI,CAAA,EAGXI,GAAmBrkB,cAAaskB,GAAU,CAE9ClC,GAAgBkC,EAAM,MAAM,CAC9B,EAAG,CAAA,CAAE,EAECC,EAAiB/rB,EAAAA,QACrB,IACEqa,EACI,CACE,SAAWpd,GAAO,CAChBA,EAAG,eAAA,EACHgD,EAAI,KAAK,MAAM,CACjB,EACA,SAAWhD,GAAO,CAChBA,EAAG,eAAA,EACHgD,EAAI,KAAK,MAAM,CACjB,CAAA,EAEF,CAAA,EACN,CAACoa,EAAMpa,CAAG,CAAA,EAGZ,OAAOhB,QACJ+sB,UAAA,CACC,SAAAtrB,EAAAA,IAACurB,GAAAA,OAAA,CACC,IAAK,+BAA+BlD,CAAQ,IAAIlf,CAAG,GACnD,MAAOygB,GACP,OAAQrrB,EACR,OAAQ+rB,GACR,UAAWC,GACX,UAAAzC,EACA,OAAAD,EACA,SAAAziB,EACA,SAAAge,EACA,MAAA6E,EACA,YAAAE,EACA,SAAUjI,GACV,OAAQgL,EACR,aAAcC,GACd,SAAUF,EACV,QAASxT,GAAW,CAAE,GAAG4T,EAAgB,GAAG5T,CAAA,CAAQ,CAAA,EAExD,EACE,IACN,CC/bA,MAAM+T,GAAa,CAAC,CAAE,SAAAxK,EAAU,QAAAxe,EAAU,KAAM,IAAAjD,KAAU,CACxD,KAAM,CAACiG,EAAUC,CAAW,EAAIF,EAAAA,SAAS,IAAI,EAC7CkC,OAAAA,EAAAA,UAAU,IAAM,CACTlI,GACLA,EAAI,SAAS,EAAI,EAAE,KAAKkG,CAAW,CACrC,EAAG,CAAClG,CAAG,CAAC,EAGNS,EAAAA,IAACyrB,GAAAA,WAAA,CAAgB,IAAKjmB,EAAU,QAAAhD,EAC7B,SAAAwe,EACH,CAEJ,ECZA,SAAS0K,GAAS1sB,EAAO,CACxB,KAAM,CAAE,IAAAC,EAAK,OAAAoB,CAAA,EAAWrB,EAExB,SAASsB,EAASrB,EAAKsB,EAAK,CAC3B,MAAO,CACN,eAAgBA,EAAI,MACpB,YAAa,IAAItB,EAAI,OAAS,GAAK,EAAE,IAAA,CAEvC,CAEA,MAAM0sB,EAAOtrB,EAAO,MAEpB,OACCJ,OAAC,OAAI,UAAU,yBAAyB,MAAOK,EAASrB,EAAKoB,CAAM,EACjE,SAAA,CAAApB,EAAI,KACJe,EAAAA,IAAC,IAAA,CACA,UAAW,2BAA2Bf,EAAI,KAAO,OAAS,OAAO,eACjE,cAAY,mBAAA,CAAA,EAGbe,EAAAA,IAAC,IAAA,CAAE,UAAU,mCAAA,CAAoC,EAElDA,MAAC,MAAA,CAAI,UAAU,sBACb,WACAA,MAAC2rB,EAAA,CAAK,IAAA1sB,EAAU,OAAAoB,EAAgB,EAC7BpB,EAAI,KACPgB,EAAAA,KAAC,MAAA,CAAI,UAAU,6BACd,SAAA,CAAAD,EAAAA,IAACG,GAAAA,OAAA,CAAO,MAAOlB,EAAK,KAAM,GAAI,EAC9Be,EAAAA,IAAC,OAAA,CAAK,UAAU,cAAe,WAAI,IAAA,CAAK,CAAA,EACzC,EAEAf,EAAI,IAAA,CAEN,CAAA,EACD,CAEF,CCpCA,SAAS2sB,GAAgB5sB,EAAO,CAC/B,KAAM,CAAE,IAAAC,EAAK,OAAAoB,CAAA,EAAWrB,EAElB2sB,EAAOtrB,EAAO,MAEpB,OACCL,EAAAA,IAAC,MAAA,CAAI,UAAU,oCAAoC,eAAcf,EAAI,KACpE,SAAAe,EAAAA,IAAC,MAAA,CAAI,UAAU,sBACb,SAAA2rB,EACA3rB,MAAC2rB,GAAK,IAAA1sB,EAAU,OAAAoB,CAAA,CAAgB,EAC7BpB,EAAI,KACPe,EAAAA,IAAC,MAAA,CAAI,UAAU,wBACd,SAAAA,EAAAA,IAACG,GAAAA,OAAA,CAAO,MAAOlB,EAAK,KAAM,EAAA,CAAI,CAAA,CAC/B,EAEAA,EAAI,KAEN,EACD,CAEF,CCpBA,SAAS8E,GAAS/E,EAAO,CACxB,KAAM,CAAE,IAAAC,EAAK,OAAAoB,CAAA,EAAWrB,EAExB,OACCgB,EAAAA,IAAC,MAAA,CAAI,UAAU,cAAc,mBAAkB6L,EAAAA,MAAM5M,EAAI,EAAE,EACzD,WAAO,SAAS4sB,GAAAA,SAAS5sB,EAAKoB,CAAM,CAAC,EACvC,CAEF,CC2BA,SAASyrB,GAAa9sB,EAAO,CAC3B,KAAM,CAAE,IAAAO,EAAK,KAAA2I,EAAO,OAAQ,SAAAlE,GAAahF,EAEnCwD,EAAUlD,EAAAA,QACd,IAAMN,EAAM,SAAW+sB,sBAAA,EACvB,CAAC/sB,EAAM,OAAO,CAAA,EAIV,CAACgtB,EAAgBC,CAAiB,EAAI1mB,EAAAA,SAAS,EAAE,EACvDkC,EAAAA,UAAU,IAAM,CACd,MAAMgI,EAAQ/K,GAAA,EACdunB,EAAmBtqB,GAAUA,IAAS8N,EAAQ9N,EAAO8N,CAAM,CAC7D,EAAG,CAAA,CAAE,EAEL,MAAMyc,EAAaxsB,EAAAA,SAASH,EAAK,YAAY,EACvCia,EAAU9Z,EAAAA,SAASH,EAAK,SAAS,EACjC4sB,EAAgBzsB,EAAAA,SAASH,EAAK,eAAe,EAC7C2C,EAAaxC,EAAAA,SAASH,EAAK,YAAY,EACvC6sB,EAAe1sB,EAAAA,SAASH,EAAK,SAAS,EACtCkD,EAAY/C,EAAAA,SAASH,EAAK,WAAW,EACrC6C,EAAc1C,EAAAA,SAASH,EAAK,aAAa,EACzC8sB,EAAe3sB,EAAAA,SAASH,EAAK,eAAe,EAC5CoT,EAAgBjT,EAAAA,SAASH,EAAK,eAAe,EAC7Cqa,EAAela,EAAAA,SAASH,EAAK,eAAe,EAC5C2Y,EAAwBxY,EAAAA,SAASH,EAAK,wBAAwB,EAC9DsL,GAAcnL,EAAAA,SAASH,EAAK,aAAa,EACzC8V,EAAO3V,EAAAA,SAASH,EAAK,MAAM,EAE3B2oB,EAAW/oB,EAAAA,WAAWC,GAAAA,QAAQ,IAAI,EAClCgR,EAAI9Q,EAAAA,QAAQ,IAAM4oB,GAAYjK,EAAAA,OAAO,CAAE,GAAGF,GAAAA,GAAI,GAAGD,GAAAA,EAAA,CAAQ,EAAG,CAACoK,CAAQ,CAAC,EACtE7oB,EAAIC,EAAAA,QAAQ,IAAM8Q,EAAE,SAAS,OAAO,EAAG,CAACA,CAAC,CAAC,EAE1C,CAACtN,EAAgBwpB,EAAiB,EAAI/mB,EAAAA,SAAS,CAAC,EAChD,CAAC8B,EAAiBC,CAAkB,EAAI/B,EAAAA,SAAS,CAAC,EAClD,CAACgnB,EAAsBC,CAAuB,EAAIjnB,EAAAA,SAAS,CAAC,EAE5DwJ,EAAe5H,EAAAA,OAAO,IAAI,EAC1BslB,EAAmBtlB,EAAAA,OAAO,IAAI,EAC9BulB,EAAoBvlB,EAAAA,OAAO,IAAI,EAC/BwlB,EAAYxlB,EAAAA,OAAO,IAAI,EACvBylB,EAAoBzlB,EAAAA,OAAO,IAAI,EAE/BkP,EAAUlP,EAAAA,OAAOkO,CAAI,EAC3BgB,EAAQ,QAAUhB,EAElB,MAAMwX,GAAa1lB,EAAAA,OAAO,IAAI,EACxB2lB,GAAc3lB,EAAAA,OAAO,IAAI,EACzB4lB,GAAgB5lB,EAAAA,OAAO,CAAC,EACxB6lB,EAAwB7lB,EAAAA,OAAO,CAAC,EAChCyO,EAAkBzO,EAAAA,OAAO,EAAK,EAE9B,CAAC8lB,EAAcC,CAAe,EAAI3nB,EAAAA,SAAS,CAAA,CAAE,EAE7C4nB,GAAe7tB,EAAAA,QAAQ,IAAM,CACjC,GAAI,CAACkD,GAAW,CAACA,EAAQ,aAAe,CAAA,EACxC,IAAI4F,EAAOglB,GAAAA,yBAAyB5qB,CAAO,EAAE,IAAKjC,IAAQ,CACxDA,GAAM,CAAE,GAAGA,EAAA,EACX,MAAM8H,EAAS9H,GAAI,OACnB,GAAI,OAAO8H,GAAW,SAAU,CAC9B,MAAMglB,EAAOhlB,EAAO,MAAQhJ,EAAEgJ,EAAO,IAAI,EACzC9H,GAAI,OAAS,CAAE,GAAG8H,EAAQ,KAAAglB,CAAA,CAC5B,MAAO9sB,GAAI,OAASlB,EAAEgJ,CAAM,EAE5B,OAAA9H,GAAI,MAAQA,GAAI,OAAS,OACzBA,GAAI,OAAS,GACNA,EACT,CAAC,EACD,MAAM+sB,EAAKllB,EAAK,UAAWzF,IAAMA,GAAE,KAAO,MAAM,EAEhD,OAAI2qB,IAAO,KACLllB,EAAKklB,CAAE,EAAE,OAAMllB,EAAKklB,CAAE,EAAE,MAAQllB,EAAKklB,CAAE,EAAE,MAC7CllB,EAAKklB,CAAE,EAAI,CACT,GAAGllB,EAAKklB,CAAE,EACV,OAAQlrB,IAAgB,QAAU,GAAKgG,EAAKklB,CAAE,EAAE,OAChD,KAAMlrB,IAAgB,QAAUwpB,GAAkBF,EAAA,GAIlDtjB,EAAK,OAAS,IAAGA,EAAKA,EAAK,OAAS,CAAC,EAAE,OAAS,IAC7CA,CACT,EAAG,CAAC5F,EAASnD,EAAG+C,CAAW,CAAC,EAEtBoH,GAAYlK,EAAAA,QAChB,IAAMgE,GAAa4oB,EAAYC,CAAa,EAC5C,CAACD,EAAYC,CAAa,CAAA,EAGtB,CAAC9pB,GAAaiD,CAAc,EAAIC,EAAAA,SAAS,CAAC,EAEhDkC,EAAAA,UAAU,IAAM,CACd,IAAIgI,EACAmK,EAAcnK,EAAQmK,EACjBxX,IAAgB,QAASqN,EAAQyI,GAAyB,EAC9DzI,EAAQhN,EACb6C,EAAgB3D,GAAUA,IAAS8N,EAAQ9N,EAAO8N,CAAM,CAC1D,EAAG,CAACmK,EAAcxX,EAAa8V,EAAuBzV,CAAS,CAAC,EAEhE,MAAM6G,GAAahK,EAAAA,QACjB,IAAMyD,GAAcoqB,GAAc/qB,EAAa,MAAM,EACrD,CAAC+qB,GAAc/qB,CAAW,CAAA,EAGtBmrB,GAAkBpmB,EAAAA,OAAOgmB,EAAY,EAC3C1lB,EAAAA,UAAU,IAAM,CACd8lB,GAAgB,QAAUJ,EAC5B,EAAG,CAACA,EAAY,CAAC,EAEjB,MAAMK,GAAeluB,EAAAA,QACnB,IAAMuE,GAAuB2V,EAASzV,GAAUC,CAAQ,EACxD,CAACwV,EAASxV,CAAQ,CAAA,EAGdgF,GAAY1J,EAAAA,QAChB,IAAMiD,GAAa6pB,GAAgB,GAAIhqB,EAAaK,CAAS,EAC7D,CAAC2pB,EAAchqB,EAAaK,CAAS,CAAA,EAKjCgrB,GAAkBnuB,EAAAA,QACtB,KAAOka,GAAS,OAAS,GAAK1W,EAAiBuE,EAC/C,CAACmS,EAAS1W,EAAgBuE,CAAe,CAAA,EAGrCqmB,GAAkBpuB,EAAAA,QAAQ,IAAM,CACpC,MAAMquB,EAAWzB,GAAY,OAAShqB,EAChC0rB,EACJrB,GAAwBkB,GAAkBzB,EAAiB,GAC7D,OAAO2B,EAAWC,CACpB,EAAG,CACD1B,EACAhqB,EACAqqB,EACAkB,GACAzB,CAAA,CACD,EAIK6B,GAAiBvuB,EAAAA,QACrB,IAAM+C,GAAcgF,GAAmBqmB,GAAkB1B,EAAiB,GAC1E,CAAC3pB,GAAagF,EAAiBqmB,GAAiB1B,CAAc,CAAA,EAG1D8B,GAAuBhnB,cAAa0I,GAAS,CACjDwd,EAAsB,QAAUxd,EAEhCsd,GAAY,SAAS,KAAK,YAAa,CAAE,KAAAtd,EAAM,EAC3Cmd,EAAU,SAAW,KAAK,IAAIA,EAAU,QAAQ,WAAand,CAAI,EAAI,IACvEmd,EAAU,QAAQ,WAAand,EACnC,EAAG,CAAA,CAAE,EAEL5G,EAAAA,gBAAgB,IAAM,CACpB,GAAI,CAACrJ,EAAK,OAEV,MAAMwuB,EAAkBxuB,EAAI,mBAAA,EAAqB,WACjD,GAAI,CAACwuB,GAAiB,UAAW,OAEjC,MAAMC,EAAoBnuB,GAAU,CAClC,MAAM2P,EAAO3P,GAAS,EAEtB,GADAktB,GAAc,QAAUvd,EACpBoG,EAAgB,QAAS,CAC3BA,EAAgB,QAAU,GAC1B,MACF,CACAkY,GAAqBte,CAAI,CAC3B,EAEMye,GAAcF,EAAgB,UAAUC,CAAgB,EACxDE,EAAc3uB,EAAI,WAAA,EAAa,WACrC,OAAI2uB,IAAgB,QAAWF,EAAiBE,CAAW,EAEpD,IAAM,CACP,OAAOD,IAAgB,WAAYA,GAAA,MACrB,cAAA,CACpB,CACF,EAAG,CAAC1uB,EAAKuuB,EAAoB,CAAC,EAG9B,MAAM5jB,GAAmB/C,EAAAA,OAAO,IAAI,EAC9BgD,GAAmB,IAAM,CAC7BD,GAAiB,QAAU,CACzB,IAAA3K,EACA,cAAA4sB,EACA,qBAAA2B,EAAA,CAEJ,EACA3jB,GAAA,EACA1C,EAAAA,UAAU,IAAM,CACd0C,GAAA,CACF,EAAG,CAAC5K,EAAK4sB,EAAe2B,EAAoB,CAAC,EAG7CrmB,EAAAA,UAAU,IAAM,CACd,MAAME,EAAK,IAAI,eAAe,IAAM,CAC9BoH,EAAa,SACfud,GAAkBvd,EAAa,QAAQ,WAAW,EAChD0d,EAAiB,SACnBnlB,EAAmBmlB,EAAiB,QAAQ,WAAW,EACrDC,EAAkB,SACpBF,EAAwBE,EAAkB,QAAQ,YAAY,CAClE,CAAC,EACD,OAAI3d,EAAa,SAASpH,EAAG,QAAQoH,EAAa,OAAO,EACrD0d,EAAiB,SAAS9kB,EAAG,QAAQ8kB,EAAiB,OAAO,EAC7DC,EAAkB,SAAS/kB,EAAG,QAAQ+kB,EAAkB,OAAO,EAE/D3d,EAAa,SACfud,GAAkBvd,EAAa,QAAQ,WAAW,EAChD0d,EAAiB,SACnBnlB,EAAmBmlB,EAAiB,QAAQ,WAAW,EACrDC,EAAkB,SACpBF,EAAwBE,EAAkB,QAAQ,YAAY,EACzD,IAAM/kB,EAAG,WAAA,CAClB,EAAG,CAAA,CAAE,EAEL,SAASZ,GAAQxK,EAAI,CACnB,MAAMoE,EAASpE,EAAG,OAAO,QAAQ,OACjC,GAAIoE,IAAW,oBAAqB,CAClCpE,EAAG,eAAA,EACH,MAAMuD,GAAKmH,EAAAA,SAAS1K,CAAE,EAChBgC,EAAO2tB,EAAW,KAAM,GAAM,EAAE,KAAOpsB,EAAE,EAC3CvB,EAAK,MAAMgB,EAAI,KAAKoB,EAAQ,CAAE,GAAAb,GAAI,KAAM,CAACvB,EAAK,IAAA,CAAM,CAC1D,CACF,CAEA,MAAM4vB,GAAWrnB,cAAasnB,GAAS,CACrCvB,GAAW,QAAUuB,EACrBA,EAAK,GAAG,aAAe7xB,GAAO,CAC5B2wB,EAAiBvrB,IAAUA,GAAK,CAAC,IAAMpF,EAAG,GAAKoF,GAAO,CAACpF,EAAG,EAAE,CAAE,CAChE,CAAC,EACD6xB,EAAK,UAAU,YAAc7xB,GAAO,CAClC,KAAM,CAAE,IAAAmH,GAAK,IAAA4G,CAAA,EAAQ/N,EACf,CAAE,IAAAgD,EAAK,cAAA4sB,CAAAA,EAAkBjiB,GAAiB,QAC1CK,EAAU4hB,EACZA,EAAc,KAAM3hB,GAAMA,EAAE,MAAQ9G,EAAG,EACvC,KACJ,IAAIC,EAAQ,MACZ,OAAI4G,IAAS5G,EAAQ,CAAC4G,GAAWA,EAAQ,QAAU,MAAQ,OAAS,OAEpEhL,EAAI,KAAK,iBAAkB,CACzB,IAAAmE,GACA,MAAAC,EACA,IAAA2G,EACA,SAAUijB,GAAgB,OAAA,CAC3B,EACM,EACT,CAAC,EAEDa,EAAK,UAAU,gBAAkB7xB,GAAO,CACtCA,EAAG,iBAAmB0G,GAAcsqB,GAAgB,QAAShxB,EAAG,EAAE,CACpE,CAAC,EAED6xB,EAAK,GAAG,gBAAiB,IAAM,CAC7B9oB,EAAelC,GAAgBgrB,EAAK,SAAA,EAAW,OAAO,CAAC,CACzD,CAAC,EAEDA,EAAK,GAAG,YAAc7xB,GAAO,CACvBA,EAAG,MAAQ,QAAa,CAACA,EAAG,OAC9BuwB,GAAY,SAAS,KAAK,YAAa,CACrC,IAAKvwB,EAAG,IACR,MAAO,EAAA,CACR,CACL,CAAC,CACH,EAAG,CAAA,CAAE,EAEC8xB,GAAYvnB,cAAawnB,GAAS,CACtCxB,GAAY,QAAUwB,EACtBpkB,GAAiB,QAAQ,qBAAqB8iB,EAAsB,OAAO,EAE3EsB,EAAK,GAAG,aAAe/xB,GAAO,CAC5B2wB,EAAiBvrB,IAAUA,GAAK,CAAC,IAAMpF,EAAG,GAAKoF,GAAO,CAACpF,EAAG,EAAE,CAAE,CAChE,CAAC,EAED+xB,EAAK,GAAG,YAAc/xB,GAAO,CAEzBA,EAAG,OAAS,QACZ,CAACA,EAAG,OACJ,KAAK,IAAIA,EAAG,KAAOywB,EAAsB,OAAO,EAAI,IAEpDA,EAAsB,QAAUzwB,EAAG,KACnCwwB,GAAc,QAAUxwB,EAAG,KAC3BqZ,EAAgB,QAAU,GAExB+W,EAAU,SACV,KAAK,IAAIA,EAAU,QAAQ,WAAapwB,EAAG,IAAI,EAAI,IAEnDowB,EAAU,QAAQ,WAAapwB,EAAG,MACpC2N,GAAiB,QAAQ,IAAI,KAAK,eAAgB,CAAE,KAAM3N,EAAG,KAAM,GAEjEA,EAAG,MAAQ,QAAa,CAACA,EAAG,OAC9BswB,GAAW,SAAS,KAAK,YAAa,CACpC,IAAKtwB,EAAG,IACR,MAAO,EAAA,CACR,CACL,CAAC,CACH,EAAG,CAAA,CAAE,EAEL,SAASgyB,GAAatvB,EAAKsB,EAAK,CAC9B,MAAMV,GAAQgsB,GAAAA,SAAS5sB,EAAKsB,CAAG,EAC/B,GAAIV,GACF,OAAOA,GAAM,QAAU,IAAM,eAAiB,aAGhD,GAAIU,EAAI,OAAS,OAASA,EAAI,OAAS,OAAQ,MAAO,GAEtD,MAAMiuB,EAAmBjvB,EAAI,oBAAoBN,CAAG,EACpD,GAAIuvB,GAEF,GAAI,CADiBA,EAAiB,aAAajuB,EAAI,IAAI,EACxC,OAAOiuB,EAAiB,KAAO,qBACzC7b,EAAe,OAAOA,EAAcpS,EAAI,KAAMA,EAAI,IAAI,EAEjE,MAAO,EACT,CAEA,MAAM+V,GAAUhX,EAAAA,QACd,IACEC,EACI+T,GACE/T,EACA,IAAM8W,EAAQ,QACd,IAAMuW,EAAkB,OAAA,EAE1B,KACN,CAACrtB,CAAG,CAAA,EAWN,OAPAkI,EAAAA,UAAU,IAAM,CACd,MAAMpL,EAAOuwB,EAAkB,QAC/B,GAAI,GAACvwB,GAAQ,CAACia,IACd,OAAAja,EAAK,iBAAiB,QAASia,EAAO,EAC/B,IAAMja,EAAK,oBAAoB,QAASia,EAAO,CACxD,EAAG,CAACA,EAAO,CAAC,EAEP/W,EAGHS,EAAAA,IAAC,MAAA,CACC,UAAU,+BACV,MAAO,CAAE,uBAAwB,GAAGgsB,CAAc,IAAA,EAClD,IAAKjd,EACL,mBAAiB,OAEjB,SAAA9O,EAAAA,KAAC,MAAA,CAAI,UAAU,wBACZ,SAAA,CAAAuC,GAAWA,EAAQ,OAClBvC,EAAAA,KAAAC,EAAAA,SAAA,CACE,SAAA,CAAAF,EAAAA,IAAC,MAAA,CACC,UAAW,CACT,oBACA,cACA0tB,GAAkB,cAAgB,GAClCD,IAAmB,CAACI,GAAiB,sBAAwB,EAAA,EAE5D,OAAO,OAAO,EACd,KAAK,GAAG,EACX,MAAO,CAAE,KAAM,OAAO7kB,EAAS,EAAA,EAC/B,IAAKyjB,EAEL,SAAAzsB,EAAAA,IAAC,MAAA,CAAI,UAAU,4BACb,SAAAA,EAAAA,IAAC,MAAA,CACC,UAAU,+BACV,QAAA+G,GAEA,SAAA/G,EAAAA,IAACmF,GAAAA,KAAA,CACC,KAAMgpB,GACN,MAAO,CACL,UAAWjsB,EACX,aAAcsX,EAAUA,EAAQ,OAAS6S,EAAe,CAAA,EAE1D,YAAc9rB,GAAQ,WAAWA,EAAI,KAAK,GAC1C,KAAM2rB,GAAc,CAAA,EACpB,QAAS5iB,GACT,UAAAE,GACA,aAAAyjB,CAAA,CAAA,CACF,CAAA,CACF,CACF,CAAA,CAAA,EAGFjtB,EAAAA,IAAC4X,GAAA,CAAQ,eAAA9U,EAAgC,IAAAvD,CAAA,CAAU,CAAA,CAAA,CACrD,EACE,KAEJU,EAAAA,KAAC,MAAA,CAAI,UAAU,uBAAuB,IAAK2sB,EACzC,SAAA,CAAA5sB,EAAAA,IAAC,MAAA,CACC,UAAW,CACT,wBACA,cACA0tB,GAAkB,sBAAwB,EAAA,EAEzC,OAAO,OAAO,EACd,KAAK,GAAG,EACX,IAAKf,EAEL,SAAA3sB,EAAAA,IAAC0X,IAAW,IAAAnY,CAAA,CAAU,CAAA,CAAA,EAEvB2I,IAAS,OACRlI,EAAAA,IAAC,MAAA,CACC,UAAU,sCACV,IAAK0sB,EAEL,SAAA1sB,EAAAA,IAACmF,GAAAA,KAAA,CACC,KAAMkpB,GACN,QAASb,GACT,KAAMtB,GAAc,CAAA,EACpB,MAAO,CACL,UAAWhqB,EACX,aAAc,CAAA,EAEhB,aAAA+qB,EACA,SAAU,IACRpiB,KAAgB,SAAW,mBAAqB,GAElD,UAAW0jB,EAAA,CAAA,CACb,CAAA,EAEA,IAAA,CAAA,CACN,CAAA,CAAA,CACF,CAAA,CAAA,EApFa,IAuFnB,CCzcA,SAASE,GAAazvB,EAAO,CAC3B,KAAM,CACJ,IAAAO,EACA,GAAAwhB,EAAK,QACL,SAAA2N,EAAW,GACX,QAASC,EACT,SAAA9N,EACA,GAAGtD,CAAA,EACDve,EAEJ,SAAS4vB,EAAgBC,EAAStyB,EAAI,CACpC,GAAI,CAACgD,EAAK,OAAO,KAGjB,MAAM+B,EAAS3E,EAAAA,MAAMkyB,EAAS,cAAc,EAC5C,GAAIvtB,EAAQ,CACV,MAAM/C,EAAOgB,EAAI,QAAQ+B,CAAM,EAC/B,GAAI,CAAC/C,EAAM,OAAO,KAClB,GAAImwB,EAAU,CACZ,MAAMryB,EAAOwyB,EAAQ,cAAc,aAAa,EAChD,GAAIxyB,GAAQA,EAAK,aAAeA,EAAK,YAAa,OAAO,IAC3D,CACA,MAAM8P,EAAelF,EAAAA,SAAS1K,EAAG,OAAQ,cAAc,EACvD,OAAIoyB,EACK,CAAE,IAAApvB,EAAK,KAAM,CAAE,KAAAhB,EAAM,aAAA4N,EAAa,EAErCA,IAAiB,KACZ5N,EAAK,WAAW4N,CAAY,GAAG,MAAQ,GAEvC5N,EAAK,MAAQ,EAG1B,CAGA,MAAMksB,EAAS9tB,EAAAA,MAAMkyB,EAAS,cAAc,EAC5C,GAAIpE,EAAQ,CAEV,MAAM9e,EADQpM,EAAI,SAAA,EACC,MAAM,KAAKkrB,CAAM,EACpC,OAAK9e,GACDgjB,EACK,CAAE,IAAApvB,EAAK,KAAM,CAAE,KAAAoM,EAAK,EAFX,IAMpB,CAGA,MAAMmjB,EAAWnyB,EAAAA,MAAMkyB,EAAS,gBAAgB,EAChD,GAAIC,EAAU,CACZ,MAAMvwB,EAAOgB,EAAI,QAAQuvB,CAAQ,EACjC,OAAKvwB,EACDowB,EACK,CAAE,IAAApvB,EAAK,KAAM,CAAE,OAAQhB,EAAK,EAE5BA,EAAK,MAAQ,GAJJ,IAMpB,CAGA,MAAMwwB,EAAapyB,EAAAA,MAAMkyB,EAAS,kBAAkB,EACpD,GAAIE,EAAY,CACd,MAAMjY,EAAWvX,EAAI,YAAYwvB,CAAU,EAC3C,OAAKjY,EACD6X,EACK,CACL,IAAApvB,EACA,KAAM,CAAE,SAAAuX,CAAA,CAAS,EAGZA,EAAS,MAAQ,GAPJ,IASxB,CAGA,OAAO,IACT,CAEA,OACE9W,EAAAA,IAACgvB,GAAAA,QAAA,CACC,GAAAjO,EACA,QAAS4N,EACT,SAAU9N,GAAY+N,EACrB,GAAGrR,CAAA,CAAA,CAGV,CCtFA,SAAS0R,GAAS,CAAE,MAAAC,EAAQ,GAAM,SAAAlO,GAAY,CAC5C,OAAIA,EACKhhB,EAAAA,IAACmvB,GAAAA,SAAA,CAAa,MAAAD,EAAe,SAAAlO,EAAA,EAAW,EAExChhB,MAACmvB,GAAAA,UAAa,MAAAD,EAAc,CAEvC,CCLA,SAASE,GAAO,CAAE,MAAAF,EAAQ,GAAM,SAAAlO,GAAY,CAC1C,OAAOA,QACJqO,GAAAA,OAAA,CAAW,MAAAH,EACV,eAACI,GAAAA,OAAA,CAAY,SAAAtO,CAAA,CAAS,CAAA,CACxB,EAEA/gB,EAAAA,KAAAC,EAAAA,SAAA,CACE,SAAA,CAAAF,EAAAA,IAACsvB,GAAAA,OAAA,EAAW,EACZtvB,MAACqvB,GAAAA,QAAW,MAAAH,CAAA,CAAc,CAAA,EAC5B,CAEJ,CCXA,SAAwBK,GAAW,CAAE,MAAAL,EAAQ,GAAM,SAAAlO,GAAY,CAC7D,OAAIA,QAECwO,cAAA,CAAe,MAAAN,EACd,SAAAlvB,EAAAA,IAACyvB,cAAA,CAAgB,SAAAzO,EAAS,EAC5B,EAIA/gB,EAAAA,KAAAC,WAAA,CACE,SAAA,CAAAF,MAACyvB,GAAAA,YAAe,MAAAP,EAAc,EAC9BlvB,MAACwvB,GAAAA,YAAe,MAAAN,CAAA,CAAc,CAAA,EAChC,CAGN,kCCaaQ,GAAUC,GAAI"}