@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
402 lines • 38 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { Component, Output, EventEmitter, Input, HostBinding, HostListener, ViewChildren, QueryList, ElementRef } from '@angular/core';
import { Calendar } from '../calendar';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { IgxCalendarMonthDirective } from '../calendar.directives';
var NEXT_ID = 0;
var IgxMonthsViewComponent = /** @class */ (function () {
function IgxMonthsViewComponent(el) {
this.el = el;
/**
* Sets/gets the `id` of the months view.
* If not set, the `id` will have value `"igx-months-view-0"`.
* ```html
* <igx-months-view id="my-months-view"></igx-months-view>
* ```
* ```typescript
* let monthsViewId = this.monthsView.id;
* ```
* @memberof IgxMonthsViewComponent
*/
this.id = "igx-months-view-" + NEXT_ID++;
/**
* Gets/sets the selected date of the months view.
* By default it is the current date.
* ```html
* <igx-months-view [date]="myDate"></igx-months-view>
* ```
* ```typescript
* let date = this.monthsView.date;
* ```
* @memberof IgxMonthsViewComponent
*/
this.date = new Date();
/**
* Gets/sets whether the view should be rendered
* according to the locale and monthFormat, if any.
*/
this.formatView = true;
/**
* Emits an event when a selection is made in the months view.
* Provides reference the `date` property in the `IgxMonthsViewComponent`.
* ```html
* <igx-months-view (onSelection)="onSelection($event)"></igx-months-view>
* ```
* @memberof IgxMonthsViewComponent
*/
this.onSelection = new EventEmitter();
/**
* The default css class applied to the component.
*
* @hidden
*/
this.styleClass = true;
/**
* The default `tabindex` attribute for the component.
*
* @hidden
*/
this.tabindex = 0;
/**
*@hidden
*/
this._locale = 'en';
/**
*@hidden
*/
this._monthFormat = 'short';
/**
*@hidden
*/
this._onTouchedCallback = function () { };
/**
*@hidden
*/
this._onChangeCallback = function () { };
this.initMonthFormatter();
this._calendarModel = new Calendar();
}
IgxMonthsViewComponent_1 = IgxMonthsViewComponent;
Object.defineProperty(IgxMonthsViewComponent.prototype, "monthFormat", {
/**
* Gets the month format option of the months view.
* ```typescript
* let monthFormat = this.monthsView.monthFormat.
* ```
*/
get: function () {
return this._monthFormat;
},
/**
* Sets the month format option of the months view.
* ```html
* <igx-months-view> [monthFormat] = "short'"</igx-months-view>
* ```
* @memberof IgxMonthsViewComponent
*/
set: function (value) {
this._monthFormat = value;
this.initMonthFormatter();
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxMonthsViewComponent.prototype, "locale", {
/**
* Gets the `locale` of the months view.
* Default value is `"en"`.
* ```typescript
* let locale = this.monthsView.locale;
* ```
* @memberof IgxMonthsViewComponent
*/
get: function () {
return this._locale;
},
/**
* Sets the `locale` of the months view.
* Expects a valid BCP 47 language tag.
* Default value is `"en"`.
* ```html
* <igx-months-view [locale]="de"></igx-months-view>
* ```
* @memberof IgxMonthsViewComponent
*/
set: function (value) {
this._locale = value;
this.initMonthFormatter();
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxMonthsViewComponent.prototype, "months", {
/**
* Returns an array of date objects which are then used to
* properly render the month names.
*
* Used in the template of the component
*
* @hidden
*/
get: function () {
var start = new Date(this.date.getFullYear(), 0, 1);
var result = [];
for (var i = 0; i < 12; i++) {
result.push(start);
start = this._calendarModel.timedelta(start, 'month', 1);
}
return result;
},
enumerable: true,
configurable: true
});
/**
* Returns the locale representation of the month in the months view.
*
* @hidden
*/
IgxMonthsViewComponent.prototype.formattedMonth = function (value) {
if (this.formatView) {
return this._formatterMonth.format(value);
}
return "" + value.getMonth();
};
/**
*@hidden
*/
IgxMonthsViewComponent.prototype.selectMonth = function (event) {
this.onSelection.emit(event);
this.date = event;
this._onChangeCallback(this.date);
};
/**
* @hidden
*/
IgxMonthsViewComponent.prototype.registerOnChange = function (fn) {
this._onChangeCallback = fn;
};
/**
* @hidden
*/
IgxMonthsViewComponent.prototype.registerOnTouched = function (fn) {
this._onTouchedCallback = fn;
};
/**
* @hidden
*/
IgxMonthsViewComponent.prototype.writeValue = function (value) {
if (value) {
this.date = value;
}
};
/**
* @hidden
*/
IgxMonthsViewComponent.prototype.monthTracker = function (index, item) {
return item.getMonth() + "}";
};
/**
*@hidden
*/
IgxMonthsViewComponent.prototype.initMonthFormatter = function () {
this._formatterMonth = new Intl.DateTimeFormat(this._locale, { month: this.monthFormat });
};
/**
* @hidden
*/
IgxMonthsViewComponent.prototype.onKeydownArrowUp = function (event) {
event.preventDefault();
event.stopPropagation();
var node = this.dates.find(function (date) { return date.nativeElement === event.target; });
if (!node) {
return;
}
var months = this.dates.toArray();
var nodeRect = node.nativeElement.getBoundingClientRect();
for (var index = months.indexOf(node) - 1; index >= 0; index--) {
var nextNodeRect = months[index].nativeElement.getBoundingClientRect();
var tolerance = 6;
if (nodeRect.top !== nextNodeRect.top && (nextNodeRect.left - nodeRect.left) < tolerance) {
months[index].nativeElement.focus();
break;
}
}
};
/**
* @hidden
*/
IgxMonthsViewComponent.prototype.onKeydownArrowDown = function (event) {
event.preventDefault();
event.stopPropagation();
var node = this.dates.find(function (date) { return date.nativeElement === event.target; });
if (!node) {
return;
}
var months = this.dates.toArray();
var nodeRect = node.nativeElement.getBoundingClientRect();
for (var index = months.indexOf(node) + 1; index < months.length; index++) {
var nextNodeRect = months[index].nativeElement.getBoundingClientRect();
var tolerance = 6;
if (nextNodeRect.top !== nodeRect.top && (nodeRect.left - nextNodeRect.left) < tolerance) {
months[index].nativeElement.focus();
break;
}
}
};
/**
* @hidden
*/
IgxMonthsViewComponent.prototype.onKeydownArrowRight = function (event) {
event.preventDefault();
event.stopPropagation();
var node = this.dates.find(function (date) { return date.nativeElement === event.target; });
if (!node) {
return;
}
var months = this.dates.toArray();
if (months.indexOf(node) + 1 < months.length) {
var month = months[months.indexOf(node) + 1];
month.nativeElement.focus();
}
};
/**
* @hidden
*/
IgxMonthsViewComponent.prototype.onKeydownArrowLeft = function (event) {
event.preventDefault();
event.stopPropagation();
var node = this.dates.find(function (date) { return date.nativeElement === event.target; });
if (!node) {
return;
}
var months = this.dates.toArray();
if (months.indexOf(node) - 1 >= 0) {
var month = months[months.indexOf(node) - 1];
month.nativeElement.focus();
}
};
/**
* @hidden
*/
IgxMonthsViewComponent.prototype.onKeydownHome = function (event) {
event.preventDefault();
event.stopPropagation();
var month = this.dates.toArray()[0];
month.nativeElement.focus();
};
/**
* @hidden
*/
IgxMonthsViewComponent.prototype.onKeydownEnd = function (event) {
event.preventDefault();
event.stopPropagation();
var months = this.dates.toArray();
var month = months[months.length - 1];
month.nativeElement.focus();
};
/**
* @hidden
*/
IgxMonthsViewComponent.prototype.onKeydownEnter = function (event) {
var value = this.dates.find(function (date) { return date.nativeElement === event.target; }).value;
this.date = new Date(value.getFullYear(), value.getMonth(), this.date.getDate());
this.onSelection.emit(this.date);
this._onChangeCallback(this.date);
};
var IgxMonthsViewComponent_1;
IgxMonthsViewComponent.ctorParameters = function () { return [
{ type: ElementRef }
]; };
__decorate([
HostBinding('attr.id'),
Input(),
__metadata("design:type", Object)
], IgxMonthsViewComponent.prototype, "id", void 0);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxMonthsViewComponent.prototype, "date", void 0);
__decorate([
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], IgxMonthsViewComponent.prototype, "monthFormat", null);
__decorate([
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], IgxMonthsViewComponent.prototype, "locale", null);
__decorate([
Input(),
__metadata("design:type", Object)
], IgxMonthsViewComponent.prototype, "formatView", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], IgxMonthsViewComponent.prototype, "onSelection", void 0);
__decorate([
HostBinding('class.igx-calendar'),
__metadata("design:type", Object)
], IgxMonthsViewComponent.prototype, "styleClass", void 0);
__decorate([
ViewChildren(IgxCalendarMonthDirective, { read: IgxCalendarMonthDirective }),
__metadata("design:type", QueryList)
], IgxMonthsViewComponent.prototype, "dates", void 0);
__decorate([
HostBinding('attr.tabindex'),
__metadata("design:type", Object)
], IgxMonthsViewComponent.prototype, "tabindex", void 0);
__decorate([
HostListener('keydown.arrowup', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [KeyboardEvent]),
__metadata("design:returntype", void 0)
], IgxMonthsViewComponent.prototype, "onKeydownArrowUp", null);
__decorate([
HostListener('keydown.arrowdown', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [KeyboardEvent]),
__metadata("design:returntype", void 0)
], IgxMonthsViewComponent.prototype, "onKeydownArrowDown", null);
__decorate([
HostListener('keydown.arrowright', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [KeyboardEvent]),
__metadata("design:returntype", void 0)
], IgxMonthsViewComponent.prototype, "onKeydownArrowRight", null);
__decorate([
HostListener('keydown.arrowleft', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [KeyboardEvent]),
__metadata("design:returntype", void 0)
], IgxMonthsViewComponent.prototype, "onKeydownArrowLeft", null);
__decorate([
HostListener('keydown.home', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [KeyboardEvent]),
__metadata("design:returntype", void 0)
], IgxMonthsViewComponent.prototype, "onKeydownHome", null);
__decorate([
HostListener('keydown.end', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [KeyboardEvent]),
__metadata("design:returntype", void 0)
], IgxMonthsViewComponent.prototype, "onKeydownEnd", null);
__decorate([
HostListener('keydown.enter', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], IgxMonthsViewComponent.prototype, "onKeydownEnter", null);
IgxMonthsViewComponent = IgxMonthsViewComponent_1 = __decorate([
Component({
providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: IgxMonthsViewComponent_1, multi: true }],
selector: 'igx-months-view',
template: "<div class=\"igx-calendar__body\">\n <div class=\"igx-calendar__body-row--wrap\">\n <div [igxCalendarMonth]=\"month\" [date]=\"date\" (onMonthSelection)=\"selectMonth($event)\" [index]=\"i\" *ngFor=\"let month of months; index as i; trackBy: monthTracker\">\n {{ formattedMonth(month) | titlecase }}\n </div>\n </div>\n</div>\n\n"
}),
__metadata("design:paramtypes", [ElementRef])
], IgxMonthsViewComponent);
return IgxMonthsViewComponent;
}());
export { IgxMonthsViewComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9udGhzLXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9jYWxlbmRhci9tb250aHMtdmlldy9tb250aHMtdmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsTUFBTSxFQUNOLFlBQVksRUFDWixLQUFLLEVBQ0wsV0FBVyxFQUNYLFlBQVksRUFDWixZQUFZLEVBQ1osU0FBUyxFQUNULFVBQVUsRUFDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZDLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVuRSxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFPaEI7SUEyS0ksZ0NBQW1CLEVBQWM7UUFBZCxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBektqQzs7Ozs7Ozs7OztXQVVHO1FBR0ksT0FBRSxHQUFHLHFCQUFtQixPQUFPLEVBQUksQ0FBQztRQUUzQzs7Ozs7Ozs7OztXQVVHO1FBRUksU0FBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFvRHpCOzs7V0FHRztRQUVJLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFFekI7Ozs7Ozs7V0FPRztRQUVJLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUU5Qzs7OztXQUlHO1FBRUksZUFBVSxHQUFHLElBQUksQ0FBQztRQVN6Qjs7OztXQUlHO1FBRUksYUFBUSxHQUFHLENBQUMsQ0FBQztRQTJCcEI7O1dBRUc7UUFDSyxZQUFPLEdBQUcsSUFBSSxDQUFDO1FBRXZCOztXQUVHO1FBQ0ssaUJBQVksR0FBRyxPQUFPLENBQUM7UUFPL0I7O1dBRUc7UUFDSyx1QkFBa0IsR0FBZSxjQUFRLENBQUMsQ0FBQztRQUNuRDs7V0FFRztRQUNLLHNCQUFpQixHQUFzQixjQUFRLENBQUMsQ0FBQztRQUdyRCxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7SUFDekMsQ0FBQzsrQkE5S1Esc0JBQXNCO0lBc0MvQixzQkFBVywrQ0FBVztRQVB0Qjs7Ozs7V0FLRzthQUVIO1lBQ0ksT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzdCLENBQUM7UUFFRDs7Ozs7O1dBTUc7YUFDSCxVQUF1QixLQUFhO1lBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQzFCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzlCLENBQUM7OztPQVpBO0lBdUJELHNCQUFXLDBDQUFNO1FBVGpCOzs7Ozs7O1dBT0c7YUFFSDtZQUNJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUN4QixDQUFDO1FBRUQ7Ozs7Ozs7O1dBUUc7YUFDSCxVQUFrQixLQUFhO1lBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzlCLENBQUM7OztPQWRBO0lBaUVELHNCQUFJLDBDQUFNO1FBUlY7Ozs7Ozs7V0FPRzthQUNIO1lBQ0ksSUFBSSxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDcEQsSUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO1lBRWxCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ25CLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQzVEO1lBRUQsT0FBTyxNQUFNLENBQUM7UUFDbEIsQ0FBQzs7O09BQUE7SUFvQ0Q7Ozs7T0FJRztJQUNJLCtDQUFjLEdBQXJCLFVBQXNCLEtBQVc7UUFDN0IsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDN0M7UUFDRCxPQUFPLEtBQUcsS0FBSyxDQUFDLFFBQVEsRUFBSSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNJLDRDQUFXLEdBQWxCLFVBQW1CLEtBQUs7UUFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFN0IsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7UUFDbEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxpREFBZ0IsR0FBdkIsVUFBd0IsRUFBcUI7UUFDekMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxrREFBaUIsR0FBeEIsVUFBeUIsRUFBYztRQUNuQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7T0FFRztJQUNJLDJDQUFVLEdBQWpCLFVBQWtCLEtBQVc7UUFDekIsSUFBSSxLQUFLLEVBQUU7WUFDUCxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztTQUNyQjtJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLDZDQUFZLEdBQW5CLFVBQW9CLEtBQUssRUFBRSxJQUFJO1FBQzNCLE9BQVUsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFHLENBQUM7SUFDakMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssbURBQWtCLEdBQTFCO1FBQ0ksSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQ7O09BRUc7SUFFSSxpREFBZ0IsR0FBdkIsVUFBd0IsS0FBb0I7UUFDeEMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV4QixJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFDLElBQUksSUFBSyxPQUFBLElBQUksQ0FBQyxhQUFhLEtBQUssS0FBSyxDQUFDLE1BQU0sRUFBbkMsQ0FBbUMsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDUCxPQUFPO1NBQ1Y7UUFFRCxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BDLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUU1RCxLQUFLLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDNUQsSUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ3pFLElBQU0sU0FBUyxHQUFHLENBQUMsQ0FBQztZQUNwQixJQUFJLFFBQVEsQ0FBQyxHQUFHLEtBQUssWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLFNBQVMsRUFBRTtnQkFDdEYsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDcEMsTUFBTTthQUNUO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFFSSxtREFBa0IsR0FBekIsVUFBMEIsS0FBb0I7UUFDMUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV4QixJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFDLElBQUksSUFBSyxPQUFBLElBQUksQ0FBQyxhQUFhLEtBQUssS0FBSyxDQUFDLE1BQU0sRUFBbkMsQ0FBbUMsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDUCxPQUFPO1NBQ1Y7UUFFRCxJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BDLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUU1RCxLQUFLLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3ZFLElBQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUN6RSxJQUFNLFNBQVMsR0FBRyxDQUFDLENBQUM7WUFDcEIsSUFBSSxZQUFZLENBQUMsR0FBRyxLQUFLLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLEVBQUc7Z0JBQ3ZGLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU07YUFDVDtTQUNKO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBRUksb0RBQW1CLEdBQTFCLFVBQTJCLEtBQW9CO1FBQzNDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFeEIsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQyxJQUFJLElBQUssT0FBQSxJQUFJLENBQUMsYUFBYSxLQUFLLEtBQUssQ0FBQyxNQUFNLEVBQW5DLENBQW1DLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQUUsT0FBTztTQUFFO1FBRXRCLElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQzFDLElBQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBRS9DLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDL0I7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFFSSxtREFBa0IsR0FBekIsVUFBMEIsS0FBb0I7UUFDMUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV4QixJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFDLElBQUksSUFBSyxPQUFBLElBQUksQ0FBQyxhQUFhLEtBQUssS0FBSyxDQUFDLE1BQU0sRUFBbkMsQ0FBbUMsQ0FBQyxDQUFDO1FBQzVFLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFBRSxPQUFPO1NBQUU7UUFFdEIsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMvQixJQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUUvQyxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQy9CO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBRUksOENBQWEsR0FBcEIsVUFBcUIsS0FBb0I7UUFDckMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV4QixJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXRDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVEOztPQUVHO0lBRUksNkNBQVksR0FBbkIsVUFBb0IsS0FBb0I7UUFDcEMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV4QixJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3BDLElBQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXhDLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVEOztPQUVHO0lBRUksK0NBQWMsR0FBckIsVUFBc0IsS0FBSztRQUN2QixJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFDLElBQUksSUFBSyxPQUFBLElBQUksQ0FBQyxhQUFhLEtBQUssS0FBSyxDQUFDLE1BQU0sRUFBbkMsQ0FBbUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNuRixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBRWpGLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7OztnQkEvTHNCLFVBQVU7O0lBNUpqQztRQUZDLFdBQVcsQ0FBQyxTQUFTLENBQUM7UUFDdEIsS0FBSyxFQUFFOztzREFDbUM7SUFjM0M7UUFEQyxLQUFLLEVBQUU7O3dEQUNpQjtJQVN6QjtRQURDLEtBQUssRUFBRTs7OzZEQUdQO0lBdUJEO1FBREMsS0FBSyxFQUFFOzs7d0RBR1A7SUFxQkQ7UUFEQyxLQUFLLEVBQUU7OzhEQUNpQjtJQVd6QjtRQURDLE1BQU0sRUFBRTs7K0RBQ3FDO0lBUTlDO1FBREMsV0FBVyxDQUFDLG9CQUFvQixDQUFDOzs4REFDVDtJQU16QjtRQURDLFlBQVksQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLElBQUksRUFBRSx5QkFBeUIsRUFBRSxDQUFDO2tDQUMvRCxTQUFTO3lEQUE0QjtJQVNuRDtRQURDLFdBQVcsQ0FBQyxlQUFlLENBQUM7OzREQUNUO0lBdUhwQjtRQURDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzt5Q0FDYixhQUFhOztrRUFvQjNDO0lBTUQ7UUFEQyxZQUFZLENBQUMsbUJBQW1CLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7eUNBQ2IsYUFBYTs7b0VBb0I3QztJQU1EO1FBREMsWUFBWSxDQUFDLG9CQUFvQixFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7O3lDQUNiLGFBQWE7O3FFQWE5QztJQU1EO1FBREMsWUFBWSxDQUFDLG1CQUFtQixFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7O3lDQUNiLGFBQWE7O29FQWE3QztJQU1EO1FBREMsWUFBWSxDQUFDLGNBQWMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDOzt5Q0FDYixhQUFhOzsrREFPeEM7SUFNRDtRQURDLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7eUNBQ2IsYUFBYTs7OERBUXZDO0lBTUQ7UUFEQyxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUM7Ozs7Z0VBT3pDO0lBMVdRLHNCQUFzQjtRQUxsQyxTQUFTLENBQUM7WUFDUCxTQUFTLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsd0JBQXNCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQzdGLFFBQVEsRUFBRSxpQkFBaUI7WUFDM0Isb1hBQXlDO1NBQzVDLENBQUM7eUNBNEt5QixVQUFVO09BM0t4QixzQkFBc0IsQ0EyV2xDO0lBQUQsNkJBQUM7Q0FBQSxBQTNXRCxJQTJXQztTQTNXWSxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBPdXRwdXQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBWaWV3Q2hpbGRyZW4sXG4gICAgUXVlcnlMaXN0LFxuICAgIEVsZW1lbnRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDYWxlbmRhciB9IGZyb20gJy4uL2NhbGVuZGFyJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IElneENhbGVuZGFyTW9udGhEaXJlY3RpdmUgfSBmcm9tICcuLi9jYWxlbmRhci5kaXJlY3RpdmVzJztcblxubGV0IE5FWFRfSUQgPSAwO1xuXG5AQ29tcG9uZW50KHtcbiAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLCB1c2VFeGlzdGluZzogSWd4TW9udGhzVmlld0NvbXBvbmVudCwgbXVsdGk6IHRydWUgfV0sXG4gICAgc2VsZWN0b3I6ICdpZ3gtbW9udGhzLXZpZXcnLFxuICAgIHRlbXBsYXRlVXJsOiAnbW9udGhzLXZpZXcuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIElneE1vbnRoc1ZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIGBpZGAgb2YgdGhlIG1vbnRocyB2aWV3LlxuICAgICAqIElmIG5vdCBzZXQsIHRoZSBgaWRgIHdpbGwgaGF2ZSB2YWx1ZSBgXCJpZ3gtbW9udGhzLXZpZXctMFwiYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1tb250aHMtdmlldyBpZD1cIm15LW1vbnRocy12aWV3XCI+PC9pZ3gtbW9udGhzLXZpZXc+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBtb250aHNWaWV3SWQgPSAgdGhpcy5tb250aHNWaWV3LmlkO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hNb250aHNWaWV3Q29tcG9uZW50XG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJylcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpZCA9IGBpZ3gtbW9udGhzLXZpZXctJHtORVhUX0lEKyt9YDtcblxuICAgIC8qKlxuICAgICAqIEdldHMvc2V0cyB0aGUgc2VsZWN0ZWQgZGF0ZSBvZiB0aGUgbW9udGhzIHZpZXcuXG4gICAgICogQnkgZGVmYXVsdCBpdCBpcyB0aGUgY3VycmVudCBkYXRlLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LW1vbnRocy12aWV3IFtkYXRlXT1cIm15RGF0ZVwiPjwvaWd4LW1vbnRocy12aWV3PlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgZGF0ZSA9ICB0aGlzLm1vbnRoc1ZpZXcuZGF0ZTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4TW9udGhzVmlld0NvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRhdGUgPSBuZXcgRGF0ZSgpO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgbW9udGggZm9ybWF0IG9wdGlvbiBvZiB0aGUgbW9udGhzIHZpZXcuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBtb250aEZvcm1hdCA9IHRoaXMubW9udGhzVmlldy5tb250aEZvcm1hdC5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgbW9udGhGb3JtYXQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoRm9ybWF0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIG1vbnRoIGZvcm1hdCBvcHRpb24gb2YgdGhlIG1vbnRocyB2aWV3LlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LW1vbnRocy12aWV3PiBbbW9udGhGb3JtYXRdID0gXCJzaG9ydCdcIjwvaWd4LW1vbnRocy12aWV3PlxuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hNb250aHNWaWV3Q29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHNldCBtb250aEZvcm1hdCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX21vbnRoRm9ybWF0ID0gdmFsdWU7XG4gICAgICAgIHRoaXMuaW5pdE1vbnRoRm9ybWF0dGVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYGxvY2FsZWAgb2YgdGhlIG1vbnRocyB2aWV3LlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgYFwiZW5cImAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBsb2NhbGUgPSAgdGhpcy5tb250aHNWaWV3LmxvY2FsZTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4TW9udGhzVmlld0NvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBsb2NhbGUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBgbG9jYWxlYCBvZiB0aGUgbW9udGhzIHZpZXcuXG4gICAgICogRXhwZWN0cyBhIHZhbGlkIEJDUCA0NyBsYW5ndWFnZSB0YWcuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgXCJlblwiYC5cbiAgICAgKiBgYGBodG1sXG4gICAgICogPGlneC1tb250aHMtdmlldyBbbG9jYWxlXT1cImRlXCI+PC9pZ3gtbW9udGhzLXZpZXc+XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneE1vbnRoc1ZpZXdDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0IGxvY2FsZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2xvY2FsZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLmluaXRNb250aEZvcm1hdHRlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMvc2V0cyB3aGV0aGVyIHRoZSB2aWV3IHNob3VsZCBiZSByZW5kZXJlZFxuICAgICAqIGFjY29yZGluZyB0byB0aGUgbG9jYWxlIGFuZCBtb250aEZvcm1hdCwgaWYgYW55LlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGZvcm1hdFZpZXcgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogRW1pdHMgYW4gZXZlbnQgd2hlbiBhIHNlbGVjdGlvbiBpcyBtYWRlIGluIHRoZSBtb250aHMgdmlldy5cbiAgICAgKiBQcm92aWRlcyByZWZlcmVuY2UgdGhlIGBkYXRlYCBwcm9wZXJ0eSBpbiB0aGUgYElneE1vbnRoc1ZpZXdDb21wb25lbnRgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LW1vbnRocy12aWV3IChvblNlbGVjdGlvbik9XCJvblNlbGVjdGlvbigkZXZlbnQpXCI+PC9pZ3gtbW9udGhzLXZpZXc+XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneE1vbnRoc1ZpZXdDb21wb25lbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25TZWxlY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPERhdGU+KCk7XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVmYXVsdCBjc3MgY2xhc3MgYXBwbGllZCB0byB0aGUgY29tcG9uZW50LlxuICAgICAqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWNhbGVuZGFyJylcbiAgICBwdWJsaWMgc3R5bGVDbGFzcyA9IHRydWU7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQFZpZXdDaGlsZHJlbihJZ3hDYWxlbmRhck1vbnRoRGlyZWN0aXZlLCB7IHJlYWQ6IElneENhbGVuZGFyTW9udGhEaXJlY3RpdmUgfSlcbiAgICBwdWJsaWMgZGF0ZXM6IFF1ZXJ5TGlzdDxJZ3hDYWxlbmRhck1vbnRoRGlyZWN0aXZlPjtcblxuXG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgYHRhYmluZGV4YCBhdHRyaWJ1dGUgZm9yIHRoZSBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnRhYmluZGV4JylcbiAgICBwdWJsaWMgdGFiaW5kZXggPSAwO1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBkYXRlIG9iamVjdHMgd2hpY2ggYXJlIHRoZW4gdXNlZCB0b1xuICAgICAqIHByb3Blcmx5IHJlbmRlciB0aGUgbW9udGggbmFtZXMuXG4gICAgICpcbiAgICAgKiBVc2VkIGluIHRoZSB0ZW1wbGF0ZSBvZiB0aGUgY29tcG9uZW50XG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IG1vbnRocygpOiBEYXRlW10ge1xuICAgICAgICBsZXQgc3RhcnQgPSBuZXcgRGF0ZSh0aGlzLmRhdGUuZ2V0RnVsbFllYXIoKSwgMCwgMSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goc3RhcnQpO1xuICAgICAgICAgICAgc3RhcnQgPSB0aGlzLl9jYWxlbmRhck1vZGVsLnRpbWVkZWx0YShzdGFydCwgJ21vbnRoJywgMSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgX2Zvcm1hdHRlck1vbnRoOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9sb2NhbGUgPSAnZW4nO1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfbW9udGhGb3JtYXQgPSAnc2hvcnQnO1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY2FsZW5kYXJNb2RlbDogQ2FsZW5kYXI7XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9vblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9ICgpID0+IHsgfTtcbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9vbkNoYW5nZUNhbGxiYWNrOiAoXzogRGF0ZSkgPT4gdm9pZCA9ICgpID0+IHsgfTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBlbDogRWxlbWVudFJlZikge1xuICAgICAgICB0aGlzLmluaXRNb250aEZvcm1hdHRlcigpO1xuICAgICAgICB0aGlzLl9jYWxlbmRhck1vZGVsID0gbmV3IENhbGVuZGFyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbG9jYWxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb250aCBpbiB0aGUgbW9udGhzIHZpZXcuXG4gICAgICpcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGZvcm1hdHRlZE1vbnRoKHZhbHVlOiBEYXRlKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuZm9ybWF0Vmlldykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdHRlck1vbnRoLmZvcm1hdCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke3ZhbHVlLmdldE1vbnRoKCl9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0TW9udGgoZXZlbnQpIHtcbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbi5lbWl0KGV2ZW50KTtcblxuICAgICAgICB0aGlzLmRhdGUgPSBldmVudDtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayh0aGlzLmRhdGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHY6IERhdGUpID0+IHZvaWQpIHtcbiAgICAgICAgdGhpcy5fb25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IERhdGUpIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGUgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgbW9udGhUcmFja2VyKGluZGV4LCBpdGVtKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAke2l0ZW0uZ2V0TW9udGgoKX19YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIGluaXRNb250aEZvcm1hdHRlcigpIHtcbiAgICAgICAgdGhpcy5fZm9ybWF0dGVyTW9udGggPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0aGlzLl9sb2NhbGUsIHsgbW9udGg6IHRoaXMubW9udGhGb3JtYXQgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uYXJyb3d1cCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkFycm93VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZGF0ZXMuZmluZCgoZGF0ZSkgPT4gZGF0ZS5uYXRpdmVFbGVtZW50ID09PSBldmVudC50YXJnZXQpO1xuICAgICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1vbnRocyA9IHRoaXMuZGF0ZXMudG9BcnJheSgpO1xuICAgICAgICBjb25zdCBub2RlUmVjdCA9IG5vZGUubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IG1vbnRocy5pbmRleE9mKG5vZGUpIC0gMTsgaW5kZXggPj0gMDsgaW5kZXgtLSkge1xuICAgICAgICAgICAgY29uc3QgbmV4dE5vZGVSZWN0ID0gbW9udGhzW2luZGV4XS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgY29uc3QgdG9sZXJhbmNlID0gNjtcbiAgICAgICAgICAgIGlmIChub2RlUmVjdC50b3AgIT09IG5leHROb2RlUmVjdC50b3AgJiYgKG5leHROb2RlUmVjdC5sZWZ0IC0gbm9kZVJlY3QubGVmdCkgPCB0b2xlcmFuY2UpIHtcbiAgICAgICAgICAgICAgICBtb250aHNbaW5kZXhdLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmFycm93ZG93bicsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkFycm93RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5kYXRlcy5maW5kKChkYXRlKSA9PiBkYXRlLm5hdGl2ZUVsZW1lbnQgPT09IGV2ZW50LnRhcmdldCk7XG4gICAgICAgIGlmICghbm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbW9udGhzID0gdGhpcy5kYXRlcy50b0FycmF5KCk7XG4gICAgICAgIGNvbnN0IG5vZGVSZWN0ID0gbm9kZS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gbW9udGhzLmluZGV4T2Yobm9kZSkgKyAxOyBpbmRleCA8IG1vbnRocy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHROb2RlUmVjdCA9IG1vbnRoc1tpbmRleF0ubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IHRvbGVyYW5jZSA9IDY7XG4gICAgICAgICAgICBpZiAobmV4dE5vZGVSZWN0LnRvcCAhPT0gbm9kZVJlY3QudG9wICYmIChub2RlUmVjdC5sZWZ0IC0gbmV4dE5vZGVSZWN0LmxlZnQpIDwgdG9sZXJhbmNlICkge1xuICAgICAgICAgICAgICAgIG1vbnRoc1tpbmRleF0ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uYXJyb3dyaWdodCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkFycm93UmlnaHQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZGF0ZXMuZmluZCgoZGF0ZSkgPT4gZGF0ZS5uYXRpdmVFbGVtZW50ID09PSBldmVudC50YXJnZXQpO1xuICAgICAgICBpZiAoIW5vZGUpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgY29uc3QgbW9udGhzID0gdGhpcy5kYXRlcy50b0FycmF5KCk7XG4gICAgICAgIGlmIChtb250aHMuaW5kZXhPZihub2RlKSArIDEgPCBtb250aHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBtb250aCA9IG1vbnRoc1ttb250aHMuaW5kZXhPZihub2RlKSArIDFdO1xuXG4gICAgICAgICAgICBtb250aC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5hcnJvd2xlZnQnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbktleWRvd25BcnJvd0xlZnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuZGF0ZXMuZmluZCgoZGF0ZSkgPT4gZGF0ZS5uYXRpdmVFbGVtZW50ID09PSBldmVudC50YXJnZXQpO1xuICAgICAgICBpZiAoIW5vZGUpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgY29uc3QgbW9udGhzID0gdGhpcy5kYXRlcy50b0FycmF5KCk7XG4gICAgICAgIGlmIChtb250aHMuaW5kZXhPZihub2RlKSAtIDEgPj0gMCkge1xuICAgICAgICAgICAgY29uc3QgbW9udGggPSBtb250aHNbbW9udGhzLmluZGV4T2Yobm9kZSkgLSAxXTtcblxuICAgICAgICAgICAgbW9udGgubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uaG9tZScsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkhvbWUoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgY29uc3QgbW9udGggPSB0aGlzLmRhdGVzLnRvQXJyYXkoKVswXTtcblxuICAgICAgICBtb250aC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uZW5kJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25LZXlkb3duRW5kKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIGNvbnN0IG1vbnRocyA9IHRoaXMuZGF0ZXMudG9BcnJheSgpO1xuICAgICAgICBjb25zdCBtb250aCA9IG1vbnRoc1ttb250aHMubGVuZ3RoIC0gMV07XG5cbiAgICAgICAgbW9udGgubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmVudGVyJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25LZXlkb3duRW50ZXIoZXZlbnQpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRhdGVzLmZpbmQoKGRhdGUpID0+IGRhdGUubmF0aXZlRWxlbWVudCA9PT0gZXZlbnQudGFyZ2V0KS52YWx1ZTtcbiAgICAgICAgdGhpcy5kYXRlID0gbmV3IERhdGUodmFsdWUuZ2V0RnVsbFllYXIoKSwgdmFsdWUuZ2V0TW9udGgoKSwgdGhpcy5kYXRlLmdldERhdGUoKSk7XG5cbiAgICAgICAgdGhpcy5vblNlbGVjdGlvbi5lbWl0KHRoaXMuZGF0ZSk7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sodGhpcy5kYXRlKTtcbiAgICB9XG59XG4iXX0=