UNPKG

@covalent/core

Version:

Core Teradata UI Platform for layouts, icons, custom components and themes. This should be added as a dependency for any project that wants to use layouts, icons and themes for Angular Material.

236 lines 36.9 kB
/* tslint:disable */ import { Directive, Inject, Injectable, InjectFlags, InjectionToken, Injector, Optional, SkipSelf, TemplateRef, Type, } from '@angular/core'; import { Overlay, OverlayConfig, } from '@angular/cdk/overlay'; import { ComponentPortal, TemplatePortal, } from '@angular/cdk/portal'; import { MAT_DIALOG_DATA, MAT_DIALOG_DEFAULT_OPTIONS, } from '@angular/material/dialog'; import { AnimationCurves, AnimationDurations } from '@angular/material/core'; import { CovalentSideSheetContainerComponent, } from './side-sheet-container'; import { Subject, of } from 'rxjs'; import { filter, take } from 'rxjs/operators'; import { Directionality } from '@angular/cdk/bidi'; import { CovalentSideSheetRef } from './side-sheet-ref'; import { SubPageMode, CovalentSideSheetConfig } from './side-sheet.config'; import * as i0 from "@angular/core"; import * as i1 from "@angular/cdk/overlay"; import * as i2 from "./side-sheet.config"; export class _CovalentSideSheetBase { _overlay; _injector; _defaultOptions; _parentSideSheet; _sideSheetRefConstructor; _sideSheetContainerType; _sideSheetDataToken; _openSideSheetsAtThisLevel = []; _afterAllClosedAtThisLevel = new Subject(); _afterOpenedAtThisLevel = new Subject(); _animationStateSubscriptions; defaultSidebarConfig = { minWidth: '400px', maxWidth: '100vw', }; constructor(_overlay, _injector, _defaultOptions, _parentSideSheet, _sideSheetRefConstructor, _sideSheetContainerType, _sideSheetDataToken) { this._overlay = _overlay; this._injector = _injector; this._defaultOptions = _defaultOptions; this._parentSideSheet = _parentSideSheet; this._sideSheetRefConstructor = _sideSheetRefConstructor; this._sideSheetContainerType = _sideSheetContainerType; this._sideSheetDataToken = _sideSheetDataToken; } /** Keeps track of the currently-open side-sheets. */ get openSideSheets() { return this._parentSideSheet ? this._parentSideSheet.openSideSheets : this._openSideSheetsAtThisLevel; } open(componentOrTemplateRef, config) { config = { ...(this._defaultOptions || new CovalentSideSheetConfig()), ...this.defaultSidebarConfig, ...config, }; const overlayRef = this._createOverlay(config); const sideSheetContainer = this._attachSideSheetContainer(overlayRef, config); const sideSheetRef = this._attachSideSheetContent(componentOrTemplateRef, sideSheetContainer, overlayRef, config); const prevSideSheetRef = this.openSideSheets.slice(-1)[0]; const prevOverlayRef = prevSideSheetRef?.overlayRef; if (prevOverlayRef?.overlayElement && config.subPageMode !== SubPageMode.none) { prevOverlayRef.overlayElement.style.transition = `${AnimationDurations.COMPLEX} ${AnimationCurves.DECELERATION_CURVE}`; if (config.subPageMode === SubPageMode.pushed) { // Animate previous side sheet to full width prevOverlayRef.overlayElement.style.minWidth = `${window.innerWidth}px`; } else if (config.subPageMode === SubPageMode.shifted) { // Animate previous side sheet to current sidesheet width + 200px prevOverlayRef.overlayElement.style.minWidth = `${sideSheetRef.overlayRef.overlayElement.offsetWidth + 200}px`; } } // Revert the previous side sheet config & size sideSheetRef._containerInstance._animationStateChanged .pipe(filter((event) => event.state === 'closing' && !!(prevSideSheetRef && prevOverlayRef)), take(1)) .subscribe(() => { prevOverlayRef.overlayElement.style.transition = `${AnimationDurations.EXITING} ${AnimationCurves.DECELERATION_CURVE}`; prevSideSheetRef.updateSize(); }); // Add new side sheet to open list this.openSideSheets.push(sideSheetRef); // Remove side sheet ref after closed sideSheetRef .afterClosed() .pipe(take(1)) .subscribe(() => this._removeOpenSideSheet(sideSheetRef)); // Notify the side-sheet container that the content has been attached. sideSheetContainer._initializeWithAttachedContent(); return sideSheetRef; } ngOnDestroy() { // Only close the side-sheets at this level on destroy // since the parent service may still be active. this._closeSideSheets(this._openSideSheetsAtThisLevel); this._afterAllClosedAtThisLevel.complete(); this._afterOpenedAtThisLevel.complete(); // Clean up any subscriptions to side-sheet that never finished opening. if (this._animationStateSubscriptions) { this._animationStateSubscriptions.unsubscribe(); } } /** * Closes all of the currently-open side-sheets. */ closeAll() { this._closeSideSheets(this.openSideSheets); } _createOverlay(config) { const overlayConfig = new OverlayConfig({ positionStrategy: this._overlay.position().global(), scrollStrategy: this._overlay.scrollStrategies.block(), panelClass: config.panelClass, hasBackdrop: config.hasBackdrop, direction: config.direction, minWidth: config.minWidth, minHeight: config.minHeight, maxWidth: config.maxWidth, }); const overlayRef = this._overlay.create(overlayConfig); const positionStrategy = overlayRef.getConfig() .positionStrategy; positionStrategy.right('0px'); return overlayRef; } /** * Attaches a container to a side-sheets's already-created overlay. * @param overlay Reference to the side-sheet's underlying overlay. * @param config The side-sheet configuration. * @returns A promise resolving to a ComponentRef for the attached container. */ _attachSideSheetContainer(overlay, config) { const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector; const injector = Injector.create({ parent: userInjector || this._injector, providers: [{ provide: CovalentSideSheetConfig, useValue: config }], }); const containerPortal = new ComponentPortal(this._sideSheetContainerType, config.viewContainerRef, injector, config.componentFactoryResolver); const containerRef = overlay.attach(containerPortal); return containerRef.instance; } /** * Attaches the user-provided component to the already-created side sheet container. * @param componentOrTemplateRef The type of component being loaded into the side-sheet, * or a TemplateRef to instantiate as the content. * @param dialogContainer Reference to the wrapping side-sheet container. * @param overlayRef Reference to the overlay in which the side-sheet resides. * @param config The side-sheet configuration. * @returns A promise resolving to the CovalentSideSheetRef that should be returned to the user. */ _attachSideSheetContent(componentOrTemplateRef, sideSheetContainer, overlayRef, config) { // Create a reference to the side-sheet we're creating in order to give the user a handle // to modify and close it. const sideSheetRef = new this._sideSheetRefConstructor(overlayRef, config, sideSheetContainer, config.id); if (componentOrTemplateRef instanceof TemplateRef) { sideSheetContainer.attachTemplatePortal( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion new TemplatePortal(componentOrTemplateRef, null, { $implicit: config.data, sideSheetRef, })); } else { const injector = this._createInjector(config, sideSheetRef, sideSheetContainer); const contentRef = sideSheetContainer.attach(new ComponentPortal(componentOrTemplateRef, config.viewContainerRef, injector)); sideSheetRef.componentInstance = contentRef.instance; } sideSheetRef.updateSize(config.width, config.height); return sideSheetRef; } _createInjector(config, sideSheetRef, sideSheetContainer) { const userInjector = config && config.viewContainerRef && config.viewContainerRef.injector; // The side-sheet container should be provided as the side-sheet container and the side-sheet's // content are created out of the same `ViewContainerRef` and as such, are siblings // for injector purposes. To allow the hierarchy that is expected, the side-sheet // container is explicitly provided in the injector. const providers = [ { provide: this._sideSheetContainerType, useValue: sideSheetContainer }, { provide: this._sideSheetDataToken, useValue: config.data }, { provide: this._sideSheetRefConstructor, useValue: sideSheetRef }, ]; if (config.direction && (!userInjector || !userInjector.get(Directionality, null, InjectFlags.Optional))) { providers.push({ provide: Directionality, useValue: { value: config.direction, change: of() }, }); } return Injector.create({ parent: userInjector || this._injector, providers, }); } /** * Removes a side sheet from the array of open side sheets. * @param sideSheetRef Side Sheet to be removed. */ _removeOpenSideSheet(sideSheetRef) { const index = this.openSideSheets.indexOf(sideSheetRef); if (index > -1) { this.openSideSheets.splice(index, 1); } } /** Closes all of the side-sheet in an array. */ _closeSideSheets(sideSheets) { let i = sideSheets.length; while (i--) { sideSheets[i].close(); } } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: _CovalentSideSheetBase, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive }); static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.1.2", type: _CovalentSideSheetBase, ngImport: i0 }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: _CovalentSideSheetBase, decorators: [{ type: Directive }], ctorParameters: () => [{ type: i1.Overlay }, { type: i0.Injector }, { type: undefined }, { type: undefined }, { type: i0.Type }, { type: i0.Type }, { type: i0.InjectionToken }] }); /** * Service to open Covalent Design side-sheet. */ export class CovalentSideSheet extends _CovalentSideSheetBase { constructor(overlay, injector, defaultOptions, parentSideSheet) { super(overlay, injector, defaultOptions, parentSideSheet, CovalentSideSheetRef, CovalentSideSheetContainerComponent, MAT_DIALOG_DATA); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CovalentSideSheet, deps: [{ token: i1.Overlay }, { token: i0.Injector }, { token: MAT_DIALOG_DEFAULT_OPTIONS, optional: true }, { token: CovalentSideSheet, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.Injectable }); static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CovalentSideSheet }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: CovalentSideSheet, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: i1.Overlay }, { type: i0.Injector }, { type: i2.CovalentSideSheetConfig, decorators: [{ type: Optional }, { type: Inject, args: [MAT_DIALOG_DEFAULT_OPTIONS] }] }, { type: CovalentSideSheet, decorators: [{ type: Optional }, { type: SkipSelf }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZS1zaGVldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci9zaWRlLXNoZWV0L3NyYy9zaWRlLXNoZWV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9CQUFvQjtBQUNwQixPQUFPLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixVQUFVLEVBQ1YsV0FBVyxFQUNYLGNBQWMsRUFDZCxRQUFRLEVBRVIsUUFBUSxFQUNSLFFBQVEsRUFFUixXQUFXLEVBQ1gsSUFBSSxHQUNMLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxPQUFPLEVBQ1AsYUFBYSxHQUdkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLGVBQWUsRUFFZixjQUFjLEdBQ2YsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsZUFBZSxFQUNmLDBCQUEwQixHQUMzQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RSxPQUFPLEVBQ0wsbUNBQW1DLEdBRXBDLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxXQUFXLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7OztBQUczRSxNQUFNLE9BQU8sc0JBQXNCO0lBZ0J2QjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQW5CRiwwQkFBMEIsR0FBb0MsRUFBRSxDQUFDO0lBQ3hELDBC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QUdHO0lBQ0ssb0JBQW9CLENBQUMsWUFBMkM7UUFDdEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFeEQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2QyxDQUFDO0lBQ0gsQ0FBQztJQUVELGdEQUFnRDtJQUN4QyxnQkFBZ0IsQ0FBQyxVQUF1QztRQUM5RCxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBRTFCLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNYLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QixDQUFDO0lBQ0gsQ0FBQzt1R0F6UlUsc0JBQXNCOzJGQUF0QixzQkFBc0I7OzJGQUF0QixzQkFBc0I7a0JBRGxDLFNBQVM7O0FBNlJWOztHQUVHO0FBRUgsTUFBTSxPQUFPLGlCQUFrQixTQUFRLHNCQUEyRDtJQUNoRyxZQUNFLE9BQWdCLEVBQ2hCLFFBQWtCLEVBR2xCLGNBQXVDLEVBQ2YsZUFBa0M7UUFFMUQsS0FBSyxDQUNILE9BQU8sRUFDUCxRQUFRLEVBQ1IsY0FBYyxFQUNkLGVBQWUsRUFDZixvQkFBb0IsRUFDcEIsbUNBQW1DLEVBQ25DLGVBQWUsQ0FDaEIsQ0FBQztJQUNKLENBQUM7dUdBbEJVLGlCQUFpQixpRUFLbEIsMEJBQTBCOzJHQUx6QixpQkFBaUI7OzJGQUFqQixpQkFBaUI7a0JBRDdCLFVBQVU7OzBCQUtOLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsMEJBQTBCOzswQkFFakMsUUFBUTs7MEJBQUksUUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlICovXG5pbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIEluamVjdCxcbiAgSW5qZWN0YWJsZSxcbiAgSW5qZWN0RmxhZ3MsXG4gIEluamVjdGlvblRva2VuLFxuICBJbmplY3RvcixcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgU2tpcFNlbGYsXG4gIFN0YXRpY1Byb3ZpZGVyLFxuICBUZW1wbGF0ZVJlZixcbiAgVHlwZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBPdmVybGF5LFxuICBPdmVybGF5Q29uZmlnLFxuICBPdmVybGF5UmVmLFxuICBHbG9iYWxQb3NpdGlvblN0cmF0ZWd5LFxufSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQge1xuICBDb21wb25lbnRQb3J0YWwsXG4gIENvbXBvbmVudFR5cGUsXG4gIFRlbXBsYXRlUG9ydGFsLFxufSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7XG4gIE1BVF9ESUFMT0dfREFUQSxcbiAgTUFUX0RJQUxPR19ERUZBVUxUX09QVElPTlMsXG59IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBBbmltYXRpb25DdXJ2ZXMsIEFuaW1hdGlvbkR1cmF0aW9ucyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xuaW1wb3J0IHtcbiAgQ292YWxlbnRTaWRlU2hlZXRDb250YWluZXJDb21wb25lbnQsXG4gIF9Db3ZhbGVudFNpZGVTaGVldENvbnRhaW5lckJhc2UsXG59IGZyb20gJy4vc2lkZS1zaGVldC1jb250YWluZXInO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRGlyZWN0aW9uYWxpdHkgfSBmcm9tICdAYW5ndWxhci9jZGsvYmlkaSc7XG5cbmltcG9ydCB7IENvdmFsZW50U2lkZVNoZWV0UmVmIH0gZnJvbSAnLi9zaWRlLXNoZWV0LXJlZic7XG5pbXBvcnQgeyBTdWJQYWdlTW9kZSwgQ292YWxlbnRTaWRlU2hlZXRDb25maWcgfSBmcm9tICcuL3NpZGUtc2hlZXQuY29uZmlnJztcblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgY2xhc3MgX0NvdmFsZW50U2lkZVNoZWV0QmFzZTxDIGV4dGVuZHMgX0NvdmFsZW50U2lkZVNoZWV0Q29udGFpbmVyQmFzZT5cbiAgaW1wbGVtZW50cyBPbkRlc3Ryb3lcbntcbiAgcHJpdmF0ZSBfb3BlblNpZGVTaGVldHNBdFRoaXNMZXZlbDogQ292YWxlbnRTaWRlU2hlZXRSZWY8dW5rbm93bj5bXSA9IFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IF9hZnRlckFsbENsb3NlZEF0VGhpc0xldmVsID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfYWZ0ZXJPcGVuZWRBdFRoaXNMZXZlbCA9IG5ldyBTdWJqZWN0PFxuICAgIENvdmFsZW50U2lkZVNoZWV0UmVmPHVua25vd24+XG4gID4oKTtcbiAgcHJpdmF0ZSBfYW5pbWF0aW9uU3RhdGVTdWJzY3JpcHRpb25zITogU3Vic2NyaXB0aW9uO1xuXG4gIHByaXZhdGUgZGVmYXVsdFNpZGViYXJDb25maWcgPSB7XG4gICAgbWluV2lkdGg6ICc0MDBweCcsXG4gICAgbWF4V2lkdGg6ICcxMDB2dycsXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfb3ZlcmxheTogT3ZlcmxheSxcbiAgICBwcml2YXRlIF9pbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBfZGVmYXVsdE9wdGlvbnM6IENvdmFsZW50U2lkZVNoZWV0Q29uZmlnIHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgX3BhcmVudFNpZGVTaGVldDogX0NvdmFsZW50U2lkZVNoZWV0QmFzZTxDPiB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIF9zaWRlU2hlZXRSZWZDb25zdHJ1Y3RvcjogVHlwZTxDb3ZhbGVudFNpZGVTaGVldFJlZjxhbnk+PixcbiAgICBwcml2YXRlIF9zaWRlU2hlZXRDb250YWluZXJUeXBlOiBUeXBlPEM+LFxuICAgIHByaXZhdGUgX3NpZGVTaGVldERhdGFUb2tlbjogSW5qZWN0aW9uVG9rZW48dW5rbm93bj5cbiAgKSB7fVxuXG4gIC8qKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudGx5LW9wZW4gc2lkZS1zaGVldHMuICovXG4gIGdldCBvcGVuU2lkZVNoZWV0cygpOiBDb3ZhbGVudFNpZGVTaGVldFJlZjx1bmtub3duPltdIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50U2lkZVNoZWV0XG4gICAgICA/IHRoaXMuX3BhcmVudFNpZGVTaGVldC5vcGVuU2lkZVNoZWV0c1xuICAgICAgOiB0aGlzLl9vcGVuU2lkZVNoZWV0c0F0VGhpc0xldmVsO1xuICB9XG5cbiAgb3BlbjxULCBEID0gdW5rbm93biwgUiA9IHVua25vd24+KFxuICAgIGNvbXBvbmVudE9yVGVtcGxhdGVSZWY6IENvbXBvbmVudFR5cGU8VD4gfCBUZW1wbGF0ZVJlZjxUPixcbiAgICBjb25maWc/OiBDb3ZhbGVudFNpZGVTaGVldENvbmZpZzxEPlxuICApOiBDb3ZhbGVudFNpZGVTaGVldFJlZjxULCBSPiB7XG4gICAgY29uZmlnID0ge1xuICAgICAgLi4uKHRoaXMuX2RlZmF1bHRPcHRpb25zIHx8IG5ldyBDb3ZhbGVudFNpZGVTaGVldENvbmZpZygpKSxcbiAgICAgIC4uLnRoaXMuZGVmYXVsdFNpZGViYXJDb25maWcsXG4gICAgICAuLi5jb25maWcsXG4gICAgfTtcblxuICAgIGNvbnN0IG92ZXJsYXlSZWYgPSB0aGlzLl9jcmVhdGVPdmVybGF5KGNvbmZpZyk7XG4gICAgY29uc3Qgc2lkZVNoZWV0Q29udGFpbmVyID0gdGhpcy5fYXR0YWNoU2lkZVNoZWV0Q29udGFpbmVyKFxuICAgICAgb3ZlcmxheVJlZixcbiAgICAgIGNvbmZpZ1xuICAgICk7XG4gICAgY29uc3Qgc2lkZVNoZWV0UmVmID0gdGhpcy5fYXR0YWNoU2lkZVNoZWV0Q29udGVudDxULCBSPihcbiAgICAgIGNvbXBvbmVudE9yVGVtcGxhdGVSZWYsXG4gICAgICBzaWRlU2hlZXRDb250YWluZXIsXG4gICAgICBvdmVybGF5UmVmLFxuICAgICAgY29uZmlnXG4gICAgKTtcbiAgICBjb25zdCBwcmV2U2lkZVNoZWV0UmVmOiBDb3ZhbGVudFNpZGVTaGVldFJlZjx1bmtub3duPiA9XG4gICAgICB0aGlzLm9wZW5TaWRlU2hlZXRzLnNsaWNlKC0xKVswXTtcbiAgICBjb25zdCBwcmV2T3ZlcmxheVJlZiA9IHByZXZTaWRlU2hlZXRSZWY/Lm92ZXJsYXlSZWY7XG5cbiAgICBpZiAoXG4gICAgICBwcmV2T3ZlcmxheVJlZj8ub3ZlcmxheUVsZW1lbnQgJiZcbiAgICAgIGNvbmZpZy5zdWJQYWdlTW9kZSAhPT0gU3ViUGFnZU1vZGUubm9uZVxuICAgICkge1xuICAgICAgcHJldk92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuc3R5bGUudHJhbnNpdGlvbiA9IGAke0FuaW1hdGlvbkR1cmF0aW9ucy5DT01QTEVYfSAke0FuaW1hdGlvbkN1cnZlcy5ERUNFTEVSQVRJT05fQ1VSVkV9YDtcbiAgICAgIGlmIChjb25maWcuc3ViUGFnZU1vZGUgPT09IFN1YlBhZ2VNb2RlLnB1c2hlZCkge1xuICAgICAgICAvLyBBbmltYXRlIHByZXZpb3VzIHNpZGUgc2hlZXQgdG8gZnVsbCB3aWR0aFxuICAgICAgICBwcmV2T3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5zdHlsZS5taW5XaWR0aCA9IGAke1xuICAgICAgICAgICh3aW5kb3cgYXMgYW55KS5pbm5lcldpZHRoXG4gICAgICAgIH1weGA7XG4gICAgICB9IGVsc2UgaWYgKGNvbmZpZy5zdWJQYWdlTW9kZSA9PT0gU3ViUGFnZU1vZGUuc2hpZnRlZCkge1xuICAgICAgICAvLyBBbmltYXRlIHByZXZpb3VzIHNpZGUgc2hlZXQgdG8gY3VycmVudCBzaWRlc2hlZXQgd2lkdGggKyAyMDBweFxuICAgICAgICBwcmV2T3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5zdHlsZS5taW5XaWR0aCA9IGAke1xuICAgICAgICAgIHNpZGVTaGVldFJlZi5vdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50Lm9mZnNldFdpZHRoICsgMjAwXG4gICAgICAgIH1weGA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV2ZXJ0IHRoZSBwcmV2aW91cyBzaWRlIHNoZWV0IGNvbmZpZyAmIHNpemVcbiAgICBzaWRlU2hlZXRSZWYuX2NvbnRhaW5lckluc3RhbmNlLl9hbmltYXRpb25TdGF0ZUNoYW5nZWRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgKGV2ZW50KSA9PlxuICAgICAgICAgICAgZXZlbnQuc3RhdGUgPT09ICdjbG9zaW5nJyAmJiAhIShwcmV2U2lkZVNoZWV0UmVmICYmIHByZXZPdmVybGF5UmVmKVxuICAgICAgICApLFxuICAgICAgICB0YWtlKDEpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgcHJldk92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuc3R5bGUudHJhbnNpdGlvbiA9IGAke0FuaW1hdGlvbkR1cmF0aW9ucy5FWElUSU5HfSAke0FuaW1hdGlvbkN1cnZlcy5ERUNFTEVSQVRJT05fQ1VSVkV9YDtcbiAgICAgICAgcHJldlNpZGVTaGVldFJlZi51cGRhdGVTaXplKCk7XG4gICAgICB9KTtcblxuICAgIC8vIEFkZCBuZXcgc2lkZSBzaGVldCB0byBvcGVuIGxpc3RcbiAgICB0aGlzLm9wZW5TaWRlU2hlZXRzLnB1c2goc2lkZVNoZWV0UmVmKTtcblxuICAgIC8vIFJlbW92ZSBzaWRlIHNoZWV0IHJlZiBhZnRlciBjbG9zZWRcbiAgICBzaWRlU2hlZXRSZWZcbiAgICAgIC5hZnRlckNsb3NlZCgpXG4gICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLl9yZW1vdmVPcGVuU2lkZVNoZWV0KHNpZGVTaGVldFJlZikpO1xuXG4gICAgLy8gTm90aWZ5IHRoZSBzaWRlLXNoZWV0IGNvbnRhaW5lciB0aGF0IHRoZSBjb250ZW50IGhhcyBiZWVuIGF0dGFjaGVkLlxuICAgIHNpZGVTaGVldENvbnRhaW5lci5faW5pdGlhbGl6ZVdpdGhBdHRhY2hlZENvbnRlbnQoKTtcblxuICAgIHJldHVybiBzaWRlU2hlZXRSZWY7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICAvLyBPbmx5IGNsb3NlIHRoZSBzaWRlLXNoZWV0cyBhdCB0aGlzIGxldmVsIG9uIGRlc3Ryb3lcbiAgICAvLyBzaW5jZSB0aGUgcGFyZW50IHNlcnZpY2UgbWF5IHN0aWxsIGJlIGFjdGl2ZS5cbiAgICB0aGlzLl9jbG9zZVNpZGVTaGVldHModGhpcy5fb3BlblNpZGVTaGVldHNBdFRoaXNMZXZlbCk7XG4gICAgdGhpcy5fYWZ0ZXJBbGxDbG9zZWRBdFRoaXNMZXZlbC5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX2FmdGVyT3BlbmVkQXRUaGlzTGV2ZWwuY29tcGxldGUoKTtcbiAgICAvLyBDbGVhbiB1cCBhbnkgc3Vic2NyaXB0aW9ucyB0byBzaWRlLXNoZWV0IHRoYXQgbmV2ZXIgZmluaXNoZWQgb3BlbmluZy5cbiAgICBpZiAodGhpcy5fYW5pbWF0aW9uU3RhdGVTdWJzY3JpcHRpb25zKSB7XG4gICAgICB0aGlzLl9hbmltYXRpb25TdGF0ZVN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2xvc2VzIGFsbCBvZiB0aGUgY3VycmVudGx5LW9wZW4gc2lkZS1zaGVldHMuXG4gICAqL1xuICBjbG9zZUFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLl9jbG9zZVNpZGVTaGVldHModGhpcy5vcGVuU2lkZVNoZWV0cyk7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVPdmVybGF5PFQ+KGNvbmZpZzogQ292YWxlbnRTaWRlU2hlZXRDb25maWcpOiBPdmVybGF5UmVmIHtcbiAgICBjb25zdCBvdmVybGF5Q29uZmlnID0gbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5fb3ZlcmxheS5wb3NpdGlvbigpLmdsb2JhbCgpLFxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMuX292ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5ibG9jaygpLFxuICAgICAgcGFuZWxDbGFzczogY29uZmlnLnBhbmVsQ2xhc3MsXG4gICAgICBoYXNCYWNrZHJvcDogY29uZmlnLmhhc0JhY2tkcm9wLFxuICAgICAgZGlyZWN0aW9uOiBjb25maWcuZGlyZWN0aW9uLFxuICAgICAgbWluV2lkdGg6IGNvbmZpZy5taW5XaWR0aCxcbiAgICAgIG1pbkhlaWdodDogY29uZmlnLm1pbkhlaWdodCxcbiAgICAgIG1heFdpZHRoOiBjb25maWcubWF4V2lkdGgsXG4gICAgfSk7XG4gICAgY29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMuX292ZXJsYXkuY3JlYXRlKG92ZXJsYXlDb25maWcpO1xuICAgIGNvbnN0IHBvc2l0aW9uU3RyYXRlZ3kgPSBvdmVybGF5UmVmLmdldENvbmZpZygpXG4gICAgICAucG9zaXRpb25TdHJhdGVneSBhcyBHbG9iYWxQb3NpdGlvblN0cmF0ZWd5O1xuICAgIHBvc2l0aW9uU3RyYXRlZ3kucmlnaHQoJzBweCcpO1xuXG4gICAgcmV0dXJuIG92ZXJsYXlSZWY7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoZXMgYSBjb250YWluZXIgdG8gYSBzaWRlLXNoZWV0cydzIGFscmVhZHktY3JlYXRlZCBvdmVybGF5LlxuICAgKiBAcGFyYW0gb3ZlcmxheSBSZWZlcmVuY2UgdG8gdGhlIHNpZGUtc2hlZXQncyB1bmRlcmx5aW5nIG92ZXJsYXkuXG4gICAqIEBwYXJhbSBjb25maWcgVGhlIHNpZGUtc2hlZXQgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHJlc29sdmluZyB0byBhIENvbXBvbmVudFJlZiBmb3IgdGhlIGF0dGFjaGVkIGNvbnRhaW5lci5cbiAgICovXG4gIHByaXZhdGUgX2F0dGFjaFNpZGVTaGVldENvbnRhaW5lcihcbiAgICBvdmVybGF5OiBPdmVybGF5UmVmLFxuICAgIGNvbmZpZzogQ292YWxlbnRTaWRlU2hlZXRDb25maWdcbiAgKTogQyB7XG4gICAgY29uc3QgdXNlckluamVjdG9yID1cbiAgICAgIGNvbmZpZyAmJiBjb25maWcudmlld0NvbnRhaW5lclJlZiAmJiBjb25maWcudmlld0NvbnRhaW5lclJlZi5pbmplY3RvcjtcbiAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICBwYXJlbnQ6IHVzZXJJbmplY3RvciB8fCB0aGlzLl9pbmplY3RvcixcbiAgICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogQ292YWxlbnRTaWRlU2hlZXRDb25maWcsIHVzZVZhbHVlOiBjb25maWcgfV0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBjb250YWluZXJQb3J0YWwgPSBuZXcgQ29tcG9uZW50UG9ydGFsKFxuICAgICAgdGhpcy5fc2lkZVNoZWV0Q29udGFpbmVyVHlwZSxcbiAgICAgIGNvbmZpZy52aWV3Q29udGFpbmVyUmVmLFxuICAgICAgaW5qZWN0b3IsXG4gICAgICBjb25maWcuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyXG4gICAgKTtcbiAgICBjb25zdCBjb250YWluZXJSZWYgPSBvdmVybGF5LmF0dGFjaDxDPihjb250YWluZXJQb3J0YWwpO1xuXG4gICAgcmV0dXJuIGNvbnRhaW5lclJlZi5pbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2hlcyB0aGUgdXNlci1wcm92aWRlZCBjb21wb25lbnQgdG8gdGhlIGFscmVhZHktY3JlYXRlZCBzaWRlIHNoZWV0IGNvbnRhaW5lci5cbiAgICogQHBhcmFtIGNvbXBvbmVudE9yVGVtcGxhdGVSZWYgVGhlIHR5cGUgb2YgY29tcG9uZW50IGJlaW5nIGxvYWRlZCBpbnRvIHRoZSBzaWRlLXNoZWV0LFxuICAgKiAgICAgb3IgYSBUZW1wbGF0ZVJlZiB0byBpbnN0YW50aWF0ZSBhcyB0aGUgY29udGVudC5cbiAgICogQHBhcmFtIGRpYWxvZ0NvbnRhaW5lciBSZWZlcmVuY2UgdG8gdGhlIHdyYXBwaW5nIHNpZGUtc2hlZXQgY29udGFpbmVyLlxuICAgKiBAcGFyYW0gb3ZlcmxheVJlZiBSZWZlcmVuY2UgdG8gdGhlIG92ZXJsYXkgaW4gd2hpY2ggdGhlIHNpZGUtc2hlZXQgcmVzaWRlcy5cbiAgICogQHBhcmFtIGNvbmZpZyBUaGUgc2lkZS1zaGVldCBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBDb3ZhbGVudFNpZGVTaGVldFJlZiB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCB0byB0aGUgdXNlci5cbiAgICovXG4gIHByaXZhdGUgX2F0dGFjaFNpZGVTaGVldENvbnRlbnQ8VCwgUj4oXG4gICAgY29tcG9uZW50T3JUZW1wbGF0ZVJlZjogQ29tcG9uZW50VHlwZTxUPiB8IFRlbXBsYXRlUmVmPFQ+LFxuICAgIHNpZGVTaGVldENvbnRhaW5lcjogQyxcbiAgICBvdmVybGF5UmVmOiBPdmVybGF5UmVmLFxuICAgIGNvbmZpZzogQ292YWxlbnRTaWRlU2hlZXRDb25maWdcbiAgKTogQ292YWxlbnRTaWRlU2hlZXRSZWY8VCwgUj4ge1xuICAgIC8vIENyZWF0ZSBhIHJlZmVyZW5jZSB0byB0aGUgc2lkZS1zaGVldCB3ZSdyZSBjcmVhdGluZyBpbiBvcmRlciB0byBnaXZlIHRoZSB1c2VyIGEgaGFuZGxlXG4gICAgLy8gdG8gbW9kaWZ5IGFuZCBjbG9zZSBpdC5cbiAgICBjb25zdCBzaWRlU2hlZXRSZWYgPSBuZXcgdGhpcy5fc2lkZVNoZWV0UmVmQ29uc3RydWN0b3IoXG4gICAgICBvdmVybGF5UmVmLFxuICAgICAgY29uZmlnLFxuICAgICAgc2lkZVNoZWV0Q29udGFpbmVyLFxuICAgICAgY29uZmlnLmlkXG4gICAgKTtcblxuICAgIGlmIChjb21wb25lbnRPclRlbXBsYXRlUmVmIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYpIHtcbiAgICAgIHNpZGVTaGVldENvbnRhaW5lci5hdHRhY2hUZW1wbGF0ZVBvcnRhbChcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgbmV3IFRlbXBsYXRlUG9ydGFsPFQ+KGNvbXBvbmVudE9yVGVtcGxhdGVSZWYsIG51bGwhLCA8YW55PntcbiAgICAgICAgICAkaW1wbGljaXQ6IGNvbmZpZy5kYXRhLFxuICAgICAgICAgIHNpZGVTaGVldFJlZixcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGluamVjdG9yID0gdGhpcy5fY3JlYXRlSW5qZWN0b3I8VD4oXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgc2lkZVNoZWV0UmVmLFxuICAgICAgICBzaWRlU2hlZXRDb250YWluZXJcbiAgICAgICk7XG4gICAgICBjb25zdCBjb250ZW50UmVmID0gc2lkZVNoZWV0Q29udGFpbmVyLmF0dGFjaDxUPihcbiAgICAgICAgbmV3IENvbXBvbmVudFBvcnRhbChcbiAgICAgICAgICBjb21wb25lbnRPclRlbXBsYXRlUmVmLFxuICAgICAgICAgIGNvbmZpZy52aWV3Q29udGFpbmVyUmVmLFxuICAgICAgICAgIGluamVjdG9yXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBzaWRlU2hlZXRSZWYuY29tcG9uZW50SW5zdGFuY2UgPSBjb250ZW50UmVmLmluc3RhbmNlO1xuICAgIH1cblxuICAgIHNpZGVTaGVldFJlZi51cGRhdGVTaXplKGNvbmZpZy53aWR0aCwgY29uZmlnLmhlaWdodCk7XG5cbiAgICByZXR1cm4gc2lkZVNoZWV0UmVmO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlSW5qZWN0b3I8VD4oXG4gICAgY29uZmlnOiBDb3ZhbGVudFNpZGVTaGVldENvbmZpZyxcbiAgICBzaWRlU2hlZXRSZWY6IENvdmFsZW50U2lkZVNoZWV0UmVmPFQ+LFxuICAgIHNpZGVTaGVldENvbnRhaW5lcjogQ1xuICApOiBJbmplY3RvciB7XG4gICAgY29uc3QgdXNlckluamVjdG9yID1cbiAgICAgIGNvbmZpZyAmJiBjb25maWcudmlld0NvbnRhaW5lclJlZiAmJiBjb25maWcudmlld0NvbnRhaW5lclJlZi5pbmplY3RvcjtcblxuICAgIC8vIFRoZSBzaWRlLXNoZWV0IGNvbnRhaW5lciBzaG91bGQgYmUgcHJvdmlkZWQgYXMgdGhlIHNpZGUtc2hlZXQgY29udGFpbmVyIGFuZCB0aGUgc2lkZS1zaGVldCdzXG4gICAgLy8gY29udGVudCBhcmUgY3JlYXRlZCBvdXQgb2YgdGhlIHNhbWUgYFZpZXdDb250YWluZXJSZWZgIGFuZCBhcyBzdWNoLCBhcmUgc2libGluZ3NcbiAgICAvLyBmb3IgaW5qZWN0b3IgcHVycG9zZXMuIFRvIGFsbG93IHRoZSBoaWVyYXJjaHkgdGhhdCBpcyBleHBlY3RlZCwgdGhlIHNpZGUtc2hlZXRcbiAgICAvLyBjb250YWluZXIgaXMgZXhwbGljaXRseSBwcm92aWRlZCBpbiB0aGUgaW5qZWN0b3IuXG4gICAgY29uc3QgcHJvdmlkZXJzOiBTdGF0aWNQcm92aWRlcltdID0gW1xuICAgICAgeyBwcm92aWRlOiB0aGlzLl9zaWRlU2hlZXRDb250YWluZXJUeXBlLCB1c2VWYWx1ZTogc2lkZVNoZWV0Q29udGFpbmVyIH0sXG4gICAgICB7IHByb3ZpZGU6IHRoaXMuX3NpZGVTaGVldERhdGFUb2tlbiwgdXNlVmFsdWU6IGNvbmZpZy5kYXRhIH0sXG4gICAgICB7IHByb3ZpZGU6IHRoaXMuX3NpZGVTaGVldFJlZkNvbnN0cnVjdG9yLCB1c2VWYWx1ZTogc2lkZVNoZWV0UmVmIH0sXG4gICAgXTtcblxuICAgIGlmIChcbiAgICAgIGNvbmZpZy5kaXJlY3Rpb24gJiZcbiAgICAgICghdXNlckluamVjdG9yIHx8XG4gICAgICAgICF1c2VySW5qZWN0b3IuZ2V0PERpcmVjdGlvbmFsaXR5IHwgbnVsbD4oXG4gICAgICAgICAgRGlyZWN0aW9uYWxpdHksXG4gICAgICAgICAgbnVsbCxcbiAgICAgICAgICBJbmplY3RGbGFncy5PcHRpb25hbFxuICAgICAgICApKVxuICAgICkge1xuICAgICAgcHJvdmlkZXJzLnB1c2goe1xuICAgICAgICBwcm92aWRlOiBEaXJlY3Rpb25hbGl0eSxcbiAgICAgICAgdXNlVmFsdWU6IHsgdmFsdWU6IGNvbmZpZy5kaXJlY3Rpb24sIGNoYW5nZTogb2YoKSB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICBwYXJlbnQ6IHVzZXJJbmplY3RvciB8fCB0aGlzLl9pbmplY3RvcixcbiAgICAgIHByb3ZpZGVycyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgc2lkZSBzaGVldCBmcm9tIHRoZSBhcnJheSBvZiBvcGVuIHNpZGUgc2hlZXRzLlxuICAgKiBAcGFyYW0gc2lkZVNoZWV0UmVmIFNpZGUgU2hlZXQgdG8gYmUgcmVtb3ZlZC5cbiAgICovXG4gIHByaXZhdGUgX3JlbW92ZU9wZW5TaWRlU2hlZXQoc2lkZVNoZWV0UmVmOiBDb3ZhbGVudFNpZGVTaGVldFJlZjx1bmtub3duPikge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vcGVuU2lkZVNoZWV0cy5pbmRleE9mKHNpZGVTaGVldFJlZik7XG5cbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgdGhpcy5vcGVuU2lkZVNoZWV0cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDbG9zZXMgYWxsIG9mIHRoZSBzaWRlLXNoZWV0IGluIGFuIGFycmF5LiAqL1xuICBwcml2YXRlIF9jbG9zZVNpZGVTaGVldHMoc2lkZVNoZWV0czogQ292YWxlbnRTaWRlU2hlZXRSZWY8YW55PltdKSB7XG4gICAgbGV0IGkgPSBzaWRlU2hlZXRzLmxlbmd0aDtcblxuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIHNpZGVTaGVldHNbaV0uY2xvc2UoKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTZXJ2aWNlIHRvIG9wZW4gQ292YWxlbnQgRGVzaWduIHNpZGUtc2hlZXQuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb3ZhbGVudFNpZGVTaGVldCBleHRlbmRzIF9Db3ZhbGVudFNpZGVTaGVldEJhc2U8Q292YWxlbnRTaWRlU2hlZXRDb250YWluZXJDb21wb25lbnQ+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgb3ZlcmxheTogT3ZlcmxheSxcbiAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREVGQVVMVF9PUFRJT05TKVxuICAgIGRlZmF1bHRPcHRpb25zOiBDb3ZhbGVudFNpZGVTaGVldENvbmZpZyxcbiAgICBAT3B0aW9uYWwoKSBAU2tpcFNlbGYoKSBwYXJlbnRTaWRlU2hlZXQ6IENvdmFsZW50U2lkZVNoZWV0XG4gICkge1xuICAgIHN1cGVyKFxuICAgICAgb3ZlcmxheSxcbiAgICAgIGluamVjdG9yLFxuICAgICAgZGVmYXVsdE9wdGlvbnMsXG4gICAgICBwYXJlbnRTaWRlU2hlZXQsXG4gICAgICBDb3ZhbGVudFNpZGVTaGVldFJlZixcbiAgICAgIENvdmFsZW50U2lkZVNoZWV0Q29udGFpbmVyQ29tcG9uZW50LFxuICAgICAgTUFUX0RJQUxPR19EQVRBXG4gICAgKTtcbiAgfVxufVxuIl19