UNPKG

ng19-date-picker

Version:

https://github.com/vlio20/angular-datepicker

175 lines 25.1 kB
import { Injectable } from '@angular/core'; import { dayjsRef } from '../common/dayjs/dayjs.ref'; import * as i0 from "@angular/core"; import * as i1 from "../common/services/utils/utils.service"; export class DayCalendarService { constructor(utilsService) { this.utilsService = utilsService; this.DEFAULT_CONFIG = { showNearMonthDays: true, showWeekNumbers: false, firstDayOfWeek: 'su', weekDayFormat: 'ddd', format: 'DD-MM-YYYY', allowMultiSelect: false, monthFormat: 'MMM, YYYY', enableMonthSelector: true, dayBtnFormat: 'DD', unSelectOnClick: true }; this.DAYS = ['su', 'mo', 'tu', 'we', 'th', 'fr', 'sa']; } getConfig(config) { const _config = { ...this.DEFAULT_CONFIG, ...this.utilsService.clearUndefined(config) }; this.utilsService.convertPropsToDayjs(_config, _config.format, ['min', 'max']); return _config; } generateDaysMap(firstDayOfWeek) { const firstDayIndex = this.DAYS.indexOf(firstDayOfWeek); const daysArr = this.DAYS.slice(firstDayIndex, 7).concat(this.DAYS.slice(0, firstDayIndex)); return daysArr.reduce((map, day, index) => { map[day] = index; return map; }, {}); } generateMonthArray(config, month, selected) { const parsedMonth = month.isValid() ? dayjsRef(month.toDate()) : dayjsRef(); let monthArray = []; const firstDayOfWeekIndex = this.DAYS.indexOf(config.firstDayOfWeek); let firstDayOfBoard = parsedMonth.startOf('month'); while (firstDayOfBoard.day() !== firstDayOfWeekIndex) { firstDayOfBoard = firstDayOfBoard.subtract(1, 'day'); } let current = dayjsRef(firstDayOfBoard.toDate()); const prevMonth = parsedMonth.subtract(1, 'month'); const nextMonth = parsedMonth.add(1, 'month'); const today = dayjsRef(); const daysOfCalendar = this.utilsService.createArray(42) .reduce((array) => { array.push({ date: dayjsRef(current.toDate()), selected: !!selected.find(selectedDay => current.isSame(selectedDay, 'day')), currentMonth: current.isSame(parsedMonth, 'month'), prevMonth: current.isSame(prevMonth, 'month'), nextMonth: current.isSame(nextMonth, 'month'), currentDay: current.isSame(today, 'day'), disabled: this.isDateDisabled(current, config) }); current = current.add(1, 'day'); return array; }, []); daysOfCalendar.forEach((day, index) => { const weekIndex = Math.floor(index / 7); if (!monthArray[weekIndex]) { monthArray.push([]); } monthArray[weekIndex].push(day); }); if (!config.showNearMonthDays) { monthArray = this.removeNearMonthWeeks(parsedMonth, monthArray); } return monthArray; } generateWeekdays(firstDayOfWeek) { const weekdayNames = { su: dayjsRef().day(0), mo: dayjsRef().day(1), tu: dayjsRef().day(2), we: dayjsRef().day(3), th: dayjsRef().day(4), fr: dayjsRef().day(5), sa: dayjsRef().day(6) }; const weekdays = []; const daysMap = this.generateDaysMap(firstDayOfWeek); for (const dayKey in daysMap) { if (daysMap.hasOwnProperty(dayKey)) { weekdays[daysMap[dayKey]] = weekdayNames[dayKey]; } } return weekdays; } isDateDisabled(date, config) { if (config.isDayDisabledCallback) { return config.isDayDisabledCallback(date); } if (config.min && date.isBefore(config.min, 'day')) { return true; } return !!(config.max && date.isAfter(config.max, 'day')); } // todo:: add unit tests getHeaderLabel(config, month) { if (config.monthFormatter) { return config.monthFormatter(month); } return month.format(config.monthFormat); } // todo:: add unit tests shouldShowLeft(min, currentMonthView) { return min ? min.isBefore(currentMonthView, 'month') : true; } // todo:: add unit tests shouldShowRight(max, currentMonthView) { return max ? max.isAfter(currentMonthView, 'month') : true; } generateDaysIndexMap(firstDayOfWeek) { const firstDayIndex = this.DAYS.indexOf(firstDayOfWeek); const daysArr = this.DAYS.slice(firstDayIndex, 7).concat(this.DAYS.slice(0, firstDayIndex)); return daysArr.reduce((map, day, index) => { map[index] = day; return map; }, {}); } getMonthCalendarConfig(componentConfig) { return this.utilsService.clearUndefined({ min: componentConfig.min, max: componentConfig.max, format: componentConfig.format, isNavHeaderBtnClickable: true, allowMultiSelect: false, yearFormat: componentConfig.yearFormat, yearFormatter: componentConfig.yearFormatter, monthBtnFormat: componentConfig.monthBtnFormat, monthBtnFormatter: componentConfig.monthBtnFormatter, monthBtnCssClassCallback: componentConfig.monthBtnCssClassCallback, isMonthDisabledCallback: componentConfig.isMonthDisabledCallback, multipleYearsNavigateBy: componentConfig.multipleYearsNavigateBy, showMultipleYearsNavigation: componentConfig.showMultipleYearsNavigation, showGoToCurrent: componentConfig.showGoToCurrent, numOfMonthRows: componentConfig.numOfMonthRows }); } getDayBtnText(config, day) { if (config.dayBtnFormatter) { return config.dayBtnFormatter(day); } return day.format(config.dayBtnFormat); } getDayBtnCssClass(config, day) { if (config.dayBtnCssClassCallback) { return config.dayBtnCssClassCallback(day); } return ''; } removeNearMonthWeeks(currentMonth, monthArray) { if (monthArray[monthArray.length - 1].find((day) => day.date.isSame(currentMonth, 'month'))) { return monthArray; } else { return monthArray.slice(0, -1); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: DayCalendarService, deps: [{ token: i1.UtilsService }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: DayCalendarService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: DayCalendarService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: () => [{ type: i1.UtilsService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF5LWNhbGVuZGFyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZzItZGF0ZS1waWNrZXIvc3JjL2xpYi9kYXktY2FsZW5kYXIvZGF5LWNhbGVuZGFyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQVF6QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7OztBQUtuRCxNQUFNLE9BQU8sa0JBQWtCO0lBZTdCLFlBQW9CLFlBQTBCO1FBQTFCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBZHJDLG1CQUFjLEdBQXVCO1lBQzVDLGlCQUFpQixFQUFFLElBQUk7WUFDdkIsZUFBZSxFQUFFLEtBQUs7WUFDdEIsY0FBYyxFQUFFLElBQUk7WUFDcEIsYUFBYSxFQUFFLEtBQUs7WUFDcEIsTUFBTSxFQUFFLFlBQVk7WUFDcEIsZ0JBQWdCLEVBQUUsS0FBSztZQUN2QixXQUFXLEVBQUUsV0FBVztZQUN4QixtQkFBbUIsRUFBRSxJQUFJO1lBQ3pCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLGVBQWUsRUFBRSxJQUFJO1NBQ3RCLENBQUM7UUFDZSxTQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUduRSxDQUFDO0lBRUQsU0FBUyxDQUFDLE1BQTBCO1FBQ2xDLE1BQU0sT0FBTyxHQUFHO1lBQ2QsR0FBRyxJQUFJLENBQUMsY0FBYztZQUN0QixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztTQUM1QyxDQUFDO1FBRUYsSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxL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O2tIQUFsQixrQkFBa0IsY0FGakIsTUFBTTs7MkZBRVAsa0JBQWtCO2tCQUg5QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7V2Vla0RheXN9IGZyb20gJy4uL2NvbW1vbi90eXBlcy93ZWVrLWRheXMudHlwZSc7XG5pbXBvcnQge1V0aWxzU2VydmljZX0gZnJvbSAnLi4vY29tbW9uL3NlcnZpY2VzL3V0aWxzL3V0aWxzLnNlcnZpY2UnO1xuaW1wb3J0IHtJRGF5fSBmcm9tICcuL2RheS5tb2RlbCc7XG5pbXBvcnQge0lEYXlDYWxlbmRhckNvbmZpZywgSURheUNhbGVuZGFyQ29uZmlnSW50ZXJuYWx9IGZyb20gJy4vZGF5LWNhbGVuZGFyLWNvbmZpZy5tb2RlbCc7XG5pbXBvcnQge0lNb250aENhbGVuZGFyQ29uZmlnfSBmcm9tICcuLi9tb250aC1jYWxlbmRhci9tb250aC1jYWxlbmRhci1jb25maWcnO1xuaW1wb3J0IHtEYXlqc30gZnJvbSAnZGF5anMnO1xuaW1wb3J0IHtkYXlqc1JlZn0gZnJvbSAnLi4vY29tbW9uL2RheWpzL2RheWpzLnJlZic7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIERheUNhbGVuZGFyU2VydmljZSB7XG4gIHJlYWRvbmx5IERFRkFVTFRfQ09ORklHOiBJRGF5Q2FsZW5kYXJDb25maWcgPSB7XG4gICAgc2hvd05lYXJNb250aERheXM6IHRydWUsXG4gICAgc2hvd1dlZWtOdW1iZXJzOiBmYWxzZSxcbiAgICBmaXJzdERheU9mV2VlazogJ3N1JyxcbiAgICB3ZWVrRGF5Rm9ybWF0OiAnZGRkJyxcbiAgICBmb3JtYXQ6ICdERC1NTS1ZWVlZJyxcbiAgICBhbGxvd011bHRpU2VsZWN0OiBmYWxzZSxcbiAgICBtb250aEZvcm1hdDogJ01NTSwgWVlZWScsXG4gICAgZW5hYmxlTW9udGhTZWxlY3RvcjogdHJ1ZSxcbiAgICBkYXlCdG5Gb3JtYXQ6ICdERCcsXG4gICAgdW5TZWxlY3RPbkNsaWNrOiB0cnVlXG4gIH07XG4gIHByaXZhdGUgcmVhZG9ubHkgREFZUyA9IFsnc3UnLCAnbW8nLCAndHUnLCAnd2UnLCAndGgnLCAnZnInLCAnc2EnXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHV0aWxzU2VydmljZTogVXRpbHNTZXJ2aWNlKSB7XG4gIH1cblxuICBnZXRDb25maWcoY29uZmlnOiBJRGF5Q2FsZW5kYXJDb25maWcpOiBJRGF5Q2FsZW5kYXJDb25maWdJbnRlcm5hbCB7XG4gICAgY29uc3QgX2NvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuREVGQVVMVF9DT05GSUcsXG4gICAgICAuLi50aGlzLnV0aWxzU2VydmljZS5jbGVhclVuZGVmaW5lZChjb25maWcpXG4gICAgfTtcblxuICAgIHRoaXMudXRpbHNTZXJ2aWNlLmNvbnZlcnRQcm9wc1RvRGF5anMoX2NvbmZpZywgX2NvbmZpZy5mb3JtYXQsIFsnbWluJywgJ21heCddKTtcblxuICAgIHJldHVybiBfY29uZmlnIGFzIElEYXlDYWxlbmRhckNvbmZpZ0ludGVybmFsO1xuICB9XG5cbiAgZ2VuZXJhdGVEYXlzTWFwKGZpcnN0RGF5T2ZXZWVrOiBXZWVrRGF5cykge1xuICAgIGNvbnN0IGZpcnN0RGF5SW5kZXggPSB0aGlzLkRBWVMuaW5kZXhPZihmaXJzdERheU9mV2Vlayk7XG4gICAgY29uc3QgZGF5c0FyciA9IHRoaXMuREFZUy5zbGljZShmaXJzdERheUluZGV4LCA3KS5jb25jYXQodGhpcy5EQVlTLnNsaWNlKDAsIGZpcnN0RGF5SW5kZXgpKTtcbiAgICByZXR1cm4gZGF5c0Fyci5yZWR1Y2UoKG1hcCwgZGF5LCBpbmRleCkgPT4ge1xuICAgICAgbWFwW2RheV0gPSBpbmRleDtcblxuICAgICAgcmV0dXJuIG1hcDtcbiAgICB9LCA8e1trZXk6IHN0cmluZ106IG51bWJlcn0+e30pO1xuICB9XG5cbiAgZ2VuZXJhdGVNb250aEFycmF5KGNvbmZpZzogSURheUNhbGVuZGFyQ29uZmlnSW50ZXJuYWwsIG1vbnRoOiBEYXlqcywgc2VsZWN0ZWQ6IERheWpzW10pOiBJRGF5W11bXSB7XG4gICAgY29uc3QgcGFyc2VkTW9udGggPSBtb250aC5pc1ZhbGlkKCkgPyBkYXlqc1JlZihtb250aC50b0RhdGUoKSkgOiBkYXlqc1JlZigpO1xuICAgIGxldCBtb250aEFycmF5OiBJRGF5W11bXSA9IFtdO1xuICAgIGNvbnN0IGZpcnN0RGF5T2ZXZWVrSW5kZXggPSB0aGlzLkRBWVMuaW5kZXhPZihjb25maWcuZmlyc3REYXlPZldlZWspO1xuICAgIGxldCBmaXJzdERheU9mQm9hcmQgPSBwYXJzZWRNb250aC5zdGFydE9mKCdtb250aCcpO1xuXG4gICAgd2hpbGUgKGZpcnN0RGF5T2ZCb2FyZC5kYXkoKSAhPT0gZmlyc3REYXlPZldlZWtJbmRleCkge1xuICAgICAgZmlyc3REYXlPZkJvYXJkID0gZmlyc3REYXlPZkJvYXJkLnN1YnRyYWN0KDEsICdkYXknKTtcbiAgICB9XG5cbiAgICBsZXQgY3VycmVudCA9IGRheWpzUmVmKGZpcnN0RGF5T2ZCb2FyZC50b0RhdGUoKSk7XG4gICAgY29uc3QgcHJldk1vbnRoID0gcGFyc2VkTW9udGguc3VidHJhY3QoMSwgJ21vbnRoJyk7XG4gICAgY29uc3QgbmV4dE1vbnRoID0gcGFyc2VkTW9udGguYWRkKDEsICdtb250aCcpO1xuICAgIGNvbnN0IHRvZGF5ID0gZGF5anNSZWYoKTtcblxuICAgIGNvbnN0IGRheXNPZkNhbGVuZGFyOiBJRGF5W10gPSB0aGlzLnV0aWxzU2VydmljZS5jcmVhdGVBcnJheSg0MilcbiAgICAgIC5yZWR1Y2UoKGFycmF5OiBJRGF5W10pID0+IHtcbiAgICAgICAgYXJyYXkucHVzaCh7XG4gICAgICAgICAgZGF0ZTogZGF5anNSZWYoY3VycmVudC50b0RhdGUoKSksXG4gICAgICAgICAgc2VsZWN0ZWQ6ICEhc2VsZWN0ZWQuZmluZChzZWxlY3RlZERheSA9PiBjdXJyZW50LmlzU2FtZShzZWxlY3RlZERheSwgJ2RheScpKSxcbiAgICAgICAgICBjdXJyZW50TW9udGg6IGN1cnJlbnQuaXNTYW1lKHBhcnNlZE1vbnRoLCAnbW9udGgnKSxcbiAgICAgICAgICBwcmV2TW9udGg6IGN1cnJlbnQuaXNTYW1lKHByZXZNb250aCwgJ21vbnRoJyksXG4gICAgICAgICAgbmV4dE1vbnRoOiBjdXJyZW50LmlzU2FtZShuZXh0TW9udGgsICdtb250aCcpLFxuICAgICAgICAgIGN1cnJlbnREYXk6IGN1cnJlbnQuaXNTYW1lKHRvZGF5LCAnZGF5JyksXG4gICAgICAgICAgZGlzYWJsZWQ6IHRoaXMuaXNEYXRlRGlzYWJsZWQoY3VycmVudCwgY29uZmlnKVxuICAgICAgICB9KTtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuYWRkKDEsICdkYXknKTtcblxuICAgICAgICByZXR1cm4gYXJyYXk7XG4gICAgICB9LCBbXSk7XG5cbiAgICBkYXlzT2ZDYWxlbmRhci5mb3JFYWNoKChkYXksIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCB3ZWVrSW5kZXggPSBNYXRoLmZsb29yKGluZGV4IC8gNyk7XG5cbiAgICAgIGlmICghbW9udGhBcnJheVt3ZWVrSW5kZXhdKSB7XG4gICAgICAgIG1vbnRoQXJyYXkucHVzaChbXSk7XG4gICAgICB9XG5cbiAgICAgIG1vbnRoQXJyYXlbd2Vla0luZGV4XS5wdXNoKGRheSk7XG4gICAgfSk7XG5cbiAgICBpZiAoIWNvbmZpZy5zaG93TmVhck1vbnRoRGF5cykge1xuICAgICAgbW9udGhBcnJheSA9IHRoaXMucmVtb3ZlTmVhck1vbnRoV2Vla3MocGFyc2VkTW9udGgsIG1vbnRoQXJyYXkpO1xuICAgIH1cblxuICAgIHJldHVybiBtb250aEFycmF5O1xuICB9XG5cbiAgZ2VuZXJhdGVXZWVrZGF5cyhmaXJzdERheU9mV2VlazogV2Vla0RheXMpOiBEYXlqc1tdIHtcbiAgICBjb25zdCB3ZWVrZGF5TmFtZXM6IHtba2V5OiBzdHJpbmddOiBEYXlqc30gPSB7XG4gICAgICBzdTogZGF5anNSZWYoKS5kYXkoMCksXG4gICAgICBtbzogZGF5anNSZWYoKS5kYXkoMSksXG4gICAgICB0dTogZGF5anNSZWYoKS5kYXkoMiksXG4gICAgICB3ZTogZGF5anNSZWYoKS5kYXkoMyksXG4gICAgICB0aDogZGF5anNSZWYoKS5kYXkoNCksXG4gICAgICBmcjogZGF5anNSZWYoKS5kYXkoNSksXG4gICAgICBzYTogZGF5anNSZWYoKS5kYXkoNilcbiAgICB9O1xuICAgIGNvbnN0IHdlZWtkYXlzOiBEYXlqc1tdID0gW107XG4gICAgY29uc3QgZGF5c01hcCA9IHRoaXMuZ2VuZXJhdGVEYXlzTWFwKGZpcnN0RGF5T2ZXZWVrKTtcblxuICAgIGZvciAoY29uc3QgZGF5S2V5IGluIGRheXNNYXApIHtcbiAgICAgIGlmIChkYXlzTWFwLmhhc093blByb3BlcnR5KGRheUtleSkpIHtcbiAgICAgICAgd2Vla2RheXNbZGF5c01hcFtkYXlLZXldXSA9IHdlZWtkYXlOYW1lc1tkYXlLZXldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB3ZWVrZGF5cztcbiAgfVxuXG4gIGlzRGF0ZURpc2FibGVkKGRhdGU6IERheWpzLCBjb25maWc6IElEYXlDYWxlbmRhckNvbmZpZ0ludGVybmFsKTogYm9vbGVhbiB7XG4gICAgaWYgKGNvbmZpZy5pc0RheURpc2FibGVkQ2FsbGJhY2spIHtcbiAgICAgIHJldHVybiBjb25maWcuaXNEYXlEaXNhYmxlZENhbGxiYWNrKGRhdGUpO1xuICAgIH1cblxuICAgIGlmIChjb25maWcubWluICYmIGRhdGUuaXNCZWZvcmUoY29uZmlnLm1pbiwgJ2RheScpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gISEoY29uZmlnLm1heCAmJiBkYXRlLmlzQWZ0ZXIoY29uZmlnLm1heCwgJ2RheScpKTtcbiAgfVxuXG4gIC8vIHRvZG86OiBhZGQgdW5pdCB0ZXN0c1xuICBnZXRIZWFkZXJMYWJlbChjb25maWc6IElEYXlDYWxlbmRhckNvbmZpZ0ludGVybmFsLCBtb250aDogRGF5anMpOiBzdHJpbmcge1xuICAgIGlmIChjb25maWcubW9udGhGb3JtYXR0ZXIpIHtcbiAgICAgIHJldHVybiBjb25maWcubW9udGhGb3JtYXR0ZXIobW9udGgpO1xuICAgIH1cblxuICAgIHJldHVybiBtb250aC5mb3JtYXQoY29uZmlnLm1vbnRoRm9ybWF0KTtcbiAgfVxuXG4gIC8vIHRvZG86OiBhZGQgdW5pdCB0ZXN0c1xuICBzaG91bGRTaG93TGVmdChtaW46IERheWpzLCBjdXJyZW50TW9udGhWaWV3OiBEYXlqcyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBtaW4gPyBtaW4uaXNCZWZvcmUoY3VycmVudE1vbnRoVmlldywgJ21vbnRoJykgOiB0cnVlO1xuICB9XG5cbiAgLy8gdG9kbzo6IGFkZCB1bml0IHRlc3RzXG4gIHNob3VsZFNob3dSaWdodChtYXg6IERheWpzLCBjdXJyZW50TW9udGhWaWV3OiBEYXlqcyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBtYXggPyBtYXguaXNBZnRlcihjdXJyZW50TW9udGhWaWV3LCAnbW9udGgnKSA6IHRydWU7XG4gIH1cblxuICBnZW5lcmF0ZURheXNJbmRleE1hcChmaXJzdERheU9mV2VlazogV2Vla0RheXMpIHtcbiAgICBjb25zdCBmaXJzdERheUluZGV4ID0gdGhpcy5EQVlTLmluZGV4T2YoZmlyc3REYXlPZldlZWspO1xuICAgIGNvbnN0IGRheXNBcnIgPSB0aGlzLkRBWVMuc2xpY2UoZmlyc3REYXlJbmRleCwgNykuY29uY2F0KHRoaXMuREFZUy5zbGljZSgwLCBmaXJzdERheUluZGV4KSk7XG4gICAgcmV0dXJuIGRheXNBcnIucmVkdWNlKChtYXAsIGRheSwgaW5kZXgpID0+IHtcbiAgICAgIG1hcFtpbmRleF0gPSBkYXk7XG5cbiAgICAgIHJldHVybiBtYXA7XG4gICAgfSwgPHtba2V5OiBudW1iZXJdOiBzdHJpbmd9Pnt9KTtcbiAgfVxuXG4gIGdldE1vbnRoQ2FsZW5kYXJDb25maWcoY29tcG9uZW50Q29uZmlnOiBJRGF5Q2FsZW5kYXJDb25maWdJbnRlcm5hbCk6IElNb250aENhbGVuZGFyQ29uZmlnIHtcbiAgICByZXR1cm4gdGhpcy51dGlsc1NlcnZpY2UuY2xlYXJVbmRlZmluZWQoe1xuICAgICAgbWluOiBjb21wb25lbnRDb25maWcubWluLFxuICAgICAgbWF4OiBjb21wb25lbnRDb25maWcubWF4LFxuICAgICAgZm9ybWF0OiBjb21wb25lbnRDb25maWcuZm9ybWF0LFxuICAgICAgaXNOYXZIZWFkZXJCdG5DbGlja2FibGU6IHRydWUsXG4gICAgICBhbGxvd011bHRpU2VsZWN0OiBmYWxzZSxcbiAgICAgIHllYXJGb3JtYXQ6IGNvbXBvbmVudENvbmZpZy55ZWFyRm9ybWF0LFxuICAgICAgeWVhckZvcm1hdHRlcjogY29tcG9uZW50Q29uZmlnLnllYXJGb3JtYXR0ZXIsXG4gICAgICBtb250aEJ0bkZvcm1hdDogY29tcG9uZW50Q29uZmlnLm1vbnRoQnRuRm9ybWF0LFxuICAgICAgbW9udGhCdG5Gb3JtYXR0ZXI6IGNvbXBvbmVudENvbmZpZy5tb250aEJ0bkZvcm1hdHRlcixcbiAgICAgIG1vbnRoQnRuQ3NzQ2xhc3NDYWxsYmFjazogY29tcG9uZW50Q29uZmlnLm1vbnRoQnRuQ3NzQ2xhc3NDYWxsYmFjayxcbiAgICAgIGlzTW9udGhEaXNhYmxlZENhbGxiYWNrOiBjb21wb25lbnRDb25maWcuaXNNb250aERpc2FibGVkQ2FsbGJhY2ssXG4gICAgICBtdWx0aXBsZVllYXJzTmF2aWdhdGVCeTogY29tcG9uZW50Q29uZmlnLm11bHRpcGxlWWVhcnNOYXZpZ2F0ZUJ5LFxuICAgICAgc2hvd011bHRpcGxlWWVhcnNOYXZpZ2F0aW9uOiBjb21wb25lbnRDb25maWcuc2hvd011bHRpcGxlWWVhcnNOYXZpZ2F0aW9uLFxuICAgICAgc2hvd0dvVG9DdXJyZW50OiBjb21wb25lbnRDb25maWcuc2hvd0dvVG9DdXJyZW50LFxuICAgICAgbnVtT2ZNb250aFJvd3M6IGNvbXBvbmVudENvbmZpZy5udW1PZk1vbnRoUm93c1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0RGF5QnRuVGV4dChjb25maWc6IElEYXlDYWxlbmRhckNvbmZpZ0ludGVybmFsLCBkYXk6IERheWpzKTogc3RyaW5nIHtcbiAgICBpZiAoY29uZmlnLmRheUJ0bkZvcm1hdHRlcikge1xuICAgICAgcmV0dXJuIGNvbmZpZy5kYXlCdG5Gb3JtYXR0ZXIoZGF5KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF5LmZvcm1hdChjb25maWcuZGF5QnRuRm9ybWF0KTtcbiAgfVxuXG4gIGdldERheUJ0bkNzc0NsYXNzKGNvbmZpZzogSURheUNhbGVuZGFyQ29uZmlnSW50ZXJuYWwsIGRheTogRGF5anMpOiBzdHJpbmcge1xuICAgIGlmIChjb25maWcuZGF5QnRuQ3NzQ2xhc3NDYWxsYmFjaykge1xuICAgICAgcmV0dXJuIGNvbmZpZy5kYXlCdG5Dc3NDbGFzc0NhbGxiYWNrKGRheSk7XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVOZWFyTW9udGhXZWVrcyhjdXJyZW50TW9udGg6IERheWpzLCBtb250aEFycmF5OiBJRGF5W11bXSk6IElEYXlbXVtdIHtcbiAgICBpZiAobW9udGhBcnJheVttb250aEFycmF5Lmxlbmd0aCAtIDFdLmZpbmQoKGRheSkgPT4gZGF5LmRhdGUuaXNTYW1lKGN1cnJlbnRNb250aCwgJ21vbnRoJykpKSB7XG4gICAgICByZXR1cm4gbW9udGhBcnJheTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1vbnRoQXJyYXkuc2xpY2UoMCwgLTEpO1xuICAgIH1cbiAgfVxufVxuIl19