com.phloxui
Version:
PhloxUI Ng2+ Framework
344 lines (343 loc) • 36.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Directive, ElementRef, ViewContainerRef, Input, NgZone } from '@angular/core';
import { AbstractHasOptions } from '../share/AbstractHasOptions';
import { Option } from '../decorator/decorators';
var /** @type {?} */ DEFAULT_FORMAT = 'application/json';
var /** @type {?} */ DEFAULT_ALWAYS_FIRE_EVENT = false;
var /** @type {?} */ DEFAULT_AUTO_ADD_CLASS = true;
var /** @type {?} */ CLASS_NAME_DRAGGING = 'dragging';
var Draggable = /** @class */ (function (_super) {
tslib_1.__extends(Draggable, _super);
function Draggable(elRef, viewConRef, ngZone) {
var _this = _super.call(this) || this;
_this.elementRef = elRef;
if (_this.elementRef !== null && typeof _this.elementRef !== 'undefined') {
// Auto add "draggable" html attr into dom
$(_this.elementRef.nativeElement).attr('draggable', 'true');
}
// Resolve component instance
try {
_this.component = (/** @type {?} */ (viewConRef))._data.componentView.component;
}
catch (/** @type {?} */ error) {
}
// Add drag event listeners
ngZone.runOutsideAngular(function () {
_this.bindEvents();
});
return _this;
}
/**
* @return {?}
*/
Draggable.prototype.bindEvents = /**
* @return {?}
*/
function () {
var _this = this;
if (this.elementRef !== null && typeof this.elementRef !== 'undefined') {
$(this.elementRef.nativeElement).on('dragstart', function (event) {
_this.onDragStart.call(_this, event.originalEvent);
});
$(this.elementRef.nativeElement).on('dragend', function (event) {
_this.onDragEnd.call(_this, event.originalEvent);
});
$(this.elementRef.nativeElement).on('drag', function (event) {
_this.onDrag.call(_this, event.originalEvent);
});
}
};
/**
* @return {?}
*/
Draggable.prototype.ngOnInit = /**
* @return {?}
*/
function () {
if (this.format === null || typeof this.format !== 'string') {
this.format = DEFAULT_FORMAT;
}
if (this.component === null || typeof this.component === 'undefined') {
// Try to resolve "component" from @Input() options;
if (this.options !== null && typeof this.options !== 'undefined') {
// Test that it is a component instance
if (typeof this.options.getDragStartDataTransfer === 'function') {
this.component = this.options;
}
}
}
if (this.alwaysFireEvent === null || typeof this.alwaysFireEvent === 'undefined') {
this.alwaysFireEvent = DEFAULT_ALWAYS_FIRE_EVENT;
}
if (this.autoAddClass === null || typeof this.autoAddClass === 'undefined') {
this.autoAddClass = DEFAULT_AUTO_ADD_CLASS;
}
};
/**
* @param {?} event
* @return {?}
*/
Draggable.prototype.isDraggable = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.component === null || typeof this.component === 'undefined') {
return true;
}
if (typeof this.component.isDraggable !== 'function') {
return true;
}
return this.component.isDraggable(event);
};
/**
* @param {?} className
* @return {?}
*/
Draggable.prototype.addStyleClass = /**
* @param {?} className
* @return {?}
*/
function (className) {
if (this.elementRef !== null && typeof this.elementRef !== 'undefined') {
$(this.elementRef.nativeElement).addClass(className);
}
if (this.component !== null && typeof this.component !== 'undefined' &&
this.component.elementRef !== null && typeof this.component.elementRef !== 'undefined') {
$(this.component.elementRef.nativeElement).addClass(className);
}
};
/**
* @param {?} className
* @return {?}
*/
Draggable.prototype.removeStyleClass = /**
* @param {?} className
* @return {?}
*/
function (className) {
if (this.elementRef !== null && typeof this.elementRef !== 'undefined') {
$(this.elementRef.nativeElement).removeClass(className);
}
if (this.component !== null && typeof this.component !== 'undefined' &&
this.component.elementRef !== null && typeof this.component.elementRef !== 'undefined') {
$(this.component.elementRef.nativeElement).removeClass(className);
}
};
/**
* @param {?} event
* @return {?}
*/
Draggable.prototype.onDragStart = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.component === null || typeof this.component === 'undefined') {
return;
}
var /** @type {?} */ draggable = this.isDraggable(event);
if (!draggable) {
if (event !== null && typeof event !== 'undefined') {
event.preventDefault();
}
if (!this.alwaysFireEvent) {
return;
}
}
if (event !== null && typeof event !== 'undefined') {
if (typeof this.component.getDragStartDataTransfer === 'function') {
// Auto set data transfer properties if getDragStartDataTransfer() is available.
var /** @type {?} */ dataTransfer = this.component.getDragStartDataTransfer(event);
if (dataTransfer !== null && typeof dataTransfer !== 'undefined') {
// We're not going to set "dropEffect" here since it should be
// set in "dragover" event.
// Set dataTransfer.effectAllowed
if (typeof dataTransfer.effectAllowed === 'function') {
// Auto resolve value from function's returned value if it is a function.
event.dataTransfer.effectAllowed = dataTransfer.effectAllowed(event);
}
else if (typeof dataTransfer.effectAllowed !== 'undefined') {
event.dataTransfer.effectAllowed = dataTransfer.effectAllowed;
}
// Set dataTransfer.files
if (typeof dataTransfer.files === 'function') {
// Auto resolve value from function's returned value if it is a function.
event.dataTransfer.files = dataTransfer.files(event);
}
else if (typeof dataTransfer.files !== 'undefined') {
event.dataTransfer.files = dataTransfer.files;
}
// Set dataTransfer.image
if (typeof dataTransfer.image === 'function') {
// Auto resolve value from function's returned value if it is a function.
event.dataTransfer.setDragImage(dataTransfer.image(event), 0, 0);
}
else if (typeof dataTransfer.image !== 'undefined') {
event.dataTransfer.setDragImage(dataTransfer.image, 0, 0);
}
var /** @type {?} */ format = this.format;
if (typeof dataTransfer.format === 'function') {
// Auto resolve value from function's returned value if it is a function.
format = dataTransfer.format(event);
}
else if (typeof dataTransfer.format !== 'undefined') {
format = dataTransfer.format;
}
if (format === null || typeof format === 'undefined') {
format = DEFAULT_FORMAT;
}
var /** @type {?} */ data = null;
if (typeof dataTransfer.data === 'function') {
// Auto resolve value from function's returned value if it is a function.
data = dataTransfer.data(event);
}
else if (typeof dataTransfer.data !== 'undefined') {
data = dataTransfer.data;
}
if (format.toLowerCase() === 'application/json') {
// Auto serialize data into json if it is not json string.
try {
JSON.parse(data);
}
catch (/** @type {?} */ e) {
// The given "data" is not json string
try {
data = JSON.stringify(data);
}
catch (/** @type {?} */ e) {
// The data cannot be parsed to json string
data = null;
}
}
}
if ((format !== null && typeof format !== 'undefined') ||
(data !== null && typeof data !== 'undefined')) {
event.dataTransfer.setData(format, data);
}
}
}
}
if (this.autoAddClass) {
this.addStyleClass(CLASS_NAME_DRAGGING);
}
if (typeof this.component.onDragStart === 'function') {
this.component.onDragStart(event);
}
};
/**
* @param {?} event
* @return {?}
*/
Draggable.prototype.onDragEnd = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.component === null || typeof this.component === 'undefined') {
return;
}
if (this.autoAddClass) {
this.removeStyleClass(CLASS_NAME_DRAGGING);
}
if (typeof this.component.onDragEnd === 'function') {
if (this.alwaysFireEvent || this.isDraggable(event)) {
this.component.onDragEnd(event);
}
}
};
/**
* @param {?} event
* @return {?}
*/
Draggable.prototype.onDrag = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (this.component === null || typeof this.component === 'undefined') {
return;
}
if (typeof this.component.onDrag === 'function') {
if (this.alwaysFireEvent || this.isDraggable(event)) {
this.component.onDrag(event);
}
}
};
Draggable.DEFAULT_FORMAT = DEFAULT_FORMAT;
Draggable.CLASS_NAME_DRAGGING = CLASS_NAME_DRAGGING;
Draggable.DEFAULT_ALWAYS_FIRE_EVENT = DEFAULT_ALWAYS_FIRE_EVENT;
Draggable.DEFAULT_AUTO_ADD_CLASS = DEFAULT_AUTO_ADD_CLASS;
Draggable.decorators = [
{ type: Directive, args: [{
selector: '[phxDraggable]'
},] },
];
/** @nocollapse */
Draggable.ctorParameters = function () { return [
{ type: ElementRef, },
{ type: ViewContainerRef, },
{ type: NgZone, },
]; };
Draggable.propDecorators = {
"options": [{ type: Input, args: ['phxDraggable',] },],
"format": [{ type: Input, args: ['dragFormat',] },],
"component": [{ type: Input, args: ['dragTarget',] },],
"alwaysFireEvent": [{ type: Input, args: ['dragFireEvent',] },],
"autoAddClass": [{ type: Input, args: ['dragAddClass',] },],
};
tslib_1.__decorate([
Option('format'),
tslib_1.__metadata("design:type", String)
], Draggable.prototype, "format", void 0);
tslib_1.__decorate([
Option('target'),
tslib_1.__metadata("design:type", Object)
], Draggable.prototype, "component", void 0);
tslib_1.__decorate([
Option('fireEvent'),
tslib_1.__metadata("design:type", Boolean)
], Draggable.prototype, "alwaysFireEvent", void 0);
tslib_1.__decorate([
Option('addClass'),
tslib_1.__metadata("design:type", Boolean)
], Draggable.prototype, "autoAddClass", void 0);
return Draggable;
}(AbstractHasOptions));
export { Draggable };
function Draggable_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
Draggable.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
Draggable.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
Draggable.propDecorators;
/** @type {?} */
Draggable.DEFAULT_FORMAT;
/** @type {?} */
Draggable.CLASS_NAME_DRAGGING;
/** @type {?} */
Draggable.DEFAULT_ALWAYS_FIRE_EVENT;
/** @type {?} */
Draggable.DEFAULT_AUTO_ADD_CLASS;
/** @type {?} */
Draggable.prototype.options;
/** @type {?} */
Draggable.prototype.format;
/** @type {?} */
Draggable.prototype.component;
/** @type {?} */
Draggable.prototype.alwaysFireEvent;
/** @type {?} */
Draggable.prototype.autoAddClass;
/** @type {?} */
Draggable.prototype.elementRef;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRHJhZ2dhYmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2RpcmVjdGl2ZS9EcmFnZ2FibGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBZ0IsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXhILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRWpFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUlqRCxxQkFBTSxjQUFjLEdBQVcsa0JBQWtCLENBQUM7QUFDbEQscUJBQU0seUJBQXlCLEdBQVksS0FBSyxDQUFDO0FBQ2pELHFCQUFNLHNCQUFzQixHQUFZLElBQUksQ0FBQztBQUM3QyxxQkFBTSxtQkFBbUIsR0FBVyxVQUFVLENBQUM7O0lBT2hCLHFDQUFrQjtJQTRCL0MsbUJBQVksS0FBaUIsRUFBRSxVQUE0QixFQUFFLE1BQWM7UUFBM0UsWUFDRSxpQkFBTyxTQWtCUjtRQWhCQyxLQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixFQUFFLENBQUMsQ0FBQyxLQUFJLENBQUMsVUFBVSxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUksQ0FBQyxVQUFVLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQzs7WUFFdkUsQ0FBQyxDQUFDLEtBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUM1RDs7UUFHRCxJQUFJLENBQUM7WUFDSCxLQUFJLENBQUMsU0FBUyxHQUFHLG1CQUFNLFVBQVUsRUFBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDO1NBQ2xFO1FBQUMsS0FBSyxDQUFDLENBQUMsaUJBQUEsS0FBSyxFQUFF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IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgVmlld0NvbnRhaW5lclJlZiwgSW5wdXQsIEhvc3RMaXN0ZW5lciwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFic3RyYWN0SGFzT3B0aW9ucyB9IGZyb20gJy4uL3NoYXJlL0Fic3RyYWN0SGFzT3B0aW9ucyc7XG5cbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uL2RlY29yYXRvci9kZWNvcmF0b3JzJztcblxuaW1wb3J0IHsgRHJhZ0RhdGFUcmFuc2ZlciB9IGZyb20gJy4uL2NvbXBvbmVudC9tb2RlbC9tb2RlbHMnO1xuXG5jb25zdCBERUZBVUxUX0ZPUk1BVDogc3RyaW5nID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuY29uc3QgREVGQVVMVF9BTFdBWVNfRklSRV9FVkVOVDogYm9vbGVhbiA9IGZhbHNlO1xuY29uc3QgREVGQVVMVF9BVVRPX0FERF9DTEFTUzogYm9vbGVhbiA9IHRydWU7XG5jb25zdCBDTEFTU19OQU1FX0RSQUdHSU5HOiBzdHJpbmcgPSAnZHJhZ2dpbmcnO1xuXG5kZWNsYXJlIHZhciAkOiBhbnk7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1twaHhEcmFnZ2FibGVdJ1xufSlcbmV4cG9ydCBjbGFzcyBEcmFnZ2FibGUgZXh0ZW5kcyBBYnN0cmFjdEhhc09wdGlvbnMgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9GT1JNQVQ6IHN0cmluZyA9IERFRkFVTFRfRk9STUFUO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IENMQVNTX05BTUVfRFJBR0dJTkc6IHN0cmluZyA9IENMQVNTX05BTUVfRFJBR0dJTkc7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9BTFdBWVNfRklSRV9FVkVOVDogYm9vbGVhbiA9IERFRkFVTFRfQUxXQVlTX0ZJUkVfRVZFTlQ7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9BVVRPX0FERF9DTEFTUzogYm9vbGVhbiA9IERFRkFVTFRfQVVUT19BRERfQ0xBU1M7XG5cbiAgQElucHV0KCdwaHhEcmFnZ2FibGUnKVxuICBwcm90ZWN0ZWQgb3B0aW9uczogYW55O1xuXG4gIEBJbnB1dCgnZHJhZ0Zvcm1hdCcpXG4gIEBPcHRpb24oJ2Zvcm1hdCcpXG4gIHByaXZhdGUgZm9ybWF0OiBzdHJpbmc7XG5cbiAgQElucHV0KCdkcmFnVGFyZ2V0JylcbiAgQE9wdGlvbigndGFyZ2V0JylcbiAgcHJpdmF0ZSBjb21wb25lbnQ6IGFueTtcblxuICBASW5wdXQoJ2RyYWdGaXJlRXZlbnQnKVxuICBAT3B0aW9uKCdmaXJlRXZlbnQnKVxuICBwcml2YXRlIGFsd2F5c0ZpcmVFdmVudDogYm9vbGVhbjtcblxuICBASW5wdXQoJ2RyYWdBZGRDbGFzcycpXG4gIEBPcHRpb24oJ2FkZENsYXNzJylcbiAgcHJpdmF0ZSBhdXRvQWRkQ2xhc3M6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuXG4gIGNvbnN0cnVjdG9yKGVsUmVmOiBFbGVtZW50UmVmLCB2aWV3Q29uUmVmOiBWaWV3Q29udGFpbmVyUmVmLCBuZ1pvbmU6IE5nWm9uZSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmVsZW1lbnRSZWYgPSBlbFJlZjtcbiAgICBpZiAodGhpcy5lbGVtZW50UmVmICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmVsZW1lbnRSZWYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBBdXRvIGFkZCBcImRyYWdnYWJsZVwiIGh0bWwgYXR0ciBpbnRvIGRvbVxuICAgICAgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuYXR0cignZHJhZ2dhYmxlJywgJ3RydWUnKTtcbiAgICB9XG5cbiAgICAvLyBSZXNvbHZlIGNvbXBvbmVudCBpbnN0YW5jZVxuICAgIHRyeSB7XG4gICAgICB0aGlzLmNvbXBvbmVudCA9ICg8YW55PnZpZXdDb25SZWYpLl9kYXRhLmNvbXBvbmVudFZpZXcuY29tcG9uZW50O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgfVxuXG4gICAgLy8gQWRkIGRyYWcgZXZlbnQgbGlzdGVuZXJzXG4gICAgbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuYmluZEV2ZW50cygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBiaW5kRXZlbnRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVsZW1lbnRSZWYgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuZWxlbWVudFJlZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLm9uKCdkcmFnc3RhcnQnLCAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uRHJhZ1N0YXJ0LmNhbGwodGhpcywgZXZlbnQub3JpZ2luYWxFdmVudCk7XG4gICAgICB9KTtcbiAgICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLm9uKCdkcmFnZW5kJywgKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkRyYWdFbmQuY2FsbCh0aGlzLCBldmVudC5vcmlnaW5hbEV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkub24oJ2RyYWcnLCAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uRHJhZy5jYWxsKHRoaXMsIGV2ZW50Lm9yaWdpbmFsRXZlbnQpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZvcm1hdCA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5mb3JtYXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLmZvcm1hdCA9IERFRkFVTFRfRk9STUFUO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb21wb25lbnQgPT09IG51bGwgfHwgdHlwZW9mIHRoaXMuY29tcG9uZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gVHJ5IHRvIHJlc29sdmUgXCJjb21wb25lbnRcIiBmcm9tIEBJbnB1dCgpIG9wdGlvbnM7XG4gICAgICBpZiAodGhpcy5vcHRpb25zICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIFRlc3QgdGhhdCBpdCBpcyBhIGNvbXBvbmVudCBpbnN0YW5jZVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5nZXREcmFnU3RhcnREYXRhVHJhbnNmZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudCA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5hbHdheXNGaXJlRXZlbnQgPT09IG51bGwgfHwgdHlwZW9mIHRoaXMuYWx3YXlzRmlyZUV2ZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5hbHdheXNGaXJlRXZlbnQgPSBERUZBVUxUX0FMV0FZU19GSVJFX0VWRU5UO1xuICAgIH1cbiAgICBpZiAodGhpcy5hdXRvQWRkQ2xhc3MgPT09IG51bGwgfHwgdHlwZW9mIHRoaXMuYXV0b0FkZENsYXNzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5hdXRvQWRkQ2xhc3MgPSBERUZBVUxUX0FVVE9fQUREX0NMQVNTO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNEcmFnZ2FibGUoZXZlbnQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNvbXBvbmVudCA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5jb21wb25lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbXBvbmVudC5pc0RyYWdnYWJsZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50LmlzRHJhZ2dhYmxlKGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkU3R5bGVDbGFzcyhjbGFzc05hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmVsZW1lbnRSZWYgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuZWxlbWVudFJlZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmFkZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbXBvbmVudCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb21wb25lbnQgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHRoaXMuY29tcG9uZW50LmVsZW1lbnRSZWYgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29tcG9uZW50LmVsZW1lbnRSZWYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAkKHRoaXMuY29tcG9uZW50LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuYWRkQ2xhc3MoY2xhc3NOYW1lKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVN0eWxlQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5lbGVtZW50UmVmICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmVsZW1lbnRSZWYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5yZW1vdmVDbGFzcyhjbGFzc05hbWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb21wb25lbnQgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29tcG9uZW50ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICB0aGlzLmNvbXBvbmVudC5lbGVtZW50UmVmICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbXBvbmVudC5lbGVtZW50UmVmICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgJCh0aGlzLmNvbXBvbmVudC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLnJlbW92ZUNsYXNzKGNsYXNzTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQEhvc3RMaXN0ZW5lcignZHJhZ3N0YXJ0JywgWyckZXZlbnQnXSlcbiAgcHJpdmF0ZSBvbkRyYWdTdGFydChldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50ID09PSBudWxsIHx8IHR5cGVvZiB0aGlzLmNvbXBvbmVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZHJhZ2dhYmxlOiBib29sZWFuID0gdGhpcy5pc0RyYWdnYWJsZShldmVudCk7XG4gICAgaWYgKCFkcmFnZ2FibGUpIHtcbiAgICAgIGlmIChldmVudCAhPT0gbnVsbCAmJiB0eXBlb2YgZXZlbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5hbHdheXNGaXJlRXZlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChldmVudCAhPT0gbnVsbCAmJiB0eXBlb2YgZXZlbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuY29tcG9uZW50LmdldERyYWdTdGFydERhdGFUcmFuc2ZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBBdXRvIHNldCBkYXRhIHRyYW5zZmVyIHByb3BlcnRpZXMgaWYgZ2V0RHJhZ1N0YXJ0RGF0YVRyYW5zZmVyKCkgaXMgYXZhaWxhYmxlLlxuICAgICAgICBsZXQgZGF0YVRyYW5zZmVyOiBEcmFnRGF0YVRyYW5zZmVyID0gdGhpcy5jb21wb25lbnQuZ2V0RHJhZ1N0YXJ0RGF0YVRyYW5zZmVyKGV2ZW50KTtcblxuICAgICAgICBpZiAoZGF0YVRyYW5zZmVyICE9PSBudWxsICYmIHR5cGVvZiBkYXRhVHJhbnNmZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgLy8gV2UncmUgbm90IGdvaW5nIHRvIHNldCBcImRyb3BFZmZlY3RcIiBoZXJlIHNpbmNlIGl0IHNob3VsZCBiZVxuICAgICAgICAgIC8vIHNldCBpbiBcImRyYWdvdmVyXCIgZXZlbnQuXG5cbiAgICAgICAgICAvLyBTZXQgZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWRcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBBdXRvIHJlc29sdmUgdmFsdWUgZnJvbSBmdW5jdGlvbidzIHJldHVybmVkIHZhbHVlIGlmIGl0IGlzIGEgZnVuY3Rpb24uXG4gICAgICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9IGRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkKGV2ZW50KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2V0IGRhdGFUcmFuc2Zlci5maWxlc1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVRyYW5zZmVyLmZpbGVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBBdXRvIHJlc29sdmUgdmFsdWUgZnJvbSBmdW5jdGlvbidzIHJldHVybmVkIHZhbHVlIGlmIGl0IGlzIGEgZnVuY3Rpb24uXG4gICAgICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuZmlsZXMgPSBkYXRhVHJhbnNmZXIuZmlsZXMoZXZlbnQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGFUcmFuc2Zlci5maWxlcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5maWxlcyA9IGRhdGFUcmFuc2Zlci5maWxlcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZXQgZGF0YVRyYW5zZmVyLmltYWdlXG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhVHJhbnNmZXIuaW1hZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIEF1dG8gcmVzb2x2ZSB2YWx1ZSBmcm9tIGZ1bmN0aW9uJ3MgcmV0dXJuZWQgdmFsdWUgaWYgaXQgaXMgYSBmdW5jdGlvbi5cbiAgICAgICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5zZXREcmFnSW1hZ2UoZGF0YVRyYW5zZmVyLmltYWdlKGV2ZW50KSwgMCwgMCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YVRyYW5zZmVyLmltYWdlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERyYWdJbWFnZShkYXRhVHJhbnNmZXIuaW1hZ2UsIDAsIDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBmb3JtYXQ6IHN0cmluZyA9IHRoaXMuZm9ybWF0O1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVRyYW5zZmVyLmZvcm1hdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gQXV0byByZXNvbHZlIHZhbHVlIGZyb20gZnVuY3Rpb24ncyByZXR1cm5lZCB2YWx1ZSBpZiBpdCBpcyBhIGZ1bmN0aW9uLlxuICAgICAgICAgICAgZm9ybWF0ID0gZGF0YVRyYW5zZmVyLmZvcm1hdChldmVudCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YVRyYW5zZmVyLmZvcm1hdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGRhdGFUcmFuc2Zlci5mb3JtYXQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmb3JtYXQgPT09IG51bGwgfHwgdHlwZW9mIGZvcm1hdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IERFRkFVTFRfRk9STUFUO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBkYXRhOiBhbnkgPSBudWxsO1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVRyYW5zZmVyLmRhdGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIEF1dG8gcmVzb2x2ZSB2YWx1ZSBmcm9tIGZ1bmN0aW9uJ3MgcmV0dXJuZWQgdmFsdWUgaWYgaXQgaXMgYSBmdW5jdGlvbi5cbiAgICAgICAgICAgIGRhdGEgPSBkYXRhVHJhbnNmZXIuZGF0YShldmVudCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YVRyYW5zZmVyLmRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBkYXRhID0gZGF0YVRyYW5zZmVyLmRhdGE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmb3JtYXQudG9Mb3dlckNhc2UoKSA9PT0gJ2FwcGxpY2F0aW9uL2pzb24nKSB7XG4gICAgICAgICAgICAvLyBBdXRvIHNlcmlhbGl6ZSBkYXRhIGludG8ganNvbiBpZiBpdCBpcyBub3QganNvbiBzdHJpbmcuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICAgIC8vIFRoZSBnaXZlbiBcImRhdGFcIiBpcyBub3QganNvbiBzdHJpbmdcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBkYXRhID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBkYXRhIGNhbm5vdCBiZSBwYXJzZWQgdG8ganNvbiBzdHJpbmdcbiAgICAgICAgICAgICAgICBkYXRhID0gbnVsbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICgoZm9ybWF0ICE9PSBudWxsICYmIHR5cGVvZiBmb3JtYXQgIT09ICd1bmRlZmluZWQnKSB8fFxuICAgICAgICAgICAgICAoZGF0YSAhPT0gbnVsbCAmJiB0eXBlb2YgZGF0YSAhPT0gJ3VuZGVmaW5lZCcpKSB7XG4gICAgICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuc2V0RGF0YShmb3JtYXQsIGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmF1dG9BZGRDbGFzcykge1xuICAgICAgdGhpcy5hZGRTdHlsZUNsYXNzKENMQVNTX05BTUVfRFJBR0dJTkcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGhpcy5jb21wb25lbnQub25EcmFnU3RhcnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50Lm9uRHJhZ1N0YXJ0KGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICAvLyBASG9zdExpc3RlbmVyKCdkcmFnZW5kJywgWyckZXZlbnQnXSlcbiAgcHJpdmF0ZSBvbkRyYWdFbmQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbXBvbmVudCA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5jb21wb25lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYXV0b0FkZENsYXNzKSB7XG4gICAgICB0aGlzLnJlbW92ZVN0eWxlQ2xhc3MoQ0xBU1NfTkFNRV9EUkFHR0lORyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbXBvbmVudC5vbkRyYWdFbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh0aGlzLmFsd2F5c0ZpcmVFdmVudCB8fCB0aGlzLmlzRHJhZ2dhYmxlKGV2ZW50KSkge1xuICAgICAgICB0aGlzLmNvbXBvbmVudC5vbkRyYWdFbmQoZXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEBIb3N0TGlzdGVuZXIoJ2RyYWcnLCBbJyRldmVudCddKVxuICBwcml2YXRlIG9uRHJhZyhldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50ID09PSBudWxsIHx8IHR5cGVvZiB0aGlzLmNvbXBvbmVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRoaXMuY29tcG9uZW50Lm9uRHJhZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHRoaXMuYWx3YXlzRmlyZUV2ZW50IHx8IHRoaXMuaXNEcmFnZ2FibGUoZXZlbnQpKSB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50Lm9uRHJhZyhldmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=