{"version":3,"file":"angular-hijri-gregorian-datepicker.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-datepicker.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","import {\n  Component,\n  Input,\n  OnInit,\n  Output,\n  EventEmitter,\n  HostBinding,\n  OnChanges,\n  SimpleChanges,\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 {\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  /// 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  @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\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    if (this.mode == 'greg') {\n      this.gregYear =\n        this.futureYearsLimit == 0\n          ? Number(this.todaysDate.gregorian?.split('/')[2])\n          : Number(this.todaysDate.gregorian?.split('/')[2]) +\n            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(this.todaysDate.ummAlQura?.split('/')[2])\n          : Number(this.todaysDate.ummAlQura?.split('/')[2]) +\n            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 (\n        year ==\n        (this.mode == 'greg'\n          ? this.todaysDate.gregorian?.split('/')[2]\n          : this.todaysDate.ummAlQura?.split('/')[2])\n      ) {\n        this.periodForm.controls['year'].setValue(year);\n      }\n    });\n    this.months.map((month: any) => {\n      if (\n        month.value ==\n        (this.mode == 'greg'\n          ? this.todaysDate.gregorian?.split('/')[1]\n          : this.todaysDate.ummAlQura?.split('/')[1])\n      ) {\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    this.generatetMonthData(\n      this.mode == 'greg'\n        ? this.todaysDate.gregorian\n        : this.todaysDate.ummAlQura\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  /// 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      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    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        this.onDaySelect.emit(dayInfo);\n      } else {\n        dayInfo.selected = true;\n        this.onDaySelect.emit(dayInfo);\n        if (!this.multipleSelectedDates.includes(dayInfo)) {\n          this.multipleSelectedDates.push(dayInfo);\n        }\n      }\n    }\n  }\n\n  /// On confirm button clicked\n  onConfirmClicked() {\n    if (this.multiple) {\n      this.onSubmit.emit(this.multipleSelectedDates);\n    } else {\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","<div class=\"calendar-container\">\n  <div class=\"toggle-section\" [dir]=\"dir\" *ngIf=\"canChangeMode\" [ngStyle]=\"{ color: styles.primaryColor }\">\n    <span> {{ ummAlQuraDateText }} </span>\n    <label class=\"switch\">\n      <input type=\"checkbox\" [disabled]=\"!canChangeMode\" [checked]=\"mode === 'ummAlQura'\"\n        (change)=\"changeCalendarMode()\" #calendarCheckbox />\n      <span class=\"slider\"\n        [ngStyle]=\"calendarCheckbox.checked ? { 'background-color': styles.primaryColor } : {'background-color': styles.backgroundColor}\"></span>\n    </label>\n  </div>\n\n  <div class=\"todays-date-section\" *ngIf=\"todaysDateSection\" [ngStyle]=\"{\n      'background-color': styles.backgroundColor,\n      color: styles.primaryColor,\n      'border-radius': styles.borderRadius\n    }\">\n    <div class=\"text-info\" [ngClass]=\"{\n        order: dir == 'rtl'\n      }\">\n      <p>{{ todaysDateText }}</p>\n    </div>\n\n    <div class=\"data\" [dir]=\"dir\" [ngStyle]=\"{\n        'background-color': styles.todaysDateBgColor,\n        color: styles.todaysDateTextColor\n      }\">\n      <p *ngIf=\"mode == 'ummAlQura'\">\n        <!-- {{todaysDate.ummAlQura}} -->\n        {{ locale == 'ar' ? _dateUtilsService.convertDateNumerals(todaysDate.ummAlQura,'ar') : todaysDate.ummAlQura }}\n      </p>\n      <p *ngIf=\"mode == 'greg'\">\n        {{ locale == 'ar' ? _dateUtilsService.convertDateNumerals(todaysDate.gregorian,'ar') : todaysDate.gregorian }}\n      </p>\n    </div>\n  </div>\n\n  <div class=\"period-container\">\n    <form [formGroup]=\"periodForm\" class=\"period-form\">\n      <div class=\"select-item\" [ngClass]=\"{\n          order: dir == 'ltr'\n        }\" [ngStyle]=\"{ 'background-color': styles.backgroundColor, 'border-radius': styles.borderRadius }\">\n        <label *ngIf=\"!periodForm.controls['year'].value\">{{\n          yearSelectLabel\n        }}</label>\n\n        <select formControlName=\"year\" class=\"{{ 'icon-' + dir }}\" placeholder=\"السنة\" (change)=\"onPeriodChange('year')\"\n          [dir]=\"dir\" [ngStyle]=\"{\n            color: styles.primaryColor,\n            'font-family': styles.fontFamily\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 class=\"select-item\" [ngClass]=\"{\n          order: dir == 'rtl'\n        }\" [ngStyle]=\"{ 'background-color': styles.backgroundColor, 'border-radius': styles.borderRadius }\">\n        <label *ngIf=\"!periodForm.controls['month'].value\">{{\n          monthSelectLabel\n        }}</label>\n        <select class=\"{{ 'icon-' + dir }}\" formControlName=\"month\" (change)=\"onPeriodChange('month')\" [dir]=\"dir\"\n          [ngStyle]=\"{\n            color: styles.primaryColor,\n            'font-family': styles.fontFamily\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 class=\"calendar-layout\" [ngStyle]=\"{ 'background-color': styles.backgroundColor, 'border-radius': styles.borderRadius }\">\n    <div class=\"week-days\">\n      <div class=\"week-day\" [ngStyle]=\"{ color: styles.dayNameColor }\"\n        *ngFor=\"let date of locale == 'ar' ? weekdaysAr : weekdaysEn\">\n        {{ date }}\n      </div>\n    </div>\n\n    <div [dir]=\"dir\">\n      <div class=\"week\" *ngFor=\"let week of weeks\">\n        <div class=\"day\" *ngFor=\"let day of week\" (click)=\"disableDayPicker == false ? onDayClicked(day) : ''\"\n          [ngStyle]=\"{\n            'background-color': styles.backgroundColor,\n            color: styles.dayColor\n          }\">\n          <div id=\"greg-day\" [ngClass]=\"{\n              'todays-date': checkTodaysDate(day),\n              'selected-date': day?.selected == true\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            }\">\n            <span *ngIf=\"mode == 'greg'\">{{            \n             locale == 'ar' \n             ? _dateUtilsService.parseEnglish(day?.gD?.split(\"/\")[0] | number) : \n             day?.gD?.split(\"/\")[0] | number\n            }}</span>\n\n            <span id=\"ummAlQura-day\" *ngIf=\"mode == 'ummAlQura'\">{{\n              locale == 'ar' \n                ? _dateUtilsService.parseEnglish(day?.uD?.split(\"/\")[0] | number)\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  <div>\n    <button type=\"button\" class=\"confirm-btn\" [disabled]=\"\n        isRequired &&\n        ((!selectedDay && !multiple) ||\n          (!multipleSelectedDates.length && multiple))\n      \" (click)=\"onConfirmClicked()\" *ngIf=\"showConfirmButton\" [ngStyle]=\"{\n        'background-color': styles.secondaryColor,\n        color: styles.confirmBtnTextColor,\n        'font-family': styles.fontFamily,\n        'border-radius': styles.borderRadius\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';\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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"}