UNPKG

@foblex/flow-animator

Version:
95 lines 14.9 kB
import { Inject, Injectable } from '@angular/core'; import { concatMap, finalize, forkJoin, from, Observable, tap } from 'rxjs'; import { DOCUMENT } from '@angular/common'; import { AnimateElementHandler } from './animate-element/animate-element.handler'; import { AnimateElementRequest } from './animate-element/animate-element-request'; import { GetAllAnimatedElementsRequest } from './get-all-animated-elements/get-all-animated-elements-request'; import { GetAllAnimatedElementsHandler } from './get-all-animated-elements/get-all-animated-elements.handler'; import * as i0 from "@angular/core"; import * as i1 from "@angular/animations"; /** * Service for animating elements in the @foblex/flow-animator library. * This service handles the orchestration of animations for elements. */ export class FFlowAnimatorService { /** * Creates an instance of FFlowAnimatorService. * @param {AnimationBuilder} animationBuilder - The AnimationBuilder service for creating animations. * @param {Document} document - The DOM Document object to interact with the DOM. */ constructor(animationBuilder, document) { this.animationBuilder = animationBuilder; this.document = document; } /** * Initiates the animation process for the specified flow. * @param {any} flowId - The identifier of the flow to be animated. * @param {IFAnimationConfiguration} configuration - The configuration settings for the animation. * @return {Observable<IFAnimationResult>} An Observable that emits the result of the animation process. */ animate(flowId, configuration) { return new Observable((observer) => { setTimeout(() => { const toAnimate = new GetAllAnimatedElementsHandler(this.document).handle(new GetAllAnimatedElementsRequest(flowId, configuration.items)); this.animateSequentially(toAnimate, configuration, observer); }, 0); }); } /** * Animates elements sequentially according to the provided configuration. * @private * @param {IFElementToAnimate[][]} rows - A two-dimensional array of elements to animate in sequence. * @param {IFAnimationConfiguration} configuration - The configuration settings for the animation. * @param {Subscriber<IFAnimationResult>} observer - The observer to emit the results to. */ animateSequentially(rows, configuration, observer) { const singleDuration = configuration.duration / rows.length; let toRemove = []; from(rows).pipe(concatMap((row, index) => forkJoin(row.map(x => this.animateElement(x.element, x.duration || singleDuration).pipe(tap((overlayElement) => { toRemove.push(overlayElement); })))).pipe(finalize(() => { if (configuration.removeOverlayAfterRowComplete) { toRemove = this.removeCreatedElements(toRemove); } observer.next({ completeRowIndex: index }); }))), finalize(() => { if (!configuration.removeOverlayAfterRowComplete) { toRemove = this.removeCreatedElements(toRemove); } observer.next({ completeAll: true }); observer.complete(); })).subscribe(); } /** * Animates an individual element. * @private * @param {(HTMLElement | SVGPathElement)} element - The element to be animated. * @param {number} duration - The duration of the animation in milliseconds. * @return {Observable<HTMLElement | SVGPathElement>} An Observable that emits the animated element. */ animateElement(element, duration) { return new AnimateElementHandler(this.animationBuilder).handle(new AnimateElementRequest(element, duration)); } /** * Removes the specified elements from the DOM. * @private * @param {(HTMLElement | SVGPathElement)[]} toRemove - The elements to be removed. * @return {(HTMLElement | SVGPathElement)[]} An array of the removed elements. */ removeCreatedElements(toRemove) { toRemove.forEach(x => x.remove()); return []; } } FFlowAnimatorService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: FFlowAnimatorService, deps: [{ token: i1.AnimationBuilder }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); FFlowAnimatorService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: FFlowAnimatorService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: FFlowAnimatorService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: function () { return [{ type: i1.AnimationBuilder }, { type: Document, decorators: [{ type: Inject, args: [DOCUMENT] }] }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZi1mbG93LWFuaW1hdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9mLWZsb3ctYW5pbWF0b3Ivc3JjL2xpYi9mLWZsb3ctYW5pbWF0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBYyxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLCtEQUErRCxDQUFDO0FBQzlHLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLCtEQUErRCxDQUFDOzs7QUFLOUc7OztHQUdHO0FBSUgsTUFBTSxPQUFPLG9CQUFvQjtJQUUvQjs7OztPQUlHO0lBQ0gsWUFDWSxnQkFBa0MsRUFDaEIsUUFBa0I7UUFEcEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNoQixhQUFRLEdBQVIsUUFBUSxDQUFVO0lBRWhELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE9BQU8sQ0FBQyxNQUFXLEVBQUUsYUFBdUM7UUFDakUsT0FBTyxJQUFJLFVBQVUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQ2pDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsTUFBTSxTQUFTLEdBQUcsSUFBSSw2QkFBNkIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUNyRSxJQUFJLDZCQUE2QixDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsS0FBSyxDQUFDLENBQ2pFLENBQUM7Z0JBQ0YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDL0QsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ1IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssbUJBQW1CLENBQUMsSUFBNEIsRUFBRSxhQUF1QyxFQUFFLFFBQXVDO1FBQ3hJLE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUM1RCxJQUFJLFFBQVEsR0FBcUMsRUFBRSxDQUFDO1FBRXBELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQ1gsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQWEsRUFBRSxFQUFFLENBQzdCLFFBQVEsQ0FDSixHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLElBQUksY0FBYyxDQUFDLENBQUMsSUFBSSxDQUMxRSxHQUFHLENBQUMsQ0FBQyxjQUFjLEVBQUUsRUFBRTtZQUNyQixRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUNMLENBQUMsQ0FDTCxDQUFDLElBQUksQ0FDRixRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxhQUFhLENBQUMsNkJBQTZCLEVBQUU7Z0JBQy9DLFFBQVEsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDakQ7WUFDRCxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FDTCxDQUNKLEVBQ0QsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxhQUFhLENBQUMsNkJBQTZCLEVBQUU7Z0JBQ2hELFFBQVEsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDakQ7WUFDRCxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDckMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUNMLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLGNBQWMsQ0FBQyxPQUF1QyxFQUFFLFFBQWdCO1FBQzlFLE9BQU8sSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQzFELElBQUkscUJBQXFCLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUMvQyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0sscUJBQXFCLENBQUMsUUFBMEM7UUFDdEUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQzs7aUhBMUZVLG9CQUFvQixrREFTbkIsUUFBUTtxSEFUVCxvQkFBb0IsY0FGbkIsTUFBTTsyRkFFUCxvQkFBb0I7a0JBSGhDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CO3lGQVV5QyxRQUFROzBCQUEzQyxNQUFNOzJCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFuaW1hdGlvbkJ1aWxkZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IGNvbmNhdE1hcCwgZmluYWxpemUsIGZvcmtKb2luLCBmcm9tLCBPYnNlcnZhYmxlLCBTdWJzY3JpYmVyLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFuaW1hdGVFbGVtZW50SGFuZGxlciB9IGZyb20gJy4vYW5pbWF0ZS1lbGVtZW50L2FuaW1hdGUtZWxlbWVudC5oYW5kbGVyJztcbmltcG9ydCB7IEFuaW1hdGVFbGVtZW50UmVxdWVzdCB9IGZyb20gJy4vYW5pbWF0ZS1lbGVtZW50L2FuaW1hdGUtZWxlbWVudC1yZXF1ZXN0JztcbmltcG9ydCB7IEdldEFsbEFuaW1hdGVkRWxlbWVudHNSZXF1ZXN0IH0gZnJvbSAnLi9nZXQtYWxsLWFuaW1hdGVkLWVsZW1lbnRzL2dldC1hbGwtYW5pbWF0ZWQtZWxlbWVudHMtcmVxdWVzdCc7XG5pbXBvcnQgeyBHZXRBbGxBbmltYXRlZEVsZW1lbnRzSGFuZGxlciB9IGZyb20gJy4vZ2V0LWFsbC1hbmltYXRlZC1lbGVtZW50cy9nZXQtYWxsLWFuaW1hdGVkLWVsZW1lbnRzLmhhbmRsZXInO1xuaW1wb3J0IHsgSUZBbmltYXRpb25SZXN1bHQgfSBmcm9tICcuL2ktZi1hbmltYXRpb24tcmVzdWx0JztcbmltcG9ydCB7IElGQW5pbWF0aW9uQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vaS1mLWFuaW1hdGlvbi1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IElGRWxlbWVudFRvQW5pbWF0ZSB9IGZyb20gJy4vaS1mLWVsZW1lbnQtdG8tYW5pbWF0ZSc7XG5cbi8qKlxuICogU2VydmljZSBmb3IgYW5pbWF0aW5nIGVsZW1lbnRzIGluIHRoZSBAZm9ibGV4L2Zsb3ctYW5pbWF0b3IgbGlicmFyeS5cbiAqIFRoaXMgc2VydmljZSBoYW5kbGVzIHRoZSBvcmNoZXN0cmF0aW9uIG9mIGFuaW1hdGlvbnMgZm9yIGVsZW1lbnRzLlxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBGRmxvd0FuaW1hdG9yU2VydmljZSB7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgRkZsb3dBbmltYXRvclNlcnZpY2UuXG4gICAqIEBwYXJhbSB7QW5pbWF0aW9uQnVpbGRlcn0gYW5pbWF0aW9uQnVpbGRlciAtIFRoZSBBbmltYXRpb25CdWlsZGVyIHNlcnZpY2UgZm9yIGNyZWF0aW5nIGFuaW1hdGlvbnMuXG4gICAqIEBwYXJhbSB7RG9jdW1lbnR9IGRvY3VtZW50IC0gVGhlIERPTSBEb2N1bWVudCBvYmplY3QgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgRE9NLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgICBwcml2YXRlIGFuaW1hdGlvbkJ1aWxkZXI6IEFuaW1hdGlvbkJ1aWxkZXIsXG4gICAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudFxuICApIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZXMgdGhlIGFuaW1hdGlvbiBwcm9jZXNzIGZvciB0aGUgc3BlY2lmaWVkIGZsb3cuXG4gICAqIEBwYXJhbSB7YW55fSBmbG93SWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgZmxvdyB0byBiZSBhbmltYXRlZC5cbiAgICogQHBhcmFtIHtJRkFuaW1hdGlvbkNvbmZpZ3VyYXRpb259IGNvbmZpZ3VyYXRpb24gLSBUaGUgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgdGhlIGFuaW1hdGlvbi5cbiAgICogQHJldHVybiB7T2JzZXJ2YWJsZTxJRkFuaW1hdGlvblJlc3VsdD59IEFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgcmVzdWx0IG9mIHRoZSBhbmltYXRpb24gcHJvY2Vzcy5cbiAgICovXG4gIHB1YmxpYyBhbmltYXRlKGZsb3dJZDogYW55LCBjb25maWd1cmF0aW9uOiBJRkFuaW1hdGlvbkNvbmZpZ3VyYXRpb24pOiBPYnNlcnZhYmxlPElGQW5pbWF0aW9uUmVzdWx0PiB7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcikgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHRvQW5pbWF0ZSA9IG5ldyBHZXRBbGxBbmltYXRlZEVsZW1lbnRzSGFuZGxlcih0aGlzLmRvY3VtZW50KS5oYW5kbGUoXG4gICAgICAgICAgICBuZXcgR2V0QWxsQW5pbWF0ZWRFbGVtZW50c1JlcXVlc3QoZmxvd0lkLCBjb25maWd1cmF0aW9uLml0ZW1zKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmFuaW1hdGVTZXF1ZW50aWFsbHkodG9BbmltYXRlLCBjb25maWd1cmF0aW9uLCBvYnNlcnZlcik7XG4gICAgICB9LCAwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbmltYXRlcyBlbGVtZW50cyBzZXF1ZW50aWFsbHkgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBjb25maWd1cmF0aW9uLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge0lGRWxlbWVudFRvQW5pbWF0ZVtdW119IHJvd3MgLSBBIHR3by1kaW1lbnNpb25hbCBhcnJheSBvZiBlbGVtZW50cyB0byBhbmltYXRlIGluIHNlcXVlbmNlLlxuICAgKiBAcGFyYW0ge0lGQW5pbWF0aW9uQ29uZmlndXJhdGlvbn0gY29uZmlndXJhdGlvbiAtIFRoZSBjb25maWd1cmF0aW9uIHNldHRpbmdzIGZvciB0aGUgYW5pbWF0aW9uLlxuICAgKiBAcGFyYW0ge1N1YnNjcmliZXI8SUZBbmltYXRpb25SZXN1bHQ+fSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byBlbWl0IHRoZSByZXN1bHRzIHRvLlxuICAgKi9cbiAgcHJpdmF0ZSBhbmltYXRlU2VxdWVudGlhbGx5KHJvd3M6IElGRWxlbWVudFRvQW5pbWF0ZVtdW10sIGNvbmZpZ3VyYXRpb246IElGQW5pbWF0aW9uQ29uZmlndXJhdGlvbiwgb2JzZXJ2ZXI6IFN1YnNjcmliZXI8SUZBbmltYXRpb25SZXN1bHQ+KTogdm9pZCB7XG4gICAgY29uc3Qgc2luZ2xlRHVyYXRpb24gPSBjb25maWd1cmF0aW9uLmR1cmF0aW9uIC8gcm93cy5sZW5ndGg7XG4gICAgbGV0IHRvUmVtb3ZlOiAoSFRNTEVsZW1lbnQgfCBTVkdQYXRoRWxlbWVudClbXSA9IFtdO1xuXG4gICAgZnJvbShyb3dzKS5waXBlKFxuICAgICAgICBjb25jYXRNYXAoKHJvdywgaW5kZXg6IG51bWJlcikgPT5cbiAgICAgICAgICAgIGZvcmtKb2luKFxuICAgICAgICAgICAgICAgIHJvdy5tYXAoeCA9PiB0aGlzLmFuaW1hdGVFbGVtZW50KHguZWxlbWVudCwgeC5kdXJhdGlvbiB8fCBzaW5nbGVEdXJhdGlvbikucGlwZShcbiAgICAgICAgICAgICAgICAgICAgdGFwKChvdmVybGF5RWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHRvUmVtb3ZlLnB1c2gob3ZlcmxheUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICApLnBpcGUoXG4gICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24ucmVtb3ZlT3ZlcmxheUFmdGVyUm93Q29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9SZW1vdmUgPSB0aGlzLnJlbW92ZUNyZWF0ZWRFbGVtZW50cyh0b1JlbW92ZSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHsgY29tcGxldGVSb3dJbmRleDogaW5kZXggfSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAgIGlmICghY29uZmlndXJhdGlvbi5yZW1vdmVPdmVybGF5QWZ0ZXJSb3dDb21wbGV0ZSkge1xuICAgICAgICAgICAgdG9SZW1vdmUgPSB0aGlzLnJlbW92ZUNyZWF0ZWRFbGVtZW50cyh0b1JlbW92ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9ic2VydmVyLm5leHQoeyBjb21wbGV0ZUFsbDogdHJ1ZSB9KTtcbiAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICB9KVxuICAgICkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKipcbiAgICogQW5pbWF0ZXMgYW4gaW5kaXZpZHVhbCBlbGVtZW50LlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0geyhIVE1MRWxlbWVudCB8IFNWR1BhdGhFbGVtZW50KX0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIGJlIGFuaW1hdGVkLlxuICAgKiBAcGFyYW0ge251bWJlcn0gZHVyYXRpb24gLSBUaGUgZHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiBpbiBtaWxsaXNlY29uZHMuXG4gICAqIEByZXR1cm4ge09ic2VydmFibGU8SFRNTEVsZW1lbnQgfCBTVkdQYXRoRWxlbWVudD59IEFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgYW5pbWF0ZWQgZWxlbWVudC5cbiAgICovXG4gIHByaXZhdGUgYW5pbWF0ZUVsZW1lbnQoZWxlbWVudDogKEhUTUxFbGVtZW50IHwgU1ZHUGF0aEVsZW1lbnQpLCBkdXJhdGlvbjogbnVtYmVyKTogT2JzZXJ2YWJsZTxIVE1MRWxlbWVudCB8IFNWR1BhdGhFbGVtZW50PiB7XG4gICAgcmV0dXJuIG5ldyBBbmltYXRlRWxlbWVudEhhbmRsZXIodGhpcy5hbmltYXRpb25CdWlsZGVyKS5oYW5kbGUoXG4gICAgICAgIG5ldyBBbmltYXRlRWxlbWVudFJlcXVlc3QoZWxlbWVudCwgZHVyYXRpb24pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMgZnJvbSB0aGUgRE9NLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0geyhIVE1MRWxlbWVudCB8IFNWR1BhdGhFbGVtZW50KVtdfSB0b1JlbW92ZSAtIFRoZSBlbGVtZW50cyB0byBiZSByZW1vdmVkLlxuICAgKiBAcmV0dXJuIHsoSFRNTEVsZW1lbnQgfCBTVkdQYXRoRWxlbWVudClbXX0gQW4gYXJyYXkgb2YgdGhlIHJlbW92ZWQgZWxlbWVudHMuXG4gICAqL1xuICBwcml2YXRlIHJlbW92ZUNyZWF0ZWRFbGVtZW50cyh0b1JlbW92ZTogKEhUTUxFbGVtZW50IHwgU1ZHUGF0aEVsZW1lbnQpW10pOiAoSFRNTEVsZW1lbnQgfCBTVkdQYXRoRWxlbWVudClbXSB7XG4gICAgdG9SZW1vdmUuZm9yRWFjaCh4ID0+IHgucmVtb3ZlKCkpO1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuIl19