UNPKG

@fivethree/core

Version:
823 lines 65.1 kB
/** * @fileoverview added by tsickle * Generated from: lib/gallery/gallery.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { FivGalleryToolbar } from './gallery-toolbar/gallery-toolbar.component'; import { IonSlides, DomController, Platform } from '@ionic/angular'; import { FivOverlay } from './../overlay/overlay.component'; import { Component, ViewChild, ElementRef, Renderer2, ContentChildren, QueryList, forwardRef, HostListener, Inject, ChangeDetectorRef, Input, Output, EventEmitter, ViewChildren } from '@angular/core'; import { style, animate, AnimationBuilder, trigger, transition, useAnimation } from '@angular/animations'; import { DOCUMENT } from '@angular/common'; import { FivGalleryImage } from './gallery-image/gallery-image.component'; import { from, Subject, zip, of } from 'rxjs'; import { mergeMap, takeUntil, tap } from 'rxjs/operators'; import { tween, fromTo, getPosition, setPosition, fromToPixels, easeOutSine } from '@fivethree/ngx-rxjs-animations'; import { fade } from '../animations/animations'; import { ImageService } from './image.service'; var FivGallery = /** @class */ (function () { function FivGallery(domCtrl, renderer, animation, change, platform, imageService, document) { this.domCtrl = domCtrl; this.renderer = renderer; this.animation = animation; this.change = change; this.platform = platform; this.imageService = imageService; this.document = document; this.activeIndex = 0; this.inFullscreen = false; this.zoomedIn = false; this.controlsVisible = true; this.slidesLoaded = false; this.morphing = false; this.backdrop = false; this.backdropColor = '#000000ee'; this.pagerVisible = true; this.ambient = false; this.willOpen = new EventEmitter(); this.willClose = new EventEmitter(); this.didOpen = new EventEmitter(); this.didClose = new EventEmitter(); this.backdropChange = new EventEmitter(); this.$onDestroy = new Subject(); } /** * @return {?} */ FivGallery.prototype.ngAfterContentInit = /** * @return {?} */ function () { this.updateImagesIndex(); this.setupToolbars(); this.subscribeToImageEvents(); }; /** * @return {?} */ FivGallery.prototype.ngOnDestroy = /** * @return {?} */ function () { this.$onDestroy.next(); }; /** * @return {?} */ FivGallery.prototype.subscribeToImageEvents = /** * @return {?} */ function () { var _this = this; from(this.images.map((/** * @param {?} image * @return {?} */ function (image) { return image.click; }))) .pipe(mergeMap((/** * @param {?} value * @return {?} */ function (value) { return value; })), takeUntil(this.$onDestroy)) .subscribe((/** * @param {?} image * @return {?} */ function (image) { _this.open(image); })); }; /** * @return {?} */ FivGallery.prototype.updateImagesIndex = /** * @return {?} */ function () { this.images.forEach((/** * @param {?} img * @param {?} i * @return {?} */ function (img, i) { img.index = i; })); }; /** * @return {?} */ FivGallery.prototype.setupToolbars = /** * @return {?} */ function () { var _this = this; this.toolbars.forEach((/** * @param {?} toolbar * @return {?} */ function (toolbar) { if (toolbar.position === 'top') { _this.topToolbar = toolbar.content; } else { _this.bottomToolbar = toolbar.content; } })); }; /** * @param {?} initial * @return {?} */ FivGallery.prototype.open = /** * @param {?} initial * @return {?} */ function (initial) { var _this = this; this.willOpen.emit(initial); this.activeIndex = initial.index; this.morphing = true; this.overlay.show(50000); this.initialImage = initial; this.updateBackdrop(this.activeIndex); this.initialImage.originalSrc = initial.src; setTimeout((/** * @return {?} */ function () { //wait a little for ripple _this.backdrop = true; _this.showControls(); _this.morphIn(); }), 300); }; /** * @return {?} */ FivGallery.prototype.morphIn = /** * @return {?} */ function () { var _this = this; this.morphOverlay.show(49999); /** @type {?} */ var f = getPosition(this.initialImage.thumbnail); /** @type {?} */ var t = this.calculateImagePosition(); /** @type {?} */ var tweenDone = new Subject(); tween(easeOutSine, 320) .pipe(fromToPixels(this.morphImage, f.top, t.top, 'top'), fromToPixels(this.morphImage, f.left, t.left, 'left'), fromToPixels(this.morphImage, f.height, t.height, 'height'), fromToPixels(this.morphImage, f.width, t.width, 'width')) .subscribe({ complete: (/** * @return {?} */ function () { tweenDone.next(); }) }); zip(tweenDone, !this.slidesLoaded ? this.slides.ionSlidesDidLoad : of(true)) .pipe(tap((/** * @return {?} */ function () { _this.morphing = false; _this.morphOverlay.hide(); _this.didOpen.emit(_this.initialImage); _this.swiper.nativeElement.swiper.on('click', (/** * @return {?} */ function () { _this.handleSingleTap(); })); })), takeUntil(this.$onDestroy)) .subscribe(); }; /** * @return {?} */ FivGallery.prototype.dismiss = /** * @return {?} */ function () { this.close(false); }; /** * @param {?=} emit * @return {?} */ FivGallery.prototype.close = /** * @param {?=} emit * @return {?} */ function (emit) { if (emit === void 0) { emit = true; } if (emit) { this.willClose.emit(this.initialImage); } this.backdrop = false; /** @type {?} */ var sameAsInitial = this.images.toArray()[this.activeIndex].index === this.initialImage.index; if (sameAsInitial) { this.morphBack(); } else { this.slideOut(); } this.resetSlides(0); if (this.inFullscreen) { this.closeFullscreen(); } this.slidesLoaded = false; }; /** * @return {?} */ FivGallery.prototype.morphBack = /** * @return {?} */ function () { var _this = this; /** @type {?} */ var f = getPosition(this.getActiveImage()); /** @type {?} */ var t = getPosition(this.initialImage.thumbnail); this.overlay.hide(); this.morphOverlay.show(); tween(easeOutSine, 240) .pipe(fromToPixels(this.morphImage, f.top, t.top, 'top'), fromToPixels(this.morphImage, f.left, t.left, 'left'), fromToPixels(this.morphImage, f.height, t.height, 'height'), fromToPixels(this.morphImage, f.width, t.width, 'width')) .subscribe({ complete: (/** * @return {?} */ function () { _this.morphOverlay.hide(); _this.didClose.emit(_this.initialImage); _this.initialImage = null; }) }); }; /** * @return {?} */ FivGallery.prototype.slideOut = /** * @return {?} */ function () { var _this = this; this.overlay.hide(); this.morphOverlay.show(); this.morphImage.nativeElement.src = this.getActiveImage().nativeElement.src; setPosition(this.morphImage, getPosition(this.getActiveImage())); tween(easeOutSine, 240) .pipe(fromTo(this.morphImage, 'transform', 0, 100, (/** * @param {?} t * @return {?} */ function (t) { return "translateY(" + t + "%)"; }))) .subscribe({ complete: (/** * @return {?} */ function () { _this.morphImage.nativeElement.style.transform = ''; _this.morphOverlay.hide(); _this.didClose.emit(_this.initialImage); _this.initialImage = null; }) }); }; /** * @return {?} */ FivGallery.prototype.getActiveImage = /** * @return {?} */ function () { return this.slideImages.toArray()[this.activeIndex]; }; /** * @param {?} progress * @return {?} */ FivGallery.prototype.transformSlides = /** * @param {?} progress * @return {?} */ function (progress) { var _this = this; if (this.controlsVisible) { this.hideControls(); } this.domCtrl.write((/** * @return {?} */ function () { _this.renderer.setStyle(_this.viewer.nativeElement, 'transform', "translateY(" + progress * 120 + "px)"); })); }; /** * @param {?} progress * @return {?} */ FivGallery.prototype.resetSlides = /** * @param {?} progress * @return {?} */ function (progress) { var _this = this; /** @type {?} */ var reset = this.animation.build([ style({ transform: "translateY(" + progress * 120 + "px)" }), animate('150ms', style({ transform: "translateY(0px)" })) ]); /** @type {?} */ var animation = reset.create(this.viewer.nativeElement); animation.play(); animation.onDone((/** * @return {?} */ function () { animation.destroy(); _this.transformSlides(0); _this.showControls(); })); }; /** * @return {?} */ FivGallery.prototype.slideDidChange = /** * @return {?} */ function () { this.activeIndex = this.swiper.nativeElement.swiper.activeIndex; }; /** * @return {?} */ FivGallery.prototype.ionSlideNextStart = /** * @return {?} */ function () { if (this.slidesLoaded) { this.updateBackdrop(this.activeIndex + 1); } }; /** * @return {?} */ FivGallery.prototype.ionSlidePrevStart = /** * @return {?} */ function () { if (this.slidesLoaded) { this.updateBackdrop(this.activeIndex - 1); } }; /** * @param {?} index * @return {?} */ FivGallery.prototype.updateBackdrop = /** * @param {?} index * @return {?} */ function (index) { this.backdropColor = this.ambient ? this.imageService.getAverageRGB(this.images.toArray()[index].thumbnail.nativeElement) : '#000000ee'; this.backdropChange.emit(); }; /** * @return {?} */ FivGallery.prototype.onSlidesLoad = /** * @return {?} */ function () { this.slidesLoaded = true; }; /** * @return {?} */ FivGallery.prototype.calculateImagePosition = /** * @return {?} */ function () { /** @type {?} */ var nH = this.initialImage.thumbnail.nativeElement.naturalHeight; /** @type {?} */ var nW = this.initialImage.thumbnail.nativeElement.naturalWidth; /** @type {?} */ var height = Math.min(nH, this.platform.height()); /** @type {?} */ var width = Math.min(nW, this.platform.width()); /** @type {?} */ var ratio = nW / nH; if (ratio * height < width) { width = height * ratio; } else { height = width / ratio; } /** @type {?} */ var top = this.platform.height() / 2 - height / 2; /** @type {?} */ var left = this.platform.width() / 2 - width / 2; /** @type {?} */ var p = { height: height, width: width, left: left, top: top }; return p; }; /** * @return {?} */ FivGallery.prototype.fullscreen = /** * @return {?} */ function () { if (this.inFullscreen) { this.closeFullscreen(); } else { this.openFullscreen(); } }; /** * @return {?} */ FivGallery.prototype.openFullscreen = /** * @return {?} */ function () { /** @type {?} */ var elem = document.documentElement; if (elem.requestFullscreen) { elem.requestFullscreen(); } else if (elem['mozRequestFullScreen']) { /* Firefox */ elem['mozRequestFullScreen'](); } else if (elem['webkitRequestFullscreen']) { /* Chrome, Safari and Opera */ elem['webkitRequestFullscreen'](); } else if (elem['msRequestFullscreen']) { /* IE/Edge */ elem['msRequestFullscreen'](); } this.inFullscreen = true; }; /** * @return {?} */ FivGallery.prototype.closeFullscreen = /** * @return {?} */ function () { this.inFullscreen = false; if (this.document.exitFullscreen) { this.document.exitFullscreen(); } else if (this.document.mozCancelFullScreen) { /* Firefox */ this.document.mozCancelFullScreen(); } else if (this.document.webkitExitFullscreen) { /* Chrome, Safari and Opera */ this.document.webkitExitFullscreen(); } else if (this.document.msExitFullscreen) { /* IE/Edge */ this.document.msExitFullscreen(); } }; /** * @return {?} */ FivGallery.prototype.zoom = /** * @return {?} */ function () { if (this.zoomedIn) { this.zoomOut(); } else { this.zoomIn(); } }; /** * @return {?} */ FivGallery.prototype.zoomIn = /** * @return {?} */ function () { this.swiper.nativeElement.swiper.zoom.in(); this.zoomedIn = true; }; /** * @return {?} */ FivGallery.prototype.zoomOut = /** * @return {?} */ function () { this.swiper.nativeElement.swiper.zoom.out(); this.zoomedIn = false; }; /** * @return {?} */ FivGallery.prototype.handleSingleTap = /** * @return {?} */ function () { this.controlsVisible = !this.controlsVisible; this.change.detectChanges(); }; /** * @return {?} */ FivGallery.prototype.hideControls = /** * @return {?} */ function () { this.controlsVisible = false; this.change.detectChanges(); }; /** * @return {?} */ FivGallery.prototype.showControls = /** * @return {?} */ function () { this.controlsVisible = true; this.change.detectChanges(); }; /** * @param {?} event * @return {?} */ FivGallery.prototype.keyEvent = /** * @param {?} event * @return {?} */ function (event) { if (this.slidesLoaded && !this.morphing) { this.handleKeyboardEvents(event); } }; /** * @param {?} event * @return {?} */ FivGallery.prototype.handleKeyboardEvents = /** * @param {?} event * @return {?} */ function (event) { if (event.key === 'ArrowRight') { this.next(); return; } if (event.key === 'ArrowLeft') { this.prev(); return; } if (event.key === 'ArrowDown' || event.key === 'Escape') { this.close(); return; } }; /** * @return {?} */ FivGallery.prototype.next = /** * @return {?} */ function () { if (this.slides && this.slidesLoaded) { this.slides.slideNext(); } }; /** * @return {?} */ FivGallery.prototype.prev = /** * @return {?} */ function () { if (this.slides && this.slidesLoaded) { this.slides.slidePrev(); } }; FivGallery.decorators = [ { type: Component, args: [{ selector: 'fiv-gallery', template: "<ng-content></ng-content>\n<fiv-overlay #overlay>\n <div [style.background]=\"backdropColor\" [@fade] class=\"backdrop\" *ngIf=\"overlay.open && backdrop\"></div>\n\n <div [style.visibility]=\"!morphing ? 'visible' : 'hidden'\">\n <div [@slideDown] *ngIf=\"controlsVisible && topToolbar\" class=\"gallery-toolbar header\" color=\"transparent\">\n <ng-container [ngTemplateOutlet]=\"topToolbar\">\n </ng-container>\n </div>\n\n <ng-container *fivIf=\"['desktop']\">\n <ion-fab [@scale] *ngIf=\"controlsVisible && images?.length > 0 && pagerVisible\" vertical=\"center\"\n horizontal=\"start\" slot=\"fixed\">\n <ion-fab-button color=\"light\" (click)=\"prev()\" [disabled]=\"activeIndex === 0\">\n <ion-icon name=\"arrow-back\"></ion-icon>\n </ion-fab-button>\n </ion-fab>\n </ng-container>\n\n <div #viewer class=\"viewer\" fivPull [maxPullHeight]=\"160\" [minPullHeight]=\"120\" (fivPull)=\"transformSlides($event)\"\n (fivRefresh)=\"close()\" (fivCancel)=\"resetSlides($event)\" [enableScroll]=\"true\">\n <ion-slides #slider *ngIf=\"overlay.open\" (ionSlideDidChange)=\"slideDidChange()\"\n (ionSlideNextStart)=\"ionSlideNextStart()\" (ionSlidePrevStart)=\"ionSlidePrevStart()\"\n (ionSlidesDidLoad)=\"onSlidesLoad()\" [options]=\"{ zoom: true, initialSlide: initialImage?.index}\">\n <ion-slide *ngFor=\"let image of images; let i = index\">\n <div class=\"swiper-zoom-container\">\n <img #slideImage [ngClass]=\"{'instant': activeIndex !== i}\" [src]=\"image.src\">\n </div>\n </ion-slide>\n </ion-slides>\n </div>\n\n <ng-container *fivIf=\"['desktop']\">\n <ion-fab [@scale] *ngIf=\"controlsVisible && pagerVisible\" vertical=\"center\" horizontal=\"end\" slot=\"fixed\">\n <ion-fab-button color=\"light\" (click)=\"next()\" [disabled]=\"activeIndex === images.length - 1\">\n <ion-icon name=\"arrow-forward\"></ion-icon>\n </ion-fab-button>\n </ion-fab>\n </ng-container>\n\n <div [@slideUp] *ngIf=\"controlsVisible && bottomToolbar\" class=\"gallery-toolbar footer\" color=\"transparent\">\n <ng-container [ngTemplateOutlet]=\"bottomToolbar\">\n </ng-container>\n </div>\n </div>\n\n\n\n\n</fiv-overlay>\n<fiv-overlay #morphOverlay>\n <img #morph class=\"morph\" *ngIf=\"initialImage\" [src]=\"initialImage.src\">\n</fiv-overlay>", animations: [ trigger('scale', [ transition('void => *', [ style({ opacity: 0, transform: 'scale(0)' }), animate('125ms', style({ opacity: 1, transform: 'scale(1)' })) ]), transition('* => void', [ style({ opacity: 1, transform: 'scale(1)' }), animate('125ms', style({ opacity: 0, transform: 'scale(0)' })) ]) ]), trigger('slideUp', [ transition('void => *', [ style({ opacity: 0, transform: 'translateY(100%)' }), animate('75ms', style({ opacity: 1, transform: 'translateY(0%)' })) ]), transition('* => void', [ style({ opacity: 1, transform: 'translateY(0%)' }), animate('75ms', style({ opacity: 0, transform: 'translateY(100%)' })) ]) ]), trigger('slideDown', [ transition('* => void', [ style({ opacity: 0, transform: 'translateY(0%)' }), animate('75ms', style({ opacity: 1, transform: 'translateY(-100%)' })) ]), transition('void => *', [ style({ opacity: 1, transform: 'translateY(-100%)' }), animate('75ms', style({ opacity: 0, transform: 'translateY(0%)' })) ]) ]), trigger('fade', [ transition('* => void', useAnimation(fade, { params: { fromOpacity: 1, toOpacity: 0, time: '240ms' } })), transition('void => *', useAnimation(fade, { params: { fromOpacity: 0, toOpacity: 1, time: '240ms' } })) ]) ], styles: [".viewer{width:100vw;height:100vh}.viewer ion-slides{height:100%}.viewer img{height:auto;max-height:100%;width:auto;max-width:100%}.viewer img.instant{transition-duration:0s!important}.gallery-toolbar{width:100%;--fiv-gallery-toolbar-color:#fff;position:absolute;color:var(--fiv-gallery-toolbar-color)}.gallery-toolbar.header{top:env(safe-area-inset-top)}.gallery-toolbar.footer{bottom:env(safe-area-inset-bottom)}.morph{position:absolute;-o-object-position:center;object-position:center;-o-object-fit:cover;object-fit:cover;display:block}.backdrop{height:100vh;width:100vw;position:absolute;transition:background-color .2s}"] }] } ]; /** @nocollapse */ FivGallery.ctorParameters = function () { return [ { type: DomController }, { type: Renderer2 }, { type: AnimationBuilder }, { type: ChangeDetectorRef }, { type: Platform }, { type: ImageService }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; }; FivGallery.propDecorators = { overlay: [{ type: ViewChild, args: ['overlay', { static: false },] }], morphOverlay: [{ type: ViewChild, args: ['morphOverlay', { static: false },] }], viewer: [{ type: ViewChild, args: ['viewer', { static: false },] }], morphImage: [{ type: ViewChild, args: ['morph', { static: false },] }], swiper: [{ type: ViewChild, args: ['slider', { static: false, read: ElementRef },] }], slides: [{ type: ViewChild, args: ['slider', { static: false },] }], slideImages: [{ type: ViewChildren, args: ['slideImage',] }], images: [{ type: ContentChildren, args: [forwardRef((/** * @return {?} */ function () { return FivGalleryImage; })), { descendants: true },] }], toolbars: [{ type: ContentChildren, args: [FivGalleryToolbar,] }], pagerVisible: [{ type: Input }], ambient: [{ type: Input }], willOpen: [{ type: Output }], willClose: [{ type: Output }], didOpen: [{ type: Output }], didClose: [{ type: Output }], backdropChange: [{ type: Output }], keyEvent: [{ type: HostListener, args: ['window:keyup', ['$event'],] }] }; return FivGallery; }()); export { FivGallery }; if (false) { /** @type {?} */ FivGallery.prototype.overlay; /** @type {?} */ FivGallery.prototype.morphOverlay; /** @type {?} */ FivGallery.prototype.viewer; /** @type {?} */ FivGallery.prototype.morphImage; /** @type {?} */ FivGallery.prototype.swiper; /** @type {?} */ FivGallery.prototype.slides; /** @type {?} */ FivGallery.prototype.slideImages; /** @type {?} */ FivGallery.prototype.images; /** @type {?} */ FivGallery.prototype.toolbars; /** @type {?} */ FivGallery.prototype.topToolbar; /** @type {?} */ FivGallery.prototype.bottomToolbar; /** @type {?} */ FivGallery.prototype.initialImage; /** @type {?} */ FivGallery.prototype.activeIndex; /** @type {?} */ FivGallery.prototype.inFullscreen; /** @type {?} */ FivGallery.prototype.zoomedIn; /** @type {?} */ FivGallery.prototype.controlsVisible; /** @type {?} */ FivGallery.prototype.slidesLoaded; /** @type {?} */ FivGallery.prototype.morphing; /** @type {?} */ FivGallery.prototype.backdrop; /** @type {?} */ FivGallery.prototype.backdropColor; /** @type {?} */ FivGallery.prototype.pagerVisible; /** @type {?} */ FivGallery.prototype.ambient; /** @type {?} */ FivGallery.prototype.willOpen; /** @type {?} */ FivGallery.prototype.willClose; /** @type {?} */ FivGallery.prototype.didOpen; /** @type {?} */ FivGallery.prototype.didClose; /** @type {?} */ FivGallery.prototype.backdropChange; /** @type {?} */ FivGallery.prototype.$onDestroy; /** * @type {?} * @private */ FivGallery.prototype.domCtrl; /** * @type {?} * @private */ FivGallery.prototype.renderer; /** * @type {?} * @private */ FivGallery.prototype.animation; /** * @type {?} * @private */ FivGallery.prototype.change; /** * @type {?} * @private */ FivGallery.prototype.platform; /** * @type {?} * @private */ FivGallery.prototype.imageService; /** * @type {?} * @private */ FivGallery.prototype.document; } var Position = /** @class */ (function () { function Position() { } return Position; }()); export { Position }; if (false) { /** @type {?} */ Position.prototype.top; /** @type {?} */ Position.prototype.left; /** @type {?} */ Position.prototype.height; /** @type {?} */ Position.prototype.width; /** @type {?} */ Position.prototype.translate; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FsbGVyeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZml2ZXRocmVlL2NvcmUvIiwic291cmNlcyI6WyJsaWIvZ2FsbGVyeS9nYWxsZXJ5LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM1RCxPQUFPLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFDVCxVQUFVLEVBQ1YsU0FBUyxFQUNULGVBQWUsRUFDZixTQUFTLEVBRVQsVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04saUJBQWlCLEVBRWpCLEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUVaLFlBQVksRUFDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsS0FBSyxFQUNMLE9BQU8sRUFDUCxnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLFVBQVUsRUFDVixZQUFZLEVBQ2IsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUNMLEtBQUssRUFDTCxNQUFNLEVBQ04sV0FBVyxFQUNYLFdBQVcsRUFFWCxZQUFZLEVBQ1osV0FBVyxFQUNaLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxF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Ozs7OztJQUd6Qiw2QkFBOEI7Ozs7O0lBQzlCLDhCQUEyQjs7Ozs7SUFDM0IsK0JBQW1DOzs7OztJQUNuQyw0QkFBaUM7Ozs7O0lBQ2pDLDhCQUEwQjs7Ozs7SUFDMUIsa0NBQWtDOzs7OztJQUNsQyw4QkFBdUM7O0FBOFYzQztJQUFBO0lBTUEsQ0FBQztJQUFELGVBQUM7QUFBRCxDQUFDLEFBTkQsSUFNQzs7OztJQUxDLHVCQUFZOztJQUNaLHdCQUFhOztJQUNiLDBCQUFlOztJQUNmLHlCQUFjOztJQUNkLDZCQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZpdkdhbGxlcnlUb29sYmFyIH0gZnJvbSAnLi9nYWxsZXJ5LXRvb2xiYXIvZ2FsbGVyeS10b29sYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJb25TbGlkZXMsIERvbUNvbnRyb2xsZXIsIFBsYXRmb3JtIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgRml2T3ZlcmxheSB9IGZyb20gJy4vLi4vb3ZlcmxheS9vdmVybGF5LmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgUmVuZGVyZXIyLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIFF1ZXJ5TGlzdCxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgZm9yd2FyZFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBJbmplY3QsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBUZW1wbGF0ZVJlZixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkRlc3Ryb3ksXG4gIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIHN0eWxlLFxuICBhbmltYXRlLFxuICBBbmltYXRpb25CdWlsZGVyLFxuICB0cmlnZ2VyLFxuICB0cmFuc2l0aW9uLFxuICB1c2VBbmltYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBLZXkgfSBmcm9tICcuL2tleWNvZGVzLmVudW0nO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmF2aWdhdGVhYmxlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBGaXZHYWxsZXJ5SW1hZ2UgfSBmcm9tICcuL2dhbGxlcnktaW1hZ2UvZ2FsbGVyeS1pbWFnZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgZnJvbSwgU3ViamVjdCwgemlwLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWVyZ2VNYXAsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgdHdlZW4sXG4gIGZyb21UbyxcbiAgZ2V0UG9zaXRpb24sXG4gIHNldFBvc2l0aW9uLFxuICBSZWN0UG9zaXRpb24sXG4gIGZyb21Ub1BpeGVscyxcbiAgZWFzZU91dFNpbmVcbn0gZnJvbSAnQGZpdmV0aHJlZS9uZ3gtcnhqcy1hbmltYXRpb25zJztcbmltcG9ydCB7IGZhZGUgfSBmcm9tICcuLi9hbmltYXRpb25zL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgSW1hZ2VTZXJ2aWNlIH0gZnJvbSAnLi9pbWFnZS5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZml2LWdhbGxlcnknLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2FsbGVyeS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2dhbGxlcnkuY29tcG9uZW50LnNjc3MnXSxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ3NjYWxlJywgW1xuICAgICAgdHJhbnNpdGlvbigndm9pZCA9PiAqJywgW1xuICAgICAgICBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3NjYWxlKDApJyB9KSxcbiAgICAgICAgYW5pbWF0ZSgnMTI1bXMnLCBzdHlsZSh7IG9wYWNpdHk6IDEsIHRyYW5zZm9ybTogJ3NjYWxlKDEpJyB9KSlcbiAgICAgIF0pLFxuICAgICAgdHJhbnNpdGlvbignKiA9PiB2b2lkJywgW1xuICAgICAgICBzdHlsZSh7IG9wYWNpdHk6IDEsIHRyYW5zZm9ybTogJ3NjYWxlKDEpJyB9KSxcbiAgICAgICAgYW5pbWF0ZSgnMTI1bXMnLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3NjYWxlKDApJyB9KSlcbiAgICAgIF0pXG4gICAgXSksXG4gICAgdHJpZ2dlcignc2xpZGVVcCcsIFtcbiAgICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gKicsIFtcbiAgICAgICAgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDEwMCUpJyB9KSxcbiAgICAgICAgYW5pbWF0ZSgnNzVtcycsIHN0eWxlKHsgb3BhY2l0eTogMSwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgwJSknIH0pKVxuICAgICAgXSksXG4gICAgICB0cmFuc2l0aW9uKCcqID0+IHZvaWQnLCBbXG4gICAgICAgIHN0eWxlKHsgb3BhY2l0eTogMSwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgwJSknIH0pLFxuICAgICAgICBhbmltYXRlKCc3NW1zJywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDEwMCUpJyB9KSlcbiAgICAgIF0pXG4gICAgXSksXG4gICAgdHJpZ2dlcignc2xpZGVEb3duJywgW1xuICAgICAgdHJhbnNpdGlvbignKiA9PiB2b2lkJywgW1xuICAgICAgICBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMCUpJyB9KSxcbiAgICAgICAgYW5pbWF0ZSgnNzVtcycsIHN0eWxlKHsgb3BhY2l0eTogMSwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtMTAwJSknIH0pKVxuICAgICAgXSksXG4gICAgICB0cmFuc2l0aW9uKCd2b2lkID0+IConLCBbXG4gICAgICAgIHN0eWxlKHsgb3BhY2l0eTogMSwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtMTAwJSknIH0pLFxuICAgICAgICBhbmltYXRlKCc