@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
178 lines • 24.2 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 = {}));
const ARROW = 'Arrow';
/** @hidden */
let IgxDaysViewNavigationService = class IgxDaysViewNavigationService {
/**
* Implements kb navigation in all MoveDirections. nextDate and nextMonthView naming convention is used for both previous/next
* @hidden
*/
focusNextDate(target, key, nextView = false) {
if (target.childElementCount === 0) {
target = target.parentElement;
}
if (key.indexOf('Arrow') === -1) {
key = ARROW.concat(key);
}
const monthView = this.monthView;
const node = monthView.dates.find((date) => date.nativeElement === target);
let dates = monthView.dates.toArray(), day, step, i, nextDate;
const 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
const nextMonthView = step > 0 ? monthView.nextMonthView : monthView.prevMonthView;
if (nextMonthView) {
dates = nextMonthView.dates.toArray();
day = dates.find((item) => 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
let 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)) {
const 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
*/
focusHomeDate() {
let 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
*/
focusEndDate() {
let monthView = this.monthView;
while (!this.focusLastDay(monthView) && monthView.prevMonthView) {
monthView = monthView.prevMonthView;
}
}
timedelta(date, units) {
const ret = new Date(date);
ret.setDate(ret.getDate() + units);
return ret;
}
focusFirstDay(monthView) {
const dates = monthView.dates.filter(d => d.isCurrentMonth);
for (let i = 0; i < dates.length; i++) {
if (dates[i].isFocusable) {
dates[i].nativeElement.focus();
return true;
}
}
return false;
}
focusLastDay(monthView) {
const dates = monthView.dates.filter(d => d.isCurrentMonth);
for (let i = dates.length - 1; i >= 0; i--) {
if (dates[i].isFocusable) {
dates[i].nativeElement.focus();
return true;
}
}
return false;
}
};
IgxDaysViewNavigationService = __decorate([
Injectable()
], IgxDaysViewNavigationService);
export { IgxDaysViewNavigationService };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF5c3ZpZXctbmF2aWdhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9jYWxlbmRhci9kYXlzLXZpZXcvZGF5c3ZpZXctbmF2aWdhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUUvQyxJQUFLLFNBS0o7QUFMRCxXQUFLLFNBQVM7SUFDViwyQkFBYyxDQUFBO0lBQ2QsK0JBQWtCLENBQUE7SUFDbEIsK0JBQWtCLENBQUE7SUFDbEIsaUNBQW9CLENBQUE7QUFDeEIsQ0FBQyxFQUxJLFNBQVMsS0FBVCxTQUFTLFFBS2I7QUFFRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUM7QUFFdEIsY0FBYztBQUVkLElBQWEsNEJBQTRCLEdBQXpDLE1BQWEsNEJBQTRCO0lBRXJDOzs7T0FHRztJQUNJLGFBQWEsQ0FBQyxNQUFtQixFQUFFLEdBQVcsRUFBRSxRQUFRLEdBQUcsS0FBSztRQUNuRSxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsS0FBSyxDQUFDLEVBQUU7WUFBRSxNQUFNLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztTQUFFO1FBQ3RFLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUFFLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQUU7UUFDN0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNqQyxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsS0FBSyxNQUFNLENBQUMsQ0FBQztRQUMzRSxJ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Q25DLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRTtnQkFDdEIsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDL0IsT0FBTyxJQUFJLENBQUM7YUFDZjtTQUNKO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUVPLFlBQVksQ0FBQyxTQUErQjtRQUNoRCxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM1RCxLQUFLLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDeEMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFO2dCQUN0QixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUMvQixPQUFPLElBQUksQ0FBQzthQUNmO1NBQ0o7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0NBQ0osQ0FBQTtBQXJLWSw0QkFBNEI7SUFEeEMsVUFBVSxFQUFFO0dBQ0EsNEJBQTRCLENBcUt4QztTQXJLWSw0QkFBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBJZ3hEYXlJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9kYXktaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4RGF5c1ZpZXdDb21wb25lbnQgfSBmcm9tICcuL2RheXMtdmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2Nyb2xsTW9udGggfSBmcm9tICcuLi9jYWxlbmRhci1iYXNlJztcblxuZW51bSBEaXJlY3Rpb24ge1xuICAgIFVwID0gJ0Fycm93VXAnLFxuICAgIERvd24gPSAnQXJyb3dEb3duJyxcbiAgICBMZWZ0ID0gJ0Fycm93TGVmdCcsXG4gICAgUmlnaHQgPSAnQXJyb3dSaWdodCcsXG59XG5cbmNvbnN0IEFSUk9XID0gJ0Fycm93JztcblxuLyoqIEBoaWRkZW4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBJZ3hEYXlzVmlld05hdmlnYXRpb25TZXJ2aWNlIHtcbiAgICBwdWJsaWMgbW9udGhWaWV3OiBJZ3hEYXlzVmlld0NvbXBvbmVudDtcbiAgICAvKipcbiAgICAgKiBJbXBsZW1lbnRzIGtiIG5hdmlnYXRpb24gaW4gYWxsIE1vdmVEaXJlY3Rpb25zLiBuZXh0RGF0ZSBhbmQgbmV4dE1vbnRoVmlldyBuYW1pbmcgY29udmVudGlvbiBpcyB1c2VkIGZvciBib3RoIHByZXZpb3VzL25leHRcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGZvY3VzTmV4dERhdGUodGFyZ2V0OiBIVE1MRWxlbWVudCwga2V5OiBzdHJpbmcsIG5leHRWaWV3ID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKHRhcmdldC5jaGlsZEVsZW1lbnRDb3VudCA9PT0gMCkgeyB0YXJnZXQgPSB0YXJnZXQucGFyZW50RWxlbWVudDsgfVxuICAgICAgICBpZiAoa2V5LmluZGV4T2YoJ0Fycm93JykgPT09IC0xKSB7IGtleSA9IEFSUk9XLmNvbmNhdChrZXkpOyB9XG4gICAgICAgIGNvbnN0IG1vbnRoVmlldyA9IHRoaXMubW9udGhWaWV3O1xuICAgICAgICBjb25zdCBub2RlID0gbW9udGhWaWV3LmRhdGVzLmZpbmQoKGRhdGUpID0+IGRhdGUubmF0aXZlRWxlbWVudCA9PT0gdGFyZ2V0KTtcbiAgICAgICAgbGV0IGRhdGVzID0gbW9udGhWaWV3LmRhdGVzLnRvQXJyYXkoKSxcbiAgICAgICAgICAgIGRheTogSWd4RGF5SXRlbUNvbXBvbmVudCwgc3RlcCwgaSwgbmV4dERhdGU6IERhdGU7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gZGF0ZXMuaW5kZXhPZihub2RlKTtcblxuICAgICAgICBpZiAoIW5vZGUpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgLy8gZm9jdXMgaXRlbSBpbiBjdXJyZW50IG1vbnRoXG4gICAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgICAgICBjYXNlIERpcmVjdGlvbi5MZWZ0OiB7XG4gICAgICAgICAgICAgICAgc3RlcCA9IC0xO1xuICAgICAgICAgICAgICAgIG5leHREYXRlID0gdGhpcy50aW1lZGVsdGEobm9kZS5kYXRlLmRhdGUsIHN0ZXApO1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IGluZGV4OyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGRheSA9IG5leHRWaWV3ID8gZGF0ZXNbaV0gOiBkYXRlc1tpIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIG5leHREYXRlID0gZGF5LmRhdGUuZGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRheS5kYXRlLmlzUHJldk1vbnRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF5ICYmIGRheS5pc0ZvY3VzYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF5Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgRGlyZWN0aW9uLlJpZ2h0OiB7XG4gICAgICAgICAgICAgICAgc3RlcCA9IDE7XG4gICAgICAgICAgICAgICAgbmV4dERhdGUgPSB0aGlzLnRpbWVkZWx0YShub2RlLmRhdGUuZGF0ZSwgc3RlcCk7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gaW5kZXg7IGkgPCBkYXRlcy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgZGF5ID0gbmV4dFZpZXcgPyBkYXRlc1tpXSA6IGRhdGVzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dERhdGUgPSBkYXkuZGF0ZS5kYXRlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF5LmRhdGUuaXNOZXh0TW9udGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXkgJiYgZGF5LmlzRm9jdXNhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXkubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBEaXJlY3Rpb24uVXA6IHtcbiAgICAgICAgICAgICAgICBzdGVwID0gLTc7XG4gICAgICAgICAgICAgICAgbmV4dERhdGUgPSB0aGlzLnRpbWVkZWx0YShub2RlLmRhdGUuZGF0ZSwgc3RlcCk7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gaW5kZXg7IGkgLSA3ID4gLTE7IGkgLT0gNykge1xuICAgICAgICAgICAgICAgICAgICBkYXkgPSBuZXh0VmlldyA/IGRhdGVzW2ldIDogZGF0ZXNbaSAtIDddO1xuICAgICAgICAgICAgICAgICAgICBuZXh0RGF0ZSA9IGRheS5kYXRlLmRhdGU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXkuZGF0ZS5pc1ByZXZNb250aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRheSAmJiBkYXkuaXNGb2N1c2FibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRheS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIERpcmVjdGlvbi5Eb3duOiB7XG4gICAgICAgICAgICAgICAgc3RlcCA9IDc7XG4gICAgICAgICAgICAgICAgbmV4dERhdGUgPSB0aGlzLnRpbWVkZWx0YShub2RlLmRhdGUuZGF0ZSwgc3RlcCk7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gaW5kZXg7IGkgKyA3IDwgNDI7IGkgKz0gNykge1xuICAgICAgICAgICAgICAgICAgICBkYXkgPSBuZXh0VmlldyA/IGRhdGVzW2ldIDogZGF0ZXNbaSArIDddO1xuICAgICAgICAgICAgICAgICAgICBuZXh0RGF0ZSA9IGRheS5kYXRlLmRhdGU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXkuZGF0ZS5pc05leHRNb250aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRheSAmJiBkYXkuaXNGb2N1c2FibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRheS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmb2N1cyBpdGVtIGluIHByZXYvbmV4dCB2aXNpYmxlIG1vbnRoXG4gICAgICAgIGNvbnN0IG5leHRNb250aFZpZXcgPSBzdGVwID4gMCA/IG1vbnRoVmlldy5uZXh0TW9udGhWaWV3IDogbW9udGhWaWV3LnByZXZNb250aFZpZXc7XG4gICAgICAgIGlmIChuZXh0TW9udGhWaWV3KSB7XG4gICAgICAgICAgICBkYXRlcyA9IG5leHRNb250aFZpZXcuZGF0ZXMudG9BcnJheSgpO1xuICAgICAgICAgICAgZGF5ID0gZGF0ZXMuZmluZCgoaXRlbSkgPT4gaXRlbS5kYXRlLmRhdGUuZ2V0VGltZSgpID09PSBuZXh0RGF0ZS5nZXRUaW1lKCkpO1xuXG4gICAgICAgICAgICBpZiAoZGF5ICYmIGRheS5pc0ZvY3VzYWJsZSkge1xuICAgICAgICAgICAgICAgIGRheS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV4dE1vbnRoVmlldy5uYXZTZXJ2aWNlLmZvY3VzTmV4dERhdGUoZGF5Lm5hdGl2ZUVsZW1lbnQsIGtleSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBpdGVyYXRpbmcgaW4gdGhlIHZpc2libGUgcHJldi9uZXh0IG1vdGhzIGFib3ZlIGZvdW5kIGEgZGF5IHRoYXQgaXMgbm90IGZvY3VzYWJsZSwgaWUgaXMgZGlzYWJsZWQsIGhpZGRlbiwgZXRjXG4gICAgICAgIC8vIHRoZW4gaXQgaXMgbmVlZGVkIHRvIHJlY2FsY3VsYXRlIHRoZSBuZXh0IGRheSwgd2hpY2ggaXMgZ29pbmcgdG8gYmUgcGFydCBvZiB0aGUgcHJldi9uZXh0IG1vbnRoc1xuICAgICAgICBpZiAoZGF5ICYmICFkYXkuaXNGb2N1c2FibGUpIHtcbiAgICAgICAgICAgIGRheSA9IGRhdGVzW2kgKyBzdGVwXTtcbiAgICAgICAgICAgIGlmICghZGF5KSB7XG4gICAgICAgICAgICAgICAgbmV4dERhdGUgPSB0aGlzLnRpbWVkZWx0YShub2RlLmRhdGUuZGF0ZSwgc3RlcCArIGkgLSBpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmb2N1cyBpdGVtIGluIHByZXYvbmV4dCBtb250aCwgd2hpY2ggaXMgY3VycmVudGx5IG91dCBvZiB2aWV3XG4gICAgICAgIGxldCBkYXlJc05leHRNb250aDogYm9vbGVhbjsgLy8gZGV0ZXJtaW5lIHdoYXQgd2UgbmVlZCB0byBjaGVjayBmb3IgbmV4dCBkYXRlIC0gaWYgaXQgYmVsb25ncyB0byBwcmV2IG9yIG5leHQgbW9udGhcbiAgICAgICAgaWYgKGRheSkgeyBkYXlJc05leHRNb250aCA9IHN0ZXAgPiAwID8gZGF5LmRhdGUuaXNOZXh0TW9udGggOiBkYXkuZGF0ZS5pc1ByZXZNb250aDsgfVxuICAgICAgICBpZiAobW9udGhWaWV3LmNoYW5nZURheXNWaWV3ICYmICFuZXh0TW9udGhWaWV3ICYmICgoZGF5ICYmIGRheUlzTmV4dE1vbnRoKSB8fCAhZGF5KSkge1xuICAgICAgICAgICAgY29uc3QgbW9udGhBY3Rpb24gPSBzdGVwID4gMCA/IFNjcm9sbE1vbnRoLk5FWFQgOiBTY3JvbGxNb250aC5QUkVWO1xuICAgICAgICAgICAgbW9udGhWaWV3Lm9uVmlld0NoYW5naW5nLmVtaXQoe21vbnRoQWN0aW9uOiBtb250aEFjdGlvbiwga2V5OiBrZXksIG5leHREYXRlOiBuZXh0RGF0ZX0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9jdXNlcyBmaXJzdCBmb2N1c2FibGUgZGF5IGluIHRoZSBtb250aC4gV2lsbCBnbyB0byBuZXh0IHZpc2libGUgbW9udGgsIGlmIG5vIGRheSBpbiB0aGUgZmlyc3QgbW9udGggaXMgZm9jdXNhYmxlXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBmb2N1c0hvbWVEYXRlKCkge1xuICAgICAgICBsZXQgbW9udGhWaWV3ID0gdGhpcy5tb250aFZpZXc7XG4gICAgICAgIHdoaWxlICghdGhpcy5mb2N1c0ZpcnN0RGF5KG1vbnRoVmlldykgJiYgbW9udGhWaWV3Lm5leHRNb250aFZpZXcpIHtcbiAgICAgICAgICAgIG1vbnRoVmlldyA9IG1vbnRoVmlldy5uZXh0TW9udGhWaWV3O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9jdXNlcyBsYXN0IGZvY3VzYWJsZSBkYXkgaW4gdGhlIG1vbnRoLiBXaWxsIGdvIHRvIHByZXZpb3VzIHZpc2libGUgbW9udGgsIGlmIG5vIGRheSBpbiB0aGUgZmlyc3QgbW9udGggaXMgZm9jdXNhYmxlXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBmb2N1c0VuZERhdGUoKSB7XG4gICAgICAgIGxldCBtb250aFZpZXcgPSB0aGlzLm1vbnRoVmlldztcbiAgICAgICAgd2hpbGUgKCF0aGlzLmZvY3VzTGFzdERheShtb250aFZpZXcpICYmIG1vbnRoVmlldy5wcmV2TW9udGhWaWV3KSB7XG4gICAgICAgICAgICBtb250aFZpZXcgPSBtb250aFZpZXcucHJldk1vbnRoVmlldztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdGltZWRlbHRhKGRhdGU6IERhdGUsIHVuaXRzOiBudW1iZXIpOiBEYXRlIHtcbiAgICAgICAgY29uc3QgcmV0ID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgICAgIHJldC5zZXREYXRlKHJldC5nZXREYXRlKCkgKyB1bml0cyk7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c0ZpcnN0RGF5KG1vbnRoVmlldzogSWd4RGF5c1ZpZXdDb21wb25lbnQpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZGF0ZXMgPSBtb250aFZpZXcuZGF0ZXMuZmlsdGVyKGQgPT4gZC5pc0N1cnJlbnRNb250aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChkYXRlc1tpXS5pc0ZvY3VzYWJsZSkge1xuICAgICAgICAgICAgICAgIGRhdGVzW2ldLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c0xhc3REYXkobW9udGhWaWV3OiBJZ3hEYXlzVmlld0NvbXBvbmVudCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkYXRlcyA9IG1vbnRoVmlldy5kYXRlcy5maWx0ZXIoZCA9PiBkLmlzQ3VycmVudE1vbnRoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGRhdGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAoZGF0ZXNbaV0uaXNGb2N1c2FibGUpIHtcbiAgICAgICAgICAgICAgICBkYXRlc1tpXS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbiJdfQ==