UNPKG

@qeydar/datepicker

Version:

A comprehensive Date and Time Picker for Angular with Jalali calendar support

210 lines 31.6 kB
import { Injectable } from '@angular/core'; import * as i0 from "@angular/core"; export class ValidationStrategyService { /** * Check if a date is disabled based on various criteria */ isDateDisabled(date, dateAdapter, minDate, maxDate, disabledDates, disabledDatesFilter, dateFormat) { // Check min/max date constraints if ((minDate && dateAdapter.isBefore(date, minDate)) || (maxDate && dateAdapter.isAfter(date, maxDate))) { return true; } // Check if date is in disabled dates array const parsedDisabledDates = this.parseDisabledDates(disabledDates || [], dateAdapter, dateFormat); const isDisabledDate = parsedDisabledDates.some((disabledDate) => dateAdapter.isSameDay(date, disabledDate)); // Check custom filter function if provided const isFilterDisabled = disabledDatesFilter ? disabledDatesFilter(date) : false; return isDisabledDate || isFilterDisabled; } /** * Check if a month is disabled (all days in month are disabled) */ isMonthDisabled(month, year, dateAdapter, minDate, maxDate, disabledDates, disabledDatesFilter, dateFormat) { const startOfMonth = dateAdapter.createDate(year, month - 1, 1); // Check if all days in month are disabled const daysInMonth = dateAdapter.getDaysInMonth(startOfMonth); let allDaysDisabled = true; for (let day = 1; day <= daysInMonth; day++) { const date = dateAdapter.createDate(year, month - 1, day); if (!this.isDateDisabled(date, dateAdapter, minDate, maxDate, disabledDates, disabledDatesFilter, dateFormat)) { allDaysDisabled = false; break; } } return allDaysDisabled; } /** * Check if a year is disabled (all months in year are disabled) */ isYearDisabled(year, dateAdapter, minDate, maxDate, disabledDates, disabledDatesFilter, dateFormat) { // Check year boundaries if (minDate && dateAdapter.getYear(minDate) > year) return true; if (maxDate && dateAdapter.getYear(maxDate) < year) return true; // Check if all months in year are disabled const firstOfMonth = dateAdapter.createDate(year, 0, 1); let day = 1; for (let date = firstOfMonth; date.getFullYear() == firstOfMonth.getFullYear(); date = dateAdapter.addDays(firstOfMonth, day++)) { if (!this.isDateDisabled(date, dateAdapter, minDate, maxDate, disabledDates, disabledDatesFilter, dateFormat)) { return false; } } return true; } /** * Check if a year range is disabled */ isYearRangeDisabled(yearRange, dateAdapter, minDate, maxDate, disabledDates, disabledDatesFilter, dateFormat) { if (minDate && dateAdapter.getYear(minDate) > yearRange.end) return true; if (maxDate && dateAdapter.getYear(maxDate) < yearRange.start) return true; // Check if all years in range are disabled for (let year = yearRange.start; year <= yearRange.end; year++) { if (!this.isYearDisabled(year, dateAdapter, minDate, maxDate, disabledDates, disabledDatesFilter, dateFormat)) { return false; } } return true; } /** * Check if previous navigation is disabled */ isPrevNavigationDisabled(currentDate, viewMode, dateAdapter, minDate, yearList) { if (!minDate) return false; const minYear = dateAdapter.getYear(minDate); const minMonth = dateAdapter.getMonth(minDate); const currentYear = dateAdapter.getYear(currentDate); const currentMonth = dateAdapter.getMonth(currentDate); switch (viewMode) { case 'days': const prevMonthUnnorm = currentMonth - 1; const prevMonthYear = currentYear + Math.floor(prevMonthUnnorm / 12); // نرمال‌سازی برای مقادیر منفی const prevMonthIndex = (prevMonthUnnorm + 12) % 12; if (minYear > prevMonthYear) return true; if (minYear === prevMonthYear && minMonth > prevMonthIndex) return true; return false; case 'months': const prevYear = currentYear - 1; return minYear > prevYear; case 'years': if (!yearList || yearList.length === 0) return false; const minDisplayedYear = Math.min(...yearList); const prevLastYear = minDisplayedYear - 1; return minYear > prevLastYear; default: return false; } } /** * Check if next navigation is disabled */ isNextNavigationDisabled(currentDate, viewMode, dateAdapter, maxDate, yearList) { if (!maxDate) return false; const maxYear = dateAdapter.getYear(maxDate); const maxMonth = dateAdapter.getMonth(maxDate); const currentYear = dateAdapter.getYear(currentDate); const currentMonth = dateAdapter.getMonth(currentDate); switch (viewMode) { case 'days': const nextMonthUnnorm = currentMonth + 1; const nextMonthYear = currentYear + Math.floor(nextMonthUnnorm / 12); const nextMonthIndex = nextMonthUnnorm % 12; // اگر maxDate قبل از شروع ماه بعدی باشد، navigation غیرفعال است if (maxYear < nextMonthYear) return true; if (maxYear === nextMonthYear && maxMonth < nextMonthIndex) return true; return false; case 'months': const nextYear = currentYear + 1; return maxYear < nextYear; case 'years': if (!yearList || yearList.length === 0) return false; const maxDisplayedYear = Math.max(...yearList); const nextFirstYear = maxDisplayedYear + 1; return maxYear < nextFirstYear; default: return false; } } /** * Parse disabled dates from various formats */ parseDisabledDates(disabledDates, dateAdapter, dateFormat) { return disabledDates .map((date) => { if (date instanceof Date) { return dateAdapter.startOfDay(date); } const parsedDate = dateAdapter.parse(date, dateFormat); return parsedDate || null; }) .filter((date) => date !== null); } /** * Adjust current date to valid range */ adjustDateToValidRange(currentDate, dateAdapter, minDate, maxDate) { let adjustedDate = currentDate; if (minDate && dateAdapter.isBefore(adjustedDate, minDate)) { adjustedDate = minDate; } else if (maxDate && dateAdapter.isAfter(adjustedDate, maxDate)) { adjustedDate = maxDate; } return adjustedDate; } /** * Check if date is within valid range */ isDateInValidRange(date, dateAdapter, minDate, maxDate) { if (minDate && dateAdapter.isBefore(date, minDate)) return false; if (maxDate && dateAdapter.isAfter(date, maxDate)) return false; return true; } /** * Validate date range */ validateDateRange(startDate, endDate, dateAdapter, minDate, maxDate) { const errors = []; // Check if start date is valid if (!this.isDateInValidRange(startDate, dateAdapter, minDate, maxDate)) { errors.push('Start date is outside valid range'); } // Check if end date is valid if (!this.isDateInValidRange(endDate, dateAdapter, minDate, maxDate)) { errors.push('End date is outside valid range'); } // Check if start date is before end date if (dateAdapter.isAfter(startDate, endDate)) { errors.push('Start date must be before end date'); } return { isValid: errors.length === 0, errors, }; } } ValidationStrategyService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ValidationStrategyService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); ValidationStrategyService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ValidationStrategyService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ValidationStrategyService, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi1zdHJhdGVneS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcWV5ZGFyLWRhdGVwaWNrZXIvc3JjL2RhdGUtcGlja2VyLXBvcHVwL3NlcnZpY2VzL3ZhbGlkYXRpb24tc3RyYXRlZ3kuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQU8zQyxNQUFNLE9BQU8seUJBQXlCO0lBQ3BDOztPQUVHO0lBQ0gsY0FBYyxDQUNaLElBQVUsRUFDVixXQUE4QixFQUM5QixPQUFxQixFQUNyQixPQUFxQixFQUNyQixhQUFvQyxFQUNwQyxtQkFBNkMsRUFDN0MsVUFBbUI7UUFFbkIsaUNBQWlDO1FBQ2pDLElBQ0UsQ0FBQyxPQUFPLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDaEQsQ0FBQyxPQUFPLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsRUFDL0M7WUFDQSxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsMkNBQTJDO1FBQzNDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUNqRCxhQUFhLElBQUksRUFBRSxFQUNuQixXQUFXLEVBQ1gsVUFBVSxDQUNYLENBQUM7UUFDRixNQUFNLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUMvRCxXQUFXLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FDMUMsQ0FBQztRQUVGLDJDQUEyQztRQUMzQyxNQUFNLGdCQUFnQixHQUFHLG1CQUFtQjtZQUMxQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDO1lBQzNCLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFFVixPQUFPLGNB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T0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFO1lBQ3BFLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLENBQUMsQ0FBQztTQUNoRDtRQUVELHlDQUF5QztRQUN6QyxJQUFJLFdBQVcsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxFQUFFO1lBQzNDLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0NBQW9DLENBQUMsQ0FBQztTQUNuRDtRQUVELE9BQU87WUFDTCxPQUFPLEVBQUUsTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQzVCLE1BQU07U0FDUCxDQUFDO0lBQ0osQ0FBQzs7c0hBclVVLHlCQUF5QjswSEFBekIseUJBQXlCLGNBRnhCLE1BQU07MkZBRVAseUJBQXlCO2tCQUhyQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRGF0ZUFkYXB0ZXIgfSBmcm9tICcuLi8uLi9kYXRlLWFkYXB0ZXInO1xyXG5pbXBvcnQgeyBZZWFyUmFuZ2UgfSBmcm9tICcuLi8uLi91dGlscy9tb2RlbHMnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25TdHJhdGVneVNlcnZpY2Uge1xyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGEgZGF0ZSBpcyBkaXNhYmxlZCBiYXNlZCBvbiB2YXJpb3VzIGNyaXRlcmlhXHJcbiAgICovXHJcbiAgaXNEYXRlRGlzYWJsZWQoXHJcbiAgICBkYXRlOiBEYXRlLFxyXG4gICAgZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPERhdGU+LFxyXG4gICAgbWluRGF0ZT86IERhdGUgfCBudWxsLFxyXG4gICAgbWF4RGF0ZT86IERhdGUgfCBudWxsLFxyXG4gICAgZGlzYWJsZWREYXRlcz86IEFycmF5PERhdGUgfCBzdHJpbmc+LFxyXG4gICAgZGlzYWJsZWREYXRlc0ZpbHRlcj86IChkYXRlOiBEYXRlKSA9PiBib29sZWFuLFxyXG4gICAgZGF0ZUZvcm1hdD86IHN0cmluZ1xyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgLy8gQ2hlY2sgbWluL21heCBkYXRlIGNvbnN0cmFpbnRzXHJcbiAgICBpZiAoXHJcbiAgICAgIChtaW5EYXRlICYmIGRhdGVBZGFwdGVyLmlzQmVmb3JlKGRhdGUsIG1pbkRhdGUpKSB8fFxyXG4gICAgICAobWF4RGF0ZSAmJiBkYXRlQWRhcHRlci5pc0FmdGVyKGRhdGUsIG1heERhdGUpKVxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENoZWNrIGlmIGRhdGUgaXMgaW4gZGlzYWJsZWQgZGF0ZXMgYXJyYXlcclxuICAgIGNvbnN0IHBhcnNlZERpc2FibGVkRGF0ZXMgPSB0aGlzLnBhcnNlRGlzYWJsZWREYXRlcyhcclxuICAgICAgZGlzYWJsZWREYXRlcyB8fCBbXSxcclxuICAgICAgZGF0ZUFkYXB0ZXIsXHJcbiAgICAgIGRhdGVGb3JtYXRcclxuICAgICk7XHJcbiAgICBjb25zdCBpc0Rpc2FibGVkRGF0ZSA9IHBhcnNlZERpc2FibGVkRGF0ZXMuc29tZSgoZGlzYWJsZWREYXRlKSA9PlxyXG4gICAgICBkYXRlQWRhcHRlci5pc1NhbWVEYXkoZGF0ZSwgZGlzYWJsZWREYXRlKVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyBDaGVjayBjdXN0b20gZmlsdGVyIGZ1bmN0aW9uIGlmIHByb3ZpZGVkXHJcbiAgICBjb25zdCBpc0ZpbHRlckRpc2FibGVkID0gZGlzYWJsZWREYXRlc0ZpbHRlclxyXG4gICAgICA/IGRpc2FibGVkRGF0ZXNGaWx0ZXIoZGF0ZSlcclxuICAgICAgOiBmYWxzZTtcclxuXHJcbiAgICByZXR1cm4gaXNEaXNhYmxlZERhdGUgfHwgaXNGaWx0ZXJEaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGEgbW9udGggaXMgZGlzYWJsZWQgKGFsbCBkYXlzIGluIG1vbnRoIGFyZSBkaXNhYmxlZClcclxuICAgKi9cclxuICBpc01vbnRoRGlzYWJsZWQoXHJcbiAgICBtb250aDogbnVtYmVyLFxyXG4gICAgeWVhcjogbnVtYmVyLFxyXG4gICAgZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPERhdGU+LFxyXG4gICAgbWluRGF0ZT86IERhdGUgfCBudWxsLFxyXG4gICAgbWF4RGF0ZT86IERhdGUgfCBudWxsLFxyXG4gICAgZGlzYWJsZWREYXRlcz86IEFycmF5PERhdGUgfCBzdHJpbmc+LFxyXG4gICAgZGlzYWJsZWREYXRlc0ZpbHRlcj86IChkYXRlOiBEYXRlKSA9PiBib29sZWFuLFxyXG4gICAgZGF0ZUZvcm1hdD86IHN0cmluZ1xyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgc3RhcnRPZk1vbnRoID0gZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCAtIDEsIDEpO1xyXG5cclxuICAgIC8vIENoZWNrIGlmIGFsbCBkYXlzIGluIG1vbnRoIGFyZSBkaXNhYmxlZFxyXG4gICAgY29uc3QgZGF5c0luTW9udGggPSBkYXRlQWRhcHRlci5nZXREYXlzSW5Nb250aChzdGFydE9mTW9udGgpO1xyXG4gICAgbGV0IGFsbERheXNEaXNhYmxlZCA9IHRydWU7XHJcblxyXG4gICAgZm9yIChsZXQgZGF5ID0gMTsgZGF5IDw9IGRheXNJbk1vbnRoOyBkYXkrKykge1xyXG4gICAgICBjb25zdCBkYXRlID0gZGF0ZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRheSk7XHJcbiAgICAgIGlmIChcclxuICAgICAgICAhdGhpcy5pc0RhdGVEaXNhYmxlZChcclxuICAgICAgICAgIGRhdGUsXHJcbiAgICAgICAgICBkYXRlQWRhcHRlcixcclxuICAgICAgICAgIG1pbkRhdGUsXHJcbiAgICAgICAgICBtYXhEYXRlLFxyXG4gICAgICAgICAgZGlzYWJsZWREYXRlcyxcclxuICAgICAgICAgIGRpc2FibGVkRGF0ZXNGaWx0ZXIsXHJcbiAgICAgICAgICBkYXRlRm9ybWF0XHJcbiAgICAgICAgKVxyXG4gICAgICApIHtcclxuICAgICAgICBhbGxEYXlzRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhbGxEYXlzRGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiBhIHllYXIgaXMgZGlzYWJsZWQgKGFsbCBtb250aHMgaW4geWVhciBhcmUgZGlzYWJsZWQpXHJcbiAgICovXHJcbiAgaXNZZWFyRGlzYWJsZWQoXHJcbiAgICB5ZWFyOiBudW1iZXIsXHJcbiAgICBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RGF0ZT4sXHJcbiAgICBtaW5EYXRlPzogRGF0ZSB8IG51bGwsXHJcbiAgICBtYXhEYXRlPzogRGF0ZSB8IG51bGwsXHJcbiAgICBkaXNhYmxlZERhdGVzPzogQXJyYXk8RGF0ZSB8IHN0cmluZz4sXHJcbiAgICBkaXNhYmxlZERhdGVzRmlsdGVyPzogKGRhdGU6IERhdGUpID0+IGJvb2xlYW4sXHJcbiAgICBkYXRlRm9ybWF0Pzogc3RyaW5nXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICAvLyBDaGVjayB5ZWFyIGJvdW5kYXJpZXNcclxuICAgIGlmIChtaW5EYXRlICYmIGRhdGVBZGFwdGVyLmdldFllYXIobWluRGF0ZSkgPiB5ZWFyKSByZXR1cm4gdHJ1ZTtcclxuICAgIGlmIChtYXhEYXRlICYmIGRhdGVBZGFwdGVyLmdldFllYXIobWF4RGF0ZSkgPCB5ZWFyKSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAvLyBDaGVjayBpZiBhbGwgbW9udGhzIGluIHllYXIgYXJlIGRpc2FibGVkXHJcbiAgICBjb25zdCBmaXJzdE9mTW9udGggPSBkYXRlQWRhcHRlci5jcmVhdGVEYXRlKHllYXIsIDAsIDEpO1xyXG4gICAgbGV0IGRheSA9IDE7XHJcblxyXG4gICAgZm9yIChcclxuICAgICAgbGV0IGRhdGUgPSBmaXJzdE9mTW9udGg7XHJcbiAgICAgIGRhdGUuZ2V0RnVsbFllYXIoKSA9PSBmaXJzdE9mTW9udGguZ2V0RnVsbFllYXIoKTtcclxuICAgICAgZGF0ZSA9IGRhdGVBZGFwdGVyLmFkZERheXMoZmlyc3RPZk1vbnRoLCBkYXkrKylcclxuICAgICkge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgIXRoaXMuaXNEYXRlRGlzYWJsZWQoXHJcbiAgICAgICAgICBkYXRlLFxyXG4gICAgICAgICAgZGF0ZUFkYXB0ZXIsXHJcbiAgICAgICAgICBtaW5EYXRlLFxyXG4gICAgICAgICAgbWF4RGF0ZSxcclxuICAgICAgICAgIGRpc2FibGVkRGF0ZXMsXHJcbiAgICAgICAgICBkaXNhYmxlZERhdGVzRmlsdGVyLFxyXG4gICAgICAgICAgZGF0ZUZvcm1hdFxyXG4gICAgICAgIClcclxuICAgICAgKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiBhIHllYXIgcmFuZ2UgaXMgZGlzYWJsZWRcclxuICAgKi9cclxuICBpc1llYXJSYW5nZURpc2FibGVkKFxyXG4gICAgeWVhclJhbmdlOiBZZWFyUmFuZ2UsXHJcbiAgICBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RGF0ZT4sXHJcbiAgICBtaW5EYXRlPzogRGF0ZSB8IG51bGwsXHJcbiAgICBtYXhEYXRlPzogRGF0ZSB8IG51bGwsXHJcbiAgICBkaXNhYmxlZERhdGVzPzogQXJyYXk8RGF0ZSB8IHN0cmluZz4sXHJcbiAgICBkaXNhYmxlZERhdGVzRmlsdGVyPzogKGRhdGU6IERhdGUpID0+IGJvb2xlYW4sXHJcbiAgICBkYXRlRm9ybWF0Pzogc3RyaW5nXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICBpZiAobWluRGF0ZSAmJiBkYXRlQWRhcHRlci5nZXRZZWFyKG1pbkRhdGUpID4geWVhclJhbmdlLmVuZCkgcmV0dXJuIHRydWU7XHJcbiAgICBpZiAobWF4RGF0ZSAmJiBkYXRlQWRhcHRlci5nZXRZZWFyKG1heERhdGUpIDwgeWVhclJhbmdlLnN0YXJ0KSByZXR1cm4gdHJ1ZTtcclxuXHJcbiAgICAvLyBDaGVjayBpZiBhbGwgeWVhcnMgaW4gcmFuZ2UgYXJlIGRpc2FibGVkXHJcbiAgICBmb3IgKGxldCB5ZWFyID0geWVhclJhbmdlLnN0YXJ0OyB5ZWFyIDw9IHllYXJSYW5nZS5lbmQ7IHllYXIrKykge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgIXRoaXMuaXNZZWFyRGlzYWJsZWQoXHJcbiAgICAgICAgICB5ZWFyLFxyXG4gICAgICAgICAgZGF0ZUFkYXB0ZXIsXHJcbiAgICAgICAgICBtaW5EYXRlLFxyXG4gICAgICAgICAgbWF4RGF0ZSxcclxuICAgICAgICAgIGRpc2FibGVkRGF0ZXMsXHJcbiAgICAgICAgICBkaXNhYmxlZERhdGVzRmlsdGVyLFxyXG4gICAgICAgICAgZGF0ZUZvcm1hdFxyXG4gICAgICAgIClcclxuICAgICAgKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayBpZiBwcmV2aW91cyBuYXZpZ2F0aW9uIGlzIGRpc2FibGVkXHJcbiAgICovXHJcbiAgaXNQcmV2TmF2aWdhdGlvbkRpc2FibGVkKFxyXG4gICAgY3VycmVudERhdGU6IERhdGUsXHJcbiAgICB2aWV3TW9kZTogJ2RheXMnIHwgJ21vbnRocycgfCAneWVhcnMnLFxyXG4gICAgZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPERhdGU+LFxyXG4gICAgbWluRGF0ZT86IERhdGUgfCBudWxsLFxyXG4gICAgeWVhckxpc3Q/OiBudW1iZXJbXVxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCFtaW5EYXRlKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgbWluWWVhciA9IGRhdGVBZGFwdGVyLmdldFllYXIobWluRGF0ZSk7XHJcbiAgICBjb25zdCBtaW5Nb250aCA9IGRhdGVBZGFwdGVyLmdldE1vbnRoKG1pbkRhdGUpO1xyXG4gICAgY29uc3QgY3VycmVudFllYXIgPSBkYXRlQWRhcHRlci5nZXRZZWFyKGN1cnJlbnREYXRlKTtcclxuICAgIGNvbnN0IGN1cnJlbnRNb250aCA9IGRhdGVBZGFwdGVyLmdldE1vbnRoKGN1cnJlbnREYXRlKTtcclxuXHJcbiAgICBzd2l0Y2ggKHZpZXdNb2RlKSB7XHJcbiAgICAgIGNhc2UgJ2RheXMnOlxyXG4gICAgICAgIGNvbnN0IHByZXZNb250aFVubm9ybSA9IGN1cnJlbnRNb250aCAtIDE7XHJcbiAgICAgICAgY29uc3QgcHJldk1vbnRoWWVhciA9IGN1cnJlbnRZZWFyICsgTWF0aC5mbG9vcihwcmV2TW9udGhVbm5vcm0gLyAxMik7XHJcbiAgICAgICAgLy8g2YbYsdmF2KfZhOKAjNiz2KfYstuMINio2LHYp9uMINmF2YLYp9iv24zYsSDZhdmG2YHbjFxyXG4gICAgICAgIGNvbnN0IHByZXZNb250aEluZGV4ID0gKHByZXZNb250aFVubm9ybSArIDEyKSAlIDEyO1xyXG5cclxuICAgICAgICBpZiAobWluWWVhciA+IHByZXZNb250aFllYXIpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmIChtaW5ZZWFyID09PSBwcmV2TW9udGhZZWFyICYmIG1pbk1vbnRoID4gcHJldk1vbnRoSW5kZXgpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgIGNhc2UgJ21vbnRocyc6XHJcbiAgICAgICAgY29uc3QgcHJldlllYXIgPSBjdXJyZW50WWVhciAtIDE7XHJcbiAgICAgICAgcmV0dXJuIG1pblllYXIgPiBwcmV2WWVhcjtcclxuXHJcbiAgICAgIGNhc2UgJ3llYXJzJzpcclxuICAgICAgICBpZiAoIXllYXJMaXN0IHx8IHllYXJMaXN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IG1pbkRpc3BsYXllZFllYXIgPSBNYXRoLm1pbiguLi55ZWFyTGlzdCk7XHJcbiAgICAgICAgY29uc3QgcHJldkxhc3RZZWFyID0gbWluRGlzcGxheWVkWWVhciAtIDE7XHJcbiAgICAgICAgcmV0dXJuIG1pblllYXIgPiBwcmV2TGFzdFllYXI7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIG5leHQgbmF2aWdhdGlvbiBpcyBkaXNhYmxlZFxyXG4gICAqL1xyXG4gIGlzTmV4dE5hdmlnYXRpb25EaXNhYmxlZChcclxuICAgIGN1cnJlbnREYXRlOiBEYXRlLFxyXG4gICAgdmlld01vZGU6ICdkYXlzJyB8ICdtb250aHMnIHwgJ3llYXJzJyxcclxuICAgIGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxEYXRlPixcclxuICAgIG1heERhdGU/OiBEYXRlIHwgbnVsbCxcclxuICAgIHllYXJMaXN0PzogbnVtYmVyW11cclxuICApOiBib29sZWFuIHtcclxuICAgIGlmICghbWF4RGF0ZSkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IG1heFllYXIgPSBkYXRlQWRhcHRlci5nZXRZZWFyKG1heERhdGUpO1xyXG4gICAgY29uc3QgbWF4TW9udGggPSBkYXRlQWRhcHRlci5nZXRNb250aChtYXhEYXRlKTtcclxuICAgIGNvbnN0IGN1cnJlbnRZZWFyID0gZGF0ZUFkYXB0ZXIuZ2V0WWVhcihjdXJyZW50RGF0ZSk7XHJcbiAgICBjb25zdCBjdXJyZW50TW9udGggPSBkYXRlQWRhcHRlci5nZXRNb250aChjdXJyZW50RGF0ZSk7XHJcblxyXG4gICAgc3dpdGNoICh2aWV3TW9kZSkge1xyXG4gICAgICBjYXNlICdkYXlzJzpcclxuICAgICAgICBjb25zdCBuZXh0TW9udGhVbm5vcm0gPSBjdXJyZW50TW9udGggKyAxO1xyXG4gICAgICAgIGNvbnN0IG5leHRNb250aFllYXIgPSBjdXJyZW50WWVhciArIE1hdGguZmxvb3IobmV4dE1vbnRoVW5ub3JtIC8gMTIpO1xyXG4gICAgICAgIGNvbnN0IG5leHRNb250aEluZGV4ID0gbmV4dE1vbnRoVW5ub3JtICUgMTI7XHJcblxyXG4gICAgICAgIC8vINin2q/YsSBtYXhEYXRlINmC2KjZhCDYp9iyINi02LHZiNi5INmF2KfZhyDYqNi52K/bjCDYqNin2LTYr9iMIG5hdmlnYXRpb24g2LrbjNix2YHYudin2YQg2KfYs9iqXHJcbiAgICAgICAgaWYgKG1heFllYXIgPCBuZXh0TW9udGhZZWFyKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAobWF4WWVhciA9PT0gbmV4dE1vbnRoWWVhciAmJiBtYXhNb250aCA8IG5leHRNb250aEluZGV4KSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICBjYXNlICdtb250aHMnOlxyXG4gICAgICAgIGNvbnN0IG5leHRZZWFyID0gY3VycmVudFllYXIgKyAxO1xyXG4gICAgICAgIHJldHVybiBtYXhZZWFyIDwgbmV4dFllYXI7XHJcbiAgICAgIGNhc2UgJ3llYXJzJzpcclxuICAgICAgICBpZiAoIXllYXJMaXN0IHx8IHllYXJMaXN0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IG1heERpc3BsYXllZFllYXIgPSBNYXRoLm1heCguLi55ZWFyTGlzdCk7XHJcbiAgICAgICAgY29uc3QgbmV4dEZpcnN0WWVhciA9IG1heERpc3BsYXllZFllYXIgKyAxO1xyXG4gICAgICAgIHJldHVybiBtYXhZZWFyIDwgbmV4dEZpcnN0WWVhcjtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXJzZSBkaXNhYmxlZCBkYXRlcyBmcm9tIHZhcmlvdXMgZm9ybWF0c1xyXG4gICAqL1xyXG4gIHBhcnNlRGlzYWJsZWREYXRlcyhcclxuICAgIGRpc2FibGVkRGF0ZXM6IEFycmF5PERhdGUgfCBzdHJpbmc+LFxyXG4gICAgZGF0ZUFkYXB0ZXI6IERhdGVBZGFwdGVyPERhdGU+LFxyXG4gICAgZGF0ZUZvcm1hdD86IHN0cmluZ1xyXG4gICk6IERhdGVbXSB7XHJcbiAgICByZXR1cm4gZGlzYWJsZWREYXRlc1xyXG4gICAgICAubWFwKChkYXRlKSA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgICByZXR1cm4gZGF0ZUFkYXB0ZXIuc3RhcnRPZkRheShkYXRlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcGFyc2VkRGF0ZSA9IGRhdGVBZGFwdGVyLnBhcnNlKGRhdGUsIGRhdGVGb3JtYXQpO1xyXG4gICAgICAgIHJldHVybiBwYXJzZWREYXRlIHx8IG51bGw7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5maWx0ZXIoKGRhdGUpID0+IGRhdGUgIT09IG51bGwpIGFzIERhdGVbXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkanVzdCBjdXJyZW50IGRhdGUgdG8gdmFsaWQgcmFuZ2VcclxuICAgKi9cclxuICBhZGp1c3REYXRlVG9WYWxpZFJhbmdlKFxyXG4gICAgY3VycmVudERhdGU6IERhdGUsXHJcbiAgICBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RGF0ZT4sXHJcbiAgICBtaW5EYXRlPzogRGF0ZSB8IG51bGwsXHJcbiAgICBtYXhEYXRlPzogRGF0ZSB8IG51bGxcclxuICApOiBEYXRlIHtcclxuICAgIGxldCBhZGp1c3RlZERhdGUgPSBjdXJyZW50RGF0ZTtcclxuXHJcbiAgICBpZiAobWluRGF0ZSAmJiBkYXRlQWRhcHRlci5pc0JlZm9yZShhZGp1c3RlZERhdGUsIG1pbkRhdGUpKSB7XHJcbiAgICAgIGFkanVzdGVkRGF0ZSA9IG1pbkRhdGU7XHJcbiAgICB9IGVsc2UgaWYgKG1heERhdGUgJiYgZGF0ZUFkYXB0ZXIuaXNBZnRlcihhZGp1c3RlZERhdGUsIG1heERhdGUpKSB7XHJcbiAgICAgIGFkanVzdGVkRGF0ZSA9IG1heERhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFkanVzdGVkRGF0ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGRhdGUgaXMgd2l0aGluIHZhbGlkIHJhbmdlXHJcbiAgICovXHJcbiAgaXNEYXRlSW5WYWxpZFJhbmdlKFxyXG4gICAgZGF0ZTogRGF0ZSxcclxuICAgIGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxEYXRlPixcclxuICAgIG1pbkRhdGU/OiBEYXRlIHwgbnVsbCxcclxuICAgIG1heERhdGU/OiBEYXRlIHwgbnVsbFxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKG1pbkRhdGUgJiYgZGF0ZUFkYXB0ZXIuaXNCZWZvcmUoZGF0ZSwgbWluRGF0ZSkpIHJldHVybiBmYWxzZTtcclxuICAgIGlmIChtYXhEYXRlICYmIGRhdGVBZGFwdGVyLmlzQWZ0ZXIoZGF0ZSwgbWF4RGF0ZSkpIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmFsaWRhdGUgZGF0ZSByYW5nZVxyXG4gICAqL1xyXG4gIHZhbGlkYXRlRGF0ZVJhbmdlKFxyXG4gICAgc3RhcnREYXRlOiBEYXRlLFxyXG4gICAgZW5kRGF0ZTogRGF0ZSxcclxuICAgIGRhdGVBZGFwdGVyOiBEYXRlQWRhcHRlcjxEYXRlPixcclxuICAgIG1pbkRhdGU/OiBEYXRlIHwgbnVsbCxcclxuICAgIG1heERhdGU/OiBEYXRlIHwgbnVsbFxyXG4gICk6IHsgaXNWYWxpZDogYm9vbGVhbjsgZXJyb3JzOiBzdHJpbmdbXSB9IHtcclxuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICAvLyBDaGVjayBpZiBzdGFydCBkYXRlIGlzIHZhbGlkXHJcbiAgICBpZiAoIXRoaXMuaXNEYXRlSW5WYWxpZFJhbmdlKHN0YXJ0RGF0ZSwgZGF0ZUFkYXB0ZXIsIG1pbkRhdGUsIG1heERhdGUpKSB7XHJcbiAgICAgIGVycm9ycy5wdXNoKCdTdGFydCBkYXRlIGlzIG91dHNpZGUgdmFsaWQgcmFuZ2UnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiBlbmQgZGF0ZSBpcyB2YWxpZFxyXG4gICAgaWYgKCF0aGlzLmlzRGF0ZUluVmFsaWRSYW5nZShlbmREYXRlLCBkYXRlQWRhcHRlciwgbWluRGF0ZSwgbWF4RGF0ZSkpIHtcclxuICAgICAgZXJyb3JzLnB1c2goJ0VuZCBkYXRlIGlzIG91dHNpZGUgdmFsaWQgcmFuZ2UnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiBzdGFydCBkYXRlIGlzIGJlZm9yZSBlbmQgZGF0ZVxyXG4gICAgaWYgKGRhdGVBZGFwdGVyLmlzQWZ0ZXIoc3RhcnREYXRlLCBlbmREYXRlKSkge1xyXG4gICAgICBlcnJvcnMucHVzaCgnU3RhcnQgZGF0ZSBtdXN0IGJlIGJlZm9yZSBlbmQgZGF0ZScpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIGlzVmFsaWQ6IGVycm9ycy5sZW5ndGggPT09IDAsXHJcbiAgICAgIGVycm9ycyxcclxuICAgIH07XHJcbiAgfVxyXG59XHJcbiJdfQ==