angular-hijri-gregorian-date-time-picker 1.5.0 → 1.5.1
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/README.md +249 -236
- package/{fesm2020 → fesm2022}/angular-hijri-gregorian-date-time-picker.mjs +1438 -1438
- package/fesm2022/angular-hijri-gregorian-date-time-picker.mjs.map +1 -0
- package/index.d.ts +347 -5
- package/package.json +7 -15
- package/_interfaces/calendar-model.d.ts +0 -28
- package/_interfaces/styles-config.model.d.ts +0 -13
- package/_services/date-utilities.service.d.ts +0 -49
- package/esm2020/_data/dictionary.json +0 -1
- package/esm2020/_interfaces/calendar-model.mjs +0 -2
- package/esm2020/_interfaces/styles-config.model.mjs +0 -2
- package/esm2020/_services/date-utilities.service.mjs +0 -375
- package/esm2020/angular-hijri-gregorian-date-time-picker.mjs +0 -5
- package/esm2020/lib/hijri-gregorian-datepicker.component.mjs +0 -1058
- package/esm2020/lib/hijri-gregorian-datepicker.module.mjs +0 -19
- package/esm2020/public-api.mjs +0 -8
- package/esm2020/themes/themes.json +0 -152
- package/fesm2015/angular-hijri-gregorian-date-time-picker.mjs +0 -28995
- package/fesm2015/angular-hijri-gregorian-date-time-picker.mjs.map +0 -1
- package/fesm2020/angular-hijri-gregorian-date-time-picker.mjs.map +0 -1
- package/lib/hijri-gregorian-datepicker.component.d.ts +0 -238
- package/lib/hijri-gregorian-datepicker.module.d.ts +0 -9
- package/public-api.d.ts +0 -4
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"angular-hijri-gregorian-date-time-picker.mjs","sources":["../../../projects/hijri-gregorian-datepicker/src/_services/date-utilities.service.ts","../../../projects/hijri-gregorian-datepicker/src/lib/hijri-gregorian-datepicker.component.ts","../../../projects/hijri-gregorian-datepicker/src/lib/hijri-gregorian-datepicker.component.html","../../../projects/hijri-gregorian-datepicker/src/lib/hijri-gregorian-datepicker.module.ts","../../../projects/hijri-gregorian-datepicker/src/public-api.ts","../../../projects/hijri-gregorian-datepicker/src/angular-hijri-gregorian-date-time-picker.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport * as datesDictionary from '../_data/dictionary.json';\nimport { Data, DayInfo, MonthDays } from '../_interfaces/calendar-model';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DateUtilitiesService {\n public calendarData: Data;\n\n constructor() {\n this.calendarData = (datesDictionary as any)['default']; //prod\n // this.calendarData = datesDictionary; //debug\n }\n\n parseDate(dateStr: string): Date | null {\n if (!dateStr) {\n return null;\n }\n const parts = dateStr?.split('/');\n if (parts.length !== 3) {\n return null;\n }\n const [day, month, year] = parts.map(Number);\n if (\n isNaN(day) ||\n isNaN(month) ||\n isNaN(year) ||\n day < 1 ||\n day > 31 ||\n month < 1 ||\n month > 12 ||\n year < 1\n ) {\n return null;\n }\n return new Date(year, month - 1, day);\n }\n\n formatDate(date: Date): string {\n const day = String(date.getDate()).padStart(2, '0');\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const year = date.getFullYear();\n return `${day}/${month}/${year}`;\n }\n\n getDayShortHand(date: Date): string {\n return date.toLocaleString('en-US', { weekday: 'short' });\n }\n\n generateDates(fD: DayInfo, lD: DayInfo, uC: number): MonthDays {\n const startDate = this.parseDate(fD?.gD);\n const endDate = this.parseDate(lD?.gD);\n const daysInMonth: MonthDays = [];\n let currentGregorianDate = new Date(startDate);\n let currentUmmAlQuraDay = parseInt(fD?.uD?.split('/')[0]);\n let currentUmmAlQuraMonth = parseInt(fD?.uD?.split('/')[1]);\n let currentUmmAlQuraYear = parseInt(fD?.uD?.split('/')[2]);\n let daysInCurrentUmmAlQuraMonth = uC;\n while (currentGregorianDate <= endDate) {\n const ummAlQuraDate = `${currentUmmAlQuraDay\n .toString()\n .padStart(2, '0')}/${currentUmmAlQuraMonth\n .toString()\n .padStart(2, '0')}/${currentUmmAlQuraYear}`;\n daysInMonth.push({\n gD: this.formatDate(currentGregorianDate),\n uD: ummAlQuraDate,\n dN: this.getDayShortHand(currentGregorianDate),\n uC: 0,\n });\n currentGregorianDate.setDate(currentGregorianDate.getDate() + 1);\n currentUmmAlQuraDay += 1;\n if (currentUmmAlQuraDay > daysInCurrentUmmAlQuraMonth) {\n currentUmmAlQuraDay = 1;\n currentUmmAlQuraMonth += 1;\n if (currentUmmAlQuraMonth > 12) {\n currentUmmAlQuraMonth = 1;\n currentUmmAlQuraYear += 1;\n }\n const nextMonthData =\n this.calendarData[currentUmmAlQuraYear.toString()]?.[\n currentUmmAlQuraMonth.toString()\n ];\n daysInCurrentUmmAlQuraMonth = nextMonthData ? nextMonthData.fD.uC : 30;\n }\n }\n return daysInMonth;\n }\n\n convertDate(dateStr: string, isGregorian: boolean): DayInfo | null {\n if (!dateStr) return null;\n\n if (isGregorian) {\n // Preprocess Gregorian date\n const gregorianDate = this.parseDate(dateStr);\n if (!gregorianDate) return null;\n const formattedDate = this.formatDate(gregorianDate);\n\n for (const yearKey in this.calendarData) {\n for (const monthKey in this.calendarData[yearKey]) {\n const monthData = this.calendarData[yearKey][monthKey];\n\n if (\n this.isDateInMonthRange(\n formattedDate,\n monthData.fD?.gD,\n monthData.lD?.gD\n )\n ) {\n const daysInMonth = this.generateDates(\n monthData.fD,\n monthData.lD,\n monthData.fD?.uC\n );\n\n const dayMatch = daysInMonth.find((d) => d.gD === formattedDate);\n if (dayMatch) return dayMatch;\n }\n }\n }\n } else {\n const [day, month, year] = dateStr.split('/').map(Number);\n\n if (isNaN(day) || isNaN(month) || isNaN(year)) return null;\n\n for (const yearKey in this.calendarData) {\n for (const monthKey in this.calendarData[yearKey]) {\n const monthData = this.calendarData[yearKey][monthKey];\n\n if (\n this.isDateInMonthRange(\n `${day}/${month}/${year}`,\n monthData.fD?.uD,\n monthData.lD?.uD\n )\n ) {\n const daysInMonth = this.generateDates(\n monthData.fD,\n monthData.lD,\n monthData.fD?.uC\n );\n\n const dayMatch = daysInMonth.find((d) => {\n const [uDay, uMonth, uYear] = d?.uD?.split('/').map(Number);\n return uDay === day && uMonth === month && uYear === year;\n });\n\n if (dayMatch) return dayMatch;\n }\n }\n }\n }\n\n return null;\n }\n\n private isDateInMonthRange(\n dateToCheck: string,\n monthStartDate: string | undefined,\n monthEndDate: string | undefined\n ): boolean {\n if (!monthStartDate || !monthEndDate) return false;\n\n const checkDate = this.parseDate(dateToCheck);\n const startDate = this.parseDate(monthStartDate);\n const endDate = this.parseDate(monthEndDate);\n\n if (!checkDate || !startDate || !endDate) return false;\n\n return checkDate >= startDate && checkDate <= endDate;\n }\n\n getMonthData(inputDate: string, type: string): DayInfo[] | null {\n const [day, month, year] = inputDate?.split('/').map(Number);\n let isGregorian: boolean;\n if (type == 'greg') {\n isGregorian = true;\n } else {\n isGregorian = false;\n }\n if (isGregorian) {\n return this.getGregorianMonthData(day, month, year);\n } else {\n return this.getUmAlQurraMonthData(day, month, year);\n }\n }\n\n getGregorianMonthData(\n day: number,\n month: number,\n year: number\n ): DayInfo[] | null {\n const yearData = this.calendarData[year];\n if (!yearData) return null;\n const monthData = yearData[month];\n if (!monthData) return null;\n const monthArray: DayInfo[] = [];\n const endDate = new Date(year, month, 0);\n for (let d = 1; d <= endDate.getDate(); d++) {\n const offset = d - 1;\n\n monthArray.push({\n gD: `${d.toString().padStart(2, '0')}/${month\n .toString()\n .padStart(2, '0')}/${year}`,\n uD: this.calculateUmAlQurraDate(\n monthData.fD.uD,\n offset,\n monthData.fD.uC\n ),\n dN: this.getDayName(new Date(year, month - 1, d).getDay()),\n uC: monthData.fD.uC,\n });\n }\n\n return monthArray;\n }\n\n getUmAlQurraMonthData(\n day: number,\n month: number,\n year: number\n ): DayInfo[] | null {\n for (const gregorianYear in this.calendarData) {\n const yearData = this.calendarData[parseInt(gregorianYear)];\n\n for (const monthIndex in yearData) {\n const monthData = yearData[parseInt(monthIndex)];\n const [fDay, fMonth, fYear] = monthData?.fD?.uD?.split('/').map(Number);\n\n if (fYear === year && fMonth === month) {\n const totalDays = monthData.fD.uC;\n const monthArray: DayInfo[] = [];\n const umAlQurraStartDate = `01/${month\n .toString()\n .padStart(2, '0')}/${year}`;\n const dayDifference = fDay - 1;\n\n const startGregorianDate = this.calculateGregorianDate(\n monthData.fD.gD,\n -dayDifference\n );\n\n for (let i = 0; i < totalDays; i++) {\n const uDate = this.calculateUmAlQurraDate(\n umAlQurraStartDate,\n i,\n totalDays\n );\n const gDate = this.calculateGregorianDate(startGregorianDate, i);\n const [gDay, gMonth, gYear] = gDate?.split('/').map(Number);\n const dayName = this.getDayName(\n new Date(gYear, gMonth - 1, gDay).getDay()\n );\n\n monthArray.push({\n gD: gDate,\n uD: uDate,\n dN: dayName,\n uC: totalDays,\n });\n }\n\n return monthArray;\n }\n }\n }\n\n return null;\n }\n\n calculateGregorianDate(startGDate: string, offset: number): string {\n const [day, month, year] = startGDate?.split('/').map(Number);\n const newDate = new Date(year, month - 1, day + offset);\n\n return `${newDate.getDate().toString().padStart(2, '0')}/${(\n newDate.getMonth() + 1\n )\n .toString()\n .padStart(2, '0')}/${newDate.getFullYear()}`;\n }\n\n calculateUmAlQurraDate(\n startUDate: string,\n offset: number,\n uC: number\n ): string {\n const [day, month, year] = startUDate?.split('/').map(Number);\n\n let newDay = day + offset;\n let newMonth = month;\n let newYear = year;\n\n while (newDay > uC) {\n newDay -= uC;\n newMonth += 1;\n }\n\n while (newMonth > 12) {\n newMonth = 1;\n newYear += 1;\n }\n\n return `${newDay.toString().padStart(2, '0')}/${newMonth\n .toString()\n .padStart(2, '0')}/${newYear}`;\n }\n\n getDayName(dayIndex: number): string {\n const days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n return days[dayIndex];\n }\n\n /// Check date is it in past or future\n checkPastOrFuture(inputDate: any, targetDate: any) {\n if (inputDate) {\n const [day, month, year] = inputDate?.split('/').map(Number);\n const dateToCheck = new Date(year, month - 1, day);\n const today = targetDate;\n today.setHours(0, 0, 0, 0);\n if (dateToCheck > today) {\n return 'Future';\n } else if (dateToCheck < today) {\n return 'Past';\n } else {\n return 'Today';\n }\n }\n }\n\n /// Convert english numbers to arabic equivalent\n parseEnglish(englishNum: any) {\n if (!englishNum) return englishNum;\n const numStr = String(englishNum);\n const arabicNumbers = [\n '\\u0660',\n '\\u0661',\n '\\u0662',\n '\\u0663',\n '\\u0664',\n '\\u0665',\n '\\u0666',\n '\\u0667',\n '\\u0668',\n '\\u0669',\n ];\n return numStr.replace(/[0-9]/g, (digit) => {\n return arabicNumbers[Number(digit)] || digit;\n });\n }\n\n /// Convert arabic numbers to english equivalent\n parseArabic(arabicNum: any) {\n return arabicNum.replace(/[٠١٢٣٤٥٦٧٨٩]/g, function (d: string) {\n return d.charCodeAt(0) - 1632;\n });\n }\n\n ///\n convertDateNumerals(date: string, targetLang: 'en' | 'ar'): string {\n const arabicNumbers = ['٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩'];\n const englishNumbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];\n\n const toArabic = (value: string) =>\n value\n .split('')\n .map((char) => (/\\d/.test(char) ? arabicNumbers[+char] : char))\n .join('');\n\n const toEnglish = (value: string) =>\n value\n .split('')\n .map((char) => {\n const index = arabicNumbers.indexOf(char);\n return index > -1 ? englishNumbers[index] : char;\n })\n .join('');\n\n if (targetLang === 'ar') {\n const [day, month, year] = date.split('/');\n return `${toArabic(year)}/${toArabic(month)}/${toArabic(day)}`;\n } else {\n const [year, month, day] = date.split('/');\n return `${toEnglish(day)}/${toEnglish(month)}/${toEnglish(year)}`;\n }\n }\n\n /**\n * Normalize input date to DD/MM/YYYY string format (Gregorian)\n * Accepts Date object or DD/MM/YYYY string\n */\n normalizeDateToString(date: Date | string | undefined): string | null {\n if (!date) return null;\n\n if (date instanceof Date) {\n return this.formatDate(date);\n }\n\n // Already a string - validate format\n const parsed = this.parseDate(date);\n return parsed ? this.formatDate(parsed) : null;\n }\n\n /**\n * Compare two dates (Gregorian format DD/MM/YYYY)\n * Returns: -1 if date1 < date2, 0 if equal, 1 if date1 > date2\n */\n compareDates(date1Str: string, date2Str: string): number {\n const d1 = this.parseDate(date1Str);\n const d2 = this.parseDate(date2Str);\n\n if (!d1 || !d2) return 0;\n\n if (d1 < d2) return -1;\n if (d1 > d2) return 1;\n return 0;\n }\n\n /**\n * Compare two Hijri dates (UM format DD/MM/YYYY)\n * Converts to Gregorian for comparison\n */\n compareHijriDates(hijri1: string, hijri2: string): number {\n const day1 = this.convertDate(hijri1, false);\n const day2 = this.convertDate(hijri2, false);\n\n if (!day1?.gD || !day2?.gD) return 0;\n\n return this.compareDates(day1.gD, day2.gD);\n }\n\n /**\n * Check if a date is within the specified range (inclusive)\n * All dates in Gregorian DD/MM/YYYY format\n */\n isDateInRange(\n dateStr: string,\n minDateStr: string | null,\n maxDateStr: string | null\n ): boolean {\n if (!dateStr) return false;\n\n // If no constraints, date is valid\n if (!minDateStr && !maxDateStr) return true;\n\n // Check minimum constraint\n if (minDateStr && this.compareDates(dateStr, minDateStr) < 0) {\n return false;\n }\n\n // Check maximum constraint\n if (maxDateStr && this.compareDates(dateStr, maxDateStr) > 0) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Check if a Hijri date is within the specified range\n * Converts to Gregorian for comparison\n */\n isHijriDateInRange(\n hijriDateStr: string,\n minDateStr: string | null,\n maxDateStr: string | null\n ): boolean {\n if (!hijriDateStr) return false;\n\n const dayInfo = this.convertDate(hijriDateStr, false);\n if (!dayInfo?.gD) return false;\n\n return this.isDateInRange(dayInfo.gD, minDateStr, maxDateStr);\n }\n}\n","import {\n Component,\n Input,\n OnInit,\n Output,\n EventEmitter,\n HostBinding,\n OnChanges,\n SimpleChanges,\n AfterViewInit,\n} from '@angular/core';\nimport { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';\nimport { stylesConfig } from '../_interfaces/styles-config.model';\nimport { DateUtilitiesService } from '../_services/date-utilities.service';\nimport { TodayDate, DayInfo } from '../_interfaces/calendar-model';\nimport * as themesConfig from '../themes/themes.json';\n@Component({\n selector: 'hijri-gregorian-datepicker',\n templateUrl: './hijri-gregorian-datepicker.component.html',\n styleUrls: ['./hijri-gregorian-datepicker.component.scss'],\n})\nexport class HijriGregorianDatepickerComponent implements OnInit, OnChanges, AfterViewInit {\n /// Inputs\n @Input() markToday: boolean = true;\n @Input() canChangeMode: boolean = true;\n @Input() todaysDateSection: boolean = true;\n @Input() futureValidation: boolean = true;\n @Input() disableYearPicker: boolean = false;\n @Input() disableMonthPicker: boolean = false;\n @Input() disableDayPicker: boolean = false;\n @Input() multiple: boolean = false;\n @Input() isRequired: boolean = false;\n @Input() showConfirmButton: boolean = true;\n @Input() futureValidationMessage: boolean = false;\n @Input() arabicLayout: boolean = false;\n @Input() mode: string = 'greg';\n @Input() dir: string = 'ltr';\n @Input() locale: string = 'en';\n @Input() submitTextButton: string = 'Confirm';\n @Input() todaysDateText: string = \"Today's Date\";\n @Input() ummAlQuraDateText: string = 'Hijri Date';\n @Input() monthSelectLabel: string = 'Month';\n @Input() yearSelectLabel: string = 'Year';\n @Input() futureValidationMessageEn: string;\n @Input() futureValidationMessageAr: string;\n @Input() theme?: string = '';\n @Input() pastYearsLimit: number = 90;\n @Input() futureYearsLimit: number = 0;\n @Input() styles?: stylesConfig = {};\n\n // New inputs for extended functionality\n @Input() enableTime: boolean = false; // Enable time picker (hours & minutes)\n @Input() minDate?: Date | string; // Minimum allowed date (Gregorian Date or DD/MM/YYYY string)\n @Input() maxDate?: Date | string; // Maximum allowed date (Gregorian Date or DD/MM/YYYY string)\n @Input() initialDate?: Date | string; // Initial date to navigate to when picker opens\n \n // Range selection initial dates\n @Input() initialRangeStart?: Date | string; // Initial start date for range selection\n @Input() initialRangeEnd?: Date | string; // Initial end date for range selection\n \n // BACKWARD COMPATIBILITY: Default to false (24-hour format)\n // When true, displays 12-hour format with AM/PM toggle\n @Input() useMeridian: boolean = false; // Enable 12-hour format with AM/PM\n \n // BACKWARD COMPATIBILITY: Default to 'single' (existing behavior)\n // 'range' enables range selection mode (first click = start, second click = end)\n @Input() selectionMode: 'single' | 'range' = 'single';\n /// Outputs\n @Output() onSubmit = new EventEmitter<object>();\n @Output() onDaySelect = new EventEmitter<object>();\n @Output() onMonthChange = new EventEmitter<object>();\n @Output() onYearChange = new EventEmitter<object>();\n /// Variables\n ummAlQuraMonths = [\n { labelAr: 'محرم', labelEn: 'Muharram', value: 1 },\n { labelAr: 'صفر', labelEn: 'Safar', value: 2 },\n { labelAr: 'ربيع الأول', labelEn: 'Rabi al-Awwal', value: 3 },\n { labelAr: 'ربيع الثاني', labelEn: 'Rabi al-Thani', value: 4 },\n { labelAr: 'جمادى الأولى', labelEn: 'Jumada al-Awwal', value: 5 },\n { labelAr: 'جمادى الآخرة', labelEn: 'Jumada al-Thani', value: 6 },\n { labelAr: 'رجب', labelEn: 'Rajab', value: 7 },\n { labelAr: 'شعبان', labelEn: 'Shaban', value: 8 },\n { labelAr: 'رمضان', labelEn: 'Ramadan', value: 9 },\n { labelAr: 'شوال', labelEn: 'Shawwal', value: 10 },\n { labelAr: 'ذو القعدة', labelEn: 'Dhu al-Qadah', value: 11 },\n { labelAr: 'ذو الحجة', labelEn: 'Dhu al-Hijjah', value: 12 },\n ];\n gregMonths = [\n { labelAr: 'يناير', labelEn: 'January', value: 1 },\n { labelAr: 'فبراير', labelEn: 'February', value: 2 },\n { labelAr: 'مارس', labelEn: 'March', value: 3 },\n { labelAr: 'ابريل', labelEn: 'April', value: 4 },\n { labelAr: 'مايو', labelEn: 'May', value: 5 },\n { labelAr: 'يونيو', labelEn: 'June', value: 6 },\n { labelAr: 'يوليو', labelEn: 'July', value: 7 },\n { labelAr: 'اغسطس', labelEn: 'August', value: 8 },\n { labelAr: 'سبتمبر', labelEn: 'September', value: 9 },\n { labelAr: 'اكتوبر', labelEn: 'October', value: 10 },\n { labelAr: 'نوفمبر', labelEn: 'November', value: 11 },\n { labelAr: 'ديسمبر', labelEn: 'December', value: 12 },\n ];\n ummAlQuraYear: number;\n gregYear: number;\n years: any[];\n weeks: any[];\n months: any[];\n weekdaysEn = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n weekdaysAr = ['سبت', 'جمعة', 'خميس', 'أربعاء', 'ثلاثاء', 'اثنين', 'أحد'];\n // weekdaysAr = ['س', 'ج', 'خ', 'أر', 'ث', 'إث', 'أح'];\n todaysDate: TodayDate = {};\n selectedDay: DayInfo;\n periodForm: UntypedFormGroup;\n multipleSelectedDates = [] as DayInfo[];\n themes = [] as any;\n\n // Time picker variables\n // BACKWARD COMPATIBILITY: selectedTime defaults to 0:0 to preserve existing behavior when enableTime=false\n // When enableTime=true, this will be initialized to current system time in ngOnInit\n selectedTime: { hour: number; minute: number } = { hour: 0, minute: 0 };\n \n // Track if time has been initialized to avoid re-initializing at midnight\n private timeInitialized: boolean = false;\n \n // BACKWARD COMPATIBILITY: Meridian only used when useMeridian=true\n // Tracks AM/PM state for 12-hour format\n meridian: 'AM' | 'PM' = 'AM';\n \n // Range selection state\n // BACKWARD COMPATIBILITY: These are only used when selectionMode='range'\n // They do not affect single or multiple selection modes\n rangeStart?: DayInfo = undefined;\n rangeEnd?: DayInfo = undefined;\n\n @HostBinding('style.font-family') fontFamilyStyle: string;\n constructor(\n public formBuilder: UntypedFormBuilder,\n public _dateUtilsService: DateUtilitiesService\n ) {}\n\n ngOnInit(): void {\n this.initTheme();\n this.initializeForm();\n this.getTodaysDateInfo();\n this.initializeYearsAndMonths();\n\n // Initialize time from current system time or initialDate\n // BACKWARD COMPATIBILITY: This only runs when enableTime=true\n if (this.enableTime) {\n this.initializeTime();\n }\n }\n\n ngAfterViewInit(): void {\n // Double-check time initialization after view is ready\n // This handles cases where enableTime might be set after ngOnInit\n if (this.enableTime && !this.timeInitialized) {\n this.initializeTime();\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (!changes['mode'].isFirstChange()) {\n this.changeCalendarMode();\n }\n }\n\n initTheme() {\n if (this.theme != '') {\n this.themes = themesConfig;\n for (const themeItem of this.themes['default']) {\n if (themeItem.name == this.theme) {\n this.styles = themeItem.stylesConfig;\n break;\n }\n }\n }\n this.fontFamilyStyle = this.styles.fontFamily;\n }\n\n /// Initialize form control for month and year select\n initializeForm() {\n this.periodForm = this.formBuilder.group({\n year: [{ value: '', disabled: this.disableYearPicker }, []],\n month: [{ value: '', disabled: this.disableMonthPicker }, []],\n });\n }\n\n // Initialize years and months for calendar\n initializeYearsAndMonths() {\n this.years = [];\n this.months = [];\n\n // Determine the date to use for initialization (initialDate or today)\n let referenceDate: string;\n if (this.initialDate) {\n const normalizedInitialDate =\n this._dateUtilsService.normalizeDateToString(this.initialDate);\n if (normalizedInitialDate) {\n if (this.mode == 'greg') {\n referenceDate = normalizedInitialDate;\n } else {\n const hijriDate = this._dateUtilsService.convertDate(\n normalizedInitialDate,\n true\n );\n referenceDate = hijriDate?.uD || this.todaysDate.ummAlQura;\n }\n } else {\n referenceDate =\n this.mode == 'greg'\n ? this.todaysDate.gregorian\n : this.todaysDate.ummAlQura;\n }\n } else {\n referenceDate =\n this.mode == 'greg'\n ? this.todaysDate.gregorian\n : this.todaysDate.ummAlQura;\n }\n\n if (this.mode == 'greg') {\n this.gregYear =\n this.futureYearsLimit == 0\n ? Number(referenceDate?.split('/')[2])\n : Number(referenceDate?.split('/')[2]) + this.futureYearsLimit;\n for (let i = 0; i < this.gregYear; i++) {\n if (i < this.pastYearsLimit) {\n let val = this.gregYear--;\n this.years.push(val);\n } else {\n break;\n }\n }\n this.months = this.gregMonths;\n } else {\n this.ummAlQuraYear =\n this.futureYearsLimit == 0\n ? Number(referenceDate?.split('/')[2])\n : Number(referenceDate?.split('/')[2]) + this.futureYearsLimit;\n for (let i = 0; i < this.ummAlQuraYear; i++) {\n if (i < this.pastYearsLimit) {\n let val = this.ummAlQuraYear--;\n this.years.push(val);\n } else {\n break;\n }\n }\n this.months = this.ummAlQuraMonths;\n }\n this.years.map((year: any) => {\n if (year == referenceDate?.split('/')[2]) {\n this.periodForm.controls['year'].setValue(year);\n }\n });\n this.months.map((month: any) => {\n if (month.value == referenceDate?.split('/')[1]) {\n this.periodForm.controls['month'].setValue(month.value);\n }\n });\n }\n\n /// On change event of years and months\n onPeriodChange(type: string) {\n if (type == 'year') {\n this.onYearChange.emit(this.periodForm.controls['year'].value);\n } else {\n this.onMonthChange.emit(this.periodForm.controls['month'].value);\n }\n const days = this._dateUtilsService.getMonthData(\n '01/' +\n this.periodForm.controls['month'].value +\n '/' +\n this.periodForm.controls['year'].value,\n this.mode\n );\n this.weeks = this.generateWeeksArray(days);\n }\n\n /// Get todays(greg and umm al qura) date info\n getTodaysDateInfo() {\n this.todaysDate.gregorian = this._dateUtilsService.formatDate(new Date());\n this.todaysDate.ummAlQura = this._dateUtilsService.convertDate(\n this.todaysDate.gregorian,\n true\n )?.uD;\n\n // Use initialDate if provided, otherwise use today's date\n let dateToNavigate: string;\n\n if (this.initialDate) {\n // Normalize initialDate to DD/MM/YYYY format\n const normalizedInitialDate =\n this._dateUtilsService.normalizeDateToString(this.initialDate);\n\n if (normalizedInitialDate) {\n if (this.mode == 'greg') {\n dateToNavigate = normalizedInitialDate;\n } else {\n // Convert to Hijri for ummAlQura mode\n const hijriDate = this._dateUtilsService.convertDate(\n normalizedInitialDate,\n true\n );\n dateToNavigate = hijriDate?.uD || this.todaysDate.ummAlQura;\n }\n } else {\n // Invalid initialDate, fall back to today\n dateToNavigate =\n this.mode == 'greg'\n ? this.todaysDate.gregorian\n : this.todaysDate.ummAlQura;\n }\n } else {\n // No initialDate provided, use today\n dateToNavigate =\n this.mode == 'greg'\n ? this.todaysDate.gregorian\n : this.todaysDate.ummAlQura;\n }\n\n this.generatetMonthData(dateToNavigate);\n \n // Highlight initialDate or initialRange if provided\n if (this.selectionMode === 'range' && (this.initialRangeStart || this.initialRangeEnd)) {\n this.highlightInitialRange();\n } else if (this.initialDate) {\n this.highlightInitialDate();\n }\n }\n\n /// Generate month days from JSON\n generatetMonthData(date: string) {\n const days = this._dateUtilsService.getMonthData(date, this.mode);\n this.weeks = this.generateWeeksArray(days);\n }\n\n /// Highlight initialDate on the calendar\n private highlightInitialDate() {\n if (!this.initialDate) {\n return;\n }\n\n const normalizedInitialDate =\n this._dateUtilsService.normalizeDateToString(this.initialDate);\n\n if (!normalizedInitialDate) {\n return;\n }\n\n // Find the day in the weeks array that matches initialDate\n for (const week of this.weeks) {\n for (const day of week) {\n if (day && day.gD === normalizedInitialDate) {\n // Don't select if date is disabled\n if (!this.isDateDisabled(day)) {\n // Mark as selected without triggering events\n day.selected = true;\n \n // Set as selectedDay based on selection mode\n if (this.selectionMode === 'range') {\n this.rangeStart = day;\n } else if (this.multiple) {\n this.multipleSelectedDates = [day];\n } else {\n this.selectedDay = day;\n }\n \n // Initialize time if enableTime is active\n if (this.enableTime && !this.timeInitialized) {\n this.initializeTime();\n }\n \n // Attach time to the day if it's a Date object with time\n if (this.enableTime && this.initialDate instanceof Date) {\n day.time = {\n hour: this.initialDate.getHours(),\n minute: this.initialDate.getMinutes()\n };\n }\n }\n return;\n }\n }\n }\n }\n\n /// Highlight initial range (start and end dates) on the calendar\n private highlightInitialRange() {\n if (!this.initialRangeStart && !this.initialRangeEnd) {\n return;\n }\n\n const normalizedStartDate = this.initialRangeStart\n ? this._dateUtilsService.normalizeDateToString(this.initialRangeStart)\n : null;\n const normalizedEndDate = this.initialRangeEnd\n ? this._dateUtilsService.normalizeDateToString(this.initialRangeEnd)\n : null;\n\n let startDay: DayInfo | null = null;\n let endDay: DayInfo | null = null;\n\n // Find both start and end dates in the weeks array\n for (const week of this.weeks) {\n for (const day of week) {\n if (day && normalizedStartDate && day.gD === normalizedStartDate) {\n if (!this.isDateDisabled(day)) {\n startDay = day;\n }\n }\n if (day && normalizedEndDate && day.gD === normalizedEndDate) {\n if (!this.isDateDisabled(day)) {\n endDay = day;\n }\n }\n }\n }\n\n // Set range start\n if (startDay) {\n startDay.selected = true;\n this.rangeStart = startDay;\n this.selectedDay = startDay;\n \n // Initialize and attach time to start date\n if (this.enableTime) {\n if (!this.timeInitialized) {\n this.initializeTime();\n }\n if (this.initialRangeStart instanceof Date) {\n startDay.time = {\n hour: this.initialRangeStart.getHours(),\n minute: this.initialRangeStart.getMinutes()\n };\n } else {\n startDay.time = { ...this.selectedTime };\n }\n }\n }\n\n // Set range end if provided\n if (endDay && startDay) {\n // Swap if end is before start\n const startDate = this.parseDateString(startDay.gD);\n const endDate = this.parseDateString(endDay.gD);\n \n if (endDate && startDate && endDate < startDate) {\n // Swap\n this.rangeEnd = startDay;\n this.rangeStart = endDay;\n endDay.selected = true;\n } else {\n this.rangeEnd = endDay;\n }\n \n // Attach time to end date (inherit from start)\n if (this.enableTime) {\n const timeToUse = this.rangeStart.time || { ...this.selectedTime };\n if (this.initialRangeEnd instanceof Date) {\n this.rangeEnd.time = {\n hour: this.initialRangeEnd.getHours(),\n minute: this.initialRangeEnd.getMinutes()\n };\n } else {\n this.rangeEnd.time = { ...timeToUse };\n }\n // Ensure start also has time\n this.rangeStart.time = { ...timeToUse };\n }\n \n // Highlight the range\n this.highlightRange();\n this.selectedDay = this.rangeEnd;\n }\n }\n\n /// Generate month weeks\n generateWeeksArray(daysArray: any) {\n const firstDayName = daysArray[0]?.dN;\n const startIndex = this.weekdaysEn.indexOf(firstDayName);\n const weeks = [[]] as any;\n let currentWeek = 0;\n let currentDayIndex = startIndex;\n\n daysArray?.forEach((day: any) => {\n if (!weeks[currentWeek]) {\n weeks[currentWeek] = [];\n }\n\n weeks[currentWeek][currentDayIndex] = day;\n currentDayIndex++;\n\n if (currentDayIndex === 7) {\n currentDayIndex = 0;\n currentWeek++;\n }\n });\n weeks.forEach((week: any) => {\n while (week.length < 7) {\n week.push({});\n }\n });\n return weeks;\n }\n\n /// Change calendar mode 'greg' or 'ummAlQura'\n changeCalendarMode() {\n this.mode = this.mode == 'greg' ? 'ummAlQura' : 'greg';\n this.initializeYearsAndMonths();\n this.generatetMonthData(\n '01/' +\n this.periodForm.controls['month'].value +\n '/' +\n this.periodForm.controls['year'].value\n );\n }\n\n /// On day clicked handler\n onDayClicked(day: DayInfo) {\n if (day && day?.gD) {\n // Check if day is disabled by min/max constraints\n if (this.isDateDisabled(day)) {\n return; // Don't allow selection of disabled dates\n }\n\n if (this.futureValidation) {\n if (this.checkFutureValidation(day)) {\n this.futureValidationMessage = true;\n } else {\n this.futureValidationMessage = false;\n this.markDaySelected(day);\n }\n } else {\n this.markDaySelected(day);\n }\n }\n }\n\n /// Mark day as selected\n markDaySelected(dayInfo: DayInfo) {\n // BACKWARD COMPATIBILITY: Range selection only when selectionMode='range'\n if (this.selectionMode === 'range') {\n this.handleRangeSelection(dayInfo);\n return;\n }\n \n // BACKWARD COMPATIBILITY: Original behavior for single/multiple selection\n if (dayInfo.selected) {\n dayInfo.selected = false;\n this.multipleSelectedDates = this.multipleSelectedDates.filter(\n (day) => day !== dayInfo\n );\n if (!this.multiple) {\n this.selectedDay = undefined;\n }\n } else {\n if (!this.multiple) {\n this.weeks.forEach((week: any) => {\n week.forEach((day: DayInfo) => {\n day.selected = false;\n });\n });\n\n dayInfo.selected = true;\n this.selectedDay = dayInfo;\n this.multipleSelectedDates = [dayInfo];\n\n // Attach current time if enableTime is active\n if (this.enableTime) {\n // Ensure time is initialized before attaching\n if (!this.timeInitialized) {\n this.initializeTime();\n }\n dayInfo.time = { ...this.selectedTime };\n }\n\n this.onDaySelect.emit(dayInfo);\n } else {\n dayInfo.selected = true;\n\n // Attach current time if enableTime is active\n if (this.enableTime) {\n // Ensure time is initialized before attaching\n if (!this.timeInitialized) {\n this.initializeTime();\n }\n dayInfo.time = { ...this.selectedTime };\n }\n\n this.onDaySelect.emit(dayInfo);\n if (!this.multipleSelectedDates.includes(dayInfo)) {\n this.multipleSelectedDates.push(dayInfo);\n }\n }\n }\n }\n\n /**\n * Handle range selection logic\n * BACKWARD COMPATIBILITY: Only called when selectionMode='range'\n * \n * Range selection lifecycle:\n * 1. First click → Sets rangeStart\n * 2. Second click → Sets rangeEnd, highlights range\n * 3. Third click → Resets range, starts new selection\n */\n private handleRangeSelection(dayInfo: DayInfo): void {\n // First click or resetting range\n if (!this.rangeStart || (this.rangeStart && this.rangeEnd)) {\n this.resetRange();\n this.rangeStart = dayInfo;\n dayInfo.selected = true;\n this.selectedDay = dayInfo;\n \n // Attach current time if enableTime is active\n if (this.enableTime) {\n // Ensure selectedTime is initialized\n // If time hasn't been initialized yet, initialize it now\n if (!this.timeInitialized) {\n this.initializeTime();\n }\n dayInfo.time = { ...this.selectedTime };\n }\n \n this.onDaySelect.emit({ start: dayInfo, end: null });\n }\n // Second click - complete the range\n else if (this.rangeStart && !this.rangeEnd) {\n const startDate = this.parseDateString(this.rangeStart.gD);\n const endDate = this.parseDateString(dayInfo.gD);\n \n // Swap if end is before start\n if (endDate && startDate && endDate < startDate) {\n this.rangeEnd = this.rangeStart;\n this.rangeStart = dayInfo;\n } else {\n this.rangeEnd = dayInfo;\n }\n \n // Attach time if enableTime is active\n // IMPORTANT: Range end inherits time from range start (not current selectedTime)\n if (this.enableTime) {\n // Use rangeStart's time if it exists, otherwise use current selectedTime\n const timeToUse = this.rangeStart.time || { ...this.selectedTime };\n this.rangeStart.time = { ...timeToUse };\n this.rangeEnd.time = { ...timeToUse };\n }\n \n this.highlightRange();\n this.selectedDay = this.rangeEnd;\n \n this.onDaySelect.emit({ start: this.rangeStart, end: this.rangeEnd });\n }\n }\n\n /// On confirm button clicked\n onConfirmClicked() {\n // BACKWARD COMPATIBILITY: Range selection output when selectionMode='range'\n if (this.selectionMode === 'range') {\n if (this.rangeStart && this.rangeEnd) {\n // Collect all dates in range\n const rangeDates: DayInfo[] = [];\n this.weeks.forEach((week: any) => {\n week.forEach((day: DayInfo) => {\n if (day && day.gD && (this.isInRange(day) || this.isRangeStart(day) || this.isRangeEnd(day))) {\n // Attach current time if enableTime is active\n if (this.enableTime && !day.time) {\n day.time = { ...this.selectedTime };\n }\n rangeDates.push(day);\n }\n });\n });\n \n this.onSubmit.emit({ \n start: this.rangeStart, \n end: this.rangeEnd,\n dates: rangeDates \n });\n } else {\n // Incomplete range\n this.onSubmit.emit({ start: this.rangeStart, end: null, dates: [] });\n }\n return;\n }\n \n // BACKWARD COMPATIBILITY: Original behavior for multiple/single selection\n if (this.multiple) {\n // For multiple dates, attach time to each if enableTime is active\n if (this.enableTime) {\n this.multipleSelectedDates.forEach((day) => {\n if (!day.time) {\n day.time = { ...this.selectedTime };\n }\n });\n }\n this.onSubmit.emit(this.multipleSelectedDates);\n } else {\n // For single date, attach time if enableTime is active\n if (this.enableTime && this.selectedDay) {\n this.selectedDay.time = { ...this.selectedTime };\n }\n this.onSubmit.emit(this.selectedDay);\n }\n }\n\n /// Check if date from future\n checkFutureValidation(day: DayInfo) {\n if (\n this._dateUtilsService.checkPastOrFuture(day?.gD, new Date()) == 'Future'\n ) {\n return true;\n }\n }\n\n /// Check if passed day is today or not\n checkTodaysDate(day: DayInfo) {\n return (\n this.todaysDate?.gregorian == day?.gD ||\n this.todaysDate?.ummAlQura == day?.uD\n );\n }\n\n /**\n * Check if a day is disabled based on min/max date constraints\n * Works for both Gregorian and Hijri modes\n */\n isDateDisabled(day: DayInfo): boolean {\n if (!day || !day.gD) return true;\n\n // Normalize min/max dates to Gregorian DD/MM/YYYY format\n const minDateStr = this.minDate\n ? this._dateUtilsService.normalizeDateToString(this.minDate)\n : null;\n const maxDateStr = this.maxDate\n ? this._dateUtilsService.normalizeDateToString(this.maxDate)\n : null;\n\n // Check if the day's Gregorian date is within range\n return !this._dateUtilsService.isDateInRange(\n day.gD,\n minDateStr,\n maxDateStr\n );\n }\n\n /**\n * Initialize time from current system time or initialDate\n * BACKWARD COMPATIBILITY: Only called when enableTime=true\n *\n * Priority:\n * 1. If initialDate has time, use that\n * 2. If selectedDay has time, use that\n * 3. Otherwise, use current system time\n */\n initializeTime(): void {\n let timeSet = false;\n\n // Check if initialDate has time information\n if (this.initialDate && this.initialDate instanceof Date) {\n this.selectedTime = {\n hour: this.initialDate.getHours(),\n minute: this.initialDate.getMinutes(),\n };\n timeSet = true;\n }\n\n // If no time from initialDate, use current system time\n if (!timeSet) {\n const now = new Date();\n this.selectedTime = {\n hour: now.getHours(),\n minute: now.getMinutes(),\n };\n }\n \n // Mark that time has been initialized\n this.timeInitialized = true;\n \n // BACKWARD COMPATIBILITY: Only set meridian when useMeridian=true\n if (this.useMeridian) {\n this.meridian = this.selectedTime.hour >= 12 ? 'PM' : 'AM';\n }\n }\n\n /**\n * Increment hour value with wraparound (0-23)\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\n */\n incrementHour(): void {\n this.selectedTime.hour = (this.selectedTime.hour + 1) % 24;\n this.updateSelectedDayTime();\n }\n\n /**\n * Decrement hour value with wraparound (0-23)\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\n */\n decrementHour(): void {\n this.selectedTime.hour = (this.selectedTime.hour - 1 + 24) % 24;\n this.updateSelectedDayTime();\n }\n\n /**\n * Increment minute value with wraparound (0-59)\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\n */\n incrementMinute(): void {\n this.selectedTime.minute = (this.selectedTime.minute + 1) % 60;\n this.updateSelectedDayTime();\n }\n\n /**\n * Decrement minute value with wraparound (0-59)\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\n */\n decrementMinute(): void {\n this.selectedTime.minute = (this.selectedTime.minute - 1 + 60) % 60;\n this.updateSelectedDayTime();\n }\n\n /**\n * Handle keyboard input for hours\n * Validates and clamps to 0-23 range\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\n */\n onHourInputChange(event: any): void {\n let value = parseInt(event.target.value, 10);\n\n if (isNaN(value) || value < 0) {\n value = 0;\n } else if (value > 23) {\n value = 23;\n }\n\n this.selectedTime.hour = value;\n event.target.value = value;\n this.updateSelectedDayTime();\n }\n\n /**\n * Handle keyboard input for minutes\n * Validates and clamps to 0-59 range\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\n */\n onMinuteInputChange(event: any): void {\n let value = parseInt(event.target.value, 10);\n\n if (isNaN(value) || value < 0) {\n value = 0;\n } else if (value > 59) {\n value = 59;\n }\n\n this.selectedTime.minute = value;\n event.target.value = value;\n this.updateSelectedDayTime();\n }\n\n /**\n * Handle keyboard arrow keys for hour/minute input\n * BACKWARD COMPATIBILITY: Only available when enableTime=true\n */\n onTimeKeydown(event: KeyboardEvent, type: 'hour' | 'minute'): void {\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n if (type === 'hour') {\n this.incrementHour();\n } else {\n this.incrementMinute();\n }\n } else if (event.key === 'ArrowDown') {\n event.preventDefault();\n if (type === 'hour') {\n this.decrementHour();\n } else {\n this.decrementMinute();\n }\n }\n }\n\n /**\n * Update the selected day's time property when time changes\n * BACKWARD COMPATIBILITY: Only called when enableTime=true\n */\n private updateSelectedDayTime(): void {\n if (this.selectedDay) {\n this.selectedDay.time = { ...this.selectedTime };\n }\n }\n\n /**\n * Get display hour for 12-hour format\n * BACKWARD COMPATIBILITY: Only used when useMeridian=true\n * \n * Conversion:\n * - 0 (midnight) → 12 AM\n * - 1-11 (AM) → 1-11 AM\n * - 12 (noon) → 12 PM\n * - 13-23 (PM) → 1-11 PM\n * \n * IMPORTANT: Hour 0 is NEVER displayed as 0, always as 12\n */\n getDisplayHour(): number {\n if (!this.useMeridian) {\n return this.selectedTime.hour;\n }\n \n const hour = this.selectedTime.hour;\n \n // Midnight (0) → 12\n if (hour === 0) {\n return 12;\n }\n // 1-12 → 1-12 (no change)\n else if (hour <= 12) {\n return hour;\n }\n // 13-23 → 1-11 (subtract 12)\n else {\n return hour - 12;\n }\n }\n\n /**\n * Toggle AM/PM meridian\n * BACKWARD COMPATIBILITY: Only available when useMeridian=true\n * \n * When toggling:\n * - Adds or subtracts 12 hours\n * - Maintains internal 24-hour format\n */\n toggleMeridian(): void {\n if (this.meridian === 'AM') {\n this.meridian = 'PM';\n // Add 12 hours if not already in PM range\n if (this.selectedTime.hour < 12) {\n this.selectedTime.hour += 12;\n }\n } else {\n this.meridian = 'AM';\n // Subtract 12 hours if in PM range\n if (this.selectedTime.hour >= 12) {\n this.selectedTime.hour -= 12;\n }\n }\n this.updateSelectedDayTime();\n }\n\n /**\n * Increment hour in 12-hour mode\n * BACKWARD COMPATIBILITY: Only used when useMeridian=true\n */\n incrementHour12(): void {\n let displayHour = this.getDisplayHour();\n displayHour = (displayHour % 12) + 1; // 1-12 cycle\n \n // Convert back to 24-hour format\n if (this.meridian === 'AM') {\n this.selectedTime.hour = displayHour === 12 ? 0 : displayHour;\n } else {\n this.selectedTime.hour = displayHour === 12 ? 12 : displayHour + 12;\n }\n \n this.updateSelectedDayTime();\n }\n\n /**\n * Decrement hour in 12-hour mode\n * BACKWARD COMPATIBILITY: Only used when useMeridian=true\n */\n decrementHour12(): void {\n let displayHour = this.getDisplayHour();\n displayHour = displayHour === 1 ? 12 : displayHour - 1; // 1-12 cycle\n \n // Convert back to 24-hour format\n if (this.meridian === 'AM') {\n this.selectedTime.hour = displayHour === 12 ? 0 : displayHour;\n } else {\n this.selectedTime.hour = displayHour === 12 ? 12 : displayHour + 12;\n }\n \n this.updateSelectedDayTime();\n }\n\n /**\n * Handle 12-hour input change\n * BACKWARD COMPATIBILITY: Only used when useMeridian=true\n * \n * IMPORTANT: Input must be 1-12, never 0\n * - User types 0 → converted to 12\n * - User types > 12 → clamped to 12\n */\n onHour12InputChange(event: any): void {\n let value = parseInt(event.target.value, 10);\n \n // Validate 1-12 range (0 is not allowed in 12-hour format)\n if (isNaN(value) || value < 1 || value === 0) {\n value = 12; // Default to 12 if invalid or 0\n } else if (value > 12) {\n value = 12;\n }\n \n // Convert to 24-hour format\n if (this.meridian === 'AM') {\n this.selectedTime.hour = value === 12 ? 0 : value;\n } else {\n this.selectedTime.hour = value === 12 ? 12 : value + 12;\n }\n \n event.target.value = value;\n this.updateSelectedDayTime();\n }\n\n /**\n * Check if a date is within the current range\n * BACKWARD COMPATIBILITY: Only used when selectionMode='range'\n */\n isInRange(day: DayInfo): boolean {\n if (this.selectionMode !== 'range' || !this.rangeStart || !this.rangeEnd || !day?.gD) {\n return false;\n }\n \n const dayDate = this.parseDateString(day.gD);\n const startDate = this.parseDateString(this.rangeStart.gD);\n const endDate = this.parseDateString(this.rangeEnd.gD);\n \n if (!dayDate || !startDate || !endDate) {\n return false;\n }\n \n return dayDate >= startDate && dayDate <= endDate;\n }\n\n /**\n * Check if a date is the range start\n * BACKWARD COMPATIBILITY: Only used when selectionMode='range'\n */\n isRangeStart(day: DayInfo): boolean {\n return this.selectionMode === 'range' && \n this.rangeStart?.gD === day?.gD;\n }\n\n /**\n * Check if a date is the range end\n * BACKWARD COMPATIBILITY: Only used when selectionMode='range'\n */\n isRangeEnd(day: DayInfo): boolean {\n return this.selectionMode === 'range' && \n this.rangeEnd?.gD === day?.gD;\n }\n\n /**\n * Reset range selection\n * BACKWARD COMPATIBILITY: Only used when selectionMode='range'\n */\n private resetRange(): void {\n if (this.selectionMode !== 'range') {\n return;\n }\n \n // Clear range highlighting\n this.weeks.forEach((week: any) => {\n week.forEach((day: DayInfo) => {\n if (day && day.gD) {\n day.selected = false;\n }\n });\n });\n \n this.rangeStart = undefined;\n this.rangeEnd = undefined;\n this.selectedDay = undefined;\n }\n\n /**\n * Parse date string (DD/MM/YYYY) to Date object\n * Helper for range comparison\n */\n private parseDateString(dateStr: string): Date | null {\n if (!dateStr) return null;\n \n const parts = dateStr.split('/');\n if (parts.length !== 3) return null;\n \n const day = parseInt(parts[0], 10);\n const month = parseInt(parts[1], 10) - 1; // Month is 0-indexed\n const year = parseInt(parts[2], 10);\n \n return new Date(year, month, day);\n }\n\n /**\n * Highlight all dates in range\n * BACKWARD COMPATIBILITY: Only used when selectionMode='range'\n */\n private highlightRange(): void {\n if (this.selectionMode !== 'range' || !this.rangeStart || !this.rangeEnd) {\n return;\n }\n \n this.weeks.forEach((week: any) => {\n week.forEach((day: DayInfo) => {\n if (day && day.gD) {\n day.selected = this.isInRange(day) || \n this.isRangeStart(day) || \n this.isRangeEnd(day);\n }\n });\n });\n }\n}\n","<div class=\"calendar-container\" [dir]=\"dir\" [attr.lang]=\"locale\">\n <div\n class=\"toggle-section\"\n [dir]=\"dir\"\n *ngIf=\"canChangeMode\"\n [ngStyle]=\"{ color: styles.primaryColor }\"\n >\n <span> {{ ummAlQuraDateText }} </span>\n <label class=\"switch\">\n <input\n type=\"checkbox\"\n [disabled]=\"!canChangeMode\"\n [checked]=\"mode === 'ummAlQura'\"\n (change)=\"changeCalendarMode()\"\n #calendarCheckbox\n />\n <span\n class=\"slider\"\n [ngStyle]=\"\n calendarCheckbox.checked\n ? { 'background-color': styles.primaryColor }\n : { 'background-color': styles.backgroundColor }\n \"\n ></span>\n </label>\n </div>\n\n <div\n class=\"todays-date-section\"\n *ngIf=\"todaysDateSection\"\n [ngStyle]=\"{\n 'background-color': styles.backgroundColor,\n color: styles.primaryColor,\n 'border-radius': styles.borderRadius\n }\"\n >\n <div\n class=\"text-info\"\n [ngClass]=\"{\n order: dir == 'rtl'\n }\"\n >\n <p>{{ todaysDateText }}</p>\n </div>\n\n <div\n class=\"data\"\n [dir]=\"dir\"\n [ngStyle]=\"{\n 'background-color': styles.todaysDateBgColor,\n color: styles.todaysDateTextColor\n }\"\n >\n <p *ngIf=\"mode == 'ummAlQura'\">\n <!-- {{todaysDate.ummAlQura}} -->\n {{\n locale == \"ar\"\n ? _dateUtilsService.convertDateNumerals(todaysDate.ummAlQura, \"ar\")\n : todaysDate.ummAlQura\n }}\n </p>\n <p *ngIf=\"mode == 'greg'\">\n {{\n locale == \"ar\"\n ? _dateUtilsService.convertDateNumerals(todaysDate.gregorian, \"ar\")\n : todaysDate.gregorian\n }}\n </p>\n </div>\n </div>\n\n <div class=\"period-container\">\n <form [formGroup]=\"periodForm\" class=\"period-form\">\n <div\n class=\"select-item\"\n [ngClass]=\"{\n order: dir == 'ltr'\n }\"\n [ngStyle]=\"{\n 'background-color': styles.backgroundColor,\n 'border-radius': styles.borderRadius\n }\"\n >\n <label *ngIf=\"!periodForm.controls['year'].value\">{{\n yearSelectLabel\n }}</label>\n\n <select\n formControlName=\"year\"\n class=\"{{ 'icon-' + dir }}\"\n placeholder=\"السنة\"\n (change)=\"onPeriodChange('year')\"\n [dir]=\"dir\"\n [ngStyle]=\"{\n color: styles.primaryColor,\n 'font-family': styles.fontFamily\n }\"\n >\n <option *ngFor=\"let year of years\" [ngValue]=\"year\">\n {{ locale == \"ar\" ? _dateUtilsService.parseEnglish(year) : year }}\n </option>\n </select>\n </div>\n\n <div\n class=\"select-item\"\n [ngClass]=\"{\n order: dir == 'rtl'\n }\"\n [ngStyle]=\"{\n 'background-color': styles.backgroundColor,\n 'border-radius': styles.borderRadius\n }\"\n >\n <label *ngIf=\"!periodForm.controls['month'].value\">{{\n monthSelectLabel\n }}</label>\n <select\n class=\"{{ 'icon-' + dir }}\"\n formControlName=\"month\"\n (change)=\"onPeriodChange('month')\"\n [dir]=\"dir\"\n [ngStyle]=\"{\n color: styles.primaryColor,\n 'font-family': styles.fontFamily\n }\"\n >\n <option *ngFor=\"let month of months\" [ngValue]=\"month.value\">\n {{ locale == \"ar\" ? month?.labelAr : month?.labelEn }}\n </option>\n </select>\n </div>\n </form>\n </div>\n\n <div\n class=\"calendar-layout\"\n [ngStyle]=\"{\n 'background-color': styles.backgroundColor,\n 'border-radius': styles.borderRadius\n }\"\n >\n <div class=\"week-days\">\n <div\n class=\"week-day\"\n [ngStyle]=\"{ color: styles.dayNameColor }\"\n *ngFor=\"let date of locale == 'ar' ? weekdaysAr : weekdaysEn\"\n >\n {{ date }}\n </div>\n </div>\n\n <div [dir]=\"dir\">\n <div class=\"week\" *ngFor=\"let week of weeks\">\n <div\n class=\"day\"\n *ngFor=\"let day of week\"\n (click)=\"disableDayPicker == false ? onDayClicked(day) : ''\"\n [ngStyle]=\"{\n 'background-color': styles.backgroundColor,\n color: styles.dayColor\n }\"\n >\n <div\n id=\"greg-day\"\n [ngClass]=\"{\n 'todays-date': checkTodaysDate(day),\n 'selected-date': day?.selected == true\n }\"\n [ngStyle]=\"{\n border:\n markToday && checkTodaysDate(day)\n ? '1px solid ' + styles.secondaryColor\n : '',\n 'background-color':\n day?.selected == true ? styles.secondaryColor : '',\n color:\n (day?.selected == true ? styles.todaysDateTextColor : '') ||\n (checkFutureValidation(day) && futureValidation\n ? styles.disabledDayColor\n : '') ||\n (isDateDisabled(day) ? styles.disabledDayColor : ''),\n opacity: isDateDisabled(day) ? '0.4' : '1',\n cursor: isDateDisabled(day) ? 'not-allowed' : 'pointer'\n }\"\n >\n <span *ngIf=\"mode == 'greg'\">{{\n locale == \"ar\"\n ? _dateUtilsService.parseEnglish(\n day?.gD?.split(\"/\")[0] | number\n )\n : (day?.gD?.split(\"/\")[0] | number)\n }}</span>\n\n <span id=\"ummAlQura-day\" *ngIf=\"mode == 'ummAlQura'\">{{\n locale == \"ar\"\n ? _dateUtilsService.parseEnglish(\n day?.uD?.split(\"/\")[0] | number\n )\n : (day?.uD?.split(\"/\")[0] | number)\n }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"future-validation\" dir=\"auto\" *ngIf=\"futureValidationMessage\">\n <span *ngIf=\"locale == 'ar'\">\n {{ futureValidationMessageAr }}\n </span>\n <span *ngIf=\"locale == 'en'\">\n {{ futureValidationMessageEn }}\n </span>\n </div>\n\n <!-- Time Picker Section -->\n <!-- BACKWARD COMPATIBILITY: This section only renders when enableTime=true -->\n <div class=\"time-picker-section\" *ngIf=\"enableTime\" [dir]=\"'ltr'\">\n <div class=\"time-picker-wrapper\">\n <!-- Hour Input with Arrows -->\n <div class=\"time-input-container\">\n <button\n type=\"button\"\n class=\"time-arrow time-arrow-up\"\n (click)=\"useMeridian ? incrementHour12() : incrementHour()\"\n tabindex=\"-1\"\n aria-label=\"Increment hour\"\n >\n <i class=\"ri-arrow-drop-up-line\"></i>\n </button>\n <input\n type=\"number\"\n class=\"time-field\"\n [value]=\"getDisplayHour().toString().padStart(2, '0')\"\n (input)=\"\n useMeridian\n ? onHour12InputChange($event)\n : onHourInputChange($event)\n \"\n (keydown)=\"onTimeKeydown($event, 'hour')\"\n [min]=\"useMeridian ? 1 : 0\"\n [max]=\"useMeridian ? 12 : 23\"\n aria-label=\"Hour\"\n />\n <button\n type=\"button\"\n class=\"time-arrow time-arrow-down\"\n (click)=\"useMeridian ? decrementHour12() : decrementHour()\"\n tabindex=\"-1\"\n aria-label=\"Decrement hour\"\n >\n <i class=\"ri-arrow-drop-down-line\"></i>\n </button>\n </div>\n\n <!-- Colon Separator -->\n <span class=\"time-colon\">:</span>\n\n <!-- Minute Input with Arrows -->\n <div class=\"time-input-container\">\n <button\n type=\"button\"\n class=\"time-arrow time-arrow-up\"\n (click)=\"incrementMinute()\"\n tabindex=\"-1\"\n aria-label=\"Increment minute\"\n >\n <i class=\"ri-arrow-drop-up-line\"></i>\n </button>\n <input\n type=\"number\"\n class=\"time-field\"\n [value]=\"selectedTime.minute.toString().padStart(2, '0')\"\n (input)=\"onMinuteInputChange($event)\"\n (keydown)=\"onTimeKeydown($event, 'minute')\"\n min=\"0\"\n max=\"59\"\n aria-label=\"Minute\"\n />\n <button\n type=\"button\"\n class=\"time-arrow time-arrow-down\"\n (click)=\"decrementMinute()\"\n tabindex=\"-1\"\n aria-label=\"Decrement minute\"\n >\n <i class=\"ri-arrow-drop-down-line\"></i>\n </button>\n </div>\n\n <!-- AM/PM Button Group (only when useMeridian=true) -->\n <!-- BACKWARD COMPATIBILITY: This only renders when useMeridian=true -->\n <div class=\"meridian-toggle-group\" *ngIf=\"useMeridian\">\n <button\n type=\"button\"\n class=\"meridian-btn\"\n [class.active]=\"meridian === 'AM'\"\n (click)=\"meridian !== 'AM' && toggleMeridian()\"\n aria-label=\"Select AM\"\n >\n AM\n </button>\n <button\n type=\"button\"\n class=\"meridian-btn\"\n [class.active]=\"meridian === 'PM'\"\n (click)=\"meridian !== 'PM' && toggleMeridian()\"\n aria-label=\"Select PM\"\n >\n PM\n </button>\n </div>\n </div>\n </div>\n\n <div>\n <button\n type=\"button\"\n class=\"confirm-btn\"\n [disabled]=\"\n isRequired &&\n ((!selectedDay && !multiple) ||\n (!multipleSelectedDates.length && multiple))\n \"\n (click)=\"onConfirmClicked()\"\n *ngIf=\"showConfirmButton\"\n [ngStyle]=\"{\n 'background-color': styles.secondaryColor,\n color: styles.confirmBtnTextColor,\n 'font-family': styles.fontFamily,\n 'border-radius': styles.borderRadius\n }\"\n >\n {{ submitTextButton }}\n </button>\n </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { HijriGregorianDatepickerComponent } from './hijri-gregorian-datepicker.component';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n declarations: [HijriGregorianDatepickerComponent],\n imports: [FormsModule, ReactiveFormsModule, CommonModule],\n exports: [HijriGregorianDatepickerComponent],\n})\nexport class HijriGregorianDatepickerModule {}\n","/*\n * Public API Surface of hijri-gregorian-datepicker\n */\n\nexport * from './_services/date-utilities.service';\nexport * from './lib/hijri-gregorian-datepicker.component';\nexport * from './lib/hijri-gregorian-datepicker.module';\nexport * from './_interfaces/calendar-model'; // Export interfaces including TimeValue\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["datesDictionary['default']","i2.DateUtilitiesService"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
|