@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
108 lines • 13.6 kB
JavaScript
import { Injectable, InjectionToken, Injector } from '@angular/core';
import { Router } from '@angular/router';
import { TranslateService } from '@ngx-translate/core';
import { distinctUntilChanged, filter, map, shareReplay, take } from 'rxjs/operators';
import { fromTrigger, hookGeneric, getInjectedHooks, stateToFactory, ExtensionPointForPlugins } from '../common/extension-hooks';
import { PluginsResolveService } from '../plugins';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "@ngx-translate/core";
import * as i3 from "../plugins";
/**
* A hook to use for Multi Provider extension.
* @deprecated Consider using the `hookStepper` function instead.
*/
export const HOOK_STEPPER = new InjectionToken('HOOK_STEPPER');
/**
* You can either provide a single `Step` as parameter:
* ```typescript
* hookStepper(...)
* ```
*
* Or an array to directly register multiple:
* ```typescript
* hookStepper([...])
* ```
*
* Or you provide an Service that implements `ExtensionFactory<Step>`
* ```typescript
* export class MyStepFactory implements ExtensionFactory<Step> {...}
* ...
* hookStepper(MyStepFactory)
* ```
* A typed alternative to `HOOK_STEPPER`.
* @param step The `Step`'s or `ExtensionFactory` to be provided.
* @returns An `Provider` to be provided in your module.
*/
export function hookStepper(step, options) {
return hookGeneric(step, HOOK_STEPPER, options);
}
/**
* A service which defines the steps in a stepper component.
* A stepper hook needs an certain outlet which has an matching id
* to display the steps.
*/
export class StepperService extends ExtensionPointForPlugins {
constructor(rootInjector, router, translateService, plugins) {
super(rootInjector, plugins);
this.router = router;
this.translateService = translateService;
this.items$ = this.setupItemsObservable();
}
sortSteps(steps) {
return steps.sort((a, b) => {
const priorityOrder = (b.priority || 0) - (a.priority || 0);
const aTranslatedLabel = this.translateService.instant(a.label);
const bTranslatedLabel = this.translateService.instant(b.label);
const translatedLabelOrder = aTranslatedLabel.localeCompare(bTranslatedLabel);
return priorityOrder || translatedLabelOrder;
});
}
/**
* Returns the current state.
* @readonly
* @returns The current set of actions.
*/
get state() {
return this.state$.value;
}
/**
* Adds a new item to tabs and emits state change
* @param item The item to add.
*/
add(item) {
this.state.add(item);
this.emitNewState();
}
/**
* Removes a step and emits a state change.
* @param item The item to remove.
*/
remove(item) {
this.state.delete(item);
this.emitNewState();
}
/**
* Returns the component by it's asssigned stepper id as an observable.
* @param id The id of the stepper to hook into.
*/
getById$(id) {
return this.items$.pipe(filter(steps => steps.length > 0), map(steps => steps.filter(cmp => cmp.stepperId === id)), take(1));
}
setupItemsObservable() {
return fromTrigger(this.router, this.refresh$, [
getInjectedHooks(HOOK_STEPPER, this.injectors),
() => this.factories,
stateToFactory(this.state$)
]).pipe(distinctUntilChanged(), shareReplay(1));
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StepperService, deps: [{ token: i0.Injector }, { token: i1.Router }, { token: i2.TranslateService }, { token: i3.PluginsResolveService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StepperService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StepperService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i0.Injector }, { type: i1.Router }, { type: i2.TranslateService }, { type: i3.PluginsResolveService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcHBlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS9zdGVwcGVyL3N0ZXBwZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXZELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RixPQUFPLEVBRUwsV0FBVyxFQUVYLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsY0FBYyxFQUNkLHdCQUF3QixFQUV6QixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFlBQVksQ0FBQzs7Ozs7QUF1Qm5EOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxJQUFJLGNBQWMsQ0FBcUIsY0FBYyxDQUFDLENBQUM7QUFFbkY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxJQUEyQixFQUFFLE9BQXFDO0lBQzVGLE9BQU8sV0FBVyxDQUFPLElBQUksRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUVEOzs7O0dBSUc7QUFJSCxNQUFNLE9BQU8sY0FBZSxTQUFRLHdCQUE4QjtJQUNoRSxZQUNFLFlBQXNCLEVBQ2QsTUFBYyxFQUNkLGdCQUFrQyxFQUMxQyxPQUE4QjtRQUU5QixLQUFLLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBSnJCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBSTFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDNUMsQ0FBQztJQUVELFNBQVMsQ0FBQyxLQUFhO1FBQ3JCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN6QixNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBRTVELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoRSxNQUFNLG9CQUFvQixHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBRTlFLE9BQU8sYUFBYSxJQUFJLG9CQUFvQixDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxHQUFHLENBQUMsSUFBVTtRQUNaLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLElBQVU7UUFDZixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVEsQ0FBQyxFQUFFO1FBQ1QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDckIsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFDakMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEtBQUssRUFBRSxDQUFDLENBQUMsRUFDdkQsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUNSLENBQUM7SUFDSixDQUFDO0lBRVMsb0JBQW9CO1FBQzVCLE9BQU8sV0FBVyxDQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNuRCxnQkFBZ0IsQ0FBTyxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNwRCxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUztZQUNwQixjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUM1QixDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQzsrR0FwRVUsY0FBYzttSEFBZCxjQUFjLGNBRmIsTUFBTTs7NEZBRVAsY0FBYztrQkFIMUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAsIHNoYXJlUmVwbGF5LCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgRXh0ZW5zaW9uRmFjdG9yeSxcbiAgZnJvbVRyaWdnZXIsXG4gIEdlbmVyaWNIb29rVHlwZSxcbiAgaG9va0dlbmVyaWMsXG4gIGdldEluamVjdGVkSG9va3MsXG4gIHN0YXRlVG9GYWN0b3J5LFxuICBFeHRlbnNpb25Qb2ludEZvclBsdWdpbnMsXG4gIEdlbmVyaWNIb29rT3B0aW9uc1xufSBmcm9tICcuLi9jb21tb24vZXh0ZW5zaW9uLWhvb2tzJztcbmltcG9ydCB7IFBsdWdpbnNSZXNvbHZlU2VydmljZSB9IGZyb20gJy4uL3BsdWdpbnMnO1xuaW1wb3J0IHsgU3RlcCB9IGZyb20gJy4vc3RlcHBlci5tb2RlbCc7XG5cbi8qKlxuICogQW4gZXh0ZW5zaW9uIEhPT0sgY2FuIHVzZSBlaXRoZXIgYSBwdXJlIHZhbHVlOlxuICogYGBgdHlwZXNjcmlwdFxuICogIHsgcHJvdmlkZTogSE9PS19YLCB1c2VWYWx1ZTogeyAuLi5ob29rVmFsdWUgfSwgbXVsdGk6IHRydWUgfVxuICogYGBgXG4gKlxuICogT3IgYW4gYXJyYXkgdG8gZGlyZWN0bHkgcmVnaXN0ZXIgbXVsdGlwbGU6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAgeyBwcm92aWRlOiBIT09LX1gsIHVzZVZhbHVlOiBbeyAuLi5ob29rVmFsdWVzIH1dLCBtdWx0aTogdHJ1ZSB9XG4gKiBgYGBcbiAqXG4gKiBPciBhbiBFeHRlbnNpb25GYWN0b3J5IHdoaWNoIGFsbG93cyB0byBkZWZpbmUgYSBnZXQoKSBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvblxuICogZ2V0cyBjYWxsZWQgb24gZWFjaCBuYXZpZ2F0aW9uIHdpdGggdGhlIGN1cnJlbnQgcm91dGUgYW5kIGNhbiByZXR1cm4gdmFsdWVzXG4gKiBhc3luYyAob2JzZXJ2YWJsZSBvciBwcm9taXNlKS5cbiAqIGBgYHR5cGVzY3JpcHRcbiAqICB7IHByb3ZpZGU6IEhPT0tfWCwgdXNlRmFjdG9yeTogeyBnZXQ6IChyb3V0ZSkgPT4gZG9Tb21ldGhpbmdBc3luYyhyb3V0ZSkgfSwgbXVsdGk6IHRydWUgfVxuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIFN0ZXBwZXJFeHRlbnNpb24gPSBTdGVwIHwgU3RlcFtdIHwgRXh0ZW5zaW9uRmFjdG9yeTxTdGVwPjtcblxuLyoqXG4gKiBBIGhvb2sgdG8gdXNlIGZvciBNdWx0aSBQcm92aWRlciBleHRlbnNpb24uXG4gKiBAZGVwcmVjYXRlZCBDb25zaWRlciB1c2luZyB0aGUgYGhvb2tTdGVwcGVyYCBmdW5jdGlvbiBpbnN0ZWFkLlxuICovXG5leHBvcnQgY29uc3QgSE9PS19TVEVQUEVSID0gbmV3IEluamVjdGlvblRva2VuPFN0ZXBwZXJFeHRlbnNpb25bXT4oJ0hPT0tfU1RFUFBFUicpO1xuXG4vKipcbiAqIFlvdSBjYW4gZWl0aGVyIHByb3ZpZGUgYSBzaW5nbGUgYFN0ZXBgIGFzIHBhcmFtZXRlcjpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqICBob29rU3RlcHBlciguLi4pXG4gKiBgYGBcbiAqXG4gKiBPciBhbiBhcnJheSB0byBkaXJlY3RseSByZWdpc3RlciBtdWx0aXBsZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqICBob29rU3RlcHBlcihbLi4uXSlcbiAqIGBgYFxuICpcbiAqIE9yIHlvdSBwcm92aWRlIGFuIFNlcnZpY2UgdGhhdCBpbXBsZW1lbnRzIGBFeHRlbnNpb25GYWN0b3J5PFN0ZXA+YFxuICogYGBgdHlwZXNjcmlwdFxuICogIGV4cG9ydCBjbGFzcyBNeVN0ZXBGYWN0b3J5IGltcGxlbWVudHMgRXh0ZW5zaW9uRmFjdG9yeTxTdGVwPiB7Li4ufVxuICogIC4uLlxuICogIGhvb2tTdGVwcGVyKE15U3RlcEZhY3RvcnkpXG4gKiBgYGBcbiAqIEEgdHlwZWQgYWx0ZXJuYXRpdmUgdG8gYEhPT0tfU1RFUFBFUmAuXG4gKiBAcGFyYW0gc3RlcCBUaGUgYFN0ZXBgJ3Mgb3IgYEV4dGVuc2lvbkZhY3RvcnlgIHRvIGJlIHByb3ZpZGVkLlxuICogQHJldHVybnMgQW4gYFByb3ZpZGVyYCB0byBiZSBwcm92aWRlZCBpbiB5b3VyIG1vZHVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhvb2tTdGVwcGVyKHN0ZXA6IEdlbmVyaWNIb29rVHlwZTxTdGVwPiwgb3B0aW9ucz86IFBhcnRpYWw8R2VuZXJpY0hvb2tPcHRpb25zPikge1xuICByZXR1cm4gaG9va0dlbmVyaWM8U3RlcD4oc3RlcCwgSE9PS19TVEVQUEVSLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBBIHNlcnZpY2Ugd2hpY2ggZGVmaW5lcyB0aGUgc3RlcHMgaW4gYSBzdGVwcGVyIGNvbXBvbmVudC5cbiAqIEEgc3RlcHBlciBob29rIG5lZWRzIGFuIGNlcnRhaW4gb3V0bGV0IHdoaWNoIGhhcyBhbiBtYXRjaGluZyBpZFxuICogdG8gZGlzcGxheSB0aGUgc3RlcHMuXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFN0ZXBwZXJTZXJ2aWNlIGV4dGVuZHMgRXh0ZW5zaW9uUG9pbnRGb3JQbHVnaW5zPFN0ZXA+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcm9vdEluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwbHVnaW5zOiBQbHVnaW5zUmVzb2x2ZVNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIocm9vdEluamVjdG9yLCBwbHVnaW5zKTtcbiAgICB0aGlzLml0ZW1zJCA9IHRoaXMuc2V0dXBJdGVtc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHNvcnRTdGVwcyhzdGVwczogU3RlcFtdKSB7XG4gICAgcmV0dXJuIHN0ZXBzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IHByaW9yaXR5T3JkZXIgPSAoYi5wcmlvcml0eSB8fCAwKSAtIChhLnByaW9yaXR5IHx8IDApO1xuXG4gICAgICBjb25zdCBhVHJhbnNsYXRlZExhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYS5sYWJlbCk7XG4gICAgICBjb25zdCBiVHJhbnNsYXRlZExhYmVsID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoYi5sYWJlbCk7XG4gICAgICBjb25zdCB0cmFuc2xhdGVkTGFiZWxPcmRlciA9IGFUcmFuc2xhdGVkTGFiZWwubG9jYWxlQ29tcGFyZShiVHJhbnNsYXRlZExhYmVsKTtcblxuICAgICAgcmV0dXJuIHByaW9yaXR5T3JkZXIgfHwgdHJhbnNsYXRlZExhYmVsT3JkZXI7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZS5cbiAgICogQHJlYWRvbmx5XG4gICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IHNldCBvZiBhY3Rpb25zLlxuICAgKi9cbiAgZ2V0IHN0YXRlKCk6IFNldDxTdGVwPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUkLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBuZXcgaXRlbSB0byB0YWJzIGFuZCBlbWl0cyBzdGF0ZSBjaGFuZ2VcbiAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdG8gYWRkLlxuICAgKi9cbiAgYWRkKGl0ZW06IFN0ZXApIHtcbiAgICB0aGlzLnN0YXRlLmFkZChpdGVtKTtcbiAgICB0aGlzLmVtaXROZXdTdGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBzdGVwIGFuZCBlbWl0cyBhIHN0YXRlIGNoYW5nZS5cbiAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdG8gcmVtb3ZlLlxuICAgKi9cbiAgcmVtb3ZlKGl0ZW06IFN0ZXApIHtcbiAgICB0aGlzLnN0YXRlLmRlbGV0ZShpdGVtKTtcbiAgICB0aGlzLmVtaXROZXdTdGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBieSBpdCdzIGFzc3NpZ25lZCBzdGVwcGVyIGlkIGFzIGFuIG9ic2VydmFibGUuXG4gICAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIHN0ZXBwZXIgdG8gaG9vayBpbnRvLlxuICAgKi9cbiAgZ2V0QnlJZCQoaWQpIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcyQucGlwZShcbiAgICAgIGZpbHRlcihzdGVwcyA9PiBzdGVwcy5sZW5ndGggPiAwKSxcbiAgICAgIG1hcChzdGVwcyA9PiBzdGVwcy5maWx0ZXIoY21wID0+IGNtcC5zdGVwcGVySWQgPT09IGlkKSksXG4gICAgICB0YWtlKDEpXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXR1cEl0ZW1zT2JzZXJ2YWJsZSgpOiBPYnNlcnZhYmxlPFN0ZXBbXT4ge1xuICAgIHJldHVybiBmcm9tVHJpZ2dlcjxTdGVwPih0aGlzLnJvdXRlciwgdGhpcy5yZWZyZXNoJCwgW1xuICAgICAgZ2V0SW5qZWN0ZWRIb29rczxTdGVwPihIT09LX1NURVBQRVIsIHRoaXMuaW5qZWN0b3JzKSxcbiAgICAgICgpID0+IHRoaXMuZmFjdG9yaWVzLFxuICAgICAgc3RhdGVUb0ZhY3RvcnkodGhpcy5zdGF0ZSQpXG4gICAgXSkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCBzaGFyZVJlcGxheSgxKSk7XG4gIH1cbn1cbiJdfQ==