@miracledevs/paradigm-web-angular
Version:
An angular wrapper with base functionality and helper services.
195 lines • 16.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/*!
* Paradigm Framework - Angular Wrapper
* Copyright (c) 2017 Miracle Devs, Inc
* Licensed under MIT (https://github.com/MiracleDevs/Paradigm.Web.Shared/blob/master/LICENSE)
*/
import { Injectable, ComponentFactoryResolver, Injector } from '@angular/core';
import { ArrayList, ObjectExtensions } from '@miracledevs/paradigm-ui-web-shared';
import { ServiceBase } from './base.service';
import * as i0 from "@angular/core";
/**
* Represents a modal dialog instance.
* This class lifespan depends on the modal dialog lifespan.
* @template TParameters, TResult
*/
export class ModalInstance {
/**
* Creates an instance of \@see ModalInstance
* @param {?} type the modal component type.
*/
constructor(type) {
this.type = type;
}
/**
* Gets the component ref associated to the modal dialog.
* @return {?}
*/
get componentRef() { return this.innerComponentRef; }
/**
* Sets the component ref reference.
* @param {?} componentRef the component ref object.
* @return {?}
*/
setComponentRef(componentRef) {
this.innerComponentRef = componentRef;
}
}
if (false) {
/**
* A reference to the component ref object.
* @type {?}
* @private
*/
ModalInstance.prototype.innerComponentRef;
/**
* The type of the modal component.
* @type {?}
*/
ModalInstance.prototype.type;
/**
* Resolves and finish successfully the modal dialog.
* @type {?}
*/
ModalInstance.prototype.resolve;
/**
* Rejects and finish unsuccessfully the modal dialog.
* @type {?}
*/
ModalInstance.prototype.reject;
}
export class ModalService extends ServiceBase {
/**
* Creates a new instance of \@see ModalService
* @param {?} resolver a reference to the component factory resolver,
* @param {?} injector a reference to the DI injector container
*/
constructor(resolver, injector) {
super();
this.resolver = resolver;
this.injector = injector;
this.modalInstances = new ArrayList();
}
/**
* Sets the view container ref that will hold and contain
* the modal components.
* @param {?} container the view container ref.
* @return {?}
*/
setViewContainer(container) {
if (ObjectExtensions.isNull(container)) {
throw new Error('The container can not be null or undefined.');
}
this.viewContainer = container;
}
/**
* Gets the stack of modal instances.
* @return {?}
*/
getModalInstances() {
return this.modalInstances;
}
/**
* Opens a modal dialog component.
* @template TParameters, TResult
* @param {?} type The modal component type.
* @param {?=} parameters the creation parameters to pass to the modal component.
* @return {?}
*/
open(type, parameters) {
// create modal instance.
/** @type {?} */
const modalInstance = new ModalInstance(type);
this.modalInstances.add(modalInstance);
// setup the modal promise.
/** @type {?} */
const promise = new Promise((/**
* @param {?} resolve
* @param {?} reject
* @return {?}
*/
(resolve, reject) => {
modalInstance.resolve = (/**
* @param {?=} result
* @return {?}
*/
(result) => {
resolve(result);
this.remove(modalInstance);
});
modalInstance.reject = (/**
* @param {?=} reason
* @return {?}
*/
(reason) => {
reject(reason);
this.remove(modalInstance);
});
}));
// create the component.
/** @type {?} */
const factory = this.resolver.resolveComponentFactory(type);
/** @type {?} */
const componentRef = factory.create(this.injector);
// initialize the modal and component.
modalInstance.setComponentRef(componentRef);
componentRef.instance.setModalService(this);
componentRef.instance.setModalInstance(modalInstance);
componentRef.instance.setParameters(parameters);
// insert view on screen.
this.viewContainer.insert(componentRef.hostView);
// return the promise.
return promise;
}
/**
* Removes the modal from the stack of modal instances.
* @private
* @template TParameters, TResult
* @param {?} modalInstance the modal that will be removed.
* @return {?}
*/
remove(modalInstance) {
this.modalInstances.remove(modalInstance);
this.viewContainer.remove(this.viewContainer.indexOf(modalInstance.componentRef.hostView));
}
}
ModalService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
ModalService.ctorParameters = () => [
{ type: ComponentFactoryResolver },
{ type: Injector }
];
/** @nocollapse */ ModalService.ngInjectableDef = i0.defineInjectable({ factory: function ModalService_Factory() { return new ModalService(i0.inject(i0.ComponentFactoryResolver), i0.inject(i0.INJECTOR)); }, token: ModalService, providedIn: "root" });
if (false) {
/**
* A stack of modal instances.
* @type {?}
* @private
*/
ModalService.prototype.modalInstances;
/**
* A reference to the view container ref that will hold
* and contain the modal components.
* @type {?}
* @private
*/
ModalService.prototype.viewContainer;
/**
* @type {?}
* @private
*/
ModalService.prototype.resolver;
/**
* @type {?}
* @private
*/
ModalService.prototype.injector;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BtaXJhY2xlZGV2cy9wYXJhZGlnbS13ZWItYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlcy9tb2RhbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQU1BLE9BQU8sRUFBRSxVQUFVLEVBQUUsd0JBQXdCLEVBQUUsUUFBUSxFQUF3QyxNQUFNLGVBQWUsQ0FBQztBQUVySCxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDbEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBVTdDLE1BQU0sT0FBTyxhQUFhOzs7OztJQStCdEIsWUFBWSxJQUFvRDtRQUU1RCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDOzs7OztJQVRELElBQUksWUFBWSxLQUE2RCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7Ozs7OztJQWU3RyxlQUFlLENBQUMsWUFBb0U7UUFFaEYsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFlBQVksQ0FBQztJQUMxQyxDQUFDO0NBQ0o7Ozs7Ozs7SUF2Q0csMENBQWtGOzs7OztJQUtsRiw2QkFBOEQ7Ozs7O0lBSzlELGdDQUErQjs7Ozs7SUFLL0IsK0JBQW9COztBQTZCeEIsTUFBTSxPQUFPLFlBQWEsU0FBUSxXQUFXOzs7Ozs7SUFrQnpDLFlBQ1ksUUFBa0MsRUFDbEMsUUFBa0I7UUFFMUIsS0FBSyxFQUFFLENBQUM7UUFIQSxhQUFRLEdBQVIsUUFBUSxDQUEwQjtRQUNsQyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBRzFCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztJQUMxQyxDQUFDOzs7Ozs7O0lBT0QsZ0JBQWdCLENBQUMsU0FBMkI7UUFFeEMsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQ3RDO1lBQ0ksTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1NBQ2xFO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7SUFDbkMsQ0FBQzs7Ozs7SUFLRCxpQkFBaUI7UUFFYixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDL0IsQ0FBQzs7Ozs7Ozs7SUFPRCxJQUFJLENBQXVCLElBQW9ELEVBQUUsVUFBd0I7OztjQUcvRixhQUFhLEdBQUcsSUFBSSxhQUFhLENBQXVCLElBQUksQ0FBQztRQUNuRSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQzs7O2NBR2pDLE9BQU8sR0FBRyxJQUFJLE9BQU87Ozs7O1FBQVUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFFckQsYUFBYSxDQUFDLE9BQU87Ozs7WUFBRyxDQUFDLE1BQWdCLEVBQUUsRUFBRTtnQkFFekMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQy9CLENBQUMsQ0FBQSxDQUFDO1lBQ0YsYUFBYSxDQUFDLE1BQU07Ozs7WUFBRyxDQUFDLE1BQWUsRUFBRSxFQUFFO2dCQUV2QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMvQixDQUFDLENBQUEsQ0FBQztRQUNOLENBQUMsRUFBQzs7O2NBR0ksT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDOztjQUNyRCxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBRWxELHNDQUFzQztRQUN0QyxhQUFhLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzVDLFlBQVksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLFlBQVksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEQsWUFBWSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFaEQseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVqRCxzQkFBc0I7UUFDdEIsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQzs7Ozs7Ozs7SUFNTyxNQUFNLENBQXVCLGFBQWtEO1FBRW5GLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUMvRixDQUFDOzs7WUF2R0osVUFBVSxTQUFDO2dCQUNSLFVBQVUsRUFBRSxNQUFNO2FBQ3JCOzs7O1lBN0RvQix3QkFBd0I7WUFBRSxRQUFROzs7Ozs7Ozs7SUFtRW5ELHNDQUEyRDs7Ozs7OztJQU0zRCxxQ0FBd0M7Ozs7O0lBUXBDLGdDQUEwQzs7Ozs7SUFDMUMsZ0NBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiLyohXG4gKiBQYXJhZGlnbSBGcmFtZXdvcmsgLSBBbmd1bGFyIFdyYXBwZXJcbiAqIENvcHlyaWdodCAoYykgMjAxNyBNaXJhY2xlIERldnMsIEluY1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vTWlyYWNsZURldnMvUGFyYWRpZ20uV2ViLlNoYXJlZC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUsIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgSW5qZWN0b3IsIFR5cGUsIENvbXBvbmVudFJlZiwgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kYWxDb21wb25lbnRCYXNlIH0gZnJvbSAnLi4vY29tcG9uZW50cy9tb2RhbC1iYXNlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBcnJheUxpc3QsIE9iamVjdEV4dGVuc2lvbnMgfSBmcm9tICdAbWlyYWNsZWRldnMvcGFyYWRpZ20tdWktd2ViLXNoYXJlZCc7XG5pbXBvcnQgeyBTZXJ2aWNlQmFzZSB9IGZyb20gJy4vYmFzZS5zZXJ2aWNlJztcblxuZXhwb3J0IHR5cGUgTW9kYWxSZXNvbHZlPFRSZXN1bHQ+ID0gKHJlc3VsdDogVFJlc3VsdCkgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgTW9kYWxSZWplY3QgPSAocmVhc29uOiBzdHJpbmcpID0+IHZvaWQ7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIG1vZGFsIGRpYWxvZyBpbnN0YW5jZS5cbiAqIFRoaXMgY2xhc3MgbGlmZXNwYW4gZGVwZW5kcyBvbiB0aGUgbW9kYWwgZGlhbG9nIGxpZmVzcGFuLlxuICovXG5leHBvcnQgY2xhc3MgTW9kYWxJbnN0YW5jZTxUUGFyYW1ldGVycywgVFJlc3VsdD5cbntcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgY29tcG9uZW50IHJlZiBvYmplY3QuXG4gICAgICovXG4gICAgcHJpdmF0ZSBpbm5lckNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPE1vZGFsQ29tcG9uZW50QmFzZTxUUGFyYW1ldGVycywgVFJlc3VsdD4+O1xuXG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIG1vZGFsIGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICByZWFkb25seSB0eXBlOiBUeXBlPE1vZGFsQ29tcG9uZW50QmFzZTxUUGFyYW1ldGVycywgVFJlc3VsdD4+O1xuXG4gICAgLyoqXG4gICAgICogUmVzb2x2ZXMgYW5kIGZpbmlzaCBzdWNjZXNzZnVsbHkgdGhlIG1vZGFsIGRpYWxvZy5cbiAgICAgKi9cbiAgICByZXNvbHZlOiBNb2RhbFJlc29sdmU8VFJlc3VsdD47XG5cbiAgICAvKipcbiAgICAgKiBSZWplY3RzIGFuZCBmaW5pc2ggdW5zdWNjZXNzZnVsbHkgdGhlIG1vZGFsIGRpYWxvZy5cbiAgICAgKi9cbiAgICByZWplY3Q6IE1vZGFsUmVqZWN0O1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29tcG9uZW50IHJlZiBhc3NvY2lhdGVkIHRvIHRoZSBtb2RhbCBkaWFsb2cuXG4gICAgICovXG4gICAgZ2V0IGNvbXBvbmVudFJlZigpOiBDb21wb25lbnRSZWY8TW9kYWxDb21wb25lbnRCYXNlPFRQYXJhbWV0ZXJzLCBUUmVzdWx0Pj4geyByZXR1cm4gdGhpcy5pbm5lckNvbXBvbmVudFJlZjsgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBAc2VlIE1vZGFsSW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gdHlwZSB0aGUgbW9kYWwgY29tcG9uZW50IHR5cGUuXG4gICAgICovXG4gICAgY29uc3RydWN0b3IodHlwZTogVHlwZTxNb2RhbENvbXBvbmVudEJhc2U8VFBhcmFtZXRlcnMsIFRSZXN1bHQ+PilcbiAgICB7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY29tcG9uZW50IHJlZiByZWZlcmVuY2UuXG4gICAgICogQHBhcmFtIGNvbXBvbmVudFJlZiB0aGUgY29tcG9uZW50IHJlZiBvYmplY3QuXG4gICAgICovXG4gICAgc2V0Q29tcG9uZW50UmVmKGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPE1vZGFsQ29tcG9uZW50QmFzZTxUUGFyYW1ldGVycywgVFJlc3VsdD4+KTogdm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5pbm5lckNvbXBvbmVudFJlZiA9IGNvbXBvbmVudFJlZjtcbiAgICB9XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgTW9kYWxTZXJ2aWNlIGV4dGVuZHMgU2VydmljZUJhc2VcbntcbiAgICAvKipcbiAgICAgKiBBIHN0YWNrIG9mIG1vZGFsIGluc3RhbmNlcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIG1vZGFsSW5zdGFuY2VzOiBBcnJheUxpc3Q8TW9kYWxJbnN0YW5jZTxhbnksIGFueT4+O1xuXG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgdG8gdGhlIHZpZXcgY29udGFpbmVyIHJlZiB0aGF0IHdpbGwgaG9sZFxuICAgICAqIGFuZCBjb250YWluIHRoZSBtb2RhbCBjb21wb25lbnRzLlxuICAgICAqL1xuICAgIHByaXZhdGUgdmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZjtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgQHNlZSBNb2RhbFNlcnZpY2VcbiAgICAgKiBAcGFyYW0gcmVzb2x2ZXIgYSByZWZlcmVuY2UgdG8gdGhlIGNvbXBvbmVudCBmYWN0b3J5IHJlc29sdmVyLFxuICAgICAqIEBwYXJhbSBpbmplY3RvciBhIHJlZmVyZW5jZSB0byB0aGUgREkgaW5qZWN0b3IgY29udGFpbmVyXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IpXG4gICAge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLm1vZGFsSW5zdGFuY2VzID0gbmV3IEFycmF5TGlzdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHZpZXcgY29udGFpbmVyIHJlZiB0aGF0IHdpbGwgaG9sZCBhbmQgY29udGFpblxuICAgICAqIHRoZSBtb2RhbCBjb21wb25lbnRzLlxuICAgICAqIEBwYXJhbSBjb250YWluZXIgdGhlIHZpZXcgY29udGFpbmVyIHJlZi5cbiAgICAgKi9cbiAgICBzZXRWaWV3Q29udGFpbmVyKGNvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZik6IHZvaWRcbiAgICB7XG4gICAgICAgIGlmIChPYmplY3RFeHRlbnNpb25zLmlzTnVsbChjb250YWluZXIpKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBjb250YWluZXIgY2FuIG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmlld0NvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBzdGFjayBvZiBtb2RhbCBpbnN0YW5jZXMuXG4gICAgICovXG4gICAgZ2V0TW9kYWxJbnN0YW5jZXMoKTogQXJyYXlMaXN0PE1vZGFsSW5zdGFuY2U8YW55LCBhbnk+PlxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kYWxJbnN0YW5jZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgYSBtb2RhbCBkaWFsb2cgY29tcG9uZW50LlxuICAgICAqIEBwYXJhbSB0eXBlIFRoZSBtb2RhbCBjb21wb25lbnQgdHlwZS5cbiAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyB0aGUgY3JlYXRpb24gcGFyYW1ldGVycyB0byBwYXNzIHRvIHRoZSBtb2RhbCBjb21wb25lbnQuXG4gICAgICovXG4gICAgb3BlbjxUUGFyYW1ldGVycywgVFJlc3VsdD4odHlwZTogVHlwZTxNb2RhbENvbXBvbmVudEJhc2U8VFBhcmFtZXRlcnMsIFRSZXN1bHQ+PiwgcGFyYW1ldGVycz86IFRQYXJhbWV0ZXJzKTogUHJvbWlzZTxUUmVzdWx0PlxuICAgIHtcbiAgICAgICAgLy8gY3JlYXRlIG1vZGFsIGluc3RhbmNlLlxuICAgICAgICBjb25zdCBtb2RhbEluc3RhbmNlID0gbmV3IE1vZGFsSW5zdGFuY2U8VFBhcmFtZXRlcnMsIFRSZXN1bHQ+KHR5cGUpO1xuICAgICAgICB0aGlzLm1vZGFsSW5zdGFuY2VzLmFkZChtb2RhbEluc3RhbmNlKTtcblxuICAgICAgICAvLyBzZXR1cCB0aGUgbW9kYWwgcHJvbWlzZS5cbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPFRSZXN1bHQ+KChyZXNvbHZlLCByZWplY3QpID0+XG4gICAgICAgIHtcbiAgICAgICAgICAgIG1vZGFsSW5zdGFuY2UucmVzb2x2ZSA9IChyZXN1bHQ/OiBUUmVzdWx0KSA9PlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZShtb2RhbEluc3RhbmNlKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBtb2RhbEluc3RhbmNlLnJlamVjdCA9IChyZWFzb24/OiBzdHJpbmcpID0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUobW9kYWxJbnN0YW5jZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBjcmVhdGUgdGhlIGNvbXBvbmVudC5cbiAgICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMucmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkodHlwZSk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IGZhY3RvcnkuY3JlYXRlKHRoaXMuaW5qZWN0b3IpO1xuXG4gICAgICAgIC8vIGluaXRpYWxpemUgdGhlIG1vZGFsIGFuZCBjb21wb25lbnQuXG4gICAgICAgIG1vZGFsSW5zdGFuY2Uuc2V0Q29tcG9uZW50UmVmKGNvbXBvbmVudFJlZik7XG4gICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5zZXRNb2RhbFNlcnZpY2UodGhpcyk7XG4gICAgICAgIGNvbXBvbmVudFJlZi5pbnN0YW5jZS5zZXRNb2RhbEluc3RhbmNlKG1vZGFsSW5zdGFuY2UpO1xuICAgICAgICBjb21wb25lbnRSZWYuaW5zdGFuY2Uuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKTtcblxuICAgICAgICAvLyBpbnNlcnQgdmlldyBvbiBzY3JlZW4uXG4gICAgICAgIHRoaXMudmlld0NvbnRhaW5lci5pbnNlcnQoY29tcG9uZW50UmVmLmhvc3RWaWV3KTtcblxuICAgICAgICAvLyByZXR1cm4gdGhlIHByb21pc2UuXG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgdGhlIG1vZGFsIGZyb20gdGhlIHN0YWNrIG9mIG1vZGFsIGluc3RhbmNlcy5cbiAgICAgKiBAcGFyYW0gbW9kYWxJbnN0YW5jZSB0aGUgbW9kYWwgdGhhdCB3aWxsIGJlIHJlbW92ZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZW1vdmU8VFBhcmFtZXRlcnMsIFRSZXN1bHQ+KG1vZGFsSW5zdGFuY2U6IE1vZGFsSW5zdGFuY2U8VFBhcmFtZXRlcnMsIFRSZXN1bHQ+KTogdm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5tb2RhbEluc3RhbmNlcy5yZW1vdmUobW9kYWxJbnN0YW5jZSk7XG4gICAgICAgIHRoaXMudmlld0NvbnRhaW5lci5yZW1vdmUodGhpcy52aWV3Q29udGFpbmVyLmluZGV4T2YobW9kYWxJbnN0YW5jZS5jb21wb25lbnRSZWYuaG9zdFZpZXcpKTtcbiAgICB9XG59XG4iXX0=