@hxui/angular
Version:
An Angular library based on the [HXUI design system](https://hxui.io).
134 lines • 22.2 kB
JavaScript
import { Injectable, Injector } from '@angular/core';
import { Overlay, OverlayConfig } from '@angular/cdk/overlay';
import { InspectorOverlayRef } from './inspector-overlay.ref';
import { ComponentPortal, PortalInjector } from '@angular/cdk/portal';
import { FocusTrapFactory } from '@angular/cdk/a11y';
import { InspectorComponent } from './inspector.component';
import { InspectorSize } from './inspector-size.enum';
import { InspectorLocation } from "./inspector-location.enum";
import * as i0 from "@angular/core";
import * as i1 from "@angular/cdk/overlay";
import * as i2 from "@angular/cdk/a11y";
const DEFAULT_CONFIG = {
hasBackdrop: true,
backdropClass: 'hx-modal-background',
closeOnBackdropClick: true,
panelClass: [],
hasClose: true
};
export class InspectorService {
constructor(injector, overlay, focusTrapFactory) {
this.injector = injector;
this.overlay = overlay;
this.focusTrapFactory = focusTrapFactory;
this.overlayCollection = [];
}
/**
* Create component dynamically
*/
open(component, config = {}, parameters) {
// Override default configuration
const inspectorConfig = { ...DEFAULT_CONFIG, ...config };
// Returns an OverlayRef (which is a PortalHost)
const overlayRef = this.createOverlay(inspectorConfig);
const inspectorRef = new InspectorOverlayRef(overlayRef);
// Create ComponentPortal that can be attached to a PortalHost
// and then attach ComponentPortal to PortalHost
const containerRef = this.attachInspectorContainer(component, overlayRef, inspectorConfig, inspectorRef, parameters);
// get reference to the inspector instance
const inspectorInstance = containerRef.instance;
// set size
inspectorInstance.size = (inspectorConfig.size && inspectorConfig.size === InspectorSize.Large) ? 'large' : 'small';
// set location
inspectorInstance.location = (inspectorConfig.location === InspectorLocation.Left) ? InspectorLocation.Left : InspectorLocation.Right;
// pass the @Input parameters to the instance
Object.assign(inspectorInstance.parameters, parameters);
// add reference to inspector component
inspectorRef.inspectorInstance = inspectorInstance;
// set close icon
inspectorInstance.hasClose = inspectorConfig.hasClose;
// Subscribe to a stream that emits when the backdrop was clicked
overlayRef.backdropClick().subscribe(_ => {
if (config.closeOnBackdropClick) {
inspectorRef.close();
}
inspectorRef.inspectorInstance.onBackdropClick();
});
// subscribe to events when close animation completes
inspectorInstance.onSlideOutComplete$.subscribe(_ => {
overlayRef.dispose();
this.overlayCollection.pop();
const lastInspector = this.overlayCollection[this.overlayCollection.length - 1];
if (lastInspector) {
lastInspector.inspectorInstance.size = lastInspector.inspectorInstance.previousSize;
lastInspector.inspectorInstance.hideClose = false;
}
});
// subscribe to events when open animation starts
inspectorInstance.onSlideInStart$.subscribe(_ => {
if (this.overlayCollection.length > 1) {
const previousInspector = this.overlayCollection[this.overlayCollection.length - 2];
previousInspector.inspectorInstance.previousSize = previousInspector.inspectorInstance.size;
const offsetSize = (previousInspector.inspectorInstance.size === previousInspector.inspectorInstance.sizes[InspectorSize.Small] && inspectorInstance.size === inspectorInstance.sizes[InspectorSize.Small]) ? InspectorSize.Offset : InspectorSize.FullWidth;
previousInspector.resize(offsetSize);
previousInspector.inspectorInstance.hideClose = true;
}
});
// create and manage focus trap
this.componentNativeElement = containerRef.location.nativeElement;
this.trapFocus();
// assign inspector ref
this.overlayCollection.push(inspectorRef);
return inspectorRef;
}
createOverlay(config) {
// Returns an OverlayConfig
const overlayConfig = this.getOverlayConfig(config);
// Returns an OverlayRef
return this.overlay.create(overlayConfig);
}
getOverlayConfig(config) {
const positionStrategy = this.overlay.position()
.global()
.centerHorizontally();
if (config.location === InspectorLocation.Left) {
positionStrategy.left('0');
}
else {
positionStrategy.right('0');
}
const overlayConfig = new OverlayConfig({
hasBackdrop: config.hasBackdrop,
backdropClass: config.backdropClass,
panelClass: config.panelClass,
scrollStrategy: this.overlay.scrollStrategies.block(),
positionStrategy
});
return overlayConfig;
}
createOverlayInjector(inspectorRef) {
// Instantiate new WeakMap for our custom injection tokens
const injectionTokens = new WeakMap();
// Set custom injection tokens
injectionTokens.set(InspectorOverlayRef, inspectorRef);
// Instantiate new PortalInjector
return new PortalInjector(this.injector, injectionTokens);
}
attachInspectorContainer(component, overlayRef, config, inspectorRef, parameters) {
const injector = this.createOverlayInjector(inspectorRef);
const containerPortal = new ComponentPortal(InspectorComponent, null, injector);
const containerRef = overlayRef.attach(containerPortal);
containerRef.instance.componentPortal = new ComponentPortal(component);
return containerRef;
}
trapFocus() {
this.focusTrap = this.focusTrapFactory.create(this.componentNativeElement);
this.focusTrap.focusInitialElementWhenReady();
}
}
InspectorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: InspectorService, deps: [{ token: i0.Injector }, { token: i1.Overlay }, { token: i2.FocusTrapFactory }], target: i0.ɵɵFactoryTarget.Injectable });
InspectorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: InspectorService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: InspectorService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.Overlay }, { type: i2.FocusTrapFactory }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zcGVjdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9oeC11aS9zcmMvbGliL2luc3BlY3Rvci9pbnNwZWN0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWUsVUFBVSxFQUFFLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQUMsT0FBTyxFQUFFLGFBQWEsRUFBYSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hFLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzVELE9BQU8sRUFBQyxlQUFlLEVBQUUsY0FBYyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3BELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDJCQUEyQixDQUFDOzs7O0FBWTVELE1BQU0sY0FBYyxHQUFvQjtJQUN0QyxXQUFXLEVBQUUsSUFBSTtJQUNqQixhQUFhLEVBQUUscUJBQXFCO0lBQ3BDLG9CQUFvQixFQUFFLElBQUk7SUFDMUIsVUFBVSxFQUFFLEVBQUU7SUFDZCxRQUFRLEVBQUUsSUFBSTtDQUNmLENBQUM7QUFHRixNQUFNLE9BQU8sZ0JBQWdCO0lBTTNCLFlBQ1UsUUFBa0IsRUFDbEIsT0FBZ0IsRUFDaEIsZ0JBQWtDO1FBRmxDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDbEIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUNoQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBTHBDLHNCQUFpQixHQUEwQixFQUFFLENBQUM7SUFNbkQsQ0FBQztJQUdKOztPQUVHO0lBQ0gsSUFBSSxDQUFD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dkUsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVPLFNBQVM7UUFDZixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDM0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDO0lBQ2hELENBQUM7OzhHQTlJVSxnQkFBZ0I7a0hBQWhCLGdCQUFnQjs0RkFBaEIsZ0JBQWdCO2tCQUQ1QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnRSZWYsIEluamVjdGFibGUsIEluamVjdG9yfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtPdmVybGF5LCBPdmVybGF5Q29uZmlnLCBPdmVybGF5UmVmfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XHJcbmltcG9ydCB7SW5zcGVjdG9yT3ZlcmxheVJlZn0gZnJvbSAnLi9pbnNwZWN0b3Itb3ZlcmxheS5yZWYnO1xyXG5pbXBvcnQge0NvbXBvbmVudFBvcnRhbCwgUG9ydGFsSW5qZWN0b3J9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xyXG5pbXBvcnQge0ZvY3VzVHJhcEZhY3Rvcnl9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcclxuaW1wb3J0IHtJbnNwZWN0b3JDb21wb25lbnR9IGZyb20gJy4vaW5zcGVjdG9yLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7SW5zcGVjdG9yU2l6ZX0gZnJvbSAnLi9pbnNwZWN0b3Itc2l6ZS5lbnVtJztcclxuaW1wb3J0IHtJbnNwZWN0b3JMb2NhdGlvbn0gZnJvbSBcIi4vaW5zcGVjdG9yLWxvY2F0aW9uLmVudW1cIjtcclxuXHJcbmludGVyZmFjZSBJbnNwZWN0b3JDb25maWcge1xyXG4gIHBhbmVsQ2xhc3M/OiBzdHJpbmcgfCBzdHJpbmdbXTtcclxuICBoYXNCYWNrZHJvcD86IGJvb2xlYW47XHJcbiAgYmFja2Ryb3BDbGFzcz86IHN0cmluZztcclxuICBjbG9zZU9uQmFja2Ryb3BDbGljaz86IGJvb2xlYW47XHJcbiAgc2l6ZT86IEluc3BlY3RvclNpemU7XHJcbiAgbG9jYXRpb24/OiBJbnNwZWN0b3JMb2NhdGlvbjtcclxuICBoYXNDbG9zZT86IGJvb2xlYW47XHJcbn1cclxuXHJcbmNvbnN0IERFRkFVTFRfQ09ORklHOiBJbnNwZWN0b3JDb25maWcgPSB7XHJcbiAgaGFzQmFja2Ryb3A6IHRydWUsXHJcbiAgYmFja2Ryb3BDbGFzczogJ2h4LW1vZGFsLWJhY2tncm91bmQnLFxyXG4gIGNsb3NlT25CYWNrZHJvcENsaWNrOiB0cnVlLFxyXG4gIHBhbmVsQ2xhc3M6IFtdLFxyXG4gIGhhc0Nsb3NlOiB0cnVlXHJcbn07XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBJbnNwZWN0b3JTZXJ2aWNlIHtcclxuXHJcbiAgcHJpdmF0ZSBmb2N1c1RyYXA7XHJcbiAgcHJpdmF0ZSBjb21wb25lbnROYXRpdmVFbGVtZW50O1xyXG4gIHByaXZhdGUgb3ZlcmxheUNvbGxlY3Rpb246IEluc3BlY3Rvck92ZXJsYXlSZWZbXSA9IFtdO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgcHJpdmF0ZSBvdmVybGF5OiBPdmVybGF5LFxyXG4gICAgcHJpdmF0ZSBmb2N1c1RyYXBGYWN0b3J5OiBGb2N1c1RyYXBGYWN0b3J5XHJcbiAgKSB7fVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGNvbXBvbmVudCBkeW5hbWljYWxseVxyXG4gICAqL1xyXG4gIG9wZW4oY29tcG9uZW50OiBhbnksIGNvbmZpZzogSW5zcGVjdG9yQ29uZmlnID0ge30sIHBhcmFtZXRlcnM/OiBPYmplY3QpOiBJbnNwZWN0b3JPdmVybGF5UmVmIHtcclxuXHJcbiAgICAvLyBPdmVycmlkZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb25cclxuICAgIGNvbnN0IGluc3BlY3RvckNvbmZpZyA9IHsgLi4uREVGQVVMVF9DT05GSUcsIC4uLmNvbmZpZyB9O1xyXG5cclxuICAgIC8vIFJldHVybnMgYW4gT3ZlcmxheVJlZiAod2hpY2ggaXMgYSBQb3J0YWxIb3N0KVxyXG4gICAgY29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMuY3JlYXRlT3ZlcmxheShpbnNwZWN0b3JDb25maWcpO1xyXG5cclxuICAgIGNvbnN0IGluc3BlY3RvclJlZiA9IG5ldyBJbnNwZWN0b3JPdmVybGF5UmVmKG92ZXJsYXlSZWYpO1xyXG5cclxuICAgIC8vIENyZWF0ZSBDb21wb25lbnRQb3J0YWwgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gYSBQb3J0YWxIb3N0XHJcbiAgICAvLyBhbmQgdGhlbiBhdHRhY2ggQ29tcG9uZW50UG9ydGFsIHRvIFBvcnRhbEhvc3RcclxuICAgIGNvbnN0IGNvbnRhaW5lclJlZiA9IHRoaXMuYXR0YWNoSW5zcGVjdG9yQ29udGFpbmVyKGNvbXBvbmVudCwgb3ZlcmxheVJlZiwgaW5zcGVjdG9yQ29uZmlnLCBpbnNwZWN0b3JSZWYsIHBhcmFtZXRlcnMpO1xyXG5cclxuICAgIC8vIGdldCByZWZlcmVuY2UgdG8gdGhlIGluc3BlY3RvciBpbnN0YW5jZVxyXG4gICAgY29uc3QgaW5zcGVjdG9ySW5zdGFuY2UgPSBjb250YWluZXJSZWYuaW5zdGFuY2U7XHJcblxyXG4gICAgLy8gc2V0IHNpemVcclxuICAgIGluc3BlY3Rvckluc3RhbmNlLnNpemUgPSAoaW5zcGVjdG9yQ29uZmlnLnNpemUgJiYgaW5zcGVjdG9yQ29uZmlnLnNpemUgPT09IEluc3BlY3RvclNpemUuTGFyZ2UpID8gJ2xhcmdlJyA6ICdzbWFsbCc7XHJcblxyXG4gICAgLy8gc2V0IGxvY2F0aW9uXHJcbiAgICBpbnNwZWN0b3JJbnN0YW5jZS5sb2NhdGlvbiA9IChpbnNwZWN0b3JDb25maWcubG9jYXRpb24gPT09IEluc3BlY3RvckxvY2F0aW9uLkxlZnQpID8gSW5zcGVjdG9yTG9jYXRpb24uTGVmdCA6IEluc3BlY3RvckxvY2F0aW9uLlJpZ2h0O1xyXG5cclxuICAgIC8vIHBhc3MgdGhlIEBJbnB1dCBwYXJhbWV0ZXJzIHRvIHRoZSBpbnN0YW5jZVxyXG4gICAgT2JqZWN0LmFzc2lnbihpbnNwZWN0b3JJbnN0YW5jZS5wYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzKTtcclxuXHJcbiAgICAvLyBhZGQgcmVmZXJlbmNlIHRvIGluc3BlY3RvciBjb21wb25lbnRcclxuICAgIGluc3BlY3RvclJlZi5pbnNwZWN0b3JJbnN0YW5jZSA9IGluc3BlY3Rvckluc3RhbmNlO1xyXG5cclxuICAgIC8vIHNldCBjbG9zZSBpY29uXHJcbiAgICBpbnNwZWN0b3JJbnN0YW5jZS5oYXNDbG9zZSA9IGluc3BlY3RvckNvbmZpZy5oYXNDbG9zZVxyXG5cclxuICAgIC8vIFN1YnNjcmliZSB0byBhIHN0cmVhbSB0aGF0IGVtaXRzIHdoZW4gdGhlIGJhY2tkcm9wIHdhcyBjbGlja2VkXHJcbiAgICBvdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoXyA9PiB7XHJcbiAgICAgIGlmKGNvbmZpZy5jbG9zZU9uQmFja2Ryb3BDbGljayl7XHJcbiAgICAgICAgaW5zcGVjdG9yUmVmLmNsb3NlKCk7XHJcbiAgICAgIH1cclxuICAgICAgaW5zcGVjdG9yUmVmLmluc3BlY3Rvckluc3RhbmNlLm9uQmFja2Ryb3BDbGljaygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gc3Vic2NyaWJlIHRvIGV2ZW50cyB3aGVuIGNsb3NlIGFuaW1hdGlvbiBjb21wbGV0ZXNcclxuICAgIGluc3BlY3Rvckluc3RhbmNlLm9uU2xpZGVPdXRDb21wbGV0ZSQuc3Vic2NyaWJlKF8gPT4ge1xyXG4gICAgICBvdmVybGF5UmVmLmRpc3Bvc2UoKTtcclxuICAgICAgdGhpcy5vdmVybGF5Q29sbGVjdGlvbi5wb3AoKTtcclxuICAgICAgICBjb25zdCBsYXN0SW5zcGVjdG9yID0gdGhpcy5vdmVybGF5Q29sbGVjdGlvblt0aGlzLm92ZXJsYXlDb2xsZWN0aW9uLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgIGlmIChsYXN0SW5zcGVjdG9yKSB7XHJcbiAgICAgICAgICBsYXN0SW5zcGVjdG9yLmluc3BlY3Rvckluc3RhbmNlLnNpemUgPSBsYXN0SW5zcGVjdG9yLmluc3BlY3Rvckluc3RhbmNlLnByZXZpb3VzU2l6ZTtcclxuICAgICAgICAgIGxhc3RJbnNwZWN0b3IuaW5zcGVjdG9ySW5zdGFuY2UuaGlkZUNsb3NlID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gc3Vic2NyaWJlIHRvIGV2ZW50cyB3aGVuIG9wZW4gYW5pbWF0aW9uIHN0YXJ0c1xyXG4gICAgaW5zcGVjdG9ySW5zdGFuY2Uub25TbGlkZUluU3RhcnQkLnN1YnNjcmliZShfID0+IHtcclxuICAgICAgaWYgKHRoaXMub3ZlcmxheUNvbGxlY3Rpb24ubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzSW5zcGVjdG9yID0gdGhpcy5vdmVybGF5Q29sbGVjdGlvblt0aGlzLm92ZXJsYXlDb2xsZWN0aW9uLmxlbmd0aCAtIDJdO1xyXG4gICAgICAgIHByZXZpb3VzSW5zcGVjdG9yLmluc3BlY3Rvckluc3RhbmNlLnByZXZpb3VzU2l6ZSA9IHByZXZpb3VzSW5zcGVjdG9yLmluc3BlY3Rvckluc3RhbmNlLnNpemU7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0U2l6ZSA9IChwcmV2aW91c0luc3BlY3Rvci5pbnNwZWN0b3JJbnN0YW5jZS5zaXplID09PSBwcmV2aW91c0luc3BlY3Rvci5pbnNwZWN0b3JJbnN0YW5jZS5zaXplc1tJbnNwZWN0b3JTaXplLlNtYWxsXSAmJiBpbnNwZWN0b3JJbnN0YW5jZS5zaXplID09PSBpbnNwZWN0b3JJbnN0YW5jZS5zaXplc1tJbnNwZWN0b3JTaXplLlNtYWxsXSkgPyBJbnNwZWN0b3JTaXplLk9mZnNldCA6IEluc3BlY3RvclNpemUuRnVsbFdpZHRoO1xyXG4gICAgICAgIHByZXZpb3VzSW5zcGVjdG9yLnJlc2l6ZShvZmZzZXRTaXplKTtcclxuICAgICAgICBwcmV2aW91c0luc3BlY3Rvci5pbnNwZWN0b3JJbnN0YW5jZS5oaWRlQ2xvc2UgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBjcmVhdGUgYW5kIG1hbmFnZSBmb2N1cyB0cmFwXHJcbiAgICB0aGlzLmNvbXBvbmVudE5hdGl2ZUVsZW1lbnQgPSBjb250YWluZXJSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMudHJhcEZvY3VzKCk7XHJcblxyXG4gICAgLy8gYXNzaWduIGluc3BlY3RvciByZWZcclxuICAgIHRoaXMub3ZlcmxheUNvbGxlY3Rpb24ucHVzaChpbnNwZWN0b3JSZWYpO1xyXG5cclxuICAgIHJldHVybiBpbnNwZWN0b3JSZWY7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU92ZXJsYXkoY29uZmlnOiBJbnNwZWN0b3JDb25maWcpIHtcclxuICAgIC8vIFJldHVybnMgYW4gT3ZlcmxheUNvbmZpZ1xyXG4gICAgY29uc3Qgb3ZlcmxheUNvbmZpZyA9IHRoaXMuZ2V0T3ZlcmxheUNvbmZpZyhjb25maWcpO1xyXG5cclxuICAgIC8vIFJldHVybnMgYW4gT3ZlcmxheVJlZlxyXG4gICAgcmV0dXJuIHRoaXMub3ZlcmxheS5jcmVhdGUob3ZlcmxheUNvbmZpZyk7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBnZXRPdmVybGF5Q29uZmlnKGNvbmZpZzogSW5zcGVjdG9yQ29uZmlnKTogT3ZlcmxheUNvbmZpZyB7XHJcbiAgICBjb25zdCBwb3NpdGlvblN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5LnBvc2l0aW9uKClcclxuICAgICAgLmdsb2JhbCgpXHJcbiAgICAgIC5jZW50ZXJIb3Jpem9udGFsbHkoKTtcclxuXHJcbiAgICBpZiAoY29uZmlnLmxvY2F0aW9uID09PSBJbnNwZWN0b3JMb2NhdGlvbi5MZWZ0KXtcclxuICAgICAgcG9zaXRpb25TdHJhdGVneS5sZWZ0KCcwJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwb3NpdGlvblN0cmF0ZWd5LnJpZ2h0KCcwJyk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgb3ZlcmxheUNvbmZpZyA9IG5ldyBPdmVybGF5Q29uZmlnKHtcclxuICAgICAgaGFzQmFja2Ryb3A6IGNvbmZpZy5oYXNCYWNrZHJvcCxcclxuICAgICAgYmFja2Ryb3BDbGFzczogY29uZmlnLmJhY2tkcm9wQ2xhc3MsXHJcbiAgICAgIHBhbmVsQ2xhc3M6IGNvbmZpZy5wYW5lbENsYXNzLFxyXG4gICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMuYmxvY2soKSxcclxuICAgICAgcG9zaXRpb25TdHJhdGVneVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIG92ZXJsYXlDb25maWc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU92ZXJsYXlJbmplY3RvcihpbnNwZWN0b3JSZWY6IEluc3BlY3Rvck92ZXJsYXlSZWYpOiBQb3J0YWxJbmplY3RvciB7XHJcbiAgICAvLyBJbnN0YW50aWF0ZSBuZXcgV2Vha01hcCBmb3Igb3VyIGN1c3RvbSBpbmplY3Rpb24gdG9rZW5zXHJcbiAgICBjb25zdCBpbmplY3Rpb25Ub2tlbnMgPSBuZXcgV2Vha01hcCgpO1xyXG5cclxuICAgIC8vIFNldCBjdXN0b20gaW5qZWN0aW9uIHRva2Vuc1xyXG4gICAgaW5qZWN0aW9uVG9rZW5zLnNldChJbnNwZWN0b3JPdmVybGF5UmVmLCBpbnNwZWN0b3JSZWYpO1xyXG5cclxuICAgIC8vIEluc3RhbnRpYXRlIG5ldyBQb3J0YWxJbmplY3RvclxyXG4gICAgcmV0dXJuIG5ldyBQb3J0YWxJbmplY3Rvcih0aGlzLmluamVjdG9yLCBpbmplY3Rpb25Ub2tlbnMpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhdHRhY2hJbnNwZWN0b3JDb250YWluZXIoY29tcG9uZW50OiBhbnksIG92ZXJsYXlSZWY6IE92ZXJsYXlSZWYsIGNvbmZpZzogSW5zcGVjdG9yQ29uZmlnLCBpbnNwZWN0b3JSZWY6IEluc3BlY3Rvck92ZXJsYXlSZWYsIHBhcmFtZXRlcnM/OiBPYmplY3QpIHtcclxuICAgIGNvbnN0IGluamVjdG9yID0gdGhpcy5jcmVhdGVPdmVybGF5SW5qZWN0b3IoaW5zcGVjdG9yUmVmKTtcclxuICAgIGNvbnN0IGNvbnRhaW5lclBvcnRhbCA9IG5ldyBDb21wb25lbnRQb3J0YWwoSW5zcGVjdG9yQ29tcG9uZW50ICwgbnVsbCwgaW5qZWN0b3IpO1xyXG4gICAgY29uc3QgY29udGFpbmVyUmVmOiBDb21wb25lbnRSZWY8SW5zcGVjdG9yQ29tcG9uZW50PiA9IG92ZXJsYXlSZWYuYXR0YWNoKGNvbnRhaW5lclBvcnRhbCk7XHJcbiAgICBjb250YWluZXJSZWYuaW5zdGFuY2UuY29tcG9uZW50UG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbChjb21wb25lbnQpO1xyXG5cclxuICAgIHJldHVybiBjb250YWluZXJSZWY7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRyYXBGb2N1cygpIHtcclxuICAgIHRoaXMuZm9jdXNUcmFwID0gdGhpcy5mb2N1c1RyYXBGYWN0b3J5LmNyZWF0ZSh0aGlzLmNvbXBvbmVudE5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgdGhpcy5mb2N1c1RyYXAuZm9jdXNJbml0aWFsRWxlbWVudFdoZW5SZWFkeSgpO1xyXG4gIH1cclxuXHJcbn1cclxuIl19