@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
182 lines • 24.8 kB
JavaScript
import { __decorate } from "tslib";
import { Injectable } from '@angular/core';
import { ScrollMonth } from '../calendar-base';
var Direction;
(function (Direction) {
Direction["Up"] = "ArrowUp";
Direction["Down"] = "ArrowDown";
Direction["Left"] = "ArrowLeft";
Direction["Right"] = "ArrowRight";
})(Direction || (Direction = {}));
var ARROW = 'Arrow';
/** @hidden */
var IgxDaysViewNavigationService = /** @class */ (function () {
function IgxDaysViewNavigationService() {
}
/**
* Implements kb navigation in all MoveDirections. nextDate and nextMonthView naming convention is used for both previous/next
* @hidden
*/
IgxDaysViewNavigationService.prototype.focusNextDate = function (target, key, nextView) {
if (nextView === void 0) { nextView = false; }
if (target.childElementCount === 0) {
target = target.parentElement;
}
if (key.indexOf('Arrow') === -1) {
key = ARROW.concat(key);
}
var monthView = this.monthView;
var node = monthView.dates.find(function (date) { return date.nativeElement === target; });
var dates = monthView.dates.toArray(), day, step, i, nextDate;
var index = dates.indexOf(node);
if (!node) {
return;
}
// focus item in current month
switch (key) {
case Direction.Left: {
step = -1;
nextDate = this.timedelta(node.date.date, step);
for (i = index; i > 0; i--) {
day = nextView ? dates[i] : dates[i - 1];
nextDate = day.date.date;
if (day.date.isPrevMonth) {
break;
}
if (day && day.isFocusable) {
day.nativeElement.focus();
return;
}
}
break;
}
case Direction.Right: {
step = 1;
nextDate = this.timedelta(node.date.date, step);
for (i = index; i < dates.length - 1; i++) {
day = nextView ? dates[i] : dates[i + 1];
nextDate = day.date.date;
if (day.date.isNextMonth) {
break;
}
if (day && day.isFocusable) {
day.nativeElement.focus();
return;
}
}
break;
}
case Direction.Up: {
step = -7;
nextDate = this.timedelta(node.date.date, step);
for (i = index; i - 7 > -1; i -= 7) {
day = nextView ? dates[i] : dates[i - 7];
nextDate = day.date.date;
if (day.date.isPrevMonth) {
break;
}
if (day && day.isFocusable) {
day.nativeElement.focus();
return;
}
}
break;
}
case Direction.Down: {
step = 7;
nextDate = this.timedelta(node.date.date, step);
for (i = index; i + 7 < 42; i += 7) {
day = nextView ? dates[i] : dates[i + 7];
nextDate = day.date.date;
if (day.date.isNextMonth) {
break;
}
if (day && day.isFocusable) {
day.nativeElement.focus();
return;
}
}
break;
}
}
// focus item in prev/next visible month
var nextMonthView = step > 0 ? monthView.nextMonthView : monthView.prevMonthView;
if (nextMonthView) {
dates = nextMonthView.dates.toArray();
day = dates.find(function (item) { return item.date.date.getTime() === nextDate.getTime(); });
if (day && day.isFocusable) {
day.nativeElement.focus();
return;
}
nextMonthView.navService.focusNextDate(day.nativeElement, key);
}
// if iterating in the visible prev/next moths above found a day that is not focusable, ie is disabled, hidden, etc
// then it is needed to recalculate the next day, which is going to be part of the prev/next months
if (day && !day.isFocusable) {
day = dates[i + step];
if (!day) {
nextDate = this.timedelta(node.date.date, step + i - index);
}
}
// focus item in prev/next month, which is currently out of view
var dayIsNextMonth; // determine what we need to check for next date - if it belongs to prev or next month
if (day) {
dayIsNextMonth = step > 0 ? day.date.isNextMonth : day.date.isPrevMonth;
}
if (monthView.changeDaysView && !nextMonthView && ((day && dayIsNextMonth) || !day)) {
var monthAction = step > 0 ? ScrollMonth.NEXT : ScrollMonth.PREV;
monthView.onViewChanging.emit({ monthAction: monthAction, key: key, nextDate: nextDate });
}
};
/**
* Focuses first focusable day in the month. Will go to next visible month, if no day in the first month is focusable
* @hidden
*/
IgxDaysViewNavigationService.prototype.focusHomeDate = function () {
var monthView = this.monthView;
while (!this.focusFirstDay(monthView) && monthView.nextMonthView) {
monthView = monthView.nextMonthView;
}
};
/**
* Focuses last focusable day in the month. Will go to previous visible month, if no day in the first month is focusable
* @hidden
*/
IgxDaysViewNavigationService.prototype.focusEndDate = function () {
var monthView = this.monthView;
while (!this.focusLastDay(monthView) && monthView.prevMonthView) {
monthView = monthView.prevMonthView;
}
};
IgxDaysViewNavigationService.prototype.timedelta = function (date, units) {
var ret = new Date(date);
ret.setDate(ret.getDate() + units);
return ret;
};
IgxDaysViewNavigationService.prototype.focusFirstDay = function (monthView) {
var dates = monthView.dates.filter(function (d) { return d.isCurrentMonth; });
for (var i = 0; i < dates.length; i++) {
if (dates[i].isFocusable) {
dates[i].nativeElement.focus();
return true;
}
}
return false;
};
IgxDaysViewNavigationService.prototype.focusLastDay = function (monthView) {
var dates = monthView.dates.filter(function (d) { return d.isCurrentMonth; });
for (var i = dates.length - 1; i >= 0; i--) {
if (dates[i].isFocusable) {
dates[i].nativeElement.focus();
return true;
}
}
return false;
};
IgxDaysViewNavigationService = __decorate([
Injectable()
], IgxDaysViewNavigationService);
return IgxDaysViewNavigationService;
}());
export { IgxDaysViewNavigationService };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF5c3ZpZXctbmF2aWdhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9jYWxlbmRhci9kYXlzLXZpZXcvZGF5c3ZpZXctbmF2aWdhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvQyxJQUFLLFNBS0o7QUFMRCxXQUFLLFNBQVM7SUFDViwyQkFBYyxDQUFBO0lBQ2QsK0JBQWtCLENBQUE7SUFDbEIsK0JBQWtCLENBQUE7SUFDbEIsaUNBQW9CLENBQUE7QUFDeEIsQ0FBQyxFQUxJLFNBQVMsS0FBVCxTQUFTLFFBS2I7QUFFRCxJQUFNLEtBQUssR0FBRyxPQUFPLENBQUM7QUFFdEIsY0FBYztBQUVkO0lBQUE7SUFxS0EsQ0FBQztJQW5LRzs7O09BR0c7SUFDSSxvREFBYSxHQUFwQixVQUFxQixNQUFtQixFQUFFLEdBQVcsRUFBRSxRQUFnQjtRQUFoQix5QkFBQSxFQUFBLGdCQUFnQjtRQUNuRSxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsS0FBSyxDQUFDLEVBQUU7WUFBRSxNQUFNLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztTQUFFO1FBQ3RFLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUFFLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQUU7UUFDN0QsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNqQyxJQUFNLElBQUksR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFDLElBQUksSUFBSyxPQUFBLElBQUksQ0FBQyxhQUFhLEtBQUssTUFBTSxFQUE3QixDQUE2QixD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QyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNuQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUU7Z0JBQ3RCLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQy9CLE9BQU8sSUFBSSxDQUFDO2FBQ2Y7U0FDSjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFTyxtREFBWSxHQUFwQixVQUFxQixTQUErQjtRQUNoRCxJQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxjQUFjLEVBQWhCLENBQWdCLENBQUMsQ0FBQztRQUM1RCxLQUFLLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDeEMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFO2dCQUN0QixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUMvQixPQUFPLElBQUksQ0FBQzthQUNmO1NBQ0o7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBcEtRLDRCQUE0QjtRQUR4QyxVQUFVLEVBQUU7T0FDQSw0QkFBNEIsQ0FxS3hDO0lBQUQsbUNBQUM7Q0FBQSxBQXJLRCxJQXFLQztTQXJLWSw0QkFBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJZ3hEYXlJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9kYXktaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4RGF5c1ZpZXdDb21wb25lbnQgfSBmcm9tICcuL2RheXMtdmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2Nyb2xsTW9udGggfSBmcm9tICcuLi9jYWxlbmRhci1iYXNlJztcblxuZW51bSBEaXJlY3Rpb24ge1xuICAgIFVwID0gJ0Fycm93VXAnLFxuICAgIERvd24gPSAnQXJyb3dEb3duJyxcbiAgICBMZWZ0ID0gJ0Fycm93TGVmdCcsXG4gICAgUmlnaHQgPSAnQXJyb3dSaWdodCcsXG59XG5cbmNvbnN0IEFSUk9XID0gJ0Fycm93JztcblxuLyoqIEBoaWRkZW4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBJZ3hEYXlzVmlld05hdmlnYXRpb25TZXJ2aWNlIHtcbiAgICBwdWJsaWMgbW9udGhWaWV3OiBJZ3hEYXlzVmlld0NvbXBvbmVudDtcbiAgICAvKipcbiAgICAgKiBJbXBsZW1lbnRzIGtiIG5hdmlnYXRpb24gaW4gYWxsIE1vdmVEaXJlY3Rpb25zLiBuZXh0RGF0ZSBhbmQgbmV4dE1vbnRoVmlldyBuYW1pbmcgY29udmVudGlvbiBpcyB1c2VkIGZvciBib3RoIHByZXZpb3VzL25leHRcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGZvY3VzTmV4dERhdGUodGFyZ2V0OiBIVE1MRWxlbWVudCwga2V5OiBzdHJpbmcsIG5leHRWaWV3ID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHRhcmdldC5jaGlsZEVsZW1lbnRDb3VudCA9PT0gMCkgeyB0YXJnZXQgPSB0YXJnZXQucGFyZW50RWxlbWVudDsgfVxuICAgICAgICBpZiAoa2V5LmluZGV4T2YoJ0Fycm93JykgPT09IC0xKSB7IGtleSA9IEFSUk9XLmNvbmNhdChrZXkpOyB9XG4gICAgICAgIGNvbnN0IG1vbnRoVmlldyA9IHRoaXMubW9udGhWaWV3O1xuICAgICAgICBjb25zdCBub2RlID0gbW9udGhWaWV3LmRhdGVzLmZpbmQoKGRhdGUpID0+IGRhdGUubmF0aXZlRWxlbWVudCA9PT0gdGFyZ2V0KTtcbiAgICAgICAgbGV0IGRhdGVzID0gbW9udGhWaWV3LmRhdGVzLnRvQXJyYXkoKSxcbiAgICAgICAgICAgIGRheTogSWd4RGF5SXRlbUNvbXBvbmVudCwgc3RlcCwgaSwgbmV4dERhdGU6IERhdGU7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gZGF0ZXMuaW5kZXhPZihub2RlKTtcblxuICAgICAgICBpZiAoIW5vZGUpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgLy8gZm9jdXMgaXRlbSBpbiBjdXJyZW50IG1vbnRoXG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlIERpcmVjdGlvbi5MZWZ0OiB7XG4gICAgICAgICAgICAgICAgc3RlcCA9IC0xO1xuICAgICAgICAgICAgICAgIG5leHREYXRlID0gdGhpcy50aW1lZGVsdGEobm9kZS5kYXRlLmRhdGUsIHN0ZXApO1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IGluZGV4OyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGRheSA9IG5leHRWaWV3ID8gZGF0ZXNbaV0gOiBkYXRlc1tpIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIG5leHREYXRlID0gZGF5LmRhdGUuZGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRheS5kYXRlLmlzUHJldk1vbnRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF5ICYmIGRheS5pc0ZvY3VzYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF5Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9uLlJpZ2h0OiB7XG4gICAgICAgICAgICAgICAgc3RlcCA9IDE7XG4gICAgICAgICAgICAgICAgbmV4dERhdGUgPSB0aGlzLnRpbWVkZWx0YShub2RlLmRhdGUuZGF0ZSwgc3RlcCk7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gaW5kZXg7IGkgPCBkYXRlcy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgZGF5ID0gbmV4dFZpZXcgPyBkYXRlc1tpXSA6IGRhdGVzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dERhdGUgPSBkYXkuZGF0ZS5kYXRlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF5LmRhdGUuaXNOZXh0TW9udGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXkgJiYgZGF5LmlzRm9jdXNhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXkubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBEaXJlY3Rpb24uVXA6IHtcbiAgICAgICAgICAgICAgICBzdGVwID0gLTc7XG4gICAgICAgICAgICAgICAgbmV4dERhdGUgPSB0aGlzLnRpbWVkZWx0YShub2RlLmRhdGUuZGF0ZSwgc3RlcCk7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gaW5kZXg7IGkgLSA3ID4gLTE7IGkgLT0gNykge1xuICAgICAgICAgICAgICAgICAgICBkYXkgPSBuZXh0VmlldyA/IGRhdGVzW2ldIDogZGF0ZXNbaSAtIDddO1xuICAgICAgICAgICAgICAgICAgICBuZXh0RGF0ZSA9IGRheS5kYXRlLmRhdGU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXkuZGF0ZS5pc1ByZXZNb250aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRheSAmJiBkYXkuaXNGb2N1c2FibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRheS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIERpcmVjdGlvbi5Eb3duOiB7XG4gICAgICAgICAgICAgICAgc3RlcCA9IDc7XG4gICAgICAgICAgICAgICAgbmV4dERhdGUgPSB0aGlzLnRpbWVkZWx0YShub2RlLmRhdGUuZGF0ZSwgc3RlcCk7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gaW5kZXg7IGkgKyA3IDwgNDI7IGkgKz0gNykge1xuICAgICAgICAgICAgICAgICAgICBkYXkgPSBuZXh0VmlldyA/IGRhdGVzW2ldIDogZGF0ZXNbaSArIDddO1xuICAgICAgICAgICAgICAgICAgICBuZXh0RGF0ZSA9IGRheS5kYXRlLmRhdGU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXkuZGF0ZS5pc05leHRNb250aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRheSAmJiBkYXkuaXNGb2N1c2FibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRheS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmb2N1cyBpdGVtIGluIHByZXYvbmV4dCB2aXNpYmxlIG1vbnRoXG4gICAgICAgIGNvbnN0IG5leHRNb250aFZpZXcgPSBzdGVwID4gMCA/IG1vbnRoVmlldy5uZXh0TW9udGhWaWV3IDogbW9udGhWaWV3LnByZXZNb250aFZpZXc7XG4gICAgICAgIGlmIChuZXh0TW9udGhWaWV3KSB7XG4gICAgICAgICAgICBkYXRlcyA9IG5leHRNb250aFZpZXcuZGF0ZXMudG9BcnJheSgpO1xuICAgICAgICAgICAgZGF5ID0gZGF0ZXMuZmluZCgoaXRlbSkgPT4gaXRlbS5kYXRlLmRhdGUuZ2V0VGltZSgpID09PSBuZXh0RGF0ZS5nZXRUaW1lKCkpO1xuXG4gICAgICAgICAgICBpZiAoZGF5ICYmIGRheS5pc0ZvY3VzYWJsZSkge1xuICAgICAgICAgICAgICAgIGRheS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dE1vbnRoVmlldy5uYXZTZXJ2aWNlLmZvY3VzTmV4dERhdGUoZGF5Lm5hdGl2ZUVsZW1lbnQsIGtleSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBpdGVyYXRpbmcgaW4gdGhlIHZpc2libGUgcHJldi9uZXh0IG1vdGhzIGFib3ZlIGZvdW5kIGEgZGF5IHRoYXQgaXMgbm90IGZvY3VzYWJsZSwgaWUgaXMgZGlzYWJsZWQsIGhpZGRlbiwgZXRjXG4gICAgICAgIC8vIHRoZW4gaXQgaXMgbmVlZGVkIHRvIHJlY2FsY3VsYXRlIHRoZSBuZXh0IGRheSwgd2hpY2ggaXMgZ29pbmcgdG8gYmUgcGFydCBvZiB0aGUgcHJldi9uZXh0IG1vbnRoc1xuICAgICAgICBpZiAoZGF5ICYmICFkYXkuaXNGb2N1c2FibGUpIHtcbiAgICAgICAgICAgIGRheSA9IGRhdGVzW2kgKyBzdGVwXTtcbiAgICAgICAgICAgIGlmICghZGF5KSB7XG4gICAgICAgICAgICAgICAgbmV4dERhdGUgPSB0aGlzLnRpbWVkZWx0YShub2RlLmRhdGUuZGF0ZSwgc3RlcCArIGkgLSBpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmb2N1cyBpdGVtIGluIHByZXYvbmV4dCBtb250aCwgd2hpY2ggaXMgY3VycmVudGx5IG91dCBvZiB2aWV3XG4gICAgICAgIGxldCBkYXlJc05leHRNb250aDogYm9vbGVhbjsgLy8gZGV0ZXJtaW5lIHdoYXQgd2UgbmVlZCB0byBjaGVjayBmb3IgbmV4dCBkYXRlIC0gaWYgaXQgYmVsb25ncyB0byBwcmV2IG9yIG5leHQgbW9udGhcbiAgICAgICAgaWYgKGRheSkgeyBkYXlJc05leHRNb250aCA9IHN0ZXAgPiAwID8gZGF5LmRhdGUuaXNOZXh0TW9udGggOiBkYXkuZGF0ZS5pc1ByZXZNb250aDsgfVxuICAgICAgICBpZiAobW9udGhWaWV3LmNoYW5nZURheXNWaWV3ICYmICFuZXh0TW9udGhWaWV3ICYmICgoZGF5ICYmIGRheUlzTmV4dE1vbnRoKSB8fCAhZGF5KSkge1xuICAgICAgICAgICAgY29uc3QgbW9udGhBY3Rpb24gPSBzdGVwID4gMCA/IFNjcm9sbE1vbnRoLk5FWFQgOiBTY3JvbGxNb250aC5QUkVWO1xuICAgICAgICAgICAgbW9udGhWaWV3Lm9uVmlld0NoYW5naW5nLmVtaXQoe21vbnRoQWN0aW9uOiBtb250aEFjdGlvbiwga2V5OiBrZXksIG5leHREYXRlOiBuZXh0RGF0ZX0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9jdXNlcyBmaXJzdCBmb2N1c2FibGUgZGF5IGluIHRoZSBtb250aC4gV2lsbCBnbyB0byBuZXh0IHZpc2libGUgbW9udGgsIGlmIG5vIGRheSBpbiB0aGUgZmlyc3QgbW9udGggaXMgZm9jdXNhYmxlXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBmb2N1c0hvbWVEYXRlKCkge1xuICAgICAgICBsZXQgbW9udGhWaWV3ID0gdGhpcy5tb250aFZpZXc7XG4gICAgICAgIHdoaWxlICghdGhpcy5mb2N1c0ZpcnN0RGF5KG1vbnRoVmlldykgJiYgbW9udGhWaWV3Lm5leHRNb250aFZpZXcpIHtcbiAgICAgICAgICAgIG1vbnRoVmlldyA9IG1vbnRoVmlldy5uZXh0TW9udGhWaWV3O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9jdXNlcyBsYXN0IGZvY3VzYWJsZSBkYXkgaW4gdGhlIG1vbnRoLiBXaWxsIGdvIHRvIHByZXZpb3VzIHZpc2libGUgbW9udGgsIGlmIG5vIGRheSBpbiB0aGUgZmlyc3QgbW9udGggaXMgZm9jdXNhYmxlXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBmb2N1c0VuZERhdGUoKSB7XG4gICAgICAgIGxldCBtb250aFZpZXcgPSB0aGlzLm1vbnRoVmlldztcbiAgICAgICAgd2hpbGUgKCF0aGlzLmZvY3VzTGFzdERheShtb250aFZpZXcpICYmIG1vbnRoVmlldy5wcmV2TW9udGhWaWV3KSB7XG4gICAgICAgICAgICBtb250aFZpZXcgPSBtb250aFZpZXcucHJldk1vbnRoVmlldztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdGltZWRlbHRhKGRhdGU6IERhdGUsIHVuaXRzOiBudW1iZXIpOiBEYXRlIHtcbiAgICAgICAgY29uc3QgcmV0ID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgICAgIHJldC5zZXREYXRlKHJldC5nZXREYXRlKCkgKyB1bml0cyk7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c0ZpcnN0RGF5KG1vbnRoVmlldzogSWd4RGF5c1ZpZXdDb21wb25lbnQpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZGF0ZXMgPSBtb250aFZpZXcuZGF0ZXMuZmlsdGVyKGQgPT4gZC5pc0N1cnJlbnRNb250aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChkYXRlc1tpXS5pc0ZvY3VzYWJsZSkge1xuICAgICAgICAgICAgICAgIGRhdGVzW2ldLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c0xhc3REYXkobW9udGhWaWV3OiBJZ3hEYXlzVmlld0NvbXBvbmVudCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkYXRlcyA9IG1vbnRoVmlldy5kYXRlcy5maWx0ZXIoZCA9PiBkLmlzQ3VycmVudE1vbnRoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGRhdGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAoZGF0ZXNbaV0uaXNGb2N1c2FibGUpIHtcbiAgICAgICAgICAgICAgICBkYXRlc1tpXS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbiJdfQ==