UNPKG

yhui-yuanhuan

Version:

A Component Library for Vue 3 based on element-plus

1 lines 28.2 kB
{"version":3,"file":"table.mjs","sources":["../../../../../../packages/components/table/src/table.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// #region init\nimport { type Component, computed, onMounted, ref, useSlots } from 'vue'\nimport { get } from 'lodash-unified'\nimport {\n ElButton,\n type ElDialog,\n ElDropdown,\n ElDropdownItem,\n ElDropdownMenu,\n ElForm,\n ElIcon,\n ElMessage,\n ElPagination,\n ElPopover,\n ElSkeleton,\n ElTable,\n ElTableColumn,\n ElTree,\n} from 'element-plus'\nimport {\n ArrowDown,\n Grid,\n Plus,\n Refresh,\n RefreshLeft,\n Search,\n Setting,\n} from '@element-plus/icons-vue'\nimport { useHint } from '@yhui/utils'\nimport { type IConfirmParam, YhDialog } from '../../dialog'\nimport { type Page } from '../../types'\nimport { SettingData, actionsColumnProp } from './setting'\nimport type { EntityBase } from '../../types'\nimport type { VNode } from 'vue'\n\ndefineOptions({\n name: 'YhTable',\n})\n\nconst emit = defineEmits<{\n (e: 'update:pageParam', p: typeof props['pageParam'])\n (e: 'update:searchParam', p: typeof props['searchParam'])\n (e: 'update:tableData', p: typeof props['tableData'])\n (e: 'confirm', p: Required<IConfirmParam<any>>)\n}>()\n\nconst props = withDefaults(\n defineProps<{\n actionsColumnProps?: InstanceType<typeof ElTableColumn>['$props']\n api?: {\n del?: () => Promise<any>\n }\n components?: {\n View?: Component\n Edit?: Component\n }\n dialogProps?: InstanceType<typeof ElDialog>['$props']\n // eslint-disable-next-line vue/prop-name-casing\n EntityClass?: typeof EntityBase\n hideList?: HideOptions[]\n /**\n * @description 组件id,用于存储配置,如列顺序\n */\n id: string\n /** 增删改查跳转新页面需要传递 */\n router?: { push: (...args: any) => any }\n pages?: {\n /** RouteRecordRaw['name'] */\n view?: string\n /** RouteRecordRaw['name'] */\n add?: string\n /** RouteRecordRaw['name'] */\n edit?: string\n }\n pageParam?: Required<Page>\n pageProps?: InstanceType<typeof ElPagination>['$props']\n permissions?: permission\n permissionValidate?: (name?: string) => boolean\n search?: (param: Required<Page>, fromPage?: boolean) => Promise<any>\n searchDefault?: () => Record<string, any>\n searchFormProps?: InstanceType<typeof ElForm>['$props']\n searchParam?: Record<string, any>\n searchResultKey?: string\n searchResultTotalKey?: string\n searchSetting?: Partial<{\n searchIcon: Component | undefined\n searchText: string\n resetIcon: Component | undefined\n resetText: string\n }>\n settingStorageKey?: string\n tableData?: any\n tableProps?: InstanceType<typeof ElTable>['$props']\n /** 不折叠操作按钮 */\n unfoldActions?: boolean\n }>(),\n {\n hideList: () => [],\n id: () => `table-only-one`,\n pageParam: () => ({ page: 1, size: 10, total: 0 }),\n permissionValidate: () => true,\n searchDefault: () => ({}),\n searchParam: () => ({}),\n searchResultKey: 'data.data.list',\n searchResultTotalKey: 'data.data.total',\n }\n)\n\n// search table page action searchButtons\nconst slots = useSlots()\n\ntype permission = { add?: string; edit?: string; del?: string }\ntype HideOptions =\n | 'search'\n | 'page'\n | 'searchButton'\n | 'resetButton'\n | 'addButton'\n | 'viewButton'\n | 'editButton'\n | 'deleteButton'\n | 'settingButton'\n | 'actionsColumn'\n | 'searching'\n | 'setting'\n\nif (props.settingStorageKey) SettingData.key = props.settingStorageKey\n\nconst tableRef = ref()\nfunction isShow(name: HideOptions) {\n return !props.hideList?.includes(name)\n}\nfunction isSpecialType(type) {\n return ['selection', 'index'].includes(type)\n}\n// #endregion init\n\n// #region search\nconst searchFormRef = ref()\nconst defaultSearchSetting = {\n searchIcon: Search,\n searchText: '查询',\n resetIcon: Refresh,\n resetText: '重置',\n}\nconst combinedSearchingSetting = {\n ...defaultSearchSetting,\n ...props.searchSetting,\n}\n/* fill search item to adjust width */\nconst refSearch = ref<HTMLElement>()\nconst completeSearchItem = () => {\n const length = refSearch.value?.children?.length || 0\n const needAdd = length % 3\n for (let i = 0; i < 3 - needAdd; i++) {\n refSearch.value?.appendChild(document.createElement('div'))\n }\n}\n/* search and pagination */\nconst isSearching = ref(false)\n\nconst doSearch = async () => {\n isSearching.value = true\n try {\n const res = await props.search?.(props.pageParam, true)\n let list = get(res, props.searchResultKey)\n const total = get(res, props.searchResultTotalKey)\n if (props.EntityClass) list = list.map((it) => new props.EntityClass!(it))\n emit('update:tableData', list)\n if (isShow('searchButton')) {\n emit('update:pageParam', {\n ...props.pageParam,\n total,\n })\n }\n } catch (error) {\n console.log(error)\n isSearching.value = false\n }\n isSearching.value = false\n}\nconst handleSizeChange = (size: number) => {\n emit('update:pageParam', { ...props.pageParam, page: 1, size })\n doSearch()\n}\nconst handleCurrentChange = (page: number) => {\n emit('update:pageParam', { ...props.pageParam, page })\n doSearch()\n}\nconst handleClickSearch = () => {\n emit('update:pageParam', { ...props.pageParam, page: 1 })\n doSearch()\n}\nconst resetSearch = () => {\n emit('update:searchParam', props.searchDefault())\n doSearch()\n}\n// #endregion search\n\n// #region setting\nconst slotItems4table = computed<VNode[]>(() => slots?.table?.() || [])\nconst settingData = ref(initSettingData())\nconst settingButtonRef = ref<InstanceType<typeof ElButton>>()\nconst settingPopoverRef = ref<InstanceType<typeof ElPopover>>()\nconst treeRef = ref<InstanceType<typeof ElTree>>()\nconst isSettingPopoverVisible = ref(false)\n\nfunction initSettingData() {\n const id = props.id\n const slotItems = slotItems4table.value\n const setting = SettingData.getInstance({ id, slotItems })\n setting.watch()\n return setting\n}\nconst tableChildren = computed(() => {\n if (!settingData.value) return\n const propsInSetting = settingData.value?.columns.map((column) => column.prop)\n const res = settingData.value.purifiedSlotItems\n .filter((it) => {\n if (!propsInSetting) return true\n const isInSettings = propsInSetting.includes(it.props?.prop)\n const isActions = it.props?.prop === actionsColumnProp\n const isChecked = settingData.value?.columns.find(\n (column) => column.prop === it.props?.prop\n )?.checked\n return isInSettings && !isActions && isChecked\n })\n .sort(\n (a, b) =>\n settingData.value!.columns.findIndex(\n (it) => it.prop === a.props?.prop\n ) -\n settingData.value!.columns.findIndex((it) => it.prop === b.props?.prop)\n )\n return res\n})\n\nconst hideSettings = () => {\n settingPopoverRef?.value?.popperRef?.['delayHide']?.()\n}\nfunction isAllowDrag(data) {\n if (isSpecialType(data.type)) return false\n return true\n}\nfunction allowDrag(node) {\n return isAllowDrag(node.data)\n}\nfunction allowDrop(draggingNode, dropNode, type) {\n if (type === 'inner') return false\n if (isSpecialType(dropNode.data.type)) return false\n return true\n}\n\nfunction clearStorage() {\n useHint('确认恢复默认设置?', async () => {\n settingData.value.clear()\n ElMessage.success('已恢复默认设置')\n })\n}\n\n// #endregion setting\n\n// #region table\nconst actions = [\n { key: 'view', component: props?.components?.View, text: '查看' },\n { key: 'edit', component: props?.components?.Edit, text: '编辑' },\n { key: 'new', component: props?.components?.Edit, text: '新增' },\n]\ntype actionType = 'view' | 'edit' | 'add'\nconst action = ref<IConfirmParam<any>['from']>('view')\nconst actionText = computed(\n () => actions.find((it) => it.key === action.value)?.text\n)\nconst actionRow = ref()\nconst isShowDetailDialog = ref(false)\nconst showDetailDialog = (type: actionType) => {\n if (props.components) {\n isShowDetailDialog.value = true\n } else if (props.pages) {\n if (typeof props.router?.push !== 'function') return\n // eslint-disable-next-line vue/no-mutating-props\n props.router.push({\n name: props.pages[type],\n params: type !== 'add' ? { id: actionRow.value.id } : undefined,\n })\n } else {\n throw new Error('action pages or components needed')\n }\n}\nconst viewRow = (row) => {\n action.value = 'view'\n actionRow.value = row\n showDetailDialog('view')\n}\nconst add = () => {\n action.value = 'new'\n actionRow.value = props.EntityClass ? new props.EntityClass() : {}\n showDetailDialog('add')\n}\nconst onClickMenuItem = ({\n row,\n command,\n}: {\n row: any\n command: IConfirmParam<any>['from']\n}) => {\n action.value = typeof command === 'string' ? command : 'other'\n actionRow.value = row\n if (command === 'edit') {\n showDetailDialog('edit')\n } else if (command === 'delete') {\n props.api?.del?.()\n }\n}\n// #endregion table\n\n// #region dialog\nconst refContent = ref()\nconst onDialogConfirm = async (p: IConfirmParam<any>) => {\n if (p.type === 'ok' || p.type === 'publish') {\n try {\n const isPass = refContent.value?.['validate']\n ? await refContent.value?.['validate']?.()\n : true\n if (!isPass) {\n p.done(false)\n return\n }\n } catch (error) {\n console.log('validate errors:', error)\n p.done(false)\n return\n }\n }\n emit('confirm', { ...p, data: refContent.value?.detail })\n}\n// #endregion dialog\n\n// #region lifecycle\nif (props.search) {\n doSearch()\n}\nonMounted(() => {\n completeSearchItem()\n})\ndefineExpose({\n actionRow,\n doSearch,\n tableRef,\n searchFormRef,\n})\n// #endregion lifecycle\n\n// window['test'] = {\n// ref,\n// toggleIsSearching: () => (\n// (isSearching.value = !isSearching.value), isSearching.value\n// ),\n// tableRef,\n// slots,\n// tableChildren,\n// SettingData,\n// settingData,\n// isShow,\n// props,\n// showDialog: () => {\n// isShowDetailDialog.value = !isShowDetailDialog.value\n// },\n// }\n</script>\n\n<template>\n <div class=\"yh-table\">\n <div class=\"yh-table-container\">\n <div v-if=\"isShow('search')\" ref=\"refSearch\" class=\"search\">\n <ElForm\n ref=\"searchFormRef\"\n :model=\"searchParam\"\n inline\n v-bind=\"searchFormProps\"\n >\n <div class=\"search-form\">\n <slot name=\"search\" />\n <div v-if=\"isShow('resetButton')\" class=\"search-buttons\">\n <template v-if=\"isShow('searchButton')\">\n <ElButton\n type=\"primary\"\n :loading=\"isSearching\"\n :icon=\"combinedSearchingSetting.searchIcon\"\n @click=\"handleClickSearch\"\n >\n {{ combinedSearchingSetting.searchText }}\n </ElButton>\n <ElButton\n :icon=\"combinedSearchingSetting.resetIcon\"\n @click=\"resetSearch\"\n >\n {{ combinedSearchingSetting.resetText }}\n </ElButton>\n </template>\n </div>\n <slot name=\"searchButtons\" />\n </div>\n </ElForm>\n </div>\n\n <div class=\"table\">\n <div class=\"actions-bar\">\n <ElButton\n v-if=\"isShow('addButton') && permissionValidate(permissions?.add)\"\n type=\"primary\"\n :icon=\"Plus\"\n @click=\"add\"\n >\n 新增\n </ElButton>\n </div>\n\n <div\n v-if=\"isShow('setting')\"\n :class=\"['setting', { 'popover-visible': isSettingPopoverVisible }]\"\n >\n <ElPopover\n ref=\"settingPopoverRef\"\n v-model:visible=\"isSettingPopoverVisible\"\n class=\"setting-popover\"\n :virtual-ref=\"settingButtonRef\"\n trigger=\"click\"\n width=\"auto\"\n placement=\"left-start\"\n append-to-body\n >\n <template #reference>\n <ElButton\n v-if=\"\n isShow('settingButton') &&\n permissionValidate?.(permissions?.add)\n \"\n ref=\"settingButtonRef\"\n class=\"setting-button\"\n :icon=\"Setting\"\n style=\"width: 32px\"\n @v-click-outside=\"hideSettings\"\n />\n </template>\n <ElButton size=\"small\" text @click=\"clearStorage\">\n <ElIcon size=\"12\" style=\"margin-right: 4px\">\n <RefreshLeft />\n </ElIcon>\n <span>恢复默认</span>\n </ElButton>\n <ElTree\n ref=\"treeRef\"\n class=\"yh-table-setting-tree\"\n :allow-drag=\"allowDrag\"\n :allow-drop=\"allowDrop\"\n :data=\"settingData?.columns\"\n draggable\n default-expand-all\n node-key=\"prop\"\n >\n <template #default=\"{ data }\">\n <div class=\"yh-drag\" :class=\"{ disabled: !isAllowDrag(data) }\">\n <ElIcon\n size=\"12\"\n color=\"#333\"\n style=\"margin-right: 20px\"\n :style=\"{ opacity: !isAllowDrag(data) ? '0' : '1' }\"\n >\n <Grid />\n </ElIcon>\n <ElCheckbox\n v-model=\"data.checked\"\n class=\"yh-check\"\n :label=\"data.label\"\n :disabled=\"isSpecialType(data.type) || data.disabled\"\n />\n </div>\n </template>\n </ElTree>\n </ElPopover>\n </div>\n\n <ElSkeleton\n v-show=\"isShow('searching') ? isSearching : false\"\n :rows=\"4\"\n animated\n />\n <ElTable\n v-show=\"isShow('searching') ? !isSearching : true\"\n ref=\"tableRef\"\n :data=\"tableData\"\n :stripe=\"true\"\n :border=\"true\"\n :show-overflow-tooltip=\"true\"\n v-bind=\"tableProps\"\n :allow-drag-last-column=\"false\"\n >\n <component\n :is=\"column\"\n v-for=\"(column, i) in tableChildren\"\n :key=\"i\"\n />\n <ElTableColumn\n v-if=\"isShow('actionsColumn')\"\n :prop=\"actionsColumnProp\"\n label=\"操作\"\n fixed=\"right\"\n v-bind=\"actionsColumnProps\"\n >\n <template #default=\"{ row }\">\n <div class=\"item-actions\">\n <ElButton\n v-if=\"isShow('viewButton')\"\n type=\"primary\"\n link\n @click=\"viewRow(row)\"\n >查看</ElButton\n >\n <template v-if=\"unfoldActions\">\n <ElButton\n v-if=\"isShow('editButton')\"\n type=\"primary\"\n link\n @click=\"onClickMenuItem({ row, command: 'edit' })\"\n >\n 编辑</ElButton\n >\n <ElButton\n v-if=\"isShow('deleteButton')\"\n type=\"primary\"\n link\n class=\"action-delete\"\n @click=\"onClickMenuItem({ row, command: 'delete' })\"\n >删除</ElButton\n >\n <slot v-if=\"unfoldActions\" name=\"action\" v-bind=\"{ row }\" />\n </template>\n <template v-else>\n <ElDropdown\n v-if=\"isShow('editButton') && isShow('deleteButton')\"\n trigger=\"click\"\n @command=\"onClickMenuItem({ row, command: $event })\"\n >\n <ElButton type=\"primary\" link\n >更多<ElIcon size=\"12\" color=\"var(--el-color-primary)\">\n <ArrowDown />\n </ElIcon>\n </ElButton>\n <template #dropdown>\n <ElDropdownMenu ref=\"refMoreMenu\" class=\"actions-more\">\n <ElDropdownItem\n v-if=\"isShow('editButton')\"\n :disabled=\"!permissionValidate(permissions?.edit)\"\n command=\"edit\"\n >编辑</ElDropdownItem\n >\n <ElDropdownItem\n v-if=\"isShow('deleteButton')\"\n :disabled=\"!permissionValidate(permissions?.del)\"\n command=\"delete\"\n class=\"action-delete\"\n >删除</ElDropdownItem\n >\n <slot name=\"action\" v-bind=\"{ row }\" />\n </ElDropdownMenu>\n </template>\n </ElDropdown>\n </template>\n </div>\n </template>\n </ElTableColumn>\n </ElTable>\n </div>\n\n <div v-if=\"isShow('page')\" class=\"page\">\n <ElPagination\n layout=\"total, sizes, prev, pager, next, jumper\"\n :small=\"false\"\n :background=\"true\"\n :page-sizes=\"[10, 20, 50, 100]\"\n :current-page=\"pageParam.page\"\n :page-size=\"pageParam.size\"\n :total=\"pageParam.total\"\n v-bind=\"pageProps\"\n @update:current-page=\"\n emit('update:pageParam', { ...pageParam, page: $event })\n \"\n @update:page-size=\"\n emit('update:pageParam', { ...pageParam, page: $event })\n \"\n @size-change=\"handleSizeChange\"\n @current-change=\"handleCurrentChange\"\n />\n </div>\n\n <YhDialog\n v-model=\"isShowDetailDialog\"\n :title=\"actionText\"\n :from=\"action\"\n :dialog-props=\"dialogProps\"\n @confirm=\"onDialogConfirm\"\n >\n <component\n :is=\"actions.find((it) => it.key === action)?.component\"\n ref=\"refContent\"\n :row=\"actionRow\"\n :type=\"action\"\n />\n </YhDialog>\n </div>\n </div>\n</template>\n"],"names":[],"mappings":";;;;;;;;;mCAoCc,CAAA;AAAA,EACZ,IAAM,EAAA,SAAA;AACR,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwEA,IAAA,MAAM,QAAQ,OAAS,CAAA;AAiBvB,IAAA,MAAU,KAAA,GAAA,QAAA,EAAA,CAAA;AAEV,IAAA,IAAA,uBAAqB;AACrB,MAAA,eAAmC,GAAA,KAAA,CAAA,iBAAA,CAAA;AACjC,IAAA,MAAA,QAAQ,GAAgB,GAAA,EAAA,CAAA;AAAa,IACvC,SAAA,MAAA,CAAA,IAAA,EAAA;AACA,MAAA,IAAA,GAAS;AACP,MAAA,OAAO,EAAC,CAAA,GAAA,GAAA,KAAa,CAAO,QAAE,SAAS,GAAI,KAAA,CAAA,GAAA,GAAA,CAAA,QAAA,CAAA,IAAA,CAAA,CAAA,CAAA;AAAA,KAC7C;AAIA,IAAA,sBAAsB,CAAI,IAAA,EAAA;AAC1B,MAAA,OAA6B,CAAA,WAAA,EAAA,OAAA,CAAA,CAAA,QAAA,CAAA,IAAA,CAAA,CAAA;AAAA,KAAA;AACf,IAAA,MACA,aAAA,GAAA,GAAA,EAAA,CAAA;AAAA,IAAA,MACD,oBAAA,GAAA;AAAA,MACX,UAAW,EAAA,MAAA;AAAA,MACb,UAAA,EAAA,cAAA;AACA,MAAA,SAAiC,EAAA,OAAA;AAAA,MAC/B,SAAG,EAAA,cAAA;AAAA,KAAA,CACH;AAAS,IACX,MAAA,wBAAA,GAAA;AAEA,MAAA,GAAA,oBAAmC;AACnC,MAAA,GAAA;AACE,KAAA,CAAA;AACA,IAAA,MAAA,YAAgB,GAAS,EAAA,CAAA;AACzB,IAAA,MAAA,kBAAoB;AAClB,MAAA,IAAA,GAAA,EAAA,GAAU,EAAO,GAAA,CAAA;AAAyC,MAC5D,MAAA,MAAA,GAAA,CAAA,CAAA,GAAA,GAAA,CAAA,GAAA,GAAA,SAAA,CAAA,KAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAA,QAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAA,MAAA,KAAA,CAAA,CAAA;AAAA,MACF,MAAA,OAAA,GAAA,MAAA,GAAA,CAAA,CAAA;AAEA,MAAM,KAAA,IAAA,CAAA,GAAA,CAAA,EAAA,CAAA,OAAuB,OAAA,EAAA,CAAA,EAAA,EAAA;AAE7B,QAAA,CAAA,eAA6B,CAAA,KAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAA,WAAA,CAAA,QAAA,CAAA,aAAA,CAAA,KAAA,CAAA,CAAA,CAAA;AAC3B,OAAA;AACA,KAAI,CAAA;AACF,IAAA,MAAA,WAAkB,GAAA,GAAA,CAAA,KAAe,CAAA,CAAA;AACjC,IAAA,MAAA,QAAW,GAAA,YAAS;AACpB,MAAA,IAAA,GAAA,CAAM;AACN,MAAI,WAAA,CAAM,KAAa,GAAA,IAAA,CAAA;AACvB,MAAA,IAAA;AACA,QAAI,MAAA,GAAA,iBAAwB,KAAA,CAAA,MAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAA,IAAA,CAAA,KAAA,EAAA,KAAA,CAAA,SAAA,EAAA,IAAA,CAAA,CAAA,CAAA;AAC1B,QAAA,IAAA,IAAyB,GAAA,GAAA,CAAA,GAAA,EAAA,KAAA,CAAA,eAAA,CAAA,CAAA;AAAA,QAAA,WACd,GAAA,GAAA,CAAA,GAAA,EAAA,KAAA,CAAA,oBAAA,CAAA,CAAA;AAAA,QACT,IAAA,KAAA,CAAA,WAAA;AAAA,UACF,IAAC,GAAA,IAAA,CAAA,GAAA,CAAA,CAAA,EAAA,KAAA,IAAA,KAAA,CAAA,WAAA,CAAA,EAAA,CAAA,CAAA,CAAA;AAAA,QACH,IAAA,CAAA,kBAAA,EAAA,IAAA,CAAA,CAAA;AAAA,kBACc,CAAA,cAAA,CAAA,EAAA;AACd,UAAA,IAAA,CAAA,kBAAiB,EAAA;AACjB,YAAA,GAAA,KAAY,CAAQ,SAAA;AAAA,YACtB,KAAA;AACA,WAAA,CAAA,CAAA;AAAoB,SACtB;AACA,OAAM,CAAA,OAAA,KAAA,EAAA;AACJ,QAAK,OAAA,CAAA,GAAA,CAAA,KAAA,CAAA,CAAA;AACL,QAAS,WAAA,CAAA,KAAA,GAAA,KAAA,CAAA;AAAA,OACX;AACA,MAAM,WAAA,CAAA,KAAA,GAAA,KAAA,CAAsB;AAC1B,KAAA,CAAA;AACA,IAAS,MAAA,gBAAA,GAAA,CAAA,IAAA,KAAA;AAAA,MACX,IAAA,CAAA,kBAAA,EAAA,EAAA,GAAA,KAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,CAAA;AACA,MAAA;AACE,KAAA,CAAA;AACA,IAAS,MAAA,mBAAA,GAAA,CAAA,IAAA,KAAA;AAAA,MACX,IAAA,CAAA,kBAAA,EAAA,EAAA,GAAA,KAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,CAAA;AACA,MAAA;AACE,KAAK,CAAA;AACL,IAAS,MAAA,iBAAA,GAAA,MAAA;AAAA,MACX,IAAA,CAAA,kBAAA,EAAA,EAAA,GAAA,KAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,CAAA;AAIA,MAAA;AACA,KAAM,CAAA;AACN,IAAA,MAAM,oBAAsD;AAC5D,MAAA,IAAM,qBAAwD,EAAA,KAAA,CAAA,aAAA,EAAA,CAAA,CAAA;AAC9D,MAAA;AACA,KAAM,CAAA;AAEN,IAAA,MAAA,eAA2B,GAAA,QAAA,CAAA,MAAA;AACzB,MAAA,IAAA;AACA,MAAA,oBAAkC,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,KAAA,CAAA,KAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAA,IAAA,CAAA,KAAA,CAAA,KAAA,EAAA,CAAA;AAClC,KAAA,CAAA,CAAA;AACA,IAAA,MAAA,WAAc,GAAA,GAAA,CAAA,eAAA,EAAA,CAAA,CAAA;AACd,IAAO,MAAA,gBAAA,GAAA,GAAA,EAAA,CAAA;AAAA,IACT,MAAA,iBAAA,GAAA,GAAA,EAAA,CAAA;AACA,IAAM,MAAA,OAAA,GAAA,GAAA,EAAA,CAAgB;AACpB,IAAI,MAAA,uBAAoB,GAAA,GAAA,CAAA,KAAA,CAAA,CAAA;AACxB,IAAM,SAAA,eAAA;AACN,MAAA,MAAM,UAAkB,CAAA,EAAA,CAAA;AAEpB,MAAI,MAAA,2BAAwB,CAAA,KAAA,CAAA;AAC5B,MAAA,MAAA,OAAqB,GAAA,WAAA,CAAA,WAAwB,CAAA,EAAA,EAAA,EAAA,WAAU,CAAI,CAAA;AAC3D,MAAM,OAAA,CAAA,KAAA,EAAA,CAAA;AACN,MAAM,OAAA,OAAA,CAAA;AAAuC,KAAA;AACL,IAAA,MACrC,aAAA,GAAA,QAAA,CAAA,MAAA;AACH,MAAO,IAAA,GAAA,CAAA;AAA8B,MACvC,IACC,CAAA,WAAA,CAAA,KAAA;AAAA,QACC,OACE;AAA2B,MAAA,MACxB,cAAU,GAAA,CAAS,GAAS,GAAA,WAAA,CAAA,KAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,MAAA,KAAA,MAAA,CAAA,IAAA,CAAA,CAAA;AAAA,MAC/B,MACA,GAAY,GAAA,WAAA,CAAO,KAAQ,CAAA,iBAAW,CAAA,MAAU,CAAA,CAAA,EAAA,KAAW;AAAW,QAC1E,IAAA,GAAA,EAAA,GAAA,EAAA,GAAA,EAAA,EAAA,CAAA;AACF,QAAO,IAAA,CAAA,cAAA;AAAA,UACR,OAAA,IAAA,CAAA;AAED,QAAA,kBAA2B,GAAA,cAAA,CAAA,QAAA,CAAA,CAAA,GAAA,GAAA,EAAA,CAAA,KAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAA,IAAA,CAAA,CAAA;AACzB,QAAmB,MAAA,SAAA,GAAA,CAAA,CAAA,GAAA,GAAmB,EAAA,CAAA,KAAA,KAAA,IAAA,GAAA,KAAe,CAAA,GAAA,GAAA,CAAA,IAAA,MAAA,iBAAA,CAAA;AAAA,QACvD,MAAA,SAAA,GAAA,CAAA,EAAA,GAAA,CAAA,GAAA,GAAA,WAAA,CAAA,KAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAA,OAAA,CAAA,IAAA,CAAA,CAAA,MAAA,KAAA;AACA,UAAA;AACE,UAAI,OAAc,MAAA,CAAA,IAAA,MAAS,CAAG,GAAO,GAAA,EAAA,CAAA,KAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAA,IAAA,CAAA,CAAA;AACrC,SAAO,CAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAA,CAAA;AAAA,QACT,OAAA,YAAA,IAAA,CAAA,SAAA,IAAA,SAAA,CAAA;AACA,OAAA,CAAA,CAAA,IAAS,WAAgB,WAAA,CAAA,KAAA,CAAA,OAAA,CAAA,SAAA,CAAA,CAAA,EAAA,KAAA;AACvB,QAAO,IAAA,GAAA,CAAA;AAAqB,QAC9B,OAAA,EAAA,CAAA,IAAA,MAAA,CAAA,GAAA,GAAA,CAAA,CAAA,KAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAA,IAAA,CAAA,CAAA;AACA,OAAS,CAAA,GAAA,WAAA,CAAU,KAAc,CAAA,OAAA,CAAA,SAAA,CAAU,CAAM,EAAA,KAAA;AAC/C,QAAI,IAAA,GAAA,CAAA;AACJ,QAAA,OAAkB,EAAA,CAAA,IAAA,MAAA,CAAA,GAAA,GAAc,CAAA,CAAA,KAAI,KAAU,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAA,IAAA,CAAA,CAAA;AAC9C,OAAO,CAAA,CAAA,CAAA;AAAA,MACT,OAAA,GAAA,CAAA;AAEA,KAAA,CAAA,CAAA;AACE,IAAA,MAAA;AACE,MAAA,IAAA,GAAA,EAAA,GAAA,EAAY;AACZ,MAAA,CAAA,GAAA,GAAA,CAAA,GAAA,UAA2B,iBAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,iBAAA,CAAA,KAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAA,SAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAA,WAAA,CAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAA,IAAA,CAAA,GAAA,CAAA,CAAA;AAAA,KAAA,CAC7B;AAAC,IACH,SAAA,WAAA,CAAA,IAAA,EAAA;AAKA,MAAA,IAAM,aAAU,CAAA,IAAA,CAAA,IAAA,CAAA;AAAA,QACZ,OAAa,KAAA,CAAA;AAA+C,MAC9D,OAAO,IAAQ,CAAA;AAA+C,KAC9D;AAA6D,IAC/D,SAAA,SAAA,CAAA,IAAA,EAAA;AAEA,MAAM,OAAA,WAA+C,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA;AACrD,KAAA;AAAmB,IACjB,kBAAmB,CAAA,YAAW,EAAA,QAAe,EAAA,IAAA,EAAA;AAAQ,MACvD,IAAA,IAAA,KAAA,OAAA;AACA,QAAA;AACA,MAAM,IAAA,aAAA,CAAA,aAA8B,CAAA,IAAA,CAAA;AACpC,QAAM,OAAA,KAAA,CAAA;AACJ,MAAA,WAAsB,CAAA;AACpB,KAAA;AAA2B,IAC7B,SAAA,YAAwB,GAAA;AACtB,MAAA,OAAW,CAAA,wDAAmC,EAAA,YAAA;AAE9C,QAAA,iBAAkB,CAAA,KAAA,EAAA,CAAA;AAAA,QAChB,SAAY,CAAA,OAAA,CAAA,4CAAU,CAAA,CAAA;AAAA,OACtB,CAAA,CAAA;AAAsD,KAAA;AACvD,IAAA,MACI,OAAA,GAAA;AACL,MAAM,EAAA,GAAA,EAAA,iBAA6C,EAAA,CAAA,EAAA,GAAA,KAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,KAAA,CAAA,UAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,EAAA,IAAA,EAAA,cAAA,EAAA;AAAA,MACrD,EAAA,GAAA,EAAA,MAAA,EAAA,SAAA,EAAA,CAAA,EAAA,GAAA,KAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,KAAA,CAAA,UAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,EAAA,IAAA,EAAA,cAAA,EAAA;AAAA,MACF,EAAA,GAAA,EAAA,KAAA,EAAA,SAAA,EAAA,CAAA,EAAA,GAAA,KAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,KAAA,CAAA,UAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,EAAA,IAAA,EAAA,cAAA,EAAA;AACA,KAAM,CAAA;AACJ,IAAA,MAAA,MAAe,GAAA,GAAA,CAAA,MAAA,CAAA,CAAA;AACf,IAAA,MAAA,UAAkB,GAAA,QAAA,CAAA,MAAA;AAClB,MAAA,IAAA,GAAA,CAAA;AAAuB,MACzB,OAAA,CAAA,GAAA,GAAA,OAAA,CAAA,IAAA,CAAA,CAAA,EAAA,KAAA,EAAA,CAAA,GAAA,KAAA,MAAA,CAAA,KAAA,CAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAA,IAAA,CAAA;AACA,KAAA,CAAA,CAAA;AACE,IAAA,MAAA,SAAe,GAAA,GAAA,EAAA,CAAA;AACf,IAAA,MAAA,kBAAwB,GAAA,GAAA,CAAA,KAAA,CAAA,CAAA;AACxB,IAAA,MAAA,gBAAsB,GAAA,CAAA,IAAA,KAAA;AAAA,MACxB,IAAA,GAAA,CAAA;AACA,MAAA,IAAM,kBAAkB;AAAC,QACvB,kBAAA,CAAA,KAAA,GAAA,IAAA,CAAA;AAAA,OACA,MAAA,IAAA,KAAA,CAAA,KAAA,EAAA;AAAA,QAII,IAAA,QAAA,CAAA,GAAA,GAAA,KAAA,CAAA,MAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAA,IAAA,CAAA,KAAA,UAAA;AACJ,UAAA,OAAe;AACf,QAAA,KAAA,CAAA,MAAkB,CAAA,IAAA,CAAA;AAClB,UAAI,YAAY,KAAQ,CAAA,IAAA,CAAA;AACtB,UAAA,MAAA,EAAA,IAAA,KAAuB,KAAA,GAAA,EAAA,EAAA,EAAA,SAAA,CAAA,KAAA,CAAA,EAAA,EAAA,GAAA,KAAA,CAAA;AAAA,SACzB,CAAA,CAAA;AACE,OAAA,MAAA;AAAiB,QACnB,MAAA,IAAA,KAAA,CAAA,mCAAA,CAAA,CAAA;AAAA,OACF;AAIA,KAAA,CAAA;AACA,IAAM,MAAA,OAAA,GAAA,CAAA,GAAA;AACJ,MAAA,MAAM,CAAA,KAAA,GAAS,MAAQ,CAAA;AACrB,MAAI,SAAA,CAAA,KAAA,GAAA,GAAA,CAAA;AACF,MAAM,gBAAA,CAAA,MAAoB,CAAA,CAAA;AAG1B,KAAA,CAAA;AACE,IAAA,MAAA,GAAA,SAAY;AACZ,MAAA,MAAA,CAAA,KAAA,GAAA,KAAA,CAAA;AAAA,MACF,SAAA,CAAA,KAAA,GAAA,KAAA,CAAA,WAAA,GAAA,IAAA,KAAA,CAAA,WAAA,EAAA,GAAA,EAAA,CAAA;AAAA,MAAA,gBACc,CAAA,KAAA,CAAA,CAAA;AACd,KAAQ,CAAA;AACR,IAAA,MAAA,eAAY,GAAA,CAAA;AACZ,MAAA,GAAA;AAAA,MACF,OAAA;AAAA,KACF,KAAA;AACA,MAAK,IAAA,GAAA,EAAA,GAAA,CAAA;AAAmD,MAC1D,MAAA,CAAA,KAAA,GAAA,OAAA,OAAA,KAAA,QAAA,GAAA,OAAA,GAAA,OAAA,CAAA;AAIA,MAAA,SAAkB,CAAA,KAAA,GAAA,GAAA,CAAA;AAChB,MAAS,IAAA,OAAA,KAAA,MAAA,EAAA;AAAA,QACX,gBAAA,CAAA,MAAA,CAAA,CAAA;AACA,OAAA,MAAA,IAAgB,OAAA,KAAA,QAAA,EAAA;AACd,QAAmB,CAAA,GAAA,GAAA,CAAA,GAAA,GAAA,KAAA,CAAA,GAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAA,GAAA,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAA,IAAA,CAAA,GAAA,CAAA,CAAA;AAAA,OACpB;AACD,KAAa,CAAA;AAAA,IACX,MAAA,UAAA,GAAA,GAAA,EAAA,CAAA;AAAA,IACA,MAAA,eAAA,GAAA,OAAA,CAAA,KAAA;AAAA,MACA,IAAA,GAAA,EAAA,GAAA,EAAA,GAAA,EAAA,EAAA,CAAA;AAAA,MACA,IAAA,CAAA,CAAA,IAAA,KAAA,IAAA,IAAA,CAAA,CAAA,IAAA,KAAA,SAAA,EAAA;AAAA,QACD,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}