@acorex/components 21.0.0-next.63 → 21.0.0-next.65
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/fesm2022/acorex-components-avatar.mjs +2 -2
- package/fesm2022/acorex-components-avatar.mjs.map +1 -1
- package/fesm2022/acorex-components-button.mjs +2 -2
- package/fesm2022/acorex-components-button.mjs.map +1 -1
- package/fesm2022/acorex-components-calendar.mjs +2 -2
- package/fesm2022/acorex-components-calendar.mjs.map +1 -1
- package/fesm2022/acorex-components-color-box.mjs +2 -2
- package/fesm2022/acorex-components-color-box.mjs.map +1 -1
- package/fesm2022/acorex-components-data-pager.mjs +2 -2
- package/fesm2022/acorex-components-data-pager.mjs.map +1 -1
- package/fesm2022/acorex-components-data-table.mjs +2 -2
- package/fesm2022/acorex-components-data-table.mjs.map +1 -1
- package/fesm2022/acorex-components-form.mjs +6 -8
- package/fesm2022/acorex-components-form.mjs.map +1 -1
- package/fesm2022/acorex-components-json-viewer.mjs +11 -5
- package/fesm2022/acorex-components-json-viewer.mjs.map +1 -1
- package/fesm2022/acorex-components-kanban.mjs +2 -2
- package/fesm2022/acorex-components-kanban.mjs.map +1 -1
- package/fesm2022/acorex-components-kbd.mjs +2 -2
- package/fesm2022/acorex-components-kbd.mjs.map +1 -1
- package/fesm2022/acorex-components-media-viewer.mjs +2 -2
- package/fesm2022/acorex-components-media-viewer.mjs.map +1 -1
- package/fesm2022/acorex-components-phone-box.mjs +12 -3
- package/fesm2022/acorex-components-phone-box.mjs.map +1 -1
- package/fesm2022/acorex-components-rate-picker.mjs +2 -2
- package/fesm2022/acorex-components-rate-picker.mjs.map +1 -1
- package/fesm2022/acorex-components-scheduler.mjs +4 -4
- package/fesm2022/acorex-components-scheduler.mjs.map +1 -1
- package/fesm2022/acorex-components-side-menu.mjs +2 -2
- package/fesm2022/acorex-components-side-menu.mjs.map +1 -1
- package/fesm2022/acorex-components-step-wizard.mjs +2 -2
- package/fesm2022/acorex-components-step-wizard.mjs.map +1 -1
- package/fesm2022/acorex-components-tree-view.mjs +7 -3
- package/fesm2022/acorex-components-tree-view.mjs.map +1 -1
- package/fesm2022/acorex-components-uploader.mjs +2 -2
- package/fesm2022/acorex-components-uploader.mjs.map +1 -1
- package/fesm2022/acorex-components-wysiwyg.mjs +3 -3
- package/fesm2022/acorex-components-wysiwyg.mjs.map +1 -1
- package/json-viewer/index.d.ts +3 -2
- package/package.json +7 -7
- package/phone-box/index.d.ts +4 -1
- package/tree-view/index.d.ts +5 -1
- package/wysiwyg/index.d.ts +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-components-scheduler.mjs","sources":["../../../../packages/components/scheduler/src/lib/scheduler.service.ts","../../../../packages/components/scheduler/src/lib/views/agenda/scheduler-agenda-view.component.ts","../../../../packages/components/scheduler/src/lib/views/agenda/scheduler-agenda-view.component.html","../../../../packages/components/scheduler/src/lib/views/day/scheduler-day-view.component.ts","../../../../packages/components/scheduler/src/lib/views/day/scheduler-day-view.component.html","../../../../packages/components/scheduler/src/lib/views/month/scheduler-month-view.component.ts","../../../../packages/components/scheduler/src/lib/views/month/scheduler-month-view.component.html","../../../../packages/components/scheduler/src/lib/views/timeline-day/scheduler-timeline-day-view.component.ts","../../../../packages/components/scheduler/src/lib/views/timeline-day/scheduler-timeline-day-view.component.html","../../../../packages/components/scheduler/src/lib/views/timeline-month/scheduler-timeline-month-view.component.ts","../../../../packages/components/scheduler/src/lib/views/timeline-month/scheduler-timeline-month-view.component.html","../../../../packages/components/scheduler/src/lib/views/timeline-multi-day/scheduler-timeline-multi-day-view.component.ts","../../../../packages/components/scheduler/src/lib/views/timeline-multi-day/scheduler-timeline-multi-day-view.component.html","../../../../packages/components/scheduler/src/lib/views/timeline-year/scheduler-timeline-year-view.component.ts","../../../../packages/components/scheduler/src/lib/views/timeline-year/scheduler-timeline-year-view.component.html","../../../../packages/components/scheduler/src/lib/views/week/scheduler-week-view.component.ts","../../../../packages/components/scheduler/src/lib/views/week/scheduler-week-view.component.html","../../../../packages/components/scheduler/src/lib/scheduler.component.ts","../../../../packages/components/scheduler/src/lib/scheduler.component.html","../../../../packages/components/scheduler/src/lib/scheduler.module.ts","../../../../packages/components/scheduler/src/acorex-components-scheduler.ts"],"sourcesContent":["import { AXCalendarService, AXDateTime, AXHolidayDate } from '@acorex/core/date-time';\nimport { AXFormatService } from '@acorex/core/format';\nimport { inject, Injectable, signal } from '@angular/core';\nimport { isEqual } from 'lodash-es';\nimport {\n AXDayOfWeekName,\n AXSchedulerActiveAppointmentsInBlock,\n AXSchedulerAppointment,\n AXSchedulerAppointmentSegment,\n AXSchedulerBlockIdentifier,\n AXSchedulerResource,\n AXSchedulerView,\n} from './scheduler.class';\nimport { AXSchedulerAppointmentMouseEvent, AXSchedulerSlotMouseEvent } from './scheduler.component';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXSchedulerService {\n private formatService = inject(AXFormatService);\n private calendarService = inject(AXCalendarService);\n\n readonly HOURS_PER_DAY = 24;\n readonly MINUTES_PER_HOUR = 60;\n readonly BLOCK_DURATION_MINUTES = 30;\n readonly MILLISECONDS_PER_MINUTE = 60 * 1000;\n readonly MILLISECONDS_PER_DAY = this.HOURS_PER_DAY * this.MINUTES_PER_HOUR * this.MILLISECONDS_PER_MINUTE;\n\n internalWeekend = signal<number[]>([]);\n internalHoliday = signal<AXHolidayDate[]>([]);\n\n /**\n * Checks if two appointments overlap in time.\n *\n * @param appointmentA - First appointment to check.\n * @param appointmentB - Second appointment to check.\n * @returns boolean - True if appointments overlap, false otherwise.\n */\n doAppointmentsOverlap(appointmentA: AXSchedulerAppointment, appointmentB: AXSchedulerAppointment): boolean {\n if (!appointmentA?.startDate || !appointmentA.endDate || !appointmentB?.startDate || !appointmentB.endDate) {\n return false;\n }\n const startA = appointmentA.startDate.getTime();\n const endA = appointmentA.endDate.getTime();\n const startB = appointmentB.startDate.getTime();\n const endB = appointmentB.endDate.getTime();\n // Uses strict overlap check (change < / > to <= / >= if touching boundaries count)\n return startA < endB && endA > startB;\n }\n\n /**\n * Calculates appointment duration in minutes.\n *\n * @param Appointment - The appointment to calculate duration for.\n * @returns number - Duration in minutes.\n */\n calculateDurationInMinutes(Appointment: AXSchedulerAppointment): number {\n if (!Appointment?.startDate || !Appointment.endDate) return 0;\n const durationMillis = Appointment.endDate.getTime() - Appointment.startDate.getTime();\n return Math.max(0, durationMillis / this.MILLISECONDS_PER_MINUTE);\n }\n\n /**\n * Gets the day index and block index for a given date time within the view context.\n *\n * @param dateTime - The date time to get block identifier for.\n * @param viewStartDate - Start date of the view.\n * @param startHour - Start hour of the view.\n * @param endHour - End hour of the view (exclusive).\n * @param viewTotalDays - Total days in the view (default: 1).\n * @returns AXSchedulerBlockIdentifier | null - Block identifier or null if outside view.\n */\n getBlockIdentifier(\n dateTime: AXDateTime,\n viewStartDate: AXDateTime,\n startHour: number,\n endHour: number, // Exclusive end hour\n viewTotalDays = 1, // Default to 1 for day view\n ): AXSchedulerBlockIdentifier | null {\n if (!viewStartDate || !dateTime || typeof startHour !== 'number' || typeof endHour !== 'number') {\n return null;\n }\n const viewEndDate = viewStartDate.add('day', viewTotalDays); // Calculate exclusive end date\n\n // Check if dateTime is within the view's date and time range\n if (\n dateTime.compare(viewStartDate, 'day') < 0 ||\n dateTime.compare(viewEndDate, 'day') >= 0 || // Check against exclusive end date\n dateTime.hour < startHour ||\n dateTime.hour >= endHour // Check against exclusive end hour\n ) {\n return null;\n }\n\n // Calculate day index relative to view start\n const dayIndex = Math.floor((dateTime.date.getTime() - viewStartDate.date.getTime()) / this.MILLISECONDS_PER_DAY);\n\n // Ensure dayIndex is valid for the view duration\n if (dayIndex < 0 || dayIndex >= viewTotalDays) {\n return null;\n }\n\n const minutesIntoDay = dateTime.hour * this.MINUTES_PER_HOUR + dateTime.minute;\n const minutesIntoViewHours = minutesIntoDay - startHour * this.MINUTES_PER_HOUR;\n\n // This check should be redundant due to initial hour check, but safe to keep\n if (minutesIntoViewHours < 0) return null;\n\n const blockIndex = Math.floor(minutesIntoViewHours / this.BLOCK_DURATION_MINUTES);\n\n return { dayIndex, blockIndex };\n }\n\n /**\n * Groups appointments by the blocks they are ACTIVE in for a given view.\n *\n * @param singleDayAppointments - Array of appointment segments.\n * @param viewStartDate - Start date of the view.\n * @param startHour - Start hour of the view.\n * @param endHour - End hour of the view.\n * @param viewTotalDays - Total days in the view.\n * @returns AXSchedulerActiveAppointmentsInBlock - Active appointments grouped by blocks.\n */\n private calculateActiveAppointmentsInBlock(\n singleDayAppointments: AXSchedulerAppointmentSegment[],\n viewStartDate: AXDateTime,\n startHour: number,\n endHour: number,\n viewTotalDays: number, // Now required\n ): AXSchedulerActiveAppointmentsInBlock {\n const blocks: AXSchedulerActiveAppointmentsInBlock = {};\n if (!viewStartDate || typeof startHour !== 'number' || typeof endHour !== 'number' || viewTotalDays <= 0) {\n return blocks;\n }\n const viewEndDate = viewStartDate.add('day', viewTotalDays); // Exclusive end date\n // Calculate total blocks based on consistent block duration\n const totalBlocksPerDay = Math.max(\n 0,\n (endHour - startHour) * (this.MINUTES_PER_HOUR / this.BLOCK_DURATION_MINUTES),\n );\n\n singleDayAppointments.forEach((appointment) => {\n if (!appointment.startDate || !appointment.endDate || !appointment.id) return;\n\n const appointmentEndDate = this.calendarService.create(appointment.endDate);\n const appointmentStartDate = this.calendarService.create(appointment.startDate);\n\n // Clamp appointment start/end times to the view boundaries (days and hours)\n let effectiveStart = appointmentStartDate.compare(viewStartDate) < 0 ? viewStartDate : appointmentStartDate;\n if (effectiveStart.hour < startHour) effectiveStart = effectiveStart.set('hour', startHour).startOf('hour');\n\n let effectiveEnd = appointmentEndDate.compare(viewEndDate) >= 0 ? viewEndDate : appointmentEndDate;\n if (effectiveEnd.hour >= endHour) {\n const endDayBase = effectiveEnd.compare(viewEndDate) >= 0 ? viewEndDate.add('day', -1) : effectiveEnd;\n effectiveEnd = endDayBase.set('hour', endHour).startOf('hour');\n }\n\n // Get start block info using the specified viewTotalDays\n const startInfo = this.getBlockIdentifier(effectiveStart, viewStartDate, startHour, endHour, viewTotalDays);\n if (!startInfo) return; // Appointment starts completely outside view\n\n // Get end block info (last block occupied) using the specified viewTotalDays\n const timeBeforeEnd = effectiveEnd.add('minute', -1);\n const endInfo = this.getBlockIdentifier(timeBeforeEnd, viewStartDate, startHour, endHour, viewTotalDays);\n // If endInfo is null, it means the appointment ends before the viewable part starts,\n // or exactly at the start, so it occupies no blocks. Handle this case.\n if (\n !endInfo ||\n endInfo.dayIndex < startInfo.dayIndex ||\n (endInfo.dayIndex === startInfo.dayIndex && endInfo.blockIndex < startInfo.blockIndex)\n ) {\n return; // Appointment effectively has no duration within the viewable blocks\n }\n\n // Iterate through the days and blocks the appointment spans within the view\n for (let dIdx = startInfo.dayIndex; dIdx <= endInfo.dayIndex; dIdx++) {\n // Clamp day index just in case (should be handled by getBlockIdentifier checks)\n if (dIdx < 0 || dIdx >= viewTotalDays) continue;\n\n const startBlock = dIdx === startInfo.dayIndex ? startInfo.blockIndex : 0;\n // Make sure endBlock doesn't exceed the calculated totalBlocksPerDay\n const endBlock = dIdx === endInfo.dayIndex ? endInfo.blockIndex : totalBlocksPerDay - 1;\n\n if (!blocks[dIdx]) blocks[dIdx] = {};\n\n for (let bIdx = startBlock; bIdx <= endBlock; bIdx++) {\n // Final check for block index validity\n if (bIdx >= 0 && bIdx < totalBlocksPerDay) {\n if (!blocks[dIdx][bIdx]) blocks[dIdx][bIdx] = [];\n // Avoid duplicates if the same appointment is processed multiple times (shouldn't happen with outer loop)\n if (!blocks[dIdx][bIdx].some((e) => e.id === appointment.id)) {\n blocks[dIdx][bIdx].push(appointment);\n }\n }\n }\n }\n });\n return blocks;\n }\n\n /**\n * Calculates day view concurrency information for appointments.\n *\n * @param singleDayAppointments - Array of appointment segments.\n * @param viewStartDate - Start date of the view.\n * @param startHour - Start hour of the view.\n * @param endHour - End hour of the view.\n * @returns Map<any, { maxConcurrency: number; effectiveTotalColumns: number }> - Concurrency information map.\n */\n calculateDayViewConcurrencyInfo(\n singleDayAppointments: AXSchedulerAppointmentSegment[], // These are segments for the current day\n viewStartDate: AXDateTime,\n startHour: number,\n endHour: number,\n ): Map<any, { maxConcurrency: number; effectiveTotalColumns: number }> {\n const resultInfo = new Map<any, { maxConcurrency: number; effectiveTotalColumns: number }>();\n if (singleDayAppointments.length === 0) return resultInfo;\n\n const activeAppointmentsMap = this.calculateActiveAppointmentsInBlock(\n singleDayAppointments,\n viewStartDate,\n startHour,\n endHour,\n 1, // Day view\n );\n const blocks = activeAppointmentsMap[0] ?? {};\n\n // 1. Calculate initial maxConcurrency for each appointment segment\n const maxConcurrencyMap = new Map<any, number>();\n singleDayAppointments.forEach((segment) => {\n let maxOverlapInSegmentBlocks = 0;\n const segmentStartMinutes = segment.startDate.getHours() * this.MINUTES_PER_HOUR + segment.startDate.getMinutes();\n const segmentEndMinutes = segment.endDate.getHours() * this.MINUTES_PER_HOUR + segment.endDate.getMinutes();\n\n // Determine blocks this segment occupies relative to view's startHour\n const viewRelativeStartMinutes = Math.max(0, segmentStartMinutes - startHour * this.MINUTES_PER_HOUR);\n const viewRelativeEndMinutes = Math.min(\n (endHour - startHour) * this.MINUTES_PER_HOUR,\n segmentEndMinutes - startHour * this.MINUTES_PER_HOUR,\n );\n\n const firstBlockIndex = Math.floor(viewRelativeStartMinutes / this.BLOCK_DURATION_MINUTES);\n const lastBlockIndex = Math.floor((viewRelativeEndMinutes - 1) / this.BLOCK_DURATION_MINUTES); // -1 because end is exclusive for block counting\n\n for (let blockIdx = firstBlockIndex; blockIdx <= lastBlockIndex; blockIdx++) {\n const appointmentsInBlock = blocks[blockIdx];\n if (appointmentsInBlock) {\n maxOverlapInSegmentBlocks = Math.max(maxOverlapInSegmentBlocks, appointmentsInBlock.length);\n }\n }\n maxConcurrencyMap.set(segment.id, maxOverlapInSegmentBlocks || 1);\n });\n\n // 2. Iteratively determine effectiveTotalColumns for groups of overlapping appointments\n const initialEffectiveTotalColumns = new Map<any, number>();\n singleDayAppointments.forEach((segment) => {\n initialEffectiveTotalColumns.set(segment.id, maxConcurrencyMap.get(segment.id) || 1);\n });\n\n let changed = true;\n while (changed) {\n changed = false;\n singleDayAppointments.forEach((segmentA) => {\n singleDayAppointments.forEach((segmentB) => {\n if (segmentA.id === segmentB.id) return;\n\n if (this.doAppointmentsOverlap(segmentA, segmentB)) {\n const etcA = initialEffectiveTotalColumns.get(segmentA.id) || 1;\n const etcB = initialEffectiveTotalColumns.get(segmentB.id) || 1;\n const maxETC = Math.max(etcA, etcB);\n\n if (etcA !== maxETC) {\n initialEffectiveTotalColumns.set(segmentA.id, maxETC);\n changed = true;\n }\n if (etcB !== maxETC) {\n initialEffectiveTotalColumns.set(segmentB.id, maxETC);\n changed = true;\n }\n }\n });\n });\n }\n\n // Populate final result\n singleDayAppointments.forEach((segment) => {\n resultInfo.set(segment.id, {\n maxConcurrency: maxConcurrencyMap.get(segment.id) || 1,\n effectiveTotalColumns: initialEffectiveTotalColumns.get(segment.id) || 1,\n });\n });\n\n return resultInfo;\n }\n\n /**\n * Groups appointments by day within a date range.\n *\n * @param appointments - Array of appointments.\n * @param viewStartDate - Start date of the view.\n * @param viewEndDate - End date of the view.\n * @returns Map<string, AXSchedulerAppointment[]> - Appointments grouped by day.\n */\n groupAppointmentsByDay(\n appointments: AXSchedulerAppointment[],\n viewStartDate: AXDateTime, // First day visible in the grid\n viewEndDate: AXDateTime, // Last day visible in the grid\n ): Map<string, AXSchedulerAppointment[]> {\n const groupedAppointments = new Map<string, AXSchedulerAppointment[]>();\n if (!appointments || appointments.length === 0 || !viewStartDate || !viewEndDate) {\n return groupedAppointments;\n }\n\n // Pre-calculate the end date for comparison (exclusive)\n const exclusiveViewEndDate = viewEndDate.add('day', 1);\n\n appointments.forEach((appointment) => {\n if (!appointment.startDate || !appointment.endDate || !appointment.id) return;\n\n // Determine the effective start and end dates of the appointment clamped by the view range\n const appointmentStart = this.calendarService.create(appointment.startDate);\n const appointmentEnd = this.calendarService.create(appointment.endDate);\n\n // Skip if appointment ends before the view starts or starts after the view ends\n if (\n appointmentEnd.compare(viewStartDate, 'day') < 0 ||\n appointmentStart.compare(exclusiveViewEndDate, 'day') >= 0\n ) {\n return;\n }\n\n // Clamp start date to the view start date\n let currentDay =\n appointmentStart.compare(viewStartDate, 'day') < 0 ? viewStartDate : appointmentStart.startOf('day');\n\n // Loop through each day the appointment spans within the view range\n let safeCount = 0; // Prevent infinite loops\n while (\n currentDay.compare(appointmentEnd, 'day') <= 0 &&\n currentDay.compare(exclusiveViewEndDate, 'day') < 0 &&\n safeCount < 100\n ) {\n const dateString = this.formatService.format(currentDay, 'datetime', { format: 'YYYY-MM-DD' }); // Use a consistent key format\n\n if (!groupedAppointments.has(dateString)) {\n groupedAppointments.set(dateString, []);\n }\n // Add the appointment if it's not already in the list for that day\n if (!groupedAppointments.get(dateString).some((e) => e.id === appointment.id)) {\n groupedAppointments.get(dateString).push(appointment);\n }\n\n currentDay = currentDay.add('day', 1);\n safeCount++;\n }\n if (safeCount >= 100) {\n console.warn('Safety break hit in groupAppointmentsByDay loop for appointment:', appointment.id);\n }\n });\n\n return groupedAppointments;\n }\n\n /**\n * Gets the day of week number for a given day name.\n *\n * @param dayName - The day name to get number for.\n * @returns number - Day number (1-7, where 1 is Sunday).\n */\n getDayOfWeekNumber(dayName: AXDayOfWeekName): number {\n switch (dayName) {\n case 'sunday':\n return 1;\n case 'monday':\n return 2;\n case 'tuesday':\n return 3;\n case 'wednesday':\n return 4;\n case 'thursday':\n return 5;\n case 'friday':\n return 6;\n case 'saturday':\n return 7;\n default:\n console.warn(`Invalid day name: ${dayName}. Defaulting to Sunday (1).`);\n return 1;\n }\n }\n\n /**\n * Gets slot data for a given start date and view.\n *\n * @param startDate - Start date for the slot.\n * @param view - View type.\n * @returns { startDate: AXDateTime; endDate: AXDateTime; view: AXSchedulerView } - Slot data.\n */\n getSlotData(\n startDate: AXDateTime,\n view: AXSchedulerView,\n ): { startDate: AXDateTime; endDate: AXDateTime; view: AXSchedulerView } {\n let endDate: AXDateTime;\n switch (view) {\n case 'day':\n case 'week':\n endDate = startDate.add('minute', this.BLOCK_DURATION_MINUTES);\n break;\n case 'timeline-day':\n case 'timeline-multi-day':\n endDate = startDate.add('minute', this.BLOCK_DURATION_MINUTES * 2);\n break;\n case 'month':\n case 'agenda':\n case 'timeline-month':\n case 'timeline-year':\n startDate = startDate.startOf('day');\n endDate = startDate.endOf('day');\n break;\n }\n return { startDate, endDate, view };\n }\n\n /**\n * Handles events for appointments and slots.\n *\n * @param event - The event to handle.\n * @param eventOutputMap - Map of event outputs.\n * @param eventType - Type of event ('appointment' or 'slot').\n */\n handleEvent(\n event: AXSchedulerSlotMouseEvent | AXSchedulerAppointmentMouseEvent,\n eventOutputMap,\n eventType: 'appointment' | 'slot',\n ) {\n const mouseEvent = event.nativeEvent;\n mouseEvent.preventDefault();\n mouseEvent.stopPropagation();\n if (eventType === 'appointment') {\n const appointmentOutputMap = eventOutputMap[eventType];\n const emitter = appointmentOutputMap[mouseEvent.type as keyof typeof appointmentOutputMap];\n if (emitter) emitter.emit(event as AXSchedulerAppointmentMouseEvent);\n }\n if (eventType === 'slot') {\n const slotOutputMap = eventOutputMap[eventType];\n const emitter = slotOutputMap[mouseEvent.type as keyof typeof slotOutputMap];\n if (emitter) emitter.emit(event as AXSchedulerSlotMouseEvent);\n }\n }\n\n /**\n * Calculates timeline layout for appointments.\n *\n * @param appt - The appointment to calculate layout for.\n * @param viewStartHour - Start hour of the view.\n * @param viewEndHour - End hour of the view.\n * @returns { left: string; width: string } | null - Layout information or null.\n */\n calculateTimelineLayout(\n // `appt` here will be an AXSchedulerAppointmentSegmentType when called from TimelineDayView\n appt: AXSchedulerAppointment,\n viewStartHour: number, // e.g., 8 for 8 AM\n viewEndHour: number, // e.g., 18 for 6 PM (timeline runs from 8:00 up to, but not including, 18:00)\n ): { left: string; width: string } | null {\n if (\n !appt?.startDate ||\n !appt.endDate ||\n typeof viewStartHour !== 'number' ||\n typeof viewEndHour !== 'number' ||\n viewStartHour >= viewEndHour // Basic sanity check\n ) {\n console.warn('calculateTimelineLayout: Invalid input', { appt, viewStartHour, viewEndHour });\n return null;\n }\n\n const totalViewDurationMinutes = (viewEndHour - viewStartHour) * 60;\n if (totalViewDurationMinutes <= 0) return null; // No viewable duration\n\n // Segment's start and end times (these are already clipped to the day by getClonedAppointmentSegmentOnDay)\n const segmentStart = appt.startDate;\n const segmentEnd = appt.endDate;\n\n // --- Calculate Start Position (left) ---\n // Effective start of the segment within the view's hours for THIS day\n let effectiveSegmentStartMinutesInDay = segmentStart.getHours() * 60 + segmentStart.getMinutes();\n\n // Clamp to viewStartHour for calculation if segment starts before viewable hours (shouldn't happen if segmenter worked)\n effectiveSegmentStartMinutesInDay = Math.max(effectiveSegmentStartMinutesInDay, viewStartHour * 60);\n // Clamp to viewEndHour for calculation if segment starts after viewable hours (shouldn't happen)\n effectiveSegmentStartMinutesInDay = Math.min(effectiveSegmentStartMinutesInDay, viewEndHour * 60);\n\n const minutesFromViewStartToSegmentStart = effectiveSegmentStartMinutesInDay - viewStartHour * 60;\n\n // If segment effectively starts before the viewable part (after clamping), it means it's not visible or starts at 0%\n if (\n minutesFromViewStartToSegmentStart < 0 &&\n Math.abs(minutesFromViewStartToSegmentStart) > 1e-6 /*epsilon for float issues*/\n ) {\n // This case should ideally be caught by the segmenter or initial overlap checks.\n // If it happens, treat as starting at 0% but it might mean no visible part.\n }\n\n const leftPercentage = (Math.max(0, minutesFromViewStartToSegmentStart) / totalViewDurationMinutes) * 100;\n\n // --- Calculate Duration and Width ---\n // Effective end of the segment within the view's hours for THIS day\n let effectiveSegmentEndMinutesInDay = segmentEnd.getHours() * 60 + segmentEnd.getMinutes();\n if (segmentEnd.getHours() === 0 && segmentEnd.getMinutes() === 0 && segmentEnd.getTime() > segmentStart.getTime()) {\n // If segment ends exactly at midnight (00:00 of next day, meaning it filled up to 24:00 of current day)\n effectiveSegmentEndMinutesInDay = 24 * 60;\n }\n\n // Clamp to viewEndHour for calculation\n effectiveSegmentEndMinutesInDay = Math.min(effectiveSegmentEndMinutesInDay, viewEndHour * 60);\n // Clamp to viewStartHour for calculation (if segment ends before view starts)\n effectiveSegmentEndMinutesInDay = Math.max(effectiveSegmentEndMinutesInDay, viewStartHour * 60);\n\n const segmentDurationMinutesInView = Math.max(\n 0,\n effectiveSegmentEndMinutesInDay - effectiveSegmentStartMinutesInDay,\n );\n\n if (segmentDurationMinutesInView <= 0) {\n // Segment has no visible duration within the timeline hours\n return null;\n }\n\n const widthPercentage = (segmentDurationMinutesInView / totalViewDurationMinutes) * 100;\n\n // Ensure percentages are valid\n if (\n leftPercentage > 100 ||\n leftPercentage < 0 ||\n widthPercentage <= 0 ||\n widthPercentage > 100 ||\n leftPercentage + widthPercentage > 100.0001 /*allow for float errors*/\n ) {\n // This might indicate an issue with date clamping or logic.\n // For now, if it results in an invalid layout, return null.\n // console.warn(\"Timeline layout calculation resulted in out-of-bounds percentages:\",\n // {leftPercentage, widthPercentage, segmentStart, segmentEnd, viewStartHour, viewEndHour});\n // A common case for (left + width > 100) is if an event ends *exactly* at viewEndHour,\n // and viewEndHour itself is the boundary.\n // Let's be a bit tolerant here if width is positive.\n if (widthPercentage <= 0) return null;\n }\n\n return {\n left: `${Math.max(0, Math.min(100, leftPercentage))}%`,\n width: `${Math.max(0, Math.min(100, widthPercentage))}%`,\n };\n }\n\n /**\n * Gets cloned appointment segment for a specific day.\n *\n * @param appointment - The appointment to clone.\n * @param day - The day to get segment for.\n * @param viewStartHour - Start hour of the view.\n * @param viewEndHour - End hour of the view.\n * @param isFullDayCellContext - Whether this is for full day cell context.\n * @returns AXSchedulerAppointmentSegment | null - Cloned segment or null.\n */\n getClonedAppointmentSegmentOnDay(\n appointment: AXSchedulerAppointment, // This is the ORIGINAL appointment\n day: AXDateTime,\n viewStartHour: number,\n viewEndHour: number,\n isFullDayCellContext = false,\n ): AXSchedulerAppointmentSegment | null {\n if (!appointment || !appointment.startDate || !appointment.endDate) {\n return null;\n }\n\n const appointmentStartDate = this.calendarService.create(appointment.startDate);\n const appointmentEndDate = this.calendarService.create(appointment.endDate);\n\n if (appointment.allDay) {\n const dayStartOf = day.clone().startOf('day');\n const appointmentStartDay = appointmentStartDate.startOf('day');\n const appointmentEndDay = appointmentEndDate.startOf('day');\n\n // Check if the appointment overlaps with the current day\n if (appointmentStartDay.compare(dayStartOf, 'day') <= 0 && appointmentEndDay.compare(dayStartOf, 'day') >= 0) {\n const isContinuationFromPreviousDay = appointmentStartDay.compare(dayStartOf, 'day') < 0;\n const isContinuationToNextDay = appointmentEndDay.compare(dayStartOf, 'day') > 0;\n\n return {\n ...appointment,\n startDate: dayStartOf.date,\n endDate: dayStartOf.clone().add('day', 1).startOf('day').date,\n allDay: true,\n originalStartDate: appointmentStartDate.date,\n originalEndDate: appointmentEndDate.date,\n isContinuationFromPreviousDay,\n isContinuationToNextDay,\n originalAppointmentRef: appointment,\n };\n } else {\n return null;\n }\n }\n\n const dayStartBoundary = isFullDayCellContext\n ? day.clone().startOf('day')\n : day.clone().set('hour', viewStartHour).startOf('hour');\n const dayEndBoundary = isFullDayCellContext\n ? day.clone().add('day', 1).startOf('day')\n : viewEndHour === 24 || (viewEndHour === 0 && viewStartHour === 0)\n ? day.clone().add('day', 1).startOf('day')\n : day.clone().set('hour', viewEndHour).startOf('hour');\n\n if (\n appointmentEndDate.compare(dayStartBoundary, 'second') <= 0 ||\n appointmentStartDate.compare(dayEndBoundary, 'second') >= 0\n ) {\n return null;\n }\n const segmentStartDate =\n appointmentStartDate.compare(dayStartBoundary, 'second') > 0 ? appointmentStartDate : dayStartBoundary;\n const segmentEndDate =\n appointmentEndDate.compare(dayEndBoundary, 'second') < 0 ? appointmentEndDate : dayEndBoundary;\n\n if (segmentStartDate.compare(segmentEndDate, 'second') >= 0) {\n return null;\n }\n\n const isContinuationFromPreviousDay = appointmentStartDate.compare(segmentStartDate, 'second') < 0;\n const isContinuationToNextDay = appointmentEndDate.compare(segmentEndDate, 'second') > 0;\n const duration = appointmentStartDate.duration(appointmentEndDate);\n\n return {\n ...appointment,\n startDate: segmentStartDate.date,\n endDate: segmentEndDate.date,\n allDay: appointment.allDay || duration.total.miliseconds >= 24 * 60 * 60 * 1000 - 1,\n originalStartDate: appointmentStartDate.date,\n originalEndDate: appointmentEndDate.date,\n isContinuationFromPreviousDay,\n isContinuationToNextDay,\n originalAppointmentRef: appointment,\n };\n }\n\n /**\n * Gets the original appointment from a segment.\n *\n * @param item - Appointment or appointment segment.\n * @returns AXSchedulerAppointment - The original appointment.\n */\n getOriginalAppointment(item: AXSchedulerAppointment | AXSchedulerAppointmentSegment): AXSchedulerAppointment {\n const segment = item as AXSchedulerAppointmentSegment;\n if (segment.originalAppointmentRef) {\n return segment.originalAppointmentRef;\n }\n return item;\n }\n\n /**\n * Checks if a date is a holiday.\n *\n * @param date - The date to check.\n * @returns boolean - True if the date is a holiday.\n */\n isHoliday(date: AXDateTime): boolean {\n const globalHolidays = this.calendarService.holidays.some((d) => date.equal(d.date, 'day'));\n const internalHolidays = this.internalHoliday().some((d) => date.equal(d.date, 'day'));\n return globalHolidays || internalHolidays;\n }\n\n /**\n * Checks if a date is a weekend.\n *\n * @param date - The date to check.\n * @param calendar - The calendar type to use.\n * @returns boolean - True if the date is a weekend.\n */\n isWeekend(date: AXDateTime, calendar: string): boolean {\n const internalWeekend = this.internalWeekend();\n const globalWeekend = this.calendarService.resolveCalendar(calendar).weekend;\n if (internalWeekend.length === 0) {\n return globalWeekend.includes(date.dayOfWeek - 1);\n }\n return this.internalWeekend().includes(date.dayOfWeek - 1);\n }\n\n /**\n * Filters appointments by resources and unassigned appointments.\n *\n * @param appointments - Array of appointments to filter.\n * @param resources - Array of resources.\n * @param showUnassignedAppointments - Whether to show appointments without resources.\n * @returns Map<any, AXSchedulerAppointment[]> - Appointments grouped by resource ID.\n */\n filterAppointmentsByResources(\n appointments: AXSchedulerAppointment[],\n resources: AXSchedulerResource[],\n showUnassignedAppointments = true,\n ): Map<any, AXSchedulerAppointment[]> {\n const result = new Map<any, AXSchedulerAppointment[]>();\n\n if (!resources || resources.length === 0) {\n // If no resources, return all appointments under a default key\n result.set('default', appointments);\n return result;\n }\n\n // Initialize result map with empty arrays for each resource\n resources.forEach((resource) => {\n result.set(resource.id, []);\n });\n\n // Add unassigned appointments key if needed\n if (showUnassignedAppointments) {\n result.set('unassigned', []);\n }\n\n // Group appointments by resource\n appointments.forEach((appointment) => {\n if (appointment.resourceId !== undefined && appointment.resourceId !== null) {\n // Find matching resource using isEqual for proper comparison\n let foundResource = false;\n for (const [key, resourceAppointments] of result.entries()) {\n if (key !== 'unassigned' && isEqual(key, appointment.resourceId)) {\n resourceAppointments.push(appointment);\n foundResource = true;\n break;\n }\n }\n\n if (!foundResource && showUnassignedAppointments) {\n // If resource doesn't exist in the resources array, treat as unassigned\n result.get('unassigned').push(appointment);\n }\n } else if (showUnassignedAppointments) {\n result.get('unassigned').push(appointment);\n }\n });\n\n return result;\n }\n\n /**\n * Gets appointments for a specific resource.\n *\n * @param appointments - Array of appointments.\n * @param resourceId - The resource ID to filter by.\n * @returns AXSchedulerAppointment[] - Filtered appointments.\n */\n getAppointmentsForResource(appointments: AXSchedulerAppointment[], resourceId: any): AXSchedulerAppointment[] {\n if (resourceId === 'unassigned') {\n return appointments.filter(\n (appointment) => appointment.resourceId === undefined || appointment.resourceId === null,\n );\n }\n return appointments.filter((appointment) => isEqual(appointment.resourceId, resourceId));\n }\n\n /**\n * Gets all resource IDs including unassigned if applicable.\n *\n * @param resources - Array of resources.\n * @param showUnassignedAppointments - Whether to include unassigned appointments.\n * @returns string[] - Array of resource IDs.\n */\n getAllResourceIds(resources: AXSchedulerResource[], showUnassignedAppointments = true): any[] {\n const resourceIds = resources.map((resource) => resource.id);\n if (showUnassignedAppointments) {\n resourceIds.push('unassigned');\n }\n return resourceIds;\n }\n}\n","import { AXComponent, NXComponent } from '@acorex/cdk/common';\nimport { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXCalendarService, AXDateTime, AXHolidayDate } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe, NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n HostBinding,\n TemplateRef,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { orderBy } from 'lodash-es';\nimport { AXSchedulerAppointment, AXSchedulerAppointmentSegment } from '../../scheduler.class';\nimport {\n AXSchedulerAppointmentMouseEvent,\n AXSchedulerComponent,\n AXSchedulerSlotDropEvent,\n AXSchedulerSlotMouseEvent,\n} from '../../scheduler.component';\nimport { AXSchedulerService } from '../../scheduler.service';\n\nexport interface AgendaDayData {\n date: AXDateTime;\n appointments: AXSchedulerAppointmentSegment[];\n holiday?: { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate };\n}\n\n@Component({\n selector: 'ax-scheduler-agenda-view',\n templateUrl: './scheduler-agenda-view.component.html',\n styleUrl: './scheduler-agenda-view.component.compiled.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n NgClass,\n AsyncPipe,\n AXFormatPipe,\n AXDragDirective,\n AXTranslatorPipe,\n AXTooltipDirective,\n AXDropZoneDirective,\n AXDecoratorIconComponent,\n AXDecoratorGenericComponent,\n ],\n providers: [{ provide: AXComponent, useExisting: AXSchedulerAgendaViewComponent }],\n})\nexport class AXSchedulerAgendaViewComponent extends NXComponent {\n private document = inject(DOCUMENT);\n private scheduler = inject(AXSchedulerComponent);\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n\n daysCount = input(7);\n readonly = input(false);\n draggable = input(true);\n hasActions = input(false);\n dragStartDelay = input(0);\n calendar = input<string>();\n date = input.required<AXDateTime>();\n appointments = input<AXSchedulerAppointment[]>([]);\n tooltipTemplate = input<string | TemplateRef<unknown>>();\n\n private dragStartSlotId = signal<string | null>(null);\n\n protected agendaDaysLayout = computed<AgendaDayData[]>(() => {\n const allOriginalAppointments = this.appointments();\n const agendaStartDate = this.date();\n const numberOfDays = this.daysCount();\n\n if (!agendaStartDate || !allOriginalAppointments) {\n return [];\n }\n\n const result: AgendaDayData[] = [];\n\n for (let i = 0; i < numberOfDays; i++) {\n const currentDay = agendaStartDate.add('day', i).startOf('day');\n const segmentsForThisDay: AXSchedulerAppointmentSegment[] = [];\n\n for (const appt of allOriginalAppointments) {\n const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(appt, currentDay, 0, 24, true);\n if (segment) {\n segmentsForThisDay.push(segment);\n }\n }\n\n const sortedSegments = orderBy(\n segmentsForThisDay,\n [\n (s) => (s.allDay ? 0 : 1),\n (s) => s.startDate.getTime(),\n (s) => s.originalEndDate.getTime() - s.originalStartDate.getTime(),\n ],\n ['asc', 'asc', 'desc'],\n );\n\n result.push({\n date: currentDay,\n appointments: sortedSegments,\n holiday: this.isHoliday(currentDay),\n });\n }\n return result;\n });\n\n // Internal outputs to be caught by parent AXSchedulerComponent\n slotClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotMouseEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n onActionClickInternal = output<AXSchedulerAppointmentMouseEvent>();\n onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n // --- Event Handlers ---\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n protected handleAppointmentEvent(mouseEvent: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n const appointmentRef = {\n ...originalAppointment,\n endDate: originalAppointment.endDate,\n startDate: originalAppointment.startDate,\n };\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, appointment: appointmentRef, sender: this.scheduler },\n this.eventOutputMap,\n 'appointment',\n );\n }\n protected handleSlotEvent(mouseEvent: MouseEvent, date: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(date.startOf('day'), 'agenda');\n if (slotData) {\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n this.eventOutputMap,\n 'slot',\n );\n }\n }\n protected handleDrop(e: AXDropZoneDropEvent, date: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(date.startOf('day'), 'agenda');\n const droppedItem = e.dropped.dragData() as AXSchedulerAppointment;\n const originalAppointment = this.schedulerService.getOriginalAppointment(droppedItem);\n const appointmentRef = {\n ...originalAppointment,\n endDate: originalAppointment.endDate,\n startDate: originalAppointment.startDate,\n };\n this.onAppointmentDropInternal.emit({\n dropEvent: e,\n slot: slotData,\n sender: this.scheduler,\n appointment: appointmentRef,\n isSameSlotDrop: this.dragStartSlotId() === e.sender.element().dataset['slotId'],\n });\n }\n protected handleActionClick(event: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n event.stopPropagation();\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n this.onActionClickInternal.emit({\n appointment: originalAppointment,\n nativeEvent: event,\n sender: this.scheduler,\n });\n }\n\n protected isToday(date: AXDateTime): boolean {\n const today = this.calendarService.create(new Date());\n return date.equal(today, 'day');\n }\n protected isHoliday(date: AXDateTime): { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate } {\n const isHoliday = this.schedulerService.isHoliday(date);\n if (isHoliday) {\n const globalHoliday = this.calendarService.holidays.find((d) => date.equal(d.date, 'day'));\n const internalHoliday = this.schedulerService.internalHoliday().find((d) => date.equal(d.date, 'day'));\n const holiday = globalHoliday || internalHoliday;\n return {\n state: 'holiday',\n holiday,\n };\n }\n const isWeekend = this.schedulerService.isWeekend(date, this.calendar());\n if (isWeekend) {\n return { state: 'weekend' };\n }\n return { state: 'none' };\n }\n\n protected getSlotId(e: PointerEvent) {\n const dropListElement = this.document\n .elementsFromPoint(e.clientX, e.clientY)\n .find((el): el is HTMLElement => el instanceof HTMLElement && el.dataset['slotId'] !== undefined);\n this.dragStartSlotId.set(dropListElement ? dropListElement.dataset['slotId'] : null);\n }\n\n @HostBinding('class.ax-state-readonly')\n protected get isReadonly() {\n return this.readonly();\n }\n}\n","<div class=\"ax-scheduler-agenda-container\">\n @for (dayData of agendaDaysLayout(); track dayData.date.date.getTime()) {\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleDrop($event, dayData.date)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n [class.ax-state-today]=\"isToday(dayData.date)\"\n class=\"ax-scheduler-agenda-view-container {{\n dayData.holiday.state !== 'none' ? (dayData.holiday.holiday?.cssClass ?? 'ax-state-holiday') : ''\n }}\"\n (click)=\"handleSlotEvent($event, dayData.date)\"\n (dblclick)=\"handleSlotEvent($event, dayData.date)\"\n (contextmenu)=\"handleSlotEvent($event, dayData.date)\"\n [attr.data-slot-id]=\"dayData.date.format('YYYYMMDD')\"\n >\n <div class=\"ax-scheduler-agenda-header-date-day\">\n <span\n class=\"ax-scheduler-agenda-header-date-day-char ax-scheduler-truncate\"\n [axTooltip]=\"dayData.holiday?.holiday?.title ?? ''\"\n [axTooltipPlacement]=\"'top-start'\"\n >\n {{ dayData.date | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n @if (dayData.holiday.state === 'holiday' && dayData.holiday.holiday.title) {\n ( {{ dayData.holiday.holiday.title }} )\n }\n </span>\n <span class=\"ax-scheduler-agenda-header-date-day-num\">\n {{ dayData.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n </span>\n </div>\n <div class=\"ax-scheduler-agenda-appointment-container\">\n @for (segment of dayData.appointments; track segment.id + segment.originalStartDate.getTime()) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"segment\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n (pointerdown)=\"getSlotId($event)\"\n (click)=\"handleAppointmentEvent($event, segment)\"\n (dblclick)=\"handleAppointmentEvent($event, segment)\"\n (contextmenu)=\"handleAppointmentEvent($event, segment)\"\n [title]=\"\n tooltipTemplate()\n ? ''\n : segment.title +\n (segment.allDay\n ? ' (All Day)'\n : ' (' +\n (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n ' - ' +\n (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n ')')\n \"\n class=\"ax-scheduler-agenda-appointment\"\n [class.all-day-segment]=\"segment.allDay\"\n [ngClass]=\"segment.cssClass ?? `ax-scheduler-${segment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltip]=\"tooltipTemplate()\"\n [axTooltipContext]=\"segment\"\n >\n <div class=\"ax-scheduler-agenda-appointment-time\">\n @if (segment.allDay) {\n <span>{{ '@acorex:dateTime.duration.all-day' | translate | async }}</span>\n } @else {\n <span>\n {{ segment.originalStartDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n -\n {{ segment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </span>\n }\n </div>\n <ax-title class=\"ax-scheduler-agenda-appointment-title ax-scheduler-truncate\">{{ segment.title }}</ax-title>\n <!-- Description could go here if needed -->\n <!-- @if (segment.description) {\n <ax-subtitle>{{ segment.description }}</ax-subtitle>\n } -->\n @if (hasActions()) {\n <ax-icon\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n (click)=\"handleActionClick($event, segment)\"\n >\n </ax-icon>\n }\n </div>\n }\n @if (dayData.appointments.length === 0) {\n <div class=\"ax-scheduler-agenda-no-appointments\">\n {{ '@acorex:common.general.no-record' | translate | async }}\n </div>\n }\n </div>\n </div>\n }\n</div>\n","import { AXComponent, NXComponent } from '@acorex/cdk/common';\nimport { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXCalendarService, AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe, NgClass } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n DOCUMENT,\n ElementRef,\n HostBinding,\n inject,\n input,\n output,\n signal,\n TemplateRef,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { orderBy } from 'lodash-es';\nimport {\n AXSchedulerAppointment,\n AXSchedulerAppointmentSegment,\n AXSchedulerDayAppointmentLayout,\n} from '../../scheduler.class';\nimport {\n AXSchedulerAppointmentMouseEvent,\n AXSchedulerComponent,\n AXSchedulerSlotDropEvent,\n AXSchedulerSlotMouseEvent,\n} from '../../scheduler.component';\nimport { AXSchedulerService } from '../../scheduler.service';\n\n@Component({\n selector: 'ax-scheduler-day-view',\n templateUrl: './scheduler-day-view.component.html',\n styleUrl: './scheduler-day-view.component.compiled.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n NgClass,\n AsyncPipe,\n AXFormatPipe,\n AXDragDirective,\n AXTranslatorPipe,\n AXPopoverComponent,\n AXTooltipDirective,\n AXDropZoneDirective,\n AXDecoratorIconComponent,\n AXDecoratorGenericComponent,\n ],\n providers: [{ provide: AXComponent, useExisting: AXSchedulerDayViewComponent }],\n})\nexport class AXSchedulerDayViewComponent extends NXComponent implements AfterViewInit {\n private document = inject(DOCUMENT);\n private scheduler = inject(AXSchedulerComponent);\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n\n readonly GAP_PX = 1;\n\n readonly = input(false);\n draggable = input(true);\n hasActions = input(false);\n dragStartDelay = input(0);\n calendar = input<string>();\n date = input.required<AXDateTime>();\n endDayHour = input.required<number>();\n startDayHour = input.required<number>();\n showCurrentTimeIndicator = input<boolean>(true);\n appointments = input<AXSchedulerAppointment[]>([]);\n tooltipTemplate = input<string | TemplateRef<unknown>>();\n\n // ViewChild for current time line element\n currentTimeLineElement = viewChild<ElementRef<HTMLElement>>('currentTimeLine');\n\n private dragStartSlotId = signal<string | null>(null);\n\n private processedAppointmentsForLayout = computed(() => {\n const viewDate = this.date();\n const startH = this.startDayHour();\n const endH = this.endDayHour();\n const allAppointmentsInView = this.appointments();\n if (!viewDate || allAppointmentsInView.length === 0) {\n return [];\n }\n const segmentsForThisDay: AXSchedulerAppointmentSegment[] = [];\n for (const appt of allAppointmentsInView) {\n const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(appt, viewDate, startH, endH);\n if (segment) {\n segmentsForThisDay.push(segment);\n }\n }\n return segmentsForThisDay;\n });\n protected allDayAppointments = computed(() => {\n const originalAllDayAppointments = this.appointments()?.filter((e) => e && e.allDay) ?? [];\n const multiDayBecomingAllDaySegments =\n this.processedAppointmentsForLayout()?.filter(\n (segment) => segment && segment.allDay && !this.appointments().find((orig) => orig.id === segment.id)?.allDay,\n ) ?? [];\n const combined = new Map<any, AXSchedulerAppointment>();\n originalAllDayAppointments.forEach((appt) => combined.set(appt.id, appt));\n multiDayBecomingAllDaySegments.forEach((appt) => {\n if (!combined.has(appt.id)) {\n combined.set(appt.id, appt);\n }\n });\n return Array.from(combined.values());\n });\n protected singleDayAppointments = computed(() => {\n return this.processedAppointmentsForLayout()?.filter((e) => e && !e.allDay) ?? [];\n });\n\n slotClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotMouseEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n onActionClickInternal = output<AXSchedulerAppointmentMouseEvent>();\n onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n protected handleAppointmentEvent(mouseEvent: MouseEvent, appointment: AXSchedulerAppointment) {\n const originalAppointment = (appointment as AXSchedulerAppointmentSegment).originalStartDate\n ? ({\n ...appointment,\n startDate: (appointment as AXSchedulerAppointmentSegment).originalStartDate,\n endDate: (appointment as AXSchedulerAppointmentSegment).originalEndDate,\n } as AXSchedulerAppointment)\n : appointment;\n const appointmentRef = {\n ...originalAppointment,\n endDate: originalAppointment.endDate,\n startDate: originalAppointment.startDate,\n };\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, appointment: appointmentRef, sender: this.scheduler },\n this.eventOutputMap,\n 'appointment',\n );\n }\n protected handleSingleSlotEvent(mouseEvent: MouseEvent, startDate: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(startDate, 'day');\n if (slotData)\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n this.eventOutputMap,\n 'slot',\n );\n }\n protected handleAllDaySlotEvent(mouseEvent: MouseEvent) {\n const endDate = this.date().endOf('day');\n const startDate = this.date().startOf('day');\n const slotData = { startDate, endDate, view: 'day' as const };\n if (slotData)\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n this.eventOutputMap,\n 'slot',\n );\n }\n protected handleAllDayDrop(e: AXDropZoneDropEvent) {\n const endDate = this.date().endOf('day');\n const startDate = this.date().startOf('day');\n const slotData = { startDate, endDate, view: 'day' as const };\n\n const droppedAppt = e.dropped.dragData() as AXSchedulerAppointment;\n const originalDroppedAppt = (droppedAppt as AXSchedulerAppointmentSegment).originalStartDate\n ? ({\n ...droppedAppt,\n startDate: (droppedAppt as AXSchedulerAppointmentSegment).originalStartDate,\n endDate: (droppedAppt as AXSchedulerAppointmentSegment).originalEndDate,\n } as AXSchedulerAppointment)\n : droppedAppt;\n const appointmentRef = {\n ...originalDroppedAppt,\n endDate: originalDroppedAppt.endDate,\n startDate: originalDroppedAppt.startDate,\n };\n this.onAppointmentDropInternal.emit({\n dropEvent: e,\n slot: slotData,\n sender: this.scheduler,\n appointment: appointmentRef,\n isSameSlotDrop: this.dragStartSlotId() === e.sender.element().dataset['slotId'],\n });\n }\n protected handleSingleDayDrop(e: AXDropZoneDropEvent, startDate: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(startDate, 'day');\n const droppedAppt = e.dropped.dragData() as AXSchedulerAppointment;\n const originalDroppedAppt = (droppedAppt as AXSchedulerAppointmentSegment).originalStartDate\n ? ({\n ...droppedAppt,\n startDate: (droppedAppt as AXSchedulerAppointmentSegment).originalStartDate,\n endDate: (droppedAppt as AXSchedulerAppointmentSegment).originalEndDate,\n } as AXSchedulerAppointment)\n : droppedAppt;\n const appointmentRef = {\n ...originalDroppedAppt,\n endDate: originalDroppedAppt.endDate,\n startDate: originalDroppedAppt.startDate,\n };\n this.onAppointmentDropInternal.emit({\n dropEvent: e,\n slot: slotData,\n sender: this.scheduler,\n appointment: appointmentRef,\n isSameSlotDrop: this.dragStartSlotId() === e.sender.element().dataset['slotId'],\n });\n }\n protected handleActionClick(event: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n event.stopPropagation();\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n this.onActionClickInternal.emit({\n appointment: originalAppointment,\n nativeEvent: event,\n sender: this.scheduler,\n });\n }\n\n protected hoursArray = computed(() => {\n let time = this.date();\n if (!time) return [];\n time = time.set('hour', this.startDayHour()).startOf('hour');\n const hours = [time];\n while (time.hour < this.endDayHour() - 1) {\n time = time.add('hour', 1);\n hours.push(time);\n }\n return hours;\n });\n\n private appointmentLayouts = computed(() => {\n const layouts = new Map<any, AXSchedulerDayAppointmentLayout>();\n const appointmentsToLayout = this.singleDayAppointments();\n const viewDate = this.date();\n const startH = this.startDayHour();\n const endH = this.endDayHour();\n\n if (appointmentsToLayout.length === 0 || !viewDate || typeof startH !== 'number' || typeof endH !== 'number') {\n return layouts;\n }\n\n const concurrencyInfoMap = this.schedulerService.calculateDayViewConcurrencyInfo(\n appointmentsToLayout,\n viewDate,\n startH,\n endH,\n );\n\n const sortedAppointments = orderBy(\n appointmentsToLayout,\n [(e) => e.startDate.getTime(), (e) => e.originalEndDate.getTime() - e.originalStartDate.getTime()],\n ['asc', 'desc'],\n );\n\n const columnsData: { appointments: AXSchedulerAppointmentSegment[] }[] = [];\n\n for (const appointmentSegment of sortedAppointments) {\n let assignedCol = -1;\n\n for (let c = 0; ; c++) {\n if (!columnsData[c]) {\n columnsData[c] = { appointments: [] };\n }\n\n let conflict = false;\n\n for (const placedSegment of columnsData[c].appointments) {\n const startDate = this.calendarService.create(appointmentSegment.startDate, this.calendar());\n const endDate = this.calendarService.create(appointmentSegment.endDate, this.calendar());\n if (\n startDate.compare(placedSegment.endDate, 'minute') < 0 &&\n endDate.compare(placedSegment.startDate, 'minute') > 0\n ) {\n conflict = true;\n break;\n }\n }\n\n if (!conflict) {\n assignedCol = c;\n columnsData[c].appointments.push(appointmentSegment);\n break;\n }\n\n if (c > appointmentsToLayout.length) {\n console.warn(\n `DayView: Safety break in column assignment for ${appointmentSegment.title}, assigning to new column ${c}`,\n );\n if (!columnsData[c]) columnsData[c] = { appointments: [] };\n columnsData[c].appointments.push(appointmentSegment);\n assignedCol = c;\n break;\n }\n }\n\n const concurrencyInfo = concurrencyInfoMap.get(appointmentSegment.id);\n const effectiveCols = concurrencyInfo ? concurrencyInfo.effectiveTotalColumns : 1;\n\n layouts.set(appointmentSegment.id, {\n columnIndex: assignedCol,\n effectiveTotalColumns: effectiveCols,\n });\n }\n return layouts;\n });\n\n private getAppointmentLayout(key: any): AXSchedulerDayAppointmentLayout | undefined {\n return this.appointmentLayouts().get(key);\n }\n\n protected getAppointmentLeft(key: any): string {\n const layout = this.getAppointmentLayout(key);\n if (layout && layout.effectiveTotalColumns > 0) {\n const N = layout.effectiveTotalColumns;\n const C = layout.columnIndex;\n if (C < 0) {\n console.warn('Invalid columnIndex < 0 for key:', key);\n return '0px';\n }\n if (C === 0 || N <= 1) return '0px';\n const leftPercent = C * (100 / N);\n const gapOffsetPx = C * this.GAP_PX;\n return `calc(${leftPercent}% + ${gapOffsetPx}px)`;\n }\n return '0px';\n }\n\n protected getAppointmentWidth(key: any): string {\n const layout = this.getAppointmentLayout(key);\n if (layout && layout.effectiveTotalColumns > 0) {\n const N = layout.effectiveTotalColumns;\n\n if (N <= 0) return '0%';\n if (N === 1) return `calc(100% - ${this.GAP_PX}px)`;\n\n const widthPercent = (1 / N) * 100;\n\n return `calc(${widthPercent}% - ${this.GAP_PX}px)`;\n }\n return '0%';\n }\n\n protected getAppointmentTop(key: any): string {\n const appointmentSegment = this.singleDayAppointments().find((e) => e.id === key);\n\n if (appointmentSegment) {\n const startMinutes = appointmentSegment.startDate.getHours() * 60 + appointmentSegment.startDate.getMinutes();\n const startBlockOffset = startMinutes - this.startDayHour() * 60;\n const yBlock = startBlockOffset / 30;\n return `calc(var(--ax-comp-scheduler-basic-view-blocks-height) * ${yBlock} + 1px)`;\n }\n return '';\n }\n\n protected getAppointmentHeight(key: any): string {\n const appointmentSegment = this.singleDayAppointments().find((e) => e.id === key);\n if (appointmentSegment) {\n const durationMillis = appointmentSegment.endDate.getTime() - appointmentSegment.startDate.getTime();\n const durationMinutes = Math.max(0, durationMillis / (1000 * 60));\n if (durationMinutes <= 0) return '0px';\n\n const heightBlock = durationMinutes / 30;\n const blockHeightExpr = `var(--ax-comp-scheduler-basic-view-blocks-height)`;\n\n return `calc(${blockHeightExpr} * ${heightBlock} - ${this.GAP_PX}px)`;\n }\n return '0px';\n }\n\n protected getCurrentTimePosition(): number | null {\n const now = this.calendarService.create(new Date(), this.calendar());\n const dayStart = this.date().startOf('day');\n const dayEnd = this.date().endOf('day');\n const startHour = this.startDayHour();\n const endHour = this.endDayHour();\n\n // Check if current time is within the displayed day\n if (now.isBefore(dayStart) || now.isAfter(dayEnd)) {\n return null;\n }\n\n // Check if current time is within the visible hours\n if (now.hour < startHour || now.hour >= endHour) {\n return null;\n }\n\n // Calculate position as percentage within the visible time range\n const currentMinutes = now.hour * 60 + now.minute;\n const startMinutes = startHour * 60;\n const endMinutes = endHour * 60;\n const totalMinutes = endMinutes - startMinutes;\n\n const positionInMinutes = currentMinutes - startMinutes;\n return (positionInMinutes / totalMinutes) * 100;\n }\n\n protected getCurrentTimePositionWithOffset(): string | null {\n const position = this.getCurrentTimePosition();\n if (position === null) {\n return null;\n }\n\n // For day view, calculate the vertical position (top) for the horizontal line\n // based on the current time within the visible hours\n const currentMinutes =\n this.calendarService.create(new Date(), this.calendar()).hour * 60 +\n this.calendarService.create(new Date(), this.calendar()).minute;\n const startMinutes = this.startDayHour() * 60;\n const positionInMinutes = currentMinutes - startMinutes;\n const blockHeight = 30; // 30 minutes per block\n const blocksFromStart = positionInMinutes / blockHeight;\n\n return `calc(var(--ax-comp-scheduler-basic-view-blocks-height) * ${blocksFromStart} + 1px)`;\n }\n\n ngAfterViewInit() {\n // Auto-scroll to current time when available using ResizeObserver\n this.setupCurrentTimeScroll();\n }\n\n private setupCurrentTimeScroll(): (() => void) | undefined {\n if (!this.showCurrentTimeIndicator()) {\n return undefined;\n }\n\n const currentPosition = this.getCurrentTimePosition();\n if (currentPosition === null) {\n return undefined;\n }\n\n const timeLineElement = this.currentTimeLineElement()?.nativeElement;\n if (!timeLineElement) {\n return undefined;\n }\n\n // Use ResizeObserver to detect when the element is properly rendered\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.contentRect.width > 0 && entry.contentRect.height > 0) {\n // Element has proper dimensions, scroll to it\n timeLineElement.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n inline: 'nearest',\n });\n // Disconnect observer after successful scroll\n resizeObserver.disconnect();\n break;\n }\n }\n });\n\n resizeObserver.observe(timeLineElement);\n\n // Cleanup on component destroy\n return () => resizeObserver.disconnect();\n }\n\n protected getSlotId(e: PointerEvent) {\n const dropListElement = this.document\n .elementsFromPoint(e.clientX, e.clientY)\n .find((el): el is HTMLElement => el instanceof HTMLElement && el.dataset['slotId'] !== undefined);\n this.dragStartSlotId.set(dropListElement ? dropListElement.dataset['slotId'] : null);\n }\n\n @HostBinding('class.ax-state-readonly')\n protected get isReadonly() {\n return this.readonly();\n }\n}\n","<div class=\"ax-scheduler-day-header\">\n <div class=\"ax-scheduler-day-header-table\" aria-hidden=\"true\">\n <div>\n {{ '@acorex:dateTime.duration.all-day' | translate | async }}\n </div>\n </div>\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleAllDayDrop($event)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n (click)=\"handleAllDaySlotEvent($event)\"\n (dblclick)=\"handleAllDaySlotEvent($event)\"\n (contextmenu)=\"handleAllDaySlotEvent($event)\"\n class=\"ax-scheduler-day-header-table-container\"\n [attr.data-slot-id]=\"date().format('YYYYMMDD') + '-allday'\"\n >\n <div class=\"ax-scheduler-day-header-appointment-container\">\n @if (allDayAppointments().length) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || allDayAppointments()[0].readonly || readonly()\"\n (pointerdown)=\"getSlotId($event)\"\n [dragData]=\"allDayAppointments()[0]\"\n (click)=\"handleAppointmentEvent($event, allDayAppointments()[0])\"\n (dblclick)=\"handleAppointmentEvent($event, allDayAppointments()[0])\"\n (contextmenu)=\"handleAppointmentEvent($event, allDayAppointments()[0])\"\n [title]=\"tooltipTemplate() ? '' : allDayAppointments()[0].title\"\n class=\"ax-scheduler-header-day-appointment\"\n [ngClass]=\"\n allDayAppointments()[0].cssClass ??\n `ax-scheduler-${allDayAppointments()[0].priority ?? 'primary'}-periority`\n \"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltipContext]=\"allDayAppointments()[0]\"\n [axTooltip]=\"tooltipTemplate()\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ allDayAppointments()[0].title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, allDayAppointments()[0])\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n <ax-subtitle>\n {{ allDayAppointments()[0].startDate | format: 'date' : { calendar: calendar() } | async }}\n -\n {{ allDayAppointments()[0].endDate | format: 'date' : { calendar: calendar() } | async }}\n </ax-subtitle>\n </div>\n }\n @if (allDayAppointments().length > 1) {\n <div\n #moreAppointments\n class=\"ax-scheduler-day-header-more-tag\"\n [ngClass]=\"\n allDayAppointments()[1].cssClass ??\n `ax-scheduler-${allDayAppointments()[1].priority ?? 'primary'}-periority`\n \"\n >\n {{\n '@acorex:common.general.more-items'\n | translate: { params: { number: allDayAppointments().length - 1 } }\n | async\n }}\n </div>\n <ax-popover [target]=\"moreAppointments\">\n <div class=\"ax-overlay-pane ax-scheduler-popover\" [class.ax-state-readonly]=\"readonly()\" axDropZone>\n @for (appointment of allDayAppointments(); track appointment.id; let first = $first) {\n @if (!first) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"appointment\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || appointment.readonly || readonly()\"\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"tooltipTemplate() ? '' : appointment.title\"\n class=\"ax-scheduler-popover-appointment\"\n [ngClass]=\"appointment.cssClass ?? `ax-scheduler-${appointment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltipContext]=\"appointment\"\n [axTooltip]=\"tooltipTemplate()\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ appointment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, appointment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n <ax-subtitle>\n {{ appointment.startDate | format: 'date' : { calendar: calendar() } | async }}\n -\n {{ appointment.endDate | format: 'date' : { calendar: calendar() } | async }}\n </ax-subtitle>\n </div>\n }\n }\n </div>\n </ax-popover>\n }\n </div>\n </div>\n</div>\n\n<div class=\"ax-scheduler-day-time-container\">\n <table class=\"ax-scheduler-day-time\" aria-hidden=\"true\" [border]=\"1\">\n @for (time of hoursArray(); track time.date.getTime()) {\n <div>\n {{ time | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </div>\n }\n </table>\n <div class=\"ax-scheduler-day-table-container\">\n <!-- Current Time Line Indicator -->\n @if (showCurrentTimeIndicator() && getCurrentTimePositionWithOffset() !== null) {\n <div\n #currentTimeLine\n class=\"ax-scheduler-current-time-line\"\n [style.inset-block-start]=\"getCurrentTimePositionWithOffset()\"\n ></div>\n }\n <div class=\"ax-scheduler-day-appointment-container\">\n @for (appointment of singleDayAppointments(); track appointment.id) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"appointment\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || appointment.readonly || readonly()\"\n (pointerdown)=\"getSlotId($event)\"\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"tooltipTemplate() ? '' : appointment.title\"\n class=\"ax-scheduler-day-appointment\"\n [style.width]=\"getAppointmentWidth(appointment.id)\"\n [style.height]=\"getAppointmentHeight(appointment.id)\"\n [style.inset-block-start]=\"getAppointmentTop(appointment.id)\"\n [style.inset-inline-start]=\"getAppointmentLeft(appointment.id)\"\n [ngClass]=\"appointment.cssClass ?? `ax-scheduler-${appointment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltipContext]=\"appointment\"\n [axTooltip]=\"tooltipTemplate()\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ appointment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, appointment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n <ax-subtitle>\n {{ appointment.originalStartDate | format: 'time' : { calendar: calendar() } | async }} -\n {{ appointment.originalEndDate | format: 'time' : { calendar: calendar() } | async }}\n </ax-subtitle>\n </div>\n }\n </div>\n <div aria-hidden=\"true\" class=\"ax-scheduler-day-slot\">\n @for (time of hoursArray(); track time.date.getTime()) {\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleSingleDayDrop($event, time)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n (click)=\"handleSingleSlotEvent($event, time)\"\n (dblclick)=\"handleSingleSlotEvent($event, time)\"\n (contextmenu)=\"handleSingleSlotEvent($event, time)\"\n [attr.data-slot-id]=\"time.format('YYYYMMDD-HHmm')\"\n ></div>\n <div\n axDropZone\n #zone2=\"axDropZone\"\n [class.ax-scheduler-slot-hovered]=\"zone2.isHovered()\"\n (onElementDrop)=\"handleSingleDayDrop($event, time.add('minute', 30))\"\n (click)=\"handleSingleSlotEvent($event, time.add('minute', 30))\"\n (dblclick)=\"handleSingleSlotEvent($event, time.add('minute', 30))\"\n (contextmenu)=\"handleSingleSlotEvent($event, time.add('minute', 30))\"\n [attr.data-slot-id]=\"time.add('minute', 30).format('YYYYMMDD-HHmm')\"\n ></div>\n }\n </div>\n </div>\n</div>\n","import { AXComponent, NXComponent } from '@acorex/cdk/common';\nimport { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { AXDecoratorIconComponent } from '@acorex/components/decorators'; // Adjust path\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXCalendarService, AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe, NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n DOCUMENT,\n HostBinding,\n inject,\n input,\n output,\n signal,\n TemplateRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { orderBy } from 'lodash-es';\nimport { AXDayOfWeekName, AXSchedulerAppointment, AXSchedulerAppointmentSegment } from '../../scheduler.class'; // Adjust path\nimport {\n AXSchedulerAppointmentMouseEvent,\n AXSchedulerComponent,\n AXSchedulerSlotDropEvent,\n AXSchedulerSlotMouseEvent,\n} from '../../scheduler.component';\nimport { AXSchedulerService } from '../../scheduler.service';\n\n// --- Types specific to Month View Layout ---\n// Represents a single day cell in the month grid\nexport type AXSchedulerMonthDayCell = {\n date: AXDateTime;\n isCurrentMonth: boolean;\n isToday: boolean;\n isHoliday: boolean;\n holidayTitle?: string;\n holidayCssClass?: string;\n appointments: AXSchedulerAppointmentSegment[]; // All appointments for this day\n visibleAppointments: AXSchedulerAppointmentSegment[]; // Appointments to display as chips\n hiddenAppointments: AXSchedulerAppointmentSegment[]; // Appointments hidden behind the badge\n overflowCount: number; // Count of hidden appointments (length of hiddenAppointments)\n};\n\n@Component({\n selector: 'ax-scheduler-month-view',\n templateUrl: './scheduler-month-view.component.html',\n styleUrl: './scheduler-month-view.component.compiled.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n NgClass,\n AsyncPipe,\n AXFormatPipe,\n AXDragDirective,\n AXTranslatorPipe,\n AXPopoverComponent,\n AXTooltipDirective,\n AXDropZoneDirective,\n AXDecoratorIconComponent,\n ],\n providers: [{ provide: AXComponent, useExisting: AXSchedulerMonthViewComponent }],\n})\nexport class AXSchedulerMonthViewComponent extends NXComponent {\n private document = inject(DOCUMENT);\n private scheduler = inject(AXSchedulerComponent);\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n\n // --- Inputs ---\n readonly = input(false);\n draggable = input(true);\n hasActions = input(false);\n dragStartDelay = input(0);\n calendar = input<string>();\n date = input.required<AXDateTime>();\n appointments = input<AXSchedulerAppointment[]>([]);\n firstDayOfWeek = input<AXDayOfWeekName>('saturday');\n tooltipTemplate = input<string | TemplateRef<unknown>>();\n\n // --- Constants ---\n readonly DAYS_IN_WEEK = 7;\n readonly MAX_VISIBLE_APPOINTMENTS_PER_DAY = 2;\n\n private dragStartSlotId = signal<string | null>(null);\n\n // Internal outputs to be caught by parent AXSchedulerComponent\n slotClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotMouseEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n onActionClickInternal = output<AXSchedulerAppointmentMouseEvent>();\n onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n // --- Event Handlers ---\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n protected handleAppointmentEvent(mouseEvent: MouseEvent, appointmentSegmentOrOriginal: AXSchedulerAppointment) {\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentSegmentOrOriginal);\n const appointmentRef = {\n ...originalAppointment,\n endDate: originalAppointment.endDate,\n startDate: originalAppointment.startDate,\n };\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, appointment: appointmentRef, sender: this.scheduler },\n this.eventOutputMap,\n 'appointment',\n );\n }\n protected handleSlotEvent(mouseEvent: MouseEvent, date: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(date.startOf('day'), 'month'); // Ensure it's start of day\n if (slotData) {\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n this.eventOutputMap,\n 'slot',\n );\n }\n }\n protected handleDrop(e: AXDropZoneDropEvent, date: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(date.startOf('day'), 'month');\n const droppedItem = e.dropped.dragData() as AXSchedulerAppointment;\n const originalAppointment = this.schedulerService.getOriginalAppointment(droppedItem);\n const appointmentRef = {\n ...originalAppointment,\n endDate: originalAppointment.endDate,\n startDate: originalAppointment.startDate,\n };\n this.onAppointmentDropInternal.emit({\n dropEvent: e,\n slot: slotData,\n sender: this.scheduler,\n appointment: appointmentRef,\n isSameSlotDrop: this.dragStartSlotId() === e.sender.element().dataset['slotId'],\n });\n }\n protected handleActionClick(event: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n event.stopPropagation();\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n this.onActionClickInternal.emit({\n appointment: originalAppointment,\n nativeEvent: event,\n sender: this.scheduler,\n });\n }\n\n // --- Base Computeds ---\n // Calculate the start of the month based on the input date\n private monthStartDate = computed(() => {\n const d = this.date();\n return d ? d.startOf('month') : null;\n });\n\n // Generate the list of weekday names based on the firstDayOfWeek\n protected daysArray = computed(() => {\n const dayNames: AXDateTime[] = [];\n\n const currentDate = this.date(); // Use a stable date for generating week headers\n const currentDayOfWeek = currentDate.dayOfWeek;\n const desiredFirstDayName = this.firstDayOfWeek();\n const desiredFirstDayNumber = this.schedulerService.getDayOfWeekNumber(desiredFirstDayName);\n\n // Calculate days to subtract to get to the start of the week based on firstDayOfWeek\n const daysToSubtract = (currentDayOfWeek - desiredFirstDayNumber + 7) % 7;\n let headerStartDate = currentDate.add('day', -daysToSubtract);\n\n for (let i = 0; i < 7; i++) {\n dayNames.push(headerStartDate);\n headerStartDate = headerStartDate.add('day', 1);\n }\n return dayNames;\n });\n\n // --- Calendar Grid Calculation ---\n private calendarDaysInfo = computed(() => {\n const monthStart = this.monthStartDate();\n if (!monthStart) return { days: [], weeksNeeded: 0 };\n\n const firstDayOfMonth = monthStart;\n const lastDayOfMonth = monthStart.endOf('month');\n\n const firstDayGridNum = this.schedulerService.getDayOfWeekNumber(this.firstDayOfWeek());\n const firstDisplayedDayOfWeek = firstDayOfMonth.dayOfWeek;\n\n const leadingDays = (firstDisplayedDayOfWeek - firstDayGridNum + this.DAYS_IN_WEEK) % this.DAYS_IN_WEEK;\n const firstDayOfGrid = firstDayOfMonth.add('day', -leadingDays);\n\n // Determine how many total days to show to fill out the weeks\n // A common approach is 6 weeks to ensure consistency, but your dynamic weeksNeeded is fine too.\n // Let's stick to your dynamic `weeksNeeded` and `totalDaysToGenerate`\n const daysInMonth = lastDayOfMonth.dayOfMonth;\n const totalCellsMinimum = leadingDays + daysInMonth;\n const weeksNeededDynamic = Math.ceil(totalCellsMinimum / this.DAYS_IN_WEEK);\n const actualWeeksToShow = Math.max(4, Math.min(weeksNeededDynamic, 6)); // Clamp weeks\n const totalDaysToGenerate = actualWeeksToShow * this.DAYS_IN_WEEK;\n\n const days: {\n date: AXDateTime;\n isCurrentMonth: boolean;\n isToday: boolean;\n isHoliday: boolean;\n holidayTitle?: string;\n holidayCssClass?: string;\n }[] = [];\n const today = this.calendarService.create(new Date());\n let currentDay = firstDayOfGrid;\n\n for (let i = 0; i < totalDaysToGenerate; i++) {\n const isHoliday =\n this.schedulerService.isHoliday(currentDay) || this.schedulerService.isWeekend(currentDay, this.calendar());\n\n let holidayTitle: null | string = null;\n let holidayCssClass: null | string = null;\n if (isHoliday) {\n const globalHoliday = this.calendarService.holidays.find((d) => currentDay.equal(d.date, 'day'));\n const internalHoliday = this.schedulerService.internalHoliday().find((d) => currentDay.equal(d.date, 'day'));\n const holiday = globalHoliday || internalHoliday;\n if (holiday) {\n holidayTitle = holiday.title;\n holidayCssClass = holiday.cssClass;\n }\n }\n\n days.push({\n date: currentDay,\n isCurrentMonth: currentDay.monthOfYear === monthStart.monthOfYear,\n isToday: currentDay.equal(today, 'day'),\n isHoliday,\n holidayTitle,\n holidayCssClass,\n });\n currentDay = currentDay.add('day', 1);\n }\n return { days: days, weeksNeeded: actualWeeksToShow };\n });\n\n // --- Appointment Grouping ---\n private appointmentsGroupedByDay = computed(() => {\n const { days } = this.calendarDaysInfo(); // Destructure to get days array\n if (days.length === 0) return new Map<string, AXSchedulerAppointment[]>();\n\n const viewStartDate = days[0].date;\n const viewEndDate = days[days.length - 1].date;\n const relevantAppointments = this.appointments();\n\n return this.schedulerService.groupAppointmentsByDay(relevantAppointments, viewStartDate, viewEndDate);\n });\n\n // --- Day Cell Layout Calculation ---\n protected dayCellLayouts = computed<AXSchedulerMonthDayCell[]>(() => {\n const { days: initialDaysInfo } = this.calendarDaysInfo();\n const allOriginalAppointments = this.appointments();\n\n if (initialDaysInfo.length === 0) {\n return []; // Return empty array if no days to process\n }\n if (!allOriginalAppointments || allOriginalAppointments.length === 0) {\n // If no appointments, map initialDaysInfo to the full structure with empty appointment arrays\n return initialDaysInfo.map((dayInfo) => ({\n ...dayInfo,\n appointments: [],\n visibleAppointments: [],\n hiddenAppointments: [],\n overflowCount: 0,\n }));\n }\n\n return initialDaysInfo.map((dayInfo) => {\n const dayAsStartOfDay = dayInfo.date.startOf('day');\n const segmentsForThisDay: AXSchedulerAppointmentSegment[] = [];\n\n for (const appt of allOriginalAppointments) {\n const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(\n appt,\n dayAsStartOfDay,\n 0, // viewStartHour for month cell context (full day)\n 24, // viewEndHour for month cell context (full day)\n true, // isFullDayCellContext = true\n );\n if (segment) {\n segmentsForThisDay.push(segment);\n }\n }\n\n const sortedSegments = orderBy(\n segmentsForThisDay,\n [\n (s) => (s.allDay ? 0 : 1), // Segments marked as allDay first\n (s) => s.originalStartDate.getTime(), // Then by original start time\n (s) => s.originalEndDate.getTime() - s.originalStartDate.getTime(), // Then by duration (longer first)\n (s) => s.title?.toLowerCase() ?? '', // Then by title\n ],\n ['asc', 'asc', 'desc', 'asc'],\n );\n\n const visibleAppointments = sortedSegments.slice(0, this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n const hiddenAppointments = sortedSegments.slice(this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n const overflowCount = hiddenAppointments.length;\n\n return {\n ...dayInfo,\n appointments: sortedSegments,\n visibleAppointments,\n hiddenAppointments,\n overflowCount,\n };\n });\n });\n\n // --- Dynamic Grid Rows ---\n protected gridTemplateRowsStyle = computed(() => {\n const { weeksNeeded } = this.calendarDaysInfo();\n if (!weeksNeeded || weeksNeeded <= 0) {\n return `repeat(6, minmax(0, 1fr))`; // Fallback, ensures grid is at least somewhat sensible\n }\n return `repeat(${weeksNeeded}, minmax(0, 1fr))`; // Use 1fr for equal distribution\n });\n\n protected getSlotId(e: PointerEvent) {\n const dropListElement = this.document\n .elementsFromPoint(e.clientX, e.clientY)\n .find((el): el is HTMLElement => el instanceof HTMLElement && el.dataset['slotId'] !== undefined);\n this.dragStartSlotId.set(dropListElement ? dropListElement.dataset['slotId'] : null);\n }\n\n @HostBinding('class.ax-state-readonly')\n protected get isReadonly() {\n return this.readonly();\n }\n}\n","<div class=\"ax-scheduler-month-container\">\n <!-- Weekday Header -->\n <div class=\"ax-scheduler-month-weekdays\">\n @for (day of daysArray(); track day.date.getTime()) {\n <div class=\"ax-scheduler-month-weekday\">\n {{ day | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n </div>\n }\n </div>\n\n <!-- Calendar Grid -->\n <div class=\"ax-scheduler-month-grid\" [style.gridTemplateRows]=\"gridTemplateRowsStyle()\">\n @for (dayCell of dayCellLayouts(); track dayCell.date.date.getTime()) {\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleDrop($event, dayCell.date)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n (click)=\"handleSlotEvent($event, dayCell.date)\"\n (dblclick)=\"handleSlotEvent($event, dayCell.date)\"\n (contextmenu)=\"handleSlotEvent($event, dayCell.date)\"\n class=\"ax-scheduler-month-day-cell {{\n dayCell.isHoliday ? (dayCell.holidayCssClass ?? 'ax-state-holiday') : ''\n }}\"\n [class.ax-state-today]=\"dayCell.isToday\"\n [class.ax-other-month]=\"!dayCell.isCurrentMonth\"\n [attr.data-slot-id]=\"dayCell.date.format('YYYYMMDD')\"\n >\n <div class=\"ax-scheduler-month-day-header\">\n <span class=\"ax-scheduler-month-day-number ax-scheduler-truncate\" [axTooltip]=\"dayCell.holidayTitle ?? ''\">\n {{ dayCell.date.dayOfMonth }}\n\n @if (dayCell.holidayTitle) {\n ( {{ dayCell.holidayTitle }} )\n }\n </span>\n </div>\n <div class=\"ax-scheduler-month-day-appointments\">\n <!-- Visible Appointment Segments -->\n @for (segment of dayCell.visibleAppointments; track segment.id + segment.originalStartDate) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"segment\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n (pointerdown)=\"getSlotId($event)\"\n (click)=\"handleAppointmentEvent($event, segment)\"\n (dblclick)=\"handleAppointmentEvent($event, segment)\"\n (contextmenu)=\"handleAppointmentEvent($event, segment)\"\n [title]=\"\n tooltipTemplate()\n ? ''\n : segment.title +\n (segment.allDay\n ? ''\n : ' (' +\n (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n ' - ' +\n (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n ')')\n \"\n [class.all-day-segment]=\"segment.allDay\"\n class=\"ax-scheduler-month-appointment-chip\"\n [ngClass]=\"segment.cssClass ?? `ax-scheduler-${segment.priority ?? 'primary'}-periority`\"\n [class.continuation-to-next]=\"segment.isContinuationToNextDay && !segment.allDay\"\n [class.continuation-from-prev]=\"segment.isContinuationFromPreviousDay && !segment.allDay\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltip]=\"tooltipTemplate()\"\n [axTooltipContext]=\"segment\"\n >\n <span class=\"ax-appointment-chip-title\">\n <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, segment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </span>\n @if (!segment.allDay) {\n <span>\n {{ segment.originalStartDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n -\n {{ segment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </span>\n }\n </div>\n }\n <!-- Overflow Badge and Popover -->\n @if (dayCell.overflowCount > 0) {\n <div #moreAppointments class=\"ax-scheduler-month-overflow-badge\" (click)=\"$event.stopPropagation()\">\n <!-- Stop propagation to prevent slot click -->\n +{{\n '@acorex:common.general.more-items' | translate: { params: { number: dayCell.overflowCount } } | async\n }}\n </div>\n <ax-popover [target]=\"moreAppointments\" placement=\"bottom-start\" trigger=\"click\">\n <div\n axDropZone\n [class.ax-state-readonly]=\"readonly()\"\n class=\"ax-overlay-pane ax-scheduler-popover ax-scheduler-month-popover-appointment\"\n >\n @for (segment of dayCell.hiddenAppointments; track segment.id + segment.originalStartDate) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"segment\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n (click)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n (dblclick)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n (contextmenu)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n [title]=\"\n tooltipTemplate()\n ? ''\n : segment.title +\n (segment.allDay\n ? ''\n : ' (' +\n (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n ' - ' +\n (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n ')')\n \"\n class=\"ax-scheduler-popover-appointment\"\n [class.all-day-segment]=\"segment.allDay\"\n [ngClass]=\"segment.cssClass ?? `ax-scheduler-${segment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltip]=\"tooltipTemplate()\"\n [axTooltipContext]=\"segment\"\n >\n <span class=\"ax-appointment-chip-title\">\n <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, segment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </span>\n @if (!segment.allDay) {\n <span>\n {{\n segment.originalStartDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n }}\n -\n {{\n segment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n }}\n </span>\n }\n </div>\n }\n </div>\n </ax-popover>\n }\n </div>\n </div>\n }\n </div>\n</div>\n","import { AXComponent, NXComponent } from '@acorex/cdk/common';\nimport { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXCalendarService, AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AsyncPipe, NgClass, NgTemplateOutlet } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n ElementRef,\n HostBinding,\n TemplateRef,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { isEqual, orderBy } from 'lodash-es';\nimport {\n AXSchedulerAppointment,\n AXSchedulerAppointmentLayout,\n AXSchedulerAppointmentSegment,\n AXSchedulerResource,\n} from '../../scheduler.class';\nimport {\n AXSchedulerAppointmentMouseEvent,\n AXSchedulerComponent,\n AXSchedulerSlotDropEvent,\n AXSchedulerSlotMouseEvent,\n} from '../../scheduler.component';\nimport { AXSchedulerService } from '../../scheduler.service';\n\n@Component({\n selector: 'ax-scheduler-timeline-day-view',\n templateUrl: './scheduler-timeline-day-view.component.html',\n styleUrl: './scheduler-timeline-day-view.component.compiled.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n NgClass,\n NgTemplateOutlet,\n AsyncPipe,\n AXFormatPipe,\n AXDragDirective,\n AXTooltipDirective,\n AXDropZoneDirective,\n AXDecoratorIconComponent,\n AXDecoratorGenericComponent,\n ],\n providers: [{ provide: AXComponent, useExisting: AXSchedulerTimelineDayViewComponent }],\n})\nexport class AXSchedulerTimelineDayViewComponent extends NXComponent implements AfterViewInit {\n private document = inject(DOCUMENT);\n private scheduler = inject(AXSchedulerComponent);\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n\n readonly GAP_PX = 1;\n\n readonly = input(false);\n draggable = input(true);\n hasActions = input(false);\n dragStartDelay = input(0);\n calendar = input<string>();\n showResourceHeaders = input(true);\n date = input.required<AXDateTime>();\n endDayHour = input.required<number>();\n startDayHour = input.required<number>();\n showUnassignedAppointments = input(true);\n resources = input<AXSchedulerResource[]>([]);\n showCurrentTimeIndicator = input<boolean>(true);\n resourceTemplate = input<TemplateRef<unknown>>();\n appointments = input<AXSchedulerAppointment[]>([]);\n tooltipTemplate = input<string | TemplateRef<unknown>>();\n\n private dragStartSlotId = signal<string | null>(null);\n private dragStartSlotResourceId = signal<any>(null);\n\n currentTimeLineElement = viewChild<ElementRef<HTMLElement>>('currentTimeLine');\n\n /**\n * Gets appointments grouped by resources for timeline view.\n */\n protected appointmentsByResource = computed(() => {\n const allAppointments = this.appointments();\n const resources = this.resources();\n const showUnassigned = this.showUnassignedAppointments();\n\n return this.schedulerService.filterAppointmentsByResources(allAppointments, resources, showUnassigned);\n });\n\n /**\n * Gets all resource IDs including unassigned if applicable.\n */\n protected resourceIds = computed(() => {\n const resources = this.resources();\n const showUnassigned = this.showUnassignedAppointments();\n\n return this.schedulerService.getAllResourceIds(resources, showUnassigned);\n });\n\n /**\n * Processes original appointments to get segments relevant to this specific day and its viewable hours.\n * Filters out original all-day events.\n */\n private processedSegmentsForLayout = computed<AXSchedulerAppointmentSegment[]>(() => {\n const viewDate = this.date();\n const allOriginalAppointments = this.appointments();\n const viewConfigStartHour = this.startDayHour();\n const viewConfigEndHour = this.endDayHour();\n\n if (!viewDate || !allOriginalAppointments || allOriginalAppointments.length === 0) {\n return [];\n }\n\n const segmentsOnThisDay: AXSchedulerAppointmentSegment[] = [];\n for (const appt of allOriginalAppointments) {\n if (appt.allDay) {\n // For all-day appointments, create a segment that spans the full day\n const dayStart = viewDate.startOf('day');\n const dayEnd = viewDate.endOf('day');\n\n // Check if the all-day appointment overlaps with this day\n const apptStart = this.calendarService.create(appt.startDate, this.calendar()).startOf('day');\n const apptEnd = this.calendarService.create(appt.endDate, this.calendar()).startOf('day');\n\n if (apptStart.compare(dayEnd, 'day') <= 0 && apptEnd.compare(dayStart, 'day') >= 0) {\n const allDaySegment: AXSchedulerAppointmentSegment = {\n ...appt,\n startDate: dayStart.date,\n endDate: dayEnd.date,\n allDay: true,\n originalStartDate: appt.startDate,\n originalEndDate: appt.endDate,\n isContinuationFromPreviousDay: apptStart.compare(dayStart, 'day') < 0,\n isContinuationToNextDay: apptEnd.compare(dayStart, 'day') > 0,\n originalAppointmentRef: appt,\n };\n segmentsOnThisDay.push(allDaySegment);\n }\n continue;\n }\n\n const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(\n appt,\n viewDate,\n viewConfigStartHour,\n viewConfigEndHour,\n false,\n );\n\n if (segment) {\n segmentsOnThisDay.push(segment);\n }\n }\n return segmentsOnThisDay;\n });\n\n // Internal outputs to be caught by parent AXSchedulerComponent\n slotClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotMouseEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n onActionClickInternal = output<AXSchedulerAppointmentMouseEvent>();\n onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n // --- Event Handlers ---\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n protected handleAppointmentEvent(mouseEvent: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n const appointmentRef = {\n ...originalAppointment,\n endDate: originalAppointment.endDate,\n startDate: originalAppointment.startDate,\n };\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, appointment: appointmentRef, sender: this.scheduler },\n this.eventOutputMap,\n 'appointment',\n );\n }\n protected handleSlotEvent(mouseEvent: MouseEvent, startDate: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(startDate, 'timeline-day');\n if (slotData)\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n this.eventOutputMap,\n 'slot',\n );\n }\n protected handleDrop(e: AXDropZoneDropEvent, startDate: AXDateTime, resourceId?: any) {\n const slotData = this.schedulerService.getSlotData(startDate, 'timeline-day');\n const droppedItem = e.dropped.dragData() as AXSchedulerAppointment;\n const originalAppointment = this.schedulerService.getOriginalAppointment(droppedItem);\n const appointmentRef = {\n ...originalAppointment,\n endDate: originalAppointment.endDate,\n startDate: originalAppointment.startDate,\n };\n\n // Convert 'unassigned' string to undefined for proper unassigned appointments\n const actualResourceId = resourceId === 'unassigned' ? undefined : resourceId;\n\n // Check if it's the same slot (same time AND same resource)\n const dragStartSlotId = this.dragStartSlotId();\n const dropSlotId = e.sender.element().dataset['slotId'];\n const dragStartResourceId = this.dragStartSlotResourceId();\n const isSameSlotDrop = dragStartSlotId === dropSlotId && dragStartResourceId === resourceId;\n\n this.onAppointmentDropInternal.emit({\n dropEvent: e,\n slot: { ...slotData, resourceId: actualResourceId },\n sender: this.scheduler,\n appointment: appointmentRef,\n isSameSlotDrop,\n });\n }\n protected handleActionClick(event: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n event.stopPropagation();\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n this.onActionClickInternal.emit({\n appointment: originalAppointment,\n nativeEvent: event,\n sender: this.scheduler,\n });\n }\n\n protected hoursArray = computed(() => {\n let time = this.date();\n if (!time) return [];\n time = time.set('hour', this.startDayHour()).startOf('hour');\n const hours = [time];\n while (time.hour < this.endDayHour() - 1) {\n time = time.add('hour', 1);\n hours.push(time);\n }\n return hours;\n });\n\n // --- Appointment Layout Calculation ---\n protected appointmentLayouts = computed((): AXSchedulerAppointmentLayout[] => {\n const finalLayouts: AXSchedulerAppointmentLayout[] = [];\n const viewConfigStartHour = this.startDayHour();\n const viewConfigEndHour = this.endDayHour();\n const appointmentsToLayout = this.processedSegmentsForLayout(); // USE SEGMENTS\n\n if (\n typeof viewConfigStartHour !== 'number' ||\n typeof viewConfigEndHour !== 'number' ||\n appointmentsToLayout.length === 0\n ) {\n return finalLayouts;\n }\n\n const sortedAppointments = orderBy(\n appointmentsToLayout,\n [(seg) => seg.startDate.getTime(), (seg) => seg.originalEndDate.getTime()],\n ['asc', 'desc'],\n );\n\n const rowEndTimes: AXDateTime[] = [];\n\n for (const segment of sortedAppointments) {\n const horizLayout = this.schedulerService.calculateTimelineLayout(\n segment, // Pass the segment\n viewConfigStartHour,\n viewConfigEndHour,\n );\n\n if (!horizLayout) continue; // Segment is outside the viewable hour range or invalid\n\n // For overlap check, use the segment's start and end times\n const segmentStartTime = this.calendarService.create(segment.startDate, this.calendar());\n const segmentEndTime = this.calendarService.create(segment.endDate, this.calendar());\n\n let assignedRowIndex = -1;\n for (let i = 0; i < rowEndTimes.length; i++) {\n // If this segment starts AFTER OR AT the time the row becomes free\n if (segmentStartTime.compare(rowEndTimes[i], 'minute') >= 0) {\n assignedRowIndex = i;\n break;\n }\n }\n\n if (assignedRowIndex === -1) {\n assignedRowIndex = rowEndTimes.length;\n rowEndTimes.push(segmentEndTime); // Add segment's end time for the new row\n } else {\n // Update the end time for the assigned row with this segment's end time\n rowEndTimes[assignedRowIndex] = segmentEndTime;\n }\n\n const layoutHeight = 'var(--ax-comp-scheduler-timeline-view-blocks-height)'; // CSS variable for height\n const layoutLeft = horizLayout.left;\n const layoutWidth = `calc(${horizLayout.width} - ${this.GAP_PX}px)`; // Apply horizontal gap if items are side-by-side within a row (not typical for this stacking)\n const layoutTop = `calc(${assignedRowIndex} * (${layoutHeight} + ${this.GAP_PX}px))`; // Vertical stacking with gap\n\n finalLayouts.push({\n appointment: segment, // Store the segment data\n layoutLeft,\n layoutWidth,\n layoutTop,\n layoutHeight,\n });\n }\n\n return finalLayouts;\n });\n\n /**\n * Gets appointments for a specific resource.\n */\n protected getAppointmentsForResource(resourceId: any): AXSchedulerAppointment[] {\n const appointmentsByResource = this.appointmentsByResource();\n // Find the correct key in the Map using isEqual for proper comparison\n for (const [key, appointments] of appointmentsByResource.entries()) {\n if (key === 'unassigned' && resourceId === 'unassigned') {\n return appointments;\n }\n if (key !== 'unassigned' && isEqual(key, resourceId)) {\n return appointments;\n }\n }\n return [];\n }\n\n /**\n * Gets resource title by ID.\n */\n protected getResourceTitle(resourceId: any): string {\n if (resourceId === 'unassigned') {\n return 'Unassigned';\n }\n const resources = this.resources();\n const resource = resources.find((r) => isEqual(r.id, resourceId));\n return resource?.title || String(resourceId);\n }\n\n protected getResourceContext(resourceId: any) {\n const resources = this.resources();\n const resource = resources.find((r) => isEqual(r.id, resourceId));\n return resource || { id: resourceId, title: String(resourceId) };\n }\n\n protected getCurrentTimePosition(): number | null {\n const now = this.calendarService.create(new Date(), this.calendar());\n const dayStart = this.date().startOf('day');\n const dayEnd = this.date().endOf('day');\n const startHour = this.startDayHour();\n const endHour = this.endDayHour();\n\n // Check if current time is within the displayed day\n if (now.isBefore(dayStart) || now.isAfter(dayEnd)) {\n return null;\n }\n\n // Check if current time is within the visible hours\n if (now.hour < startHour || now.hour >= endHour) {\n return null;\n }\n\n // Calculate position as percentage within the visible time range\n const currentMinutes = now.hour * 60 + now.minute;\n const startMinutes = startHour * 60;\n const endMinutes = endHour * 60;\n const totalMinutes = endMinutes - startMinutes;\n\n const positionInMinutes = currentMinutes - startMinutes;\n return (positionInMinutes / totalMinutes) * 100;\n }\n\n protected getCurrentTimePositionWithOffset(): string | null {\n const position = this.getCurrentTimePosition();\n if (position === null) {\n return null;\n }\n\n if (this.showResourceHeaders() && this.resources().length > 0) {\n return `calc(${position}% + (${100 - position} * var(--ax-comp-scheduler-resource-header-width, 8rem)) / 100)`;\n } else {\n return `${position}%`;\n }\n }\n\n ngAfterViewInit() {\n // Auto-scroll to current time when available using ResizeObserver\n this.setupCurrentTimeScroll();\n }\n\n private setupCurrentTimeScroll(): (() => void) | undefined {\n if (!this.showCurrentTimeIndicator()) {\n return undefined;\n }\n\n const currentPosition = this.getCurrentTimePosition();\n if (currentPosition === null) {\n return undefined;\n }\n\n const timeLineElement = this.currentTimeLineElement()?.nativeElement;\n if (!timeLineElement) {\n return undefined;\n }\n\n // Use ResizeObserver to detect when the element is properly rendered\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.contentRect.width > 0 && entry.contentRect.height > 0) {\n // Element has proper dimensions, scroll to it\n timeLineElement.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n // Disconnect observer after successful scroll\n resizeObserver.disconnect();\n break;\n }\n }\n });\n\n resizeObserver.observe(timeLineElement);\n\n // Cleanup on component destroy\n return () => resizeObserver.disconnect();\n }\n\n /**\n * Gets appointment layouts for a specific resource with proper positioning.\n */\n protected getAppointmentLayoutsForResource(resourceId: any): AXSchedulerAppointmentLayout[] {\n const resourceAppointments = this.getAppointmentsForResource(resourceId);\n const viewDate = this.date();\n const viewConfigStartHour = this.startDayHour();\n const viewConfigEndHour = this.endDayHour();\n\n if (!viewDate || resourceAppointments.length === 0) {\n return [];\n }\n\n // Get segments for this specific resource\n const resourceSegments: AXSchedulerAppointmentSegment[] = [];\n for (const appt of resourceAppointments) {\n const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(\n appt,\n viewDate,\n viewConfigStartHour,\n viewConfigEndHour,\n );\n if (segment) {\n resourceSegments.push(segment);\n }\n }\n\n const finalLayouts: AXSchedulerAppointmentLayout[] = [];\n const sortedAppointments = orderBy(\n resourceSegments,\n [(seg) => seg.startDate.getTime(), (seg) => seg.originalEndDate.getTime()],\n ['asc', 'desc'],\n );\n\n const rowEndTimes: AXDateTime[] = [];\n\n for (const segment of sortedAppointments) {\n const horizLayout = this.schedulerService.calculateTimelineLayout(\n segment,\n viewConfigStartHour,\n viewConfigEndHour,\n );\n\n if (!horizLayout) continue;\n\n const segmentStartTime = this.calendarService.create(segment.startDate, this.calendar());\n const segmentEndTime = this.calendarService.create(segment.endDate, this.calendar());\n\n let assignedRowIndex = -1;\n for (let i = 0; i < rowEndTimes.length; i++) {\n if (segmentStartTime.compare(rowEndTimes[i], 'minute') >= 0) {\n assignedRowIndex = i;\n break;\n }\n }\n\n if (assignedRowIndex === -1) {\n assignedRowIndex = rowEndTimes.length;\n rowEndTimes.push(segmentEndTime);\n } else {\n rowEndTimes[assignedRowIndex] = segmentEndTime;\n }\n\n const layoutHeight = 'var(--ax-comp-scheduler-timeline-view-blocks-height)';\n const layoutLeft = horizLayout.left;\n const layoutWidth = `calc(${horizLayout.width} - ${this.GAP_PX}px)`;\n const layoutTop = `calc(${assignedRowIndex} * (${layoutHeight} + ${this.GAP_PX}px))`;\n\n finalLayouts.push({\n appointment: segment,\n layoutLeft,\n layoutWidth,\n layoutTop,\n layoutHeight,\n });\n }\n\n return finalLayouts;\n }\n\n /**\n * Calculates the height for a resource row based on its appointments.\n */\n protected getResourceRowHeight(resourceId: any): string {\n const layouts = this.getAppointmentLayoutsForResource(resourceId);\n\n if (layouts.length === 0) {\n // If no appointments, use minimum height (one appointment height)\n return 'var(--ax-comp-scheduler-basic-view-blocks-height)';\n }\n\n // Calculate the maximum number of overlapping rows needed\n const appointments = layouts.map((layout) => layout.appointment);\n const maxOverlappingRows = this.calculateMaxOverlappingRows(appointments);\n\n // Use CSS calc() to handle the height calculation with CSS variables\n return `calc(var(--ax-comp-scheduler-basic-view-blocks-height) * ${maxOverlappingRows} + ${this.GAP_PX}px * ${Math.max(0, maxOverlappingRows)})`;\n }\n\n /**\n * Calculates the maximum number of overlapping appointment rows needed.\n */\n private calculateMaxOverlappingRows(appointments: AXSchedulerAppointmentSegment[]): number {\n if (appointments.length === 0) return 0;\n if (appointments.length === 1) return 1;\n\n // Sort appointments by start time, then by end time (descending)\n const sortedAppointments = [...appointments].sort((a, b) => {\n const startDiff = a.startDate.getTime() - b.startDate.getTime();\n if (startDiff !== 0) return startDiff;\n return b.endDate.getTime() - a.endDate.getTime(); // Longer appointments first\n });\n\n // Simulate the row assignment algorithm from the original layout\n const rowEndTimes: Date[] = [];\n let maxRows = 0;\n\n for (const appointment of sortedAppointments) {\n let assignedRowIndex = -1;\n\n // Find the first available row\n for (let i = 0; i < rowEndTimes.length; i++) {\n if (appointment.startDate >= rowEndTimes[i]) {\n assignedRowIndex = i;\n break;\n }\n }\n\n // If no available row, create a new one\n if (assignedRowIndex === -1) {\n assignedRowIndex = rowEndTimes.length;\n rowEndTimes.push(appointment.endDate);\n } else {\n // Update the row's end time\n rowEndTimes[assignedRowIndex] = appointment.endDate;\n }\n\n // Track the maximum number of rows used\n maxRows = Math.max(maxRows, rowEndTimes.length);\n }\n\n return Math.max(maxRows, 1); // Minimum one row\n }\n\n protected getSlotId(e: PointerEvent) {\n const dropListElement = this.document\n .elementsFromPoint(e.clientX, e.clientY)\n .find((el): el is HTMLElement => el instanceof HTMLElement && el.dataset['slotId'] !== undefined);\n this.dragStartSlotId.set(dropListElement ? dropListElement.dataset['slotId'] : null);\n this.dragStartSlotResourceId.set(dropListElement ? dropListElement.dataset['resourceId'] : null);\n }\n\n @HostBinding('class.ax-state-readonly')\n protected get isReadonly() {\n return this.readonly();\n }\n}\n","@if (resources().length === 0 || !showResourceHeaders()) {\n <!-- Original layout when no resources -->\n <div class=\"ax-scheduler-timeline-header\">\n @for (hour of hoursArray(); track hour.date.getTime()) {\n <div class=\"ax-scheduler-timeline-header-hours\">\n <span>{{ hour | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}</span>\n </div>\n }\n </div>\n\n <div class=\"ax-scheduler-timeline-content\">\n <!-- Current Time Line Indicator -->\n @if (showCurrentTimeIndicator() && getCurrentTimePositionWithOffset() !== null) {\n <div\n class=\"ax-scheduler-current-time-line\"\n [style.inset-inline-start]=\"getCurrentTimePositionWithOffset()\"\n #currentTimeLine\n ></div>\n }\n <div class=\"ax-scheduler-timeline-appointment-container\">\n @for (\n layout of resources().length === 0 ? appointmentLayouts() : getAppointmentLayoutsForResource(resourceIds()[0]);\n track layout.appointment.id\n ) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || layout.appointment.readonly || readonly()\"\n [dragData]=\"layout.appointment\"\n (pointerdown)=\"getSlotId($event)\"\n (click)=\"handleAppointmentEvent($event, layout.appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, layout.appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, layout.appointment)\"\n [title]=\"tooltipTemplate() ? '' : layout.appointment.title\"\n [style.width]=\"layout.layoutWidth\"\n [style.height]=\"layout.layoutHeight\"\n class=\"ax-scheduler-timeline-appointment\"\n [style.insetBlockStart]=\"layout.layoutTop\"\n [style.insetInlineStart]=\"layout.layoutLeft\"\n [ngClass]=\"\n layout.appointment.cssClass ?? `ax-scheduler-${layout.appointment.priority ?? 'primary'}-periority`\n \"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltipContext]=\"layout.appointment\"\n [axTooltip]=\"tooltipTemplate()\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ layout.appointment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, layout.appointment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n <ax-subtitle>\n {{\n layout.appointment.originalStartDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n }}\n -\n {{\n layout.appointment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n }}\n </ax-subtitle>\n </div>\n }\n </div>\n <div class=\"ax-scheduler-timeline-slot-row\" aria-hidden=\"true\">\n @for (time of hoursArray(); track time.date.getTime()) {\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleDrop($event, time)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n class=\"ax-scheduler-timeline-slot-cell\"\n (click)=\"handleSlotEvent($event, time)\"\n (dblclick)=\"handleSlotEvent($event, time)\"\n (contextmenu)=\"handleSlotEvent($event, time)\"\n [attr.data-slot-id]=\"time.format('YYYYMMDD-HHmm')\"\n ></div>\n }\n </div>\n </div>\n} @else {\n <!-- Resource-based layout -->\n <div class=\"ax-scheduler-timeline-resource-container\">\n <!-- Single sticky time header for all resources (only show if not used in multi-day) -->\n @if (showResourceHeaders()) {\n <div class=\"ax-scheduler-timeline-header ax-scheduler-timeline-header-sticky\">\n <div class=\"ax-scheduler-timeline-resource-header-placeholder\"><span>Resources</span></div>\n @for (hour of hoursArray(); track hour.date.getTime()) {\n <div class=\"ax-scheduler-timeline-header-hours\">\n <span>{{ hour | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}</span>\n </div>\n }\n </div>\n }\n\n <!-- Resource rows -->\n <div class=\"ax-scheduler-timeline-resource-rows\">\n <!-- Current Time Line Indicator -->\n @if (showCurrentTimeIndicator() && getCurrentTimePositionWithOffset() !== null) {\n <div\n #currentTimeLine\n class=\"ax-scheduler-current-time-line\"\n [style.inset-inline-start]=\"getCurrentTimePositionWithOffset()\"\n ></div>\n }\n\n @for (resourceId of resourceIds(); track resourceId) {\n <div class=\"ax-scheduler-timeline-resource-row\" [style.height]=\"getResourceRowHeight(resourceId)\">\n @if (showResourceHeaders()) {\n <!-- Sticky Resource Header -->\n <div class=\"ax-scheduler-timeline-resource-header ax-scheduler-timeline-resource-header-sticky\">\n @if (resourceTemplate() && typeof resourceTemplate() !== 'string') {\n <ng-container\n [ngTemplateOutlet]=\"$any(resourceTemplate())\"\n [ngTemplateOutletContext]=\"{\n $implicit: getResourceContext(resourceId),\n resource: getResourceContext(resourceId),\n resourceId: resourceId,\n }\"\n ></ng-container>\n } @else {\n <span class=\"ax-scheduler-timeline-resource-title\">{{ getResourceTitle(resourceId) }}</span>\n }\n </div>\n }\n\n <!-- Resource Content -->\n <div class=\"ax-scheduler-timeline-resource-content\">\n <div class=\"ax-scheduler-timeline-appointment-container\">\n @for (layout of getAppointmentLayoutsForResource(resourceId); track layout.appointment.id) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || layout.appointment.readonly || readonly()\"\n [dragData]=\"layout.appointment\"\n (pointerdown)=\"getSlotId($event)\"\n (click)=\"handleAppointmentEvent($event, layout.appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, layout.appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, layout.appointment)\"\n [title]=\"tooltipTemplate() ? '' : layout.appointment.title\"\n [style.width]=\"layout.layoutWidth\"\n [style.height]=\"layout.layoutHeight\"\n class=\"ax-scheduler-timeline-appointment\"\n [style.insetBlockStart]=\"layout.layoutTop\"\n [style.insetInlineStart]=\"layout.layoutLeft\"\n [ngClass]=\"\n layout.appointment.cssClass ?? `ax-scheduler-${layout.appointment.priority ?? 'primary'}-periority`\n \"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltipContext]=\"layout.appointment\"\n [axTooltip]=\"tooltipTemplate()\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ layout.appointment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, layout.appointment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n <ax-subtitle>\n {{\n layout.appointment.originalStartDate\n | format: 'time' : { format: 'HH:mm', calendar: calendar() }\n | async\n }}\n -\n {{\n layout.appointment.originalEndDate\n | format: 'time' : { format: 'HH:mm', calendar: calendar() }\n | async\n }}\n </ax-subtitle>\n </div>\n }\n </div>\n <div class=\"ax-scheduler-timeline-slot-row\" aria-hidden=\"true\">\n @for (time of hoursArray(); track time.date.getTime()) {\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleDrop($event, time, resourceId)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n class=\"ax-scheduler-timeline-slot-cell\"\n (click)=\"handleSlotEvent($event, time)\"\n (dblclick)=\"handleSlotEvent($event, time)\"\n (contextmenu)=\"handleSlotEvent($event, time)\"\n [attr.data-slot-id]=\"time.format('YYYYMMDD-HHmm')\"\n [attr.data-resource-id]=\"resourceId\"\n ></div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n}\n","import { AXComponent, NXComponent } from '@acorex/cdk/common';\nimport { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXCalendarService, AXDateTime, AXHolidayDate } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe, NgClass, NgTemplateOutlet } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n ElementRef,\n HostBinding,\n TemplateRef,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { isEqual, orderBy } from 'lodash-es';\nimport { AXSchedulerAppointment, AXSchedulerAppointmentSegment, AXSchedulerResource } from '../../scheduler.class';\nimport {\n AXSchedulerAppointmentMouseEvent,\n AXSchedulerComponent,\n AXSchedulerSlotDropEvent,\n AXSchedulerSlotMouseEvent,\n} from '../../scheduler.component';\nimport { AXSchedulerService } from '../../scheduler.service';\n\nexport interface TimelineMonthViewDayData {\n date: AXDateTime;\n // These will be segments, precisely clipped and flagged for this day\n visibleAppointments: AXSchedulerAppointmentSegment[];\n hiddenAppointments: AXSchedulerAppointmentSegment[];\n moreCount: number;\n // You might also want to store all segments for the day if needed elsewhere\n // allSegmentsForDay: AXSchedulerAppointmentSegmentType[];\n holiday?: { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate };\n // Resource-specific data\n appointmentsByResource?: Map<\n string,\n { visible: AXSchedulerAppointmentSegment[]; hidden: AXSchedulerAppointmentSegment[]; moreCount: number }\n >;\n}\n\n@Component({\n selector: 'ax-scheduler-timeline-month-view',\n templateUrl: './scheduler-timeline-month-view.component.html',\n styleUrl: './scheduler-timeline-month-view.component.compiled.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n NgClass,\n NgTemplateOutlet,\n AsyncPipe,\n AXFormatPipe,\n AXDragDirective,\n AXTranslatorPipe,\n AXPopoverComponent,\n AXTooltipDirective,\n AXDropZoneDirective,\n AXDecoratorIconComponent,\n AXDecoratorGenericComponent,\n ],\n providers: [{ provide: AXComponent, useExisting: AXSchedulerTimelineMonthViewComponent }],\n})\nexport class AXSchedulerTimelineMonthViewComponent extends NXComponent implements AfterViewInit {\n private document = inject(DOCUMENT);\n private scheduler = inject(AXSchedulerComponent);\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n\n private readonly MAX_VISIBLE_APPOINTMENTS_PER_DAY = 3;\n\n readonly = input(false);\n draggable = input(true);\n hasActions = input(false);\n dragStartDelay = input(0);\n calendar = input<string>();\n showResourceHeaders = input(true);\n date = input.required<AXDateTime>();\n showUnassignedAppointments = input(true);\n resources = input<AXSchedulerResource[]>([]);\n showCurrentTimeIndicator = input<boolean>(true);\n resourceTemplate = input<TemplateRef<unknown>>();\n appointments = input<AXSchedulerAppointment[]>([]);\n tooltipTemplate = input<string | TemplateRef<unknown>>();\n\n private dragStartSlotId = signal<string | null>(null);\n private dragStartSlotResourceId = signal<any>(null);\n\n currentTimeLineElement = viewChild<ElementRef<HTMLElement>>('currentTimeLine');\n\n protected processedDayData = computed<TimelineMonthViewDayData[]>(() => {\n const allOriginalAppointments = this.appointments();\n const monthStartDate = this.date().startOf('month');\n const daysInMonth = monthStartDate.endOf('month').dayOfMonth;\n const resources = this.resources();\n const showUnassigned = this.showUnassignedAppointments();\n\n if (!allOriginalAppointments) {\n return Array.from({ length: daysInMonth }, (_, i) => {\n const dayDate = monthStartDate.add('day', i);\n\n return {\n date: dayDate,\n visibleAppointments: [],\n hiddenAppointments: [],\n moreCount: 0,\n appointmentsByResource: resources.length > 0 ? new Map() : undefined,\n };\n });\n }\n\n const result: TimelineMonthViewDayData[] = [];\n\n for (let i = 0; i < daysInMonth; i++) {\n const currentDayDate = monthStartDate.add('day', i).startOf('day'); // Ensure it's start of day\n const segmentsForThisDay: AXSchedulerAppointmentSegment[] = [];\n\n for (const appt of allOriginalAppointments) {\n // For Timeline Month View, each day is a row. We want segments for the full 24h of that day.\n // The view's startHour/endHour are NOT used to clip segments here,\n // as it's not a horizontal time scale *within* the day row.\n const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(appt, currentDayDate, 0, 24, true);\n if (segment) {\n segmentsForThisDay.push(segment);\n }\n }\n\n // Sort segments: all-day first, then by segment start time (which is clipped to the day)\n const sortedSegments = orderBy(\n segmentsForThisDay,\n [\n (s) => (s.allDay ? 0 : 1), // Segments marked as allDay first\n (s) => s.startDate.getTime(), // Segment's start time on this day\n (s) => s.endDate.getTime() - s.startDate.getTime(), // Segment's duration on this day\n (s) => s.title?.toLowerCase() ?? '',\n ],\n ['asc', 'asc', 'desc', 'asc'],\n );\n\n const visibleAppointments = sortedSegments.slice(0, this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n const hiddenAppointments = sortedSegments.slice(this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n\n // Handle resource grouping if resources are provided\n let appointmentsByResource:\n | Map<\n string,\n { visible: AXSchedulerAppointmentSegment[]; hidden: AXSchedulerAppointmentSegment[]; moreCount: number }\n >\n | undefined;\n\n if (resources.length > 0) {\n appointmentsByResource = new Map();\n const resourceIds = this.schedulerService.getAllResourceIds(resources, showUnassigned);\n\n for (const resourceId of resourceIds) {\n // Filter segments by resource ID\n const resourceSegments = sortedSegments.filter((segment) => {\n if (resourceId === 'unassigned') {\n return segment.resourceId === undefined || segment.resourceId === null;\n }\n return isEqual(segment.resourceId, resourceId);\n });\n\n const resourceVisible = resourceSegments.slice(0, this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n const resourceHidden = resourceSegments.slice(this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n\n appointmentsByResource.set(resourceId, {\n visible: resourceVisible,\n hidden: resourceHidden,\n moreCount: resourceHidden.length,\n });\n }\n }\n\n result.push({\n date: currentDayDate,\n visibleAppointments: visibleAppointments,\n hiddenAppointments: hiddenAppointments,\n moreCount: hiddenAppointments.length,\n holiday: this.isHoliday(currentDayDate),\n appointmentsByResource,\n });\n }\n return result;\n });\n\n // Internal outputs to be caught by parent AXSchedulerComponent\n slotClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotMouseEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n onActionClickInternal = output<AXSchedulerAppointmentMouseEvent>();\n onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n // --- Event Handlers ---\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n protected handleAppointmentEvent(mouseEvent: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n const appointmentRef = {\n ...originalAppointment,\n endDate: originalAppointment.endDate,\n startDate: originalAppointment.startDate,\n };\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, appointment: appointmentRef, sender: this.scheduler },\n this.eventOutputMap,\n 'appointment',\n );\n }\n protected handleSlotEvent(mouseEvent: MouseEvent, date: AXDateTime) {\n // date is the specific day\n const slotData = this.schedulerService.getSlotData(date.startOf('day'), 'timeline-month');\n if (slotData)\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n this.eventOutputMap,\n 'slot',\n );\n }\n protected handleDrop(e: AXDropZoneDropEvent, date: AXDateTime, resourceId?: any) {\n // date is the specific day\n const slotData = this.schedulerService.getSlotData(date.startOf('day'), 'timeline-month');\n const droppedItem = e.dropped.dragData() as AXSchedulerAppointment;\n const originalAppointment = this.schedulerService.getOriginalAppointment(droppedItem);\n const appointmentRef = {\n ...originalAppointment,\n endDate: originalAppointment.endDate,\n startDate: originalAppointment.startDate,\n };\n\n // Convert 'unassigned' string to undefined for proper unassigned appointments\n const actualResourceId = resourceId === 'unassigned' ? undefined : resourceId;\n\n // Check if it's the same slot (same time AND same resource)\n const dragStartSlotId = this.dragStartSlotId();\n const dropSlotId = e.sender.element().dataset['slotId'];\n const dragStartResourceId = this.dragStartSlotResourceId();\n const isSameSlotDrop = dragStartSlotId === dropSlotId && dragStartResourceId === resourceId;\n\n this.onAppointmentDropInternal.emit({\n dropEvent: e,\n slot: { ...slotData, resourceId: actualResourceId },\n sender: this.scheduler,\n appointment: appointmentRef,\n isSameSlotDrop,\n });\n }\n protected handleActionClick(event: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n event.stopPropagation();\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n this.onActionClickInternal.emit({\n appointment: originalAppointment,\n nativeEvent: event,\n sender: this.scheduler,\n });\n }\n\n protected isToday(date: AXDateTime): boolean {\n const today = this.calendarService.create(new Date());\n return date.equal(today, 'day');\n }\n protected isHoliday(date: AXDateTime): { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate } {\n const isHoliday = this.schedulerService.isHoliday(date);\n if (isHoliday) {\n const globalHoliday = this.calendarService.holidays.find((d) => date.equal(d.date, 'day'));\n const internalHoliday = this.schedulerService.internalHoliday().find((d) => date.equal(d.date, 'day'));\n const holiday = globalHoliday || internalHoliday;\n return {\n state: 'holiday',\n holiday,\n };\n }\n const isWeekend = this.schedulerService.isWeekend(date, this.calendar());\n if (isWeekend) {\n return { state: 'weekend' };\n }\n return { state: 'none' };\n }\n\n /**\n * Gets appointments grouped by resources for timeline view.\n */\n protected appointmentsByResource = computed(() => {\n const allAppointments = this.appointments();\n const resources = this.resources();\n const showUnassigned = this.showUnassignedAppointments();\n\n return this.schedulerService.filterAppointmentsByResources(allAppointments, resources, showUnassigned);\n });\n\n /**\n * Gets all resource IDs including unassigned if applicable.\n */\n protected resourceIds = computed(() => {\n const resources = this.resources();\n const showUnassigned = this.showUnassignedAppointments();\n\n return this.schedulerService.getAllResourceIds(resources, showUnassigned);\n });\n\n /**\n * Gets appointments for a specific resource.\n */\n protected getAppointmentsForResource(resourceId: any): AXSchedulerAppointment[] {\n const appointmentsByResource = this.appointmentsByResource();\n // Find the correct key in the Map using isEqual for proper comparison\n for (const [key, appointments] of appointmentsByResource.entries()) {\n if (key === 'unassigned' && resourceId === 'unassigned') {\n return appointments;\n }\n if (key !== 'unassigned' && isEqual(key, resourceId)) {\n return appointments;\n }\n }\n return [];\n }\n\n /**\n * Gets resource title by ID.\n */\n protected getResourceTitle(resourceId: any): string {\n if (resourceId === 'unassigned') {\n return 'Unassigned';\n }\n const resources = this.resources();\n const resource = resources.find((r) => isEqual(r.id, resourceId));\n return resource?.title || String(resourceId);\n }\n\n protected getResourceContext(resourceId: any) {\n const resources = this.resources();\n const resource = resources.find((r) => isEqual(r.id, resourceId));\n return resource || { id: resourceId, title: String(resourceId) };\n }\n\n protected getCurrentTimePosition(): number | null {\n const now = this.calendarService.create(new Date(), this.calendar());\n const monthStart = this.date().startOf('month');\n const monthEnd = this.date().endOf('month');\n\n // Check if current time is within the displayed month\n if (now.isBefore(monthStart) || now.isAfter(monthEnd)) {\n return null;\n }\n\n // Calculate position as percentage of the month\n const durationFromStart = now.duration(monthStart);\n const totalDuration = monthEnd.duration(monthStart);\n return (durationFromStart.total.days / totalDuration.total.days) * 100;\n }\n\n ngAfterViewInit() {\n // Auto-scroll to current time when available using ResizeObserver\n this.setupCurrentTimeScroll();\n }\n\n private setupCurrentTimeScroll(): (() => void) | undefined {\n const currentPosition = this.getCurrentTimePosition();\n if (currentPosition === null) {\n return undefined;\n }\n\n const timeLineElement = this.currentTimeLineElement()?.nativeElement;\n if (!timeLineElement) {\n return undefined;\n }\n\n // Use ResizeObserver to detect when the element is properly rendered\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.contentRect.width > 0 && entry.contentRect.height > 0) {\n // Element has proper dimensions, scroll to it\n timeLineElement.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n // Disconnect observer after successful scroll\n resizeObserver.disconnect();\n break;\n }\n }\n });\n\n resizeObserver.observe(timeLineElement);\n\n // Cleanup on component destroy\n return () => resizeObserver.disconnect();\n }\n\n /**\n * Gets appointments for a specific resource and day.\n */\n protected getAppointmentsForResourceAndDay(\n resourceId: any,\n dayData: TimelineMonthViewDayData,\n ): { visible: AXSchedulerAppointmentSegment[]; hidden: AXSchedulerAppointmentSegment[]; moreCount: number } {\n if (!dayData.appointmentsByResource) {\n return { visible: [], hidden: [], moreCount: 0 };\n }\n return dayData.appointmentsByResource.get(resourceId) || { visible: [], hidden: [], moreCount: 0 };\n }\n\n protected getSlotId(e: PointerEvent) {\n const dropListElement = this.document\n .elementsFromPoint(e.clientX, e.clientY)\n .find((el): el is HTMLElement => el instanceof HTMLElement && el.dataset['slotId'] !== undefined);\n this.dragStartSlotId.set(dropListElement ? dropListElement.dataset['slotId'] : null);\n this.dragStartSlotResourceId.set(dropListElement ? dropListElement.dataset['resourceId'] : null);\n }\n\n /**\n * Gets the height for a specific resource row based on appointments.\n */\n protected getResourceRowHeight(resourceId: any): string {\n const dayData = this.processedDayData();\n let maxAppointments = 0;\n let hasMoreLink = false;\n\n // Find the maximum number of visible appointments for this resource across all days\n // Only consider visible appointments, not hidden ones\n for (const day of dayData) {\n const resourceAppointments = this.getAppointmentsForResourceAndDay(resourceId, day);\n maxAppointments = Math.max(maxAppointments, resourceAppointments.visible.length);\n\n // Check if any day has hidden appointments (more link)\n if (resourceAppointments.moreCount > 0) {\n hasMoreLink = true;\n }\n }\n\n if (maxAppointments === 0) {\n // If no appointments, use minimum height (one appointment height)\n return 'var(--ax-comp-scheduler-basic-view-blocks-height)';\n }\n\n // Use CSS calc with CSS variables for dynamic height calculation\n // Formula: (appointments * appointment-height) + (gaps) + (more-link if present)\n const appointmentHeight = 'var(--ax-comp-scheduler-timeline-month-appointment-height, 3rem)';\n const gapHeight = 'var(--ax-comp-scheduler-timeline-month-gap-height, 0.125rem)';\n const moreLinkHeight = 'var(--ax-comp-scheduler-timeline-month-more-link-height, 2.5rem)';\n\n if (hasMoreLink) {\n // If there are hidden appointments, add space for the more link\n return `calc(${maxAppointments} * ${appointmentHeight} + ${maxAppointments - 1} * ${gapHeight} + ${moreLinkHeight})`;\n } else {\n // No more link needed\n return `calc(${maxAppointments} * ${appointmentHeight} + ${maxAppointments - 1} * ${gapHeight})`;\n }\n }\n\n /**\n * Calculates the maximum number of overlapping appointment rows needed.\n * This is a simplified version for timeline month view.\n */\n protected calculateMaxOverlappingRows(appointments: AXSchedulerAppointmentSegment[]): number {\n if (appointments.length === 0) return 1;\n\n // For timeline month view, we'll use a simple approach\n // Each appointment takes one row, so the max overlapping rows is just the count\n return Math.max(1, appointments.length);\n }\n\n protected shouldShowCurrentTimeForDay(dayDate: AXDateTime): boolean {\n const now = this.calendarService.create(new Date(), this.calendar());\n const monthStart = this.date().startOf('month');\n const monthEnd = this.date().endOf('month');\n\n // Check if current time is within the displayed month range\n if (now.isBefore(monthStart) || now.isAfter(monthEnd)) {\n return false;\n }\n\n // Check if current time is on the same day as this day column\n return now.isSame(dayDate, 'day');\n }\n\n @HostBinding('class.ax-state-readonly')\n protected get isReadonly() {\n return this.readonly();\n }\n}\n","@if (resources().length === 0 || !showResourceHeaders()) {\n <!-- Original layout when no resources -->\n <div class=\"ax-scheduler-timeline-month-container\">\n @for (dayData of processedDayData(); track dayData.date.date.getTime()) {\n <div>\n <div class=\"ax-scheduler-timeline-header\">\n <div\n [class.ax-state-today]=\"isToday(dayData.date)\"\n class=\"ax-scheduler-month-header-date-day {{\n dayData.holiday.state !== 'none' ? (dayData.holiday.holiday?.cssClass ?? 'ax-state-holiday') : ''\n }}\"\n >\n <span\n class=\"ax-scheduler-month-header-date-day-char ax-scheduler-truncate\"\n [axTooltip]=\"dayData.holiday.holiday?.title ?? ''\"\n >\n {{ dayData.date | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n @if (dayData.holiday.state === 'holiday' && dayData.holiday.holiday.title) {\n ( {{ dayData.holiday.holiday.title }} )\n }\n </span>\n <span class=\"ax-scheduler-month-header-date-day-num\">\n {{ dayData.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n </span>\n </div>\n </div>\n\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleDrop($event, dayData.date)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n class=\"ax-scheduler-timeline-content\"\n (click)=\"handleSlotEvent($event, dayData.date)\"\n (dblclick)=\"handleSlotEvent($event, dayData.date)\"\n (contextmenu)=\"handleSlotEvent($event, dayData.date)\"\n [attr.data-slot-id]=\"dayData.date.format('YYYYMMDD')\"\n >\n <!-- Current Time Line Indicator -->\n @if (\n showCurrentTimeIndicator() && shouldShowCurrentTimeForDay(dayData.date) && getCurrentTimePosition() !== null\n ) {\n <div\n class=\"ax-scheduler-current-time-line\"\n [style.inset-inline-start.%]=\"getCurrentTimePosition()\"\n #currentTimeLine\n ></div>\n }\n <div class=\"ax-scheduler-timeline-appointment-container\">\n @for (segment of dayData.visibleAppointments; track segment.id + segment.originalStartDate.getTime()) {\n <div\n axDrag\n [dragData]=\"segment\"\n [dragCursor]=\"'grab'\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n (pointerdown)=\"getSlotId($event)\"\n (click)=\"handleAppointmentEvent($event, segment)\"\n (dblclick)=\"handleAppointmentEvent($event, segment)\"\n (contextmenu)=\"handleAppointmentEvent($event, segment)\"\n [title]=\"\n tooltipTemplate()\n ? ''\n : segment.allDay\n ? segment.title +\n ' (' +\n (segment.originalStartDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async) +\n ' - ' +\n (segment.originalEndDate | format: 'date' : { format: 'MMM d', calendar: calendar() } | async) +\n ')'\n : segment.title +\n ' (' +\n (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n ' - ' +\n (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n ')'\n \"\n class=\"ax-scheduler-timeline-appointment\"\n [class.all-day-segment]=\"segment.allDay\"\n [ngClass]=\"segment.cssClass ?? `ax-scheduler-${segment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltip]=\"tooltipTemplate()\"\n [axTooltipContext]=\"segment\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, segment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n <!-- Display segment's start/end times or date range -->\n <ax-subtitle>\n @if (segment.allDay) {\n {{ segment.originalStartDate | format: 'date' : { format: 'MMM d', calendar: calendar() } | async }}\n @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n -\n {{ segment.originalEndDate | format: 'date' : { format: 'MMM d', calendar: calendar() } | async }}\n }\n } @else {\n {{ segment.originalStartDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n -\n {{ segment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n }\n </ax-subtitle>\n </div>\n }\n @if (dayData.moreCount > 0) {\n <div #moreAppointments class=\"ax-scheduler-month-overflow-badge\" (click)=\"$event.stopPropagation()\">\n +{{\n '@acorex:common.general.more-items' | translate: { params: { number: dayData.moreCount } } | async\n }}\n </div>\n <ax-popover [target]=\"moreAppointments\" placement=\"bottom-start\" trigger=\"click\">\n <div\n axDropZone\n [class.ax-state-readonly]=\"readonly()\"\n class=\"ax-overlay-pane ax-scheduler-popover ax-scheduler-month-popover-appointment\"\n >\n @for (segment of dayData.hiddenAppointments; track segment.id + segment.originalStartDate.getTime()) {\n <div\n axDrag\n [dragData]=\"segment\"\n [dragCursor]=\"'grab'\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n (click)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n (dblclick)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n (contextmenu)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n [title]=\"\n tooltipTemplate()\n ? ''\n : segment.allDay\n ? segment.title +\n ' (' +\n (segment.originalStartDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async) +\n ' - ' +\n (segment.originalEndDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async) +\n ')'\n : segment.title +\n ' (' +\n (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n ' - ' +\n (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n ')'\n \"\n class=\"ax-scheduler-popover-appointment\"\n [class.all-day-segment]=\"segment.allDay\"\n [ngClass]=\"segment.cssClass ?? `ax-scheduler-${segment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltip]=\"tooltipTemplate()\"\n [axTooltipContext]=\"segment\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, segment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n <ax-subtitle>\n @if (segment.allDay) {\n {{\n segment.originalStartDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async\n }}\n @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n -\n {{\n segment.originalEndDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async\n }}\n }\n } @else {\n {{\n segment.originalStartDate\n | format: 'time' : { format: 'HH:mm', calendar: calendar() }\n | async\n }}\n -\n {{\n segment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n }}\n }\n </ax-subtitle>\n </div>\n }\n </div>\n </ax-popover>\n }\n </div>\n </div>\n </div>\n }\n </div>\n} @else {\n <!-- Resource-based layout with sticky resources -->\n <div class=\"ax-scheduler-timeline-month-resource-container\">\n <!-- Sticky header with resource placeholder and day headers -->\n @if (showResourceHeaders()) {\n <div class=\"ax-scheduler-timeline-month-header-sticky\">\n <div class=\"ax-scheduler-timeline-month-resource-header-placeholder\"><span>Resources</span></div>\n @for (dayData of processedDayData(); track dayData.date.date.getTime()) {\n <div class=\"ax-scheduler-timeline-month-day-header\">\n <div\n [class.ax-state-today]=\"isToday(dayData.date)\"\n class=\"ax-scheduler-month-header-date-day {{\n dayData.holiday?.state !== 'none' ? (dayData.holiday?.holiday?.cssClass ?? 'ax-state-holiday') : ''\n }}\"\n >\n <span\n class=\"ax-scheduler-month-header-date-day-char ax-scheduler-truncate\"\n [axTooltip]=\"dayData.holiday?.holiday?.title ?? ''\"\n >\n {{ dayData.date | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n @if (dayData.holiday?.state === 'holiday' && dayData.holiday?.holiday?.title) {\n ( {{ dayData.holiday.holiday.title }} )\n }\n </span>\n <span class=\"ax-scheduler-month-header-date-day-num\">\n {{ dayData.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n </span>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Resource rows with sticky resource headers -->\n <div class=\"ax-scheduler-timeline-month-resource-rows\">\n <!-- Current Time Line Indicator -->\n @if (showCurrentTimeIndicator() && getCurrentTimePosition() !== null) {\n <div\n class=\"ax-scheduler-current-time-line\"\n [style.inset-inline-start.%]=\"getCurrentTimePosition()\"\n #currentTimeLine\n ></div>\n }\n\n @for (resourceId of resourceIds(); track resourceId) {\n <div class=\"ax-scheduler-timeline-month-resource-row\" [style.height]=\"getResourceRowHeight(resourceId)\">\n @if (showResourceHeaders()) {\n <!-- Sticky Resource Header -->\n <div class=\"ax-scheduler-timeline-month-resource-header ax-scheduler-timeline-month-resource-header-sticky\">\n @if (resourceTemplate() && typeof resourceTemplate() !== 'string') {\n <ng-container\n [ngTemplateOutlet]=\"$any(resourceTemplate())\"\n [ngTemplateOutletContext]=\"{\n $implicit: getResourceContext(resourceId),\n resource: getResourceContext(resourceId),\n resourceId: resourceId,\n }\"\n ></ng-container>\n } @else {\n <span class=\"ax-scheduler-timeline-month-resource-title\">{{ getResourceTitle(resourceId) }}</span>\n }\n </div>\n }\n\n <!-- Resource Content -->\n <div class=\"ax-scheduler-timeline-month-resource-content\">\n @for (dayData of processedDayData(); track dayData.date.date.getTime()) {\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleDrop($event, dayData.date, resourceId)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n class=\"ax-scheduler-timeline-content\"\n (click)=\"handleSlotEvent($event, dayData.date)\"\n (dblclick)=\"handleSlotEvent($event, dayData.date)\"\n (contextmenu)=\"handleSlotEvent($event, dayData.date)\"\n [attr.data-slot-id]=\"dayData.date.format('YYYYMMDD')\"\n [attr.data-resource-id]=\"resourceId\"\n >\n <div class=\"ax-scheduler-timeline-appointment-container\">\n @for (\n segment of getAppointmentsForResourceAndDay(resourceId, dayData).visible;\n track segment.id + segment.originalStartDate.getTime()\n ) {\n <div\n axDrag\n [dragData]=\"segment\"\n [dragCursor]=\"'grab'\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n (pointerdown)=\"getSlotId($event)\"\n (click)=\"handleAppointmentEvent($event, segment)\"\n (dblclick)=\"handleAppointmentEvent($event, segment)\"\n (contextmenu)=\"handleAppointmentEvent($event, segment)\"\n [title]=\"\n tooltipTemplate()\n ? ''\n : segment.allDay\n ? segment.title +\n ' (' +\n (segment.originalStartDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async) +\n ' - ' +\n (segment.originalEndDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async) +\n ')'\n : segment.title +\n ' (' +\n (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n ' - ' +\n (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n ')'\n \"\n class=\"ax-scheduler-timeline-appointment\"\n [class.all-day-segment]=\"segment.allDay\"\n [ngClass]=\"segment.cssClass ?? `ax-scheduler-${segment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltip]=\"tooltipTemplate()\"\n [axTooltipContext]=\"segment\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, segment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n <ax-subtitle>\n @if (segment.allDay) {\n {{\n segment.originalStartDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async\n }}\n @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n -\n {{\n segment.originalEndDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async\n }}\n }\n } @else {\n {{\n segment.originalStartDate\n | format: 'time' : { format: 'HH:mm', calendar: calendar() }\n | async\n }}\n -\n {{\n segment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n }}\n }\n </ax-subtitle>\n </div>\n }\n @if (getAppointmentsForResourceAndDay(resourceId, dayData).moreCount > 0) {\n <div #moreAppointments class=\"ax-scheduler-month-overflow-badge\" (click)=\"$event.stopPropagation()\">\n +{{\n '@acorex:common.general.more-items'\n | translate\n : { params: { number: getAppointmentsForResourceAndDay(resourceId, dayData).moreCount } }\n | async\n }}\n </div>\n <ax-popover [target]=\"moreAppointments\" placement=\"bottom-start\" trigger=\"click\">\n <div\n axDropZone\n [class.ax-state-readonly]=\"readonly()\"\n class=\"ax-overlay-pane ax-scheduler-popover ax-scheduler-month-popover-appointment\"\n >\n @for (\n segment of getAppointmentsForResourceAndDay(resourceId, dayData).hidden;\n track segment.id + segment.originalStartDate.getTime()\n ) {\n <div\n axDrag\n [dragData]=\"segment\"\n [dragCursor]=\"'grab'\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n (click)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n (dblclick)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n (contextmenu)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n [title]=\"\n tooltipTemplate()\n ? ''\n : segment.allDay\n ? segment.title +\n ' (' +\n (segment.originalStartDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async) +\n ' - ' +\n (segment.originalEndDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async) +\n ')'\n : segment.title +\n ' (' +\n (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n ' - ' +\n (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n ')'\n \"\n class=\"ax-scheduler-popover-appointment\"\n [class.all-day-segment]=\"segment.allDay\"\n [ngClass]=\"segment.cssClass ?? `ax-scheduler-${segment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltip]=\"tooltipTemplate()\"\n [axTooltipContext]=\"segment\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, segment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n <ax-subtitle>\n @if (segment.allDay) {\n {{\n segment.originalStartDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async\n }}\n @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n -\n {{\n segment.originalEndDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async\n }}\n }\n } @else {\n {{\n segment.originalStartDate\n | format: 'time' : { format: 'HH:mm', calendar: calendar() }\n | async\n }}\n -\n {{\n segment.originalEndDate\n | format: 'time' : { format: 'HH:mm', calendar: calendar() }\n | async\n }}\n }\n </ax-subtitle>\n </div>\n }\n </div>\n </ax-popover>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n}\n","import { AXComponent, NXComponent } from '@acorex/cdk/common';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXCalendarService, AXDateTime, AXHolidayDate } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AsyncPipe, NgTemplateOutlet } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n TemplateRef,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport { isEqual } from 'lodash-es';\nimport { AXSchedulerAppointment, AXSchedulerResource } from '../../scheduler.class';\nimport {\n AXSchedulerAppointmentMouseEvent,\n AXSchedulerSlotDropEvent,\n AXSchedulerSlotMouseEvent,\n} from '../../scheduler.component';\nimport { AXSchedulerService } from '../../scheduler.service';\nimport { AXSchedulerTimelineDayViewComponent } from '../timeline-day/scheduler-timeline-day-view.component';\n\nexport interface TimelineMultiDayDaySlot {\n date: AXDateTime;\n // Pass the RAW original appointments that *overlap* with this day.\n // The child timeline-day-view will handle segmentation.\n originalAppointmentsForThisDay: AXSchedulerAppointment[];\n holiday?: { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate };\n}\n\n@Component({\n selector: 'ax-scheduler-timeline-multi-day-view',\n templateUrl: './scheduler-timeline-multi-day-view.component.html',\n styleUrl: './scheduler-timeline-multi-day-view.component.compiled.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [AsyncPipe, NgTemplateOutlet, AXFormatPipe, AXTooltipDirective, AXSchedulerTimelineDayViewComponent],\n providers: [{ provide: AXComponent, useExisting: AXSchedulerTimelineMultiDayViewComponent }],\n})\nexport class AXSchedulerTimelineMultiDayViewComponent extends NXComponent implements AfterViewInit {\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n\n daysCount = input(7);\n readonly = input(false);\n draggable = input(true);\n hasActions = input(false);\n dragStartDelay = input(0);\n calendar = input<string>();\n showResourceHeaders = input(true);\n date = input.required<AXDateTime>();\n endDayHour = input.required<number>();\n showCurrentTimeIndicator = input(true);\n startDayHour = input.required<number>();\n showUnassignedAppointments = input(true);\n resources = input<AXSchedulerResource[]>([]);\n resourceTemplate = input<TemplateRef<unknown>>();\n appointments = input<AXSchedulerAppointment[]>([]);\n tooltipTemplate = input<string | TemplateRef<unknown>>();\n\n currentTimeLineElement = viewChild<ElementRef<HTMLElement>>('currentTimeLine');\n\n protected daysDataForTimelineViews = computed<TimelineMultiDayDaySlot[]>(() => {\n const allOriginalAppointments = this.appointments();\n const multiViewStartDate = this.date();\n const numberOfDays = this.daysCount();\n\n if (!multiViewStartDate || !allOriginalAppointments) {\n return [];\n }\n\n const result: TimelineMultiDayDaySlot[] = [];\n\n for (let i = 0; i < numberOfDays; i++) {\n const currentDayDate = multiViewStartDate.add('day', i);\n const currentDayStart = currentDayDate.startOf('day');\n const currentDayEnd = currentDayDate.endOf('day');\n\n // Filter appointments that overlap with this day, preserving original times\n const appointmentsForThisDay = allOriginalAppointments.filter((appt) => {\n const apptStart = this.calendarService.create(appt.startDate, this.calendar());\n const apptEnd = this.calendarService.create(appt.endDate, this.calendar());\n\n // Check if appointment overlaps with this day\n return apptStart.compare(currentDayEnd, 'second') <= 0 && apptEnd.compare(currentDayStart, 'second') >= 0;\n });\n\n result.push({\n date: currentDayDate,\n holiday: this.isHoliday(currentDayDate),\n originalAppointmentsForThisDay: appointmentsForThisDay,\n });\n }\n return result;\n });\n\n slotClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotMouseEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n onActionClickInternal = output<AXSchedulerAppointmentMouseEvent>();\n onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n protected handleDrop(event: AXSchedulerSlotDropEvent, resourceId: any) {\n // Convert 'unassigned' string to undefined for proper unassigned appointments\n const actualResourceId = resourceId === 'unassigned' ? undefined : resourceId;\n\n // Use the isSameSlotDrop value from the child timeline-day-view component\n // The child component has the proper context for its own day\n const isSameSlotDrop = event.isSameSlotDrop;\n\n // Update the slot with the correct resource ID\n const updatedEvent: AXSchedulerSlotDropEvent = {\n ...event,\n slot: {\n ...event.slot,\n resourceId: actualResourceId,\n },\n isSameSlotDrop,\n };\n\n this.onAppointmentDropInternal.emit(updatedEvent);\n }\n\n protected isToday(date: AXDateTime): boolean {\n const today = this.calendarService.create(new Date());\n return date.equal(today, 'day');\n }\n\n /**\n * Gets appointments grouped by resources for timeline view.\n */\n protected appointmentsByResource = computed(() => {\n const allAppointments = this.appointments();\n const resources = this.resources();\n const showUnassigned = this.showUnassignedAppointments();\n\n return this.schedulerService.filterAppointmentsByResources(allAppointments, resources, showUnassigned);\n });\n\n /**\n * Gets all resource IDs including unassigned if applicable.\n */\n protected resourceIds = computed(() => {\n const resources = this.resources();\n const showUnassigned = this.showUnassignedAppointments();\n\n return this.schedulerService.getAllResourceIds(resources, showUnassigned);\n });\n\n /**\n * Gets appointments for a specific resource.\n */\n protected getAppointmentsForResource(resourceId: any): AXSchedulerAppointment[] {\n const appointmentsByResource = this.appointmentsByResource();\n // Find the correct key in the Map using isEqual for proper comparison\n for (const [key, appointments] of appointmentsByResource.entries()) {\n if (key === 'unassigned' && resourceId === 'unassigned') {\n return appointments;\n }\n if (key !== 'unassigned' && isEqual(key, resourceId)) {\n return appointments;\n }\n }\n return [];\n }\n\n /**\n * Gets resource title by ID.\n */\n protected getResourceTitle(resourceId: any): string {\n if (resourceId === 'unassigned') {\n return 'Unassigned';\n }\n const resources = this.resources();\n const resource = resources.find((r) => isEqual(r.id, resourceId));\n return resource?.title || String(resourceId);\n }\n\n protected getResourceContext(resourceId: any) {\n const resources = this.resources();\n const resource = resources.find((r) => isEqual(r.id, resourceId));\n return resource || { id: resourceId, title: String(resourceId) };\n }\n\n protected getCurrentTimePosition(): number | null {\n const now = this.calendarService.create(new Date(), this.calendar());\n const startHour = this.startDayHour();\n const endHour = this.endDayHour();\n\n // Check if current time is within the visible hours\n if (now.hour < startHour || now.hour >= endHour) {\n return null;\n }\n\n // Calculate position as percentage within the visible time range\n const currentMinutes = now.hour * 60 + now.minute;\n const startMinutes = startHour * 60;\n const endMinutes = endHour * 60;\n const totalMinutes = endMinutes - startMinutes;\n\n const positionInMinutes = currentMinutes - startMinutes;\n return (positionInMinutes / totalMinutes) * 100;\n }\n\n protected shouldShowCurrentTimeForDay(dayDate: AXDateTime): boolean {\n const now = this.calendarService.create(new Date(), this.calendar());\n const multiViewStart = this.date();\n const multiViewEnd = this.date().add('day', this.daysCount() - 1);\n\n // Check if current time is within the displayed multi-day range\n if (now.isBefore(multiViewStart) || now.isAfter(multiViewEnd)) {\n return false;\n }\n\n // Check if current time is on the same day as this day column\n return now.isSame(dayDate, 'day');\n }\n\n ngAfterViewInit() {\n // Auto-scroll to current time when available using ResizeObserver\n this.setupCurrentTimeScroll();\n }\n\n private setupCurrentTimeScroll(): (() => void) | undefined {\n const now = this.calendarService.create(new Date(), this.calendar());\n const multiViewStart = this.date();\n const multiViewEnd = this.date().add('day', this.daysCount() - 1);\n\n // Check if current time is within the displayed multi-day range\n if (now.isBefore(multiViewStart) || now.isAfter(multiViewEnd)) {\n return undefined;\n }\n\n const currentPosition = this.getCurrentTimePosition();\n if (currentPosition === null) {\n return undefined;\n }\n\n const timeLineElement = this.currentTimeLineElement()?.nativeElement;\n if (!timeLineElement) {\n return undefined;\n }\n\n // Use ResizeObserver to detect when the element is properly rendered\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.contentRect.width > 0 && entry.contentRect.height > 0) {\n // Element has proper dimensions, scroll to it\n timeLineElement.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n // Disconnect observer after successful scroll\n resizeObserver.disconnect();\n break;\n }\n }\n });\n\n resizeObserver.observe(timeLineElement);\n\n // Cleanup on component destroy\n return () => resizeObserver.disconnect();\n }\n\n /**\n * Gets appointments for a specific resource and day.\n */\n protected getAppointmentsForResourceAndDay(\n resourceId: any,\n dayAppointments: AXSchedulerAppointment[],\n ): AXSchedulerAppointment[] {\n if (resourceId === 'unassigned') {\n return dayAppointments.filter(\n (appointment) => appointment.resourceId === undefined || appointment.resourceId === null,\n );\n }\n // Use isEqual for proper comparison of resource IDs of any type\n return dayAppointments.filter((appointment) => isEqual(appointment.resourceId, resourceId));\n }\n\n /**\n * Gets the height for a specific resource across all days.\n */\n protected getResourceRowHeight(resourceId: any): string {\n // Calculate the maximum height needed for this specific resource across all days\n const daysData = this.daysDataForTimelineViews();\n let maxHeight = 1; // Minimum height\n\n for (const daySlot of daysData) {\n const appointments = this.getAppointmentsForResourceAndDay(resourceId, daySlot.originalAppointmentsForThisDay);\n if (appointments.length > 0) {\n // Calculate overlapping rows for this resource on this day\n const overlappingRows = this.calculateMaxOverlappingRowsForAppointments(appointments, daySlot.date);\n maxHeight = Math.max(maxHeight, overlappingRows);\n }\n }\n\n // Use CSS calc to return the height\n const GAP_PX = 4; // Same as in timeline-day component\n return `calc(var(--ax-comp-scheduler-basic-view-blocks-height) * ${maxHeight} + ${GAP_PX}px * ${Math.max(0, maxHeight - 1)})`;\n }\n\n /**\n * Calculates the maximum number of overlapping rows for a set of appointments.\n * Uses the actual segmented times that will be displayed in the timeline view.\n */\n private calculateMaxOverlappingRowsForAppointments(\n appointments: AXSchedulerAppointment[],\n dayDate: AXDateTime,\n ): number {\n if (appointments.length === 0) return 1;\n if (appointments.length === 1) return 1;\n\n // Get the actual segments that will be displayed in the timeline view\n const segments: any[] = [];\n const viewConfigStartHour = this.startDayHour();\n const viewConfigEndHour = this.endDayHour();\n\n for (const appointment of appointments) {\n if (appointment.allDay) {\n // For all-day appointments, create a segment that spans the full day\n const dayStart = this.calendarService.create(appointment.startDate, this.calendar()).startOf('day');\n const dayEnd = this.calendarService.create(appointment.endDate, this.calendar()).startOf('day');\n\n // Check if the all-day appointment overlaps with the current day\n const currentDayStart = dayDate.startOf('day');\n const currentDayEnd = dayDate.endOf('day');\n\n if (dayStart.compare(currentDayEnd, 'day') <= 0 && dayEnd.compare(currentDayStart, 'day') >= 0) {\n segments.push({\n startDate: currentDayStart.date,\n endDate: currentDayEnd.date,\n allDay: true,\n });\n }\n } else {\n // For regular appointments, get the proper segment\n const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(\n appointment,\n dayDate,\n viewConfigStartHour,\n viewConfigEndHour,\n false,\n );\n\n if (segment) {\n segments.push(segment);\n }\n }\n }\n\n if (segments.length === 0) return 1;\n if (segments.length === 1) return 1;\n\n // Sort segments by start time, then by end time (descending)\n const sortedSegments = [...segments].sort((a, b) => {\n const startDiff = a.startDate.getTime() - b.startDate.getTime();\n if (startDiff !== 0) return startDiff;\n return b.endDate.getTime() - a.endDate.getTime();\n });\n\n const rowEndTimes: Date[] = [];\n let maxRows = 0;\n\n for (const segment of sortedSegments) {\n let assignedRowIndex = -1;\n\n // Find the first row where this segment can fit\n for (let i = 0; i < rowEndTimes.length; i++) {\n if (segment.startDate >= rowEndTimes[i]) {\n assignedRowIndex = i;\n break;\n }\n }\n\n // If no row is available, create a new one\n if (assignedRowIndex === -1) {\n assignedRowIndex = rowEndTimes.length;\n rowEndTimes.push(segment.endDate);\n } else {\n rowEndTimes[assignedRowIndex] = segment.endDate;\n }\n\n maxRows = Math.max(maxRows, rowEndTimes.length);\n }\n\n return Math.max(maxRows, 1);\n }\n\n /**\n * Gets the hours array for time slots display.\n */\n protected getHoursArray(): AXDateTime[] {\n const startHour = this.startDayHour();\n const endHour = this.endDayHour();\n const hours: AXDateTime[] = [];\n\n // Use the first day's date as a base for creating time slots\n const firstDay = this.daysDataForTimelineViews()[0];\n if (!firstDay) return [];\n\n let time = firstDay.date.set('hour', startHour).startOf('hour');\n hours.push(time);\n\n while (time.hour < endHour - 1) {\n time = time.add('hour', 1);\n hours.push(time);\n }\n\n return hours;\n }\n\n /**\n * Gets the number of hours for CSS calculations.\n */\n protected getHoursCount(): number {\n return this.endDayHour() - this.startDayHour();\n }\n\n protected isHoliday(date: AXDateTime): { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate } {\n const isHoliday = this.schedulerService.isHoliday(date);\n if (isHoliday) {\n const globalHoliday = this.calendarService.holidays.find((d) => date.equal(d.date, 'day'));\n const internalHoliday = this.schedulerService.internalHoliday().find((d) => date.equal(d.date, 'day'));\n const holiday = globalHoliday || internalHoliday;\n return {\n state: 'holiday',\n holiday,\n };\n }\n const isWeekend = this.schedulerService.isWeekend(date, this.calendar());\n if (isWeekend) {\n return { state: 'weekend' };\n }\n return { state: 'none' };\n }\n}\n","@if (resources().length === 0 || !showResourceHeaders()) {\n <!-- Original layout when no resources -->\n <div class=\"ax-scheduler-timeline-day-view-container\">\n @for (daySlot of daysDataForTimelineViews(); track daySlot.date.date.getTime()) {\n <div class=\"ax-scheduler-timeline-multi-day-column\">\n <div\n [class.ax-state-today]=\"isToday(daySlot.date)\"\n class=\"ax-scheduler-week-header-date-day {{\n daySlot.holiday.state !== 'none' ? (daySlot.holiday.holiday?.cssClass ?? 'ax-state-holiday') : ''\n }}\"\n >\n <span\n class=\"ax-scheduler-week-header-date-day-char ax-scheduler-truncate\"\n [axTooltip]=\"daySlot.holiday.holiday?.title ?? ''\"\n >\n {{ daySlot.date | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n @if (daySlot.holiday.state === 'holiday' && daySlot.holiday.holiday.title) {\n ( {{ daySlot.holiday.holiday.title }} )\n }\n </span>\n <span class=\"ax-scheduler-week-header-date-day-num\">\n {{ daySlot.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n </span>\n </div>\n <ax-scheduler-timeline-day-view\n [date]=\"daySlot.date\"\n [readonly]=\"readonly()\"\n [draggable]=\"draggable()\"\n [resources]=\"resources()\"\n [endDayHour]=\"endDayHour()\"\n [hasActions]=\"hasActions()\"\n [showResourceHeaders]=\"true\"\n [startDayHour]=\"startDayHour()\"\n [dragStartDelay]=\"dragStartDelay()\"\n [tooltipTemplate]=\"tooltipTemplate()\"\n [showCurrentTimeIndicator]=\"showCurrentTimeIndicator()\"\n [appointments]=\"daySlot.originalAppointmentsForThisDay\"\n [showUnassignedAppointments]=\"showUnassignedAppointments()\"\n (onActionClickInternal)=\"onActionClickInternal.emit($event)\"\n (slotClickedInternal)=\"slotClickedInternal.emit($event)\"\n (slotDblClickedInternal)=\"slotDblClickedInternal.emit($event)\"\n (slotRightClickedInternal)=\"slotRightClickedInternal.emit($event)\"\n (onAppointmentDropInternal)=\"handleDrop($event, undefined)\"\n (appointmentClickedInternal)=\"appointmentClickedInternal.emit($event)\"\n (appointmentDblClickedInternal)=\"appointmentDblClickedInternal.emit($event)\"\n (appointmentRightClickedInternal)=\"appointmentRightClickedInternal.emit($event)\"\n >\n </ax-scheduler-timeline-day-view>\n </div>\n }\n </div>\n} @else {\n <!-- Resource-based layout for multi-day -->\n <div\n class=\"ax-scheduler-timeline-multi-day-resource-container\"\n [style.--ax-comp-scheduler-hours-count]=\"getHoursCount()\"\n >\n <!-- Top header with day names -->\n <div class=\"ax-scheduler-timeline-multi-day-top-header\">\n <!-- Resource placeholder -->\n <div class=\"ax-scheduler-timeline-multi-day-resource-header-placeholder\"></div>\n <!-- Day headers -->\n @for (daySlot of daysDataForTimelineViews(); track daySlot.date.date.getTime()) {\n <div class=\"ax-scheduler-timeline-multi-day-day-header\">\n <div\n [class.ax-state-today]=\"isToday(daySlot.date)\"\n class=\"ax-scheduler-week-header-date-day {{\n daySlot.holiday.state !== 'none' ? (daySlot.holiday.holiday?.cssClass ?? 'ax-state-holiday') : ''\n }}\"\n >\n <span\n class=\"ax-scheduler-week-header-date-day-char ax-scheduler-truncate\"\n [axTooltip]=\"daySlot.holiday.holiday?.title ?? ''\"\n >\n {{ daySlot.date | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n @if (daySlot.holiday.state === 'holiday' && daySlot.holiday.holiday.title) {\n ( {{ daySlot.holiday.holiday.title }} )\n }\n </span>\n <span class=\"ax-scheduler-week-header-date-day-num\">\n {{ daySlot.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n </span>\n </div>\n </div>\n }\n </div>\n\n <!-- Time header with hours for each day -->\n <div class=\"ax-scheduler-timeline-multi-day-time-header\">\n <!-- Resource placeholder -->\n <div class=\"ax-scheduler-timeline-multi-day-time-header-placeholder\"><span>Resources</span></div>\n <!-- Time slots for each day -->\n @for (daySlot of daysDataForTimelineViews(); track daySlot.date.date.getTime()) {\n <div class=\"ax-scheduler-timeline-multi-day-day-time-slots\">\n @for (hour of getHoursArray(); track hour.date.getTime()) {\n <div class=\"ax-scheduler-timeline-multi-day-time-slot\">\n <span>{{ hour | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}</span>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Main content area -->\n <div class=\"ax-scheduler-timeline-multi-day-content\">\n <!-- Resource headers column -->\n <div class=\"ax-scheduler-timeline-multi-day-resource-headers\">\n <!-- Resource headers -->\n @for (resourceId of resourceIds(); track resourceId) {\n <div\n class=\"ax-scheduler-timeline-multi-day-resource-header\"\n [style.height]=\"getResourceRowHeight(resourceId)\"\n >\n @if (resourceTemplate() && typeof resourceTemplate() !== 'string') {\n <ng-container\n [ngTemplateOutlet]=\"$any(resourceTemplate())\"\n [ngTemplateOutletContext]=\"{\n $implicit: getResourceContext(resourceId),\n resource: getResourceContext(resourceId),\n resourceId: resourceId,\n }\"\n ></ng-container>\n } @else {\n <span class=\"ax-scheduler-timeline-resource-title\">{{ getResourceTitle(resourceId) }}</span>\n }\n </div>\n }\n </div>\n\n <!-- Days columns -->\n <div class=\"ax-scheduler-timeline-multi-day-days-container\" #daysContainer>\n @for (daySlot of daysDataForTimelineViews(); track daySlot.date.date.getTime()) {\n <div class=\"ax-scheduler-timeline-multi-day-column\">\n <!-- Current Time Line Indicator for this day -->\n @if (\n showCurrentTimeIndicator() &&\n shouldShowCurrentTimeForDay(daySlot.date) &&\n getCurrentTimePosition() !== null\n ) {\n <div\n class=\"ax-scheduler-current-time-line\"\n [style.inset-inline-start.%]=\"getCurrentTimePosition()\"\n #currentTimeLine\n ></div>\n }\n <!-- Resource rows for this day -->\n <div class=\"ax-scheduler-timeline-multi-day-resource-rows\">\n @for (resourceId of resourceIds(); track resourceId) {\n <div\n class=\"ax-scheduler-timeline-multi-day-resource-row\"\n [style.height]=\"getResourceRowHeight(resourceId)\"\n >\n <ax-scheduler-timeline-day-view\n [date]=\"daySlot.date\"\n [readonly]=\"readonly()\"\n [draggable]=\"draggable()\"\n [resources]=\"\n resourceId === 'unassigned' ? [] : [{ id: resourceId, title: getResourceTitle(resourceId) }]\n \"\n [endDayHour]=\"endDayHour()\"\n [hasActions]=\"hasActions()\"\n [showResourceHeaders]=\"false\"\n [startDayHour]=\"startDayHour()\"\n [showCurrentTimeIndicator]=\"false\"\n [dragStartDelay]=\"dragStartDelay()\"\n [tooltipTemplate]=\"tooltipTemplate()\"\n [showUnassignedAppointments]=\"resourceId === 'unassigned'\"\n [appointments]=\"\n getAppointmentsForResourceAndDay(resourceId, daySlot.originalAppointmentsForThisDay)\n \"\n (onActionClickInternal)=\"onActionClickInternal.emit($event)\"\n (slotClickedInternal)=\"slotClickedInternal.emit($event)\"\n (slotDblClickedInternal)=\"slotDblClickedInternal.emit($event)\"\n (slotRightClickedInternal)=\"slotRightClickedInternal.emit($event)\"\n (onAppointmentDropInternal)=\"handleDrop($event, resourceId)\"\n (appointmentClickedInternal)=\"appointmentClickedInternal.emit($event)\"\n (appointmentDblClickedInternal)=\"appointmentDblClickedInternal.emit($event)\"\n (appointmentRightClickedInternal)=\"appointmentRightClickedInternal.emit($event)\"\n >\n </ax-scheduler-timeline-day-view>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n}\n","import { AXComponent, NXComponent } from '@acorex/cdk/common';\nimport { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXCalendarService, AXDateTime, AXHolidayDate } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe, NgClass, NgTemplateOutlet } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n ElementRef,\n TemplateRef,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { isEqual, orderBy } from 'lodash-es';\nimport { AXSchedulerAppointment, AXSchedulerAppointmentSegment, AXSchedulerResource } from '../../scheduler.class';\nimport {\n AXSchedulerAppointmentMouseEvent,\n AXSchedulerComponent,\n AXSchedulerSlotDropEvent,\n AXSchedulerSlotMouseEvent,\n} from '../../scheduler.component';\nimport { AXSchedulerService } from '../../scheduler.service';\n\nexport interface TimelineYearViewDayData {\n date: AXDateTime;\n // These will be segments, precisely clipped and flagged for this day\n visibleAppointments: AXSchedulerAppointmentSegment[];\n hiddenAppointments: AXSchedulerAppointmentSegment[];\n moreCount: number;\n holiday?: { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate };\n // Resource-specific data\n appointmentsByResource?: Map<\n string,\n { visible: AXSchedulerAppointmentSegment[]; hidden: AXSchedulerAppointmentSegment[]; moreCount: number }\n >;\n}\n\n@Component({\n selector: 'ax-scheduler-timeline-year-view',\n templateUrl: './scheduler-timeline-year-view.component.html',\n styleUrl: './scheduler-timeline-year-view.component.compiled.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n NgClass,\n NgTemplateOutlet,\n AsyncPipe,\n AXFormatPipe,\n AXDragDirective,\n AXTranslatorPipe,\n AXPopoverComponent,\n AXTooltipDirective,\n AXDropZoneDirective,\n AXDecoratorIconComponent,\n AXDecoratorGenericComponent,\n ],\n providers: [{ provide: AXComponent, useExisting: AXSchedulerTimelineYearViewComponent }],\n})\nexport class AXSchedulerTimelineYearViewComponent extends NXComponent implements AfterViewInit {\n private document = inject(DOCUMENT);\n private scheduler = inject(AXSchedulerComponent);\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n\n private readonly MAX_VISIBLE_APPOINTMENTS_PER_DAY = 3; // Reduced for year view due to space constraints\n\n readonly = input(false);\n draggable = input(true);\n hasActions = input(false);\n dragStartDelay = input(0);\n calendar = input<string>();\n showResourceHeaders = input(true);\n date = input.required<AXDateTime>();\n showUnassignedAppointments = input(true);\n resources = input<AXSchedulerResource[]>([]);\n showCurrentTimeIndicator = input<boolean>(true);\n resourceTemplate = input<TemplateRef<unknown>>();\n appointments = input<AXSchedulerAppointment[]>([]);\n tooltipTemplate = input<string | TemplateRef<unknown>>();\n\n private dragStartSlotId = signal<string | null>(null);\n private dragStartSlotResourceId = signal<any>(null);\n\n currentTimeLineElement = viewChild<ElementRef<HTMLElement>>('currentTimeLine');\n\n // Performance optimization: reduce drag start delay for year view\n protected optimizedDragStartDelay = computed(() => {\n return this.dragStartDelay() > 0 ? Math.min(this.dragStartDelay(), 50) : 0;\n });\n\n protected processedDayData = computed<TimelineYearViewDayData[]>(() => {\n const allOriginalAppointments = this.appointments();\n const yearStartDate = this.date().startOf('year');\n const yearEndDate = this.date().endOf('year');\n const daysInYear = yearEndDate.dayOfYear;\n const resources = this.resources();\n const showUnassigned = this.showUnassignedAppointments();\n\n if (!allOriginalAppointments) {\n return Array.from({ length: daysInYear }, (_, i) => {\n const currentDayDate = yearStartDate.add('day', i).startOf('day');\n return {\n date: currentDayDate,\n visibleAppointments: [],\n hiddenAppointments: [],\n moreCount: 0,\n holiday: this.getHolidayInfo(currentDayDate),\n };\n });\n }\n\n const result: TimelineYearViewDayData[] = [];\n\n for (let i = 0; i < daysInYear; i++) {\n const currentDayDate = yearStartDate.add('day', i).startOf('day');\n const segmentsForThisDay: AXSchedulerAppointmentSegment[] = [];\n\n for (const appt of allOriginalAppointments) {\n // For Timeline Year View, each day is a column. We want segments for the full 24h of that day.\n const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(appt, currentDayDate, 0, 24, true);\n if (segment) {\n segmentsForThisDay.push(segment);\n }\n }\n\n // Sort segments: all-day first, then by segment start time (which is clipped to the day)\n const sortedSegments = orderBy(\n segmentsForThisDay,\n [\n (s) => (s.allDay ? 0 : 1), // Segments marked as allDay first\n (s) => s.startDate.getTime(), // Segment's start time on this day\n (s) => s.endDate.getTime() - s.startDate.getTime(), // Segment's duration on this day\n (s) => s.title?.toLowerCase() ?? '',\n ],\n ['asc', 'asc', 'desc', 'asc'],\n );\n\n const visibleAppointments = sortedSegments.slice(0, this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n const hiddenAppointments = sortedSegments.slice(this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n\n // Handle resource grouping if resources are provided\n let appointmentsByResource:\n | Map<\n string,\n { visible: AXSchedulerAppointmentSegment[]; hidden: AXSchedulerAppointmentSegment[]; moreCount: number }\n >\n | undefined;\n\n if (resources.length > 0) {\n appointmentsByResource = new Map();\n const allResourceIds = this.schedulerService.getAllResourceIds(resources, showUnassigned);\n\n allResourceIds.forEach((resourceId) => {\n const appointmentsForResource = this.schedulerService.getAppointmentsForResource(\n allOriginalAppointments,\n resourceId,\n );\n\n const resourceSegments: AXSchedulerAppointmentSegment[] = [];\n for (const appt of appointmentsForResource) {\n const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(appt, currentDayDate, 0, 24, true);\n if (segment) {\n resourceSegments.push(segment);\n }\n }\n\n const sortedResourceSegments = orderBy(\n resourceSegments,\n [\n (s) => (s.allDay ? 0 : 1),\n (s) => s.startDate.getTime(),\n (s) => s.endDate.getTime() - s.startDate.getTime(),\n (s) => s.title?.toLowerCase() ?? '',\n ],\n ['asc', 'asc', 'desc', 'asc'],\n );\n\n const visible = sortedResourceSegments.slice(0, this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n const hidden = sortedResourceSegments.slice(this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n\n appointmentsByResource.set(resourceId, {\n visible,\n hidden,\n moreCount: hidden.length,\n });\n });\n }\n\n result.push({\n date: currentDayDate,\n visibleAppointments,\n hiddenAppointments,\n moreCount: hiddenAppointments.length,\n holiday: this.getHolidayInfo(currentDayDate),\n appointmentsByResource,\n });\n }\n\n return result;\n });\n\n protected resourceIds = computed(() => {\n const resources = this.resources();\n if (resources.length === 0) return [];\n return this.schedulerService.getAllResourceIds(resources, this.showUnassignedAppointments());\n });\n\n private getHolidayInfo(date: AXDateTime): { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate } {\n const isHoliday = this.schedulerService.isHoliday(date);\n if (isHoliday) {\n const globalHoliday = this.calendarService.holidays.find((d) => date.equal(d.date, 'day'));\n const internalHoliday = this.schedulerService.internalHoliday().find((d) => date.equal(d.date, 'day'));\n const holiday = globalHoliday || internalHoliday;\n return {\n state: 'holiday',\n holiday,\n };\n }\n const isWeekend = this.schedulerService.isWeekend(date, this.calendar());\n if (isWeekend) {\n return { state: 'weekend' };\n }\n return { state: 'none' };\n }\n\n protected isToday(date: AXDateTime): boolean {\n const today = this.calendarService.create(new Date(), this.calendar());\n return date.equal(today, 'day');\n }\n\n protected getResourceTitle(resourceId: any): string {\n const resources = this.resources();\n const resource = resources.find((r) => isEqual(r.id, resourceId));\n return resource?.title ?? String(resourceId);\n }\n\n protected getAppointmentsForResourceAndDay(resourceId: any, dayData: TimelineYearViewDayData) {\n return dayData.appointmentsByResource?.get(resourceId) ?? { visible: [], hidden: [], moreCount: 0 };\n }\n\n protected getResourceContext(resourceId: any) {\n const resources = this.resources();\n const resource = resources.find((r) => isEqual(r.id, resourceId));\n return resource || { id: resourceId, title: String(resourceId) };\n }\n\n protected getCurrentTimePosition(): number | null {\n const now = this.calendarService.create(new Date(), this.calendar());\n const yearStart = this.date().startOf('year');\n const yearEnd = this.date().endOf('year');\n\n // Check if current time is within the displayed year\n if (now.isBefore(yearStart) || now.isAfter(yearEnd)) {\n return null;\n }\n\n // Calculate position as percentage of the year\n const durationFromStart = now.duration(yearStart);\n const totalDuration = yearEnd.duration(yearStart);\n return (durationFromStart.total.days / totalDuration.total.days) * 100;\n }\n\n ngAfterViewInit() {\n // Auto-scroll to current time when available using ResizeObserver\n this.setupCurrentTimeScroll();\n }\n\n private setupCurrentTimeScroll(): (() => void) | undefined {\n const currentPosition = this.getCurrentTimePosition();\n if (currentPosition === null) {\n return undefined;\n }\n\n const timeLineElement = this.currentTimeLineElement()?.nativeElement;\n if (!timeLineElement) {\n return undefined;\n }\n\n // Use ResizeObserver to detect when the element is properly rendered\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.contentRect.width > 0 && entry.contentRect.height > 0) {\n // Element has proper dimensions, scroll to it\n timeLineElement.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n // Disconnect observer after successful scroll\n resizeObserver.disconnect();\n break;\n }\n }\n });\n\n resizeObserver.observe(timeLineElement);\n\n // Cleanup on component destroy\n return () => resizeObserver.disconnect();\n }\n\n // Internal outputs to be caught by parent AXSchedulerComponent\n slotClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotMouseEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n onActionClickInternal = output<AXSchedulerAppointmentMouseEvent>();\n onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n // --- Event Handlers ---\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n\n protected handleAppointmentEvent(mouseEvent: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n const appointmentRef = {\n ...originalAppointment,\n endDate: originalAppointment.endDate,\n startDate: originalAppointment.startDate,\n };\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, appointment: appointmentRef, sender: this.scheduler },\n this.eventOutputMap,\n 'appointment',\n );\n }\n\n protected handleSlotEvent(mouseEvent: MouseEvent, date: AXDateTime) {\n // date is the specific day\n const slotData = this.schedulerService.getSlotData(date.startOf('day'), 'timeline-year');\n if (slotData)\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n this.eventOutputMap,\n 'slot',\n );\n }\n\n protected handleDrop(e: AXDropZoneDropEvent, date: AXDateTime, resourceId?: any) {\n // date is the specific day\n const slotData = this.schedulerService.getSlotData(date.startOf('day'), 'timeline-year');\n const droppedItem = e.dropped.dragData() as AXSchedulerAppointment;\n const originalAppointment = this.schedulerService.getOriginalAppointment(droppedItem);\n const appointmentRef = {\n ...originalAppointment,\n endDate: originalAppointment.endDate,\n startDate: originalAppointment.startDate,\n };\n\n // Convert 'unassigned' string to undefined for proper unassigned appointments\n const actualResourceId = resourceId === 'unassigned' ? undefined : resourceId;\n\n // Check if it's the same slot (same time AND same resource)\n const dragStartSlotId = this.dragStartSlotId();\n const dropSlotId = e.sender.element().dataset['slotId'];\n const dragStartResourceId = this.dragStartSlotResourceId();\n const isSameSlotDrop = dragStartSlotId === dropSlotId && dragStartResourceId === resourceId;\n\n this.onAppointmentDropInternal.emit({\n dropEvent: e,\n slot: { ...slotData, resourceId: actualResourceId },\n sender: this.scheduler,\n appointment: appointmentRef,\n isSameSlotDrop,\n });\n }\n\n protected handleActionClick(event: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n event.stopPropagation();\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n this.onActionClickInternal.emit({\n appointment: originalAppointment,\n nativeEvent: event,\n sender: this.scheduler,\n });\n }\n\n protected shouldShowCurrentTimeForDay(dayDate: AXDateTime): boolean {\n const now = this.calendarService.create(new Date(), this.calendar());\n const yearStart = this.date().startOf('year');\n const yearEnd = this.date().endOf('year');\n\n // Check if current time is within the displayed year range\n if (now.isBefore(yearStart) || now.isAfter(yearEnd)) {\n return false;\n }\n\n // Check if current time is on the same day as this day column\n return now.isSame(dayDate, 'day');\n }\n\n protected getSlotId(e: PointerEvent) {\n const dropListElement = this.document\n .elementsFromPoint(e.clientX, e.clientY)\n .find((el): el is HTMLElement => el instanceof HTMLElement && el.dataset['slotId'] !== undefined);\n this.dragStartSlotId.set(dropListElement ? dropListElement.dataset['slotId'] : null);\n this.dragStartSlotResourceId.set(dropListElement ? dropListElement.dataset['resourceId'] : null);\n }\n}\n","@if (resources().length === 0 || !showResourceHeaders()) {\n <!-- Original layout when no resources -->\n <div class=\"ax-scheduler-timeline-year-container\">\n @for (dayData of processedDayData(); track dayData.date.date.getTime()) {\n <div>\n <div class=\"ax-scheduler-timeline-header\">\n <div\n [class.ax-state-today]=\"isToday(dayData.date)\"\n class=\"ax-scheduler-year-header-date-day {{\n dayData.holiday.state !== 'none' ? (dayData.holiday.holiday?.cssClass ?? 'ax-state-holiday') : ''\n }}\"\n >\n <span\n class=\"ax-scheduler-year-header-date-day-char ax-scheduler-truncate\"\n [axTooltip]=\"dayData.holiday.holiday?.title ?? ''\"\n >\n {{ dayData.date | format: 'date' : { format: 'MMMM', calendar: calendar() } | async }}\n @if (dayData.holiday.state === 'holiday' && dayData.holiday.holiday.title) {\n ( {{ dayData.holiday.holiday.title }} )\n }\n </span>\n <span class=\"ax-scheduler-year-header-date-day-num\">\n {{ dayData.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n </span>\n </div>\n </div>\n\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleDrop($event, dayData.date)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n class=\"ax-scheduler-timeline-content\"\n (click)=\"handleSlotEvent($event, dayData.date)\"\n (dblclick)=\"handleSlotEvent($event, dayData.date)\"\n (contextmenu)=\"handleSlotEvent($event, dayData.date)\"\n [attr.data-slot-id]=\"dayData.date.format('YYYYMMDD')\"\n [style.pointer-events]=\"draggable() ? 'auto' : 'none'\"\n >\n <!-- Current Time Line Indicator -->\n @if (\n showCurrentTimeIndicator() && shouldShowCurrentTimeForDay(dayData.date) && getCurrentTimePosition() !== null\n ) {\n <div\n class=\"ax-scheduler-current-time-line\"\n [style.inset-inline-start.%]=\"getCurrentTimePosition()\"\n #currentTimeLine\n ></div>\n }\n <div class=\"ax-scheduler-timeline-appointment-container\">\n @for (segment of dayData.visibleAppointments; track segment.id + segment.originalStartDate.getTime()) {\n <div\n axDrag\n [dragData]=\"segment\"\n [dragCursor]=\"'grab'\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"optimizedDragStartDelay()\"\n [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n (pointerdown)=\"getSlotId($event)\"\n (click)=\"handleAppointmentEvent($event, segment)\"\n (dblclick)=\"handleAppointmentEvent($event, segment)\"\n (contextmenu)=\"handleAppointmentEvent($event, segment)\"\n [title]=\"\n tooltipTemplate()\n ? ''\n : segment.allDay\n ? segment.title\n : segment.title +\n ' (' +\n (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n ' - ' +\n (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n ')'\n \"\n class=\"ax-scheduler-timeline-appointment\"\n [class.all-day-segment]=\"segment.allDay\"\n [ngClass]=\"segment.cssClass ?? `ax-scheduler-${segment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltip]=\"tooltipTemplate()\"\n [axTooltipContext]=\"segment\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, segment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n <span class=\"ax-scheduler-timeline-appointment-time\">\n @if (segment.allDay) {\n {{ segment.originalStartDate | format: 'date' : { format: 'MMM d', calendar: calendar() } | async }}\n @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n -\n {{ segment.originalEndDate | format: 'date' : { format: 'MMM d', calendar: calendar() } | async }}\n }\n } @else {\n {{ segment.originalStartDate | format: 'time' : { calendar: calendar() } | async }}\n @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n -\n {{ segment.originalEndDate | format: 'time' : { calendar: calendar() } | async }}\n }\n }\n </span>\n </div>\n }\n\n <!-- Overflow Badge and Popover -->\n @if (dayData.moreCount > 0) {\n <div #moreAppointments class=\"ax-scheduler-year-overflow-badge\" (click)=\"$event.stopPropagation()\">\n +{{\n '@acorex:common.general.more-items' | translate: { params: { number: dayData.moreCount } } | async\n }}\n </div>\n <ax-popover [target]=\"moreAppointments\" placement=\"bottom-start\" trigger=\"click\">\n <div\n axDropZone\n [class.ax-state-readonly]=\"readonly()\"\n class=\"ax-overlay-pane ax-scheduler-popover ax-scheduler-timeline-year-popover-appointment\"\n >\n @for (segment of dayData.hiddenAppointments; track segment.id + segment.originalStartDate.getTime()) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"segment\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"optimizedDragStartDelay()\"\n [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n (click)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n (dblclick)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n (contextmenu)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n [title]=\"\n tooltipTemplate()\n ? ''\n : segment.allDay\n ? segment.title +\n ' (' +\n (segment.originalStartDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async) +\n ' - ' +\n (segment.originalEndDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async) +\n ')'\n : segment.title +\n ' (' +\n (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n ' - ' +\n (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n ')'\n \"\n class=\"ax-scheduler-popover-appointment\"\n [class.all-day-segment]=\"segment.allDay\"\n [ngClass]=\"segment.cssClass ?? `ax-scheduler-${segment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltip]=\"tooltipTemplate()\"\n [axTooltipContext]=\"segment\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, segment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n <span class=\"ax-scheduler-timeline-appointment-time\">\n @if (segment.allDay) {\n {{\n segment.originalStartDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async\n }}\n @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n -\n {{\n segment.originalEndDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async\n }}\n }\n } @else {\n {{ segment.originalStartDate | format: 'time' : { calendar: calendar() } | async }}\n @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n -\n {{ segment.originalEndDate | format: 'time' : { calendar: calendar() } | async }}\n }\n }\n </span>\n </div>\n }\n </div>\n </ax-popover>\n }\n </div>\n </div>\n </div>\n }\n </div>\n} @else {\n <!-- Resource-based layout -->\n <div class=\"ax-scheduler-timeline-year-resource-container\">\n <div class=\"ax-scheduler-timeline-year-header-sticky\">\n <div class=\"ax-scheduler-timeline-year-resource-header-placeholder\">\n <span>Resources</span>\n </div>\n\n <div class=\"ax-scheduler-timeline-year-day-header\">\n @for (dayData of processedDayData(); track dayData.date.date.getTime()) {\n <div\n [class.ax-state-today]=\"isToday(dayData.date)\"\n class=\"ax-scheduler-year-header-date-day {{\n dayData.holiday.state !== 'none' ? (dayData.holiday.holiday?.cssClass ?? 'ax-state-holiday') : ''\n }}\"\n >\n <span\n class=\"ax-scheduler-year-header-date-day-char ax-scheduler-truncate\"\n [axTooltip]=\"dayData.holiday.holiday?.title ?? ''\"\n >\n {{ dayData.date | format: 'date' : { format: 'MMMM', calendar: calendar() } | async }}\n @if (dayData.holiday.state === 'holiday' && dayData.holiday.holiday.title) {\n ( {{ dayData.holiday.holiday.title }} )\n }\n </span>\n <span class=\"ax-scheduler-year-header-date-day-num\">\n {{ dayData.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n </span>\n </div>\n }\n </div>\n </div>\n\n <div class=\"ax-scheduler-timeline-year-resource-rows\">\n <!-- Current Time Line Indicator -->\n @if (showCurrentTimeIndicator() && getCurrentTimePosition() !== null) {\n <div\n class=\"ax-scheduler-current-time-line\"\n [style.inset-inline-start.%]=\"getCurrentTimePosition()\"\n #currentTimeLine\n ></div>\n }\n\n @for (resourceId of resourceIds(); track resourceId) {\n <div class=\"ax-scheduler-timeline-year-resource-row\">\n <div class=\"ax-scheduler-timeline-year-resource-header ax-scheduler-timeline-year-resource-header-sticky\">\n @if (resourceTemplate() && typeof resourceTemplate() !== 'string') {\n <ng-container\n [ngTemplateOutlet]=\"$any(resourceTemplate())\"\n [ngTemplateOutletContext]=\"{\n $implicit: getResourceContext(resourceId),\n resource: getResourceContext(resourceId),\n resourceId: resourceId,\n }\"\n ></ng-container>\n } @else {\n <div class=\"ax-scheduler-timeline-year-resource-title\">\n {{ getResourceTitle(resourceId) | translate | async }}\n </div>\n }\n </div>\n\n <div class=\"ax-scheduler-timeline-year-resource-content\">\n @for (dayData of processedDayData(); track dayData.date.date.getTime()) {\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleDrop($event, dayData.date, resourceId)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n class=\"ax-scheduler-timeline-year-slot-row\"\n (click)=\"handleSlotEvent($event, dayData.date)\"\n (dblclick)=\"handleSlotEvent($event, dayData.date)\"\n (contextmenu)=\"handleSlotEvent($event, dayData.date)\"\n [attr.data-slot-id]=\"dayData.date.format('YYYYMMDD')\"\n [attr.data-resource-id]=\"resourceId\"\n [style.pointer-events]=\"draggable() ? 'auto' : 'none'\"\n >\n <div class=\"ax-scheduler-timeline-appointment-container\">\n @for (\n segment of getAppointmentsForResourceAndDay(resourceId, dayData).visible;\n track segment.id + segment.originalStartDate.getTime()\n ) {\n <div\n axDrag\n [dragData]=\"segment\"\n [dragCursor]=\"'grab'\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"optimizedDragStartDelay()\"\n [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n (pointerdown)=\"getSlotId($event)\"\n (click)=\"handleAppointmentEvent($event, segment)\"\n (dblclick)=\"handleAppointmentEvent($event, segment)\"\n (contextmenu)=\"handleAppointmentEvent($event, segment)\"\n [title]=\"\n tooltipTemplate()\n ? ''\n : segment.allDay\n ? segment.title +\n ' (' +\n (segment.originalStartDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async) +\n ' - ' +\n (segment.originalEndDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async) +\n ')'\n : segment.title +\n ' (' +\n (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n ' - ' +\n (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n ')'\n \"\n class=\"ax-scheduler-timeline-appointment\"\n [class.all-day-segment]=\"segment.allDay\"\n [ngClass]=\"segment.cssClass ?? `ax-scheduler-${segment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltip]=\"tooltipTemplate()\"\n [axTooltipContext]=\"segment\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, segment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n <span class=\"ax-scheduler-timeline-appointment-time\">\n @if (segment.allDay) {\n {{\n segment.originalStartDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async\n }}\n @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n -\n {{\n segment.originalEndDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async\n }}\n }\n } @else {\n {{ segment.originalStartDate | format: 'time' : { calendar: calendar() } | async }}\n @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n -\n {{ segment.originalEndDate | format: 'time' : { calendar: calendar() } | async }}\n }\n }\n </span>\n </div>\n }\n\n <!-- Overflow Badge and Popover -->\n @if (getAppointmentsForResourceAndDay(resourceId, dayData).moreCount > 0) {\n <div #moreAppointments class=\"ax-scheduler-year-overflow-badge\" (click)=\"$event.stopPropagation()\">\n +{{\n '@acorex:common.general.more-items'\n | translate\n : { params: { number: getAppointmentsForResourceAndDay(resourceId, dayData).moreCount } }\n | async\n }}\n </div>\n <ax-popover [target]=\"moreAppointments\" placement=\"bottom-start\" trigger=\"click\">\n <div\n axDropZone\n [class.ax-state-readonly]=\"readonly()\"\n class=\"ax-overlay-pane ax-scheduler-popover ax-scheduler-timeline-year-popover-appointment\"\n >\n @for (\n segment of getAppointmentsForResourceAndDay(resourceId, dayData).hidden;\n track segment.id + segment.originalStartDate.getTime()\n ) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"segment\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"optimizedDragStartDelay()\"\n [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n (click)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n (dblclick)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n (contextmenu)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n [title]=\"\n tooltipTemplate()\n ? ''\n : segment.allDay\n ? segment.title\n : segment.title +\n ' (' +\n (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n ' - ' +\n (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n ')'\n \"\n class=\"ax-scheduler-popover-appointment\"\n [class.all-day-segment]=\"segment.allDay\"\n [ngClass]=\"segment.cssClass ?? `ax-scheduler-${segment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltip]=\"tooltipTemplate()\"\n [axTooltipContext]=\"segment\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, segment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n @if (!segment.allDay) {\n <span class=\"ax-scheduler-timeline-appointment-time\">\n {{ segment.originalStartDate | format: 'time' : { calendar: calendar() } | async }}\n @if (\n !segment.allDay &&\n segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()\n ) {\n -\n {{ segment.originalEndDate | format: 'time' : { calendar: calendar() } | async }}\n }\n </span>\n }\n </div>\n }\n </div>\n </ax-popover>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n}\n","import { AXComponent, NXComponent } from '@acorex/cdk/common';\nimport { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXCalendarService, AXDateTime, AXHolidayDate } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe, NgClass } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n DOCUMENT,\n ElementRef,\n HostBinding,\n inject,\n input,\n output,\n signal,\n TemplateRef,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { orderBy } from 'lodash-es';\nimport {\n AXSchedulerAllDaySlotData,\n AXSchedulerAppointment,\n AXSchedulerAppointmentLayout,\n AXSchedulerAppointmentSegment,\n AXSchedulerDayAppointmentLayout,\n AXSchedulerOverflowBadge,\n} from '../../scheduler.class';\nimport {\n AXSchedulerAppointmentMouseEvent,\n AXSchedulerComponent,\n AXSchedulerSlotDropEvent,\n AXSchedulerSlotMouseEvent,\n} from '../../scheduler.component';\nimport { AXSchedulerService } from '../../scheduler.service';\n\ntype AXSchedulerGridBadgeInfo = AXSchedulerOverflowBadge & {\n hiddenAppointments: AXSchedulerAppointmentSegment[];\n};\n\n@Component({\n selector: 'ax-scheduler-week-view',\n templateUrl: './scheduler-week-view.component.html',\n styleUrl: './scheduler-week-view.component.compiled.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n NgClass,\n AsyncPipe,\n AXFormatPipe,\n AXDragDirective,\n AXTranslatorPipe,\n AXPopoverComponent,\n AXTooltipDirective,\n AXDropZoneDirective,\n AXDecoratorIconComponent,\n AXDecoratorGenericComponent,\n ],\n providers: [{ provide: AXComponent, useExisting: AXSchedulerWeekViewComponent }],\n})\nexport class AXSchedulerWeekViewComponent extends NXComponent implements AfterViewInit {\n // --- Injected Services & Private State ---\n private readonly document = inject(DOCUMENT);\n private readonly scheduler = inject(AXSchedulerComponent);\n private readonly calendarService = inject(AXCalendarService);\n private readonly schedulerService = inject(AXSchedulerService);\n private readonly dragStartSlotId = signal<string | null>(null);\n\n // --- Constants ---\n private readonly GAP_PX = 1;\n private readonly BADGE_SPACE_REM = 2;\n\n // --- Component Inputs ---\n public readonly = input(false);\n public draggable = input(true);\n public hasActions = input(false);\n public dragStartDelay = input(0);\n public calendar = input<string>();\n public date = input.required<AXDateTime>();\n public endDayHour = input.required<number>();\n public startDayHour = input.required<number>();\n public showCurrentTimeIndicator = input<boolean>(true);\n public appointments = input<AXSchedulerAppointment[]>([]);\n public tooltipTemplate = input<string | TemplateRef<unknown>>();\n\n // ViewChild for current time line element\n currentTimeLineElement = viewChild<ElementRef<HTMLElement>>('currentTimeLine');\n\n // --- Component Outputs (Internal, to be caught by the main scheduler) ---\n protected readonly slotClickedInternal = output<AXSchedulerSlotMouseEvent>();\n protected readonly slotDblClickedInternal = output<AXSchedulerSlotMouseEvent>();\n protected readonly slotRightClickedInternal = output<AXSchedulerSlotMouseEvent>();\n protected readonly appointmentClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n protected readonly appointmentDblClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n protected readonly appointmentRightClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n protected readonly onActionClickInternal = output<AXSchedulerAppointmentMouseEvent>();\n protected readonly onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n // =================================================================================================\n //\n // VIEW MODEL COMPUTATIONS (for rendering the template)\n //\n // =================================================================================================\n\n /**\n * @protected\n * Generates an array of AXDateTime objects for the hours displayed in the view's time ruler.\n * This is used for rendering the `HH:mm` labels on the side.\n */\n protected hoursArray = computed(() => {\n let time = this.date();\n if (!time) return [];\n time = time.set('hour', this.startDayHour()).startOf('hour');\n const hours = [time];\n while (time.hour < this.endDayHour() - 1) {\n time = time.add('hour', 1);\n hours.push(time);\n }\n return hours;\n });\n\n /**\n * @protected\n * Generates an array of day data objects for the 7 days in the view, including holiday info.\n * This is used for rendering the day headers (e.g., \"Monday 10\").\n */\n protected daysArray = computed(\n (): { date: AXDateTime; holiday?: { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate } }[] => {\n const time = this.date();\n if (!time) return [];\n const days = [{ date: time, holiday: this.isHoliday(time) }];\n for (let index = 1; index <= 6; index++) {\n const date = time.add('day', index);\n days.push({ date, holiday: this.isHoliday(date) });\n }\n return days;\n },\n );\n\n /**\n * @protected\n * Calculates the total number of 30-minute blocks within the visible hours of a single day.\n */\n protected totalBlocksPerViewDay = computed(() => {\n const startH = this.startDayHour();\n const endH = this.endDayHour();\n return Math.max(0, (endH - startH) * (60 / 30));\n });\n\n /**\n * @protected\n * Filters processed segments to get only those for the all-day header.\n */\n protected allDayAppointmentsPerDay = computed((): AXSchedulerAllDaySlotData[] => {\n const daysInWeek = this.daysArray().map((e) => e.date);\n const allDaySegments = this.processedAppointmentsForLayout().filter((s) => s.allDay);\n\n return daysInWeek.map((dayDate) => {\n const currentDayStart = dayDate.startOf('day');\n const appointmentsForThisDay = allDaySegments.filter((segment) =>\n this.calendarService.create(segment.startDate, this.calendar()).startOf('day').equal(currentDayStart, 'day'),\n );\n return {\n day: dayDate,\n appointments: orderBy(appointmentsForThisDay, ['originalStartDate', 'title'], ['asc', 'asc']),\n };\n });\n });\n\n // =================================================================================================\n //\n // GRID LAYOUT & BADGE LOGIC (THE CORE FIX)\n // This logic follows a three-step process:\n // 1. `dayViewLayoutsByDay`: Calculate a full multi-column layout for each day. This is our \"source of truth\".\n // 2. `visibleAppointmentsLayout`: Render ONLY the first column (`columnIndex: 0`) from the source of truth.\n // 3. `overflowBadgesWithData`: Render badges for all other columns (`columnIndex > 0`).\n //\n // =================================================================================================\n\n /**\n * [STEP 1 - Private] Calculate a full multi-column layout for each day, as if it were a Day View.\n * This becomes the single source of truth for what overlaps with what.\n */\n private dayViewLayoutsByDay = computed(() => {\n const layoutsByDay = new Map<number, Map<any, AXSchedulerDayAppointmentLayout>>();\n const allSegments = this.timedGridSegments();\n const viewStartDate = this.date();\n const startH = this.startDayHour();\n const endH = this.endDayHour();\n\n for (let dayIndex = 0; dayIndex < 7; dayIndex++) {\n const dayDate = viewStartDate.add('day', dayIndex);\n const segmentsForThisDay = allSegments.filter((seg) =>\n this.calendarService.create(seg.startDate, this.calendar()).startOf('day').equal(dayDate.startOf('day'), 'day'),\n );\n if (segmentsForThisDay.length === 0) continue;\n\n const concurrencyInfoMap = this.schedulerService.calculateDayViewConcurrencyInfo(\n segmentsForThisDay,\n dayDate,\n startH,\n endH,\n );\n const sortedAppointments = orderBy(\n segmentsForThisDay,\n [(e) => e.startDate.getTime(), (e) => e.originalEndDate.getTime() - e.originalStartDate.getTime()],\n ['asc', 'desc'],\n );\n\n const dayLayouts = new Map<any, AXSchedulerDayAppointmentLayout>();\n const columnsData: { appointments: AXSchedulerAppointmentSegment[] }[] = [];\n\n for (const appointmentSegment of sortedAppointments) {\n let assignedCol = -1;\n for (let c = 0; ; c++) {\n if (!columnsData[c]) columnsData[c] = { appointments: [] };\n let conflict = false;\n for (const placedSegment of columnsData[c].appointments) {\n if (this.schedulerService.doAppointmentsOverlap(appointmentSegment, placedSegment)) {\n conflict = true;\n break;\n }\n }\n if (!conflict) {\n assignedCol = c;\n columnsData[c].appointments.push(appointmentSegment);\n break;\n }\n }\n const concurrencyInfo = concurrencyInfoMap.get(appointmentSegment.id);\n const effectiveCols = concurrencyInfo ? concurrencyInfo.effectiveTotalColumns : 1;\n dayLayouts.set(appointmentSegment.id, { columnIndex: assignedCol, effectiveTotalColumns: effectiveCols });\n }\n layoutsByDay.set(dayIndex, dayLayouts);\n }\n return layoutsByDay;\n });\n\n /**\n * @protected\n * [STEP 2] From the full layout, select ONLY appointments in the first column (`columnIndex: 0`)\n * to be visible. Calculate their width based on whether they have siblings in other columns.\n */\n protected visibleAppointmentsLayout = computed((): AXSchedulerAppointmentLayout[] => {\n const finalLayouts: AXSchedulerAppointmentLayout[] = [];\n const layoutsByDay = this.dayViewLayoutsByDay();\n const allSegments = this.timedGridSegments();\n const blockHeightExpr = `var(--ax-comp-scheduler-basic-view-blocks-height, 30px)`;\n const N = 7;\n\n for (const appt of allSegments) {\n const apptStartDate = this.calendarService.create(appt.startDate, this.calendar());\n const dayIndex = Math.floor(\n (apptStartDate.startOf('day').date.getTime() - this.date().startOf('day').date.getTime()) /\n this.schedulerService.MILLISECONDS_PER_DAY,\n );\n if (dayIndex < 0 || dayIndex >= N) continue;\n\n const layoutInfo = layoutsByDay.get(dayIndex)?.get(appt.id);\n if (!layoutInfo || layoutInfo.columnIndex !== 0) continue;\n\n const startMinutes = apptStartDate.hour * 60 + apptStartDate.minute;\n const startBlockOffset = startMinutes - this.startDayHour() * 60;\n const layoutTop = `calc(${blockHeightExpr} * ${startBlockOffset / 30} + 1px)`;\n\n const durationMinutes = this.schedulerService.calculateDurationInMinutes(appt);\n const layoutHeight = `calc(${blockHeightExpr} * ${durationMinutes / 30} - ${this.GAP_PX}px)`;\n\n const hasHiddenSiblings = layoutInfo.effectiveTotalColumns > 1;\n const layoutWidth = hasHiddenSiblings\n ? `calc(100% / ${N} - ${this.BADGE_SPACE_REM + 0.5}rem)`\n : `calc(100% / ${N})`;\n\n finalLayouts.push({\n appointment: appt,\n layoutTop,\n layoutHeight,\n layoutLeft: `calc(${dayIndex * (100 / N)}%)`,\n layoutWidth,\n });\n }\n return finalLayouts;\n });\n\n /**\n * @protected\n * [STEP 3] Create badges for all appointments NOT in the first column (`columnIndex > 0`).\n */\n protected overflowBadgesWithData = computed((): AXSchedulerGridBadgeInfo[] => {\n const badgesInfo: AXSchedulerGridBadgeInfo[] = [];\n const layoutsByDay = this.dayViewLayoutsByDay();\n const allTimedSegments = this.timedGridSegments();\n const blockHeightExpr = `var(--ax-comp-scheduler-basic-view-blocks-height, 30px)`;\n const N = 7;\n\n const hiddenAppointments = allTimedSegments.filter((appt) => {\n const apptStartDate = this.calendarService.create(appt.startDate, this.calendar());\n const dayIndex = Math.floor(\n (apptStartDate.startOf('day').date.getTime() - this.date().startOf('day').date.getTime()) /\n this.schedulerService.MILLISECONDS_PER_DAY,\n );\n const layoutInfo = layoutsByDay.get(dayIndex)?.get(appt.id);\n return layoutInfo && layoutInfo.columnIndex > 0;\n });\n\n const groupedHidden = new Map<string, AXSchedulerAppointmentSegment[]>();\n for (const appt of hiddenAppointments) {\n const apptStartDate = this.calendarService.create(appt.startDate, this.calendar());\n const startInfo = this.schedulerService.getBlockIdentifier(\n apptStartDate,\n this.date(),\n this.startDayHour(),\n this.endDayHour(),\n 7,\n );\n if (!startInfo) continue;\n\n const key = `${startInfo.dayIndex}-${startInfo.blockIndex}`;\n if (!groupedHidden.has(key)) groupedHidden.set(key, []);\n groupedHidden.get(key).push(appt);\n }\n\n groupedHidden.forEach((group, key) => {\n const [dayIndexStr, blockIndexStr] = key.split('-');\n const dayIndex = parseInt(dayIndexStr);\n const blockIndex = parseInt(blockIndexStr);\n\n const badgeTop = `calc(${blockHeightExpr} * ${blockIndex} + 0.75rem)`;\n const badgeLeft = `calc(${dayIndex * (100 / N)}% + (100% / ${N}) - ${this.BADGE_SPACE_REM}rem)`;\n\n badgesInfo.push({\n key: `badge-${key}`,\n count: group.length,\n badgeTop,\n badgeLeft,\n hiddenAppointments: group,\n });\n });\n\n return badgesInfo;\n });\n\n // =================================================================================================\n //\n // EVENT HANDLERS & UTILITY METHODS\n //\n // =================================================================================================\n\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n\n /**\n * Handles click, dblclick, and contextmenu events on an appointment and emits them to the parent.\n * @param mouseEvent The native DOM event.\n * @param appointmentSegment The appointment data segment that was interacted with.\n * @protected\n */\n protected handleAppointmentEvent(mouseEvent: MouseEvent, appointmentSegment: AXSchedulerAppointment): void {\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentSegment);\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, appointment: originalAppointment, sender: this.scheduler },\n this.eventOutputMap,\n 'appointment',\n );\n }\n\n /**\n * Handles click, dblclick, and contextmenu events on an empty time slot and emits them to the parent.\n * @param mouseEvent The native DOM event.\n * @param hour The starting hour of the slot.\n * @param day The day of the slot.\n * @param minuteIndex The half-hour index (0 or 1).\n * @protected\n */\n protected handleSingleSlotEvent(\n mouseEvent: MouseEvent,\n hour: AXDateTime,\n day: AXDateTime,\n minuteIndex: number,\n ): void {\n const startDate = day.set('hour', hour.hour).set('minute', minuteIndex * 30);\n const slotData = this.schedulerService.getSlotData(startDate, 'week');\n if (slotData)\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n this.eventOutputMap,\n 'slot',\n );\n }\n\n /**\n * Handles interaction events on the all-day slot.\n * @param mouseEvent The native DOM event.\n * @param day The corresponding day for the all-day slot.\n * @protected\n */\n protected handleAllDaySlotEvent(mouseEvent: MouseEvent, day: AXDateTime): void {\n const slotData = { startDate: day.startOf('day'), endDate: day.endOf('day'), view: 'week' as const };\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n this.eventOutputMap,\n 'slot',\n );\n }\n\n /**\n * Handles dropping an appointment onto the all-day slot.\n * @param e The drop event from the CDK.\n * @param day The corresponding day for the all-day slot.\n * @protected\n */\n protected handleAllDayDrop(e: AXDropZoneDropEvent, day: AXDateTime): void {\n const slotData = { startDate: day.startOf('day'), endDate: day.endOf('day'), view: 'week' as const };\n const originalAppointment = this.schedulerService.getOriginalAppointment(\n e.dropped.dragData() as AXSchedulerAppointment,\n );\n this.onAppointmentDropInternal.emit({\n dropEvent: e,\n slot: slotData,\n sender: this.scheduler,\n appointment: originalAppointment,\n isSameSlotDrop: this.dragStartSlotId() === e.sender.element().dataset['slotId'],\n });\n }\n\n /**\n * Handles dropping an appointment onto a timed grid slot.\n * @param e The drop event from the CDK.\n * @param hour The starting hour of the drop target.\n * @param day The day of the drop target.\n * @param minuteIndex The half-hour index (0 or 1) of the drop target.\n * @protected\n */\n protected handleSingleDayDrop(e: AXDropZoneDropEvent, hour: AXDateTime, day: AXDateTime, minuteIndex: number): void {\n const startDate = day.set('hour', hour.hour).set('minute', minuteIndex * 30);\n const slotData = this.schedulerService.getSlotData(startDate, 'week');\n const originalAppointment = this.schedulerService.getOriginalAppointment(\n e.dropped.dragData() as AXSchedulerAppointment,\n );\n this.onAppointmentDropInternal.emit({\n dropEvent: e,\n slot: slotData,\n sender: this.scheduler,\n appointment: originalAppointment,\n isSameSlotDrop: this.dragStartSlotId() === e.sender.element().dataset['slotId'],\n });\n }\n\n /**\n * Handles clicks on the \"more\" action icon on an appointment.\n * @param event The native mouse event.\n * @param appointmentItem The appointment associated with the action.\n * @protected\n */\n protected handleActionClick(event: MouseEvent, appointmentItem: AXSchedulerAppointment): void {\n event.stopPropagation();\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n this.onActionClickInternal.emit({\n appointment: originalAppointment,\n nativeEvent: event,\n sender: this.scheduler,\n });\n }\n\n /**\n * @protected\n * Checks if a given date is the current day.\n * @param date The date to check.\n * @returns `true` if the date is today.\n */\n protected isToday(date: AXDateTime): boolean {\n return date.equal(this.calendarService.create(new Date()), 'day');\n }\n\n /**\n * @protected\n * Checks if a given date is a holiday or weekend.\n * @param date The date to check.\n * @returns An object describing the day's status (holiday, weekend, or none).\n */\n protected isHoliday(date: AXDateTime): { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate } {\n const globalHoliday = this.calendarService.holidays.find((d) => date.equal(d.date, 'day'));\n const internalHoliday = this.schedulerService.internalHoliday().find((d) => date.equal(d.date, 'day'));\n const holiday = globalHoliday || internalHoliday;\n if (holiday) return { state: 'holiday', holiday };\n if (this.schedulerService.isWeekend(date, this.calendar())) return { state: 'weekend' };\n return { state: 'none' };\n }\n\n /**\n * @protected\n * Captures the data-slot-id attribute when a drag operation starts on an appointment.\n * @param e The pointer event that initiates the drag.\n */\n protected getSlotId(e: PointerEvent): void {\n const dropListElement = this.document\n .elementsFromPoint(e.clientX, e.clientY)\n .find((el): el is HTMLElement => (el as HTMLElement).dataset['slotId'] !== undefined);\n this.dragStartSlotId.set(dropListElement ? dropListElement.dataset['slotId'] : null);\n }\n\n protected getCurrentTimePosition(): number | null {\n const now = this.calendarService.create(new Date(), this.calendar());\n const weekStart = this.date().startOf('day');\n const weekEnd = this.date().add('day', 7).startOf('day');\n const startHour = this.startDayHour();\n const endHour = this.endDayHour();\n\n // Check if current time is within the displayed week\n if (now.isBefore(weekStart) || now.isAfter(weekEnd)) {\n return null;\n }\n\n // Check if current time is within the visible hours\n if (now.hour < startHour || now.hour >= endHour) {\n return null;\n }\n\n // Calculate position as percentage within the visible time range\n const currentMinutes = now.hour * 60 + now.minute;\n const startMinutes = startHour * 60;\n const endMinutes = endHour * 60;\n const totalMinutes = endMinutes - startMinutes;\n\n const positionInMinutes = currentMinutes - startMinutes;\n return (positionInMinutes / totalMinutes) * 100;\n }\n\n protected getCurrentTimePositionWithOffset(): string | null {\n const position = this.getCurrentTimePosition();\n if (position === null) {\n return null;\n }\n\n // For week view, calculate the vertical position (top) for the horizontal line\n // based on the current time within the visible hours\n const currentMinutes =\n this.calendarService.create(new Date(), this.calendar()).hour * 60 +\n this.calendarService.create(new Date(), this.calendar()).minute;\n const startMinutes = this.startDayHour() * 60;\n const positionInMinutes = currentMinutes - startMinutes;\n const blockHeight = 30; // 30 minutes per block\n const blocksFromStart = positionInMinutes / blockHeight;\n\n return `calc(var(--ax-comp-scheduler-basic-view-blocks-height) * ${blocksFromStart} + 1px)`;\n }\n\n protected getCurrentDayColumnPosition(): string | null {\n const now = this.calendarService.create(new Date(), this.calendar());\n const weekStart = this.date().startOf('day');\n const weekEnd = this.date().add('day', 7).startOf('day');\n\n // Check if current time is within the displayed week\n if (now.isBefore(weekStart) || now.isAfter(weekEnd)) {\n return null;\n }\n\n // Calculate which day of the week the current day falls into\n const daysDiff = Math.floor((now.date.getTime() - weekStart.date.getTime()) / (24 * 60 * 60 * 1000));\n if (daysDiff < 0 || daysDiff >= 7) {\n return null;\n }\n\n // Calculate the left position for the current day column\n // The time column width is already accounted for in the container positioning\n const dayWidth = 100 / 7; // 7 days in a week\n const leftPosition = daysDiff * dayWidth;\n\n return `${leftPosition}%`;\n }\n\n protected getCurrentDayColumnWidth(): string {\n const dayWidth = 100 / 7; // 7 days in a week\n return `${dayWidth}%`;\n }\n\n ngAfterViewInit() {\n // Auto-scroll to current time when available using ResizeObserver\n this.setupCurrentTimeScroll();\n }\n\n private setupCurrentTimeScroll(): (() => void) | undefined {\n if (!this.showCurrentTimeIndicator()) {\n return undefined;\n }\n\n const currentPosition = this.getCurrentTimePosition();\n if (currentPosition === null) {\n return undefined;\n }\n\n const timeLineElement = this.currentTimeLineElement()?.nativeElement;\n if (!timeLineElement) {\n return undefined;\n }\n\n // Use ResizeObserver to detect when the element is properly rendered\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.contentRect.width > 0 && entry.contentRect.height > 0) {\n // Element has proper dimensions, scroll to it\n timeLineElement.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n inline: 'nearest',\n });\n // Disconnect observer after successful scroll\n resizeObserver.disconnect();\n break;\n }\n }\n });\n\n resizeObserver.observe(timeLineElement);\n\n // Cleanup on component destroy\n return () => resizeObserver.disconnect();\n }\n\n protected shouldShowCurrentTimeForToday(): boolean {\n if (!this.showCurrentTimeIndicator()) {\n return false;\n }\n\n const now = this.calendarService.create(new Date(), this.calendar());\n const weekStart = this.date().startOf('day');\n const weekEnd = this.date().add('day', 7).startOf('day');\n\n // Check if current time is within the displayed week\n if (now.isBefore(weekStart) || now.isAfter(weekEnd)) {\n return false;\n }\n\n // Check if current time is within the visible hours\n if (now.hour < this.startDayHour() || now.hour >= this.endDayHour()) {\n return false;\n }\n\n return true;\n }\n\n @HostBinding('class.ax-state-readonly')\n protected get isReadonly(): boolean {\n return this.readonly();\n }\n\n // --- Private Data Processing ---\n private processedAppointmentsForLayout = computed<AXSchedulerAppointmentSegment[]>(() => {\n const viewDays = this.daysArray().map((e) => e.date);\n const allOriginalAppointments = this.appointments();\n if (viewDays.length === 0 || allOriginalAppointments.length === 0) return [];\n\n const startH = this.startDayHour();\n const endH = this.endDayHour();\n const allSegmentsInView: AXSchedulerAppointmentSegment[] = [];\n\n for (const day of viewDays) {\n for (const appt of allOriginalAppointments) {\n const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(appt, day.startOf('day'), startH, endH);\n if (segment) allSegmentsInView.push(segment);\n }\n }\n const uniqueSegmentsMap = new Map<string, AXSchedulerAppointmentSegment>();\n allSegmentsInView.forEach((seg) => {\n const mapKey = `${seg.id}-${seg.startDate.getTime()}-${seg.endDate.getTime()}`;\n if (!uniqueSegmentsMap.has(mapKey)) uniqueSegmentsMap.set(mapKey, seg);\n });\n return Array.from(uniqueSegmentsMap.values());\n });\n\n private timedGridSegments = computed<AXSchedulerAppointmentSegment[]>(() => {\n return this.processedAppointmentsForLayout()?.filter((segment) => !segment.allDay) ?? [];\n });\n}\n","<div class=\"ax-scheduler-week-header\">\n <div class=\"ax-scheduler-week-header-days\">\n <div class=\"ax-scheduler-week-header-table\"></div>\n <div class=\"ax-scheduler-week-header-date\" aria-hidden=\"true\">\n @for (day of daysArray(); track day.date.date.getTime()) {\n <div\n [class.ax-state-today]=\"isToday(day.date)\"\n class=\"ax-scheduler-week-header-date-day {{\n day.holiday.state !== 'none' ? (day.holiday.holiday?.cssClass ?? 'ax-state-holiday') : ''\n }}\"\n >\n <span\n class=\"ax-scheduler-week-header-date-day-char ax-scheduler-truncate\"\n [axTooltip]=\"day.holiday?.holiday?.title ?? ''\"\n >\n {{ day.date | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n @if (day.holiday.state === 'holiday' && day.holiday.holiday.title) {\n ( {{ day.holiday.holiday.title }} )\n }\n </span>\n <span class=\"ax-scheduler-week-header-date-day-num\">\n {{ day.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n </span>\n </div>\n }\n </div>\n </div>\n <div class=\"ax-scheduler-week-header-days\">\n <div class=\"ax-scheduler-week-header-table\">{{ '@acorex:dateTime.duration.all-day' | translate | async }}</div>\n <div aria-hidden=\"true\" class=\"ax-scheduler-week-header-date\">\n @for (slotData of allDayAppointmentsPerDay(); track slotData.day.date.getTime()) {\n <div\n axDropZone\n #zone2=\"axDropZone\"\n [class.ax-scheduler-slot-hovered]=\"zone2.isHovered()\"\n (onElementDrop)=\"handleAllDayDrop($event, slotData.day)\"\n class=\"ax-scheduler-all-day-slot\"\n (click)=\"handleAllDaySlotEvent($event, slotData.day)\"\n (dblclick)=\"handleAllDaySlotEvent($event, slotData.day)\"\n (contextmenu)=\"handleAllDaySlotEvent($event, slotData.day)\"\n >\n @if (slotData.appointments.length > 0) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragData]=\"slotData.appointments[0]\"\n [dragDisabled]=\"!draggable() || slotData.appointments[0].readonly || readonly()\"\n (pointerdown)=\"getSlotId($event)\"\n (click)=\"handleAppointmentEvent($event, slotData.appointments[0])\"\n (dblclick)=\"handleAppointmentEvent($event, slotData.appointments[0])\"\n (contextmenu)=\"handleAppointmentEvent($event, slotData.appointments[0])\"\n [title]=\"tooltipTemplate() ? '' : slotData.appointments[0].title\"\n class=\"ax-scheduler-header-week-appointment\"\n [style.width]=\"slotData.appointments.length > 1 ? 'calc(100% - 2rem)' : '100%'\"\n [ngClass]=\"\n slotData.appointments[0].cssClass ??\n `ax-scheduler-${slotData.appointments[0].priority ?? 'primary'}-periority`\n \"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltipContext]=\"slotData.appointments[0]\"\n [axTooltip]=\"tooltipTemplate()\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ slotData.appointments[0].title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, slotData.appointments[0])\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n ></ax-icon>\n }\n </ax-title>\n </div>\n }\n @if (slotData.appointments.length > 1) {\n <div\n #moreAppointments\n class=\"ax-scheduler-appointment-badge\"\n [style.width]=\"'1.5rem'\"\n [style.border]=\"'none'\"\n [ngClass]=\"\n slotData.appointments[1].cssClass ??\n `ax-scheduler-${slotData.appointments[1].priority ?? 'primary'}-periority`\n \"\n >\n +{{ slotData.appointments.length - 1 }}\n </div>\n <ax-popover [target]=\"moreAppointments\">\n <div class=\"ax-overlay-pane ax-scheduler-popover\" [class.ax-state-readonly]=\"readonly()\" axDropZone>\n @for (appointment of slotData.appointments; track appointment.id; let first = $first) {\n @if (!first) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"appointment\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || appointment.readonly || readonly()\"\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"tooltipTemplate() ? '' : appointment.title\"\n class=\"ax-scheduler-popover-appointment\"\n [ngClass]=\"appointment.cssClass ?? `ax-scheduler-${appointment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltipContext]=\"appointment\"\n [axTooltip]=\"tooltipTemplate()\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ appointment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, appointment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n ></ax-icon>\n }\n </ax-title>\n </div>\n }\n }\n </div>\n </ax-popover>\n }\n </div>\n }\n </div>\n </div>\n</div>\n\n<div class=\"ax-scheduler-week-time-container\">\n <div class=\"ax-scheduler-week-time\" aria-hidden=\"true\">\n @for (time of hoursArray(); track time.date.getTime()) {\n <div>\n {{ time | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </div>\n }\n </div>\n\n <div class=\"ax-scheduler-week-table-container\">\n <!-- Current Time Line Indicator -->\n @if (\n shouldShowCurrentTimeForToday() &&\n getCurrentTimePositionWithOffset() !== null &&\n getCurrentDayColumnPosition() !== null\n ) {\n <div\n #currentTimeLine\n class=\"ax-scheduler-current-time-line\"\n [style.inset-block-start]=\"getCurrentTimePositionWithOffset()\"\n [style.inset-inline-start]=\"getCurrentDayColumnPosition()\"\n [style.width]=\"getCurrentDayColumnWidth()\"\n ></div>\n }\n <div class=\"ax-scheduler-week-appointment-container\">\n @for (appt of visibleAppointmentsLayout(); track appt.appointment.id) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragData]=\"appt.appointment\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || appt.appointment.readonly || readonly()\"\n (pointerdown)=\"getSlotId($event)\"\n (click)=\"handleAppointmentEvent($event, appt.appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appt.appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appt.appointment)\"\n [title]=\"tooltipTemplate() ? '' : appt.appointment.title\"\n [style.width]=\"appt.layoutWidth\"\n [style.height]=\"appt.layoutHeight\"\n class=\"ax-scheduler-week-appointment\"\n [style.inset-block-start]=\"appt.layoutTop\"\n [style.inset-inline-start]=\"appt.layoutLeft\"\n [ngClass]=\"appt.appointment.cssClass ?? `ax-scheduler-${appt.appointment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltipContext]=\"appt.appointment\"\n [axTooltip]=\"tooltipTemplate()\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ appt.appointment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, appt.appointment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n ></ax-icon>\n }\n </ax-title>\n <ax-subtitle>\n {{\n appt.appointment.originalStartDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n }}\n -\n {{ appt.appointment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </ax-subtitle>\n </div>\n }\n\n <!-- Overflow Badges with Popovers -->\n @for (badge of overflowBadgesWithData(); track badge.key) {\n <!-- Wrap badge and popover for targeting -->\n <div\n style=\"position: absolute\"\n class=\"ax-scheduler-badge-wrapper\"\n [style.inset-block-start]=\"badge.badgeTop\"\n [style.inset-inline-start]=\"badge.badgeLeft\"\n >\n <!-- The Badge itself -->\n <div\n #actionButton\n class=\"ax-scheduler-appointment-badge\"\n [ngClass]=\"\n badge.hiddenAppointments[0].cssClass ??\n `ax-scheduler-${badge.hiddenAppointments[0].priority ?? 'primary'}-periority`\n \"\n >\n +{{ badge.count }}\n </div>\n <!-- The Popover -->\n <ax-popover [target]=\"actionButton\">\n <div class=\"ax-overlay-pane ax-scheduler-popover\" axDropZone>\n @for (appointment of badge.hiddenAppointments; track appointment.id) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"appointment\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || appointment.readonly || readonly()\"\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"tooltipTemplate() ? '' : appointment.title\"\n class=\"ax-scheduler-popover-appointment\"\n [ngClass]=\"appointment.cssClass ?? `ax-scheduler-${appointment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltipContext]=\"appointment\"\n [axTooltip]=\"tooltipTemplate()\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ appointment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, appointment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n ></ax-icon>\n }\n </ax-title>\n <ax-subtitle>\n {{\n appointment.originalStartDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n }}\n -\n {{\n appointment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n }}\n </ax-subtitle>\n </div>\n }\n </div>\n </ax-popover>\n </div>\n }\n </div>\n\n <table aria-hidden=\"true\" [border]=\"1\">\n <tbody>\n @for (time of hoursArray(); track time.date.getTime()) {\n <tr>\n @for (day of daysArray(); track day.date.date.getTime()) {\n <td\n axDropZone\n #zone=\"axDropZone\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n (onElementDrop)=\"handleSingleDayDrop($event, time, day.date, 0)\"\n (click)=\"handleSingleSlotEvent($event, time, day.date, 0)\"\n (dblclick)=\"handleSingleSlotEvent($event, time, day.date, 0)\"\n (contextmenu)=\"handleSingleSlotEvent($event, time, day.date, 0)\"\n [attr.data-slot-id]=\"day.date.format('YYYYMMDD') + '-' + time.format('HHmm')\"\n ></td>\n }\n </tr>\n <tr>\n @for (day of daysArray(); track day.date.date.getTime()) {\n <td\n axDropZone\n #zone2=\"axDropZone\"\n [class.ax-scheduler-slot-hovered]=\"zone2.isHovered()\"\n (onElementDrop)=\"handleSingleDayDrop($event, time, day.date, 1)\"\n (click)=\"handleSingleSlotEvent($event, time, day.date, 1)\"\n (dblclick)=\"handleSingleSlotEvent($event, time, day.date, 1)\"\n (contextmenu)=\"handleSingleSlotEvent($event, time, day.date, 1)\"\n [attr.data-slot-id]=\"day.date.format('YYYYMMDD') + '-' + time.add('minute', 30).format('HHmm')\"\n ></td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n</div>\n","import { AXComponent, AXValueChangedEvent, NXComponent, NXEvent, NXNativeEvent } from '@acorex/cdk/common';\nimport { AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXCalendarComponent } from '@acorex/components/calendar';\nimport { AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXSelectBoxComponent } from '@acorex/components/select-box';\nimport { AXCalendarService, AXDateTime, AXHolidayDate } from '@acorex/core/date-time';\nimport { AXFormatService } from '@acorex/core/format';\nimport { AXLocaleService } from '@acorex/core/locale';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXHtmlUtil, AXUnsubscriber } from '@acorex/core/utils';\nimport { isPlatformBrowser, NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n linkedSignal,\n model,\n OnInit,\n output,\n PLATFORM_ID,\n signal,\n TemplateRef,\n untracked,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n AXDayOfWeekName,\n AXSchedulerAppointment,\n AXSchedulerAppointmentDataSource,\n AXSchedulerAppointmentLoader,\n AXSchedulerDateRange,\n AXSchedulerResource,\n AXSchedulerView,\n} from './scheduler.class';\nimport { AXSchedulerService } from './scheduler.service';\nimport { AXSchedulerAgendaViewComponent } from './views/agenda/scheduler-agenda-view.component';\nimport { AXSchedulerDayViewComponent } from './views/day/scheduler-day-view.component';\nimport { AXSchedulerMonthViewComponent } from './views/month/scheduler-month-view.component';\nimport { AXSchedulerTimelineDayViewComponent } from './views/timeline-day/scheduler-timeline-day-view.component';\nimport { AXSchedulerTimelineMonthViewComponent } from './views/timeline-month/scheduler-timeline-month-view.component';\nimport { AXSchedulerTimelineMultiDayViewComponent } from './views/timeline-multi-day/scheduler-timeline-multi-day-view.component';\nimport { AXSchedulerTimelineYearViewComponent } from './views/timeline-year/scheduler-timeline-year-view.component';\nimport { AXSchedulerWeekViewComponent } from './views/week/scheduler-week-view.component';\n\nexport interface AXSchedulerAppointmentMouseEvent extends NXNativeEvent<AXSchedulerComponent, MouseEvent> {\n appointment: AXSchedulerAppointment;\n}\nexport interface AXSchedulerSlotMouseEvent extends NXNativeEvent<AXSchedulerComponent, MouseEvent> {\n slot: {\n endDate: AXDateTime;\n startDate: AXDateTime;\n view: AXSchedulerView;\n };\n}\nexport interface AXSchedulerSlotDropEvent extends NXEvent<AXSchedulerComponent> {\n dropEvent: AXDropZoneDropEvent;\n appointment: AXSchedulerAppointment;\n slot: {\n endDate: AXDateTime;\n startDate: AXDateTime;\n view: AXSchedulerView;\n resourceId?: any; // Resource ID for timeline views\n };\n isSameSlotDrop: boolean; // True if dropped on the same time AND same resource\n}\n\n@Component({\n selector: 'ax-scheduler',\n templateUrl: './scheduler.component.html',\n styleUrls: ['./scheduler.component.compiled.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n NgClass,\n FormsModule,\n AXButtonComponent,\n AXPopoverComponent,\n AXCalendarComponent,\n AXSelectBoxComponent,\n AXDecoratorIconComponent,\n AXSchedulerDayViewComponent,\n AXSchedulerWeekViewComponent,\n AXSchedulerMonthViewComponent,\n AXSchedulerAgendaViewComponent,\n AXSchedulerTimelineDayViewComponent,\n AXSchedulerTimelineMonthViewComponent,\n AXSchedulerTimelineMultiDayViewComponent,\n AXSchedulerTimelineYearViewComponent,\n ],\n providers: [AXUnsubscriber, { provide: AXComponent, useExisting: AXSchedulerComponent }],\n})\nexport class AXSchedulerComponent extends NXComponent implements OnInit {\n private platformId = inject(PLATFORM_ID);\n private unsubscriber = inject(AXUnsubscriber);\n private formatService = inject(AXFormatService);\n private localeService = inject(AXLocaleService);\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n private translationService = inject(AXTranslationService);\n\n private viewModeSelectbox = viewChild(AXSelectBoxComponent);\n private calendarPopover = viewChild<AXPopoverComponent>('calendarPopover');\n\n private displayViews: Record<AXSchedulerView, string> = {\n day: 'daily',\n week: 'weekly',\n month: 'monthly',\n 'timeline-day': 'daily-timeline',\n 'timeline-multi-day': 'multi-day-timeline',\n 'timeline-month': 'monthly-timeline',\n 'timeline-year': 'yearly-timeline',\n agenda: 'agenda',\n };\n\n public calendar = input<'gregorian' | 'solar-hijri' | string>();\n protected calendarType = linkedSignal<'gregorian' | 'solar-hijri' | string>(\n () => this.calendar() ?? this.localeService.activeProfile().calendar.system,\n );\n\n public startingDate = input<Date>(new Date());\n public currentDate = linkedSignal<AXDateTime>(() =>\n this.calendarService.create(this.startingDate(), this.calendarType()).startOf('day'),\n );\n\n private _appointments = signal<AXSchedulerAppointment[]>([]);\n public appointments = this._appointments.asReadonly();\n protected rtl = signal(false);\n protected isFullScreen = signal(false);\n protected viewsDataSource = signal<{ id: string; text: string }[]>([]);\n private prevDate = signal<AXDateTime>(this.calendarService.create(new Date(), this.calendarType()));\n\n public endDayHour = input(24);\n public startDayHour = input(8);\n public hasHeader = input(true);\n public readonly = input(false);\n public draggable = input(true);\n public hasActions = input(false);\n public dragStartDelay = input(0);\n public weekend = input<number[]>([]);\n public allowFullScreen = input(true);\n public multiDayViewDaysCount = input(7);\n public showResourceHeaders = input(true);\n public showCurrentTimeIndicator = input(true);\n public showUnassignedAppointments = input(true);\n public resources = input<AXSchedulerResource[]>([]);\n public resourceTemplate = input<TemplateRef<unknown>>();\n public firstDayOfWeek = input<AXDayOfWeekName>('sunday');\n public tooltipTemplate = input<string | TemplateRef<unknown>>();\n public dataSource = input<AXSchedulerAppointmentDataSource>([]);\n public holidays = input<(range: AXSchedulerDateRange) => Promise<AXHolidayDate[]>>();\n public views = input<AXSchedulerView[]>([\n 'day',\n 'week',\n 'month',\n 'timeline-day',\n 'timeline-multi-day',\n 'timeline-month',\n 'timeline-year',\n 'agenda',\n ]);\n\n public selectedView = model<AXSchedulerView>(this.views()[0]);\n private prevView = signal<AXSchedulerView>(this.selectedView());\n\n // --- Public Outputs ---\n public onDataLoaded = output<void>();\n public onRangeChanged = output<AXSchedulerDateRange>();\n public onSlotClicked = output<AXSchedulerSlotMouseEvent>();\n public onSlotDblClicked = output<AXSchedulerSlotMouseEvent>();\n public onSlotRightClick = output<AXSchedulerSlotMouseEvent>();\n public onAppointmentDrop = output<AXSchedulerSlotDropEvent>();\n public onActionClick = output<AXSchedulerAppointmentMouseEvent>();\n public onAppointmentClicked = output<AXSchedulerAppointmentMouseEvent>();\n public onAppointmentDblClicked = output<AXSchedulerAppointmentMouseEvent>();\n public onAppointmentRightClick = output<AXSchedulerAppointmentMouseEvent>();\n\n // --- Internal Handlers for View Outputs ---\n protected handleSlotClickInternal(eventData: AXSchedulerSlotMouseEvent) {\n this.onSlotClicked.emit(eventData);\n }\n protected handleSlotDblClickInternal(eventData: AXSchedulerSlotMouseEvent) {\n this.onSlotDblClicked.emit(eventData);\n }\n protected handleSlotRightClickInternal(eventData: AXSchedulerSlotMouseEvent) {\n this.onSlotRightClick.emit(eventData);\n }\n protected handleAppointmentClickInternal(eventData: AXSchedulerAppointmentMouseEvent) {\n this.onAppointmentClicked.emit(eventData);\n }\n protected handleAppointmentDblClickInternal(eventData: AXSchedulerAppointmentMouseEvent) {\n this.onAppointmentDblClicked.emit(eventData);\n }\n protected handleAppointmentRightClickInternal(eventData: AXSchedulerAppointmentMouseEvent) {\n this.onAppointmentRightClick.emit(eventData);\n }\n protected handleAppointmentDropInternal(eventData: AXSchedulerSlotDropEvent) {\n this.onAppointmentDrop.emit(eventData);\n }\n\n ngOnInit() {\n this.calendarService.calendarChanges$.pipe(this.unsubscriber.takeUntilDestroy).subscribe(() => {\n const currentDate = this.calendarService.create(this.currentDate().date, this.calendarType());\n if (!currentDate.equal(this.currentDate())) {\n this.currentDate.set(currentDate);\n }\n });\n\n this.translationService.langChanges$.pipe(this.unsubscriber.takeUntilDestroy).subscribe(async () => {\n await this.fillDataSource();\n this.viewModeSelectbox()?.selectItems(this.viewsDataSource().find((c) => c.id == this.selectedView()));\n const currentDate = this.calendarService.create(this.currentDate().date, this.calendarType());\n if (!currentDate.equal(this.currentDate())) {\n this.currentDate.set(currentDate);\n }\n });\n\n if (isPlatformBrowser(this.platformId)) this.rtl.set(AXHtmlUtil.isRtl(this.nativeElement));\n this.fillDataSource();\n }\n\n #appointmentEffect = effect(async () => {\n if (typeof this.dataSource() === 'function') {\n const func = this.dataSource() as AXSchedulerAppointmentLoader;\n const range = {\n end: this.range().end,\n from: this.range().from,\n };\n const list = await func({ range });\n this._appointments.set(list);\n } else {\n const list = this.dataSource() as AXSchedulerAppointment[];\n this._appointments.set(list);\n }\n this.onDataLoaded.emit();\n });\n\n #holidayEffect = effect(async () => {\n const func = this.holidays();\n const range = {\n end: this.range().end,\n from: this.range().from,\n };\n this.schedulerService.internalHoliday.set(await func(range));\n });\n #weekendEffect = effect(async () => {\n const weekend = this.weekend();\n this.schedulerService.internalWeekend.set(weekend);\n });\n\n private async fillDataSource() {\n const result = [];\n for await (const c of this.views()) {\n const text = await this.translationService.translateAsync(`@acorex:dateTime.duration.${this.displayViews[c]}`);\n result.push({ text, id: c });\n }\n this.viewsDataSource.set(result);\n }\n\n private getGridDateRange(dateInMonth: AXDateTime): { gridStartDate: AXDateTime; gridEndDate: AXDateTime } {\n const firstDayOfMonth = dateInMonth.startOf('month');\n const firstDayGridNum = this.schedulerService.getDayOfWeekNumber(this.firstDayOfWeek());\n const firstDisplayedDayOfWeek = firstDayOfMonth.dayOfWeek;\n const daysFromPrevMonth = (firstDisplayedDayOfWeek - firstDayGridNum + 7) % 7;\n const gridStartDate = firstDayOfMonth.add('day', -daysFromPrevMonth);\n // Calculate end date based on standard 6 weeks for safety, or calculate dynamically if preferred\n const gridEndDate = gridStartDate.add('day', 6 * 7 - 1);\n return { gridStartDate, gridEndDate };\n }\n\n public currentDateText = computed(() => {\n switch (this.selectedView()) {\n case 'day':\n case 'timeline-day':\n return this.formatService.format(this.currentDate(), 'datetime', {\n format: 'DD MMMM yyyy',\n calendar: this.calendarType(),\n });\n case 'week': {\n const startOfWeek = this.formatService.format(this.currentDate(), 'datetime', {\n format: 'DD MMMM yyyy',\n calendar: this.calendarType(),\n });\n const endOfWeek = this.formatService.format(this.currentDate().add('week', 1).add('day', -1), 'datetime', {\n format: 'DD MMMM yyyy',\n calendar: this.calendarType(),\n });\n return `${startOfWeek} - ${endOfWeek}`;\n }\n case 'agenda':\n case 'timeline-multi-day': {\n const startOfWeek = this.formatService.format(this.currentDate(), 'datetime', {\n format: 'DD MMMM yyyy',\n calendar: this.calendarType(),\n });\n const endOfWeek = this.formatService.format(\n this.currentDate().add('day', this.multiDayViewDaysCount() - 1),\n 'datetime',\n {\n format: 'DD MMMM yyyy',\n calendar: this.calendarType(),\n },\n );\n return `${startOfWeek} - ${endOfWeek}`;\n }\n case 'month':\n case 'timeline-month':\n return this.formatService.format(this.currentDate(), 'datetime', {\n format: 'MMMM yyyy',\n calendar: this.calendarType(),\n });\n case 'timeline-year':\n return this.formatService.format(this.currentDate(), 'datetime', {\n format: 'yyyy',\n calendar: this.calendarType(),\n });\n }\n });\n\n public calendarDepth = computed(() => {\n switch (this.selectedView()) {\n case 'day':\n case 'week':\n case 'agenda':\n case 'timeline-day':\n case 'timeline-multi-day':\n return 'day';\n case 'month':\n case 'timeline-month':\n return 'month';\n case 'timeline-year':\n return 'year';\n }\n });\n\n private mappedAppointments = computed<AXSchedulerAppointment[]>(() => {\n const items = this._appointments() as AXSchedulerAppointment[];\n\n return items\n .map((item) => {\n const startDate = this.calendarService.create(item.startDate, this.calendarType());\n const endDate = this.calendarService.create(item.endDate, this.calendarType());\n // Basic validation\n if (!startDate?.date || !endDate?.date) {\n console.warn('Scheduler: Skipping item due to invalid date fields:', item);\n return null;\n }\n // Check if dates are valid after creation\n if (isNaN(startDate.date.getTime()) || isNaN(endDate.date.getTime())) {\n console.warn('Scheduler: Skipping item due to invalid parsed date (NaN):', item);\n return null;\n }\n return item;\n })\n .filter((appt): appt is AXSchedulerAppointment => appt !== null); // Filter out nulls from invalid dates\n });\n\n public range = computed<AXSchedulerDateRange>(() => {\n const view = this.selectedView();\n const current = this.currentDate().startOf('day');\n\n if (!current) return { from: null, end: null };\n\n switch (view) {\n case 'day':\n case 'timeline-day': {\n const range = { from: current.date, end: current.endOf('day').date };\n return range;\n }\n case 'week': {\n const range = { from: current.date, end: current.add('day', 7).date };\n return range;\n }\n case 'month': {\n const { gridStartDate, gridEndDate } = this.getGridDateRange(current);\n const range = { from: gridStartDate.date, end: gridEndDate.add('day', 1).date };\n return range;\n }\n case 'timeline-month': {\n const range = { from: current.startOf('month').date, end: current.endOf('month').date };\n return range;\n }\n case 'agenda':\n case 'timeline-multi-day': {\n const range = { from: current.date, end: current.add('day', this.multiDayViewDaysCount()).date };\n return range;\n }\n case 'timeline-year': {\n const range = { from: current.startOf('year').date, end: current.endOf('year').date };\n return range;\n }\n }\n });\n\n #rangeChangedEffect = effect(() => {\n this.onRangeChanged.emit(this.range());\n });\n\n #viewChangedEffect = effect(() => {\n const view = this.selectedView();\n untracked(() => {\n this.handleViewChanged(this.prevView(), view);\n });\n });\n\n viewAppointments = computed<AXSchedulerAppointment[]>(() => {\n const current = this.currentDate();\n const mapped = this.mappedAppointments();\n const rangeStart = this.range().from;\n const rangeEnd = this.range().end;\n\n if (!current || mapped.length === 0) return [];\n\n return mapped.filter(\n (appt) =>\n this.calendarService.create(appt.startDate, this.calendarType()).compare(rangeEnd, 'second') <= 0 &&\n this.calendarService.create(appt.endDate, this.calendarType()).compare(rangeStart, 'second') >= 0,\n );\n });\n\n /**\n * Handles view change events.\n *\n * @param e - The value changed event containing old and new view values.\n */\n viewChanged(e: AXValueChangedEvent<AXSchedulerView>) {\n const newView = e.value;\n const oldView = e.oldValue;\n this.selectedView.set(newView);\n\n this.handleViewChanged(oldView, newView);\n }\n\n private handleViewChanged(oldView: AXSchedulerView, newView: AXSchedulerView) {\n if (oldView === 'week') {\n const oldDayOfWeek = this.prevDate().dayOfWeek % 7;\n const date = this.currentDate().add('day', oldDayOfWeek - 1);\n this.currentDate.set(date);\n }\n\n this.prevDate.set(this.currentDate());\n\n if (newView === 'week') {\n const currentDate = this.currentDate();\n const currentDayOfWeek = currentDate.dayOfWeek;\n const desiredFirstDayName = this.firstDayOfWeek();\n const desiredFirstDayNumber = this.schedulerService.getDayOfWeekNumber(desiredFirstDayName);\n const daysToSubtract = (currentDayOfWeek - desiredFirstDayNumber + 7) % 7;\n const startOfWeekDate = currentDate.add('day', -daysToSubtract);\n this.currentDate.set(startOfWeekDate);\n }\n\n this.prevView.set(newView);\n }\n\n /**\n * Navigates to the next time period based on current view.\n */\n nextClick() {\n switch (this.selectedView()) {\n case 'day':\n case 'timeline-day':\n this.currentDate.set(this.currentDate().add('day', 1));\n break;\n\n case 'week':\n this.currentDate.set(this.currentDate().add('week', 1));\n break;\n\n case 'agenda':\n case 'timeline-multi-day':\n this.currentDate.set(this.currentDate().add('day', this.multiDayViewDaysCount()));\n break;\n\n case 'month':\n case 'timeline-month':\n this.currentDate.set(this.currentDate().add('month', 1));\n break;\n\n case 'timeline-year':\n this.currentDate.set(this.currentDate().add('year', 1));\n break;\n }\n }\n\n /**\n * Navigates to the previous time period based on current view.\n */\n prevClick() {\n switch (this.selectedView()) {\n case 'day':\n case 'timeline-day':\n this.currentDate.set(this.currentDate().add('day', -1));\n break;\n\n case 'week':\n this.currentDate.set(this.currentDate().add('week', -1));\n break;\n\n case 'agenda':\n case 'timeline-multi-day':\n this.currentDate.set(this.currentDate().add('day', -this.multiDayViewDaysCount()));\n break;\n\n case 'month':\n case 'timeline-month':\n this.currentDate.set(this.currentDate().add('month', -1));\n break;\n\n case 'timeline-year':\n this.currentDate.set(this.currentDate().add('year', -1));\n break;\n }\n }\n\n /**\n * Handles calendar date change events.\n *\n * @param e - The value changed event containing the new date.\n */\n calendarDateChanged(e: AXValueChangedEvent<Date>) {\n let currentDate = this.calendarService.create(e.value, this.calendarType());\n if (this.selectedView() === 'week') {\n const currentDayOfWeek = currentDate.dayOfWeek;\n const desiredFirstDayName = this.firstDayOfWeek();\n const desiredFirstDayNumber = this.schedulerService.getDayOfWeekNumber(desiredFirstDayName);\n const daysToSubtract = (currentDayOfWeek - desiredFirstDayNumber + 7) % 7;\n currentDate = currentDate.add('day', -daysToSubtract);\n }\n if (!currentDate.equal(this.currentDate())) {\n this.currentDate.set(currentDate);\n }\n this.calendarPopover()?.close();\n }\n\n /**\n * Toggles fullscreen mode for the scheduler.\n */\n public handleFullScreen() {\n if (!this.isFullScreen()) this.nativeElement.classList.add('ax-full-screen-container');\n else this.nativeElement.classList.remove('ax-full-screen-container');\n this.isFullScreen.set(!this.isFullScreen());\n }\n\n /**\n * Refreshes the scheduler data.\n *\n * @param appointments - Optional array of appointments to refresh with.\n */\n public async refresh(appointments?: AXSchedulerAppointment[]) {\n if (appointments) {\n const newAppointments = this._appointments().map((appt) => {\n return appointments.find((a) => a.id === appt.id) ?? appt;\n });\n this._appointments.set(newAppointments);\n this.onDataLoaded.emit();\n return;\n }\n if (typeof this.dataSource() === 'function') {\n const func = this.dataSource() as AXSchedulerAppointmentLoader;\n const range = {\n end: this.range().end,\n from: this.range().from,\n };\n const list = await func({ range });\n this._appointments.set(list);\n this.onDataLoaded.emit();\n return;\n }\n const list = this.dataSource() as AXSchedulerAppointment[];\n this._appointments.set(list);\n this.onDataLoaded.emit();\n }\n}\n","<div class=\"ax-scheduler-container\">\n @if (hasHeader()) {\n <div class=\"ax-scheduler-header\">\n <div class=\"ax-scheduler-date\">\n <ax-button look=\"blank\" (onClick)=\"prevClick()\">\n <ax-icon\n class=\"ax-icon ax-text-xl\"\n [ngClass]=\"{\n 'ax-icon-chevron-left': !rtl(),\n 'ax-icon-chevron-right': rtl(),\n }\"\n ></ax-icon>\n </ax-button>\n <ax-button look=\"blank\" [text]=\"currentDateText()\" #date></ax-button>\n <ax-button look=\"blank\" (onClick)=\"nextClick()\">\n <ax-icon\n class=\"ax-icon ax-text-xl\"\n [ngClass]=\"{\n 'ax-icon-chevron-right': !rtl(),\n 'ax-icon-chevron-left': rtl(),\n }\"\n ></ax-icon>\n </ax-button>\n <ax-popover [target]=\"date\" #calendarPopover>\n <div class=\"ax-overlay-pane\">\n <ax-calendar\n [type]=\"calendarType()\"\n [depth]=\"calendarDepth()\"\n [ngModel]=\"currentDate()\"\n (onValueChanged)=\"calendarDateChanged($event)\"\n ></ax-calendar>\n </div>\n </ax-popover>\n </div>\n <div class=\"ax-scheduler-actions\">\n <ax-select-box\n [dropdownWidth]=\"'200px'\"\n [ngModel]=\"selectedView()\"\n [dataSource]=\"viewsDataSource()\"\n (onValueChanged)=\"viewChanged($event)\"\n ></ax-select-box>\n\n @if (allowFullScreen()) {\n <ax-button look=\"blank\" (onClick)=\"handleFullScreen()\">\n <ax-icon>\n <i\n class=\"fa-solid fa-expand\"\n [ngClass]=\"{ 'fa-compress': isFullScreen(), 'fa-expand': !isFullScreen() }\"\n ></i>\n </ax-icon>\n </ax-button>\n }\n </div>\n </div>\n }\n <div class=\"ax-scheduler-views-container\">\n @switch (selectedView()) {\n @case ('day') {\n <ax-scheduler-day-view\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [draggable]=\"draggable()\"\n [hasActions]=\"hasActions()\"\n [calendar]=\"calendarType()\"\n [endDayHour]=\"endDayHour()\"\n [startDayHour]=\"startDayHour()\"\n [showCurrentTimeIndicator]=\"showCurrentTimeIndicator()\"\n [appointments]=\"viewAppointments()\"\n [dragStartDelay]=\"dragStartDelay()\"\n [tooltipTemplate]=\"tooltipTemplate()\"\n (onActionClickInternal)=\"onActionClick.emit($event)\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n ></ax-scheduler-day-view>\n }\n @case ('week') {\n <ax-scheduler-week-view\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [endDayHour]=\"endDayHour()\"\n [hasActions]=\"hasActions()\"\n [startDayHour]=\"startDayHour()\"\n [showCurrentTimeIndicator]=\"showCurrentTimeIndicator()\"\n [appointments]=\"viewAppointments()\"\n [dragStartDelay]=\"dragStartDelay()\"\n [tooltipTemplate]=\"tooltipTemplate()\"\n (onActionClickInternal)=\"onActionClick.emit($event)\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n ></ax-scheduler-week-view>\n }\n @case ('month') {\n <ax-scheduler-month-view\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [hasActions]=\"hasActions()\"\n [appointments]=\"viewAppointments()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n [dragStartDelay]=\"dragStartDelay()\"\n [tooltipTemplate]=\"tooltipTemplate()\"\n (onActionClickInternal)=\"onActionClick.emit($event)\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n ></ax-scheduler-month-view>\n }\n @case ('timeline-day') {\n <ax-scheduler-timeline-day-view\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [resources]=\"resources()\"\n [draggable]=\"draggable()\"\n [hasActions]=\"hasActions()\"\n [calendar]=\"calendarType()\"\n [endDayHour]=\"endDayHour()\"\n [startDayHour]=\"startDayHour()\"\n [appointments]=\"viewAppointments()\"\n [dragStartDelay]=\"dragStartDelay()\"\n [tooltipTemplate]=\"tooltipTemplate()\"\n [resourceTemplate]=\"resourceTemplate()\"\n [showResourceHeaders]=\"showResourceHeaders()\"\n [showCurrentTimeIndicator]=\"showCurrentTimeIndicator()\"\n [showUnassignedAppointments]=\"showUnassignedAppointments()\"\n (onActionClickInternal)=\"onActionClick.emit($event)\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n >\n </ax-scheduler-timeline-day-view>\n }\n @case ('timeline-multi-day') {\n <ax-scheduler-timeline-multi-day-view\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [resources]=\"resources()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [endDayHour]=\"endDayHour()\"\n [hasActions]=\"hasActions()\"\n [startDayHour]=\"startDayHour()\"\n [appointments]=\"viewAppointments()\"\n [dragStartDelay]=\"dragStartDelay()\"\n [daysCount]=\"multiDayViewDaysCount()\"\n [tooltipTemplate]=\"tooltipTemplate()\"\n [resourceTemplate]=\"resourceTemplate()\"\n [showResourceHeaders]=\"showResourceHeaders()\"\n [showCurrentTimeIndicator]=\"showCurrentTimeIndicator()\"\n [showUnassignedAppointments]=\"showUnassignedAppointments()\"\n (onActionClickInternal)=\"onActionClick.emit($event)\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n >\n </ax-scheduler-timeline-multi-day-view>\n }\n @case ('timeline-month') {\n <ax-scheduler-timeline-month-view\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [resources]=\"resources()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [hasActions]=\"hasActions()\"\n [appointments]=\"viewAppointments()\"\n [dragStartDelay]=\"dragStartDelay()\"\n [tooltipTemplate]=\"tooltipTemplate()\"\n [resourceTemplate]=\"resourceTemplate()\"\n [showResourceHeaders]=\"showResourceHeaders()\"\n [showCurrentTimeIndicator]=\"showCurrentTimeIndicator()\"\n [showUnassignedAppointments]=\"showUnassignedAppointments()\"\n (onActionClickInternal)=\"onActionClick.emit($event)\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n >\n </ax-scheduler-timeline-month-view>\n }\n @case ('timeline-year') {\n <ax-scheduler-timeline-year-view\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [resources]=\"resources()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [hasActions]=\"hasActions()\"\n [appointments]=\"viewAppointments()\"\n [dragStartDelay]=\"dragStartDelay()\"\n [tooltipTemplate]=\"tooltipTemplate()\"\n [resourceTemplate]=\"resourceTemplate()\"\n [showResourceHeaders]=\"showResourceHeaders()\"\n [showCurrentTimeIndicator]=\"showCurrentTimeIndicator()\"\n [showUnassignedAppointments]=\"showUnassignedAppointments()\"\n (onActionClickInternal)=\"onActionClick.emit($event)\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n >\n </ax-scheduler-timeline-year-view>\n }\n @case ('agenda') {\n <ax-scheduler-agenda-view\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [hasActions]=\"hasActions()\"\n [appointments]=\"viewAppointments()\"\n [dragStartDelay]=\"dragStartDelay()\"\n [daysCount]=\"multiDayViewDaysCount()\"\n [tooltipTemplate]=\"tooltipTemplate()\"\n (onActionClickInternal)=\"onActionClick.emit($event)\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n >\n </ax-scheduler-agenda-view>\n }\n }\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { AXSchedulerComponent } from './scheduler.component';\nimport { AXSchedulerAgendaViewComponent } from './views/agenda/scheduler-agenda-view.component';\nimport { AXSchedulerDayViewComponent } from './views/day/scheduler-day-view.component';\nimport { AXSchedulerMonthViewComponent } from './views/month/scheduler-month-view.component';\nimport { AXSchedulerTimelineDayViewComponent } from './views/timeline-day/scheduler-timeline-day-view.component';\nimport { AXSchedulerTimelineMonthViewComponent } from './views/timeline-month/scheduler-timeline-month-view.component';\nimport { AXSchedulerTimelineMultiDayViewComponent } from './views/timeline-multi-day/scheduler-timeline-multi-day-view.component';\nimport { AXSchedulerTimelineYearViewComponent } from './views/timeline-year/scheduler-timeline-year-view.component';\nimport { AXSchedulerWeekViewComponent } from './views/week/scheduler-week-view.component';\n\nconst COMPONENT = [\n AXSchedulerComponent,\n AXSchedulerDayViewComponent,\n AXSchedulerWeekViewComponent,\n AXSchedulerMonthViewComponent,\n AXSchedulerAgendaViewComponent,\n AXSchedulerTimelineDayViewComponent,\n AXSchedulerTimelineMonthViewComponent,\n AXSchedulerTimelineMultiDayViewComponent,\n AXSchedulerTimelineYearViewComponent,\n];\n\n@NgModule({\n imports: [...COMPONENT],\n exports: [...COMPONENT],\n providers: [],\n})\nexport class AXSchedulerModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;MAkBa,kBAAkB,CAAA;AAH/B,IAAA,WAAA,GAAA;AAIU,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC;AACvC,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC;QAE1C,IAAA,CAAA,aAAa,GAAG,EAAE;QAClB,IAAA,CAAA,gBAAgB,GAAG,EAAE;QACrB,IAAA,CAAA,sBAAsB,GAAG,EAAE;AAC3B,QAAA,IAAA,CAAA,uBAAuB,GAAG,EAAE,GAAG,IAAI;AACnC,QAAA,IAAA,CAAA,oBAAoB,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,uBAAuB;AAEzG,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAW,EAAE,2DAAC;AACtC,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAkB,EAAE,2DAAC;AAuuB9C,IAAA;AAruBC;;;;;;AAMG;IACH,qBAAqB,CAAC,YAAoC,EAAE,YAAoC,EAAA;QAC9F,IAAI,CAAC,YAAY,EAAE,SAAS,IAAI,CAAC,YAAY,CAAC,OAAO,IAAI,CAAC,YAAY,EAAE,SAAS,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AAC1G,YAAA,OAAO,KAAK;QACd;QACA,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE;QAC/C,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE;QAC3C,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,OAAO,EAAE;QAC/C,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE;;AAE3C,QAAA,OAAO,MAAM,GAAG,IAAI,IAAI,IAAI,GAAG,MAAM;IACvC;AAEA;;;;;AAKG;AACH,IAAA,0BAA0B,CAAC,WAAmC,EAAA;QAC5D,IAAI,CAAC,WAAW,EAAE,SAAS,IAAI,CAAC,WAAW,CAAC,OAAO;AAAE,YAAA,OAAO,CAAC;AAC7D,QAAA,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,OAAO,EAAE;AACtF,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC,uBAAuB,CAAC;IACnE;AAEA;;;;;;;;;AASG;IACH,kBAAkB,CAChB,QAAoB,EACpB,aAAyB,EACzB,SAAiB,EACjB,OAAe;AACf,IAAA,aAAa,GAAG,CAAC,EAAA;AAEjB,QAAA,IAAI,CAAC,aAAa,IAAI,CAAC,QAAQ,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;AAC/F,YAAA,OAAO,IAAI;QACb;AACA,QAAA,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;;QAG5D,IACE,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC;YAC1C,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC;YACzC,QAAQ,CAAC,IAAI,GAAG,SAAS;AACzB,YAAA,QAAQ,CAAC,IAAI,IAAI,OAAO;UACxB;AACA,YAAA,OAAO,IAAI;QACb;;QAGA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,oBAAoB,CAAC;;QAGjH,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,IAAI,aAAa,EAAE;AAC7C,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,MAAM;QAC9E,MAAM,oBAAoB,GAAG,cAAc,GAAG,SAAS,GAAG,IAAI,CAAC,gBAAgB;;QAG/E,IAAI,oBAAoB,GAAG,CAAC;AAAE,YAAA,OAAO,IAAI;AAEzC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,GAAG,IAAI,CAAC,sBAAsB,CAAC;AAEjF,QAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE;IACjC;AAEA;;;;;;;;;AASG;IACK,kCAAkC,CACxC,qBAAsD,EACtD,aAAyB,EACzB,SAAiB,EACjB,OAAe,EACf,aAAqB,EAAA;QAErB,MAAM,MAAM,GAAyC,EAAE;AACvD,QAAA,IAAI,CAAC,aAAa,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,aAAa,IAAI,CAAC,EAAE;AACxG,YAAA,OAAO,MAAM;QACf;AACA,QAAA,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;;QAE5D,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAChC,CAAC,EACD,CAAC,OAAO,GAAG,SAAS,KAAK,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,sBAAsB,CAAC,CAC9E;AAED,QAAA,qBAAqB,CAAC,OAAO,CAAC,CAAC,WAAW,KAAI;AAC5C,YAAA,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE;gBAAE;AAEvE,YAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;AAC3E,YAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC;;AAG/E,YAAA,IAAI,cAAc,GAAG,oBAAoB,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,aAAa,GAAG,oBAAoB;AAC3G,YAAA,IAAI,cAAc,CAAC,IAAI,GAAG,SAAS;AAAE,gBAAA,cAAc,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;AAE3G,YAAA,IAAI,YAAY,GAAG,kBAAkB,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,WAAW,GAAG,kBAAkB;AAClG,YAAA,IAAI,YAAY,CAAC,IAAI,IAAI,OAAO,EAAE;gBAChC,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,YAAY;AACrG,gBAAA,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;YAChE;;AAGA,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC;AAC3G,YAAA,IAAI,CAAC,SAAS;AAAE,gBAAA,OAAO;;YAGvB,MAAM,aAAa,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AACpD,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,EAAE,aAAa,CAAC;;;AAGxG,YAAA,IACE,CAAC,OAAO;AACR,gBAAA,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ;AACrC,iBAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,QAAQ,IAAI,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC,EACtF;AACA,gBAAA,OAAO;YACT;;AAGA,YAAA,KAAK,IAAI,IAAI,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,IAAI,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE;;AAEpE,gBAAA,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,aAAa;oBAAE;AAEvC,gBAAA,MAAM,UAAU,GAAG,IAAI,KAAK,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,UAAU,GAAG,CAAC;;AAEzE,gBAAA,MAAM,QAAQ,GAAG,IAAI,KAAK,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,UAAU,GAAG,iBAAiB,GAAG,CAAC;AAEvF,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AAAE,oBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;AAEpC,gBAAA,KAAK,IAAI,IAAI,GAAG,UAAU,EAAE,IAAI,IAAI,QAAQ,EAAE,IAAI,EAAE,EAAE;;oBAEpD,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,GAAG,iBAAiB,EAAE;AACzC,wBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;4BAAE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;;wBAEhD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,EAAE,CAAC,EAAE;4BAC5D,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;wBACtC;oBACF;gBACF;YACF;AACF,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,MAAM;IACf;AAEA;;;;;;;;AAQG;IACH,+BAA+B,CAC7B,qBAAsD;IACtD,aAAyB,EACzB,SAAiB,EACjB,OAAe,EAAA;AAEf,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkE;AAC5F,QAAA,IAAI,qBAAqB,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,UAAU;AAEzD,QAAA,MAAM,qBAAqB,GAAG,IAAI,CAAC,kCAAkC,CACnE,qBAAqB,EACrB,aAAa,EACb,SAAS,EACT,OAAO,EACP,CAAC,CACF;QACD,MAAM,MAAM,GAAG,qBAAqB,CAAC,CAAC,CAAC,IAAI,EAAE;;AAG7C,QAAA,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAe;AAChD,QAAA,qBAAqB,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;YACxC,IAAI,yBAAyB,GAAG,CAAC;AACjC,YAAA,MAAM,mBAAmB,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC,UAAU,EAAE;AACjH,YAAA,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE;;AAG3G,YAAA,MAAM,wBAAwB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,mBAAmB,GAAG,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC;YACrG,MAAM,sBAAsB,GAAG,IAAI,CAAC,GAAG,CACrC,CAAC,OAAO,GAAG,SAAS,IAAI,IAAI,CAAC,gBAAgB,EAC7C,iBAAiB,GAAG,SAAS,GAAG,IAAI,CAAC,gBAAgB,CACtD;AAED,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,wBAAwB,GAAG,IAAI,CAAC,sBAAsB,CAAC;AAC1F,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,sBAAsB,GAAG,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;AAE9F,YAAA,KAAK,IAAI,QAAQ,GAAG,eAAe,EAAE,QAAQ,IAAI,cAAc,EAAE,QAAQ,EAAE,EAAE;AAC3E,gBAAA,MAAM,mBAAmB,GAAG,MAAM,CAAC,QAAQ,CAAC;gBAC5C,IAAI,mBAAmB,EAAE;oBACvB,yBAAyB,GAAG,IAAI,CAAC,GAAG,CAAC,yBAAyB,EAAE,mBAAmB,CAAC,MAAM,CAAC;gBAC7F;YACF;YACA,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,yBAAyB,IAAI,CAAC,CAAC;AACnE,QAAA,CAAC,CAAC;;AAGF,QAAA,MAAM,4BAA4B,GAAG,IAAI,GAAG,EAAe;AAC3D,QAAA,qBAAqB,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;AACxC,YAAA,4BAA4B,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AACtF,QAAA,CAAC,CAAC;QAEF,IAAI,OAAO,GAAG,IAAI;QAClB,OAAO,OAAO,EAAE;YACd,OAAO,GAAG,KAAK;AACf,YAAA,qBAAqB,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;AACzC,gBAAA,qBAAqB,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;AACzC,oBAAA,IAAI,QAAQ,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE;wBAAE;oBAEjC,IAAI,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE;AAClD,wBAAA,MAAM,IAAI,GAAG,4BAA4B,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC;AAC/D,wBAAA,MAAM,IAAI,GAAG,4BAA4B,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC;wBAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;AAEnC,wBAAA,IAAI,IAAI,KAAK,MAAM,EAAE;4BACnB,4BAA4B,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;4BACrD,OAAO,GAAG,IAAI;wBAChB;AACA,wBAAA,IAAI,IAAI,KAAK,MAAM,EAAE;4BACnB,4BAA4B,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;4BACrD,OAAO,GAAG,IAAI;wBAChB;oBACF;AACF,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,CAAC;QACJ;;AAGA,QAAA,qBAAqB,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;AACxC,YAAA,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE;gBACzB,cAAc,EAAE,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC;gBACtD,qBAAqB,EAAE,4BAA4B,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC;AACzE,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,UAAU;IACnB;AAEA;;;;;;;AAOG;AACH,IAAA,sBAAsB,CACpB,YAAsC,EACtC,aAAyB;IACzB,WAAuB,EAAA;AAEvB,QAAA,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAoC;AACvE,QAAA,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,WAAW,EAAE;AAChF,YAAA,OAAO,mBAAmB;QAC5B;;QAGA,MAAM,oBAAoB,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;AAEtD,QAAA,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,KAAI;AACnC,YAAA,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE;gBAAE;;AAGvE,YAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC;AAC3E,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;;YAGvE,IACE,cAAc,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC;gBAChD,gBAAgB,CAAC,OAAO,CAAC,oBAAoB,EAAE,KAAK,CAAC,IAAI,CAAC,EAC1D;gBACA;YACF;;YAGA,IAAI,UAAU,GACZ,gBAAgB,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,aAAa,GAAG,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC;;AAGtG,YAAA,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,OACE,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC;gBAC9C,UAAU,CAAC,OAAO,CAAC,oBAAoB,EAAE,KAAK,CAAC,GAAG,CAAC;gBACnD,SAAS,GAAG,GAAG,EACf;gBACA,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;gBAE/F,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;AACxC,oBAAA,mBAAmB,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;gBACzC;;gBAEA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,EAAE,CAAC,EAAE;oBAC7E,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;gBACvD;gBAEA,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;AACrC,gBAAA,SAAS,EAAE;YACb;AACA,YAAA,IAAI,SAAS,IAAI,GAAG,EAAE;gBACpB,OAAO,CAAC,IAAI,CAAC,kEAAkE,EAAE,WAAW,CAAC,EAAE,CAAC;YAClG;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,mBAAmB;IAC5B;AAEA;;;;;AAKG;AACH,IAAA,kBAAkB,CAAC,OAAwB,EAAA;QACzC,QAAQ,OAAO;AACb,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,CAAC;AACV,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,CAAC;AACV,YAAA,KAAK,SAAS;AACZ,gBAAA,OAAO,CAAC;AACV,YAAA,KAAK,WAAW;AACd,gBAAA,OAAO,CAAC;AACV,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,CAAC;AACV,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,CAAC;AACV,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,CAAC;AACV,YAAA;AACE,gBAAA,OAAO,CAAC,IAAI,CAAC,qBAAqB,OAAO,CAAA,2BAAA,CAA6B,CAAC;AACvE,gBAAA,OAAO,CAAC;;IAEd;AAEA;;;;;;AAMG;IACH,WAAW,CACT,SAAqB,EACrB,IAAqB,EAAA;AAErB,QAAA,IAAI,OAAmB;QACvB,QAAQ,IAAI;AACV,YAAA,KAAK,KAAK;AACV,YAAA,KAAK,MAAM;gBACT,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,sBAAsB,CAAC;gBAC9D;AACF,YAAA,KAAK,cAAc;AACnB,YAAA,KAAK,oBAAoB;AACvB,gBAAA,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,sBAAsB,GAAG,CAAC,CAAC;gBAClE;AACF,YAAA,KAAK,OAAO;AACZ,YAAA,KAAK,QAAQ;AACb,YAAA,KAAK,gBAAgB;AACrB,YAAA,KAAK,eAAe;AAClB,gBAAA,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;AACpC,gBAAA,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC;gBAChC;;AAEJ,QAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;IACrC;AAEA;;;;;;AAMG;AACH,IAAA,WAAW,CACT,KAAmE,EACnE,cAAc,EACd,SAAiC,EAAA;AAEjC,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW;QACpC,UAAU,CAAC,cAAc,EAAE;QAC3B,UAAU,CAAC,eAAe,EAAE;AAC5B,QAAA,IAAI,SAAS,KAAK,aAAa,EAAE;AAC/B,YAAA,MAAM,oBAAoB,GAAG,cAAc,CAAC,SAAS,CAAC;YACtD,MAAM,OAAO,GAAG,oBAAoB,CAAC,UAAU,CAAC,IAAyC,CAAC;AAC1F,YAAA,IAAI,OAAO;AAAE,gBAAA,OAAO,CAAC,IAAI,CAAC,KAAyC,CAAC;QACtE;AACA,QAAA,IAAI,SAAS,KAAK,MAAM,EAAE;AACxB,YAAA,MAAM,aAAa,GAAG,cAAc,CAAC,SAAS,CAAC;YAC/C,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,CAAC,IAAkC,CAAC;AAC5E,YAAA,IAAI,OAAO;AAAE,gBAAA,OAAO,CAAC,IAAI,CAAC,KAAkC,CAAC;QAC/D;IACF;AAEA;;;;;;;AAOG;IACH,uBAAuB;;IAErB,IAA4B,EAC5B,aAAqB;IACrB,WAAmB,EAAA;QAEnB,IACE,CAAC,IAAI,EAAE,SAAS;YAChB,CAAC,IAAI,CAAC,OAAO;YACb,OAAO,aAAa,KAAK,QAAQ;YACjC,OAAO,WAAW,KAAK,QAAQ;YAC/B,aAAa,IAAI,WAAW;UAC5B;AACA,YAAA,OAAO,CAAC,IAAI,CAAC,wCAAwC,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC;AAC5F,YAAA,OAAO,IAAI;QACb;QAEA,MAAM,wBAAwB,GAAG,CAAC,WAAW,GAAG,aAAa,IAAI,EAAE;QACnE,IAAI,wBAAwB,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;;AAG/C,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS;AACnC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO;;;AAI/B,QAAA,IAAI,iCAAiC,GAAG,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,UAAU,EAAE;;QAGhG,iCAAiC,GAAG,IAAI,CAAC,GAAG,CAAC,iCAAiC,EAAE,aAAa,GAAG,EAAE,CAAC;;QAEnG,iCAAiC,GAAG,IAAI,CAAC,GAAG,CAAC,iCAAiC,EAAE,WAAW,GAAG,EAAE,CAAC;AAEjG,QAAA,MAAM,kCAAkC,GAAG,iCAAiC,GAAG,aAAa,GAAG,EAAE;;QAGjG,IACE,kCAAkC,GAAG,CAAC;YACtC,IAAI,CAAC,GAAG,CAAC,kCAAkC,CAAC,GAAG,IAAI,+BACnD;;;QAGF;AAEA,QAAA,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,kCAAkC,CAAC,GAAG,wBAAwB,IAAI,GAAG;;;AAIzG,QAAA,IAAI,+BAA+B,GAAG,UAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC,UAAU,EAAE;QAC1F,IAAI,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,EAAE;;AAEjH,YAAA,+BAA+B,GAAG,EAAE,GAAG,EAAE;QAC3C;;QAGA,+BAA+B,GAAG,IAAI,CAAC,GAAG,CAAC,+BAA+B,EAAE,WAAW,GAAG,EAAE,CAAC;;QAE7F,+BAA+B,GAAG,IAAI,CAAC,GAAG,CAAC,+BAA+B,EAAE,aAAa,GAAG,EAAE,CAAC;AAE/F,QAAA,MAAM,4BAA4B,GAAG,IAAI,CAAC,GAAG,CAC3C,CAAC,EACD,+BAA+B,GAAG,iCAAiC,CACpE;AAED,QAAA,IAAI,4BAA4B,IAAI,CAAC,EAAE;;AAErC,YAAA,OAAO,IAAI;QACb;QAEA,MAAM,eAAe,GAAG,CAAC,4BAA4B,GAAG,wBAAwB,IAAI,GAAG;;QAGvF,IACE,cAAc,GAAG,GAAG;AACpB,YAAA,cAAc,GAAG,CAAC;AAClB,YAAA,eAAe,IAAI,CAAC;AACpB,YAAA,eAAe,GAAG,GAAG;AACrB,YAAA,cAAc,GAAG,eAAe,GAAG,QAAQ,6BAC3C;;;;;;;;YAQA,IAAI,eAAe,IAAI,CAAC;AAAE,gBAAA,OAAO,IAAI;QACvC;QAEA,OAAO;AACL,YAAA,IAAI,EAAE,CAAA,EAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAA,CAAA,CAAG;AACtD,YAAA,KAAK,EAAE,CAAA,EAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,CAAA,CAAA,CAAG;SACzD;IACH;AAEA;;;;;;;;;AASG;IACH,gCAAgC,CAC9B,WAAmC;AACnC,IAAA,GAAe,EACf,aAAqB,EACrB,WAAmB,EACnB,oBAAoB,GAAG,KAAK,EAAA;AAE5B,QAAA,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;AAClE,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC;AAC/E,QAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;AAE3E,QAAA,IAAI,WAAW,CAAC,MAAM,EAAE;YACtB,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;YAC7C,MAAM,mBAAmB,GAAG,oBAAoB,CAAC,OAAO,CAAC,KAAK,CAAC;YAC/D,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC;;YAG3D,IAAI,mBAAmB,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE;AAC5G,gBAAA,MAAM,6BAA6B,GAAG,mBAAmB,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC;AACxF,gBAAA,MAAM,uBAAuB,GAAG,iBAAiB,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC;gBAEhF,OAAO;AACL,oBAAA,GAAG,WAAW;oBACd,SAAS,EAAE,UAAU,CAAC,IAAI;AAC1B,oBAAA,OAAO,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI;AAC7D,oBAAA,MAAM,EAAE,IAAI;oBACZ,iBAAiB,EAAE,oBAAoB,CAAC,IAAI;oBAC5C,eAAe,EAAE,kBAAkB,CAAC,IAAI;oBACxC,6BAA6B;oBAC7B,uBAAuB;AACvB,oBAAA,sBAAsB,EAAE,WAAW;iBACpC;YACH;iBAAO;AACL,gBAAA,OAAO,IAAI;YACb;QACF;QAEA,MAAM,gBAAgB,GAAG;cACrB,GAAG,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,KAAK;AAC3B,cAAE,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QAC1D,MAAM,cAAc,GAAG;AACrB,cAAE,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK;AACzC,cAAE,WAAW,KAAK,EAAE,KAAK,WAAW,KAAK,CAAC,IAAI,aAAa,KAAK,CAAC;AAC/D,kBAAE,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK;AACzC,kBAAE,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;QAE1D,IACE,kBAAkB,CAAC,OAAO,CAAC,gBAAgB,EAAE,QAAQ,CAAC,IAAI,CAAC;YAC3D,oBAAoB,CAAC,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,IAAI,CAAC,EAC3D;AACA,YAAA,OAAO,IAAI;QACb;QACA,MAAM,gBAAgB,GACpB,oBAAoB,CAAC,OAAO,CAAC,gBAAgB,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,oBAAoB,GAAG,gBAAgB;QACxG,MAAM,cAAc,GAClB,kBAAkB,CAAC,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,kBAAkB,GAAG,cAAc;QAEhG,IAAI,gBAAgB,CAAC,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE;AAC3D,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,6BAA6B,GAAG,oBAAoB,CAAC,OAAO,CAAC,gBAAgB,EAAE,QAAQ,CAAC,GAAG,CAAC;AAClG,QAAA,MAAM,uBAAuB,GAAG,kBAAkB,CAAC,OAAO,CAAC,cAAc,EAAE,QAAQ,CAAC,GAAG,CAAC;QACxF,MAAM,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAElE,OAAO;AACL,YAAA,GAAG,WAAW;YACd,SAAS,EAAE,gBAAgB,CAAC,IAAI;YAChC,OAAO,EAAE,cAAc,CAAC,IAAI;AAC5B,YAAA,MAAM,EAAE,WAAW,CAAC,MAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,CAAC;YACnF,iBAAiB,EAAE,oBAAoB,CAAC,IAAI;YAC5C,eAAe,EAAE,kBAAkB,CAAC,IAAI;YACxC,6BAA6B;YAC7B,uBAAuB;AACvB,YAAA,sBAAsB,EAAE,WAAW;SACpC;IACH;AAEA;;;;;AAKG;AACH,IAAA,sBAAsB,CAAC,IAA4D,EAAA;QACjF,MAAM,OAAO,GAAG,IAAqC;AACrD,QAAA,IAAI,OAAO,CAAC,sBAAsB,EAAE;YAClC,OAAO,OAAO,CAAC,sBAAsB;QACvC;AACA,QAAA,OAAO,IAAI;IACb;AAEA;;;;;AAKG;AACH,IAAA,SAAS,CAAC,IAAgB,EAAA;QACxB,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3F,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACtF,OAAO,cAAc,IAAI,gBAAgB;IAC3C;AAEA;;;;;;AAMG;IACH,SAAS,CAAC,IAAgB,EAAE,QAAgB,EAAA;AAC1C,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE;AAC9C,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,OAAO;AAC5E,QAAA,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE;YAChC,OAAO,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnD;AACA,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;IAC5D;AAEA;;;;;;;AAOG;AACH,IAAA,6BAA6B,CAC3B,YAAsC,EACtC,SAAgC,EAChC,0BAA0B,GAAG,IAAI,EAAA;AAEjC,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,EAAiC;QAEvD,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE;;AAExC,YAAA,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC;AACnC,YAAA,OAAO,MAAM;QACf;;AAGA,QAAA,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAI;YAC7B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;AAC7B,QAAA,CAAC,CAAC;;QAGF,IAAI,0BAA0B,EAAE;AAC9B,YAAA,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC;QAC9B;;AAGA,QAAA,YAAY,CAAC,OAAO,CAAC,CAAC,WAAW,KAAI;AACnC,YAAA,IAAI,WAAW,CAAC,UAAU,KAAK,SAAS,IAAI,WAAW,CAAC,UAAU,KAAK,IAAI,EAAE;;gBAE3E,IAAI,aAAa,GAAG,KAAK;AACzB,gBAAA,KAAK,MAAM,CAAC,GAAG,EAAE,oBAAoB,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE;AAC1D,oBAAA,IAAI,GAAG,KAAK,YAAY,IAAI,OAAO,CAAC,GAAG,EAAE,WAAW,CAAC,UAAU,CAAC,EAAE;AAChE,wBAAA,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC;wBACtC,aAAa,GAAG,IAAI;wBACpB;oBACF;gBACF;AAEA,gBAAA,IAAI,CAAC,aAAa,IAAI,0BAA0B,EAAE;;oBAEhD,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;gBAC5C;YACF;iBAAO,IAAI,0BAA0B,EAAE;gBACrC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;YAC5C;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,MAAM;IACf;AAEA;;;;;;AAMG;IACH,0BAA0B,CAAC,YAAsC,EAAE,UAAe,EAAA;AAChF,QAAA,IAAI,UAAU,KAAK,YAAY,EAAE;YAC/B,OAAO,YAAY,CAAC,MAAM,CACxB,CAAC,WAAW,KAAK,WAAW,CAAC,UAAU,KAAK,SAAS,IAAI,WAAW,CAAC,UAAU,KAAK,IAAI,CACzF;QACH;AACA,QAAA,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC1F;AAEA;;;;;;AAMG;AACH,IAAA,iBAAiB,CAAC,SAAgC,EAAE,0BAA0B,GAAG,IAAI,EAAA;AACnF,QAAA,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,EAAE,CAAC;QAC5D,IAAI,0BAA0B,EAAE;AAC9B,YAAA,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC;QAChC;AACA,QAAA,OAAO,WAAW;IACpB;+GAjvBW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAFjB,MAAM,EAAA,CAAA,CAAA;;4FAEP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACuCK,MAAO,8BAA+B,SAAQ,WAAW,CAAA;AAnB/D,IAAA,WAAA,GAAA;;AAoBU,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,oBAAoB,CAAC;AACxC,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC3C,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAErD,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,CAAC,qDAAC;AACpB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AACvB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,IAAI,qDAAC;AACvB,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,KAAK,sDAAC;AACzB,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAC,CAAC,0DAAC;QACzB,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAC1B,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,+CAAc;AACnC,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAA2B,EAAE,wDAAC;QAClD,IAAA,CAAA,eAAe,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAiC;AAEhD,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAgB,IAAI,2DAAC;AAE3C,QAAA,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAAkB,MAAK;AAC1D,YAAA,MAAM,uBAAuB,GAAG,IAAI,CAAC,YAAY,EAAE;AACnD,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,EAAE;AACnC,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE;AAErC,YAAA,IAAI,CAAC,eAAe,IAAI,CAAC,uBAAuB,EAAE;AAChD,gBAAA,OAAO,EAAE;YACX;YAEA,MAAM,MAAM,GAAoB,EAAE;AAElC,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE;AACrC,gBAAA,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;gBAC/D,MAAM,kBAAkB,GAAoC,EAAE;AAE9D,gBAAA,KAAK,MAAM,IAAI,IAAI,uBAAuB,EAAE;AAC1C,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,gCAAgC,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC;oBACrG,IAAI,OAAO,EAAE;AACX,wBAAA,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;oBAClC;gBACF;AAEA,gBAAA,MAAM,cAAc,GAAG,OAAO,CAC5B,kBAAkB,EAClB;AACE,oBAAA,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;oBACzB,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE;AAC5B,oBAAA,CAAC,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,iBAAiB,CAAC,OAAO,EAAE;iBACnE,EACD,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CACvB;gBAED,MAAM,CAAC,IAAI,CAAC;AACV,oBAAA,IAAI,EAAE,UAAU;AAChB,oBAAA,YAAY,EAAE,cAAc;AAC5B,oBAAA,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;AACpC,iBAAA,CAAC;YACJ;AACA,YAAA,OAAO,MAAM;AACf,QAAA,CAAC,4DAAC;;QAGF,IAAA,CAAA,mBAAmB,GAAG,MAAM,EAA6B;QACzD,IAAA,CAAA,sBAAsB,GAAG,MAAM,EAA6B;QAC5D,IAAA,CAAA,wBAAwB,GAAG,MAAM,EAA6B;QAC9D,IAAA,CAAA,0BAA0B,GAAG,MAAM,EAAoC;QACvE,IAAA,CAAA,6BAA6B,GAAG,MAAM,EAAoC;QAC1E,IAAA,CAAA,+BAA+B,GAAG,MAAM,EAAoC;QAC5E,IAAA,CAAA,qBAAqB,GAAG,MAAM,EAAoC;QAClE,IAAA,CAAA,yBAAyB,GAAG,MAAM,EAA4B;;AAG7C,QAAA,IAAA,CAAA,cAAc,GAAG;AAChC,YAAA,IAAI,EAAE;gBACJ,KAAK,EAAE,IAAI,CAAC,mBAAmB;gBAC/B,QAAQ,EAAE,IAAI,CAAC,sBAAsB;gBACrC,WAAW,EAAE,IAAI,CAAC,wBAAwB;AAC3C,aAAA;AACD,YAAA,WAAW,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,0BAA0B;gBACtC,QAAQ,EAAE,IAAI,CAAC,6BAA6B;gBAC5C,WAAW,EAAE,IAAI,CAAC,+BAA+B;AAClD,aAAA;SACF;AAoFF,IAAA;IAnFW,sBAAsB,CAAC,UAAsB,EAAE,eAAuC,EAAA;QAC9F,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,eAAe,CAAC;AACzF,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,GAAG,mBAAmB;YACtB,OAAO,EAAE,mBAAmB,CAAC,OAAO;YACpC,SAAS,EAAE,mBAAmB,CAAC,SAAS;SACzC;QACD,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAC/B,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EAChF,IAAI,CAAC,cAAc,EACnB,aAAa,CACd;IACH;IACU,eAAe,CAAC,UAAsB,EAAE,IAAgB,EAAA;AAChE,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;QACjF,IAAI,QAAQ,EAAE;YACZ,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAC/B,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EACnE,IAAI,CAAC,cAAc,EACnB,MAAM,CACP;QACH;IACF;IACU,UAAU,CAAC,CAAsB,EAAE,IAAgB,EAAA;AAC3D,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC;QACjF,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAA4B;QAClE,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,WAAW,CAAC;AACrF,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,GAAG,mBAAmB;YACtB,OAAO,EAAE,mBAAmB,CAAC,OAAO;YACpC,SAAS,EAAE,mBAAmB,CAAC,SAAS;SACzC;AACD,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC;AAClC,YAAA,SAAS,EAAE,CAAC;AACZ,YAAA,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,IAAI,CAAC,SAAS;AACtB,YAAA,WAAW,EAAE,cAAc;AAC3B,YAAA,cAAc,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;AAChF,SAAA,CAAC;IACJ;IACU,iBAAiB,CAAC,KAAiB,EAAE,eAAuC,EAAA;QACpF,KAAK,CAAC,eAAe,EAAE;QACvB,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,eAAe,CAAC;AACzF,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;AAC9B,YAAA,WAAW,EAAE,mBAAmB;AAChC,YAAA,WAAW,EAAE,KAAK;YAClB,MAAM,EAAE,IAAI,CAAC,SAAS;AACvB,SAAA,CAAC;IACJ;AAEU,IAAA,OAAO,CAAC,IAAgB,EAAA;AAChC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC;IACjC;AACU,IAAA,SAAS,CAAC,IAAgB,EAAA;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC;QACvD,IAAI,SAAS,EAAE;YACb,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC1F,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACtG,YAAA,MAAM,OAAO,GAAG,aAAa,IAAI,eAAe;YAChD,OAAO;AACL,gBAAA,KAAK,EAAE,SAAS;gBAChB,OAAO;aACR;QACH;AACA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxE,IAAI,SAAS,EAAE;AACb,YAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;QAC7B;AACA,QAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;IAC1B;AAEU,IAAA,SAAS,CAAC,CAAe,EAAA;AACjC,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC;aAC1B,iBAAiB,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO;AACtC,aAAA,IAAI,CAAC,CAAC,EAAE,KAAwB,EAAE,YAAY,WAAW,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC;QACnG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IACtF;AAEA,IAAA,IACc,UAAU,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE;IACxB;+GApKW,8BAA8B,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA9B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,8BAA8B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,6BAAA,EAAA,+BAAA,EAAA,+BAAA,EAAA,iCAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,SAAA,EAF9B,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,8BAA8B,EAAE,CAAC,iDCtDpF,4+IAkGA,EAAA,MAAA,EAAA,CAAA,gjNAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDtDI,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAGP,eAAe,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,wBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEf,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,mBAAmB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,wBAAwB,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,2BAA2B,EAAA,QAAA,EAAA,8IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAP3B,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACT,YAAY,0CAEZ,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FAQP,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAnB1C,SAAS;+BACE,0BAA0B,EAAA,eAAA,EAGnB,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B;wBACP,OAAO;wBACP,SAAS;wBACT,YAAY;wBACZ,eAAe;wBACf,gBAAgB;wBAChB,kBAAkB;wBAClB,mBAAmB;wBACnB,wBAAwB;wBACxB,2BAA2B;qBAC5B,EAAA,SAAA,EACU,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAA,8BAAgC,EAAE,CAAC,EAAA,QAAA,EAAA,4+IAAA,EAAA,MAAA,EAAA,CAAA,gjNAAA,CAAA,EAAA;;sBAmKjF,WAAW;uBAAC,yBAAyB;;;AE9JlC,MAAO,2BAA4B,SAAQ,WAAW,CAAA;AApB5D,IAAA,WAAA,GAAA;;AAqBU,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,oBAAoB,CAAC;AACxC,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC3C,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC;QAE5C,IAAA,CAAA,MAAM,GAAG,CAAC;AAEnB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AACvB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,IAAI,qDAAC;AACvB,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,KAAK,sDAAC;AACzB,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAC,CAAC,0DAAC;QACzB,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAC1B,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,+CAAc;AACnC,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,QAAQ,qDAAU;AACrC,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAC,QAAQ,uDAAU;AACvC,QAAA,IAAA,CAAA,wBAAwB,GAAG,KAAK,CAAU,IAAI,oEAAC;AAC/C,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAA2B,EAAE,wDAAC;QAClD,IAAA,CAAA,eAAe,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAiC;;AAGxD,QAAA,IAAA,CAAA,sBAAsB,GAAG,SAAS,CAA0B,iBAAiB,kEAAC;AAEtE,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAgB,IAAI,2DAAC;AAE7C,QAAA,IAAA,CAAA,8BAA8B,GAAG,QAAQ,CAAC,MAAK;AACrD,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE;AAC5B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;AAClC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAC9B,YAAA,MAAM,qBAAqB,GAAG,IAAI,CAAC,YAAY,EAAE;YACjD,IAAI,CAAC,QAAQ,IAAI,qBAAqB,CAAC,MAAM,KAAK,CAAC,EAAE;AACnD,gBAAA,OAAO,EAAE;YACX;YACA,MAAM,kBAAkB,GAAoC,EAAE;AAC9D,YAAA,KAAK,MAAM,IAAI,IAAI,qBAAqB,EAAE;AACxC,gBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,gCAAgC,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC;gBACpG,IAAI,OAAO,EAAE;AACX,oBAAA,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;gBAClC;YACF;AACA,YAAA,OAAO,kBAAkB;AAC3B,QAAA,CAAC,0EAAC;AACQ,QAAA,IAAA,CAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;YAC3C,MAAM,0BAA0B,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE;YAC1F,MAAM,8BAA8B,GAClC,IAAI,CAAC,8BAA8B,EAAE,EAAE,MAAM,CAC3C,CAAC,OAAO,KAAK,OAAO,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM,CAC9G,IAAI,EAAE;AACT,YAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA+B;AACvD,YAAA,0BAA0B,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AACzE,YAAA,8BAA8B,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;gBAC9C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;oBAC1B,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC;gBAC7B;AACF,YAAA,CAAC,CAAC;YACF,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;AACtC,QAAA,CAAC,8DAAC;AACQ,QAAA,IAAA,CAAA,qBAAqB,GAAG,QAAQ,CAAC,MAAK;YAC9C,OAAO,IAAI,CAAC,8BAA8B,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE;AACnF,QAAA,CAAC,iEAAC;QAEF,IAAA,CAAA,mBAAmB,GAAG,MAAM,EAA6B;QACzD,IAAA,CAAA,sBAAsB,GAAG,MAAM,EAA6B;QAC5D,IAAA,CAAA,wBAAwB,GAAG,MAAM,EAA6B;QAC9D,IAAA,CAAA,0BAA0B,GAAG,MAAM,EAAoC;QACvE,IAAA,CAAA,6BAA6B,GAAG,MAAM,EAAoC;QAC1E,IAAA,CAAA,+BAA+B,GAAG,MAAM,EAAoC;QAC5E,IAAA,CAAA,qBAAqB,GAAG,MAAM,EAAoC;QAClE,IAAA,CAAA,yBAAyB,GAAG,MAAM,EAA4B;AAE7C,QAAA,IAAA,CAAA,cAAc,GAAG;AAChC,YAAA,IAAI,EAAE;gBACJ,KAAK,EAAE,IAAI,CAAC,mBAAmB;gBAC/B,QAAQ,EAAE,IAAI,CAAC,sBAAsB;gBACrC,WAAW,EAAE,IAAI,CAAC,wBAAwB;AAC3C,aAAA;AACD,YAAA,WAAW,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,0BAA0B;gBACtC,QAAQ,EAAE,IAAI,CAAC,6BAA6B;gBAC5C,WAAW,EAAE,IAAI,CAAC,+BAA+B;AAClD,aAAA;SACF;AAmGS,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AACnC,YAAA,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACtB,YAAA,IAAI,CAAC,IAAI;AAAE,gBAAA,OAAO,EAAE;AACpB,YAAA,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;AAC5D,YAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC;YACpB,OAAO,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE;gBACxC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;AAC1B,gBAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YAClB;AACA,YAAA,OAAO,KAAK;AACd,QAAA,CAAC,sDAAC;AAEM,QAAA,IAAA,CAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAK;AACzC,YAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwC;AAC/D,YAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,qBAAqB,EAAE;AACzD,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE;AAC5B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;AAClC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAE9B,YAAA,IAAI,oBAAoB,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AAC5G,gBAAA,OAAO,OAAO;YAChB;AAEA,YAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,CAAC,+BAA+B,CAC9E,oBAAoB,EACpB,QAAQ,EACR,MAAM,EACN,IAAI,CACL;YAED,MAAM,kBAAkB,GAAG,OAAO,CAChC,oBAAoB,EACpB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC,EAClG,CAAC,KAAK,EAAE,MAAM,CAAC,CAChB;YAED,MAAM,WAAW,GAAwD,EAAE;AAE3E,YAAA,KAAK,MAAM,kBAAkB,IAAI,kBAAkB,EAAE;AACnD,gBAAA,IAAI,WAAW,GAAG,CAAC,CAAC;gBAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,GAAI,CAAC,EAAE,EAAE;AACrB,oBAAA,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE;wBACnB,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE;oBACvC;oBAEA,IAAI,QAAQ,GAAG,KAAK;oBAEpB,KAAK,MAAM,aAAa,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE;AACvD,wBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC5F,wBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACxF,IACE,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC;AACtD,4BAAA,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,EACtD;4BACA,QAAQ,GAAG,IAAI;4BACf;wBACF;oBACF;oBAEA,IAAI,CAAC,QAAQ,EAAE;wBACb,WAAW,GAAG,CAAC;wBACf,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC;wBACpD;oBACF;AAEA,oBAAA,IAAI,CAAC,GAAG,oBAAoB,CAAC,MAAM,EAAE;wBACnC,OAAO,CAAC,IAAI,CACV,CAAA,+CAAA,EAAkD,kBAAkB,CAAC,KAAK,CAAA,0BAAA,EAA6B,CAAC,CAAA,CAAE,CAC3G;AACD,wBAAA,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;4BAAE,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE;wBAC1D,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC;wBACpD,WAAW,GAAG,CAAC;wBACf;oBACF;gBACF;gBAEA,MAAM,eAAe,GAAG,kBAAkB,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;AACrE,gBAAA,MAAM,aAAa,GAAG,eAAe,GAAG,eAAe,CAAC,qBAAqB,GAAG,CAAC;AAEjF,gBAAA,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,EAAE;AACjC,oBAAA,WAAW,EAAE,WAAW;AACxB,oBAAA,qBAAqB,EAAE,aAAa;AACrC,iBAAA,CAAC;YACJ;AACA,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC,8DAAC;AAqKH,IAAA;IA7VW,sBAAsB,CAAC,UAAsB,EAAE,WAAmC,EAAA;AAC1F,QAAA,MAAM,mBAAmB,GAAI,WAA6C,CAAC;AACzE,cAAG;AACC,gBAAA,GAAG,WAAW;gBACd,SAAS,EAAG,WAA6C,CAAC,iBAAiB;gBAC3E,OAAO,EAAG,WAA6C,CAAC,eAAe;AAC7C;cAC5B,WAAW;AACf,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,GAAG,mBAAmB;YACtB,OAAO,EAAE,mBAAmB,CAAC,OAAO;YACpC,SAAS,EAAE,mBAAmB,CAAC,SAAS;SACzC;QACD,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAC/B,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EAChF,IAAI,CAAC,cAAc,EACnB,aAAa,CACd;IACH;IACU,qBAAqB,CAAC,UAAsB,EAAE,SAAqB,EAAA;AAC3E,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC;AACpE,QAAA,IAAI,QAAQ;YACV,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAC/B,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EACnE,IAAI,CAAC,cAAc,EACnB,MAAM,CACP;IACL;AACU,IAAA,qBAAqB,CAAC,UAAsB,EAAA;QACpD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;QAC5C,MAAM,QAAQ,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,KAAc,EAAE;AAC7D,QAAA,IAAI,QAAQ;YACV,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAC/B,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EACnE,IAAI,CAAC,cAAc,EACnB,MAAM,CACP;IACL;AACU,IAAA,gBAAgB,CAAC,CAAsB,EAAA;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;QAC5C,MAAM,QAAQ,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,KAAc,EAAE;QAE7D,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAA4B;AAClE,QAAA,MAAM,mBAAmB,GAAI,WAA6C,CAAC;AACzE,cAAG;AACC,gBAAA,GAAG,WAAW;gBACd,SAAS,EAAG,WAA6C,CAAC,iBAAiB;gBAC3E,OAAO,EAAG,WAA6C,CAAC,eAAe;AAC7C;cAC5B,WAAW;AACf,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,GAAG,mBAAmB;YACtB,OAAO,EAAE,mBAAmB,CAAC,OAAO;YACpC,SAAS,EAAE,mBAAmB,CAAC,SAAS;SACzC;AACD,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC;AAClC,YAAA,SAAS,EAAE,CAAC;AACZ,YAAA,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,IAAI,CAAC,SAAS;AACtB,YAAA,WAAW,EAAE,cAAc;AAC3B,YAAA,cAAc,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;AAChF,SAAA,CAAC;IACJ;IACU,mBAAmB,CAAC,CAAsB,EAAE,SAAqB,EAAA;AACzE,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC;QACpE,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAA4B;AAClE,QAAA,MAAM,mBAAmB,GAAI,WAA6C,CAAC;AACzE,cAAG;AACC,gBAAA,GAAG,WAAW;gBACd,SAAS,EAAG,WAA6C,CAAC,iBAAiB;gBAC3E,OAAO,EAAG,WAA6C,CAAC,eAAe;AAC7C;cAC5B,WAAW;AACf,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,GAAG,mBAAmB;YACtB,OAAO,EAAE,mBAAmB,CAAC,OAAO;YACpC,SAAS,EAAE,mBAAmB,CAAC,SAAS;SACzC;AACD,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC;AAClC,YAAA,SAAS,EAAE,CAAC;AACZ,YAAA,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,IAAI,CAAC,SAAS;AACtB,YAAA,WAAW,EAAE,cAAc;AAC3B,YAAA,cAAc,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;AAChF,SAAA,CAAC;IACJ;IACU,iBAAiB,CAAC,KAAiB,EAAE,eAAuC,EAAA;QACpF,KAAK,CAAC,eAAe,EAAE;QACvB,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,eAAe,CAAC;AACzF,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;AAC9B,YAAA,WAAW,EAAE,mBAAmB;AAChC,YAAA,WAAW,EAAE,KAAK;YAClB,MAAM,EAAE,IAAI,CAAC,SAAS;AACvB,SAAA,CAAC;IACJ;AA0FQ,IAAA,oBAAoB,CAAC,GAAQ,EAAA;QACnC,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;IAC3C;AAEU,IAAA,kBAAkB,CAAC,GAAQ,EAAA;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC;QAC7C,IAAI,MAAM,IAAI,MAAM,CAAC,qBAAqB,GAAG,CAAC,EAAE;AAC9C,YAAA,MAAM,CAAC,GAAG,MAAM,CAAC,qBAAqB;AACtC,YAAA,MAAM,CAAC,GAAG,MAAM,CAAC,WAAW;AAC5B,YAAA,IAAI,CAAC,GAAG,CAAC,EAAE;AACT,gBAAA,OAAO,CAAC,IAAI,CAAC,kCAAkC,EAAE,GAAG,CAAC;AACrD,gBAAA,OAAO,KAAK;YACd;AACA,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAAE,gBAAA,OAAO,KAAK;YACnC,MAAM,WAAW,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;AACjC,YAAA,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM;AACnC,YAAA,OAAO,CAAA,KAAA,EAAQ,WAAW,CAAA,IAAA,EAAO,WAAW,KAAK;QACnD;AACA,QAAA,OAAO,KAAK;IACd;AAEU,IAAA,mBAAmB,CAAC,GAAQ,EAAA;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC;QAC7C,IAAI,MAAM,IAAI,MAAM,CAAC,qBAAqB,GAAG,CAAC,EAAE;AAC9C,YAAA,MAAM,CAAC,GAAG,MAAM,CAAC,qBAAqB;YAEtC,IAAI,CAAC,IAAI,CAAC;AAAE,gBAAA,OAAO,IAAI;YACvB,IAAI,CAAC,KAAK,CAAC;AAAE,gBAAA,OAAO,CAAA,YAAA,EAAe,IAAI,CAAC,MAAM,KAAK;YAEnD,MAAM,YAAY,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG;AAElC,YAAA,OAAO,QAAQ,YAAY,CAAA,IAAA,EAAO,IAAI,CAAC,MAAM,KAAK;QACpD;AACA,QAAA,OAAO,IAAI;IACb;AAEU,IAAA,iBAAiB,CAAC,GAAQ,EAAA;QAClC,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC;QAEjF,IAAI,kBAAkB,EAAE;AACtB,YAAA,MAAM,YAAY,GAAG,kBAAkB,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,kBAAkB,CAAC,SAAS,CAAC,UAAU,EAAE;YAC7G,MAAM,gBAAgB,GAAG,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE;AAChE,YAAA,MAAM,MAAM,GAAG,gBAAgB,GAAG,EAAE;YACpC,OAAO,CAAA,yDAAA,EAA4D,MAAM,CAAA,OAAA,CAAS;QACpF;AACA,QAAA,OAAO,EAAE;IACX;AAEU,IAAA,oBAAoB,CAAC,GAAQ,EAAA;QACrC,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC;QACjF,IAAI,kBAAkB,EAAE;AACtB,YAAA,MAAM,cAAc,GAAG,kBAAkB,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,kBAAkB,CAAC,SAAS,CAAC,OAAO,EAAE;AACpG,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;YACjE,IAAI,eAAe,IAAI,CAAC;AAAE,gBAAA,OAAO,KAAK;AAEtC,YAAA,MAAM,WAAW,GAAG,eAAe,GAAG,EAAE;YACxC,MAAM,eAAe,GAAG,CAAA,iDAAA,CAAmD;YAE3E,OAAO,CAAA,KAAA,EAAQ,eAAe,CAAA,GAAA,EAAM,WAAW,MAAM,IAAI,CAAC,MAAM,CAAA,GAAA,CAAK;QACvE;AACA,QAAA,OAAO,KAAK;IACd;IAEU,sBAAsB,GAAA;AAC9B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;AACvC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE;AACrC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;;AAGjC,QAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACjD,YAAA,OAAO,IAAI;QACb;;AAGA,QAAA,IAAI,GAAG,CAAC,IAAI,GAAG,SAAS,IAAI,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE;AAC/C,YAAA,OAAO,IAAI;QACb;;QAGA,MAAM,cAAc,GAAG,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM;AACjD,QAAA,MAAM,YAAY,GAAG,SAAS,GAAG,EAAE;AACnC,QAAA,MAAM,UAAU,GAAG,OAAO,GAAG,EAAE;AAC/B,QAAA,MAAM,YAAY,GAAG,UAAU,GAAG,YAAY;AAE9C,QAAA,MAAM,iBAAiB,GAAG,cAAc,GAAG,YAAY;AACvD,QAAA,OAAO,CAAC,iBAAiB,GAAG,YAAY,IAAI,GAAG;IACjD;IAEU,gCAAgC,GAAA;AACxC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,EAAE;AAC9C,QAAA,IAAI,QAAQ,KAAK,IAAI,EAAE;AACrB,YAAA,OAAO,IAAI;QACb;;;QAIA,MAAM,cAAc,GAClB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,GAAG,EAAE;AAClE,YAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM;QACjE,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE;AAC7C,QAAA,MAAM,iBAAiB,GAAG,cAAc,GAAG,YAAY;AACvD,QAAA,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,QAAA,MAAM,eAAe,GAAG,iBAAiB,GAAG,WAAW;QAEvD,OAAO,CAAA,yDAAA,EAA4D,eAAe,CAAA,OAAA,CAAS;IAC7F;IAEA,eAAe,GAAA;;QAEb,IAAI,CAAC,sBAAsB,EAAE;IAC/B;IAEQ,sBAAsB,GAAA;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE;AACpC,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,EAAE;AACrD,QAAA,IAAI,eAAe,KAAK,IAAI,EAAE;AAC5B,YAAA,OAAO,SAAS;QAClB;QAEA,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,EAAE,EAAE,aAAa;QACpE,IAAI,CAAC,eAAe,EAAE;AACpB,YAAA,OAAO,SAAS;QAClB;;QAGA,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,KAAI;AACpD,YAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;AAC3B,gBAAA,IAAI,KAAK,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;;oBAE/D,eAAe,CAAC,cAAc,CAAC;AAC7B,wBAAA,QAAQ,EAAE,QAAQ;AAClB,wBAAA,KAAK,EAAE,QAAQ;AACf,wBAAA,MAAM,EAAE,SAAS;AAClB,qBAAA,CAAC;;oBAEF,cAAc,CAAC,UAAU,EAAE;oBAC3B;gBACF;YACF;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,cAAc,CAAC,OAAO,CAAC,eAAe,CAAC;;AAGvC,QAAA,OAAO,MAAM,cAAc,CAAC,UAAU,EAAE;IAC1C;AAEU,IAAA,SAAS,CAAC,CAAe,EAAA;AACjC,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC;aAC1B,iBAAiB,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO;AACtC,aAAA,IAAI,CAAC,CAAC,EAAE,KAAwB,EAAE,YAAY,WAAW,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC;QACnG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IACtF;AAEA,IAAA,IACc,UAAU,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE;IACxB;+GA9aW,2BAA2B,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA3B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,wBAAA,EAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,UAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,6BAAA,EAAA,+BAAA,EAAA,+BAAA,EAAA,iCAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,SAAA,EAF3B,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,2BAA2B,EAAE,CAAC,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,wBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECzDjF,soSA6MA,EAAA,MAAA,EAAA,CAAA,i1LAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED/JI,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAGP,eAAe,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,wBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEf,kBAAkB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,EAAA,QAAA,EAAA,WAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,EAAA,eAAA,EAAA,YAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,kBAAkB,mOAClB,mBAAmB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,wBAAwB,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,2BAA2B,EAAA,QAAA,EAAA,8IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAR3B,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACT,YAAY,0CAEZ,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FASP,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBApBvC,SAAS;+BACE,uBAAuB,EAAA,eAAA,EAGhB,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B;wBACP,OAAO;wBACP,SAAS;wBACT,YAAY;wBACZ,eAAe;wBACf,gBAAgB;wBAChB,kBAAkB;wBAClB,kBAAkB;wBAClB,mBAAmB;wBACnB,wBAAwB;wBACxB,2BAA2B;qBAC5B,EAAA,SAAA,EACU,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAA,2BAA6B,EAAE,CAAC,EAAA,QAAA,EAAA,soSAAA,EAAA,MAAA,EAAA,CAAA,i1LAAA,CAAA,EAAA;6rCAuBnB,iBAAiB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,CAAA,EAAA,sBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,CAAA,EAAA,wBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,0BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,4BAAA,CAAA,EAAA,CAAA,EAAA,6BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,+BAAA,CAAA,EAAA,CAAA,EAAA,+BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,iCAAA,CAAA,EAAA,CAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,CAAA,EAAA,yBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,2BAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA;sBAsZ5E,WAAW;uBAAC,yBAAyB;;;AEpalC,MAAO,6BAA8B,SAAQ,WAAW,CAAA;AAnB9D,IAAA,WAAA,GAAA;;AAoBU,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,oBAAoB,CAAC;AACxC,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC3C,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC;;AAGrD,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AACvB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,IAAI,qDAAC;AACvB,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,KAAK,sDAAC;AACzB,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAC,CAAC,0DAAC;QACzB,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAC1B,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,+CAAc;AACnC,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAA2B,EAAE,wDAAC;AAClD,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAkB,UAAU,0DAAC;QACnD,IAAA,CAAA,eAAe,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAiC;;QAG/C,IAAA,CAAA,YAAY,GAAG,CAAC;QAChB,IAAA,CAAA,gCAAgC,GAAG,CAAC;AAErC,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAgB,IAAI,2DAAC;;QAGrD,IAAA,CAAA,mBAAmB,GAAG,MAAM,EAA6B;QACzD,IAAA,CAAA,sBAAsB,GAAG,MAAM,EAA6B;QAC5D,IAAA,CAAA,wBAAwB,GAAG,MAAM,EAA6B;QAC9D,IAAA,CAAA,0BAA0B,GAAG,MAAM,EAAoC;QACvE,IAAA,CAAA,6BAA6B,GAAG,MAAM,EAAoC;QAC1E,IAAA,CAAA,+BAA+B,GAAG,MAAM,EAAoC;QAC5E,IAAA,CAAA,qBAAqB,GAAG,MAAM,EAAoC;QAClE,IAAA,CAAA,yBAAyB,GAAG,MAAM,EAA4B;;AAG7C,QAAA,IAAA,CAAA,cAAc,GAAG;AAChC,YAAA,IAAI,EAAE;gBACJ,KAAK,EAAE,IAAI,CAAC,mBAAmB;gBAC/B,QAAQ,EAAE,IAAI,CAAC,sBAAsB;gBACrC,WAAW,EAAE,IAAI,CAAC,wBAAwB;AAC3C,aAAA;AACD,YAAA,WAAW,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,0BAA0B;gBACtC,QAAQ,EAAE,IAAI,CAAC,6BAA6B;gBAC5C,WAAW,EAAE,IAAI,CAAC,+BAA+B;AAClD,aAAA;SACF;;;AAqDO,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,MAAK;AACrC,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE;AACrB,YAAA,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;AACtC,QAAA,CAAC,0DAAC;;AAGQ,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;YAClC,MAAM,QAAQ,GAAiB,EAAE;YAEjC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;AAChC,YAAA,MAAM,gBAAgB,GAAG,WAAW,CAAC,SAAS;AAC9C,YAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,cAAc,EAAE;YACjD,MAAM,qBAAqB,GAAG,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,mBAAmB,CAAC;;YAG3F,MAAM,cAAc,GAAG,CAAC,gBAAgB,GAAG,qBAAqB,GAAG,CAAC,IAAI,CAAC;YACzE,IAAI,eAAe,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,cAAc,CAAC;AAE7D,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAC1B,gBAAA,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC;gBAC9B,eAAe,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;YACjD;AACA,YAAA,OAAO,QAAQ;AACjB,QAAA,CAAC,qDAAC;;AAGM,QAAA,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AACvC,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE;AACxC,YAAA,IAAI,CAAC,UAAU;gBAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE;YAEpD,MAAM,eAAe,GAAG,UAAU;YAClC,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC;AAEhD,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;AACvF,YAAA,MAAM,uBAAuB,GAAG,eAAe,CAAC,SAAS;AAEzD,YAAA,MAAM,WAAW,GAAG,CAAC,uBAAuB,GAAG,eAAe,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY;YACvG,MAAM,cAAc,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,WAAW,CAAC;;;;AAK/D,YAAA,MAAM,WAAW,GAAG,cAAc,CAAC,UAAU;AAC7C,YAAA,MAAM,iBAAiB,GAAG,WAAW,GAAG,WAAW;AACnD,YAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,YAAY,CAAC;AAC3E,YAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,CAAC;AACvE,YAAA,MAAM,mBAAmB,GAAG,iBAAiB,GAAG,IAAI,CAAC,YAAY;YAEjE,MAAM,IAAI,GAOJ,EAAE;AACR,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrD,IAAI,UAAU,GAAG,cAAc;AAE/B,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,mBAAmB,EAAE,CAAC,EAAE,EAAE;gBAC5C,MAAM,SAAS,GACb,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAE7G,IAAI,YAAY,GAAkB,IAAI;gBACtC,IAAI,eAAe,GAAkB,IAAI;gBACzC,IAAI,SAAS,EAAE;oBACb,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBAChG,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC5G,oBAAA,MAAM,OAAO,GAAG,aAAa,IAAI,eAAe;oBAChD,IAAI,OAAO,EAAE;AACX,wBAAA,YAAY,GAAG,OAAO,CAAC,KAAK;AAC5B,wBAAA,eAAe,GAAG,OAAO,CAAC,QAAQ;oBACpC;gBACF;gBAEA,IAAI,CAAC,IAAI,CAAC;AACR,oBAAA,IAAI,EAAE,UAAU;AAChB,oBAAA,cAAc,EAAE,UAAU,CAAC,WAAW,KAAK,UAAU,CAAC,WAAW;oBACjE,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC;oBACvC,SAAS;oBACT,YAAY;oBACZ,eAAe;AAChB,iBAAA,CAAC;gBACF,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;YACvC;YACA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,iBAAiB,EAAE;AACvD,QAAA,CAAC,4DAAC;;AAGM,QAAA,IAAA,CAAA,wBAAwB,GAAG,QAAQ,CAAC,MAAK;YAC/C,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;AACzC,YAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,GAAG,EAAoC;YAEzE,MAAM,aAAa,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;AAClC,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI;AAC9C,YAAA,MAAM,oBAAoB,GAAG,IAAI,CAAC,YAAY,EAAE;AAEhD,YAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,oBAAoB,EAAE,aAAa,EAAE,WAAW,CAAC;AACvG,QAAA,CAAC,oEAAC;;AAGQ,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAA4B,MAAK;YAClE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACzD,YAAA,MAAM,uBAAuB,GAAG,IAAI,CAAC,YAAY,EAAE;AAEnD,YAAA,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE;gBAChC,OAAO,EAAE,CAAC;YACZ;YACA,IAAI,CAAC,uBAAuB,IAAI,uBAAuB,CAAC,MAAM,KAAK,CAAC,EAAE;;gBAEpE,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,OAAO,MAAM;AACvC,oBAAA,GAAG,OAAO;AACV,oBAAA,YAAY,EAAE,EAAE;AAChB,oBAAA,mBAAmB,EAAE,EAAE;AACvB,oBAAA,kBAAkB,EAAE,EAAE;AACtB,oBAAA,aAAa,EAAE,CAAC;AACjB,iBAAA,CAAC,CAAC;YACL;AAEA,YAAA,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,OAAO,KAAI;gBACrC,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;gBACnD,MAAM,kBAAkB,GAAoC,EAAE;AAE9D,gBAAA,KAAK,MAAM,IAAI,IAAI,uBAAuB,EAAE;AAC1C,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,gCAAgC,CACpE,IAAI,EACJ,eAAe,EACf,CAAC;AACD,oBAAA,EAAE;AACF,oBAAA,IAAI,CACL;oBACD,IAAI,OAAO,EAAE;AACX,wBAAA,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;oBAClC;gBACF;AAEA,gBAAA,MAAM,cAAc,GAAG,OAAO,CAC5B,kBAAkB,EAClB;AACE,oBAAA,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;oBACzB,CAAC,CAAC,KAAK,CAAC,CAAC,iBAAiB,CAAC,OAAO,EAAE;AACpC,oBAAA,CAAC,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,iBAAiB,CAAC,OAAO,EAAE;AAClE,oBAAA,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE;iBACpC,EACD,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAC9B;AAED,gBAAA,MAAM,mBAAmB,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,gCAAgC,CAAC;gBAC1F,MAAM,kBAAkB,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC;AACtF,gBAAA,MAAM,aAAa,GAAG,kBAAkB,CAAC,MAAM;gBAE/C,OAAO;AACL,oBAAA,GAAG,OAAO;AACV,oBAAA,YAAY,EAAE,cAAc;oBAC5B,mBAAmB;oBACnB,kBAAkB;oBAClB,aAAa;iBACd;AACH,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,0DAAC;;AAGQ,QAAA,IAAA,CAAA,qBAAqB,GAAG,QAAQ,CAAC,MAAK;YAC9C,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE;AAC/C,YAAA,IAAI,CAAC,WAAW,IAAI,WAAW,IAAI,CAAC,EAAE;gBACpC,OAAO,CAAA,yBAAA,CAA2B,CAAC;YACrC;AACA,YAAA,OAAO,CAAA,OAAA,EAAU,WAAW,CAAA,iBAAA,CAAmB,CAAC;AAClD,QAAA,CAAC,iEAAC;AAaH,IAAA;IAzOW,sBAAsB,CAAC,UAAsB,EAAE,4BAAoD,EAAA;QAC3G,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,4BAA4B,CAAC;AACtG,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,GAAG,mBAAmB;YACtB,OAAO,EAAE,mBAAmB,CAAC,OAAO;YACpC,SAAS,EAAE,mBAAmB,CAAC,SAAS;SACzC;QACD,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAC/B,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EAChF,IAAI,CAAC,cAAc,EACnB,aAAa,CACd;IACH;IACU,eAAe,CAAC,UAAsB,EAAE,IAAgB,EAAA;AAChE,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QACjF,IAAI,QAAQ,EAAE;YACZ,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAC/B,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EACnE,IAAI,CAAC,cAAc,EACnB,MAAM,CACP;QACH;IACF;IACU,UAAU,CAAC,CAAsB,EAAE,IAAgB,EAAA;AAC3D,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAChF,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAA4B;QAClE,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,WAAW,CAAC;AACrF,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,GAAG,mBAAmB;YACtB,OAAO,EAAE,mBAAmB,CAAC,OAAO;YACpC,SAAS,EAAE,mBAAmB,CAAC,SAAS;SACzC;AACD,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC;AAClC,YAAA,SAAS,EAAE,CAAC;AACZ,YAAA,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,IAAI,CAAC,SAAS;AACtB,YAAA,WAAW,EAAE,cAAc;AAC3B,YAAA,cAAc,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;AAChF,SAAA,CAAC;IACJ;IACU,iBAAiB,CAAC,KAAiB,EAAE,eAAuC,EAAA;QACpF,KAAK,CAAC,eAAe,EAAE;QACvB,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,eAAe,CAAC;AACzF,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;AAC9B,YAAA,WAAW,EAAE,mBAAmB;AAChC,YAAA,WAAW,EAAE,KAAK;YAClB,MAAM,EAAE,IAAI,CAAC,SAAS;AACvB,SAAA,CAAC;IACJ;AA8KU,IAAA,SAAS,CAAC,CAAe,EAAA;AACjC,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC;aAC1B,iBAAiB,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO;AACtC,aAAA,IAAI,CAAC,CAAC,EAAE,KAAwB,EAAE,YAAY,WAAW,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC;QACnG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IACtF;AAEA,IAAA,IACc,UAAU,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE;IACxB;+GAtRW,6BAA6B,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA7B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,6BAAA,EAAA,+BAAA,EAAA,+BAAA,EAAA,iCAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,SAAA,EAF7B,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,6BAA6B,EAAE,CAAC,iDChEnF,0gQAwKA,EAAA,MAAA,EAAA,CAAA,knQAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDlHI,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAGP,eAAe,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,wBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEf,kBAAkB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,EAAA,QAAA,EAAA,WAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,EAAA,eAAA,EAAA,YAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,mBAAmB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,wBAAwB,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAPxB,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACT,YAAY,0CAEZ,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FAQP,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAnBzC,SAAS;+BACE,yBAAyB,EAAA,eAAA,EAGlB,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B;wBACP,OAAO;wBACP,SAAS;wBACT,YAAY;wBACZ,eAAe;wBACf,gBAAgB;wBAChB,kBAAkB;wBAClB,kBAAkB;wBAClB,mBAAmB;wBACnB,wBAAwB;qBACzB,EAAA,SAAA,EACU,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAA,6BAA+B,EAAE,CAAC,EAAA,QAAA,EAAA,0gQAAA,EAAA,MAAA,EAAA,CAAA,knQAAA,CAAA,EAAA;;sBAqRhF,WAAW;uBAAC,yBAAyB;;;AE5RlC,MAAO,mCAAoC,SAAQ,WAAW,CAAA;AAnBpE,IAAA,WAAA,GAAA;;AAoBU,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,oBAAoB,CAAC;AACxC,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC3C,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC;QAE5C,IAAA,CAAA,MAAM,GAAG,CAAC;AAEnB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AACvB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,IAAI,qDAAC;AACvB,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,KAAK,sDAAC;AACzB,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAC,CAAC,0DAAC;QACzB,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAC1B,QAAA,IAAA,CAAA,mBAAmB,GAAG,KAAK,CAAC,IAAI,+DAAC;AACjC,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,+CAAc;AACnC,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,QAAQ,qDAAU;AACrC,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAC,QAAQ,uDAAU;AACvC,QAAA,IAAA,CAAA,0BAA0B,GAAG,KAAK,CAAC,IAAI,sEAAC;AACxC,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAwB,EAAE,qDAAC;AAC5C,QAAA,IAAA,CAAA,wBAAwB,GAAG,KAAK,CAAU,IAAI,oEAAC;QAC/C,IAAA,CAAA,gBAAgB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAwB;AAChD,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAA2B,EAAE,wDAAC;QAClD,IAAA,CAAA,eAAe,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAiC;AAEhD,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAgB,IAAI,2DAAC;AAC7C,QAAA,IAAA,CAAA,uBAAuB,GAAG,MAAM,CAAM,IAAI,mEAAC;AAEnD,QAAA,IAAA,CAAA,sBAAsB,GAAG,SAAS,CAA0B,iBAAiB,kEAAC;AAE9E;;AAEG;AACO,QAAA,IAAA,CAAA,sBAAsB,GAAG,QAAQ,CAAC,MAAK;AAC/C,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,EAAE;AAC3C,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAClC,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,0BAA0B,EAAE;AAExD,YAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,6BAA6B,CAAC,eAAe,EAAE,SAAS,EAAE,cAAc,CAAC;AACxG,QAAA,CAAC,kEAAC;AAEF;;AAEG;AACO,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACpC,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAClC,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,0BAA0B,EAAE;YAExD,OAAO,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,SAAS,EAAE,cAAc,CAAC;AAC3E,QAAA,CAAC,uDAAC;AAEF;;;AAGG;AACK,QAAA,IAAA,CAAA,0BAA0B,GAAG,QAAQ,CAAkC,MAAK;AAClF,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE;AAC5B,YAAA,MAAM,uBAAuB,GAAG,IAAI,CAAC,YAAY,EAAE;AACnD,YAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,EAAE;AAC/C,YAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,EAAE;AAE3C,YAAA,IAAI,CAAC,QAAQ,IAAI,CAAC,uBAAuB,IAAI,uBAAuB,CAAC,MAAM,KAAK,CAAC,EAAE;AACjF,gBAAA,OAAO,EAAE;YACX;YAEA,MAAM,iBAAiB,GAAoC,EAAE;AAC7D,YAAA,KAAK,MAAM,IAAI,IAAI,uBAAuB,EAAE;AAC1C,gBAAA,IAAI,IAAI,CAAC,MAAM,EAAE;;oBAEf,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;oBACxC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;;oBAGpC,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;oBAC7F,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;oBAEzF,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE;AAClF,wBAAA,MAAM,aAAa,GAAkC;AACnD,4BAAA,GAAG,IAAI;4BACP,SAAS,EAAE,QAAQ,CAAC,IAAI;4BACxB,OAAO,EAAE,MAAM,CAAC,IAAI;AACpB,4BAAA,MAAM,EAAE,IAAI;4BACZ,iBAAiB,EAAE,IAAI,CAAC,SAAS;4BACjC,eAAe,EAAE,IAAI,CAAC,OAAO;4BAC7B,6BAA6B,EAAE,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC;4BACrE,uBAAuB,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC;AAC7D,4BAAA,sBAAsB,EAAE,IAAI;yBAC7B;AACD,wBAAA,iBAAiB,CAAC,IAAI,CAAC,aAAa,CAAC;oBACvC;oBACA;gBACF;AAEA,gBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,gCAAgC,CACpE,IAAI,EACJ,QAAQ,EACR,mBAAmB,EACnB,iBAAiB,EACjB,KAAK,CACN;gBAED,IAAI,OAAO,EAAE;AACX,oBAAA,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC;gBACjC;YACF;AACA,YAAA,OAAO,iBAAiB;AAC1B,QAAA,CAAC,sEAAC;;QAGF,IAAA,CAAA,mBAAmB,GAAG,MAAM,EAA6B;QACzD,IAAA,CAAA,sBAAsB,GAAG,MAAM,EAA6B;QAC5D,IAAA,CAAA,wBAAwB,GAAG,MAAM,EAA6B;QAC9D,IAAA,CAAA,0BAA0B,GAAG,MAAM,EAAoC;QACvE,IAAA,CAAA,6BAA6B,GAAG,MAAM,EAAoC;QAC1E,IAAA,CAAA,+BAA+B,GAAG,MAAM,EAAoC;QAC5E,IAAA,CAAA,qBAAqB,GAAG,MAAM,EAAoC;QAClE,IAAA,CAAA,yBAAyB,GAAG,MAAM,EAA4B;;AAG7C,QAAA,IAAA,CAAA,cAAc,GAAG;AAChC,YAAA,IAAI,EAAE;gBACJ,KAAK,EAAE,IAAI,CAAC,mBAAmB;gBAC/B,QAAQ,EAAE,IAAI,CAAC,sBAAsB;gBACrC,WAAW,EAAE,IAAI,CAAC,wBAAwB;AAC3C,aAAA;AACD,YAAA,WAAW,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,0BAA0B;gBACtC,QAAQ,EAAE,IAAI,CAAC,6BAA6B;gBAC5C,WAAW,EAAE,IAAI,CAAC,+BAA+B;AAClD,aAAA;SACF;AA4DS,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AACnC,YAAA,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACtB,YAAA,IAAI,CAAC,IAAI;AAAE,gBAAA,OAAO,EAAE;AACpB,YAAA,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;AAC5D,YAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC;YACpB,OAAO,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE;gBACxC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;AAC1B,gBAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YAClB;AACA,YAAA,OAAO,KAAK;AACd,QAAA,CAAC,sDAAC;;AAGQ,QAAA,IAAA,CAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAqC;YAC3E,MAAM,YAAY,GAAmC,EAAE;AACvD,YAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,EAAE;AAC/C,YAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,EAAE;YAC3C,MAAM,oBAAoB,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;YAE/D,IACE,OAAO,mBAAmB,KAAK,QAAQ;gBACvC,OAAO,iBAAiB,KAAK,QAAQ;AACrC,gBAAA,oBAAoB,CAAC,MAAM,KAAK,CAAC,EACjC;AACA,gBAAA,OAAO,YAAY;YACrB;AAEA,YAAA,MAAM,kBAAkB,GAAG,OAAO,CAChC,oBAAoB,EACpB,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,EAC1E,CAAC,KAAK,EAAE,MAAM,CAAC,CAChB;YAED,MAAM,WAAW,GAAiB,EAAE;AAEpC,YAAA,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE;gBACxC,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,uBAAuB,CAC/D,OAAO;gBACP,mBAAmB,EACnB,iBAAiB,CAClB;AAED,gBAAA,IAAI,CAAC,WAAW;AAAE,oBAAA,SAAS;;AAG3B,gBAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AACxF,gBAAA,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AAEpF,gBAAA,IAAI,gBAAgB,GAAG,CAAC,CAAC;AACzB,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;;AAE3C,oBAAA,IAAI,gBAAgB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE;wBAC3D,gBAAgB,GAAG,CAAC;wBACpB;oBACF;gBACF;AAEA,gBAAA,IAAI,gBAAgB,KAAK,CAAC,CAAC,EAAE;AAC3B,oBAAA,gBAAgB,GAAG,WAAW,CAAC,MAAM;AACrC,oBAAA,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBACnC;qBAAO;;AAEL,oBAAA,WAAW,CAAC,gBAAgB,CAAC,GAAG,cAAc;gBAChD;AAEA,gBAAA,MAAM,YAAY,GAAG,sDAAsD,CAAC;AAC5E,gBAAA,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI;AACnC,gBAAA,MAAM,WAAW,GAAG,CAAA,KAAA,EAAQ,WAAW,CAAC,KAAK,CAAA,GAAA,EAAM,IAAI,CAAC,MAAM,CAAA,GAAA,CAAK,CAAC;AACpE,gBAAA,MAAM,SAAS,GAAG,CAAA,KAAA,EAAQ,gBAAgB,CAAA,IAAA,EAAO,YAAY,CAAA,GAAA,EAAM,IAAI,CAAC,MAAM,CAAA,IAAA,CAAM,CAAC;gBAErF,YAAY,CAAC,IAAI,CAAC;oBAChB,WAAW,EAAE,OAAO;oBACpB,UAAU;oBACV,WAAW;oBACX,SAAS;oBACT,YAAY;AACb,iBAAA,CAAC;YACJ;AAEA,YAAA,OAAO,YAAY;AACrB,QAAA,CAAC,8DAAC;AAoRH,IAAA;IA/ZW,sBAAsB,CAAC,UAAsB,EAAE,eAAuC,EAAA;QAC9F,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,eAAe,CAAC;AACzF,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,GAAG,mBAAmB;YACtB,OAAO,EAAE,mBAAmB,CAAC,OAAO;YACpC,SAAS,EAAE,mBAAmB,CAAC,SAAS;SACzC;QACD,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAC/B,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EAChF,IAAI,CAAC,cAAc,EACnB,aAAa,CACd;IACH;IACU,eAAe,CAAC,UAAsB,EAAE,SAAqB,EAAA;AACrE,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,SAAS,EAAE,cAAc,CAAC;AAC7E,QAAA,IAAI,QAAQ;YACV,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAC/B,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EACnE,IAAI,CAAC,cAAc,EACnB,MAAM,CACP;IACL;AACU,IAAA,UAAU,CAAC,CAAsB,EAAE,SAAqB,EAAE,UAAgB,EAAA;AAClF,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,SAAS,EAAE,cAAc,CAAC;QAC7E,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAA4B;QAClE,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,WAAW,CAAC;AACrF,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,GAAG,mBAAmB;YACtB,OAAO,EAAE,mBAAmB,CAAC,OAAO;YACpC,SAAS,EAAE,mBAAmB,CAAC,SAAS;SACzC;;AAGD,QAAA,MAAM,gBAAgB,GAAG,UAAU,KAAK,YAAY,GAAG,SAAS,GAAG,UAAU;;AAG7E,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE;AAC9C,QAAA,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;AACvD,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,uBAAuB,EAAE;QAC1D,MAAM,cAAc,GAAG,eAAe,KAAK,UAAU,IAAI,mBAAmB,KAAK,UAAU;AAE3F,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC;AAClC,YAAA,SAAS,EAAE,CAAC;YACZ,IAAI,EAAE,EAAE,GAAG,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE;YACnD,MAAM,EAAE,IAAI,CAAC,SAAS;AACtB,YAAA,WAAW,EAAE,cAAc;YAC3B,cAAc;AACf,SAAA,CAAC;IACJ;IACU,iBAAiB,CAAC,KAAiB,EAAE,eAAuC,EAAA;QACpF,KAAK,CAAC,eAAe,EAAE;QACvB,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,eAAe,CAAC;AACzF,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;AAC9B,YAAA,WAAW,EAAE,mBAAmB;AAChC,YAAA,WAAW,EAAE,KAAK;YAClB,MAAM,EAAE,IAAI,CAAC,SAAS;AACvB,SAAA,CAAC;IACJ;AAoFA;;AAEG;AACO,IAAA,0BAA0B,CAAC,UAAe,EAAA;AAClD,QAAA,MAAM,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,EAAE;;AAE5D,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,IAAI,sBAAsB,CAAC,OAAO,EAAE,EAAE;YAClE,IAAI,GAAG,KAAK,YAAY,IAAI,UAAU,KAAK,YAAY,EAAE;AACvD,gBAAA,OAAO,YAAY;YACrB;YACA,IAAI,GAAG,KAAK,YAAY,IAAI,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE;AACpD,gBAAA,OAAO,YAAY;YACrB;QACF;AACA,QAAA,OAAO,EAAE;IACX;AAEA;;AAEG;AACO,IAAA,gBAAgB,CAAC,UAAe,EAAA;AACxC,QAAA,IAAI,UAAU,KAAK,YAAY,EAAE;AAC/B,YAAA,OAAO,YAAY;QACrB;AACA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;QAClC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QACjE,OAAO,QAAQ,EAAE,KAAK,IAAI,MAAM,CAAC,UAAU,CAAC;IAC9C;AAEU,IAAA,kBAAkB,CAAC,UAAe,EAAA;AAC1C,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;QAClC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;AACjE,QAAA,OAAO,QAAQ,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE;IAClE;IAEU,sBAAsB,GAAA;AAC9B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;AACvC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE;AACrC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;;AAGjC,QAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AACjD,YAAA,OAAO,IAAI;QACb;;AAGA,QAAA,IAAI,GAAG,CAAC,IAAI,GAAG,SAAS,IAAI,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE;AAC/C,YAAA,OAAO,IAAI;QACb;;QAGA,MAAM,cAAc,GAAG,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM;AACjD,QAAA,MAAM,YAAY,GAAG,SAAS,GAAG,EAAE;AACnC,QAAA,MAAM,UAAU,GAAG,OAAO,GAAG,EAAE;AAC/B,QAAA,MAAM,YAAY,GAAG,UAAU,GAAG,YAAY;AAE9C,QAAA,MAAM,iBAAiB,GAAG,cAAc,GAAG,YAAY;AACvD,QAAA,OAAO,CAAC,iBAAiB,GAAG,YAAY,IAAI,GAAG;IACjD;IAEU,gCAAgC,GAAA;AACxC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,EAAE;AAC9C,QAAA,IAAI,QAAQ,KAAK,IAAI,EAAE;AACrB,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7D,YAAA,OAAO,QAAQ,QAAQ,CAAA,KAAA,EAAQ,GAAG,GAAG,QAAQ,iEAAiE;QAChH;aAAO;YACL,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAG;QACvB;IACF;IAEA,eAAe,GAAA;;QAEb,IAAI,CAAC,sBAAsB,EAAE;IAC/B;IAEQ,sBAAsB,GAAA;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE;AACpC,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,EAAE;AACrD,QAAA,IAAI,eAAe,KAAK,IAAI,EAAE;AAC5B,YAAA,OAAO,SAAS;QAClB;QAEA,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,EAAE,EAAE,aAAa;QACpE,IAAI,CAAC,eAAe,EAAE;AACpB,YAAA,OAAO,SAAS;QAClB;;QAGA,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,KAAI;AACpD,YAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;AAC3B,gBAAA,IAAI,KAAK,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;;oBAE/D,eAAe,CAAC,cAAc,CAAC;AAC7B,wBAAA,QAAQ,EAAE,QAAQ;AAClB,wBAAA,KAAK,EAAE,SAAS;AAChB,wBAAA,MAAM,EAAE,QAAQ;AACjB,qBAAA,CAAC;;oBAEF,cAAc,CAAC,UAAU,EAAE;oBAC3B;gBACF;YACF;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,cAAc,CAAC,OAAO,CAAC,eAAe,CAAC;;AAGvC,QAAA,OAAO,MAAM,cAAc,CAAC,UAAU,EAAE;IAC1C;AAEA;;AAEG;AACO,IAAA,gCAAgC,CAAC,UAAe,EAAA;QACxD,MAAM,oBAAoB,GAAG,IAAI,CAAC,0BAA0B,CAAC,UAAU,CAAC;AACxE,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE;AAC5B,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,EAAE;AAC/C,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,EAAE;QAE3C,IAAI,CAAC,QAAQ,IAAI,oBAAoB,CAAC,MAAM,KAAK,CAAC,EAAE;AAClD,YAAA,OAAO,EAAE;QACX;;QAGA,MAAM,gBAAgB,GAAoC,EAAE;AAC5D,QAAA,KAAK,MAAM,IAAI,IAAI,oBAAoB,EAAE;AACvC,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,gCAAgC,CACpE,IAAI,EACJ,QAAQ,EACR,mBAAmB,EACnB,iBAAiB,CAClB;YACD,IAAI,OAAO,EAAE;AACX,gBAAA,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;YAChC;QACF;QAEA,MAAM,YAAY,GAAmC,EAAE;AACvD,QAAA,MAAM,kBAAkB,GAAG,OAAO,CAChC,gBAAgB,EAChB,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,EAC1E,CAAC,KAAK,EAAE,MAAM,CAAC,CAChB;QAED,MAAM,WAAW,GAAiB,EAAE;AAEpC,QAAA,KAAK,MAAM,OAAO,IAAI,kBAAkB,EAAE;AACxC,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,uBAAuB,CAC/D,OAAO,EACP,mBAAmB,EACnB,iBAAiB,CAClB;AAED,YAAA,IAAI,CAAC,WAAW;gBAAE;AAElB,YAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AACxF,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AAEpF,YAAA,IAAI,gBAAgB,GAAG,CAAC,CAAC;AACzB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC3C,gBAAA,IAAI,gBAAgB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE;oBAC3D,gBAAgB,GAAG,CAAC;oBACpB;gBACF;YACF;AAEA,YAAA,IAAI,gBAAgB,KAAK,CAAC,CAAC,EAAE;AAC3B,gBAAA,gBAAgB,GAAG,WAAW,CAAC,MAAM;AACrC,gBAAA,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC;YAClC;iBAAO;AACL,gBAAA,WAAW,CAAC,gBAAgB,CAAC,GAAG,cAAc;YAChD;YAEA,MAAM,YAAY,GAAG,sDAAsD;AAC3E,YAAA,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI;YACnC,MAAM,WAAW,GAAG,CAAA,KAAA,EAAQ,WAAW,CAAC,KAAK,CAAA,GAAA,EAAM,IAAI,CAAC,MAAM,CAAA,GAAA,CAAK;YACnE,MAAM,SAAS,GAAG,CAAA,KAAA,EAAQ,gBAAgB,CAAA,IAAA,EAAO,YAAY,CAAA,GAAA,EAAM,IAAI,CAAC,MAAM,CAAA,IAAA,CAAM;YAEpF,YAAY,CAAC,IAAI,CAAC;AAChB,gBAAA,WAAW,EAAE,OAAO;gBACpB,UAAU;gBACV,WAAW;gBACX,SAAS;gBACT,YAAY;AACb,aAAA,CAAC;QACJ;AAEA,QAAA,OAAO,YAAY;IACrB;AAEA;;AAEG;AACO,IAAA,oBAAoB,CAAC,UAAe,EAAA;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,gCAAgC,CAAC,UAAU,CAAC;AAEjE,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;;AAExB,YAAA,OAAO,mDAAmD;QAC5D;;AAGA,QAAA,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,WAAW,CAAC;QAChE,MAAM,kBAAkB,GAAG,IAAI,CAAC,2BAA2B,CAAC,YAAY,CAAC;;AAGzE,QAAA,OAAO,4DAA4D,kBAAkB,CAAA,GAAA,EAAM,IAAI,CAAC,MAAM,CAAA,KAAA,EAAQ,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,kBAAkB,CAAC,GAAG;IAClJ;AAEA;;AAEG;AACK,IAAA,2BAA2B,CAAC,YAA6C,EAAA;AAC/E,QAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC;AACvC,QAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC;;AAGvC,QAAA,MAAM,kBAAkB,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACzD,YAAA,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE;YAC/D,IAAI,SAAS,KAAK,CAAC;AAAE,gBAAA,OAAO,SAAS;AACrC,YAAA,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;AACnD,QAAA,CAAC,CAAC;;QAGF,MAAM,WAAW,GAAW,EAAE;QAC9B,IAAI,OAAO,GAAG,CAAC;AAEf,QAAA,KAAK,MAAM,WAAW,IAAI,kBAAkB,EAAE;AAC5C,YAAA,IAAI,gBAAgB,GAAG,CAAC,CAAC;;AAGzB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC3C,IAAI,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE;oBAC3C,gBAAgB,GAAG,CAAC;oBACpB;gBACF;YACF;;AAGA,YAAA,IAAI,gBAAgB,KAAK,CAAC,CAAC,EAAE;AAC3B,gBAAA,gBAAgB,GAAG,WAAW,CAAC,MAAM;AACrC,gBAAA,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;YACvC;iBAAO;;AAEL,gBAAA,WAAW,CAAC,gBAAgB,CAAC,GAAG,WAAW,CAAC,OAAO;YACrD;;YAGA,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC;QACjD;QAEA,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC9B;AAEU,IAAA,SAAS,CAAC,CAAe,EAAA;AACjC,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC;aAC1B,iBAAiB,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO;AACtC,aAAA,IAAI,CAAC,CAAC,EAAE,KAAwB,EAAE,YAAY,WAAW,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC;QACnG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;QACpF,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;IAClG;AAEA,IAAA,IACc,UAAU,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE;IACxB;+GAhiBW,mCAAmC,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAnC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,mCAAmC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gCAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,0BAAA,EAAA,EAAA,iBAAA,EAAA,4BAAA,EAAA,UAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,wBAAA,EAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,UAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,6BAAA,EAAA,+BAAA,EAAA,+BAAA,EAAA,iCAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,SAAA,EAFnC,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,mCAAmC,EAAE,CAAC,4LCvDzF,48SAkNA,EAAA,MAAA,EAAA,CAAA,iiTAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDrKI,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAGhB,eAAe,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,wBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACf,kBAAkB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,mBAAmB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,wBAAwB,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,2BAA2B,EAAA,QAAA,EAAA,8IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAN3B,SAAS,yCACT,YAAY,EAAA,IAAA,EAAA,QAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FASH,mCAAmC,EAAA,UAAA,EAAA,CAAA;kBAnB/C,SAAS;+BACE,gCAAgC,EAAA,eAAA,EAGzB,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B;wBACP,OAAO;wBACP,gBAAgB;wBAChB,SAAS;wBACT,YAAY;wBACZ,eAAe;wBACf,kBAAkB;wBAClB,mBAAmB;wBACnB,wBAAwB;wBACxB,2BAA2B;qBAC5B,EAAA,SAAA,EACU,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAA,mCAAqC,EAAE,CAAC,EAAA,QAAA,EAAA,48SAAA,EAAA,MAAA,EAAA,CAAA,iiTAAA,CAAA,EAAA;yoDA6B3B,iBAAiB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,CAAA,EAAA,sBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,CAAA,EAAA,wBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,0BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,4BAAA,CAAA,EAAA,CAAA,EAAA,6BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,+BAAA,CAAA,EAAA,CAAA,EAAA,+BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,iCAAA,CAAA,EAAA,CAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,CAAA,EAAA,yBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,2BAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA;sBAkgB5E,WAAW;uBAAC,yBAAyB;;;AE9gBlC,MAAO,qCAAsC,SAAQ,WAAW,CAAA;AArBtE,IAAA,WAAA,GAAA;;AAsBU,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,oBAAoB,CAAC;AACxC,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC3C,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC;QAEpC,IAAA,CAAA,gCAAgC,GAAG,CAAC;AAErD,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AACvB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,IAAI,qDAAC;AACvB,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,KAAK,sDAAC;AACzB,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAC,CAAC,0DAAC;QACzB,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAC1B,QAAA,IAAA,CAAA,mBAAmB,GAAG,KAAK,CAAC,IAAI,+DAAC;AACjC,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,+CAAc;AACnC,QAAA,IAAA,CAAA,0BAA0B,GAAG,KAAK,CAAC,IAAI,sEAAC;AACxC,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAwB,EAAE,qDAAC;AAC5C,QAAA,IAAA,CAAA,wBAAwB,GAAG,KAAK,CAAU,IAAI,oEAAC;QAC/C,IAAA,CAAA,gBAAgB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAwB;AAChD,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAA2B,EAAE,wDAAC;QAClD,IAAA,CAAA,eAAe,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAiC;AAEhD,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAgB,IAAI,2DAAC;AAC7C,QAAA,IAAA,CAAA,uBAAuB,GAAG,MAAM,CAAM,IAAI,mEAAC;AAEnD,QAAA,IAAA,CAAA,sBAAsB,GAAG,SAAS,CAA0B,iBAAiB,kEAAC;AAEpE,QAAA,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAA6B,MAAK;AACrE,YAAA,MAAM,uBAAuB,GAAG,IAAI,CAAC,YAAY,EAAE;YACnD,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;YACnD,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,UAAU;AAC5D,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAClC,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,0BAA0B,EAAE;YAExD,IAAI,CAAC,uBAAuB,EAAE;AAC5B,gBAAA,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAI;oBAClD,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;oBAE5C,OAAO;AACL,wBAAA,IAAI,EAAE,OAAO;AACb,wBAAA,mBAAmB,EAAE,EAAE;AACvB,wBAAA,kBAAkB,EAAE,EAAE;AACtB,wBAAA,SAAS,EAAE,CAAC;AACZ,wBAAA,sBAAsB,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,GAAG,SAAS;qBACrE;AACH,gBAAA,CAAC,CAAC;YACJ;YAEA,MAAM,MAAM,GAA+B,EAAE;AAE7C,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;AACpC,gBAAA,MAAM,cAAc,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACnE,MAAM,kBAAkB,GAAoC,EAAE;AAE9D,gBAAA,KAAK,MAAM,IAAI,IAAI,uBAAuB,EAAE;;;;AAI1C,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,gCAAgC,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC;oBACzG,IAAI,OAAO,EAAE;AACX,wBAAA,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;oBAClC;gBACF;;AAGA,gBAAA,MAAM,cAAc,GAAG,OAAO,CAC5B,kBAAkB,EAClB;AACE,oBAAA,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;oBACzB,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE;AAC5B,oBAAA,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE;oBAClD,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE;iBACpC,EACD,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAC9B;AAED,gBAAA,MAAM,mBAAmB,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,gCAAgC,CAAC;gBAC1F,MAAM,kBAAkB,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC;;AAGtF,gBAAA,IAAI,sBAKS;AAEb,gBAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AACxB,oBAAA,sBAAsB,GAAG,IAAI,GAAG,EAAE;AAClC,oBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,SAAS,EAAE,cAAc,CAAC;AAEtF,oBAAA,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;;wBAEpC,MAAM,gBAAgB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,OAAO,KAAI;AACzD,4BAAA,IAAI,UAAU,KAAK,YAAY,EAAE;gCAC/B,OAAO,OAAO,CAAC,UAAU,KAAK,SAAS,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI;4BACxE;4BACA,OAAO,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC;AAChD,wBAAA,CAAC,CAAC;AAEF,wBAAA,MAAM,eAAe,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,gCAAgC,CAAC;wBACxF,MAAM,cAAc,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC;AAEpF,wBAAA,sBAAsB,CAAC,GAAG,CAAC,UAAU,EAAE;AACrC,4BAAA,OAAO,EAAE,eAAe;AACxB,4BAAA,MAAM,EAAE,cAAc;4BACtB,SAAS,EAAE,cAAc,CAAC,MAAM;AACjC,yBAAA,CAAC;oBACJ;gBACF;gBAEA,MAAM,CAAC,IAAI,CAAC;AACV,oBAAA,IAAI,EAAE,cAAc;AACpB,oBAAA,mBAAmB,EAAE,mBAAmB;AACxC,oBAAA,kBAAkB,EAAE,kBAAkB;oBACtC,SAAS,EAAE,kBAAkB,CAAC,MAAM;AACpC,oBAAA,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;oBACvC,sBAAsB;AACvB,iBAAA,CAAC;YACJ;AACA,YAAA,OAAO,MAAM;AACf,QAAA,CAAC,4DAAC;;QAGF,IAAA,CAAA,mBAAmB,GAAG,MAAM,EAA6B;QACzD,IAAA,CAAA,sBAAsB,GAAG,MAAM,EAA6B;QAC5D,IAAA,CAAA,wBAAwB,GAAG,MAAM,EAA6B;QAC9D,IAAA,CAAA,0BAA0B,GAAG,MAAM,EAAoC;QACvE,IAAA,CAAA,6BAA6B,GAAG,MAAM,EAAoC;QAC1E,IAAA,CAAA,+BAA+B,GAAG,MAAM,EAAoC;QAC5E,IAAA,CAAA,qBAAqB,GAAG,MAAM,EAAoC;QAClE,IAAA,CAAA,yBAAyB,GAAG,MAAM,EAA4B;;AAG7C,QAAA,IAAA,CAAA,cAAc,GAAG;AAChC,YAAA,IAAI,EAAE;gBACJ,KAAK,EAAE,IAAI,CAAC,mBAAmB;gBAC/B,QAAQ,EAAE,IAAI,CAAC,sBAAsB;gBACrC,WAAW,EAAE,IAAI,CAAC,wBAAwB;AAC3C,aAAA;AACD,YAAA,WAAW,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,0BAA0B;gBACtC,QAAQ,EAAE,IAAI,CAAC,6BAA6B;gBAC5C,WAAW,EAAE,IAAI,CAAC,+BAA+B;AAClD,aAAA;SACF;AAoFD;;AAEG;AACO,QAAA,IAAA,CAAA,sBAAsB,GAAG,QAAQ,CAAC,MAAK;AAC/C,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,EAAE;AAC3C,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAClC,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,0BAA0B,EAAE;AAExD,YAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,6BAA6B,CAAC,eAAe,EAAE,SAAS,EAAE,cAAc,CAAC;AACxG,QAAA,CAAC,kEAAC;AAEF;;AAEG;AACO,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACpC,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAClC,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,0BAA0B,EAAE;YAExD,OAAO,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,SAAS,EAAE,cAAc,CAAC;AAC3E,QAAA,CAAC,uDAAC;AAuLH,IAAA;IA7RW,sBAAsB,CAAC,UAAsB,EAAE,eAAuC,EAAA;QAC9F,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,eAAe,CAAC;AACzF,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,GAAG,mBAAmB;YACtB,OAAO,EAAE,mBAAmB,CAAC,OAAO;YACpC,SAAS,EAAE,mBAAmB,CAAC,SAAS;SACzC;QACD,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAC/B,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EAChF,IAAI,CAAC,cAAc,EACnB,aAAa,CACd;IACH;IACU,eAAe,CAAC,UAAsB,EAAE,IAAgB,EAAA;;AAEhE,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;AACzF,QAAA,IAAI,QAAQ;YACV,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAC/B,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EACnE,IAAI,CAAC,cAAc,EACnB,MAAM,CACP;IACL;AACU,IAAA,UAAU,CAAC,CAAsB,EAAE,IAAgB,EAAE,UAAgB,EAAA;;AAE7E,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;QACzF,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAA4B;QAClE,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,WAAW,CAAC;AACrF,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,GAAG,mBAAmB;YACtB,OAAO,EAAE,mBAAmB,CAAC,OAAO;YACpC,SAAS,EAAE,mBAAmB,CAAC,SAAS;SACzC;;AAGD,QAAA,MAAM,gBAAgB,GAAG,UAAU,KAAK,YAAY,GAAG,SAAS,GAAG,UAAU;;AAG7E,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE;AAC9C,QAAA,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;AACvD,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,uBAAuB,EAAE;QAC1D,MAAM,cAAc,GAAG,eAAe,KAAK,UAAU,IAAI,mBAAmB,KAAK,UAAU;AAE3F,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC;AAClC,YAAA,SAAS,EAAE,CAAC;YACZ,IAAI,EAAE,EAAE,GAAG,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE;YACnD,MAAM,EAAE,IAAI,CAAC,SAAS;AACtB,YAAA,WAAW,EAAE,cAAc;YAC3B,cAAc;AACf,SAAA,CAAC;IACJ;IACU,iBAAiB,CAAC,KAAiB,EAAE,eAAuC,EAAA;QACpF,KAAK,CAAC,eAAe,EAAE;QACvB,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,eAAe,CAAC;AACzF,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;AAC9B,YAAA,WAAW,EAAE,mBAAmB;AAChC,YAAA,WAAW,EAAE,KAAK;YAClB,MAAM,EAAE,IAAI,CAAC,SAAS;AACvB,SAAA,CAAC;IACJ;AAEU,IAAA,OAAO,CAAC,IAAgB,EAAA;AAChC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC;IACjC;AACU,IAAA,SAAS,CAAC,IAAgB,EAAA;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC;QACvD,IAAI,SAAS,EAAE;YACb,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC1F,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACtG,YAAA,MAAM,OAAO,GAAG,aAAa,IAAI,eAAe;YAChD,OAAO;AACL,gBAAA,KAAK,EAAE,SAAS;gBAChB,OAAO;aACR;QACH;AACA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxE,IAAI,SAAS,EAAE;AACb,YAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;QAC7B;AACA,QAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;IAC1B;AAuBA;;AAEG;AACO,IAAA,0BAA0B,CAAC,UAAe,EAAA;AAClD,QAAA,MAAM,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,EAAE;;AAE5D,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,IAAI,sBAAsB,CAAC,OAAO,EAAE,EAAE;YAClE,IAAI,GAAG,KAAK,YAAY,IAAI,UAAU,KAAK,YAAY,EAAE;AACvD,gBAAA,OAAO,YAAY;YACrB;YACA,IAAI,GAAG,KAAK,YAAY,IAAI,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE;AACpD,gBAAA,OAAO,YAAY;YACrB;QACF;AACA,QAAA,OAAO,EAAE;IACX;AAEA;;AAEG;AACO,IAAA,gBAAgB,CAAC,UAAe,EAAA;AACxC,QAAA,IAAI,UAAU,KAAK,YAAY,EAAE;AAC/B,YAAA,OAAO,YAAY;QACrB;AACA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;QAClC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QACjE,OAAO,QAAQ,EAAE,KAAK,IAAI,MAAM,CAAC,UAAU,CAAC;IAC9C;AAEU,IAAA,kBAAkB,CAAC,UAAe,EAAA;AAC1C,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;QAClC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;AACjE,QAAA,OAAO,QAAQ,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE;IAClE;IAEU,sBAAsB,GAAA;AAC9B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;;AAG3C,QAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AACrD,YAAA,OAAO,IAAI;QACb;;QAGA,MAAM,iBAAiB,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;QAClD,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC;AACnD,QAAA,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG;IACxE;IAEA,eAAe,GAAA;;QAEb,IAAI,CAAC,sBAAsB,EAAE;IAC/B;IAEQ,sBAAsB,GAAA;AAC5B,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,EAAE;AACrD,QAAA,IAAI,eAAe,KAAK,IAAI,EAAE;AAC5B,YAAA,OAAO,SAAS;QAClB;QAEA,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,EAAE,EAAE,aAAa;QACpE,IAAI,CAAC,eAAe,EAAE;AACpB,YAAA,OAAO,SAAS;QAClB;;QAGA,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,KAAI;AACpD,YAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;AAC3B,gBAAA,IAAI,KAAK,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;;oBAE/D,eAAe,CAAC,cAAc,CAAC;AAC7B,wBAAA,QAAQ,EAAE,QAAQ;AAClB,wBAAA,KAAK,EAAE,SAAS;AAChB,wBAAA,MAAM,EAAE,QAAQ;AACjB,qBAAA,CAAC;;oBAEF,cAAc,CAAC,UAAU,EAAE;oBAC3B;gBACF;YACF;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,cAAc,CAAC,OAAO,CAAC,eAAe,CAAC;;AAGvC,QAAA,OAAO,MAAM,cAAc,CAAC,UAAU,EAAE;IAC1C;AAEA;;AAEG;IACO,gCAAgC,CACxC,UAAe,EACf,OAAiC,EAAA;AAEjC,QAAA,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE;AACnC,YAAA,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE;QAClD;QACA,OAAO,OAAO,CAAC,sBAAsB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE;IACpG;AAEU,IAAA,SAAS,CAAC,CAAe,EAAA;AACjC,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC;aAC1B,iBAAiB,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO;AACtC,aAAA,IAAI,CAAC,CAAC,EAAE,KAAwB,EAAE,YAAY,WAAW,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC;QACnG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;QACpF,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;IAClG;AAEA;;AAEG;AACO,IAAA,oBAAoB,CAAC,UAAe,EAAA;AAC5C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,EAAE;QACvC,IAAI,eAAe,GAAG,CAAC;QACvB,IAAI,WAAW,GAAG,KAAK;;;AAIvB,QAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;YACzB,MAAM,oBAAoB,GAAG,IAAI,CAAC,gCAAgC,CAAC,UAAU,EAAE,GAAG,CAAC;AACnF,YAAA,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC;;AAGhF,YAAA,IAAI,oBAAoB,CAAC,SAAS,GAAG,CAAC,EAAE;gBACtC,WAAW,GAAG,IAAI;YACpB;QACF;AAEA,QAAA,IAAI,eAAe,KAAK,CAAC,EAAE;;AAEzB,YAAA,OAAO,mDAAmD;QAC5D;;;QAIA,MAAM,iBAAiB,GAAG,kEAAkE;QAC5F,MAAM,SAAS,GAAG,8DAA8D;QAChF,MAAM,cAAc,GAAG,kEAAkE;QAEzF,IAAI,WAAW,EAAE;;AAEf,YAAA,OAAO,CAAA,KAAA,EAAQ,eAAe,CAAA,GAAA,EAAM,iBAAiB,CAAA,GAAA,EAAM,eAAe,GAAG,CAAC,CAAA,GAAA,EAAM,SAAS,CAAA,GAAA,EAAM,cAAc,GAAG;QACtH;aAAO;;YAEL,OAAO,CAAA,KAAA,EAAQ,eAAe,CAAA,GAAA,EAAM,iBAAiB,CAAA,GAAA,EAAM,eAAe,GAAG,CAAC,CAAA,GAAA,EAAM,SAAS,CAAA,CAAA,CAAG;QAClG;IACF;AAEA;;;AAGG;AACO,IAAA,2BAA2B,CAAC,YAA6C,EAAA;AACjF,QAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC;;;QAIvC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC;IACzC;AAEU,IAAA,2BAA2B,CAAC,OAAmB,EAAA;AACvD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;;AAG3C,QAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AACrD,YAAA,OAAO,KAAK;QACd;;QAGA,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC;IACnC;AAEA,IAAA,IACc,UAAU,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE;IACxB;+GA9aW,qCAAqC,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qCAAqC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kCAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,0BAAA,EAAA,EAAA,iBAAA,EAAA,4BAAA,EAAA,UAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,wBAAA,EAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,UAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,6BAAA,EAAA,+BAAA,EAAA,+BAAA,EAAA,iCAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,SAAA,EAFrC,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,qCAAqC,EAAE,CAAC,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,wBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtE3F,ouxBAueA,s2jBD7aI,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAGhB,eAAe,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,wBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEf,kBAAkB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,EAAA,QAAA,EAAA,WAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,EAAA,eAAA,EAAA,YAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,kBAAkB,mOAClB,mBAAmB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,wBAAwB,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,2BAA2B,EAAA,QAAA,EAAA,8IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAR3B,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACT,YAAY,0CAEZ,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FASP,qCAAqC,EAAA,UAAA,EAAA,CAAA;kBArBjD,SAAS;+BACE,kCAAkC,EAAA,eAAA,EAG3B,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B;wBACP,OAAO;wBACP,gBAAgB;wBAChB,SAAS;wBACT,YAAY;wBACZ,eAAe;wBACf,gBAAgB;wBAChB,kBAAkB;wBAClB,kBAAkB;wBAClB,mBAAmB;wBACnB,wBAAwB;wBACxB,2BAA2B;qBAC5B,EAAA,SAAA,EACU,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAA,qCAAuC,EAAE,CAAC,EAAA,QAAA,EAAA,ouxBAAA,EAAA,MAAA,EAAA,CAAA,8yjBAAA,CAAA,EAAA;+7CA2B7B,iBAAiB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,CAAA,EAAA,sBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,CAAA,EAAA,wBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,0BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,4BAAA,CAAA,EAAA,CAAA,EAAA,6BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,+BAAA,CAAA,EAAA,CAAA,EAAA,+BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,iCAAA,CAAA,EAAA,CAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,CAAA,EAAA,yBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,2BAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA;sBAkZ5E,WAAW;uBAAC,yBAAyB;;;AEtclC,MAAO,wCAAyC,SAAQ,WAAW,CAAA;AATzE,IAAA,WAAA,GAAA;;AAUU,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC3C,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAErD,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,CAAC,qDAAC;AACpB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AACvB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,IAAI,qDAAC;AACvB,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,KAAK,sDAAC;AACzB,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAC,CAAC,0DAAC;QACzB,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAC1B,QAAA,IAAA,CAAA,mBAAmB,GAAG,KAAK,CAAC,IAAI,+DAAC;AACjC,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,+CAAc;AACnC,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,QAAQ,qDAAU;AACrC,QAAA,IAAA,CAAA,wBAAwB,GAAG,KAAK,CAAC,IAAI,oEAAC;AACtC,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAC,QAAQ,uDAAU;AACvC,QAAA,IAAA,CAAA,0BAA0B,GAAG,KAAK,CAAC,IAAI,sEAAC;AACxC,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAwB,EAAE,qDAAC;QAC5C,IAAA,CAAA,gBAAgB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAwB;AAChD,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAA2B,EAAE,wDAAC;QAClD,IAAA,CAAA,eAAe,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAiC;AAExD,QAAA,IAAA,CAAA,sBAAsB,GAAG,SAAS,CAA0B,iBAAiB,kEAAC;AAEpE,QAAA,IAAA,CAAA,wBAAwB,GAAG,QAAQ,CAA4B,MAAK;AAC5E,YAAA,MAAM,uBAAuB,GAAG,IAAI,CAAC,YAAY,EAAE;AACnD,YAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,EAAE;AACtC,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE;AAErC,YAAA,IAAI,CAAC,kBAAkB,IAAI,CAAC,uBAAuB,EAAE;AACnD,gBAAA,OAAO,EAAE;YACX;YAEA,MAAM,MAAM,GAA8B,EAAE;AAE5C,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,CAAC,EAAE,EAAE;gBACrC,MAAM,cAAc,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;gBACvD,MAAM,eAAe,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC;gBACrD,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,CAAC;;gBAGjD,MAAM,sBAAsB,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AACrE,oBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AAC9E,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;;oBAG1E,OAAO,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,QAAQ,CAAC,IAAI,CAAC;AAC3G,gBAAA,CAAC,CAAC;gBAEF,MAAM,CAAC,IAAI,CAAC;AACV,oBAAA,IAAI,EAAE,cAAc;AACpB,oBAAA,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;AACvC,oBAAA,8BAA8B,EAAE,sBAAsB;AACvD,iBAAA,CAAC;YACJ;AACA,YAAA,OAAO,MAAM;AACf,QAAA,CAAC,oEAAC;QAEF,IAAA,CAAA,mBAAmB,GAAG,MAAM,EAA6B;QACzD,IAAA,CAAA,sBAAsB,GAAG,MAAM,EAA6B;QAC5D,IAAA,CAAA,wBAAwB,GAAG,MAAM,EAA6B;QAC9D,IAAA,CAAA,0BAA0B,GAAG,MAAM,EAAoC;QACvE,IAAA,CAAA,6BAA6B,GAAG,MAAM,EAAoC;QAC1E,IAAA,CAAA,+BAA+B,GAAG,MAAM,EAAoC;QAC5E,IAAA,CAAA,qBAAqB,GAAG,MAAM,EAAoC;QAClE,IAAA,CAAA,yBAAyB,GAAG,MAAM,EAA4B;AA4B9D;;AAEG;AACO,QAAA,IAAA,CAAA,sBAAsB,GAAG,QAAQ,CAAC,MAAK;AAC/C,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,EAAE;AAC3C,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAClC,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,0BAA0B,EAAE;AAExD,YAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,6BAA6B,CAAC,eAAe,EAAE,SAAS,EAAE,cAAc,CAAC;AACxG,QAAA,CAAC,kEAAC;AAEF;;AAEG;AACO,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACpC,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAClC,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,0BAA0B,EAAE;YAExD,OAAO,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,SAAS,EAAE,cAAc,CAAC;AAC3E,QAAA,CAAC,uDAAC;AAmSH,IAAA;IAhVW,UAAU,CAAC,KAA+B,EAAE,UAAe,EAAA;;AAEnE,QAAA,MAAM,gBAAgB,GAAG,UAAU,KAAK,YAAY,GAAG,SAAS,GAAG,UAAU;;;AAI7E,QAAA,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc;;AAG3C,QAAA,MAAM,YAAY,GAA6B;AAC7C,YAAA,GAAG,KAAK;AACR,YAAA,IAAI,EAAE;gBACJ,GAAG,KAAK,CAAC,IAAI;AACb,gBAAA,UAAU,EAAE,gBAAgB;AAC7B,aAAA;YACD,cAAc;SACf;AAED,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,YAAY,CAAC;IACnD;AAEU,IAAA,OAAO,CAAC,IAAgB,EAAA;AAChC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC;IACjC;AAuBA;;AAEG;AACO,IAAA,0BAA0B,CAAC,UAAe,EAAA;AAClD,QAAA,MAAM,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,EAAE;;AAE5D,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,IAAI,sBAAsB,CAAC,OAAO,EAAE,EAAE;YAClE,IAAI,GAAG,KAAK,YAAY,IAAI,UAAU,KAAK,YAAY,EAAE;AACvD,gBAAA,OAAO,YAAY;YACrB;YACA,IAAI,GAAG,KAAK,YAAY,IAAI,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE;AACpD,gBAAA,OAAO,YAAY;YACrB;QACF;AACA,QAAA,OAAO,EAAE;IACX;AAEA;;AAEG;AACO,IAAA,gBAAgB,CAAC,UAAe,EAAA;AACxC,QAAA,IAAI,UAAU,KAAK,YAAY,EAAE;AAC/B,YAAA,OAAO,YAAY;QACrB;AACA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;QAClC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QACjE,OAAO,QAAQ,EAAE,KAAK,IAAI,MAAM,CAAC,UAAU,CAAC;IAC9C;AAEU,IAAA,kBAAkB,CAAC,UAAe,EAAA;AAC1C,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;QAClC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;AACjE,QAAA,OAAO,QAAQ,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE;IAClE;IAEU,sBAAsB,GAAA;AAC9B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AACpE,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE;AACrC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;;AAGjC,QAAA,IAAI,GAAG,CAAC,IAAI,GAAG,SAAS,IAAI,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE;AAC/C,YAAA,OAAO,IAAI;QACb;;QAGA,MAAM,cAAc,GAAG,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM;AACjD,QAAA,MAAM,YAAY,GAAG,SAAS,GAAG,EAAE;AACnC,QAAA,MAAM,UAAU,GAAG,OAAO,GAAG,EAAE;AAC/B,QAAA,MAAM,YAAY,GAAG,UAAU,GAAG,YAAY;AAE9C,QAAA,MAAM,iBAAiB,GAAG,cAAc,GAAG,YAAY;AACvD,QAAA,OAAO,CAAC,iBAAiB,GAAG,YAAY,IAAI,GAAG;IACjD;AAEU,IAAA,2BAA2B,CAAC,OAAmB,EAAA;AACvD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AACpE,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE;AAClC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;;AAGjE,QAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;AAC7D,YAAA,OAAO,KAAK;QACd;;QAGA,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC;IACnC;IAEA,eAAe,GAAA;;QAEb,IAAI,CAAC,sBAAsB,EAAE;IAC/B;IAEQ,sBAAsB,GAAA;AAC5B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AACpE,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE;AAClC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;;AAGjE,QAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;AAC7D,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,EAAE;AACrD,QAAA,IAAI,eAAe,KAAK,IAAI,EAAE;AAC5B,YAAA,OAAO,SAAS;QAClB;QAEA,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,EAAE,EAAE,aAAa;QACpE,IAAI,CAAC,eAAe,EAAE;AACpB,YAAA,OAAO,SAAS;QAClB;;QAGA,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,KAAI;AACpD,YAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;AAC3B,gBAAA,IAAI,KAAK,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;;oBAE/D,eAAe,CAAC,cAAc,CAAC;AAC7B,wBAAA,QAAQ,EAAE,QAAQ;AAClB,wBAAA,KAAK,EAAE,SAAS;AAChB,wBAAA,MAAM,EAAE,QAAQ;AACjB,qBAAA,CAAC;;oBAEF,cAAc,CAAC,UAAU,EAAE;oBAC3B;gBACF;YACF;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,cAAc,CAAC,OAAO,CAAC,eAAe,CAAC;;AAGvC,QAAA,OAAO,MAAM,cAAc,CAAC,UAAU,EAAE;IAC1C;AAEA;;AAEG;IACO,gCAAgC,CACxC,UAAe,EACf,eAAyC,EAAA;AAEzC,QAAA,IAAI,UAAU,KAAK,YAAY,EAAE;YAC/B,OAAO,eAAe,CAAC,MAAM,CAC3B,CAAC,WAAW,KAAK,WAAW,CAAC,UAAU,KAAK,SAAS,IAAI,WAAW,CAAC,UAAU,KAAK,IAAI,CACzF;QACH;;AAEA,QAAA,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC7F;AAEA;;AAEG;AACO,IAAA,oBAAoB,CAAC,UAAe,EAAA;;AAE5C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,wBAAwB,EAAE;AAChD,QAAA,IAAI,SAAS,GAAG,CAAC,CAAC;AAElB,QAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AAC9B,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,gCAAgC,CAAC,UAAU,EAAE,OAAO,CAAC,8BAA8B,CAAC;AAC9G,YAAA,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;;AAE3B,gBAAA,MAAM,eAAe,GAAG,IAAI,CAAC,0CAA0C,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC;gBACnG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,eAAe,CAAC;YAClD;QACF;;AAGA,QAAA,MAAM,MAAM,GAAG,CAAC,CAAC;AACjB,QAAA,OAAO,4DAA4D,SAAS,CAAA,GAAA,EAAM,MAAM,CAAA,KAAA,EAAQ,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG;IAC/H;AAEA;;;AAGG;IACK,0CAA0C,CAChD,YAAsC,EACtC,OAAmB,EAAA;AAEnB,QAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC;AACvC,QAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC;;QAGvC,MAAM,QAAQ,GAAU,EAAE;AAC1B,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,YAAY,EAAE;AAC/C,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,EAAE;AAE3C,QAAA,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE;AACtC,YAAA,IAAI,WAAW,CAAC,MAAM,EAAE;;gBAEtB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;gBACnG,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;;gBAG/F,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;gBAC9C,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;gBAE1C,IAAI,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE;oBAC9F,QAAQ,CAAC,IAAI,CAAC;wBACZ,SAAS,EAAE,eAAe,CAAC,IAAI;wBAC/B,OAAO,EAAE,aAAa,CAAC,IAAI;AAC3B,wBAAA,MAAM,EAAE,IAAI;AACb,qBAAA,CAAC;gBACJ;YACF;iBAAO;;AAEL,gBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,gCAAgC,CACpE,WAAW,EACX,OAAO,EACP,mBAAmB,EACnB,iBAAiB,EACjB,KAAK,CACN;gBAED,IAAI,OAAO,EAAE;AACX,oBAAA,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;gBACxB;YACF;QACF;AAEA,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC;AACnC,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC;;AAGnC,QAAA,MAAM,cAAc,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACjD,YAAA,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE;YAC/D,IAAI,SAAS,KAAK,CAAC;AAAE,gBAAA,OAAO,SAAS;AACrC,YAAA,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE;AAClD,QAAA,CAAC,CAAC;QAEF,MAAM,WAAW,GAAW,EAAE;QAC9B,IAAI,OAAO,GAAG,CAAC;AAEf,QAAA,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE;AACpC,YAAA,IAAI,gBAAgB,GAAG,CAAC,CAAC;;AAGzB,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC3C,IAAI,OAAO,CAAC,SAAS,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE;oBACvC,gBAAgB,GAAG,CAAC;oBACpB;gBACF;YACF;;AAGA,YAAA,IAAI,gBAAgB,KAAK,CAAC,CAAC,EAAE;AAC3B,gBAAA,gBAAgB,GAAG,WAAW,CAAC,MAAM;AACrC,gBAAA,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YACnC;iBAAO;AACL,gBAAA,WAAW,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,OAAO;YACjD;YAEA,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC;QACjD;QAEA,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7B;AAEA;;AAEG;IACO,aAAa,GAAA;AACrB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE;AACrC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;QACjC,MAAM,KAAK,GAAiB,EAAE;;QAG9B,MAAM,QAAQ,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;AACnD,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,EAAE;AAExB,QAAA,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;AAC/D,QAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAEhB,OAAO,IAAI,CAAC,IAAI,GAAG,OAAO,GAAG,CAAC,EAAE;YAC9B,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;AAC1B,YAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAClB;AAEA,QAAA,OAAO,KAAK;IACd;AAEA;;AAEG;IACO,aAAa,GAAA;QACrB,OAAO,IAAI,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE;IAChD;AAEU,IAAA,SAAS,CAAC,IAAgB,EAAA;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC;QACvD,IAAI,SAAS,EAAE;YACb,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC1F,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACtG,YAAA,MAAM,OAAO,GAAG,aAAa,IAAI,eAAe;YAChD,OAAO;AACL,gBAAA,KAAK,EAAE,SAAS;gBAChB,OAAO;aACR;QACH;AACA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxE,IAAI,SAAS,EAAE;AACb,YAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;QAC7B;AACA,QAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;IAC1B;+GAjZW,wCAAwC,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAxC,wCAAwC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,wBAAA,EAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,UAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,0BAAA,EAAA,EAAA,iBAAA,EAAA,4BAAA,EAAA,UAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,6BAAA,EAAA,+BAAA,EAAA,+BAAA,EAAA,iCAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,EAAA,SAAA,EAFxC,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,wCAAwC,EAAE,CAAC,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,wBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3C9F,0/RA6LA,EAAA,MAAA,EAAA,CAAA,68pBAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDnJuB,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAgB,kBAAkB,mOAAE,mCAAmC,EAAA,QAAA,EAAA,gCAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,WAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,YAAA,EAAA,cAAA,EAAA,4BAAA,EAAA,WAAA,EAAA,0BAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,+BAAA,EAAA,iCAAA,EAAA,uBAAA,EAAA,2BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAlG,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAoB,YAAY,EAAA,IAAA,EAAA,QAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FAGxC,wCAAwC,EAAA,UAAA,EAAA,CAAA;kBATpD,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sCAAsC,EAAA,eAAA,EAG/B,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B,CAAC,SAAS,EAAE,gBAAgB,EAAE,YAAY,EAAE,kBAAkB,EAAE,mCAAmC,CAAC,EAAA,SAAA,EAClG,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAA,wCAA0C,EAAE,CAAC,EAAA,QAAA,EAAA,0/RAAA,EAAA,MAAA,EAAA,CAAA,68pBAAA,CAAA,EAAA;2uDAuBhC,iBAAiB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,CAAA,EAAA,sBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,CAAA,EAAA,wBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,0BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,4BAAA,CAAA,EAAA,CAAA,EAAA,6BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,+BAAA,CAAA,EAAA,CAAA,EAAA,+BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,iCAAA,CAAA,EAAA,CAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,CAAA,EAAA,yBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,2BAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEGzE,MAAO,oCAAqC,SAAQ,WAAW,CAAA;AArBrE,IAAA,WAAA,GAAA;;AAsBU,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,oBAAoB,CAAC;AACxC,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC3C,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAEpC,QAAA,IAAA,CAAA,gCAAgC,GAAG,CAAC,CAAC;AAEtD,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AACvB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,IAAI,qDAAC;AACvB,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,KAAK,sDAAC;AACzB,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAC,CAAC,0DAAC;QACzB,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAC1B,QAAA,IAAA,CAAA,mBAAmB,GAAG,KAAK,CAAC,IAAI,+DAAC;AACjC,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,+CAAc;AACnC,QAAA,IAAA,CAAA,0BAA0B,GAAG,KAAK,CAAC,IAAI,sEAAC;AACxC,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAwB,EAAE,qDAAC;AAC5C,QAAA,IAAA,CAAA,wBAAwB,GAAG,KAAK,CAAU,IAAI,oEAAC;QAC/C,IAAA,CAAA,gBAAgB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAwB;AAChD,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAA2B,EAAE,wDAAC;QAClD,IAAA,CAAA,eAAe,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAiC;AAEhD,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAgB,IAAI,2DAAC;AAC7C,QAAA,IAAA,CAAA,uBAAuB,GAAG,MAAM,CAAM,IAAI,mEAAC;AAEnD,QAAA,IAAA,CAAA,sBAAsB,GAAG,SAAS,CAA0B,iBAAiB,kEAAC;;AAGpE,QAAA,IAAA,CAAA,uBAAuB,GAAG,QAAQ,CAAC,MAAK;YAChD,OAAO,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC;AAC5E,QAAA,CAAC,mEAAC;AAEQ,QAAA,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAA4B,MAAK;AACpE,YAAA,MAAM,uBAAuB,GAAG,IAAI,CAAC,YAAY,EAAE;YACnD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;YACjD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;AAC7C,YAAA,MAAM,UAAU,GAAG,WAAW,CAAC,SAAS;AACxC,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAClC,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,0BAA0B,EAAE;YAExD,IAAI,CAAC,uBAAuB,EAAE;AAC5B,gBAAA,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAI;AACjD,oBAAA,MAAM,cAAc,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;oBACjE,OAAO;AACL,wBAAA,IAAI,EAAE,cAAc;AACpB,wBAAA,mBAAmB,EAAE,EAAE;AACvB,wBAAA,kBAAkB,EAAE,EAAE;AACtB,wBAAA,SAAS,EAAE,CAAC;AACZ,wBAAA,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC;qBAC7C;AACH,gBAAA,CAAC,CAAC;YACJ;YAEA,MAAM,MAAM,GAA8B,EAAE;AAE5C,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;AACnC,gBAAA,MAAM,cAAc,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;gBACjE,MAAM,kBAAkB,GAAoC,EAAE;AAE9D,gBAAA,KAAK,MAAM,IAAI,IAAI,uBAAuB,EAAE;;AAE1C,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,gCAAgC,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC;oBACzG,IAAI,OAAO,EAAE;AACX,wBAAA,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;oBAClC;gBACF;;AAGA,gBAAA,MAAM,cAAc,GAAG,OAAO,CAC5B,kBAAkB,EAClB;AACE,oBAAA,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;oBACzB,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE;AAC5B,oBAAA,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE;oBAClD,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE;iBACpC,EACD,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAC9B;AAED,gBAAA,MAAM,mBAAmB,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,gCAAgC,CAAC;gBAC1F,MAAM,kBAAkB,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC;;AAGtF,gBAAA,IAAI,sBAKS;AAEb,gBAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AACxB,oBAAA,sBAAsB,GAAG,IAAI,GAAG,EAAE;AAClC,oBAAA,MAAM,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,SAAS,EAAE,cAAc,CAAC;AAEzF,oBAAA,cAAc,CAAC,OAAO,CAAC,CAAC,UAAU,KAAI;AACpC,wBAAA,MAAM,uBAAuB,GAAG,IAAI,CAAC,gBAAgB,CAAC,0BAA0B,CAC9E,uBAAuB,EACvB,UAAU,CACX;wBAED,MAAM,gBAAgB,GAAoC,EAAE;AAC5D,wBAAA,KAAK,MAAM,IAAI,IAAI,uBAAuB,EAAE;AAC1C,4BAAA,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,gCAAgC,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC;4BACzG,IAAI,OAAO,EAAE;AACX,gCAAA,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;4BAChC;wBACF;AAEA,wBAAA,MAAM,sBAAsB,GAAG,OAAO,CACpC,gBAAgB,EAChB;AACE,4BAAA,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;4BACzB,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE;AAC5B,4BAAA,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE;4BAClD,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE;yBACpC,EACD,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAC9B;AAED,wBAAA,MAAM,OAAO,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,gCAAgC,CAAC;wBACtF,MAAM,MAAM,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC;AAElF,wBAAA,sBAAsB,CAAC,GAAG,CAAC,UAAU,EAAE;4BACrC,OAAO;4BACP,MAAM;4BACN,SAAS,EAAE,MAAM,CAAC,MAAM;AACzB,yBAAA,CAAC;AACJ,oBAAA,CAAC,CAAC;gBACJ;gBAEA,MAAM,CAAC,IAAI,CAAC;AACV,oBAAA,IAAI,EAAE,cAAc;oBACpB,mBAAmB;oBACnB,kBAAkB;oBAClB,SAAS,EAAE,kBAAkB,CAAC,MAAM;AACpC,oBAAA,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC;oBAC5C,sBAAsB;AACvB,iBAAA,CAAC;YACJ;AAEA,YAAA,OAAO,MAAM;AACf,QAAA,CAAC,4DAAC;AAEQ,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACpC,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAClC,YAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;AAAE,gBAAA,OAAO,EAAE;AACrC,YAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,SAAS,EAAE,IAAI,CAAC,0BAA0B,EAAE,CAAC;AAC9F,QAAA,CAAC,uDAAC;;QAiGF,IAAA,CAAA,mBAAmB,GAAG,MAAM,EAA6B;QACzD,IAAA,CAAA,sBAAsB,GAAG,MAAM,EAA6B;QAC5D,IAAA,CAAA,wBAAwB,GAAG,MAAM,EAA6B;QAC9D,IAAA,CAAA,0BAA0B,GAAG,MAAM,EAAoC;QACvE,IAAA,CAAA,6BAA6B,GAAG,MAAM,EAAoC;QAC1E,IAAA,CAAA,+BAA+B,GAAG,MAAM,EAAoC;QAC5E,IAAA,CAAA,qBAAqB,GAAG,MAAM,EAAoC;QAClE,IAAA,CAAA,yBAAyB,GAAG,MAAM,EAA4B;;AAG7C,QAAA,IAAA,CAAA,cAAc,GAAG;AAChC,YAAA,IAAI,EAAE;gBACJ,KAAK,EAAE,IAAI,CAAC,mBAAmB;gBAC/B,QAAQ,EAAE,IAAI,CAAC,sBAAsB;gBACrC,WAAW,EAAE,IAAI,CAAC,wBAAwB;AAC3C,aAAA;AACD,YAAA,WAAW,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,0BAA0B;gBACtC,QAAQ,EAAE,IAAI,CAAC,6BAA6B;gBAC5C,WAAW,EAAE,IAAI,CAAC,+BAA+B;AAClD,aAAA;SACF;AAuFF,IAAA;AA3MS,IAAA,cAAc,CAAC,IAAgB,EAAA;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC;QACvD,IAAI,SAAS,EAAE;YACb,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC1F,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACtG,YAAA,MAAM,OAAO,GAAG,aAAa,IAAI,eAAe;YAChD,OAAO;AACL,gBAAA,KAAK,EAAE,SAAS;gBAChB,OAAO;aACR;QACH;AACA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxE,IAAI,SAAS,EAAE;AACb,YAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;QAC7B;AACA,QAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;IAC1B;AAEU,IAAA,OAAO,CAAC,IAAgB,EAAA;AAChC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC;IACjC;AAEU,IAAA,gBAAgB,CAAC,UAAe,EAAA;AACxC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;QAClC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QACjE,OAAO,QAAQ,EAAE,KAAK,IAAI,MAAM,CAAC,UAAU,CAAC;IAC9C;IAEU,gCAAgC,CAAC,UAAe,EAAE,OAAgC,EAAA;QAC1F,OAAO,OAAO,CAAC,sBAAsB,EAAE,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE;IACrG;AAEU,IAAA,kBAAkB,CAAC,UAAe,EAAA;AAC1C,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;QAClC,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;AACjE,QAAA,OAAO,QAAQ,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE;IAClE;IAEU,sBAAsB,GAAA;AAC9B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;;AAGzC,QAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AACnD,YAAA,OAAO,IAAI;QACb;;QAGA,MAAM,iBAAiB,GAAG,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC;QACjD,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;AACjD,QAAA,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG;IACxE;IAEA,eAAe,GAAA;;QAEb,IAAI,CAAC,sBAAsB,EAAE;IAC/B;IAEQ,sBAAsB,GAAA;AAC5B,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,EAAE;AACrD,QAAA,IAAI,eAAe,KAAK,IAAI,EAAE;AAC5B,YAAA,OAAO,SAAS;QAClB;QAEA,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,EAAE,EAAE,aAAa;QACpE,IAAI,CAAC,eAAe,EAAE;AACpB,YAAA,OAAO,SAAS;QAClB;;QAGA,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,KAAI;AACpD,YAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;AAC3B,gBAAA,IAAI,KAAK,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;;oBAE/D,eAAe,CAAC,cAAc,CAAC;AAC7B,wBAAA,QAAQ,EAAE,QAAQ;AAClB,wBAAA,KAAK,EAAE,SAAS;AAChB,wBAAA,MAAM,EAAE,QAAQ;AACjB,qBAAA,CAAC;;oBAEF,cAAc,CAAC,UAAU,EAAE;oBAC3B;gBACF;YACF;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,cAAc,CAAC,OAAO,CAAC,eAAe,CAAC;;AAGvC,QAAA,OAAO,MAAM,cAAc,CAAC,UAAU,EAAE;IAC1C;IA0BU,sBAAsB,CAAC,UAAsB,EAAE,eAAuC,EAAA;QAC9F,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,eAAe,CAAC;AACzF,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,GAAG,mBAAmB;YACtB,OAAO,EAAE,mBAAmB,CAAC,OAAO;YACpC,SAAS,EAAE,mBAAmB,CAAC,SAAS;SACzC;QACD,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAC/B,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EAChF,IAAI,CAAC,cAAc,EACnB,aAAa,CACd;IACH;IAEU,eAAe,CAAC,UAAsB,EAAE,IAAgB,EAAA;;AAEhE,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;AACxF,QAAA,IAAI,QAAQ;YACV,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAC/B,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EACnE,IAAI,CAAC,cAAc,EACnB,MAAM,CACP;IACL;AAEU,IAAA,UAAU,CAAC,CAAsB,EAAE,IAAgB,EAAE,UAAgB,EAAA;;AAE7E,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;QACxF,MAAM,WAAW,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAA4B;QAClE,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,WAAW,CAAC;AACrF,QAAA,MAAM,cAAc,GAAG;AACrB,YAAA,GAAG,mBAAmB;YACtB,OAAO,EAAE,mBAAmB,CAAC,OAAO;YACpC,SAAS,EAAE,mBAAmB,CAAC,SAAS;SACzC;;AAGD,QAAA,MAAM,gBAAgB,GAAG,UAAU,KAAK,YAAY,GAAG,SAAS,GAAG,UAAU;;AAG7E,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE;AAC9C,QAAA,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;AACvD,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,uBAAuB,EAAE;QAC1D,MAAM,cAAc,GAAG,eAAe,KAAK,UAAU,IAAI,mBAAmB,KAAK,UAAU;AAE3F,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC;AAClC,YAAA,SAAS,EAAE,CAAC;YACZ,IAAI,EAAE,EAAE,GAAG,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE;YACnD,MAAM,EAAE,IAAI,CAAC,SAAS;AACtB,YAAA,WAAW,EAAE,cAAc;YAC3B,cAAc;AACf,SAAA,CAAC;IACJ;IAEU,iBAAiB,CAAC,KAAiB,EAAE,eAAuC,EAAA;QACpF,KAAK,CAAC,eAAe,EAAE;QACvB,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,eAAe,CAAC;AACzF,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;AAC9B,YAAA,WAAW,EAAE,mBAAmB;AAChC,YAAA,WAAW,EAAE,KAAK;YAClB,MAAM,EAAE,IAAI,CAAC,SAAS;AACvB,SAAA,CAAC;IACJ;AAEU,IAAA,2BAA2B,CAAC,OAAmB,EAAA;AACvD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;;AAGzC,QAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AACnD,YAAA,OAAO,KAAK;QACd;;QAGA,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC;IACnC;AAEU,IAAA,SAAS,CAAC,CAAe,EAAA;AACjC,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC;aAC1B,iBAAiB,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO;AACtC,aAAA,IAAI,CAAC,CAAC,EAAE,KAAwB,EAAE,YAAY,WAAW,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC;QACnG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;QACpF,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;IAClG;+GA/VW,oCAAoC,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAApC,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oCAAoC,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,0BAAA,EAAA,EAAA,iBAAA,EAAA,4BAAA,EAAA,UAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,wBAAA,EAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,UAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,6BAAA,EAAA,+BAAA,EAAA,+BAAA,EAAA,iCAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,EAAA,SAAA,EAFpC,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,oCAAoC,EAAE,CAAC,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,wBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnE1F,q6tBAkcA,gmqBD3YI,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAGhB,eAAe,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,wBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEf,kBAAkB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,EAAA,QAAA,EAAA,WAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,EAAA,eAAA,EAAA,YAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,kBAAkB,mOAClB,mBAAmB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,wBAAwB,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,2BAA2B,EAAA,QAAA,EAAA,8IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAR3B,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACT,YAAY,0CAEZ,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FASP,oCAAoC,EAAA,UAAA,EAAA,CAAA;kBArBhD,SAAS;+BACE,iCAAiC,EAAA,eAAA,EAG1B,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B;wBACP,OAAO;wBACP,gBAAgB;wBAChB,SAAS;wBACT,YAAY;wBACZ,eAAe;wBACf,gBAAgB;wBAChB,kBAAkB;wBAClB,kBAAkB;wBAClB,mBAAmB;wBACnB,wBAAwB;wBACxB,2BAA2B;qBAC5B,EAAA,SAAA,EACU,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAA,oCAAsC,EAAE,CAAC,EAAA,QAAA,EAAA,q6tBAAA,EAAA,MAAA,EAAA,CAAA,wiqBAAA,CAAA,EAAA;+7CA2B5B,iBAAiB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,CAAA,EAAA,sBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,CAAA,EAAA,wBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,0BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,4BAAA,CAAA,EAAA,CAAA,EAAA,6BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,+BAAA,CAAA,EAAA,CAAA,EAAA,+BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,iCAAA,CAAA,EAAA,CAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,CAAA,EAAA,yBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,2BAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AE5BzE,MAAO,4BAA6B,SAAQ,WAAW,CAAA;AApB7D,IAAA,WAAA,GAAA;;;AAsBmB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,oBAAoB,CAAC;AACxC,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC3C,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAC7C,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAgB,IAAI,2DAAC;;QAG7C,IAAA,CAAA,MAAM,GAAG,CAAC;QACV,IAAA,CAAA,eAAe,GAAG,CAAC;;AAG7B,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AACvB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,IAAI,qDAAC;AACvB,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,KAAK,sDAAC;AACzB,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAC,CAAC,0DAAC;QACzB,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAU;AAC1B,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,+CAAc;AACnC,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,QAAQ,qDAAU;AACrC,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAC,QAAQ,uDAAU;AACvC,QAAA,IAAA,CAAA,wBAAwB,GAAG,KAAK,CAAU,IAAI,oEAAC;AAC/C,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAA2B,EAAE,wDAAC;QAClD,IAAA,CAAA,eAAe,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAiC;;AAG/D,QAAA,IAAA,CAAA,sBAAsB,GAAG,SAAS,CAA0B,iBAAiB,kEAAC;;QAG3D,IAAA,CAAA,mBAAmB,GAAG,MAAM,EAA6B;QACzD,IAAA,CAAA,sBAAsB,GAAG,MAAM,EAA6B;QAC5D,IAAA,CAAA,wBAAwB,GAAG,MAAM,EAA6B;QAC9D,IAAA,CAAA,0BAA0B,GAAG,MAAM,EAAoC;QACvE,IAAA,CAAA,6BAA6B,GAAG,MAAM,EAAoC;QAC1E,IAAA,CAAA,+BAA+B,GAAG,MAAM,EAAoC;QAC5E,IAAA,CAAA,qBAAqB,GAAG,MAAM,EAAoC;QAClE,IAAA,CAAA,yBAAyB,GAAG,MAAM,EAA4B;;;;;;AAQjF;;;;AAIG;AACO,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AACnC,YAAA,IAAI,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACtB,YAAA,IAAI,CAAC,IAAI;AAAE,gBAAA,OAAO,EAAE;AACpB,YAAA,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;AAC5D,YAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC;YACpB,OAAO,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE;gBACxC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;AAC1B,gBAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;YAClB;AACA,YAAA,OAAO,KAAK;AACd,QAAA,CAAC,sDAAC;AAEF;;;;AAIG;AACO,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAC5B,MAA2G;AACzG,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,YAAA,IAAI,CAAC,IAAI;AAAE,gBAAA,OAAO,EAAE;AACpB,YAAA,MAAM,IAAI,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;AAC5D,YAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE;gBACvC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;AACnC,gBAAA,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACpD;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,qDACF;AAED;;;AAGG;AACO,QAAA,IAAA,CAAA,qBAAqB,GAAG,QAAQ,CAAC,MAAK;AAC9C,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;AAClC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAC9B,YAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG,MAAM,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;AACjD,QAAA,CAAC,iEAAC;AAEF;;;AAGG;AACO,QAAA,IAAA,CAAA,wBAAwB,GAAG,QAAQ,CAAC,MAAkC;AAC9E,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;AACtD,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,8BAA8B,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;AAEpF,YAAA,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,OAAO,KAAI;gBAChC,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;AAC9C,gBAAA,MAAM,sBAAsB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,OAAO,KAC3D,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,CAC7G;gBACD,OAAO;AACL,oBAAA,GAAG,EAAE,OAAO;AACZ,oBAAA,YAAY,EAAE,OAAO,CAAC,sBAAsB,EAAE,CAAC,mBAAmB,EAAE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;iBAC9F;AACH,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,oEAAC;;;;;;;;;;AAYF;;;AAGG;AACK,QAAA,IAAA,CAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAK;AAC1C,YAAA,MAAM,YAAY,GAAG,IAAI,GAAG,EAAqD;AACjF,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAC5C,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,EAAE;AACjC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;AAClC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAE9B,YAAA,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,EAAE,QAAQ,EAAE,EAAE;gBAC/C,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC;gBAClD,MAAM,kBAAkB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,KAChD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAChH;AACD,gBAAA,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC;oBAAE;AAErC,gBAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,gBAAgB,CAAC,+BAA+B,CAC9E,kBAAkB,EAClB,OAAO,EACP,MAAM,EACN,IAAI,CACL;gBACD,MAAM,kBAAkB,GAAG,OAAO,CAChC,kBAAkB,EAClB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC,EAClG,CAAC,KAAK,EAAE,MAAM,CAAC,CAChB;AAED,gBAAA,MAAM,UAAU,GAAG,IAAI,GAAG,EAAwC;gBAClE,MAAM,WAAW,GAAwD,EAAE;AAE3E,gBAAA,KAAK,MAAM,kBAAkB,IAAI,kBAAkB,EAAE;AACnD,oBAAA,IAAI,WAAW,GAAG,CAAC,CAAC;oBACpB,KAAK,IAAI,CAAC,GAAG,CAAC,GAAI,CAAC,EAAE,EAAE;AACrB,wBAAA,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;4BAAE,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE;wBAC1D,IAAI,QAAQ,GAAG,KAAK;wBACpB,KAAK,MAAM,aAAa,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE;4BACvD,IAAI,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,kBAAkB,EAAE,aAAa,CAAC,EAAE;gCAClF,QAAQ,GAAG,IAAI;gCACf;4BACF;wBACF;wBACA,IAAI,CAAC,QAAQ,EAAE;4BACb,WAAW,GAAG,CAAC;4BACf,WAAW,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC;4BACpD;wBACF;oBACF;oBACA,MAAM,eAAe,GAAG,kBAAkB,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;AACrE,oBAAA,MAAM,aAAa,GAAG,eAAe,GAAG,eAAe,CAAC,qBAAqB,GAAG,CAAC;AACjF,oBAAA,UAAU,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,qBAAqB,EAAE,aAAa,EAAE,CAAC;gBAC3G;AACA,gBAAA,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC;YACxC;AACA,YAAA,OAAO,YAAY;AACrB,QAAA,CAAC,+DAAC;AAEF;;;;AAIG;AACO,QAAA,IAAA,CAAA,yBAAyB,GAAG,QAAQ,CAAC,MAAqC;YAClF,MAAM,YAAY,GAAmC,EAAE;AACvD,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,EAAE;AAC/C,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,EAAE;YAC5C,MAAM,eAAe,GAAG,CAAA,uDAAA,CAAyD;YACjF,MAAM,CAAC,GAAG,CAAC;AAEX,YAAA,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE;AAC9B,gBAAA,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AAClF,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE;AACtF,oBAAA,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,CAC7C;AACD,gBAAA,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,IAAI,CAAC;oBAAE;AAEnC,gBAAA,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AAC3D,gBAAA,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,WAAW,KAAK,CAAC;oBAAE;gBAEjD,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,GAAG,EAAE,GAAG,aAAa,CAAC,MAAM;gBACnE,MAAM,gBAAgB,GAAG,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE;gBAChE,MAAM,SAAS,GAAG,CAAA,KAAA,EAAQ,eAAe,MAAM,gBAAgB,GAAG,EAAE,CAAA,OAAA,CAAS;gBAE7E,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,0BAA0B,CAAC,IAAI,CAAC;AAC9E,gBAAA,MAAM,YAAY,GAAG,CAAA,KAAA,EAAQ,eAAe,CAAA,GAAA,EAAM,eAAe,GAAG,EAAE,CAAA,GAAA,EAAM,IAAI,CAAC,MAAM,KAAK;AAE5F,gBAAA,MAAM,iBAAiB,GAAG,UAAU,CAAC,qBAAqB,GAAG,CAAC;gBAC9D,MAAM,WAAW,GAAG;sBAChB,eAAe,CAAC,CAAA,GAAA,EAAM,IAAI,CAAC,eAAe,GAAG,GAAG,CAAA,IAAA;AAClD,sBAAE,CAAA,YAAA,EAAe,CAAC,CAAA,CAAA,CAAG;gBAEvB,YAAY,CAAC,IAAI,CAAC;AAChB,oBAAA,WAAW,EAAE,IAAI;oBACjB,SAAS;oBACT,YAAY;oBACZ,UAAU,EAAE,QAAQ,QAAQ,IAAI,GAAG,GAAG,CAAC,CAAC,CAAA,EAAA,CAAI;oBAC5C,WAAW;AACZ,iBAAA,CAAC;YACJ;AACA,YAAA,OAAO,YAAY;AACrB,QAAA,CAAC,qEAAC;AAEF;;;AAGG;AACO,QAAA,IAAA,CAAA,sBAAsB,GAAG,QAAQ,CAAC,MAAiC;YAC3E,MAAM,UAAU,GAA+B,EAAE;AACjD,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,EAAE;AAC/C,YAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,EAAE;YACjD,MAAM,eAAe,GAAG,CAAA,uDAAA,CAAyD;YACjF,MAAM,CAAC,GAAG,CAAC;YAEX,MAAM,kBAAkB,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AAC1D,gBAAA,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AAClF,gBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE;AACtF,oBAAA,IAAI,CAAC,gBAAgB,CAAC,oBAAoB,CAC7C;AACD,gBAAA,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AAC3D,gBAAA,OAAO,UAAU,IAAI,UAAU,CAAC,WAAW,GAAG,CAAC;AACjD,YAAA,CAAC,CAAC;AAEF,YAAA,MAAM,aAAa,GAAG,IAAI,GAAG,EAA2C;AACxE,YAAA,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE;AACrC,gBAAA,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClF,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CACxD,aAAa,EACb,IAAI,CAAC,IAAI,EAAE,EACX,IAAI,CAAC,YAAY,EAAE,EACnB,IAAI,CAAC,UAAU,EAAE,EACjB,CAAC,CACF;AACD,gBAAA,IAAI,CAAC,SAAS;oBAAE;gBAEhB,MAAM,GAAG,GAAG,CAAA,EAAG,SAAS,CAAC,QAAQ,CAAA,CAAA,EAAI,SAAS,CAAC,UAAU,CAAA,CAAE;AAC3D,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;AAAE,oBAAA,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC;gBACvD,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACnC;YAEA,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,KAAI;AACnC,gBAAA,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;AACnD,gBAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC;AACtC,gBAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC;AAE1C,gBAAA,MAAM,QAAQ,GAAG,CAAA,KAAA,EAAQ,eAAe,CAAA,GAAA,EAAM,UAAU,aAAa;AACrE,gBAAA,MAAM,SAAS,GAAG,CAAA,KAAA,EAAQ,QAAQ,IAAI,GAAG,GAAG,CAAC,CAAC,eAAe,CAAC,CAAA,IAAA,EAAO,IAAI,CAAC,eAAe,MAAM;gBAE/F,UAAU,CAAC,IAAI,CAAC;oBACd,GAAG,EAAE,CAAA,MAAA,EAAS,GAAG,CAAA,CAAE;oBACnB,KAAK,EAAE,KAAK,CAAC,MAAM;oBACnB,QAAQ;oBACR,SAAS;AACT,oBAAA,kBAAkB,EAAE,KAAK;AAC1B,iBAAA,CAAC;AACJ,YAAA,CAAC,CAAC;AAEF,YAAA,OAAO,UAAU;AACnB,QAAA,CAAC,kEAAC;;;;;;AAQe,QAAA,IAAA,CAAA,cAAc,GAAG;AAChC,YAAA,IAAI,EAAE;gBACJ,KAAK,EAAE,IAAI,CAAC,mBAAmB;gBAC/B,QAAQ,EAAE,IAAI,CAAC,sBAAsB;gBACrC,WAAW,EAAE,IAAI,CAAC,wBAAwB;AAC3C,aAAA;AACD,YAAA,WAAW,EAAE;gBACX,KAAK,EAAE,IAAI,CAAC,0BAA0B;gBACtC,QAAQ,EAAE,IAAI,CAAC,6BAA6B;gBAC5C,WAAW,EAAE,IAAI,CAAC,+BAA+B;AAClD,aAAA;SACF;;AA0SO,QAAA,IAAA,CAAA,8BAA8B,GAAG,QAAQ,CAAkC,MAAK;AACtF,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;AACpD,YAAA,MAAM,uBAAuB,GAAG,IAAI,CAAC,YAAY,EAAE;YACnD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,uBAAuB,CAAC,MAAM,KAAK,CAAC;AAAE,gBAAA,OAAO,EAAE;AAE5E,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;AAClC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;YAC9B,MAAM,iBAAiB,GAAoC,EAAE;AAE7D,YAAA,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE;AAC1B,gBAAA,KAAK,MAAM,IAAI,IAAI,uBAAuB,EAAE;oBAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,gCAAgC,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC;AAC9G,oBAAA,IAAI,OAAO;AAAE,wBAAA,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC;gBAC9C;YACF;AACA,YAAA,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAyC;AAC1E,YAAA,iBAAiB,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;gBAChC,MAAM,MAAM,GAAG,CAAA,EAAG,GAAG,CAAC,EAAE,CAAA,CAAA,EAAI,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAA,CAAE;AAC9E,gBAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC;AAAE,oBAAA,iBAAiB,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;AACxE,YAAA,CAAC,CAAC;YACF,OAAO,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC;AAC/C,QAAA,CAAC,0EAAC;AAEM,QAAA,IAAA,CAAA,iBAAiB,GAAG,QAAQ,CAAkC,MAAK;AACzE,YAAA,OAAO,IAAI,CAAC,8BAA8B,EAAE,EAAE,MAAM,CAAC,CAAC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE;AAC1F,QAAA,CAAC,6DAAC;AACH,IAAA;AAlUC;;;;;AAKG;IACO,sBAAsB,CAAC,UAAsB,EAAE,kBAA0C,EAAA;QACjG,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,kBAAkB,CAAC;QAC5F,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAC/B,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EACrF,IAAI,CAAC,cAAc,EACnB,aAAa,CACd;IACH;AAEA;;;;;;;AAOG;AACO,IAAA,qBAAqB,CAC7B,UAAsB,EACtB,IAAgB,EAChB,GAAe,EACf,WAAmB,EAAA;QAEnB,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,GAAG,EAAE,CAAC;AAC5E,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC;AACrE,QAAA,IAAI,QAAQ;YACV,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAC/B,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EACnE,IAAI,CAAC,cAAc,EACnB,MAAM,CACP;IACL;AAEA;;;;;AAKG;IACO,qBAAqB,CAAC,UAAsB,EAAE,GAAe,EAAA;QACrE,MAAM,QAAQ,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE;QACpG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAC/B,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,EACnE,IAAI,CAAC,cAAc,EACnB,MAAM,CACP;IACH;AAEA;;;;;AAKG;IACO,gBAAgB,CAAC,CAAsB,EAAE,GAAe,EAAA;QAChE,MAAM,QAAQ,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE;AACpG,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CACtE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAA4B,CAC/C;AACD,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC;AAClC,YAAA,SAAS,EAAE,CAAC;AACZ,YAAA,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,IAAI,CAAC,SAAS;AACtB,YAAA,WAAW,EAAE,mBAAmB;AAChC,YAAA,cAAc,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;AAChF,SAAA,CAAC;IACJ;AAEA;;;;;;;AAOG;AACO,IAAA,mBAAmB,CAAC,CAAsB,EAAE,IAAgB,EAAE,GAAe,EAAE,WAAmB,EAAA;QAC1G,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,GAAG,EAAE,CAAC;AAC5E,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC;AACrE,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CACtE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAA4B,CAC/C;AACD,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC;AAClC,YAAA,SAAS,EAAE,CAAC;AACZ,YAAA,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,IAAI,CAAC,SAAS;AACtB,YAAA,WAAW,EAAE,mBAAmB;AAChC,YAAA,cAAc,EAAE,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;AAChF,SAAA,CAAC;IACJ;AAEA;;;;;AAKG;IACO,iBAAiB,CAAC,KAAiB,EAAE,eAAuC,EAAA;QACpF,KAAK,CAAC,eAAe,EAAE;QACvB,MAAM,mBAAmB,GAAG,IAAI,CAAC,gBAAgB,CAAC,sBAAsB,CAAC,eAAe,CAAC;AACzF,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;AAC9B,YAAA,WAAW,EAAE,mBAAmB;AAChC,YAAA,WAAW,EAAE,KAAK;YAClB,MAAM,EAAE,IAAI,CAAC,SAAS;AACvB,SAAA,CAAC;IACJ;AAEA;;;;;AAKG;AACO,IAAA,OAAO,CAAC,IAAgB,EAAA;AAChC,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC;IACnE;AAEA;;;;;AAKG;AACO,IAAA,SAAS,CAAC,IAAgB,EAAA;QAClC,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC1F,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACtG,QAAA,MAAM,OAAO,GAAG,aAAa,IAAI,eAAe;AAChD,QAAA,IAAI,OAAO;AAAE,YAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE;AACjD,QAAA,IAAI,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;AAAE,YAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE;AACvF,QAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE;IAC1B;AAEA;;;;AAIG;AACO,IAAA,SAAS,CAAC,CAAe,EAAA;AACjC,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC;aAC1B,iBAAiB,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO;AACtC,aAAA,IAAI,CAAC,CAAC,EAAE,KAAyB,EAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,SAAS,CAAC;QACvF,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IACtF;IAEU,sBAAsB,GAAA;AAC9B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;AAC5C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;AACxD,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE;AACrC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;;AAGjC,QAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AACnD,YAAA,OAAO,IAAI;QACb;;AAGA,QAAA,IAAI,GAAG,CAAC,IAAI,GAAG,SAAS,IAAI,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE;AAC/C,YAAA,OAAO,IAAI;QACb;;QAGA,MAAM,cAAc,GAAG,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM;AACjD,QAAA,MAAM,YAAY,GAAG,SAAS,GAAG,EAAE;AACnC,QAAA,MAAM,UAAU,GAAG,OAAO,GAAG,EAAE;AAC/B,QAAA,MAAM,YAAY,GAAG,UAAU,GAAG,YAAY;AAE9C,QAAA,MAAM,iBAAiB,GAAG,cAAc,GAAG,YAAY;AACvD,QAAA,OAAO,CAAC,iBAAiB,GAAG,YAAY,IAAI,GAAG;IACjD;IAEU,gCAAgC,GAAA;AACxC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,EAAE;AAC9C,QAAA,IAAI,QAAQ,KAAK,IAAI,EAAE;AACrB,YAAA,OAAO,IAAI;QACb;;;QAIA,MAAM,cAAc,GAClB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,GAAG,EAAE;AAClE,YAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM;QACjE,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE;AAC7C,QAAA,MAAM,iBAAiB,GAAG,cAAc,GAAG,YAAY;AACvD,QAAA,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,QAAA,MAAM,eAAe,GAAG,iBAAiB,GAAG,WAAW;QAEvD,OAAO,CAAA,yDAAA,EAA4D,eAAe,CAAA,OAAA,CAAS;IAC7F;IAEU,2BAA2B,GAAA;AACnC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;AAC5C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;;AAGxD,QAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AACnD,YAAA,OAAO,IAAI;QACb;;AAGA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QACpG,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE;AACjC,YAAA,OAAO,IAAI;QACb;;;AAIA,QAAA,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC,CAAC;AACzB,QAAA,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ;QAExC,OAAO,CAAA,EAAG,YAAY,CAAA,CAAA,CAAG;IAC3B;IAEU,wBAAwB,GAAA;AAChC,QAAA,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC,CAAC;QACzB,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAG;IACvB;IAEA,eAAe,GAAA;;QAEb,IAAI,CAAC,sBAAsB,EAAE;IAC/B;IAEQ,sBAAsB,GAAA;AAC5B,QAAA,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE;AACpC,YAAA,OAAO,SAAS;QAClB;AAEA,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,EAAE;AACrD,QAAA,IAAI,eAAe,KAAK,IAAI,EAAE;AAC5B,YAAA,OAAO,SAAS;QAClB;QAEA,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB,EAAE,EAAE,aAAa;QACpE,IAAI,CAAC,eAAe,EAAE;AACpB,YAAA,OAAO,SAAS;QAClB;;QAGA,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,CAAC,OAAO,KAAI;AACpD,YAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;AAC3B,gBAAA,IAAI,KAAK,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;;oBAE/D,eAAe,CAAC,cAAc,CAAC;AAC7B,wBAAA,QAAQ,EAAE,QAAQ;AAClB,wBAAA,KAAK,EAAE,QAAQ;AACf,wBAAA,MAAM,EAAE,SAAS;AAClB,qBAAA,CAAC;;oBAEF,cAAc,CAAC,UAAU,EAAE;oBAC3B;gBACF;YACF;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,cAAc,CAAC,OAAO,CAAC,eAAe,CAAC;;AAGvC,QAAA,OAAO,MAAM,cAAc,CAAC,UAAU,EAAE;IAC1C;IAEU,6BAA6B,GAAA;AACrC,QAAA,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE;AACpC,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACpE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;AAC5C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;;AAGxD,QAAA,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AACnD,YAAA,OAAO,KAAK;QACd;;AAGA,QAAA,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;AACnE,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IACc,UAAU,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE;IACxB;+GAllBW,4BAA4B,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA5B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,wBAAA,EAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,UAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,6BAAA,EAAA,+BAAA,EAAA,+BAAA,EAAA,iCAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,SAAA,EAF5B,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,4BAA4B,EAAE,CAAC,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,wBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EChElF,06bAgTA,EAAA,MAAA,EAAA,CAAA,4yTAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED3PI,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAGP,eAAe,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,wBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEf,kBAAkB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,EAAA,QAAA,EAAA,WAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,aAAA,EAAA,WAAA,EAAA,YAAA,EAAA,eAAA,EAAA,YAAA,EAAA,mBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,kBAAkB,mOAClB,mBAAmB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,wBAAwB,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,2BAA2B,EAAA,QAAA,EAAA,8IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAR3B,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EACT,YAAY,0CAEZ,gBAAgB,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FASP,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBApBxC,SAAS;+BACE,wBAAwB,EAAA,eAAA,EAGjB,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B;wBACP,OAAO;wBACP,SAAS;wBACT,YAAY;wBACZ,eAAe;wBACf,gBAAgB;wBAChB,kBAAkB;wBAClB,kBAAkB;wBAClB,mBAAmB;wBACnB,wBAAwB;wBACxB,2BAA2B;qBAC5B,EAAA,SAAA,EACU,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAA,4BAA8B,EAAE,CAAC,EAAA,QAAA,EAAA,06bAAA,EAAA,MAAA,EAAA,CAAA,4yTAAA,CAAA,EAAA;6rCA4BpB,iBAAiB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,CAAA,EAAA,sBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,wBAAA,CAAA,EAAA,CAAA,EAAA,wBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,0BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,4BAAA,CAAA,EAAA,CAAA,EAAA,6BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,+BAAA,CAAA,EAAA,CAAA,EAAA,+BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,iCAAA,CAAA,EAAA,CAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,CAAA,EAAA,yBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,2BAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA;sBAqjB5E,WAAW;uBAAC,yBAAyB;;;AE/iBlC,MAAO,oBAAqB,SAAQ,WAAW,CAAA;AAzBrD,IAAA,WAAA,GAAA;;AA0BU,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;AAChC,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,cAAc,CAAC;AACrC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC;AACvC,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC;AACvC,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC3C,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAC7C,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,oBAAoB,CAAC;AAEjD,QAAA,IAAA,CAAA,iBAAiB,GAAG,SAAS,CAAC,oBAAoB,6DAAC;AACnD,QAAA,IAAA,CAAA,eAAe,GAAG,SAAS,CAAqB,iBAAiB,2DAAC;AAElE,QAAA,IAAA,CAAA,YAAY,GAAoC;AACtD,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,KAAK,EAAE,SAAS;AAChB,YAAA,cAAc,EAAE,gBAAgB;AAChC,YAAA,oBAAoB,EAAE,oBAAoB;AAC1C,YAAA,gBAAgB,EAAE,kBAAkB;AACpC,YAAA,eAAe,EAAE,iBAAiB;AAClC,YAAA,MAAM,EAAE,QAAQ;SACjB;QAEM,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAwC;QACrD,IAAA,CAAA,YAAY,GAAG,YAAY,CACnC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAC5E;AAEM,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAO,IAAI,IAAI,EAAE,wDAAC;AACtC,QAAA,IAAA,CAAA,WAAW,GAAG,YAAY,CAAa,MAC5C,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,aAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CACrF;AAEO,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAA2B,EAAE,yDAAC;AACrD,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE;AAC3C,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,KAAK,+CAAC;AACnB,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,KAAK,wDAAC;AAC5B,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAiC,EAAE,2DAAC;AAC9D,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAa,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,oDAAC;AAE5F,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,EAAE,sDAAC;AACtB,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAC,CAAC,wDAAC;AACvB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,IAAI,qDAAC;AACvB,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,oDAAC;AACvB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,IAAI,qDAAC;AACvB,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAC,KAAK,sDAAC;AACzB,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAC,CAAC,0DAAC;AACzB,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAW,EAAE,mDAAC;AAC7B,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAC,IAAI,2DAAC;AAC7B,QAAA,IAAA,CAAA,qBAAqB,GAAG,KAAK,CAAC,CAAC,iEAAC;AAChC,QAAA,IAAA,CAAA,mBAAmB,GAAG,KAAK,CAAC,IAAI,+DAAC;AACjC,QAAA,IAAA,CAAA,wBAAwB,GAAG,KAAK,CAAC,IAAI,oEAAC;AACtC,QAAA,IAAA,CAAA,0BAA0B,GAAG,KAAK,CAAC,IAAI,sEAAC;AACxC,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAwB,EAAE,qDAAC;QAC5C,IAAA,CAAA,gBAAgB,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAwB;AAChD,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK,CAAkB,QAAQ,0DAAC;QACjD,IAAA,CAAA,eAAe,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAiC;AACxD,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAmC,EAAE,sDAAC;QACxD,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAA6D;QAC7E,IAAA,CAAA,KAAK,GAAG,KAAK,CAAoB;YACtC,KAAK;YACL,MAAM;YACN,OAAO;YACP,cAAc;YACd,oBAAoB;YACpB,gBAAgB;YAChB,eAAe;YACf,QAAQ;AACT,SAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;QAEK,IAAA,CAAA,YAAY,GAAG,KAAK,CAAkB,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;QACrD,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAkB,IAAI,CAAC,YAAY,EAAE,oDAAC;;QAGxD,IAAA,CAAA,YAAY,GAAG,MAAM,EAAQ;QAC7B,IAAA,CAAA,cAAc,GAAG,MAAM,EAAwB;QAC/C,IAAA,CAAA,aAAa,GAAG,MAAM,EAA6B;QACnD,IAAA,CAAA,gBAAgB,GAAG,MAAM,EAA6B;QACtD,IAAA,CAAA,gBAAgB,GAAG,MAAM,EAA6B;QACtD,IAAA,CAAA,iBAAiB,GAAG,MAAM,EAA4B;QACtD,IAAA,CAAA,aAAa,GAAG,MAAM,EAAoC;QAC1D,IAAA,CAAA,oBAAoB,GAAG,MAAM,EAAoC;QACjE,IAAA,CAAA,uBAAuB,GAAG,MAAM,EAAoC;QACpE,IAAA,CAAA,uBAAuB,GAAG,MAAM,EAAoC;AA8C3E,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,YAAW;YACrC,IAAI,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,UAAU,EAAE;AAC3C,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAkC;AAC9D,gBAAA,MAAM,KAAK,GAAG;AACZ,oBAAA,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG;AACrB,oBAAA,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI;iBACxB;gBACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC;AAClC,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;YAC9B;iBAAO;AACL,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAA8B;AAC1D,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;YAC9B;AACA,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;AAC1B,QAAA,CAAC,8DAAC;AAEF,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,YAAW;AACjC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC5B,YAAA,MAAM,KAAK,GAAG;AACZ,gBAAA,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG;AACrB,gBAAA,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI;aACxB;AACD,YAAA,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC;AAC9D,QAAA,CAAC,0DAAC;AACF,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,YAAW;AACjC,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;YAC9B,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC;AACpD,QAAA,CAAC,0DAAC;AAsBK,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AACrC,YAAA,QAAQ,IAAI,CAAC,YAAY,EAAE;AACzB,gBAAA,KAAK,KAAK;AACV,gBAAA,KAAK,cAAc;AACjB,oBAAA,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE;AAC/D,wBAAA,MAAM,EAAE,cAAc;AACtB,wBAAA,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE;AAC9B,qBAAA,CAAC;gBACJ,KAAK,MAAM,EAAE;AACX,oBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE;AAC5E,wBAAA,MAAM,EAAE,cAAc;AACtB,wBAAA,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE;AAC9B,qBAAA,CAAC;AACF,oBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE;AACxG,wBAAA,MAAM,EAAE,cAAc;AACtB,wBAAA,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE;AAC9B,qBAAA,CAAC;AACF,oBAAA,OAAO,CAAA,EAAG,WAAW,CAAA,GAAA,EAAM,SAAS,EAAE;gBACxC;AACA,gBAAA,KAAK,QAAQ;gBACb,KAAK,oBAAoB,EAAE;AACzB,oBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE;AAC5E,wBAAA,MAAM,EAAE,cAAc;AACtB,wBAAA,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE;AAC9B,qBAAA,CAAC;oBACF,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CACzC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC,EAC/D,UAAU,EACV;AACE,wBAAA,MAAM,EAAE,cAAc;AACtB,wBAAA,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE;AAC9B,qBAAA,CACF;AACD,oBAAA,OAAO,CAAA,EAAG,WAAW,CAAA,GAAA,EAAM,SAAS,EAAE;gBACxC;AACA,gBAAA,KAAK,OAAO;AACZ,gBAAA,KAAK,gBAAgB;AACnB,oBAAA,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE;AAC/D,wBAAA,MAAM,EAAE,WAAW;AACnB,wBAAA,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE;AAC9B,qBAAA,CAAC;AACJ,gBAAA,KAAK,eAAe;AAClB,oBAAA,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE;AAC/D,wBAAA,MAAM,EAAE,MAAM;AACd,wBAAA,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE;AAC9B,qBAAA,CAAC;;AAER,QAAA,CAAC,2DAAC;AAEK,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AACnC,YAAA,QAAQ,IAAI,CAAC,YAAY,EAAE;AACzB,gBAAA,KAAK,KAAK;AACV,gBAAA,KAAK,MAAM;AACX,gBAAA,KAAK,QAAQ;AACb,gBAAA,KAAK,cAAc;AACnB,gBAAA,KAAK,oBAAoB;AACvB,oBAAA,OAAO,KAAK;AACd,gBAAA,KAAK,OAAO;AACZ,gBAAA,KAAK,gBAAgB;AACnB,oBAAA,OAAO,OAAO;AAChB,gBAAA,KAAK,eAAe;AAClB,oBAAA,OAAO,MAAM;;AAEnB,QAAA,CAAC,yDAAC;AAEM,QAAA,IAAA,CAAA,kBAAkB,GAAG,QAAQ,CAA2B,MAAK;AACnE,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAA8B;AAE9D,YAAA,OAAO;AACJ,iBAAA,GAAG,CAAC,CAAC,IAAI,KAAI;AACZ,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;AAClF,gBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;;gBAE9E,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE;AACtC,oBAAA,OAAO,CAAC,IAAI,CAAC,sDAAsD,EAAE,IAAI,CAAC;AAC1E,oBAAA,OAAO,IAAI;gBACb;;gBAEA,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE;AACpE,oBAAA,OAAO,CAAC,IAAI,CAAC,4DAA4D,EAAE,IAAI,CAAC;AAChF,oBAAA,OAAO,IAAI;gBACb;AACA,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC;AACA,iBAAA,MAAM,CAAC,CAAC,IAAI,KAAqC,IAAI,KAAK,IAAI,CAAC,CAAC;AACrE,QAAA,CAAC,8DAAC;AAEK,QAAA,IAAA,CAAA,KAAK,GAAG,QAAQ,CAAuB,MAAK;AACjD,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE;YAChC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;AAEjD,YAAA,IAAI,CAAC,OAAO;gBAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE;YAE9C,QAAQ,IAAI;AACV,gBAAA,KAAK,KAAK;gBACV,KAAK,cAAc,EAAE;oBACnB,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;AACpE,oBAAA,OAAO,KAAK;gBACd;gBACA,KAAK,MAAM,EAAE;oBACX,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE;AACrE,oBAAA,OAAO,KAAK;gBACd;gBACA,KAAK,OAAO,EAAE;AACZ,oBAAA,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;oBACrE,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE;AAC/E,oBAAA,OAAO,KAAK;gBACd;gBACA,KAAK,gBAAgB,EAAE;oBACrB,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE;AACvF,oBAAA,OAAO,KAAK;gBACd;AACA,gBAAA,KAAK,QAAQ;gBACb,KAAK,oBAAoB,EAAE;oBACzB,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC,IAAI,EAAE;AAChG,oBAAA,OAAO,KAAK;gBACd;gBACA,KAAK,eAAe,EAAE;oBACpB,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE;AACrF,oBAAA,OAAO,KAAK;gBACd;;AAEJ,QAAA,CAAC,iDAAC;AAEF,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,MAAK;YAChC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AACxC,QAAA,CAAC,+DAAC;AAEF,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,MAAK;AAC/B,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE;YAChC,SAAS,CAAC,MAAK;gBACb,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC;AAC/C,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,8DAAC;AAEF,QAAA,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CAA2B,MAAK;AACzD,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE;AAClC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,EAAE;YACxC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI;YACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG;AAEjC,YAAA,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;AAAE,gBAAA,OAAO,EAAE;AAE9C,YAAA,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,IAAI,KACH,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC;gBACjG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,CACpG;AACH,QAAA,CAAC,4DAAC;AA2JH,IAAA;;AA3YW,IAAA,uBAAuB,CAAC,SAAoC,EAAA;AACpE,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC;IACpC;AACU,IAAA,0BAA0B,CAAC,SAAoC,EAAA;AACvE,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC;IACvC;AACU,IAAA,4BAA4B,CAAC,SAAoC,EAAA;AACzE,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC;IACvC;AACU,IAAA,8BAA8B,CAAC,SAA2C,EAAA;AAClF,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC;IAC3C;AACU,IAAA,iCAAiC,CAAC,SAA2C,EAAA;AACrF,QAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC;IAC9C;AACU,IAAA,mCAAmC,CAAC,SAA2C,EAAA;AACvF,QAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC;IAC9C;AACU,IAAA,6BAA6B,CAAC,SAAmC,EAAA;AACzE,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC;IACxC;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,MAAK;YAC5F,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;YAC7F,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE;AAC1C,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC;YACnC;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,YAAW;AACjG,YAAA,MAAM,IAAI,CAAC,cAAc,EAAE;AAC3B,YAAA,IAAI,CAAC,iBAAiB,EAAE,EAAE,WAAW,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;YACtG,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;YAC7F,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE;AAC1C,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC;YACnC;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC;AAAE,YAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1F,IAAI,CAAC,cAAc,EAAE;IACvB;AAEA,IAAA,kBAAkB;AAgBlB,IAAA,cAAc;AAQd,IAAA,cAAc;AAKN,IAAA,MAAM,cAAc,GAAA;QAC1B,MAAM,MAAM,GAAG,EAAE;QACjB,WAAW,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE;AAClC,YAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAA,0BAAA,EAA6B,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC;YAC9G,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QAC9B;AACA,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;IAClC;AAEQ,IAAA,gBAAgB,CAAC,WAAuB,EAAA;QAC9C,MAAM,eAAe,GAAG,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;AACpD,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;AACvF,QAAA,MAAM,uBAAuB,GAAG,eAAe,CAAC,SAAS;QACzD,MAAM,iBAAiB,GAAG,CAAC,uBAAuB,GAAG,eAAe,GAAG,CAAC,IAAI,CAAC;QAC7E,MAAM,aAAa,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,iBAAiB,CAAC;;AAEpE,QAAA,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACvD,QAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE;IACvC;AA8HA,IAAA,mBAAmB;AAInB,IAAA,kBAAkB;AAsBlB;;;;AAIG;AACH,IAAA,WAAW,CAAC,CAAuC,EAAA;AACjD,QAAA,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK;AACvB,QAAA,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ;AAC1B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;AAE9B,QAAA,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1C;IAEQ,iBAAiB,CAAC,OAAwB,EAAE,OAAwB,EAAA;AAC1E,QAAA,IAAI,OAAO,KAAK,MAAM,EAAE;YACtB,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,SAAS,GAAG,CAAC;AAClD,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,GAAG,CAAC,CAAC;AAC5D,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAC5B;QAEA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AAErC,QAAA,IAAI,OAAO,KAAK,MAAM,EAAE;AACtB,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE;AACtC,YAAA,MAAM,gBAAgB,GAAG,WAAW,CAAC,SAAS;AAC9C,YAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,cAAc,EAAE;YACjD,MAAM,qBAAqB,GAAG,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,mBAAmB,CAAC;YAC3F,MAAM,cAAc,GAAG,CAAC,gBAAgB,GAAG,qBAAqB,GAAG,CAAC,IAAI,CAAC;YACzE,MAAM,eAAe,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,cAAc,CAAC;AAC/D,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC;QACvC;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;IAC5B;AAEA;;AAEG;IACH,SAAS,GAAA;AACP,QAAA,QAAQ,IAAI,CAAC,YAAY,EAAE;AACzB,YAAA,KAAK,KAAK;AACV,YAAA,KAAK,cAAc;AACjB,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBACtD;AAEF,YAAA,KAAK,MAAM;AACT,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACvD;AAEF,YAAA,KAAK,QAAQ;AACb,YAAA,KAAK,oBAAoB;gBACvB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;gBACjF;AAEF,YAAA,KAAK,OAAO;AACZ,YAAA,KAAK,gBAAgB;AACnB,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBACxD;AAEF,YAAA,KAAK,eAAe;AAClB,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACvD;;IAEN;AAEA;;AAEG;IACH,SAAS,GAAA;AACP,QAAA,QAAQ,IAAI,CAAC,YAAY,EAAE;AACzB,YAAA,KAAK,KAAK;AACV,YAAA,KAAK,cAAc;AACjB,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;gBACvD;AAEF,YAAA,KAAK,MAAM;AACT,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;gBACxD;AAEF,YAAA,KAAK,QAAQ;AACb,YAAA,KAAK,oBAAoB;gBACvB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;gBAClF;AAEF,YAAA,KAAK,OAAO;AACZ,YAAA,KAAK,gBAAgB;AACnB,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;gBACzD;AAEF,YAAA,KAAK,eAAe;AAClB,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;gBACxD;;IAEN;AAEA;;;;AAIG;AACH,IAAA,mBAAmB,CAAC,CAA4B,EAAA;AAC9C,QAAA,IAAI,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;AAC3E,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,MAAM,EAAE;AAClC,YAAA,MAAM,gBAAgB,GAAG,WAAW,CAAC,SAAS;AAC9C,YAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,cAAc,EAAE;YACjD,MAAM,qBAAqB,GAAG,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,mBAAmB,CAAC;YAC3F,MAAM,cAAc,GAAG,CAAC,gBAAgB,GAAG,qBAAqB,GAAG,CAAC,IAAI,CAAC;YACzE,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,cAAc,CAAC;QACvD;QACA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE;AAC1C,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC;QACnC;AACA,QAAA,IAAI,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE;IACjC;AAEA;;AAEG;IACI,gBAAgB,GAAA;AACrB,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YAAE,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,0BAA0B,CAAC;;YACjF,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,0BAA0B,CAAC;QACpE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;IAC7C;AAEA;;;;AAIG;IACI,MAAM,OAAO,CAAC,YAAuC,EAAA;QAC1D,IAAI,YAAY,EAAE;AAChB,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;AACxD,gBAAA,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI;AAC3D,YAAA,CAAC,CAAC;AACF,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC;AACvC,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;YACxB;QACF;QACA,IAAI,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,UAAU,EAAE;AAC3C,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAkC;AAC9D,YAAA,MAAM,KAAK,GAAG;AACZ,gBAAA,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG;AACrB,gBAAA,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI;aACxB;YACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC;AAClC,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;YACxB;QACF;AACA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAA8B;AAC1D,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;IAC1B;+GAheW,oBAAoB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,qBAAA,EAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,wBAAA,EAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,UAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,0BAAA,EAAA,EAAA,iBAAA,EAAA,4BAAA,EAAA,UAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,EAAA,SAAA,EAFpB,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAWlD,oBAAoB,4MC3G5D,u2YAkQA,EAAA,MAAA,EAAA,CAAA,uxSAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDlLI,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACP,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,iBAAiB,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,UAAA,EAAA,MAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,YAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,kBAAkB,oSAClB,mBAAmB,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,KAAA,EAAA,UAAA,EAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,OAAA,EAAA,YAAA,EAAA,UAAA,EAAA,UAAA,EAAA,eAAA,EAAA,cAAA,EAAA,MAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,OAAA,EAAA,IAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,aAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,oBAAoB,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,MAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,eAAA,EAAA,cAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,SAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,oBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,wBAAwB,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,2BAA2B,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,WAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,MAAA,EAAA,YAAA,EAAA,cAAA,EAAA,0BAAA,EAAA,cAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,+BAAA,EAAA,iCAAA,EAAA,uBAAA,EAAA,2BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC3B,4BAA4B,ueAC5B,6BAA6B,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,WAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,MAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,+BAAA,EAAA,iCAAA,EAAA,uBAAA,EAAA,2BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC7B,8BAA8B,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,MAAA,EAAA,cAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,+BAAA,EAAA,iCAAA,EAAA,uBAAA,EAAA,2BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC9B,mCAAmC,qkBACnC,qCAAqC,EAAA,QAAA,EAAA,kCAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,WAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,4BAAA,EAAA,WAAA,EAAA,0BAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,+BAAA,EAAA,iCAAA,EAAA,uBAAA,EAAA,2BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrC,wCAAwC,EAAA,QAAA,EAAA,sCAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,YAAA,EAAA,0BAAA,EAAA,cAAA,EAAA,4BAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,+BAAA,EAAA,iCAAA,EAAA,uBAAA,EAAA,2BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxC,oCAAoC,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,WAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,4BAAA,EAAA,WAAA,EAAA,0BAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,4BAAA,EAAA,+BAAA,EAAA,iCAAA,EAAA,uBAAA,EAAA,2BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;4FAI3B,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAzBhC,SAAS;+BACE,cAAc,EAAA,eAAA,EAGP,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B;wBACP,OAAO;wBACP,WAAW;wBACX,iBAAiB;wBACjB,kBAAkB;wBAClB,mBAAmB;wBACnB,oBAAoB;wBACpB,wBAAwB;wBACxB,2BAA2B;wBAC3B,4BAA4B;wBAC5B,6BAA6B;wBAC7B,8BAA8B;wBAC9B,mCAAmC;wBACnC,qCAAqC;wBACrC,wCAAwC;wBACxC,oCAAoC;qBACrC,EAAA,SAAA,EACU,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAA,oBAAsB,EAAE,CAAC,EAAA,QAAA,EAAA,u2YAAA,EAAA,MAAA,EAAA,CAAA,uxSAAA,CAAA,EAAA;AAWlD,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAAA,oBAAoB,0EACF,iBAAiB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,qBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,wBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,0BAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,0BAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,4BAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,UAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,cAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,iBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,oBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,sBAAA,CAAA,EAAA,CAAA,EAAA,uBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,yBAAA,CAAA,EAAA,CAAA,EAAA,uBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,yBAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEjG3E,MAAM,SAAS,GAAG;IAChB,oBAAoB;IACpB,2BAA2B;IAC3B,4BAA4B;IAC5B,6BAA6B;IAC7B,8BAA8B;IAC9B,mCAAmC;IACnC,qCAAqC;IACrC,wCAAwC;IACxC,oCAAoC;CACrC;MAOY,iBAAiB,CAAA;+GAAjB,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,YAhB5B,oBAAoB;YACpB,2BAA2B;YAC3B,4BAA4B;YAC5B,6BAA6B;YAC7B,8BAA8B;YAC9B,mCAAmC;YACnC,qCAAqC;YACrC,wCAAwC;AACxC,YAAA,oCAAoC,aARpC,oBAAoB;YACpB,2BAA2B;YAC3B,4BAA4B;YAC5B,6BAA6B;YAC7B,8BAA8B;YAC9B,mCAAmC;YACnC,qCAAqC;YACrC,wCAAwC;YACxC,oCAAoC,CAAA,EAAA,CAAA,CAAA;AAQzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,YAJf,SAAS,CAAA,EAAA,CAAA,CAAA;;4FAIX,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAL7B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAC,GAAG,SAAS,CAAC;AACvB,oBAAA,OAAO,EAAE,CAAC,GAAG,SAAS,CAAC;AACvB,oBAAA,SAAS,EAAE,EAAE;AACd,iBAAA;;;AC3BD;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"acorex-components-scheduler.mjs","sources":["../../../../packages/components/scheduler/src/lib/scheduler.service.ts","../../../../packages/components/scheduler/src/lib/views/agenda/scheduler-agenda-view.component.ts","../../../../packages/components/scheduler/src/lib/views/agenda/scheduler-agenda-view.component.html","../../../../packages/components/scheduler/src/lib/views/day/scheduler-day-view.component.ts","../../../../packages/components/scheduler/src/lib/views/day/scheduler-day-view.component.html","../../../../packages/components/scheduler/src/lib/views/month/scheduler-month-view.component.ts","../../../../packages/components/scheduler/src/lib/views/month/scheduler-month-view.component.html","../../../../packages/components/scheduler/src/lib/views/timeline-day/scheduler-timeline-day-view.component.ts","../../../../packages/components/scheduler/src/lib/views/timeline-day/scheduler-timeline-day-view.component.html","../../../../packages/components/scheduler/src/lib/views/timeline-month/scheduler-timeline-month-view.component.ts","../../../../packages/components/scheduler/src/lib/views/timeline-month/scheduler-timeline-month-view.component.html","../../../../packages/components/scheduler/src/lib/views/timeline-multi-day/scheduler-timeline-multi-day-view.component.ts","../../../../packages/components/scheduler/src/lib/views/timeline-multi-day/scheduler-timeline-multi-day-view.component.html","../../../../packages/components/scheduler/src/lib/views/timeline-year/scheduler-timeline-year-view.component.ts","../../../../packages/components/scheduler/src/lib/views/timeline-year/scheduler-timeline-year-view.component.html","../../../../packages/components/scheduler/src/lib/views/week/scheduler-week-view.component.ts","../../../../packages/components/scheduler/src/lib/views/week/scheduler-week-view.component.html","../../../../packages/components/scheduler/src/lib/scheduler.component.ts","../../../../packages/components/scheduler/src/lib/scheduler.component.html","../../../../packages/components/scheduler/src/lib/scheduler.module.ts","../../../../packages/components/scheduler/src/acorex-components-scheduler.ts"],"sourcesContent":["import { AXCalendarService, AXDateTime, AXHolidayDate } from '@acorex/core/date-time';\nimport { AXFormatService } from '@acorex/core/format';\nimport { inject, Injectable, signal } from '@angular/core';\nimport { isEqual } from 'lodash-es';\nimport {\n AXDayOfWeekName,\n AXSchedulerActiveAppointmentsInBlock,\n AXSchedulerAppointment,\n AXSchedulerAppointmentSegment,\n AXSchedulerBlockIdentifier,\n AXSchedulerResource,\n AXSchedulerView,\n} from './scheduler.class';\nimport { AXSchedulerAppointmentMouseEvent, AXSchedulerSlotMouseEvent } from './scheduler.component';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXSchedulerService {\n private formatService = inject(AXFormatService);\n private calendarService = inject(AXCalendarService);\n\n readonly HOURS_PER_DAY = 24;\n readonly MINUTES_PER_HOUR = 60;\n readonly BLOCK_DURATION_MINUTES = 30;\n readonly MILLISECONDS_PER_MINUTE = 60 * 1000;\n readonly MILLISECONDS_PER_DAY = this.HOURS_PER_DAY * this.MINUTES_PER_HOUR * this.MILLISECONDS_PER_MINUTE;\n\n internalWeekend = signal<number[]>([]);\n internalHoliday = signal<AXHolidayDate[]>([]);\n\n /**\n * Checks if two appointments overlap in time.\n *\n * @param appointmentA - First appointment to check.\n * @param appointmentB - Second appointment to check.\n * @returns boolean - True if appointments overlap, false otherwise.\n */\n doAppointmentsOverlap(appointmentA: AXSchedulerAppointment, appointmentB: AXSchedulerAppointment): boolean {\n if (!appointmentA?.startDate || !appointmentA.endDate || !appointmentB?.startDate || !appointmentB.endDate) {\n return false;\n }\n const startA = appointmentA.startDate.getTime();\n const endA = appointmentA.endDate.getTime();\n const startB = appointmentB.startDate.getTime();\n const endB = appointmentB.endDate.getTime();\n // Uses strict overlap check (change < / > to <= / >= if touching boundaries count)\n return startA < endB && endA > startB;\n }\n\n /**\n * Calculates appointment duration in minutes.\n *\n * @param Appointment - The appointment to calculate duration for.\n * @returns number - Duration in minutes.\n */\n calculateDurationInMinutes(Appointment: AXSchedulerAppointment): number {\n if (!Appointment?.startDate || !Appointment.endDate) return 0;\n const durationMillis = Appointment.endDate.getTime() - Appointment.startDate.getTime();\n return Math.max(0, durationMillis / this.MILLISECONDS_PER_MINUTE);\n }\n\n /**\n * Gets the day index and block index for a given date time within the view context.\n *\n * @param dateTime - The date time to get block identifier for.\n * @param viewStartDate - Start date of the view.\n * @param startHour - Start hour of the view.\n * @param endHour - End hour of the view (exclusive).\n * @param viewTotalDays - Total days in the view (default: 1).\n * @returns AXSchedulerBlockIdentifier | null - Block identifier or null if outside view.\n */\n getBlockIdentifier(\n dateTime: AXDateTime,\n viewStartDate: AXDateTime,\n startHour: number,\n endHour: number, // Exclusive end hour\n viewTotalDays = 1, // Default to 1 for day view\n ): AXSchedulerBlockIdentifier | null {\n if (!viewStartDate || !dateTime || typeof startHour !== 'number' || typeof endHour !== 'number') {\n return null;\n }\n const viewEndDate = viewStartDate.add('day', viewTotalDays); // Calculate exclusive end date\n\n // Check if dateTime is within the view's date and time range\n if (\n dateTime.compare(viewStartDate, 'day') < 0 ||\n dateTime.compare(viewEndDate, 'day') >= 0 || // Check against exclusive end date\n dateTime.hour < startHour ||\n dateTime.hour >= endHour // Check against exclusive end hour\n ) {\n return null;\n }\n\n // Calculate day index relative to view start\n const dayIndex = Math.floor((dateTime.date.getTime() - viewStartDate.date.getTime()) / this.MILLISECONDS_PER_DAY);\n\n // Ensure dayIndex is valid for the view duration\n if (dayIndex < 0 || dayIndex >= viewTotalDays) {\n return null;\n }\n\n const minutesIntoDay = dateTime.hour * this.MINUTES_PER_HOUR + dateTime.minute;\n const minutesIntoViewHours = minutesIntoDay - startHour * this.MINUTES_PER_HOUR;\n\n // This check should be redundant due to initial hour check, but safe to keep\n if (minutesIntoViewHours < 0) return null;\n\n const blockIndex = Math.floor(minutesIntoViewHours / this.BLOCK_DURATION_MINUTES);\n\n return { dayIndex, blockIndex };\n }\n\n /**\n * Groups appointments by the blocks they are ACTIVE in for a given view.\n *\n * @param singleDayAppointments - Array of appointment segments.\n * @param viewStartDate - Start date of the view.\n * @param startHour - Start hour of the view.\n * @param endHour - End hour of the view.\n * @param viewTotalDays - Total days in the view.\n * @returns AXSchedulerActiveAppointmentsInBlock - Active appointments grouped by blocks.\n */\n private calculateActiveAppointmentsInBlock(\n singleDayAppointments: AXSchedulerAppointmentSegment[],\n viewStartDate: AXDateTime,\n startHour: number,\n endHour: number,\n viewTotalDays: number, // Now required\n ): AXSchedulerActiveAppointmentsInBlock {\n const blocks: AXSchedulerActiveAppointmentsInBlock = {};\n if (!viewStartDate || typeof startHour !== 'number' || typeof endHour !== 'number' || viewTotalDays <= 0) {\n return blocks;\n }\n const viewEndDate = viewStartDate.add('day', viewTotalDays); // Exclusive end date\n // Calculate total blocks based on consistent block duration\n const totalBlocksPerDay = Math.max(\n 0,\n (endHour - startHour) * (this.MINUTES_PER_HOUR / this.BLOCK_DURATION_MINUTES),\n );\n\n singleDayAppointments.forEach((appointment) => {\n if (!appointment.startDate || !appointment.endDate || !appointment.id) return;\n\n const appointmentEndDate = this.calendarService.create(appointment.endDate);\n const appointmentStartDate = this.calendarService.create(appointment.startDate);\n\n // Clamp appointment start/end times to the view boundaries (days and hours)\n let effectiveStart = appointmentStartDate.compare(viewStartDate) < 0 ? viewStartDate : appointmentStartDate;\n if (effectiveStart.hour < startHour) effectiveStart = effectiveStart.set('hour', startHour).startOf('hour');\n\n let effectiveEnd = appointmentEndDate.compare(viewEndDate) >= 0 ? viewEndDate : appointmentEndDate;\n if (effectiveEnd.hour >= endHour) {\n const endDayBase = effectiveEnd.compare(viewEndDate) >= 0 ? viewEndDate.add('day', -1) : effectiveEnd;\n effectiveEnd = endDayBase.set('hour', endHour).startOf('hour');\n }\n\n // Get start block info using the specified viewTotalDays\n const startInfo = this.getBlockIdentifier(effectiveStart, viewStartDate, startHour, endHour, viewTotalDays);\n if (!startInfo) return; // Appointment starts completely outside view\n\n // Get end block info (last block occupied) using the specified viewTotalDays\n const timeBeforeEnd = effectiveEnd.add('minute', -1);\n const endInfo = this.getBlockIdentifier(timeBeforeEnd, viewStartDate, startHour, endHour, viewTotalDays);\n // If endInfo is null, it means the appointment ends before the viewable part starts,\n // or exactly at the start, so it occupies no blocks. Handle this case.\n if (\n !endInfo ||\n endInfo.dayIndex < startInfo.dayIndex ||\n (endInfo.dayIndex === startInfo.dayIndex && endInfo.blockIndex < startInfo.blockIndex)\n ) {\n return; // Appointment effectively has no duration within the viewable blocks\n }\n\n // Iterate through the days and blocks the appointment spans within the view\n for (let dIdx = startInfo.dayIndex; dIdx <= endInfo.dayIndex; dIdx++) {\n // Clamp day index just in case (should be handled by getBlockIdentifier checks)\n if (dIdx < 0 || dIdx >= viewTotalDays) continue;\n\n const startBlock = dIdx === startInfo.dayIndex ? startInfo.blockIndex : 0;\n // Make sure endBlock doesn't exceed the calculated totalBlocksPerDay\n const endBlock = dIdx === endInfo.dayIndex ? endInfo.blockIndex : totalBlocksPerDay - 1;\n\n if (!blocks[dIdx]) blocks[dIdx] = {};\n\n for (let bIdx = startBlock; bIdx <= endBlock; bIdx++) {\n // Final check for block index validity\n if (bIdx >= 0 && bIdx < totalBlocksPerDay) {\n if (!blocks[dIdx][bIdx]) blocks[dIdx][bIdx] = [];\n // Avoid duplicates if the same appointment is processed multiple times (shouldn't happen with outer loop)\n if (!blocks[dIdx][bIdx].some((e) => e.id === appointment.id)) {\n blocks[dIdx][bIdx].push(appointment);\n }\n }\n }\n }\n });\n return blocks;\n }\n\n /**\n * Calculates day view concurrency information for appointments.\n *\n * @param singleDayAppointments - Array of appointment segments.\n * @param viewStartDate - Start date of the view.\n * @param startHour - Start hour of the view.\n * @param endHour - End hour of the view.\n * @returns Map<any, { maxConcurrency: number; effectiveTotalColumns: number }> - Concurrency information map.\n */\n calculateDayViewConcurrencyInfo(\n singleDayAppointments: AXSchedulerAppointmentSegment[], // These are segments for the current day\n viewStartDate: AXDateTime,\n startHour: number,\n endHour: number,\n ): Map<any, { maxConcurrency: number; effectiveTotalColumns: number }> {\n const resultInfo = new Map<any, { maxConcurrency: number; effectiveTotalColumns: number }>();\n if (singleDayAppointments.length === 0) return resultInfo;\n\n const activeAppointmentsMap = this.calculateActiveAppointmentsInBlock(\n singleDayAppointments,\n viewStartDate,\n startHour,\n endHour,\n 1, // Day view\n );\n const blocks = activeAppointmentsMap[0] ?? {};\n\n // 1. Calculate initial maxConcurrency for each appointment segment\n const maxConcurrencyMap = new Map<any, number>();\n singleDayAppointments.forEach((segment) => {\n let maxOverlapInSegmentBlocks = 0;\n const segmentStartMinutes = segment.startDate.getHours() * this.MINUTES_PER_HOUR + segment.startDate.getMinutes();\n const segmentEndMinutes = segment.endDate.getHours() * this.MINUTES_PER_HOUR + segment.endDate.getMinutes();\n\n // Determine blocks this segment occupies relative to view's startHour\n const viewRelativeStartMinutes = Math.max(0, segmentStartMinutes - startHour * this.MINUTES_PER_HOUR);\n const viewRelativeEndMinutes = Math.min(\n (endHour - startHour) * this.MINUTES_PER_HOUR,\n segmentEndMinutes - startHour * this.MINUTES_PER_HOUR,\n );\n\n const firstBlockIndex = Math.floor(viewRelativeStartMinutes / this.BLOCK_DURATION_MINUTES);\n const lastBlockIndex = Math.floor((viewRelativeEndMinutes - 1) / this.BLOCK_DURATION_MINUTES); // -1 because end is exclusive for block counting\n\n for (let blockIdx = firstBlockIndex; blockIdx <= lastBlockIndex; blockIdx++) {\n const appointmentsInBlock = blocks[blockIdx];\n if (appointmentsInBlock) {\n maxOverlapInSegmentBlocks = Math.max(maxOverlapInSegmentBlocks, appointmentsInBlock.length);\n }\n }\n maxConcurrencyMap.set(segment.id, maxOverlapInSegmentBlocks || 1);\n });\n\n // 2. Iteratively determine effectiveTotalColumns for groups of overlapping appointments\n const initialEffectiveTotalColumns = new Map<any, number>();\n singleDayAppointments.forEach((segment) => {\n initialEffectiveTotalColumns.set(segment.id, maxConcurrencyMap.get(segment.id) || 1);\n });\n\n let changed = true;\n while (changed) {\n changed = false;\n singleDayAppointments.forEach((segmentA) => {\n singleDayAppointments.forEach((segmentB) => {\n if (segmentA.id === segmentB.id) return;\n\n if (this.doAppointmentsOverlap(segmentA, segmentB)) {\n const etcA = initialEffectiveTotalColumns.get(segmentA.id) || 1;\n const etcB = initialEffectiveTotalColumns.get(segmentB.id) || 1;\n const maxETC = Math.max(etcA, etcB);\n\n if (etcA !== maxETC) {\n initialEffectiveTotalColumns.set(segmentA.id, maxETC);\n changed = true;\n }\n if (etcB !== maxETC) {\n initialEffectiveTotalColumns.set(segmentB.id, maxETC);\n changed = true;\n }\n }\n });\n });\n }\n\n // Populate final result\n singleDayAppointments.forEach((segment) => {\n resultInfo.set(segment.id, {\n maxConcurrency: maxConcurrencyMap.get(segment.id) || 1,\n effectiveTotalColumns: initialEffectiveTotalColumns.get(segment.id) || 1,\n });\n });\n\n return resultInfo;\n }\n\n /**\n * Groups appointments by day within a date range.\n *\n * @param appointments - Array of appointments.\n * @param viewStartDate - Start date of the view.\n * @param viewEndDate - End date of the view.\n * @returns Map<string, AXSchedulerAppointment[]> - Appointments grouped by day.\n */\n groupAppointmentsByDay(\n appointments: AXSchedulerAppointment[],\n viewStartDate: AXDateTime, // First day visible in the grid\n viewEndDate: AXDateTime, // Last day visible in the grid\n ): Map<string, AXSchedulerAppointment[]> {\n const groupedAppointments = new Map<string, AXSchedulerAppointment[]>();\n if (!appointments || appointments.length === 0 || !viewStartDate || !viewEndDate) {\n return groupedAppointments;\n }\n\n // Pre-calculate the end date for comparison (exclusive)\n const exclusiveViewEndDate = viewEndDate.add('day', 1);\n\n appointments.forEach((appointment) => {\n if (!appointment.startDate || !appointment.endDate || !appointment.id) return;\n\n // Determine the effective start and end dates of the appointment clamped by the view range\n const appointmentStart = this.calendarService.create(appointment.startDate);\n const appointmentEnd = this.calendarService.create(appointment.endDate);\n\n // Skip if appointment ends before the view starts or starts after the view ends\n if (\n appointmentEnd.compare(viewStartDate, 'day') < 0 ||\n appointmentStart.compare(exclusiveViewEndDate, 'day') >= 0\n ) {\n return;\n }\n\n // Clamp start date to the view start date\n let currentDay =\n appointmentStart.compare(viewStartDate, 'day') < 0 ? viewStartDate : appointmentStart.startOf('day');\n\n // Loop through each day the appointment spans within the view range\n let safeCount = 0; // Prevent infinite loops\n while (\n currentDay.compare(appointmentEnd, 'day') <= 0 &&\n currentDay.compare(exclusiveViewEndDate, 'day') < 0 &&\n safeCount < 100\n ) {\n const dateString = this.formatService.format(currentDay, 'datetime', { format: 'YYYY-MM-DD' }); // Use a consistent key format\n\n if (!groupedAppointments.has(dateString)) {\n groupedAppointments.set(dateString, []);\n }\n // Add the appointment if it's not already in the list for that day\n if (!groupedAppointments.get(dateString).some((e) => e.id === appointment.id)) {\n groupedAppointments.get(dateString).push(appointment);\n }\n\n currentDay = currentDay.add('day', 1);\n safeCount++;\n }\n if (safeCount >= 100) {\n console.warn('Safety break hit in groupAppointmentsByDay loop for appointment:', appointment.id);\n }\n });\n\n return groupedAppointments;\n }\n\n /**\n * Gets the day of week number for a given day name.\n *\n * @param dayName - The day name to get number for.\n * @returns number - Day number (1-7, where 1 is Sunday).\n */\n getDayOfWeekNumber(dayName: AXDayOfWeekName): number {\n switch (dayName) {\n case 'sunday':\n return 1;\n case 'monday':\n return 2;\n case 'tuesday':\n return 3;\n case 'wednesday':\n return 4;\n case 'thursday':\n return 5;\n case 'friday':\n return 6;\n case 'saturday':\n return 7;\n default:\n console.warn(`Invalid day name: ${dayName}. Defaulting to Sunday (1).`);\n return 1;\n }\n }\n\n /**\n * Gets slot data for a given start date and view.\n *\n * @param startDate - Start date for the slot.\n * @param view - View type.\n * @returns { startDate: AXDateTime; endDate: AXDateTime; view: AXSchedulerView } - Slot data.\n */\n getSlotData(\n startDate: AXDateTime,\n view: AXSchedulerView,\n ): { startDate: AXDateTime; endDate: AXDateTime; view: AXSchedulerView } {\n let endDate: AXDateTime;\n switch (view) {\n case 'day':\n case 'week':\n endDate = startDate.add('minute', this.BLOCK_DURATION_MINUTES);\n break;\n case 'timeline-day':\n case 'timeline-multi-day':\n endDate = startDate.add('minute', this.BLOCK_DURATION_MINUTES * 2);\n break;\n case 'month':\n case 'agenda':\n case 'timeline-month':\n case 'timeline-year':\n startDate = startDate.startOf('day');\n endDate = startDate.endOf('day');\n break;\n }\n return { startDate, endDate, view };\n }\n\n /**\n * Handles events for appointments and slots.\n *\n * @param event - The event to handle.\n * @param eventOutputMap - Map of event outputs.\n * @param eventType - Type of event ('appointment' or 'slot').\n */\n handleEvent(\n event: AXSchedulerSlotMouseEvent | AXSchedulerAppointmentMouseEvent,\n eventOutputMap,\n eventType: 'appointment' | 'slot',\n ) {\n const mouseEvent = event.nativeEvent;\n mouseEvent.preventDefault();\n mouseEvent.stopPropagation();\n if (eventType === 'appointment') {\n const appointmentOutputMap = eventOutputMap[eventType];\n const emitter = appointmentOutputMap[mouseEvent.type as keyof typeof appointmentOutputMap];\n if (emitter) emitter.emit(event as AXSchedulerAppointmentMouseEvent);\n }\n if (eventType === 'slot') {\n const slotOutputMap = eventOutputMap[eventType];\n const emitter = slotOutputMap[mouseEvent.type as keyof typeof slotOutputMap];\n if (emitter) emitter.emit(event as AXSchedulerSlotMouseEvent);\n }\n }\n\n /**\n * Calculates timeline layout for appointments.\n *\n * @param appt - The appointment to calculate layout for.\n * @param viewStartHour - Start hour of the view.\n * @param viewEndHour - End hour of the view.\n * @returns { left: string; width: string } | null - Layout information or null.\n */\n calculateTimelineLayout(\n // `appt` here will be an AXSchedulerAppointmentSegmentType when called from TimelineDayView\n appt: AXSchedulerAppointment,\n viewStartHour: number, // e.g., 8 for 8 AM\n viewEndHour: number, // e.g., 18 for 6 PM (timeline runs from 8:00 up to, but not including, 18:00)\n ): { left: string; width: string } | null {\n if (\n !appt?.startDate ||\n !appt.endDate ||\n typeof viewStartHour !== 'number' ||\n typeof viewEndHour !== 'number' ||\n viewStartHour >= viewEndHour // Basic sanity check\n ) {\n console.warn('calculateTimelineLayout: Invalid input', { appt, viewStartHour, viewEndHour });\n return null;\n }\n\n const totalViewDurationMinutes = (viewEndHour - viewStartHour) * 60;\n if (totalViewDurationMinutes <= 0) return null; // No viewable duration\n\n // Segment's start and end times (these are already clipped to the day by getClonedAppointmentSegmentOnDay)\n const segmentStart = appt.startDate;\n const segmentEnd = appt.endDate;\n\n // --- Calculate Start Position (left) ---\n // Effective start of the segment within the view's hours for THIS day\n let effectiveSegmentStartMinutesInDay = segmentStart.getHours() * 60 + segmentStart.getMinutes();\n\n // Clamp to viewStartHour for calculation if segment starts before viewable hours (shouldn't happen if segmenter worked)\n effectiveSegmentStartMinutesInDay = Math.max(effectiveSegmentStartMinutesInDay, viewStartHour * 60);\n // Clamp to viewEndHour for calculation if segment starts after viewable hours (shouldn't happen)\n effectiveSegmentStartMinutesInDay = Math.min(effectiveSegmentStartMinutesInDay, viewEndHour * 60);\n\n const minutesFromViewStartToSegmentStart = effectiveSegmentStartMinutesInDay - viewStartHour * 60;\n\n // If segment effectively starts before the viewable part (after clamping), it means it's not visible or starts at 0%\n if (\n minutesFromViewStartToSegmentStart < 0 &&\n Math.abs(minutesFromViewStartToSegmentStart) > 1e-6 /*epsilon for float issues*/\n ) {\n // This case should ideally be caught by the segmenter or initial overlap checks.\n // If it happens, treat as starting at 0% but it might mean no visible part.\n }\n\n const leftPercentage = (Math.max(0, minutesFromViewStartToSegmentStart) / totalViewDurationMinutes) * 100;\n\n // --- Calculate Duration and Width ---\n // Effective end of the segment within the view's hours for THIS day\n let effectiveSegmentEndMinutesInDay = segmentEnd.getHours() * 60 + segmentEnd.getMinutes();\n if (segmentEnd.getHours() === 0 && segmentEnd.getMinutes() === 0 && segmentEnd.getTime() > segmentStart.getTime()) {\n // If segment ends exactly at midnight (00:00 of next day, meaning it filled up to 24:00 of current day)\n effectiveSegmentEndMinutesInDay = 24 * 60;\n }\n\n // Clamp to viewEndHour for calculation\n effectiveSegmentEndMinutesInDay = Math.min(effectiveSegmentEndMinutesInDay, viewEndHour * 60);\n // Clamp to viewStartHour for calculation (if segment ends before view starts)\n effectiveSegmentEndMinutesInDay = Math.max(effectiveSegmentEndMinutesInDay, viewStartHour * 60);\n\n const segmentDurationMinutesInView = Math.max(\n 0,\n effectiveSegmentEndMinutesInDay - effectiveSegmentStartMinutesInDay,\n );\n\n if (segmentDurationMinutesInView <= 0) {\n // Segment has no visible duration within the timeline hours\n return null;\n }\n\n const widthPercentage = (segmentDurationMinutesInView / totalViewDurationMinutes) * 100;\n\n // Ensure percentages are valid\n if (\n leftPercentage > 100 ||\n leftPercentage < 0 ||\n widthPercentage <= 0 ||\n widthPercentage > 100 ||\n leftPercentage + widthPercentage > 100.0001 /*allow for float errors*/\n ) {\n // This might indicate an issue with date clamping or logic.\n // For now, if it results in an invalid layout, return null.\n // console.warn(\"Timeline layout calculation resulted in out-of-bounds percentages:\",\n // {leftPercentage, widthPercentage, segmentStart, segmentEnd, viewStartHour, viewEndHour});\n // A common case for (left + width > 100) is if an event ends *exactly* at viewEndHour,\n // and viewEndHour itself is the boundary.\n // Let's be a bit tolerant here if width is positive.\n if (widthPercentage <= 0) return null;\n }\n\n return {\n left: `${Math.max(0, Math.min(100, leftPercentage))}%`,\n width: `${Math.max(0, Math.min(100, widthPercentage))}%`,\n };\n }\n\n /**\n * Gets cloned appointment segment for a specific day.\n *\n * @param appointment - The appointment to clone.\n * @param day - The day to get segment for.\n * @param viewStartHour - Start hour of the view.\n * @param viewEndHour - End hour of the view.\n * @param isFullDayCellContext - Whether this is for full day cell context.\n * @returns AXSchedulerAppointmentSegment | null - Cloned segment or null.\n */\n getClonedAppointmentSegmentOnDay(\n appointment: AXSchedulerAppointment, // This is the ORIGINAL appointment\n day: AXDateTime,\n viewStartHour: number,\n viewEndHour: number,\n isFullDayCellContext = false,\n ): AXSchedulerAppointmentSegment | null {\n if (!appointment || !appointment.startDate || !appointment.endDate) {\n return null;\n }\n\n const appointmentStartDate = this.calendarService.create(appointment.startDate);\n const appointmentEndDate = this.calendarService.create(appointment.endDate);\n\n if (appointment.allDay) {\n const dayStartOf = day.clone().startOf('day');\n const appointmentStartDay = appointmentStartDate.startOf('day');\n const appointmentEndDay = appointmentEndDate.startOf('day');\n\n // Check if the appointment overlaps with the current day\n if (appointmentStartDay.compare(dayStartOf, 'day') <= 0 && appointmentEndDay.compare(dayStartOf, 'day') >= 0) {\n const isContinuationFromPreviousDay = appointmentStartDay.compare(dayStartOf, 'day') < 0;\n const isContinuationToNextDay = appointmentEndDay.compare(dayStartOf, 'day') > 0;\n\n return {\n ...appointment,\n startDate: dayStartOf.date,\n endDate: dayStartOf.clone().add('day', 1).startOf('day').date,\n allDay: true,\n originalStartDate: appointmentStartDate.date,\n originalEndDate: appointmentEndDate.date,\n isContinuationFromPreviousDay,\n isContinuationToNextDay,\n originalAppointmentRef: appointment,\n };\n } else {\n return null;\n }\n }\n\n const dayStartBoundary = isFullDayCellContext\n ? day.clone().startOf('day')\n : day.clone().set('hour', viewStartHour).startOf('hour');\n const dayEndBoundary = isFullDayCellContext\n ? day.clone().add('day', 1).startOf('day')\n : viewEndHour === 24 || (viewEndHour === 0 && viewStartHour === 0)\n ? day.clone().add('day', 1).startOf('day')\n : day.clone().set('hour', viewEndHour).startOf('hour');\n\n if (\n appointmentEndDate.compare(dayStartBoundary, 'second') <= 0 ||\n appointmentStartDate.compare(dayEndBoundary, 'second') >= 0\n ) {\n return null;\n }\n const segmentStartDate =\n appointmentStartDate.compare(dayStartBoundary, 'second') > 0 ? appointmentStartDate : dayStartBoundary;\n const segmentEndDate =\n appointmentEndDate.compare(dayEndBoundary, 'second') < 0 ? appointmentEndDate : dayEndBoundary;\n\n if (segmentStartDate.compare(segmentEndDate, 'second') >= 0) {\n return null;\n }\n\n const isContinuationFromPreviousDay = appointmentStartDate.compare(segmentStartDate, 'second') < 0;\n const isContinuationToNextDay = appointmentEndDate.compare(segmentEndDate, 'second') > 0;\n const duration = appointmentStartDate.duration(appointmentEndDate);\n\n return {\n ...appointment,\n startDate: segmentStartDate.date,\n endDate: segmentEndDate.date,\n allDay: appointment.allDay || duration.total.miliseconds >= 24 * 60 * 60 * 1000 - 1,\n originalStartDate: appointmentStartDate.date,\n originalEndDate: appointmentEndDate.date,\n isContinuationFromPreviousDay,\n isContinuationToNextDay,\n originalAppointmentRef: appointment,\n };\n }\n\n /**\n * Gets the original appointment from a segment.\n *\n * @param item - Appointment or appointment segment.\n * @returns AXSchedulerAppointment - The original appointment.\n */\n getOriginalAppointment(item: AXSchedulerAppointment | AXSchedulerAppointmentSegment): AXSchedulerAppointment {\n const segment = item as AXSchedulerAppointmentSegment;\n if (segment.originalAppointmentRef) {\n return segment.originalAppointmentRef;\n }\n return item;\n }\n\n /**\n * Checks if a date is a holiday.\n *\n * @param date - The date to check.\n * @returns boolean - True if the date is a holiday.\n */\n isHoliday(date: AXDateTime): boolean {\n const globalHolidays = this.calendarService.holidays.some((d) => date.equal(d.date, 'day'));\n const internalHolidays = this.internalHoliday().some((d) => date.equal(d.date, 'day'));\n return globalHolidays || internalHolidays;\n }\n\n /**\n * Checks if a date is a weekend.\n *\n * @param date - The date to check.\n * @param calendar - The calendar type to use.\n * @returns boolean - True if the date is a weekend.\n */\n isWeekend(date: AXDateTime, calendar: string): boolean {\n const internalWeekend = this.internalWeekend();\n const globalWeekend = this.calendarService.resolveCalendar(calendar).weekend;\n if (internalWeekend.length === 0) {\n return globalWeekend.includes(date.dayOfWeek - 1);\n }\n return this.internalWeekend().includes(date.dayOfWeek - 1);\n }\n\n /**\n * Filters appointments by resources and unassigned appointments.\n *\n * @param appointments - Array of appointments to filter.\n * @param resources - Array of resources.\n * @param showUnassignedAppointments - Whether to show appointments without resources.\n * @returns Map<any, AXSchedulerAppointment[]> - Appointments grouped by resource ID.\n */\n filterAppointmentsByResources(\n appointments: AXSchedulerAppointment[],\n resources: AXSchedulerResource[],\n showUnassignedAppointments = true,\n ): Map<any, AXSchedulerAppointment[]> {\n const result = new Map<any, AXSchedulerAppointment[]>();\n\n if (!resources || resources.length === 0) {\n // If no resources, return all appointments under a default key\n result.set('default', appointments);\n return result;\n }\n\n // Initialize result map with empty arrays for each resource\n resources.forEach((resource) => {\n result.set(resource.id, []);\n });\n\n // Add unassigned appointments key if needed\n if (showUnassignedAppointments) {\n result.set('unassigned', []);\n }\n\n // Group appointments by resource\n appointments.forEach((appointment) => {\n if (appointment.resourceId !== undefined && appointment.resourceId !== null) {\n // Find matching resource using isEqual for proper comparison\n let foundResource = false;\n for (const [key, resourceAppointments] of result.entries()) {\n if (key !== 'unassigned' && isEqual(key, appointment.resourceId)) {\n resourceAppointments.push(appointment);\n foundResource = true;\n break;\n }\n }\n\n if (!foundResource && showUnassignedAppointments) {\n // If resource doesn't exist in the resources array, treat as unassigned\n result.get('unassigned').push(appointment);\n }\n } else if (showUnassignedAppointments) {\n result.get('unassigned').push(appointment);\n }\n });\n\n return result;\n }\n\n /**\n * Gets appointments for a specific resource.\n *\n * @param appointments - Array of appointments.\n * @param resourceId - The resource ID to filter by.\n * @returns AXSchedulerAppointment[] - Filtered appointments.\n */\n getAppointmentsForResource(appointments: AXSchedulerAppointment[], resourceId: any): AXSchedulerAppointment[] {\n if (resourceId === 'unassigned') {\n return appointments.filter(\n (appointment) => appointment.resourceId === undefined || appointment.resourceId === null,\n );\n }\n return appointments.filter((appointment) => isEqual(appointment.resourceId, resourceId));\n }\n\n /**\n * Gets all resource IDs including unassigned if applicable.\n *\n * @param resources - Array of resources.\n * @param showUnassignedAppointments - Whether to include unassigned appointments.\n * @returns string[] - Array of resource IDs.\n */\n getAllResourceIds(resources: AXSchedulerResource[], showUnassignedAppointments = true): any[] {\n const resourceIds = resources.map((resource) => resource.id);\n if (showUnassignedAppointments) {\n resourceIds.push('unassigned');\n }\n return resourceIds;\n }\n}\n","import { AXComponent, NXComponent } from '@acorex/cdk/common';\nimport { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXCalendarService, AXDateTime, AXHolidayDate } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe, NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n HostBinding,\n TemplateRef,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { orderBy } from 'lodash-es';\nimport { AXSchedulerAppointment, AXSchedulerAppointmentSegment } from '../../scheduler.class';\nimport {\n AXSchedulerAppointmentMouseEvent,\n AXSchedulerComponent,\n AXSchedulerSlotDropEvent,\n AXSchedulerSlotMouseEvent,\n} from '../../scheduler.component';\nimport { AXSchedulerService } from '../../scheduler.service';\n\nexport interface AgendaDayData {\n date: AXDateTime;\n appointments: AXSchedulerAppointmentSegment[];\n holiday?: { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate };\n}\n\n@Component({\n selector: 'ax-scheduler-agenda-view',\n templateUrl: './scheduler-agenda-view.component.html',\n styleUrl: './scheduler-agenda-view.component.compiled.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n NgClass,\n AsyncPipe,\n AXFormatPipe,\n AXDragDirective,\n AXTranslatorPipe,\n AXTooltipDirective,\n AXDropZoneDirective,\n AXDecoratorIconComponent,\n AXDecoratorGenericComponent,\n ],\n providers: [{ provide: AXComponent, useExisting: AXSchedulerAgendaViewComponent }],\n})\nexport class AXSchedulerAgendaViewComponent extends NXComponent {\n private document = inject(DOCUMENT);\n private scheduler = inject(AXSchedulerComponent);\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n\n daysCount = input(7);\n readonly = input(false);\n draggable = input(true);\n hasActions = input(false);\n dragStartDelay = input(0);\n calendar = input<string>();\n date = input.required<AXDateTime>();\n appointments = input<AXSchedulerAppointment[]>([]);\n tooltipTemplate = input<string | TemplateRef<unknown>>();\n\n private dragStartSlotId = signal<string | null>(null);\n\n protected agendaDaysLayout = computed<AgendaDayData[]>(() => {\n const allOriginalAppointments = this.appointments();\n const agendaStartDate = this.date();\n const numberOfDays = this.daysCount();\n\n if (!agendaStartDate || !allOriginalAppointments) {\n return [];\n }\n\n const result: AgendaDayData[] = [];\n\n for (let i = 0; i < numberOfDays; i++) {\n const currentDay = agendaStartDate.add('day', i).startOf('day');\n const segmentsForThisDay: AXSchedulerAppointmentSegment[] = [];\n\n for (const appt of allOriginalAppointments) {\n const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(appt, currentDay, 0, 24, true);\n if (segment) {\n segmentsForThisDay.push(segment);\n }\n }\n\n const sortedSegments = orderBy(\n segmentsForThisDay,\n [\n (s) => (s.allDay ? 0 : 1),\n (s) => s.startDate.getTime(),\n (s) => s.originalEndDate.getTime() - s.originalStartDate.getTime(),\n ],\n ['asc', 'asc', 'desc'],\n );\n\n result.push({\n date: currentDay,\n appointments: sortedSegments,\n holiday: this.isHoliday(currentDay),\n });\n }\n return result;\n });\n\n // Internal outputs to be caught by parent AXSchedulerComponent\n slotClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotMouseEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n onActionClickInternal = output<AXSchedulerAppointmentMouseEvent>();\n onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n // --- Event Handlers ---\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n protected handleAppointmentEvent(mouseEvent: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n const appointmentRef = {\n ...originalAppointment,\n endDate: originalAppointment.endDate,\n startDate: originalAppointment.startDate,\n };\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, appointment: appointmentRef, sender: this.scheduler },\n this.eventOutputMap,\n 'appointment',\n );\n }\n protected handleSlotEvent(mouseEvent: MouseEvent, date: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(date.startOf('day'), 'agenda');\n if (slotData) {\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n this.eventOutputMap,\n 'slot',\n );\n }\n }\n protected handleDrop(e: AXDropZoneDropEvent, date: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(date.startOf('day'), 'agenda');\n const droppedItem = e.dropped.dragData() as AXSchedulerAppointment;\n const originalAppointment = this.schedulerService.getOriginalAppointment(droppedItem);\n const appointmentRef = {\n ...originalAppointment,\n endDate: originalAppointment.endDate,\n startDate: originalAppointment.startDate,\n };\n this.onAppointmentDropInternal.emit({\n dropEvent: e,\n slot: slotData,\n sender: this.scheduler,\n appointment: appointmentRef,\n isSameSlotDrop: this.dragStartSlotId() === e.sender.element().dataset['slotId'],\n });\n }\n protected handleActionClick(event: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n event.stopPropagation();\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n this.onActionClickInternal.emit({\n appointment: originalAppointment,\n nativeEvent: event,\n sender: this.scheduler,\n });\n }\n\n protected isToday(date: AXDateTime): boolean {\n const today = this.calendarService.create(new Date());\n return date.equal(today, 'day');\n }\n protected isHoliday(date: AXDateTime): { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate } {\n const isHoliday = this.schedulerService.isHoliday(date);\n if (isHoliday) {\n const globalHoliday = this.calendarService.holidays.find((d) => date.equal(d.date, 'day'));\n const internalHoliday = this.schedulerService.internalHoliday().find((d) => date.equal(d.date, 'day'));\n const holiday = globalHoliday || internalHoliday;\n return {\n state: 'holiday',\n holiday,\n };\n }\n const isWeekend = this.schedulerService.isWeekend(date, this.calendar());\n if (isWeekend) {\n return { state: 'weekend' };\n }\n return { state: 'none' };\n }\n\n protected getSlotId(e: PointerEvent) {\n const dropListElement = this.document\n .elementsFromPoint(e.clientX, e.clientY)\n .find((el): el is HTMLElement => el instanceof HTMLElement && el.dataset['slotId'] !== undefined);\n this.dragStartSlotId.set(dropListElement ? dropListElement.dataset['slotId'] : null);\n }\n\n @HostBinding('class.ax-state-readonly')\n protected get isReadonly() {\n return this.readonly();\n }\n}\n","<div class=\"ax-scheduler-agenda-container\">\n @for (dayData of agendaDaysLayout(); track dayData.date.date.getTime()) {\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleDrop($event, dayData.date)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n [class.ax-state-today]=\"isToday(dayData.date)\"\n class=\"ax-scheduler-agenda-view-container {{\n dayData.holiday.state !== 'none' ? (dayData.holiday.holiday?.cssClass ?? 'ax-state-holiday') : ''\n }}\"\n (click)=\"handleSlotEvent($event, dayData.date)\"\n (dblclick)=\"handleSlotEvent($event, dayData.date)\"\n (contextmenu)=\"handleSlotEvent($event, dayData.date)\"\n [attr.data-slot-id]=\"dayData.date.format('YYYYMMDD')\"\n >\n <div class=\"ax-scheduler-agenda-header-date-day\">\n <span\n class=\"ax-scheduler-agenda-header-date-day-char ax-scheduler-truncate\"\n [axTooltip]=\"dayData.holiday?.holiday?.title ?? ''\"\n [axTooltipPlacement]=\"'top-start'\"\n >\n {{ dayData.date | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n @if (dayData.holiday.state === 'holiday' && dayData.holiday.holiday.title) {\n ( {{ dayData.holiday.holiday.title }} )\n }\n </span>\n <span class=\"ax-scheduler-agenda-header-date-day-num\">\n {{ dayData.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n </span>\n </div>\n <div class=\"ax-scheduler-agenda-appointment-container\">\n @for (segment of dayData.appointments; track segment.id + segment.originalStartDate.getTime()) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"segment\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n (pointerdown)=\"getSlotId($event)\"\n (click)=\"handleAppointmentEvent($event, segment)\"\n (dblclick)=\"handleAppointmentEvent($event, segment)\"\n (contextmenu)=\"handleAppointmentEvent($event, segment)\"\n [title]=\"\n tooltipTemplate()\n ? ''\n : segment.title +\n (segment.allDay\n ? ' (All Day)'\n : ' (' +\n (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n ' - ' +\n (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n ')')\n \"\n class=\"ax-scheduler-agenda-appointment\"\n [class.all-day-segment]=\"segment.allDay\"\n [ngClass]=\"segment.cssClass ?? `ax-scheduler-${segment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltip]=\"tooltipTemplate()\"\n [axTooltipContext]=\"segment\"\n >\n <div class=\"ax-scheduler-agenda-appointment-time\">\n @if (segment.allDay) {\n <span>{{ '@acorex:dateTime.duration.all-day' | translate | async }}</span>\n } @else {\n <span>\n {{ segment.originalStartDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n -\n {{ segment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </span>\n }\n </div>\n <ax-title class=\"ax-scheduler-agenda-appointment-title ax-scheduler-truncate\">{{ segment.title }}</ax-title>\n <!-- Description could go here if needed -->\n <!-- @if (segment.description) {\n <ax-subtitle>{{ segment.description }}</ax-subtitle>\n } -->\n @if (hasActions()) {\n <ax-icon\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n (click)=\"handleActionClick($event, segment)\"\n >\n </ax-icon>\n }\n </div>\n }\n @if (dayData.appointments.length === 0) {\n <div class=\"ax-scheduler-agenda-no-appointments\">\n {{ '@acorex:common.general.no-record' | translate | async }}\n </div>\n }\n </div>\n </div>\n }\n</div>\n","import { AXComponent, NXComponent } from '@acorex/cdk/common';\nimport { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXCalendarService, AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe, NgClass } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n DOCUMENT,\n ElementRef,\n HostBinding,\n inject,\n input,\n output,\n signal,\n TemplateRef,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { orderBy } from 'lodash-es';\nimport {\n AXSchedulerAppointment,\n AXSchedulerAppointmentSegment,\n AXSchedulerDayAppointmentLayout,\n} from '../../scheduler.class';\nimport {\n AXSchedulerAppointmentMouseEvent,\n AXSchedulerComponent,\n AXSchedulerSlotDropEvent,\n AXSchedulerSlotMouseEvent,\n} from '../../scheduler.component';\nimport { AXSchedulerService } from '../../scheduler.service';\n\n@Component({\n selector: 'ax-scheduler-day-view',\n templateUrl: './scheduler-day-view.component.html',\n styleUrl: './scheduler-day-view.component.compiled.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n NgClass,\n AsyncPipe,\n AXFormatPipe,\n AXDragDirective,\n AXTranslatorPipe,\n AXPopoverComponent,\n AXTooltipDirective,\n AXDropZoneDirective,\n AXDecoratorIconComponent,\n AXDecoratorGenericComponent,\n ],\n providers: [{ provide: AXComponent, useExisting: AXSchedulerDayViewComponent }],\n})\nexport class AXSchedulerDayViewComponent extends NXComponent implements AfterViewInit {\n private document = inject(DOCUMENT);\n private scheduler = inject(AXSchedulerComponent);\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n\n readonly GAP_PX = 1;\n\n readonly = input(false);\n draggable = input(true);\n hasActions = input(false);\n dragStartDelay = input(0);\n calendar = input<string>();\n date = input.required<AXDateTime>();\n endDayHour = input.required<number>();\n startDayHour = input.required<number>();\n showCurrentTimeIndicator = input<boolean>(true);\n appointments = input<AXSchedulerAppointment[]>([]);\n tooltipTemplate = input<string | TemplateRef<unknown>>();\n\n // ViewChild for current time line element\n currentTimeLineElement = viewChild<ElementRef<HTMLElement>>('currentTimeLine');\n\n private dragStartSlotId = signal<string | null>(null);\n\n private processedAppointmentsForLayout = computed(() => {\n const viewDate = this.date();\n const startH = this.startDayHour();\n const endH = this.endDayHour();\n const allAppointmentsInView = this.appointments();\n if (!viewDate || allAppointmentsInView.length === 0) {\n return [];\n }\n const segmentsForThisDay: AXSchedulerAppointmentSegment[] = [];\n for (const appt of allAppointmentsInView) {\n const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(appt, viewDate, startH, endH);\n if (segment) {\n segmentsForThisDay.push(segment);\n }\n }\n return segmentsForThisDay;\n });\n protected allDayAppointments = computed(() => {\n const originalAllDayAppointments = this.appointments()?.filter((e) => e && e.allDay) ?? [];\n const multiDayBecomingAllDaySegments =\n this.processedAppointmentsForLayout()?.filter(\n (segment) => segment && segment.allDay && !this.appointments().find((orig) => orig.id === segment.id)?.allDay,\n ) ?? [];\n const combined = new Map<any, AXSchedulerAppointment>();\n originalAllDayAppointments.forEach((appt) => combined.set(appt.id, appt));\n multiDayBecomingAllDaySegments.forEach((appt) => {\n if (!combined.has(appt.id)) {\n combined.set(appt.id, appt);\n }\n });\n return Array.from(combined.values());\n });\n protected singleDayAppointments = computed(() => {\n return this.processedAppointmentsForLayout()?.filter((e) => e && !e.allDay) ?? [];\n });\n\n slotClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotMouseEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n onActionClickInternal = output<AXSchedulerAppointmentMouseEvent>();\n onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n protected handleAppointmentEvent(mouseEvent: MouseEvent, appointment: AXSchedulerAppointment) {\n const originalAppointment = (appointment as AXSchedulerAppointmentSegment).originalStartDate\n ? ({\n ...appointment,\n startDate: (appointment as AXSchedulerAppointmentSegment).originalStartDate,\n endDate: (appointment as AXSchedulerAppointmentSegment).originalEndDate,\n } as AXSchedulerAppointment)\n : appointment;\n const appointmentRef = {\n ...originalAppointment,\n endDate: originalAppointment.endDate,\n startDate: originalAppointment.startDate,\n };\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, appointment: appointmentRef, sender: this.scheduler },\n this.eventOutputMap,\n 'appointment',\n );\n }\n protected handleSingleSlotEvent(mouseEvent: MouseEvent, startDate: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(startDate, 'day');\n if (slotData)\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n this.eventOutputMap,\n 'slot',\n );\n }\n protected handleAllDaySlotEvent(mouseEvent: MouseEvent) {\n const endDate = this.date().endOf('day');\n const startDate = this.date().startOf('day');\n const slotData = { startDate, endDate, view: 'day' as const };\n if (slotData)\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n this.eventOutputMap,\n 'slot',\n );\n }\n protected handleAllDayDrop(e: AXDropZoneDropEvent) {\n const endDate = this.date().endOf('day');\n const startDate = this.date().startOf('day');\n const slotData = { startDate, endDate, view: 'day' as const };\n\n const droppedAppt = e.dropped.dragData() as AXSchedulerAppointment;\n const originalDroppedAppt = (droppedAppt as AXSchedulerAppointmentSegment).originalStartDate\n ? ({\n ...droppedAppt,\n startDate: (droppedAppt as AXSchedulerAppointmentSegment).originalStartDate,\n endDate: (droppedAppt as AXSchedulerAppointmentSegment).originalEndDate,\n } as AXSchedulerAppointment)\n : droppedAppt;\n const appointmentRef = {\n ...originalDroppedAppt,\n endDate: originalDroppedAppt.endDate,\n startDate: originalDroppedAppt.startDate,\n };\n this.onAppointmentDropInternal.emit({\n dropEvent: e,\n slot: slotData,\n sender: this.scheduler,\n appointment: appointmentRef,\n isSameSlotDrop: this.dragStartSlotId() === e.sender.element().dataset['slotId'],\n });\n }\n protected handleSingleDayDrop(e: AXDropZoneDropEvent, startDate: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(startDate, 'day');\n const droppedAppt = e.dropped.dragData() as AXSchedulerAppointment;\n const originalDroppedAppt = (droppedAppt as AXSchedulerAppointmentSegment).originalStartDate\n ? ({\n ...droppedAppt,\n startDate: (droppedAppt as AXSchedulerAppointmentSegment).originalStartDate,\n endDate: (droppedAppt as AXSchedulerAppointmentSegment).originalEndDate,\n } as AXSchedulerAppointment)\n : droppedAppt;\n const appointmentRef = {\n ...originalDroppedAppt,\n endDate: originalDroppedAppt.endDate,\n startDate: originalDroppedAppt.startDate,\n };\n this.onAppointmentDropInternal.emit({\n dropEvent: e,\n slot: slotData,\n sender: this.scheduler,\n appointment: appointmentRef,\n isSameSlotDrop: this.dragStartSlotId() === e.sender.element().dataset['slotId'],\n });\n }\n protected handleActionClick(event: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n event.stopPropagation();\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n this.onActionClickInternal.emit({\n appointment: originalAppointment,\n nativeEvent: event,\n sender: this.scheduler,\n });\n }\n\n protected hoursArray = computed(() => {\n let time = this.date();\n if (!time) return [];\n time = time.set('hour', this.startDayHour()).startOf('hour');\n const hours = [time];\n while (time.hour < this.endDayHour() - 1) {\n time = time.add('hour', 1);\n hours.push(time);\n }\n return hours;\n });\n\n private appointmentLayouts = computed(() => {\n const layouts = new Map<any, AXSchedulerDayAppointmentLayout>();\n const appointmentsToLayout = this.singleDayAppointments();\n const viewDate = this.date();\n const startH = this.startDayHour();\n const endH = this.endDayHour();\n\n if (appointmentsToLayout.length === 0 || !viewDate || typeof startH !== 'number' || typeof endH !== 'number') {\n return layouts;\n }\n\n const concurrencyInfoMap = this.schedulerService.calculateDayViewConcurrencyInfo(\n appointmentsToLayout,\n viewDate,\n startH,\n endH,\n );\n\n const sortedAppointments = orderBy(\n appointmentsToLayout,\n [(e) => e.startDate.getTime(), (e) => e.originalEndDate.getTime() - e.originalStartDate.getTime()],\n ['asc', 'desc'],\n );\n\n const columnsData: { appointments: AXSchedulerAppointmentSegment[] }[] = [];\n\n for (const appointmentSegment of sortedAppointments) {\n let assignedCol = -1;\n\n for (let c = 0; ; c++) {\n if (!columnsData[c]) {\n columnsData[c] = { appointments: [] };\n }\n\n let conflict = false;\n\n for (const placedSegment of columnsData[c].appointments) {\n const startDate = this.calendarService.create(appointmentSegment.startDate, this.calendar());\n const endDate = this.calendarService.create(appointmentSegment.endDate, this.calendar());\n if (\n startDate.compare(placedSegment.endDate, 'minute') < 0 &&\n endDate.compare(placedSegment.startDate, 'minute') > 0\n ) {\n conflict = true;\n break;\n }\n }\n\n if (!conflict) {\n assignedCol = c;\n columnsData[c].appointments.push(appointmentSegment);\n break;\n }\n\n if (c > appointmentsToLayout.length) {\n console.warn(\n `DayView: Safety break in column assignment for ${appointmentSegment.title}, assigning to new column ${c}`,\n );\n if (!columnsData[c]) columnsData[c] = { appointments: [] };\n columnsData[c].appointments.push(appointmentSegment);\n assignedCol = c;\n break;\n }\n }\n\n const concurrencyInfo = concurrencyInfoMap.get(appointmentSegment.id);\n const effectiveCols = concurrencyInfo ? concurrencyInfo.effectiveTotalColumns : 1;\n\n layouts.set(appointmentSegment.id, {\n columnIndex: assignedCol,\n effectiveTotalColumns: effectiveCols,\n });\n }\n return layouts;\n });\n\n private getAppointmentLayout(key: any): AXSchedulerDayAppointmentLayout | undefined {\n return this.appointmentLayouts().get(key);\n }\n\n protected getAppointmentLeft(key: any): string {\n const layout = this.getAppointmentLayout(key);\n if (layout && layout.effectiveTotalColumns > 0) {\n const N = layout.effectiveTotalColumns;\n const C = layout.columnIndex;\n if (C < 0) {\n console.warn('Invalid columnIndex < 0 for key:', key);\n return '0px';\n }\n if (C === 0 || N <= 1) return '0px';\n const leftPercent = C * (100 / N);\n const gapOffsetPx = C * this.GAP_PX;\n return `calc(${leftPercent}% + ${gapOffsetPx}px)`;\n }\n return '0px';\n }\n\n protected getAppointmentWidth(key: any): string {\n const layout = this.getAppointmentLayout(key);\n if (layout && layout.effectiveTotalColumns > 0) {\n const N = layout.effectiveTotalColumns;\n\n if (N <= 0) return '0%';\n if (N === 1) return `calc(100% - ${this.GAP_PX}px)`;\n\n const widthPercent = (1 / N) * 100;\n\n return `calc(${widthPercent}% - ${this.GAP_PX}px)`;\n }\n return '0%';\n }\n\n protected getAppointmentTop(key: any): string {\n const appointmentSegment = this.singleDayAppointments().find((e) => e.id === key);\n\n if (appointmentSegment) {\n const startMinutes = appointmentSegment.startDate.getHours() * 60 + appointmentSegment.startDate.getMinutes();\n const startBlockOffset = startMinutes - this.startDayHour() * 60;\n const yBlock = startBlockOffset / 30;\n return `calc(var(--ax-comp-scheduler-basic-view-blocks-height) * ${yBlock} + 1px)`;\n }\n return '';\n }\n\n protected getAppointmentHeight(key: any): string {\n const appointmentSegment = this.singleDayAppointments().find((e) => e.id === key);\n if (appointmentSegment) {\n const durationMillis = appointmentSegment.endDate.getTime() - appointmentSegment.startDate.getTime();\n const durationMinutes = Math.max(0, durationMillis / (1000 * 60));\n if (durationMinutes <= 0) return '0px';\n\n const heightBlock = durationMinutes / 30;\n const blockHeightExpr = `var(--ax-comp-scheduler-basic-view-blocks-height)`;\n\n return `calc(${blockHeightExpr} * ${heightBlock} - ${this.GAP_PX}px)`;\n }\n return '0px';\n }\n\n protected getCurrentTimePosition(): number | null {\n const now = this.calendarService.create(new Date(), this.calendar());\n const dayStart = this.date().startOf('day');\n const dayEnd = this.date().endOf('day');\n const startHour = this.startDayHour();\n const endHour = this.endDayHour();\n\n // Check if current time is within the displayed day\n if (now.isBefore(dayStart) || now.isAfter(dayEnd)) {\n return null;\n }\n\n // Check if current time is within the visible hours\n if (now.hour < startHour || now.hour >= endHour) {\n return null;\n }\n\n // Calculate position as percentage within the visible time range\n const currentMinutes = now.hour * 60 + now.minute;\n const startMinutes = startHour * 60;\n const endMinutes = endHour * 60;\n const totalMinutes = endMinutes - startMinutes;\n\n const positionInMinutes = currentMinutes - startMinutes;\n return (positionInMinutes / totalMinutes) * 100;\n }\n\n protected getCurrentTimePositionWithOffset(): string | null {\n const position = this.getCurrentTimePosition();\n if (position === null) {\n return null;\n }\n\n // For day view, calculate the vertical position (top) for the horizontal line\n // based on the current time within the visible hours\n const currentMinutes =\n this.calendarService.create(new Date(), this.calendar()).hour * 60 +\n this.calendarService.create(new Date(), this.calendar()).minute;\n const startMinutes = this.startDayHour() * 60;\n const positionInMinutes = currentMinutes - startMinutes;\n const blockHeight = 30; // 30 minutes per block\n const blocksFromStart = positionInMinutes / blockHeight;\n\n return `calc(var(--ax-comp-scheduler-basic-view-blocks-height) * ${blocksFromStart} + 1px)`;\n }\n\n ngAfterViewInit() {\n // Auto-scroll to current time when available using ResizeObserver\n this.setupCurrentTimeScroll();\n }\n\n private setupCurrentTimeScroll(): (() => void) | undefined {\n if (!this.showCurrentTimeIndicator()) {\n return undefined;\n }\n\n const currentPosition = this.getCurrentTimePosition();\n if (currentPosition === null) {\n return undefined;\n }\n\n const timeLineElement = this.currentTimeLineElement()?.nativeElement;\n if (!timeLineElement) {\n return undefined;\n }\n\n // Use ResizeObserver to detect when the element is properly rendered\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.contentRect.width > 0 && entry.contentRect.height > 0) {\n // Element has proper dimensions, scroll to it\n timeLineElement.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n inline: 'nearest',\n });\n // Disconnect observer after successful scroll\n resizeObserver.disconnect();\n break;\n }\n }\n });\n\n resizeObserver.observe(timeLineElement);\n\n // Cleanup on component destroy\n return () => resizeObserver.disconnect();\n }\n\n protected getSlotId(e: PointerEvent) {\n const dropListElement = this.document\n .elementsFromPoint(e.clientX, e.clientY)\n .find((el): el is HTMLElement => el instanceof HTMLElement && el.dataset['slotId'] !== undefined);\n this.dragStartSlotId.set(dropListElement ? dropListElement.dataset['slotId'] : null);\n }\n\n @HostBinding('class.ax-state-readonly')\n protected get isReadonly() {\n return this.readonly();\n }\n}\n","<div class=\"ax-scheduler-day-header\">\n <div class=\"ax-scheduler-day-header-table\" aria-hidden=\"true\">\n <div>\n {{ '@acorex:dateTime.duration.all-day' | translate | async }}\n </div>\n </div>\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleAllDayDrop($event)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n (click)=\"handleAllDaySlotEvent($event)\"\n (dblclick)=\"handleAllDaySlotEvent($event)\"\n (contextmenu)=\"handleAllDaySlotEvent($event)\"\n class=\"ax-scheduler-day-header-table-container\"\n [attr.data-slot-id]=\"date().format('YYYYMMDD') + '-allday'\"\n >\n <div class=\"ax-scheduler-day-header-appointment-container\">\n @if (allDayAppointments().length) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || allDayAppointments()[0].readonly || readonly()\"\n (pointerdown)=\"getSlotId($event)\"\n [dragData]=\"allDayAppointments()[0]\"\n (click)=\"handleAppointmentEvent($event, allDayAppointments()[0])\"\n (dblclick)=\"handleAppointmentEvent($event, allDayAppointments()[0])\"\n (contextmenu)=\"handleAppointmentEvent($event, allDayAppointments()[0])\"\n [title]=\"tooltipTemplate() ? '' : allDayAppointments()[0].title\"\n class=\"ax-scheduler-header-day-appointment\"\n [ngClass]=\"\n allDayAppointments()[0].cssClass ??\n `ax-scheduler-${allDayAppointments()[0].priority ?? 'primary'}-periority`\n \"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltipContext]=\"allDayAppointments()[0]\"\n [axTooltip]=\"tooltipTemplate()\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ allDayAppointments()[0].title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, allDayAppointments()[0])\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n <ax-subtitle>\n {{ allDayAppointments()[0].startDate | format: 'date' : { calendar: calendar() } | async }}\n -\n {{ allDayAppointments()[0].endDate | format: 'date' : { calendar: calendar() } | async }}\n </ax-subtitle>\n </div>\n }\n @if (allDayAppointments().length > 1) {\n <div\n #moreAppointments\n class=\"ax-scheduler-day-header-more-tag\"\n [ngClass]=\"\n allDayAppointments()[1].cssClass ??\n `ax-scheduler-${allDayAppointments()[1].priority ?? 'primary'}-periority`\n \"\n >\n {{\n '@acorex:common.general.more-items'\n | translate: { params: { number: allDayAppointments().length - 1 } }\n | async\n }}\n </div>\n <ax-popover [target]=\"moreAppointments\">\n <div class=\"ax-overlay-pane ax-scheduler-popover\" [class.ax-state-readonly]=\"readonly()\" axDropZone>\n @for (appointment of allDayAppointments(); track appointment.id; let first = $first) {\n @if (!first) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"appointment\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || appointment.readonly || readonly()\"\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"tooltipTemplate() ? '' : appointment.title\"\n class=\"ax-scheduler-popover-appointment\"\n [ngClass]=\"appointment.cssClass ?? `ax-scheduler-${appointment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltipContext]=\"appointment\"\n [axTooltip]=\"tooltipTemplate()\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ appointment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, appointment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n <ax-subtitle>\n {{ appointment.startDate | format: 'date' : { calendar: calendar() } | async }}\n -\n {{ appointment.endDate | format: 'date' : { calendar: calendar() } | async }}\n </ax-subtitle>\n </div>\n }\n }\n </div>\n </ax-popover>\n }\n </div>\n </div>\n</div>\n\n<div class=\"ax-scheduler-day-time-container\">\n <table class=\"ax-scheduler-day-time\" aria-hidden=\"true\" [border]=\"1\">\n @for (time of hoursArray(); track time.date.getTime()) {\n <div>\n {{ time | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </div>\n }\n </table>\n <div class=\"ax-scheduler-day-table-container\">\n <!-- Current Time Line Indicator -->\n @if (showCurrentTimeIndicator() && getCurrentTimePositionWithOffset() !== null) {\n <div\n #currentTimeLine\n class=\"ax-scheduler-current-time-line\"\n [style.inset-block-start]=\"getCurrentTimePositionWithOffset()\"\n ></div>\n }\n <div class=\"ax-scheduler-day-appointment-container\">\n @for (appointment of singleDayAppointments(); track appointment.id) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"appointment\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || appointment.readonly || readonly()\"\n (pointerdown)=\"getSlotId($event)\"\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"tooltipTemplate() ? '' : appointment.title\"\n class=\"ax-scheduler-day-appointment\"\n [style.width]=\"getAppointmentWidth(appointment.id)\"\n [style.height]=\"getAppointmentHeight(appointment.id)\"\n [style.inset-block-start]=\"getAppointmentTop(appointment.id)\"\n [style.inset-inline-start]=\"getAppointmentLeft(appointment.id)\"\n [ngClass]=\"appointment.cssClass ?? `ax-scheduler-${appointment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltipContext]=\"appointment\"\n [axTooltip]=\"tooltipTemplate()\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ appointment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, appointment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n <ax-subtitle>\n {{ appointment.originalStartDate | format: 'time' : { calendar: calendar() } | async }} -\n {{ appointment.originalEndDate | format: 'time' : { calendar: calendar() } | async }}\n </ax-subtitle>\n </div>\n }\n </div>\n <div aria-hidden=\"true\" class=\"ax-scheduler-day-slot\">\n @for (time of hoursArray(); track time.date.getTime()) {\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleSingleDayDrop($event, time)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n (click)=\"handleSingleSlotEvent($event, time)\"\n (dblclick)=\"handleSingleSlotEvent($event, time)\"\n (contextmenu)=\"handleSingleSlotEvent($event, time)\"\n [attr.data-slot-id]=\"time.format('YYYYMMDD-HHmm')\"\n ></div>\n <div\n axDropZone\n #zone2=\"axDropZone\"\n [class.ax-scheduler-slot-hovered]=\"zone2.isHovered()\"\n (onElementDrop)=\"handleSingleDayDrop($event, time.add('minute', 30))\"\n (click)=\"handleSingleSlotEvent($event, time.add('minute', 30))\"\n (dblclick)=\"handleSingleSlotEvent($event, time.add('minute', 30))\"\n (contextmenu)=\"handleSingleSlotEvent($event, time.add('minute', 30))\"\n [attr.data-slot-id]=\"time.add('minute', 30).format('YYYYMMDD-HHmm')\"\n ></div>\n }\n </div>\n </div>\n</div>\n","import { AXComponent, NXComponent } from '@acorex/cdk/common';\nimport { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { AXDecoratorIconComponent } from '@acorex/components/decorators'; // Adjust path\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXCalendarService, AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe, NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n DOCUMENT,\n HostBinding,\n inject,\n input,\n output,\n signal,\n TemplateRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { orderBy } from 'lodash-es';\nimport { AXDayOfWeekName, AXSchedulerAppointment, AXSchedulerAppointmentSegment } from '../../scheduler.class'; // Adjust path\nimport {\n AXSchedulerAppointmentMouseEvent,\n AXSchedulerComponent,\n AXSchedulerSlotDropEvent,\n AXSchedulerSlotMouseEvent,\n} from '../../scheduler.component';\nimport { AXSchedulerService } from '../../scheduler.service';\n\n// --- Types specific to Month View Layout ---\n// Represents a single day cell in the month grid\nexport type AXSchedulerMonthDayCell = {\n date: AXDateTime;\n isCurrentMonth: boolean;\n isToday: boolean;\n isHoliday: boolean;\n holidayTitle?: string;\n holidayCssClass?: string;\n appointments: AXSchedulerAppointmentSegment[]; // All appointments for this day\n visibleAppointments: AXSchedulerAppointmentSegment[]; // Appointments to display as chips\n hiddenAppointments: AXSchedulerAppointmentSegment[]; // Appointments hidden behind the badge\n overflowCount: number; // Count of hidden appointments (length of hiddenAppointments)\n};\n\n@Component({\n selector: 'ax-scheduler-month-view',\n templateUrl: './scheduler-month-view.component.html',\n styleUrl: './scheduler-month-view.component.compiled.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n NgClass,\n AsyncPipe,\n AXFormatPipe,\n AXDragDirective,\n AXTranslatorPipe,\n AXPopoverComponent,\n AXTooltipDirective,\n AXDropZoneDirective,\n AXDecoratorIconComponent,\n ],\n providers: [{ provide: AXComponent, useExisting: AXSchedulerMonthViewComponent }],\n})\nexport class AXSchedulerMonthViewComponent extends NXComponent {\n private document = inject(DOCUMENT);\n private scheduler = inject(AXSchedulerComponent);\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n\n // --- Inputs ---\n readonly = input(false);\n draggable = input(true);\n hasActions = input(false);\n dragStartDelay = input(0);\n calendar = input<string>();\n date = input.required<AXDateTime>();\n appointments = input<AXSchedulerAppointment[]>([]);\n firstDayOfWeek = input<AXDayOfWeekName>('saturday');\n tooltipTemplate = input<string | TemplateRef<unknown>>();\n\n // --- Constants ---\n readonly DAYS_IN_WEEK = 7;\n readonly MAX_VISIBLE_APPOINTMENTS_PER_DAY = 2;\n\n private dragStartSlotId = signal<string | null>(null);\n\n // Internal outputs to be caught by parent AXSchedulerComponent\n slotClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotMouseEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n onActionClickInternal = output<AXSchedulerAppointmentMouseEvent>();\n onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n // --- Event Handlers ---\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n protected handleAppointmentEvent(mouseEvent: MouseEvent, appointmentSegmentOrOriginal: AXSchedulerAppointment) {\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentSegmentOrOriginal);\n const appointmentRef = {\n ...originalAppointment,\n endDate: originalAppointment.endDate,\n startDate: originalAppointment.startDate,\n };\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, appointment: appointmentRef, sender: this.scheduler },\n this.eventOutputMap,\n 'appointment',\n );\n }\n protected handleSlotEvent(mouseEvent: MouseEvent, date: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(date.startOf('day'), 'month'); // Ensure it's start of day\n if (slotData) {\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n this.eventOutputMap,\n 'slot',\n );\n }\n }\n protected handleDrop(e: AXDropZoneDropEvent, date: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(date.startOf('day'), 'month');\n const droppedItem = e.dropped.dragData() as AXSchedulerAppointment;\n const originalAppointment = this.schedulerService.getOriginalAppointment(droppedItem);\n const appointmentRef = {\n ...originalAppointment,\n endDate: originalAppointment.endDate,\n startDate: originalAppointment.startDate,\n };\n this.onAppointmentDropInternal.emit({\n dropEvent: e,\n slot: slotData,\n sender: this.scheduler,\n appointment: appointmentRef,\n isSameSlotDrop: this.dragStartSlotId() === e.sender.element().dataset['slotId'],\n });\n }\n protected handleActionClick(event: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n event.stopPropagation();\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n this.onActionClickInternal.emit({\n appointment: originalAppointment,\n nativeEvent: event,\n sender: this.scheduler,\n });\n }\n\n // --- Base Computeds ---\n // Calculate the start of the month based on the input date\n private monthStartDate = computed(() => {\n const d = this.date();\n return d ? d.startOf('month') : null;\n });\n\n // Generate the list of weekday names based on the firstDayOfWeek\n protected daysArray = computed(() => {\n const dayNames: AXDateTime[] = [];\n\n const currentDate = this.date(); // Use a stable date for generating week headers\n const currentDayOfWeek = currentDate.dayOfWeek;\n const desiredFirstDayName = this.firstDayOfWeek();\n const desiredFirstDayNumber = this.schedulerService.getDayOfWeekNumber(desiredFirstDayName);\n\n // Calculate days to subtract to get to the start of the week based on firstDayOfWeek\n const daysToSubtract = (currentDayOfWeek - desiredFirstDayNumber + 7) % 7;\n let headerStartDate = currentDate.add('day', -daysToSubtract);\n\n for (let i = 0; i < 7; i++) {\n dayNames.push(headerStartDate);\n headerStartDate = headerStartDate.add('day', 1);\n }\n return dayNames;\n });\n\n // --- Calendar Grid Calculation ---\n private calendarDaysInfo = computed(() => {\n const monthStart = this.monthStartDate();\n if (!monthStart) return { days: [], weeksNeeded: 0 };\n\n const firstDayOfMonth = monthStart;\n const lastDayOfMonth = monthStart.endOf('month');\n\n const firstDayGridNum = this.schedulerService.getDayOfWeekNumber(this.firstDayOfWeek());\n const firstDisplayedDayOfWeek = firstDayOfMonth.dayOfWeek;\n\n const leadingDays = (firstDisplayedDayOfWeek - firstDayGridNum + this.DAYS_IN_WEEK) % this.DAYS_IN_WEEK;\n const firstDayOfGrid = firstDayOfMonth.add('day', -leadingDays);\n\n // Determine how many total days to show to fill out the weeks\n // A common approach is 6 weeks to ensure consistency, but your dynamic weeksNeeded is fine too.\n // Let's stick to your dynamic `weeksNeeded` and `totalDaysToGenerate`\n const daysInMonth = lastDayOfMonth.dayOfMonth;\n const totalCellsMinimum = leadingDays + daysInMonth;\n const weeksNeededDynamic = Math.ceil(totalCellsMinimum / this.DAYS_IN_WEEK);\n const actualWeeksToShow = Math.max(4, Math.min(weeksNeededDynamic, 6)); // Clamp weeks\n const totalDaysToGenerate = actualWeeksToShow * this.DAYS_IN_WEEK;\n\n const days: {\n date: AXDateTime;\n isCurrentMonth: boolean;\n isToday: boolean;\n isHoliday: boolean;\n holidayTitle?: string;\n holidayCssClass?: string;\n }[] = [];\n const today = this.calendarService.create(new Date());\n let currentDay = firstDayOfGrid;\n\n for (let i = 0; i < totalDaysToGenerate; i++) {\n const isHoliday =\n this.schedulerService.isHoliday(currentDay) || this.schedulerService.isWeekend(currentDay, this.calendar());\n\n let holidayTitle: null | string = null;\n let holidayCssClass: null | string = null;\n if (isHoliday) {\n const globalHoliday = this.calendarService.holidays.find((d) => currentDay.equal(d.date, 'day'));\n const internalHoliday = this.schedulerService.internalHoliday().find((d) => currentDay.equal(d.date, 'day'));\n const holiday = globalHoliday || internalHoliday;\n if (holiday) {\n holidayTitle = holiday.title;\n holidayCssClass = holiday.cssClass;\n }\n }\n\n days.push({\n date: currentDay,\n isCurrentMonth: currentDay.monthOfYear === monthStart.monthOfYear,\n isToday: currentDay.equal(today, 'day'),\n isHoliday,\n holidayTitle,\n holidayCssClass,\n });\n currentDay = currentDay.add('day', 1);\n }\n return { days: days, weeksNeeded: actualWeeksToShow };\n });\n\n // --- Appointment Grouping ---\n private appointmentsGroupedByDay = computed(() => {\n const { days } = this.calendarDaysInfo(); // Destructure to get days array\n if (days.length === 0) return new Map<string, AXSchedulerAppointment[]>();\n\n const viewStartDate = days[0].date;\n const viewEndDate = days[days.length - 1].date;\n const relevantAppointments = this.appointments();\n\n return this.schedulerService.groupAppointmentsByDay(relevantAppointments, viewStartDate, viewEndDate);\n });\n\n // --- Day Cell Layout Calculation ---\n protected dayCellLayouts = computed<AXSchedulerMonthDayCell[]>(() => {\n const { days: initialDaysInfo } = this.calendarDaysInfo();\n const allOriginalAppointments = this.appointments();\n\n if (initialDaysInfo.length === 0) {\n return []; // Return empty array if no days to process\n }\n if (!allOriginalAppointments || allOriginalAppointments.length === 0) {\n // If no appointments, map initialDaysInfo to the full structure with empty appointment arrays\n return initialDaysInfo.map((dayInfo) => ({\n ...dayInfo,\n appointments: [],\n visibleAppointments: [],\n hiddenAppointments: [],\n overflowCount: 0,\n }));\n }\n\n return initialDaysInfo.map((dayInfo) => {\n const dayAsStartOfDay = dayInfo.date.startOf('day');\n const segmentsForThisDay: AXSchedulerAppointmentSegment[] = [];\n\n for (const appt of allOriginalAppointments) {\n const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(\n appt,\n dayAsStartOfDay,\n 0, // viewStartHour for month cell context (full day)\n 24, // viewEndHour for month cell context (full day)\n true, // isFullDayCellContext = true\n );\n if (segment) {\n segmentsForThisDay.push(segment);\n }\n }\n\n const sortedSegments = orderBy(\n segmentsForThisDay,\n [\n (s) => (s.allDay ? 0 : 1), // Segments marked as allDay first\n (s) => s.originalStartDate.getTime(), // Then by original start time\n (s) => s.originalEndDate.getTime() - s.originalStartDate.getTime(), // Then by duration (longer first)\n (s) => s.title?.toLowerCase() ?? '', // Then by title\n ],\n ['asc', 'asc', 'desc', 'asc'],\n );\n\n const visibleAppointments = sortedSegments.slice(0, this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n const hiddenAppointments = sortedSegments.slice(this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n const overflowCount = hiddenAppointments.length;\n\n return {\n ...dayInfo,\n appointments: sortedSegments,\n visibleAppointments,\n hiddenAppointments,\n overflowCount,\n };\n });\n });\n\n // --- Dynamic Grid Rows ---\n protected gridTemplateRowsStyle = computed(() => {\n const { weeksNeeded } = this.calendarDaysInfo();\n if (!weeksNeeded || weeksNeeded <= 0) {\n return `repeat(6, minmax(0, 1fr))`; // Fallback, ensures grid is at least somewhat sensible\n }\n return `repeat(${weeksNeeded}, minmax(0, 1fr))`; // Use 1fr for equal distribution\n });\n\n protected getSlotId(e: PointerEvent) {\n const dropListElement = this.document\n .elementsFromPoint(e.clientX, e.clientY)\n .find((el): el is HTMLElement => el instanceof HTMLElement && el.dataset['slotId'] !== undefined);\n this.dragStartSlotId.set(dropListElement ? dropListElement.dataset['slotId'] : null);\n }\n\n @HostBinding('class.ax-state-readonly')\n protected get isReadonly() {\n return this.readonly();\n }\n}\n","<div class=\"ax-scheduler-month-container\">\n <!-- Weekday Header -->\n <div class=\"ax-scheduler-month-weekdays\">\n @for (day of daysArray(); track day.date.getTime()) {\n <div class=\"ax-scheduler-month-weekday\">\n {{ day | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n </div>\n }\n </div>\n\n <!-- Calendar Grid -->\n <div class=\"ax-scheduler-month-grid\" [style.gridTemplateRows]=\"gridTemplateRowsStyle()\">\n @for (dayCell of dayCellLayouts(); track dayCell.date.date.getTime()) {\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleDrop($event, dayCell.date)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n (click)=\"handleSlotEvent($event, dayCell.date)\"\n (dblclick)=\"handleSlotEvent($event, dayCell.date)\"\n (contextmenu)=\"handleSlotEvent($event, dayCell.date)\"\n class=\"ax-scheduler-month-day-cell {{\n dayCell.isHoliday ? (dayCell.holidayCssClass ?? 'ax-state-holiday') : ''\n }}\"\n [class.ax-state-today]=\"dayCell.isToday\"\n [class.ax-other-month]=\"!dayCell.isCurrentMonth\"\n [attr.data-slot-id]=\"dayCell.date.format('YYYYMMDD')\"\n >\n <div class=\"ax-scheduler-month-day-header\">\n <span class=\"ax-scheduler-month-day-number ax-scheduler-truncate\" [axTooltip]=\"dayCell.holidayTitle ?? ''\">\n {{ dayCell.date.dayOfMonth }}\n\n @if (dayCell.holidayTitle) {\n ( {{ dayCell.holidayTitle }} )\n }\n </span>\n </div>\n <div class=\"ax-scheduler-month-day-appointments\">\n <!-- Visible Appointment Segments -->\n @for (segment of dayCell.visibleAppointments; track segment.id + segment.originalStartDate) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"segment\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n (pointerdown)=\"getSlotId($event)\"\n (click)=\"handleAppointmentEvent($event, segment)\"\n (dblclick)=\"handleAppointmentEvent($event, segment)\"\n (contextmenu)=\"handleAppointmentEvent($event, segment)\"\n [title]=\"\n tooltipTemplate()\n ? ''\n : segment.title +\n (segment.allDay\n ? ''\n : ' (' +\n (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n ' - ' +\n (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n ')')\n \"\n [class.all-day-segment]=\"segment.allDay\"\n class=\"ax-scheduler-month-appointment-chip\"\n [ngClass]=\"segment.cssClass ?? `ax-scheduler-${segment.priority ?? 'primary'}-periority`\"\n [class.continuation-to-next]=\"segment.isContinuationToNextDay && !segment.allDay\"\n [class.continuation-from-prev]=\"segment.isContinuationFromPreviousDay && !segment.allDay\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltip]=\"tooltipTemplate()\"\n [axTooltipContext]=\"segment\"\n >\n <span class=\"ax-appointment-chip-title\">\n <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, segment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </span>\n @if (!segment.allDay) {\n <span>\n {{ segment.originalStartDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n -\n {{ segment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </span>\n }\n </div>\n }\n <!-- Overflow Badge and Popover -->\n @if (dayCell.overflowCount > 0) {\n <div #moreAppointments class=\"ax-scheduler-month-overflow-badge\" (click)=\"$event.stopPropagation()\">\n <!-- Stop propagation to prevent slot click -->\n +{{\n '@acorex:common.general.more-items' | translate: { params: { number: dayCell.overflowCount } } | async\n }}\n </div>\n <ax-popover [target]=\"moreAppointments\" placement=\"bottom-start\" trigger=\"click\">\n <div\n axDropZone\n [class.ax-state-readonly]=\"readonly()\"\n class=\"ax-overlay-pane ax-scheduler-popover ax-scheduler-month-popover-appointment\"\n >\n @for (segment of dayCell.hiddenAppointments; track segment.id + segment.originalStartDate) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"segment\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n (click)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n (dblclick)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n (contextmenu)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n [title]=\"\n tooltipTemplate()\n ? ''\n : segment.title +\n (segment.allDay\n ? ''\n : ' (' +\n (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n ' - ' +\n (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n ')')\n \"\n class=\"ax-scheduler-popover-appointment\"\n [class.all-day-segment]=\"segment.allDay\"\n [ngClass]=\"segment.cssClass ?? `ax-scheduler-${segment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltip]=\"tooltipTemplate()\"\n [axTooltipContext]=\"segment\"\n >\n <span class=\"ax-appointment-chip-title\">\n <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, segment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </span>\n @if (!segment.allDay) {\n <span>\n {{\n segment.originalStartDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n }}\n -\n {{\n segment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n }}\n </span>\n }\n </div>\n }\n </div>\n </ax-popover>\n }\n </div>\n </div>\n }\n </div>\n</div>\n","import { AXComponent, NXComponent } from '@acorex/cdk/common';\nimport { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXCalendarService, AXDateTime } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AsyncPipe, NgClass, NgTemplateOutlet } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n ElementRef,\n HostBinding,\n TemplateRef,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { isEqual, orderBy } from 'lodash-es';\nimport {\n AXSchedulerAppointment,\n AXSchedulerAppointmentLayout,\n AXSchedulerAppointmentSegment,\n AXSchedulerResource,\n} from '../../scheduler.class';\nimport {\n AXSchedulerAppointmentMouseEvent,\n AXSchedulerComponent,\n AXSchedulerSlotDropEvent,\n AXSchedulerSlotMouseEvent,\n} from '../../scheduler.component';\nimport { AXSchedulerService } from '../../scheduler.service';\n\n@Component({\n selector: 'ax-scheduler-timeline-day-view',\n templateUrl: './scheduler-timeline-day-view.component.html',\n styleUrl: './scheduler-timeline-day-view.component.compiled.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n NgClass,\n NgTemplateOutlet,\n AsyncPipe,\n AXFormatPipe,\n AXDragDirective,\n AXTooltipDirective,\n AXDropZoneDirective,\n AXDecoratorIconComponent,\n AXDecoratorGenericComponent,\n ],\n providers: [{ provide: AXComponent, useExisting: AXSchedulerTimelineDayViewComponent }],\n})\nexport class AXSchedulerTimelineDayViewComponent extends NXComponent implements AfterViewInit {\n private document = inject(DOCUMENT);\n private scheduler = inject(AXSchedulerComponent);\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n\n readonly GAP_PX = 1;\n\n readonly = input(false);\n draggable = input(true);\n hasActions = input(false);\n dragStartDelay = input(0);\n calendar = input<string>();\n showResourceHeaders = input(true);\n date = input.required<AXDateTime>();\n endDayHour = input.required<number>();\n startDayHour = input.required<number>();\n showUnassignedAppointments = input(true);\n resources = input<AXSchedulerResource[]>([]);\n showCurrentTimeIndicator = input<boolean>(true);\n resourceTemplate = input<TemplateRef<unknown>>();\n appointments = input<AXSchedulerAppointment[]>([]);\n tooltipTemplate = input<string | TemplateRef<unknown>>();\n\n private dragStartSlotId = signal<string | null>(null);\n private dragStartSlotResourceId = signal<any>(null);\n\n currentTimeLineElement = viewChild<ElementRef<HTMLElement>>('currentTimeLine');\n\n /**\n * Gets appointments grouped by resources for timeline view.\n */\n protected appointmentsByResource = computed(() => {\n const allAppointments = this.appointments();\n const resources = this.resources();\n const showUnassigned = this.showUnassignedAppointments();\n\n return this.schedulerService.filterAppointmentsByResources(allAppointments, resources, showUnassigned);\n });\n\n /**\n * Gets all resource IDs including unassigned if applicable.\n */\n protected resourceIds = computed(() => {\n const resources = this.resources();\n const showUnassigned = this.showUnassignedAppointments();\n\n return this.schedulerService.getAllResourceIds(resources, showUnassigned);\n });\n\n /**\n * Processes original appointments to get segments relevant to this specific day and its viewable hours.\n * Filters out original all-day events.\n */\n private processedSegmentsForLayout = computed<AXSchedulerAppointmentSegment[]>(() => {\n const viewDate = this.date();\n const allOriginalAppointments = this.appointments();\n const viewConfigStartHour = this.startDayHour();\n const viewConfigEndHour = this.endDayHour();\n\n if (!viewDate || !allOriginalAppointments || allOriginalAppointments.length === 0) {\n return [];\n }\n\n const segmentsOnThisDay: AXSchedulerAppointmentSegment[] = [];\n for (const appt of allOriginalAppointments) {\n if (appt.allDay) {\n // For all-day appointments, create a segment that spans the full day\n const dayStart = viewDate.startOf('day');\n const dayEnd = viewDate.endOf('day');\n\n // Check if the all-day appointment overlaps with this day\n const apptStart = this.calendarService.create(appt.startDate, this.calendar()).startOf('day');\n const apptEnd = this.calendarService.create(appt.endDate, this.calendar()).startOf('day');\n\n if (apptStart.compare(dayEnd, 'day') <= 0 && apptEnd.compare(dayStart, 'day') >= 0) {\n const allDaySegment: AXSchedulerAppointmentSegment = {\n ...appt,\n startDate: dayStart.date,\n endDate: dayEnd.date,\n allDay: true,\n originalStartDate: appt.startDate,\n originalEndDate: appt.endDate,\n isContinuationFromPreviousDay: apptStart.compare(dayStart, 'day') < 0,\n isContinuationToNextDay: apptEnd.compare(dayStart, 'day') > 0,\n originalAppointmentRef: appt,\n };\n segmentsOnThisDay.push(allDaySegment);\n }\n continue;\n }\n\n const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(\n appt,\n viewDate,\n viewConfigStartHour,\n viewConfigEndHour,\n false,\n );\n\n if (segment) {\n segmentsOnThisDay.push(segment);\n }\n }\n return segmentsOnThisDay;\n });\n\n // Internal outputs to be caught by parent AXSchedulerComponent\n slotClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotMouseEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n onActionClickInternal = output<AXSchedulerAppointmentMouseEvent>();\n onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n // --- Event Handlers ---\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n protected handleAppointmentEvent(mouseEvent: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n const appointmentRef = {\n ...originalAppointment,\n endDate: originalAppointment.endDate,\n startDate: originalAppointment.startDate,\n };\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, appointment: appointmentRef, sender: this.scheduler },\n this.eventOutputMap,\n 'appointment',\n );\n }\n protected handleSlotEvent(mouseEvent: MouseEvent, startDate: AXDateTime) {\n const slotData = this.schedulerService.getSlotData(startDate, 'timeline-day');\n if (slotData)\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n this.eventOutputMap,\n 'slot',\n );\n }\n protected handleDrop(e: AXDropZoneDropEvent, startDate: AXDateTime, resourceId?: any) {\n const slotData = this.schedulerService.getSlotData(startDate, 'timeline-day');\n const droppedItem = e.dropped.dragData() as AXSchedulerAppointment;\n const originalAppointment = this.schedulerService.getOriginalAppointment(droppedItem);\n const appointmentRef = {\n ...originalAppointment,\n endDate: originalAppointment.endDate,\n startDate: originalAppointment.startDate,\n };\n\n // Convert 'unassigned' string to undefined for proper unassigned appointments\n const actualResourceId = resourceId === 'unassigned' ? undefined : resourceId;\n\n // Check if it's the same slot (same time AND same resource)\n const dragStartSlotId = this.dragStartSlotId();\n const dropSlotId = e.sender.element().dataset['slotId'];\n const dragStartResourceId = this.dragStartSlotResourceId();\n const isSameSlotDrop = dragStartSlotId === dropSlotId && dragStartResourceId === resourceId;\n\n this.onAppointmentDropInternal.emit({\n dropEvent: e,\n slot: { ...slotData, resourceId: actualResourceId },\n sender: this.scheduler,\n appointment: appointmentRef,\n isSameSlotDrop,\n });\n }\n protected handleActionClick(event: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n event.stopPropagation();\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n this.onActionClickInternal.emit({\n appointment: originalAppointment,\n nativeEvent: event,\n sender: this.scheduler,\n });\n }\n\n protected hoursArray = computed(() => {\n let time = this.date();\n if (!time) return [];\n time = time.set('hour', this.startDayHour()).startOf('hour');\n const hours = [time];\n while (time.hour < this.endDayHour() - 1) {\n time = time.add('hour', 1);\n hours.push(time);\n }\n return hours;\n });\n\n // --- Appointment Layout Calculation ---\n protected appointmentLayouts = computed((): AXSchedulerAppointmentLayout[] => {\n const finalLayouts: AXSchedulerAppointmentLayout[] = [];\n const viewConfigStartHour = this.startDayHour();\n const viewConfigEndHour = this.endDayHour();\n const appointmentsToLayout = this.processedSegmentsForLayout(); // USE SEGMENTS\n\n if (\n typeof viewConfigStartHour !== 'number' ||\n typeof viewConfigEndHour !== 'number' ||\n appointmentsToLayout.length === 0\n ) {\n return finalLayouts;\n }\n\n const sortedAppointments = orderBy(\n appointmentsToLayout,\n [(seg) => seg.startDate.getTime(), (seg) => seg.originalEndDate.getTime()],\n ['asc', 'desc'],\n );\n\n const rowEndTimes: AXDateTime[] = [];\n\n for (const segment of sortedAppointments) {\n const horizLayout = this.schedulerService.calculateTimelineLayout(\n segment, // Pass the segment\n viewConfigStartHour,\n viewConfigEndHour,\n );\n\n if (!horizLayout) continue; // Segment is outside the viewable hour range or invalid\n\n // For overlap check, use the segment's start and end times\n const segmentStartTime = this.calendarService.create(segment.startDate, this.calendar());\n const segmentEndTime = this.calendarService.create(segment.endDate, this.calendar());\n\n let assignedRowIndex = -1;\n for (let i = 0; i < rowEndTimes.length; i++) {\n // If this segment starts AFTER OR AT the time the row becomes free\n if (segmentStartTime.compare(rowEndTimes[i], 'minute') >= 0) {\n assignedRowIndex = i;\n break;\n }\n }\n\n if (assignedRowIndex === -1) {\n assignedRowIndex = rowEndTimes.length;\n rowEndTimes.push(segmentEndTime); // Add segment's end time for the new row\n } else {\n // Update the end time for the assigned row with this segment's end time\n rowEndTimes[assignedRowIndex] = segmentEndTime;\n }\n\n const layoutHeight = 'var(--ax-comp-scheduler-timeline-view-blocks-height)'; // CSS variable for height\n const layoutLeft = horizLayout.left;\n const layoutWidth = `calc(${horizLayout.width} - ${this.GAP_PX}px)`; // Apply horizontal gap if items are side-by-side within a row (not typical for this stacking)\n const layoutTop = `calc(${assignedRowIndex} * (${layoutHeight} + ${this.GAP_PX}px))`; // Vertical stacking with gap\n\n finalLayouts.push({\n appointment: segment, // Store the segment data\n layoutLeft,\n layoutWidth,\n layoutTop,\n layoutHeight,\n });\n }\n\n return finalLayouts;\n });\n\n /**\n * Gets appointments for a specific resource.\n */\n protected getAppointmentsForResource(resourceId: any): AXSchedulerAppointment[] {\n const appointmentsByResource = this.appointmentsByResource();\n // Find the correct key in the Map using isEqual for proper comparison\n for (const [key, appointments] of appointmentsByResource.entries()) {\n if (key === 'unassigned' && resourceId === 'unassigned') {\n return appointments;\n }\n if (key !== 'unassigned' && isEqual(key, resourceId)) {\n return appointments;\n }\n }\n return [];\n }\n\n /**\n * Gets resource title by ID.\n */\n protected getResourceTitle(resourceId: any): string {\n if (resourceId === 'unassigned') {\n return 'Unassigned';\n }\n const resources = this.resources();\n const resource = resources.find((r) => isEqual(r.id, resourceId));\n return resource?.title || String(resourceId);\n }\n\n protected getResourceContext(resourceId: any) {\n const resources = this.resources();\n const resource = resources.find((r) => isEqual(r.id, resourceId));\n return resource || { id: resourceId, title: String(resourceId) };\n }\n\n protected getCurrentTimePosition(): number | null {\n const now = this.calendarService.create(new Date(), this.calendar());\n const dayStart = this.date().startOf('day');\n const dayEnd = this.date().endOf('day');\n const startHour = this.startDayHour();\n const endHour = this.endDayHour();\n\n // Check if current time is within the displayed day\n if (now.isBefore(dayStart) || now.isAfter(dayEnd)) {\n return null;\n }\n\n // Check if current time is within the visible hours\n if (now.hour < startHour || now.hour >= endHour) {\n return null;\n }\n\n // Calculate position as percentage within the visible time range\n const currentMinutes = now.hour * 60 + now.minute;\n const startMinutes = startHour * 60;\n const endMinutes = endHour * 60;\n const totalMinutes = endMinutes - startMinutes;\n\n const positionInMinutes = currentMinutes - startMinutes;\n return (positionInMinutes / totalMinutes) * 100;\n }\n\n protected getCurrentTimePositionWithOffset(): string | null {\n const position = this.getCurrentTimePosition();\n if (position === null) {\n return null;\n }\n\n if (this.showResourceHeaders() && this.resources().length > 0) {\n return `calc(${position}% + (${100 - position} * var(--ax-comp-scheduler-resource-header-width, 8rem)) / 100)`;\n } else {\n return `${position}%`;\n }\n }\n\n ngAfterViewInit() {\n // Auto-scroll to current time when available using ResizeObserver\n this.setupCurrentTimeScroll();\n }\n\n private setupCurrentTimeScroll(): (() => void) | undefined {\n if (!this.showCurrentTimeIndicator()) {\n return undefined;\n }\n\n const currentPosition = this.getCurrentTimePosition();\n if (currentPosition === null) {\n return undefined;\n }\n\n const timeLineElement = this.currentTimeLineElement()?.nativeElement;\n if (!timeLineElement) {\n return undefined;\n }\n\n // Use ResizeObserver to detect when the element is properly rendered\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.contentRect.width > 0 && entry.contentRect.height > 0) {\n // Element has proper dimensions, scroll to it\n timeLineElement.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n // Disconnect observer after successful scroll\n resizeObserver.disconnect();\n break;\n }\n }\n });\n\n resizeObserver.observe(timeLineElement);\n\n // Cleanup on component destroy\n return () => resizeObserver.disconnect();\n }\n\n /**\n * Gets appointment layouts for a specific resource with proper positioning.\n */\n protected getAppointmentLayoutsForResource(resourceId: any): AXSchedulerAppointmentLayout[] {\n const resourceAppointments = this.getAppointmentsForResource(resourceId);\n const viewDate = this.date();\n const viewConfigStartHour = this.startDayHour();\n const viewConfigEndHour = this.endDayHour();\n\n if (!viewDate || resourceAppointments.length === 0) {\n return [];\n }\n\n // Get segments for this specific resource\n const resourceSegments: AXSchedulerAppointmentSegment[] = [];\n for (const appt of resourceAppointments) {\n const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(\n appt,\n viewDate,\n viewConfigStartHour,\n viewConfigEndHour,\n );\n if (segment) {\n resourceSegments.push(segment);\n }\n }\n\n const finalLayouts: AXSchedulerAppointmentLayout[] = [];\n const sortedAppointments = orderBy(\n resourceSegments,\n [(seg) => seg.startDate.getTime(), (seg) => seg.originalEndDate.getTime()],\n ['asc', 'desc'],\n );\n\n const rowEndTimes: AXDateTime[] = [];\n\n for (const segment of sortedAppointments) {\n const horizLayout = this.schedulerService.calculateTimelineLayout(\n segment,\n viewConfigStartHour,\n viewConfigEndHour,\n );\n\n if (!horizLayout) continue;\n\n const segmentStartTime = this.calendarService.create(segment.startDate, this.calendar());\n const segmentEndTime = this.calendarService.create(segment.endDate, this.calendar());\n\n let assignedRowIndex = -1;\n for (let i = 0; i < rowEndTimes.length; i++) {\n if (segmentStartTime.compare(rowEndTimes[i], 'minute') >= 0) {\n assignedRowIndex = i;\n break;\n }\n }\n\n if (assignedRowIndex === -1) {\n assignedRowIndex = rowEndTimes.length;\n rowEndTimes.push(segmentEndTime);\n } else {\n rowEndTimes[assignedRowIndex] = segmentEndTime;\n }\n\n const layoutHeight = 'var(--ax-comp-scheduler-timeline-view-blocks-height)';\n const layoutLeft = horizLayout.left;\n const layoutWidth = `calc(${horizLayout.width} - ${this.GAP_PX}px)`;\n const layoutTop = `calc(${assignedRowIndex} * (${layoutHeight} + ${this.GAP_PX}px))`;\n\n finalLayouts.push({\n appointment: segment,\n layoutLeft,\n layoutWidth,\n layoutTop,\n layoutHeight,\n });\n }\n\n return finalLayouts;\n }\n\n /**\n * Calculates the height for a resource row based on its appointments.\n */\n protected getResourceRowHeight(resourceId: any): string {\n const layouts = this.getAppointmentLayoutsForResource(resourceId);\n\n if (layouts.length === 0) {\n // If no appointments, use minimum height (one appointment height)\n return 'var(--ax-comp-scheduler-basic-view-blocks-height)';\n }\n\n // Calculate the maximum number of overlapping rows needed\n const appointments = layouts.map((layout) => layout.appointment);\n const maxOverlappingRows = this.calculateMaxOverlappingRows(appointments);\n\n // Use CSS calc() to handle the height calculation with CSS variables\n return `calc(var(--ax-comp-scheduler-basic-view-blocks-height) * ${maxOverlappingRows} + ${this.GAP_PX}px * ${Math.max(0, maxOverlappingRows)})`;\n }\n\n /**\n * Calculates the maximum number of overlapping appointment rows needed.\n */\n private calculateMaxOverlappingRows(appointments: AXSchedulerAppointmentSegment[]): number {\n if (appointments.length === 0) return 0;\n if (appointments.length === 1) return 1;\n\n // Sort appointments by start time, then by end time (descending)\n const sortedAppointments = [...appointments].sort((a, b) => {\n const startDiff = a.startDate.getTime() - b.startDate.getTime();\n if (startDiff !== 0) return startDiff;\n return b.endDate.getTime() - a.endDate.getTime(); // Longer appointments first\n });\n\n // Simulate the row assignment algorithm from the original layout\n const rowEndTimes: Date[] = [];\n let maxRows = 0;\n\n for (const appointment of sortedAppointments) {\n let assignedRowIndex = -1;\n\n // Find the first available row\n for (let i = 0; i < rowEndTimes.length; i++) {\n if (appointment.startDate >= rowEndTimes[i]) {\n assignedRowIndex = i;\n break;\n }\n }\n\n // If no available row, create a new one\n if (assignedRowIndex === -1) {\n assignedRowIndex = rowEndTimes.length;\n rowEndTimes.push(appointment.endDate);\n } else {\n // Update the row's end time\n rowEndTimes[assignedRowIndex] = appointment.endDate;\n }\n\n // Track the maximum number of rows used\n maxRows = Math.max(maxRows, rowEndTimes.length);\n }\n\n return Math.max(maxRows, 1); // Minimum one row\n }\n\n protected getSlotId(e: PointerEvent) {\n const dropListElement = this.document\n .elementsFromPoint(e.clientX, e.clientY)\n .find((el): el is HTMLElement => el instanceof HTMLElement && el.dataset['slotId'] !== undefined);\n this.dragStartSlotId.set(dropListElement ? dropListElement.dataset['slotId'] : null);\n this.dragStartSlotResourceId.set(dropListElement ? dropListElement.dataset['resourceId'] : null);\n }\n\n @HostBinding('class.ax-state-readonly')\n protected get isReadonly() {\n return this.readonly();\n }\n}\n","@if (resources().length === 0 || !showResourceHeaders()) {\n <!-- Original layout when no resources -->\n <div class=\"ax-scheduler-timeline-header\">\n @for (hour of hoursArray(); track hour.date.getTime()) {\n <div class=\"ax-scheduler-timeline-header-hours\">\n <span>{{ hour | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}</span>\n </div>\n }\n </div>\n\n <div class=\"ax-scheduler-timeline-content\">\n <!-- Current Time Line Indicator -->\n @if (showCurrentTimeIndicator() && getCurrentTimePositionWithOffset() !== null) {\n <div\n class=\"ax-scheduler-current-time-line\"\n [style.inset-inline-start]=\"getCurrentTimePositionWithOffset()\"\n #currentTimeLine\n ></div>\n }\n <div class=\"ax-scheduler-timeline-appointment-container\">\n @for (\n layout of resources().length === 0 ? appointmentLayouts() : getAppointmentLayoutsForResource(resourceIds()[0]);\n track layout.appointment.id\n ) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || layout.appointment.readonly || readonly()\"\n [dragData]=\"layout.appointment\"\n (pointerdown)=\"getSlotId($event)\"\n (click)=\"handleAppointmentEvent($event, layout.appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, layout.appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, layout.appointment)\"\n [title]=\"tooltipTemplate() ? '' : layout.appointment.title\"\n [style.width]=\"layout.layoutWidth\"\n [style.height]=\"layout.layoutHeight\"\n class=\"ax-scheduler-timeline-appointment\"\n [style.insetBlockStart]=\"layout.layoutTop\"\n [style.insetInlineStart]=\"layout.layoutLeft\"\n [ngClass]=\"\n layout.appointment.cssClass ?? `ax-scheduler-${layout.appointment.priority ?? 'primary'}-periority`\n \"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltipContext]=\"layout.appointment\"\n [axTooltip]=\"tooltipTemplate()\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ layout.appointment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, layout.appointment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n <ax-subtitle>\n {{\n layout.appointment.originalStartDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n }}\n -\n {{\n layout.appointment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n }}\n </ax-subtitle>\n </div>\n }\n </div>\n <div class=\"ax-scheduler-timeline-slot-row\" aria-hidden=\"true\">\n @for (time of hoursArray(); track time.date.getTime()) {\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleDrop($event, time)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n class=\"ax-scheduler-timeline-slot-cell\"\n (click)=\"handleSlotEvent($event, time)\"\n (dblclick)=\"handleSlotEvent($event, time)\"\n (contextmenu)=\"handleSlotEvent($event, time)\"\n [attr.data-slot-id]=\"time.format('YYYYMMDD-HHmm')\"\n ></div>\n }\n </div>\n </div>\n} @else {\n <!-- Resource-based layout -->\n <div class=\"ax-scheduler-timeline-resource-container\">\n <!-- Single sticky time header for all resources (only show if not used in multi-day) -->\n @if (showResourceHeaders()) {\n <div class=\"ax-scheduler-timeline-header ax-scheduler-timeline-header-sticky\">\n <div class=\"ax-scheduler-timeline-resource-header-placeholder\"><span>Resources</span></div>\n @for (hour of hoursArray(); track hour.date.getTime()) {\n <div class=\"ax-scheduler-timeline-header-hours\">\n <span>{{ hour | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}</span>\n </div>\n }\n </div>\n }\n\n <!-- Resource rows -->\n <div class=\"ax-scheduler-timeline-resource-rows\">\n <!-- Current Time Line Indicator -->\n @if (showCurrentTimeIndicator() && getCurrentTimePositionWithOffset() !== null) {\n <div\n #currentTimeLine\n class=\"ax-scheduler-current-time-line\"\n [style.inset-inline-start]=\"getCurrentTimePositionWithOffset()\"\n ></div>\n }\n\n @for (resourceId of resourceIds(); track resourceId) {\n <div class=\"ax-scheduler-timeline-resource-row\" [style.height]=\"getResourceRowHeight(resourceId)\">\n @if (showResourceHeaders()) {\n <!-- Sticky Resource Header -->\n <div class=\"ax-scheduler-timeline-resource-header ax-scheduler-timeline-resource-header-sticky\">\n @if (resourceTemplate() && typeof resourceTemplate() !== 'string') {\n <ng-container\n [ngTemplateOutlet]=\"$any(resourceTemplate())\"\n [ngTemplateOutletContext]=\"{\n $implicit: getResourceContext(resourceId),\n resource: getResourceContext(resourceId),\n resourceId: resourceId,\n }\"\n ></ng-container>\n } @else {\n <span class=\"ax-scheduler-timeline-resource-title\">{{ getResourceTitle(resourceId) }}</span>\n }\n </div>\n }\n\n <!-- Resource Content -->\n <div class=\"ax-scheduler-timeline-resource-content\">\n <div class=\"ax-scheduler-timeline-appointment-container\">\n @for (layout of getAppointmentLayoutsForResource(resourceId); track layout.appointment.id) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || layout.appointment.readonly || readonly()\"\n [dragData]=\"layout.appointment\"\n (pointerdown)=\"getSlotId($event)\"\n (click)=\"handleAppointmentEvent($event, layout.appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, layout.appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, layout.appointment)\"\n [title]=\"tooltipTemplate() ? '' : layout.appointment.title\"\n [style.width]=\"layout.layoutWidth\"\n [style.height]=\"layout.layoutHeight\"\n class=\"ax-scheduler-timeline-appointment\"\n [style.insetBlockStart]=\"layout.layoutTop\"\n [style.insetInlineStart]=\"layout.layoutLeft\"\n [ngClass]=\"\n layout.appointment.cssClass ?? `ax-scheduler-${layout.appointment.priority ?? 'primary'}-periority`\n \"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltipContext]=\"layout.appointment\"\n [axTooltip]=\"tooltipTemplate()\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ layout.appointment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, layout.appointment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n <ax-subtitle>\n {{\n layout.appointment.originalStartDate\n | format: 'time' : { format: 'HH:mm', calendar: calendar() }\n | async\n }}\n -\n {{\n layout.appointment.originalEndDate\n | format: 'time' : { format: 'HH:mm', calendar: calendar() }\n | async\n }}\n </ax-subtitle>\n </div>\n }\n </div>\n <div class=\"ax-scheduler-timeline-slot-row\" aria-hidden=\"true\">\n @for (time of hoursArray(); track time.date.getTime()) {\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleDrop($event, time, resourceId)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n class=\"ax-scheduler-timeline-slot-cell\"\n (click)=\"handleSlotEvent($event, time)\"\n (dblclick)=\"handleSlotEvent($event, time)\"\n (contextmenu)=\"handleSlotEvent($event, time)\"\n [attr.data-slot-id]=\"time.format('YYYYMMDD-HHmm')\"\n [attr.data-resource-id]=\"resourceId\"\n ></div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n}\n","import { AXComponent, NXComponent } from '@acorex/cdk/common';\nimport { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXCalendarService, AXDateTime, AXHolidayDate } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe, NgClass, NgTemplateOutlet } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n ElementRef,\n HostBinding,\n TemplateRef,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { isEqual, orderBy } from 'lodash-es';\nimport { AXSchedulerAppointment, AXSchedulerAppointmentSegment, AXSchedulerResource } from '../../scheduler.class';\nimport {\n AXSchedulerAppointmentMouseEvent,\n AXSchedulerComponent,\n AXSchedulerSlotDropEvent,\n AXSchedulerSlotMouseEvent,\n} from '../../scheduler.component';\nimport { AXSchedulerService } from '../../scheduler.service';\n\nexport interface TimelineMonthViewDayData {\n date: AXDateTime;\n // These will be segments, precisely clipped and flagged for this day\n visibleAppointments: AXSchedulerAppointmentSegment[];\n hiddenAppointments: AXSchedulerAppointmentSegment[];\n moreCount: number;\n // You might also want to store all segments for the day if needed elsewhere\n // allSegmentsForDay: AXSchedulerAppointmentSegmentType[];\n holiday?: { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate };\n // Resource-specific data\n appointmentsByResource?: Map<\n string,\n { visible: AXSchedulerAppointmentSegment[]; hidden: AXSchedulerAppointmentSegment[]; moreCount: number }\n >;\n}\n\n@Component({\n selector: 'ax-scheduler-timeline-month-view',\n templateUrl: './scheduler-timeline-month-view.component.html',\n styleUrl: './scheduler-timeline-month-view.component.compiled.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n NgClass,\n NgTemplateOutlet,\n AsyncPipe,\n AXFormatPipe,\n AXDragDirective,\n AXTranslatorPipe,\n AXPopoverComponent,\n AXTooltipDirective,\n AXDropZoneDirective,\n AXDecoratorIconComponent,\n AXDecoratorGenericComponent,\n ],\n providers: [{ provide: AXComponent, useExisting: AXSchedulerTimelineMonthViewComponent }],\n})\nexport class AXSchedulerTimelineMonthViewComponent extends NXComponent implements AfterViewInit {\n private document = inject(DOCUMENT);\n private scheduler = inject(AXSchedulerComponent);\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n\n private readonly MAX_VISIBLE_APPOINTMENTS_PER_DAY = 3;\n\n readonly = input(false);\n draggable = input(true);\n hasActions = input(false);\n dragStartDelay = input(0);\n calendar = input<string>();\n showResourceHeaders = input(true);\n date = input.required<AXDateTime>();\n showUnassignedAppointments = input(true);\n resources = input<AXSchedulerResource[]>([]);\n showCurrentTimeIndicator = input<boolean>(true);\n resourceTemplate = input<TemplateRef<unknown>>();\n appointments = input<AXSchedulerAppointment[]>([]);\n tooltipTemplate = input<string | TemplateRef<unknown>>();\n\n private dragStartSlotId = signal<string | null>(null);\n private dragStartSlotResourceId = signal<any>(null);\n\n currentTimeLineElement = viewChild<ElementRef<HTMLElement>>('currentTimeLine');\n\n protected processedDayData = computed<TimelineMonthViewDayData[]>(() => {\n const allOriginalAppointments = this.appointments();\n const monthStartDate = this.date().startOf('month');\n const daysInMonth = monthStartDate.endOf('month').dayOfMonth;\n const resources = this.resources();\n const showUnassigned = this.showUnassignedAppointments();\n\n if (!allOriginalAppointments) {\n return Array.from({ length: daysInMonth }, (_, i) => {\n const dayDate = monthStartDate.add('day', i);\n\n return {\n date: dayDate,\n visibleAppointments: [],\n hiddenAppointments: [],\n moreCount: 0,\n appointmentsByResource: resources.length > 0 ? new Map() : undefined,\n };\n });\n }\n\n const result: TimelineMonthViewDayData[] = [];\n\n for (let i = 0; i < daysInMonth; i++) {\n const currentDayDate = monthStartDate.add('day', i).startOf('day'); // Ensure it's start of day\n const segmentsForThisDay: AXSchedulerAppointmentSegment[] = [];\n\n for (const appt of allOriginalAppointments) {\n // For Timeline Month View, each day is a row. We want segments for the full 24h of that day.\n // The view's startHour/endHour are NOT used to clip segments here,\n // as it's not a horizontal time scale *within* the day row.\n const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(appt, currentDayDate, 0, 24, true);\n if (segment) {\n segmentsForThisDay.push(segment);\n }\n }\n\n // Sort segments: all-day first, then by segment start time (which is clipped to the day)\n const sortedSegments = orderBy(\n segmentsForThisDay,\n [\n (s) => (s.allDay ? 0 : 1), // Segments marked as allDay first\n (s) => s.startDate.getTime(), // Segment's start time on this day\n (s) => s.endDate.getTime() - s.startDate.getTime(), // Segment's duration on this day\n (s) => s.title?.toLowerCase() ?? '',\n ],\n ['asc', 'asc', 'desc', 'asc'],\n );\n\n const visibleAppointments = sortedSegments.slice(0, this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n const hiddenAppointments = sortedSegments.slice(this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n\n // Handle resource grouping if resources are provided\n let appointmentsByResource:\n | Map<\n string,\n { visible: AXSchedulerAppointmentSegment[]; hidden: AXSchedulerAppointmentSegment[]; moreCount: number }\n >\n | undefined;\n\n if (resources.length > 0) {\n appointmentsByResource = new Map();\n const resourceIds = this.schedulerService.getAllResourceIds(resources, showUnassigned);\n\n for (const resourceId of resourceIds) {\n // Filter segments by resource ID\n const resourceSegments = sortedSegments.filter((segment) => {\n if (resourceId === 'unassigned') {\n return segment.resourceId === undefined || segment.resourceId === null;\n }\n return isEqual(segment.resourceId, resourceId);\n });\n\n const resourceVisible = resourceSegments.slice(0, this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n const resourceHidden = resourceSegments.slice(this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n\n appointmentsByResource.set(resourceId, {\n visible: resourceVisible,\n hidden: resourceHidden,\n moreCount: resourceHidden.length,\n });\n }\n }\n\n result.push({\n date: currentDayDate,\n visibleAppointments: visibleAppointments,\n hiddenAppointments: hiddenAppointments,\n moreCount: hiddenAppointments.length,\n holiday: this.isHoliday(currentDayDate),\n appointmentsByResource,\n });\n }\n return result;\n });\n\n // Internal outputs to be caught by parent AXSchedulerComponent\n slotClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotMouseEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n onActionClickInternal = output<AXSchedulerAppointmentMouseEvent>();\n onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n // --- Event Handlers ---\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n protected handleAppointmentEvent(mouseEvent: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n const appointmentRef = {\n ...originalAppointment,\n endDate: originalAppointment.endDate,\n startDate: originalAppointment.startDate,\n };\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, appointment: appointmentRef, sender: this.scheduler },\n this.eventOutputMap,\n 'appointment',\n );\n }\n protected handleSlotEvent(mouseEvent: MouseEvent, date: AXDateTime) {\n // date is the specific day\n const slotData = this.schedulerService.getSlotData(date.startOf('day'), 'timeline-month');\n if (slotData)\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n this.eventOutputMap,\n 'slot',\n );\n }\n protected handleDrop(e: AXDropZoneDropEvent, date: AXDateTime, resourceId?: any) {\n // date is the specific day\n const slotData = this.schedulerService.getSlotData(date.startOf('day'), 'timeline-month');\n const droppedItem = e.dropped.dragData() as AXSchedulerAppointment;\n const originalAppointment = this.schedulerService.getOriginalAppointment(droppedItem);\n const appointmentRef = {\n ...originalAppointment,\n endDate: originalAppointment.endDate,\n startDate: originalAppointment.startDate,\n };\n\n // Convert 'unassigned' string to undefined for proper unassigned appointments\n const actualResourceId = resourceId === 'unassigned' ? undefined : resourceId;\n\n // Check if it's the same slot (same time AND same resource)\n const dragStartSlotId = this.dragStartSlotId();\n const dropSlotId = e.sender.element().dataset['slotId'];\n const dragStartResourceId = this.dragStartSlotResourceId();\n const isSameSlotDrop = dragStartSlotId === dropSlotId && dragStartResourceId === resourceId;\n\n this.onAppointmentDropInternal.emit({\n dropEvent: e,\n slot: { ...slotData, resourceId: actualResourceId },\n sender: this.scheduler,\n appointment: appointmentRef,\n isSameSlotDrop,\n });\n }\n protected handleActionClick(event: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n event.stopPropagation();\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n this.onActionClickInternal.emit({\n appointment: originalAppointment,\n nativeEvent: event,\n sender: this.scheduler,\n });\n }\n\n protected isToday(date: AXDateTime): boolean {\n const today = this.calendarService.create(new Date());\n return date.equal(today, 'day');\n }\n protected isHoliday(date: AXDateTime): { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate } {\n const isHoliday = this.schedulerService.isHoliday(date);\n if (isHoliday) {\n const globalHoliday = this.calendarService.holidays.find((d) => date.equal(d.date, 'day'));\n const internalHoliday = this.schedulerService.internalHoliday().find((d) => date.equal(d.date, 'day'));\n const holiday = globalHoliday || internalHoliday;\n return {\n state: 'holiday',\n holiday,\n };\n }\n const isWeekend = this.schedulerService.isWeekend(date, this.calendar());\n if (isWeekend) {\n return { state: 'weekend' };\n }\n return { state: 'none' };\n }\n\n /**\n * Gets appointments grouped by resources for timeline view.\n */\n protected appointmentsByResource = computed(() => {\n const allAppointments = this.appointments();\n const resources = this.resources();\n const showUnassigned = this.showUnassignedAppointments();\n\n return this.schedulerService.filterAppointmentsByResources(allAppointments, resources, showUnassigned);\n });\n\n /**\n * Gets all resource IDs including unassigned if applicable.\n */\n protected resourceIds = computed(() => {\n const resources = this.resources();\n const showUnassigned = this.showUnassignedAppointments();\n\n return this.schedulerService.getAllResourceIds(resources, showUnassigned);\n });\n\n /**\n * Gets appointments for a specific resource.\n */\n protected getAppointmentsForResource(resourceId: any): AXSchedulerAppointment[] {\n const appointmentsByResource = this.appointmentsByResource();\n // Find the correct key in the Map using isEqual for proper comparison\n for (const [key, appointments] of appointmentsByResource.entries()) {\n if (key === 'unassigned' && resourceId === 'unassigned') {\n return appointments;\n }\n if (key !== 'unassigned' && isEqual(key, resourceId)) {\n return appointments;\n }\n }\n return [];\n }\n\n /**\n * Gets resource title by ID.\n */\n protected getResourceTitle(resourceId: any): string {\n if (resourceId === 'unassigned') {\n return 'Unassigned';\n }\n const resources = this.resources();\n const resource = resources.find((r) => isEqual(r.id, resourceId));\n return resource?.title || String(resourceId);\n }\n\n protected getResourceContext(resourceId: any) {\n const resources = this.resources();\n const resource = resources.find((r) => isEqual(r.id, resourceId));\n return resource || { id: resourceId, title: String(resourceId) };\n }\n\n protected getCurrentTimePosition(): number | null {\n const now = this.calendarService.create(new Date(), this.calendar());\n const monthStart = this.date().startOf('month');\n const monthEnd = this.date().endOf('month');\n\n // Check if current time is within the displayed month\n if (now.isBefore(monthStart) || now.isAfter(monthEnd)) {\n return null;\n }\n\n // Calculate position as percentage of the month\n const durationFromStart = now.duration(monthStart);\n const totalDuration = monthEnd.duration(monthStart);\n return (durationFromStart.total.days / totalDuration.total.days) * 100;\n }\n\n ngAfterViewInit() {\n // Auto-scroll to current time when available using ResizeObserver\n this.setupCurrentTimeScroll();\n }\n\n private setupCurrentTimeScroll(): (() => void) | undefined {\n const currentPosition = this.getCurrentTimePosition();\n if (currentPosition === null) {\n return undefined;\n }\n\n const timeLineElement = this.currentTimeLineElement()?.nativeElement;\n if (!timeLineElement) {\n return undefined;\n }\n\n // Use ResizeObserver to detect when the element is properly rendered\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.contentRect.width > 0 && entry.contentRect.height > 0) {\n // Element has proper dimensions, scroll to it\n timeLineElement.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n // Disconnect observer after successful scroll\n resizeObserver.disconnect();\n break;\n }\n }\n });\n\n resizeObserver.observe(timeLineElement);\n\n // Cleanup on component destroy\n return () => resizeObserver.disconnect();\n }\n\n /**\n * Gets appointments for a specific resource and day.\n */\n protected getAppointmentsForResourceAndDay(\n resourceId: any,\n dayData: TimelineMonthViewDayData,\n ): { visible: AXSchedulerAppointmentSegment[]; hidden: AXSchedulerAppointmentSegment[]; moreCount: number } {\n if (!dayData.appointmentsByResource) {\n return { visible: [], hidden: [], moreCount: 0 };\n }\n return dayData.appointmentsByResource.get(resourceId) || { visible: [], hidden: [], moreCount: 0 };\n }\n\n protected getSlotId(e: PointerEvent) {\n const dropListElement = this.document\n .elementsFromPoint(e.clientX, e.clientY)\n .find((el): el is HTMLElement => el instanceof HTMLElement && el.dataset['slotId'] !== undefined);\n this.dragStartSlotId.set(dropListElement ? dropListElement.dataset['slotId'] : null);\n this.dragStartSlotResourceId.set(dropListElement ? dropListElement.dataset['resourceId'] : null);\n }\n\n /**\n * Gets the height for a specific resource row based on appointments.\n */\n protected getResourceRowHeight(resourceId: any): string {\n const dayData = this.processedDayData();\n let maxAppointments = 0;\n let hasMoreLink = false;\n\n // Find the maximum number of visible appointments for this resource across all days\n // Only consider visible appointments, not hidden ones\n for (const day of dayData) {\n const resourceAppointments = this.getAppointmentsForResourceAndDay(resourceId, day);\n maxAppointments = Math.max(maxAppointments, resourceAppointments.visible.length);\n\n // Check if any day has hidden appointments (more link)\n if (resourceAppointments.moreCount > 0) {\n hasMoreLink = true;\n }\n }\n\n if (maxAppointments === 0) {\n // If no appointments, use minimum height (one appointment height)\n return 'var(--ax-comp-scheduler-basic-view-blocks-height)';\n }\n\n // Use CSS calc with CSS variables for dynamic height calculation\n // Formula: (appointments * appointment-height) + (gaps) + (more-link if present)\n const appointmentHeight = 'var(--ax-comp-scheduler-timeline-month-appointment-height, 3rem)';\n const gapHeight = 'var(--ax-comp-scheduler-timeline-month-gap-height, 0.125rem)';\n const moreLinkHeight = 'var(--ax-comp-scheduler-timeline-month-more-link-height, 2.5rem)';\n\n if (hasMoreLink) {\n // If there are hidden appointments, add space for the more link\n return `calc(${maxAppointments} * ${appointmentHeight} + ${maxAppointments - 1} * ${gapHeight} + ${moreLinkHeight})`;\n } else {\n // No more link needed\n return `calc(${maxAppointments} * ${appointmentHeight} + ${maxAppointments - 1} * ${gapHeight})`;\n }\n }\n\n /**\n * Calculates the maximum number of overlapping appointment rows needed.\n * This is a simplified version for timeline month view.\n */\n protected calculateMaxOverlappingRows(appointments: AXSchedulerAppointmentSegment[]): number {\n if (appointments.length === 0) return 1;\n\n // For timeline month view, we'll use a simple approach\n // Each appointment takes one row, so the max overlapping rows is just the count\n return Math.max(1, appointments.length);\n }\n\n protected shouldShowCurrentTimeForDay(dayDate: AXDateTime): boolean {\n const now = this.calendarService.create(new Date(), this.calendar());\n const monthStart = this.date().startOf('month');\n const monthEnd = this.date().endOf('month');\n\n // Check if current time is within the displayed month range\n if (now.isBefore(monthStart) || now.isAfter(monthEnd)) {\n return false;\n }\n\n // Check if current time is on the same day as this day column\n return now.isSame(dayDate, 'day');\n }\n\n @HostBinding('class.ax-state-readonly')\n protected get isReadonly() {\n return this.readonly();\n }\n}\n","@if (resources().length === 0 || !showResourceHeaders()) {\n <!-- Original layout when no resources -->\n <div class=\"ax-scheduler-timeline-month-container\">\n @for (dayData of processedDayData(); track dayData.date.date.getTime()) {\n <div>\n <div class=\"ax-scheduler-timeline-header\">\n <div\n [class.ax-state-today]=\"isToday(dayData.date)\"\n class=\"ax-scheduler-month-header-date-day {{\n dayData.holiday.state !== 'none' ? (dayData.holiday.holiday?.cssClass ?? 'ax-state-holiday') : ''\n }}\"\n >\n <span\n class=\"ax-scheduler-month-header-date-day-char ax-scheduler-truncate\"\n [axTooltip]=\"dayData.holiday.holiday?.title ?? ''\"\n >\n {{ dayData.date | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n @if (dayData.holiday.state === 'holiday' && dayData.holiday.holiday.title) {\n ( {{ dayData.holiday.holiday.title }} )\n }\n </span>\n <span class=\"ax-scheduler-month-header-date-day-num\">\n {{ dayData.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n </span>\n </div>\n </div>\n\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleDrop($event, dayData.date)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n class=\"ax-scheduler-timeline-content\"\n (click)=\"handleSlotEvent($event, dayData.date)\"\n (dblclick)=\"handleSlotEvent($event, dayData.date)\"\n (contextmenu)=\"handleSlotEvent($event, dayData.date)\"\n [attr.data-slot-id]=\"dayData.date.format('YYYYMMDD')\"\n >\n <!-- Current Time Line Indicator -->\n @if (\n showCurrentTimeIndicator() && shouldShowCurrentTimeForDay(dayData.date) && getCurrentTimePosition() !== null\n ) {\n <div\n class=\"ax-scheduler-current-time-line\"\n [style.inset-inline-start.%]=\"getCurrentTimePosition()\"\n #currentTimeLine\n ></div>\n }\n <div class=\"ax-scheduler-timeline-appointment-container\">\n @for (segment of dayData.visibleAppointments; track segment.id + segment.originalStartDate.getTime()) {\n <div\n axDrag\n [dragData]=\"segment\"\n [dragCursor]=\"'grab'\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n (pointerdown)=\"getSlotId($event)\"\n (click)=\"handleAppointmentEvent($event, segment)\"\n (dblclick)=\"handleAppointmentEvent($event, segment)\"\n (contextmenu)=\"handleAppointmentEvent($event, segment)\"\n [title]=\"\n tooltipTemplate()\n ? ''\n : segment.allDay\n ? segment.title +\n ' (' +\n (segment.originalStartDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async) +\n ' - ' +\n (segment.originalEndDate | format: 'date' : { format: 'MMM d', calendar: calendar() } | async) +\n ')'\n : segment.title +\n ' (' +\n (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n ' - ' +\n (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n ')'\n \"\n class=\"ax-scheduler-timeline-appointment\"\n [class.all-day-segment]=\"segment.allDay\"\n [ngClass]=\"segment.cssClass ?? `ax-scheduler-${segment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltip]=\"tooltipTemplate()\"\n [axTooltipContext]=\"segment\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, segment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n <!-- Display segment's start/end times or date range -->\n <ax-subtitle>\n @if (segment.allDay) {\n {{ segment.originalStartDate | format: 'date' : { format: 'MMM d', calendar: calendar() } | async }}\n @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n -\n {{ segment.originalEndDate | format: 'date' : { format: 'MMM d', calendar: calendar() } | async }}\n }\n } @else {\n {{ segment.originalStartDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n -\n {{ segment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n }\n </ax-subtitle>\n </div>\n }\n @if (dayData.moreCount > 0) {\n <div #moreAppointments class=\"ax-scheduler-month-overflow-badge\" (click)=\"$event.stopPropagation()\">\n +{{\n '@acorex:common.general.more-items' | translate: { params: { number: dayData.moreCount } } | async\n }}\n </div>\n <ax-popover [target]=\"moreAppointments\" placement=\"bottom-start\" trigger=\"click\">\n <div\n axDropZone\n [class.ax-state-readonly]=\"readonly()\"\n class=\"ax-overlay-pane ax-scheduler-popover ax-scheduler-month-popover-appointment\"\n >\n @for (segment of dayData.hiddenAppointments; track segment.id + segment.originalStartDate.getTime()) {\n <div\n axDrag\n [dragData]=\"segment\"\n [dragCursor]=\"'grab'\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n (click)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n (dblclick)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n (contextmenu)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n [title]=\"\n tooltipTemplate()\n ? ''\n : segment.allDay\n ? segment.title +\n ' (' +\n (segment.originalStartDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async) +\n ' - ' +\n (segment.originalEndDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async) +\n ')'\n : segment.title +\n ' (' +\n (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n ' - ' +\n (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n ')'\n \"\n class=\"ax-scheduler-popover-appointment\"\n [class.all-day-segment]=\"segment.allDay\"\n [ngClass]=\"segment.cssClass ?? `ax-scheduler-${segment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltip]=\"tooltipTemplate()\"\n [axTooltipContext]=\"segment\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, segment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n <ax-subtitle>\n @if (segment.allDay) {\n {{\n segment.originalStartDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async\n }}\n @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n -\n {{\n segment.originalEndDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async\n }}\n }\n } @else {\n {{\n segment.originalStartDate\n | format: 'time' : { format: 'HH:mm', calendar: calendar() }\n | async\n }}\n -\n {{\n segment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n }}\n }\n </ax-subtitle>\n </div>\n }\n </div>\n </ax-popover>\n }\n </div>\n </div>\n </div>\n }\n </div>\n} @else {\n <!-- Resource-based layout with sticky resources -->\n <div class=\"ax-scheduler-timeline-month-resource-container\">\n <!-- Sticky header with resource placeholder and day headers -->\n @if (showResourceHeaders()) {\n <div class=\"ax-scheduler-timeline-month-header-sticky\">\n <div class=\"ax-scheduler-timeline-month-resource-header-placeholder\"><span>Resources</span></div>\n @for (dayData of processedDayData(); track dayData.date.date.getTime()) {\n <div class=\"ax-scheduler-timeline-month-day-header\">\n <div\n [class.ax-state-today]=\"isToday(dayData.date)\"\n class=\"ax-scheduler-month-header-date-day {{\n dayData.holiday?.state !== 'none' ? (dayData.holiday?.holiday?.cssClass ?? 'ax-state-holiday') : ''\n }}\"\n >\n <span\n class=\"ax-scheduler-month-header-date-day-char ax-scheduler-truncate\"\n [axTooltip]=\"dayData.holiday?.holiday?.title ?? ''\"\n >\n {{ dayData.date | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n @if (dayData.holiday?.state === 'holiday' && dayData.holiday?.holiday?.title) {\n ( {{ dayData.holiday.holiday.title }} )\n }\n </span>\n <span class=\"ax-scheduler-month-header-date-day-num\">\n {{ dayData.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n </span>\n </div>\n </div>\n }\n </div>\n }\n\n <!-- Resource rows with sticky resource headers -->\n <div class=\"ax-scheduler-timeline-month-resource-rows\">\n <!-- Current Time Line Indicator -->\n @if (showCurrentTimeIndicator() && getCurrentTimePosition() !== null) {\n <div\n class=\"ax-scheduler-current-time-line\"\n [style.inset-inline-start.%]=\"getCurrentTimePosition()\"\n #currentTimeLine\n ></div>\n }\n\n @for (resourceId of resourceIds(); track resourceId) {\n <div class=\"ax-scheduler-timeline-month-resource-row\" [style.height]=\"getResourceRowHeight(resourceId)\">\n @if (showResourceHeaders()) {\n <!-- Sticky Resource Header -->\n <div class=\"ax-scheduler-timeline-month-resource-header ax-scheduler-timeline-month-resource-header-sticky\">\n @if (resourceTemplate() && typeof resourceTemplate() !== 'string') {\n <ng-container\n [ngTemplateOutlet]=\"$any(resourceTemplate())\"\n [ngTemplateOutletContext]=\"{\n $implicit: getResourceContext(resourceId),\n resource: getResourceContext(resourceId),\n resourceId: resourceId,\n }\"\n ></ng-container>\n } @else {\n <span class=\"ax-scheduler-timeline-month-resource-title\">{{ getResourceTitle(resourceId) }}</span>\n }\n </div>\n }\n\n <!-- Resource Content -->\n <div class=\"ax-scheduler-timeline-month-resource-content\">\n @for (dayData of processedDayData(); track dayData.date.date.getTime()) {\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleDrop($event, dayData.date, resourceId)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n class=\"ax-scheduler-timeline-content\"\n (click)=\"handleSlotEvent($event, dayData.date)\"\n (dblclick)=\"handleSlotEvent($event, dayData.date)\"\n (contextmenu)=\"handleSlotEvent($event, dayData.date)\"\n [attr.data-slot-id]=\"dayData.date.format('YYYYMMDD')\"\n [attr.data-resource-id]=\"resourceId\"\n >\n <div class=\"ax-scheduler-timeline-appointment-container\">\n @for (\n segment of getAppointmentsForResourceAndDay(resourceId, dayData).visible;\n track segment.id + segment.originalStartDate.getTime()\n ) {\n <div\n axDrag\n [dragData]=\"segment\"\n [dragCursor]=\"'grab'\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n (pointerdown)=\"getSlotId($event)\"\n (click)=\"handleAppointmentEvent($event, segment)\"\n (dblclick)=\"handleAppointmentEvent($event, segment)\"\n (contextmenu)=\"handleAppointmentEvent($event, segment)\"\n [title]=\"\n tooltipTemplate()\n ? ''\n : segment.allDay\n ? segment.title +\n ' (' +\n (segment.originalStartDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async) +\n ' - ' +\n (segment.originalEndDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async) +\n ')'\n : segment.title +\n ' (' +\n (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n ' - ' +\n (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n ')'\n \"\n class=\"ax-scheduler-timeline-appointment\"\n [class.all-day-segment]=\"segment.allDay\"\n [ngClass]=\"segment.cssClass ?? `ax-scheduler-${segment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltip]=\"tooltipTemplate()\"\n [axTooltipContext]=\"segment\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, segment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n <ax-subtitle>\n @if (segment.allDay) {\n {{\n segment.originalStartDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async\n }}\n @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n -\n {{\n segment.originalEndDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async\n }}\n }\n } @else {\n {{\n segment.originalStartDate\n | format: 'time' : { format: 'HH:mm', calendar: calendar() }\n | async\n }}\n -\n {{\n segment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n }}\n }\n </ax-subtitle>\n </div>\n }\n @if (getAppointmentsForResourceAndDay(resourceId, dayData).moreCount > 0) {\n <div #moreAppointments class=\"ax-scheduler-month-overflow-badge\" (click)=\"$event.stopPropagation()\">\n +{{\n '@acorex:common.general.more-items'\n | translate\n : { params: { number: getAppointmentsForResourceAndDay(resourceId, dayData).moreCount } }\n | async\n }}\n </div>\n <ax-popover [target]=\"moreAppointments\" placement=\"bottom-start\" trigger=\"click\">\n <div\n axDropZone\n [class.ax-state-readonly]=\"readonly()\"\n class=\"ax-overlay-pane ax-scheduler-popover ax-scheduler-month-popover-appointment\"\n >\n @for (\n segment of getAppointmentsForResourceAndDay(resourceId, dayData).hidden;\n track segment.id + segment.originalStartDate.getTime()\n ) {\n <div\n axDrag\n [dragData]=\"segment\"\n [dragCursor]=\"'grab'\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n (click)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n (dblclick)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n (contextmenu)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n [title]=\"\n tooltipTemplate()\n ? ''\n : segment.allDay\n ? segment.title +\n ' (' +\n (segment.originalStartDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async) +\n ' - ' +\n (segment.originalEndDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async) +\n ')'\n : segment.title +\n ' (' +\n (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n ' - ' +\n (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n ')'\n \"\n class=\"ax-scheduler-popover-appointment\"\n [class.all-day-segment]=\"segment.allDay\"\n [ngClass]=\"segment.cssClass ?? `ax-scheduler-${segment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltip]=\"tooltipTemplate()\"\n [axTooltipContext]=\"segment\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, segment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n <ax-subtitle>\n @if (segment.allDay) {\n {{\n segment.originalStartDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async\n }}\n @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n -\n {{\n segment.originalEndDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async\n }}\n }\n } @else {\n {{\n segment.originalStartDate\n | format: 'time' : { format: 'HH:mm', calendar: calendar() }\n | async\n }}\n -\n {{\n segment.originalEndDate\n | format: 'time' : { format: 'HH:mm', calendar: calendar() }\n | async\n }}\n }\n </ax-subtitle>\n </div>\n }\n </div>\n </ax-popover>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n}\n","import { AXComponent, NXComponent } from '@acorex/cdk/common';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXCalendarService, AXDateTime, AXHolidayDate } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AsyncPipe, NgTemplateOutlet } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n TemplateRef,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport { isEqual } from 'lodash-es';\nimport { AXSchedulerAppointment, AXSchedulerResource } from '../../scheduler.class';\nimport {\n AXSchedulerAppointmentMouseEvent,\n AXSchedulerSlotDropEvent,\n AXSchedulerSlotMouseEvent,\n} from '../../scheduler.component';\nimport { AXSchedulerService } from '../../scheduler.service';\nimport { AXSchedulerTimelineDayViewComponent } from '../timeline-day/scheduler-timeline-day-view.component';\n\nexport interface TimelineMultiDayDaySlot {\n date: AXDateTime;\n // Pass the RAW original appointments that *overlap* with this day.\n // The child timeline-day-view will handle segmentation.\n originalAppointmentsForThisDay: AXSchedulerAppointment[];\n holiday?: { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate };\n}\n\n@Component({\n selector: 'ax-scheduler-timeline-multi-day-view',\n templateUrl: './scheduler-timeline-multi-day-view.component.html',\n styleUrl: './scheduler-timeline-multi-day-view.component.compiled.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [AsyncPipe, NgTemplateOutlet, AXFormatPipe, AXTooltipDirective, AXSchedulerTimelineDayViewComponent],\n providers: [{ provide: AXComponent, useExisting: AXSchedulerTimelineMultiDayViewComponent }],\n})\nexport class AXSchedulerTimelineMultiDayViewComponent extends NXComponent implements AfterViewInit {\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n\n daysCount = input(7);\n readonly = input(false);\n draggable = input(true);\n hasActions = input(false);\n dragStartDelay = input(0);\n calendar = input<string>();\n showResourceHeaders = input(true);\n date = input.required<AXDateTime>();\n endDayHour = input.required<number>();\n showCurrentTimeIndicator = input(true);\n startDayHour = input.required<number>();\n showUnassignedAppointments = input(true);\n resources = input<AXSchedulerResource[]>([]);\n resourceTemplate = input<TemplateRef<unknown>>();\n appointments = input<AXSchedulerAppointment[]>([]);\n tooltipTemplate = input<string | TemplateRef<unknown>>();\n\n currentTimeLineElement = viewChild<ElementRef<HTMLElement>>('currentTimeLine');\n\n protected daysDataForTimelineViews = computed<TimelineMultiDayDaySlot[]>(() => {\n const allOriginalAppointments = this.appointments();\n const multiViewStartDate = this.date();\n const numberOfDays = this.daysCount();\n\n if (!multiViewStartDate || !allOriginalAppointments) {\n return [];\n }\n\n const result: TimelineMultiDayDaySlot[] = [];\n\n for (let i = 0; i < numberOfDays; i++) {\n const currentDayDate = multiViewStartDate.add('day', i);\n const currentDayStart = currentDayDate.startOf('day');\n const currentDayEnd = currentDayDate.endOf('day');\n\n // Filter appointments that overlap with this day, preserving original times\n const appointmentsForThisDay = allOriginalAppointments.filter((appt) => {\n const apptStart = this.calendarService.create(appt.startDate, this.calendar());\n const apptEnd = this.calendarService.create(appt.endDate, this.calendar());\n\n // Check if appointment overlaps with this day\n return apptStart.compare(currentDayEnd, 'second') <= 0 && apptEnd.compare(currentDayStart, 'second') >= 0;\n });\n\n result.push({\n date: currentDayDate,\n holiday: this.isHoliday(currentDayDate),\n originalAppointmentsForThisDay: appointmentsForThisDay,\n });\n }\n return result;\n });\n\n slotClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotMouseEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n onActionClickInternal = output<AXSchedulerAppointmentMouseEvent>();\n onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n protected handleDrop(event: AXSchedulerSlotDropEvent, resourceId: any) {\n // Convert 'unassigned' string to undefined for proper unassigned appointments\n const actualResourceId = resourceId === 'unassigned' ? undefined : resourceId;\n\n // Use the isSameSlotDrop value from the child timeline-day-view component\n // The child component has the proper context for its own day\n const isSameSlotDrop = event.isSameSlotDrop;\n\n // Update the slot with the correct resource ID\n const updatedEvent: AXSchedulerSlotDropEvent = {\n ...event,\n slot: {\n ...event.slot,\n resourceId: actualResourceId,\n },\n isSameSlotDrop,\n };\n\n this.onAppointmentDropInternal.emit(updatedEvent);\n }\n\n protected isToday(date: AXDateTime): boolean {\n const today = this.calendarService.create(new Date());\n return date.equal(today, 'day');\n }\n\n /**\n * Gets appointments grouped by resources for timeline view.\n */\n protected appointmentsByResource = computed(() => {\n const allAppointments = this.appointments();\n const resources = this.resources();\n const showUnassigned = this.showUnassignedAppointments();\n\n return this.schedulerService.filterAppointmentsByResources(allAppointments, resources, showUnassigned);\n });\n\n /**\n * Gets all resource IDs including unassigned if applicable.\n */\n protected resourceIds = computed(() => {\n const resources = this.resources();\n const showUnassigned = this.showUnassignedAppointments();\n\n return this.schedulerService.getAllResourceIds(resources, showUnassigned);\n });\n\n /**\n * Gets appointments for a specific resource.\n */\n protected getAppointmentsForResource(resourceId: any): AXSchedulerAppointment[] {\n const appointmentsByResource = this.appointmentsByResource();\n // Find the correct key in the Map using isEqual for proper comparison\n for (const [key, appointments] of appointmentsByResource.entries()) {\n if (key === 'unassigned' && resourceId === 'unassigned') {\n return appointments;\n }\n if (key !== 'unassigned' && isEqual(key, resourceId)) {\n return appointments;\n }\n }\n return [];\n }\n\n /**\n * Gets resource title by ID.\n */\n protected getResourceTitle(resourceId: any): string {\n if (resourceId === 'unassigned') {\n return 'Unassigned';\n }\n const resources = this.resources();\n const resource = resources.find((r) => isEqual(r.id, resourceId));\n return resource?.title || String(resourceId);\n }\n\n protected getResourceContext(resourceId: any) {\n const resources = this.resources();\n const resource = resources.find((r) => isEqual(r.id, resourceId));\n return resource || { id: resourceId, title: String(resourceId) };\n }\n\n protected getCurrentTimePosition(): number | null {\n const now = this.calendarService.create(new Date(), this.calendar());\n const startHour = this.startDayHour();\n const endHour = this.endDayHour();\n\n // Check if current time is within the visible hours\n if (now.hour < startHour || now.hour >= endHour) {\n return null;\n }\n\n // Calculate position as percentage within the visible time range\n const currentMinutes = now.hour * 60 + now.minute;\n const startMinutes = startHour * 60;\n const endMinutes = endHour * 60;\n const totalMinutes = endMinutes - startMinutes;\n\n const positionInMinutes = currentMinutes - startMinutes;\n return (positionInMinutes / totalMinutes) * 100;\n }\n\n protected shouldShowCurrentTimeForDay(dayDate: AXDateTime): boolean {\n const now = this.calendarService.create(new Date(), this.calendar());\n const multiViewStart = this.date();\n const multiViewEnd = this.date().add('day', this.daysCount() - 1);\n\n // Check if current time is within the displayed multi-day range\n if (now.isBefore(multiViewStart) || now.isAfter(multiViewEnd)) {\n return false;\n }\n\n // Check if current time is on the same day as this day column\n return now.isSame(dayDate, 'day');\n }\n\n ngAfterViewInit() {\n // Auto-scroll to current time when available using ResizeObserver\n this.setupCurrentTimeScroll();\n }\n\n private setupCurrentTimeScroll(): (() => void) | undefined {\n const now = this.calendarService.create(new Date(), this.calendar());\n const multiViewStart = this.date();\n const multiViewEnd = this.date().add('day', this.daysCount() - 1);\n\n // Check if current time is within the displayed multi-day range\n if (now.isBefore(multiViewStart) || now.isAfter(multiViewEnd)) {\n return undefined;\n }\n\n const currentPosition = this.getCurrentTimePosition();\n if (currentPosition === null) {\n return undefined;\n }\n\n const timeLineElement = this.currentTimeLineElement()?.nativeElement;\n if (!timeLineElement) {\n return undefined;\n }\n\n // Use ResizeObserver to detect when the element is properly rendered\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.contentRect.width > 0 && entry.contentRect.height > 0) {\n // Element has proper dimensions, scroll to it\n timeLineElement.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n // Disconnect observer after successful scroll\n resizeObserver.disconnect();\n break;\n }\n }\n });\n\n resizeObserver.observe(timeLineElement);\n\n // Cleanup on component destroy\n return () => resizeObserver.disconnect();\n }\n\n /**\n * Gets appointments for a specific resource and day.\n */\n protected getAppointmentsForResourceAndDay(\n resourceId: any,\n dayAppointments: AXSchedulerAppointment[],\n ): AXSchedulerAppointment[] {\n if (resourceId === 'unassigned') {\n return dayAppointments.filter(\n (appointment) => appointment.resourceId === undefined || appointment.resourceId === null,\n );\n }\n // Use isEqual for proper comparison of resource IDs of any type\n return dayAppointments.filter((appointment) => isEqual(appointment.resourceId, resourceId));\n }\n\n /**\n * Gets the height for a specific resource across all days.\n */\n protected getResourceRowHeight(resourceId: any): string {\n // Calculate the maximum height needed for this specific resource across all days\n const daysData = this.daysDataForTimelineViews();\n let maxHeight = 1; // Minimum height\n\n for (const daySlot of daysData) {\n const appointments = this.getAppointmentsForResourceAndDay(resourceId, daySlot.originalAppointmentsForThisDay);\n if (appointments.length > 0) {\n // Calculate overlapping rows for this resource on this day\n const overlappingRows = this.calculateMaxOverlappingRowsForAppointments(appointments, daySlot.date);\n maxHeight = Math.max(maxHeight, overlappingRows);\n }\n }\n\n // Use CSS calc to return the height\n const GAP_PX = 4; // Same as in timeline-day component\n return `calc(var(--ax-comp-scheduler-basic-view-blocks-height) * ${maxHeight} + ${GAP_PX}px * ${Math.max(0, maxHeight - 1)})`;\n }\n\n /**\n * Calculates the maximum number of overlapping rows for a set of appointments.\n * Uses the actual segmented times that will be displayed in the timeline view.\n */\n private calculateMaxOverlappingRowsForAppointments(\n appointments: AXSchedulerAppointment[],\n dayDate: AXDateTime,\n ): number {\n if (appointments.length === 0) return 1;\n if (appointments.length === 1) return 1;\n\n // Get the actual segments that will be displayed in the timeline view\n const segments: any[] = [];\n const viewConfigStartHour = this.startDayHour();\n const viewConfigEndHour = this.endDayHour();\n\n for (const appointment of appointments) {\n if (appointment.allDay) {\n // For all-day appointments, create a segment that spans the full day\n const dayStart = this.calendarService.create(appointment.startDate, this.calendar()).startOf('day');\n const dayEnd = this.calendarService.create(appointment.endDate, this.calendar()).startOf('day');\n\n // Check if the all-day appointment overlaps with the current day\n const currentDayStart = dayDate.startOf('day');\n const currentDayEnd = dayDate.endOf('day');\n\n if (dayStart.compare(currentDayEnd, 'day') <= 0 && dayEnd.compare(currentDayStart, 'day') >= 0) {\n segments.push({\n startDate: currentDayStart.date,\n endDate: currentDayEnd.date,\n allDay: true,\n });\n }\n } else {\n // For regular appointments, get the proper segment\n const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(\n appointment,\n dayDate,\n viewConfigStartHour,\n viewConfigEndHour,\n false,\n );\n\n if (segment) {\n segments.push(segment);\n }\n }\n }\n\n if (segments.length === 0) return 1;\n if (segments.length === 1) return 1;\n\n // Sort segments by start time, then by end time (descending)\n const sortedSegments = [...segments].sort((a, b) => {\n const startDiff = a.startDate.getTime() - b.startDate.getTime();\n if (startDiff !== 0) return startDiff;\n return b.endDate.getTime() - a.endDate.getTime();\n });\n\n const rowEndTimes: Date[] = [];\n let maxRows = 0;\n\n for (const segment of sortedSegments) {\n let assignedRowIndex = -1;\n\n // Find the first row where this segment can fit\n for (let i = 0; i < rowEndTimes.length; i++) {\n if (segment.startDate >= rowEndTimes[i]) {\n assignedRowIndex = i;\n break;\n }\n }\n\n // If no row is available, create a new one\n if (assignedRowIndex === -1) {\n assignedRowIndex = rowEndTimes.length;\n rowEndTimes.push(segment.endDate);\n } else {\n rowEndTimes[assignedRowIndex] = segment.endDate;\n }\n\n maxRows = Math.max(maxRows, rowEndTimes.length);\n }\n\n return Math.max(maxRows, 1);\n }\n\n /**\n * Gets the hours array for time slots display.\n */\n protected getHoursArray(): AXDateTime[] {\n const startHour = this.startDayHour();\n const endHour = this.endDayHour();\n const hours: AXDateTime[] = [];\n\n // Use the first day's date as a base for creating time slots\n const firstDay = this.daysDataForTimelineViews()[0];\n if (!firstDay) return [];\n\n let time = firstDay.date.set('hour', startHour).startOf('hour');\n hours.push(time);\n\n while (time.hour < endHour - 1) {\n time = time.add('hour', 1);\n hours.push(time);\n }\n\n return hours;\n }\n\n /**\n * Gets the number of hours for CSS calculations.\n */\n protected getHoursCount(): number {\n return this.endDayHour() - this.startDayHour();\n }\n\n protected isHoliday(date: AXDateTime): { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate } {\n const isHoliday = this.schedulerService.isHoliday(date);\n if (isHoliday) {\n const globalHoliday = this.calendarService.holidays.find((d) => date.equal(d.date, 'day'));\n const internalHoliday = this.schedulerService.internalHoliday().find((d) => date.equal(d.date, 'day'));\n const holiday = globalHoliday || internalHoliday;\n return {\n state: 'holiday',\n holiday,\n };\n }\n const isWeekend = this.schedulerService.isWeekend(date, this.calendar());\n if (isWeekend) {\n return { state: 'weekend' };\n }\n return { state: 'none' };\n }\n}\n","@if (resources().length === 0 || !showResourceHeaders()) {\n <!-- Original layout when no resources -->\n <div class=\"ax-scheduler-timeline-day-view-container\">\n @for (daySlot of daysDataForTimelineViews(); track daySlot.date.date.getTime()) {\n <div class=\"ax-scheduler-timeline-multi-day-column\">\n <div\n [class.ax-state-today]=\"isToday(daySlot.date)\"\n class=\"ax-scheduler-week-header-date-day {{\n daySlot.holiday.state !== 'none' ? (daySlot.holiday.holiday?.cssClass ?? 'ax-state-holiday') : ''\n }}\"\n >\n <span\n class=\"ax-scheduler-week-header-date-day-char ax-scheduler-truncate\"\n [axTooltip]=\"daySlot.holiday.holiday?.title ?? ''\"\n >\n {{ daySlot.date | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n @if (daySlot.holiday.state === 'holiday' && daySlot.holiday.holiday.title) {\n ( {{ daySlot.holiday.holiday.title }} )\n }\n </span>\n <span class=\"ax-scheduler-week-header-date-day-num\">\n {{ daySlot.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n </span>\n </div>\n <ax-scheduler-timeline-day-view\n [date]=\"daySlot.date\"\n [readonly]=\"readonly()\"\n [draggable]=\"draggable()\"\n [resources]=\"resources()\"\n [endDayHour]=\"endDayHour()\"\n [hasActions]=\"hasActions()\"\n [showResourceHeaders]=\"true\"\n [startDayHour]=\"startDayHour()\"\n [dragStartDelay]=\"dragStartDelay()\"\n [tooltipTemplate]=\"tooltipTemplate()\"\n [showCurrentTimeIndicator]=\"showCurrentTimeIndicator()\"\n [appointments]=\"daySlot.originalAppointmentsForThisDay\"\n [showUnassignedAppointments]=\"showUnassignedAppointments()\"\n (onActionClickInternal)=\"onActionClickInternal.emit($event)\"\n (slotClickedInternal)=\"slotClickedInternal.emit($event)\"\n (slotDblClickedInternal)=\"slotDblClickedInternal.emit($event)\"\n (slotRightClickedInternal)=\"slotRightClickedInternal.emit($event)\"\n (onAppointmentDropInternal)=\"handleDrop($event, undefined)\"\n (appointmentClickedInternal)=\"appointmentClickedInternal.emit($event)\"\n (appointmentDblClickedInternal)=\"appointmentDblClickedInternal.emit($event)\"\n (appointmentRightClickedInternal)=\"appointmentRightClickedInternal.emit($event)\"\n >\n </ax-scheduler-timeline-day-view>\n </div>\n }\n </div>\n} @else {\n <!-- Resource-based layout for multi-day -->\n <div\n class=\"ax-scheduler-timeline-multi-day-resource-container\"\n [style.--ax-comp-scheduler-hours-count]=\"getHoursCount()\"\n >\n <!-- Top header with day names -->\n <div class=\"ax-scheduler-timeline-multi-day-top-header\">\n <!-- Resource placeholder -->\n <div class=\"ax-scheduler-timeline-multi-day-resource-header-placeholder\"></div>\n <!-- Day headers -->\n @for (daySlot of daysDataForTimelineViews(); track daySlot.date.date.getTime()) {\n <div class=\"ax-scheduler-timeline-multi-day-day-header\">\n <div\n [class.ax-state-today]=\"isToday(daySlot.date)\"\n class=\"ax-scheduler-week-header-date-day {{\n daySlot.holiday.state !== 'none' ? (daySlot.holiday.holiday?.cssClass ?? 'ax-state-holiday') : ''\n }}\"\n >\n <span\n class=\"ax-scheduler-week-header-date-day-char ax-scheduler-truncate\"\n [axTooltip]=\"daySlot.holiday.holiday?.title ?? ''\"\n >\n {{ daySlot.date | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n @if (daySlot.holiday.state === 'holiday' && daySlot.holiday.holiday.title) {\n ( {{ daySlot.holiday.holiday.title }} )\n }\n </span>\n <span class=\"ax-scheduler-week-header-date-day-num\">\n {{ daySlot.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n </span>\n </div>\n </div>\n }\n </div>\n\n <!-- Time header with hours for each day -->\n <div class=\"ax-scheduler-timeline-multi-day-time-header\">\n <!-- Resource placeholder -->\n <div class=\"ax-scheduler-timeline-multi-day-time-header-placeholder\"><span>Resources</span></div>\n <!-- Time slots for each day -->\n @for (daySlot of daysDataForTimelineViews(); track daySlot.date.date.getTime()) {\n <div class=\"ax-scheduler-timeline-multi-day-day-time-slots\">\n @for (hour of getHoursArray(); track hour.date.getTime()) {\n <div class=\"ax-scheduler-timeline-multi-day-time-slot\">\n <span>{{ hour | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}</span>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Main content area -->\n <div class=\"ax-scheduler-timeline-multi-day-content\">\n <!-- Resource headers column -->\n <div class=\"ax-scheduler-timeline-multi-day-resource-headers\">\n <!-- Resource headers -->\n @for (resourceId of resourceIds(); track resourceId) {\n <div\n class=\"ax-scheduler-timeline-multi-day-resource-header\"\n [style.height]=\"getResourceRowHeight(resourceId)\"\n >\n @if (resourceTemplate() && typeof resourceTemplate() !== 'string') {\n <ng-container\n [ngTemplateOutlet]=\"$any(resourceTemplate())\"\n [ngTemplateOutletContext]=\"{\n $implicit: getResourceContext(resourceId),\n resource: getResourceContext(resourceId),\n resourceId: resourceId,\n }\"\n ></ng-container>\n } @else {\n <span class=\"ax-scheduler-timeline-resource-title\">{{ getResourceTitle(resourceId) }}</span>\n }\n </div>\n }\n </div>\n\n <!-- Days columns -->\n <div class=\"ax-scheduler-timeline-multi-day-days-container\" #daysContainer>\n @for (daySlot of daysDataForTimelineViews(); track daySlot.date.date.getTime()) {\n <div class=\"ax-scheduler-timeline-multi-day-column\">\n <!-- Current Time Line Indicator for this day -->\n @if (\n showCurrentTimeIndicator() &&\n shouldShowCurrentTimeForDay(daySlot.date) &&\n getCurrentTimePosition() !== null\n ) {\n <div\n class=\"ax-scheduler-current-time-line\"\n [style.inset-inline-start.%]=\"getCurrentTimePosition()\"\n #currentTimeLine\n ></div>\n }\n <!-- Resource rows for this day -->\n <div class=\"ax-scheduler-timeline-multi-day-resource-rows\">\n @for (resourceId of resourceIds(); track resourceId) {\n <div\n class=\"ax-scheduler-timeline-multi-day-resource-row\"\n [style.height]=\"getResourceRowHeight(resourceId)\"\n >\n <ax-scheduler-timeline-day-view\n [date]=\"daySlot.date\"\n [readonly]=\"readonly()\"\n [draggable]=\"draggable()\"\n [resources]=\"\n resourceId === 'unassigned' ? [] : [{ id: resourceId, title: getResourceTitle(resourceId) }]\n \"\n [endDayHour]=\"endDayHour()\"\n [hasActions]=\"hasActions()\"\n [showResourceHeaders]=\"false\"\n [startDayHour]=\"startDayHour()\"\n [showCurrentTimeIndicator]=\"false\"\n [dragStartDelay]=\"dragStartDelay()\"\n [tooltipTemplate]=\"tooltipTemplate()\"\n [showUnassignedAppointments]=\"resourceId === 'unassigned'\"\n [appointments]=\"\n getAppointmentsForResourceAndDay(resourceId, daySlot.originalAppointmentsForThisDay)\n \"\n (onActionClickInternal)=\"onActionClickInternal.emit($event)\"\n (slotClickedInternal)=\"slotClickedInternal.emit($event)\"\n (slotDblClickedInternal)=\"slotDblClickedInternal.emit($event)\"\n (slotRightClickedInternal)=\"slotRightClickedInternal.emit($event)\"\n (onAppointmentDropInternal)=\"handleDrop($event, resourceId)\"\n (appointmentClickedInternal)=\"appointmentClickedInternal.emit($event)\"\n (appointmentDblClickedInternal)=\"appointmentDblClickedInternal.emit($event)\"\n (appointmentRightClickedInternal)=\"appointmentRightClickedInternal.emit($event)\"\n >\n </ax-scheduler-timeline-day-view>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n}\n","import { AXComponent, NXComponent } from '@acorex/cdk/common';\nimport { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXCalendarService, AXDateTime, AXHolidayDate } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe, NgClass, NgTemplateOutlet } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n ElementRef,\n TemplateRef,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { isEqual, orderBy } from 'lodash-es';\nimport { AXSchedulerAppointment, AXSchedulerAppointmentSegment, AXSchedulerResource } from '../../scheduler.class';\nimport {\n AXSchedulerAppointmentMouseEvent,\n AXSchedulerComponent,\n AXSchedulerSlotDropEvent,\n AXSchedulerSlotMouseEvent,\n} from '../../scheduler.component';\nimport { AXSchedulerService } from '../../scheduler.service';\n\nexport interface TimelineYearViewDayData {\n date: AXDateTime;\n // These will be segments, precisely clipped and flagged for this day\n visibleAppointments: AXSchedulerAppointmentSegment[];\n hiddenAppointments: AXSchedulerAppointmentSegment[];\n moreCount: number;\n holiday?: { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate };\n // Resource-specific data\n appointmentsByResource?: Map<\n string,\n { visible: AXSchedulerAppointmentSegment[]; hidden: AXSchedulerAppointmentSegment[]; moreCount: number }\n >;\n}\n\n@Component({\n selector: 'ax-scheduler-timeline-year-view',\n templateUrl: './scheduler-timeline-year-view.component.html',\n styleUrl: './scheduler-timeline-year-view.component.compiled.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n NgClass,\n NgTemplateOutlet,\n AsyncPipe,\n AXFormatPipe,\n AXDragDirective,\n AXTranslatorPipe,\n AXPopoverComponent,\n AXTooltipDirective,\n AXDropZoneDirective,\n AXDecoratorIconComponent,\n AXDecoratorGenericComponent,\n ],\n providers: [{ provide: AXComponent, useExisting: AXSchedulerTimelineYearViewComponent }],\n})\nexport class AXSchedulerTimelineYearViewComponent extends NXComponent implements AfterViewInit {\n private document = inject(DOCUMENT);\n private scheduler = inject(AXSchedulerComponent);\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n\n private readonly MAX_VISIBLE_APPOINTMENTS_PER_DAY = 3; // Reduced for year view due to space constraints\n\n readonly = input(false);\n draggable = input(true);\n hasActions = input(false);\n dragStartDelay = input(0);\n calendar = input<string>();\n showResourceHeaders = input(true);\n date = input.required<AXDateTime>();\n showUnassignedAppointments = input(true);\n resources = input<AXSchedulerResource[]>([]);\n showCurrentTimeIndicator = input<boolean>(true);\n resourceTemplate = input<TemplateRef<unknown>>();\n appointments = input<AXSchedulerAppointment[]>([]);\n tooltipTemplate = input<string | TemplateRef<unknown>>();\n\n private dragStartSlotId = signal<string | null>(null);\n private dragStartSlotResourceId = signal<any>(null);\n\n currentTimeLineElement = viewChild<ElementRef<HTMLElement>>('currentTimeLine');\n\n // Performance optimization: reduce drag start delay for year view\n protected optimizedDragStartDelay = computed(() => {\n return this.dragStartDelay() > 0 ? Math.min(this.dragStartDelay(), 50) : 0;\n });\n\n protected processedDayData = computed<TimelineYearViewDayData[]>(() => {\n const allOriginalAppointments = this.appointments();\n const yearStartDate = this.date().startOf('year');\n const yearEndDate = this.date().endOf('year');\n const daysInYear = yearEndDate.dayOfYear;\n const resources = this.resources();\n const showUnassigned = this.showUnassignedAppointments();\n\n if (!allOriginalAppointments) {\n return Array.from({ length: daysInYear }, (_, i) => {\n const currentDayDate = yearStartDate.add('day', i).startOf('day');\n return {\n date: currentDayDate,\n visibleAppointments: [],\n hiddenAppointments: [],\n moreCount: 0,\n holiday: this.getHolidayInfo(currentDayDate),\n };\n });\n }\n\n const result: TimelineYearViewDayData[] = [];\n\n for (let i = 0; i < daysInYear; i++) {\n const currentDayDate = yearStartDate.add('day', i).startOf('day');\n const segmentsForThisDay: AXSchedulerAppointmentSegment[] = [];\n\n for (const appt of allOriginalAppointments) {\n // For Timeline Year View, each day is a column. We want segments for the full 24h of that day.\n const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(appt, currentDayDate, 0, 24, true);\n if (segment) {\n segmentsForThisDay.push(segment);\n }\n }\n\n // Sort segments: all-day first, then by segment start time (which is clipped to the day)\n const sortedSegments = orderBy(\n segmentsForThisDay,\n [\n (s) => (s.allDay ? 0 : 1), // Segments marked as allDay first\n (s) => s.startDate.getTime(), // Segment's start time on this day\n (s) => s.endDate.getTime() - s.startDate.getTime(), // Segment's duration on this day\n (s) => s.title?.toLowerCase() ?? '',\n ],\n ['asc', 'asc', 'desc', 'asc'],\n );\n\n const visibleAppointments = sortedSegments.slice(0, this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n const hiddenAppointments = sortedSegments.slice(this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n\n // Handle resource grouping if resources are provided\n let appointmentsByResource:\n | Map<\n string,\n { visible: AXSchedulerAppointmentSegment[]; hidden: AXSchedulerAppointmentSegment[]; moreCount: number }\n >\n | undefined;\n\n if (resources.length > 0) {\n appointmentsByResource = new Map();\n const allResourceIds = this.schedulerService.getAllResourceIds(resources, showUnassigned);\n\n allResourceIds.forEach((resourceId) => {\n const appointmentsForResource = this.schedulerService.getAppointmentsForResource(\n allOriginalAppointments,\n resourceId,\n );\n\n const resourceSegments: AXSchedulerAppointmentSegment[] = [];\n for (const appt of appointmentsForResource) {\n const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(appt, currentDayDate, 0, 24, true);\n if (segment) {\n resourceSegments.push(segment);\n }\n }\n\n const sortedResourceSegments = orderBy(\n resourceSegments,\n [\n (s) => (s.allDay ? 0 : 1),\n (s) => s.startDate.getTime(),\n (s) => s.endDate.getTime() - s.startDate.getTime(),\n (s) => s.title?.toLowerCase() ?? '',\n ],\n ['asc', 'asc', 'desc', 'asc'],\n );\n\n const visible = sortedResourceSegments.slice(0, this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n const hidden = sortedResourceSegments.slice(this.MAX_VISIBLE_APPOINTMENTS_PER_DAY);\n\n appointmentsByResource.set(resourceId, {\n visible,\n hidden,\n moreCount: hidden.length,\n });\n });\n }\n\n result.push({\n date: currentDayDate,\n visibleAppointments,\n hiddenAppointments,\n moreCount: hiddenAppointments.length,\n holiday: this.getHolidayInfo(currentDayDate),\n appointmentsByResource,\n });\n }\n\n return result;\n });\n\n protected resourceIds = computed(() => {\n const resources = this.resources();\n if (resources.length === 0) return [];\n return this.schedulerService.getAllResourceIds(resources, this.showUnassignedAppointments());\n });\n\n private getHolidayInfo(date: AXDateTime): { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate } {\n const isHoliday = this.schedulerService.isHoliday(date);\n if (isHoliday) {\n const globalHoliday = this.calendarService.holidays.find((d) => date.equal(d.date, 'day'));\n const internalHoliday = this.schedulerService.internalHoliday().find((d) => date.equal(d.date, 'day'));\n const holiday = globalHoliday || internalHoliday;\n return {\n state: 'holiday',\n holiday,\n };\n }\n const isWeekend = this.schedulerService.isWeekend(date, this.calendar());\n if (isWeekend) {\n return { state: 'weekend' };\n }\n return { state: 'none' };\n }\n\n protected isToday(date: AXDateTime): boolean {\n const today = this.calendarService.create(new Date(), this.calendar());\n return date.equal(today, 'day');\n }\n\n protected getResourceTitle(resourceId: any): string {\n const resources = this.resources();\n const resource = resources.find((r) => isEqual(r.id, resourceId));\n return resource?.title ?? String(resourceId);\n }\n\n protected getAppointmentsForResourceAndDay(resourceId: any, dayData: TimelineYearViewDayData) {\n return dayData.appointmentsByResource?.get(resourceId) ?? { visible: [], hidden: [], moreCount: 0 };\n }\n\n protected getResourceContext(resourceId: any) {\n const resources = this.resources();\n const resource = resources.find((r) => isEqual(r.id, resourceId));\n return resource || { id: resourceId, title: String(resourceId) };\n }\n\n protected getCurrentTimePosition(): number | null {\n const now = this.calendarService.create(new Date(), this.calendar());\n const yearStart = this.date().startOf('year');\n const yearEnd = this.date().endOf('year');\n\n // Check if current time is within the displayed year\n if (now.isBefore(yearStart) || now.isAfter(yearEnd)) {\n return null;\n }\n\n // Calculate position as percentage of the year\n const durationFromStart = now.duration(yearStart);\n const totalDuration = yearEnd.duration(yearStart);\n return (durationFromStart.total.days / totalDuration.total.days) * 100;\n }\n\n ngAfterViewInit() {\n // Auto-scroll to current time when available using ResizeObserver\n this.setupCurrentTimeScroll();\n }\n\n private setupCurrentTimeScroll(): (() => void) | undefined {\n const currentPosition = this.getCurrentTimePosition();\n if (currentPosition === null) {\n return undefined;\n }\n\n const timeLineElement = this.currentTimeLineElement()?.nativeElement;\n if (!timeLineElement) {\n return undefined;\n }\n\n // Use ResizeObserver to detect when the element is properly rendered\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.contentRect.width > 0 && entry.contentRect.height > 0) {\n // Element has proper dimensions, scroll to it\n timeLineElement.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n // Disconnect observer after successful scroll\n resizeObserver.disconnect();\n break;\n }\n }\n });\n\n resizeObserver.observe(timeLineElement);\n\n // Cleanup on component destroy\n return () => resizeObserver.disconnect();\n }\n\n // Internal outputs to be caught by parent AXSchedulerComponent\n slotClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotDblClickedInternal = output<AXSchedulerSlotMouseEvent>();\n slotRightClickedInternal = output<AXSchedulerSlotMouseEvent>();\n appointmentClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentDblClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n appointmentRightClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n onActionClickInternal = output<AXSchedulerAppointmentMouseEvent>();\n onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n // --- Event Handlers ---\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n\n protected handleAppointmentEvent(mouseEvent: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n const appointmentRef = {\n ...originalAppointment,\n endDate: originalAppointment.endDate,\n startDate: originalAppointment.startDate,\n };\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, appointment: appointmentRef, sender: this.scheduler },\n this.eventOutputMap,\n 'appointment',\n );\n }\n\n protected handleSlotEvent(mouseEvent: MouseEvent, date: AXDateTime) {\n // date is the specific day\n const slotData = this.schedulerService.getSlotData(date.startOf('day'), 'timeline-year');\n if (slotData)\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n this.eventOutputMap,\n 'slot',\n );\n }\n\n protected handleDrop(e: AXDropZoneDropEvent, date: AXDateTime, resourceId?: any) {\n // date is the specific day\n const slotData = this.schedulerService.getSlotData(date.startOf('day'), 'timeline-year');\n const droppedItem = e.dropped.dragData() as AXSchedulerAppointment;\n const originalAppointment = this.schedulerService.getOriginalAppointment(droppedItem);\n const appointmentRef = {\n ...originalAppointment,\n endDate: originalAppointment.endDate,\n startDate: originalAppointment.startDate,\n };\n\n // Convert 'unassigned' string to undefined for proper unassigned appointments\n const actualResourceId = resourceId === 'unassigned' ? undefined : resourceId;\n\n // Check if it's the same slot (same time AND same resource)\n const dragStartSlotId = this.dragStartSlotId();\n const dropSlotId = e.sender.element().dataset['slotId'];\n const dragStartResourceId = this.dragStartSlotResourceId();\n const isSameSlotDrop = dragStartSlotId === dropSlotId && dragStartResourceId === resourceId;\n\n this.onAppointmentDropInternal.emit({\n dropEvent: e,\n slot: { ...slotData, resourceId: actualResourceId },\n sender: this.scheduler,\n appointment: appointmentRef,\n isSameSlotDrop,\n });\n }\n\n protected handleActionClick(event: MouseEvent, appointmentItem: AXSchedulerAppointment) {\n event.stopPropagation();\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n this.onActionClickInternal.emit({\n appointment: originalAppointment,\n nativeEvent: event,\n sender: this.scheduler,\n });\n }\n\n protected shouldShowCurrentTimeForDay(dayDate: AXDateTime): boolean {\n const now = this.calendarService.create(new Date(), this.calendar());\n const yearStart = this.date().startOf('year');\n const yearEnd = this.date().endOf('year');\n\n // Check if current time is within the displayed year range\n if (now.isBefore(yearStart) || now.isAfter(yearEnd)) {\n return false;\n }\n\n // Check if current time is on the same day as this day column\n return now.isSame(dayDate, 'day');\n }\n\n protected getSlotId(e: PointerEvent) {\n const dropListElement = this.document\n .elementsFromPoint(e.clientX, e.clientY)\n .find((el): el is HTMLElement => el instanceof HTMLElement && el.dataset['slotId'] !== undefined);\n this.dragStartSlotId.set(dropListElement ? dropListElement.dataset['slotId'] : null);\n this.dragStartSlotResourceId.set(dropListElement ? dropListElement.dataset['resourceId'] : null);\n }\n}\n","@if (resources().length === 0 || !showResourceHeaders()) {\n <!-- Original layout when no resources -->\n <div class=\"ax-scheduler-timeline-year-container\">\n @for (dayData of processedDayData(); track dayData.date.date.getTime()) {\n <div>\n <div class=\"ax-scheduler-timeline-header\">\n <div\n [class.ax-state-today]=\"isToday(dayData.date)\"\n class=\"ax-scheduler-year-header-date-day {{\n dayData.holiday.state !== 'none' ? (dayData.holiday.holiday?.cssClass ?? 'ax-state-holiday') : ''\n }}\"\n >\n <span\n class=\"ax-scheduler-year-header-date-day-char ax-scheduler-truncate\"\n [axTooltip]=\"dayData.holiday.holiday?.title ?? ''\"\n >\n {{ dayData.date | format: 'date' : { format: 'MMMM', calendar: calendar() } | async }}\n @if (dayData.holiday.state === 'holiday' && dayData.holiday.holiday.title) {\n ( {{ dayData.holiday.holiday.title }} )\n }\n </span>\n <span class=\"ax-scheduler-year-header-date-day-num\">\n {{ dayData.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n </span>\n </div>\n </div>\n\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleDrop($event, dayData.date)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n class=\"ax-scheduler-timeline-content\"\n (click)=\"handleSlotEvent($event, dayData.date)\"\n (dblclick)=\"handleSlotEvent($event, dayData.date)\"\n (contextmenu)=\"handleSlotEvent($event, dayData.date)\"\n [attr.data-slot-id]=\"dayData.date.format('YYYYMMDD')\"\n [style.pointer-events]=\"draggable() ? 'auto' : 'none'\"\n >\n <!-- Current Time Line Indicator -->\n @if (\n showCurrentTimeIndicator() && shouldShowCurrentTimeForDay(dayData.date) && getCurrentTimePosition() !== null\n ) {\n <div\n class=\"ax-scheduler-current-time-line\"\n [style.inset-inline-start.%]=\"getCurrentTimePosition()\"\n #currentTimeLine\n ></div>\n }\n <div class=\"ax-scheduler-timeline-appointment-container\">\n @for (segment of dayData.visibleAppointments; track segment.id + segment.originalStartDate.getTime()) {\n <div\n axDrag\n [dragData]=\"segment\"\n [dragCursor]=\"'grab'\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"optimizedDragStartDelay()\"\n [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n (pointerdown)=\"getSlotId($event)\"\n (click)=\"handleAppointmentEvent($event, segment)\"\n (dblclick)=\"handleAppointmentEvent($event, segment)\"\n (contextmenu)=\"handleAppointmentEvent($event, segment)\"\n [title]=\"\n tooltipTemplate()\n ? ''\n : segment.allDay\n ? segment.title\n : segment.title +\n ' (' +\n (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n ' - ' +\n (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n ')'\n \"\n class=\"ax-scheduler-timeline-appointment\"\n [class.all-day-segment]=\"segment.allDay\"\n [ngClass]=\"segment.cssClass ?? `ax-scheduler-${segment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltip]=\"tooltipTemplate()\"\n [axTooltipContext]=\"segment\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, segment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n <span class=\"ax-scheduler-timeline-appointment-time\">\n @if (segment.allDay) {\n {{ segment.originalStartDate | format: 'date' : { format: 'MMM d', calendar: calendar() } | async }}\n @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n -\n {{ segment.originalEndDate | format: 'date' : { format: 'MMM d', calendar: calendar() } | async }}\n }\n } @else {\n {{ segment.originalStartDate | format: 'time' : { calendar: calendar() } | async }}\n @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n -\n {{ segment.originalEndDate | format: 'time' : { calendar: calendar() } | async }}\n }\n }\n </span>\n </div>\n }\n\n <!-- Overflow Badge and Popover -->\n @if (dayData.moreCount > 0) {\n <div #moreAppointments class=\"ax-scheduler-year-overflow-badge\" (click)=\"$event.stopPropagation()\">\n +{{\n '@acorex:common.general.more-items' | translate: { params: { number: dayData.moreCount } } | async\n }}\n </div>\n <ax-popover [target]=\"moreAppointments\" placement=\"bottom-start\" trigger=\"click\">\n <div\n axDropZone\n [class.ax-state-readonly]=\"readonly()\"\n class=\"ax-overlay-pane ax-scheduler-popover ax-scheduler-timeline-year-popover-appointment\"\n >\n @for (segment of dayData.hiddenAppointments; track segment.id + segment.originalStartDate.getTime()) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"segment\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"optimizedDragStartDelay()\"\n [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n (click)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n (dblclick)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n (contextmenu)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n [title]=\"\n tooltipTemplate()\n ? ''\n : segment.allDay\n ? segment.title +\n ' (' +\n (segment.originalStartDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async) +\n ' - ' +\n (segment.originalEndDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async) +\n ')'\n : segment.title +\n ' (' +\n (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n ' - ' +\n (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n ')'\n \"\n class=\"ax-scheduler-popover-appointment\"\n [class.all-day-segment]=\"segment.allDay\"\n [ngClass]=\"segment.cssClass ?? `ax-scheduler-${segment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltip]=\"tooltipTemplate()\"\n [axTooltipContext]=\"segment\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, segment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n <span class=\"ax-scheduler-timeline-appointment-time\">\n @if (segment.allDay) {\n {{\n segment.originalStartDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async\n }}\n @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n -\n {{\n segment.originalEndDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async\n }}\n }\n } @else {\n {{ segment.originalStartDate | format: 'time' : { calendar: calendar() } | async }}\n @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n -\n {{ segment.originalEndDate | format: 'time' : { calendar: calendar() } | async }}\n }\n }\n </span>\n </div>\n }\n </div>\n </ax-popover>\n }\n </div>\n </div>\n </div>\n }\n </div>\n} @else {\n <!-- Resource-based layout -->\n <div class=\"ax-scheduler-timeline-year-resource-container\">\n <div class=\"ax-scheduler-timeline-year-header-sticky\">\n <div class=\"ax-scheduler-timeline-year-resource-header-placeholder\">\n <span>Resources</span>\n </div>\n\n <div class=\"ax-scheduler-timeline-year-day-header\">\n @for (dayData of processedDayData(); track dayData.date.date.getTime()) {\n <div\n [class.ax-state-today]=\"isToday(dayData.date)\"\n class=\"ax-scheduler-year-header-date-day {{\n dayData.holiday.state !== 'none' ? (dayData.holiday.holiday?.cssClass ?? 'ax-state-holiday') : ''\n }}\"\n >\n <span\n class=\"ax-scheduler-year-header-date-day-char ax-scheduler-truncate\"\n [axTooltip]=\"dayData.holiday.holiday?.title ?? ''\"\n >\n {{ dayData.date | format: 'date' : { format: 'MMMM', calendar: calendar() } | async }}\n @if (dayData.holiday.state === 'holiday' && dayData.holiday.holiday.title) {\n ( {{ dayData.holiday.holiday.title }} )\n }\n </span>\n <span class=\"ax-scheduler-year-header-date-day-num\">\n {{ dayData.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n </span>\n </div>\n }\n </div>\n </div>\n\n <div class=\"ax-scheduler-timeline-year-resource-rows\">\n <!-- Current Time Line Indicator -->\n @if (showCurrentTimeIndicator() && getCurrentTimePosition() !== null) {\n <div\n class=\"ax-scheduler-current-time-line\"\n [style.inset-inline-start.%]=\"getCurrentTimePosition()\"\n #currentTimeLine\n ></div>\n }\n\n @for (resourceId of resourceIds(); track resourceId) {\n <div class=\"ax-scheduler-timeline-year-resource-row\">\n <div class=\"ax-scheduler-timeline-year-resource-header ax-scheduler-timeline-year-resource-header-sticky\">\n @if (resourceTemplate() && typeof resourceTemplate() !== 'string') {\n <ng-container\n [ngTemplateOutlet]=\"$any(resourceTemplate())\"\n [ngTemplateOutletContext]=\"{\n $implicit: getResourceContext(resourceId),\n resource: getResourceContext(resourceId),\n resourceId: resourceId,\n }\"\n ></ng-container>\n } @else {\n <div class=\"ax-scheduler-timeline-year-resource-title\">\n {{ getResourceTitle(resourceId) | translate | async }}\n </div>\n }\n </div>\n\n <div class=\"ax-scheduler-timeline-year-resource-content\">\n @for (dayData of processedDayData(); track dayData.date.date.getTime()) {\n <div\n axDropZone\n #zone=\"axDropZone\"\n (onElementDrop)=\"handleDrop($event, dayData.date, resourceId)\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n class=\"ax-scheduler-timeline-year-slot-row\"\n (click)=\"handleSlotEvent($event, dayData.date)\"\n (dblclick)=\"handleSlotEvent($event, dayData.date)\"\n (contextmenu)=\"handleSlotEvent($event, dayData.date)\"\n [attr.data-slot-id]=\"dayData.date.format('YYYYMMDD')\"\n [attr.data-resource-id]=\"resourceId\"\n [style.pointer-events]=\"draggable() ? 'auto' : 'none'\"\n >\n <div class=\"ax-scheduler-timeline-appointment-container\">\n @for (\n segment of getAppointmentsForResourceAndDay(resourceId, dayData).visible;\n track segment.id + segment.originalStartDate.getTime()\n ) {\n <div\n axDrag\n [dragData]=\"segment\"\n [dragCursor]=\"'grab'\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"optimizedDragStartDelay()\"\n [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n (pointerdown)=\"getSlotId($event)\"\n (click)=\"handleAppointmentEvent($event, segment)\"\n (dblclick)=\"handleAppointmentEvent($event, segment)\"\n (contextmenu)=\"handleAppointmentEvent($event, segment)\"\n [title]=\"\n tooltipTemplate()\n ? ''\n : segment.allDay\n ? segment.title +\n ' (' +\n (segment.originalStartDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async) +\n ' - ' +\n (segment.originalEndDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async) +\n ')'\n : segment.title +\n ' (' +\n (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n ' - ' +\n (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n ')'\n \"\n class=\"ax-scheduler-timeline-appointment\"\n [class.all-day-segment]=\"segment.allDay\"\n [ngClass]=\"segment.cssClass ?? `ax-scheduler-${segment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltip]=\"tooltipTemplate()\"\n [axTooltipContext]=\"segment\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, segment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n <span class=\"ax-scheduler-timeline-appointment-time\">\n @if (segment.allDay) {\n {{\n segment.originalStartDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async\n }}\n @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n -\n {{\n segment.originalEndDate\n | format: 'date' : { format: 'MMM d', calendar: calendar() }\n | async\n }}\n }\n } @else {\n {{ segment.originalStartDate | format: 'time' : { calendar: calendar() } | async }}\n @if (segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()) {\n -\n {{ segment.originalEndDate | format: 'time' : { calendar: calendar() } | async }}\n }\n }\n </span>\n </div>\n }\n\n <!-- Overflow Badge and Popover -->\n @if (getAppointmentsForResourceAndDay(resourceId, dayData).moreCount > 0) {\n <div #moreAppointments class=\"ax-scheduler-year-overflow-badge\" (click)=\"$event.stopPropagation()\">\n +{{\n '@acorex:common.general.more-items'\n | translate\n : { params: { number: getAppointmentsForResourceAndDay(resourceId, dayData).moreCount } }\n | async\n }}\n </div>\n <ax-popover [target]=\"moreAppointments\" placement=\"bottom-start\" trigger=\"click\">\n <div\n axDropZone\n [class.ax-state-readonly]=\"readonly()\"\n class=\"ax-overlay-pane ax-scheduler-popover ax-scheduler-timeline-year-popover-appointment\"\n >\n @for (\n segment of getAppointmentsForResourceAndDay(resourceId, dayData).hidden;\n track segment.id + segment.originalStartDate.getTime()\n ) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"segment\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"optimizedDragStartDelay()\"\n [dragDisabled]=\"!draggable() || segment.readonly || readonly()\"\n (click)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n (dblclick)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n (contextmenu)=\"handleAppointmentEvent($event, segment); $event.stopPropagation()\"\n [title]=\"\n tooltipTemplate()\n ? ''\n : segment.allDay\n ? segment.title\n : segment.title +\n ' (' +\n (segment.originalStartDate | format: 'time' : { calendar: calendar() } | async) +\n ' - ' +\n (segment.originalEndDate | format: 'time' : { calendar: calendar() } | async) +\n ')'\n \"\n class=\"ax-scheduler-popover-appointment\"\n [class.all-day-segment]=\"segment.allDay\"\n [ngClass]=\"segment.cssClass ?? `ax-scheduler-${segment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltip]=\"tooltipTemplate()\"\n [axTooltipContext]=\"segment\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ segment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, segment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n >\n </ax-icon>\n }\n </ax-title>\n @if (!segment.allDay) {\n <span class=\"ax-scheduler-timeline-appointment-time\">\n {{ segment.originalStartDate | format: 'time' : { calendar: calendar() } | async }}\n @if (\n !segment.allDay &&\n segment.originalStartDate.getTime() !== segment.originalEndDate.getTime()\n ) {\n -\n {{ segment.originalEndDate | format: 'time' : { calendar: calendar() } | async }}\n }\n </span>\n }\n </div>\n }\n </div>\n </ax-popover>\n }\n </div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n}\n","import { AXComponent, NXComponent } from '@acorex/cdk/common';\nimport { AXDragDirective, AXDropZoneDirective, AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { AXDecoratorGenericComponent, AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { AXCalendarService, AXDateTime, AXHolidayDate } from '@acorex/core/date-time';\nimport { AXFormatPipe } from '@acorex/core/format';\nimport { AXTranslatorPipe } from '@acorex/core/translation';\nimport { AsyncPipe, NgClass } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n DOCUMENT,\n ElementRef,\n HostBinding,\n inject,\n input,\n output,\n signal,\n TemplateRef,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { orderBy } from 'lodash-es';\nimport {\n AXSchedulerAllDaySlotData,\n AXSchedulerAppointment,\n AXSchedulerAppointmentLayout,\n AXSchedulerAppointmentSegment,\n AXSchedulerDayAppointmentLayout,\n AXSchedulerOverflowBadge,\n} from '../../scheduler.class';\nimport {\n AXSchedulerAppointmentMouseEvent,\n AXSchedulerComponent,\n AXSchedulerSlotDropEvent,\n AXSchedulerSlotMouseEvent,\n} from '../../scheduler.component';\nimport { AXSchedulerService } from '../../scheduler.service';\n\ntype AXSchedulerGridBadgeInfo = AXSchedulerOverflowBadge & {\n hiddenAppointments: AXSchedulerAppointmentSegment[];\n};\n\n@Component({\n selector: 'ax-scheduler-week-view',\n templateUrl: './scheduler-week-view.component.html',\n styleUrl: './scheduler-week-view.component.compiled.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n NgClass,\n AsyncPipe,\n AXFormatPipe,\n AXDragDirective,\n AXTranslatorPipe,\n AXPopoverComponent,\n AXTooltipDirective,\n AXDropZoneDirective,\n AXDecoratorIconComponent,\n AXDecoratorGenericComponent,\n ],\n providers: [{ provide: AXComponent, useExisting: AXSchedulerWeekViewComponent }],\n})\nexport class AXSchedulerWeekViewComponent extends NXComponent implements AfterViewInit {\n // --- Injected Services & Private State ---\n private readonly document = inject(DOCUMENT);\n private readonly scheduler = inject(AXSchedulerComponent);\n private readonly calendarService = inject(AXCalendarService);\n private readonly schedulerService = inject(AXSchedulerService);\n private readonly dragStartSlotId = signal<string | null>(null);\n\n // --- Constants ---\n private readonly GAP_PX = 1;\n private readonly BADGE_SPACE_REM = 2;\n\n // --- Component Inputs ---\n public readonly = input(false);\n public draggable = input(true);\n public hasActions = input(false);\n public dragStartDelay = input(0);\n public calendar = input<string>();\n public date = input.required<AXDateTime>();\n public endDayHour = input.required<number>();\n public startDayHour = input.required<number>();\n public showCurrentTimeIndicator = input<boolean>(true);\n public appointments = input<AXSchedulerAppointment[]>([]);\n public tooltipTemplate = input<string | TemplateRef<unknown>>();\n\n // ViewChild for current time line element\n currentTimeLineElement = viewChild<ElementRef<HTMLElement>>('currentTimeLine');\n\n // --- Component Outputs (Internal, to be caught by the main scheduler) ---\n protected readonly slotClickedInternal = output<AXSchedulerSlotMouseEvent>();\n protected readonly slotDblClickedInternal = output<AXSchedulerSlotMouseEvent>();\n protected readonly slotRightClickedInternal = output<AXSchedulerSlotMouseEvent>();\n protected readonly appointmentClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n protected readonly appointmentDblClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n protected readonly appointmentRightClickedInternal = output<AXSchedulerAppointmentMouseEvent>();\n protected readonly onActionClickInternal = output<AXSchedulerAppointmentMouseEvent>();\n protected readonly onAppointmentDropInternal = output<AXSchedulerSlotDropEvent>();\n\n // =================================================================================================\n //\n // VIEW MODEL COMPUTATIONS (for rendering the template)\n //\n // =================================================================================================\n\n /**\n * @protected\n * Generates an array of AXDateTime objects for the hours displayed in the view's time ruler.\n * This is used for rendering the `HH:mm` labels on the side.\n */\n protected hoursArray = computed(() => {\n let time = this.date();\n if (!time) return [];\n time = time.set('hour', this.startDayHour()).startOf('hour');\n const hours = [time];\n while (time.hour < this.endDayHour() - 1) {\n time = time.add('hour', 1);\n hours.push(time);\n }\n return hours;\n });\n\n /**\n * @protected\n * Generates an array of day data objects for the 7 days in the view, including holiday info.\n * This is used for rendering the day headers (e.g., \"Monday 10\").\n */\n protected daysArray = computed(\n (): { date: AXDateTime; holiday?: { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate } }[] => {\n const time = this.date();\n if (!time) return [];\n const days = [{ date: time, holiday: this.isHoliday(time) }];\n for (let index = 1; index <= 6; index++) {\n const date = time.add('day', index);\n days.push({ date, holiday: this.isHoliday(date) });\n }\n return days;\n },\n );\n\n /**\n * @protected\n * Calculates the total number of 30-minute blocks within the visible hours of a single day.\n */\n protected totalBlocksPerViewDay = computed(() => {\n const startH = this.startDayHour();\n const endH = this.endDayHour();\n return Math.max(0, (endH - startH) * (60 / 30));\n });\n\n /**\n * @protected\n * Filters processed segments to get only those for the all-day header.\n */\n protected allDayAppointmentsPerDay = computed((): AXSchedulerAllDaySlotData[] => {\n const daysInWeek = this.daysArray().map((e) => e.date);\n const allDaySegments = this.processedAppointmentsForLayout().filter((s) => s.allDay);\n\n return daysInWeek.map((dayDate) => {\n const currentDayStart = dayDate.startOf('day');\n const appointmentsForThisDay = allDaySegments.filter((segment) =>\n this.calendarService.create(segment.startDate, this.calendar()).startOf('day').equal(currentDayStart, 'day'),\n );\n return {\n day: dayDate,\n appointments: orderBy(appointmentsForThisDay, ['originalStartDate', 'title'], ['asc', 'asc']),\n };\n });\n });\n\n // =================================================================================================\n //\n // GRID LAYOUT & BADGE LOGIC (THE CORE FIX)\n // This logic follows a three-step process:\n // 1. `dayViewLayoutsByDay`: Calculate a full multi-column layout for each day. This is our \"source of truth\".\n // 2. `visibleAppointmentsLayout`: Render ONLY the first column (`columnIndex: 0`) from the source of truth.\n // 3. `overflowBadgesWithData`: Render badges for all other columns (`columnIndex > 0`).\n //\n // =================================================================================================\n\n /**\n * [STEP 1 - Private] Calculate a full multi-column layout for each day, as if it were a Day View.\n * This becomes the single source of truth for what overlaps with what.\n */\n private dayViewLayoutsByDay = computed(() => {\n const layoutsByDay = new Map<number, Map<any, AXSchedulerDayAppointmentLayout>>();\n const allSegments = this.timedGridSegments();\n const viewStartDate = this.date();\n const startH = this.startDayHour();\n const endH = this.endDayHour();\n\n for (let dayIndex = 0; dayIndex < 7; dayIndex++) {\n const dayDate = viewStartDate.add('day', dayIndex);\n const segmentsForThisDay = allSegments.filter((seg) =>\n this.calendarService.create(seg.startDate, this.calendar()).startOf('day').equal(dayDate.startOf('day'), 'day'),\n );\n if (segmentsForThisDay.length === 0) continue;\n\n const concurrencyInfoMap = this.schedulerService.calculateDayViewConcurrencyInfo(\n segmentsForThisDay,\n dayDate,\n startH,\n endH,\n );\n const sortedAppointments = orderBy(\n segmentsForThisDay,\n [(e) => e.startDate.getTime(), (e) => e.originalEndDate.getTime() - e.originalStartDate.getTime()],\n ['asc', 'desc'],\n );\n\n const dayLayouts = new Map<any, AXSchedulerDayAppointmentLayout>();\n const columnsData: { appointments: AXSchedulerAppointmentSegment[] }[] = [];\n\n for (const appointmentSegment of sortedAppointments) {\n let assignedCol = -1;\n for (let c = 0; ; c++) {\n if (!columnsData[c]) columnsData[c] = { appointments: [] };\n let conflict = false;\n for (const placedSegment of columnsData[c].appointments) {\n if (this.schedulerService.doAppointmentsOverlap(appointmentSegment, placedSegment)) {\n conflict = true;\n break;\n }\n }\n if (!conflict) {\n assignedCol = c;\n columnsData[c].appointments.push(appointmentSegment);\n break;\n }\n }\n const concurrencyInfo = concurrencyInfoMap.get(appointmentSegment.id);\n const effectiveCols = concurrencyInfo ? concurrencyInfo.effectiveTotalColumns : 1;\n dayLayouts.set(appointmentSegment.id, { columnIndex: assignedCol, effectiveTotalColumns: effectiveCols });\n }\n layoutsByDay.set(dayIndex, dayLayouts);\n }\n return layoutsByDay;\n });\n\n /**\n * @protected\n * [STEP 2] From the full layout, select ONLY appointments in the first column (`columnIndex: 0`)\n * to be visible. Calculate their width based on whether they have siblings in other columns.\n */\n protected visibleAppointmentsLayout = computed((): AXSchedulerAppointmentLayout[] => {\n const finalLayouts: AXSchedulerAppointmentLayout[] = [];\n const layoutsByDay = this.dayViewLayoutsByDay();\n const allSegments = this.timedGridSegments();\n const blockHeightExpr = `var(--ax-comp-scheduler-basic-view-blocks-height, 30px)`;\n const N = 7;\n\n for (const appt of allSegments) {\n const apptStartDate = this.calendarService.create(appt.startDate, this.calendar());\n const dayIndex = Math.floor(\n (apptStartDate.startOf('day').date.getTime() - this.date().startOf('day').date.getTime()) /\n this.schedulerService.MILLISECONDS_PER_DAY,\n );\n if (dayIndex < 0 || dayIndex >= N) continue;\n\n const layoutInfo = layoutsByDay.get(dayIndex)?.get(appt.id);\n if (!layoutInfo || layoutInfo.columnIndex !== 0) continue;\n\n const startMinutes = apptStartDate.hour * 60 + apptStartDate.minute;\n const startBlockOffset = startMinutes - this.startDayHour() * 60;\n const layoutTop = `calc(${blockHeightExpr} * ${startBlockOffset / 30} + 1px)`;\n\n const durationMinutes = this.schedulerService.calculateDurationInMinutes(appt);\n const layoutHeight = `calc(${blockHeightExpr} * ${durationMinutes / 30} - ${this.GAP_PX}px)`;\n\n const hasHiddenSiblings = layoutInfo.effectiveTotalColumns > 1;\n const layoutWidth = hasHiddenSiblings\n ? `calc(100% / ${N} - ${this.BADGE_SPACE_REM + 0.5}rem)`\n : `calc(100% / ${N})`;\n\n finalLayouts.push({\n appointment: appt,\n layoutTop,\n layoutHeight,\n layoutLeft: `calc(${dayIndex * (100 / N)}%)`,\n layoutWidth,\n });\n }\n return finalLayouts;\n });\n\n /**\n * @protected\n * [STEP 3] Create badges for all appointments NOT in the first column (`columnIndex > 0`).\n */\n protected overflowBadgesWithData = computed((): AXSchedulerGridBadgeInfo[] => {\n const badgesInfo: AXSchedulerGridBadgeInfo[] = [];\n const layoutsByDay = this.dayViewLayoutsByDay();\n const allTimedSegments = this.timedGridSegments();\n const blockHeightExpr = `var(--ax-comp-scheduler-basic-view-blocks-height, 30px)`;\n const N = 7;\n\n const hiddenAppointments = allTimedSegments.filter((appt) => {\n const apptStartDate = this.calendarService.create(appt.startDate, this.calendar());\n const dayIndex = Math.floor(\n (apptStartDate.startOf('day').date.getTime() - this.date().startOf('day').date.getTime()) /\n this.schedulerService.MILLISECONDS_PER_DAY,\n );\n const layoutInfo = layoutsByDay.get(dayIndex)?.get(appt.id);\n return layoutInfo && layoutInfo.columnIndex > 0;\n });\n\n const groupedHidden = new Map<string, AXSchedulerAppointmentSegment[]>();\n for (const appt of hiddenAppointments) {\n const apptStartDate = this.calendarService.create(appt.startDate, this.calendar());\n const startInfo = this.schedulerService.getBlockIdentifier(\n apptStartDate,\n this.date(),\n this.startDayHour(),\n this.endDayHour(),\n 7,\n );\n if (!startInfo) continue;\n\n const key = `${startInfo.dayIndex}-${startInfo.blockIndex}`;\n if (!groupedHidden.has(key)) groupedHidden.set(key, []);\n groupedHidden.get(key).push(appt);\n }\n\n groupedHidden.forEach((group, key) => {\n const [dayIndexStr, blockIndexStr] = key.split('-');\n const dayIndex = parseInt(dayIndexStr);\n const blockIndex = parseInt(blockIndexStr);\n\n const badgeTop = `calc(${blockHeightExpr} * ${blockIndex} + 0.75rem)`;\n const badgeLeft = `calc(${dayIndex * (100 / N)}% + (100% / ${N}) - ${this.BADGE_SPACE_REM}rem)`;\n\n badgesInfo.push({\n key: `badge-${key}`,\n count: group.length,\n badgeTop,\n badgeLeft,\n hiddenAppointments: group,\n });\n });\n\n return badgesInfo;\n });\n\n // =================================================================================================\n //\n // EVENT HANDLERS & UTILITY METHODS\n //\n // =================================================================================================\n\n private readonly eventOutputMap = {\n slot: {\n click: this.slotClickedInternal,\n dblclick: this.slotDblClickedInternal,\n contextmenu: this.slotRightClickedInternal,\n },\n appointment: {\n click: this.appointmentClickedInternal,\n dblclick: this.appointmentDblClickedInternal,\n contextmenu: this.appointmentRightClickedInternal,\n },\n };\n\n /**\n * Handles click, dblclick, and contextmenu events on an appointment and emits them to the parent.\n * @param mouseEvent The native DOM event.\n * @param appointmentSegment The appointment data segment that was interacted with.\n * @protected\n */\n protected handleAppointmentEvent(mouseEvent: MouseEvent, appointmentSegment: AXSchedulerAppointment): void {\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentSegment);\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, appointment: originalAppointment, sender: this.scheduler },\n this.eventOutputMap,\n 'appointment',\n );\n }\n\n /**\n * Handles click, dblclick, and contextmenu events on an empty time slot and emits them to the parent.\n * @param mouseEvent The native DOM event.\n * @param hour The starting hour of the slot.\n * @param day The day of the slot.\n * @param minuteIndex The half-hour index (0 or 1).\n * @protected\n */\n protected handleSingleSlotEvent(\n mouseEvent: MouseEvent,\n hour: AXDateTime,\n day: AXDateTime,\n minuteIndex: number,\n ): void {\n const startDate = day.set('hour', hour.hour).set('minute', minuteIndex * 30);\n const slotData = this.schedulerService.getSlotData(startDate, 'week');\n if (slotData)\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n this.eventOutputMap,\n 'slot',\n );\n }\n\n /**\n * Handles interaction events on the all-day slot.\n * @param mouseEvent The native DOM event.\n * @param day The corresponding day for the all-day slot.\n * @protected\n */\n protected handleAllDaySlotEvent(mouseEvent: MouseEvent, day: AXDateTime): void {\n const slotData = { startDate: day.startOf('day'), endDate: day.endOf('day'), view: 'week' as const };\n this.schedulerService.handleEvent(\n { nativeEvent: mouseEvent, slot: slotData, sender: this.scheduler },\n this.eventOutputMap,\n 'slot',\n );\n }\n\n /**\n * Handles dropping an appointment onto the all-day slot.\n * @param e The drop event from the CDK.\n * @param day The corresponding day for the all-day slot.\n * @protected\n */\n protected handleAllDayDrop(e: AXDropZoneDropEvent, day: AXDateTime): void {\n const slotData = { startDate: day.startOf('day'), endDate: day.endOf('day'), view: 'week' as const };\n const originalAppointment = this.schedulerService.getOriginalAppointment(\n e.dropped.dragData() as AXSchedulerAppointment,\n );\n this.onAppointmentDropInternal.emit({\n dropEvent: e,\n slot: slotData,\n sender: this.scheduler,\n appointment: originalAppointment,\n isSameSlotDrop: this.dragStartSlotId() === e.sender.element().dataset['slotId'],\n });\n }\n\n /**\n * Handles dropping an appointment onto a timed grid slot.\n * @param e The drop event from the CDK.\n * @param hour The starting hour of the drop target.\n * @param day The day of the drop target.\n * @param minuteIndex The half-hour index (0 or 1) of the drop target.\n * @protected\n */\n protected handleSingleDayDrop(e: AXDropZoneDropEvent, hour: AXDateTime, day: AXDateTime, minuteIndex: number): void {\n const startDate = day.set('hour', hour.hour).set('minute', minuteIndex * 30);\n const slotData = this.schedulerService.getSlotData(startDate, 'week');\n const originalAppointment = this.schedulerService.getOriginalAppointment(\n e.dropped.dragData() as AXSchedulerAppointment,\n );\n this.onAppointmentDropInternal.emit({\n dropEvent: e,\n slot: slotData,\n sender: this.scheduler,\n appointment: originalAppointment,\n isSameSlotDrop: this.dragStartSlotId() === e.sender.element().dataset['slotId'],\n });\n }\n\n /**\n * Handles clicks on the \"more\" action icon on an appointment.\n * @param event The native mouse event.\n * @param appointmentItem The appointment associated with the action.\n * @protected\n */\n protected handleActionClick(event: MouseEvent, appointmentItem: AXSchedulerAppointment): void {\n event.stopPropagation();\n const originalAppointment = this.schedulerService.getOriginalAppointment(appointmentItem);\n this.onActionClickInternal.emit({\n appointment: originalAppointment,\n nativeEvent: event,\n sender: this.scheduler,\n });\n }\n\n /**\n * @protected\n * Checks if a given date is the current day.\n * @param date The date to check.\n * @returns `true` if the date is today.\n */\n protected isToday(date: AXDateTime): boolean {\n return date.equal(this.calendarService.create(new Date()), 'day');\n }\n\n /**\n * @protected\n * Checks if a given date is a holiday or weekend.\n * @param date The date to check.\n * @returns An object describing the day's status (holiday, weekend, or none).\n */\n protected isHoliday(date: AXDateTime): { state: 'holiday' | 'weekend' | 'none'; holiday?: AXHolidayDate } {\n const globalHoliday = this.calendarService.holidays.find((d) => date.equal(d.date, 'day'));\n const internalHoliday = this.schedulerService.internalHoliday().find((d) => date.equal(d.date, 'day'));\n const holiday = globalHoliday || internalHoliday;\n if (holiday) return { state: 'holiday', holiday };\n if (this.schedulerService.isWeekend(date, this.calendar())) return { state: 'weekend' };\n return { state: 'none' };\n }\n\n /**\n * @protected\n * Captures the data-slot-id attribute when a drag operation starts on an appointment.\n * @param e The pointer event that initiates the drag.\n */\n protected getSlotId(e: PointerEvent): void {\n const dropListElement = this.document\n .elementsFromPoint(e.clientX, e.clientY)\n .find((el): el is HTMLElement => (el as HTMLElement).dataset['slotId'] !== undefined);\n this.dragStartSlotId.set(dropListElement ? dropListElement.dataset['slotId'] : null);\n }\n\n protected getCurrentTimePosition(): number | null {\n const now = this.calendarService.create(new Date(), this.calendar());\n const weekStart = this.date().startOf('day');\n const weekEnd = this.date().add('day', 7).startOf('day');\n const startHour = this.startDayHour();\n const endHour = this.endDayHour();\n\n // Check if current time is within the displayed week\n if (now.isBefore(weekStart) || now.isAfter(weekEnd)) {\n return null;\n }\n\n // Check if current time is within the visible hours\n if (now.hour < startHour || now.hour >= endHour) {\n return null;\n }\n\n // Calculate position as percentage within the visible time range\n const currentMinutes = now.hour * 60 + now.minute;\n const startMinutes = startHour * 60;\n const endMinutes = endHour * 60;\n const totalMinutes = endMinutes - startMinutes;\n\n const positionInMinutes = currentMinutes - startMinutes;\n return (positionInMinutes / totalMinutes) * 100;\n }\n\n protected getCurrentTimePositionWithOffset(): string | null {\n const position = this.getCurrentTimePosition();\n if (position === null) {\n return null;\n }\n\n // For week view, calculate the vertical position (top) for the horizontal line\n // based on the current time within the visible hours\n const currentMinutes =\n this.calendarService.create(new Date(), this.calendar()).hour * 60 +\n this.calendarService.create(new Date(), this.calendar()).minute;\n const startMinutes = this.startDayHour() * 60;\n const positionInMinutes = currentMinutes - startMinutes;\n const blockHeight = 30; // 30 minutes per block\n const blocksFromStart = positionInMinutes / blockHeight;\n\n return `calc(var(--ax-comp-scheduler-basic-view-blocks-height) * ${blocksFromStart} + 1px)`;\n }\n\n protected getCurrentDayColumnPosition(): string | null {\n const now = this.calendarService.create(new Date(), this.calendar());\n const weekStart = this.date().startOf('day');\n const weekEnd = this.date().add('day', 7).startOf('day');\n\n // Check if current time is within the displayed week\n if (now.isBefore(weekStart) || now.isAfter(weekEnd)) {\n return null;\n }\n\n // Calculate which day of the week the current day falls into\n const daysDiff = Math.floor((now.date.getTime() - weekStart.date.getTime()) / (24 * 60 * 60 * 1000));\n if (daysDiff < 0 || daysDiff >= 7) {\n return null;\n }\n\n // Calculate the left position for the current day column\n // The time column width is already accounted for in the container positioning\n const dayWidth = 100 / 7; // 7 days in a week\n const leftPosition = daysDiff * dayWidth;\n\n return `${leftPosition}%`;\n }\n\n protected getCurrentDayColumnWidth(): string {\n const dayWidth = 100 / 7; // 7 days in a week\n return `${dayWidth}%`;\n }\n\n ngAfterViewInit() {\n // Auto-scroll to current time when available using ResizeObserver\n this.setupCurrentTimeScroll();\n }\n\n private setupCurrentTimeScroll(): (() => void) | undefined {\n if (!this.showCurrentTimeIndicator()) {\n return undefined;\n }\n\n const currentPosition = this.getCurrentTimePosition();\n if (currentPosition === null) {\n return undefined;\n }\n\n const timeLineElement = this.currentTimeLineElement()?.nativeElement;\n if (!timeLineElement) {\n return undefined;\n }\n\n // Use ResizeObserver to detect when the element is properly rendered\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n if (entry.contentRect.width > 0 && entry.contentRect.height > 0) {\n // Element has proper dimensions, scroll to it\n timeLineElement.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n inline: 'nearest',\n });\n // Disconnect observer after successful scroll\n resizeObserver.disconnect();\n break;\n }\n }\n });\n\n resizeObserver.observe(timeLineElement);\n\n // Cleanup on component destroy\n return () => resizeObserver.disconnect();\n }\n\n protected shouldShowCurrentTimeForToday(): boolean {\n if (!this.showCurrentTimeIndicator()) {\n return false;\n }\n\n const now = this.calendarService.create(new Date(), this.calendar());\n const weekStart = this.date().startOf('day');\n const weekEnd = this.date().add('day', 7).startOf('day');\n\n // Check if current time is within the displayed week\n if (now.isBefore(weekStart) || now.isAfter(weekEnd)) {\n return false;\n }\n\n // Check if current time is within the visible hours\n if (now.hour < this.startDayHour() || now.hour >= this.endDayHour()) {\n return false;\n }\n\n return true;\n }\n\n @HostBinding('class.ax-state-readonly')\n protected get isReadonly(): boolean {\n return this.readonly();\n }\n\n // --- Private Data Processing ---\n private processedAppointmentsForLayout = computed<AXSchedulerAppointmentSegment[]>(() => {\n const viewDays = this.daysArray().map((e) => e.date);\n const allOriginalAppointments = this.appointments();\n if (viewDays.length === 0 || allOriginalAppointments.length === 0) return [];\n\n const startH = this.startDayHour();\n const endH = this.endDayHour();\n const allSegmentsInView: AXSchedulerAppointmentSegment[] = [];\n\n for (const day of viewDays) {\n for (const appt of allOriginalAppointments) {\n const segment = this.schedulerService.getClonedAppointmentSegmentOnDay(appt, day.startOf('day'), startH, endH);\n if (segment) allSegmentsInView.push(segment);\n }\n }\n const uniqueSegmentsMap = new Map<string, AXSchedulerAppointmentSegment>();\n allSegmentsInView.forEach((seg) => {\n const mapKey = `${seg.id}-${seg.startDate.getTime()}-${seg.endDate.getTime()}`;\n if (!uniqueSegmentsMap.has(mapKey)) uniqueSegmentsMap.set(mapKey, seg);\n });\n return Array.from(uniqueSegmentsMap.values());\n });\n\n private timedGridSegments = computed<AXSchedulerAppointmentSegment[]>(() => {\n return this.processedAppointmentsForLayout()?.filter((segment) => !segment.allDay) ?? [];\n });\n}\n","<div class=\"ax-scheduler-week-header\">\n <div class=\"ax-scheduler-week-header-days\">\n <div class=\"ax-scheduler-week-header-table\"></div>\n <div class=\"ax-scheduler-week-header-date\" aria-hidden=\"true\">\n @for (day of daysArray(); track day.date.date.getTime()) {\n <div\n [class.ax-state-today]=\"isToday(day.date)\"\n class=\"ax-scheduler-week-header-date-day {{\n day.holiday.state !== 'none' ? (day.holiday.holiday?.cssClass ?? 'ax-state-holiday') : ''\n }}\"\n >\n <span\n class=\"ax-scheduler-week-header-date-day-char ax-scheduler-truncate\"\n [axTooltip]=\"day.holiday?.holiday?.title ?? ''\"\n >\n {{ day.date | format: 'date' : { format: 'dddd', calendar: calendar() } | async }}\n @if (day.holiday.state === 'holiday' && day.holiday.holiday.title) {\n ( {{ day.holiday.holiday.title }} )\n }\n </span>\n <span class=\"ax-scheduler-week-header-date-day-num\">\n {{ day.date | format: 'date' : { format: 'DD', calendar: calendar() } | async }}\n </span>\n </div>\n }\n </div>\n </div>\n <div class=\"ax-scheduler-week-header-days\">\n <div class=\"ax-scheduler-week-header-table\">{{ '@acorex:dateTime.duration.all-day' | translate | async }}</div>\n <div aria-hidden=\"true\" class=\"ax-scheduler-week-header-date\">\n @for (slotData of allDayAppointmentsPerDay(); track slotData.day.date.getTime()) {\n <div\n axDropZone\n #zone2=\"axDropZone\"\n [class.ax-scheduler-slot-hovered]=\"zone2.isHovered()\"\n (onElementDrop)=\"handleAllDayDrop($event, slotData.day)\"\n class=\"ax-scheduler-all-day-slot\"\n (click)=\"handleAllDaySlotEvent($event, slotData.day)\"\n (dblclick)=\"handleAllDaySlotEvent($event, slotData.day)\"\n (contextmenu)=\"handleAllDaySlotEvent($event, slotData.day)\"\n >\n @if (slotData.appointments.length > 0) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragData]=\"slotData.appointments[0]\"\n [dragDisabled]=\"!draggable() || slotData.appointments[0].readonly || readonly()\"\n (pointerdown)=\"getSlotId($event)\"\n (click)=\"handleAppointmentEvent($event, slotData.appointments[0])\"\n (dblclick)=\"handleAppointmentEvent($event, slotData.appointments[0])\"\n (contextmenu)=\"handleAppointmentEvent($event, slotData.appointments[0])\"\n [title]=\"tooltipTemplate() ? '' : slotData.appointments[0].title\"\n class=\"ax-scheduler-header-week-appointment\"\n [style.width]=\"slotData.appointments.length > 1 ? 'calc(100% - 2rem)' : '100%'\"\n [ngClass]=\"\n slotData.appointments[0].cssClass ??\n `ax-scheduler-${slotData.appointments[0].priority ?? 'primary'}-periority`\n \"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltipContext]=\"slotData.appointments[0]\"\n [axTooltip]=\"tooltipTemplate()\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ slotData.appointments[0].title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, slotData.appointments[0])\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n ></ax-icon>\n }\n </ax-title>\n </div>\n }\n @if (slotData.appointments.length > 1) {\n <div\n #moreAppointments\n class=\"ax-scheduler-appointment-badge\"\n [style.width]=\"'1.5rem'\"\n [style.border]=\"'none'\"\n [ngClass]=\"\n slotData.appointments[1].cssClass ??\n `ax-scheduler-${slotData.appointments[1].priority ?? 'primary'}-periority`\n \"\n >\n +{{ slotData.appointments.length - 1 }}\n </div>\n <ax-popover [target]=\"moreAppointments\">\n <div class=\"ax-overlay-pane ax-scheduler-popover\" [class.ax-state-readonly]=\"readonly()\" axDropZone>\n @for (appointment of slotData.appointments; track appointment.id; let first = $first) {\n @if (!first) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"appointment\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || appointment.readonly || readonly()\"\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"tooltipTemplate() ? '' : appointment.title\"\n class=\"ax-scheduler-popover-appointment\"\n [ngClass]=\"appointment.cssClass ?? `ax-scheduler-${appointment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltipContext]=\"appointment\"\n [axTooltip]=\"tooltipTemplate()\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ appointment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, appointment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n ></ax-icon>\n }\n </ax-title>\n </div>\n }\n }\n </div>\n </ax-popover>\n }\n </div>\n }\n </div>\n </div>\n</div>\n\n<div class=\"ax-scheduler-week-time-container\">\n <div class=\"ax-scheduler-week-time\" aria-hidden=\"true\">\n @for (time of hoursArray(); track time.date.getTime()) {\n <div>\n {{ time | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </div>\n }\n </div>\n\n <div class=\"ax-scheduler-week-table-container\">\n <!-- Current Time Line Indicator -->\n @if (\n shouldShowCurrentTimeForToday() &&\n getCurrentTimePositionWithOffset() !== null &&\n getCurrentDayColumnPosition() !== null\n ) {\n <div\n #currentTimeLine\n class=\"ax-scheduler-current-time-line\"\n [style.inset-block-start]=\"getCurrentTimePositionWithOffset()\"\n [style.inset-inline-start]=\"getCurrentDayColumnPosition()\"\n [style.width]=\"getCurrentDayColumnWidth()\"\n ></div>\n }\n <div class=\"ax-scheduler-week-appointment-container\">\n @for (appt of visibleAppointmentsLayout(); track appt.appointment.id) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragData]=\"appt.appointment\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || appt.appointment.readonly || readonly()\"\n (pointerdown)=\"getSlotId($event)\"\n (click)=\"handleAppointmentEvent($event, appt.appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appt.appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appt.appointment)\"\n [title]=\"tooltipTemplate() ? '' : appt.appointment.title\"\n [style.width]=\"appt.layoutWidth\"\n [style.height]=\"appt.layoutHeight\"\n class=\"ax-scheduler-week-appointment\"\n [style.inset-block-start]=\"appt.layoutTop\"\n [style.inset-inline-start]=\"appt.layoutLeft\"\n [ngClass]=\"appt.appointment.cssClass ?? `ax-scheduler-${appt.appointment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltipContext]=\"appt.appointment\"\n [axTooltip]=\"tooltipTemplate()\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ appt.appointment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, appt.appointment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n ></ax-icon>\n }\n </ax-title>\n <ax-subtitle>\n {{\n appt.appointment.originalStartDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n }}\n -\n {{ appt.appointment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async }}\n </ax-subtitle>\n </div>\n }\n\n <!-- Overflow Badges with Popovers -->\n @for (badge of overflowBadgesWithData(); track badge.key) {\n <!-- Wrap badge and popover for targeting -->\n <div\n style=\"position: absolute\"\n class=\"ax-scheduler-badge-wrapper\"\n [style.inset-block-start]=\"badge.badgeTop\"\n [style.inset-inline-start]=\"badge.badgeLeft\"\n >\n <!-- The Badge itself -->\n <div\n #actionButton\n class=\"ax-scheduler-appointment-badge\"\n [ngClass]=\"\n badge.hiddenAppointments[0].cssClass ??\n `ax-scheduler-${badge.hiddenAppointments[0].priority ?? 'primary'}-periority`\n \"\n >\n +{{ badge.count }}\n </div>\n <!-- The Popover -->\n <ax-popover [target]=\"actionButton\">\n <div class=\"ax-overlay-pane ax-scheduler-popover\" axDropZone>\n @for (appointment of badge.hiddenAppointments; track appointment.id) {\n <div\n axDrag\n [dragCursor]=\"'grab'\"\n [dragData]=\"appointment\"\n [dragTransition]=\"false\"\n [dragElementClone]=\"true\"\n [dragStartDelay]=\"dragStartDelay()\"\n [dragDisabled]=\"!draggable() || appointment.readonly || readonly()\"\n (click)=\"handleAppointmentEvent($event, appointment)\"\n (dblclick)=\"handleAppointmentEvent($event, appointment)\"\n (contextmenu)=\"handleAppointmentEvent($event, appointment)\"\n [title]=\"tooltipTemplate() ? '' : appointment.title\"\n class=\"ax-scheduler-popover-appointment\"\n [ngClass]=\"appointment.cssClass ?? `ax-scheduler-${appointment.priority ?? 'primary'}-periority`\"\n [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n [axTooltipContext]=\"appointment\"\n [axTooltip]=\"tooltipTemplate()\"\n >\n <ax-title>\n <span class=\"ax-scheduler-truncate\">{{ appointment.title }}</span>\n @if (hasActions()) {\n <ax-icon\n (click)=\"handleActionClick($event, appointment)\"\n class=\"ax-icon ax-icon-more-horizontal ax-scheduler-action-icon\"\n ></ax-icon>\n }\n </ax-title>\n <ax-subtitle>\n {{\n appointment.originalStartDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n }}\n -\n {{\n appointment.originalEndDate | format: 'time' : { format: 'HH:mm', calendar: calendar() } | async\n }}\n </ax-subtitle>\n </div>\n }\n </div>\n </ax-popover>\n </div>\n }\n </div>\n\n <table aria-hidden=\"true\" [border]=\"1\">\n <tbody>\n @for (time of hoursArray(); track time.date.getTime()) {\n <tr>\n @for (day of daysArray(); track day.date.date.getTime()) {\n <td\n axDropZone\n #zone=\"axDropZone\"\n [class.ax-scheduler-slot-hovered]=\"zone.isHovered()\"\n (onElementDrop)=\"handleSingleDayDrop($event, time, day.date, 0)\"\n (click)=\"handleSingleSlotEvent($event, time, day.date, 0)\"\n (dblclick)=\"handleSingleSlotEvent($event, time, day.date, 0)\"\n (contextmenu)=\"handleSingleSlotEvent($event, time, day.date, 0)\"\n [attr.data-slot-id]=\"day.date.format('YYYYMMDD') + '-' + time.format('HHmm')\"\n ></td>\n }\n </tr>\n <tr>\n @for (day of daysArray(); track day.date.date.getTime()) {\n <td\n axDropZone\n #zone2=\"axDropZone\"\n [class.ax-scheduler-slot-hovered]=\"zone2.isHovered()\"\n (onElementDrop)=\"handleSingleDayDrop($event, time, day.date, 1)\"\n (click)=\"handleSingleSlotEvent($event, time, day.date, 1)\"\n (dblclick)=\"handleSingleSlotEvent($event, time, day.date, 1)\"\n (contextmenu)=\"handleSingleSlotEvent($event, time, day.date, 1)\"\n [attr.data-slot-id]=\"day.date.format('YYYYMMDD') + '-' + time.add('minute', 30).format('HHmm')\"\n ></td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n</div>\n","import { AXComponent, AXValueChangedEvent, NXComponent, NXEvent, NXNativeEvent } from '@acorex/cdk/common';\nimport { AXDropZoneDropEvent } from '@acorex/cdk/drag-drop';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXCalendarComponent } from '@acorex/components/calendar';\nimport { AXDecoratorIconComponent } from '@acorex/components/decorators';\nimport { AXPopoverComponent } from '@acorex/components/popover';\nimport { AXSelectBoxComponent } from '@acorex/components/select-box';\nimport { AXCalendarService, AXDateTime, AXHolidayDate } from '@acorex/core/date-time';\nimport { AXFormatService } from '@acorex/core/format';\nimport { AXLocaleService } from '@acorex/core/locale';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXHtmlUtil, AXUnsubscriber } from '@acorex/core/utils';\nimport { isPlatformBrowser, NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n linkedSignal,\n model,\n OnInit,\n output,\n PLATFORM_ID,\n signal,\n TemplateRef,\n untracked,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n AXDayOfWeekName,\n AXSchedulerAppointment,\n AXSchedulerAppointmentDataSource,\n AXSchedulerAppointmentLoader,\n AXSchedulerDateRange,\n AXSchedulerResource,\n AXSchedulerView,\n} from './scheduler.class';\nimport { AXSchedulerService } from './scheduler.service';\nimport { AXSchedulerAgendaViewComponent } from './views/agenda/scheduler-agenda-view.component';\nimport { AXSchedulerDayViewComponent } from './views/day/scheduler-day-view.component';\nimport { AXSchedulerMonthViewComponent } from './views/month/scheduler-month-view.component';\nimport { AXSchedulerTimelineDayViewComponent } from './views/timeline-day/scheduler-timeline-day-view.component';\nimport { AXSchedulerTimelineMonthViewComponent } from './views/timeline-month/scheduler-timeline-month-view.component';\nimport { AXSchedulerTimelineMultiDayViewComponent } from './views/timeline-multi-day/scheduler-timeline-multi-day-view.component';\nimport { AXSchedulerTimelineYearViewComponent } from './views/timeline-year/scheduler-timeline-year-view.component';\nimport { AXSchedulerWeekViewComponent } from './views/week/scheduler-week-view.component';\n\nexport interface AXSchedulerAppointmentMouseEvent extends NXNativeEvent<AXSchedulerComponent, MouseEvent> {\n appointment: AXSchedulerAppointment;\n}\nexport interface AXSchedulerSlotMouseEvent extends NXNativeEvent<AXSchedulerComponent, MouseEvent> {\n slot: {\n endDate: AXDateTime;\n startDate: AXDateTime;\n view: AXSchedulerView;\n };\n}\nexport interface AXSchedulerSlotDropEvent extends NXEvent<AXSchedulerComponent> {\n dropEvent: AXDropZoneDropEvent;\n appointment: AXSchedulerAppointment;\n slot: {\n endDate: AXDateTime;\n startDate: AXDateTime;\n view: AXSchedulerView;\n resourceId?: any; // Resource ID for timeline views\n };\n isSameSlotDrop: boolean; // True if dropped on the same time AND same resource\n}\n\n@Component({\n selector: 'ax-scheduler',\n templateUrl: './scheduler.component.html',\n styleUrls: ['./scheduler.component.compiled.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n NgClass,\n FormsModule,\n AXButtonComponent,\n AXPopoverComponent,\n AXCalendarComponent,\n AXSelectBoxComponent,\n AXDecoratorIconComponent,\n AXSchedulerDayViewComponent,\n AXSchedulerWeekViewComponent,\n AXSchedulerMonthViewComponent,\n AXSchedulerAgendaViewComponent,\n AXSchedulerTimelineDayViewComponent,\n AXSchedulerTimelineMonthViewComponent,\n AXSchedulerTimelineMultiDayViewComponent,\n AXSchedulerTimelineYearViewComponent,\n ],\n providers: [AXUnsubscriber, { provide: AXComponent, useExisting: AXSchedulerComponent }],\n})\nexport class AXSchedulerComponent extends NXComponent implements OnInit {\n private platformId = inject(PLATFORM_ID);\n private unsubscriber = inject(AXUnsubscriber);\n private formatService = inject(AXFormatService);\n private localeService = inject(AXLocaleService);\n private calendarService = inject(AXCalendarService);\n private schedulerService = inject(AXSchedulerService);\n private translationService = inject(AXTranslationService);\n\n private viewModeSelectbox = viewChild(AXSelectBoxComponent);\n private calendarPopover = viewChild<AXPopoverComponent>('calendarPopover');\n\n private displayViews: Record<AXSchedulerView, string> = {\n day: 'daily',\n week: 'weekly',\n month: 'monthly',\n 'timeline-day': 'daily-timeline',\n 'timeline-multi-day': 'multi-day-timeline',\n 'timeline-month': 'monthly-timeline',\n 'timeline-year': 'yearly-timeline',\n agenda: 'agenda',\n };\n\n public calendar = input<'gregorian' | 'solar-hijri' | string>();\n protected calendarType = linkedSignal<'gregorian' | 'solar-hijri' | string>(\n () => this.calendar() ?? this.localeService.activeProfile().calendar.system,\n );\n\n public startingDate = input<Date>(new Date());\n public currentDate = linkedSignal<AXDateTime>(() =>\n this.calendarService.create(this.startingDate(), this.calendarType()).startOf('day'),\n );\n\n private _appointments = signal<AXSchedulerAppointment[]>([]);\n public appointments = this._appointments.asReadonly();\n protected rtl = signal(false);\n protected isFullScreen = signal(false);\n protected viewsDataSource = signal<{ id: string; text: string }[]>([]);\n private prevDate = signal<AXDateTime>(this.calendarService.create(new Date(), this.calendarType()));\n\n public endDayHour = input(24);\n public startDayHour = input(8);\n public hasHeader = input(true);\n public readonly = input(false);\n public draggable = input(true);\n public hasActions = input(false);\n public dragStartDelay = input(0);\n public weekend = input<number[]>([]);\n public allowFullScreen = input(true);\n public multiDayViewDaysCount = input(7);\n public showResourceHeaders = input(true);\n public showCurrentTimeIndicator = input(true);\n public showUnassignedAppointments = input(true);\n public resources = input<AXSchedulerResource[]>([]);\n public resourceTemplate = input<TemplateRef<unknown>>();\n public firstDayOfWeek = input<AXDayOfWeekName>('sunday');\n public tooltipTemplate = input<string | TemplateRef<unknown>>();\n public dataSource = input<AXSchedulerAppointmentDataSource>([]);\n public holidays = input<(range: AXSchedulerDateRange) => Promise<AXHolidayDate[]>>();\n public views = input<AXSchedulerView[]>([\n 'day',\n 'week',\n 'month',\n 'timeline-day',\n 'timeline-multi-day',\n 'timeline-month',\n 'timeline-year',\n 'agenda',\n ]);\n\n public selectedView = model<AXSchedulerView>(this.views()[0]);\n private prevView = signal<AXSchedulerView>(this.selectedView());\n\n // --- Public Outputs ---\n public onDataLoaded = output<void>();\n public onRangeChanged = output<AXSchedulerDateRange>();\n public onSlotClicked = output<AXSchedulerSlotMouseEvent>();\n public onSlotDblClicked = output<AXSchedulerSlotMouseEvent>();\n public onSlotRightClick = output<AXSchedulerSlotMouseEvent>();\n public onAppointmentDrop = output<AXSchedulerSlotDropEvent>();\n public onActionClick = output<AXSchedulerAppointmentMouseEvent>();\n public onAppointmentClicked = output<AXSchedulerAppointmentMouseEvent>();\n public onAppointmentDblClicked = output<AXSchedulerAppointmentMouseEvent>();\n public onAppointmentRightClick = output<AXSchedulerAppointmentMouseEvent>();\n\n // --- Internal Handlers for View Outputs ---\n protected handleSlotClickInternal(eventData: AXSchedulerSlotMouseEvent) {\n this.onSlotClicked.emit(eventData);\n }\n protected handleSlotDblClickInternal(eventData: AXSchedulerSlotMouseEvent) {\n this.onSlotDblClicked.emit(eventData);\n }\n protected handleSlotRightClickInternal(eventData: AXSchedulerSlotMouseEvent) {\n this.onSlotRightClick.emit(eventData);\n }\n protected handleAppointmentClickInternal(eventData: AXSchedulerAppointmentMouseEvent) {\n this.onAppointmentClicked.emit(eventData);\n }\n protected handleAppointmentDblClickInternal(eventData: AXSchedulerAppointmentMouseEvent) {\n this.onAppointmentDblClicked.emit(eventData);\n }\n protected handleAppointmentRightClickInternal(eventData: AXSchedulerAppointmentMouseEvent) {\n this.onAppointmentRightClick.emit(eventData);\n }\n protected handleAppointmentDropInternal(eventData: AXSchedulerSlotDropEvent) {\n this.onAppointmentDrop.emit(eventData);\n }\n\n ngOnInit() {\n this.calendarService.calendarChanges$.pipe(this.unsubscriber.takeUntilDestroy).subscribe(() => {\n const currentDate = this.calendarService.create(this.currentDate().date, this.calendarType());\n if (!currentDate.equal(this.currentDate())) {\n this.currentDate.set(currentDate);\n }\n });\n\n this.translationService.langChanges$.pipe(this.unsubscriber.takeUntilDestroy).subscribe(async () => {\n await this.fillDataSource();\n this.viewModeSelectbox()?.selectItems(this.viewsDataSource().find((c) => c.id == this.selectedView()));\n const currentDate = this.calendarService.create(this.currentDate().date, this.calendarType());\n if (!currentDate.equal(this.currentDate())) {\n this.currentDate.set(currentDate);\n }\n });\n\n if (isPlatformBrowser(this.platformId)) this.rtl.set(AXHtmlUtil.isRtl(this.nativeElement));\n this.fillDataSource();\n }\n\n #appointmentEffect = effect(async () => {\n if (typeof this.dataSource() === 'function') {\n const func = this.dataSource() as AXSchedulerAppointmentLoader;\n const range = {\n end: this.range().end,\n from: this.range().from,\n };\n const list = await func({ range });\n this._appointments.set(list);\n } else {\n const list = this.dataSource() as AXSchedulerAppointment[];\n this._appointments.set(list);\n }\n this.onDataLoaded.emit();\n });\n\n #holidayEffect = effect(async () => {\n const func = this.holidays();\n const range = {\n end: this.range().end,\n from: this.range().from,\n };\n this.schedulerService.internalHoliday.set(await func(range));\n });\n #weekendEffect = effect(async () => {\n const weekend = this.weekend();\n this.schedulerService.internalWeekend.set(weekend);\n });\n\n private async fillDataSource() {\n const result = [];\n for await (const c of this.views()) {\n const text = await this.translationService.translateAsync(`@acorex:dateTime.duration.${this.displayViews[c]}`);\n result.push({ text, id: c });\n }\n this.viewsDataSource.set(result);\n }\n\n private getGridDateRange(dateInMonth: AXDateTime): { gridStartDate: AXDateTime; gridEndDate: AXDateTime } {\n const firstDayOfMonth = dateInMonth.startOf('month');\n const firstDayGridNum = this.schedulerService.getDayOfWeekNumber(this.firstDayOfWeek());\n const firstDisplayedDayOfWeek = firstDayOfMonth.dayOfWeek;\n const daysFromPrevMonth = (firstDisplayedDayOfWeek - firstDayGridNum + 7) % 7;\n const gridStartDate = firstDayOfMonth.add('day', -daysFromPrevMonth);\n // Calculate end date based on standard 6 weeks for safety, or calculate dynamically if preferred\n const gridEndDate = gridStartDate.add('day', 6 * 7 - 1);\n return { gridStartDate, gridEndDate };\n }\n\n public currentDateText = computed(() => {\n switch (this.selectedView()) {\n case 'day':\n case 'timeline-day':\n return this.formatService.format(this.currentDate(), 'datetime', {\n format: 'DD MMMM yyyy',\n calendar: this.calendarType(),\n });\n case 'week': {\n const startOfWeek = this.formatService.format(this.currentDate(), 'datetime', {\n format: 'DD MMMM yyyy',\n calendar: this.calendarType(),\n });\n const endOfWeek = this.formatService.format(this.currentDate().add('week', 1).add('day', -1), 'datetime', {\n format: 'DD MMMM yyyy',\n calendar: this.calendarType(),\n });\n return `${startOfWeek} - ${endOfWeek}`;\n }\n case 'agenda':\n case 'timeline-multi-day': {\n const startOfWeek = this.formatService.format(this.currentDate(), 'datetime', {\n format: 'DD MMMM yyyy',\n calendar: this.calendarType(),\n });\n const endOfWeek = this.formatService.format(\n this.currentDate().add('day', this.multiDayViewDaysCount() - 1),\n 'datetime',\n {\n format: 'DD MMMM yyyy',\n calendar: this.calendarType(),\n },\n );\n return `${startOfWeek} - ${endOfWeek}`;\n }\n case 'month':\n case 'timeline-month':\n return this.formatService.format(this.currentDate(), 'datetime', {\n format: 'MMMM yyyy',\n calendar: this.calendarType(),\n });\n case 'timeline-year':\n return this.formatService.format(this.currentDate(), 'datetime', {\n format: 'yyyy',\n calendar: this.calendarType(),\n });\n }\n });\n\n public calendarDepth = computed(() => {\n switch (this.selectedView()) {\n case 'day':\n case 'week':\n case 'agenda':\n case 'timeline-day':\n case 'timeline-multi-day':\n return 'day';\n case 'month':\n case 'timeline-month':\n return 'month';\n case 'timeline-year':\n return 'year';\n }\n });\n\n private mappedAppointments = computed<AXSchedulerAppointment[]>(() => {\n const items = this._appointments() as AXSchedulerAppointment[];\n\n return items\n .map((item) => {\n const startDate = this.calendarService.create(item.startDate, this.calendarType());\n const endDate = this.calendarService.create(item.endDate, this.calendarType());\n // Basic validation\n if (!startDate?.date || !endDate?.date) {\n console.warn('Scheduler: Skipping item due to invalid date fields:', item);\n return null;\n }\n // Check if dates are valid after creation\n if (isNaN(startDate.date.getTime()) || isNaN(endDate.date.getTime())) {\n console.warn('Scheduler: Skipping item due to invalid parsed date (NaN):', item);\n return null;\n }\n return item;\n })\n .filter((appt): appt is AXSchedulerAppointment => appt !== null); // Filter out nulls from invalid dates\n });\n\n public range = computed<AXSchedulerDateRange>(() => {\n const view = this.selectedView();\n const current = this.currentDate().startOf('day');\n\n if (!current) return { from: null, end: null };\n\n switch (view) {\n case 'day':\n case 'timeline-day': {\n const range = { from: current.date, end: current.endOf('day').date };\n return range;\n }\n case 'week': {\n const range = { from: current.date, end: current.add('day', 7).date };\n return range;\n }\n case 'month': {\n const { gridStartDate, gridEndDate } = this.getGridDateRange(current);\n const range = { from: gridStartDate.date, end: gridEndDate.add('day', 1).date };\n return range;\n }\n case 'timeline-month': {\n const range = { from: current.startOf('month').date, end: current.endOf('month').date };\n return range;\n }\n case 'agenda':\n case 'timeline-multi-day': {\n const range = { from: current.date, end: current.add('day', this.multiDayViewDaysCount()).date };\n return range;\n }\n case 'timeline-year': {\n const range = { from: current.startOf('year').date, end: current.endOf('year').date };\n return range;\n }\n }\n });\n\n #rangeChangedEffect = effect(() => {\n this.onRangeChanged.emit(this.range());\n });\n\n #viewChangedEffect = effect(() => {\n const view = this.selectedView();\n untracked(() => {\n this.handleViewChanged(this.prevView(), view);\n });\n });\n\n viewAppointments = computed<AXSchedulerAppointment[]>(() => {\n const current = this.currentDate();\n const mapped = this.mappedAppointments();\n const rangeStart = this.range().from;\n const rangeEnd = this.range().end;\n\n if (!current || mapped.length === 0) return [];\n\n return mapped.filter(\n (appt) =>\n this.calendarService.create(appt.startDate, this.calendarType()).compare(rangeEnd, 'second') <= 0 &&\n this.calendarService.create(appt.endDate, this.calendarType()).compare(rangeStart, 'second') >= 0,\n );\n });\n\n /**\n * Handles view change events.\n *\n * @param e - The value changed event containing old and new view values.\n */\n viewChanged(e: AXValueChangedEvent<AXSchedulerView>) {\n const newView = e.value;\n const oldView = e.oldValue;\n this.selectedView.set(newView);\n\n this.handleViewChanged(oldView, newView);\n }\n\n private handleViewChanged(oldView: AXSchedulerView, newView: AXSchedulerView) {\n if (oldView === 'week') {\n const oldDayOfWeek = this.prevDate().dayOfWeek % 7;\n const date = this.currentDate().add('day', oldDayOfWeek - 1);\n this.currentDate.set(date);\n }\n\n this.prevDate.set(this.currentDate());\n\n if (newView === 'week') {\n const currentDate = this.currentDate();\n const currentDayOfWeek = currentDate.dayOfWeek;\n const desiredFirstDayName = this.firstDayOfWeek();\n const desiredFirstDayNumber = this.schedulerService.getDayOfWeekNumber(desiredFirstDayName);\n const daysToSubtract = (currentDayOfWeek - desiredFirstDayNumber + 7) % 7;\n const startOfWeekDate = currentDate.add('day', -daysToSubtract);\n this.currentDate.set(startOfWeekDate);\n }\n\n this.prevView.set(newView);\n }\n\n /**\n * Navigates to the next time period based on current view.\n */\n nextClick() {\n switch (this.selectedView()) {\n case 'day':\n case 'timeline-day':\n this.currentDate.set(this.currentDate().add('day', 1));\n break;\n\n case 'week':\n this.currentDate.set(this.currentDate().add('week', 1));\n break;\n\n case 'agenda':\n case 'timeline-multi-day':\n this.currentDate.set(this.currentDate().add('day', this.multiDayViewDaysCount()));\n break;\n\n case 'month':\n case 'timeline-month':\n this.currentDate.set(this.currentDate().add('month', 1));\n break;\n\n case 'timeline-year':\n this.currentDate.set(this.currentDate().add('year', 1));\n break;\n }\n }\n\n /**\n * Navigates to the previous time period based on current view.\n */\n prevClick() {\n switch (this.selectedView()) {\n case 'day':\n case 'timeline-day':\n this.currentDate.set(this.currentDate().add('day', -1));\n break;\n\n case 'week':\n this.currentDate.set(this.currentDate().add('week', -1));\n break;\n\n case 'agenda':\n case 'timeline-multi-day':\n this.currentDate.set(this.currentDate().add('day', -this.multiDayViewDaysCount()));\n break;\n\n case 'month':\n case 'timeline-month':\n this.currentDate.set(this.currentDate().add('month', -1));\n break;\n\n case 'timeline-year':\n this.currentDate.set(this.currentDate().add('year', -1));\n break;\n }\n }\n\n /**\n * Handles calendar date change events.\n *\n * @param e - The value changed event containing the new date.\n */\n calendarDateChanged(e: AXValueChangedEvent<Date>) {\n let currentDate = this.calendarService.create(e.value, this.calendarType());\n if (this.selectedView() === 'week') {\n const currentDayOfWeek = currentDate.dayOfWeek;\n const desiredFirstDayName = this.firstDayOfWeek();\n const desiredFirstDayNumber = this.schedulerService.getDayOfWeekNumber(desiredFirstDayName);\n const daysToSubtract = (currentDayOfWeek - desiredFirstDayNumber + 7) % 7;\n currentDate = currentDate.add('day', -daysToSubtract);\n }\n if (!currentDate.equal(this.currentDate())) {\n this.currentDate.set(currentDate);\n }\n this.calendarPopover()?.close();\n }\n\n /**\n * Toggles fullscreen mode for the scheduler.\n */\n public handleFullScreen() {\n if (!this.isFullScreen()) this.nativeElement.classList.add('ax-full-screen-container');\n else this.nativeElement.classList.remove('ax-full-screen-container');\n this.isFullScreen.set(!this.isFullScreen());\n }\n\n /**\n * Refreshes the scheduler data.\n *\n * @param appointments - Optional array of appointments to refresh with.\n */\n public async refresh(appointments?: AXSchedulerAppointment[]) {\n if (appointments) {\n const newAppointments = this._appointments().map((appt) => {\n return appointments.find((a) => a.id === appt.id) ?? appt;\n });\n this._appointments.set(newAppointments);\n this.onDataLoaded.emit();\n return;\n }\n if (typeof this.dataSource() === 'function') {\n const func = this.dataSource() as AXSchedulerAppointmentLoader;\n const range = {\n end: this.range().end,\n from: this.range().from,\n };\n const list = await func({ range });\n this._appointments.set(list);\n this.onDataLoaded.emit();\n return;\n }\n const list = this.dataSource() as AXSchedulerAppointment[];\n this._appointments.set(list);\n this.onDataLoaded.emit();\n }\n}\n","<div class=\"ax-scheduler-container\">\n @if (hasHeader()) {\n <div class=\"ax-scheduler-header\">\n <div class=\"ax-scheduler-date\">\n <ax-button look=\"blank\" (onClick)=\"prevClick()\">\n <ax-icon\n class=\"ax-icon ax-text-xl\"\n [ngClass]=\"{\n 'ax-icon-chevron-left': !rtl(),\n 'ax-icon-chevron-right': rtl(),\n }\"\n ></ax-icon>\n </ax-button>\n <ax-button look=\"blank\" [text]=\"currentDateText()\" #date></ax-button>\n <ax-button look=\"blank\" (onClick)=\"nextClick()\">\n <ax-icon\n class=\"ax-icon ax-text-xl\"\n [ngClass]=\"{\n 'ax-icon-chevron-right': !rtl(),\n 'ax-icon-chevron-left': rtl(),\n }\"\n ></ax-icon>\n </ax-button>\n <ax-popover [target]=\"date\" #calendarPopover>\n <div class=\"ax-overlay-pane\">\n <ax-calendar\n [type]=\"calendarType()\"\n [depth]=\"calendarDepth()\"\n [ngModel]=\"currentDate()\"\n (onValueChanged)=\"calendarDateChanged($event)\"\n ></ax-calendar>\n </div>\n </ax-popover>\n </div>\n <div class=\"ax-scheduler-actions\">\n <ax-select-box\n [dropdownWidth]=\"'200px'\"\n [ngModel]=\"selectedView()\"\n [dataSource]=\"viewsDataSource()\"\n (onValueChanged)=\"viewChanged($event)\"\n ></ax-select-box>\n\n @if (allowFullScreen()) {\n <ax-button look=\"blank\" (onClick)=\"handleFullScreen()\">\n <ax-icon>\n <i\n class=\"fa-solid fa-expand\"\n [ngClass]=\"{ 'fa-compress': isFullScreen(), 'fa-expand': !isFullScreen() }\"\n ></i>\n </ax-icon>\n </ax-button>\n }\n </div>\n </div>\n }\n <div class=\"ax-scheduler-views-container\">\n @switch (selectedView()) {\n @case ('day') {\n <ax-scheduler-day-view\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [draggable]=\"draggable()\"\n [hasActions]=\"hasActions()\"\n [calendar]=\"calendarType()\"\n [endDayHour]=\"endDayHour()\"\n [startDayHour]=\"startDayHour()\"\n [showCurrentTimeIndicator]=\"showCurrentTimeIndicator()\"\n [appointments]=\"viewAppointments()\"\n [dragStartDelay]=\"dragStartDelay()\"\n [tooltipTemplate]=\"tooltipTemplate()\"\n (onActionClickInternal)=\"onActionClick.emit($event)\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n ></ax-scheduler-day-view>\n }\n @case ('week') {\n <ax-scheduler-week-view\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [endDayHour]=\"endDayHour()\"\n [hasActions]=\"hasActions()\"\n [startDayHour]=\"startDayHour()\"\n [showCurrentTimeIndicator]=\"showCurrentTimeIndicator()\"\n [appointments]=\"viewAppointments()\"\n [dragStartDelay]=\"dragStartDelay()\"\n [tooltipTemplate]=\"tooltipTemplate()\"\n (onActionClickInternal)=\"onActionClick.emit($event)\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n ></ax-scheduler-week-view>\n }\n @case ('month') {\n <ax-scheduler-month-view\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [hasActions]=\"hasActions()\"\n [appointments]=\"viewAppointments()\"\n [firstDayOfWeek]=\"firstDayOfWeek()\"\n [dragStartDelay]=\"dragStartDelay()\"\n [tooltipTemplate]=\"tooltipTemplate()\"\n (onActionClickInternal)=\"onActionClick.emit($event)\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n ></ax-scheduler-month-view>\n }\n @case ('timeline-day') {\n <ax-scheduler-timeline-day-view\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [resources]=\"resources()\"\n [draggable]=\"draggable()\"\n [hasActions]=\"hasActions()\"\n [calendar]=\"calendarType()\"\n [endDayHour]=\"endDayHour()\"\n [startDayHour]=\"startDayHour()\"\n [appointments]=\"viewAppointments()\"\n [dragStartDelay]=\"dragStartDelay()\"\n [tooltipTemplate]=\"tooltipTemplate()\"\n [resourceTemplate]=\"resourceTemplate()\"\n [showResourceHeaders]=\"showResourceHeaders()\"\n [showCurrentTimeIndicator]=\"showCurrentTimeIndicator()\"\n [showUnassignedAppointments]=\"showUnassignedAppointments()\"\n (onActionClickInternal)=\"onActionClick.emit($event)\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n >\n </ax-scheduler-timeline-day-view>\n }\n @case ('timeline-multi-day') {\n <ax-scheduler-timeline-multi-day-view\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [resources]=\"resources()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [endDayHour]=\"endDayHour()\"\n [hasActions]=\"hasActions()\"\n [startDayHour]=\"startDayHour()\"\n [appointments]=\"viewAppointments()\"\n [dragStartDelay]=\"dragStartDelay()\"\n [daysCount]=\"multiDayViewDaysCount()\"\n [tooltipTemplate]=\"tooltipTemplate()\"\n [resourceTemplate]=\"resourceTemplate()\"\n [showResourceHeaders]=\"showResourceHeaders()\"\n [showCurrentTimeIndicator]=\"showCurrentTimeIndicator()\"\n [showUnassignedAppointments]=\"showUnassignedAppointments()\"\n (onActionClickInternal)=\"onActionClick.emit($event)\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n >\n </ax-scheduler-timeline-multi-day-view>\n }\n @case ('timeline-month') {\n <ax-scheduler-timeline-month-view\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [resources]=\"resources()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [hasActions]=\"hasActions()\"\n [appointments]=\"viewAppointments()\"\n [dragStartDelay]=\"dragStartDelay()\"\n [tooltipTemplate]=\"tooltipTemplate()\"\n [resourceTemplate]=\"resourceTemplate()\"\n [showResourceHeaders]=\"showResourceHeaders()\"\n [showCurrentTimeIndicator]=\"showCurrentTimeIndicator()\"\n [showUnassignedAppointments]=\"showUnassignedAppointments()\"\n (onActionClickInternal)=\"onActionClick.emit($event)\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n >\n </ax-scheduler-timeline-month-view>\n }\n @case ('timeline-year') {\n <ax-scheduler-timeline-year-view\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [resources]=\"resources()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [hasActions]=\"hasActions()\"\n [appointments]=\"viewAppointments()\"\n [dragStartDelay]=\"dragStartDelay()\"\n [tooltipTemplate]=\"tooltipTemplate()\"\n [resourceTemplate]=\"resourceTemplate()\"\n [showResourceHeaders]=\"showResourceHeaders()\"\n [showCurrentTimeIndicator]=\"showCurrentTimeIndicator()\"\n [showUnassignedAppointments]=\"showUnassignedAppointments()\"\n (onActionClickInternal)=\"onActionClick.emit($event)\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n >\n </ax-scheduler-timeline-year-view>\n }\n @case ('agenda') {\n <ax-scheduler-agenda-view\n [date]=\"currentDate()\"\n [readonly]=\"readonly()\"\n [draggable]=\"draggable()\"\n [calendar]=\"calendarType()\"\n [hasActions]=\"hasActions()\"\n [appointments]=\"viewAppointments()\"\n [dragStartDelay]=\"dragStartDelay()\"\n [daysCount]=\"multiDayViewDaysCount()\"\n [tooltipTemplate]=\"tooltipTemplate()\"\n (onActionClickInternal)=\"onActionClick.emit($event)\"\n (slotClickedInternal)=\"handleSlotClickInternal($event)\"\n (slotDblClickedInternal)=\"handleSlotDblClickInternal($event)\"\n (slotRightClickedInternal)=\"handleSlotRightClickInternal($event)\"\n (onAppointmentDropInternal)=\"handleAppointmentDropInternal($event)\"\n (appointmentClickedInternal)=\"handleAppointmentClickInternal($event)\"\n (appointmentDblClickedInternal)=\"handleAppointmentDblClickInternal($event)\"\n (appointmentRightClickedInternal)=\"handleAppointmentRightClickInternal($event)\"\n >\n </ax-scheduler-agenda-view>\n }\n }\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { AXSchedulerComponent } from './scheduler.component';\nimport { AXSchedulerAgendaViewComponent } from './views/agenda/scheduler-agenda-view.component';\nimport { AXSchedulerDayViewComponent } from './views/day/scheduler-day-view.component';\nimport { AXSchedulerMonthViewComponent } from './views/month/scheduler-month-view.component';\nimport { AXSchedulerTimelineDayViewComponent } from './views/timeline-day/scheduler-timeline-day-view.component';\nimport { AXSchedulerTimelineMonthViewComponent } from './views/timeline-month/scheduler-timeline-month-view.component';\nimport { AXSchedulerTimelineMultiDayViewComponent } from './views/timeline-multi-day/scheduler-timeline-multi-day-view.component';\nimport { AXSchedulerTimelineYearViewComponent } from './views/timeline-year/scheduler-timeline-year-view.component';\nimport { AXSchedulerWeekViewComponent } from './views/week/scheduler-week-view.component';\n\nconst COMPONENT = [\n AXSchedulerComponent,\n AXSchedulerDayViewComponent,\n AXSchedulerWeekViewComponent,\n AXSchedulerMonthViewComponent,\n AXSchedulerAgendaViewComponent,\n AXSchedulerTimelineDayViewComponent,\n AXSchedulerTimelineMonthViewComponent,\n AXSchedulerTimelineMultiDayViewComponent,\n AXSchedulerTimelineYearViewComponent,\n];\n\n@NgModule({\n imports: [...COMPONENT],\n exports: [...COMPONENT],\n providers: [],\n})\nexport class AXSchedulerModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|