cocori-ng
Version:
Cocori-ng is an Angular full of great components & utilites based on Material
101 lines • 22.5 kB
JavaScript
import { Component, EventEmitter, HostListener, Input, Output, ViewChild, } from '@angular/core';
import { UploaderService } from 'cocori-ng/src/feature-form';
import { Subject } from 'rxjs';
import { filter, takeUntil, tap } from 'rxjs/operators';
import * as i0 from "@angular/core";
import * as i1 from "cocori-ng/src/feature-form";
import * as i2 from "@angular/common";
import * as i3 from "@angular/material/icon";
import * as i4 from "@angular/flex-layout/extended";
export class CocoringCmsImageUploadComponent {
constructor(cdr, uploaderService) {
this.cdr = cdr;
this.uploaderService = uploaderService;
this.apiFileUploaded = new EventEmitter();
this.removeBackgroundImage = new EventEmitter();
this.isUploading = false;
this.onError = false;
this.destroy$ = new Subject();
}
ngOnInit() {
this.uploaderService.apisFile = this.apisConfig;
this.eventsFileUpload();
}
ngOnDestroy() {
this.destroy$.next(undefined);
this.destroy$.complete();
}
emitFiles(event) {
const file = event && event.item(0);
if (!file)
return;
this.isUploading = true;
this.onError = false;
this.backgroundImageUpload = { description: null };
this.fileUploaded = file;
this.backgroundImageUpload.size = this.fileUploaded.size;
this.uploaderService.uploadFile(this.fileUploaded);
}
browseFile() {
let el = this.uploaderInputRef.nativeElement;
el.click();
}
eventsFileUpload() {
this.uploaderService.fileUploaded$.pipe(takeUntil(this.destroy$), tap((id) => this.getFileId(id)), tap(_ => this.isUploading = false), tap(_ => this.setFileApi()), tap(_ => this.cdr.detectChanges())).subscribe();
this.uploaderService.fileOnError$.pipe(takeUntil(this.destroy$), tap(_ => this.errorFile())).subscribe();
this.uploaderService.progressSource.pipe(takeUntil(this.destroy$), filter(_ => !!this.fileUploaded), tap((progress) => {
this.uploadProgress = progress;
const circumference = this.progressCircleRef.nativeElement.getTotalLength();
this.progressCircleRef.nativeElement.style.strokeDashoffset = circumference - (progress / 100) * circumference;
this.cdr.detectChanges();
})).subscribe();
}
getFileId(id) {
this.backgroundImageUpload.id = id;
}
/** on récupère l'api du fichier pour la transmettre au composant parent */
setFileApi() {
const apiFile = this.apisConfig.apiFile(this.backgroundImageUpload.id);
this.apiFileUploaded.emit(apiFile);
}
onBackgroundImageRemoved(event) {
event.stopPropagation();
this.removeBackgroundImage.emit();
}
errorFile() {
this.isUploading = false;
this.deleteFile();
this.onError = true;
}
deleteFile() {
this.fileUploaded = null;
this.backgroundImageUpload.id = null;
this.uploaderInputRef.nativeElement.value = '';
}
}
CocoringCmsImageUploadComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: CocoringCmsImageUploadComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.UploaderService }], target: i0.ɵɵFactoryTarget.Component });
CocoringCmsImageUploadComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.1", type: CocoringCmsImageUploadComponent, selector: "cocoring-cms-image-upload", inputs: { section: "section", nameBackgroundImage: "nameBackgroundImage", apisConfig: "apisConfig" }, outputs: { apiFileUploaded: "apiFileUploaded", removeBackgroundImage: "removeBackgroundImage" }, host: { listeners: { "change": "emitFiles($event.target.files)" } }, providers: [UploaderService], viewQueries: [{ propertyName: "uploaderInputRef", first: true, predicate: ["uploader"], descendants: true }, { propertyName: "progressCircleRef", first: true, predicate: ["progressCircle"], descendants: true }], ngImport: i0, template: "<div class=\"background-image-full\" (click)=\"browseFile()\"\r\n [ngStyle]=\"{'background-image': 'url(' + (section.values[nameBackgroundImage] ? section.values[nameBackgroundImage] : '') + ')'}\">\r\n</div>\r\n<div class=\"addNewFile\">\r\n <div class=\"badges-actions\" *ngIf=\"!isUploading\">\r\n <div class=\"badge\" (click)=\"browseFile()\">\r\n <mat-icon>wallpaper</mat-icon>\r\n </div>\r\n <div class=\"badge badge-delete\" (click)=\"onBackgroundImageRemoved($event)\">\r\n <mat-icon>delete_outline</mat-icon>\r\n </div>\r\n </div>\r\n <svg *ngIf=\"isUploading\" class=\"progress\" width=\"59\" height=\"59\">\r\n <circle #progressCircle class=\"progress-circle\" cx=\"30\" cy=\"30\" r=\"28\" fill=\"white\" />\r\n <text class=\"text-progress\" x=\"30\" y=\"30\" alignment-baseline=\"middle\" text-anchor=\"middle\">\r\n {{uploadProgress}} %\r\n </text>\r\n </svg>\r\n</div>\r\n<div *ngIf=\"onError\" class=\"error-upload\">\r\n <div class=\"badge badge-delete error\" title=\"Une erreur est survenue, veuillez r\u00E9essayer\">\r\n <mat-icon>error</mat-icon>\r\n </div>\r\n</div>\r\n<input #uploader hidden class=\"browse-file\" type=\"file\" name=\"fileUpload\" accept=\"image/*\" />", styles: [".background-image-full{cursor:pointer}.background-image-full:hover{opacity:.3}.addNewFile{transition:.5s ease;position:absolute;bottom:0;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)}.addNewFile .badges-actions{display:flex;align-items:center}.addNewFile .progress-circle{stroke-width:3;stroke:#606060;stroke-dasharray:215;stroke-dashoffset:215}.error-upload{transition:.5s ease;position:absolute;bottom:0;left:30px;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)}.badge{cursor:pointer;border-radius:50%;background-color:#fff;padding:17px 17px 12px}.badge.badge-delete{padding:10px;margin-left:10px;height:25px}.text-progress{fill:#606060}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i4.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.1", ngImport: i0, type: CocoringCmsImageUploadComponent, decorators: [{
type: Component,
args: [{ selector: 'cocoring-cms-image-upload', providers: [UploaderService], template: "<div class=\"background-image-full\" (click)=\"browseFile()\"\r\n [ngStyle]=\"{'background-image': 'url(' + (section.values[nameBackgroundImage] ? section.values[nameBackgroundImage] : '') + ')'}\">\r\n</div>\r\n<div class=\"addNewFile\">\r\n <div class=\"badges-actions\" *ngIf=\"!isUploading\">\r\n <div class=\"badge\" (click)=\"browseFile()\">\r\n <mat-icon>wallpaper</mat-icon>\r\n </div>\r\n <div class=\"badge badge-delete\" (click)=\"onBackgroundImageRemoved($event)\">\r\n <mat-icon>delete_outline</mat-icon>\r\n </div>\r\n </div>\r\n <svg *ngIf=\"isUploading\" class=\"progress\" width=\"59\" height=\"59\">\r\n <circle #progressCircle class=\"progress-circle\" cx=\"30\" cy=\"30\" r=\"28\" fill=\"white\" />\r\n <text class=\"text-progress\" x=\"30\" y=\"30\" alignment-baseline=\"middle\" text-anchor=\"middle\">\r\n {{uploadProgress}} %\r\n </text>\r\n </svg>\r\n</div>\r\n<div *ngIf=\"onError\" class=\"error-upload\">\r\n <div class=\"badge badge-delete error\" title=\"Une erreur est survenue, veuillez r\u00E9essayer\">\r\n <mat-icon>error</mat-icon>\r\n </div>\r\n</div>\r\n<input #uploader hidden class=\"browse-file\" type=\"file\" name=\"fileUpload\" accept=\"image/*\" />", styles: [".background-image-full{cursor:pointer}.background-image-full:hover{opacity:.3}.addNewFile{transition:.5s ease;position:absolute;bottom:0;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)}.addNewFile .badges-actions{display:flex;align-items:center}.addNewFile .progress-circle{stroke-width:3;stroke:#606060;stroke-dasharray:215;stroke-dashoffset:215}.error-upload{transition:.5s ease;position:absolute;bottom:0;left:30px;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)}.badge{cursor:pointer;border-radius:50%;background-color:#fff;padding:17px 17px 12px}.badge.badge-delete{padding:10px;margin-left:10px;height:25px}.text-progress{fill:#606060}\n"] }]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.UploaderService }]; }, propDecorators: { uploaderInputRef: [{
type: ViewChild,
args: ['uploader']
}], progressCircleRef: [{
type: ViewChild,
args: ['progressCircle']
}], section: [{
type: Input
}], nameBackgroundImage: [{
type: Input
}], apisConfig: [{
type: Input
}], apiFileUploaded: [{
type: Output
}], removeBackgroundImage: [{
type: Output
}], emitFiles: [{
type: HostListener,
args: ['change', ['$event.target.files']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29jb3JpbmctY21zLWltYWdlLXVwbG9hZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb2Nvcmktbmcvc3JjL2ZlYXR1cmUtY21zL3NoYXJlZC9jb21wb25lbnQtY21zLWVkaXRvci9jb2NvcmluZy1jbXMtaW1hZ2UtdXBsb2FkL2NvY29yaW5nLWNtcy1pbWFnZS11cGxvYWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29jb3JpLW5nL3NyYy9mZWF0dXJlLWNtcy9zaGFyZWQvY29tcG9uZW50LWNtcy1lZGl0b3IvY29jb3JpbmctY21zLWltYWdlLXVwbG9hZC9jb2NvcmluZy1jbXMtaW1hZ2UtdXBsb2FkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBRVQsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBVXhELE1BQU0sT0FBTywrQkFBK0I7SUFtQjFDLFlBQ1UsR0FBc0IsRUFDdkIsZUFBZ0M7UUFEL0IsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdkIsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBYi9CLG9CQUFlLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFDbkUsMEJBQXFCLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7UUFFL0UsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFJN0IsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUVS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QUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVJLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQTBCMEMsU0FBUztzQkFBekQsWUFBWTt1QkFBQyxRQUFRLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBWaWV3Q2hpbGQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZpbGVNb2RlbCB9IGZyb20gJ2NvY29yaS1uZy9zcmMvZmVhdHVyZS1jb3JlJztcclxuaW1wb3J0IHsgVXBsb2FkZXJTZXJ2aWNlIH0gZnJvbSAnY29jb3JpLW5nL3NyYy9mZWF0dXJlLWZvcm0nO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbHRlciwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBBcGlzQ29uZmlnQ21zTW9kZWwsIFNlY3Rpb25Nb2RlbCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWwvY21zLm1vZGVsJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY29jb3JpbmctY21zLWltYWdlLXVwbG9hZCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NvY29yaW5nLWNtcy1pbWFnZS11cGxvYWQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NvY29yaW5nLWNtcy1pbWFnZS11cGxvYWQuY29tcG9uZW50LnNjc3MnXSxcclxuICBwcm92aWRlcnM6IFtVcGxvYWRlclNlcnZpY2VdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb2NvcmluZ0Ntc0ltYWdlVXBsb2FkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBWaWV3Q2hpbGQoJ3VwbG9hZGVyJykgdXBsb2FkZXJJbnB1dFJlZjogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdwcm9ncmVzc0NpcmNsZScpIHByb2dyZXNzQ2lyY2xlUmVmOiBFbGVtZW50UmVmO1xyXG5cclxuICBASW5wdXQoKSBzZWN0aW9uOiBTZWN0aW9uTW9kZWxcclxuICBASW5wdXQoKSBuYW1lQmFja2dyb3VuZEltYWdlOiBzdHJpbmdcclxuICBASW5wdXQoKSBhcGlzQ29uZmlnOiBBcGlzQ29uZmlnQ21zTW9kZWxcclxuXHJcbiAgQE91dHB1dCgpIGFwaUZpbGVVcGxvYWRlZDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICBAT3V0cHV0KCkgcmVtb3ZlQmFja2dyb3VuZEltYWdlOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIGlzVXBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgdXBsb2FkUHJvZ3Jlc3M6IG51bWJlcjtcclxuICBiYWNrZ3JvdW5kSW1hZ2VVcGxvYWQ6IEZpbGVNb2RlbFxyXG4gIGZpbGVVcGxvYWRlZDogRmlsZTtcclxuICBvbkVycm9yOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHB1YmxpYyB1cGxvYWRlclNlcnZpY2U6IFVwbG9hZGVyU2VydmljZSxcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMudXBsb2FkZXJTZXJ2aWNlLmFwaXNGaWxlID0gdGhpcy5hcGlzQ29uZmlnXHJcblxyXG4gICAgdGhpcy5ldmVudHNGaWxlVXBsb2FkKClcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHVuZGVmaW5lZCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdjaGFuZ2UnLCBbJyRldmVudC50YXJnZXQuZmlsZXMnXSkgZW1pdEZpbGVzKGV2ZW50OiBGaWxlTGlzdCkge1xyXG4gICAgY29uc3QgZmlsZSA9IGV2ZW50ICYmIGV2ZW50Lml0ZW0oMCk7XHJcblxyXG4gICAgaWYgKCFmaWxlKSByZXR1cm47XHJcblxyXG4gICAgdGhpcy5pc1VwbG9hZGluZyA9IHRydWVcclxuICAgIHRoaXMub25FcnJvciA9IGZhbHNlXHJcblxyXG4gICAgdGhpcy5iYWNrZ3JvdW5kSW1hZ2VVcGxvYWQgPSB7IGRlc2NyaXB0aW9uOiBudWxsIH1cclxuXHJcbiAgICB0aGlzLmZpbGVVcGxvYWRlZCA9IGZpbGU7XHJcblxyXG4gICAgdGhpcy5iYWNrZ3JvdW5kSW1hZ2VVcGxvYWQuc2l6ZSA9IHRoaXMuZmlsZVVwbG9hZGVkLnNpemVcclxuXHJcbiAgICB0aGlzLnVwbG9hZGVyU2VydmljZS51cGxvYWRGaWxlKHRoaXMuZmlsZVVwbG9hZGVkKVxyXG4gIH1cclxuXHJcbiAgYnJvd3NlRmlsZSgpIHtcclxuICAgIGxldCBlbDogSFRNTEVsZW1lbnQgPSB0aGlzLnVwbG9hZGVySW5wdXRSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIGVsLmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGV2ZW50c0ZpbGVVcGxvYWQoKSB7XHJcbiAgICB0aGlzLnVwbG9hZGVyU2VydmljZS5maWxlVXBsb2FkZWQkLnBpcGUoXHJcbiAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcclxuICAgICAgdGFwKChpZDogc3RyaW5nKSA9PiB0aGlzLmdldEZpbGVJZChpZCkpLFxyXG4gICAgICB0YXAoXyA9PiB0aGlzLmlzVXBsb2FkaW5nID0gZmFsc2UpLFxyXG4gICAgICB0YXAoXyA9PiB0aGlzLnNldEZpbGVBcGkoKSksXHJcbiAgICAgIHRhcChfID0+IHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKSlcclxuICAgICkuc3Vic2NyaWJlKClcclxuXHJcbiAgICB0aGlzLnVwbG9hZGVyU2VydmljZS5maWxlT25FcnJvciQucGlwZShcclxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxyXG4gICAgICB0YXAoXyA9PiB0aGlzLmVycm9yRmlsZSgpKSxcclxuICAgICkuc3Vic2NyaWJlKClcclxuXHJcbiAgICB0aGlzLnVwbG9hZGVyU2VydmljZS5wcm9ncmVzc1NvdXJjZS5waXBlKFxyXG4gICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXHJcbiAgICAgIGZpbHRlcihfID0+ICEhdGhpcy5maWxlVXBsb2FkZWQpLFxyXG4gICAgICB0YXAoKHByb2dyZXNzOiBudW1iZXIpID0+IHtcclxuICAgICAgICB0aGlzLnVwbG9hZFByb2dyZXNzID0gcHJvZ3Jlc3NcclxuXHJcbiAgICAgICAgY29uc3QgY2lyY3VtZmVyZW5jZSA9IHRoaXMucHJvZ3Jlc3NDaXJjbGVSZWYubmF0aXZlRWxlbWVudC5nZXRUb3RhbExlbmd0aCgpXHJcblxyXG4gICAgICAgIHRoaXMucHJvZ3Jlc3NDaXJjbGVSZWYubmF0aXZlRWxlbWVudC5zdHlsZS5zdHJva2VEYXNob2Zmc2V0ID0gY2lyY3VtZmVyZW5jZSAtIChwcm9ncmVzcyAvIDEwMCkgKiBjaXJjdW1mZXJlbmNlO1xyXG5cclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKClcclxuICAgICAgfSlcclxuICAgICkuc3Vic2NyaWJlKClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0RmlsZUlkKGlkOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuYmFja2dyb3VuZEltYWdlVXBsb2FkLmlkID0gaWRcclxuICB9XHJcblxyXG4gIC8qKiBvbiByw6ljdXDDqHJlIGwnYXBpIGR1IGZpY2hpZXIgcG91ciBsYSB0cmFuc21ldHRyZSBhdSBjb21wb3NhbnQgcGFyZW50ICovXHJcbiAgcHJpdmF0ZSBzZXRGaWxlQXBpKCkge1xyXG4gICAgY29uc3QgYXBpRmlsZSA9IHRoaXMuYXBpc0NvbmZpZy5hcGlGaWxlKHRoaXMuYmFja2dyb3VuZEltYWdlVXBsb2FkLmlkKTtcclxuXHJcbiAgICB0aGlzLmFwaUZpbGVVcGxvYWRlZC5lbWl0KGFwaUZpbGUpXHJcbiAgfVxyXG5cclxuICBvbkJhY2tncm91bmRJbWFnZVJlbW92ZWQoZXZlbnQpIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXHJcblxyXG4gICAgdGhpcy5yZW1vdmVCYWNrZ3JvdW5kSW1hZ2UuZW1pdCgpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGVycm9yRmlsZSgpIHtcclxuICAgIHRoaXMuaXNVcGxvYWRpbmcgPSBmYWxzZVxyXG5cclxuICAgIHRoaXMuZGVsZXRlRmlsZSgpXHJcblxyXG4gICAgdGhpcy5vbkVycm9yID0gdHJ1ZVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZWxldGVGaWxlKCkge1xyXG4gICAgdGhpcy5maWxlVXBsb2FkZWQgPSBudWxsXHJcbiAgICB0aGlzLmJhY2tncm91bmRJbWFnZVVwbG9hZC5pZCA9IG51bGxcclxuXHJcbiAgICB0aGlzLnVwbG9hZGVySW5wdXRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnXHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJiYWNrZ3JvdW5kLWltYWdlLWZ1bGxcIiAoY2xpY2spPVwiYnJvd3NlRmlsZSgpXCJcclxuICAgIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZC1pbWFnZSc6ICd1cmwoJyArIChzZWN0aW9uLnZhbHVlc1tuYW1lQmFja2dyb3VuZEltYWdlXSA/ICBzZWN0aW9uLnZhbHVlc1tuYW1lQmFja2dyb3VuZEltYWdlXSA6ICcnKSArICcpJ31cIj5cclxuPC9kaXY+XHJcbjxkaXYgY2xhc3M9XCJhZGROZXdGaWxlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYmFkZ2VzLWFjdGlvbnNcIiAqbmdJZj1cIiFpc1VwbG9hZGluZ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJiYWRnZVwiIChjbGljayk9XCJicm93c2VGaWxlKClcIj5cclxuICAgICAgICAgICAgPG1hdC1pY29uPndhbGxwYXBlcjwvbWF0LWljb24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJhZGdlIGJhZGdlLWRlbGV0ZVwiIChjbGljayk9XCJvbkJhY2tncm91bmRJbWFnZVJlbW92ZWQoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+ZGVsZXRlX291dGxpbmU8L21hdC1pY29uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8c3ZnICpuZ0lmPVwiaXNVcGxvYWRpbmdcIiBjbGFzcz1cInByb2dyZXNzXCIgd2lkdGg9XCI1OVwiIGhlaWdodD1cIjU5XCI+XHJcbiAgICAgICAgPGNpcmNsZSAjcHJvZ3Jlc3NDaXJjbGUgY2xhc3M9XCJwcm9ncmVzcy1jaXJjbGVcIiBjeD1cIjMwXCIgY3k9XCIzMFwiIHI9XCIyOFwiIGZpbGw9XCJ3aGl0ZVwiIC8+XHJcbiAgICAgICAgPHRleHQgY2xhc3M9XCJ0ZXh0LXByb2dyZXNzXCIgeD1cIjMwXCIgeT1cIjMwXCIgYWxpZ25tZW50LWJhc2VsaW5lPVwibWlkZGxlXCIgdGV4dC1hbmNob3I9XCJtaWRkbGVcIj5cclxuICAgICAgICAgICAge3t1cGxvYWRQcm9ncmVzc319ICVcclxuICAgICAgICA8L3RleHQ+XHJcbiAgICA8L3N2Zz5cclxuPC9kaXY+XHJcbjxkaXYgKm5nSWY9XCJvbkVycm9yXCIgY2xhc3M9XCJlcnJvci11cGxvYWRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJiYWRnZSBiYWRnZS1kZWxldGUgZXJyb3JcIiB0aXRsZT1cIlVuZSBlcnJldXIgZXN0IHN1cnZlbnVlLCB2ZXVpbGxleiByw6llc3NheWVyXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmVycm9yPC9tYXQtaWNvbj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuPGlucHV0ICN1cGxvYWRlciBoaWRkZW4gY2xhc3M9XCJicm93c2UtZmlsZVwiIHR5cGU9XCJmaWxlXCIgbmFtZT1cImZpbGVVcGxvYWRcIiBhY2NlcHQ9XCJpbWFnZS8qXCIgLz4iXX0=