@apia/dashboard-controller 2.0.11 → 3.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +414 -23
- package/dist/index.js +2238 -22
- package/dist/index.js.map +1 -1
- package/package.json +8 -8
- package/dist/actions/basicAction.d.ts +0 -15
- package/dist/actions/basicAction.d.ts.map +0 -1
- package/dist/actions/basicAction.js +0 -40
- package/dist/actions/basicAction.js.map +0 -1
- package/dist/actions/externalFirePanelAction.d.ts +0 -6
- package/dist/actions/externalFirePanelAction.d.ts.map +0 -1
- package/dist/actions/externalFirePanelAction.js +0 -12
- package/dist/actions/externalFirePanelAction.js.map +0 -1
- package/dist/actions/firePanelAction.d.ts +0 -6
- package/dist/actions/firePanelAction.d.ts.map +0 -1
- package/dist/actions/firePanelAction.js +0 -75
- package/dist/actions/firePanelAction.js.map +0 -1
- package/dist/actions/usePanelActions.d.ts +0 -63
- package/dist/actions/usePanelActions.d.ts.map +0 -1
- package/dist/actions/usePanelActions.js +0 -55
- package/dist/actions/usePanelActions.js.map +0 -1
- package/dist/actions/usePanelIsLoading.d.ts +0 -4
- package/dist/actions/usePanelIsLoading.d.ts.map +0 -1
- package/dist/actions/usePanelIsLoading.js +0 -14
- package/dist/actions/usePanelIsLoading.js.map +0 -1
- package/dist/actions/usePanelNetworkState.d.ts +0 -8
- package/dist/actions/usePanelNetworkState.d.ts.map +0 -1
- package/dist/actions/usePanelNetworkState.js +0 -21
- package/dist/actions/usePanelNetworkState.js.map +0 -1
- package/dist/common/usePanelIdentity.d.ts +0 -10
- package/dist/common/usePanelIdentity.d.ts.map +0 -1
- package/dist/common/usePanelIdentity.js +0 -12
- package/dist/common/usePanelIdentity.js.map +0 -1
- package/dist/config/parametersStore.d.ts +0 -15
- package/dist/config/parametersStore.d.ts.map +0 -1
- package/dist/config/parametersStore.js +0 -25
- package/dist/config/parametersStore.js.map +0 -1
- package/dist/config/saveParameters.d.ts +0 -11
- package/dist/config/saveParameters.d.ts.map +0 -1
- package/dist/config/saveParameters.js +0 -16
- package/dist/config/saveParameters.js.map +0 -1
- package/dist/config/usePanelConfig.js +0 -22
- package/dist/config/usePanelConfig.js.map +0 -1
- package/dist/config/usePanelParametersSelector.d.ts +0 -25
- package/dist/config/usePanelParametersSelector.d.ts.map +0 -1
- package/dist/config/usePanelParametersSelector.js +0 -17
- package/dist/config/usePanelParametersSelector.js.map +0 -1
- package/dist/dashboard/DashboardContext.d.ts +0 -6
- package/dist/dashboard/DashboardContext.d.ts.map +0 -1
- package/dist/dashboard/DashboardContext.js +0 -12
- package/dist/dashboard/DashboardContext.js.map +0 -1
- package/dist/dashboard/DashboardPanel.d.ts +0 -45
- package/dist/dashboard/DashboardPanel.d.ts.map +0 -1
- package/dist/dashboard/DashboardPanel.js +0 -236
- package/dist/dashboard/DashboardPanel.js.map +0 -1
- package/dist/dashboard/DashboardPanelContext.d.ts +0 -6
- package/dist/dashboard/DashboardPanelContext.d.ts.map +0 -1
- package/dist/dashboard/DashboardPanelContext.js +0 -12
- package/dist/dashboard/DashboardPanelContext.js.map +0 -1
- package/dist/dashboard/DashboardPanelsBootstraper.d.ts +0 -33
- package/dist/dashboard/DashboardPanelsBootstraper.d.ts.map +0 -1
- package/dist/dashboard/DashboardPanelsBootstraper.js +0 -135
- package/dist/dashboard/DashboardPanelsBootstraper.js.map +0 -1
- package/dist/dashboard/DashboardRouter.d.ts +0 -30
- package/dist/dashboard/DashboardRouter.d.ts.map +0 -1
- package/dist/dashboard/DashboardRouter.js +0 -74
- package/dist/dashboard/DashboardRouter.js.map +0 -1
- package/dist/dashboard/PanelNotFound.js +0 -14
- package/dist/dashboard/PanelNotFound.js.map +0 -1
- package/dist/dashboard/dashboard.d.ts +0 -26
- package/dist/dashboard/dashboard.d.ts.map +0 -1
- package/dist/dashboard/dashboard.js +0 -167
- package/dist/dashboard/dashboard.js.map +0 -1
- package/dist/eventsController/eventsController.d.ts +0 -11
- package/dist/eventsController/eventsController.d.ts.map +0 -1
- package/dist/eventsController/eventsController.js +0 -57
- package/dist/eventsController/eventsController.js.map +0 -1
- package/dist/eventsController/types.d.ts +0 -21
- package/dist/eventsController/types.d.ts.map +0 -1
- package/dist/eventsController/usePanelFireEvent.d.ts +0 -13
- package/dist/eventsController/usePanelFireEvent.d.ts.map +0 -1
- package/dist/eventsController/usePanelFireEvent.js +0 -21
- package/dist/eventsController/usePanelFireEvent.js.map +0 -1
- package/dist/eventsController/usePanelOnEvent.d.ts +0 -12
- package/dist/eventsController/usePanelOnEvent.d.ts.map +0 -1
- package/dist/eventsController/usePanelOnEvent.js +0 -14
- package/dist/eventsController/usePanelOnEvent.js.map +0 -1
- package/dist/panelsStore/createPanelStore.d.ts +0 -16
- package/dist/panelsStore/createPanelStore.d.ts.map +0 -1
- package/dist/panelsStore/createPanelStore.js +0 -58
- package/dist/panelsStore/createPanelStore.js.map +0 -1
- package/dist/panelsStore/panelsStore.js +0 -59
- package/dist/panelsStore/panelsStore.js.map +0 -1
- package/dist/panelsStore/usePanelSelector.js +0 -32
- package/dist/panelsStore/usePanelSelector.js.map +0 -1
- package/dist/panelsUtil/usePanelChangeTitle.d.ts +0 -5
- package/dist/panelsUtil/usePanelChangeTitle.d.ts.map +0 -1
- package/dist/panelsUtil/usePanelChangeTitle.js +0 -23
- package/dist/panelsUtil/usePanelChangeTitle.js.map +0 -1
- package/dist/panelsUtil/usePanelTitleAction.js +0 -34
- package/dist/panelsUtil/usePanelTitleAction.js.map +0 -1
- package/dist/position/usePanelPosition.d.ts +0 -13
- package/dist/position/usePanelPosition.d.ts.map +0 -1
- package/dist/position/usePanelPosition.js +0 -40
- package/dist/position/usePanelPosition.js.map +0 -1
- package/dist/splash/events/Dragleave.js +0 -15
- package/dist/splash/events/Dragleave.js.map +0 -1
- package/dist/splash/events/Dragover.js +0 -120
- package/dist/splash/events/Dragover.js.map +0 -1
- package/dist/splash/events/Dragstart.js +0 -65
- package/dist/splash/events/Dragstart.js.map +0 -1
- package/dist/splash/events/Drop.js +0 -60
- package/dist/splash/events/Drop.js.map +0 -1
- package/dist/splash/panels/DefaultPanelWrapper/NetworkState.js +0 -28
- package/dist/splash/panels/DefaultPanelWrapper/NetworkState.js.map +0 -1
- package/dist/splash/panels/DefaultPanelWrapper/PanelButtons.js +0 -16
- package/dist/splash/panels/DefaultPanelWrapper/PanelButtons.js.map +0 -1
- package/dist/splash/panels/DefaultPanelWrapper/RefreshButton.js +0 -35
- package/dist/splash/panels/DefaultPanelWrapper/RefreshButton.js.map +0 -1
- package/dist/splash/panels/DefaultPanelWrapper/SettingsButton.js +0 -45
- package/dist/splash/panels/DefaultPanelWrapper/SettingsButton.js.map +0 -1
- package/dist/splash/panels/DefaultPanelWrapper/defaultPanelWrapperStyles.js +0 -103
- package/dist/splash/panels/DefaultPanelWrapper/defaultPanelWrapperStyles.js.map +0 -1
- package/dist/splash/panels/DefaultPanelWrapper/index.js +0 -57
- package/dist/splash/panels/DefaultPanelWrapper/index.js.map +0 -1
- package/dist/splash/panels/LandingPagePanelWrapper.d.ts +0 -6
- package/dist/splash/panels/LandingPagePanelWrapper.d.ts.map +0 -1
- package/dist/splash/panels/LandingPagePanelWrapper.js +0 -52
- package/dist/splash/panels/LandingPagePanelWrapper.js.map +0 -1
- package/dist/splash/panels/PanelContext/PanelFooter.js +0 -71
- package/dist/splash/panels/PanelContext/PanelFooter.js.map +0 -1
- package/dist/splash/panels/PanelContext/index.d.ts +0 -31
- package/dist/splash/panels/PanelContext/index.d.ts.map +0 -1
- package/dist/splash/panels/PanelContext/index.js +0 -69
- package/dist/splash/panels/PanelContext/index.js.map +0 -1
- package/dist/splash/panels/PanelContext/usePanelContextLayout.d.ts +0 -6
- package/dist/splash/panels/PanelContext/usePanelContextLayout.d.ts.map +0 -1
- package/dist/splash/panels/PanelContext/usePanelContextLayout.js +0 -38
- package/dist/splash/panels/PanelContext/usePanelContextLayout.js.map +0 -1
- package/dist/splash/panels/PanelContext/usePanelFooter.js +0 -38
- package/dist/splash/panels/PanelContext/usePanelFooter.js.map +0 -1
- package/dist/splash/panels/PanelContext/useYieldPanelIsReady.d.ts +0 -45
- package/dist/splash/panels/PanelContext/useYieldPanelIsReady.d.ts.map +0 -1
- package/dist/splash/panels/PanelContext/useYieldPanelIsReady.js +0 -12
- package/dist/splash/panels/PanelContext/useYieldPanelIsReady.js.map +0 -1
- package/dist/splash/panels/PanelErrorBoundary.js +0 -53
- package/dist/splash/panels/PanelErrorBoundary.js.map +0 -1
- package/dist/splash/panels/PanelIdentifier.d.ts +0 -16
- package/dist/splash/panels/PanelIdentifier.d.ts.map +0 -1
- package/dist/splash/panels/PanelIdentifier.js +0 -19
- package/dist/splash/panels/PanelIdentifier.js.map +0 -1
- package/dist/splash/util/DragAndDrop.js +0 -243
- package/dist/splash/util/DragAndDrop.js.map +0 -1
- package/dist/splash/util/getColumnAreas.js +0 -19
- package/dist/splash/util/getColumnAreas.js.map +0 -1
- package/dist/splash/util/isCursorInArea.js +0 -13
- package/dist/splash/util/isCursorInArea.js.map +0 -1
- package/dist/types.d.ts +0 -27
- package/dist/types.d.ts.map +0 -1
- package/dist/util.d.ts +0 -8
- package/dist/util.d.ts.map +0 -1
- package/dist/util.js +0 -29
- package/dist/util.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/splash/panels/PanelIdentifier.tsx","../src/common/usePanelIdentity.ts","../src/position/usePanelPosition.ts","../src/dashboard/DashboardPanelContext.tsx","../src/actions/usePanelActions.ts","../src/actions/usePanelNetworkState.ts","../src/eventsController/eventsController.ts","../src/eventsController/usePanelFireEvent.ts","../src/eventsController/usePanelOnEvent.ts","../src/panelsUtil/usePanelChangeTitle.ts","../src/splash/panels/PanelContext/usePanelFooter.tsx","../src/config/parametersStore.ts","../src/config/saveParameters.ts","../src/dashboard/DashboardContext.tsx","../src/splash/panels/DefaultPanelWrapper/defaultPanelWrapperStyles.ts","../src/splash/panels/DefaultPanelWrapper/RefreshButton.tsx","../src/config/usePanelConfig.ts","../src/splash/panels/DefaultPanelWrapper/SettingsButton.tsx","../src/splash/panels/DefaultPanelWrapper/PanelButtons.tsx","../src/splash/panels/PanelContext/usePanelContextLayout.ts","../src/splash/panels/PanelContext/useYieldPanelIsReady.ts","../src/splash/panels/PanelContext/index.tsx","../src/splash/panels/PanelContext/PanelFooter.tsx","../src/splash/panels/DefaultPanelWrapper/index.tsx","../src/dashboard/DashboardPanelsBootstraper.tsx","../src/dashboard/PanelNotFound.tsx","../src/util.ts","../src/splash/panels/PanelErrorBoundary.tsx","../src/dashboard/DashboardPanel.tsx","../src/splash/events/Dragleave.ts","../src/splash/util/isCursorInArea.ts","../src/splash/util/getColumnAreas.ts","../src/splash/events/Dragover.ts","../src/splash/events/Dragstart.ts","../src/splash/events/Drop.ts","../src/splash/util/DragAndDrop.ts","../src/dashboard/DashboardRouter.tsx","../src/dashboard/dashboard.tsx","../src/config/usePanelParametersSelector.ts","../src/panelsUtil/usePanelTitleAction.ts","../src/actions/firePanelAction.ts","../src/actions/basicAction.ts","../src/actions/externalFirePanelAction.ts","../src/actions/usePanelIsLoading.ts","../src/splash/panels/DefaultPanelWrapper/NetworkState.tsx","../src/splash/panels/LandingPagePanelWrapper.tsx","../src/panelsStore/panelsStore.ts","../src/panelsStore/usePanelSelector.ts","../src/panelsStore/createPanelStore.ts"],"sourcesContent":["import { ReactNode, createContext, useMemo } from 'react';\r\nimport { TPanelIdentifier } from '../../eventsController/types';\r\n\r\nexport const PanelIdentifierContext = createContext<\r\n TPanelIdentifier | undefined\r\n>(undefined);\r\n\r\nexport interface TPanelIdentifierProps {\r\n children: ReactNode;\r\n id: string;\r\n name: string;\r\n title: string;\r\n type: string;\r\n}\r\n\r\nexport const PanelIdentifier = ({\r\n children,\r\n name,\r\n id,\r\n title,\r\n type,\r\n}: TPanelIdentifierProps) => {\r\n const contextValue: TPanelIdentifier = useMemo(() => {\r\n return { panelName: name, panelId: id, panelTitle: title, panelType: type };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <PanelIdentifierContext.Provider value={contextValue}>\r\n {children}\r\n </PanelIdentifierContext.Provider>\r\n );\r\n};\r\n","import { useContext } from 'react';\r\nimport { PanelIdentifierContext } from '../splash/panels/PanelIdentifier';\r\n\r\n/**\r\n * Permite acceder a la identidad del panel actual.\r\n */\r\nexport function usePanelIdentity() {\r\n const context = useContext(PanelIdentifierContext);\r\n\r\n if (!context)\r\n throw new Error('Trying to access an unexistent PanelIdentifierContext');\r\n\r\n return context;\r\n}\r\n","import { ApiaApi, makeApiaUrl } from '@apia/api';\r\nimport { EventEmitter, TId } from '@apia/util';\r\nimport { usePanelIdentity } from '../common';\r\nimport { useEffect, useState } from 'react';\r\n\r\nclass PanelPositionEmitter extends EventEmitter<{\r\n panelUpdate: {\r\n panelId: TId;\r\n containerId: TId;\r\n newPosition: number;\r\n };\r\n}> {}\r\n\r\nexport const panelPositionEmitter = new PanelPositionEmitter();\r\n\r\n/**\r\n * Permite conocer la posición del panel, se actualiza automáticamente cuando\r\n * ésta cambia provocando un renderizado en el padre\r\n */\r\nexport function usePanelPosition() {\r\n const { panelId } = usePanelIdentity();\r\n\r\n const [position, setPosition] = useState<{\r\n containerId: TId;\r\n position: number;\r\n }>();\r\n\r\n useEffect(() => {\r\n return panelPositionEmitter.on('panelUpdate', (ev) => {\r\n if (ev.panelId === panelId)\r\n setPosition({ containerId: ev.containerId, position: ev.newPosition });\r\n });\r\n }, [panelId]);\r\n\r\n return position;\r\n}\r\n\r\nexport async function updatePanelPosition(\r\n panelId: TId,\r\n containerId: TId,\r\n newPosition: number,\r\n) {\r\n const result = await ApiaApi.post(\r\n makeApiaUrl({\r\n action: 'panelMove',\r\n pnlId: panelId,\r\n containerId,\r\n newPosition,\r\n }),\r\n );\r\n\r\n const hasUpdated = result?.data && !result.hasError && !result.hasMessages;\r\n\r\n if (hasUpdated)\r\n panelPositionEmitter.emit('panelUpdate', {\r\n panelId,\r\n containerId,\r\n newPosition,\r\n });\r\n\r\n return hasUpdated;\r\n}\r\n\r\nexport function useUpdatePanelPosition() {\r\n const { panelId } = usePanelIdentity();\r\n return async function updatePosition(containerId: TId, newPosition: number) {\r\n return updatePanelPosition(panelId, containerId, newPosition);\r\n };\r\n}\r\n","import { createContext, useContext } from 'react';\r\nimport { DashboardPanel } from './DashboardPanel';\r\n\r\nexport const DashboardPanelContext = createContext<DashboardPanel | null>(null);\r\n\r\nexport function useDashboardPanel() {\r\n const context = useContext(DashboardPanelContext);\r\n\r\n if (!context) throw new Error('There is no DashboardPanelContext');\r\n\r\n return context;\r\n}\r\n","import { TApiaApiResult, IApiaApiRequestConfig } from '@apia/api';\r\nimport { useMount } from '@apia/util';\r\nimport { usePanelIdentity } from '../common';\r\nimport { TPanelId } from '../types';\r\nimport { TOnSucceed } from './firePanelAction';\r\nimport { TBasicAction } from './basicAction';\r\nimport { useDashboardPanel } from '../dashboard/DashboardPanelContext';\r\n\r\ntype TActionListener = (result: {\r\n action: string;\r\n data: TActionResult;\r\n panelId: TPanelId;\r\n}) => unknown;\r\n\r\nexport const panelActionsEmitter = new (class PanelActionsEmitter {\r\n listeners: Record<TPanelId, Record<string, TActionListener[]>> = {};\r\n\r\n on = (panelId: TPanelId, action: string, cb: TActionListener) => {\r\n if (!this.listeners[panelId]) this.listeners[panelId] = {};\r\n if (!this.listeners[panelId][action]) this.listeners[panelId][action] = [];\r\n\r\n this.listeners[panelId][action].push(cb);\r\n\r\n return () => {\r\n this.listeners[panelId][action] = this.listeners[panelId][action].filter(\r\n (current) => current !== cb,\r\n );\r\n };\r\n };\r\n\r\n emit = (panelId: TPanelId, action: string, data: TActionResult) => {\r\n this.listeners[panelId]?.[action]?.forEach((current) => {\r\n window.requestAnimationFrame(() => {\r\n current({ action, panelId, data });\r\n });\r\n });\r\n };\r\n})();\r\n\r\nexport type TFooter = TBasicAction;\r\n\r\nexport type TCommonActionResult = { title: string; footer: TFooter };\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport type TActionResult<T = any> = null | NonNullable<\r\n Awaited<\r\n TApiaApiResult<\r\n T extends Record<string, unknown> ? T & TCommonActionResult : T\r\n >\r\n >\r\n>;\r\n\r\nexport type TActionDispatcherOptions = {\r\n onComplete?: TOnSucceed;\r\n requestConfig?: IApiaApiRequestConfig<object>;\r\n};\r\n\r\nexport type TExternalActionDispatcher = (\r\n panelId: string,\r\n { action, ...parameters }: { action: string } & Record<string, unknown>,\r\n options?: TActionDispatcherOptions,\r\n) => void;\r\n\r\nexport type TActionDispatcher = (\r\n { action, ...parameters }: { action: string } & Record<string, unknown>,\r\n options?: TActionDispatcherOptions,\r\n) => Promise<TActionResult>;\r\n\r\nexport type TActionHandler = (result: TActionResult) => unknown;\r\n\r\n/**\r\n * El hook usePanelActions es el método principal de comunicación entre el\r\n * módulo cliente y el módulo server de un panel.\r\n *\r\n * Acepta un actionsHandler y devuelve un actionDispatcher.\r\n *\r\n * **Existe la acción refresh** que será llamada automáticamente cada vez que\r\n * se guarde la configuración del panel o se haga click en el botón refrescar\r\n * del mismo.\r\n *\r\n * @param actionsHandler Es un objeto de tipo clave-valor en donde cada clave debe corresponderse con una acción que puede ser ejecutada en el panel. El valor debe ser una función que recibe la respuesta del servidor a la ejecución de la acción.\r\n *\r\n * @returns Un método actionDispatcher que permite ejecutar acciones para ser procesadas por la contraparte del panel en el servidor. Al ser llamado acepta un objeto que debe tener como mínimo la propiedad action: string, que indica qué acción será ejecutada. Acepta opcionalmente cualquier cantidad adicional de propiedades en el objeto.\r\n *\r\n * @example\r\n *\r\n const dispatch = usePanelActions({\r\n refresh() {\r\n console.log('Refresh');\r\n },\r\n revert(response: TActionResult<TApiaLoadText>) {\r\n if (response?.data?.text.label !== undefined)\r\n setLabel(response?.data?.text.label);\r\n },\r\n });\r\n\r\n return <Button\r\n onClick={() => {\r\n dispatch({\r\n action: 'revert',\r\n text: (document.getElementById('Text') as\r\n HTMLInputElement).value,\r\n });\r\n }}\r\n >\r\n Revert\r\n </Button>\r\n */\r\nexport function usePanelActions(\r\n actionsHandler?: Record<string, TActionHandler>,\r\n) {\r\n const { panelId } = usePanelIdentity();\r\n\r\n useMount(() => {\r\n const subscriptions: (() => unknown)[] = [];\r\n\r\n Object.entries(actionsHandler ?? {}).forEach(([action, handler]) => {\r\n subscriptions.push(\r\n panelActionsEmitter.on(panelId, action, (res) => {\r\n handler(res.data);\r\n }),\r\n );\r\n });\r\n\r\n return () => {\r\n subscriptions.forEach((unsubscribe) => unsubscribe());\r\n };\r\n });\r\n\r\n const panel = useDashboardPanel();\r\n\r\n return panel.fireAction as TActionDispatcher;\r\n}\r\n","import { useEffect, useState } from 'react';\r\nimport { EventEmitter, TId } from '@apia/util';\r\nimport { usePanelIdentity } from '../common';\r\n\r\nclass PanelNetworkStateEmitter extends EventEmitter<{\r\n stateChange: {\r\n panelId: TId;\r\n isConnected: boolean;\r\n };\r\n}> {}\r\n\r\nexport const panelNetworkStateEmitter = new PanelNetworkStateEmitter();\r\n\r\n/**\r\n * Permite saber en todo momento si el panel actual tuvo un error en su\r\n * conexión de red\r\n */\r\nexport const usePanelNetworkState = () => {\r\n const [isConnected, setIsConnected] = useState(true);\r\n\r\n const { panelId } = usePanelIdentity();\r\n\r\n useEffect(() => {\r\n return panelNetworkStateEmitter.on('stateChange', (ev) => {\r\n if (ev.panelId === panelId && ev.isConnected !== isConnected)\r\n setIsConnected(ev.isConnected);\r\n });\r\n }, [isConnected, panelId]);\r\n\r\n return isConnected;\r\n};\r\n","/* eslint-disable @typescript-eslint/no-unsafe-assignment */\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport {\r\n TPanelEventCallback,\r\n TPanelEventIdentifier,\r\n TPanelEventRegister,\r\n TPanelIdentifier,\r\n} from './types';\r\n\r\nfunction identifierAfitsOnB(\r\n a: Partial<TPanelEventIdentifier>,\r\n b: TPanelEventIdentifier,\r\n) {\r\n // eslint-disable-next-line no-restricted-syntax, @typescript-eslint/no-for-in-array\r\n for (const key of Object.keys(a)) {\r\n if (\r\n a[key as keyof Partial<TPanelIdentifier>] !==\r\n b[key as keyof TPanelIdentifier]\r\n )\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport const eventsController = new (class EventsController {\r\n callbacks: TPanelEventRegister<any>[] = [];\r\n\r\n broadcast(eventType: string, payload: any) {\r\n const origin: TPanelIdentifier = {\r\n panelId: 'broadcast',\r\n panelName: 'broadcast',\r\n panelType: 'broadcast',\r\n panelTitle: 'broadcast',\r\n };\r\n\r\n this.callbacks.forEach(({ callback, ...current }) => {\r\n if (eventType === current.eventType) {\r\n callback({ ...origin, eventType, payload });\r\n }\r\n });\r\n }\r\n\r\n fireEvent(origin: TPanelIdentifier, eventType: string, payload: any) {\r\n if ([origin.panelId, origin.panelName, origin.panelType].includes('*'))\r\n throw new Error(\r\n 'Broadcast is not allowed through fireEvent, use broadcast instead',\r\n );\r\n\r\n this.callbacks.forEach(({ callback, ...current }) => {\r\n if (identifierAfitsOnB(current, { ...origin, eventType })) {\r\n callback({ ...origin, eventType, payload });\r\n }\r\n });\r\n }\r\n\r\n onEvent<PayloadEvent>(\r\n distinction: Partial<TPanelEventIdentifier>,\r\n callback: TPanelEventCallback<PayloadEvent>,\r\n ) {\r\n const register: TPanelEventRegister<PayloadEvent> = {\r\n ...distinction,\r\n callback,\r\n };\r\n\r\n this.callbacks.push(register);\r\n\r\n return () => {\r\n this.callbacks = this.callbacks.filter((current) => {\r\n return current !== register;\r\n });\r\n };\r\n }\r\n})();\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport { useCallback } from 'react';\r\nimport { eventsController } from './eventsController';\r\nimport { usePanelIdentity } from '../common/usePanelIdentity';\r\n\r\n/**\r\n * Este hook devuelve un método que puede ser llamado para emitir un evento en\r\n * el panel desde el cual es llamado. Los eventos de panel son emitidos con id\r\n * de panel, tipo de panel, nombre de panel y tipo de evento y las suscripciones\r\n * pueden ser realizadas a un conjunto arbitrario de estos identificadores.\r\n *\r\n * El segundo parámetro del método fireEvent devuelto es el payload, que puede\r\n * ser de cualquier tipo.\r\n */\r\nexport function usePanelFireEvent() {\r\n const { panelId, panelName, panelType, panelTitle } = usePanelIdentity();\r\n\r\n const fireEvent = useCallback(\r\n (eventType: string, payload: any) => {\r\n eventsController.fireEvent(\r\n { panelId, panelName, panelType, panelTitle },\r\n eventType,\r\n payload,\r\n );\r\n },\r\n [panelId, panelName, panelType, panelTitle],\r\n );\r\n\r\n return fireEvent;\r\n}\r\n","import { useEffect } from 'react';\r\nimport { eventsController } from './eventsController';\r\nimport { TPanelEventIdentifier, TPanelEventCallback } from './types';\r\n\r\n/**\r\n * Este hook permite realizar suscripciones a eventos de paneles. Deberá ser\r\n * llamado una vez por cada suscripción que desee hacerse dentro de un panel y\r\n * no se deberán ejecutar acciones para romper las suscripciones hechas, ya que\r\n * este hook maneja esa lógica de forma automática.\r\n */\r\nexport function usePanelOnEvent<PayloadEvent>(\r\n distinction: Partial<TPanelEventIdentifier>,\r\n callback: TPanelEventCallback<PayloadEvent>,\r\n) {\r\n useEffect(() => {\r\n const unsuscriber = eventsController.onEvent(distinction, callback);\r\n\r\n return () => {\r\n unsuscriber();\r\n };\r\n });\r\n}\r\n","import { useCallback } from 'react';\r\nimport {\r\n TPanelIdentifier,\r\n eventsController,\r\n usePanelFireEvent,\r\n} from '../eventsController';\r\n\r\nexport function changePanelTitle(panelId: string, newTitle: string) {\r\n eventsController.fireEvent(\r\n { panelId } as TPanelIdentifier,\r\n 'changeTitle',\r\n newTitle,\r\n );\r\n}\r\n\r\nexport function usePanelChangeTitle() {\r\n const fireEvent = usePanelFireEvent();\r\n\r\n return useCallback(\r\n (newTitle: string) => {\r\n fireEvent('changeTitle', newTitle);\r\n },\r\n [fireEvent],\r\n );\r\n}\r\n","import {\r\n KeyboardEvent,\r\n MouseEvent,\r\n ReactNode,\r\n useCallback,\r\n useState,\r\n} from 'react';\r\nimport {\r\n TPanelEvent,\r\n TPanelIdentifier,\r\n eventsController,\r\n usePanelOnEvent,\r\n} from '../../../eventsController';\r\nimport { TFooter } from '../../../actions/usePanelActions';\r\nimport { handleAction } from '../../../actions/basicAction';\r\n\r\nexport function changePanelFooter(panelId: string, footer: TFooter | null) {\r\n eventsController.fireEvent(\r\n { panelId } as TPanelIdentifier,\r\n 'changeFooter',\r\n footer,\r\n );\r\n}\r\n\r\nexport type TUsePanelFooter = {\r\n footerContent?: ReactNode;\r\n footer: TFooter | null;\r\n handleFooterClick: (ev: MouseEvent | KeyboardEvent) => void;\r\n};\r\n\r\nexport function usePanelFooter(\r\n panelId: string,\r\n { initialData }: { initialData: unknown },\r\n): TUsePanelFooter {\r\n const [footer, setFooter] = useState<TFooter | null>(\r\n (initialData as { footer: { footer: TFooter } })?.footer?.footer?.text\r\n ? (initialData as { footer: { footer: TFooter } })?.footer?.footer\r\n : null,\r\n );\r\n\r\n const handleFooterClick = useCallback(\r\n (ev: MouseEvent | KeyboardEvent) => {\r\n console.log(ev.type);\r\n if (footer) handleAction(panelId, ev, footer);\r\n },\r\n [footer, panelId],\r\n );\r\n\r\n usePanelOnEvent(\r\n { eventType: 'changeFooter', panelId },\r\n (ev: TPanelEvent<TFooter>) => {\r\n if (!ev.payload.text) setFooter(null);\r\n else setFooter(ev.payload);\r\n },\r\n );\r\n\r\n return { footer, handleFooterClick };\r\n}\r\n","import { createSlice, injectReducers, PayloadAction } from '@apia/store';\r\nimport { TPanelId } from '../types';\r\n\r\nexport type TPanelParameter = string | number | boolean;\r\nexport type TParamsStore = Record<string, TPanelParameter>;\r\nexport type TParamsSlice = Record<string, TParamsStore>;\r\n\r\nconst paramsSlice = createSlice({\r\n initialState: {} as TParamsSlice,\r\n name: 'panelParameters',\r\n reducers: {\r\n udpate(\r\n state,\r\n {\r\n payload,\r\n }: PayloadAction<{\r\n panelId: TPanelId;\r\n parameters: TParamsStore;\r\n }>,\r\n ) {\r\n if (!state[payload.panelId]) state[payload.panelId] = {};\r\n\r\n state[payload.panelId] = {\r\n ...state[payload.panelId],\r\n ...payload.parameters,\r\n };\r\n },\r\n },\r\n});\r\n\r\nconst { store, useSelector } = injectReducers({\r\n panelParameters: paramsSlice.reducer,\r\n});\r\n\r\nexport { store as parametersStore, useSelector as useParametersSelector };\r\nexport const parametersActions = paramsSlice.actions;\r\n","import { firePanelAction } from '../actions/firePanelAction';\r\nimport { TActionResult, panelActionsEmitter } from '../actions/usePanelActions';\r\nimport { TPanelId } from '../types';\r\nimport {\r\n TParamsStore,\r\n parametersActions,\r\n parametersStore,\r\n} from './parametersStore';\r\n\r\n/**\r\n * Actualiza los parámetros de un panel a nivel de cliente. Este método se\r\n * expone con el único fin de ser llamado por la acción saveParams del api.\r\n */\r\nexport function saveParameters(\r\n panelId: TPanelId,\r\n parameters: TParamsStore,\r\n refresh = true,\r\n) {\r\n parametersStore.dispatch(parametersActions.udpate({ panelId, parameters }));\r\n if (refresh) {\r\n panelActionsEmitter.emit(panelId, 'configurationApply', {\r\n data: parameters,\r\n } as TActionResult);\r\n firePanelAction(panelId, 'refresh');\r\n }\r\n}\r\n","import { createContext, useContext } from 'react';\r\nimport { Dashboard } from './dashboard';\r\n\r\nexport const DashboardContext = createContext<Dashboard | null>(null);\r\n\r\nexport function useDashboardContext() {\r\n const context = useContext(DashboardContext);\r\n\r\n if (!context) throw new Error('There is no Dashboard context');\r\n\r\n return context;\r\n}\r\n","import {\r\n responsive,\r\n spacing,\r\n ThemeUICSSObject,\r\n getSpacingLayouts,\r\n} from '@apia/theme';\r\n\r\nexport const defaultPanelWrapperStyles: ThemeUICSSObject = {\r\n pb: spacing(6),\r\n\r\n '&:last-child': {\r\n pb: 0,\r\n },\r\n '.panel__container': {\r\n background: 'palette.background.paper',\r\n border: '1px solid',\r\n borderColor: 'palette.gray.800',\r\n display: 'flex',\r\n flexDirection: 'column',\r\n borderRadius: 'panel',\r\n boxShadow: 'panel',\r\n },\r\n\r\n '.panel__icon': {\r\n height: '24px',\r\n width: '24px',\r\n borderRadius: '100%',\r\n transform: 'scale(1.25)',\r\n marginRight: '6px',\r\n },\r\n\r\n '.panel__header': {\r\n alignItems: 'center',\r\n cursor: 'grab',\r\n display: 'flex',\r\n flexWrap: 'nowrap',\r\n fontWeight: 'bold',\r\n justifyContent: 'space-between',\r\n maxWidth: '100%',\r\n overflow: 'visible',\r\n backgroundColor: 'palette.secondary.light',\r\n borderBottomRightRadius: '0px !important',\r\n borderBottomLeftRadius: '0px !important',\r\n pl: 4,\r\n py: 4,\r\n\r\n borderRadius: 'panel',\r\n\r\n '.panel__header__left': {\r\n alignItems: 'center',\r\n display: 'flex',\r\n gap: 2,\r\n overflow: 'visible',\r\n\r\n svg: {\r\n color: 'palette.error.dark',\r\n },\r\n },\r\n\r\n '& > *': {\r\n flexShrink: 0,\r\n },\r\n\r\n '.panel__header__buttons': {\r\n alignSelf: 'end',\r\n display: 'flex',\r\n flexGrow: 1,\r\n fontWeight: 'normal',\r\n gap: 2,\r\n justifyContent: 'end',\r\n right: 0,\r\n background: 'transparent',\r\n pr: 3,\r\n opacity: responsive({ 0: 1, 3: 0 }),\r\n alignItems: 'center',\r\n pl: 3,\r\n height: '24px',\r\n button: {\r\n width: '30px',\r\n height: '30px',\r\n },\r\n },\r\n },\r\n\r\n '.panel__content': {\r\n ...getSpacingLayouts(),\r\n },\r\n\r\n '.panel__container:hover, .panel__container:focus, .panel__container:focus-within, .panel__container.isLoading':\r\n {\r\n '.panel__header__buttons, .lastUpdate__wrapper': {\r\n opacity: responsive({ 0: 1 }),\r\n },\r\n },\r\n\r\n '.panel__footer': {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n gap: spacing(3),\r\n background: 'palette.secondary.light',\r\n px: 4,\r\n py: 3,\r\n color: 'palette.text.primary',\r\n borderRadius: 'panel',\r\n borderTopRightRadius: '0px',\r\n borderTopLeftRadius: '0px',\r\n overflow: 'hidden',\r\n alignItems: 'center',\r\n },\r\n\r\n '.panel__iconButton, .lastUpdate__wrapper': {\r\n transition: 'opacity 300ms',\r\n },\r\n\r\n '.lastUpdate__wrapper': {\r\n fontSize: 14,\r\n opacity: 0,\r\n flexShrink: 0,\r\n },\r\n\r\n '.panel__footer__text': {\r\n overflow: 'hidden',\r\n flexShrink: 1,\r\n },\r\n\r\n 'span.panel__title': {\r\n flexShrink: '1 !important',\r\n },\r\n};\r\n","import { IconButton } from '@apia/components';\r\nimport { getLabel, useImperativeComponentEvents } from '@apia/util';\r\nimport { useCallback, useState } from 'react';\r\nimport { usePanelActions, usePanelIsLoading } from '../../../actions';\r\n\r\nexport const RefreshButton = (props: {\r\n refreshOnStart: boolean;\r\n refreshOnHome: boolean;\r\n title: string;\r\n}) => {\r\n const [isDisabled, setIsDisabled] = useState(false);\r\n\r\n const isLoading = usePanelIsLoading();\r\n const dispatch = usePanelActions();\r\n\r\n useImperativeComponentEvents({\r\n disable(newDisabledValue: boolean) {\r\n setIsDisabled(newDisabledValue);\r\n },\r\n });\r\n\r\n return (\r\n <IconButton\r\n icon=\"Refresh\"\r\n variant=\"buttons.icon-outline\"\r\n className=\"panel__iconButton\"\r\n size=\"Md\"\r\n onClick={useCallback(() => {\r\n void dispatch({ action: 'refresh' });\r\n }, [dispatch])}\r\n title={getLabel('lblRefreshPnl', { text: { TOK1: props.title } }).text}\r\n isLoading={isLoading}\r\n disabled={isDisabled}\r\n />\r\n );\r\n};\r\n","import { ApiaApi, makeApiaUrl } from '@apia/api';\r\nimport { EventEmitter } from '@apia/util';\r\nimport { usePanelIdentity } from '../common';\r\nimport { TPanelId } from '../types';\r\n\r\nclass ConfigEmitter extends EventEmitter<{\r\n refresh: { panelId: TPanelId };\r\n}> {}\r\n\r\nexport const configEmitter = new ConfigEmitter();\r\n\r\n/**\r\n * Esta función devuelve una función que al ser llamada abre el modal de\r\n * configuración del panel actual. Este modal permite al usuario modificar\r\n * parámetros y una vez confirmado, el resultado de la operación deberá ser\r\n * tomado por una función aún inexistente.\r\n *\r\n * Esta función se deberá encargar de almacenar los parámetros recibidos desde\r\n * el server para el panel actual, así como hacerle llegar al panel\r\n * correspondiente los datos emitidos por su contraparte en el servidor, a fin\r\n * de que actualice su vista.\r\n *\r\n * Admite un callback que será llamado cada vez que se confirme el modal de\r\n * configuración. Este callback se expone a fin de permitir la ejecución de\r\n * acciones previas al refresh que es lanzado en forma automática cuando\r\n */\r\nexport function usePanelConfig() {\r\n const { panelId } = usePanelIdentity();\r\n\r\n return function config() {\r\n void ApiaApi.post(\r\n makeApiaUrl({\r\n action: 'panelEdit',\r\n pnlId: panelId,\r\n }),\r\n { handleLoad: true },\r\n );\r\n };\r\n}\r\n","import { IconButton } from '@apia/components';\r\nimport { getLabel, useImperativeComponentEvents } from '@apia/util';\r\nimport { useCallback, useState } from 'react';\r\nimport { usePanelConfig } from '../../../config/usePanelConfig';\r\nimport { usePanelActions } from '../../../actions';\r\nimport { panelButtonsActions } from './PanelButtons';\r\nimport { usePanelIdentity } from '../../../common';\r\n\r\nexport const SettingsButton = (props: { title: string }) => {\r\n const { panelId } = usePanelIdentity();\r\n const configure = usePanelConfig();\r\n\r\n const [isDisabled, setIsDisabled] = useState(false);\r\n useImperativeComponentEvents({\r\n disable(newDisabledValue: boolean) {\r\n setIsDisabled(newDisabledValue);\r\n },\r\n });\r\n\r\n usePanelActions({\r\n refresh() {\r\n panelButtonsActions(panelId, 'disable', false);\r\n },\r\n });\r\n\r\n const openSettings = useCallback(() => {\r\n try {\r\n configure();\r\n } catch (e) {}\r\n }, [configure]);\r\n\r\n return (\r\n <IconButton\r\n icon=\"Settings\"\r\n size=\"Md\"\r\n variant=\"buttons.icon-outline\"\r\n className=\"panel__iconButton\"\r\n onClick={openSettings}\r\n title={getLabel('lblOpenPnlConf', { text: { TOK1: props.title } }).text}\r\n disabled={isDisabled}\r\n />\r\n );\r\n};\r\n","import { makeImperativeComponent } from '@apia/util';\r\nimport { RefreshButton } from './RefreshButton';\r\nimport { SettingsButton } from './SettingsButton';\r\nimport { TPanelProps } from '../../../types';\r\n\r\nexport const [, panelButtonsActions, PanelButtons] = makeImperativeComponent<\r\n Omit<TPanelProps, 'initialData' | 'children'>,\r\n {\r\n disable: boolean;\r\n }\r\n>()({\r\n Component: (props) => {\r\n return (\r\n <>\r\n {props.isRefreshable && (\r\n <>\r\n <RefreshButton {...props} />\r\n </>\r\n )}\r\n {props.isConfigurable && <SettingsButton title={props.title} />}\r\n </>\r\n );\r\n },\r\n});\r\n","import { spacingLayouts, TSpacingLayout } from '@apia/theme';\r\nimport { useCallback, useRef } from 'react';\r\n\r\nexport type TPanelLayout = TSpacingLayout;\r\n\r\nexport function usePanelContextLayout() {\r\n const elRef = useRef<HTMLDivElement | null>(null);\r\n const layoutRef = useRef<TPanelLayout>('clever');\r\n\r\n const clearClassNames = useCallback(() => {\r\n spacingLayouts.forEach((current) =>\r\n (\r\n elRef.current?.querySelector('.panel__content') as HTMLElement\r\n )?.classList.remove(current),\r\n );\r\n }, []);\r\n\r\n const setRef = useCallback(\r\n (el: HTMLDivElement) => {\r\n if (el instanceof HTMLDivElement) {\r\n elRef.current = el;\r\n clearClassNames();\r\n (el?.querySelector('.panel__content') as HTMLElement).classList.add(\r\n layoutRef.current,\r\n );\r\n }\r\n },\r\n [clearClassNames],\r\n );\r\n\r\n const setLayout = useCallback(\r\n (layout: TPanelLayout) => {\r\n if (layoutRef.current === layout) return;\r\n\r\n layoutRef.current = layout;\r\n clearClassNames();\r\n (\r\n elRef.current?.querySelector('.panel__content') as HTMLElement\r\n )?.classList.add(layoutRef.current);\r\n },\r\n [clearClassNames],\r\n );\r\n\r\n return { ref: setRef, setLayout };\r\n}\r\n","import { useMount } from '@apia/util';\r\nimport { usePanelContext } from '.';\r\n\r\n/**\r\n * **Favor de leer con cuidado el siguiente contenido, es muy importante para\r\n * la performance**\r\n *\r\n * El hook useYieldPanelIsReady es una parte muy importante del flujo de\r\n * trabajo de los dashboards. **El no reportar la carga de un panel tiene\r\n * penalizaciones graves en el tiempo de renderizado inicial**, esto es porque\r\n * el dashboard espera que todos los paneles hayan terminado la carga\r\n * estructural básica antes de empezar con los refresh iniciales, y esto termina\r\n * impactando en el tiempo que demora en bajar la cortina.\r\n *\r\n * **Aclaración:** Actualmente se espera las cargas estructurales para lanzar\r\n * los refresh iniciales por motivos de arquitectura. Esa restricción será\r\n * eliminada probablemente en el corto plazo, pero eso no cambia la necesidad de\r\n * reportar las estructuras ya que esta información es igualmente utilizada para\r\n * el bajado de la cortina de Skeletons.\r\n *\r\n * Por ejemplo, si todos los paneles están optimizados para lograr cargas\r\n * iniciales rápidas pero el logo de la aplicación no reporta que su estructura\r\n * está pronta, el dashboard va a bajar su cortina solamente luego de que expire\r\n * el timeout **DASH_COURTAIN_TRESHOLD**, que por defecto viene establecido en 5\r\n * segundos.\r\n *\r\n * Esto significa que aún cuando la cortina se hubiera podido bajar quizás a\r\n * los pocos ms de cargado el html inicial, no lo hará porque supone que el\r\n * panel Logo aún no terminó su carga estructural.\r\n *\r\n * Siempre que un panel esté presente en un dashboard, deberá reportar cuando\r\n * la carga estructural esté pronta. Esto puede ser hecho de dos formas:\r\n *\r\n * - Usando { setRef } = usePanelContext(): En el elemento crucial de HTML del\r\n * elemento hacer ref={setRef}. Esta es la forma más óptima ya que nos garantiza\r\n * que el panel se reporte cuando su estructura HTML ya esté disponible,\r\n * evitando ninguna demora.\r\n *\r\n * - Usando useYieldPanelIsReady(): Este hook es una alternativa disponible\r\n * para las situaciones en las que no tenemos ningún elemento HTML de\r\n * importancia o cuando ese elemento no está disponible hasta después de la\r\n * carga inicial. Al usar este hook el panel se reportará automáticamente una\r\n * vez que haya hecho el renderizado inicial.\r\n */\r\nexport function useYieldPanelIsReady() {\r\n const { setRef } = usePanelContext();\r\n\r\n useMount(() => {\r\n setRef({} as HTMLElement);\r\n });\r\n}\r\n","import {\r\n ReactNode,\r\n createContext,\r\n useCallback,\r\n useContext,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from 'react';\r\nimport { changePanelTitle } from '../../../panelsUtil';\r\nimport { TPanelEvent, usePanelOnEvent } from '../../../eventsController';\r\nimport { TPanelLayout, usePanelContextLayout } from './usePanelContextLayout';\r\nimport { usePanelFooter } from './usePanelFooter';\r\nimport { TPanelProps } from '../../../types';\r\nimport { usePanelActions } from '../../../actions';\r\nimport { useYieldPanelIsReady } from './useYieldPanelIsReady';\r\nimport { useDashboardContext } from '../../../dashboard/DashboardContext';\r\n\r\nexport const PanelContext = createContext<TPanelContext | null>(null);\r\nexport { useYieldPanelIsReady };\r\n\r\nexport type TPanelContext = {\r\n /**\r\n * Permite establecer contenido arbitrario en el footer del panel.\r\n */\r\n setFooterContent(content: ReactNode): void;\r\n /**\r\n * setLayout es una función que permite decidir en qué formato se muestran\r\n * los contenidos del panel.\r\n *\r\n * dense: No hay paddings\r\n * clever: Hay paddings grandes\r\n */\r\n setLayout: (newLayout: TPanelLayout) => void;\r\n setTitle: (newTitle: string) => void;\r\n panelProps: Omit<TPanelProps, 'children'>;\r\n /**\r\n * Cuando un panel renderiza sus hijos en pantalla, debe setear el ref de\r\n * modo que se pueda continuar con el flujo normal del panel. Este ref puede\r\n * estar en cualquier nivel, cuando sea instanciado, se llamará al refresh\r\n * inicial.\r\n */\r\n setRef: (el: HTMLElement | null) => void;\r\n};\r\n\r\nexport function usePanelContext() {\r\n const context = useContext(PanelContext);\r\n if (!context) throw new Error('No panel wrapper context defined');\r\n return context;\r\n}\r\nexport const PanelContextProvider = ({\r\n children,\r\n value,\r\n}: {\r\n children: ReactNode;\r\n value: TPanelContext;\r\n}) => {\r\n return (\r\n <PanelContext.Provider value={value}>{children}</PanelContext.Provider>\r\n );\r\n};\r\n\r\nexport function useMakePanelContext(\r\n panelId: string,\r\n panelProps: Omit<TPanelProps, 'children'>,\r\n) {\r\n const setTitle = useCallback(\r\n (newTitle: string) => {\r\n changePanelTitle(panelId, newTitle);\r\n },\r\n [panelId],\r\n );\r\n\r\n const { ref, setLayout } = usePanelContextLayout();\r\n\r\n const [title, setTitleState] = useState(panelProps.title);\r\n usePanelOnEvent(\r\n { eventType: 'changeTitle', panelId },\r\n (ev: TPanelEvent<string>) => {\r\n setTitleState(ev.payload);\r\n },\r\n );\r\n const { footer, handleFooterClick } = usePanelFooter(\r\n panelId,\r\n panelProps.initialData,\r\n );\r\n\r\n const [footerContent, setFooterContent] = useState<ReactNode>(null);\r\n\r\n const dispatch = usePanelActions();\r\n const hasRefreshedOnStartup = useRef(false);\r\n const dashboard = useDashboardContext();\r\n\r\n const setRef = useCallback(\r\n (el: HTMLElement | null) => {\r\n if (el && !hasRefreshedOnStartup.current) {\r\n hasRefreshedOnStartup.current = true;\r\n if (panelProps.refreshOnStart) {\r\n void dispatch({ action: 'refresh' }).then(() => {\r\n dashboard.bootstrapper.setPanelHasLoaded(panelId);\r\n });\r\n } else {\r\n dashboard.bootstrapper.setPanelHasLoaded(panelId);\r\n }\r\n }\r\n },\r\n [dashboard.bootstrapper, dispatch, panelId, panelProps.refreshOnStart],\r\n );\r\n\r\n const contextValue = useMemo<TPanelContext>(\r\n () => ({ setFooterContent, setTitle, setLayout, panelProps, setRef }),\r\n [setTitle, setLayout, panelProps, setRef],\r\n );\r\n\r\n return { footerContent, title, footer, handleFooterClick, contextValue, ref };\r\n}\r\n","import { useState } from 'react';\r\nimport { usePanelActions } from '../../../actions';\r\nimport { TUsePanelFooter } from './usePanelFooter';\r\nimport { AutoEllipsis, SimpleButton } from '@apia/components';\r\nimport { Box } from '@apia/theme';\r\n\r\nexport const PanelFooter = ({\r\n footerContent,\r\n isRefreshable,\r\n footer,\r\n handleFooterClick,\r\n}: TUsePanelFooter & { isRefreshable: boolean }) => {\r\n const [lastUpdate, setLastUpdate] = useState<number>(0);\r\n\r\n usePanelActions({\r\n refresh() {\r\n setLastUpdate(Date.now());\r\n },\r\n });\r\n\r\n return (\r\n <>\r\n {(isRefreshable || footer) && (\r\n <div className=\"panel__footer\">\r\n {footerContent ??\r\n (footer &&\r\n (!footer.action || footer.actionBehavior === 'DO_NOTHING') && (\r\n <div className=\"panel__footer__text\">\r\n <AutoEllipsis\r\n overrideStyles={(el) => {\r\n const styles = window.getComputedStyle(\r\n el.closest('.panel__footer') as HTMLElement,\r\n );\r\n const width = Number.parseInt(styles.width, 10);\r\n const padding =\r\n Number.parseInt(styles.paddingLeft, 10) +\r\n Number.parseInt(styles.paddingRight, 10);\r\n return {\r\n width: `${width - padding}px`,\r\n };\r\n }}\r\n >\r\n {footer.text}\r\n </AutoEllipsis>\r\n </div>\r\n ))}\r\n {footer?.action && footer.actionBehavior !== 'DO_NOTHING' && (\r\n <SimpleButton\r\n onClick={handleFooterClick}\r\n onDoubleClick={handleFooterClick}\r\n variant=\"link\"\r\n className=\"panel__footer__text\"\r\n >\r\n <AutoEllipsis\r\n overrideStyles={(el) => {\r\n const styles = window.getComputedStyle(\r\n el.closest('.panel__footer') as HTMLElement,\r\n );\r\n const width = Number.parseInt(styles.width, 10);\r\n const padding =\r\n Number.parseInt(styles.paddingLeft, 10) +\r\n Number.parseInt(styles.paddingRight, 10);\r\n return {\r\n width: `${width - padding}px`,\r\n };\r\n }}\r\n >\r\n {footer.text}\r\n </AutoEllipsis>\r\n </SimpleButton>\r\n )}\r\n {!footer && <div></div>}\r\n {lastUpdate > 0 && (\r\n <Box className=\"lastUpdate__wrapper\">\r\n {new Date(lastUpdate).toLocaleDateString()}{' '}\r\n {new Date(lastUpdate).toLocaleTimeString()}\r\n </Box>\r\n )}\r\n </div>\r\n )}\r\n </>\r\n );\r\n};\r\n","import { makeStyledComponent } from '@apia/theme';\r\nimport { PanelContainer } from '../../../types';\r\nimport { defaultPanelWrapperStyles } from './defaultPanelWrapperStyles';\r\nimport { usePanelIdentity } from '../../../common';\r\nimport { NetworkState } from './NetworkState';\r\nimport { PanelButtons } from './PanelButtons';\r\nimport { usePanelIsLoading } from '../../../actions';\r\nimport { PanelContextProvider, useMakePanelContext } from '../PanelContext';\r\nimport { PanelFooter } from '../PanelContext/PanelFooter';\r\nimport {\r\n usePanelImage,\r\n usePanelTitleDescription,\r\n} from '../../../panelsUtil/usePanelTitleAction';\r\nimport { AutoEllipsis } from '@apia/components';\r\n\r\nexport const DefaultPanelWrapper: PanelContainer = makeStyledComponent(\r\n 'DefaultPanelWrapper',\r\n 'layout.common.dashboards.panel',\r\n defaultPanelWrapperStyles,\r\n ({ children, ...props }) => {\r\n const { panelId, panelName, panelType } = usePanelIdentity();\r\n\r\n const { contextValue, title, ref, ...footerProps } = useMakePanelContext(\r\n panelId,\r\n props,\r\n );\r\n\r\n const panelTitleDescription = usePanelTitleDescription();\r\n const panelImage = usePanelImage() ?? props.image;\r\n\r\n const showHeader =\r\n props.showTitle ||\r\n props.isConfigurable ||\r\n props.isRefreshable ||\r\n panelImage;\r\n\r\n const isLoading = usePanelIsLoading();\r\n return (\r\n <PanelContextProvider value={contextValue}>\r\n <div\r\n ref={ref}\r\n className={`panel__container ${isLoading ? 'isLoading' : ''}`}\r\n data-panelname={panelName}\r\n data-paneltype={panelType}\r\n data-panelid={panelId}\r\n >\r\n {showHeader && (\r\n <div draggable={props.canMove} className={`panel__header`}>\r\n <div\r\n className=\"panel__header__left\"\r\n sx={{\r\n maxWidth: '80%',\r\n overflow: 'hidden',\r\n whiteSpace: 'nowrap',\r\n }}\r\n >\r\n {panelImage && !panelImage.match('(^.+null$)') && (\r\n <img src={panelImage} className=\"panel__icon\" />\r\n )}\r\n <AutoEllipsis>\r\n {props.showTitle && (\r\n <span\r\n className=\"panel__title\"\r\n title={panelTitleDescription ?? title}\r\n >\r\n {title}\r\n </span>\r\n )}\r\n <NetworkState title={title} />\r\n </AutoEllipsis>\r\n </div>\r\n\r\n <div className={`panel__header__buttons`}>\r\n <PanelButtons {...props} id={panelId} />\r\n </div>\r\n </div>\r\n )}\r\n <div className=\"panel__content\">{children}</div>\r\n <PanelFooter isRefreshable={props.isRefreshable} {...footerProps} />\r\n </div>\r\n </PanelContextProvider>\r\n );\r\n },\r\n);\r\n","/* eslint-disable @typescript-eslint/no-throw-literal */\r\nimport {\r\n ReactNode,\r\n Suspense,\r\n useCallback,\r\n useDeferredValue,\r\n useState,\r\n} from 'react';\r\nimport { Dashboard } from './dashboard';\r\n\r\ndeclare global {\r\n interface Window {\r\n DASH_COURTAIN_TRESHOLD?: number;\r\n }\r\n}\r\n\r\nexport class DashboardPanelsBootstraper {\r\n #hasLoadedAll = false;\r\n #bootstrappedPanels: Record<string, boolean> = {};\r\n #hasLoaded: Record<string, boolean> = {};\r\n\r\n #initTimestamp = Date.now();\r\n #timeoutTreshold = (window.DASH_COURTAIN_TRESHOLD ?? 5) * 1000;\r\n\r\n constructor(public dashboard: Dashboard) {}\r\n\r\n #checkAllHasLoaded = () => {\r\n if (this.#hasLoadedAll) return true;\r\n\r\n const keys = Object.keys(this.#bootstrappedPanels);\r\n const hasLoadedAllPanels = !keys.find(\r\n (current) =>\r\n !this.#hasLoaded[current] && this.dashboard.getPanel(current).isVisible,\r\n );\r\n const hasTimedOutLoading =\r\n Date.now() - this.#initTimestamp > this.#timeoutTreshold;\r\n\r\n if (hasLoadedAllPanels || hasTimedOutLoading) {\r\n if (hasTimedOutLoading) {\r\n const nonBootstrappedPanels = Object.keys(this.#bootstrappedPanels)\r\n .filter((current) => !this.#hasLoaded[current])\r\n .map((panelId) => {\r\n const panelProps = this.dashboard.getPanel(panelId).props;\r\n return panelProps;\r\n });\r\n\r\n console.warn(\r\n `The courtain was removed because of timeout, check that all panels are reporting according to useYieldPanelIsReady's documentation. \\n\\nIt might have happened that all panels are reporting but the browser was too busy to handle all of them in time, in order to determine what is actually happen you can raise the DASH_COURTAIN_TRESHOLD to a very large number, like 20 for example.`,\r\n { nonBootstrappedPanels },\r\n );\r\n }\r\n\r\n this.#hasLoadedAll = true;\r\n this.#removeSkeletons();\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n #removeSkeletons = () => {\r\n const skeleton = document.querySelector(\r\n '#DashLayoutCourtain',\r\n ) as HTMLElement;\r\n const dashContent = document.querySelector(\r\n '#DashLayoutContent',\r\n ) as HTMLElement;\r\n\r\n skeleton.style.display = 'none';\r\n dashContent.style.visibility = 'initial';\r\n skeleton.remove();\r\n };\r\n\r\n /**\r\n * El bootstraper se basa en dos elementos: setHasLoadedInitialData y\r\n * SuspendPanelUntilDashboardReady.\r\n *\r\n * El funcionamiento es muy elemental: Cada panel utiliza el Suspend como\r\n * wrapper y éste registra el id del panel en un array de paneles pendientes\r\n * por cargar.\r\n *\r\n * Una vez que todos los paneles cargaron, el suspense retoma su tarea y\r\n * renderiza el panel normalmente.\r\n */\r\n setPanelHasLoaded = (panelId: string) => {\r\n this.#hasLoaded[panelId] = true;\r\n this.dashboard.getPanel(panelId).setHasLoaded();\r\n };\r\n\r\n SuspendPanelUntilDashbordReady = ({\r\n children,\r\n panelId,\r\n }: {\r\n children: ReactNode;\r\n panelId: string;\r\n }) => {\r\n const [hasBootstraped, setHasBootstraped] = useState(false);\r\n const deferredHasBootstraped = useDeferredValue(hasBootstraped);\r\n this.#bootstrappedPanels[panelId] = true;\r\n\r\n const LoadWaiter = useCallback(() => {\r\n if (!this.#checkAllHasLoaded())\r\n void new Promise<void>((resolve) => {\r\n const interval = setInterval(() => {\r\n if (this.#checkAllHasLoaded()) {\r\n resolve();\r\n clearInterval(interval);\r\n }\r\n }, 300);\r\n });\r\n return null;\r\n }, []);\r\n\r\n if (!deferredHasBootstraped)\r\n return (\r\n <div\r\n ref={(el) => {\r\n if (el) setHasBootstraped(true);\r\n }}\r\n />\r\n );\r\n\r\n return (\r\n <Suspense fallback={null}>\r\n {children}\r\n <LoadWaiter />\r\n </Suspense>\r\n );\r\n };\r\n}\r\n","import { Heading } from '@apia/theme';\r\nimport { usePanelIdentity } from '../common';\r\n\r\nexport const PanelNotFound = () => {\r\n const props = usePanelIdentity();\r\n\r\n return (\r\n <>\r\n <Heading>Panel not found: {props.panelType}</Heading>\r\n </>\r\n );\r\n};\r\n","import { ComponentType, lazy } from 'react';\r\nimport { PanelNotFound } from './dashboard/PanelNotFound';\r\n\r\nconst importedPanels: Record<\r\n string,\r\n ComponentType<{ initialData: unknown }>\r\n> = {};\r\nexport function importPanel(path: string) {\r\n if (!importedPanels[path])\r\n importedPanels[path] = lazy<ComponentType<{ initialData: unknown }>>(() => {\r\n return new Promise<{\r\n default: ComponentType<{ initialData: unknown }>;\r\n }>((resolve) => {\r\n import(\r\n /* webpackChunkName: \"[request]\" */\r\n /* webpackInclude: /\\.tsx?$/ */\r\n /* webpackPreload: true */\r\n `/panels/${path}`\r\n )\r\n .then(\r\n (result: {\r\n default: { default: ComponentType<{ initialData: unknown }> };\r\n }) => {\r\n resolve(result.default);\r\n },\r\n )\r\n .catch(() => {\r\n resolve({\r\n default: PanelNotFound,\r\n });\r\n });\r\n });\r\n });\r\n\r\n return importedPanels[path];\r\n}\r\n","import { makeStyledComponent } from '@apia/theme';\r\nimport { Component, ReactNode } from 'react';\r\nimport { Box, Heading, Paragraph } from '@apia/theme';\r\n\r\nconst Error = makeStyledComponent(\r\n 'Error',\r\n 'layout.panels.error',\r\n {\r\n '.panelError__wrapper': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 3,\r\n\r\n h3: {\r\n color: 'palette.error.main',\r\n },\r\n },\r\n },\r\n ({ error }: { error: string }) => {\r\n return (\r\n <Box className=\"panelError__wrapper\">\r\n <Heading as=\"h3\">Oops! Something went wrong</Heading>\r\n <Heading as=\"h4\">Error:</Heading>\r\n <Paragraph>{error}</Paragraph>\r\n </Box>\r\n );\r\n },\r\n);\r\n\r\nexport class PanelErrorBoundary extends Component<\r\n { children: ReactNode },\r\n { hasError: boolean; errorMessage: string }\r\n> {\r\n state: Readonly<{ hasError: boolean; errorMessage: string }> = {\r\n hasError: false,\r\n errorMessage: '',\r\n };\r\n\r\n static getDerivedStateFromError(error: unknown) {\r\n if (!(error instanceof Promise))\r\n return { hasError: true, errorMessage: String(error) };\r\n }\r\n\r\n render() {\r\n if (this.state.hasError) {\r\n return <Error error={this.state.errorMessage} />;\r\n }\r\n\r\n return this.props.children;\r\n }\r\n}\r\n","import { createPortal } from 'react-dom';\r\nimport { Dashboard } from '.';\r\nimport { PanelContainer, TLoadedPanelProps } from '../types';\r\nimport { importPanel } from '../util';\r\nimport { EventEmitter, parseXmlAsync, toBoolean, useMount } from '@apia/util';\r\nimport { ReactPortal, useState } from 'react';\r\nimport { PanelErrorBoundary } from '../splash/panels/PanelErrorBoundary';\r\nimport { PanelIdentifier } from '../splash/panels/PanelIdentifier';\r\nimport { firePanelAction } from '../actions/firePanelAction';\r\nimport { parametersStore, saveParameters } from '../config';\r\nimport { DashboardPanelContext } from './DashboardPanelContext';\r\nimport {\r\n TActionDispatcherOptions,\r\n TActionResult,\r\n} from '../actions/usePanelActions';\r\n\r\nconst noData = { initialData: {} };\r\n\r\ntype TPanelProps = Omit<TLoadedPanelProps, 'initialData'>;\r\nfunction parameterValue(value: string | boolean | number) {\r\n if (value === 'true') return true;\r\n if (value === 'false') return false;\r\n\r\n return value;\r\n}\r\n\r\nexport class DashboardPanel extends EventEmitter<{\r\n hasLoaded: boolean;\r\n isVisible: boolean;\r\n}> {\r\n dashboard: Dashboard;\r\n hasInited = false;\r\n hasLoaded = false;\r\n id: string;\r\n initialData: Promise<unknown> | null = null;\r\n isVisible = false;\r\n portal: ReactPortal;\r\n props: TPanelProps = {} as TPanelProps;\r\n\r\n constructor({\r\n id,\r\n dashboard,\r\n PanelContainer,\r\n }: {\r\n id: string;\r\n dashboard: Dashboard;\r\n PanelContainer: PanelContainer;\r\n }) {\r\n super();\r\n\r\n this.dashboard = dashboard;\r\n this.id = id;\r\n this.#loaders.loadAll();\r\n\r\n this.portal = createPortal(\r\n <this.PanelElement\r\n ActualPanelContainer={PanelContainer}\r\n Element={importPanel(this.props.type)}\r\n />,\r\n this.getContainer().querySelector('.panel__content') as HTMLElement,\r\n this.id,\r\n );\r\n }\r\n\r\n #elements = {\r\n props: () => {\r\n const panelData = document.querySelector(\r\n `panel-props[id=\"${this.id as string}\"]`,\r\n ) as HTMLElement | null;\r\n\r\n if (!panelData) {\r\n console.error('Panel with no id:', this.id);\r\n throw new Error('A panel has no data element in the DOM.');\r\n }\r\n\r\n return panelData;\r\n },\r\n };\r\n\r\n #loaders = {\r\n loadAll: () => {\r\n void this.#loaders.initialData();\r\n this.#loaders.parameters();\r\n this.#loaders.props();\r\n },\r\n initialData: () => {\r\n const panel = this.getContainer();\r\n const panelContent = panel.querySelector(\r\n '.panel__content',\r\n ) as HTMLElement;\r\n const xml = panelContent.innerHTML\r\n .replaceAll('<', '<')\r\n .replaceAll('>', '>')\r\n .replaceAll('&', '&');\r\n panelContent.innerHTML = '';\r\n\r\n this.initialData = parseXmlAsync(xml.replace(/<!--?[^>]+>/, ''));\r\n\r\n return this.initialData;\r\n },\r\n parameters: () => {\r\n if (parametersStore.getState().panelParameters[this.id]) return;\r\n\r\n const panelData = this.#elements.props();\r\n\r\n const options = Object.fromEntries(\r\n [...panelData.querySelectorAll<HTMLElement>('panel-option')].map(\r\n (current) => {\r\n return [\r\n current.getAttribute('name') as string,\r\n parameterValue(current.getAttribute('value') as string),\r\n ];\r\n },\r\n ),\r\n );\r\n\r\n const parameters = Object.fromEntries(\r\n [...panelData.querySelectorAll<HTMLElement>('panel-parameter')].map(\r\n (current) => {\r\n return [\r\n current.getAttribute('name') as string,\r\n parameterValue(current.getAttribute('value') as string),\r\n ];\r\n },\r\n ),\r\n );\r\n\r\n saveParameters(this.id, Object.assign(options, parameters), false);\r\n },\r\n props: () => {\r\n const panelData = this.#elements.props();\r\n const panel = this.getContainer();\r\n\r\n const props: Omit<TLoadedPanelProps, 'initialData'> = {\r\n id: this.id,\r\n canMove: toBoolean(panelData.getAttribute('canMove')),\r\n hasRss: toBoolean(panelData.getAttribute('hasRss')),\r\n image: panelData.getAttribute('imagePath') as string,\r\n isConfigurable: toBoolean(panelData.getAttribute('isConfigurable')),\r\n isRefreshable: toBoolean(panelData.getAttribute('isRefreshable')),\r\n name: panelData.getAttribute('name') as string,\r\n refreshOnHome: toBoolean(panelData.getAttribute('refreshOnHome')),\r\n refreshOnStart: toBoolean(panelData.getAttribute('refreshOnStart')),\r\n showTitle: toBoolean(panelData.getAttribute('showTitle')),\r\n title: panelData.getAttribute('title') as string,\r\n type: panel.dataset.panel as string,\r\n };\r\n\r\n this.props = props;\r\n },\r\n };\r\n\r\n fireAction: (\r\n { action, ...parameters }: { action: string } & Record<string, unknown>,\r\n options?: TActionDispatcherOptions,\r\n ) => Promise<TActionResult> = ({ action, ...parameters }, options) => {\r\n if (!this.isVisible) return new Promise((resolve) => resolve(null));\r\n\r\n const postData: Record<string, unknown> = {};\r\n\r\n Object.entries(parameters).forEach(([name, value]) => {\r\n postData[`p_${name}`] = value;\r\n });\r\n\r\n return new Promise<TActionResult>((resolve, reject) => {\r\n firePanelAction(this.id, action, postData, {\r\n ...options,\r\n onComplete(hasSucceed, data) {\r\n options?.onComplete?.(hasSucceed, data);\r\n if (hasSucceed) {\r\n resolve(data);\r\n } else reject();\r\n },\r\n });\r\n });\r\n };\r\n\r\n getContainer() {\r\n const panel = document.querySelector(\r\n `[data-id=\"${this.id}\"][data-panel]`,\r\n ) as HTMLElement;\r\n\r\n if (!panel) {\r\n console.error('Panel not found in dom:', this.id);\r\n throw new Error('Panel not found in DOM.');\r\n }\r\n\r\n return panel;\r\n }\r\n\r\n getParameters() {\r\n return parametersStore.getState().panelParameters[this.id];\r\n }\r\n\r\n hide() {\r\n const container = this.getContainer();\r\n container.style.display = 'none';\r\n container.ariaHidden = 'true';\r\n\r\n this.isVisible = false;\r\n this.emit('isVisible', this.isVisible);\r\n }\r\n\r\n refresh() {\r\n return this.fireAction({ action: 'refresh' });\r\n }\r\n\r\n setHasLoaded() {\r\n this.hasLoaded = true;\r\n this.emit('hasLoaded', true);\r\n }\r\n\r\n show() {\r\n const container = this.getContainer();\r\n container.style.display = 'block';\r\n container.ariaHidden = 'false';\r\n\r\n this.hasInited = true;\r\n this.isVisible = true;\r\n this.emit('isVisible', this.isVisible);\r\n }\r\n\r\n PanelElement = ({\r\n ActualPanelContainer,\r\n Element,\r\n }: {\r\n ActualPanelContainer: PanelContainer;\r\n Element: ReturnType<typeof importPanel>;\r\n }) => {\r\n const [resolvedInitialData, setResolvedInitialData] = useState<{\r\n initialData: unknown;\r\n } | null>(null);\r\n const [isVisible, setIsVisible] = useState(this.isVisible);\r\n\r\n useMount(() => {\r\n void this.initialData?.then((data) => {\r\n setResolvedInitialData((data ?? noData) as { initialData: unknown });\r\n });\r\n\r\n return this.on('isVisible', (ev) =>\r\n setIsVisible((current) => ev || current),\r\n );\r\n });\r\n\r\n if (resolvedInitialData === null || resolvedInitialData === noData)\r\n return null;\r\n\r\n return (\r\n <DashboardPanelContext.Provider value={this}>\r\n <PanelIdentifier {...this.props}>\r\n <ActualPanelContainer\r\n {...this.props}\r\n initialData={resolvedInitialData}\r\n >\r\n <this.dashboard.bootstrapper.SuspendPanelUntilDashbordReady\r\n panelId={this.id}\r\n >\r\n <PanelErrorBoundary>\r\n {isVisible ? (\r\n <Element initialData={resolvedInitialData.initialData} />\r\n ) : null}\r\n </PanelErrorBoundary>\r\n </this.dashboard.bootstrapper.SuspendPanelUntilDashbordReady>\r\n </ActualPanelContainer>\r\n </PanelIdentifier>\r\n </DashboardPanelContext.Provider>\r\n );\r\n };\r\n}\r\n","import { isChild } from '@apia/util';\r\nimport { DragAndDrop } from '../util/DragAndDrop';\r\n\r\nexport function dragleave(_ev: Event, DragAndDrop: DragAndDrop) {\r\n const ev = _ev as DragEvent;\r\n\r\n if (\r\n ev.relatedTarget === null ||\r\n isChild(ev.relatedTarget as HTMLElement, (current) => {\r\n return (\r\n current.parentElement === null &&\r\n current === document.getRootNode() &&\r\n current.dataset.splash === undefined\r\n );\r\n })\r\n ) {\r\n const shadows = document.querySelectorAll('.apia_panel_falseDiv');\r\n\r\n shadows.forEach((el) => el.remove());\r\n DragAndDrop.draggingPanel?.setAttribute('style', '');\r\n }\r\n}\r\n","import { TPanelZoneCoordinates } from '../types';\r\n\r\nexport const isCursorInArea = ({\r\n top,\r\n bottom,\r\n left,\r\n right,\r\n cursorX,\r\n cursorY,\r\n}: TPanelZoneCoordinates) => {\r\n return (\r\n top <= cursorY && cursorY <= bottom && left <= cursorX && cursorX <= right\r\n );\r\n};\r\n","import { TPanelData } from '../types';\r\n\r\nexport const getColumnAreas = (specificPanel: TPanelData) => {\r\n return {\r\n top: {\r\n top: specificPanel.panelTop,\r\n bottom: specificPanel.panelTop + specificPanel.panelHeight / 2,\r\n left: specificPanel.panelLeft,\r\n right: specificPanel.panelRight,\r\n },\r\n bottom: {\r\n top: specificPanel.panelBottom - specificPanel.panelHeight / 2,\r\n bottom: specificPanel.panelBottom,\r\n right: specificPanel.panelRight,\r\n left: specificPanel.panelLeft,\r\n },\r\n };\r\n};\r\n","/* eslint-disable no-param-reassign */\r\nimport { isCursorInArea } from '../util/isCursorInArea';\r\nimport { getColumnAreas } from '../util/getColumnAreas';\r\nimport { DragAndDrop } from '../util/DragAndDrop';\r\n\r\nexport function dragover(event: Event, DragAndDrop: DragAndDrop) {\r\n const ev = event as DragEvent;\r\n ev.preventDefault();\r\n\r\n DragAndDrop.timeout = -1;\r\n if (\r\n (ev.clientX !== DragAndDrop.dragoverPosition.x ||\r\n ev.clientY !== DragAndDrop.dragoverPosition.y) &&\r\n DragAndDrop.draggingPanelId !== '' &&\r\n DragAndDrop.shadowDiv\r\n ) {\r\n DragAndDrop.clearTimeout();\r\n DragAndDrop.currentBottomPanel = DragAndDrop.findBottomPanel(\r\n ev.clientX,\r\n ev.clientY + DragAndDrop.currentScroll,\r\n );\r\n\r\n DragAndDrop.dragoverPosition.x = ev.clientX;\r\n DragAndDrop.dragoverPosition.y = ev.clientY;\r\n\r\n const snapshotSection = DragAndDrop.findBottomSection(\r\n ev.clientX,\r\n ev.clientY + DragAndDrop.currentScroll,\r\n );\r\n\r\n if (\r\n DragAndDrop.shadowDivData &&\r\n isCursorInArea({\r\n cursorX: ev.clientX,\r\n cursorY: ev.clientY + DragAndDrop.currentScroll,\r\n bottom: DragAndDrop.shadowDivData?.panelBottom,\r\n top: DragAndDrop.shadowDivData?.panelTop,\r\n left: DragAndDrop.shadowDivData?.panelLeft,\r\n right: DragAndDrop.shadowDivData?.panelRight,\r\n })\r\n ) {\r\n return;\r\n }\r\n\r\n if (DragAndDrop.currentBottomPanel && snapshotSection) {\r\n const bottomPanel = DragAndDrop.splash.querySelector(\r\n `[data-panel][data-id='${DragAndDrop.currentBottomPanel.id}']`,\r\n );\r\n const draggingPanel = DragAndDrop.splash.querySelector(\r\n `[data-panel][data-id='${DragAndDrop.draggingPanelId}']`,\r\n );\r\n const bottomSection = DragAndDrop.splash.querySelector(\r\n `[data-locationid='${snapshotSection.sectionId}']`,\r\n );\r\n\r\n if (bottomSection) {\r\n if (\r\n isCursorInArea({\r\n cursorX: ev.clientX,\r\n cursorY: ev.clientY + DragAndDrop.currentScroll,\r\n ...getColumnAreas({\r\n ...DragAndDrop.currentBottomPanel,\r\n panelLeft: bottomSection?.getBoundingClientRect().left ?? 0,\r\n panelRight: bottomSection?.getBoundingClientRect().right ?? 0,\r\n }).top,\r\n })\r\n ) {\r\n if (draggingPanel) {\r\n draggingPanel.setAttribute('style', 'display: none; height: 0;');\r\n }\r\n if (bottomPanel && snapshotSection) {\r\n if (bottomSection) {\r\n DragAndDrop.shadowDiv.setAttribute('style', 'opacity: 50%;');\r\n DragAndDrop.debounceBefore(\r\n bottomPanel,\r\n DragAndDrop.shadowDiv,\r\n bottomSection as HTMLElement,\r\n );\r\n DragAndDrop.snapshot();\r\n DragAndDrop.clearTimeout();\r\n }\r\n }\r\n } else if (\r\n isCursorInArea({\r\n cursorX: ev.clientX,\r\n cursorY: ev.clientY + DragAndDrop.currentScroll,\r\n ...getColumnAreas({\r\n ...DragAndDrop.currentBottomPanel,\r\n panelLeft: bottomSection?.getBoundingClientRect().left ?? 0,\r\n panelRight: bottomSection?.getBoundingClientRect().right ?? 0,\r\n }).bottom,\r\n })\r\n ) {\r\n const bottomPanel = DragAndDrop.splash.querySelector(\r\n `[data-panel][data-id='${DragAndDrop.currentBottomPanel.id}']`,\r\n );\r\n const draggingPanel = DragAndDrop.splash.querySelector(\r\n `[data-panel][data-id='${DragAndDrop.draggingPanelId}']`,\r\n );\r\n if (draggingPanel) {\r\n draggingPanel.setAttribute('style', 'display: none;');\r\n }\r\n if (bottomPanel && snapshotSection) {\r\n const bottomSection = DragAndDrop.splash.querySelector(\r\n `[data-locationid='${snapshotSection.sectionId}']`,\r\n );\r\n if (bottomSection) {\r\n DragAndDrop.shadowDiv.setAttribute('style', 'opacity: 50%;');\r\n DragAndDrop.debounceAfter(DragAndDrop.shadowDiv, bottomPanel);\r\n DragAndDrop.snapshot();\r\n DragAndDrop.clearTimeout();\r\n }\r\n }\r\n }\r\n }\r\n } else if (!DragAndDrop.currentBottomPanel && snapshotSection) {\r\n const bottomSection = DragAndDrop.splash.querySelector(\r\n `[data-locationid='${snapshotSection.sectionId}']`,\r\n );\r\n if (bottomSection) {\r\n const draggingPanel = DragAndDrop.splash.querySelector(\r\n `[data-panel][data-id='${DragAndDrop.draggingPanelId}']`,\r\n );\r\n if (draggingPanel) {\r\n draggingPanel.setAttribute('style', 'display: none;');\r\n }\r\n DragAndDrop.shadowDiv.setAttribute('style', 'opacity: 50%;');\r\n DragAndDrop.debounceAppend(\r\n bottomSection as HTMLElement,\r\n DragAndDrop.shadowDiv,\r\n );\r\n DragAndDrop.snapshot();\r\n DragAndDrop.clearTimeout();\r\n }\r\n }\r\n }\r\n}\r\n","/* eslint-disable no-param-reassign */\r\nimport { getSpecificParent } from '@apia/util';\r\nimport { DragAndDrop } from '../util/DragAndDrop';\r\n\r\nexport function dragstart(\r\n ev: DragEvent,\r\n el: Element,\r\n DragAndDrop: DragAndDrop,\r\n) {\r\n if (!(el instanceof HTMLElement)) return;\r\n DragAndDrop.drawMinimap();\r\n DragAndDrop.sectionData = [];\r\n\r\n const targetPanel = getSpecificParent(\r\n ev.target as HTMLElement,\r\n (current) => !!current.dataset?.id && !!current.dataset?.panel,\r\n );\r\n\r\n ev?.dataTransfer?.setData('text', targetPanel?.dataset.id as string);\r\n if (targetPanel) {\r\n DragAndDrop.placeholderImage = targetPanel.cloneNode(true) as HTMLElement;\r\n DragAndDrop.placeholderImage.style.position = 'fixed';\r\n DragAndDrop.placeholderImage.style.top = '-10000000.45px';\r\n\r\n const children =\r\n DragAndDrop.placeholderImage.querySelectorAll<HTMLElement>('*');\r\n children.forEach((current) => (current.style.overflow = 'hidden'));\r\n document.body.append(DragAndDrop.placeholderImage);\r\n ev?.dataTransfer?.setDragImage(DragAndDrop.placeholderImage, 0, 0);\r\n }\r\n if (ev.dataTransfer) {\r\n // eslint-disable-next-line no-param-reassign\r\n ev.dataTransfer.effectAllowed = 'move';\r\n }\r\n\r\n setTimeout(() => {\r\n const targetSection = getSpecificParent(\r\n ev.target as HTMLElement,\r\n (current) => !!current.dataset?.locationid,\r\n );\r\n\r\n const sections = DragAndDrop.body?.querySelectorAll('[data-locationid]');\r\n\r\n const emptySectionsId: string[] = [];\r\n\r\n sections?.forEach((sec) => {\r\n if (sec.children.length === 0) {\r\n emptySectionsId.push((sec as HTMLElement).dataset.locationid ?? '');\r\n }\r\n });\r\n\r\n emptySectionsId.forEach((emptySecId) => {\r\n const section = DragAndDrop.body?.querySelector(\r\n `[data-locationid=\"${emptySecId}\"]`,\r\n );\r\n if (section) {\r\n section.setAttribute('style', 'padding: 10px; border:2px dashed #ccc');\r\n }\r\n });\r\n\r\n DragAndDrop.snapshot();\r\n\r\n if (targetPanel) {\r\n DragAndDrop.draggingPanelSectionId =\r\n targetSection?.dataset.locationid ?? '';\r\n DragAndDrop.draggingPanelId = targetPanel.dataset.id as string;\r\n DragAndDrop.draggingPanel = targetPanel;\r\n }\r\n if (DragAndDrop.draggingPanelId === '') {\r\n return;\r\n }\r\n const falseDiv = targetPanel?.cloneNode(true) as HTMLDivElement;\r\n falseDiv.style.opacity = `50%`;\r\n falseDiv.style.width = `100%`;\r\n falseDiv.style.height = `auto`;\r\n falseDiv.style.backgroundColor = `rgba(0,0,0,0.1)`;\r\n falseDiv.className = 'apia_panel_falseDiv';\r\n DragAndDrop.shadowDiv = falseDiv;\r\n }, 0);\r\n}\r\n","/* eslint-disable no-param-reassign */\r\nimport { getSpecificParent } from '@apia/util';\r\nimport { updatePanelPosition } from '../../position/usePanelPosition';\r\nimport { DragAndDrop } from '../util/DragAndDrop';\r\n\r\nexport function Drop(event: Event, DragAndDrop: DragAndDrop) {\r\n if (DragAndDrop.body) {\r\n const ev = event as DragEvent;\r\n const data = ev?.dataTransfer?.getData('text');\r\n\r\n const sections = DragAndDrop.body?.querySelectorAll('[data-locationid]');\r\n\r\n sections.forEach((sec) => {\r\n sec.setAttribute('style', '');\r\n });\r\n\r\n const draggingPanel = DragAndDrop.body.querySelector(\r\n `[data-panel][data-id=\"${DragAndDrop.draggingPanelId}\"]:not(.apia_panel_falseDiv)`,\r\n );\r\n\r\n if (draggingPanel) {\r\n draggingPanel.setAttribute('style', '');\r\n }\r\n const falseDiv = document.querySelector('.apia_panel_falseDiv');\r\n\r\n if (data) {\r\n const child = document.querySelector(\r\n `[data-panel][data-id=\"${data}\"]:not(.apia_panel_falseDiv)`,\r\n );\r\n sections.forEach((sec) => {\r\n if (sec.children.length === 1) {\r\n sec.setAttribute('style', '');\r\n }\r\n });\r\n if (falseDiv) {\r\n const newSection = getSpecificParent(\r\n falseDiv as HTMLElement,\r\n (current) => !!current.dataset.locationid,\r\n );\r\n\r\n if (newSection) {\r\n const panelsArray = Array.from(newSection.children);\r\n const childId = (child as HTMLElement).dataset.id;\r\n\r\n if (childId) {\r\n const index = panelsArray.findIndex(\r\n (panel) => (panel as HTMLElement).dataset.id === childId,\r\n );\r\n\r\n if (typeof index === 'number' && newSection.dataset.locationid) {\r\n void updatePanelPosition(\r\n childId,\r\n newSection.dataset.locationid,\r\n index + 1,\r\n );\r\n }\r\n }\r\n }\r\n falseDiv.replaceWith(child as Node);\r\n }\r\n }\r\n\r\n DragAndDrop.draggingPanelId = '';\r\n DragAndDrop.panelData = [];\r\n DragAndDrop.drawMinimap();\r\n\r\n DragAndDrop.removePlaceholder();\r\n }\r\n}\r\n","import { getSpecificParent } from '@apia/util';\r\nimport { dragleave } from '../events/Dragleave';\r\nimport { dragover } from '../events/Dragover';\r\nimport { dragstart } from '../events/Dragstart';\r\nimport { Drop } from '../events/Drop';\r\nimport { TPanelData, TSectionData } from '../types';\r\n\r\nexport class DragAndDrop {\r\n #unsuscribers: (() => void)[] = [];\r\n\r\n bootstrap = () => {\r\n this.#unsuscribers.forEach((unsuscribe) => unsuscribe());\r\n this.#unsuscribers = [];\r\n\r\n this.body.addEventListener('dragover', this.dragOver);\r\n this.body.addEventListener('drop', this.drop);\r\n this.#unsuscribers.push(() => {\r\n this.body.removeEventListener('dragover', this.dragOver);\r\n this.body.removeEventListener('drop', this.drop);\r\n });\r\n if (this.splash) {\r\n this.splash.addEventListener('dragleave', this.dragLeave);\r\n this.splash.addEventListener('dragenter', this.dragEnter);\r\n this.body.addEventListener('dragenter', this.dragEnter);\r\n this.#unsuscribers.push(() => {\r\n this.splash.removeEventListener('dragleave', this.dragLeave);\r\n this.splash.removeEventListener('dragenter', this.dragEnter);\r\n this.body.removeEventListener('dragenter', this.dragEnter);\r\n });\r\n }\r\n this.panels.map((el) => {\r\n (el as HTMLElement).addEventListener('dragstart', (ev) => {\r\n this.dragStart(ev, el);\r\n });\r\n this.#unsuscribers.push(() => {\r\n (el as HTMLElement).removeEventListener('dragstart', (ev) => {\r\n this.dragStart(ev, el);\r\n });\r\n });\r\n return el;\r\n });\r\n };\r\n panelData: TPanelData[] = [];\r\n minimap: HTMLElement | null = null;\r\n drawMinimap() {\r\n return;\r\n }\r\n timeout = -1;\r\n sectionData: TSectionData[] = [];\r\n body = document.querySelector('[data-layout]') as HTMLElement;\r\n splash = document.querySelector('[data-splash]') as HTMLElement;\r\n dragoverPosition: {\r\n x: string | number;\r\n y: string | number;\r\n } = { x: 0, y: 0 };\r\n shadowDivData: TPanelData | null = null;\r\n shadowDiv: HTMLDivElement | null = null;\r\n placeholderImage: HTMLElement | null = null;\r\n panels = [\r\n ...document.querySelectorAll('[data-panel][data-id]'),\r\n ] as HTMLElement[];\r\n currentScroll = document.scrollingElement?.scrollTop ?? 0;\r\n draggingPanel: HTMLElement | null = null;\r\n draggingPanelId = '';\r\n draggingPanelSectionId = '';\r\n currentBottomPanel: TPanelData | undefined = undefined;\r\n\r\n updateMinimap = () => {\r\n const frameElement = document.querySelector<HTMLElement>('.windowFrame');\r\n if (frameElement) {\r\n frameElement.style.top = `${\r\n (document.scrollingElement?.scrollTop ?? 0) *\r\n Number(frameElement.dataset.aspect)\r\n }px`;\r\n }\r\n };\r\n removePlaceholder = () => {\r\n this.clearTimeout();\r\n const falseDivs = document.querySelectorAll('.apia_panel_falseDiv');\r\n\r\n falseDivs.forEach((el) => {\r\n el.remove();\r\n });\r\n\r\n this.placeholderImage?.remove();\r\n this.placeholderImage = null;\r\n };\r\n clearTimeout = () => {\r\n clearTimeout(this.timeout);\r\n };\r\n debounceAppend = (target: HTMLElement, child: HTMLElement) => {\r\n if (!this.draggingPanelId) return;\r\n if (this.timeout === -1) {\r\n target.appendChild(child);\r\n }\r\n clearTimeout(this.timeout);\r\n this.timeout = setTimeout(() => {\r\n target.appendChild(child);\r\n }, 500) as unknown as number;\r\n };\r\n debounceBefore = (reference: Node, child: Node, container: HTMLElement) => {\r\n if (!this.draggingPanelId) return;\r\n if (this.timeout === -1) container.insertBefore(child, reference);\r\n clearTimeout(this.timeout);\r\n this.timeout = setTimeout(() => {\r\n container.insertBefore(child, reference);\r\n }, 500) as unknown as number;\r\n };\r\n debounceAfter = (child: Node, reference: Node) => {\r\n if (!this.draggingPanelId) return;\r\n if (this.timeout === -1) (reference as HTMLElement).after(child);\r\n clearTimeout(this.timeout);\r\n this.timeout = setTimeout(() => {\r\n (reference as HTMLElement).after(child);\r\n }, 500) as unknown as number;\r\n };\r\n dragOver = (event: Event) => {\r\n dragover(event, this);\r\n this.updateMinimap();\r\n };\r\n dragStart = (ev: DragEvent, el: Element) => {\r\n dragstart(ev, el, this);\r\n };\r\n dragLeave = (_ev: Event) => {\r\n dragleave(_ev, this);\r\n };\r\n dragEnter = (_ev: Event) => {\r\n _ev.preventDefault();\r\n };\r\n drop = (event: Event) => {\r\n Drop(event, this);\r\n };\r\n snapshot = () => {\r\n this.panelData = [];\r\n const innerPanels = (this.body as HTMLElement).querySelectorAll(\r\n '[data-panel][data-id]',\r\n );\r\n innerPanels.forEach((panel) => {\r\n if (panel.classList.contains('apia_panel_falseDiv')) {\r\n this.shadowDivData = {\r\n id: panel.getAttribute('data-id') ?? '',\r\n isShadow: true,\r\n panelBottom:\r\n panel.getBoundingClientRect().bottom + this.currentScroll,\r\n panelTop: panel.getBoundingClientRect().top + this.currentScroll,\r\n panelRight: panel.getBoundingClientRect().right,\r\n panelLeft: panel.getBoundingClientRect().left,\r\n panelWidth: panel.getBoundingClientRect().width,\r\n panelHeight: panel.getBoundingClientRect().height,\r\n row:\r\n getSpecificParent(\r\n panel as HTMLElement,\r\n (current) => !!current.dataset.locationid,\r\n )?.classList.contains('apia_section_row') ?? false,\r\n sectionId:\r\n getSpecificParent(\r\n panel as HTMLElement,\r\n (current) => !!current.dataset.locationid,\r\n )?.dataset.locationid ?? 0,\r\n };\r\n }\r\n if (\r\n this.panelData.every((innerPanel) => {\r\n return (\r\n innerPanel.id !== panel.getAttribute('data-id') &&\r\n !panel.classList.contains('apia_panel_falseDiv')\r\n );\r\n })\r\n ) {\r\n this.panelData.push({\r\n isShadow: panel.classList.contains('apia_panel_falseDiv'),\r\n panelBottom:\r\n panel.getBoundingClientRect().bottom + this.currentScroll,\r\n panelTop: panel.getBoundingClientRect().top + this.currentScroll,\r\n panelRight: panel.getBoundingClientRect().right,\r\n panelLeft: panel.getBoundingClientRect().left,\r\n panelWidth: panel.getBoundingClientRect().width,\r\n panelHeight: panel.getBoundingClientRect().height,\r\n row:\r\n getSpecificParent(\r\n panel as HTMLElement,\r\n (current) => !!current.dataset.locationid,\r\n )?.classList.contains('apia_section_row') ?? false,\r\n sectionId:\r\n getSpecificParent(\r\n panel as HTMLElement,\r\n (current) => !!current.dataset.locationid,\r\n )?.dataset.locationid ?? 0,\r\n id:\r\n getSpecificParent(\r\n panel as HTMLElement,\r\n (current) => !!current.dataset.id,\r\n )?.dataset.id ?? 0,\r\n });\r\n }\r\n });\r\n this.sectionData = [];\r\n const sections = this.body?.querySelectorAll('[data-locationid]');\r\n\r\n sections?.forEach((sec) => {\r\n if (\r\n this.sectionData.every(\r\n (innerSection) =>\r\n innerSection.sectionId !== sec.getAttribute('data-locationid'),\r\n )\r\n ) {\r\n this.sectionData.push({\r\n sectionBottom:\r\n sec.getBoundingClientRect().bottom + this.currentScroll,\r\n sectionLeft: sec.getBoundingClientRect().left,\r\n sectionTop: sec.getBoundingClientRect().top + this.currentScroll,\r\n sectionRight: sec.getBoundingClientRect().right,\r\n sectionWidth: sec.getBoundingClientRect().width,\r\n sectionHeight: sec.getBoundingClientRect().height,\r\n sectionId:\r\n getSpecificParent(\r\n sec as HTMLElement,\r\n (current) => !!current.dataset.locationid,\r\n )?.dataset.locationid ?? 0,\r\n });\r\n }\r\n });\r\n\r\n this.drawMinimap();\r\n };\r\n findBottomPanel = (x: number, y: number) => {\r\n const bottomPanel = this.panelData.find((panel) => {\r\n return (\r\n panel.panelBottom >= y &&\r\n panel.panelTop <= y &&\r\n panel.panelLeft <= x &&\r\n panel.panelRight >= x\r\n );\r\n });\r\n return bottomPanel;\r\n };\r\n findBottomSection = (x: number, y: number) => {\r\n const bottomSection = this.sectionData.find((sec) => {\r\n return (\r\n sec.sectionBottom >= y &&\r\n sec.sectionTop <= y &&\r\n sec.sectionLeft <= x &&\r\n sec.sectionRight >= x\r\n );\r\n });\r\n return bottomSection;\r\n };\r\n}\r\n","/* eslint-disable @typescript-eslint/prefer-for-of */\r\nimport { EventEmitter, useMount } from '@apia/util';\r\nimport { useRef } from 'react';\r\nimport { shallowEqual } from 'react-redux';\r\n\r\nexport type TSwitchRoute = {\r\n /**\r\n * El callback será llamado si la ruta coincide.\r\n */\r\n callback: (result: RegExpMatchArray) => unknown;\r\n route: RegExp;\r\n};\r\n\r\nexport type TUseSwitch = TSwitchRoute[];\r\n\r\nexport class Router extends EventEmitter<{ newRoute: string }> {\r\n #matchLocation = (regexp: RegExp) => {\r\n const path =\r\n '/' +\r\n (window.location.href\r\n .replaceAll('%20', ' ')\r\n .match(new RegExp(`${window.CONTEXT}/?([^?]+)?(?:\\\\?.*)?`))?.[1] ?? '');\r\n\r\n return path.match(regexp);\r\n };\r\n\r\n constructor() {\r\n super();\r\n\r\n window.addEventListener('popstate', () => {\r\n this.emit('newRoute', window.location.href);\r\n });\r\n }\r\n\r\n #evalRoutes = (routes: TUseSwitch) => {\r\n for (let i = 0; i < routes.length; i++) {\r\n const match = this.#matchLocation(routes[i].route);\r\n if (match) {\r\n return { route: routes[i], match };\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Se evaluarán las rutas en orden y la primera en coincidir será tomada como\r\n * resultado del cambio de ruta.\r\n *\r\n * Las rutas provistas deberán matchear contra el path actual. El path actual\r\n * es la porción de la ruta luego del dominio y el contexto. Ejemplo:\r\n *\r\n * http://localhost/apia => path='/'\r\n * http://localhost/apia/spa/categories/comidas/1 => path='/spa/categories/comidas/1'\r\n */\r\n useSwitch = (routes: TUseSwitch) => {\r\n const lastMatch = useRef<TSwitchRoute | null>(null);\r\n\r\n useMount(() => {\r\n const result = this.#evalRoutes(routes);\r\n if (result) {\r\n result.route.callback(result.match);\r\n }\r\n\r\n return this.on('newRoute', () => {\r\n const result = this.#evalRoutes(routes);\r\n if (result && !shallowEqual(result.match, lastMatch.current)) {\r\n result.route.callback(result.match);\r\n }\r\n });\r\n });\r\n };\r\n}\r\n","import { EventEmitter, useMount } from '@apia/util';\r\nimport { ReactNode, ReactPortal, useDeferredValue, useState } from 'react';\r\nimport { PanelContainer } from '../types';\r\nimport { DefaultPanelWrapper } from '../splash/panels/DefaultPanelWrapper';\r\nimport { DashboardPanelsBootstraper } from './DashboardPanelsBootstraper';\r\nimport { DashboardContext } from './DashboardContext';\r\nimport { DashboardPanel } from './DashboardPanel';\r\nimport { DragAndDrop } from '../splash/util/DragAndDrop';\r\nimport { eventsController } from '../eventsController';\r\nimport { Router } from './DashboardRouter';\r\n\r\nexport class Dashboard extends EventEmitter<{\r\n changeScene: string;\r\n}> {\r\n bootstrapper = new DashboardPanelsBootstraper(this);\r\n panels: Record<string, DashboardPanel> | null = null;\r\n router = new Router();\r\n scenes: Record<string, string[]> = {};\r\n\r\n #currentScene = '/';\r\n #dragAndDrop = new DragAndDrop();\r\n #PanelContainer: PanelContainer = DefaultPanelWrapper;\r\n #panelsRenderedPortals: ReactPortal[] = [];\r\n\r\n getPanel = (id: string) => this.panels?.[id] as DashboardPanel;\r\n getPanelByName = (name: string) =>\r\n Object.values(this.panels ?? {}).find(\r\n (current) => current.props.name === name,\r\n );\r\n\r\n #loadPanels = () => {\r\n this.panels = {};\r\n\r\n const panelsElements = document.querySelectorAll(\r\n '[data-panel]',\r\n ) as NodeListOf<HTMLElement>;\r\n\r\n Array.from(panelsElements).forEach((current) => {\r\n const panel = new DashboardPanel({\r\n dashboard: this,\r\n PanelContainer: this.#PanelContainer,\r\n id: current.dataset.id as string,\r\n });\r\n\r\n let panelPath = (panel.getParameters().PAR_SPA_PATH as string) || '*';\r\n if (panelPath === '/') panelPath = `/${this.urlContext}`;\r\n if (panelPath !== '*') panel.hide();\r\n else panel.show();\r\n\r\n const paths = panelPath.split(',');\r\n paths.forEach((currentPath) => {\r\n if (!this.scenes[currentPath]) this.scenes[currentPath] = [];\r\n this.scenes[currentPath].push(panel.props.id);\r\n });\r\n\r\n (this.panels as Record<string, DashboardPanel>)[panel.props.id] = panel;\r\n\r\n this.#panelsRenderedPortals.push(panel.portal);\r\n });\r\n\r\n this.#dragAndDrop.bootstrap();\r\n };\r\n\r\n #Context = ({ children }: { children: ReactNode }) => {\r\n return (\r\n <DashboardContext.Provider value={this}>\r\n {children}\r\n </DashboardContext.Provider>\r\n );\r\n };\r\n\r\n #suscribeToEvents = () => {\r\n eventsController.onEvent({ eventType: 'dashboard__focus' }, () => {\r\n Object.values(this.panels ?? {}).forEach((current) => {\r\n if (current.props.refreshOnHome) {\r\n void current.refresh();\r\n }\r\n });\r\n });\r\n };\r\n #usePanelsList = () => {\r\n const [panels, setPanels] = useState<ReactNode>(null);\r\n const deferredPanels = useDeferredValue(panels);\r\n\r\n useMount(() => {\r\n this.loadScene();\r\n setPanels(this.#panelsRenderedPortals);\r\n });\r\n\r\n this.router.useSwitch([\r\n {\r\n route: new RegExp(`(?:/spa)?/(\\\\w+)`),\r\n callback: (result) => {\r\n console.log('Dashboard', { scene: result[1] });\r\n this.loadScene(result[1]);\r\n },\r\n },\r\n {\r\n route: new RegExp(`/`),\r\n callback: () => {\r\n console.log('Dashboard', { noScene: '/' });\r\n this.loadScene('/');\r\n },\r\n },\r\n ]);\r\n\r\n return deferredPanels;\r\n };\r\n\r\n constructor(\r\n panelsContainer: PanelContainer = DefaultPanelWrapper,\r\n public urlContext: string,\r\n ) {\r\n super();\r\n\r\n this.#currentScene = `/`;\r\n this.#PanelContainer = panelsContainer ?? this.#PanelContainer;\r\n this.#suscribeToEvents();\r\n }\r\n\r\n #SceneRenderer = () => {\r\n const Context = this.#Context;\r\n const panels = this.#usePanelsList();\r\n\r\n return <Context>{panels}</Context>;\r\n };\r\n\r\n loadScene = (scene: string = this.#currentScene): ReactPortal[] => {\r\n let actualScene = scene;\r\n if (!actualScene.startsWith('/')) actualScene = `/${actualScene}`;\r\n\r\n if (!this.panels) this.#loadPanels();\r\n if (!this.scenes[actualScene]) this.scenes[actualScene] = [];\r\n\r\n this.scenes[this.#currentScene].forEach((scenePanelId) => {\r\n if (!this.scenes[actualScene].includes(scenePanelId))\r\n this.panels?.[scenePanelId]?.hide();\r\n });\r\n this.scenes[actualScene].forEach((scenePanelIds) => {\r\n const panel = this.panels?.[scenePanelIds];\r\n if (panel) {\r\n panel.show();\r\n if (panel.hasInited && panel.props.refreshOnStart) void panel.refresh();\r\n }\r\n });\r\n\r\n this.#currentScene = actualScene;\r\n\r\n return this.#panelsRenderedPortals;\r\n };\r\n\r\n Component = () => {\r\n const R = this.#SceneRenderer;\r\n return <R />;\r\n };\r\n}\r\n","import { shallowEqual } from 'react-redux';\r\nimport { usePanelIdentity } from '../common';\r\nimport { TPanelName } from '../types';\r\nimport { TPanelParameter, useParametersSelector } from './parametersStore';\r\nimport { useDashboardContext } from '../dashboard';\r\n\r\nexport type TParametersSelector<Selected> = (\r\n parameters: Record<string, TPanelParameter>,\r\n) => Selected;\r\n\r\n/**\r\n // eslint-disable-next-line comment-length/limit-multi-line-comments\r\n * Este hook permite seleccionar parámetros de un panel. Cada vez que los\r\n * parámetros del panel sean actualizados, se llamará a la función selector y en\r\n * caso de que la selección actual de parámetros difiera de la anterior, se\r\n * provocará un renderizado en el componente que lo utiliza.\r\n *\r\n * Si se quiere obtener los parámetros del panel en el que se está trabajando,\r\n * el segundo parámetro es innecesario. En caso de querer obtener los\r\n * parámetros de otro panel, se puede pasar su nombre como segundo parámetro y\r\n * la selección se hará de acuerdo a los parámetros de éste.\r\n *\r\n * Es importante ver que es imposible prever qué parámetros tendrá cada panel,\r\n * por ello el tipo entregado al selector es Record, que puede entenderse como\r\n * un mapa de entradas con clave string y valor TPanelParameter = string |\r\n * boolean | number.\r\n */\r\nexport function usePanelParametersSelector<Selected>(\r\n selector: TParametersSelector<Selected>,\r\n panelName?: TPanelName,\r\n) {\r\n const { panelId } = usePanelIdentity();\r\n const dashboard = useDashboardContext();\r\n const id =\r\n panelName !== undefined\r\n ? dashboard.getPanelByName(panelName)?.id ?? ''\r\n : panelId;\r\n\r\n return useParametersSelector((global) => {\r\n const currentParams = global.panelParameters[id];\r\n return selector(currentParams ?? {});\r\n }, shallowEqual);\r\n}\r\n","import { parametersStore, usePanelParametersSelector } from '../config';\r\nimport { parametersActions } from '../config/parametersStore';\r\n\r\nconst panelActionParameterName = '__panelTitleAction';\r\nconst panelImageParameterName = '__panelImageAction';\r\nconst panelDescriptionParameterName = '__panelTitleDescription';\r\n\r\nexport function setPanelTitleAction(panelId: string, newAction: string) {\r\n parametersStore.dispatch(\r\n parametersActions.udpate({\r\n panelId,\r\n parameters: { [panelActionParameterName]: newAction },\r\n }),\r\n );\r\n}\r\nexport function setPanelTitleDescritpion(\r\n panelId: string,\r\n newDescription: string,\r\n) {\r\n parametersStore.dispatch(\r\n parametersActions.udpate({\r\n panelId,\r\n parameters: { [panelDescriptionParameterName]: newDescription },\r\n }),\r\n );\r\n}\r\nexport function setPanelImageAction(panelId: string, newImage: string) {\r\n parametersStore.dispatch(\r\n parametersActions.udpate({\r\n panelId,\r\n parameters: { [panelImageParameterName]: newImage },\r\n }),\r\n );\r\n}\r\n\r\nexport function usePanelTitleAction() {\r\n return usePanelParametersSelector(\r\n (current) => current[panelActionParameterName] as string,\r\n );\r\n}\r\n\r\nexport function usePanelImage() {\r\n return usePanelParametersSelector(\r\n (current) => current[panelImageParameterName] as string,\r\n );\r\n}\r\n\r\nexport function usePanelTitleDescription() {\r\n return usePanelParametersSelector(\r\n (current) => current[panelDescriptionParameterName] as string,\r\n );\r\n}\r\n","import { ApiaApi, makeApiaUrl } from '@apia/api';\r\nimport {\r\n TActionDispatcherOptions,\r\n TActionResult,\r\n TFooter,\r\n panelActionsEmitter,\r\n} from './usePanelActions';\r\nimport { panelNetworkStateEmitter } from './usePanelNetworkState';\r\nimport { changePanelTitle } from '../panelsUtil';\r\nimport { ucfirst } from '@apia/util';\r\nimport { changePanelFooter } from '../splash/panels/PanelContext/usePanelFooter';\r\nimport {\r\n setPanelImageAction,\r\n setPanelTitleAction,\r\n setPanelTitleDescritpion,\r\n} from '../panelsUtil/usePanelTitleAction';\r\nimport { startTransition } from 'react';\r\n\r\nexport type TOnSucceed = (hasSucceed: boolean, data: TActionResult) => unknown;\r\n\r\n/**\r\n * **MÉTODO DE USO INTERNO**\r\n *\r\n * LLama al server para ejecutar una acción iniciada en el cliente.\r\n *\r\n * La forma de llamar acciones desde un panel es con el hook usePanelActions.\r\n */\r\nexport function firePanelAction(\r\n panelId: string,\r\n action: string,\r\n parameters?: Record<string, unknown>,\r\n options?: TActionDispatcherOptions,\r\n) {\r\n const postData = { p_action: action, ...parameters };\r\n panelActionsEmitter.emit(panelId, `pre${ucfirst(action)}`, null);\r\n void ApiaApi.post(\r\n makeApiaUrl({\r\n action: 'panelAction',\r\n pnlId: panelId,\r\n }),\r\n { postData, postDataTreatement: 'stringify', ...options?.requestConfig },\r\n )\r\n .then((result) => {\r\n if (result?.status !== 200) {\r\n console.log('ERROR', panelId);\r\n panelNetworkStateEmitter.emit('stateChange', {\r\n panelId,\r\n isConnected: false,\r\n });\r\n } else {\r\n panelNetworkStateEmitter.emit('stateChange', {\r\n panelId,\r\n isConnected: true,\r\n });\r\n }\r\n try {\r\n if (result) {\r\n startTransition(() => {\r\n if (result?.data?.title) {\r\n changePanelTitle(\r\n panelId,\r\n (result as TActionResult<{ title: string }>)?.data\r\n ?.title as string,\r\n );\r\n }\r\n if (result?.data?.footer) {\r\n changePanelFooter(\r\n panelId,\r\n (result as TActionResult<{ footer: TFooter }>)?.data\r\n ?.footer as TFooter,\r\n );\r\n }\r\n if (result?.data?.titleAction) {\r\n setPanelTitleAction(panelId, result?.data?.titleAction as string);\r\n }\r\n if (result?.data?.image) {\r\n setPanelImageAction(panelId, result?.data?.image as string);\r\n }\r\n if (result?.data?.titleDescription) {\r\n setPanelTitleDescritpion(\r\n panelId,\r\n result?.data?.titleDescription as string,\r\n );\r\n }\r\n options?.onComplete?.(true, result);\r\n panelActionsEmitter.emit(panelId, action, result);\r\n });\r\n } else options?.onComplete?.(false, null);\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n })\r\n .catch((e) => {\r\n console.error(e);\r\n panelNetworkStateEmitter.emit('stateChange', {\r\n panelId,\r\n isConnected: false,\r\n });\r\n options?.onComplete?.(false, null);\r\n });\r\n}\r\n","import { ApiaApi } from '@apia/api';\r\nimport { KeyboardEvent, MouseEvent } from 'react';\r\nimport { firePanelAction } from './firePanelAction';\r\n\r\nexport type TActionBehavior =\r\n | 'DO_NOTHING'\r\n | 'NAVIGATE_URL'\r\n | 'CALL_AJAX_URL'\r\n | 'RUN_ACTION'\r\n | 'OPEN_TAB';\r\n\r\nexport type TActionSource = 'CLICK' | 'DOUBLE_CLICK';\r\n\r\nexport type TBasicAction = {\r\n action: string;\r\n actionBehavior: TActionBehavior;\r\n actionSource: TActionSource;\r\n actionNewTabTitle: string;\r\n text: string;\r\n};\r\n\r\ninterface ITabsController {\r\n openTabByUrl(title: string, url: string): void;\r\n}\r\n\r\nexport function handleAction(\r\n panelId: string,\r\n event: KeyboardEvent | MouseEvent,\r\n action: TBasicAction,\r\n) {\r\n if (\r\n (event.type === 'dblclick' && action.actionSource === 'DOUBLE_CLICK') ||\r\n ((event.type === 'click' || event.type === 'mousedown') &&\r\n action.actionSource === 'CLICK') ||\r\n (event.type === 'keydown' && (event as KeyboardEvent).code === 'Enter')\r\n ) {\r\n if (action?.action) {\r\n switch (action.actionBehavior) {\r\n case 'CALL_AJAX_URL':\r\n void ApiaApi.post(action.action, { handleLoad: true });\r\n break;\r\n case 'DO_NOTHING':\r\n break;\r\n case 'NAVIGATE_URL':\r\n window.location.assign(action.action);\r\n break;\r\n case 'OPEN_TAB':\r\n (\r\n window.top as unknown as { tabsController: ITabsController }\r\n )?.tabsController.openTabByUrl(\r\n action.actionNewTabTitle || action.text,\r\n action.action,\r\n );\r\n break;\r\n case 'RUN_ACTION':\r\n firePanelAction(\r\n panelId,\r\n action.action,\r\n {},\r\n { requestConfig: { handleLoad: true\r\n \r\n } },\r\n );\r\n break;\r\n default:\r\n console.error('Unknown action behavior: ', action);\r\n }\r\n }\r\n }\r\n}\r\n","import { firePanelAction } from './firePanelAction';\r\nimport { TExternalActionDispatcher } from './usePanelActions';\r\n\r\nexport const externalFirePanelAction: TExternalActionDispatcher = (\r\n panelId,\r\n { action, ...parameters },\r\n options,\r\n) => {\r\n const postData: Record<string, unknown> = {};\r\n\r\n Object.entries(parameters).forEach(([name, value]) => {\r\n postData[`p_${name}`] = value;\r\n });\r\n\r\n firePanelAction(panelId, action, postData, options);\r\n};\r\n","import { useState } from 'react';\r\nimport { usePanelActions } from './usePanelActions';\r\n\r\nexport function usePanelIsLoading() {\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n usePanelActions({\r\n preRefresh: () => setIsLoading(true),\r\n refresh: () => setIsLoading(false),\r\n });\r\n\r\n return isLoading;\r\n}\r\n","import { Icon } from '@apia/icons';\r\nimport { getLabel } from '@apia/util';\r\nimport { usePanelNetworkState } from '../../../actions';\r\n\r\nexport const NetworkState = ({ title }: { title: string }) => {\r\n const isConnected = usePanelNetworkState();\r\n return (\r\n <>\r\n {!isConnected && (\r\n <Icon\r\n tabIndex={0}\r\n title={\r\n getLabel('lblTestDBNoOk', {\r\n text: {\r\n TOK1: title,\r\n },\r\n }).text\r\n }\r\n aria-label={\r\n getLabel('lblTestDBNoOk', {\r\n text: {\r\n TOK1: title,\r\n },\r\n }).text\r\n }\r\n name=\"Alert\"\r\n />\r\n )}\r\n </>\r\n );\r\n};\r\n","import { PanelContainer } from '../../types';\r\nimport { NetworkState } from './DefaultPanelWrapper/NetworkState';\r\nimport { usePanelIdentity } from '../../common';\r\nimport { PanelContextProvider, useMakePanelContext } from './PanelContext';\r\nimport { PanelFooter } from './PanelContext/PanelFooter';\r\nimport {\r\n usePanelTitleAction,\r\n usePanelTitleDescription,\r\n} from '../../panelsUtil/usePanelTitleAction';\r\nimport { useDashboardContext } from '../../dashboard/DashboardContext';\r\n\r\nexport const LandingPagePanelWrapper: PanelContainer = ({\r\n children,\r\n ...props\r\n}) => {\r\n const { panelId, panelName, panelType } = usePanelIdentity();\r\n\r\n const { contextValue, title, ref, ...footerProps } = useMakePanelContext(\r\n panelId,\r\n props,\r\n );\r\n\r\n const panelTitleAction = usePanelTitleAction();\r\n const panelTitleDescription = usePanelTitleDescription();\r\n\r\n const dashboard = useDashboardContext();\r\n\r\n if (dashboard.getPanel(panelId).props.hasRss)\r\n console.log(dashboard.getPanel(panelId).props);\r\n\r\n return (\r\n <PanelContextProvider value={contextValue}>\r\n <div\r\n className=\"panel__container\"\r\n data-panelname={panelName}\r\n data-paneltype={panelType}\r\n data-panelid={panelId}\r\n ref={ref}\r\n >\r\n <div className=\"panel__header\">\r\n <div className=\"panel__header__left\">\r\n {props.showTitle && (\r\n <span className=\"panel__title\">\r\n {panelTitleAction ? (\r\n <a\r\n title={panelTitleDescription}\r\n className=\"panel__title__link\"\r\n href={panelTitleAction}\r\n >\r\n {title}\r\n </a>\r\n ) : (\r\n title\r\n )}\r\n </span>\r\n )}\r\n <NetworkState title={title} />\r\n </div>\r\n </div>\r\n <div className=\"panel__content\">{children}</div>\r\n <PanelFooter isRefreshable={false} {...footerProps} />\r\n </div>\r\n </PanelContextProvider>\r\n );\r\n};\r\n","/* eslint-disable @typescript-eslint/ban-types */\r\n/* eslint-disable @typescript-eslint/no-unsafe-argument */\r\n/* eslint-disable no-restricted-imports */\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\r\nimport {\r\n createSlice,\r\n injectReducers,\r\n PayloadAction,\r\n Draft,\r\n SliceCaseReducers,\r\n CaseReducer,\r\n} from '@apia/store';\r\nimport { TPanelId, TPanelType } from '../types';\r\n\r\ntype ValidateSliceCaseReducers<S, ACR extends SliceCaseReducers<S>> = ACR & {\r\n [T in keyof ACR]: ACR[T] extends {\r\n reducer(s: S, action?: infer A): any;\r\n }\r\n ? {\r\n prepare(...a: never[]): Omit<A, 'type'>;\r\n }\r\n : {};\r\n};\r\n\r\nexport type TPanelsSliceState = Record<string, Record<string, unknown>>;\r\n\r\nexport type TReducers<\r\n State = any,\r\n CR extends SliceCaseReducers<State> = SliceCaseReducers<State>,\r\n> = ValidateSliceCaseReducers<State, CR>;\r\n\r\ntype TPanelsReducers<\r\n State = any,\r\n CR extends SliceCaseReducers<State> = SliceCaseReducers<State>,\r\n> = Record<string, TReducers<State, CR>>;\r\n\r\n/**\r\n * Los updaters son funciones que permiten modificar la forma en la que un\r\n * panel modifica su estado, se puede pensar como un análogo del reducer\r\n *\r\n * {\r\n * panelTypeA: {\r\n * updaterA: (state, data) => { ...update panel store },\r\n * updaterB: (state, data) => { ...update panel store },\r\n * }\r\n * }\r\n */\r\nexport const reducers: TPanelsReducers<Record<string, unknown>> = {};\r\n\r\nexport function initPanelTypeUpdater(panelType: TPanelType) {\r\n if (!reducers[panelType]) {\r\n reducers[panelType] = {\r\n defaultReducer: (\r\n panelsState,\r\n payload: PayloadAction<{ name: string }>,\r\n ) => {\r\n Object.assign(panelsState, payload);\r\n },\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Permite registrar nuevas formas de actualizar el estado de un tipo de panel\r\n */\r\nexport function registerReducers<\r\n State = any,\r\n CR extends SliceCaseReducers<State> = SliceCaseReducers<State>,\r\n>(panelType: TPanelType, newReducers: TReducers<State, CR>) {\r\n initPanelTypeUpdater(panelType);\r\n Object.assign(reducers[panelType], newReducers);\r\n}\r\n\r\nexport function initPanelState(\r\n state: Draft<TPanelsSliceState>,\r\n panelType: TPanelType,\r\n panelId: TPanelId,\r\n initialState: any,\r\n) {\r\n if (!state[panelType]) {\r\n state[panelType] = {};\r\n }\r\n if (!state[panelType][panelId]) state[panelType][panelId] = {};\r\n state[panelType][panelId] = initialState;\r\n}\r\n\r\nexport const panelsSlice = createSlice({\r\n name: 'panelsSlice',\r\n initialState: {} as TPanelsSliceState,\r\n reducers: {\r\n initState(\r\n state,\r\n {\r\n payload: { panelId, panelType, initialState },\r\n }: PayloadAction<{\r\n panelType: TPanelType;\r\n panelId: TPanelId;\r\n reducer?: string; // reducer will be used to customize the way the slice is updated\r\n initialState: any;\r\n }>,\r\n ) {\r\n if (!state[panelType]?.[panelId]) {\r\n initPanelState(state, panelType, panelId, initialState);\r\n state[panelType][panelId] = initialState;\r\n }\r\n },\r\n updatePanelStore(\r\n state,\r\n {\r\n payload: { data, panelId, panelType, reducer, initialState },\r\n }: PayloadAction<{\r\n panelType: TPanelType;\r\n panelId: TPanelId;\r\n reducer?: string; // Updater will be used to customize the way the slice is updated\r\n data: any;\r\n initialState?: any;\r\n }>,\r\n ) {\r\n if (!state[panelType]?.[panelId]) {\r\n initPanelState(state, panelType, panelId, initialState ?? {});\r\n }\r\n const panelsStore = state[panelType][panelId];\r\n initPanelTypeUpdater(panelType);\r\n\r\n if (!reducers[panelType][reducer ?? 'default']) {\r\n return;\r\n }\r\n\r\n const currentReducer = reducers[panelType][\r\n reducer ?? 'default'\r\n ] as CaseReducer;\r\n currentReducer(panelsStore, data);\r\n },\r\n },\r\n});\r\n\r\nexport const { useSelector: usePanelStoreSelector, store: panelsStore } =\r\n injectReducers({\r\n panelsSlice: panelsSlice.reducer,\r\n });\r\n\r\nexport const panelsActions = panelsSlice.actions;\r\n","import { shallowEqual } from '@apia/store';\r\nimport { useRef, useState } from 'react';\r\nimport { TPanelName, TPanelType } from '../types';\r\nimport { panelsStore, usePanelStoreSelector } from './panelsStore';\r\nimport { usePanelIdentity } from '../common';\r\n\r\nexport const undefinedObject = {};\r\n\r\n/**\r\n * Permite escuchar el store de un panel al igual que se haría con un\r\n * useSelector de redux.\r\n *\r\n * @param selector Una función selectora que recibe el estado del panel y devuelve la selección deseada\r\n * @param comparator Opcionalmente se puede pasar un comparador para determinar si el estado debe actualizarse o no, dependiendo de la selección actual y la selección previa. Por defecto se usa shallowEqual de redux.\r\n * @returns La selección determinada en el selector, siempre que haya cambiado de acuerdo al comparador.\r\n *\r\n * @example\r\n *\r\n import { TRecordsPanelStore } from '..../recordsPanel';\r\n\r\n // Assume TRecordsPanelStore = { peopleNames: string[] }\r\n\r\n const firstName = usePanelSelector<TRecordsPanelStore>(\r\n 'RecordsPanel',\r\n 'RecordThisYear',\r\n (state) => { return state.peopleNames[0] }\r\n );\r\n */\r\nexport function usePanelSelector<StoreType, Selected>(\r\n panelType: TPanelType,\r\n panelName: TPanelName,\r\n initialState: StoreType,\r\n selector: (state: StoreType) => Selected,\r\n comparator: (a: Selected, b: Selected) => boolean = shallowEqual,\r\n): Selected {\r\n const { panelId } = usePanelIdentity();\r\n if (!panelId) throw new Error(`Cannot find panel with name ${panelName}`);\r\n\r\n const storeState = panelsStore.getState().panelsSlice[panelType];\r\n const [selection, setSelection] = useState<Selected>(\r\n initialState\r\n ? selector((storeState?.[panelId] as StoreType) ?? initialState)\r\n : ({} as Selected),\r\n );\r\n\r\n const previousSelected = useRef<Selected>(\r\n selection ?? (undefinedObject as Selected),\r\n );\r\n\r\n usePanelStoreSelector((global) => {\r\n const newState = global.panelsSlice[panelType]?.[panelId] as\r\n | StoreType\r\n | undefined;\r\n if (newState !== undefined) {\r\n const newSelected = selector(newState);\r\n if (\r\n previousSelected.current === undefinedObject ||\r\n !comparator(previousSelected.current as Selected, newSelected)\r\n ) {\r\n previousSelected.current = newSelected;\r\n setSelection(newSelected);\r\n }\r\n }\r\n });\r\n\r\n return selection;\r\n}\r\n","/* eslint-disable @typescript-eslint/no-unsafe-assignment */\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { SliceCaseReducers, shallowEqual } from '@apia/store';\r\nimport { useLatest } from '@apia/util';\r\nimport { useEffect, useMemo } from 'react';\r\nimport { TLoadedPanelProps, TPanelName, TPanelType } from '../types';\r\nimport { panelsActions, panelsStore, registerReducers } from './panelsStore';\r\nimport { usePanelSelector } from './usePanelSelector';\r\nimport { usePanelIdentity } from '../common';\r\nimport { useDashboardContext } from '../dashboard';\r\n\r\ndeclare type ActionCreatorForCaseReducer<CR> = CR extends (\r\n state: any,\r\n action: infer Action,\r\n) => any\r\n ? Action extends {\r\n payload: infer P;\r\n }\r\n ? (payload: P, panelName?: string) => unknown\r\n : () => unknown\r\n : () => unknown;\r\n\r\ntype CaseReducerActions<CaseReducers extends SliceCaseReducers<any>> = {\r\n [Type in keyof CaseReducers]: ActionCreatorForCaseReducer<CaseReducers[Type]>;\r\n};\r\n\r\nexport function createPanelStore<\r\n PanelState = any,\r\n Reducers extends SliceCaseReducers<PanelState> = SliceCaseReducers<PanelState>,\r\n>(\r\n panelType: TPanelType,\r\n initialState: PanelState,\r\n reducers: Reducers,\r\n): [\r\n () => CaseReducerActions<Reducers>,\r\n <Selected>(\r\n panelName: TPanelName,\r\n selector: (state: PanelState) => Selected,\r\n comparator?: (a: Selected, b: Selected) => boolean,\r\n ) => Selected,\r\n] {\r\n const useSelector = <Selected>(\r\n panelName: TPanelName,\r\n selector: (state: PanelState) => Selected,\r\n comparator: (a: Selected, b: Selected) => boolean = shallowEqual,\r\n ): Selected => {\r\n const dashboard = useDashboardContext();\r\n const props = useMemo(\r\n () => dashboard.getPanelByName(panelName)?.props as TLoadedPanelProps,\r\n [dashboard, panelName],\r\n );\r\n\r\n const propsRef = useLatest(props);\r\n\r\n useEffect(() => {\r\n panelsStore.dispatch(\r\n panelsActions.initState({\r\n panelType,\r\n panelId: propsRef.current.id,\r\n initialState,\r\n }),\r\n );\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return usePanelSelector<PanelState, Selected>(\r\n panelType,\r\n panelName,\r\n initialState,\r\n selector,\r\n comparator,\r\n );\r\n };\r\n\r\n registerReducers<PanelState>(panelType, reducers);\r\n\r\n /**\r\n * Devuelve un objeto de dispatchers asociados al panel. Este hook puede ser\r\n * exportado pero es importante comprender su funcionamiento: cuando es usado\r\n * acepta un segundo parámetro opcional panelName que en caso de no ser\r\n * pasado, utilizará el del contexto del panel desde el que se ejecuta.\r\n */\r\n const usePanelDispatcher = () => {\r\n const { panelName: contextPanelName } = usePanelIdentity();\r\n const dispatchers: CaseReducerActions<Reducers> =\r\n {} as CaseReducerActions<Reducers>;\r\n const dashboard = useDashboardContext();\r\n\r\n Object.entries(reducers).forEach(([name]) => {\r\n dispatchers[name as keyof typeof dispatchers] = ((\r\n payload: any,\r\n panelName?: TPanelName,\r\n ) => {\r\n const props = dashboard.getPanelByName(panelName ?? contextPanelName)\r\n ?.props as TLoadedPanelProps;\r\n\r\n panelsStore.dispatch(\r\n panelsActions.updatePanelStore({\r\n panelId: props.id,\r\n panelType,\r\n data: { payload },\r\n reducer: name,\r\n }),\r\n );\r\n }) as any;\r\n });\r\n\r\n return dispatchers;\r\n };\r\n\r\n return [usePanelDispatcher, useSelector];\r\n}\r\n"],"names":["__publicField","parametersStore","__privateAdd","__privateGet","__privateSet","Error","PanelContainer","DragAndDrop","bottomPanel","draggingPanel","bottomSection","result","useParametersSelector","panelsStore","shallowEqual"],"mappings":";;;;;;;;;;;AAGa,MAAA,sBAAA,GAAyB,cAEpC,KAAS,CAAA,EAAA;AAUJ,MAAM,kBAAkB,CAAC;AAAA,EAC9B,QAAA;AAAA,EACA,IAAA;AAAA,EACA,EAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AACF,CAA6B,KAAA;AAC3B,EAAM,MAAA,YAAA,GAAiC,QAAQ,MAAM;AACnD,IAAO,OAAA,EAAE,WAAW,IAAM,EAAA,OAAA,EAAS,IAAI,UAAY,EAAA,KAAA,EAAO,WAAW,IAAK,EAAA,CAAA;AAAA,GAE5E,EAAG,EAAE,CAAA,CAAA;AAEL,EAAA,2BACG,sBAAuB,CAAA,QAAA,EAAvB,EAAgC,KAAA,EAAO,cACrC,QACH,EAAA,CAAA,CAAA;AAEJ;;AC1BO,SAAS,gBAAmB,GAAA;AACjC,EAAM,MAAA,OAAA,GAAU,WAAW,sBAAsB,CAAA,CAAA;AAEjD,EAAA,IAAI,CAAC,OAAA;AACH,IAAM,MAAA,IAAI,MAAM,uDAAuD,CAAA,CAAA;AAEzE,EAAO,OAAA,OAAA,CAAA;AACT;;ACRA,MAAM,6BAA6B,YAMhC,CAAA;AAAC,CAAA;AAES,MAAA,oBAAA,GAAuB,IAAI,oBAAqB,EAAA,CAAA;AAMtD,SAAS,gBAAmB,GAAA;AACjC,EAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,gBAAiB,EAAA,CAAA;AAErC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAG7B,EAAA,CAAA;AAEH,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAO,oBAAqB,CAAA,EAAA,CAAG,aAAe,EAAA,CAAC,EAAO,KAAA;AACpD,MAAA,IAAI,GAAG,OAAY,KAAA,OAAA;AACjB,QAAA,WAAA,CAAY,EAAE,WAAa,EAAA,EAAA,CAAG,aAAa,QAAU,EAAA,EAAA,CAAG,aAAa,CAAA,CAAA;AAAA,KACxE,CAAA,CAAA;AAAA,GACH,EAAG,CAAC,OAAO,CAAC,CAAA,CAAA;AAEZ,EAAO,OAAA,QAAA,CAAA;AACT,CAAA;AAEsB,eAAA,mBAAA,CACpB,OACA,EAAA,WAAA,EACA,WACA,EAAA;AACA,EAAM,MAAA,MAAA,GAAS,MAAM,OAAQ,CAAA,IAAA;AAAA,IAC3B,WAAY,CAAA;AAAA,MACV,MAAQ,EAAA,WAAA;AAAA,MACR,KAAO,EAAA,OAAA;AAAA,MACP,WAAA;AAAA,MACA,WAAA;AAAA,KACD,CAAA;AAAA,GACH,CAAA;AAEA,EAAA,MAAM,aAAa,MAAQ,EAAA,IAAA,IAAQ,CAAC,MAAO,CAAA,QAAA,IAAY,CAAC,MAAO,CAAA,WAAA,CAAA;AAE/D,EAAI,IAAA,UAAA;AACF,IAAA,oBAAA,CAAqB,KAAK,aAAe,EAAA;AAAA,MACvC,OAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,KACD,CAAA,CAAA;AAEH,EAAO,OAAA,UAAA,CAAA;AACT;;AC1Da,MAAA,qBAAA,GAAwB,cAAqC,IAAI,CAAA,CAAA;AAEvE,SAAS,iBAAoB,GAAA;AAClC,EAAM,MAAA,OAAA,GAAU,WAAW,qBAAqB,CAAA,CAAA;AAEhD,EAAA,IAAI,CAAC,OAAA;AAAS,IAAM,MAAA,IAAI,MAAM,mCAAmC,CAAA,CAAA;AAEjE,EAAO,OAAA,OAAA,CAAA;AACT;;;;;;;;ACGa,MAAA,mBAAA,GAAsB,IAAK,MAAM,mBAAoB,CAAA;AAAA,EAA1B,WAAA,GAAA;AACtC,IAAAA,eAAA,CAAA,IAAA,EAAA,WAAA,EAAiE,EAAC,CAAA,CAAA;AAElE,IAAKA,eAAA,CAAA,IAAA,EAAA,IAAA,EAAA,CAAC,OAAmB,EAAA,MAAA,EAAgB,EAAwB,KAAA;AAC/D,MAAI,IAAA,CAAC,IAAK,CAAA,SAAA,CAAU,OAAO,CAAA;AAAG,QAAK,IAAA,CAAA,SAAA,CAAU,OAAO,CAAA,GAAI,EAAC,CAAA;AACzD,MAAA,IAAI,CAAC,IAAA,CAAK,SAAU,CAAA,OAAO,EAAE,MAAM,CAAA;AAAG,QAAA,IAAA,CAAK,SAAU,CAAA,OAAO,CAAE,CAAA,MAAM,IAAI,EAAC,CAAA;AAEzE,MAAA,IAAA,CAAK,UAAU,OAAO,CAAA,CAAE,MAAM,CAAA,CAAE,KAAK,EAAE,CAAA,CAAA;AAEvC,MAAA,OAAO,MAAM;AACX,QAAK,IAAA,CAAA,SAAA,CAAU,OAAO,CAAA,CAAE,MAAM,CAAA,GAAI,KAAK,SAAU,CAAA,OAAO,CAAE,CAAA,MAAM,CAAE,CAAA,MAAA;AAAA,UAChE,CAAC,YAAY,OAAY,KAAA,EAAA;AAAA,SAC3B,CAAA;AAAA,OACF,CAAA;AAAA,KACF,CAAA,CAAA;AAEA,IAAOA,eAAA,CAAA,IAAA,EAAA,MAAA,EAAA,CAAC,OAAmB,EAAA,MAAA,EAAgB,IAAwB,KAAA;AACjE,MAAA,IAAA,CAAK,UAAU,OAAO,CAAA,GAAI,MAAM,CAAG,EAAA,OAAA,CAAQ,CAAC,OAAY,KAAA;AACtD,QAAA,MAAA,CAAO,sBAAsB,MAAM;AACjC,UAAA,OAAA,CAAQ,EAAE,MAAA,EAAQ,OAAS,EAAA,IAAA,EAAM,CAAA,CAAA;AAAA,SAClC,CAAA,CAAA;AAAA,OACF,CAAA,CAAA;AAAA,KACH,CAAA,CAAA;AAAA,GAAA;AACF,CAAG,EAAA,CAAA;AAuEI,SAAS,gBACd,cACA,EAAA;AACA,EAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,gBAAiB,EAAA,CAAA;AAErC,EAAA,QAAA,CAAS,MAAM;AACb,IAAA,MAAM,gBAAmC,EAAC,CAAA;AAE1C,IAAO,MAAA,CAAA,OAAA,CAAQ,cAAkB,IAAA,EAAE,CAAA,CAAE,QAAQ,CAAC,CAAC,MAAQ,EAAA,OAAO,CAAM,KAAA;AAClE,MAAc,aAAA,CAAA,IAAA;AAAA,QACZ,mBAAoB,CAAA,EAAA,CAAG,OAAS,EAAA,MAAA,EAAQ,CAAC,GAAQ,KAAA;AAC/C,UAAA,OAAA,CAAQ,IAAI,IAAI,CAAA,CAAA;AAAA,SACjB,CAAA;AAAA,OACH,CAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,aAAA,CAAc,OAAQ,CAAA,CAAC,WAAgB,KAAA,WAAA,EAAa,CAAA,CAAA;AAAA,KACtD,CAAA;AAAA,GACD,CAAA,CAAA;AAED,EAAA,MAAM,QAAQ,iBAAkB,EAAA,CAAA;AAEhC,EAAA,OAAO,KAAM,CAAA,UAAA,CAAA;AACf;;AChIA,MAAM,iCAAiC,YAKpC,CAAA;AAAC,CAAA;AAES,MAAA,wBAAA,GAA2B,IAAI,wBAAyB,EAAA,CAAA;AAM9D,MAAM,uBAAuB,MAAM;AACxC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,IAAI,CAAA,CAAA;AAEnD,EAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,gBAAiB,EAAA,CAAA;AAErC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAO,wBAAyB,CAAA,EAAA,CAAG,aAAe,EAAA,CAAC,EAAO,KAAA;AACxD,MAAA,IAAI,EAAG,CAAA,OAAA,KAAY,OAAW,IAAA,EAAA,CAAG,WAAgB,KAAA,WAAA;AAC/C,QAAA,cAAA,CAAe,GAAG,WAAW,CAAA,CAAA;AAAA,KAChC,CAAA,CAAA;AAAA,GACA,EAAA,CAAC,WAAa,EAAA,OAAO,CAAC,CAAA,CAAA;AAEzB,EAAO,OAAA,WAAA,CAAA;AACT;;;;;;;;ACrBA,SAAS,kBAAA,CACP,GACA,CACA,EAAA;AAEA,EAAA,KAAA,MAAW,GAAO,IAAA,MAAA,CAAO,IAAK,CAAA,CAAC,CAAG,EAAA;AAChC,IAAA,IACE,CAAE,CAAA,GAAsC,CACxC,KAAA,CAAA,CAAE,GAA6B,CAAA;AAE/B,MAAO,OAAA,KAAA,CAAA;AAAA,GACX;AAEA,EAAO,OAAA,IAAA,CAAA;AACT,CAAA;AAEa,MAAA,gBAAA,GAAmB,IAAK,MAAM,gBAAiB,CAAA;AAAA,EAAvB,WAAA,GAAA;AACnC,IAAAA,eAAA,CAAA,IAAA,EAAA,WAAA,EAAwC,EAAC,CAAA,CAAA;AAAA,GAAA;AAAA,EAEzC,SAAA,CAAU,WAAmB,OAAc,EAAA;AACzC,IAAA,MAAM,MAA2B,GAAA;AAAA,MAC/B,OAAS,EAAA,WAAA;AAAA,MACT,SAAW,EAAA,WAAA;AAAA,MACX,SAAW,EAAA,WAAA;AAAA,MACX,UAAY,EAAA,WAAA;AAAA,KACd,CAAA;AAEA,IAAA,IAAA,CAAK,UAAU,OAAQ,CAAA,CAAC,EAAE,QAAU,EAAA,GAAG,SAAc,KAAA;AACnD,MAAI,IAAA,SAAA,KAAc,QAAQ,SAAW,EAAA;AACnC,QAAA,QAAA,CAAS,EAAE,GAAG,MAAQ,EAAA,SAAA,EAAW,SAAS,CAAA,CAAA;AAAA,OAC5C;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,SAAA,CAAU,MAA0B,EAAA,SAAA,EAAmB,OAAc,EAAA;AACnE,IAAI,IAAA,CAAC,OAAO,OAAS,EAAA,MAAA,CAAO,WAAW,MAAO,CAAA,SAAS,CAAE,CAAA,QAAA,CAAS,GAAG,CAAA;AACnE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,mEAAA;AAAA,OACF,CAAA;AAEF,IAAA,IAAA,CAAK,UAAU,OAAQ,CAAA,CAAC,EAAE,QAAU,EAAA,GAAG,SAAc,KAAA;AACnD,MAAA,IAAI,mBAAmB,OAAS,EAAA,EAAE,GAAG,MAAQ,EAAA,SAAA,EAAW,CAAG,EAAA;AACzD,QAAA,QAAA,CAAS,EAAE,GAAG,MAAQ,EAAA,SAAA,EAAW,SAAS,CAAA,CAAA;AAAA,OAC5C;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,OAAA,CACE,aACA,QACA,EAAA;AACA,IAAA,MAAM,QAA8C,GAAA;AAAA,MAClD,GAAG,WAAA;AAAA,MACH,QAAA;AAAA,KACF,CAAA;AAEA,IAAK,IAAA,CAAA,SAAA,CAAU,KAAK,QAAQ,CAAA,CAAA;AAE5B,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,SAAY,GAAA,IAAA,CAAK,SAAU,CAAA,MAAA,CAAO,CAAC,OAAY,KAAA;AAClD,QAAA,OAAO,OAAY,KAAA,QAAA,CAAA;AAAA,OACpB,CAAA,CAAA;AAAA,KACH,CAAA;AAAA,GACF;AACF,CAAG;;AC1DI,SAAS,iBAAoB,GAAA;AAClC,EAAA,MAAM,EAAE,OAAS,EAAA,SAAA,EAAW,SAAW,EAAA,UAAA,KAAe,gBAAiB,EAAA,CAAA;AAEvE,EAAA,MAAM,SAAY,GAAA,WAAA;AAAA,IAChB,CAAC,WAAmB,OAAiB,KAAA;AACnC,MAAiB,gBAAA,CAAA,SAAA;AAAA,QACf,EAAE,OAAA,EAAS,SAAW,EAAA,SAAA,EAAW,UAAW,EAAA;AAAA,QAC5C,SAAA;AAAA,QACA,OAAA;AAAA,OACF,CAAA;AAAA,KACF;AAAA,IACA,CAAC,OAAA,EAAS,SAAW,EAAA,SAAA,EAAW,UAAU,CAAA;AAAA,GAC5C,CAAA;AAEA,EAAO,OAAA,SAAA,CAAA;AACT;;ACpBgB,SAAA,eAAA,CACd,aACA,QACA,EAAA;AACA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,WAAc,GAAA,gBAAA,CAAiB,OAAQ,CAAA,WAAA,EAAa,QAAQ,CAAA,CAAA;AAElE,IAAA,OAAO,MAAM;AACX,MAAY,WAAA,EAAA,CAAA;AAAA,KACd,CAAA;AAAA,GACD,CAAA,CAAA;AACH;;ACdgB,SAAA,gBAAA,CAAiB,SAAiB,QAAkB,EAAA;AAClE,EAAiB,gBAAA,CAAA,SAAA;AAAA,IACf,EAAE,OAAQ,EAAA;AAAA,IACV,aAAA;AAAA,IACA,QAAA;AAAA,GACF,CAAA;AACF,CAAA;AAEO,SAAS,mBAAsB,GAAA;AACpC,EAAA,MAAM,YAAY,iBAAkB,EAAA,CAAA;AAEpC,EAAO,OAAA,WAAA;AAAA,IACL,CAAC,QAAqB,KAAA;AACpB,MAAA,SAAA,CAAU,eAAe,QAAQ,CAAA,CAAA;AAAA,KACnC;AAAA,IACA,CAAC,SAAS,CAAA;AAAA,GACZ,CAAA;AACF;;ACRgB,SAAA,iBAAA,CAAkB,SAAiB,MAAwB,EAAA;AACzE,EAAiB,gBAAA,CAAA,SAAA;AAAA,IACf,EAAE,OAAQ,EAAA;AAAA,IACV,cAAA;AAAA,IACA,MAAA;AAAA,GACF,CAAA;AACF,CAAA;AAQO,SAAS,cACd,CAAA,OAAA,EACA,EAAE,WAAA,EACe,EAAA;AACjB,EAAM,MAAA,CAAC,MAAQ,EAAA,SAAS,CAAI,GAAA,QAAA;AAAA,IACzB,aAAiD,MAAQ,EAAA,MAAA,EAAQ,IAC7D,GAAA,WAAA,EAAiD,QAAQ,MAC1D,GAAA,IAAA;AAAA,GACN,CAAA;AAEA,EAAA,MAAM,iBAAoB,GAAA,WAAA;AAAA,IACxB,CAAC,EAAmC,KAAA;AAClC,MAAQ,OAAA,CAAA,GAAA,CAAI,GAAG,IAAI,CAAA,CAAA;AACnB,MAAI,IAAA,MAAA;AAAQ,QAAa,YAAA,CAAA,OAAA,EAAS,IAAI,MAAM,CAAA,CAAA;AAAA,KAC9C;AAAA,IACA,CAAC,QAAQ,OAAO,CAAA;AAAA,GAClB,CAAA;AAEA,EAAA,eAAA;AAAA,IACE,EAAE,SAAW,EAAA,cAAA,EAAgB,OAAQ,EAAA;AAAA,IACrC,CAAC,EAA6B,KAAA;AAC5B,MAAI,IAAA,CAAC,GAAG,OAAQ,CAAA,IAAA;AAAM,QAAA,SAAA,CAAU,IAAI,CAAA,CAAA;AAAA;AAC/B,QAAA,SAAA,CAAU,GAAG,OAAO,CAAA,CAAA;AAAA,KAC3B;AAAA,GACF,CAAA;AAEA,EAAO,OAAA,EAAE,QAAQ,iBAAkB,EAAA,CAAA;AACrC;;AClDA,MAAM,cAAc,WAAY,CAAA;AAAA,EAC9B,cAAc,EAAC;AAAA,EACf,IAAM,EAAA,iBAAA;AAAA,EACN,QAAU,EAAA;AAAA,IACR,OACE,KACA,EAAA;AAAA,MACE,OAAA;AAAA,KAKF,EAAA;AACA,MAAI,IAAA,CAAC,KAAM,CAAA,OAAA,CAAQ,OAAO,CAAA;AAAG,QAAM,KAAA,CAAA,OAAA,CAAQ,OAAO,CAAA,GAAI,EAAC,CAAA;AAEvD,MAAM,KAAA,CAAA,OAAA,CAAQ,OAAO,CAAI,GAAA;AAAA,QACvB,GAAG,KAAM,CAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,QACxB,GAAG,OAAQ,CAAA,UAAA;AAAA,OACb,CAAA;AAAA,KACF;AAAA,GACF;AACF,CAAC,CAAA,CAAA;AAED,MAAM,EAAE,KAAA,EAAO,WAAY,EAAA,GAAI,cAAe,CAAA;AAAA,EAC5C,iBAAiB,WAAY,CAAA,OAAA;AAC/B,CAAC,EAAA;AAGM,MAAM,oBAAoB,WAAY,CAAA,OAAA;;ACtBtC,SAAS,cACd,CAAA,OAAA,EACA,UACA,EAAA,OAAA,GAAU,IACV,EAAA;AACA,EAAAC,KAAA,CAAgB,SAAS,iBAAkB,CAAA,MAAA,CAAO,EAAE,OAAS,EAAA,UAAA,EAAY,CAAC,CAAA,CAAA;AAC1E,EAAA,IAAI,OAAS,EAAA;AACX,IAAoB,mBAAA,CAAA,IAAA,CAAK,SAAS,oBAAsB,EAAA;AAAA,MACtD,IAAM,EAAA,UAAA;AAAA,KACU,CAAA,CAAA;AAClB,IAAA,eAAA,CAAgB,SAAS,SAAS,CAAA,CAAA;AAAA,GACpC;AACF;;ACtBa,MAAA,gBAAA,GAAmB,cAAgC,IAAI,CAAA,CAAA;AAE7D,SAAS,mBAAsB,GAAA;AACpC,EAAM,MAAA,OAAA,GAAU,WAAW,gBAAgB,CAAA,CAAA;AAE3C,EAAA,IAAI,CAAC,OAAA;AAAS,IAAM,MAAA,IAAI,MAAM,+BAA+B,CAAA,CAAA;AAE7D,EAAO,OAAA,OAAA,CAAA;AACT;;ACJO,MAAM,yBAA8C,GAAA;AAAA,EACzD,EAAA,EAAI,QAAQ,CAAC,CAAA;AAAA,EAEb,cAAgB,EAAA;AAAA,IACd,EAAI,EAAA,CAAA;AAAA,GACN;AAAA,EACA,mBAAqB,EAAA;AAAA,IACnB,UAAY,EAAA,0BAAA;AAAA,IACZ,MAAQ,EAAA,WAAA;AAAA,IACR,WAAa,EAAA,kBAAA;AAAA,IACb,OAAS,EAAA,MAAA;AAAA,IACT,aAAe,EAAA,QAAA;AAAA,IACf,YAAc,EAAA,OAAA;AAAA,IACd,SAAW,EAAA,OAAA;AAAA,GACb;AAAA,EAEA,cAAgB,EAAA;AAAA,IACd,MAAQ,EAAA,MAAA;AAAA,IACR,KAAO,EAAA,MAAA;AAAA,IACP,YAAc,EAAA,MAAA;AAAA,IACd,SAAW,EAAA,aAAA;AAAA,IACX,WAAa,EAAA,KAAA;AAAA,GACf;AAAA,EAEA,gBAAkB,EAAA;AAAA,IAChB,UAAY,EAAA,QAAA;AAAA,IACZ,MAAQ,EAAA,MAAA;AAAA,IACR,OAAS,EAAA,MAAA;AAAA,IACT,QAAU,EAAA,QAAA;AAAA,IACV,UAAY,EAAA,MAAA;AAAA,IACZ,cAAgB,EAAA,eAAA;AAAA,IAChB,QAAU,EAAA,MAAA;AAAA,IACV,QAAU,EAAA,SAAA;AAAA,IACV,eAAiB,EAAA,yBAAA;AAAA,IACjB,uBAAyB,EAAA,gBAAA;AAAA,IACzB,sBAAwB,EAAA,gBAAA;AAAA,IACxB,EAAI,EAAA,CAAA;AAAA,IACJ,EAAI,EAAA,CAAA;AAAA,IAEJ,YAAc,EAAA,OAAA;AAAA,IAEd,sBAAwB,EAAA;AAAA,MACtB,UAAY,EAAA,QAAA;AAAA,MACZ,OAAS,EAAA,MAAA;AAAA,MACT,GAAK,EAAA,CAAA;AAAA,MACL,QAAU,EAAA,SAAA;AAAA,MAEV,GAAK,EAAA;AAAA,QACH,KAAO,EAAA,oBAAA;AAAA,OACT;AAAA,KACF;AAAA,IAEA,OAAS,EAAA;AAAA,MACP,UAAY,EAAA,CAAA;AAAA,KACd;AAAA,IAEA,yBAA2B,EAAA;AAAA,MACzB,SAAW,EAAA,KAAA;AAAA,MACX,OAAS,EAAA,MAAA;AAAA,MACT,QAAU,EAAA,CAAA;AAAA,MACV,UAAY,EAAA,QAAA;AAAA,MACZ,GAAK,EAAA,CAAA;AAAA,MACL,cAAgB,EAAA,KAAA;AAAA,MAChB,KAAO,EAAA,CAAA;AAAA,MACP,UAAY,EAAA,aAAA;AAAA,MACZ,EAAI,EAAA,CAAA;AAAA,MACJ,SAAS,UAAW,CAAA,EAAE,GAAG,CAAG,EAAA,CAAA,EAAG,GAAG,CAAA;AAAA,MAClC,UAAY,EAAA,QAAA;AAAA,MACZ,EAAI,EAAA,CAAA;AAAA,MACJ,MAAQ,EAAA,MAAA;AAAA,MACR,MAAQ,EAAA;AAAA,QACN,KAAO,EAAA,MAAA;AAAA,QACP,MAAQ,EAAA,MAAA;AAAA,OACV;AAAA,KACF;AAAA,GACF;AAAA,EAEA,iBAAmB,EAAA;AAAA,IACjB,GAAG,iBAAkB,EAAA;AAAA,GACvB;AAAA,EAEA,+GACE,EAAA;AAAA,IACE,+CAAiD,EAAA;AAAA,MAC/C,OAAS,EAAA,UAAA,CAAW,EAAE,CAAA,EAAG,GAAG,CAAA;AAAA,KAC9B;AAAA,GACF;AAAA,EAEF,gBAAkB,EAAA;AAAA,IAChB,OAAS,EAAA,MAAA;AAAA,IACT,cAAgB,EAAA,eAAA;AAAA,IAChB,GAAA,EAAK,QAAQ,CAAC,CAAA;AAAA,IACd,UAAY,EAAA,yBAAA;AAAA,IACZ,EAAI,EAAA,CAAA;AAAA,IACJ,EAAI,EAAA,CAAA;AAAA,IACJ,KAAO,EAAA,sBAAA;AAAA,IACP,YAAc,EAAA,OAAA;AAAA,IACd,oBAAsB,EAAA,KAAA;AAAA,IACtB,mBAAqB,EAAA,KAAA;AAAA,IACrB,QAAU,EAAA,QAAA;AAAA,IACV,UAAY,EAAA,QAAA;AAAA,GACd;AAAA,EAEA,0CAA4C,EAAA;AAAA,IAC1C,UAAY,EAAA,eAAA;AAAA,GACd;AAAA,EAEA,sBAAwB,EAAA;AAAA,IACtB,QAAU,EAAA,EAAA;AAAA,IACV,OAAS,EAAA,CAAA;AAAA,IACT,UAAY,EAAA,CAAA;AAAA,GACd;AAAA,EAEA,sBAAwB,EAAA;AAAA,IACtB,QAAU,EAAA,QAAA;AAAA,IACV,UAAY,EAAA,CAAA;AAAA,GACd;AAAA,EAEA,mBAAqB,EAAA;AAAA,IACnB,UAAY,EAAA,cAAA;AAAA,GACd;AACF,CAAA;;AC3Ha,MAAA,aAAA,GAAgB,CAAC,KAIxB,KAAA;AACJ,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AAElD,EAAA,MAAM,YAAY,iBAAkB,EAAA,CAAA;AACpC,EAAA,MAAM,WAAW,eAAgB,EAAA,CAAA;AAEjC,EAA6B,4BAAA,CAAA;AAAA,IAC3B,QAAQ,gBAA2B,EAAA;AACjC,MAAA,aAAA,CAAc,gBAAgB,CAAA,CAAA;AAAA,KAChC;AAAA,GACD,CAAA,CAAA;AAED,EACE,uBAAA,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,IAAK,EAAA,SAAA;AAAA,MACL,OAAQ,EAAA,sBAAA;AAAA,MACR,SAAU,EAAA,mBAAA;AAAA,MACV,IAAK,EAAA,IAAA;AAAA,MACL,OAAA,EAAS,YAAY,MAAM;AACzB,QAAA,KAAK,QAAS,CAAA,EAAE,MAAQ,EAAA,SAAA,EAAW,CAAA,CAAA;AAAA,OACrC,EAAG,CAAC,QAAQ,CAAC,CAAA;AAAA,MACb,KAAA,EAAO,QAAS,CAAA,eAAA,EAAiB,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,KAAM,CAAA,KAAA,EAAQ,EAAC,CAAE,CAAA,IAAA;AAAA,MAClE,SAAA;AAAA,MACA,QAAU,EAAA,UAAA;AAAA,KAAA;AAAA,GACZ,CAAA;AAEJ,CAAA;;AC9BA,MAAM,sBAAsB,YAEzB,CAAA;AAAC,CAAA;AAEyB,IAAI,aAAc,GAAA;AAiBxC,SAAS,cAAiB,GAAA;AAC/B,EAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,gBAAiB,EAAA,CAAA;AAErC,EAAA,OAAO,SAAS,MAAS,GAAA;AACvB,IAAA,KAAK,OAAQ,CAAA,IAAA;AAAA,MACX,WAAY,CAAA;AAAA,QACV,MAAQ,EAAA,WAAA;AAAA,QACR,KAAO,EAAA,OAAA;AAAA,OACR,CAAA;AAAA,MACD,EAAE,YAAY,IAAK,EAAA;AAAA,KACrB,CAAA;AAAA,GACF,CAAA;AACF;;AC9Ba,MAAA,cAAA,GAAiB,CAAC,KAA6B,KAAA;AAC1D,EAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,gBAAiB,EAAA,CAAA;AACrC,EAAA,MAAM,YAAY,cAAe,EAAA,CAAA;AAEjC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AAClD,EAA6B,4BAAA,CAAA;AAAA,IAC3B,QAAQ,gBAA2B,EAAA;AACjC,MAAA,aAAA,CAAc,gBAAgB,CAAA,CAAA;AAAA,KAChC;AAAA,GACD,CAAA,CAAA;AAED,EAAgB,eAAA,CAAA;AAAA,IACd,OAAU,GAAA;AACR,MAAoB,mBAAA,CAAA,OAAA,EAAS,WAAW,KAAK,CAAA,CAAA;AAAA,KAC/C;AAAA,GACD,CAAA,CAAA;AAED,EAAM,MAAA,YAAA,GAAe,YAAY,MAAM;AACrC,IAAI,IAAA;AACF,MAAU,SAAA,EAAA,CAAA;AAAA,aACH,CAAG,EAAA;AAAA,KAAC;AAAA,GACf,EAAG,CAAC,SAAS,CAAC,CAAA,CAAA;AAEd,EACE,uBAAA,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,IAAK,EAAA,UAAA;AAAA,MACL,IAAK,EAAA,IAAA;AAAA,MACL,OAAQ,EAAA,sBAAA;AAAA,MACR,SAAU,EAAA,mBAAA;AAAA,MACV,OAAS,EAAA,YAAA;AAAA,MACT,KAAA,EAAO,QAAS,CAAA,gBAAA,EAAkB,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,KAAM,CAAA,KAAA,EAAQ,EAAC,CAAE,CAAA,IAAA;AAAA,MACnE,QAAU,EAAA,UAAA;AAAA,KAAA;AAAA,GACZ,CAAA;AAEJ,CAAA;;ACrCO,MAAM,GAAG,mBAAA,EAAqB,YAAY,CAAA,GAAI,yBAKjD,CAAA;AAAA,EACF,SAAA,EAAW,CAAC,KAAU,KAAA;AACpB,IAAA,uBAEK,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,MAAA,KAAA,CAAM,iCAEH,GAAA,CAAA,QAAA,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,aAAe,EAAA,EAAA,GAAG,OAAO,CAC5B,EAAA,CAAA;AAAA,MAED,MAAM,cAAkB,oBAAA,GAAA,CAAC,cAAe,EAAA,EAAA,KAAA,EAAO,MAAM,KAAO,EAAA,CAAA;AAAA,KAC/D,EAAA,CAAA,CAAA;AAAA,GAEJ;AACF,CAAC,CAAA;;AClBM,SAAS,qBAAwB,GAAA;AACtC,EAAM,MAAA,KAAA,GAAQ,OAA8B,IAAI,CAAA,CAAA;AAChD,EAAM,MAAA,SAAA,GAAY,OAAqB,QAAQ,CAAA,CAAA;AAE/C,EAAM,MAAA,eAAA,GAAkB,YAAY,MAAM;AACxC,IAAe,cAAA,CAAA,OAAA;AAAA,MAAQ,CAAC,YAEpB,KAAM,CAAA,OAAA,EAAS,cAAc,iBAAiB,CAAA,EAC7C,SAAU,CAAA,MAAA,CAAO,OAAO,CAAA;AAAA,KAC7B,CAAA;AAAA,GACF,EAAG,EAAE,CAAA,CAAA;AAEL,EAAA,MAAM,MAAS,GAAA,WAAA;AAAA,IACb,CAAC,EAAuB,KAAA;AACtB,MAAA,IAAI,cAAc,cAAgB,EAAA;AAChC,QAAA,KAAA,CAAM,OAAU,GAAA,EAAA,CAAA;AAChB,QAAgB,eAAA,EAAA,CAAA;AAChB,QAAA,CAAC,EAAI,EAAA,aAAA,CAAc,iBAAiB,CAAA,EAAkB,SAAU,CAAA,GAAA;AAAA,UAC9D,SAAU,CAAA,OAAA;AAAA,SACZ,CAAA;AAAA,OACF;AAAA,KACF;AAAA,IACA,CAAC,eAAe,CAAA;AAAA,GAClB,CAAA;AAEA,EAAA,MAAM,SAAY,GAAA,WAAA;AAAA,IAChB,CAAC,MAAyB,KAAA;AACxB,MAAA,IAAI,UAAU,OAAY,KAAA,MAAA;AAAQ,QAAA,OAAA;AAElC,MAAA,SAAA,CAAU,OAAU,GAAA,MAAA,CAAA;AACpB,MAAgB,eAAA,EAAA,CAAA;AAChB,MACE,KAAA,CAAM,SAAS,aAAc,CAAA,iBAAiB,GAC7C,SAAU,CAAA,GAAA,CAAI,UAAU,OAAO,CAAA,CAAA;AAAA,KACpC;AAAA,IACA,CAAC,eAAe,CAAA;AAAA,GAClB,CAAA;AAEA,EAAO,OAAA,EAAE,GAAK,EAAA,MAAA,EAAQ,SAAU,EAAA,CAAA;AAClC;;ACAO,SAAS,oBAAuB,GAAA;AACrC,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,eAAgB,EAAA,CAAA;AAEnC,EAAA,QAAA,CAAS,MAAM;AACb,IAAA,MAAA,CAAO,EAAiB,CAAA,CAAA;AAAA,GACzB,CAAA,CAAA;AACH;;AChCa,MAAA,YAAA,GAAe,cAAoC,IAAI,CAAA,CAAA;AA2B7D,SAAS,eAAkB,GAAA;AAChC,EAAM,MAAA,OAAA,GAAU,WAAW,YAAY,CAAA,CAAA;AACvC,EAAA,IAAI,CAAC,OAAA;AAAS,IAAM,MAAA,IAAI,MAAM,kCAAkC,CAAA,CAAA;AAChE,EAAO,OAAA,OAAA,CAAA;AACT,CAAA;AACO,MAAM,uBAAuB,CAAC;AAAA,EACnC,QAAA;AAAA,EACA,KAAA;AACF,CAGM,KAAA;AACJ,EAAA,uBACG,GAAA,CAAA,YAAA,CAAa,QAAb,EAAA,EAAsB,OAAe,QAAS,EAAA,CAAA,CAAA;AAEnD,CAAA,CAAA;AAEgB,SAAA,mBAAA,CACd,SACA,UACA,EAAA;AACA,EAAA,MAAM,QAAW,GAAA,WAAA;AAAA,IACf,CAAC,QAAqB,KAAA;AACpB,MAAA,gBAAA,CAAiB,SAAS,QAAQ,CAAA,CAAA;AAAA,KACpC;AAAA,IACA,CAAC,OAAO,CAAA;AAAA,GACV,CAAA;AAEA,EAAA,MAAM,EAAE,GAAA,EAAK,SAAU,EAAA,GAAI,qBAAsB,EAAA,CAAA;AAEjD,EAAA,MAAM,CAAC,KAAO,EAAA,aAAa,CAAI,GAAA,QAAA,CAAS,WAAW,KAAK,CAAA,CAAA;AACxD,EAAA,eAAA;AAAA,IACE,EAAE,SAAW,EAAA,aAAA,EAAe,OAAQ,EAAA;AAAA,IACpC,CAAC,EAA4B,KAAA;AAC3B,MAAA,aAAA,CAAc,GAAG,OAAO,CAAA,CAAA;AAAA,KAC1B;AAAA,GACF,CAAA;AACA,EAAM,MAAA,EAAE,MAAQ,EAAA,iBAAA,EAAsB,GAAA,cAAA;AAAA,IACpC,OAAA;AAAA,IACA,UAAW,CAAA,WAAA;AAAA,GACb,CAAA;AAEA,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAoB,IAAI,CAAA,CAAA;AAElE,EAAA,MAAM,WAAW,eAAgB,EAAA,CAAA;AACjC,EAAM,MAAA,qBAAA,GAAwB,OAAO,KAAK,CAAA,CAAA;AAC1C,EAAA,MAAM,YAAY,mBAAoB,EAAA,CAAA;AAEtC,EAAA,MAAM,MAAS,GAAA,WAAA;AAAA,IACb,CAAC,EAA2B,KAAA;AAC1B,MAAI,IAAA,EAAA,IAAM,CAAC,qBAAA,CAAsB,OAAS,EAAA;AACxC,QAAA,qBAAA,CAAsB,OAAU,GAAA,IAAA,CAAA;AAChC,QAAA,IAAI,WAAW,cAAgB,EAAA;AAC7B,UAAA,KAAK,SAAS,EAAE,MAAA,EAAQ,WAAW,CAAA,CAAE,KAAK,MAAM;AAC9C,YAAU,SAAA,CAAA,YAAA,CAAa,kBAAkB,OAAO,CAAA,CAAA;AAAA,WACjD,CAAA,CAAA;AAAA,SACI,MAAA;AACL,UAAU,SAAA,CAAA,YAAA,CAAa,kBAAkB,OAAO,CAAA,CAAA;AAAA,SAClD;AAAA,OACF;AAAA,KACF;AAAA,IACA,CAAC,SAAU,CAAA,YAAA,EAAc,QAAU,EAAA,OAAA,EAAS,WAAW,cAAc,CAAA;AAAA,GACvE,CAAA;AAEA,EAAA,MAAM,YAAe,GAAA,OAAA;AAAA,IACnB,OAAO,EAAE,gBAAA,EAAkB,QAAU,EAAA,SAAA,EAAW,YAAY,MAAO,EAAA,CAAA;AAAA,IACnE,CAAC,QAAA,EAAU,SAAW,EAAA,UAAA,EAAY,MAAM,CAAA;AAAA,GAC1C,CAAA;AAEA,EAAA,OAAO,EAAE,aAAe,EAAA,KAAA,EAAO,MAAQ,EAAA,iBAAA,EAAmB,cAAc,GAAI,EAAA,CAAA;AAC9E;;AC7GO,MAAM,cAAc,CAAC;AAAA,EAC1B,aAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,iBAAA;AACF,CAAoD,KAAA;AAClD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAiB,CAAC,CAAA,CAAA;AAEtD,EAAgB,eAAA,CAAA;AAAA,IACd,OAAU,GAAA;AACR,MAAc,aAAA,CAAA,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,KAC1B;AAAA,GACD,CAAA,CAAA;AAED,EAAA,uCAEM,QAAiB,EAAA,CAAA,aAAA,IAAA,MAAA,qBAChB,IAAA,CAAA,KAAA,EAAA,EAAI,WAAU,eACZ,EAAA,QAAA,EAAA;AAAA,IACE,aAAA,KAAA,MAAA,KACE,CAAC,MAAA,CAAO,MAAU,IAAA,MAAA,CAAO,mBAAmB,YAC3C,CAAA,oBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAU,qBACb,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,cAAA,EAAgB,CAAC,EAAO,KAAA;AACtB,UAAA,MAAM,SAAS,MAAO,CAAA,gBAAA;AAAA,YACpB,EAAA,CAAG,QAAQ,gBAAgB,CAAA;AAAA,WAC7B,CAAA;AACA,UAAA,MAAM,KAAQ,GAAA,MAAA,CAAO,QAAS,CAAA,MAAA,CAAO,OAAO,EAAE,CAAA,CAAA;AAC9C,UAAM,MAAA,OAAA,GACJ,MAAO,CAAA,QAAA,CAAS,MAAO,CAAA,WAAA,EAAa,EAAE,CAAA,GACtC,MAAO,CAAA,QAAA,CAAS,MAAO,CAAA,YAAA,EAAc,EAAE,CAAA,CAAA;AACzC,UAAO,OAAA;AAAA,YACL,KAAA,EAAO,CAAG,EAAA,KAAA,GAAQ,OAAO,CAAA,EAAA,CAAA;AAAA,WAC3B,CAAA;AAAA,SACF;AAAA,QAEC,QAAO,EAAA,MAAA,CAAA,IAAA;AAAA,OAAA;AAAA,KAEZ,EAAA,CAAA,CAAA;AAAA,IAEL,MAAQ,EAAA,MAAA,IAAU,MAAO,CAAA,cAAA,KAAmB,YAC3C,oBAAA,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,OAAS,EAAA,iBAAA;AAAA,QACT,aAAe,EAAA,iBAAA;AAAA,QACf,OAAQ,EAAA,MAAA;AAAA,QACR,SAAU,EAAA,qBAAA;AAAA,QAEV,QAAA,kBAAA,GAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,cAAA,EAAgB,CAAC,EAAO,KAAA;AACtB,cAAA,MAAM,SAAS,MAAO,CAAA,gBAAA;AAAA,gBACpB,EAAA,CAAG,QAAQ,gBAAgB,CAAA;AAAA,eAC7B,CAAA;AACA,cAAA,MAAM,KAAQ,GAAA,MAAA,CAAO,QAAS,CAAA,MAAA,CAAO,OAAO,EAAE,CAAA,CAAA;AAC9C,cAAM,MAAA,OAAA,GACJ,MAAO,CAAA,QAAA,CAAS,MAAO,CAAA,WAAA,EAAa,EAAE,CAAA,GACtC,MAAO,CAAA,QAAA,CAAS,MAAO,CAAA,YAAA,EAAc,EAAE,CAAA,CAAA;AACzC,cAAO,OAAA;AAAA,gBACL,KAAA,EAAO,CAAG,EAAA,KAAA,GAAQ,OAAO,CAAA,EAAA,CAAA;AAAA,eAC3B,CAAA;AAAA,aACF;AAAA,YAEC,QAAO,EAAA,MAAA,CAAA,IAAA;AAAA,WAAA;AAAA,SACV;AAAA,OAAA;AAAA,KACF;AAAA,IAED,CAAC,MAAU,oBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,CAAA;AAAA,IAChB,UAAa,GAAA,CAAA,oBACX,IAAA,CAAA,GAAA,EAAA,EAAI,WAAU,qBACZ,EAAA,QAAA,EAAA;AAAA,MAAI,IAAA,IAAA,CAAK,UAAU,CAAA,CAAE,kBAAmB,EAAA;AAAA,MAAG,GAAA;AAAA,MAC3C,IAAI,IAAA,CAAK,UAAU,CAAA,CAAE,kBAAmB,EAAA;AAAA,KAC3C,EAAA,CAAA;AAAA,GAAA,EAEJ,CAEJ,EAAA,CAAA,CAAA;AAEJ,CAAA;;ACnEO,MAAM,mBAAsC,GAAA,mBAAA;AAAA,EACjD,qBAAA;AAAA,EACA,gCAAA;AAAA,EACA,yBAAA;AAAA,EACA,CAAC,EAAE,QAAU,EAAA,GAAG,OAAY,KAAA;AAC1B,IAAA,MAAM,EAAE,OAAA,EAAS,SAAW,EAAA,SAAA,KAAc,gBAAiB,EAAA,CAAA;AAE3D,IAAA,MAAM,EAAE,YAAc,EAAA,KAAA,EAAO,GAAK,EAAA,GAAG,aAAgB,GAAA,mBAAA;AAAA,MACnD,OAAA;AAAA,MACA,KAAA;AAAA,KACF,CAAA;AAEA,IAAA,MAAM,wBAAwB,wBAAyB,EAAA,CAAA;AACvD,IAAM,MAAA,UAAA,GAAa,aAAc,EAAA,IAAK,KAAM,CAAA,KAAA,CAAA;AAE5C,IAAA,MAAM,aACJ,KAAM,CAAA,SAAA,IACN,KAAM,CAAA,cAAA,IACN,MAAM,aACN,IAAA,UAAA,CAAA;AAEF,IAAA,MAAM,YAAY,iBAAkB,EAAA,CAAA;AACpC,IACE,uBAAA,GAAA,CAAC,oBAAqB,EAAA,EAAA,KAAA,EAAO,YAC3B,EAAA,QAAA,kBAAA,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAW,EAAA,CAAA,iBAAA,EAAoB,SAAY,GAAA,WAAA,GAAc,EAAE,CAAA,CAAA;AAAA,QAC3D,gBAAgB,EAAA,SAAA;AAAA,QAChB,gBAAgB,EAAA,SAAA;AAAA,QAChB,cAAc,EAAA,OAAA;AAAA,QAEb,QAAA,EAAA;AAAA,UAAA,UAAA,yBACE,KAAI,EAAA,EAAA,SAAA,EAAW,KAAM,CAAA,OAAA,EAAS,WAAW,CACxC,aAAA,CAAA,EAAA,QAAA,EAAA;AAAA,4BAAA,IAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBACC,SAAU,EAAA,qBAAA;AAAA,gBACV,EAAI,EAAA;AAAA,kBACF,QAAU,EAAA,KAAA;AAAA,kBACV,QAAU,EAAA,QAAA;AAAA,kBACV,UAAY,EAAA,QAAA;AAAA,iBACd;AAAA,gBAEC,QAAA,EAAA;AAAA,kBAAc,UAAA,IAAA,CAAC,UAAW,CAAA,KAAA,CAAM,YAAY,CAAA,wBAC1C,KAAI,EAAA,EAAA,GAAA,EAAK,UAAY,EAAA,SAAA,EAAU,aAAc,EAAA,CAAA;AAAA,uCAE/C,YACE,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,KAAA,CAAM,SACL,oBAAA,GAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACC,SAAU,EAAA,cAAA;AAAA,wBACV,OAAO,qBAAyB,IAAA,KAAA;AAAA,wBAE/B,QAAA,EAAA,KAAA;AAAA,uBAAA;AAAA,qBACH;AAAA,oCAEF,GAAA,CAAC,gBAAa,KAAc,EAAA,CAAA;AAAA,mBAC9B,EAAA,CAAA;AAAA,iBAAA;AAAA,eAAA;AAAA,aACF;AAAA,4BAEA,GAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,CACd,sBAAA,CAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,gBAAc,GAAG,KAAA,EAAO,EAAI,EAAA,OAAA,EAAS,CACxC,EAAA,CAAA;AAAA,WACF,EAAA,CAAA;AAAA,0BAED,GAAA,CAAA,KAAA,EAAA,EAAI,SAAU,EAAA,gBAAA,EAAkB,QAAS,EAAA,CAAA;AAAA,8BACzC,WAAY,EAAA,EAAA,aAAA,EAAe,KAAM,CAAA,aAAA,EAAgB,GAAG,WAAa,EAAA,CAAA;AAAA,SAAA;AAAA,OAAA;AAAA,KAEtE,EAAA,CAAA,CAAA;AAAA,GAEJ;AACF,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;ACnFA,IAAA,aAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,gBAAA,CAAA;AAgBO,MAAM,0BAA2B,CAAA;AAAA,EAQtC,YAAmB,SAAsB,EAAA;AAAtB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA,CAAA;AAPnB,IAAgBC,cAAA,CAAA,IAAA,EAAA,aAAA,EAAA,KAAA,CAAA,CAAA;AAChB,IAAAA,cAAA,CAAA,IAAA,EAAA,mBAAA,EAA+C,EAAC,CAAA,CAAA;AAChD,IAAAA,cAAA,CAAA,IAAA,EAAA,UAAA,EAAsC,EAAC,CAAA,CAAA;AAEvC,IAAAA,cAAA,CAAA,IAAA,EAAA,cAAA,EAAiB,KAAK,GAAI,EAAA,CAAA,CAAA;AAC1B,IAAoBA,cAAA,CAAA,IAAA,EAAA,gBAAA,EAAA,CAAA,MAAA,CAAO,0BAA0B,CAAK,IAAA,GAAA,CAAA,CAAA;AAI1D,IAAAA,cAAA,CAAA,IAAA,EAAA,kBAAA,EAAqB,MAAM;AACzB,MAAA,IAAIC,cAAK,CAAA,IAAA,EAAA,aAAA,CAAA;AAAe,QAAO,OAAA,IAAA,CAAA;AAE/B,MAAA,MAAM,IAAO,GAAA,MAAA,CAAO,IAAK,CAAAA,cAAA,CAAA,IAAA,EAAK,mBAAmB,CAAA,CAAA,CAAA;AACjD,MAAM,MAAA,kBAAA,GAAqB,CAAC,IAAK,CAAA,IAAA;AAAA,QAC/B,CAAC,OACC,KAAA,CAACA,cAAK,CAAA,IAAA,EAAA,UAAA,CAAA,CAAW,OAAO,CAAA,IAAK,IAAK,CAAA,SAAA,CAAU,QAAS,CAAA,OAAO,CAAE,CAAA,SAAA;AAAA,OAClE,CAAA;AACA,MAAA,MAAM,qBACJ,IAAK,CAAA,GAAA,EAAQ,GAAAA,cAAA,CAAA,IAAA,EAAK,kBAAiBA,cAAK,CAAA,IAAA,EAAA,gBAAA,CAAA,CAAA;AAE1C,MAAA,IAAI,sBAAsB,kBAAoB,EAAA;AAC5C,QAAA,IAAI,kBAAoB,EAAA;AACtB,UAAA,MAAM,wBAAwB,MAAO,CAAA,IAAA,CAAKA,cAAK,CAAA,IAAA,EAAA,mBAAA,CAAmB,EAC/D,MAAO,CAAA,CAAC,OAAY,KAAA,CAACA,qBAAK,UAAW,CAAA,CAAA,OAAO,CAAC,CAC7C,CAAA,GAAA,CAAI,CAAC,OAAY,KAAA;AAChB,YAAA,MAAM,UAAa,GAAA,IAAA,CAAK,SAAU,CAAA,QAAA,CAAS,OAAO,CAAE,CAAA,KAAA,CAAA;AACpD,YAAO,OAAA,UAAA,CAAA;AAAA,WACR,CAAA,CAAA;AAEH,UAAQ,OAAA,CAAA,IAAA;AAAA,YACN,CAAA;AAAA;AAAA,oPAAA,CAAA;AAAA,YACA,EAAE,qBAAsB,EAAA;AAAA,WAC1B,CAAA;AAAA,SACF;AAEA,QAAAC,cAAA,CAAA,IAAA,EAAK,aAAgB,EAAA,IAAA,CAAA,CAAA;AACrB,QAAAD,cAAA,CAAA,IAAA,EAAK,gBAAL,CAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA;AACA,QAAO,OAAA,IAAA,CAAA;AAAA,OACT;AAEA,MAAO,OAAA,KAAA,CAAA;AAAA,KACT,CAAA,CAAA;AAEA,IAAAD,cAAA,CAAA,IAAA,EAAA,gBAAA,EAAmB,MAAM;AACvB,MAAA,MAAM,WAAW,QAAS,CAAA,aAAA;AAAA,QACxB,qBAAA;AAAA,OACF,CAAA;AACA,MAAA,MAAM,cAAc,QAAS,CAAA,aAAA;AAAA,QAC3B,oBAAA;AAAA,OACF,CAAA;AAEA,MAAA,QAAA,CAAS,MAAM,OAAU,GAAA,MAAA,CAAA;AACzB,MAAA,WAAA,CAAY,MAAM,UAAa,GAAA,SAAA,CAAA;AAC/B,MAAA,QAAA,CAAS,MAAO,EAAA,CAAA;AAAA,KAClB,CAAA,CAAA;AAaA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAF,eAAA,CAAA,IAAA,EAAA,mBAAA,EAAoB,CAAC,OAAoB,KAAA;AACvC,MAAKG,cAAA,CAAA,IAAA,EAAA,UAAA,CAAA,CAAW,OAAO,CAAI,GAAA,IAAA,CAAA;AAC3B,MAAA,IAAA,CAAK,SAAU,CAAA,QAAA,CAAS,OAAO,CAAA,CAAE,YAAa,EAAA,CAAA;AAAA,KAChD,CAAA,CAAA;AAEA,IAAAH,eAAA,CAAA,IAAA,EAAA,gCAAA,EAAiC,CAAC;AAAA,MAChC,QAAA;AAAA,MACA,OAAA;AAAA,KAII,KAAA;AACJ,MAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AAC1D,MAAM,MAAA,sBAAA,GAAyB,iBAAiB,cAAc,CAAA,CAAA;AAC9D,MAAKG,cAAA,CAAA,IAAA,EAAA,mBAAA,CAAA,CAAoB,OAAO,CAAI,GAAA,IAAA,CAAA;AAEpC,MAAM,MAAA,UAAA,GAAa,YAAY,MAAM;AACnC,QAAI,IAAA,CAACA,qBAAK,kBAAL,CAAA,CAAA,IAAA,CAAA,IAAA,CAAA;AACH,UAAK,KAAA,IAAI,OAAc,CAAA,CAAC,OAAY,KAAA;AAClC,YAAM,MAAA,QAAA,GAAW,YAAY,MAAM;AACjC,cAAI,IAAAA,cAAA,CAAA,IAAA,EAAK,oBAAL,IAA2B,CAAA,IAAA,CAAA,EAAA;AAC7B,gBAAQ,OAAA,EAAA,CAAA;AACR,gBAAA,aAAA,CAAc,QAAQ,CAAA,CAAA;AAAA,eACxB;AAAA,eACC,GAAG,CAAA,CAAA;AAAA,WACP,CAAA,CAAA;AACH,QAAO,OAAA,IAAA,CAAA;AAAA,OACT,EAAG,EAAE,CAAA,CAAA;AAEL,MAAA,IAAI,CAAC,sBAAA;AACH,QACE,uBAAA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,CAAC,EAAO,KAAA;AACX,cAAI,IAAA,EAAA;AAAI,gBAAA,iBAAA,CAAkB,IAAI,CAAA,CAAA;AAAA,aAChC;AAAA,WAAA;AAAA,SACF,CAAA;AAGJ,MACE,uBAAA,IAAA,CAAC,QAAS,EAAA,EAAA,QAAA,EAAU,IACjB,EAAA,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,4BACA,UAAW,EAAA,EAAA,CAAA;AAAA,OACd,EAAA,CAAA,CAAA;AAAA,KAEJ,CAAA,CAAA;AAAA,GAxG0C;AAyG5C,CAAA;AAhHE,aAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,mBAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,UAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAEA,cAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,gBAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAIA,kBAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAkCA,gBAAA,GAAA,IAAA,OAAA,EAAA;;ACzDK,MAAM,gBAAgB,MAAM;AACjC,EAAA,MAAM,QAAQ,gBAAiB,EAAA,CAAA;AAE/B,EACE,uBAAA,GAAA,CAAA,QAAA,EAAA,EACE,+BAAC,OAAQ,EAAA,EAAA,QAAA,EAAA;AAAA,IAAA,mBAAA;AAAA,IAAkB,KAAM,CAAA,SAAA;AAAA,GAAA,EAAU,CAC7C,EAAA,CAAA,CAAA;AAEJ,CAAA;;ACRA,MAAM,iBAGF,EAAC,CAAA;AACE,SAAS,YAAY,IAAc,EAAA;AACxC,EAAI,IAAA,CAAC,eAAe,IAAI,CAAA;AACtB,IAAe,cAAA,CAAA,IAAI,CAAI,GAAA,IAAA,CAA8C,MAAM;AACzE,MAAO,OAAA,IAAI,OAER,CAAA,CAAC,OAAY,KAAA;AACd,QAAA;AAAA;AAAA;AAAA;AAAA,UAIE,WAAW,IAAI,CAAA,CAAA;AAAA,SAEd,CAAA,IAAA;AAAA,UACC,CAAC,MAEK,KAAA;AACJ,YAAA,OAAA,CAAQ,OAAO,OAAO,CAAA,CAAA;AAAA,WACxB;AAAA,SACF,CACC,MAAM,MAAM;AACX,UAAQ,OAAA,CAAA;AAAA,YACN,OAAS,EAAA,aAAA;AAAA,WACV,CAAA,CAAA;AAAA,SACF,CAAA,CAAA;AAAA,OACJ,CAAA,CAAA;AAAA,KACF,CAAA,CAAA;AAEH,EAAA,OAAO,eAAe,IAAI,CAAA,CAAA;AAC5B;;;;;;;;AC/BA,MAAME,MAAQ,GAAA,mBAAA;AAAA,EACZ,OAAA;AAAA,EACA,qBAAA;AAAA,EACA;AAAA,IACE,sBAAwB,EAAA;AAAA,MACtB,OAAS,EAAA,MAAA;AAAA,MACT,aAAe,EAAA,QAAA;AAAA,MACf,GAAK,EAAA,CAAA;AAAA,MAEL,EAAI,EAAA;AAAA,QACF,KAAO,EAAA,oBAAA;AAAA,OACT;AAAA,KACF;AAAA,GACF;AAAA,EACA,CAAC,EAAE,KAAA,EAA+B,KAAA;AAChC,IACE,uBAAA,IAAA,CAAC,GAAI,EAAA,EAAA,SAAA,EAAU,qBACb,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,OAAA,EAAA,EAAQ,EAAG,EAAA,IAAA,EAAK,QAA0B,EAAA,4BAAA,EAAA,CAAA;AAAA,sBAC1C,GAAA,CAAA,OAAA,EAAA,EAAQ,EAAG,EAAA,IAAA,EAAK,QAAM,EAAA,QAAA,EAAA,CAAA;AAAA,sBACvB,GAAA,CAAC,aAAW,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA,KACpB,EAAA,CAAA,CAAA;AAAA,GAEJ;AACF,CAAA,CAAA;AAEO,MAAM,2BAA2B,SAGtC,CAAA;AAAA,EAHK,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA,CAAA;AAIL,IAA+DL,eAAA,CAAA,IAAA,EAAA,OAAA,EAAA;AAAA,MAC7D,QAAU,EAAA,KAAA;AAAA,MACV,YAAc,EAAA,EAAA;AAAA,KAChB,CAAA,CAAA;AAAA,GAAA;AAAA,EAEA,OAAO,yBAAyB,KAAgB,EAAA;AAC9C,IAAA,IAAI,EAAE,KAAiB,YAAA,OAAA,CAAA;AACrB,MAAA,OAAO,EAAE,QAAU,EAAA,IAAA,EAAM,YAAc,EAAA,MAAA,CAAO,KAAK,CAAE,EAAA,CAAA;AAAA,GACzD;AAAA,EAEA,MAAS,GAAA;AACP,IAAI,IAAA,IAAA,CAAK,MAAM,QAAU,EAAA;AACvB,MAAA,2BAAQK,MAAA,EAAA,EAAM,KAAO,EAAA,IAAA,CAAK,MAAM,YAAc,EAAA,CAAA,CAAA;AAAA,KAChD;AAEA,IAAA,OAAO,KAAK,KAAM,CAAA,QAAA,CAAA;AAAA,GACpB;AACF;;;;;;;;;;;;;;;;;;;;;AClDA,IAAA,SAAA,EAAA,QAAA,CAAA;AAgBA,MAAM,MAAS,GAAA,EAAE,WAAa,EAAA,EAAG,EAAA,CAAA;AAGjC,SAAS,eAAe,KAAkC,EAAA;AACxD,EAAA,IAAI,KAAU,KAAA,MAAA;AAAQ,IAAO,OAAA,IAAA,CAAA;AAC7B,EAAA,IAAI,KAAU,KAAA,OAAA;AAAS,IAAO,OAAA,KAAA,CAAA;AAE9B,EAAO,OAAA,KAAA,CAAA;AACT,CAAA;AAEO,MAAM,uBAAuB,YAGjC,CAAA;AAAA,EAUD,WAAY,CAAA;AAAA,IACV,EAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAAC,EAAAA,eAAAA;AAAA,GAKC,EAAA;AACD,IAAM,KAAA,EAAA,CAAA;AAlBR,IAAAN,eAAA,CAAA,IAAA,EAAA,WAAA,CAAA,CAAA;AACA,IAAYA,eAAA,CAAA,IAAA,EAAA,WAAA,EAAA,KAAA,CAAA,CAAA;AACZ,IAAYA,eAAA,CAAA,IAAA,EAAA,WAAA,EAAA,KAAA,CAAA,CAAA;AACZ,IAAAA,eAAA,CAAA,IAAA,EAAA,IAAA,CAAA,CAAA;AACA,IAAuCA,eAAA,CAAA,IAAA,EAAA,aAAA,EAAA,IAAA,CAAA,CAAA;AACvC,IAAYA,eAAA,CAAA,IAAA,EAAA,WAAA,EAAA,KAAA,CAAA,CAAA;AACZ,IAAAA,eAAA,CAAA,IAAA,EAAA,QAAA,CAAA,CAAA;AACA,IAAAA,eAAA,CAAA,IAAA,EAAA,OAAA,EAAqB,EAAC,CAAA,CAAA;AA2BtB,IAAYE,cAAA,CAAA,IAAA,EAAA,SAAA,EAAA;AAAA,MACV,OAAO,MAAM;AACX,QAAA,MAAM,YAAY,QAAS,CAAA,aAAA;AAAA,UACzB,CAAA,gBAAA,EAAmB,KAAK,EAAY,CAAA,EAAA,CAAA;AAAA,SACtC,CAAA;AAEA,QAAA,IAAI,CAAC,SAAW,EAAA;AACd,UAAQ,OAAA,CAAA,KAAA,CAAM,mBAAqB,EAAA,IAAA,CAAK,EAAE,CAAA,CAAA;AAC1C,UAAM,MAAA,IAAI,MAAM,yCAAyC,CAAA,CAAA;AAAA,SAC3D;AAEA,QAAO,OAAA,SAAA,CAAA;AAAA,OACT;AAAA,KACF,CAAA,CAAA;AAEA,IAAWA,cAAA,CAAA,IAAA,EAAA,QAAA,EAAA;AAAA,MACT,SAAS,MAAM;AACb,QAAK,KAAAC,cAAA,CAAA,IAAA,EAAK,UAAS,WAAY,EAAA,CAAA;AAC/B,QAAAA,cAAA,CAAA,IAAA,EAAK,UAAS,UAAW,EAAA,CAAA;AACzB,QAAAA,cAAA,CAAA,IAAA,EAAK,UAAS,KAAM,EAAA,CAAA;AAAA,OACtB;AAAA,MACA,aAAa,MAAM;AACjB,QAAM,MAAA,KAAA,GAAQ,KAAK,YAAa,EAAA,CAAA;AAChC,QAAA,MAAM,eAAe,KAAM,CAAA,aAAA;AAAA,UACzB,iBAAA;AAAA,SACF,CAAA;AACA,QAAA,MAAM,GAAM,GAAA,YAAA,CAAa,SACtB,CAAA,UAAA,CAAW,MAAQ,EAAA,GAAG,CACtB,CAAA,UAAA,CAAW,MAAQ,EAAA,GAAG,CACtB,CAAA,UAAA,CAAW,SAAS,GAAG,CAAA,CAAA;AAC1B,QAAA,YAAA,CAAa,SAAY,GAAA,EAAA,CAAA;AAEzB,QAAA,IAAA,CAAK,cAAc,aAAc,CAAA,GAAA,CAAI,OAAQ,CAAA,aAAA,EAAe,EAAE,CAAC,CAAA,CAAA;AAE/D,QAAA,OAAO,IAAK,CAAA,WAAA,CAAA;AAAA,OACd;AAAA,MACA,YAAY,MAAM;AAChB,QAAA,IAAIF,KAAgB,CAAA,QAAA,EAAW,CAAA,eAAA,CAAgB,KAAK,EAAE,CAAA;AAAG,UAAA,OAAA;AAEzD,QAAM,MAAA,SAAA,GAAYE,cAAK,CAAA,IAAA,EAAA,SAAA,CAAA,CAAU,KAAM,EAAA,CAAA;AAEvC,QAAA,MAAM,UAAU,MAAO,CAAA,WAAA;AAAA,UACrB,CAAC,GAAG,SAAA,CAAU,gBAA8B,CAAA,cAAc,CAAC,CAAE,CAAA,GAAA;AAAA,YAC3D,CAAC,OAAY,KAAA;AACX,cAAO,OAAA;AAAA,gBACL,OAAA,CAAQ,aAAa,MAAM,CAAA;AAAA,gBAC3B,cAAe,CAAA,OAAA,CAAQ,YAAa,CAAA,OAAO,CAAW,CAAA;AAAA,eACxD,CAAA;AAAA,aACF;AAAA,WACF;AAAA,SACF,CAAA;AAEA,QAAA,MAAM,aAAa,MAAO,CAAA,WAAA;AAAA,UACxB,CAAC,GAAG,SAAA,CAAU,gBAA8B,CAAA,iBAAiB,CAAC,CAAE,CAAA,GAAA;AAAA,YAC9D,CAAC,OAAY,KAAA;AACX,cAAO,OAAA;AAAA,gBACL,OAAA,CAAQ,aAAa,MAAM,CAAA;AAAA,gBAC3B,cAAe,CAAA,OAAA,CAAQ,YAAa,CAAA,OAAO,CAAW,CAAA;AAAA,eACxD,CAAA;AAAA,aACF;AAAA,WACF;AAAA,SACF,CAAA;AAEA,QAAA,cAAA,CAAe,KAAK,EAAI,EAAA,MAAA,CAAO,OAAO,OAAS,EAAA,UAAU,GAAG,KAAK,CAAA,CAAA;AAAA,OACnE;AAAA,MACA,OAAO,MAAM;AACX,QAAM,MAAA,SAAA,GAAYA,cAAK,CAAA,IAAA,EAAA,SAAA,CAAA,CAAU,KAAM,EAAA,CAAA;AACvC,QAAM,MAAA,KAAA,GAAQ,KAAK,YAAa,EAAA,CAAA;AAEhC,QAAA,MAAM,KAAgD,GAAA;AAAA,UACpD,IAAI,IAAK,CAAA,EAAA;AAAA,UACT,OAAS,EAAA,SAAA,CAAU,SAAU,CAAA,YAAA,CAAa,SAAS,CAAC,CAAA;AAAA,UACpD,MAAQ,EAAA,SAAA,CAAU,SAAU,CAAA,YAAA,CAAa,QAAQ,CAAC,CAAA;AAAA,UAClD,KAAA,EAAO,SAAU,CAAA,YAAA,CAAa,WAAW,CAAA;AAAA,UACzC,cAAgB,EAAA,SAAA,CAAU,SAAU,CAAA,YAAA,CAAa,gBAAgB,CAAC,CAAA;AAAA,UAClE,aAAe,EAAA,SAAA,CAAU,SAAU,CAAA,YAAA,CAAa,eAAe,CAAC,CAAA;AAAA,UAChE,IAAA,EAAM,SAAU,CAAA,YAAA,CAAa,MAAM,CAAA;AAAA,UACnC,aAAe,EAAA,SAAA,CAAU,SAAU,CAAA,YAAA,CAAa,eAAe,CAAC,CAAA;AAAA,UAChE,cAAgB,EAAA,SAAA,CAAU,SAAU,CAAA,YAAA,CAAa,gBAAgB,CAAC,CAAA;AAAA,UAClE,SAAW,EAAA,SAAA,CAAU,SAAU,CAAA,YAAA,CAAa,WAAW,CAAC,CAAA;AAAA,UACxD,KAAA,EAAO,SAAU,CAAA,YAAA,CAAa,OAAO,CAAA;AAAA,UACrC,IAAA,EAAM,MAAM,OAAQ,CAAA,KAAA;AAAA,SACtB,CAAA;AAEA,QAAA,IAAA,CAAK,KAAQ,GAAA,KAAA,CAAA;AAAA,OACf;AAAA,KACF,CAAA,CAAA;AAEA,IAAAH,eAAA,CAAA,IAAA,EAAA,YAAA,EAG8B,CAAC,EAAE,MAAA,EAAQ,GAAG,UAAA,IAAc,OAAY,KAAA;AACpE,MAAA,IAAI,CAAC,IAAK,CAAA,SAAA;AAAW,QAAA,OAAO,IAAI,OAAQ,CAAA,CAAC,OAAY,KAAA,OAAA,CAAQ,IAAI,CAAC,CAAA,CAAA;AAElE,MAAA,MAAM,WAAoC,EAAC,CAAA;AAE3C,MAAO,MAAA,CAAA,OAAA,CAAQ,UAAU,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,IAAA,EAAM,KAAK,CAAM,KAAA;AACpD,QAAS,QAAA,CAAA,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAI,GAAA,KAAA,CAAA;AAAA,OACzB,CAAA,CAAA;AAED,MAAA,OAAO,IAAI,OAAA,CAAuB,CAAC,OAAA,EAAS,MAAW,KAAA;AACrD,QAAgB,eAAA,CAAA,IAAA,CAAK,EAAI,EAAA,MAAA,EAAQ,QAAU,EAAA;AAAA,UACzC,GAAG,OAAA;AAAA,UACH,UAAA,CAAW,YAAY,IAAM,EAAA;AAC3B,YAAS,OAAA,EAAA,UAAA,GAAa,YAAY,IAAI,CAAA,CAAA;AACtC,YAAA,IAAI,UAAY,EAAA;AACd,cAAA,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,aACd;AAAO,cAAO,MAAA,EAAA,CAAA;AAAA,WAChB;AAAA,SACD,CAAA,CAAA;AAAA,OACF,CAAA,CAAA;AAAA,KACH,CAAA,CAAA;AA+CA,IAAAA,eAAA,CAAA,IAAA,EAAA,cAAA,EAAe,CAAC;AAAA,MACd,oBAAA;AAAA,MACA,OAAA;AAAA,KAII,KAAA;AACJ,MAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAI,SAE5C,IAAI,CAAA,CAAA;AACd,MAAA,MAAM,CAAC,SAAW,EAAA,YAAY,CAAI,GAAA,QAAA,CAAS,KAAK,SAAS,CAAA,CAAA;AAEzD,MAAA,QAAA,CAAS,MAAM;AACb,QAAA,KAAK,IAAK,CAAA,WAAA,EAAa,IAAK,CAAA,CAAC,IAAS,KAAA;AACpC,UAAA,sBAAA,CAAwB,QAAQ,MAAmC,CAAA,CAAA;AAAA,SACpE,CAAA,CAAA;AAED,QAAA,OAAO,IAAK,CAAA,EAAA;AAAA,UAAG,WAAA;AAAA,UAAa,CAAC,EAC3B,KAAA,YAAA,CAAa,CAAC,OAAA,KAAY,MAAM,OAAO,CAAA;AAAA,SACzC,CAAA;AAAA,OACD,CAAA,CAAA;AAED,MAAI,IAAA,mBAAA,KAAwB,QAAQ,mBAAwB,KAAA,MAAA;AAC1D,QAAO,OAAA,IAAA,CAAA;AAET,MACE,uBAAA,GAAA,CAAC,qBAAsB,CAAA,QAAA,EAAtB,EAA+B,KAAA,EAAO,MACrC,QAAC,kBAAA,GAAA,CAAA,eAAA,EAAA,EAAiB,GAAG,IAAA,CAAK,KACxB,EAAA,QAAA,kBAAA,GAAA;AAAA,QAAC,oBAAA;AAAA,QAAA;AAAA,UACE,GAAG,IAAK,CAAA,KAAA;AAAA,UACT,WAAa,EAAA,mBAAA;AAAA,UAEb,QAAA,kBAAA,GAAA;AAAA,YAAC,IAAA,CAAK,UAAU,YAAa,CAAA,8BAAA;AAAA,YAA5B;AAAA,cACC,SAAS,IAAK,CAAA,EAAA;AAAA,cAEd,QAAA,kBAAA,GAAA,CAAC,sBACE,QACC,EAAA,SAAA,mBAAA,GAAA,CAAC,WAAQ,WAAa,EAAA,mBAAA,CAAoB,WAAa,EAAA,CAAA,GACrD,IACN,EAAA,CAAA;AAAA,aAAA;AAAA,WACF;AAAA,SAAA;AAAA,SAEJ,CACF,EAAA,CAAA,CAAA;AAAA,KAEJ,CAAA,CAAA;AAzNE,IAAA,IAAA,CAAK,SAAY,GAAA,SAAA,CAAA;AACjB,IAAA,IAAA,CAAK,EAAK,GAAA,EAAA,CAAA;AACV,IAAAG,cAAA,CAAA,IAAA,EAAK,UAAS,OAAQ,EAAA,CAAA;AAEtB,IAAA,IAAA,CAAK,MAAS,GAAA,YAAA;AAAA,sBACZ,GAAA;AAAA,QAAC,IAAK,CAAA,YAAA;AAAA,QAAL;AAAA,UACC,oBAAsBG,EAAAA,eAAAA;AAAA,UACtB,OAAS,EAAA,WAAA,CAAY,IAAK,CAAA,KAAA,CAAM,IAAI,CAAA;AAAA,SAAA;AAAA,OACtC;AAAA,MACA,IAAK,CAAA,YAAA,EAAe,CAAA,aAAA,CAAc,iBAAiB,CAAA;AAAA,MACnD,IAAK,CAAA,EAAA;AAAA,KACP,CAAA;AAAA,GACF;AAAA,EAmHA,YAAe,GAAA;AACb,IAAA,MAAM,QAAQ,QAAS,CAAA,aAAA;AAAA,MACrB,CAAA,UAAA,EAAa,KAAK,EAAE,CAAA,cAAA,CAAA;AAAA,KACtB,CAAA;AAEA,IAAA,IAAI,CAAC,KAAO,EAAA;AACV,MAAQ,OAAA,CAAA,KAAA,CAAM,yBAA2B,EAAA,IAAA,CAAK,EAAE,CAAA,CAAA;AAChD,MAAM,MAAA,IAAI,MAAM,yBAAyB,CAAA,CAAA;AAAA,KAC3C;AAEA,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EAEA,aAAgB,GAAA;AACd,IAAA,OAAOL,KAAgB,CAAA,QAAA,EAAW,CAAA,eAAA,CAAgB,KAAK,EAAE,CAAA,CAAA;AAAA,GAC3D;AAAA,EAEA,IAAO,GAAA;AACL,IAAM,MAAA,SAAA,GAAY,KAAK,YAAa,EAAA,CAAA;AACpC,IAAA,SAAA,CAAU,MAAM,OAAU,GAAA,MAAA,CAAA;AAC1B,IAAA,SAAA,CAAU,UAAa,GAAA,MAAA,CAAA;AAEvB,IAAA,IAAA,CAAK,SAAY,GAAA,KAAA,CAAA;AACjB,IAAK,IAAA,CAAA,IAAA,CAAK,WAAa,EAAA,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,GACvC;AAAA,EAEA,OAAU,GAAA;AACR,IAAA,OAAO,IAAK,CAAA,UAAA,CAAW,EAAE,MAAA,EAAQ,WAAW,CAAA,CAAA;AAAA,GAC9C;AAAA,EAEA,YAAe,GAAA;AACb,IAAA,IAAA,CAAK,SAAY,GAAA,IAAA,CAAA;AACjB,IAAK,IAAA,CAAA,IAAA,CAAK,aAAa,IAAI,CAAA,CAAA;AAAA,GAC7B;AAAA,EAEA,IAAO,GAAA;AACL,IAAM,MAAA,SAAA,GAAY,KAAK,YAAa,EAAA,CAAA;AACpC,IAAA,SAAA,CAAU,MAAM,OAAU,GAAA,OAAA,CAAA;AAC1B,IAAA,SAAA,CAAU,UAAa,GAAA,OAAA,CAAA;AAEvB,IAAA,IAAA,CAAK,SAAY,GAAA,IAAA,CAAA;AACjB,IAAA,IAAA,CAAK,SAAY,GAAA,IAAA,CAAA;AACjB,IAAK,IAAA,CAAA,IAAA,CAAK,WAAa,EAAA,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,GACvC;AAgDF,CAAA;AA5ME,SAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAeA,QAAA,GAAA,IAAA,OAAA,EAAA;;AC5Ec,SAAA,SAAA,CAAU,KAAYM,YAA0B,EAAA;AAC9D,EAAA,MAAM,EAAK,GAAA,GAAA,CAAA;AAEX,EAAA,IACE,GAAG,aAAkB,KAAA,IAAA,IACrB,QAAQ,EAAG,CAAA,aAAA,EAA8B,CAAC,OAAY,KAAA;AACpD,IACE,OAAA,OAAA,CAAQ,kBAAkB,IAC1B,IAAA,OAAA,KAAY,SAAS,WAAY,EAAA,IACjC,OAAQ,CAAA,OAAA,CAAQ,MAAW,KAAA,KAAA,CAAA,CAAA;AAAA,GAE9B,CACD,EAAA;AACA,IAAM,MAAA,OAAA,GAAU,QAAS,CAAA,gBAAA,CAAiB,sBAAsB,CAAA,CAAA;AAEhE,IAAA,OAAA,CAAQ,OAAQ,CAAA,CAAC,EAAO,KAAA,EAAA,CAAG,QAAQ,CAAA,CAAA;AACnC,IAAAA,YAAY,CAAA,aAAA,EAAe,YAAa,CAAA,OAAA,EAAS,EAAE,CAAA,CAAA;AAAA,GACrD;AACF;;ACnBO,MAAM,iBAAiB,CAAC;AAAA,EAC7B,GAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AACF,CAA6B,KAAA;AAC3B,EAAA,OACE,OAAO,OAAW,IAAA,OAAA,IAAW,MAAU,IAAA,IAAA,IAAQ,WAAW,OAAW,IAAA,KAAA,CAAA;AAEzE,CAAA;;ACXa,MAAA,cAAA,GAAiB,CAAC,aAA8B,KAAA;AAC3D,EAAO,OAAA;AAAA,IACL,GAAK,EAAA;AAAA,MACH,KAAK,aAAc,CAAA,QAAA;AAAA,MACnB,MAAQ,EAAA,aAAA,CAAc,QAAW,GAAA,aAAA,CAAc,WAAc,GAAA,CAAA;AAAA,MAC7D,MAAM,aAAc,CAAA,SAAA;AAAA,MACpB,OAAO,aAAc,CAAA,UAAA;AAAA,KACvB;AAAA,IACA,MAAQ,EAAA;AAAA,MACN,GAAK,EAAA,aAAA,CAAc,WAAc,GAAA,aAAA,CAAc,WAAc,GAAA,CAAA;AAAA,MAC7D,QAAQ,aAAc,CAAA,WAAA;AAAA,MACtB,OAAO,aAAc,CAAA,UAAA;AAAA,MACrB,MAAM,aAAc,CAAA,SAAA;AAAA,KACtB;AAAA,GACF,CAAA;AACF,CAAA;;ACZgB,SAAA,QAAA,CAAS,OAAcA,YAA0B,EAAA;AAC/D,EAAA,MAAM,EAAK,GAAA,KAAA,CAAA;AACX,EAAA,EAAA,CAAG,cAAe,EAAA,CAAA;AAElB,EAAAA,aAAY,OAAU,GAAA,CAAA,CAAA,CAAA;AACtB,EAAA,IAAA,CACG,EAAG,CAAA,OAAA,KAAYA,YAAY,CAAA,gBAAA,CAAiB,KAC3C,EAAG,CAAA,OAAA,KAAYA,YAAY,CAAA,gBAAA,CAAiB,CAC9CA,KAAAA,YAAAA,CAAY,eAAoB,KAAA,EAAA,IAChCA,aAAY,SACZ,EAAA;AACA,IAAAA,aAAY,YAAa,EAAA,CAAA;AACzB,IAAAA,YAAAA,CAAY,qBAAqBA,YAAY,CAAA,eAAA;AAAA,MAC3C,EAAG,CAAA,OAAA;AAAA,MACH,EAAA,CAAG,UAAUA,YAAY,CAAA,aAAA;AAAA,KAC3B,CAAA;AAEA,IAAAA,YAAAA,CAAY,gBAAiB,CAAA,CAAA,GAAI,EAAG,CAAA,OAAA,CAAA;AACpC,IAAAA,YAAAA,CAAY,gBAAiB,CAAA,CAAA,GAAI,EAAG,CAAA,OAAA,CAAA;AAEpC,IAAA,MAAM,kBAAkBA,YAAY,CAAA,iBAAA;AAAA,MAClC,EAAG,CAAA,OAAA;AAAA,MACH,EAAA,CAAG,UAAUA,YAAY,CAAA,aAAA;AAAA,KAC3B,CAAA;AAEA,IACEA,IAAAA,YAAAA,CAAY,iBACZ,cAAe,CAAA;AAAA,MACb,SAAS,EAAG,CAAA,OAAA;AAAA,MACZ,OAAA,EAAS,EAAG,CAAA,OAAA,GAAUA,YAAY,CAAA,aAAA;AAAA,MAClC,MAAA,EAAQA,aAAY,aAAe,EAAA,WAAA;AAAA,MACnC,GAAA,EAAKA,aAAY,aAAe,EAAA,QAAA;AAAA,MAChC,IAAA,EAAMA,aAAY,aAAe,EAAA,SAAA;AAAA,MACjC,KAAA,EAAOA,aAAY,aAAe,EAAA,UAAA;AAAA,KACnC,CACD,EAAA;AACA,MAAA,OAAA;AAAA,KACF;AAEA,IAAIA,IAAAA,YAAAA,CAAY,sBAAsB,eAAiB,EAAA;AACrD,MAAM,MAAA,WAAA,GAAcA,aAAY,MAAO,CAAA,aAAA;AAAA,QACrC,CAAA,sBAAA,EAAyBA,YAAY,CAAA,kBAAA,CAAmB,EAAE,CAAA,EAAA,CAAA;AAAA,OAC5D,CAAA;AACA,MAAM,MAAA,aAAA,GAAgBA,aAAY,MAAO,CAAA,aAAA;AAAA,QACvC,CAAA,sBAAA,EAAyBA,aAAY,eAAe,CAAA,EAAA,CAAA;AAAA,OACtD,CAAA;AACA,MAAM,MAAA,aAAA,GAAgBA,aAAY,MAAO,CAAA,aAAA;AAAA,QACvC,CAAA,kBAAA,EAAqB,gBAAgB,SAAS,CAAA,EAAA,CAAA;AAAA,OAChD,CAAA;AAEA,MAAA,IAAI,aAAe,EAAA;AACjB,QAAA,IACE,cAAe,CAAA;AAAA,UACb,SAAS,EAAG,CAAA,OAAA;AAAA,UACZ,OAAA,EAAS,EAAG,CAAA,OAAA,GAAUA,YAAY,CAAA,aAAA;AAAA,UAClC,GAAG,cAAe,CAAA;AAAA,YAChB,GAAGA,YAAY,CAAA,kBAAA;AAAA,YACf,SAAW,EAAA,aAAA,EAAe,qBAAsB,EAAA,CAAE,IAAQ,IAAA,CAAA;AAAA,YAC1D,UAAY,EAAA,aAAA,EAAe,qBAAsB,EAAA,CAAE,KAAS,IAAA,CAAA;AAAA,WAC7D,CAAE,CAAA,GAAA;AAAA,SACJ,CACD,EAAA;AACA,UAAA,IAAI,aAAe,EAAA;AACjB,YAAc,aAAA,CAAA,YAAA,CAAa,SAAS,2BAA2B,CAAA,CAAA;AAAA,WACjE;AACA,UAAA,IAAI,eAAe,eAAiB,EAAA;AAClC,YAAA,IAAI,aAAe,EAAA;AACjB,cAAAA,YAAY,CAAA,SAAA,CAAU,YAAa,CAAA,OAAA,EAAS,eAAe,CAAA,CAAA;AAC3D,cAAAA,YAAY,CAAA,cAAA;AAAA,gBACV,WAAA;AAAA,gBACAA,YAAY,CAAA,SAAA;AAAA,gBACZ,aAAA;AAAA,eACF,CAAA;AACA,cAAAA,aAAY,QAAS,EAAA,CAAA;AACrB,cAAAA,aAAY,YAAa,EAAA,CAAA;AAAA,aAC3B;AAAA,WACF;AAAA,mBAEA,cAAe,CAAA;AAAA,UACb,SAAS,EAAG,CAAA,OAAA;AAAA,UACZ,OAAA,EAAS,EAAG,CAAA,OAAA,GAAUA,YAAY,CAAA,aAAA;AAAA,UAClC,GAAG,cAAe,CAAA;AAAA,YAChB,GAAGA,YAAY,CAAA,kBAAA;AAAA,YACf,SAAW,EAAA,aAAA,EAAe,qBAAsB,EAAA,CAAE,IAAQ,IAAA,CAAA;AAAA,YAC1D,UAAY,EAAA,aAAA,EAAe,qBAAsB,EAAA,CAAE,KAAS,IAAA,CAAA;AAAA,WAC7D,CAAE,CAAA,MAAA;AAAA,SACJ,CACD,EAAA;AACA,UAAMC,MAAAA,YAAAA,GAAcD,aAAY,MAAO,CAAA,aAAA;AAAA,YACrC,CAAA,sBAAA,EAAyBA,YAAY,CAAA,kBAAA,CAAmB,EAAE,CAAA,EAAA,CAAA;AAAA,WAC5D,CAAA;AACA,UAAME,MAAAA,cAAAA,GAAgBF,aAAY,MAAO,CAAA,aAAA;AAAA,YACvC,CAAA,sBAAA,EAAyBA,aAAY,eAAe,CAAA,EAAA,CAAA;AAAA,WACtD,CAAA;AACA,UAAA,IAAIE,cAAe,EAAA;AACjB,YAAAA,cAAAA,CAAc,YAAa,CAAA,OAAA,EAAS,gBAAgB,CAAA,CAAA;AAAA,WACtD;AACA,UAAA,IAAID,gBAAe,eAAiB,EAAA;AAClC,YAAME,MAAAA,cAAAA,GAAgBH,aAAY,MAAO,CAAA,aAAA;AAAA,cACvC,CAAA,kBAAA,EAAqB,gBAAgB,SAAS,CAAA,EAAA,CAAA;AAAA,aAChD,CAAA;AACA,YAAA,IAAIG,cAAe,EAAA;AACjB,cAAAH,YAAY,CAAA,SAAA,CAAU,YAAa,CAAA,OAAA,EAAS,eAAe,CAAA,CAAA;AAC3D,cAAAA,YAAY,CAAA,aAAA,CAAcA,YAAY,CAAA,SAAA,EAAWC,YAAW,CAAA,CAAA;AAC5D,cAAAD,aAAY,QAAS,EAAA,CAAA;AACrB,cAAAA,aAAY,YAAa,EAAA,CAAA;AAAA,aAC3B;AAAA,WACF;AAAA,SACF;AAAA,OACF;AAAA,KACS,MAAA,IAAA,CAACA,YAAY,CAAA,kBAAA,IAAsB,eAAiB,EAAA;AAC7D,MAAM,MAAA,aAAA,GAAgBA,aAAY,MAAO,CAAA,aAAA;AAAA,QACvC,CAAA,kBAAA,EAAqB,gBAAgB,SAAS,CAAA,EAAA,CAAA;AAAA,OAChD,CAAA;AACA,MAAA,IAAI,aAAe,EAAA;AACjB,QAAM,MAAA,aAAA,GAAgBA,aAAY,MAAO,CAAA,aAAA;AAAA,UACvC,CAAA,sBAAA,EAAyBA,aAAY,eAAe,CAAA,EAAA,CAAA;AAAA,SACtD,CAAA;AACA,QAAA,IAAI,aAAe,EAAA;AACjB,UAAc,aAAA,CAAA,YAAA,CAAa,SAAS,gBAAgB,CAAA,CAAA;AAAA,SACtD;AACA,QAAAA,YAAY,CAAA,SAAA,CAAU,YAAa,CAAA,OAAA,EAAS,eAAe,CAAA,CAAA;AAC3D,QAAAA,YAAY,CAAA,cAAA;AAAA,UACV,aAAA;AAAA,UACAA,YAAY,CAAA,SAAA;AAAA,SACd,CAAA;AACA,QAAAA,aAAY,QAAS,EAAA,CAAA;AACrB,QAAAA,aAAY,YAAa,EAAA,CAAA;AAAA,OAC3B;AAAA,KACF;AAAA,GACF;AACF;;ACpIgB,SAAA,SAAA,CACd,EACA,EAAA,EAAA,EACAA,YACA,EAAA;AACA,EAAA,IAAI,EAAE,EAAc,YAAA,WAAA,CAAA;AAAc,IAAA,OAAA;AAClC,EAAAA,aAAY,WAAY,EAAA,CAAA;AACxB,EAAAA,YAAAA,CAAY,cAAc,EAAC,CAAA;AAE3B,EAAA,MAAM,WAAc,GAAA,iBAAA;AAAA,IAClB,EAAG,CAAA,MAAA;AAAA,IACH,CAAC,OAAY,KAAA,CAAC,CAAC,OAAA,CAAQ,SAAS,EAAM,IAAA,CAAC,CAAC,OAAA,CAAQ,OAAS,EAAA,KAAA;AAAA,GAC3D,CAAA;AAEA,EAAA,EAAA,EAAI,YAAc,EAAA,OAAA,CAAQ,MAAQ,EAAA,WAAA,EAAa,QAAQ,EAAY,CAAA,CAAA;AACnE,EAAA,IAAI,WAAa,EAAA;AACf,IAAAA,YAAY,CAAA,gBAAA,GAAmB,WAAY,CAAA,SAAA,CAAU,IAAI,CAAA,CAAA;AACzD,IAAAA,YAAAA,CAAY,gBAAiB,CAAA,KAAA,CAAM,QAAW,GAAA,OAAA,CAAA;AAC9C,IAAAA,YAAAA,CAAY,gBAAiB,CAAA,KAAA,CAAM,GAAM,GAAA,gBAAA,CAAA;AAEzC,IAAA,MAAM,QACJA,GAAAA,YAAAA,CAAY,gBAAiB,CAAA,gBAAA,CAA8B,GAAG,CAAA,CAAA;AAChE,IAAA,QAAA,CAAS,QAAQ,CAAC,OAAA,KAAa,OAAQ,CAAA,KAAA,CAAM,WAAW,QAAS,CAAA,CAAA;AACjE,IAAS,QAAA,CAAA,IAAA,CAAK,MAAOA,CAAAA,YAAAA,CAAY,gBAAgB,CAAA,CAAA;AACjD,IAAA,EAAA,EAAI,YAAc,EAAA,YAAA,CAAaA,YAAY,CAAA,gBAAA,EAAkB,GAAG,CAAC,CAAA,CAAA;AAAA,GACnE;AACA,EAAA,IAAI,GAAG,YAAc,EAAA;AAEnB,IAAA,EAAA,CAAG,aAAa,aAAgB,GAAA,MAAA,CAAA;AAAA,GAClC;AAEA,EAAA,UAAA,CAAW,MAAM;AACf,IAAA,MAAM,aAAgB,GAAA,iBAAA;AAAA,MACpB,EAAG,CAAA,MAAA;AAAA,MACH,CAAC,OAAA,KAAY,CAAC,CAAC,QAAQ,OAAS,EAAA,UAAA;AAAA,KAClC,CAAA;AAEA,IAAA,MAAM,QAAWA,GAAAA,YAAAA,CAAY,IAAM,EAAA,gBAAA,CAAiB,mBAAmB,CAAA,CAAA;AAEvE,IAAA,MAAM,kBAA4B,EAAC,CAAA;AAEnC,IAAU,QAAA,EAAA,OAAA,CAAQ,CAAC,GAAQ,KAAA;AACzB,MAAI,IAAA,GAAA,CAAI,QAAS,CAAA,MAAA,KAAW,CAAG,EAAA;AAC7B,QAAA,eAAA,CAAgB,IAAM,CAAA,GAAA,CAAoB,OAAQ,CAAA,UAAA,IAAc,EAAE,CAAA,CAAA;AAAA,OACpE;AAAA,KACD,CAAA,CAAA;AAED,IAAgB,eAAA,CAAA,OAAA,CAAQ,CAAC,UAAe,KAAA;AACtC,MAAM,MAAA,OAAA,GAAUA,aAAY,IAAM,EAAA,aAAA;AAAA,QAChC,qBAAqB,UAAU,CAAA,EAAA,CAAA;AAAA,OACjC,CAAA;AACA,MAAA,IAAI,OAAS,EAAA;AACX,QAAQ,OAAA,CAAA,YAAA,CAAa,SAAS,uCAAuC,CAAA,CAAA;AAAA,OACvE;AAAA,KACD,CAAA,CAAA;AAED,IAAAA,aAAY,QAAS,EAAA,CAAA;AAErB,IAAA,IAAI,WAAa,EAAA;AACf,MAAAA,YAAY,CAAA,sBAAA,GACV,aAAe,EAAA,OAAA,CAAQ,UAAc,IAAA,EAAA,CAAA;AACvC,MAAAA,YAAAA,CAAY,eAAkB,GAAA,WAAA,CAAY,OAAQ,CAAA,EAAA,CAAA;AAClD,MAAAA,aAAY,aAAgB,GAAA,WAAA,CAAA;AAAA,KAC9B;AACA,IAAIA,IAAAA,YAAAA,CAAY,oBAAoB,EAAI,EAAA;AACtC,MAAA,OAAA;AAAA,KACF;AACA,IAAM,MAAA,QAAA,GAAW,WAAa,EAAA,SAAA,CAAU,IAAI,CAAA,CAAA;AAC5C,IAAA,QAAA,CAAS,MAAM,OAAU,GAAA,CAAA,GAAA,CAAA,CAAA;AACzB,IAAA,QAAA,CAAS,MAAM,KAAQ,GAAA,CAAA,IAAA,CAAA,CAAA;AACvB,IAAA,QAAA,CAAS,MAAM,MAAS,GAAA,CAAA,IAAA,CAAA,CAAA;AACxB,IAAA,QAAA,CAAS,MAAM,eAAkB,GAAA,CAAA,eAAA,CAAA,CAAA;AACjC,IAAA,QAAA,CAAS,SAAY,GAAA,qBAAA,CAAA;AACrB,IAAAA,aAAY,SAAY,GAAA,QAAA,CAAA;AAAA,KACvB,CAAC,CAAA,CAAA;AACN;;AC1EgB,SAAA,IAAA,CAAK,OAAcA,YAA0B,EAAA;AAC3D,EAAA,IAAIA,aAAY,IAAM,EAAA;AACpB,IAAA,MAAM,EAAK,GAAA,KAAA,CAAA;AACX,IAAA,MAAM,IAAO,GAAA,EAAA,EAAI,YAAc,EAAA,OAAA,CAAQ,MAAM,CAAA,CAAA;AAE7C,IAAA,MAAM,QAAWA,GAAAA,YAAAA,CAAY,IAAM,EAAA,gBAAA,CAAiB,mBAAmB,CAAA,CAAA;AAEvE,IAAS,QAAA,CAAA,OAAA,CAAQ,CAAC,GAAQ,KAAA;AACxB,MAAI,GAAA,CAAA,YAAA,CAAa,SAAS,EAAE,CAAA,CAAA;AAAA,KAC7B,CAAA,CAAA;AAED,IAAM,MAAA,aAAA,GAAgBA,aAAY,IAAK,CAAA,aAAA;AAAA,MACrC,CAAA,sBAAA,EAAyBA,aAAY,eAAe,CAAA,4BAAA,CAAA;AAAA,KACtD,CAAA;AAEA,IAAA,IAAI,aAAe,EAAA;AACjB,MAAc,aAAA,CAAA,YAAA,CAAa,SAAS,EAAE,CAAA,CAAA;AAAA,KACxC;AACA,IAAM,MAAA,QAAA,GAAW,QAAS,CAAA,aAAA,CAAc,sBAAsB,CAAA,CAAA;AAE9D,IAAA,IAAI,IAAM,EAAA;AACR,MAAA,MAAM,QAAQ,QAAS,CAAA,aAAA;AAAA,QACrB,yBAAyB,IAAI,CAAA,4BAAA,CAAA;AAAA,OAC/B,CAAA;AACA,MAAS,QAAA,CAAA,OAAA,CAAQ,CAAC,GAAQ,KAAA;AACxB,QAAI,IAAA,GAAA,CAAI,QAAS,CAAA,MAAA,KAAW,CAAG,EAAA;AAC7B,UAAI,GAAA,CAAA,YAAA,CAAa,SAAS,EAAE,CAAA,CAAA;AAAA,SAC9B;AAAA,OACD,CAAA,CAAA;AACD,MAAA,IAAI,QAAU,EAAA;AACZ,QAAA,MAAM,UAAa,GAAA,iBAAA;AAAA,UACjB,QAAA;AAAA,UACA,CAAC,OAAA,KAAY,CAAC,CAAC,QAAQ,OAAQ,CAAA,UAAA;AAAA,SACjC,CAAA;AAEA,QAAA,IAAI,UAAY,EAAA;AACd,UAAA,MAAM,WAAc,GAAA,KAAA,CAAM,IAAK,CAAA,UAAA,CAAW,QAAQ,CAAA,CAAA;AAClD,UAAM,MAAA,OAAA,GAAW,MAAsB,OAAQ,CAAA,EAAA,CAAA;AAE/C,UAAA,IAAI,OAAS,EAAA;AACX,YAAA,MAAM,QAAQ,WAAY,CAAA,SAAA;AAAA,cACxB,CAAC,KAAA,KAAW,KAAsB,CAAA,OAAA,CAAQ,EAAO,KAAA,OAAA;AAAA,aACnD,CAAA;AAEA,YAAA,IAAI,OAAO,KAAA,KAAU,QAAY,IAAA,UAAA,CAAW,QAAQ,UAAY,EAAA;AAC9D,cAAK,KAAA,mBAAA;AAAA,gBACH,OAAA;AAAA,gBACA,WAAW,OAAQ,CAAA,UAAA;AAAA,gBACnB,KAAQ,GAAA,CAAA;AAAA,eACV,CAAA;AAAA,aACF;AAAA,WACF;AAAA,SACF;AACA,QAAA,QAAA,CAAS,YAAY,KAAa,CAAA,CAAA;AAAA,OACpC;AAAA,KACF;AAEA,IAAAA,aAAY,eAAkB,GAAA,EAAA,CAAA;AAC9B,IAAAA,YAAAA,CAAY,YAAY,EAAC,CAAA;AACzB,IAAAA,aAAY,WAAY,EAAA,CAAA;AAExB,IAAAA,aAAY,iBAAkB,EAAA,CAAA;AAAA,GAChC;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;ACpEA,IAAA,aAAA,CAAA;AAOO,MAAM,WAAY,CAAA;AAAA,EAAlB,WAAA,GAAA;AACL,IAAAL,cAAA,CAAA,IAAA,EAAA,aAAA,EAAgC,EAAC,CAAA,CAAA;AAEjC,IAAAF,eAAA,CAAA,IAAA,EAAA,WAAA,EAAY,MAAM;AAChB,MAAAG,cAAA,CAAA,IAAA,EAAK,aAAc,CAAA,CAAA,OAAA,CAAQ,CAAC,UAAA,KAAe,YAAY,CAAA,CAAA;AACvD,MAAAC,cAAA,CAAA,IAAA,EAAK,eAAgB,EAAC,CAAA,CAAA;AAEtB,MAAA,IAAA,CAAK,IAAK,CAAA,gBAAA,CAAiB,UAAY,EAAA,IAAA,CAAK,QAAQ,CAAA,CAAA;AACpD,MAAA,IAAA,CAAK,IAAK,CAAA,gBAAA,CAAiB,MAAQ,EAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAC5C,MAAKD,cAAA,CAAA,IAAA,EAAA,aAAA,CAAA,CAAc,KAAK,MAAM;AAC5B,QAAA,IAAA,CAAK,IAAK,CAAA,mBAAA,CAAoB,UAAY,EAAA,IAAA,CAAK,QAAQ,CAAA,CAAA;AACvD,QAAA,IAAA,CAAK,IAAK,CAAA,mBAAA,CAAoB,MAAQ,EAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,OAChD,CAAA,CAAA;AACD,MAAA,IAAI,KAAK,MAAQ,EAAA;AACf,QAAA,IAAA,CAAK,MAAO,CAAA,gBAAA,CAAiB,WAAa,EAAA,IAAA,CAAK,SAAS,CAAA,CAAA;AACxD,QAAA,IAAA,CAAK,MAAO,CAAA,gBAAA,CAAiB,WAAa,EAAA,IAAA,CAAK,SAAS,CAAA,CAAA;AACxD,QAAA,IAAA,CAAK,IAAK,CAAA,gBAAA,CAAiB,WAAa,EAAA,IAAA,CAAK,SAAS,CAAA,CAAA;AACtD,QAAKA,cAAA,CAAA,IAAA,EAAA,aAAA,CAAA,CAAc,KAAK,MAAM;AAC5B,UAAA,IAAA,CAAK,MAAO,CAAA,mBAAA,CAAoB,WAAa,EAAA,IAAA,CAAK,SAAS,CAAA,CAAA;AAC3D,UAAA,IAAA,CAAK,MAAO,CAAA,mBAAA,CAAoB,WAAa,EAAA,IAAA,CAAK,SAAS,CAAA,CAAA;AAC3D,UAAA,IAAA,CAAK,IAAK,CAAA,mBAAA,CAAoB,WAAa,EAAA,IAAA,CAAK,SAAS,CAAA,CAAA;AAAA,SAC1D,CAAA,CAAA;AAAA,OACH;AACA,MAAK,IAAA,CAAA,MAAA,CAAO,GAAI,CAAA,CAAC,EAAO,KAAA;AACtB,QAAC,EAAmB,CAAA,gBAAA,CAAiB,WAAa,EAAA,CAAC,EAAO,KAAA;AACxD,UAAK,IAAA,CAAA,SAAA,CAAU,IAAI,EAAE,CAAA,CAAA;AAAA,SACtB,CAAA,CAAA;AACD,QAAKA,cAAA,CAAA,IAAA,EAAA,aAAA,CAAA,CAAc,KAAK,MAAM;AAC5B,UAAC,EAAmB,CAAA,mBAAA,CAAoB,WAAa,EAAA,CAAC,EAAO,KAAA;AAC3D,YAAK,IAAA,CAAA,SAAA,CAAU,IAAI,EAAE,CAAA,CAAA;AAAA,WACtB,CAAA,CAAA;AAAA,SACF,CAAA,CAAA;AACD,QAAO,OAAA,EAAA,CAAA;AAAA,OACR,CAAA,CAAA;AAAA,KACH,CAAA,CAAA;AACA,IAAAH,eAAA,CAAA,IAAA,EAAA,WAAA,EAA0B,EAAC,CAAA,CAAA;AAC3B,IAA8BA,eAAA,CAAA,IAAA,EAAA,SAAA,EAAA,IAAA,CAAA,CAAA;AAI9B,IAAUA,eAAA,CAAA,IAAA,EAAA,SAAA,EAAA,CAAA,CAAA,CAAA,CAAA;AACV,IAAAA,eAAA,CAAA,IAAA,EAAA,aAAA,EAA8B,EAAC,CAAA,CAAA;AAC/B,IAAOA,eAAA,CAAA,IAAA,EAAA,MAAA,EAAA,QAAA,CAAS,cAAc,eAAe,CAAA,CAAA,CAAA;AAC7C,IAASA,eAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,CAAS,cAAc,eAAe,CAAA,CAAA,CAAA;AAC/C,IAAAA,eAAA,CAAA,IAAA,EAAA,kBAAA,EAGI,EAAE,CAAA,EAAG,CAAG,EAAA,CAAA,EAAG,CAAE,EAAA,CAAA,CAAA;AACjB,IAAmCA,eAAA,CAAA,IAAA,EAAA,eAAA,EAAA,IAAA,CAAA,CAAA;AACnC,IAAmCA,eAAA,CAAA,IAAA,EAAA,WAAA,EAAA,IAAA,CAAA,CAAA;AACnC,IAAuCA,eAAA,CAAA,IAAA,EAAA,kBAAA,EAAA,IAAA,CAAA,CAAA;AACvC,IAASA,eAAA,CAAA,IAAA,EAAA,QAAA,EAAA;AAAA,MACP,GAAG,QAAS,CAAA,gBAAA,CAAiB,uBAAuB,CAAA;AAAA,KACtD,CAAA,CAAA;AACA,IAAgBA,eAAA,CAAA,IAAA,EAAA,eAAA,EAAA,QAAA,CAAS,kBAAkB,SAAa,IAAA,CAAA,CAAA,CAAA;AACxD,IAAoCA,eAAA,CAAA,IAAA,EAAA,eAAA,EAAA,IAAA,CAAA,CAAA;AACpC,IAAkBA,eAAA,CAAA,IAAA,EAAA,iBAAA,EAAA,EAAA,CAAA,CAAA;AAClB,IAAyBA,eAAA,CAAA,IAAA,EAAA,wBAAA,EAAA,EAAA,CAAA,CAAA;AACzB,IAAAA,eAAA,CAAA,IAAA,EAAA,oBAAA,CAAA,CAAA;AAEA,IAAAA,eAAA,CAAA,IAAA,EAAA,eAAA,EAAgB,MAAM;AACpB,MAAM,MAAA,YAAA,GAAe,QAAS,CAAA,aAAA,CAA2B,cAAc,CAAA,CAAA;AACvE,MAAA,IAAI,YAAc,EAAA;AAChB,QAAa,YAAA,CAAA,KAAA,CAAM,GAAM,GAAA,CAAA,EAAA,CACtB,QAAS,CAAA,gBAAA,EAAkB,SAAa,IAAA,CAAA,IACzC,MAAO,CAAA,YAAA,CAAa,OAAQ,CAAA,MAAM,CACpC,CAAA,EAAA,CAAA,CAAA;AAAA,OACF;AAAA,KACF,CAAA,CAAA;AACA,IAAAA,eAAA,CAAA,IAAA,EAAA,mBAAA,EAAoB,MAAM;AACxB,MAAA,IAAA,CAAK,YAAa,EAAA,CAAA;AAClB,MAAM,MAAA,SAAA,GAAY,QAAS,CAAA,gBAAA,CAAiB,sBAAsB,CAAA,CAAA;AAElE,MAAU,SAAA,CAAA,OAAA,CAAQ,CAAC,EAAO,KAAA;AACxB,QAAA,EAAA,CAAG,MAAO,EAAA,CAAA;AAAA,OACX,CAAA,CAAA;AAED,MAAA,IAAA,CAAK,kBAAkB,MAAO,EAAA,CAAA;AAC9B,MAAA,IAAA,CAAK,gBAAmB,GAAA,IAAA,CAAA;AAAA,KAC1B,CAAA,CAAA;AACA,IAAAA,eAAA,CAAA,IAAA,EAAA,cAAA,EAAe,MAAM;AACnB,MAAA,YAAA,CAAa,KAAK,OAAO,CAAA,CAAA;AAAA,KAC3B,CAAA,CAAA;AACA,IAAiBA,eAAA,CAAA,IAAA,EAAA,gBAAA,EAAA,CAAC,QAAqB,KAAuB,KAAA;AAC5D,MAAA,IAAI,CAAC,IAAK,CAAA,eAAA;AAAiB,QAAA,OAAA;AAC3B,MAAI,IAAA,IAAA,CAAK,YAAY,CAAI,CAAA,EAAA;AACvB,QAAA,MAAA,CAAO,YAAY,KAAK,CAAA,CAAA;AAAA,OAC1B;AACA,MAAA,YAAA,CAAa,KAAK,OAAO,CAAA,CAAA;AACzB,MAAK,IAAA,CAAA,OAAA,GAAU,WAAW,MAAM;AAC9B,QAAA,MAAA,CAAO,YAAY,KAAK,CAAA,CAAA;AAAA,SACvB,GAAG,CAAA,CAAA;AAAA,KACR,CAAA,CAAA;AACA,IAAiBA,eAAA,CAAA,IAAA,EAAA,gBAAA,EAAA,CAAC,SAAiB,EAAA,KAAA,EAAa,SAA2B,KAAA;AACzE,MAAA,IAAI,CAAC,IAAK,CAAA,eAAA;AAAiB,QAAA,OAAA;AAC3B,MAAA,IAAI,KAAK,OAAY,KAAA,CAAA,CAAA;AAAI,QAAU,SAAA,CAAA,YAAA,CAAa,OAAO,SAAS,CAAA,CAAA;AAChE,MAAA,YAAA,CAAa,KAAK,OAAO,CAAA,CAAA;AACzB,MAAK,IAAA,CAAA,OAAA,GAAU,WAAW,MAAM;AAC9B,QAAU,SAAA,CAAA,YAAA,CAAa,OAAO,SAAS,CAAA,CAAA;AAAA,SACtC,GAAG,CAAA,CAAA;AAAA,KACR,CAAA,CAAA;AACA,IAAgBA,eAAA,CAAA,IAAA,EAAA,eAAA,EAAA,CAAC,OAAa,SAAoB,KAAA;AAChD,MAAA,IAAI,CAAC,IAAK,CAAA,eAAA;AAAiB,QAAA,OAAA;AAC3B,MAAA,IAAI,KAAK,OAAY,KAAA,CAAA,CAAA;AAAI,QAAC,SAAA,CAA0B,MAAM,KAAK,CAAA,CAAA;AAC/D,MAAA,YAAA,CAAa,KAAK,OAAO,CAAA,CAAA;AACzB,MAAK,IAAA,CAAA,OAAA,GAAU,WAAW,MAAM;AAC9B,QAAC,SAAA,CAA0B,MAAM,KAAK,CAAA,CAAA;AAAA,SACrC,GAAG,CAAA,CAAA;AAAA,KACR,CAAA,CAAA;AACA,IAAAA,eAAA,CAAA,IAAA,EAAA,UAAA,EAAW,CAAC,KAAiB,KAAA;AAC3B,MAAA,QAAA,CAAS,OAAO,IAAI,CAAA,CAAA;AACpB,MAAA,IAAA,CAAK,aAAc,EAAA,CAAA;AAAA,KACrB,CAAA,CAAA;AACA,IAAYA,eAAA,CAAA,IAAA,EAAA,WAAA,EAAA,CAAC,IAAe,EAAgB,KAAA;AAC1C,MAAU,SAAA,CAAA,EAAA,EAAI,IAAI,IAAI,CAAA,CAAA;AAAA,KACxB,CAAA,CAAA;AACA,IAAAA,eAAA,CAAA,IAAA,EAAA,WAAA,EAAY,CAAC,GAAe,KAAA;AAC1B,MAAA,SAAA,CAAU,KAAK,IAAI,CAAA,CAAA;AAAA,KACrB,CAAA,CAAA;AACA,IAAAA,eAAA,CAAA,IAAA,EAAA,WAAA,EAAY,CAAC,GAAe,KAAA;AAC1B,MAAA,GAAA,CAAI,cAAe,EAAA,CAAA;AAAA,KACrB,CAAA,CAAA;AACA,IAAAA,eAAA,CAAA,IAAA,EAAA,MAAA,EAAO,CAAC,KAAiB,KAAA;AACvB,MAAA,IAAA,CAAK,OAAO,IAAI,CAAA,CAAA;AAAA,KAClB,CAAA,CAAA;AACA,IAAAA,eAAA,CAAA,IAAA,EAAA,UAAA,EAAW,MAAM;AACf,MAAA,IAAA,CAAK,YAAY,EAAC,CAAA;AAClB,MAAM,MAAA,WAAA,GAAe,KAAK,IAAqB,CAAA,gBAAA;AAAA,QAC7C,uBAAA;AAAA,OACF,CAAA;AACA,MAAY,WAAA,CAAA,OAAA,CAAQ,CAAC,KAAU,KAAA;AAC7B,QAAA,IAAI,KAAM,CAAA,SAAA,CAAU,QAAS,CAAA,qBAAqB,CAAG,EAAA;AACnD,UAAA,IAAA,CAAK,aAAgB,GAAA;AAAA,YACnB,EAAI,EAAA,KAAA,CAAM,YAAa,CAAA,SAAS,CAAK,IAAA,EAAA;AAAA,YACrC,QAAU,EAAA,IAAA;AAAA,YACV,WACE,EAAA,KAAA,CAAM,qBAAsB,EAAA,CAAE,SAAS,IAAK,CAAA,aAAA;AAAA,YAC9C,QAAU,EAAA,KAAA,CAAM,qBAAsB,EAAA,CAAE,MAAM,IAAK,CAAA,aAAA;AAAA,YACnD,UAAA,EAAY,KAAM,CAAA,qBAAA,EAAwB,CAAA,KAAA;AAAA,YAC1C,SAAA,EAAW,KAAM,CAAA,qBAAA,EAAwB,CAAA,IAAA;AAAA,YACzC,UAAA,EAAY,KAAM,CAAA,qBAAA,EAAwB,CAAA,KAAA;AAAA,YAC1C,WAAA,EAAa,KAAM,CAAA,qBAAA,EAAwB,CAAA,MAAA;AAAA,YAC3C,GACE,EAAA,iBAAA;AAAA,cACE,KAAA;AAAA,cACA,CAAC,OAAA,KAAY,CAAC,CAAC,QAAQ,OAAQ,CAAA,UAAA;AAAA,aAC9B,EAAA,SAAA,CAAU,QAAS,CAAA,kBAAkB,CAAK,IAAA,KAAA;AAAA,YAC/C,SACE,EAAA,iBAAA;AAAA,cACE,KAAA;AAAA,cACA,CAAC,OAAA,KAAY,CAAC,CAAC,QAAQ,OAAQ,CAAA,UAAA;AAAA,aACjC,EAAG,QAAQ,UAAc,IAAA,CAAA;AAAA,WAC7B,CAAA;AAAA,SACF;AACA,QAAA,IACE,IAAK,CAAA,SAAA,CAAU,KAAM,CAAA,CAAC,UAAe,KAAA;AACnC,UACE,OAAA,UAAA,CAAW,EAAO,KAAA,KAAA,CAAM,YAAa,CAAA,SAAS,KAC9C,CAAC,KAAA,CAAM,SAAU,CAAA,QAAA,CAAS,qBAAqB,CAAA,CAAA;AAAA,SAElD,CACD,EAAA;AACA,UAAA,IAAA,CAAK,UAAU,IAAK,CAAA;AAAA,YAClB,QAAU,EAAA,KAAA,CAAM,SAAU,CAAA,QAAA,CAAS,qBAAqB,CAAA;AAAA,YACxD,WACE,EAAA,KAAA,CAAM,qBAAsB,EAAA,CAAE,SAAS,IAAK,CAAA,aAAA;AAAA,YAC9C,QAAU,EAAA,KAAA,CAAM,qBAAsB,EAAA,CAAE,MAAM,IAAK,CAAA,aAAA;AAAA,YACnD,UAAA,EAAY,KAAM,CAAA,qBAAA,EAAwB,CAAA,KAAA;AAAA,YAC1C,SAAA,EAAW,KAAM,CAAA,qBAAA,EAAwB,CAAA,IAAA;AAAA,YACzC,UAAA,EAAY,KAAM,CAAA,qBAAA,EAAwB,CAAA,KAAA;AAAA,YAC1C,WAAA,EAAa,KAAM,CAAA,qBAAA,EAAwB,CAAA,MAAA;AAAA,YAC3C,GACE,EAAA,iBAAA;AAAA,cACE,KAAA;AAAA,cACA,CAAC,OAAA,KAAY,CAAC,CAAC,QAAQ,OAAQ,CAAA,UAAA;AAAA,aAC9B,EAAA,SAAA,CAAU,QAAS,CAAA,kBAAkB,CAAK,IAAA,KAAA;AAAA,YAC/C,SACE,EAAA,iBAAA;AAAA,cACE,KAAA;AAAA,cACA,CAAC,OAAA,KAAY,CAAC,CAAC,QAAQ,OAAQ,CAAA,UAAA;AAAA,aACjC,EAAG,QAAQ,UAAc,IAAA,CAAA;AAAA,YAC3B,EACE,EAAA,iBAAA;AAAA,cACE,KAAA;AAAA,cACA,CAAC,OAAA,KAAY,CAAC,CAAC,QAAQ,OAAQ,CAAA,EAAA;AAAA,aACjC,EAAG,QAAQ,EAAM,IAAA,CAAA;AAAA,WACpB,CAAA,CAAA;AAAA,SACH;AAAA,OACD,CAAA,CAAA;AACD,MAAA,IAAA,CAAK,cAAc,EAAC,CAAA;AACpB,MAAA,MAAM,QAAW,GAAA,IAAA,CAAK,IAAM,EAAA,gBAAA,CAAiB,mBAAmB,CAAA,CAAA;AAEhE,MAAU,QAAA,EAAA,OAAA,CAAQ,CAAC,GAAQ,KAAA;AACzB,QAAA,IACE,KAAK,WAAY,CAAA,KAAA;AAAA,UACf,CAAC,YACC,KAAA,YAAA,CAAa,SAAc,KAAA,GAAA,CAAI,aAAa,iBAAiB,CAAA;AAAA,SAEjE,EAAA;AACA,UAAA,IAAA,CAAK,YAAY,IAAK,CAAA;AAAA,YACpB,aACE,EAAA,GAAA,CAAI,qBAAsB,EAAA,CAAE,SAAS,IAAK,CAAA,aAAA;AAAA,YAC5C,WAAA,EAAa,GAAI,CAAA,qBAAA,EAAwB,CAAA,IAAA;AAAA,YACzC,UAAY,EAAA,GAAA,CAAI,qBAAsB,EAAA,CAAE,MAAM,IAAK,CAAA,aAAA;AAAA,YACnD,YAAA,EAAc,GAAI,CAAA,qBAAA,EAAwB,CAAA,KAAA;AAAA,YAC1C,YAAA,EAAc,GAAI,CAAA,qBAAA,EAAwB,CAAA,KAAA;AAAA,YAC1C,aAAA,EAAe,GAAI,CAAA,qBAAA,EAAwB,CAAA,MAAA;AAAA,YAC3C,SACE,EAAA,iBAAA;AAAA,cACE,GAAA;AAAA,cACA,CAAC,OAAA,KAAY,CAAC,CAAC,QAAQ,OAAQ,CAAA,UAAA;AAAA,aACjC,EAAG,QAAQ,UAAc,IAAA,CAAA;AAAA,WAC5B,CAAA,CAAA;AAAA,SACH;AAAA,OACD,CAAA,CAAA;AAED,MAAA,IAAA,CAAK,WAAY,EAAA,CAAA;AAAA,KACnB,CAAA,CAAA;AACA,IAAkBA,eAAA,CAAA,IAAA,EAAA,iBAAA,EAAA,CAAC,GAAW,CAAc,KAAA;AAC1C,MAAA,MAAM,WAAc,GAAA,IAAA,CAAK,SAAU,CAAA,IAAA,CAAK,CAAC,KAAU,KAAA;AACjD,QACE,OAAA,KAAA,CAAM,WAAe,IAAA,CAAA,IACrB,KAAM,CAAA,QAAA,IAAY,KAClB,KAAM,CAAA,SAAA,IAAa,CACnB,IAAA,KAAA,CAAM,UAAc,IAAA,CAAA,CAAA;AAAA,OAEvB,CAAA,CAAA;AACD,MAAO,OAAA,WAAA,CAAA;AAAA,KACT,CAAA,CAAA;AACA,IAAoBA,eAAA,CAAA,IAAA,EAAA,mBAAA,EAAA,CAAC,GAAW,CAAc,KAAA;AAC5C,MAAA,MAAM,aAAgB,GAAA,IAAA,CAAK,WAAY,CAAA,IAAA,CAAK,CAAC,GAAQ,KAAA;AACnD,QACE,OAAA,GAAA,CAAI,aAAiB,IAAA,CAAA,IACrB,GAAI,CAAA,UAAA,IAAc,KAClB,GAAI,CAAA,WAAA,IAAe,CACnB,IAAA,GAAA,CAAI,YAAgB,IAAA,CAAA,CAAA;AAAA,OAEvB,CAAA,CAAA;AACD,MAAO,OAAA,aAAA,CAAA;AAAA,KACT,CAAA,CAAA;AAAA,GAAA;AAAA,EA1MA,WAAc,GAAA;AACZ,IAAA,OAAA;AAAA,GACF;AAyMF,CAAA;AA/OE,aAAA,GAAA,IAAA,OAAA,EAAA;;;;;;;;;;;;;;;;;;;;;ACRF,IAAA,cAAA,EAAA,WAAA,CAAA;AAeO,MAAM,eAAe,YAAmC,CAAA;AAAA,EAW7D,WAAc,GAAA;AACZ,IAAM,KAAA,EAAA,CAAA;AAXR,IAAAE,cAAA,CAAA,IAAA,EAAA,cAAA,EAAiB,CAAC,MAAmB,KAAA;AACnC,MAAA,MAAM,OACJ,GACC,IAAA,MAAA,CAAO,SAAS,IACd,CAAA,UAAA,CAAW,OAAO,GAAG,CAAA,CACrB,MAAM,IAAI,MAAA,CAAO,GAAG,MAAO,CAAA,OAAO,sBAAsB,CAAC,CAAA,GAAI,CAAC,CAAK,IAAA,EAAA,CAAA,CAAA;AAExE,MAAO,OAAA,IAAA,CAAK,MAAM,MAAM,CAAA,CAAA;AAAA,KAC1B,CAAA,CAAA;AAUA,IAAAA,cAAA,CAAA,IAAA,EAAA,WAAA,EAAc,CAAC,MAAuB,KAAA;AACpC,MAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,MAAA,CAAO,QAAQ,CAAK,EAAA,EAAA;AACtC,QAAA,MAAM,QAAQC,cAAK,CAAA,IAAA,EAAA,cAAA,CAAA,CAAL,IAAoB,CAAA,IAAA,EAAA,MAAA,CAAO,CAAC,CAAE,CAAA,KAAA,CAAA,CAAA;AAC5C,QAAA,IAAI,KAAO,EAAA;AACT,UAAA,OAAO,EAAE,KAAA,EAAO,MAAO,CAAA,CAAC,GAAG,KAAM,EAAA,CAAA;AAAA,SACnC;AAAA,OACF;AAAA,KACF,CAAA,CAAA;AAYA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAH,eAAA,CAAA,IAAA,EAAA,WAAA,EAAY,CAAC,MAAuB,KAAA;AAClC,MAAM,MAAA,SAAA,GAAY,OAA4B,IAAI,CAAA,CAAA;AAElD,MAAA,QAAA,CAAS,MAAM;AACb,QAAM,MAAA,MAAA,GAASG,cAAK,CAAA,IAAA,EAAA,WAAA,CAAA,CAAL,IAAiB,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA;AAChC,QAAA,IAAI,MAAQ,EAAA;AACV,UAAO,MAAA,CAAA,KAAA,CAAM,QAAS,CAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AAAA,SACpC;AAEA,QAAO,OAAA,IAAA,CAAK,EAAG,CAAA,UAAA,EAAY,MAAM;AAC/B,UAAMQ,MAAAA,OAAAA,GAASR,cAAK,CAAA,IAAA,EAAA,WAAA,CAAA,CAAL,IAAiB,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA;AAChC,UAAA,IAAIQ,WAAU,CAAC,YAAA,CAAaA,QAAO,KAAO,EAAA,SAAA,CAAU,OAAO,CAAG,EAAA;AAC5D,YAAAA,OAAO,CAAA,KAAA,CAAM,QAASA,CAAAA,OAAAA,CAAO,KAAK,CAAA,CAAA;AAAA,WACpC;AAAA,SACD,CAAA,CAAA;AAAA,OACF,CAAA,CAAA;AAAA,KACH,CAAA,CAAA;AAxCE,IAAO,MAAA,CAAA,gBAAA,CAAiB,YAAY,MAAM;AACxC,MAAA,IAAA,CAAK,IAAK,CAAA,UAAA,EAAY,MAAO,CAAA,QAAA,CAAS,IAAI,CAAA,CAAA;AAAA,KAC3C,CAAA,CAAA;AAAA,GACH;AAsCF,CAAA;AAtDE,cAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAkBA,WAAA,GAAA,IAAA,OAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;AClCF,IAAA,aAAA,EAAA,YAAA,EAAA,eAAA,EAAA,sBAAA,EAAA,WAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,cAAA,CAAA;AAWO,MAAM,kBAAkB,YAE5B,CAAA;AAAA,EAgGD,WAAA,CACE,eAAkC,GAAA,mBAAA,EAC3B,UACP,EAAA;AACA,IAAM,KAAA,EAAA,CAAA;AAFC,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA,CAAA;AAjGT,IAAe,aAAA,CAAA,IAAA,EAAA,cAAA,EAAA,IAAI,2BAA2B,IAAI,CAAA,CAAA,CAAA;AAClD,IAAgD,aAAA,CAAA,IAAA,EAAA,QAAA,EAAA,IAAA,CAAA,CAAA;AAChD,IAAA,aAAA,CAAA,IAAA,EAAA,QAAA,EAAS,IAAI,MAAO,EAAA,CAAA,CAAA;AACpB,IAAA,aAAA,CAAA,IAAA,EAAA,QAAA,EAAmC,EAAC,CAAA,CAAA;AAEpC,IAAgB,YAAA,CAAA,IAAA,EAAA,aAAA,EAAA,GAAA,CAAA,CAAA;AAChB,IAAA,YAAA,CAAA,IAAA,EAAA,YAAA,EAAe,IAAI,WAAY,EAAA,CAAA,CAAA;AAC/B,IAAkC,YAAA,CAAA,IAAA,EAAA,eAAA,EAAA,mBAAA,CAAA,CAAA;AAClC,IAAA,YAAA,CAAA,IAAA,EAAA,sBAAA,EAAwC,EAAC,CAAA,CAAA;AAEzC,IAAA,aAAA,CAAA,IAAA,EAAA,UAAA,EAAW,CAAC,EAAA,KAAe,IAAK,CAAA,MAAA,GAAS,EAAE,CAAA,CAAA,CAAA;AAC3C,IAAiB,aAAA,CAAA,IAAA,EAAA,gBAAA,EAAA,CAAC,SAChB,MAAO,CAAA,MAAA,CAAO,KAAK,MAAU,IAAA,EAAE,CAAE,CAAA,IAAA;AAAA,MAC/B,CAAC,OAAA,KAAY,OAAQ,CAAA,KAAA,CAAM,IAAS,KAAA,IAAA;AAAA,KACtC,CAAA,CAAA;AAEF,IAAA,YAAA,CAAA,IAAA,EAAA,WAAA,EAAc,MAAM;AAClB,MAAA,IAAA,CAAK,SAAS,EAAC,CAAA;AAEf,MAAA,MAAM,iBAAiB,QAAS,CAAA,gBAAA;AAAA,QAC9B,cAAA;AAAA,OACF,CAAA;AAEA,MAAA,KAAA,CAAM,IAAK,CAAA,cAAc,CAAE,CAAA,OAAA,CAAQ,CAAC,OAAY,KAAA;AAC9C,QAAM,MAAA,KAAA,GAAQ,IAAI,cAAe,CAAA;AAAA,UAC/B,SAAW,EAAA,IAAA;AAAA,UACX,gBAAgB,YAAK,CAAA,IAAA,EAAA,eAAA,CAAA;AAAA,UACrB,EAAA,EAAI,QAAQ,OAAQ,CAAA,EAAA;AAAA,SACrB,CAAA,CAAA;AAED,QAAA,IAAI,SAAa,GAAA,KAAA,CAAM,aAAc,EAAA,CAAE,YAA2B,IAAA,GAAA,CAAA;AAClE,QAAA,IAAI,SAAc,KAAA,GAAA;AAAK,UAAY,SAAA,GAAA,CAAA,CAAA,EAAI,KAAK,UAAU,CAAA,CAAA,CAAA;AACtD,QAAA,IAAI,SAAc,KAAA,GAAA;AAAK,UAAA,KAAA,CAAM,IAAK,EAAA,CAAA;AAAA;AAC7B,UAAA,KAAA,CAAM,IAAK,EAAA,CAAA;AAEhB,QAAM,MAAA,KAAA,GAAQ,SAAU,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AACjC,QAAM,KAAA,CAAA,OAAA,CAAQ,CAAC,WAAgB,KAAA;AAC7B,UAAI,IAAA,CAAC,IAAK,CAAA,MAAA,CAAO,WAAW,CAAA;AAAG,YAAK,IAAA,CAAA,MAAA,CAAO,WAAW,CAAA,GAAI,EAAC,CAAA;AAC3D,UAAA,IAAA,CAAK,OAAO,WAAW,CAAA,CAAE,IAAK,CAAA,KAAA,CAAM,MAAM,EAAE,CAAA,CAAA;AAAA,SAC7C,CAAA,CAAA;AAED,QAAC,IAAK,CAAA,MAAA,CAA0C,KAAM,CAAA,KAAA,CAAM,EAAE,CAAI,GAAA,KAAA,CAAA;AAElE,QAAK,YAAA,CAAA,IAAA,EAAA,sBAAA,CAAA,CAAuB,IAAK,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAAA,OAC9C,CAAA,CAAA;AAED,MAAA,YAAA,CAAA,IAAA,EAAK,cAAa,SAAU,EAAA,CAAA;AAAA,KAC9B,CAAA,CAAA;AAEA,IAAW,YAAA,CAAA,IAAA,EAAA,QAAA,EAAA,CAAC,EAAE,QAAA,EAAwC,KAAA;AACpD,MAAA,2BACG,gBAAiB,CAAA,QAAA,EAAjB,EAA0B,KAAA,EAAO,MAC/B,QACH,EAAA,CAAA,CAAA;AAAA,KAEJ,CAAA,CAAA;AAEA,IAAA,YAAA,CAAA,IAAA,EAAA,iBAAA,EAAoB,MAAM;AACxB,MAAA,gBAAA,CAAiB,OAAQ,CAAA,EAAE,SAAW,EAAA,kBAAA,IAAsB,MAAM;AAChE,QAAO,MAAA,CAAA,MAAA,CAAO,KAAK,MAAU,IAAA,EAAE,CAAE,CAAA,OAAA,CAAQ,CAAC,OAAY,KAAA;AACpD,UAAI,IAAA,OAAA,CAAQ,MAAM,aAAe,EAAA;AAC/B,YAAA,KAAK,QAAQ,OAAQ,EAAA,CAAA;AAAA,WACvB;AAAA,SACD,CAAA,CAAA;AAAA,OACF,CAAA,CAAA;AAAA,KACH,CAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,cAAA,EAAiB,MAAM;AACrB,MAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAoB,IAAI,CAAA,CAAA;AACpD,MAAM,MAAA,cAAA,GAAiB,iBAAiB,MAAM,CAAA,CAAA;AAE9C,MAAA,QAAA,CAAS,MAAM;AACb,QAAA,IAAA,CAAK,SAAU,EAAA,CAAA;AACf,QAAA,SAAA,CAAU,mBAAK,sBAAsB,CAAA,CAAA,CAAA;AAAA,OACtC,CAAA,CAAA;AAED,MAAA,IAAA,CAAK,OAAO,SAAU,CAAA;AAAA,QACpB;AAAA,UACE,KAAA,EAAO,IAAI,MAAA,CAAO,CAAkB,gBAAA,CAAA,CAAA;AAAA,UACpC,QAAA,EAAU,CAAC,MAAW,KAAA;AACpB,YAAA,OAAA,CAAQ,IAAI,WAAa,EAAA,EAAE,OAAO,MAAO,CAAA,CAAC,GAAG,CAAA,CAAA;AAC7C,YAAK,IAAA,CAAA,SAAA,CAAU,MAAO,CAAA,CAAC,CAAC,CAAA,CAAA;AAAA,WAC1B;AAAA,SACF;AAAA,QACA;AAAA,UACE,KAAA,EAAO,IAAI,MAAA,CAAO,CAAG,CAAA,CAAA,CAAA;AAAA,UACrB,UAAU,MAAM;AACd,YAAA,OAAA,CAAQ,GAAI,CAAA,WAAA,EAAa,EAAE,OAAA,EAAS,KAAK,CAAA,CAAA;AACzC,YAAA,IAAA,CAAK,UAAU,GAAG,CAAA,CAAA;AAAA,WACpB;AAAA,SACF;AAAA,OACD,CAAA,CAAA;AAED,MAAO,OAAA,cAAA,CAAA;AAAA,KACT,CAAA,CAAA;AAaA,IAAA,YAAA,CAAA,IAAA,EAAA,cAAA,EAAiB,MAAM;AACrB,MAAA,MAAM,UAAU,YAAK,CAAA,IAAA,EAAA,QAAA,CAAA,CAAA;AACrB,MAAM,MAAA,MAAA,GAAS,mBAAK,cAAL,CAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA;AAEf,MAAO,uBAAA,GAAA,CAAC,WAAS,QAAO,EAAA,MAAA,EAAA,CAAA,CAAA;AAAA,KAC1B,CAAA,CAAA;AAEA,IAAY,aAAA,CAAA,IAAA,EAAA,WAAA,EAAA,CAAC,KAAgB,GAAA,YAAA,CAAA,IAAA,EAAK,aAAiC,CAAA,KAAA;AACjE,MAAA,IAAI,WAAc,GAAA,KAAA,CAAA;AAClB,MAAI,IAAA,CAAC,WAAY,CAAA,UAAA,CAAW,GAAG,CAAA;AAAG,QAAA,WAAA,GAAc,IAAI,WAAW,CAAA,CAAA,CAAA;AAE/D,MAAA,IAAI,CAAC,IAAK,CAAA,MAAA;AAAQ,QAAA,YAAA,CAAA,IAAA,EAAK,WAAL,CAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA;AAClB,MAAI,IAAA,CAAC,IAAK,CAAA,MAAA,CAAO,WAAW,CAAA;AAAG,QAAK,IAAA,CAAA,MAAA,CAAO,WAAW,CAAA,GAAI,EAAC,CAAA;AAE3D,MAAA,IAAA,CAAK,OAAO,YAAK,CAAA,IAAA,EAAA,aAAA,CAAa,CAAE,CAAA,OAAA,CAAQ,CAAC,YAAiB,KAAA;AACxD,QAAA,IAAI,CAAC,IAAK,CAAA,MAAA,CAAO,WAAW,CAAA,CAAE,SAAS,YAAY,CAAA;AACjD,UAAK,IAAA,CAAA,MAAA,GAAS,YAAY,CAAA,EAAG,IAAK,EAAA,CAAA;AAAA,OACrC,CAAA,CAAA;AACD,MAAA,IAAA,CAAK,MAAO,CAAA,WAAW,CAAE,CAAA,OAAA,CAAQ,CAAC,aAAkB,KAAA;AAClD,QAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,MAAA,GAAS,aAAa,CAAA,CAAA;AACzC,QAAA,IAAI,KAAO,EAAA;AACT,UAAA,KAAA,CAAM,IAAK,EAAA,CAAA;AACX,UAAI,IAAA,KAAA,CAAM,SAAa,IAAA,KAAA,CAAM,KAAM,CAAA,cAAA;AAAgB,YAAA,KAAK,MAAM,OAAQ,EAAA,CAAA;AAAA,SACxE;AAAA,OACD,CAAA,CAAA;AAED,MAAA,YAAA,CAAA,IAAA,EAAK,aAAgB,EAAA,WAAA,CAAA,CAAA;AAErB,MAAA,OAAO,YAAK,CAAA,IAAA,EAAA,sBAAA,CAAA,CAAA;AAAA,KACd,CAAA,CAAA;AAEA,IAAA,aAAA,CAAA,IAAA,EAAA,WAAA,EAAY,MAAM;AAChB,MAAA,MAAM,IAAI,YAAK,CAAA,IAAA,EAAA,cAAA,CAAA,CAAA;AACf,MAAA,2BAAQ,CAAE,EAAA,EAAA,CAAA,CAAA;AAAA,KACZ,CAAA,CAAA;AAvCE,IAAA,YAAA,CAAA,IAAA,EAAK,aAAgB,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA;AACrB,IAAK,YAAA,CAAA,IAAA,EAAA,eAAA,EAAkB,mBAAmB,YAAK,CAAA,IAAA,EAAA,eAAA,CAAA,CAAA,CAAA;AAC/C,IAAA,YAAA,CAAA,IAAA,EAAK,iBAAL,CAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA;AAAA,GACF;AAqCF,CAAA;AAxIE,aAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,YAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,eAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,sBAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAQA,WAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAiCA,QAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAQA,iBAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AASA,cAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAwCA,cAAA,GAAA,IAAA,OAAA,EAAA;;AC7Fc,SAAA,0BAAA,CACd,UACA,SACA,EAAA;AACA,EAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,gBAAiB,EAAA,CAAA;AACrC,EAAA,MAAM,YAAY,mBAAoB,EAAA,CAAA;AACtC,EAAM,MAAA,EAAA,GACJ,cAAc,KACV,CAAA,GAAA,SAAA,CAAU,eAAe,SAAS,CAAA,EAAG,MAAM,EAC3C,GAAA,OAAA,CAAA;AAEN,EAAO,OAAAC,WAAA,CAAsB,CAAC,MAAW,KAAA;AACvC,IAAM,MAAA,aAAA,GAAgB,MAAO,CAAA,eAAA,CAAgB,EAAE,CAAA,CAAA;AAC/C,IAAO,OAAA,QAAA,CAAS,aAAiB,IAAA,EAAE,CAAA,CAAA;AAAA,KAClC,YAAY,CAAA,CAAA;AACjB;;ACvCA,MAAM,wBAA2B,GAAA,oBAAA,CAAA;AACjC,MAAM,uBAA0B,GAAA,oBAAA,CAAA;AAChC,MAAM,6BAAgC,GAAA,yBAAA,CAAA;AAEtB,SAAA,mBAAA,CAAoB,SAAiB,SAAmB,EAAA;AACtE,EAAgBX,KAAA,CAAA,QAAA;AAAA,IACd,kBAAkB,MAAO,CAAA;AAAA,MACvB,OAAA;AAAA,MACA,UAAY,EAAA,EAAE,CAAC,wBAAwB,GAAG,SAAU,EAAA;AAAA,KACrD,CAAA;AAAA,GACH,CAAA;AACF,CAAA;AACgB,SAAA,wBAAA,CACd,SACA,cACA,EAAA;AACA,EAAgBA,KAAA,CAAA,QAAA;AAAA,IACd,kBAAkB,MAAO,CAAA;AAAA,MACvB,OAAA;AAAA,MACA,UAAY,EAAA,EAAE,CAAC,6BAA6B,GAAG,cAAe,EAAA;AAAA,KAC/D,CAAA;AAAA,GACH,CAAA;AACF,CAAA;AACgB,SAAA,mBAAA,CAAoB,SAAiB,QAAkB,EAAA;AACrE,EAAgBA,KAAA,CAAA,QAAA;AAAA,IACd,kBAAkB,MAAO,CAAA;AAAA,MACvB,OAAA;AAAA,MACA,UAAY,EAAA,EAAE,CAAC,uBAAuB,GAAG,QAAS,EAAA;AAAA,KACnD,CAAA;AAAA,GACH,CAAA;AACF,CAAA;AAEO,SAAS,mBAAsB,GAAA;AACpC,EAAO,OAAA,0BAAA;AAAA,IACL,CAAC,OAAY,KAAA,OAAA,CAAQ,wBAAwB,CAAA;AAAA,GAC/C,CAAA;AACF,CAAA;AAEO,SAAS,aAAgB,GAAA;AAC9B,EAAO,OAAA,0BAAA;AAAA,IACL,CAAC,OAAY,KAAA,OAAA,CAAQ,uBAAuB,CAAA;AAAA,GAC9C,CAAA;AACF,CAAA;AAEO,SAAS,wBAA2B,GAAA;AACzC,EAAO,OAAA,0BAAA;AAAA,IACL,CAAC,OAAY,KAAA,OAAA,CAAQ,6BAA6B,CAAA;AAAA,GACpD,CAAA;AACF;;ACxBO,SAAS,eACd,CAAA,OAAA,EACA,MACA,EAAA,UAAA,EACA,OACA,EAAA;AACA,EAAA,MAAM,QAAW,GAAA,EAAE,QAAU,EAAA,MAAA,EAAQ,GAAG,UAAW,EAAA,CAAA;AACnD,EAAA,mBAAA,CAAoB,KAAK,OAAS,EAAA,CAAA,GAAA,EAAM,QAAQ,MAAM,CAAC,IAAI,IAAI,CAAA,CAAA;AAC/D,EAAA,KAAK,OAAQ,CAAA,IAAA;AAAA,IACX,WAAY,CAAA;AAAA,MACV,MAAQ,EAAA,aAAA;AAAA,MACR,KAAO,EAAA,OAAA;AAAA,KACR,CAAA;AAAA,IACD,EAAE,QAAU,EAAA,kBAAA,EAAoB,WAAa,EAAA,GAAG,SAAS,aAAc,EAAA;AAAA,GACzE,CACG,IAAK,CAAA,CAAC,MAAW,KAAA;AAChB,IAAI,IAAA,MAAA,EAAQ,WAAW,GAAK,EAAA;AAC1B,MAAQ,OAAA,CAAA,GAAA,CAAI,SAAS,OAAO,CAAA,CAAA;AAC5B,MAAA,wBAAA,CAAyB,KAAK,aAAe,EAAA;AAAA,QAC3C,OAAA;AAAA,QACA,WAAa,EAAA,KAAA;AAAA,OACd,CAAA,CAAA;AAAA,KACI,MAAA;AACL,MAAA,wBAAA,CAAyB,KAAK,aAAe,EAAA;AAAA,QAC3C,OAAA;AAAA,QACA,WAAa,EAAA,IAAA;AAAA,OACd,CAAA,CAAA;AAAA,KACH;AACA,IAAI,IAAA;AACF,MAAA,IAAI,MAAQ,EAAA;AACV,QAAA,eAAA,CAAgB,MAAM;AACpB,UAAI,IAAA,MAAA,EAAQ,MAAM,KAAO,EAAA;AACvB,YAAA,gBAAA;AAAA,cACE,OAAA;AAAA,cACC,QAA6C,IAC1C,EAAA,KAAA;AAAA,aACN,CAAA;AAAA,WACF;AACA,UAAI,IAAA,MAAA,EAAQ,MAAM,MAAQ,EAAA;AACxB,YAAA,iBAAA;AAAA,cACE,OAAA;AAAA,cACC,QAA+C,IAC5C,EAAA,MAAA;AAAA,aACN,CAAA;AAAA,WACF;AACA,UAAI,IAAA,MAAA,EAAQ,MAAM,WAAa,EAAA;AAC7B,YAAoB,mBAAA,CAAA,OAAA,EAAS,MAAQ,EAAA,IAAA,EAAM,WAAqB,CAAA,CAAA;AAAA,WAClE;AACA,UAAI,IAAA,MAAA,EAAQ,MAAM,KAAO,EAAA;AACvB,YAAoB,mBAAA,CAAA,OAAA,EAAS,MAAQ,EAAA,IAAA,EAAM,KAAe,CAAA,CAAA;AAAA,WAC5D;AACA,UAAI,IAAA,MAAA,EAAQ,MAAM,gBAAkB,EAAA;AAClC,YAAA,wBAAA;AAAA,cACE,OAAA;AAAA,cACA,QAAQ,IAAM,EAAA,gBAAA;AAAA,aAChB,CAAA;AAAA,WACF;AACA,UAAS,OAAA,EAAA,UAAA,GAAa,MAAM,MAAM,CAAA,CAAA;AAClC,UAAoB,mBAAA,CAAA,IAAA,CAAK,OAAS,EAAA,MAAA,EAAQ,MAAM,CAAA,CAAA;AAAA,SACjD,CAAA,CAAA;AAAA,OACH;AAAO,QAAS,OAAA,EAAA,UAAA,GAAa,OAAO,IAAI,CAAA,CAAA;AAAA,aACjC,CAAG,EAAA;AACV,MAAA,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAA;AAAA,KACjB;AAAA,GACD,CAAA,CACA,KAAM,CAAA,CAAC,CAAM,KAAA;AACZ,IAAA,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAA;AACf,IAAA,wBAAA,CAAyB,KAAK,aAAe,EAAA;AAAA,MAC3C,OAAA;AAAA,MACA,WAAa,EAAA,KAAA;AAAA,KACd,CAAA,CAAA;AACD,IAAS,OAAA,EAAA,UAAA,GAAa,OAAO,IAAI,CAAA,CAAA;AAAA,GAClC,CAAA,CAAA;AACL;;AC3EgB,SAAA,YAAA,CACd,OACA,EAAA,KAAA,EACA,MACA,EAAA;AACA,EACG,IAAA,KAAA,CAAM,SAAS,UAAc,IAAA,MAAA,CAAO,iBAAiB,cACpD,IAAA,CAAA,KAAA,CAAM,SAAS,OAAW,IAAA,KAAA,CAAM,SAAS,WACzC,KAAA,MAAA,CAAO,iBAAiB,OACzB,IAAA,KAAA,CAAM,SAAS,SAAc,IAAA,KAAA,CAAwB,SAAS,OAC/D,EAAA;AACA,IAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,MAAA,QAAQ,OAAO,cAAgB;AAAA,QAC7B,KAAK,eAAA;AACH,UAAA,KAAK,QAAQ,IAAK,CAAA,MAAA,CAAO,QAAQ,EAAE,UAAA,EAAY,MAAM,CAAA,CAAA;AACrD,UAAA,MAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,MAAA;AAAA,QACF,KAAK,cAAA;AACH,UAAO,MAAA,CAAA,QAAA,CAAS,MAAO,CAAA,MAAA,CAAO,MAAM,CAAA,CAAA;AACpC,UAAA,MAAA;AAAA,QACF,KAAK,UAAA;AACH,UACE,MAAA,CAAO,KACN,cAAe,CAAA,YAAA;AAAA,YAChB,MAAA,CAAO,qBAAqB,MAAO,CAAA,IAAA;AAAA,YACnC,MAAO,CAAA,MAAA;AAAA,WACT,CAAA;AACA,UAAA,MAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,eAAA;AAAA,YACE,OAAA;AAAA,YACA,MAAO,CAAA,MAAA;AAAA,YACP,EAAC;AAAA,YACD,EAAE,aAAe,EAAA;AAAA,cAAE,UAAY,EAAA,IAAA;AAAA,aAE7B,EAAA;AAAA,WACJ,CAAA;AACA,UAAA,MAAA;AAAA,QACF;AACE,UAAQ,OAAA,CAAA,KAAA,CAAM,6BAA6B,MAAM,CAAA,CAAA;AAAA,OACrD;AAAA,KACF;AAAA,GACF;AACF;;AClEa,MAAA,uBAAA,GAAqD,CAChE,OACA,EAAA,EAAE,QAAQ,GAAG,UAAA,IACb,OACG,KAAA;AACH,EAAA,MAAM,WAAoC,EAAC,CAAA;AAE3C,EAAO,MAAA,CAAA,OAAA,CAAQ,UAAU,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,IAAA,EAAM,KAAK,CAAM,KAAA;AACpD,IAAS,QAAA,CAAA,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAI,GAAA,KAAA,CAAA;AAAA,GACzB,CAAA,CAAA;AAED,EAAgB,eAAA,CAAA,OAAA,EAAS,MAAQ,EAAA,QAAA,EAAU,OAAO,CAAA,CAAA;AACpD;;ACZO,SAAS,iBAAoB,GAAA;AAClC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AAEhD,EAAgB,eAAA,CAAA;AAAA,IACd,UAAA,EAAY,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,IACnC,OAAA,EAAS,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,GAClC,CAAA,CAAA;AAED,EAAO,OAAA,SAAA,CAAA;AACT;;ACRO,MAAM,YAAe,GAAA,CAAC,EAAE,KAAA,EAA+B,KAAA;AAC5D,EAAA,MAAM,cAAc,oBAAqB,EAAA,CAAA;AACzC,EACE,uBAAA,GAAA,CAAA,QAAA,EAAA,EACG,WAAC,WACA,oBAAA,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,QAAU,EAAA,CAAA;AAAA,MACV,KAAA,EACE,SAAS,eAAiB,EAAA;AAAA,QACxB,IAAM,EAAA;AAAA,UACJ,IAAM,EAAA,KAAA;AAAA,SACR;AAAA,OACD,CAAE,CAAA,IAAA;AAAA,MAEL,YAAA,EACE,SAAS,eAAiB,EAAA;AAAA,QACxB,IAAM,EAAA;AAAA,UACJ,IAAM,EAAA,KAAA;AAAA,SACR;AAAA,OACD,CAAE,CAAA,IAAA;AAAA,MAEL,IAAK,EAAA,OAAA;AAAA,KAAA;AAAA,GAGX,EAAA,CAAA,CAAA;AAEJ,CAAA;;ACnBO,MAAM,0BAA0C,CAAC;AAAA,EACtD,QAAA;AAAA,EACA,GAAG,KAAA;AACL,CAAM,KAAA;AACJ,EAAA,MAAM,EAAE,OAAA,EAAS,SAAW,EAAA,SAAA,KAAc,gBAAiB,EAAA,CAAA;AAE3D,EAAA,MAAM,EAAE,YAAc,EAAA,KAAA,EAAO,GAAK,EAAA,GAAG,aAAgB,GAAA,mBAAA;AAAA,IACnD,OAAA;AAAA,IACA,KAAA;AAAA,GACF,CAAA;AAEA,EAAA,MAAM,mBAAmB,mBAAoB,EAAA,CAAA;AAC7C,EAAA,MAAM,wBAAwB,wBAAyB,EAAA,CAAA;AAEvD,EAAA,MAAM,YAAY,mBAAoB,EAAA,CAAA;AAEtC,EAAA,IAAI,SAAU,CAAA,QAAA,CAAS,OAAO,CAAA,CAAE,KAAM,CAAA,MAAA;AACpC,IAAA,OAAA,CAAQ,GAAI,CAAA,SAAA,CAAU,QAAS,CAAA,OAAO,EAAE,KAAK,CAAA,CAAA;AAE/C,EACE,uBAAA,GAAA,CAAC,oBAAqB,EAAA,EAAA,KAAA,EAAO,YAC3B,EAAA,QAAA,kBAAA,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAU,EAAA,kBAAA;AAAA,MACV,gBAAgB,EAAA,SAAA;AAAA,MAChB,gBAAgB,EAAA,SAAA;AAAA,MAChB,cAAc,EAAA,OAAA;AAAA,MACd,GAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,SAAI,SAAU,EAAA,eAAA,EACb,QAAC,kBAAA,IAAA,CAAA,KAAA,EAAA,EAAI,WAAU,qBACZ,EAAA,QAAA,EAAA;AAAA,UAAA,KAAA,CAAM,SACL,oBAAA,GAAA,CAAC,MAAK,EAAA,EAAA,SAAA,EAAU,gBACb,QACC,EAAA,gBAAA,mBAAA,GAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACC,KAAO,EAAA,qBAAA;AAAA,cACP,SAAU,EAAA,oBAAA;AAAA,cACV,IAAM,EAAA,gBAAA;AAAA,cAEL,QAAA,EAAA,KAAA;AAAA,aAAA;AAAA,cAGH,KAEJ,EAAA,CAAA;AAAA,0BAEF,GAAA,CAAC,gBAAa,KAAc,EAAA,CAAA;AAAA,SAAA,EAC9B,CACF,EAAA,CAAA;AAAA,wBACC,GAAA,CAAA,KAAA,EAAA,EAAI,SAAU,EAAA,gBAAA,EAAkB,QAAS,EAAA,CAAA;AAAA,wBACzC,GAAA,CAAA,WAAA,EAAA,EAAY,aAAe,EAAA,KAAA,EAAQ,GAAG,WAAa,EAAA,CAAA;AAAA,OAAA;AAAA,KAAA;AAAA,GAExD,EAAA,CAAA,CAAA;AAEJ;;AChBO,MAAM,WAAqD,EAAC,CAAA;AAE5D,SAAS,qBAAqB,SAAuB,EAAA;AAC1D,EAAI,IAAA,CAAC,QAAS,CAAA,SAAS,CAAG,EAAA;AACxB,IAAA,QAAA,CAAS,SAAS,CAAI,GAAA;AAAA,MACpB,cAAA,EAAgB,CACd,WAAA,EACA,OACG,KAAA;AACH,QAAO,MAAA,CAAA,MAAA,CAAO,aAAa,OAAO,CAAA,CAAA;AAAA,OACpC;AAAA,KACF,CAAA;AAAA,GACF;AACF,CAAA;AAKgB,SAAA,gBAAA,CAGd,WAAuB,WAAmC,EAAA;AAC1D,EAAA,oBAAA,CAAqB,SAAS,CAAA,CAAA;AAC9B,EAAA,MAAA,CAAO,MAAO,CAAA,QAAA,CAAS,SAAS,CAAA,EAAG,WAAW,CAAA,CAAA;AAChD,CAAA;AAEO,SAAS,cACd,CAAA,KAAA,EACA,SACA,EAAA,OAAA,EACA,YACA,EAAA;AACA,EAAI,IAAA,CAAC,KAAM,CAAA,SAAS,CAAG,EAAA;AACrB,IAAM,KAAA,CAAA,SAAS,IAAI,EAAC,CAAA;AAAA,GACtB;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,SAAS,CAAA,CAAE,OAAO,CAAA;AAAG,IAAA,KAAA,CAAM,SAAS,CAAA,CAAE,OAAO,CAAA,GAAI,EAAC,CAAA;AAC7D,EAAM,KAAA,CAAA,SAAS,CAAE,CAAA,OAAO,CAAI,GAAA,YAAA,CAAA;AAC9B,CAAA;AAEO,MAAM,cAAc,WAAY,CAAA;AAAA,EACrC,IAAM,EAAA,aAAA;AAAA,EACN,cAAc,EAAC;AAAA,EACf,QAAU,EAAA;AAAA,IACR,UACE,KACA,EAAA;AAAA,MACE,OAAS,EAAA,EAAE,OAAS,EAAA,SAAA,EAAW,YAAa,EAAA;AAAA,KAO9C,EAAA;AACA,MAAA,IAAI,CAAC,KAAA,CAAM,SAAS,CAAA,GAAI,OAAO,CAAG,EAAA;AAChC,QAAe,cAAA,CAAA,KAAA,EAAO,SAAW,EAAA,OAAA,EAAS,YAAY,CAAA,CAAA;AACtD,QAAM,KAAA,CAAA,SAAS,CAAE,CAAA,OAAO,CAAI,GAAA,YAAA,CAAA;AAAA,OAC9B;AAAA,KACF;AAAA,IACA,iBACE,KACA,EAAA;AAAA,MACE,SAAS,EAAE,IAAA,EAAM,OAAS,EAAA,SAAA,EAAW,SAAS,YAAa,EAAA;AAAA,KAQ7D,EAAA;AACA,MAAA,IAAI,CAAC,KAAA,CAAM,SAAS,CAAA,GAAI,OAAO,CAAG,EAAA;AAChC,QAAA,cAAA,CAAe,KAAO,EAAA,SAAA,EAAW,OAAS,EAAA,YAAA,IAAgB,EAAE,CAAA,CAAA;AAAA,OAC9D;AACA,MAAA,MAAMY,YAAc,GAAA,KAAA,CAAM,SAAS,CAAA,CAAE,OAAO,CAAA,CAAA;AAC5C,MAAA,oBAAA,CAAqB,SAAS,CAAA,CAAA;AAE9B,MAAA,IAAI,CAAC,QAAS,CAAA,SAAS,CAAE,CAAA,OAAA,IAAW,SAAS,CAAG,EAAA;AAC9C,QAAA,OAAA;AAAA,OACF;AAEA,MAAA,MAAM,cAAiB,GAAA,QAAA,CAAS,SAAS,CAAA,CACvC,WAAW,SACb,CAAA,CAAA;AACA,MAAA,cAAA,CAAeA,cAAa,IAAI,CAAA,CAAA;AAAA,KAClC;AAAA,GACF;AACF,CAAC,CAAA,CAAA;AAEM,MAAM,EAAE,WAAa,EAAA,qBAAA,EAAuB,KAAO,EAAA,WAAA,KACxD,cAAe,CAAA;AAAA,EACb,aAAa,WAAY,CAAA,OAAA;AAC3B,CAAC,CAAA,CAAA;AAEI,MAAM,gBAAgB,WAAY,CAAA,OAAA;;ACxIlC,MAAM,kBAAkB,EAAC,CAAA;AAsBzB,SAAS,iBACd,SACA,EAAA,SAAA,EACA,YACA,EAAA,QAAA,EACA,aAAoDC,cAC1C,EAAA;AACV,EAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,gBAAiB,EAAA,CAAA;AACrC,EAAA,IAAI,CAAC,OAAA;AAAS,IAAA,MAAM,IAAI,KAAA,CAAM,CAA+B,4BAAA,EAAA,SAAS,CAAE,CAAA,CAAA,CAAA;AAExE,EAAA,MAAM,UAAa,GAAA,WAAA,CAAY,QAAS,EAAA,CAAE,YAAY,SAAS,CAAA,CAAA;AAC/D,EAAM,MAAA,CAAC,SAAW,EAAA,YAAY,CAAI,GAAA,QAAA;AAAA,IAChC,eACI,QAAU,CAAA,UAAA,GAAa,OAAO,CAAmB,IAAA,YAAY,IAC5D,EAAC;AAAA,GACR,CAAA;AAEA,EAAA,MAAM,gBAAmB,GAAA,MAAA;AAAA,IACvB,SAAc,IAAA,eAAA;AAAA,GAChB,CAAA;AAEA,EAAA,qBAAA,CAAsB,CAAC,MAAW,KAAA;AAChC,IAAA,MAAM,QAAW,GAAA,MAAA,CAAO,WAAY,CAAA,SAAS,IAAI,OAAO,CAAA,CAAA;AAGxD,IAAA,IAAI,aAAa,KAAW,CAAA,EAAA;AAC1B,MAAM,MAAA,WAAA,GAAc,SAAS,QAAQ,CAAA,CAAA;AACrC,MACE,IAAA,gBAAA,CAAiB,YAAY,eAC7B,IAAA,CAAC,WAAW,gBAAiB,CAAA,OAAA,EAAqB,WAAW,CAC7D,EAAA;AACA,QAAA,gBAAA,CAAiB,OAAU,GAAA,WAAA,CAAA;AAC3B,QAAA,YAAA,CAAa,WAAW,CAAA,CAAA;AAAA,OAC1B;AAAA,KACF;AAAA,GACD,CAAA,CAAA;AAED,EAAO,OAAA,SAAA,CAAA;AACT;;ACxCgB,SAAA,gBAAA,CAId,SACA,EAAA,YAAA,EACA,QAQA,EAAA;AACA,EAAA,MAAM,WAAc,GAAA,CAClB,SACA,EAAA,QAAA,EACA,aAAoDA,cACvC,KAAA;AACb,IAAA,MAAM,YAAY,mBAAoB,EAAA,CAAA;AACtC,IAAA,MAAM,KAAQ,GAAA,OAAA;AAAA,MACZ,MAAM,SAAA,CAAU,cAAe,CAAA,SAAS,CAAG,EAAA,KAAA;AAAA,MAC3C,CAAC,WAAW,SAAS,CAAA;AAAA,KACvB,CAAA;AAEA,IAAM,MAAA,QAAA,GAAW,UAAU,KAAK,CAAA,CAAA;AAEhC,IAAA,SAAA,CAAU,MAAM;AACd,MAAY,WAAA,CAAA,QAAA;AAAA,QACV,cAAc,SAAU,CAAA;AAAA,UACtB,SAAA;AAAA,UACA,OAAA,EAAS,SAAS,OAAQ,CAAA,EAAA;AAAA,UAC1B,YAAA;AAAA,SACD,CAAA;AAAA,OACH,CAAA;AAAA,KAEF,EAAG,EAAE,CAAA,CAAA;AAEL,IAAO,OAAA,gBAAA;AAAA,MACL,SAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,KACF,CAAA;AAAA,GACF,CAAA;AAEA,EAAA,gBAAA,CAA6B,WAAW,QAAQ,CAAA,CAAA;AAQhD,EAAA,MAAM,qBAAqB,MAAM;AAC/B,IAAA,MAAM,EAAE,SAAA,EAAW,gBAAiB,EAAA,GAAI,gBAAiB,EAAA,CAAA;AACzD,IAAA,MAAM,cACJ,EAAC,CAAA;AACH,IAAA,MAAM,YAAY,mBAAoB,EAAA,CAAA;AAEtC,IAAA,MAAA,CAAO,QAAQ,QAAQ,CAAA,CAAE,QAAQ,CAAC,CAAC,IAAI,CAAM,KAAA;AAC3C,MAAA,WAAA,CAAY,IAAgC,CAAA,GAAK,CAC/C,OAAA,EACA,SACG,KAAA;AACH,QAAA,MAAM,KAAQ,GAAA,SAAA,CAAU,cAAe,CAAA,SAAA,IAAa,gBAAgB,CAChE,EAAA,KAAA,CAAA;AAEJ,QAAY,WAAA,CAAA,QAAA;AAAA,UACV,cAAc,gBAAiB,CAAA;AAAA,YAC7B,SAAS,KAAM,CAAA,EAAA;AAAA,YACf,SAAA;AAAA,YACA,IAAA,EAAM,EAAE,OAAQ,EAAA;AAAA,YAChB,OAAS,EAAA,IAAA;AAAA,WACV,CAAA;AAAA,SACH,CAAA;AAAA,OACF,CAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAO,OAAA,WAAA,CAAA;AAAA,GACT,CAAA;AAEA,EAAO,OAAA,CAAC,oBAAoB,WAAW,CAAA,CAAA;AACzC;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@apia/dashboard-controller",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.2",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"author": "Alexis Leite <alexisleite@live.com>",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -13,12 +13,12 @@
|
|
|
13
13
|
"libWatch": "rollup --watch --config ../../config/rollup.common.mjs --environment MODE:development,ENTRY:index.ts,WATCH:true"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@apia/api": "^
|
|
17
|
-
"@apia/components": "^
|
|
18
|
-
"@apia/icons": "^
|
|
19
|
-
"@apia/store": "^
|
|
20
|
-
"@apia/theme": "^
|
|
21
|
-
"@apia/util": "^
|
|
16
|
+
"@apia/api": "^3.0.2",
|
|
17
|
+
"@apia/components": "^3.0.2",
|
|
18
|
+
"@apia/icons": "^3.0.2",
|
|
19
|
+
"@apia/store": "^3.0.2",
|
|
20
|
+
"@apia/theme": "^3.0.2",
|
|
21
|
+
"@apia/util": "^3.0.2",
|
|
22
22
|
"@reduxjs/toolkit": "^1.9.3",
|
|
23
23
|
"react-redux": "^8.0.5"
|
|
24
24
|
},
|
|
@@ -37,5 +37,5 @@
|
|
|
37
37
|
"access": "public",
|
|
38
38
|
"registry": "https://registry.npmjs.org/"
|
|
39
39
|
},
|
|
40
|
-
"gitHead": "
|
|
40
|
+
"gitHead": "1be67c2956d7c0964b4e8a18173af7cde3fc534e"
|
|
41
41
|
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { KeyboardEvent, MouseEvent } from 'react';
|
|
2
|
-
|
|
3
|
-
type TActionBehavior = 'DO_NOTHING' | 'NAVIGATE_URL' | 'CALL_AJAX_URL' | 'RUN_ACTION' | 'OPEN_TAB';
|
|
4
|
-
type TActionSource = 'CLICK' | 'DOUBLE_CLICK';
|
|
5
|
-
type TBasicAction = {
|
|
6
|
-
action: string;
|
|
7
|
-
actionBehavior: TActionBehavior;
|
|
8
|
-
actionSource: TActionSource;
|
|
9
|
-
actionNewTabTitle: string;
|
|
10
|
-
text: string;
|
|
11
|
-
};
|
|
12
|
-
declare function handleAction(panelId: string, event: KeyboardEvent | MouseEvent, action: TBasicAction): void;
|
|
13
|
-
|
|
14
|
-
export { type TActionBehavior, type TActionSource, type TBasicAction, handleAction };
|
|
15
|
-
//# sourceMappingURL=basicAction.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"basicAction.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { ApiaApi } from '@apia/api';
|
|
2
|
-
import { firePanelAction } from './firePanelAction.js';
|
|
3
|
-
|
|
4
|
-
function handleAction(panelId, event, action) {
|
|
5
|
-
if (event.type === "dblclick" && action.actionSource === "DOUBLE_CLICK" || (event.type === "click" || event.type === "mousedown") && action.actionSource === "CLICK" || event.type === "keydown" && event.code === "Enter") {
|
|
6
|
-
if (action?.action) {
|
|
7
|
-
switch (action.actionBehavior) {
|
|
8
|
-
case "CALL_AJAX_URL":
|
|
9
|
-
void ApiaApi.post(action.action, { handleLoad: true });
|
|
10
|
-
break;
|
|
11
|
-
case "DO_NOTHING":
|
|
12
|
-
break;
|
|
13
|
-
case "NAVIGATE_URL":
|
|
14
|
-
window.location.assign(action.action);
|
|
15
|
-
break;
|
|
16
|
-
case "OPEN_TAB":
|
|
17
|
-
window.top?.tabsController.openTabByUrl(
|
|
18
|
-
action.actionNewTabTitle || action.text,
|
|
19
|
-
action.action
|
|
20
|
-
);
|
|
21
|
-
break;
|
|
22
|
-
case "RUN_ACTION":
|
|
23
|
-
firePanelAction(
|
|
24
|
-
panelId,
|
|
25
|
-
action.action,
|
|
26
|
-
{},
|
|
27
|
-
{ requestConfig: {
|
|
28
|
-
handleLoad: true
|
|
29
|
-
} }
|
|
30
|
-
);
|
|
31
|
-
break;
|
|
32
|
-
default:
|
|
33
|
-
console.error("Unknown action behavior: ", action);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export { handleAction };
|
|
40
|
-
//# sourceMappingURL=basicAction.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"basicAction.js","sources":["../../src/actions/basicAction.ts"],"sourcesContent":["import { ApiaApi } from '@apia/api';\r\nimport { KeyboardEvent, MouseEvent } from 'react';\r\nimport { firePanelAction } from './firePanelAction';\r\n\r\nexport type TActionBehavior =\r\n | 'DO_NOTHING'\r\n | 'NAVIGATE_URL'\r\n | 'CALL_AJAX_URL'\r\n | 'RUN_ACTION'\r\n | 'OPEN_TAB';\r\n\r\nexport type TActionSource = 'CLICK' | 'DOUBLE_CLICK';\r\n\r\nexport type TBasicAction = {\r\n action: string;\r\n actionBehavior: TActionBehavior;\r\n actionSource: TActionSource;\r\n actionNewTabTitle: string;\r\n text: string;\r\n};\r\n\r\ninterface ITabsController {\r\n openTabByUrl(title: string, url: string): void;\r\n}\r\n\r\nexport function handleAction(\r\n panelId: string,\r\n event: KeyboardEvent | MouseEvent,\r\n action: TBasicAction,\r\n) {\r\n if (\r\n (event.type === 'dblclick' && action.actionSource === 'DOUBLE_CLICK') ||\r\n ((event.type === 'click' || event.type === 'mousedown') &&\r\n action.actionSource === 'CLICK') ||\r\n (event.type === 'keydown' && (event as KeyboardEvent).code === 'Enter')\r\n ) {\r\n if (action?.action) {\r\n switch (action.actionBehavior) {\r\n case 'CALL_AJAX_URL':\r\n void ApiaApi.post(action.action, { handleLoad: true });\r\n break;\r\n case 'DO_NOTHING':\r\n break;\r\n case 'NAVIGATE_URL':\r\n window.location.assign(action.action);\r\n break;\r\n case 'OPEN_TAB':\r\n (\r\n window.top as unknown as { tabsController: ITabsController }\r\n )?.tabsController.openTabByUrl(\r\n action.actionNewTabTitle || action.text,\r\n action.action,\r\n );\r\n break;\r\n case 'RUN_ACTION':\r\n firePanelAction(\r\n panelId,\r\n action.action,\r\n {},\r\n { requestConfig: { handleLoad: true\r\n \r\n } },\r\n );\r\n break;\r\n default:\r\n console.error('Unknown action behavior: ', action);\r\n }\r\n }\r\n }\r\n}\r\n"],"names":[],"mappings":";;;AAyBgB,SAAA,YAAA,CACd,OACA,EAAA,KAAA,EACA,MACA,EAAA;AACA,EACG,IAAA,KAAA,CAAM,SAAS,UAAc,IAAA,MAAA,CAAO,iBAAiB,cACpD,IAAA,CAAA,KAAA,CAAM,SAAS,OAAW,IAAA,KAAA,CAAM,SAAS,WACzC,KAAA,MAAA,CAAO,iBAAiB,OACzB,IAAA,KAAA,CAAM,SAAS,SAAc,IAAA,KAAA,CAAwB,SAAS,OAC/D,EAAA;AACA,IAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,MAAA,QAAQ,OAAO,cAAgB;AAAA,QAC7B,KAAK,eAAA;AACH,UAAA,KAAK,QAAQ,IAAK,CAAA,MAAA,CAAO,QAAQ,EAAE,UAAA,EAAY,MAAM,CAAA,CAAA;AACrD,UAAA,MAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,MAAA;AAAA,QACF,KAAK,cAAA;AACH,UAAO,MAAA,CAAA,QAAA,CAAS,MAAO,CAAA,MAAA,CAAO,MAAM,CAAA,CAAA;AACpC,UAAA,MAAA;AAAA,QACF,KAAK,UAAA;AACH,UACE,MAAA,CAAO,KACN,cAAe,CAAA,YAAA;AAAA,YAChB,MAAA,CAAO,qBAAqB,MAAO,CAAA,IAAA;AAAA,YACnC,MAAO,CAAA,MAAA;AAAA,WACT,CAAA;AACA,UAAA,MAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,eAAA;AAAA,YACE,OAAA;AAAA,YACA,MAAO,CAAA,MAAA;AAAA,YACP,EAAC;AAAA,YACD,EAAE,aAAe,EAAA;AAAA,cAAE,UAAY,EAAA,IAAA;AAAA,aAE7B,EAAA;AAAA,WACJ,CAAA;AACA,UAAA,MAAA;AAAA,QACF;AACE,UAAQ,OAAA,CAAA,KAAA,CAAM,6BAA6B,MAAM,CAAA,CAAA;AAAA,OACrD;AAAA,KACF;AAAA,GACF;AACF;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"externalFirePanelAction.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { firePanelAction } from './firePanelAction.js';
|
|
2
|
-
|
|
3
|
-
const externalFirePanelAction = (panelId, { action, ...parameters }, options) => {
|
|
4
|
-
const postData = {};
|
|
5
|
-
Object.entries(parameters).forEach(([name, value]) => {
|
|
6
|
-
postData[`p_${name}`] = value;
|
|
7
|
-
});
|
|
8
|
-
firePanelAction(panelId, action, postData, options);
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
export { externalFirePanelAction };
|
|
12
|
-
//# sourceMappingURL=externalFirePanelAction.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"externalFirePanelAction.js","sources":["../../src/actions/externalFirePanelAction.ts"],"sourcesContent":["import { firePanelAction } from './firePanelAction';\r\nimport { TExternalActionDispatcher } from './usePanelActions';\r\n\r\nexport const externalFirePanelAction: TExternalActionDispatcher = (\r\n panelId,\r\n { action, ...parameters },\r\n options,\r\n) => {\r\n const postData: Record<string, unknown> = {};\r\n\r\n Object.entries(parameters).forEach(([name, value]) => {\r\n postData[`p_${name}`] = value;\r\n });\r\n\r\n firePanelAction(panelId, action, postData, options);\r\n};\r\n"],"names":[],"mappings":";;AAGa,MAAA,uBAAA,GAAqD,CAChE,OACA,EAAA,EAAE,QAAQ,GAAG,UAAA,IACb,OACG,KAAA;AACH,EAAA,MAAM,WAAoC,EAAC,CAAA;AAE3C,EAAO,MAAA,CAAA,OAAA,CAAQ,UAAU,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,IAAA,EAAM,KAAK,CAAM,KAAA;AACpD,IAAS,QAAA,CAAA,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAI,GAAA,KAAA,CAAA;AAAA,GACzB,CAAA,CAAA;AAED,EAAgB,eAAA,CAAA,OAAA,EAAS,MAAQ,EAAA,QAAA,EAAU,OAAO,CAAA,CAAA;AACpD;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"firePanelAction.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|