@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
334 lines • 33.9 kB
JavaScript
var IgxDaysViewComponent_1;
import { __decorate, __metadata } 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';
let NEXT_ID = 0;
let IgxDaysViewComponent = IgxDaysViewComponent_1 = class IgxDaysViewComponent extends IgxCalendarBaseDirective {
/**
* @hidden
*/
constructor(navService) {
super();
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;
}
/**
* @hidden
*/
get getCalendarMonth() {
return this.calendarModel.monthdatescalendar(this.viewDate.getFullYear(), this.viewDate.getMonth(), true);
}
/**
* @hidden
*/
ngOnInit() {
this.navService.monthView = this;
}
/**
* @hidden
*/
ngDoCheck() {
if (!this.changeDaysView && this.dates) {
this.disableOutOfRangeDates();
}
}
/**
* Returns the locale representation of the date in the days view.
*
* @hidden
*/
formattedDate(value) {
if (this.formatViews.day) {
return this.formatterDay.format(value);
}
return `${value.getDate()}`;
}
/**
* @hidden
*/
generateWeekHeader() {
const dayNames = [];
const rv = this.calendarModel.monthdatescalendar(this.viewDate.getFullYear(), this.viewDate.getMonth())[0];
for (const day of rv) {
dayNames.push(this.formatterWeekday.format(day.date));
}
return dayNames;
}
/**
* @hidden
*/
rowTracker(index, item) {
return `${item[index].date.getMonth()}${item[index].date.getDate()}`;
}
/**
* @hidden
*/
dateTracker(index, item) {
return `${item.date.getMonth()}--${item.date.getDate()}`;
}
/**
* @hidden
*/
isCurrentMonth(value) {
return this.viewDate.getMonth() === value.getMonth();
}
/**
* @hidden
*/
isCurrentYear(value) {
return this.viewDate.getFullYear() === value.getFullYear();
}
/**
* @hidden
*/
isSelected(date) {
let 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) {
const start = this.getDateOnly(selectedDates[0]);
const end = this.getDateOnly(selectedDates[selectedDates.length - 1]);
if (this.isWithinRange(date.date, false, start, end)) {
const currentDate = selectedDates.find(element => element.getTime() === date.date.getTime());
return !!currentDate;
}
else {
return false;
}
}
else {
return this.isWithinRange(date.date, true);
}
}
/**
* @hidden
*/
isLastInRange(date) {
if (this.isSingleSelection || !this.value) {
return false;
}
const dates = this.value;
const lastDate = dates[dates.length - 1];
return isEqual(lastDate, date.date);
}
/**
* @hidden
*/
isFirstInRange(date) {
if (this.isSingleSelection || !this.value) {
return false;
}
return isEqual(this.value[0], date.date);
}
/**
* @hidden
*/
isWithinRange(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
*/
focusActiveDate() {
let date = this.dates.find((d) => d.selected);
if (!date) {
date = this.dates.find((d) => d.isToday);
}
if (date.isFocusable) {
date.nativeElement.focus();
}
}
/**
* @hidden
*/
selectDay(event) {
this.selectDateFromClient(event.date);
this.onDateSelection.emit(event);
this.onSelection.emit(this.selectedDates);
}
/**
* @hidden
*/
disableOutOfRangeDates() {
const dateRange = [];
this.dates.toArray().forEach((date) => {
if (!date.isCurrentMonth) {
dateRange.push(date.date.date);
}
});
this.outOfRangeDates = [{
type: DateRangeType.Specific,
dateRange: dateRange
}];
}
/**
* @hidden
*/
getFirstMonthView() {
let monthView = this;
while (monthView.prevMonthView) {
monthView = monthView.prevMonthView;
}
return monthView;
}
/**
* @hidden
*/
getLastMonthView() {
let monthView = this;
while (monthView.nextMonthView) {
monthView = monthView.nextMonthView;
}
return monthView;
}
/**
* @hidden
*/
get isSingleSelection() {
return this.selection !== CalendarSelection.RANGE;
}
/**
* @hidden
*/
onKeydownArrow(event) {
event.preventDefault();
event.stopPropagation();
this.navService.focusNextDate(event.target, event.key);
}
/**
* @hidden
*/
onKeydownHome(event) {
event.preventDefault();
event.stopPropagation();
this.getFirstMonthView().navService.focusHomeDate();
}
/**
* @hidden
*/
onKeydownEnd(event) {
event.preventDefault();
event.stopPropagation();
this.getLastMonthView().navService.focusEndDate();
}
};
IgxDaysViewComponent.ctorParameters = () => [
{ 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);
export { IgxDaysViewComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF5cy12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY2FsZW5kYXIvZGF5cy12aWV3L2RheXMtdmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULE1BQU0sRUFDTixZQUFZLEVBQ1osS0FBSyxFQUNMLFlBQVksRUFDWixZQUFZLEVBQ1osU0FBUyxFQUNULFdBQVcsRUFHZCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWlCLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNELE9BQU8sRUFBdUIsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDL0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTNDLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRTdFLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztBQWNoQixJQUFhLG9CQUFvQiw0QkFBakMsTUFBYSxvQkFBcUIsU0FBUSx3QkFBd0I7SUE4RDlEOztPQUVHO0lBQ0gsWUFBbUIsVUFBd0M7UUFDdkQsS0FBSyxFQUFFLENBQUM7UUFETyxlQUFVLEdBQVYsVUFBVSxDQUE4QjtRQWhFM0Q7Ozs7Ozs7OztXQVNHO1FBR0ksT0FBRSxHQUFHLGlCQUFpQixPQUFPLEVBQUUsRUFBRSxDQUFDO1FBRXpDOztXQUVHO1FBRUksbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFFOUI7O1dBRUc7UUFFSSxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO1FBRTNEOztXQUVHO1FBRUksbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBMEIsQ0FBQztRQXVCbkU7Ozs7V0FJRztRQUVJLGVBQVUsR0FBRyxJQUFJLENBQUM7SUFPekIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxnQkFBZ0I7UUFDdkIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5RyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxRQUFRO1FBQ1gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVM7UUFDWixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1NBQ2pDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxhQUFhLENBQUMsS0FBVztRQUM1QixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ3RCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDMUM7UUFDRCxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksa0JBQWtCO1FBQ3JCLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNwQixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNHLEtBQUssTUFBTSxHQUFHLElBQUksRUFBRSxFQUFFO1lBQ2xCLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUN6RDtRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7T0FFRztJQUNJLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSTtRQUN6QixPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7SUFDekUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJO1FBQzFCLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxjQUFjLENBQUMsS0FBVztRQUM3QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEtBQUssS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3pELENBQUM7SUFFRDs7T0FFRztJQUNJLGFBQWEsQ0FBQyxLQUFXO1FBQzVCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDL0QsQ0FBQztJQUVEOztPQUVHO0lBQ0ksVUFBVSxDQUFDLElBQW1CO1FBQ2pDLElBQUksYUFBNEIsQ0FBQztRQUNqQyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFDN0MsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsRUFDbkQ7WUFDSCxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUU7WUFDN0MsYUFBYSxHQUFJLElBQUksQ0FBQyxLQUFjLENBQUM7WUFDckMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDNUU7UUFFRCxhQUFhLEdBQUksSUFBSSxDQUFDLEtBQWdCLENBQUM7UUFDdkMsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLGlCQUFpQixDQUFDLEtBQUssSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMxRSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUMvRTtRQUVELElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUU7WUFDNUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFdEUsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDbEQsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQzdGLE9BQU8sQ0FBQyxDQUFDLFdBQVcsQ0FBQzthQUN4QjtpQkFBTTtnQkFDSCxPQUFPLEtBQUssQ0FBQzthQUNoQjtTQUVKO2FBQU07WUFDSCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUM5QztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLGFBQWEsQ0FBQyxJQUFtQjtRQUNwQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDdkMsT0FBTyxLQUFLLENBQUM7U0FDaEI7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBZSxDQUFDO1FBQ25DLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLE9BQU8sT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksY0FBYyxDQUFDLElBQW1CO1FBQ3JDLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUN2QyxPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUVELE9BQU8sT0FBTyxDQUFFLElBQUksQ0FBQyxLQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxhQUFhLENBQUMsSUFBVSxFQUFFLGFBQXNCLEVBQUUsR0FBVSxFQUFFLEdBQVU7UUFDM0UsSUFBSSxhQUFhLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ3hFLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBRUQsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBRSxJQUFJLENBQUMsS0FBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFaEUsT0FBTyxjQUFjLENBQUMsSUFBSSxFQUN0QjtZQUNJO2dCQUNJLElBQUksRUFBRSxhQUFhLENBQUMsT0FBTztnQkFDM0IsU0FBUyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQzthQUN4QjtTQUNKLENBQ0osQ0FBQztJQUNOLENBQUM7SUFFRDs7T0FFRztJQUNJLGVBQWU7UUFDbEIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU5QyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1AsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDNUM7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUM5QjtJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVMsQ0FBQyxLQUFLO1FBQ2xCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRDs7T0FFRztJQUNLLHNCQUFzQjtRQUMxQixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtnQkFDdEIsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2xDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUM7Z0JBQ3BCLElBQUksRUFBRSxhQUFhLENBQUMsUUFBUTtnQkFDNUIsU0FBUyxFQUFFLFNBQVM7YUFDdkIsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOztPQUVHO0lBQ0ksaUJBQWlCO1FBQ3BCLElBQUksU0FBUyxHQUFHLElBQTRCLENBQUM7UUFDN0MsT0FBTyxTQUFTLENBQUMsYUFBYSxFQUFFO1lBQzVCLFNBQVMsR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDO1NBQ3ZDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZ0JBQWdCO1FBQ3BCLElBQUksU0FBUyxHQUFHLElBQTRCLENBQUM7UUFDN0MsT0FBTyxTQUFTLENBQUMsYUFBYSxFQUFFO1lBQzVCLFNBQVMsR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDO1NBQ3ZDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBWSxpQkFBaUI7UUFDekIsT0FBTyxJQUFJLENBQUMsU0FBUyxLQUFLLGlCQUFpQixDQUFDLEtBQUssQ0FBQztJQUN0RCxDQUFDO0lBRUQ7O09BRUc7SUFLSSxjQUFjLENBQUMsS0FBb0I7UUFDdEMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBcUIsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVEOztPQUVHO0lBRUksYUFBYSxDQUFDLEtBQW9CO1FBQ3JDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFFRDs7T0FFRztJQUVJLFlBQVksQ0FBQyxLQUFvQjtRQUNwQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0NBQ0osQ0FBQTs7WUF6UWtDLDRCQUE0Qjs7QUFwRDNEO0lBRkMsV0FBVyxDQUFDLFNBQVMsQ0FBQztJQUN0QixLQUFLLEVBQUU7O2dEQUNpQztBQU16QztJQURDLEtBQUssRUFBRTs7NERBQ3NCO0FBTTlCO0lBREMsTUFBTSxFQUFFOzs2REFDa0Q7QUFNM0Q7SUFEQyxNQUFNLEVBQUU7OzREQUMwRDtBQU1uRTtJQURDLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxDQUFDOzhCQUNuRCxTQUFTO21EQUFzQjtBQXVCN0M7SUFEQyxXQUFXLENBQUMsb0JBQW9CLENBQUM7O3dEQUNUO0FBcVB6QjtJQUpDLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLFlBQVksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNDLFlBQVksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDOztxQ0FDakIsYUFBYTs7MERBSXpDO0FBTUQ7SUFEQyxZQUFZLENBQUMsY0FBYyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7O3FDQUNiLGFBQWE7O3lEQUl4QztBQU1EO0lBREMsWUFBWSxDQUFDLGFBQWEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDOztxQ0FDYixhQUFhOzt3REFJdkM7QUF6VVEsb0JBQW9CO0lBWmhDLFNBQVMsQ0FBQztRQUNQLFNBQVMsRUFBRTtZQUNQO2dCQUNJLEtBQUssRUFBRSxJQUFJO2dCQUNYLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxzQkFBb0I7YUFDcEM7WUFDRCxFQUFFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxRQUFRLEVBQUUsNEJBQTRCLEVBQUU7U0FDcEY7UUFDRCxRQUFRLEVBQUUsZUFBZTtRQUN6QixrOEJBQXVDO0tBQzFDLENBQUM7cUNBa0VpQyw0QkFBNEI7R0FqRWxELG9CQUFvQixDQTBVaEM7U0ExVVksb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgT3V0cHV0LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBIb3N0QmluZGluZyxcbiAgICBEb0NoZWNrLFxuICAgIE9uSW5pdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElDYWxlbmRhckRhdGUsIGlzRGF0ZUluUmFuZ2VzIH0gZnJvbSAnLi4vLi4vY2FsZW5kYXIvY2FsZW5kYXInO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJZ3hEYXlJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9kYXktaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0ZVJhbmdlRGVzY3JpcHRvciwgRGF0ZVJhbmdlVHlwZSB9IGZyb20gJy4uLy4uL2NvcmUvZGF0ZXMnO1xuaW1wb3J0IHsgSWd4Q2FsZW5kYXJCYXNlRGlyZWN0aXZlLCBDYWxlbmRhclNlbGVjdGlvbiB9IGZyb20gJy4uL2NhbGVuZGFyLWJhc2UnO1xuaW1wb3J0IHsgaXNFcXVhbCB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMnO1xuaW1wb3J0IHsgSVZpZXdDaGFuZ2luZ0V2ZW50QXJncyB9IGZyb20gJy4vZGF5cy12aWV3LmludGVyZmFjZSc7XG5pbXBvcnQgeyBJZ3hEYXlzVmlld05hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9kYXlzdmlldy1uYXZpZ2F0aW9uLnNlcnZpY2UnO1xuXG5sZXQgTkVYVF9JRCA9IDA7XG5cbkBDb21wb25lbnQoe1xuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IElneERheXNWaWV3Q29tcG9uZW50XG4gICAgICAgIH0sXG4gICAgICAgIHsgcHJvdmlkZTogSWd4RGF5c1ZpZXdOYXZpZ2F0aW9uU2VydmljZSwgdXNlQ2xhc3M6IElneERheXNWaWV3TmF2aWdhdGlvblNlcnZpY2UgfVxuICAgIF0sXG4gICAgc2VsZWN0b3I6ICdpZ3gtZGF5cy12aWV3JyxcbiAgICB0ZW1wbGF0ZVVybDogJ2RheXMtdmlldy5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgSWd4RGF5c1ZpZXdDb21wb25lbnQgZXh0ZW5kcyBJZ3hDYWxlbmRhckJhc2VEaXJlY3RpdmUgaW1wbGVtZW50cyBEb0NoZWNrLCBPbkluaXQge1xuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB0aGUgYGlkYCBvZiB0aGUgZGF5cyB2aWV3LlxuICAgICAqIElmIG5vdCBzZXQsIHRoZSBgaWRgIHdpbGwgaGF2ZSB2YWx1ZSBgXCJpZ3gtZGF5cy12aWV3LTBcImAuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtZGF5cy12aWV3IGlkPVwibXktZGF5cy12aWV3XCI+PC9pZ3gtZGF5cy12aWV3PlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgZGF5c1ZpZXdJZCA9ICB0aGlzLmRheXNWaWV3LmlkO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaWQgPSBgaWd4LWRheXMtdmlldy0ke05FWFRfSUQrK31gO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGNoYW5nZURheXNWaWV3ID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uRGF0ZVNlbGVjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8SUNhbGVuZGFyRGF0ZT4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25WaWV3Q2hhbmdpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPElWaWV3Q2hhbmdpbmdFdmVudEFyZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQFZpZXdDaGlsZHJlbihJZ3hEYXlJdGVtQ29tcG9uZW50LCB7IHJlYWQ6IElneERheUl0ZW1Db21wb25lbnQgfSlcbiAgICBwdWJsaWMgZGF0ZXM6IFF1ZXJ5TGlzdDxJZ3hEYXlJdGVtQ29tcG9uZW50PjtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgb3V0T2ZSYW5nZURhdGVzOiBEYXRlUmFuZ2VEZXNjcmlwdG9yW107XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG5leHRNb250aFZpZXc6IElneERheXNWaWV3Q29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBwcmV2TW9udGhWaWV3OiBJZ3hEYXlzVmlld0NvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IGNzcyBjbGFzcyBhcHBsaWVkIHRvIHRoZSBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtY2FsZW5kYXInKVxuICAgIHB1YmxpYyBzdHlsZUNsYXNzID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbmF2U2VydmljZTogSWd4RGF5c1ZpZXdOYXZpZ2F0aW9uU2VydmljZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGdldENhbGVuZGFyTW9udGgoKTogSUNhbGVuZGFyRGF0ZVtdW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhck1vZGVsLm1vbnRoZGF0ZXNjYWxlbmRhcih0aGlzLnZpZXdEYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMudmlld0RhdGUuZ2V0TW9udGgoKSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy5uYXZTZXJ2aWNlLm1vbnRoVmlldyA9IHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0RvQ2hlY2soKSB7XG4gICAgICAgIGlmICghdGhpcy5jaGFuZ2VEYXlzVmlldyAmJiB0aGlzLmRhdGVzKSB7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVPdXRPZlJhbmdlRGF0ZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGxvY2FsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF0ZSBpbiB0aGUgZGF5cyB2aWV3LlxuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBmb3JtYXR0ZWREYXRlKHZhbHVlOiBEYXRlKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuZm9ybWF0Vmlld3MuZGF5KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXR0ZXJEYXkuZm9ybWF0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7dmFsdWUuZ2V0RGF0ZSgpfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZW5lcmF0ZVdlZWtIZWFkZXIoKTogc3RyaW5nW10ge1xuICAgICAgICBjb25zdCBkYXlOYW1lcyA9IFtdO1xuICAgICAgICBjb25zdCBydiA9IHRoaXMuY2FsZW5kYXJNb2RlbC5tb250aGRhdGVzY2FsZW5kYXIodGhpcy52aWV3RGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLnZpZXdEYXRlLmdldE1vbnRoKCkpWzBdO1xuICAgICAgICBmb3IgKGNvbnN0IGRheSBvZiBydikge1xuICAgICAgICAgICAgZGF5TmFtZXMucHVzaCh0aGlzLmZvcm1hdHRlcldlZWtkYXkuZm9ybWF0KGRheS5kYXRlKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF5TmFtZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyByb3dUcmFja2VyKGluZGV4LCBpdGVtKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke2l0ZW1baW5kZXhdLmRhdGUuZ2V0TW9udGgoKX0ke2l0ZW1baW5kZXhdLmRhdGUuZ2V0RGF0ZSgpfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBkYXRlVHJhY2tlcihpbmRleCwgaXRlbSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHtpdGVtLmRhdGUuZ2V0TW9udGgoKX0tLSR7aXRlbS5kYXRlLmdldERhdGUoKX1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNDdXJyZW50TW9udGgodmFsdWU6IERhdGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0RhdGUuZ2V0TW9udGgoKSA9PT0gdmFsdWUuZ2V0TW9udGgoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGlzQ3VycmVudFllYXIodmFsdWU6IERhdGUpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0RhdGUuZ2V0RnVsbFllYXIoKSA9PT0gdmFsdWUuZ2V0RnVsbFllYXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGlzU2VsZWN0ZWQoZGF0ZTogSUNhbGVuZGFyRGF0ZSk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgc2VsZWN0ZWREYXRlczogRGF0ZSB8IERhdGVbXTtcbiAgICAgICAgaWYgKHRoaXMuaXNEYXRlRGlzYWJsZWQoZGF0ZS5kYXRlKSB8fCAhdGhpcy52YWx1ZSB8fFxuICAgICAgICAgICAgKEFycmF5LmlzQXJyYXkodGhpcy52YWx1ZSkgJiYgdGhpcy52YWx1ZS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICApICB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24gPT09IENhbGVuZGFyU2VsZWN0aW9uLlNJTkdMRSkge1xuICAgICAgICAgICAgc2VsZWN0ZWREYXRlcyA9ICh0aGlzLnZhbHVlIGFzIERhdGUpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGF0ZU9ubHkoc2VsZWN0ZWREYXRlcykuZ2V0VGltZSgpID09PSBkYXRlLmRhdGUuZ2V0VGltZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VsZWN0ZWREYXRlcyA9ICh0aGlzLnZhbHVlIGFzIERhdGVbXSk7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbiA9PT0gQ2FsZW5kYXJTZWxlY3Rpb24uUkFOR0UgJiYgc2VsZWN0ZWREYXRlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERhdGVPbmx5KHNlbGVjdGVkRGF0ZXNbMF0pLmdldFRpbWUoKSA9PT0gZGF0ZS5kYXRlLmdldFRpbWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbiA9PT0gQ2FsZW5kYXJTZWxlY3Rpb24uTVVMVEkpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5nZXREYXRlT25seShzZWxlY3RlZERhdGVzWzBdKTtcbiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRoaXMuZ2V0RGF0ZU9ubHkoc2VsZWN0ZWREYXRlc1tzZWxlY3RlZERhdGVzLmxlbmd0aCAtIDFdKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNXaXRoaW5SYW5nZShkYXRlLmRhdGUsIGZhbHNlLCBzdGFydCwgZW5kKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gc2VsZWN0ZWREYXRlcy5maW5kKGVsZW1lbnQgPT4gZWxlbWVudC5nZXRUaW1lKCkgPT09IGRhdGUuZGF0ZS5nZXRUaW1lKCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiAhIWN1cnJlbnREYXRlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzV2l0aGluUmFuZ2UoZGF0ZS5kYXRlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNMYXN0SW5SYW5nZShkYXRlOiBJQ2FsZW5kYXJEYXRlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmlzU2luZ2xlU2VsZWN0aW9uIHx8ICF0aGlzLnZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRlcyA9IHRoaXMudmFsdWUgYXMgRGF0ZVtdO1xuICAgICAgICBjb25zdCBsYXN0RGF0ZSA9IGRhdGVzW2RhdGVzLmxlbmd0aCAtIDFdO1xuICAgICAgICByZXR1cm4gaXNFcXVhbChsYXN0RGF0ZSwgZGF0ZS5kYXRlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGlzRmlyc3RJblJhbmdlKGRhdGU6IElDYWxlbmRhckRhdGUpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuaXNTaW5nbGVTZWxlY3Rpb24gfHwgIXRoaXMudmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpc0VxdWFsKCh0aGlzLnZhbHVlIGFzIERhdGVbXSlbMF0sIGRhdGUuZGF0ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBpc1dpdGhpblJhbmdlKGRhdGU6IERhdGUsIGNoZWNrRm9yUmFuZ2U6IGJvb2xlYW4sIG1pbj86IERhdGUsIG1heD86IERhdGUpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGNoZWNrRm9yUmFuZ2UgJiYgIShBcnJheS5pc0FycmF5KHRoaXMudmFsdWUpICYmIHRoaXMudmFsdWUubGVuZ3RoID4gMSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1pbiA9IG1pbiA/IG1pbiA6IHRoaXMudmFsdWVbMF07XG4gICAgICAgIG1heCA9IG1heCA/IG1heCA6IHRoaXMudmFsdWVbKHRoaXMudmFsdWUgYXMgRGF0ZVtdKS5sZW5ndGggLSAxXTtcblxuICAgICAgICByZXR1cm4gaXNEYXRlSW5SYW5nZXMoZGF0ZSxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IERhdGVSYW5nZVR5cGUuQmV0d2VlbixcbiAgICAgICAgICAgICAgICAgICAgZGF0ZVJhbmdlOiBbbWluLCBtYXhdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBmb2N1c0FjdGl2ZURhdGUoKSB7XG4gICAgICAgIGxldCBkYXRlID0gdGhpcy5kYXRlcy5maW5kKChkKSA9PiBkLnNlbGVjdGVkKTtcblxuICAgICAgICBpZiAoIWRhdGUpIHtcbiAgICAgICAgICAgIGRhdGUgPSB0aGlzLmRhdGVzLmZpbmQoKGQpID0+IGQuaXNUb2RheSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0ZS5pc0ZvY3VzYWJsZSkge1xuICAgICAgICAgICAgZGF0ZS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdERheShldmVudCkge1xuICAgICAgICB0aGlzLnNlbGVjdERhdGVGcm9tQ2xpZW50KGV2ZW50LmRhdGUpO1xuICAgICAgICB0aGlzLm9uRGF0ZVNlbGVjdGlvbi5lbWl0KGV2ZW50KTtcblxuICAgICAgICB0aGlzLm9uU2VsZWN0aW9uLmVtaXQodGhpcy5zZWxlY3RlZERhdGVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBkaXNhYmxlT3V0T2ZSYW5nZURhdGVzKCkge1xuICAgICAgICBjb25zdCBkYXRlUmFuZ2UgPSBbXTtcbiAgICAgICAgdGhpcy5kYXRlcy50b0FycmF5KCkuZm9yRWFjaCgoZGF0ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFkYXRlLmlzQ3VycmVudE1vbnRoKSB7XG4gICAgICAgICAgICAgICAgZGF0ZVJhbmdlLnB1c2goZGF0ZS5kYXRlLmRhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm91dE9mUmFuZ2VEYXRlcyA9IFt7XG4gICAgICAgICAgICB0eXBlOiBEYXRlUmFuZ2VUeXBlLlNwZWNpZmljLFxuICAgICAgICAgICAgZGF0ZVJhbmdlOiBkYXRlUmFuZ2VcbiAgICAgICAgfV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGaXJzdE1vbnRoVmlldygpOiBJZ3hEYXlzVmlld0NvbXBvbmVudCB7XG4gICAgICAgIGxldCBtb250aFZpZXcgPSB0aGlzIGFzIElneERheXNWaWV3Q29tcG9uZW50O1xuICAgICAgICB3aGlsZSAobW9udGhWaWV3LnByZXZNb250aFZpZXcpIHtcbiAgICAgICAgICAgIG1vbnRoVmlldyA9IG1vbnRoVmlldy5wcmV2TW9udGhWaWV3O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtb250aFZpZXc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0TGFzdE1vbnRoVmlldygpOiBJZ3hEYXlzVmlld0NvbXBvbmVudCB7XG4gICAgICAgIGxldCBtb250aFZpZXcgPSB0aGlzIGFzIElneERheXNWaWV3Q29tcG9uZW50O1xuICAgICAgICB3aGlsZSAobW9udGhWaWV3Lm5leHRNb250aFZpZXcpIHtcbiAgICAgICAgICAgIG1vbnRoVmlldyA9IG1vbnRoVmlldy5uZXh0TW9udGhWaWV3O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtb250aFZpZXc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0IGlzU2luZ2xlU2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24gIT09IENhbGVuZGFyU2VsZWN0aW9uLlJBTkdFO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmFycm93bGVmdCcsIFsnJGV2ZW50J10pXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5hcnJvd3JpZ2h0JywgWyckZXZlbnQnXSlcbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmFycm93dXAnLCBbJyRldmVudCddKVxuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uYXJyb3dkb3duJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25LZXlkb3duQXJyb3coZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMubmF2U2VydmljZS5mb2N1c05leHREYXRlKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCwgZXZlbnQua2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5ob21lJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25LZXlkb3duSG9tZShldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5nZXRGaXJzdE1vbnRoVmlldygpLm5hdlNlcnZpY2UuZm9jdXNIb21lRGF0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmVuZCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkVuZChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5nZXRMYXN0TW9udGhWaWV3KCkubmF2U2VydmljZS5mb2N1c0VuZERhdGUoKTtcbiAgICB9XG59XG4iXX0=