react-native-resource-calendar 1.0.17 → 1.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +3 -11
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3 -11
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utilities/helpers.ts","../src/components/common/layout/Col.tsx","../src/theme/resolveFont.ts","../src/theme/ThemeContext.tsx","../src/components/TimeLabels.tsx","../src/components/common/layout/Hidden.tsx","../src/components/common/layout/Center.tsx","../src/components/common/Badge.tsx","../src/store/bindings/ZustandBinding.tsx","../src/store/bindings/BindingProvider.tsx","../src/components/ResourcesComponent.tsx","../src/components/EventGridBlocks.tsx","../src/store/StoreFeeder.tsx","../src/components/DisabledIntervals.tsx","../src/components/common/layout/Row.tsx","../src/components/DisabledBlocks.tsx","../src/components/EventBlock.tsx","../src/components/DraggableEvent.tsx","../src/components/EventBlocks.tsx","../src/components/DaysComponent.tsx","../src/components/Calendar.tsx"],"names":["toZonedTime","getHours","getMinutes","setSeconds","setMinutes","setHours","format","set","React","View","createContext","useContext","React3","isSameDay","useState","useEffect","useRef","InteractionManager","Text","StyleSheet","styles","createStore","useStoreWithEqualityFn","shallow","useResourceById","useEventsFor","React9","TouchableOpacity","isUndefined","Image","React10","useMemo","Gesture","runOnJS","GestureDetector","Canvas","Rect","Line","Svg","Defs","Pattern","useDisabledIntervalsFor","useGetDate","useDisabledBlocksFor","useGetSelectedEvent","TextInput","Animated","useAnimatedStyle","useAnimatedProps","React16","MaterialIcons","evt","addDays","React18","FlashList","useWindowDimensions","Platform","useCallback","useSetSelectedEvent","useSetDraggedEventDraft","useGetDraggedEventDraft","useAnimatedRef","useSharedValue","Haptics","isMultiDay","withSpring","useFrameCallback","scrollTo","resources","days","APPOINTMENT_BLOCK_WIDTH","useAnimatedScrollHandler","Dimensions"],"mappings":"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","file":"index.js","sourcesContent":["// Function to group events into clusters based on overlap\nimport {toZonedTime} from \"date-fns-tz\";\nimport {format, getHours, getMinutes, set, setHours, setMinutes, setSeconds} from \"date-fns\";\nimport {DisabledBlock, Event, LayoutMode} from \"@/types/calendarTypes\";\n\nexport const TIME_LABEL_WIDTH = 50;\nconst groupEventsByOverlap = (events: ReadonlyArray<Event>): Event[][] => {\n return events.reduce((clusters: Event[][], appointment) => {\n const cluster = clusters.find((c) => c.some((e) => isOverlapping(e, appointment)));\n if (cluster) {\n cluster.push(appointment);\n } else {\n clusters.push([appointment]);\n }\n return clusters;\n }, []);\n};\n\nexport function computeDisabledBlockColumns(\n disabledBlocks: ReadonlyArray<DisabledBlock>,\n): Map<number, TimeOffLayout> {\n const groups = groupDisabledBlocksByOverlap(disabledBlocks);\n const res = new Map<number, TimeOffLayout>();\n\n for (const group of groups) {\n // Greedy interval partitioning → columns\n const byStart = [...group].sort((a, b) => a.from - b.from);\n const columns: DisabledBlock[][] = [];\n\n for (const evt of byStart) {\n let placed = false;\n for (const col of columns) {\n const last = col[col.length - 1];\n if (!isOverlappingDisabledBlock(last, evt)) {\n col.push(evt);\n placed = true;\n break;\n }\n }\n if (!placed) columns.push([evt]);\n }\n\n // Column index for each event\n const colIndexByEvent = new Map<DisabledBlock, number>();\n columns.forEach((col, idx) => col.forEach(e => colIndexByEvent.set(e, idx)));\n\n const groupCols = columns.length;\n\n // Right-fill: expand into free consecutive columns to the RIGHT\n for (const evt of group) {\n const myCol = colIndexByEvent.get(evt)!;\n\n let span = 1;\n for (let c = myCol + 1; c < groupCols; c++) {\n const blocked = columns[c].some(e =>\n e !== evt && isOverlappingDisabledBlock(e, evt)\n );\n if (blocked) break;\n span++;\n }\n\n const key = evt.id;\n res.set(key, {\n leftIndex: myCol,\n renderColumnCount: groupCols,\n spanColumns: span,\n });\n }\n }\n\n return res;\n}\n\nexport const groupDisabledBlocksByOverlap = (disabledBlocks: ReadonlyArray<DisabledBlock>): DisabledBlock[][] => {\n return disabledBlocks.reduce((clusters: any[][], disabledBlock) => {\n const cluster = clusters.find((c) => c.some((e) => isOverlappingDisabledBlock(e, disabledBlock)));\n if (cluster) {\n cluster.push(disabledBlock);\n } else {\n clusters.push([disabledBlock]);\n }\n return clusters;\n }, []);\n}\n\nconst isOverlappingDisabledBlock = (disabledBlockA: DisabledBlock, disabledBlockB: DisabledBlock): boolean => {\n return !(disabledBlockA.to <= disabledBlockB.from || disabledBlockA.from >= disabledBlockB.to); // If there's no gap, they overlap\n}\n\nexport function computeEventColumns(\n events: ReadonlyArray<Event>,\n): Map<number, ColumnsLayout> {\n const groups = groupEventsByOverlap(events);\n const out = new Map<number, ColumnsLayout>();\n\n for (const group of groups) {\n const byStart = [...group].sort(\n (a, b) => a.from - b.from\n );\n\n // Greedy interval partitioning -> columns\n const columns: Event[][] = [];\n for (const evt of byStart) {\n let placed = false;\n for (const col of columns) {\n const last = col[col.length - 1];\n if (!isOverlapping(last, evt)) {\n col.push(evt);\n placed = true;\n break;\n }\n }\n if (!placed) columns.push([evt]);\n }\n\n const colIndex = new Map<Event, number>();\n columns.forEach((col, i) => col.forEach(e => colIndex.set(e, i)));\n\n const groupCols = columns.length;\n\n for (const evt of group) {\n const myCol = colIndex.get(evt)!;\n\n // How far can I expand to the RIGHT without hitting a column that overlaps me?\n let span = 1; // at least my own column\n for (let c = myCol + 1; c < groupCols; c++) {\n const blocked = columns[c].some(e =>\n // exclude self; block if ANY event in col c overlaps me\n (e !== evt && e.id !== evt.id && isOverlapping(e, evt))\n );\n if (blocked) break;\n span++;\n }\n\n out.set(evt.id!, {\n leftIndex: myCol,\n renderColumnCount: groupCols,\n spanColumns: span,\n });\n }\n }\n\n return out;\n}\n\nexport type TimeOffLayout = {\n leftIndex: number; // starting column (0-based)\n renderColumnCount: number; // total columns in this overlap group\n spanColumns: number; // how many columns this block can occupy (right-fill)\n};\n\n\nexport const getTextSize = (size: number) => {\n switch (size) {\n case 60:\n return 10;\n case 80:\n return 12;\n case 100:\n return 12;\n default:\n return 12;\n }\n}\n\nconst MINUTES_IN_DAY = 1440;\n\n// Normalize ONLY when the interval truly wraps overnight.\n// Keep half-open semantics: [start, end)\nconst normalizeOvernight = (startMin: number, endMin: number) => {\n if (endMin < startMin) endMin += MINUTES_IN_DAY; // wrap to next day\n return {startMin, endMin};\n};\n\n// Half-open overlap test: [a1,a2) intersects [b1,b2) <=> max(a1,b1) < min(a2,b2)\nconst intersects = (A: { startMin: number; endMin: number }, B: { startMin: number; endMin: number }) =>\n Math.max(A.startMin, B.startMin) < Math.min(A.endMin, B.endMin);\n\nexport const isOverlapping = (\n eventA: Event,\n eventB: Event,\n): boolean => {\n // 0..1439 minutes\n const aStart0 = eventA.from;\n const aEnd0 = eventA.to;\n const bStart0 = eventB.from;\n const bEnd0 = eventB.to;\n\n // If either is zero-length, treat as non-blocking (never overlaps)\n if (aStart0 === aEnd0 || bStart0 === bEnd0) return false;\n\n // Normalize overnight intervals\n const A = normalizeOvernight(aStart0, aEnd0);\n const B = normalizeOvernight(bStart0, bEnd0);\n\n return intersects(A, B);\n};\n\n// Utility to get the current time in minutes since the start of the day\nexport const getCurrentTimeInMinutes = (timezone: string): number => {\n const now = toZonedTime(new Date(), timezone);\n const hours = getHours(now);\n const minutes = getMinutes(now);\n return hours * 60 + minutes;\n};\n\n// Convert time into Y-position\nexport const timeToYPosition = (minutes: number, TIME_LABEL_HEIGHT: number): number => minutes * (TIME_LABEL_HEIGHT / 60); // Scale factor of 1px per minute\n\nexport const scalePosition = (position: number, hourHeight: number) => {\n return position * (hourHeight / 60);\n}\n\nexport const positionToMinutes = (position: number, TIME_LABEL_HEIGHT: number): number => {\n 'worklet';\n return position / (TIME_LABEL_HEIGHT / 60);\n}\n\nexport const combineDateAndTime = (date: Date, time: string) => {\n // Parse the time string into hours, minutes, and seconds\n const [hours, minutes, seconds] = time.split(':').map(Number);\n\n // Set hours, minutes, and seconds on the date\n const combinedDate = setSeconds(setMinutes(setHours(date, hours), minutes), seconds);\n\n // Format the combined date as \"yyyy-MM-dd HH:mm:ss\"\n return format(combinedDate, 'yyyy-MM-dd HH:mm:ss');\n};\n\nexport const indexToDate = (index: number) => {\n // Set the date with a specific hour\n const dateWithHour = set(new Date(), {hours: index, minutes: 0, seconds: 0, milliseconds: 0});\n\n // Format the date in 'h:mm A' format\n return format(dateWithHour, 'h:mm a'); // 'a' is for AM/PM in lowercase\n};\n\nexport const minutesToTime = (totalMinutes: number): string => {\n 'worklet';\n\n const safeTotalMinutes = Math.max(0, Math.round(totalMinutes));\n const hours24 = Math.floor(safeTotalMinutes / 60);\n const minutes = safeTotalMinutes % 60;\n\n // Manually pad minutes with a leading zero if needed\n const paddedMins = minutes < 10 ? '0' + minutes : String(minutes);\n\n// Convert to 12-hour format without AM/PM\n const hours12 = hours24 % 12 || 12;\n\n// Return time in 'h:mm' format\n return `${hours12}:${paddedMins}`;\n};\n\nexport type StackedLayout = {\n // absolute pixel offsets to feed straight into your block\n leftPx: number;\n widthPx: number;\n zIndex: number; // draw later overlaps on top\n};\n\nexport function computeStackedEventLayout(\n events: ReadonlyArray<Event>,\n containerWidthPx: number,\n {\n indentPx = 12, // how much to nudge each overlap to the right\n rightPadPx = 0, // visual breathing room on the right\n minWidthPx = 30, // never let an event become thinner than this\n capIndentLevels = 4, // after N levels, stop indenting (just stack via z-index)\n }: {\n indentPx?: number;\n rightPadPx?: number;\n minWidthPx?: number;\n capIndentLevels?: number;\n } = {}\n): Map<number, StackedLayout> {\n // Group by mutual overlap first (same as your existing grouping)\n const groups = groupEventsByOverlap(events);\n\n const out = new Map<number, StackedLayout>();\n\n for (const group of groups) {\n // Sweep by start time\n const byStart = [...group].sort((a, b) => a.from - b.from);\n\n // Active overlap window (min-heap by end time would also work; here we keep a simple list)\n type Active = { e: Event; level: number; };\n const active: Active[] = [];\n\n // For quick removal\n const removeFinished = (currentFrom: number) => {\n for (let i = active.length - 1; i >= 0; i--) {\n if (!isOverlapping(active[i].e, {...active[i].e, from: currentFrom, to: currentFrom})) {\n // More robust: if (active[i].e.to <= currentFrom) active.splice(i,1)\n if (active[i].e.to <= currentFrom) active.splice(i, 1);\n }\n }\n };\n\n // Track which indent \"levels\" are free at any moment\n const findLowestFreeLevel = (): number => {\n // Gather occupied levels\n const used = new Set(active.map(a => a.level));\n let lvl = 0;\n while (used.has(lvl)) lvl++;\n return lvl;\n };\n\n for (const e of byStart) {\n // Drop anything that ended before this start\n removeFinished(e.from);\n\n // Assign the lowest available level in the *current* overlap window\n let level = findLowestFreeLevel();\n\n // Cap to avoid pushing too far right; after that we only change zIndex\n const visualLevel = Math.min(level, capIndentLevels);\n\n // Insert as active\n active.push({e, level});\n\n // Compute visual frame\n const leftPx = visualLevel * indentPx;\n // Width shrinks by how far we indented, but never below minWidth\n const available = containerWidthPx - leftPx - rightPadPx;\n const widthPx = Math.max(minWidthPx, available);\n\n // Draw later overlaps on top: z == start minute + level small bias\n const zIndex = 9999 + e.from * 10 + level; // stable tie-break\n\n out.set(e.id!, {leftPx, widthPx, zIndex});\n }\n }\n\n return out;\n}\n\nexport type ColumnsLayout = {\n leftIndex: number; // same as columnIndex (used for left offset)\n renderColumnCount: number; // total columns in this overlap group\n spanColumns: number; // how many columns I can occupy (right-fill)\n};\n\nexport function columnsToPixels(\n columnMap: Map<number, ColumnsLayout>,\n containerWidthPx: number,\n {\n gutterPx = 2, // spacing between columns\n padLeftPx = 0,\n padRightPx = 0,\n }: { gutterPx?: number; padLeftPx?: number; padRightPx?: number } = {}\n): Map<number, EventFrame> {\n const out = new Map<number, EventFrame>();\n\n for (const [id, c] of columnMap) {\n const totalGutters = (c.renderColumnCount - 1) * gutterPx;\n const innerWidth = containerWidthPx - padLeftPx - padRightPx - totalGutters;\n const colWidth = innerWidth / c.renderColumnCount;\n\n const left =\n padLeftPx + c.leftIndex * (colWidth + gutterPx);\n\n const width =\n colWidth * c.spanColumns + gutterPx * (c.spanColumns - 1);\n\n out.set(id, {\n leftPx: left,\n widthPx: Math.max(0, width),\n // later columns on top slightly, but mostly rely on time-based z\n zIndex: 1000 + c.leftIndex,\n });\n }\n\n return out;\n}\n\nexport type EventFrame = {\n leftPx: number;\n widthPx: number;\n zIndex: number;\n};\n\n\nexport function computeEventFrames(\n events: ReadonlyArray<Event>,\n containerWidthPx: number,\n mode: LayoutMode,\n options?: {\n // columns\n gutterPx?: number; padLeftPx?: number; padRightPx?: number;\n // stacked\n indentPx?: number; rightPadPx?: number; minWidthPx?: number; capIndentLevels?: number;\n }\n): Map<number, EventFrame> {\n if (mode === \"columns\") {\n const columnLayouts = computeEventColumns(events); // your existing function\n return columnsToPixels(columnLayouts, containerWidthPx, {\n gutterPx: options?.gutterPx,\n padLeftPx: options?.padLeftPx,\n padRightPx: options?.padRightPx,\n });\n } else {\n return computeStackedEventLayout(events, containerWidthPx, {\n indentPx: options?.indentPx,\n rightPadPx: options?.rightPadPx,\n minWidthPx: options?.minWidthPx,\n capIndentLevels: options?.capIndentLevels,\n });\n }\n}\n\nexport const findResourceIndexFor = (rid: number, resourceIds: number[]) =>\n Math.max(0, Math.min(resourceIds.length - 1,\n resourceIds.findIndex(id => id === rid)\n ));\n\nexport const findDayIndexFor = (date: string, days: Date[]) =>\n Math.max(0, Math.min(days.length - 1,\n days.findIndex(d => date === format(d, \"yyyy-MM-dd\"))\n ));\n","import React, {ReactNode} from \"react\";\nimport {View, ViewProps} from \"react-native\";\n\ninterface ColProps extends ViewProps {\n space?: number;\n divider?: ReactNode;\n}\n\nconst Col = ({children, divider, space, style}: ColProps) => {\n return (\n <View style={[{flexDirection: \"column\"}, style]}>\n {React.Children.toArray(children).map((child, index) => (\n <React.Fragment key={index}>\n {child}\n {index !== React.Children.toArray(children).length - 1 &&\n divider}\n {index !== React.Children.toArray(children).length - 1 &&\n <View style={{height: space, width: \"100%\"}}/>}\n </React.Fragment>\n ))}\n </View>\n );\n};\n\nexport default Col;\n","// theme/resolveFont.ts\nexport type FontWeightRN = '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900';\n\nexport type ResolveFontArgs = {\n family?: string;\n weight?: FontWeightRN;\n italic?: boolean;\n};\n\nconst WEIGHT_NAME_MAP: Record<FontWeightRN, string> = {\n '100': 'Thin',\n '200': 'ExtraLight',\n '300': 'Light',\n '400': 'Regular',\n '500': 'Medium',\n '600': 'SemiBold',\n '700': 'Bold',\n '800': 'ExtraBold',\n '900': 'Black',\n};\n\n/**\n * Builds Expo font key dynamically based on standard pattern\n * e.g. (\"Inter\", 700, true) => \"Inter_700Bold_Italic\"\n */\nexport function resolveFont({ family = 'System', weight = '400', italic = false }: ResolveFontArgs): string {\n // Ignore system fonts or arbitrary custom ones\n if (family === 'System' || family.includes('_')) return family;\n\n // Determine textual weight (Bold, Light, etc.)\n const weightName = WEIGHT_NAME_MAP[weight] ?? 'Regular';\n\n // Construct Expo font key: Inter_700Bold or Inter_700Bold_Italic\n const base = `${family}_${weight}${weightName}`;\n return italic ? `${base}_Italic` : base;\n}\n","// store/themeContext.ts\nimport React, {createContext, useContext} from 'react';\nimport {CalendarTheme} from \"@/types/calendarTypes\";\nimport {FontWeightRN, resolveFont} from \"@/theme/resolveFont\";\n\nconst defaultTheme: CalendarTheme = {\n typography: {\n fontFamily: 'System',\n },\n};\n\nconst ThemeCtx = createContext<CalendarTheme>(defaultTheme);\nexport const useCalendarTheme = () => useContext(ThemeCtx);\n\nexport const useResolvedFont = (overrides?: {\n fontFamily?: string;\n fontWeight?: FontWeightRN;\n italic?: boolean;\n}) => {\n const {typography} = useCalendarTheme(); // { fontFamily?, fontWeight? , italic? }\n const family = overrides?.fontFamily ?? typography?.fontFamily ?? 'System';\n const weight = overrides?.fontWeight ?? '400';\n const italic = overrides?.italic ?? false;\n\n return resolveFont({family, weight, italic});\n};\n\nexport const CalendarThemeProvider: React.FC<{\n theme?: CalendarTheme;\n children: React.ReactNode;\n}> = ({theme, children}) => {\n const mergedTheme = {\n ...defaultTheme,\n ...theme,\n typography: {...defaultTheme.typography, ...theme?.typography},\n };\n\n return <ThemeCtx.Provider value={mergedTheme}>{children}</ThemeCtx.Provider>;\n};\n","// @flow\nimport * as React from 'react';\nimport {useEffect, useRef, useState} from 'react';\nimport {InteractionManager, StyleSheet, Text, View} from \"react-native\";\nimport {\n getCurrentTimeInMinutes,\n getTextSize,\n indexToDate,\n TIME_LABEL_WIDTH,\n timeToYPosition\n} from \"@/utilities/helpers\";\nimport {format, isSameDay} from \"date-fns\";\nimport {toZonedTime} from \"date-fns-tz\";\nimport Col from './common/layout/Col';\nimport {useResolvedFont} from \"@/theme/ThemeContext\";\n\ntype Props = {\n timezone: string;\n layout: any;\n hourHeight?: number;\n startMinutes?: number;\n totalTimelineWidth: number;\n date: Date;\n};\nexport const TimeLabels = React.forwardRef(({\n timezone,\n hourHeight = 120,\n startMinutes = 0,\n totalTimelineWidth,\n date,\n layout\n }: Props, ref: any) => {\n // Check if the selected date is today\n const isToday = isSameDay(new Date(), date);\n // Function to update the current time's Y position\n // State to store the current Y-position of the red line\n const [currentTimeYPosition, setCurrentTimeYPosition] = useState(timeToYPosition(getCurrentTimeInMinutes(timezone), hourHeight));\n const [currentTime, setCurrentTime] = useState<string>(format(toZonedTime(new Date(), timezone), 'h:mm'));\n const APPOINTMENT_BLOCK_HEIGHT = hourHeight / 4;\n\n const updateCurrentTimeYPosition = () => {\n setCurrentTimeYPosition(timeToYPosition(getCurrentTimeInMinutes(timezone), hourHeight));\n };\n\n // Function to update the current time every minute\n const updateCurrentTime = () => {\n setCurrentTime(format(toZonedTime(new Date(), timezone), 'h:mm')); // Update the state with the new current time\n };\n\n const titleFace = useResolvedFont({fontWeight: '700'});\n\n useEffect(() => {\n const update = () => {\n updateCurrentTime();\n updateCurrentTimeYPosition();\n };\n\n update();\n const intervalId = setInterval(update, 300);\n\n return () => clearInterval(intervalId);\n }, [timezone]);\n\n const lastScrolledDateRef = useRef<any>(null); // store a key for the last date we scrolled to\n\n useEffect(() => {\n if (!layout) return;\n\n // If `date` is a Date object, use getTime() or toDateString()\n const dateKey = date.getTime();\n\n // If we already scrolled for this date, skip\n if (lastScrolledDateRef.current === dateKey) return;\n\n InteractionManager.runAfterInteractions(() => {\n let pos = isToday\n ? currentTimeYPosition - 240\n : timeToYPosition(startMinutes, hourHeight);\n\n if (ref.current) {\n ref.current.scrollTo({\n y: Math.round(pos / APPOINTMENT_BLOCK_HEIGHT) * APPOINTMENT_BLOCK_HEIGHT,\n animated: true,\n });\n\n // Remember that we've scrolled for this specific date\n lastScrolledDateRef.current = dateKey;\n }\n });\n }, [layout, date, isToday, APPOINTMENT_BLOCK_HEIGHT, startMinutes, hourHeight, currentTimeYPosition]);\n\n return (\n <>\n <Col>\n {/* Time labels */}\n {Array.from({length: 24}).map((_, index) => (\n <View key={index} style={[styles.timeLabel, {height: hourHeight}]}>\n <Text\n allowFontScaling={false}\n style={{\n textAlign: \"center\",\n fontFamily: titleFace,\n fontSize: getTextSize(hourHeight),\n fontWeight: '700'\n }}>\n {indexToDate(index).split(\" \")[0]}\n </Text>\n <Text\n allowFontScaling={false}\n style={{\n textAlign: \"center\",\n fontFamily: titleFace,\n fontSize: getTextSize(hourHeight),\n fontWeight: '700'\n }}>\n {indexToDate(index).split(\" \")[1]}\n </Text>\n </View>\n ))}\n {isToday && <View style={[styles.currentTime, {\n top: currentTimeYPosition - 13,\n width: TIME_LABEL_WIDTH,\n }]}>\n <Text\n allowFontScaling={false}\n style={{\n textAlign: \"center\",\n fontFamily: titleFace,\n fontWeight: '700',\n fontSize: getTextSize(hourHeight),\n color: \"red\"\n }}\n >{currentTime}</Text>\n </View>}\n </Col>\n {/* Render the red line for current time */}\n {isToday && <View style={[styles.currentTimeLine, {\n pointerEvents: \"none\",\n top: currentTimeYPosition,\n width: totalTimelineWidth,\n left: TIME_LABEL_WIDTH\n }]}/>}\n </>\n );\n});\n\nconst styles = StyleSheet.create({\n timeLabel: {\n width: TIME_LABEL_WIDTH,\n },\n currentTimeLine: {\n position: 'absolute',\n height: 2, // Thickness of the line\n backgroundColor: 'red',\n zIndex: 10000, // Ensure it's on top of all other elements\n },\n currentTime: {\n backgroundColor: '#fff',\n borderColor: \"red\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderWidth: 2,\n borderRadius: 20,\n height: 26,\n position: 'absolute',\n zIndex: 10000, // Ensure it's on top of all other elements\n },\n});","import React from \"react\";\nimport {PropsWithChildren} from \"react\";\n\ninterface HiddenProps {\n isHidden: boolean;\n}\n\nconst Hidden = ({isHidden, children}: PropsWithChildren<HiddenProps>) => {\n if (isHidden) {\n return null;\n }\n\n return (\n <>\n {children}\n </>\n );\n};\n\nexport default Hidden;\n","import React, {PropsWithChildren} from \"react\";\nimport {StyleProp, View, ViewStyle} from \"react-native\";\n\ninterface CenterProps {\n style?: StyleProp<ViewStyle>\n}\n\nconst Center = ({children, style}: PropsWithChildren<CenterProps>) => {\n return (\n <View style={[{\n justifyContent: \"center\",\n alignItems: \"center\",\n }, style]}\n >\n {children}\n </View>\n );\n};\n\nexport default Center;\n","import React, {PropsWithChildren} from 'react';\nimport {StyleProp, StyleSheet, Text, View, ViewStyle} from 'react-native';\nimport {useResolvedFont} from \"@/theme/ThemeContext\";\n\ntype BadgeProps = {\n value?: number | string;\n color?: string;\n textColor?: string;\n fontSize?: number;\n style?: StyleProp<ViewStyle>\n};\n\nconst Badge: React.FC<PropsWithChildren<BadgeProps>> = ({\n style,\n value = '',\n children,\n fontSize,\n color = 'red',\n textColor = 'white'\n }) => {\n const titleFace = useResolvedFont({fontWeight: '600'});\n\n return (\n <View style={[styles.badge, {backgroundColor: color}, style]}>\n {children ? children : <Text\n allowFontScaling={false}\n style={{\n color: textColor,\n fontSize,\n fontFamily: titleFace,\n fontWeight: '600',\n }}\n >{value}</Text>}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n badge: {\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: 999,\n paddingHorizontal: 6\n },\n});\n\nexport default Badge;\n","// bindings/zustandBinding.tsx\nimport React, {createContext, useContext, useRef} from 'react';\nimport {createStore, type StoreApi} from 'zustand';\nimport {shallow} from 'zustand/shallow';\nimport type {CalendarStoreBinding, SetDayDataPayload} from './calendarStoreBinding';\nimport type {\n DisabledBlock,\n DisabledInterval,\n DraggedEventDraft,\n Event,\n Resource,\n ResourceId,\n} from '@/types/calendarTypes';\nimport {useStoreWithEqualityFn} from \"zustand/traditional\";\nimport {format} from \"date-fns\";\n\ntype ByResource<T> = Record<ResourceId, T[]>;\ntype ByDay<T> = Record<string, ByResource<T>>;\n\ntype State = {\n date: Date;\n resourcesById: Record<ResourceId, Resource>;\n selectedEvent: Event | null;\n draggedEventDraft: DraggedEventDraft | null;\n\n // NEW: multi-day slices\n eventsByDay: ByDay<Event>;\n disabledBlocksByDay: ByDay<DisabledBlock>;\n disabledIntervalsByDay: ByDay<DisabledInterval>;\n\n // Actions\n upsertResources: (rs: Array<Pick<Resource, 'id' | 'name' | 'avatar'>>) => void;\n setDayDataFor: (dayKey: string, payload: SetDayDataPayload) => void;\n setSelectedEvent: (evt: Event | null) => void;\n setDraggedEventDraft: (draft: DraggedEventDraft | null) => void;\n setDate: (date: Date) => void;\n};\n\nconst createCalendarStore = () =>\n createStore<State>((set) => ({\n date: new Date(),\n resourcesById: {},\n\n // NEW multi-day\n eventsByDay: {},\n disabledBlocksByDay: {},\n disabledIntervalsByDay: {},\n\n selectedEvent: null,\n draggedEventDraft: null,\n\n setSelectedEvent: (evt) => set({selectedEvent: evt}),\n setDate: (date) => set({date}),\n\n upsertResources: (rs) =>\n set((s) => {\n // keep refs for unchanged items\n const next = {...s.resourcesById};\n let changed = false;\n for (const r of rs) {\n const prev = next[r.id];\n // replace only when identity actually differs\n if (!prev || prev.name !== r.name || prev.avatar !== r.avatar) {\n next[r.id] = {id: r.id, name: r.name, avatar: r.avatar};\n changed = true;\n }\n }\n return changed ? {resourcesById: next} : {};\n }),\n\n // NEW: multi-day write\n setDayDataFor: (dayKey, {events, disabledBlocks, disableIntervals}) =>\n set((s) => ({\n eventsByDay: events\n ? {...s.eventsByDay, [dayKey]: events} // replace whole day\n : s.eventsByDay,\n disabledBlocksByDay: disabledBlocks\n ? {...s.disabledBlocksByDay, [dayKey]: disabledBlocks} // replace whole day\n : s.disabledBlocksByDay,\n disabledIntervalsByDay: disableIntervals\n ? {...s.disabledIntervalsByDay, [dayKey]: disableIntervals} // replace whole day\n : s.disabledIntervalsByDay,\n })),\n\n setDraggedEventDraft: (draft) => set({draggedEventDraft: draft}),\n }));\n\n// Scoped store (instance-safe)\nconst StoreContext = createContext<StoreApi<State> | null>(null);\n\nconst Provider: CalendarStoreBinding['Provider'] = ({children}) => {\n const ref = useRef<StoreApi<State>>(undefined);\n if (!ref.current) ref.current = createCalendarStore();\n return <StoreContext.Provider value={ref.current}>{children}</StoreContext.Provider>;\n};\n\n// helper to bind to this instance\nconst useBound = <T, >(\n selector: (s: State) => T,\n eq?: (a: T, b: T) => boolean\n): T => {\n const store = useContext(StoreContext);\n if (!store) throw new Error('Calendar store used outside of Provider');\n return useStoreWithEqualityFn(store, selector, eq);\n};\n\n// Selectors (single-day, per-resource)\nconst useResourceById: CalendarStoreBinding['useResourceById'] =\n (id) => useBound((s) => s.resourcesById[id]);\n\nconst useGetSelectedEvent: CalendarStoreBinding['useGetSelectedEvent'] =\n () => useBound((s) => s.selectedEvent);\n\nconst useSetSelectedEvent: CalendarStoreBinding['useSetSelectedEvent'] =\n () => useBound((s) => s.setSelectedEvent);\n\nconst useEventsFor: CalendarStoreBinding['useEventsFor'] =\n (resourceId, dayDate) => useBound(s => {\n const key = format(dayDate, 'yyyy-MM-dd');\n return s.eventsByDay?.[key]?.[resourceId] ?? [];\n }, shallow);\n\nconst useGetDraggedEventDraft: CalendarStoreBinding['useGetDraggedEventDraft'] =\n () => useBound((s) => s.draggedEventDraft);\n\nconst useDisabledBlocksFor: CalendarStoreBinding['useDisabledBlocksFor'] =\n (resourceId, dayDate) => useBound(s => {\n const key = format(dayDate, 'yyyy-MM-dd');\n return s.disabledBlocksByDay?.[key]?.[resourceId] ?? [];\n }, shallow);\n\nconst useDisabledIntervalsFor: CalendarStoreBinding['useDisabledIntervalsFor'] =\n (resourceId, dayDate) => useBound(s => {\n const key = format(dayDate, 'yyyy-MM-dd');\n return s.disabledIntervalsByDay?.[key]?.[resourceId] ?? []\n }, shallow);\n\n// Action hooks\nconst useUpsertResources: CalendarStoreBinding['useUpsertResources'] =\n () => useBound((s) => s.upsertResources);\n\nconst useSetDayDataFor: CalendarStoreBinding['useSetDayDataFor'] =\n () => useBound((s) => s.setDayDataFor);\n\nconst useSetDraggedEventDraft: CalendarStoreBinding['useSetDraggedEventDraft'] =\n () => useBound((s) => s.setDraggedEventDraft);\n\nconst useSetDate: CalendarStoreBinding['useSetDate'] =\n () => useBound((s) => s.setDate);\n\nconst useGetDate: CalendarStoreBinding['useGetDate'] =\n () => useBound((s) => s.date);\n// Export the binding\nexport const zustandBinding: CalendarStoreBinding = {\n Provider,\n useResourceById,\n useEventsFor,\n useDisabledBlocksFor,\n useDisabledIntervalsFor,\n useUpsertResources,\n useSetDate,\n useGetDate,\n useSetDayDataFor,\n useGetSelectedEvent,\n useSetSelectedEvent,\n useGetDraggedEventDraft,\n useSetDraggedEventDraft\n};\n","// store/BindingProvider.tsx\nimport React, {createContext, useContext} from 'react';\nimport {CalendarStoreBinding} from './calendarStoreBinding';\nimport {zustandBinding} from \"./ZustandBinding\";\n\nconst BindingCtx = createContext<CalendarStoreBinding | null>(null);\n\nexport const useCalendarBinding = (): CalendarStoreBinding => {\n const ctx = useContext(BindingCtx);\n if (!ctx) throw new Error('useCalendarBinding must be used within <CalendarBindingProvider>');\n return ctx;\n};\n\nexport const CalendarBindingProvider: React.FC<{\n binding?: CalendarStoreBinding; // optional override\n children: React.ReactNode;\n}> = ({binding, children}) => {\n const active = binding ?? zustandBinding;\n const StoreProvider = active.Provider; // mounts the store\n return (\n <BindingCtx.Provider value={active}>\n <StoreProvider>{children}</StoreProvider>\n </BindingCtx.Provider>\n );\n};\n","// @flow\nimport * as React from 'react';\nimport {Image, StyleProp, StyleSheet, Text, TouchableOpacity, View, ViewStyle} from \"react-native\";\nimport {isUndefined} from \"lodash\";\nimport Hidden from './common/layout/Hidden';\nimport Center from './common/layout/Center';\nimport Badge from './common/Badge';\nimport Col from './common/layout/Col';\nimport {Resource} from '@/types/calendarTypes';\nimport {useCalendarBinding} from \"@/store/bindings/BindingProvider\";\nimport {useResolvedFont} from \"@/theme/ThemeContext\";\n\ntype Props = {\n resourceIds: number[];\n APPOINTMENT_BLOCK_WIDTH: number;\n onResourcePress?: (resource: Resource) => void;\n date: Date;\n};\n\ntype ResourceComponentProps = {\n id: number;\n APPOINTMENT_BLOCK_WIDTH: number;\n onResourcePress?: (resource: Resource) => void;\n date: Date;\n}\n\nconst ResourceComponent = ({id, onResourcePress, APPOINTMENT_BLOCK_WIDTH, date}: ResourceComponentProps) => {\n const {useResourceById, useEventsFor} =\n useCalendarBinding();\n const resource = useResourceById(id);\n const events = useEventsFor(id, date);\n const titleFace = useResolvedFont({fontWeight: '700'});\n\n return <Col style={[{\n alignItems: 'center',\n width: APPOINTMENT_BLOCK_WIDTH,\n }]}>\n <View style={{position: \"relative\"}}>\n <StaffAvatar\n onPress={() => {\n if (onResourcePress)\n onResourcePress(resource);\n }}\n name={resource?.name}\n circleSize={Math.min(40, APPOINTMENT_BLOCK_WIDTH - 12)}\n fontSize={16}\n badge={events?.length}\n image={resource?.avatar}\n />\n </View>\n <Text style={{\n fontSize: 14,\n fontFamily: titleFace,\n fontWeight: '700',\n }}\n numberOfLines={1}\n allowFontScaling={false}\n >{resource?.name}</Text>\n </Col>\n}\n\nexport const ResourcesComponent = ({resourceIds, onResourcePress, APPOINTMENT_BLOCK_WIDTH, date}: Props) => {\n return (\n <>\n {resourceIds?.map((id) => {\n return <ResourceComponent\n date={date}\n key={id}\n id={id}\n APPOINTMENT_BLOCK_WIDTH={APPOINTMENT_BLOCK_WIDTH}\n onResourcePress={onResourcePress}\n />\n })}\n </>\n );\n}\n\ninterface StaffAvatarProps {\n circleSize?: number;\n fontSize?: number;\n name?: string;\n badge?: number;\n image?: string;\n badgeStyle?: StyleProp<ViewStyle>;\n containerStyle?: StyleProp<ViewStyle>;\n onPress?: () => void;\n ringColor?: string;\n avatarColor?: string;\n textColor?: string;\n}\n\nexport function StaffAvatar({\n name,\n circleSize = 60,\n fontSize = 36,\n image,\n badge,\n badgeStyle,\n onPress,\n containerStyle,\n ringColor = '#DAEEE7',\n avatarColor,\n textColor,\n }: StaffAvatarProps) {\n const titleFace = useResolvedFont({fontWeight: '700'});\n\n return (\n <TouchableOpacity\n disabled={isUndefined(onPress)}\n onPress={onPress}\n style={containerStyle}\n >\n <Center style={{\n borderRadius: 9999,\n backgroundColor: ringColor,\n }}>\n <Hidden isHidden={isUndefined(badge) || Number(badge) == 0}>\n <View style={[{\n zIndex: 1,\n position: 'absolute',\n right: -4,\n top: -6,\n borderRadius: 999,\n backgroundColor: \"#fff\",\n padding: 2\n }, badgeStyle]}\n >\n <Badge\n fontSize={12}\n value={badge + \"\"}\n color={\"#4d959c\"}\n />\n </View>\n </Hidden>\n <Center style={{\n margin: 2,\n borderRadius: 9999,\n backgroundColor: 'white',\n }}>\n <Center style={{\n margin: 2,\n borderRadius: 9999,\n height: circleSize,\n width: circleSize,\n backgroundColor: avatarColor || \"#C9E5E8\",\n overflow: 'hidden'\n }}>\n {\n image ?\n <Image\n resizeMode={\"cover\"}\n source={{uri: image}}\n style={{\n height: '100%',\n borderRadius: 6,\n ...StyleSheet.absoluteFillObject,\n }}\n />\n :\n <Text\n allowFontScaling={false}\n style={{\n fontFamily: titleFace,\n fontSize: fontSize,\n color: textColor || \"#4d959c\",\n lineHeight: circleSize,\n }}\n >\n {name ? name.split(' ').map(n => n[0]).join('').slice(0, 2) : ''}\n </Text>\n }\n </Center>\n </Center>\n </Center>\n </TouchableOpacity>\n )\n}\n","import * as React from 'react';\nimport {useMemo} from 'react';\nimport {View} from 'react-native';\nimport {Canvas, Line, Rect} from '@shopify/react-native-skia';\nimport {Gesture, GestureDetector} from 'react-native-gesture-handler';\nimport {runOnJS} from 'react-native-reanimated';\n\ntype Props = {\n handleBlockPress: (time: string) => void;\n APPOINTMENT_BLOCK_WIDTH: number;\n hourHeight: number;\n};\n\nexport const EventGridBlocksSkia: React.FC<Props> = ({\n handleBlockPress,\n hourHeight,\n APPOINTMENT_BLOCK_WIDTH\n }) => {\n const rowHeight = hourHeight / 4;\n const [pressedRow, setPressedRow] = React.useState<number | null>(null);\n\n // 96 quarter-hour labels, computed once\n const timeLabels = useMemo<string[]>(() => {\n const out: string[] = [];\n for (let h = 0; h < 24; h++) {\n for (let q = 0; q < 4; q++) {\n const m = q * 15;\n const hh = String(h).padStart(2, '0');\n const mm = String(m).padStart(2, '0');\n out.push(`${hh}:${mm}:00`);\n }\n }\n return out;\n }, []);\n\n const rects = useMemo(\n () =>\n timeLabels.map((_, row) => ({\n x: 0,\n y: row * rowHeight,\n width: APPOINTMENT_BLOCK_WIDTH,\n height: rowHeight,\n row,\n })),\n [timeLabels, rowHeight, APPOINTMENT_BLOCK_WIDTH]\n );\n\n // Split into two canvas segments\n const midIndex = Math.ceil(rects.length / 2);\n const firstRects = rects.slice(0, midIndex);\n const secondRects = rects.slice(midIndex);\n const segmentHeight = rowHeight * firstRects.length;\n\n const onSlotPress = React.useCallback(\n (row: number) => {\n setPressedRow(null);\n const slot = timeLabels[row];\n if (slot) {\n handleBlockPress(slot);\n }\n },\n [handleBlockPress, timeLabels]\n );\n\n const onPressBegin = React.useCallback((row: number) => {\n setPressedRow(row);\n }, []);\n const onTouchesUp = React.useCallback(() => {\n setPressedRow(null);\n }, []);\n\n const longPressGesture = Gesture.LongPress()\n .onBegin((e) => {\n 'worklet';\n runOnJS(onPressBegin)(Math.floor(e.y / rowHeight))\n })\n .onEnd((e) => {\n 'worklet';\n runOnJS(onSlotPress)(Math.floor(e.y / rowHeight))\n })\n .onFinalize(() => {\n 'worklet';\n runOnJS(onTouchesUp)()\n });\n\n return (\n <GestureDetector gesture={longPressGesture}>\n <View>\n {/* First half-day segment */}\n <Canvas style={{width: APPOINTMENT_BLOCK_WIDTH, height: segmentHeight}}>\n {firstRects.map(({x, y, width: w, height: h, row}, idx) => (\n <React.Fragment key={idx}>\n <Rect\n x={x}\n y={y}\n width={w}\n height={h}\n color={\n pressedRow === row ? 'rgba(240,240,240,0.3)' : 'rgba(240,240,240,0.6)'\n }\n style=\"fill\"\n />\n <Line p1={{x, y: y + h}} p2={{x: x + w, y: y + h}} color=\"#ddd\" strokeWidth={1}/>\n </React.Fragment>\n ))}\n </Canvas>\n\n {/* Second half-day segment */}\n <Canvas style={{width: APPOINTMENT_BLOCK_WIDTH, height: segmentHeight}}>\n {secondRects.map(({x, y, width: w, height: h, row}, idx) => (\n <React.Fragment key={idx}>\n <Rect\n x={x}\n y={y - segmentHeight}\n width={w}\n height={h}\n color={\n pressedRow === row ? 'rgba(240,240,240,0.3)' : 'rgba(240,240,240,0.6)'\n }\n style=\"fill\"\n />\n <Line\n p1={{x, y: y - segmentHeight + h}}\n p2={{x: x + w, y: y - segmentHeight + h}}\n color=\"#ddd\"\n strokeWidth={1}\n />\n </React.Fragment>\n ))}\n </Canvas>\n </View>\n </GestureDetector>\n );\n};\n","import React, {useEffect, useMemo} from 'react';\nimport type {CalendarStoreBinding} from './bindings/calendarStoreBinding';\nimport {DisabledBlock, DisabledInterval, Event, Resource,} from '@/types/calendarTypes';\nimport {format} from \"date-fns\";\n\ntype Props = {\n store: CalendarStoreBinding;\n resources: Array<\n Resource & {\n events?: Event[];\n disabledBlocks?: DisabledBlock[];\n disableIntervals?: DisabledInterval[];\n }>;\n baseDate: Date; // the \"single-day\" fallback date\n};\n\nexport const StoreFeeder: React.FC<Props> = ({store, resources, baseDate}) => {\n const upsertResources = store.useUpsertResources();\n const setDayDataFor = store.useSetDayDataFor();\n const setDate = store.useSetDate();\n const baseDateKey = useMemo(() => format(baseDate, 'yyyy-MM-dd')!, [baseDate]);\n\n useEffect(() => {\n setDate(baseDate);\n // 1) Directory of resources (id/name/avatar only)\n upsertResources(resources.map(r => ({id: r.id, name: r.name, avatar: r.avatar})));\n\n // 2) Build single-day per-resource maps\n const dayBuckets = new Map<\n string,\n {\n events: Record<number, Event[]>;\n disabledBlocks: Record<number, DisabledBlock[]>;\n disableIntervals: Record<number, DisabledInterval[]>;\n }\n >();\n\n for (const r of resources) {\n const push = <T extends Event | DisabledBlock | DisabledInterval>(\n items: T[] | undefined,\n field: \"events\" | \"disabledBlocks\" | \"disableIntervals\"\n ) => {\n if (!items?.length) return;\n for (const it of items) {\n const key = it.date ?? baseDateKey;\n const bucket =\n dayBuckets.get(key) ??\n dayBuckets.set(key, {events: {}, disabledBlocks: {}, disableIntervals: {}}).get(key)!;\n\n const m = bucket[field] as Record<number, T[]>;\n (m[r.id] ||= []).push(it);\n }\n };\n\n push(r.events, \"events\");\n push(r.disabledBlocks, \"disabledBlocks\");\n push(r.disableIntervals, \"disableIntervals\");\n }\n\n for (const [dayKey, payload] of dayBuckets) {\n setDayDataFor(dayKey, payload);\n }\n }, [resources, upsertResources, setDayDataFor, baseDateKey]);\n\n return null;\n};\n","import React from \"react\";\nimport {StyleSheet, View} from \"react-native\";\nimport Svg, {Defs, Line, Pattern} from \"react-native-svg\";\nimport {Rect} from \"react-content-loader/native\";\nimport {useCalendarBinding} from \"@/store/bindings/BindingProvider\";\nimport {scalePosition} from \"@/utilities/helpers\";\n\ninterface DisabledIntervalsProp {\n id: number;\n APPOINTMENT_BLOCK_WIDTH: number;\n hourHeight: number;\n date?: Date;\n}\n\ninterface DisabledIntervalsProps {\n width: number;\n top: number;\n height: number;\n}\n\nconst DisabledInterval: React.FC<DisabledIntervalsProps> = ({width, top, height}) => {\n return <View style={[styles.disabledBlock, {width, top, height}]}>\n <Svg width={width} height=\"100%\">\n <Defs>\n <Pattern id=\"diagonalHatch\" patternUnits=\"userSpaceOnUse\" width=\"10\" height=\"10\">\n <Line x1=\"0\" y1=\"0\" x2=\"10\" y2=\"10\" stroke=\"rgba(150, 150, 150, 0.8)\" strokeWidth=\"1\"/>\n </Pattern>\n </Defs>\n <Rect width={width} height=\"100%\" fill=\"url(#diagonalHatch)\"/>\n </Svg>\n </View>\n};\n\nconst DisabledIntervals: React.FC<DisabledIntervalsProp> = React.memo(({\n id,\n APPOINTMENT_BLOCK_WIDTH,\n hourHeight,\n date: dateProp\n }) => {\n const {useDisabledIntervalsFor, useGetDate} =\n useCalendarBinding();\n const date = useGetDate();\n const disabledIntervals = useDisabledIntervalsFor(id, dateProp ?? date);\n\n return (\n <>\n {disabledIntervals.map((disabledInterval, index) => {\n return <DisabledInterval\n key={`${index}-${disabledInterval.from}-${disabledInterval.to}`} // Updated key to include disabledInterval values\n width={APPOINTMENT_BLOCK_WIDTH}\n top={scalePosition(disabledInterval.from, hourHeight)}\n height={scalePosition(disabledInterval.to - disabledInterval.from, hourHeight)}\n />\n }\n )}\n </>\n );\n});\n\nconst styles = StyleSheet.create({\n disabledBlock: {\n position: \"absolute\",\n zIndex: -10,\n },\n});\n\nexport default DisabledIntervals;\n","import React, {ReactNode} from \"react\";\nimport {View, ViewProps} from \"react-native\";\n\ninterface RowProps extends ViewProps {\n space?: number;\n divider?: ReactNode;\n}\n\nconst Row = ({children, divider, space, style, ...props}: RowProps) => {\n return (\n <View style={[{flexDirection: \"row\"}, style]} {...props}>\n {React.Children.toArray(children).map((child, index) => (\n <React.Fragment key={index}>\n {child}\n {index !== React.Children.toArray(children).length - 1 &&\n divider}\n {index !== React.Children.toArray(children).length - 1 &&\n <View style={{width: space, height: \"100%\"}}/>}\n </React.Fragment>\n ))}\n </View>\n );\n};\n\nexport default Row;\n","import React, {useMemo} from \"react\";\nimport {StyleSheet, Text, TouchableOpacity} from \"react-native\";\nimport {getHours, getMinutes, parse} from \"date-fns\";\nimport {\n columnsToPixels,\n computeDisabledBlockColumns,\n EventFrame,\n getTextSize,\n minutesToTime,\n scalePosition\n} from \"@/utilities/helpers\";\nimport Col from \"./common/layout/Col\";\nimport Row from \"./common/layout/Row\";\nimport {DisabledBlock} from \"@/types/calendarTypes\";\nimport {useCalendarBinding} from \"@/store/bindings/BindingProvider\";\nimport {useResolvedFont} from \"@/theme/ThemeContext\";\n\ninterface DisabledBlocksProps {\n id: number;\n hourHeight: number;\n APPOINTMENT_BLOCK_WIDTH: number;\n onDisabledBlockPress?: (block: DisabledBlock) => void;\n date?: Date;\n}\n\ninterface DisabledBlockComponentProps {\n top: number;\n height: number;\n hourHeight: number;\n disabledBlock: DisabledBlock;\n onDisabledBlockPress?: (block: DisabledBlock) => void;\n layout: EventFrame;\n}\n\nconst MINUTES_IN_DAY = 24 * 60;\n\nconst covertTimeToMinutes = (time: string) => {\n const parsedTime = parse(time, \"HH:mm\", new Date());\n return getHours(parsedTime) * 60 + getMinutes(parsedTime);\n}\n\n// Build a normalized [start, end) in minutes, allowing overnight\nconst toNormalizedInterval = (from?: string, to?: string) => {\n const start = covertTimeToMinutes(from ?? \"00:00\");\n let end = covertTimeToMinutes(to ?? \"00:00\");\n\n // If it wraps past midnight (e.g., 23:00 → 00:00), push end into the next day\n if (end <= start) end += MINUTES_IN_DAY;\n\n return {start, end};\n};\n\nconst DisabledBlockComponent: React.FC<DisabledBlockComponentProps> = ({\n top,\n height,\n layout,\n disabledBlock,\n hourHeight,\n onDisabledBlockPress\n }) => {\n const dynamicStyle = {\n backgroundColor: \"#d3d3d3\",\n top: top + 2,\n left: layout.leftPx + 1,\n height: height < hourHeight / 4 ? height : height - 4,\n width: layout.widthPx - 3,\n borderWidth: 1,\n borderColor: \"rgba(0,0,0,0.12)\",\n };\n const titleFace = useResolvedFont({fontWeight: '600'});\n\n return <TouchableOpacity\n style={[styles.event, dynamicStyle]}\n onPress={() => {\n onDisabledBlockPress && onDisabledBlockPress(disabledBlock);\n }}\n >\n <Col style={{position: \"relative\"}}>\n <Row style={{height: 18}}>\n <Text\n allowFontScaling={false}\n style={{\n fontFamily: titleFace,\n fontSize: getTextSize(hourHeight),\n fontWeight: \"600\"\n }}>{minutesToTime(disabledBlock?.from)} - {minutesToTime(disabledBlock?.to)}</Text>\n </Row>\n <Text\n allowFontScaling={false}\n style={{\n fontFamily: titleFace,\n fontSize: getTextSize(hourHeight),\n fontWeight: \"600\"\n }}>{disabledBlock?.title}</Text>\n </Col>\n </TouchableOpacity>\n};\n\nconst DisabledBlocks: React.FC<DisabledBlocksProps> = React.memo(({\n id,\n APPOINTMENT_BLOCK_WIDTH,\n hourHeight,\n onDisabledBlockPress,\n date: dateProp\n }) => {\n const {useDisabledBlocksFor, useGetDate} =\n useCalendarBinding();\n const date = useGetDate();\n const disabledBlocks = useDisabledBlocksFor(id, dateProp ?? date);\n\n const layoutMap = useMemo(() => {\n return columnsToPixels(computeDisabledBlockColumns(disabledBlocks), APPOINTMENT_BLOCK_WIDTH);\n }, [disabledBlocks]);\n\n return (\n <>\n {disabledBlocks.map((disabledBlock, index) => {\n const key = disabledBlock.id;\n return <DisabledBlockComponent\n hourHeight={hourHeight}\n disabledBlock={disabledBlock}\n key={`${index}-${disabledBlock.from}-${disabledBlock.to}`} // Updated key to include hour values\n top={scalePosition(disabledBlock.from, hourHeight)}\n height={scalePosition(disabledBlock.to - disabledBlock.from, hourHeight)}\n layout={layoutMap.get(key)!}\n onDisabledBlockPress={onDisabledBlockPress}\n />\n }\n )}\n </>\n );\n});\n\nconst styles = StyleSheet.create({\n event: {\n position: 'absolute',\n borderRadius: 5,\n padding: 2,\n overflow: \"hidden\",\n zIndex: 999, // Ensure events stay above the background blocks\n },\n});\n\nexport default DisabledBlocks;\n","import React from \"react\";\nimport {StyleSheet, Text, TextInput, TextStyle, TouchableOpacity, View, ViewStyle} from \"react-native\";\nimport Row from \"../components/common/layout/Row\";\nimport Col from \"../components/common/layout/Col\";\nimport Hidden from \"../components/common/layout/Hidden\";\nimport {Event, EventRenderContext} from \"@/types/calendarTypes\";\nimport {EventFrame, getTextSize, minutesToTime, scalePosition} from \"@/utilities/helpers\";\nimport {useCalendarBinding} from \"@/store/bindings/BindingProvider\";\nimport {useResolvedFont} from \"@/theme/ThemeContext\";\nimport {StyleProp} from \"react-native/Libraries/StyleSheet/StyleSheet\";\n\nexport type EventSlots = {\n // TopLeft?: React.ComponentType<{ event: Event; ctx: EventRenderContext }>;\n TopRight?: React.ComponentType<{ event: Event; ctx: EventRenderContext }>;\n Body?: React.ComponentType<{ event: Event; ctx: EventRenderContext }>;\n};\n\nexport type EventRenderer = (\n props: EventBlockProps & { children?: React.ReactNode }\n) => React.ReactNode;\n\nexport type StyleOverrides = Partial<{\n time: StyleProp<TextStyle>;\n container: ViewStyle;\n content: ViewStyle;\n title: TextStyle;\n desc: TextStyle;\n}>;\n\ninterface EventBlockProps {\n event: Event;\n hourHeight: number;\n frame: EventFrame;\n disabled?: boolean;\n selected?: boolean;\n onLongPress?: (event: Event) => void;\n onPress?: (event: Event) => void;\n slots?: EventSlots;\n styleOverrides?:\n | StyleOverrides\n | ((event: Event) => StyleOverrides | undefined);\n}\n\nconst EventBlock: React.FC<EventBlockProps> = React.memo(({\n event,\n onLongPress,\n onPress, disabled, selected,\n hourHeight, slots,\n frame,\n styleOverrides\n }) => {\n const {useGetSelectedEvent} =\n useCalendarBinding();\n const selectedAppointment = useGetSelectedEvent();\n\n const eventTop = scalePosition(event.from, hourHeight);\n const eventHeight = scalePosition(event.to - event.from, hourHeight);\n\n const start = minutesToTime(event.from);\n const end = minutesToTime(event.to);\n\n const dynamicStyle = {\n top: eventTop + 2,\n height: eventHeight < hourHeight / 4 ? eventHeight : eventHeight - 4,\n left: frame.leftPx + 1,\n width: frame.widthPx - 3,\n zIndex: frame.zIndex,\n opacity: selectedAppointment ? 0.5 : 1,\n borderWidth: selected ? 2 : 1,\n borderColor: selected ? \"#4d959c\" : \"rgba(0,0,0,0.12)\",\n };\n\n const resolved =\n typeof styleOverrides === 'function'\n ? styleOverrides(event) ?? {}\n : styleOverrides ?? {};\n\n if (eventHeight == 0)\n return null;\n\n const TopRight = slots?.TopRight;\n const Body = slots?.Body;\n const titleFace = useResolvedFont({fontWeight: '700'});\n const timeFace = useResolvedFont({fontWeight: '600'});\n\n return (\n <TouchableOpacity\n style={[styles.event, resolved?.container, dynamicStyle]}\n disabled={disabled}\n onPress={() => {\n onPress && onPress(event);\n }}\n onLongPress={() => {\n onLongPress && onLongPress(event);\n }}\n >\n <Hidden isHidden={!disabled}>\n <View style={{\n position: 'absolute',\n top: 0,\n width: \"150%\",\n height: '150%',\n zIndex: 1,\n backgroundColor: \"rgba(255, 255, 255, 0.5)\"\n }}/>\n </Hidden>\n <Col style={[{position: \"relative\"}, resolved?.content]}>\n <TextInput\n editable={false}\n allowFontScaling={false}\n underlineColorAndroid=\"transparent\" // Disables underline on Android\n style={[{\n width: \"100%\",\n fontFamily: timeFace,\n fontSize: getTextSize(hourHeight),\n pointerEvents: \"none\",\n padding: 0,\n margin: 0,\n }, resolved?.time]}\n defaultValue={`${start} - ${end}`}\n />\n\n {\n Body ? <Body event={event} ctx={{hourHeight}}/> :\n <>\n <Row style={{alignItems: \"center\", height: 18}}>\n <Text\n allowFontScaling={false}\n style={[{\n fontFamily: titleFace,\n fontSize: getTextSize(hourHeight),\n fontWeight: \"700\"\n }, resolved?.title]}\n >{event?.title}</Text>\n </Row>\n <Text\n allowFontScaling={false}\n style={[{\n fontFamily: timeFace,\n fontSize: getTextSize(hourHeight),\n fontWeight: \"600\"\n }, resolved?.desc]}>{event?.description}</Text>\n </>\n }\n <Row style={{\n position: \"absolute\",\n right: 2\n }}>\n {TopRight ? <TopRight event={event} ctx={{hourHeight}}/> : null}\n </Row>\n </Col>\n </TouchableOpacity>\n );\n});\n\nconst styles = StyleSheet.create({\n event: {\n backgroundColor: '#4d959c',\n position: 'absolute',\n borderRadius: 5,\n padding: 2,\n overflow: \"hidden\",\n zIndex: 9999, // Ensure events stay above the background blocks\n }\n});\n\nexport default EventBlock;\n","import * as React from 'react';\nimport {useMemo} from 'react';\nimport Animated, {AnimatedProps, SharedValue, useAnimatedProps, useAnimatedStyle} from \"react-native-reanimated\";\nimport Col from \"./common/layout/Col\";\nimport Row from \"./common/layout/Row\";\nimport {MaterialIcons} from \"@expo/vector-icons\";\nimport {StyleSheet, Text, TextInput, TextInputProps} from \"react-native\";\nimport {Event} from \"@/types/calendarTypes\";\nimport {EventSlots, StyleOverrides} from \"./EventBlock\";\nimport {getTextSize, minutesToTime, positionToMinutes} from \"@/utilities/helpers\";\nimport {useResolvedFont} from \"@/theme/ThemeContext\";\n\ntype Props = {\n selectedEvent: Event;\n APPOINTMENT_BLOCK_WIDTH: number;\n hourHeight: number;\n panYAbs: SharedValue<number>;\n panXAbs: SharedValue<number>;\n eventStartedTop: SharedValue<number>;\n eventHeight: SharedValue<number>;\n slots?: EventSlots;\n styleOverrides?: | StyleOverrides\n | ((event: Event) => StyleOverrides | undefined);\n};\n\nconst AnimatedTextInput = Animated.createAnimatedComponent(TextInput);\ntype AnimatedTextInputProps = AnimatedProps<TextInputProps> & { text: string };\nexport const DraggableEvent = ({\n selectedEvent,\n eventStartedTop,\n panYAbs, panXAbs,\n APPOINTMENT_BLOCK_WIDTH,\n hourHeight,\n eventHeight, styleOverrides,\n slots\n }: Props) => {\n const dynamicStyle = useAnimatedStyle(() => {\n return {\n height: eventHeight.value < hourHeight / 4 ? eventHeight.value : eventHeight.value - 4,\n width: APPOINTMENT_BLOCK_WIDTH - 3,\n borderWidth: 1,\n borderColor: \"rgba(0,0,0,0.12)\",\n }\n });\n\n const draggingAnimatedStyle = useAnimatedStyle(() => {\n if (!selectedEvent) {\n return {\n opacity: 0,\n transform: [\n {\n translateY: 0,\n },\n {\n translateX: 0,\n },\n ],\n };\n }\n return {\n opacity: 1,\n transform: [\n {\n translateY: panYAbs.value - (eventHeight.value / 2) + 2,\n },\n {\n translateX: panXAbs.value - (APPOINTMENT_BLOCK_WIDTH / 2) + 1,\n },\n ],\n };\n }, [selectedEvent, APPOINTMENT_BLOCK_WIDTH]);\n\n const initialDisplayTime = useMemo(() => {\n // Use the initial values calculated above, not the shared value\n const start = minutesToTime(positionToMinutes(eventStartedTop.value, hourHeight));\n const end = minutesToTime(positionToMinutes(eventStartedTop.value + eventHeight.value, hourHeight));\n return `${start} - ${end}`;\n }, [hourHeight]);\n\n const animatedTimeProps = useAnimatedProps<AnimatedTextInputProps>(() => {\n const start = minutesToTime(positionToMinutes(eventStartedTop.value, hourHeight));\n const end = minutesToTime(positionToMinutes(eventStartedTop.value + eventHeight.value, hourHeight));\n return {\n text: `${start} - ${end}`\n };\n }, [hourHeight]);\n\n const resolved =\n typeof styleOverrides === 'function'\n ? styleOverrides(selectedEvent) ?? {}\n : styleOverrides ?? {};\n\n const TopRight = slots?.TopRight;\n const Body = slots?.Body;\n const titleFace = useResolvedFont({fontWeight: '700'});\n const timeFace = useResolvedFont({fontWeight: '600'});\n\n return (\n <Animated.View style={[styles.event, dynamicStyle, draggingAnimatedStyle, resolved?.container]}>\n <Col style={[{position: \"relative\"}, resolved?.content]}>\n <AnimatedTextInput\n editable={false}\n allowFontScaling={false}\n underlineColorAndroid=\"transparent\" // Disables underline on Android\n style={[{\n width: \"100%\",\n fontFamily: timeFace,\n fontSize: getTextSize(hourHeight),\n pointerEvents: \"none\",\n padding: 0,\n margin: 0,\n }, resolved?.time]}\n defaultValue={initialDisplayTime}\n animatedProps={animatedTimeProps}\n />\n {\n Body ? <Body event={selectedEvent} ctx={{hourHeight}}/> :\n <>\n <Row style={{alignItems: \"center\", height: 18}}>\n <Text\n allowFontScaling={false}\n style={[{\n fontFamily: titleFace,\n fontSize: getTextSize(hourHeight),\n fontWeight: \"700\"\n }, resolved?.title]}\n >{selectedEvent?.title}</Text>\n </Row>\n <Text\n allowFontScaling={false}\n style={[{\n fontFamily: timeFace,\n fontSize: getTextSize(hourHeight),\n fontWeight: \"600\"\n }, resolved?.desc]}>{selectedEvent?.description}</Text>\n </>\n }\n <Row style={{\n position: \"absolute\",\n right: 2\n }} space={2}>\n {TopRight ? <TopRight event={selectedEvent} ctx={{hourHeight}}/> : null}\n </Row>\n </Col>\n <Row style={{\n position: \"absolute\",\n alignSelf: \"center\", bottom: 0\n }}>\n <MaterialIcons name=\"drag-handle\" size={12} color=\"black\"/>\n </Row>\n </Animated.View>\n );\n};\n\nconst styles = StyleSheet.create({\n event: {\n backgroundColor: '#4d959c',\n position: 'absolute',\n borderRadius: 5,\n padding: 2,\n overflow: \"hidden\",\n zIndex: 99, // Ensure events stay above the background blocks\n }\n});\n","import React, {useMemo} from \"react\";\nimport {useCalendarBinding} from \"@/store/bindings/BindingProvider\";\nimport {Event, LayoutMode} from \"@/types/calendarTypes\";\nimport {EventRenderer} from \"./EventBlock\";\nimport {computeEventFrames} from \"@/utilities/helpers\";\n\ntype FlagFn = (event: Event) => boolean;\n\ninterface EventBlocksProps {\n id: number;\n EVENT_BLOCK_WIDTH: number;\n hourHeight: number;\n onLongPress: (evt: Event) => void;\n onPress: (evt: Event) => void;\n eventRenderer: EventRenderer;\n isEventSelected?: FlagFn;\n isEventDisabled?: FlagFn;\n mode: LayoutMode;\n date?: Date;\n}\n\nconst EventBlocks: React.FC<EventBlocksProps> = React.memo(({\n id,\n onLongPress,\n onPress,\n hourHeight,\n EVENT_BLOCK_WIDTH,\n eventRenderer,\n isEventDisabled, isEventSelected,\n mode,\n date: dateProp\n }) => {\n\n const {useEventsFor, useGetDate} =\n useCalendarBinding();\n const date = useGetDate();\n const events = useEventsFor(id, dateProp ?? date);\n const frameMap = useMemo(\n () => computeEventFrames(events, EVENT_BLOCK_WIDTH, mode),\n [events, mode, EVENT_BLOCK_WIDTH]\n );\n\n const Renderer = eventRenderer;\n\n return (events?.map((evt: Event, index: number) => {\n const selected = isEventSelected?.(evt) ?? false;\n const disabled = isEventDisabled?.(evt) ?? false;\n\n return <Renderer\n key={`${evt.from}-${evt.to}-${index}`} // Unique key for appointment blocks\n event={evt}\n onLongPress={(evt: Event) => onLongPress(evt)}\n onPress={(evt: Event) => onPress(evt)}\n hourHeight={hourHeight}\n frame={frameMap.get(evt.id)!}\n selected={selected}\n disabled={disabled}\n />\n }\n )\n );\n});\n\nexport default EventBlocks;\n","// @flow\nimport * as React from 'react';\nimport {useMemo} from 'react';\nimport Row from \"@/components/common/layout/Row\";\nimport {Text} from \"react-native\";\nimport {TIME_LABEL_WIDTH} from \"@/utilities/helpers\";\nimport {StaffAvatar} from \"@/components/ResourcesComponent\";\nimport {CalendarMode, Resource} from \"@/types/calendarTypes\";\nimport {useCalendarBinding} from \"@/store/bindings/BindingProvider\";\nimport {useResolvedFont} from \"@/theme/ThemeContext\";\nimport Col from \"@/components/common/layout/Col\";\nimport {addDays, format, isSameDay} from \"date-fns\";\nimport Center from \"@/components/common/layout/Center\";\n\ntype Props = {\n onResourcePress?: (resource: Resource) => void;\n activeResourceId: number;\n date: Date;\n mode: CalendarMode;\n APPOINTMENT_BLOCK_WIDTH: number;\n};\nexport const DaysComponent = ({onResourcePress, activeResourceId, mode, date, APPOINTMENT_BLOCK_WIDTH}: Props) => {\n const {useResourceById} =\n useCalendarBinding();\n const resource = useResourceById(activeResourceId);\n const titleFace = useResolvedFont({fontWeight: '700'});\n const subTitleFace = useResolvedFont({fontWeight: '600'});\n const isMultiDay = mode !== 'day';\n const visibleDayCount = isMultiDay ? (mode === 'week' ? 7 : 3) : 1;\n const days = useMemo(\n () => Array.from({length: visibleDayCount}, (_, i) => addDays(date, i)),\n [date, visibleDayCount]\n );\n\n return (\n <Row style={{paddingVertical: 4}}>\n <Col style={{width: TIME_LABEL_WIDTH, alignItems: \"center\", justifyContent: \"center\"}}>\n <StaffAvatar\n onPress={() => {\n if (onResourcePress)\n onResourcePress(resource);\n }}\n name={resource?.name}\n circleSize={TIME_LABEL_WIDTH - 12}\n fontSize={16}\n image={resource?.avatar}\n />\n </Col>\n <Row style={{flex: 1}}>\n {\n days.map((d, i) => {\n const selected = isSameDay(d, new Date());\n\n return <Col\n style={{\n alignItems: \"center\",\n justifyContent: \"center\",\n width: APPOINTMENT_BLOCK_WIDTH,\n }}\n space={4}\n key={i}>\n <Center style={{\n backgroundColor: selected ? \"#4d959c\" : undefined,\n width: Math.min(30, APPOINTMENT_BLOCK_WIDTH - 8),\n height: Math.min(30, APPOINTMENT_BLOCK_WIDTH - 8),\n borderRadius: 999,\n }}>\n <Text style={{\n fontSize: 16,\n fontFamily: subTitleFace,\n fontWeight: '600',\n color: selected ? \"#fff\" : undefined,\n }}\n numberOfLines={1}\n allowFontScaling={false}\n >\n {format(d, \"d\")}\n </Text>\n </Center>\n <Text style={{\n fontSize: 14,\n fontFamily: subTitleFace,\n fontWeight: '600',\n }}\n numberOfLines={1}\n allowFontScaling={false}\n >\n {format(d, \"EEE\")}\n </Text>\n </Col>\n })\n }\n </Row>\n </Row>\n );\n};\n","import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';\nimport {Gesture, GestureDetector} from \"react-native-gesture-handler\";\nimport Animated, {\n runOnJS,\n scrollTo,\n useAnimatedRef,\n useAnimatedScrollHandler,\n useFrameCallback,\n useSharedValue,\n withSpring\n} from \"react-native-reanimated\";\nimport {Dimensions, LayoutChangeEvent, Platform, StyleSheet, useWindowDimensions, View} from \"react-native\";\nimport {FlashList} from \"@shopify/flash-list\";\nimport * as Haptics from \"expo-haptics\";\nimport {\n combineDateAndTime,\n findDayIndexFor,\n findResourceIndexFor,\n positionToMinutes,\n scalePosition,\n TIME_LABEL_WIDTH\n} from '@/utilities/helpers';\nimport {TimeLabels} from './TimeLabels';\nimport {ResourcesComponent} from \"./ResourcesComponent\";\nimport {EventGridBlocksSkia} from \"./EventGridBlocks\";\nimport {\n CalendarMode,\n CalendarTheme,\n DisabledBlock,\n DisabledInterval,\n Event,\n LayoutMode,\n Resource\n} from '@/types/calendarTypes';\nimport {StoreFeeder} from '@/store/StoreFeeder';\nimport {useCalendarBinding} from '@/store/bindings/BindingProvider';\nimport DisabledIntervals from './DisabledIntervals';\nimport DisabledBlocks from './DisabledBlocks';\nimport EventBlock, {EventRenderer, EventSlots, StyleOverrides} from \"@/components/EventBlock\";\nimport {DraggableEvent} from \"@/components/DraggableEvent\";\nimport {CalendarThemeProvider} from \"@/theme/ThemeContext\";\nimport EventBlocks from \"@/components/EventBlocks\";\nimport {DaysComponent} from \"@/components/DaysComponent\";\nimport {addDays, format} from 'date-fns';\n\ntype FlagFn = (event: Event) => boolean;\ntype Column =\n | { kind: 'resource'; resourceId: number }\n | { kind: 'day'; dayIndex: number; dayDate: Date };\n\ninterface CalendarProps {\n timezone?: string;\n date: Date;\n startMinutes?: number;\n resources: Array<Resource & {\n events: Event[];\n disabledBlocks?: DisabledBlock[];\n disableIntervals?: DisabledInterval[];\n }>;\n\n snapIntervalInMinutes?: number;\n numberOfColumns?: number;\n hourHeight?: number;\n\n onResourcePress?: (resource: Resource) => void;\n onBlockLongPress?: (resource: Resource, date: Date) => void;\n onDisabledBlockPress?: (block: DisabledBlock) => void;\n onEventPress?: (event: Event) => void;\n onEventLongPress?: (event: Event) => void;\n eventSlots?: EventSlots;\n eventStyleOverrides?:\n | StyleOverrides\n | ((event: Event) => StyleOverrides | undefined);\n isEventSelected?: FlagFn;\n isEventDisabled?: FlagFn;\n\n theme?: CalendarTheme;\n overLappingLayoutMode?: LayoutMode;\n\n mode?: CalendarMode;\n activeResourceId?: number;\n}\n\ntype Layout = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\nconst AnimatedFlashList = Animated.createAnimatedComponent(FlashList);\n\nconst CalendarInner: React.FC<CalendarProps> = (props) => {\n const {width} = useWindowDimensions();\n const isIOS = Platform.OS === 'ios';\n const binding = useCalendarBinding();\n\n const {\n date,\n numberOfColumns: numberOfColumnsProp = 3,\n startMinutes,\n hourHeight = 120,\n snapIntervalInMinutes = 5,\n timezone = Intl?.DateTimeFormat()?.resolvedOptions()?.timeZone,\n resources,\n onResourcePress,\n onBlockLongPress,\n onEventPress,\n onEventLongPress,\n onDisabledBlockPress,\n eventSlots,\n eventStyleOverrides,\n overLappingLayoutMode = 'stacked',\n mode = 'day',\n activeResourceId,\n } = props;\n\n const numberOfColumns = mode === 'day' ? numberOfColumnsProp : (mode === 'week' ? 7 : 3);\n const isMultiDay = mode !== 'day';\n const visibleDayCount = isMultiDay ? (mode === 'week' ? 7 : 3) : 1;\n const days = useMemo(\n () => Array.from({length: visibleDayCount}, (_, i) => addDays(date, i)),\n [date, visibleDayCount]\n );\n\n const snapInterval = (hourHeight / 60) * snapIntervalInMinutes;\n const onPressRef = React.useRef(onEventPress);\n const onLongPressRef = React.useRef(onEventLongPress);\n const internalOnLongPress = useRef<((e: Event) => void) | null>(null);\n const onDisabledBlockPressRef = React.useRef(onDisabledBlockPress);\n const selectedRef = useRef<FlagFn | undefined>(props.isEventSelected);\n const disabledRef = useRef<FlagFn | undefined>(props.isEventDisabled);\n\n const effectiveRenderer = useMemo<EventRenderer>(() => {\n return (p) => (\n <EventBlock\n {...p}\n slots={props.eventSlots}\n styleOverrides={props.eventStyleOverrides}\n />\n );\n }, [eventSlots, eventStyleOverrides]);\n\n const isEventSelectedStable = useCallback<FlagFn>(\n (ev) => (selectedRef.current ? selectedRef.current(ev) : false), []);\n\n const isEventDisabledStable = useCallback<FlagFn>(\n (ev) => (disabledRef.current ? disabledRef.current(ev) : false), []);\n\n // Keep refs up to date\n useEffect(() => {\n onPressRef.current = onEventPress;\n }, [onEventPress]);\n\n useEffect(() => {\n onLongPressRef.current = onEventLongPress;\n }, [onEventLongPress]);\n\n useEffect(() => {\n onDisabledBlockPressRef.current = onDisabledBlockPress;\n }, [onDisabledBlockPress]);\n\n useEffect(() => {\n rendererRef.current = effectiveRenderer;\n }, [effectiveRenderer]);\n\n useEffect(() => {\n selectedRef.current = props.isEventSelected;\n }, [props.isEventSelected]);\n\n useEffect(() => {\n disabledRef.current = props.isEventDisabled;\n }, [props.isEventDisabled]);\n\n const rendererRef = useRef<EventRenderer>(effectiveRenderer);\n const stableRenderer = useCallback<EventRenderer>((p) => rendererRef.current(p), []);\n\n const stableOnPress = React.useCallback((e: Event) => onPressRef.current?.(e), []);\n const stableOnDisabledBlockPress = React.useCallback((b: DisabledBlock) => onDisabledBlockPressRef.current?.(b), []);\n\n const {useGetSelectedEvent, useSetSelectedEvent, useSetDraggedEventDraft, useGetDraggedEventDraft} =\n useCalendarBinding();\n const selectedEvent = useGetSelectedEvent();\n const setSelectedEvent = useSetSelectedEvent();\n const setDraggedEventDraft = useSetDraggedEventDraft();\n\n const APPOINTMENT_BLOCK_WIDTH = (width - TIME_LABEL_WIDTH) / numberOfColumns;\n\n const hourHeightRef = useRef(hourHeight);\n const resourcesRef = useRef(resources);\n const apptWidthRef = useRef(APPOINTMENT_BLOCK_WIDTH);\n const isMultiDayRef = useRef(isMultiDay);\n const daysRef = useRef(days);\n\n useEffect(() => {\n hourHeightRef.current = hourHeight\n }, [hourHeight]);\n useEffect(() => {\n resourcesRef.current = resources\n }, [resources]);\n useEffect(() => {\n apptWidthRef.current = APPOINTMENT_BLOCK_WIDTH\n }, [APPOINTMENT_BLOCK_WIDTH]);\n useEffect(() => {\n isMultiDayRef.current = isMultiDay\n }, [isMultiDay]);\n useEffect(() => {\n daysRef.current = days\n }, [days]);\n\n useEffect(() => {\n if (!selectedEvent) {\n setDraggedEventDraft(null);\n }\n }, [selectedEvent]);\n\n useEffect(() => {\n scrollX.value = 0;\n }, [mode]);\n\n const verticalScrollViewRef = useAnimatedRef<Animated.ScrollView>();\n const headerScrollViewRef = useAnimatedRef<Animated.ScrollView>();\n\n const flashListRef = useRef<FlashList<any>>(null);\n const prevResourceIdsRef = useRef<(number)[]>([]);\n const [layout, setLayout] = useState<Layout | null>(null);\n\n const dateRef = useRef(date); // Store `date` in a ref to prevent re-renders\n\n const eventStartedTop = useSharedValue(0);\n const eventHeight = useSharedValue(0);\n\n const panXAbs = useSharedValue(0);\n const panYAbs = useSharedValue(0);\n const isPulling = useSharedValue(false);\n const isDragging = useSharedValue(false);\n\n const scrollX = useSharedValue(0);\n const scrollY = useSharedValue(0);\n const autoScrollSpeed = useSharedValue(0);\n const autoScrollXSpeed = useSharedValue(0);\n const lastHapticScrollY = useSharedValue(0);\n const lastXScrollTime = useSharedValue(0);\n\n const startedX = useSharedValue(0);\n const startedY = useSharedValue(0);\n const touchY = useSharedValue(0); // NEW\n\n const triggerHaptic = useCallback(() => {\n Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n }, []);\n\n const resourceIds = useMemo(() => {\n const ids = resources?.map(item => item?.id) || [];\n if (JSON.stringify(prevResourceIdsRef.current) !== JSON.stringify(ids)) {\n prevResourceIdsRef.current = ids;\n }\n return prevResourceIdsRef.current;\n }, [resources]);\n\n const finalizeDrag = React.useCallback((\n colIndex: number,\n adjustedTop: number,\n height: number\n ) => {\n // decide what column means based on mode\n const isMultiDay = mode !== 'day';\n const landedResourceId = !isMultiDay\n ? resourceIds[colIndex] // day mode → resource column\n : (activeResourceId ?? resourceIds[0]); // multi-day → fixed resource\n\n const landedDate = format(!isMultiDay\n ? date // day mode → resource column\n : days[colIndex], \"yyyy-MM-dd\") // day mode → constant day\n\n setDraggedEventDraft({\n event: selectedEvent!, // ensure this is not stale (store/ref)\n from: positionToMinutes(adjustedTop, hourHeight),\n to: positionToMinutes(adjustedTop + height, hourHeight),\n resourceId: landedResourceId,\n date: landedDate,\n });\n }, [mode, resourceIds, activeResourceId, selectedEvent, hourHeight, setDraggedEventDraft, days]);\n\n const columns: Column[] = useMemo(() => {\n if (!isMultiDay) {\n // Day mode: one day x multiple resources (keep current behavior)\n return resourceIds.map(resourceId => ({kind: 'resource', resourceId}));\n }\n // Multi-day mode: multiple days x single active resource\n return days.map((dayDate, dayIndex) => ({kind: 'day', dayIndex, dayDate}));\n }, [isMultiDay, resourceIds, days]);\n\n const panGesture = Gesture.Pan()\n .manualActivation(!isIOS)\n .enabled(layout !== null)\n .shouldCancelWhenOutside(false)\n .onTouchesMove((_evt, stateManager) => {\n 'worklet';\n if (isIOS) return;\n if (selectedEvent)\n stateManager.activate();\n else stateManager.end();\n })\n .onUpdate((evt) => {\n 'worklet';\n // Check if the event is draggable, only draggable if gesture is within the selected event block\n if (!evt || evt.y == null || evt.x == null) return;\n let draggable = false;\n let pullable = false;\n\n const draggableMinY = panYAbs.value - eventHeight.value / 2;\n const draggableMaxY = panYAbs.value + eventHeight.value / 2 - (eventHeight.value <= snapInterval * 3 * 2 ? snapInterval : snapInterval * 3);\n const pullableMaxY = panYAbs.value + eventHeight.value / 2;\n\n const blockMinX = panXAbs.value - APPOINTMENT_BLOCK_WIDTH / 2;\n const blockMaxX = panXAbs.value + APPOINTMENT_BLOCK_WIDTH / 2;\n\n touchY.value = evt.y; // NEW: always remember the last finger Y, for classic “finger parked on the edge” problem.\n\n if (evt.x >= blockMinX && evt.x <= blockMaxX) {\n draggable = evt.y >= draggableMinY && evt.y <= draggableMaxY;\n pullable = evt.y > draggableMaxY && evt.y <= pullableMaxY + snapInterval * 3;\n }\n\n if ((pullable && !isDragging.value) || isPulling.value) {\n isPulling.value = true;\n const onScreenTop = eventStartedTop.value - scrollY.value;\n const newHeight = evt.y - onScreenTop;\n const snappedHeight = Math.round(newHeight / snapInterval) * snapInterval;\n let finalHeight = Math.max(hourHeight / 4, snappedHeight);\n\n const totalDayHeight = 24 * hourHeight;\n const maxAllowedHeight = totalDayHeight - eventStartedTop.value;\n finalHeight = Math.min(finalHeight, maxAllowedHeight);\n\n if (finalHeight !== eventHeight.value) {\n eventHeight.value = finalHeight;\n panYAbs.value = onScreenTop + (finalHeight / 2);\n runOnJS(triggerHaptic)();\n }\n\n if (layout) {\n const AUTO_SCROLL_BUFFER = 30;\n\n if (evt.y > layout.height - AUTO_SCROLL_BUFFER) {\n autoScrollSpeed.value = 1;\n } else if (evt.y < AUTO_SCROLL_BUFFER && newHeight > hourHeight / 4) {\n autoScrollSpeed.value = -1;\n } else {\n autoScrollSpeed.value = 0;\n }\n } else {\n autoScrollSpeed.value = 0;\n }\n }\n\n if ((draggable && !isPulling.value) || isDragging.value) {\n isDragging.value = true; // Reset dragging state\n // --- Vertical Drag Logic ---\n const translatedY = Math.round(evt.translationY / snapInterval) * snapInterval;\n // 1. Calculate the proposed ABSOLUTE top position within the entire scroll content\n const proposedAbsoluteTop = (startedY.value - (eventHeight.value / 2)) + translatedY + scrollY.value;\n // 2. Snap this absolute position to the nearest grid line\n let snappedAbsoluteTop = Math.round(proposedAbsoluteTop / snapInterval) * snapInterval;\n // 3. Apply the absolute top boundary (12:00 AM)\n snappedAbsoluteTop = Math.max(0, snappedAbsoluteTop);\n // 4. Apply the absolute bottom boundary to keep the top of the appointment visible on screen\n if (layout) {\n // The maximum absolute top is the bottom of the screen plus the current scroll offset, with a one-block buffer.\n const maxAbsoluteTop = (layout.height + scrollY.value) - snapInterval;\n snappedAbsoluteTop = Math.min(snappedAbsoluteTop, maxAbsoluteTop);\n }\n // 5. Update shared values\n if (snappedAbsoluteTop !== eventStartedTop.value) {\n runOnJS(triggerHaptic)();\n eventStartedTop.value = snappedAbsoluteTop;\n }\n // 6. Convert the corrected absolute top back to a visual on-screen position\n panYAbs.value = (snappedAbsoluteTop - scrollY.value) + (eventHeight.value / 2);\n\n // --- Horizontal Drag Logic ---\n let panXAbsValue = Math.max(\n (APPOINTMENT_BLOCK_WIDTH) / 2 + TIME_LABEL_WIDTH,\n startedX.value + evt.translationX\n );\n\n if (layout?.width) {\n panXAbsValue = Math.min(\n layout.width - (APPOINTMENT_BLOCK_WIDTH) / 2,\n panXAbsValue\n );\n }\n panXAbs.value = panXAbsValue;\n\n // --- Auto-scroll Logic ---\n if (layout) {\n const AUTO_SCROLL_BUFFER = 30;\n\n if (evt.y > layout.height - AUTO_SCROLL_BUFFER) {\n autoScrollSpeed.value = 1;\n } else if (evt.y < AUTO_SCROLL_BUFFER) {\n autoScrollSpeed.value = -1;\n } else {\n autoScrollSpeed.value = 0;\n }\n\n if (panXAbs.value >= layout.width - APPOINTMENT_BLOCK_WIDTH / 2) {\n autoScrollXSpeed.value = 1;\n } else if (panXAbs.value <= APPOINTMENT_BLOCK_WIDTH / 2 + TIME_LABEL_WIDTH) {\n autoScrollXSpeed.value = -1;\n } else {\n autoScrollXSpeed.value = 0;\n }\n } else {\n autoScrollSpeed.value = 0;\n autoScrollXSpeed.value = 0;\n }\n }\n })\n .onEnd(() => {\n 'worklet';\n // Stop any active auto-scrolling\n autoScrollSpeed.value = 0;\n autoScrollXSpeed.value = 0;\n lastXScrollTime.value = 0;\n\n // --- Final Authoritative Calculation ---\n // Recalculate one last time to get the perfect final grid position.\n\n // Vertical\n const finalEventTop = (panYAbs.value - (eventHeight.value / 2)) + scrollY.value;\n let adjustedFinalEventTop = Math.round(finalEventTop / snapInterval) * snapInterval;\n adjustedFinalEventTop = Math.max(0, adjustedFinalEventTop); // Enforce final boundary\n const finalPanYValue = (adjustedFinalEventTop - scrollY.value) + (eventHeight.value / 2);\n\n // Horizontal\n const finalXOnScreen = panXAbs.value;\n const absoluteX = finalXOnScreen + scrollX.value;\n const newStaffIndex = Math.floor((absoluteX - TIME_LABEL_WIDTH) / APPOINTMENT_BLOCK_WIDTH);\n const colIndex = Math.max(0, Math.min(newStaffIndex, columns.length - 1));\n const finalPanXValue = TIME_LABEL_WIDTH + (colIndex * APPOINTMENT_BLOCK_WIDTH) - scrollX.value + (APPOINTMENT_BLOCK_WIDTH / 2);\n\n // This provides the smooth \"snap\" effect for both axes.\n panYAbs.value = withSpring(finalPanYValue);\n panXAbs.value = withSpring(finalPanXValue);\n\n // --- Update State ---\n // Set the final, correct data that will be used by onSave.\n if (!isPulling.value) {\n eventStartedTop.value = adjustedFinalEventTop;\n }\n\n // Set the starting points for the next drag from the final, snapped position.\n startedY.value = finalPanYValue;\n startedX.value = finalPanXValue;\n\n isPulling.value = false;\n isDragging.value = false\n\n runOnJS(finalizeDrag)(colIndex, adjustedFinalEventTop, eventHeight.value);\n });\n\n const scrollListTo = (x: number) => {\n flashListRef.current?.scrollToOffset({offset: x, animated: false});\n };\n\n // Auto-scrolling x effect when dragging an appointment on the edge of the screen\n useFrameCallback((frameInfo) => {\n if (autoScrollXSpeed.value === 0) {\n return;\n }\n\n const now = frameInfo.timeSinceFirstFrame;\n const scrollInterval = 500; // Time in ms between each scroll jump\n\n // Check if enough time has passed since the last scroll\n if (now - lastXScrollTime.value > scrollInterval) {\n lastXScrollTime.value = now; // Reset the timer\n\n // Calculate the increment as one full block width\n const increment = APPOINTMENT_BLOCK_WIDTH * Math.sign(autoScrollXSpeed.value);\n const newScrollX = scrollX.value + increment;\n\n // Use the Reanimated scrollTo function to jump to the next column\n runOnJS(scrollListTo)(newScrollX);\n // Trigger a haptic on each scroll jump\n runOnJS(Haptics.impactAsync)(Haptics.ImpactFeedbackStyle.Medium);\n }\n });\n\n useFrameCallback(() => {\n // Exit if we are not dragging or not supposed to be scrolling\n if (autoScrollSpeed.value === 0) {\n return;\n }\n\n // Adjust the divisor to control speed\n const increment = (snapInterval / 5) * Math.sign(autoScrollSpeed.value);\n const newScrollY = scrollY.value + increment;\n\n // Use the Reanimated scrollTo function to command the scroll view from the UI thread\n scrollTo(verticalScrollViewRef, 0, newScrollY, false);\n\n // --- Update eventStartedTop with the boundary check ---\n if (isDragging.value) {\n let currentEventTop = (panYAbs.value - (eventHeight.value / 2)) + newScrollY;\n currentEventTop = Math.round(currentEventTop / snapInterval) * snapInterval;\n // top boundary check\n eventStartedTop.value = Math.max(0, currentEventTop);\n }\n\n if (isPulling.value) {\n // recompute height using saved touchY and the newly scrolled content\n const onScreenTop = eventStartedTop.value - newScrollY;\n const newHeight = touchY.value - onScreenTop;\n const snappedHeight = Math.round(newHeight / snapInterval) * snapInterval;\n\n let finalHeight = Math.max(hourHeight / 4, snappedHeight);\n const totalDayHeight = 24 * hourHeight;\n const maxAllowedHeight = totalDayHeight - eventStartedTop.value;\n finalHeight = Math.min(finalHeight, maxAllowedHeight);\n\n if (finalHeight !== eventHeight.value) {\n eventHeight.value = finalHeight;\n panYAbs.value = onScreenTop + (finalHeight / 2);\n }\n\n if (hourHeight / 4 == finalHeight) {\n autoScrollSpeed.value = 0; // Stop auto-scrolling if height is minimum\n }\n }\n\n // --- Throttled Haptic Feedback ---\n const scrollDiff = Math.abs(newScrollY - lastHapticScrollY.value);\n\n if (scrollDiff >= snapInterval) {\n // Update the last position to the current position\n lastHapticScrollY.value = newScrollY;\n runOnJS(Haptics.impactAsync)(Haptics.ImpactFeedbackStyle.Medium);\n }\n });\n\n useEffect(() => {\n internalOnLongPress.current = (event: Event) => {\n onLongPressRef.current?.(event);\n\n // --- Compute vertical placement ---\n const hh = hourHeightRef.current;\n const eventTop = scalePosition(event.from, hh);\n const eventTo = event.to < event.from ? event.to + 1440 : event.to; // handle events that span past midnight\n const initialHeight = scalePosition(eventTo - event.from, hh);\n const panAbsValue = (eventTop - scrollY.value) + (initialHeight / 2);\n\n panYAbs.value = panAbsValue;\n startedY.value = panAbsValue;\n eventStartedTop.value = eventTop;\n\n // --- Compute horizontal placement ---\n const resources = resourcesRef.current;\n const days = daysRef.current;\n const APPOINTMENT_BLOCK_WIDTH = apptWidthRef.current;\n const isMultiDay = isMultiDayRef.current;\n const EPS = 0.0001;\n // Use floor (+EPS) so we never jump to the next col early\n const leftmostColumnIndex = Math.max(0, Math.floor((scrollX.value + EPS) / APPOINTMENT_BLOCK_WIDTH));\n\n let absoluteColIndex: number;\n\n if (!isMultiDay) {\n // day mode → column represents a resource\n absoluteColIndex = findResourceIndexFor(event.resourceId, resources?.map(r => r.id));\n } else {\n // multi-day → column represents a day\n absoluteColIndex = findDayIndexFor(event.date, days);\n }\n const screenColumn = absoluteColIndex - leftmostColumnIndex;\n\n const selectedAppointmentStartedX =\n TIME_LABEL_WIDTH +\n APPOINTMENT_BLOCK_WIDTH / 2 +\n APPOINTMENT_BLOCK_WIDTH * screenColumn;\n\n panXAbs.value = selectedAppointmentStartedX;\n startedX.value = selectedAppointmentStartedX;\n\n // --- Initialize state ---\n lastHapticScrollY.value = scrollY.value;\n eventHeight.value = initialHeight;\n setSelectedEvent(event);\n Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium);\n };\n }, []); // runs once; reads fresh values via refs\n\n const internalStableOnLongPress = useCallback((e: Event) => {\n internalOnLongPress.current?.(e);\n }, []);\n\n const onLayout = useCallback((evt: LayoutChangeEvent) => {\n setLayout(evt?.nativeEvent?.layout);\n }, []);\n\n const verticalScrollHandler = useAnimatedScrollHandler({\n onScroll: (event) => {\n scrollY.value = event?.contentOffset?.y;\n },\n });\n\n const flashListScrollHandler = useAnimatedScrollHandler({\n onScroll: (event) => {\n if (!isMultiDay) {\n const offsetX = event?.contentOffset?.x;\n // Sync header without going through JS\n scrollTo(headerScrollViewRef, offsetX, 0, false);\n scrollX.value = offsetX;\n }\n },\n });\n\n const handleBlockPress = useCallback((resourceId: number, time: string) => {\n Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium);\n const resource = resources.find(r => r.id === resourceId);\n\n if (onBlockLongPress)\n onBlockLongPress(resource!, new Date(time))\n }, [resources, onBlockLongPress]);\n\n useEffect(() => {\n const handleOrientationChange = () => {\n if (selectedEvent)\n setSelectedEvent(null);\n };\n\n const subscription = Dimensions.addEventListener('change', handleOrientationChange);\n\n return () => {\n subscription.remove();\n };\n }, [setSelectedEvent, selectedEvent]);\n\n useEffect(() => {\n dateRef.current = date; // Update the ref whenever date prop changes\n }, [date]);\n\n const renderItem = useCallback(({item, index}: any) => {\n // Resolve which date & resource this column represents:\n const rid = !isMultiDay\n ? item\n : (activeResourceId ?? resourceIds[0]); // multi-day uses the single active resource\n\n const dayDate = !isMultiDay\n ? undefined // day mode uses the single base day (existing)\n : (item as Extract<Column, { kind: 'day' }>).dayDate;\n\n return (\n <View key={index} style={{width: APPOINTMENT_BLOCK_WIDTH}}>\n {/* Add 15-minute background blocks for each user column */}\n <View style={styles.timelineContainer}>\n <EventGridBlocksSkia\n hourHeight={hourHeight}\n APPOINTMENT_BLOCK_WIDTH={APPOINTMENT_BLOCK_WIDTH}\n handleBlockPress={(time) => handleBlockPress(rid, combineDateAndTime(dayDate ?? dateRef.current, time))}\n />\n <DisabledIntervals\n id={rid!}\n date={dayDate}\n APPOINTMENT_BLOCK_WIDTH={APPOINTMENT_BLOCK_WIDTH}\n hourHeight={hourHeight}\n />\n <DisabledBlocks\n id={rid!}\n date={dayDate}\n APPOINTMENT_BLOCK_WIDTH={APPOINTMENT_BLOCK_WIDTH}\n hourHeight={hourHeight}\n onDisabledBlockPress={stableOnDisabledBlockPress}\n />\n <EventBlocks\n id={rid!}\n date={dayDate}\n EVENT_BLOCK_WIDTH={APPOINTMENT_BLOCK_WIDTH}\n hourHeight={hourHeight}\n onPress={stableOnPress}\n onLongPress={internalStableOnLongPress}\n isEventSelected={isEventSelectedStable}\n isEventDisabled={isEventDisabledStable}\n eventRenderer={stableRenderer}\n mode={overLappingLayoutMode}\n />\n </View>\n </View>\n );\n }, [\n isMultiDay,\n activeResourceId,\n resourceIds,\n APPOINTMENT_BLOCK_WIDTH,\n hourHeight,\n stableRenderer,\n isEventSelectedStable,\n isEventDisabledStable,\n overLappingLayoutMode,\n stableOnPress,\n internalStableOnLongPress,\n stableOnDisabledBlockPress,\n dateRef\n ]);\n\n return <>\n <StoreFeeder resources={resources} store={binding} baseDate={date}/>\n <View style={{flex: 1}}>\n {\n !isMultiDay ? <View>\n <Animated.ScrollView\n style={{backgroundColor: \"white\"}}\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={{\n overflow: \"visible\",\n paddingLeft: TIME_LABEL_WIDTH,\n paddingVertical: 15,\n }}\n horizontal\n scrollEventThrottle={16}\n decelerationRate=\"fast\"\n ref={headerScrollViewRef}\n scrollEnabled={false}\n >\n <ResourcesComponent\n date={date}\n resourceIds={resourceIds}\n APPOINTMENT_BLOCK_WIDTH={APPOINTMENT_BLOCK_WIDTH}\n onResourcePress={onResourcePress}\n />\n </Animated.ScrollView>\n </View>\n : <DaysComponent\n APPOINTMENT_BLOCK_WIDTH={APPOINTMENT_BLOCK_WIDTH}\n date={date}\n mode={mode}\n activeResourceId={activeResourceId ?? resourceIds[0]}\n onResourcePress={onResourcePress}\n />\n }\n <GestureDetector gesture={panGesture}>\n <Animated.View\n key={numberOfColumns + width + hourHeight}\n onLayout={onLayout}\n style={{\n flex: 1,\n overflow: \"hidden\"\n }}\n >\n {selectedEvent && <View style={{\n position: 'absolute',\n top: 0,\n left: TIME_LABEL_WIDTH,\n paddingLeft: TIME_LABEL_WIDTH,\n width: width - TIME_LABEL_WIDTH,\n height: '100%',\n backgroundColor: 'rgba(0, 0, 0, 0.1)',\n zIndex: 1,\n }}/>}\n <Animated.ScrollView\n scrollEnabled={!selectedEvent}\n onScroll={verticalScrollHandler}\n ref={verticalScrollViewRef} // Ref for vertical scrolling\n scrollEventThrottle={16}\n snapToInterval={hourHeight}\n decelerationRate=\"fast\"\n snapToAlignment=\"start\" // Align the column to the start\n style={styles.container}\n contentContainerStyle={{flexDirection: 'row', paddingRight: TIME_LABEL_WIDTH}}\n >\n <TimeLabels\n startMinutes={startMinutes}\n layout={layout}\n hourHeight={hourHeight}\n totalTimelineWidth={APPOINTMENT_BLOCK_WIDTH * numberOfColumns}\n timezone={timezone}\n date={date}\n ref={verticalScrollViewRef}\n />\n <AnimatedFlashList\n extraData={numberOfColumns + width + hourHeight + (overLappingLayoutMode === 'stacked' ? 1 : 0)}\n scrollEnabled={!selectedEvent}\n ref={flashListRef}\n onScroll={flashListScrollHandler} // Sync with header\n estimatedItemSize={APPOINTMENT_BLOCK_WIDTH}\n removeClippedSubviews={true}\n data={!isMultiDay ? resourceIds : columns}\n horizontal={true}\n renderItem={renderItem}\n keyExtractor={(item, index) => index + \"\"}\n snapToInterval={APPOINTMENT_BLOCK_WIDTH}\n decelerationRate=\"fast\"\n snapToAlignment=\"start\" // Align the column to the start\n />\n </Animated.ScrollView>\n {\n selectedEvent &&\n <DraggableEvent\n selectedEvent={selectedEvent}\n APPOINTMENT_BLOCK_WIDTH={APPOINTMENT_BLOCK_WIDTH}\n hourHeight={hourHeight}\n eventStartedTop={eventStartedTop}\n eventHeight={eventHeight}\n panXAbs={panXAbs}\n panYAbs={panYAbs}\n slots={props.eventSlots}\n styleOverrides={props.eventStyleOverrides}\n />\n }\n </Animated.View>\n </GestureDetector>\n </View>\n </>\n}\n\nconst Calendar: React.FC<CalendarProps> = ({theme, ...rest}) => {\n return (\n <CalendarThemeProvider theme={theme}>\n <CalendarInner {...rest} />\n </CalendarThemeProvider>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: '#fff',\n },\n timelineContainer: {\n borderColor: '#ddd',\n borderRightWidth: 1,\n position: 'relative',\n height: \"100%\",\n }\n});\n\nexport default Calendar;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utilities/helpers.ts","../src/components/common/layout/Col.tsx","../src/theme/resolveFont.ts","../src/theme/ThemeContext.tsx","../src/components/TimeLabels.tsx","../src/components/common/layout/Hidden.tsx","../src/components/common/layout/Center.tsx","../src/components/common/Badge.tsx","../src/store/bindings/ZustandBinding.tsx","../src/store/bindings/BindingProvider.tsx","../src/components/ResourcesComponent.tsx","../src/components/EventGridBlocks.tsx","../src/store/StoreFeeder.tsx","../src/components/DisabledIntervals.tsx","../src/components/common/layout/Row.tsx","../src/components/DisabledBlocks.tsx","../src/components/EventBlock.tsx","../src/components/DraggableEvent.tsx","../src/components/EventBlocks.tsx","../src/components/DaysComponent.tsx","../src/components/Calendar.tsx"],"names":["toZonedTime","getHours","getMinutes","setSeconds","setMinutes","setHours","format","set","React","View","createContext","useContext","React3","isSameDay","useState","useEffect","useRef","InteractionManager","Text","StyleSheet","styles","createStore","useStoreWithEqualityFn","shallow","useResourceById","useEventsFor","React9","TouchableOpacity","isUndefined","Image","React10","useMemo","Gesture","runOnJS","GestureDetector","Canvas","Rect","Line","Svg","Defs","Pattern","useDisabledIntervalsFor","useGetDate","useDisabledBlocksFor","useGetSelectedEvent","TextInput","Animated","useAnimatedStyle","useAnimatedProps","React16","MaterialIcons","evt","addDays","React18","FlashList","useWindowDimensions","Platform","useCallback","useSetSelectedEvent","useSetDraggedEventDraft","useGetDraggedEventDraft","useAnimatedRef","useSharedValue","Haptics","isMultiDay","withSpring","useFrameCallback","scrollTo","resources","days","APPOINTMENT_BLOCK_WIDTH","useAnimatedScrollHandler","Dimensions"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKO,IAAM,gBAAA,GAAmB,EAAA;AAChC,IAAM,oBAAA,GAAuB,CAAC,MAAA,KAA4C;AACtE,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,QAAA,EAAqB,WAAA,KAAgB;AACvD,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,aAAA,CAAc,CAAA,EAAG,WAAW,CAAC,CAAC,CAAA;AACjF,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,OAAA,CAAQ,KAAK,WAAW,CAAA;AAAA,IAC5B,CAAA,MAAO;AACH,MAAA,QAAA,CAAS,IAAA,CAAK,CAAC,WAAW,CAAC,CAAA;AAAA,IAC/B;AACA,IAAA,OAAO,QAAA;AAAA,EACX,CAAA,EAAG,EAAE,CAAA;AACT,CAAA;AAEO,SAAS,4BACZ,cAAA,EAC0B;AAC1B,EAAA,MAAM,MAAA,GAAS,6BAA6B,cAAc,CAAA;AAC1D,EAAA,MAAM,GAAA,uBAAU,GAAA,EAA2B;AAE3C,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAExB,IAAA,MAAM,OAAA,GAAU,CAAC,GAAG,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,IAAI,CAAA;AACzD,IAAA,MAAM,UAA6B,EAAC;AAEpC,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACvB,MAAA,IAAI,MAAA,GAAS,KAAA;AACb,MAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACvB,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAC/B,QAAA,IAAI,CAAC,0BAAA,CAA2B,IAAA,EAAM,GAAG,CAAA,EAAG;AACxC,UAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AACZ,UAAA,MAAA,GAAS,IAAA;AACT,UAAA;AAAA,QACJ;AAAA,MACJ;AACA,MAAA,IAAI,CAAC,MAAA,EAAQ,OAAA,CAAQ,IAAA,CAAK,CAAC,GAAG,CAAC,CAAA;AAAA,IACnC;AAGA,IAAA,MAAM,eAAA,uBAAsB,GAAA,EAA2B;AACvD,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ,GAAA,CAAI,OAAA,CAAQ,CAAA,CAAA,KAAK,eAAA,CAAgB,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAC,CAAA;AAE3E,IAAA,MAAM,YAAY,OAAA,CAAQ,MAAA;AAG1B,IAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACrB,MAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,GAAA,CAAI,GAAG,CAAA;AAErC,MAAA,IAAI,IAAA,GAAO,CAAA;AACX,MAAA,KAAA,IAAS,CAAA,GAAI,KAAA,GAAQ,CAAA,EAAG,CAAA,GAAI,WAAW,CAAA,EAAA,EAAK;AACxC,QAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AAAA,UAAK,CAAA,CAAA,KAC5B,CAAA,KAAM,GAAA,IAAO,0BAAA,CAA2B,GAAG,GAAG;AAAA,SAClD;AACA,QAAA,IAAI,OAAA,EAAS;AACb,QAAA,IAAA,EAAA;AAAA,MACJ;AAEA,MAAA,MAAM,MAAM,GAAA,CAAI,EAAA;AAChB,MAAA,GAAA,CAAI,IAAI,GAAA,EAAK;AAAA,QACT,SAAA,EAAW,KAAA;AAAA,QACX,iBAAA,EAAmB,SAAA;AAAA,QACnB,WAAA,EAAa;AAAA,OAChB,CAAA;AAAA,IACL;AAAA,EACJ;AAEA,EAAA,OAAO,GAAA;AACX;AAEO,IAAM,4BAAA,GAA+B,CAAC,cAAA,KAAoE;AAC7G,EAAA,OAAO,cAAA,CAAe,MAAA,CAAO,CAAC,QAAA,EAAmB,aAAA,KAAkB;AAC/D,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAM,0BAAA,CAA2B,CAAA,EAAG,aAAa,CAAC,CAAC,CAAA;AAChG,IAAA,IAAI,OAAA,EAAS;AACT,MAAA,OAAA,CAAQ,KAAK,aAAa,CAAA;AAAA,IAC9B,CAAA,MAAO;AACH,MAAA,QAAA,CAAS,IAAA,CAAK,CAAC,aAAa,CAAC,CAAA;AAAA,IACjC;AACA,IAAA,OAAO,QAAA;AAAA,EACX,CAAA,EAAG,EAAE,CAAA;AACT,CAAA;AAEA,IAAM,0BAAA,GAA6B,CAAC,cAAA,EAA+B,cAAA,KAA2C;AAC1G,EAAA,OAAO,EAAE,cAAA,CAAe,EAAA,IAAM,eAAe,IAAA,IAAQ,cAAA,CAAe,QAAQ,cAAA,CAAe,EAAA,CAAA;AAC/F,CAAA;AAEO,SAAS,oBACZ,MAAA,EAC0B;AAC1B,EAAA,MAAM,MAAA,GAAS,qBAAqB,MAAM,CAAA;AAC1C,EAAA,MAAM,GAAA,uBAAU,GAAA,EAA2B;AAE3C,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,IAAA,MAAM,OAAA,GAAU,CAAC,GAAG,KAAK,CAAA,CAAE,IAAA;AAAA,MACvB,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,OAAO,CAAA,CAAE;AAAA,KACzB;AAGA,IAAA,MAAM,UAAqB,EAAC;AAC5B,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACvB,MAAA,IAAI,MAAA,GAAS,KAAA;AACb,MAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACvB,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAC/B,QAAA,IAAI,CAAC,aAAA,CAAc,IAAA,EAAM,GAAG,CAAA,EAAG;AAC3B,UAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AACZ,UAAA,MAAA,GAAS,IAAA;AACT,UAAA;AAAA,QACJ;AAAA,MACJ;AACA,MAAA,IAAI,CAAC,MAAA,EAAQ,OAAA,CAAQ,IAAA,CAAK,CAAC,GAAG,CAAC,CAAA;AAAA,IACnC;AAEA,IAAA,MAAM,QAAA,uBAAe,GAAA,EAAmB;AACxC,IAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,CAAI,OAAA,CAAQ,CAAA,CAAA,KAAK,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAEhE,IAAA,MAAM,YAAY,OAAA,CAAQ,MAAA;AAE1B,IAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACrB,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAG9B,MAAA,IAAI,IAAA,GAAO,CAAA;AACX,MAAA,KAAA,IAAS,CAAA,GAAI,KAAA,GAAQ,CAAA,EAAG,CAAA,GAAI,WAAW,CAAA,EAAA,EAAK;AACxC,QAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA;AAAA,UAAK,CAAA,CAAA;AAAA;AAAA,YAE3B,CAAA,KAAM,OAAO,CAAA,CAAE,EAAA,KAAO,IAAI,EAAA,IAAM,aAAA,CAAc,GAAG,GAAG;AAAA;AAAA,SACzD;AACA,QAAA,IAAI,OAAA,EAAS;AACb,QAAA,IAAA,EAAA;AAAA,MACJ;AAEA,MAAA,GAAA,CAAI,GAAA,CAAI,IAAI,EAAA,EAAK;AAAA,QACb,SAAA,EAAW,KAAA;AAAA,QACX,iBAAA,EAAmB,SAAA;AAAA,QACnB,WAAA,EAAa;AAAA,OAChB,CAAA;AAAA,IACL;AAAA,EACJ;AAEA,EAAA,OAAO,GAAA;AACX;AASO,IAAM,WAAA,GAAc,CAAC,IAAA,KAAiB;AACzC,EAAA,QAAQ,IAAA;AAAM,IACV,KAAK,EAAA;AACD,MAAA,OAAO,EAAA;AAAA,IACX,KAAK,EAAA;AACD,MAAA,OAAO,EAAA;AAAA,IACX,KAAK,GAAA;AACD,MAAA,OAAO,EAAA;AAAA,IACX;AACI,MAAA,OAAO,EAAA;AAAA;AAEnB,CAAA;AAEA,IAAM,cAAA,GAAiB,IAAA;AAIvB,IAAM,kBAAA,GAAqB,CAAC,QAAA,EAAkB,MAAA,KAAmB;AAC7D,EAAA,IAAI,MAAA,GAAS,UAAU,MAAA,IAAU,cAAA;AACjC,EAAA,OAAO,EAAC,UAAU,MAAA,EAAM;AAC5B,CAAA;AAGA,IAAM,aAAa,CAAC,CAAA,EAAyC,CAAA,KACzD,IAAA,CAAK,IAAI,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAQ,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,MAAA,EAAQ,EAAE,MAAM,CAAA;AAE3D,IAAM,aAAA,GAAgB,CACzB,MAAA,EACA,MAAA,KACU;AAEV,EAAA,MAAM,UAAU,MAAA,CAAO,IAAA;AACvB,EAAA,MAAM,QAAQ,MAAA,CAAO,EAAA;AACrB,EAAA,MAAM,UAAU,MAAA,CAAO,IAAA;AACvB,EAAA,MAAM,QAAQ,MAAA,CAAO,EAAA;AAGrB,EAAA,IAAI,OAAA,KAAY,KAAA,IAAS,OAAA,KAAY,KAAA,EAAO,OAAO,KAAA;AAGnD,EAAA,MAAM,CAAA,GAAI,kBAAA,CAAmB,OAAA,EAAS,KAAK,CAAA;AAC3C,EAAA,MAAM,CAAA,GAAI,kBAAA,CAAmB,OAAA,EAAS,KAAK,CAAA;AAE3C,EAAA,OAAO,UAAA,CAAW,GAAG,CAAC,CAAA;AAC1B,CAAA;AAGO,IAAM,uBAAA,GAA0B,CAAC,QAAA,KAA6B;AACjE,EAAA,MAAM,GAAA,GAAMA,qBAAA,iBAAY,IAAI,IAAA,IAAQ,QAAQ,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQC,iBAAS,GAAG,CAAA;AAC1B,EAAA,MAAM,OAAA,GAAUC,mBAAW,GAAG,CAAA;AAC9B,EAAA,OAAO,QAAQ,EAAA,GAAK,OAAA;AACxB,CAAA;AAGO,IAAM,eAAA,GAAkB,CAAC,OAAA,EAAiB,iBAAA,KAAsC,WAAW,iBAAA,GAAoB,EAAA,CAAA;AAE/G,IAAM,aAAA,GAAgB,CAAC,QAAA,EAAkB,UAAA,KAAuB;AACnE,EAAA,OAAO,YAAY,UAAA,GAAa,EAAA,CAAA;AACpC,CAAA;AAEO,IAAM,iBAAA,GAAoB,CAAC,QAAA,EAAkB,iBAAA,KAAsC;AACtF,EAAA,SAAA;AACA,EAAA,OAAO,YAAY,iBAAA,GAAoB,EAAA,CAAA;AAC3C,CAAA;AAEO,IAAM,kBAAA,GAAqB,CAAC,IAAA,EAAY,IAAA,KAAiB;AAE5D,EAAA,MAAM,CAAC,KAAA,EAAO,OAAA,EAAS,OAAO,CAAA,GAAI,KAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA;AAG5D,EAAA,MAAM,YAAA,GAAeC,mBAAWC,kBAAA,CAAWC,gBAAA,CAAS,MAAM,KAAK,CAAA,EAAG,OAAO,CAAA,EAAG,OAAO,CAAA;AAGnF,EAAA,OAAOC,cAAA,CAAO,cAAc,qBAAqB,CAAA;AACrD,CAAA;AAEO,IAAM,WAAA,GAAc,CAAC,KAAA,KAAkB;AAE1C,EAAA,MAAM,YAAA,GAAeC,WAAA,iBAAI,IAAI,IAAA,IAAQ,EAAC,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,YAAA,EAAc,GAAE,CAAA;AAG5F,EAAA,OAAOD,cAAA,CAAO,cAAc,QAAQ,CAAA;AACxC,CAAA;AAEO,IAAM,aAAA,GAAgB,CAAC,YAAA,KAAiC;AAC3D,EAAA,SAAA;AAEA,EAAA,MAAM,mBAAmB,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,YAAY,CAAC,CAAA;AAC7D,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,gBAAA,GAAmB,EAAE,CAAA;AAChD,EAAA,MAAM,UAAU,gBAAA,GAAmB,EAAA;AAGnC,EAAA,MAAM,aAAa,OAAA,GAAU,EAAA,GAAK,GAAA,GAAM,OAAA,GAAU,OAAO,OAAO,CAAA;AAGhE,EAAA,MAAM,OAAA,GAAU,UAAU,EAAA,IAAM,EAAA;AAGhC,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA;AACnC,CAAA;AASO,SAAS,yBAAA,CACZ,QACA,gBAAA,EACA;AAAA,EACI,QAAA,GAAW,CAAA;AAAA;AAAA,EACX,UAAA,GAAa,CAAA;AAAA;AAAA,EACb,UAAA,GAAa,EAAA;AAAA;AAAA,EACb,eAAA,GAAkB;AAAA;AACtB,CAAA,GAKI,EAAC,EACqB;AAE1B,EAAA,MAAM,MAAA,GAAS,qBAAqB,MAAM,CAAA;AAE1C,EAAA,MAAM,GAAA,uBAAU,GAAA,EAA2B;AAE3C,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAExB,IAAA,MAAM,OAAA,GAAU,CAAC,GAAG,KAAK,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,IAAI,CAAA;AAIzD,IAAA,MAAM,SAAmB,EAAC;AAG1B,IAAA,MAAM,cAAA,GAAiB,CAAC,WAAA,KAAwB;AAC5C,MAAA,KAAA,IAAS,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AACzC,QAAA,IAAI,CAAC,aAAA,CAAc,MAAA,CAAO,CAAC,CAAA,CAAE,GAAG,EAAC,GAAG,MAAA,CAAO,CAAC,EAAE,CAAA,EAAG,IAAA,EAAM,aAAa,EAAA,EAAI,WAAA,EAAY,CAAA,EAAG;AAEnF,UAAA,IAAI,MAAA,CAAO,CAAC,CAAA,CAAE,CAAA,CAAE,MAAM,WAAA,EAAa,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA;AAAA,QACzD;AAAA,MACJ;AAAA,IACJ,CAAA;AAGA,IAAA,MAAM,sBAAsB,MAAc;AAEtC,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAC,CAAA;AAC7C,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG,GAAA,EAAA;AACtB,MAAA,OAAO,GAAA;AAAA,IACX,CAAA;AAEA,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AAErB,MAAA,cAAA,CAAe,EAAE,IAAI,CAAA;AAGrB,MAAA,IAAI,QAAQ,mBAAA,EAAoB;AAGhC,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,eAAe,CAAA;AAGnD,MAAA,MAAA,CAAO,IAAA,CAAK,EAAC,CAAA,EAAG,KAAA,EAAM,CAAA;AAGtB,MAAA,MAAM,SAAS,WAAA,GAAc,QAAA;AAE7B,MAAA,MAAM,SAAA,GAAY,mBAAmB,MAAA,GAAS,UAAA;AAC9C,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,SAAS,CAAA;AAG9C,MAAA,MAAM,MAAA,GAAS,IAAA,GAAO,CAAA,CAAE,IAAA,GAAO,EAAA,GAAK,KAAA;AAEpC,MAAA,GAAA,CAAI,IAAI,CAAA,CAAE,EAAA,EAAK,EAAC,MAAA,EAAQ,OAAA,EAAS,QAAO,CAAA;AAAA,IAC5C;AAAA,EACJ;AAEA,EAAA,OAAO,GAAA;AACX;AAQO,SAAS,eAAA,CACZ,WACA,gBAAA,EACA;AAAA,EACI,QAAA,GAAW,CAAA;AAAA;AAAA,EACX,SAAA,GAAY,CAAA;AAAA,EACZ,UAAA,GAAa;AACjB,CAAA,GAAoE,EAAC,EAC9C;AACvB,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAwB;AAExC,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,CAAC,CAAA,IAAK,SAAA,EAAW;AAC7B,IAAA,MAAM,YAAA,GAAA,CAAgB,CAAA,CAAE,iBAAA,GAAoB,CAAA,IAAK,QAAA;AACjD,IAAA,MAAM,UAAA,GAAa,gBAAA,GAAmB,SAAA,GAAY,UAAA,GAAa,YAAA;AAC/D,IAAA,MAAM,QAAA,GAAW,aAAa,CAAA,CAAE,iBAAA;AAEhC,IAAA,MAAM,IAAA,GACF,SAAA,GAAY,CAAA,CAAE,SAAA,IAAa,QAAA,GAAW,QAAA,CAAA;AAE1C,IAAA,MAAM,QACF,QAAA,GAAW,CAAA,CAAE,WAAA,GAAc,QAAA,IAAY,EAAE,WAAA,GAAc,CAAA,CAAA;AAE3D,IAAA,GAAA,CAAI,IAAI,EAAA,EAAI;AAAA,MACR,MAAA,EAAQ,IAAA;AAAA,MACR,OAAA,EAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAA;AAAA;AAAA,MAE1B,MAAA,EAAQ,MAAO,CAAA,CAAE;AAAA,KACpB,CAAA;AAAA,EACL;AAEA,EAAA,OAAO,GAAA;AACX;AASO,SAAS,kBAAA,CACZ,MAAA,EACA,gBAAA,EACA,IAAA,EACA,OAAA,EAMuB;AACvB,EAAA,IAAI,SAAS,SAAA,EAAW;AACpB,IAAA,MAAM,aAAA,GAAgB,oBAAoB,MAAM,CAAA;AAChD,IAAA,OAAO,eAAA,CAAgB,eAAe,gBAAA,EAAkB;AAAA,MACpD,UAAU,OAAA,EAAS,QAAA;AAAA,MACnB,WAAW,OAAA,EAAS,SAAA;AAAA,MACpB,YAAY,OAAA,EAAS;AAAA,KACxB,CAAA;AAAA,EACL,CAAA,MAAO;AACH,IAAA,OAAO,yBAAA,CAA0B,QAAQ,gBAAA,EAAkB;AAAA,MACvD,UAAU,OAAA,EAAS,QAAA;AAAA,MACnB,YAAY,OAAA,EAAS,UAAA;AAAA,MACrB,YAAY,OAAA,EAAS,UAAA;AAAA,MACrB,iBAAiB,OAAA,EAAS;AAAA,KAC7B,CAAA;AAAA,EACL;AACJ;AAEO,IAAM,uBAAuB,CAAC,GAAA,EAAa,gBAC9C,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA;AAAA,EAAI,YAAY,MAAA,GAAS,CAAA;AAAA,EACtC,WAAA,CAAY,SAAA,CAAU,CAAA,EAAA,KAAM,EAAA,KAAO,GAAG;AAC1C,CAAC,CAAA;AAEE,IAAM,kBAAkB,CAAC,IAAA,EAAc,SAC1C,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA;AAAA,EAAI,KAAK,MAAA,GAAS,CAAA;AAAA,EAC/B,KAAK,SAAA,CAAU,CAAA,CAAA,KAAK,SAASA,cAAA,CAAO,CAAA,EAAG,YAAY,CAAC;AACxD,CAAC,CAAA;AC3ZL,IAAM,MAAM,CAAC,EAAC,UAAU,OAAA,EAAS,KAAA,EAAO,OAAK,KAAgB;AACzD,EAAA,uBACIE,0BAAA,CAAA,aAAA,CAACC,gBAAA,EAAA,EAAK,KAAA,EAAO,CAAC,EAAC,eAAe,QAAA,EAAQ,EAAG,KAAK,CAAA,EAAA,EACzCD,0BAAA,CAAM,QAAA,CAAS,QAAQ,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,qBAC1CA,0BAAA,CAAA,aAAA,CAACA,0BAAA,CAAM,QAAA,EAAN,EAAe,GAAA,EAAK,KAAA,EAAA,EAChB,KAAA,EACA,KAAA,KAAUA,2BAAM,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,GAAS,CAAA,IACjD,SACH,KAAA,KAAUA,0BAAA,CAAM,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA,CAAE,SAAS,CAAA,oBACjDA,0BAAA,CAAA,aAAA,CAACC,gBAAA,EAAA,EAAK,KAAA,EAAO,EAAC,MAAA,EAAQ,KAAA,EAAO,KAAA,EAAO,MAAA,EAAM,EAAE,CACpD,CACH,CACL,CAAA;AAER,CAAA;AAEA,IAAO,WAAA,GAAQ,GAAA;;;ACff,IAAM,eAAA,GAAgD;AAAA,EAClD,KAAA,EAAO,MAAA;AAAA,EACP,KAAA,EAAO,YAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO,SAAA;AAAA,EACP,KAAA,EAAO,QAAA;AAAA,EACP,KAAA,EAAO,UAAA;AAAA,EACP,KAAA,EAAO,MAAA;AAAA,EACP,KAAA,EAAO,WAAA;AAAA,EACP,KAAA,EAAO;AACX,CAAA;AAMO,SAAS,WAAA,CAAY,EAAE,MAAA,GAAS,QAAA,EAAU,SAAS,KAAA,EAAO,MAAA,GAAS,OAAM,EAA4B;AAExG,EAAA,IAAI,WAAW,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,GAAG,GAAG,OAAO,MAAA;AAGxD,EAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,MAAM,CAAA,IAAK,SAAA;AAG9C,EAAA,MAAM,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,MAAM,GAAG,UAAU,CAAA,CAAA;AAC7C,EAAA,OAAO,MAAA,GAAS,CAAA,EAAG,IAAI,CAAA,OAAA,CAAA,GAAY,IAAA;AACvC;;;AC9BA,IAAM,YAAA,GAA8B;AAAA,EAChC,UAAA,EAAY;AAAA,IACR,UAAA,EAAY;AAAA;AAEpB,CAAA;AAEA,IAAM,QAAA,GAAWC,sBAA6B,YAAY,CAAA;AACnD,IAAM,gBAAA,GAAmB,MAAMC,kBAAA,CAAW,QAAQ,CAAA;AAElD,IAAM,eAAA,GAAkB,CAAC,SAAA,KAI1B;AACF,EAAA,MAAM,EAAC,UAAA,EAAU,GAAI,gBAAA,EAAiB;AACtC,EAAA,MAAM,MAAA,GAAS,SAAA,EAAW,UAAA,IAAc,UAAA,EAAY,UAAA,IAAc,QAAA;AAClE,EAAA,MAAM,MAAA,GAAS,WAAW,UAAA,IAAc,KAAA;AACxC,EAAA,MAAM,MAAA,GAAS,WAAW,MAAA,IAAU,KAAA;AAEpC,EAAA,OAAO,WAAA,CAAY,EAAC,MAAA,EAAQ,MAAA,EAAQ,QAAO,CAAA;AAC/C,CAAA;AAEO,IAAM,qBAAA,GAGR,CAAC,EAAC,KAAA,EAAO,UAAQ,KAAM;AACxB,EAAA,MAAM,WAAA,GAAc;AAAA,IAChB,GAAG,YAAA;AAAA,IACH,GAAG,KAAA;AAAA,IACH,YAAY,EAAC,GAAG,aAAa,UAAA,EAAY,GAAG,OAAO,UAAA;AAAU,GACjE;AAEA,EAAA,uBAAOH,2BAAA,aAAA,CAAC,QAAA,CAAS,UAAT,EAAkB,KAAA,EAAO,eAAc,QAAS,CAAA;AAC5D,CAAA;;;ACdO,IAAM,UAAA,GAAmBI,8BAAW,CAAC;AAAA,EACI,QAAA;AAAA,EACA,UAAA,GAAa,GAAA;AAAA,EACb,YAAA,GAAe,CAAA;AAAA,EACf,kBAAA;AAAA,EACA,IAAA;AAAA,EACA;AACJ,CAAA,EAAU,GAAA,KAAa;AAE/D,EAAA,MAAM,OAAA,GAAUC,iBAAA,iBAAU,IAAI,IAAA,IAAQ,IAAI,CAAA;AAG1C,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAIC,gBAAA,CAAS,gBAAgB,uBAAA,CAAwB,QAAQ,CAAA,EAAG,UAAU,CAAC,CAAA;AAC/H,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,gBAAA,CAAiBR,cAAAA,CAAON,qBAAAA,iBAAY,IAAI,IAAA,EAAK,EAAG,QAAQ,CAAA,EAAG,MAAM,CAAC,CAAA;AACxG,EAAA,MAAM,2BAA2B,UAAA,GAAa,CAAA;AAE9C,EAAA,MAAM,6BAA6B,MAAM;AACrC,IAAA,uBAAA,CAAwB,eAAA,CAAgB,uBAAA,CAAwB,QAAQ,CAAA,EAAG,UAAU,CAAC,CAAA;AAAA,EAC1F,CAAA;AAGA,EAAA,MAAM,oBAAoB,MAAM;AAC5B,IAAA,cAAA,CAAeM,cAAAA,CAAON,sCAAY,IAAI,IAAA,IAAQ,QAAQ,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,EACpE,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,EAAC,UAAA,EAAY,OAAM,CAAA;AAErD,EAAAe,iBAAA,CAAU,MAAM;AACZ,IAAA,MAAM,SAAS,MAAM;AACjB,MAAA,iBAAA,EAAkB;AAClB,MAAA,0BAAA,EAA2B;AAAA,IAC/B,CAAA;AAEA,IAAA,MAAA,EAAO;AACP,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,MAAA,EAAQ,GAAG,CAAA;AAE1C,IAAA,OAAO,MAAM,cAAc,UAAU,CAAA;AAAA,EACzC,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,mBAAA,GAAsBC,eAAY,IAAI,CAAA;AAE5C,EAAAD,iBAAA,CAAU,MAAM;AACZ,IAAA,IAAI,CAAC,MAAA,EAAQ;AAGb,IAAA,MAAM,OAAA,GAAU,KAAK,OAAA,EAAQ;AAG7B,IAAA,IAAI,mBAAA,CAAoB,YAAY,OAAA,EAAS;AAE7C,IAAAE,8BAAA,CAAmB,qBAAqB,MAAM;AAC1C,MAAA,IAAI,MAAM,OAAA,GACJ,oBAAA,GAAuB,GAAA,GACvB,eAAA,CAAgB,cAAc,UAAU,CAAA;AAE9C,MAAA,IAAI,IAAI,OAAA,EAAS;AACb,QAAA,GAAA,CAAI,QAAQ,QAAA,CAAS;AAAA,UACjB,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,wBAAwB,CAAA,GAAI,wBAAA;AAAA,UAChD,QAAA,EAAU;AAAA,SACb,CAAA;AAGD,QAAA,mBAAA,CAAoB,OAAA,GAAU,OAAA;AAAA,MAClC;AAAA,IACJ,CAAC,CAAA;AAAA,EACL,CAAA,EAAG,CAAC,MAAA,EAAQ,IAAA,EAAM,SAAS,wBAAA,EAA0B,YAAA,EAAc,UAAA,EAAY,oBAAoB,CAAC,CAAA;AAEpG,EAAA,uBACIL,kBAAA,CAAA,aAAA,CAAAA,kBAAA,CAAA,QAAA,EAAA,IAAA,kBACIA,kBAAA,CAAA,aAAA,CAAC,WAAA,EAAA,IAAA,EAEI,KAAA,CAAM,IAAA,CAAK,EAAC,MAAA,EAAQ,EAAA,EAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,KAAA,qBAC9BA,kBAAA,CAAA,aAAA,CAACH,gBAAAA,EAAA,EAAK,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,CAAC,MAAA,CAAO,SAAA,EAAW,EAAC,MAAA,EAAQ,UAAA,EAAW,CAAA,EAAA,kBAC5DG,kBAAA,CAAA,aAAA;AAAA,IAACM,gBAAA;AAAA,IAAA;AAAA,MACG,gBAAA,EAAkB,KAAA;AAAA,MAClB,KAAA,EAAO;AAAA,QACH,SAAA,EAAW,QAAA;AAAA,QACX,UAAA,EAAY,SAAA;AAAA,QACZ,QAAA,EAAU,YAAY,UAAU,CAAA;AAAA,QAChC,UAAA,EAAY;AAAA;AAChB,KAAA;AAAA,IACC,YAAY,KAAK,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAC;AAAA,GACpC,kBACAN,kBAAA,CAAA,aAAA;AAAA,IAACM,gBAAA;AAAA,IAAA;AAAA,MACG,gBAAA,EAAkB,KAAA;AAAA,MAClB,KAAA,EAAO;AAAA,QACH,SAAA,EAAW,QAAA;AAAA,QACX,UAAA,EAAY,SAAA;AAAA,QACZ,QAAA,EAAU,YAAY,UAAU,CAAA;AAAA,QAChC,UAAA,EAAY;AAAA;AAChB,KAAA;AAAA,IACC,YAAY,KAAK,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAC;AAAA,GAExC,CACH,CAAA,EACA,OAAA,oBAAWN,kBAAA,CAAA,aAAA,CAACH,kBAAA,EAAK,KAAA,EAAO,CAAC,MAAA,CAAO,WAAA,EAAa;AAAA,IAC1C,KAAK,oBAAA,GAAuB,EAAA;AAAA,IAC5B,KAAA,EAAO;AAAA,GACV,CAAA,EAAA,kBACGG,kBAAA,CAAA,aAAA;AAAA,IAACM,gBAAA;AAAA,IAAA;AAAA,MACG,gBAAA,EAAkB,KAAA;AAAA,MAClB,KAAA,EAAO;AAAA,QACH,SAAA,EAAW,QAAA;AAAA,QACX,UAAA,EAAY,SAAA;AAAA,QACZ,UAAA,EAAY,KAAA;AAAA,QACZ,QAAA,EAAU,YAAY,UAAU,CAAA;AAAA,QAChC,KAAA,EAAO;AAAA;AACX,KAAA;AAAA,IACF;AAAA,GACN,CACJ,CAAA,EAEC,OAAA,oBAAWN,kBAAA,CAAA,aAAA,CAACH,kBAAA,EAAK,KAAA,EAAO,CAAC,MAAA,CAAO,eAAA,EAAiB;AAAA,IAC9C,aAAA,EAAe,MAAA;AAAA,IACf,GAAA,EAAK,oBAAA;AAAA,IACL,KAAA,EAAO,kBAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACT,GAAE,CACP,CAAA;AAER,CAAC,CAAA;AAED,IAAM,MAAA,GAASU,uBAAW,MAAA,CAAO;AAAA,EAC7B,SAAA,EAAW;AAAA,IACP,KAAA,EAAO;AAAA,GACX;AAAA,EACA,eAAA,EAAiB;AAAA,IACb,QAAA,EAAU,UAAA;AAAA,IACV,MAAA,EAAQ,CAAA;AAAA;AAAA,IACR,eAAA,EAAiB,KAAA;AAAA,IACjB,MAAA,EAAQ;AAAA;AAAA,GACZ;AAAA,EACA,WAAA,EAAa;AAAA,IACT,eAAA,EAAiB,MAAA;AAAA,IACjB,WAAA,EAAa,KAAA;AAAA,IACb,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,WAAA,EAAa,CAAA;AAAA,IACb,YAAA,EAAc,EAAA;AAAA,IACd,MAAA,EAAQ,EAAA;AAAA,IACR,QAAA,EAAU,UAAA;AAAA,IACV,MAAA,EAAQ;AAAA;AAAA;AAEhB,CAAC,CAAA;AChKD,IAAM,MAAA,GAAS,CAAC,EAAC,QAAA,EAAU,UAAQ,KAAsC;AACrE,EAAA,IAAI,QAAA,EAAU;AACV,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,uBACIX,0BAAAA,CAAA,aAAA,CAAAA,0BAAAA,CAAA,gBACK,QACL,CAAA;AAER,CAAA;AAEA,IAAO,cAAA,GAAQ,MAAA;ACZf,IAAM,MAAA,GAAS,CAAC,EAAC,QAAA,EAAU,OAAK,KAAsC;AAClE,EAAA,uBACIA,0BAAAA,CAAA,aAAA;AAAA,IAACC,gBAAAA;AAAA,IAAA;AAAA,MAAK,OAAO,CAAC;AAAA,QACV,cAAA,EAAgB,QAAA;AAAA,QAChB,UAAA,EAAY;AAAA,SACb,KAAK;AAAA,KAAA;AAAA,IAEH;AAAA,GACL;AAER,CAAA;AAEA,IAAO,cAAA,GAAQ,MAAA;ACPf,IAAM,QAAiD,CAAC;AAAA,EACI,KAAA;AAAA,EACA,KAAA,GAAQ,EAAA;AAAA,EACR,QAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA,GAAQ,KAAA;AAAA,EACR,SAAA,GAAY;AAChB,CAAA,KAAM;AAC1D,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,EAAC,UAAA,EAAY,OAAM,CAAA;AAErD,EAAA,uBACID,0BAAAA,CAAA,aAAA,CAACC,kBAAA,EAAK,KAAA,EAAO,CAACW,OAAAA,CAAO,KAAA,EAAO,EAAC,eAAA,EAAiB,OAAK,EAAG,KAAK,KACtD,QAAA,GAAW,QAAA,mBAAWZ,0BAAAA,CAAA,aAAA;AAAA,IAACU,gBAAAA;AAAA,IAAA;AAAA,MACpB,gBAAA,EAAkB,KAAA;AAAA,MAClB,KAAA,EAAO;AAAA,QACH,KAAA,EAAO,SAAA;AAAA,QACP,QAAA;AAAA,QACA,UAAA,EAAY,SAAA;AAAA,QACZ,UAAA,EAAY;AAAA;AAChB,KAAA;AAAA,IACF;AAAA,GACN,CAAA;AAER,CAAA;AAEA,IAAME,OAAAA,GAASD,uBAAW,MAAA,CAAO;AAAA,EAC7B,KAAA,EAAO;AAAA,IACH,cAAA,EAAgB,QAAA;AAAA,IAChB,UAAA,EAAY,QAAA;AAAA,IACZ,YAAA,EAAc,GAAA;AAAA,IACd,iBAAA,EAAmB;AAAA;AAE3B,CAAC,CAAA;AAED,IAAO,aAAA,GAAQ,KAAA;ACRf,IAAM,mBAAA,GAAsB,MACxBE,mBAAA,CAAmB,CAACd,IAAAA,MAAS;AAAA,EACzB,IAAA,sBAAU,IAAA,EAAK;AAAA,EACf,eAAe,EAAC;AAAA;AAAA,EAGhB,aAAa,EAAC;AAAA,EACd,qBAAqB,EAAC;AAAA,EACtB,wBAAwB,EAAC;AAAA,EAEzB,aAAA,EAAe,IAAA;AAAA,EACf,iBAAA,EAAmB,IAAA;AAAA,EAEnB,kBAAkB,CAAC,GAAA,KAAQA,KAAI,EAAC,aAAA,EAAe,KAAI,CAAA;AAAA,EACnD,SAAS,CAAC,IAAA,KAASA,IAAAA,CAAI,EAAC,MAAK,CAAA;AAAA,EAE7B,eAAA,EAAiB,CAAC,EAAA,KACdA,IAAAA,CAAI,CAAC,CAAA,KAAM;AAEP,IAAA,MAAM,IAAA,GAAO,EAAC,GAAG,CAAA,CAAE,aAAA,EAAa;AAChC,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,KAAK,EAAA,EAAI;AAChB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,CAAA,CAAE,EAAE,CAAA;AAEtB,MAAA,IAAI,CAAC,QAAQ,IAAA,CAAK,IAAA,KAAS,EAAE,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,CAAA,CAAE,MAAA,EAAQ;AAC3D,QAAA,IAAA,CAAK,CAAA,CAAE,EAAE,CAAA,GAAI,EAAC,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAM;AACtD,QAAA,OAAA,GAAU,IAAA;AAAA,MACd;AAAA,IACJ;AACA,IAAA,OAAO,OAAA,GAAU,EAAC,aAAA,EAAe,IAAA,KAAQ,EAAC;AAAA,EAC9C,CAAC,CAAA;AAAA;AAAA,EAGL,aAAA,EAAe,CAAC,MAAA,EAAQ,EAAC,MAAA,EAAQ,gBAAgB,gBAAA,EAAgB,KAC7DA,IAAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACR,WAAA,EAAa,MAAA,GACP,EAAC,GAAG,CAAA,CAAE,WAAA,EAAa,CAAC,MAAM,GAAG,MAAA,EAAM,GACnC,CAAA,CAAE,WAAA;AAAA,IACR,mBAAA,EAAqB,cAAA,GACf,EAAC,GAAG,CAAA,CAAE,mBAAA,EAAqB,CAAC,MAAM,GAAG,cAAA,EAAc,GACnD,CAAA,CAAE,mBAAA;AAAA,IACR,sBAAA,EAAwB,gBAAA,GAClB,EAAC,GAAG,CAAA,CAAE,sBAAA,EAAwB,CAAC,MAAM,GAAG,gBAAA,EAAgB,GACxD,CAAA,CAAE;AAAA,GACZ,CAAE,CAAA;AAAA,EAEN,sBAAsB,CAAC,KAAA,KAAUA,KAAI,EAAC,iBAAA,EAAmB,OAAM;AACnE,CAAA,CAAE,CAAA;AAGN,IAAM,YAAA,GAAeG,sBAAsC,IAAI,CAAA;AAE/D,IAAM,QAAA,GAA6C,CAAC,EAAC,QAAA,EAAQ,KAAM;AAC/D,EAAA,MAAM,GAAA,GAAMM,eAAwB,MAAS,CAAA;AAC7C,EAAA,IAAI,CAAC,GAAA,CAAI,OAAA,EAAS,GAAA,CAAI,UAAU,mBAAA,EAAoB;AACpD,EAAA,uBAAOR,2BAAA,aAAA,CAAC,YAAA,CAAa,UAAb,EAAsB,KAAA,EAAO,GAAA,CAAI,OAAA,EAAA,EAAU,QAAS,CAAA;AAChE,CAAA;AAGA,IAAM,QAAA,GAAW,CACb,QAAA,EACA,EAAA,KACI;AACJ,EAAA,MAAM,KAAA,GAAQG,mBAAW,YAAY,CAAA;AACrC,EAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,MAAM,yCAAyC,CAAA;AACrE,EAAA,OAAOW,kCAAA,CAAuB,KAAA,EAAO,QAAA,EAAU,EAAE,CAAA;AACrD,CAAA;AAGA,IAAM,eAAA,GACF,CAAC,EAAA,KAAO,QAAA,CAAS,CAAC,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,EAAE,CAAC,CAAA;AAE/C,IAAM,sBACF,MAAM,QAAA,CAAS,CAAC,CAAA,KAAM,EAAE,aAAa,CAAA;AAEzC,IAAM,sBACF,MAAM,QAAA,CAAS,CAAC,CAAA,KAAM,EAAE,gBAAgB,CAAA;AAE5C,IAAM,YAAA,GACF,CAAC,UAAA,EAAY,OAAA,KAAY,SAAS,CAAA,CAAA,KAAK;AACnC,EAAA,MAAM,GAAA,GAAMhB,cAAAA,CAAO,OAAA,EAAS,YAAY,CAAA;AACxC,EAAA,OAAO,EAAE,WAAA,GAAc,GAAG,CAAA,GAAI,UAAU,KAAK,EAAC;AAClD,CAAA,EAAGiB,eAAO,CAAA;AAEd,IAAM,0BACF,MAAM,QAAA,CAAS,CAAC,CAAA,KAAM,EAAE,iBAAiB,CAAA;AAE7C,IAAM,oBAAA,GACF,CAAC,UAAA,EAAY,OAAA,KAAY,SAAS,CAAA,CAAA,KAAK;AACnC,EAAA,MAAM,GAAA,GAAMjB,cAAAA,CAAO,OAAA,EAAS,YAAY,CAAA;AACxC,EAAA,OAAO,EAAE,mBAAA,GAAsB,GAAG,CAAA,GAAI,UAAU,KAAK,EAAC;AAC1D,CAAA,EAAGiB,eAAO,CAAA;AAEd,IAAM,uBAAA,GACF,CAAC,UAAA,EAAY,OAAA,KAAY,SAAS,CAAA,CAAA,KAAK;AACnC,EAAA,MAAM,GAAA,GAAMjB,cAAAA,CAAO,OAAA,EAAS,YAAY,CAAA;AACxC,EAAA,OAAO,EAAE,sBAAA,GAAyB,GAAG,CAAA,GAAI,UAAU,KAAK,EAAC;AAC7D,CAAA,EAAGiB,eAAO,CAAA;AAGd,IAAM,qBACF,MAAM,QAAA,CAAS,CAAC,CAAA,KAAM,EAAE,eAAe,CAAA;AAE3C,IAAM,mBACF,MAAM,QAAA,CAAS,CAAC,CAAA,KAAM,EAAE,aAAa,CAAA;AAEzC,IAAM,0BACF,MAAM,QAAA,CAAS,CAAC,CAAA,KAAM,EAAE,oBAAoB,CAAA;AAEhD,IAAM,aACF,MAAM,QAAA,CAAS,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAEnC,IAAM,aACF,MAAM,QAAA,CAAS,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAEzB,IAAM,cAAA,GAAuC;AAAA,EAChD,QAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA,oBAAA;AAAA,EACA,uBAAA;AAAA,EACA,kBAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,gBAAA;AAAA,EACA,mBAAA;AAAA,EACA,mBAAA;AAAA,EACA,uBAAA;AAAA,EACA;AACJ,CAAA;;;AClKA,IAAM,UAAA,GAAab,sBAA2C,IAAI,CAAA;AAE3D,IAAM,qBAAqB,MAA4B;AAC1D,EAAA,MAAM,GAAA,GAAMC,mBAAW,UAAU,CAAA;AACjC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,kEAAkE,CAAA;AAC5F,EAAA,OAAO,GAAA;AACX;AAEO,IAAM,uBAAA,GAGR,CAAC,EAAC,OAAA,EAAS,UAAQ,KAAM;AAC1B,EAAA,MAAM,SAAS,OAAA,IAAW,cAAA;AAC1B,EAAA,MAAM,gBAAgB,MAAA,CAAO,QAAA;AAC7B,EAAA,uBACIH,0BAAAA,CAAA,aAAA,CAAC,UAAA,CAAW,QAAA,EAAX,EAAoB,KAAA,EAAO,MAAA,EAAA,kBACxBA,0BAAAA,CAAA,aAAA,CAAC,aAAA,EAAA,IAAA,EAAe,QAAS,CAC7B,CAAA;AAER;;;ACEA,IAAM,oBAAoB,CAAC,EAAC,IAAI,eAAA,EAAiB,uBAAA,EAAyB,MAAI,KAA8B;AACxG,EAAA,MAAM,EAAC,eAAA,EAAAgB,gBAAAA,EAAiB,YAAA,EAAAC,aAAAA,KACpB,kBAAA,EAAmB;AACvB,EAAA,MAAM,QAAA,GAAWD,iBAAgB,EAAE,CAAA;AACnC,EAAA,MAAM,MAAA,GAASC,aAAAA,CAAa,EAAA,EAAI,IAAI,CAAA;AACpC,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,EAAC,UAAA,EAAY,OAAM,CAAA;AAErD,EAAA,uBAAOC,kBAAA,CAAA,aAAA,CAAC,WAAA,EAAA,EAAI,KAAA,EAAO,CAAC;AAAA,IAChB,UAAA,EAAY,QAAA;AAAA,IACZ,KAAA,EAAO;AAAA,GACV,qBACGA,kBAAA,CAAA,aAAA,CAACjB,gBAAAA,EAAA,EAAK,KAAA,EAAO,EAAC,QAAA,EAAU,UAAA,EAAU,EAAA,kBAC9BiB,kBAAA,CAAA,aAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACG,SAAS,MAAM;AACX,QAAA,IAAI,eAAA;AACA,UAAA,eAAA,CAAgB,QAAQ,CAAA;AAAA,MAChC,CAAA;AAAA,MACA,MAAM,QAAA,EAAU,IAAA;AAAA,MAChB,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,0BAA0B,EAAE,CAAA;AAAA,MACrD,QAAA,EAAU,EAAA;AAAA,MACV,OAAO,MAAA,EAAQ,MAAA;AAAA,MACf,OAAO,QAAA,EAAU;AAAA;AAAA,GAEzB,CAAA,kBACAA,kBAAA,CAAA,aAAA;AAAA,IAACR,gBAAAA;AAAA,IAAA;AAAA,MAAK,KAAA,EAAO;AAAA,QACT,QAAA,EAAU,EAAA;AAAA,QACV,UAAA,EAAY,SAAA;AAAA,QACZ,UAAA,EAAY;AAAA,OAChB;AAAA,MACM,aAAA,EAAe,CAAA;AAAA,MACf,gBAAA,EAAkB;AAAA,KAAA;AAAA,IACtB,QAAA,EAAU;AAAA,GAChB,CAAA;AACJ,CAAA;AAEO,IAAM,qBAAqB,CAAC,EAAC,aAAa,eAAA,EAAiB,uBAAA,EAAyB,MAAI,KAAa;AACxG,EAAA,uBACIQ,kBAAA,CAAA,aAAA,CAAAA,kBAAA,CAAA,QAAA,EAAA,IAAA,EACK,WAAA,EAAa,GAAA,CAAI,CAAC,EAAA,KAAO;AACtB,IAAA,uBAAOA,kBAAA,CAAA,aAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACJ,IAAA;AAAA,QACA,GAAA,EAAK,EAAA;AAAA,QACL,EAAA;AAAA,QACA,uBAAA;AAAA,QACA;AAAA;AAAA,KACJ;AAAA,EACJ,CAAC,CACL,CAAA;AAER,CAAA;AAgBO,SAAS,WAAA,CAAY;AAAA,EACI,IAAA;AAAA,EACA,UAAA,GAAa,EAAA;AAAA,EACb,QAAA,GAAW,EAAA;AAAA,EACX,KAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA,GAAY,SAAA;AAAA,EACZ,WAAA;AAAA,EACA;AACJ,CAAA,EAAqB;AAC7C,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,EAAC,UAAA,EAAY,OAAM,CAAA;AAErD,EAAA,uBACIA,kBAAA,CAAA,aAAA;AAAA,IAACC,4BAAA;AAAA,IAAA;AAAA,MACG,QAAA,EAAUC,mBAAY,OAAO,CAAA;AAAA,MAC7B,OAAA;AAAA,MACA,KAAA,EAAO;AAAA,KAAA;AAAA,oBAEPF,kBAAA,CAAA,aAAA,CAAC,kBAAO,KAAA,EAAO;AAAA,MACX,YAAA,EAAc,IAAA;AAAA,MACd,eAAA,EAAiB;AAAA,KACrB,EAAA,kBACIA,kBAAA,CAAA,aAAA,CAAC,cAAA,EAAA,EAAO,QAAA,EAAUE,kBAAA,CAAY,KAAK,CAAA,IAAK,MAAA,CAAO,KAAK,CAAA,IAAK,CAAA,EAAA,kBACrDF,kBAAA,CAAA,aAAA;AAAA,MAACjB,gBAAAA;AAAA,MAAA;AAAA,QAAK,OAAO,CAAC;AAAA,UACV,MAAA,EAAQ,CAAA;AAAA,UACR,QAAA,EAAU,UAAA;AAAA,UACV,KAAA,EAAO,EAAA;AAAA,UACP,GAAA,EAAK,EAAA;AAAA,UACL,YAAA,EAAc,GAAA;AAAA,UACd,eAAA,EAAiB,MAAA;AAAA,UACjB,OAAA,EAAS;AAAA,WACV,UAAU;AAAA,OAAA;AAAA,sBAETiB,kBAAA,CAAA,aAAA;AAAA,QAAC,aAAA;AAAA,QAAA;AAAA,UACG,QAAA,EAAU,EAAA;AAAA,UACV,OAAO,KAAA,GAAQ,EAAA;AAAA,UACf,KAAA,EAAO;AAAA;AAAA;AACX,KAER,CAAA,kBACAA,kBAAA,CAAA,aAAA,CAAC,cAAA,EAAA,EAAO,KAAA,EAAO;AAAA,MACX,MAAA,EAAQ,CAAA;AAAA,MACR,YAAA,EAAc,IAAA;AAAA,MACd,eAAA,EAAiB;AAAA,KACrB,EAAA,kBACIA,kBAAA,CAAA,aAAA,CAAC,cAAA,EAAA,EAAO,KAAA,EAAO;AAAA,MACX,MAAA,EAAQ,CAAA;AAAA,MACR,YAAA,EAAc,IAAA;AAAA,MACd,MAAA,EAAQ,UAAA;AAAA,MACR,KAAA,EAAO,UAAA;AAAA,MACP,iBAAiB,WAAA,IAAe,SAAA;AAAA,MAChC,QAAA,EAAU;AAAA,SAGN,KAAA,mBACIA,kBAAA,CAAA,aAAA;AAAA,MAACG,iBAAA;AAAA,MAAA;AAAA,QACG,UAAA,EAAY,OAAA;AAAA,QACZ,MAAA,EAAQ,EAAC,GAAA,EAAK,KAAA,EAAK;AAAA,QACnB,KAAA,EAAO;AAAA,UACH,MAAA,EAAQ,MAAA;AAAA,UACR,YAAA,EAAc,CAAA;AAAA,UACd,GAAGV,sBAAAA,CAAW;AAAA;AAClB;AAAA,KACJ,mBAEAO,kBAAA,CAAA,aAAA;AAAA,MAACR,gBAAAA;AAAA,MAAA;AAAA,QACG,gBAAA,EAAkB,KAAA;AAAA,QAClB,KAAA,EAAO;AAAA,UACH,UAAA,EAAY,SAAA;AAAA,UACZ,QAAA;AAAA,UACA,OAAO,SAAA,IAAa,SAAA;AAAA,UACpB,UAAA,EAAY;AAAA;AAChB,OAAA;AAAA,MAEC,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,CAAC,CAAC,EAAE,IAAA,CAAK,EAAE,EAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,GAAI;AAAA,KAG9E,CACJ,CACJ;AAAA,GACJ;AAER;ACnKO,IAAM,sBAAuC,CAAC;AAAA,EACI,gBAAA;AAAA,EACA,UAAA;AAAA,EACA;AACJ,CAAA,KAAM;AACvD,EAAA,MAAM,YAAY,UAAA,GAAa,CAAA;AAC/B,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAUY,4BAAwB,IAAI,CAAA;AAGtE,EAAA,MAAM,UAAA,GAAaC,gBAAkB,MAAM;AACvC,IAAA,MAAM,MAAgB,EAAC;AACvB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AACzB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AACxB,QAAA,MAAM,IAAI,CAAA,GAAI,EAAA;AACd,QAAA,MAAM,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACpC,QAAA,MAAM,KAAK,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACpC,QAAA,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,CAAK,CAAA;AAAA,MAC7B;AAAA,IACJ;AACA,IAAA,OAAO,GAAA;AAAA,EACX,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQA,eAAA;AAAA,IACV,MACI,UAAA,CAAW,GAAA,CAAI,CAAC,GAAG,GAAA,MAAS;AAAA,MACxB,CAAA,EAAG,CAAA;AAAA,MACH,GAAG,GAAA,GAAM,SAAA;AAAA,MACT,KAAA,EAAO,uBAAA;AAAA,MACP,MAAA,EAAQ,SAAA;AAAA,MACR;AAAA,KACJ,CAAE,CAAA;AAAA,IACN,CAAC,UAAA,EAAY,SAAA,EAAW,uBAAuB;AAAA,GACnD;AAGA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,SAAS,CAAC,CAAA;AAC3C,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA;AAC1C,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,KAAA,CAAM,QAAQ,CAAA;AACxC,EAAA,MAAM,aAAA,GAAgB,YAAY,UAAA,CAAW,MAAA;AAE7C,EAAA,MAAM,WAAA,GAAoBD,kBAAA,CAAA,WAAA;AAAA,IACtB,CAAC,GAAA,KAAgB;AACb,MAAA,aAAA,CAAc,IAAI,CAAA;AAClB,MAAA,MAAM,IAAA,GAAO,WAAW,GAAG,CAAA;AAC3B,MAAA,IAAI,IAAA,EAAM;AACN,QAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,MACzB;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,kBAAkB,UAAU;AAAA,GACjC;AAEA,EAAA,MAAM,YAAA,GAAqBA,kBAAA,CAAA,WAAA,CAAY,CAAC,GAAA,KAAgB;AACpD,IAAA,aAAA,CAAc,GAAG,CAAA;AAAA,EACrB,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,MAAM,WAAA,GAAoBA,+BAAY,MAAM;AACxC,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,EACtB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,mBAAmBE,iCAAA,CAAQ,SAAA,EAAU,CACtC,OAAA,CAAQ,CAAC,CAAA,KAAM;AACZ,IAAA,SAAA;AACA,IAAAC,iBAAA,CAAQ,YAAY,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA,GAAI,SAAS,CAAC,CAAA;AAAA,EACrD,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,CAAA,KAAM;AACV,IAAA,SAAA;AACA,IAAAA,iBAAA,CAAQ,WAAW,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA,GAAI,SAAS,CAAC,CAAA;AAAA,EACpD,CAAC,CAAA,CACA,UAAA,CAAW,MAAM;AACd,IAAA,SAAA;AACA,IAAAA,iBAAA,CAAQ,WAAW,CAAA,EAAE;AAAA,EACzB,CAAC,CAAA;AAEL,EAAA,uBACIH,kBAAA,CAAA,aAAA,CAACI,yCAAA,EAAA,EAAgB,OAAA,EAAS,gBAAA,EAAA,mDACrBzB,gBAAAA,EAAA,IAAA,kBAEGqB,kBAAA,CAAA,aAAA,CAACK,sBAAA,EAAA,EAAO,KAAA,EAAO,EAAC,KAAA,EAAO,uBAAA,EAAyB,QAAQ,aAAA,EAAa,EAAA,EAChE,UAAA,CAAW,GAAA,CAAI,CAAC,EAAC,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,GAAA,IAAM,GAAA,qBAC/CL,kBAAA,CAAA,aAAA,CAAOA,kBAAA,CAAA,QAAA,EAAN,EAAe,KAAK,GAAA,EAAA,kBACjBA,kBAAA,CAAA,aAAA;AAAA,IAACM,oBAAA;AAAA,IAAA;AAAA,MACG,CAAA;AAAA,MACA,CAAA;AAAA,MACA,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,CAAA;AAAA,MACR,KAAA,EACI,UAAA,KAAe,GAAA,GAAM,uBAAA,GAA0B,uBAAA;AAAA,MAEnD,KAAA,EAAM;AAAA;AAAA,GACV,kBACAN,kBAAA,CAAA,aAAA,CAACO,oBAAA,EAAA,EAAK,EAAA,EAAI,EAAC,GAAG,CAAA,EAAG,CAAA,GAAI,CAAA,EAAC,EAAG,EAAA,EAAI,EAAC,GAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,CAAA,EAAC,EAAG,OAAM,MAAA,EAAO,WAAA,EAAa,CAAA,EAAE,CACnF,CACH,CACL,mBAGAP,kBAAA,CAAA,aAAA,CAACK,sBAAA,EAAA,EAAO,KAAA,EAAO,EAAC,KAAA,EAAO,uBAAA,EAAyB,QAAQ,aAAA,EAAa,EAAA,EAChE,WAAA,CAAY,GAAA,CAAI,CAAC,EAAC,GAAG,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,GAAA,EAAG,EAAG,GAAA,qBAChDL,kBAAA,CAAA,aAAA,CAAOA,kBAAA,CAAA,QAAA,EAAN,EAAe,GAAA,EAAK,GAAA,EAAA,kBACjBA,kBAAA,CAAA,aAAA;AAAA,IAACM,oBAAA;AAAA,IAAA;AAAA,MACG,CAAA;AAAA,MACA,GAAG,CAAA,GAAI,aAAA;AAAA,MACP,KAAA,EAAO,CAAA;AAAA,MACP,MAAA,EAAQ,CAAA;AAAA,MACR,KAAA,EACI,UAAA,KAAe,GAAA,GAAM,uBAAA,GAA0B,uBAAA;AAAA,MAEnD,KAAA,EAAM;AAAA;AAAA,GACV,kBACAN,kBAAA,CAAA,aAAA;AAAA,IAACO,oBAAA;AAAA,IAAA;AAAA,MACG,IAAI,EAAC,CAAA,EAAG,CAAA,EAAG,CAAA,GAAI,gBAAgB,CAAA,EAAC;AAAA,MAChC,EAAA,EAAI,EAAC,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,EAAG,CAAA,GAAI,gBAAgB,CAAA,EAAC;AAAA,MACvC,KAAA,EAAM,MAAA;AAAA,MACN,WAAA,EAAa;AAAA;AAAA,GAErB,CACH,CACL,CACJ,CACJ,CAAA;AAER,CAAA;ACrHO,IAAM,cAA+B,CAAC,EAAC,KAAA,EAAO,SAAA,EAAW,UAAQ,KAAM;AAC1E,EAAA,MAAM,eAAA,GAAkB,MAAM,kBAAA,EAAmB;AACjD,EAAA,MAAM,aAAA,GAAgB,MAAM,gBAAA,EAAiB;AAC7C,EAAA,MAAM,OAAA,GAAU,MAAM,UAAA,EAAW;AACjC,EAAA,MAAM,WAAA,GAAcN,gBAAQ,MAAMzB,cAAAA,CAAO,UAAU,YAAY,CAAA,EAAI,CAAC,QAAQ,CAAC,CAAA;AAE7E,EAAAS,kBAAU,MAAM;AACZ,IAAA,OAAA,CAAQ,QAAQ,CAAA;AAEhB,IAAA,eAAA,CAAgB,SAAA,CAAU,GAAA,CAAI,CAAA,CAAA,MAAM,EAAC,IAAI,CAAA,CAAE,EAAA,EAAI,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,CAAE,MAAA,GAAQ,CAAC,CAAA;AAGhF,IAAA,MAAM,UAAA,uBAAiB,GAAA,EAOrB;AAEF,IAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACvB,MAAA,MAAM,IAAA,GAAO,CACT,KAAA,EACA,KAAA,KACC;AACD,QAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AACpB,QAAA,KAAA,MAAW,MAAM,KAAA,EAAO;AACpB,UAAA,MAAM,GAAA,GAAM,GAAG,IAAA,IAAQ,WAAA;AACvB,UAAA,MAAM,MAAA,GACF,WAAW,GAAA,CAAI,GAAG,KAClB,UAAA,CAAW,GAAA,CAAI,KAAK,EAAC,MAAA,EAAQ,EAAC,EAAG,cAAA,EAAgB,EAAC,EAAG,gBAAA,EAAkB,EAAC,EAAE,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA;AAEvF,UAAA,MAAM,CAAA,GAAI,OAAO,KAAK,CAAA;AACtB,UAAA,CAAC,EAAE,CAAA,CAAE,EAAE,MAAM,EAAC,EAAG,KAAK,EAAE,CAAA;AAAA,QAC5B;AAAA,MACJ,CAAA;AAEA,MAAA,IAAA,CAAK,CAAA,CAAE,QAAQ,QAAQ,CAAA;AACvB,MAAA,IAAA,CAAK,CAAA,CAAE,gBAAgB,gBAAgB,CAAA;AACvC,MAAA,IAAA,CAAK,CAAA,CAAE,kBAAkB,kBAAkB,CAAA;AAAA,IAC/C;AAEA,IAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,OAAO,CAAA,IAAK,UAAA,EAAY;AACxC,MAAA,aAAA,CAAc,QAAQ,OAAO,CAAA;AAAA,IACjC;AAAA,EACJ,GAAG,CAAC,SAAA,EAAW,eAAA,EAAiB,aAAA,EAAe,WAAW,CAAC,CAAA;AAE3D,EAAA,OAAO,IAAA;AACX,CAAA;AC7CA,IAAM,mBAAqD,CAAC,EAAC,KAAA,EAAO,GAAA,EAAK,QAAM,KAAM;AACjF,EAAA,uBAAOP,0BAAAA,CAAA,aAAA,CAACC,gBAAAA,EAAA,EAAK,KAAA,EAAO,CAACW,OAAAA,CAAO,aAAA,EAAe,EAAC,KAAA,EAAO,GAAA,EAAK,MAAA,EAAO,CAAA,EAAA,kBAC3DZ,0BAAAA,CAAA,aAAA,CAAC8B,oBAAA,EAAA,EAAI,KAAA,EAAc,MAAA,EAAO,MAAA,EAAA,kBACtB9B,0BAAAA,CAAA,aAAA,CAAC+B,QAAA,EAAA,IAAA,kBACG/B,0BAAAA,CAAA,aAAA,CAACgC,WAAA,EAAA,EAAQ,EAAA,EAAG,iBAAgB,YAAA,EAAa,gBAAA,EAAiB,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAA,kBACxEhC,0BAAAA,CAAA,cAAC6B,QAAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,MAAA,EAAO,0BAAA,EAA2B,WAAA,EAAY,GAAA,EAAG,CACzF,CACJ,CAAA,kBACA7B,0BAAAA,CAAA,aAAA,CAAC4B,WAAAA,EAAA,EAAK,OAAc,MAAA,EAAO,MAAA,EAAO,IAAA,EAAK,qBAAA,EAAqB,CAChE,CACJ,CAAA;AACJ,CAAA;AAEA,IAAM,iBAAA,GAAqD5B,0BAAAA,CAAM,IAAA,CAAK,CAAC;AAAA,EACI,EAAA;AAAA,EACA,uBAAA;AAAA,EACA,UAAA;AAAA,EACA,IAAA,EAAM;AACV,CAAA,KAAM;AACzE,EAAA,MAAM,EAAC,uBAAA,EAAAiC,wBAAAA,EAAyB,UAAA,EAAAC,WAAAA,KAC5B,kBAAA,EAAmB;AACvB,EAAA,MAAM,OAAOA,WAAAA,EAAW;AACxB,EAAA,MAAM,iBAAA,GAAoBD,wBAAAA,CAAwB,EAAA,EAAI,QAAA,IAAY,IAAI,CAAA;AAEtE,EAAA,uBACIjC,0BAAAA,CAAA,aAAA,CAAAA,0BAAAA,CAAA,gBACK,iBAAA,CAAkB,GAAA;AAAA,IAAI,CAAC,kBAAkB,KAAA,KAAU;AAC5C,MAAA,uBAAOA,0BAAAA,CAAA,aAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACJ,GAAA,EAAK,GAAG,KAAK,CAAA,CAAA,EAAI,iBAAiB,IAAI,CAAA,CAAA,EAAI,iBAAiB,EAAE,CAAA,CAAA;AAAA,UAC7D,KAAA,EAAO,uBAAA;AAAA,UACP,GAAA,EAAK,aAAA,CAAc,gBAAA,CAAiB,IAAA,EAAM,UAAU,CAAA;AAAA,UACpD,QAAQ,aAAA,CAAc,gBAAA,CAAiB,EAAA,GAAK,gBAAA,CAAiB,MAAM,UAAU;AAAA;AAAA,OACjF;AAAA,IACJ;AAAA,GAER,CAAA;AAER,CAAC,CAAA;AAED,IAAMY,OAAAA,GAASD,uBAAW,MAAA,CAAO;AAAA,EAC7B,aAAA,EAAe;AAAA,IACX,QAAA,EAAU,UAAA;AAAA,IACV,MAAA,EAAQ;AAAA;AAEhB,CAAC,CAAA;AAED,IAAO,yBAAA,GAAQ,iBAAA;AC1Df,IAAM,GAAA,GAAM,CAAC,EAAC,QAAA,EAAU,SAAS,KAAA,EAAO,KAAA,EAAO,GAAG,KAAA,EAAK,KAAgB;AACnE,EAAA,uBACIX,0BAAAA,CAAA,aAAA,CAACC,gBAAAA,EAAA,EAAK,KAAA,EAAO,CAAC,EAAC,aAAA,EAAe,KAAA,EAAK,EAAG,KAAK,GAAI,GAAG,KAAA,EAAA,EAC7CD,0BAAAA,CAAM,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,KAAA,EAAO,KAAA,qBAC1CA,0BAAAA,CAAA,aAAA,CAACA,0BAAAA,CAAM,QAAA,EAAN,EAAe,GAAA,EAAK,KAAA,EAAA,EAChB,KAAA,EACA,KAAA,KAAUA,0BAAAA,CAAM,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,GAAS,CAAA,IACjD,OAAA,EACH,KAAA,KAAUA,0BAAAA,CAAM,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA,CAAE,MAAA,GAAS,CAAA,oBACjDA,0BAAAA,CAAA,aAAA,CAACC,gBAAAA,EAAA,EAAK,KAAA,EAAO,EAAC,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAM,EAAE,CACpD,CACH,CACL,CAAA;AAER,CAAA;AAEA,IAAO,WAAA,GAAQ,GAAA;AC4Bf,IAAM,yBAAgE,CAAC;AAAA,EACI,GAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA;AACJ,CAAA,KAAM;AACzE,EAAA,MAAM,YAAA,GAAe;AAAA,IACjB,eAAA,EAAiB,SAAA;AAAA,IACjB,KAAK,GAAA,GAAM,CAAA;AAAA,IACX,IAAA,EAAM,OAAO,MAAA,GAAS,CAAA;AAAA,IACtB,MAAA,EAAQ,MAAA,GAAS,UAAA,GAAa,CAAA,GAAI,SAAS,MAAA,GAAS,CAAA;AAAA,IACpD,KAAA,EAAO,OAAO,OAAA,GAAU,CAAA;AAAA,IACxB,WAAA,EAAa,CAAA;AAAA,IACb,WAAA,EAAa;AAAA,GACjB;AACA,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,EAAC,UAAA,EAAY,OAAM,CAAA;AAErD,EAAA,uBAAOD,0BAAAA,CAAA,aAAA;AAAA,IAACmB,4BAAAA;AAAA,IAAA;AAAA,MACJ,KAAA,EAAO,CAACP,OAAAA,CAAO,KAAA,EAAO,YAAY,CAAA;AAAA,MAClC,SAAS,MAAM;AACX,QAAA,oBAAA,IAAwB,qBAAqB,aAAa,CAAA;AAAA,MAC9D;AAAA,KAAA;AAAA,oBAEAZ,0BAAAA,CAAA,aAAA,CAAC,eAAI,KAAA,EAAO,EAAC,UAAU,UAAA,EAAU,EAAA,kBAC7BA,0BAAAA,CAAA,aAAA,CAAC,eAAI,KAAA,EAAO,EAAC,QAAQ,EAAA,EAAE,EAAA,kBACnBA,0BAAAA,CAAA,aAAA;AAAA,MAACU,gBAAAA;AAAA,MAAA;AAAA,QACG,gBAAA,EAAkB,KAAA;AAAA,QAClB,KAAA,EAAO;AAAA,UACH,UAAA,EAAY,SAAA;AAAA,UACZ,QAAA,EAAU,YAAY,UAAU,CAAA;AAAA,UAChC,UAAA,EAAY;AAAA;AAChB,OAAA;AAAA,MAAI,aAAA,CAAc,eAAe,IAAI,CAAA;AAAA,MAAE,KAAA;AAAA,MAAI,aAAA,CAAc,eAAe,EAAE;AAAA,KAClF,CAAA,kBACAV,0BAAAA,CAAA,aAAA;AAAA,MAACU,gBAAAA;AAAA,MAAA;AAAA,QACG,gBAAA,EAAkB,KAAA;AAAA,QAClB,KAAA,EAAO;AAAA,UACH,UAAA,EAAY,SAAA;AAAA,UACZ,QAAA,EAAU,YAAY,UAAU,CAAA;AAAA,UAChC,UAAA,EAAY;AAAA;AAChB,OAAA;AAAA,MAAI,aAAA,EAAe;AAAA,KAC3B;AAAA,GACJ;AACJ,CAAA;AAEA,IAAM,cAAA,GAAgDV,0BAAAA,CAAM,IAAA,CAAK,CAAC;AAAA,EACI,EAAA;AAAA,EACA,uBAAA;AAAA,EACA,UAAA;AAAA,EACA,oBAAA;AAAA,EACA,IAAA,EAAM;AACV,CAAA,KAAM;AACpE,EAAA,MAAM,EAAC,oBAAA,EAAAmC,qBAAAA,EAAsB,UAAA,EAAAD,WAAAA,KACzB,kBAAA,EAAmB;AACvB,EAAA,MAAM,OAAOA,WAAAA,EAAW;AACxB,EAAA,MAAM,cAAA,GAAiBC,qBAAAA,CAAqB,EAAA,EAAI,QAAA,IAAY,IAAI,CAAA;AAEhE,EAAA,MAAM,SAAA,GAAYZ,gBAAQ,MAAM;AAC5B,IAAA,OAAO,eAAA,CAAgB,2BAAA,CAA4B,cAAc,CAAA,EAAG,uBAAuB,CAAA;AAAA,EAC/F,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,EAAA,uBACIvB,0BAAAA,CAAA,aAAA,CAAAA,0BAAAA,CAAA,gBACK,cAAA,CAAe,GAAA;AAAA,IAAI,CAAC,eAAe,KAAA,KAAU;AACtC,MAAA,MAAM,MAAM,aAAA,CAAc,EAAA;AAC1B,MAAA,uBAAOA,0BAAAA,CAAA,aAAA;AAAA,QAAC,sBAAA;AAAA,QAAA;AAAA,UACJ,UAAA;AAAA,UACA,aAAA;AAAA,UACA,GAAA,EAAK,GAAG,KAAK,CAAA,CAAA,EAAI,cAAc,IAAI,CAAA,CAAA,EAAI,cAAc,EAAE,CAAA,CAAA;AAAA,UACvD,GAAA,EAAK,aAAA,CAAc,aAAA,CAAc,IAAA,EAAM,UAAU,CAAA;AAAA,UACjD,QAAQ,aAAA,CAAc,aAAA,CAAc,EAAA,GAAK,aAAA,CAAc,MAAM,UAAU,CAAA;AAAA,UACvE,MAAA,EAAQ,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA;AAAA,UACzB;AAAA;AAAA,OACJ;AAAA,IACJ;AAAA,GAER,CAAA;AAER,CAAC,CAAA;AAED,IAAMY,OAAAA,GAASD,uBAAW,MAAA,CAAO;AAAA,EAC7B,KAAA,EAAO;AAAA,IACH,QAAA,EAAU,UAAA;AAAA,IACV,YAAA,EAAc,CAAA;AAAA,IACd,OAAA,EAAS,CAAA;AAAA,IACT,QAAA,EAAU,QAAA;AAAA,IACV,MAAA,EAAQ;AAAA;AAAA;AAEhB,CAAC,CAAA;AAED,IAAO,sBAAA,GAAQ,cAAA;ACrGf,IAAM,UAAA,GAAwCX,0BAAAA,CAAM,IAAA,CAAK,CAAC;AAAA,EACI,KAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EAAS,QAAA;AAAA,EAAU,QAAA;AAAA,EACnB,UAAA;AAAA,EAAY,KAAA;AAAA,EACZ,KAAA;AAAA,EACA;AACJ,CAAA,KAAM;AAC5D,EAAA,MAAM,EAAC,mBAAA,EAAAoC,oBAAAA,EAAmB,GACtB,kBAAA,EAAmB;AACvB,EAAA,MAAM,sBAAsBA,oBAAAA,EAAoB;AAEhD,EAAA,MAAM,QAAA,GAAW,aAAA,CAAc,KAAA,CAAM,IAAA,EAAM,UAAU,CAAA;AACrD,EAAA,MAAM,cAAc,aAAA,CAAc,KAAA,CAAM,EAAA,GAAK,KAAA,CAAM,MAAM,UAAU,CAAA;AAEnE,EAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,CAAM,IAAI,CAAA;AACtC,EAAA,MAAM,GAAA,GAAM,aAAA,CAAc,KAAA,CAAM,EAAE,CAAA;AAElC,EAAA,MAAM,YAAA,GAAe;AAAA,IACjB,KAAK,QAAA,GAAW,CAAA;AAAA,IAChB,MAAA,EAAQ,WAAA,GAAc,UAAA,GAAa,CAAA,GAAI,cAAc,WAAA,GAAc,CAAA;AAAA,IACnE,IAAA,EAAM,MAAM,MAAA,GAAS,CAAA;AAAA,IACrB,KAAA,EAAO,MAAM,OAAA,GAAU,CAAA;AAAA,IACvB,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,OAAA,EAAS,mBAAA,IAAuB,QAAA,GAAW,GAAA,GAAM,CAAA;AAAA,IACjD,WAAA,EAAa,WAAW,CAAA,GAAI,CAAA;AAAA,IAC5B,WAAA,EAAa,WAAW,SAAA,GAAY;AAAA,GACxC;AAEA,EAAA,MAAM,QAAA,GACF,OAAO,cAAA,KAAmB,UAAA,GACpB,cAAA,CAAe,KAAK,CAAA,IAAK,EAAC,GAC1B,cAAA,IAAkB,EAAC;AAE7B,EAAA,IAAI,WAAA,IAAe,CAAA;AACf,IAAA,OAAO,IAAA;AAEX,EAAA,MAAM,WAAW,KAAA,EAAO,QAAA;AACxB,EAAA,MAAM,OAAO,KAAA,EAAO,IAAA;AACpB,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,EAAC,UAAA,EAAY,OAAM,CAAA;AACrD,EAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,EAAC,UAAA,EAAY,OAAM,CAAA;AAEpD,EAAA,uBACIpC,0BAAAA,CAAA,aAAA;AAAA,IAACmB,4BAAAA;AAAA,IAAA;AAAA,MACG,OAAO,CAACP,OAAAA,CAAO,KAAA,EAAO,QAAA,EAAU,WAAW,YAAY,CAAA;AAAA,MACvD,QAAA;AAAA,MACA,SAAS,MAAM;AACX,QAAA,OAAA,IAAW,QAAQ,KAAK,CAAA;AAAA,MAC5B,CAAA;AAAA,MACA,aAAa,MAAM;AACf,QAAA,WAAA,IAAe,YAAY,KAAK,CAAA;AAAA,MACpC;AAAA,KAAA;AAAA,oBAEAZ,0BAAAA,CAAA,aAAA,CAAC,WAAA,EAAA,EAAI,OAAO,CAAC,EAAC,QAAA,EAAU,UAAA,EAAU,EAAG,QAAA,EAAU,OAAO,CAAA,EAAA,kBAClDA,0BAAAA,CAAA,aAAA;AAAA,MAACqC,qBAAA;AAAA,MAAA;AAAA,QACG,QAAA,EAAU,KAAA;AAAA,QACV,gBAAA,EAAkB,KAAA;AAAA,QAClB,qBAAA,EAAsB,aAAA;AAAA,QACtB,OAAO,CAAC;AAAA,UACJ,KAAA,EAAO,MAAA;AAAA,UACP,UAAA,EAAY,QAAA;AAAA,UACZ,QAAA,EAAU,YAAY,UAAU,CAAA;AAAA,UAChC,aAAA,EAAe,MAAA;AAAA,UACf,OAAA,EAAS,CAAA;AAAA,UACT,MAAA,EAAQ;AAAA,SACZ,EAAG,UAAU,IAAI,CAAA;AAAA,QACjB,YAAA,EAAc,CAAA,EAAG,KAAK,CAAA,GAAA,EAAM,GAAG,CAAA;AAAA;AAAA,KACnC,EAGI,IAAA,mBAAOrC,0BAAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAc,GAAA,EAAK,EAAC,UAAA,EAAU,EAAE,CAAA,mBACzCA,0BAAAA,CAAA,aAAA,CAAAA,0BAAAA,CAAA,QAAA,EAAA,IAAA,kBACIA,0BAAAA,CAAA,aAAA,CAAC,WAAA,EAAA,EAAI,KAAA,EAAO,EAAC,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,EAAA,EAAE,EAAA,kBACzCA,0BAAAA,CAAA,aAAA;AAAA,MAACU,gBAAAA;AAAA,MAAA;AAAA,QACG,gBAAA,EAAkB,KAAA;AAAA,QAClB,OAAO,CAAC;AAAA,UACJ,UAAA,EAAY,SAAA;AAAA,UACZ,QAAA,EAAU,YAAY,UAAU,CAAA;AAAA,UAChC,UAAA,EAAY;AAAA,SAChB,EAAG,UAAU,KAAK;AAAA,OAAA;AAAA,MACpB,KAAA,EAAO;AAAA,KACb,CAAA,kBACAV,0BAAAA,CAAA,aAAA;AAAA,MAACU,gBAAAA;AAAA,MAAA;AAAA,QACG,gBAAA,EAAkB,KAAA;AAAA,QAClB,OAAO,CAAC;AAAA,UACJ,UAAA,EAAY,QAAA;AAAA,UACZ,QAAA,EAAU,YAAY,UAAU,CAAA;AAAA,UAChC,UAAA,EAAY;AAAA,SAChB,EAAG,UAAU,IAAI;AAAA,OAAA;AAAA,MAAI,KAAA,EAAO;AAAA,KACpC,CAAA,kBAERV,0BAAAA,CAAA,aAAA,CAAC,eAAI,KAAA,EAAO;AAAA,MACR,QAAA,EAAU,UAAA;AAAA,MACV,KAAA,EAAO;AAAA,KACX,EAAA,EACK,QAAA,mBAAWA,0BAAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAc,GAAA,EAAK,EAAC,UAAA,EAAU,EAAE,CAAA,GAAK,IAC/D,CACJ;AAAA,GACJ;AAER,CAAC,CAAA;AAED,IAAMY,OAAAA,GAASD,uBAAW,MAAA,CAAO;AAAA,EAC7B,KAAA,EAAO;AAAA,IACH,eAAA,EAAiB,SAAA;AAAA,IACjB,QAAA,EAAU,UAAA;AAAA,IACV,YAAA,EAAc,CAAA;AAAA,IACd,OAAA,EAAS,CAAA;AAAA,IACT,QAAA,EAAU,QAAA;AAAA,IACV,MAAA,EAAQ;AAAA;AAAA;AAEhB,CAAC,CAAA;AAED,IAAO,kBAAA,GAAQ,UAAA;AClIf,IAAM,iBAAA,GAAoB2B,0BAAA,CAAS,uBAAA,CAAwBD,qBAAS,CAAA;AAE7D,IAAM,iBAAiB,CAAC;AAAA,EACI,aAAA;AAAA,EACA,eAAA;AAAA,EACA,OAAA;AAAA,EAAS,OAAA;AAAA,EACT,uBAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EAAa,cAAA;AAAA,EACb;AACJ,CAAA,KAAa;AACxC,EAAA,MAAM,YAAA,GAAeE,2BAAiB,MAAM;AACxC,IAAA,OAAO;AAAA,MACH,MAAA,EAAQ,YAAY,KAAA,GAAQ,UAAA,GAAa,IAAI,WAAA,CAAY,KAAA,GAAQ,YAAY,KAAA,GAAQ,CAAA;AAAA,MACrF,OAAO,uBAAA,GAA0B,CAAA;AAAA,MACjC,WAAA,EAAa,CAAA;AAAA,MACb,WAAA,EAAa;AAAA,KACjB;AAAA,EACJ,CAAC,CAAA;AAED,EAAA,MAAM,qBAAA,GAAwBA,2BAAiB,MAAM;AACjD,IAAA,IAAI,CAAC,aAAA,EAAe;AAChB,MAAA,OAAO;AAAA,QACH,OAAA,EAAS,CAAA;AAAA,QACT,SAAA,EAAW;AAAA,UACP;AAAA,YACI,UAAA,EAAY;AAAA,WAChB;AAAA,UACA;AAAA,YACI,UAAA,EAAY;AAAA;AAChB;AACJ,OACJ;AAAA,IACJ;AACA,IAAA,OAAO;AAAA,MACH,OAAA,EAAS,CAAA;AAAA,MACT,SAAA,EAAW;AAAA,QACP;AAAA,UACI,UAAA,EAAY,OAAA,CAAQ,KAAA,GAAS,WAAA,CAAY,QAAQ,CAAA,GAAK;AAAA,SAC1D;AAAA,QACA;AAAA,UACI,UAAA,EAAY,OAAA,CAAQ,KAAA,GAAS,uBAAA,GAA0B,CAAA,GAAK;AAAA;AAChE;AACJ,KACJ;AAAA,EACJ,CAAA,EAAG,CAAC,aAAA,EAAe,uBAAuB,CAAC,CAAA;AAE3C,EAAA,MAAM,kBAAA,GAAqBhB,gBAAQ,MAAM;AAErC,IAAA,MAAM,QAAQ,aAAA,CAAc,iBAAA,CAAkB,eAAA,CAAgB,KAAA,EAAO,UAAU,CAAC,CAAA;AAChF,IAAA,MAAM,GAAA,GAAM,cAAc,iBAAA,CAAkB,eAAA,CAAgB,QAAQ,WAAA,CAAY,KAAA,EAAO,UAAU,CAAC,CAAA;AAClG,IAAA,OAAO,CAAA,EAAG,KAAK,CAAA,GAAA,EAAM,GAAG,CAAA,CAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,iBAAA,GAAoBiB,2BAAyC,MAAM;AACrE,IAAA,MAAM,QAAQ,aAAA,CAAc,iBAAA,CAAkB,eAAA,CAAgB,KAAA,EAAO,UAAU,CAAC,CAAA;AAChF,IAAA,MAAM,GAAA,GAAM,cAAc,iBAAA,CAAkB,eAAA,CAAgB,QAAQ,WAAA,CAAY,KAAA,EAAO,UAAU,CAAC,CAAA;AAClG,IAAA,OAAO;AAAA,MACH,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,GAAA,EAAM,GAAG,CAAA;AAAA,KAC3B;AAAA,EACJ,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,QAAA,GACF,OAAO,cAAA,KAAmB,UAAA,GACpB,cAAA,CAAe,aAAa,CAAA,IAAK,EAAC,GAClC,cAAA,IAAkB,EAAC;AAE7B,EAAA,MAAM,WAAW,KAAA,EAAO,QAAA;AACxB,EAAA,MAAM,OAAO,KAAA,EAAO,IAAA;AACpB,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,EAAC,UAAA,EAAY,OAAM,CAAA;AACrD,EAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,EAAC,UAAA,EAAY,OAAM,CAAA;AAEpD,EAAA,uBACIC,kBAAA,CAAA,aAAA,CAACH,2BAAS,IAAA,EAAT,EAAc,OAAO,CAAC1B,OAAAA,CAAO,KAAA,EAAO,YAAA,EAAc,qBAAA,EAAuB,QAAA,EAAU,SAAS,CAAA,EAAA,kBACzF6B,kBAAA,CAAA,aAAA,CAAC,WAAA,EAAA,EAAI,KAAA,EAAO,CAAC,EAAC,UAAU,UAAA,EAAU,EAAG,QAAA,EAAU,OAAO,CAAA,EAAA,kBAClDA,kBAAA,CAAA,aAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACG,QAAA,EAAU,KAAA;AAAA,MACV,gBAAA,EAAkB,KAAA;AAAA,MAClB,qBAAA,EAAsB,aAAA;AAAA,MACtB,OAAO,CAAC;AAAA,QACJ,KAAA,EAAO,MAAA;AAAA,QACP,UAAA,EAAY,QAAA;AAAA,QACZ,QAAA,EAAU,YAAY,UAAU,CAAA;AAAA,QAChC,aAAA,EAAe,MAAA;AAAA,QACf,OAAA,EAAS,CAAA;AAAA,QACT,MAAA,EAAQ;AAAA,OACZ,EAAG,UAAU,IAAI,CAAA;AAAA,MACjB,YAAA,EAAc,kBAAA;AAAA,MACd,aAAA,EAAe;AAAA;AAAA,GACnB,EAEI,uBAAOA,kBAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,OAAO,aAAA,EAAe,GAAA,EAAK,EAAC,UAAA,EAAU,EAAE,oBACjDA,kBAAA,CAAA,aAAA,CAAAA,kBAAA,CAAA,QAAA,EAAA,IAAA,kBACIA,kBAAA,CAAA,aAAA,CAAC,eAAI,KAAA,EAAO,EAAC,YAAY,QAAA,EAAU,MAAA,EAAQ,IAAE,EAAA,kBACzCA,kBAAA,CAAA,aAAA;AAAA,IAAC/B,gBAAAA;AAAA,IAAA;AAAA,MACG,gBAAA,EAAkB,KAAA;AAAA,MAClB,OAAO,CAAC;AAAA,QACJ,UAAA,EAAY,SAAA;AAAA,QACZ,QAAA,EAAU,YAAY,UAAU,CAAA;AAAA,QAChC,UAAA,EAAY;AAAA,OAChB,EAAG,UAAU,KAAK;AAAA,KAAA;AAAA,IACpB,aAAA,EAAe;AAAA,GACrB,CAAA,kBACA+B,kBAAA,CAAA,aAAA;AAAA,IAAC/B,gBAAAA;AAAA,IAAA;AAAA,MACG,gBAAA,EAAkB,KAAA;AAAA,MAClB,OAAO,CAAC;AAAA,QACJ,UAAA,EAAY,QAAA;AAAA,QACZ,QAAA,EAAU,YAAY,UAAU,CAAA;AAAA,QAChC,UAAA,EAAY;AAAA,OAChB,EAAG,UAAU,IAAI;AAAA,KAAA;AAAA,IAAI,aAAA,EAAe;AAAA,GAC5C,CAAA,kBAER+B,kBAAA,CAAA,aAAA,CAAC,WAAA,EAAA,EAAI,KAAA,EAAO;AAAA,IACR,QAAA,EAAU,UAAA;AAAA,IACV,KAAA,EAAO;AAAA,KACR,KAAA,EAAO,CAAA,EAAA,EACL,2BAAWA,kBAAA,CAAA,aAAA,CAAC,QAAA,EAAA,EAAS,OAAO,aAAA,EAAe,GAAA,EAAK,EAAC,UAAA,IAAY,CAAA,GAAK,IACvE,CACJ,CAAA,kBACAA,kBAAA,CAAA,aAAA,CAAC,eAAI,KAAA,EAAO;AAAA,IACR,QAAA,EAAU,UAAA;AAAA,IACV,SAAA,EAAW,QAAA;AAAA,IAAU,MAAA,EAAQ;AAAA,GACjC,EAAA,kBACIA,kBAAA,CAAA,aAAA,CAACC,yBAAA,EAAA,EAAc,IAAA,EAAK,aAAA,EAAc,MAAM,EAAA,EAAI,KAAA,EAAM,OAAA,EAAO,CAC7D,CACJ,CAAA;AAER,CAAA;AAEA,IAAM9B,OAAAA,GAASD,uBAAW,MAAA,CAAO;AAAA,EAC7B,KAAA,EAAO;AAAA,IACH,eAAA,EAAiB,SAAA;AAAA,IACjB,QAAA,EAAU,UAAA;AAAA,IACV,YAAA,EAAc,CAAA;AAAA,IACd,OAAA,EAAS,CAAA;AAAA,IACT,QAAA,EAAU,QAAA;AAAA,IACV,MAAA,EAAQ;AAAA;AAAA;AAEhB,CAAC,CAAA;AC9ID,IAAM,WAAA,GAA0CX,0BAAAA,CAAM,IAAA,CAAK,CAAC;AAAA,EACI,EAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EAAiB,eAAA;AAAA,EACjB,IAAA;AAAA,EACA,IAAA,EAAM;AACV,CAAA,KAAM;AAE9D,EAAA,MAAM,EAAC,YAAA,EAAAiB,aAAAA,EAAc,UAAA,EAAAiB,WAAAA,KACjB,kBAAA,EAAmB;AACvB,EAAA,MAAM,OAAOA,WAAAA,EAAW;AACxB,EAAA,MAAM,MAAA,GAASjB,aAAAA,CAAa,EAAA,EAAI,QAAA,IAAY,IAAI,CAAA;AAChD,EAAA,MAAM,QAAA,GAAWM,eAAAA;AAAA,IACb,MAAM,kBAAA,CAAmB,MAAA,EAAQ,iBAAA,EAAmB,IAAI,CAAA;AAAA,IACxD,CAAC,MAAA,EAAQ,IAAA,EAAM,iBAAiB;AAAA,GACpC;AAEA,EAAA,MAAM,QAAA,GAAW,aAAA;AAEjB,EAAA,OAAQ,MAAA,EAAQ,GAAA;AAAA,IAAI,CAAC,KAAY,KAAA,KAAkB;AACvC,MAAA,MAAM,QAAA,GAAW,eAAA,GAAkB,GAAG,CAAA,IAAK,KAAA;AAC3C,MAAA,MAAM,QAAA,GAAW,eAAA,GAAkB,GAAG,CAAA,IAAK,KAAA;AAE3C,MAAA,uBAAOvB,0BAAAA,CAAA,aAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACJ,GAAA,EAAK,GAAG,GAAA,CAAI,IAAI,IAAI,GAAA,CAAI,EAAE,IAAI,KAAK,CAAA,CAAA;AAAA,UACnC,KAAA,EAAO,GAAA;AAAA,UACP,WAAA,EAAa,CAAC2C,IAAAA,KAAe,WAAA,CAAYA,IAAG,CAAA;AAAA,UAC5C,OAAA,EAAS,CAACA,IAAAA,KAAe,OAAA,CAAQA,IAAG,CAAA;AAAA,UACpC,UAAA;AAAA,UACA,KAAA,EAAO,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA;AAAA,UAC1B,QAAA;AAAA,UACA;AAAA;AAAA,OACJ;AAAA,IACJ;AAAA,GACJ;AAER,CAAC,CAAA;AAED,IAAO,mBAAA,GAAQ,WAAA;AC1CR,IAAM,aAAA,GAAgB,CAAC,EAAC,eAAA,EAAiB,kBAAkB,IAAA,EAAM,IAAA,EAAM,yBAAuB,KAAa;AAC9G,EAAA,MAAM,EAAC,eAAA,EAAA3B,gBAAAA,EAAe,GAClB,kBAAA,EAAmB;AACvB,EAAA,MAAM,QAAA,GAAWA,iBAAgB,gBAAgB,CAAA;AACjD,EAAkB,eAAA,CAAgB,EAAC,UAAA,EAAY,OAAM;AACrD,EAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,EAAC,UAAA,EAAY,OAAM,CAAA;AACxD,EAAA,MAAM,aAAa,IAAA,KAAS,KAAA;AAC5B,EAAA,MAAM,eAAA,GAAkB,UAAA,GAAc,IAAA,KAAS,MAAA,GAAS,IAAI,CAAA,GAAK,CAAA;AACjE,EAAA,MAAM,IAAA,GAAOO,eAAAA;AAAA,IACT,MAAM,KAAA,CAAM,IAAA,CAAK,EAAC,MAAA,EAAQ,eAAA,EAAe,EAAG,CAAC,CAAA,EAAG,CAAA,KAAMqB,eAAA,CAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IACtE,CAAC,MAAM,eAAe;AAAA,GAC1B;AAEA,EAAA,wDACK,WAAA,EAAA,EAAI,KAAA,EAAO,EAAC,eAAA,EAAiB,GAAC,EAAA,kBAC3BC,kBAAA,CAAA,aAAA,CAAC,WAAA,EAAA,EAAI,KAAA,EAAO,EAAC,KAAA,EAAO,gBAAA,EAAkB,YAAY,QAAA,EAAU,cAAA,EAAgB,UAAQ,EAAA,kBAChFA,kBAAA,CAAA,aAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACG,SAAS,MAAM;AACX,QAAA,IAAI,eAAA;AACA,UAAA,eAAA,CAAgB,QAAQ,CAAA;AAAA,MAChC,CAAA;AAAA,MACA,MAAM,QAAA,EAAU,IAAA;AAAA,MAChB,YAAY,gBAAA,GAAmB,EAAA;AAAA,MAC/B,QAAA,EAAU,EAAA;AAAA,MACV,OAAO,QAAA,EAAU;AAAA;AAAA,GAEzB,CAAA,kBACAA,kBAAA,CAAA,aAAA,CAAC,WAAA,EAAA,EAAI,KAAA,EAAO,EAAC,IAAA,EAAM,CAAA,EAAC,EAAA,EAEZ,IAAA,CAAK,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM;AACf,IAAA,MAAM,QAAA,GAAWxC,iBAAAA,CAAU,CAAA,kBAAG,IAAI,MAAM,CAAA;AAExC,IAAA,uBAAOwC,kBAAA,CAAA,aAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACJ,KAAA,EAAO;AAAA,UACH,UAAA,EAAY,QAAA;AAAA,UACZ,cAAA,EAAgB,QAAA;AAAA,UAChB,KAAA,EAAO;AAAA,SACX;AAAA,QACA,KAAA,EAAO,CAAA;AAAA,QACP,GAAA,EAAK;AAAA,OAAA;AAAA,sBACLA,kBAAA,CAAA,aAAA,CAAC,kBAAO,KAAA,EAAO;AAAA,QACX,eAAA,EAAiB,WAAW,SAAA,GAAY,MAAA;AAAA,QACxC,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,0BAA0B,CAAC,CAAA;AAAA,QAC/C,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,0BAA0B,CAAC,CAAA;AAAA,QAChD,YAAA,EAAc;AAAA,OAClB,EAAA,kBACIA,kBAAA,CAAA,aAAA;AAAA,QAACnC,gBAAAA;AAAA,QAAA;AAAA,UAAK,KAAA,EAAO;AAAA,YACT,QAAA,EAAU,EAAA;AAAA,YACV,UAAA,EAAY,YAAA;AAAA,YACZ,UAAA,EAAY,KAAA;AAAA,YACZ,KAAA,EAAO,WAAW,MAAA,GAAS;AAAA,WAC/B;AAAA,UACM,aAAA,EAAe,CAAA;AAAA,UACf,gBAAA,EAAkB;AAAA,SAAA;AAAA,QAEnBZ,cAAAA,CAAO,GAAG,GAAG;AAAA,OAEtB,CAAA;AAAA,sBACA+C,kBAAA,CAAA,aAAA;AAAA,QAACnC,gBAAAA;AAAA,QAAA;AAAA,UAAK,KAAA,EAAO;AAAA,YACT,QAAA,EAAU,EAAA;AAAA,YACV,UAAA,EAAY,YAAA;AAAA,YACZ,UAAA,EAAY;AAAA,WAChB;AAAA,UACM,aAAA,EAAe,CAAA;AAAA,UACf,gBAAA,EAAkB;AAAA,SAAA;AAAA,QAEnBZ,cAAAA,CAAO,GAAG,KAAK;AAAA;AACpB,KACJ;AAAA,EACJ,CAAC,CAET,CACJ,CAAA;AAER,CAAA;ACLA,IAAM,iBAAA,GAAoBwC,0BAAAA,CAAS,uBAAA,CAAwBQ,mBAAS,CAAA;AAEpE,IAAM,aAAA,GAAyC,CAAC,KAAA,KAAU;AACtD,EAAA,MAAM,EAAC,KAAA,EAAK,GAAIC,+BAAA,EAAoB;AACpC,EAAA,MAAM,KAAA,GAAQC,qBAAS,EAAA,KAAO,KAAA;AAC9B,EAAA,MAAM,UAAU,kBAAA,EAAmB;AAEnC,EAAA,MAAM;AAAA,IACF,IAAA;AAAA,IACA,iBAAiB,mBAAA,GAAsB,CAAA;AAAA,IACvC,YAAA;AAAA,IACA,UAAA,GAAa,GAAA;AAAA,IACb,qBAAA,GAAwB,CAAA;AAAA,IACxB,QAAA,GAAW,IAAA,EAAM,cAAA,EAAe,EAAG,iBAAgB,EAAG,QAAA;AAAA,IACtD,SAAA;AAAA,IACA,eAAA;AAAA,IACA,gBAAA;AAAA,IACA,YAAA;AAAA,IACA,gBAAA;AAAA,IACA,oBAAA;AAAA,IACA,UAAA;AAAA,IACA,mBAAA;AAAA,IACA,qBAAA,GAAwB,SAAA;AAAA,IACxB,IAAA,GAAO,KAAA;AAAA,IACP;AAAA,GACJ,GAAI,KAAA;AAEJ,EAAA,MAAM,kBAAkB,IAAA,KAAS,KAAA,GAAQ,mBAAA,GAAuB,IAAA,KAAS,SAAS,CAAA,GAAI,CAAA;AACtF,EAAA,MAAM,aAAa,IAAA,KAAS,KAAA;AAC5B,EAAA,MAAM,eAAA,GAAkB,UAAA,GAAc,IAAA,KAAS,MAAA,GAAS,IAAI,CAAA,GAAK,CAAA;AACjE,EAAA,MAAM,IAAA,GAAOzB,eAAAA;AAAA,IACT,MAAM,KAAA,CAAM,IAAA,CAAK,EAAC,MAAA,EAAQ,eAAA,EAAe,EAAG,CAAC,CAAA,EAAG,CAAA,KAAMqB,eAAAA,CAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IACtE,CAAC,MAAM,eAAe;AAAA,GAC1B;AAEA,EAAA,MAAM,YAAA,GAAgB,aAAa,EAAA,GAAM,qBAAA;AACzC,EAAA,MAAM,UAAA,GAAa5C,0BAAAA,CAAM,MAAA,CAAO,YAAY,CAAA;AAC5C,EAAA,MAAM,cAAA,GAAiBA,0BAAAA,CAAM,MAAA,CAAO,gBAAgB,CAAA;AACpD,EAAA,MAAM,mBAAA,GAAsBQ,eAAoC,IAAI,CAAA;AACpE,EAAA,MAAM,uBAAA,GAA0BR,0BAAAA,CAAM,MAAA,CAAO,oBAAoB,CAAA;AACjE,EAAA,MAAM,WAAA,GAAcQ,cAAAA,CAA2B,KAAA,CAAM,eAAe,CAAA;AACpE,EAAA,MAAM,WAAA,GAAcA,cAAAA,CAA2B,KAAA,CAAM,eAAe,CAAA;AAEpE,EAAA,MAAM,iBAAA,GAAoBe,gBAAuB,MAAM;AACnD,IAAA,OAAO,CAAC,CAAA,qBACJvB,0BAAAA,CAAA,aAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACI,GAAG,CAAA;AAAA,QACJ,OAAO,KAAA,CAAM,UAAA;AAAA,QACb,gBAAgB,KAAA,CAAM;AAAA;AAAA,KAC1B;AAAA,EAER,CAAA,EAAG,CAAC,UAAA,EAAY,mBAAmB,CAAC,CAAA;AAEpC,EAAA,MAAM,qBAAA,GAAwBiD,mBAAAA;AAAA,IAC1B,CAAC,EAAA,KAAQ,WAAA,CAAY,UAAU,WAAA,CAAY,OAAA,CAAQ,EAAE,CAAA,GAAI,KAAA;AAAA,IAAQ;AAAC,GAAC;AAEvE,EAAA,MAAM,qBAAA,GAAwBA,mBAAAA;AAAA,IAC1B,CAAC,EAAA,KAAQ,WAAA,CAAY,UAAU,WAAA,CAAY,OAAA,CAAQ,EAAE,CAAA,GAAI,KAAA;AAAA,IAAQ;AAAC,GAAC;AAGvE,EAAA1C,kBAAU,MAAM;AACZ,IAAA,UAAA,CAAW,OAAA,GAAU,YAAA;AAAA,EACzB,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAAA,kBAAU,MAAM;AACZ,IAAA,cAAA,CAAe,OAAA,GAAU,gBAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAErB,EAAAA,kBAAU,MAAM;AACZ,IAAA,uBAAA,CAAwB,OAAA,GAAU,oBAAA;AAAA,EACtC,CAAA,EAAG,CAAC,oBAAoB,CAAC,CAAA;AAEzB,EAAAA,kBAAU,MAAM;AACZ,IAAA,WAAA,CAAY,OAAA,GAAU,iBAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAEtB,EAAAA,kBAAU,MAAM;AACZ,IAAA,WAAA,CAAY,UAAU,KAAA,CAAM,eAAA;AAAA,EAChC,CAAA,EAAG,CAAC,KAAA,CAAM,eAAe,CAAC,CAAA;AAE1B,EAAAA,kBAAU,MAAM;AACZ,IAAA,WAAA,CAAY,UAAU,KAAA,CAAM,eAAA;AAAA,EAChC,CAAA,EAAG,CAAC,KAAA,CAAM,eAAe,CAAC,CAAA;AAE1B,EAAA,MAAM,WAAA,GAAcC,eAAsB,iBAAiB,CAAA;AAC3D,EAAA,MAAM,cAAA,GAAiByC,oBAA2B,CAAC,CAAA,KAAM,YAAY,OAAA,CAAQ,CAAC,CAAA,EAAG,EAAE,CAAA;AAEnF,EAAA,MAAM,aAAA,GAAgBjD,0BAAAA,CAAM,WAAA,CAAY,CAAC,CAAA,KAAa,WAAW,OAAA,GAAU,CAAC,CAAA,EAAG,EAAE,CAAA;AACjF,EAAA,MAAM,0BAAA,GAA6BA,0BAAAA,CAAM,WAAA,CAAY,CAAC,CAAA,KAAqB,wBAAwB,OAAA,GAAU,CAAC,CAAA,EAAG,EAAE,CAAA;AAEnH,EAAA,MAAM,EAAC,mBAAA,EAAAoC,oBAAAA,EAAqB,mBAAA,EAAAc,oBAAAA,EAAqB,yBAAAC,wBAAAA,EAAyB,uBAAA,EAAAC,wBAAAA,EAAuB,GAC7F,kBAAA,EAAmB;AACvB,EAAA,MAAM,gBAAgBhB,oBAAAA,EAAoB;AAC1C,EAAA,MAAM,mBAAmBc,oBAAAA,EAAoB;AAC7C,EAAA,MAAM,uBAAuBC,wBAAAA,EAAwB;AAErD,EAAA,MAAM,uBAAA,GAAA,CAA2B,QAAQ,gBAAA,IAAoB,eAAA;AAE7D,EAAA,MAAM,aAAA,GAAgB3C,eAAO,UAAU,CAAA;AACvC,EAAA,MAAM,YAAA,GAAeA,eAAO,SAAS,CAAA;AACrC,EAAA,MAAM,YAAA,GAAeA,eAAO,uBAAuB,CAAA;AACnD,EAAA,MAAM,aAAA,GAAgBA,eAAO,UAAU,CAAA;AACvC,EAAA,MAAM,OAAA,GAAUA,eAAO,IAAI,CAAA;AAE3B,EAAAD,kBAAU,MAAM;AACZ,IAAA,aAAA,CAAc,OAAA,GAAU,UAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AACf,EAAAA,kBAAU,MAAM;AACZ,IAAA,YAAA,CAAa,OAAA,GAAU,SAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AACd,EAAAA,kBAAU,MAAM;AACZ,IAAA,YAAA,CAAa,OAAA,GAAU,uBAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,uBAAuB,CAAC,CAAA;AAC5B,EAAAA,kBAAU,MAAM;AACZ,IAAA,aAAA,CAAc,OAAA,GAAU,UAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AACf,EAAAA,kBAAU,MAAM;AACZ,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAAA,EACtB,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAAA,kBAAU,MAAM;AACZ,IAAA,IAAI,CAAC,aAAA,EAAe;AAChB,MAAA,oBAAA,CAAqB,IAAI,CAAA;AAAA,IAC7B;AAAA,EACJ,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAAA,kBAAU,MAAM;AACZ,IAAA,OAAA,CAAQ,KAAA,GAAQ,CAAA;AAAA,EACpB,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,wBAAwB8C,wBAAA,EAAoC;AAClE,EAAA,MAAM,sBAAsBA,wBAAA,EAAoC;AAEhE,EAAA,MAAM,YAAA,GAAe7C,eAAuB,IAAI,CAAA;AAChD,EAAA,MAAM,kBAAA,GAAqBA,cAAAA,CAAmB,EAAE,CAAA;AAChD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIF,iBAAwB,IAAI,CAAA;AAExD,EAAA,MAAM,OAAA,GAAUE,eAAO,IAAI,CAAA;AAE3B,EAAA,MAAM,eAAA,GAAkB8C,yBAAe,CAAC,CAAA;AACxC,EAAA,MAAM,WAAA,GAAcA,yBAAe,CAAC,CAAA;AAEpC,EAAA,MAAM,OAAA,GAAUA,yBAAe,CAAC,CAAA;AAChC,EAAA,MAAM,OAAA,GAAUA,yBAAe,CAAC,CAAA;AAChC,EAAA,MAAM,SAAA,GAAYA,yBAAe,KAAK,CAAA;AACtC,EAAA,MAAM,UAAA,GAAaA,yBAAe,KAAK,CAAA;AAEvC,EAAA,MAAM,OAAA,GAAUA,yBAAe,CAAC,CAAA;AAChC,EAAA,MAAM,OAAA,GAAUA,yBAAe,CAAC,CAAA;AAChC,EAAA,MAAM,eAAA,GAAkBA,yBAAe,CAAC,CAAA;AACxC,EAAA,MAAM,gBAAA,GAAmBA,yBAAe,CAAC,CAAA;AACzC,EAAA,MAAM,iBAAA,GAAoBA,yBAAe,CAAC,CAAA;AAC1C,EAAA,MAAM,eAAA,GAAkBA,yBAAe,CAAC,CAAA;AAExC,EAAA,MAAM,QAAA,GAAWA,yBAAe,CAAC,CAAA;AACjC,EAAA,MAAM,QAAA,GAAWA,yBAAe,CAAC,CAAA;AACjC,EAAA,MAAM,MAAA,GAASA,yBAAe,CAAC,CAAA;AAE/B,EAAA,MAAM,aAAA,GAAgBL,oBAAY,MAAM;AACpC,IAAQM,kBAAA,CAAA,WAAA,CAAoBA,uCAAoB,KAAK,CAAA;AAAA,EACzD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAchC,gBAAQ,MAAM;AAC9B,IAAA,MAAM,MAAM,SAAA,EAAW,GAAA,CAAI,UAAQ,IAAA,EAAM,EAAE,KAAK,EAAC;AACjD,IAAA,IAAI,IAAA,CAAK,UAAU,kBAAA,CAAmB,OAAO,MAAM,IAAA,CAAK,SAAA,CAAU,GAAG,CAAA,EAAG;AACpE,MAAA,kBAAA,CAAmB,OAAA,GAAU,GAAA;AAAA,IACjC;AACA,IAAA,OAAO,kBAAA,CAAmB,OAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,MAAM,eAAevB,0BAAAA,CAAM,WAAA,CAAY,CACnC,QAAA,EACA,aACA,MAAA,KACC;AAED,IAAA,MAAMwD,cAAa,IAAA,KAAS,KAAA;AAC5B,IAAA,MAAM,gBAAA,GAAmB,CAACA,WAAAA,GACpB,WAAA,CAAY,QAAQ,CAAA,GACnB,gBAAA,IAAoB,YAAY,CAAC,CAAA;AAExC,IAAA,MAAM,UAAA,GAAa1D,eAAO,CAAC0D,WAAAA,GACrB,OACA,IAAA,CAAK,QAAQ,GAAG,YAAY,CAAA;AAElC,IAAA,oBAAA,CAAqB;AAAA,MACjB,KAAA,EAAO,aAAA;AAAA;AAAA,MACP,IAAA,EAAM,iBAAA,CAAkB,WAAA,EAAa,UAAU,CAAA;AAAA,MAC/C,EAAA,EAAI,iBAAA,CAAkB,WAAA,GAAc,MAAA,EAAQ,UAAU,CAAA;AAAA,MACtD,UAAA,EAAY,gBAAA;AAAA,MACZ,IAAA,EAAM;AAAA,KACT,CAAA;AAAA,EACL,CAAA,EAAG,CAAC,IAAA,EAAM,WAAA,EAAa,kBAAkB,aAAA,EAAe,UAAA,EAAY,oBAAA,EAAsB,IAAI,CAAC,CAAA;AAE/F,EAAA,MAAM,OAAA,GAAoBjC,gBAAQ,MAAM;AACpC,IAAA,IAAI,CAAC,UAAA,EAAY;AAEb,MAAA,OAAO,YAAY,GAAA,CAAI,CAAA,UAAA,MAAe,EAAC,IAAA,EAAM,UAAA,EAAY,YAAU,CAAE,CAAA;AAAA,IACzE;AAEA,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,OAAA,EAAS,QAAA,MAAc,EAAC,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,OAAA,EAAO,CAAE,CAAA;AAAA,EAC7E,CAAA,EAAG,CAAC,UAAA,EAAY,WAAA,EAAa,IAAI,CAAC,CAAA;AAElC,EAAA,MAAM,aAAaC,iCAAAA,CAAQ,GAAA,GACtB,gBAAA,CAAiB,CAAC,KAAK,CAAA,CACvB,OAAA,CAAQ,MAAA,KAAW,IAAI,EACvB,uBAAA,CAAwB,KAAK,EAC7B,aAAA,CAAc,CAAC,MAAM,YAAA,KAAiB;AACnC,IAAA,SAAA;AACA,IAAA,IAAI,KAAA,EAAO;AACX,IAAA,IAAI,aAAA;AACA,MAAA,YAAA,CAAa,QAAA,EAAS;AAAA,sBACR,GAAA,EAAI;AAAA,EAC1B,CAAC,CAAA,CACA,QAAA,CAAS,CAAC,GAAA,KAAQ;AACf,IAAA,SAAA;AAEA,IAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,KAAK,IAAA,IAAQ,GAAA,CAAI,KAAK,IAAA,EAAM;AAC5C,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,QAAA,GAAW,KAAA;AAEf,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,KAAA,GAAQ,WAAA,CAAY,KAAA,GAAQ,CAAA;AAC1D,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,KAAA,GAAQ,WAAA,CAAY,KAAA,GAAQ,CAAA,IAAK,WAAA,CAAY,KAAA,IAAS,YAAA,GAAe,CAAA,GAAI,CAAA,GAAI,YAAA,GAAe,YAAA,GAAe,CAAA,CAAA;AACzI,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,KAAA,GAAQ,WAAA,CAAY,KAAA,GAAQ,CAAA;AAEzD,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,GAAQ,uBAAA,GAA0B,CAAA;AAC5D,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,GAAQ,uBAAA,GAA0B,CAAA;AAE5D,IAAA,MAAA,CAAO,QAAQ,GAAA,CAAI,CAAA;AAEnB,IAAA,IAAI,GAAA,CAAI,CAAA,IAAK,SAAA,IAAa,GAAA,CAAI,KAAK,SAAA,EAAW;AAC1C,MAAA,SAAA,GAAY,GAAA,CAAI,CAAA,IAAK,aAAA,IAAiB,GAAA,CAAI,CAAA,IAAK,aAAA;AAC/C,MAAA,QAAA,GAAW,IAAI,CAAA,GAAI,aAAA,IAAiB,GAAA,CAAI,CAAA,IAAK,eAAe,YAAA,GAAe,CAAA;AAAA,IAC/E;AAEA,IAAA,IAAK,QAAA,IAAY,CAAC,UAAA,CAAW,KAAA,IAAU,UAAU,KAAA,EAAO;AACpD,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,KAAA,GAAQ,OAAA,CAAQ,KAAA;AACpD,MAAA,MAAM,SAAA,GAAY,IAAI,CAAA,GAAI,WAAA;AAC1B,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,YAAY,CAAA,GAAI,YAAA;AAC7D,MAAA,IAAI,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,UAAA,GAAa,GAAG,aAAa,CAAA;AAExD,MAAA,MAAM,iBAAiB,EAAA,GAAK,UAAA;AAC5B,MAAA,MAAM,gBAAA,GAAmB,iBAAiB,eAAA,CAAgB,KAAA;AAC1D,MAAA,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,gBAAgB,CAAA;AAEpD,MAAA,IAAI,WAAA,KAAgB,YAAY,KAAA,EAAO;AACnC,QAAA,WAAA,CAAY,KAAA,GAAQ,WAAA;AACpB,QAAA,OAAA,CAAQ,KAAA,GAAQ,cAAe,WAAA,GAAc,CAAA;AAC7C,QAAAC,iBAAAA,CAAQ,aAAa,CAAA,EAAE;AAAA,MAC3B;AAEA,MAAA,IAAI,MAAA,EAAQ;AACR,QAAA,MAAM,kBAAA,GAAqB,EAAA;AAE3B,QAAA,IAAI,GAAA,CAAI,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,kBAAA,EAAoB;AAC5C,UAAA,eAAA,CAAgB,KAAA,GAAQ,CAAA;AAAA,QAC5B,WAAW,GAAA,CAAI,CAAA,GAAI,kBAAA,IAAsB,SAAA,GAAY,aAAa,CAAA,EAAG;AACjE,UAAA,eAAA,CAAgB,KAAA,GAAQ,EAAA;AAAA,QAC5B,CAAA,MAAO;AACH,UAAA,eAAA,CAAgB,KAAA,GAAQ,CAAA;AAAA,QAC5B;AAAA,MACJ,CAAA,MAAO;AACH,QAAA,eAAA,CAAgB,KAAA,GAAQ,CAAA;AAAA,MAC5B;AAAA,IACJ;AAEA,IAAA,IAAK,SAAA,IAAa,CAAC,SAAA,CAAU,KAAA,IAAU,WAAW,KAAA,EAAO;AACrD,MAAA,UAAA,CAAW,KAAA,GAAQ,IAAA;AAEnB,MAAA,MAAM,cAAc,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,YAAA,GAAe,YAAY,CAAA,GAAI,YAAA;AAElE,MAAA,MAAM,sBAAuB,QAAA,CAAS,KAAA,GAAS,YAAY,KAAA,GAAQ,CAAA,GAAM,cAAc,OAAA,CAAQ,KAAA;AAE/F,MAAA,IAAI,kBAAA,GAAqB,IAAA,CAAK,KAAA,CAAM,mBAAA,GAAsB,YAAY,CAAA,GAAI,YAAA;AAE1E,MAAA,kBAAA,GAAqB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,kBAAkB,CAAA;AAEnD,MAAA,IAAI,MAAA,EAAQ;AAER,QAAA,MAAM,cAAA,GAAkB,MAAA,CAAO,MAAA,GAAS,OAAA,CAAQ,KAAA,GAAS,YAAA;AACzD,QAAA,kBAAA,GAAqB,IAAA,CAAK,GAAA,CAAI,kBAAA,EAAoB,cAAc,CAAA;AAAA,MACpE;AAEA,MAAA,IAAI,kBAAA,KAAuB,gBAAgB,KAAA,EAAO;AAC9C,QAAAA,iBAAAA,CAAQ,aAAa,CAAA,EAAE;AACvB,QAAA,eAAA,CAAgB,KAAA,GAAQ,kBAAA;AAAA,MAC5B;AAEA,MAAA,OAAA,CAAQ,KAAA,GAAS,kBAAA,GAAqB,OAAA,CAAQ,KAAA,GAAU,YAAY,KAAA,GAAQ,CAAA;AAG5E,MAAA,IAAI,eAAe,IAAA,CAAK,GAAA;AAAA,QACnB,0BAA2B,CAAA,GAAI,gBAAA;AAAA,QAChC,QAAA,CAAS,QAAQ,GAAA,CAAI;AAAA,OACzB;AAEA,MAAA,IAAI,QAAQ,KAAA,EAAO;AACf,QAAA,YAAA,GAAe,IAAA,CAAK,GAAA;AAAA,UAChB,MAAA,CAAO,QAAS,uBAAA,GAA2B,CAAA;AAAA,UAC3C;AAAA,SACJ;AAAA,MACJ;AACA,MAAA,OAAA,CAAQ,KAAA,GAAQ,YAAA;AAGhB,MAAA,IAAI,MAAA,EAAQ;AACR,QAAA,MAAM,kBAAA,GAAqB,EAAA;AAE3B,QAAA,IAAI,GAAA,CAAI,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,kBAAA,EAAoB;AAC5C,UAAA,eAAA,CAAgB,KAAA,GAAQ,CAAA;AAAA,QAC5B,CAAA,MAAA,IAAW,GAAA,CAAI,CAAA,GAAI,kBAAA,EAAoB;AACnC,UAAA,eAAA,CAAgB,KAAA,GAAQ,EAAA;AAAA,QAC5B,CAAA,MAAO;AACH,UAAA,eAAA,CAAgB,KAAA,GAAQ,CAAA;AAAA,QAC5B;AAEA,QAAA,IAAI,OAAA,CAAQ,KAAA,IAAS,MAAA,CAAO,KAAA,GAAQ,0BAA0B,CAAA,EAAG;AAC7D,UAAA,gBAAA,CAAiB,KAAA,GAAQ,CAAA;AAAA,QAC7B,CAAA,MAAA,IAAW,OAAA,CAAQ,KAAA,IAAS,uBAAA,GAA0B,IAAI,gBAAA,EAAkB;AACxE,UAAA,gBAAA,CAAiB,KAAA,GAAQ,EAAA;AAAA,QAC7B,CAAA,MAAO;AACH,UAAA,gBAAA,CAAiB,KAAA,GAAQ,CAAA;AAAA,QAC7B;AAAA,MACJ,CAAA,MAAO;AACH,QAAA,eAAA,CAAgB,KAAA,GAAQ,CAAA;AACxB,QAAA,gBAAA,CAAiB,KAAA,GAAQ,CAAA;AAAA,MAC7B;AAAA,IACJ;AAAA,EACJ,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AACT,IAAA,SAAA;AAEA,IAAA,eAAA,CAAgB,KAAA,GAAQ,CAAA;AACxB,IAAA,gBAAA,CAAiB,KAAA,GAAQ,CAAA;AACzB,IAAA,eAAA,CAAgB,KAAA,GAAQ,CAAA;AAMxB,IAAA,MAAM,gBAAiB,OAAA,CAAQ,KAAA,GAAS,WAAA,CAAY,KAAA,GAAQ,IAAM,OAAA,CAAQ,KAAA;AAC1E,IAAA,IAAI,qBAAA,GAAwB,IAAA,CAAK,KAAA,CAAM,aAAA,GAAgB,YAAY,CAAA,GAAI,YAAA;AACvE,IAAA,qBAAA,GAAwB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,qBAAqB,CAAA;AACzD,IAAA,MAAM,cAAA,GAAkB,qBAAA,GAAwB,OAAA,CAAQ,KAAA,GAAU,YAAY,KAAA,GAAQ,CAAA;AAGtF,IAAA,MAAM,iBAAiB,OAAA,CAAQ,KAAA;AAC/B,IAAA,MAAM,SAAA,GAAY,iBAAiB,OAAA,CAAQ,KAAA;AAC3C,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAA,CAAO,SAAA,GAAY,oBAAoB,uBAAuB,CAAA;AACzF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,aAAA,EAAe,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAC,CAAA;AACxE,IAAA,MAAM,iBAAiB,gBAAA,GAAoB,QAAA,GAAW,uBAAA,GAA2B,OAAA,CAAQ,QAAS,uBAAA,GAA0B,CAAA;AAG5H,IAAA,OAAA,CAAQ,KAAA,GAAQgC,qBAAW,cAAc,CAAA;AACzC,IAAA,OAAA,CAAQ,KAAA,GAAQA,qBAAW,cAAc,CAAA;AAIzC,IAAA,IAAI,CAAC,UAAU,KAAA,EAAO;AAClB,MAAA,eAAA,CAAgB,KAAA,GAAQ,qBAAA;AAAA,IAC5B;AAGA,IAAA,QAAA,CAAS,KAAA,GAAQ,cAAA;AACjB,IAAA,QAAA,CAAS,KAAA,GAAQ,cAAA;AAEjB,IAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAClB,IAAA,UAAA,CAAW,KAAA,GAAQ,KAAA;AAEnB,IAAAhC,kBAAQ,YAAY,CAAA,CAAE,QAAA,EAAU,qBAAA,EAAuB,YAAY,KAAK,CAAA;AAAA,EAC5E,CAAC,CAAA;AAEL,EAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAAc;AAChC,IAAA,YAAA,CAAa,SAAS,cAAA,CAAe,EAAC,QAAQ,CAAA,EAAG,QAAA,EAAU,OAAM,CAAA;AAAA,EACrE,CAAA;AAGA,EAAAiC,0BAAA,CAAiB,CAAC,SAAA,KAAc;AAC5B,IAAA,IAAI,gBAAA,CAAiB,UAAU,CAAA,EAAG;AAC9B,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,MAAM,SAAA,CAAU,mBAAA;AACtB,IAAA,MAAM,cAAA,GAAiB,GAAA;AAGvB,IAAA,IAAI,GAAA,GAAM,eAAA,CAAgB,KAAA,GAAQ,cAAA,EAAgB;AAC9C,MAAA,eAAA,CAAgB,KAAA,GAAQ,GAAA;AAGxB,MAAA,MAAM,SAAA,GAAY,uBAAA,GAA0B,IAAA,CAAK,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAC5E,MAAA,MAAM,UAAA,GAAa,QAAQ,KAAA,GAAQ,SAAA;AAGnC,MAAAjC,iBAAAA,CAAQ,YAAY,CAAA,CAAE,UAAU,CAAA;AAEhC,MAAAA,iBAAAA,CAAgB8B,kBAAA,CAAA,WAAW,CAAA,CAAUA,kBAAA,CAAA,mBAAA,CAAoB,MAAM,CAAA;AAAA,IACnE;AAAA,EACJ,CAAC,CAAA;AAED,EAAAG,0BAAA,CAAiB,MAAM;AAEnB,IAAA,IAAI,eAAA,CAAgB,UAAU,CAAA,EAAG;AAC7B,MAAA;AAAA,IACJ;AAGA,IAAA,MAAM,YAAa,YAAA,GAAe,CAAA,GAAK,IAAA,CAAK,IAAA,CAAK,gBAAgB,KAAK,CAAA;AACtE,IAAA,MAAM,UAAA,GAAa,QAAQ,KAAA,GAAQ,SAAA;AAGnC,IAAAC,kBAAA,CAAS,qBAAA,EAAuB,CAAA,EAAG,UAAA,EAAY,KAAK,CAAA;AAGpD,IAAA,IAAI,WAAW,KAAA,EAAO;AAClB,MAAA,IAAI,eAAA,GAAmB,OAAA,CAAQ,KAAA,GAAS,WAAA,CAAY,QAAQ,CAAA,GAAM,UAAA;AAClE,MAAA,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,eAAA,GAAkB,YAAY,CAAA,GAAI,YAAA;AAE/D,MAAA,eAAA,CAAgB,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,eAAe,CAAA;AAAA,IACvD;AAEA,IAAA,IAAI,UAAU,KAAA,EAAO;AAEjB,MAAA,MAAM,WAAA,GAAc,gBAAgB,KAAA,GAAQ,UAAA;AAC5C,MAAA,MAAM,SAAA,GAAY,OAAO,KAAA,GAAQ,WAAA;AACjC,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,YAAY,CAAA,GAAI,YAAA;AAE7D,MAAA,IAAI,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,UAAA,GAAa,GAAG,aAAa,CAAA;AACxD,MAAA,MAAM,iBAAiB,EAAA,GAAK,UAAA;AAC5B,MAAA,MAAM,gBAAA,GAAmB,iBAAiB,eAAA,CAAgB,KAAA;AAC1D,MAAA,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,gBAAgB,CAAA;AAEpD,MAAA,IAAI,WAAA,KAAgB,YAAY,KAAA,EAAO;AACnC,QAAA,WAAA,CAAY,KAAA,GAAQ,WAAA;AACpB,QAAA,OAAA,CAAQ,KAAA,GAAQ,cAAe,WAAA,GAAc,CAAA;AAAA,MACjD;AAEA,MAAA,IAAI,UAAA,GAAa,KAAK,WAAA,EAAa;AAC/B,QAAA,eAAA,CAAgB,KAAA,GAAQ,CAAA;AAAA,MAC5B;AAAA,IACJ;AAGA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,UAAA,GAAa,kBAAkB,KAAK,CAAA;AAEhE,IAAA,IAAI,cAAc,YAAA,EAAc;AAE5B,MAAA,iBAAA,CAAkB,KAAA,GAAQ,UAAA;AAC1B,MAAAlC,iBAAAA,CAAgB8B,kBAAA,CAAA,WAAW,CAAA,CAAUA,kBAAA,CAAA,mBAAA,CAAoB,MAAM,CAAA;AAAA,IACnE;AAAA,EACJ,CAAC,CAAA;AAED,EAAAhD,kBAAU,MAAM;AACZ,IAAA,mBAAA,CAAoB,OAAA,GAAU,CAAC,KAAA,KAAiB;AAC5C,MAAA,cAAA,CAAe,UAAU,KAAK,CAAA;AAG9B,MAAA,MAAM,KAAK,aAAA,CAAc,OAAA;AACzB,MAAA,MAAM,QAAA,GAAW,aAAA,CAAc,KAAA,CAAM,IAAA,EAAM,EAAE,CAAA;AAC7C,MAAA,MAAM,OAAA,GAAU,MAAM,EAAA,GAAK,KAAA,CAAM,OAAO,KAAA,CAAM,EAAA,GAAK,OAAO,KAAA,CAAM,EAAA;AAChE,MAAA,MAAM,aAAA,GAAgB,aAAA,CAAc,OAAA,GAAU,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5D,MAAA,MAAM,WAAA,GAAe,QAAA,GAAW,OAAA,CAAQ,KAAA,GAAU,aAAA,GAAgB,CAAA;AAElE,MAAA,OAAA,CAAQ,KAAA,GAAQ,WAAA;AAChB,MAAA,QAAA,CAAS,KAAA,GAAQ,WAAA;AACjB,MAAA,eAAA,CAAgB,KAAA,GAAQ,QAAA;AAGxB,MAAA,MAAMqD,aAAY,YAAA,CAAa,OAAA;AAC/B,MAAA,MAAMC,QAAO,OAAA,CAAQ,OAAA;AACrB,MAAA,MAAMC,2BAA0B,YAAA,CAAa,OAAA;AAC7C,MAAA,MAAMN,cAAa,aAAA,CAAc,OAAA;AACjC,MAAA,MAAM,GAAA,GAAM,IAAA;AAEZ,MAAA,MAAM,mBAAA,GAAsB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,OAAO,OAAA,CAAQ,KAAA,GAAQ,GAAA,IAAOM,wBAAuB,CAAC,CAAA;AAEnG,MAAA,IAAI,gBAAA;AAEJ,MAAA,IAAI,CAACN,WAAAA,EAAY;AAEb,QAAA,gBAAA,GAAmB,oBAAA,CAAqB,MAAM,UAAA,EAAYI,UAAAA,EAAW,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,EAAE,CAAC,CAAA;AAAA,MACvF,CAAA,MAAO;AAEH,QAAA,gBAAA,GAAmB,eAAA,CAAgB,KAAA,CAAM,IAAA,EAAMC,KAAI,CAAA;AAAA,MACvD;AACA,MAAA,MAAM,eAAe,gBAAA,GAAmB,mBAAA;AAExC,MAAA,MAAM,2BAAA,GACF,gBAAA,GACAC,wBAAAA,GAA0B,CAAA,GAC1BA,wBAAAA,GAA0B,YAAA;AAE9B,MAAA,OAAA,CAAQ,KAAA,GAAQ,2BAAA;AAChB,MAAA,QAAA,CAAS,KAAA,GAAQ,2BAAA;AAGjB,MAAA,iBAAA,CAAkB,QAAQ,OAAA,CAAQ,KAAA;AAClC,MAAA,WAAA,CAAY,KAAA,GAAQ,aAAA;AACpB,MAAA,gBAAA,CAAiB,KAAK,CAAA;AACtB,MAAQP,kBAAA,CAAA,WAAA,CAAoBA,uCAAoB,MAAM,CAAA;AAAA,IAC1D,CAAA;AAAA,EACJ,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,yBAAA,GAA4BN,mBAAAA,CAAY,CAAC,CAAA,KAAa;AACxD,IAAA,mBAAA,CAAoB,UAAU,CAAC,CAAA;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,QAAA,GAAWA,mBAAAA,CAAY,CAAC,GAAA,KAA2B;AACrD,IAAA,SAAA,CAAU,GAAA,EAAK,aAAa,MAAM,CAAA;AAAA,EACtC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,wBAAwBc,kCAAA,CAAyB;AAAA,IACnD,QAAA,EAAU,CAAC,KAAA,KAAU;AACjB,MAAA,OAAA,CAAQ,KAAA,GAAQ,OAAO,aAAA,EAAe,CAAA;AAAA,IAC1C;AAAA,GACH,CAAA;AAED,EAAA,MAAM,yBAAyBA,kCAAA,CAAyB;AAAA,IACpD,QAAA,EAAU,CAAC,KAAA,KAAU;AACjB,MAAA,IAAI,CAAC,UAAA,EAAY;AACb,QAAA,MAAM,OAAA,GAAU,OAAO,aAAA,EAAe,CAAA;AAEtC,QAAAJ,kBAAA,CAAS,mBAAA,EAAqB,OAAA,EAAS,CAAA,EAAG,KAAK,CAAA;AAC/C,QAAA,OAAA,CAAQ,KAAA,GAAQ,OAAA;AAAA,MACpB;AAAA,IACJ;AAAA,GACH,CAAA;AAED,EAAA,MAAM,gBAAA,GAAmBV,mBAAAA,CAAY,CAAC,UAAA,EAAoB,IAAA,KAAiB;AACvE,IAAQM,kBAAA,CAAA,WAAA,CAAoBA,uCAAoB,MAAM,CAAA;AACtD,IAAA,MAAM,WAAW,SAAA,CAAU,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,UAAU,CAAA;AAExD,IAAA,IAAI,gBAAA;AACA,MAAA,gBAAA,CAAiB,QAAA,EAAW,IAAI,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EAClD,CAAA,EAAG,CAAC,SAAA,EAAW,gBAAgB,CAAC,CAAA;AAEhC,EAAAhD,kBAAU,MAAM;AACZ,IAAA,MAAM,0BAA0B,MAAM;AAClC,MAAA,IAAI,aAAA;AACA,QAAA,gBAAA,CAAiB,IAAI,CAAA;AAAA,IAC7B,CAAA;AAEA,IAAA,MAAM,YAAA,GAAeyD,sBAAA,CAAW,gBAAA,CAAiB,QAAA,EAAU,uBAAuB,CAAA;AAElF,IAAA,OAAO,MAAM;AACT,MAAA,YAAA,CAAa,MAAA,EAAO;AAAA,IACxB,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,gBAAA,EAAkB,aAAa,CAAC,CAAA;AAEpC,EAAAzD,kBAAU,MAAM;AACZ,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAAA,EACtB,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,aAAa0C,mBAAAA,CAAY,CAAC,EAAC,IAAA,EAAM,OAAK,KAAW;AAEnD,IAAA,MAAM,MAAM,CAAC,UAAA,GACP,IAAA,GACC,gBAAA,IAAoB,YAAY,CAAC,CAAA;AAExC,IAAA,MAAM,OAAA,GAAU,CAAC,UAAA,GACX,MAAA,GACC,IAAA,CAA0C,OAAA;AAEjD,IAAA,uBACIjD,2BAAA,aAAA,CAACC,gBAAAA,EAAA,EAAK,GAAA,EAAK,KAAA,EAAO,OAAO,EAAC,KAAA,EAAO,yBAAuB,EAAA,kBAEpDD,2BAAA,aAAA,CAACC,gBAAAA,EAAA,EAAK,KAAA,EAAOW,OAAAA,CAAO,iBAAA,EAAA,kBAChBZ,0BAAAA,CAAA,aAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACG,UAAA;AAAA,QACA,uBAAA;AAAA,QACA,gBAAA,EAAkB,CAAC,IAAA,KAAS,gBAAA,CAAiB,GAAA,EAAK,mBAAmB,OAAA,IAAW,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAC;AAAA;AAAA,KAC1G,kBACAA,0BAAAA,CAAA,aAAA;AAAA,MAAC,yBAAA;AAAA,MAAA;AAAA,QACG,EAAA,EAAI,GAAA;AAAA,QACJ,IAAA,EAAM,OAAA;AAAA,QACN,uBAAA;AAAA,QACA;AAAA;AAAA,KACJ,kBACAA,0BAAAA,CAAA,aAAA;AAAA,MAAC,sBAAA;AAAA,MAAA;AAAA,QACG,EAAA,EAAI,GAAA;AAAA,QACJ,IAAA,EAAM,OAAA;AAAA,QACN,uBAAA;AAAA,QACA,UAAA;AAAA,QACA,oBAAA,EAAsB;AAAA;AAAA,KAC1B,kBACAA,0BAAAA,CAAA,aAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACG,EAAA,EAAI,GAAA;AAAA,QACJ,IAAA,EAAM,OAAA;AAAA,QACN,iBAAA,EAAmB,uBAAA;AAAA,QACnB,UAAA;AAAA,QACA,OAAA,EAAS,aAAA;AAAA,QACT,WAAA,EAAa,yBAAA;AAAA,QACb,eAAA,EAAiB,qBAAA;AAAA,QACjB,eAAA,EAAiB,qBAAA;AAAA,QACjB,aAAA,EAAe,cAAA;AAAA,QACf,IAAA,EAAM;AAAA;AAAA,KAEd,CACJ,CAAA;AAAA,EAER,CAAA,EAAG;AAAA,IACC,UAAA;AAAA,IACA,gBAAA;AAAA,IACA,WAAA;AAAA,IACA,uBAAA;AAAA,IACA,UAAA;AAAA,IACA,cAAA;AAAA,IACA,qBAAA;AAAA,IACA,qBAAA;AAAA,IACA,qBAAA;AAAA,IACA,aAAA;AAAA,IACA,yBAAA;AAAA,IACA,0BAAA;AAAA,IACA;AAAA,GACH,CAAA;AAED,EAAA,uBAAOA,0BAAAA,CAAA,aAAA,CAAAA,0BAAAA,CAAA,gCACHA,0BAAAA,CAAA,aAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAsB,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU,MAAK,CAAA,kBAClEA,0BAAAA,CAAA,aAAA,CAACC,gBAAAA,EAAA,EAAK,KAAA,EAAO,EAAC,MAAM,CAAA,EAAC,EAAA,EAEb,CAAC,UAAA,mBAAaD,0BAAAA,CAAA,aAAA,CAACC,gBAAAA,EAAA,IAAA,kBACPD,0BAAAA,CAAA,aAAA;AAAA,IAACsC,0BAAAA,CAAS,UAAA;AAAA,IAAT;AAAA,MACG,KAAA,EAAO,EAAC,eAAA,EAAiB,OAAA,EAAO;AAAA,MAChC,8BAAA,EAAgC,KAAA;AAAA,MAChC,qBAAA,EAAuB;AAAA,QACnB,QAAA,EAAU,SAAA;AAAA,QACV,WAAA,EAAa,gBAAA;AAAA,QACb,eAAA,EAAiB;AAAA,OACrB;AAAA,MACA,UAAA,EAAU,IAAA;AAAA,MACV,mBAAA,EAAqB,EAAA;AAAA,MACrB,gBAAA,EAAiB,MAAA;AAAA,MACjB,GAAA,EAAK,mBAAA;AAAA,MACL,aAAA,EAAe;AAAA,KAAA;AAAA,oBAEftC,0BAAAA,CAAA,aAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACG,IAAA;AAAA,QACA,WAAA;AAAA,QACA,uBAAA;AAAA,QACA;AAAA;AAAA;AACJ,GAER,CAAA,mBACEA,0BAAAA,CAAA,aAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,uBAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA;AAAA,MACA,gBAAA,EAAkB,gBAAA,IAAoB,WAAA,CAAY,CAAC,CAAA;AAAA,MACnD;AAAA;AAAA,GACJ,kBAERA,0BAAAA,CAAA,aAAA,CAAC0B,2CAAA,EAAgB,OAAA,EAAS,UAAA,EAAA,kBACtB1B,0BAAAA,CAAA,aAAA;AAAA,IAACsC,0BAAAA,CAAS,IAAA;AAAA,IAAT;AAAA,MACG,GAAA,EAAK,kBAAkB,KAAA,GAAQ,UAAA;AAAA,MAC/B,QAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACH,IAAA,EAAM,CAAA;AAAA,QACN,QAAA,EAAU;AAAA;AACd,KAAA;AAAA,IAEC,iCAAiBtC,0BAAAA,CAAA,aAAA,CAACC,gBAAAA,EAAA,EAAK,KAAA,EAAO;AAAA,MAC3B,QAAA,EAAU,UAAA;AAAA,MACV,GAAA,EAAK,CAAA;AAAA,MACL,IAAA,EAAM,gBAAA;AAAA,MACN,WAAA,EAAa,gBAAA;AAAA,MACb,OAAO,KAAA,GAAQ,gBAAA;AAAA,MACf,MAAA,EAAQ,MAAA;AAAA,MACR,eAAA,EAAiB,oBAAA;AAAA,MACjB,MAAA,EAAQ;AAAA,KACZ,EAAE,CAAA;AAAA,oBACFD,0BAAAA,CAAA,aAAA;AAAA,MAACsC,0BAAAA,CAAS,UAAA;AAAA,MAAT;AAAA,QACG,eAAe,CAAC,aAAA;AAAA,QAChB,QAAA,EAAU,qBAAA;AAAA,QACV,GAAA,EAAK,qBAAA;AAAA,QACL,mBAAA,EAAqB,EAAA;AAAA,QACrB,cAAA,EAAgB,UAAA;AAAA,QAChB,gBAAA,EAAiB,MAAA;AAAA,QACjB,eAAA,EAAgB,OAAA;AAAA,QAChB,OAAO1B,OAAAA,CAAO,SAAA;AAAA,QACd,qBAAA,EAAuB,EAAC,aAAA,EAAe,KAAA,EAAO,cAAc,gBAAA;AAAgB,OAAA;AAAA,sBAE5EZ,0BAAAA,CAAA,aAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACG,YAAA;AAAA,UACA,MAAA;AAAA,UACA,UAAA;AAAA,UACA,oBAAoB,uBAAA,GAA0B,eAAA;AAAA,UAC9C,QAAA;AAAA,UACA,IAAA;AAAA,UACA,GAAA,EAAK;AAAA;AAAA,OACT;AAAA,sBACAA,0BAAAA,CAAA,aAAA;AAAA,QAAC,iBAAA;AAAA,QAAA;AAAA,UACG,WAAW,eAAA,GAAkB,KAAA,GAAQ,UAAA,IAAc,qBAAA,KAA0B,YAAY,CAAA,GAAI,CAAA,CAAA;AAAA,UAC7F,eAAe,CAAC,aAAA;AAAA,UAChB,GAAA,EAAK,YAAA;AAAA,UACL,QAAA,EAAU,sBAAA;AAAA,UACV,iBAAA,EAAmB,uBAAA;AAAA,UACnB,qBAAA,EAAuB,IAAA;AAAA,UACvB,IAAA,EAAM,CAAC,UAAA,GAAa,WAAA,GAAc,OAAA;AAAA,UAClC,UAAA,EAAY,IAAA;AAAA,UACZ,UAAA;AAAA,UACA,YAAA,EAAc,CAAC,IAAA,EAAM,KAAA,KAAU,KAAA,GAAQ,EAAA;AAAA,UACvC,cAAA,EAAgB,uBAAA;AAAA,UAChB,gBAAA,EAAiB,MAAA;AAAA,UACjB,eAAA,EAAgB;AAAA;AAAA;AACpB,KACJ;AAAA,IAEI,aAAA,oBACAA,0BAAAA,CAAA,aAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACG,aAAA;AAAA,QACA,uBAAA;AAAA,QACA,UAAA;AAAA,QACA,eAAA;AAAA,QACA,WAAA;AAAA,QACA,OAAA;AAAA,QACA,OAAA;AAAA,QACA,OAAO,KAAA,CAAM,UAAA;AAAA,QACb,gBAAgB,KAAA,CAAM;AAAA;AAAA;AAC1B,GAGZ,CACJ,CACJ,CAAA;AACJ,CAAA;AAEA,IAAM,WAAoC,CAAC,EAAC,KAAA,EAAO,GAAG,MAAI,KAAM;AAC5D,EAAA,uBACIA,0BAAAA,CAAA,aAAA,CAAC,qBAAA,EAAA,EAAsB,KAAA,EAAA,kBACnBA,0BAAAA,CAAA,aAAA,CAAC,aAAA,EAAA,EAAe,GAAG,IAAA,EAAM,CAC7B,CAAA;AAER,CAAA;AAEA,IAAMY,OAAAA,GAASD,uBAAW,MAAA,CAAO;AAAA,EAC7B,SAAA,EAAW;AAAA,IACP,IAAA,EAAM,CAAA;AAAA,IACN,eAAA,EAAiB;AAAA,GACrB;AAAA,EACA,iBAAA,EAAmB;AAAA,IACf,WAAA,EAAa,MAAA;AAAA,IACb,gBAAA,EAAkB,CAAA;AAAA,IAClB,QAAA,EAAU,UAAA;AAAA,IACV,MAAA,EAAQ;AAAA;AAEhB,CAAC,CAAA;AAED,IAAO,gBAAA,GAAQ","file":"index.js","sourcesContent":["// Function to group events into clusters based on overlap\nimport {toZonedTime} from \"date-fns-tz\";\nimport {format, getHours, getMinutes, set, setHours, setMinutes, setSeconds} from \"date-fns\";\nimport {DisabledBlock, Event, LayoutMode} from \"@/types/calendarTypes\";\n\nexport const TIME_LABEL_WIDTH = 50;\nconst groupEventsByOverlap = (events: ReadonlyArray<Event>): Event[][] => {\n return events.reduce((clusters: Event[][], appointment) => {\n const cluster = clusters.find((c) => c.some((e) => isOverlapping(e, appointment)));\n if (cluster) {\n cluster.push(appointment);\n } else {\n clusters.push([appointment]);\n }\n return clusters;\n }, []);\n};\n\nexport function computeDisabledBlockColumns(\n disabledBlocks: ReadonlyArray<DisabledBlock>,\n): Map<number, TimeOffLayout> {\n const groups = groupDisabledBlocksByOverlap(disabledBlocks);\n const res = new Map<number, TimeOffLayout>();\n\n for (const group of groups) {\n // Greedy interval partitioning → columns\n const byStart = [...group].sort((a, b) => a.from - b.from);\n const columns: DisabledBlock[][] = [];\n\n for (const evt of byStart) {\n let placed = false;\n for (const col of columns) {\n const last = col[col.length - 1];\n if (!isOverlappingDisabledBlock(last, evt)) {\n col.push(evt);\n placed = true;\n break;\n }\n }\n if (!placed) columns.push([evt]);\n }\n\n // Column index for each event\n const colIndexByEvent = new Map<DisabledBlock, number>();\n columns.forEach((col, idx) => col.forEach(e => colIndexByEvent.set(e, idx)));\n\n const groupCols = columns.length;\n\n // Right-fill: expand into free consecutive columns to the RIGHT\n for (const evt of group) {\n const myCol = colIndexByEvent.get(evt)!;\n\n let span = 1;\n for (let c = myCol + 1; c < groupCols; c++) {\n const blocked = columns[c].some(e =>\n e !== evt && isOverlappingDisabledBlock(e, evt)\n );\n if (blocked) break;\n span++;\n }\n\n const key = evt.id;\n res.set(key, {\n leftIndex: myCol,\n renderColumnCount: groupCols,\n spanColumns: span,\n });\n }\n }\n\n return res;\n}\n\nexport const groupDisabledBlocksByOverlap = (disabledBlocks: ReadonlyArray<DisabledBlock>): DisabledBlock[][] => {\n return disabledBlocks.reduce((clusters: any[][], disabledBlock) => {\n const cluster = clusters.find((c) => c.some((e) => isOverlappingDisabledBlock(e, disabledBlock)));\n if (cluster) {\n cluster.push(disabledBlock);\n } else {\n clusters.push([disabledBlock]);\n }\n return clusters;\n }, []);\n}\n\nconst isOverlappingDisabledBlock = (disabledBlockA: DisabledBlock, disabledBlockB: DisabledBlock): boolean => {\n return !(disabledBlockA.to <= disabledBlockB.from || disabledBlockA.from >= disabledBlockB.to); // If there's no gap, they overlap\n}\n\nexport function computeEventColumns(\n events: ReadonlyArray<Event>,\n): Map<number, ColumnsLayout> {\n const groups = groupEventsByOverlap(events);\n const out = new Map<number, ColumnsLayout>();\n\n for (const group of groups) {\n const byStart = [...group].sort(\n (a, b) => a.from - b.from\n );\n\n // Greedy interval partitioning -> columns\n const columns: Event[][] = [];\n for (const evt of byStart) {\n let placed = false;\n for (const col of columns) {\n const last = col[col.length - 1];\n if (!isOverlapping(last, evt)) {\n col.push(evt);\n placed = true;\n break;\n }\n }\n if (!placed) columns.push([evt]);\n }\n\n const colIndex = new Map<Event, number>();\n columns.forEach((col, i) => col.forEach(e => colIndex.set(e, i)));\n\n const groupCols = columns.length;\n\n for (const evt of group) {\n const myCol = colIndex.get(evt)!;\n\n // How far can I expand to the RIGHT without hitting a column that overlaps me?\n let span = 1; // at least my own column\n for (let c = myCol + 1; c < groupCols; c++) {\n const blocked = columns[c].some(e =>\n // exclude self; block if ANY event in col c overlaps me\n (e !== evt && e.id !== evt.id && isOverlapping(e, evt))\n );\n if (blocked) break;\n span++;\n }\n\n out.set(evt.id!, {\n leftIndex: myCol,\n renderColumnCount: groupCols,\n spanColumns: span,\n });\n }\n }\n\n return out;\n}\n\nexport type TimeOffLayout = {\n leftIndex: number; // starting column (0-based)\n renderColumnCount: number; // total columns in this overlap group\n spanColumns: number; // how many columns this block can occupy (right-fill)\n};\n\n\nexport const getTextSize = (size: number) => {\n switch (size) {\n case 60:\n return 10;\n case 80:\n return 12;\n case 100:\n return 12;\n default:\n return 12;\n }\n}\n\nconst MINUTES_IN_DAY = 1440;\n\n// Normalize ONLY when the interval truly wraps overnight.\n// Keep half-open semantics: [start, end)\nconst normalizeOvernight = (startMin: number, endMin: number) => {\n if (endMin < startMin) endMin += MINUTES_IN_DAY; // wrap to next day\n return {startMin, endMin};\n};\n\n// Half-open overlap test: [a1,a2) intersects [b1,b2) <=> max(a1,b1) < min(a2,b2)\nconst intersects = (A: { startMin: number; endMin: number }, B: { startMin: number; endMin: number }) =>\n Math.max(A.startMin, B.startMin) < Math.min(A.endMin, B.endMin);\n\nexport const isOverlapping = (\n eventA: Event,\n eventB: Event,\n): boolean => {\n // 0..1439 minutes\n const aStart0 = eventA.from;\n const aEnd0 = eventA.to;\n const bStart0 = eventB.from;\n const bEnd0 = eventB.to;\n\n // If either is zero-length, treat as non-blocking (never overlaps)\n if (aStart0 === aEnd0 || bStart0 === bEnd0) return false;\n\n // Normalize overnight intervals\n const A = normalizeOvernight(aStart0, aEnd0);\n const B = normalizeOvernight(bStart0, bEnd0);\n\n return intersects(A, B);\n};\n\n// Utility to get the current time in minutes since the start of the day\nexport const getCurrentTimeInMinutes = (timezone: string): number => {\n const now = toZonedTime(new Date(), timezone);\n const hours = getHours(now);\n const minutes = getMinutes(now);\n return hours * 60 + minutes;\n};\n\n// Convert time into Y-position\nexport const timeToYPosition = (minutes: number, TIME_LABEL_HEIGHT: number): number => minutes * (TIME_LABEL_HEIGHT / 60); // Scale factor of 1px per minute\n\nexport const scalePosition = (position: number, hourHeight: number) => {\n return position * (hourHeight / 60);\n}\n\nexport const positionToMinutes = (position: number, TIME_LABEL_HEIGHT: number): number => {\n 'worklet';\n return position / (TIME_LABEL_HEIGHT / 60);\n}\n\nexport const combineDateAndTime = (date: Date, time: string) => {\n // Parse the time string into hours, minutes, and seconds\n const [hours, minutes, seconds] = time.split(':').map(Number);\n\n // Set hours, minutes, and seconds on the date\n const combinedDate = setSeconds(setMinutes(setHours(date, hours), minutes), seconds);\n\n // Format the combined date as \"yyyy-MM-dd HH:mm:ss\"\n return format(combinedDate, 'yyyy-MM-dd HH:mm:ss');\n};\n\nexport const indexToDate = (index: number) => {\n // Set the date with a specific hour\n const dateWithHour = set(new Date(), {hours: index, minutes: 0, seconds: 0, milliseconds: 0});\n\n // Format the date in 'h:mm A' format\n return format(dateWithHour, 'h:mm a'); // 'a' is for AM/PM in lowercase\n};\n\nexport const minutesToTime = (totalMinutes: number): string => {\n 'worklet';\n\n const safeTotalMinutes = Math.max(0, Math.round(totalMinutes));\n const hours24 = Math.floor(safeTotalMinutes / 60);\n const minutes = safeTotalMinutes % 60;\n\n // Manually pad minutes with a leading zero if needed\n const paddedMins = minutes < 10 ? '0' + minutes : String(minutes);\n\n// Convert to 12-hour format without AM/PM\n const hours12 = hours24 % 12 || 12;\n\n// Return time in 'h:mm' format\n return `${hours12}:${paddedMins}`;\n};\n\nexport type StackedLayout = {\n // absolute pixel offsets to feed straight into your block\n leftPx: number;\n widthPx: number;\n zIndex: number; // draw later overlaps on top\n};\n\nexport function computeStackedEventLayout(\n events: ReadonlyArray<Event>,\n containerWidthPx: number,\n {\n indentPx = 6, // how much to nudge each overlap to the right\n rightPadPx = 0, // visual breathing room on the right\n minWidthPx = 25, // never let an event become thinner than this\n capIndentLevels = 4, // after N levels, stop indenting (just stack via z-index)\n }: {\n indentPx?: number;\n rightPadPx?: number;\n minWidthPx?: number;\n capIndentLevels?: number;\n } = {}\n): Map<number, StackedLayout> {\n // Group by mutual overlap first (same as your existing grouping)\n const groups = groupEventsByOverlap(events);\n\n const out = new Map<number, StackedLayout>();\n\n for (const group of groups) {\n // Sweep by start time\n const byStart = [...group].sort((a, b) => a.from - b.from);\n\n // Active overlap window (min-heap by end time would also work; here we keep a simple list)\n type Active = { e: Event; level: number; };\n const active: Active[] = [];\n\n // For quick removal\n const removeFinished = (currentFrom: number) => {\n for (let i = active.length - 1; i >= 0; i--) {\n if (!isOverlapping(active[i].e, {...active[i].e, from: currentFrom, to: currentFrom})) {\n // More robust: if (active[i].e.to <= currentFrom) active.splice(i,1)\n if (active[i].e.to <= currentFrom) active.splice(i, 1);\n }\n }\n };\n\n // Track which indent \"levels\" are free at any moment\n const findLowestFreeLevel = (): number => {\n // Gather occupied levels\n const used = new Set(active.map(a => a.level));\n let lvl = 0;\n while (used.has(lvl)) lvl++;\n return lvl;\n };\n\n for (const e of byStart) {\n // Drop anything that ended before this start\n removeFinished(e.from);\n\n // Assign the lowest available level in the *current* overlap window\n let level = findLowestFreeLevel();\n\n // Cap to avoid pushing too far right; after that we only change zIndex\n const visualLevel = Math.min(level, capIndentLevels);\n\n // Insert as active\n active.push({e, level});\n\n // Compute visual frame\n const leftPx = visualLevel * indentPx;\n // Width shrinks by how far we indented, but never below minWidth\n const available = containerWidthPx - leftPx - rightPadPx;\n const widthPx = Math.max(minWidthPx, available);\n\n // Draw later overlaps on top: z == start minute + level small bias\n const zIndex = 9999 + e.from * 10 + level; // stable tie-break\n\n out.set(e.id!, {leftPx, widthPx, zIndex});\n }\n }\n\n return out;\n}\n\nexport type ColumnsLayout = {\n leftIndex: number; // same as columnIndex (used for left offset)\n renderColumnCount: number; // total columns in this overlap group\n spanColumns: number; // how many columns I can occupy (right-fill)\n};\n\nexport function columnsToPixels(\n columnMap: Map<number, ColumnsLayout>,\n containerWidthPx: number,\n {\n gutterPx = 2, // spacing between columns\n padLeftPx = 0,\n padRightPx = 0,\n }: { gutterPx?: number; padLeftPx?: number; padRightPx?: number } = {}\n): Map<number, EventFrame> {\n const out = new Map<number, EventFrame>();\n\n for (const [id, c] of columnMap) {\n const totalGutters = (c.renderColumnCount - 1) * gutterPx;\n const innerWidth = containerWidthPx - padLeftPx - padRightPx - totalGutters;\n const colWidth = innerWidth / c.renderColumnCount;\n\n const left =\n padLeftPx + c.leftIndex * (colWidth + gutterPx);\n\n const width =\n colWidth * c.spanColumns + gutterPx * (c.spanColumns - 1);\n\n out.set(id, {\n leftPx: left,\n widthPx: Math.max(0, width),\n // later columns on top slightly, but mostly rely on time-based z\n zIndex: 1000 + c.leftIndex,\n });\n }\n\n return out;\n}\n\nexport type EventFrame = {\n leftPx: number;\n widthPx: number;\n zIndex: number;\n};\n\n\nexport function computeEventFrames(\n events: ReadonlyArray<Event>,\n containerWidthPx: number,\n mode: LayoutMode,\n options?: {\n // columns\n gutterPx?: number; padLeftPx?: number; padRightPx?: number;\n // stacked\n indentPx?: number; rightPadPx?: number; minWidthPx?: number; capIndentLevels?: number;\n }\n): Map<number, EventFrame> {\n if (mode === \"columns\") {\n const columnLayouts = computeEventColumns(events); // your existing function\n return columnsToPixels(columnLayouts, containerWidthPx, {\n gutterPx: options?.gutterPx,\n padLeftPx: options?.padLeftPx,\n padRightPx: options?.padRightPx,\n });\n } else {\n return computeStackedEventLayout(events, containerWidthPx, {\n indentPx: options?.indentPx,\n rightPadPx: options?.rightPadPx,\n minWidthPx: options?.minWidthPx,\n capIndentLevels: options?.capIndentLevels,\n });\n }\n}\n\nexport const findResourceIndexFor = (rid: number, resourceIds: number[]) =>\n Math.max(0, Math.min(resourceIds.length - 1,\n resourceIds.findIndex(id => id === rid)\n ));\n\nexport const findDayIndexFor = (date: string, days: Date[]) =>\n Math.max(0, Math.min(days.length - 1,\n days.findIndex(d => date === format(d, \"yyyy-MM-dd\"))\n ));\n","import React, {ReactNode} from \"react\";\nimport {View, ViewProps} from \"react-native\";\n\ninterface ColProps extends ViewProps {\n space?: number;\n divider?: ReactNode;\n}\n\nconst Col = ({children, divider, space, style}: ColProps) => {\n return (\n <View style={[{flexDirection: \"column\"}, style]}>\n {React.Children.toArray(children).map((child, index) => (\n <React.Fragment key={index}>\n {child}\n {index !== React.Children.toArray(children).length - 1 &&\n divider}\n {index !== React.Children.toArray(children).length - 1 &&\n <View style={{height: space, width: \"100%\"}}/>}\n </React.Fragment>\n ))}\n </View>\n );\n};\n\nexport default Col;\n","// theme/resolveFont.ts\nexport type FontWeightRN = '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900';\n\nexport type ResolveFontArgs = {\n family?: string;\n weight?: FontWeightRN;\n italic?: boolean;\n};\n\nconst WEIGHT_NAME_MAP: Record<FontWeightRN, string> = {\n '100': 'Thin',\n '200': 'ExtraLight',\n '300': 'Light',\n '400': 'Regular',\n '500': 'Medium',\n '600': 'SemiBold',\n '700': 'Bold',\n '800': 'ExtraBold',\n '900': 'Black',\n};\n\n/**\n * Builds Expo font key dynamically based on standard pattern\n * e.g. (\"Inter\", 700, true) => \"Inter_700Bold_Italic\"\n */\nexport function resolveFont({ family = 'System', weight = '400', italic = false }: ResolveFontArgs): string {\n // Ignore system fonts or arbitrary custom ones\n if (family === 'System' || family.includes('_')) return family;\n\n // Determine textual weight (Bold, Light, etc.)\n const weightName = WEIGHT_NAME_MAP[weight] ?? 'Regular';\n\n // Construct Expo font key: Inter_700Bold or Inter_700Bold_Italic\n const base = `${family}_${weight}${weightName}`;\n return italic ? `${base}_Italic` : base;\n}\n","// store/themeContext.ts\nimport React, {createContext, useContext} from 'react';\nimport {CalendarTheme} from \"@/types/calendarTypes\";\nimport {FontWeightRN, resolveFont} from \"@/theme/resolveFont\";\n\nconst defaultTheme: CalendarTheme = {\n typography: {\n fontFamily: 'System',\n },\n};\n\nconst ThemeCtx = createContext<CalendarTheme>(defaultTheme);\nexport const useCalendarTheme = () => useContext(ThemeCtx);\n\nexport const useResolvedFont = (overrides?: {\n fontFamily?: string;\n fontWeight?: FontWeightRN;\n italic?: boolean;\n}) => {\n const {typography} = useCalendarTheme(); // { fontFamily?, fontWeight? , italic? }\n const family = overrides?.fontFamily ?? typography?.fontFamily ?? 'System';\n const weight = overrides?.fontWeight ?? '400';\n const italic = overrides?.italic ?? false;\n\n return resolveFont({family, weight, italic});\n};\n\nexport const CalendarThemeProvider: React.FC<{\n theme?: CalendarTheme;\n children: React.ReactNode;\n}> = ({theme, children}) => {\n const mergedTheme = {\n ...defaultTheme,\n ...theme,\n typography: {...defaultTheme.typography, ...theme?.typography},\n };\n\n return <ThemeCtx.Provider value={mergedTheme}>{children}</ThemeCtx.Provider>;\n};\n","// @flow\nimport * as React from 'react';\nimport {useEffect, useRef, useState} from 'react';\nimport {InteractionManager, StyleSheet, Text, View} from \"react-native\";\nimport {\n getCurrentTimeInMinutes,\n getTextSize,\n indexToDate,\n TIME_LABEL_WIDTH,\n timeToYPosition\n} from \"@/utilities/helpers\";\nimport {format, isSameDay} from \"date-fns\";\nimport {toZonedTime} from \"date-fns-tz\";\nimport Col from './common/layout/Col';\nimport {useResolvedFont} from \"@/theme/ThemeContext\";\n\ntype Props = {\n timezone: string;\n layout: any;\n hourHeight?: number;\n startMinutes?: number;\n totalTimelineWidth: number;\n date: Date;\n};\nexport const TimeLabels = React.forwardRef(({\n timezone,\n hourHeight = 120,\n startMinutes = 0,\n totalTimelineWidth,\n date,\n layout\n }: Props, ref: any) => {\n // Check if the selected date is today\n const isToday = isSameDay(new Date(), date);\n // Function to update the current time's Y position\n // State to store the current Y-position of the red line\n const [currentTimeYPosition, setCurrentTimeYPosition] = useState(timeToYPosition(getCurrentTimeInMinutes(timezone), hourHeight));\n const [currentTime, setCurrentTime] = useState<string>(format(toZonedTime(new Date(), timezone), 'h:mm'));\n const APPOINTMENT_BLOCK_HEIGHT = hourHeight / 4;\n\n const updateCurrentTimeYPosition = () => {\n setCurrentTimeYPosition(timeToYPosition(getCurrentTimeInMinutes(timezone), hourHeight));\n };\n\n // Function to update the current time every minute\n const updateCurrentTime = () => {\n setCurrentTime(format(toZonedTime(new Date(), timezone), 'h:mm')); // Update the state with the new current time\n };\n\n const titleFace = useResolvedFont({fontWeight: '700'});\n\n useEffect(() => {\n const update = () => {\n updateCurrentTime();\n updateCurrentTimeYPosition();\n };\n\n update();\n const intervalId = setInterval(update, 300);\n\n return () => clearInterval(intervalId);\n }, [timezone]);\n\n const lastScrolledDateRef = useRef<any>(null); // store a key for the last date we scrolled to\n\n useEffect(() => {\n if (!layout) return;\n\n // If `date` is a Date object, use getTime() or toDateString()\n const dateKey = date.getTime();\n\n // If we already scrolled for this date, skip\n if (lastScrolledDateRef.current === dateKey) return;\n\n InteractionManager.runAfterInteractions(() => {\n let pos = isToday\n ? currentTimeYPosition - 240\n : timeToYPosition(startMinutes, hourHeight);\n\n if (ref.current) {\n ref.current.scrollTo({\n y: Math.round(pos / APPOINTMENT_BLOCK_HEIGHT) * APPOINTMENT_BLOCK_HEIGHT,\n animated: true,\n });\n\n // Remember that we've scrolled for this specific date\n lastScrolledDateRef.current = dateKey;\n }\n });\n }, [layout, date, isToday, APPOINTMENT_BLOCK_HEIGHT, startMinutes, hourHeight, currentTimeYPosition]);\n\n return (\n <>\n <Col>\n {/* Time labels */}\n {Array.from({length: 24}).map((_, index) => (\n <View key={index} style={[styles.timeLabel, {height: hourHeight}]}>\n <Text\n allowFontScaling={false}\n style={{\n textAlign: \"center\",\n fontFamily: titleFace,\n fontSize: getTextSize(hourHeight),\n fontWeight: '700'\n }}>\n {indexToDate(index).split(\" \")[0]}\n </Text>\n <Text\n allowFontScaling={false}\n style={{\n textAlign: \"center\",\n fontFamily: titleFace,\n fontSize: getTextSize(hourHeight),\n fontWeight: '700'\n }}>\n {indexToDate(index).split(\" \")[1]}\n </Text>\n </View>\n ))}\n {isToday && <View style={[styles.currentTime, {\n top: currentTimeYPosition - 13,\n width: TIME_LABEL_WIDTH,\n }]}>\n <Text\n allowFontScaling={false}\n style={{\n textAlign: \"center\",\n fontFamily: titleFace,\n fontWeight: '700',\n fontSize: getTextSize(hourHeight),\n color: \"red\"\n }}\n >{currentTime}</Text>\n </View>}\n </Col>\n {/* Render the red line for current time */}\n {isToday && <View style={[styles.currentTimeLine, {\n pointerEvents: \"none\",\n top: currentTimeYPosition,\n width: totalTimelineWidth,\n left: TIME_LABEL_WIDTH\n }]}/>}\n </>\n );\n});\n\nconst styles = StyleSheet.create({\n timeLabel: {\n width: TIME_LABEL_WIDTH,\n },\n currentTimeLine: {\n position: 'absolute',\n height: 2, // Thickness of the line\n backgroundColor: 'red',\n zIndex: 10000, // Ensure it's on top of all other elements\n },\n currentTime: {\n backgroundColor: '#fff',\n borderColor: \"red\",\n alignItems: \"center\",\n justifyContent: \"center\",\n borderWidth: 2,\n borderRadius: 20,\n height: 26,\n position: 'absolute',\n zIndex: 10000, // Ensure it's on top of all other elements\n },\n});","import React from \"react\";\nimport {PropsWithChildren} from \"react\";\n\ninterface HiddenProps {\n isHidden: boolean;\n}\n\nconst Hidden = ({isHidden, children}: PropsWithChildren<HiddenProps>) => {\n if (isHidden) {\n return null;\n }\n\n return (\n <>\n {children}\n </>\n );\n};\n\nexport default Hidden;\n","import React, {PropsWithChildren} from \"react\";\nimport {StyleProp, View, ViewStyle} from \"react-native\";\n\ninterface CenterProps {\n style?: StyleProp<ViewStyle>\n}\n\nconst Center = ({children, style}: PropsWithChildren<CenterProps>) => {\n return (\n <View style={[{\n justifyContent: \"center\",\n alignItems: \"center\",\n }, style]}\n >\n {children}\n </View>\n );\n};\n\nexport default Center;\n","import React, {PropsWithChildren} from 'react';\nimport {StyleProp, StyleSheet, Text, View, ViewStyle} from 'react-native';\nimport {useResolvedFont} from \"@/theme/ThemeContext\";\n\ntype BadgeProps = {\n value?: number | string;\n color?: string;\n textColor?: string;\n fontSize?: number;\n style?: StyleProp<ViewStyle>\n};\n\nconst Badge: React.FC<PropsWithChildren<BadgeProps>> = ({\n style,\n value = '',\n children,\n fontSize,\n color = 'red',\n textColor = 'white'\n }) => {\n const titleFace = useResolvedFont({fontWeight: '600'});\n\n return (\n <View style={[styles.badge, {backgroundColor: color}, style]}>\n {children ? children : <Text\n allowFontScaling={false}\n style={{\n color: textColor,\n fontSize,\n fontFamily: titleFace,\n fontWeight: '600',\n }}\n >{value}</Text>}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n badge: {\n justifyContent: 'center',\n alignItems: 'center',\n borderRadius: 999,\n paddingHorizontal: 6\n },\n});\n\nexport default Badge;\n","// bindings/zustandBinding.tsx\nimport React, {createContext, useContext, useRef} from 'react';\nimport {createStore, type StoreApi} from 'zustand';\nimport {shallow} from 'zustand/shallow';\nimport type {CalendarStoreBinding, SetDayDataPayload} from './calendarStoreBinding';\nimport type {\n DisabledBlock,\n DisabledInterval,\n DraggedEventDraft,\n Event,\n Resource,\n ResourceId,\n} from '@/types/calendarTypes';\nimport {useStoreWithEqualityFn} from \"zustand/traditional\";\nimport {format} from \"date-fns\";\n\ntype ByResource<T> = Record<ResourceId, T[]>;\ntype ByDay<T> = Record<string, ByResource<T>>;\n\ntype State = {\n date: Date;\n resourcesById: Record<ResourceId, Resource>;\n selectedEvent: Event | null;\n draggedEventDraft: DraggedEventDraft | null;\n\n // NEW: multi-day slices\n eventsByDay: ByDay<Event>;\n disabledBlocksByDay: ByDay<DisabledBlock>;\n disabledIntervalsByDay: ByDay<DisabledInterval>;\n\n // Actions\n upsertResources: (rs: Array<Pick<Resource, 'id' | 'name' | 'avatar'>>) => void;\n setDayDataFor: (dayKey: string, payload: SetDayDataPayload) => void;\n setSelectedEvent: (evt: Event | null) => void;\n setDraggedEventDraft: (draft: DraggedEventDraft | null) => void;\n setDate: (date: Date) => void;\n};\n\nconst createCalendarStore = () =>\n createStore<State>((set) => ({\n date: new Date(),\n resourcesById: {},\n\n // NEW multi-day\n eventsByDay: {},\n disabledBlocksByDay: {},\n disabledIntervalsByDay: {},\n\n selectedEvent: null,\n draggedEventDraft: null,\n\n setSelectedEvent: (evt) => set({selectedEvent: evt}),\n setDate: (date) => set({date}),\n\n upsertResources: (rs) =>\n set((s) => {\n // keep refs for unchanged items\n const next = {...s.resourcesById};\n let changed = false;\n for (const r of rs) {\n const prev = next[r.id];\n // replace only when identity actually differs\n if (!prev || prev.name !== r.name || prev.avatar !== r.avatar) {\n next[r.id] = {id: r.id, name: r.name, avatar: r.avatar};\n changed = true;\n }\n }\n return changed ? {resourcesById: next} : {};\n }),\n\n // NEW: multi-day write\n setDayDataFor: (dayKey, {events, disabledBlocks, disableIntervals}) =>\n set((s) => ({\n eventsByDay: events\n ? {...s.eventsByDay, [dayKey]: events} // replace whole day\n : s.eventsByDay,\n disabledBlocksByDay: disabledBlocks\n ? {...s.disabledBlocksByDay, [dayKey]: disabledBlocks} // replace whole day\n : s.disabledBlocksByDay,\n disabledIntervalsByDay: disableIntervals\n ? {...s.disabledIntervalsByDay, [dayKey]: disableIntervals} // replace whole day\n : s.disabledIntervalsByDay,\n })),\n\n setDraggedEventDraft: (draft) => set({draggedEventDraft: draft}),\n }));\n\n// Scoped store (instance-safe)\nconst StoreContext = createContext<StoreApi<State> | null>(null);\n\nconst Provider: CalendarStoreBinding['Provider'] = ({children}) => {\n const ref = useRef<StoreApi<State>>(undefined);\n if (!ref.current) ref.current = createCalendarStore();\n return <StoreContext.Provider value={ref.current}>{children}</StoreContext.Provider>;\n};\n\n// helper to bind to this instance\nconst useBound = <T, >(\n selector: (s: State) => T,\n eq?: (a: T, b: T) => boolean\n): T => {\n const store = useContext(StoreContext);\n if (!store) throw new Error('Calendar store used outside of Provider');\n return useStoreWithEqualityFn(store, selector, eq);\n};\n\n// Selectors (single-day, per-resource)\nconst useResourceById: CalendarStoreBinding['useResourceById'] =\n (id) => useBound((s) => s.resourcesById[id]);\n\nconst useGetSelectedEvent: CalendarStoreBinding['useGetSelectedEvent'] =\n () => useBound((s) => s.selectedEvent);\n\nconst useSetSelectedEvent: CalendarStoreBinding['useSetSelectedEvent'] =\n () => useBound((s) => s.setSelectedEvent);\n\nconst useEventsFor: CalendarStoreBinding['useEventsFor'] =\n (resourceId, dayDate) => useBound(s => {\n const key = format(dayDate, 'yyyy-MM-dd');\n return s.eventsByDay?.[key]?.[resourceId] ?? [];\n }, shallow);\n\nconst useGetDraggedEventDraft: CalendarStoreBinding['useGetDraggedEventDraft'] =\n () => useBound((s) => s.draggedEventDraft);\n\nconst useDisabledBlocksFor: CalendarStoreBinding['useDisabledBlocksFor'] =\n (resourceId, dayDate) => useBound(s => {\n const key = format(dayDate, 'yyyy-MM-dd');\n return s.disabledBlocksByDay?.[key]?.[resourceId] ?? [];\n }, shallow);\n\nconst useDisabledIntervalsFor: CalendarStoreBinding['useDisabledIntervalsFor'] =\n (resourceId, dayDate) => useBound(s => {\n const key = format(dayDate, 'yyyy-MM-dd');\n return s.disabledIntervalsByDay?.[key]?.[resourceId] ?? []\n }, shallow);\n\n// Action hooks\nconst useUpsertResources: CalendarStoreBinding['useUpsertResources'] =\n () => useBound((s) => s.upsertResources);\n\nconst useSetDayDataFor: CalendarStoreBinding['useSetDayDataFor'] =\n () => useBound((s) => s.setDayDataFor);\n\nconst useSetDraggedEventDraft: CalendarStoreBinding['useSetDraggedEventDraft'] =\n () => useBound((s) => s.setDraggedEventDraft);\n\nconst useSetDate: CalendarStoreBinding['useSetDate'] =\n () => useBound((s) => s.setDate);\n\nconst useGetDate: CalendarStoreBinding['useGetDate'] =\n () => useBound((s) => s.date);\n// Export the binding\nexport const zustandBinding: CalendarStoreBinding = {\n Provider,\n useResourceById,\n useEventsFor,\n useDisabledBlocksFor,\n useDisabledIntervalsFor,\n useUpsertResources,\n useSetDate,\n useGetDate,\n useSetDayDataFor,\n useGetSelectedEvent,\n useSetSelectedEvent,\n useGetDraggedEventDraft,\n useSetDraggedEventDraft\n};\n","// store/BindingProvider.tsx\nimport React, {createContext, useContext} from 'react';\nimport {CalendarStoreBinding} from './calendarStoreBinding';\nimport {zustandBinding} from \"./ZustandBinding\";\n\nconst BindingCtx = createContext<CalendarStoreBinding | null>(null);\n\nexport const useCalendarBinding = (): CalendarStoreBinding => {\n const ctx = useContext(BindingCtx);\n if (!ctx) throw new Error('useCalendarBinding must be used within <CalendarBindingProvider>');\n return ctx;\n};\n\nexport const CalendarBindingProvider: React.FC<{\n binding?: CalendarStoreBinding; // optional override\n children: React.ReactNode;\n}> = ({binding, children}) => {\n const active = binding ?? zustandBinding;\n const StoreProvider = active.Provider; // mounts the store\n return (\n <BindingCtx.Provider value={active}>\n <StoreProvider>{children}</StoreProvider>\n </BindingCtx.Provider>\n );\n};\n","// @flow\nimport * as React from 'react';\nimport {Image, StyleProp, StyleSheet, Text, TouchableOpacity, View, ViewStyle} from \"react-native\";\nimport {isUndefined} from \"lodash\";\nimport Hidden from './common/layout/Hidden';\nimport Center from './common/layout/Center';\nimport Badge from './common/Badge';\nimport Col from './common/layout/Col';\nimport {Resource} from '@/types/calendarTypes';\nimport {useCalendarBinding} from \"@/store/bindings/BindingProvider\";\nimport {useResolvedFont} from \"@/theme/ThemeContext\";\n\ntype Props = {\n resourceIds: number[];\n APPOINTMENT_BLOCK_WIDTH: number;\n onResourcePress?: (resource: Resource) => void;\n date: Date;\n};\n\ntype ResourceComponentProps = {\n id: number;\n APPOINTMENT_BLOCK_WIDTH: number;\n onResourcePress?: (resource: Resource) => void;\n date: Date;\n}\n\nconst ResourceComponent = ({id, onResourcePress, APPOINTMENT_BLOCK_WIDTH, date}: ResourceComponentProps) => {\n const {useResourceById, useEventsFor} =\n useCalendarBinding();\n const resource = useResourceById(id);\n const events = useEventsFor(id, date);\n const titleFace = useResolvedFont({fontWeight: '700'});\n\n return <Col style={[{\n alignItems: 'center',\n width: APPOINTMENT_BLOCK_WIDTH,\n }]}>\n <View style={{position: \"relative\"}}>\n <StaffAvatar\n onPress={() => {\n if (onResourcePress)\n onResourcePress(resource);\n }}\n name={resource?.name}\n circleSize={Math.min(40, APPOINTMENT_BLOCK_WIDTH - 12)}\n fontSize={16}\n badge={events?.length}\n image={resource?.avatar}\n />\n </View>\n <Text style={{\n fontSize: 14,\n fontFamily: titleFace,\n fontWeight: '700',\n }}\n numberOfLines={1}\n allowFontScaling={false}\n >{resource?.name}</Text>\n </Col>\n}\n\nexport const ResourcesComponent = ({resourceIds, onResourcePress, APPOINTMENT_BLOCK_WIDTH, date}: Props) => {\n return (\n <>\n {resourceIds?.map((id) => {\n return <ResourceComponent\n date={date}\n key={id}\n id={id}\n APPOINTMENT_BLOCK_WIDTH={APPOINTMENT_BLOCK_WIDTH}\n onResourcePress={onResourcePress}\n />\n })}\n </>\n );\n}\n\ninterface StaffAvatarProps {\n circleSize?: number;\n fontSize?: number;\n name?: string;\n badge?: number;\n image?: string;\n badgeStyle?: StyleProp<ViewStyle>;\n containerStyle?: StyleProp<ViewStyle>;\n onPress?: () => void;\n ringColor?: string;\n avatarColor?: string;\n textColor?: string;\n}\n\nexport function StaffAvatar({\n name,\n circleSize = 60,\n fontSize = 36,\n image,\n badge,\n badgeStyle,\n onPress,\n containerStyle,\n ringColor = '#DAEEE7',\n avatarColor,\n textColor,\n }: StaffAvatarProps) {\n const titleFace = useResolvedFont({fontWeight: '700'});\n\n return (\n <TouchableOpacity\n disabled={isUndefined(onPress)}\n onPress={onPress}\n style={containerStyle}\n >\n <Center style={{\n borderRadius: 9999,\n backgroundColor: ringColor,\n }}>\n <Hidden isHidden={isUndefined(badge) || Number(badge) == 0}>\n <View style={[{\n zIndex: 1,\n position: 'absolute',\n right: -4,\n top: -6,\n borderRadius: 999,\n backgroundColor: \"#fff\",\n padding: 2\n }, badgeStyle]}\n >\n <Badge\n fontSize={12}\n value={badge + \"\"}\n color={\"#4d959c\"}\n />\n </View>\n </Hidden>\n <Center style={{\n margin: 2,\n borderRadius: 9999,\n backgroundColor: 'white',\n }}>\n <Center style={{\n margin: 2,\n borderRadius: 9999,\n height: circleSize,\n width: circleSize,\n backgroundColor: avatarColor || \"#C9E5E8\",\n overflow: 'hidden'\n }}>\n {\n image ?\n <Image\n resizeMode={\"cover\"}\n source={{uri: image}}\n style={{\n height: '100%',\n borderRadius: 6,\n ...StyleSheet.absoluteFillObject,\n }}\n />\n :\n <Text\n allowFontScaling={false}\n style={{\n fontFamily: titleFace,\n fontSize: fontSize,\n color: textColor || \"#4d959c\",\n lineHeight: circleSize,\n }}\n >\n {name ? name.split(' ').map(n => n[0]).join('').slice(0, 2) : ''}\n </Text>\n }\n </Center>\n </Center>\n </Center>\n </TouchableOpacity>\n )\n}\n","import * as React from 'react';\nimport {useMemo} from 'react';\nimport {View} from 'react-native';\nimport {Canvas, Line, Rect} from '@shopify/react-native-skia';\nimport {Gesture, GestureDetector} from 'react-native-gesture-handler';\nimport {runOnJS} from 'react-native-reanimated';\n\ntype Props = {\n handleBlockPress: (time: string) => void;\n APPOINTMENT_BLOCK_WIDTH: number;\n hourHeight: number;\n};\n\nexport const EventGridBlocksSkia: React.FC<Props> = ({\n handleBlockPress,\n hourHeight,\n APPOINTMENT_BLOCK_WIDTH\n }) => {\n const rowHeight = hourHeight / 4;\n const [pressedRow, setPressedRow] = React.useState<number | null>(null);\n\n // 96 quarter-hour labels, computed once\n const timeLabels = useMemo<string[]>(() => {\n const out: string[] = [];\n for (let h = 0; h < 24; h++) {\n for (let q = 0; q < 4; q++) {\n const m = q * 15;\n const hh = String(h).padStart(2, '0');\n const mm = String(m).padStart(2, '0');\n out.push(`${hh}:${mm}:00`);\n }\n }\n return out;\n }, []);\n\n const rects = useMemo(\n () =>\n timeLabels.map((_, row) => ({\n x: 0,\n y: row * rowHeight,\n width: APPOINTMENT_BLOCK_WIDTH,\n height: rowHeight,\n row,\n })),\n [timeLabels, rowHeight, APPOINTMENT_BLOCK_WIDTH]\n );\n\n // Split into two canvas segments\n const midIndex = Math.ceil(rects.length / 2);\n const firstRects = rects.slice(0, midIndex);\n const secondRects = rects.slice(midIndex);\n const segmentHeight = rowHeight * firstRects.length;\n\n const onSlotPress = React.useCallback(\n (row: number) => {\n setPressedRow(null);\n const slot = timeLabels[row];\n if (slot) {\n handleBlockPress(slot);\n }\n },\n [handleBlockPress, timeLabels]\n );\n\n const onPressBegin = React.useCallback((row: number) => {\n setPressedRow(row);\n }, []);\n const onTouchesUp = React.useCallback(() => {\n setPressedRow(null);\n }, []);\n\n const longPressGesture = Gesture.LongPress()\n .onBegin((e) => {\n 'worklet';\n runOnJS(onPressBegin)(Math.floor(e.y / rowHeight))\n })\n .onEnd((e) => {\n 'worklet';\n runOnJS(onSlotPress)(Math.floor(e.y / rowHeight))\n })\n .onFinalize(() => {\n 'worklet';\n runOnJS(onTouchesUp)()\n });\n\n return (\n <GestureDetector gesture={longPressGesture}>\n <View>\n {/* First half-day segment */}\n <Canvas style={{width: APPOINTMENT_BLOCK_WIDTH, height: segmentHeight}}>\n {firstRects.map(({x, y, width: w, height: h, row}, idx) => (\n <React.Fragment key={idx}>\n <Rect\n x={x}\n y={y}\n width={w}\n height={h}\n color={\n pressedRow === row ? 'rgba(240,240,240,0.3)' : 'rgba(240,240,240,0.6)'\n }\n style=\"fill\"\n />\n <Line p1={{x, y: y + h}} p2={{x: x + w, y: y + h}} color=\"#ddd\" strokeWidth={1}/>\n </React.Fragment>\n ))}\n </Canvas>\n\n {/* Second half-day segment */}\n <Canvas style={{width: APPOINTMENT_BLOCK_WIDTH, height: segmentHeight}}>\n {secondRects.map(({x, y, width: w, height: h, row}, idx) => (\n <React.Fragment key={idx}>\n <Rect\n x={x}\n y={y - segmentHeight}\n width={w}\n height={h}\n color={\n pressedRow === row ? 'rgba(240,240,240,0.3)' : 'rgba(240,240,240,0.6)'\n }\n style=\"fill\"\n />\n <Line\n p1={{x, y: y - segmentHeight + h}}\n p2={{x: x + w, y: y - segmentHeight + h}}\n color=\"#ddd\"\n strokeWidth={1}\n />\n </React.Fragment>\n ))}\n </Canvas>\n </View>\n </GestureDetector>\n );\n};\n","import React, {useEffect, useMemo} from 'react';\nimport type {CalendarStoreBinding} from './bindings/calendarStoreBinding';\nimport {DisabledBlock, DisabledInterval, Event, Resource,} from '@/types/calendarTypes';\nimport {format} from \"date-fns\";\n\ntype Props = {\n store: CalendarStoreBinding;\n resources: Array<\n Resource & {\n events?: Event[];\n disabledBlocks?: DisabledBlock[];\n disableIntervals?: DisabledInterval[];\n }>;\n baseDate: Date; // the \"single-day\" fallback date\n};\n\nexport const StoreFeeder: React.FC<Props> = ({store, resources, baseDate}) => {\n const upsertResources = store.useUpsertResources();\n const setDayDataFor = store.useSetDayDataFor();\n const setDate = store.useSetDate();\n const baseDateKey = useMemo(() => format(baseDate, 'yyyy-MM-dd')!, [baseDate]);\n\n useEffect(() => {\n setDate(baseDate);\n // 1) Directory of resources (id/name/avatar only)\n upsertResources(resources.map(r => ({id: r.id, name: r.name, avatar: r.avatar})));\n\n // 2) Build single-day per-resource maps\n const dayBuckets = new Map<\n string,\n {\n events: Record<number, Event[]>;\n disabledBlocks: Record<number, DisabledBlock[]>;\n disableIntervals: Record<number, DisabledInterval[]>;\n }\n >();\n\n for (const r of resources) {\n const push = <T extends Event | DisabledBlock | DisabledInterval>(\n items: T[] | undefined,\n field: \"events\" | \"disabledBlocks\" | \"disableIntervals\"\n ) => {\n if (!items?.length) return;\n for (const it of items) {\n const key = it.date ?? baseDateKey;\n const bucket =\n dayBuckets.get(key) ??\n dayBuckets.set(key, {events: {}, disabledBlocks: {}, disableIntervals: {}}).get(key)!;\n\n const m = bucket[field] as Record<number, T[]>;\n (m[r.id] ||= []).push(it);\n }\n };\n\n push(r.events, \"events\");\n push(r.disabledBlocks, \"disabledBlocks\");\n push(r.disableIntervals, \"disableIntervals\");\n }\n\n for (const [dayKey, payload] of dayBuckets) {\n setDayDataFor(dayKey, payload);\n }\n }, [resources, upsertResources, setDayDataFor, baseDateKey]);\n\n return null;\n};\n","import React from \"react\";\nimport {StyleSheet, View} from \"react-native\";\nimport Svg, {Defs, Line, Pattern} from \"react-native-svg\";\nimport {Rect} from \"react-content-loader/native\";\nimport {useCalendarBinding} from \"@/store/bindings/BindingProvider\";\nimport {scalePosition} from \"@/utilities/helpers\";\n\ninterface DisabledIntervalsProp {\n id: number;\n APPOINTMENT_BLOCK_WIDTH: number;\n hourHeight: number;\n date?: Date;\n}\n\ninterface DisabledIntervalsProps {\n width: number;\n top: number;\n height: number;\n}\n\nconst DisabledInterval: React.FC<DisabledIntervalsProps> = ({width, top, height}) => {\n return <View style={[styles.disabledBlock, {width, top, height}]}>\n <Svg width={width} height=\"100%\">\n <Defs>\n <Pattern id=\"diagonalHatch\" patternUnits=\"userSpaceOnUse\" width=\"10\" height=\"10\">\n <Line x1=\"0\" y1=\"0\" x2=\"10\" y2=\"10\" stroke=\"rgba(150, 150, 150, 0.8)\" strokeWidth=\"1\"/>\n </Pattern>\n </Defs>\n <Rect width={width} height=\"100%\" fill=\"url(#diagonalHatch)\"/>\n </Svg>\n </View>\n};\n\nconst DisabledIntervals: React.FC<DisabledIntervalsProp> = React.memo(({\n id,\n APPOINTMENT_BLOCK_WIDTH,\n hourHeight,\n date: dateProp\n }) => {\n const {useDisabledIntervalsFor, useGetDate} =\n useCalendarBinding();\n const date = useGetDate();\n const disabledIntervals = useDisabledIntervalsFor(id, dateProp ?? date);\n\n return (\n <>\n {disabledIntervals.map((disabledInterval, index) => {\n return <DisabledInterval\n key={`${index}-${disabledInterval.from}-${disabledInterval.to}`} // Updated key to include disabledInterval values\n width={APPOINTMENT_BLOCK_WIDTH}\n top={scalePosition(disabledInterval.from, hourHeight)}\n height={scalePosition(disabledInterval.to - disabledInterval.from, hourHeight)}\n />\n }\n )}\n </>\n );\n});\n\nconst styles = StyleSheet.create({\n disabledBlock: {\n position: \"absolute\",\n zIndex: -10,\n },\n});\n\nexport default DisabledIntervals;\n","import React, {ReactNode} from \"react\";\nimport {View, ViewProps} from \"react-native\";\n\ninterface RowProps extends ViewProps {\n space?: number;\n divider?: ReactNode;\n}\n\nconst Row = ({children, divider, space, style, ...props}: RowProps) => {\n return (\n <View style={[{flexDirection: \"row\"}, style]} {...props}>\n {React.Children.toArray(children).map((child, index) => (\n <React.Fragment key={index}>\n {child}\n {index !== React.Children.toArray(children).length - 1 &&\n divider}\n {index !== React.Children.toArray(children).length - 1 &&\n <View style={{width: space, height: \"100%\"}}/>}\n </React.Fragment>\n ))}\n </View>\n );\n};\n\nexport default Row;\n","import React, {useMemo} from \"react\";\nimport {StyleSheet, Text, TouchableOpacity} from \"react-native\";\nimport {getHours, getMinutes, parse} from \"date-fns\";\nimport {\n columnsToPixels,\n computeDisabledBlockColumns,\n EventFrame,\n getTextSize,\n minutesToTime,\n scalePosition\n} from \"@/utilities/helpers\";\nimport Col from \"./common/layout/Col\";\nimport Row from \"./common/layout/Row\";\nimport {DisabledBlock} from \"@/types/calendarTypes\";\nimport {useCalendarBinding} from \"@/store/bindings/BindingProvider\";\nimport {useResolvedFont} from \"@/theme/ThemeContext\";\n\ninterface DisabledBlocksProps {\n id: number;\n hourHeight: number;\n APPOINTMENT_BLOCK_WIDTH: number;\n onDisabledBlockPress?: (block: DisabledBlock) => void;\n date?: Date;\n}\n\ninterface DisabledBlockComponentProps {\n top: number;\n height: number;\n hourHeight: number;\n disabledBlock: DisabledBlock;\n onDisabledBlockPress?: (block: DisabledBlock) => void;\n layout: EventFrame;\n}\n\nconst MINUTES_IN_DAY = 24 * 60;\n\nconst covertTimeToMinutes = (time: string) => {\n const parsedTime = parse(time, \"HH:mm\", new Date());\n return getHours(parsedTime) * 60 + getMinutes(parsedTime);\n}\n\n// Build a normalized [start, end) in minutes, allowing overnight\nconst toNormalizedInterval = (from?: string, to?: string) => {\n const start = covertTimeToMinutes(from ?? \"00:00\");\n let end = covertTimeToMinutes(to ?? \"00:00\");\n\n // If it wraps past midnight (e.g., 23:00 → 00:00), push end into the next day\n if (end <= start) end += MINUTES_IN_DAY;\n\n return {start, end};\n};\n\nconst DisabledBlockComponent: React.FC<DisabledBlockComponentProps> = ({\n top,\n height,\n layout,\n disabledBlock,\n hourHeight,\n onDisabledBlockPress\n }) => {\n const dynamicStyle = {\n backgroundColor: \"#d3d3d3\",\n top: top + 2,\n left: layout.leftPx + 1,\n height: height < hourHeight / 4 ? height : height - 4,\n width: layout.widthPx - 3,\n borderWidth: 1,\n borderColor: \"rgba(0,0,0,0.12)\",\n };\n const titleFace = useResolvedFont({fontWeight: '600'});\n\n return <TouchableOpacity\n style={[styles.event, dynamicStyle]}\n onPress={() => {\n onDisabledBlockPress && onDisabledBlockPress(disabledBlock);\n }}\n >\n <Col style={{position: \"relative\"}}>\n <Row style={{height: 18}}>\n <Text\n allowFontScaling={false}\n style={{\n fontFamily: titleFace,\n fontSize: getTextSize(hourHeight),\n fontWeight: \"600\"\n }}>{minutesToTime(disabledBlock?.from)} - {minutesToTime(disabledBlock?.to)}</Text>\n </Row>\n <Text\n allowFontScaling={false}\n style={{\n fontFamily: titleFace,\n fontSize: getTextSize(hourHeight),\n fontWeight: \"600\"\n }}>{disabledBlock?.title}</Text>\n </Col>\n </TouchableOpacity>\n};\n\nconst DisabledBlocks: React.FC<DisabledBlocksProps> = React.memo(({\n id,\n APPOINTMENT_BLOCK_WIDTH,\n hourHeight,\n onDisabledBlockPress,\n date: dateProp\n }) => {\n const {useDisabledBlocksFor, useGetDate} =\n useCalendarBinding();\n const date = useGetDate();\n const disabledBlocks = useDisabledBlocksFor(id, dateProp ?? date);\n\n const layoutMap = useMemo(() => {\n return columnsToPixels(computeDisabledBlockColumns(disabledBlocks), APPOINTMENT_BLOCK_WIDTH);\n }, [disabledBlocks]);\n\n return (\n <>\n {disabledBlocks.map((disabledBlock, index) => {\n const key = disabledBlock.id;\n return <DisabledBlockComponent\n hourHeight={hourHeight}\n disabledBlock={disabledBlock}\n key={`${index}-${disabledBlock.from}-${disabledBlock.to}`} // Updated key to include hour values\n top={scalePosition(disabledBlock.from, hourHeight)}\n height={scalePosition(disabledBlock.to - disabledBlock.from, hourHeight)}\n layout={layoutMap.get(key)!}\n onDisabledBlockPress={onDisabledBlockPress}\n />\n }\n )}\n </>\n );\n});\n\nconst styles = StyleSheet.create({\n event: {\n position: 'absolute',\n borderRadius: 5,\n padding: 2,\n overflow: \"hidden\",\n zIndex: 999, // Ensure events stay above the background blocks\n },\n});\n\nexport default DisabledBlocks;\n","import React from \"react\";\nimport {StyleSheet, Text, TextInput, TextStyle, TouchableOpacity, ViewStyle} from \"react-native\";\nimport Row from \"../components/common/layout/Row\";\nimport Col from \"../components/common/layout/Col\";\nimport {Event, EventRenderContext} from \"@/types/calendarTypes\";\nimport {EventFrame, getTextSize, minutesToTime, scalePosition} from \"@/utilities/helpers\";\nimport {useCalendarBinding} from \"@/store/bindings/BindingProvider\";\nimport {useResolvedFont} from \"@/theme/ThemeContext\";\nimport {StyleProp} from \"react-native/Libraries/StyleSheet/StyleSheet\";\n\nexport type EventSlots = {\n // TopLeft?: React.ComponentType<{ event: Event; ctx: EventRenderContext }>;\n TopRight?: React.ComponentType<{ event: Event; ctx: EventRenderContext }>;\n Body?: React.ComponentType<{ event: Event; ctx: EventRenderContext }>;\n};\n\nexport type EventRenderer = (\n props: EventBlockProps & { children?: React.ReactNode }\n) => React.ReactNode;\n\nexport type StyleOverrides = Partial<{\n time: StyleProp<TextStyle>;\n container: ViewStyle;\n content: ViewStyle;\n title: TextStyle;\n desc: TextStyle;\n}>;\n\ninterface EventBlockProps {\n event: Event;\n hourHeight: number;\n frame: EventFrame;\n disabled?: boolean;\n selected?: boolean;\n onLongPress?: (event: Event) => void;\n onPress?: (event: Event) => void;\n slots?: EventSlots;\n styleOverrides?:\n | StyleOverrides\n | ((event: Event) => StyleOverrides | undefined);\n}\n\nconst EventBlock: React.FC<EventBlockProps> = React.memo(({\n event,\n onLongPress,\n onPress, disabled, selected,\n hourHeight, slots,\n frame,\n styleOverrides\n }) => {\n const {useGetSelectedEvent} =\n useCalendarBinding();\n const selectedAppointment = useGetSelectedEvent();\n\n const eventTop = scalePosition(event.from, hourHeight);\n const eventHeight = scalePosition(event.to - event.from, hourHeight);\n\n const start = minutesToTime(event.from);\n const end = minutesToTime(event.to);\n\n const dynamicStyle = {\n top: eventTop + 2,\n height: eventHeight < hourHeight / 4 ? eventHeight : eventHeight - 4,\n left: frame.leftPx + 1,\n width: frame.widthPx - 3,\n zIndex: frame.zIndex,\n opacity: selectedAppointment || disabled ? 0.5 : 1,\n borderWidth: selected ? 2 : 1,\n borderColor: selected ? \"#4d959c\" : \"rgba(0,0,0,0.12)\",\n };\n\n const resolved =\n typeof styleOverrides === 'function'\n ? styleOverrides(event) ?? {}\n : styleOverrides ?? {};\n\n if (eventHeight == 0)\n return null;\n\n const TopRight = slots?.TopRight;\n const Body = slots?.Body;\n const titleFace = useResolvedFont({fontWeight: '700'});\n const timeFace = useResolvedFont({fontWeight: '600'});\n\n return (\n <TouchableOpacity\n style={[styles.event, resolved?.container, dynamicStyle]}\n disabled={disabled}\n onPress={() => {\n onPress && onPress(event);\n }}\n onLongPress={() => {\n onLongPress && onLongPress(event);\n }}\n >\n <Col style={[{position: \"relative\"}, resolved?.content]}>\n <TextInput\n editable={false}\n allowFontScaling={false}\n underlineColorAndroid=\"transparent\" // Disables underline on Android\n style={[{\n width: \"100%\",\n fontFamily: timeFace,\n fontSize: getTextSize(hourHeight),\n pointerEvents: \"none\",\n padding: 0,\n margin: 0,\n }, resolved?.time]}\n defaultValue={`${start} - ${end}`}\n />\n\n {\n Body ? <Body event={event} ctx={{hourHeight}}/> :\n <>\n <Row style={{alignItems: \"center\", height: 18}}>\n <Text\n allowFontScaling={false}\n style={[{\n fontFamily: titleFace,\n fontSize: getTextSize(hourHeight),\n fontWeight: \"700\"\n }, resolved?.title]}\n >{event?.title}</Text>\n </Row>\n <Text\n allowFontScaling={false}\n style={[{\n fontFamily: timeFace,\n fontSize: getTextSize(hourHeight),\n fontWeight: \"600\"\n }, resolved?.desc]}>{event?.description}</Text>\n </>\n }\n <Row style={{\n position: \"absolute\",\n right: 2\n }}>\n {TopRight ? <TopRight event={event} ctx={{hourHeight}}/> : null}\n </Row>\n </Col>\n </TouchableOpacity>\n );\n});\n\nconst styles = StyleSheet.create({\n event: {\n backgroundColor: '#4d959c',\n position: 'absolute',\n borderRadius: 5,\n padding: 2,\n overflow: \"hidden\",\n zIndex: 9999, // Ensure events stay above the background blocks\n }\n});\n\nexport default EventBlock;\n","import * as React from 'react';\nimport {useMemo} from 'react';\nimport Animated, {AnimatedProps, SharedValue, useAnimatedProps, useAnimatedStyle} from \"react-native-reanimated\";\nimport Col from \"./common/layout/Col\";\nimport Row from \"./common/layout/Row\";\nimport {MaterialIcons} from \"@expo/vector-icons\";\nimport {StyleSheet, Text, TextInput, TextInputProps} from \"react-native\";\nimport {Event} from \"@/types/calendarTypes\";\nimport {EventSlots, StyleOverrides} from \"./EventBlock\";\nimport {getTextSize, minutesToTime, positionToMinutes} from \"@/utilities/helpers\";\nimport {useResolvedFont} from \"@/theme/ThemeContext\";\n\ntype Props = {\n selectedEvent: Event;\n APPOINTMENT_BLOCK_WIDTH: number;\n hourHeight: number;\n panYAbs: SharedValue<number>;\n panXAbs: SharedValue<number>;\n eventStartedTop: SharedValue<number>;\n eventHeight: SharedValue<number>;\n slots?: EventSlots;\n styleOverrides?: | StyleOverrides\n | ((event: Event) => StyleOverrides | undefined);\n};\n\nconst AnimatedTextInput = Animated.createAnimatedComponent(TextInput);\ntype AnimatedTextInputProps = AnimatedProps<TextInputProps> & { text: string };\nexport const DraggableEvent = ({\n selectedEvent,\n eventStartedTop,\n panYAbs, panXAbs,\n APPOINTMENT_BLOCK_WIDTH,\n hourHeight,\n eventHeight, styleOverrides,\n slots\n }: Props) => {\n const dynamicStyle = useAnimatedStyle(() => {\n return {\n height: eventHeight.value < hourHeight / 4 ? eventHeight.value : eventHeight.value - 4,\n width: APPOINTMENT_BLOCK_WIDTH - 3,\n borderWidth: 1,\n borderColor: \"rgba(0,0,0,0.12)\",\n }\n });\n\n const draggingAnimatedStyle = useAnimatedStyle(() => {\n if (!selectedEvent) {\n return {\n opacity: 0,\n transform: [\n {\n translateY: 0,\n },\n {\n translateX: 0,\n },\n ],\n };\n }\n return {\n opacity: 1,\n transform: [\n {\n translateY: panYAbs.value - (eventHeight.value / 2) + 2,\n },\n {\n translateX: panXAbs.value - (APPOINTMENT_BLOCK_WIDTH / 2) + 1,\n },\n ],\n };\n }, [selectedEvent, APPOINTMENT_BLOCK_WIDTH]);\n\n const initialDisplayTime = useMemo(() => {\n // Use the initial values calculated above, not the shared value\n const start = minutesToTime(positionToMinutes(eventStartedTop.value, hourHeight));\n const end = minutesToTime(positionToMinutes(eventStartedTop.value + eventHeight.value, hourHeight));\n return `${start} - ${end}`;\n }, [hourHeight]);\n\n const animatedTimeProps = useAnimatedProps<AnimatedTextInputProps>(() => {\n const start = minutesToTime(positionToMinutes(eventStartedTop.value, hourHeight));\n const end = minutesToTime(positionToMinutes(eventStartedTop.value + eventHeight.value, hourHeight));\n return {\n text: `${start} - ${end}`\n };\n }, [hourHeight]);\n\n const resolved =\n typeof styleOverrides === 'function'\n ? styleOverrides(selectedEvent) ?? {}\n : styleOverrides ?? {};\n\n const TopRight = slots?.TopRight;\n const Body = slots?.Body;\n const titleFace = useResolvedFont({fontWeight: '700'});\n const timeFace = useResolvedFont({fontWeight: '600'});\n\n return (\n <Animated.View style={[styles.event, dynamicStyle, draggingAnimatedStyle, resolved?.container]}>\n <Col style={[{position: \"relative\"}, resolved?.content]}>\n <AnimatedTextInput\n editable={false}\n allowFontScaling={false}\n underlineColorAndroid=\"transparent\" // Disables underline on Android\n style={[{\n width: \"100%\",\n fontFamily: timeFace,\n fontSize: getTextSize(hourHeight),\n pointerEvents: \"none\",\n padding: 0,\n margin: 0,\n }, resolved?.time]}\n defaultValue={initialDisplayTime}\n animatedProps={animatedTimeProps}\n />\n {\n Body ? <Body event={selectedEvent} ctx={{hourHeight}}/> :\n <>\n <Row style={{alignItems: \"center\", height: 18}}>\n <Text\n allowFontScaling={false}\n style={[{\n fontFamily: titleFace,\n fontSize: getTextSize(hourHeight),\n fontWeight: \"700\"\n }, resolved?.title]}\n >{selectedEvent?.title}</Text>\n </Row>\n <Text\n allowFontScaling={false}\n style={[{\n fontFamily: timeFace,\n fontSize: getTextSize(hourHeight),\n fontWeight: \"600\"\n }, resolved?.desc]}>{selectedEvent?.description}</Text>\n </>\n }\n <Row style={{\n position: \"absolute\",\n right: 2\n }} space={2}>\n {TopRight ? <TopRight event={selectedEvent} ctx={{hourHeight}}/> : null}\n </Row>\n </Col>\n <Row style={{\n position: \"absolute\",\n alignSelf: \"center\", bottom: 0\n }}>\n <MaterialIcons name=\"drag-handle\" size={12} color=\"black\"/>\n </Row>\n </Animated.View>\n );\n};\n\nconst styles = StyleSheet.create({\n event: {\n backgroundColor: '#4d959c',\n position: 'absolute',\n borderRadius: 5,\n padding: 2,\n overflow: \"hidden\",\n zIndex: 99, // Ensure events stay above the background blocks\n }\n});\n","import React, {useMemo} from \"react\";\nimport {useCalendarBinding} from \"@/store/bindings/BindingProvider\";\nimport {Event, LayoutMode} from \"@/types/calendarTypes\";\nimport {EventRenderer} from \"./EventBlock\";\nimport {computeEventFrames} from \"@/utilities/helpers\";\n\ntype FlagFn = (event: Event) => boolean;\n\ninterface EventBlocksProps {\n id: number;\n EVENT_BLOCK_WIDTH: number;\n hourHeight: number;\n onLongPress: (evt: Event) => void;\n onPress: (evt: Event) => void;\n eventRenderer: EventRenderer;\n isEventSelected?: FlagFn;\n isEventDisabled?: FlagFn;\n mode: LayoutMode;\n date?: Date;\n}\n\nconst EventBlocks: React.FC<EventBlocksProps> = React.memo(({\n id,\n onLongPress,\n onPress,\n hourHeight,\n EVENT_BLOCK_WIDTH,\n eventRenderer,\n isEventDisabled, isEventSelected,\n mode,\n date: dateProp\n }) => {\n\n const {useEventsFor, useGetDate} =\n useCalendarBinding();\n const date = useGetDate();\n const events = useEventsFor(id, dateProp ?? date);\n const frameMap = useMemo(\n () => computeEventFrames(events, EVENT_BLOCK_WIDTH, mode),\n [events, mode, EVENT_BLOCK_WIDTH]\n );\n\n const Renderer = eventRenderer;\n\n return (events?.map((evt: Event, index: number) => {\n const selected = isEventSelected?.(evt) ?? false;\n const disabled = isEventDisabled?.(evt) ?? false;\n\n return <Renderer\n key={`${evt.from}-${evt.to}-${index}`} // Unique key for appointment blocks\n event={evt}\n onLongPress={(evt: Event) => onLongPress(evt)}\n onPress={(evt: Event) => onPress(evt)}\n hourHeight={hourHeight}\n frame={frameMap.get(evt.id)!}\n selected={selected}\n disabled={disabled}\n />\n }\n )\n );\n});\n\nexport default EventBlocks;\n","// @flow\nimport * as React from 'react';\nimport {useMemo} from 'react';\nimport Row from \"@/components/common/layout/Row\";\nimport {Text} from \"react-native\";\nimport {TIME_LABEL_WIDTH} from \"@/utilities/helpers\";\nimport {StaffAvatar} from \"@/components/ResourcesComponent\";\nimport {CalendarMode, Resource} from \"@/types/calendarTypes\";\nimport {useCalendarBinding} from \"@/store/bindings/BindingProvider\";\nimport {useResolvedFont} from \"@/theme/ThemeContext\";\nimport Col from \"@/components/common/layout/Col\";\nimport {addDays, format, isSameDay} from \"date-fns\";\nimport Center from \"@/components/common/layout/Center\";\n\ntype Props = {\n onResourcePress?: (resource: Resource) => void;\n activeResourceId: number;\n date: Date;\n mode: CalendarMode;\n APPOINTMENT_BLOCK_WIDTH: number;\n};\nexport const DaysComponent = ({onResourcePress, activeResourceId, mode, date, APPOINTMENT_BLOCK_WIDTH}: Props) => {\n const {useResourceById} =\n useCalendarBinding();\n const resource = useResourceById(activeResourceId);\n const titleFace = useResolvedFont({fontWeight: '700'});\n const subTitleFace = useResolvedFont({fontWeight: '600'});\n const isMultiDay = mode !== 'day';\n const visibleDayCount = isMultiDay ? (mode === 'week' ? 7 : 3) : 1;\n const days = useMemo(\n () => Array.from({length: visibleDayCount}, (_, i) => addDays(date, i)),\n [date, visibleDayCount]\n );\n\n return (\n <Row style={{paddingVertical: 4}}>\n <Col style={{width: TIME_LABEL_WIDTH, alignItems: \"center\", justifyContent: \"center\"}}>\n <StaffAvatar\n onPress={() => {\n if (onResourcePress)\n onResourcePress(resource);\n }}\n name={resource?.name}\n circleSize={TIME_LABEL_WIDTH - 12}\n fontSize={16}\n image={resource?.avatar}\n />\n </Col>\n <Row style={{flex: 1}}>\n {\n days.map((d, i) => {\n const selected = isSameDay(d, new Date());\n\n return <Col\n style={{\n alignItems: \"center\",\n justifyContent: \"center\",\n width: APPOINTMENT_BLOCK_WIDTH,\n }}\n space={4}\n key={i}>\n <Center style={{\n backgroundColor: selected ? \"#4d959c\" : undefined,\n width: Math.min(30, APPOINTMENT_BLOCK_WIDTH - 8),\n height: Math.min(30, APPOINTMENT_BLOCK_WIDTH - 8),\n borderRadius: 999,\n }}>\n <Text style={{\n fontSize: 16,\n fontFamily: subTitleFace,\n fontWeight: '600',\n color: selected ? \"#fff\" : undefined,\n }}\n numberOfLines={1}\n allowFontScaling={false}\n >\n {format(d, \"d\")}\n </Text>\n </Center>\n <Text style={{\n fontSize: 14,\n fontFamily: subTitleFace,\n fontWeight: '600',\n }}\n numberOfLines={1}\n allowFontScaling={false}\n >\n {format(d, \"EEE\")}\n </Text>\n </Col>\n })\n }\n </Row>\n </Row>\n );\n};\n","import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react';\nimport {Gesture, GestureDetector} from \"react-native-gesture-handler\";\nimport Animated, {\n runOnJS,\n scrollTo,\n useAnimatedRef,\n useAnimatedScrollHandler,\n useFrameCallback,\n useSharedValue,\n withSpring\n} from \"react-native-reanimated\";\nimport {Dimensions, LayoutChangeEvent, Platform, StyleSheet, useWindowDimensions, View} from \"react-native\";\nimport {FlashList} from \"@shopify/flash-list\";\nimport * as Haptics from \"expo-haptics\";\nimport {\n combineDateAndTime,\n findDayIndexFor,\n findResourceIndexFor,\n positionToMinutes,\n scalePosition,\n TIME_LABEL_WIDTH\n} from '@/utilities/helpers';\nimport {TimeLabels} from './TimeLabels';\nimport {ResourcesComponent} from \"./ResourcesComponent\";\nimport {EventGridBlocksSkia} from \"./EventGridBlocks\";\nimport {\n CalendarMode,\n CalendarTheme,\n DisabledBlock,\n DisabledInterval,\n Event,\n LayoutMode,\n Resource\n} from '@/types/calendarTypes';\nimport {StoreFeeder} from '@/store/StoreFeeder';\nimport {useCalendarBinding} from '@/store/bindings/BindingProvider';\nimport DisabledIntervals from './DisabledIntervals';\nimport DisabledBlocks from './DisabledBlocks';\nimport EventBlock, {EventRenderer, EventSlots, StyleOverrides} from \"@/components/EventBlock\";\nimport {DraggableEvent} from \"@/components/DraggableEvent\";\nimport {CalendarThemeProvider} from \"@/theme/ThemeContext\";\nimport EventBlocks from \"@/components/EventBlocks\";\nimport {DaysComponent} from \"@/components/DaysComponent\";\nimport {addDays, format} from 'date-fns';\n\ntype FlagFn = (event: Event) => boolean;\ntype Column =\n | { kind: 'resource'; resourceId: number }\n | { kind: 'day'; dayIndex: number; dayDate: Date };\n\ninterface CalendarProps {\n timezone?: string;\n date: Date;\n startMinutes?: number;\n resources: Array<Resource & {\n events: Event[];\n disabledBlocks?: DisabledBlock[];\n disableIntervals?: DisabledInterval[];\n }>;\n\n snapIntervalInMinutes?: number;\n numberOfColumns?: number;\n hourHeight?: number;\n\n onResourcePress?: (resource: Resource) => void;\n onBlockLongPress?: (resource: Resource, date: Date) => void;\n onDisabledBlockPress?: (block: DisabledBlock) => void;\n onEventPress?: (event: Event) => void;\n onEventLongPress?: (event: Event) => void;\n eventSlots?: EventSlots;\n eventStyleOverrides?:\n | StyleOverrides\n | ((event: Event) => StyleOverrides | undefined);\n isEventSelected?: FlagFn;\n isEventDisabled?: FlagFn;\n\n theme?: CalendarTheme;\n overLappingLayoutMode?: LayoutMode;\n\n mode?: CalendarMode;\n activeResourceId?: number;\n}\n\ntype Layout = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\nconst AnimatedFlashList = Animated.createAnimatedComponent(FlashList);\n\nconst CalendarInner: React.FC<CalendarProps> = (props) => {\n const {width} = useWindowDimensions();\n const isIOS = Platform.OS === 'ios';\n const binding = useCalendarBinding();\n\n const {\n date,\n numberOfColumns: numberOfColumnsProp = 3,\n startMinutes,\n hourHeight = 120,\n snapIntervalInMinutes = 5,\n timezone = Intl?.DateTimeFormat()?.resolvedOptions()?.timeZone,\n resources,\n onResourcePress,\n onBlockLongPress,\n onEventPress,\n onEventLongPress,\n onDisabledBlockPress,\n eventSlots,\n eventStyleOverrides,\n overLappingLayoutMode = 'stacked',\n mode = 'day',\n activeResourceId,\n } = props;\n\n const numberOfColumns = mode === 'day' ? numberOfColumnsProp : (mode === 'week' ? 7 : 3);\n const isMultiDay = mode !== 'day';\n const visibleDayCount = isMultiDay ? (mode === 'week' ? 7 : 3) : 1;\n const days = useMemo(\n () => Array.from({length: visibleDayCount}, (_, i) => addDays(date, i)),\n [date, visibleDayCount]\n );\n\n const snapInterval = (hourHeight / 60) * snapIntervalInMinutes;\n const onPressRef = React.useRef(onEventPress);\n const onLongPressRef = React.useRef(onEventLongPress);\n const internalOnLongPress = useRef<((e: Event) => void) | null>(null);\n const onDisabledBlockPressRef = React.useRef(onDisabledBlockPress);\n const selectedRef = useRef<FlagFn | undefined>(props.isEventSelected);\n const disabledRef = useRef<FlagFn | undefined>(props.isEventDisabled);\n\n const effectiveRenderer = useMemo<EventRenderer>(() => {\n return (p) => (\n <EventBlock\n {...p}\n slots={props.eventSlots}\n styleOverrides={props.eventStyleOverrides}\n />\n );\n }, [eventSlots, eventStyleOverrides]);\n\n const isEventSelectedStable = useCallback<FlagFn>(\n (ev) => (selectedRef.current ? selectedRef.current(ev) : false), []);\n\n const isEventDisabledStable = useCallback<FlagFn>(\n (ev) => (disabledRef.current ? disabledRef.current(ev) : false), []);\n\n // Keep refs up to date\n useEffect(() => {\n onPressRef.current = onEventPress;\n }, [onEventPress]);\n\n useEffect(() => {\n onLongPressRef.current = onEventLongPress;\n }, [onEventLongPress]);\n\n useEffect(() => {\n onDisabledBlockPressRef.current = onDisabledBlockPress;\n }, [onDisabledBlockPress]);\n\n useEffect(() => {\n rendererRef.current = effectiveRenderer;\n }, [effectiveRenderer]);\n\n useEffect(() => {\n selectedRef.current = props.isEventSelected;\n }, [props.isEventSelected]);\n\n useEffect(() => {\n disabledRef.current = props.isEventDisabled;\n }, [props.isEventDisabled]);\n\n const rendererRef = useRef<EventRenderer>(effectiveRenderer);\n const stableRenderer = useCallback<EventRenderer>((p) => rendererRef.current(p), []);\n\n const stableOnPress = React.useCallback((e: Event) => onPressRef.current?.(e), []);\n const stableOnDisabledBlockPress = React.useCallback((b: DisabledBlock) => onDisabledBlockPressRef.current?.(b), []);\n\n const {useGetSelectedEvent, useSetSelectedEvent, useSetDraggedEventDraft, useGetDraggedEventDraft} =\n useCalendarBinding();\n const selectedEvent = useGetSelectedEvent();\n const setSelectedEvent = useSetSelectedEvent();\n const setDraggedEventDraft = useSetDraggedEventDraft();\n\n const APPOINTMENT_BLOCK_WIDTH = (width - TIME_LABEL_WIDTH) / numberOfColumns;\n\n const hourHeightRef = useRef(hourHeight);\n const resourcesRef = useRef(resources);\n const apptWidthRef = useRef(APPOINTMENT_BLOCK_WIDTH);\n const isMultiDayRef = useRef(isMultiDay);\n const daysRef = useRef(days);\n\n useEffect(() => {\n hourHeightRef.current = hourHeight\n }, [hourHeight]);\n useEffect(() => {\n resourcesRef.current = resources\n }, [resources]);\n useEffect(() => {\n apptWidthRef.current = APPOINTMENT_BLOCK_WIDTH\n }, [APPOINTMENT_BLOCK_WIDTH]);\n useEffect(() => {\n isMultiDayRef.current = isMultiDay\n }, [isMultiDay]);\n useEffect(() => {\n daysRef.current = days\n }, [days]);\n\n useEffect(() => {\n if (!selectedEvent) {\n setDraggedEventDraft(null);\n }\n }, [selectedEvent]);\n\n useEffect(() => {\n scrollX.value = 0;\n }, [mode]);\n\n const verticalScrollViewRef = useAnimatedRef<Animated.ScrollView>();\n const headerScrollViewRef = useAnimatedRef<Animated.ScrollView>();\n\n const flashListRef = useRef<FlashList<any>>(null);\n const prevResourceIdsRef = useRef<(number)[]>([]);\n const [layout, setLayout] = useState<Layout | null>(null);\n\n const dateRef = useRef(date); // Store `date` in a ref to prevent re-renders\n\n const eventStartedTop = useSharedValue(0);\n const eventHeight = useSharedValue(0);\n\n const panXAbs = useSharedValue(0);\n const panYAbs = useSharedValue(0);\n const isPulling = useSharedValue(false);\n const isDragging = useSharedValue(false);\n\n const scrollX = useSharedValue(0);\n const scrollY = useSharedValue(0);\n const autoScrollSpeed = useSharedValue(0);\n const autoScrollXSpeed = useSharedValue(0);\n const lastHapticScrollY = useSharedValue(0);\n const lastXScrollTime = useSharedValue(0);\n\n const startedX = useSharedValue(0);\n const startedY = useSharedValue(0);\n const touchY = useSharedValue(0); // NEW\n\n const triggerHaptic = useCallback(() => {\n Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);\n }, []);\n\n const resourceIds = useMemo(() => {\n const ids = resources?.map(item => item?.id) || [];\n if (JSON.stringify(prevResourceIdsRef.current) !== JSON.stringify(ids)) {\n prevResourceIdsRef.current = ids;\n }\n return prevResourceIdsRef.current;\n }, [resources]);\n\n const finalizeDrag = React.useCallback((\n colIndex: number,\n adjustedTop: number,\n height: number\n ) => {\n // decide what column means based on mode\n const isMultiDay = mode !== 'day';\n const landedResourceId = !isMultiDay\n ? resourceIds[colIndex] // day mode → resource column\n : (activeResourceId ?? resourceIds[0]); // multi-day → fixed resource\n\n const landedDate = format(!isMultiDay\n ? date // day mode → resource column\n : days[colIndex], \"yyyy-MM-dd\") // day mode → constant day\n\n setDraggedEventDraft({\n event: selectedEvent!, // ensure this is not stale (store/ref)\n from: positionToMinutes(adjustedTop, hourHeight),\n to: positionToMinutes(adjustedTop + height, hourHeight),\n resourceId: landedResourceId,\n date: landedDate,\n });\n }, [mode, resourceIds, activeResourceId, selectedEvent, hourHeight, setDraggedEventDraft, days]);\n\n const columns: Column[] = useMemo(() => {\n if (!isMultiDay) {\n // Day mode: one day x multiple resources (keep current behavior)\n return resourceIds.map(resourceId => ({kind: 'resource', resourceId}));\n }\n // Multi-day mode: multiple days x single active resource\n return days.map((dayDate, dayIndex) => ({kind: 'day', dayIndex, dayDate}));\n }, [isMultiDay, resourceIds, days]);\n\n const panGesture = Gesture.Pan()\n .manualActivation(!isIOS)\n .enabled(layout !== null)\n .shouldCancelWhenOutside(false)\n .onTouchesMove((_evt, stateManager) => {\n 'worklet';\n if (isIOS) return;\n if (selectedEvent)\n stateManager.activate();\n else stateManager.end();\n })\n .onUpdate((evt) => {\n 'worklet';\n // Check if the event is draggable, only draggable if gesture is within the selected event block\n if (!evt || evt.y == null || evt.x == null) return;\n let draggable = false;\n let pullable = false;\n\n const draggableMinY = panYAbs.value - eventHeight.value / 2;\n const draggableMaxY = panYAbs.value + eventHeight.value / 2 - (eventHeight.value <= snapInterval * 3 * 2 ? snapInterval : snapInterval * 3);\n const pullableMaxY = panYAbs.value + eventHeight.value / 2;\n\n const blockMinX = panXAbs.value - APPOINTMENT_BLOCK_WIDTH / 2;\n const blockMaxX = panXAbs.value + APPOINTMENT_BLOCK_WIDTH / 2;\n\n touchY.value = evt.y; // NEW: always remember the last finger Y, for classic “finger parked on the edge” problem.\n\n if (evt.x >= blockMinX && evt.x <= blockMaxX) {\n draggable = evt.y >= draggableMinY && evt.y <= draggableMaxY;\n pullable = evt.y > draggableMaxY && evt.y <= pullableMaxY + snapInterval * 3;\n }\n\n if ((pullable && !isDragging.value) || isPulling.value) {\n isPulling.value = true;\n const onScreenTop = eventStartedTop.value - scrollY.value;\n const newHeight = evt.y - onScreenTop;\n const snappedHeight = Math.round(newHeight / snapInterval) * snapInterval;\n let finalHeight = Math.max(hourHeight / 4, snappedHeight);\n\n const totalDayHeight = 24 * hourHeight;\n const maxAllowedHeight = totalDayHeight - eventStartedTop.value;\n finalHeight = Math.min(finalHeight, maxAllowedHeight);\n\n if (finalHeight !== eventHeight.value) {\n eventHeight.value = finalHeight;\n panYAbs.value = onScreenTop + (finalHeight / 2);\n runOnJS(triggerHaptic)();\n }\n\n if (layout) {\n const AUTO_SCROLL_BUFFER = 30;\n\n if (evt.y > layout.height - AUTO_SCROLL_BUFFER) {\n autoScrollSpeed.value = 1;\n } else if (evt.y < AUTO_SCROLL_BUFFER && newHeight > hourHeight / 4) {\n autoScrollSpeed.value = -1;\n } else {\n autoScrollSpeed.value = 0;\n }\n } else {\n autoScrollSpeed.value = 0;\n }\n }\n\n if ((draggable && !isPulling.value) || isDragging.value) {\n isDragging.value = true; // Reset dragging state\n // --- Vertical Drag Logic ---\n const translatedY = Math.round(evt.translationY / snapInterval) * snapInterval;\n // 1. Calculate the proposed ABSOLUTE top position within the entire scroll content\n const proposedAbsoluteTop = (startedY.value - (eventHeight.value / 2)) + translatedY + scrollY.value;\n // 2. Snap this absolute position to the nearest grid line\n let snappedAbsoluteTop = Math.round(proposedAbsoluteTop / snapInterval) * snapInterval;\n // 3. Apply the absolute top boundary (12:00 AM)\n snappedAbsoluteTop = Math.max(0, snappedAbsoluteTop);\n // 4. Apply the absolute bottom boundary to keep the top of the appointment visible on screen\n if (layout) {\n // The maximum absolute top is the bottom of the screen plus the current scroll offset, with a one-block buffer.\n const maxAbsoluteTop = (layout.height + scrollY.value) - snapInterval;\n snappedAbsoluteTop = Math.min(snappedAbsoluteTop, maxAbsoluteTop);\n }\n // 5. Update shared values\n if (snappedAbsoluteTop !== eventStartedTop.value) {\n runOnJS(triggerHaptic)();\n eventStartedTop.value = snappedAbsoluteTop;\n }\n // 6. Convert the corrected absolute top back to a visual on-screen position\n panYAbs.value = (snappedAbsoluteTop - scrollY.value) + (eventHeight.value / 2);\n\n // --- Horizontal Drag Logic ---\n let panXAbsValue = Math.max(\n (APPOINTMENT_BLOCK_WIDTH) / 2 + TIME_LABEL_WIDTH,\n startedX.value + evt.translationX\n );\n\n if (layout?.width) {\n panXAbsValue = Math.min(\n layout.width - (APPOINTMENT_BLOCK_WIDTH) / 2,\n panXAbsValue\n );\n }\n panXAbs.value = panXAbsValue;\n\n // --- Auto-scroll Logic ---\n if (layout) {\n const AUTO_SCROLL_BUFFER = 30;\n\n if (evt.y > layout.height - AUTO_SCROLL_BUFFER) {\n autoScrollSpeed.value = 1;\n } else if (evt.y < AUTO_SCROLL_BUFFER) {\n autoScrollSpeed.value = -1;\n } else {\n autoScrollSpeed.value = 0;\n }\n\n if (panXAbs.value >= layout.width - APPOINTMENT_BLOCK_WIDTH / 2) {\n autoScrollXSpeed.value = 1;\n } else if (panXAbs.value <= APPOINTMENT_BLOCK_WIDTH / 2 + TIME_LABEL_WIDTH) {\n autoScrollXSpeed.value = -1;\n } else {\n autoScrollXSpeed.value = 0;\n }\n } else {\n autoScrollSpeed.value = 0;\n autoScrollXSpeed.value = 0;\n }\n }\n })\n .onEnd(() => {\n 'worklet';\n // Stop any active auto-scrolling\n autoScrollSpeed.value = 0;\n autoScrollXSpeed.value = 0;\n lastXScrollTime.value = 0;\n\n // --- Final Authoritative Calculation ---\n // Recalculate one last time to get the perfect final grid position.\n\n // Vertical\n const finalEventTop = (panYAbs.value - (eventHeight.value / 2)) + scrollY.value;\n let adjustedFinalEventTop = Math.round(finalEventTop / snapInterval) * snapInterval;\n adjustedFinalEventTop = Math.max(0, adjustedFinalEventTop); // Enforce final boundary\n const finalPanYValue = (adjustedFinalEventTop - scrollY.value) + (eventHeight.value / 2);\n\n // Horizontal\n const finalXOnScreen = panXAbs.value;\n const absoluteX = finalXOnScreen + scrollX.value;\n const newStaffIndex = Math.floor((absoluteX - TIME_LABEL_WIDTH) / APPOINTMENT_BLOCK_WIDTH);\n const colIndex = Math.max(0, Math.min(newStaffIndex, columns.length - 1));\n const finalPanXValue = TIME_LABEL_WIDTH + (colIndex * APPOINTMENT_BLOCK_WIDTH) - scrollX.value + (APPOINTMENT_BLOCK_WIDTH / 2);\n\n // This provides the smooth \"snap\" effect for both axes.\n panYAbs.value = withSpring(finalPanYValue);\n panXAbs.value = withSpring(finalPanXValue);\n\n // --- Update State ---\n // Set the final, correct data that will be used by onSave.\n if (!isPulling.value) {\n eventStartedTop.value = adjustedFinalEventTop;\n }\n\n // Set the starting points for the next drag from the final, snapped position.\n startedY.value = finalPanYValue;\n startedX.value = finalPanXValue;\n\n isPulling.value = false;\n isDragging.value = false\n\n runOnJS(finalizeDrag)(colIndex, adjustedFinalEventTop, eventHeight.value);\n });\n\n const scrollListTo = (x: number) => {\n flashListRef.current?.scrollToOffset({offset: x, animated: false});\n };\n\n // Auto-scrolling x effect when dragging an appointment on the edge of the screen\n useFrameCallback((frameInfo) => {\n if (autoScrollXSpeed.value === 0) {\n return;\n }\n\n const now = frameInfo.timeSinceFirstFrame;\n const scrollInterval = 500; // Time in ms between each scroll jump\n\n // Check if enough time has passed since the last scroll\n if (now - lastXScrollTime.value > scrollInterval) {\n lastXScrollTime.value = now; // Reset the timer\n\n // Calculate the increment as one full block width\n const increment = APPOINTMENT_BLOCK_WIDTH * Math.sign(autoScrollXSpeed.value);\n const newScrollX = scrollX.value + increment;\n\n // Use the Reanimated scrollTo function to jump to the next column\n runOnJS(scrollListTo)(newScrollX);\n // Trigger a haptic on each scroll jump\n runOnJS(Haptics.impactAsync)(Haptics.ImpactFeedbackStyle.Medium);\n }\n });\n\n useFrameCallback(() => {\n // Exit if we are not dragging or not supposed to be scrolling\n if (autoScrollSpeed.value === 0) {\n return;\n }\n\n // Adjust the divisor to control speed\n const increment = (snapInterval / 5) * Math.sign(autoScrollSpeed.value);\n const newScrollY = scrollY.value + increment;\n\n // Use the Reanimated scrollTo function to command the scroll view from the UI thread\n scrollTo(verticalScrollViewRef, 0, newScrollY, false);\n\n // --- Update eventStartedTop with the boundary check ---\n if (isDragging.value) {\n let currentEventTop = (panYAbs.value - (eventHeight.value / 2)) + newScrollY;\n currentEventTop = Math.round(currentEventTop / snapInterval) * snapInterval;\n // top boundary check\n eventStartedTop.value = Math.max(0, currentEventTop);\n }\n\n if (isPulling.value) {\n // recompute height using saved touchY and the newly scrolled content\n const onScreenTop = eventStartedTop.value - newScrollY;\n const newHeight = touchY.value - onScreenTop;\n const snappedHeight = Math.round(newHeight / snapInterval) * snapInterval;\n\n let finalHeight = Math.max(hourHeight / 4, snappedHeight);\n const totalDayHeight = 24 * hourHeight;\n const maxAllowedHeight = totalDayHeight - eventStartedTop.value;\n finalHeight = Math.min(finalHeight, maxAllowedHeight);\n\n if (finalHeight !== eventHeight.value) {\n eventHeight.value = finalHeight;\n panYAbs.value = onScreenTop + (finalHeight / 2);\n }\n\n if (hourHeight / 4 == finalHeight) {\n autoScrollSpeed.value = 0; // Stop auto-scrolling if height is minimum\n }\n }\n\n // --- Throttled Haptic Feedback ---\n const scrollDiff = Math.abs(newScrollY - lastHapticScrollY.value);\n\n if (scrollDiff >= snapInterval) {\n // Update the last position to the current position\n lastHapticScrollY.value = newScrollY;\n runOnJS(Haptics.impactAsync)(Haptics.ImpactFeedbackStyle.Medium);\n }\n });\n\n useEffect(() => {\n internalOnLongPress.current = (event: Event) => {\n onLongPressRef.current?.(event);\n\n // --- Compute vertical placement ---\n const hh = hourHeightRef.current;\n const eventTop = scalePosition(event.from, hh);\n const eventTo = event.to < event.from ? event.to + 1440 : event.to; // handle events that span past midnight\n const initialHeight = scalePosition(eventTo - event.from, hh);\n const panAbsValue = (eventTop - scrollY.value) + (initialHeight / 2);\n\n panYAbs.value = panAbsValue;\n startedY.value = panAbsValue;\n eventStartedTop.value = eventTop;\n\n // --- Compute horizontal placement ---\n const resources = resourcesRef.current;\n const days = daysRef.current;\n const APPOINTMENT_BLOCK_WIDTH = apptWidthRef.current;\n const isMultiDay = isMultiDayRef.current;\n const EPS = 0.0001;\n // Use floor (+EPS) so we never jump to the next col early\n const leftmostColumnIndex = Math.max(0, Math.floor((scrollX.value + EPS) / APPOINTMENT_BLOCK_WIDTH));\n\n let absoluteColIndex: number;\n\n if (!isMultiDay) {\n // day mode → column represents a resource\n absoluteColIndex = findResourceIndexFor(event.resourceId, resources?.map(r => r.id));\n } else {\n // multi-day → column represents a day\n absoluteColIndex = findDayIndexFor(event.date, days);\n }\n const screenColumn = absoluteColIndex - leftmostColumnIndex;\n\n const selectedAppointmentStartedX =\n TIME_LABEL_WIDTH +\n APPOINTMENT_BLOCK_WIDTH / 2 +\n APPOINTMENT_BLOCK_WIDTH * screenColumn;\n\n panXAbs.value = selectedAppointmentStartedX;\n startedX.value = selectedAppointmentStartedX;\n\n // --- Initialize state ---\n lastHapticScrollY.value = scrollY.value;\n eventHeight.value = initialHeight;\n setSelectedEvent(event);\n Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium);\n };\n }, []); // runs once; reads fresh values via refs\n\n const internalStableOnLongPress = useCallback((e: Event) => {\n internalOnLongPress.current?.(e);\n }, []);\n\n const onLayout = useCallback((evt: LayoutChangeEvent) => {\n setLayout(evt?.nativeEvent?.layout);\n }, []);\n\n const verticalScrollHandler = useAnimatedScrollHandler({\n onScroll: (event) => {\n scrollY.value = event?.contentOffset?.y;\n },\n });\n\n const flashListScrollHandler = useAnimatedScrollHandler({\n onScroll: (event) => {\n if (!isMultiDay) {\n const offsetX = event?.contentOffset?.x;\n // Sync header without going through JS\n scrollTo(headerScrollViewRef, offsetX, 0, false);\n scrollX.value = offsetX;\n }\n },\n });\n\n const handleBlockPress = useCallback((resourceId: number, time: string) => {\n Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Medium);\n const resource = resources.find(r => r.id === resourceId);\n\n if (onBlockLongPress)\n onBlockLongPress(resource!, new Date(time))\n }, [resources, onBlockLongPress]);\n\n useEffect(() => {\n const handleOrientationChange = () => {\n if (selectedEvent)\n setSelectedEvent(null);\n };\n\n const subscription = Dimensions.addEventListener('change', handleOrientationChange);\n\n return () => {\n subscription.remove();\n };\n }, [setSelectedEvent, selectedEvent]);\n\n useEffect(() => {\n dateRef.current = date; // Update the ref whenever date prop changes\n }, [date]);\n\n const renderItem = useCallback(({item, index}: any) => {\n // Resolve which date & resource this column represents:\n const rid = !isMultiDay\n ? item\n : (activeResourceId ?? resourceIds[0]); // multi-day uses the single active resource\n\n const dayDate = !isMultiDay\n ? undefined // day mode uses the single base day (existing)\n : (item as Extract<Column, { kind: 'day' }>).dayDate;\n\n return (\n <View key={index} style={{width: APPOINTMENT_BLOCK_WIDTH}}>\n {/* Add 15-minute background blocks for each user column */}\n <View style={styles.timelineContainer}>\n <EventGridBlocksSkia\n hourHeight={hourHeight}\n APPOINTMENT_BLOCK_WIDTH={APPOINTMENT_BLOCK_WIDTH}\n handleBlockPress={(time) => handleBlockPress(rid, combineDateAndTime(dayDate ?? dateRef.current, time))}\n />\n <DisabledIntervals\n id={rid!}\n date={dayDate}\n APPOINTMENT_BLOCK_WIDTH={APPOINTMENT_BLOCK_WIDTH}\n hourHeight={hourHeight}\n />\n <DisabledBlocks\n id={rid!}\n date={dayDate}\n APPOINTMENT_BLOCK_WIDTH={APPOINTMENT_BLOCK_WIDTH}\n hourHeight={hourHeight}\n onDisabledBlockPress={stableOnDisabledBlockPress}\n />\n <EventBlocks\n id={rid!}\n date={dayDate}\n EVENT_BLOCK_WIDTH={APPOINTMENT_BLOCK_WIDTH}\n hourHeight={hourHeight}\n onPress={stableOnPress}\n onLongPress={internalStableOnLongPress}\n isEventSelected={isEventSelectedStable}\n isEventDisabled={isEventDisabledStable}\n eventRenderer={stableRenderer}\n mode={overLappingLayoutMode}\n />\n </View>\n </View>\n );\n }, [\n isMultiDay,\n activeResourceId,\n resourceIds,\n APPOINTMENT_BLOCK_WIDTH,\n hourHeight,\n stableRenderer,\n isEventSelectedStable,\n isEventDisabledStable,\n overLappingLayoutMode,\n stableOnPress,\n internalStableOnLongPress,\n stableOnDisabledBlockPress,\n dateRef\n ]);\n\n return <>\n <StoreFeeder resources={resources} store={binding} baseDate={date}/>\n <View style={{flex: 1}}>\n {\n !isMultiDay ? <View>\n <Animated.ScrollView\n style={{backgroundColor: \"white\"}}\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={{\n overflow: \"visible\",\n paddingLeft: TIME_LABEL_WIDTH,\n paddingVertical: 15,\n }}\n horizontal\n scrollEventThrottle={16}\n decelerationRate=\"fast\"\n ref={headerScrollViewRef}\n scrollEnabled={false}\n >\n <ResourcesComponent\n date={date}\n resourceIds={resourceIds}\n APPOINTMENT_BLOCK_WIDTH={APPOINTMENT_BLOCK_WIDTH}\n onResourcePress={onResourcePress}\n />\n </Animated.ScrollView>\n </View>\n : <DaysComponent\n APPOINTMENT_BLOCK_WIDTH={APPOINTMENT_BLOCK_WIDTH}\n date={date}\n mode={mode}\n activeResourceId={activeResourceId ?? resourceIds[0]}\n onResourcePress={onResourcePress}\n />\n }\n <GestureDetector gesture={panGesture}>\n <Animated.View\n key={numberOfColumns + width + hourHeight}\n onLayout={onLayout}\n style={{\n flex: 1,\n overflow: \"hidden\"\n }}\n >\n {selectedEvent && <View style={{\n position: 'absolute',\n top: 0,\n left: TIME_LABEL_WIDTH,\n paddingLeft: TIME_LABEL_WIDTH,\n width: width - TIME_LABEL_WIDTH,\n height: '100%',\n backgroundColor: 'rgba(0, 0, 0, 0.1)',\n zIndex: 1,\n }}/>}\n <Animated.ScrollView\n scrollEnabled={!selectedEvent}\n onScroll={verticalScrollHandler}\n ref={verticalScrollViewRef} // Ref for vertical scrolling\n scrollEventThrottle={16}\n snapToInterval={hourHeight}\n decelerationRate=\"fast\"\n snapToAlignment=\"start\" // Align the column to the start\n style={styles.container}\n contentContainerStyle={{flexDirection: 'row', paddingRight: TIME_LABEL_WIDTH}}\n >\n <TimeLabels\n startMinutes={startMinutes}\n layout={layout}\n hourHeight={hourHeight}\n totalTimelineWidth={APPOINTMENT_BLOCK_WIDTH * numberOfColumns}\n timezone={timezone}\n date={date}\n ref={verticalScrollViewRef}\n />\n <AnimatedFlashList\n extraData={numberOfColumns + width + hourHeight + (overLappingLayoutMode === 'stacked' ? 1 : 0)}\n scrollEnabled={!selectedEvent}\n ref={flashListRef}\n onScroll={flashListScrollHandler} // Sync with header\n estimatedItemSize={APPOINTMENT_BLOCK_WIDTH}\n removeClippedSubviews={true}\n data={!isMultiDay ? resourceIds : columns}\n horizontal={true}\n renderItem={renderItem}\n keyExtractor={(item, index) => index + \"\"}\n snapToInterval={APPOINTMENT_BLOCK_WIDTH}\n decelerationRate=\"fast\"\n snapToAlignment=\"start\" // Align the column to the start\n />\n </Animated.ScrollView>\n {\n selectedEvent &&\n <DraggableEvent\n selectedEvent={selectedEvent}\n APPOINTMENT_BLOCK_WIDTH={APPOINTMENT_BLOCK_WIDTH}\n hourHeight={hourHeight}\n eventStartedTop={eventStartedTop}\n eventHeight={eventHeight}\n panXAbs={panXAbs}\n panYAbs={panYAbs}\n slots={props.eventSlots}\n styleOverrides={props.eventStyleOverrides}\n />\n }\n </Animated.View>\n </GestureDetector>\n </View>\n </>\n}\n\nconst Calendar: React.FC<CalendarProps> = ({theme, ...rest}) => {\n return (\n <CalendarThemeProvider theme={theme}>\n <CalendarInner {...rest} />\n </CalendarThemeProvider>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n backgroundColor: '#fff',\n },\n timelineContainer: {\n borderColor: '#ddd',\n borderRightWidth: 1,\n position: 'relative',\n height: \"100%\",\n }\n});\n\nexport default Calendar;\n"]}
|