@actual-app/web 24.3.0 → 24.4.0
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/build/.vite/manifest.json +27 -17
- package/build/index.html +1 -1
- package/build/kcab/{kcab.worker.fb5495b79632bd06ea0f.js → kcab.worker.d3576baccc44df86e1d9.js} +57 -57
- package/build/kcab/{kcab.worker.fb5495b79632bd06ea0f.js.map → kcab.worker.d3576baccc44df86e1d9.js.map} +1 -1
- package/build/static/js/AppliedFilters.6hw_SZMi.chunk.js +2 -0
- package/build/static/js/AppliedFilters.6hw_SZMi.chunk.js.map +1 -0
- package/build/static/js/{BackgroundImage.Jugq91td.chunk.js → BackgroundImage.UwhfLEYN.chunk.js} +2 -2
- package/build/static/js/{BackgroundImage.Jugq91td.chunk.js.map → BackgroundImage.UwhfLEYN.chunk.js.map} +1 -1
- package/build/static/js/BalanceTooltip.hDG0UB7U.chunk.js +2 -0
- package/build/static/js/BalanceTooltip.hDG0UB7U.chunk.js.map +1 -0
- package/build/static/js/ButtonLink.WYXFzja-.chunk.js +2 -0
- package/build/static/js/{ButtonLink.ElUV7DMx.chunk.js.map → ButtonLink.WYXFzja-.chunk.js.map} +1 -1
- package/build/static/js/ReportRouter.mLx3JUh2.chunk.js +66 -0
- package/build/static/js/ReportRouter.mLx3JUh2.chunk.js.map +1 -0
- package/build/static/js/import.M8LEm-Nc.chunk.js +2 -0
- package/build/static/js/import.M8LEm-Nc.chunk.js.map +1 -0
- package/build/static/js/index.MAk9r4yg.js +216 -0
- package/build/static/js/index.MAk9r4yg.js.map +1 -0
- package/build/static/js/narrow.vxy14QoE.chunk.js +108 -0
- package/build/static/js/narrow.vxy14QoE.chunk.js.map +1 -0
- package/build/static/js/wide.GDttRuTJ.chunk.js +2 -0
- package/build/static/js/wide.GDttRuTJ.chunk.js.map +1 -0
- package/build/sw.js +1 -1
- package/build/sw.js.map +1 -1
- package/package.json +3 -2
- package/build/static/js/AppliedFilters.ggJl8zjp.chunk.js +0 -2
- package/build/static/js/AppliedFilters.ggJl8zjp.chunk.js.map +0 -1
- package/build/static/js/BalanceTooltip.nSDrDsfc.chunk.js +0 -2
- package/build/static/js/BalanceTooltip.nSDrDsfc.chunk.js.map +0 -1
- package/build/static/js/ButtonLink.ElUV7DMx.chunk.js +0 -2
- package/build/static/js/ReportRouter.8mlKGqxC.chunk.js +0 -69
- package/build/static/js/ReportRouter.8mlKGqxC.chunk.js.map +0 -1
- package/build/static/js/index.O6ABAWXP.js +0 -216
- package/build/static/js/index.O6ABAWXP.js.map +0 -1
- package/build/static/js/narrow.BvCotSUP.chunk.js +0 -108
- package/build/static/js/narrow.BvCotSUP.chunk.js.map +0 -1
- package/build/static/js/wide.Puo4nQYF.chunk.js +0 -2
- package/build/static/js/wide.Puo4nQYF.chunk.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wide.Puo4nQYF.chunk.js","sources":["../../../../../node_modules/react-redux/es/components/connectAdvanced.js","../../../../../node_modules/react-redux/es/utils/shallowEqual.js","../../../../../node_modules/react-redux/es/utils/bindActionCreators.js","../../../../../node_modules/react-redux/es/connect/wrapMapToProps.js","../../../../../node_modules/react-redux/es/connect/mapDispatchToProps.js","../../../../../node_modules/react-redux/es/connect/mapStateToProps.js","../../../../../node_modules/react-redux/es/connect/mergeProps.js","../../../../../node_modules/react-redux/es/connect/selectorFactory.js","../../../../../node_modules/react-redux/es/connect/connect.js","../../../src/icons/v0/LeftArrow2.tsx","../../../src/icons/v1/ArrowDown.tsx","../../../src/icons/v1/ArrowUp.tsx","../../../src/icons/v2/ArrowButtonDown1.tsx","../../../src/icons/v2/ArrowButtonRight1.tsx","../../../src/icons/v2/ArrowButtonUp1.tsx","../../../src/icons/v2/ArrowsExpand3.tsx","../../../src/icons/v2/ArrowsShrink3.tsx","../../../src/icons/v2/CustomNotesPaper.tsx","../../../src/icons/v2/DownloadThickBottom.tsx","../../../src/icons/v2/Hyperlink2.tsx","../../../src/icons/v2/Pencil1.tsx","../../../src/hooks/useResizeObserver.ts","../../../src/components/budget/MonthPicker.tsx","../../../src/components/budget/BudgetPageHeader.tsx","../../../src/components/budget/RenderMonths.tsx","../../../src/components/NotesButton.tsx","../../../src/components/budget/SidebarCategory.tsx","../../../src/components/budget/ExpenseCategory.tsx","../../../src/components/budget/SidebarGroup.tsx","../../../src/components/budget/ExpenseGroup.tsx","../../../src/components/budget/IncomeCategory.tsx","../../../src/components/budget/IncomeGroup.tsx","../../../src/components/budget/IncomeHeader.tsx","../../../src/components/budget/BudgetCategories.jsx","../../../src/components/budget/BudgetSummaries.tsx","../../../src/components/budget/BudgetTotals.tsx","../../../src/components/budget/BudgetTable.jsx","../../../src/components/budget/DynamicBudgetTable.tsx","../../../src/components/budget/report/ReportContext.tsx","../../../src/components/budget/report/budgetsummary/BudgetSummary.tsx","../../../src/components/budget/report/ReportComponents.tsx","../../../src/components/budget/rollover/RolloverContext.tsx","../../../src/components/budget/rollover/budgetsummary/BudgetSummary.tsx","../../../src/components/budget/rollover/RolloverComponents.tsx","../../../src/components/budget/index.tsx","../../../src/components/schedules/index.tsx","../../../src/components/gocardless/GoCardlessLink.tsx","../../../src/components/transactions/TransactionsTable.jsx","../../../src/components/transactions/TransactionList.jsx","../../../src/components/filters/FilterMenu.tsx","../../../src/components/filters/NameFilter.tsx","../../../src/components/filters/SavedFilterMenuButton.tsx","../../../src/components/filters/FiltersStack.tsx","../../../src/components/transactions/SelectedTransactions.jsx","../../../src/components/accounts/Balance.jsx","../../../src/components/accounts/Reconcile.jsx","../../../src/components/accounts/Header.jsx","../../../src/components/accounts/Account.jsx"],"sourcesContent":["import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"getDisplayName\", \"methodName\", \"renderCountProp\", \"shouldHandleStateChanges\", \"storeKey\", \"withRef\", \"forwardRef\", \"context\"],\n _excluded2 = [\"reactReduxForwardedRef\"];\nimport hoistStatics from 'hoist-non-react-statics';\nimport React, { useContext, useMemo, useRef, useReducer } from 'react';\nimport { isValidElementType, isContextConsumer } from 'react-is';\nimport { createSubscription } from '../utils/Subscription';\nimport { useIsomorphicLayoutEffect } from '../utils/useIsomorphicLayoutEffect';\nimport { ReactReduxContext } from './Context'; // Define some constant arrays just to avoid re-creating these\n\nvar EMPTY_ARRAY = [];\nvar NO_SUBSCRIPTION_ARRAY = [null, null];\n\nvar stringifyComponent = function stringifyComponent(Comp) {\n try {\n return JSON.stringify(Comp);\n } catch (err) {\n return String(Comp);\n }\n};\n\nfunction storeStateUpdatesReducer(state, action) {\n var updateCount = state[1];\n return [action.payload, updateCount + 1];\n}\n\nfunction useIsomorphicLayoutEffectWithArgs(effectFunc, effectArgs, dependencies) {\n useIsomorphicLayoutEffect(function () {\n return effectFunc.apply(void 0, effectArgs);\n }, dependencies);\n}\n\nfunction captureWrapperProps(lastWrapperProps, lastChildProps, renderIsScheduled, wrapperProps, actualChildProps, childPropsFromStoreUpdate, notifyNestedSubs) {\n // We want to capture the wrapper props and child props we used for later comparisons\n lastWrapperProps.current = wrapperProps;\n lastChildProps.current = actualChildProps;\n renderIsScheduled.current = false; // If the render was from a store update, clear out that reference and cascade the subscriber update\n\n if (childPropsFromStoreUpdate.current) {\n childPropsFromStoreUpdate.current = null;\n notifyNestedSubs();\n }\n}\n\nfunction subscribeUpdates(shouldHandleStateChanges, store, subscription, childPropsSelector, lastWrapperProps, lastChildProps, renderIsScheduled, childPropsFromStoreUpdate, notifyNestedSubs, forceComponentUpdateDispatch) {\n // If we're not subscribed to the store, nothing to do here\n if (!shouldHandleStateChanges) return; // Capture values for checking if and when this component unmounts\n\n var didUnsubscribe = false;\n var lastThrownError = null; // We'll run this callback every time a store subscription update propagates to this component\n\n var checkForUpdates = function checkForUpdates() {\n if (didUnsubscribe) {\n // Don't run stale listeners.\n // Redux doesn't guarantee unsubscriptions happen until next dispatch.\n return;\n }\n\n var latestStoreState = store.getState();\n var newChildProps, error;\n\n try {\n // Actually run the selector with the most recent store state and wrapper props\n // to determine what the child props should be\n newChildProps = childPropsSelector(latestStoreState, lastWrapperProps.current);\n } catch (e) {\n error = e;\n lastThrownError = e;\n }\n\n if (!error) {\n lastThrownError = null;\n } // If the child props haven't changed, nothing to do here - cascade the subscription update\n\n\n if (newChildProps === lastChildProps.current) {\n if (!renderIsScheduled.current) {\n notifyNestedSubs();\n }\n } else {\n // Save references to the new child props. Note that we track the \"child props from store update\"\n // as a ref instead of a useState/useReducer because we need a way to determine if that value has\n // been processed. If this went into useState/useReducer, we couldn't clear out the value without\n // forcing another re-render, which we don't want.\n lastChildProps.current = newChildProps;\n childPropsFromStoreUpdate.current = newChildProps;\n renderIsScheduled.current = true; // If the child props _did_ change (or we caught an error), this wrapper component needs to re-render\n\n forceComponentUpdateDispatch({\n type: 'STORE_UPDATED',\n payload: {\n error: error\n }\n });\n }\n }; // Actually subscribe to the nearest connected ancestor (or store)\n\n\n subscription.onStateChange = checkForUpdates;\n subscription.trySubscribe(); // Pull data from the store after first render in case the store has\n // changed since we began.\n\n checkForUpdates();\n\n var unsubscribeWrapper = function unsubscribeWrapper() {\n didUnsubscribe = true;\n subscription.tryUnsubscribe();\n subscription.onStateChange = null;\n\n if (lastThrownError) {\n // It's possible that we caught an error due to a bad mapState function, but the\n // parent re-rendered without this component and we're about to unmount.\n // This shouldn't happen as long as we do top-down subscriptions correctly, but\n // if we ever do those wrong, this throw will surface the error in our tests.\n // In that case, throw the error from here so it doesn't get lost.\n throw lastThrownError;\n }\n };\n\n return unsubscribeWrapper;\n}\n\nvar initStateUpdates = function initStateUpdates() {\n return [null, 0];\n};\n\nexport default function connectAdvanced(\n/*\r\n selectorFactory is a func that is responsible for returning the selector function used to\r\n compute new props from state, props, and dispatch. For example:\r\n export default connectAdvanced((dispatch, options) => (state, props) => ({\r\n thing: state.things[props.thingId],\r\n saveThing: fields => dispatch(actionCreators.saveThing(props.thingId, fields)),\r\n }))(YourComponent)\r\n Access to dispatch is provided to the factory so selectorFactories can bind actionCreators\r\n outside of their selector as an optimization. Options passed to connectAdvanced are passed to\r\n the selectorFactory, along with displayName and WrappedComponent, as the second argument.\r\n Note that selectorFactory is responsible for all caching/memoization of inbound and outbound\r\n props. Do not use connectAdvanced directly without memoizing results between calls to your\r\n selector, otherwise the Connect component will re-render on every state or props change.\r\n*/\nselectorFactory, // options object:\n_ref) {\n if (_ref === void 0) {\n _ref = {};\n }\n\n var _ref2 = _ref,\n _ref2$getDisplayName = _ref2.getDisplayName,\n getDisplayName = _ref2$getDisplayName === void 0 ? function (name) {\n return \"ConnectAdvanced(\" + name + \")\";\n } : _ref2$getDisplayName,\n _ref2$methodName = _ref2.methodName,\n methodName = _ref2$methodName === void 0 ? 'connectAdvanced' : _ref2$methodName,\n _ref2$renderCountProp = _ref2.renderCountProp,\n renderCountProp = _ref2$renderCountProp === void 0 ? undefined : _ref2$renderCountProp,\n _ref2$shouldHandleSta = _ref2.shouldHandleStateChanges,\n shouldHandleStateChanges = _ref2$shouldHandleSta === void 0 ? true : _ref2$shouldHandleSta,\n _ref2$storeKey = _ref2.storeKey,\n storeKey = _ref2$storeKey === void 0 ? 'store' : _ref2$storeKey,\n _ref2$withRef = _ref2.withRef,\n withRef = _ref2$withRef === void 0 ? false : _ref2$withRef,\n _ref2$forwardRef = _ref2.forwardRef,\n forwardRef = _ref2$forwardRef === void 0 ? false : _ref2$forwardRef,\n _ref2$context = _ref2.context,\n context = _ref2$context === void 0 ? ReactReduxContext : _ref2$context,\n connectOptions = _objectWithoutPropertiesLoose(_ref2, _excluded);\n\n if (process.env.NODE_ENV !== 'production') {\n if (renderCountProp !== undefined) {\n throw new Error(\"renderCountProp is removed. render counting is built into the latest React Dev Tools profiling extension\");\n }\n\n if (withRef) {\n throw new Error('withRef is removed. To access the wrapped instance, use a ref on the connected component');\n }\n\n var customStoreWarningMessage = 'To use a custom Redux store for specific components, create a custom React context with ' + \"React.createContext(), and pass the context object to React Redux's Provider and specific components\" + ' like: <Provider context={MyContext}><ConnectedComponent context={MyContext} /></Provider>. ' + 'You may also pass a {context : MyContext} option to connect';\n\n if (storeKey !== 'store') {\n throw new Error('storeKey has been removed and does not do anything. ' + customStoreWarningMessage);\n }\n }\n\n var Context = context;\n return function wrapWithConnect(WrappedComponent) {\n if (process.env.NODE_ENV !== 'production' && !isValidElementType(WrappedComponent)) {\n throw new Error(\"You must pass a component to the function returned by \" + (methodName + \". Instead received \" + stringifyComponent(WrappedComponent)));\n }\n\n var wrappedComponentName = WrappedComponent.displayName || WrappedComponent.name || 'Component';\n var displayName = getDisplayName(wrappedComponentName);\n\n var selectorFactoryOptions = _extends({}, connectOptions, {\n getDisplayName: getDisplayName,\n methodName: methodName,\n renderCountProp: renderCountProp,\n shouldHandleStateChanges: shouldHandleStateChanges,\n storeKey: storeKey,\n displayName: displayName,\n wrappedComponentName: wrappedComponentName,\n WrappedComponent: WrappedComponent\n });\n\n var pure = connectOptions.pure;\n\n function createChildSelector(store) {\n return selectorFactory(store.dispatch, selectorFactoryOptions);\n } // If we aren't running in \"pure\" mode, we don't want to memoize values.\n // To avoid conditionally calling hooks, we fall back to a tiny wrapper\n // that just executes the given callback immediately.\n\n\n var usePureOnlyMemo = pure ? useMemo : function (callback) {\n return callback();\n };\n\n function ConnectFunction(props) {\n var _useMemo = useMemo(function () {\n // Distinguish between actual \"data\" props that were passed to the wrapper component,\n // and values needed to control behavior (forwarded refs, alternate context instances).\n // To maintain the wrapperProps object reference, memoize this destructuring.\n var reactReduxForwardedRef = props.reactReduxForwardedRef,\n wrapperProps = _objectWithoutPropertiesLoose(props, _excluded2);\n\n return [props.context, reactReduxForwardedRef, wrapperProps];\n }, [props]),\n propsContext = _useMemo[0],\n reactReduxForwardedRef = _useMemo[1],\n wrapperProps = _useMemo[2];\n\n var ContextToUse = useMemo(function () {\n // Users may optionally pass in a custom context instance to use instead of our ReactReduxContext.\n // Memoize the check that determines which context instance we should use.\n return propsContext && propsContext.Consumer && isContextConsumer( /*#__PURE__*/React.createElement(propsContext.Consumer, null)) ? propsContext : Context;\n }, [propsContext, Context]); // Retrieve the store and ancestor subscription via context, if available\n\n var contextValue = useContext(ContextToUse); // The store _must_ exist as either a prop or in context.\n // We'll check to see if it _looks_ like a Redux store first.\n // This allows us to pass through a `store` prop that is just a plain value.\n\n var didStoreComeFromProps = Boolean(props.store) && Boolean(props.store.getState) && Boolean(props.store.dispatch);\n var didStoreComeFromContext = Boolean(contextValue) && Boolean(contextValue.store);\n\n if (process.env.NODE_ENV !== 'production' && !didStoreComeFromProps && !didStoreComeFromContext) {\n throw new Error(\"Could not find \\\"store\\\" in the context of \" + (\"\\\"\" + displayName + \"\\\". Either wrap the root component in a <Provider>, \") + \"or pass a custom React context provider to <Provider> and the corresponding \" + (\"React context consumer to \" + displayName + \" in connect options.\"));\n } // Based on the previous check, one of these must be true\n\n\n var store = didStoreComeFromProps ? props.store : contextValue.store;\n var childPropsSelector = useMemo(function () {\n // The child props selector needs the store reference as an input.\n // Re-create this selector whenever the store changes.\n return createChildSelector(store);\n }, [store]);\n\n var _useMemo2 = useMemo(function () {\n if (!shouldHandleStateChanges) return NO_SUBSCRIPTION_ARRAY; // This Subscription's source should match where store came from: props vs. context. A component\n // connected to the store via props shouldn't use subscription from context, or vice versa.\n\n // This Subscription's source should match where store came from: props vs. context. A component\n // connected to the store via props shouldn't use subscription from context, or vice versa.\n var subscription = createSubscription(store, didStoreComeFromProps ? null : contextValue.subscription); // `notifyNestedSubs` is duplicated to handle the case where the component is unmounted in\n // the middle of the notification loop, where `subscription` will then be null. This can\n // probably be avoided if Subscription's listeners logic is changed to not call listeners\n // that have been unsubscribed in the middle of the notification loop.\n\n // `notifyNestedSubs` is duplicated to handle the case where the component is unmounted in\n // the middle of the notification loop, where `subscription` will then be null. This can\n // probably be avoided if Subscription's listeners logic is changed to not call listeners\n // that have been unsubscribed in the middle of the notification loop.\n var notifyNestedSubs = subscription.notifyNestedSubs.bind(subscription);\n return [subscription, notifyNestedSubs];\n }, [store, didStoreComeFromProps, contextValue]),\n subscription = _useMemo2[0],\n notifyNestedSubs = _useMemo2[1]; // Determine what {store, subscription} value should be put into nested context, if necessary,\n // and memoize that value to avoid unnecessary context updates.\n\n\n var overriddenContextValue = useMemo(function () {\n if (didStoreComeFromProps) {\n // This component is directly subscribed to a store from props.\n // We don't want descendants reading from this store - pass down whatever\n // the existing context value is from the nearest connected ancestor.\n return contextValue;\n } // Otherwise, put this component's subscription instance into context, so that\n // connected descendants won't update until after this component is done\n\n\n return _extends({}, contextValue, {\n subscription: subscription\n });\n }, [didStoreComeFromProps, contextValue, subscription]); // We need to force this wrapper component to re-render whenever a Redux store update\n // causes a change to the calculated child component props (or we caught an error in mapState)\n\n var _useReducer = useReducer(storeStateUpdatesReducer, EMPTY_ARRAY, initStateUpdates),\n _useReducer$ = _useReducer[0],\n previousStateUpdateResult = _useReducer$[0],\n forceComponentUpdateDispatch = _useReducer[1]; // Propagate any mapState/mapDispatch errors upwards\n\n\n if (previousStateUpdateResult && previousStateUpdateResult.error) {\n throw previousStateUpdateResult.error;\n } // Set up refs to coordinate values between the subscription effect and the render logic\n\n\n var lastChildProps = useRef();\n var lastWrapperProps = useRef(wrapperProps);\n var childPropsFromStoreUpdate = useRef();\n var renderIsScheduled = useRef(false);\n var actualChildProps = usePureOnlyMemo(function () {\n // Tricky logic here:\n // - This render may have been triggered by a Redux store update that produced new child props\n // - However, we may have gotten new wrapper props after that\n // If we have new child props, and the same wrapper props, we know we should use the new child props as-is.\n // But, if we have new wrapper props, those might change the child props, so we have to recalculate things.\n // So, we'll use the child props from store update only if the wrapper props are the same as last time.\n if (childPropsFromStoreUpdate.current && wrapperProps === lastWrapperProps.current) {\n return childPropsFromStoreUpdate.current;\n } // TODO We're reading the store directly in render() here. Bad idea?\n // This will likely cause Bad Things (TM) to happen in Concurrent Mode.\n // Note that we do this because on renders _not_ caused by store updates, we need the latest store state\n // to determine what the child props should be.\n\n\n return childPropsSelector(store.getState(), wrapperProps);\n }, [store, previousStateUpdateResult, wrapperProps]); // We need this to execute synchronously every time we re-render. However, React warns\n // about useLayoutEffect in SSR, so we try to detect environment and fall back to\n // just useEffect instead to avoid the warning, since neither will run anyway.\n\n useIsomorphicLayoutEffectWithArgs(captureWrapperProps, [lastWrapperProps, lastChildProps, renderIsScheduled, wrapperProps, actualChildProps, childPropsFromStoreUpdate, notifyNestedSubs]); // Our re-subscribe logic only runs when the store/subscription setup changes\n\n useIsomorphicLayoutEffectWithArgs(subscribeUpdates, [shouldHandleStateChanges, store, subscription, childPropsSelector, lastWrapperProps, lastChildProps, renderIsScheduled, childPropsFromStoreUpdate, notifyNestedSubs, forceComponentUpdateDispatch], [store, subscription, childPropsSelector]); // Now that all that's done, we can finally try to actually render the child component.\n // We memoize the elements for the rendered child component as an optimization.\n\n var renderedWrappedComponent = useMemo(function () {\n return /*#__PURE__*/React.createElement(WrappedComponent, _extends({}, actualChildProps, {\n ref: reactReduxForwardedRef\n }));\n }, [reactReduxForwardedRef, WrappedComponent, actualChildProps]); // If React sees the exact same element reference as last time, it bails out of re-rendering\n // that child, same as if it was wrapped in React.memo() or returned false from shouldComponentUpdate.\n\n var renderedChild = useMemo(function () {\n if (shouldHandleStateChanges) {\n // If this component is subscribed to store updates, we need to pass its own\n // subscription instance down to our descendants. That means rendering the same\n // Context instance, and putting a different value into the context.\n return /*#__PURE__*/React.createElement(ContextToUse.Provider, {\n value: overriddenContextValue\n }, renderedWrappedComponent);\n }\n\n return renderedWrappedComponent;\n }, [ContextToUse, renderedWrappedComponent, overriddenContextValue]);\n return renderedChild;\n } // If we're in \"pure\" mode, ensure our wrapper component only re-renders when incoming props have changed.\n\n\n var Connect = pure ? React.memo(ConnectFunction) : ConnectFunction;\n Connect.WrappedComponent = WrappedComponent;\n Connect.displayName = ConnectFunction.displayName = displayName;\n\n if (forwardRef) {\n var forwarded = React.forwardRef(function forwardConnectRef(props, ref) {\n return /*#__PURE__*/React.createElement(Connect, _extends({}, props, {\n reactReduxForwardedRef: ref\n }));\n });\n forwarded.displayName = displayName;\n forwarded.WrappedComponent = WrappedComponent;\n return hoistStatics(forwarded, WrappedComponent);\n }\n\n return hoistStatics(Connect, WrappedComponent);\n };\n}","function is(x, y) {\n if (x === y) {\n return x !== 0 || y !== 0 || 1 / x === 1 / y;\n } else {\n return x !== x && y !== y;\n }\n}\n\nexport default function shallowEqual(objA, objB) {\n if (is(objA, objB)) return true;\n\n if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {\n return false;\n }\n\n var keysA = Object.keys(objA);\n var keysB = Object.keys(objB);\n if (keysA.length !== keysB.length) return false;\n\n for (var i = 0; i < keysA.length; i++) {\n if (!Object.prototype.hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {\n return false;\n }\n }\n\n return true;\n}","export default function bindActionCreators(actionCreators, dispatch) {\n var boundActionCreators = {};\n\n var _loop = function _loop(key) {\n var actionCreator = actionCreators[key];\n\n if (typeof actionCreator === 'function') {\n boundActionCreators[key] = function () {\n return dispatch(actionCreator.apply(void 0, arguments));\n };\n }\n };\n\n for (var key in actionCreators) {\n _loop(key);\n }\n\n return boundActionCreators;\n}","import verifyPlainObject from '../utils/verifyPlainObject';\nexport function wrapMapToPropsConstant(getConstant) {\n return function initConstantSelector(dispatch, options) {\n var constant = getConstant(dispatch, options);\n\n function constantSelector() {\n return constant;\n }\n\n constantSelector.dependsOnOwnProps = false;\n return constantSelector;\n };\n} // dependsOnOwnProps is used by createMapToPropsProxy to determine whether to pass props as args\n// to the mapToProps function being wrapped. It is also used by makePurePropsSelector to determine\n// whether mapToProps needs to be invoked when props have changed.\n//\n// A length of one signals that mapToProps does not depend on props from the parent component.\n// A length of zero is assumed to mean mapToProps is getting args via arguments or ...args and\n// therefore not reporting its length accurately..\n\nexport function getDependsOnOwnProps(mapToProps) {\n return mapToProps.dependsOnOwnProps !== null && mapToProps.dependsOnOwnProps !== undefined ? Boolean(mapToProps.dependsOnOwnProps) : mapToProps.length !== 1;\n} // Used by whenMapStateToPropsIsFunction and whenMapDispatchToPropsIsFunction,\n// this function wraps mapToProps in a proxy function which does several things:\n//\n// * Detects whether the mapToProps function being called depends on props, which\n// is used by selectorFactory to decide if it should reinvoke on props changes.\n//\n// * On first call, handles mapToProps if returns another function, and treats that\n// new function as the true mapToProps for subsequent calls.\n//\n// * On first call, verifies the first result is a plain object, in order to warn\n// the developer that their mapToProps function is not returning a valid result.\n//\n\nexport function wrapMapToPropsFunc(mapToProps, methodName) {\n return function initProxySelector(dispatch, _ref) {\n var displayName = _ref.displayName;\n\n var proxy = function mapToPropsProxy(stateOrDispatch, ownProps) {\n return proxy.dependsOnOwnProps ? proxy.mapToProps(stateOrDispatch, ownProps) : proxy.mapToProps(stateOrDispatch);\n }; // allow detectFactoryAndVerify to get ownProps\n\n\n proxy.dependsOnOwnProps = true;\n\n proxy.mapToProps = function detectFactoryAndVerify(stateOrDispatch, ownProps) {\n proxy.mapToProps = mapToProps;\n proxy.dependsOnOwnProps = getDependsOnOwnProps(mapToProps);\n var props = proxy(stateOrDispatch, ownProps);\n\n if (typeof props === 'function') {\n proxy.mapToProps = props;\n proxy.dependsOnOwnProps = getDependsOnOwnProps(props);\n props = proxy(stateOrDispatch, ownProps);\n }\n\n if (process.env.NODE_ENV !== 'production') verifyPlainObject(props, displayName, methodName);\n return props;\n };\n\n return proxy;\n };\n}","import bindActionCreators from '../utils/bindActionCreators';\nimport { wrapMapToPropsConstant, wrapMapToPropsFunc } from './wrapMapToProps';\nexport function whenMapDispatchToPropsIsFunction(mapDispatchToProps) {\n return typeof mapDispatchToProps === 'function' ? wrapMapToPropsFunc(mapDispatchToProps, 'mapDispatchToProps') : undefined;\n}\nexport function whenMapDispatchToPropsIsMissing(mapDispatchToProps) {\n return !mapDispatchToProps ? wrapMapToPropsConstant(function (dispatch) {\n return {\n dispatch: dispatch\n };\n }) : undefined;\n}\nexport function whenMapDispatchToPropsIsObject(mapDispatchToProps) {\n return mapDispatchToProps && typeof mapDispatchToProps === 'object' ? wrapMapToPropsConstant(function (dispatch) {\n return bindActionCreators(mapDispatchToProps, dispatch);\n }) : undefined;\n}\nexport default [whenMapDispatchToPropsIsFunction, whenMapDispatchToPropsIsMissing, whenMapDispatchToPropsIsObject];","import { wrapMapToPropsConstant, wrapMapToPropsFunc } from './wrapMapToProps';\nexport function whenMapStateToPropsIsFunction(mapStateToProps) {\n return typeof mapStateToProps === 'function' ? wrapMapToPropsFunc(mapStateToProps, 'mapStateToProps') : undefined;\n}\nexport function whenMapStateToPropsIsMissing(mapStateToProps) {\n return !mapStateToProps ? wrapMapToPropsConstant(function () {\n return {};\n }) : undefined;\n}\nexport default [whenMapStateToPropsIsFunction, whenMapStateToPropsIsMissing];","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport verifyPlainObject from '../utils/verifyPlainObject';\nexport function defaultMergeProps(stateProps, dispatchProps, ownProps) {\n return _extends({}, ownProps, stateProps, dispatchProps);\n}\nexport function wrapMergePropsFunc(mergeProps) {\n return function initMergePropsProxy(dispatch, _ref) {\n var displayName = _ref.displayName,\n pure = _ref.pure,\n areMergedPropsEqual = _ref.areMergedPropsEqual;\n var hasRunOnce = false;\n var mergedProps;\n return function mergePropsProxy(stateProps, dispatchProps, ownProps) {\n var nextMergedProps = mergeProps(stateProps, dispatchProps, ownProps);\n\n if (hasRunOnce) {\n if (!pure || !areMergedPropsEqual(nextMergedProps, mergedProps)) mergedProps = nextMergedProps;\n } else {\n hasRunOnce = true;\n mergedProps = nextMergedProps;\n if (process.env.NODE_ENV !== 'production') verifyPlainObject(mergedProps, displayName, 'mergeProps');\n }\n\n return mergedProps;\n };\n };\n}\nexport function whenMergePropsIsFunction(mergeProps) {\n return typeof mergeProps === 'function' ? wrapMergePropsFunc(mergeProps) : undefined;\n}\nexport function whenMergePropsIsOmitted(mergeProps) {\n return !mergeProps ? function () {\n return defaultMergeProps;\n } : undefined;\n}\nexport default [whenMergePropsIsFunction, whenMergePropsIsOmitted];","import _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"initMapStateToProps\", \"initMapDispatchToProps\", \"initMergeProps\"];\nimport verifySubselectors from './verifySubselectors';\nexport function impureFinalPropsSelectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch) {\n return function impureFinalPropsSelector(state, ownProps) {\n return mergeProps(mapStateToProps(state, ownProps), mapDispatchToProps(dispatch, ownProps), ownProps);\n };\n}\nexport function pureFinalPropsSelectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch, _ref) {\n var areStatesEqual = _ref.areStatesEqual,\n areOwnPropsEqual = _ref.areOwnPropsEqual,\n areStatePropsEqual = _ref.areStatePropsEqual;\n var hasRunAtLeastOnce = false;\n var state;\n var ownProps;\n var stateProps;\n var dispatchProps;\n var mergedProps;\n\n function handleFirstCall(firstState, firstOwnProps) {\n state = firstState;\n ownProps = firstOwnProps;\n stateProps = mapStateToProps(state, ownProps);\n dispatchProps = mapDispatchToProps(dispatch, ownProps);\n mergedProps = mergeProps(stateProps, dispatchProps, ownProps);\n hasRunAtLeastOnce = true;\n return mergedProps;\n }\n\n function handleNewPropsAndNewState() {\n stateProps = mapStateToProps(state, ownProps);\n if (mapDispatchToProps.dependsOnOwnProps) dispatchProps = mapDispatchToProps(dispatch, ownProps);\n mergedProps = mergeProps(stateProps, dispatchProps, ownProps);\n return mergedProps;\n }\n\n function handleNewProps() {\n if (mapStateToProps.dependsOnOwnProps) stateProps = mapStateToProps(state, ownProps);\n if (mapDispatchToProps.dependsOnOwnProps) dispatchProps = mapDispatchToProps(dispatch, ownProps);\n mergedProps = mergeProps(stateProps, dispatchProps, ownProps);\n return mergedProps;\n }\n\n function handleNewState() {\n var nextStateProps = mapStateToProps(state, ownProps);\n var statePropsChanged = !areStatePropsEqual(nextStateProps, stateProps);\n stateProps = nextStateProps;\n if (statePropsChanged) mergedProps = mergeProps(stateProps, dispatchProps, ownProps);\n return mergedProps;\n }\n\n function handleSubsequentCalls(nextState, nextOwnProps) {\n var propsChanged = !areOwnPropsEqual(nextOwnProps, ownProps);\n var stateChanged = !areStatesEqual(nextState, state, nextOwnProps, ownProps);\n state = nextState;\n ownProps = nextOwnProps;\n if (propsChanged && stateChanged) return handleNewPropsAndNewState();\n if (propsChanged) return handleNewProps();\n if (stateChanged) return handleNewState();\n return mergedProps;\n }\n\n return function pureFinalPropsSelector(nextState, nextOwnProps) {\n return hasRunAtLeastOnce ? handleSubsequentCalls(nextState, nextOwnProps) : handleFirstCall(nextState, nextOwnProps);\n };\n} // TODO: Add more comments\n// If pure is true, the selector returned by selectorFactory will memoize its results,\n// allowing connectAdvanced's shouldComponentUpdate to return false if final\n// props have not changed. If false, the selector will always return a new\n// object and shouldComponentUpdate will always return true.\n\nexport default function finalPropsSelectorFactory(dispatch, _ref2) {\n var initMapStateToProps = _ref2.initMapStateToProps,\n initMapDispatchToProps = _ref2.initMapDispatchToProps,\n initMergeProps = _ref2.initMergeProps,\n options = _objectWithoutPropertiesLoose(_ref2, _excluded);\n\n var mapStateToProps = initMapStateToProps(dispatch, options);\n var mapDispatchToProps = initMapDispatchToProps(dispatch, options);\n var mergeProps = initMergeProps(dispatch, options);\n\n if (process.env.NODE_ENV !== 'production') {\n verifySubselectors(mapStateToProps, mapDispatchToProps, mergeProps, options.displayName);\n }\n\n var selectorFactory = options.pure ? pureFinalPropsSelectorFactory : impureFinalPropsSelectorFactory;\n return selectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch, options);\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nvar _excluded = [\"pure\", \"areStatesEqual\", \"areOwnPropsEqual\", \"areStatePropsEqual\", \"areMergedPropsEqual\"];\nimport connectAdvanced from '../components/connectAdvanced';\nimport shallowEqual from '../utils/shallowEqual';\nimport defaultMapDispatchToPropsFactories from './mapDispatchToProps';\nimport defaultMapStateToPropsFactories from './mapStateToProps';\nimport defaultMergePropsFactories from './mergeProps';\nimport defaultSelectorFactory from './selectorFactory';\n/*\r\n connect is a facade over connectAdvanced. It turns its args into a compatible\r\n selectorFactory, which has the signature:\r\n\r\n (dispatch, options) => (nextState, nextOwnProps) => nextFinalProps\r\n \r\n connect passes its args to connectAdvanced as options, which will in turn pass them to\r\n selectorFactory each time a Connect component instance is instantiated or hot reloaded.\r\n\r\n selectorFactory returns a final props selector from its mapStateToProps,\r\n mapStateToPropsFactories, mapDispatchToProps, mapDispatchToPropsFactories, mergeProps,\r\n mergePropsFactories, and pure args.\r\n\r\n The resulting final props selector is called by the Connect component instance whenever\r\n it receives new props or store state.\r\n */\n\nfunction match(arg, factories, name) {\n for (var i = factories.length - 1; i >= 0; i--) {\n var result = factories[i](arg);\n if (result) return result;\n }\n\n return function (dispatch, options) {\n throw new Error(\"Invalid value of type \" + typeof arg + \" for \" + name + \" argument when connecting component \" + options.wrappedComponentName + \".\");\n };\n}\n\nfunction strictEqual(a, b) {\n return a === b;\n} // createConnect with default args builds the 'official' connect behavior. Calling it with\n// different options opens up some testing and extensibility scenarios\n\n\nexport function createConnect(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n _ref$connectHOC = _ref.connectHOC,\n connectHOC = _ref$connectHOC === void 0 ? connectAdvanced : _ref$connectHOC,\n _ref$mapStateToPropsF = _ref.mapStateToPropsFactories,\n mapStateToPropsFactories = _ref$mapStateToPropsF === void 0 ? defaultMapStateToPropsFactories : _ref$mapStateToPropsF,\n _ref$mapDispatchToPro = _ref.mapDispatchToPropsFactories,\n mapDispatchToPropsFactories = _ref$mapDispatchToPro === void 0 ? defaultMapDispatchToPropsFactories : _ref$mapDispatchToPro,\n _ref$mergePropsFactor = _ref.mergePropsFactories,\n mergePropsFactories = _ref$mergePropsFactor === void 0 ? defaultMergePropsFactories : _ref$mergePropsFactor,\n _ref$selectorFactory = _ref.selectorFactory,\n selectorFactory = _ref$selectorFactory === void 0 ? defaultSelectorFactory : _ref$selectorFactory;\n\n return function connect(mapStateToProps, mapDispatchToProps, mergeProps, _ref2) {\n if (_ref2 === void 0) {\n _ref2 = {};\n }\n\n var _ref3 = _ref2,\n _ref3$pure = _ref3.pure,\n pure = _ref3$pure === void 0 ? true : _ref3$pure,\n _ref3$areStatesEqual = _ref3.areStatesEqual,\n areStatesEqual = _ref3$areStatesEqual === void 0 ? strictEqual : _ref3$areStatesEqual,\n _ref3$areOwnPropsEqua = _ref3.areOwnPropsEqual,\n areOwnPropsEqual = _ref3$areOwnPropsEqua === void 0 ? shallowEqual : _ref3$areOwnPropsEqua,\n _ref3$areStatePropsEq = _ref3.areStatePropsEqual,\n areStatePropsEqual = _ref3$areStatePropsEq === void 0 ? shallowEqual : _ref3$areStatePropsEq,\n _ref3$areMergedPropsE = _ref3.areMergedPropsEqual,\n areMergedPropsEqual = _ref3$areMergedPropsE === void 0 ? shallowEqual : _ref3$areMergedPropsE,\n extraOptions = _objectWithoutPropertiesLoose(_ref3, _excluded);\n\n var initMapStateToProps = match(mapStateToProps, mapStateToPropsFactories, 'mapStateToProps');\n var initMapDispatchToProps = match(mapDispatchToProps, mapDispatchToPropsFactories, 'mapDispatchToProps');\n var initMergeProps = match(mergeProps, mergePropsFactories, 'mergeProps');\n return connectHOC(selectorFactory, _extends({\n // used in error messages\n methodName: 'connect',\n // used to compute Connect's displayName from the wrapped component's displayName.\n getDisplayName: function getDisplayName(name) {\n return \"Connect(\" + name + \")\";\n },\n // if mapStateToProps is falsy, the Connect component doesn't subscribe to store state changes\n shouldHandleStateChanges: Boolean(mapStateToProps),\n // passed through to selectorFactory\n initMapStateToProps: initMapStateToProps,\n initMapDispatchToProps: initMapDispatchToProps,\n initMergeProps: initMergeProps,\n pure: pure,\n areStatesEqual: areStatesEqual,\n areOwnPropsEqual: areOwnPropsEqual,\n areStatePropsEqual: areStatePropsEqual,\n areMergedPropsEqual: areMergedPropsEqual\n }, extraOptions));\n };\n}\nexport default /*#__PURE__*/createConnect();","import * as React from 'react';\nimport type { SVGProps } from 'react';\nexport const SvgLeftArrow2 = (props: SVGProps<SVGSVGElement>) => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 91 51\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n fill=\"currentColor\"\n d=\"M30.256 48.614a3.14 3.14 0 0 0-.989-2.153L10.803 29.063h76.915a3.2 3.2 0 0 0 .315 0c1.584-.084 2.95-1.64 2.867-3.266-.082-1.625-1.598-3.028-3.182-2.943H10.803L29.267 5.49c1.284-1.099 1.456-3.057.385-4.373a2.972 2.972 0 0 0-4.48-.187L.971 23.695a3.163 3.163 0 0 0 0 4.56l24.2 22.766a2.98 2.98 0 0 0 2.205.84c1.669-.08 2.958-1.534 2.88-3.247Z\"\n />\n </svg>\n);\n","import * as React from 'react';\nimport type { SVGProps } from 'react';\nexport const SvgArrowDown = (props: SVGProps<SVGSVGElement>) => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n d=\"m9 16.172-6.071-6.071-1.414 1.414L10 20l.707-.707 7.778-7.778-1.414-1.414L11 16.172V0H9z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","import * as React from 'react';\nimport type { SVGProps } from 'react';\nexport const SvgArrowUp = (props: SVGProps<SVGSVGElement>) => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n d=\"M9 3.828 2.929 9.899 1.515 8.485 10 0l.707.707 7.778 7.778-1.414 1.414L11 3.828V20H9V3.828z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","import * as React from 'react';\nimport type { SVGProps } from 'react';\nexport const SvgArrowButtonDown1 = (props: SVGProps<SVGSVGElement>) => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n d=\"M12 13.584a2.643 2.643 0 0 1-1.875-.775L.584 3.268a1.768 1.768 0 0 1 2.5-2.5l8.739 8.739a.25.25 0 0 0 .354 0L20.916.768a1.768 1.768 0 0 1 2.5 2.5l-9.541 9.541a2.643 2.643 0 0 1-1.875.775Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M12 23.75a2.643 2.643 0 0 1-1.875-.775L.584 13.434a1.768 1.768 0 0 1 2.5-2.5l8.739 8.739a.25.25 0 0 0 .354 0l8.739-8.739a1.768 1.768 0 0 1 2.5 2.5l-9.541 9.541A2.643 2.643 0 0 1 12 23.75Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","import * as React from 'react';\nimport type { SVGProps } from 'react';\nexport const SvgArrowButtonRight1 = (props: SVGProps<SVGSVGElement>) => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n d=\"M13.584 12a2.643 2.643 0 0 1-.775 1.875l-9.541 9.541a1.768 1.768 0 0 1-2.5-2.5l8.739-8.739a.25.25 0 0 0 0-.354L.768 3.084a1.768 1.768 0 0 1 2.5-2.5l9.541 9.541A2.643 2.643 0 0 1 13.584 12Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M23.75 12a2.643 2.643 0 0 1-.775 1.875l-9.541 9.541a1.768 1.768 0 0 1-2.5-2.5l8.739-8.739a.25.25 0 0 0 0-.354l-8.739-8.739a1.768 1.768 0 0 1 2.5-2.5l9.541 9.541A2.643 2.643 0 0 1 23.75 12Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","import * as React from 'react';\nimport type { SVGProps } from 'react';\nexport const SvgArrowButtonUp1 = (props: SVGProps<SVGSVGElement>) => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n d=\"M12 10.416a2.643 2.643 0 0 1 1.875.775l9.541 9.541a1.768 1.768 0 0 1-2.5 2.5l-8.739-8.739a.25.25 0 0 0-.354 0l-8.739 8.739a1.768 1.768 0 0 1-2.5-2.5l9.541-9.541A2.643 2.643 0 0 1 12 10.416Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M12 .25a2.643 2.643 0 0 1 1.875.775l9.541 9.541a1.768 1.768 0 0 1-2.5 2.5l-8.739-8.739a.25.25 0 0 0-.354 0l-8.739 8.739a1.768 1.768 0 0 1-2.5-2.5l9.541-9.541A2.643 2.643 0 0 1 12 .25Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","import * as React from 'react';\nimport type { SVGProps } from 'react';\nexport const SvgArrowsExpand3 = (props: SVGProps<SVGSVGElement>) => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n fill=\"currentColor\"\n d=\"M19.611 2.571h-3.754a1.286 1.286 0 1 1 0-2.571h6.857A1.286 1.286 0 0 1 24 1.286v6.857a1.286 1.286 0 0 1-2.571 0V4.39L15.48 10.34a1.286 1.286 0 0 1-1.817-1.817l5.948-5.95ZM1.286 14.571a1.286 1.286 0 0 1 1.285 1.286v3.754l5.949-5.946a1.286 1.286 0 0 1 1.817 1.817L4.39 21.429h3.753a1.285 1.285 0 1 1 0 2.571H1.286A1.286 1.286 0 0 1 0 22.714v-6.857a1.286 1.286 0 0 1 1.286-1.286Z\"\n />\n </svg>\n);\n","import * as React from 'react';\nimport type { SVGProps } from 'react';\nexport const SvgArrowsShrink3 = (props: SVGProps<SVGSVGElement>) => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n fill=\"currentColor\"\n d=\"M14.143 1.714A1.286 1.286 0 0 1 15.429 3v3.753L21.806.377a1.286 1.286 0 0 1 1.817 1.817l-6.376 6.377H21a1.286 1.286 0 1 1 0 2.572h-6.857a1.286 1.286 0 0 1-1.286-1.286V3a1.286 1.286 0 0 1 1.286-1.286ZM9.857 22.286A1.285 1.285 0 0 1 8.571 21v-3.753l-6.377 6.376a1.286 1.286 0 0 1-1.817-1.817l6.376-6.377H3a1.286 1.286 0 0 1 0-2.572h6.857a1.286 1.286 0 0 1 1.286 1.286V21a1.286 1.286 0 0 1-1.286 1.286Z\"\n />\n </svg>\n);\n","import * as React from 'react';\nimport type { SVGProps } from 'react';\nexport const SvgCustomNotesPaper = (props: SVGProps<SVGSVGElement>) => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 19 24\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n fill=\"currentColor\"\n d=\"M17 24H2a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2h9a1 1 0 0 1 .707.293l7 7A1 1 0 0 1 19 8v14a2 2 0 0 1-2 2ZM2 21.5a.5.5 0 0 0 .5.5h14a.5.5 0 0 0 .5-.5V9a.5.5 0 0 0-.5-.5h-4a2 2 0 0 1-2-2v-4A.5.5 0 0 0 10 2H2.5a.5.5 0 0 0-.5.5v19Z\"\n />\n </svg>\n);\n","import * as React from 'react';\nimport type { SVGProps } from 'react';\nexport const SvgDownloadThickBottom = (props: SVGProps<SVGSVGElement>) => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n d=\"M8.616 1.741A1.455 1.455 0 0 1 10.07.287h3.392a1.455 1.455 0 0 1 1.453 1.454v8.228a.25.25 0 0 0 .25.25h2.9a1.138 1.138 0 0 1 .827 2l-6.1 6.1a1.489 1.489 0 0 1-2.056 0l-6.1-6.1a1.137 1.137 0 0 1 .827-2h2.9a.249.249 0 0 0 .25-.25Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M0 19.677a4.039 4.039 0 0 0 4.035 4.035h15.93A4.039 4.039 0 0 0 24 19.677V17.8a1.225 1.225 0 0 0-2.449 0v1.874a1.588 1.588 0 0 1-1.586 1.586H4.035a1.588 1.588 0 0 1-1.586-1.586V17.8A1.225 1.225 0 0 0 0 17.8Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","import * as React from 'react';\nimport type { SVGProps } from 'react';\nexport const SvgHyperlink2 = (props: SVGProps<SVGSVGElement>) => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n d=\"M12.406 14.905a1 1 0 0 0-.543 1.307 1 1 0 0 1-.217 1.09l-2.828 2.829a2 2 0 0 1-2.828 0L3.868 18.01a2 2 0 0 1 0-2.829L6.7 12.353a1.013 1.013 0 0 1 1.091-.217 1 1 0 0 0 .763-1.849 3.034 3.034 0 0 0-3.268.652l-2.832 2.828a4.006 4.006 0 0 0 0 5.657l2.122 2.121a4 4 0 0 0 5.656 0l2.829-2.828a3.008 3.008 0 0 0 .651-3.27 1 1 0 0 0-1.306-.542Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M7.757 16.241a1.011 1.011 0 0 0 1.414 0l7.779-7.778a1 1 0 0 0-1.414-1.414l-7.779 7.778a1 1 0 0 0 0 1.414Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"m21.546 4.574-2.121-2.121a4.006 4.006 0 0 0-5.657 0l-2.829 2.828a3.006 3.006 0 0 0-.651 3.269 1 1 0 1 0 1.849-.764 1 1 0 0 1 .217-1.086l2.828-2.828a2 2 0 0 1 2.829 0l2.121 2.121a2 2 0 0 1 0 2.829L17.3 11.645a1.015 1.015 0 0 1-1.091.217 1 1 0 0 0-.765 1.849 3.026 3.026 0 0 0 3.27-.651l2.828-2.828a4.007 4.007 0 0 0 .004-5.658Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","import * as React from 'react';\nimport type { SVGProps } from 'react';\nexport const SvgPencil1 = (props: SVGProps<SVGSVGElement>) => (\n <svg\n {...props}\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n style={{\n color: 'inherit',\n ...props.style,\n }}\n >\n <path\n d=\"M15.067 3.986a.5.5 0 0 0-.354-.148.5.5 0 0 0-.354.147L3.437 14.91a.5.5 0 0 0 0 .707l4.948 4.948a.5.5 0 0 0 .707 0L20.009 9.648a.5.5 0 0 0 0-.706ZM2.43 16.8a.5.5 0 0 0-.489-.127.5.5 0 0 0-.351.364L.084 23.314a.5.5 0 0 0 .133.47.507.507 0 0 0 .47.132l6.272-1.5a.5.5 0 0 0 .237-.84ZM23.2 2.924 21.077.8a2.5 2.5 0 0 0-3.532 0l-1.418 1.417a.5.5 0 0 0 0 .707l4.95 4.949a.5.5 0 0 0 .707 0L23.2 6.454a2.5 2.5 0 0 0 0-3.53Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","// @ts-strict-ignore\nimport { useRef, useCallback } from 'react';\n\nexport function useResizeObserver(\n func: (contentRect: DOMRectReadOnly) => void,\n): (el: unknown) => void {\n const observer = useRef(null);\n if (!observer.current) {\n observer.current = new ResizeObserver(entries => {\n func(entries[0].contentRect);\n });\n }\n\n const elementRef = useCallback(el => {\n observer.current.disconnect();\n if (el) {\n observer.current.observe(el, { box: 'border-box' });\n }\n }, []);\n\n return elementRef;\n}\n","// @ts-strict-ignore\nimport { type CSSProperties, useState } from 'react';\n\nimport * as monthUtils from 'loot-core/src/shared/months';\n\nimport { useResizeObserver } from '../../hooks/useResizeObserver';\nimport { styles, theme } from '../../style';\nimport { View } from '../common/View';\n\nimport { type BoundsProps } from './MonthsContext';\n\ntype MonthPickerProps = {\n startMonth: string;\n numDisplayed: number;\n monthBounds: BoundsProps;\n style: CSSProperties;\n onSelect: (month: string) => void;\n};\n\nexport const MonthPicker = ({\n startMonth,\n numDisplayed,\n monthBounds,\n style,\n onSelect,\n}: MonthPickerProps) => {\n const [hoverId, setHoverId] = useState(null);\n const [targetMonthCount, setTargetMonthCount] = useState(12);\n\n const currentMonth = monthUtils.currentMonth();\n const firstSelectedMonth = startMonth;\n\n const lastSelectedMonth = monthUtils.addMonths(\n firstSelectedMonth,\n numDisplayed - 1,\n );\n\n const range = monthUtils.rangeInclusive(\n monthUtils.subMonths(\n firstSelectedMonth,\n targetMonthCount / 2 - numDisplayed / 2,\n ),\n monthUtils.addMonths(\n lastSelectedMonth,\n targetMonthCount / 2 - numDisplayed / 2,\n ),\n );\n\n const firstSelectedIndex =\n Math.floor(range.length / 2) - Math.floor(numDisplayed / 2);\n const lastSelectedIndex = firstSelectedIndex + numDisplayed - 1;\n\n const [size, setSize] = useState('small');\n const containerRef = useResizeObserver(rect => {\n setSize(rect.width <= 400 ? 'small' : 'big');\n setTargetMonthCount(\n Math.min(Math.max(Math.floor(rect.width / 50), 12), 24),\n );\n });\n\n const yearHeadersShown = [];\n\n return (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n ...style,\n }}\n >\n <View\n innerRef={containerRef}\n style={{\n flexDirection: 'row',\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n {range.map((month, idx) => {\n const monthName = monthUtils.format(month, 'MMM');\n const selected =\n idx >= firstSelectedIndex && idx <= lastSelectedIndex;\n\n const lastHoverId = hoverId + numDisplayed - 1;\n const hovered =\n hoverId === null ? false : idx >= hoverId && idx <= lastHoverId;\n\n const current = currentMonth === month;\n const year = monthUtils.getYear(month);\n\n let showYearHeader = false;\n\n if (!yearHeadersShown.includes(year)) {\n yearHeadersShown.push(year);\n showYearHeader = true;\n }\n\n const isMonthBudgeted =\n month >= monthBounds.start && month <= monthBounds.end;\n\n return (\n <View\n key={month}\n style={{\n padding: '3px 3px',\n width: size === 'big' ? '35px' : '20px',\n textAlign: 'center',\n userSelect: 'none',\n cursor: 'default',\n borderRadius: 2,\n border: 'none',\n ...(!isMonthBudgeted && {\n textDecoration: 'line-through',\n color: theme.pageTextSubdued,\n }),\n ...styles.smallText,\n ...(selected && {\n backgroundColor: theme.tableBorderHover,\n color: theme.buttonPrimaryText,\n }),\n ...((hovered || selected) && {\n borderRadius: 0,\n cursor: 'pointer',\n }),\n ...(hovered &&\n !selected && {\n backgroundColor: theme.buttonBareBackgroundHover,\n }),\n ...(hovered &&\n selected && {\n backgroundColor: theme.tableBorderHover,\n }),\n ...((idx === firstSelectedIndex ||\n (idx === hoverId && !selected)) && {\n borderTopLeftRadius: 2,\n borderBottomLeftRadius: 2,\n }),\n ...((idx === lastSelectedIndex ||\n (idx === lastHoverId && !selected)) && {\n borderTopRightRadius: 2,\n borderBottomRightRadius: 2,\n }),\n ...(current && { fontWeight: 'bold' }),\n }}\n onClick={() => onSelect(month)}\n onMouseEnter={() => setHoverId(idx)}\n onMouseLeave={() => setHoverId(null)}\n >\n {size === 'small' ? monthName[0] : monthName}\n {showYearHeader && (\n <View\n style={{\n position: 'absolute',\n top: -14,\n left: 0,\n fontSize: 10,\n fontWeight: 'bold',\n color: isMonthBudgeted\n ? theme.pageText\n : theme.pageTextSubdued,\n }}\n >\n {year}\n </View>\n )}\n </View>\n );\n })}\n </View>\n </View>\n );\n};\n","// @ts-strict-ignore\nimport React, { type ComponentProps, memo } from 'react';\n\nimport * as monthUtils from 'loot-core/src/shared/months';\n\nimport { View } from '../common/View';\n\nimport { MonthPicker } from './MonthPicker';\nimport { getScrollbarWidth } from './util';\n\ntype BudgetPageHeaderProps = {\n startMonth: string;\n onMonthSelect: (month: string) => void;\n numMonths: number;\n monthBounds: ComponentProps<typeof MonthPicker>['monthBounds'];\n};\n\nexport const BudgetPageHeader = memo<BudgetPageHeaderProps>(\n ({ startMonth, onMonthSelect, numMonths, monthBounds }) => {\n function getValidMonth(month) {\n const start = monthBounds.start;\n const end = monthUtils.subMonths(monthBounds.end, numMonths - 1);\n\n if (month < start) {\n return start;\n } else if (month > end) {\n return end;\n }\n return month;\n }\n\n return (\n <View style={{ marginLeft: 200 + 5, flexShrink: 0 }}>\n <View style={{ marginRight: 5 + getScrollbarWidth() }}>\n <MonthPicker\n startMonth={startMonth}\n numDisplayed={numMonths}\n monthBounds={monthBounds}\n style={{ paddingTop: 5 }}\n onSelect={month => onMonthSelect(getValidMonth(month))}\n />\n </View>\n </View>\n );\n },\n);\n\nBudgetPageHeader.displayName = 'BudgetPageHeader';\n","// @ts-strict-ignore\nimport React, {\n useContext,\n type CSSProperties,\n type ComponentType,\n} from 'react';\n\nimport * as monthUtils from 'loot-core/src/shared/months';\n\nimport { theme } from '../../style';\nimport { View } from '../common/View';\nimport { NamespaceContext } from '../spreadsheet/NamespaceContext';\n\nimport { MonthsContext } from './MonthsContext';\n\ntype RenderMonthsProps = {\n component?: ComponentType<{ monthIndex: number; editing: boolean }>;\n editingIndex?: string | number;\n args?: object;\n style?: CSSProperties;\n};\n\nexport function RenderMonths({\n component: Component,\n editingIndex,\n args,\n style,\n}: RenderMonthsProps) {\n const { months } = useContext(MonthsContext);\n\n return months.map((month, index) => {\n const editing = editingIndex === index;\n\n return (\n <NamespaceContext.Provider\n key={index}\n value={monthUtils.sheetForMonth(month)}\n >\n <View\n style={{\n flex: 1,\n borderLeft: '1px solid ' + theme.tableBorder,\n ...style,\n }}\n >\n <Component monthIndex={index} editing={editing} {...args} />\n </View>\n </NamespaceContext.Provider>\n );\n }) as unknown as JSX.Element;\n}\n","// @ts-strict-ignore\nimport React, { useState } from 'react';\n\nimport { useLiveQuery } from 'loot-core/src/client/query-hooks';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport { q } from 'loot-core/src/shared/query';\n\nimport { SvgCustomNotesPaper } from '../icons/v2';\nimport { type CSSProperties, theme } from '../style';\n\nimport { Button } from './common/Button';\nimport { View } from './common/View';\nimport { Notes } from './Notes';\nimport { Tooltip, type TooltipPosition, useTooltip } from './tooltips';\n\ntype NotesTooltipProps = {\n editable?: boolean;\n defaultNotes?: string;\n position?: TooltipPosition;\n onClose?: (notes: string) => void;\n};\nfunction NotesTooltip({\n editable,\n defaultNotes,\n position = 'bottom-left',\n onClose,\n}: NotesTooltipProps) {\n const [notes, setNotes] = useState<string>(defaultNotes);\n return (\n <Tooltip position={position} onClose={() => onClose(notes)}>\n <Notes\n notes={notes}\n editable={editable}\n focused={editable}\n onChange={setNotes}\n />\n </Tooltip>\n );\n}\n\ntype NotesButtonProps = {\n id: string;\n width?: number;\n height?: number;\n defaultColor?: string;\n tooltipPosition?: TooltipPosition;\n style?: CSSProperties;\n};\nexport function NotesButton({\n id,\n width = 12,\n height = 12,\n defaultColor = theme.buttonNormalText,\n tooltipPosition,\n style,\n}: NotesButtonProps) {\n const [hover, setHover] = useState(false);\n const tooltip = useTooltip();\n const data = useLiveQuery(() => q('notes').filter({ id }).select('*'), [id]);\n const note = data && data.length > 0 ? data[0].note : null;\n const hasNotes = note && note !== '';\n\n function onClose(notes) {\n send('notes-save', { id, note: notes });\n tooltip.close();\n }\n\n const [delayHandler, setDelayHandler] = useState(null);\n\n const handleMouseEnter = () => {\n setDelayHandler(\n setTimeout(() => {\n setHover(true);\n }, 300),\n );\n };\n\n const handleMouseLeave = () => {\n clearTimeout(delayHandler);\n setHover(false);\n };\n\n // This account for both the tooltip hover, and editing tooltip\n const tooltipOpen = tooltip.isOpen || (hasNotes && hover);\n\n return (\n <View\n style={{ flexShrink: 0 }}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <Button\n type=\"bare\"\n aria-label=\"View notes\"\n className={!hasNotes && !tooltipOpen ? 'hover-visible' : ''}\n style={{\n color: defaultColor,\n ...style,\n ...(hasNotes && { display: 'flex !important' }),\n ...(tooltipOpen && { color: theme.buttonNormalText }),\n }}\n {...tooltip.getOpenEvents()}\n >\n <SvgCustomNotesPaper style={{ width, height }} />\n </Button>\n {tooltipOpen && (\n <NotesTooltip\n editable={tooltip.isOpen}\n defaultNotes={note}\n position={tooltipPosition}\n onClose={onClose}\n />\n )}\n </View>\n );\n}\n","// @ts-strict-ignore\nimport React, { type CSSProperties, type Ref, useState } from 'react';\n\nimport { type CategoryEntity } from 'loot-core/src/types/models';\n\nimport { SvgCheveronDown } from '../../icons/v1';\nimport { theme } from '../../style';\nimport { Button } from '../common/Button';\nimport { Menu } from '../common/Menu';\nimport { View } from '../common/View';\nimport { NotesButton } from '../NotesButton';\nimport { InputCell } from '../table';\nimport { Tooltip } from '../tooltips';\n\ntype SidebarCategoryProps = {\n innerRef: Ref<HTMLDivElement>;\n category: CategoryEntity;\n dragPreview?: boolean;\n dragging?: boolean;\n editing: boolean;\n style?: CSSProperties;\n borderColor?: string;\n isLast?: boolean;\n onEditName: (id: string) => void;\n onSave: (group) => void;\n onDelete: (id: string) => Promise<void>;\n onHideNewCategory?: () => void;\n};\n\nexport function SidebarCategory({\n innerRef,\n category,\n dragPreview,\n dragging,\n editing,\n style,\n isLast,\n onEditName,\n onSave,\n onDelete,\n onHideNewCategory,\n}: SidebarCategoryProps) {\n const temporary = category.id === 'new';\n const [menuOpen, setMenuOpen] = useState(false);\n\n const displayed = (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n userSelect: 'none',\n WebkitUserSelect: 'none',\n opacity: category.hidden ? 0.33 : undefined,\n }}\n >\n <div\n data-testid=\"category-name\"\n style={{\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n minWidth: 0,\n }}\n >\n {category.name}\n </div>\n <View style={{ flexShrink: 0, marginLeft: 5 }}>\n <Button\n type=\"bare\"\n className=\"hover-visible\"\n onClick={e => {\n e.stopPropagation();\n setMenuOpen(true);\n }}\n style={{ color: 'currentColor', padding: 3 }}\n >\n <SvgCheveronDown\n width={14}\n height={14}\n style={{ color: 'currentColor' }}\n />\n </Button>\n {menuOpen && (\n <Tooltip\n position=\"bottom-left\"\n width={200}\n style={{ padding: 0 }}\n onClose={() => setMenuOpen(false)}\n >\n <Menu\n onMenuSelect={type => {\n if (type === 'rename') {\n onEditName(category.id);\n } else if (type === 'delete') {\n onDelete(category.id);\n } else if (type === 'toggle-visibility') {\n onSave({ ...category, hidden: !category.hidden });\n }\n setMenuOpen(false);\n }}\n items={[\n {\n name: 'toggle-visibility',\n text: category.hidden ? 'Show' : 'Hide',\n },\n { name: 'rename', text: 'Rename' },\n { name: 'delete', text: 'Delete' },\n ]}\n />\n </Tooltip>\n )}\n </View>\n <View style={{ flex: 1 }} />\n <NotesButton\n id={category.id}\n style={dragging && { color: 'currentColor' }}\n defaultColor={theme.pageTextLight}\n />\n </View>\n );\n\n return (\n <View\n innerRef={innerRef}\n style={{\n width: 200,\n overflow: 'hidden',\n '& .hover-visible': {\n display: 'none',\n },\n ...(!dragging &&\n !dragPreview && {\n '&:hover .hover-visible': {\n display: 'flex',\n },\n }),\n ...(dragging && { color: theme.formInputTextPlaceholderSelected }),\n // The zIndex here forces the the view on top of a row below\n // it that may be \"collapsed\" and show a border on top\n ...(dragPreview && {\n backgroundColor: theme.tableBackground,\n zIndex: 10000,\n borderRadius: 6,\n overflow: 'hidden',\n }),\n ...style,\n }}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n onEditName(null);\n e.stopPropagation();\n }\n }}\n >\n <InputCell\n value={category.name}\n formatter={() => displayed}\n width=\"flex\"\n exposed={editing || temporary}\n onUpdate={value => {\n if (temporary) {\n if (value === '') {\n onHideNewCategory();\n } else if (value !== '') {\n onSave({ ...category, name: value });\n }\n } else {\n if (value !== category.name) {\n onSave({ ...category, name: value });\n }\n }\n }}\n onBlur={() => onEditName(null)}\n style={{ paddingLeft: 13, ...(isLast && { borderBottomWidth: 0 }) }}\n inputProps={{\n placeholder: temporary ? 'New Category Name' : '',\n }}\n />\n </View>\n );\n}\n","// @ts-strict-ignore\nimport React, { type ComponentProps } from 'react';\n\nimport { type CategoryEntity } from 'loot-core/src/types/models';\n\nimport { theme } from '../../style';\nimport { View } from '../common/View';\nimport {\n useDraggable,\n useDroppable,\n DropHighlight,\n type DragState,\n type OnDragChangeCallback,\n type OnDropCallback,\n} from '../sort';\nimport { Row } from '../table';\n\nimport { RenderMonths } from './RenderMonths';\nimport { SidebarCategory } from './SidebarCategory';\n\ntype ExpenseCategoryProps = {\n cat: CategoryEntity;\n editingCell: { id: string; cell: string } | null;\n dragState: DragState<CategoryEntity>;\n MonthComponent: ComponentProps<typeof RenderMonths>['component'];\n onEditName?: ComponentProps<typeof SidebarCategory>['onEditName'];\n onEditMonth?: (id: string, monthIndex: number) => void;\n onSave?: ComponentProps<typeof SidebarCategory>['onSave'];\n onDelete?: ComponentProps<typeof SidebarCategory>['onDelete'];\n onDragChange: OnDragChangeCallback<CategoryEntity>;\n onBudgetAction: (idx: number, action: string, arg: unknown) => void;\n onShowActivity: (name: string, id: string, idx: number) => void;\n onReorder: OnDropCallback;\n};\n\nexport function ExpenseCategory({\n cat,\n editingCell,\n dragState,\n MonthComponent,\n onEditName,\n onEditMonth,\n onSave,\n onDelete,\n onBudgetAction,\n onShowActivity,\n onDragChange,\n onReorder,\n}: ExpenseCategoryProps) {\n let dragging = dragState && dragState.item === cat;\n\n if (dragState && dragState.item.id === cat.cat_group) {\n dragging = true;\n }\n\n const { dragRef } = useDraggable({\n type: 'category',\n onDragChange,\n item: cat,\n canDrag: editingCell === null,\n });\n\n const { dropRef, dropPos } = useDroppable({\n types: 'category',\n id: cat.id,\n onDrop: onReorder,\n });\n\n return (\n <Row\n innerRef={dropRef}\n collapsed={true}\n style={{\n backgroundColor: theme.tableBackground,\n opacity: cat.hidden ? 0.5 : undefined,\n }}\n >\n <DropHighlight pos={dropPos} offset={{ top: 1 }} />\n\n <View style={{ flex: 1, flexDirection: 'row' }}>\n <SidebarCategory\n innerRef={dragRef}\n category={cat}\n dragPreview={dragging && dragState.preview}\n dragging={dragging && !dragState.preview}\n editing={\n editingCell &&\n editingCell.cell === 'name' &&\n editingCell.id === cat.id\n }\n onEditName={onEditName}\n onSave={onSave}\n onDelete={onDelete}\n />\n\n <RenderMonths\n component={MonthComponent}\n editingIndex={\n editingCell && editingCell.id === cat.id && editingCell.cell\n }\n args={{\n category: cat,\n onEdit: onEditMonth,\n onBudgetAction,\n onShowActivity,\n }}\n />\n </View>\n </Row>\n );\n}\n","// @ts-strict-ignore\nimport React, { type CSSProperties, useState } from 'react';\nimport { type ConnectDragSource } from 'react-dnd';\n\nimport { SvgExpandArrow } from '../../icons/v0';\nimport { SvgCheveronDown } from '../../icons/v1';\nimport { theme } from '../../style';\nimport { Button } from '../common/Button';\nimport { Menu } from '../common/Menu';\nimport { Text } from '../common/Text';\nimport { View } from '../common/View';\nimport { NotesButton } from '../NotesButton';\nimport { InputCell } from '../table';\nimport { Tooltip } from '../tooltips';\n\ntype SidebarGroupProps = {\n group: {\n id: string;\n hidden: number;\n categories: object[];\n is_income: number;\n name: string;\n sort_order: number;\n tombstone: number;\n };\n editing?: boolean;\n collapsed: boolean;\n dragPreview?: boolean;\n innerRef?: ConnectDragSource;\n style?: CSSProperties;\n onEdit?: (id: string) => void;\n onSave?: (group: object) => Promise<void>;\n onDelete?: (id: string) => Promise<void>;\n onShowNewCategory?: (groupId: string) => void;\n onHideNewGroup?: () => void;\n onToggleCollapse?: (id: string) => void;\n};\n\nexport function SidebarGroup({\n group,\n editing,\n collapsed,\n dragPreview,\n innerRef,\n style,\n onEdit,\n onSave,\n onDelete,\n onShowNewCategory,\n onHideNewGroup,\n onToggleCollapse,\n}: SidebarGroupProps) {\n const temporary = group.id === 'new';\n const [menuOpen, setMenuOpen] = useState(false);\n\n const displayed = (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n userSelect: 'none',\n WebkitUserSelect: 'none',\n }}\n onClick={() => {\n onToggleCollapse(group.id);\n }}\n >\n {!dragPreview && (\n <SvgExpandArrow\n width={8}\n height={8}\n style={{\n marginRight: 5,\n marginLeft: 5,\n flexShrink: 0,\n transition: 'transform .1s',\n transform: collapsed ? 'rotate(-90deg)' : '',\n }}\n />\n )}\n <div\n style={{\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n minWidth: 0,\n }}\n >\n {dragPreview && <Text style={{ fontWeight: 500 }}>Group: </Text>}\n {group.name}\n </div>\n {!dragPreview && (\n <>\n <View style={{ marginLeft: 5, flexShrink: 0 }}>\n <Button\n type=\"bare\"\n className=\"hover-visible\"\n onClick={e => {\n e.stopPropagation();\n setMenuOpen(true);\n }}\n style={{ padding: 3 }}\n >\n <SvgCheveronDown width={14} height={14} />\n </Button>\n {menuOpen && (\n <Tooltip\n position=\"bottom-left\"\n width={200}\n style={{ padding: 0 }}\n onClose={() => setMenuOpen(false)}\n >\n <Menu\n onMenuSelect={type => {\n if (type === 'rename') {\n onEdit(group.id);\n } else if (type === 'add-category') {\n onShowNewCategory(group.id);\n } else if (type === 'delete') {\n onDelete(group.id);\n } else if (type === 'toggle-visibility') {\n onSave({ ...group, hidden: !group.hidden });\n }\n setMenuOpen(false);\n }}\n items={[\n { name: 'add-category', text: 'Add category' },\n {\n name: 'toggle-visibility',\n text: group.hidden ? 'Show' : 'Hide',\n },\n { name: 'rename', text: 'Rename' },\n onDelete && { name: 'delete', text: 'Delete' },\n ]}\n />\n </Tooltip>\n )}\n </View>\n <View style={{ flex: 1 }} />\n <NotesButton\n id={group.id}\n style={dragPreview && { color: 'currentColor' }}\n defaultColor={theme.pageTextLight}\n />\n </>\n )}\n </View>\n );\n\n return (\n <View\n innerRef={innerRef}\n style={{\n ...style,\n width: 200,\n backgroundColor: theme.tableRowHeaderBackground,\n overflow: 'hidden',\n '& .hover-visible': {\n display: 'none',\n },\n ...(!dragPreview && {\n '&:hover .hover-visible': {\n display: 'flex',\n },\n }),\n ...(dragPreview && {\n paddingLeft: 10,\n zIndex: 10000,\n borderRadius: 6,\n overflow: 'hidden',\n }),\n }}\n onKeyDown={e => {\n if (e.key === 'Enter') {\n onEdit(null);\n e.stopPropagation();\n }\n }}\n >\n <InputCell\n value={group.name}\n formatter={() => displayed}\n width=\"flex\"\n exposed={editing}\n onUpdate={value => {\n if (temporary) {\n if (value === '') {\n onHideNewGroup();\n } else if (value !== '') {\n onSave({ id: group.id, name: value });\n }\n } else {\n onSave({ id: group.id, name: value });\n }\n }}\n onBlur={() => onEdit(null)}\n style={{ fontWeight: 600 }}\n inputProps={{\n style: { marginLeft: 20 },\n placeholder: temporary ? 'New Group Name' : '',\n }}\n />\n </View>\n );\n}\n","// @ts-strict-ignore\nimport React, { type ComponentProps } from 'react';\n\nimport { theme } from '../../style';\nimport { View } from '../common/View';\nimport {\n useDraggable,\n useDroppable,\n DropHighlight,\n type OnDragChangeCallback,\n type OnDropCallback,\n type DragState,\n} from '../sort';\nimport { Row, ROW_HEIGHT } from '../table';\n\nimport { RenderMonths } from './RenderMonths';\nimport { SidebarGroup } from './SidebarGroup';\n\ntype ExpenseGroupProps = {\n group: ComponentProps<typeof SidebarGroup>['group'];\n collapsed: boolean;\n editingCell: { id: string; cell: string } | null;\n dragState: DragState<ComponentProps<typeof SidebarGroup>['group']>;\n MonthComponent: ComponentProps<typeof RenderMonths>['component'];\n onEditName?: ComponentProps<typeof SidebarGroup>['onEdit'];\n onSave?: ComponentProps<typeof SidebarGroup>['onSave'];\n onDelete?: ComponentProps<typeof SidebarGroup>['onDelete'];\n onDragChange: OnDragChangeCallback<\n ComponentProps<typeof SidebarGroup>['group']\n >;\n onReorderGroup: OnDropCallback;\n onReorderCategory: OnDropCallback;\n onToggleCollapse?: ComponentProps<typeof SidebarGroup>['onToggleCollapse'];\n onShowNewCategory?: ComponentProps<typeof SidebarGroup>['onShowNewCategory'];\n};\n\nexport function ExpenseGroup({\n group,\n collapsed,\n editingCell,\n dragState,\n MonthComponent,\n onEditName,\n onSave,\n onDelete,\n onDragChange,\n onReorderGroup,\n onReorderCategory,\n onToggleCollapse,\n onShowNewCategory,\n}: ExpenseGroupProps) {\n const dragging = dragState && dragState.item === group;\n\n const { dragRef } = useDraggable({\n type: 'group',\n onDragChange,\n item: group,\n canDrag: editingCell === null,\n });\n\n const { dropRef, dropPos } = useDroppable({\n types: 'group',\n id: group.id,\n onDrop: onReorderGroup,\n });\n\n const { dropRef: catDropRef, dropPos: catDropPos } = useDroppable({\n types: 'category',\n id: group.id,\n onDrop: onReorderCategory,\n onLongHover: () => {\n if (collapsed) {\n onToggleCollapse(group.id);\n }\n },\n });\n\n return (\n <Row\n collapsed={true}\n style={{\n fontWeight: 600,\n opacity: group.hidden ? 0.33 : undefined,\n backgroundColor: theme.tableRowHeaderBackground,\n }}\n >\n {dragState && !dragState.preview && dragState.type === 'group' && (\n <View\n innerRef={dropRef}\n style={{\n position: 'absolute',\n left: 0,\n right: 0,\n height: collapsed\n ? ROW_HEIGHT - 1\n : (1 + group.categories.length) * (ROW_HEIGHT - 1) + 1,\n zIndex: 10000,\n }}\n >\n <DropHighlight pos={dropPos} offset={{ top: 1 }} />\n </View>\n )}\n\n <DropHighlight pos={catDropPos} offset={{ top: 1 }} />\n\n <View\n innerRef={catDropRef}\n style={{\n flex: 1,\n flexDirection: 'row',\n opacity: dragging && !dragState.preview ? 0.3 : 1,\n }}\n >\n <SidebarGroup\n innerRef={dragRef}\n group={group}\n editing={\n editingCell &&\n editingCell.cell === 'name' &&\n editingCell.id === group.id\n }\n dragPreview={dragging && dragState.preview}\n collapsed={collapsed}\n onToggleCollapse={onToggleCollapse}\n onEdit={onEditName}\n onSave={onSave}\n onDelete={onDelete}\n onShowNewCategory={onShowNewCategory}\n />\n <RenderMonths component={MonthComponent} args={{ group }} />\n </View>\n </Row>\n );\n}\n","// @ts-strict-ignore\nimport React, { type ComponentProps } from 'react';\n\nimport { type CategoryEntity } from 'loot-core/src/types/models';\n\nimport {\n useDraggable,\n useDroppable,\n DropHighlight,\n type OnDragChangeCallback,\n type OnDropCallback,\n} from '../sort';\nimport { Row } from '../table';\n\nimport { RenderMonths } from './RenderMonths';\nimport { SidebarCategory } from './SidebarCategory';\n\ntype IncomeCategoryProps = {\n cat: CategoryEntity;\n isLast?: boolean;\n editingCell: { id: string; cell: string } | null;\n MonthComponent: ComponentProps<typeof RenderMonths>['component'];\n onEditName: ComponentProps<typeof SidebarCategory>['onEditName'];\n onEditMonth?: (id: string, monthIndex: number) => void;\n onSave: ComponentProps<typeof SidebarCategory>['onSave'];\n onDelete: ComponentProps<typeof SidebarCategory>['onDelete'];\n onDragChange: OnDragChangeCallback<CategoryEntity>;\n onBudgetAction: (idx: number, action: string, arg: unknown) => void;\n onReorder: OnDropCallback;\n onShowActivity: (name: string, id: string, idx: number) => void;\n};\n\nexport function IncomeCategory({\n cat,\n isLast,\n editingCell,\n MonthComponent,\n onEditName,\n onEditMonth,\n onSave,\n onDelete,\n onDragChange,\n onBudgetAction,\n onReorder,\n onShowActivity,\n}: IncomeCategoryProps) {\n const { dragRef } = useDraggable({\n type: 'income-category',\n onDragChange,\n item: cat,\n canDrag: editingCell === null,\n });\n\n const { dropRef, dropPos } = useDroppable({\n types: 'income-category',\n id: cat.id,\n onDrop: onReorder,\n });\n\n return (\n <Row innerRef={dropRef} collapsed={true}>\n <DropHighlight pos={dropPos} offset={{ top: 1 }} />\n\n <SidebarCategory\n innerRef={dragRef}\n category={cat}\n isLast={isLast}\n editing={\n editingCell &&\n editingCell.cell === 'name' &&\n editingCell.id === cat.id\n }\n onEditName={onEditName}\n onSave={onSave}\n onDelete={onDelete}\n />\n <RenderMonths\n component={MonthComponent}\n editingIndex={\n editingCell && editingCell.id === cat.id && editingCell.cell\n }\n args={{\n category: cat,\n onEdit: onEditMonth,\n isLast,\n onShowActivity,\n onBudgetAction,\n }}\n />\n </Row>\n );\n}\n","// @ts-strict-ignore\nimport React from 'react';\n\nimport { theme } from '../../style';\nimport { Row } from '../table';\n\nimport { RenderMonths } from './RenderMonths';\nimport { SidebarGroup } from './SidebarGroup';\n\ntype IncomeGroupProps = {\n group: {\n id: string;\n hidden: number;\n categories: object[];\n is_income: number;\n name: string;\n sort_order: number;\n tombstone: number;\n };\n editingCell: { id: string; cell: string } | null;\n collapsed: boolean;\n MonthComponent: () => JSX.Element;\n onEditName: (id: string) => void;\n onSave: (group: object) => Promise<void>;\n onToggleCollapse: (id: string) => void;\n onShowNewCategory: (groupId: string) => void;\n};\n\nexport function IncomeGroup({\n group,\n editingCell,\n collapsed,\n MonthComponent,\n onEditName,\n onSave,\n onToggleCollapse,\n onShowNewCategory,\n}: IncomeGroupProps) {\n return (\n <Row\n collapsed={true}\n style={{\n fontWeight: 600,\n backgroundColor: theme.tableRowHeaderBackground,\n }}\n >\n <SidebarGroup\n group={group}\n collapsed={collapsed}\n editing={\n editingCell &&\n editingCell.cell === 'name' &&\n editingCell.id === group.id\n }\n onEdit={onEditName}\n onSave={onSave}\n onToggleCollapse={onToggleCollapse}\n onShowNewCategory={onShowNewCategory}\n />\n <RenderMonths component={MonthComponent} args={{ group }} />\n </Row>\n );\n}\n","import React from 'react';\n\nimport { Button } from '../common/Button';\nimport { View } from '../common/View';\n\nimport { RenderMonths } from './RenderMonths';\n\ntype IncomeHeaderProps = {\n MonthComponent?: () => JSX.Element;\n onShowNewGroup: () => void;\n};\n\nexport function IncomeHeader({\n MonthComponent,\n onShowNewGroup,\n}: IncomeHeaderProps) {\n return (\n <View style={{ flexDirection: 'row', flex: 1 }}>\n <View\n style={{\n width: 200,\n alignItems: 'flex-start',\n justifyContent: 'flex-start',\n }}\n >\n <Button onClick={onShowNewGroup} style={{ fontSize: 12, margin: 10 }}>\n Add Group\n </Button>\n </View>\n <RenderMonths\n component={MonthComponent}\n style={{ border: 0, justifyContent: 'flex-end' }}\n />\n </View>\n );\n}\n","import React, { memo, useState, useMemo } from 'react';\n\nimport { useLocalPref } from '../../hooks/useLocalPref';\nimport { theme, styles } from '../../style';\nimport { View } from '../common/View';\nimport { DropHighlightPosContext } from '../sort';\nimport { Row } from '../table';\n\nimport { ExpenseCategory } from './ExpenseCategory';\nimport { ExpenseGroup } from './ExpenseGroup';\nimport { IncomeCategory } from './IncomeCategory';\nimport { IncomeGroup } from './IncomeGroup';\nimport { IncomeHeader } from './IncomeHeader';\nimport { SidebarCategory } from './SidebarCategory';\nimport { SidebarGroup } from './SidebarGroup';\nimport { separateGroups } from './util';\n\nexport const BudgetCategories = memo(\n ({\n categoryGroups,\n editingCell,\n dataComponents,\n onBudgetAction,\n onShowActivity,\n onEditName,\n onEditMonth,\n onSaveCategory,\n onSaveGroup,\n onDeleteCategory,\n onDeleteGroup,\n onReorderCategory,\n onReorderGroup,\n }) => {\n const [_collapsed, setCollapsedPref] = useLocalPref('budget.collapsed');\n const collapsed = _collapsed || [];\n const [showHiddenCategories] = useLocalPref('budget.showHiddenCategories');\n function onCollapse(value) {\n setCollapsedPref(value);\n }\n\n const [isAddingGroup, setIsAddingGroup] = useState(false);\n const [newCategoryForGroup, setNewCategoryForGroup] = useState(null);\n const items = useMemo(() => {\n const [expenseGroups, incomeGroup] = separateGroups(categoryGroups);\n\n let items = Array.prototype.concat.apply(\n [],\n expenseGroups.map(group => {\n if (group.hidden && !showHiddenCategories) {\n return [];\n }\n\n const groupCategories = group.categories.filter(\n cat => showHiddenCategories || !cat.hidden,\n );\n\n const items = [{ type: 'expense-group', value: { ...group } }];\n\n if (newCategoryForGroup === group.id) {\n items.push({ type: 'new-category' });\n }\n\n return [\n ...items,\n ...(collapsed.includes(group.id) ? [] : groupCategories).map(\n cat => ({\n type: 'expense-category',\n value: cat,\n }),\n ),\n ];\n }),\n );\n\n if (isAddingGroup) {\n items.push({ type: 'new-group' });\n }\n\n if (incomeGroup) {\n items = items.concat(\n [\n { type: 'income-separator' },\n { type: 'income-group', value: incomeGroup },\n newCategoryForGroup === incomeGroup.id && { type: 'new-category' },\n ...(collapsed.includes(incomeGroup.id)\n ? []\n : incomeGroup.categories.filter(\n cat => showHiddenCategories || !cat.hidden,\n )\n ).map(cat => ({\n type: 'income-category',\n value: cat,\n })),\n ].filter(x => x),\n );\n }\n\n return items;\n }, [\n categoryGroups,\n collapsed,\n newCategoryForGroup,\n isAddingGroup,\n showHiddenCategories,\n ]);\n\n const [dragState, setDragState] = useState(null);\n const [savedCollapsed, setSavedCollapsed] = useState(null);\n\n // TODO: If we turn this into a reducer, we could probably memoize\n // each item in the list for better perf\n function onDragChange(newDragState) {\n const { state } = newDragState;\n\n if (state === 'start-preview') {\n setDragState({\n type: newDragState.type,\n item: newDragState.item,\n preview: true,\n });\n } else if (state === 'start') {\n if (dragState) {\n setDragState({\n ...dragState,\n preview: false,\n });\n setSavedCollapsed(collapsed);\n }\n } else if (state === 'hover') {\n setDragState({\n ...dragState,\n hoveredId: newDragState.id,\n hoveredPos: newDragState.pos,\n });\n } else if (state === 'end') {\n setDragState(null);\n onCollapse(savedCollapsed || []);\n }\n }\n\n function onToggleCollapse(id) {\n if (collapsed.includes(id)) {\n onCollapse(collapsed.filter(id_ => id_ !== id));\n } else {\n onCollapse([...collapsed, id]);\n }\n }\n\n function onShowNewGroup() {\n setIsAddingGroup(true);\n }\n\n function onHideNewGroup() {\n setIsAddingGroup(false);\n }\n\n function _onSaveGroup(group) {\n onSaveGroup?.(group);\n if (group.id === 'new') {\n onHideNewGroup();\n }\n }\n\n function onShowNewCategory(groupId) {\n onCollapse(collapsed.filter(c => c !== groupId));\n setNewCategoryForGroup(groupId);\n }\n\n function onHideNewCategory() {\n setNewCategoryForGroup(null);\n }\n\n function _onSaveCategory(category) {\n onSaveCategory?.(category);\n if (category.id === 'new') {\n onHideNewCategory();\n }\n }\n\n return (\n <View\n style={{\n marginBottom: 10,\n backgroundColor: theme.tableBackground,\n overflow: 'hidden',\n boxShadow: styles.cardShadow,\n borderRadius: '0 0 4px 4px',\n flex: 1,\n }}\n >\n {items.map((item, idx) => {\n let content;\n switch (item.type) {\n case 'new-group':\n content = (\n <Row\n style={{ backgroundColor: theme.tableRowHeaderBackground }}\n >\n <SidebarGroup\n group={{ id: 'new', name: '' }}\n editing={true}\n onSave={_onSaveGroup}\n onHideNewGroup={onHideNewGroup}\n onEdit={onEditName}\n />\n </Row>\n );\n break;\n case 'new-category':\n content = (\n <Row>\n <SidebarCategory\n category={{\n name: '',\n cat_group: newCategoryForGroup,\n is_income:\n newCategoryForGroup ===\n categoryGroups.find(g => g.is_income).id,\n id: 'new',\n }}\n editing={true}\n onSave={_onSaveCategory}\n onHideNewCategory={onHideNewCategory}\n onEditName={onEditName}\n />\n </Row>\n );\n break;\n\n case 'expense-group':\n content = (\n <ExpenseGroup\n group={item.value}\n editingCell={editingCell}\n collapsed={collapsed.includes(item.value.id)}\n MonthComponent={dataComponents.ExpenseGroupComponent}\n dragState={dragState}\n onEditName={onEditName}\n onSave={_onSaveGroup}\n onDelete={onDeleteGroup}\n onDragChange={onDragChange}\n onReorderGroup={onReorderGroup}\n onReorderCategory={onReorderCategory}\n onToggleCollapse={onToggleCollapse}\n onShowNewCategory={onShowNewCategory}\n />\n );\n break;\n case 'expense-category':\n content = (\n <ExpenseCategory\n cat={item.value}\n editingCell={editingCell}\n MonthComponent={dataComponents.ExpenseCategoryComponent}\n dragState={dragState}\n onEditName={onEditName}\n onEditMonth={onEditMonth}\n onSave={_onSaveCategory}\n onDelete={onDeleteCategory}\n onDragChange={onDragChange}\n onReorder={onReorderCategory}\n onBudgetAction={onBudgetAction}\n onShowActivity={onShowActivity}\n />\n );\n break;\n case 'income-separator':\n content = (\n <View\n style={{\n height: styles.incomeHeaderHeight,\n backgroundColor: theme.tableBackground,\n }}\n >\n <IncomeHeader\n MonthComponent={dataComponents.IncomeHeaderComponent}\n onShowNewGroup={onShowNewGroup}\n />\n </View>\n );\n break;\n case 'income-group':\n content = (\n <IncomeGroup\n group={item.value}\n editingCell={editingCell}\n MonthComponent={dataComponents.IncomeGroupComponent}\n collapsed={collapsed.includes(item.value.id)}\n onEditName={onEditName}\n onSave={_onSaveGroup}\n onToggleCollapse={onToggleCollapse}\n onShowNewCategory={onShowNewCategory}\n />\n );\n break;\n case 'income-category':\n content = (\n <IncomeCategory\n cat={item.value}\n editingCell={editingCell}\n isLast={idx === items.length - 1}\n MonthComponent={dataComponents.IncomeCategoryComponent}\n onEditName={onEditName}\n onEditMonth={onEditMonth}\n onSave={_onSaveCategory}\n onDelete={onDeleteCategory}\n onDragChange={onDragChange}\n onReorder={onReorderCategory}\n onBudgetAction={onBudgetAction}\n onShowActivity={onShowActivity}\n />\n );\n break;\n default:\n throw new Error('Unknown item type: ' + item.type);\n }\n\n const pos =\n idx === 0 ? 'first' : idx === items.length - 1 ? 'last' : null;\n\n return (\n <DropHighlightPosContext.Provider\n key={\n item.value\n ? item.value.id\n : item.type === 'income-separator'\n ? 'separator'\n : idx\n }\n value={pos}\n >\n <View\n style={\n !dragState && {\n ':hover': { backgroundColor: theme.tableBackground },\n }\n }\n >\n {content}\n </View>\n </DropHighlightPosContext.Provider>\n );\n })}\n </View>\n );\n },\n);\n\nBudgetCategories.displayName = 'BudgetCategories';\n","import React, {\n useContext,\n useState,\n useRef,\n useCallback,\n useLayoutEffect,\n} from 'react';\nimport { useSpring, animated } from 'react-spring';\n\nimport { css } from 'glamor';\n\nimport { addMonths, subMonths } from 'loot-core/src/shared/months';\n\nimport { useResizeObserver } from '../../hooks/useResizeObserver';\nimport { View } from '../common/View';\n\nimport { MonthsContext } from './MonthsContext';\nimport { type BudgetSummary as ReportBudgetSummary } from './report/budgetsummary/BudgetSummary';\nimport { type BudgetSummary as RolloverBudgetSummary } from './rollover/budgetsummary/BudgetSummary';\n\ntype BudgetSummariesProps = {\n SummaryComponent: typeof ReportBudgetSummary | typeof RolloverBudgetSummary;\n};\n\nexport function BudgetSummaries({ SummaryComponent }: BudgetSummariesProps) {\n const { months } = useContext(MonthsContext);\n\n const [widthState, setWidthState] = useState(0);\n const [styles, spring] = useSpring(() => ({\n x: 0,\n config: { mass: 3, tension: 600, friction: 80 },\n }));\n\n const containerRef = useResizeObserver(\n useCallback(rect => {\n setWidthState(rect.width);\n }, []),\n );\n\n const prevMonth0 = useRef(months[0]);\n const allMonths = [...months];\n allMonths.unshift(subMonths(months[0], 1));\n allMonths.push(addMonths(months[months.length - 1], 1));\n const monthWidth = widthState / months.length;\n\n useLayoutEffect(() => {\n const prevMonth = prevMonth0.current;\n const reversed = prevMonth > months[0];\n const offsetX = monthWidth;\n let from = reversed ? -offsetX * 2 : 0;\n\n if (prevMonth !== allMonths[0] && prevMonth !== allMonths[2]) {\n from = -offsetX;\n }\n\n const to = -offsetX;\n spring.start({ from: { x: from }, x: to });\n }, [months[0]]);\n\n useLayoutEffect(() => {\n prevMonth0.current = months[0];\n }, [months[0]]);\n\n useLayoutEffect(() => {\n spring.start({ from: { x: -monthWidth }, to: { x: -monthWidth } });\n }, [monthWidth]);\n\n return (\n <div\n className={`${css([\n { flex: 1, overflow: 'hidden' },\n months.length === 1 && {\n marginLeft: -4,\n marginRight: -4,\n },\n ])}`}\n ref={containerRef}\n >\n <animated.div\n className=\"view\"\n style={{\n flexDirection: 'row',\n width: widthState,\n willChange: 'transform',\n transform: styles.x.to(x => `translateX(${x}px)`),\n }}\n >\n {allMonths.map(month => {\n return (\n <View\n key={month}\n style={{\n flex: `0 0 ${monthWidth}px`,\n paddingLeft: 4,\n paddingRight: 4,\n }}\n >\n <SummaryComponent month={month} />\n </View>\n );\n })}\n </animated.div>\n </div>\n );\n}\n","import React, { type ComponentProps, memo, useState } from 'react';\n\nimport { SvgDotsHorizontalTriple } from '../../icons/v1';\nimport { theme, styles } from '../../style';\nimport { Button } from '../common/Button';\nimport { Menu } from '../common/Menu';\nimport { View } from '../common/View';\nimport { Tooltip } from '../tooltips';\n\nimport { RenderMonths } from './RenderMonths';\nimport { getScrollbarWidth } from './util';\n\ntype BudgetTotalsProps = {\n MonthComponent: ComponentProps<typeof RenderMonths>['component'];\n toggleHiddenCategories: () => void;\n expandAllCategories: () => void;\n collapseAllCategories: () => void;\n};\n\nexport const BudgetTotals = memo(function BudgetTotals({\n MonthComponent,\n toggleHiddenCategories,\n expandAllCategories,\n collapseAllCategories,\n}: BudgetTotalsProps) {\n const [menuOpen, setMenuOpen] = useState(false);\n return (\n <View\n data-testid=\"budget-totals\"\n style={{\n backgroundColor: theme.tableBackground,\n flexDirection: 'row',\n flexShrink: 0,\n boxShadow: styles.cardShadow,\n marginLeft: 5,\n marginRight: 5 + getScrollbarWidth(),\n borderRadius: '4px 4px 0 0',\n borderBottom: '1px solid ' + theme.tableBorder,\n }}\n >\n <View\n style={{\n width: 200,\n color: theme.pageTextLight,\n justifyContent: 'center',\n paddingLeft: 15,\n paddingRight: 5,\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n userSelect: 'none',\n WebkitUserSelect: 'none',\n }}\n >\n <View style={{ flexGrow: '1' }}>Category</View>\n <Button\n type=\"bare\"\n aria-label=\"Menu\"\n onClick={() => {\n setMenuOpen(true);\n }}\n style={{ color: 'currentColor', padding: 3 }}\n >\n <SvgDotsHorizontalTriple\n width={15}\n height={15}\n style={{ color: theme.pageTextLight }}\n />\n {menuOpen && (\n <Tooltip\n position=\"bottom-right\"\n width={200}\n style={{ padding: 0 }}\n onClose={() => {\n setMenuOpen(false);\n }}\n >\n <Menu\n onMenuSelect={type => {\n if (type === 'toggle-visibility') {\n toggleHiddenCategories();\n } else if (type === 'expandAllCategories') {\n expandAllCategories();\n } else if (type === 'collapseAllCategories') {\n collapseAllCategories();\n }\n setMenuOpen(false);\n }}\n items={[\n {\n name: 'toggle-visibility',\n text: 'Toggle hidden categories',\n },\n {\n name: 'expandAllCategories',\n text: 'Expand all',\n },\n {\n name: 'collapseAllCategories',\n text: 'Collapse all',\n },\n ]}\n />\n </Tooltip>\n )}\n </Button>\n </View>\n <RenderMonths component={MonthComponent} />\n </View>\n );\n});\n","import React, { createRef, Component } from 'react';\nimport { connect } from 'react-redux';\n\nimport { savePrefs } from 'loot-core/src/client/actions';\nimport * as monthUtils from 'loot-core/src/shared/months';\n\nimport { theme, styles } from '../../style';\nimport { View } from '../common/View';\nimport { IntersectionBoundary } from '../tooltips';\n\nimport { BudgetCategories } from './BudgetCategories';\nimport { BudgetSummaries } from './BudgetSummaries';\nimport { BudgetTotals } from './BudgetTotals';\nimport { MonthsProvider } from './MonthsContext';\nimport { findSortDown, findSortUp, getScrollbarWidth } from './util';\n\nclass BudgetTableInner extends Component {\n constructor(props) {\n super(props);\n this.budgetCategoriesRef = createRef();\n\n this.state = {\n editing: null,\n draggingState: null,\n };\n }\n\n onEditMonth = (id, monthIndex) => {\n this.setState({ editing: id ? { id, cell: monthIndex } : null });\n };\n\n onEditName = id => {\n this.setState({ editing: id ? { id, cell: 'name' } : null });\n };\n\n onReorderCategory = (id, dropPos, targetId) => {\n const { categoryGroups } = this.props;\n\n const isGroup = !!categoryGroups.find(g => g.id === targetId);\n\n if (isGroup) {\n const { targetId: groupId } = findSortUp(\n categoryGroups,\n dropPos,\n targetId,\n );\n const group = categoryGroups.find(g => g.id === groupId);\n\n if (group) {\n const { categories } = group;\n this.props.onReorderCategory({\n id,\n groupId: group.id,\n targetId:\n categories.length === 0 || dropPos === 'top'\n ? null\n : categories[0].id,\n });\n }\n } else {\n let targetGroup;\n\n for (const group of categoryGroups) {\n if (group.categories.find(cat => cat.id === targetId)) {\n targetGroup = group;\n break;\n }\n }\n\n this.props.onReorderCategory({\n id,\n groupId: targetGroup.id,\n ...findSortDown(targetGroup.categories, dropPos, targetId),\n });\n }\n };\n\n onReorderGroup = (id, dropPos, targetId) => {\n const { categoryGroups } = this.props;\n\n this.props.onReorderGroup({\n id,\n ...findSortDown(categoryGroups, dropPos, targetId),\n });\n };\n\n moveVertically = dir => {\n const { editing } = this.state;\n const { type, categoryGroups, collapsed } = this.props;\n\n const flattened = categoryGroups.reduce((all, group) => {\n if (collapsed.includes(group.id)) {\n return all.concat({ id: group.id, isGroup: true });\n }\n return all.concat([{ id: group.id, isGroup: true }, ...group.categories]);\n }, []);\n\n if (editing) {\n const idx = flattened.findIndex(item => item.id === editing.id);\n let nextIdx = idx + dir;\n\n while (nextIdx >= 0 && nextIdx < flattened.length) {\n const next = flattened[nextIdx];\n\n if (next.isGroup) {\n nextIdx += dir;\n continue;\n } else if (type === 'report' || !next.is_income) {\n this.onEditMonth(next.id, editing.cell);\n return;\n } else {\n break;\n }\n }\n }\n };\n\n onKeyDown = e => {\n if (!this.state.editing) {\n return null;\n }\n\n if (e.key === 'Enter' || e.key === 'Tab') {\n e.preventDefault();\n this.moveVertically(e.shiftKey ? -1 : 1);\n }\n };\n\n onShowActivity = (catName, catId, monthIndex) => {\n this.props.onShowActivity(catName, catId, this.resolveMonth(monthIndex));\n };\n\n onBudgetAction = (monthIndex, type, args) => {\n this.props.onBudgetAction(this.resolveMonth(monthIndex), type, args);\n };\n\n resolveMonth = monthIndex => {\n return monthUtils.addMonths(this.props.startMonth, monthIndex);\n };\n\n // This is called via ref.\n clearEditing() {\n this.setState({ editing: null });\n }\n\n toggleHiddenCategories = () => {\n this.props.onToggleHiddenCategories();\n };\n\n expandAllCategories = () => {\n this.props.onCollapse([]);\n };\n\n collapseAllCategories = () => {\n const { onCollapse, categoryGroups } = this.props;\n onCollapse(categoryGroups.map(g => g.id));\n };\n\n render() {\n const {\n type,\n categoryGroups,\n prewarmStartMonth,\n startMonth,\n numMonths,\n monthBounds,\n dataComponents,\n onSaveCategory,\n onSaveGroup,\n onDeleteCategory,\n onDeleteGroup,\n } = this.props;\n const { editing, draggingState } = this.state;\n\n return (\n <View\n data-testid=\"budget-table\"\n style={{\n flex: 1,\n ...(styles.lightScrollbar && {\n '& ::-webkit-scrollbar': {\n backgroundColor: 'transparent',\n },\n '& ::-webkit-scrollbar-thumb:vertical': {\n backgroundColor: theme.tableHeaderBackground,\n },\n }),\n }}\n >\n <View\n style={{\n flexDirection: 'row',\n overflow: 'hidden',\n flexShrink: 0,\n // This is necessary to align with the table because the\n // table has this padding to allow the shadow to show\n paddingLeft: 5,\n paddingRight: 5 + getScrollbarWidth(),\n }}\n >\n <View style={{ width: 200 }} />\n <MonthsProvider\n startMonth={prewarmStartMonth}\n numMonths={numMonths}\n monthBounds={monthBounds}\n type={type}\n >\n <BudgetSummaries\n SummaryComponent={dataComponents.SummaryComponent}\n />\n </MonthsProvider>\n </View>\n\n <MonthsProvider\n startMonth={startMonth}\n numMonths={numMonths}\n monthBounds={monthBounds}\n type={type}\n >\n <BudgetTotals\n MonthComponent={dataComponents.BudgetTotalsComponent}\n toggleHiddenCategories={this.toggleHiddenCategories}\n expandAllCategories={this.expandAllCategories}\n collapseAllCategories={this.collapseAllCategories}\n />\n <IntersectionBoundary.Provider value={this.budgetCategoriesRef}>\n <View\n style={{\n overflowY: 'scroll',\n overflowAnchor: 'none',\n flex: 1,\n paddingLeft: 5,\n paddingRight: 5,\n }}\n innerRef={this.budgetCategoriesRef}\n >\n <View\n style={{\n opacity: draggingState ? 0.5 : 1,\n flexShrink: 0,\n }}\n onKeyDown={this.onKeyDown}\n innerRef={el => (this.budgetDataNode = el)}\n >\n <BudgetCategories\n categoryGroups={categoryGroups}\n editingCell={editing}\n dataComponents={dataComponents}\n onEditMonth={this.onEditMonth}\n onEditName={this.onEditName}\n onSaveCategory={onSaveCategory}\n onSaveGroup={onSaveGroup}\n onDeleteCategory={onDeleteCategory}\n onDeleteGroup={onDeleteGroup}\n onReorderCategory={this.onReorderCategory}\n onReorderGroup={this.onReorderGroup}\n onBudgetAction={this.onBudgetAction}\n onShowActivity={this.onShowActivity}\n />\n </View>\n </View>\n </IntersectionBoundary.Provider>\n </MonthsProvider>\n </View>\n );\n }\n}\n\nconst mapStateToProps = state => {\n const { grouped: categoryGroups } = state.queries.categories;\n return {\n categoryGroups,\n };\n};\n\nconst mapDispatchToProps = dispatch => {\n const onCollapse = collapsedIds => {\n dispatch(savePrefs({ 'budget.collapsed': collapsedIds }));\n };\n\n const onToggleHiddenCategories = () =>\n dispatch((innerDispatch, getState) => {\n const { prefs } = getState();\n const showHiddenCategories = prefs.local['budget.showHiddenCategories'];\n innerDispatch(\n savePrefs({\n 'budget.showHiddenCategories': !showHiddenCategories,\n }),\n );\n });\n return {\n onCollapse,\n onToggleHiddenCategories,\n };\n};\n\nexport const BudgetTable = connect(mapStateToProps, mapDispatchToProps, null, {\n forwardRef: true,\n})(BudgetTableInner);\n","// @ts-strict-ignore\nimport React, { forwardRef, useEffect, type ComponentProps } from 'react';\nimport AutoSizer from 'react-virtualized-auto-sizer';\n\nimport { useActions } from '../../hooks/useActions';\nimport { View } from '../common/View';\n\nimport { useBudgetMonthCount } from './BudgetMonthCountContext';\nimport { BudgetPageHeader } from './BudgetPageHeader';\nimport { BudgetTable } from './BudgetTable';\n\nfunction getNumPossibleMonths(width: number) {\n const estimatedTableWidth = width - 200;\n\n if (estimatedTableWidth < 500) {\n return 1;\n } else if (estimatedTableWidth < 750) {\n return 2;\n } else if (estimatedTableWidth < 1000) {\n return 3;\n } else if (estimatedTableWidth < 1250) {\n return 4;\n } else if (estimatedTableWidth < 1500) {\n return 5;\n }\n\n return 6;\n}\n\ntype DynamicBudgetTableInnerProps = {\n width: number;\n height: number;\n} & ComponentProps<typeof BudgetTable>;\n\nconst DynamicBudgetTableInner = forwardRef<\n typeof BudgetTable,\n DynamicBudgetTableInnerProps\n>(\n (\n {\n width,\n height,\n prewarmStartMonth,\n startMonth,\n maxMonths = 3,\n monthBounds,\n onMonthSelect: onMonthSelect_,\n onPreload,\n ...props\n },\n ref,\n ) => {\n const { setDisplayMax } = useBudgetMonthCount();\n const actions = useActions();\n\n const numPossible = getNumPossibleMonths(width);\n const numMonths = Math.min(numPossible, maxMonths);\n const maxWidth = 200 + 500 * numMonths;\n\n useEffect(() => {\n setDisplayMax(numPossible);\n }, [numPossible]);\n\n function onMonthSelect(month) {\n onMonthSelect_(month, numMonths);\n }\n\n return (\n <View\n style={{\n width,\n height,\n alignItems: 'center',\n opacity: width <= 0 || height <= 0 ? 0 : 1,\n }}\n >\n <View style={{ width: '100%', maxWidth }}>\n <BudgetPageHeader\n startMonth={prewarmStartMonth}\n numMonths={numMonths}\n monthBounds={monthBounds}\n onMonthSelect={onMonthSelect}\n />\n <BudgetTable\n ref={ref}\n prewarmStartMonth={prewarmStartMonth}\n startMonth={startMonth}\n numMonths={numMonths}\n monthBounds={monthBounds}\n {...actions}\n {...props}\n />\n </View>\n </View>\n );\n },\n);\n\nDynamicBudgetTableInner.displayName = 'DynamicBudgetTableInner';\n\nexport const DynamicBudgetTable = forwardRef<\n typeof BudgetTable,\n DynamicBudgetTableInnerProps\n>((props, ref) => {\n return (\n <AutoSizer>\n {({ width, height }) => (\n <DynamicBudgetTableInner\n ref={ref}\n width={width}\n height={height}\n {...props}\n />\n )}\n </AutoSizer>\n );\n});\n\nDynamicBudgetTable.displayName = 'DynamicBudgetTable';\n","// @ts-strict-ignore\nimport React, { type ReactNode, createContext, useContext } from 'react';\n\nimport * as monthUtils from 'loot-core/src/shared/months';\n\nconst Context = createContext(null);\n\ntype ReportProviderProps = {\n summaryCollapsed: boolean;\n onBudgetAction: (idx: number, action: string, arg: unknown) => void;\n onToggleSummaryCollapse: () => void;\n children: ReactNode;\n};\nexport function ReportProvider({\n summaryCollapsed,\n onBudgetAction,\n onToggleSummaryCollapse,\n children,\n}: ReportProviderProps) {\n const currentMonth = monthUtils.currentMonth();\n\n return (\n <Context.Provider\n value={{\n currentMonth,\n summaryCollapsed,\n onBudgetAction,\n onToggleSummaryCollapse,\n }}\n >\n {children}\n </Context.Provider>\n );\n}\n\nexport function useReport() {\n return useContext(Context);\n}\n","// @ts-strict-ignore\nimport React, { useState } from 'react';\n\nimport { css } from 'glamor';\n\nimport * as monthUtils from 'loot-core/src/shared/months';\n\nimport { useFeatureFlag } from '../../../../hooks/useFeatureFlag';\nimport { SvgDotsHorizontalTriple } from '../../../../icons/v1';\nimport { SvgArrowButtonDown1, SvgArrowButtonUp1 } from '../../../../icons/v2';\nimport { theme, styles } from '../../../../style';\nimport { Button } from '../../../common/Button';\nimport { Menu } from '../../../common/Menu';\nimport { Stack } from '../../../common/Stack';\nimport { View } from '../../../common/View';\nimport { NotesButton } from '../../../NotesButton';\nimport { NamespaceContext } from '../../../spreadsheet/NamespaceContext';\nimport { Tooltip } from '../../../tooltips';\nimport { useReport } from '../ReportContext';\n\nimport { ExpenseTotal } from './ExpenseTotal';\nimport { IncomeTotal } from './IncomeTotal';\nimport { Saved } from './Saved';\n\ntype BudgetSummaryProps = {\n month?: string;\n};\nexport function BudgetSummary({ month }: BudgetSummaryProps) {\n const {\n currentMonth,\n summaryCollapsed: collapsed,\n onBudgetAction,\n onToggleSummaryCollapse,\n } = useReport();\n\n const isGoalTemplatesEnabled = useFeatureFlag('goalTemplatesEnabled');\n\n const [menuOpen, setMenuOpen] = useState(false);\n function onMenuOpen() {\n setMenuOpen(true);\n }\n\n function onMenuClose() {\n setMenuOpen(false);\n }\n\n const ExpandOrCollapseIcon = collapsed\n ? SvgArrowButtonDown1\n : SvgArrowButtonUp1;\n\n return (\n <View\n style={{\n backgroundColor: theme.tableBackground,\n boxShadow: styles.cardShadow,\n borderRadius: 6,\n marginLeft: 0,\n marginRight: 0,\n marginTop: 5,\n flex: 1,\n cursor: 'default',\n marginBottom: 5,\n overflow: 'hidden',\n '& .hover-visible': {\n opacity: 0,\n transition: 'opacity .25s',\n },\n '&:hover .hover-visible': {\n opacity: 1,\n },\n }}\n >\n <NamespaceContext.Provider value={monthUtils.sheetForMonth(month)}>\n <View\n style={{\n padding: '0 13px',\n ...(collapsed ? { margin: '10px 0' } : { marginTop: 16 }),\n }}\n >\n <View\n style={{\n position: 'absolute',\n left: 10,\n top: 0,\n }}\n >\n <Button\n type=\"bare\"\n aria-label={`${collapsed ? 'Expand' : 'Collapse'} month summary`}\n className=\"hover-visible\"\n onClick={onToggleSummaryCollapse}\n >\n <ExpandOrCollapseIcon\n width={13}\n height={13}\n // The margin is to make it the exact same size as the dots button\n style={{ color: theme.pageTextSubdued, margin: 1 }}\n />\n </Button>\n </View>\n\n <div\n className={`${css([\n {\n textAlign: 'center',\n marginTop: 3,\n fontSize: 18,\n fontWeight: 500,\n textDecorationSkip: 'ink',\n },\n ])}`}\n >\n {monthUtils.format(month, 'MMMM')}\n </div>\n\n <View\n style={{\n position: 'absolute',\n right: 10,\n top: 0,\n flexDirection: 'row',\n alignItems: 'center',\n }}\n >\n <View>\n <NotesButton\n id={`budget-${month}`}\n width={15}\n height={15}\n tooltipPosition=\"bottom-right\"\n defaultColor={theme.pageTextLight}\n />\n </View>\n <View style={{ userSelect: 'none' }}>\n <Button type=\"bare\" aria-label=\"Menu\" onClick={onMenuOpen}>\n <SvgDotsHorizontalTriple\n width={15}\n height={15}\n style={{ color: theme.pageTextLight }}\n />\n </Button>\n {menuOpen && (\n <Tooltip\n position=\"bottom-right\"\n width={200}\n style={{ padding: 0 }}\n onClose={onMenuClose}\n >\n <Menu\n onMenuSelect={type => {\n onMenuClose();\n onBudgetAction(month, type);\n }}\n items={[\n { name: 'copy-last', text: 'Copy last month’s budget' },\n { name: 'set-zero', text: 'Set budgets to zero' },\n {\n name: 'set-3-avg',\n text: 'Set budgets to 3 month average',\n },\n isGoalTemplatesEnabled && {\n name: 'check-templates',\n text: 'Check templates',\n },\n isGoalTemplatesEnabled && {\n name: 'apply-goal-template',\n text: 'Apply budget template',\n },\n isGoalTemplatesEnabled && {\n name: 'overwrite-goal-template',\n text: 'Overwrite with budget template',\n },\n ]}\n />\n </Tooltip>\n )}\n </View>\n </View>\n </View>\n\n {!collapsed && (\n <Stack\n spacing={2}\n style={{\n alignSelf: 'center',\n backgroundColor: theme.tableRowHeaderBackground,\n borderRadius: 4,\n padding: '10px 15px',\n marginTop: 13,\n }}\n >\n <IncomeTotal />\n <ExpenseTotal />\n </Stack>\n )}\n\n {collapsed ? (\n <View\n style={{\n alignItems: 'center',\n padding: '10px 20px',\n justifyContent: 'space-between',\n backgroundColor: theme.tableRowHeaderBackground,\n borderTop: '1px solid ' + theme.tableBorder,\n }}\n >\n <Saved projected={month >= currentMonth} />\n </View>\n ) : (\n <Saved\n projected={month >= currentMonth}\n style={{ marginTop: 13, marginBottom: 20 }}\n />\n )}\n </NamespaceContext.Provider>\n </View>\n );\n}\n","// @ts-strict-ignore\nimport React, { memo, useState } from 'react';\n\nimport { reportBudget } from 'loot-core/src/client/queries';\nimport { evalArithmetic } from 'loot-core/src/shared/arithmetic';\nimport { integerToCurrency, amountToInteger } from 'loot-core/src/shared/util';\n\nimport { useFeatureFlag } from '../../../hooks/useFeatureFlag';\nimport { SvgCheveronDown } from '../../../icons/v1';\nimport { styles, theme, type CSSProperties } from '../../../style';\nimport { Button } from '../../common/Button';\nimport { Menu } from '../../common/Menu';\nimport { Text } from '../../common/Text';\nimport { View } from '../../common/View';\nimport { CellValue } from '../../spreadsheet/CellValue';\nimport { useFormat } from '../../spreadsheet/useFormat';\nimport { Field, SheetCell } from '../../table';\nimport { Tooltip, useTooltip } from '../../tooltips';\nimport { BalanceWithCarryover } from '../BalanceWithCarryover';\nimport { makeAmountGrey } from '../util';\n\nimport { BalanceTooltip } from './BalanceTooltip';\n\nconst headerLabelStyle: CSSProperties = {\n flex: 1,\n padding: '0 5px',\n textAlign: 'right',\n};\nexport const BudgetTotalsMonth = memo(function BudgetTotalsMonth() {\n const format = useFormat();\n return (\n <View\n style={{\n flex: 1,\n flexDirection: 'row',\n marginRight: styles.monthRightPadding,\n paddingTop: 10,\n paddingBottom: 10,\n }}\n >\n <View style={headerLabelStyle}>\n <Text style={{ color: theme.pageTextLight }}>Budgeted</Text>\n <CellValue\n binding={reportBudget.totalBudgetedExpense}\n type=\"financial\"\n style={{ color: theme.pageTextLight, fontWeight: 600 }}\n formatter={value => {\n return format(parseFloat(value || '0'), 'financial');\n }}\n />\n </View>\n <View style={headerLabelStyle}>\n <Text style={{ color: theme.pageTextLight }}>Spent</Text>\n <CellValue\n binding={reportBudget.totalSpent}\n type=\"financial\"\n style={{ color: theme.pageTextLight, fontWeight: 600 }}\n />\n </View>\n <View style={headerLabelStyle}>\n <Text style={{ color: theme.pageTextLight }}>Balance</Text>\n <CellValue\n binding={reportBudget.totalLeftover}\n type=\"financial\"\n style={{ color: theme.pageTextLight, fontWeight: 600 }}\n />\n </View>\n </View>\n );\n});\n\nexport function IncomeHeaderMonth() {\n return (\n <View\n style={{\n flexDirection: 'row',\n marginRight: styles.monthRightPadding,\n paddingBottom: 5,\n }}\n >\n <View style={headerLabelStyle}>\n <Text style={{ color: theme.pageTextLight }}>Budgeted</Text>\n </View>\n <View style={headerLabelStyle}>\n <Text style={{ color: theme.pageTextLight }}>Received</Text>\n </View>\n </View>\n );\n}\n\ntype GroupMonthProps = {\n group: { id: string; is_income: boolean };\n};\nexport const GroupMonth = memo(function GroupMonth({ group }: GroupMonthProps) {\n const { id } = group;\n\n return (\n <View style={{ flex: 1, flexDirection: 'row' }}>\n <SheetCell\n name=\"budgeted\"\n width=\"flex\"\n textAlign=\"right\"\n style={{ fontWeight: 600, ...styles.tnum }}\n valueProps={{\n binding: reportBudget.groupBudgeted(id),\n type: 'financial',\n }}\n />\n <SheetCell\n name=\"spent\"\n width=\"flex\"\n textAlign=\"right\"\n style={{ fontWeight: 600, ...styles.tnum }}\n valueProps={{\n binding: reportBudget.groupSumAmount(id),\n type: 'financial',\n }}\n />\n {!group.is_income && (\n <SheetCell\n name=\"balance\"\n width=\"flex\"\n textAlign=\"right\"\n style={{\n fontWeight: 600,\n paddingRight: styles.monthRightPadding,\n ...styles.tnum,\n }}\n valueProps={{\n binding: reportBudget.groupBalance(id),\n type: 'financial',\n privacyFilter: {\n style: {\n paddingRight: styles.monthRightPadding,\n },\n },\n }}\n />\n )}\n </View>\n );\n});\n\ntype CategoryMonthProps = {\n monthIndex: number;\n category: { id: string; name: string; is_income: boolean };\n editing: boolean;\n onEdit: (id: string | null, idx?: number) => void;\n onBudgetAction: (idx: number, action: string, arg: unknown) => void;\n onShowActivity: (name: string, id: string, idx: number) => void;\n};\nexport const CategoryMonth = memo(function CategoryMonth({\n monthIndex,\n category,\n editing,\n onEdit,\n onBudgetAction,\n onShowActivity,\n}: CategoryMonthProps) {\n const balanceTooltip = useTooltip();\n const [menuOpen, setMenuOpen] = useState(false);\n const [hover, setHover] = useState(false);\n const isGoalTemplatesEnabled = useFeatureFlag('goalTemplatesEnabled');\n\n return (\n <View\n style={{\n flex: 1,\n flexDirection: 'row',\n '& .hover-visible': {\n opacity: 0,\n transition: 'opacity .25s',\n },\n '&:hover .hover-visible': {\n opacity: 1,\n },\n }}\n >\n <View\n style={{\n flex: 1,\n flexDirection: 'row',\n }}\n onMouseOverCapture={() => setHover(true)}\n onMouseLeave={() => {\n setHover(false);\n }}\n >\n {!editing && (hover || menuOpen) && (\n <View\n style={{\n flexShrink: 0,\n paddingLeft: 3,\n justifyContent: 'center',\n borderTopWidth: 1,\n borderBottomWidth: 1,\n borderColor: theme.tableBorder,\n }}\n >\n <Button\n type=\"bare\"\n onClick={e => {\n e.stopPropagation();\n setMenuOpen(true);\n }}\n style={{\n padding: 3,\n }}\n >\n <SvgCheveronDown\n width={14}\n height={14}\n className=\"hover-visible\"\n style={menuOpen && { opacity: 1 }}\n />\n </Button>\n {menuOpen && (\n <Tooltip\n position=\"bottom-left\"\n width={200}\n style={{ padding: 0 }}\n onClose={() => setMenuOpen(false)}\n >\n <Menu\n onMenuSelect={type => {\n onBudgetAction(monthIndex, type, { category: category.id });\n setMenuOpen(false);\n }}\n items={[\n {\n name: 'copy-single-last',\n text: 'Copy last month’s budget',\n },\n {\n name: 'set-single-3-avg',\n text: 'Set to 3 month average',\n },\n {\n name: 'set-single-6-avg',\n text: 'Set to 6 month average',\n },\n {\n name: 'set-single-12-avg',\n text: 'Set to yearly average',\n },\n isGoalTemplatesEnabled && {\n name: 'apply-single-category-template',\n text: 'Apply budget template',\n },\n ]}\n />\n </Tooltip>\n )}\n </View>\n )}\n <SheetCell\n name=\"budget\"\n exposed={editing}\n focused={editing}\n width=\"flex\"\n onExpose={() => onEdit(category.id, monthIndex)}\n style={{ ...(editing && { zIndex: 100 }), ...styles.tnum }}\n textAlign=\"right\"\n valueStyle={{\n cursor: 'default',\n margin: 1,\n padding: '0 4px',\n borderRadius: 4,\n ':hover': {\n boxShadow: 'inset 0 0 0 1px ' + theme.mobileAccountShadow,\n backgroundColor: theme.tableBackground,\n },\n }}\n valueProps={{\n binding: reportBudget.catBudgeted(category.id),\n type: 'financial',\n getValueStyle: makeAmountGrey,\n formatExpr: expr => {\n return integerToCurrency(expr);\n },\n unformatExpr: expr => {\n return amountToInteger(evalArithmetic(expr, 0));\n },\n }}\n inputProps={{\n onBlur: () => {\n onEdit(null);\n },\n style: {\n backgroundColor: theme.tableBackground,\n },\n }}\n onSave={amount => {\n onBudgetAction(monthIndex, 'budget-amount', {\n category: category.id,\n amount,\n });\n }}\n />\n </View>\n <Field name=\"spent\" width=\"flex\" style={{ textAlign: 'right' }}>\n <span\n data-testid=\"category-month-spent\"\n onClick={() => onShowActivity(category.name, category.id, monthIndex)}\n >\n <CellValue\n binding={reportBudget.catSumAmount(category.id)}\n type=\"financial\"\n getStyle={makeAmountGrey}\n style={{\n cursor: 'pointer',\n ':hover': {\n textDecoration: 'underline',\n },\n }}\n />\n </span>\n </Field>\n\n {!category.is_income && (\n <Field\n name=\"balance\"\n truncate={false}\n width=\"flex\"\n style={{ paddingRight: styles.monthRightPadding, textAlign: 'right' }}\n >\n <span {...(category.is_income ? {} : balanceTooltip.getOpenEvents())}>\n <BalanceWithCarryover\n disabled={category.is_income}\n carryover={reportBudget.catCarryover(category.id)}\n balance={reportBudget.catBalance(category.id)}\n goal={reportBudget.catGoal(category.id)}\n budgeted={reportBudget.catBudgeted(category.id)}\n />\n </span>\n {balanceTooltip.isOpen && (\n <BalanceTooltip\n categoryId={category.id}\n tooltip={balanceTooltip}\n monthIndex={monthIndex}\n onBudgetAction={onBudgetAction}\n />\n )}\n </Field>\n )}\n </View>\n );\n});\n\nexport { BudgetSummary } from './budgetsummary/BudgetSummary';\n\nexport const ExpenseGroupMonth = GroupMonth;\nexport const ExpenseCategoryMonth = CategoryMonth;\n\nexport const IncomeGroupMonth = GroupMonth;\nexport const IncomeCategoryMonth = CategoryMonth;\n","// @ts-strict-ignore\nimport React, { type ReactNode, createContext, useContext } from 'react';\n\nimport * as monthUtils from 'loot-core/src/shared/months';\n\nconst Context = createContext(null);\n\ntype RolloverContextProps = {\n summaryCollapsed: boolean;\n onBudgetAction: (idx: number, action: string, arg?: unknown) => void;\n onToggleSummaryCollapse: () => void;\n children: ReactNode;\n};\nexport function RolloverContext({\n summaryCollapsed,\n onBudgetAction,\n onToggleSummaryCollapse,\n children,\n}: RolloverContextProps) {\n const currentMonth = monthUtils.currentMonth();\n\n return (\n <Context.Provider\n value={{\n currentMonth,\n summaryCollapsed,\n onBudgetAction,\n onToggleSummaryCollapse,\n }}\n >\n {children}\n </Context.Provider>\n );\n}\n\nexport function useRollover() {\n return useContext(Context);\n}\n","// @ts-strict-ignore\nimport React, { useState } from 'react';\n\nimport { css } from 'glamor';\n\nimport * as monthUtils from 'loot-core/src/shared/months';\n\nimport { SvgDotsHorizontalTriple } from '../../../../icons/v1';\nimport { SvgArrowButtonDown1, SvgArrowButtonUp1 } from '../../../../icons/v2';\nimport { theme, styles } from '../../../../style';\nimport { Button } from '../../../common/Button';\nimport { Menu } from '../../../common/Menu';\nimport { View } from '../../../common/View';\nimport { NotesButton } from '../../../NotesButton';\nimport { NamespaceContext } from '../../../spreadsheet/NamespaceContext';\nimport { Tooltip } from '../../../tooltips';\nimport { useRollover } from '../RolloverContext';\n\nimport { ToBudget } from './ToBudget';\nimport { TotalsList } from './TotalsList';\n\ntype BudgetSummaryProps = {\n month: string;\n isGoalTemplatesEnabled?: boolean;\n};\nexport function BudgetSummary({\n month,\n isGoalTemplatesEnabled,\n}: BudgetSummaryProps) {\n const {\n currentMonth,\n summaryCollapsed: collapsed,\n onBudgetAction,\n onToggleSummaryCollapse,\n } = useRollover();\n\n const [menuOpen, setMenuOpen] = useState(false);\n function onMenuOpen() {\n setMenuOpen(true);\n }\n\n function onMenuClose() {\n setMenuOpen(false);\n }\n\n const prevMonthName = monthUtils.format(monthUtils.prevMonth(month), 'MMM');\n\n const ExpandOrCollapseIcon = collapsed\n ? SvgArrowButtonDown1\n : SvgArrowButtonUp1;\n\n return (\n <View\n data-testid=\"budget-summary\"\n style={{\n backgroundColor: theme.tableBackground,\n boxShadow: styles.cardShadow,\n borderRadius: 6,\n marginLeft: 0,\n marginRight: 0,\n marginTop: 5,\n flex: 1,\n cursor: 'default',\n marginBottom: 5,\n overflow: 'hidden',\n '& .hover-visible': {\n opacity: 0,\n transition: 'opacity .25s',\n },\n '&:hover .hover-visible': {\n opacity: 1,\n },\n }}\n >\n <NamespaceContext.Provider value={monthUtils.sheetForMonth(month)}>\n <View\n style={{\n padding: '0 13px',\n ...(collapsed ? { margin: '10px 0' } : { marginTop: 16 }),\n }}\n >\n <View\n style={{\n position: 'absolute',\n left: 10,\n top: 0,\n }}\n >\n <Button\n type=\"bare\"\n aria-label={`${collapsed ? 'Expand' : 'Collapse'} month summary`}\n className=\"hover-visible\"\n onClick={onToggleSummaryCollapse}\n >\n <ExpandOrCollapseIcon\n width={13}\n height={13}\n // The margin is to make it the exact same size as the dots button\n style={{ color: theme.tableTextLight, margin: 1 }}\n />\n </Button>\n </View>\n\n <div\n className={`${css([\n {\n textAlign: 'center',\n marginTop: 3,\n fontSize: 18,\n fontWeight: 500,\n textDecorationSkip: 'ink',\n },\n currentMonth === month && { fontWeight: 'bold' },\n ])}`}\n >\n {monthUtils.format(month, 'MMMM')}\n </div>\n\n <View\n style={{\n position: 'absolute',\n right: 10,\n top: 0,\n flexDirection: 'row',\n alignItems: 'center',\n }}\n >\n <View>\n <NotesButton\n id={`budget-${month}`}\n width={15}\n height={15}\n tooltipPosition=\"bottom-right\"\n defaultColor={theme.tableTextLight}\n />\n </View>\n <View style={{ userSelect: 'none', marginLeft: 2 }}>\n <Button type=\"bare\" aria-label=\"Menu\" onClick={onMenuOpen}>\n <SvgDotsHorizontalTriple\n width={15}\n height={15}\n style={{ color: theme.pageTextLight }}\n />\n </Button>\n {menuOpen && (\n <Tooltip\n position=\"bottom-right\"\n width={200}\n style={{ padding: 0 }}\n onClose={onMenuClose}\n >\n <Menu\n onMenuSelect={type => {\n onMenuClose();\n onBudgetAction(month, type);\n }}\n items={[\n { name: 'copy-last', text: 'Copy last month’s budget' },\n { name: 'set-zero', text: 'Set budgets to zero' },\n {\n name: 'set-3-avg',\n text: 'Set budgets to 3 month average',\n },\n isGoalTemplatesEnabled && {\n name: 'check-templates',\n text: 'Check templates',\n },\n isGoalTemplatesEnabled && {\n name: 'apply-goal-template',\n text: 'Apply budget template',\n },\n isGoalTemplatesEnabled && {\n name: 'overwrite-goal-template',\n text: 'Overwrite with budget template',\n },\n isGoalTemplatesEnabled && {\n name: 'cleanup-goal-template',\n text: 'End of month cleanup',\n },\n ]}\n />\n </Tooltip>\n )}\n </View>\n </View>\n </View>\n\n {collapsed ? (\n <View\n style={{\n alignItems: 'center',\n padding: '10px 20px',\n justifyContent: 'space-between',\n backgroundColor: theme.tableBackground,\n borderTop: '1px solid ' + theme.tableBorder,\n }}\n >\n <ToBudget\n showTotalsTooltipOnHover={true}\n prevMonthName={prevMonthName}\n month={month}\n onBudgetAction={onBudgetAction}\n />\n </View>\n ) : (\n <>\n <TotalsList\n prevMonthName={prevMonthName}\n style={{\n padding: '5px 0',\n marginTop: 17,\n backgroundColor: theme.tableRowHeaderBackground,\n borderTopWidth: 1,\n borderBottomWidth: 1,\n borderColor: theme.tableBorder,\n }}\n />\n <View style={{ margin: '23px 0' }}>\n <ToBudget month={month} onBudgetAction={onBudgetAction} />\n </View>\n </>\n )}\n </NamespaceContext.Provider>\n </View>\n );\n}\n","// @ts-strict-ignore\nimport React, { memo, useState } from 'react';\n\nimport { rolloverBudget } from 'loot-core/src/client/queries';\nimport { evalArithmetic } from 'loot-core/src/shared/arithmetic';\nimport { integerToCurrency, amountToInteger } from 'loot-core/src/shared/util';\n\nimport { useFeatureFlag } from '../../../hooks/useFeatureFlag';\nimport { SvgCheveronDown } from '../../../icons/v1';\nimport { styles, theme, type CSSProperties } from '../../../style';\nimport { Button } from '../../common/Button';\nimport { Menu } from '../../common/Menu';\nimport { Text } from '../../common/Text';\nimport { View } from '../../common/View';\nimport { CellValue } from '../../spreadsheet/CellValue';\nimport { useFormat } from '../../spreadsheet/useFormat';\nimport { Row, Field, SheetCell } from '../../table';\nimport { Tooltip, useTooltip } from '../../tooltips';\nimport { BalanceWithCarryover } from '../BalanceWithCarryover';\nimport { makeAmountGrey } from '../util';\n\nimport { BalanceTooltip } from './BalanceTooltip';\n\nconst headerLabelStyle: CSSProperties = {\n flex: 1,\n padding: '0 5px',\n textAlign: 'right',\n};\n\nexport const BudgetTotalsMonth = memo(function BudgetTotalsMonth() {\n const format = useFormat();\n return (\n <View\n style={{\n flex: 1,\n flexDirection: 'row',\n marginRight: styles.monthRightPadding,\n paddingTop: 10,\n paddingBottom: 10,\n }}\n >\n <View style={headerLabelStyle}>\n <Text style={{ color: theme.tableHeaderText }}>Budgeted</Text>\n <CellValue\n binding={rolloverBudget.totalBudgeted}\n type=\"financial\"\n style={{ color: theme.tableHeaderText, fontWeight: 600 }}\n formatter={value => {\n return format(-parseFloat(value || '0'), 'financial');\n }}\n />\n </View>\n <View style={headerLabelStyle}>\n <Text style={{ color: theme.tableHeaderText }}>Spent</Text>\n <CellValue\n binding={rolloverBudget.totalSpent}\n type=\"financial\"\n style={{ color: theme.tableHeaderText, fontWeight: 600 }}\n />\n </View>\n <View style={headerLabelStyle}>\n <Text style={{ color: theme.tableHeaderText }}>Balance</Text>\n <CellValue\n binding={rolloverBudget.totalBalance}\n type=\"financial\"\n style={{ color: theme.tableHeaderText, fontWeight: 600 }}\n />\n </View>\n </View>\n );\n});\n\nexport function IncomeHeaderMonth() {\n return (\n <Row\n style={{\n color: theme.tableHeaderText,\n alignItems: 'center',\n paddingRight: 10,\n }}\n >\n <View style={{ flex: 1, textAlign: 'right' }}>Received</View>\n </Row>\n );\n}\n\ntype ExpenseGroupMonthProps = {\n group: { id: string };\n};\nexport const ExpenseGroupMonth = memo(function ExpenseGroupMonth({\n group,\n}: ExpenseGroupMonthProps) {\n const { id } = group;\n\n return (\n <View style={{ flex: 1, flexDirection: 'row' }}>\n <SheetCell\n name=\"budgeted\"\n width=\"flex\"\n textAlign=\"right\"\n style={{ fontWeight: 600, ...styles.tnum }}\n valueProps={{\n binding: rolloverBudget.groupBudgeted(id),\n type: 'financial',\n }}\n />\n <SheetCell\n name=\"spent\"\n width=\"flex\"\n textAlign=\"right\"\n style={{ fontWeight: 600, ...styles.tnum }}\n valueProps={{\n binding: rolloverBudget.groupSumAmount(id),\n type: 'financial',\n }}\n />\n <SheetCell\n name=\"balance\"\n width=\"flex\"\n textAlign=\"right\"\n style={{\n fontWeight: 600,\n paddingRight: styles.monthRightPadding,\n ...styles.tnum,\n }}\n valueProps={{\n binding: rolloverBudget.groupBalance(id),\n type: 'financial',\n privacyFilter: {\n style: {\n paddingRight: styles.monthRightPadding,\n },\n },\n }}\n />\n </View>\n );\n});\n\ntype ExpenseCategoryMonthProps = {\n monthIndex: number;\n category: { id: string; name: string; is_income: boolean };\n editing: boolean;\n onEdit: (id: string | null, idx?: number) => void;\n onBudgetAction: (idx: number, action: string, arg?: unknown) => void;\n onShowActivity: (name: string, id: string, idx: number) => void;\n};\nexport const ExpenseCategoryMonth = memo(function ExpenseCategoryMonth({\n monthIndex,\n category,\n editing,\n onEdit,\n onBudgetAction,\n onShowActivity,\n}: ExpenseCategoryMonthProps) {\n const balanceTooltip = useTooltip();\n const [menuOpen, setMenuOpen] = useState(false);\n const [hover, setHover] = useState(false);\n const isGoalTemplatesEnabled = useFeatureFlag('goalTemplatesEnabled');\n\n return (\n <View\n style={{\n flex: 1,\n flexDirection: 'row',\n '& .hover-visible': {\n opacity: 0,\n transition: 'opacity .25s',\n },\n '&:hover .hover-visible': {\n opacity: 1,\n },\n }}\n >\n <View\n style={{\n flex: 1,\n flexDirection: 'row',\n }}\n onMouseOverCapture={() => setHover(true)}\n onMouseLeave={() => {\n setHover(false);\n }}\n >\n {!editing && (hover || menuOpen) ? (\n <View\n style={{\n flexShrink: 1,\n paddingLeft: 3,\n justifyContent: 'center',\n borderTopWidth: 1,\n borderBottomWidth: 1,\n borderColor: theme.tableBorder,\n }}\n >\n <Button\n type=\"bare\"\n onClick={e => {\n e.stopPropagation();\n setMenuOpen(true);\n }}\n style={{\n padding: 3,\n }}\n >\n <SvgCheveronDown\n width={14}\n height={14}\n className=\"hover-visible\"\n style={menuOpen && { opacity: 1 }}\n />\n </Button>\n {menuOpen && (\n <Tooltip\n position=\"bottom-left\"\n width={200}\n style={{ padding: 0 }}\n onClose={() => setMenuOpen(false)}\n >\n <Menu\n onMenuSelect={type => {\n onBudgetAction(monthIndex, type, { category: category.id });\n setMenuOpen(false);\n }}\n items={[\n {\n name: 'copy-single-last',\n text: 'Copy last month’s budget',\n },\n {\n name: 'set-single-3-avg',\n text: 'Set to 3 month average',\n },\n {\n name: 'set-single-6-avg',\n text: 'Set to 6 month average',\n },\n {\n name: 'set-single-12-avg',\n text: 'Set to yearly average',\n },\n isGoalTemplatesEnabled && {\n name: 'apply-single-category-template',\n text: 'Apply budget template',\n },\n ]}\n />\n </Tooltip>\n )}\n </View>\n ) : null}\n <SheetCell\n name=\"budget\"\n exposed={editing}\n focused={editing}\n width=\"flex\"\n onExpose={() => onEdit(category.id, monthIndex)}\n style={{ ...(editing && { zIndex: 100 }), ...styles.tnum }}\n textAlign=\"right\"\n valueStyle={{\n cursor: 'default',\n margin: 1,\n padding: '0 4px',\n borderRadius: 4,\n ':hover': {\n boxShadow: 'inset 0 0 0 1px ' + theme.mobileAccountShadow,\n backgroundColor: theme.tableBackground,\n },\n }}\n valueProps={{\n binding: rolloverBudget.catBudgeted(category.id),\n type: 'financial',\n getValueStyle: makeAmountGrey,\n formatExpr: expr => {\n return integerToCurrency(expr);\n },\n unformatExpr: expr => {\n return amountToInteger(evalArithmetic(expr, 0));\n },\n }}\n inputProps={{\n onBlur: () => {\n onEdit(null);\n },\n style: {\n backgroundColor: theme.tableBackground,\n },\n }}\n onSave={amount => {\n onBudgetAction(monthIndex, 'budget-amount', {\n category: category.id,\n amount,\n });\n }}\n />\n </View>\n <Field name=\"spent\" width=\"flex\" style={{ textAlign: 'right' }}>\n <span\n data-testid=\"category-month-spent\"\n onClick={() => onShowActivity(category.name, category.id, monthIndex)}\n >\n <CellValue\n binding={rolloverBudget.catSumAmount(category.id)}\n type=\"financial\"\n getStyle={makeAmountGrey}\n style={{\n cursor: 'pointer',\n ':hover': { textDecoration: 'underline' },\n }}\n />\n </span>\n </Field>\n <Field\n name=\"balance\"\n truncate={false}\n width=\"flex\"\n style={{ paddingRight: styles.monthRightPadding, textAlign: 'right' }}\n >\n <span {...balanceTooltip.getOpenEvents()}>\n <BalanceWithCarryover\n carryover={rolloverBudget.catCarryover(category.id)}\n balance={rolloverBudget.catBalance(category.id)}\n goal={rolloverBudget.catGoal(category.id)}\n budgeted={rolloverBudget.catBudgeted(category.id)}\n />\n </span>\n {balanceTooltip.isOpen && (\n <BalanceTooltip\n categoryId={category.id}\n tooltip={balanceTooltip}\n monthIndex={monthIndex}\n onBudgetAction={onBudgetAction}\n />\n )}\n </Field>\n </View>\n );\n});\n\nexport function IncomeGroupMonth() {\n return (\n <View style={{ flex: 1 }}>\n <SheetCell\n name=\"received\"\n width=\"flex\"\n textAlign=\"right\"\n style={{\n fontWeight: 600,\n paddingRight: styles.monthRightPadding,\n ...styles.tnum,\n }}\n valueProps={{\n binding: rolloverBudget.groupIncomeReceived,\n type: 'financial',\n privacyFilter: {\n style: {\n paddingRight: styles.monthRightPadding,\n },\n },\n }}\n />\n </View>\n );\n}\n\ntype IncomeCategoryMonthProps = {\n category: { id: string; name: string };\n isLast: boolean;\n monthIndex: number;\n onShowActivity: (name: string, id: string, idx: number) => void;\n};\nexport function IncomeCategoryMonth({\n category,\n isLast,\n monthIndex,\n onShowActivity,\n}: IncomeCategoryMonthProps) {\n return (\n <View style={{ flex: 1 }}>\n <Field\n name=\"received\"\n width=\"flex\"\n style={{\n paddingRight: styles.monthRightPadding,\n textAlign: 'right',\n ...(isLast && { borderBottomWidth: 0 }),\n }}\n >\n <span\n onClick={() => onShowActivity(category.name, category.id, monthIndex)}\n >\n <CellValue\n binding={rolloverBudget.catSumAmount(category.id)}\n type=\"financial\"\n style={{\n cursor: 'pointer',\n ':hover': { textDecoration: 'underline' },\n }}\n />\n </span>\n </Field>\n </View>\n );\n}\n\nexport { BudgetSummary } from './budgetsummary/BudgetSummary';\n","// @ts-strict-ignore\nimport React, {\n memo,\n useContext,\n useMemo,\n useState,\n useEffect,\n useRef,\n} from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport {\n addNotification,\n applyBudgetAction,\n createCategory,\n createGroup,\n deleteCategory,\n deleteGroup,\n getCategories,\n loadPrefs,\n moveCategory,\n moveCategoryGroup,\n pushModal,\n updateCategory,\n updateGroup,\n} from 'loot-core/src/client/actions';\nimport { useSpreadsheet } from 'loot-core/src/client/SpreadsheetProvider';\nimport { send, listen } from 'loot-core/src/platform/client/fetch';\nimport * as monthUtils from 'loot-core/src/shared/months';\n\nimport { useCategories } from '../../hooks/useCategories';\nimport { useFeatureFlag } from '../../hooks/useFeatureFlag';\nimport { useGlobalPref } from '../../hooks/useGlobalPref';\nimport { useLocalPref } from '../../hooks/useLocalPref';\nimport { useNavigate } from '../../hooks/useNavigate';\nimport { styles } from '../../style';\nimport { View } from '../common/View';\nimport {\n SWITCH_BUDGET_MESSAGE_TYPE,\n TitlebarContext,\n type TitlebarContextValue,\n type TitlebarMessage,\n} from '../Titlebar';\n\nimport { DynamicBudgetTable } from './DynamicBudgetTable';\nimport * as report from './report/ReportComponents';\nimport { ReportProvider } from './report/ReportContext';\nimport * as rollover from './rollover/RolloverComponents';\nimport { RolloverContext } from './rollover/RolloverContext';\nimport { prewarmAllMonths, prewarmMonth, switchBudgetType } from './util';\n\ntype ReportComponents = {\n SummaryComponent: typeof report.BudgetSummary;\n ExpenseCategoryComponent: typeof report.ExpenseCategoryMonth;\n ExpenseGroupComponent: typeof report.ExpenseGroupMonth;\n IncomeCategoryComponent: typeof report.IncomeCategoryMonth;\n IncomeGroupComponent: typeof report.IncomeGroupMonth;\n BudgetTotalsComponent: typeof report.BudgetTotalsMonth;\n IncomeHeaderComponent: typeof report.IncomeHeaderMonth;\n};\n\ntype RolloverComponents = {\n SummaryComponent: typeof RolloverBudgetSummary;\n ExpenseCategoryComponent: typeof rollover.ExpenseCategoryMonth;\n ExpenseGroupComponent: typeof rollover.ExpenseGroupMonth;\n IncomeCategoryComponent: typeof rollover.IncomeCategoryMonth;\n IncomeGroupComponent: typeof rollover.IncomeGroupMonth;\n BudgetTotalsComponent: typeof rollover.BudgetTotalsMonth;\n IncomeHeaderComponent: typeof rollover.IncomeHeaderMonth;\n};\n\ntype BudgetProps = {\n accountId?: string;\n reportComponents: ReportComponents;\n rolloverComponents: RolloverComponents;\n titlebar: TitlebarContextValue;\n};\n\nfunction BudgetInner(props: BudgetProps) {\n const currentMonth = monthUtils.currentMonth();\n const tableRef = useRef(null);\n const spreadsheet = useSpreadsheet();\n const dispatch = useDispatch();\n const navigate = useNavigate();\n const [_startMonth, setBudgetStartMonthPref] =\n useLocalPref('budget.startMonth');\n const startMonth = _startMonth || currentMonth;\n const [summaryCollapsed, setSummaryCollapsedPref] = useLocalPref(\n 'budget.summaryCollapsed',\n );\n const [_budgetType] = useLocalPref('budgetType');\n const budgetType = _budgetType || 'rollover';\n const [_maxMonths] = useGlobalPref('maxMonths');\n const maxMonths = _maxMonths || 1;\n\n const [initialized, setInitialized] = useState(false);\n const [bounds, setBounds] = useState({\n start: currentMonth,\n end: currentMonth,\n });\n const { grouped: categoryGroups } = useCategories();\n\n function loadCategories() {\n dispatch(getCategories());\n }\n\n useEffect(() => {\n const { titlebar } = props;\n\n async function run() {\n loadCategories();\n\n const { start, end } = await send('get-budget-bounds');\n setBounds({ start, end });\n\n await prewarmAllMonths(\n budgetType,\n spreadsheet,\n { start, end },\n startMonth,\n );\n\n setInitialized(true);\n }\n\n run();\n\n const unlistens = [\n listen('sync-event', ({ type, tables }) => {\n if (\n type === 'success' &&\n (tables.includes('categories') ||\n tables.includes('category_mapping') ||\n tables.includes('category_groups'))\n ) {\n loadCategories();\n }\n }),\n\n listen('undo-event', ({ tables }) => {\n if (tableRef.current) {\n // g dammit\n // We need to clear the editing cell, otherwise when\n // the user navigates away from the page they will\n // accidentally clear the undo stack if they have pressed\n // undo, since the cell will save itself on blur (worst case:\n // undo takes you to another screen and then you can't redo\n // any of the budget changes)\n tableRef.current.clearEditing();\n }\n\n if (tables.includes('categories')) {\n loadCategories();\n }\n }),\n\n titlebar.subscribe(onTitlebarEvent),\n ];\n\n return () => {\n unlistens.forEach(unlisten => unlisten());\n };\n }, []);\n\n useEffect(() => {\n send('get-budget-bounds').then(({ start, end }) => {\n if (bounds.start !== start || bounds.end !== end) {\n setBounds({ start, end });\n }\n });\n }, [props.accountId]);\n\n const onMonthSelect = async (month, numDisplayed) => {\n setBudgetStartMonthPref(month);\n\n const warmingMonth = month;\n\n // We could be smarter about this, but this is a good start. We\n // optimize for the case where users press the left/right button\n // to move between months. This loads the month data all at once\n // and \"prewarms\" the spreadsheet cache. This uses a simple\n // heuristic that will fail if the user clicks an arbitrary month,\n // but it will just load in some unnecessary data.\n if (month < startMonth) {\n // pre-warm prev month\n await prewarmMonth(\n budgetType,\n spreadsheet,\n monthUtils.subMonths(month, 1),\n );\n } else if (month > startMonth) {\n // pre-warm next month\n await prewarmMonth(\n budgetType,\n spreadsheet,\n monthUtils.addMonths(month, numDisplayed),\n );\n }\n\n if (warmingMonth === month) {\n setBudgetStartMonthPref(month);\n }\n };\n\n const categoryNameAlreadyExistsNotification = name => {\n dispatch(\n addNotification({\n type: 'error',\n message: `Category ‘${name}’ already exists in group (May be Hidden)`,\n }),\n );\n };\n\n const onSaveCategory = async category => {\n const cats = await send('get-categories');\n const exists =\n cats.grouped\n .filter(g => g.id === category.cat_group)[0]\n .categories.filter(\n c => c.name.toUpperCase() === category.name.toUpperCase(),\n )\n .filter(c => (category.id === 'new' ? true : c.id !== category.id))\n .length > 0;\n\n if (exists) {\n categoryNameAlreadyExistsNotification(category.name);\n return;\n }\n\n if (category.id === 'new') {\n dispatch(\n createCategory(\n category.name,\n category.cat_group,\n category.is_income,\n category.hidden,\n ),\n );\n } else {\n dispatch(updateCategory(category));\n }\n };\n\n const onDeleteCategory = async id => {\n const mustTransfer = await send('must-category-transfer', { id });\n\n if (mustTransfer) {\n dispatch(\n pushModal('confirm-category-delete', {\n category: id,\n onDelete: transferCategory => {\n if (id !== transferCategory) {\n dispatch(deleteCategory(id, transferCategory));\n }\n },\n }),\n );\n } else {\n dispatch(deleteCategory(id));\n }\n };\n\n const onSaveGroup = group => {\n if (group.id === 'new') {\n dispatch(createGroup(group.name));\n } else {\n dispatch(updateGroup(group));\n }\n };\n\n const onDeleteGroup = async id => {\n const group = categoryGroups.find(g => g.id === id);\n\n let mustTransfer = false;\n for (const category of group.categories) {\n if (await send('must-category-transfer', { id: category.id })) {\n mustTransfer = true;\n break;\n }\n }\n\n if (mustTransfer) {\n dispatch(\n pushModal('confirm-category-delete', {\n group: id,\n onDelete: transferCategory => {\n dispatch(deleteGroup(id, transferCategory));\n },\n }),\n );\n } else {\n dispatch(deleteGroup(id));\n }\n };\n\n const onBudgetAction = (month, type, args) => {\n dispatch(applyBudgetAction(month, type, args));\n };\n\n const onShowActivity = (categoryName, categoryId, month) => {\n navigate('/accounts', {\n state: {\n goBack: true,\n filterName: `${categoryName} (${monthUtils.format(\n month,\n 'MMMM yyyy',\n )})`,\n filter: {\n category: categoryId,\n date: { $transform: '$month', $eq: month },\n },\n },\n });\n };\n\n const onReorderCategory = async sortInfo => {\n const cats = await send('get-categories');\n const moveCandidate = cats.list.filter(c => c.id === sortInfo.id)[0];\n const exists =\n cats.grouped\n .filter(g => g.id === sortInfo.groupId)[0]\n .categories.filter(\n c => c.name.toUpperCase() === moveCandidate.name.toUpperCase(),\n )\n .filter(c => c.id !== moveCandidate.id).length > 0;\n\n if (exists) {\n categoryNameAlreadyExistsNotification(moveCandidate.name);\n return;\n }\n\n dispatch(moveCategory(sortInfo.id, sortInfo.groupId, sortInfo.targetId));\n };\n\n const onReorderGroup = async sortInfo => {\n dispatch(moveCategoryGroup(sortInfo.id, sortInfo.targetId));\n };\n\n const onToggleCollapse = () => {\n setSummaryCollapsedPref(!summaryCollapsed);\n };\n\n const onTitlebarEvent = async ({ type, payload }: TitlebarMessage) => {\n switch (type) {\n case SWITCH_BUDGET_MESSAGE_TYPE: {\n await switchBudgetType(\n payload.newBudgetType,\n spreadsheet,\n bounds,\n startMonth,\n async () => {\n dispatch(loadPrefs());\n },\n );\n break;\n }\n default:\n }\n };\n\n const { reportComponents, rolloverComponents } = props;\n\n if (!initialized || !categoryGroups) {\n return null;\n }\n\n let table;\n if (budgetType === 'report') {\n table = (\n <ReportProvider\n summaryCollapsed={summaryCollapsed}\n onBudgetAction={onBudgetAction}\n onToggleSummaryCollapse={onToggleCollapse}\n >\n <DynamicBudgetTable\n ref={tableRef}\n type={budgetType}\n prewarmStartMonth={startMonth}\n startMonth={startMonth}\n monthBounds={bounds}\n maxMonths={maxMonths}\n dataComponents={reportComponents}\n onMonthSelect={onMonthSelect}\n onDeleteCategory={onDeleteCategory}\n onDeleteGroup={onDeleteGroup}\n onSaveCategory={onSaveCategory}\n onSaveGroup={onSaveGroup}\n onBudgetAction={onBudgetAction}\n onShowActivity={onShowActivity}\n onReorderCategory={onReorderCategory}\n onReorderGroup={onReorderGroup}\n />\n </ReportProvider>\n );\n } else {\n table = (\n <RolloverContext\n summaryCollapsed={summaryCollapsed}\n onBudgetAction={onBudgetAction}\n onToggleSummaryCollapse={onToggleCollapse}\n >\n <DynamicBudgetTable\n ref={tableRef}\n type={budgetType}\n prewarmStartMonth={startMonth}\n startMonth={startMonth}\n monthBounds={bounds}\n maxMonths={maxMonths}\n dataComponents={rolloverComponents}\n onMonthSelect={onMonthSelect}\n onDeleteCategory={onDeleteCategory}\n onDeleteGroup={onDeleteGroup}\n onSaveCategory={onSaveCategory}\n onSaveGroup={onSaveGroup}\n onBudgetAction={onBudgetAction}\n onShowActivity={onShowActivity}\n onReorderCategory={onReorderCategory}\n onReorderGroup={onReorderGroup}\n />\n </RolloverContext>\n );\n }\n\n return <View style={{ flex: 1 }}>{table}</View>;\n}\n\nconst RolloverBudgetSummary = memo<{ month: string }>(props => {\n const isGoalTemplatesEnabled = useFeatureFlag('goalTemplatesEnabled');\n return (\n <rollover.BudgetSummary\n {...props}\n isGoalTemplatesEnabled={isGoalTemplatesEnabled}\n />\n );\n});\n\nRolloverBudgetSummary.displayName = 'RolloverBudgetSummary';\n\nexport function Budget() {\n const titlebar = useContext(TitlebarContext);\n\n const reportComponents = useMemo<ReportComponents>(\n () => ({\n SummaryComponent: report.BudgetSummary,\n ExpenseCategoryComponent: report.ExpenseCategoryMonth,\n ExpenseGroupComponent: report.ExpenseGroupMonth,\n IncomeCategoryComponent: report.IncomeCategoryMonth,\n IncomeGroupComponent: report.IncomeGroupMonth,\n BudgetTotalsComponent: report.BudgetTotalsMonth,\n IncomeHeaderComponent: report.IncomeHeaderMonth,\n }),\n [report],\n );\n\n const rolloverComponents = useMemo<RolloverComponents>(\n () => ({\n SummaryComponent: RolloverBudgetSummary,\n ExpenseCategoryComponent: rollover.ExpenseCategoryMonth,\n ExpenseGroupComponent: rollover.ExpenseGroupMonth,\n IncomeCategoryComponent: rollover.IncomeCategoryMonth,\n IncomeGroupComponent: rollover.IncomeGroupMonth,\n BudgetTotalsComponent: rollover.BudgetTotalsMonth,\n IncomeHeaderComponent: rollover.IncomeHeaderMonth,\n }),\n [rollover],\n );\n\n // In a previous iteration, the wrapper needs `overflow: hidden` for\n // some reason. Without it at certain dimensions the width/height\n // that autosizer gives us is slightly wrong, causing scrollbars to\n // appear. We might not need it anymore?\n return (\n <View\n style={{\n ...styles.page,\n paddingLeft: 8,\n paddingRight: 8,\n overflow: 'hidden',\n }}\n >\n <BudgetInner\n reportComponents={reportComponents}\n rolloverComponents={rolloverComponents}\n titlebar={titlebar}\n />\n </View>\n );\n}\n","import React, { useState } from 'react';\n\nimport { useSchedules } from 'loot-core/src/client/data-hooks/schedules';\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport { type ScheduleEntity } from 'loot-core/src/types/models';\n\nimport { useActions } from '../../hooks/useActions';\nimport { theme } from '../../style';\nimport { Button } from '../common/Button';\nimport { Search } from '../common/Search';\nimport { View } from '../common/View';\nimport { Page } from '../Page';\n\nimport { SchedulesTable, type ScheduleItemAction } from './SchedulesTable';\n\nexport function Schedules() {\n const { pushModal } = useActions();\n const [filter, setFilter] = useState('');\n\n const scheduleData = useSchedules();\n\n if (scheduleData == null) {\n return null;\n }\n\n const { schedules, statuses } = scheduleData;\n\n function onEdit(id: ScheduleEntity['id']) {\n pushModal('schedule-edit', { id });\n }\n\n function onAdd() {\n pushModal('schedule-edit');\n }\n\n function onDiscover() {\n pushModal('schedules-discover');\n }\n\n async function onAction(name: ScheduleItemAction, id: ScheduleEntity['id']) {\n switch (name) {\n case 'post-transaction':\n await send('schedule/post-transaction', { id });\n break;\n case 'skip':\n await send('schedule/skip-next-date', { id });\n break;\n case 'complete':\n await send('schedule/update', {\n schedule: { id, completed: true },\n });\n break;\n case 'restart':\n await send('schedule/update', {\n schedule: { id, completed: false },\n resetNextDate: true,\n });\n break;\n case 'delete':\n await send('schedule/delete', { id });\n break;\n default:\n }\n }\n\n return (\n <Page title=\"Schedules\">\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n padding: '0 0 15px',\n }}\n >\n <View\n style={{\n flex: 1,\n flexDirection: 'row',\n justifyContent: 'flex-end',\n }}\n >\n <Search\n placeholder=\"Filter schedules…\"\n value={filter}\n onChange={setFilter}\n />\n </View>\n </View>\n\n <SchedulesTable\n schedules={schedules}\n filter={filter}\n statuses={statuses}\n allowCompleted={true}\n onSelect={onEdit}\n onAction={onAction}\n style={{ backgroundColor: theme.tableBackground }}\n />\n\n <View\n style={{\n flexDirection: 'row',\n justifyContent: 'space-between',\n margin: '20px 0',\n flexShrink: 0,\n }}\n >\n <Button onClick={onDiscover}>Find schedules</Button>\n <Button type=\"primary\" onClick={onAdd}>\n Add new schedule\n </Button>\n </View>\n </Page>\n );\n}\n","import React from 'react';\n\nimport { Modal } from '../common/Modal';\nimport { Paragraph } from '../common/Paragraph';\nimport { View } from '../common/View';\n\nexport function GoCardlessLink() {\n window.close();\n\n return (\n <Modal isCurrent={true} showClose={false} title=\"Account sync\">\n {() => (\n <View style={{ maxWidth: 500 }}>\n <Paragraph>Please wait...</Paragraph>\n <Paragraph>\n The window should close automatically. If nothing happened you can\n close this window or tab.\n </Paragraph>\n </View>\n )}\n </Modal>\n );\n}\n","import React, {\n createContext,\n createElement,\n createRef,\n forwardRef,\n memo,\n useState,\n useRef,\n useMemo,\n useCallback,\n useLayoutEffect,\n useEffect,\n useContext,\n useReducer,\n} from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\n\nimport {\n format as formatDate,\n parseISO,\n isValid as isDateValid,\n} from 'date-fns';\n\nimport { useCachedSchedules } from 'loot-core/src/client/data-hooks/schedules';\nimport {\n getAccountsById,\n getPayeesById,\n getCategoriesById,\n} from 'loot-core/src/client/reducers/queries';\nimport { evalArithmetic } from 'loot-core/src/shared/arithmetic';\nimport { currentDay } from 'loot-core/src/shared/months';\nimport { getScheduledAmount } from 'loot-core/src/shared/schedules';\nimport {\n splitTransaction,\n updateTransaction,\n deleteTransaction,\n addSplitTransaction,\n groupTransaction,\n ungroupTransactions,\n} from 'loot-core/src/shared/transactions';\nimport {\n integerToCurrency,\n amountToInteger,\n titleFirst,\n} from 'loot-core/src/shared/util';\n\nimport { useMergedRefs } from '../../hooks/useMergedRefs';\nimport { usePrevious } from '../../hooks/usePrevious';\nimport { useSelectedDispatch, useSelectedItems } from '../../hooks/useSelected';\nimport { SvgLeftArrow2, SvgRightArrow2 } from '../../icons/v0';\nimport { SvgArrowDown, SvgArrowUp, SvgCheveronDown } from '../../icons/v1';\nimport {\n SvgArrowsSynchronize,\n SvgCalendar,\n SvgHyperlink2,\n} from '../../icons/v2';\nimport { styles, theme } from '../../style';\nimport { AccountAutocomplete } from '../autocomplete/AccountAutocomplete';\nimport { CategoryAutocomplete } from '../autocomplete/CategoryAutocomplete';\nimport { PayeeAutocomplete } from '../autocomplete/PayeeAutocomplete';\nimport { Button } from '../common/Button';\nimport { Text } from '../common/Text';\nimport { View } from '../common/View';\nimport { getStatusProps } from '../schedules/StatusBadge';\nimport { DateSelect } from '../select/DateSelect';\nimport {\n Cell,\n Field,\n Row,\n InputCell,\n SelectCell,\n DeleteCell,\n CustomCell,\n CellButton,\n useTableNavigator,\n Table,\n UnexposedCellContent,\n} from '../table';\nimport { Tooltip } from '../tooltips';\n\nfunction getDisplayValue(obj, name) {\n return obj ? obj[name] : '';\n}\n\nfunction serializeTransaction(transaction, showZeroInDeposit) {\n let { amount, date } = transaction;\n\n if (isPreviewId(transaction.id)) {\n amount = (transaction._inverse ? -1 : 1) * getScheduledAmount(amount);\n }\n\n let debit = amount < 0 ? -amount : null;\n let credit = amount > 0 ? amount : null;\n\n if (amount === 0) {\n if (showZeroInDeposit) {\n credit = 0;\n } else {\n debit = 0;\n }\n }\n\n // Validate the date format\n if (!isDateValid(parseISO(date))) {\n // Be a little forgiving if the date isn't valid. This at least\n // stops the UI from crashing, but this is a serious problem with\n // the data. This allows the user to go through and see empty\n // dates and manually fix them.\n date = null;\n }\n\n return {\n ...transaction,\n date,\n debit: debit != null ? integerToCurrency(debit) : '',\n credit: credit != null ? integerToCurrency(credit) : '',\n };\n}\n\nfunction deserializeTransaction(transaction, originalTransaction) {\n const { debit, credit, date: originalDate, ...realTransaction } = transaction;\n\n let amount;\n if (debit !== '') {\n const parsed = evalArithmetic(debit, null);\n amount = parsed != null ? -parsed : null;\n } else {\n amount = evalArithmetic(credit, null);\n }\n\n amount =\n amount != null ? amountToInteger(amount) : originalTransaction.amount;\n\n let date = originalDate;\n if (date == null) {\n date = originalTransaction.date || currentDay();\n }\n\n return { ...realTransaction, date, amount };\n}\n\nfunction isLastChild(transactions, index) {\n const trans = transactions[index];\n return (\n trans &&\n trans.is_child &&\n (transactions[index + 1] == null ||\n transactions[index + 1].parent_id !== trans.parent_id)\n );\n}\n\nconst SplitsExpandedContext = createContext(null);\n\nexport function useSplitsExpanded() {\n const data = useContext(SplitsExpandedContext);\n\n return useMemo(\n () => ({\n ...data,\n expanded: id =>\n data.state.mode === 'collapse'\n ? !data.state.ids.has(id)\n : data.state.ids.has(id),\n }),\n [data],\n );\n}\n\nexport function SplitsExpandedProvider({ children, initialMode = 'expand' }) {\n const cachedState = useSelector(state => state.app.lastSplitState);\n const reduxDispatch = useDispatch();\n\n const [state, dispatch] = useReducer(\n (state, action) => {\n switch (action.type) {\n case 'toggle-split': {\n const ids = new Set([...state.ids]);\n const { id } = action;\n if (ids.has(id)) {\n ids.delete(id);\n } else {\n ids.add(id);\n }\n return { ...state, ids };\n }\n case 'open-split': {\n const ids = new Set([...state.ids]);\n const { id } = action;\n if (state.mode === 'collapse') {\n ids.delete(id);\n } else {\n ids.add(id);\n }\n return { ...state, ids };\n }\n case 'set-mode': {\n return {\n ...state,\n mode: action.mode,\n ids: new Set(),\n transitionId: null,\n };\n }\n case 'switch-mode':\n if (state.transitionId != null) {\n // You can only transition once at a time\n return state;\n }\n\n return {\n ...state,\n mode: state.mode === 'expand' ? 'collapse' : 'expand',\n transitionId: action.id,\n ids: new Set(),\n };\n case 'finish-switch-mode':\n return { ...state, transitionId: null };\n default:\n throw new Error('Unknown action type: ' + action.type);\n }\n },\n cachedState.current || { ids: new Set(), mode: initialMode },\n );\n\n useEffect(() => {\n if (state.transitionId != null) {\n // This timeout allows animations to finish\n setTimeout(() => {\n dispatch({ type: 'finish-switch-mode' });\n }, 250);\n }\n }, [state.transitionId]);\n\n useEffect(() => {\n // In a finished state, cache the state\n if (state.transitionId == null) {\n reduxDispatch({ type: 'SET_LAST_SPLIT_STATE', splitState: state });\n }\n }, [state]);\n\n const value = useMemo(() => ({ state, dispatch }), [state, dispatch]);\n\n return (\n <SplitsExpandedContext.Provider value={value}>\n {children}\n </SplitsExpandedContext.Provider>\n );\n}\n\nfunction selectAscDesc(field, ascDesc, clicked, defaultAscDesc = 'asc') {\n return field === clicked\n ? ascDesc === 'asc'\n ? 'desc'\n : 'asc'\n : defaultAscDesc;\n}\n\nconst TransactionHeader = memo(\n ({\n hasSelected,\n showAccount,\n showCategory,\n showBalance,\n showCleared,\n scrollWidth,\n onSort,\n ascDesc,\n field,\n }) => {\n const dispatchSelected = useSelectedDispatch();\n\n return (\n <Row\n style={{\n fontWeight: 300,\n zIndex: 200,\n color: theme.tableHeaderText,\n backgroundColor: theme.tableBackground,\n }}\n >\n <SelectCell\n exposed={true}\n focused={false}\n selected={hasSelected}\n width={20}\n onSelect={e => dispatchSelected({ type: 'select-all', event: e })}\n />\n <HeaderCell\n value=\"Date\"\n width={110}\n alignItems=\"flex\"\n marginLeft={-5}\n id=\"date\"\n icon={field === 'date' ? ascDesc : 'clickable'}\n onClick={() =>\n onSort('date', selectAscDesc(field, ascDesc, 'date', 'desc'))\n }\n />\n {showAccount && (\n <HeaderCell\n value=\"Account\"\n width=\"flex\"\n alignItems=\"flex\"\n marginLeft={-5}\n id=\"account\"\n icon={field === 'account' ? ascDesc : 'clickable'}\n onClick={() =>\n onSort('account', selectAscDesc(field, ascDesc, 'account', 'asc'))\n }\n />\n )}\n <HeaderCell\n value=\"Payee\"\n width=\"flex\"\n alignItems=\"flex\"\n marginLeft={-5}\n id=\"payee\"\n icon={field === 'payee' ? ascDesc : 'clickable'}\n onClick={() =>\n onSort('payee', selectAscDesc(field, ascDesc, 'payee', 'asc'))\n }\n />\n <HeaderCell\n value=\"Notes\"\n width=\"flex\"\n alignItems=\"flex\"\n marginLeft={-5}\n id=\"notes\"\n icon={field === 'notes' ? ascDesc : 'clickable'}\n onClick={() =>\n onSort('notes', selectAscDesc(field, ascDesc, 'notes', 'asc'))\n }\n />\n {showCategory && (\n <HeaderCell\n value=\"Category\"\n width=\"flex\"\n alignItems=\"flex\"\n marginLeft={-5}\n id=\"category\"\n icon={field === 'category' ? ascDesc : 'clickable'}\n onClick={() =>\n onSort(\n 'category',\n selectAscDesc(field, ascDesc, 'category', 'asc'),\n )\n }\n />\n )}\n <HeaderCell\n value=\"Payment\"\n width={90}\n alignItems=\"flex-end\"\n marginRight={-5}\n id=\"payment\"\n icon={field === 'payment' ? ascDesc : 'clickable'}\n onClick={() =>\n onSort('payment', selectAscDesc(field, ascDesc, 'payment', 'asc'))\n }\n />\n <HeaderCell\n value=\"Deposit\"\n width={85}\n alignItems=\"flex-end\"\n marginRight={-5}\n id=\"deposit\"\n icon={field === 'deposit' ? ascDesc : 'clickable'}\n onClick={() =>\n onSort('deposit', selectAscDesc(field, ascDesc, 'deposit', 'desc'))\n }\n />\n {showBalance && <Cell value=\"Balance\" width={88} textAlign=\"right\" />}\n\n {showCleared && (\n <HeaderCell\n value=\"✓\"\n width={23}\n alignItems=\"center\"\n id=\"cleared\"\n icon={field === 'cleared' ? ascDesc : 'clickable'}\n onClick={() => {\n onSort(\n 'cleared',\n selectAscDesc(field, ascDesc, 'cleared', 'asc'),\n );\n }}\n />\n )}\n\n <Cell value=\"\" width={5 + (scrollWidth ?? 0)} />\n </Row>\n );\n },\n);\n\nTransactionHeader.displayName = 'TransactionHeader';\n\nfunction getPayeePretty(transaction, payee, transferAcct) {\n const { payee: payeeId } = transaction;\n\n if (transferAcct) {\n return (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n }}\n >\n <div\n style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {transferAcct.name}\n </div>\n </View>\n );\n } else if (payee) {\n return payee.name;\n } else if (payeeId && payeeId.startsWith('new:')) {\n return payeeId.slice('new:'.length);\n }\n\n return '';\n}\n\nfunction StatusCell({\n id,\n focused,\n selected,\n status,\n isChild,\n onEdit,\n onUpdate,\n}) {\n const isClearedField =\n status === 'cleared' || status === 'reconciled' || status == null;\n const statusProps = getStatusProps(status);\n\n const statusColor =\n status === 'cleared'\n ? theme.noticeTextLight\n : status === 'reconciled'\n ? theme.noticeTextLight\n : status === 'missed'\n ? theme.errorText\n : status === 'due'\n ? theme.warningText\n : selected\n ? theme.pageTextLinkLight\n : theme.pageTextSubdued;\n\n function onSelect() {\n if (isClearedField) {\n onUpdate('cleared', !(status === 'cleared'));\n }\n }\n\n return (\n <Cell\n name=\"cleared\"\n width={23}\n focused={focused}\n style={{ padding: 1 }}\n plain\n >\n <CellButton\n style={{\n padding: 3,\n backgroundColor: 'transparent',\n border: '1px solid transparent',\n borderRadius: 50,\n ':focus': {\n border: '1px solid ' + theme.formInputBorderSelected,\n boxShadow: '0 1px 2px ' + theme.formInputBorderSelected,\n },\n cursor: isClearedField ? 'pointer' : 'default',\n ...(isChild && { visibility: 'hidden' }),\n }}\n onEdit={() => onEdit(id, 'cleared')}\n onSelect={onSelect}\n >\n {createElement(statusProps.Icon, {\n style: {\n width: 13,\n height: 13,\n color: statusColor,\n marginTop: status === 'due' ? -1 : 0,\n },\n })}\n </CellButton>\n </Cell>\n );\n}\n\nfunction HeaderCell({\n value,\n id,\n width,\n alignItems,\n marginLeft,\n marginRight,\n icon,\n onClick,\n}) {\n return (\n <CustomCell\n width={width}\n name={id}\n alignItems={alignItems}\n unexposedContent={\n <Button\n type=\"bare\"\n onClick={onClick}\n style={{\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n color: theme.tableHeaderText,\n fontWeight: 300,\n marginLeft,\n marginRight,\n }}\n >\n <UnexposedCellContent value={value} />\n {icon === 'asc' && (\n <SvgArrowDown width={10} height={10} style={{ marginLeft: 5 }} />\n )}\n {icon === 'desc' && (\n <SvgArrowUp width={10} height={10} style={{ marginLeft: 5 }} />\n )}\n </Button>\n }\n />\n );\n}\n\nfunction PayeeCell({\n id,\n payeeId,\n accountId,\n focused,\n inherited,\n payees,\n accounts,\n valueStyle,\n transaction,\n payee,\n transferAcct,\n isPreview,\n onEdit,\n onUpdate,\n onCreatePayee,\n onManagePayees,\n onNavigateToTransferAccount,\n onNavigateToSchedule,\n}) {\n const isCreatingPayee = useRef(false);\n\n // Filter out the account we're currently in as it is not a valid transfer\n accounts = accounts.filter(account => account.id !== accountId);\n payees = payees.filter(payee => payee.transfer_acct !== accountId);\n\n return (\n <CustomCell\n width=\"flex\"\n name=\"payee\"\n textAlign=\"flex\"\n value={payeeId}\n valueStyle={{\n ...valueStyle,\n ...(inherited && { color: theme.tableTextInactive }),\n }}\n exposed={focused}\n onExpose={name => !isPreview && onEdit(id, name)}\n onUpdate={async value => {\n onUpdate('payee', value);\n\n if (value && value.startsWith('new:') && !isCreatingPayee.current) {\n isCreatingPayee.current = true;\n const id = await onCreatePayee(value.slice('new:'.length));\n onUpdate('payee', id);\n isCreatingPayee.current = false;\n }\n }}\n unexposedContent={\n <>\n <PayeeIcons\n transaction={transaction}\n transferAccount={transferAcct}\n onNavigateToTransferAccount={onNavigateToTransferAccount}\n onNavigateToSchedule={onNavigateToSchedule}\n />\n <UnexposedCellContent\n value={payeeId}\n formatter={() => getPayeePretty(transaction, payee, transferAcct)}\n />\n </>\n }\n >\n {({\n onBlur,\n onKeyDown,\n onUpdate,\n onSave,\n shouldSaveFromKey,\n inputStyle,\n }) => {\n return (\n <PayeeAutocomplete\n payees={payees}\n accounts={accounts}\n value={payeeId}\n shouldSaveFromKey={shouldSaveFromKey}\n inputProps={{\n onBlur,\n onKeyDown,\n style: inputStyle,\n }}\n showManagePayees={true}\n tableBehavior={true}\n focused={true}\n onUpdate={onUpdate}\n onSelect={onSave}\n onManagePayees={() => onManagePayees(payeeId)}\n isCreatable\n menuPortalTarget={undefined}\n />\n );\n }}\n </CustomCell>\n );\n}\n\nfunction PayeeIcons({\n transaction,\n transferAccount,\n onNavigateToTransferAccount,\n onNavigateToSchedule,\n children,\n}) {\n const scheduleId = transaction.schedule;\n const scheduleData = useCachedSchedules();\n const schedule = scheduleData\n ? scheduleData.schedules.find(s => s.id === scheduleId)\n : null;\n\n if (schedule == null && transferAccount == null) {\n // Neither a valid scheduled transaction nor a transfer.\n return children;\n }\n\n const buttonStyle = {\n marginLeft: -5,\n marginRight: 2,\n width: 23,\n height: 23,\n color: 'inherit',\n };\n\n const scheduleIconStyle = { width: 13, height: 13 };\n\n const transferIconStyle = { width: 10, height: 10 };\n\n const recurring = schedule && schedule._date && !!schedule._date.frequency;\n\n return (\n <>\n {schedule && (\n <Button\n type=\"bare\"\n style={buttonStyle}\n onClick={e => {\n e.stopPropagation();\n onNavigateToSchedule(scheduleId);\n }}\n >\n {recurring ? (\n <SvgArrowsSynchronize style={scheduleIconStyle} />\n ) : (\n <SvgCalendar style={scheduleIconStyle} />\n )}\n </Button>\n )}\n {transferAccount && (\n <Button\n type=\"bare\"\n aria-label=\"Transfer\"\n style={buttonStyle}\n onClick={e => {\n e.stopPropagation();\n if (!isTemporaryId(transaction.id)) {\n onNavigateToTransferAccount(transferAccount.id);\n }\n }}\n >\n {(transaction._inverse ? -1 : 1) * transaction.amount > 0 ? (\n <SvgLeftArrow2 style={transferIconStyle} />\n ) : (\n <SvgRightArrow2 style={transferIconStyle} />\n )}\n </Button>\n )}\n </>\n );\n}\n\nconst Transaction = memo(function Transaction(props) {\n const {\n transaction: originalTransaction,\n subtransactions,\n editing,\n showAccount,\n showBalance,\n showCleared,\n showZeroInDeposit,\n style,\n selected,\n highlighted,\n added,\n matched,\n expanded,\n inheritedFields,\n focusedField,\n categoryGroups,\n payees,\n accounts,\n balance,\n dateFormat = 'MM/dd/yyyy',\n hideFraction,\n onSave,\n onEdit,\n onDelete,\n onSplit,\n onManagePayees,\n onCreatePayee,\n onToggleSplit,\n onNavigateToTransferAccount,\n onNavigateToSchedule,\n } = props;\n\n const dispatchSelected = useSelectedDispatch();\n\n const [prevShowZero, setPrevShowZero] = useState(showZeroInDeposit);\n const [prevTransaction, setPrevTransaction] = useState(originalTransaction);\n const [transaction, setTransaction] = useState(() =>\n serializeTransaction(originalTransaction, showZeroInDeposit),\n );\n const isPreview = isPreviewId(transaction.id);\n\n if (\n originalTransaction !== prevTransaction ||\n showZeroInDeposit !== prevShowZero\n ) {\n setTransaction(\n serializeTransaction(originalTransaction, showZeroInDeposit),\n );\n setPrevTransaction(originalTransaction);\n setPrevShowZero(showZeroInDeposit);\n }\n\n const [showReconciliationWarning, setShowReconciliationWarning] =\n useState(false);\n\n function onUpdate(name, value) {\n // Had some issues with this is called twice which is a problem now that we are showing a warning\n // modal is the transaction is locked. I added a boolean to guard against showing the modal twice.\n // I'm still not completely happy with how the cells update pre/post modal. Sometimes you have to\n // click off of the cell manually after confirming your change post modal for example. The last\n // row seems to have more issues than others but the combination of tab, return, and clicking out\n // of the cell all have different implications as well.\n\n if (transaction[name] !== value) {\n if (\n transaction.reconciled === true &&\n (name === 'credit' ||\n name === 'debit' ||\n name === 'payee' ||\n name === 'account' ||\n name === 'date')\n ) {\n if (showReconciliationWarning === false) {\n setShowReconciliationWarning(true);\n props.pushModal('confirm-transaction-edit', {\n onConfirm: () => {\n setShowReconciliationWarning(false);\n onUpdateAfterConfirm(name, value);\n },\n confirmReason: 'editReconciled',\n });\n }\n } else {\n onUpdateAfterConfirm(name, value);\n }\n }\n\n // Allow un-reconciling (unlocking) transactions\n if (name === 'cleared' && transaction.reconciled) {\n props.pushModal('confirm-transaction-edit', {\n onConfirm: () => {\n onUpdateAfterConfirm('reconciled', false);\n },\n confirmReason: 'unlockReconciled',\n });\n }\n }\n\n function onUpdateAfterConfirm(name, value) {\n const newTransaction = { ...transaction, [name]: value };\n\n // Don't change the note to an empty string if it's null (since they are both rendered the same)\n if (name === 'note' && value === '' && transaction.note == null) {\n return;\n }\n\n if (\n name === 'account' &&\n value &&\n getAccountsById(accounts)[value].offbudget\n ) {\n newTransaction.category = null;\n }\n\n // If entering an amount in either of the credit/debit fields, we\n // need to clear out the other one so it's always properly\n // translated into the desired amount (see\n // `deserializeTransaction`)\n if (name === 'credit') {\n newTransaction['debit'] = '';\n } else if (name === 'debit') {\n newTransaction['credit'] = '';\n }\n\n if (name === 'account' && transaction.account !== value) {\n newTransaction.reconciled = false;\n }\n\n // Don't save a temporary value (a new payee) which will be\n // filled in with a real id later\n if (name === 'payee' && value && value.startsWith('new:')) {\n setTransaction(newTransaction);\n } else {\n const deserialized = deserializeTransaction(\n newTransaction,\n originalTransaction,\n );\n // Run the transaction through the formatting so that we know\n // it's always showing the formatted result\n setTransaction(serializeTransaction(deserialized, showZeroInDeposit));\n\n onSave(deserialized, subtransactions);\n }\n }\n\n const {\n id,\n amount,\n debit,\n credit,\n payee: payeeId,\n imported_payee: importedPayee,\n notes,\n date,\n account: accountId,\n category: categoryId,\n cleared,\n reconciled,\n is_parent: isParent,\n _unmatched = false,\n _inverse = false,\n } = transaction;\n\n // Join in some data\n const payee = payees && payeeId && getPayeesById(payees)[payeeId];\n const account = accounts && accountId && getAccountsById(accounts)[accountId];\n let transferAcct;\n\n if (_inverse) {\n transferAcct =\n accounts && accountId && getAccountsById(accounts)[accountId];\n } else {\n transferAcct =\n payee &&\n payee.transfer_acct &&\n getAccountsById(accounts)[payee.transfer_acct];\n }\n\n const isChild = transaction.is_child;\n const isBudgetTransfer = transferAcct && transferAcct.offbudget === 0;\n const isOffBudget = account && account.offbudget === 1;\n\n const valueStyle = added ? { fontWeight: 600 } : null;\n const backgroundFocus = focusedField === 'select';\n const amountStyle = hideFraction ? { letterSpacing: -0.5 } : null;\n\n const runningBalance = !isTemporaryId(id)\n ? balance\n : balance + (_inverse ? -1 : 1) * amount;\n\n return (\n <Row\n style={{\n backgroundColor: selected\n ? theme.tableRowBackgroundHighlight\n : backgroundFocus\n ? theme.tableRowBackgroundHover\n : theme.tableBackground,\n ':hover': !(backgroundFocus || selected) && {\n backgroundColor: theme.tableRowBackgroundHover,\n },\n '& .hover-visible': {\n opacity: 0,\n },\n ':hover .hover-visible': {\n opacity: 1,\n },\n ...(highlighted || selected\n ? { color: theme.tableRowBackgroundHighlightText }\n : { color: theme.tableText }),\n ...style,\n ...(isPreview && {\n color: theme.tableTextInactive,\n backgroundColor: !selected ? theme.tableBackground : undefined,\n fontStyle: 'italic',\n }),\n ...(_unmatched && { opacity: 0.5 }),\n }}\n >\n {isChild && (\n <Field\n /* Checkmark blank placeholder for Child transaction */\n width={110}\n style={{\n width: 110,\n backgroundColor: theme.tableRowBackgroundHover,\n border: 0, // known z-order issue, bottom border for parent transaction hidden\n }}\n />\n )}\n\n {isChild && showAccount && (\n <Field\n /* Account blank placeholder for Child transaction */\n style={{\n flex: 1,\n backgroundColor: theme.tableRowBackgroundHover,\n border: 0,\n }}\n />\n )}\n\n {/* Checkmark - for Child transaction\n between normal Date and Payee or Account and Payee if needed */}\n {isTemporaryId(transaction.id) ? (\n isChild ? (\n <DeleteCell\n onDelete={() => onDelete && onDelete(transaction.id)}\n exposed={editing}\n style={{ ...(isChild && { borderLeftWidth: 1 }), lineHeight: 0 }}\n />\n ) : (\n <Cell width={20} />\n )\n ) : (\n <SelectCell\n /* Checkmark field for non-child transaction */\n exposed\n buttonProps={{\n className: selected || editing ? null : 'hover-visible',\n }}\n focused={focusedField === 'select'}\n onSelect={e => {\n dispatchSelected({ type: 'select', id: transaction.id, event: e });\n }}\n onEdit={() => onEdit(id, 'select')}\n selected={selected}\n style={{ ...(isChild && { borderLeftWidth: 1 }) }}\n value={\n matched && (\n <SvgHyperlink2\n style={{ width: 13, height: 13, color: 'inherit' }}\n />\n )\n }\n />\n )}\n {!isChild && (\n <CustomCell\n /* Date field for non-child transaction */\n name=\"date\"\n width={110}\n textAlign=\"flex\"\n exposed={focusedField === 'date'}\n value={date}\n valueStyle={valueStyle}\n formatter={date =>\n date ? formatDate(parseISO(date), dateFormat) : ''\n }\n onExpose={name => !isPreview && onEdit(id, name)}\n onUpdate={value => {\n onUpdate('date', value);\n }}\n >\n {({\n onBlur,\n onKeyDown,\n onUpdate,\n onSave,\n shouldSaveFromKey,\n inputStyle,\n }) => (\n <DateSelect\n value={date || ''}\n dateFormat={dateFormat}\n inputProps={{ onBlur, onKeyDown, style: inputStyle }}\n shouldSaveFromKey={shouldSaveFromKey}\n tableBehavior={true}\n onUpdate={onUpdate}\n onSelect={onSave}\n />\n )}\n </CustomCell>\n )}\n\n {!isChild && showAccount && (\n <CustomCell\n /* Account field for non-child transaction */\n name=\"account\"\n width=\"flex\"\n textAlign=\"flex\"\n value={accountId}\n formatter={acctId => {\n const acct = acctId && getAccountsById(accounts)[acctId];\n if (acct) {\n return acct.name;\n }\n return '';\n }}\n valueStyle={valueStyle}\n exposed={focusedField === 'account'}\n onExpose={name => !isPreview && onEdit(id, name)}\n onUpdate={async value => {\n // Only ever allow non-null values\n if (value) {\n onUpdate('account', value);\n }\n }}\n >\n {({\n onBlur,\n onKeyDown,\n onUpdate,\n onSave,\n shouldSaveFromKey,\n inputStyle,\n }) => (\n <AccountAutocomplete\n includeClosedAccounts={false}\n value={accountId}\n accounts={accounts}\n shouldSaveFromKey={shouldSaveFromKey}\n tableBehavior={true}\n focused={true}\n inputProps={{ onBlur, onKeyDown, style: inputStyle }}\n onUpdate={onUpdate}\n onSelect={onSave}\n menuPortalTarget={undefined}\n />\n )}\n </CustomCell>\n )}\n {(() => (\n <PayeeCell\n /* Payee field for all transactions */\n id={id}\n payeeId={payeeId}\n accountId={accountId}\n focused={focusedField === 'payee'}\n inherited={inheritedFields && inheritedFields.has('payee')}\n payees={payees}\n accounts={accounts}\n valueStyle={valueStyle}\n transaction={transaction}\n payee={payee}\n transferAcct={transferAcct}\n importedPayee={importedPayee}\n isPreview={isPreview}\n onEdit={onEdit}\n onUpdate={onUpdate}\n onCreatePayee={onCreatePayee}\n onManagePayees={onManagePayees}\n onNavigateToTransferAccount={onNavigateToTransferAccount}\n onNavigateToSchedule={onNavigateToSchedule}\n />\n ))()}\n\n {isPreview ? (\n /* Notes field for all transactions */\n <Cell name=\"notes\" width=\"flex\" />\n ) : (\n <InputCell\n width=\"flex\"\n name=\"notes\"\n textAlign=\"flex\"\n exposed={focusedField === 'notes'}\n focused={focusedField === 'notes'}\n value={notes || ''}\n valueStyle={valueStyle}\n onExpose={name => !isPreview && onEdit(id, name)}\n inputProps={{\n value: notes || '',\n onUpdate: onUpdate.bind(null, 'notes'),\n }}\n />\n )}\n\n {isPreview ? (\n // Category field for preview transactions\n <Cell width=\"flex\" style={{ alignItems: 'flex-start' }} exposed={true}>\n {() => (\n <View\n style={{\n color:\n notes === 'missed'\n ? theme.errorText\n : notes === 'due'\n ? theme.warningText\n : selected\n ? theme.formLabelText\n : theme.upcomingText,\n backgroundColor:\n notes === 'missed'\n ? theme.errorBackground\n : notes === 'due'\n ? theme.warningBackground\n : selected\n ? theme.formLabelBackground\n : theme.upcomingBackground,\n margin: '0 5px',\n padding: '3px 7px',\n borderRadius: 4,\n }}\n >\n {titleFirst(notes)}\n </View>\n )}\n </Cell>\n ) : isParent ? (\n <Cell\n /* Category field (Split button) for parent transactions */\n name=\"category\"\n width=\"flex\"\n focused={focusedField === 'category'}\n style={{ padding: 0 }}\n plain\n >\n <CellButton\n bare\n style={{\n alignSelf: 'flex-start',\n borderRadius: 4,\n border: '1px solid transparent', // so it doesn't shift on hover\n ':hover': {\n border: '1px solid ' + theme.buttonNormalBorder,\n },\n }}\n disabled={isTemporaryId(transaction.id)}\n onEdit={() => onEdit(id, 'category')}\n onSelect={() => onToggleSplit(id)}\n >\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n alignSelf: 'stretch',\n borderRadius: 4,\n flex: 1,\n padding: 4,\n }}\n >\n {isParent && (\n <SvgCheveronDown\n style={{\n color: 'inherit',\n width: 14,\n height: 14,\n transition: 'transform .08s',\n transform: expanded ? 'rotateZ(0)' : 'rotateZ(-90deg)',\n }}\n />\n )}\n <Text style={{ fontStyle: 'italic', userSelect: 'none' }}>\n Split\n </Text>\n </View>\n </CellButton>\n </Cell>\n ) : isBudgetTransfer || isOffBudget || isPreview ? (\n <InputCell\n /* Category field for transfer and off-budget transactions\n (NOT preview, it is covered first) */\n name=\"category\"\n width=\"flex\"\n exposed={focusedField === 'category'}\n focused={focusedField === 'category'}\n onExpose={name => !isPreview && onEdit(id, name)}\n value={\n isParent\n ? 'Split'\n : isOffBudget\n ? 'Off Budget'\n : isBudgetTransfer\n ? 'Transfer'\n : ''\n }\n valueStyle={valueStyle}\n style={{\n fontStyle: 'italic',\n color: theme.pageTextSubdued,\n fontWeight: 300,\n }}\n inputProps={{\n readOnly: true,\n style: { fontStyle: 'italic' },\n }}\n />\n ) : (\n <CustomCell\n /* Category field for normal and child transactions */\n name=\"category\"\n width=\"flex\"\n textAlign=\"flex\"\n value={categoryId}\n formatter={value =>\n value\n ? getDisplayValue(\n getCategoriesById(categoryGroups)[value],\n 'name',\n )\n : transaction.id\n ? 'Categorize'\n : ''\n }\n exposed={focusedField === 'category'}\n onExpose={name => onEdit(id, name)}\n valueStyle={\n !categoryId\n ? {\n // uncategorized transaction\n fontStyle: 'italic',\n fontWeight: 300,\n color: theme.formInputTextHighlight,\n }\n : valueStyle\n }\n onUpdate={async value => {\n if (value === 'split') {\n onSplit(transaction.id);\n } else {\n onUpdate('category', value);\n }\n }}\n >\n {({\n onBlur,\n onKeyDown,\n onUpdate,\n onSave,\n shouldSaveFromKey,\n inputStyle,\n }) => (\n <CategoryAutocomplete\n categoryGroups={categoryGroups}\n value={categoryId}\n focused={true}\n tableBehavior={true}\n showSplitOption={!isChild && !isParent}\n shouldSaveFromKey={shouldSaveFromKey}\n inputProps={{ onBlur, onKeyDown, style: inputStyle }}\n onUpdate={onUpdate}\n onSelect={onSave}\n menuPortalTarget={undefined}\n />\n )}\n </CustomCell>\n )}\n\n <InputCell\n /* Debit field for all transactions */\n type=\"input\"\n width={90}\n name=\"debit\"\n exposed={focusedField === 'debit'}\n focused={focusedField === 'debit'}\n value={debit === '' && credit === '' ? '0.00' : debit}\n valueStyle={valueStyle}\n textAlign=\"right\"\n title={debit}\n onExpose={name => !isPreview && onEdit(id, name)}\n style={{\n ...(isParent && { fontStyle: 'italic' }),\n ...styles.tnum,\n ...amountStyle,\n }}\n inputProps={{\n value: debit === '' && credit === '' ? '0.00' : debit,\n onUpdate: onUpdate.bind(null, 'debit'),\n }}\n privacyFilter={{\n activationFilters: [!isTemporaryId(transaction.id)],\n }}\n />\n\n <InputCell\n /* Credit field for all transactions */\n type=\"input\"\n width={85}\n name=\"credit\"\n exposed={focusedField === 'credit'}\n focused={focusedField === 'credit'}\n value={credit}\n valueStyle={valueStyle}\n textAlign=\"right\"\n title={credit}\n onExpose={name => !isPreview && onEdit(id, name)}\n style={{\n ...(isParent && { fontStyle: 'italic' }),\n ...styles.tnum,\n ...amountStyle,\n }}\n inputProps={{\n value: credit,\n onUpdate: onUpdate.bind(null, 'credit'),\n }}\n privacyFilter={{\n activationFilters: [!isTemporaryId(transaction.id)],\n }}\n />\n\n {showBalance && (\n <Cell\n /* Balance field for all transactions */\n name=\"balance\"\n value={\n runningBalance == null || isChild\n ? ''\n : integerToCurrency(runningBalance)\n }\n valueStyle={{\n color: runningBalance < 0 ? theme.errorText : theme.noticeTextLight,\n }}\n style={{ ...styles.tnum, ...amountStyle }}\n width={88}\n textAlign=\"right\"\n privacyFilter\n />\n )}\n\n {showCleared && (\n <StatusCell\n /* Icon field for all transactions */\n id={id}\n focused={focusedField === 'cleared'}\n selected={selected}\n isPreview={isPreview}\n status={\n isPreview\n ? notes\n : reconciled\n ? 'reconciled'\n : cleared\n ? 'cleared'\n : null\n }\n isChild={isChild}\n onEdit={onEdit}\n onUpdate={onUpdate}\n />\n )}\n\n <Cell width={5} />\n </Row>\n );\n});\n\nfunction TransactionError({\n error,\n isDeposit,\n onAddSplit,\n onDistributeRemainder,\n style,\n canDistributeRemainder,\n}) {\n switch (error.type) {\n case 'SplitTransactionError':\n if (error.version === 1) {\n return (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n padding: '0 5px',\n ...style,\n }}\n data-testid=\"transaction-error\"\n >\n <Text>\n Amount left:{' '}\n <Text style={{ fontWeight: 500 }}>\n {integerToCurrency(\n isDeposit ? error.difference : -error.difference,\n )}\n </Text>\n </Text>\n <View style={{ flex: 1 }} />\n <Button\n type=\"normal\"\n style={{ marginLeft: 15 }}\n onClick={onDistributeRemainder}\n data-testid=\"distribute-split-button\"\n disabled={!canDistributeRemainder}\n >\n Distribute\n </Button>\n <Button\n type=\"primary\"\n style={{ marginLeft: 10, padding: '4px 10px' }}\n onClick={onAddSplit}\n data-testid=\"add-split-button\"\n >\n Add Split\n </Button>\n </View>\n );\n }\n break;\n default:\n return null;\n }\n}\n\nfunction makeTemporaryTransactions(\n currentAccountId,\n currentCategoryId,\n lastDate,\n) {\n return [\n {\n id: 'temp',\n date: lastDate || currentDay(),\n account: currentAccountId || null,\n category: currentCategoryId || null,\n cleared: false,\n amount: null,\n },\n ];\n}\n\nfunction isTemporaryId(id) {\n return id.indexOf('temp') !== -1;\n}\n\nexport function isPreviewId(id) {\n return id.indexOf('preview/') !== -1;\n}\n\nfunction NewTransaction({\n transactions,\n accounts,\n categoryGroups,\n payees,\n editingTransaction,\n focusedField,\n showAccount,\n showCategory,\n showBalance,\n showCleared,\n dateFormat,\n hideFraction,\n onClose,\n onSplit,\n onEdit,\n onDelete,\n onSave,\n onAdd,\n onAddSplit,\n onDistributeRemainder,\n onManagePayees,\n onCreatePayee,\n onNavigateToTransferAccount,\n onNavigateToSchedule,\n balance,\n}) {\n const error = transactions[0].error;\n const isDeposit = transactions[0].amount > 0;\n\n const childTransactions = transactions.filter(\n t => t.parent_id === transactions[0].id,\n );\n const emptyChildTransactions = childTransactions.filter(t => t.amount === 0);\n\n return (\n <View\n style={{\n borderBottom: '1px solid ' + theme.tableBorderHover,\n paddingBottom: 6,\n backgroundColor: theme.tableBackground,\n }}\n data-testid=\"new-transaction\"\n onKeyDown={e => {\n if (e.key === 'Escape') {\n onClose();\n }\n }}\n >\n {transactions.map(transaction => (\n <Transaction\n isNew\n key={transaction.id}\n editing={editingTransaction === transaction.id}\n transaction={transaction}\n subtransactions={transaction.is_parent ? childTransactions : null}\n showAccount={showAccount}\n showCategory={showCategory}\n showBalance={showBalance}\n showCleared={showCleared}\n focusedField={editingTransaction === transaction.id && focusedField}\n showZeroInDeposit={isDeposit}\n accounts={accounts}\n categoryGroups={categoryGroups}\n payees={payees}\n dateFormat={dateFormat}\n hideFraction={hideFraction}\n expanded={true}\n onEdit={onEdit}\n onSave={onSave}\n onSplit={onSplit}\n onDelete={onDelete}\n onAdd={onAdd}\n onManagePayees={onManagePayees}\n onCreatePayee={onCreatePayee}\n style={{ marginTop: -1 }}\n onNavigateToTransferAccount={onNavigateToTransferAccount}\n onNavigateToSchedule={onNavigateToSchedule}\n balance={balance}\n />\n ))}\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'flex-end',\n marginTop: 6,\n marginRight: 20,\n }}\n >\n <Button\n style={{ marginRight: 10, padding: '4px 10px' }}\n onClick={() => onClose()}\n data-testid=\"cancel-button\"\n >\n Cancel\n </Button>\n {error ? (\n <TransactionError\n error={error}\n isDeposit={isDeposit}\n onAddSplit={() => onAddSplit(transactions[0].id)}\n onDistributeRemainder={() =>\n onDistributeRemainder(transactions[0].id)\n }\n canDistributeRemainder={emptyChildTransactions.length > 0}\n />\n ) : (\n <Button\n type=\"primary\"\n style={{ padding: '4px 10px' }}\n onClick={onAdd}\n data-testid=\"add-button\"\n >\n Add\n </Button>\n )}\n </View>\n </View>\n );\n}\n\nfunction TransactionTableInner({\n tableNavigator,\n tableRef,\n dateFormat = 'MM/dd/yyyy',\n newNavigator,\n renderEmpty,\n onScroll,\n ...props\n}) {\n const containerRef = createRef();\n const isAddingPrev = usePrevious(props.isAdding);\n const [scrollWidth, setScrollWidth] = useState(0);\n\n function saveScrollWidth(parent, child) {\n const width = parent > 0 && child > 0 && parent - child;\n\n setScrollWidth(!width ? 0 : width);\n }\n\n const onNavigateToTransferAccount = useCallback(\n accountId => {\n props.onCloseAddTransaction();\n props.onNavigateToTransferAccount(accountId);\n },\n [props.onCloseAddTransaction, props.onNavigateToTransferAccount],\n );\n\n const onNavigateToSchedule = useCallback(\n scheduleId => {\n props.onCloseAddTransaction();\n props.onNavigateToSchedule(scheduleId);\n },\n [props.onCloseAddTransaction, props.onNavigateToSchedule],\n );\n\n useEffect(() => {\n if (!isAddingPrev && props.isAdding) {\n newNavigator.onEdit('temp', 'date');\n }\n }, [isAddingPrev, props.isAdding, newNavigator]);\n\n const renderRow = ({ item, index, position, editing }) => {\n const {\n transactions,\n selectedItems,\n accounts,\n categoryGroups,\n payees,\n showCleared,\n showAccount,\n showCategory,\n showBalances,\n balances,\n hideFraction,\n isNew,\n isMatched,\n isExpanded,\n } = props;\n\n const trans = item;\n const selected = selectedItems.has(trans.id);\n\n const parent = props.transactionMap.get(trans.parent_id);\n const isChildDeposit = parent && parent.amount > 0;\n const expanded = isExpanded && isExpanded((parent || trans).id);\n\n // For backwards compatibility, read the error of the transaction\n // since in previous versions we stored it there. In the future we\n // can simplify this to just the parent\n const error = expanded\n ? (parent && parent.error) || trans.error\n : trans.error;\n\n const hasSplitError =\n (!expanded || isLastChild(transactions, index)) &&\n error &&\n error.type === 'SplitTransactionError';\n\n const emptyChildTransactions = transactions.filter(\n t =>\n t.parent_id === (trans.is_parent ? trans.id : trans.parent_id) &&\n t.amount === 0,\n );\n\n return (\n <>\n {hasSplitError && (\n <Tooltip\n position=\"bottom-right\"\n width={350}\n forceTop={position}\n forceLayout={true}\n style={{ transform: 'translate(-5px, 2px)' }}\n >\n <TransactionError\n error={error}\n isDeposit={isChildDeposit}\n onAddSplit={() => props.onAddSplit(trans.id)}\n onDistributeRemainder={() =>\n props.onDistributeRemainder(trans.id)\n }\n canDistributeRemainder={emptyChildTransactions.length > 0}\n />\n </Tooltip>\n )}\n <Transaction\n editing={editing}\n transaction={trans}\n showAccount={showAccount}\n showCategory={showCategory}\n showBalance={showBalances}\n showCleared={showCleared}\n selected={selected}\n highlighted={false}\n added={isNew?.(trans.id)}\n expanded={isExpanded?.(trans.id)}\n matched={isMatched?.(trans.id)}\n showZeroInDeposit={isChildDeposit}\n balance={balances?.[trans.id]?.balance}\n focusedField={editing && tableNavigator.focusedField}\n accounts={accounts}\n categoryGroups={categoryGroups}\n payees={payees}\n inheritedFields={\n parent?.payee === trans.payee ? new Set(['payee']) : new Set()\n }\n dateFormat={dateFormat}\n hideFraction={hideFraction}\n onEdit={tableNavigator.onEdit}\n onSave={props.onSave}\n onDelete={props.onDelete}\n onSplit={props.onSplit}\n onManagePayees={props.onManagePayees}\n onCreatePayee={props.onCreatePayee}\n onToggleSplit={props.onToggleSplit}\n onNavigateToTransferAccount={onNavigateToTransferAccount}\n onNavigateToSchedule={onNavigateToSchedule}\n pushModal={props.pushModal}\n />\n </>\n );\n };\n\n return (\n <View\n innerRef={containerRef}\n style={{\n flex: 1,\n cursor: 'default',\n ...props.style,\n }}\n >\n <View>\n <TransactionHeader\n hasSelected={props.selectedItems.size > 0}\n showAccount={props.showAccount}\n showCategory={props.showCategory}\n showBalance={props.showBalances}\n showCleared={props.showCleared}\n scrollWidth={scrollWidth}\n onSort={props.onSort}\n ascDesc={props.ascDesc}\n field={props.sortField}\n />\n\n {props.isAdding && (\n <View\n {...newNavigator.getNavigatorProps({\n onKeyDown: e => props.onCheckNewEnter(e),\n })}\n >\n <NewTransaction\n transactions={props.newTransactions}\n editingTransaction={newNavigator.editingId}\n focusedField={newNavigator.focusedField}\n accounts={props.accounts}\n categoryGroups={props.categoryGroups}\n payees={props.payees || []}\n showAccount={props.showAccount}\n showCategory={props.showCategory}\n showBalance={props.showBalances}\n showCleared={props.showCleared}\n dateFormat={dateFormat}\n hideFraction={props.hideFraction}\n onClose={props.onCloseAddTransaction}\n onAdd={props.onAddTemporary}\n onAddSplit={props.onAddSplit}\n onSplit={props.onSplit}\n onEdit={newNavigator.onEdit}\n onSave={props.onSave}\n onDelete={props.onDelete}\n onManagePayees={props.onManagePayees}\n onCreatePayee={props.onCreatePayee}\n onNavigateToTransferAccount={onNavigateToTransferAccount}\n onNavigateToSchedule={onNavigateToSchedule}\n onDistributeRemainder={props.onDistributeRemainder}\n balance={\n props.transactions?.length > 0\n ? props.balances?.[props.transactions[0]?.id]?.balance\n : 0\n }\n />\n </View>\n )}\n </View>\n {/*// * On Windows, makes the scrollbar always appear\n // the full height of the container ??? */}\n\n <View\n style={{ flex: 1, overflow: 'hidden' }}\n data-testid=\"transaction-table\"\n >\n <Table\n navigator={tableNavigator}\n ref={tableRef}\n items={props.transactions}\n renderItem={renderRow}\n renderEmpty={renderEmpty}\n loadMore={props.loadMoreTransactions}\n isSelected={id => props.selectedItems.has(id)}\n onKeyDown={e => props.onCheckEnter(e)}\n onScroll={onScroll}\n saveScrollWidth={saveScrollWidth}\n />\n\n {props.isAdding && (\n <div\n key=\"shadow\"\n style={{\n position: 'absolute',\n top: -20,\n left: 0,\n right: 0,\n height: 20,\n backgroundColor: theme.errorText,\n boxShadow: '0 0 6px rgba(0, 0, 0, .20)',\n }}\n />\n )}\n </View>\n </View>\n );\n}\n\nexport const TransactionTable = forwardRef((props, ref) => {\n const [newTransactions, setNewTransactions] = useState(null);\n const [prevIsAdding, setPrevIsAdding] = useState(false);\n const splitsExpanded = useSplitsExpanded();\n const prevSplitsExpanded = useRef(null);\n\n const tableRef = useRef(null);\n const mergedRef = useMergedRefs(tableRef, ref);\n\n const transactions = useMemo(() => {\n let result;\n if (splitsExpanded.state.transitionId != null) {\n const index = props.transactions.findIndex(\n t => t.id === splitsExpanded.state.transitionId,\n );\n result = props.transactions.filter((t, idx) => {\n if (t.parent_id) {\n if (idx >= index) {\n return splitsExpanded.expanded(t.parent_id);\n } else if (prevSplitsExpanded.current) {\n return prevSplitsExpanded.current.expanded(t.parent_id);\n }\n }\n return true;\n });\n } else {\n if (\n prevSplitsExpanded.current &&\n prevSplitsExpanded.current.state.transitionId != null\n ) {\n tableRef.current.anchor();\n tableRef.current.setRowAnimation(false);\n }\n prevSplitsExpanded.current = splitsExpanded;\n\n result = props.transactions.filter(t => {\n if (t.parent_id) {\n return splitsExpanded.expanded(t.parent_id);\n }\n return true;\n });\n }\n\n prevSplitsExpanded.current = splitsExpanded;\n return result;\n }, [props.transactions, splitsExpanded]);\n const transactionMap = useMemo(() => {\n return new Map(transactions.map(trans => [trans.id, trans]));\n }, [transactions]);\n\n useEffect(() => {\n // If it's anchored that means we've also disabled animations. To\n // reduce the chance for side effect collision, only do this if\n // we've actually anchored it\n if (tableRef.current.isAnchored()) {\n tableRef.current.unanchor();\n tableRef.current.setRowAnimation(true);\n }\n }, [prevSplitsExpanded.current]);\n\n const newNavigator = useTableNavigator(newTransactions, getFields);\n const tableNavigator = useTableNavigator(transactions, getFields);\n const shouldAdd = useRef(false);\n const latestState = useRef({ newTransactions, newNavigator, tableNavigator });\n const savePending = useRef(false);\n const afterSaveFunc = useRef(false);\n const [_, forceRerender] = useState({});\n const selectedItems = useSelectedItems();\n\n useLayoutEffect(() => {\n latestState.current = {\n newTransactions,\n newNavigator,\n tableNavigator,\n transactions: props.transactions,\n };\n });\n\n // Derive new transactions from the `isAdding` prop\n if (prevIsAdding !== props.isAdding) {\n if (!prevIsAdding && props.isAdding) {\n setNewTransactions(\n makeTemporaryTransactions(\n props.currentAccountId,\n props.currentCategoryId,\n ),\n );\n }\n setPrevIsAdding(props.isAdding);\n }\n\n useEffect(() => {\n if (shouldAdd.current) {\n if (newTransactions[0].account == null) {\n props.addNotification({\n type: 'error',\n message: 'Account is a required field',\n });\n newNavigator.onEdit('temp', 'account');\n } else {\n const transactions = latestState.current.newTransactions;\n const lastDate = transactions.length > 0 ? transactions[0].date : null;\n setNewTransactions(\n makeTemporaryTransactions(\n props.currentAccountId,\n props.currentCategoryId,\n lastDate,\n ),\n );\n newNavigator.onEdit('temp', 'date');\n props.onAdd(transactions);\n }\n shouldAdd.current = false;\n }\n });\n\n useEffect(() => {\n if (savePending.current && afterSaveFunc.current) {\n afterSaveFunc.current(props);\n afterSaveFunc.current = null;\n }\n\n savePending.current = false;\n }, [newTransactions, props.transactions]);\n\n function getFields(item) {\n let fields = [\n 'select',\n 'date',\n 'account',\n 'payee',\n 'notes',\n 'category',\n 'debit',\n 'credit',\n 'cleared',\n ];\n\n fields = item.is_child\n ? ['select', 'payee', 'notes', 'category', 'debit', 'credit']\n : fields.filter(\n f =>\n (props.showAccount || f !== 'account') &&\n (props.showCategory || f !== 'category'),\n );\n\n if (isPreviewId(item.id)) {\n fields = ['select', 'cleared'];\n }\n if (isTemporaryId(item.id)) {\n // You can't focus the select/delete button of temporary\n // transactions\n fields = fields.slice(1);\n }\n\n return fields;\n }\n\n function afterSave(func) {\n if (savePending.current) {\n afterSaveFunc.current = func;\n } else {\n func(props);\n }\n }\n\n function onCheckNewEnter(e) {\n if (e.key === 'Enter') {\n if (e.metaKey) {\n e.stopPropagation();\n onAddTemporary();\n } else if (!e.shiftKey) {\n function getLastTransaction(state) {\n const { newTransactions } = state.current;\n return newTransactions[newTransactions.length - 1];\n }\n\n // Right now, the table navigator does some funky stuff with\n // focus, so we want to stop it from handling this event. We\n // still want enter to move up/down normally, so we only stop\n // it if we are on the last transaction (where we are about to\n // do some logic). I don't like this.\n if (newNavigator.editingId === getLastTransaction(latestState).id) {\n e.stopPropagation();\n }\n\n afterSave(() => {\n const lastTransaction = getLastTransaction(latestState);\n const isSplit =\n lastTransaction.parent_id || lastTransaction.is_parent;\n\n if (\n latestState.current.newTransactions[0].error &&\n newNavigator.editingId === lastTransaction.id\n ) {\n // add split\n onAddSplit(lastTransaction.id);\n } else if (\n newNavigator.editingId === lastTransaction.id &&\n (!isSplit || !lastTransaction.error)\n ) {\n onAddTemporary();\n }\n });\n }\n }\n }\n\n function onCheckEnter(e) {\n if (e.key === 'Enter' && !e.shiftKey) {\n const { editingId: id, focusedField } = tableNavigator;\n\n afterSave(() => {\n const transactions = latestState.current.transactions;\n const idx = transactions.findIndex(t => t.id === id);\n const parent = transactions.find(\n t => t.id === transactions[idx]?.parent_id,\n );\n\n if (\n isLastChild(transactions, idx) &&\n parent &&\n parent.error &&\n focusedField !== 'select'\n ) {\n e.stopPropagation();\n onAddSplit(id);\n }\n });\n }\n }\n\n const onAddTemporary = useCallback(() => {\n shouldAdd.current = true;\n // A little hacky - this forces a rerender which will cause the\n // effect we want to run. We have to wait for all updates to be\n // committed (the input could still be saving a value).\n forceRerender({});\n }, [props.onAdd, newNavigator.onEdit]);\n\n const onSave = useCallback(\n async (transaction, subtransactions = null) => {\n savePending.current = true;\n\n let groupedTransaction = subtransactions\n ? groupTransaction([transaction, ...subtransactions])\n : transaction;\n\n if (isTemporaryId(transaction.id)) {\n if (props.onApplyRules) {\n groupedTransaction = await props.onApplyRules(groupedTransaction);\n }\n\n const newTrans = latestState.current.newTransactions;\n // Future refactor: we shouldn't need to iterate through the entire\n // transaction list to ungroup, just the new transactions.\n setNewTransactions(\n ungroupTransactions(\n updateTransaction(newTrans, groupedTransaction).data,\n ),\n );\n } else {\n props.onSave(groupedTransaction);\n }\n },\n [props.onSave],\n );\n\n const onDelete = useCallback(id => {\n const temporary = isTemporaryId(id);\n\n if (temporary) {\n const newTrans = latestState.current.newTransactions;\n\n if (id === newTrans[0].id) {\n // You can never delete the parent new transaction\n return;\n }\n\n setNewTransactions(deleteTransaction(newTrans, id).data);\n }\n }, []);\n\n const onSplit = useMemo(() => {\n return id => {\n if (isTemporaryId(id)) {\n const { newNavigator } = latestState.current;\n const newTrans = latestState.current.newTransactions;\n const { data, diff } = splitTransaction(newTrans, id);\n setNewTransactions(data);\n\n // Jump next to \"debit\" field if it is empty\n // Otherwise jump to the same field as before, but downwards\n // to the added split transaction\n if (newTrans[0].amount === null) {\n newNavigator.onEdit(newTrans[0].id, 'debit');\n } else {\n newNavigator.onEdit(\n diff.added[0].id,\n latestState.current.newNavigator.focusedField,\n );\n }\n } else {\n const trans = latestState.current.transactions.find(t => t.id === id);\n const newId = props.onSplit(id);\n\n splitsExpanded.dispatch({ type: 'open-split', id: trans.id });\n\n const { tableNavigator } = latestState.current;\n if (trans.amount === null) {\n tableNavigator.onEdit(trans.id, 'debit');\n } else {\n tableNavigator.onEdit(newId, tableNavigator.focusedField);\n }\n }\n };\n }, [props.onSplit, splitsExpanded.dispatch]);\n\n const onAddSplit = useCallback(\n id => {\n if (isTemporaryId(id)) {\n const newTrans = latestState.current.newTransactions;\n const { data, diff } = addSplitTransaction(newTrans, id);\n setNewTransactions(data);\n newNavigator.onEdit(\n diff.added[0].id,\n latestState.current.newNavigator.focusedField,\n );\n } else {\n const newId = props.onAddSplit(id);\n tableNavigator.onEdit(\n newId,\n latestState.current.tableNavigator.focusedField,\n );\n }\n },\n [props.onAddSplit],\n );\n\n const onDistributeRemainder = useCallback(\n async id => {\n const { transactions, tableNavigator, newTransactions } =\n latestState.current;\n\n const targetTransactions = isTemporaryId(id)\n ? newTransactions\n : transactions;\n const transaction = targetTransactions.find(t => t.id === id);\n\n const parentTransaction = transaction.is_parent\n ? transaction\n : targetTransactions.find(t => t.id === transaction.parent_id);\n\n const siblingTransactions = targetTransactions.filter(\n t =>\n t.parent_id ===\n (transaction.is_parent ? transaction.id : transaction.parent_id),\n );\n\n const emptyTransactions = siblingTransactions.filter(t => t.amount === 0);\n\n const remainingAmount =\n parentTransaction.amount -\n siblingTransactions.reduce((acc, t) => acc + t.amount, 0);\n\n const amountPerTransaction = Math.floor(\n remainingAmount / emptyTransactions.length,\n );\n let remainingCents =\n remainingAmount - amountPerTransaction * emptyTransactions.length;\n\n const amounts = new Array(emptyTransactions.length).fill(\n amountPerTransaction,\n );\n\n for (const amountIndex in amounts) {\n if (remainingCents === 0) break;\n\n amounts[amountIndex] += 1;\n remainingCents--;\n }\n\n if (isTemporaryId(id)) {\n newNavigator.onEdit(null);\n } else {\n tableNavigator.onEdit(null);\n }\n\n for (const transactionIndex in emptyTransactions) {\n await onSave({\n ...emptyTransactions[transactionIndex],\n amount: amounts[transactionIndex],\n });\n }\n },\n [latestState],\n );\n\n function onCloseAddTransaction() {\n setNewTransactions(\n makeTemporaryTransactions(\n props.currentAccountId,\n props.currentCategoryId,\n ),\n );\n props.onCloseAddTransaction();\n }\n\n const onToggleSplit = useCallback(\n id => splitsExpanded.dispatch({ type: 'toggle-split', id }),\n [splitsExpanded.dispatch],\n );\n\n return (\n <TransactionTableInner\n tableRef={mergedRef}\n {...props}\n transactions={transactions}\n transactionMap={transactionMap}\n selectedItems={selectedItems}\n isExpanded={splitsExpanded.expanded}\n onSave={onSave}\n onDelete={onDelete}\n onSplit={onSplit}\n onCheckNewEnter={onCheckNewEnter}\n onCheckEnter={onCheckEnter}\n onAddTemporary={onAddTemporary}\n onAddSplit={onAddSplit}\n onDistributeRemainder={onDistributeRemainder}\n onCloseAddTransaction={onCloseAddTransaction}\n onToggleSplit={onToggleSplit}\n newTransactions={newTransactions}\n tableNavigator={tableNavigator}\n newNavigator={newNavigator}\n />\n );\n});\n\nTransactionTable.displayName = 'TransactionTable';\n","import React, { useRef, useCallback, useLayoutEffect } from 'react';\n\nimport { send } from 'loot-core/src/platform/client/fetch';\nimport {\n splitTransaction,\n updateTransaction,\n addSplitTransaction,\n realizeTempTransactions,\n applyTransactionDiff,\n} from 'loot-core/src/shared/transactions';\nimport { getChangedValues, applyChanges } from 'loot-core/src/shared/util';\n\nimport { useNavigate } from '../../hooks/useNavigate';\nimport { theme } from '../../style';\n\nimport { TransactionTable } from './TransactionsTable';\n\n// When data changes, there are two ways to update the UI:\n//\n// * Optimistic updates: we apply the needed updates to local data\n// and rerender immediately, and send off the changes to the\n// server. Currently, it assumes the server request is successful.\n// If it fails the user will see a generic error which isn't\n// great, but since the server is local a failure is very\n// unlikely. Still, we should notify errors better.\n//\n// * A full refetch and rerender: this is needed when applying\n// updates locally is too complex. Usually this happens when\n// changing a field that data is sorted on: we're not going\n// to resort the data in memory, we want to rely on the database\n// for that. So we need to do a full refresh.\n//\n// When writing updates, it's up to you to decide which one to do.\n// Optimistic updates feel snappy, but they might show data\n// differently than a full refresh. It's up to you to decide which\n// one to use when doing updates.\n\nasync function saveDiff(diff) {\n const remoteUpdates = await send('transactions-batch-update', {\n ...diff,\n learnCategories: true,\n });\n if (remoteUpdates.length > 0) {\n return { updates: remoteUpdates };\n }\n return {};\n}\n\nasync function saveDiffAndApply(diff, changes, onChange) {\n const remoteDiff = await saveDiff(diff);\n onChange(\n applyTransactionDiff(changes.newTransaction, remoteDiff),\n applyChanges(remoteDiff, changes.data),\n );\n}\n\nexport function TransactionList({\n tableRef,\n transactions,\n allTransactions,\n loadMoreTransactions,\n account,\n accounts,\n category,\n categoryGroups,\n payees,\n balances,\n showBalances,\n showCleared,\n showAccount,\n headerContent,\n isAdding,\n isNew,\n isMatched,\n isFiltered,\n dateFormat,\n hideFraction,\n addNotification,\n pushModal,\n renderEmpty,\n onSort,\n sortField,\n ascDesc,\n onChange,\n onRefetch,\n onCloseAddTransaction,\n onCreatePayee,\n}) {\n const transactionsLatest = useRef();\n const navigate = useNavigate();\n\n useLayoutEffect(() => {\n transactionsLatest.current = transactions;\n }, [transactions]);\n\n const onAdd = useCallback(async newTransactions => {\n newTransactions = realizeTempTransactions(newTransactions);\n\n await saveDiff({ added: newTransactions });\n onRefetch();\n }, []);\n\n const onSave = useCallback(async transaction => {\n const changes = updateTransaction(transactionsLatest.current, transaction);\n\n if (changes.diff.updated.length > 0) {\n const dateChanged = !!changes.diff.updated[0].date;\n if (dateChanged) {\n // Make sure it stays at the top of the list of transactions\n // for that date\n changes.diff.updated[0].sort_order = Date.now();\n await saveDiff(changes.diff);\n onRefetch();\n } else {\n onChange(changes.newTransaction, changes.data);\n saveDiffAndApply(changes.diff, changes, onChange);\n }\n }\n }, []);\n\n const onAddSplit = useCallback(id => {\n const changes = addSplitTransaction(transactionsLatest.current, id);\n onChange(changes.newTransaction, changes.data);\n saveDiffAndApply(changes.diff, changes, onChange);\n return changes.diff.added[0].id;\n }, []);\n\n const onSplit = useCallback(id => {\n const changes = splitTransaction(transactionsLatest.current, id);\n onChange(changes.newTransaction, changes.data);\n saveDiffAndApply(changes.diff, changes, onChange);\n return changes.diff.added[0].id;\n }, []);\n\n const onApplyRules = useCallback(async transaction => {\n const afterRules = await send('rules-run', { transaction });\n const diff = getChangedValues(transaction, afterRules);\n\n const newTransaction = { ...transaction };\n if (diff) {\n Object.keys(diff).forEach(field => {\n if (\n newTransaction[field] == null ||\n newTransaction[field] === '' ||\n newTransaction[field] === 0 ||\n newTransaction[field] === false\n ) {\n newTransaction[field] = diff[field];\n }\n });\n }\n return newTransaction;\n }, []);\n\n const onManagePayees = useCallback(id => {\n navigate('/payees', { selectedPayee: id });\n });\n\n const onNavigateToTransferAccount = useCallback(accountId => {\n navigate(`/accounts/${accountId}`);\n });\n\n const onNavigateToSchedule = useCallback(scheduleId => {\n pushModal('schedule-edit', { id: scheduleId });\n });\n\n return (\n <TransactionTable\n ref={tableRef}\n pushModal={pushModal}\n transactions={allTransactions}\n loadMoreTransactions={loadMoreTransactions}\n accounts={accounts}\n categoryGroups={categoryGroups}\n payees={payees}\n showBalances={showBalances}\n balances={balances}\n showCleared={showCleared}\n showAccount={showAccount}\n showCategory={true}\n currentAccountId={account && account.id}\n currentCategoryId={category && category.id}\n isAdding={isAdding}\n isNew={isNew}\n isMatched={isMatched}\n isFiltered={isFiltered}\n dateFormat={dateFormat}\n hideFraction={hideFraction}\n addNotification={addNotification}\n headerContent={headerContent}\n renderEmpty={renderEmpty}\n onSave={onSave}\n onApplyRules={onApplyRules}\n onSplit={onSplit}\n onCloseAddTransaction={onCloseAddTransaction}\n onAdd={onAdd}\n onAddSplit={onAddSplit}\n onManagePayees={onManagePayees}\n onCreatePayee={onCreatePayee}\n style={{ backgroundColor: theme.tableBackground }}\n onNavigateToTransferAccount={onNavigateToTransferAccount}\n onNavigateToSchedule={onNavigateToSchedule}\n onSort={onSort}\n sortField={sortField}\n ascDesc={ascDesc}\n />\n );\n}\n","import React from 'react';\n\nimport { Menu } from '../common/Menu';\nimport { MenuTooltip } from '../common/MenuTooltip';\n\nimport { type SavedFilter } from './SavedFilterMenuButton';\n\nexport function FilterMenu({\n onClose,\n filterId,\n onFilterMenuSelect,\n}: {\n onClose: () => void;\n filterId: SavedFilter;\n onFilterMenuSelect: (item: string) => void;\n}) {\n return (\n <MenuTooltip width={200} onClose={onClose}>\n <Menu\n onMenuSelect={item => {\n onFilterMenuSelect(item);\n }}\n items={\n !filterId.id\n ? [\n { name: 'save-filter', text: 'Save new filter' },\n { name: 'clear-filter', text: 'Clear all conditions' },\n ]\n : filterId.id !== null && filterId.status === 'saved'\n ? [\n { name: 'rename-filter', text: 'Rename' },\n { name: 'delete-filter', text: 'Delete' },\n Menu.line,\n {\n name: 'save-filter',\n text: 'Save new filter',\n disabled: true,\n },\n { name: 'clear-filter', text: 'Clear all conditions' },\n ]\n : [\n { name: 'rename-filter', text: 'Rename' },\n { name: 'update-filter', text: 'Update condtions' },\n { name: 'reload-filter', text: 'Revert changes' },\n { name: 'delete-filter', text: 'Delete' },\n Menu.line,\n { name: 'save-filter', text: 'Save new filter' },\n { name: 'clear-filter', text: 'Clear all conditions' },\n ]\n }\n />\n </MenuTooltip>\n );\n}\n","import React, { useRef, useEffect } from 'react';\n\nimport { theme } from '../../style';\nimport { Button } from '../common/Button';\nimport { Input } from '../common/Input';\nimport { MenuTooltip } from '../common/MenuTooltip';\nimport { Stack } from '../common/Stack';\nimport { Text } from '../common/Text';\nimport { FormField, FormLabel } from '../forms';\n\nexport function NameFilter({\n onClose,\n menuItem,\n name,\n setName,\n adding,\n onAddUpdate,\n err,\n}: {\n onClose: () => void;\n menuItem: string;\n name: string;\n setName: (item: string) => void;\n adding: boolean;\n onAddUpdate: () => void;\n err: string | null;\n}) {\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.focus();\n }\n }, []);\n\n return (\n <MenuTooltip width={325} onClose={onClose}>\n {menuItem !== 'update-filter' && (\n <form>\n <Stack\n direction=\"row\"\n justify=\"flex-end\"\n align=\"center\"\n style={{ padding: 10 }}\n >\n <FormField style={{ flex: 1 }}>\n <FormLabel\n title=\"Filter Name\"\n htmlFor=\"name-field\"\n style={{ userSelect: 'none' }}\n />\n <Input\n id=\"name-field\"\n inputRef={inputRef}\n defaultValue={name || ''}\n onUpdate={setName}\n />\n </FormField>\n <Button\n type=\"primary\"\n style={{ marginTop: 18 }}\n onClick={e => {\n e.preventDefault();\n onAddUpdate();\n }}\n >\n {adding ? 'Add' : 'Update'}\n </Button>\n </Stack>\n </form>\n )}\n {err && (\n <Stack direction=\"row\" align=\"center\" style={{ padding: 10 }}>\n <Text style={{ color: theme.errorText }}>{err}</Text>\n </Stack>\n )}\n </MenuTooltip>\n );\n}\n","import React, { useState } from 'react';\n\nimport { send, sendCatch } from 'loot-core/src/platform/client/fetch';\nimport { type RuleConditionEntity } from 'loot-core/types/models/rule';\n\nimport { SvgExpandArrow } from '../../icons/v0';\nimport { Button } from '../common/Button';\nimport { Text } from '../common/Text';\nimport { View } from '../common/View';\n\nimport { FilterMenu } from './FilterMenu';\nimport { NameFilter } from './NameFilter';\n\nexport type SavedFilter = {\n conditions?: RuleConditionEntity[];\n conditionsOp?: string;\n id?: string;\n name: string;\n status?: string;\n};\n\nexport function SavedFilterMenuButton({\n filters,\n conditionsOp,\n filterId,\n onClearFilters,\n onReloadSavedFilter,\n filtersList,\n}: {\n filters: RuleConditionEntity[];\n conditionsOp: string;\n filterId: SavedFilter;\n onClearFilters: () => void;\n onReloadSavedFilter: (savedFilter: SavedFilter, value?: string) => void;\n filtersList: RuleConditionEntity[];\n}) {\n const [nameOpen, setNameOpen] = useState(false);\n const [adding, setAdding] = useState(false);\n const [menuOpen, setMenuOpen] = useState(false);\n const [err, setErr] = useState(null);\n const [menuItem, setMenuItem] = useState('');\n const [name, setName] = useState(filterId.name);\n const id = filterId.id;\n let savedFilter: SavedFilter;\n\n const onFilterMenuSelect = async (item: string) => {\n setMenuItem(item);\n switch (item) {\n case 'rename-filter':\n setErr(null);\n setAdding(false);\n setMenuOpen(false);\n setNameOpen(true);\n break;\n case 'delete-filter':\n setMenuOpen(false);\n await send('filter-delete', id);\n onClearFilters();\n break;\n case 'update-filter':\n setErr(null);\n setAdding(false);\n setMenuOpen(false);\n savedFilter = {\n conditions: filters,\n conditionsOp,\n id: filterId.id,\n name: filterId.name,\n status: 'saved',\n };\n const response = await sendCatch('filter-update', {\n state: savedFilter,\n filters: [...filtersList],\n });\n\n if (response.error) {\n setErr(response.error.message);\n setNameOpen(true);\n return;\n }\n\n onReloadSavedFilter(savedFilter, 'update');\n break;\n case 'save-filter':\n setErr(null);\n setAdding(true);\n setMenuOpen(false);\n setNameOpen(true);\n break;\n case 'reload-filter':\n setMenuOpen(false);\n savedFilter = {\n ...savedFilter,\n status: 'saved',\n };\n onReloadSavedFilter(savedFilter, 'reload');\n break;\n case 'clear-filter':\n setMenuOpen(false);\n onClearFilters();\n break;\n default:\n }\n };\n\n async function onAddUpdate() {\n if (adding) {\n const newSavedFilter = {\n conditions: filters,\n conditionsOp,\n name,\n status: 'saved',\n };\n\n const response = await sendCatch('filter-create', {\n state: newSavedFilter,\n filters: [...filtersList],\n });\n\n if (response.error) {\n setErr(response.error.message);\n setNameOpen(true);\n return;\n }\n\n setNameOpen(false);\n onReloadSavedFilter({\n ...newSavedFilter,\n id: response.data,\n });\n return;\n }\n\n const updatedFilter = {\n conditions: filterId.conditions,\n conditionsOp: filterId.conditionsOp,\n id: filterId.id,\n name,\n };\n\n const response = await sendCatch('filter-update', {\n state: updatedFilter,\n filters: [...filtersList],\n });\n\n if (response.error) {\n setErr(response.error.message);\n setNameOpen(true);\n return;\n }\n\n setNameOpen(false);\n onReloadSavedFilter(updatedFilter);\n }\n\n return (\n <View>\n {filters.length > 0 && (\n <Button\n type=\"bare\"\n style={{ marginTop: 10 }}\n onClick={() => {\n setMenuOpen(true);\n }}\n >\n <Text\n style={{\n maxWidth: 150,\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n flexShrink: 0,\n }}\n >\n {!filterId.id ? 'Unsaved filter' : filterId.name} \n </Text>\n {filterId.id && filterId.status !== 'saved' && (\n <Text>(modified) </Text>\n )}\n <SvgExpandArrow width={8} height={8} style={{ marginRight: 5 }} />\n </Button>\n )}\n {menuOpen && (\n <FilterMenu\n onClose={() => setMenuOpen(false)}\n filterId={filterId}\n onFilterMenuSelect={onFilterMenuSelect}\n />\n )}\n {nameOpen && (\n <NameFilter\n onClose={() => setNameOpen(false)}\n menuItem={menuItem}\n name={name}\n setName={setName}\n adding={adding}\n onAddUpdate={onAddUpdate}\n err={err}\n />\n )}\n </View>\n );\n}\n","import React from 'react';\n\nimport { type RuleConditionEntity } from 'loot-core/types/models/rule';\n\nimport { Stack } from '../common/Stack';\nimport { View } from '../common/View';\n\nimport { AppliedFilters } from './AppliedFilters';\nimport {\n type SavedFilter,\n SavedFilterMenuButton,\n} from './SavedFilterMenuButton';\n\nexport function FiltersStack({\n filters,\n conditionsOp,\n onUpdateFilter,\n onDeleteFilter,\n onClearFilters,\n onReloadSavedFilter,\n filterId,\n filtersList,\n onCondOpChange,\n}: {\n filters: RuleConditionEntity[];\n conditionsOp: string;\n onUpdateFilter: (\n filter: RuleConditionEntity,\n newFilter: RuleConditionEntity,\n ) => RuleConditionEntity;\n onDeleteFilter: (filter: RuleConditionEntity) => void;\n onClearFilters: () => void;\n onReloadSavedFilter: (savedFilter: SavedFilter, value?: string) => void;\n filterId: SavedFilter;\n filtersList: RuleConditionEntity[];\n onCondOpChange: () => void;\n}) {\n return (\n <View>\n <Stack\n spacing={2}\n direction=\"row\"\n justify=\"flex-start\"\n align=\"flex-start\"\n >\n <AppliedFilters\n filters={filters}\n conditionsOp={conditionsOp}\n onCondOpChange={onCondOpChange}\n onUpdate={onUpdateFilter}\n onDelete={onDeleteFilter}\n />\n <View style={{ flex: 1 }} />\n <SavedFilterMenuButton\n filters={filters}\n conditionsOp={conditionsOp}\n filterId={filterId}\n onClearFilters={onClearFilters}\n onReloadSavedFilter={onReloadSavedFilter}\n filtersList={filtersList}\n />\n </Stack>\n </View>\n );\n}\n","import React, { useMemo } from 'react';\n\nimport { useSelectedItems } from '../../hooks/useSelected';\nimport { Menu } from '../common/Menu';\nimport { SelectedItemsButton } from '../table';\n\nimport { isPreviewId } from './TransactionsTable';\n\nexport function SelectedTransactionsButton({\n getTransaction,\n onShow,\n onDuplicate,\n onDelete,\n onEdit,\n onUnlink,\n onCreateRule,\n onScheduleAction,\n pushModal,\n}) {\n const selectedItems = useSelectedItems();\n\n const types = useMemo(() => {\n const items = [...selectedItems];\n return {\n preview: !!items.find(id => isPreviewId(id)),\n trans: !!items.find(id => !isPreviewId(id)),\n };\n }, [selectedItems]);\n\n const ambiguousDuplication = useMemo(() => {\n const transactions = [...selectedItems].map(id => getTransaction(id));\n\n return transactions.some(t => t && t.is_child);\n }, [selectedItems]);\n\n const linked = useMemo(() => {\n return (\n !types.preview &&\n [...selectedItems].every(id => {\n const t = getTransaction(id);\n return t && t.schedule;\n })\n );\n }, [types.preview, selectedItems, getTransaction]);\n\n return (\n <SelectedItemsButton\n name=\"transactions\"\n keyHandlers={\n types.trans && {\n f: () => onShow([...selectedItems]),\n d: () => onDelete([...selectedItems]),\n a: () => onEdit('account', [...selectedItems]),\n p: () => onEdit('payee', [...selectedItems]),\n n: () => onEdit('notes', [...selectedItems]),\n c: () => onEdit('category', [...selectedItems]),\n l: () => onEdit('cleared', [...selectedItems]),\n }\n }\n items={[\n ...(!types.trans\n ? [\n { name: 'view-schedule', text: 'View schedule' },\n { name: 'post-transaction', text: 'Post transaction' },\n { name: 'skip', text: 'Skip scheduled date' },\n ]\n : [\n { name: 'show', text: 'Show', key: 'F' },\n {\n name: 'duplicate',\n text: 'Duplicate',\n disabled: ambiguousDuplication,\n },\n { name: 'delete', text: 'Delete', key: 'D' },\n ...(linked\n ? [\n {\n name: 'view-schedule',\n text: 'View schedule',\n disabled: selectedItems.size > 1,\n },\n { name: 'unlink-schedule', text: 'Unlink schedule' },\n ]\n : [\n {\n name: 'link-schedule',\n text: 'Link schedule',\n },\n {\n name: 'create-rule',\n text: 'Create rule',\n },\n ]),\n Menu.line,\n { type: Menu.label, name: 'Edit field' },\n { name: 'date', text: 'Date' },\n { name: 'account', text: 'Account', key: 'A' },\n { name: 'payee', text: 'Payee', key: 'P' },\n { name: 'notes', text: 'Notes', key: 'N' },\n { name: 'category', text: 'Category', key: 'C' },\n { name: 'amount', text: 'Amount' },\n { name: 'cleared', text: 'Cleared', key: 'L' },\n ]),\n ]}\n onSelect={name => {\n switch (name) {\n case 'show':\n onShow([...selectedItems]);\n break;\n case 'duplicate':\n onDuplicate([...selectedItems]);\n break;\n case 'delete':\n onDelete([...selectedItems]);\n break;\n case 'post-transaction':\n case 'skip':\n onScheduleAction(name, selectedItems);\n break;\n case 'view-schedule':\n const firstId = [...selectedItems][0];\n let scheduleId;\n if (isPreviewId(firstId)) {\n const parts = firstId.split('/');\n scheduleId = parts[1];\n } else {\n const trans = getTransaction(firstId);\n scheduleId = trans && trans.schedule;\n }\n\n if (scheduleId) {\n pushModal('schedule-edit', { id: scheduleId });\n }\n break;\n case 'link-schedule':\n pushModal('schedule-link', {\n transactionIds: [...selectedItems],\n getTransaction,\n pushModal,\n });\n break;\n case 'unlink-schedule':\n onUnlink([...selectedItems]);\n break;\n case 'create-rule':\n onCreateRule([...selectedItems]);\n break;\n default:\n onEdit(name, [...selectedItems]);\n }\n }}\n />\n );\n}\n","import React from 'react';\n\nimport { useCachedSchedules } from 'loot-core/src/client/data-hooks/schedules';\nimport { q } from 'loot-core/src/shared/query';\nimport { getScheduledAmount } from 'loot-core/src/shared/schedules';\n\nimport { useSelectedItems } from '../../hooks/useSelected';\nimport { SvgArrowButtonRight1 } from '../../icons/v2';\nimport { theme } from '../../style';\nimport { Button } from '../common/Button';\nimport { Text } from '../common/Text';\nimport { View } from '../common/View';\nimport { PrivacyFilter } from '../PrivacyFilter';\nimport { CellValue } from '../spreadsheet/CellValue';\nimport { useFormat } from '../spreadsheet/useFormat';\nimport { useSheetValue } from '../spreadsheet/useSheetValue';\nimport { isPreviewId } from '../transactions/TransactionsTable';\n\nfunction DetailedBalance({ name, balance, isExactBalance = true }) {\n const format = useFormat();\n return (\n <Text\n style={{\n marginLeft: 15,\n borderRadius: 4,\n padding: '4px 6px',\n color: theme.pillText,\n backgroundColor: theme.pillBackground,\n }}\n >\n {name}{' '}\n <PrivacyFilter>\n <Text style={{ fontWeight: 600 }}>\n {!isExactBalance && '~ '}\n {format(balance, 'financial')}\n </Text>\n </PrivacyFilter>\n </Text>\n );\n}\n\nfunction SelectedBalance({ selectedItems, account }) {\n const name = `selected-balance-${[...selectedItems].join('-')}`;\n\n const rows = useSheetValue({\n name,\n query: q('transactions')\n .filter({\n id: { $oneof: [...selectedItems] },\n parent_id: { $oneof: [...selectedItems] },\n })\n .select('id'),\n });\n const ids = new Set((rows || []).map(r => r.id));\n\n const finalIds = [...selectedItems].filter(id => !ids.has(id));\n let balance = useSheetValue({\n name: name + '-sum',\n query: q('transactions')\n .filter({ id: { $oneof: finalIds } })\n .options({ splits: 'all' })\n .calculate({ $sum: '$amount' }),\n });\n\n let scheduleBalance = null;\n const scheduleData = useCachedSchedules();\n const schedules = scheduleData ? scheduleData.schedules : [];\n const previewIds = [...selectedItems]\n .filter(id => isPreviewId(id))\n .map(id => id.slice(8));\n let isExactBalance = true;\n\n for (const s of schedules) {\n if (previewIds.includes(s.id)) {\n // If a schedule is `between X and Y` then we calculate the average\n if (s._amountOp === 'isbetween') {\n isExactBalance = false;\n }\n\n if (!account || account.id === s._account) {\n scheduleBalance += getScheduledAmount(s._amount);\n } else {\n scheduleBalance -= getScheduledAmount(s._amount);\n }\n }\n }\n\n if (balance == null) {\n if (scheduleBalance == null) {\n return null;\n } else {\n balance = scheduleBalance;\n }\n } else if (scheduleBalance != null) {\n balance += scheduleBalance;\n }\n\n return (\n <DetailedBalance\n name=\"Selected balance:\"\n balance={balance}\n isExactBalance={isExactBalance}\n />\n );\n}\n\nfunction MoreBalances({ balanceQuery }) {\n const cleared = useSheetValue({\n name: balanceQuery.name + '-cleared',\n query: balanceQuery.query.filter({ cleared: true }),\n });\n const uncleared = useSheetValue({\n name: balanceQuery.name + '-uncleared',\n query: balanceQuery.query.filter({ cleared: false }),\n });\n\n return (\n <View style={{ flexDirection: 'row' }}>\n <DetailedBalance name=\"Cleared total:\" balance={cleared} />\n <DetailedBalance name=\"Uncleared total:\" balance={uncleared} />\n </View>\n );\n}\n\nexport function Balances({\n balanceQuery,\n showExtraBalances,\n onToggleExtraBalances,\n account,\n}) {\n const selectedItems = useSelectedItems();\n\n return (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n marginTop: -5,\n marginLeft: -5,\n }}\n >\n <Button\n data-testid=\"account-balance\"\n type=\"bare\"\n onClick={onToggleExtraBalances}\n style={{\n '& svg': {\n opacity: selectedItems.size > 0 || showExtraBalances ? 1 : 0,\n },\n '&:hover svg': { opacity: 1 },\n paddingTop: 1,\n paddingBottom: 1,\n }}\n >\n <CellValue\n binding={{ ...balanceQuery, value: 0 }}\n type=\"financial\"\n style={{ fontSize: 22, fontWeight: 400 }}\n getStyle={value => ({\n color:\n value < 0\n ? theme.errorText\n : value > 0\n ? theme.noticeTextLight\n : theme.pageTextSubdued,\n })}\n privacyFilter={{\n blurIntensity: 5,\n }}\n />\n\n <SvgArrowButtonRight1\n style={{\n width: 10,\n height: 10,\n marginLeft: 10,\n color: theme.pillText,\n transform: showExtraBalances ? 'rotateZ(180deg)' : 'rotateZ(0)',\n }}\n />\n </Button>\n {showExtraBalances && <MoreBalances balanceQuery={balanceQuery} />}\n\n {selectedItems.size > 0 && (\n <SelectedBalance selectedItems={selectedItems} account={account} />\n )}\n </View>\n );\n}\n","import React from 'react';\n\nimport * as queries from 'loot-core/src/client/queries';\nimport { currencyToInteger } from 'loot-core/src/shared/util';\n\nimport { SvgCheckCircle1 } from '../../icons/v2';\nimport { styles, theme } from '../../style';\nimport { Button } from '../common/Button';\nimport { InitialFocus } from '../common/InitialFocus';\nimport { Input } from '../common/Input';\nimport { Text } from '../common/Text';\nimport { View } from '../common/View';\nimport { useFormat } from '../spreadsheet/useFormat';\nimport { useSheetValue } from '../spreadsheet/useSheetValue';\nimport { Tooltip } from '../tooltips';\n\nexport function ReconcilingMessage({\n balanceQuery,\n targetBalance,\n onDone,\n onCreateTransaction,\n}) {\n const cleared = useSheetValue({\n name: balanceQuery.name + '-cleared',\n value: 0,\n query: balanceQuery.query.filter({ cleared: true }),\n });\n const format = useFormat();\n const targetDiff = targetBalance - cleared;\n\n return (\n <View\n style={{\n flexDirection: 'row',\n alignSelf: 'center',\n backgroundColor: theme.tableBackground,\n ...styles.shadow,\n borderRadius: 4,\n marginTop: 5,\n marginBottom: 15,\n padding: 10,\n }}\n >\n <View style={{ flexDirection: 'row', alignItems: 'center' }}>\n {targetDiff === 0 ? (\n <View\n style={{\n color: theme.noticeTextLight,\n flex: 1,\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <SvgCheckCircle1\n style={{\n width: 13,\n height: 13,\n color: 'inherit',\n marginRight: 3,\n }}\n />\n All reconciled!\n </View>\n ) : (\n <View style={{ color: theme.tableText }}>\n <Text style={{ fontStyle: 'italic', textAlign: 'center' }}>\n Your cleared balance{' '}\n <strong>{format(cleared, 'financial')}</strong> needs{' '}\n <strong>\n {(targetDiff > 0 ? '+' : '') + format(targetDiff, 'financial')}\n </strong>{' '}\n to match\n <br /> your bank’s balance of{' '}\n <Text style={{ fontWeight: 700 }}>\n {format(targetBalance, 'financial')}\n </Text>\n </Text>\n </View>\n )}\n <View style={{ marginLeft: 15 }}>\n <Button type=\"primary\" onClick={onDone}>\n Done Reconciling\n </Button>\n </View>\n {targetDiff !== 0 && (\n <View style={{ marginLeft: 15 }}>\n <Button onClick={() => onCreateTransaction(targetDiff)}>\n Create Reconciliation Transaction\n </Button>\n </View>\n )}\n </View>\n </View>\n );\n}\n\nexport function ReconcileTooltip({ account, onReconcile, onClose }) {\n const balanceQuery = queries.accountBalance(account);\n const clearedBalance = useSheetValue({\n name: balanceQuery.name + '-cleared',\n value: null,\n query: balanceQuery.query.filter({ cleared: true }),\n });\n const format = useFormat();\n\n function onSubmit(e) {\n e.preventDefault();\n const input = e.target.elements[0];\n const amount = currencyToInteger(input.value);\n if (amount != null) {\n onReconcile(amount == null ? clearedBalance : amount);\n onClose();\n } else {\n input.select();\n }\n }\n\n return (\n <Tooltip position=\"bottom-right\" width={275} onClose={onClose}>\n <View style={{ padding: '5px 8px' }}>\n <Text>\n Enter the current balance of your bank account that you want to\n reconcile with:\n </Text>\n <form onSubmit={onSubmit}>\n {clearedBalance != null && (\n <InitialFocus>\n <Input\n defaultValue={format(clearedBalance, 'financial')}\n style={{ margin: '7px 0' }}\n />\n </InitialFocus>\n )}\n <Button type=\"primary\">Reconcile</Button>\n </form>\n </View>\n </Tooltip>\n );\n}\n","import React, { useState, useRef } from 'react';\n\nimport { useLocalPref } from '../../hooks/useLocalPref';\nimport { useSyncServerStatus } from '../../hooks/useSyncServerStatus';\nimport { AnimatedLoading } from '../../icons/AnimatedLoading';\nimport { SvgAdd } from '../../icons/v1';\nimport {\n SvgArrowsExpand3,\n SvgArrowsShrink3,\n SvgDownloadThickBottom,\n SvgPencil1,\n} from '../../icons/v2';\nimport { theme, styles } from '../../style';\nimport { AnimatedRefresh } from '../AnimatedRefresh';\nimport { Button } from '../common/Button';\nimport { InitialFocus } from '../common/InitialFocus';\nimport { Input } from '../common/Input';\nimport { Menu } from '../common/Menu';\nimport { MenuButton } from '../common/MenuButton';\nimport { MenuTooltip } from '../common/MenuTooltip';\nimport { Search } from '../common/Search';\nimport { Stack } from '../common/Stack';\nimport { View } from '../common/View';\nimport { FilterButton } from '../filters/FiltersMenu';\nimport { FiltersStack } from '../filters/FiltersStack';\nimport { KeyHandlers } from '../KeyHandlers';\nimport { NotesButton } from '../NotesButton';\nimport { SelectedTransactionsButton } from '../transactions/SelectedTransactions';\nimport { useSplitsExpanded } from '../transactions/TransactionsTable';\n\nimport { Balances } from './Balance';\nimport { ReconcilingMessage, ReconcileTooltip } from './Reconcile';\n\nexport function AccountHeader({\n tableRef,\n editingName,\n isNameEditable,\n workingHard,\n accountName,\n account,\n filterId,\n filtersList,\n accountsSyncing,\n accounts,\n transactions,\n showBalances,\n showExtraBalances,\n showCleared,\n showEmptyMessage,\n balanceQuery,\n reconcileAmount,\n canCalculateBalance,\n isSorted,\n search,\n filters,\n conditionsOp,\n pushModal,\n onSearch,\n onAddTransaction,\n onShowTransactions,\n onDoneReconciling,\n onCreateReconciliationTransaction,\n onToggleExtraBalances,\n onSaveName,\n onExposeName,\n onSync,\n onImport,\n onMenuSelect,\n onReconcile,\n onBatchDelete,\n onBatchDuplicate,\n onBatchEdit,\n onBatchUnlink,\n onCreateRule,\n onApplyFilter,\n onUpdateFilter,\n onClearFilters,\n onReloadSavedFilter,\n onCondOpChange,\n onDeleteFilter,\n onScheduleAction,\n}) {\n const [menuOpen, setMenuOpen] = useState(false);\n const searchInput = useRef(null);\n const splitsExpanded = useSplitsExpanded();\n const syncServerStatus = useSyncServerStatus();\n const isUsingServer = syncServerStatus !== 'no-server';\n const isServerOffline = syncServerStatus === 'offline';\n const [_, setExpandSplitsPref] = useLocalPref('expand-splits');\n\n let canSync = account && account.account_id && isUsingServer;\n if (!account) {\n // All accounts - check for any syncable account\n canSync = !!accounts.find(account => !!account.account_id) && isUsingServer;\n }\n\n function onToggleSplits() {\n if (tableRef.current) {\n splitsExpanded.dispatch({\n type: 'switch-mode',\n id: tableRef.current.getScrolledItem(),\n });\n\n setExpandSplitsPref(!(splitsExpanded.state.mode === 'expand'));\n }\n }\n\n return (\n <>\n <KeyHandlers\n keys={{\n 'ctrl+f, cmd+f': () => {\n if (searchInput.current) {\n searchInput.current.focus();\n }\n },\n }}\n />\n\n <View style={{ ...styles.pageContent, paddingBottom: 10, flexShrink: 0 }}>\n <View\n style={{ marginTop: 2, marginBottom: 10, alignItems: 'flex-start' }}\n >\n <View>\n {editingName ? (\n <InitialFocus>\n <Input\n defaultValue={accountName}\n onEnter={e => onSaveName(e.target.value)}\n onBlur={e => onSaveName(e.target.value)}\n onEscape={() => onExposeName(false)}\n style={{\n fontSize: 25,\n fontWeight: 500,\n marginTop: -5,\n marginBottom: -2,\n marginLeft: -5,\n paddingTop: 2,\n paddingBottom: 2,\n }}\n />\n </InitialFocus>\n ) : isNameEditable ? (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n gap: 3,\n '& .hover-visible': {\n opacity: 0,\n transition: 'opacity .25s',\n },\n '&:hover .hover-visible': {\n opacity: 1,\n },\n }}\n >\n <View\n style={{\n fontSize: 25,\n fontWeight: 500,\n marginRight: 5,\n marginBottom: -1,\n }}\n data-testid=\"account-name\"\n >\n {account && account.closed\n ? 'Closed: ' + accountName\n : accountName}\n </View>\n\n {account && (\n <NotesButton\n id={`account-${account.id}`}\n defaultColor={theme.pageTextSubdued}\n />\n )}\n <Button\n type=\"bare\"\n aria-label=\"Edit account name\"\n className=\"hover-visible\"\n onClick={() => onExposeName(true)}\n >\n <SvgPencil1\n style={{\n width: 11,\n height: 11,\n color: theme.pageTextSubdued,\n }}\n />\n </Button>\n </View>\n ) : (\n <View\n style={{ fontSize: 25, fontWeight: 500, marginBottom: -1 }}\n data-testid=\"account-name\"\n >\n {account && account.closed\n ? 'Closed: ' + accountName\n : accountName}\n </View>\n )}\n </View>\n </View>\n\n <Balances\n balanceQuery={balanceQuery}\n showExtraBalances={showExtraBalances}\n onToggleExtraBalances={onToggleExtraBalances}\n account={account}\n />\n\n <Stack\n spacing={2}\n direction=\"row\"\n align=\"center\"\n style={{ marginTop: 12 }}\n >\n {((account && !account.closed) || canSync) && (\n <Button\n type=\"bare\"\n onClick={canSync ? onSync : onImport}\n disabled={canSync && isServerOffline}\n >\n {canSync ? (\n <>\n <AnimatedRefresh\n width={13}\n height={13}\n animating={\n (account && accountsSyncing === account.name) ||\n accountsSyncing === '__all'\n }\n style={{ marginRight: 4 }}\n />{' '}\n {isServerOffline ? 'Sync offline' : 'Sync'}\n </>\n ) : (\n <>\n <SvgDownloadThickBottom\n width={13}\n height={13}\n style={{ marginRight: 4 }}\n />{' '}\n Import\n </>\n )}\n </Button>\n )}\n {!showEmptyMessage && (\n <Button type=\"bare\" onClick={onAddTransaction}>\n <SvgAdd width={10} height={10} style={{ marginRight: 3 }} /> Add\n New\n </Button>\n )}\n <View style={{ flexShrink: 0 }}>\n <FilterButton onApply={onApplyFilter} type=\"accounts\" />\n </View>\n <View style={{ flex: 1 }} />\n <Search\n placeholder=\"Search\"\n value={search}\n onChange={onSearch}\n inputRef={searchInput}\n />\n {workingHard ? (\n <View>\n <AnimatedLoading style={{ width: 16, height: 16 }} />\n </View>\n ) : (\n <SelectedTransactionsButton\n getTransaction={id => transactions.find(t => t.id === id)}\n onShow={onShowTransactions}\n onDuplicate={onBatchDuplicate}\n onDelete={onBatchDelete}\n onEdit={onBatchEdit}\n onUnlink={onBatchUnlink}\n onCreateRule={onCreateRule}\n onScheduleAction={onScheduleAction}\n pushModal={pushModal}\n />\n )}\n <Button\n type=\"bare\"\n disabled={search !== '' || filters.length > 0}\n style={{ padding: 6, marginLeft: 10 }}\n onClick={onToggleSplits}\n title={\n splitsExpanded.state.mode === 'collapse'\n ? 'Collapse split transactions'\n : 'Expand split transactions'\n }\n >\n {splitsExpanded.state.mode === 'collapse' ? (\n <SvgArrowsShrink3 style={{ width: 14, height: 14 }} />\n ) : (\n <SvgArrowsExpand3 style={{ width: 14, height: 14 }} />\n )}\n </Button>\n {account ? (\n <View>\n <MenuButton onClick={() => setMenuOpen(true)} />\n\n {menuOpen && (\n <AccountMenu\n account={account}\n canSync={canSync}\n canShowBalances={canCalculateBalance()}\n isSorted={isSorted}\n showBalances={showBalances}\n showCleared={showCleared}\n onMenuSelect={item => {\n setMenuOpen(false);\n onMenuSelect(item);\n }}\n onReconcile={onReconcile}\n onClose={() => setMenuOpen(false)}\n />\n )}\n </View>\n ) : (\n <View>\n <MenuButton onClick={() => setMenuOpen(true)} />\n\n {menuOpen && (\n <CategoryMenu\n onMenuSelect={item => {\n setMenuOpen(false);\n onMenuSelect(item);\n }}\n onClose={() => setMenuOpen(false)}\n isSorted={isSorted}\n />\n )}\n </View>\n )}\n </Stack>\n\n {filters && filters.length > 0 && (\n <FiltersStack\n filters={filters}\n conditionsOp={conditionsOp}\n onUpdateFilter={onUpdateFilter}\n onDeleteFilter={onDeleteFilter}\n onClearFilters={onClearFilters}\n onReloadSavedFilter={onReloadSavedFilter}\n filterId={filterId}\n filtersList={filtersList}\n onCondOpChange={onCondOpChange}\n />\n )}\n </View>\n {reconcileAmount != null && (\n <ReconcilingMessage\n targetBalance={reconcileAmount}\n balanceQuery={balanceQuery}\n onDone={onDoneReconciling}\n onCreateTransaction={onCreateReconciliationTransaction}\n />\n )}\n </>\n );\n}\n\nfunction AccountMenu({\n account,\n canSync,\n showBalances,\n canShowBalances,\n showCleared,\n onClose,\n isSorted,\n onReconcile,\n onMenuSelect,\n}) {\n const [tooltip, setTooltip] = useState('default');\n const syncServerStatus = useSyncServerStatus();\n\n return tooltip === 'reconcile' ? (\n <ReconcileTooltip\n account={account}\n onClose={onClose}\n onReconcile={onReconcile}\n />\n ) : (\n <MenuTooltip width={200} onClose={onClose}>\n <Menu\n onMenuSelect={item => {\n if (item === 'reconcile') {\n setTooltip('reconcile');\n } else {\n onMenuSelect(item);\n }\n }}\n items={[\n isSorted && {\n name: 'remove-sorting',\n text: 'Remove all sorting',\n },\n canShowBalances && {\n name: 'toggle-balance',\n text: (showBalances ? 'Hide' : 'Show') + ' running balance',\n },\n {\n name: 'toggle-cleared',\n text: (showCleared ? 'Hide' : 'Show') + ' “cleared” checkboxes',\n },\n { name: 'export', text: 'Export' },\n { name: 'reconcile', text: 'Reconcile' },\n account &&\n !account.closed &&\n (canSync\n ? {\n name: 'unlink',\n text: 'Unlink account',\n }\n : syncServerStatus === 'online' && {\n name: 'link',\n text: 'Link account',\n }),\n account.closed\n ? { name: 'reopen', text: 'Reopen account' }\n : { name: 'close', text: 'Close account' },\n ].filter(x => x)}\n />\n </MenuTooltip>\n );\n}\n\nfunction CategoryMenu({ onClose, onMenuSelect, isSorted }) {\n return (\n <MenuTooltip width={200} onClose={onClose}>\n <Menu\n onMenuSelect={item => {\n onMenuSelect(item);\n }}\n items={[\n isSorted && {\n name: 'remove-sorting',\n text: 'Remove all sorting',\n },\n { name: 'export', text: 'Export' },\n ]}\n />\n </MenuTooltip>\n );\n}\n","import React, { PureComponent, createRef, useMemo } from 'react';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { Navigate, useParams, useLocation, useMatch } from 'react-router-dom';\n\nimport { debounce } from 'debounce';\nimport { bindActionCreators } from 'redux';\n\nimport * as actions from 'loot-core/src/client/actions';\nimport { useFilters } from 'loot-core/src/client/data-hooks/filters';\nimport {\n SchedulesProvider,\n useCachedSchedules,\n} from 'loot-core/src/client/data-hooks/schedules';\nimport * as queries from 'loot-core/src/client/queries';\nimport { runQuery, pagedQuery } from 'loot-core/src/client/query-helpers';\nimport { send, listen } from 'loot-core/src/platform/client/fetch';\nimport { currentDay } from 'loot-core/src/shared/months';\nimport { q } from 'loot-core/src/shared/query';\nimport { getScheduledAmount } from 'loot-core/src/shared/schedules';\nimport {\n deleteTransaction,\n updateTransaction,\n realizeTempTransactions,\n ungroupTransaction,\n ungroupTransactions,\n} from 'loot-core/src/shared/transactions';\nimport { applyChanges, groupById } from 'loot-core/src/shared/util';\n\nimport { useAccounts } from '../../hooks/useAccounts';\nimport { useCategories } from '../../hooks/useCategories';\nimport { useDateFormat } from '../../hooks/useDateFormat';\nimport { useFailedAccounts } from '../../hooks/useFailedAccounts';\nimport { useLocalPref } from '../../hooks/useLocalPref';\nimport { usePayees } from '../../hooks/usePayees';\nimport { SelectedProviderWithItems } from '../../hooks/useSelected';\nimport { styles, theme } from '../../style';\nimport { Button } from '../common/Button';\nimport { Text } from '../common/Text';\nimport { View } from '../common/View';\nimport { TransactionList } from '../transactions/TransactionList';\nimport {\n SplitsExpandedProvider,\n useSplitsExpanded,\n} from '../transactions/TransactionsTable';\n\nimport { AccountHeader } from './Header';\n\nfunction EmptyMessage({ onAdd }) {\n return (\n <View\n style={{\n color: theme.tableText,\n backgroundColor: theme.tableBackground,\n flex: 1,\n alignItems: 'center',\n borderTopWidth: 1,\n borderColor: theme.tableBorder,\n }}\n >\n <View\n style={{\n width: 550,\n marginTop: 75,\n fontSize: 15,\n alignItems: 'center',\n }}\n >\n <Text style={{ textAlign: 'center', lineHeight: '1.4em' }}>\n For Actual to be useful, you need to <strong>add an account</strong>.\n You can link an account to automatically download transactions, or\n manage it locally yourself.\n </Text>\n\n <Button type=\"primary\" style={{ marginTop: 20 }} onClick={onAdd}>\n Add account\n </Button>\n\n <View\n style={{ marginTop: 20, fontSize: 13, color: theme.tableTextLight }}\n >\n In the future, you can add accounts from the sidebar.\n </View>\n </View>\n </View>\n );\n}\n\nfunction AllTransactions({\n account = {},\n transactions,\n balances,\n showBalances,\n filtered,\n children,\n}) {\n const { id: accountId } = account;\n const scheduleData = useCachedSchedules();\n\n transactions ??= [];\n\n const schedules = useMemo(\n () =>\n scheduleData\n ? scheduleData.schedules.filter(\n s =>\n !s.completed &&\n ['due', 'upcoming', 'missed'].includes(\n scheduleData.statuses.get(s.id),\n ),\n )\n : [],\n [scheduleData],\n );\n\n const prependTransactions = useMemo(() => {\n return schedules.map(schedule => ({\n id: `preview/${schedule.id}`,\n payee: schedule._payee,\n account: schedule._account,\n amount: schedule._amount,\n date: schedule.next_date,\n notes: scheduleData.statuses.get(schedule.id),\n schedule: schedule.id,\n _inverse: accountId ? accountId !== schedule._account : false,\n }));\n }, [schedules, accountId]);\n\n let runningBalance = useMemo(() => {\n if (!showBalances) {\n return 0;\n }\n\n return balances && transactions?.length > 0\n ? balances[transactions[0].id]?.balance ?? 0\n : 0;\n }, [showBalances, balances, transactions]);\n\n const prependBalances = useMemo(() => {\n if (!showBalances) {\n return null;\n }\n\n // Reverse so we can calculate from earliest upcoming schedule.\n const scheduledBalances = [...prependTransactions]\n .reverse()\n .map(scheduledTransaction => {\n const amount =\n (scheduledTransaction._inverse ? -1 : 1) *\n getScheduledAmount(scheduledTransaction.amount);\n return {\n balance: (runningBalance += amount),\n id: scheduledTransaction.id,\n };\n });\n return groupById(scheduledBalances);\n }, [showBalances, prependTransactions, runningBalance]);\n\n const allTransactions = useMemo(() => {\n // Don't prepend scheduled transactions if we are filtering\n if (!filtered && prependTransactions.length > 0) {\n return prependTransactions.concat(transactions);\n }\n return transactions;\n }, [filtered, prependTransactions, transactions]);\n\n const allBalances = useMemo(() => {\n // Don't prepend scheduled transactions if we are filtering\n if (!filtered && prependBalances && balances) {\n return { ...prependBalances, ...balances };\n }\n return balances;\n }, [filtered, prependBalances, balances]);\n\n if (scheduleData == null) {\n return children(transactions, balances);\n }\n return children(allTransactions, allBalances);\n}\n\nfunction getField(field) {\n switch (field) {\n case 'account':\n return 'account.name';\n case 'payee':\n return 'payee.name';\n case 'category':\n return 'category.name';\n case 'payment':\n return 'amount';\n case 'deposit':\n return 'amount';\n default:\n return field;\n }\n}\n\nclass AccountInternal extends PureComponent {\n constructor(props) {\n super(props);\n this.paged = null;\n this.table = createRef();\n this.animated = true;\n\n this.state = {\n search: '',\n filters: [],\n loading: true,\n workingHard: false,\n reconcileAmount: null,\n transactions: [],\n transactionsCount: 0,\n showBalances: props.showBalances,\n balances: null,\n showCleared: props.showCleared,\n editingName: false,\n isAdding: false,\n latestDate: null,\n filterId: [],\n conditionsOp: 'and',\n sort: [],\n };\n }\n\n async componentDidMount() {\n const maybeRefetch = tables => {\n if (\n tables.includes('transactions') ||\n tables.includes('category_mapping') ||\n tables.includes('payee_mapping')\n ) {\n return this.refetchTransactions();\n }\n };\n\n const onUndo = async ({ tables, messages }) => {\n await maybeRefetch(tables);\n\n // If all the messages are dealing with transactions, find the\n // first message referencing a non-deleted row so that we can\n // highlight the row\n //\n let focusId;\n if (\n messages.every(msg => msg.dataset === 'transactions') &&\n !messages.find(msg => msg.column === 'tombstone')\n ) {\n const focusableMsgs = messages.filter(\n msg =>\n msg.dataset === 'transactions' && !(msg.column === 'tombstone'),\n );\n\n focusId = focusableMsgs.length === 1 ? focusableMsgs[0].row : null;\n\n // Highlight the transactions\n // this.table && this.table.highlight(focusableMsgs.map(msg => msg.row));\n }\n\n if (this.table.current) {\n this.table.current.edit(null);\n\n // Focus a transaction if applicable. There is a chance if the\n // user navigated away that focusId is a transaction that has\n // been \"paged off\" and we won't focus it. That's ok, we just\n // do our best.\n if (focusId) {\n this.table.current.scrollTo(focusId);\n }\n }\n\n this.props.setLastUndoState(null);\n };\n\n const unlistens = [listen('undo-event', onUndo)];\n\n this.unlisten = () => {\n unlistens.forEach(unlisten => unlisten());\n };\n\n // Important that any async work happens last so that the\n // listeners are set up synchronously\n await this.props.initiallyLoadPayees();\n await this.fetchTransactions();\n\n // If there is a pending undo, apply it immediately (this happens\n // when an undo changes the location to this page)\n if (this.props.lastUndoState && this.props.lastUndoState.current) {\n onUndo(this.props.lastUndoState.current);\n }\n }\n\n componentDidUpdate(prevProps) {\n // If the active account changes - close the transaction entry mode\n if (this.state.isAdding && this.props.accountId !== prevProps.accountId) {\n this.setState({ isAdding: false });\n }\n\n // If the user was on a different screen and is now coming back to\n // the transactions, automatically refresh the transaction to make\n // sure we have updated state\n if (prevProps.modalShowing && !this.props.modalShowing) {\n // This is clearly a hack. Need a better way to track which\n // things are listening to transactions and refetch\n // automatically (use ActualQL?)\n setTimeout(() => {\n this.refetchTransactions();\n }, 100);\n }\n\n //Resest sort/filter/search on account change\n if (this.props.accountId !== prevProps.accountId) {\n this.setState({ sort: [], search: '', filters: [] });\n }\n }\n\n componentWillUnmount() {\n if (this.unlisten) {\n this.unlisten();\n }\n if (this.paged) {\n this.paged.unsubscribe();\n }\n }\n\n fetchAllIds = async () => {\n const { data } = await runQuery(this.paged.getQuery().select('id'));\n // Remember, this is the `grouped` split type so we need to deal\n // with the `subtransactions` property\n return data.reduce((arr, t) => {\n arr.push(t.id);\n t.subtransactions.forEach(sub => arr.push(sub.id));\n return arr;\n }, []);\n };\n\n refetchTransactions = async () => {\n this.paged?.run();\n };\n\n fetchTransactions = () => {\n const query = this.makeRootQuery();\n this.rootQuery = this.currentQuery = query;\n this.updateQuery(query);\n\n if (this.props.accountId) {\n this.props.markAccountRead(this.props.accountId);\n }\n };\n\n makeRootQuery = () => {\n const locationState = this.props.location.state;\n const accountId = this.props.accountId;\n\n if (locationState && locationState.filter) {\n return q('transactions')\n .options({ splits: 'grouped' })\n .filter({\n 'account.offbudget': false,\n ...locationState.filter,\n });\n }\n\n return queries.makeTransactionsQuery(accountId);\n };\n\n updateQuery(query, isFiltered) {\n if (this.paged) {\n this.paged.unsubscribe();\n }\n\n this.paged = pagedQuery(\n query.select('*'),\n async (data, prevData) => {\n const firstLoad = prevData == null;\n\n if (firstLoad) {\n this.table.current?.setRowAnimation(false);\n\n if (isFiltered) {\n this.props.splitsExpandedDispatch({\n type: 'set-mode',\n mode: 'collapse',\n });\n } else {\n this.props.splitsExpandedDispatch({\n type: 'set-mode',\n mode: this.props.expandSplits ? 'expand' : 'collapse',\n });\n }\n }\n\n this.setState(\n {\n transactions: data,\n transactionCount: this.paged.getTotalCount(),\n transactionsFiltered: isFiltered,\n loading: false,\n workingHard: false,\n balances: this.state.showBalances\n ? await this.calculateBalances()\n : null,\n },\n () => {\n if (firstLoad) {\n this.table.current?.scrollToTop();\n }\n\n setTimeout(() => {\n this.table.current?.setRowAnimation(true);\n }, 0);\n },\n );\n },\n {\n pageCount: 150,\n onlySync: true,\n mapper: ungroupTransactions,\n },\n );\n }\n\n UNSAFE_componentWillReceiveProps(nextProps) {\n if (this.props.accountId !== nextProps.accountId) {\n this.setState(\n {\n editingName: false,\n loading: true,\n search: '',\n showBalances: nextProps.showBalances,\n balances: null,\n showCleared: nextProps.showCleared,\n reconcileAmount: null,\n },\n () => {\n this.fetchTransactions();\n },\n );\n }\n }\n\n onSearch = value => {\n this.paged.unsubscribe();\n this.setState({ search: value }, this.onSearchDone);\n };\n\n onSearchDone = debounce(() => {\n if (this.state.search === '') {\n this.updateQuery(this.currentQuery, this.state.filters.length > 0);\n } else {\n this.updateQuery(\n queries.makeTransactionSearchQuery(\n this.currentQuery,\n this.state.search,\n this.props.dateFormat,\n ),\n true,\n );\n }\n }, 150);\n\n onSync = async () => {\n const accountId = this.props.accountId;\n const account = this.props.accounts.find(acct => acct.id === accountId);\n\n await this.props.syncAndDownload(account ? account.id : null);\n };\n\n onImport = async () => {\n const accountId = this.props.accountId;\n const account = this.props.accounts.find(acct => acct.id === accountId);\n const categories = await this.props.getCategories();\n\n if (account) {\n const res = await window.Actual.openFileDialog({\n filters: [\n {\n name: 'Financial Files',\n extensions: ['qif', 'ofx', 'qfx', 'csv', 'tsv'],\n },\n ],\n });\n\n if (res) {\n this.props.pushModal('import-transactions', {\n accountId,\n categories,\n filename: res[0],\n onImported: didChange => {\n if (didChange) {\n this.fetchTransactions();\n }\n },\n });\n }\n }\n };\n\n onExport = async accountName => {\n const exportedTransactions = await send('transactions-export-query', {\n query: this.currentQuery.serialize(),\n });\n const normalizedName =\n accountName && accountName.replace(/[()]/g, '').replace(/\\s+/g, '-');\n const filename = `${normalizedName || 'transactions'}.csv`;\n\n window.Actual.saveFile(\n exportedTransactions,\n filename,\n 'Export Transactions',\n );\n };\n\n onTransactionsChange = (newTransaction, data) => {\n // Apply changes to pagedQuery data\n this.paged.optimisticUpdate(\n data => {\n if (newTransaction._deleted) {\n return data.filter(t => t.id !== newTransaction.id);\n } else {\n return data.map(t => {\n return t.id === newTransaction.id ? newTransaction : t;\n });\n }\n },\n () => {\n return data;\n },\n );\n\n this.props.updateNewTransactions(newTransaction.id);\n };\n\n canCalculateBalance = () => {\n const accountId = this.props.accountId;\n const account = this.props.accounts.find(\n account => account.id === accountId,\n );\n return (\n account &&\n this.state.search === '' &&\n this.state.filters.length === 0 &&\n (this.state.sort.length === 0 ||\n (this.state.sort.field === 'date' &&\n this.state.sort.ascDesc === 'desc'))\n );\n };\n\n async calculateBalances() {\n if (!this.canCalculateBalance()) {\n return null;\n }\n\n const { data } = await runQuery(\n this.paged\n .getQuery()\n .options({ splits: 'none' })\n .select([{ balance: { $sumOver: '$amount' } }]),\n );\n\n return groupById(data);\n }\n\n onAddTransaction = () => {\n this.setState({ isAdding: true });\n };\n\n onExposeName = flag => {\n this.setState({ editingName: flag });\n };\n\n onSaveName = name => {\n if (name.trim().length) {\n const accountId = this.props.accountId;\n const account = this.props.accounts.find(\n account => account.id === accountId,\n );\n this.props.updateAccount({ ...account, name });\n this.setState({ editingName: false });\n }\n };\n\n onToggleExtraBalances = () => {\n const { accountId, showExtraBalances } = this.props;\n const key = 'show-extra-balances-' + accountId || 'all-accounts';\n\n this.props.savePrefs({ [key]: !showExtraBalances });\n };\n\n onMenuSelect = async item => {\n const accountId = this.props.accountId;\n const account = this.props.accounts.find(\n account => account.id === accountId,\n );\n\n switch (item) {\n case 'link':\n this.props.pushModal('add-account', {\n upgradingAccountId: accountId,\n });\n break;\n case 'unlink':\n this.props.unlinkAccount(accountId);\n break;\n case 'close':\n this.props.openAccountCloseModal(accountId);\n break;\n case 'reopen':\n this.props.reopenAccount(accountId);\n break;\n case 'export':\n const accountName = this.getAccountTitle(account, accountId);\n this.onExport(accountName);\n break;\n case 'toggle-balance':\n if (this.state.showBalances) {\n this.props.savePrefs({ ['show-balances-' + accountId]: false });\n this.setState({ showBalances: false, balances: null });\n } else {\n this.props.savePrefs({ ['show-balances-' + accountId]: true });\n this.setState(\n {\n transactions: [],\n transactionCount: 0,\n filters: [],\n search: '',\n sort: [],\n showBalances: true,\n },\n () => {\n this.fetchTransactions();\n },\n );\n }\n break;\n case 'remove-sorting': {\n this.setState({ sort: [] }, () => {\n const filters = this.state.filters;\n if (filters.length > 0) {\n this.applyFilters([...filters]);\n } else {\n this.fetchTransactions();\n }\n if (this.state.search !== '') {\n this.onSearch(this.state.search);\n }\n });\n break;\n }\n case 'toggle-cleared':\n if (this.state.showCleared) {\n this.props.savePrefs({ ['hide-cleared-' + accountId]: true });\n this.setState({ showCleared: false });\n } else {\n this.props.savePrefs({ ['hide-cleared-' + accountId]: false });\n this.setState({ showCleared: true });\n }\n break;\n default:\n }\n };\n\n getAccountTitle(account, id) {\n const { filterName } = this.props.location.state || {};\n\n if (filterName) {\n return filterName;\n }\n\n if (!account) {\n if (id === 'budgeted') {\n return 'Budgeted Accounts';\n } else if (id === 'offbudget') {\n return 'Off Budget Accounts';\n } else if (id === 'uncategorized') {\n return 'Uncategorized';\n } else if (!id) {\n return 'All Accounts';\n }\n return null;\n }\n\n return account.name;\n }\n\n getBalanceQuery(account, id) {\n return {\n name: `balance-query-${id}`,\n query: this.makeRootQuery().calculate({ $sum: '$amount' }),\n };\n }\n\n isNew = id => {\n return this.props.newTransactions.includes(id);\n };\n\n isMatched = id => {\n return this.props.matchedTransactions.includes(id);\n };\n\n onCreatePayee = name => {\n const trimmed = name.trim();\n if (trimmed !== '') {\n return this.props.createPayee(name);\n }\n return null;\n };\n\n lockTransactions = async () => {\n this.setState({ workingHard: true });\n\n const { accountId } = this.props;\n\n const { data } = await runQuery(\n q('transactions')\n .filter({ cleared: true, reconciled: false, account: accountId })\n .select('*')\n .options({ splits: 'grouped' }),\n );\n let transactions = ungroupTransactions(data);\n\n const changes = { updated: [] };\n\n transactions.forEach(trans => {\n const { diff } = updateTransaction(transactions, {\n ...trans,\n reconciled: true,\n });\n\n transactions = applyChanges(diff, transactions);\n\n changes.updated = changes.updated\n ? changes.updated.concat(diff.updated)\n : diff.updated;\n });\n\n await send('transactions-batch-update', changes);\n await this.refetchTransactions();\n };\n\n onReconcile = async balance => {\n this.setState({ reconcileAmount: balance });\n };\n\n onDoneReconciling = async () => {\n const { accountId } = this.props;\n const { reconcileAmount } = this.state;\n\n const { data } = await runQuery(\n q('transactions')\n .filter({ cleared: true, account: accountId })\n .select('*')\n .options({ splits: 'grouped' }),\n );\n const transactions = ungroupTransactions(data);\n\n let cleared = 0;\n\n transactions.forEach(trans => {\n if (!trans.is_parent) {\n cleared += trans.amount;\n }\n });\n\n const targetDiff = reconcileAmount - cleared;\n\n if (targetDiff === 0) {\n await this.lockTransactions();\n }\n\n this.setState({ reconcileAmount: null });\n };\n\n onCreateReconciliationTransaction = async diff => {\n // Create a new reconciliation transaction\n const reconciliationTransactions = realizeTempTransactions([\n {\n id: 'temp',\n account: this.props.accountId,\n cleared: true,\n reconciled: false,\n amount: diff,\n date: currentDay(),\n notes: 'Reconciliation balance adjustment',\n },\n ]);\n\n // Optimistic UI: update the transaction list before sending the data to the database\n this.setState({\n transactions: [...reconciliationTransactions, ...this.state.transactions],\n });\n\n // sync the reconciliation transaction\n await send('transactions-batch-update', {\n added: reconciliationTransactions,\n });\n await this.refetchTransactions();\n };\n\n onShowTransactions = async ids => {\n this.onApplyFilter({\n customName: 'Selected transactions',\n filter: { id: { $oneof: ids } },\n });\n };\n\n onBatchEdit = async (name, ids) => {\n const onChange = async (name, value) => {\n this.setState({ workingHard: true });\n\n const { data } = await runQuery(\n q('transactions')\n .filter({ id: { $oneof: ids } })\n .select('*')\n .options({ splits: 'grouped' }),\n );\n let transactions = ungroupTransactions(data);\n\n const changes = { deleted: [], updated: [] };\n\n // Cleared is a special case right now\n if (name === 'cleared') {\n // Clear them if any are uncleared, otherwise unclear them\n value = !!transactions.find(t => !t.cleared);\n }\n\n const idSet = new Set(ids);\n\n transactions.forEach(trans => {\n if (name === 'cleared' && trans.reconciled) {\n // Skip transactions that are reconciled. Don't want to set them as\n // uncleared.\n return;\n }\n\n if (!idSet.has(trans.id)) {\n // Skip transactions which aren't actually selected, since the query\n // above also retrieves the siblings & parent of any selected splits.\n return;\n }\n\n const transaction = {\n ...trans,\n [name]: value,\n };\n\n if (name === 'account' && trans.account !== value) {\n transaction.reconciled = false;\n }\n\n const { diff } = updateTransaction(transactions, transaction);\n\n // TODO: We need to keep an updated list of transactions so\n // the logic in `updateTransaction`, particularly about\n // updating split transactions, works. This isn't ideal and we\n // should figure something else out\n transactions = applyChanges(diff, transactions);\n\n changes.deleted = changes.deleted\n ? changes.deleted.concat(diff.deleted)\n : diff.deleted;\n changes.updated = changes.updated\n ? changes.updated.concat(diff.updated)\n : diff.updated;\n changes.added = changes.added\n ? changes.added.concat(diff.added)\n : diff.added;\n });\n\n await send('transactions-batch-update', changes);\n await this.refetchTransactions();\n\n if (this.table.current) {\n this.table.current.edit(transactions[0].id, 'select', false);\n }\n };\n\n if (\n name === 'amount' ||\n name === 'payee' ||\n name === 'account' ||\n name === 'date'\n ) {\n const { data } = await runQuery(\n q('transactions')\n .filter({ id: { $oneof: ids }, reconciled: true })\n .select('*')\n .options({ splits: 'grouped' }),\n );\n const transactions = ungroupTransactions(data);\n\n if (transactions.length > 0) {\n this.props.pushModal('confirm-transaction-edit', {\n onConfirm: () => {\n this.props.pushModal('edit-field', { name, onSubmit: onChange });\n },\n confirmReason: 'batchEditWithReconciled',\n });\n return;\n }\n }\n\n if (name === 'cleared') {\n // Cleared just toggles it on/off and it depends on the data\n // loaded. Need to clean this up in the future.\n onChange('cleared', null);\n } else {\n this.props.pushModal('edit-field', { name, onSubmit: onChange });\n }\n };\n\n onBatchDuplicate = async ids => {\n const onConfirmDuplicate = async ids => {\n this.setState({ workingHard: true });\n\n const { data } = await runQuery(\n q('transactions')\n .filter({ id: { $oneof: ids } })\n .select('*')\n .options({ splits: 'grouped' }),\n );\n\n const changes = {\n added: data\n .reduce((newTransactions, trans) => {\n return newTransactions.concat(\n realizeTempTransactions(ungroupTransaction(trans)),\n );\n }, [])\n .map(({ sort_order, ...trans }) => ({ ...trans })),\n };\n\n await send('transactions-batch-update', changes);\n\n await this.refetchTransactions();\n };\n\n await this.checkForReconciledTransactions(\n ids,\n 'batchDuplicateWithReconciled',\n onConfirmDuplicate,\n );\n };\n\n onBatchDelete = async ids => {\n const onConfirmDelete = async ids => {\n this.setState({ workingHard: true });\n\n const { data } = await runQuery(\n q('transactions')\n .filter({ id: { $oneof: ids } })\n .select('*')\n .options({ splits: 'grouped' }),\n );\n let transactions = ungroupTransactions(data);\n\n const idSet = new Set(ids);\n const changes = { deleted: [], updated: [] };\n\n transactions.forEach(trans => {\n const parentId = trans.parent_id;\n\n // First, check if we're actually deleting this transaction by\n // checking `idSet`. Then, we don't need to do anything if it's\n // a child transaction and the parent is already being deleted\n if (!idSet.has(trans.id) || (parentId && idSet.has(parentId))) {\n return;\n }\n\n const { diff } = deleteTransaction(transactions, trans.id);\n\n // TODO: We need to keep an updated list of transactions so\n // the logic in `updateTransaction`, particularly about\n // updating split transactions, works. This isn't ideal and we\n // should figure something else out\n transactions = applyChanges(diff, transactions);\n\n changes.deleted = diff.deleted\n ? changes.deleted.concat(diff.deleted)\n : diff.deleted;\n changes.updated = diff.updated\n ? changes.updated.concat(diff.updated)\n : diff.updated;\n });\n\n await send('transactions-batch-update', changes);\n await this.refetchTransactions();\n };\n\n await this.checkForReconciledTransactions(\n ids,\n 'batchDeleteWithReconciled',\n onConfirmDelete,\n );\n };\n\n checkForReconciledTransactions = async (ids, confirmReason, onConfirm) => {\n const { data } = await runQuery(\n q('transactions')\n .filter({ id: { $oneof: ids }, reconciled: true })\n .select('*')\n .options({ splits: 'grouped' }),\n );\n const transactions = ungroupTransactions(data);\n if (transactions.length > 0) {\n this.props.pushModal('confirm-transaction-edit', {\n onConfirm: () => {\n onConfirm(ids);\n },\n confirmReason,\n });\n } else {\n onConfirm(ids);\n }\n };\n\n onBatchUnlink = async ids => {\n await send('transactions-batch-update', {\n updated: ids.map(id => ({ id, schedule: null })),\n });\n\n await this.refetchTransactions();\n };\n\n onCreateRule = async ids => {\n const { data } = await runQuery(\n q('transactions')\n .filter({ id: { $oneof: ids } })\n .select('*')\n .options({ splits: 'grouped' }),\n );\n const transactions = ungroupTransactions(data);\n const payeeCondition = transactions[0].imported_payee\n ? {\n field: 'imported_payee',\n op: 'is',\n value: transactions[0].imported_payee,\n type: 'string',\n }\n : {\n field: 'payee',\n op: 'is',\n value: transactions[0].payee,\n type: 'id',\n };\n\n const rule = {\n stage: null,\n conditionsOp: 'and',\n conditions: [payeeCondition],\n actions: [\n {\n op: 'set',\n field: 'category',\n value: transactions[0].category,\n type: 'id',\n },\n ],\n };\n\n this.props.pushModal('edit-rule', { rule });\n };\n\n onCondOpChange = (value, filters) => {\n this.setState({ conditionsOp: value });\n this.setState({ filterId: { ...this.state.filterId, status: 'changed' } });\n this.applyFilters([...filters]);\n if (this.state.search !== '') {\n this.onSearch(this.state.search);\n }\n };\n\n onReloadSavedFilter = (savedFilter, item) => {\n if (item === 'reload') {\n const [getFilter] = this.props.filtersList.filter(\n f => f.id === this.state.filterId.id,\n );\n this.setState({ conditionsOp: getFilter.conditionsOp });\n this.applyFilters([...getFilter.conditions]);\n } else {\n if (savedFilter.status) {\n this.setState({ conditionsOp: savedFilter.conditionsOp });\n this.applyFilters([...savedFilter.conditions]);\n }\n }\n this.setState({ filterId: { ...this.state.filterId, ...savedFilter } });\n };\n\n onClearFilters = () => {\n this.setState({ conditionsOp: 'and' });\n this.setState({ filterId: [] });\n this.applyFilters([]);\n if (this.state.search !== '') {\n this.onSearch(this.state.search);\n }\n };\n\n onUpdateFilter = (oldFilter, updatedFilter) => {\n this.applyFilters(\n this.state.filters.map(f => (f === oldFilter ? updatedFilter : f)),\n );\n this.setState({\n filterId: {\n ...this.state.filterId,\n status: this.state.filterId && 'changed',\n },\n });\n if (this.state.search !== '') {\n this.onSearch(this.state.search);\n }\n };\n\n onDeleteFilter = filter => {\n this.applyFilters(this.state.filters.filter(f => f !== filter));\n if (this.state.filters.length === 1) {\n this.setState({ filterId: [] });\n this.setState({ conditionsOp: 'and' });\n } else {\n this.setState({\n filterId: {\n ...this.state.filterId,\n status: this.state.filterId && 'changed',\n },\n });\n }\n if (this.state.search !== '') {\n this.onSearch(this.state.search);\n }\n };\n\n onApplyFilter = async cond => {\n let filters = this.state.filters;\n if (cond.customName) {\n filters = filters.filter(f => f.customName !== cond.customName);\n }\n if (cond.conditions) {\n this.setState({ filterId: { ...cond, status: 'saved' } });\n this.setState({ conditionsOp: cond.conditionsOp });\n this.applyFilters([...cond.conditions]);\n } else {\n this.setState({\n filterId: {\n ...this.state.filterId,\n status: this.state.filterId && 'changed',\n },\n });\n this.applyFilters([...filters, cond]);\n }\n if (this.state.search !== '') {\n this.onSearch(this.state.search);\n }\n };\n\n onScheduleAction = async (name, ids) => {\n switch (name) {\n case 'post-transaction':\n for (const id of ids) {\n const parts = id.split('/');\n await send('schedule/post-transaction', { id: parts[1] });\n }\n this.refetchTransactions();\n break;\n case 'skip':\n for (const id of ids) {\n const parts = id.split('/');\n await send('schedule/skip-next-date', { id: parts[1] });\n }\n break;\n default:\n }\n };\n\n applyFilters = async conditions => {\n if (conditions.length > 0) {\n const customFilters = conditions\n .filter(cond => !!cond.customName)\n .map(f => f.filter);\n const { filters } = await send('make-filters-from-conditions', {\n conditions: conditions.filter(cond => !cond.customName),\n });\n const conditionsOpKey = this.state.conditionsOp === 'or' ? '$or' : '$and';\n this.currentQuery = this.rootQuery.filter({\n [conditionsOpKey]: [...filters, ...customFilters],\n });\n\n this.setState({ filters: conditions }, () => {\n this.updateQuery(this.currentQuery, true);\n });\n } else {\n this.setState(\n {\n transactions: [],\n transactionCount: 0,\n filters: conditions,\n },\n () => {\n this.fetchTransactions();\n },\n );\n }\n\n if (this.state.sort.length !== 0) {\n this.applySort();\n }\n };\n\n applySort = (field, ascDesc, prevField, prevAscDesc) => {\n const filters = this.state.filters;\n const isFiltered = filters.length > 0;\n const sortField = getField(!field ? this.state.sort.field : field);\n const sortAscDesc = !ascDesc ? this.state.sort.ascDesc : ascDesc;\n const sortPrevField = getField(\n !prevField ? this.state.sort.prevField : prevField,\n );\n const sortPrevAscDesc = !prevField\n ? this.state.sort.prevAscDesc\n : prevAscDesc;\n\n const sortCurrentQuery = function (that, sortField, sortAscDesc) {\n if (sortField === 'cleared') {\n that.currentQuery = that.currentQuery.orderBy({\n reconciled: sortAscDesc,\n });\n }\n\n that.currentQuery = that.currentQuery.orderBy({\n [sortField]: sortAscDesc,\n });\n };\n\n const sortRootQuery = function (that, sortField, sortAscDesc) {\n if (sortField === 'cleared') {\n that.currentQuery = that.rootQuery.orderBy({\n reconciled: sortAscDesc,\n });\n that.currentQuery = that.currentQuery.orderBy({\n cleared: sortAscDesc,\n });\n } else {\n that.currentQuery = that.rootQuery.orderBy({\n [sortField]: sortAscDesc,\n });\n }\n };\n\n // sort by previously used sort field, if any\n const maybeSortByPreviousField = function (\n that,\n sortPrevField,\n sortPrevAscDesc,\n ) {\n if (!sortPrevField) {\n return;\n }\n\n if (sortPrevField === 'cleared') {\n that.currentQuery = that.currentQuery.orderBy({\n reconciled: sortPrevAscDesc,\n });\n }\n\n that.currentQuery = that.currentQuery.orderBy({\n [sortPrevField]: sortPrevAscDesc,\n });\n };\n\n switch (true) {\n // called by applyFilters to sort an already filtered result\n case !field:\n sortCurrentQuery(this, sortField, sortAscDesc);\n break;\n\n // called directly from UI by sorting a column.\n // active filters need to be applied before sorting\n case isFiltered:\n this.applyFilters([...filters]);\n sortCurrentQuery(this, sortField, sortAscDesc);\n break;\n\n // called directly from UI by sorting a column.\n // no active filters, start a new root query.\n case !isFiltered:\n sortRootQuery(this, sortField, sortAscDesc);\n break;\n\n default:\n }\n\n maybeSortByPreviousField(this, sortPrevField, sortPrevAscDesc);\n this.updateQuery(this.currentQuery, isFiltered);\n };\n\n onSort = (headerClicked, ascDesc) => {\n let prevField;\n let prevAscDesc;\n //if staying on same column but switching asc/desc\n //then keep prev the same\n if (headerClicked === this.state.sort.field) {\n prevField = this.state.sort.prevField;\n prevAscDesc = this.state.sort.prevAscDesc;\n this.setState({\n sort: {\n ...this.state.sort,\n ascDesc,\n },\n });\n } else {\n //if switching to new column then capture state\n //of current sort column as prev\n prevField = this.state.sort.field;\n prevAscDesc = this.state.sort.ascDesc;\n this.setState({\n sort: {\n field: headerClicked,\n ascDesc,\n prevField: this.state.sort.field,\n prevAscDesc: this.state.sort.ascDesc,\n },\n });\n }\n\n this.applySort(headerClicked, ascDesc, prevField, prevAscDesc);\n if (this.state.search !== '') {\n this.onSearch(this.state.search);\n }\n };\n\n render() {\n const {\n accounts,\n categoryGroups,\n payees,\n dateFormat,\n hideFraction,\n addNotification,\n accountsSyncing,\n pushModal,\n replaceModal,\n showExtraBalances,\n accountId,\n categoryId,\n } = this.props;\n const {\n transactions,\n loading,\n workingHard,\n filterId,\n reconcileAmount,\n transactionsFiltered,\n editingName,\n showBalances,\n balances,\n showCleared,\n } = this.state;\n\n const account = accounts.find(account => account.id === accountId);\n const accountName = this.getAccountTitle(account, accountId);\n\n if (!accountName && !loading) {\n // This is probably an account that was deleted, so redirect to\n // all accounts\n return <Navigate to=\"/accounts\" replace />;\n }\n\n const category = categoryGroups\n .flatMap(g => g.categories)\n .find(category => category.id === categoryId);\n\n const showEmptyMessage = !loading && !accountId && accounts.length === 0;\n\n const isNameEditable =\n accountId &&\n accountId !== 'budgeted' &&\n accountId !== 'offbudget' &&\n accountId !== 'uncategorized';\n\n const balanceQuery = this.getBalanceQuery(account, accountId);\n\n return (\n <AllTransactions\n account={account}\n transactions={transactions}\n balances={balances}\n showBalances={showBalances}\n filtered={transactionsFiltered}\n >\n {(allTransactions, allBalances) => (\n <SelectedProviderWithItems\n name=\"transactions\"\n items={allTransactions}\n fetchAllIds={this.fetchAllIds}\n registerDispatch={dispatch => (this.dispatchSelected = dispatch)}\n selectAllFilter={item => !item._unmatched && !item.is_parent}\n >\n <View style={styles.page}>\n <AccountHeader\n tableRef={this.table}\n editingName={editingName}\n isNameEditable={isNameEditable}\n workingHard={workingHard}\n account={account}\n filterId={filterId}\n filtersList={this.props.filtersList}\n location={this.props.location}\n accountName={accountName}\n accountsSyncing={accountsSyncing}\n accounts={accounts}\n transactions={transactions}\n showBalances={showBalances}\n showExtraBalances={showExtraBalances}\n showCleared={showCleared}\n showEmptyMessage={showEmptyMessage}\n balanceQuery={balanceQuery}\n canCalculateBalance={this.canCalculateBalance}\n isSorted={this.state.sort.length !== 0}\n reconcileAmount={reconcileAmount}\n search={this.state.search}\n filters={this.state.filters}\n conditionsOp={this.state.conditionsOp}\n savePrefs={this.props.savePrefs}\n pushModal={this.props.pushModal}\n onSearch={this.onSearch}\n onShowTransactions={this.onShowTransactions}\n onMenuSelect={this.onMenuSelect}\n onAddTransaction={this.onAddTransaction}\n onToggleExtraBalances={this.onToggleExtraBalances}\n onSaveName={this.onSaveName}\n onExposeName={this.onExposeName}\n onReconcile={this.onReconcile}\n onDoneReconciling={this.onDoneReconciling}\n onCreateReconciliationTransaction={\n this.onCreateReconciliationTransaction\n }\n onSync={this.onSync}\n onImport={this.onImport}\n onBatchDelete={this.onBatchDelete}\n onBatchDuplicate={this.onBatchDuplicate}\n onBatchEdit={this.onBatchEdit}\n onBatchUnlink={this.onBatchUnlink}\n onCreateRule={this.onCreateRule}\n onUpdateFilter={this.onUpdateFilter}\n onClearFilters={this.onClearFilters}\n onReloadSavedFilter={this.onReloadSavedFilter}\n onCondOpChange={this.onCondOpChange}\n onDeleteFilter={this.onDeleteFilter}\n onApplyFilter={this.onApplyFilter}\n onScheduleAction={this.onScheduleAction}\n />\n\n <View style={{ flex: 1 }}>\n <TransactionList\n tableRef={this.table}\n account={account}\n transactions={transactions}\n allTransactions={allTransactions}\n animated={this.animated}\n loadMoreTransactions={() =>\n this.paged && this.paged.fetchNext()\n }\n accounts={accounts}\n category={category}\n categoryGroups={categoryGroups}\n payees={payees}\n balances={allBalances}\n showBalances={!!allBalances}\n showCleared={showCleared}\n showAccount={\n !accountId ||\n accountId === 'offbudget' ||\n accountId === 'budgeted' ||\n accountId === 'uncategorized'\n }\n isAdding={this.state.isAdding}\n isNew={this.isNew}\n isMatched={this.isMatched}\n isFiltered={\n this.state.search !== '' || this.state.filters.length > 0\n }\n dateFormat={dateFormat}\n hideFraction={hideFraction}\n addNotification={addNotification}\n renderEmpty={() =>\n showEmptyMessage ? (\n <EmptyMessage onAdd={() => replaceModal('add-account')} />\n ) : !loading ? (\n <View\n style={{\n color: theme.tableText,\n marginTop: 20,\n textAlign: 'center',\n fontStyle: 'italic',\n }}\n >\n No transactions\n </View>\n ) : null\n }\n pushModal={pushModal}\n onSort={this.onSort}\n sortField={this.state.sort.field}\n ascDesc={this.state.sort.ascDesc}\n onChange={this.onTransactionsChange}\n onRefetch={this.refetchTransactions}\n onRefetchUpToRow={row =>\n this.paged.refetchUpToRow(row, {\n field: 'date',\n order: 'desc',\n })\n }\n onCloseAddTransaction={() =>\n this.setState({ isAdding: false })\n }\n onCreatePayee={this.onCreatePayee}\n />\n </View>\n </View>\n </SelectedProviderWithItems>\n )}\n </AllTransactions>\n );\n }\n}\n\nfunction AccountHack(props) {\n const { dispatch: splitsExpandedDispatch } = useSplitsExpanded();\n const match = useMatch(props.location.pathname);\n\n return (\n <AccountInternal\n {...props}\n match={match}\n splitsExpandedDispatch={splitsExpandedDispatch}\n />\n );\n}\n\nexport function Account() {\n const params = useParams();\n const location = useLocation();\n\n const { grouped: categoryGroups } = useCategories();\n const newTransactions = useSelector(state => state.queries.newTransactions);\n const matchedTransactions = useSelector(\n state => state.queries.matchedTransactions,\n );\n const accounts = useAccounts();\n const payees = usePayees();\n const failedAccounts = useFailedAccounts();\n const dateFormat = useDateFormat() || 'MM/dd/yyyy';\n const [hideFraction = false] = useLocalPref('hideFraction');\n const [expandSplits] = useLocalPref('expand-splits');\n const [showBalances] = useLocalPref(`show-balances-${params.id}`);\n const [hideCleared] = useLocalPref(`hide-cleared-${params.id}`);\n const [showExtraBalances] = useLocalPref(\n `show-extra-balances-${params.id || 'all-accounts'}`,\n );\n const modalShowing = useSelector(state => state.modals.modalStack.length > 0);\n const accountsSyncing = useSelector(state => state.account.accountsSyncing);\n const lastUndoState = useSelector(state => state.app.lastUndoState);\n\n const state = {\n newTransactions,\n matchedTransactions,\n accounts,\n failedAccounts,\n dateFormat,\n hideFraction,\n expandSplits,\n showBalances,\n showCleared: !hideCleared,\n showExtraBalances,\n payees,\n modalShowing,\n accountsSyncing,\n lastUndoState,\n };\n\n const dispatch = useDispatch();\n const filtersList = useFilters();\n const actionCreators = useMemo(\n () => bindActionCreators(actions, dispatch),\n [dispatch],\n );\n\n const transform = useMemo(() => {\n let filterByAccount = queries.getAccountFilter(params.id, '_account');\n let filterByPayee = queries.getAccountFilter(\n params.id,\n '_payee.transfer_acct',\n );\n\n // Never show schedules on these pages\n if (\n (location.state && location.state.filter) ||\n params.id === 'uncategorized'\n ) {\n filterByAccount = { id: null };\n filterByPayee = { id: null };\n }\n\n return q => {\n q = q.filter({\n $and: [{ '_account.closed': false }],\n $or: [filterByAccount, filterByPayee],\n });\n return q.orderBy({ next_date: 'desc' });\n };\n }, [params.id]);\n\n return (\n <SchedulesProvider transform={transform}>\n <SplitsExpandedProvider\n initialMode={state.expandSplits ? 'collapse' : 'expand'}\n >\n <AccountHack\n {...state}\n categoryGroups={categoryGroups}\n {...actionCreators}\n modalShowing={state.modalShowing}\n accountId={params.id}\n categoryId={location?.state?.filter?.category}\n location={location}\n filtersList={filtersList}\n />\n </SplitsExpandedProvider>\n </SchedulesProvider>\n );\n}\n"],"names":["_excluded","_excluded2","EMPTY_ARRAY","NO_SUBSCRIPTION_ARRAY","storeStateUpdatesReducer","state","action","updateCount","useIsomorphicLayoutEffectWithArgs","effectFunc","effectArgs","dependencies","useIsomorphicLayoutEffect","captureWrapperProps","lastWrapperProps","lastChildProps","renderIsScheduled","wrapperProps","actualChildProps","childPropsFromStoreUpdate","notifyNestedSubs","subscribeUpdates","shouldHandleStateChanges","store","subscription","childPropsSelector","forceComponentUpdateDispatch","didUnsubscribe","lastThrownError","checkForUpdates","latestStoreState","newChildProps","error","e","unsubscribeWrapper","initStateUpdates","connectAdvanced","selectorFactory","_ref","_ref2","_ref2$getDisplayName","getDisplayName","name","_ref2$methodName","methodName","_ref2$renderCountProp","renderCountProp","_ref2$shouldHandleSta","_ref2$storeKey","storeKey","_ref2$forwardRef","forwardRef","_ref2$context","context","ReactReduxContext","connectOptions","_objectWithoutPropertiesLoose","Context","WrappedComponent","wrappedComponentName","displayName","selectorFactoryOptions","_extends","pure","createChildSelector","usePureOnlyMemo","useMemo","callback","ConnectFunction","props","_useMemo","reactReduxForwardedRef","propsContext","ContextToUse","isContextConsumer","React","contextValue","useContext","didStoreComeFromProps","_useMemo2","createSubscription","overriddenContextValue","_useReducer","useReducer","_useReducer$","previousStateUpdateResult","useRef","renderedWrappedComponent","renderedChild","Connect","forwarded","ref","hoistStatics","is","x","y","shallowEqual","objA","objB","keysA","keysB","i","bindActionCreators","actionCreators","dispatch","boundActionCreators","_loop","key","actionCreator","wrapMapToPropsConstant","getConstant","options","constant","constantSelector","getDependsOnOwnProps","mapToProps","wrapMapToPropsFunc","proxy","stateOrDispatch","ownProps","whenMapDispatchToPropsIsFunction","mapDispatchToProps","whenMapDispatchToPropsIsMissing","whenMapDispatchToPropsIsObject","defaultMapDispatchToPropsFactories","whenMapStateToPropsIsFunction","mapStateToProps","whenMapStateToPropsIsMissing","defaultMapStateToPropsFactories","defaultMergeProps","stateProps","dispatchProps","wrapMergePropsFunc","mergeProps","areMergedPropsEqual","hasRunOnce","mergedProps","nextMergedProps","whenMergePropsIsFunction","whenMergePropsIsOmitted","defaultMergePropsFactories","impureFinalPropsSelectorFactory","pureFinalPropsSelectorFactory","areStatesEqual","areOwnPropsEqual","areStatePropsEqual","hasRunAtLeastOnce","handleFirstCall","firstState","firstOwnProps","handleNewPropsAndNewState","handleNewProps","handleNewState","nextStateProps","statePropsChanged","handleSubsequentCalls","nextState","nextOwnProps","propsChanged","stateChanged","finalPropsSelectorFactory","initMapStateToProps","initMapDispatchToProps","initMergeProps","match","arg","factories","result","strictEqual","a","b","createConnect","_temp","_ref$connectHOC","connectHOC","_ref$mapStateToPropsF","mapStateToPropsFactories","_ref$mapDispatchToPro","mapDispatchToPropsFactories","_ref$mergePropsFactor","mergePropsFactories","_ref$selectorFactory","defaultSelectorFactory","_ref3","_ref3$pure","_ref3$areStatesEqual","_ref3$areOwnPropsEqua","_ref3$areStatePropsEq","_ref3$areMergedPropsE","extraOptions","connect","SvgLeftArrow2","_jsx","svg","xmlns","viewBox","style","color","path","fill","d","SvgArrowDown","SvgArrowUp","SvgArrowButtonDown1","_jsxs","SvgArrowButtonRight1","SvgArrowButtonUp1","SvgArrowsExpand3","SvgArrowsShrink3","SvgCustomNotesPaper","SvgDownloadThickBottom","SvgHyperlink2","SvgPencil1","useResizeObserver","func","observer","current","ResizeObserver","entries","contentRect","useCallback","el","disconnect","observe","box","MonthPicker","startMonth","numDisplayed","monthBounds","onSelect","hoverId","setHoverId","useState","targetMonthCount","setTargetMonthCount","currentMonth","monthUtils","firstSelectedMonth","lastSelectedMonth","range","firstSelectedIndex","Math","floor","length","lastSelectedIndex","size","setSize","containerRef","rect","width","min","max","yearHeadersShown","View","flexDirection","alignItems","justifyContent","innerRef","flex","map","month","idx","monthName","selected","lastHoverId","hovered","year","showYearHeader","includes","push","isMonthBudgeted","start","end","padding","textAlign","userSelect","cursor","borderRadius","border","textDecoration","theme","pageTextSubdued","styles","smallText","backgroundColor","tableBorderHover","buttonPrimaryText","buttonBareBackgroundHover","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","fontWeight","onClick","onMouseEnter","onMouseLeave","position","top","left","fontSize","pageText","BudgetPageHeader","onMonthSelect","numMonths","getValidMonth","marginLeft","flexShrink","marginRight","getScrollbarWidth","paddingTop","RenderMonths","component","Component","editingIndex","args","months","MonthsContext","index","editing","NamespaceContext","Provider","value","borderLeft","tableBorder","monthIndex","NotesTooltip","editable","defaultNotes","onClose","notes","setNotes","Tooltip","Notes","focused","onChange","NotesButton","id","height","defaultColor","buttonNormalText","tooltipPosition","hover","setHover","tooltip","useTooltip","data","useLiveQuery","q","filter","select","note","hasNotes","send","close","delayHandler","setDelayHandler","handleMouseEnter","setTimeout","handleMouseLeave","clearTimeout","tooltipOpen","isOpen","Button","type","aria-label","className","display","getOpenEvents","SidebarCategory","category","dragPreview","dragging","isLast","onEditName","onSave","onDelete","onHideNewCategory","temporary","menuOpen","setMenuOpen","displayed","WebkitUserSelect","opacity","hidden","undefined","div","data-testid","textOverflow","whiteSpace","overflow","minWidth","stopPropagation","SvgCheveronDown","Menu","onMenuSelect","items","text","pageTextLight","formInputTextPlaceholderSelected","tableBackground","zIndex","onKeyDown","InputCell","formatter","exposed","onUpdate","onBlur","paddingLeft","borderBottomWidth","inputProps","placeholder","ExpenseCategory","cat","editingCell","dragState","MonthComponent","onEditMonth","onBudgetAction","onShowActivity","onDragChange","onReorder","item","cat_group","dragRef","useDraggable","canDrag","dropRef","dropPos","useDroppable","types","onDrop","Row","collapsed","DropHighlight","pos","offset","preview","cell","onEdit","SidebarGroup","group","onShowNewCategory","onHideNewGroup","onToggleCollapse","SvgExpandArrow","transition","transform","Text","_Fragment","tableRowHeaderBackground","ExpenseGroup","onReorderGroup","onReorderCategory","catDropRef","catDropPos","onLongHover","right","ROW_HEIGHT","categories","IncomeCategory","IncomeGroup","IncomeHeader","onShowNewGroup","margin","BudgetCategories","memo","categoryGroups","dataComponents","onSaveCategory","onSaveGroup","onDeleteCategory","onDeleteGroup","_collapsed","setCollapsedPref","useLocalPref","showHiddenCategories","onCollapse","isAddingGroup","setIsAddingGroup","newCategoryForGroup","setNewCategoryForGroup","expenseGroups","incomeGroup","separateGroups","Array","prototype","concat","apply","groupCategories","setDragState","savedCollapsed","setSavedCollapsed","newDragState","hoveredId","hoveredPos","id_","_onSaveGroup","groupId","c","_onSaveCategory","marginBottom","boxShadow","cardShadow","content","is_income","find","g","ExpenseGroupComponent","ExpenseCategoryComponent","incomeHeaderHeight","IncomeHeaderComponent","IncomeGroupComponent","IncomeCategoryComponent","Error","DropHighlightPosContext","BudgetSummaries","SummaryComponent","widthState","setWidthState","spring","useSpring","config","mass","tension","friction","prevMonth0","allMonths","unshift","subMonths","addMonths","monthWidth","useLayoutEffect","prevMonth","reversed","offsetX","from","to","css","animated","willChange","paddingRight","BudgetTotals","toggleHiddenCategories","expandAllCategories","collapseAllCategories","borderBottom","flexGrow","SvgDotsHorizontalTriple","BudgetTableInner","constructor","budgetCategoriesRef","createRef","draggingState","setState","targetId","findSortUp","targetGroup","findSortDown","moveVertically","dir","flattened","reduce","all","isGroup","nextIdx","findIndex","next","preventDefault","shiftKey","catName","catId","resolveMonth","clearEditing","onToggleHiddenCategories","render","prewarmStartMonth","lightScrollbar","tableHeaderBackground","MonthsProvider","BudgetTotalsComponent","IntersectionBoundary","overflowY","overflowAnchor","budgetDataNode","grouped","queries","collapsedIds","savePrefs","innerDispatch","getState","prefs","local","BudgetTable","getNumPossibleMonths","estimatedTableWidth","DynamicBudgetTableInner","maxMonths","onMonthSelect_","onPreload","setDisplayMax","useBudgetMonthCount","actions","useActions","numPossible","maxWidth","useEffect","DynamicBudgetTable","AutoSizer","ReportProvider","summaryCollapsed","onToggleSummaryCollapse","children","useReport","BudgetSummary","isGoalTemplatesEnabled","useFeatureFlag","onMenuOpen","onMenuClose","ExpandOrCollapseIcon","marginTop","textDecorationSkip","Stack","spacing","alignSelf","IncomeTotal","ExpenseTotal","borderTop","Saved","projected","headerLabelStyle","BudgetTotalsMonth","format","useFormat","monthRightPadding","paddingBottom","CellValue","binding","reportBudget","totalBudgetedExpense","parseFloat","totalSpent","totalLeftover","IncomeHeaderMonth","GroupMonth","SheetCell","tnum","valueProps","groupBudgeted","groupSumAmount","groupBalance","privacyFilter","CategoryMonth","balanceTooltip","onMouseOverCapture","borderTopWidth","borderColor","onExpose","valueStyle","mobileAccountShadow","catBudgeted","getValueStyle","makeAmountGrey","formatExpr","expr","integerToCurrency","unformatExpr","amountToInteger","evalArithmetic","amount","Field","span","catSumAmount","getStyle","truncate","BalanceWithCarryover","disabled","carryover","catCarryover","balance","catBalance","goal","catGoal","budgeted","BalanceTooltip","categoryId","ExpenseGroupMonth","ExpenseCategoryMonth","IncomeGroupMonth","IncomeCategoryMonth","RolloverContext","useRollover","prevMonthName","tableTextLight","ToBudget","showTotalsTooltipOnHover","TotalsList","tableHeaderText","rolloverBudget","totalBudgeted","totalBalance","groupIncomeReceived","BudgetInner","tableRef","spreadsheet","useSpreadsheet","useDispatch","navigate","useNavigate","_startMonth","setBudgetStartMonthPref","setSummaryCollapsedPref","_budgetType","budgetType","_maxMonths","useGlobalPref","initialized","setInitialized","bounds","setBounds","useCategories","loadCategories","getCategories","titlebar","run","prewarmAllMonths","unlistens","listen","tables","subscribe","onTitlebarEvent","forEach","unlisten","then","accountId","warmingMonth","prewarmMonth","categoryNameAlreadyExistsNotification","addNotification","message","toUpperCase","createCategory","updateCategory","mustTransfer","pushModal","transferCategory","deleteCategory","createGroup","updateGroup","deleteGroup","applyBudgetAction","categoryName","goBack","filterName","date","$transform","$eq","sortInfo","cats","moveCandidate","list","moveCategory","moveCategoryGroup","payload","SWITCH_BUDGET_MESSAGE_TYPE","switchBudgetType","newBudgetType","loadPrefs","reportComponents","rolloverComponents","table","RolloverBudgetSummary","rollover","Budget","TitlebarContext","report","page","Schedules","setFilter","scheduleData","useSchedules","schedules","statuses","onAdd","onDiscover","onAction","schedule","completed","resetNextDate","Page","title","Search","SchedulesTable","allowCompleted","GoCardlessLink","window","Modal","isCurrent","showClose","Paragraph","getDisplayValue","obj","serializeTransaction","transaction","showZeroInDeposit","isPreviewId","_inverse","getScheduledAmount","debit","credit","isDateValid","parseISO","deserializeTransaction","originalTransaction","originalDate","realTransaction","parsed","currentDay","isLastChild","transactions","trans","is_child","parent_id","SplitsExpandedContext","useSplitsExpanded","expanded","mode","ids","has","SplitsExpandedProvider","initialMode","cachedState","useSelector","app","lastSplitState","reduxDispatch","Set","delete","add","transitionId","splitState","selectAscDesc","field","ascDesc","clicked","defaultAscDesc","TransactionHeader","hasSelected","showAccount","showCategory","showBalance","showCleared","scrollWidth","onSort","dispatchSelected","useSelectedDispatch","SelectCell","event","HeaderCell","icon","Cell","getPayeePretty","payee","transferAcct","payeeId","startsWith","slice","StatusCell","status","isChild","isClearedField","statusProps","getStatusProps","statusColor","noticeTextLight","errorText","warningText","pageTextLinkLight","plain","CellButton","formInputBorderSelected","visibility","Icon","CustomCell","unexposedContent","UnexposedCellContent","PayeeCell","inherited","payees","accounts","isPreview","onCreatePayee","onManagePayees","onNavigateToTransferAccount","onNavigateToSchedule","isCreatingPayee","account","transfer_acct","tableTextInactive","PayeeIcons","transferAccount","shouldSaveFromKey","inputStyle","PayeeAutocomplete","showManagePayees","tableBehavior","isCreatable","menuPortalTarget","scheduleId","useCachedSchedules","s","buttonStyle","scheduleIconStyle","transferIconStyle","recurring","_date","frequency","SvgArrowsSynchronize","SvgCalendar","isTemporaryId","SvgRightArrow2","Transaction","subtransactions","highlighted","added","matched","inheritedFields","focusedField","dateFormat","hideFraction","onSplit","onToggleSplit","prevShowZero","setPrevShowZero","prevTransaction","setPrevTransaction","setTransaction","showReconciliationWarning","setShowReconciliationWarning","reconciled","onConfirm","onUpdateAfterConfirm","confirmReason","newTransaction","getAccountsById","offbudget","deserialized","imported_payee","importedPayee","cleared","is_parent","isParent","_unmatched","getPayeesById","isBudgetTransfer","isOffBudget","backgroundFocus","amountStyle","letterSpacing","runningBalance","tableRowBackgroundHighlight","tableRowBackgroundHover","tableRowBackgroundHighlightText","tableText","fontStyle","DeleteCell","borderLeftWidth","lineHeight","buttonProps","formatDate","DateSelect","acctId","acct","AccountAutocomplete","includeClosedAccounts","bind","formLabelText","upcomingText","errorBackground","warningBackground","formLabelBackground","upcomingBackground","titleFirst","bare","buttonNormalBorder","readOnly","getCategoriesById","formInputTextHighlight","CategoryAutocomplete","showSplitOption","activationFilters","TransactionError","isDeposit","onAddSplit","onDistributeRemainder","canDistributeRemainder","version","difference","makeTemporaryTransactions","currentAccountId","currentCategoryId","lastDate","indexOf","NewTransaction","editingTransaction","childTransactions","t","emptyChildTransactions","isNew","TransactionTableInner","tableNavigator","newNavigator","renderEmpty","onScroll","isAddingPrev","usePrevious","isAdding","setScrollWidth","saveScrollWidth","parent","child","onCloseAddTransaction","renderRow","selectedItems","showBalances","balances","isMatched","isExpanded","transactionMap","get","isChildDeposit","hasSplitError","forceTop","forceLayout","sortField","getNavigatorProps","onCheckNewEnter","newTransactions","editingId","onAddTemporary","Table","navigator","renderItem","loadMore","loadMoreTransactions","isSelected","onCheckEnter","TransactionTable","setNewTransactions","prevIsAdding","setPrevIsAdding","splitsExpanded","prevSplitsExpanded","mergedRef","useMergedRefs","anchor","setRowAnimation","Map","isAnchored","unanchor","useTableNavigator","getFields","shouldAdd","latestState","savePending","afterSaveFunc","_","forceRerender","useSelectedItems","fields","f","afterSave","metaKey","getLastTransaction","lastTransaction","isSplit","groupedTransaction","groupTransaction","onApplyRules","newTrans","ungroupTransactions","updateTransaction","deleteTransaction","diff","splitTransaction","newId","addSplitTransaction","targetTransactions","parentTransaction","siblingTransactions","emptyTransactions","remainingAmount","acc","amountPerTransaction","remainingCents","amounts","amountIndex","transactionIndex","saveDiff","remoteUpdates","learnCategories","updates","saveDiffAndApply","changes","remoteDiff","applyTransactionDiff","applyChanges","TransactionList","allTransactions","headerContent","isFiltered","onRefetch","transactionsLatest","realizeTempTransactions","updated","sort_order","Date","now","afterRules","getChangedValues","Object","keys","selectedPayee","FilterMenu","filterId","onFilterMenuSelect","MenuTooltip","line","NameFilter","menuItem","setName","adding","onAddUpdate","err","inputRef","focus","form","direction","justify","align","FormField","FormLabel","htmlFor","Input","defaultValue","SavedFilterMenuButton","filters","conditionsOp","onClearFilters","onReloadSavedFilter","filtersList","nameOpen","setNameOpen","setAdding","setErr","setMenuItem","savedFilter","conditions","response","sendCatch","newSavedFilter","updatedFilter","FiltersStack","onUpdateFilter","onDeleteFilter","onCondOpChange","AppliedFilters","SelectedTransactionsButton","getTransaction","onShow","onDuplicate","onUnlink","onCreateRule","onScheduleAction","ambiguousDuplication","some","linked","every","SelectedItemsButton","keyHandlers","p","n","l","label","firstId","split","transactionIds","DetailedBalance","isExactBalance","pillText","pillBackground","PrivacyFilter","SelectedBalance","join","rows","useSheetValue","query","$oneof","r","finalIds","splits","calculate","$sum","scheduleBalance","previewIds","_amountOp","_account","_amount","MoreBalances","balanceQuery","uncleared","Balances","showExtraBalances","onToggleExtraBalances","blurIntensity","ReconcilingMessage","targetBalance","onDone","onCreateTransaction","targetDiff","shadow","SvgCheckCircle1","strong","br","ReconcileTooltip","onReconcile","clearedBalance","onSubmit","input","target","elements","currencyToInteger","InitialFocus","AccountHeader","editingName","isNameEditable","workingHard","accountName","accountsSyncing","showEmptyMessage","reconcileAmount","canCalculateBalance","isSorted","search","onSearch","onAddTransaction","onShowTransactions","onDoneReconciling","onCreateReconciliationTransaction","onSaveName","onExposeName","onSync","onImport","onBatchDelete","onBatchDuplicate","onBatchEdit","onBatchUnlink","onApplyFilter","searchInput","syncServerStatus","useSyncServerStatus","isUsingServer","isServerOffline","setExpandSplitsPref","canSync","account_id","onToggleSplits","getScrolledItem","KeyHandlers","pageContent","onEnter","onEscape","gap","closed","AnimatedRefresh","animating","SvgAdd","FilterButton","onApply","AnimatedLoading","MenuButton","AccountMenu","canShowBalances","CategoryMenu","setTooltip","EmptyMessage","AllTransactions","filtered","prependTransactions","_payee","next_date","prependBalances","scheduledBalances","reverse","scheduledTransaction","groupById","allBalances","getField","AccountInternal","PureComponent","paged","loading","transactionsCount","latestDate","sort","componentDidMount","maybeRefetch","refetchTransactions","onUndo","messages","focusId","msg","dataset","column","focusableMsgs","row","edit","scrollTo","setLastUndoState","initiallyLoadPayees","fetchTransactions","lastUndoState","componentDidUpdate","prevProps","modalShowing","componentWillUnmount","unsubscribe","fetchAllIds","runQuery","getQuery","arr","sub","makeRootQuery","rootQuery","currentQuery","updateQuery","markAccountRead","locationState","location","pagedQuery","prevData","firstLoad","splitsExpandedDispatch","expandSplits","transactionCount","getTotalCount","transactionsFiltered","calculateBalances","scrollToTop","pageCount","onlySync","mapper","UNSAFE_componentWillReceiveProps","nextProps","onSearchDone","debounce","syncAndDownload","res","Actual","openFileDialog","extensions","filename","onImported","didChange","onExport","exportedTransactions","serialize","replace","saveFile","onTransactionsChange","optimisticUpdate","_deleted","updateNewTransactions","$sumOver","flag","trim","updateAccount","upgradingAccountId","unlinkAccount","openAccountCloseModal","reopenAccount","getAccountTitle","applyFilters","getBalanceQuery","matchedTransactions","createPayee","lockTransactions","reconciliationTransactions","customName","deleted","idSet","onConfirmDuplicate","ungroupTransaction","checkForReconciledTransactions","onConfirmDelete","parentId","rule","stage","op","getFilter","oldFilter","cond","parts","customFilters","conditionsOpKey","applySort","prevField","prevAscDesc","sortAscDesc","sortPrevField","sortPrevAscDesc","sortCurrentQuery","that","orderBy","sortRootQuery","maybeSortByPreviousField","headerClicked","replaceModal","Navigate","flatMap","SelectedProviderWithItems","registerDispatch","selectAllFilter","fetchNext","onRefetchUpToRow","refetchUpToRow","order","AccountHack","useMatch","pathname","Account","params","useParams","useLocation","useAccounts","usePayees","failedAccounts","useFailedAccounts","useDateFormat","hideCleared","modals","modalStack","useFilters","filterByAccount","filterByPayee","$and","$or","SchedulesProvider"],"mappings":"0uDAEA,IAAIA,GAAY,CAAC,iBAAkB,aAAc,kBAAmB,2BAA4B,WAAY,UAAW,aAAc,SAAS,EAC1IC,GAAa,CAAC,wBAAwB,EAQtCC,GAAc,CAAA,EACdC,GAAwB,CAAC,KAAM,IAAI,EAUvC,SAASC,GAAyBC,EAAOC,EAAQ,CAC3C,IAAAC,EAAcF,EAAM,CAAC,EACzB,MAAO,CAACC,EAAO,QAASC,EAAc,CAAC,CACzC,CAEA,SAASC,GAAkCC,EAAYC,EAAYC,EAAc,CAC/EC,GAA0B,UAAY,CAC7B,OAAAH,EAAW,MAAM,OAAQC,CAAU,GACzCC,CAAY,CACjB,CAEA,SAASE,GAAoBC,EAAkBC,EAAgBC,EAAmBC,EAAcC,EAAkBC,EAA2BC,EAAkB,CAE7JN,EAAiB,QAAUG,EAC3BF,EAAe,QAAUG,EACzBF,EAAkB,QAAU,GAExBG,EAA0B,UAC5BA,EAA0B,QAAU,KACnBC,IAErB,CAEA,SAASC,GAAiBC,EAA0BC,EAAOC,EAAcC,EAAoBX,EAAkBC,EAAgBC,EAAmBG,EAA2BC,EAAkBM,EAA8B,CAE3N,GAAKJ,EAEL,KAAIK,EAAiB,GACjBC,EAAkB,KAElBC,EAAkB,UAA2B,CAC/C,GAAI,CAAAF,EAMA,KAAAG,EAAmBP,EAAM,WACzBQ,EAAeC,EAEf,GAAA,CAGcD,EAAAN,EAAmBK,EAAkBhB,EAAiB,OAAO,QACtEmB,EAAG,CACFD,EAAAC,EACUL,EAAAK,CACpB,CAEKD,IACeJ,EAAA,MAIhBG,IAAkBhB,EAAe,QAC9BC,EAAkB,SACJI,KAOnBL,EAAe,QAAUgB,EACzBZ,EAA0B,QAAUY,EACpCf,EAAkB,QAAU,GAECU,EAAA,CAC3B,KAAM,gBACN,QAAS,CACP,MAAAM,CACF,CAAA,CACD,GACH,EAIFR,EAAa,cAAgBK,EAC7BL,EAAa,aAAa,EAGVK,IAEZ,IAAAK,EAAqB,UAA8B,CAKrD,GAJiBP,EAAA,GACjBH,EAAa,eAAe,EAC5BA,EAAa,cAAgB,KAEzBI,EAMI,MAAAA,CACR,EAGK,OAAAM,EACT,CAEA,IAAIC,GAAmB,UAA4B,CAC1C,MAAA,CAAC,KAAM,CAAC,CACjB,EAEwB,SAAAC,GAexBC,EACAC,EAAM,CACAA,IAAS,SACXA,EAAO,CAAA,GAGL,IAAAC,EAAQD,EACRE,EAAuBD,EAAM,eAC7BE,EAAiBD,IAAyB,OAAS,SAAUE,EAAM,CACrE,MAAO,mBAAqBA,EAAO,GAAA,EACjCF,EACAG,EAAmBJ,EAAM,WACzBK,EAAaD,IAAqB,OAAS,kBAAoBA,EAC/DE,EAAwBN,EAAM,gBAC9BO,EAAkBD,IAA0B,OAAS,OAAYA,EACjEE,EAAwBR,EAAM,yBAC9BjB,EAA2ByB,IAA0B,OAAS,GAAOA,EACrEC,EAAiBT,EAAM,SACvBU,EAAWD,IAAmB,OAAS,QAAUA,EACjCT,EAAM,QACtB,IACAW,EAAmBX,EAAM,WACzBY,EAAaD,IAAqB,OAAS,GAAQA,EACnDE,EAAgBb,EAAM,QACtBc,EAAUD,IAAkB,OAASE,GAAoBF,EACzDG,EAAiBC,GAA8BjB,EAAOvC,EAAS,EAkB/DyD,EAAUJ,EACP,OAAA,SAAyBK,EAAkB,CAKhD,IAAIC,EAAuBD,EAAiB,aAAeA,EAAiB,MAAQ,YAChFE,EAAcnB,EAAekB,CAAoB,EAEjDE,EAAyBC,GAAS,CAAC,EAAGP,EAAgB,CACxD,eAAAd,EACA,WAAAG,EACA,gBAAAE,EACA,yBAAAxB,EACA,SAAA2B,EACA,YAAAW,EACA,qBAAAD,EACA,iBAAAD,CAAA,CACD,EAEGK,EAAOR,EAAe,KAE1B,SAASS,EAAoBzC,EAAO,CAC3B,OAAAc,EAAgBd,EAAM,SAAUsC,CAAsB,CAC/D,CAKA,IAAII,EAAkBF,EAAOG,EAAU,QAAA,SAAUC,EAAU,CACzD,OAAOA,EAAS,CAAA,EAGlB,SAASC,EAAgBC,EAAO,CAC1B,IAAAC,EAAWJ,EAAAA,QAAQ,UAAY,CAIjC,IAAIK,GAAyBF,EAAM,uBAC/BpD,GAAeuC,GAA8Ba,EAAOpE,EAAU,EAElE,MAAO,CAACoE,EAAM,QAASE,GAAwBtD,EAAY,CAC1D,EAAA,CAACoD,CAAK,CAAC,EACNG,EAAeF,EAAS,CAAC,EACzBC,EAAyBD,EAAS,CAAC,EACnCrD,EAAeqD,EAAS,CAAC,EAEzBG,EAAeP,EAAAA,QAAQ,UAAY,CAG9B,OAAAM,GAAgBA,EAAa,UAAYE,GAAAA,kBAAgCC,GAAM,cAAcH,EAAa,SAAU,IAAI,CAAC,EAAIA,EAAef,CAAA,EAClJ,CAACe,EAAcf,CAAO,CAAC,EAEtBmB,EAAeC,aAAWJ,CAAY,EAItCK,EAAwB,EAAQT,EAAM,OAAU,EAAQA,EAAM,MAAM,UAAa,EAAQA,EAAM,MAAM,SACnEO,GAAyBA,EAAa,MAO5E,IAAIrD,EAAQuD,EAAwBT,EAAM,MAAQO,EAAa,MAC3DnD,EAAqByC,EAAAA,QAAQ,UAAY,CAG3C,OAAOF,EAAoBzC,CAAK,CAAA,EAC/B,CAACA,CAAK,CAAC,EAENwD,EAAYb,EAAAA,QAAQ,UAAY,CAClC,GAAI,CAAC5C,EAAiC,OAAAnB,GAKtC,IAAIqB,GAAewD,GAAmBzD,EAAOuD,EAAwB,KAAOF,EAAa,YAAY,EASjGxD,GAAmBI,GAAa,iBAAiB,KAAKA,EAAY,EAC/D,MAAA,CAACA,GAAcJ,EAAgB,CACrC,EAAA,CAACG,EAAOuD,EAAuBF,CAAY,CAAC,EAC3CpD,EAAeuD,EAAU,CAAC,EAC1B3D,EAAmB2D,EAAU,CAAC,EAI9BE,GAAyBf,EAAAA,QAAQ,UAAY,CAC/C,OAAIY,EAIKF,EAKFd,GAAS,CAAC,EAAGc,EAAc,CAChC,aAAApD,CAAA,CACD,CACA,EAAA,CAACsD,EAAuBF,EAAcpD,CAAY,CAAC,EAGlD0D,EAAcC,EAAAA,WAAW/E,GAA0BF,GAAaiC,EAAgB,EAChFiD,GAAeF,EAAY,CAAC,EAC5BG,EAA4BD,GAAa,CAAC,EAC1C1D,GAA+BwD,EAAY,CAAC,EAG5C,GAAAG,GAA6BA,EAA0B,MACzD,MAAMA,EAA0B,MAIlC,IAAItE,GAAiBuE,EAAAA,SACjBxE,GAAmBwE,SAAOrE,CAAY,EACtCE,GAA4BmE,EAAAA,SAC5BtE,GAAoBsE,SAAO,EAAK,EAChCpE,GAAmB+C,EAAgB,UAAY,CAOjD,OAAI9C,GAA0B,SAAWF,IAAiBH,GAAiB,QAClEK,GAA0B,QAO5BM,EAAmBF,EAAM,SAAS,EAAGN,CAAY,CACvD,EAAA,CAACM,EAAO8D,EAA2BpE,CAAY,CAAC,EAIjBT,GAAAK,GAAqB,CAACC,GAAkBC,GAAgBC,GAAmBC,EAAcC,GAAkBC,GAA2BC,CAAgB,CAAC,EAEzLZ,GAAkCa,GAAkB,CAACC,EAA0BC,EAAOC,EAAcC,EAAoBX,GAAkBC,GAAgBC,GAAmBG,GAA2BC,EAAkBM,EAA4B,EAAG,CAACH,EAAOC,EAAcC,CAAkB,CAAC,EAG9R,IAAA8D,GAA2BrB,EAAAA,QAAQ,UAAY,CACjD,UAA0B,cAAcR,EAAkBI,GAAS,CAAA,EAAI5C,GAAkB,CACvF,IAAKqD,CACN,CAAA,CAAC,CACD,EAAA,CAACA,EAAwBb,EAAkBxC,EAAgB,CAAC,EAG3DsE,GAAgBtB,EAAAA,QAAQ,UAAY,CACtC,OAAI5C,EAIkBqD,GAAM,cAAcF,EAAa,SAAU,CAC7D,MAAOQ,IACNM,EAAwB,EAGtBA,EACN,EAAA,CAACd,EAAcc,GAA0BN,EAAsB,CAAC,EAC5D,OAAAO,EACT,CAGA,IAAIC,EAAU1B,EAAOY,GAAM,KAAKP,CAAe,EAAIA,EAInD,GAHAqB,EAAQ,iBAAmB/B,EACnB+B,EAAA,YAAcrB,EAAgB,YAAcR,EAEhDT,EAAY,CACd,IAAIuC,EAAYf,GAAM,WAAW,SAA2BN,EAAOsB,EAAK,CACtE,UAA0B,cAAcF,EAAS3B,GAAS,CAAA,EAAIO,EAAO,CACnE,uBAAwBsB,CACzB,CAAA,CAAC,CAAA,CACH,EACD,OAAAD,EAAU,YAAc9B,EACxB8B,EAAU,iBAAmBhC,EACtBkC,GAAaF,EAAWhC,CAAgB,CACjD,CAEO,OAAAkC,GAAaH,EAAS/B,CAAgB,CAAA,CAEjD,CCxXA,SAASmC,GAAGC,EAAGC,EAAG,CAChB,OAAID,IAAMC,EACDD,IAAM,GAAKC,IAAM,GAAK,EAAID,IAAM,EAAIC,EAEpCD,IAAMA,GAAKC,IAAMA,CAE5B,CAEe,SAASC,GAAaC,EAAMC,EAAM,CAC/C,GAAIL,GAAGI,EAAMC,CAAI,EAAG,MAAO,GAE3B,GAAI,OAAOD,GAAS,UAAYA,IAAS,MAAQ,OAAOC,GAAS,UAAYA,IAAS,KACpF,MAAO,GAGT,IAAIC,EAAQ,OAAO,KAAKF,CAAI,EACxBG,EAAQ,OAAO,KAAKF,CAAI,EAC5B,GAAIC,EAAM,SAAWC,EAAM,OAAQ,MAAO,GAE1C,QAASC,EAAI,EAAGA,EAAIF,EAAM,OAAQE,IAChC,GAAI,CAAC,OAAO,UAAU,eAAe,KAAKH,EAAMC,EAAME,CAAC,CAAC,GAAK,CAACR,GAAGI,EAAKE,EAAME,CAAC,CAAC,EAAGH,EAAKC,EAAME,CAAC,CAAC,CAAC,EAC7F,MAAO,GAIX,MAAO,EACT,CC1Be,SAASC,GAAmBC,EAAgBC,EAAU,CACnE,IAAIC,EAAsB,CAAA,EAEtBC,EAAQ,SAAeC,EAAK,CAC9B,IAAIC,EAAgBL,EAAeI,CAAG,EAElC,OAAOC,GAAkB,aAC3BH,EAAoBE,CAAG,EAAI,UAAY,CACrC,OAAOH,EAASI,EAAc,MAAM,OAAQ,SAAS,CAAC,CAC9D,EAEA,EAEE,QAASD,KAAOJ,EACdG,EAAMC,CAAG,EAGX,OAAOF,CACT,CCjBO,SAASI,GAAuBC,EAAa,CAC3C,OAAA,SAA8BN,EAAUO,EAAS,CAClD,IAAAC,EAAWF,EAAYN,EAAUO,CAAO,EAE5C,SAASE,GAAmB,CACnB,OAAAD,CACT,CAEA,OAAAC,EAAiB,kBAAoB,GAC9BA,CAAA,CAEX,CAQO,SAASC,GAAqBC,EAAY,CACxC,OAAAA,EAAW,oBAAsB,MAAQA,EAAW,oBAAsB,OAAY,EAAQA,EAAW,kBAAqBA,EAAW,SAAW,CAC7J,CAagB,SAAAC,GAAmBD,EAAYvE,EAAY,CAClD,OAAA,SAA2B4D,EAAUlE,EAAM,CAC9BA,EAAK,YAEvB,IAAI+E,EAAQ,SAAyBC,EAAiBC,EAAU,CACvD,OAAAF,EAAM,kBAAoBA,EAAM,WAAWC,EAAiBC,CAAQ,EAAIF,EAAM,WAAWC,CAAe,CAAA,EAIjH,OAAAD,EAAM,kBAAoB,GAE1BA,EAAM,WAAa,SAAgCC,EAAiBC,EAAU,CAC5EF,EAAM,WAAaF,EACbE,EAAA,kBAAoBH,GAAqBC,CAAU,EACrD,IAAA9C,EAAQgD,EAAMC,EAAiBC,CAAQ,EAEvC,OAAA,OAAOlD,GAAU,aACnBgD,EAAM,WAAahD,EACbgD,EAAA,kBAAoBH,GAAqB7C,CAAK,EAC5CA,EAAAgD,EAAMC,EAAiBC,CAAQ,GAIlClD,CAAA,EAGFgD,CAAA,CAEX,CC7DO,SAASG,GAAiCC,EAAoB,CACnE,OAAO,OAAOA,GAAuB,WAAaL,GAAmBK,CAAwC,EAAI,MACnH,CACO,SAASC,GAAgCD,EAAoB,CAClE,OAAQA,EAIH,OAJwBZ,GAAuB,SAAUL,EAAU,CACtE,MAAO,CACL,SAAUA,CAChB,CACG,CAAA,CACH,CACO,SAASmB,GAA+BF,EAAoB,CACjE,OAAOA,GAAsB,OAAOA,GAAuB,SAAWZ,GAAuB,SAAUL,EAAU,CAC/G,OAAOF,GAAmBmB,EAAoBjB,CAAQ,CACvD,CAAA,EAAI,MACP,CACA,MAAAoB,GAAe,CAACJ,GAAkCE,GAAiCC,EAA8B,EChB1G,SAASE,GAA8BC,EAAiB,CAC7D,OAAO,OAAOA,GAAoB,WAAaV,GAAmBU,CAAkC,EAAI,MAC1G,CACO,SAASC,GAA6BD,EAAiB,CAC5D,OAAQA,EAEH,OAFqBjB,GAAuB,UAAY,CAC3D,MAAO,EACR,CAAA,CACH,CACA,MAAAmB,GAAe,CAACH,GAA+BE,EAA4B,ECP3D,SAAAE,GAAkBC,EAAYC,EAAeZ,EAAU,CACrE,OAAOzD,GAAS,CAAI,EAAAyD,EAAUW,EAAYC,CAAa,CACzD,CACO,SAASC,GAAmBC,EAAY,CACtC,OAAA,SAA6B7B,EAAUlE,EAAM,CAChCA,EAAK,YAAA,IACnByB,EAAOzB,EAAK,KACZgG,EAAsBhG,EAAK,oBAC3BiG,EAAa,GACbC,EACJ,OAAO,SAAyBN,EAAYC,EAAeZ,EAAU,CACnE,IAAIkB,EAAkBJ,EAAWH,EAAYC,EAAeZ,CAAQ,EAEpE,OAAIgB,GACE,CAACxE,GAAQ,CAACuE,EAAoBG,EAAiBD,CAAW,KAAiBA,EAAAC,IAElEF,EAAA,GACCC,EAAAC,GAITD,CAAA,CACT,CAEJ,CACO,SAASE,GAAyBL,EAAY,CACnD,OAAO,OAAOA,GAAe,WAAaD,GAAmBC,CAAU,EAAI,MAC7E,CACO,SAASM,GAAwBN,EAAY,CAC3C,OAACA,EAEJ,OAFiB,UAAY,CACxB,OAAAJ,EACL,CACN,CACA,MAAAW,GAAe,CAACF,GAA0BC,EAAuB,EClCjE,IAAI3I,GAAY,CAAC,sBAAuB,yBAA0B,gBAAgB,EAE3E,SAAS6I,GAAgCf,EAAiBL,EAAoBY,EAAY7B,EAAU,CAClG,OAAA,SAAkCnG,EAAOkH,EAAU,CACjD,OAAAc,EAAWP,EAAgBzH,EAAOkH,CAAQ,EAAGE,EAAmBjB,EAAUe,CAAQ,EAAGA,CAAQ,CAAA,CAExG,CACO,SAASuB,GAA8BhB,EAAiBL,EAAoBY,EAAY7B,EAAUlE,EAAM,CAC7G,IAAIyG,EAAiBzG,EAAK,eACtB0G,EAAmB1G,EAAK,iBACxB2G,EAAqB3G,EAAK,mBAC1B4G,EAAoB,GACpB7I,EACAkH,EACAW,EACAC,EACAK,EAEK,SAAAW,EAAgBC,EAAYC,EAAe,CAC1C,OAAAhJ,EAAA+I,EACG7B,EAAA8B,EACEnB,EAAAJ,EAAgBzH,EAAOkH,CAAQ,EAC5BY,EAAAV,EAAmBjB,EAAUe,CAAQ,EACvCiB,EAAAH,EAAWH,EAAYC,EAAeZ,CAAQ,EACxC2B,EAAA,GACbV,CACT,CAEA,SAASc,GAA4B,CACtB,OAAApB,EAAAJ,EAAgBzH,EAAOkH,CAAQ,EACxCE,EAAmB,oBAAmCU,EAAAV,EAAmBjB,EAAUe,CAAQ,GACjFiB,EAAAH,EAAWH,EAAYC,EAAeZ,CAAQ,EACrDiB,CACT,CAEA,SAASe,GAAiB,CACxB,OAAIzB,EAAgB,oBAAgCI,EAAAJ,EAAgBzH,EAAOkH,CAAQ,GAC/EE,EAAmB,oBAAmCU,EAAAV,EAAmBjB,EAAUe,CAAQ,GACjFiB,EAAAH,EAAWH,EAAYC,EAAeZ,CAAQ,EACrDiB,CACT,CAEA,SAASgB,GAAiB,CACpB,IAAAC,EAAiB3B,EAAgBzH,EAAOkH,CAAQ,EAChDmC,EAAoB,CAACT,EAAmBQ,EAAgBvB,CAAU,EACzD,OAAAA,EAAAuB,EACTC,IAAiClB,EAAAH,EAAWH,EAAYC,EAAeZ,CAAQ,GAC5EiB,CACT,CAES,SAAAmB,EAAsBC,EAAWC,EAAc,CACtD,IAAIC,EAAe,CAACd,EAAiBa,EAActC,CAAQ,EACvDwC,EAAe,CAAChB,EAAea,EAAWvJ,EAAOwJ,EAActC,CAAQ,EAG3E,OAFQlH,EAAAuJ,EACGrC,EAAAsC,EACPC,GAAgBC,EAAqBT,EAA0B,EAC/DQ,EAAqBP,EAAe,EACpCQ,EAAqBP,EAAe,EACjChB,CACT,CAEO,OAAA,SAAgCoB,EAAWC,EAAc,CAC9D,OAAOX,EAAoBS,EAAsBC,EAAWC,CAAY,EAAIV,EAAgBS,EAAWC,CAAY,CAAA,CAEvH,CAMwB,SAAAG,GAA0BxD,EAAUjE,EAAO,CACjE,IAAI0H,EAAsB1H,EAAM,oBAC5B2H,EAAyB3H,EAAM,uBAC/B4H,EAAiB5H,EAAM,eACvBwE,EAAUvD,GAA8BjB,EAAOvC,EAAS,EAExD8H,EAAkBmC,EAAoBzD,EAAUO,CAAO,EACvDU,EAAqByC,EAAuB1D,EAAUO,CAAO,EAC7DsB,EAAa8B,EAAe3D,EAAUO,CAAO,EAM7C1E,EAAkB0E,EAAQ,KAAO+B,GAAgCD,GACrE,OAAOxG,EAAgByF,EAAiBL,EAAoBY,EAAY7B,EAAUO,CAAO,CAC3F,CCrFA,IAAI/G,GAAY,CAAC,OAAQ,iBAAkB,mBAAoB,qBAAsB,qBAAqB,EAwB1G,SAASoK,GAAMC,EAAKC,EAAW5H,EAAM,CACnC,QAAS2D,EAAIiE,EAAU,OAAS,EAAGjE,GAAK,EAAGA,IAAK,CAC9C,IAAIkE,EAASD,EAAUjE,CAAC,EAAEgE,CAAG,EAC7B,GAAIE,EAAQ,OAAOA,CACpB,CAED,OAAO,SAAU/D,EAAUO,EAAS,CAClC,MAAM,IAAI,MAAM,yBAA2B,OAAOsD,EAAM,QAAU3H,EAAO,uCAAyCqE,EAAQ,qBAAuB,GAAG,CACxJ,CACA,CAEA,SAASyD,GAAYC,EAAGC,EAAG,CACzB,OAAOD,IAAMC,CACf,CAIO,SAASC,GAAcC,EAAO,CACnC,IAAItI,EAAOsI,IAAU,OAAS,CAAE,EAAGA,EAC/BC,EAAkBvI,EAAK,WACvBwI,EAAaD,IAAoB,OAASzI,GAAkByI,EAC5DE,EAAwBzI,EAAK,yBAC7B0I,EAA2BD,IAA0B,OAAS/C,GAAkC+C,EAChGE,EAAwB3I,EAAK,4BAC7B4I,EAA8BD,IAA0B,OAASrD,GAAqCqD,EACtGE,EAAwB7I,EAAK,oBAC7B8I,EAAsBD,IAA0B,OAASvC,GAA6BuC,EACtFE,EAAuB/I,EAAK,gBAC5BD,EAAkBgJ,IAAyB,OAASC,GAAyBD,EAEjF,OAAO,SAAiBvD,EAAiBL,EAAoBY,EAAY9F,EAAO,CAC1EA,IAAU,SACZA,EAAQ,CAAA,GAGV,IAAIgJ,EAAQhJ,EACRiJ,EAAaD,EAAM,KACnBxH,EAAOyH,IAAe,OAAS,GAAOA,EACtCC,EAAuBF,EAAM,eAC7BxC,EAAiB0C,IAAyB,OAASjB,GAAciB,EACjEC,EAAwBH,EAAM,iBAC9BvC,EAAmB0C,IAA0B,OAAS1F,GAAe0F,EACrEC,EAAwBJ,EAAM,mBAC9BtC,EAAqB0C,IAA0B,OAAS3F,GAAe2F,EACvEC,EAAwBL,EAAM,oBAC9BjD,EAAsBsD,IAA0B,OAAS5F,GAAe4F,EACxEC,EAAerI,GAA8B+H,EAAOvL,EAAS,EAE7DiK,EAAsBG,GAAMtC,EAAiBkD,EAA0B,iBAAiB,EACxFd,EAAyBE,GAAM3C,EAAoByD,EAA6B,oBAAoB,EACpGf,EAAiBC,GAAM/B,EAAY+C,EAAqB,YAAY,EACxE,OAAON,EAAWzI,EAAiByB,GAAS,CAE1C,WAAY,UAEZ,eAAgB,SAAwBpB,EAAM,CAC5C,MAAO,WAAaA,EAAO,GAC5B,EAED,yBAA0B,EAAQoF,EAElC,oBAAqBmC,EACrB,uBAAwBC,EACxB,eAAgBC,EAChB,KAAMpG,EACN,eAAgBgF,EAChB,iBAAkBC,EAClB,mBAAoBC,EACpB,oBAAqBX,CAC3B,EAAOuD,CAAY,CAAC,CACpB,CACA,CACA,MAAeC,GAAanB,GAAe,EChG9BoB,GAAiB1H,GAC5B2H,EAAA,IAACC,MAAAA,CACE,GAAG5H,EACJ6H,MAAM,6BACNC,QAAQ,YACRC,MAAO,CACLC,MAAO,UACP,GAAGhI,EAAM+H,KACX,EAEA,eAACE,OAAAA,CACCC,KAAK,eACLC,EAAE,sVAAA,EAGN,CAAA,ECfWC,GAAgBpI,GAC3B2H,EAAA,IAACC,MAAAA,CACE,GAAG5H,EACJ6H,MAAM,6BACNC,QAAQ,YACRC,MAAO,CACLC,MAAO,UACP,GAAGhI,EAAM+H,KACX,EAEA,eAACE,OAAAA,CACCE,EAAE,2FACFD,KAAK,cAAA,EAGT,CAAA,ECfWG,GAAcrI,GACzB2H,EAAA,IAACC,MAAAA,CACE,GAAG5H,EACJ6H,MAAM,6BACNC,QAAQ,YACRC,MAAO,CACLC,MAAO,UACP,GAAGhI,EAAM+H,KACX,EAEA,eAACE,OAAAA,CACCE,EAAE,8FACFD,KAAK,cAAA,EAGT,CAAA,ECfWI,GAAuBtI,GAClCuI,EAAA,KAACX,MAAAA,CACE,GAAG5H,EACJ6H,MAAM,6BACNC,QAAQ,YACRC,MAAO,CACLC,MAAO,UACP,GAAGhI,EAAM+H,KACX,kBAECE,OAAAA,CACCE,EAAE,8LACFD,KAAK,cAAA,SAEND,OAAAA,CACCE,EAAE,8LACFD,KAAK,cAAA,GAGT,CAAA,ECnBWM,GAAwBxI,GACnCuI,EAAA,KAACX,MAAAA,CACE,GAAG5H,EACJ6H,MAAM,6BACNC,QAAQ,YACRC,MAAO,CACLC,MAAO,UACP,GAAGhI,EAAM+H,KACX,kBAECE,OAAAA,CACCE,EAAE,+LACFD,KAAK,cAAA,SAEND,OAAAA,CACCE,EAAE,+LACFD,KAAK,cAAA,GAGT,CAAA,ECnBWO,GAAqBzI,GAChCuI,EAAA,KAACX,MAAAA,CACE,GAAG5H,EACJ6H,MAAM,6BACNC,QAAQ,YACRC,MAAO,CACLC,MAAO,UACP,GAAGhI,EAAM+H,KACX,kBAECE,OAAAA,CACCE,EAAE,gMACFD,KAAK,cAAA,SAEND,OAAAA,CACCE,EAAE,0LACFD,KAAK,cAAA,GAGT,CAAA,ECnBWQ,GAAoB1I,GAC/B2H,EAAA,IAACC,MAAAA,CACE,GAAG5H,EACJ6H,MAAM,6BACNK,KAAK,OACLJ,QAAQ,YACRC,MAAO,CACLC,MAAO,UACP,GAAGhI,EAAM+H,KACX,EAEA,eAACE,OAAAA,CACCC,KAAK,eACLC,EAAE,0XAAA,EAGN,CAAA,EChBWQ,GAAoB3I,GAC/B2H,EAAA,IAACC,MAAAA,CACE,GAAG5H,EACJ6H,MAAM,6BACNK,KAAK,OACLJ,QAAQ,YACRC,MAAO,CACLC,MAAO,UACP,GAAGhI,EAAM+H,KACX,EAEA,eAACE,OAAAA,CACCC,KAAK,eACLC,EAAE,iZAAA,EAGN,CAAA,EChBWS,GAAuB5I,GAClC2H,EAAA,IAACC,MAAAA,CACE,GAAG5H,EACJ6H,MAAM,6BACNC,QAAQ,YACRC,MAAO,CACLC,MAAO,UACP,GAAGhI,EAAM+H,KACX,EAEA,eAACE,OAAAA,CACCC,KAAK,eACLC,EAAE,4NAAA,EAGN,CAAA,ECfWU,GAA0B7I,GACrCuI,EAAA,KAACX,MAAAA,CACE,GAAG5H,EACJ6H,MAAM,6BACNC,QAAQ,YACRC,MAAO,CACLC,MAAO,UACP,GAAGhI,EAAM+H,KACX,kBAECE,OAAAA,CACCE,EAAE,uOACFD,KAAK,cAAA,SAEND,OAAAA,CACCE,EAAE,kNACFD,KAAK,cAAA,GAGT,CAAA,ECnBWY,GAAiB9I,GAC5BuI,EAAA,KAACX,MAAAA,CACE,GAAG5H,EACJ6H,MAAM,6BACNC,QAAQ,YACRC,MAAO,CACLC,MAAO,UACP,GAAGhI,EAAM+H,KACX,kBAECE,OAAAA,CACCE,EAAE,mVACFD,KAAK,cAAA,SAEND,OAAAA,CACCE,EAAE,4GACFD,KAAK,cAAA,SAEND,OAAAA,CACCE,EAAE,yUACFD,KAAK,cAAA,GAGT,CAAA,ECvBWa,GAAc/I,GACzB2H,EAAA,IAACC,MAAAA,CACE,GAAG5H,EACJ6H,MAAM,6BACNC,QAAQ,YACRC,MAAO,CACLC,MAAO,UACP,GAAGhI,EAAM+H,KACX,EAEA,eAACE,OAAAA,CACCE,EAAE,iaACFD,KAAK,cAAA,EAGT,CAAA,ECdK,SAASc,GACdC,EAA4C,CAEtCC,MAAAA,EAAWjI,SAAO,IAAA,EACpB,OAACiI,EAASC,UACZD,EAASC,QAAU,IAAIC,eAAeC,GAAAA,CAC/BA,EAAAA,EAAQ,CAAE,EAACC,WAAW,CAAA,CAC7B,GAGiBC,cAAYC,GAAAA,CAC7BN,EAASC,QAAQM,aACbD,GACOL,EAAAA,QAAQO,QAAQF,EAAI,CAAEG,IAAK,YAAA,CAAa,CAErD,EAAG,CAAE,CAAA,CAGP,CCFaC,MAAAA,GAAc,CAAC,CAC1BC,WAAAA,EACAC,aAAAA,EACAC,YAAAA,EACAhC,MAAAA,EACAiC,SAAAA,KACiB,CACjB,KAAM,CAACC,EAASC,CAAW,EAAGC,WAAS,IAAA,EACjC,CAACC,EAAkBC,CAAoB,EAAGF,WAAS,EAAA,EAEnDG,EAAeC,KACfC,EAAqBX,EAErBY,EAAoBF,GACxBC,EACAV,EAAe,CAAA,EAGXY,EAAQH,GACZA,GACEC,EACAJ,EAAmB,EAAIN,EAAe,GAExCS,GACEE,EACAL,EAAmB,EAAIN,EAAe,CAAA,CAAA,EAIpCa,EACJC,KAAKC,MAAMH,EAAMI,OAAS,CAAKF,EAAAA,KAAKC,MAAMf,EAAe,CAAA,EACrDiB,EAAoBJ,EAAqBb,EAAe,EAExD,CAACkB,EAAMC,CAAQ,EAAGd,WAAS,OAAA,EAC3Be,EAAelC,GAAkBmC,GAAAA,CACrCF,EAAQE,EAAKC,OAAS,IAAM,QAAU,KAAA,EACtCf,EACEO,KAAKS,IAAIT,KAAKU,IAAIV,KAAKC,MAAMM,EAAKC,MAAQ,IAAK,EAAK,EAAA,EAAA,CAAA,CAAA,CAExD,EAEMG,EAAmB,CAAA,EAEzB,aACGC,EAAAA,CACCzD,MAAO,CACL0D,cAAe,MACfC,WAAY,SACZC,eAAgB,gBAChB,GAAG5D,CACL,EAEA,eAACyD,EAAAA,CACCI,SAAUV,EACVnD,MAAO,CACL0D,cAAe,MACfI,KAAM,EACNH,WAAY,SACZC,eAAgB,QAClB,WAECjB,EAAMoB,IAAI,CAACC,EAAOC,IAAAA,CACjB,MAAMC,EAAY1B,GAAkBwB,EAAO,KAAA,EACrCG,EACJF,GAAOrB,GAAsBqB,GAAOjB,EAEhCoB,EAAclC,EAAUH,EAAe,EACvCsC,EACJnC,IAAY,KAAO,GAAQ+B,GAAO/B,GAAW+B,GAAOG,EAEhDhD,EAAUmB,IAAiByB,EAC3BM,EAAO9B,GAAmBwB,CAAAA,EAEhC,IAAIO,EAAiB,GAEhBf,EAAiBgB,SAASF,CAAO,IACpCd,EAAiBiB,KAAKH,CAAAA,EACLC,EAAA,IAGnB,MAAMG,EACJV,GAAShC,EAAY2C,OAASX,GAAShC,EAAY4C,IAErD,cACGnB,EAAAA,CAECzD,MAAO,CACL6E,QAAS,UACTxB,MAAOJ,IAAS,MAAQ,OAAS,OACjC6B,UAAW,SACXC,WAAY,OACZC,OAAQ,UACRC,aAAc,EACdC,OAAQ,OACR,GAAI,CAACR,GAAmB,CACtBS,eAAgB,eAChBlF,MAAOmF,EAAMC,eACf,EACA,GAAGC,EAAOC,UACV,GAAIpB,GAAY,CACdqB,gBAAiBJ,EAAMK,iBACvBxF,MAAOmF,EAAMM,iBACf,EACA,IAAKrB,GAAWF,IAAa,CAC3Bc,aAAc,EACdD,OAAQ,SACV,EACA,GAAIX,GACF,CAACF,GAAY,CACXqB,gBAAiBJ,EAAMO,yBACzB,EACF,GAAItB,GACFF,GAAY,CACVqB,gBAAiBJ,EAAMK,gBACzB,EACF,IAAKxB,IAAQrB,GACVqB,IAAQ/B,GAAW,CAACiC,IAAc,CACnCyB,oBAAqB,EACrBC,uBAAwB,CAC1B,EACA,IAAK5B,IAAQjB,GACViB,IAAQG,GAAe,CAACD,IAAc,CACvC2B,qBAAsB,EACtBC,wBAAyB,CAC3B,EACA,GAAI3E,GAAW,CAAE4E,WAAY,MAAO,CACtC,EACAC,QAAS,IAAMhE,EAAS+B,CAAAA,EACxBkC,aAAc,IAAM/D,EAAW8B,CAAAA,EAC/BkC,aAAc,IAAMhE,EAAW,IAAA,YAE9Bc,IAAS,QAAUiB,EAAU,CAAA,EAAKA,EAClCK,SACEd,EAAAA,CACCzD,MAAO,CACLoG,SAAU,WACVC,IAAK,IACLC,KAAM,EACNC,SAAU,GACVP,WAAY,OACZ/F,MAAOyE,EACHU,EAAMoB,SACNpB,EAAMC,eACZ,EAECf,SAAAA,CAAAA,KA5DAN,CAAAA,CAAAA,CAiEX,CAAA,IAIR,EC5JayC,UACX,CAAC,CAAE3E,WAAAA,EAAY4E,cAAAA,EAAeC,UAAAA,EAAW3E,YAAAA,KAAa,CACpD,SAAS4E,EAAc5C,EAAK,CAC1B,MAAMW,EAAQ3C,EAAY2C,MACpBC,EAAMpC,GAAqBR,EAAY4C,IAAK+B,EAAY,CAAA,EAE9D,OAAI3C,EAAQW,EACHA,EACEX,EAAQY,EACVA,EAEFZ,CACT,CAEA,aACGP,EAAAA,CAAKzD,MAAO,CAAE6G,WAAY,IAASC,WAAY,CAAE,EAChD,eAACrD,EAAAA,CAAKzD,MAAO,CAAE+G,YAAa,EAAIC,GAAAA,CAAoB,EAClD,eAACnF,GAAAA,CACCC,WAAAA,EACAC,aAAc4E,EACd3E,YAAAA,EACAhC,MAAO,CAAEiH,WAAY,CAAE,EACvBhF,SAAU+B,GAAS0C,EAAcE,EAAc5C,CAAAA,CAAAA,CAAAA,MAKzD,CACA,EAEFyC,GAAiBjP,YAAc,mBCzBxB,SAAS0P,GAAa,CAC3BC,UAAWC,EACXC,aAAAA,EACAC,KAAAA,EACAtH,MAAAA,GACkB,CAClB,KAAM,CAAEuH,OAAAA,CAAAA,EAAW9O,EAAAA,WAAW+O,EAAAA,EAE9B,OAAOD,EAAOxD,IAAI,CAACC,EAAOyD,IAAAA,CACxB,MAAMC,EAAUL,IAAiBI,EAG/B,OAAA7H,EAAA,IAAC+H,GAAiBC,SAAQ,CAExBC,MAAOrF,GAAyBwB,CAAAA,EAEhC,eAACP,EAAAA,CACCzD,MAAO,CACL8D,KAAM,EACNgE,WAAY,aAAe1C,EAAM2C,YACjC,GAAG/H,CACL,EAEA,eAACoH,EAAAA,CAAUY,WAAYP,EAAOC,QAAAA,EAAmB,GAAGJ,CAAAA,MAVjDG,CAAAA,CAAAA,CAcX,CACF,CC7BA,SAASQ,GAAa,CACpBC,SAAAA,EACAC,aAAAA,EACA/B,SAAAA,EAAW,cACXgC,QAAAA,GACkB,CAClB,KAAM,CAACC,EAAOC,CAAS,EAAGlG,WAAiB+F,CAAAA,EAC3C,aACGI,GAAAA,CAAQnC,SAAAA,EAAoBgC,QAAS,IAAMA,EAAQC,CAAAA,EAClD,eAACG,GAAAA,CACCH,MAAAA,EACAH,SAAAA,EACAO,QAASP,EACTQ,SAAUJ,CAAAA,IAIlB,CAUO,SAASK,GAAY,CAC1BC,GAAAA,EACAvF,MAAAA,EAAQ,GACRwF,OAAAA,EAAS,GACTC,aAAAA,EAAe1D,EAAM2D,iBACrBC,gBAAAA,EACAhJ,MAAAA,CAAAA,EACiB,CACjB,KAAM,CAACiJ,EAAOC,CAAS,EAAG9G,WAAS,EAAA,EAC7B+G,EAAUC,KACVC,EAAOC,GAAa,IAAMC,GAAE,OAAA,EAASC,OAAO,CAAEZ,GAAAA,CAAAA,CAAMa,EAAAA,OAAO,GAAM,EAAA,CAACb,CAAAA,CAAG,EACrEc,EAAOL,GAAQA,EAAKtG,OAAS,EAAIsG,EAAK,CAAA,EAAGK,KAAO,KAChDC,EAAWD,GAAQA,IAAS,GAElC,SAAStB,EAAQC,EAAK,CACpBuB,EAAK,aAAc,CAAEhB,GAAAA,EAAIc,KAAMrB,CAAAA,CAAM,EACrCc,EAAQU,MAAK,CACf,CAEA,KAAM,CAACC,EAAcC,CAAgB,EAAG3H,WAAS,IAAA,EAE3C4H,EAAmB,IAAA,CACvBD,EACEE,WAAW,IAAA,CACTf,EAAS,EAAA,CAAA,EACR,GAAA,CAAA,CAAA,EAIDgB,EAAmB,IAAA,CACvBC,aAAaL,CAAAA,EACbZ,EAAS,EAAA,CAAA,EAILkB,EAAcjB,EAAQkB,QAAWV,GAAYV,EAEnD,cACGxF,EAAAA,CACCzD,MAAO,CAAE8G,WAAY,CAAE,EACvBZ,aAAc8D,EACd7D,aAAc+D,kBAEbI,EAAAA,CACCC,KAAK,OACLC,aAAW,aACXC,UAAW,CAACd,GAAY,CAACS,EAAc,gBAAkB,GACzDpK,MAAO,CACLC,MAAO6I,EACP,GAAG9I,EACH,GAAI2J,GAAY,CAAEe,QAAS,iBAAkB,EAC7C,GAAIN,GAAe,CAAEnK,MAAOmF,EAAM2D,gBAAiB,CACrD,EACC,GAAGI,EAAQwB,cAAe,EAE3B,eAAC9J,GAAAA,CAAoBb,MAAO,CAAEqD,MAAAA,EAAOwF,OAAAA,CAAO,CAAA,KAE7CuB,SACEnC,GAAAA,CACCC,SAAUiB,EAAQkB,OAClBlC,aAAcuB,EACdtD,SAAU4C,EACVZ,QAAAA,CAAAA,KAKV,CCtFO,SAASwC,GAAgB,CAC9B/G,SAAAA,EACAgH,SAAAA,EACAC,YAAAA,EACAC,SAAAA,EACArD,QAAAA,EACA1H,MAAAA,EACAgL,OAAAA,EACAC,WAAAA,EACAC,OAAAA,EACAC,SAAAA,EACAC,kBAAAA,GACqB,CACfC,MAAAA,EAAYR,EAASjC,KAAO,MAC5B,CAAC0C,EAAUC,CAAY,EAAGnJ,WAAS,EAAA,EAEnCoJ,SACH/H,EAAAA,CACCzD,MAAO,CACL0D,cAAe,MACfC,WAAY,SACZoB,WAAY,OACZ0G,iBAAkB,OAClBC,QAASb,EAASc,OAAS,IAAOC,MACpC,kBAECC,MAAAA,CACCC,cAAY,gBACZ9L,MAAO,CACL+L,aAAc,WACdC,WAAY,SACZC,SAAU,SACVC,SAAU,CACZ,EAECrB,SAAAA,EAASvU,IAAAA,UAEXmN,EAAAA,CAAKzD,MAAO,CAAE8G,WAAY,EAAGD,WAAY,CAAE,kBACzCyD,EAAAA,CACCC,KAAK,OACLE,UAAU,gBACVxE,QAASpQ,GAAAA,CACPA,EAAEsW,gBAAe,EACjBZ,EAAY,EAAA,CACd,EACAvL,MAAO,CAAEC,MAAO,eAAgB4E,QAAS,CAAE,EAE3C,eAACuH,GAAAA,CACC/I,MAAO,GACPwF,OAAQ,GACR7I,MAAO,CAAEC,MAAO,cAAe,CAAA,KAGlCqL,SACE/C,GAAAA,CACCnC,SAAS,cACT/C,MAAO,IACPrD,MAAO,CAAE6E,QAAS,CAAE,EACpBuD,QAAS,IAAMmD,EAAY,EAAA,EAE3B,eAACc,GAAAA,CACCC,aAAc/B,GAAAA,CACRA,IAAS,SACXU,EAAWJ,EAASjC,EAAE,EACb2B,IAAS,SAClBY,EAASN,EAASjC,EAAE,EACX2B,IAAS,qBACXW,EAAA,CAAE,GAAGL,EAAUc,OAAQ,CAACd,EAASc,MAAAA,CAAO,EAEjDJ,EAAY,EAAA,CACd,EACAgB,MAAO,CACL,CACEjW,KAAM,oBACNkW,KAAM3B,EAASc,OAAS,OAAS,MACnC,EACA,CAAErV,KAAM,SAAUkW,KAAM,QAAS,EACjC,CAAElW,KAAM,SAAUkW,KAAM,QAAS,CAClC,CAAA,cAKR/I,EAAAA,CAAKzD,MAAO,CAAE8D,KAAM,CAAE,CAAA,SACtB6E,GAAAA,CACCC,GAAIiC,EAASjC,GACb5I,MAAO+K,GAAY,CAAE9K,MAAO,cAAe,EAC3C6I,aAAc1D,EAAMqH,aAAAA,MAK1B,aACGhJ,EAAAA,CACCI,SAAAA,EACA7D,MAAO,CACLqD,MAAO,IACP4I,SAAU,SACV,mBAAoB,CAClBvB,QAAS,MACX,EACA,GAAI,CAACK,GACH,CAACD,GAAe,CACd,yBAA0B,CACxBJ,QAAS,MACX,CACF,EACF,GAAIK,GAAY,CAAE9K,MAAOmF,EAAMsH,gCAAiC,EAGhE,GAAI5B,GAAe,CACjBtF,gBAAiBJ,EAAMuH,gBACvBC,OAAQ,IACR3H,aAAc,EACdgH,SAAU,QACZ,EACA,GAAGjM,CACL,EACA6M,UAAWhX,GAAAA,CACLA,EAAE0E,MAAQ,UACZ0Q,EAAW,IAAA,EACXpV,EAAEsW,gBAAe,EAErB,EAEA,eAACW,GAAAA,CACCjF,MAAOgD,EAASvU,KAChByW,UAAW,IAAMvB,EACjBnI,MAAM,OACN2J,QAAStF,GAAW2D,EACpB4B,SAAUpF,GAAAA,CACJwD,EACExD,IAAU,GACZuD,IACSvD,IAAU,IACZqD,EAAA,CAAE,GAAGL,EAAUvU,KAAMuR,CAAAA,CAAM,EAGhCA,IAAUgD,EAASvU,MACd4U,EAAA,CAAE,GAAGL,EAAUvU,KAAMuR,CAAAA,CAAM,CAGxC,EACAqF,OAAQ,IAAMjC,EAAW,IAAA,EACzBjL,MAAO,CAAEmN,YAAa,GAAI,GAAInC,GAAU,CAAEoC,kBAAmB,CAAE,CAAG,EAClEC,WAAY,CACVC,YAAajC,EAAY,oBAAsB,EACjD,CAAA,IAIR,CCjJO,SAASkC,GAAgB,CAC9BC,IAAAA,EACAC,YAAAA,EACAC,UAAAA,EACAC,eAAAA,EACA1C,WAAAA,EACA2C,YAAAA,EACA1C,OAAAA,EACAC,SAAAA,EACA0C,eAAAA,EACAC,eAAAA,EACAC,aAAAA,EACAC,UAAAA,GACqB,CACjBjD,IAAAA,EAAW2C,GAAaA,EAAUO,OAAST,EAE3CE,GAAaA,EAAUO,KAAKrF,KAAO4E,EAAIU,YAC9BnD,EAAA,IAGP,KAAA,CAAEoD,QAAAA,CAAS,EAAGC,GAAa,CAC/B7D,KAAM,WACNwD,aAAAA,EACAE,KAAMT,EACNa,QAASZ,IAAgB,IAAA,CAC3B,EAEM,CAAEa,QAAAA,EAASC,QAAAA,CAAO,EAAKC,GAAa,CACxCC,MAAO,WACP7F,GAAI4E,EAAI5E,GACR8F,OAAQV,CAAAA,CACV,EAEA,cACGW,GAAAA,CACC9K,SAAUyK,EACVM,UAAW,GACX5O,MAAO,CACLwF,gBAAiBJ,EAAMuH,gBACvBjB,QAAS8B,EAAI7B,OAAS,GAAMC,MAC9B,kBAECiD,GAAAA,CAAcC,IAAKP,EAASQ,OAAQ,CAAE1I,IAAK,CAAE,CAAA,UAE7C5C,EAAAA,CAAKzD,MAAO,CAAE8D,KAAM,EAAGJ,cAAe,KAAM,kBAC1CkH,GAAAA,CACC/G,SAAUsK,EACVtD,SAAU2C,EACV1C,YAAaC,GAAY2C,EAAUsB,QACnCjE,SAAUA,GAAY,CAAC2C,EAAUsB,QACjCtH,QACE+F,GACAA,EAAYwB,OAAS,QACrBxB,EAAY7E,KAAO4E,EAAI5E,GAEzBqC,WAAAA,EACAC,OAAAA,EACAC,SAAAA,CAAAA,SAGDjE,GAAAA,CACCC,UAAWwG,EACXtG,aACEoG,GAAeA,EAAY7E,KAAO4E,EAAI5E,IAAM6E,EAAYwB,KAE1D3H,KAAM,CACJuD,SAAU2C,EACV0B,OAAQtB,EACRC,eAAAA,EACAC,eAAAA,CACF,CAAA,QAKV,CCxEO,SAASqB,GAAa,CAC3BC,MAAAA,EACA1H,QAAAA,EACAkH,UAAAA,EACA9D,YAAAA,EACAjH,SAAAA,EACA7D,MAAAA,EACAkP,OAAAA,EACAhE,OAAAA,EACAC,SAAAA,EACAkE,kBAAAA,EACAC,eAAAA,EACAC,iBAAAA,GACkB,CACZlE,MAAAA,EAAY+D,EAAMxG,KAAO,MACzB,CAAC0C,EAAUC,CAAY,EAAGnJ,WAAS,EAAA,EAEnCoJ,SACH/H,EAAAA,CACCzD,MAAO,CACL0D,cAAe,MACfC,WAAY,SACZoB,WAAY,OACZ0G,iBAAkB,MACpB,EACAxF,QAAS,IAAA,CACPsJ,EAAiBH,EAAMxG,EAAE,CAC3B,YAEC,CAACkC,GACAlL,EAAA,IAAC4P,GAAAA,CACCnM,MAAO,EACPwF,OAAQ,EACR7I,MAAO,CACL+G,YAAa,EACbF,WAAY,EACZC,WAAY,EACZ2I,WAAY,gBACZC,UAAWd,EAAY,iBAAmB,EAC5C,CAAA,UAGH/C,MAAAA,CACC7L,MAAO,CACL+L,aAAc,WACdC,WAAY,SACZC,SAAU,SACVC,SAAU,CACZ,YAECpB,SAAgB6E,EAAAA,CAAK3P,MAAO,CAAEgG,WAAY,GAAI,EAAG,SAAA,SAAA,GACjDoJ,EAAM9Y,QAER,CAACwU,GACAtK,EAAA,KAAAoP,WAAA,kBACGnM,EAAAA,CAAKzD,MAAO,CAAE6G,WAAY,EAAGC,WAAY,CAAE,kBACzCwD,EAAAA,CACCC,KAAK,OACLE,UAAU,gBACVxE,QAASpQ,GAAAA,CACPA,EAAEsW,gBAAe,EACjBZ,EAAY,EAAA,CACd,EACAvL,MAAO,CAAE6E,QAAS,CAAE,EAEpB,eAACuH,GAAAA,CAAgB/I,MAAO,GAAIwF,OAAQ,EAAA,KAErCyC,SACE/C,GAAAA,CACCnC,SAAS,cACT/C,MAAO,IACPrD,MAAO,CAAE6E,QAAS,CAAE,EACpBuD,QAAS,IAAMmD,EAAY,EAAA,EAE3B,eAACc,GAAAA,CACCC,aAAc/B,GAAAA,CACRA,IAAS,SACX2E,EAAOE,EAAMxG,EAAE,EACN2B,IAAS,eAClB8E,EAAkBD,EAAMxG,EAAE,EACjB2B,IAAS,SAClBY,EAASiE,EAAMxG,EAAE,EACR2B,IAAS,qBACXW,EAAA,CAAE,GAAGkE,EAAOzD,OAAQ,CAACyD,EAAMzD,MAAAA,CAAO,EAE3CJ,EAAY,EAAA,CACd,EACAgB,MAAO,CACL,CAAEjW,KAAM,eAAgBkW,KAAM,cAAe,EAC7C,CACElW,KAAM,oBACNkW,KAAM4C,EAAMzD,OAAS,OAAS,MAChC,EACA,CAAErV,KAAM,SAAUkW,KAAM,QAAS,EACjCrB,GAAY,CAAE7U,KAAM,SAAUkW,KAAM,QAAS,CAC9C,CAAA,cAKR/I,EAAAA,CAAKzD,MAAO,CAAE8D,KAAM,CAAE,CAAA,SACtB6E,GAAAA,CACCC,GAAIwG,EAAMxG,GACV5I,MAAO8K,GAAe,CAAE7K,MAAO,cAAe,EAC9C6I,aAAc1D,EAAMqH,aAAAA,SAO9B,aACGhJ,EAAAA,CACCI,SAAAA,EACA7D,MAAO,CACL,GAAGA,EACHqD,MAAO,IACPmC,gBAAiBJ,EAAMyK,yBACvB5D,SAAU,SACV,mBAAoB,CAClBvB,QAAS,MACX,EACA,GAAI,CAACI,GAAe,CAClB,yBAA0B,CACxBJ,QAAS,MACX,CACF,EACA,GAAII,GAAe,CACjBqC,YAAa,GACbP,OAAQ,IACR3H,aAAc,EACdgH,SAAU,QACZ,CACF,EACAY,UAAWhX,GAAAA,CACLA,EAAE0E,MAAQ,UACZ2U,EAAO,IAAA,EACPrZ,EAAEsW,gBAAe,EAErB,EAEA,eAACW,GAAAA,CACCjF,MAAOuH,EAAM9Y,KACbyW,UAAW,IAAMvB,EACjBnI,MAAM,OACN2J,QAAStF,EACTuF,SAAUpF,GAAAA,CACJwD,EACExD,IAAU,GACZyH,IACSzH,IAAU,IACZqD,EAAA,CAAEtC,GAAIwG,EAAMxG,GAAItS,KAAMuR,CAAAA,CAAM,EAG9BqD,EAAA,CAAEtC,GAAIwG,EAAMxG,GAAItS,KAAMuR,CAAAA,CAAM,CAEvC,EACAqF,OAAQ,IAAMgC,EAAO,IAAA,EACrBlP,MAAO,CAAEgG,WAAY,GAAI,EACzBqH,WAAY,CACVrN,MAAO,CAAE6G,WAAY,EAAG,EACxByG,YAAajC,EAAY,iBAAmB,EAC9C,CAAA,IAIR,CCxKO,SAASyE,GAAa,CAC3BV,MAAAA,EACAR,UAAAA,EACAnB,YAAAA,EACAC,UAAAA,EACAC,eAAAA,EACA1C,WAAAA,EACAC,OAAAA,EACAC,SAAAA,EACA4C,aAAAA,EACAgC,eAAAA,EACAC,kBAAAA,EACAT,iBAAAA,EACAF,kBAAAA,GACkB,CACZtE,MAAAA,EAAW2C,GAAaA,EAAUO,OAASmB,EAE3C,CAAEjB,QAAAA,CAAS,EAAGC,GAAa,CAC/B7D,KAAM,QACNwD,aAAAA,EACAE,KAAMmB,EACNf,QAASZ,IAAgB,IAAA,CAC3B,EAEM,CAAEa,QAAAA,EAASC,QAAAA,CAAO,EAAKC,GAAa,CACxCC,MAAO,QACP7F,GAAIwG,EAAMxG,GACV8F,OAAQqB,CAAAA,CACV,EAEM,CAAEzB,QAAS2B,EAAY1B,QAAS2B,CAAAA,EAAe1B,GAAa,CAChEC,MAAO,WACP7F,GAAIwG,EAAMxG,GACV8F,OAAQsB,EACRG,YAAa,IAAA,CACPvB,GACFW,EAAiBH,EAAMxG,EAAE,CAE7B,CAAA,CACF,EAEA,cACG+F,GAAAA,CACCC,UAAW,GACX5O,MAAO,CACLgG,WAAY,IACZ0F,QAAS0D,EAAMzD,OAAS,IAAOC,OAC/BpG,gBAAiBJ,EAAMyK,wBACzB,YAECnC,GAAa,CAACA,EAAUsB,SAAWtB,EAAUnD,OAAS,eACpD9G,EAAAA,CACCI,SAAUyK,EACVtO,MAAO,CACLoG,SAAU,WACVE,KAAM,EACN8J,MAAO,EACPvH,OAAQ+F,EACJyB,GAAa,GACZ,EAAIjB,EAAMkB,WAAWvN,SAAWsN,GAAa,GAAK,EACvDzD,OAAQ,GACV,EAEA,eAACiC,GAAAA,CAAcC,IAAKP,EAASQ,OAAQ,CAAE1I,IAAK,CAAE,CAAA,WAIjDwI,GAAAA,CAAcC,IAAKoB,EAAYnB,OAAQ,CAAE1I,IAAK,CAAE,CAAA,UAEhD5C,EAAAA,CACCI,SAAUoM,EACVjQ,MAAO,CACL8D,KAAM,EACNJ,cAAe,MACfgI,QAASX,GAAY,CAAC2C,EAAUsB,QAAU,GAAM,CAClD,kBAECG,GAAAA,CACCtL,SAAUsK,EACViB,MAAAA,EACA1H,QACE+F,GACAA,EAAYwB,OAAS,QACrBxB,EAAY7E,KAAOwG,EAAMxG,GAE3BkC,YAAaC,GAAY2C,EAAUsB,QACnCJ,UAAAA,EACAW,iBAAAA,EACAL,OAAQjE,EACRC,OAAAA,EACAC,SAAAA,EACAkE,kBAAAA,CAAAA,SAEDnI,GAAAA,CAAaC,UAAWwG,EAAgBrG,KAAM,CAAE8H,MAAAA,CAAM,CAAA,QAI/D,CCrGO,SAASmB,GAAe,CAC7B/C,IAAAA,EACAxC,OAAAA,EACAyC,YAAAA,EACAE,eAAAA,EACA1C,WAAAA,EACA2C,YAAAA,EACA1C,OAAAA,EACAC,SAAAA,EACA4C,aAAAA,EACAF,eAAAA,EACAG,UAAAA,EACAF,eAAAA,GACoB,CACd,KAAA,CAAEK,QAAAA,CAAS,EAAGC,GAAa,CAC/B7D,KAAM,kBACNwD,aAAAA,EACAE,KAAMT,EACNa,QAASZ,IAAgB,IAAA,CAC3B,EAEM,CAAEa,QAAAA,EAASC,QAAAA,CAAO,EAAKC,GAAa,CACxCC,MAAO,kBACP7F,GAAI4E,EAAI5E,GACR8F,OAAQV,CAAAA,CACV,EAEA,cACGW,GAAAA,CAAI9K,SAAUyK,EAASM,UAAW,mBAChCC,GAAAA,CAAcC,IAAKP,EAASQ,OAAQ,CAAE1I,IAAK,CAAE,CAAA,SAE7CuE,GAAAA,CACC/G,SAAUsK,EACVtD,SAAU2C,EACVxC,OAAAA,EACAtD,QACE+F,GACAA,EAAYwB,OAAS,QACrBxB,EAAY7E,KAAO4E,EAAI5E,GAEzBqC,WAAAA,EACAC,OAAAA,EACAC,SAAAA,CAAAA,SAEDjE,GAAAA,CACCC,UAAWwG,EACXtG,aACEoG,GAAeA,EAAY7E,KAAO4E,EAAI5E,IAAM6E,EAAYwB,KAE1D3H,KAAM,CACJuD,SAAU2C,EACV0B,OAAQtB,EACR5C,OAAAA,EACA8C,eAAAA,EACAD,eAAAA,CACF,CAAA,KAIR,CC/DgB2C,SAAAA,GAAY,CAC1BpB,MAAAA,EACA3B,YAAAA,EACAmB,UAAAA,EACAjB,eAAAA,EACA1C,WAAAA,EACAC,OAAAA,EACAqE,iBAAAA,EACAF,kBAAAA,GACiB,CACjB,cACGV,GAAAA,CACCC,UAAW,GACX5O,MAAO,CACLgG,WAAY,IACZR,gBAAiBJ,EAAMyK,wBACzB,kBAECV,GAAAA,CACCC,MAAAA,EACAR,UAAAA,EACAlH,QACE+F,GACAA,EAAYwB,OAAS,QACrBxB,EAAY7E,KAAOwG,EAAMxG,GAE3BsG,OAAQjE,EACRC,OAAAA,EACAqE,iBAAAA,EACAF,kBAAAA,CAAAA,SAEDnI,GAAAA,CAAaC,UAAWwG,EAAgBrG,KAAM,CAAE8H,MAAAA,CAAM,CAAA,KAG7D,CClDO,SAASqB,GAAa,CAC3B9C,eAAAA,EACA+C,eAAAA,GACkB,CAClB,cACGjN,EAAAA,CAAKzD,MAAO,CAAE0D,cAAe,MAAOI,KAAM,CAAE,kBAC1CL,EAAAA,CACCzD,MAAO,CACLqD,MAAO,IACPM,WAAY,aACZC,eAAgB,YAClB,EAEA,eAAC0G,EAAAA,CAAOrE,QAASyK,EAAgB1Q,MAAO,CAAEuG,SAAU,GAAIoK,OAAQ,EAAG,EAAG,SAAA,WAAA,WAIvEzJ,GAAAA,CACCC,UAAWwG,EACX3N,MAAO,CAAEkF,OAAQ,EAAGtB,eAAgB,UAAW,CAAA,KAIvD,CClBO,MAAMgN,GACXC,EAAA,KAAA,CAAC,CACCC,eAAAA,EACArD,YAAAA,EACAsD,eAAAA,EACAlD,eAAAA,EACAC,eAAAA,EACA7C,WAAAA,EACA2C,YAAAA,EACAoD,eAAAA,EACAC,YAAAA,EACAC,iBAAAA,EACAC,cAAAA,EACAnB,kBAAAA,EACAD,eAAAA,KACD,CACC,KAAM,CAACqB,EAAYC,CAAiB,EAAGC,GAAa,kBAAA,EAC9C1C,EAAYwC,GAAc,GAC1B,CAACG,CAAqB,EAAGD,GAAa,6BAAA,EAC5C,SAASE,EAAW3J,EAAK,CACvBwJ,EAAiBxJ,CAAAA,CACnB,CAEA,KAAM,CAAC4J,EAAeC,CAAiB,EAAGtP,WAAS,EAAA,EAC7C,CAACuP,EAAqBC,CAAuB,EAAGxP,WAAS,IAAA,EACzDmK,EAAQzU,EAAAA,QAAQ,IAAA,CACpB,KAAM,CAAC+Z,EAAeC,CAAY,EAAGC,GAAejB,CAAAA,EAEhDvE,IAAAA,EAAQyF,MAAMC,UAAUC,OAAOC,MACjC,CAAA,EACAN,EAAc9N,IAAIqL,GAAAA,CACZA,GAAAA,EAAMzD,QAAU,CAAC4F,EACnB,MAAO,GAGHa,MAAAA,EAAkBhD,EAAMkB,WAAW9G,OACvCgE,GAAO+D,GAAwB,CAAC/D,EAAI7B,MAAM,EAGtCY,EAAQ,CAAC,CAAEhC,KAAM,gBAAiB1C,MAAO,CAAE,GAAGuH,CAAM,CAAE,CAAA,EAExDuC,OAAAA,IAAwBvC,EAAMxG,IAChC2D,EAAM9H,KAAK,CAAE8F,KAAM,cAAA,CAAe,EAG7B,CACFgC,GAAAA,EACA,IAACqC,EAAUpK,SAAS4K,EAAMxG,EAAE,EAAI,CAAA,EAAKwJ,GAAiBrO,IACvDyJ,IAAQ,CACNjD,KAAM,mBACN1C,MAAO2F,CAAAA,EACT,CAAA,CAGN,CAAA,CAAA,EAGF,OAAIiE,GACFlF,EAAM9H,KAAK,CAAE8F,KAAM,WAAA,CAAY,EAG7BuH,IACFvF,EAAQA,EAAM2F,OACZ,CACE,CAAE3H,KAAM,kBAAmB,EAC3B,CAAEA,KAAM,eAAgB1C,MAAOiK,CAAY,EAC3CH,IAAwBG,EAAYlJ,IAAM,CAAE2B,KAAM,cAAe,MAC7DqE,EAAUpK,SAASsN,EAAYlJ,EAAE,EACjC,CAAA,EACAkJ,EAAYxB,WAAW9G,OACrBgE,GAAO+D,GAAwB,CAAC/D,EAAI7B,MAAM,GAE9C5H,IAAIyJ,IAAQ,CACZjD,KAAM,kBACN1C,MAAO2F,CAAAA,EACT,CACAhE,EAAAA,OAAO9P,GAAKA,CAAAA,CAAAA,GAIX6S,CAAAA,EACN,CACDuE,EACAlC,EACA+C,EACAF,EACAF,CAAAA,CACD,EAEK,CAAC7D,EAAW2E,CAAa,EAAGjQ,WAAS,IAAA,EACrC,CAACkQ,EAAgBC,CAAkB,EAAGnQ,WAAS,IAAA,EAIrD,SAAS2L,EAAayE,EAAY,CAC1B,KAAA,CAAEve,MAAAA,CAAUue,EAAAA,EAEdve,IAAU,gBACCoe,EAAA,CACX9H,KAAMiI,EAAajI,KACnB0D,KAAMuE,EAAavE,KACnBe,QAAS,EAAA,CACX,EACS/a,IAAU,QACfyZ,IACW2E,EAAA,CACX,GAAG3E,EACHsB,QAAS,EAAA,CACX,EACAuD,EAAkB3D,CAAAA,GAEX3a,IAAU,QACNoe,EAAA,CACX,GAAG3E,EACH+E,UAAWD,EAAa5J,GACxB8J,WAAYF,EAAa1D,GAAAA,CAC3B,EACS7a,IAAU,QACnBoe,EAAa,IAAA,EACFC,EAAAA,GAAkB,CAAA,CAAE,EAEnC,CAEA,SAAS/C,EAAiB3G,EAAE,CACtBgG,EAAUpK,SAASoE,CAAK,EAC1B4I,EAAW5C,EAAUpF,OAAOmJ,GAAOA,IAAQ/J,CAAAA,CAAAA,EAEhC4I,EAAA,CAAI5C,GAAAA,EAAWhG,CAAAA,CAAG,CAEjC,CAEA,SAAS8H,GAAAA,CACPgB,EAAiB,EAAA,CACnB,CAEA,SAASpC,GAAAA,CACPoC,EAAiB,EAAA,CACnB,CAEA,SAASkB,EAAaxD,EAAK,CACzB6B,IAAc7B,CAAAA,EACVA,EAAMxG,KAAO,OACf0G,GAEJ,CAEA,SAASD,EAAkBwD,EAAO,CAChCrB,EAAW5C,EAAUpF,OAAOsJ,GAAKA,IAAMD,CAAAA,CAAAA,EACvCjB,EAAuBiB,CAAAA,CACzB,CAEA,SAASzH,GAAAA,CACPwG,EAAuB,IAAA,CACzB,CAEA,SAASmB,EAAgBlI,EAAQ,CAC/BmG,IAAiBnG,CAAAA,EACbA,EAASjC,KAAO,OAClBwC,GAEJ,CAEA,aACG3H,EAAAA,CACCzD,MAAO,CACLgT,aAAc,GACdxN,gBAAiBJ,EAAMuH,gBACvBV,SAAU,SACVgH,UAAW3N,EAAO4N,WAClBjO,aAAc,cACdnB,KAAM,CACR,WAECyI,EAAMxI,IAAI,CAACkK,EAAMhK,IAAAA,CACZkP,IAAAA,EACJ,OAAQlF,EAAK1D,KAAI,CACf,IAAK,YACH4I,QACGxE,GAAAA,CACC3O,MAAO,CAAEwF,gBAAiBJ,EAAMyK,wBAAyB,EAEzD,eAACV,GAAAA,CACCC,MAAO,CAAExG,GAAI,MAAOtS,KAAM,EAAG,EAC7BoR,QAAS,GACTwD,OAAQ0H,EACRtD,eAAAA,EACAJ,OAAQjE,CAAAA,KAId,MACF,IAAK,eACHkI,QACGxE,GAAAA,CACC,eAAC/D,GAAAA,CACCC,SAAU,CACRvU,KAAM,GACN4X,UAAWyD,EACXyB,UACEzB,IACAb,EAAeuC,KAAKC,GAAKA,EAAEF,SAAS,EAAExK,GACxCA,GAAI,KACN,EACAlB,QAAS,GACTwD,OAAQ6H,EACR3H,kBAAAA,EACAH,WAAAA,CAAAA,KAIN,MAEF,IAAK,gBACHkI,QACGrD,GAAAA,CACCV,MAAOnB,EAAKpG,MACZ4F,YAAAA,EACAmB,UAAWA,EAAUpK,SAASyJ,EAAKpG,MAAMe,EAAE,EAC3C+E,eAAgBoD,EAAewC,sBAC/B7F,UAAAA,EACAzC,WAAAA,EACAC,OAAQ0H,EACRzH,SAAUgG,EACVpD,aAAAA,EACAgC,eAAAA,EACAC,kBAAAA,EACAT,iBAAAA,EACAF,kBAAAA,CAAAA,GAGJ,MACF,IAAK,mBACH8D,QACG5F,GAAAA,CACCC,IAAKS,EAAKpG,MACV4F,YAAAA,EACAE,eAAgBoD,EAAeyC,yBAC/B9F,UAAAA,EACAzC,WAAAA,EACA2C,YAAAA,EACA1C,OAAQ6H,EACR5H,SAAU+F,EACVnD,aAAAA,EACAC,UAAWgC,EACXnC,eAAAA,EACAC,eAAAA,CAAAA,GAGJ,MACF,IAAK,mBACHqF,QACG1P,EAAAA,CACCzD,MAAO,CACL6I,OAAQvD,EAAOmO,mBACfjO,gBAAiBJ,EAAMuH,eACzB,EAEA,eAAC8D,GAAAA,CACC9C,eAAgBoD,EAAe2C,sBAC/BhD,eAAAA,CAAAA,KAIN,MACF,IAAK,eACHyC,QACG3C,GAAAA,CACCpB,MAAOnB,EAAKpG,MACZ4F,YAAAA,EACAE,eAAgBoD,EAAe4C,qBAC/B/E,UAAWA,EAAUpK,SAASyJ,EAAKpG,MAAMe,EAAE,EAC3CqC,WAAAA,EACAC,OAAQ0H,EACRrD,iBAAAA,EACAF,kBAAAA,CAAAA,GAGJ,MACF,IAAK,kBACH8D,QACG5C,GAAAA,CACC/C,IAAKS,EAAKpG,MACV4F,YAAAA,EACAzC,OAAQ/G,IAAQsI,EAAMxJ,OAAS,EAC/B4K,eAAgBoD,EAAe6C,wBAC/B3I,WAAAA,EACA2C,YAAAA,EACA1C,OAAQ6H,EACR5H,SAAU+F,EACVnD,aAAAA,EACAC,UAAWgC,EACXnC,eAAAA,EACAC,eAAAA,CAAAA,GAGJ,MACF,QACE,MAAM,IAAI+F,MAAM,sBAAwB5F,EAAK1D,IAAI,CACrD,CAEMuE,MAAAA,EACJ7K,IAAQ,EAAI,QAAUA,IAAQsI,EAAMxJ,OAAS,EAAI,OAAS,KAG1D,OAAAnD,EAAA,IAACkU,GAAwBlM,SAAQ,CAQ/BC,MAAOiH,EAEP,eAACrL,EAAAA,CACCzD,MACE,CAAC0N,GAAa,CACZ,SAAU,CAAElI,gBAAiBJ,EAAMuH,eAAgB,CACrD,EAGDwG,SAAAA,CAAAA,IAfDlF,EAAKpG,MACDoG,EAAKpG,MAAMe,GACXqF,EAAK1D,OAAS,mBACZ,YACAtG,CAAAA,CAAAA,CAed,CAAA,EAGN,CACA,EAEF2M,GAAiBpZ,YAAc,mBCpUfuc,SAAAA,GAAgB,CAAEC,iBAAAA,GAAwC,CACxE,KAAM,CAAEzM,OAAAA,CAAAA,EAAW9O,EAAAA,WAAW+O,EAAAA,EAExB,CAACyM,EAAYC,CAAc,EAAG9R,WAAS,CAAA,EACvC,CAACkD,EAAQ6O,CAAAA,EAAUC,GAAU,KAAO,CACxC1a,EAAG,EACH2a,OAAQ,CAAEC,KAAM,EAAGC,QAAS,IAAKC,SAAU,EAAG,CAChD,EAAA,EAEMrR,EAAelC,GACnBO,EAAY4B,YAAAA,GAAAA,CACV8Q,EAAc9Q,EAAKC,KAAK,CAAA,EACvB,CAAA,CAAE,CAAA,EAGDoR,EAAavb,EAAAA,OAAOqO,EAAO,CAAE,CAAA,EAC7BmN,EAAY,CAAInN,GAAAA,CAAAA,EACtBmN,EAAUC,QAAQC,GAAUrN,EAAO,GAAI,CAAA,CAAA,EAC7B9C,EAAAA,KAAKoQ,GAAUtN,EAAOA,EAAOxE,OAAS,CAAA,EAAI,CAAA,CAAA,EAC9C+R,MAAAA,EAAab,EAAa1M,EAAOxE,OAEvCgS,OAAAA,EAAAA,gBAAgB,IAAA,CACd,MAAMC,EAAYP,EAAWrT,QACvB6T,EAAWD,EAAYzN,EAAO,CAAE,EAChC2N,EAAUJ,EAChB,IAAIK,EAAOF,EAAW,CAACC,EAAU,EAAI,EAEjCF,IAAcN,EAAU,CAAA,GAAMM,IAAcN,EAAU,CAAA,IACxDS,EAAO,CAACD,GAGV,MAAME,EAAK,CAACF,EACZf,EAAOxP,MAAM,CAAEwQ,KAAM,CAAEzb,EAAGyb,CAAK,EAAGzb,EAAG0b,CAAAA,CAAG,CAAA,EACvC,CAAC7N,EAAO,CAAE,CAAA,CAAC,EAEdwN,EAAAA,gBAAgB,IAAA,CACH3T,EAAAA,QAAUmG,EAAO,CAAE,CAAA,EAC7B,CAACA,EAAO,CAAE,CAAA,CAAC,EAEdwN,EAAAA,gBAAgB,IAAA,CACdZ,EAAOxP,MAAM,CAAEwQ,KAAM,CAAEzb,EAAG,CAACob,CAAW,EAAGM,GAAI,CAAE1b,EAAG,CAACob,CAAW,CAAA,CAAE,CAAA,EAC/D,CAACA,CAAAA,CAAW,QAGZjJ,MAAAA,CACCpB,UAAW,GAAG4K,GAAI,CAChB,CAAEvR,KAAM,EAAGmI,SAAU,QAAS,EAC9B1E,EAAOxE,SAAW,GAAK,CACrB8D,WAAY,GACZE,YAAa,EACf,CACD,CAAA,CAAA,GACDxN,IAAK4J,WAEJmS,EAAAA,IAAAA,GAASzJ,IAAG,CACXpB,UAAU,OACVzK,MAAO,CACL0D,cAAe,MACfL,MAAO4Q,EACPsB,WAAY,YACZ7F,UAAWpK,EAAO5L,EAAE0b,GAAG1b,GAAK,cAAcA,CAAE,KAAI,CAClD,WAECgb,EAAU3Q,IAAIC,SAEVP,EAAAA,CAECzD,MAAO,CACL8D,KAAM,OAAOgR,CAAAA,KACb3H,YAAa,EACbqI,aAAc,CAChB,EAEA,eAACxB,EAAAA,CAAiBhQ,MAAAA,CAAAA,IAPbA,CAAAA,CAUX,CAAA,IAIR,CCrFayR,MAAAA,UAAoB,SAAsB,CACrD9H,eAAAA,EACA+H,uBAAAA,EACAC,oBAAAA,EACAC,sBAAAA,GACkB,CAClB,KAAM,CAACtK,EAAUC,CAAY,EAAGnJ,WAAS,EAAA,EACzC,cACGqB,EAAAA,CACCqI,cAAY,gBACZ9L,MAAO,CACLwF,gBAAiBJ,EAAMuH,gBACvBjJ,cAAe,MACfoD,WAAY,EACZmM,UAAW3N,EAAO4N,WAClBrM,WAAY,EACZE,YAAa,EAAIC,GAAAA,EACjB/B,aAAc,cACd4Q,aAAc,aAAezQ,EAAM2C,WACrC,mBAECtE,EAAAA,CACCzD,MAAO,CACLqD,MAAO,IACPpD,MAAOmF,EAAMqH,cACb7I,eAAgB,SAChBuJ,YAAa,GACbqI,aAAc,EACd9K,QAAS,OACThH,cAAe,MACfC,WAAY,SACZoB,WAAY,OACZ0G,iBAAkB,MACpB,kBAEChI,EAAAA,CAAKzD,MAAO,CAAE8V,SAAU,GAAI,EAAG,SAAA,UAAA,UAC/BxL,EAAAA,CACCC,KAAK,OACLC,aAAW,OACXvE,QAAS,IAAA,CACPsF,EAAY,EAAA,CACd,EACAvL,MAAO,CAAEC,MAAO,eAAgB4E,QAAS,CAAE,kBAE1CkR,GAAAA,CACC1S,MAAO,GACPwF,OAAQ,GACR7I,MAAO,CAAEC,MAAOmF,EAAMqH,aAAc,CAAA,GAErCnB,SACE/C,GAAAA,CACCnC,SAAS,eACT/C,MAAO,IACPrD,MAAO,CAAE6E,QAAS,CAAE,EACpBuD,QAAS,IAAA,CACPmD,EAAY,EAAA,CACd,EAEA,eAACc,GAAAA,CACCC,aAAc/B,GAAAA,CACRA,IAAS,oBACXmL,IACSnL,IAAS,sBAClBoL,IACSpL,IAAS,yBAClBqL,IAEFrK,EAAY,EAAA,CACd,EACAgB,MAAO,CACL,CACEjW,KAAM,oBACNkW,KAAM,0BACR,EACA,CACElW,KAAM,sBACNkW,KAAM,YACR,EACA,CACElW,KAAM,wBACNkW,KAAM,cACR,CACD,CAAA,iBAMVtF,GAAAA,CAAaC,UAAWwG,CAAAA,KAG/B,CAAG,EC9FH,MAAMqI,WAAyB5O,EAAAA,SAAAA,CAC7B6O,YAAYhe,EAAO,CACjB,MAAMA,CAAAA,EACN,KAAKie,oBAAsBC,EAAAA,YAE3B,KAAKliB,MAAQ,CACXyT,QAAS,KACT0O,cAAe,IAAA,CAEnB,CAEAxI,YAAc,CAAChF,EAAIZ,IAAAA,CACjB,KAAKqO,SAAS,CAAE3O,QAASkB,EAAK,CAAEA,GAAAA,EAAIqG,KAAMjH,CAAAA,EAAe,IAAA,CAAK,CAAA,EAGhEiD,WAAarC,GAAAA,CACX,KAAKyN,SAAS,CAAE3O,QAASkB,EAAK,CAAEA,GAAAA,EAAIqG,KAAM,MAAA,EAAW,IAAA,CAAK,CAAA,EAG5De,kBAAoB,CAACpH,EAAI2F,EAAS+H,IAAAA,CAC1B,KAAA,CAAExF,eAAAA,CAAc,EAAK,KAAK7Y,MAIhC,GAFgB,CAAC,CAAC6Y,EAAeuC,KAAKC,GAAKA,EAAE1K,KAAO0N,CAAAA,EAEvC,CACX,KAAM,CAAEA,SAAUzD,GAAY0D,GAC5BzF,EACAvC,EACA+H,CAAAA,EAEIlH,EAAQ0B,EAAeuC,KAAKC,GAAKA,EAAE1K,KAAOiK,CAAAA,EAEhD,GAAIzD,EAAO,CACH,KAAA,CAAEkB,WAAAA,CAAelB,EAAAA,EACvB,KAAKnX,MAAM+X,kBAAkB,CAC3BpH,GAAAA,EACAiK,QAASzD,EAAMxG,GACf0N,SACEhG,EAAWvN,SAAW,GAAKwL,IAAY,MACnC,KACA+B,EAAW,CAAE,EAAC1H,EAAAA,CACtB,CACF,CAAA,KACK,CACD4N,IAAAA,EAEJ,UAAWpH,KAAS0B,EACd1B,GAAAA,EAAMkB,WAAW+C,KAAK7F,GAAOA,EAAI5E,KAAO0N,CAAW,EAAA,CACvClH,EAAAA,EACd,KACF,CAGF,KAAKnX,MAAM+X,kBAAkB,CAC3BpH,GAAAA,EACAiK,QAAS2D,EAAY5N,GACrB,GAAG6N,GAAaD,EAAYlG,WAAY/B,EAAS+H,CAAS,CAAA,CAC5D,CACF,CAAA,EAGFvG,eAAiB,CAACnH,EAAI2F,EAAS+H,IAAAA,CACvB,KAAA,CAAExF,eAAAA,CAAc,EAAK,KAAK7Y,MAEhC,KAAKA,MAAM8X,eAAe,CACxBnH,GAAAA,EACA,GAAG6N,GAAa3F,EAAgBvC,EAAS+H,CAAS,CAAA,CACpD,CAAA,EAGFI,eAAiBC,GAAAA,CACT,KAAA,CAAEjP,QAAAA,CAAO,EAAK,KAAKzT,MACnB,CAAEsW,KAAAA,EAAMuG,eAAAA,EAAgBlC,UAAAA,CAAAA,EAAc,KAAK3W,MAE3C2e,EAAY9F,EAAe+F,OAAO,CAACC,EAAK1H,IACxCR,EAAUpK,SAAS4K,EAAMxG,EAAE,EACtBkO,EAAI5E,OAAO,CAAEtJ,GAAIwG,EAAMxG,GAAImO,QAAS,EAAA,CAAK,EAE3CD,EAAI5E,OAAO,CAAC,CAAEtJ,GAAIwG,EAAMxG,GAAImO,QAAS,EAAK,EAAM3H,GAAAA,EAAMkB,UAAAA,CAAW,EACvE,CAAE,CAAA,EAEL,GAAI5I,EAAS,CAEX,IAAIsP,EADQJ,EAAUK,UAAUhJ,GAAQA,EAAKrF,KAAOlB,EAAQkB,EAAE,EAC1C+N,EAEpB,KAAOK,GAAW,GAAKA,EAAUJ,EAAU7T,QAAQ,CAC3CmU,MAAAA,EAAON,EAAUI,CAAQ,EAE/B,GAAIE,EAAKH,QAAS,CACLJ,GAAAA,EACX,QACSpM,SAAAA,IAAS,UAAY,CAAC2M,EAAK9D,UAAW,CAC/C,KAAKxF,YAAYsJ,EAAKtO,GAAIlB,EAAQuH,IAAI,EACtC,MAAA,KAEA,MAEJ,CACF,CAAA,EAGFpC,UAAYhX,GAAAA,CACN,GAAA,CAAC,KAAK5B,MAAMyT,QACP,OAAA,MAGL7R,EAAE0E,MAAQ,SAAW1E,EAAE0E,MAAQ,SACjC1E,EAAEshB,eAAc,EAChB,KAAKT,eAAe7gB,EAAEuhB,SAAW,GAAK,CAAA,EACxC,EAGFtJ,eAAiB,CAACuJ,EAASC,EAAOtP,IAAAA,CAChC,KAAK/P,MAAM6V,eAAeuJ,EAASC,EAAO,KAAKC,aAAavP,CAAAA,CAAAA,CAAAA,EAG9D6F,eAAiB,CAAC7F,EAAYuC,EAAMjD,IAAAA,CAClC,KAAKrP,MAAM4V,eAAe,KAAK0J,aAAavP,CAAAA,EAAauC,EAAMjD,CAAAA,CAAAA,EAGjEiQ,aAAevP,GACNxF,GAAqB,KAAKvK,MAAM6J,WAAYkG,CAAAA,EAIrDwP,cAAe,CACb,KAAKnB,SAAS,CAAE3O,QAAS,IAAA,CAAK,CAChC,CAEAgO,uBAAyB,IAAA,CACvB,KAAKzd,MAAMwf,0BAAwB,EAGrC9B,oBAAsB,IAAA,CACf1d,KAAAA,MAAMuZ,WAAW,CAAA,CAAE,CAAA,EAG1BoE,sBAAwB,IAAA,CACtB,KAAM,CAAEpE,WAAAA,EAAYV,eAAAA,GAAmB,KAAK7Y,MAC5CuZ,EAAWV,EAAe/M,IAAIuP,GAAKA,EAAE1K,EAAE,CAAA,CAAA,EAGzC8O,QAAS,CACP,KAAM,CACJnN,KAAAA,EACAuG,eAAAA,EACA6G,kBAAAA,EACA7V,WAAAA,EACA6E,UAAAA,EACA3E,YAAAA,EACA+O,eAAAA,EACAC,eAAAA,EACAC,YAAAA,EACAC,iBAAAA,EACAC,cAAAA,CAAAA,EACE,KAAKlZ,MACH,CAAEyP,QAAAA,EAAS0O,cAAAA,GAAkB,KAAKniB,MAExC,cACGwP,EAAAA,CACCqI,cAAY,eACZ9L,MAAO,CACL8D,KAAM,EACN,GAAIwB,EAAOsS,gBAAkB,CAC3B,wBAAyB,CACvBpS,gBAAiB,aACnB,EACA,uCAAwC,CACtCA,gBAAiBJ,EAAMyS,qBACzB,CACF,CACF,mBAECpU,EAAAA,CACCzD,MAAO,CACL0D,cAAe,MACfuI,SAAU,SACVnF,WAAY,EAGZqG,YAAa,EACbqI,aAAc,EAAIxO,GAAAA,CACpB,kBAECvD,EAAAA,CAAKzD,MAAO,CAAEqD,MAAO,GAAI,CAAA,SACzByU,GAAAA,CACChW,WAAY6V,EACZhR,UAAAA,EACA3E,YAAAA,EACAuI,KAAAA,EAEA,eAACwJ,GAAAA,CACCC,iBAAkBjD,EAAeiD,gBAAAA,eAKtC8D,GAAAA,CACChW,WAAAA,EACA6E,UAAAA,EACA3E,YAAAA,EACAuI,KAAAA,kBAECkL,GAAAA,CACC9H,eAAgBoD,EAAegH,sBAC/BrC,uBAAwB,KAAKA,uBAC7BC,oBAAqB,KAAKA,oBAC1BC,sBAAuB,KAAKA,qBAAAA,GAE9BhW,EAAA,IAACoY,GAAqBpQ,SAAQ,CAACC,MAAO,KAAKqO,oBACzC,eAACzS,EAAAA,CACCzD,MAAO,CACLiY,UAAW,SACXC,eAAgB,OAChBpU,KAAM,EACNqJ,YAAa,EACbqI,aAAc,CAChB,EACA3R,SAAU,KAAKqS,oBAEf,eAACzS,EAAAA,CACCzD,MAAO,CACL0L,QAAS0K,EAAgB,GAAM,EAC/BtP,WAAY,CACd,EACA+F,UAAW,KAAKA,UAChBhJ,SAAUpC,GAAO,KAAK0W,eAAiB1W,EAEvC,eAACmP,GAAAA,CACCE,eAAAA,EACArD,YAAa/F,EACbqJ,eAAAA,EACAnD,YAAa,KAAKA,YAClB3C,WAAY,KAAKA,WACjB+F,eAAAA,EACAC,YAAAA,EACAC,iBAAAA,EACAC,cAAAA,EACAnB,kBAAmB,KAAKA,kBACxBD,eAAgB,KAAKA,eACrBlC,eAAgB,KAAKA,eACrBC,eAAgB,KAAKA,cAAAA,cAQrC,CACF,CAEA,MAAMpS,GAAkBzH,GAAAA,CACtB,KAAM,CAAEmkB,QAAStH,CAAc,EAAK7c,EAAMokB,QAAQ/H,WAC3C,MAAA,CACLQ,eAAAA,CAAAA,CAEJ,EAEMzV,GAAqBjB,IAelB,CACLoX,WAfiB8G,GAAAA,CACjBle,EAASme,GAAU,CAAE,mBAAoBD,CAAa,CAAA,CAAA,CAAA,EAetDb,yBAZ+B,IAC/Brd,EAAS,CAACoe,EAAeC,IAAAA,CACjB,KAAA,CAAEC,MAAAA,GAAUD,IACZlH,EAAuBmH,EAAMC,MAAM,6BAA8B,EACvEH,EACED,GAAU,CACR,8BAA+B,CAAChH,CAClC,CAAA,CAAA,CAAA,CAEJ,CAGAkG,GAISmB,GAAclZ,GAAQhE,GAAiBL,GAAoB,KAAM,CAC5EtE,WAAY,EACd,CAAA,EAAGif,EAAkB,EC/RrB,SAAS6C,GAAqBxV,EAAa,CACzC,MAAMyV,EAAsBzV,EAAQ,IAEpC,OAAIyV,EAAsB,IACjB,EACEA,EAAsB,IACxB,EACEA,EAAsB,IACxB,EACEA,EAAsB,KACxB,EACEA,EAAsB,KACxB,EAGF,CACT,CAOA,MAAMC,GAIJhiB,EAAA,WAAA,CACE,CACEsM,MAAAA,EACAwF,OAAAA,EACA8O,kBAAAA,EACA7V,WAAAA,EACAkX,UAAAA,EAAY,EACZhX,YAAAA,EACA0E,cAAeuS,EACfC,UAAAA,EACA,GAAGjhB,GAELsB,IAAAA,CAEM,KAAA,CAAE4f,cAAAA,GAAkBC,KACpBC,EAAUC,KAEVC,EAAcV,GAAqBxV,CAAAA,EACnCsD,EAAY9D,KAAKS,IAAIiW,EAAaP,CAAAA,EAClCQ,EAAW,IAAM,IAAM7S,EAE7B8S,EAAAA,UAAU,IAAA,CACRN,EAAcI,CAAAA,CAAAA,EACb,CAACA,CAAAA,CAAY,EAEhB,SAAS7S,EAAc1C,EAAK,CAC1BiV,EAAejV,EAAO2C,CAAAA,CACxB,CAEA,aACGlD,EAAAA,CACCzD,MAAO,CACLqD,MAAAA,EACAwF,OAAAA,EACAlF,WAAY,SACZ+H,QAASrI,GAAS,GAAKwF,GAAU,EAAI,EAAI,CAC3C,EAEA,gBAACpF,EAAAA,CAAKzD,MAAO,CAAEqD,MAAO,OAAQmW,SAAAA,CAAS,kBACpC/S,GAAAA,CACC3E,WAAY6V,EACZhR,UAAAA,EACA3E,YAAAA,EACA0E,cAAAA,CAAAA,SAEDkS,GAAAA,CACCrf,IAAAA,EACAoe,kBAAAA,EACA7V,WAAAA,EACA6E,UAAAA,EACA3E,YAAAA,EACC,GAAGqX,EACH,GAAGphB,CAAAA,OAKd,CAAA,EAGF8gB,GAAwBvhB,YAAc,0BAE/B,MAAMkiB,GAAqB3iB,EAAAA,WAGhC,CAACkB,EAAOsB,UAELogB,GAAAA,CACE,SAAA,CAAC,CAAEtW,MAAAA,EAAOwF,OAAAA,CAAM,UACdkQ,GAAAA,CACCxf,IAAAA,EACA8J,MAAAA,EACAwF,OAAAA,EACC,GAAG5Q,CAAAA,IAKX,EAEHyhB,GAAmBliB,YAAc,qBCjHjC,MAAMH,mBAAwB,IAAA,EAQvB,SAASuiB,GAAe,CAC7BC,iBAAAA,EACAhM,eAAAA,EACAiM,wBAAAA,EACAC,SAAAA,GACoB,CACdxX,MAAAA,EAAeC,KAGnB,OAAA5C,EAAA,IAACvI,GAAQuQ,SAAQ,CACfC,MAAO,CAAA,aACLtF,EACAsX,iBAAAA,EACAhM,eAAAA,EACAiM,wBAAAA,CACF,EAECC,SAAAA,CAAAA,EAGP,CAEO,SAASC,IAAAA,CACd,OAAOvhB,EAAAA,WAAWpB,EAAAA,CACpB,CCVgB4iB,SAAAA,GAAc,CAAEjW,MAAAA,GAA2B,CACzD,KAAM,CACJzB,aAAAA,EACAsX,iBAAkBjL,EAClBf,eAAAA,EACAiM,wBAAAA,CAAAA,EACEE,KAEEE,EAAyBC,GAAe,sBAAA,EAExC,CAAC7O,EAAUC,CAAY,EAAGnJ,WAAS,EAAA,EACzC,SAASgY,GAAAA,CACP7O,EAAY,EAAA,CACd,CAEA,SAAS8O,GAAAA,CACP9O,EAAY,EAAA,CACd,CAEM+O,MAAAA,EAAuB1L,EACzBrO,GACAG,GAEJ,aACG+C,EAAAA,CACCzD,MAAO,CACLwF,gBAAiBJ,EAAMuH,gBACvBsG,UAAW3N,EAAO4N,WAClBjO,aAAc,EACd4B,WAAY,EACZE,YAAa,EACbwT,UAAW,EACXzW,KAAM,EACNkB,OAAQ,UACRgO,aAAc,EACd/G,SAAU,SACV,mBAAoB,CAClBP,QAAS,EACT+D,WAAY,cACd,EACA,yBAA0B,CACxB/D,QAAS,CACX,CACF,WAEC/D,EAAAA,KAAAA,GAAiBC,SAAQ,CAACC,MAAOrF,GAAyBwB,CAAAA,mBACxDP,EAAAA,CACCzD,MAAO,CACL6E,QAAS,SACT,GAAI+J,EAAY,CAAE+B,OAAQ,QAAA,EAAa,CAAE4J,UAAW,EAAG,CACzD,kBAEC9W,EAAAA,CACCzD,MAAO,CACLoG,SAAU,WACVE,KAAM,GACND,IAAK,CACP,EAEA,eAACiE,EAAAA,CACCC,KAAK,OACLC,aAAY,GAAGoE,EAAY,SAAW,UAAA,iBACtCnE,UAAU,gBACVxE,QAAS6T,EAET,eAACQ,EAAAA,CACCjX,MAAO,GACPwF,OAAQ,GAER7I,MAAO,CAAEC,MAAOmF,EAAMC,gBAAiBsL,OAAQ,CAAE,CAAA,aAKtD9E,MAAAA,CACCpB,UAAW,GAAG4K,GAAI,CAChB,CACEvQ,UAAW,SACXyV,UAAW,EACXhU,SAAU,GACVP,WAAY,IACZwU,mBAAoB,KACtB,CACD,CAAA,CAAA,YAEAhY,GAAkBwB,EAAO,MAAA,CAAA,UAG3BP,EAAAA,CACCzD,MAAO,CACLoG,SAAU,WACVgK,MAAO,GACP/J,IAAK,EACL3C,cAAe,MACfC,WAAY,QACd,kBAECF,EAAAA,CACC,eAACkF,GAAAA,CACCC,GAAI,UAAU5E,CAAAA,GACdX,MAAO,GACPwF,OAAQ,GACRG,gBAAgB,eAChBF,aAAc1D,EAAMqH,aAAAA,YAGvBhJ,EAAAA,CAAKzD,MAAO,CAAE+E,WAAY,MAAO,kBAC/BuF,EAAAA,CAAOC,KAAK,OAAOC,aAAW,OAAOvE,QAASmU,EAC7C,eAACrE,GAAAA,CACC1S,MAAO,GACPwF,OAAQ,GACR7I,MAAO,CAAEC,MAAOmF,EAAMqH,aAAc,CAAA,KAGvCnB,SACE/C,GAAAA,CACCnC,SAAS,eACT/C,MAAO,IACPrD,MAAO,CAAE6E,QAAS,CAAE,EACpBuD,QAASiS,EAET,eAAChO,GAAAA,CACCC,aAAc/B,GAAAA,CACZ8P,IACAxM,EAAe7J,EAAOuG,CAAAA,CACxB,EACAgC,MAAO,CACL,CAAEjW,KAAM,YAAakW,KAAM,0BAA2B,EACtD,CAAElW,KAAM,WAAYkW,KAAM,qBAAsB,EAChD,CACElW,KAAM,YACNkW,KAAM,gCACR,EACA0N,GAA0B,CACxB5jB,KAAM,kBACNkW,KAAM,iBACR,EACA0N,GAA0B,CACxB5jB,KAAM,sBACNkW,KAAM,uBACR,EACA0N,GAA0B,CACxB5jB,KAAM,0BACNkW,KAAM,gCACR,CACD,CAAA,cAQZ,CAACoC,GACApO,EAAA,KAACia,GAAAA,CACCC,QAAS,EACT1a,MAAO,CACL2a,UAAW,SACXnV,gBAAiBJ,EAAMyK,yBACvB5K,aAAc,EACdJ,QAAS,YACT0V,UAAW,EACb,YAEA3a,EAAA,IAACgb,GAAAA,EAAAA,EACDhb,EAAA,IAACib,GAAAA,EAAAA,KAIJjM,QACEnL,EAAAA,CACCzD,MAAO,CACL2D,WAAY,SACZkB,QAAS,YACTjB,eAAgB,gBAChB4B,gBAAiBJ,EAAMyK,yBACvBiL,UAAW,aAAe1V,EAAM2C,WAClC,EAEA,eAACgT,GAAAA,CAAMC,UAAWhX,GAASzB,CAAAA,KAG7B3C,EAAA,IAACmb,GAAAA,CACCC,UAAWhX,GAASzB,EACpBvC,MAAO,CAAEua,UAAW,GAAIvH,aAAc,EAAG,CAAA,OAMrD,CClMA,MAAMiI,GAAkC,CACtCnX,KAAM,EACNe,QAAS,QACTC,UAAW,OACb,EACaoW,GAAyBrK,EAAAA,KAAA,UAASqK,CAC7C,MAAMC,EAASC,KACf,cACG3X,EAAAA,CACCzD,MAAO,CACL8D,KAAM,EACNJ,cAAe,MACfqD,YAAazB,EAAO+V,kBACpBpU,WAAY,GACZqU,cAAe,EACjB,mBAEC7X,EAAAA,CAAKzD,MAAOib,mBACVtL,EAAAA,CAAK3P,MAAO,CAAEC,MAAOmF,EAAMqH,aAAc,EAAG,SAAA,UAAA,SAC5C8O,GAAAA,CACCC,QAASC,GAAaC,qBACtBnR,KAAK,YACLvK,MAAO,CAAEC,MAAOmF,EAAMqH,cAAezG,WAAY,GAAI,EACrD+G,UAAWlF,GACFsT,EAAOQ,WAAW9T,GAAS,GAAM,EAAA,WAAA,CAC1C,aAGHpE,EAAAA,CAAKzD,MAAOib,mBACVtL,EAAAA,CAAK3P,MAAO,CAAEC,MAAOmF,EAAMqH,aAAc,EAAG,SAAA,OAAA,SAC5C8O,GAAAA,CACCC,QAASC,GAAaG,WACtBrR,KAAK,YACLvK,MAAO,CAAEC,MAAOmF,EAAMqH,cAAezG,WAAY,GAAI,CAAA,aAGxDvC,EAAAA,CAAKzD,MAAOib,mBACVtL,EAAAA,CAAK3P,MAAO,CAAEC,MAAOmF,EAAMqH,aAAc,EAAG,SAAA,SAAA,SAC5C8O,GAAAA,CACCC,QAASC,GAAaI,cACtBtR,KAAK,YACLvK,MAAO,CAAEC,MAAOmF,EAAMqH,cAAezG,WAAY,GAAI,CAAA,QAK/D,CAAG,EAEI,SAAS8V,IAAAA,CACd,cACGrY,EAAAA,CACCzD,MAAO,CACL0D,cAAe,MACfqD,YAAazB,EAAO+V,kBACpBC,cAAe,CACjB,kBAEC7X,EAAAA,CAAKzD,MAAOib,GACX,eAACtL,EAAAA,CAAK3P,MAAO,CAAEC,MAAOmF,EAAMqH,aAAc,EAAG,SAAA,UAAA,WAE9ChJ,EAAAA,CAAKzD,MAAOib,GACX,eAACtL,EAAAA,CAAK3P,MAAO,CAAEC,MAAOmF,EAAMqH,aAAc,EAAG,SAAA,UAAA,OAIrD,CAKO,MAAMsP,GAAkBlL,EAAAA,KAAA,SAAoB,CAAEzB,MAAAA,GAAwB,CACrE,KAAA,CAAExG,GAAAA,CAAOwG,EAAAA,EAEf,cACG3L,EAAAA,CAAKzD,MAAO,CAAE8D,KAAM,EAAGJ,cAAe,KAAM,kBAC1CsY,GAAAA,CACC1lB,KAAK,WACL+M,MAAM,OACNyB,UAAU,QACV9E,MAAO,CAAEgG,WAAY,IAAK,GAAGV,EAAO2W,IAAK,EACzCC,WAAY,CACVV,QAASC,GAAaU,cAAcvT,CAAAA,EACpC2B,KAAM,WACR,CAAA,SAEDyR,GAAAA,CACC1lB,KAAK,QACL+M,MAAM,OACNyB,UAAU,QACV9E,MAAO,CAAEgG,WAAY,IAAK,GAAGV,EAAO2W,IAAK,EACzCC,WAAY,CACVV,QAASC,GAAaW,eAAexT,CAAAA,EACrC2B,KAAM,WACR,CAAA,GAED,CAAC6E,EAAMgE,WACNxT,EAAA,IAACoc,GAAAA,CACC1lB,KAAK,UACL+M,MAAM,OACNyB,UAAU,QACV9E,MAAO,CACLgG,WAAY,IACZwP,aAAclQ,EAAO+V,kBACrB,GAAG/V,EAAO2W,IACZ,EACAC,WAAY,CACVV,QAASC,GAAaY,aAAazT,CAAAA,EACnC2B,KAAM,YACN+R,cAAe,CACbtc,MAAO,CACLwV,aAAclQ,EAAO+V,iBACvB,CACF,CACF,CAAA,KAKV,CAAG,EAUUkB,GAAqB1L,EAAA,KAAA,SAAuB,CACvD7I,WAAAA,EACA6C,SAAAA,EACAnD,QAAAA,EACAwH,OAAAA,EACArB,eAAAA,EACAC,eAAAA,GACmB,CACnB,MAAM0O,EAAiBpT,KACjB,CAACkC,EAAUC,CAAY,EAAGnJ,WAAS,EAAA,EACnC,CAAC6G,EAAOC,CAAS,EAAG9G,WAAS,EAAA,EAC7B8X,EAAyBC,GAAe,sBAAA,EAE9C,cACG1W,EAAAA,CACCzD,MAAO,CACL8D,KAAM,EACNJ,cAAe,MACf,mBAAoB,CAClBgI,QAAS,EACT+D,WAAY,cACd,EACA,yBAA0B,CACxB/D,QAAS,CACX,CACF,mBAECjI,EAAAA,CACCzD,MAAO,CACL8D,KAAM,EACNJ,cAAe,KACjB,EACA+Y,mBAAoB,IAAMvT,EAAS,EAAA,EACnC/C,aAAc,IAAA,CACZ+C,EAAS,EAAA,CACX,YAEC,CAACxB,IAAYuB,GAASqC,WACpB7H,EAAAA,CACCzD,MAAO,CACL8G,WAAY,EACZqG,YAAa,EACbvJ,eAAgB,SAChB8Y,eAAgB,EAChBtP,kBAAmB,EACnBuP,YAAavX,EAAM2C,WACrB,kBAECuC,EAAAA,CACCC,KAAK,OACLtE,QAASpQ,GAAAA,CACPA,EAAEsW,gBAAe,EACjBZ,EAAY,EAAA,CACd,EACAvL,MAAO,CACL6E,QAAS,CACX,EAEA,eAACuH,GAAAA,CACC/I,MAAO,GACPwF,OAAQ,GACR4B,UAAU,gBACVzK,MAAOsL,GAAY,CAAEI,QAAS,CAAE,CAAA,KAGnCJ,SACE/C,GAAAA,CACCnC,SAAS,cACT/C,MAAO,IACPrD,MAAO,CAAE6E,QAAS,CAAE,EACpBuD,QAAS,IAAMmD,EAAY,EAAA,EAE3B,eAACc,GAAAA,CACCC,aAAc/B,GAAAA,CACZsD,EAAe7F,EAAYuC,EAAM,CAAEM,SAAUA,EAASjC,EAAAA,CAAG,EACzD2C,EAAY,EAAA,CACd,EACAgB,MAAO,CACL,CACEjW,KAAM,mBACNkW,KAAM,0BACR,EACA,CACElW,KAAM,mBACNkW,KAAM,wBACR,EACA,CACElW,KAAM,mBACNkW,KAAM,wBACR,EACA,CACElW,KAAM,oBACNkW,KAAM,uBACR,EACA0N,GAA0B,CACxB5jB,KAAM,iCACNkW,KAAM,uBACR,CACD,CAAA,cAMVwP,GAAAA,CACC1lB,KAAK,SACL0W,QAAStF,EACTe,QAASf,EACTrE,MAAM,OACNuZ,SAAU,IAAM1N,EAAOrE,EAASjC,GAAIZ,CAAAA,EACpChI,MAAO,CAAE,GAAI0H,GAAW,CAAEkF,OAAQ,GAAI,EAAI,GAAGtH,EAAO2W,IAAK,EACzDnX,UAAU,QACV+X,WAAY,CACV7X,OAAQ,UACR2L,OAAQ,EACR9L,QAAS,QACTI,aAAc,EACd,SAAU,CACRgO,UAAW,mBAAqB7N,EAAM0X,oBACtCtX,gBAAiBJ,EAAMuH,eACzB,CACF,EACAuP,WAAY,CACVV,QAASC,GAAasB,YAAYlS,EAASjC,EAAE,EAC7C2B,KAAM,YACNyS,cAAeC,GACfC,WAAYC,GACHC,GAAkBD,CAAAA,EAE3BE,aAAcF,GACLG,GAAgBC,GAAeJ,EAAM,CAAA,CAAA,CAEhD,EACA9P,WAAY,CACVH,OAAQ,IAAA,CACNgC,EAAO,IAAA,CACT,EACAlP,MAAO,CACLwF,gBAAiBJ,EAAMuH,eACzB,CACF,EACAzB,OAAQsS,GAAAA,CACN3P,EAAe7F,EAAY,gBAAiB,CAC1C6C,SAAUA,EAASjC,GACnB4U,OAAAA,CAAAA,CACF,CACF,CAAA,YAGHC,GAAAA,CAAMnnB,KAAK,QAAQ+M,MAAM,OAAOrD,MAAO,CAAE8E,UAAW,OAAQ,EAC3D,eAAC4Y,OAAAA,CACC5R,cAAY,uBACZ7F,QAAS,IAAM6H,EAAejD,EAASvU,KAAMuU,EAASjC,GAAIZ,CAAAA,EAE1D,eAACuT,GAAAA,CACCC,QAASC,GAAakC,aAAa9S,EAASjC,EAAE,EAC9C2B,KAAK,YACLqT,SAAUX,GACVjd,MAAO,CACLgF,OAAQ,UACR,SAAU,CACRG,eAAgB,WAClB,CACF,CAAA,OAKL,CAAC0F,EAASuI,WACT5S,EAAA,KAACid,GAAAA,CACCnnB,KAAK,UACLunB,SAAU,GACVxa,MAAM,OACNrD,MAAO,CAAEwV,aAAclQ,EAAO+V,kBAAmBvW,UAAW,OAAQ,kBAEnE4Y,OAAAA,CAAM,GAAI7S,EAASuI,UAAY,GAAKoJ,EAAe7R,cAAe,EACjE,eAACmT,GAAAA,CACCC,SAAUlT,EAASuI,UACnB4K,UAAWvC,GAAawC,aAAapT,EAASjC,EAAE,EAChDsV,QAASzC,GAAa0C,WAAWtT,EAASjC,EAAE,EAC5CwV,KAAM3C,GAAa4C,QAAQxT,EAASjC,EAAE,EACtC0V,SAAU7C,GAAasB,YAAYlS,EAASjC,EAAE,CAAA,KAGjD4T,EAAenS,QACdzK,EAAA,IAAC2e,GAAAA,CACCC,WAAY3T,EAASjC,GACrBO,QAASqT,EACTxU,WAAAA,EACA6F,eAAAA,CAAAA,QAOd,CAAG,EAIU4Q,GAAoB1C,GACpB2C,GAAuBnC,GAEvBoC,GAAmB5C,GACnB6C,GAAsBrC,mRC9V7BllB,mBAAwB,IAAA,EAQvB,SAASwnB,GAAgB,CAC9BhF,iBAAAA,EACAhM,eAAAA,EACAiM,wBAAAA,EACAC,SAAAA,GACqB,CACfxX,MAAAA,EAAeC,KAGnB,OAAA5C,EAAA,IAACvI,GAAQuQ,SAAQ,CACfC,MAAO,CAAA,aACLtF,EACAsX,iBAAAA,EACAhM,eAAAA,EACAiM,wBAAAA,CACF,EAECC,SAAAA,CAAAA,EAGP,CAEO,SAAS+E,IAAAA,CACd,OAAOrmB,EAAAA,WAAWpB,EAAAA,CACpB,CCZO,SAAS4iB,GAAc,CAC5BjW,MAAAA,EACAkW,uBAAAA,GACmB,CACnB,KAAM,CACJ3X,aAAAA,EACAsX,iBAAkBjL,EAClBf,eAAAA,EACAiM,wBAAAA,CAAAA,EACEgF,KAEE,CAACxT,EAAUC,CAAY,EAAGnJ,WAAS,EAAA,EACzC,SAASgY,GAAAA,CACP7O,EAAY,EAAA,CACd,CAEA,SAAS8O,GAAAA,CACP9O,EAAY,EAAA,CACd,CAEA,MAAMwT,EAAgBvc,GAAkBA,GAAqBwB,CAAQ,EAAA,KAAA,EAE/DsW,EAAuB1L,EACzBrO,GACAG,GAEJ,aACG+C,EAAAA,CACCqI,cAAY,iBACZ9L,MAAO,CACLwF,gBAAiBJ,EAAMuH,gBACvBsG,UAAW3N,EAAO4N,WAClBjO,aAAc,EACd4B,WAAY,EACZE,YAAa,EACbwT,UAAW,EACXzW,KAAM,EACNkB,OAAQ,UACRgO,aAAc,EACd/G,SAAU,SACV,mBAAoB,CAClBP,QAAS,EACT+D,WAAY,cACd,EACA,yBAA0B,CACxB/D,QAAS,CACX,CACF,WAEC/D,EAAAA,KAAAA,GAAiBC,SAAQ,CAACC,MAAOrF,GAAyBwB,CAAAA,mBACxDP,EAAAA,CACCzD,MAAO,CACL6E,QAAS,SACT,GAAI+J,EAAY,CAAE+B,OAAQ,QAAA,EAAa,CAAE4J,UAAW,EAAG,CACzD,kBAEC9W,EAAAA,CACCzD,MAAO,CACLoG,SAAU,WACVE,KAAM,GACND,IAAK,CACP,EAEA,eAACiE,EAAAA,CACCC,KAAK,OACLC,aAAY,GAAGoE,EAAY,SAAW,UAAA,iBACtCnE,UAAU,gBACVxE,QAAS6T,EAET,eAACQ,EAAAA,CACCjX,MAAO,GACPwF,OAAQ,GAER7I,MAAO,CAAEC,MAAOmF,EAAM4Z,eAAgBrO,OAAQ,CAAE,CAAA,aAKrD9E,MAAAA,CACCpB,UAAW,GAAG4K,GAAI,CAChB,CACEvQ,UAAW,SACXyV,UAAW,EACXhU,SAAU,GACVP,WAAY,IACZwU,mBAAoB,KACtB,EACAjY,IAAiByB,GAAS,CAAEgC,WAAY,MAAO,CAChD,CAAA,CAAA,YAEAxD,GAAkBwB,EAAO,MAAA,CAAA,UAG3BP,EAAAA,CACCzD,MAAO,CACLoG,SAAU,WACVgK,MAAO,GACP/J,IAAK,EACL3C,cAAe,MACfC,WAAY,QACd,kBAECF,EAAAA,CACC,eAACkF,GAAAA,CACCC,GAAI,UAAU5E,CAAAA,GACdX,MAAO,GACPwF,OAAQ,GACRG,gBAAgB,eAChBF,aAAc1D,EAAM4Z,cAAAA,YAGvBvb,EAAAA,CAAKzD,MAAO,CAAE+E,WAAY,OAAQ8B,WAAY,CAAE,kBAC9CyD,EAAAA,CAAOC,KAAK,OAAOC,aAAW,OAAOvE,QAASmU,EAC7C,eAACrE,GAAAA,CACC1S,MAAO,GACPwF,OAAQ,GACR7I,MAAO,CAAEC,MAAOmF,EAAMqH,aAAc,CAAA,KAGvCnB,SACE/C,GAAAA,CACCnC,SAAS,eACT/C,MAAO,IACPrD,MAAO,CAAE6E,QAAS,CAAE,EACpBuD,QAASiS,EAET,eAAChO,GAAAA,CACCC,aAAc/B,GAAAA,CACZ8P,IACAxM,EAAe7J,EAAOuG,CAAAA,CACxB,EACAgC,MAAO,CACL,CAAEjW,KAAM,YAAakW,KAAM,0BAA2B,EACtD,CAAElW,KAAM,WAAYkW,KAAM,qBAAsB,EAChD,CACElW,KAAM,YACNkW,KAAM,gCACR,EACA0N,GAA0B,CACxB5jB,KAAM,kBACNkW,KAAM,iBACR,EACA0N,GAA0B,CACxB5jB,KAAM,sBACNkW,KAAM,uBACR,EACA0N,GAA0B,CACxB5jB,KAAM,0BACNkW,KAAM,gCACR,EACA0N,GAA0B,CACxB5jB,KAAM,wBACNkW,KAAM,sBACR,CACD,CAAA,cAQZoC,QACEnL,EAAAA,CACCzD,MAAO,CACL2D,WAAY,SACZkB,QAAS,YACTjB,eAAgB,gBAChB4B,gBAAiBJ,EAAMuH,gBACvBmO,UAAW,aAAe1V,EAAM2C,WAClC,EAEA,eAACkX,GAAAA,CACCC,yBAA0B,GAC1BH,cAAAA,EACA/a,MAAAA,EACA6J,eAAAA,CAAAA,GAIJ,EAAArN,EAAA,KAAAoP,WAAA,iBACGuP,GAAAA,CACCJ,cAAAA,EACA/e,MAAO,CACL6E,QAAS,QACT0V,UAAW,GACX/U,gBAAiBJ,EAAMyK,yBACvB6M,eAAgB,EAChBtP,kBAAmB,EACnBuP,YAAavX,EAAM2C,WACrB,CAAA,SAEDtE,EAAAA,CAAKzD,MAAO,CAAE2Q,OAAQ,QAAS,EAC9B,eAACsO,GAAAA,CAASjb,MAAAA,EAAc6J,eAAAA,CAAAA,YAOtC,CC1MA,MAAMoN,GAAkC,CACtCnX,KAAM,EACNe,QAAS,QACTC,UAAW,OACb,EAEaoW,GAAyBrK,EAAAA,KAAA,UAASqK,CAC7C,MAAMC,EAASC,KACf,cACG3X,EAAAA,CACCzD,MAAO,CACL8D,KAAM,EACNJ,cAAe,MACfqD,YAAazB,EAAO+V,kBACpBpU,WAAY,GACZqU,cAAe,EACjB,mBAEC7X,EAAAA,CAAKzD,MAAOib,mBACVtL,EAAAA,CAAK3P,MAAO,CAAEC,MAAOmF,EAAMga,eAAgB,EAAG,SAAA,UAAA,SAC9C7D,GAAAA,CACCC,QAAS6D,GAAeC,cACxB/U,KAAK,YACLvK,MAAO,CAAEC,MAAOmF,EAAMga,gBAAiBpZ,WAAY,GAAI,EACvD+G,UAAWlF,GACFsT,EAAO,CAACQ,WAAW9T,GAAS,GAAM,EAAA,WAAA,CAC3C,aAGHpE,EAAAA,CAAKzD,MAAOib,mBACVtL,EAAAA,CAAK3P,MAAO,CAAEC,MAAOmF,EAAMga,eAAgB,EAAG,SAAA,OAAA,SAC9C7D,GAAAA,CACCC,QAAS6D,GAAezD,WACxBrR,KAAK,YACLvK,MAAO,CAAEC,MAAOmF,EAAMga,gBAAiBpZ,WAAY,GAAI,CAAA,aAG1DvC,EAAAA,CAAKzD,MAAOib,mBACVtL,EAAAA,CAAK3P,MAAO,CAAEC,MAAOmF,EAAMga,eAAgB,EAAG,SAAA,SAAA,SAC9C7D,GAAAA,CACCC,QAAS6D,GAAeE,aACxBhV,KAAK,YACLvK,MAAO,CAAEC,MAAOmF,EAAMga,gBAAiBpZ,WAAY,GAAI,CAAA,QAKjE,CAAG,EAEI,SAAS8V,IAAAA,CACd,aACGnN,GAAAA,CACC3O,MAAO,CACLC,MAAOmF,EAAMga,gBACbzb,WAAY,SACZ6R,aAAc,EAChB,EAEA,eAAC/R,EAAAA,CAAKzD,MAAO,CAAE8D,KAAM,EAAGgB,UAAW,OAAQ,EAAG,SAAA,UAAA,IAGpD,CAKO,MAAM2Z,GAAyB5N,EAAAA,KAAA,SAA2B,CAC/DzB,MAAAA,GACuB,CACjB,KAAA,CAAExG,GAAAA,CAAOwG,EAAAA,EAEf,cACG3L,EAAAA,CAAKzD,MAAO,CAAE8D,KAAM,EAAGJ,cAAe,KAAM,kBAC1CsY,GAAAA,CACC1lB,KAAK,WACL+M,MAAM,OACNyB,UAAU,QACV9E,MAAO,CAAEgG,WAAY,IAAK,GAAGV,EAAO2W,IAAK,EACzCC,WAAY,CACVV,QAAS6D,GAAelD,cAAcvT,CAAAA,EACtC2B,KAAM,WACR,CAAA,SAEDyR,GAAAA,CACC1lB,KAAK,QACL+M,MAAM,OACNyB,UAAU,QACV9E,MAAO,CAAEgG,WAAY,IAAK,GAAGV,EAAO2W,IAAK,EACzCC,WAAY,CACVV,QAAS6D,GAAejD,eAAexT,CAAAA,EACvC2B,KAAM,WACR,CAAA,SAEDyR,GAAAA,CACC1lB,KAAK,UACL+M,MAAM,OACNyB,UAAU,QACV9E,MAAO,CACLgG,WAAY,IACZwP,aAAclQ,EAAO+V,kBACrB,GAAG/V,EAAO2W,IACZ,EACAC,WAAY,CACVV,QAAS6D,GAAehD,aAAazT,CAAAA,EACrC2B,KAAM,YACN+R,cAAe,CACbtc,MAAO,CACLwV,aAAclQ,EAAO+V,iBACvB,CACF,CACF,CAAA,KAIR,CAAG,EAUUqD,GAA4B7N,EAAA,KAAA,SAA8B,CACrE7I,WAAAA,EACA6C,SAAAA,EACAnD,QAAAA,EACAwH,OAAAA,EACArB,eAAAA,EACAC,eAAAA,GAC0B,CAC1B,MAAM0O,EAAiBpT,KACjB,CAACkC,EAAUC,CAAY,EAAGnJ,WAAS,EAAA,EACnC,CAAC6G,EAAOC,CAAS,EAAG9G,WAAS,EAAA,EAC7B8X,EAAyBC,GAAe,sBAAA,EAE9C,cACG1W,EAAAA,CACCzD,MAAO,CACL8D,KAAM,EACNJ,cAAe,MACf,mBAAoB,CAClBgI,QAAS,EACT+D,WAAY,cACd,EACA,yBAA0B,CACxB/D,QAAS,CACX,CACF,mBAECjI,EAAAA,CACCzD,MAAO,CACL8D,KAAM,EACNJ,cAAe,KACjB,EACA+Y,mBAAoB,IAAMvT,EAAS,EAAA,EACnC/C,aAAc,IAAA,CACZ+C,EAAS,EAAA,CACX,YAEC,CAACxB,IAAYuB,GAASqC,UACpB7H,EAAAA,CACCzD,MAAO,CACL8G,WAAY,EACZqG,YAAa,EACbvJ,eAAgB,SAChB8Y,eAAgB,EAChBtP,kBAAmB,EACnBuP,YAAavX,EAAM2C,WACrB,kBAECuC,EAAAA,CACCC,KAAK,OACLtE,QAASpQ,GAAAA,CACPA,EAAEsW,gBAAe,EACjBZ,EAAY,EAAA,CACd,EACAvL,MAAO,CACL6E,QAAS,CACX,EAEA,eAACuH,GAAAA,CACC/I,MAAO,GACPwF,OAAQ,GACR4B,UAAU,gBACVzK,MAAOsL,GAAY,CAAEI,QAAS,CAAE,CAAA,KAGnCJ,SACE/C,GAAAA,CACCnC,SAAS,cACT/C,MAAO,IACPrD,MAAO,CAAE6E,QAAS,CAAE,EACpBuD,QAAS,IAAMmD,EAAY,EAAA,EAE3B,eAACc,GAAAA,CACCC,aAAc/B,GAAAA,CACZsD,EAAe7F,EAAYuC,EAAM,CAAEM,SAAUA,EAASjC,EAAAA,CAAG,EACzD2C,EAAY,EAAA,CACd,EACAgB,MAAO,CACL,CACEjW,KAAM,mBACNkW,KAAM,0BACR,EACA,CACElW,KAAM,mBACNkW,KAAM,wBACR,EACA,CACElW,KAAM,mBACNkW,KAAM,wBACR,EACA,CACElW,KAAM,oBACNkW,KAAM,uBACR,EACA0N,GAA0B,CACxB5jB,KAAM,iCACNkW,KAAM,uBACR,CACD,CAAA,KAKP,CAAA,EAAA,WACHwP,GAAAA,CACC1lB,KAAK,SACL0W,QAAStF,EACTe,QAASf,EACTrE,MAAM,OACNuZ,SAAU,IAAM1N,EAAOrE,EAASjC,GAAIZ,CAAAA,EACpChI,MAAO,CAAE,GAAI0H,GAAW,CAAEkF,OAAQ,GAAI,EAAI,GAAGtH,EAAO2W,IAAK,EACzDnX,UAAU,QACV+X,WAAY,CACV7X,OAAQ,UACR2L,OAAQ,EACR9L,QAAS,QACTI,aAAc,EACd,SAAU,CACRgO,UAAW,mBAAqB7N,EAAM0X,oBACtCtX,gBAAiBJ,EAAMuH,eACzB,CACF,EACAuP,WAAY,CACVV,QAAS6D,GAAetC,YAAYlS,EAASjC,EAAE,EAC/C2B,KAAM,YACNyS,cAAeC,GACfC,WAAYC,GACHC,GAAkBD,CAAAA,EAE3BE,aAAcF,GACLG,GAAgBC,GAAeJ,EAAM,CAAA,CAAA,CAEhD,EACA9P,WAAY,CACVH,OAAQ,IAAA,CACNgC,EAAO,IAAA,CACT,EACAlP,MAAO,CACLwF,gBAAiBJ,EAAMuH,eACzB,CACF,EACAzB,OAAQsS,GAAAA,CACN3P,EAAe7F,EAAY,gBAAiB,CAC1C6C,SAAUA,EAASjC,GACnB4U,OAAAA,CAAAA,CACF,CACF,CAAA,YAGHC,GAAAA,CAAMnnB,KAAK,QAAQ+M,MAAM,OAAOrD,MAAO,CAAE8E,UAAW,OAAQ,EAC3D,eAAC4Y,OAAAA,CACC5R,cAAY,uBACZ7F,QAAS,IAAM6H,EAAejD,EAASvU,KAAMuU,EAASjC,GAAIZ,CAAAA,EAE1D,eAACuT,GAAAA,CACCC,QAAS6D,GAAe1B,aAAa9S,EAASjC,EAAE,EAChD2B,KAAK,YACLqT,SAAUX,GACVjd,MAAO,CACLgF,OAAQ,UACR,SAAU,CAAEG,eAAgB,WAAY,CAC1C,CAAA,cAILsY,GAAAA,CACCnnB,KAAK,UACLunB,SAAU,GACVxa,MAAM,OACNrD,MAAO,CAAEwV,aAAclQ,EAAO+V,kBAAmBvW,UAAW,OAAQ,kBAEnE4Y,OAAAA,CAAM,GAAGlB,EAAe7R,cAAe,EACtC,eAACmT,GAAAA,CACCE,UAAWqB,GAAepB,aAAapT,EAASjC,EAAE,EAClDsV,QAASmB,GAAelB,WAAWtT,EAASjC,EAAE,EAC9CwV,KAAMiB,GAAehB,QAAQxT,EAASjC,EAAE,EACxC0V,SAAUe,GAAetC,YAAYlS,EAASjC,EAAE,CAAA,KAGnD4T,EAAenS,QACdzK,EAAA,IAAC2e,GAAAA,CACCC,WAAY3T,EAASjC,GACrBO,QAASqT,EACTxU,WAAAA,EACA6F,eAAAA,CAAAA,QAMZ,CAAG,EAEI,SAAS8Q,IAAAA,CACd,aACGlb,EAAAA,CAAKzD,MAAO,CAAE8D,KAAM,CAAE,EACrB,eAACkY,GAAAA,CACC1lB,KAAK,WACL+M,MAAM,OACNyB,UAAU,QACV9E,MAAO,CACLgG,WAAY,IACZwP,aAAclQ,EAAO+V,kBACrB,GAAG/V,EAAO2W,IACZ,EACAC,WAAY,CACVV,QAAS6D,GAAeG,oBACxBjV,KAAM,YACN+R,cAAe,CACbtc,MAAO,CACLwV,aAAclQ,EAAO+V,iBACvB,CACF,CACF,CAAA,IAIR,CAQO,SAASuD,GAAoB,CAClC/T,SAAAA,EACAG,OAAAA,EACAhD,WAAAA,EACA8F,eAAAA,GACyB,CACzB,aACGrK,EAAAA,CAAKzD,MAAO,CAAE8D,KAAM,CAAE,EACrB,eAAC2Z,GAAAA,CACCnnB,KAAK,WACL+M,MAAM,OACNrD,MAAO,CACLwV,aAAclQ,EAAO+V,kBACrBvW,UAAW,QACX,GAAIkG,GAAU,CAAEoC,kBAAmB,CAAE,CACvC,EAEA,eAACsQ,OAAAA,CACCzX,QAAS,IAAM6H,EAAejD,EAASvU,KAAMuU,EAASjC,GAAIZ,CAAAA,EAE1D,eAACuT,GAAAA,CACCC,QAAS6D,GAAe1B,aAAa9S,EAASjC,EAAE,EAChD2B,KAAK,YACLvK,MAAO,CACLgF,OAAQ,UACR,SAAU,CAAEG,eAAgB,WAAY,CAC1C,CAAA,QAMZ,wPCrUA,SAASsa,GAAYxnB,EAAkB,CAC/BsK,MAAAA,EAAeC,KACfkd,EAAWxmB,SAAO,IAAA,EAClBymB,EAAcC,KACdxlB,EAAWylB,KACXC,EAAWC,KACX,CAACC,EAAaC,CAAwB,EAC1C3O,GAAa,mBAAA,EACTxP,EAAake,GAAezd,EAC5B,CAACsX,EAAkBqG,CAAwB,EAAG5O,GAClD,yBAAA,EAEI,CAAC6O,CAAY,EAAG7O,GAAa,YAAA,EAC7B8O,EAAaD,GAAe,WAC5B,CAACE,CAAW,EAAGC,GAAc,WAAA,EAC7BtH,EAAYqH,GAAc,EAE1B,CAACE,EAAaC,CAAe,EAAGpe,WAAS,EAAA,EACzC,CAACqe,EAAQC,CAAU,EAAGte,WAAS,CACnCuC,MAAOpC,EACPqC,IAAKrC,CAAAA,CACP,EACM,CAAE6V,QAAStH,CAAc,EAAK6P,GAAAA,EAEpC,SAASC,GAAAA,CACPxmB,EAASymB,IAAAA,CACX,CAEApH,EAAAA,UAAU,IAAA,CACF,KAAA,CAAEqH,SAAAA,CAAa7oB,EAAAA,EAErB,eAAe8oB,GAAAA,CACbH,IAEA,KAAM,CAAEjc,MAAAA,EAAOC,IAAAA,CAAAA,EAAQ,MAAMgF,EAAK,mBAAA,EACxB8W,EAAA,CAAE/b,MAAAA,EAAOC,IAAAA,CAAAA,CAAI,EAEjBoc,MAAAA,GACJZ,EACAT,EACA,CAAEhb,MAAAA,EAAOC,IAAAA,GACT9C,CAAAA,EAGF0e,EAAe,EAAA,CACjB,CAEAO,IAEA,MAAME,EAAY,CAChBC,GAAO,aAAc,CAAC,CAAE3W,KAAAA,EAAM4W,OAAAA,KAAQ,CAElC5W,IAAS,YACR4W,EAAO3c,SAAS,YAAA,GACf2c,EAAO3c,SAAS,kBAChB2c,GAAAA,EAAO3c,SAAS,qBAElBoc,GACF,CACF,EAEAM,GAAO,aAAc,CAAC,CAAEC,OAAAA,KAAQ,CAC1BzB,EAASte,SAQXse,EAASte,QAAQoW,eAGf2J,EAAO3c,SAAS,YAAe,GACjCoc,GACF,CACF,EAEAE,EAASM,UAAUC,CAAAA,CAAAA,EAGrB,MAAO,IAAA,CACLJ,EAAUK,QAAQC,GAAYA,EAAAA,CAAAA,CAAAA,CAElC,EAAG,CAAE,CAAA,EAEL9H,EAAAA,UAAU,IAAA,CACR7P,EAAK,mBAAA,EAAqB4X,KAAK,CAAC,CAAE7c,MAAAA,EAAOC,IAAAA,KAAK,EACxC6b,EAAO9b,QAAUA,GAAS8b,EAAO7b,MAAQA,IACjC8b,EAAA,CAAE/b,MAAAA,EAAOC,IAAAA,CAAAA,CAAI,CACzB,CACF,CAAA,EACC,CAAC3M,EAAMwpB,SAAAA,CAAU,EAEd/a,MAAAA,EAAgB,MAAO1C,EAAOjC,IAAAA,CAClCke,EAAwBjc,CAAAA,EAExB,MAAM0d,EAAe1d,EAQjBA,EAAQlC,EAEV,MAAM6f,GACJvB,EACAT,EACAnd,GAAqBwB,EAAO,CAAA,CAAA,EAErBA,EAAQlC,GAEjB,MAAM6f,GACJvB,EACAT,EACAnd,GAAqBwB,EAAOjC,CAAAA,CAAAA,EAI5B2f,IAAiB1d,GACnBic,EAAwBjc,CAAAA,CAC1B,EAGI4d,EAAwCtrB,GAAAA,CAC5C8D,EACEynB,GAAgB,CACdtX,KAAM,QACNuX,QAAS,aAAaxrB,CAAAA,2CACxB,CAAA,CAAA,CAAA,EAIE0a,EAAiB,MAAMnG,GAAAA,CAW3B,IAVa,MAAMjB,EAAK,gBAAA,GAEjBwO,QACF5O,OAAO8J,GAAKA,EAAE1K,KAAOiC,EAASqD,SAAS,EAAE,CAAE,EAC3CoC,WAAW9G,OACVsJ,GAAKA,EAAExc,KAAKyrB,gBAAkBlX,EAASvU,KAAKyrB,YAAAA,CAAW,EAExDvY,OAAOsJ,GAAMjI,EAASjC,KAAO,MAAQ,GAAOkK,EAAElK,KAAOiC,EAASjC,EAAE,EAChE7F,OAAS,EAEF,CACV6e,EAAsC/W,EAASvU,IAAI,EACnD,MACF,CAEIuU,EAASjC,KAAO,MAEhBoZ,EAAAA,GACEnX,EAASvU,KACTuU,EAASqD,UACTrD,EAASuI,UACTvI,EAASc,MAAM,CAAA,EAIVsW,EAAAA,GAAepX,CAAAA,CAAAA,CAC1B,EAGIqG,EAAmB,MAAMtI,GAAAA,CACvBsZ,MAAAA,EAAe,MAAMtY,EAAK,yBAA0B,CAAEhB,GAAAA,CAAAA,CAAG,EAG7DxO,EADE8nB,EAEAC,GAAU,0BAA2B,CACnCtX,SAAUjC,EACVuC,SAAUiX,GAAAA,CACJxZ,IAAOwZ,GACAC,EAAAA,GAAezZ,EAAIwZ,CAAAA,CAAAA,CAEhC,CACF,CAAA,EAGOC,GAAezZ,CAAAA,CAHtB,CAIJ,EAGIqI,EAAc7B,GAAAA,CACdA,EAAMxG,KAAO,MACN0Z,EAAAA,GAAYlT,EAAM9Y,IAAI,CAAA,EAEtBisB,EAAAA,GAAYnT,CAAAA,CAAAA,CACvB,EAGI+B,EAAgB,MAAMvI,GAAAA,CAC1B,MAAMwG,EAAQ0B,EAAeuC,KAAKC,GAAKA,EAAE1K,KAAOA,CAAAA,EAEhD,IAAIsZ,EAAe,GACRrX,UAAAA,KAAYuE,EAAMkB,WACvB,GAAA,MAAM1G,EAAK,yBAA0B,CAAEhB,GAAIiC,EAASjC,EAAAA,CAAO,EAAA,CAC9CsZ,EAAA,GACf,KACF,CAIA9nB,EADE8nB,EAEAC,GAAU,0BAA2B,CACnC/S,MAAOxG,EACPuC,SAAUiX,GAAAA,CACCI,EAAAA,GAAY5Z,EAAIwZ,CAAAA,CAAAA,CAC3B,CACF,CAAA,EAGOI,GAAY5Z,CAAAA,CAHnB,CAIJ,EAGIiF,EAAiB,CAAC7J,EAAOuG,EAAMjD,IAAAA,CACnClN,EAASqoB,GAAkBze,EAAOuG,EAAMjD,CAAAA,CAAAA,CAAAA,EAGpCwG,EAAiB,CAAC4U,EAAclE,EAAYxa,IAAAA,CAChD8b,EAAS,YAAa,CACpB7rB,MAAO,CACL0uB,OAAQ,GACRC,WAAY,GAAGF,CAAAA,KAAiBlgB,GAC9BwB,EACA,WACA,CAAA,IACFwF,OAAQ,CACNqB,SAAU2T,EACVqE,KAAM,CAAEC,WAAY,SAAUC,IAAK/e,CAAM,CAC3C,CACF,CAAA,CACF,CAAA,EAGIgM,EAAoB,MAAMgT,GAAAA,CACxBC,MAAAA,EAAO,MAAMrZ,EAAK,gBAAA,EAClBsZ,EAAgBD,EAAKE,KAAK3Z,OAAOsJ,GAAKA,EAAElK,KAAOoa,EAASpa,EAAE,EAAE,CAAE,EASpE,GAPEqa,EAAK7K,QACF5O,OAAO8J,GAAKA,EAAE1K,KAAOoa,EAASnQ,OAAO,EAAE,CAAA,EACvCvC,WAAW9G,OACVsJ,GAAKA,EAAExc,KAAKyrB,YAAW,IAAOmB,EAAc5sB,KAAKyrB,YAElDvY,CAAAA,EAAAA,OAAOsJ,GAAKA,EAAElK,KAAOsa,EAActa,EAAE,EAAE7F,OAAS,EAEzC,CACV6e,EAAsCsB,EAAc5sB,IAAI,EACxD,MACF,CAEA8D,EAASgpB,GAAaJ,EAASpa,GAAIoa,EAASnQ,QAASmQ,EAAS1M,QAAQ,CAAA,CAAA,EAGlEvG,EAAiB,MAAMiT,GAAAA,CAC3B5oB,EAASipB,GAAkBL,EAASpa,GAAIoa,EAAS1M,QAAQ,CAAA,CAAA,EAGrD/G,EAAmB,IAAA,CACvB2Q,EAAwB,CAACrG,CAAAA,CAAAA,EAGrBwH,EAAkB,MAAO,CAAE9W,KAAAA,EAAM+Y,QAAAA,KAA0B,CAC/D,OAAQ/Y,EAAAA,CACN,KAAKgZ,GAA4B,CAC/B,MAAMC,GACJF,EAAQG,cACR9D,EACAc,EACA3e,EACA,SAAA,CACE1H,EAASspB,IAAAA,CAAAA,CACX,EAEF,KACF,CAEF,CAAA,EAGI,CAAEC,iBAAAA,EAAkBC,mBAAAA,CAAuB3rB,EAAAA,EAE7C,GAAA,CAACsoB,GAAe,CAACzP,EACZ,OAAA,KAGL+S,IAAAA,EACJ,OAAIzD,IAAe,SACjByD,QACGjK,GAAAA,CACCC,iBAAAA,EACAhM,eAAAA,EACAiM,wBAAyBvK,EAEzB,eAACmK,GAAAA,CACCngB,IAAKmmB,EACLnV,KAAM6V,EACNzI,kBAAmB7V,EACnBA,WAAAA,EACAE,YAAaye,EACbzH,UAAAA,EACAjI,eAAgB4S,EAChBjd,cAAAA,EACAwK,iBAAAA,EACAC,cAAAA,EACAH,eAAAA,EACAC,YAAAA,EACApD,eAAAA,EACAC,eAAAA,EACAkC,kBAAAA,EACAD,eAAAA,CAAAA,KAKN8T,QACGhF,GAAAA,CACChF,iBAAAA,EACAhM,eAAAA,EACAiM,wBAAyBvK,EAEzB,eAACmK,GAAAA,CACCngB,IAAKmmB,EACLnV,KAAM6V,EACNzI,kBAAmB7V,EACnBA,WAAAA,EACAE,YAAaye,EACbzH,UAAAA,EACAjI,eAAgB6S,EAChBld,cAAAA,EACAwK,iBAAAA,EACAC,cAAAA,EACAH,eAAAA,EACAC,YAAAA,EACApD,eAAAA,EACAC,eAAAA,EACAkC,kBAAAA,EACAD,eAAAA,CAAAA,WAMAtM,EAAAA,CAAKzD,MAAO,CAAE8D,KAAM,CAAE,EAAI+f,SAAAA,CAAAA,EACpC,CAEA,MAAMC,GAAgD7rB,EAAAA,KAAAA,GAAAA,CAC9CiiB,MAAAA,EAAyBC,GAAe,sBAAA,EAE5C,OAAAva,EAAAA,IAACmkB,GAAsB,CACpB,GAAG9rB,EACJiiB,uBAAAA,CAAAA,EAGN,CAAA,EAEA4J,GAAsBtsB,YAAc,wBAE7B,SAASwsB,IAAAA,CACRlD,MAAAA,EAAWroB,aAAWwrB,EAAAA,EAEtBN,EAAmB7rB,EAAAA,QACvB,KAAO,CACLkc,iBAAkBkQ,GAClB1Q,yBAA0B0Q,GAC1B3Q,sBAAuB2Q,GACvBtQ,wBAAyBsQ,GACzBvQ,qBAAsBuQ,GACtBnM,sBAAuBmM,GACvBxQ,sBAAuBwQ,EAAOpI,GAEhC,CAACoI,EAAAA,CAAO,EAGJN,EAAqB9rB,EAAAA,QACzB,KAAO,CACLkc,iBAAkB8P,GAClBtQ,yBAA0BuQ,GAC1BxQ,sBAAuBwQ,GACvBnQ,wBAAyBmQ,GACzBpQ,qBAAsBoQ,GACtBhM,sBAAuBgM,GACvBrQ,sBAAuBqQ,EAASjI,GAElC,CAACiI,EAAAA,CAAS,EAOZ,aACGtgB,EAAAA,CACCzD,MAAO,CACL,GAAGsF,EAAO6e,KACVhX,YAAa,EACbqI,aAAc,EACdvJ,SAAU,QACZ,EAEA,eAACwT,GAAAA,CACCkE,iBAAAA,EACAC,mBAAAA,EACA9C,SAAAA,CAAAA,IAIR,CCxdO,SAASsD,IAAAA,CACR,KAAA,CAAEjC,UAAAA,GAAc7I,KAChB,CAAC9P,EAAQ6a,CAAU,EAAGjiB,WAAS,EAAA,EAE/BkiB,EAAeC,KAErB,GAAID,GAAgB,KACX,OAAA,KAGH,KAAA,CAAEE,UAAAA,EAAWC,SAAAA,CAAaH,EAAAA,EAEhC,SAASpV,EAAOtG,EAAwB,CACtCuZ,EAAU,gBAAiB,CAAEvZ,GAAAA,CAAAA,CAAG,CAClC,CAEA,SAAS8b,GAAAA,CACPvC,EAAU,eAAA,CACZ,CAEA,SAASwC,GAAAA,CACPxC,EAAU,oBAAA,CACZ,CAEeyC,eAAAA,EAAStuB,EAA0BsS,EAAwB,CACxE,OAAQtS,EAAAA,CACN,IAAK,mBACH,MAAMsT,EAAK,4BAA6B,CAAEhB,GAAAA,CAAAA,CAAG,EAC7C,MACF,IAAK,OACH,MAAMgB,EAAK,0BAA2B,CAAEhB,GAAAA,CAAAA,CAAG,EAC3C,MACF,IAAK,WACH,MAAMgB,EAAK,kBAAmB,CAC5Bib,SAAU,CAAEjc,GAAAA,EAAIkc,UAAW,EAAK,CAAA,CAClC,EACA,MACF,IAAK,UACH,MAAMlb,EAAK,kBAAmB,CAC5Bib,SAAU,CAAEjc,GAAAA,EAAIkc,UAAW,EAAM,EACjCC,cAAe,EAAA,CACjB,EACA,MACF,IAAK,SACH,MAAMnb,EAAK,kBAAmB,CAAEhB,GAAAA,CAAAA,CAAG,EACnC,KAEJ,CACF,CAEA,cACGoc,GAAAA,CAAKC,MAAM,4BACTxhB,EAAAA,CACCzD,MAAO,CACL0D,cAAe,MACfC,WAAY,SACZkB,QAAS,UACX,EAEA,eAACpB,EAAAA,CACCzD,MAAO,CACL8D,KAAM,EACNJ,cAAe,MACfE,eAAgB,UAClB,EAEA,eAACshB,GAAAA,CACC5X,YAAY,oBACZzF,MAAO2B,EACPd,SAAU2b,CAAAA,aAKfc,GAAAA,CACCX,UAAAA,EACAhb,OAAAA,EACAib,SAAAA,EACAW,eAAgB,GAChBnjB,SAAUiN,EACV0V,SAAAA,EACA5kB,MAAO,CAAEwF,gBAAiBJ,EAAMuH,eAAgB,CAAA,UAGjDlJ,EAAAA,CACCzD,MAAO,CACL0D,cAAe,MACfE,eAAgB,gBAChB+M,OAAQ,SACR7J,WAAY,CACd,kBAECwD,EAAAA,CAAOrE,QAAS0e,EAAY,SAAA,gBAAA,SAC5Bra,EAAAA,CAAOC,KAAK,UAAUtE,QAASye,EAAO,SAAA,kBAAA,QAM/C,CC5GO,SAASW,IAAAA,CACdC,cAAOzb,MAAK,QAGT0b,GAAAA,CAAMC,UAAW,GAAMC,UAAW,GAAOR,MAAM,eAC7C,SAAA,IACCzkB,EAAA,KAACiD,EAAAA,CAAKzD,MAAO,CAAEwZ,SAAU,GAAI,kBAC1BkM,GAAAA,CAAU,SAAA,gBAAA,SACVA,GAAAA,CAAU,SAAA,8FAAA,OAQrB,CC0DA,SAASC,GAAgBC,EAAKtvB,EAAI,CACzBsvB,OAAAA,EAAMA,EAAItvB,CAAAA,EAAQ,EAC3B,CAEA,SAASuvB,GAAqBC,EAAaC,EAAiB,CACtD,GAAA,CAAEvI,OAAAA,EAAQqF,KAAAA,CAASiD,EAAAA,EAEnBE,GAAYF,EAAYld,EAAE,IAC5B4U,GAAUsI,EAAYG,SAAW,GAAK,GAAKC,GAAmB1I,CAAAA,GAGhE,IAAI2I,EAAQ3I,EAAS,EAAI,CAACA,EAAS,KAC/B4I,EAAS5I,EAAS,EAAIA,EAAS,KAEnC,OAAIA,IAAW,IACTuI,EACOK,EAAA,EAEDD,EAAA,GAKPE,GAAYC,GAASzD,CAAQ,CAAA,IAKzBA,EAAA,MAGF,CACL,GAAGiD,EACHjD,KAAAA,EACAsD,MAAOA,GAAS,KAAO/I,GAAkB+I,CAAS,EAAA,GAClDC,OAAQA,GAAU,KAAOhJ,GAAkBgJ,CAAU,EAAA,EAAA,CAEzD,CAEA,SAASG,GAAuBT,EAAaU,EAAmB,CAC9D,KAAM,CAAEL,MAAAA,EAAOC,OAAAA,EAAQvD,KAAM4D,EAAc,GAAGC,CAAoBZ,EAAAA,EAE9DtI,IAAAA,EACJ,GAAI2I,IAAU,GAAI,CACVQ,MAAAA,EAASpJ,GAAe4I,EAAO,IAAA,EAC5BQ,EAAAA,GAAU,KAAO,CAACA,EAAS,IAAA,MAE3BpJ,EAAAA,GAAe6I,EAAQ,IAAA,EAGlC5I,EACEA,GAAU,KAAOF,GAAgBE,CAAAA,EAAUgJ,EAAoBhJ,OAEjE,IAAIqF,EAAO4D,EACX,OAAI5D,GAAQ,OACH2D,EAAAA,EAAoB3D,MAAQ+D,MAG9B,CAAE,GAAGF,EAAiB7D,KAAAA,EAAMrF,OAAAA,CAAAA,CACrC,CAEA,SAASqJ,GAAYC,EAAcrf,EAAK,CAChCsf,MAAAA,EAAQD,EAAarf,CAAM,EACjC,OACEsf,GACAA,EAAMC,WACLF,EAAarf,EAAQ,CAAE,GAAI,MAC1Bqf,EAAarf,EAAQ,CAAE,EAACwf,YAAcF,EAAME,UAElD,CAEA,MAAMC,mBAAsC,IAAA,EAErC,SAASC,IAAAA,CACR9d,MAAAA,EAAO5Q,aAAWyuB,EAAAA,EAExB,OAAOpvB,UACL,KAAO,CACL,GAAGuR,EACH+d,SAAUxe,GACRS,EAAKpV,MAAMozB,OAAS,WAChB,CAAChe,EAAKpV,MAAMqzB,IAAIC,IAAI3e,CACpBS,EAAAA,EAAKpV,MAAMqzB,IAAIC,IAAI3e,CAAAA,CAAAA,GAE3B,CAACS,CAAAA,CAAK,CAEV,CAEO,SAASme,GAAuB,CAAEzN,SAAAA,EAAU0N,YAAAA,EAAc,UAAU,CACzE,MAAMC,EAAcC,GAAY1zB,GAASA,EAAM2zB,IAAIC,cAAc,EAC3DC,EAAgBjI,KAEhB,CAAC5rB,EAAOmG,CAAAA,EAAYrB,EAAAA,WACxB,CAAC9E,EAAOC,IAAAA,CACN,OAAQA,EAAOqW,KAAI,CACjB,IAAK,eAAgB,CACb+c,MAAAA,MAAUS,IAAI,CAAI9zB,GAAAA,EAAMqzB,GAAAA,CAAI,EAC5B,CAAE1e,GAAAA,CAAO1U,EAAAA,EACXozB,OAAAA,EAAIC,IAAI3e,CAAK,EACf0e,EAAIU,OAAOpf,CAAAA,EAEX0e,EAAIW,IAAIrf,CAAAA,EAEH,CAAE,GAAG3U,EAAOqzB,IAAAA,CAAAA,CACrB,CACA,IAAK,aAAc,CACXA,MAAAA,MAAUS,IAAI,CAAI9zB,GAAAA,EAAMqzB,GAAAA,CAAI,EAC5B,CAAE1e,GAAAA,CAAO1U,EAAAA,EACXD,OAAAA,EAAMozB,OAAS,WACjBC,EAAIU,OAAOpf,CAAAA,EAEX0e,EAAIW,IAAIrf,CAAAA,EAEH,CAAE,GAAG3U,EAAOqzB,IAAAA,CAAAA,CACrB,CACA,IAAK,WACI,MAAA,CACL,GAAGrzB,EACHozB,KAAMnzB,EAAOmzB,KACbC,QAASS,IACTG,aAAc,IAAA,EAGlB,IAAK,cACCj0B,OAAAA,EAAMi0B,cAAgB,KAEjBj0B,EAGF,CACL,GAAGA,EACHozB,KAAMpzB,EAAMozB,OAAS,SAAW,WAAa,SAC7Ca,aAAch0B,EAAO0U,GACrB0e,QAASS,GAAAA,EAEb,IAAK,qBACI,MAAA,CAAE,GAAG9zB,EAAOi0B,aAAc,IAAA,EACnC,QACE,MAAM,IAAIrU,MAAM,wBAA0B3f,EAAOqW,IAAI,CACzD,CAAA,EAEFmd,EAAYtmB,SAAW,CAAEkmB,QAASS,IAAOV,KAAMI,CAAAA,CAAY,EAG7DhO,EAAAA,UAAU,IAAA,CACJxlB,EAAMi0B,cAAgB,MAExBje,WAAW,IAAA,CACA7P,EAAA,CAAEmQ,KAAM,oBAAA,CAAqB,GACrC,GAAA,CACL,EACC,CAACtW,EAAMi0B,YAAAA,CAAa,EAEvBzO,EAAAA,UAAU,IAAA,CAEJxlB,EAAMi0B,cAAgB,MACVJ,EAAA,CAAEvd,KAAM,uBAAwB4d,WAAYl0B,CAAAA,CAAM,CAClE,EACC,CAACA,CAAAA,CAAM,EAEJ4T,MAAAA,EAAQ/P,EAAAA,QAAQ,KAAO,CAAE7D,MAAAA,EAAOmG,SAAAA,CAAAA,GAAa,CAACnG,EAAOmG,CAAAA,CAAS,EAGlE,OAAAwF,EAAA,IAACsnB,GAAsBtf,SAAQ,CAACC,MAAAA,EAC7BkS,SAAAA,CAAAA,EAGP,CAEA,SAASqO,GAAcC,EAAOC,EAASC,EAASC,EAAiB,MAAK,CACpE,OAAOH,IAAUE,EACbD,IAAY,MACV,OACA,MACFE,CACN,CAEA,MAAMC,GAAoB5X,EAAAA,KACxB,CAAC,CACC6X,YAAAA,EACAC,YAAAA,EACAC,aAAAA,EACAC,YAAAA,EACAC,YAAAA,EACAC,YAAAA,EACAC,OAAAA,EACAV,QAAAA,EACAD,MAAAA,KACD,CACC,MAAMY,EAAmBC,KAEzB,cACGva,GAAAA,CACC3O,MAAO,CACLgG,WAAY,IACZ4G,OAAQ,IACR3M,MAAOmF,EAAMga,gBACb5Z,gBAAiBJ,EAAMuH,eACzB,kBAECwc,GAAAA,CACCnc,QAAS,GACTvE,QAAS,GACTtE,SAAUukB,EACVrlB,MAAO,GACPpB,SAAUpM,GAAKozB,EAAiB,CAAE1e,KAAM,aAAc6e,MAAOvzB,CAAAA,CAAE,CAAA,SAEhEwzB,GAAAA,CACCxhB,MAAM,OACNxE,MAAO,IACPM,WAAW,OACXkD,WAAY,GACZ+B,GAAG,OACH0gB,KAAMjB,IAAU,OAASC,EAAU,YACnCriB,QAAS,IACP+iB,EAAO,OAAQZ,GAAcC,EAAOC,EAAS,OAAQ,MAAA,CAAA,CAAA,GAGxDK,SACEU,GAAAA,CACCxhB,MAAM,UACNxE,MAAM,OACNM,WAAW,OACXkD,WAAY,GACZ+B,GAAG,UACH0gB,KAAMjB,IAAU,UAAYC,EAAU,YACtCriB,QAAS,IACP+iB,EAAO,UAAWZ,GAAcC,EAAOC,EAAS,UAAW,KAAA,CAAA,CAAA,SAIhEe,GAAAA,CACCxhB,MAAM,QACNxE,MAAM,OACNM,WAAW,OACXkD,WAAY,GACZ+B,GAAG,QACH0gB,KAAMjB,IAAU,QAAUC,EAAU,YACpCriB,QAAS,IACP+iB,EAAO,QAASZ,GAAcC,EAAOC,EAAS,QAAS,KAAA,CAAA,CAAA,SAG1De,GAAAA,CACCxhB,MAAM,QACNxE,MAAM,OACNM,WAAW,OACXkD,WAAY,GACZ+B,GAAG,QACH0gB,KAAMjB,IAAU,QAAUC,EAAU,YACpCriB,QAAS,IACP+iB,EAAO,QAASZ,GAAcC,EAAOC,EAAS,QAAS,KAAA,CAAA,CAAA,GAG1DM,SACES,GAAAA,CACCxhB,MAAM,WACNxE,MAAM,OACNM,WAAW,OACXkD,WAAY,GACZ+B,GAAG,WACH0gB,KAAMjB,IAAU,WAAaC,EAAU,YACvCriB,QAAS,IACP+iB,EACE,WACAZ,GAAcC,EAAOC,EAAS,WAAY,KAAA,CAAA,CAAA,SAKjDe,GAAAA,CACCxhB,MAAM,UACNxE,MAAO,GACPM,WAAW,WACXoD,YAAa,GACb6B,GAAG,UACH0gB,KAAMjB,IAAU,UAAYC,EAAU,YACtCriB,QAAS,IACP+iB,EAAO,UAAWZ,GAAcC,EAAOC,EAAS,UAAW,KAAA,CAAA,CAAA,SAG9De,GAAAA,CACCxhB,MAAM,UACNxE,MAAO,GACPM,WAAW,WACXoD,YAAa,GACb6B,GAAG,UACH0gB,KAAMjB,IAAU,UAAYC,EAAU,YACtCriB,QAAS,IACP+iB,EAAO,UAAWZ,GAAcC,EAAOC,EAAS,UAAW,MAAA,CAAA,CAAA,GAG9DO,SAAgBU,GAAAA,CAAK1hB,MAAM,UAAUxE,MAAO,GAAIyB,UAAU,OAAA,GAE1DgkB,SACEO,GAAAA,CACCxhB,MAAM,IACNxE,MAAO,GACPM,WAAW,SACXiF,GAAG,UACH0gB,KAAMjB,IAAU,UAAYC,EAAU,YACtCriB,QAAS,IAAA,CACP+iB,EACE,UACAZ,GAAcC,EAAOC,EAAS,UAAW,KAAA,CAAA,CAE7C,CAAA,SAIHiB,GAAAA,CAAK1hB,MAAM,GAAGxE,MAAO,GAAK0lB,GAAe,EAAA,KAGhD,CAAA,EAGFN,GAAkBjxB,YAAc,oBAEhC,SAASgyB,GAAe1D,EAAa2D,EAAOC,EAAY,CAChD,KAAA,CAAED,MAAOE,CAAY7D,EAAAA,EAE3B,OAAI4D,QAECjmB,EAAAA,CACCzD,MAAO,CACL0D,cAAe,MACfC,WAAY,QACd,EAEA,eAACkI,MAAAA,CACC7L,MAAO,CACLiM,SAAU,SACVF,aAAc,UAChB,EAEC2d,SAAAA,EAAapzB,IAAAA,KAIXmzB,EACFA,EAAMnzB,KACJqzB,GAAWA,EAAQC,WAAW,MAAS,EACzCD,EAAQE,MAAM,CAAa,EAG7B,EACT,CAEA,SAASC,GAAW,CAClBlhB,GAAAA,EACAH,QAAAA,EACAtE,SAAAA,EACA4lB,OAAAA,EACAC,QAAAA,EACA9a,OAAAA,EACAjC,SAAAA,GACD,CACC,MAAMgd,EACJF,IAAW,WAAaA,IAAW,cAAgBA,GAAU,KACzDG,EAAcC,GAAeJ,CAAAA,EAE7BK,EACJL,IAAW,UACP3kB,EAAMilB,gBACNN,IAAW,aACT3kB,EAAMilB,gBACNN,IAAW,SACT3kB,EAAMklB,UACNP,IAAW,MACT3kB,EAAMmlB,YACNpmB,EACEiB,EAAMolB,kBACNplB,EAAMC,gBAEpB,SAASpD,GAAAA,CACHgoB,GACOhd,EAAA,UAAa8c,IAAW,SAAQ,CAE7C,CAEA,aACGR,GAAAA,CACCjzB,KAAK,UACL+M,MAAO,GACPoF,QAAAA,EACAzI,MAAO,CAAE6E,QAAS,CAAE,EACpB4lB,MAAK,GAEL,eAACC,GAAAA,CACC1qB,MAAO,CACL6E,QAAS,EACTW,gBAAiB,cACjBN,OAAQ,wBACRD,aAAc,GACd,SAAU,CACRC,OAAQ,aAAeE,EAAMulB,wBAC7B1X,UAAW,aAAe7N,EAAMulB,uBAClC,EACA3lB,OAAQilB,EAAiB,UAAY,UACrC,GAAID,GAAW,CAAEY,WAAY,QAAS,CACxC,EACA1b,OAAQ,IAAMA,EAAOtG,EAAI,SAAA,EACzB3G,SAAAA,WAEeioB,EAAAA,cAAAA,EAAYW,KAAM,CAC/B7qB,MAAO,CACLqD,MAAO,GACPwF,OAAQ,GACR5I,MAAOmqB,EACP7P,UAAWwP,IAAW,MAAQ,GAAK,CACrC,CAAA,CACF,CAAA,IAIR,CAEA,SAASV,GAAW,CAClBxhB,MAAAA,EACAe,GAAAA,EACAvF,MAAAA,EACAM,WAAAA,EACAkD,WAAAA,EACAE,YAAAA,EACAuiB,KAAAA,EACArjB,QAAAA,GACD,CACC,aACG6kB,GAAAA,CACCznB,MAAAA,EACA/M,KAAMsS,EACNjF,WAAAA,EACAonB,wBACGzgB,EAAAA,CACCC,KAAK,OACLtE,QAAAA,EACAjG,MAAO,CACLgM,WAAY,SACZC,SAAU,SACVF,aAAc,WACd9L,MAAOmF,EAAMga,gBACbpZ,WAAY,IACZa,WAAAA,EACAE,YAAAA,CACF,kBAECikB,GAAAA,CAAqBnjB,MAAAA,CAAAA,GACrByhB,IAAS,OACR1pB,EAAA,IAACS,GAAAA,CAAagD,MAAO,GAAIwF,OAAQ,GAAI7I,MAAO,CAAE6G,WAAY,CAAE,CAAA,GAE7DyiB,IAAS,QACR1pB,EAAA,IAACU,GAAAA,CAAW+C,MAAO,GAAIwF,OAAQ,GAAI7I,MAAO,CAAE6G,WAAY,CAAE,CAAA,OAMtE,CAEA,SAASokB,GAAU,CACjBriB,GAAAA,EACA+gB,QAAAA,EACAlI,UAAAA,EACAhZ,QAAAA,EACAyiB,UAAAA,EACAC,OAAAA,EACAC,SAAAA,EACAvO,WAAAA,EACAiJ,YAAAA,EACA2D,MAAAA,EACAC,aAAAA,EACA2B,UAAAA,EACAnc,OAAAA,EACAjC,SAAAA,EACAqe,cAAAA,EACAC,eAAAA,EACAC,4BAAAA,EACAC,qBAAAA,GACD,CACOC,MAAAA,EAAkBxyB,SAAO,EAAA,EAG/BkyB,OAAAA,EAAWA,EAAS5hB,OAAOmiB,GAAWA,EAAQ/iB,KAAO6Y,CAAAA,EACrD0J,EAASA,EAAO3hB,OAAOigB,GAASA,EAAMmC,gBAAkBnK,CAAAA,QAGrDqJ,GAAAA,CACCznB,MAAM,OACN/M,KAAK,QACLwO,UAAU,OACV+C,MAAO8hB,EACP9M,WAAY,CACV,GAAGA,EACH,GAAIqO,GAAa,CAAEjrB,MAAOmF,EAAMymB,iBAAkB,CACpD,EACA7e,QAASvE,EACTmU,SAAUtmB,GAAQ,CAAC+0B,GAAanc,EAAOtG,EAAItS,CAAAA,EAC3C2W,SAAU,MAAMpF,GAAAA,CAGd,GAFAoF,EAAS,QAASpF,CAAAA,EAEdA,GAASA,EAAM+hB,WAAW,SAAW,CAAC8B,EAAgBtqB,QAAS,CACjEsqB,EAAgBtqB,QAAU,GAC1B,MAAMwH,EAAK,MAAM0iB,EAAczjB,EAAMgiB,MAAM,CAAa,CAAA,EACxD5c,EAAS,QAASrE,CAAAA,EAClB8iB,EAAgBtqB,QAAU,EAC5B,CACF,EACA2pB,wBACEnb,WAAA,iBACGkc,GAAAA,CACChG,YAAAA,EACAiG,gBAAiBrC,EACjB8B,4BAAAA,EACAC,qBAAAA,CAAAA,SAEDT,GAAAA,CACCnjB,MAAO8hB,EACP5c,UAAW,IAAMyc,GAAe1D,EAAa2D,EAAOC,CAAAA,CAAAA,MAKzD,SAAA,CAAC,CACAxc,OAAAA,EACAL,UAAAA,EACAI,SAAAA,EACA/B,OAAAA,EACA8gB,kBAAAA,EACAC,WAAAA,WAGGC,GAAAA,CACCf,OAAAA,EACAC,SAAAA,EACAvjB,MAAO8hB,EACPqC,kBAAAA,EACA3e,WAAY,CACVH,OAAAA,EACAL,UAAAA,EACA7M,MAAOisB,CACT,EACAE,iBAAkB,GAClBC,cAAe,GACf3jB,QAAS,GACTwE,SAAUA,EACVhL,SAAUiJ,EACVqgB,eAAgB,IAAMA,EAAe5B,CAAAA,EACrC0C,YAAW,GACXC,iBAAkB1gB,MAAAA,EAGxB,EAGN,CAEA,SAASkgB,GAAW,CAClBhG,YAAAA,EACAiG,gBAAAA,EACAP,4BAAAA,EACAC,qBAAAA,EACA1R,SAAAA,GACD,CACC,MAAMwS,EAAazG,EAAYjB,SACzBP,EAAekI,KACf3H,EAAWP,EACbA,EAAaE,UAAUnR,KAAKoZ,GAAKA,EAAE7jB,KAAO2jB,CAC1C,EAAA,KAEA1H,GAAAA,GAAY,MAAQkH,GAAmB,KAElChS,OAAAA,EAGT,MAAM2S,EAAc,CAClB7lB,WAAY,GACZE,YAAa,EACb1D,MAAO,GACPwF,OAAQ,GACR5I,MAAO,SAAA,EAGH0sB,EAAoB,CAAEtpB,MAAO,GAAIwF,OAAQ,EAAA,EAEzC+jB,EAAoB,CAAEvpB,MAAO,GAAIwF,OAAQ,EAAA,EAEzCgkB,EAAYhI,GAAYA,EAASiI,OAAS,CAAC,CAACjI,EAASiI,MAAMC,UAEjE,cACEnd,EAAAA,SAAA,WACGiV,SACEva,EAAAA,CACCC,KAAK,OACLvK,MAAO0sB,EACPzmB,QAASpQ,GAAAA,CACPA,EAAEsW,gBAAe,EACjBsf,EAAqBc,CAAAA,CACvB,EAECM,SAAAA,EACCjtB,EAAA,IAACotB,GAAAA,CAAqBhtB,MAAO2sB,CAAAA,GAE7B/sB,EAAA,IAACqtB,GAAAA,CAAYjtB,MAAO2sB,CAAAA,KAIzBZ,SACEzhB,EAAAA,CACCC,KAAK,OACLC,aAAW,WACXxK,MAAO0sB,EACPzmB,QAASpQ,GAAAA,CACPA,EAAEsW,gBAAe,EACZ+gB,GAAcpH,EAAYld,EAAE,GAC/B4iB,EAA4BO,EAAgBnjB,EAAE,CAElD,EAEC,UAACkd,EAAYG,SAAW,GAAK,GAAKH,EAAYtI,OAAS,EACtD5d,EAAAA,IAACD,GAAAA,CAAcK,MAAO4sB,CAAAA,GAEtBhtB,EAAA,IAACutB,GAAAA,CAAentB,MAAO4sB,CAAAA,OAMnC,CAEA,MAAMQ,GAAcvc,EAAAA,KAAK,SAAqB5Y,EAAK,CACjD,KAAM,CACJ6tB,YAAaU,EACb6G,gBAAAA,EACA3lB,QAAAA,EACAihB,YAAAA,EACAE,YAAAA,EACAC,YAAAA,EACA/C,kBAAAA,EACA/lB,MAAAA,EACAmE,SAAAA,EACAmpB,YAAAA,EACAC,MAAAA,EACAC,QAAAA,EACApG,SAAAA,EACAqG,gBAAAA,EACAC,aAAAA,EACA5c,eAAAA,EACAqa,OAAAA,EACAC,SAAAA,EACAlN,QAAAA,EACAyP,WAAAA,EAAa,aACbC,aAAAA,EACA1iB,OAAAA,EACAgE,OAAAA,EACA/D,SAAAA,EACA0iB,QAAAA,EACAtC,eAAAA,EACAD,cAAAA,EACAwC,cAAAA,EACAtC,4BAAAA,EACAC,qBAAAA,CACExzB,EAAAA,EAEEgxB,EAAmBC,KAEnB,CAAC6E,EAAcC,CAAgB,EAAG5rB,WAAS2jB,CAAAA,EAC3C,CAACkI,EAAiBC,CAAmB,EAAG9rB,WAASokB,CAAAA,EACjD,CAACV,EAAaqI,CAAAA,EAAkB/rB,EAAAA,SAAS,IAC7CyjB,GAAqBW,EAAqBT,CAAAA,CAAAA,EAEtCsF,EAAYrF,GAAYF,EAAYld,EAAE,GAG1C4d,IAAwByH,GACxBlI,IAAsBgI,KAGpBlI,EAAAA,GAAqBW,EAAqBT,CAAAA,CAAAA,EAE5CmI,EAAmB1H,CAAAA,EACnBwH,EAAgBjI,CAAAA,GAGlB,KAAM,CAACqI,EAA2BC,CAA6B,EAC7DjsB,WAAS,EAAA,EAEF6K,SAAAA,EAAS3W,EAAMuR,GAAK,CAQvBie,EAAYxvB,CAAK,IAAKuR,KAEtBie,EAAYwI,aAAe,KAC1Bh4B,IAAS,UACRA,IAAS,SACTA,IAAS,SACTA,IAAS,WACTA,IAAS,QAEP83B,IAA8B,KAChCC,EAA6B,EAAA,EAC7Bp2B,EAAMkqB,UAAU,2BAA4B,CAC1CoM,UAAW,IAAA,CACTF,EAA6B,EAAA,EAC7BG,GAAqBl4B,EAAMuR,EAAAA,CAC7B,EACA4mB,cAAe,gBAAA,CACjB,GAGFD,GAAqBl4B,EAAMuR,EAAAA,GAK3BvR,IAAS,WAAawvB,EAAYwI,YACpCr2B,EAAMkqB,UAAU,2BAA4B,CAC1CoM,UAAW,IAAA,CACTC,GAAqB,aAAc,EAAA,CACrC,EACAC,cAAe,kBAAA,CACjB,CAEJ,CAESD,SAAAA,GAAqBl4B,EAAMuR,GAAK,CACvC,MAAM6mB,GAAiB,CAAE,GAAG5I,EAAa,CAACxvB,GAAOuR,EAAAA,EAGjD,GAAIvR,EAAAA,IAAS,QAAUuR,KAAU,IAAMie,EAAYpc,MAAQ,MA4B3D,GAvBEpT,IAAS,WACTuR,IACA8mB,GAAgBvD,GAAUvjB,EAAAA,EAAO+mB,YAEjCF,GAAe7jB,SAAW,MAOxBvU,IAAS,SACXo4B,GAAe,MAAW,GACjBp4B,IAAS,UAClBo4B,GAAe,OAAY,IAGzBp4B,IAAS,WAAawvB,EAAY6F,UAAY9jB,KAChD6mB,GAAeJ,WAAa,IAK1Bh4B,IAAS,SAAWuR,IAASA,GAAM+hB,WAAW,MAAS,EACzDuE,EAAeO,EAAAA,MACV,CACCG,MAAAA,GAAetI,GACnBmI,GACAlI,CAAAA,EAIaX,EAAAA,GAAqBgJ,GAAc9I,CAAAA,CAAAA,EAElD7a,EAAO2jB,GAAcxB,CAAAA,CACvB,CACF,CAEM,KAAA,CACJzkB,GAAAA,EACA4U,OAAAA,GACA2I,MAAAA,EACAC,OAAAA,GACAqD,MAAOE,GACPmF,eAAgBC,GAChB1mB,MAAAA,GACAwa,KAAAA,GACA8I,QAASlK,GACT5W,SAAU2T,GACVwQ,QAAAA,GACAV,WAAAA,GACAW,UAAWC,GACXC,WAAAA,GAAa,GACblJ,SAAAA,GAAW,EAAA,EACTH,EAGE2D,GAAQ0B,GAAUxB,IAAWyF,GAAcjE,CAAAA,EAAQxB,EAAQ,EAC3DgC,GAAUP,GAAY3J,IAAakN,GAAgBvD,CAAAA,EAAU3J,EAAU,EACzEiI,IAAAA,GAEAzD,GACFyD,GACE0B,GAAY3J,IAAakN,GAAgBvD,CAAAA,EAAU3J,EAAU,EAE/DiI,GACED,IACAA,GAAMmC,eACN+C,GAAgBvD,CAAS,EAAC3B,GAAMmC,aAAa,EAGjD,MAAM5B,GAAUlE,EAAYkB,SACtBqI,GAAmB3F,IAAgBA,GAAakF,YAAc,EAC9DU,GAAc3D,IAAWA,GAAQiD,YAAc,EAE/C/R,GAAa0Q,EAAQ,CAAEvnB,WAAY,GAAQ,EAAA,KAC3CupB,GAAkB7B,IAAiB,SACnC8B,GAAc5B,EAAe,CAAE6B,cAAe,GAAS,EAAA,KAEvDC,GAAkBxC,GAActkB,CAAAA,EAElCsV,GAAW+H,GAAW,GAAK,GAAKzI,GADhCU,EAGJ,cACGvP,GAAAA,CACC3O,MAAO,CACLwF,gBAAiBrB,EACbiB,EAAMuqB,4BACNJ,GACEnqB,EAAMwqB,wBACNxqB,EAAMuH,gBACZ,SAAU,EAAE4iB,IAAmBprB,IAAa,CAC1CqB,gBAAiBJ,EAAMwqB,uBACzB,EACA,mBAAoB,CAClBlkB,QAAS,CACX,EACA,wBAAyB,CACvBA,QAAS,CACX,EACA,GAAI4hB,GAAenpB,EACf,CAAElE,MAAOmF,EAAMyqB,+BAAAA,EACf,CAAE5vB,MAAOmF,EAAM0qB,SAAU,EAC7B,GAAG9vB,EACH,GAAIqrB,GAAa,CACfprB,MAAOmF,EAAMymB,kBACbrmB,gBAAkBrB,EAAmCyH,OAAxBxG,EAAMuH,gBACnCojB,UAAW,QACb,EACA,GAAIZ,IAAc,CAAEzjB,QAAS,EAAI,CACnC,YAECse,UACEvM,GAAAA,CAECpa,MAAO,IACPrD,MAAO,CACLqD,MAAO,IACPmC,gBAAiBJ,EAAMwqB,wBACvB1qB,OAAQ,CACV,CAAA,GAIH8kB,IAAWrB,GACV/oB,EAAA,IAAC6d,GAAAA,CAECzd,MAAO,CACL8D,KAAM,EACN0B,gBAAiBJ,EAAMwqB,wBACvB1qB,OAAQ,CACV,CAAA,GAMHgoB,GAAcpH,EAAYld,EAAE,EAC3BohB,SACGgG,GAAAA,CACC7kB,SAAU,IAAMA,GAAYA,EAAS2a,EAAYld,EAAE,EACnDoE,QAAStF,EACT1H,MAAO,CAAE,GAAIgqB,IAAW,CAAEiG,gBAAiB,CAAE,EAAIC,WAAY,CAAE,CAAA,GAGjEtwB,EAAA,IAAC2pB,GAAAA,CAAKlmB,MAAO,EAAA,GAGfzD,EAAA,IAACupB,GAAAA,CAECnc,QAAO,GACPmjB,YAAa,CACX1lB,UAAWtG,GAAYuD,EAAU,KAAO,eAC1C,EACAe,QAASilB,IAAiB,SAC1BzrB,SAAUpM,GAAAA,CACSozB,EAAA,CAAE1e,KAAM,SAAU3B,GAAIkd,EAAYld,GAAIwgB,MAAOvzB,CAAAA,CAAE,CAClE,EACAqZ,OAAQ,IAAMA,EAAOtG,EAAI,QAAA,EACzBzE,SAAAA,EACAnE,MAAO,CAAE,GAAIgqB,IAAW,CAAEiG,gBAAiB,CAAE,CAAG,EAChDpoB,MACE2lB,GACE5tB,EAAA,IAACmB,GAAAA,CACCf,MAAO,CAAEqD,MAAO,GAAIwF,OAAQ,GAAI5I,MAAO,SAAU,CAAA,KAM1D,CAAC+pB,IACApqB,EAAA,IAACkrB,GAAAA,CAECx0B,KAAK,OACL+M,MAAO,IACPyB,UAAU,OACVkI,QAAS0gB,IAAiB,OAC1B7lB,MAAOgb,GACPhG,WAAAA,GACA9P,UAAW8V,GACTA,EAAOuN,GAAW9J,GAASzD,GAAO8K,CAAc,EAAA,GAElD/Q,SAAUtmB,GAAQ,CAAC+0B,GAAanc,EAAOtG,EAAItS,CAAAA,EAC3C2W,SAAUpF,GAAAA,CACRoF,EAAS,OAAQpF,CAAAA,CACnB,EAEC,SAAA,CAAC,CACAqF,OAAAA,EACAL,UAAAA,GACAI,SAAAA,GACA/B,OAAAA,GACA8gB,kBAAAA,GACAC,WAAAA,YAECoE,GAAAA,CACCxoB,MAAOgb,IAAQ,GACf8K,WAAAA,EACAtgB,WAAY,CAAEH,OAAAA,EAAQL,UAAAA,GAAW7M,MAAOisB,EAAW,EACnDD,kBAAAA,GACAI,cAAe,GACfnf,SAAUA,GACVhL,SAAUiJ,EAAAA,KAMjB,CAAC8e,IAAWrB,GACX/oB,EAAA,IAACkrB,GAAAA,CAECx0B,KAAK,UACL+M,MAAM,OACNyB,UAAU,OACV+C,MAAO4Z,GACP1U,UAAWujB,GAAAA,CACT,MAAMC,GAAOD,GAAU3B,GAAgBvD,CAAAA,EAAUkF,CAAO,EACxD,OAAIC,GACKA,GAAKj6B,KAEP,EACT,EACAumB,WAAAA,GACA7P,QAAS0gB,IAAiB,UAC1B9Q,SAAUtmB,GAAQ,CAAC+0B,GAAanc,EAAOtG,EAAItS,CAAAA,EAC3C2W,SAAU,MAAMpF,GAAAA,CAEVA,GACFoF,EAAS,UAAWpF,CAAAA,CAExB,EAEC,SAAA,CAAC,CACAqF,OAAAA,EACAL,UAAAA,GACAI,SAAAA,GACA/B,OAAAA,GACA8gB,kBAAAA,GACAC,WAAAA,YAECuE,GAAAA,CACCC,sBAAuB,GACvB5oB,MAAO4Z,GACP2J,SAAAA,EACAY,kBAAAA,GACAI,cAAe,GACf3jB,QAAS,GACT4E,WAAY,CAAEH,OAAAA,EAAQL,UAAAA,GAAW7M,MAAOisB,EAAW,EACnDhf,SAAUA,GACVhL,SAAUiJ,GACVohB,iBAAkB1gB,MAAAA,WAMvBqf,GAAAA,CAECriB,GAAAA,EACA+gB,QAAAA,GACAlI,UAAAA,GACAhZ,QAASilB,IAAiB,QAC1BxC,UAAWuC,GAAmBA,EAAgBlG,IAAI,OAAA,EAClD4D,OAAAA,EACAC,SAAAA,EACAvO,WAAAA,GACAiJ,YAAAA,EACA2D,MAAAA,GACAC,aAAAA,GACAqF,cAAAA,GACA1D,UAAAA,EACAnc,OAAAA,EACAjC,SAAAA,EACAqe,cAAAA,EACAC,eAAAA,EACAC,4BAAAA,EACAC,qBAAAA,CAAAA,CAEJ,EAECJ,QAEE9B,GAAAA,CAAKjzB,KAAK,QAAQ+M,MAAM,MAAA,SAExByJ,GAAAA,CACCzJ,MAAM,OACN/M,KAAK,QACLwO,UAAU,OACVkI,QAAS0gB,IAAiB,QAC1BjlB,QAASilB,IAAiB,QAC1B7lB,MAAOQ,IAAS,GAChBwU,WAAAA,GACAD,SAAUtmB,GAAQ,CAAC+0B,GAAanc,EAAOtG,EAAItS,CAAAA,EAC3C+W,WAAY,CACVxF,MAAOQ,IAAS,GAChB4E,SAAUA,EAASyjB,KAAK,KAAM,OAAA,CAChC,CAAA,GAIHrF,QAEE9B,GAAAA,CAAKlmB,MAAM,OAAOrD,MAAO,CAAE2D,WAAY,YAAa,EAAGqJ,QAAS,GAC9D,SAAA,IACCpN,EAAA,IAAC6D,EAAAA,CACCzD,MAAO,CACLC,MACEoI,KAAU,SACNjD,EAAMklB,UACNjiB,KAAU,MACRjD,EAAMmlB,YACNpmB,EACEiB,EAAMurB,cACNvrB,EAAMwrB,aAChBprB,gBACE6C,KAAU,SACNjD,EAAMyrB,gBACNxoB,KAAU,MACRjD,EAAM0rB,kBACN3sB,EACEiB,EAAM2rB,oBACN3rB,EAAM4rB,mBAChBrgB,OAAQ,QACR9L,QAAS,UACTI,aAAc,CAChB,WAECgsB,GAAW5oB,EAAAA,CAAAA,GAIhB6mB,EAAAA,SACD3F,GAAAA,CAECjzB,KAAK,WACL+M,MAAM,OACNoF,QAASilB,IAAiB,WAC1B1tB,MAAO,CAAE6E,QAAS,CAAE,EACpB4lB,MAAK,GAEL,eAACC,GAAAA,CACCwG,KAAI,GACJlxB,MAAO,CACL2a,UAAW,aACX1V,aAAc,EACdC,OAAQ,wBACR,SAAU,CACRA,OAAQ,aAAeE,EAAM+rB,kBAC/B,CACF,EACApT,SAAUmP,GAAcpH,EAAYld,EAAE,EACtCsG,OAAQ,IAAMA,EAAOtG,EAAI,UAAA,EACzB3G,SAAU,IAAM6rB,EAAcllB,CAAAA,EAE9B,gBAACnF,EAAAA,CACCzD,MAAO,CACL0D,cAAe,MACfC,WAAY,SACZgX,UAAW,UACX1V,aAAc,EACdnB,KAAM,EACNe,QAAS,CACX,YAECqqB,UACE9iB,GAAAA,CACCpM,MAAO,CACLC,MAAO,UACPoD,MAAO,GACPwF,OAAQ,GACR4G,WAAY,iBACZC,UAAW0X,EAAW,aAAe,iBACvC,CAAA,SAGHzX,EAAAA,CAAK3P,MAAO,CAAE+vB,UAAW,SAAUhrB,WAAY,MAAO,EAAG,SAAA,OAAA,UAM9DsqB,IAAoBC,IAAejE,QACpCve,GAAAA,CAGCxW,KAAK,WACL+M,MAAM,OACN2J,QAAS0gB,IAAiB,WAC1BjlB,QAASilB,IAAiB,WAC1B9Q,SAAUtmB,GAAQ,CAAC+0B,GAAanc,EAAOtG,EAAItS,CAAAA,EAC3CuR,MACEqnB,GACI,QACAI,GACE,aACAD,GACE,WACA,GAEVxS,WAAAA,GACA7c,MAAO,CACL+vB,UAAW,SACX9vB,MAAOmF,EAAMC,gBACbW,WAAY,GACd,EACAqH,WAAY,CACV+jB,SAAU,GACVpxB,MAAO,CAAE+vB,UAAW,QAAS,CAC/B,CAAA,GAGFnwB,EAAA,IAACkrB,GAAAA,CAECx0B,KAAK,WACL+M,MAAM,OACNyB,UAAU,OACV+C,MAAO2W,GACPzR,UAAWlF,GACTA,EACI8d,GACE0L,GAAkBvgB,CAAAA,EAAgBjJ,CAAAA,EAClC,MAAA,EAEFie,EAAYld,GACV,aACA,GAERoE,QAAS0gB,IAAiB,WAC1B9Q,SAAUtmB,GAAQ4Y,EAAOtG,EAAItS,CAAAA,EAC7BumB,WACG2B,GAOG3B,GANA,CAEEkT,UAAW,SACX/pB,WAAY,IACZ/F,MAAOmF,EAAMksB,sBAAAA,EAIrBrkB,SAAU,MAAMpF,GAAAA,CACVA,IAAU,QACZgmB,EAAQ/H,EAAYld,EAAE,EAEtBqE,EAAS,WAAYpF,CAAAA,CAEzB,EAEC,SAAA,CAAC,CACAqF,OAAAA,EACAL,UAAAA,GACAI,SAAAA,GACA/B,OAAAA,GACA8gB,kBAAAA,GACAC,WAAAA,YAECsF,GAAAA,CACCzgB,eAAAA,EACAjJ,MAAO2W,GACP/V,QAAS,GACT2jB,cAAe,GACfoF,gBAAiB,CAACxH,IAAW,CAACkF,GAC9BlD,kBAAAA,GACA3e,WAAY,CAAEH,OAAAA,EAAQL,UAAAA,GAAW7M,MAAOisB,EAAW,EACnDhf,SAAUA,GACVhL,SAAUiJ,GACVohB,iBAAkB1gB,MAAAA,WAMzBkB,GAAAA,CAECvC,KAAK,QACLlH,MAAO,GACP/M,KAAK,QACL0W,QAAS0gB,IAAiB,QAC1BjlB,QAASilB,IAAiB,QAC1B7lB,MAAOse,IAAU,IAAMC,KAAW,GAAK,OAASD,EAChDtJ,WAAAA,GACA/X,UAAU,QACVmgB,MAAOkB,EACPvJ,SAAUtmB,GAAQ,CAAC+0B,GAAanc,EAAOtG,EAAItS,CAAAA,EAC3C0J,MAAO,CACL,GAAIkvB,IAAY,CAAEa,UAAW,QAAS,EACtC,GAAGzqB,EAAO2W,KACV,GAAGuT,EACL,EACAniB,WAAY,CACVxF,MAAOse,IAAU,IAAMC,KAAW,GAAK,OAASD,EAChDlZ,SAAUA,EAASyjB,KAAK,KAAM,OAAA,CAChC,EACApU,cAAe,CACbmV,kBAAmB,CAAC,CAACvE,GAAcpH,EAAYld,EAAE,CAAE,CACrD,CAAA,SAGDkE,GAAAA,CAECvC,KAAK,QACLlH,MAAO,GACP/M,KAAK,SACL0W,QAAS0gB,IAAiB,SAC1BjlB,QAASilB,IAAiB,SAC1B7lB,MAAOue,GACPvJ,WAAAA,GACA/X,UAAU,QACVmgB,MAAOmB,GACPxJ,SAAUtmB,GAAQ,CAAC+0B,GAAanc,EAAOtG,EAAItS,CAAAA,EAC3C0J,MAAO,CACL,GAAIkvB,IAAY,CAAEa,UAAW,QAAS,EACtC,GAAGzqB,EAAO2W,KACV,GAAGuT,EACL,EACAniB,WAAY,CACVxF,MAAOue,GACPnZ,SAAUA,EAASyjB,KAAK,KAAM,QAAA,CAChC,EACApU,cAAe,CACbmV,kBAAmB,CAAC,CAACvE,GAAcpH,EAAYld,EAAE,CAAE,CACrD,CAAA,GAGDigB,SACEU,GAAAA,CAECjzB,KAAK,UACLuR,MACE6nB,IAAkB,MAAQ1F,GACtB,GACA5M,GAAkBsS,EAAAA,EAExB7S,WAAY,CACV5c,MAAOyvB,GAAiB,EAAItqB,EAAMklB,UAAYllB,EAAMilB,eACtD,EACArqB,MAAO,CAAE,GAAGsF,EAAO2W,KAAM,GAAGuT,EAAY,EACxCnsB,MAAO,GACPyB,UAAU,QACVwX,cAAa,EAAA,GAIhBwM,SACEgB,GAAAA,CAEClhB,GAAAA,EACAH,QAASilB,IAAiB,UAC1BvpB,SAAAA,EACAknB,UAAAA,EACAtB,OACEsB,EACIhjB,GACAimB,GACE,aACAU,GACE,UACA,KAEVhF,QAAAA,GACA9a,OAAAA,EACAjC,SAAAA,CAAAA,SAIHsc,GAAAA,CAAKlmB,MAAO,CAAA,KAGnB,CAAA,EAEA,SAASquB,GAAiB,CACxB97B,MAAAA,EACA+7B,UAAAA,EACAC,WAAAA,EACAC,sBAAAA,EACA7xB,MAAAA,EACA8xB,uBAAAA,GACD,CACC,OAAQl8B,EAAM2U,KAAI,CAChB,IAAK,wBACC3U,GAAAA,EAAMm8B,UAAY,EACpB,cACGtuB,EAAAA,CACCzD,MAAO,CACL0D,cAAe,MACfC,WAAY,SACZkB,QAAS,QACT,GAAG7E,CACL,EACA8L,cAAY,qCAEX6D,EAAAA,WAAK,eACS,UACZA,EAAAA,CAAK3P,MAAO,CAAEgG,WAAY,GAAI,EAC5BoX,SAAAA,GACCuU,EAAY/7B,EAAMo8B,WAAa,CAACp8B,EAAMo8B,UAAU,CAAA,YAIrDvuB,EAAAA,CAAKzD,MAAO,CAAE8D,KAAM,CAAE,CAAA,SACtBwG,EAAAA,CACCC,KAAK,SACLvK,MAAO,CAAE6G,WAAY,EAAG,EACxBZ,QAAS4rB,EACT/lB,cAAY,0BACZiS,SAAU,CAAC+T,EACZ,SAAA,YAAA,SAGAxnB,EAAAA,CACCC,KAAK,UACLvK,MAAO,CAAE6G,WAAY,GAAIhC,QAAS,UAAW,EAC7CoB,QAAS2rB,EACT9lB,cAAY,mBACb,SAAA,WAAA,MAMP,MACF,QACS,OAAA,IACX,CACF,CAEA,SAASmmB,GACPC,EACAC,EACAC,EAAQ,CAED,MAAA,CACL,CACExpB,GAAI,OACJia,KAAMuP,GAAYxL,GAAAA,EAClB+E,QAASuG,GAAoB,KAC7BrnB,SAAUsnB,GAAqB,KAC/BnD,QAAS,GACTxR,OAAQ,IACV,CAAA,CAEJ,CAEA,SAAS0P,GAActkB,EAAE,CAChBA,OAAAA,EAAGypB,QAAQ,MAAA,IAAY,EAChC,CAEO,SAASrM,GAAYpd,EAAE,CACrBA,OAAAA,EAAGypB,QAAQ,UAAA,IAAgB,EACpC,CAEA,SAASC,GAAe,CACtBxL,aAAAA,EACAsE,SAAAA,EACAta,eAAAA,EACAqa,OAAAA,EACAoH,mBAAAA,EACA7E,aAAAA,EACA/E,YAAAA,EACAC,aAAAA,EACAC,YAAAA,EACAC,YAAAA,EACA6E,WAAAA,EACAC,aAAAA,EACAxlB,QAAAA,EACAylB,QAAAA,EACA3e,OAAAA,EACA/D,SAAAA,EACAD,OAAAA,EACAwZ,MAAAA,EACAkN,WAAAA,EACAC,sBAAAA,EACAtG,eAAAA,EACAD,cAAAA,EACAE,4BAAAA,EACAC,qBAAAA,EACAvN,QAAAA,CAAAA,EACD,CACOtoB,MAAAA,EAAQkxB,EAAa,CAAA,EAAGlxB,MACxB+7B,EAAY7K,EAAa,CAAE,EAACtJ,OAAS,EAErCgV,EAAoB1L,EAAatd,OACrCipB,GAAKA,EAAExL,YAAcH,EAAa,CAAA,EAAGle,EAAE,EAEnC8pB,EAAyBF,EAAkBhpB,OAAOipB,GAAKA,EAAEjV,SAAW,CAAA,EAE1E,cACG/Z,EAAAA,CACCzD,MAAO,CACL6V,aAAc,aAAezQ,EAAMK,iBACnC6V,cAAe,EACf9V,gBAAiBJ,EAAMuH,eACzB,EACAb,cAAY,kBACZe,UAAWhX,GAAAA,CACLA,EAAE0E,MAAQ,UACZ6N,GAEJ,YAEC0e,EAAa/iB,IAAI+hB,SACfsH,GAAAA,CACCuF,MAAK,GAELjrB,QAAS6qB,IAAuBzM,EAAYld,GAC5Ckd,YAAAA,EACAuH,gBAAiBvH,EAAYmJ,UAAYuD,EAAoB,KAC7D7J,YAAAA,EACAC,aAAAA,EACAC,YAAAA,EACAC,YAAAA,EACA4E,aAAc6E,IAAuBzM,EAAYld,IAAM8kB,EACvD3H,kBAAmB4L,EACnBvG,SAAAA,EACAta,eAAAA,EACAqa,OAAAA,EACAwC,WAAAA,EACAC,aAAAA,EACAxG,SAAU,GACVlY,OAAAA,EACAhE,OAAAA,EACA2iB,QAAAA,EACA1iB,SAAAA,EACAuZ,MAAAA,EACA6G,eAAAA,EACAD,cAAAA,EACAtrB,MAAO,CAAEua,UAAW,EAAG,EACvBiR,4BAAAA,EACAC,qBAAAA,EACAvN,QAAAA,CAAAA,EA1BK4H,EAAYld,EAAE,CAAA,SA6BtBnF,EAAAA,CACCzD,MAAO,CACL0D,cAAe,MACfC,WAAY,SACZC,eAAgB,WAChB2W,UAAW,EACXxT,YAAa,EACf,kBAECuD,EAAAA,CACCtK,MAAO,CAAE+G,YAAa,GAAIlC,QAAS,UAAW,EAC9CoB,QAAS,IAAMmC,EAAAA,EACf0D,cAAY,gBACb,SAAA,QAAA,GAGAlW,QACE87B,GAAAA,CACC97B,MAAAA,EACA+7B,UAAAA,EACAC,WAAY,IAAMA,EAAW9K,EAAa,CAAA,EAAGle,EAAE,EAC/CipB,sBAAuB,IACrBA,EAAsB/K,EAAa,CAAA,EAAGle,EAAE,EAE1CkpB,uBAAwBY,EAAuB3vB,OAAS,CAAA,GAG1DnD,EAAA,IAAC0K,EAAAA,CACCC,KAAK,UACLvK,MAAO,CAAE6E,QAAS,UAAW,EAC7BoB,QAASye,EACT5Y,cAAY,aACb,SAAA,KAAA,QAOX,CAEA,SAAS8mB,GAAsB,CAC7BC,eAAAA,EACAnT,SAAAA,EACAiO,WAAAA,EAAa,aACbmF,aAAAA,EACAC,YAAAA,EACAC,SAAAA,EACA,GAAG/6B,GACJ,CACC,MAAMkL,EAAegT,EAAAA,YACf8c,EAAeC,GAAYj7B,EAAMk7B,QAAQ,EACzC,CAACpK,EAAaqK,CAAe,EAAGhxB,WAAS,CAAA,EAEtCixB,SAAAA,EAAgBC,EAAQC,EAAK,CACpC,MAAMlwB,EAAQiwB,EAAS,GAAKC,EAAQ,GAAKD,EAASC,EAEnCH,EAAC/vB,GAAQ,CAAIA,CAC9B,CAEMmoB,MAAAA,EAA8BhqB,cAClCigB,GAAAA,CACExpB,EAAMu7B,sBAAqB,EAC3Bv7B,EAAMuzB,4BAA4B/J,CAAAA,CAAAA,EAEpC,CAACxpB,EAAMu7B,sBAAuBv7B,EAAMuzB,2BAAAA,CAA4B,EAG5DC,EAAuBjqB,cAC3B+qB,GAAAA,CACEt0B,EAAMu7B,sBAAqB,EAC3Bv7B,EAAMwzB,qBAAqBc,CAAAA,CAAAA,EAE7B,CAACt0B,EAAMu7B,sBAAuBv7B,EAAMwzB,oBAAAA,CAAqB,EAG3DhS,EAAAA,UAAU,IAAA,CACJ,CAACwZ,GAAgBh7B,EAAMk7B,UACZjkB,EAAAA,OAAO,OAAQ,MAAA,CAC9B,EACC,CAAC+jB,EAAch7B,EAAMk7B,SAAUL,CAAAA,CAAa,EAE/C,MAAMW,EAAY,CAAC,CAAExlB,KAAAA,EAAMxG,MAAAA,EAAOrB,SAAAA,EAAUsB,QAAAA,KAAS,CACnD,KAAM,CACJof,aAAAA,EACA4M,cAAAA,EACAtI,SAAAA,EACAta,eAAAA,EACAqa,OAAAA,EACArC,YAAAA,EACAH,YAAAA,EACAC,aAAAA,EACA+K,aAAAA,EACAC,SAAAA,EACAhG,aAAAA,EACA+E,MAAAA,EACAkB,UAAAA,EACAC,WAAAA,CACE77B,EAAAA,EAEE8uB,EAAQ9Y,EACR9J,EAAWuvB,EAAcnM,IAAIR,EAAMne,EAAE,EAErC0qB,EAASr7B,EAAM87B,eAAeC,IAAIjN,EAAME,SAAS,EACjDgN,EAAiBX,GAAUA,EAAO9V,OAAS,EAC3C4J,EAAW0M,GAAcA,GAAYR,GAAUvM,GAAOne,EAAE,EAKxDhT,EAAQwxB,GACTkM,GAAUA,EAAO19B,OAAUmxB,EAAMnxB,MAGhCs+B,GACH,CAAC9M,GAAYP,GAAYC,EAAcrf,CAAAA,IACxC7R,GACAA,EAAM2U,OAAS,wBAEXmoB,EAAyB5L,EAAatd,OAC1CipB,GACEA,EAAExL,aAAeF,EAAMkI,UAAYlI,EAAMne,GAAKme,EAAME,YACpDwL,EAAEjV,SAAW,CAAA,EAGjB,cACE5N,EAAAA,SAAA,WACGskB,SACE3rB,GAAAA,CACCnC,SAAS,eACT/C,MAAO,IACP8wB,SAAU/tB,EACVguB,YAAa,GACbp0B,MAAO,CAAE0P,UAAW,sBAAuB,EAE3C,eAACgiB,GAAAA,CACC97B,MAAAA,EACA+7B,UAAWsC,EACXrC,WAAY,IAAM35B,EAAM25B,WAAW7K,EAAMne,EAAE,EAC3CipB,sBAAuB,IACrB55B,EAAM45B,sBAAsB9K,EAAMne,EAAE,EAEtCkpB,uBAAwBY,EAAuB3vB,OAAS,CAAA,WAI7DqqB,GAAAA,CACC1lB,QAAAA,EACAoe,YAAaiB,EACb4B,YAAAA,EACAC,aAAAA,EACAC,YAAa8K,EACb7K,YAAAA,EACA3kB,SAAAA,EACAmpB,YAAa,GACbC,MAAOoF,IAAQ5L,EAAMne,EAAE,EACvBwe,SAAU0M,IAAa/M,EAAMne,EAAE,EAC/B4kB,QAASqG,IAAY9M,EAAMne,EAAE,EAC7Bmd,kBAAmBkO,EACnB/V,QAAS0V,IAAW7M,EAAMne,EAAE,GAAGsV,QAC/BwP,aAAchmB,GAAWmrB,EAAenF,aACxCtC,SAAAA,EACAta,eAAAA,EACAqa,OAAAA,EACAsC,gBACE6F,GAAQ7J,QAAU1C,EAAM0C,UAAY1B,IAAI,CAAC,OAAA,CAAQ,EAAI,IAAIA,IAE3D4F,WAAAA,EACAC,aAAAA,EACA1e,OAAQ2jB,EAAe3jB,OACvBhE,OAAQjT,EAAMiT,OACdC,SAAUlT,EAAMkT,SAChB0iB,QAAS51B,EAAM41B,QACftC,eAAgBtzB,EAAMszB,eACtBD,cAAerzB,EAAMqzB,cACrBwC,cAAe71B,EAAM61B,cACrBtC,4BAAAA,EACAC,qBAAAA,EACAtJ,UAAWlqB,EAAMkqB,SAAAA,OAMzB,cACG1e,EAAAA,CACCI,SAAUV,EACVnD,MAAO,CACL8D,KAAM,EACNkB,OAAQ,UACR,GAAG/M,EAAM+H,KACX,mBAECyD,EAAAA,iBACEglB,GAAAA,CACCC,YAAazwB,EAAMy7B,cAAczwB,KAAO,EACxC0lB,YAAa1wB,EAAM0wB,YACnBC,aAAc3wB,EAAM2wB,aACpBC,YAAa5wB,EAAM07B,aACnB7K,YAAa7wB,EAAM6wB,YACnBC,YAAAA,EACAC,OAAQ/wB,EAAM+wB,OACdV,QAASrwB,EAAMqwB,QACfD,MAAOpwB,EAAMo8B,SAAAA,GAGdp8B,EAAMk7B,UACLvzB,EAAA,IAAC6D,EAAAA,CACE,GAAGqvB,EAAawB,kBAAkB,CACjCznB,UAAWhX,GAAKoC,EAAMs8B,gBAAgB1+B,CAAAA,CAAAA,CACtC,EAEF,eAACy8B,GAAAA,CACCxL,aAAc7uB,EAAMu8B,gBACpBjC,mBAAoBO,EAAa2B,UACjC/G,aAAcoF,EAAapF,aAC3BtC,SAAUnzB,EAAMmzB,SAChBta,eAAgB7Y,EAAM6Y,eACtBqa,OAAQlzB,EAAMkzB,QAAU,CAAE,EAC1BxC,YAAa1wB,EAAM0wB,YACnBC,aAAc3wB,EAAM2wB,aACpBC,YAAa5wB,EAAM07B,aACnB7K,YAAa7wB,EAAM6wB,YACnB6E,WAAAA,EACAC,aAAc31B,EAAM21B,aACpBxlB,QAASnQ,EAAMu7B,sBACf9O,MAAOzsB,EAAMy8B,eACb9C,WAAY35B,EAAM25B,WAClB/D,QAAS51B,EAAM41B,QACf3e,OAAQ4jB,EAAa5jB,OACrBhE,OAAQjT,EAAMiT,OACdC,SAAUlT,EAAMkT,SAChBogB,eAAgBtzB,EAAMszB,eACtBD,cAAerzB,EAAMqzB,cACrBE,4BAAAA,EACAC,qBAAAA,EACAoG,sBAAuB55B,EAAM45B,sBAC7B3T,QACEjmB,EAAM6uB,cAAc/jB,OAAS,EACzB9K,EAAM27B,WAAW37B,EAAM6uB,aAAa,CAAA,GAAIle,EAAAA,GAAKsV,QAC7C,CAAA,eASbza,EAAAA,CACCzD,MAAO,CAAE8D,KAAM,EAAGmI,SAAU,QAAS,EACrCH,cAAY,oCAEX6oB,GAAAA,CACCC,UAAW/B,EACXt5B,IAAKmmB,EACLnT,MAAOtU,EAAM6uB,aACb+N,WAAYpB,EACZV,YAAAA,EACA+B,SAAU78B,EAAM88B,qBAChBC,WAAYpsB,GAAM3Q,EAAMy7B,cAAcnM,IAAI3e,CAAAA,EAC1CiE,UAAWhX,GAAKoC,EAAMg9B,aAAap/B,CAAAA,EACnCm9B,SAAAA,EACAK,gBAAAA,CAAAA,GAGDp7B,EAAMk7B,UACLvzB,EAAA,IAACiM,MAAAA,CAEC7L,MAAO,CACLoG,SAAU,WACVC,IAAK,IACLC,KAAM,EACN8J,MAAO,EACPvH,OAAQ,GACRrD,gBAAiBJ,EAAMklB,UACvBrX,UAAW,4BACb,GATI,QAAA,OAehB,CAEO,MAAMiiB,GAAmBn+B,EAAAA,WAAW,CAACkB,EAAOsB,IAAAA,CACjD,KAAM,CAACi7B,EAAiBW,CAAmB,EAAG/yB,WAAS,IAAA,EACjD,CAACgzB,EAAcC,CAAgB,EAAGjzB,WAAS,EAAA,EAC3CkzB,EAAiBnO,KACjBoO,EAAqBr8B,SAAO,IAAA,EAE5BwmB,EAAWxmB,SAAO,IAAA,EAClBs8B,EAAYC,GAAc/V,EAAUnmB,CAAAA,EAEpCutB,EAAehvB,EAAAA,QAAQ,IAAA,CACvBqG,IAAAA,EACAm3B,GAAAA,EAAerhC,MAAMi0B,cAAgB,KAAM,CACvCzgB,MAAAA,EAAQxP,EAAM6uB,aAAa7P,UAC/Bwb,GAAKA,EAAE7pB,KAAO0sB,EAAerhC,MAAMi0B,YAAY,EAEjD/pB,EAASlG,EAAM6uB,aAAatd,OAAO,CAACipB,EAAGxuB,IAAAA,CACrC,GAAIwuB,EAAExL,UAAW,CACf,GAAIhjB,GAAOwD,EACF6tB,OAAAA,EAAelO,SAASqL,EAAExL,SAAS,EAC5C,GAAWsO,EAAmBn0B,QAC5B,OAAOm0B,EAAmBn0B,QAAQgmB,SAASqL,EAAExL,SAAS,CAE1D,CACO,MAAA,EAAA,CACT,CAAA,MAGEsO,EAAmBn0B,SACnBm0B,EAAmBn0B,QAAQnN,MAAMi0B,cAAgB,OAEjDxI,EAASte,QAAQs0B,SACRt0B,EAAAA,QAAQu0B,gBAAgB,EAAA,GAEnCJ,EAAmBn0B,QAAUk0B,EAE7Bn3B,EAASlG,EAAM6uB,aAAatd,OAAOipB,GAC7BA,EAAExL,UACGqO,EAAelO,SAASqL,EAAExL,SAAS,EAErC,EACT,EAGFsO,OAAAA,EAAmBn0B,QAAUk0B,EACtBn3B,CAAAA,EACN,CAAClG,EAAM6uB,aAAcwO,CAAAA,CAAe,EACjCvB,EAAiBj8B,EAAAA,QAAQ,IACtB,IAAI89B,IAAI9O,EAAa/iB,IAAIgjB,GAAS,CAACA,EAAMne,GAAIme,CAAM,CAAA,CAAA,EACzD,CAACD,CAAAA,CAAa,EAEjBrN,EAAAA,UAAU,IAAA,CAIJiG,EAASte,QAAQy0B,eACnBnW,EAASte,QAAQ00B,WACR10B,EAAAA,QAAQu0B,gBAAgB,EAAA,EACnC,EACC,CAACJ,EAAmBn0B,OAAAA,CAAQ,EAEzB0xB,MAAAA,EAAeiD,GAAkBvB,EAAiBwB,CAAAA,EAClDnD,EAAiBkD,GAAkBjP,EAAckP,CAAAA,EACjDC,EAAY/8B,SAAO,EAAA,EACnBg9B,EAAch9B,EAAAA,OAAO,CAAEs7B,gBAAAA,EAAiB1B,aAAAA,EAAcD,eAAAA,CAAAA,CAAe,EACrEsD,EAAcj9B,SAAO,EAAA,EACrBk9B,EAAgBl9B,SAAO,EAAA,EACvB,CAACm9B,EAAGC,CAAc,EAAGl0B,EAAAA,SAAS,CAAC,CAAA,EAC/BsxB,EAAgB6C,KAEtBxhB,EAAAA,gBAAgB,IAAA,CACdmhB,EAAY90B,QAAU,CACpBozB,gBAAAA,EACA1B,aAAAA,EACAD,eAAAA,EACA/L,aAAc7uB,EAAM6uB,YAAAA,CACtB,CACF,EAGIsO,IAAiBn9B,EAAMk7B,WACrB,CAACiC,GAAgBn9B,EAAMk7B,UACzBgC,EACElD,GACEh6B,EAAMi6B,iBACNj6B,EAAMk6B,iBAAiB,CAAA,EAI7BkD,EAAgBp9B,EAAMk7B,QAAQ,GAGhC1Z,EAAAA,UAAU,IAAA,CACR,GAAIwc,EAAU70B,QAAS,CACrB,GAAIozB,EAAgB,CAAA,EAAG7I,SAAW,KAChC1zB,EAAM4pB,gBAAgB,CACpBtX,KAAM,QACNuX,QAAS,6BAAA,CACX,EACa5S,EAAAA,OAAO,OAAQ,SAAA,MACvB,CACC4X,MAAAA,EAAeoP,EAAY90B,QAAQozB,gBACnCpC,EAAWtL,EAAa/jB,OAAS,EAAI+jB,EAAa,CAAA,EAAGjE,KAAO,KAClEsS,EACElD,GACEh6B,EAAMi6B,iBACNj6B,EAAMk6B,kBACNC,CAAAA,CAAAA,EAGSljB,EAAAA,OAAO,OAAQ,MAAA,EAC5BjX,EAAMysB,MAAMoC,CAAAA,CACd,CACAmP,EAAU70B,QAAU,EACtB,CAAA,CACF,EAEAqY,EAAAA,UAAU,IAAA,CACJ0c,EAAY/0B,SAAWg1B,EAAch1B,UACvCg1B,EAAch1B,QAAQnJ,CAAAA,EACtBm+B,EAAch1B,QAAU,MAG1B+0B,EAAY/0B,QAAU,EAAA,EACrB,CAACozB,EAAiBv8B,EAAM6uB,YAAAA,CAAa,EAExC,SAASkP,EAAU/nB,EAAI,CACrB,IAAIuoB,EAAS,CACX,SACA,OACA,UACA,QACA,QACA,WACA,QACA,SACA,SAAA,EAGFA,OAAAA,EAASvoB,EAAK+Y,SACV,CAAC,SAAU,QAAS,QAAS,WAAY,QAAS,QAClDwP,EAAAA,EAAOhtB,OACLitB,IACGx+B,EAAM0wB,aAAe8N,IAAM,aAC3Bx+B,EAAM2wB,cAAgB6N,IAAM,WAAS,EAG1CzQ,GAAY/X,EAAKrF,EAAE,IACZ4tB,EAAA,CAAC,SAAU,SAAA,GAElBtJ,GAAcjf,EAAKrF,EAAE,IAGd4tB,EAAAA,EAAO3M,MAAM,CAAA,GAGjB2M,CACT,CAEA,SAASE,EAAUx1B,EAAI,CACjBi1B,EAAY/0B,QACdg1B,EAAch1B,QAAUF,EAExBA,EAAKjJ,CAAAA,CAET,CAEA,SAASs8B,EAAgB1+B,EAAC,CACpBA,GAAAA,EAAE0E,MAAQ,SACZ,GAAI1E,EAAE8gC,QACJ9gC,EAAEsW,gBAAe,EACjBuoB,YACS,CAAC7+B,EAAEuhB,SAAU,CACbwf,IAAAA,EAAT,SAA4B3iC,EAAK,CAC/B,KAAM,CAAEugC,gBAAAA,GAAoBvgC,EAAMmN,QAC3BozB,OAAAA,EAAgBA,EAAgBzxB,OAAS,CAAE,CAAA,EAQhD+vB,EAAa2B,YAAcmC,EAAmBV,CAAAA,EAAattB,IAC7D/S,EAAEsW,gBAAe,EAGnBuqB,EAAU,IAAA,CACFG,MAAAA,EAAkBD,EAAmBV,CAAAA,EACrCY,EACJD,EAAgB5P,WAAa4P,EAAgB5H,UAG7CiH,EAAY90B,QAAQozB,gBAAgB,CAAE,EAAC5+B,OACvCk9B,EAAa2B,YAAcoC,EAAgBjuB,GAG3CgpB,EAAWiF,EAAgBjuB,EAAE,EAE7BkqB,EAAa2B,YAAcoC,EAAgBjuB,KAC1C,CAACkuB,GAAW,CAACD,EAAgBjhC,QAE9B8+B,GACF,CACF,CACF,EAEJ,CAEA,SAASO,EAAap/B,EAAC,CACrB,GAAIA,EAAE0E,MAAQ,SAAW,CAAC1E,EAAEuhB,SAAU,CACpC,KAAM,CAAEqd,UAAW7rB,EAAI8kB,aAAAA,CAAAA,EAAiBmF,EAExC6D,EAAU,IAAA,CACF5P,MAAAA,EAAeoP,EAAY90B,QAAQ0lB,aACnC7iB,EAAM6iB,EAAa7P,UAAUwb,GAAKA,EAAE7pB,KAAOA,CAAAA,EAC3C0qB,EAASxM,EAAazT,KAC1Bof,GAAKA,EAAE7pB,KAAOke,EAAa7iB,CAAAA,GAAMgjB,SAAAA,EAIjCJ,GAAYC,EAAc7iB,CAC1BqvB,GAAAA,GACAA,EAAO19B,OACP83B,IAAiB,WAEjB73B,EAAEsW,gBAAe,EACjBylB,EAAWhpB,CAAAA,EACb,CACF,CACF,CACF,CAEM8rB,MAAAA,EAAiBlzB,EAAAA,YAAY,IAAA,CACjCy0B,EAAU70B,QAAU,GAIpBk1B,EAAc,CAAC,CAAA,CAAA,EACd,CAACr+B,EAAMysB,MAAOoO,EAAa5jB,MAAAA,CAAO,EAE/BhE,EAAS1J,EAAAA,YACb,MAAOskB,EAAauH,EAAkB,OAAI,CACxC8I,EAAY/0B,QAAU,GAElB21B,IAAAA,EAAqB1J,EACrB2J,GAAiB,CAAClR,EAAgBuH,GAAAA,CAAgB,CAAA,EAClDvH,EAEAoH,GAAAA,GAAcpH,EAAYld,EAAE,EAAG,CAC7B3Q,EAAMg/B,eACaF,EAAA,MAAM9+B,EAAMg/B,aAAaF,CAAAA,GAG1CG,MAAAA,EAAWhB,EAAY90B,QAAQozB,gBAGrCW,EACEgC,GACEC,GAAkBF,EAAUH,CAAAA,EAAoB1tB,IAAI,CAAA,CAAA,MAIxDpR,EAAMiT,OAAO6rB,CAAAA,CACf,EAEF,CAAC9+B,EAAMiT,MAAAA,CAAO,EAGVC,EAAW3J,cAAYoH,GAAAA,CAG3B,GAFkBskB,GAActkB,CAAAA,EAEjB,CACPsuB,MAAAA,EAAWhB,EAAY90B,QAAQozB,gBAErC,GAAI5rB,IAAOsuB,EAAS,CAAE,EAACtuB,GAErB,OAGFusB,EAAmBkC,GAAkBH,EAAUtuB,CAAAA,EAAIS,IAAI,CACzD,CACF,EAAG,CAAE,CAAA,EAECwkB,EAAU/1B,EAAAA,QAAQ,IACf8Q,GAAAA,CACDskB,GAAAA,GAActkB,CAAK,EAAA,CACrB,KAAM,CAAEkqB,aAAAA,GAAiBoD,EAAY90B,QAC/B81B,EAAWhB,EAAY90B,QAAQozB,gBAC/B,CAAEnrB,KAAAA,EAAMiuB,KAAAA,CAAAA,EAASC,GAAiBL,EAAUtuB,CAAAA,EAClDusB,EAAmB9rB,CAAAA,EAKf6tB,EAAS,CAAA,EAAG1Z,SAAW,KACzBsV,EAAa5jB,OAAOgoB,EAAS,CAAE,EAACtuB,GAAI,OAAA,EAEpCkqB,EAAa5jB,OACXooB,EAAK/J,MAAM,CAAE,EAAC3kB,GACdstB,EAAY90B,QAAQ0xB,aAAapF,YAAY,CAEjD,KACK,CACC3G,MAAAA,EAAQmP,EAAY90B,QAAQ0lB,aAAazT,KAAKof,GAAKA,EAAE7pB,KAAOA,CAAAA,EAC5D4uB,EAAQv/B,EAAM41B,QAAQjlB,CAAAA,EAE5B0sB,EAAel7B,SAAS,CAAEmQ,KAAM,aAAc3B,GAAIme,EAAMne,EAAAA,CAAG,EAE3D,KAAM,CAAEiqB,eAAAA,GAAmBqD,EAAY90B,QACnC2lB,EAAMvJ,SAAW,KACnBqV,EAAe3jB,OAAO6X,EAAMne,GAAI,OAAA,EAEhCiqB,EAAe3jB,OAAOsoB,EAAO3E,EAAenF,YAAY,CAE5D,CAAA,EAED,CAACz1B,EAAM41B,QAASyH,EAAel7B,QAAAA,CAAS,EAErCw3B,EAAapwB,cACjBoH,GAAAA,CACMskB,GAAAA,GAActkB,CAAK,EAAA,CACfsuB,MAAAA,EAAWhB,EAAY90B,QAAQozB,gBAC/B,CAAEnrB,KAAAA,EAAMiuB,KAAAA,CAAAA,EAASG,GAAoBP,EAAUtuB,CAAAA,EACrDusB,EAAmB9rB,CAAAA,EACN6F,EAAAA,OACXooB,EAAK/J,MAAM,CAAE,EAAC3kB,GACdstB,EAAY90B,QAAQ0xB,aAAapF,YAAY,CAAA,KAE1C,CACC8J,MAAAA,EAAQv/B,EAAM25B,WAAWhpB,CAAAA,EAC/BiqB,EAAe3jB,OACbsoB,EACAtB,EAAY90B,QAAQyxB,eAAenF,YAAY,CAEnD,CAAA,EAEF,CAACz1B,EAAM25B,UAAAA,CAAW,EAGdC,EAAwBrwB,cAC5B,MAAMoH,GAAAA,CACE,KAAA,CAAEke,aAAAA,EAAc+L,eAAAA,EAAgB2B,gBAAAA,CAAAA,EACpC0B,EAAY90B,QAERs2B,EAAqBxK,GAActkB,CAAAA,EACrC4rB,EACA1N,EACEhB,EAAc4R,EAAmBrkB,KAAKof,GAAKA,EAAE7pB,KAAOA,CAAAA,EAEpD+uB,EAAoB7R,EAAYmJ,UAClCnJ,EACA4R,EAAmBrkB,KAAKof,GAAKA,EAAE7pB,KAAOkd,EAAYmB,SAAS,EAEzD2Q,EAAsBF,EAAmBluB,OAC7CipB,GACEA,EAAExL,aACDnB,EAAYmJ,UAAYnJ,EAAYld,GAAKkd,EAAYmB,UAAQ,EAG5D4Q,EAAoBD,EAAoBpuB,OAAOipB,GAAKA,EAAEjV,SAAW,CAAA,EAEjEsa,EACJH,EAAkBna,OAClBoa,EAAoB/gB,OAAO,CAACkhB,EAAKtF,KAAMsF,EAAMtF,GAAEjV,OAAQ,CAAA,EAEnDwa,GAAuBn1B,KAAKC,MAChCg1B,EAAkBD,EAAkB90B,MAAM,EAExCk1B,IAAAA,EACFH,EAAkBE,GAAuBH,EAAkB90B,OAE7D,MAAMm1B,GAAU,IAAIlmB,MAAM6lB,EAAkB90B,MAAM,EAAE5C,KAClD63B,EAAAA,EAGF,UAAWG,KAAeD,GAAS,CACjC,GAAID,IAAmB,EAAG,MAE1BC,GAAQC,IAAgB,EACxBF,GACF,CAEI/K,GAActkB,CAAK,EACrBkqB,EAAa5jB,OAAO,IAAA,EAEpB2jB,EAAe3jB,OAAO,IAAA,EAGxB,UAAWkpB,KAAoBP,EAC7B,MAAM3sB,EAAO,CACX,GAAG2sB,EAAkBO,CAAiB,EACtC5a,OAAQ0a,GAAQE,CAAiB,CAAA,CACnC,CACF,EAEF,CAAClC,CAAAA,CAAY,EAGf,SAAS1C,GAAAA,CACP2B,EACElD,GACEh6B,EAAMi6B,iBACNj6B,EAAMk6B,iBAAiB,CAAA,EAG3Bl6B,EAAMu7B,sBAAqB,CAC7B,CAEA,MAAM1F,EAAgBtsB,EAAAA,YACpBoH,GAAM0sB,EAAel7B,SAAS,CAAEmQ,KAAM,eAAgB3B,GAAAA,CAAAA,CACtD,EAAA,CAAC0sB,EAAel7B,QAAAA,CAAS,EAG3B,aACGw4B,GAAAA,CACClT,SAAU8V,EACT,GAAGv9B,EACJ6uB,aAAAA,EACAiN,eAAAA,EACAL,cAAAA,EACAI,WAAYwB,EAAelO,SAC3Blc,OAAAA,EACAC,SAAAA,EACA0iB,QAAAA,EACA0G,gBAAAA,EACAU,aAAAA,EACAP,eAAAA,EACA9C,WAAAA,EACAC,sBAAAA,EACA2B,sBAAAA,EACA1F,cAAAA,EACA0G,gBAAAA,EACA3B,eAAAA,EACAC,aAAAA,CAAAA,EAGN,CAAG,EAEHoC,GAAiB19B,YAAc,mBC1rE/B,eAAe6gC,GAASf,EAAI,CACpBgB,MAAAA,EAAgB,MAAM1uB,EAAK,4BAA6B,CAC5D,GAAG0tB,EACHiB,gBAAiB,EAAA,CACnB,EACID,OAAAA,EAAcv1B,OAAS,EAClB,CAAEy1B,QAASF,CAAAA,EAEb,EACT,CAEA,eAAeG,GAAiBnB,EAAMoB,EAAShwB,EAAQ,CAC/CiwB,MAAAA,EAAa,MAAMN,GAASf,CAAAA,EAEhCsB,EAAAA,GAAqBF,EAAQhK,eAAgBiK,GAC7CE,GAAaF,EAAYD,EAAQrvB,IAAI,CAAA,CAEzC,CAEO,SAASyvB,GAAgB,CAC9BpZ,SAAAA,EACAoH,aAAAA,EACAiS,gBAAAA,EACAhE,qBAAAA,EACApJ,QAAAA,EACAP,SAAAA,EACAvgB,SAAAA,EACAiG,eAAAA,EACAqa,OAAAA,EACAyI,SAAAA,EACAD,aAAAA,EACA7K,YAAAA,EACAH,YAAAA,EACAqQ,cAAAA,EACA7F,SAAAA,EACAR,MAAAA,EACAkB,UAAAA,EACAoF,WAAAA,EACAtL,WAAAA,EACAC,aAAAA,EACA/L,gBAAAA,EACAM,UAAAA,EACA4Q,YAAAA,EACA/J,OAAAA,EACAqL,UAAAA,EACA/L,QAAAA,EACA5f,SAAAA,EACAwwB,UAAAA,EACA1F,sBAAAA,EACAlI,cAAAA,GACD,CACC,MAAM6N,EAAqBjgC,EAAAA,SACrB4mB,EAAWC,KAEjBhL,EAAAA,gBAAgB,IAAA,CACdokB,EAAmB/3B,QAAU0lB,CAAAA,EAC5B,CAACA,CAAAA,CAAa,EAEXpC,MAAAA,EAAQljB,cAAY,MAAMgzB,GAAAA,CAC9BA,EAAkB4E,GAAwB5E,CAAAA,EAE1C,MAAM6D,GAAS,CAAE9K,MAAOiH,CAAAA,CAAgB,EACxC0E,GACF,EAAG,CAAE,CAAA,EAEChuB,EAAS1J,cAAY,MAAMskB,GAAAA,CAC/B,MAAM4S,EAAUtB,GAAkB+B,EAAmB/3B,QAAS0kB,CAAAA,EAE1D4S,EAAQpB,KAAK+B,QAAQt2B,OAAS,IACZ,CAAC,CAAC21B,EAAQpB,KAAK+B,QAAQ,CAAE,EAACxW,MAI5C6V,EAAQpB,KAAK+B,QAAQ,GAAGC,WAAaC,KAAKC,MACpCnB,MAAAA,GAASK,EAAQpB,IAAI,EAC3B4B,MAESR,EAAAA,EAAQhK,eAAgBgK,EAAQrvB,IAAI,EAC5BqvB,GAAAA,EAAQpB,KAAMoB,EAAShwB,CAAAA,GAG9C,EAAG,CAAE,CAAA,EAECkpB,EAAapwB,cAAYoH,GAAAA,CAC7B,MAAM8vB,EAAUjB,GAAoB0B,EAAmB/3B,QAASwH,CAAAA,EACvD8vB,OAAAA,EAAAA,EAAQhK,eAAgBgK,EAAQrvB,IAAI,EAC5BqvB,GAAAA,EAAQpB,KAAMoB,EAAShwB,CAAAA,EACjCgwB,EAAQpB,KAAK/J,MAAM,CAAA,EAAG3kB,EAC/B,EAAG,CAAE,CAAA,EAECilB,EAAUrsB,cAAYoH,GAAAA,CAC1B,MAAM8vB,EAAUnB,GAAiB4B,EAAmB/3B,QAASwH,CAAAA,EACpD8vB,OAAAA,EAAAA,EAAQhK,eAAgBgK,EAAQrvB,IAAI,EAC5BqvB,GAAAA,EAAQpB,KAAMoB,EAAShwB,CAAAA,EACjCgwB,EAAQpB,KAAK/J,MAAM,CAAA,EAAG3kB,EAC/B,EAAG,CAAE,CAAA,EAECquB,EAAez1B,cAAY,MAAMskB,GAAAA,CAC/B2T,MAAAA,EAAa,MAAM7vB,EAAK,YAAa,CAAEkc,YAAAA,CAAAA,CAAY,EACnDwR,EAAOoC,GAAiB5T,EAAa2T,CAAAA,EAErC/K,GAAiB,CAAE,GAAG5I,CAAAA,EAC5B,OAAIwR,GACFqC,OAAOC,KAAKtC,CAAMhW,EAAAA,QAAQ+G,GAAAA,EAEtBqG,GAAerG,CAAAA,GAAU,MACzBqG,GAAerG,CAAM,IAAK,IAC1BqG,GAAerG,KAAW,GAC1BqG,GAAerG,CAAAA,IAAW,MAEXA,GAAAA,CAAAA,EAASiP,EAAKjP,CAAM,EACrC,CACF,EAEKqG,EACT,EAAG,CAAE,CAAA,EAECnD,EAAiB/pB,cAAYoH,GAAAA,CACjCkX,EAAS,UAAW,CAAE+Z,cAAejxB,CAAAA,CAAG,CAAA,CAC1C,EAEM4iB,EAA8BhqB,cAAYigB,GAAAA,CACrC3B,EAAA,aAAa2B,CAAAA,EAAW,CAAA,CACnC,EAEMgK,EAAuBjqB,cAAY+qB,GAAAA,CACvCpK,EAAU,gBAAiB,CAAEvZ,GAAI2jB,CAAAA,CAAW,CAAA,CAC9C,EAEA,aACG2I,GAAAA,CACC37B,IAAKmmB,EACLyC,UAAAA,EACA2E,aAAciS,EACdhE,qBAAAA,EACA3J,SAAAA,EACAta,eAAAA,EACAqa,OAAAA,EACAwI,aAAAA,EACAC,SAAAA,EACA9K,YAAAA,EACAH,YAAAA,EACAC,aAAc,GACdsJ,iBAAkBvG,GAAWA,EAAQ/iB,GACrCupB,kBAAmBtnB,GAAYA,EAASjC,GACxCuqB,SAAAA,EACAR,MAAAA,EACAkB,UAAAA,EACAoF,WAAAA,EACAtL,WAAAA,EACAC,aAAAA,EACA/L,gBAAAA,EACAmX,cAAAA,EACAjG,YAAAA,EACA7nB,OAAAA,EACA+rB,aAAAA,EACApJ,QAAAA,EACA2F,sBAAAA,EACA9O,MAAAA,EACAkN,WAAAA,EACArG,eAAAA,EACAD,cAAAA,EACAtrB,MAAO,CAAEwF,gBAAiBJ,EAAMuH,eAAgB,EAChD6e,4BAAAA,EACAC,qBAAAA,EACAzC,OAAAA,EACAqL,UAAAA,EACA/L,QAAAA,CAAAA,EAGN,CCxMO,SAASwR,GAAW,CACzB1xB,QAAAA,EACA2xB,SAAAA,EACAC,mBAAAA,GAKD,CACC,aACGC,GAAAA,CAAY52B,MAAO,IAAK+E,QAAAA,EACvB,eAACiE,GAAAA,CACCC,aAAc2B,GAAAA,CACZ+rB,EAAmB/rB,CAAAA,CACrB,EACA1B,MACGwtB,EAASnxB,GAKNmxB,EAASnxB,KAAO,MAAQmxB,EAAShQ,SAAW,QAC1C,CACE,CAAEzzB,KAAM,gBAAiBkW,KAAM,QAAS,EACxC,CAAElW,KAAM,gBAAiBkW,KAAM,QAAS,EACxCH,GAAK6tB,KACL,CACE5jC,KAAM,cACNkW,KAAM,kBACNuR,SAAU,EACZ,EACA,CAAEznB,KAAM,eAAgBkW,KAAM,sBAAuB,CAAA,EAEvD,CACE,CAAElW,KAAM,gBAAiBkW,KAAM,QAAS,EACxC,CAAElW,KAAM,gBAAiBkW,KAAM,kBAAmB,EAClD,CAAElW,KAAM,gBAAiBkW,KAAM,gBAAiB,EAChD,CAAElW,KAAM,gBAAiBkW,KAAM,QAAS,EACxCH,GAAK6tB,KACL,CAAE5jC,KAAM,cAAekW,KAAM,iBAAkB,EAC/C,CAAElW,KAAM,eAAgBkW,KAAM,sBAAuB,CACtD,EAxBH,CACE,CAAElW,KAAM,cAAekW,KAAM,iBAAkB,EAC/C,CAAElW,KAAM,eAAgBkW,KAAM,sBAAuB,CAAA,CAsBpD,IAKjB,CC3CgB2tB,SAAAA,GAAW,CACzB/xB,QAAAA,EACAgyB,SAAAA,EACA9jC,KAAAA,EACA+jC,QAAAA,EACAC,OAAAA,EACAC,YAAAA,EACAC,IAAAA,GASD,CACOC,MAAAA,EAAWvhC,SAAyB,IAAA,EAE1CugB,OAAAA,EAAAA,UAAU,IAAA,CACJghB,EAASr5B,SACXq5B,EAASr5B,QAAQs5B,OAErB,EAAG,CAAE,CAAA,SAGFT,GAAAA,CAAY52B,MAAO,IAAK+E,QAAAA,YACtBgyB,IAAa,iBACZx6B,EAAA,IAAC+6B,OAAAA,CACC,gBAAClgB,GAAAA,CACCmgB,UAAU,MACVC,QAAQ,WACRC,MAAM,SACN96B,MAAO,CAAE6E,QAAS,EAAG,mBAEpBk2B,GAAAA,CAAU/6B,MAAO,CAAE8D,KAAM,CAAE,kBACzBk3B,GAAAA,CACC/V,MAAM,cACNgW,QAAQ,aACRj7B,MAAO,CAAE+E,WAAY,MAAO,CAAA,SAE7Bm2B,GAAAA,CACCtyB,GAAG,aACH6xB,SAAAA,EACAU,aAAc7kC,GAAQ,GACtB2W,SAAUotB,CAAAA,YAGb/vB,EAAAA,CACCC,KAAK,UACLvK,MAAO,CAAEua,UAAW,EAAG,EACvBtU,QAASpQ,GAAAA,CACPA,EAAEshB,eAAc,EAChBojB,GACF,EAECD,SAAAA,EAAS,MAAQ,QAAA,QAKzBE,SACE/f,GAAAA,CAAMmgB,UAAU,MAAME,MAAM,SAAS96B,MAAO,CAAE6E,QAAS,EAAG,EACzD,eAAC8K,EAAAA,CAAK3P,MAAO,CAAEC,MAAOmF,EAAMklB,SAAU,EAAIkQ,SAAAA,CAAAA,OAKpD,CCzDgBY,SAAAA,GAAsB,CACpCC,QAAAA,EACAC,aAAAA,EACAvB,SAAAA,EACAwB,eAAAA,EACAC,oBAAAA,EACAC,YAAAA,GAQD,CACC,KAAM,CAACC,EAAUC,CAAY,EAAGv5B,WAAS,EAAA,EACnC,CAACk4B,EAAQsB,CAAU,EAAGx5B,WAAS,EAAA,EAC/B,CAACkJ,EAAUC,CAAY,EAAGnJ,WAAS,EAAA,EACnC,CAACo4B,EAAKqB,CAAO,EAAGz5B,WAAS,IAAA,EACzB,CAACg4B,EAAU0B,CAAY,EAAG15B,WAAS,EAAA,EACnC,CAAC9L,EAAM+jC,CAAAA,EAAWj4B,EAAAA,SAAS23B,EAASzjC,IAAI,EACxCsS,EAAKmxB,EAASnxB,GAChBmzB,IAAAA,EAEE/B,MAAAA,EAAqB,MAAO/rB,GAAAA,CAEhC,OADA6tB,EAAY7tB,CAAAA,EACJA,EAAAA,CACN,IAAK,gBACH4tB,EAAO,IAAA,EACPD,EAAU,EAAA,EACVrwB,EAAY,EAAA,EACZowB,EAAY,EAAA,EACZ,MACF,IAAK,gBACHpwB,EAAY,EAAA,EACN3B,MAAAA,EAAK,gBAAiBhB,CAAAA,EAC5B2yB,IACA,MACF,IAAK,gBACHM,EAAO,IAAA,EACPD,EAAU,EAAA,EACVrwB,EAAY,EAAA,EACEwwB,EAAA,CACZC,WAAYX,EACZC,aAAAA,EACA1yB,GAAImxB,EAASnxB,GACbtS,KAAMyjC,EAASzjC,KACfyzB,OAAQ,OAAA,EAEJkS,MAAAA,EAAW,MAAMC,GAAU,gBAAiB,CAChDjoC,MAAO8nC,EACPV,QAAS,CAAII,GAAAA,CAAY,CAAA,CAC3B,EAEA,GAAIQ,EAASrmC,MAAO,CACXqmC,EAAAA,EAASrmC,MAAMksB,OAAO,EAC7B6Z,EAAY,EAAA,EACZ,MACF,CAEAH,EAAoBO,EAAa,QAAA,EACjC,MACF,IAAK,cACHF,EAAO,IAAA,EACPD,EAAU,EAAA,EACVrwB,EAAY,EAAA,EACZowB,EAAY,EAAA,EACZ,MACF,IAAK,gBACHpwB,EAAY,EAAA,EACEwwB,EAAA,CACZ,GAAGA,EACHhS,OAAQ,OAAA,EAEVyR,EAAoBO,EAAa,QAAA,EACjC,MACF,IAAK,eACHxwB,EAAY,EAAA,EACZgwB,IACA,KAEJ,CAAA,EAGF,eAAehB,GAAAA,CACb,GAAID,EAAQ,CACV,MAAM6B,EAAiB,CACrBH,WAAYX,EACZC,aAAAA,EACAhlC,KAAAA,EACAyzB,OAAQ,OAAA,EAGJkS,EAAW,MAAMC,GAAU,gBAAiB,CAChDjoC,MAAOkoC,EACPd,QAAS,CAAII,GAAAA,CAAY,CAAA,CAC3B,EAEA,GAAIQ,EAASrmC,MAAO,CACXqmC,EAAAA,EAASrmC,MAAMksB,OAAO,EAC7B6Z,EAAY,EAAA,EACZ,MACF,CAEAA,EAAY,EAAA,EACQH,EAAA,CAClB,GAAGW,EACHvzB,GAAIqzB,EAAS5yB,IAAAA,CACf,EACA,MACF,CAEA,MAAM+yB,EAAgB,CACpBJ,WAAYjC,EAASiC,WACrBV,aAAcvB,EAASuB,aACvB1yB,GAAImxB,EAASnxB,GACbtS,KAAAA,CAAAA,EAGI2lC,EAAW,MAAMC,GAAU,gBAAiB,CAChDjoC,MAAOmoC,EACPf,QAAS,CAAII,GAAAA,CAAY,CAAA,CAC3B,EAEA,GAAIQ,EAASrmC,MAAO,CACXqmC,EAAAA,EAASrmC,MAAMksB,OAAO,EAC7B6Z,EAAY,EAAA,EACZ,MACF,CAEAA,EAAY,EAAA,EACZH,EAAoBY,CAAAA,CACtB,CAEA,cACG34B,EAAAA,WACE43B,EAAQt4B,OAAS,GAChBvC,EAAAA,KAAC8J,EAAAA,CACCC,KAAK,OACLvK,MAAO,CAAEua,UAAW,EAAG,EACvBtU,QAAS,IAAA,CACPsF,EAAY,EAAA,CACd,mBAECoE,EAAAA,CACC3P,MAAO,CACLwZ,SAAU,IACVxN,WAAY,SACZC,SAAU,SACVF,aAAc,WACdjF,WAAY,CACd,YAEEizB,EAASnxB,GAAwBmxB,EAASzjC,KAA5B,iBAAiC,OAElDyjC,EAASnxB,IAAMmxB,EAAShQ,SAAW,eACjCpa,EAAAA,CAAK,SAAA,aAAA,SAEPH,GAAAA,CAAenM,MAAO,EAAGwF,OAAQ,EAAG7I,MAAO,CAAE+G,YAAa,CAAE,CAAA,MAGhEuE,SACEwuB,GAAAA,CACC1xB,QAAS,IAAMmD,EAAY,EAAA,EAC3BwuB,SAAAA,EACAC,mBAAAA,CAAAA,GAGH0B,SACEvB,GAAAA,CACC/xB,QAAS,IAAMuzB,EAAY,EAAA,EAC3BvB,SAAAA,EACA9jC,KAAAA,EACA+jC,QAAAA,EACAC,OAAAA,EACAC,YAAAA,EACAC,IAAAA,CAAAA,KAKV,CC7LgB6B,SAAAA,GAAa,CAC3BhB,QAAAA,EACAC,aAAAA,EACAgB,eAAAA,EACAC,eAAAA,EACAhB,eAAAA,EACAC,oBAAAA,EACAzB,SAAAA,EACA0B,YAAAA,EACAe,eAAAA,CAAAA,EAcD,CACC,aACG/4B,EAAAA,CACC,gBAACgX,GAAAA,CACCC,QAAS,EACTkgB,UAAU,MACVC,QAAQ,aACRC,MAAM,6BAEL2B,GAAAA,CACCpB,QAAAA,EACAC,aAAAA,EACAkB,eAAAA,EACAvvB,SAAUqvB,EACVnxB,SAAUoxB,CAAAA,SAEX94B,EAAAA,CAAKzD,MAAO,CAAE8D,KAAM,CAAE,CAAA,SACtBs3B,GAAAA,CACCC,QAAAA,EACAC,aAAAA,EACAvB,SAAAA,EACAwB,eAAAA,EACAC,oBAAAA,EACAC,YAAAA,CAAAA,OAKV,CCxDgBiB,SAAAA,GAA2B,CACzCC,eAAAA,EACAC,OAAAA,EACAC,YAAAA,EACA1xB,SAAAA,EACA+D,OAAAA,EACA4tB,SAAAA,EACAC,aAAAA,EACAC,iBAAAA,EACA7a,UAAAA,CAAAA,EACD,CACC,MAAMuR,EAAgB6C,KAEhB9nB,EAAQ3W,EAAAA,QAAQ,IAAA,CACpB,MAAMyU,EAAQ,CAAImnB,GAAAA,CAAAA,EACX,MAAA,CACL1kB,QAAS,CAAC,CAACzC,EAAM8G,KAAKzK,GAAMod,GAAYpd,CAAAA,CAAAA,EACxCme,MAAO,CAAC,CAACxa,EAAM8G,KAAKzK,GAAM,CAACod,GAAYpd,CAAAA,CAAAA,CAAAA,CACzC,EACC,CAAC8qB,CAAAA,CAAc,EAEZuJ,EAAuBnlC,EAAAA,QAAQ,IACd,CAAI47B,GAAAA,GAAe3vB,IAAI6E,GAAM+zB,EAAe/zB,CAAAA,CAAAA,EAE7Cs0B,KAAKzK,GAAKA,GAAKA,EAAEzL,QAAQ,EAC5C,CAAC0M,CAAAA,CAAc,EAEZyJ,EAASrlC,EAAAA,QAAQ,IAEnB,CAAC2W,EAAMO,SACP,CAAI0kB,GAAAA,CAAAA,EAAe0J,MAAMx0B,GAAAA,CACjB6pB,MAAAA,EAAIkK,EAAe/zB,CAAAA,EACzB,OAAO6pB,GAAKA,EAAE5N,QAAAA,CAChB,EAED,CAACpW,EAAMO,QAAS0kB,EAAeiJ,CAAAA,CAAe,EAEjD,aACGU,GAAAA,CACC/mC,KAAK,eACLgnC,YACE7uB,EAAMsY,OAAS,CACb0P,EAAG,IAAMmG,EAAO,CAAIlJ,GAAAA,CAAAA,CAAc,EAClCtzB,EAAG,IAAM+K,EAAS,CAAIuoB,GAAAA,CAAAA,CAAc,EACpCr1B,EAAG,IAAM6Q,EAAO,UAAW,CAAIwkB,GAAAA,CAAAA,CAAc,EAC7C6J,EAAG,IAAMruB,EAAO,QAAS,CAAIwkB,GAAAA,CAAAA,CAAc,EAC3C8J,EAAG,IAAMtuB,EAAO,QAAS,CAAIwkB,GAAAA,CAAAA,CAAc,EAC3C5gB,EAAG,IAAM5D,EAAO,WAAY,CAAIwkB,GAAAA,CAAAA,CAAc,EAC9C+J,EAAG,IAAMvuB,EAAO,UAAW,CAAIwkB,GAAAA,CAAAA,CAAc,CAC/C,EAEFnnB,MAAO,IACAkC,EAAMsY,MAMP,CACE,CAAEzwB,KAAM,OAAQkW,KAAM,OAAQjS,IAAK,GAAI,EACvC,CACEjE,KAAM,YACNkW,KAAM,YACNuR,SAAUkf,CACZ,EACA,CAAE3mC,KAAM,SAAUkW,KAAM,SAAUjS,IAAK,GAAI,KACvC4iC,EACA,CACE,CACE7mC,KAAM,gBACNkW,KAAM,gBACNuR,SAAU2V,EAAczwB,KAAO,CACjC,EACA,CAAE3M,KAAM,kBAAmBkW,KAAM,iBAAkB,CAAA,EAErD,CACE,CACElW,KAAM,gBACNkW,KAAM,eACR,EACA,CACElW,KAAM,cACNkW,KAAM,aACR,CACD,EACLH,GAAK6tB,KACL,CAAE3vB,KAAM8B,GAAKqxB,MAAOpnC,KAAM,YAAa,EACvC,CAAEA,KAAM,OAAQkW,KAAM,MAAO,EAC7B,CAAElW,KAAM,UAAWkW,KAAM,UAAWjS,IAAK,GAAI,EAC7C,CAAEjE,KAAM,QAASkW,KAAM,QAASjS,IAAK,GAAI,EACzC,CAAEjE,KAAM,QAASkW,KAAM,QAASjS,IAAK,GAAI,EACzC,CAAEjE,KAAM,WAAYkW,KAAM,WAAYjS,IAAK,GAAI,EAC/C,CAAEjE,KAAM,SAAUkW,KAAM,QAAS,EACjC,CAAElW,KAAM,UAAWkW,KAAM,UAAWjS,IAAK,GAAI,CAC9C,EAzCD,CACE,CAAEjE,KAAM,gBAAiBkW,KAAM,eAAgB,EAC/C,CAAElW,KAAM,mBAAoBkW,KAAM,kBAAmB,EACrD,CAAElW,KAAM,OAAQkW,KAAM,qBAAsB,CAAA,CAuCnD,EACDvK,SAAU3L,GAAAA,CACR,OAAQA,EAAAA,CACN,IAAK,OACIsmC,EAAA,CAAIlJ,GAAAA,CAAAA,CAAc,EACzB,MACF,IAAK,YACSmJ,EAAA,CAAInJ,GAAAA,CAAAA,CAAc,EAC9B,MACF,IAAK,SACMvoB,EAAA,CAAIuoB,GAAAA,CAAAA,CAAc,EAC3B,MACF,IAAK,mBACL,IAAK,OACHsJ,EAAiB1mC,EAAMo9B,CAAAA,EACvB,MACF,IAAK,gBACH,MAAMiK,EAAU,CAAIjK,GAAAA,GAAe,CAAE,EACjCnH,IAAAA,EACAvG,GAAAA,GAAY2X,CAAU,EAExBpR,EADcoR,EAAQC,MAAM,GAAA,EACT,CAAE,MAChB,CACC7W,MAAAA,EAAQ4V,EAAegB,CAAAA,EAC7BpR,EAAaxF,GAASA,EAAMlC,QAC9B,CAEI0H,GACFpK,EAAU,gBAAiB,CAAEvZ,GAAI2jB,CAAAA,CAAW,EAE9C,MACF,IAAK,gBACHpK,EAAU,gBAAiB,CACzB0b,eAAgB,CAAInK,GAAAA,CAAc,EAClCiJ,eAAAA,EACAxa,UAAAA,CAAAA,CACF,EACA,MACF,IAAK,kBACM2a,EAAA,CAAIpJ,GAAAA,CAAAA,CAAc,EAC3B,MACF,IAAK,cACUqJ,EAAA,CAAIrJ,GAAAA,CAAAA,CAAc,EAC/B,MACF,QACExkB,EAAO5Y,EAAM,CAAIo9B,GAAAA,CAAAA,CAAc,CACnC,CACF,CAAA,EAGN,CCvIA,SAASoK,GAAgB,CAAExnC,KAAAA,EAAM4nB,QAAAA,EAAS6f,eAAAA,EAAiB,IAAM,CAC/D,MAAM5iB,EAASC,KACf,cACGzL,EAAAA,CACC3P,MAAO,CACL6G,WAAY,GACZ5B,aAAc,EACdJ,QAAS,UACT5E,MAAOmF,EAAM44B,SACbx4B,gBAAiBJ,EAAM64B,cACzB,YAEC3nC,EAAM,UACN4nC,GAAAA,CACC,gBAACvuB,EAAAA,CAAK3P,MAAO,CAAEgG,WAAY,GAAI,YAC5B,CAAC+3B,GAAkB,KACnB5iB,EAAO+C,EAAS,WAAA,SAK3B,CAEA,SAASigB,GAAgB,CAAEzK,cAAAA,EAAe/H,QAAAA,GAAS,CACjD,MAAMr1B,EAAO,oBAAoB,CAAIo9B,GAAAA,CAAAA,EAAe0K,KAAK,GAAA,CAAA,GAEnDC,EAAOC,GAAc,CACzBhoC,KAAAA,EACAioC,MAAOh1B,GAAE,cACNC,EAAAA,OAAO,CACNZ,GAAI,CAAE41B,OAAQ,CAAI9K,GAAAA,CAAc,CAAC,EACjCzM,UAAW,CAAEuX,OAAQ,CAAI9K,GAAAA,CAAc,CAAC,CAAA,CAC1C,EACCjqB,OAAO,IAAA,CAAA,CACZ,EACM6d,EAAM,IAAIS,KAAKsW,GAAQ,CAAA,GAAIt6B,IAAI06B,GAAKA,EAAE71B,EAAE,CAAA,EAExC81B,EAAW,CAAIhL,GAAAA,CAAAA,EAAelqB,OAAOZ,GAAM,CAAC0e,EAAIC,IAAI3e,CAAAA,CAAAA,EAC1D,IAAIsV,EAAUogB,GAAc,CAC1BhoC,KAAMA,EAAO,OACbioC,MAAOh1B,GAAE,cACNC,EAAAA,OAAO,CAAEZ,GAAI,CAAE41B,OAAQE,CAAS,CAAE,CAAA,EAClC/jC,QAAQ,CAAEgkC,OAAQ,KAAM,CAAA,EACxBC,UAAU,CAAEC,KAAM,SAAA,CAAU,CAAA,CACjC,EAEIC,EAAkB,KACtB,MAAMxa,EAAekI,KACfhI,EAAYF,EAAeA,EAAaE,UAAY,CAAA,EACpDua,EAAa,CAAIrL,GAAAA,CACpBlqB,EAAAA,OAAOZ,GAAMod,GAAYpd,CAAAA,CAAAA,EACzB7E,IAAI6E,GAAMA,EAAGihB,MAAM,CAAA,CAAA,EACtB,IAAIkU,EAAiB,GAErB,UAAWtR,KAAKjI,EACVua,EAAWv6B,SAASioB,EAAE7jB,EAAE,IAEtB6jB,EAAEuS,YAAc,cACDjB,EAAA,IAGf,CAACpS,GAAWA,EAAQ/iB,KAAO6jB,EAAEwS,SACZ/Y,GAAAA,GAAmBuG,EAAEyS,OAAO,EAE5BhZ,GAAAA,GAAmBuG,EAAEyS,OAAO,GAKrD,GAAIhhB,GAAW,KAAM,CACnB,GAAI4gB,GAAmB,KACd,OAAA,KAEGA,EAAAA,CACZ,MACSA,GAAmB,OACjBA,GAAAA,GAGb,aACGhB,GAAAA,CACCxnC,KAAK,oBACL4nB,QAAAA,EACA6f,eAAAA,CAAAA,EAGN,CAEA,SAASoB,GAAa,CAAEC,aAAAA,GAAc,CACpC,MAAMpQ,EAAUsP,GAAc,CAC5BhoC,KAAM8oC,EAAa9oC,KAAO,WAC1BioC,MAAOa,EAAab,MAAM/0B,OAAO,CAAEwlB,QAAS,EAAA,CAAK,CAAA,CACnD,EACMqQ,EAAYf,GAAc,CAC9BhoC,KAAM8oC,EAAa9oC,KAAO,aAC1BioC,MAAOa,EAAab,MAAM/0B,OAAO,CAAEwlB,QAAS,EAAA,CAAM,CAAA,CACpD,EAEA,cACGvrB,EAAAA,CAAKzD,MAAO,CAAE0D,cAAe,KAAM,kBACjCo6B,GAAAA,CAAgBxnC,KAAK,iBAAiB4nB,QAAS8Q,CAAAA,SAC/C8O,GAAAA,CAAgBxnC,KAAK,mBAAmB4nB,QAASmhB,CAAAA,KAGxD,CAEO,SAASC,GAAS,CACvBF,aAAAA,EACAG,kBAAAA,EACAC,sBAAAA,EACA7T,QAAAA,GACD,CACC,MAAM+H,EAAgB6C,KAEtB,cACG9yB,EAAAA,CACCzD,MAAO,CACL0D,cAAe,MACfC,WAAY,SACZ4W,UAAW,GACX1T,WAAY,EACd,mBAECyD,EAAAA,CACCwB,cAAY,kBACZvB,KAAK,OACLtE,QAASu5B,EACTx/B,MAAO,CACL,QAAS,CACP0L,QAASgoB,EAAczwB,KAAO,GAAKs8B,EAAoB,EAAI,CAC7D,EACA,cAAe,CAAE7zB,QAAS,CAAE,EAC5BzE,WAAY,EACZqU,cAAe,CACjB,kBAECC,GAAAA,CACCC,QAAS,CAAE,GAAG4jB,EAAcv3B,MAAO,CAAE,EACrC0C,KAAK,YACLvK,MAAO,CAAEuG,SAAU,GAAIP,WAAY,GAAI,EACvC4X,SAAU/V,IAAU,CAClB5H,MACE4H,EAAQ,EACJzC,EAAMklB,UACNziB,EAAQ,EACNzC,EAAMilB,gBACNjlB,EAAMC,eAAAA,GAEhBiX,cAAe,CACbmjB,cAAe,CACjB,CAAA,SAGDh/B,GAAAA,CACCT,MAAO,CACLqD,MAAO,GACPwF,OAAQ,GACRhC,WAAY,GACZ5G,MAAOmF,EAAM44B,SACbtuB,UAAW6vB,EAAoB,kBAAoB,YACrD,CAAA,MAGHA,SAAsBJ,GAAAA,CAAaC,aAAAA,CAAAA,GAEnC1L,EAAczwB,KAAO,GACpBrD,EAAAA,IAACu+B,GAAAA,CAAgBzK,cAAAA,EAA8B/H,QAAAA,CAAAA,KAIvD,CC5KO,SAAS+T,GAAmB,CACjCN,aAAAA,EACAO,cAAAA,EACAC,OAAAA,EACAC,oBAAAA,GACD,CACC,MAAM7Q,EAAUsP,GAAc,CAC5BhoC,KAAM8oC,EAAa9oC,KAAO,WAC1BuR,MAAO,EACP02B,MAAOa,EAAab,MAAM/0B,OAAO,CAAEwlB,QAAS,EAAA,CAAK,CAAA,CACnD,EACM7T,EAASC,KACT0kB,EAAaH,EAAgB3Q,EAEnC,aACGvrB,EAAAA,CACCzD,MAAO,CACL0D,cAAe,MACfiX,UAAW,SACXnV,gBAAiBJ,EAAMuH,gBACvB,GAAGrH,EAAOy6B,OACV96B,aAAc,EACdsV,UAAW,EACXvH,aAAc,GACdnO,QAAS,EACX,EAEA,gBAACpB,EAAAA,CAAKzD,MAAO,CAAE0D,cAAe,MAAOC,WAAY,QAAS,YACvDm8B,IAAe,EACdt/B,EAAA,KAACiD,EAAAA,CACCzD,MAAO,CACLC,MAAOmF,EAAMilB,gBACbvmB,KAAM,EACNJ,cAAe,MACfC,WAAY,SACZC,eAAgB,QAClB,kBAECo8B,GAAAA,CACChgC,MAAO,CACLqD,MAAO,GACPwF,OAAQ,GACR5I,MAAO,UACP8G,YAAa,CACf,CAAA,GACA,qBAIJnH,EAAA,IAAC6D,EAAAA,CAAKzD,MAAO,CAAEC,MAAOmF,EAAM0qB,SAAU,EACpC,gBAACngB,EAAAA,CAAK3P,MAAO,CAAE+vB,UAAW,SAAUjrB,UAAW,QAAS,YAAG,uBACpC,UACpBm7B,SAAAA,CAAQ9kB,SAAAA,EAAO6T,EAAS,WAAA,CAAA,GAAsB,SAAO,UACrDiR,SAAAA,CACE,UAACH,EAAa,EAAI,IAAM,IAAM3kB,EAAO2kB,EAAY,WAAA,CAAA,GAC1C,IAAI,WAEdlgC,EAAA,IAACsgC,KAAAA,EAAAA,EAAK,0BAAwB,UAC7BvwB,EAAAA,CAAK3P,MAAO,CAAEgG,WAAY,GAAI,EAC5BmV,SAAAA,EAAOwkB,EAAe,WAAA,CAAA,cAK9Bl8B,EAAAA,CAAKzD,MAAO,CAAE6G,WAAY,EAAG,EAC5B,eAACyD,EAAAA,CAAOC,KAAK,UAAUtE,QAAS25B,EAAQ,SAAA,kBAAA,KAIzCE,IAAe,GACdlgC,EAAA,IAAC6D,EAAAA,CAAKzD,MAAO,CAAE6G,WAAY,EAAG,EAC5B,eAACyD,EAAAA,CAAOrE,QAAS,IAAM45B,EAAoBC,CAAAA,EAAa,SAAA,mCAAA,SAQpE,CAEO,SAASK,GAAiB,CAAExU,QAAAA,EAASyU,YAAAA,EAAah4B,QAAAA,GAAS,CAC1Dg3B,MAAAA,EAAe/mB,GAAuBsT,CAAAA,EACtC0U,EAAiB/B,GAAc,CACnChoC,KAAM8oC,EAAa9oC,KAAO,WAC1BuR,MAAO,KACP02B,MAAOa,EAAab,MAAM/0B,OAAO,CAAEwlB,QAAS,EAAA,CAAK,CAAA,CACnD,EACM7T,EAASC,KAEf,SAASklB,EAASzqC,EAAC,CACjBA,EAAEshB,eAAc,EAChB,MAAMopB,EAAQ1qC,EAAE2qC,OAAOC,SAAS,CAAE,EAC5BjjB,EAASkjB,GAAkBH,EAAM14B,KAAK,EACxC2V,GAAU,MACAA,EAAAA,GAAiB6iB,CAAiB7iB,EAC9CpV,KAEAm4B,EAAM92B,OAAM,CAEhB,CAEA,aACGlB,GAAAA,CAAQnC,SAAS,eAAe/C,MAAO,IAAK+E,QAAAA,EAC3C,gBAAC3E,EAAAA,CAAKzD,MAAO,CAAE6E,QAAS,SAAU,kBAC/B8K,EAAAA,CAAK,SAAA,iFAAA,UAILgrB,OAAAA,CAAK2F,SAAAA,YACHD,GAAkB,MACjBzgC,EAAA,IAAC+gC,GAAAA,CACC,eAACzF,GAAAA,CACCC,aAAchgB,EAAOklB,EAAgB,WAAA,EACrCrgC,MAAO,CAAE2Q,OAAQ,OAAQ,CAAA,WAI9BrG,EAAAA,CAAOC,KAAK,UAAU,SAAA,WAAA,UAKjC,CC1GgBq2B,SAAAA,GAAc,CAC5BlhB,SAAAA,EACAmhB,YAAAA,EACAC,eAAAA,EACAC,YAAAA,EACAC,YAAAA,EACArV,QAAAA,EACAoO,SAAAA,EACA0B,YAAAA,EACAwF,gBAAAA,EACA7V,SAAAA,EACAtE,aAAAA,EACA6M,aAAAA,EACA4L,kBAAAA,EACAzW,YAAAA,EACAoY,iBAAAA,EACA9B,aAAAA,EACA+B,gBAAAA,EACAC,oBAAAA,EACAC,SAAAA,EACAC,OAAAA,EACAjG,QAAAA,EACAC,aAAAA,EACAnZ,UAAAA,EACAof,SAAAA,EACAC,iBAAAA,EACAC,mBAAAA,EACAC,kBAAAA,EACAC,kCAAAA,EACAnC,sBAAAA,EACAoC,WAAAA,EACAC,aAAAA,EACAC,OAAAA,EACAC,SAAAA,EACAz1B,aAAAA,EACA8zB,YAAAA,EACA4B,cAAAA,EACAC,iBAAAA,EACAC,YAAAA,EACAC,cAAAA,EACApF,aAAAA,EACAqF,cAAAA,EACA9F,eAAAA,EACAf,eAAAA,EACAC,oBAAAA,GACAgB,eAAAA,EACAD,eAAAA,GACAS,iBAAAA,CAAAA,EACD,CACC,KAAM,CAAC1xB,GAAUC,EAAY,EAAGnJ,WAAS,EAAA,EACnCigC,GAAcnpC,SAAO,IAAA,EACrBo8B,GAAiBnO,KACjBmb,GAAmBC,KACnBC,GAAgBF,KAAqB,YACrCG,GAAkBH,KAAqB,UACvC,CAACjM,GAAGqM,EAAoB,EAAGpxB,GAAa,eAAA,EAE1CqxB,IAAAA,GAAUhX,GAAWA,EAAQiX,YAAcJ,GAC1C7W,IAEOgX,GAAA,CAAC,CAACvX,EAAS/X,KAAKsY,IAAW,CAAC,CAACA,GAAQiX,UAAU,GAAKJ,IAGhE,SAASK,IAAAA,CACHnjB,EAASte,UACXk0B,GAAel7B,SAAS,CACtBmQ,KAAM,cACN3B,GAAI8W,EAASte,QAAQ0hC,gBAAe,CAAA,CACtC,EAEAJ,GAAsBpN,GAAerhC,MAAMozB,OAAS,QAAO,EAE/D,CAEA,cACEzX,EAAAA,SAAA,iBACGmzB,GAAAA,CACCnJ,KAAM,CACJ,gBAAiB,IAAA,CACXyI,GAAYjhC,SACdihC,GAAYjhC,QAAQs5B,OAExB,CACF,CAAA,UAGDj3B,EAAAA,CAAKzD,MAAO,CAAE,GAAGsF,EAAO09B,YAAa1nB,cAAe,GAAIxU,WAAY,CAAE,kBACpErD,EAAAA,CACCzD,MAAO,CAAEua,UAAW,EAAGvH,aAAc,GAAIrP,WAAY,YAAa,EAElE,eAACF,EAAAA,CACEo9B,SAAAA,EACCjhC,EAAA,IAAC+gC,GAAAA,CACC,eAACzF,GAAAA,CACCC,aAAc6F,EACdiC,QAASptC,IAAK+rC,EAAW/rC,GAAE2qC,OAAO34B,KAAK,EACvCqF,OAAQrX,IAAK+rC,EAAW/rC,GAAE2qC,OAAO34B,KAAK,EACtCq7B,SAAU,IAAMrB,EAAa,EAAA,EAC7B7hC,MAAO,CACLuG,SAAU,GACVP,WAAY,IACZuU,UAAW,GACXvH,aAAc,GACdnM,WAAY,GACZI,WAAY,EACZqU,cAAe,CACjB,CAAA,GAGFwlB,EAAAA,EACFtgC,EAAA,KAACiD,EAAAA,CACCzD,MAAO,CACL0D,cAAe,MACfC,WAAY,SACZw/B,IAAK,EACL,mBAAoB,CAClBz3B,QAAS,EACT+D,WAAY,cACd,EACA,yBAA0B,CACxB/D,QAAS,CACX,CACF,kBAECjI,EAAAA,CACCzD,MAAO,CACLuG,SAAU,GACVP,WAAY,IACZe,YAAa,EACbiM,aAAc,EAChB,EACAlH,cAAY,eAEX6f,SAAAA,GAAWA,EAAQyX,OAChB,WAAapC,EACbA,CAAAA,GAGLrV,SACEhjB,GAAAA,CACCC,GAAI,WAAW+iB,EAAQ/iB,EAAE,GACzBE,aAAc1D,EAAMC,eAAAA,SAGvBiF,EAAAA,CACCC,KAAK,OACLC,aAAW,oBACXC,UAAU,gBACVxE,QAAS,IAAM47B,EAAa,EAAA,EAE5B,eAAC7gC,GAAAA,CACChB,MAAO,CACLqD,MAAO,GACPwF,OAAQ,GACR5I,MAAOmF,EAAMC,eACf,CAAA,QAKNzF,EAAA,IAAC6D,EAAAA,CACCzD,MAAO,CAAEuG,SAAU,GAAIP,WAAY,IAAKgN,aAAc,EAAG,EACzDlH,cAAY,eAEX6f,SAAAA,GAAWA,EAAQyX,OAChB,WAAapC,EACbA,CAAAA,aAMX1B,GAAAA,CACCF,aAAAA,EACAG,kBAAAA,EACAC,sBAAAA,EACA7T,QAAAA,CAAAA,UAGDlR,GAAAA,CACCC,QAAS,EACTkgB,UAAU,MACVE,MAAM,SACN96B,MAAO,CAAEua,UAAW,EAAG,aAEpBoR,GAAW,CAACA,EAAQyX,QAAWT,WAC/Br4B,EAAAA,CACCC,KAAK,OACLtE,QAAS08B,GAAUb,EAASC,EAC5BhkB,SAAU4kB,IAAWF,YAEpBE,GACCniC,EAAA,KAAAoP,WAAA,iBACGyzB,GAAAA,CACChgC,MAAO,GACPwF,OAAQ,GACRy6B,UACE3X,GAAYsV,IAAoBtV,EAAQr1B,MACxC2qC,IAAoB,QAEtBjhC,MAAO,CAAE+G,YAAa,CAAE,CAAA,GACvB,IACF07B,GAAkB,eAAiB,QAGtC,EAAAjiC,EAAA,KAAAoP,WAAA,iBACG9O,GAAAA,CACCuC,MAAO,GACPwF,OAAQ,GACR7I,MAAO,CAAE+G,YAAa,CAAE,CAAA,GACvB,IAAI,cAMd,CAACm6B,GACA1gC,EAAA,KAAC8J,EAAAA,CAAOC,KAAK,OAAOtE,QAASu7B,kBAC1B+B,GAAAA,CAAOlgC,MAAO,GAAIwF,OAAQ,GAAI7I,MAAO,CAAE+G,YAAa,CAAE,CAAA,GAAK,oBAI/DtD,EAAAA,CAAKzD,MAAO,CAAE8G,WAAY,CAAE,EAC3B,eAAC08B,GAAAA,CAAaC,QAASrB,EAAe73B,KAAK,UAAA,WAE5C9G,EAAAA,CAAKzD,MAAO,CAAE8D,KAAM,CAAE,CAAA,SACtBohB,GAAAA,CACC5X,YAAY,SACZzF,MAAOy5B,EACP54B,SAAU64B,EACV9G,SAAU4H,EAAAA,GAEXtB,QACEt9B,EAAAA,CACC,eAACigC,GAAAA,CAAgB1jC,MAAO,CAAEqD,MAAO,GAAIwF,OAAQ,EAAG,CAAA,KAGlDjJ,EAAA,IAAC88B,GAAAA,CACCC,eAAgB/zB,IAAMke,EAAazT,KAAKof,IAAKA,GAAE7pB,KAAOA,EAAAA,EACtDg0B,OAAQ6E,EACR5E,YAAaoF,EACb92B,SAAU62B,EACV9yB,OAAQgzB,EACRpF,SAAUqF,EACVpF,aAAAA,EACAC,iBAAAA,EACA7a,UAAAA,CAAAA,SAGH7X,EAAAA,CACCC,KAAK,OACLwT,SAAUujB,IAAW,IAAMjG,EAAQt4B,OAAS,EAC5C/C,MAAO,CAAE6E,QAAS,EAAGgC,WAAY,EAAG,EACpCZ,QAAS48B,GACT5d,MACEqQ,GAAerhC,MAAMozB,OAAS,WAC1B,8BACA,4BAGLiO,SAAAA,GAAerhC,MAAMozB,OAAS,iBAC5BzmB,GAAAA,CAAiBZ,MAAO,CAAEqD,MAAO,GAAIwF,OAAQ,EAAG,CAAA,GAEjDjJ,EAAA,IAACe,GAAAA,CAAiBX,MAAO,CAAEqD,MAAO,GAAIwF,OAAQ,EAAG,CAAA,KAGpD8iB,SACEloB,EAAAA,iBACEkgC,GAAAA,CAAW19B,QAAS,IAAMsF,GAAY,EAAA,CAAA,GAEtCD,UACEs4B,GAAAA,CACCjY,QAAAA,EACAgX,QAAAA,GACAkB,gBAAiBzC,EAAAA,EACjBC,SAAAA,EACA1N,aAAAA,EACA7K,YAAAA,EACAxc,aAAc2B,IAAAA,CACZ1C,GAAY,EAAA,EACZe,EAAa2B,EAAAA,CACf,EACAmyB,YAAAA,EACAh4B,QAAS,IAAMmD,GAAY,EAAA,CAAA,MAKjC/K,EAAA,KAACiD,EAAAA,iBACEkgC,GAAAA,CAAW19B,QAAS,IAAMsF,GAAY,EAAA,CAAA,GAEtCD,UACEw4B,GAAAA,CACCx3B,aAAc2B,IAAAA,CACZ1C,GAAY,EAAA,EACZe,EAAa2B,EAAAA,CACf,EACA7F,QAAS,IAAMmD,GAAY,EAAA,EAC3B81B,SAAAA,CAAAA,SAOThG,GAAWA,EAAQt4B,OAAS,SAC1Bs5B,GAAAA,CACChB,QAAAA,EACAC,aAAAA,EACAgB,eAAAA,EACAC,eAAAA,GACAhB,eAAAA,EACAC,oBAAAA,GACAzB,SAAAA,EACA0B,YAAAA,EACAe,eAAAA,CAAAA,MAIL2E,GAAmB,MAClBvhC,EAAA,IAAC8/B,GAAAA,CACCC,cAAewB,EACf/B,aAAAA,EACAQ,OAAQ8B,EACR7B,oBAAqB8B,CAAAA,KAK/B,CAEA,SAASiC,GAAY,CACnBjY,QAAAA,EACAgX,QAAAA,EACAhP,aAAAA,EACAkQ,gBAAAA,EACA/a,YAAAA,EACA1gB,QAAAA,EACAi5B,SAAAA,EACAjB,YAAAA,EACA9zB,aAAAA,CAAAA,EACD,CACC,KAAM,CAACnD,EAAS46B,CAAW,EAAG3hC,WAAS,SAAA,EACjCkgC,EAAmBC,KAElBp5B,OAAAA,IAAY,YACjBvJ,EAAA,IAACugC,GAAAA,CACCxU,QAAAA,EACAvjB,QAAAA,EACAg4B,YAAAA,CAAAA,GAGFxgC,EAAA,IAACq6B,GAAAA,CAAY52B,MAAO,IAAK+E,QAAAA,EACvB,eAACiE,GAAAA,CACCC,aAAc2B,GAAAA,CACRA,IAAS,YACX81B,EAAW,WAAA,EAEXz3B,EAAa2B,CAAAA,CAEjB,EACA1B,MAAO,CACL80B,GAAY,CACV/qC,KAAM,iBACNkW,KAAM,oBACR,EACAq3B,GAAmB,CACjBvtC,KAAM,iBACNkW,MAAOmnB,EAAe,OAAS,QAAU,kBAC3C,EACA,CACEr9B,KAAM,iBACNkW,MAAOsc,EAAc,OAAS,QAAU,uBAC1C,EACA,CAAExyB,KAAM,SAAUkW,KAAM,QAAS,EACjC,CAAElW,KAAM,YAAakW,KAAM,WAAY,EACvCmf,GACE,CAACA,EAAQyX,SACRT,EACG,CACErsC,KAAM,SACNkW,KAAM,gBAAA,EAER81B,IAAqB,UAAY,CAC/BhsC,KAAM,OACNkW,KAAM,cAAA,GAEdmf,EAAQyX,OACJ,CAAE9sC,KAAM,SAAUkW,KAAM,gBAAA,EACxB,CAAElW,KAAM,QAASkW,KAAM,eAAgB,CAAA,EAC3ChD,OAAO9P,GAAKA,CAAAA,CAAAA,IAItB,CAEA,SAASoqC,GAAa,CAAE17B,QAAAA,EAASkE,aAAAA,EAAc+0B,SAAAA,GAAU,CACvD,aACGpH,GAAAA,CAAY52B,MAAO,IAAK+E,QAAAA,EACvB,eAACiE,GAAAA,CACCC,aAAc2B,GAAAA,CACZ3B,EAAa2B,CAAAA,CACf,EACA1B,MAAO,CACL80B,GAAY,CACV/qC,KAAM,iBACNkW,KAAM,oBACR,EACA,CAAElW,KAAM,SAAUkW,KAAM,QAAS,CAClC,CAAA,IAIT,CC/YA,SAASw3B,GAAa,CAAEtf,MAAAA,GAAO,CAC7B,aACGjhB,EAAAA,CACCzD,MAAO,CACLC,MAAOmF,EAAM0qB,UACbtqB,gBAAiBJ,EAAMuH,gBACvB7I,KAAM,EACNH,WAAY,SACZ+Y,eAAgB,EAChBC,YAAavX,EAAM2C,WACrB,EAEA,gBAACtE,EAAAA,CACCzD,MAAO,CACLqD,MAAO,IACPkX,UAAW,GACXhU,SAAU,GACV5C,WAAY,QACd,mBAECgM,EAAAA,CAAK3P,MAAO,CAAE8E,UAAW,SAAUorB,WAAY,OAAQ,YAAG,8CACnB+P,SAAAA,CAAO,SAAA,gBAAA,GAAuB,4GAKrE31B,EAAAA,CAAOC,KAAK,UAAUvK,MAAO,CAAEua,UAAW,EAAG,EAAGtU,QAASye,EAAO,SAAA,aAAA,SAIhEjhB,EAAAA,CACCzD,MAAO,CAAEua,UAAW,GAAIhU,SAAU,GAAItG,MAAOmF,EAAM4Z,cAAe,EACnE,SAAA,uDAAA,OAMT,CAEA,SAASilB,GAAgB,CACvBtY,QAAAA,EAAU,GACV7E,aAAAA,EACA8M,SAAAA,EACAD,aAAAA,EACAuQ,SAAAA,EACAnqB,SAAAA,GACD,CACO,KAAA,CAAEnR,GAAI6Y,CAAckK,EAAAA,EACpBrH,EAAekI,KAErB1F,IAAiB,CAAA,EAEXtC,MAAAA,EAAY1sB,EAAAA,QAChB,IACEwsB,EACIA,EAAaE,UAAUhb,OACrBijB,GACE,CAACA,EAAE3H,WACH,CAAC,MAAO,WAAY,QAAA,EAAUtgB,SAC5B8f,EAAaG,SAASuP,IAAIvH,EAAE7jB,EAAE,CAGpC,CAAA,EAAA,GACN,CAAC0b,CAAAA,CAAa,EAGV6f,EAAsBrsC,EAAAA,QAAQ,IAC3B0sB,EAAUzgB,IAAI8gB,IAAa,CAChCjc,GAAI,WAAWic,EAASjc,EAAE,GAC1B6gB,MAAO5E,EAASuf,OAChBzY,QAAS9G,EAASoa,SAClBzhB,OAAQqH,EAASqa,QACjBrc,KAAMgC,EAASwf,UACfh8B,MAAOic,EAAaG,SAASuP,IAAInP,EAASjc,EAAE,EAC5Cic,SAAUA,EAASjc,GACnBqd,SAAUxE,EAAYA,IAAcoD,EAASoa,SAAW,EAC1D,EAAA,EACC,CAACza,EAAW/C,CAAAA,CAAU,EAErBiO,IAAAA,EAAiB53B,EAAAA,QAAQ,IACtB67B,GAIEC,GAAY9M,GAAc/jB,OAAS,EACtC6wB,EAAS9M,EAAa,CAAA,EAAGle,EAAE,GAAGsV,SAAW,EAJpC,EAMR,CAACyV,EAAcC,EAAU9M,CAAAA,CAAa,EAEnCwd,MAAAA,EAAkBxsC,EAAAA,QAAQ,IAAA,CAC9B,GAAI,CAAC67B,EACI,OAAA,KAIT,MAAM4Q,EAAoB,CAAIJ,GAAAA,CAC3BK,EAAAA,QACAzgC,EAAAA,IAAI0gC,GAAAA,CACH,MAAMjnB,GACHinB,EAAqBxe,SAAW,GAAK,GACtCC,GAAmBue,EAAqBjnB,MAAM,EACzC,MAAA,CACLU,QAAUwR,GAAkBlS,EAC5B5U,GAAI67B,EAAqB77B,EAAAA,CAC3B,CACF,EACF,OAAO87B,GAAUH,CAAAA,CAAAA,EAChB,CAAC5Q,EAAcwQ,EAAqBzU,CAAAA,CAAe,EAEhDqJ,EAAkBjhC,EAAAA,QAAQ,IAE1B,CAACosC,GAAYC,EAAoBphC,OAAS,EACrCohC,EAAoBjyB,OAAO4U,CAAAA,EAE7BA,EACN,CAACod,EAAUC,EAAqBrd,CAAAA,CAAa,EAE1C6d,EAAc7sC,EAAAA,QAAQ,IAEtB,CAACosC,GAAYI,GAAmB1Q,EAC3B,CAAE,GAAG0Q,EAAiB,GAAG1Q,CAAAA,EAE3BA,EACN,CAACsQ,EAAUI,EAAiB1Q,CAAAA,CAAS,EAExC,OAAItP,GAAgB,KACXvK,EAAS+M,EAAc8M,CAAAA,EAEzB7Z,EAASgf,EAAiB4L,CAAAA,CACnC,CAEA,SAASC,GAASvc,EAAK,CACrB,OAAQA,EAAAA,CACN,IAAK,UACI,MAAA,eACT,IAAK,QACI,MAAA,aACT,IAAK,WACI,MAAA,gBACT,IAAK,UACI,MAAA,SACT,IAAK,UACI,MAAA,SACT,QACSA,OAAAA,CACX,CACF,CAEA,MAAMwc,WAAwBC,EAAAA,aAAAA,CAC5B7uB,YAAYhe,EAAO,CACjB,MAAMA,CAAAA,EACN,KAAK8sC,MAAQ,KACb,KAAKlhB,MAAQ1N,EAAAA,YACb,KAAKb,SAAW,GAEhB,KAAKrhB,MAAQ,CACXqtC,OAAQ,GACRjG,QAAS,CAAE,EACX2J,QAAS,GACTjE,YAAa,GACbI,gBAAiB,KACjBra,aAAc,CAAE,EAChBme,kBAAmB,EACnBtR,aAAc17B,EAAM07B,aACpBC,SAAU,KACV9K,YAAa7wB,EAAM6wB,YACnB+X,YAAa,GACb1N,SAAU,GACV+R,WAAY,KACZnL,SAAU,CAAE,EACZuB,aAAc,MACd6J,KAAM,CAAE,CAAA,CAEZ,CAEA,MAAMC,mBAAoB,CAClBC,MAAAA,EAAelkB,GAAAA,CAEjBA,GAAAA,EAAO3c,SAAS,cAChB2c,GAAAA,EAAO3c,SAAS,kBAChB2c,GAAAA,EAAO3c,SAAS,eAChB,EACA,OAAO,KAAK8gC,qBACd,EAGIC,EAAS,MAAO,CAAEpkB,OAAAA,EAAQqkB,SAAAA,KAAU,CACxC,MAAMH,EAAalkB,CAAAA,EAMfskB,IAAAA,EACJ,GACED,EAASpI,MAAMsI,GAAOA,EAAIC,UAAY,cAAA,GACtC,CAACH,EAASnyB,KAAKqyB,GAAOA,EAAIE,SAAW,WACrC,EAAA,CACMC,MAAAA,EAAgBL,EAASh8B,OAC7Bk8B,GACEA,EAAIC,UAAY,gBAAoBD,EAAIE,SAAW,WAAU,EAGjEH,EAAUI,EAAc9iC,SAAW,EAAI8iC,EAAc,CAAA,EAAGC,IAAM,IAIhE,CAEI,KAAKjiB,MAAMziB,UACRyiB,KAAAA,MAAMziB,QAAQ2kC,KAAK,IAAA,EAMpBN,GACG5hB,KAAAA,MAAMziB,QAAQ4kC,SAASP,CAAAA,GAI3BxtC,KAAAA,MAAMguC,iBAAiB,IAAA,CAAA,EAGxBhlB,EAAY,CAACC,GAAO,aAAcqkB,CAAAA,CAAAA,EAExC,KAAKhkB,SAAW,IAAA,CACdN,EAAUK,QAAQC,GAAYA,EAAAA,CAAAA,CAAAA,EAK1B,MAAA,KAAKtpB,MAAMiuC,sBACjB,MAAM,KAAKC,oBAIP,KAAKluC,MAAMmuC,eAAiB,KAAKnuC,MAAMmuC,cAAchlC,SAChDmkC,EAAA,KAAKttC,MAAMmuC,cAAchlC,OAAO,CAE3C,CAEAilC,mBAAmBC,EAAW,CAExB,KAAKryC,MAAMk/B,UAAY,KAAKl7B,MAAMwpB,YAAc6kB,EAAU7kB,WAC5D,KAAKpL,SAAS,CAAE8c,SAAU,EAAA,CAAM,EAM9BmT,EAAUC,cAAgB,CAAC,KAAKtuC,MAAMsuC,cAIxCt8B,WAAW,IAAA,CACT,KAAKq7B,oBAAmB,GACvB,GAAA,EAID,KAAKrtC,MAAMwpB,YAAc6kB,EAAU7kB,WACrC,KAAKpL,SAAS,CAAE8uB,KAAM,CAAE,EAAE7D,OAAQ,GAAIjG,QAAS,CAAE,CAAA,CAAC,CAEtD,CAEAmL,sBAAuB,CACjB,KAAKjlB,UACP,KAAKA,SAAQ,EAEX,KAAKwjB,OACP,KAAKA,MAAM0B,aAEf,CAEAC,YAAc,SAAA,CACN,KAAA,CAAEr9B,KAAAA,CAAM,EAAG,MAAMs9B,GAAS,KAAK5B,MAAM6B,WAAWn9B,OAAO,IAAA,CAAA,EAG7D,OAAOJ,EAAKwN,OAAO,CAACgwB,EAAKpU,KACnBhuB,EAAAA,KAAKguB,EAAE7pB,EAAE,EACXykB,EAAAA,gBAAgB/L,QAAQwlB,GAAOD,EAAIpiC,KAAKqiC,EAAIl+B,EAAE,CAAA,EACzCi+B,GACN,CAAE,CAAA,CAAA,EAGPvB,oBAAsB,SAAA,CACpB,KAAKP,OAAOhkB,KAAAA,EAGdolB,kBAAoB,IAAA,CACZ5H,MAAAA,EAAQ,KAAKwI,gBACdC,KAAAA,UAAY,KAAKC,aAAe1I,EACrC,KAAK2I,YAAY3I,CAAAA,EAEb,KAAKtmC,MAAMwpB,WACb,KAAKxpB,MAAMkvC,gBAAgB,KAAKlvC,MAAMwpB,SAAS,CACjD,EAGFslB,cAAgB,IAAA,CACRK,MAAAA,EAAgB,KAAKnvC,MAAMovC,SAASpzC,MACpCwtB,EAAY,KAAKxpB,MAAMwpB,UAEzB2lB,OAAAA,GAAiBA,EAAc59B,OAC1BD,GAAE,cACN5O,EAAAA,QAAQ,CAAEgkC,OAAQ,SAAU,CAAA,EAC5Bn1B,OAAO,CACN,oBAAqB,GACrB,GAAG49B,EAAc59B,MAAAA,CACnB,EAGG6O,GAA8BoJ,CAAAA,CAAAA,EAGvCylB,YAAY3I,EAAOtF,EAAY,CACzB,KAAK8L,OACP,KAAKA,MAAM0B,cAGR1B,KAAAA,MAAQuC,GACX/I,EAAM90B,OAAO,GACb,EAAA,MAAOJ,EAAMk+B,IAAAA,CACX,MAAMC,EAAYD,GAAY,KAE1BC,IACG3jB,KAAAA,MAAMziB,SAASu0B,gBAAgB,EAAA,EAEhCsD,EACF,KAAKhhC,MAAMwvC,uBAAuB,CAChCl9B,KAAM,WACN8c,KAAM,UAAA,CACR,EAEA,KAAKpvB,MAAMwvC,uBAAuB,CAChCl9B,KAAM,WACN8c,KAAM,KAAKpvB,MAAMyvC,aAAe,SAAW,UAAA,CAC7C,GAIJ,KAAKrxB,SACH,CACEyQ,aAAczd,EACds+B,iBAAkB,KAAK5C,MAAM6C,cAAa,EAC1CC,qBAAsB5O,EACtB+L,QAAS,GACTjE,YAAa,GACbnN,SAAU,KAAK3/B,MAAM0/B,aACjB,MAAM,KAAKmU,oBACX,IAAA,EAEN,IAAA,CACMN,GACG3jB,KAAAA,MAAMziB,SAAS2mC,cAGtB99B,WAAW,IAAA,CACJ4Z,KAAAA,MAAMziB,SAASu0B,gBAAgB,EAAA,GACnC,CAAA,CAAA,CACL,CAAA,EAGJ,CACEqS,UAAW,IACXC,SAAU,GACVC,OAAQ/Q,EAAAA,CACV,CAEJ,CAEAgR,iCAAiCC,EAAW,CACtC,KAAKnwC,MAAMwpB,YAAc2mB,EAAU3mB,WACrC,KAAKpL,SACH,CACEwqB,YAAa,GACbmE,QAAS,GACT1D,OAAQ,GACR3N,aAAcyU,EAAUzU,aACxBC,SAAU,KACV9K,YAAasf,EAAUtf,YACvBqY,gBAAiB,IAAA,EAEnB,IAAA,CACE,KAAKgF,kBAAiB,CAAA,CACxB,CAGN,CAEA5E,SAAW15B,GAAAA,CACT,KAAKk9B,MAAM0B,cACX,KAAKpwB,SAAS,CAAEirB,OAAQz5B,CAAAA,EAAS,KAAKwgC,YAAY,CAAA,EAGpDA,aAAeC,YAAS,IAAA,CAClB,KAAKr0C,MAAMqtC,SAAW,GACxB,KAAK4F,YAAY,KAAKD,aAAc,KAAKhzC,MAAMonC,QAAQt4B,OAAS,CAAA,EAEhE,KAAKmkC,YACH7uB,GACE,KAAK4uB,aACL,KAAKhzC,MAAMqtC,OACX,KAAKrpC,MAAM01B,UAAU,EAEvB,EAAA,GAGH,GAAK,EAERmU,OAAS,SAAA,CACDrgB,MAAAA,EAAY,KAAKxpB,MAAMwpB,UACvBkK,EAAU,KAAK1zB,MAAMmzB,SAAS/X,KAAKkd,GAAQA,EAAK3nB,KAAO6Y,CAAAA,EAE7D,MAAM,KAAKxpB,MAAMswC,gBAAgB5c,EAAUA,EAAQ/iB,GAAK,IAAA,CAAA,EAG1Dm5B,SAAW,SAAA,CACHtgB,MAAAA,EAAY,KAAKxpB,MAAMwpB,UACvBkK,EAAU,KAAK1zB,MAAMmzB,SAAS/X,KAAKkd,GAAQA,EAAK3nB,KAAO6Y,CAAAA,EACvDnR,EAAa,MAAM,KAAKrY,MAAM4oB,cAAa,EAEjD,GAAI8K,EAAS,CACX,MAAM6c,EAAM,MAAMljB,OAAOmjB,OAAOC,eAAe,CAC7CrN,QAAS,CACP,CACE/kC,KAAM,kBACNqyC,WAAY,CAAC,MAAO,MAAO,MAAO,MAAO,KAAM,CACjD,CACD,CAAA,CACH,EAEIH,GACGvwC,KAAAA,MAAMkqB,UAAU,sBAAuB,CAC1CV,UAAAA,EACAnR,WAAAA,EACAs4B,SAAUJ,EAAI,CAAE,EAChBK,WAAYC,GAAAA,CACNA,GACF,KAAK3C,kBAAiB,CAE1B,CAAA,CACF,CAEJ,CAAA,EAGF4C,SAAW,MAAM/H,GAAAA,CACTgI,MAAAA,EAAuB,MAAMp/B,EAAK,4BAA6B,CACnE20B,MAAO,KAAK0I,aAAagC,UAAS,CAAA,CACpC,EAGML,EAAW,GADf5H,GAAeA,EAAYkI,QAAQ,QAAS,EAAA,EAAIA,QAAQ,OAAQ,GAAA,GAC5B,cAAA,OAEtC5jB,OAAOmjB,OAAOU,SACZH,EACAJ,EACA,qBAAA,CAAA,EAIJQ,qBAAuB,CAAC1a,EAAgBrlB,IAAAA,CAEjC07B,KAAAA,MAAMsE,iBACThgC,GACMqlB,EAAe4a,SACVjgC,EAAKG,OAAOipB,GAAKA,EAAE7pB,KAAO8lB,EAAe9lB,EAAE,EAE3CS,EAAKtF,IAAI0uB,GACPA,EAAE7pB,KAAO8lB,EAAe9lB,GAAK8lB,EAAiB+D,CACvD,EAGJ,IACSppB,CACT,EAGGpR,KAAAA,MAAMsxC,sBAAsB7a,EAAe9lB,EAAE,CAAA,EAGpDw4B,oBAAsB,IAAA,CACd3f,MAAAA,EAAY,KAAKxpB,MAAMwpB,UAK3BkK,OAJc,KAAK1zB,MAAMmzB,SAAS/X,KAClCsY,GAAWA,EAAQ/iB,KAAO6Y,CAAAA,GAI1B,KAAKxtB,MAAMqtC,SAAW,IACtB,KAAKrtC,MAAMonC,QAAQt4B,SAAW,IAC7B,KAAK9O,MAAMkxC,KAAKpiC,SAAW,GACzB,KAAK9O,MAAMkxC,KAAK9c,QAAU,QACzB,KAAKp0B,MAAMkxC,KAAK7c,UAAY,OAAA,EAIpC,MAAMwf,mBAAoB,CACpB,GAAA,CAAC,KAAK1G,sBACD,OAAA,KAGH,KAAA,CAAE/3B,KAAAA,CAAS,EAAA,MAAMs9B,GACrB,KAAK5B,MACF6B,SAAQ,EACRjsC,QAAQ,CAAEgkC,OAAQ,MAAO,CAAA,EACzBl1B,OAAO,CAAC,CAAEyU,QAAS,CAAEsrB,SAAU,SAAU,CAAE,CAAE,CAAA,CAAA,EAGlD,OAAO9E,GAAUr7B,CAAAA,CACnB,CAEAm4B,iBAAmB,IAAA,CACjB,KAAKnrB,SAAS,CAAE8c,SAAU,EAAA,CAAK,CAAA,EAGjC0O,aAAe4H,GAAAA,CACb,KAAKpzB,SAAS,CAAEwqB,YAAa4I,CAAAA,CAAK,CAAA,EAGpC7H,WAAatrC,GAAAA,CACPA,GAAAA,EAAKozC,KAAO3mC,EAAAA,OAAQ,CAChB0e,MAAAA,EAAY,KAAKxpB,MAAMwpB,UACvBkK,EAAU,KAAK1zB,MAAMmzB,SAAS/X,KAClCsY,GAAWA,EAAQ/iB,KAAO6Y,CAAAA,EAE5B,KAAKxpB,MAAM0xC,cAAc,CAAE,GAAGhe,EAASr1B,KAAAA,CAAAA,CAAK,EAC5C,KAAK+f,SAAS,CAAEwqB,YAAa,EAAA,CAAM,CACrC,CAAA,EAGFrB,sBAAwB,IAAA,CACtB,KAAM,CAAE/d,UAAAA,EAAW8d,kBAAAA,GAAsB,KAAKtnC,MACxCsC,EAAM,uBAAyBknB,GAAa,eAElD,KAAKxpB,MAAMsgB,UAAU,CAAE,CAAChe,CAAAA,EAAM,CAACglC,CAAAA,CAAkB,CAAA,EAGnDjzB,aAAe,MAAM2B,GAAAA,CACbwT,MAAAA,EAAY,KAAKxpB,MAAMwpB,UACvBkK,EAAU,KAAK1zB,MAAMmzB,SAAS/X,KAClCsY,GAAWA,EAAQ/iB,KAAO6Y,CAAAA,EAG5B,OAAQxT,EAAAA,CACN,IAAK,OACEhW,KAAAA,MAAMkqB,UAAU,cAAe,CAClCynB,mBAAoBnoB,CAAAA,CACtB,EACA,MACF,IAAK,SACExpB,KAAAA,MAAM4xC,cAAcpoB,CAAAA,EACzB,MACF,IAAK,QACExpB,KAAAA,MAAM6xC,sBAAsBroB,CAAAA,EACjC,MACF,IAAK,SACExpB,KAAAA,MAAM8xC,cAActoB,CAAAA,EACzB,MACF,IAAK,SACH,MAAMuf,EAAc,KAAKgJ,gBAAgBre,EAASlK,CAAAA,EAClD,KAAKsnB,SAAS/H,CAAAA,EACd,MACF,IAAK,iBACC,KAAK/sC,MAAM0/B,cACb,KAAK17B,MAAMsgB,UAAU,CAAE,CAAC,iBAAmBkJ,GAAY,EAAA,CAAM,EAC7D,KAAKpL,SAAS,CAAEsd,aAAc,GAAOC,SAAU,IAAA,CAAK,IAEpD,KAAK37B,MAAMsgB,UAAU,CAAE,CAAC,iBAAmBkJ,GAAY,EAAA,CAAK,EAC5D,KAAKpL,SACH,CACEyQ,aAAc,CAAE,EAChB6gB,iBAAkB,EAClBtM,QAAS,CAAE,EACXiG,OAAQ,GACR6D,KAAM,CAAE,EACRxR,aAAc,EAAA,EAEhB,IAAA,CACE,KAAKwS,kBAAiB,CAAA,CACxB,GAGJ,MACF,IAAK,iBAAkB,CACrB,KAAK9vB,SAAS,CAAE8uB,KAAM,CAAE,CAAA,EAAI,IAAA,CACpB9J,MAAAA,EAAU,KAAKpnC,MAAMonC,QACvBA,EAAQt4B,OAAS,EACnB,KAAKknC,aAAa,CAAI5O,GAAAA,CAAAA,CAAQ,EAE9B,KAAK8K,kBAAiB,EAEpB,KAAKlyC,MAAMqtC,SAAW,IACnBC,KAAAA,SAAS,KAAKttC,MAAMqtC,MAAM,CACjC,CACF,EACA,KACF,CACA,IAAK,iBACC,KAAKrtC,MAAM60B,aACb,KAAK7wB,MAAMsgB,UAAU,CAAE,CAAC,gBAAkBkJ,GAAY,EAAA,CAAK,EAC3D,KAAKpL,SAAS,CAAEyS,YAAa,EAAA,CAAM,IAEnC,KAAK7wB,MAAMsgB,UAAU,CAAE,CAAC,gBAAkBkJ,GAAY,EAAA,CAAM,EAC5D,KAAKpL,SAAS,CAAEyS,YAAa,EAAA,CAAK,GAEpC,KAEJ,CAAA,EAGFkhB,gBAAgBre,EAAS/iB,EAAI,CAC3B,KAAM,CAAEga,WAAAA,CAAY,EAAG,KAAK3qB,MAAMovC,SAASpzC,OAAS,GAEpD,OAAI2uB,IAIC+I,EAaEA,EAAQr1B,KAZTsS,IAAO,WACF,oBACEA,IAAO,YACT,sBACEA,IAAO,gBACT,gBACGA,EAGL,KAFE,eAMb,CAEAshC,gBAAgBve,EAAS/iB,EAAI,CACpB,MAAA,CACLtS,KAAM,iBAAiBsS,CAAAA,GACvB21B,MAAO,KAAKwI,cAAa,EAAGnI,UAAU,CAAEC,KAAM,SAAA,CAAU,CAAA,CAE5D,CAEAlM,MAAQ/pB,GACC,KAAK3Q,MAAMu8B,gBAAgBhwB,SAASoE,CAAAA,EAG7CirB,UAAYjrB,GACH,KAAK3Q,MAAMkyC,oBAAoB3lC,SAASoE,CAAAA,EAGjD0iB,cAAgBh1B,GACEA,EAAKozC,SACL,GACP,KAAKzxC,MAAMmyC,YAAY9zC,CAAAA,EAEzB,KAGT+zC,iBAAmB,SAAA,CACjB,KAAKh0B,SAAS,CAAE0qB,YAAa,EAAA,CAAK,EAE5B,KAAA,CAAEtf,UAAAA,CAAS,EAAK,KAAKxpB,MAErB,CAAEoR,KAAAA,GAAS,MAAMs9B,GACrBp9B,GAAE,cACCC,EAAAA,OAAO,CAAEwlB,QAAS,GAAMV,WAAY,GAAO3C,QAASlK,CAAU,CAAA,EAC9DhY,OAAO,GACP9O,EAAAA,QAAQ,CAAEgkC,OAAQ,SAAU,CAAA,CAAA,EAE7B7X,IAAAA,EAAeqQ,GAAoB9tB,CAAAA,EAEvC,MAAMqvB,EAAU,CAAEW,QAAS,CAAE,CAAA,EAEhB/X,EAAAA,QAAQyF,GAAAA,CACnB,KAAM,CAAEuQ,KAAAA,CAAAA,EAASF,GAAkBtQ,EAAc,CAC/C,GAAGC,EACHuH,WAAY,EAAA,CACd,EAEeuK,EAAAA,GAAavB,EAAMxQ,CAAAA,EAE1BuS,EAAAA,QAAUX,EAAQW,QACtBX,EAAQW,QAAQnnB,OAAOolB,EAAK+B,OAAO,EACnC/B,EAAK+B,OAAAA,CACX,EAEMzvB,MAAAA,EAAK,4BAA6B8uB,CAAAA,EACxC,MAAM,KAAK4M,qBAAmB,EAGhClF,YAAc,MAAMliB,GAAAA,CAClB,KAAK7H,SAAS,CAAE8qB,gBAAiBjjB,CAAAA,CAAQ,CAAA,EAG3CwjB,kBAAoB,SAAA,CACZ,KAAA,CAAEjgB,UAAAA,CAAS,EAAK,KAAKxpB,MACrB,CAAEkpC,gBAAAA,CAAe,EAAK,KAAKltC,MAE3B,CAAEoV,KAAAA,GAAS,MAAMs9B,GACrBp9B,GAAE,cACCC,EAAAA,OAAO,CAAEwlB,QAAS,GAAMrD,QAASlK,CAAU,CAAA,EAC3ChY,OAAO,GACP9O,EAAAA,QAAQ,CAAEgkC,OAAQ,SAAU,CAAA,CAAA,EAE3B7X,EAAeqQ,GAAoB9tB,CAAAA,EAEzC,IAAI2lB,EAAU,EAED1N,EAAAA,QAAQyF,GAAAA,CACdA,EAAMkI,YACTD,GAAWjI,EAAMvJ,OACnB,CACF,EAEmB2jB,EAAkBnS,IAElB,GACjB,MAAM,KAAKqb,mBAGb,KAAKh0B,SAAS,CAAE8qB,gBAAiB,IAAA,CAAK,CAAA,EAGxCQ,kCAAoC,MAAMrK,GAAAA,CAExC,MAAMgT,EAA6BlR,GAAwB,CACzD,CACExwB,GAAI,OACJ+iB,QAAS,KAAK1zB,MAAMwpB,UACpBuN,QAAS,GACTV,WAAY,GACZ9Q,OAAQ8Z,EACRzU,KAAM+D,GAAAA,EACNve,MAAO,mCACT,CAAA,CACD,EAGD,KAAKgO,SAAS,CACZyQ,aAAc,CAAIwjB,GAAAA,KAA+B,KAAKr2C,MAAM6yB,YAAa,CAAA,CAC3E,EAGA,MAAMld,EAAK,4BAA6B,CACtC2jB,MAAO+c,CAAAA,CACT,EACA,MAAM,KAAKhF,qBAAmB,EAGhC7D,mBAAqB,MAAMna,GAAAA,CACzB,KAAK8a,cAAc,CACjBmI,WAAY,wBACZ/gC,OAAQ,CAAEZ,GAAI,CAAE41B,OAAQlX,CAAI,CAAE,CAAA,CAChC,CAAA,EAGF4a,YAAc,MAAO5rC,EAAMgxB,IAAAA,CACnB5e,MAAAA,EAAW,MAAOpS,EAAMuR,IAAAA,CAC5B,KAAKwO,SAAS,CAAE0qB,YAAa,EAAA,CAAK,EAE5B,KAAA,CAAE13B,KAAAA,GAAS,MAAMs9B,GACrBp9B,GAAE,cACCC,EAAAA,OAAO,CAAEZ,GAAI,CAAE41B,OAAQlX,CAAI,CAAE,CAAA,EAC7B7d,OAAO,GACP9O,EAAAA,QAAQ,CAAEgkC,OAAQ,SAAU,CAAA,CAAA,EAE7B7X,IAAAA,EAAeqQ,GAAoB9tB,CAAAA,EAEvC,MAAMqvB,EAAU,CAAE8R,QAAS,CAAE,EAAEnR,QAAS,CAAE,CAAA,EAGtC/iC,IAAS,YAEHuR,EAAA,CAAC,CAACif,EAAazT,KAAKof,GAAK,CAACA,EAAEzD,OAAO,GAGvCyb,MAAAA,EAAQ,IAAI1iB,IAAIT,CAAAA,EAEThG,EAAAA,QAAQyF,GAAAA,CAOnB,GANIzwB,IAAS,WAAaywB,EAAMuH,YAM5B,CAACmc,EAAMljB,IAAIR,EAAMne,EAAE,EAGrB,OAGF,MAAMkd,EAAc,CAClB,GAAGiB,EACH,CAACzwB,GAAOuR,CAAAA,EAGNvR,IAAS,WAAaywB,EAAM4E,UAAY9jB,IAC1Cie,EAAYwI,WAAa,IAG3B,KAAM,CAAEgJ,KAAAA,CAASF,EAAAA,GAAkBtQ,EAAchB,CAAAA,EAMlC+S,EAAAA,GAAavB,EAAMxQ,CAAAA,EAE1B0jB,EAAAA,QAAU9R,EAAQ8R,QACtB9R,EAAQ8R,QAAQt4B,OAAOolB,EAAKkT,OAAO,EACnClT,EAAKkT,QACDnR,EAAAA,QAAUX,EAAQW,QACtBX,EAAQW,QAAQnnB,OAAOolB,EAAK+B,OAAO,EACnC/B,EAAK+B,QACD9L,EAAAA,MAAQmL,EAAQnL,MACpBmL,EAAQnL,MAAMrb,OAAOolB,EAAK/J,KAAK,EAC/B+J,EAAK/J,KAAAA,CACX,EAEM3jB,MAAAA,EAAK,4BAA6B8uB,CAAAA,EACxC,MAAM,KAAK4M,sBAEP,KAAKzhB,MAAMziB,SACRyiB,KAAAA,MAAMziB,QAAQ2kC,KAAKjf,EAAa,CAAA,EAAGle,GAAI,SAAU,EAAA,CACxD,EAGF,GACEtS,IAAS,UACTA,IAAS,SACTA,IAAS,WACTA,IAAS,OACT,CACM,KAAA,CAAE+S,KAAAA,GAAS,MAAMs9B,GACrBp9B,GAAE,cACCC,EAAAA,OAAO,CAAEZ,GAAI,CAAE41B,OAAQlX,CAAI,EAAGgH,WAAY,EAAK,CAAA,EAC/C7kB,OAAO,GACP9O,EAAAA,QAAQ,CAAEgkC,OAAQ,SAAU,CAAA,CAAA,EAI7B7X,GAFiBqQ,GAAoB9tB,CAAAA,EAExBtG,OAAS,EAAG,CACtB9K,KAAAA,MAAMkqB,UAAU,2BAA4B,CAC/CoM,UAAW,IAAA,CACJt2B,KAAAA,MAAMkqB,UAAU,aAAc,CAAE7rB,KAAAA,EAAMgqC,SAAU53B,CAAAA,CAAS,CAChE,EACA+lB,cAAe,yBAAA,CACjB,EACA,MACF,CACF,CAEIn4B,IAAS,UAGXoS,EAAS,UAAW,IAAA,EAEfzQ,KAAAA,MAAMkqB,UAAU,aAAc,CAAE7rB,KAAAA,EAAMgqC,SAAU53B,CAAAA,CAAS,CAChE,EAGFu5B,iBAAmB,MAAM3a,GAAAA,CACjBojB,MAAAA,EAAqB,MAAMpjB,GAAAA,CAC/B,KAAKjR,SAAS,CAAE0qB,YAAa,EAAA,CAAK,EAE5B,KAAA,CAAE13B,KAAAA,GAAS,MAAMs9B,GACrBp9B,GAAE,cACCC,EAAAA,OAAO,CAAEZ,GAAI,CAAE41B,OAAQlX,CAAI,CAAE,CAAA,EAC7B7d,OAAO,GACP9O,EAAAA,QAAQ,CAAEgkC,OAAQ,SAAU,CAAA,CAAA,EAG3BjG,EAAU,CACdnL,MAAOlkB,EACJwN,OAAO,CAAC2d,EAAiBzN,IACjByN,EAAgBtiB,OACrBknB,GAAwBuR,GAAmB5jB,CAAAA,CAAAA,CAAAA,EAE5C,CAAA,CAAE,EACJhjB,IAAI,CAAC,CAAEu1B,WAAAA,EAAY,GAAGvS,MAAa,CAAE,GAAGA,CAAAA,EAAM,CAAA,EAG7Cnd,MAAAA,EAAK,4BAA6B8uB,CAAAA,EAExC,MAAM,KAAK4M,qBAAmB,EAGhC,MAAM,KAAKsF,+BACTtjB,EACA,+BACAojB,CAAAA,CAAAA,EAIJ1I,cAAgB,MAAM1a,GAAAA,CACdujB,MAAAA,EAAkB,MAAMvjB,GAAAA,CAC5B,KAAKjR,SAAS,CAAE0qB,YAAa,EAAA,CAAK,EAE5B,KAAA,CAAE13B,KAAAA,GAAS,MAAMs9B,GACrBp9B,GAAE,cACCC,EAAAA,OAAO,CAAEZ,GAAI,CAAE41B,OAAQlX,CAAI,CAAE,CAAA,EAC7B7d,OAAO,GACP9O,EAAAA,QAAQ,CAAEgkC,OAAQ,SAAU,CAAA,CAAA,EAE7B7X,IAAAA,EAAeqQ,GAAoB9tB,CAAAA,EAEjCohC,MAAAA,EAAQ,IAAI1iB,IAAIT,CAAAA,EAChBoR,EAAU,CAAE8R,QAAS,CAAE,EAAEnR,QAAS,CAAE,CAAA,EAE7B/X,EAAAA,QAAQyF,GAAAA,CACnB,MAAM+jB,EAAW/jB,EAAME,UAKnB,GAAA,CAACwjB,EAAMljB,IAAIR,EAAMne,EAAE,GAAMkiC,GAAYL,EAAMljB,IAAIujB,CAAY,EAC7D,OAGF,KAAM,CAAExT,KAAAA,CAAI,EAAKD,GAAkBvQ,EAAcC,EAAMne,EAAE,EAM1CiwB,EAAAA,GAAavB,EAAMxQ,CAAAA,EAE1B0jB,EAAAA,QAAUlT,EAAKkT,QACnB9R,EAAQ8R,QAAQt4B,OAAOolB,EAAKkT,OAAO,EACnClT,EAAKkT,QACDnR,EAAAA,QAAU/B,EAAK+B,QACnBX,EAAQW,QAAQnnB,OAAOolB,EAAK+B,OAAO,EACnC/B,EAAK+B,OAAAA,CACX,EAEMzvB,MAAAA,EAAK,4BAA6B8uB,CAAAA,EACxC,MAAM,KAAK4M,qBAAmB,EAGhC,MAAM,KAAKsF,+BACTtjB,EACA,4BACAujB,CAAAA,CAAAA,EAIJD,+BAAiC,MAAOtjB,EAAKmH,EAAeF,IAAAA,CACpD,KAAA,CAAEllB,KAAAA,GAAS,MAAMs9B,GACrBp9B,GAAE,cACCC,EAAAA,OAAO,CAAEZ,GAAI,CAAE41B,OAAQlX,CAAI,EAAGgH,WAAY,EAAK,CAAA,EAC/C7kB,OAAO,GACP9O,EAAAA,QAAQ,CAAEgkC,OAAQ,SAAU,CAAA,CAAA,EAEZxH,GAAoB9tB,CAAAA,EACxBtG,OAAS,EACnB9K,KAAAA,MAAMkqB,UAAU,2BAA4B,CAC/CoM,UAAW,IAAA,CACTA,EAAUjH,CAAAA,CACZ,EACAmH,cAAAA,CAAAA,CACF,EAEAF,EAAUjH,CAAAA,CACZ,EAGF6a,cAAgB,MAAM7a,GAAAA,CACpB,MAAM1d,EAAK,4BAA6B,CACtCyvB,QAAS/R,EAAIvjB,IAAI6E,IAAO,CAAEA,GAAAA,EAAIic,SAAU,IAAA,EAAK,CAAA,CAC/C,EAEA,MAAM,KAAKygB,qBAAmB,EAGhCvI,aAAe,MAAMzV,GAAAA,CACb,KAAA,CAAEje,KAAAA,GAAS,MAAMs9B,GACrBp9B,GAAE,cACCC,EAAAA,OAAO,CAAEZ,GAAI,CAAE41B,OAAQlX,CAAI,CAAE,CAAA,EAC7B7d,OAAO,GACP9O,EAAAA,QAAQ,CAAEgkC,OAAQ,SAAU,CAAA,CAAA,EAE3B7X,EAAeqQ,GAAoB9tB,CAAAA,EAenC0hC,EAAO,CACXC,MAAO,KACP1P,aAAc,MACdU,WAAY,CAjBSlV,EAAa,CAAE,EAACgI,eACnC,CACEzG,MAAO,iBACP4iB,GAAI,KACJpjC,MAAOif,EAAa,CAAE,EAACgI,eACvBvkB,KAAM,QAAA,EAER,CACE8d,MAAO,QACP4iB,GAAI,KACJpjC,MAAOif,EAAa,CAAE,EAAC2C,MACvBlf,KAAM,IAAA,CAMkB,EAC5B8O,QAAS,CACP,CACE4xB,GAAI,MACJ5iB,MAAO,WACPxgB,MAAOif,EAAa,CAAE,EAACjc,SACvBN,KAAM,IACR,CACD,CAAA,EAGEtS,KAAAA,MAAMkqB,UAAU,YAAa,CAAE4oB,KAAAA,CAAAA,CAAK,CAAA,EAG3CvO,eAAiB,CAAC30B,EAAOwzB,IAAAA,CACvB,KAAKhlB,SAAS,CAAEilB,aAAczzB,CAAAA,CAAM,EACpC,KAAKwO,SAAS,CAAE0jB,SAAU,CAAE,GAAG,KAAK9lC,MAAM8lC,SAAUhQ,OAAQ,SAAU,CAAA,CAAE,EACxE,KAAKkgB,aAAa,CAAI5O,GAAAA,CAAAA,CAAQ,EAC1B,KAAKpnC,MAAMqtC,SAAW,IACnBC,KAAAA,SAAS,KAAKttC,MAAMqtC,MAAM,CACjC,EAGF9F,oBAAsB,CAACO,EAAa9tB,IAAAA,CAClC,GAAIA,IAAS,SAAU,CACrB,KAAM,CAACi9B,GAAa,KAAKjzC,MAAMwjC,YAAYjyB,OACzCitB,GAAKA,EAAE7tB,KAAO,KAAK3U,MAAM8lC,SAASnxB,EAAE,EAEtC,KAAKyN,SAAS,CAAEilB,aAAc4P,EAAU5P,YAAAA,CAAa,EACrD,KAAK2O,aAAa,CAAIiB,GAAAA,EAAUlP,UAAAA,CAAW,CAAA,MAEvCD,EAAYhS,SACd,KAAK1T,SAAS,CAAEilB,aAAcS,EAAYT,YAAAA,CAAa,EACvD,KAAK2O,aAAa,CAAIlO,GAAAA,EAAYC,UAAAA,CAAW,GAGjD,KAAK3lB,SAAS,CAAE0jB,SAAU,CAAE,GAAG,KAAK9lC,MAAM8lC,SAAU,GAAGgC,CAAY,CAAA,CAAE,CAAA,EAGvER,eAAiB,IAAA,CACf,KAAKllB,SAAS,CAAEilB,aAAc,KAAA,CAAM,EACpC,KAAKjlB,SAAS,CAAE0jB,SAAU,CAAE,CAAA,CAAC,EACxBkQ,KAAAA,aAAa,CAAA,CAAE,EAChB,KAAKh2C,MAAMqtC,SAAW,IACnBC,KAAAA,SAAS,KAAKttC,MAAMqtC,MAAM,CACjC,EAGFhF,eAAiB,CAAC6O,EAAW/O,IAAAA,CACtB6N,KAAAA,aACH,KAAKh2C,MAAMonC,QAAQt3B,IAAI0yB,GAAMA,IAAM0U,EAAY/O,EAAgB3F,CAAAA,CAAAA,EAEjE,KAAKpgB,SAAS,CACZ0jB,SAAU,CACR,GAAG,KAAK9lC,MAAM8lC,SACdhQ,OAAQ,KAAK91B,MAAM8lC,UAAY,SACjC,CAAA,CACF,EACI,KAAK9lC,MAAMqtC,SAAW,IACnBC,KAAAA,SAAS,KAAKttC,MAAMqtC,MAAM,CACjC,EAGF/E,eAAiB/yB,GAAAA,CACVygC,KAAAA,aAAa,KAAKh2C,MAAMonC,QAAQ7xB,OAAOitB,GAAKA,IAAMjtB,CAAAA,CAAAA,EACnD,KAAKvV,MAAMonC,QAAQt4B,SAAW,GAChC,KAAKsT,SAAS,CAAE0jB,SAAU,CAAE,CAAA,CAAC,EAC7B,KAAK1jB,SAAS,CAAEilB,aAAc,KAAA,CAAM,GAEpC,KAAKjlB,SAAS,CACZ0jB,SAAU,CACR,GAAG,KAAK9lC,MAAM8lC,SACdhQ,OAAQ,KAAK91B,MAAM8lC,UAAY,SACjC,CAAA,CACF,EAEE,KAAK9lC,MAAMqtC,SAAW,IACnBC,KAAAA,SAAS,KAAKttC,MAAMqtC,MAAM,CACjC,EAGFc,cAAgB,MAAMgJ,GAAAA,CAChB/P,IAAAA,EAAU,KAAKpnC,MAAMonC,QACrB+P,EAAKb,aACPlP,EAAUA,EAAQ7xB,OAAOitB,GAAKA,EAAE8T,aAAea,EAAKb,UAAU,GAE5Da,EAAKpP,YACP,KAAK3lB,SAAS,CAAE0jB,SAAU,CAAE,GAAGqR,EAAMrhB,OAAQ,OAAQ,CAAA,CAAE,EACvD,KAAK1T,SAAS,CAAEilB,aAAc8P,EAAK9P,YAAAA,CAAa,EAChD,KAAK2O,aAAa,CAAImB,GAAAA,EAAKpP,UAAAA,CAAW,IAEtC,KAAK3lB,SAAS,CACZ0jB,SAAU,CACR,GAAG,KAAK9lC,MAAM8lC,SACdhQ,OAAQ,KAAK91B,MAAM8lC,UAAY,SACjC,CAAA,CACF,EACA,KAAKkQ,aAAa,CAAI5O,GAAAA,EAAS+P,CAAAA,CAAK,GAElC,KAAKn3C,MAAMqtC,SAAW,IACnBC,KAAAA,SAAS,KAAKttC,MAAMqtC,MAAM,CACjC,EAGFtE,iBAAmB,MAAO1mC,EAAMgxB,IAAAA,CAC9B,OAAQhxB,EAAAA,CACN,IAAK,mBACH,UAAWsS,KAAM0e,EAAK,CACd+jB,MAAAA,EAAQziC,EAAGg1B,MAAM,GAAA,EACvB,MAAMh0B,EAAK,4BAA6B,CAAEhB,GAAIyiC,EAAM,CAAE,CAAA,CAAC,CACzD,CACA,KAAK/F,oBAAmB,EACxB,MACF,IAAK,OACH,UAAW18B,KAAM0e,EAAK,CACd+jB,MAAAA,EAAQziC,EAAGg1B,MAAM,GAAA,EACvB,MAAMh0B,EAAK,0BAA2B,CAAEhB,GAAIyiC,EAAM,CAAE,CAAA,CAAC,CACvD,CACA,KAEJ,CAAA,EAGFpB,aAAe,MAAMjO,GAAAA,CACfA,GAAAA,EAAWj5B,OAAS,EAAG,CACzB,MAAMuoC,EAAgBtP,EACnBxyB,OAAO4hC,GAAQ,CAAC,CAACA,EAAKb,UAAU,EAChCxmC,IAAI0yB,GAAKA,EAAEjtB,MAAM,EACd,CAAE6xB,QAAAA,CAAAA,EAAY,MAAMzxB,EAAK,+BAAgC,CAC7DoyB,WAAYA,EAAWxyB,OAAO4hC,GAAQ,CAACA,EAAKb,UAAU,CAAA,CACxD,EACMgB,EAAkB,KAAKt3C,MAAMqnC,eAAiB,KAAO,MAAQ,OAC9D2L,KAAAA,aAAe,KAAKD,UAAUx9B,OAAO,CACxC,CAAC+hC,GAAkB,CAAIlQ,GAAAA,EAAYiQ,GAAAA,CAAc,CAAA,CACnD,EAEA,KAAKj1B,SAAS,CAAEglB,QAASW,CAAAA,EAAc,IAAA,CAChCkL,KAAAA,YAAY,KAAKD,aAAc,EAAA,CAAA,CACtC,CAAA,MAEA,KAAK5wB,SACH,CACEyQ,aAAc,CAAE,EAChB6gB,iBAAkB,EAClBtM,QAASW,CAAAA,EAEX,IAAA,CACE,KAAKmK,kBAAiB,CAAA,CACxB,EAIA,KAAKlyC,MAAMkxC,KAAKpiC,SAAW,GAC7B,KAAKyoC,UAAS,CAChB,EAGFA,UAAY,CAACnjB,EAAOC,EAASmjB,EAAWC,IAAAA,CAChCrQ,MAAAA,EAAU,KAAKpnC,MAAMonC,QACrBpC,EAAaoC,EAAQt4B,OAAS,EAC9BsxB,EAAYuQ,GAAUvc,GAAQ,KAAKp0B,MAAMkxC,KAAK9c,KAAQA,EACtDsjB,EAAerjB,GAAU,KAAKr0B,MAAMkxC,KAAK7c,QACzCsjB,EAAgBhH,GACnB6G,GAAY,KAAKx3C,MAAMkxC,KAAKsG,SAAYA,EAErCI,EAAmBJ,EAErBC,EADA,KAAKz3C,MAAMkxC,KAAKuG,YAGdI,EAAmB,SAAUC,EAAM1X,EAAWsX,EAAW,CACzDtX,IAAc,YACX4S,EAAAA,aAAe8E,EAAK9E,aAAa+E,QAAQ,CAC5C1d,WAAYqd,CAAAA,CACd,GAGG1E,EAAAA,aAAe8E,EAAK9E,aAAa+E,QAAQ,CAC5C,CAAC3X,GAAYsX,CAAAA,CACf,CAAA,EAGIM,EAAgB,SAAUF,EAAM1X,EAAWsX,EAAW,CACtDtX,IAAc,WACX4S,EAAAA,aAAe8E,EAAK/E,UAAUgF,QAAQ,CACzC1d,WAAYqd,CAAAA,CACd,EACK1E,EAAAA,aAAe8E,EAAK9E,aAAa+E,QAAQ,CAC5Chd,QAAS2c,CAAAA,CACX,GAEK1E,EAAAA,aAAe8E,EAAK/E,UAAUgF,QAAQ,CACzC,CAAC3X,GAAYsX,CAAAA,CACf,CACF,EAIIO,EAA2B,SAC/BH,EACAH,EACAC,EAAe,CAEVD,IAIDA,IAAkB,YACf3E,EAAAA,aAAe8E,EAAK9E,aAAa+E,QAAQ,CAC5C1d,WAAYud,CAAAA,CACd,GAGG5E,EAAAA,aAAe8E,EAAK9E,aAAa+E,QAAQ,CAC5C,CAACJ,GAAgBC,CAAAA,CACnB,EAAA,EAGF,OAAQ,GAAA,CAEN,IAAK,CAACxjB,EACayjB,EAAA,KAAMzX,EAAWsX,CAAAA,EAClC,MAIF,KAAK1S,EACH,KAAKgR,aAAa,CAAI5O,GAAAA,CAAAA,CAAQ,EACbyQ,EAAA,KAAMzX,EAAWsX,CAAAA,EAClC,MAIF,IAAK,CAAC1S,EACUgT,EAAA,KAAM5X,EAAWsX,CAAAA,EAC/B,KAGJ,CAEyBO,EAAA,KAAMN,EAAeC,CAAAA,EACzC3E,KAAAA,YAAY,KAAKD,aAAchO,CAAAA,CAAAA,EAGtCjQ,OAAS,CAACmjB,EAAe7jB,IAAAA,CACnBmjB,IAAAA,EACAC,EAGAS,IAAkB,KAAKl4C,MAAMkxC,KAAK9c,OACxBojB,EAAA,KAAKx3C,MAAMkxC,KAAKsG,UACdC,EAAA,KAAKz3C,MAAMkxC,KAAKuG,YAC9B,KAAKr1B,SAAS,CACZ8uB,KAAM,CACJ,GAAG,KAAKlxC,MAAMkxC,KACd7c,QAAAA,CACF,CAAA,CACF,IAIYmjB,EAAA,KAAKx3C,MAAMkxC,KAAK9c,MACdqjB,EAAA,KAAKz3C,MAAMkxC,KAAK7c,QAC9B,KAAKjS,SAAS,CACZ8uB,KAAM,CACJ9c,MAAO8jB,EACP7jB,QAAAA,EACAmjB,UAAW,KAAKx3C,MAAMkxC,KAAK9c,MAC3BqjB,YAAa,KAAKz3C,MAAMkxC,KAAK7c,OAC/B,CAAA,CACF,GAGF,KAAKkjB,UAAUW,EAAe7jB,EAASmjB,EAAWC,CAAAA,EAC9C,KAAKz3C,MAAMqtC,SAAW,IACnBC,KAAAA,SAAS,KAAKttC,MAAMqtC,MAAM,CACjC,EAGF5pB,QAAS,CACP,KAAM,CACJ0T,SAAAA,EACAta,eAAAA,EACAqa,OAAAA,EACAwC,WAAAA,EACAC,aAAAA,EACA/L,gBAAAA,EACAof,gBAAAA,EACA9e,UAAAA,EACAiqB,aAAAA,EACA7M,kBAAAA,EACA9d,UAAAA,EACAjD,WAAAA,GACE,KAAKvmB,MACH,CACJ6uB,aAAAA,EACAke,QAAAA,EACAjE,YAAAA,EACAhH,SAAAA,EACAoH,gBAAAA,EACA0G,qBAAAA,EACAhH,YAAAA,EACAlN,aAAAA,EACAC,SAAAA,EACA9K,YAAAA,CACD,EAAG,KAAK70B,MAEH03B,EAAUP,EAAS/X,KAAKsY,GAAWA,EAAQ/iB,KAAO6Y,CAAAA,EAClDuf,EAAc,KAAKgJ,gBAAgBre,EAASlK,CAAAA,EAE9C,GAAA,CAACuf,GAAe,CAACgE,EAGnB,aAAQqH,GAAAA,CAASj3B,GAAG,YAAY8zB,QAAO,EAAA,GAGzC,MAAMr+B,EAAWiG,EACdw7B,QAAQh5B,GAAKA,EAAEhD,UAAU,EACzB+C,KAAKxI,GAAYA,EAASjC,KAAO4V,CAAAA,EAE9B0iB,EAAmB,CAAC8D,GAAW,CAACvjB,GAAa2J,EAASroB,SAAW,EAEjE+9B,EACJrf,GACAA,IAAc,YACdA,IAAc,aACdA,IAAc,gBAEV2d,EAAe,KAAK8K,gBAAgBve,EAASlK,CAAAA,EAEnD,aACGwiB,GAAAA,CACCtY,QAAAA,EACA7E,aAAAA,EACA8M,SAAAA,EACAD,aAAAA,EACAuQ,SAAU2D,WAET,CAAC9O,EAAiB4L,UAChB4H,GAAAA,CACCj2C,KAAK,eACLiW,MAAOwsB,EACP2N,YAAa,KAAKA,YAClB8F,iBAAkBpyC,GAAa,KAAK6uB,iBAAmB7uB,EACvDqyC,gBAAiBx+B,GAAQ,CAACA,EAAKkhB,YAAc,CAAClhB,EAAKghB,UAEnD,gBAACxrB,EAAAA,CAAKzD,MAAOsF,EAAO6e,qBACjByc,GAAAA,CACClhB,SAAU,KAAKmE,MACfgd,YAAAA,EACAC,eAAAA,EACAC,YAAAA,EACApV,QAAAA,EACAoO,SAAAA,EACA0B,YAAa,KAAKxjC,MAAMwjC,YACxB4L,SAAU,KAAKpvC,MAAMovC,SACrBrG,YAAAA,EACAC,gBAAAA,EACA7V,SAAAA,EACAtE,aAAAA,EACA6M,aAAAA,EACA4L,kBAAAA,EACAzW,YAAAA,EACAoY,iBAAAA,EACA9B,aAAAA,EACAgC,oBAAqB,KAAKA,oBAC1BC,SAAU,KAAKptC,MAAMkxC,KAAKpiC,SAAW,EACrCo+B,gBAAAA,EACAG,OAAQ,KAAKrtC,MAAMqtC,OACnBjG,QAAS,KAAKpnC,MAAMonC,QACpBC,aAAc,KAAKrnC,MAAMqnC,aACzB/iB,UAAW,KAAKtgB,MAAMsgB,UACtB4J,UAAW,KAAKlqB,MAAMkqB,UACtBof,SAAU,KAAKA,SACfE,mBAAoB,KAAKA,mBACzBn1B,aAAc,KAAKA,aACnBk1B,iBAAkB,KAAKA,iBACvBhC,sBAAuB,KAAKA,sBAC5BoC,WAAY,KAAKA,WACjBC,aAAc,KAAKA,aACnBzB,YAAa,KAAKA,YAClBsB,kBAAmB,KAAKA,kBACxBC,kCACE,KAAKA,kCAEPG,OAAQ,KAAKA,OACbC,SAAU,KAAKA,SACfC,cAAe,KAAKA,cACpBC,iBAAkB,KAAKA,iBACvBC,YAAa,KAAKA,YAClBC,cAAe,KAAKA,cACpBpF,aAAc,KAAKA,aACnBT,eAAgB,KAAKA,eACrBf,eAAgB,KAAKA,eACrBC,oBAAqB,KAAKA,oBAC1BgB,eAAgB,KAAKA,eACrBD,eAAgB,KAAKA,eACrB6F,cAAe,KAAKA,cACpBpF,iBAAkB,KAAKA,gBAAAA,SAGxBv5B,EAAAA,CAAKzD,MAAO,CAAE8D,KAAM,CAAE,EACrB,eAACg1B,GAAAA,CACCpZ,SAAU,KAAKmE,MACf8H,QAAAA,EACA7E,aAAAA,EACAiS,gBAAAA,EACAzjB,SAAU,KAAKA,SACfyf,qBAAsB,IACpB,KAAKgQ,OAAS,KAAKA,MAAM2H,UAAS,EAEpCthB,SAAAA,EACAvgB,SAAAA,EACAiG,eAAAA,EACAqa,OAAAA,EACAyI,SAAU+Q,EACVhR,aAAc,CAAC,CAACgR,EAChB7b,YAAAA,EACAH,YACE,CAAClH,GACDA,IAAc,aACdA,IAAc,YACdA,IAAc,gBAEhB0R,SAAU,KAAKl/B,MAAMk/B,SACrBR,MAAO,KAAKA,MACZkB,UAAW,KAAKA,UAChBoF,WACE,KAAKhlC,MAAMqtC,SAAW,IAAM,KAAKrtC,MAAMonC,QAAQt4B,OAAS,EAE1D4qB,WAAAA,EACAC,aAAAA,EACA/L,gBAAAA,EACAkR,YAAa,IACXmO,EACEthC,EAAA,IAACokC,GAAAA,CAAatf,MAAO,IAAM0nB,EAAa,aAAA,CACtC,CAAA,EAACpH,EAWD,WAVDvhC,EAAAA,CACCzD,MAAO,CACLC,MAAOmF,EAAM0qB,UACbvV,UAAW,GACXzV,UAAW,SACXirB,UAAW,QACb,EACD,SAAA,iBAGC,CAAA,EAEN5N,UAAAA,EACA6G,OAAQ,KAAKA,OACbqL,UAAW,KAAKpgC,MAAMkxC,KAAK9c,MAC3BC,QAAS,KAAKr0B,MAAMkxC,KAAK7c,QACzB5f,SAAU,KAAK0gC,qBACflQ,UAAW,KAAKoM,oBAChBqH,iBAAkB7G,GAChB,KAAKf,MAAM6H,eAAe9G,EAAK,CAC7Bzd,MAAO,OACPwkB,MAAO,MAAA,CACT,EAEFrZ,sBAAuB,IACrB,KAAKnd,SAAS,CAAE8c,SAAU,EAAA,CAAM,EAElC7H,cAAe,KAAKA,aAAAA,WAQpC,CACF,CAEA,SAASwhB,GAAY70C,EAAK,CACxB,KAAM,CAAEmC,SAAUqtC,CAAsB,EAAKtgB,GAAAA,EACvCnpB,EAAQ+uC,GAAS90C,EAAMovC,SAAS2F,QAAQ,EAE9C,aACGnI,GAAAA,CACE,GAAG5sC,EACJ+F,MAAAA,EACAypC,uBAAAA,CAAAA,EAGN,CAEO,SAASwF,IAAAA,CACd,MAAMC,EAASC,KACT9F,EAAW+F,KAEX,CAAEh1B,QAAStH,CAAc,EAAK6P,GAAAA,EAC9B6T,EAAkB7M,GAAY1zB,GAASA,EAAMokB,QAAQmc,eAAe,EACpE2V,EAAsBxiB,GAC1B1zB,GAASA,EAAMokB,QAAQ8xB,mBAAmB,EAEtC/e,EAAWiiB,KACXliB,EAASmiB,KACTC,EAAiBC,KACjB7f,EAAa8f,GAAmB,GAAA,aAChC,CAAC7f,EAAe,EAAK,EAAItc,GAAa,cAAA,EACtC,CAACo2B,CAAa,EAAGp2B,GAAa,eAAA,EAC9B,CAACqiB,CAAa,EAAGriB,GAAa,iBAAiB47B,EAAOtkC,EAAE,EAAE,EAC1D,CAAC8kC,CAAY,EAAGp8B,GAAa,gBAAgB47B,EAAOtkC,EAAE,EAAE,EACxD,CAAC22B,CAAkB,EAAGjuB,GAC1B,uBAAuB47B,EAAOtkC,IAAM,cAAA,EAAgB,EAEhD29B,EAAe5e,GAAY1zB,GAASA,EAAM05C,OAAOC,WAAW7qC,OAAS,CAAA,EACrEk+B,EAAkBtZ,GAAY1zB,GAASA,EAAM03B,QAAQsV,eAAe,EACpEmF,EAAgBze,GAAY1zB,GAASA,EAAM2zB,IAAIwe,aAAa,EAE5DnyC,EAAQ,CACZugC,gBAAAA,EACA2V,oBAAAA,EACA/e,SAAAA,EACAmiB,eAAAA,EACA5f,WAAAA,EACAC,aAAAA,EACA8Z,aAAAA,EACA/T,aAAAA,EACA7K,YAAa,CAAC4kB,EACdnO,kBAAAA,EACApU,OAAAA,EACAob,aAAAA,EACAtF,gBAAAA,EACAmF,cAAAA,CAAAA,EAGIhsC,EAAWylB,KACX4b,EAAcoS,KACd1zC,EAAiBrC,EAAAA,QACrB,IAAMoC,GAAmBmf,GAASjf,CAClC,EAAA,CAACA,CAAAA,CAAS,EAGNsV,EAAY5X,EAAAA,QAAQ,IAAA,CACxB,IAAIg2C,EAAkBz1B,GAAyB60B,EAAOtkC,GAAI,UAAA,EACtDmlC,EAAgB11B,GAClB60B,EAAOtkC,GACP,sBAAA,EAIF,OACEy+B,EAAUpzC,OAASozC,EAASpzC,MAAMuV,QAClC0jC,EAAOtkC,KAAO,mBAEIklC,EAAA,CAAEllC,GAAI,IAAA,EACRmlC,EAAA,CAAEnlC,GAAI,IAAA,GAGjBW,IACLA,EAAIA,EAAEC,OAAO,CACXwkC,KAAM,CAAC,CAAE,kBAAmB,EAAM,CAAE,EACpCC,IAAK,CAACH,EAAiBC,CAAc,CAAA,CACvC,EACOxkC,EAAEyiC,QAAQ,CAAE3H,UAAW,MAAA,CAAO,EACvC,EACC,CAAC6I,EAAOtkC,EAAAA,CAAG,EAEd,aACGslC,GAAAA,CAAkBx+B,UAAAA,EACjB,eAAC8X,GAAAA,CACCC,YAAaxzB,EAAMyzC,aAAe,WAAa,SAE/C,eAACoF,GAAAA,CACE,GAAG74C,EACJ6c,eAAAA,EACC,GAAG3W,EACJosC,aAActyC,EAAMsyC,aACpB9kB,UAAWyrB,EAAOtkC,GAClB4V,WAAY6oB,GAAUpzC,OAAOuV,QAAQqB,SACrCw8B,SAAAA,EACA5L,YAAAA,CAAAA,MAKV","x_google_ignoreList":[0,1,2,3,4,5,6,7,8]}
|