UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

357 lines 36.3 kB
import { __decorate, __extends, __metadata, __values } from "tslib"; import { Component, Output, EventEmitter, Input, HostListener, ViewChildren, QueryList, HostBinding } from '@angular/core'; import { isDateInRanges } from '../../calendar/calendar'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { IgxDayItemComponent } from './day-item.component'; import { DateRangeType } from '../../core/dates'; import { IgxCalendarBaseDirective, CalendarSelection } from '../calendar-base'; import { isEqual } from '../../core/utils'; import { IgxDaysViewNavigationService } from './daysview-navigation.service'; var NEXT_ID = 0; var IgxDaysViewComponent = /** @class */ (function (_super) { __extends(IgxDaysViewComponent, _super); /** * @hidden */ function IgxDaysViewComponent(navService) { var _this = _super.call(this) || this; _this.navService = navService; /** * Sets/gets the `id` of the days view. * If not set, the `id` will have value `"igx-days-view-0"`. * ```html * <igx-days-view id="my-days-view"></igx-days-view> * ``` * ```typescript * let daysViewId = this.daysView.id; * ``` */ _this.id = "igx-days-view-" + NEXT_ID++; /** * @hidden */ _this.changeDaysView = false; /** * @hidden */ _this.onDateSelection = new EventEmitter(); /** * @hidden */ _this.onViewChanging = new EventEmitter(); /** * The default css class applied to the component. * * @hidden */ _this.styleClass = true; return _this; } IgxDaysViewComponent_1 = IgxDaysViewComponent; Object.defineProperty(IgxDaysViewComponent.prototype, "getCalendarMonth", { /** * @hidden */ get: function () { return this.calendarModel.monthdatescalendar(this.viewDate.getFullYear(), this.viewDate.getMonth(), true); }, enumerable: true, configurable: true }); /** * @hidden */ IgxDaysViewComponent.prototype.ngOnInit = function () { this.navService.monthView = this; }; /** * @hidden */ IgxDaysViewComponent.prototype.ngDoCheck = function () { if (!this.changeDaysView && this.dates) { this.disableOutOfRangeDates(); } }; /** * Returns the locale representation of the date in the days view. * * @hidden */ IgxDaysViewComponent.prototype.formattedDate = function (value) { if (this.formatViews.day) { return this.formatterDay.format(value); } return "" + value.getDate(); }; /** * @hidden */ IgxDaysViewComponent.prototype.generateWeekHeader = function () { var e_1, _a; var dayNames = []; var rv = this.calendarModel.monthdatescalendar(this.viewDate.getFullYear(), this.viewDate.getMonth())[0]; try { for (var rv_1 = __values(rv), rv_1_1 = rv_1.next(); !rv_1_1.done; rv_1_1 = rv_1.next()) { var day = rv_1_1.value; dayNames.push(this.formatterWeekday.format(day.date)); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (rv_1_1 && !rv_1_1.done && (_a = rv_1.return)) _a.call(rv_1); } finally { if (e_1) throw e_1.error; } } return dayNames; }; /** * @hidden */ IgxDaysViewComponent.prototype.rowTracker = function (index, item) { return "" + item[index].date.getMonth() + item[index].date.getDate(); }; /** * @hidden */ IgxDaysViewComponent.prototype.dateTracker = function (index, item) { return item.date.getMonth() + "--" + item.date.getDate(); }; /** * @hidden */ IgxDaysViewComponent.prototype.isCurrentMonth = function (value) { return this.viewDate.getMonth() === value.getMonth(); }; /** * @hidden */ IgxDaysViewComponent.prototype.isCurrentYear = function (value) { return this.viewDate.getFullYear() === value.getFullYear(); }; /** * @hidden */ IgxDaysViewComponent.prototype.isSelected = function (date) { var selectedDates; if (this.isDateDisabled(date.date) || !this.value || (Array.isArray(this.value) && this.value.length === 0)) { return false; } if (this.selection === CalendarSelection.SINGLE) { selectedDates = this.value; return this.getDateOnly(selectedDates).getTime() === date.date.getTime(); } selectedDates = this.value; if (this.selection === CalendarSelection.RANGE && selectedDates.length === 1) { return this.getDateOnly(selectedDates[0]).getTime() === date.date.getTime(); } if (this.selection === CalendarSelection.MULTI) { var start = this.getDateOnly(selectedDates[0]); var end = this.getDateOnly(selectedDates[selectedDates.length - 1]); if (this.isWithinRange(date.date, false, start, end)) { var currentDate = selectedDates.find(function (element) { return element.getTime() === date.date.getTime(); }); return !!currentDate; } else { return false; } } else { return this.isWithinRange(date.date, true); } }; /** * @hidden */ IgxDaysViewComponent.prototype.isLastInRange = function (date) { if (this.isSingleSelection || !this.value) { return false; } var dates = this.value; var lastDate = dates[dates.length - 1]; return isEqual(lastDate, date.date); }; /** * @hidden */ IgxDaysViewComponent.prototype.isFirstInRange = function (date) { if (this.isSingleSelection || !this.value) { return false; } return isEqual(this.value[0], date.date); }; /** * @hidden */ IgxDaysViewComponent.prototype.isWithinRange = function (date, checkForRange, min, max) { if (checkForRange && !(Array.isArray(this.value) && this.value.length > 1)) { return false; } min = min ? min : this.value[0]; max = max ? max : this.value[this.value.length - 1]; return isDateInRanges(date, [ { type: DateRangeType.Between, dateRange: [min, max] } ]); }; /** *@hidden */ IgxDaysViewComponent.prototype.focusActiveDate = function () { var date = this.dates.find(function (d) { return d.selected; }); if (!date) { date = this.dates.find(function (d) { return d.isToday; }); } if (date.isFocusable) { date.nativeElement.focus(); } }; /** * @hidden */ IgxDaysViewComponent.prototype.selectDay = function (event) { this.selectDateFromClient(event.date); this.onDateSelection.emit(event); this.onSelection.emit(this.selectedDates); }; /** * @hidden */ IgxDaysViewComponent.prototype.disableOutOfRangeDates = function () { var dateRange = []; this.dates.toArray().forEach(function (date) { if (!date.isCurrentMonth) { dateRange.push(date.date.date); } }); this.outOfRangeDates = [{ type: DateRangeType.Specific, dateRange: dateRange }]; }; /** * @hidden */ IgxDaysViewComponent.prototype.getFirstMonthView = function () { var monthView = this; while (monthView.prevMonthView) { monthView = monthView.prevMonthView; } return monthView; }; /** * @hidden */ IgxDaysViewComponent.prototype.getLastMonthView = function () { var monthView = this; while (monthView.nextMonthView) { monthView = monthView.nextMonthView; } return monthView; }; Object.defineProperty(IgxDaysViewComponent.prototype, "isSingleSelection", { /** * @hidden */ get: function () { return this.selection !== CalendarSelection.RANGE; }, enumerable: true, configurable: true }); /** * @hidden */ IgxDaysViewComponent.prototype.onKeydownArrow = function (event) { event.preventDefault(); event.stopPropagation(); this.navService.focusNextDate(event.target, event.key); }; /** * @hidden */ IgxDaysViewComponent.prototype.onKeydownHome = function (event) { event.preventDefault(); event.stopPropagation(); this.getFirstMonthView().navService.focusHomeDate(); }; /** * @hidden */ IgxDaysViewComponent.prototype.onKeydownEnd = function (event) { event.preventDefault(); event.stopPropagation(); this.getLastMonthView().navService.focusEndDate(); }; var IgxDaysViewComponent_1; IgxDaysViewComponent.ctorParameters = function () { return [ { type: IgxDaysViewNavigationService } ]; }; __decorate([ HostBinding('attr.id'), Input(), __metadata("design:type", Object) ], IgxDaysViewComponent.prototype, "id", void 0); __decorate([ Input(), __metadata("design:type", Object) ], IgxDaysViewComponent.prototype, "changeDaysView", void 0); __decorate([ Output(), __metadata("design:type", Object) ], IgxDaysViewComponent.prototype, "onDateSelection", void 0); __decorate([ Output(), __metadata("design:type", Object) ], IgxDaysViewComponent.prototype, "onViewChanging", void 0); __decorate([ ViewChildren(IgxDayItemComponent, { read: IgxDayItemComponent }), __metadata("design:type", QueryList) ], IgxDaysViewComponent.prototype, "dates", void 0); __decorate([ HostBinding('class.igx-calendar'), __metadata("design:type", Object) ], IgxDaysViewComponent.prototype, "styleClass", void 0); __decorate([ HostListener('keydown.arrowleft', ['$event']), HostListener('keydown.arrowright', ['$event']), HostListener('keydown.arrowup', ['$event']), HostListener('keydown.arrowdown', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [KeyboardEvent]), __metadata("design:returntype", void 0) ], IgxDaysViewComponent.prototype, "onKeydownArrow", null); __decorate([ HostListener('keydown.home', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [KeyboardEvent]), __metadata("design:returntype", void 0) ], IgxDaysViewComponent.prototype, "onKeydownHome", null); __decorate([ HostListener('keydown.end', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [KeyboardEvent]), __metadata("design:returntype", void 0) ], IgxDaysViewComponent.prototype, "onKeydownEnd", null); IgxDaysViewComponent = IgxDaysViewComponent_1 = __decorate([ Component({ providers: [ { multi: true, provide: NG_VALUE_ACCESSOR, useExisting: IgxDaysViewComponent_1 }, { provide: IgxDaysViewNavigationService, useClass: IgxDaysViewNavigationService } ], selector: 'igx-days-view', template: "<div class=\"igx-calendar__body-row\">\n <span *ngFor=\"let dayName of generateWeekHeader()\" class=\"igx-calendar__label\">\n {{ dayName | titlecase }}\n </span>\n</div>\n\n<div *ngFor=\"let week of getCalendarMonth; last as isLast; index as i; trackBy: rowTracker\"\n class=\"igx-calendar__body-row\">\n <igx-day-item\n *ngFor=\"let day of week; trackBy: dateTracker\"\n [date]=\"day\"\n [selection]=\"selection\"\n [selected]=\"isSelected(day)\"\n [isLastInRange]=\"isLastInRange(day)\"\n [isFirstInRange]=\"isFirstInRange(day)\"\n [isWithinRange]=\"isWithinRange(day.date, true)\"\n [disabledDates]=\"disabledDates\"\n [specialDates]=\"specialDates\"\n [outOfRangeDates]=\"outOfRangeDates\"\n [hideOutsideDays]=\"hideOutsideDays\"\n (onDateSelection)=\"selectDay($event)\">\n {{ formattedDate(day.date) }}\n </igx-day-item>\n</div>\n" }), __metadata("design:paramtypes", [IgxDaysViewNavigationService]) ], IgxDaysViewComponent); return IgxDaysViewComponent; }(IgxCalendarBaseDirective)); export { IgxDaysViewComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF5cy12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY2FsZW5kYXIvZGF5cy12aWV3L2RheXMtdmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsTUFBTSxFQUNOLFlBQVksRUFDWixLQUFLLEVBQ0wsWUFBWSxFQUNaLFlBQVksRUFDWixTQUFTLEVBQ1QsV0FBVyxFQUdkLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBaUIsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDM0QsT0FBTyxFQUF1QixhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMvRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFM0MsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFN0UsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBY2hCO0lBQTBDLHdDQUF3QjtJQThEOUQ7O09BRUc7SUFDSCw4QkFBbUIsVUFBd0M7UUFBM0QsWUFDSSxpQkFBTyxTQUNWO1FBRmtCLGdCQUFVLEdBQVYsVUFBVSxDQUE4QjtRQWhFM0Q7Ozs7Ozs7OztXQVNHO1FBR0ksUUFBRSxHQUFHLG1CQUFpQixPQUFPLEVBQUksQ0FBQztRQUV6Qzs7V0FFRztRQUVJLG9CQUFjLEdBQUcsS0FBSyxDQUFDO1FBRTlCOztXQUVHO1FBRUkscUJBQWUsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQUUzRDs7V0FFRztRQUVJLG9CQUFjLEdB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QUMsQ0FBQztRQUM5QyxZQUFZLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQyxZQUFZLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7eUNBQ2pCLGFBQWE7OzhEQUl6QztJQU1EO1FBREMsWUFBWSxDQUFDLGNBQWMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzt5Q0FDYixhQUFhOzs2REFJeEM7SUFNRDtRQURDLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7eUNBQ2IsYUFBYTs7NERBSXZDO0lBelVRLG9CQUFvQjtRQVpoQyxTQUFTLENBQUM7WUFDUCxTQUFTLEVBQUU7Z0JBQ1A7b0JBQ0ksS0FBSyxFQUFFLElBQUk7b0JBQ1gsT0FBTyxFQUFFLGlCQUFpQjtvQkFDMUIsV0FBVyxFQUFFLHNCQUFvQjtpQkFDcEM7Z0JBQ0QsRUFBRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsUUFBUSxFQUFFLDRCQUE0QixFQUFFO2FBQ3BGO1lBQ0QsUUFBUSxFQUFFLGVBQWU7WUFDekIsazhCQUF1QztTQUMxQyxDQUFDO3lDQWtFaUMsNEJBQTRCO09BakVsRCxvQkFBb0IsQ0EwVWhDO0lBQUQsMkJBQUM7Q0FBQSxBQTFVRCxDQUEwQyx3QkFBd0IsR0EwVWpFO1NBMVVZLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIE91dHB1dCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIFZpZXdDaGlsZHJlbixcbiAgICBRdWVyeUxpc3QsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgRG9DaGVjayxcbiAgICBPbkluaXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJQ2FsZW5kYXJEYXRlLCBpc0RhdGVJblJhbmdlcyB9IGZyb20gJy4uLy4uL2NhbGVuZGFyL2NhbGVuZGFyJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSWd4RGF5SXRlbUNvbXBvbmVudCB9IGZyb20gJy4vZGF5LWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IERhdGVSYW5nZURlc2NyaXB0b3IsIERhdGVSYW5nZVR5cGUgfSBmcm9tICcuLi8uLi9jb3JlL2RhdGVzJztcbmltcG9ydCB7IElneENhbGVuZGFyQmFzZURpcmVjdGl2ZSwgQ2FsZW5kYXJTZWxlY3Rpb24gfSBmcm9tICcuLi9jYWxlbmRhci1iYXNlJztcbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzJztcbmltcG9ydCB7IElWaWV3Q2hhbmdpbmdFdmVudEFyZ3MgfSBmcm9tICcuL2RheXMtdmlldy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSWd4RGF5c1ZpZXdOYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4vZGF5c3ZpZXctbmF2aWdhdGlvbi5zZXJ2aWNlJztcblxubGV0IE5FWFRfSUQgPSAwO1xuXG5AQ29tcG9uZW50KHtcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBJZ3hEYXlzVmlld0NvbXBvbmVudFxuICAgICAgICB9LFxuICAgICAgICB7IHByb3ZpZGU6IElneERheXNWaWV3TmF2aWdhdGlvblNlcnZpY2UsIHVzZUNsYXNzOiBJZ3hEYXlzVmlld05hdmlnYXRpb25TZXJ2aWNlIH1cbiAgICBdLFxuICAgIHNlbGVjdG9yOiAnaWd4LWRheXMtdmlldycsXG4gICAgdGVtcGxhdGVVcmw6ICdkYXlzLXZpZXcuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIElneERheXNWaWV3Q29tcG9uZW50IGV4dGVuZHMgSWd4Q2FsZW5kYXJCYXNlRGlyZWN0aXZlIGltcGxlbWVudHMgRG9DaGVjaywgT25Jbml0IHtcbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIGBpZGAgb2YgdGhlIGRheXMgdmlldy5cbiAgICAgKiBJZiBub3Qgc2V0LCB0aGUgYGlkYCB3aWxsIGhhdmUgdmFsdWUgYFwiaWd4LWRheXMtdmlldy0wXCJgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWRheXMtdmlldyBpZD1cIm15LWRheXMtdmlld1wiPjwvaWd4LWRheXMtdmlldz5cbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGRheXNWaWV3SWQgPSAgdGhpcy5kYXlzVmlldy5pZDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuaWQnKVxuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGlkID0gYGlneC1kYXlzLXZpZXctJHtORVhUX0lEKyt9YDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBjaGFuZ2VEYXlzVmlldyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvbkRhdGVTZWxlY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPElDYWxlbmRhckRhdGU+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uVmlld0NoYW5naW5nID0gbmV3IEV2ZW50RW1pdHRlcjxJVmlld0NoYW5naW5nRXZlbnRBcmdzPigpO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oSWd4RGF5SXRlbUNvbXBvbmVudCwgeyByZWFkOiBJZ3hEYXlJdGVtQ29tcG9uZW50IH0pXG4gICAgcHVibGljIGRhdGVzOiBRdWVyeUxpc3Q8SWd4RGF5SXRlbUNvbXBvbmVudD47XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG91dE9mUmFuZ2VEYXRlczogRGF0ZVJhbmdlRGVzY3JpcHRvcltdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZXh0TW9udGhWaWV3OiBJZ3hEYXlzVmlld0NvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgcHJldk1vbnRoVmlldzogSWd4RGF5c1ZpZXdDb21wb25lbnQ7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVmYXVsdCBjc3MgY2xhc3MgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWNhbGVuZGFyJylcbiAgICBwdWJsaWMgc3R5bGVDbGFzcyA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHVibGljIG5hdlNlcnZpY2U6IElneERheXNWaWV3TmF2aWdhdGlvblNlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCBnZXRDYWxlbmRhck1vbnRoKCk6IElDYWxlbmRhckRhdGVbXVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsZW5kYXJNb2RlbC5tb250aGRhdGVzY2FsZW5kYXIodGhpcy52aWV3RGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLnZpZXdEYXRlLmdldE1vbnRoKCksIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMubmF2U2VydmljZS5tb250aFZpZXcgPSB0aGlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgbmdEb0NoZWNrKCkge1xuICAgICAgICBpZiAoIXRoaXMuY2hhbmdlRGF5c1ZpZXcgJiYgdGhpcy5kYXRlcykge1xuICAgICAgICAgICAgdGhpcy5kaXNhYmxlT3V0T2ZSYW5nZURhdGVzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBsb2NhbGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRhdGUgaW4gdGhlIGRheXMgdmlldy5cbiAgICAgKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZm9ybWF0dGVkRGF0ZSh2YWx1ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0aGlzLmZvcm1hdFZpZXdzLmRheSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0dGVyRGF5LmZvcm1hdCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke3ZhbHVlLmdldERhdGUoKX1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2VuZXJhdGVXZWVrSGVhZGVyKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgZGF5TmFtZXMgPSBbXTtcbiAgICAgICAgY29uc3QgcnYgPSB0aGlzLmNhbGVuZGFyTW9kZWwubW9udGhkYXRlc2NhbGVuZGFyKHRoaXMudmlld0RhdGUuZ2V0RnVsbFllYXIoKSwgdGhpcy52aWV3RGF0ZS5nZXRNb250aCgpKVswXTtcbiAgICAgICAgZm9yIChjb25zdCBkYXkgb2YgcnYpIHtcbiAgICAgICAgICAgIGRheU5hbWVzLnB1c2godGhpcy5mb3JtYXR0ZXJXZWVrZGF5LmZvcm1hdChkYXkuZGF0ZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRheU5hbWVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgcm93VHJhY2tlcihpbmRleCwgaXRlbSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHtpdGVtW2luZGV4XS5kYXRlLmdldE1vbnRoKCl9JHtpdGVtW2luZGV4XS5kYXRlLmdldERhdGUoKX1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGF0ZVRyYWNrZXIoaW5kZXgsIGl0ZW0pOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCR7aXRlbS5kYXRlLmdldE1vbnRoKCl9LS0ke2l0ZW0uZGF0ZS5nZXREYXRlKCl9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGlzQ3VycmVudE1vbnRoKHZhbHVlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdEYXRlLmdldE1vbnRoKCkgPT09IHZhbHVlLmdldE1vbnRoKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBpc0N1cnJlbnRZZWFyKHZhbHVlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdEYXRlLmdldEZ1bGxZZWFyKCkgPT09IHZhbHVlLmdldEZ1bGxZZWFyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBpc1NlbGVjdGVkKGRhdGU6IElDYWxlbmRhckRhdGUpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHNlbGVjdGVkRGF0ZXM6IERhdGUgfCBEYXRlW107XG4gICAgICAgIGlmICh0aGlzLmlzRGF0ZURpc2FibGVkKGRhdGUuZGF0ZSkgfHwgIXRoaXMudmFsdWUgfHxcbiAgICAgICAgICAgIChBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpICYmIHRoaXMudmFsdWUubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgKSAge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uID09PSBDYWxlbmRhclNlbGVjdGlvbi5TSU5HTEUpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkRGF0ZXMgPSAodGhpcy52YWx1ZSBhcyBEYXRlKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERhdGVPbmx5KHNlbGVjdGVkRGF0ZXMpLmdldFRpbWUoKSA9PT0gZGF0ZS5kYXRlLmdldFRpbWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGVjdGVkRGF0ZXMgPSAodGhpcy52YWx1ZSBhcyBEYXRlW10pO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24gPT09IENhbGVuZGFyU2VsZWN0aW9uLlJBTkdFICYmIHNlbGVjdGVkRGF0ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXREYXRlT25seShzZWxlY3RlZERhdGVzWzBdKS5nZXRUaW1lKCkgPT09IGRhdGUuZGF0ZS5nZXRUaW1lKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24gPT09IENhbGVuZGFyU2VsZWN0aW9uLk1VTFRJKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuZ2V0RGF0ZU9ubHkoc2VsZWN0ZWREYXRlc1swXSk7XG4gICAgICAgICAgICBjb25zdCBlbmQgPSB0aGlzLmdldERhdGVPbmx5KHNlbGVjdGVkRGF0ZXNbc2VsZWN0ZWREYXRlcy5sZW5ndGggLSAxXSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzV2l0aGluUmFuZ2UoZGF0ZS5kYXRlLCBmYWxzZSwgc3RhcnQsIGVuZCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50RGF0ZSA9IHNlbGVjdGVkRGF0ZXMuZmluZChlbGVtZW50ID0+IGVsZW1lbnQuZ2V0VGltZSgpID09PSBkYXRlLmRhdGUuZ2V0VGltZSgpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gISFjdXJyZW50RGF0ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc1dpdGhpblJhbmdlKGRhdGUuZGF0ZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGlzTGFzdEluUmFuZ2UoZGF0ZTogSUNhbGVuZGFyRGF0ZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy5pc1NpbmdsZVNlbGVjdGlvbiB8fCAhdGhpcy52YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0ZXMgPSB0aGlzLnZhbHVlIGFzIERhdGVbXTtcbiAgICAgICAgY29uc3QgbGFzdERhdGUgPSBkYXRlc1tkYXRlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgcmV0dXJuIGlzRXF1YWwobGFzdERhdGUsIGRhdGUuZGF0ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBpc0ZpcnN0SW5SYW5nZShkYXRlOiBJQ2FsZW5kYXJEYXRlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmlzU2luZ2xlU2VsZWN0aW9uIHx8ICF0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaXNFcXVhbCgodGhpcy52YWx1ZSBhcyBEYXRlW10pWzBdLCBkYXRlLmRhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNXaXRoaW5SYW5nZShkYXRlOiBEYXRlLCBjaGVja0ZvclJhbmdlOiBib29sZWFuLCBtaW4/OiBEYXRlLCBtYXg/OiBEYXRlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChjaGVja0ZvclJhbmdlICYmICEoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSAmJiB0aGlzLnZhbHVlLmxlbmd0aCA+IDEpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBtaW4gPSBtaW4gPyBtaW4gOiB0aGlzLnZhbHVlWzBdO1xuICAgICAgICBtYXggPSBtYXggPyBtYXggOiB0aGlzLnZhbHVlWyh0aGlzLnZhbHVlIGFzIERhdGVbXSkubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgcmV0dXJuIGlzRGF0ZUluUmFuZ2VzKGRhdGUsXG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBEYXRlUmFuZ2VUeXBlLkJldHdlZW4sXG4gICAgICAgICAgICAgICAgICAgIGRhdGVSYW5nZTogW21pbiwgbWF4XVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZm9jdXNBY3RpdmVEYXRlKCkge1xuICAgICAgICBsZXQgZGF0ZSA9IHRoaXMuZGF0ZXMuZmluZCgoZCkgPT4gZC5zZWxlY3RlZCk7XG5cbiAgICAgICAgaWYgKCFkYXRlKSB7XG4gICAgICAgICAgICBkYXRlID0gdGhpcy5kYXRlcy5maW5kKChkKSA9PiBkLmlzVG9kYXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRhdGUuaXNGb2N1c2FibGUpIHtcbiAgICAgICAgICAgIGRhdGUubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3REYXkoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3REYXRlRnJvbUNsaWVudChldmVudC5kYXRlKTtcbiAgICAgICAgdGhpcy5vbkRhdGVTZWxlY3Rpb24uZW1pdChldmVudCk7XG5cbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbi5lbWl0KHRoaXMuc2VsZWN0ZWREYXRlcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgZGlzYWJsZU91dE9mUmFuZ2VEYXRlcygpIHtcbiAgICAgICAgY29uc3QgZGF0ZVJhbmdlID0gW107XG4gICAgICAgIHRoaXMuZGF0ZXMudG9BcnJheSgpLmZvckVhY2goKGRhdGUpID0+IHtcbiAgICAgICAgICAgIGlmICghZGF0ZS5pc0N1cnJlbnRNb250aCkge1xuICAgICAgICAgICAgICAgIGRhdGVSYW5nZS5wdXNoKGRhdGUuZGF0ZS5kYXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5vdXRPZlJhbmdlRGF0ZXMgPSBbe1xuICAgICAgICAgICAgdHlwZTogRGF0ZVJhbmdlVHlwZS5TcGVjaWZpYyxcbiAgICAgICAgICAgIGRhdGVSYW5nZTogZGF0ZVJhbmdlXG4gICAgICAgIH1dO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Rmlyc3RNb250aFZpZXcoKTogSWd4RGF5c1ZpZXdDb21wb25lbnQge1xuICAgICAgICBsZXQgbW9udGhWaWV3ID0gdGhpcyBhcyBJZ3hEYXlzVmlld0NvbXBvbmVudDtcbiAgICAgICAgd2hpbGUgKG1vbnRoVmlldy5wcmV2TW9udGhWaWV3KSB7XG4gICAgICAgICAgICBtb250aFZpZXcgPSBtb250aFZpZXcucHJldk1vbnRoVmlldztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbW9udGhWaWV3O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldExhc3RNb250aFZpZXcoKTogSWd4RGF5c1ZpZXdDb21wb25lbnQge1xuICAgICAgICBsZXQgbW9udGhWaWV3ID0gdGhpcyBhcyBJZ3hEYXlzVmlld0NvbXBvbmVudDtcbiAgICAgICAgd2hpbGUgKG1vbnRoVmlldy5uZXh0TW9udGhWaWV3KSB7XG4gICAgICAgICAgICBtb250aFZpZXcgPSBtb250aFZpZXcubmV4dE1vbnRoVmlldztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbW9udGhWaWV3O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldCBpc1NpbmdsZVNlbGVjdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uICE9PSBDYWxlbmRhclNlbGVjdGlvbi5SQU5HRTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5hcnJvd2xlZnQnLCBbJyRldmVudCddKVxuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uYXJyb3dyaWdodCcsIFsnJGV2ZW50J10pXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5hcnJvd3VwJywgWyckZXZlbnQnXSlcbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmFycm93ZG93bicsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkFycm93KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLm5hdlNlcnZpY2UuZm9jdXNOZXh0RGF0ZShldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQsIGV2ZW50LmtleSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uaG9tZScsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkhvbWUoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuZ2V0Rmlyc3RNb250aFZpZXcoKS5uYXZTZXJ2aWNlLmZvY3VzSG9tZURhdGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5lbmQnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbktleWRvd25FbmQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuZ2V0TGFzdE1vbnRoVmlldygpLm5hdlNlcnZpY2UuZm9jdXNFbmREYXRlKCk7XG4gICAgfVxufVxuIl19