UNPKG

igniteui-angular

Version:

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

681 lines • 55.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Input, Output, EventEmitter } from '@angular/core'; import { Calendar, isDateInRanges } from './calendar'; /** @enum {string} */ const CalendarSelection = { SINGLE: 'single', MULTI: 'multi', RANGE: 'range', }; export { CalendarSelection }; export class IgxCalendarBase { /** * @hidden */ constructor() { /** * 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._onTouchedCallback = () => { }; /** * @hidden */ this._onChangeCallback = () => { }; this.calendarModel = new Calendar(); this.viewDate = this.viewDate ? this.viewDate : new Date(); this.calendarModel.firstWeekDay = this.weekStart; this.initFormatters(); } /** * Gets the start day of the week. * Can return a numeric or an enum representation of the week day. * Defaults to `Sunday` / `0`. * @return {?} */ get weekStart() { return this.calendarModel.firstWeekDay; } /** * Sets the start day of the week. * Can be assigned to a numeric value or to `WEEKDAYS` enum value. * @param {?} value * @return {?} */ set weekStart(value) { this.calendarModel.firstWeekDay = value; } /** * Gets the `locale` of the calendar. * Default value is `"en"`. * @return {?} */ get locale() { return this._locale; } /** * Sets the `locale` of the calendar. * Expects a valid BCP 47 language tag. * Default value is `"en"`. * @param {?} value * @return {?} */ set locale(value) { this._locale = value; this.initFormatters(); } /** * Gets the date format options of the days view. * @return {?} */ get formatOptions() { return this._formatOptions; } /** * Sets the date format options of the days view. * Default is { day: 'numeric', month: 'short', weekday: 'short', year: 'numeric' } * @param {?} formatOptions * @return {?} */ set formatOptions(formatOptions) { this._formatOptions = Object.assign(this._formatOptions, formatOptions); this.initFormatters(); } /** * Gets whether the `day`, `month` and `year` should be rendered * according to the locale and formatOptions, if any. * @return {?} */ get formatViews() { return this._formatViews; } /** * Gets whether the `day`, `month` and `year` should be rendered * according to the locale and formatOptions, if any. * @param {?} formatViews * @return {?} */ set formatViews(formatViews) { this._formatViews = Object.assign(this._formatViews, formatViews); } /** * * Gets the selection type. * Default value is `"single"`. * Changing the type of selection resets the currently * selected values if any. * @return {?} */ get selection() { return this._selection; } /** * Sets the selection. * @param {?} value * @return {?} */ set selection(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; } /** * 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. * @return {?} */ get value() { 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. * @param {?} value * @return {?} */ set value(value) { this.selectDate(value); } /** * Gets the date that is presented. * By default it is the current date. * @return {?} */ get viewDate() { return this._viewDate; } /** * Sets the date that will be presented in the default view when the component renders. * @param {?} value * @return {?} */ set viewDate(value) { this._viewDate = this.getDateOnly(value); } /** * Gets the disabled dates descriptors. * @return {?} */ get disabledDates() { 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}]; * } * ``` * @param {?} value * @return {?} */ set disabledDates(value) { this._disabledDates = value; } /** * Gets the special dates descriptors. * @return {?} */ get specialDates() { 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}]; * } * ``` * @param {?} value * @return {?} */ set specialDates(value) { this._specialDates = value; } /** * @hidden * @private * @param {?} date * @return {?} */ getDateOnlyInMs(date) { return this.getDateOnly(date).getTime(); } /** * @hidden * @private * @param {?} start * @param {?} end * @return {?} */ generateDateRange(start, end) { /** @type {?} */ const 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 * @private * @param {?} value * @return {?} */ selectSingle(value) { this.selectedDates = this.getDateOnly(value); this._onChangeCallback(this.selectedDates); } /** * Performs a multiple selection * @hidden * @private * @param {?} value * @return {?} */ selectMultiple(value) { if (Array.isArray(value)) { this.selectedDates = this.selectedDates.concat(value.map(v => this.getDateOnly(v))); } else { /** @type {?} */ const valueDateOnly = this.getDateOnly(value); /** @type {?} */ const newSelection = []; if (this.selectedDates.every((date) => date.getTime() !== valueDateOnly.getTime())) { newSelection.push(valueDateOnly); } else { this.selectedDates = this.selectedDates.filter((date) => date.getTime() !== valueDateOnly.getTime()); } if (newSelection.length > 0) { this.selectedDates = this.selectedDates.concat(newSelection); } } this._onChangeCallback(this.selectedDates); } /** * @hidden * @private * @param {?} value * @param {?=} excludeDisabledDates * @return {?} */ selectRange(value, excludeDisabledDates = false) { /** @type {?} */ let start; /** @type {?} */ let end; if (Array.isArray(value)) { // this.rangeStarted = false; value.sort((a, b) => a.valueOf() - b.valueOf()); start = this.getDateOnly(value[0]); end = this.getDateOnly(value[value.length - 1]); this.selectedDates = [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((a, b) => a.valueOf() - b.valueOf()); start = this.selectedDates.shift(); end = this.selectedDates.pop(); this.selectedDates = [start, ...this.generateDateRange(start, end)]; } } if (excludeDisabledDates) { this.selectedDates = this.selectedDates.filter(d => !this.isDateDisabled(d)); } this._onChangeCallback(this.selectedDates); } /** * Performs a single deselection. * @hidden * @private * @param {?} value * @return {?} */ deselectSingle(value) { if (this.selectedDates !== null && this.getDateOnlyInMs((/** @type {?} */ (value))) === this.getDateOnlyInMs(this.selectedDates)) { this.selectedDates = null; this._onChangeCallback(this.selectedDates); } } /** * Performs a multiple deselection. * @hidden * @private * @param {?} value * @return {?} */ deselectMultiple(value) { value = value.filter(v => v !== null); /** @type {?} */ const selectedDatesCount = this.selectedDates.length; /** @type {?} */ const datesInMsToDeselect = new Set(value.map(v => this.getDateOnlyInMs(v))); for (let 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 a range deselection. * @hidden * @private * @param {?} value * @return {?} */ deselectRange(value) { value = value.filter(v => v !== null); if (value.length < 1) { return; } value.sort((a, b) => a.valueOf() - b.valueOf()); /** @type {?} */ const valueStart = this.getDateOnlyInMs(value[0]); /** @type {?} */ const valueEnd = this.getDateOnlyInMs(value[value.length - 1]); this.selectedDates.sort((a, b) => a.valueOf() - b.valueOf()); /** @type {?} */ const selectedDatesStart = this.getDateOnlyInMs(this.selectedDates[0]); /** @type {?} */ const selectedDatesEnd = this.getDateOnlyInMs(this.selectedDates[this.selectedDates.length - 1]); if (!(valueEnd < selectedDatesStart) && !(valueStart > selectedDatesEnd)) { this.selectedDates = []; this.rangeStarted = false; this._onChangeCallback(this.selectedDates); } } /** * @hidden * @protected * @return {?} */ initFormatters() { 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 * @protected * @param {?} date * @return {?} */ getDateOnly(date) { return new Date(date.getFullYear(), date.getMonth(), date.getDate()); } /** * @hidden * @param {?} fn * @return {?} */ registerOnChange(fn) { this._onChangeCallback = fn; } /** * @hidden * @param {?} fn * @return {?} */ registerOnTouched(fn) { this._onTouchedCallback = fn; } /** * @hidden * @param {?} value * @return {?} */ writeValue(value) { this.selectedDates = value; } /** * Checks whether a date is disabled. * @hidden * @param {?} date * @return {?} */ isDateDisabled(date) { if (this.disabledDates === null) { return false; } return isDateInRanges(date, this.disabledDates); } /** * Selects date(s) (based on the selection type). * @param {?} value * @return {?} */ selectDate(value) { if (value === null || value === undefined || (Array.isArray(value) && value.length === 0)) { return new Date(); } switch (this.selection) { case CalendarSelection.SINGLE: this.selectSingle((/** @type {?} */ (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). * @param {?=} value * @return {?} */ deselectDate(value) { if (this.selectedDates === null || this.selectedDates === []) { 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((/** @type {?} */ (value))); break; case CalendarSelection.MULTI: this.deselectMultiple((/** @type {?} */ (value))); break; case CalendarSelection.RANGE: this.deselectRange((/** @type {?} */ (value))); break; } } /** * @hidden * @param {?} value * @return {?} */ selectDateFromClient(value) { switch (this.selection) { case CalendarSelection.SINGLE: case CalendarSelection.MULTI: if (!this.isDateDisabled(value)) { this.selectDate(value); } break; case CalendarSelection.RANGE: this.selectRange(value, true); break; } } } IgxCalendarBase.propDecorators = { weekStart: [{ type: Input }], locale: [{ type: Input }], formatOptions: [{ type: Input }], formatViews: [{ type: Input }], selection: [{ type: Input }], value: [{ type: Input }], viewDate: [{ type: Input }], disabledDates: [{ type: Input }], specialDates: [{ type: Input }], onSelection: [{ type: Output }] }; if (false) { /** * Emits an event when a date is selected. * Provides reference the `selectedDates` property. * @type {?} */ IgxCalendarBase.prototype.onSelection; /** * @hidden * @type {?} * @private */ IgxCalendarBase.prototype._selection; /** * @hidden * @type {?} * @private */ IgxCalendarBase.prototype.rangeStarted; /** * @hidden * @type {?} * @private */ IgxCalendarBase.prototype._locale; /** * @hidden * @type {?} * @private */ IgxCalendarBase.prototype._viewDate; /** * @hidden * @type {?} * @private */ IgxCalendarBase.prototype._disabledDates; /** * @hidden * @type {?} * @private */ IgxCalendarBase.prototype._specialDates; /** * @hidden * @type {?} * @private */ IgxCalendarBase.prototype._formatOptions; /** * @hidden * @type {?} * @private */ IgxCalendarBase.prototype._formatViews; /** * @hidden * @type {?} * @protected */ IgxCalendarBase.prototype.formatterWeekday; /** * @hidden * @type {?} * @protected */ IgxCalendarBase.prototype.formatterDay; /** * @hidden * @type {?} * @protected */ IgxCalendarBase.prototype.formatterMonth; /** * @hidden * @type {?} * @protected */ IgxCalendarBase.prototype.formatterYear; /** * @hidden * @type {?} * @protected */ IgxCalendarBase.prototype.formatterMonthday; /** * @hidden * @type {?} */ IgxCalendarBase.prototype.calendarModel; /** * @hidden * @type {?} */ IgxCalendarBase.prototype.selectedDates; /** * @hidden * @type {?} * @protected */ IgxCalendarBase.prototype._onTouchedCallback; /** * @hidden * @type {?} * @protected */ IgxCalendarBase.prototype._onChangeCallback; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItYmFzZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY2FsZW5kYXIvY2FsZW5kYXItYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVELE9BQU8sRUFBWSxRQUFRLEVBQUUsY0FBYyxFQUF3QyxNQUFNLFlBQVksQ0FBQzs7O0lBU2xHLFFBQVMsUUFBUTtJQUNqQixPQUFRLE9BQU87SUFDZixPQUFRLE9BQU87OztBQUduQixNQUFNLE9BQU8sZUFBZTs7OztJQXNTeEI7Ozs7O1FBbEdPLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQWlCLENBQUM7Ozs7UUFLL0MsZUFBVSxHQUErQixpQkFBaUIsQ0FBQyxNQUFNLENBQUM7Ozs7UUFLbEUsaUJBQVksR0FBRyxLQUFLLENBQUM7Ozs7UUFLckIsWUFBTyxHQUFHLElBQUksQ0FBQzs7OztRQVVmLG1CQUFjLEdBQTBCLElBQUksQ0FBQzs7OztRQUs3QyxrQkFBYSxHQUEwQixJQUFJLENBQUM7Ozs7UUFLNUMsbUJBQWMsR0FBdUI7WUFDekMsR0FBRyxFQUFFLFNBQVM7WUFDZCxLQUFLLEVBQUUsT0FBTztZQUNkLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLElBQUksRUFBRSxTQUFTO1NBQ2xCLENBQUM7Ozs7UUFLTSxpQkFBWSxHQUFxQjtZQUNyQyxHQUFHLEVBQUUsS0FBSztZQUNWLEtBQUssRUFBRSxJQUFJO1lBQ1gsSUFBSSxFQUFFLEtBQUs7U0FDZCxDQUFDOzs7O1FBd0NRLHVCQUFrQixHQUFlLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzs7OztRQUkzQyxzQkFBaUIsR0FBc0IsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBTXZELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUVwQyxJQUFJ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Ozs7SUFLdkIseUNBQXlCOzs7Ozs7SUFLekIsd0NBQXdCOzs7Ozs7SUFLeEIsNENBQTRCOzs7OztJQUs1Qix3Q0FBK0I7Ozs7O0lBSy9CLHdDQUFxQjs7Ozs7O0lBS3JCLDZDQUFxRDs7Ozs7O0lBSXJELDRDQUEyRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgV0VFS0RBWVMsIENhbGVuZGFyLCBpc0RhdGVJblJhbmdlcywgSUZvcm1hdHRpbmdPcHRpb25zLCBJRm9ybWF0dGluZ1ZpZXdzIH0gZnJvbSAnLi9jYWxlbmRhcic7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERhdGVSYW5nZURlc2NyaXB0b3IgfSBmcm9tICcuLi9jb3JlL2RhdGVzJztcblxuXG4vKipcbiAqIFNldHMgdGhlIHNlbGN0aW9uIHR5cGUgLSBzaW5nbGUsIG11bHRpIG9yIHJhbmdlLlxuICovXG5leHBvcnQgZW51bSBDYWxlbmRhclNlbGVjdGlvbiB7XG4gICAgU0lOR0xFID0gJ3NpbmdsZScsXG4gICAgTVVMVEkgPSAnbXVsdGknLFxuICAgIFJBTkdFID0gJ3JhbmdlJ1xufVxuXG5leHBvcnQgY2xhc3MgSWd4Q2FsZW5kYXJCYXNlIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHN0YXJ0IGRheSBvZiB0aGUgd2Vlay5cbiAgICAgKiBDYW4gcmV0dXJuIGEgbnVtZXJpYyBvciBhbiBlbnVtIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB3ZWVrIGRheS5cbiAgICAgKiBEZWZhdWx0cyB0byBgU3VuZGF5YCAvIGAwYC5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgd2Vla1N0YXJ0KCk6IFdFRUtEQVlTIHwgbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsZW5kYXJNb2RlbC5maXJzdFdlZWtEYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RhcnQgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAqIENhbiBiZSBhc3NpZ25lZCB0byBhIG51bWVyaWMgdmFsdWUgb3IgdG8gYFdFRUtEQVlTYCBlbnVtIHZhbHVlLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgd2Vla1N0YXJ0KHZhbHVlOiBXRUVLREFZUyB8IG51bWJlcikge1xuICAgICAgICB0aGlzLmNhbGVuZGFyTW9kZWwuZmlyc3RXZWVrRGF5ID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYGxvY2FsZWAgb2YgdGhlIGNhbGVuZGFyLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYFwiZW5cImAuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGxvY2FsZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGBsb2NhbGVgIG9mIHRoZSBjYWxlbmRhci5cbiAgICAgKiBFeHBlY3RzIGEgdmFsaWQgQkNQIDQ3IGxhbmd1YWdlIHRhZy5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBcImVuXCJgLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgbG9jYWxlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fbG9jYWxlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuaW5pdEZvcm1hdHRlcnMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBkYXRlIGZvcm1hdCBvcHRpb25zIG9mIHRoZSBkYXlzIHZpZXcuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGZvcm1hdE9wdGlvbnMoKTogSUZvcm1hdHRpbmdPcHRpb25zIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdE9wdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZGF0ZSBmb3JtYXQgb3B0aW9ucyBvZiB0aGUgZGF5cyB2aWV3LlxuICAgICAqIERlZmF1bHQgaXMgeyBkYXk6ICdudW1lcmljJywgbW9udGg6ICdzaG9ydCcsIHdlZWtkYXk6ICdzaG9ydCcsIHllYXI6ICdudW1lcmljJyB9XG4gICAgICovXG4gICAgcHVibGljIHNldCBmb3JtYXRPcHRpb25zKGZvcm1hdE9wdGlvbnM6IElGb3JtYXR0aW5nT3B0aW9ucykge1xuICAgICAgICB0aGlzLl9mb3JtYXRPcHRpb25zID0gT2JqZWN0LmFzc2lnbih0aGlzLl9mb3JtYXRPcHRpb25zLCBmb3JtYXRPcHRpb25zKTtcbiAgICAgICAgdGhpcy5pbml0Rm9ybWF0dGVycygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgd2hldGhlciB0aGUgYGRheWAsIGBtb250aGAgYW5kIGB5ZWFyYCBzaG91bGQgYmUgcmVuZGVyZWRcbiAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIGxvY2FsZSBhbmQgZm9ybWF0T3B0aW9ucywgaWYgYW55LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBmb3JtYXRWaWV3cygpOiBJRm9ybWF0dGluZ1ZpZXdzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdFZpZXdzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgd2hldGhlciB0aGUgYGRheWAsIGBtb250aGAgYW5kIGB5ZWFyYCBzaG91bGQgYmUgcmVuZGVyZWRcbiAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIGxvY2FsZSBhbmQgZm9ybWF0T3B0aW9ucywgaWYgYW55LlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgZm9ybWF0Vmlld3MoZm9ybWF0Vmlld3M6IElGb3JtYXR0aW5nVmlld3MpIHtcbiAgICAgICAgdGhpcy5fZm9ybWF0Vmlld3MgPSBPYmplY3QuYXNzaWduKHRoaXMuX2Zvcm1hdFZpZXdzLCBmb3JtYXRWaWV3cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBHZXRzIHRoZSBzZWxlY3Rpb24gdHlwZS5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGBcInNpbmdsZVwiYC5cbiAgICAgKiBDaGFuZ2luZyB0aGUgdHlwZSBvZiBzZWxlY3Rpb24gcmVzZXRzIHRoZSBjdXJyZW50bHlcbiAgICAgKiBzZWxlY3RlZCB2YWx1ZXMgaWYgYW55LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBzZWxlY3Rpb24oKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBzZWxlY3Rpb24uXG4gICAgICovXG4gICAgcHVibGljIHNldCBzZWxlY3Rpb24odmFsdWU6IHN0cmluZykge1xuICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICBjYXNlIENhbGVuZGFyU2VsZWN0aW9uLlNJTkdMRTpcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZXMgPSBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBDYWxlbmRhclNlbGVjdGlvbi5NVUxUSTpcbiAgICAgICAgICAgIGNhc2UgQ2FsZW5kYXJTZWxlY3Rpb24uUkFOR0U6XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVzID0gW107XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzZWxlY3Rpb24gdmFsdWUnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKHRoaXMuc2VsZWN0ZWREYXRlcyk7XG4gICAgICAgIHRoaXMucmFuZ2VTdGFydGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3NlbGVjdGlvbiA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHNlbGVjdGVkIGRhdGUocykuXG4gICAgICpcbiAgICAgKiBXaGVuIHNlbGVjdGlvbiBpcyBzZXQgdG8gYHNpbmdsZWAsIGl0IHJldHVybnNcbiAgICAgKiBhIHNpbmdsZSBgRGF0ZWAgb2JqZWN0LlxuICAgICAqIE90aGVyd2lzZSBpdCBpcyBhbiBhcnJheSBvZiBgRGF0ZWAgb2JqZWN0cy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgdmFsdWUoKTogRGF0ZSB8IERhdGVbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRGF0ZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc2VsZWN0ZWQgZGF0ZShzKS5cbiAgICAgKlxuICAgICAqIFdoZW4gc2VsZWN0aW9uIGlzIHNldCB0byBgc2luZ2xlYCwgaXQgYWNjZXB0c1xuICAgICAqIGEgc2luZ2xlIGBEYXRlYCBvYmplY3QuXG4gICAgICogT3RoZXJ3aXNlIGl0IGlzIGFuIGFycmF5IG9mIGBEYXRlYCBvYmplY3RzLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXQgdmFsdWUodmFsdWU6IERhdGUgfCBEYXRlW10pIHtcbiAgICAgICAgdGhpcy5zZWxlY3REYXRlKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBkYXRlIHRoYXQgaXMgcHJlc2VudGVkLlxuICAgICAqIEJ5IGRlZmF1bHQgaXQgaXMgdGhlIGN1cnJlbnQgZGF0ZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgdmlld0RhdGUoKTogRGF0ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92aWV3RGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBkYXRlIHRoYXQgd2lsbCBiZSBwcmVzZW50ZWQgaW4gdGhlIGRlZmF1bHQgdmlldyB3aGVuIHRoZSBjb21wb25lbnQgcmVuZGVycy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IHZpZXdEYXRlKHZhbHVlOiBEYXRlKSB7XG4gICAgICAgIHRoaXMuX3ZpZXdEYXRlID0gdGhpcy5nZXREYXRlT25seSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZGlzYWJsZWQgZGF0ZXMgZGVzY3JpcHRvcnMuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVkRGF0ZXMoKTogRGF0ZVJhbmdlRGVzY3JpcHRvcltdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkRGF0ZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZGlzYWJsZWQgZGF0ZXMnIGRlc2NyaXB0b3JzLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKkBWaWV3Q2hpbGQoXCJNeUNhbGVuZGFyXCIpXG4gICAgICpwdWJsaWMgY2FsZW5kYXI6IElneENhbGVuZGFyQ29tcG9uZW50O1xuICAgICAqbmdPbkluaXQoKXtcbiAgICAgKiAgICB0aGlzLmNhbGVuZGFyLmRpc2FibGVkRGF0ZXMgPSBbXG4gICAgICogICAgIHt0eXBlOiBEYXRlUmFuZ2VUeXBlLkJldHdlZW4sIGRhdGVSYW5nZTogW25ldyBEYXRlKFwiMjAyMC0xLTFcIiksIG5ldyBEYXRlKFwiMjAyMC0xLTE1XCIpXX0sXG4gICAgICogICAgIHt0eXBlOiBEYXRlUmFuZ2VUeXBlLldlZWtlbmRzfV07XG4gICAgICp9XG4gICAgICpgYGBcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGRpc2FibGVkRGF0ZXModmFsdWU6IERhdGVSYW5nZURlc2NyaXB0b3JbXSkge1xuICAgICAgICB0aGlzLl9kaXNhYmxlZERhdGVzID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgc3BlY2lhbCBkYXRlcyBkZXNjcmlwdG9ycy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgc3BlY2lhbERhdGVzKCk6IERhdGVSYW5nZURlc2NyaXB0b3JbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zcGVjaWFsRGF0ZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3BlY2lhbCBkYXRlcycgZGVzY3JpcHRvcnMuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqQFZpZXdDaGlsZChcIk15Q2FsZW5kYXJcIilcbiAgICAgKnB1YmxpYyBjYWxlbmRhcjogSWd4Q2FsZW5kYXJDb21wb25lbnQ7XG4gICAgICpuZ09uSW5pdCgpe1xuICAgICAqICAgIHRoaXMuY2FsZW5kYXIuc3BlY2lhbERhdGVzID0gW1xuICAgICAqICAgICB7dHlwZTogRGF0ZVJhbmdlVHlwZS5CZXR3ZWVuLCBkYXRlUmFuZ2U6IFtuZXcgRGF0ZShcIjIwMjAtMS0xXCIpLCBuZXcgRGF0ZShcIjIwMjAtMS0xNVwiKV19LFxuICAgICAqICAgICB7dHlwZTogRGF0ZVJhbmdlVHlwZS5XZWVrZW5kc31dO1xuICAgICAqfVxuICAgICAqYGBgXG4gICAgICovXG4gICAgcHVibGljIHNldCBzcGVjaWFsRGF0ZXModmFsdWU6IERhdGVSYW5nZURlc2NyaXB0b3JbXSkge1xuICAgICAgICB0aGlzLl9zcGVjaWFsRGF0ZXMgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbWl0cyBhbiBldmVudCB3aGVuIGEgZGF0ZSBpcyBzZWxlY3RlZC5cbiAgICAgKiBQcm92aWRlcyByZWZlcmVuY2UgdGhlIGBzZWxlY3RlZERhdGVzYCBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25TZWxlY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPERhdGUgfCBEYXRlW10+KCk7XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9zZWxlY3Rpb246IENhbGVuZGFyU2VsZWN0aW9uIHwgc3RyaW5nID0gQ2FsZW5kYXJTZWxlY3Rpb24uU0lOR0xFO1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSByYW5nZVN0YXJ0ZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICpAaGlkZGVuXG4gICAgKi9cbiAgICBwcml2YXRlIF9sb2NhbGUgPSAnZW4nO1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfdmlld0RhdGU6IERhdGU7XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9kaXNhYmxlZERhdGVzOiBEYXRlUmFuZ2VEZXNjcmlwdG9yW10gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc3BlY2lhbERhdGVzOiBEYXRlUmFuZ2VEZXNjcmlwdG9yW10gPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZm9ybWF0T3B0aW9uczogSUZvcm1hdHRpbmdPcHRpb25zID0ge1xuICAgICAgICBkYXk6ICdudW1lcmljJyxcbiAgICAgICAgbW9udGg6ICdzaG9ydCcsXG4gICAgICAgIHdlZWtkYXk6ICdzaG9ydCcsXG4gICAgICAgIHllYXI6ICdudW1lcmljJ1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9mb3JtYXRWaWV3czogSUZvcm1hdHRpbmdWaWV3cyA9IHtcbiAgICAgICAgZGF5OiBmYWxzZSxcbiAgICAgICAgbW9udGg6IHRydWUsXG4gICAgICAgIHllYXI6IGZhbHNlXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBmb3JtYXR0ZXJXZWVrZGF5O1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGZvcm1hdHRlckRheTtcblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBmb3JtYXR0ZXJNb250aDtcblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBmb3JtYXR0ZXJZZWFyO1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGZvcm1hdHRlck1vbnRoZGF5O1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGNhbGVuZGFyTW9kZWw6IENhbGVuZGFyO1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHNlbGVjdGVkRGF0ZXM7XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX29uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gKCkgPT4geyB9O1xuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByb3RlY3RlZCBfb25DaGFuZ2VDYWxsYmFjazogKF86IERhdGUpID0+IHZvaWQgPSAoKSA9PiB7IH07XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJNb2RlbCA9IG5ldyBDYWxlbmRhcigpO1xuXG4gICAgICAgIHRoaXMudmlld0RhdGUgPSB0aGlzLnZpZXdEYXRlID8gdGhpcy52aWV3RGF0ZSA6IG5ldyBEYXRlKCk7XG5cbiAgICAgICAgdGhpcy5jYWxlbmRhck1vZGVsLmZpcnN0V2Vla0RheSA9IHRoaXMud2Vla1N0YXJ0O1xuICAgICAgICB0aGlzLmluaXRGb3JtYXR0ZXJzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXREYXRlT25seUluTXMoZGF0ZTogRGF0ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXREYXRlT25seShkYXRlKS5nZXRUaW1lKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZURhdGVSYW5nZShzdGFydDogRGF0ZSwgZW5kOiBEYXRlKTogRGF0ZVtdIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgICAgIHN0YXJ0ID0gdGhpcy5nZXREYXRlT25seShzdGFydCk7XG4gICAgICAgIGVuZCA9IHRoaXMuZ2V0RGF0ZU9ubHkoZW5kKTtcbiAgICAgICAgd2hpbGUgKHN0YXJ0LmdldFRpbWUoKSAhPT0gZW5kLmdldFRpbWUoKSkge1xuICAgICAgICAgICAgc3RhcnQgPSB0aGlzLmNhbGVuZGFyTW9kZWwudGltZWRlbHRhKHN0YXJ0LCAnZGF5JywgMSk7XG4gICAgICAgICAgICByZXN1bHQucHVzaChzdGFydCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgc2luZ2xlIHNlbGVjdGlvbi5cbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZWxlY3RTaW5nbGUodmFsdWU6IERhdGUpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVzID0gdGhpcy5nZXREYXRlT25seSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sodGhpcy5zZWxlY3RlZERhdGVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhIG11bHRpcGxlIHNlbGVjdGlvblxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIHNlbGVjdE11bHRpcGxlKHZhbHVlOiBEYXRlIHwgRGF0ZVtdKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVzID0gdGhpcy5zZWxlY3RlZERhdGVzLmNvbmNhdCh2YWx1ZS5tYXAodiA9PiB0aGlzLmdldERhdGVPbmx5KHYpKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZURhdGVPbmx5ID0gdGhpcy5nZXREYXRlT25seSh2YWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBuZXdTZWxlY3Rpb24gPSBbXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRGF0ZXMuZXZlcnkoKGRhdGU6IERhdGUpID0+IGRhdGUuZ2V0VGltZSgpICE9PSB2YWx1ZURhdGVPbmx5LmdldFRpbWUoKSkpIHtcbiAgICAgICAgICAgICAgICBuZXdTZWxlY3Rpb24ucHVzaCh2YWx1ZURhdGVPbmx5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVzID0gdGhpcy5zZWxlY3RlZERhdGVzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgKGRhdGU6IERhdGUpID0+IGRhdGUuZ2V0VGltZSgpICE9PSB2YWx1ZURhdGVPbmx5LmdldFRpbWUoKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChuZXdTZWxlY3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlcyA9IHRoaXMuc2VsZWN0ZWREYXRlcy5jb25jYXQobmV3U2VsZWN0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sodGhpcy5zZWxlY3RlZERhdGVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIHNlbGVjdFJhbmdlKHZhbHVlOiBEYXRlIHwgRGF0ZVtdLCBleGNsdWRlRGlzYWJsZWREYXRlczogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIGxldCBzdGFydDogRGF0ZTtcbiAgICAgICAgbGV0IGVuZDogRGF0ZTtcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIC8vIHRoaXMucmFuZ2VTdGFydGVkID0gZmFsc2U7XG4gICAgICAgICAgICB2YWx1ZS5zb3J0KChhOiBEYXRlLCBiOiBEYXRlKSA9PiBhLnZhbHVlT2YoKSAtIGIudmFsdWVPZigpKTtcbiAgICAgICAgICAgIHN0YXJ0ID0gdGhpcy5nZXREYXRlT25seSh2YWx1ZVswXSk7XG4gICAgICAgICAgICBlbmQgPSB0aGlzLmdldERhdGVPbmx5KHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlcyA9IFtzdGFydCwgLi4udGhpcy5nZW5lcmF0ZURhdGVSYW5nZShzdGFydCwgZW5kKV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmFuZ2VTdGFydGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yYW5nZVN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlcyA9IFt2YWx1ZV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucmFuZ2VTdGFydGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZERhdGVzWzBdLmdldFRpbWUoKSA9PT0gdmFsdWUuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKHRoaXMuc2VsZWN0ZWREYXRlcyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVzLnNvcnQoKGE6IERhdGUsIGI6IERhdGUpID0+IGEudmFsdWVPZigpIC0gYi52YWx1ZU9mKCkpO1xuXG4gICAgICAgICAgICAgICAgc3RhcnQgPSB0aGlzLnNlbGVjdGVkRGF0ZXMuc2hpZnQoKTtcbiAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLnNlbGVjdGVkRGF0ZXMucG9wKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVzID0gW3N0YXJ0LCAuLi50aGlzLmdlbmVyYXRlRGF0ZVJhbmdlKHN0YXJ0LCBlbmQpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChleGNsdWRlRGlzYWJsZWREYXRlcykge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVzID0gdGhpcy5zZWxlY3RlZERhdGVzLmZpbHRlcihkID0+ICF0aGlzLmlzRGF0ZURpc2FibGVkKGQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sodGhpcy5zZWxlY3RlZERhdGVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhIHNpbmdsZSBkZXNlbGVjdGlvbi5cbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBkZXNlbGVjdFNpbmdsZSh2YWx1ZTogRGF0ZSkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZERhdGVzICE9PSBudWxsICYmXG4gICAgICAgICAgICB0aGlzLmdldERhdGVPbmx5SW5Ncyh2YWx1ZSBhcyBEYXRlKSA9PT0gdGhpcy5nZXREYXRlT25seUluTXModGhpcy5zZWxlY3RlZERhdGVzKSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGVzID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sodGhpcy5zZWxlY3RlZERhdGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGEgbXVsdGlwbGUgZGVzZWxlY3Rpb24uXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgZGVzZWxlY3RNdWx0aXBsZSh2YWx1ZTogRGF0ZVtdKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUuZmlsdGVyKHYgPT4gdiAhPT0gbnVsbCk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRGF0ZXNDb3VudCA9IHRoaXMuc2VsZWN0ZWREYXRlcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGRhdGVzSW5Nc1RvRGVzZWxlY3Q6IFNldDxudW1iZXI+ID0gbmV3IFNldDxudW1iZXI+KFxuICAgICAgICAgICAgdmFsdWUubWFwKHYgPT4gdGhpcy5nZXREYXRlT25seUluTXModikpKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5zZWxlY3RlZERhdGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAoZGF0ZXNJbk1zVG9EZXNlbGVjdC5oYXModGhpcy5nZXREYXRlT25seUluTXModGhpcy5zZWxlY3RlZERhdGVzW2ldKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkRGF0ZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlcy5sZW5ndGggIT09IHNlbGVjdGVkRGF0ZXNDb3VudCkge1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayh0aGlzLnNlbGVjdGVkRGF0ZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYSByYW5nZSBkZXNlbGVjdGlvbi5cbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBkZXNlbGVjdFJhbmdlKHZhbHVlOiBEYXRlW10pIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5maWx0ZXIodiA9PiB2ICE9PSBudWxsKTtcbiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlLnNvcnQoKGE6IERhdGUsIGI6IERhdGUpID0+IGEudmFsdWVPZigpIC0gYi52YWx1ZU9mKCkpO1