UNPKG

@asi-ngtools/lib

Version:

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

343 lines (342 loc) 34.9 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; } } /** * 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 {?} */ ngOnInit() { this.initYears(); } /** * @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(); for (let year = this.maxYear; year >= this.minYear; 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['error']) { 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 }], minYear: [{ type: Input }], maxYear: [{ 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.minYear; /** @type {?} */ AsiCalendarComponent.prototype.maxYear; /** @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLWNhbGVuZGFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bhc2ktbmd0b29scy9saWIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9hc2ktY2FsZW5kYXIvYXNpLWNhbGVuZGFyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDekYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZJLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXBELE9BQU8sS0FBSyxhQUFhLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxLQUFLLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxQyxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFjNUIsTUFBTSwyQkFBNEIsU0FBUSwyQkFBMkI7Ozs7SUFxQ25FLFlBQXlDLFVBQWU7UUFDdEQsS0FBSyxFQUFFLENBQUM7UUFEK0IsZUFBVSxHQUFWLFVBQVUsQ0FBSzs0QkFkL0IsSUFBSSxZQUFZLEVBQVE7b0JBWTFDLEtBQUs7UUFJVixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLElBQUksQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQztZQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUM7U0FDdkM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNOLElBQUksQ0FBQyxJQUFJLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQztZQUNsQyxJQUFJLENBQUMs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LE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLFlBQVksQ0FBQztTQUNuQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7S0FDbkI7OztZQTdQRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGNBQWM7Z0JBQ3hCLHN5REFBMEM7Z0JBQzFDLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSw0QkFBNEIsRUFBRTtnQkFDN0MsU0FBUyxFQUFFO29CQUNUO3dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7d0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsb0JBQW9CLENBQUM7d0JBQ25ELEtBQUssRUFBRSxJQUFJO3FCQUNaO2lCQUNGO2FBQ0Y7Ozs7NENBc0NjLE1BQU0sU0FBQyxXQUFXOzs7eUJBcEM5QixLQUFLO3NCQUVMLEtBQUs7c0JBQ0wsS0FBSztzQkFFTCxLQUFLO3NCQUNMLEtBQUs7K0JBS0wsS0FBSzsyQkFXTCxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVmYXVsdENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnLi8uLi9jb21tb24vZGVmYXVsdC1jb250cm9sLXZhbHVlLWFjY2Vzc29yJztcclxuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBFbGVtZW50UmVmLCBJbmplY3QsIFBMQVRGT1JNX0lELCBPbkNoYW5nZXMsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5pbXBvcnQgKiBhcyBjYWxlbmRhckNvbnN0IGZyb20gJy4vYXNpLWNhbGVuZGFyLWNvbnN0YW50cyc7XHJcbmltcG9ydCAqIGFzIG5oIGZyb20gJy4uLy4uL25hdGl2ZS1oZWxwZXInO1xyXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2FzaS1jYWxlbmRhcicsXHJcbiAgdGVtcGxhdGVVcmw6ICdhc2ktY2FsZW5kYXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIGhvc3Q6IHsgY2xhc3M6ICdhc2ktY29tcG9uZW50IGFzaS1jYWxlbmRhcicgfSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFzaUNhbGVuZGFyQ29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWVcclxuICAgIH1cclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBc2lDYWxlbmRhckNvbXBvbmVudCBleHRlbmRzIERlZmF1bHRDb250cm9sVmFsdWVBY2Nlc3NvciBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0IHtcclxuICBASW5wdXQoKSByZWxhdGl2ZVRvOiBFbGVtZW50UmVmO1xyXG5cclxuICBASW5wdXQoKSBtaW5EYXRlOiBEYXRlO1xyXG4gIEBJbnB1dCgpIG1heERhdGU6IERhdGU7XHJcblxyXG4gIEBJbnB1dCgpIG1pblllYXI6IG51bWJlcjtcclxuICBASW5wdXQoKSBtYXhZZWFyOiBudW1iZXI7XHJcblxyXG4gIHByaXZhdGUgX2Rpc2FibGVEYXlPZldlZWs6IG51bWJlcltdO1xyXG5cclxuICAvKiogYWxsb3cgeW91IHRvIGRpc2FibGUgZGF5IG9mIHdlZWsgZXhlbXBsZSBbZGlzYWJsZURheU9mV2Vla109XCJbMSwgMl1cIlwiIHdoaWxlIGRpc2FibGVkIG1vbmRheSBhbmQgdHVzZGF5ICovXHJcbiAgQElucHV0KClcclxuICBzZXQgZGlzYWJsZURheU9mV2VlayhkYXlzT2ZXZWVrKSB7XHJcbiAgICBpZiAoIWRheXNPZldlZWspIHtcclxuICAgICAgdGhpcy5fZGlzYWJsZURheU9mV2VlayA9IFtdO1xyXG4gICAgfSBlbHNlIGlmIChuaC5pc0FycmF5KGRheXNPZldlZWspKSB7XHJcbiAgICAgIHRoaXMuX2Rpc2FibGVEYXlPZldlZWsgPSBkYXlzT2ZXZWVrO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fZGlzYWJsZURheU9mV2VlayA9IFtkYXlzT2ZXZWVrXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBPdXRwdXQoKSBvbkRhdGVQaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XHJcblxyXG4gIGRheXM6IEFycmF5PGNhbGVuZGFyQ29uc3QuRGF5PjtcclxuICBtb250aHM6IEFycmF5PGNhbGVuZGFyQ29uc3QuTW9udGg+O1xyXG4gIHllYXJzOiBBcnJheTxudW1iZXI+O1xyXG5cclxuICBzZWxlY3RlZE1vbnRoOiBjYWxlbmRhckNvbnN0Lk1vbnRoO1xyXG4gIHNlbGVjdGVkWWVhcjogbnVtYmVyO1xyXG4gIHNlbGVjdGVkRGF5OiBjYWxlbmRhckNvbnN0LkRheUl0ZW07XHJcblxyXG4gIGRheU9mTW9udGhzOiBBcnJheTxjYWxlbmRhckNvbnN0LkRheUl0ZW0+O1xyXG5cclxuICBvcGVuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogYW55KSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgaWYgKHRoaXMuaXNGcigpKSB7XHJcbiAgICAgIHRoaXMuZGF5cyA9IGNhbGVuZGFyQ29uc3QuZGF5c19mcjtcclxuICAgICAgdGhpcy5tb250aHMgPSBjYWxlbmRhckNvbnN0Lm1vbnRoc19mcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGF5cyA9IGNhbGVuZGFyQ29uc3QuZGF5c19lbjtcclxuICAgICAgdGhpcy5tb250aHMgPSBjYWxlbmRhckNvbnN0Lm1vbnRoc19lbjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbml0WWVhcnMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNGcigpOiBib29sZWFuIHtcclxuICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XHJcbiAgICAgIHJldHVybiBuYXZpZ2F0b3IubGFuZ3VhZ2UgPT09ICdmcicgfHwgbmF2aWdhdG9yLmxhbmd1YWdlID09PSAnZnItRlInO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoKSB7XHJcbiAgICBpZiAodGhpcy5taW5EYXRlKSB7XHJcbiAgICAgIHRoaXMubWluRGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm1heERhdGUpIHtcclxuICAgICAgdGhpcy5tYXhEYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNhbGN1bERheXMoKTtcclxuICB9XHJcblxyXG4gIGluaXRZZWFycygpIHtcclxuICAgIGxldCByZXN1bHRzID0gbmV3IEFycmF5PG51bWJlcj4oKTtcclxuICAgIGZvciAobGV0IHllYXIgPSB0aGlzLm1heFllYXI7IHllYXIgPj0gdGhpcy5taW5ZZWFyOyB5ZWFyLS0pIHtcclxuICAgICAgcmVzdWx0cy5wdXNoKHllYXIpO1xyXG4gICAgfVxyXG4gICAgdGhpcy55ZWFycyA9IHJlc3VsdHM7XHJcbiAgfVxyXG5cclxuICBvbkRyb3Bkb3duQ2xvc2UoKSB7XHJcbiAgICB0aGlzLm9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvcGVuQ2FsZW5kYXIoKSB7XHJcbiAgICB0aGlzLm9wZW4gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsb3NlQ2FsZW5kYXIoKSB7XHJcbiAgICB0aGlzLm9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIG9uRGF5U2VsZWN0ZWQoZGF5SXRlbTogY2FsZW5kYXJDb25zdC5EYXlJdGVtKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRGF5ID0gbmV3IGNhbGVuZGFyQ29uc3QuRGF5SXRlbShkYXlJdGVtLmRheSwgZGF5SXRlbS5tb250aCwgZGF5SXRlbS55ZWFyLCBkYXlJdGVtLmRhdGUsICdzZWxlY3RlZCBlbmFibGVkJyk7XHJcbiAgICB0aGlzLnZhbHVlID0gZGF5SXRlbS5kYXRlO1xyXG4gICAgdGhpcy5jbG9zZUNhbGVuZGFyKCk7XHJcbiAgICB0aGlzLmNhbGN1bERheXMoKTtcclxuXHJcbiAgICB0aGlzLm9uRGF0ZVBpY2tlZC5lbWl0KHRoaXMudmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgb25Nb250aFNlbGVjdGVkKCkge1xyXG4gICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSh0aGlzLnNlbGVjdGVkWWVhciwgdGhpcy5zZWxlY3RlZE1vbnRoLm51bSAtIDEsIHRoaXMuc2VsZWN0ZWREYXkuZGF5KTtcclxuICAgIHRoaXMudmFsdWUgPSBkYXRlO1xyXG4gICAgdGhpcy5jYWxjdWxEYXlzKCk7XHJcbiAgICB0aGlzLm9uRGF0ZVBpY2tlZC5lbWl0KGRhdGUpO1xyXG4gIH1cclxuXHJcbiAgb25ZZWFyU2VsZWN0ZWQoKSB7XHJcbiAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHRoaXMuc2VsZWN0ZWRZZWFyLCB0aGlzLnNlbGVjdGVkTW9udGgubnVtIC0gMSwgdGhpcy5zZWxlY3RlZERheS5kYXkpO1xyXG4gICAgdGhpcy52YWx1ZSA9IGRhdGU7XHJcbiAgICB0aGlzLmNhbGN1bERheXMoKTtcclxuICAgIHRoaXMub25EYXRlUGlja2VkLmVtaXQoZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBjYWxjdWxEYXlzKCkge1xyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkTW9udGggfHwgIXRoaXMuc2VsZWN0ZWRZZWFyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCBtb250aCA9IHRoaXMuc2VsZWN0ZWRNb250aC5udW0gLSAxO1xyXG4gICAgbGV0IHllYXIgPSB0aGlzLnNlbGVjdGVkWWVhcjtcclxuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xyXG4gICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSk7XHJcblxyXG4gICAgbGV0IG1vbmRheURlbHRhID0gMDtcclxuICAgIGxldCBkYXkgPSBkYXRlLmdldERheSgpO1xyXG4gICAgaWYgKGRheSA9PT0gMCkge1xyXG4gICAgICBtb25kYXlEZWx0YSA9IC02O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgbW9uZGF5RGVsdGEgPSAtKGRheSAtIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIGRhdGUgPSBtb21lbnQoZGF0ZSkuYWRkKG1vbmRheURlbHRhLCAnZGF5cycpLnRvRGF0ZSgpO1xyXG5cclxuICAgIGxldCBkZWx0YU1vbnRoID0gZGF0ZS5nZXRNb250aCgpO1xyXG5cclxuICAgIGlmIChkZWx0YU1vbnRoICE9PSBtb250aCkge1xyXG4gICAgICAvLyBCZWZvcmUgZmlyc3QgZGF5IG9mIHRoZSBtb250aFxyXG4gICAgICB3aGlsZSAoZGF0ZS5nZXRNb250aCgpID09PSBkZWx0YU1vbnRoKSB7XHJcbiAgICAgICAgaWYgKGRhdGUuZ2V0RGF0ZSgpID09PSB0aGlzLnNlbGVjdGVkRGF5LmRheSAmJiBkYXRlLmdldE1vbnRoKCkgKyAxID09PSB0aGlzLnNlbGVjdGVkRGF5Lm1vbnRoICYmIGRhdGUuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy5zZWxlY3RlZERheS55ZWFyKSB7XHJcbiAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLnNlbGVjdGVkRGF5KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0LnB1c2gobmV3IGNhbGVuZGFyQ29uc3QuRGF5SXRlbShkYXRlLmdldERhdGUoKSwgZGF0ZS5nZXRNb250aCgpICsgMSwgZGF0ZS5nZXRGdWxsWWVhcigpLCBuZXcgRGF0ZShkYXRlKSwgJ2V4dHJhIGVuYWJsZWQnKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTW9udGggZGF0ZXNcclxuICAgIHdoaWxlIChkYXRlLmdldE1vbnRoKCkgPT09IG1vbnRoKSB7XHJcbiAgICAgIGlmIChkYXRlLmdldERhdGUoKSA9PT0gdGhpcy5zZWxlY3RlZERheS5kYXkgJiYgZGF0ZS5nZXRNb250aCgpICsgMSA9PT0gdGhpcy5zZWxlY3RlZERheS5tb250aCAmJiBkYXRlLmdldEZ1bGxZZWFyKCkgPT09IHRoaXMuc2VsZWN0ZWREYXkueWVhcikge1xyXG4gICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuc2VsZWN0ZWREYXkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc3VsdC5wdXNoKG5ldyBjYWxlbmRhckNvbnN0LkRheUl0ZW0oZGF0ZS5nZXREYXRlKCksIGRhdGUuZ2V0TW9udGgoKSArIDEsIGRhdGUuZ2V0RnVsbFllYXIoKSwgbmV3IERhdGUoZGF0ZSksICdlbmFibGVkJykpO1xyXG4gICAgICB9XHJcbiAgICAgIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERheXMgb2YgdGhlIGxhc3Qgd2Vla1xyXG4gICAgd2hpbGUgKGRhdGUuZ2V0RGF5KCkgIT09IDEpIHtcclxuICAgICAgaWYgKGRhdGUuZ2V0RGF0ZSgpID09PSB0aGlzLnNlbGVjdGVkRGF5LmRheSAmJiBkYXRlLmdldE1vbnRoKCkgKyAxID09PSB0aGlzLnNlbGVjdGVkRGF5Lm1vbnRoICYmIGRhdGUuZ2V0RnVsbFllYXIoKSA9PT0gdGhpcy5zZWxlY3RlZERheS55ZWFyKSB7XHJcbiAgICAgICAgcmVzdWx0LnB1c2godGhpcy5zZWxlY3RlZERheSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmVzdWx0LnB1c2gobmV3IGNhbGVuZGFyQ29uc3QuRGF5SXRlbShkYXRlLmdldERhdGUoKSwgZGF0ZS5nZXRNb250aCgpICsgMSwgZGF0ZS5nZXRGdWxsWWVhcigpLCBuZXcgRGF0ZShkYXRlKSwgJ2V4dHJhIGVuYWJsZWQnKSk7XHJcbiAgICAgIH1cclxuICAgICAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kYXlPZk1vbnRocyA9IHJlc3VsdDtcclxuXHJcbiAgICB0aGlzLm1hbmFnZURpc2FibGVkRGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBtYW5hZ2VEaXNhYmxlZERhdGUoKSB7XHJcbiAgICBjb25zdCBkYXlPZldlZWtEaXNhYmxlZCA9ICFuaC5pc0VtcHR5KHRoaXMuX2Rpc2FibGVEYXlPZldlZWspO1xyXG5cclxuICAgIGlmICh0aGlzLmRheU9mTW9udGhzKSB7XHJcbiAgICAgIG5oLmZvckVhY2godGhpcy5kYXlPZk1vbnRocywgKGRheUl0ZW0pID0+IHtcclxuICAgICAgICBpZiAodGhpcy5taW5EYXRlICE9IG51bGwpIHtcclxuICAgICAgICAgIGlmIChkYXlJdGVtLmRhdGUgPCB0aGlzLm1pbkRhdGUpIHtcclxuICAgICAgICAgICAgZGF5SXRlbS5jbGFzcyA9ICdkaXNhYmxlZCc7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm1heERhdGUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgaWYgKGRheUl0ZW0uZGF0ZSA+IHRoaXMubWF4RGF0ZSkge1xyXG4gICAgICAgICAgICBkYXlJdGVtLmNsYXNzID0gJ2Rpc2FibGVkJztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRheU9mV2Vla0Rpc2FibGVkICYmIHRoaXMuX2Rpc2FibGVEYXlPZldlZWsuaW5jbHVkZXMoPG51bWJlcj5kYXlJdGVtLmRhdGUuZ2V0RGF5KCkpKSB7XHJcbiAgICAgICAgICBkYXlJdGVtLmNsYXNzID0gJ2Rpc2FibGVkJztcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogRGF0ZSkge1xyXG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuICAgIHRoaXMuaW5pdFRvRGF0ZSh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBpbml0VG9EYXRlKHZhbHVlOiBEYXRlKSB7XHJcbiAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZVsnZXJyb3InXSkge1xyXG4gICAgICB2YWx1ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdGVkWWVhciA9IHZhbHVlLmdldEZ1bGxZZWFyKCk7XHJcblxyXG4gICAgbGV0IGRhdGVNb250aCA9IHZhbHVlLmdldE1vbnRoKCkgKyAxO1xyXG4gICAgdGhpcy5zZWxlY3RlZE1vbnRoID0gbmguZmluZCh0aGlzLm1vbnRocywgKG1vbnRoKSA9PiB7XHJcbiAgICAgIHJldHVybiBtb250aC5udW0gPT09IGRhdGVNb250aDtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWREYXkgPSBuZXcgY2FsZW5kYXJDb25zdC5EYXlJdGVtKHZhbHVlLmdldERhdGUoKSwgdGhpcy5zZWxlY3RlZE1vbnRoLm51bSwgdGhpcy5zZWxlY3RlZFllYXIsIG5ldyBEYXRlKHZhbHVlKSwgJ3NlbGVjdGVkIGVuYWJsZWQnKTtcclxuXHJcbiAgICB0aGlzLmNhbGN1bERheXMoKTtcclxuICB9XHJcblxyXG4gIGdvTmV4dE1vbnRoKCkge1xyXG4gICAgbGV0IG5leHRNb250aE51bSA9IHRoaXMuc2VsZWN0ZWRNb250aC5udW0gKyAxO1xyXG4gICAgaWYgKG5leHRNb250aE51bSA9PT0gMTMpIHtcclxuICAgICAgbmV4dE1vbnRoTnVtID0gMTtcclxuICAgICAgdGhpcy5zZWxlY3RlZFllYXIgPSB0aGlzLnNlbGVjdGVkWWVhciArIDE7XHJcbiAgICAgIGlmICh0aGlzLnllYXJzLmluZGV4T2YodGhpcy5zZWxlY3RlZFllYXIpID09PSAtMSkge1xyXG4gICAgICAgIHRoaXMueWVhcnMucHVzaCh0aGlzLnNlbGVjdGVkWWVhcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuc2VsZWN0ZWRNb250aCA9IG5oLmZpbmQodGhpcy5tb250aHMsIChtb250aCkgPT4ge1xyXG4gICAgICByZXR1cm4gbW9udGgubnVtID09PSBuZXh0TW9udGhOdW07XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNhbGN1bERheXMoKTtcclxuICB9XHJcblxyXG4gIGdvUHJldmlvdXNNb250aCgpIHtcclxuICAgIGxldCBuZXh0TW9udGhOdW0gPSB0aGlzLnNlbGVjdGVkTW9udGgubnVtIC0gMTtcclxuICAgIGlmIChuZXh0TW9udGhOdW0gPT09IDApIHtcclxuICAgICAgbmV4dE1vbnRoTnVtID0gMTI7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRZZWFyID0gdGhpcy5zZWxlY3RlZFllYXIgLSAxO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZWxlY3RlZE1vbnRoID0gbmguZmluZCh0aGlzLm1vbnRocywgKG1vbnRoKSA9PiB7XHJcbiAgICAgIHJldHVybiBtb250aC5udW0gPT09IG5leHRNb250aE51bTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY2FsY3VsRGF5cygpO1xyXG4gIH1cclxufVxyXG4iXX0=