UNPKG

angular-mydatepicker-ivy

Version:
122 lines 24.8 kB
import { Component, EventEmitter, Input, Output, ViewEncapsulation } from "@angular/core"; import { UtilService } from "../../services/angular-mydatepicker.util.service"; import { KeyCode } from "../../enums/key-code.enum"; import { MonthId } from "../../enums/month-id.enum"; import { ActiveView } from "../../enums/active-view.enum"; import { OPTS, DATES, WEEK_DAYS, SELECTED_DATE, SELECTED_DATE_RANGE } from "../../constants/constants"; import * as i0 from "@angular/core"; import * as i1 from "../../services/angular-mydatepicker.util.service"; import * as i2 from "@angular/common"; export class DayViewComponent { utilService; opts; dates; weekDays; selectedDate; selectedDateRange; viewChanged; dayCellClicked = new EventEmitter(); dayCellKeyDown = new EventEmitter(); viewActivated = new EventEmitter(); prevMonthId = MonthId.prev; currMonthId = MonthId.curr; nextMonthId = MonthId.next; constructor(utilService) { this.utilService = utilService; } ngOnChanges(changes) { if (changes.hasOwnProperty(OPTS)) { this.opts = changes[OPTS].currentValue; } if (changes.hasOwnProperty(DATES)) { this.dates = changes[DATES].currentValue; } if (changes.hasOwnProperty(WEEK_DAYS)) { this.weekDays = changes[WEEK_DAYS].currentValue; } if (changes.hasOwnProperty(SELECTED_DATE)) { this.selectedDate = changes[SELECTED_DATE].currentValue; } if (changes.hasOwnProperty(SELECTED_DATE_RANGE)) { this.selectedDateRange = changes[SELECTED_DATE_RANGE].currentValue; } } ngAfterViewInit() { this.viewActivated.emit(ActiveView.Date); } onDayCellClicked(event, cell) { event.stopPropagation(); if (cell.disabledDate.disabled) { return; } this.dayCellClicked.emit(cell); } onDayCellKeyDown(event, cell) { const keyCode = this.utilService.getKeyCodeFromEvent(event); if (keyCode !== KeyCode.tab) { event.preventDefault(); if (keyCode === KeyCode.enter || keyCode === KeyCode.space) { this.onDayCellClicked(event, cell); } else if (this.opts.moveFocusByArrowKeys) { this.dayCellKeyDown.emit(event); } } } onDayCellMouseEnter(cell) { if (this.utilService.isInitializedDate(this.selectedDateRange.begin) && !this.utilService.isInitializedDate(this.selectedDateRange.end)) { for (const w of this.dates) { for (const day of w.week) { day.range = this.utilService.isDateSameOrEarlier(this.selectedDateRange.begin, day.dateObj) && this.utilService.isDateSameOrEarlier(day.dateObj, cell.dateObj); } } } } onDayCellMouseLeave() { for (const w of this.dates) { for (const day of w.week) { day.range = false; } } } isDateInRange(date) { return this.utilService.isDateInRange(date, this.selectedDateRange); } isDateSame(date) { return this.utilService.isDateSame(this.selectedDate, date); } isDateRangeBeginOrEndSame(date) { return this.utilService.isDateRangeBeginOrEndSame(this.selectedDateRange, date); } isDateRangeBegin(date) { return this.utilService.isDateRangeBegin(this.selectedDateRange, date); } isDateRangeEnd(date) { return this.utilService.isDateRangeEnd(this.selectedDateRange, date); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.6", ngImport: i0, type: DayViewComponent, deps: [{ token: i1.UtilService }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.6", type: DayViewComponent, selector: "lib-day-view", inputs: { opts: "opts", dates: "dates", weekDays: "weekDays", selectedDate: "selectedDate", selectedDateRange: "selectedDateRange", viewChanged: "viewChanged" }, outputs: { dayCellClicked: "dayCellClicked", dayCellKeyDown: "dayCellKeyDown", viewActivated: "viewActivated" }, providers: [UtilService], usesOnChanges: true, ngImport: i0, template: "<table class=\"myDpCalTable\" [ngClass]=\"{'ng-myrtl': opts.rtl, 'myDpFooter': opts.showFooterToday, 'myDpNoFooter': !opts.showFooterToday, 'myDpViewChangeAnimation': opts.viewChangeAnimation && viewChanged}\">\n <thead>\n <tr>\n <th class=\"myDpWeekDayTitle myDpWeekDayTitleWeekNbr\" *ngIf=\"opts.showWeekNumbers && opts.firstDayOfWeek==='mo'\">#</th>\n <th class=\"myDpWeekDayTitle\" scope=\"col\" *ngFor=\"let d of weekDays\">{{d}}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let w of dates\">\n <td class=\"myDpDaycellWeekNbr\" *ngIf=\"opts.showWeekNumbers && opts.firstDayOfWeek==='mo'\">{{w.weekNbr}}</td>\n <td id=\"d_{{d.row}}_{{d.col}}\" class=\"d_{{d.row}}_{{d.col}} myDpDaycell {{d.markedDate.styleClass}} {{d.disabledDate.styleClass}}\" *ngFor=\"let d of w.week\"\n [ngClass]=\"{'myDpRangeColor': isDateInRange(d.dateObj) || d.range,\n 'myDpPrevMonth': d.cmo === prevMonthId,\n 'myDpCurrMonth':d.cmo === currMonthId && !d.disabledDate.disabled,\n 'myDpNextMonth': d.cmo === nextMonthId,\n 'myDpSelectedDay':!this.opts.dateRange && isDateSame(d.dateObj) || this.opts.dateRange && isDateRangeBeginOrEndSame(d.dateObj),\n 'myDpRangeBegin':this.opts.dateRange && isDateRangeBegin(d.dateObj),\n 'myDpRangeEnd':this.opts.dateRange && isDateRangeEnd(d.dateObj),\n 'myDpDisabled': d.disabledDate.disabled && !d.disabledDate.styleClass.length,\n 'myDpTableSingleDay': !d.disabledDate.disabled}\"\n (click)=\"onDayCellClicked($event, d)\" (keydown)=\"onDayCellKeyDown($event, d)\"\n (mouseenter)=\"onDayCellMouseEnter(d)\" (mouseleave)=\"onDayCellMouseLeave()\" [attr.tabindex]=\"!d.disabledDate.disabled ? 0 : -1\">\n <span *ngIf=\"d.markedDate.marked && d.markedDate.color.length\" class=\"myDpMarkDate\" [ngStyle]=\"{'border-top': '8px solid ' + d.markedDate.color}\"></span>\n <span class=\"myDpDayValue\" \n [attr.aria-label]=\"[(d.dateObj.month + '/' + d.dateObj.day + '/' + d.dateObj.year | date:'fullDate')]\" \n [ngClass]=\"{'myDpMarkCurrDay': d.currDay && opts.markCurrentDay, 'myDpDimDay': d.highlight && (d.cmo===prevMonthId || d.cmo===nextMonthId || d.disabledDate.disabled), 'myDpHighlight': d.highlight}\">{{d.dateObj.day}}</span>\n </td>\n </tr>\n </tbody>\n</table>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }], encapsulation: i0.ViewEncapsulation.None }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.6", ngImport: i0, type: DayViewComponent, decorators: [{ type: Component, args: [{ selector: "lib-day-view", providers: [UtilService], encapsulation: ViewEncapsulation.None, template: "<table class=\"myDpCalTable\" [ngClass]=\"{'ng-myrtl': opts.rtl, 'myDpFooter': opts.showFooterToday, 'myDpNoFooter': !opts.showFooterToday, 'myDpViewChangeAnimation': opts.viewChangeAnimation && viewChanged}\">\n <thead>\n <tr>\n <th class=\"myDpWeekDayTitle myDpWeekDayTitleWeekNbr\" *ngIf=\"opts.showWeekNumbers && opts.firstDayOfWeek==='mo'\">#</th>\n <th class=\"myDpWeekDayTitle\" scope=\"col\" *ngFor=\"let d of weekDays\">{{d}}</th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let w of dates\">\n <td class=\"myDpDaycellWeekNbr\" *ngIf=\"opts.showWeekNumbers && opts.firstDayOfWeek==='mo'\">{{w.weekNbr}}</td>\n <td id=\"d_{{d.row}}_{{d.col}}\" class=\"d_{{d.row}}_{{d.col}} myDpDaycell {{d.markedDate.styleClass}} {{d.disabledDate.styleClass}}\" *ngFor=\"let d of w.week\"\n [ngClass]=\"{'myDpRangeColor': isDateInRange(d.dateObj) || d.range,\n 'myDpPrevMonth': d.cmo === prevMonthId,\n 'myDpCurrMonth':d.cmo === currMonthId && !d.disabledDate.disabled,\n 'myDpNextMonth': d.cmo === nextMonthId,\n 'myDpSelectedDay':!this.opts.dateRange && isDateSame(d.dateObj) || this.opts.dateRange && isDateRangeBeginOrEndSame(d.dateObj),\n 'myDpRangeBegin':this.opts.dateRange && isDateRangeBegin(d.dateObj),\n 'myDpRangeEnd':this.opts.dateRange && isDateRangeEnd(d.dateObj),\n 'myDpDisabled': d.disabledDate.disabled && !d.disabledDate.styleClass.length,\n 'myDpTableSingleDay': !d.disabledDate.disabled}\"\n (click)=\"onDayCellClicked($event, d)\" (keydown)=\"onDayCellKeyDown($event, d)\"\n (mouseenter)=\"onDayCellMouseEnter(d)\" (mouseleave)=\"onDayCellMouseLeave()\" [attr.tabindex]=\"!d.disabledDate.disabled ? 0 : -1\">\n <span *ngIf=\"d.markedDate.marked && d.markedDate.color.length\" class=\"myDpMarkDate\" [ngStyle]=\"{'border-top': '8px solid ' + d.markedDate.color}\"></span>\n <span class=\"myDpDayValue\" \n [attr.aria-label]=\"[(d.dateObj.month + '/' + d.dateObj.day + '/' + d.dateObj.year | date:'fullDate')]\" \n [ngClass]=\"{'myDpMarkCurrDay': d.currDay && opts.markCurrentDay, 'myDpDimDay': d.highlight && (d.cmo===prevMonthId || d.cmo===nextMonthId || d.disabledDate.disabled), 'myDpHighlight': d.highlight}\">{{d.dateObj.day}}</span>\n </td>\n </tr>\n </tbody>\n</table>\n" }] }], ctorParameters: function () { return [{ type: i1.UtilService }]; }, propDecorators: { opts: [{ type: Input }], dates: [{ type: Input }], weekDays: [{ type: Input }], selectedDate: [{ type: Input }], selectedDateRange: [{ type: Input }], viewChanged: [{ type: Input }], dayCellClicked: [{ type: Output }], dayCellKeyDown: [{ type: Output }], viewActivated: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF5LXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1teWRhdGVwaWNrZXIvc3JjL2xpYi9jb21wb25lbnRzL2RheS12aWV3L2RheS12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItbXlkYXRlcGlja2VyL3NyYy9saWIvY29tcG9uZW50cy9kYXktdmlldy9kYXktdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQTRCLE1BQU0sRUFBRSxpQkFBaUIsRUFBZ0IsTUFBTSxlQUFlLENBQUM7QUFNakksT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGtEQUFrRCxDQUFDO0FBQzdFLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDbEQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ3hELE9BQU8sRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQzs7OztBQVFyRyxNQUFNLE9BQU8sZ0JBQWdCO0lBZ0JQO0lBZlgsSUFBSSxDQUFhO0lBQ2pCLEtBQUssQ0FBaUI7SUFDdEIsUUFBUSxDQUFnQjtJQUN4QixZQUFZLENBQVU7SUFDdEIsaUJBQWlCLENBQWU7SUFDaEMsV0FBVyxDQUFVO0lBRXBCLGNBQWMsR0FBaUMsSUFBSSxZQUFZLEVBQWtCLENBQUM7SUFDbEYsY0FBYyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO0lBQzVELGFBQWEsR0FBNkIsSUFBSSxZQUFZLEVBQWMsQ0FBQztJQUVuRixXQUFXLEdBQVcsT0FBTyxDQUFDLElBQUksQ0FBQztJQUNuQyxXQUFXLEdBQVcsT0FBTyxDQUFDLElBQUksQ0FBQztJQUNuQyxXQUFXLEdBQVcsT0FBTyxDQUFDLElBQUksQ0FBQztJQUVuQyxZQUFvQixXQUF3QjtRQUF4QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtJQUFJLENBQUM7SUFFakQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNoQyxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUM7U0FDeEM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDakMsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsWUFBWSxDQUFDO1NBQzFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFlBQVksQ0FBQztTQUNqRDtRQUNELElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUN6QyxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxZQUFZLENBQUM7U0FDekQ7UUFDRCxJQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUMvQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsWUFBWSxDQUFDO1NBQ3BFO0lBQ0gsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQVUsRUFBRSxJQUFvQjtRQUMvQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFeEIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRTtZQUM5QixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBVSxFQUFFLElBQW9CO1FBQy9DLE1BQU0sT0FBTyxHQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEUsSUFBSSxPQUFPLEtBQUssT0FBTyxDQUFDLEdBQUcsRUFBRTtZQUMzQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFFdkIsSUFBSSxPQUFPLEtBQUssT0FBTyxDQUFDLEtBQUssSUFBSSxPQUFPLEtBQUssT0FBTyxDQUFDLEtBQUssRUFBRTtnQkFDMUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQzthQUNwQztpQkFDSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7Z0JBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2pDO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsSUFBUztRQUMzQixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdkksS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUMxQixLQUFLLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUU7b0JBQ3hCLEdBQUcsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUNoSzthQUNGO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUMxQixLQUFLLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUU7Z0JBQ3hCLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO2FBQ25CO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsYUFBYSxDQUFDLElBQWE7UUFDekIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQseUJBQXlCLENBQUMsSUFBYTtRQUNyQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxJQUFhO1FBQzVCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUFhO1FBQzFCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7dUdBcEdVLGdCQUFnQjsyRkFBaEIsZ0JBQWdCLDBUQUhoQixDQUFDLFdBQVcsQ0FBQywrQ0NmMUIsODJFQThCQTs7MkZEWmEsZ0JBQWdCO2tCQU41QixTQUFTOytCQUNFLGNBQWMsYUFFYixDQUFDLFdBQVcsQ0FBQyxpQkFDVCxpQkFBaUIsQ0FBQyxJQUFJO2tHQUc1QixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFFSSxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE91dHB1dCwgVmlld0VuY2Fwc3VsYXRpb24sIFNpbXBsZUNoYW5nZXN9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge0lNeUNhbGVuZGFyRGF5fSBmcm9tIFwiLi4vLi4vaW50ZXJmYWNlcy9teS1jYWxlbmRhci1kYXkuaW50ZXJmYWNlXCI7XG5pbXBvcnQge0lNeURhdGV9IGZyb20gXCIuLi8uLi9pbnRlcmZhY2VzL215LWRhdGUuaW50ZXJmYWNlXCI7XG5pbXBvcnQge0lNeURhdGVSYW5nZX0gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvbXktZGF0ZS1yYW5nZS5pbnRlcmZhY2VcIjtcbmltcG9ydCB7SU15T3B0aW9uc30gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvbXktb3B0aW9ucy5pbnRlcmZhY2VcIjtcbmltcG9ydCB7SU15V2Vla30gZnJvbSBcIi4uLy4uL2ludGVyZmFjZXMvbXktd2Vlay5pbnRlcmZhY2VcIjtcbmltcG9ydCB7VXRpbFNlcnZpY2V9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9hbmd1bGFyLW15ZGF0ZXBpY2tlci51dGlsLnNlcnZpY2VcIjtcbmltcG9ydCB7S2V5Q29kZX0gZnJvbSBcIi4uLy4uL2VudW1zL2tleS1jb2RlLmVudW1cIjtcbmltcG9ydCB7TW9udGhJZH0gZnJvbSBcIi4uLy4uL2VudW1zL21vbnRoLWlkLmVudW1cIjtcbmltcG9ydCB7QWN0aXZlVmlld30gZnJvbSBcIi4uLy4uL2VudW1zL2FjdGl2ZS12aWV3LmVudW1cIjtcbmltcG9ydCB7T1BUUywgREFURVMsIFdFRUtfREFZUywgU0VMRUNURURfREFURSwgU0VMRUNURURfREFURV9SQU5HRX0gZnJvbSBcIi4uLy4uL2NvbnN0YW50cy9jb25zdGFudHNcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImxpYi1kYXktdmlld1wiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2RheS12aWV3LmNvbXBvbmVudC5odG1sXCIsXG4gIHByb3ZpZGVyczogW1V0aWxTZXJ2aWNlXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBEYXlWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0IHtcbiAgQElucHV0KCkgb3B0czogSU15T3B0aW9ucztcbiAgQElucHV0KCkgZGF0ZXM6IEFycmF5PElNeVdlZWs+O1xuICBASW5wdXQoKSB3ZWVrRGF5czogQXJyYXk8c3RyaW5nPjtcbiAgQElucHV0KCkgc2VsZWN0ZWREYXRlOiBJTXlEYXRlO1xuICBASW5wdXQoKSBzZWxlY3RlZERhdGVSYW5nZTogSU15RGF0ZVJhbmdlO1xuICBASW5wdXQoKSB2aWV3Q2hhbmdlZDogYm9vbGVhbjtcblxuICBAT3V0cHV0KCkgZGF5Q2VsbENsaWNrZWQ6IEV2ZW50RW1pdHRlcjxJTXlDYWxlbmRhckRheT4gPSBuZXcgRXZlbnRFbWl0dGVyPElNeUNhbGVuZGFyRGF5PigpO1xuICBAT3V0cHV0KCkgZGF5Q2VsbEtleURvd246IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSB2aWV3QWN0aXZhdGVkOiBFdmVudEVtaXR0ZXI8QWN0aXZlVmlldz4gPSBuZXcgRXZlbnRFbWl0dGVyPEFjdGl2ZVZpZXc+KCk7XG5cbiAgcHJldk1vbnRoSWQ6IG51bWJlciA9IE1vbnRoSWQucHJldjtcbiAgY3Vyck1vbnRoSWQ6IG51bWJlciA9IE1vbnRoSWQuY3VycjtcbiAgbmV4dE1vbnRoSWQ6IG51bWJlciA9IE1vbnRoSWQubmV4dDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHV0aWxTZXJ2aWNlOiBVdGlsU2VydmljZSkgeyB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KE9QVFMpKSB7XG4gICAgICB0aGlzLm9wdHMgPSBjaGFuZ2VzW09QVFNdLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoREFURVMpKSB7XG4gICAgICB0aGlzLmRhdGVzID0gY2hhbmdlc1tEQVRFU10uY3VycmVudFZhbHVlO1xuICAgIH1cbiAgICBpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eShXRUVLX0RBWVMpKSB7XG4gICAgICB0aGlzLndlZWtEYXlzID0gY2hhbmdlc1tXRUVLX0RBWVNdLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkoU0VMRUNURURfREFURSkpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gY2hhbmdlc1tTRUxFQ1RFRF9EQVRFXS5jdXJyZW50VmFsdWU7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KFNFTEVDVEVEX0RBVEVfUkFOR0UpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlID0gY2hhbmdlc1tTRUxFQ1RFRF9EQVRFX1JBTkdFXS5jdXJyZW50VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMudmlld0FjdGl2YXRlZC5lbWl0KEFjdGl2ZVZpZXcuRGF0ZSk7XG4gIH1cblxuICBvbkRheUNlbGxDbGlja2VkKGV2ZW50OiBhbnksIGNlbGw6IElNeUNhbGVuZGFyRGF5KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZiAoY2VsbC5kaXNhYmxlZERhdGUuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRheUNlbGxDbGlja2VkLmVtaXQoY2VsbCk7XG4gIH1cblxuICBvbkRheUNlbGxLZXlEb3duKGV2ZW50OiBhbnksIGNlbGw6IElNeUNhbGVuZGFyRGF5KSB7XG4gICAgY29uc3Qga2V5Q29kZTogbnVtYmVyID0gdGhpcy51dGlsU2VydmljZS5nZXRLZXlDb2RlRnJvbUV2ZW50KGV2ZW50KTtcbiAgICBpZiAoa2V5Q29kZSAhPT0gS2V5Q29kZS50YWIpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGlmIChrZXlDb2RlID09PSBLZXlDb2RlLmVudGVyIHx8IGtleUNvZGUgPT09IEtleUNvZGUuc3BhY2UpIHtcbiAgICAgICAgdGhpcy5vbkRheUNlbGxDbGlja2VkKGV2ZW50LCBjZWxsKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHRoaXMub3B0cy5tb3ZlRm9jdXNCeUFycm93S2V5cykge1xuICAgICAgICB0aGlzLmRheUNlbGxLZXlEb3duLmVtaXQoZXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uRGF5Q2VsbE1vdXNlRW50ZXIoY2VsbDogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMudXRpbFNlcnZpY2UuaXNJbml0aWFsaXplZERhdGUodGhpcy5zZWxlY3RlZERhdGVSYW5nZS5iZWdpbikgJiYgIXRoaXMudXRpbFNlcnZpY2UuaXNJbml0aWFsaXplZERhdGUodGhpcy5zZWxlY3RlZERhdGVSYW5nZS5lbmQpKSB7XG4gICAgICBmb3IgKGNvbnN0IHcgb2YgdGhpcy5kYXRlcykge1xuICAgICAgICBmb3IgKGNvbnN0IGRheSBvZiB3LndlZWspIHtcbiAgICAgICAgICBkYXkucmFuZ2UgPSB0aGlzLnV0aWxTZXJ2aWNlLmlzRGF0ZVNhbWVPckVhcmxpZXIodGhpcy5zZWxlY3RlZERhdGVSYW5nZS5iZWdpbiwgZGF5LmRhdGVPYmopICYmIHRoaXMudXRpbFNlcnZpY2UuaXNEYXRlU2FtZU9yRWFybGllcihkYXkuZGF0ZU9iaiwgY2VsbC5kYXRlT2JqKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uRGF5Q2VsbE1vdXNlTGVhdmUoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCB3IG9mIHRoaXMuZGF0ZXMpIHtcbiAgICAgIGZvciAoY29uc3QgZGF5IG9mIHcud2Vlaykge1xuICAgICAgICBkYXkucmFuZ2UgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpc0RhdGVJblJhbmdlKGRhdGU6IElNeURhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy51dGlsU2VydmljZS5pc0RhdGVJblJhbmdlKGRhdGUsIHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UpO1xuICB9XG5cbiAgaXNEYXRlU2FtZShkYXRlOiBJTXlEYXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudXRpbFNlcnZpY2UuaXNEYXRlU2FtZSh0aGlzLnNlbGVjdGVkRGF0ZSwgZGF0ZSk7XG4gIH1cblxuICBpc0RhdGVSYW5nZUJlZ2luT3JFbmRTYW1lKGRhdGU6IElNeURhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy51dGlsU2VydmljZS5pc0RhdGVSYW5nZUJlZ2luT3JFbmRTYW1lKHRoaXMuc2VsZWN0ZWREYXRlUmFuZ2UsIGRhdGUpO1xuICB9XG5cbiAgaXNEYXRlUmFuZ2VCZWdpbihkYXRlOiBJTXlEYXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudXRpbFNlcnZpY2UuaXNEYXRlUmFuZ2VCZWdpbih0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlLCBkYXRlKTtcbiAgfVxuXG4gIGlzRGF0ZVJhbmdlRW5kKGRhdGU6IElNeURhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy51dGlsU2VydmljZS5pc0RhdGVSYW5nZUVuZCh0aGlzLnNlbGVjdGVkRGF0ZVJhbmdlLCBkYXRlKTtcbiAgfVxufVxuIiwiPHRhYmxlIGNsYXNzPVwibXlEcENhbFRhYmxlXCIgW25nQ2xhc3NdPVwieyduZy1teXJ0bCc6IG9wdHMucnRsLCAnbXlEcEZvb3Rlcic6IG9wdHMuc2hvd0Zvb3RlclRvZGF5LCAnbXlEcE5vRm9vdGVyJzogIW9wdHMuc2hvd0Zvb3RlclRvZGF5LCAnbXlEcFZpZXdDaGFuZ2VBbmltYXRpb24nOiBvcHRzLnZpZXdDaGFuZ2VBbmltYXRpb24gJiYgdmlld0NoYW5nZWR9XCI+XG4gIDx0aGVhZD5cbiAgICA8dHI+XG4gICAgICA8dGggY2xhc3M9XCJteURwV2Vla0RheVRpdGxlIG15RHBXZWVrRGF5VGl0bGVXZWVrTmJyXCIgKm5nSWY9XCJvcHRzLnNob3dXZWVrTnVtYmVycyAmJiBvcHRzLmZpcnN0RGF5T2ZXZWVrPT09J21vJ1wiPiM8L3RoPlxuICAgICAgPHRoIGNsYXNzPVwibXlEcFdlZWtEYXlUaXRsZVwiIHNjb3BlPVwiY29sXCIgKm5nRm9yPVwibGV0IGQgb2Ygd2Vla0RheXNcIj57e2R9fTwvdGg+XG4gICAgPC90cj5cbiAgPC90aGVhZD5cbiAgPHRib2R5PlxuICAgIDx0ciAqbmdGb3I9XCJsZXQgdyBvZiBkYXRlc1wiPlxuICAgICAgPHRkIGNsYXNzPVwibXlEcERheWNlbGxXZWVrTmJyXCIgKm5nSWY9XCJvcHRzLnNob3dXZWVrTnVtYmVycyAmJiBvcHRzLmZpcnN0RGF5T2ZXZWVrPT09J21vJ1wiPnt7dy53ZWVrTmJyfX08L3RkPlxuICAgICAgPHRkIGlkPVwiZF97e2Qucm93fX1fe3tkLmNvbH19XCIgY2xhc3M9XCJkX3t7ZC5yb3d9fV97e2QuY29sfX0gbXlEcERheWNlbGwge3tkLm1hcmtlZERhdGUuc3R5bGVDbGFzc319IHt7ZC5kaXNhYmxlZERhdGUuc3R5bGVDbGFzc319XCIgKm5nRm9yPVwibGV0IGQgb2Ygdy53ZWVrXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J215RHBSYW5nZUNvbG9yJzogaXNEYXRlSW5SYW5nZShkLmRhdGVPYmopIHx8IGQucmFuZ2UsXG4gICAgICAgICAgICAgICAgJ215RHBQcmV2TW9udGgnOiBkLmNtbyA9PT0gcHJldk1vbnRoSWQsXG4gICAgICAgICAgICAgICAgJ215RHBDdXJyTW9udGgnOmQuY21vID09PSBjdXJyTW9udGhJZCAmJiAhZC5kaXNhYmxlZERhdGUuZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgJ215RHBOZXh0TW9udGgnOiBkLmNtbyA9PT0gbmV4dE1vbnRoSWQsXG4gICAgICAgICAgICAgICAgJ215RHBTZWxlY3RlZERheSc6IXRoaXMub3B0cy5kYXRlUmFuZ2UgJiYgaXNEYXRlU2FtZShkLmRhdGVPYmopIHx8IHRoaXMub3B0cy5kYXRlUmFuZ2UgJiYgaXNEYXRlUmFuZ2VCZWdpbk9yRW5kU2FtZShkLmRhdGVPYmopLFxuICAgICAgICAgICAgICAgICdteURwUmFuZ2VCZWdpbic6dGhpcy5vcHRzLmRhdGVSYW5nZSAmJiBpc0RhdGVSYW5nZUJlZ2luKGQuZGF0ZU9iaiksXG4gICAgICAgICAgICAgICAgJ215RHBSYW5nZUVuZCc6dGhpcy5vcHRzLmRhdGVSYW5nZSAmJiBpc0RhdGVSYW5nZUVuZChkLmRhdGVPYmopLFxuICAgICAgICAgICAgICAgICdteURwRGlzYWJsZWQnOiBkLmRpc2FibGVkRGF0ZS5kaXNhYmxlZCAmJiAhZC5kaXNhYmxlZERhdGUuc3R5bGVDbGFzcy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgJ215RHBUYWJsZVNpbmdsZURheSc6ICFkLmRpc2FibGVkRGF0ZS5kaXNhYmxlZH1cIlxuICAgICAgICAgIChjbGljayk9XCJvbkRheUNlbGxDbGlja2VkKCRldmVudCwgZClcIiAoa2V5ZG93bik9XCJvbkRheUNlbGxLZXlEb3duKCRldmVudCwgZClcIlxuICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9uRGF5Q2VsbE1vdXNlRW50ZXIoZClcIiAobW91c2VsZWF2ZSk9XCJvbkRheUNlbGxNb3VzZUxlYXZlKClcIiBbYXR0ci50YWJpbmRleF09XCIhZC5kaXNhYmxlZERhdGUuZGlzYWJsZWQgPyAwIDogLTFcIj5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCJkLm1hcmtlZERhdGUubWFya2VkICYmIGQubWFya2VkRGF0ZS5jb2xvci5sZW5ndGhcIiBjbGFzcz1cIm15RHBNYXJrRGF0ZVwiIFtuZ1N0eWxlXT1cInsnYm9yZGVyLXRvcCc6ICc4cHggc29saWQgJyArIGQubWFya2VkRGF0ZS5jb2xvcn1cIj48L3NwYW4+XG4gICAgICAgIDxzcGFuICBjbGFzcz1cIm15RHBEYXlWYWx1ZVwiIFxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiWyhkLmRhdGVPYmoubW9udGggKyAnLycgKyBkLmRhdGVPYmouZGF5ICsgJy8nICsgZC5kYXRlT2JqLnllYXIgfCBkYXRlOidmdWxsRGF0ZScpXVwiIFxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsnbXlEcE1hcmtDdXJyRGF5JzogZC5jdXJyRGF5ICYmIG9wdHMubWFya0N1cnJlbnREYXksICdteURwRGltRGF5JzogZC5oaWdobGlnaHQgJiYgKGQuY21vPT09cHJldk1vbnRoSWQgfHwgZC5jbW89PT1uZXh0TW9udGhJZCB8fCBkLmRpc2FibGVkRGF0ZS5kaXNhYmxlZCksICdteURwSGlnaGxpZ2h0JzogZC5oaWdobGlnaHR9XCI+e3tkLmRhdGVPYmouZGF5fX08L3NwYW4+XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gIDwvdGJvZHk+XG48L3RhYmxlPlxuIl19