UNPKG

@asi-ngtools/lib

Version:

This project is a little components library, simple to use, which will help you to simplify your project.

340 lines (339 loc) 34.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { DefaultControlValueAccessor } from './../common/default-control-value-accessor'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { Component, forwardRef, Input, Output, EventEmitter, ElementRef, Inject, PLATFORM_ID } from '@angular/core'; import { isPlatformBrowser } from '@angular/common'; import * as calendarConst from './asi-calendar-constants'; import * as nh from '../../native-helper'; import moment from 'moment'; export class AsiCalendarComponent extends DefaultControlValueAccessor { /** * @param {?} platformId */ constructor(platformId) { super(); this.platformId = platformId; this.onDatePicked = new EventEmitter(); this.open = false; if (this.isFr()) { this.days = calendarConst.days_fr; this.months = calendarConst.months_fr; } else { this.days = calendarConst.days_en; this.months = calendarConst.months_en; } this.initYears(); } /** * allow you to disable day of week exemple [disableDayOfWeek]="[1, 2]"" while disabled monday and tusday * @param {?} daysOfWeek * @return {?} */ set disableDayOfWeek(daysOfWeek) { if (!daysOfWeek) { this._disableDayOfWeek = []; } else if (nh.isArray(daysOfWeek)) { this._disableDayOfWeek = daysOfWeek; } else { this._disableDayOfWeek = [daysOfWeek]; } } /** * @return {?} */ isFr() { if (isPlatformBrowser(this.platformId)) { return navigator.language === 'fr' || navigator.language === 'fr-FR'; } else { return false; } } /** * @return {?} */ ngOnChanges() { if (this.minDate) { this.minDate.setHours(0, 0, 0, 0); } if (this.maxDate) { this.maxDate.setHours(23, 59, 59, 999); } this.calculDays(); } /** * @return {?} */ initYears() { /** @type {?} */ let results = new Array(); /** @type {?} */ let currentYear = new Date().getFullYear() + 1; for (let year = currentYear; year >= 1900; year--) { results.push(year); } this.years = results; } /** * @return {?} */ onDropdownClose() { this.open = false; } /** * @return {?} */ openCalendar() { this.open = true; } /** * @return {?} */ closeCalendar() { this.open = false; } /** * @param {?} dayItem * @return {?} */ onDaySelected(dayItem) { this.selectedDay = new calendarConst.DayItem(dayItem.day, dayItem.month, dayItem.year, dayItem.date, 'selected enabled'); this.value = dayItem.date; this.closeCalendar(); this.calculDays(); this.onDatePicked.emit(this.value); } /** * @return {?} */ onMonthSelected() { /** @type {?} */ let date = new Date(this.selectedYear, this.selectedMonth.num - 1, this.selectedDay.day); this.value = date; this.calculDays(); this.onDatePicked.emit(date); } /** * @return {?} */ onYearSelected() { /** @type {?} */ let date = new Date(this.selectedYear, this.selectedMonth.num - 1, this.selectedDay.day); this.value = date; this.calculDays(); this.onDatePicked.emit(date); } /** * @return {?} */ calculDays() { if (!this.selectedMonth || !this.selectedYear) { return; } /** @type {?} */ let month = this.selectedMonth.num - 1; /** @type {?} */ let year = this.selectedYear; /** @type {?} */ const result = []; /** @type {?} */ let date = new Date(year, month, 1); /** @type {?} */ let mondayDelta = 0; /** @type {?} */ let day = date.getDay(); if (day === 0) { mondayDelta = -6; } else { mondayDelta = -(day - 1); } date = moment(date).add(mondayDelta, 'days').toDate(); /** @type {?} */ let deltaMonth = date.getMonth(); if (deltaMonth !== month) { // Before first day of the month while (date.getMonth() === deltaMonth) { if (date.getDate() === this.selectedDay.day && date.getMonth() + 1 === this.selectedDay.month && date.getFullYear() === this.selectedDay.year) { result.push(this.selectedDay); } else { result.push(new calendarConst.DayItem(date.getDate(), date.getMonth() + 1, date.getFullYear(), new Date(date), 'extra enabled')); } date.setDate(date.getDate() + 1); } } // Month dates while (date.getMonth() === month) { if (date.getDate() === this.selectedDay.day && date.getMonth() + 1 === this.selectedDay.month && date.getFullYear() === this.selectedDay.year) { result.push(this.selectedDay); } else { result.push(new calendarConst.DayItem(date.getDate(), date.getMonth() + 1, date.getFullYear(), new Date(date), 'enabled')); } date.setDate(date.getDate() + 1); } // Days of the last week while (date.getDay() !== 1) { if (date.getDate() === this.selectedDay.day && date.getMonth() + 1 === this.selectedDay.month && date.getFullYear() === this.selectedDay.year) { result.push(this.selectedDay); } else { result.push(new calendarConst.DayItem(date.getDate(), date.getMonth() + 1, date.getFullYear(), new Date(date), 'extra enabled')); } date.setDate(date.getDate() + 1); } this.dayOfMonths = result; this.manageDisabledDate(); } /** * @return {?} */ manageDisabledDate() { /** @type {?} */ const dayOfWeekDisabled = !nh.isEmpty(this._disableDayOfWeek); if (this.dayOfMonths) { nh.forEach(this.dayOfMonths, (dayItem) => { if (this.minDate != null) { if (dayItem.date < this.minDate) { dayItem.class = 'disabled'; } } if (this.maxDate != null) { if (dayItem.date > this.maxDate) { dayItem.class = 'disabled'; } } if (dayOfWeekDisabled && this._disableDayOfWeek.includes(/** @type {?} */ (dayItem.date.getDay()))) { dayItem.class = 'disabled'; } }); } } /** * @param {?} value * @return {?} */ writeValue(value) { this._value = value; this.initToDate(value); } /** * @param {?} value * @return {?} */ initToDate(value) { if (value == null) { value = new Date(); } this.selectedYear = value.getFullYear(); /** @type {?} */ let dateMonth = value.getMonth() + 1; this.selectedMonth = nh.find(this.months, (month) => { return month.num === dateMonth; }); this.selectedDay = new calendarConst.DayItem(value.getDate(), this.selectedMonth.num, this.selectedYear, new Date(value), 'selected enabled'); this.calculDays(); } /** * @return {?} */ goNextMonth() { /** @type {?} */ let nextMonthNum = this.selectedMonth.num + 1; if (nextMonthNum === 13) { nextMonthNum = 1; this.selectedYear = this.selectedYear + 1; if (this.years.indexOf(this.selectedYear) === -1) { this.years.push(this.selectedYear); } } this.selectedMonth = nh.find(this.months, (month) => { return month.num === nextMonthNum; }); this.calculDays(); } /** * @return {?} */ goPreviousMonth() { /** @type {?} */ let nextMonthNum = this.selectedMonth.num - 1; if (nextMonthNum === 0) { nextMonthNum = 12; this.selectedYear = this.selectedYear - 1; } this.selectedMonth = nh.find(this.months, (month) => { return month.num === nextMonthNum; }); this.calculDays(); } } AsiCalendarComponent.decorators = [ { type: Component, args: [{ selector: 'asi-calendar', template: "<asi-fa-icon [disabled]=\"disabled\" icon=\"fa fa-calendar\" (onClick)=\"open = !open\"></asi-fa-icon>\n\n<asi-dropdown [open]=\"open\" [relativeTo]=\"relativeTo\" (onClose)=\"onDropdownClose()\" [calculWidth]=\"false\"\n dropDownClass=\"asi-calendar-dropdown\">\n\n <div class=\"asi-calendar-picker\">\n <div class=\"calendar-header\">\n <asi-fa-icon icon=\"fa fa-angle-left\" size=\"lg\" (onClick)=\"goPreviousMonth()\"></asi-fa-icon>\n <asi-select class=\"select-month\" [disabled]=\"disabled\" [(ngModel)]=\"selectedMonth\" [data]=\"months\"\n (onValueChange)=\"calculDays()\">\n <asi-selected *asiSelectedDef=\"let data\">{{data.num + \" - \" + data.libelle}}</asi-selected>\n <asi-option *asiOptionDef=\"let data\">{{data.num + \" - \" + data.libelle}}</asi-option>\n </asi-select>\n <asi-select class=\"select-year\" [disabled]=\"disabled\" [(ngModel)]=\"selectedYear\" [data]=\"years\"\n (onValueChange)=\"calculDays()\">\n <asi-selected *asiSelectedDef=\"let data\">{{data}}</asi-selected>\n <asi-option *asiOptionDef=\"let data\">{{data}}</asi-option>\n </asi-select>\n <asi-fa-icon icon=\"fa fa-angle-right\" size=\"lg\" (onClick)=\"goNextMonth()\"></asi-fa-icon>\n </div>\n <div class=\"day-list\">\n <div class=\"day-str\" *ngFor=\"let day of days\">\n <span>{{day.libelle}}</span>\n </div>\n </div>\n <div class=\"calendar-panel\" mouseWheel (mouseWheelUp)=\"goPreviousMonth()\" (mouseWheelDown)=\"goNextMonth()\">\n <button [attr.disabled]=\"day.class === 'disabled' ? true : null\" class=\"day-item\" *ngFor=\"let day of dayOfMonths\"\n [ngClass]=\"day.class\" (click)=\"onDaySelected(day)\">\n <span>{{day.day}}</span>\n </button>\n </div>\n </div>\n</asi-dropdown>\n", host: { 'class': 'asi-component asi-calendar' }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AsiCalendarComponent), multi: true } ] }] } ]; /** @nocollapse */ AsiCalendarComponent.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] } ]; AsiCalendarComponent.propDecorators = { relativeTo: [{ type: Input }], minDate: [{ type: Input }], maxDate: [{ type: Input }], disableDayOfWeek: [{ type: Input }], onDatePicked: [{ type: Output }] }; if (false) { /** @type {?} */ AsiCalendarComponent.prototype.relativeTo; /** @type {?} */ AsiCalendarComponent.prototype.minDate; /** @type {?} */ AsiCalendarComponent.prototype.maxDate; /** @type {?} */ AsiCalendarComponent.prototype._disableDayOfWeek; /** @type {?} */ AsiCalendarComponent.prototype.onDatePicked; /** @type {?} */ AsiCalendarComponent.prototype.days; /** @type {?} */ AsiCalendarComponent.prototype.months; /** @type {?} */ AsiCalendarComponent.prototype.years; /** @type {?} */ AsiCalendarComponent.prototype.selectedMonth; /** @type {?} */ AsiCalendarComponent.prototype.selectedYear; /** @type {?} */ AsiCalendarComponent.prototype.selectedDay; /** @type {?} */ AsiCalendarComponent.prototype.dayOfMonths; /** @type {?} */ AsiCalendarComponent.prototype.open; /** @type {?} */ AsiCalendarComponent.prototype.platformId; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLWNhbGVuZGFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bhc2ktbmd0b29scy9saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9hc2ktY2FsZW5kYXIvYXNpLWNhbGVuZGFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDekYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDL0gsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFcEQsT0FBTyxLQUFLLGFBQWEsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFDLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQWM1QixNQUFNLDJCQUE0QixTQUFRLDJCQUEyQjs7OztJQW9DbkUsWUFBeUMsVUFBZTtRQUN0RCxLQUFLLEVBQUUsQ0FBQztRQUQrQixlQUFVLEdBQVYsVUFBVSxDQUFLOzRCQWQvQixJQUFJLFlBQVksRUFBUTtvQkFZMUMsS0FBSztRQUlWLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEIsSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQztTQUN2QztRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sSUFBSSxDQUFDLElBQUksR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxN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LEVBQUUsRUFBRTtZQUNsRCxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxZQUFZLENBQUM7U0FDbkMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0tBQ25COzs7WUFqUUYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxjQUFjO2dCQUN4QixzeURBQTBDO2dCQUMxQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUU7Z0JBQy9DLFNBQVMsRUFBRTtvQkFDVDt3QkFDRSxPQUFPLEVBQUUsaUJBQWlCO3dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLG9CQUFvQixDQUFDO3dCQUNuRCxLQUFLLEVBQUUsSUFBSTtxQkFDWjtpQkFDRjthQUNGOzs7OzRDQXFDYyxNQUFNLFNBQUMsV0FBVzs7O3lCQWxDOUIsS0FBSztzQkFFTCxLQUFLO3NCQUNMLEtBQUs7K0JBS0wsS0FBSzsyQkFZTCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVmYXVsdENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnLi8uLi9jb21tb24vZGVmYXVsdC1jb250cm9sLXZhbHVlLWFjY2Vzc29yJztcclxuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBFbGVtZW50UmVmLCBJbmplY3QsIFBMQVRGT1JNX0lELCBPbkNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuaW1wb3J0ICogYXMgY2FsZW5kYXJDb25zdCBmcm9tICcuL2FzaS1jYWxlbmRhci1jb25zdGFudHMnO1xyXG5pbXBvcnQgKiBhcyBuaCBmcm9tICcuLi8uLi9uYXRpdmUtaGVscGVyJztcclxuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhc2ktY2FsZW5kYXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnYXNpLWNhbGVuZGFyLmNvbXBvbmVudC5odG1sJyxcclxuICBob3N0OiB7ICdjbGFzcyc6ICdhc2ktY29tcG9uZW50IGFzaS1jYWxlbmRhcicgfSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFzaUNhbGVuZGFyQ29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWVcclxuICAgIH1cclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc2lDYWxlbmRhckNvbXBvbmVudCBleHRlbmRzIERlZmF1bHRDb250cm9sVmFsdWVBY2Nlc3NvciBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XHJcblxyXG4gIEBJbnB1dCgpIHJlbGF0aXZlVG86IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgpIG1pbkRhdGU6IERhdGU7XHJcbiAgQElucHV0KCkgbWF4RGF0ZTogRGF0ZTtcclxuXHJcbiAgcHJpdmF0ZSBfZGlzYWJsZURheU9mV2VlazogbnVtYmVyW107XHJcblxyXG4gIC8qKiBhbGxvdyB5b3UgdG8gZGlzYWJsZSBkYXkgb2Ygd2VlayBleGVtcGxlIFtkaXNhYmxlRGF5T2ZXZWVrXT1cIlsxLCAyXVwiXCIgd2hpbGUgZGlzYWJsZWQgbW9uZGF5IGFuZCB0dXNkYXkgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCBkaXNhYmxlRGF5T2ZXZWVrKGRheXNPZldlZWspIHtcclxuICAgIGlmICghZGF5c09mV2Vlaykge1xyXG4gICAgICB0aGlzLl9kaXNhYmxlRGF5T2ZXZWVrID0gW107XHJcbiAgICB9IGVsc2UgaWYgKG5oLmlzQXJyYXkoZGF5c09mV2VlaykpIHtcclxuICAgICAgdGhpcy5fZGlzYWJsZURheU9mV2VlayA9IGRheXNPZldlZWs7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9kaXNhYmxlRGF5T2ZXZWVrID0gW2RheXNPZldlZWtdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIEBPdXRwdXQoKSBvbkRhdGVQaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XHJcblxyXG4gIGRheXM6IEFycmF5PGNhbGVuZGFyQ29uc3QuRGF5PjtcclxuICBtb250aHM6IEFycmF5PGNhbGVuZGFyQ29uc3QuTW9udGg+O1xyXG4gIHllYXJzOiBBcnJheTxudW1iZXI+O1xyXG5cclxuICBzZWxlY3RlZE1vbnRoOiBjYWxlbmRhckNvbnN0Lk1vbnRoO1xyXG4gIHNlbGVjdGVkWWVhcjogbnVtYmVyO1xyXG4gIHNlbGVjdGVkRGF5OiBjYWxlbmRhckNvbnN0LkRheUl0ZW07XHJcblxyXG4gIGRheU9mTW9udGhzOiBBcnJheTxjYWxlbmRhckNvbnN0LkRheUl0ZW0+O1xyXG5cclxuICBvcGVuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogYW55KSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgaWYgKHRoaXMuaXNGcigpKSB7XHJcbiAgICAgIHRoaXMuZGF5cyA9IGNhbGVuZGFyQ29uc3QuZGF5c19mcjtcclxuICAgICAgdGhpcy5tb250aHMgPSBjYWxlbmRhckNvbnN0Lm1vbnRoc19mcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGF5cyA9IGNhbGVuZGFyQ29uc3QuZGF5c19lbjtcclxuICAgICAgdGhpcy5tb250aHMgPSBjYWxlbmRhckNvbnN0Lm1vbnRoc19lbjtcclxuICAgIH1cclxuICAgIHRoaXMuaW5pdFllYXJzKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzRnIoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xyXG4gICAgICByZXR1cm4gbmF2aWdhdG9yLmxhbmd1YWdlID09PSAnZnInIHx8IG5hdmlnYXRvci5sYW5ndWFnZSA9PT0gJ2ZyLUZSJztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKCkge1xyXG4gICAgaWYgKHRoaXMubWluRGF0ZSkge1xyXG4gICAgICB0aGlzLm1pbkRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5tYXhEYXRlKSB7XHJcbiAgICAgIHRoaXMubWF4RGF0ZS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYWxjdWxEYXlzKCk7XHJcbiAgfVxyXG5cclxuICBpbml0WWVhcnMoKSB7XHJcbiAgICBsZXQgcmVzdWx0cyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XHJcbiAgICBsZXQgY3VycmVudFllYXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgKyAxO1xyXG4gICAgZm9yIChsZXQgeWVhciA9IGN1cnJlbnRZZWFyOyB5ZWFyID49IDE5MDA7IHllYXItLSkge1xyXG4gICAgICByZXN1bHRzLnB1c2goeWVhcik7XHJcbiAgICB9XHJcbiAgICB0aGlzLnllYXJzID0gcmVzdWx0cztcclxuICB9XHJcblxyXG4gIG9uRHJvcGRvd25DbG9zZSgpIHtcclxuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9wZW5DYWxlbmRhcigpIHtcclxuICAgIHRoaXMub3BlbiA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2VDYWxlbmRhcigpIHtcclxuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgb25EYXlTZWxlY3RlZChkYXlJdGVtOiBjYWxlbmRhckNvbnN0LkRheUl0ZW0pIHtcclxuICAgIHRoaXMuc2VsZWN0ZWREYXkgPSBuZXcgY2FsZW5kYXJDb25zdC5EYXlJdGVtKGRheUl0ZW0uZGF5LCBkYXlJdGVtLm1vbnRoLCBkYXlJdGVtLnllYXIsIGRheUl0ZW0uZGF0ZSwgJ3NlbGVjdGVkIGVuYWJsZWQnKTtcclxuICAgIHRoaXMudmFsdWUgPSBkYXlJdGVtLmRhdGU7XHJcbiAgICB0aGlzLmNsb3NlQ2FsZW5kYXIoKTtcclxuICAgIHRoaXMuY2FsY3VsRGF5cygpO1xyXG5cclxuICAgIHRoaXMub25EYXRlUGlja2VkLmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBvbk1vbnRoU2VsZWN0ZWQoKSB7XHJcbiAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWRZZWFyLCB0aGlzLnNlbGVjdGVkTW9udGgubnVtIC0gMSwgdGhpcy5zZWxlY3RlZERheS5kYXkpO1xyXG4gICAgdGhpcy52YWx1ZSA9IGRhdGU7XHJcbiAgICB0aGlzLmNhbGN1bERheXMoKTtcclxuICAgIHRoaXMub25EYXRlUGlja2VkLmVtaXQoZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBvblllYXJTZWxlY3RlZCgpIHtcclxuICAgIGxldCBkYXRlID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZFllYXIsIHRoaXMuc2VsZWN0ZWRNb250aC5udW0gLSAxLCB0aGlzLnNlbGVjdGVkRGF5LmRheSk7XHJcbiAgICB0aGlzLnZhbHVlID0gZGF0ZTtcclxuICAgIHRoaXMuY2FsY3VsRGF5cygpO1xyXG4gICAgdGhpcy5vbkRhdGVQaWNrZWQuZW1pdChkYXRlKTtcclxuICB9XHJcblxyXG4gIGNhbGN1bERheXMoKSB7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRNb250aCB8fCAhdGhpcy5zZWxlY3RlZFllYXIpIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcbiAgICBsZXQgbW9udGggPSB0aGlzLnNlbGVjdGVkTW9udGgubnVtIC0gMTtcclxuICAgIGxldCB5ZWFyID0gdGhpcy5zZWxlY3RlZFllYXI7XHJcbiAgICBjb25zdCByZXN1bHQgPSBbXTtcclxuICAgIGxldCBkYXRlID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpO1xyXG5cclxuICAgIGxldCBtb25kYXlEZWx0YSA9IDA7XHJcbiAgICBsZXQgZGF5ID0gZGF0ZS5nZXREYXkoKTtcclxuICAgIGlmIChkYXkgPT09IDApIHtcclxuICAgICAgbW9uZGF5RGVsdGEgPSAtNjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG1vbmRheURlbHRhID0gLShkYXkgLSAxKTtcclxuICAgIH1cclxuXHJcbiAgICBkYXRlID0gbW9tZW50KGRhdGUpLmFkZChtb25kYXlEZWx0YSwgJ2RheXMnKS50b0RhdGUoKTtcclxuXHJcbiAgICBsZXQgZGVsdGFNb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcclxuXHJcbiAgICBpZiAoZGVsdGFNb250aCAhPT0gbW9udGgpIHtcclxuICAgICAgLy8gQmVmb3JlIGZpcnN0IGRheSBvZiB0aGUgbW9udGhcclxuICAgICAgd2hpbGUgKGRhdGUuZ2V0TW9udGgoKSA9PT0gZGVsdGFNb250aCkge1xyXG4gICAgICAgIGlmIChkYXRlLmdldERhdGUoKSA9PT0gdGhpcy5zZWxlY3RlZERheS5kYXlcclxuICAgICAgICAgICYmIGRhdGUuZ2V0TW9udGgoKSArIDEgPT09IHRoaXMuc2VsZWN0ZWREYXkubW9udGhcclxuICAgICAgICAgICYmIGRhdGUuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy5zZWxlY3RlZERheS55ZWFyKSB7XHJcbiAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLnNlbGVjdGVkRGF5KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0LnB1c2gobmV3IGNhbGVuZGFyQ29uc3QuRGF5SXRlbShkYXRlLmdldERhdGUoKSwgZGF0ZS5nZXRNb250aCgpICsgMSwgZGF0ZS5nZXRGdWxsWWVhcigpLCBuZXcgRGF0ZShkYXRlKSwgJ2V4dHJhIGVuYWJsZWQnKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTW9udGggZGF0ZXNcclxuICAgIHdoaWxlIChkYXRlLmdldE1vbnRoKCkgPT09IG1vbnRoKSB7XHJcbiAgICAgIGlmIChkYXRlLmdldERhdGUoKSA9PT0gdGhpcy5zZWxlY3RlZERheS5kYXlcclxuICAgICAgICAmJiBkYXRlLmdldE1vbnRoKCkgKyAxID09PSB0aGlzLnNlbGVjdGVkRGF5Lm1vbnRoXHJcbiAgICAgICAgJiYgZGF0ZS5nZXRGdWxsWWVhcigpID09PSB0aGlzLnNlbGVjdGVkRGF5LnllYXIpIHtcclxuICAgICAgICByZXN1bHQucHVzaCh0aGlzLnNlbGVjdGVkRGF5KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXN1bHQucHVzaChuZXcgY2FsZW5kYXJDb25zdC5EYXlJdGVtKGRhdGUuZ2V0RGF0ZSgpLCBkYXRlLmdldE1vbnRoKCkgKyAxLCBkYXRlLmdldEZ1bGxZZWFyKCksIG5ldyBEYXRlKGRhdGUpLCAnZW5hYmxlZCcpKTtcclxuICAgICAgfVxyXG4gICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyAxKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBEYXlzIG9mIHRoZSBsYXN0IHdlZWtcclxuICAgIHdoaWxlIChkYXRlLmdldERheSgpICE9PSAxKSB7XHJcbiAgICAgIGlmIChkYXRlLmdldERhdGUoKSA9PT0gdGhpcy5zZWxlY3RlZERheS5kYXlcclxuICAgICAgICAmJiBkYXRlLmdldE1vbnRoKCkgKyAxID09PSB0aGlzLnNlbGVjdGVkRGF5Lm1vbnRoXHJcbiAgICAgICAgJiYgZGF0ZS5nZXRGdWxsWWVhcigpID09PSB0aGlzLnNlbGVjdGVkRGF5LnllYXIpIHtcclxuICAgICAgICByZXN1bHQucHVzaCh0aGlzLnNlbGVjdGVkRGF5KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXN1bHQucHVzaChuZXcgY2FsZW5kYXJDb25zdC5EYXlJdGVtKGRhdGUuZ2V0RGF0ZSgpLCBkYXRlLmdldE1vbnRoKCkgKyAxLCBkYXRlLmdldEZ1bGxZZWFyKCksIG5ldyBEYXRlKGRhdGUpLCAnZXh0cmEgZW5hYmxlZCcpKTtcclxuICAgICAgfVxyXG4gICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyAxKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmRheU9mTW9udGhzID0gcmVzdWx0O1xyXG5cclxuICAgIHRoaXMubWFuYWdlRGlzYWJsZWREYXRlKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1hbmFnZURpc2FibGVkRGF0ZSgpIHtcclxuICAgIGNvbnN0IGRheU9mV2Vla0Rpc2FibGVkID0gIW5oLmlzRW1wdHkodGhpcy5fZGlzYWJsZURheU9mV2Vlayk7XHJcblxyXG4gICAgaWYgKHRoaXMuZGF5T2ZNb250aHMpIHtcclxuICAgICAgbmguZm9yRWFjaCh0aGlzLmRheU9mTW9udGhzLCAoZGF5SXRlbSkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLm1pbkRhdGUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgaWYgKGRheUl0ZW0uZGF0ZSA8IHRoaXMubWluRGF0ZSkge1xyXG4gICAgICAgICAgICBkYXlJdGVtLmNsYXNzID0gJ2Rpc2FibGVkJztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMubWF4RGF0ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICBpZiAoZGF5SXRlbS5kYXRlID4gdGhpcy5tYXhEYXRlKSB7XHJcbiAgICAgICAgICAgIGRheUl0ZW0uY2xhc3MgPSAnZGlzYWJsZWQnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGF5T2ZXZWVrRGlzYWJsZWQgJiYgdGhpcy5fZGlzYWJsZURheU9mV2Vlay5pbmNsdWRlcyg8bnVtYmVyPmRheUl0ZW0uZGF0ZS5nZXREYXkoKSkpIHtcclxuICAgICAgICAgIGRheUl0ZW0uY2xhc3MgPSAnZGlzYWJsZWQnO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKHZhbHVlOiBEYXRlKSB7XHJcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xyXG4gICAgdGhpcy5pbml0VG9EYXRlKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIGluaXRUb0RhdGUodmFsdWU6IERhdGUpIHtcclxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XHJcbiAgICAgIHZhbHVlID0gbmV3IERhdGUoKTtcclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0ZWRZZWFyID0gdmFsdWUuZ2V0RnVsbFllYXIoKTtcclxuXHJcbiAgICBsZXQgZGF0ZU1vbnRoID0gdmFsdWUuZ2V0TW9udGgoKSArIDE7XHJcbiAgICB0aGlzLnNlbGVjdGVkTW9udGggPSBuaC5maW5kKHRoaXMubW9udGhzLCAobW9udGgpID0+IHtcclxuICAgICAgcmV0dXJuIG1vbnRoLm51bSA9PT0gZGF0ZU1vbnRoO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZERheSA9IG5ldyBjYWxlbmRhckNvbnN0LkRheUl0ZW0odmFsdWUuZ2V0RGF0ZSgpLCB0aGlzLnNlbGVjdGVkTW9udGgubnVtLFxyXG4gICAgICB0aGlzLnNlbGVjdGVkWWVhciwgbmV3IERhdGUodmFsdWUpLCAnc2VsZWN0ZWQgZW5hYmxlZCcpO1xyXG5cclxuICAgIHRoaXMuY2FsY3VsRGF5cygpO1xyXG4gIH1cclxuXHJcbiAgZ29OZXh0TW9udGgoKSB7XHJcbiAgICBsZXQgbmV4dE1vbnRoTnVtID0gdGhpcy5zZWxlY3RlZE1vbnRoLm51bSArIDE7XHJcbiAgICBpZiAobmV4dE1vbnRoTnVtID09PSAxMykge1xyXG4gICAgICBuZXh0TW9udGhOdW0gPSAxO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkWWVhciA9IHRoaXMuc2VsZWN0ZWRZZWFyICsgMTtcclxuICAgICAgaWYgKHRoaXMueWVhcnMuaW5kZXhPZih0aGlzLnNlbGVjdGVkWWVhcikgPT09IC0xKSB7XHJcbiAgICAgICAgdGhpcy55ZWFycy5wdXNoKHRoaXMuc2VsZWN0ZWRZZWFyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5zZWxlY3RlZE1vbnRoID0gbmguZmluZCh0aGlzLm1vbnRocywgKG1vbnRoKSA9PiB7XHJcbiAgICAgIHJldHVybiBtb250aC5udW0gPT09IG5leHRNb250aE51bTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FsY3VsRGF5cygpO1xyXG4gIH1cclxuXHJcbiAgZ29QcmV2aW91c01vbnRoKCkge1xyXG4gICAgbGV0IG5leHRNb250aE51bSA9IHRoaXMuc2VsZWN0ZWRNb250aC5udW0gLSAxO1xyXG4gICAgaWYgKG5leHRNb250aE51bSA9PT0gMCkge1xyXG4gICAgICBuZXh0TW9udGhOdW0gPSAxMjtcclxuICAgICAgdGhpcy5zZWxlY3RlZFllYXIgPSB0aGlzLnNlbGVjdGVkWWVhciAtIDE7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdGVkTW9udGggPSBuaC5maW5kKHRoaXMubW9udGhzLCAobW9udGgpID0+IHtcclxuICAgICAgcmV0dXJuIG1vbnRoLm51bSA9PT0gbmV4dE1vbnRoTnVtO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5jYWxjdWxEYXlzKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==