UNPKG

tdesign-mobile-vue

Version:
1 lines 65.9 kB
{"version":3,"file":"tree-store.mjs","sources":["../../../../src/_common/js/table/tree-store.ts"],"sourcesContent":["import { isUndefined, get, set } from 'lodash-es';\n/* eslint-disable class-methods-use-this */\n/* eslint-disable no-param-reassign */\n/* eslint-disable no-use-before-define */\nimport { isRowSelectedDisabled } from './utils';\nimport { PrimaryTableCol, TableRowState, TableRowValue, TableRowData } from './types';\nimport log from '../log';\n\nexport type TableTreeDataMap = Map<string | number, TableRowState>;\n\nexport interface TableRowModel<T> extends TableRowState<T> {\n setData?: (key: string | number, data: T) => void;\n}\n\nexport interface KeysType {\n rowKey: string;\n childrenKey: string;\n}\n\nexport interface SwapParams<T> {\n current: T;\n target: T;\n currentIndex: number;\n targetIndex: number;\n}\n\nexport const TABLE_TREE_ERROR_CODE_NOT_SAME_LEVEL = {\n code: 1001,\n reason: 'The same level of rows can not be swapped.',\n};\n\n/**\n * 获取行唯一标识\n * @param row 行数据\n * @param colKey 列字段\n * @param rowIndex 行下标\n * @param level 层级\n */\nexport function getUniqueRowValue(row: TableRowData, colKey: string, rowIndex: number = 0, level: number = 0) {\n const rowValue = get(row, colKey);\n return rowIndex || level ? `${rowValue}_${rowIndex || 0}_${level || 0}}` : rowValue;\n}\n\n/**\n * 表格树形结构处理器\n * Vue 和 React 可以通用\n * 关键函数有以下几个\n * @toggleExpandData 处理树形结构展开收起\n * @setData 更新当行数据\n * @getData 获取单行数据\n * @remove 移除行数据,及其子节点\n * @appendTo 追加子节点到末尾\n */\nclass TableTreeStore<T extends TableRowData = TableRowData> {\n /** 树形结构 Map 存储 */\n treeDataMap: TableTreeDataMap = new Map();\n\n expandAllRowIndex: 0;\n\n constructor() {\n this.treeDataMap = new Map();\n }\n\n /**\n * 初始化 treeDataMap,不会改变 dataSource\n * @param dataSource 树形数据源\n * @param columns 列配置\n * @param keys 字段别名\n */\n initialTreeStore(dataSource: T[], columns: PrimaryTableCol[], keys: KeysType) {\n this.treeDataMap?.clear();\n this.initialTreeDataMap(this.treeDataMap, dataSource, columns.find((col) => col.colKey === 'row-select'), keys);\n }\n\n /**\n * 获取所有节点的唯一标识\n */\n getAllUniqueKeys(data: T[], keys: KeysType, arr: T[] = []) {\n for (let i = 0, len = data.length; i < len; i++) {\n const item = data[i];\n arr.push(getUniqueRowValue(item, keys.rowKey));\n const children = get(item, keys.childrenKey);\n if (children?.length) {\n this.getAllUniqueKeys(children, keys, arr);\n }\n }\n return arr;\n }\n\n getExpandedChildrenKeys(data: T[], keys: KeysType, arr: (string | number)[] = []) {\n for (let i = 0, len = data.length; i < len; i++) {\n const item = data[i];\n const rowValue = getUniqueRowValue(item, keys.rowKey);\n const rowState = this.treeDataMap.get(rowValue);\n if (rowState.expanded) {\n arr.push(rowValue);\n }\n const children = get(item, keys.childrenKey);\n if (children?.length) {\n this.getExpandedChildrenKeys(children, keys, arr);\n }\n }\n return arr;\n }\n\n expandTreeNode(rowList: (string | number)[], dataSource: T[], keys: KeysType) {\n if (!rowList.length) return dataSource;\n rowList.forEach((rowValue) => {\n const rowState = this.treeDataMap.get(rowValue);\n if (!rowState) return;\n this.toggleExpandData({ row: rowState.row as T, rowIndex: rowState.rowIndex }, dataSource, keys, 'expand');\n });\n return dataSource;\n }\n\n foldTreeNode(rowList: (string | number)[], dataSource: T[], keys: KeysType) {\n if (!rowList.length) return dataSource;\n rowList.forEach((rowValue) => {\n const rowState = this.treeDataMap.get(rowValue);\n if (!rowState) return;\n this.toggleExpandData({ row: rowState.row as T, rowIndex: rowState.rowIndex }, dataSource, keys, 'fold');\n });\n return dataSource;\n }\n\n toggleExpandData(p: { rowIndex: number; row: T }, dataSource: T[], keys: KeysType, type?: 'expand' | 'fold') {\n if (!p) {\n log.error('EnhancedTable', 'the node toggleExpanded doest not exist in `data`');\n return dataSource;\n }\n const rowValue = get(p.row, keys.rowKey);\n if (isUndefined(rowValue)) {\n log.error('EnhancedTable', '`rowKey` could be wrong, can not get rowValue from `data` by `rowKey`.');\n return [];\n }\n const childrenNodes = get(p.row, keys.childrenKey);\n // childrenNodes = true,表示懒加载,直接返回,暂时不做展开处理\n if (childrenNodes === true) return dataSource;\n const r = this.treeDataMap.get(rowValue);\n if (type === 'expand' && r.expanded) return dataSource;\n if (type === 'fold' && !r.expanded) return dataSource;\n r.rowIndex = r.rowIndex ?? p.rowIndex;\n r.expanded = !r.expanded;\n this.treeDataMap.set(rowValue, r);\n return this.updateExpandRow(r, dataSource, keys);\n }\n\n updateExpandRow(changeRow: TableRowState, dataSource: T[], keys: KeysType): T[] {\n const { row, rowIndex, expanded } = changeRow;\n const { treeDataMap } = this;\n const childrenNodes = get(row, keys.childrenKey);\n if (!row || !childrenNodes) return dataSource;\n if (expanded) {\n updateChildrenRowState(treeDataMap, changeRow, expanded, keys);\n updateRowExpandLength(treeDataMap, row, childrenNodes.length, 'expand', keys);\n // eslint-disable-next-line\n dataSource.splice.apply(dataSource, [rowIndex + 1, 0].concat(childrenNodes));\n } else {\n updateChildrenRowState<T>(treeDataMap, changeRow, expanded, keys);\n const len = changeRow.expandChildrenLength || childrenNodes.length;\n updateRowExpandLength(treeDataMap, row, -1 * len, 'fold', keys);\n dataSource.splice(rowIndex + 1, len);\n }\n // 展开或收起后,会影响后续节点的 rowIndex,需同步更新\n updateRowIndex(treeDataMap, dataSource, {\n rowKey: keys.rowKey,\n minRowIndex: rowIndex + 1,\n });\n return dataSource;\n }\n\n /**\n * 获取当前行全部数据\n * @param key 行唯一标识\n * @returns {TableRowState} 当前行数据\n */\n getData(key: TableRowValue): TableRowState {\n return this.treeDataMap.get(key);\n }\n\n /**\n * 更新当前行数据,并返回当前行下标\n * @param rowValue 当前行唯一标识值\n * @param newRowData 新行数据\n * @returns {number} rowIndex 设置的行下标\n */\n updateData(rowValue: TableRowValue, newRowData: T, dataSource: T[], keys: KeysType): number {\n const newRowValue = getUniqueRowValue(newRowData, keys.rowKey);\n const rowState = this.treeDataMap.get(rowValue);\n // Map 没有查询到,或者查询到的 rowIndex 值为 -1,均表示当前数据不在 dataSource 列表中,未显示在页面中\n if (!rowState || rowState.rowIndex === -1) {\n updateRowData(dataSource, rowValue, newRowData, {\n rowKey: keys.rowKey,\n childrenKey: keys.childrenKey,\n });\n return -1;\n }\n\n // 懒加载处理:children 为 true,则需清空子元素在 map 中的值,而后方便重新加载\n if (get(newRowData, keys.childrenKey) === true) {\n const oldChildren = get(rowState.row, keys.childrenKey);\n if (oldChildren?.length) {\n for (let i = 0, len = oldChildren.length; i < len; i++) {\n const rowValue = getUniqueRowValue(oldChildren[i], keys.rowKey);\n const state = this.treeDataMap.get(rowValue);\n if (state) {\n this.treeDataMap.delete(rowValue);\n }\n }\n }\n }\n\n const currentRowIndex = rowState.rowIndex;\n rowState.row = newRowData;\n rowState.id = newRowValue;\n\n // 更新父元素中存储的当前元素值\n if (rowState.parent) {\n // 更新直接子元素数组\n const siblings = get(rowState.parent.row, keys.childrenKey);\n const index = siblings.findIndex((item: T) => getUniqueRowValue(item, keys.rowKey) === rowValue);\n siblings[index] = newRowData;\n }\n\n this.treeDataMap.set(newRowValue, rowState);\n // rowValue 也发生了变化,需移除 旧 rowValue 数据\n if (rowValue !== newRowValue) {\n this.treeDataMap.delete(rowValue);\n }\n return currentRowIndex;\n }\n\n /**\n * 移除指定节点\n * @param key 行唯一标识\n */\n remove(key: TableRowValue, dataSource: T[], keys: KeysType): T[] {\n const r = this.treeDataMap.get(key);\n if (r && r.rowIndex >= 0) {\n // 移除当前节点时,展开的节点的子节点需同步移除\n const removeNumber = (r.expandChildrenLength || 0) + 1;\n dataSource.splice(r.rowIndex, removeNumber);\n\n if (r.parent) {\n const siblings = get(r.parent.row, keys.childrenKey);\n const index = siblings.findIndex((item: TableRowData) => get(item, keys.rowKey) === key);\n siblings.splice(index, 1);\n updateRowExpandLength(this.treeDataMap, r.parent.row, -1 * removeNumber, 'delete', keys);\n }\n\n this.treeDataMap.delete(key);\n\n // 更新 rowIndex 之后的下标\n updateRowIndex(this.treeDataMap, dataSource, {\n minRowIndex: r.rowIndex,\n rowKey: keys.rowKey,\n type: 'remove',\n });\n } else {\n log.warn('EnhancedTable', 'Can not remove this node, which is not appeared.');\n }\n return dataSource;\n }\n\n /**\n * 清除子节点\n * @param key\n * @param dataSource\n * @param keys\n */\n removeChildren(key: TableRowValue, dataSource: T[], keys: KeysType): T[] {\n const r = this.treeDataMap.get(key);\n if (r && r.rowIndex >= 0) {\n const removeNumber = r.expandChildrenLength || 0;\n if (removeNumber) {\n dataSource.splice(r.rowIndex + 1, removeNumber);\n }\n if (r.parent) {\n updateRowExpandLength(this.treeDataMap, r.parent.row, -1 * removeNumber, 'delete', keys);\n }\n r.expandChildrenLength = 0;\n r.expanded = false;\n set(r.row, keys.childrenKey, undefined);\n this.treeDataMap.set(key, r);\n // 更新 rowIndex 之后的下标\n if (removeNumber) {\n updateRowIndex(this.treeDataMap, dataSource, {\n minRowIndex: r.rowIndex + 1,\n rowKey: keys.rowKey,\n type: 'remove',\n });\n }\n } else {\n log.warn('EnhancedTable', 'Can not remove this node\\'s children, which is not appeared.');\n }\n return dataSource;\n }\n\n /**\n * 为当前节点添加子节点,默认添加到最后一个节点。允许添加单个或多个\n * @param rowValue 当前节点唯一标识\n * @param newData 待添加的新节点\n */\n appendTo(rowValue: string | number, newData: T | T[], dataSource: T[], keys: KeysType): T[] {\n const state = this.treeDataMap.get(rowValue);\n if (!this.validateDataExist(state, rowValue)) return dataSource;\n const children: T[] = get(state.row, keys.childrenKey);\n // 子节点不存在,则表示为叶子节点\n const isShowNewNode = state.expanded || !children?.length;\n // 添加多个子节点时,需去除重复子节点\n const tmpData = newData instanceof Array ? newData : [newData];\n const newChildrenData: T[] = [];\n const newChildrenStates: TableRowState[] = [];\n let firstNewChildrenIndex = -1;\n for (let i = 0, len = tmpData.length; i < len; i++) {\n const oneData = tmpData[i];\n const newRowValue = getUniqueRowValue(oneData, keys.rowKey);\n const mapState = this.treeDataMap.get(newRowValue);\n if (!this.validateDataDoubleExist(mapState, newRowValue)) {\n log.warn('Table', `Duplicated Data \\`${newRowValue}\\` has been removed.`);\n } else {\n const rowIndex = isShowNewNode ? state.rowIndex + (state.expandChildrenLength || 0) + (i + 1) : -1;\n if (i === 0) {\n firstNewChildrenIndex = rowIndex;\n }\n const newState = {\n id: newRowValue,\n row: oneData,\n rowIndex,\n level: state.level + 1,\n expanded: false,\n expandChildrenLength: 0,\n disabled: false,\n path: [...state.path],\n parent: state,\n };\n newState.path = newState.path.concat(newState);\n newChildrenData.push(oneData);\n newChildrenStates.push(newState);\n this.treeDataMap.set(newRowValue, newState);\n }\n }\n if (!newChildrenData.length) return dataSource;\n\n if (children?.length) {\n state.row[keys.childrenKey] = state.row[keys.childrenKey].concat(newChildrenData);\n } else {\n state.row[keys.childrenKey] = newChildrenData;\n state.expanded = true;\n }\n\n // 如果当前节点为展开状态,则需要继续处理\n if (isShowNewNode) {\n dataSource.splice(firstNewChildrenIndex, 0, ...newChildrenData);\n // 更新父元素及祖先元素展开子节点的数量\n const newChildrenCount = newChildrenData.length || 1;\n updateRowExpandLength(this.treeDataMap, state.row, newChildrenCount, 'insert', {\n rowKey: keys.rowKey,\n childrenKey: keys.childrenKey,\n });\n // 更新 rowIndex 之后的下标\n updateRowIndex(this.treeDataMap, dataSource, {\n minRowIndex: firstNewChildrenIndex + newChildrenData.length - 1,\n rowKey: keys.rowKey,\n type: 'add',\n count: 1,\n });\n }\n\n return dataSource;\n }\n\n appendToRoot(newData: T | T[], dataSource: T[], keys: KeysType) {\n const newDataSource = dataSource.concat(newData);\n const tmpNewData = newData instanceof Array ? newData : [newData];\n const dataSourceLen = dataSource.length;\n for (let i = 0, len = tmpNewData.length; i < len; i++) {\n const rowValue = get(tmpNewData[i], keys.rowKey);\n if (!rowValue) {\n log.error('Table', '`rowKey` could be wrong, can not get rowValue from `data` by `rowKey`.');\n continue;\n }\n const state: TableRowState = {\n id: rowValue,\n row: tmpNewData[i],\n rowIndex: dataSourceLen + i,\n level: 0,\n expanded: false,\n expandChildrenLength: 0,\n disabled: false,\n };\n state.path = [state];\n this.treeDataMap.set(rowValue, state);\n }\n return newDataSource;\n }\n\n /**\n * 在当前节点后,插入一个兄弟节点\n * @param rowValue 当前节点唯一标识\n * @param newData 待添加的新节点\n */\n insertAfter(rowValue: string | number, newData: T, dataSource: T[], keys: KeysType): T[] {\n return this.insert(rowValue, newData, dataSource, keys, 'after');\n }\n\n /**\n * 在当前节点前,插入一个兄弟节点\n * @param rowValue 当前节点唯一标识\n * @param newData 待添加的新节点\n */\n insertBefore(rowValue: string | number, newData: T, dataSource: T[], keys: KeysType): T[] {\n return this.insert(rowValue, newData, dataSource, keys, 'before');\n }\n\n insert(rowValue: string | number, newData: T, dataSource: T[], keys: KeysType, type: 'before' | 'after') {\n const state = this.treeDataMap.get(rowValue);\n if (!this.validateDataExist(state, rowValue)) return dataSource;\n const newRowValue = get(newData, keys.rowKey);\n const mapState = this.treeDataMap.get(newRowValue);\n if (!this.validateDataDoubleExist(mapState, newRowValue)) return dataSource;\n const rowIndex = type === 'after' ? state.rowIndex + 1 : state.rowIndex;\n const newState = {\n id: newRowValue,\n row: newData,\n rowIndex,\n level: state.level,\n expanded: false,\n expandChildrenLength: 0,\n disabled: false,\n path: state.path.slice(0, -1),\n parent: state.parent,\n };\n newState.path = newState.path.concat(newState);\n const dataIndex = type === 'after' ? state.rowIndex + (state.expandChildrenLength + 1) : state.rowIndex;\n dataSource.splice(dataIndex, 0, newData);\n const distance = type === 'after' ? 1 : 0;\n if (state.parent) {\n const childrenIndex = state.parent.row[keys.childrenKey].findIndex(\n (t: TableRowData) => rowValue === get(t, keys.rowKey),\n );\n state.parent.row[keys.childrenKey].splice(childrenIndex + distance, 0, newData);\n updateRowExpandLength(this.treeDataMap, state.parent.row, 1, 'insert', keys);\n }\n this.treeDataMap.set(newRowValue, newState);\n\n // 更新 rowIndex 之后的下标\n updateRowIndex(this.treeDataMap, dataSource, {\n rowKey: keys.rowKey,\n minRowIndex: state.rowIndex + 1,\n type: 'add',\n });\n\n return dataSource;\n }\n\n /**\n * 交换数据行\n * @returns 交换失败返回 false\n */\n swapData(\n dataSource: T[],\n params: SwapParams<T>,\n keys: KeysType,\n ): { dataSource: T[]; result: boolean; code?: number; reason?: string } {\n const startIndex = params.currentIndex;\n const endIndex = params.targetIndex;\n if (startIndex === endIndex) return { dataSource, result: true };\n const startRowValue = get(params.current, keys.rowKey);\n const endRowValue = get(params.target, keys.rowKey);\n const startState = this.treeDataMap.get(startRowValue);\n const endState = this.treeDataMap.get(endRowValue);\n if (startState.level !== endState.level) {\n return {\n dataSource,\n result: false,\n code: TABLE_TREE_ERROR_CODE_NOT_SAME_LEVEL.code,\n reason: TABLE_TREE_ERROR_CODE_NOT_SAME_LEVEL.reason,\n };\n }\n const startLastIndex = startIndex + startState.expandChildrenLength + 1;\n const endLastIndex = endIndex + endState.expandChildrenLength + 1;\n const startRowList = dataSource.slice(startIndex, startLastIndex);\n const endRowList = dataSource.slice(endIndex, endLastIndex);\n if (startIndex > endIndex) {\n const middleRowList = dataSource.slice(endLastIndex, startIndex);\n const allSwapList = startRowList.concat(endRowList, middleRowList);\n dataSource.splice(endIndex, allSwapList.length);\n dataSource.splice(endIndex, 0, ...allSwapList);\n updateRowIndex(this.treeDataMap, dataSource, {\n rowKey: keys.rowKey,\n minRowIndex: endIndex,\n maxRowIndex: startLastIndex,\n });\n } else {\n const middleRowList = dataSource.slice(startLastIndex, endIndex);\n const allSwapList = middleRowList.concat(endRowList, startRowList);\n dataSource.splice(startIndex, allSwapList.length);\n dataSource.splice(startIndex, 0, ...allSwapList);\n updateRowIndex(this.treeDataMap, dataSource, {\n rowKey: keys.rowKey,\n minRowIndex: startIndex,\n maxRowIndex: endLastIndex,\n });\n }\n\n // 交换父元素中的两个元素位置\n if (startState.parent) {\n const children = startState.parent.row[keys.childrenKey];\n let count = 0;\n let targetIndex = -1;\n let currentIndex = -1;\n for (let i = 0, len = children.length; i < len; i++) {\n if (get(children[i], keys.rowKey) === startRowValue) {\n currentIndex = i;\n count += 1;\n }\n if (get(children[i], keys.rowKey) === endRowValue) {\n targetIndex = i;\n count += 1;\n }\n if (count >= 2) break;\n }\n // 向后拖拽\n if (currentIndex < targetIndex) {\n children.splice(targetIndex + 1, 0, params.current);\n children.splice(currentIndex, 1);\n } else {\n // 向前拖拽\n children.splice(currentIndex, 1);\n children.splice(targetIndex, 0, params.current);\n }\n }\n\n return { dataSource, result: true };\n }\n\n /**\n * 展开所有节点\n */\n expandAll(dataSource: T[], keys: KeysType) {\n this.expandAllRowIndex = 0;\n const newData: T[] = [];\n const expandLoop = (\n dataSource: T[],\n keys: KeysType,\n parent: TableRowState = null,\n ) => {\n for (let i = 0, len = dataSource.length; i < len; i++) {\n const item = dataSource[i];\n const rowValue = get(item, keys.rowKey);\n const state = this.treeDataMap.get(rowValue);\n const children = get(item, keys.childrenKey);\n state.rowIndex = this.expandAllRowIndex;\n // children = true is async load\n if (children !== true && children?.length) {\n state.expanded = true;\n }\n state.expandChildrenLength = children?.length || 0;\n this.expandAllRowIndex += 1;\n newData.push(item);\n this.treeDataMap.set(rowValue, state);\n if (children?.length) {\n // 同步更新父元素的展开数量\n let tmpParent = parent;\n while (tmpParent?.row) {\n tmpParent.expandChildrenLength += children.length;\n this.treeDataMap.set(tmpParent.id, tmpParent);\n tmpParent = tmpParent.parent;\n }\n // 继续子元素\n expandLoop(children, keys, state);\n }\n }\n };\n expandLoop(dataSource, keys);\n return newData;\n }\n\n /**\n * 收起所有节点\n */\n foldAll(dataSource: T[], keys: KeysType) {\n const newData: T[] = [];\n let index = 0;\n for (let i = 0, len = dataSource.length; i < len; i++) {\n const item = dataSource[i];\n const rowValue = get(item, keys.rowKey);\n const state = this.treeDataMap.get(rowValue);\n state.rowIndex = state.level === 0 ? index : -1;\n state.expanded = false;\n state.expandChildrenLength = 0;\n if (state.level === 0) {\n newData.push(item);\n index += 1;\n }\n const children = get(item, keys.childrenKey);\n if (children?.length) {\n this.foldAll(children, keys);\n }\n }\n return newData;\n }\n\n /** 获取整个树形结构 */\n getTreeNode(dataSource: T[], keys: KeysType): T[] {\n // let isStarted = false;\n const treeData: T[] = [];\n for (let i = 0, len = dataSource.length; i < len; i++) {\n const item = dataSource[i];\n const rowValue = get(item, keys.rowKey);\n const state = this.treeDataMap.get(rowValue);\n // 只需要压入第一层数据\n if (state.level === 0) {\n treeData.push(item);\n }\n }\n return treeData;\n }\n\n /**\n * 获取展开的树形节点\n * @param dataSource 平铺的树形结构数据\n * @param keys 行唯一标识和子节点的字段名\n * @param type 'unique' 标识获取展开节点的行唯一标识值,'data' 表示获取展开节点的数据,'all' 表示获取行节点包含展开状态的全部数据\n * @returns 展开的树形节点\n */\n getTreeExpandedRow(dataSource: T[], keys: KeysType, type: 'unique' | 'data' | 'all' = 'data') {\n const arr: (T | any)[] = [];\n dataSource.forEach((item) => {\n const rowValue = get(item, keys.rowKey);\n const rowState = this.treeDataMap.get(rowValue);\n if (!rowState.expanded) return;\n if (type === 'unique') {\n arr.push(rowValue);\n } else if (type === 'data') {\n arr.push(item);\n } else {\n arr.push(rowState);\n }\n });\n return arr;\n }\n\n /**\n * 初始化树形结构 Map\n * @param treeDataMap 树形结构 Map\n * @param dataSource 数据源\n * @param column 树形结构列\n * @param keys 字段映射关系\n * @param level 层级\n * @param parent 父元素\n * @returns void\n */\n initialTreeDataMap(\n treeDataMap: TableTreeDataMap,\n dataSource: T[],\n column: PrimaryTableCol,\n keys: KeysType,\n level = 0,\n parent: TableRowState = null,\n ) {\n for (let i = 0, len = dataSource.length; i < len; i++) {\n const item = dataSource[i];\n const rowValue = getUniqueRowValue(item, keys.rowKey);\n if (isUndefined(rowValue)) {\n log.error('EnhancedTable', '`rowKey` could be wrong, can not get rowValue from `data` by `rowKey`.');\n return;\n }\n const children = get(item, keys.childrenKey);\n const state: TableRowState = {\n id: rowValue,\n row: item,\n rowIndex: level === 0 ? i : -1,\n level,\n expanded: false,\n expandChildrenLength: 0,\n disabled: isRowSelectedDisabled(column, item, i),\n parent,\n };\n state.path = parent ? parent.path.concat(state) : [state];\n treeDataMap.set(rowValue, state);\n if (children?.length) {\n this.initialTreeDataMap(treeDataMap, children, column, keys, level + 1, state);\n }\n }\n }\n\n // column.checkProps 和 column.disabled 会影响行的禁用状态,因此当列发生变化时,需要重置禁用状态\n updateDisabledState(dataSource: T[], column: PrimaryTableCol, keys: KeysType) {\n for (let i = 0, len = dataSource.length; i < len; i++) {\n const item = dataSource[i];\n const rowValue = get(item, keys.rowKey);\n if (isUndefined(rowValue)) {\n log.error('EnhancedTable', '`rowKey` could be wrong, can not get rowValue from `data` by `rowKey`.');\n return;\n }\n const state = this.treeDataMap.get(rowValue);\n state.disabled = isRowSelectedDisabled(column, item, i);\n this.treeDataMap.set(rowValue, state);\n const children = get(item, keys.childrenKey);\n if (children?.length) {\n this.updateDisabledState(children, column, keys);\n }\n }\n }\n\n /**\n * 校验数据合法性\n */\n validateDataExist(state: TableRowState, rowValue: string | number) {\n if (!state) {\n log.warn('EnhancedTable', `${rowValue} does not exist.`);\n return false;\n }\n return true;\n }\n\n /**\n * 校验数据是否已存在\n */\n validateDataDoubleExist(state: TableRowState, rowValue: string | number) {\n if (state) {\n log.warn('EnhancedTable', `Duplicated Key. ${rowValue} already exists.`);\n return false;\n }\n return true;\n }\n}\n\nexport default TableTreeStore;\n\n/**\n * 更新展开的子节点数量\n * @param rowSate 行数据和状态\n * @param distance 需要调整的展开子节点长度数量,展开时增加,收起时减少。值为负数,表示减\n * @param expanded 展开/收起\n */\nexport function updateRowExpandLength(\n treeDataMap: TableTreeDataMap,\n row: TableRowData,\n distance: number,\n type: 'expand' | 'fold' | 'delete' | 'insert',\n keys: KeysType,\n) {\n let tmp = row;\n while (tmp) {\n const state = treeDataMap.get(get(tmp, keys.rowKey));\n const expandLen = (state.expandChildrenLength || 0) + distance;\n state.expandChildrenLength = Math.max(0, expandLen);\n tmp = state?.parent?.row;\n }\n // 如果是收起状态,子节点需全部收起,清空子节点展开行数量,设置 expandChildrenLength 为 0\n if (type === 'fold') {\n clearRowExpandLength(treeDataMap, row, keys);\n }\n}\n\nexport function clearRowExpandLength<T>(treeDataMap: TableTreeDataMap, row: T, keys: KeysType) {\n const children = get(row, keys.childrenKey);\n if (children?.length) {\n children.forEach((item: T[]) => {\n const state = treeDataMap.get(get(item, keys.rowKey));\n if (!state) return;\n state.expandChildrenLength = 0;\n clearRowExpandLength(treeDataMap, state.row, keys);\n });\n }\n}\n\n/**\n * 更新子节点行状态,行数据、父节点、层级、路径等数据\n * @param rowState 行状态数据\n * @param expanded 展开或收起\n * @param keys\n */\nexport function updateChildrenRowState<T>(\n treeDataMap: TableTreeDataMap,\n rowState: TableRowState,\n expanded: boolean,\n keys: KeysType,\n) {\n const { row, rowIndex } = rowState;\n const childrenNodes = get(row, keys.childrenKey);\n childrenNodes.forEach((item: T, kidRowIndex: number) => {\n const rowValue = get(item, keys.rowKey);\n const index = expanded ? rowIndex + 1 + kidRowIndex : -1;\n const curState = treeDataMap.get(rowValue);\n const newState: TableRowState = {\n ...curState,\n row: item,\n rowIndex: index,\n expanded: false,\n parent: rowState,\n };\n treeDataMap.set(rowValue, newState);\n // 父节点展开,子节点不一定展开;父节点收起,则所有子节点收起\n if (!expanded) {\n const children = get(item, keys.childrenKey);\n if (children?.length) {\n updateChildrenRowState(\n treeDataMap,\n {\n ...newState,\n rowIndex: -1,\n expanded: false,\n } as any,\n expanded,\n keys,\n );\n }\n }\n });\n}\n\nexport function updateRowData<T extends TableRowData = TableRowData>(\n data: T[],\n key: string | number,\n newData: T,\n keys: KeysType,\n) {\n for (let i = 0, len = data.length; i < len; i++) {\n const item = data[i];\n if (get(item, keys.rowKey) === key) {\n // eslint-disable-next-line no-param-reassign\n data[i] = newData;\n return;\n }\n const children: T[] = get(item, keys.childrenKey) || [];\n if (children?.length) {\n updateRowData(children, key, newData, keys);\n }\n }\n}\n\nexport function updateRowIndex<T>(\n treeDataMap: TableTreeDataMap,\n dataSource: T[],\n extra: {\n rowKey: string;\n minRowIndex?: number;\n maxRowIndex?: number;\n type?: 'add' | 'remove';\n count?: number;\n },\n) {\n const start = extra.minRowIndex || 0;\n const end = extra.maxRowIndex || dataSource.length;\n for (let rowIndex = start; rowIndex < end; rowIndex++) {\n const item = dataSource[rowIndex];\n const state = treeDataMap.get(get(item, extra.rowKey));\n if (!state) {\n log.warn('Table', 'tree map went wrong');\n }\n state.rowIndex = rowIndex + (extra?.count || 1) - 1;\n }\n}\n\nexport function diffExpandedTreeNode(\n newExpandedNode: (number | string)[] = [],\n oldExpandedNode: (number | string)[] = [],\n) {\n const removedList: (number | string)[] = [];\n const addedList: (number | string)[] = [];\n const newExpandedNodeMap: Map<any, boolean> = new Map();\n const oldExpandedNodeMap: Map<any, boolean> = new Map();\n for (let i = 0, len = newExpandedNode.length; i < len; i++) {\n newExpandedNodeMap.set(newExpandedNode[i], true);\n }\n for (let i = 0, len = oldExpandedNode.length; i < len; i++) {\n oldExpandedNodeMap.set(oldExpandedNode[i], true);\n }\n for (let i = 0, len = newExpandedNode.length; i < len; i++) {\n if (!oldExpandedNodeMap.get(newExpandedNode[i])) {\n addedList.push(newExpandedNode[i]);\n }\n }\n for (let i = 0, len = oldExpandedNode.length; i < len; i++) {\n if (!newExpandedNodeMap.get(oldExpandedNode[i])) {\n removedList.push(oldExpandedNode[i]);\n }\n }\n return {\n removedList,\n addedList,\n };\n}\n\nexport type TreeDataMapType = InstanceType<typeof TableTreeStore>['treeDataMap'];\n"],"names":["TABLE_TREE_ERROR_CODE_NOT_SAME_LEVEL","code","reason","getUniqueRowValue","row","colKey","rowIndex","arguments","length","undefined","level","rowValue","get","concat","TableTreeStore","_classCallCheck","_defineProperty","Map","treeDataMap","_createClass","key","value","initialTreeStore","dataSource","columns","keys","_this$treeDataMap","clear","initialTreeDataMap","find","col","getAllUniqueKeys","data","arr","i","len","item","push","rowKey","children","childrenKey","getExpandedChildrenKeys","rowState","expanded","expandTreeNode","rowList","_this","forEach","toggleExpandData","foldTreeNode","_this2","p","type","_r$rowIndex","log","error","isUndefined","childrenNodes","r","set","updateExpandRow","changeRow","updateChildrenRowState","updateRowExpandLength","splice","apply","expandChildrenLength","updateRowIndex","minRowIndex","getData","updateData","newRowData","newRowValue","updateRowData","oldChildren","state","delete","currentRowIndex","id","parent","siblings","index","findIndex","remove","removeNumber","warn","removeChildren","appendTo","newData","validateDataExist","isShowNewNode","tmpData","Array","newChildrenData","newChildrenStates","firstNewChildrenIndex","oneData","mapState","validateDataDoubleExist","newState","disabled","path","_toConsumableArray","newChildrenCount","count","appendToRoot","newDataSource","tmpNewData","dataSourceLen","insertAfter","insert","insertBefore","slice","dataIndex","distance","childrenIndex","t","swapData","params","startIndex","currentIndex","endIndex","targetIndex","result","startRowValue","current","endRowValue","target","startState","endState","startLastIndex","endLastIndex","startRowList","endRowList","middleRowList","allSwapList","maxRowIndex","expandAll","_this3","expandAllRowIndex","expandLoop","tmpParent","_tmpParent","foldAll","getTreeNode","treeData","getTreeExpandedRow","_this4","column","isRowSelectedDisabled","updateDisabledState","tmp","_state$parent","expandLen","Math","max","clearRowExpandLength","kidRowIndex","curState","_objectSpread","extra","start","end","diffExpandedTreeNode","newExpandedNode","oldExpandedNode","removedList","addedList","newExpandedNodeMap","oldExpandedNodeMap"],"mappings":";;;;;;;;;;;;;;;;;;AA0BO,IAAMA,oCAAuC,GAAA;AAClDC,EAAAA,IAAM,EAAA,IAAA;AACNC,EAAAA,MAAQ,EAAA,4CAAA;AACV,EAAA;AASO,SAASC,kBAAkBC,GAAmB,EAAAC,MAAA,EAAyD;AAAA,EAAA,IAAzCC,QAAmB,GAAAC,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAE,SAAA,GAAAF,SAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA;AAAA,EAAA,IAAGG,4EAAgB,CAAG,CAAA;AACtG,EAAA,IAAAC,QAAA,GAAWC,GAAI,CAAAR,GAAA,EAAKC,MAAM,CAAA,CAAA;EAChC,OAAOC,YAAYI,KAAQ,GAAA,EAAA,CAAAG,MAAA,CAAGF,sBAAYL,QAAY,IAAA,CAAA,OAAAO,MAAA,CAAKH,SAAS,CAAO,SAAAC,QAAA,CAAA;AAC7E,CAAA;AAAA,IAYMG,cAAsD,gBAAA,YAAA;AAM1D,EAAA,SAAAA,iBAAc;AAAAC,IAAAA,eAAA,OAAAD,cAAA,CAAA,CAAA;AAAAE,IAAAA,eAAA,CAJkB,IAAA,EAAA,aAAA,qBAAIC,GAAI,EAAA,CAAA,CAAA;IAAAD,eAAA,CAAA,IAAA,EAAA,mBAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAKjC,IAAA,IAAA,CAAAE,WAAA,sBAAkBD,GAAI,EAAA,CAAA;AAC7B,GAAA;EAAA,OAAAE,YAAA,CAAAL,cAAA,EAAA,CAAA;IAAAM,GAAA,EAAA,kBAAA;IAAAC,KAAA,EAQA,SAAAC,gBAAAA,CAAiBC,UAAiB,EAAAC,OAAA,EAA4BC,IAAgB,EAAA;AAAA,MAAA,IAAAC,iBAAA,CAAA;MAC5E,CAAAA,iBAAA,GAAA,IAAA,CAAKR,yDAALQ,iBAAA,CAAkBC,KAAM,EAAA,CAAA;AACxB,MAAA,IAAA,CAAKC,kBAAmB,CAAA,IAAA,CAAKV,WAAa,EAAAK,UAAA,EAAYC,OAAQ,CAAAK,IAAA,CAAK,UAACC,GAAA,EAAA;AAAA,QAAA,OAAQA,GAAI,CAAAzB,MAAA,KAAW,YAAY,CAAA;OAAA,CAAA,EAAGoB,IAAI,CAAA,CAAA;AAChH,KAAA;AAAA,GAAA,EAAA;IAAAL,GAAA,EAAA,kBAAA;AAAAC,IAAAA,KAAA,EAKA,SAAAU,gBAAiBA,CAAAC,IAAA,EAAWP,IAAgB,EAAe;AAAA,MAAA,IAAfQ,GAAA,GAAA1B,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAE,SAAA,GAAAF,SAAA,CAAA,CAAA,CAAA,GAAW,EAAI,CAAA;AACzD,MAAA,KAAA,IAAS2B,IAAI,CAAG,EAAAC,GAAA,GAAMH,KAAKxB,MAAQ,EAAA0B,CAAA,GAAIC,KAAKD,CAAK,EAAA,EAAA;AAC/C,QAAA,IAAME,OAAOJ,IAAK,CAAAE,CAAA,CAAA,CAAA;QAClBD,GAAA,CAAII,IAAK,CAAAlC,iBAAA,CAAkBiC,IAAM,EAAAX,IAAA,CAAKa,MAAM,CAAC,CAAA,CAAA;QAC7C,IAAMC,QAAW,GAAA3B,GAAA,CAAIwB,IAAM,EAAAX,IAAA,CAAKe,WAAW,CAAA,CAAA;AAC3C,QAAA,IAAID,aAAAA,IAAAA,IAAAA,uBAAAA,SAAU/B,MAAQ,EAAA;UACf,IAAA,CAAAuB,gBAAA,CAAiBQ,QAAU,EAAAd,IAAA,EAAMQ,GAAG,CAAA,CAAA;AAC3C,SAAA;AACF,OAAA;AACO,MAAA,OAAAA,GAAA,CAAA;AACT,KAAA;AAAA,GAAA,EAAA;IAAAb,GAAA,EAAA,yBAAA;AAAAC,IAAAA,KAAA,EAEA,SAAAoB,uBAAwBA,CAAAT,IAAA,EAAWP,IAAgB,EAA+B;AAAA,MAAA,IAA/BQ,GAAA,GAAA1B,SAAA,CAAAC,MAAA,GAAA,CAAA,IAAAD,SAAA,CAAA,CAAA,CAAA,KAAAE,SAAA,GAAAF,SAAA,CAAA,CAAA,CAAA,GAA2B,EAAI,CAAA;AAChF,MAAA,KAAA,IAAS2B,IAAI,CAAG,EAAAC,GAAA,GAAMH,KAAKxB,MAAQ,EAAA0B,CAAA,GAAIC,KAAKD,CAAK,EAAA,EAAA;AAC/C,QAAA,IAAME,OAAOJ,IAAK,CAAAE,CAAA,CAAA,CAAA;QAClB,IAAMvB,QAAW,GAAAR,iBAAA,CAAkBiC,IAAM,EAAAX,IAAA,CAAKa,MAAM,CAAA,CAAA;QACpD,IAAMI,QAAW,GAAA,IAAA,CAAKxB,WAAY,CAAAN,GAAA,CAAID,QAAQ,CAAA,CAAA;QAC9C,IAAI+B,SAASC,QAAU,EAAA;AACrBV,UAAAA,GAAA,CAAII,KAAK1B,QAAQ,CAAA,CAAA;AACnB,SAAA;QACA,IAAM4B,QAAW,GAAA3B,GAAA,CAAIwB,IAAM,EAAAX,IAAA,CAAKe,WAAW,CAAA,CAAA;AAC3C,QAAA,IAAID,aAAAA,IAAAA,IAAAA,uBAAAA,SAAU/B,MAAQ,EAAA;UACf,IAAA,CAAAiC,uBAAA,CAAwBF,QAAU,EAAAd,IAAA,EAAMQ,GAAG,CAAA,CAAA;AAClD,SAAA;AACF,OAAA;AACO,MAAA,OAAAA,GAAA,CAAA;AACT,KAAA;AAAA,GAAA,EAAA;IAAAb,GAAA,EAAA,gBAAA;IAAAC,KAAA,EAEA,SAAAuB,cAAAA,CAAeC,OAA8B,EAAAtB,UAAA,EAAiBE,IAAgB,EAAA;AAAA,MAAA,IAAAqB,KAAA,GAAA,IAAA,CAAA;AAC5E,MAAA,IAAI,CAACD,OAAQ,CAAArC,MAAA,EAAe,OAAAe,UAAA,CAAA;AACpBsB,MAAAA,OAAA,CAAAE,OAAA,CAAQ,UAACpC,QAAa,EAAA;QAC5B,IAAM+B,QAAW,GAAAI,KAAA,CAAK5B,WAAY,CAAAN,GAAA,CAAID,QAAQ,CAAA,CAAA;QAC9C,IAAI,CAAC+B,QAAA,EAAU,OAAA;QACVI,KAAA,CAAAE,gBAAA,CAAiB;UAAE5C,GAAA,EAAKsC,QAAS,CAAAtC,GAAA;UAAUE,QAAU,EAAAoC,QAAA,CAASpC,QAAAA;AAAS,SAAA,EAAGiB,UAAY,EAAAE,IAAA,EAAM,QAAQ,CAAA,CAAA;AAC3G,OAAC,CAAA,CAAA;AACM,MAAA,OAAAF,UAAA,CAAA;AACT,KAAA;AAAA,GAAA,EAAA;IAAAH,GAAA,EAAA,cAAA;IAAAC,KAAA,EAEA,SAAA4B,YAAAA,CAAaJ,OAA8B,EAAAtB,UAAA,EAAiBE,IAAgB,EAAA;AAAA,MAAA,IAAAyB,MAAA,GAAA,IAAA,CAAA;AAC1E,MAAA,IAAI,CAACL,OAAQ,CAAArC,MAAA,EAAe,OAAAe,UAAA,CAAA;AACpBsB,MAAAA,OAAA,CAAAE,OAAA,CAAQ,UAACpC,QAAa,EAAA;QAC5B,IAAM+B,QAAW,GAAAQ,MAAA,CAAKhC,WAAY,CAAAN,GAAA,CAAID,QAAQ,CAAA,CAAA;QAC9C,IAAI,CAAC+B,QAAA,EAAU,OAAA;QACVQ,MAAA,CAAAF,gBAAA,CAAiB;UAAE5C,GAAA,EAAKsC,QAAS,CAAAtC,GAAA;UAAUE,QAAU,EAAAoC,QAAA,CAASpC,QAAAA;AAAS,SAAA,EAAGiB,UAAY,EAAAE,IAAA,EAAM,MAAM,CAAA,CAAA;AACzG,OAAC,CAAA,CAAA;AACM,MAAA,OAAAF,UAAA,CAAA;AACT,KAAA;AAAA,GAAA,EAAA;IAAAH,GAAA,EAAA,kBAAA;IAAAC,KAAA,EAEA,SAAA2B,gBAAiBA,CAAAG,CAAA,EAAiC5B,UAAiB,EAAAE,IAAA,EAAgB2B,IAA0B,EAAA;AAAA,MAAA,IAAAC,WAAA,CAAA;MAC3G,IAAI,CAACF,CAAG,EAAA;AACFG,QAAAA,GAAA,CAAAC,KAAA,CAAM,iBAAiB,mDAAmD,CAAA,CAAA;AACvE,QAAA,OAAAhC,UAAA,CAAA;AACT,OAAA;MACA,IAAMZ,QAAW,GAAAC,GAAA,CAAIuC,CAAE,CAAA/C,GAAA,EAAKqB,KAAKa,MAAM,CAAA,CAAA;AACnC,MAAA,IAAAkB,WAAA,CAAY7C,QAAQ,CAAG,EAAA;AACrB2C,QAAAA,GAAA,CAAAC,KAAA,CAAM,iBAAiB,wEAAwE,CAAA,CAAA;AACnG,QAAA,OAAO,EAAC,CAAA;AACV,OAAA;MACA,IAAME,aAAgB,GAAA7C,GAAA,CAAIuC,CAAE,CAAA/C,GAAA,EAAKqB,KAAKe,WAAW,CAAA,CAAA;AAEjD,MAAA,IAAIiB,aAAkB,KAAA,IAAA,EAAa,OAAAlC,UAAA,CAAA;MACnC,IAAMmC,CAAI,GAAA,IAAA,CAAKxC,WAAY,CAAAN,GAAA,CAAID,QAAQ,CAAA,CAAA;MACnC,IAAAyC,IAAA,KAAS,YAAYM,CAAE,CAAAf,QAAA,EAAiB,OAAApB,UAAA,CAAA;MACxC,IAAA6B,IAAA,KAAS,MAAU,IAAA,CAACM,CAAE,CAAAf,QAAA,EAAiB,OAAApB,UAAA,CAAA;AACzCmC,MAAAA,CAAA,CAAApD,QAAA,GAAA+C,CAAAA,WAAA,GAAWK,CAAE,CAAApD,QAAA,MAAA,IAAA,IAAA+C,WAAA,KAAAA,KAAAA,CAAAA,GAAAA,WAAA,GAAYF,CAAE,CAAA7C,QAAA,CAAA;AAC3BoD,MAAAA,CAAA,CAAAf,QAAA,GAAW,CAACe,CAAE,CAAAf,QAAA,CAAA;MACX,IAAA,CAAAzB,WAAA,CAAYyC,GAAI,CAAAhD,QAAA,EAAU+C,CAAC,CAAA,CAAA;MAChC,OAAO,IAAK,CAAAE,eAAA,CAAgBF,CAAG,EAAAnC,UAAA,EAAYE,IAAI,CAAA,CAAA;AACjD,KAAA;AAAA,GAAA,EAAA;IAAAL,GAAA,EAAA,iBAAA;IAAAC,KAAA,EAEA,SAAAuC,eAAAA,CAAgBC,SAA0B,EAAAtC,UAAA,EAAiBE,IAAqB,EAAA;AAC9E,MAAA,IAAQrB,GAAA,GAA4ByD,SAAA,CAA5BzD,GAAA;QAAKE,QAAU,GAAauD,SAAA,CAAvBvD,QAAU;QAAAqC,QAAA,GAAakB,SAAA,CAAblB,QAAA,CAAA;AACjB,MAAA,IAAEzB,cAAgB,IAAA,CAAhBA;MACR,IAAMuC,aAAgB,GAAA7C,GAAA,CAAIR,GAAK,EAAAqB,IAAA,CAAKe,WAAW,CAAA,CAAA;AAC3C,MAAA,IAAA,CAACpC,OAAO,CAACqD,aAAA,EAAsB,OAAAlC,UAAA,CAAA;AACnC,MAAA,IAAIoB,QAAU,EAAA;QACWmB,sBAAA,CAAA5C,WAAA,EAAa2C,SAAW,EAAAlB,QAAA,EAAUlB,IAAI,CAAA,CAAA;AAC7DsC,QAAAA,qBAAA,CAAsB7C,WAAa,EAAAd,GAAA,EAAKqD,aAAc,CAAAjD,MAAA,EAAQ,UAAUiB,IAAI,CAAA,CAAA;AAEjEF,QAAAA,UAAA,CAAAyC,MAAA,CAAOC,KAAM,CAAA1C,UAAA,EAAY,CAACjB,QAAA,GAAW,GAAG,CAAC,CAAA,CAAEO,MAAO,CAAA4C,aAAa,CAAC,CAAA,CAAA;AAC7E,OAAO,MAAA;QACqBK,sBAAA,CAAA5C,WAAA,EAAa2C,SAAW,EAAAlB,QAAA,EAAUlB,IAAI,CAAA,CAAA;QAC1D,IAAAU,GAAA,GAAM0B,SAAU,CAAAK,oBAAA,IAAwBT,aAAc,CAAAjD,MAAA,CAAA;AAC5DuD,QAAAA,qBAAA,CAAsB7C,WAAa,EAAAd,GAAA,EAAK,CAAK,CAAA,GAAA+B,GAAA,EAAK,QAAQV,IAAI,CAAA,CAAA;QACnDF,UAAA,CAAAyC,MAAA,CAAO1D,QAAW,GAAA,CAAA,EAAG6B,GAAG,CAAA,CAAA;AACrC,OAAA;AAEAgC,MAAAA,cAAA,CAAejD,aAAaK,UAAY,EAAA;QACtCe,QAAQb,IAAK,CAAAa,MAAA;QACb8B,aAAa9D,QAAW,GAAA,CAAA;AAC1B,OAAC,CAAA,CAAA;AACM,MAAA,OAAAiB,UAAA,CAAA;AACT,KAAA;AAAA,GAAA,EAAA;IAAAH,GAAA,EAAA,SAAA;AAAAC,IAAAA,KAAA,EAOA,SAAAgD,QAAQjD,GAAmC,EAAA;AAClC,MAAA,OAAA,IAAA,CAAKF,WAAY,CAAAN,GAAA,CAAIQ,GAAG,CAAA,CAAA;AACjC,KAAA;AAAA,GAAA,EAAA;IAAAA,GAAA,EAAA,YAAA;IAAAC,KAAA,EAQA,SAAAiD,UAAWA,CAAA3D,QAAA,EAAyB4D,UAAe,EAAAhD,UAAA,EAAiBE,IAAwB,EAAA;MAC1F,IAAM+C,WAAc,GAAArE,iBAAA,CAAkBoE,UAAY,EAAA9C,IAAA,CAAKa,MAAM,CAAA,CAAA;MAC7D,IAAMI,QAAW,GAAA,IAAA,CAAKxB,WAAY,CAAAN,GAAA,CAAID,QAAQ,CAAA,CAAA;MAE9C,IAAI,CAAC+B,QAAA,IAAYA,QAAS,CAAApC,QAAA,KAAa,CAAI,CAAA,EAAA;AAC3BmE,QAAAA,aAAA,CAAAlD,UAAA,EAAYZ,UAAU4D,UAAY,EAAA;UAC9CjC,QAAQb,IAAK,CAAAa,MAAA;UACbE,aAAaf,IAAK,CAAAe,WAAAA;AACpB,SAAC,CAAA,CAAA;AACM,QAAA,OAAA,CAAA,CAAA,CAAA;AACT,OAAA;MAGA,IAAI5B,GAAI,CAAA2D,UAAA,EAAY9C,IAAK,CAAAe,WAAW,MAAM,IAAM,EAAA;QAC9C,IAAMkC,WAAc,GAAA9D,GAAA,CAAI8B,QAAS,CAAAtC,GAAA,EAAKqB,KAAKe,WAAW,CAAA,CAAA;AACtD,QAAA,IAAIkC,gBAAAA,IAAAA,IAAAA,0BAAAA,YAAalE,MAAQ,EAAA;AACvB,UAAA,KAAA,IAAS0B,IAAI,CAAG,EAAAC,GAAA,GAAMuC,YAAYlE,MAAQ,EAAA0B,CAAA,GAAIC,KAAKD,CAAK,EAAA,EAAA;AACtD,YAAA,IAAMvB,SAAW,GAAAR,iBAAA,CAAkBuE,WAAY,CAAAxC,CAAA,CAAA,EAAIT,KAAKa,MAAM,CAAA,CAAA;YAC9D,IAAMqC,KAAQ,GAAA,IAAA,CAAKzD,WAAY,CAAAN,GAAA,CAAID,SAAQ,CAAA,CAAA;AAC3C,YAAA,IAAIgE,KAAO,EAAA;AACJ,cAAA,IAAA,CAAAzD,WAAA,CAAY0D,OAAOjE,SAAQ,CAAA,CAAA;AAClC,aAAA;AACF,WAAA;AACF,SAAA;AACF,OAAA;AAEA,MAAA,IAAMkE,kBAAkBnC,QAAS,CAAApC,QAAA,CAAA;MACjCoC,QAAA,CAAStC,GAAM,GAAAmE,UAAA,CAAA;MACf7B,QAAA,CAASoC,EAAK,GAAAN,WAAA,CAAA;MAGd,IAAI9B,SAASqC,MAAQ,EAAA;AAEnB,QAAA,IAAMC,WAAWpE,GAAI,CAAA8B,QAAA,CAASqC,MAAO,CAAA3E,GAAA,EAAKqB,KAAKe,WAAW,CAAA,CAAA;AACpD,QAAA,IAAAyC,KAAA,GAAQD,QAAS,CAAAE,SAAA,CAAU,UAAC9C,IAAA,EAAA;UAAA,OAAYjC,kBAAkBiC,IAAM,EAAAX,IAAA,CAAKa,MAAM,CAAA,KAAM3B,QAAQ,CAAA;SAAA,CAAA,CAAA;AAC/FqE,QAAAA,QAAA,CAASC,KAAS,CAAA,GAAAV,UAAA,CAAA;AACpB,OAAA;MAEK,IAAA,CAAArD,WAAA,CAAYyC,GAAI,CAAAa,WAAA,EAAa9B,QAAQ,CAAA,CAAA;MAE1C,IAAI/B,aAAa6D,WAAa,EAAA;AACvB,QAAA,IAAA,CAAAtD,WAAA,CAAY0D,OAAOjE,QAAQ,CAAA,CAAA;AAClC,OAAA;AACO,MAAA,OAAAkE,eAAA,CAAA;AACT,KAAA;AAAA,GAAA,EAAA;IAAAzD,GAAA,EAAA,QAAA;IAAAC,KAAA,EAMA,SAAA8D,MAAAA,CAAO/D,GAAoB,EAAAG,UAAA,EAAiBE,IAAqB,EAAA;MAC/D,IAAMiC,CAAI,GAAA,IAAA,CAAKxC,WAAY,CAAAN,GAAA,CAAIQ,GAAG,CAAA,CAAA;AAC9B,MAAA,IAAAsC,CAAA,IAAKA,CAAE,CAAApD,QAAA,IAAY,CAAG,EAAA;QAElB,IAAA8E,YAAA,GAAA,CAAgB1B,CAAE,CAAAQ,oBAAA,IAAwB,CAAK,IAAA,CAAA,CAAA;QAC1C3C,UAAA,CAAAyC,MAAA,CAAON,CAAE,CAAApD,QAAA,EAAU8E,YAAY,CAAA,CAAA;QAE1C,IAAI1B,EAAEqB,MAAQ,EAAA;AACZ,UAAA,IAAMC,WAAWpE,GAAI,CAAA8C,CAAA,CAAEqB,MAAO,CAAA3E,GAAA,EAAKqB,KAAKe,WAAW,CAAA,CAAA;AAC7C,UAAA,IAAAyC,KAAA,GAAQD,QAAS,CAAAE,SAAA,CAAU,UAAC9C,IAAA,EAAA;YAAA,OAAuBxB,IAAIwB,IAAM,EAAAX,IAAA,CAAKa,MAAM,CAAA,KAAMlB,GAAG,CAAA;WAAA,CAAA,CAAA;AAC9E4D,UAAAA,QAAA,CAAAhB,MAAA,CAAOiB,OAAO,CAAC,CAAA,CAAA;AACFlB,UAAAA,qBAAA,CAAA,IAAA,CAAK7C,aAAawC,CAAE,CAAAqB,MAAA,CAAO3E,KAAK,CAAK,CAAA,GAAAgF,YAAA,EAAc,UAAU3D,IAAI,CAAA,CAAA;AACzF,SAAA;AAEK,QAAA,IAAA,CAAAP,WAAA,CAAY0D,OAAOxD,GAAG,CAAA,CAAA;AAGZ+C,QAAAA,cAAA,CAAA,IAAA,CAAKjD,aAAaK,UAAY,EAAA;UAC3C6C,aAAaV,CAAE,CAAApD,QAAA;UACfgC,QAAQb,IAAK,CAAAa,MAAA;AACbc,UAAAA,IAAM,EAAA,QAAA;AACR,SAAC,CAAA,CAAA;AACH,OAAO,MAAA;AACDE,QAAAA,GAAA,CAAA+B,IAAA,CAAK,iBAAiB,kDAAkD,CAAA,CAAA;AAC9E,OAAA;AACO,MAAA,OAAA9D,UAAA,CAAA;AACT,KAAA;AAAA,GAAA,EAAA;IAAAH,GAAA,EAAA,gBAAA;IAAAC,KAAA,EAQA,SAAAiE,cAAAA,CAAelE,GAAoB,EAAAG,UAAA,EAAiBE,IAAqB,EAAA;MACvE,IAAMiC,CAAI,GAAA,IAAA,CAAKxC,WAAY,CAAAN,GAAA,CAAIQ,GAAG,CAAA,CAAA;AAC9B,MAAA,IAAAsC,CAAA,IAAKA,CAAE,CAAApD,QAAA,IAAY,CAAG,EAAA;AAClB,QAAA,IAAA8E,YAAA,GAAe1B,EAAEQ,oBAAwB,IAAA,CAAA,CAAA;AAC/C,QAAA,IAAIkB,YAAc,EAAA;UAChB7D,UAAA,CAAWyC,MAAO,CAAAN,CAAA,CAAEpD,QAAW,GAAA,CAAA,EAAG8E,YAAY,CAAA,CAAA;AAChD,SAAA;QACA,IAAI1B,EAAEqB,MAAQ,EAAA;AACUhB,UAAAA,qBAAA,CAAA,IAAA,CAAK7C,aAAawC,CAAE,CAAAqB,MAAA,CAAO3E,KAAK,CAAK,CAAA,GAAAgF,YAAA,EAAc,UAAU3D,IAAI,CAAA,CAAA;AACzF,SAAA;QACAiC,CAAA,CAAEQ,oBAAuB,GAAA,CAAA,CAAA;QACzBR,CAAA,CAAEf,QAAW,GAAA,KAAA,CAAA;QACbgB,GAAA,CAAID,CAAE,CAAAtD,GAAA,EAAKqB,IAAK,CAAAe,WAAA,EAAa,KAAS,CAAA,CAAA,CAAA;QACjC,IAAA,CAAAtB,WAAA,CAAYyC,GAAI,CAAAvC,GAAA,EAAKsC,CAAC,CAAA,CAAA;AAE3B,QAAA,IAAI0B,YAAc,EAAA;AACDjB,UAAAA,cAAA,CAAA,IAAA,CAAKjD,aAAaK,UAAY,EAAA;AAC3C6C,YAAAA,WAAA,EAAaV,EAAEpD,QAAW,GAAA,CAAA;YAC1BgC,QAAQb,IAAK,CAAAa,MAAA;AACbc,YAAAA,IAAM,EAAA,QAAA;AACR,WAAC,CAAA,CAAA;AACH,SAAA;AACF,OAAO,MAAA;AACDE,QAAAA,GAAA,CAAA+B,IAAA,CAAK,iBAAiB,6DAA8D,CAAA,CAAA;AAC1F,OAAA;AACO,MAAA,OAAA9D,UAAA,CAAA;AACT,KAAA;AAAA,GAAA,EAAA;IAAAH,GAAA,EAAA,UAAA;IAAAC,KAAA,EAOA,SAAAkE,QAASA,CAAA5E,QAAA,EAA2B6E,OAAkB,EAAAjE,UAAA,EAAiBE,IAAqB,EAAA;MAC1F,IAAMkD,KAAQ,GAAA,IAAA,CAAKzD,WAAY,CAAAN,GAAA,CAAID,QAAQ,CAAA,CAAA;MAC3C,IAAI,CAAC,IAAA,CAAK8E,iBAAkB,CAAAd,KAAA,EAAOhE,QAAQ,CAAA,EAAU,OAAAY,UAAA,CAAA;MACrD,IAAMgB,QAAgB,GAAA3B,GAAA,CAAI+D,KAAM,CAAAvE,GAAA,EAAKqB,KAAKe,WAAW,CAAA,CAAA;AAErD,MAAA,IAAMkD,aAAgB,GAAAf,KAAA,CAAMhC,QAAY,IAAA,EAACJ,QAAU,KAAVA,IAAAA,IAAAA,QAAU,KAAVA,KAAAA,CAAAA,IAAAA,QAAU,CAAA/B,MAAA,CAAA,CAAA;MAEnD,IAAMmF,OAAU,GAAAH,OAAA,YAAmBI,KAAQ,GAAAJ,OAAA,GAAU,CAACA,OAAO,CAAA,CAAA;MAC7D,IAAMK,kBAAuB,EAAC,CAAA;MAC9B,IAAMC,oBAAqC,EAAC,CAAA;MAC5C,IAAIC,qBAAwB,GAAA,CAAA,CAAA,CAAA;AAC5B,MAAA,KAAA,IAAS7D,IAAI,CAAG,EAAAC,GAAA,GAAMwD,QAAQnF,MAAQ,EAAA0B,CAAA,GAAIC,KAAKD,CAAK,EAAA,EAAA;AAClD,QAAA,IAAM8D,UAAUL,OAAQ,CAAAzD,CAAA,CAAA,CAAA;QACxB,IAAMsC,WAAc,GAAArE,iBAAA,CAAkB6F,OAAS,EAAAvE,IAAA,CAAKa,MAAM,CAAA,CAAA;QAC1D,IAAM2D,QAAW,GAAA,IAAA,CAAK/E,WAAY,CAAAN,GAAA,CAAI4D,WAAW,CAAA,CAAA;QACjD,IAAI,CAAC,IAAA,CAAK0B,uBAAwB,CAAAD,QAAA,EAAUzB,WAAW,CAAG,EAAA;UACpDlB,GAAA,CAAA+B,IAAA,CAAK,OAAS,sBAAAxE,MAAA,CAAqB2D,WAAiC,EAAA,qBAAA,CAAA,CAAA,CAAA;AAC1E,SAAO,MAAA;UACC,IAAAlE,QAAA,GAAWoF,gBAAgBf,KAAM,CAAArE,QAAA,IAAYqE,MAAMT,oBAAwB,IAAA,CAAA,CAAA,IAAMhC,IAAI,CAAK,CAAA,GAAA,CAAA,CAAA,CAAA;UAChG,IAAIA,MAAM,CAAG,EAAA;AACa6D,YAAAA,qBAAA,GAAAzF,QAAA,CAAA;AAC1B,WAAA;AACA,UAAA,IAAM6F,QAAW,GAAA;AACfrB,YAAAA,EAAI,EAAAN,WAAA;AACJpE,YAAAA,GAAK,EAAA4F,OAAA;AACL1F,YAAAA,QAAA,EAAAA,QAAA;AACAI,YAAAA,KAAA,EAAOiE,MAAMjE,KAAQ,GAAA,CAAA;AACrBiC,YAAAA,QAAU,EAAA,KAAA;AACVuB,YAAAA,oBAAsB,EAAA,CAAA;AACtBkC,YAAAA,QAAU,EAAA,KAAA;AACVC,YAAAA,IAAM,EAAAC,kBAAA,CAAI3B,KAAA,CAAM0B,IAAI,CAAA;AACpBtB,YAAAA,MAAQ,EAAAJ,KAAAA;WACV,CAAA;UACAwB,QAAA,CAASE,IAAO,GAAAF,QAAA,CAASE,IAAK,CAAAxF,MAAA,CAAOsF,QAAQ,CAAA,CAAA;AAC7CN,UAAAA,eAAA,CAAgBxD,KAAK2D,OAAO,CAAA,CAAA;AAC5BF,UAAAA,iBAAA,CAAkBzD,KAAK8D,QAAQ,CAAA,CAAA;UAC1B,IAAA,CAAAjF,WAAA,CAAYyC,GAAI,CAAAa,WAAA,EAAa2B,QAAQ,CAAA,CAAA;AAC5C,SAAA;AACF,OAAA;AACA,MAAA,IAAI,CAACN,eAAgB,CAAArF,MAAA,EAAe,OAAAe,UAAA,CAAA;AAEpC,MAAA,IAAIgB,aAAAA,IAAAA,IAAAA,uBAAAA,SAAU/B,MAAQ,EAAA;QACdmE,KAAA,CAAAvE,GAAA,CAAIqB,KAAKe,WAAe,CAAA,GAAAmC,KAAA,CAAMvE,IAAIqB,IAAK,CAAAe,WAAA,CAAA,CAAa3B,OAAOgF,eAAe,CAAA,CAAA;AAClF,OAAO,MAAA;QACClB,KAAA,CAAAvE,GAAA,CAAIqB,KAAKe,WAAe,CAAA,GAAAqD,eAAA,CAAA;QAC9BlB,KAAA,CAAMhC,QAAW,GAAA,IAAA,CAAA;AACnB,OAAA;AAGA,MAAA,IAAI+C,aAAe,EAAA;AACjBnE,QAAAA,UAAA,CAAWyC,MAAO,CAAAC,KAAA,CAAlB1C,UAAA,EAAA,CAAkBwE,qBAAA,EAAuB,CAAG,CAAA,CAAAlF,MAAA,CAAGgF,eAAe,CAAA,CAAA,CAAA;AAExD,QAAA,IAAAU,gBAAA,GAAmBV,gBAAgBrF,MAAU,IAAA,CAAA,CAAA;AACnDuD,QAAAA,qBAAA,CAAsB,IAAK,CAAA7C,WAAA,EAAayD,KAAM,CAAAvE,GAAA,EAAKmG,kBAAkB,QAAU,EAAA;UAC7EjE,QAAQb,IAAK,CAAAa,MAAA;UACbE,aAAaf,IAAK,CAAAe,WAAAA;AACpB,SAAC,CAAA,CAAA;AAEc2B,QAAAA,cAAA,CAAA,IAAA,CAAKjD,aAAaK,UAAY,EAAA;AAC3C6C,UAAAA,WAAA,EAAa2B,qBAAwB,GAAAF,eAAA,CAAgBrF,MAAS,GAAA,CAAA;UAC9D8B,QAAQb,IAAK,CAAAa,MAAA;AACbc,UAAAA,IAAM,EAAA,KAAA;AACNoD,UAAAA,KAAO,EAAA,CAAA;AACT,SAAC,CAAA,CAAA;AACH,OAAA;AAEO,MAAA,OAAAjF,UAAA,CAAA;AACT,KAAA;AAAA,GAAA,EAAA;IAAAH,GAAA,EAAA,cAAA;IAAAC,KAAA,EAEA,SAAAoF,YAAAA,CAAajB,OAAkB,EAAAjE,UAAA,EAAiBE,IAAgB,EAAA;AACxD,MAAA,IAAAiF,aAAA,GAAgBnF,UAAW,CAAAV,MAAA,CAAO2E,OAAO,CAAA,CAAA;MAC/C,IAAMmB,UAAa,GAAAnB,OAAA,YAAmBI,KAAQ,GAAAJ,OAAA,GAAU,CAACA,OAAO,CAAA,CAAA;AAChE,MAAA,IAAMoB,gBAAgBrF,UAAW,CAAAf,MAAA,CAAA;AACjC,MAAA,KAAA,IAAS0B,IAAI,CAAG,EAAAC,GAAA,GAAMwE,WAAWnG,MAAQ,EAAA0B,CAAA,GAAIC,KAAKD,CAAK,EAAA,EAAA;AACrD,QAAA,IAAMvB,QAAW,GAAAC,GAAA,CAAI+F,UAAW,CAAAzE,CAAA,CAAA,EAAIT,KAAKa,MAAM,CAAA,CAAA;QAC/C,IAAI,CAAC3B,QAAU,EAAA;AACT2C,UAAAA,GAAA,CAAAC,KAAA,CAAM,SAAS,wEAAwE,CAAA,CAAA;AAC3F,UAAA,SAAA;AACF,SAAA;AACA,QAAA,IAAMoB,KAAuB,GAAA;AAC3BG,UAAAA,EAAI,EAAAnE,QAAA;AACJP,UAAAA,KAAKuG,UAAW,CAAAzE,CAAA,CAAA;UAChB5B,UAAUsG,aAAgB,GAAA1E,CAAA;AAC1BxB,UAAAA,KAAO,EAAA,CAAA;AACPiC,UAAAA,QAAU,EAAA,KAAA;AACVuB,UAAAA,oBAAsB,EAAA,CAAA;AACtBkC,UAAAA,QAAU,EAAA,KAAA;SACZ,CAAA;AACMzB,QAAAA,KAAA,CAAA0B,IAAA,GAAO,CAAC1B,KAAK,CAAA,CAAA;QACd,IAAA,CAAAzD,WAAA,CAAYyC,GAAI,CAAAhD,QAAA,EAAUgE,KAAK,CAAA,CAAA;AACtC,OAAA;AACO,MAAA,OAAA+B,aAAA,CAAA;AACT,KAAA;AAAA,GAAA,EAAA;IAAAtF,GAAA,EAAA,aAAA;IAAAC,KAAA,EAOA,SAAAwF,WAAYA,CAAAlG,QAAA,EAA2B6E,OAAY,EAAAjE,UAAA,EAAiBE,IAAqB,EAAA;AACvF,MAAA,OAAO,KAAKqF,MAAO,CAAAnG,QAAA,EAAU6E,OAAS,EAAAjE,UAAA,EAAYE,MAAM,OAAO,CAAA,CAAA;AACjE,KAAA;AAAA,GAAA,EAAA;IAAAL,GAAA,EAAA,cAAA;IAAAC,KAAA,EAOA,SAAA0F,YAAaA,CAAApG,QAAA,EAA2B6E,OAAY,EAAAjE,UAAA,EAAiBE,IAAqB,EAAA;AACxF,MAAA,OAAO,KAAKqF,MAAO,CAAAnG,QAAA,EAAU6E,OAAS,EAAAjE,UAAA,EAAYE,MAAM,QAAQ,CAAA,CAAA;AAClE,KAAA;AAAA,GAAA,EAAA;IAAAL,GAAA,EAAA,QAAA;AAAAC,IAAAA,KAAA,EAEA,SAAAyF,MAAOA,CAAAnG,QAAA,EAA2B6E,OAAY,EAAAjE,UAAA,EAAiBE,MAAgB2B,IAA0B,EAAA;MACvG,IAAMuB,KAAQ,GAAA,IAAA,CAAKzD,WAAY,CAAAN,GAAA,CAAID,QAAQ,CAAA,CAAA;MAC3C,IAAI,CAAC,IAAA,CAAK8E,iBAAkB,CAAAd,KAAA,EAAOhE,QAAQ,CAAA,EAAU,OAAAY,UAAA,CAAA;MACrD,IAAMiD,WAAc,GAAA5D,GAAA,CAAI4E,OAAS,EAAA/D,IAAA,CAAKa,MAAM,CAAA,CAAA;MAC5C,IAAM2D,QAAW,GAAA,IAAA,CAAK/E,WAAY,CAAAN,GAAA,CAAI4D,WAAW,CAAA,CAAA;MACjD,IAAI,CAAC,IAAA,CAAK0B,uBAAwB,CAAAD,QAAA,EAAUzB,WAAW,CAAA,EAAU,OAAAjD,UAAA,CAAA;AACjE,MAAA,IAAMjB,WAAW8C,IAAS,KAAA,OAAA,GAAUuB,KAAM,CAAArE,QAAA,GAAW,IAAIqE,KAAM,CAAArE,QAAA,CAAA;AAC/D,MAAA,IAAM6F,QAAW,GAAA;AACfrB,QAAAA,EAAI,EAAAN,WAAA;AACJpE,QAAAA,GAAK,EAAAoF,OAAA;AACLlF,QAAAA,QAAA,EAAAA,QAAA;QACAI,OAAOiE,KAAM,CAAAjE,KAAA;AACbiC,QAAAA,QAAU,EAAA,KAAA;AACVuB,QAAAA,oBAAsB,EAAA,CAAA;AACtBkC,QAAAA,QAAU,EAAA,KAAA;QACVC,IAAM,EAAA1B,KAAA,CAAM0B,IAAK,CAAAW,KAAA,CAAM,GAAG,CAAE,CAAA,CAAA;QAC5BjC,QAAQJ,KAAM,CAAAI,MAAAA;OAChB,CAAA;MACAoB,QAAA,CAASE,IAAO,GAAAF,QAAA,CAASE,IAAK,CAAAxF,MAAA,CAAOsF,QAAQ,CAAA,CAAA;AACvC,MAAA,IAAAc,SAAA,GAAY7D,SAAS,OAAU,GAAAuB,KAAA,CAAMrE,YAAYqE,KAAM,CAAAT,oBAAA,GAAuB,KAAKS,KAAM,CAAArE,QAAA,CAAA;MACpFiB,UAAA,CAAAyC,MAAA,CAAOiD,SAAW,EAAA,CAAA,EAAGzB,OAAO,CAAA,CAAA;MACjC,IAAA0B,QAAA,GAAW9D,IAAS,KAAA,OAAA,GAAU,CAAI,GAAA,CAAA,CAAA;MACxC,IAAIuB,MAAMI,MAAQ,EAAA;AAChB,QAAA,IAAMoC,aAAgB,GAAAxC,KAAA,CAAMI,MAAO,CAAA3E,GAAA,CAAIqB,KAAKe,WAAa,CAAA,CAAA0C,SAAA,CACvD,UAACkC,CAAoB,EAAA;UAAA,OAAAzG,QAAA,KAAaC,GAAI,CAAAwG,CAAA,EAAG3F,KAAKa,MAAM,CAAA,CAAA;AAAA,SACtD,CAAA,CAAA;AACMqC,QAAAA,KAAA,CAAAI,MAAA,CAAO3E,IAAIqB,IAAK,CAAAe,WAAA,CAAA,CAAawB,OAAOmD,aAAgB,GAAAD,QAAA,EAAU,GAAG1B,OAAO,CAAA,CAAA;AAC9EzB,QAAAA,qBAAA,CAAsB,KAAK7C,WAAa,EAAAyD,KAAA,CAAMI,OAAO3E,GAAK,EAAA,CAAA,EAAG,UAAUqB,IAAI,CAAA,CAAA;AAC7E,OAAA;MACK,IAAA,CAAAP,WAAA,CAAYyC,GAAI,CAAAa,WAAA,EAAa2B,QAAQ,CAAA,CAAA;AAG3BhC,MAAAA,cAAA,CAAA,IAAA,CAAKjD,aAAaK,UAAY,EAAA;QAC3Ce,QAAQb,IAAK,CAAAa,MAAA;AACb8B,QAAAA,WAAA,EAAaO,MAAMrE,QAAW,GAAA,CAAA;AAC9B8C,QAAAA,IAAM,EAAA,KAAA;AACR,OAAC,CAAA,CAAA;AAEM,MAAA,OAAA7B,UAAA,CAAA;AACT,KAAA;AAAA,GAAA,EAAA;IAAAH,GAAA,EAAA,UAAA;IAAAC,KAAA,EAMA,SAAAgG,QAAAA,CACE9F,UACA,EAAA+F,MAAA,EACA7F,IACsE,EAAA;AACtE,MAAA,IAAM8F,aAAaD,MAAO,CAAAE,YAAA,CAAA;AAC1B,MAAA,IAAMC,WAAWH,MAAO,CAAAI,WAAA,CAAA;AACxB,MAAA,IAAIH,UAAe,KAAAE,QAAA,EAAiB,OAAA;AAAElG,QAAAA,UAAY,EAAZA,UAAY;AAAAoG,QAAAA,MAAA,EAAQ,IAAA;OAAK,CAAA;MAC/D,IAAMC,aAAgB,GAAAhH,GAAA,CAAI0G,MAAO,CAAAO,OAAA,EAASpG,KAAKa,MAAM,CAAA,CAAA;MACrD,IAAMwF,WAAc,GAAAlH,GAAA,CAAI0G,MAAO,CAAAS,MAAA,EAAQtG,KAAKa,MAAM,CAAA,CAAA;MAClD,IAAM0F,UAAa,GAAA,IAAA,CAAK9G,WAAY,CAAAN,GAAA,CAAIgH,aAAa,CAAA,CAAA;MACrD,IAAMK,QAAW,GAAA,IAAA,CAAK/G,WAAY,CAAAN,GAAA,CAAIkH,WAAW,CAAA,CAAA;AAC7C,MAAA,IAAAE,UAAA,CAAWtH,KAAU,KAAAuH,QAAA,CAASvH,KAAO,EAAA;QAChC,OAAA;AACLa,UAAAA,UAAA,EAAAA,UAAA;AACAoG,UAAAA,MAAQ,EAAA,KAAA;UACR1H,MAAMD,oCAAqC,CAAAC,IAAA;UAC3CC,QAAQF,oCAAqC,CAAAE,MAAAA;SAC/C,CAAA;AACF,OAAA;MACM,IAAAgI,cAAA,GAAiBX,UAAa,GAAAS,UAAA,CAAW9D,oBAAuB,GAAA,CAAA,CAAA;MAChE,IAAAiE,YAAA,GAAeV,QAAW,GAAAQ,QAAA,CAAS/D,oBAAuB,GAAA,CAAA,CAAA;MAChE,IAAMkE,YAAe,GAAA7G,UAAA,CAAWyF,KAAM,CAAAO,UAAA,EAAYW,cAAc,CAAA,CAAA;MAChE,IAAMG,UAAa,GAAA9G,UAAA,CAAWyF,KAAM,CAAAS,QAAA,EAAUU,YAAY,CAAA,CAAA;MAC1D,IAAIZ,aAAaE,QAAU,EAAA;QACzB,IAAMa,aAAgB,GAAA/G,UAAA,CAAWyF,KAAM,CAAAmB,YAAA,EAAcZ,UAAU,CAAA,CAAA;QAC/D,IAAMgB,WAAc,GAAAH,YAAA,CAAavH,MAAO,CAAAwH,UAAA,EAAYC,aAAa,CAAA,CAAA;QACtD/G,UAAA,CAAAyC,MAAA,CAAOyD,QAAU,EAAAc,WAAA,CAAY/H,MAAM,CAAA,CAAA;AAC9Ce,QAAAA,UAAA,CAAWyC,MAAO,CAAAC,KAAA,CAAlB1C,UAAA,EAAkBkG,CAAAA,QAAA,EAAU,CAAG,EAAA5G,MAAA,CAAAy