@hxui/angular
Version:
This README includes the steps that are necessary to import the HxUi-angular into a project or to contribute with development.
326 lines (325 loc) • 28.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { TemplateRef, EventEmitter, ReflectiveInjector } from '@angular/core';
import { ContentRef } from './content-ref.class';
import { listenToTriggers } from '../utils/triggers';
/**
* @record
*/
export function ListenOptions() { }
function ListenOptions_tsickle_Closure_declarations() {
/** @type {?|undefined} */
ListenOptions.prototype.target;
/** @type {?|undefined} */
ListenOptions.prototype.triggers;
/** @type {?|undefined} */
ListenOptions.prototype.show;
/** @type {?|undefined} */
ListenOptions.prototype.hide;
/** @type {?|undefined} */
ListenOptions.prototype.toggle;
}
/**
* @template T
*/
var /**
* @template T
*/
ComponentLoader = /** @class */ (function () {
function ComponentLoader(_viewContainerRef, _renderer, _elementRef, _injector, _componentFactoryResolver, _ngZone, _posService) {
this.onBeforeShow = new EventEmitter();
this.onShown = new EventEmitter();
this.onBeforeHide = new EventEmitter();
this.onHidden = new EventEmitter();
this._providers = [];
this._ngZone = _ngZone;
this._injector = _injector;
this._renderer = _renderer;
this._elementRef = _elementRef;
this._posService = _posService;
this._viewContainerRef = _viewContainerRef;
this._componentFactoryResolver = _componentFactoryResolver;
}
Object.defineProperty(ComponentLoader.prototype, "isShown", {
get: /**
* @return {?}
*/
function () {
return !!this._componentRef;
},
enumerable: true,
configurable: true
});
;
/**
* @param {?} compType
* @return {?}
*/
ComponentLoader.prototype.attach = /**
* @param {?} compType
* @return {?}
*/
function (compType) {
this._componentFactory = this._componentFactoryResolver
.resolveComponentFactory(compType);
return this;
};
/**
* @param {?=} container
* @return {?}
*/
ComponentLoader.prototype.to = /**
* @param {?=} container
* @return {?}
*/
function (container) {
this.container = container || this.container;
return this;
};
/**
* @param {?=} opts
* @return {?}
*/
ComponentLoader.prototype.position = /**
* @param {?=} opts
* @return {?}
*/
function (opts) {
this.attachment = opts.attachment || this.attachment;
this._elementRef = /** @type {?} */ (opts.target) || this._elementRef;
return this;
};
/**
* @param {?} provider
* @return {?}
*/
ComponentLoader.prototype.provide = /**
* @param {?} provider
* @return {?}
*/
function (provider) {
this._providers.push(provider);
return this;
};
/**
* @param {?=} opts
* @return {?}
*/
ComponentLoader.prototype.show = /**
* @param {?=} opts
* @return {?}
*/
function (opts) {
if (opts === void 0) { opts = {}; }
this._subscribePositioning();
if (!this._componentRef) {
this.onBeforeShow.emit();
this._contentRef = this._getContentRef(opts.content);
var /** @type {?} */ injector = ReflectiveInjector.resolveAndCreate(this._providers, this._injector);
this._componentRef = this._viewContainerRef
.createComponent(this._componentFactory, 0, injector, this._contentRef.nodes);
this.instance = this._componentRef.instance;
Object.assign(this._componentRef.instance, opts);
if (this.container === 'body' && typeof document !== 'undefined') {
document.querySelector(/** @type {?} */ (this.container))
.appendChild(this._componentRef.location.nativeElement);
}
// we need to manually invoke change detection since events registered
// via
// Renderer::listen() are not picked up by change detection with the
// OnPush strategy
this._componentRef.changeDetectorRef.markForCheck();
this.onShown.emit(this._componentRef.instance);
}
return this._componentRef;
};
/**
* @return {?}
*/
ComponentLoader.prototype.hide = /**
* @return {?}
*/
function () {
if (this._componentRef) {
this.onBeforeHide.emit(this._componentRef.instance);
this._viewContainerRef.remove(this._viewContainerRef.indexOf(this._componentRef.hostView));
this._componentRef = null;
if (this._contentRef.viewRef) {
this._viewContainerRef.remove(this._viewContainerRef.indexOf(this._contentRef.viewRef));
this._contentRef = null;
}
this._componentRef = null;
this.onHidden.emit();
}
return this;
};
/**
* @return {?}
*/
ComponentLoader.prototype.toggle = /**
* @return {?}
*/
function () {
if (this.isShown) {
this.hide();
return;
}
this.show();
};
/**
* @return {?}
*/
ComponentLoader.prototype.dispose = /**
* @return {?}
*/
function () {
if (this.isShown) {
this.hide();
}
this._unsubscribePositioning();
if (this._unregisterListenersFn) {
this._unregisterListenersFn();
}
};
/**
* @param {?} listenOpts
* @return {?}
*/
ComponentLoader.prototype.listen = /**
* @param {?} listenOpts
* @return {?}
*/
function (listenOpts) {
var _this = this;
this.triggers = listenOpts.triggers || this.triggers;
listenOpts.target = listenOpts.target || this._elementRef;
listenOpts.show = listenOpts.show || (function () { return _this.show(); });
listenOpts.hide = listenOpts.hide || (function () { return _this.hide(); });
listenOpts.toggle = listenOpts.toggle || (function () {
return _this.isShown
? listenOpts.hide()
: listenOpts.show();
});
this._unregisterListenersFn = listenToTriggers(this._renderer, listenOpts.target.nativeElement, this.triggers, listenOpts.show, listenOpts.hide, listenOpts.toggle);
return this;
};
/**
* @return {?}
*/
ComponentLoader.prototype._subscribePositioning = /**
* @return {?}
*/
function () {
var _this = this;
if (this._zoneSubscription || !this.attachment) {
return;
}
this._zoneSubscription = this._ngZone
.onStable.subscribe(function () {
if (!_this._componentRef) {
return;
}
_this._posService.position({
element: _this._componentRef.location,
target: _this._elementRef,
attachment: _this.attachment,
appendToBody: _this.container === 'body'
});
});
};
/**
* @return {?}
*/
ComponentLoader.prototype._unsubscribePositioning = /**
* @return {?}
*/
function () {
if (!this._zoneSubscription) {
return;
}
this._zoneSubscription.unsubscribe();
this._zoneSubscription = null;
};
/**
* @param {?} content
* @return {?}
*/
ComponentLoader.prototype._getContentRef = /**
* @param {?} content
* @return {?}
*/
function (content) {
if (!content) {
return new ContentRef([]);
}
if (content instanceof TemplateRef) {
var /** @type {?} */ viewRef = this._viewContainerRef
.createEmbeddedView(content);
return new ContentRef([viewRef.rootNodes], viewRef);
}
return new ContentRef([[this._renderer.createText("" + content)]]);
};
return ComponentLoader;
}());
/**
* @template T
*/
export { ComponentLoader };
function ComponentLoader_tsickle_Closure_declarations() {
/** @type {?} */
ComponentLoader.prototype.onBeforeShow;
/** @type {?} */
ComponentLoader.prototype.onShown;
/** @type {?} */
ComponentLoader.prototype.onBeforeHide;
/** @type {?} */
ComponentLoader.prototype.onHidden;
/** @type {?} */
ComponentLoader.prototype.instance;
/** @type {?} */
ComponentLoader.prototype._componentRef;
/** @type {?} */
ComponentLoader.prototype._providers;
/** @type {?} */
ComponentLoader.prototype._componentFactory;
/** @type {?} */
ComponentLoader.prototype._elementRef;
/** @type {?} */
ComponentLoader.prototype._zoneSubscription;
/** @type {?} */
ComponentLoader.prototype._contentRef;
/** @type {?} */
ComponentLoader.prototype._viewContainerRef;
/** @type {?} */
ComponentLoader.prototype._injector;
/** @type {?} */
ComponentLoader.prototype._renderer;
/** @type {?} */
ComponentLoader.prototype._ngZone;
/** @type {?} */
ComponentLoader.prototype._componentFactoryResolver;
/** @type {?} */
ComponentLoader.prototype._posService;
/** @type {?} */
ComponentLoader.prototype._unregisterListenersFn;
/**
* Placement of a component. Accepts: "top", "bottom", "left", "right"
* @type {?}
*/
ComponentLoader.prototype.attachment;
/**
* A selector specifying the element the popover should be appended to.
* Currently only supports "body".
* @type {?}
*/
ComponentLoader.prototype.container;
/**
* Specifies events that should trigger. Supports a space separated list of
* event names.
* @type {?}
*/
ComponentLoader.prototype.triggers;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWxvYWRlci5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BoeHVpL2FuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50LWxvYWRlci9jb21wb25lbnQtbG9hZGVyLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFHQSxPQUFPLEVBRTZDLFdBQVcsRUFBRSxZQUFZLEVBQ2pFLGtCQUFrQixFQUM3QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFakQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBV3JEOzs7QUFBQTs2QkF5RHFCLGlCQUFtQyxFQUFFLFNBQW9CLEVBQ3pELFdBQXVCLEVBQ3ZCLFNBQW1CLEVBQUUseUJBQW1ELEVBQ3hFLE9BQWUsRUFBRSxXQUErQjs0QkEzRDFCLElBQUksWUFBWSxFQUFFO3VCQUN2QixJQUFJLFlBQVksRUFBRTs0QkFDYixJQUFJLFlBQVksRUFBRTt3QkFDdEIsSUFBSSxZQUFZLEVBQUU7MEJBS3RCLEVBQUU7UUFvRGpDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztRQUMzQyxJQUFJLENBQUMseUJBQXlCLEdBQUcseUJBQXlCLENBQUM7OzBCQTVDbEQsb0NBQU87Ozs7O1lBQ2hCLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQzs7Ozs7SUFDN0IsQ0FBQzs7Ozs7SUE2Q0ssZ0NBQU07Ozs7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QVc7Z0JBQ3hCLFVBQVUsRUFBRSxLQUFJLENBQUMsVUFBVTtnQkFDM0IsWUFBWSxFQUFFLEtBQUksQ0FBQyxTQUFTLEtBQUssTUFBTTthQUN4QyxDQUFDLENBQUM7U0FDSixDQUFDLENBQUM7Ozs7O0lBR0MsaURBQXVCOzs7O1FBQzdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztZQUM1QixNQUFNLENBQUM7U0FDUjtRQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDOzs7Ozs7SUFHeEIsd0NBQWM7Ozs7Y0FBQyxPQUFrQztRQUN2RCxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDYixNQUFNLENBQUMsSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDM0I7UUFFRCxFQUFFLENBQUMsQ0FBQyxPQUFPLFlBQVksV0FBVyxDQUFDLENBQUMsQ0FBQztZQUNuQyxxQkFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQjtpQkFDbkMsa0JBQWtCLENBQWlCLE9BQU8sQ0FBQyxDQUFDO1lBQy9DLE1BQU0sQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNyRDtRQUVELE1BQU0sQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUUsS0FBRyxPQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7MEJBL094RTtJQWlQQyxDQUFBOzs7O0FBNU5ELDJCQTROQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHRvZG86IGFkZCBkZWxheSBzdXBwb3J0XHJcbi8vIHRvZG86IG1lcmdlIGV2ZW50cyBvblNob3csIG9uU2hvd24sIGV0Yy4uLlxyXG4vLyB0b2RvOiBhZGQgZ2xvYmFsIHBvc2l0aW9uaW5nIGNvbmZpZ3VyYXRpb24/XHJcbmltcG9ydCB7XHJcbiAgTmdab25lLCBWaWV3Q29udGFpbmVyUmVmLCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIEluamVjdG9yLCBSZW5kZXJlcjIsXHJcbiAgRWxlbWVudFJlZiwgQ29tcG9uZW50UmVmLCBDb21wb25lbnRGYWN0b3J5LCBUeXBlLCBUZW1wbGF0ZVJlZiwgRXZlbnRFbWl0dGVyLFxyXG4gIFByb3ZpZGVyLCBSZWZsZWN0aXZlSW5qZWN0b3JcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udGVudFJlZiB9IGZyb20gJy4vY29udGVudC1yZWYuY2xhc3MnO1xyXG5pbXBvcnQgeyBQb3NpdGlvbmluZ1NlcnZpY2UgfSBmcm9tICcuLi9wb3NpdGlvbmluZy9wb3NpdGlvbmluZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgbGlzdGVuVG9UcmlnZ2VycyB9IGZyb20gJy4uL3V0aWxzL3RyaWdnZXJzJztcclxuaW1wb3J0IHtQb3NpdGlvbmluZ09wdGlvbnN9IGZyb20gJy4uL3Bvc2l0aW9uaW5nL3Bvc2l0aW9uaW5nLm9wdGlvbnMnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBMaXN0ZW5PcHRpb25zIHtcclxuICB0YXJnZXQ/OiBFbGVtZW50UmVmO1xyXG4gIHRyaWdnZXJzPzogc3RyaW5nO1xyXG4gIHNob3c/OiBhbnk7XHJcbiAgaGlkZT86IGFueTtcclxuICB0b2dnbGU/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRMb2FkZXI8VD4ge1xyXG4gIHB1YmxpYyBvbkJlZm9yZVNob3c6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIHB1YmxpYyBvblNob3duOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBwdWJsaWMgb25CZWZvcmVIaWRlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBwdWJsaWMgb25IaWRkZW46IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBwdWJsaWMgaW5zdGFuY2U6IFQ7XHJcbiAgcHVibGljIF9jb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxUPjtcclxuXHJcbiAgcHJpdmF0ZSBfcHJvdmlkZXJzOiBQcm92aWRlcltdID0gW107XHJcbiAgcHJpdmF0ZSBfY29tcG9uZW50RmFjdG9yeTogQ29tcG9uZW50RmFjdG9yeTxUPjtcclxuICBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmO1xyXG4gIHByaXZhdGUgX3pvbmVTdWJzY3JpcHRpb246IGFueTtcclxuICBwcml2YXRlIF9jb250ZW50UmVmOiBDb250ZW50UmVmO1xyXG4gIHByaXZhdGUgX3ZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWY7XHJcbiAgcHJpdmF0ZSBfaW5qZWN0b3I6IEluamVjdG9yO1xyXG4gIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjI7XHJcbiAgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmU7XHJcbiAgcHJpdmF0ZSBfY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI7XHJcbiAgcHJpdmF0ZSBfcG9zU2VydmljZTogUG9zaXRpb25pbmdTZXJ2aWNlO1xyXG5cclxuICBwcml2YXRlIF91bnJlZ2lzdGVyTGlzdGVuZXJzRm46IEZ1bmN0aW9uO1xyXG5cclxuICBwdWJsaWMgZ2V0IGlzU2hvd24oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLl9jb21wb25lbnRSZWY7XHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogUGxhY2VtZW50IG9mIGEgY29tcG9uZW50LiBBY2NlcHRzOiBcInRvcFwiLCBcImJvdHRvbVwiLCBcImxlZnRcIiwgXCJyaWdodFwiXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhdHRhY2htZW50OiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgc2VsZWN0b3Igc3BlY2lmeWluZyB0aGUgZWxlbWVudCB0aGUgcG9wb3ZlciBzaG91bGQgYmUgYXBwZW5kZWQgdG8uXHJcbiAgICogQ3VycmVudGx5IG9ubHkgc3VwcG9ydHMgXCJib2R5XCIuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjb250YWluZXI6IHN0cmluZyB8IEVsZW1lbnRSZWYgfCBhbnk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNwZWNpZmllcyBldmVudHMgdGhhdCBzaG91bGQgdHJpZ2dlci4gU3VwcG9ydHMgYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZlxyXG4gICAqIGV2ZW50IG5hbWVzLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgdHJpZ2dlcnM6IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogRG8gbm90IHVzZSB0aGlzIGRpcmVjdGx5LCBpdCBzaG91bGQgYmUgaW5zdGFuY2VkIHZpYVxyXG4gICAqIGBDb21wb25lbnRMb2FkRmFjdG9yeS5hdHRhY2hgXHJcbiAgICogQGludGVybmFsXHJcbiAgICogQHBhcmFtIF92aWV3Q29udGFpbmVyUmVmXHJcbiAgICogQHBhcmFtIF9lbGVtZW50UmVmXHJcbiAgICogQHBhcmFtIF9pbmplY3RvclxyXG4gICAqIEBwYXJhbSBfcmVuZGVyZXJcclxuICAgKiBAcGFyYW0gX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlclxyXG4gICAqIEBwYXJhbSBfbmdab25lXHJcbiAgICogQHBhcmFtIF9wb3NTZXJ2aWNlXHJcbiAgICovXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXHJcbiAgcHVibGljIGNvbnN0cnVjdG9yKF92aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLCBfcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgICAgICAgICAgICAgICAgICAgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXHJcbiAgICAgICAgICAgICAgICAgICAgIF9pbmplY3RvcjogSW5qZWN0b3IsIF9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICAgICAgICAgICAgICAgICAgICAgX25nWm9uZTogTmdab25lLCBfcG9zU2VydmljZTogUG9zaXRpb25pbmdTZXJ2aWNlKSB7XHJcbiAgICB0aGlzLl9uZ1pvbmUgPSBfbmdab25lO1xyXG4gICAgdGhpcy5faW5qZWN0b3IgPSBfaW5qZWN0b3I7XHJcbiAgICB0aGlzLl9yZW5kZXJlciA9IF9yZW5kZXJlcjtcclxuICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjtcclxuICAgIHRoaXMuX3Bvc1NlcnZpY2UgPSBfcG9zU2VydmljZTtcclxuICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYgPSBfdmlld0NvbnRhaW5lclJlZjtcclxuICAgIHRoaXMuX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlciA9IF9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXR0YWNoKGNvbXBUeXBlOiBUeXBlPFQ+KTogQ29tcG9uZW50TG9hZGVyPFQ+IHtcclxuICAgIHRoaXMuX2NvbXBvbmVudEZhY3RvcnkgPSB0aGlzLl9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXJcclxuICAgICAgLnJlc29sdmVDb21wb25lbnRGYWN0b3J5PFQ+KGNvbXBUeXBlKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLy8gdG9kbzogYWRkIGJlaGF2aW91cjogdG8gdGFyZ2V0IGVsZW1lbnQsIGBib2R5YCwgY3VzdG9tIGVsZW1lbnRcclxuICBwdWJsaWMgdG8oY29udGFpbmVyPzogc3RyaW5nKTogQ29tcG9uZW50TG9hZGVyPFQ+IHtcclxuICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyIHx8IHRoaXMuY29udGFpbmVyO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcG9zaXRpb24ob3B0cz86IFBvc2l0aW9uaW5nT3B0aW9ucyk6IENvbXBvbmVudExvYWRlcjxUPiB7XHJcbiAgICB0aGlzLmF0dGFjaG1lbnQgPSBvcHRzLmF0dGFjaG1lbnQgfHwgdGhpcy5hdHRhY2htZW50O1xyXG4gICAgdGhpcy5fZWxlbWVudFJlZiA9IG9wdHMudGFyZ2V0IGFzIEVsZW1lbnRSZWYgfHwgdGhpcy5fZWxlbWVudFJlZjtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHByb3ZpZGUocHJvdmlkZXI6IFByb3ZpZGVyKTogQ29tcG9uZW50TG9hZGVyPFQ+IHtcclxuICAgIHRoaXMuX3Byb3ZpZGVycy5wdXNoKHByb3ZpZGVyKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3cob3B0czoge2NvbnRlbnQ/OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+LCBba2V5OiBzdHJpbmddOiBhbnl9ID0ge30pOiBDb21wb25lbnRSZWY8VD4ge1xyXG4gICAgdGhpcy5fc3Vic2NyaWJlUG9zaXRpb25pbmcoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuX2NvbXBvbmVudFJlZikge1xyXG4gICAgICB0aGlzLm9uQmVmb3JlU2hvdy5lbWl0KCk7XHJcbiAgICAgIHRoaXMuX2NvbnRlbnRSZWYgPSB0aGlzLl9nZXRDb250ZW50UmVmKG9wdHMuY29udGVudCk7XHJcbiAgICAgIGNvbnN0IGluamVjdG9yID0gUmVmbGVjdGl2ZUluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUodGhpcy5fcHJvdmlkZXJzLCB0aGlzLl9pbmplY3Rvcik7XHJcbiAgICAgIHRoaXMuX2NvbXBvbmVudFJlZiA9IHRoaXMuX3ZpZXdDb250YWluZXJSZWZcclxuICAgICAgICAuY3JlYXRlQ29tcG9uZW50KHRoaXMuX2NvbXBvbmVudEZhY3RvcnksIDAsIGluamVjdG9yLCB0aGlzLl9jb250ZW50UmVmLm5vZGVzKTtcclxuICAgICAgdGhpcy5pbnN0YW5jZSA9IHRoaXMuX2NvbXBvbmVudFJlZi5pbnN0YW5jZTtcclxuXHJcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlLCBvcHRzKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmNvbnRhaW5lciA9PT0gJ2JvZHknICYmIHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuY29udGFpbmVyIGFzIHN0cmluZylcclxuICAgICAgICAgIC5hcHBlbmRDaGlsZCh0aGlzLl9jb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIHdlIG5lZWQgdG8gbWFudWFsbHkgaW52b2tlIGNoYW5nZSBkZXRlY3Rpb24gc2luY2UgZXZlbnRzIHJlZ2lzdGVyZWRcclxuICAgICAgLy8gdmlhXHJcbiAgICAgIC8vIFJlbmRlcmVyOjpsaXN0ZW4oKSBhcmUgbm90IHBpY2tlZCB1cCBieSBjaGFuZ2UgZGV0ZWN0aW9uIHdpdGggdGhlXHJcbiAgICAgIC8vIE9uUHVzaCBzdHJhdGVneVxyXG4gICAgICB0aGlzLl9jb21wb25lbnRSZWYuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICAgIHRoaXMub25TaG93bi5lbWl0KHRoaXMuX2NvbXBvbmVudFJlZi5pbnN0YW5jZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fY29tcG9uZW50UmVmO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGhpZGUoKTogQ29tcG9uZW50TG9hZGVyPFQ+IHtcclxuICAgIGlmICh0aGlzLl9jb21wb25lbnRSZWYpIHtcclxuICAgICAgdGhpcy5vbkJlZm9yZUhpZGUuZW1pdCh0aGlzLl9jb21wb25lbnRSZWYuaW5zdGFuY2UpO1xyXG4gICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLnJlbW92ZSh0aGlzLl92aWV3Q29udGFpbmVyUmVmLmluZGV4T2YodGhpcy5fY29tcG9uZW50UmVmLmhvc3RWaWV3KSk7XHJcbiAgICAgIHRoaXMuX2NvbXBvbmVudFJlZiA9IG51bGw7XHJcblxyXG4gICAgICBpZiAodGhpcy5fY29udGVudFJlZi52aWV3UmVmKSB7XHJcbiAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5yZW1vdmUodGhpcy5fdmlld0NvbnRhaW5lclJlZi5pbmRleE9mKHRoaXMuX2NvbnRlbnRSZWYudmlld1JlZikpO1xyXG4gICAgICAgIHRoaXMuX2NvbnRlbnRSZWYgPSBudWxsO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9jb21wb25lbnRSZWYgPSBudWxsO1xyXG4gICAgICB0aGlzLm9uSGlkZGVuLmVtaXQoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHRvZ2dsZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmlzU2hvd24pIHtcclxuICAgICAgdGhpcy5oaWRlKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNob3coKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNTaG93bikge1xyXG4gICAgICB0aGlzLmhpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl91bnN1YnNjcmliZVBvc2l0aW9uaW5nKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuX3VucmVnaXN0ZXJMaXN0ZW5lcnNGbikge1xyXG4gICAgICB0aGlzLl91bnJlZ2lzdGVyTGlzdGVuZXJzRm4oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBsaXN0ZW4obGlzdGVuT3B0czogTGlzdGVuT3B0aW9ucyk6IENvbXBvbmVudExvYWRlcjxUPiB7XHJcbiAgICB0aGlzLnRyaWdnZXJzID0gbGlzdGVuT3B0cy50cmlnZ2VycyB8fCB0aGlzLnRyaWdnZXJzO1xyXG5cclxuICAgIGxpc3Rlbk9wdHMudGFyZ2V0ID0gbGlzdGVuT3B0cy50YXJnZXQgfHwgdGhpcy5fZWxlbWVudFJlZjtcclxuICAgIGxpc3Rlbk9wdHMuc2hvdyA9IGxpc3Rlbk9wdHMuc2hvdyB8fCAoKCkgPT4gdGhpcy5zaG93KCkpO1xyXG4gICAgbGlzdGVuT3B0cy5oaWRlID0gbGlzdGVuT3B0cy5oaWRlIHx8ICgoKSA9PiB0aGlzLmhpZGUoKSk7XHJcbiAgICBsaXN0ZW5PcHRzLnRvZ2dsZSA9IGxpc3Rlbk9wdHMudG9nZ2xlIHx8ICgoKSA9PiB0aGlzLmlzU2hvd25cclxuICAgICAgICA/IGxpc3Rlbk9wdHMuaGlkZSgpXHJcbiAgICAgICAgOiBsaXN0ZW5PcHRzLnNob3coKSk7XHJcblxyXG4gICAgdGhpcy5fdW5yZWdpc3Rlckxpc3RlbmVyc0ZuID0gbGlzdGVuVG9UcmlnZ2VycyhcclxuICAgICAgdGhpcy5fcmVuZGVyZXIsXHJcbiAgICAgIGxpc3Rlbk9wdHMudGFyZ2V0Lm5hdGl2ZUVsZW1lbnQsXHJcbiAgICAgIHRoaXMudHJpZ2dlcnMsXHJcbiAgICAgIGxpc3Rlbk9wdHMuc2hvdyxcclxuICAgICAgbGlzdGVuT3B0cy5oaWRlLFxyXG4gICAgICBsaXN0ZW5PcHRzLnRvZ2dsZSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9zdWJzY3JpYmVQb3NpdGlvbmluZygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLl96b25lU3Vic2NyaXB0aW9uIHx8ICF0aGlzLmF0dGFjaG1lbnQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3pvbmVTdWJzY3JpcHRpb24gPSB0aGlzLl9uZ1pvbmVcclxuICAgICAgLm9uU3RhYmxlLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb21wb25lbnRSZWYpIHtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fcG9zU2VydmljZS5wb3NpdGlvbih7XHJcbiAgICAgICAgICBlbGVtZW50OiB0aGlzLl9jb21wb25lbnRSZWYubG9jYXRpb24sXHJcbiAgICAgICAgICB0YXJnZXQ6IHRoaXMuX2VsZW1lbnRSZWYsXHJcbiAgICAgICAgICBhdHRhY2htZW50OiB0aGlzLmF0dGFjaG1lbnQsXHJcbiAgICAgICAgICBhcHBlbmRUb0JvZHk6IHRoaXMuY29udGFpbmVyID09PSAnYm9keSdcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF91bnN1YnNjcmliZVBvc2l0aW9uaW5nKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLl96b25lU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuX3pvbmVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuX3pvbmVTdWJzY3JpcHRpb24gPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0Q29udGVudFJlZihjb250ZW50OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+KTogQ29udGVudFJlZiB7XHJcbiAgICBpZiAoIWNvbnRlbnQpIHtcclxuICAgICAgcmV0dXJuIG5ldyBDb250ZW50UmVmKFtdKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmKSB7XHJcbiAgICAgIGNvbnN0IHZpZXdSZWYgPSB0aGlzLl92aWV3Q29udGFpbmVyUmVmXHJcbiAgICAgICAgLmNyZWF0ZUVtYmVkZGVkVmlldzxUZW1wbGF0ZVJlZjxUPj4oY29udGVudCk7XHJcbiAgICAgIHJldHVybiBuZXcgQ29udGVudFJlZihbdmlld1JlZi5yb290Tm9kZXNdLCB2aWV3UmVmKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IENvbnRlbnRSZWYoW1t0aGlzLl9yZW5kZXJlci5jcmVhdGVUZXh0KCBgJHtjb250ZW50fWApXV0pO1xyXG4gIH1cclxufVxyXG4iXX0=