ngx-animating-datepicker
Version:
An Animating Datepicker for Angular 2+, for some smooth date picking :).
498 lines • 35.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { ApplicationRef, ComponentFactoryResolver, Directive, EventEmitter, HostListener, Injector, Input, Optional, Output, Renderer2, ViewContainerRef } from '@angular/core';
import { NgControl } from '@angular/forms';
import { UtilitiesService } from '../../services/utilities.service';
import { AnimatepickerComponent } from '../animatepicker/animatepicker.component';
import { DatepickerComponent } from './datepicker.component';
import { DefaultDirectiveOptions } from './datepicker.options';
var DatepickerDirective = /** @class */ (function () {
function DatepickerDirective(viewContainerRef, componentFactoryResolver, appRef, injector, renderer, formControl) {
this.viewContainerRef = viewContainerRef;
this.componentFactoryResolver = componentFactoryResolver;
this.appRef = appRef;
this.injector = injector;
this.renderer = renderer;
this.formControl = formControl;
this.datepicker = null; // TODO: fix types: DatepickerComponent | AnimatepickerComponent
this._options = DefaultDirectiveOptions;
/**
* Selected Dates: handles the selected dates array. Can be set both internally and externally
*/
this._selectedDates = [];
this.selectedDatesChange = new EventEmitter();
}
Object.defineProperty(DatepickerDirective.prototype, "options", {
get: /**
* @return {?}
*/
function () {
return this._options;
},
set: /**
* @param {?} options
* @return {?}
*/
function (options) {
if (options === undefined || !options) {
return;
}
// TODO: could be improved
this._options = tslib_1.__assign({}, this._options, options);
},
enumerable: true,
configurable: true
});
Object.defineProperty(DatepickerDirective.prototype, "datepickerOptions", {
get: /**
* @return {?}
*/
function () {
return this._datepickerOptions;
},
set: /**
* @param {?} options
* @return {?}
*/
function (options) {
this._datepickerOptions = options;
if (this.datepicker) {
this.datepicker.options = options;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(DatepickerDirective.prototype, "language", {
get: /**
* @return {?}
*/
function () {
return this._language;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._language = value;
if (this.datepicker) {
this.datepicker.language = value;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(DatepickerDirective.prototype, "minDate", {
get: /**
* @return {?}
*/
function () {
return this._minDate;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._minDate = value;
if (this.datepicker) {
this.datepicker.minDate = value;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(DatepickerDirective.prototype, "maxDate", {
get: /**
* @return {?}
*/
function () {
return this._minDate;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._maxDate = value;
if (this.datepicker) {
this.datepicker.maxDate = value;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(DatepickerDirective.prototype, "numberOfMonths", {
get: /**
* @return {?}
*/
function () {
return this._numberOfMonths;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._numberOfMonths = value;
if (this.datepicker) {
this.datepicker.numberOfMonths = value;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(DatepickerDirective.prototype, "theme", {
get: /**
* @return {?}
*/
function () {
return this._theme;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
if (this.datepicker) {
this.datepicker.theme = value;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(DatepickerDirective.prototype, "isOpen", {
get: /**
* @return {?}
*/
function () {
return this._isOpen;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._isOpen = value;
if (this.datepicker) {
this.datepicker.isOpen = value;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(DatepickerDirective.prototype, "selectedDates", {
get: /**
* @return {?}
*/
function () {
return this._selectedDates;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
if (value === undefined || this._selectedDates === value) {
return;
}
this._selectedDates = value;
this.selectedDatesChange.emit(this._selectedDates);
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
DatepickerDirective.prototype.onClick = /**
* @return {?}
*/
function () {
var _this = this;
if (!this.datepicker) {
this.datepicker = this.createDatepicker();
this.setDatepickerOptionsAndInputs();
this.subscribeToSelectedChanges();
}
if (!this.datepicker.isOpen) {
if (this.options.appendToBody) {
this.setPosition();
}
this.datepicker.open();
if (this.options.closeOnBlur) {
setTimeout(function () {
return (_this.clickListener = _this.renderer.listen('document', 'click', _this.onBlurHandler.bind(_this)));
});
}
}
};
/**
* Add selected changes
*/
/**
* Add selected changes
* @return {?}
*/
DatepickerDirective.prototype.subscribeToSelectedChanges = /**
* Add selected changes
* @return {?}
*/
function () {
var _this = this;
this.datepicker.selectedDatesChange.subscribe(function (date) {
if (_this.formControl) {
_this.formControl.control.setValue(date);
}
else {
_this.selectedDates = date;
}
});
};
/**
* Set all the options and inputs of the datepicker
*/
/**
* Set all the options and inputs of the datepicker
* @return {?}
*/
DatepickerDirective.prototype.setDatepickerOptionsAndInputs = /**
* Set all the options and inputs of the datepicker
* @return {?}
*/
function () {
this.datepicker.options = this.datepickerOptions;
this.datepicker.isOpen = this.isOpen || false;
this.datepicker.asDirective = true;
this.datepicker.numberOfMonths = this.numberOfMonths;
this.datepicker.theme = this.theme;
this.datepicker._selectedDates = this.selectedDates;
this.datepicker.language = this.language;
this.datepicker.minDate = this.minDate;
this.datepicker.minDate = this.maxDate;
};
/**
* Handles the (faked) blur event
*
* @param event
*/
/**
* Handles the (faked) blur event
*
* @param {?} event
* @return {?}
*/
DatepickerDirective.prototype.onBlurHandler = /**
* Handles the (faked) blur event
*
* @param {?} event
* @return {?}
*/
function (event) {
if (event.target !== this.datepicker.element.nativeElement &&
!this.datepicker.element.nativeElement.contains(event.target)) {
// check click origin
this.clickListener();
this.datepicker.close(true);
}
};
/**
* Returns a create DatepickerComponent method
*/
/**
* Returns a create DatepickerComponent method
* @return {?}
*/
DatepickerDirective.prototype.createDatepicker = /**
* Returns a create DatepickerComponent method
* @return {?}
*/
function () {
return this.options.appendToBody ? this.appendToBody() : this.appendToContainer();
};
/**
* Sets the position of the datepicker
*/
/**
* Sets the position of the datepicker
* @return {?}
*/
DatepickerDirective.prototype.setPosition = /**
* Sets the position of the datepicker
* @return {?}
*/
function () {
/** @type {?} */
var position = UtilitiesService.getPageOffset(this.viewContainerRef.element.nativeElement);
if (this.options.openDirection === 'bottom') {
this.datepicker.topPosition = position.bottom;
this.datepicker.leftPosition = position.left;
}
if (this.options.openDirection === 'left') {
this.datepicker.topPosition = position.top;
this.datepicker.rightPosition = position.forRight;
}
if (this.options.openDirection === 'right') {
this.datepicker.topPosition = position.top;
this.datepicker.leftPosition = position.right;
}
if (this.options.openDirection === 'top') {
this.datepicker.bottomPosition = position.forBottom;
this.datepicker.leftPosition = position.left;
}
};
/**
* Appends the DatepickerComponent to the body and returns the instance
*/
/**
* Appends the DatepickerComponent to the body and returns the instance
* @return {?}
*/
DatepickerDirective.prototype.appendToBody = /**
* Appends the DatepickerComponent to the body and returns the instance
* @return {?}
*/
function () {
/** @type {?} */
var datepickerComponent = this.options.useAnimatePicker ? AnimatepickerComponent : DatepickerComponent;
/** @type {?} */
var componentRef = this.componentFactoryResolver
.resolveComponentFactory(datepickerComponent)
.create(this.injector);
this.appRef.attachView(componentRef.hostView);
/** @type {?} */
var domElem = (/** @type {?} */ (((/** @type {?} */ (componentRef.hostView))).rootNodes[0]));
document.body.appendChild(domElem);
return componentRef.instance;
};
/**
* Appends the DatepickerComponent to the container and returns the instance
*/
/**
* Appends the DatepickerComponent to the container and returns the instance
* @return {?}
*/
DatepickerDirective.prototype.appendToContainer = /**
* Appends the DatepickerComponent to the container and returns the instance
* @return {?}
*/
function () {
/** @type {?} */
var datepickerComponent = this.options.useAnimatePicker ? AnimatepickerComponent : DatepickerComponent;
/** @type {?} */
var componentRef = this.componentFactoryResolver.resolveComponentFactory(datepickerComponent);
return this.viewContainerRef.createComponent(componentRef).instance;
};
DatepickerDirective.decorators = [
{ type: Directive, args: [{
selector: '[aaDatepicker]'
},] },
];
DatepickerDirective.ctorParameters = function () { return [
{ type: ViewContainerRef },
{ type: ComponentFactoryResolver },
{ type: ApplicationRef },
{ type: Injector },
{ type: Renderer2 },
{ type: NgControl, decorators: [{ type: Optional }] }
]; };
DatepickerDirective.propDecorators = {
options: [{ type: Input, args: ['aaDatepicker',] }],
datepickerOptions: [{ type: Input, args: ['options',] }],
language: [{ type: Input }],
minDate: [{ type: Input }],
maxDate: [{ type: Input }],
numberOfMonths: [{ type: Input }],
theme: [{ type: Input }],
isOpen: [{ type: Input }],
selectedDatesChange: [{ type: Output }],
selectedDates: [{ type: Input }],
onClick: [{ type: HostListener, args: ['click', ['$event.target'],] }]
};
return DatepickerDirective;
}());
export { DatepickerDirective };
if (false) {
/** @type {?} */
DatepickerDirective.prototype.datepicker;
/** @type {?} */
DatepickerDirective.prototype.clickListener;
/** @type {?} */
DatepickerDirective.prototype._options;
/**
* @type {?}
* @private
*/
DatepickerDirective.prototype._datepickerOptions;
/**
* Set the the language manualy. A string with a BCP 47 language tag
* \@example nl-NL
* @type {?}
* @private
*/
DatepickerDirective.prototype._language;
/**
* Minimal Date: If set the dates before it will be disabled
* @type {?}
* @private
*/
DatepickerDirective.prototype._minDate;
/**
* Maximal Date: If set the dates after it will be disabled
* @type {?}
* @private
*/
DatepickerDirective.prototype._maxDate;
/**
* Number of months: the number of months displayed
* @type {?}
* @private
*/
DatepickerDirective.prototype._numberOfMonths;
/**
* Theme string is added to the host
* @type {?}
* @private
*/
DatepickerDirective.prototype._theme;
/**
* The open state
* @type {?}
* @private
*/
DatepickerDirective.prototype._isOpen;
/**
* Selected Dates: handles the selected dates array. Can be set both internally and externally
* @type {?}
* @private
*/
DatepickerDirective.prototype._selectedDates;
/** @type {?} */
DatepickerDirective.prototype.selectedDatesChange;
/** @type {?} */
DatepickerDirective.prototype.viewContainerRef;
/** @type {?} */
DatepickerDirective.prototype.componentFactoryResolver;
/**
* @type {?}
* @private
*/
DatepickerDirective.prototype.appRef;
/**
* @type {?}
* @private
*/
DatepickerDirective.prototype.injector;
/**
* @type {?}
* @private
*/
DatepickerDirective.prototype.renderer;
/** @type {?} */
DatepickerDirective.prototype.formControl;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYW5pbWF0aW5nLWRhdGVwaWNrZXIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50cy9kYXRlcGlja2VyL2RhdGVwaWNrZXIuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNOLGNBQWMsRUFDZCx3QkFBd0IsRUFDeEIsU0FBUyxFQUVULFlBQVksRUFDWixZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR3pDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQ2xFLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBQ2hGLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzNELE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRTdEO0lBb0xDLDZCQUNRLGdCQUFrQyxFQUNsQyx3QkFBa0QsRUFDakQsTUFBc0IsRUFDdEIsUUFBa0IsRUFDbEIsUUFBbUIsRUFDUixXQUFzQjtRQUxsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFDakQsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFDdEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ1IsZ0JBQVcsR0FBWCxXQUFXLENBQVc7UUF0TDFDLGVBQVUsR0FBUSxJQUFJLENBQUMsQ0FBQyxnRUFBZ0U7UUFHeEYsYUFBUSxHQUFHLHVCQUF1QixDQUFDO1FBa0luQzs7V0FFRztRQUNLLG1CQUFjLEdB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Qjs7WUFDbEcsWUFBWSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyx1QkFBdUIsQ0FBQyxtQkFBbUIsQ0FBQztRQUMvRixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ3JFLENBQUM7O2dCQXJTRCxTQUFTLFNBQUM7b0JBQ1YsUUFBUSxFQUFFLGdCQUFnQjtpQkFDMUI7OztnQkFaQSxnQkFBZ0I7Z0JBVmhCLHdCQUF3QjtnQkFEeEIsY0FBYztnQkFNZCxRQUFRO2dCQUlSLFNBQVM7Z0JBR0YsU0FBUyx1QkFrTWQsUUFBUTs7OzBCQWpMVCxLQUFLLFNBQUMsY0FBYztvQ0FjcEIsS0FBSyxTQUFDLFNBQVM7MkJBa0JmLEtBQUs7MEJBaUJMLEtBQUs7MEJBaUJMLEtBQUs7aUNBaUJMLEtBQUs7d0JBaUJMLEtBQUs7eUJBZUwsS0FBSztzQ0FpQkwsTUFBTTtnQ0FFTixLQUFLOzBCQWFMLFlBQVksU0FBQyxPQUFPLEVBQUUsQ0FBQyxlQUFlLENBQUM7O0lBMEl6QywwQkFBQztDQUFBLEFBdFNELElBc1NDO1NBblNZLG1CQUFtQjs7O0lBQy9CLHlDQUF1Qjs7SUFDdkIsNENBQWM7O0lBRWQsdUNBQW1DOzs7OztJQWVuQyxpREFBMkI7Ozs7Ozs7SUFrQjNCLHdDQUFrQjs7Ozs7O0lBaUJsQix1Q0FBaUI7Ozs7OztJQWlCakIsdUNBQWlCOzs7Ozs7SUFpQmpCLDhDQUF3Qjs7Ozs7O0lBaUJ4QixxQ0FBZTs7Ozs7O0lBZWYsc0NBQWdCOzs7Ozs7SUFpQmhCLDZDQUFvQzs7SUFDcEMsa0RBQW1EOztJQXdDbEQsK0NBQXlDOztJQUN6Qyx1REFBeUQ7Ozs7O0lBQ3pELHFDQUE4Qjs7Ozs7SUFDOUIsdUNBQTBCOzs7OztJQUMxQix1Q0FBMkI7O0lBQzNCLDBDQUF5QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdEFwcGxpY2F0aW9uUmVmLFxuXHRDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG5cdERpcmVjdGl2ZSxcblx0RW1iZWRkZWRWaWV3UmVmLFxuXHRFdmVudEVtaXR0ZXIsXG5cdEhvc3RMaXN0ZW5lcixcblx0SW5qZWN0b3IsXG5cdElucHV0LFxuXHRPcHRpb25hbCxcblx0T3V0cHV0LFxuXHRSZW5kZXJlcjIsXG5cdFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge05nQ29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtPcHRpb25zfSBmcm9tICcuLi8uLi9tb2RlbHMvZGF0ZXBpY2tlci1vcHRpb25zLm1vZGVsJztcbmltcG9ydCB7RGlyZWN0aXZlT3B0aW9uc30gZnJvbSAnLi4vLi4vbW9kZWxzL2RpcmVjdGl2ZS1vcHRpb25zLm1vZGVsJztcbmltcG9ydCB7VXRpbGl0aWVzU2VydmljZX0gZnJvbSAnLi4vLi4vc2VydmljZXMvdXRpbGl0aWVzLnNlcnZpY2UnO1xuaW1wb3J0IHtBbmltYXRlcGlja2VyQ29tcG9uZW50fSBmcm9tICcuLi9hbmltYXRlcGlja2VyL2FuaW1hdGVwaWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7RGF0ZXBpY2tlckNvbXBvbmVudH0gZnJvbSAnLi9kYXRlcGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQge0RlZmF1bHREaXJlY3RpdmVPcHRpb25zfSBmcm9tICcuL2RhdGVwaWNrZXIub3B0aW9ucyc7XG5cbkBEaXJlY3RpdmUoe1xuXHRzZWxlY3RvcjogJ1thYURhdGVwaWNrZXJdJ1xufSlcbmV4cG9ydCBjbGFzcyBEYXRlcGlja2VyRGlyZWN0aXZlIHtcblx0ZGF0ZXBpY2tlcjogYW55ID0gbnVsbDsgLy8gVE9ETzogZml4IHR5cGVzOiBEYXRlcGlja2VyQ29tcG9uZW50IHwgQW5pbWF0ZXBpY2tlckNvbXBvbmVudFxuXHRjbGlja0xpc3RlbmVyO1xuXG5cdF9vcHRpb25zID0gRGVmYXVsdERpcmVjdGl2ZU9wdGlvbnM7XG5cblx0QElucHV0KCdhYURhdGVwaWNrZXInKVxuXHRzZXQgb3B0aW9ucyhvcHRpb25zOiBEaXJlY3RpdmVPcHRpb25zKSB7XG5cdFx0aWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fCAhb3B0aW9ucykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHQvLyBUT0RPOiBjb3VsZCBiZSBpbXByb3ZlZFxuXHRcdHRoaXMuX29wdGlvbnMgPSB7Li4udGhpcy5fb3B0aW9ucywgLi4ub3B0aW9uc307XG5cdH1cblxuXHRnZXQgb3B0aW9ucygpOiBEaXJlY3RpdmVPcHRpb25zIHtcblx0XHRyZXR1cm4gdGhpcy5fb3B0aW9ucztcblx0fVxuXG5cdHByaXZhdGUgX2RhdGVwaWNrZXJPcHRpb25zO1xuXHRASW5wdXQoJ29wdGlvbnMnKVxuXHRzZXQgZGF0ZXBpY2tlck9wdGlvbnMob3B0aW9uczogT3B0aW9ucykge1xuXHRcdHRoaXMuX2RhdGVwaWNrZXJPcHRpb25zID0gb3B0aW9ucztcblxuXHRcdGlmICh0aGlzLmRhdGVwaWNrZXIpIHtcblx0XHRcdHRoaXMuZGF0ZXBpY2tlci5vcHRpb25zID0gb3B0aW9ucztcblx0XHR9XG5cdH1cblxuXHRnZXQgZGF0ZXBpY2tlck9wdGlvbnMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2RhdGVwaWNrZXJPcHRpb25zO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCB0aGUgdGhlIGxhbmd1YWdlIG1hbnVhbHkuIEEgc3RyaW5nIHdpdGggYSBCQ1AgNDcgbGFuZ3VhZ2UgdGFnXG5cdCAqIEBleGFtcGxlIG5sLU5MXG5cdCAqL1xuXHRwcml2YXRlIF9sYW5ndWFnZTtcblx0QElucHV0KClcblx0c2V0IGxhbmd1YWdlKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLl9sYW5ndWFnZSA9IHZhbHVlO1xuXG5cdFx0aWYgKHRoaXMuZGF0ZXBpY2tlcikge1xuXHRcdFx0dGhpcy5kYXRlcGlja2VyLmxhbmd1YWdlID0gdmFsdWU7XG5cdFx0fVxuXHR9XG5cblx0Z2V0IGxhbmd1YWdlKCkge1xuXHRcdHJldHVybiB0aGlzLl9sYW5ndWFnZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNaW5pbWFsIERhdGU6IElmIHNldCB0aGUgZGF0ZXMgYmVmb3JlIGl0IHdpbGwgYmUgZGlzYWJsZWRcblx0ICovXG5cdHByaXZhdGUgX21pbkRhdGU7XG5cdEBJbnB1dCgpXG5cdHNldCBtaW5EYXRlKHZhbHVlOiBEYXRlKSB7XG5cdFx0dGhpcy5fbWluRGF0ZSA9IHZhbHVlO1xuXG5cdFx0aWYgKHRoaXMuZGF0ZXBpY2tlcikge1xuXHRcdFx0dGhpcy5kYXRlcGlja2VyLm1pbkRhdGUgPSB2YWx1ZTtcblx0XHR9XG5cdH1cblxuXHRnZXQgbWluRGF0ZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5fbWluRGF0ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYXhpbWFsIERhdGU6IElmIHNldCB0aGUgZGF0ZXMgYWZ0ZXIgaXQgd2lsbCBiZSBkaXNhYmxlZFxuXHQgKi9cblx0cHJpdmF0ZSBfbWF4RGF0ZTtcblx0QElucHV0KClcblx0c2V0IG1heERhdGUodmFsdWU6IERhdGUpIHtcblx0XHR0aGlzLl9tYXhEYXRlID0gdmFsdWU7XG5cblx0XHRpZiAodGhpcy5kYXRlcGlja2VyKSB7XG5cdFx0XHR0aGlzLmRhdGVwaWNrZXIubWF4RGF0ZSA9IHZhbHVlO1xuXHRcdH1cblx0fVxuXG5cdGdldCBtYXhEYXRlKCkge1xuXHRcdHJldHVybiB0aGlzLl9taW5EYXRlO1xuXHR9XG5cblx0LyoqXG5cdCAqIE51bWJlciBvZiBtb250aHM6IHRoZSBudW1iZXIgb2YgbW9udGhzIGRpc3BsYXllZFxuXHQgKi9cblx0cHJpdmF0ZSBfbnVtYmVyT2ZNb250aHM7XG5cdEBJbnB1dCgpXG5cdHNldCBudW1iZXJPZk1vbnRocyh2YWx1ZSkge1xuXHRcdHRoaXMuX251bWJlck9mTW9udGhzID0gdmFsdWU7XG5cblx0XHRpZiAodGhpcy5kYXRlcGlja2VyKSB7XG5cdFx0XHR0aGlzLmRhdGVwaWNrZXIubnVtYmVyT2ZNb250aHMgPSB2YWx1ZTtcblx0XHR9XG5cdH1cblxuXHRnZXQgbnVtYmVyT2ZNb250aHMoKSB7XG5cdFx0cmV0dXJuIHRoaXMuX251bWJlck9mTW9udGhzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZW1lIHN0cmluZyBpcyBhZGRlZCB0byB0aGUgaG9zdFxuXHQgKi9cblx0cHJpdmF0ZSBfdGhlbWU7XG5cdEBJbnB1dCgpXG5cdHNldCB0aGVtZSh2YWx1ZSkge1xuXHRcdGlmICh0aGlzLmRhdGVwaWNrZXIpIHtcblx0XHRcdHRoaXMuZGF0ZXBpY2tlci50aGVtZSA9IHZhbHVlO1xuXHRcdH1cblx0fVxuXG5cdGdldCB0aGVtZSgpIHtcblx0XHRyZXR1cm4gdGhpcy5fdGhlbWU7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIG9wZW4gc3RhdGVcblx0ICovXG5cdHByaXZhdGUgX2lzT3Blbjtcblx0QElucHV0KClcblx0c2V0IGlzT3Blbih2YWx1ZSkge1xuXHRcdHRoaXMuX2lzT3BlbiA9IHZhbHVlO1xuXG5cdFx0aWYgKHRoaXMuZGF0ZXBpY2tlcikge1xuXHRcdFx0dGhpcy5kYXRlcGlja2VyLmlzT3BlbiA9IHZhbHVlO1xuXHRcdH1cblx0fVxuXG5cdGdldCBpc09wZW4oKSB7XG5cdFx0cmV0dXJuIHRoaXMuX2lzT3Blbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZWxlY3RlZCBEYXRlczogaGFuZGxlcyB0aGUgc2VsZWN0ZWQgZGF0ZXMgYXJyYXkuIENhbiBiZSBzZXQgYm90aCBpbnRlcm5hbGx5IGFuZCBleHRlcm5hbGx5XG5cdCAqL1xuXHRwcml2YXRlIF9zZWxlY3RlZERhdGVzOiBEYXRlW10gPSBbXTtcblx0QE91dHB1dCgpIHNlbGVjdGVkRGF0ZXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0QElucHV0KClcblx0c2V0IHNlbGVjdGVkRGF0ZXModmFsdWU6IERhdGVbXSkge1xuXHRcdGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMuX3NlbGVjdGVkRGF0ZXMgPT09IHZhbHVlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuX3NlbGVjdGVkRGF0ZXMgPSB2YWx1ZTtcblx0XHR0aGlzLnNlbGVjdGVkRGF0ZXNDaGFuZ2UuZW1pdCh0aGlzLl9zZWxlY3RlZERhdGVzKTtcblx0fVxuXG5cdGdldCBzZWxlY3RlZERhdGVzKCk6IERhdGVbXSB7XG5cdFx0cmV0dXJuIHRoaXMuX3NlbGVjdGVkRGF0ZXM7XG5cdH1cblxuXHRASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50LnRhcmdldCddKVxuXHRvbkNsaWNrKCkge1xuXHRcdGlmICghdGhpcy5kYXRlcGlja2VyKSB7XG5cdFx0XHR0aGlzLmRhdGVwaWNrZXIgPSB0aGlzLmNyZWF0ZURhdGVwaWNrZXIoKTtcblxuXHRcdFx0dGhpcy5zZXREYXRlcGlja2VyT3B0aW9uc0FuZElucHV0cygpO1xuXHRcdFx0dGhpcy5zdWJzY3JpYmVUb1NlbGVjdGVkQ2hhbmdlcygpO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5kYXRlcGlja2VyLmlzT3Blbikge1xuXHRcdFx0aWYgKHRoaXMub3B0aW9ucy5hcHBlbmRUb0JvZHkpIHtcblx0XHRcdFx0dGhpcy5zZXRQb3NpdGlvbigpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5kYXRlcGlja2VyLm9wZW4oKTtcblxuXHRcdFx0aWYgKHRoaXMub3B0aW9ucy5jbG9zZU9uQmx1cikge1xuXHRcdFx0XHRzZXRUaW1lb3V0KFxuXHRcdFx0XHRcdCgpID0+XG5cdFx0XHRcdFx0XHQodGhpcy5jbGlja0xpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4oJ2RvY3VtZW50JywgJ2NsaWNrJywgdGhpcy5vbkJsdXJIYW5kbGVyLmJpbmQodGhpcykpKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGNvbnN0cnVjdG9yKFxuXHRcdHB1YmxpYyB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuXHRcdHB1YmxpYyBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcblx0XHRwcml2YXRlIGFwcFJlZjogQXBwbGljYXRpb25SZWYsXG5cdFx0cHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG5cdFx0cHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuXHRcdEBPcHRpb25hbCgpIHB1YmxpYyBmb3JtQ29udHJvbDogTmdDb250cm9sXG5cdCkge1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBzZWxlY3RlZCBjaGFuZ2VzXG5cdCAqL1xuXHRzdWJzY3JpYmVUb1NlbGVjdGVkQ2hhbmdlcygpOiB2b2lkIHtcblx0XHR0aGlzLmRhdGVwaWNrZXIuc2VsZWN0ZWREYXRlc0NoYW5nZS5zdWJzY3JpYmUoZGF0ZSA9PiB7XG5cdFx0XHRpZiAodGhpcy5mb3JtQ29udHJvbCkge1xuXHRcdFx0XHR0aGlzLmZvcm1Db250cm9sLmNvbnRyb2wuc2V0VmFsdWUoZGF0ZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLnNlbGVjdGVkRGF0ZXMgPSBkYXRlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCBhbGwgdGhlIG9wdGlvbnMgYW5kIGlucHV0cyBvZiB0aGUgZGF0ZXBpY2tlclxuXHQgKi9cblx0c2V0RGF0ZXBpY2tlck9wdGlvbnNBbmRJbnB1dHMoKTogdm9pZCB7XG5cdFx0dGhpcy5kYXRlcGlja2VyLm9wdGlvbnMgPSB0aGlzLmRhdGVwaWNrZXJPcHRpb25zO1xuXHRcdHRoaXMuZGF0ZXBpY2tlci5pc09wZW4gPSB0aGlzLmlzT3BlbiB8fCBmYWxzZTtcblx0XHR0aGlzLmRhdGVwaWNrZXIuYXNEaXJlY3RpdmUgPSB0cnVlO1xuXHRcdHRoaXMuZGF0ZXBpY2tlci5udW1iZXJPZk1vbnRocyA9IHRoaXMubnVtYmVyT2ZNb250aHM7XG5cdFx0dGhpcy5kYXRlcGlja2VyLnRoZW1lID0gdGhpcy50aGVtZTtcblx0XHR0aGlzLmRhdGVwaWNrZXIuX3NlbGVjdGVkRGF0ZXMgPSB0aGlzLnNlbGVjdGVkRGF0ZXM7XG5cdFx0dGhpcy5kYXRlcGlja2VyLmxhbmd1YWdlID0gdGhpcy5sYW5ndWFnZTtcblx0XHR0aGlzLmRhdGVwaWNrZXIubWluRGF0ZSA9IHRoaXMubWluRGF0ZTtcblx0XHR0aGlzLmRhdGVwaWNrZXIubWluRGF0ZSA9IHRoaXMubWF4RGF0ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSAoZmFrZWQpIGJsdXIgZXZlbnRcblx0ICpcblx0ICogQHBhcmFtIGV2ZW50XG5cdCAqL1xuXHRvbkJsdXJIYW5kbGVyKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuXHRcdGlmIChcblx0XHRcdGV2ZW50LnRhcmdldCAhPT0gdGhpcy5kYXRlcGlja2VyLmVsZW1lbnQubmF0aXZlRWxlbWVudCAmJlxuXHRcdFx0IXRoaXMuZGF0ZXBpY2tlci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KVxuXHRcdCkge1xuXHRcdFx0Ly8gY2hlY2sgY2xpY2sgb3JpZ2luXG5cdFx0XHR0aGlzLmNsaWNrTGlzdGVuZXIoKTtcblx0XHRcdHRoaXMuZGF0ZXBpY2tlci5jbG9zZSh0cnVlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIGNyZWF0ZSBEYXRlcGlja2VyQ29tcG9uZW50IG1ldGhvZFxuXHQgKi9cblx0Y3JlYXRlRGF0ZXBpY2tlcigpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLm9wdGlvbnMuYXBwZW5kVG9Cb2R5ID8gdGhpcy5hcHBlbmRUb0JvZHkoKSA6IHRoaXMuYXBwZW5kVG9Db250YWluZXIoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGF0ZXBpY2tlclxuXHQgKi9cblx0c2V0UG9zaXRpb24oKSB7XG5cdFx0Y29uc3QgcG9zaXRpb24gPSBVdGlsaXRpZXNTZXJ2aWNlLmdldFBhZ2VPZmZzZXQodGhpcy52aWV3Q29udGFpbmVyUmVmLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG5cblx0XHRpZiAodGhpcy5vcHRpb25zLm9wZW5EaXJlY3Rpb24gPT09ICdib3R0b20nKSB7XG5cdFx0XHR0aGlzLmRhdGVwaWNrZXIudG9wUG9zaXRpb24gPSBwb3NpdGlvbi5ib3R0b207XG5cdFx0XHR0aGlzLmRhdGVwaWNrZXIubGVmdFBvc2l0aW9uID0gcG9zaXRpb24ubGVmdDtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5vcHRpb25zLm9wZW5EaXJlY3Rpb24gPT09ICdsZWZ0Jykge1xuXHRcdFx0dGhpcy5kYXRlcGlja2VyLnRvcFBvc2l0aW9uID0gcG9zaXRpb24udG9wO1xuXHRcdFx0dGhpcy5kYXRlcGlja2VyLnJpZ2h0UG9zaXRpb24gPSBwb3NpdGlvbi5mb3JSaWdodDtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5vcHRpb25zLm9wZW5EaXJlY3Rpb24gPT09ICdyaWdodCcpIHtcblx0XHRcdHRoaXMuZGF0ZXBpY2tlci50b3BQb3NpdGlvbiA9IHBvc2l0aW9uLnRvcDtcblx0XHRcdHRoaXMuZGF0ZXBpY2tlci5sZWZ0UG9zaXRpb24gPSBwb3NpdGlvbi5yaWdodDtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5vcHRpb25zLm9wZW5EaXJlY3Rpb24gPT09ICd0b3AnKSB7XG5cdFx0XHR0aGlzLmRhdGVwaWNrZXIuYm90dG9tUG9zaXRpb24gPSBwb3NpdGlvbi5mb3JCb3R0b207XG5cdFx0XHR0aGlzLmRhdGVwaWNrZXIubGVmdFBvc2l0aW9uID0gcG9zaXRpb24ubGVmdDtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQXBwZW5kcyB0aGUgRGF0ZXBpY2tlckNvbXBvbmVudCB0byB0aGUgYm9keSBhbmQgcmV0dXJucyB0aGUgaW5zdGFuY2Vcblx0ICovXG5cdGFwcGVuZFRvQm9keSgpOiBhbnkge1xuXHRcdGNvbnN0IGRhdGVwaWNrZXJDb21wb25lbnQgPSB0aGlzLm9wdGlvbnMudXNlQW5pbWF0ZVBpY2tlciA/IEFuaW1hdGVwaWNrZXJDb21wb25lbnQgOiBEYXRlcGlja2VyQ29tcG9uZW50O1xuXHRcdGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyXG5cdFx0XHQucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoZGF0ZXBpY2tlckNvbXBvbmVudClcblx0XHRcdC5jcmVhdGUodGhpcy5pbmplY3Rvcik7XG5cblx0XHR0aGlzLmFwcFJlZi5hdHRhY2hWaWV3KGNvbXBvbmVudFJlZi5ob3N0Vmlldyk7XG5cblx0XHRjb25zdCBkb21FbGVtID0gKGNvbXBvbmVudFJlZi5ob3N0VmlldyBhcyBFbWJlZGRlZFZpZXdSZWY8YW55Pikucm9vdE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuXG5cdFx0ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb21FbGVtKTtcblxuXHRcdHJldHVybiBjb21wb25lbnRSZWYuaW5zdGFuY2U7XG5cdH1cblxuXHQvKipcblx0ICogQXBwZW5kcyB0aGUgRGF0ZXBpY2tlckNvbXBvbmVudCB0byB0aGUgY29udGFpbmVyIGFuZCByZXR1cm5zIHRoZSBpbnN0YW5jZVxuXHQgKi9cblx0YXBwZW5kVG9Db250YWluZXIoKTogYW55IHtcblx0XHRjb25zdCBkYXRlcGlja2VyQ29tcG9uZW50ID0gdGhpcy5vcHRpb25zLnVzZUFuaW1hdGVQaWNrZXIgPyBBbmltYXRlcGlja2VyQ29tcG9uZW50IDogRGF0ZXBpY2tlckNvbXBvbmVudDtcblx0XHRjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShkYXRlcGlja2VyQ29tcG9uZW50KTtcblx0XHRyZXR1cm4gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRSZWYpLmluc3RhbmNlO1xuXHR9XG59XG4iXX0=