UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

404 lines 44.8 kB
import { ChangeDetectionStrategy, Component, EventEmitter, ViewChild, ViewEncapsulation } from '@angular/core'; import { fromEvent } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { fadeMotion } from 'ng-zorro-antd/core/animation'; import { NzDestroyService } from 'ng-zorro-antd/core/services'; import { isNotNil } from 'ng-zorro-antd/core/util'; import { FADE_CLASS_NAME_MAP, NZ_CONFIG_MODULE_NAME } from './image-config'; import { getClientSize, getFitContentPosition, getOffset } from './utils'; import * as i0 from "@angular/core"; import * as i1 from "ng-zorro-antd/core/config"; import * as i2 from "./image-preview-options"; import * as i3 from "@angular/cdk/overlay"; import * as i4 from "ng-zorro-antd/core/services"; import * as i5 from "@angular/platform-browser"; import * as i6 from "@angular/cdk/drag-drop"; import * as i7 from "@angular/common"; import * as i8 from "ng-zorro-antd/icon"; const initialPosition = { x: 0, y: 0 }; export class NzImagePreviewComponent { constructor(ngZone, host, cdr, nzConfigService, config, overlayRef, destroy$, sanitizer) { this.ngZone = ngZone; this.host = host; this.cdr = cdr; this.nzConfigService = nzConfigService; this.config = config; this.overlayRef = overlayRef; this.destroy$ = destroy$; this.sanitizer = sanitizer; this.images = []; this.index = 0; this.isDragging = false; this.visible = true; this.animationState = 'enter'; this.animationStateChanged = new EventEmitter(); this.previewImageTransform = ''; this.previewImageWrapperTransform = ''; this.operations = [ { icon: 'close', onClick: () => { this.onClose(); }, type: 'close' }, { icon: 'zoom-in', onClick: () => { this.onZoomIn(); }, type: 'zoomIn' }, { icon: 'zoom-out', onClick: () => { this.onZoomOut(); }, type: 'zoomOut' }, { icon: 'rotate-right', onClick: () => { this.onRotateRight(); }, type: 'rotateRight' }, { icon: 'rotate-left', onClick: () => { this.onRotateLeft(); }, type: 'rotateLeft' } ]; this.zoomOutDisabled = false; this.position = { ...initialPosition }; this.containerClick = new EventEmitter(); this.closeClick = new EventEmitter(); this.zoom = this.config.nzZoom ?? 1; this.rotate = this.config.nzRotate ?? 0; this.updateZoomOutDisabled(); this.updatePreviewImageTransform(); this.updatePreviewImageWrapperTransform(); } get animationDisabled() { return this.config.nzNoAnimation ?? false; } get maskClosable() { const defaultConfig = this.nzConfigService.getConfigForComponent(NZ_CONFIG_MODULE_NAME) || {}; return this.config.nzMaskClosable ?? defaultConfig.nzMaskClosable ?? true; } ngOnInit() { this.ngZone.runOutsideAngular(() => { fromEvent(this.host.nativeElement, 'click') .pipe(takeUntil(this.destroy$)) .subscribe(event => { if (event.target === event.currentTarget && this.maskClosable && this.containerClick.observers.length) { this.ngZone.run(() => this.containerClick.emit()); } }); fromEvent(this.imagePreviewWrapper.nativeElement, 'mousedown') .pipe(takeUntil(this.destroy$)) .subscribe(() => { this.isDragging = true; }); }); } setImages(images) { this.images = images; this.cdr.markForCheck(); } switchTo(index) { this.index = index; this.cdr.markForCheck(); } next() { if (this.index < this.images.length - 1) { this.reset(); this.index++; this.updatePreviewImageTransform(); this.updatePreviewImageWrapperTransform(); this.updateZoomOutDisabled(); this.cdr.markForCheck(); } } prev() { if (this.index > 0) { this.reset(); this.index--; this.updatePreviewImageTransform(); this.updatePreviewImageWrapperTransform(); this.updateZoomOutDisabled(); this.cdr.markForCheck(); } } markForCheck() { this.cdr.markForCheck(); } onClose() { this.closeClick.emit(); } onZoomIn() { this.zoom += 1; this.updatePreviewImageTransform(); this.updateZoomOutDisabled(); this.position = { ...initialPosition }; } onZoomOut() { if (this.zoom > 1) { this.zoom -= 1; this.updatePreviewImageTransform(); this.updateZoomOutDisabled(); this.position = { ...initialPosition }; } } onRotateRight() { this.rotate += 90; this.updatePreviewImageTransform(); } onRotateLeft() { this.rotate -= 90; this.updatePreviewImageTransform(); } onSwitchLeft(event) { event.preventDefault(); event.stopPropagation(); this.prev(); } onSwitchRight(event) { event.preventDefault(); event.stopPropagation(); this.next(); } onAnimationStart(event) { if (event.toState === 'enter') { this.setEnterAnimationClass(); } else if (event.toState === 'leave') { this.setLeaveAnimationClass(); } this.animationStateChanged.emit(event); } onAnimationDone(event) { if (event.toState === 'enter') { this.setEnterAnimationClass(); } else if (event.toState === 'leave') { this.setLeaveAnimationClass(); } this.animationStateChanged.emit(event); } startLeaveAnimation() { this.animationState = 'leave'; this.cdr.markForCheck(); } onDragReleased() { this.isDragging = false; const width = this.imageRef.nativeElement.offsetWidth * this.zoom; const height = this.imageRef.nativeElement.offsetHeight * this.zoom; const { left, top } = getOffset(this.imageRef.nativeElement); const { width: clientWidth, height: clientHeight } = getClientSize(); const isRotate = this.rotate % 180 !== 0; const fitContentParams = { width: isRotate ? height : width, height: isRotate ? width : height, left, top, clientWidth, clientHeight }; const fitContentPos = getFitContentPosition(fitContentParams); if (isNotNil(fitContentPos.x) || isNotNil(fitContentPos.y)) { this.position = { ...this.position, ...fitContentPos }; } } sanitizerResourceUrl(url) { return this.sanitizer.bypassSecurityTrustResourceUrl(url); } updatePreviewImageTransform() { this.previewImageTransform = `scale3d(${this.zoom}, ${this.zoom}, 1) rotate(${this.rotate}deg)`; } updatePreviewImageWrapperTransform() { this.previewImageWrapperTransform = `translate3d(${this.position.x}px, ${this.position.y}px, 0)`; } updateZoomOutDisabled() { this.zoomOutDisabled = this.zoom <= 1; } setEnterAnimationClass() { if (this.animationDisabled) { return; } const backdropElement = this.overlayRef.backdropElement; if (backdropElement) { backdropElement.classList.add(FADE_CLASS_NAME_MAP.enter); backdropElement.classList.add(FADE_CLASS_NAME_MAP.enterActive); } } setLeaveAnimationClass() { if (this.animationDisabled) { return; } const backdropElement = this.overlayRef.backdropElement; if (backdropElement) { backdropElement.classList.add(FADE_CLASS_NAME_MAP.leave); backdropElement.classList.add(FADE_CLASS_NAME_MAP.leaveActive); } } reset() { this.zoom = 1; this.rotate = 0; this.position = { ...initialPosition }; } } NzImagePreviewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: NzImagePreviewComponent, deps: [{ token: i0.NgZone }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.NzConfigService }, { token: i2.NzImagePreviewOptions }, { token: i3.OverlayRef }, { token: i4.NzDestroyService }, { token: i5.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component }); NzImagePreviewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: NzImagePreviewComponent, selector: "nz-image-preview", host: { attributes: { "tabindex": "-1", "role": "document" }, listeners: { "@fadeMotion.start": "onAnimationStart($event)", "@fadeMotion.done": "onAnimationDone($event)" }, properties: { "class.ant-image-preview-moving": "isDragging", "style.zIndex": "config.nzZIndex", "@.disabled": "config.nzNoAnimation", "@fadeMotion": "animationState" }, classAttribute: "ant-image-preview-wrap" }, providers: [NzDestroyService], viewQueries: [{ propertyName: "imageRef", first: true, predicate: ["imgRef"], descendants: true }, { propertyName: "imagePreviewWrapper", first: true, predicate: ["imagePreviewWrapper"], descendants: true, static: true }], exportAs: ["nzImagePreview"], ngImport: i0, template: ` <div class="ant-image-preview"> <div tabindex="0" aria-hidden="true" style="width: 0; height: 0; overflow: hidden; outline: none;"></div> <div class="ant-image-preview-content"> <div class="ant-image-preview-body"> <ul class="ant-image-preview-operations"> <li class="ant-image-preview-operations-operation" [class.ant-image-preview-operations-operation-disabled]="zoomOutDisabled && option.type === 'zoomOut'" (click)="option.onClick()" *ngFor="let option of operations" > <span class="ant-image-preview-operations-icon" nz-icon [nzType]="option.icon" nzTheme="outline"></span> </li> </ul> <div class="ant-image-preview-img-wrapper" #imagePreviewWrapper cdkDrag [style.transform]="previewImageWrapperTransform" [cdkDragFreeDragPosition]="position" (cdkDragReleased)="onDragReleased()" > <ng-container *ngFor="let image of images; index as imageIndex"> <img cdkDragHandle class="ant-image-preview-img" #imgRef *ngIf="index === imageIndex" [attr.src]="sanitizerResourceUrl(image.src)" [attr.srcset]="image.srcset" [attr.alt]="image.alt" [style.width]="image.width" [style.height]="image.height" [style.transform]="previewImageTransform" /> </ng-container> </div> <ng-container *ngIf="images.length > 1"> <div class="ant-image-preview-switch-left" [class.ant-image-preview-switch-left-disabled]="index <= 0" (click)="onSwitchLeft($event)" > <span nz-icon nzType="left" nzTheme="outline"></span> </div> <div class="ant-image-preview-switch-right" [class.ant-image-preview-switch-right-disabled]="index >= images.length - 1" (click)="onSwitchRight($event)" > <span nz-icon nzType="right" nzTheme="outline"></span> </div> </ng-container> </div> </div> <div tabindex="0" aria-hidden="true" style="width: 0; height: 0; overflow: hidden; outline: none;"></div> </div> `, isInline: true, dependencies: [{ kind: "directive", type: i6.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i6.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }], animations: [fadeMotion], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: NzImagePreviewComponent, decorators: [{ type: Component, args: [{ selector: 'nz-image-preview', exportAs: 'nzImagePreview', animations: [fadeMotion], template: ` <div class="ant-image-preview"> <div tabindex="0" aria-hidden="true" style="width: 0; height: 0; overflow: hidden; outline: none;"></div> <div class="ant-image-preview-content"> <div class="ant-image-preview-body"> <ul class="ant-image-preview-operations"> <li class="ant-image-preview-operations-operation" [class.ant-image-preview-operations-operation-disabled]="zoomOutDisabled && option.type === 'zoomOut'" (click)="option.onClick()" *ngFor="let option of operations" > <span class="ant-image-preview-operations-icon" nz-icon [nzType]="option.icon" nzTheme="outline"></span> </li> </ul> <div class="ant-image-preview-img-wrapper" #imagePreviewWrapper cdkDrag [style.transform]="previewImageWrapperTransform" [cdkDragFreeDragPosition]="position" (cdkDragReleased)="onDragReleased()" > <ng-container *ngFor="let image of images; index as imageIndex"> <img cdkDragHandle class="ant-image-preview-img" #imgRef *ngIf="index === imageIndex" [attr.src]="sanitizerResourceUrl(image.src)" [attr.srcset]="image.srcset" [attr.alt]="image.alt" [style.width]="image.width" [style.height]="image.height" [style.transform]="previewImageTransform" /> </ng-container> </div> <ng-container *ngIf="images.length > 1"> <div class="ant-image-preview-switch-left" [class.ant-image-preview-switch-left-disabled]="index <= 0" (click)="onSwitchLeft($event)" > <span nz-icon nzType="left" nzTheme="outline"></span> </div> <div class="ant-image-preview-switch-right" [class.ant-image-preview-switch-right-disabled]="index >= images.length - 1" (click)="onSwitchRight($event)" > <span nz-icon nzType="right" nzTheme="outline"></span> </div> </ng-container> </div> </div> <div tabindex="0" aria-hidden="true" style="width: 0; height: 0; overflow: hidden; outline: none;"></div> </div> `, preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: { class: 'ant-image-preview-wrap', '[class.ant-image-preview-moving]': 'isDragging', '[style.zIndex]': 'config.nzZIndex', '[@.disabled]': 'config.nzNoAnimation', '[@fadeMotion]': 'animationState', '(@fadeMotion.start)': 'onAnimationStart($event)', '(@fadeMotion.done)': 'onAnimationDone($event)', tabindex: '-1', role: 'document' }, providers: [NzDestroyService] }] }], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.NzConfigService }, { type: i2.NzImagePreviewOptions }, { type: i3.OverlayRef }, { type: i4.NzDestroyService }, { type: i5.DomSanitizer }]; }, propDecorators: { imageRef: [{ type: ViewChild, args: ['imgRef'] }], imagePreviewWrapper: [{ type: ViewChild, args: ['imagePreviewWrapper', { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtcHJldmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9jb21wb25lbnRzL2ltYWdlL2ltYWdlLXByZXZpZXcuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFHWixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUvRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFbkQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHNUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxxQkFBcUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7Ozs7Ozs7Ozs7QUFTMUUsTUFBTSxlQUFlLEdBQUc7SUFDdEIsQ0FBQyxFQUFFLENBQUM7SUFDSixDQUFDLEVBQUUsQ0FBQztDQUNMLENBQUM7QUFpRkYsTUFBTSxPQUFPLHVCQUF1QjtJQXFFbEMsWUFDVSxNQUFjLEVBQ2QsSUFBNkIsRUFDN0IsR0FBc0IsRUFDdkIsZUFBZ0MsRUFDaEMsTUFBNkIsRUFDNUIsVUFBc0IsRUFDdEIsUUFBMEIsRUFDMUIsU0FBdUI7UUFQdkIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFNBQUksR0FBSixJQUFJLENBQXlCO1FBQzdCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ3ZCLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxXQUFNLEdB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QixDQUFDO2lCQUM5QjsyU0F1RHNCLFFBQVE7c0JBQTVCLFNBQVM7dUJBQUMsUUFBUTtnQkFDaUMsbUJBQW1CO3NCQUF0RSxTQUFTO3VCQUFDLHFCQUFxQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IEFuaW1hdGlvbkV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBPdmVybGF5UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgTmdab25lLFxuICBPbkluaXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVSZXNvdXJjZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IGZhZGVNb3Rpb24gfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvYW5pbWF0aW9uJztcbmltcG9ydCB7IE56Q29uZmlnU2VydmljZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9jb25maWcnO1xuaW1wb3J0IHsgTnpEZXN0cm95U2VydmljZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS9zZXJ2aWNlcyc7XG5pbXBvcnQgeyBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgaXNOb3ROaWwgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdXRpbCc7XG5cbmltcG9ydCB7IEZBREVfQ0xBU1NfTkFNRV9NQVAsIE5aX0NPTkZJR19NT0RVTEVfTkFNRSB9IGZyb20gJy4vaW1hZ2UtY29uZmlnJztcbmltcG9ydCB7IE56SW1hZ2UsIE56SW1hZ2VQcmV2aWV3T3B0aW9ucyB9IGZyb20gJy4vaW1hZ2UtcHJldmlldy1vcHRpb25zJztcbmltcG9ydCB7IE56SW1hZ2VQcmV2aWV3UmVmIH0gZnJvbSAnLi9pbWFnZS1wcmV2aWV3LXJlZic7XG5pbXBvcnQgeyBnZXRDbGllbnRTaXplLCBnZXRGaXRDb250ZW50UG9zaXRpb24sIGdldE9mZnNldCB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE56SW1hZ2VDb250YWluZXJPcGVyYXRpb24ge1xuICBpY29uOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcblxuICBvbkNsaWNrKCk6IHZvaWQ7XG59XG5cbmNvbnN0IGluaXRpYWxQb3NpdGlvbiA9IHtcbiAgeDogMCxcbiAgeTogMFxufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbnotaW1hZ2UtcHJldmlldycsXG4gIGV4cG9ydEFzOiAnbnpJbWFnZVByZXZpZXcnLFxuICBhbmltYXRpb25zOiBbZmFkZU1vdGlvbl0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImFudC1pbWFnZS1wcmV2aWV3XCI+XG4gICAgICA8ZGl2IHRhYmluZGV4PVwiMFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHN0eWxlPVwid2lkdGg6IDA7IGhlaWdodDogMDsgb3ZlcmZsb3c6IGhpZGRlbjsgb3V0bGluZTogbm9uZTtcIj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJhbnQtaW1hZ2UtcHJldmlldy1jb250ZW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhbnQtaW1hZ2UtcHJldmlldy1ib2R5XCI+XG4gICAgICAgICAgPHVsIGNsYXNzPVwiYW50LWltYWdlLXByZXZpZXctb3BlcmF0aW9uc1wiPlxuICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgIGNsYXNzPVwiYW50LWltYWdlLXByZXZpZXctb3BlcmF0aW9ucy1vcGVyYXRpb25cIlxuICAgICAgICAgICAgICBbY2xhc3MuYW50LWltYWdlLXByZXZpZXctb3BlcmF0aW9ucy1vcGVyYXRpb24tZGlzYWJsZWRdPVwiem9vbU91dERpc2FibGVkICYmIG9wdGlvbi50eXBlID09PSAnem9vbU91dCdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib3B0aW9uLm9uQ2xpY2soKVwiXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygb3BlcmF0aW9uc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYW50LWltYWdlLXByZXZpZXctb3BlcmF0aW9ucy1pY29uXCIgbnotaWNvbiBbbnpUeXBlXT1cIm9wdGlvbi5pY29uXCIgbnpUaGVtZT1cIm91dGxpbmVcIj48L3NwYW4+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJhbnQtaW1hZ2UtcHJldmlldy1pbWctd3JhcHBlclwiXG4gICAgICAgICAgICAjaW1hZ2VQcmV2aWV3V3JhcHBlclxuICAgICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgICAgW3N0eWxlLnRyYW5zZm9ybV09XCJwcmV2aWV3SW1hZ2VXcmFwcGVyVHJhbnNmb3JtXCJcbiAgICAgICAgICAgIFtjZGtEcmFnRnJlZURyYWdQb3NpdGlvbl09XCJwb3NpdGlvblwiXG4gICAgICAgICAgICAoY2RrRHJhZ1JlbGVhc2VkKT1cIm9uRHJhZ1JlbGVhc2VkKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGltYWdlIG9mIGltYWdlczsgaW5kZXggYXMgaW1hZ2VJbmRleFwiPlxuICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgY2RrRHJhZ0hhbmRsZVxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYW50LWltYWdlLXByZXZpZXctaW1nXCJcbiAgICAgICAgICAgICAgICAjaW1nUmVmXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpbmRleCA9PT0gaW1hZ2VJbmRleFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuc3JjXT1cInNhbml0aXplclJlc291cmNlVXJsKGltYWdlLnNyYylcIlxuICAgICAgICAgICAgICAgIFthdHRyLnNyY3NldF09XCJpbWFnZS5zcmNzZXRcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFsdF09XCJpbWFnZS5hbHRcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJpbWFnZS53aWR0aFwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodF09XCJpbWFnZS5oZWlnaHRcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS50cmFuc2Zvcm1dPVwicHJldmlld0ltYWdlVHJhbnNmb3JtXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpbWFnZXMubGVuZ3RoID4gMVwiPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImFudC1pbWFnZS1wcmV2aWV3LXN3aXRjaC1sZWZ0XCJcbiAgICAgICAgICAgICAgW2NsYXNzLmFudC1pbWFnZS1wcmV2aWV3LXN3aXRjaC1sZWZ0LWRpc2FibGVkXT1cImluZGV4IDw9IDBcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25Td2l0Y2hMZWZ0KCRldmVudClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhbiBuei1pY29uIG56VHlwZT1cImxlZnRcIiBuelRoZW1lPVwib3V0bGluZVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImFudC1pbWFnZS1wcmV2aWV3LXN3aXRjaC1yaWdodFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5hbnQtaW1hZ2UtcHJldmlldy1zd2l0Y2gtcmlnaHQtZGlzYWJsZWRdPVwiaW5kZXggPj0gaW1hZ2VzLmxlbmd0aCAtIDFcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25Td2l0Y2hSaWdodCgkZXZlbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPHNwYW4gbnotaWNvbiBuelR5cGU9XCJyaWdodFwiIG56VGhlbWU9XCJvdXRsaW5lXCI+PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IHRhYmluZGV4PVwiMFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHN0eWxlPVwid2lkdGg6IDA7IGhlaWdodDogMDsgb3ZlcmZsb3c6IGhpZGRlbjsgb3V0bGluZTogbm9uZTtcIj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBob3N0OiB7XG4gICAgY2xhc3M6ICdhbnQtaW1hZ2UtcHJldmlldy13cmFwJyxcbiAgICAnW2NsYXNzLmFudC1pbWFnZS1wcmV2aWV3LW1vdmluZ10nOiAnaXNEcmFnZ2luZycsXG4gICAgJ1tzdHlsZS56SW5kZXhdJzogJ2NvbmZpZy5uelpJbmRleCcsXG4gICAgJ1tALmRpc2FibGVkXSc6ICdjb25maWcubnpOb0FuaW1hdGlvbicsXG4gICAgJ1tAZmFkZU1vdGlvbl0nOiAnYW5pbWF0aW9uU3RhdGUnLFxuICAgICcoQGZhZGVNb3Rpb24uc3RhcnQpJzogJ29uQW5pbWF0aW9uU3RhcnQoJGV2ZW50KScsXG4gICAgJyhAZmFkZU1vdGlvbi5kb25lKSc6ICdvbkFuaW1hdGlvbkRvbmUoJGV2ZW50KScsXG4gICAgdGFiaW5kZXg6ICctMScsXG4gICAgcm9sZTogJ2RvY3VtZW50J1xuICB9LFxuICBwcm92aWRlcnM6IFtOekRlc3Ryb3lTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBOekltYWdlUHJldmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGltYWdlczogTnpJbWFnZVtdID0gW107XG4gIGluZGV4ID0gMDtcbiAgaXNEcmFnZ2luZyA9IGZhbHNlO1xuICB2aXNpYmxlID0gdHJ1ZTtcbiAgYW5pbWF0aW9uU3RhdGU6ICd2b2lkJyB8ICdlbnRlcicgfCAnbGVhdmUnID0gJ2VudGVyJztcbiAgYW5pbWF0aW9uU3RhdGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxBbmltYXRpb25FdmVudD4oKTtcblxuICBwcmV2aWV3SW1hZ2VUcmFuc2Zvcm0gPSAnJztcbiAgcHJldmlld0ltYWdlV3JhcHBlclRyYW5zZm9ybSA9ICcnO1xuICBvcGVyYXRpb25zOiBOekltYWdlQ29udGFpbmVyT3BlcmF0aW9uW10gPSBbXG4gICAge1xuICAgICAgaWNvbjogJ2Nsb3NlJyxcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgdGhpcy5vbkNsb3NlKCk7XG4gICAgICB9LFxuICAgICAgdHlwZTogJ2Nsb3NlJ1xuICAgIH0sXG4gICAge1xuICAgICAgaWNvbjogJ3pvb20taW4nLFxuICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICB0aGlzLm9uWm9vbUluKCk7XG4gICAgICB9LFxuICAgICAgdHlwZTogJ3pvb21JbidcbiAgICB9LFxuICAgIHtcbiAgICAgIGljb246ICd6b29tLW91dCcsXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7XG4gICAgICAgIHRoaXMub25ab29tT3V0KCk7XG4gICAgICB9LFxuICAgICAgdHlwZTogJ3pvb21PdXQnXG4gICAgfSxcbiAgICB7XG4gICAgICBpY29uOiAncm90YXRlLXJpZ2h0JyxcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgdGhpcy5vblJvdGF0ZVJpZ2h0KCk7XG4gICAgICB9LFxuICAgICAgdHlwZTogJ3JvdGF0ZVJpZ2h0J1xuICAgIH0sXG4gICAge1xuICAgICAgaWNvbjogJ3JvdGF0ZS1sZWZ0JyxcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgdGhpcy5vblJvdGF0ZUxlZnQoKTtcbiAgICAgIH0sXG4gICAgICB0eXBlOiAncm90YXRlTGVmdCdcbiAgICB9XG4gIF07XG5cbiAgem9vbU91dERpc2FibGVkID0gZmFsc2U7XG4gIHBvc2l0aW9uID0geyAuLi5pbml0aWFsUG9zaXRpb24gfTtcbiAgcHJldmlld1JlZiE6IE56SW1hZ2VQcmV2aWV3UmVmO1xuICBjb250YWluZXJDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgY2xvc2VDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICBAVmlld0NoaWxkKCdpbWdSZWYnKSBpbWFnZVJlZiE6IEVsZW1lbnRSZWY8SFRNTEltYWdlRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2ltYWdlUHJldmlld1dyYXBwZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSBpbWFnZVByZXZpZXdXcmFwcGVyITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgcHJpdmF0ZSB6b29tOiBudW1iZXI7XG4gIHByaXZhdGUgcm90YXRlOiBudW1iZXI7XG5cbiAgZ2V0IGFuaW1hdGlvbkRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5uek5vQW5pbWF0aW9uID8/IGZhbHNlO1xuICB9XG5cbiAgZ2V0IG1hc2tDbG9zYWJsZSgpOiBib29sZWFuIHtcbiAgICBjb25zdCBkZWZhdWx0Q29uZmlnOiBOelNhZmVBbnkgPSB0aGlzLm56Q29uZmlnU2VydmljZS5nZXRDb25maWdGb3JDb21wb25lbnQoTlpfQ09ORklHX01PRFVMRV9OQU1FKSB8fCB7fTtcbiAgICByZXR1cm4gdGhpcy5jb25maWcubnpNYXNrQ2xvc2FibGUgPz8gZGVmYXVsdENvbmZpZy5uek1hc2tDbG9zYWJsZSA/PyB0cnVlO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIGhvc3Q6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwdWJsaWMgbnpDb25maWdTZXJ2aWNlOiBOekNvbmZpZ1NlcnZpY2UsXG4gICAgcHVibGljIGNvbmZpZzogTnpJbWFnZVByZXZpZXdPcHRpb25zLFxuICAgIHByaXZhdGUgb3ZlcmxheVJlZjogT3ZlcmxheVJlZixcbiAgICBwcml2YXRlIGRlc3Ryb3kkOiBOekRlc3Ryb3lTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXJcbiAgKSB7XG4gICAgdGhpcy56b29tID0gdGhpcy5jb25maWcubnpab29tID8/IDE7XG4gICAgdGhpcy5yb3RhdGUgPSB0aGlzLmNvbmZpZy5uelJvdGF0ZSA/PyAwO1xuICAgIHRoaXMudXBkYXRlWm9vbU91dERpc2FibGVkKCk7XG4gICAgdGhpcy51cGRhdGVQcmV2aWV3SW1hZ2VUcmFuc2Zvcm0oKTtcbiAgICB0aGlzLnVwZGF0ZVByZXZpZXdJbWFnZVdyYXBwZXJUcmFuc2Zvcm0oKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGZyb21FdmVudCh0aGlzLmhvc3QubmF0aXZlRWxlbWVudCwgJ2NsaWNrJylcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSBldmVudC5jdXJyZW50VGFyZ2V0ICYmIHRoaXMubWFza0Nsb3NhYmxlICYmIHRoaXMuY29udGFpbmVyQ2xpY2sub2JzZXJ2ZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuY29udGFpbmVyQ2xpY2suZW1pdCgpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICBmcm9tRXZlbnQodGhpcy5pbWFnZVByZXZpZXdXcmFwcGVyLm5hdGl2ZUVsZW1lbnQsICdtb3VzZWRvd24nKVxuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0SW1hZ2VzKGltYWdlczogTnpJbWFnZVtdKTogdm9pZCB7XG4gICAgdGhpcy5pbWFnZXMgPSBpbWFnZXM7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBzd2l0Y2hUbyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5pbmRleCA9IGluZGV4O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgbmV4dCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbmRleCA8IHRoaXMuaW1hZ2VzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgIHRoaXMudXBkYXRlUHJldmlld0ltYWdlVHJhbnNmb3JtKCk7XG4gICAgICB0aGlzLnVwZGF0ZVByZXZpZXdJbWFnZVdyYXBwZXJUcmFuc2Zvcm0oKTtcbiAgICAgIHRoaXMudXBkYXRlWm9vbU91dERpc2FibGVkKCk7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwcmV2KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmluZGV4ID4gMCkge1xuICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgdGhpcy5pbmRleC0tO1xuICAgICAgdGhpcy51cGRhdGVQcmV2aWV3SW1hZ2VUcmFuc2Zvcm0oKTtcbiAgICAgIHRoaXMudXBkYXRlUHJldmlld0ltYWdlV3JhcHBlclRyYW5zZm9ybSgpO1xuICAgICAgdGhpcy51cGRhdGVab29tT3V0RGlzYWJsZWQoKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtGb3JDaGVjaygpOiB2b2lkIHtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG9uQ2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZUNsaWNrLmVtaXQoKTtcbiAgfVxuXG4gIG9uWm9vbUluKCk6IHZvaWQge1xuICAgIHRoaXMuem9vbSArPSAxO1xuICAgIHRoaXMudXBkYXRlUHJldmlld0ltYWdlVHJhbnNmb3JtKCk7XG4gICAgdGhpcy51cGRhdGVab29tT3V0RGlzYWJsZWQoKTtcbiAgICB0aGlzLnBvc2l0aW9uID0geyAuLi5pbml0aWFsUG9zaXRpb24gfTtcbiAgfVxuXG4gIG9uWm9vbU91dCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy56b29tID4gMSkge1xuICAgICAgdGhpcy56b29tIC09IDE7XG4gICAgICB0aGlzLnVwZGF0ZVByZXZpZXdJbWFnZVRyYW5zZm9ybSgpO1xuICAgICAgdGhpcy51cGRhdGVab29tT3V0RGlzYWJsZWQoKTtcbiAgICAgIHRoaXMucG9zaXRpb24gPSB7IC4uLmluaXRpYWxQb3NpdGlvbiB9O1xuICAgIH1cbiAgfVxuXG4gIG9uUm90YXRlUmlnaHQoKTogdm9pZCB7XG4gICAgdGhpcy5yb3RhdGUgKz0gOTA7XG4gICAgdGhpcy51cGRhdGVQcmV2aWV3SW1hZ2VUcmFuc2Zvcm0oKTtcbiAgfVxuXG4gIG9uUm90YXRlTGVmdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJvdGF0ZSAtPSA5MDtcbiAgICB0aGlzLnVwZGF0ZVByZXZpZXdJbWFnZVRyYW5zZm9ybSgpO1xuICB9XG5cbiAgb25Td2l0Y2hMZWZ0KGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnByZXYoKTtcbiAgfVxuXG4gIG9uU3dpdGNoUmlnaHQoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMubmV4dCgpO1xuICB9XG5cbiAgb25BbmltYXRpb25TdGFydChldmVudDogQW5pbWF0aW9uRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQudG9TdGF0ZSA9PT0gJ2VudGVyJykge1xuICAgICAgdGhpcy5zZXRFbnRlckFuaW1hdGlvbkNsYXNzKCk7XG4gICAgfSBlbHNlIGlmIChldmVudC50b1N0YXRlID09PSAnbGVhdmUnKSB7XG4gICAgICB0aGlzLnNldExlYXZlQW5pbWF0aW9uQ2xhc3MoKTtcbiAgICB9XG5cbiAgICB0aGlzLmFuaW1hdGlvblN0YXRlQ2hhbmdlZC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIG9uQW5pbWF0aW9uRG9uZShldmVudDogQW5pbWF0aW9uRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQudG9TdGF0ZSA9PT0gJ2VudGVyJykge1xuICAgICAgdGhpcy5zZXRFbnRlckFuaW1hdGlvbkNsYXNzKCk7XG4gICAgfSBlbHNlIGlmIChldmVudC50b1N0YXRlID09PSAnbGVhdmUnKSB7XG4gICAgICB0aGlzLnNldExlYXZlQW5pbWF0aW9uQ2xhc3MoKTtcbiAgICB9XG4gICAgdGhpcy5hbmltYXRpb25TdGF0ZUNoYW5nZWQuZW1pdChldmVudCk7XG4gIH1cblxuICBzdGFydExlYXZlQW5pbWF0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuYW5pbWF0aW9uU3RhdGUgPSAnbGVhdmUnO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgb25EcmFnUmVsZWFzZWQoKTogdm9pZCB7XG4gICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLmltYWdlUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggKiB0aGlzLnpvb207XG4gICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5pbWFnZVJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCAqIHRoaXMuem9vbTtcbiAgICBjb25zdCB7IGxlZnQsIHRvcCB9ID0gZ2V0T2Zmc2V0KHRoaXMuaW1hZ2VSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgY29uc3QgeyB3aWR0aDogY2xpZW50V2lkdGgsIGhlaWdodDogY2xpZW50SGVpZ2h0IH0gPSBnZXRDbGllbnRTaXplKCk7XG4gICAgY29uc3QgaXNSb3RhdGUgPSB0aGlzLnJvdGF0ZSAlIDE4MCAhPT0gMDtcbiAgICBjb25zdCBmaXRDb250ZW50UGFyYW1zID0ge1xuICAgICAgd2lkdGg6IGlzUm90YXRlID8gaGVpZ2h0IDogd2lkdGgsXG4gICAgICBoZWlnaHQ6IGlzUm90YXRlID8gd2lkdGggOiBoZWlnaHQsXG4gICAgICBsZWZ0LFxuICAgICAgdG9wLFxuICAgICAgY2xpZW50V2lkdGgsXG4gICAgICBjbGllbnRIZWlnaHRcbiAgICB9O1xuICAgIGNvbnN0IGZpdENvbnRlbnRQb3MgPSBnZXRGaXRDb250ZW50UG9zaXRpb24oZml0Q29udGVudFBhcmFtcyk7XG4gICAgaWYgKGlzTm90TmlsKGZpdENvbnRlbnRQb3MueCkgfHwgaXNOb3ROaWwoZml0Q29udGVudFBvcy55KSkge1xuICAgICAgdGhpcy5wb3NpdGlvbiA9IHsgLi4udGhpcy5wb3NpdGlvbiwgLi4uZml0Q29udGVudFBvcyB9O1xuICAgIH1cbiAgfVxuXG4gIHNhbml0aXplclJlc291cmNlVXJsKHVybDogc3RyaW5nKTogU2FmZVJlc291cmNlVXJsIHtcbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKHVybCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVByZXZpZXdJbWFnZVRyYW5zZm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLnByZXZpZXdJbWFnZVRyYW5zZm9ybSA9IGBzY2FsZTNkKCR7dGhpcy56b29tfSwgJHt0aGlzLnpvb219LCAxKSByb3RhdGUoJHt0aGlzLnJvdGF0ZX1kZWcpYDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUHJldmlld0ltYWdlV3JhcHBlclRyYW5zZm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLnByZXZpZXdJbWFnZVdyYXBwZXJUcmFuc2Zvcm0gPSBgdHJhbnNsYXRlM2QoJHt0aGlzLnBvc2l0aW9uLnh9cHgsICR7dGhpcy5wb3NpdGlvbi55fXB4LCAwKWA7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVpvb21PdXREaXNhYmxlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnpvb21PdXREaXNhYmxlZCA9IHRoaXMuem9vbSA8PSAxO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRFbnRlckFuaW1hdGlvbkNsYXNzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFuaW1hdGlvbkRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGJhY2tkcm9wRWxlbWVudCA9IHRoaXMub3ZlcmxheVJlZi5iYWNrZHJvcEVsZW1lbnQ7XG4gICAgaWYgKGJhY2tkcm9wRWxlbWVudCkge1xuICAgICAgYmFja2Ryb3BFbGVtZW50LmNsYXNzTGlzdC5hZGQoRkFERV9DTEFTU19OQU1FX01BUC5lbnRlcik7XG4gICAgICBiYWNrZHJvcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChGQURFX0NMQVNTX05BTUVfTUFQLmVudGVyQWN0aXZlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldExlYXZlQW5pbWF0aW9uQ2xhc3MoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYW5pbWF0aW9uRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYmFja2Ryb3BFbGVtZW50ID0gdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wRWxlbWVudDtcbiAgICBpZiAoYmFja2Ryb3BFbGVtZW50KSB7XG4gICAgICBiYWNrZHJvcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChGQURFX0NMQVNTX05BTUVfTUFQLmxlYXZlKTtcbiAgICAgIGJhY2tkcm9wRWxlbWVudC5jbGFzc0xpc3QuYWRkKEZBREVfQ0xBU1NfTkFNRV9NQVAubGVhdmVBY3RpdmUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy56b29tID0gMTtcbiAgICB0aGlzLnJvdGF0ZSA9IDA7XG4gICAgdGhpcy5wb3NpdGlvbiA9IHsgLi4uaW5pdGlhbFBvc2l0aW9uIH07XG4gIH1cbn1cbiJdfQ==