@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
577 lines • 49.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: two-datepicker/two-datepicker.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ElementRef, ViewChild, Input, HostListener, Output, EventEmitter } from '@angular/core';
import { CdkOverlayOrigin } from '@angular/cdk/overlay';
import { cornerFadeInOut } from '@duoduo-oba/ng-devui/utils';
import { Subject } from 'rxjs';
import { distinctUntilChanged } from 'rxjs/operators';
import { DatePickerConfigService as DatePickerConfig } from '../date-picker.config.service';
import { I18nService } from '@duoduo-oba/ng-devui/i18n';
import { DefaultDateConverter } from '@duoduo-oba/ng-devui/utils';
export class TwoDatePickerComponent {
/**
* @param {?} el
* @param {?} datePickerConfig
* @param {?} i18n
*/
constructor(el, datePickerConfig, i18n) {
this.el = el;
this.datePickerConfig = datePickerConfig;
this.i18n = i18n;
this.showTime = false;
this.selectedRange = [null, null];
this.hideOnRangeSelected = true;
this.selectRange = new EventEmitter();
this.datePosition = 'bottom';
this.selectDateSubject = new Subject();
this.hoverOnDate = new Subject();
this.switchOpenSub = new Subject();
this.today = new Date();
this.datepickerPosition = 'bottom';
this.currentCalendars = [null, null];
this.isOpen = false;
this.startOpen = false;
this.endOpen = false;
this.onChange = (/**
* @param {?} _
* @return {?}
*/
(_) => null);
this.chooseDate = (/**
* @param {?} range
* @return {?}
*/
(range) => {
if (range) {
this.selectedRange = range;
if (Array.isArray(this.selectedRange)) {
[this.rangeStart, this.rangeEnd] = this.selectedRange;
}
}
this.notifyValueChange(range);
});
this.clear = (/**
* @param {?} side
* @return {?}
*/
(side) => {
if (side === 'start') {
this.selectStart(null);
}
else if (side === 'end') {
this.selectEnd(null);
}
[this.rangeStart, this.rangeEnd] = this.selectedRange;
});
this._dateConfig = datePickerConfig['dateConfig'];
this.dateConverter = datePickerConfig['dateConfig'].dateConverter || new DefaultDateConverter();
}
/**
* @param {?} dateConfig
* @return {?}
*/
set dateConfig(dateConfig) {
if (dateConfig) {
this._dateConfig = dateConfig;
this._dateFormat = this.showTime ? dateConfig.format.time : dateConfig.format.date;
}
else {
this._dateConfig = this.datePickerConfig.dateConfig;
}
}
/**
* @param {?} dateFormat
* @return {?}
*/
set dateFormat(dateFormat) {
if (this._dateFormat !== dateFormat) {
this._dateFormat = dateFormat;
}
}
/**
* @param {?} date
* @return {?}
*/
set maxDate(date) {
/** @type {?} */
const parseDate = this.convertDate(date);
if (parseDate) {
this._maxDate = parseDate;
}
}
/**
* @param {?} date
* @return {?}
*/
set minDate(date) {
/** @type {?} */
const parseDate = this.convertDate(date);
if (parseDate) {
this._minDate = parseDate;
}
}
/**
* @param {?} side
* @return {?}
*/
set whichOpen(side) {
this._whichOpen = side;
this.switchOpenSub.next(side);
}
/**
* @return {?}
*/
get dateConfig() {
return this._dateConfig;
}
/**
* @return {?}
*/
get dateFormat() {
return this._dateFormat;
}
/**
* @return {?}
*/
get maxDate() {
return this._maxDate;
}
/**
* @return {?}
*/
get minDate() {
return this._minDate;
}
/**
* @return {?}
*/
get whichOpen() {
return this._whichOpen;
}
/**
* @param {?} $event
* @return {?}
*/
onDocumentClick($event) {
if (this.el.nativeElement !== $event.target) {
this.isOpen = false;
this.startOpen = false;
this.endOpen = false;
this.whichOpen = false;
}
}
/**
* @return {?}
*/
ngOnInit() {
this._minDate = this.minDate ? new Date(this.minDate) : new Date(this.dateConfig.min, 0, 1, 0, 0, 0);
this._maxDate = this.maxDate ? new Date(this.maxDate) : new Date(this.dateConfig.max, 11, 31, 23, 59, 59);
this.setI18nText();
this.updateCdkConnectedOverlayOrigin(this.el.nativeElement);
this.subscribeHoverActions();
}
/**
* @return {?}
*/
isDisableToday() {
if ((this.minDate.getTime() >= (this.today).getTime()) || (this.maxDate.getTime() <= (this.today).getTime())) {
this.disableToday = true;
}
else {
this.disableToday = false;
}
}
/**
* @param {?} event
* @param {?} side
* @return {?}
*/
toggle(event, side) {
event.stopPropagation();
if (this.isOpen) {
if (side === 'start') {
if (this.startOpen) {
this.startOpen = false;
this.isOpen = false;
this.whichOpen = false;
}
else if (this.endOpen) {
this.startOpen = true;
this.whichOpen = 'start';
}
this.endOpen = false;
}
else if (side === 'end') {
if (this.startOpen) {
this.endOpen = true;
this.whichOpen = 'end';
}
else if (this.endOpen) {
this.endOpen = false;
this.isOpen = false;
this.whichOpen = false;
}
this.startOpen = false;
}
}
else {
this.startOpen = side === 'start' ? true : false;
this.endOpen = side === 'end' ? true : false;
this.isOpen = true;
this.whichOpen = side;
}
}
/**
* @param {?} position
* @return {?}
*/
onPositionChange(position) {
switch (position.connectionPair.overlayY) {
case 'top':
case 'center':
this.datePosition = 'bottom';
break;
case 'bottom':
this.datePosition = 'top';
}
}
/**
* @param {?} date
* @return {?}
*/
convertDate(date) {
return date ?
this.dateConverter.parse(date, this.dateFormat, this.locale || this.i18nLocale) : null;
}
/**
* @param {?} date
* @return {?}
*/
formatDate(date) {
return date ?
this.dateConverter.format(date, this.dateFormat, this.locale || this.i18nLocale) : null;
}
/**
* @param {?} el
* @return {?}
*/
updateCdkConnectedOverlayOrigin(el) {
if (el) {
this.cdkConnectedOverlayOrigin = new CdkOverlayOrigin(el);
}
else {
this.cdkConnectedOverlayOrigin = undefined;
}
}
/**
* @param {?} currentCalender
* @param {?} orientation
* @return {?}
*/
syncPickerPair(currentCalender, orientation) {
switch (orientation) {
case 'left':
this.currentCalendars[0] = currentCalender;
break;
case 'right':
this.currentCalendars[1] = currentCalender;
break;
}
}
/**
* @param {?} data
* @return {?}
*/
rangeChange(data) {
this.chooseDate(data.selectedRange);
this.selectDateSubject.next({ side: 'start', date: this.rangeStart, onlyWrite: true });
this.selectDateSubject.next({ side: 'end', date: this.rangeEnd, onlyWrite: true });
}
/**
* @param {?} range
* @return {?}
*/
notifyValueChange(range) {
this.onChange(range);
this.selectRange.emit(this.selectedRange);
}
/**
* @param {?} event
* @return {?}
*/
selectingDate(event) {
this.hoverOnDate.next(event);
}
/**
* @return {?}
*/
subscribeHoverActions() {
this.hoverOnDate.pipe(distinctUntilChanged()).subscribe((/**
* @param {?} date
* @return {?}
*/
(date) => {
this.previewRangeEnd(date);
}));
}
/**
* @param {?} date
* @return {?}
*/
previewRangeEnd(date) {
if (date) {
this.leftPicker['previewEnd'] = date;
this.rightPicker['previewEnd'] = date;
}
}
/**
* @param {?} rangeStart
* @param {?} picker
* @return {?}
*/
syncRangeStart(rangeStart, picker) {
if (this.whichOpen === 'end') {
this.selectEnd(rangeStart);
}
else if (this.whichOpen === 'start') {
this.selectStart(rangeStart);
}
picker.selectRange(rangeStart, true);
}
/**
* @param {?} date
* @return {?}
*/
selectStart(date) {
this.selectDateSubject.next({ side: 'start', date: date });
this.whichOpen = 'end';
this.startOpen = false;
this.endOpen = true;
this.selectedRange[0] = date;
this.rangeStart = date;
this.isDisableToday();
}
/**
* @param {?} date
* @return {?}
*/
selectEnd(date) {
this.selectDateSubject.next({ side: 'end', date: date });
this.selectedRange[1] = date;
this.rangeEnd = date;
if (!this.showTime && this.hideOnRangeSelected) {
this.isOpen = false;
this.startOpen = false;
this.endOpen = false;
this.whichOpen = false;
}
this.isDisableToday();
}
/**
* @return {?}
*/
consolidateTime() {
}
/**
* @param {?} event
* @return {?}
*/
chooseToday(event) {
event.preventDefault();
event.stopPropagation();
if ((this.minDate.getTime() <= (this.today).getTime()) && (this.maxDate.getTime() >= (this.today).getTime())) {
if (this.whichOpen === 'start') {
this.selectStart(this.today);
}
else if (this.whichOpen === 'end') {
this.selectEnd(this.today);
}
[this.rangeStart, this.rangeEnd] = this.selectedRange;
}
}
/**
* @param {?} event
* @return {?}
*/
clearBtn(event) {
event.preventDefault();
event.stopPropagation();
if (this.whichOpen) {
this.clear(this.whichOpen);
}
}
/**
* @return {?}
*/
setI18nText() {
this.i18nText = this.i18n.getI18nText().datePicker;
this.i18nLocale = this.i18n.getI18nText().locale;
this.i18nSubscription = this.i18n.langChange().subscribe((/**
* @param {?} data
* @return {?}
*/
(data) => {
this.i18nText = data.datePicker;
this.i18nLocale = data.locale;
}));
}
/**
* @return {?}
*/
ngOnDestroy() {
this.isOpen = false;
this.startOpen = false;
this.endOpen = false;
if (this.i18nSubscription) {
this.i18nSubscription.unsubscribe();
}
}
}
TwoDatePickerComponent.decorators = [
{ type: Component, args: [{
selector: '[dTwoDatePicker]',
exportAs: 'twoDatePicker',
template: "<ng-content></ng-content>\r\n<ng-template\r\n cdk-connected-overlay\r\n [cdkConnectedOverlayOrigin]=\"cdkConnectedOverlayOrigin\"\r\n [cdkConnectedOverlayOpen]=\"isOpen\"\r\n (backdropClick)=\"isOpen = false\"\r\n (positionChange)=\"onPositionChange($event)\"\r\n>\r\n <div [@cornerFadeInOut]=\"isOpen ? datepickerPosition : 'void'\" class=\"devui-two-date-wrapper\">\r\n <div class=\"devui-two-date-picker\">\r\n <d-two-datepicker-single\r\n class=\"devui-date-picker\"\r\n [locale]=\"locale\"\r\n [cssClass]=\"cssClass\"\r\n [disabled]=\"disabled\"\r\n [dateConverter]=\"dateConverter\"\r\n [dateFormat]=\"dateFormat\"\r\n [dateConfig]=\"dateConfig\"\r\n [maxDate]=\"maxDate\"\r\n [minDate]=\"minDate\"\r\n [rangePicker]=\"true\"\r\n [selectedRange]=\"[rangeStart, rangeEnd]\"\r\n [currentCalendars]=\"currentCalendars\"\r\n [showTime]=\"showTime\"\r\n (rangeSelected)=\"rangeChange($event)\"\r\n (hoverOnDate)=\"selectingDate($event)\"\r\n (rangeSelecting)=\"syncRangeStart($event, rightPicker)\"\r\n (syncPickerPair)=\"syncPickerPair($event, 'left')\"\r\n [whichOpen]=\"whichOpen\"\r\n #leftPicker\r\n >\r\n </d-two-datepicker-single>\r\n <d-two-datepicker-single\r\n class=\"devui-date-picker\"\r\n [locale]=\"locale\"\r\n [cssClass]=\"cssClass\"\r\n [disabled]=\"disabled\"\r\n [dateConverter]=\"dateConverter\"\r\n [dateFormat]=\"dateFormat\"\r\n [dateConfig]=\"dateConfig\"\r\n [maxDate]=\"maxDate\"\r\n [minDate]=\"minDate\"\r\n [rangePicker]=\"true\"\r\n [selectedRange]=\"[rangeStart, rangeEnd]\"\r\n [currentCalendars]=\"currentCalendars\"\r\n [showTime]=\"showTime\"\r\n (rangeSelected)=\"rangeChange($event)\"\r\n (hoverOnDate)=\"selectingDate($event)\"\r\n (rangeSelecting)=\"syncRangeStart($event, leftPicker)\"\r\n (syncPickerPair)=\"syncPickerPair($event, 'right')\"\r\n [isAuxiliary]=\"true\"\r\n (consolidateTime)=\"consolidateTime()\"\r\n [whichOpen]=\"whichOpen\"\r\n #rightPicker\r\n >\r\n </d-two-datepicker-single>\r\n </div>\r\n <div *ngIf=\"!customViewTemplate\" class=\"devui-two-date-footer devui-two-date-custom\">\r\n <a\r\n [ngClass]=\"{\r\n disabled: disableToday\r\n }\"\r\n (click)=\"chooseToday($event)\"\r\n >{{ i18nText.today }}</a\r\n >\r\n <d-button (btnClick)=\"clearBtn($event)\" bsSize=\"sm\">{{ i18nText.clear }}</d-button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n",
animations: [
cornerFadeInOut
],
styles: [".devui-two-date-wrapper{display:-webkit-inline-box!important;display:inline-flex!important;box-shadow:0 4px 8px 0 rgba(41,48,64,.2);background-color:#fff;-webkit-transform:perspective(1px) translate3d(0,0,0);transform:perspective(1px) translate3d(0,0,0);-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column}.devui-two-date-wrapper .devui-two-date-picker{display:-webkit-inline-box!important;display:inline-flex!important;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.devui-two-date-wrapper .devui-two-date-picker::after{content:'';position:absolute;top:29px;width:100%;height:1px;border-bottom:1px solid #adb0b8}.devui-two-date-wrapper .devui-two-date-custom{width:500px;border-top:1px solid #adb0b8}.devui-two-date-wrapper .devui-two-date-footer{padding:10px;display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between;-webkit-box-align:center;align-items:center}.devui-two-date-wrapper .devui-two-date-footer a{color:#5e7ce0;text-decoration:none;cursor:pointer}.devui-two-date-wrapper .devui-two-date-footer a.disabled{color:#adb0b8;cursor:not-allowed}.devui-date-picker:not(:last-child){margin-right:20px}.host-wrapper{color:red}:host ::ng-deep .devui-input-focus{border-color:#344899!important}"]
}] }
];
/** @nocollapse */
TwoDatePickerComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: DatePickerConfig },
{ type: I18nService }
];
TwoDatePickerComponent.propDecorators = {
locale: [{ type: Input }],
cssClass: [{ type: Input }],
disabled: [{ type: Input }],
dateConverter: [{ type: Input }],
selectedRange: [{ type: Input }],
hideOnRangeSelected: [{ type: Input }],
selectRange: [{ type: Output }],
leftPicker: [{ type: ViewChild, args: ['leftPicker', { static: false },] }],
rightPicker: [{ type: ViewChild, args: ['rightPicker', { static: false },] }],
templateWrap: [{ type: ViewChild, args: ['templateWrap', { static: false },] }],
dateConfig: [{ type: Input }],
dateFormat: [{ type: Input }],
onDocumentClick: [{ type: HostListener, args: ['document:click', ['$event'],] }]
};
if (false) {
/** @type {?} */
TwoDatePickerComponent.prototype.locale;
/** @type {?} */
TwoDatePickerComponent.prototype.cssClass;
/** @type {?} */
TwoDatePickerComponent.prototype.disabled;
/** @type {?} */
TwoDatePickerComponent.prototype.dateConverter;
/** @type {?} */
TwoDatePickerComponent.prototype.showTime;
/** @type {?} */
TwoDatePickerComponent.prototype.selectedRange;
/** @type {?} */
TwoDatePickerComponent.prototype.hideOnRangeSelected;
/** @type {?} */
TwoDatePickerComponent.prototype.customViewTemplate;
/** @type {?} */
TwoDatePickerComponent.prototype.selectRange;
/** @type {?} */
TwoDatePickerComponent.prototype.leftPicker;
/** @type {?} */
TwoDatePickerComponent.prototype.rightPicker;
/** @type {?} */
TwoDatePickerComponent.prototype.templateWrap;
/** @type {?} */
TwoDatePickerComponent.prototype.datePosition;
/** @type {?} */
TwoDatePickerComponent.prototype.selectDateSubject;
/** @type {?} */
TwoDatePickerComponent.prototype.hoverOnDate;
/** @type {?} */
TwoDatePickerComponent.prototype.switchOpenSub;
/** @type {?} */
TwoDatePickerComponent.prototype.today;
/** @type {?} */
TwoDatePickerComponent.prototype.rangeStart;
/** @type {?} */
TwoDatePickerComponent.prototype.rangeEnd;
/** @type {?} */
TwoDatePickerComponent.prototype.disableToday;
/** @type {?} */
TwoDatePickerComponent.prototype.i18nText;
/** @type {?} */
TwoDatePickerComponent.prototype.i18nLocale;
/** @type {?} */
TwoDatePickerComponent.prototype.i18nSubscription;
/** @type {?} */
TwoDatePickerComponent.prototype.datepickerPosition;
/** @type {?} */
TwoDatePickerComponent.prototype.currentCalendars;
/** @type {?} */
TwoDatePickerComponent.prototype.cdkConnectedOverlayOrigin;
/** @type {?} */
TwoDatePickerComponent.prototype.isOpen;
/**
* @type {?}
* @private
*/
TwoDatePickerComponent.prototype.startOpen;
/**
* @type {?}
* @private
*/
TwoDatePickerComponent.prototype.endOpen;
/**
* @type {?}
* @private
*/
TwoDatePickerComponent.prototype._whichOpen;
/**
* @type {?}
* @private
*/
TwoDatePickerComponent.prototype._dateConfig;
/**
* @type {?}
* @private
*/
TwoDatePickerComponent.prototype._dateFormat;
/**
* @type {?}
* @private
*/
TwoDatePickerComponent.prototype._maxDate;
/**
* @type {?}
* @private
*/
TwoDatePickerComponent.prototype._minDate;
/**
* @type {?}
* @private
*/
TwoDatePickerComponent.prototype.onChange;
/** @type {?} */
TwoDatePickerComponent.prototype.chooseDate;
/** @type {?} */
TwoDatePickerComponent.prototype.clear;
/** @type {?} */
TwoDatePickerComponent.prototype.el;
/**
* @type {?}
* @protected
*/
TwoDatePickerComponent.prototype.datePickerConfig;
/**
* @type {?}
* @private
*/
TwoDatePickerComponent.prototype.i18n;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHdvLWRhdGVwaWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZGV2dWkvZGF0ZXBpY2tlci8iLCJzb3VyY2VzIjpbInR3by1kYXRlcGlja2VyL3R3by1kYXRlcGlja2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBR1QsVUFBVSxFQUVWLFNBQVMsRUFDVCxLQUFLLEVBQ0wsWUFBWSxFQUNaLE1BQU0sRUFDTixZQUFZLEVBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGdCQUFnQixFQUF5RCxNQUFNLHNCQUFzQixDQUFDO0FBQy9HLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsdUJBQXVCLElBQUksZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM1RixPQUFPLEVBQUUsV0FBVyxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUUzRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVd0RCxNQUFNLE9BQU8sc0JBQXNCOzs7Ozs7SUF1Q2pDLFlBQW1CLEVBQWMsRUFBWSxnQkFBa0MsRUFBVSxJQUFpQjtRQUF2RixPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQVkscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUFVLFNBQUksR0FBSixJQUFJLENBQWE7UUFsQzFHLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDUixrQkFBYSxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdCLHdCQUFtQixHQUFHLElBQUksQ0FBQztRQUUxQixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFLM0MsaUJBQVksR0FBMEIsUUFBUSxDQUFDO1FBQy9DLHNCQUFpQixHQUFHLElBQUksT0FBTyxFQUFtRCxDQUFDO1FBQ25GLGdCQUFXLEdBQW9CLElBQUksT0FBTyxFQUFVLENBQUM7UUFDckQsa0JBQWEsR0FBaUMsSUFBSSxPQUFPLEVBQXVCLENBQUM7UUFDakYsVUFBSyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFPbkIsdUJBQWtCLEdBQTBCLFFBQVEsQ0FBQztRQUU5QyxxQkFBZ0IsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVoQyxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ2QsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBTWhCLGFBQVE7Ozs7UUFBRyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFDO1FBNkpwQyxlQUFVOzs7O1FBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNyQixJQUFJLEtBQUssRUFBRTtnQkFDVCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztnQkFDM0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRTtvQkFDckMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO2lCQUN2RDthQUNGO1lBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLENBQUMsRUFBQTtRQW1GRCxVQUFLOzs7O1FBQUcsQ0FBQyxJQUFtQixFQUFFLEVBQUU7WUFDOUIsSUFBSSxJQUFJLEtBQUssT0FBTyxFQUFFO2dCQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3hCO2lCQUFNLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRTtnQkFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUN0QjtZQUNELENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN4RCxDQUFDLEVBQUE7UUE1UEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsYUFBYSxHQUFHLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDLGFBQWEsSUFBSSxJQUFJLG9CQUFvQixFQUFFLENBQUM7SUFDbEcsQ0FBQzs7Ozs7SUFFRCxJQUFhLFVBQVUsQ0FBQyxVQUFlO1FBQ3JDLElBQUksVUFBVSxFQUFFO1lBQ2QsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7WUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7U0FDcEY7YUFBTTtZQUNMLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQztTQUNyRDtJQUNILENBQUM7Ozs7O0lBQ0QsSUFBYSxVQUFVLENBQUMsVUFBa0I7UUFDeEMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFVBQVUsRUFBRTtZQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztTQUMvQjtJQUNILENBQUM7Ozs7O0lBQ0QsSUFBSSxPQUFPLENBQUMsSUFBZ0I7O2NBQ3BCLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztRQUN4QyxJQUFJLFNBQVMsRUFBRTtZQUNiLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO1NBQzNCO0lBQ0gsQ0FBQzs7Ozs7SUFDRCxJQUFJLE9BQU8sQ0FBQyxJQUFnQjs7Y0FDcEIsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO1FBQ3hDLElBQUksU0FBUyxFQUFFO1lBQ2IsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7U0FDM0I7SUFDSCxDQUFDOzs7OztJQUNELElBQUksU0FBUyxDQUFDLElBQXlCO1FBQ3JDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7Ozs7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQzs7OztJQUNELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDOzs7O0lBQ0QsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7Ozs7SUFDRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQzs7OztJQUNELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDOzs7OztJQUdELGVBQWUsQ0FBQyxNQUFNO1FBQ3BCLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUMzQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNwQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztTQUN4QjtJQUNILENBQUM7Ozs7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyRyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUMvQixDQUFDOzs7O0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUU7WUFDNUcsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDMUI7YUFBTTtZQUNMLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1NBQzNCO0lBQ0gsQ0FBQzs7Ozs7O0lBRUQsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFtQjtRQUMvQixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2YsSUFBSSxJQUFJLEtBQUssT0FBTyxFQUFFO2dCQUNwQixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7b0JBQ2xCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO29CQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztvQkFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7aUJBQ3hCO3FCQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtvQkFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7b0JBQ3RCLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO2lCQUMxQjtnQkFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzthQUN0QjtpQkFBTSxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7Z0JBQ3pCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtvQkFDbEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2lCQUN4QjtxQkFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO29CQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztvQkFDcEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7aUJBQ3hCO2dCQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2FBQ3hCO1NBQ0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDakQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUM3QyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztZQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztTQUN2QjtJQUNILENBQUM7Ozs7O0lBRUQsZ0JBQWdCLENBQUMsUUFBd0M7UUFDdkQsUUFBUSxRQUFRLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRTtZQUN4QyxLQUFLLEtBQUssQ0FBQztZQUNYLEtBQUssUUFBUTtnQkFDWCxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQztnQkFDL0IsTUFBTTtZQUNOLEtBQUssUUFBUTtnQkFDWCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztTQUM3QjtJQUNILENBQUM7Ozs7O0lBRUQsV0FBVyxDQUFDLElBQUk7UUFDZCxPQUFPLElBQUksQ0FBQyxDQUFDO1lBQ1gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMzRixDQUFDOzs7OztJQUVELFVBQVUsQ0FBQyxJQUFJO1FBQ2IsT0FBTyxJQUFJLENBQUMsQ0FBQztZQUNYLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDNUYsQ0FBQzs7Ozs7SUFFRCwrQkFBK0IsQ0FBQyxFQUFjO1FBQzVDLElBQUksRUFBRSxFQUFFO1lBQ04sSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDM0Q7YUFBTTtZQUNMLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxTQUFTLENBQUM7U0FDNUM7SUFDSCxDQUFDOzs7Ozs7SUFFRCxjQUFjLENBQUMsZUFBdUIsRUFBRSxXQUFtQjtRQUN6RCxRQUFRLFdBQVcsRUFBRTtZQUNuQixLQUFLLE1BQU07Z0JBQ1QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxHQUFHLGVBQWUsQ0FBQztnQkFDM0MsTUFBTTtZQUNSLEtBQUssT0FBTztnQkFDVixJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEdBQUcsZUFBZSxDQUFDO2dCQUMzQyxNQUFNO1NBQ1Q7SUFDSCxDQUFDOzs7OztJQUVELFdBQVcsQ0FBQyxJQUFJO1FBQ2QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7UUFDckYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7SUFDbkYsQ0FBQzs7Ozs7SUFZRCxpQkFBaUIsQ0FBQyxLQUFLO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzVDLENBQUM7Ozs7O0lBRUQsYUFBYSxDQUFDLEtBQUs7UUFDakIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQzs7OztJQUVELHFCQUFxQjtRQUNuQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDbkIsb0JBQW9CLEVBQUUsQ0FDdkIsQ0FBQyxTQUFTOzs7O1FBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNuQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7SUFFRCxlQUFlLENBQUMsSUFBSTtRQUNsQixJQUFJLElBQUksRUFBRTtZQUNSLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDO1NBQ3ZDO0lBQ0gsQ0FBQzs7Ozs7O0lBRUQsY0FBYyxDQUFDLFVBQVUsRUFBRSxNQUFXO1FBQ3BDLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxLQUFLLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUM1QjthQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxPQUFPLEVBQUU7WUFDckMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUM5QjtRQUNELE1BQU0sQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7Ozs7O0lBRUQsV0FBVyxDQUFDLElBQVU7UUFDcEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7Ozs7O0lBRUQsU0FBUyxDQUFDLElBQVU7UUFDbEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQzlDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1NBQ3hCO1FBQ0QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7Ozs7SUFFRCxlQUFlO0lBRWYsQ0FBQzs7Ozs7SUFFRCxXQUFXLENBQUMsS0FBSztRQUNmLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRTtZQUM1RyxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssT0FBTyxFQUFFO2dCQUM5QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM5QjtpQkFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxFQUFFO2dCQUNuQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM1QjtZQUNELENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztTQUN2RDtJQUNILENBQUM7Ozs7O0lBRUQsUUFBUSxDQUFDLEtBQUs7UUFDWixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUM1QjtJQUNILENBQUM7Ozs7SUFXRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQztRQUNuRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2pELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFNBQVM7Ozs7UUFBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2hFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUNoQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDaEMsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDOzs7O0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNyQztJQUNILENBQUM7OztZQS9URixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLGtCQUFrQjtnQkFDNUIsUUFBUSxFQUFFLGVBQWU7Z0JBQ3pCLGdwRkFBNEM7Z0JBRTVDLFVBQVUsRUFBRTtvQkFDVixlQUFlO2lCQUNoQjs7YUFDRjs7OztZQXpCQyxVQUFVO1lBWXdCLGdCQUFnQjtZQUMzQyxXQUFXOzs7cUJBY2pCLEtBQUs7dUJBQ0wsS0FBSzt1QkFDTCxLQUFLOzRCQUNMLEtBQUs7NEJBRUwsS0FBSztrQ0FDTCxLQUFLOzBCQUVMLE1BQU07eUJBQ04sU0FBUyxTQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7MEJBQ3pDLFNBQVMsU0FBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFOzJCQUMxQyxTQUFTLFNBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTt5QkFnQzNDLEtBQUs7eUJBUUwsS0FBSzs4QkFzQ0wsWUFBWSxTQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDOzs7O0lBekYxQyx3Q0FBd0I7O0lBQ3hCLDBDQUEwQjs7SUFDMUIsMENBQTJCOztJQUMzQiwrQ0FBc0M7O0lBQ3RDLDBDQUFpQjs7SUFDakIsK0NBQXNDOztJQUN0QyxxREFBb0M7O0lBQ3BDLG9EQUFxQzs7SUFDckMsNkNBQTJDOztJQUMzQyw0Q0FBbUU7O0lBQ25FLDZDQUFxRTs7SUFDckUsOENBQXVFOztJQUV2RSw4Q0FBK0M7O0lBQy9DLG1EQUFtRjs7SUFDbkYsNkNBQXFEOztJQUNyRCwrQ0FBaUY7O0lBQ2pGLHVDQUFtQjs7SUFDbkIsNENBQVc7O0lBQ1gsMENBQVM7O0lBQ1QsOENBQWE7O0lBQ2IsMENBQXNDOztJQUN0Qyw0Q0FBb0M7O0lBQ3BDLGtEQUErQjs7SUFDL0Isb0RBQXFEOztJQUVyRCxrREFBdUM7O0lBQ3ZDLDJEQUFtRDs7SUFDbkQsd0NBQXNCOzs7OztJQUN0QiwyQ0FBMEI7Ozs7O0lBQzFCLHlDQUF3Qjs7Ozs7SUFDeEIsNENBQXdDOzs7OztJQUN4Qyw2Q0FBeUI7Ozs7O0lBQ3pCLDZDQUE0Qjs7Ozs7SUFDNUIsMENBQXVCOzs7OztJQUN2QiwwQ0FBdUI7Ozs7O0lBQ3ZCLDBDQUFvQzs7SUE2SnBDLDRDQVFDOztJQW1GRCx1Q0FPQzs7SUE3UFcsb0NBQXFCOzs7OztJQUFFLGtEQUE0Qzs7Ozs7SUFBRSxzQ0FBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBPbkluaXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbiAgVmlld0NoaWxkLFxyXG4gIElucHV0LFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENka092ZXJsYXlPcmlnaW4sIENvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbkNoYW5nZSwgVmVydGljYWxDb25uZWN0aW9uUG9zIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQgeyBjb3JuZXJGYWRlSW5PdXQgfSBmcm9tICduZy1kZXZ1aS91dGlscyc7XHJcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgRGF0ZVBpY2tlckNvbmZpZ1NlcnZpY2UgYXMgRGF0ZVBpY2tlckNvbmZpZyB9IGZyb20gJy4uL2RhdGUtcGlja2VyLmNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSTE4blNlcnZpY2UsIEkxOG5JbnRlcmZhY2UgfSBmcm9tICduZy1kZXZ1aS9pMThuJztcclxuaW1wb3J0IHsgRGF0ZUNvbnZlcnRlciB9IGZyb20gJ25nLWRldnVpL3V0aWxzJztcclxuaW1wb3J0IHsgRGVmYXVsdERhdGVDb252ZXJ0ZXIgfSBmcm9tICduZy1kZXZ1aS91dGlscyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ1tkVHdvRGF0ZVBpY2tlcl0nLFxyXG4gIGV4cG9ydEFzOiAndHdvRGF0ZVBpY2tlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICd0d28tZGF0ZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdHdvLWRhdGVwaWNrZXIuY29tcG9uZW50LnNjc3MnXSxcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICBjb3JuZXJGYWRlSW5PdXRcclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUd29EYXRlUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIGxvY2FsZTogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGNzc0NsYXNzOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgZGF0ZUNvbnZlcnRlcjogRGF0ZUNvbnZlcnRlcjtcclxuICBzaG93VGltZSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNlbGVjdGVkUmFuZ2UgPSBbbnVsbCwgbnVsbF07XHJcbiAgQElucHV0KCkgaGlkZU9uUmFuZ2VTZWxlY3RlZCA9IHRydWU7XHJcbiAgY3VzdG9tVmlld1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBPdXRwdXQoKSBzZWxlY3RSYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAVmlld0NoaWxkKCdsZWZ0UGlja2VyJywgeyBzdGF0aWM6IGZhbHNlIH0pIGxlZnRQaWNrZXI6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgncmlnaHRQaWNrZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgcmlnaHRQaWNrZXI6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgndGVtcGxhdGVXcmFwJywgeyBzdGF0aWM6IGZhbHNlIH0pIHRlbXBsYXRlV3JhcDogRWxlbWVudFJlZjtcclxuXHJcbiAgZGF0ZVBvc2l0aW9uOiBWZXJ0aWNhbENvbm5lY3Rpb25Qb3MgPSAnYm90dG9tJztcclxuICBzZWxlY3REYXRlU3ViamVjdCA9IG5ldyBTdWJqZWN0PHtzaWRlOiBTdHJpbmcsIGRhdGU6IERhdGUsIG9ubHlXcml0ZT86IEJvb2xlYW59PigpO1xyXG4gIGhvdmVyT25EYXRlOiBTdWJqZWN0PG9iamVjdD4gPSBuZXcgU3ViamVjdDxvYmplY3Q+KCk7XHJcbiAgc3dpdGNoT3BlblN1YjogU3ViamVjdDwnc3RhcnQnfCdlbmQnfGZhbHNlPiA9IG5ldyBTdWJqZWN0PCdzdGFydCd8J2VuZCd8ZmFsc2U+KCk7XHJcbiAgdG9kYXkgPSBuZXcgRGF0ZSgpO1xyXG4gIHJhbmdlU3RhcnQ7XHJcbiAgcmFuZ2VFbmQ7XHJcbiAgZGlzYWJsZVRvZGF5O1xyXG4gIGkxOG5UZXh0OiBJMThuSW50ZXJmYWNlWydkYXRlUGlja2VyJ107XHJcbiAgaTE4bkxvY2FsZTogSTE4bkludGVyZmFjZVsnbG9jYWxlJ107XHJcbiAgaTE4blN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIGRhdGVwaWNrZXJQb3NpdGlvbjogVmVydGljYWxDb25uZWN0aW9uUG9zID0gJ2JvdHRvbSc7XHJcblxyXG4gIHB1YmxpYyBjdXJyZW50Q2FsZW5kYXJzID0gW251bGwsIG51bGxdO1xyXG4gIHB1YmxpYyBjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luOiBDZGtPdmVybGF5T3JpZ2luO1xyXG4gIHB1YmxpYyBpc09wZW4gPSBmYWxzZTtcclxuICBwcml2YXRlIHN0YXJ0T3BlbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgZW5kT3BlbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX3doaWNoT3BlbjogJ3N0YXJ0J3wnZW5kJ3xmYWxzZTtcclxuICBwcml2YXRlIF9kYXRlQ29uZmlnOiBhbnk7XHJcbiAgcHJpdmF0ZSBfZGF0ZUZvcm1hdDogc3RyaW5nO1xyXG4gIHByaXZhdGUgX21heERhdGU6IERhdGU7XHJcbiAgcHJpdmF0ZSBfbWluRGF0ZTogRGF0ZTtcclxuICBwcml2YXRlIG9uQ2hhbmdlID0gKF86IGFueSkgPT4gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIGVsOiBFbGVtZW50UmVmLCBwcm90ZWN0ZWQgZGF0ZVBpY2tlckNvbmZpZzogRGF0ZVBpY2tlckNvbmZpZywgcHJpdmF0ZSBpMThuOiBJMThuU2VydmljZSkge1xyXG4gICAgdGhpcy5fZGF0ZUNvbmZpZyA9IGRhdGVQaWNrZXJDb25maWdbJ2RhdGVDb25maWcnXTtcclxuICAgIHRoaXMuZGF0ZUNvbnZlcnRlciA9IGRhdGVQaWNrZXJDb25maWdbJ2RhdGVDb25maWcnXS5kYXRlQ29udmVydGVyIHx8IG5ldyBEZWZhdWx0RGF0ZUNvbnZlcnRlcigpO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IGRhdGVDb25maWcoZGF0ZUNvbmZpZzogYW55KSB7XHJcbiAgICBpZiAoZGF0ZUNvbmZpZykge1xyXG4gICAgICB0aGlzLl9kYXRlQ29uZmlnID0gZGF0ZUNvbmZpZztcclxuICAgICAgdGhpcy5fZGF0ZUZvcm1hdCA9IHRoaXMuc2hvd1RpbWUgPyBkYXRlQ29uZmlnLmZvcm1hdC50aW1lIDogZGF0ZUNvbmZpZy5mb3JtYXQuZGF0ZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2RhdGVDb25maWcgPSB0aGlzLmRhdGVQaWNrZXJDb25maWcuZGF0ZUNvbmZpZztcclxuICAgIH1cclxuICB9XHJcbiAgQElucHV0KCkgc2V0IGRhdGVGb3JtYXQoZGF0ZUZvcm1hdDogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5fZGF0ZUZvcm1hdCAhPT0gZGF0ZUZvcm1hdCkge1xyXG4gICAgICB0aGlzLl9kYXRlRm9ybWF0ID0gZGF0ZUZvcm1hdDtcclxuICAgIH1cclxuICB9XHJcbiAgc2V0IG1heERhdGUoZGF0ZTogRGF0ZSB8IGFueSkge1xyXG4gICAgY29uc3QgcGFyc2VEYXRlID0gdGhpcy5jb252ZXJ0RGF0ZShkYXRlKTtcclxuICAgIGlmIChwYXJzZURhdGUpIHtcclxuICAgICAgdGhpcy5fbWF4RGF0ZSA9IHBhcnNlRGF0ZTtcclxuICAgIH1cclxuICB9XHJcbiAgc2V0IG1pbkRhdGUoZGF0ZTogRGF0ZSB8IGFueSkge1xyXG4gICAgY29uc3QgcGFyc2VEYXRlID0gdGhpcy5jb252ZXJ0RGF0ZShkYXRlKTtcclxuICAgIGlmIChwYXJzZURhdGUpIHtcclxuICAgICAgdGhpcy5fbWluRGF0ZSA9IHBhcnNlRGF0ZTtcclxuICAgIH1cclxuICB9XHJcbiAgc2V0IHdoaWNoT3BlbihzaWRlOiAnc3RhcnQnfCdlbmQnfGZhbHNlKSB7XHJcbiAgICB0aGlzLl93aGljaE9wZW4gPSBzaWRlO1xyXG4gICAgdGhpcy5zd2l0Y2hPcGVuU3ViLm5leHQoc2lkZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgZGF0ZUNvbmZpZygpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRlQ29uZmlnO1xyXG4gIH1cclxuICBnZXQgZGF0ZUZvcm1hdCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRlRm9ybWF0O1xyXG4gIH1cclxuICBnZXQgbWF4RGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9tYXhEYXRlO1xyXG4gIH1cclxuICBnZXQgbWluRGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9taW5EYXRlO1xyXG4gIH1cclxuICBnZXQgd2hpY2hPcGVuKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3doaWNoT3BlbjtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICBvbkRvY3VtZW50Q2xpY2soJGV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5lbC5uYXRpdmVFbGVtZW50ICE9PSAkZXZlbnQudGFyZ2V0KSB7XHJcbiAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc3RhcnRPcGVuID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuZW5kT3BlbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLndoaWNoT3BlbiA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLl9taW5EYXRlID0gdGhpcy5taW5EYXRlID8gbmV3IERhdGUodGhpcy5taW5EYXRlKSA6IG5ldyBEYXRlKHRoaXMuZGF0ZUNvbmZpZy5taW4sIDAsIDEsIDAsIDAsIDApO1xyXG4gICAgdGhpcy5fbWF4RGF0ZSA9IHRoaXMubWF4RGF0ZSA/IG5ldyBEYXRlKHRoaXMubWF4RGF0ZSkgOiBuZXcgRGF0ZSh0aGlzLmRhdGVDb25maWcubWF4LCAxMSwgMzEsIDIzLCA1OSwgNTkpO1xyXG4gICAgdGhpcy5zZXRJMThuVGV4dCgpO1xyXG4gICAgdGhpcy51cGRhdGVDZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luKHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XHJcbiAgICB0aGlzLnN1YnNjcmliZUhvdmVyQWN0aW9ucygpO1xyXG4gIH1cclxuXHJcbiAgaXNEaXNhYmxlVG9kYXkoKSB7XHJcbiAgICBpZiAoKHRoaXMubWluRGF0ZS5nZXRUaW1lKCkgPj0gKHRoaXMudG9kYXkpLmdldFRpbWUoKSkgfHwgKHRoaXMubWF4RGF0ZS5nZXRUaW1lKCkgPD0gKHRoaXMudG9kYXkpLmdldFRpbWUoKSkpIHtcclxuICAgICAgdGhpcy5kaXNhYmxlVG9kYXkgPSB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kaXNhYmxlVG9kYXkgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHRvZ2dsZShldmVudCwgc2lkZTogJ3N0YXJ0J3wnZW5kJykge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBpZiAodGhpcy5pc09wZW4pIHtcclxuICAgICAgaWYgKHNpZGUgPT09ICdzdGFydCcpIHtcclxuICAgICAgICBpZiAodGhpcy5zdGFydE9wZW4pIHtcclxuICAgICAgICAgIHRoaXMuc3RhcnRPcGVuID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy53aGljaE9wZW4gPSBmYWxzZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZW5kT3Blbikge1xyXG4gICAgICAgICAgdGhpcy5zdGFydE9wZW4gPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy53aGljaE9wZW4gPSAnc3RhcnQnO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVuZE9wZW4gPSBmYWxzZTtcclxuICAgICAgfSBlbHNlIGlmIChzaWRlID09PSAnZW5kJykge1xyXG4gICAgICAgIGlmICh0aGlzLnN0YXJ0T3Blbikge1xyXG4gICAgICAgICAgdGhpcy5lbmRPcGVuID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMud2hpY2hPcGVuID0gJ2VuZCc7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVuZE9wZW4pIHtcclxuICAgICAgICAgIHRoaXMuZW5kT3BlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMud2hpY2hPcGVuID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc3RhcnRPcGVuID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc3RhcnRPcGVuID0gc2lkZSA9PT0gJ3N0YXJ0JyA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgdGhpcy5lbmRPcGVuID0gc2lkZSA9PT0gJ2VuZCcgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcclxuICAgICAgdGhpcy53aGljaE9wZW4gPSBzaWRlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25Qb3NpdGlvbkNoYW5nZShwb3NpdGlvbjogQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlKSB7XHJcbiAgICBzd2l0Y2ggKHBvc2l0aW9uLmNvbm5lY3Rpb25QYWlyLm92ZXJsYXlZKSB7XHJcbiAgICAgIGNhc2UgJ3RvcCc6XHJcbiAgICAgIGNhc2UgJ2NlbnRlcic6XHJcbiAgICAgICAgdGhpcy5kYXRlUG9zaXRpb24gPSAnYm90dG9tJztcclxuICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2JvdHRvbSc6XHJcbiAgICAgICAgdGhpcy5kYXRlUG9zaXRpb24gPSAndG9wJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnZlcnREYXRlKGRhdGUpIHtcclxuICAgIHJldHVybiBkYXRlID9cclxuICAgICAgdGhpcy5kYXRlQ29udmVydGVyLnBhcnNlKGRhdGUsIHRoaXMuZGF0ZUZvcm1hdCwgdGhpcy5sb2NhbGUgfHwgdGhpcy5pMThuTG9jYWxlKSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBmb3JtYXREYXRlKGRhdGUpIHtcclxuICAgIHJldHVybiBkYXRlID9cclxuICAgICAgdGhpcy5kYXRlQ29udmVydGVyLmZvcm1hdChkYXRlLCB0aGlzLmRhdGVGb3JtYXQsIHRoaXMubG9jYWxlIHx8IHRoaXMuaTE4bkxvY2FsZSkgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlQ2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbihlbDogRWxlbWVudFJlZikge1xyXG4gICAgaWYgKGVsKSB7XHJcbiAgICAgIHRoaXMuY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbiA9IG5ldyBDZGtPdmVybGF5T3JpZ2luKGVsKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbiA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN5bmNQaWNrZXJQYWlyKGN1cnJlbnRDYWxlbmRlcjogb2JqZWN0LCBvcmllbnRhdGlvbjogc3RyaW5nKSB7XHJcbiAgICBzd2l0Y2ggKG9yaWVudGF0aW9uKSB7XHJcbiAgICAgIGNhc2UgJ2xlZnQnOlxyXG4gICAgICAgIHRoaXMuY3VycmVudENhbGVuZGFyc1swXSA9IGN1cnJlbnRDYWxlbmRlcjtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAncmlnaHQnOlxyXG4gICAgICAgIHRoaXMuY3VycmVudENhbGVuZGFyc1sxXSA9IGN1cnJlbnRDYWxlbmRlcjtcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJhbmdlQ2hhbmdlKGRhdGEpIHtcclxuICAgIHRoaXMuY2hvb3NlRGF0ZShkYXRhLnNlbGVjdGVkUmFuZ2UpO1xyXG4gICAgdGhpcy5zZWxlY3REYXRlU3ViamVjdC5uZXh0KHtzaWRlOiAnc3RhcnQnLCBkYXRlOiB0aGlzLnJhbmdlU3RhcnQsIG9ubHlXcml0ZTogdHJ1ZX0pO1xyXG4gICAgdGhpcy5zZWxlY3REYXRlU3ViamVjdC5uZXh0KHtzaWRlOiAnZW5kJywgZGF0ZTogdGhpcy5yYW5nZUVuZCwgb25seVdyaXRlOiB0cnVlfSk7XHJcbiAgfVxyXG5cclxuICBjaG9vc2VEYXRlID0gKHJhbmdlKSA9PiB7XHJcbiAgICBpZiAocmFuZ2UpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlID0gcmFuZ2U7XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0ZWRSYW5nZSkpIHtcclxuICAgICAgICBbdGhpcy5yYW5nZVN0YXJ0LCB0aGlzLnJhbmdlRW5kXSA9IHRoaXMuc2VsZWN0ZWRSYW5nZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5ub3RpZnlWYWx1ZUNoYW5nZShyYW5nZSk7XHJcbiAgfVxyXG5cclxuICBub3RpZnlWYWx1ZUNoYW5nZShyYW5nZSkge1xyXG4gICAgdGhpcy5vbkNoYW5nZShyYW5nZSk7XHJcbiAgICB0aGlzLnNlbGVjdFJhbmdlLmVtaXQodGhpcy5zZWxlY3RlZFJhbmdlKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdGluZ0RhdGUoZXZlbnQpIHtcclxuICAgIHRoaXMuaG92ZXJPbkRhdGUubmV4dChldmVudCk7XHJcbiAgfVxyXG5cclxuICBzdWJzY3JpYmVIb3ZlckFjdGlvbnMoKSB7XHJcbiAgICB0aGlzLmhvdmVyT25EYXRlLnBpcGUoXHJcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcclxuICAgICkuc3Vic2NyaWJlKChkYXRlKSA9PiB7XHJcbiAgICAgIHRoaXMucHJldmlld1JhbmdlRW5kKGRhdGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcmV2aWV3UmFuZ2VFbmQoZGF0ZSkge1xyXG4gICAgaWYgKGRhdGUpIHtcclxuICAgICAgdGhpcy5sZWZ0UGlja2VyWydwcmV2aWV3RW5kJ10gPSBkYXRlO1xyXG4gICAgICB0aGlzLnJpZ2h0UGlja2VyWydwcmV2aWV3RW5kJ10gPSBkYXRlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3luY1JhbmdlU3RhcnQocmFuZ2VTdGFydCwgcGlja2VyOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLndoaWNoT3BlbiA9PT0gJ2VuZCcpIHtcclxuICAgICAgdGhpcy5zZWxlY3RFbmQocmFuZ2VTdGFydCk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMud2hpY2hPcGVuID09PSAnc3RhcnQnKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0U3RhcnQocmFuZ2VTdGFydCk7XHJcbiAgICB9XHJcbiAgICBwaWNrZXIuc2VsZWN0UmFuZ2UocmFuZ2VTdGFydCwgdHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RTdGFydChkYXRlOiBEYXRlKSB7XHJcbiAgICB0aGlzLnNlbGVjdERhdGVTdWJqZWN0Lm5leHQoe3NpZGU6ICdzdGFydCcsIGRhdGU6IGRhdGV9KTtcclxuICAgIHRoaXMud2hpY2hPcGVuID0gJ2VuZCc7XHJcbiAgICB0aGlzLnN0YXJ0T3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5lbmRPcGVuID0gdHJ1ZTtcclxuICAgIHRoaXMuc2VsZWN0ZWRSYW5nZVswXSA9IGRhdGU7XHJcbiAgICB0aGlzLnJhbmdlU3RhcnQgPSBkYXRlO1xyXG4gICAgdGhpcy5pc0Rpc2FibGVUb2RheSgpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0RW5kKGRhdGU6IERhdGUpIHtcclxuICAgIHRoaXMuc2VsZWN0RGF0ZVN1YmplY3QubmV4dCh7c2lkZTogJ2VuZCcsIGRhdGU6IGRhdGV9KTtcclxuICAgIHRoaXMuc2VsZWN0ZWRSYW5nZVsxXSA9IGRhdGU7XHJcbiAgICB0aGlzLnJhbmdlRW5kID0gZGF0ZTtcclxuICAgIGlmICghdGhpcy5zaG93VGltZSAmJiB0aGlzLmhpZGVPblJhbmdlU2VsZWN0ZWQpIHtcclxuICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcclxuICAgICAgdGhpcy5zdGFydE9wZW4gPSBmYWxzZTtcclxuICAgICAgdGhpcy5lbmRPcGVuID0gZmFsc2U7XHJcbiAgICAgIHRoaXMud2hpY2hPcGVuID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzRGlzYWJsZVRvZGF5KCk7XHJcbiAgfVxyXG5cclxuICBjb25zb2xpZGF0ZVRpbWUoKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgY2hvb3NlVG9kYXkoZXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICgodGhpcy5taW5EYXRlLmdldFRpbWUoKSA8PSAodGhpcy50b2RheSkuZ2V0VGltZSgpKSAmJiAodGhpcy5tYXhEYXRlLmdldFRpbWUoKSA+PSAodGhpcy50b2RheSkuZ2V0VGltZSgpKSkge1xyXG4gICAgICBpZiAodGhpcy53aGljaE9wZW4gPT09ICdzdGFydCcpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdFN0YXJ0KHRoaXMudG9kYXkpO1xyXG4gICAgICB9IGVsc2UgaWYgKHRoaXMud2hpY2hPcGVuID09PSAnZW5kJykge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0RW5kKHRoaXMudG9kYXkpO1xyXG4gICAgICB9XHJcbiAgICAgIFt0aGlzLnJhbmdlU3RhcnQsIHRoaXMucmFuZ2VFbmRdID0gdGhpcy5zZWxlY3RlZFJhbmdlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xlYXJCdG4oZXZlbnQpIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLndoaWNoT3Blbikge1xyXG4gICAgICB0aGlzLmNsZWFyKHRoaXMud2hpY2hPcGVuKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsZWFyID0gKHNpZGU6ICdzdGFydCd8J2VuZCcpID0+IHtcclxuICAgIGlmIChzaWRlID09PSAnc3RhcnQnKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0U3RhcnQobnVsbCk7XHJcbiAgICB9IGVsc2UgaWYgKHNpZGUgPT09ICdlbmQnKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0RW5kKG51bGwpO1xyXG4gICAgfVxyXG4gICAgW3RoaXMucmFuZ2VTdGFydCwgdGhpcy5yYW5nZUVuZF0gPSB0aGlzLnNlbGVjdGVkUmFuZ2U7XHJcbiAgfVxyXG5cclxuICBzZXRJMThuVGV4dCgpIHtcclxuICAgIHRoaXMuaTE4blRleHQgPSB0aGlzLmkxOG4uZ2V0STE4blRleHQoKS5kYXRlUGlja2VyO1xyXG4gICAgdGhpcy5pMThuTG9jYWxlID0gdGhpcy5pMThuLmdldEkxOG5UZXh0KCkubG9jYWxlO1xyXG4gICAgdGhpcy5pMThuU3Vic2NyaXB0aW9uID0gdGhpcy5pMThuLmxhbmdDaGFuZ2UoKS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcclxuICAgICAgdGhpcy5pMThuVGV4dCA9IGRhdGEuZGF0ZVBpY2tlcjtcclxuICAgICAgdGhpcy5pMThuTG9jYWxlID0gZGF0YS5sb2NhbGU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcclxuICAgIHRoaXMuc3RhcnRPcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmVuZE9wZW4gPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmkxOG5TdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5pMThuU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==