UNPKG

@catull/igniteui-angular

Version:

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

633 lines 64.7 kB
import { __decorate, __metadata, __read, __spread } from "tslib"; import { Input, Output, EventEmitter, Directive } from '@angular/core'; import { Calendar, isDateInRanges } from './calendar'; import { Subject } from 'rxjs'; import { isDate } from '../core/utils'; /** * Sets the selction type - single, multi or range. */ export var CalendarSelection; (function (CalendarSelection) { CalendarSelection["SINGLE"] = "single"; CalendarSelection["MULTI"] = "multi"; CalendarSelection["RANGE"] = "range"; })(CalendarSelection || (CalendarSelection = {})); export var ScrollMonth; (function (ScrollMonth) { ScrollMonth["PREV"] = "prev"; ScrollMonth["NEXT"] = "next"; ScrollMonth["NONE"] = "none"; })(ScrollMonth || (ScrollMonth = {})); /** @hidden @internal */ var IgxCalendarBaseDirective = /** @class */ (function () { /** * @hidden */ function IgxCalendarBaseDirective() { /** * Sets/gets whether the outside dates (dates that are out of the current month) will be hidden. * Default value is `false`. * ```html * <igx-calendar [hideOutsideDays] = "true"></igx-calendar> * ``` * ```typescript * let hideOutsideDays = this.calendar.hideOutsideDays; * ``` */ this.hideOutsideDays = false; /** * Emits an event when a date is selected. * Provides reference the `selectedDates` property. */ this.onSelection = new EventEmitter(); /** *@hidden */ this._selection = CalendarSelection.SINGLE; /** *@hidden */ this.rangeStarted = false; /** *@hidden */ this._locale = 'en'; /** *@hidden */ this._disabledDates = null; /** *@hidden */ this._specialDates = null; /** *@hidden */ this._formatOptions = { day: 'numeric', month: 'short', weekday: 'short', year: 'numeric' }; /** *@hidden */ this._formatViews = { day: false, month: true, year: false }; /** * @hidden */ this.monthScrollDirection = ScrollMonth.NONE; /** *@hidden */ this.scrollMonth$ = new Subject(); /** *@hidden */ this.stopMonthScroll$ = new Subject(); /** *@hidden */ this.startMonthScroll$ = new Subject(); /** *@hidden */ this._onTouchedCallback = function () { }; /** *@hidden */ this._onChangeCallback = function () { }; this.calendarModel = new Calendar(); this.viewDate = this.viewDate ? this.viewDate : new Date(); this.calendarModel.firstWeekDay = this.weekStart; this.initFormatters(); } Object.defineProperty(IgxCalendarBaseDirective.prototype, "weekStart", { /** * Gets the start day of the week. * Can return a numeric or an enum representation of the week day. * Defaults to `Sunday` / `0`. */ get: function () { return this.calendarModel.firstWeekDay; }, /** * Sets the start day of the week. * Can be assigned to a numeric value or to `WEEKDAYS` enum value. */ set: function (value) { this.calendarModel.firstWeekDay = value; }, enumerable: true, configurable: true }); Object.defineProperty(IgxCalendarBaseDirective.prototype, "locale", { /** * Gets the `locale` of the calendar. * Default value is `"en"`. */ get: function () { return this._locale; }, /** * Sets the `locale` of the calendar. * Expects a valid BCP 47 language tag. * Default value is `"en"`. */ set: function (value) { this._locale = value; this.initFormatters(); }, enumerable: true, configurable: true }); Object.defineProperty(IgxCalendarBaseDirective.prototype, "formatOptions", { /** * Gets the date format options of the days view. */ get: function () { return this._formatOptions; }, /** * Sets the date format options of the days view. * Default is { day: 'numeric', month: 'short', weekday: 'short', year: 'numeric' } */ set: function (formatOptions) { this._formatOptions = Object.assign(this._formatOptions, formatOptions); this.initFormatters(); }, enumerable: true, configurable: true }); Object.defineProperty(IgxCalendarBaseDirective.prototype, "formatViews", { /** * Gets whether the `day`, `month` and `year` should be rendered * according to the locale and formatOptions, if any. */ get: function () { return this._formatViews; }, /** * Gets whether the `day`, `month` and `year` should be rendered * according to the locale and formatOptions, if any. */ set: function (formatViews) { this._formatViews = Object.assign(this._formatViews, formatViews); }, enumerable: true, configurable: true }); Object.defineProperty(IgxCalendarBaseDirective.prototype, "selection", { /** * * Gets the selection type. * Default value is `"single"`. * Changing the type of selection resets the currently * selected values if any. */ get: function () { return this._selection; }, /** * Sets the selection. */ set: function (value) { switch (value) { case CalendarSelection.SINGLE: this.selectedDates = null; break; case CalendarSelection.MULTI: case CalendarSelection.RANGE: this.selectedDates = []; break; default: throw new Error('Invalid selection value'); } this._onChangeCallback(this.selectedDates); this.rangeStarted = false; this._selection = value; }, enumerable: true, configurable: true }); Object.defineProperty(IgxCalendarBaseDirective.prototype, "value", { /** * Gets the selected date(s). * * When selection is set to `single`, it returns * a single `Date` object. * Otherwise it is an array of `Date` objects. */ get: function () { return this.selectedDates; }, /** * Sets the selected date(s). * * When selection is set to `single`, it accepts * a single `Date` object. * Otherwise it is an array of `Date` objects. */ set: function (value) { if (!value || !!value && value.length === 0) { return; } this.selectDate(value); }, enumerable: true, configurable: true }); Object.defineProperty(IgxCalendarBaseDirective.prototype, "viewDate", { /** * Gets the date that is presented. * By default it is the current date. */ get: function () { return this._viewDate; }, /** * Sets the date that will be presented in the default view when the component renders. */ set: function (value) { this._viewDate = this.getDateOnly(value); }, enumerable: true, configurable: true }); Object.defineProperty(IgxCalendarBaseDirective.prototype, "disabledDates", { /** * Gets the disabled dates descriptors. */ get: function () { return this._disabledDates; }, /** * Sets the disabled dates' descriptors. * ```typescript *@ViewChild("MyCalendar") *public calendar: IgxCalendarComponent; *ngOnInit(){ * this.calendar.disabledDates = [ * {type: DateRangeType.Between, dateRange: [new Date("2020-1-1"), new Date("2020-1-15")]}, * {type: DateRangeType.Weekends}]; *} *``` */ set: function (value) { this._disabledDates = value; }, enumerable: true, configurable: true }); Object.defineProperty(IgxCalendarBaseDirective.prototype, "specialDates", { /** * Gets the special dates descriptors. */ get: function () { return this._specialDates; }, /** * Sets the special dates' descriptors. * ```typescript *@ViewChild("MyCalendar") *public calendar: IgxCalendarComponent; *ngOnInit(){ * this.calendar.specialDates = [ * {type: DateRangeType.Between, dateRange: [new Date("2020-1-1"), new Date("2020-1-15")]}, * {type: DateRangeType.Weekends}]; *} *``` */ set: function (value) { this._specialDates = value; }, enumerable: true, configurable: true }); /** *@hidden */ IgxCalendarBaseDirective.prototype.getDateOnlyInMs = function (date) { return this.getDateOnly(date).getTime(); }; /** *@hidden */ IgxCalendarBaseDirective.prototype.generateDateRange = function (start, end) { var result = []; start = this.getDateOnly(start); end = this.getDateOnly(end); while (start.getTime() !== end.getTime()) { start = this.calendarModel.timedelta(start, 'day', 1); result.push(start); } return result; }; /** * Performs a single selection. * @hidden */ IgxCalendarBaseDirective.prototype.selectSingle = function (value) { this.selectedDates = this.getDateOnly(value); this._onChangeCallback(this.selectedDates); }; /** * Performs a multiple selection * @hidden */ IgxCalendarBaseDirective.prototype.selectMultiple = function (value) { var _this = this; if (Array.isArray(value)) { var newDates = value.map(function (v) { return _this.getDateOnly(v).getTime(); }); var selDates = this.selectedDates.map(function (v) { return _this.getDateOnly(v).getTime(); }); if (JSON.stringify(newDates) === JSON.stringify(selDates)) { return; } this.selectedDates = Array.from(new Set(__spread(newDates, selDates))).map(function (v) { return new Date(v); }); } else { var valueDateOnly_1 = this.getDateOnly(value); var newSelection = []; if (this.selectedDates.every(function (date) { return date.getTime() !== valueDateOnly_1.getTime(); })) { newSelection.push(valueDateOnly_1); } else { this.selectedDates = this.selectedDates.filter(function (date) { return date.getTime() !== valueDateOnly_1.getTime(); }); } if (newSelection.length > 0) { this.selectedDates = this.selectedDates.concat(newSelection); } } this.selectedDates = this.selectedDates.filter(function (d) { return !_this.isDateDisabled(d); }); this.selectedDates.sort(function (a, b) { return a.valueOf() - b.valueOf(); }); this._onChangeCallback(this.selectedDates); }; /** *@hidden */ IgxCalendarBaseDirective.prototype.selectRange = function (value, excludeDisabledDates) { var _this = this; if (excludeDisabledDates === void 0) { excludeDisabledDates = false; } var start; var end; if (Array.isArray(value)) { // this.rangeStarted = false; value.sort(function (a, b) { return a.valueOf() - b.valueOf(); }); start = this.getDateOnly(value[0]); end = this.getDateOnly(value[value.length - 1]); this.selectedDates = __spread([start], this.generateDateRange(start, end)); } else { if (!this.rangeStarted) { this.rangeStarted = true; this.selectedDates = [value]; } else { this.rangeStarted = false; if (this.selectedDates[0].getTime() === value.getTime()) { this.selectedDates = []; this._onChangeCallback(this.selectedDates); return; } this.selectedDates.push(value); this.selectedDates.sort(function (a, b) { return a.valueOf() - b.valueOf(); }); start = this.selectedDates.shift(); end = this.selectedDates.pop(); this.selectedDates = __spread([start], this.generateDateRange(start, end)); } } if (excludeDisabledDates) { this.selectedDates = this.selectedDates.filter(function (d) { return !_this.isDateDisabled(d); }); } this._onChangeCallback(this.selectedDates); }; /** * Performs a single deselection. * @hidden */ IgxCalendarBaseDirective.prototype.deselectSingle = function (value) { if (this.selectedDates !== null && this.getDateOnlyInMs(value) === this.getDateOnlyInMs(this.selectedDates)) { this.selectedDates = null; this._onChangeCallback(this.selectedDates); } }; /** * Performs a multiple deselection. * @hidden */ IgxCalendarBaseDirective.prototype.deselectMultiple = function (value) { var _this = this; value = value.filter(function (v) { return v !== null; }); var selectedDatesCount = this.selectedDates.length; var datesInMsToDeselect = new Set(value.map(function (v) { return _this.getDateOnlyInMs(v); })); for (var i = this.selectedDates.length - 1; i >= 0; i--) { if (datesInMsToDeselect.has(this.getDateOnlyInMs(this.selectedDates[i]))) { this.selectedDates.splice(i, 1); } } if (this.selectedDates.length !== selectedDatesCount) { this._onChangeCallback(this.selectedDates); } }; /** * Performs deselection of a single value, when selection is multi * Usually performed by the selectMultiple method, but leads to bug when multiple months are in view * @hidden */ IgxCalendarBaseDirective.prototype.deselectMultipleInMonth = function (value) { var valueDateOnly = this.getDateOnly(value); this.selectedDates = this.selectedDates.filter(function (date) { return date.getTime() !== valueDateOnly.getTime(); }); }; /** * Performs a range deselection. * @hidden */ IgxCalendarBaseDirective.prototype.deselectRange = function (value) { value = value.filter(function (v) { return v !== null; }); if (value.length < 1) { return; } value.sort(function (a, b) { return a.valueOf() - b.valueOf(); }); var valueStart = this.getDateOnlyInMs(value[0]); var valueEnd = this.getDateOnlyInMs(value[value.length - 1]); this.selectedDates.sort(function (a, b) { return a.valueOf() - b.valueOf(); }); var selectedDatesStart = this.getDateOnlyInMs(this.selectedDates[0]); var selectedDatesEnd = this.getDateOnlyInMs(this.selectedDates[this.selectedDates.length - 1]); if (!(valueEnd < selectedDatesStart) && !(valueStart > selectedDatesEnd)) { this.selectedDates = []; this.rangeStarted = false; this._onChangeCallback(this.selectedDates); } }; /** * @hidden */ IgxCalendarBaseDirective.prototype.initFormatters = function () { this.formatterDay = new Intl.DateTimeFormat(this._locale, { day: this._formatOptions.day }); this.formatterWeekday = new Intl.DateTimeFormat(this._locale, { weekday: this._formatOptions.weekday }); this.formatterMonth = new Intl.DateTimeFormat(this._locale, { month: this._formatOptions.month }); this.formatterYear = new Intl.DateTimeFormat(this._locale, { year: this._formatOptions.year }); this.formatterMonthday = new Intl.DateTimeFormat(this._locale, { month: this._formatOptions.month, day: this._formatOptions.day }); }; /** *@hidden */ IgxCalendarBaseDirective.prototype.getDateOnly = function (date) { return new Date(date.getFullYear(), date.getMonth(), date.getDate()); }; /** * @hidden */ IgxCalendarBaseDirective.prototype.registerOnChange = function (fn) { this._onChangeCallback = fn; }; /** * @hidden */ IgxCalendarBaseDirective.prototype.registerOnTouched = function (fn) { this._onTouchedCallback = fn; }; /** * @hidden */ IgxCalendarBaseDirective.prototype.writeValue = function (value) { this.selectDate(value); }; /** * Checks whether a date is disabled. * @hidden */ IgxCalendarBaseDirective.prototype.isDateDisabled = function (date) { if (this.disabledDates === null) { return false; } return isDateInRanges(date, this.disabledDates); }; /** * Selects date(s) (based on the selection type). */ IgxCalendarBaseDirective.prototype.selectDate = function (value) { if (value === null || value === undefined || (Array.isArray(value) && value.length === 0)) { return; } switch (this.selection) { case CalendarSelection.SINGLE: if (isDate(value) && !this.isDateDisabled(value)) { this.selectSingle(value); } break; case CalendarSelection.MULTI: this.selectMultiple(value); break; case CalendarSelection.RANGE: this.selectRange(value, true); break; } }; /** * Deselects date(s) (based on the selection type). */ IgxCalendarBaseDirective.prototype.deselectDate = function (value) { if (this.selectedDates === null || this.selectedDates.length === 0) { return; } if (value === null || value === undefined) { this.selectedDates = this.selection === CalendarSelection.SINGLE ? null : []; this.rangeStarted = false; this._onChangeCallback(this.selectedDates); return; } switch (this.selection) { case CalendarSelection.SINGLE: this.deselectSingle(value); break; case CalendarSelection.MULTI: this.deselectMultiple(value); break; case CalendarSelection.RANGE: this.deselectRange(value); break; } }; /** * @hidden */ IgxCalendarBaseDirective.prototype.selectDateFromClient = function (value) { switch (this.selection) { case CalendarSelection.SINGLE: case CalendarSelection.MULTI: this.selectDate(value); break; case CalendarSelection.RANGE: this.selectRange(value, true); break; } }; __decorate([ Input(), __metadata("design:type", Number), __metadata("design:paramtypes", [Number]) ], IgxCalendarBaseDirective.prototype, "weekStart", null); __decorate([ Input(), __metadata("design:type", String), __metadata("design:paramtypes", [String]) ], IgxCalendarBaseDirective.prototype, "locale", null); __decorate([ Input(), __metadata("design:type", Object), __metadata("design:paramtypes", [Object]) ], IgxCalendarBaseDirective.prototype, "formatOptions", null); __decorate([ Input(), __metadata("design:type", Object), __metadata("design:paramtypes", [Object]) ], IgxCalendarBaseDirective.prototype, "formatViews", null); __decorate([ Input(), __metadata("design:type", String), __metadata("design:paramtypes", [String]) ], IgxCalendarBaseDirective.prototype, "selection", null); __decorate([ Input(), __metadata("design:type", Object), __metadata("design:paramtypes", [Object]) ], IgxCalendarBaseDirective.prototype, "value", null); __decorate([ Input(), __metadata("design:type", Date), __metadata("design:paramtypes", [Date]) ], IgxCalendarBaseDirective.prototype, "viewDate", null); __decorate([ Input(), __metadata("design:type", Array), __metadata("design:paramtypes", [Array]) ], IgxCalendarBaseDirective.prototype, "disabledDates", null); __decorate([ Input(), __metadata("design:type", Array), __metadata("design:paramtypes", [Array]) ], IgxCalendarBaseDirective.prototype, "specialDates", null); __decorate([ Input(), __metadata("design:type", Object) ], IgxCalendarBaseDirective.prototype, "hideOutsideDays", void 0); __decorate([ Output(), __metadata("design:type", Object) ], IgxCalendarBaseDirective.prototype, "onSelection", void 0); IgxCalendarBaseDirective = __decorate([ Directive({ selector: '[igxCalendarBase]' }), __metadata("design:paramtypes", []) ], IgxCalendarBaseDirective); return IgxCalendarBaseDirective; }()); export { IgxCalendarBaseDirective }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItYmFzZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY2FsZW5kYXIvY2FsZW5kYXItYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RSxPQUFPLEVBQVksUUFBUSxFQUFFLGNBQWMsRUFBd0MsTUFBTSxZQUFZLENBQUM7QUFHdEcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZDOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksaUJBSVg7QUFKRCxXQUFZLGlCQUFpQjtJQUN6QixzQ0FBaUIsQ0FBQTtJQUNqQixvQ0FBZSxDQUFBO0lBQ2Ysb0NBQWUsQ0FBQTtBQUNuQixDQUFDLEVBSlcsaUJBQWlCLEtBQWpCLGlCQUFpQixRQUk1QjtBQUVELE1BQU0sQ0FBTixJQUFZLFdBSVg7QUFKRCxXQUFZLFdBQVc7SUFDbkIsNEJBQWEsQ0FBQTtJQUNiLDRCQUFhLENBQUE7SUFDYiw0QkFBYSxDQUFBO0FBQ2pCLENBQUMsRUFKVyxXQUFXLEtBQVgsV0FBVyxRQUl0QjtBQUVELHdCQUF3QjtBQUl4QjtJQXlVSTs7T0FFRztJQUNIO1FBeklBOzs7Ozs7Ozs7V0FTRztRQUdJLG9CQUFlLEdBQUcsS0FBSyxDQUFDO1FBRS9COzs7V0FHRztRQUVJLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWlCLENBQUM7UUFFdkQ7O1dBRUc7UUFDSyxlQUFVLEdBQStCLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztRQUUxRTs7V0FFRztRQUNJLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRTVCOztVQUVFO1FBQ00sWUFBTyxHQUFHLElBQUksQ0FBQztRQU92Qjs7V0FFRztRQUNLLG1CQUFj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SztnQkFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzlCLE1BQU07U0FDYjtJQUNMLENBQUM7SUFsbkJEO1FBREMsS0FBSyxFQUFFOzs7NkRBR1A7SUFlRDtRQURDLEtBQUssRUFBRTs7OzBEQUdQO0lBZ0JEO1FBREMsS0FBSyxFQUFFOzs7aUVBR1A7SUFnQkQ7UUFEQyxLQUFLLEVBQUU7OzsrREFHUDtJQWtCRDtRQURDLEtBQUssRUFBRTs7OzZEQUdQO0lBOEJEO1FBREMsS0FBSyxFQUFFOzs7eURBR1A7SUFzQkQ7UUFEQyxLQUFLLEVBQUU7a0NBUW1CLElBQUk7eUNBQUosSUFBSTs0REFMOUI7SUFhRDtRQURDLEtBQUssRUFBRTs7O2lFQUdQO0lBc0JEO1FBREMsS0FBSyxFQUFFOzs7Z0VBR1A7SUE4QkQ7UUFEQyxLQUFLLEVBQUU7O3FFQUN1QjtJQU8vQjtRQURDLE1BQU0sRUFBRTs7aUVBQzhDO0lBdE45Qyx3QkFBd0I7UUFIcEMsU0FBUyxDQUFDO1lBQ1AsUUFBUSxFQUFFLG1CQUFtQjtTQUNoQyxDQUFDOztPQUNXLHdCQUF3QixDQTBuQnBDO0lBQUQsK0JBQUM7Q0FBQSxBQTFuQkQsSUEwbkJDO1NBMW5CWSx3QkFBd0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgV0VFS0RBWVMsIENhbGVuZGFyLCBpc0RhdGVJblJhbmdlcywgSUZvcm1hdHRpbmdPcHRpb25zLCBJRm9ybWF0dGluZ1ZpZXdzIH0gZnJvbSAnLi9jYWxlbmRhcic7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERhdGVSYW5nZURlc2NyaXB0b3IgfSBmcm9tICcuLi9jb3JlL2RhdGVzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGlzRGF0ZSB9IGZyb20gJy4uL2NvcmUvdXRpbHMnO1xuXG4vKipcbiAqIFNldHMgdGhlIHNlbGN0aW9uIHR5cGUgLSBzaW5nbGUsIG11bHRpIG9yIHJhbmdlLlxuICovXG5leHBvcnQgZW51bSBDYWxlbmRhclNlbGVjdGlvbiB7XG4gICAgU0lOR0xFID0gJ3NpbmdsZScsXG4gICAgTVVMVEkgPSAnbXVsdGknLFxuICAgIFJBTkdFID0gJ3JhbmdlJ1xufVxuXG5leHBvcnQgZW51bSBTY3JvbGxNb250aCB7XG4gICAgUFJFViA9ICdwcmV2JyxcbiAgICBORVhUID0gJ25leHQnLFxuICAgIE5PTkUgPSAnbm9uZSdcbn1cblxuLyoqIEBoaWRkZW4gQGludGVybmFsICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1tpZ3hDYWxlbmRhckJhc2VdJ1xufSlcbmV4cG9ydCBjbGFzcyBJZ3hDYWxlbmRhckJhc2VEaXJlY3RpdmUgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3RhcnQgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAqIENhbiByZXR1cm4gYSBudW1lcmljIG9yIGFuIGVudW0gcmVwcmVzZW50YXRpb24gb2YgdGhlIHdlZWsgZGF5LlxuICAgICAqIERlZmF1bHRzIHRvIGBTdW5kYXlgIC8gYDBgLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCB3ZWVrU3RhcnQoKTogV0VFS0RBWVMgfCBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxlbmRhck1vZGVsLmZpcnN0V2Vla0RheTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzdGFydCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICogQ2FuIGJlIGFzc2lnbmVkIHRvIGEgbnVtZXJpYyB2YWx1ZSBvciB0byBgV0VFS0RBWVNgIGVudW0gdmFsdWUuXG4gICAgICovXG4gICAgcHVibGljIHNldCB3ZWVrU3RhcnQodmFsdWU6IFdFRUtEQVlTIHwgbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJNb2RlbC5maXJzdFdlZWtEYXkgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBgbG9jYWxlYCBvZiB0aGUgY2FsZW5kYXIuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgXCJlblwiYC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgbG9jYWxlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgYGxvY2FsZWAgb2YgdGhlIGNhbGVuZGFyLlxuICAgICAqIEV4cGVjdHMgYSB2YWxpZCBCQ1AgNDcgbGFuZ3VhZ2UgdGFnLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYFwiZW5cImAuXG4gICAgICovXG4gICAgcHVibGljIHNldCBsb2NhbGUodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9sb2NhbGUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5pbml0Rm9ybWF0dGVycygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRhdGUgZm9ybWF0IG9wdGlvbnMgb2YgdGhlIGRheXMgdmlldy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZm9ybWF0T3B0aW9ucygpOiBJRm9ybWF0dGluZ09wdGlvbnMge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9ybWF0T3B0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBkYXRlIGZvcm1hdCBvcHRpb25zIG9mIHRoZSBkYXlzIHZpZXcuXG4gICAgICogRGVmYXVsdCBpcyB7IGRheTogJ251bWVyaWMnLCBtb250aDogJ3Nob3J0Jywgd2Vla2RheTogJ3Nob3J0JywgeWVhcjogJ251bWVyaWMnIH1cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGZvcm1hdE9wdGlvbnMoZm9ybWF0T3B0aW9uczogSUZvcm1hdHRpbmdPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX2Zvcm1hdE9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHRoaXMuX2Zvcm1hdE9wdGlvbnMsIGZvcm1hdE9wdGlvbnMpO1xuICAgICAgICB0aGlzLmluaXRGb3JtYXR0ZXJzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB3aGV0aGVyIHRoZSBgZGF5YCwgYG1vbnRoYCBhbmQgYHllYXJgIHNob3VsZCBiZSByZW5kZXJlZFxuICAgICAqIGFjY29yZGluZyB0byB0aGUgbG9jYWxlIGFuZCBmb3JtYXRPcHRpb25zLCBpZiBhbnkuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGZvcm1hdFZpZXdzKCk6IElGb3JtYXR0aW5nVmlld3Mge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9ybWF0Vmlld3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB3aGV0aGVyIHRoZSBgZGF5YCwgYG1vbnRoYCBhbmQgYHllYXJgIHNob3VsZCBiZSByZW5kZXJlZFxuICAgICAqIGFjY29yZGluZyB0byB0aGUgbG9jYWxlIGFuZCBmb3JtYXRPcHRpb25zLCBpZiBhbnkuXG4gICAgICovXG4gICAgcHVibGljIHNldCBmb3JtYXRWaWV3cyhmb3JtYXRWaWV3czogSUZvcm1hdHRpbmdWaWV3cykge1xuICAgICAgICB0aGlzLl9mb3JtYXRWaWV3cyA9IE9iamVjdC5hc3NpZ24odGhpcy5fZm9ybWF0Vmlld3MsIGZvcm1hdFZpZXdzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEdldHMgdGhlIHNlbGVjdGlvbiB0eXBlLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYFwic2luZ2xlXCJgLlxuICAgICAqIENoYW5naW5nIHRoZSB0eXBlIG9mIHNlbGVjdGlvbiByZXNldHMgdGhlIGN1cnJlbnRseVxuICAgICAqIHNlbGVjdGVkIHZhbHVlcyBpZiBhbnkuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHNlbGVjdGlvbigpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHNlbGVjdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHNlbGVjdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJTZWxlY3Rpb24uU0lOR0xFOlxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIENhbGVuZGFyU2VsZWN0aW9uLk1VTFRJOlxuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclNlbGVjdGlvbi5SQU5HRTpcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHNlbGVjdGlvbiB2YWx1ZScpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sodGhpcy5zZWxlY3RlZERhdGVzKTtcbiAgICAgICAgdGhpcy5yYW5nZVN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc2VsZWN0ZWQgZGF0ZShzKS5cbiAgICAgKlxuICAgICAqIFdoZW4gc2VsZWN0aW9uIGlzIHNldCB0byBgc2luZ2xlYCwgaXQgcmV0dXJuc1xuICAgICAqIGEgc2luZ2xlIGBEYXRlYCBvYmplY3QuXG4gICAgICogT3RoZXJ3aXNlIGl0IGlzIGFuIGFycmF5IG9mIGBEYXRlYCBvYmplY3RzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCB2YWx1ZSgpOiBEYXRlIHwgRGF0ZVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWREYXRlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzZWxlY3RlZCBkYXRlKHMpLlxuICAgICAqXG4gICAgICogV2hlbiBzZWxlY3Rpb24gaXMgc2V0IHRvIGBzaW5nbGVgLCBpdCBhY2NlcHRzXG4gICAgICogYSBzaW5nbGUgYERhdGVgIG9iamVjdC5cbiAgICAgKiBPdGhlcndpc2UgaXQgaXMgYW4gYXJyYXkgb2YgYERhdGVgIG9iamVjdHMuXG4gICAgICovXG4gICAgcHVibGljIHNldCB2YWx1ZSh2YWx1ZTogRGF0ZSB8IERhdGVbXSkge1xuICAgICAgICBpZiAoIXZhbHVlIHx8ICEhdmFsdWUgJiYgKHZhbHVlIGFzIERhdGVbXSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlbGVjdERhdGUodmFsdWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRhdGUgdGhhdCBpcyBwcmVzZW50ZWQuXG4gICAgICogQnkgZGVmYXVsdCBpdCBpcyB0aGUgY3VycmVudCBkYXRlLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCB2aWV3RGF0ZSgpOiBEYXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZpZXdEYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGRhdGUgdGhhdCB3aWxsIGJlIHByZXNlbnRlZCBpbiB0aGUgZGVmYXVsdCB2aWV3IHdoZW4gdGhlIGNvbXBvbmVudCByZW5kZXJzLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgdmlld0RhdGUodmFsdWU6IERhdGUpIHtcbiAgICAgICAgdGhpcy5fdmlld0RhdGUgPSB0aGlzLmdldERhdGVPbmx5KHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBkaXNhYmxlZCBkYXRlcyBkZXNjcmlwdG9ycy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgZGlzYWJsZWREYXRlcygpOiBEYXRlUmFuZ2VEZXNjcmlwdG9yW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWREYXRlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBkaXNhYmxlZCBkYXRlcycgZGVzY3JpcHRvcnMuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqQFZpZXdDaGlsZChcIk15Q2FsZW5kYXJcIilcbiAgICAgKnB1YmxpYyBjYWxlbmRhcjogSWd4Q2FsZW5kYXJDb21wb25lbnQ7XG4gICAgICpuZ09uSW5pdCgpe1xuICAgICAqICAgIHRoaXMuY2FsZW5kYXIuZGlzYWJsZWREYXRlcyA9IFtcbiAgICAgKiAgICAge3R5cGU6IERhdGVSYW5nZVR5cGUuQmV0d2VlbiwgZGF0ZVJhbmdlOiBbbmV3IERhdGUoXCIyMDIwLTEtMVwiKSwgbmV3IERhdGUoXCIyMDIwLTEtMTVcIildfSxcbiAgICAgKiAgICAge3R5cGU6IERhdGVSYW5nZVR5cGUuV2Vla2VuZHN9XTtcbiAgICAgKn1cbiAgICAgKmBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgZGlzYWJsZWREYXRlcyh2YWx1ZTogRGF0ZVJhbmdlRGVzY3JpcHRvcltdKSB7XG4gICAgICAgIHRoaXMuX2Rpc2FibGVkRGF0ZXMgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzcGVjaWFsIGRhdGVzIGRlc2NyaXB0b3JzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzcGVjaWFsRGF0ZXMoKTogRGF0ZVJhbmdlRGVzY3JpcHRvcltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NwZWNpYWxEYXRlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzcGVjaWFsIGRhdGVzJyBkZXNjcmlwdG9ycy5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICpAVmlld0NoaWxkKFwiTXlDYWxlbmRhclwiKVxuICAgICAqcHVibGljIGNhbGVuZGFyOiBJZ3hDYWxlbmRhckNvbXBvbmVudDtcbiAgICAgKm5nT25Jbml0KCl7XG4gICAgICogICAgdGhpcy5jYWxlbmRhci5zcGVjaWFsRGF0ZXMgPSBbXG4gICAgICogICAgIHt0eXBlOiBEYXRlUmFuZ2VUeXBlLkJldHdlZW4sIGRhdGVSYW5nZTogW25ldyBEYXRlKFwiMjAyMC0xLTFcIiksIG5ldyBEYXRlKFwiMjAyMC0xLTE1XCIpXX0sXG4gICAgICogICAgIHt0eXBlOiBEYXRlUmFuZ2VUeXBlLldlZWtlbmRzfV07XG4gICAgICp9XG4gICAgICpgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHNwZWNpYWxEYXRlcyh2YWx1ZTogRGF0ZVJhbmdlRGVzY3JpcHRvcltdKSB7XG4gICAgICAgIHRoaXMuX3NwZWNpYWxEYXRlcyA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyB3aGV0aGVyIHRoZSBvdXRzaWRlIGRhdGVzIChkYXRlcyB0aGF0IGFyZSBvdXQgb2YgdGhlIGN1cnJlbnQgbW9udGgpIHdpbGwgYmUgaGlkZGVuLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYGZhbHNlYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1jYWxlbmRhciBbaGlkZU91dHNpZGVEYXlzXSA9IFwidHJ1ZVwiPjwvaWd4LWNhbGVuZGFyPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaGlkZU91dHNpZGVEYXlzID0gdGhpcy5jYWxlbmRhci5oaWRlT3V0c2lkZURheXM7XG4gICAgICogYGBgXG4gICAgICovXG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBoaWRlT3V0c2lkZURheXMgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gYSBkYXRlIGlzIHNlbGVjdGVkLlxuICAgICAqIFByb3ZpZGVzIHJlZmVyZW5jZSB0aGUgYHNlbGVjdGVkRGF0ZXNgIHByb3BlcnR5LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBvblNlbGVjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZSB8IERhdGVbXT4oKTtcblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgX3NlbGVjdGlvbjogQ2FsZW5kYXJTZWxlY3Rpb24gfCBzdHJpbmcgPSBDYWxlbmRhclNlbGVjdGlvbi5TSU5HTEU7XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmFuZ2VTdGFydGVkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAqQGhpZGRlblxuICAgICovXG4gICAgcHJpdmF0ZSBfbG9jYWxlID0gJ2VuJztcblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgX3ZpZXdEYXRlOiBEYXRlO1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZGlzYWJsZWREYXRlczogRGF0ZVJhbmdlRGVzY3JpcHRvcltdID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgX3NwZWNpYWxEYXRlczogRGF0ZVJhbmdlRGVzY3JpcHRvcltdID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgX2Zvcm1hdE9wdGlvbnM6IElGb3JtYXR0aW5nT3B0aW9ucyA9IHtcbiAgICAgICAgZGF5OiAnbnVtZXJpYycsXG4gICAgICAgIG1vbnRoOiAnc2hvcnQnLFxuICAgICAgICB3ZWVrZGF5OiAnc2hvcnQnLFxuICAgICAgICB5ZWFyOiAnbnVtZXJpYydcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZm9ybWF0Vmlld3M6IElGb3JtYXR0aW5nVmlld3MgPSB7XG4gICAgICAgIGRheTogZmFsc2UsXG4gICAgICAgIG1vbnRoOiB0cnVlLFxuICAgICAgICB5ZWFyOiBmYWxzZVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZm9ybWF0dGVyV2Vla2RheTtcblxuICAgIC8qKlxuICAgI