fundamental-ngx
Version:
SAP Fundamentals, implemented in Angular
232 lines • 24.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ComponentFactoryResolver, Injectable, ApplicationRef, Injector } from '@angular/core';
import { ModalComponent } from '../modal.component';
import { ModalBackdrop } from '../modal-utils/modal-backdrop';
import { ModalContainer } from '../modal-utils/modal-container';
import { ModalConfig } from '../modal-utils/modal-config';
import { ModalRef } from '../modal-utils/modal-ref';
import { ModalInjector } from '../modal-utils/modal-injector';
/**
* Service used to dynamically generate a modal.
*/
export class ModalService {
/**
* @hidden
* @param {?} componentFactoryResolver
* @param {?} appRef
* @param {?} injector
*/
constructor(componentFactoryResolver, appRef, injector) {
this.componentFactoryResolver = componentFactoryResolver;
this.appRef = appRef;
this.injector = injector;
this.modals = [];
}
/**
* Status of the modal service.
* Returns true if there are open modals, false otherwise.
* @return {?}
*/
hasOpenModals() {
return this.modals && this.modals.length > 0;
}
/**
* Dismisses all currently open modals.
* @return {?}
*/
dismissAll() {
this.modals.forEach((/**
* @param {?} item
* @return {?}
*/
item => {
this.destroyModalComponent(item.modalRef);
}));
}
/**
* Opens a modal component with a content of type TemplateRef or a component type.
* @param {?} contentType Content of the modal component.
* @param {?=} modalConfig Configuration of the modal component.
* @return {?}
*/
open(contentType, modalConfig = new ModalConfig()) {
// Get default values from model
modalConfig = Object.assign(new ModalConfig(), modalConfig);
// Setup injectable data
/** @type {?} */
const configMap = new WeakMap();
/** @type {?} */
const modalRef = new ModalRef();
modalRef.data = (modalConfig ? modalConfig.data : undefined);
configMap.set(ModalRef, modalRef);
// Prepare container
/** @type {?} */
const containerFactory = this.componentFactoryResolver.resolveComponentFactory(ModalContainer);
/** @type {?} */
const containerRef = containerFactory.create(this.injector);
this.appRef.attachView(containerRef.hostView);
// Prepare modal
/** @type {?} */
const componentFactory = this.componentFactoryResolver.resolveComponentFactory(ModalComponent);
/** @type {?} */
const componentRef = componentFactory.create(new ModalInjector(this.injector, configMap));
this.appRef.attachView(componentRef.hostView);
// Prepare backdrop
/** @type {?} */
let backdropRef;
if (modalConfig.hasBackdrop) {
/** @type {?} */
const backdropFactory = this.componentFactoryResolver.resolveComponentFactory(ModalBackdrop);
backdropRef = backdropFactory.create(new ModalInjector(this.injector, configMap));
this.appRef.attachView(backdropRef.hostView);
}
// Subscribe to close of modalRef
/** @type {?} */
const refSub = modalRef.afterClosed.subscribe((/**
* @return {?}
*/
() => {
this.destroyModalComponent(componentRef);
refSub.unsubscribe();
}), (/**
* @return {?}
*/
() => {
this.destroyModalComponent(componentRef);
refSub.unsubscribe();
}));
// Assign component attributes
/** @type {?} */
const configObj = Object.assign({}, modalConfig);
Object.keys(configObj).forEach((/**
* @param {?} key
* @return {?}
*/
key => {
if (key !== 'data') {
componentRef.instance[key] = configObj[key];
if (modalConfig.hasBackdrop) {
backdropRef.instance[key] = configObj[key];
}
}
}));
componentRef.instance.childComponentType = contentType;
// Sizing
this.setModalSize(componentRef, configObj);
// Positioning
this.setModalPosition(componentRef, configObj.position);
// Render container
/** @type {?} */
const containerEl = (/** @type {?} */ (((/** @type {?} */ (containerRef.hostView))).rootNodes[0]));
if (modalConfig.container !== 'body') {
modalConfig.container.appendChild(containerEl);
}
else {
document.body.appendChild(containerEl);
}
// Render backdrop
if (modalConfig.hasBackdrop) {
/** @type {?} */
const domBackdrop = (/** @type {?} */ (((/** @type {?} */ (backdropRef.hostView))).rootNodes[0]));
containerRef.location.nativeElement.appendChild(domBackdrop);
}
// Render modal
/** @type {?} */
const domElement = (/** @type {?} */ (((/** @type {?} */ (componentRef.hostView))).rootNodes[0]));
containerRef.location.nativeElement.appendChild(domElement);
this.modals.push({ modalRef: componentRef, backdropRef: backdropRef, containerRef: containerRef });
return modalRef;
}
/**
* @private
* @param {?} modal
* @return {?}
*/
destroyModalComponent(modal) {
/** @type {?} */
const arrayRef = this.modals.find((/**
* @param {?} item
* @return {?}
*/
(item) => item.modalRef === modal));
/** @type {?} */
const indexOf = this.modals.indexOf(arrayRef);
this.appRef.detachView(arrayRef.modalRef.hostView);
this.appRef.detachView(arrayRef.containerRef.hostView);
arrayRef.containerRef.destroy();
arrayRef.modalRef.destroy();
if (arrayRef.backdropRef) {
this.appRef.detachView(arrayRef.backdropRef.hostView);
arrayRef.backdropRef.destroy();
}
this.modals[indexOf] = null;
this.modals = this.modals.filter((/**
* @param {?} item
* @return {?}
*/
item => item !== null && item !== undefined));
}
/**
* @private
* @param {?} componentRef
* @param {?} configObj
* @return {?}
*/
setModalSize(componentRef, configObj) {
componentRef.location.nativeElement.style.minWidth = configObj.minWidth;
componentRef.location.nativeElement.style.minHeight = configObj.minHeight;
componentRef.location.nativeElement.style.maxWidth = configObj.maxWidth;
componentRef.location.nativeElement.style.maxHeight = configObj.maxHeight;
componentRef.location.nativeElement.style.width = configObj.width;
componentRef.location.nativeElement.style.height = configObj.height;
}
/**
* @private
* @param {?} componentRef
* @param {?} position
* @return {?}
*/
setModalPosition(componentRef, position) {
if (position) {
componentRef.location.nativeElement.style.top = position.top;
componentRef.location.nativeElement.style.bottom = position.bottom;
componentRef.location.nativeElement.style.right = position.right;
componentRef.location.nativeElement.style.left = position.left;
}
}
}
ModalService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
ModalService.ctorParameters = () => [
{ type: ComponentFactoryResolver },
{ type: ApplicationRef },
{ type: Injector }
];
if (false) {
/**
* @type {?}
* @private
*/
ModalService.prototype.modals;
/**
* @type {?}
* @private
*/
ModalService.prototype.componentFactoryResolver;
/**
* @type {?}
* @private
*/
ModalService.prototype.appRef;
/**
* @type {?}
* @private
*/
ModalService.prototype.injector;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2Z1bmRhbWVudGFsLW5neC8iLCJzb3VyY2VzIjpbImxpYi9tb2RhbC9tb2RhbC1zZXJ2aWNlL21vZGFsLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDSCx3QkFBd0IsRUFDeEIsVUFBVSxFQUNWLGNBQWMsRUFDZCxRQUFRLEVBS1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7Ozs7QUFPOUQsTUFBTSxPQUFPLFlBQVk7Ozs7Ozs7SUFRckIsWUFBb0Isd0JBQWtELEVBQ2xELE1BQXNCLEVBQ3RCLFFBQWtCO1FBRmxCLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFDbEQsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFDdEIsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQVQ5QixXQUFNLEdBSVIsRUFBRSxDQUFDO0lBS2dDLENBQUM7Ozs7OztJQU1uQyxhQUFhO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDakQsQ0FBQzs7Ozs7SUFLTSxVQUFVO1FBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPOzs7O1FBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdkIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FB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QUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDO1FBQzFFLFlBQVksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQztRQUNsRSxZQUFZLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFDeEUsQ0FBQzs7Ozs7OztJQUVPLGdCQUFnQixDQUFDLFlBQTBDLEVBQUUsUUFBdUI7UUFDeEYsSUFBSSxRQUFRLEVBQUU7WUFDVixZQUFZLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUM7WUFDN0QsWUFBWSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ25FLFlBQVksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNqRSxZQUFZLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7U0FDbEU7SUFDTCxDQUFDOzs7WUFuSkosVUFBVTs7OztZQXBCUCx3QkFBd0I7WUFFeEIsY0FBYztZQUNkLFFBQVE7Ozs7Ozs7SUFtQlIsOEJBSVM7Ozs7O0lBR0csZ0RBQTBEOzs7OztJQUMxRCw4QkFBOEI7Ozs7O0lBQzlCLGdDQUEwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIEluamVjdGFibGUsXG4gICAgQXBwbGljYXRpb25SZWYsXG4gICAgSW5qZWN0b3IsXG4gICAgRW1iZWRkZWRWaWV3UmVmLFxuICAgIENvbXBvbmVudFJlZixcbiAgICBUeXBlLFxuICAgIFRlbXBsYXRlUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTW9kYWxDb21wb25lbnQgfSBmcm9tICcuLi9tb2RhbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgTW9kYWxCYWNrZHJvcCB9IGZyb20gJy4uL21vZGFsLXV0aWxzL21vZGFsLWJhY2tkcm9wJztcbmltcG9ydCB7IE1vZGFsQ29udGFpbmVyIH0gZnJvbSAnLi4vbW9kYWwtdXRpbHMvbW9kYWwtY29udGFpbmVyJztcbmltcG9ydCB7IE1vZGFsQ29uZmlnIH0gZnJvbSAnLi4vbW9kYWwtdXRpbHMvbW9kYWwtY29uZmlnJztcbmltcG9ydCB7IE1vZGFsUmVmIH0gZnJvbSAnLi4vbW9kYWwtdXRpbHMvbW9kYWwtcmVmJztcbmltcG9ydCB7IE1vZGFsSW5qZWN0b3IgfSBmcm9tICcuLi9tb2RhbC11dGlscy9tb2RhbC1pbmplY3Rvcic7XG5pbXBvcnQgeyBNb2RhbFBvc2l0aW9uIH0gZnJvbSAnLi4vbW9kYWwtdXRpbHMvbW9kYWwtcG9zaXRpb24nO1xuXG4vKipcbiAqIFNlcnZpY2UgdXNlZCB0byBkeW5hbWljYWxseSBnZW5lcmF0ZSBhIG1vZGFsLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTW9kYWxTZXJ2aWNlIHtcbiAgICBwcml2YXRlIG1vZGFsczoge1xuICAgICAgICBtb2RhbFJlZjogQ29tcG9uZW50UmVmPE1vZGFsQ29tcG9uZW50PixcbiAgICAgICAgYmFja2Ryb3BSZWY/OiBDb21wb25lbnRSZWY8TW9kYWxCYWNrZHJvcD4sXG4gICAgICAgIGNvbnRhaW5lclJlZj86IENvbXBvbmVudFJlZjxNb2RhbENvbnRhaW5lcj5cbiAgICB9W10gPSBbXTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcbiAgICAgICAgICAgICAgICBwcml2YXRlIGFwcFJlZjogQXBwbGljYXRpb25SZWYsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IpIHt9XG5cbiAgICAvKipcbiAgICAgKiBTdGF0dXMgb2YgdGhlIG1vZGFsIHNlcnZpY2UuXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvcGVuIG1vZGFscywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBoYXNPcGVuTW9kYWxzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RhbHMgJiYgdGhpcy5tb2RhbHMubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNtaXNzZXMgYWxsIGN1cnJlbnRseSBvcGVuIG1vZGFscy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzbWlzc0FsbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tb2RhbHMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveU1vZGFsQ29tcG9uZW50KGl0ZW0ubW9kYWxSZWYpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVucyBhIG1vZGFsIGNvbXBvbmVudCB3aXRoIGEgY29udGVudCBvZiB0eXBlIFRlbXBsYXRlUmVmIG9yIGEgY29tcG9uZW50IHR5cGUuXG4gICAgICogQHBhcmFtIGNvbnRlbnRUeXBlIENvbnRlbnQgb2YgdGhlIG1vZGFsIGNvbXBvbmVudC5cbiAgICAgKiBAcGFyYW0gbW9kYWxDb25maWcgQ29uZmlndXJhdGlvbiBvZiB0aGUgbW9kYWwgY29tcG9uZW50LlxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuKGNvbnRlbnRUeXBlOiBUeXBlPGFueT4gfCBUZW1wbGF0ZVJlZjxhbnk+LCBtb2RhbENvbmZpZzogTW9kYWxDb25maWcgPSBuZXcgTW9kYWxDb25maWcoKSk6IE1vZGFsUmVmIHtcblxuICAgICAgICAvLyBHZXQgZGVmYXVsdCB2YWx1ZXMgZnJvbSBtb2RlbFxuICAgICAgICBtb2RhbENvbmZpZyA9IE9iamVjdC5hc3NpZ24obmV3IE1vZGFsQ29uZmlnKCksIG1vZGFsQ29uZmlnKTtcblxuICAgICAgICAvLyBTZXR1cCBpbmplY3RhYmxlIGRhdGFcbiAgICAgICAgY29uc3QgY29uZmlnTWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgICAgICAgY29uc3QgbW9kYWxSZWYgPSBuZXcgTW9kYWxSZWYoKTtcbiAgICAgICAgbW9kYWxSZWYuZGF0YSA9IChtb2RhbENvbmZpZyA/IG1vZGFsQ29uZmlnLmRhdGEgOiB1bmRlZmluZWQpO1xuICAgICAgICBjb25maWdNYXAuc2V0KE1vZGFsUmVmLCBtb2RhbFJlZik7XG5cbiAgICAgICAgLy8gUHJlcGFyZSBjb250YWluZXJcbiAgICAgICAgY29uc3QgY29udGFpbmVyRmFjdG9yeSA9IHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KE1vZGFsQ29udGFpbmVyKTtcbiAgICAgICAgY29uc3QgY29udGFpbmVyUmVmID0gY29udGFpbmVyRmFjdG9yeS5jcmVhdGUodGhpcy5pbmplY3Rvcik7XG4gICAgICAgIHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcoY29udGFpbmVyUmVmLmhvc3RWaWV3KTtcblxuICAgICAgICAvLyBQcmVwYXJlIG1vZGFsXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShNb2RhbENvbXBvbmVudCk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IGNvbXBvbmVudEZhY3RvcnkuY3JlYXRlKG5ldyBNb2RhbEluamVjdG9yKHRoaXMuaW5qZWN0b3IsIGNvbmZpZ01hcCkpO1xuICAgICAgICB0aGlzLmFwcFJlZi5hdHRhY2hWaWV3KGNvbXBvbmVudFJlZi5ob3N0Vmlldyk7XG5cbiAgICAgICAgLy8gUHJlcGFyZSBiYWNrZHJvcFxuICAgICAgICBsZXQgYmFja2Ryb3BSZWY7XG4gICAgICAgIGlmIChtb2RhbENvbmZpZy5oYXNCYWNrZHJvcCkge1xuICAgICAgICAgICAgY29uc3QgYmFja2Ryb3BGYWN0b3J5ID0gdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoTW9kYWxCYWNrZHJvcCk7XG4gICAgICAgICAgICBiYWNrZHJvcFJlZiA9IGJhY2tkcm9wRmFjdG9yeS5jcmVhdGUobmV3IE1vZGFsSW5qZWN0b3IodGhpcy5pbmplY3RvciwgY29uZmlnTWFwKSk7XG4gICAgICAgICAgICB0aGlzLmFwcFJlZi5hdHRhY2hWaWV3KGJhY2tkcm9wUmVmLmhvc3RWaWV3KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN1YnNjcmliZSB0byBjbG9zZSBvZiBtb2RhbFJlZlxuICAgICAgICBjb25zdCByZWZTdWIgPSBtb2RhbFJlZi5hZnRlckNsb3NlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95TW9kYWxDb21wb25lbnQoY29tcG9uZW50UmVmKTtcbiAgICAgICAgICAgIHJlZlN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lNb2RhbENvbXBvbmVudChjb21wb25lbnRSZWYpO1xuICAgICAgICAgICAgcmVmU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFzc2lnbiBjb21wb25lbnQgYXR0cmlidXRlc1xuICAgICAgICBjb25zdCBjb25maWdPYmogPSBPYmplY3QuYXNzaWduKHt9LCBtb2RhbENvbmZpZyk7XG4gICAgICAgIE9iamVjdC5rZXlzKGNvbmZpZ09iaikuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgaWYgKGtleSAhPT0gJ2RhdGEnKSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlW2tleV0gPSBjb25maWdPYmpba2V5XTtcblxuICAgICAgICAgICAgICAgIGlmIChtb2RhbENvbmZpZy5oYXNCYWNrZHJvcCkge1xuICAgICAgICAgICAgICAgICAgICBiYWNrZHJvcFJlZi5pbnN0YW5jZVtrZXldID0gY29uZmlnT2JqW2tleV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29tcG9uZW50UmVmLmluc3RhbmNlLmNoaWxkQ29tcG9uZW50VHlwZSA9IGNvbnRlbnRUeXBlO1xuXG4gICAgICAgIC8vIFNpemluZ1xuICAgICAgICB0aGlzLnNldE1vZGFsU2l6ZShjb21wb25lbnRSZWYsIGNvbmZpZ09iaik7XG5cbiAgICAgICAgLy8gUG9zaXRpb25pbmdcbiAgICAgICAgdGhpcy5zZXRNb2RhbFBvc2l0aW9uKGNvbXBvbmVudFJlZiwgY29uZmlnT2JqLnBvc2l0aW9uKTtcblxuICAgICAgICAvLyBSZW5kZXIgY29udGFpbmVyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckVsID0gKGNvbnRhaW5lclJlZi5ob3N0VmlldyBhcyBFbWJlZGRlZFZpZXdSZWY8YW55Pikucm9vdE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAobW9kYWxDb25maWcuY29udGFpbmVyICE9PSAnYm9keScpIHtcbiAgICAgICAgICAgIG1vZGFsQ29uZmlnLmNvbnRhaW5lci5hcHBlbmRDaGlsZChjb250YWluZXJFbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNvbnRhaW5lckVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbmRlciBiYWNrZHJvcFxuICAgICAgICBpZiAobW9kYWxDb25maWcuaGFzQmFja2Ryb3ApIHtcbiAgICAgICAgICAgIGNvbnN0IGRvbUJhY2tkcm9wID0gKGJhY2tkcm9wUmVmLmhvc3RWaWV3IGFzIEVtYmVkZGVkVmlld1JlZjxhbnk+KS5yb290Tm9kZXNbMF0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBjb250YWluZXJSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChkb21CYWNrZHJvcCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW5kZXIgbW9kYWxcbiAgICAgICAgY29uc3QgZG9tRWxlbWVudCA9IChjb21wb25lbnRSZWYuaG9zdFZpZXcgYXMgRW1iZWRkZWRWaWV3UmVmPGFueT4pLnJvb3ROb2Rlc1swXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29udGFpbmVyUmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9tRWxlbWVudCk7XG5cbiAgICAgICAgdGhpcy5tb2RhbHMucHVzaCh7bW9kYWxSZWY6IGNvbXBvbmVudFJlZiwgYmFja2Ryb3BSZWY6IGJhY2tkcm9wUmVmLCBjb250YWluZXJSZWY6IGNvbnRhaW5lclJlZn0pO1xuICAgICAgICByZXR1cm4gbW9kYWxSZWY7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXN0cm95TW9kYWxDb21wb25lbnQobW9kYWw6IENvbXBvbmVudFJlZjxNb2RhbENvbXBvbmVudD4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYXJyYXlSZWYgPSB0aGlzLm1vZGFscy5maW5kKChpdGVtKSA9PiBpdGVtLm1vZGFsUmVmID09PSBtb2RhbCk7XG4gICAgICAgIGNvbnN0IGluZGV4T2YgPSB0aGlzLm1vZGFscy5pbmRleE9mKGFycmF5UmVmKTtcbiAgICAgICAgdGhpcy5hcHBSZWYuZGV0YWNoVmlldyhhcnJheVJlZi5tb2RhbFJlZi5ob3N0Vmlldyk7XG4gICAgICAgIHRoaXMuYXBwUmVmLmRldGFjaFZpZXcoYXJyYXlSZWYuY29udGFpbmVyUmVmLmhvc3RWaWV3KTtcbiAgICAgICAgYXJyYXlSZWYuY29udGFpbmVyUmVmLmRlc3Ryb3koKTtcbiAgICAgICAgYXJyYXlSZWYubW9kYWxSZWYuZGVzdHJveSgpO1xuXG4gICAgICAgIGlmIChhcnJheVJlZi5iYWNrZHJvcFJlZikge1xuICAgICAgICAgICAgdGhpcy5hcHBSZWYuZGV0YWNoVmlldyhhcnJheVJlZi5iYWNrZHJvcFJlZi5ob3N0Vmlldyk7XG4gICAgICAgICAgICBhcnJheVJlZi5iYWNrZHJvcFJlZi5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1vZGFsc1tpbmRleE9mXSA9IG51bGw7XG4gICAgICAgIHRoaXMubW9kYWxzID0gdGhpcy5tb2RhbHMuZmlsdGVyKGl0ZW0gPT4gaXRlbSAhPT0gbnVsbCAmJiBpdGVtICE9PSB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0TW9kYWxTaXplKGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPE1vZGFsQ29tcG9uZW50PiwgY29uZmlnT2JqOiBNb2RhbENvbmZpZyk6IHZvaWQge1xuICAgICAgICBjb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudC5zdHlsZS5taW5XaWR0aCA9IGNvbmZpZ09iai5taW5XaWR0aDtcbiAgICAgICAgY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuc3R5bGUubWluSGVpZ2h0ID0gY29uZmlnT2JqLm1pbkhlaWdodDtcbiAgICAgICAgY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuc3R5bGUubWF4V2lkdGggPSBjb25maWdPYmoubWF4V2lkdGg7XG4gICAgICAgIGNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LnN0eWxlLm1heEhlaWdodCA9IGNvbmZpZ09iai5tYXhIZWlnaHQ7XG4gICAgICAgIGNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gY29uZmlnT2JqLndpZHRoO1xuICAgICAgICBjb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBjb25maWdPYmouaGVpZ2h0O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0TW9kYWxQb3NpdGlvbihjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxNb2RhbENvbXBvbmVudD4sIHBvc2l0aW9uOiBNb2RhbFBvc2l0aW9uKTogdm9pZCB7XG4gICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuc3R5bGUudG9wID0gcG9zaXRpb24udG9wO1xuICAgICAgICAgICAgY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuc3R5bGUuYm90dG9tID0gcG9zaXRpb24uYm90dG9tO1xuICAgICAgICAgICAgY29tcG9uZW50UmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuc3R5bGUucmlnaHQgPSBwb3NpdGlvbi5yaWdodDtcbiAgICAgICAgICAgIGNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LnN0eWxlLmxlZnQgPSBwb3NpdGlvbi5sZWZ0O1xuICAgICAgICB9XG4gICAgfVxuXG59XG4iXX0=