UNPKG

theme-lib

Version:

This is a simple example Angular Library published to npm.

487 lines 37.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { ApplicationRef, ComponentFactoryResolver, Directive, Inject, Injectable, Injector, NgModule, NgZone, } from '@angular/core'; import { CdkPortal, CdkPortalOutlet, ComponentPortal, DomPortalOutlet, PortalInjector, PortalModule, TemplatePortal, } from '@angular/cdk/portal'; import { FlexibleConnectedPositionStrategy, Overlay, OverlayConfig, OverlayContainer, OverlayKeyboardDispatcher, OverlayModule, OverlayPositionBuilder, OverlayRef, ScrollStrategyOptions, } from '@angular/cdk/overlay'; import { Platform } from '@angular/cdk/platform'; import { Directionality } from '@angular/cdk/bidi'; import { NB_DOCUMENT } from '../../../theme.options'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; var NbPortalDirective = /** @class */ (function (_super) { tslib_1.__extends(NbPortalDirective, _super); function NbPortalDirective() { return _super !== null && _super.apply(this, arguments) || this; } NbPortalDirective.decorators = [ { type: Directive, args: [{ selector: '[nbPortal]' },] } ]; return NbPortalDirective; }(CdkPortal)); export { NbPortalDirective }; var NbPortalOutletDirective = /** @class */ (function (_super) { tslib_1.__extends(NbPortalOutletDirective, _super); function NbPortalOutletDirective() { return _super !== null && _super.apply(this, arguments) || this; } NbPortalOutletDirective.decorators = [ { type: Directive, args: [{ selector: '[nbPortalOutlet]' },] } ]; return NbPortalOutletDirective; }(CdkPortalOutlet)); export { NbPortalOutletDirective }; /** * @template T */ var /** * @template T */ NbComponentPortal = /** @class */ (function (_super) { tslib_1.__extends(NbComponentPortal, _super); function NbComponentPortal(component, vcr, injector, cfr) { var _this = _super.call(this, component, vcr, injector) || this; _this.cfr = cfr; return _this; } return NbComponentPortal; }(ComponentPortal)); /** * @template T */ export { NbComponentPortal }; if (false) { /** @type {?} */ NbComponentPortal.prototype.cfr; } /* * TODO remove after @angular/cdk@7.0.0 relased * */ var /* * TODO remove after @angular/cdk@7.0.0 relased * */ NbDomPortalOutlet = /** @class */ (function (_super) { tslib_1.__extends(NbDomPortalOutlet, _super); function NbDomPortalOutlet(outletElement, componentFactoryResolver, appRef, defaultInjector) { var _this = _super.call(this, outletElement, componentFactoryResolver, appRef, defaultInjector) || this; _this.outletElement = outletElement; _this.componentFactoryResolver = componentFactoryResolver; _this.appRef = appRef; _this.defaultInjector = defaultInjector; return _this; } /* * Attach the given ComponentPortal to DOM element using the ComponentFactoryResolver. * @param portal Portal to be attached * @returns Reference to the created component. */ /* * Attach the given ComponentPortal to DOM element using the ComponentFactoryResolver. * @param portal Portal to be attached * @returns Reference to the created component. */ /** * @template T * @param {?} portal * @return {?} */ NbDomPortalOutlet.prototype.attachComponentPortal = /* * Attach the given ComponentPortal to DOM element using the ComponentFactoryResolver. * @param portal Portal to be attached * @returns Reference to the created component. */ /** * @template T * @param {?} portal * @return {?} */ function (portal) { var _this = this; /** @type {?} */ var resolver = portal.cfr || this.componentFactoryResolver; /** @type {?} */ var componentFactory = resolver.resolveComponentFactory(portal.component); /** @type {?} */ var componentRef; // If the portal specifies a ViewContainerRef, we will use that as the attachment point // for the component (in terms of Angular's component tree, not rendering). // When the ViewContainerRef is missing, we use the factory to create the component directly // and then manually attach the view to the application. if (portal.viewContainerRef) { componentRef = portal.viewContainerRef.createComponent(componentFactory, portal.viewContainerRef.length, portal.injector || portal.viewContainerRef.parentInjector); this.setDisposeFn(function () { return componentRef.destroy(); }); } else { componentRef = componentFactory.create(portal.injector || this.defaultInjector); this.appRef.attachView(componentRef.hostView); this.setDisposeFn(function () { _this.appRef.detachView(componentRef.hostView); componentRef.destroy(); }); } // At this point the component has been instantiated, so we move it to the location in the DOM // where we want it to be rendered. this.outletElement.appendChild(this.getComponentRootNode(componentRef)); return componentRef; }; /* Gets the root HTMLElement for an instantiated component. */ /* Gets the root HTMLElement for an instantiated component. */ /** * @private * @param {?} componentRef * @return {?} */ NbDomPortalOutlet.prototype.getComponentRootNode = /* Gets the root HTMLElement for an instantiated component. */ /** * @private * @param {?} componentRef * @return {?} */ function (componentRef) { return (/** @type {?} */ (((/** @type {?} */ (componentRef.hostView))).rootNodes[0])); }; return NbDomPortalOutlet; }(DomPortalOutlet)); /* * TODO remove after @angular/cdk@7.0.0 relased * */ export { NbDomPortalOutlet }; if (false) { /** @type {?} */ NbDomPortalOutlet.prototype.outletElement; /** * @type {?} * @private */ NbDomPortalOutlet.prototype.componentFactoryResolver; /** * @type {?} * @private */ NbDomPortalOutlet.prototype.appRef; /** * @type {?} * @private */ NbDomPortalOutlet.prototype.defaultInjector; } var NbOverlay = /** @class */ (function (_super) { tslib_1.__extends(NbOverlay, _super); function NbOverlay(scrollStrategies, overlayContainer, componentFactoryResolver, positionBuilder, keyboardDispatcher, injector, ngZone, document, directionality) { var _this = _super.call(this, scrollStrategies, overlayContainer, componentFactoryResolver, positionBuilder, keyboardDispatcher, injector, ngZone, document, directionality) || this; _this.scrollStrategies = scrollStrategies; _this.overlayContainer = overlayContainer; _this.componentFactoryResolver = componentFactoryResolver; _this.positionBuilder = positionBuilder; _this.keyboardDispatcher = keyboardDispatcher; _this.injector = injector; _this.ngZone = ngZone; _this.document = document; _this.directionality = directionality; return _this; } /* * Creates an overlay. * @param config Configuration applied to the overlay. * @returns Reference to the created overlay. */ /* * Creates an overlay. * @param config Configuration applied to the overlay. * @returns Reference to the created overlay. */ /** * @param {?=} config * @return {?} */ NbOverlay.prototype.create = /* * Creates an overlay. * @param config Configuration applied to the overlay. * @returns Reference to the created overlay. */ /** * @param {?=} config * @return {?} */ function (config) { /** @type {?} */ var host = this.createHostElement(); /** @type {?} */ var pane = this.createPaneElement(host); /** @type {?} */ var portalOutlet = this.createPortalOutlet(pane); /** @type {?} */ var overlayConfig = new OverlayConfig(config); overlayConfig.direction = overlayConfig.direction || this.directionality.value; return new OverlayRef(portalOutlet, host, pane, overlayConfig, this.ngZone, this.keyboardDispatcher, this.document); }; /* * Creates the DOM element for an overlay and appends it to the overlay container. * @returns Newly-created pane element */ /* * Creates the DOM element for an overlay and appends it to the overlay container. * @returns Newly-created pane element */ /** * @protected * @param {?} host * @return {?} */ NbOverlay.prototype.createPaneElement = /* * Creates the DOM element for an overlay and appends it to the overlay container. * @returns Newly-created pane element */ /** * @protected * @param {?} host * @return {?} */ function (host) { /** @type {?} */ var pane = this.document.createElement('div'); pane.id = "cdk-overlay-" + NbOverlay.nextUniqueId++; pane.classList.add('cdk-overlay-pane'); host.appendChild(pane); return pane; }; /* * Creates the host element that wraps around an overlay * and can be used for advanced positioning. * @returns Newly-create host element. */ /* * Creates the host element that wraps around an overlay * and can be used for advanced positioning. * @returns Newly-create host element. */ /** * @protected * @return {?} */ NbOverlay.prototype.createHostElement = /* * Creates the host element that wraps around an overlay * and can be used for advanced positioning. * @returns Newly-create host element. */ /** * @protected * @return {?} */ function () { /** @type {?} */ var host = this.document.createElement('div'); this.overlayContainer.getContainerElement().appendChild(host); return host; }; /* * Create a DomPortalOutlet into which the overlay content can be loaded. * @param pane The DOM element to turn into a portal outlet. * @returns A portal outlet for the given DOM element. */ /* * Create a DomPortalOutlet into which the overlay content can be loaded. * @param pane The DOM element to turn into a portal outlet. * @returns A portal outlet for the given DOM element. */ /** * @protected * @param {?} pane * @return {?} */ NbOverlay.prototype.createPortalOutlet = /* * Create a DomPortalOutlet into which the overlay content can be loaded. * @param pane The DOM element to turn into a portal outlet. * @returns A portal outlet for the given DOM element. */ /** * @protected * @param {?} pane * @return {?} */ function (pane) { // We have to resolve the ApplicationRef later in order to allow people // to use overlay-based providers during app initialization. if (!this.appRef) { this.appRef = this.injector.get(ApplicationRef); } return new NbDomPortalOutlet(pane, this.componentFactoryResolver, this.appRef, this.injector); }; NbOverlay.nextUniqueId = 0; NbOverlay.decorators = [ { type: Injectable } ]; /** @nocollapse */ NbOverlay.ctorParameters = function () { return [ { type: ScrollStrategyOptions }, { type: OverlayContainer }, { type: ComponentFactoryResolver }, { type: OverlayPositionBuilder }, { type: OverlayKeyboardDispatcher }, { type: Injector }, { type: NgZone }, { type: undefined, decorators: [{ type: Inject, args: [NB_DOCUMENT,] }] }, { type: Directionality } ]; }; return NbOverlay; }(Overlay)); export { NbOverlay }; if (false) { /** * @type {?} * @protected */ NbOverlay.nextUniqueId; /** * @type {?} * @protected */ NbOverlay.prototype.appRef; /** @type {?} */ NbOverlay.prototype.scrollStrategies; /** * @type {?} * @protected */ NbOverlay.prototype.overlayContainer; /** * @type {?} * @protected */ NbOverlay.prototype.componentFactoryResolver; /** * @type {?} * @protected */ NbOverlay.prototype.positionBuilder; /** * @type {?} * @protected */ NbOverlay.prototype.keyboardDispatcher; /** * @type {?} * @protected */ NbOverlay.prototype.injector; /** * @type {?} * @protected */ NbOverlay.prototype.ngZone; /** * @type {?} * @private */ NbOverlay.prototype.document; /** * @type {?} * @private */ NbOverlay.prototype.directionality; } var NbPlatform = /** @class */ (function (_super) { tslib_1.__extends(NbPlatform, _super); function NbPlatform() { return _super !== null && _super.apply(this, arguments) || this; } NbPlatform.decorators = [ { type: Injectable } ]; return NbPlatform; }(Platform)); export { NbPlatform }; var NbOverlayPositionBuilder = /** @class */ (function (_super) { tslib_1.__extends(NbOverlayPositionBuilder, _super); function NbOverlayPositionBuilder() { return _super !== null && _super.apply(this, arguments) || this; } NbOverlayPositionBuilder.decorators = [ { type: Injectable } ]; return NbOverlayPositionBuilder; }(OverlayPositionBuilder)); export { NbOverlayPositionBuilder }; /** * @template T */ var /** * @template T */ NbTemplatePortal = /** @class */ (function (_super) { tslib_1.__extends(NbTemplatePortal, _super); function NbTemplatePortal(template, viewContainerRef, context) { return _super.call(this, template, viewContainerRef, context) || this; } return NbTemplatePortal; }(TemplatePortal)); /** * @template T */ export { NbTemplatePortal }; var NbOverlayContainer = /** @class */ (function (_super) { tslib_1.__extends(NbOverlayContainer, _super); function NbOverlayContainer() { return _super !== null && _super.apply(this, arguments) || this; } /** @nocollapse */ NbOverlayContainer.ngInjectableDef = i0.defineInjectable({ factory: function NbOverlayContainer_Factory() { return new NbOverlayContainer(i0.inject(i1.DOCUMENT)); }, token: NbOverlayContainer, providedIn: "root" }); return NbOverlayContainer; }(OverlayContainer)); export { NbOverlayContainer }; var NbFlexibleConnectedPositionStrategy = /** @class */ (function (_super) { tslib_1.__extends(NbFlexibleConnectedPositionStrategy, _super); function NbFlexibleConnectedPositionStrategy() { return _super !== null && _super.apply(this, arguments) || this; } return NbFlexibleConnectedPositionStrategy; }(FlexibleConnectedPositionStrategy)); export { NbFlexibleConnectedPositionStrategy }; var NbPortalInjector = /** @class */ (function (_super) { tslib_1.__extends(NbPortalInjector, _super); function NbPortalInjector() { return _super !== null && _super.apply(this, arguments) || this; } return NbPortalInjector; }(PortalInjector)); export { NbPortalInjector }; /** @type {?} */ var CDK_MODULES = [OverlayModule, PortalModule]; /* * This module helps us to keep all angular/cdk deps inside our cdk module via providing aliases. * Approach will help us move cdk in separate npm package and refactor nebular/theme code. * */ var NbCdkMappingModule = /** @class */ (function () { function NbCdkMappingModule() { } /** * @return {?} */ NbCdkMappingModule.forRoot = /** * @return {?} */ function () { return (/** @type {?} */ ({ ngModule: NbCdkMappingModule, providers: [ NbOverlay, NbPlatform, NbOverlayPositionBuilder, ], })); }; NbCdkMappingModule.decorators = [ { type: NgModule, args: [{ imports: tslib_1.__spread(CDK_MODULES), exports: tslib_1.__spread(CDK_MODULES, [ NbPortalDirective, NbPortalOutletDirective, ]), declarations: [NbPortalDirective, NbPortalOutletDirective], },] } ]; return NbCdkMappingModule; }()); export { NbCdkMappingModule }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwcGluZy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3RoZW1lLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2Nkay9vdmVybGF5L21hcHBpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsY0FBYyxFQUNkLHdCQUF3QixFQUV4QixTQUFTLEVBRVQsTUFBTSxFQUNOLFVBQVUsRUFDVixRQUFRLEVBRVIsUUFBUSxFQUNSLE1BQU0sR0FHUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsU0FBUyxFQUNULGVBQWUsRUFDZixlQUFlLEVBQ2YsZUFBZSxFQUVmLGNBQWMsRUFDZCxZQUFZLEVBQ1osY0FBYyxHQUNmLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUtMLGlDQUFpQyxFQUNqQyxPQUFPLEVBQ1AsYUFBYSxFQUNiLGdCQUFnQixFQUNoQix5QkFBeUIsRUFDekIsYUFBYSxFQUNiLHNCQUFzQixFQUN0QixVQUFVLEVBR1YscUJBQXFCLEdBQ3RCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVuRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7OztBQUdyRDtJQUN1Qyw2Q0FBUztJQURoRDs7SUFFQSxDQUFDOztnQkFGQSxTQUFTLFNBQUMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFOztJQUVyQyx3QkFBQztDQUFBLEFBRkQsQ0FDdUMsU0FBUyxHQUMvQztTQURZLGlCQUFpQjtBQUc5QjtJQUM2QyxtREFBZTtJQUQ1RDs7SUFFQSxDQUFDOztnQkFGQSxTQUFTLFNBQUMsRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUU7O0lBRTNDLDhCQUFDO0NBQUEsQUFGRCxDQUM2QyxlQUFlLEdBQzNEO1NBRFksdUJBQXVCOzs7O0FBR3BDOzs7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dUJBQUM7QUFBRCxDQUFDLEFBREQsQ0FBc0MsY0FBYyxHQUNuRDs7O0lBYUssV0FBVyxHQUFHLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQzs7Ozs7QUFNakQ7SUFBQTtJQW9CQSxDQUFDOzs7O0lBVlEsMEJBQU87OztJQUFkO1FBQ0UsT0FBTyxtQkFBc0I7WUFDM0IsUUFBUSxFQUFFLGtCQUFrQjtZQUM1QixTQUFTLEVBQUU7Z0JBQ1QsU0FBUztnQkFDVCxVQUFVO2dCQUNWLHdCQUF3QjthQUN6QjtTQUNGLEVBQUEsQ0FBQztJQUNKLENBQUM7O2dCQW5CRixRQUFRLFNBQUM7b0JBQ1IsT0FBTyxtQkFBTSxXQUFXLENBQUM7b0JBQ3pCLE9BQU8sbUJBQ0YsV0FBVzt3QkFDZCxpQkFBaUI7d0JBQ2pCLHVCQUF1QjtzQkFDeEI7b0JBQ0QsWUFBWSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsdUJBQXVCLENBQUM7aUJBQzNEOztJQVlELHlCQUFDO0NBQUEsQUFwQkQsSUFvQkM7U0FYWSxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFwcGxpY2F0aW9uUmVmLFxyXG4gIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICBDb21wb25lbnRSZWYsXHJcbiAgRGlyZWN0aXZlLFxyXG4gIEVtYmVkZGVkVmlld1JlZixcclxuICBJbmplY3QsXHJcbiAgSW5qZWN0YWJsZSxcclxuICBJbmplY3RvcixcclxuICBNb2R1bGVXaXRoUHJvdmlkZXJzLFxyXG4gIE5nTW9kdWxlLFxyXG4gIE5nWm9uZSxcclxuICBUZW1wbGF0ZVJlZixcclxuICBWaWV3Q29udGFpbmVyUmVmLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIENka1BvcnRhbCxcclxuICBDZGtQb3J0YWxPdXRsZXQsXHJcbiAgQ29tcG9uZW50UG9ydGFsLFxyXG4gIERvbVBvcnRhbE91dGxldCxcclxuICBQb3J0YWwsXHJcbiAgUG9ydGFsSW5qZWN0b3IsXHJcbiAgUG9ydGFsTW9kdWxlLFxyXG4gIFRlbXBsYXRlUG9ydGFsLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xyXG5pbXBvcnQge1xyXG4gIENvbXBvbmVudFR5cGUsXHJcbiAgQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlLFxyXG4gIENvbm5lY3RlZFBvc2l0aW9uLFxyXG4gIENvbm5lY3Rpb25Qb3NpdGlvblBhaXIsXHJcbiAgRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5LFxyXG4gIE92ZXJsYXksXHJcbiAgT3ZlcmxheUNvbmZpZyxcclxuICBPdmVybGF5Q29udGFpbmVyLFxyXG4gIE92ZXJsYXlLZXlib2FyZERpc3BhdGNoZXIsXHJcbiAgT3ZlcmxheU1vZHVsZSxcclxuICBPdmVybGF5UG9zaXRpb25CdWlsZGVyLFxyXG4gIE92ZXJsYXlSZWYsXHJcbiAgUG9zaXRpb25TdHJhdGVneSxcclxuICBTY3JvbGxTdHJhdGVneSxcclxuICBTY3JvbGxTdHJhdGVneU9wdGlvbnMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xyXG5pbXBvcnQgeyBQbGF0Zm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wbGF0Zm9ybSc7XHJcbmltcG9ydCB7IERpcmVjdGlvbmFsaXR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2JpZGknO1xyXG5cclxuaW1wb3J0IHsgTkJfRE9DVU1FTlQgfSBmcm9tICcuLi8uLi8uLi90aGVtZS5vcHRpb25zJztcclxuXHJcblxyXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbbmJQb3J0YWxdJyB9KVxyXG5leHBvcnQgY2xhc3MgTmJQb3J0YWxEaXJlY3RpdmUgZXh0ZW5kcyBDZGtQb3J0YWwge1xyXG59XHJcblxyXG5ARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbbmJQb3J0YWxPdXRsZXRdJyB9KVxyXG5leHBvcnQgY2xhc3MgTmJQb3J0YWxPdXRsZXREaXJlY3RpdmUgZXh0ZW5kcyBDZGtQb3J0YWxPdXRsZXQge1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTmJDb21wb25lbnRQb3J0YWw8VCA9IGFueT4gZXh0ZW5kcyBDb21wb25lbnRQb3J0YWw8VD4ge1xyXG4gIGNvbnN0cnVjdG9yKGNvbXBvbmVudDogQ29tcG9uZW50VHlwZTxUPixcclxuICAgICAgICAgICAgICB2Y3I/OiBWaWV3Q29udGFpbmVyUmVmLFxyXG4gICAgICAgICAgICAgIGluamVjdG9yPzogSW5qZWN0b3IsXHJcbiAgICAgICAgICAgICAgcHVibGljIGNmcj86IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcikge1xyXG4gICAgc3VwZXIoY29tcG9uZW50LCB2Y3IsIGluamVjdG9yKTtcclxuICB9XHJcbn1cclxuXHJcbi8qXHJcbiAqIFRPRE8gcmVtb3ZlIGFmdGVyIEBhbmd1bGFyL2Nka0A3LjAuMCByZWxhc2VkXHJcbiAqICovXHJcbmV4cG9ydCBjbGFzcyBOYkRvbVBvcnRhbE91dGxldCBleHRlbmRzIERvbVBvcnRhbE91dGxldCB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICAvKiBFbGVtZW50IGludG8gd2hpY2ggdGhlIGNvbnRlbnQgaXMgcHJvamVjdGVkLiAqL1xyXG4gICAgcHVibGljIG91dGxldEVsZW1lbnQ6IEVsZW1lbnQsXHJcbiAgICBwcml2YXRlIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gICAgcHJpdmF0ZSBhcHBSZWY6IEFwcGxpY2F0aW9uUmVmLFxyXG4gICAgcHJpdmF0ZSBkZWZhdWx0SW5qZWN0b3I6IEluamVjdG9yKSB7XHJcbiAgICBzdXBlcihvdXRsZXRFbGVtZW50LCBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIGFwcFJlZiwgZGVmYXVsdEluamVjdG9yKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogQXR0YWNoIHRoZSBnaXZlbiBDb21wb25lbnRQb3J0YWwgdG8gRE9NIGVsZW1lbnQgdXNpbmcgdGhlIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5cclxuICAgKiBAcGFyYW0gcG9ydGFsIFBvcnRhbCB0byBiZSBhdHRhY2hlZFxyXG4gICAqIEByZXR1cm5zIFJlZmVyZW5jZSB0byB0aGUgY3JlYXRlZCBjb21wb25lbnQuXHJcbiAgICovXHJcbiAgYXR0YWNoQ29tcG9uZW50UG9ydGFsPFQ+KHBvcnRhbDogTmJDb21wb25lbnRQb3J0YWw8VD4pOiBDb21wb25lbnRSZWY8VD4ge1xyXG4gICAgY29uc3QgcmVzb2x2ZXIgPSBwb3J0YWwuY2ZyIHx8IHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyO1xyXG4gICAgY29uc3QgY29tcG9uZW50RmFjdG9yeSA9IHJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KHBvcnRhbC5jb21wb25lbnQpO1xyXG4gICAgbGV0IGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmPFQ+O1xyXG5cclxuICAgIC8vIElmIHRoZSBwb3J0YWwgc3BlY2lmaWVzIGEgVmlld0NvbnRhaW5lclJlZiwgd2Ugd2lsbCB1c2UgdGhhdCBhcyB0aGUgYXR0YWNobWVudCBwb2ludFxyXG4gICAgLy8gZm9yIHRoZSBjb21wb25lbnQgKGluIHRlcm1zIG9mIEFuZ3VsYXIncyBjb21wb25lbnQgdHJlZSwgbm90IHJlbmRlcmluZykuXHJcbiAgICAvLyBXaGVuIHRoZSBWaWV3Q29udGFpbmVyUmVmIGlzIG1pc3NpbmcsIHdlIHVzZSB0aGUgZmFjdG9yeSB0byBjcmVhdGUgdGhlIGNvbXBvbmVudCBkaXJlY3RseVxyXG4gICAgLy8gYW5kIHRoZW4gbWFudWFsbHkgYXR0YWNoIHRoZSB2aWV3IHRvIHRoZSBhcHBsaWNhdGlvbi5cclxuICAgIGlmIChwb3J0YWwudmlld0NvbnRhaW5lclJlZikge1xyXG4gICAgICBjb21wb25lbnRSZWYgPSBwb3J0YWwudmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoXHJcbiAgICAgICAgY29tcG9uZW50RmFjdG9yeSxcclxuICAgICAgICBwb3J0YWwudmlld0NvbnRhaW5lclJlZi5sZW5ndGgsXHJcbiAgICAgICAgcG9ydGFsLmluamVjdG9yIHx8IHBvcnRhbC52aWV3Q29udGFpbmVyUmVmLnBhcmVudEluamVjdG9yKTtcclxuXHJcbiAgICAgIHRoaXMuc2V0RGlzcG9zZUZuKCgpID0+IGNvbXBvbmVudFJlZi5kZXN0cm95KCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29tcG9uZW50UmVmID0gY29tcG9uZW50RmFjdG9yeS5jcmVhdGUocG9ydGFsLmluamVjdG9yIHx8IHRoaXMuZGVmYXVsdEluamVjdG9yKTtcclxuICAgICAgdGhpcy5hcHBSZWYuYXR0YWNoVmlldyhjb21wb25lbnRSZWYuaG9zdFZpZXcpO1xyXG4gICAgICB0aGlzLnNldERpc3Bvc2VGbigoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5hcHBSZWYuZGV0YWNoVmlldyhjb21wb25lbnRSZWYuaG9zdFZpZXcpO1xyXG4gICAgICAgIGNvbXBvbmVudFJlZi5kZXN0cm95KCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgY29tcG9uZW50IGhhcyBiZWVuIGluc3RhbnRpYXRlZCwgc28gd2UgbW92ZSBpdCB0byB0aGUgbG9jYXRpb24gaW4gdGhlIERPTVxyXG4gICAgLy8gd2hlcmUgd2Ugd2FudCBpdCB0byBiZSByZW5kZXJlZC5cclxuICAgIHRoaXMub3V0bGV0RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmdldENvbXBvbmVudFJvb3ROb2RlKGNvbXBvbmVudFJlZikpO1xyXG5cclxuICAgIHJldHVybiBjb21wb25lbnRSZWY7XHJcbiAgfVxyXG5cclxuICAvKiBHZXRzIHRoZSByb290IEhUTUxFbGVtZW50IGZvciBhbiBpbnN0YW50aWF0ZWQgY29tcG9uZW50LiAqL1xyXG4gIHByaXZhdGUgZ2V0Q29tcG9uZW50Um9vdE5vZGUoY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWY8YW55Pik6IEhUTUxFbGVtZW50IHtcclxuICAgIHJldHVybiAoY29tcG9uZW50UmVmLmhvc3RWaWV3IGFzIEVtYmVkZGVkVmlld1JlZjxhbnk+KS5yb290Tm9kZXNbMF0gYXMgSFRNTEVsZW1lbnQ7XHJcbiAgfVxyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBOYk92ZXJsYXkgZXh0ZW5kcyBPdmVybGF5IHtcclxuICBwcm90ZWN0ZWQgYXBwUmVmOiBBcHBsaWNhdGlvblJlZjtcclxuICBwcm90ZWN0ZWQgc3RhdGljIG5leHRVbmlxdWVJZCA9IDA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgLyogU2Nyb2xsaW5nIHN0cmF0ZWdpZXMgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIGNyZWF0aW5nIGFuIG92ZXJsYXkuICovXHJcbiAgICBwdWJsaWMgc2Nyb2xsU3RyYXRlZ2llczogU2Nyb2xsU3RyYXRlZ3lPcHRpb25zLFxyXG4gICAgcHJvdGVjdGVkIG92ZXJsYXlDb250YWluZXI6IE92ZXJsYXlDb250YWluZXIsXHJcbiAgICBwcm90ZWN0ZWQgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXHJcbiAgICBwcm90ZWN0ZWQgcG9zaXRpb25CdWlsZGVyOiBPdmVybGF5UG9zaXRpb25CdWlsZGVyLFxyXG4gICAgcHJvdGVjdGVkIGtleWJvYXJkRGlzcGF0Y2hlcjogT3ZlcmxheUtleWJvYXJkRGlzcGF0Y2hlcixcclxuICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICBwcm90ZWN0ZWQgbmdab25lOiBOZ1pvbmUsXHJcbiAgICBASW5qZWN0KE5CX0RPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBhbnksXHJcbiAgICBwcml2YXRlIGRpcmVjdGlvbmFsaXR5OiBEaXJlY3Rpb25hbGl0eSkge1xyXG4gICAgc3VwZXIoXHJcbiAgICAgIHNjcm9sbFN0cmF0ZWdpZXMsXHJcbiAgICAgIG92ZXJsYXlDb250YWluZXIsXHJcbiAgICAgIGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcixcclxuICAgICAgcG9zaXRpb25CdWlsZGVyLFxyXG4gICAgICBrZXlib2FyZERpc3BhdGNoZXIsXHJcbiAgICAgIGluamVjdG9yLFxyXG4gICAgICBuZ1pvbmUsXHJcbiAgICAgIGRvY3VtZW50LFxyXG4gICAgICBkaXJlY3Rpb25hbGl0eSxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIENyZWF0ZXMgYW4gb3ZlcmxheS5cclxuICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb24gYXBwbGllZCB0byB0aGUgb3ZlcmxheS5cclxuICAgKiBAcmV0dXJucyBSZWZlcmVuY2UgdG8gdGhlIGNyZWF0ZWQgb3ZlcmxheS5cclxuICAgKi9cclxuICBjcmVhdGUoY29uZmlnPzogT3ZlcmxheUNvbmZpZyk6IE92ZXJsYXlSZWYge1xyXG4gICAgY29uc3QgaG9zdCA9IHRoaXMuY3JlYXRlSG9zdEVsZW1lbnQoKTtcclxuICAgIGNvbnN0IHBhbmUgPSB0aGlzLmNyZWF0ZVBhbmVFbGVtZW50KGhvc3QpO1xyXG4gICAgY29uc3QgcG9ydGFsT3V0bGV0ID0gdGhpcy5jcmVhdGVQb3J0YWxPdXRsZXQocGFuZSk7XHJcbiAgICBjb25zdCBvdmVybGF5Q29uZmlnID0gbmV3IE92ZXJsYXlDb25maWcoY29uZmlnKTtcclxuXHJcbiAgICBvdmVybGF5Q29uZmlnLmRpcmVjdGlvbiA9IG92ZXJsYXlDb25maWcuZGlyZWN0aW9uIHx8IHRoaXMuZGlyZWN0aW9uYWxpdHkudmFsdWU7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBPdmVybGF5UmVmKHBvcnRhbE91dGxldCwgaG9zdCwgcGFuZSwgb3ZlcmxheUNvbmZpZywgdGhpcy5uZ1pvbmUsXHJcbiAgICAgIHRoaXMua2V5Ym9hcmREaXNwYXRjaGVyLCB0aGlzLmRvY3VtZW50KTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogQ3JlYXRlcyB0aGUgRE9NIGVsZW1lbnQgZm9yIGFuIG92ZXJsYXkgYW5kIGFwcGVuZHMgaXQgdG8gdGhlIG92ZXJsYXkgY29udGFpbmVyLlxyXG4gICAqIEByZXR1cm5zIE5ld2x5LWNyZWF0ZWQgcGFuZSBlbGVtZW50XHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGNyZWF0ZVBhbmVFbGVtZW50KGhvc3Q6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQge1xyXG4gICAgY29uc3QgcGFuZSA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcblxyXG4gICAgcGFuZS5pZCA9IGBjZGstb3ZlcmxheS0ke05iT3ZlcmxheS5uZXh0VW5pcXVlSWQrK31gO1xyXG4gICAgcGFuZS5jbGFzc0xpc3QuYWRkKCdjZGstb3ZlcmxheS1wYW5lJyk7XHJcbiAgICBob3N0LmFwcGVuZENoaWxkKHBhbmUpO1xyXG5cclxuICAgIHJldHVybiBwYW5lO1xyXG4gIH1cclxuXHJcbiAgLypcclxuICAgKiBDcmVhdGVzIHRoZSBob3N0IGVsZW1lbnQgdGhhdCB3cmFwcyBhcm91bmQgYW4gb3ZlcmxheVxyXG4gICAqIGFuZCBjYW4gYmUgdXNlZCBmb3IgYWR2YW5jZWQgcG9zaXRpb25pbmcuXHJcbiAgICogQHJldHVybnMgTmV3bHktY3JlYXRlIGhvc3QgZWxlbWVudC5cclxuICAgKi9cclxuICBwcm90ZWN0ZWQgY3JlYXRlSG9zdEVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgY29uc3QgaG9zdCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XHJcbiAgICB0aGlzLm92ZXJsYXlDb250YWluZXIuZ2V0Q29udGFpbmVyRWxlbWVudCgpLmFwcGVuZENoaWxkKGhvc3QpO1xyXG4gICAgcmV0dXJuIGhvc3Q7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIENyZWF0ZSBhIERvbVBvcnRhbE91dGxldCBpbnRvIHdoaWNoIHRoZSBvdmVybGF5IGNvbnRlbnQgY2FuIGJlIGxvYWRlZC5cclxuICAgKiBAcGFyYW0gcGFuZSBUaGUgRE9NIGVsZW1lbnQgdG8gdHVybiBpbnRvIGEgcG9ydGFsIG91dGxldC5cclxuICAgKiBAcmV0dXJucyBBIHBvcnRhbCBvdXRsZXQgZm9yIHRoZSBnaXZlbiBET00gZWxlbWVudC5cclxuICAgKi9cclxuICBwcm90ZWN0ZWQgY3JlYXRlUG9ydGFsT3V0bGV0KHBhbmU6IEhUTUxFbGVtZW50KTogTmJEb21Qb3J0YWxPdXRsZXQge1xyXG4gICAgLy8gV2UgaGF2ZSB0byByZXNvbHZlIHRoZSBBcHBsaWNhdGlvblJlZiBsYXRlciBpbiBvcmRlciB0byBhbGxvdyBwZW9wbGVcclxuICAgIC8vIHRvIHVzZSBvdmVybGF5LWJhc2VkIHByb3ZpZGVycyBkdXJpbmcgYXBwIGluaXRpYWxpemF0aW9uLlxyXG4gICAgaWYgKCF0aGlzLmFwcFJlZikge1xyXG4gICAgICB0aGlzLmFwcFJlZiA9IHRoaXMuaW5qZWN0b3IuZ2V0PEFwcGxpY2F0aW9uUmVmPihBcHBsaWNhdGlvblJlZik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG5ldyBOYkRvbVBvcnRhbE91dGxldChwYW5lLCB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgdGhpcy5hcHBSZWYsIHRoaXMuaW5qZWN0b3IpO1xyXG4gIH1cclxufVxyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTmJQbGF0Zm9ybSBleHRlbmRzIFBsYXRmb3JtIHtcclxufVxyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgTmJPdmVybGF5UG9zaXRpb25CdWlsZGVyIGV4dGVuZHMgT3ZlcmxheVBvc2l0aW9uQnVpbGRlciB7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOYlRlbXBsYXRlUG9ydGFsPFQgPSBhbnk+IGV4dGVuZHMgVGVtcGxhdGVQb3J0YWw8VD4ge1xyXG4gIGNvbnN0cnVjdG9yKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxUPiwgdmlld0NvbnRhaW5lclJlZj86IFZpZXdDb250YWluZXJSZWYsIGNvbnRleHQ/OiBUKSB7XHJcbiAgICBzdXBlcih0ZW1wbGF0ZSwgdmlld0NvbnRhaW5lclJlZiwgY29udGV4dCk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgTmJPdmVybGF5Q29udGFpbmVyIGV4dGVuZHMgT3ZlcmxheUNvbnRhaW5lciB7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOYkZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSBleHRlbmRzIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneSB7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOYlBvcnRhbEluamVjdG9yIGV4dGVuZHMgUG9ydGFsSW5qZWN0b3Ige1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBOYlBvcnRhbDxUID0gYW55PiA9IFBvcnRhbDxUPjtcclxuZXhwb3J0IHR5cGUgTmJPdmVybGF5UmVmID0gT3ZlcmxheVJlZjtcclxuZXhwb3J0IHR5cGUgTmJDb21wb25lbnRUeXBlPFQgPSBhbnk+ID0gQ29tcG9uZW50VHlwZTxUPjtcclxuZXhwb3J0IHR5cGUgTmJQb3NpdGlvblN0cmF0ZWd5ID0gUG9zaXRpb25TdHJhdGVneTtcclxuZXhwb3J0IHR5cGUgTmJDb25uZWN0ZWRQb3NpdGlvbiA9IENvbm5lY3RlZFBvc2l0aW9uO1xyXG5leHBvcnQgdHlwZSBOYkNvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbkNoYW5nZSA9IENvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbkNoYW5nZTtcclxuZXhwb3J0IHR5cGUgTmJDb25uZWN0aW9uUG9zaXRpb25QYWlyID0gQ29ubmVjdGlvblBvc2l0aW9uUGFpcjtcclxuZXhwb3J0IHR5cGUgTmJPdmVybGF5Q29uZmlnID0gT3ZlcmxheUNvbmZpZztcclxuZXhwb3J0IHR5cGUgTmJTY3JvbGxTdHJhdGVneU9wdGlvbnMgPSBTY3JvbGxTdHJhdGVneU9wdGlvbnM7XHJcbmV4cG9ydCB0eXBlIE5iU2Nyb2xsU3RyYXRlZ3kgPSBTY3JvbGxTdHJhdGVneTtcclxuXHJcbmNvbnN0IENES19NT0RVTEVTID0gW092ZXJsYXlNb2R1bGUsIFBvcnRhbE1vZHVsZV07XHJcblxyXG4vKlxyXG4gKiBUaGlzIG1vZHVsZSBoZWxwcyB1cyB0byBrZWVwIGFsbCBhbmd1bGFyL2NkayBkZXBzIGluc2lkZSBvdXIgY2RrIG1vZHVsZSB2aWEgcHJvdmlkaW5nIGFsaWFzZXMuXHJcbiAqIEFwcHJvYWNoIHdpbGwgaGVscCB1cyBtb3ZlIGNkayBpbiBzZXBhcmF0ZSBucG0gcGFja2FnZSBhbmQgcmVmYWN0b3IgbmVidWxhci90aGVtZSBjb2RlLlxyXG4gKiAqL1xyXG5ATmdNb2R1bGUoe1xyXG4gIGltcG9ydHM6IFsuLi5DREtfTU9EVUxFU10sXHJcbiAgZXhwb3J0czogW1xyXG4gICAgLi4uQ0RLX01PRFVMRVMsXHJcbiAgICBOYlBvcnRhbERpcmVjdGl2ZSxcclxuICAgIE5iUG9ydGFsT3V0bGV0RGlyZWN0aXZlLFxyXG4gIF0sXHJcbiAgZGVjbGFyYXRpb25zOiBbTmJQb3J0YWxEaXJlY3RpdmUsIE5iUG9ydGFsT3V0bGV0RGlyZWN0aXZlXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5iQ2RrTWFwcGluZ01vZHVsZSB7XHJcbiAgc3RhdGljIGZvclJvb3QoKTogTW9kdWxlV2l0aFByb3ZpZGVycyB7XHJcbiAgICByZXR1cm4gPE1vZHVsZVdpdGhQcm92aWRlcnM+IHtcclxuICAgICAgbmdNb2R1bGU6IE5iQ2RrTWFwcGluZ01vZHVsZSxcclxuICAgICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAgTmJPdmVybGF5LFxyXG4gICAgICAgIE5iUGxhdGZvcm0sXHJcbiAgICAgICAgTmJPdmVybGF5UG9zaXRpb25CdWlsZGVyLFxyXG4gICAgICBdLFxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuIl19