@rlucan/ui 17.1.1 → 17.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -14,12 +14,30 @@ import * as i7 from "@angular/material/progress-spinner";
14
14
  import * as i8 from "ngx-image-cropper";
15
15
  import * as i9 from "../file/file.component";
16
16
  export class UiFileUploaderComponent extends UiSimpleComponent {
17
+ set fileSize(fs) {
18
+ this._fileSize = fs;
19
+ if (typeof fs === 'string') {
20
+ const f = this.fileServiceConfig.imageSizes.find(n => n.name === fs);
21
+ if (!f) {
22
+ console.error('Missing filesize for ' + fs);
23
+ }
24
+ else {
25
+ this.uiFileSize = f;
26
+ }
27
+ }
28
+ else {
29
+ this.uiFileSize = fs;
30
+ }
31
+ }
17
32
  get menuTemplate() {
18
33
  return this.templates?.menuTemplate;
19
34
  }
20
35
  get addFileTemplate() {
21
36
  return this.templates?.addFileTemplate;
22
37
  }
38
+ get customContentTemplate() {
39
+ return this.templates?.customContentTemplate;
40
+ }
23
41
  get fileTemplate() {
24
42
  return this.templates?.fileTemplate;
25
43
  }
@@ -33,7 +51,6 @@ export class UiFileUploaderComponent extends UiSimpleComponent {
33
51
  this.multiple = true;
34
52
  this.crop = false;
35
53
  this.cropRounded = false;
36
- this.fileSize = 'default';
37
54
  this.customFileMenu = false;
38
55
  this.newFilePosition = 'last';
39
56
  this.templates = {};
@@ -81,12 +98,12 @@ export class UiFileUploaderComponent extends UiSimpleComponent {
81
98
  }
82
99
  get ngAddStyle() {
83
100
  return {
84
- width: Math.abs(this.fileServiceConfig.imageSizes[this.fileSize][0]) + 'px',
85
- height: Math.abs(this.fileServiceConfig.imageSizes[this.fileSize][1]) + 'px',
101
+ width: Math.abs(this.uiFileSize.width) + 'px',
102
+ height: Math.abs(this.uiFileSize.height) + 'px',
86
103
  };
87
104
  }
88
105
  get aspectRatio() {
89
- return this.fileServiceConfig.imageSizes[this.fileSize][0] / this.fileServiceConfig.imageSizes[this.fileSize][1];
106
+ return this.uiFileSize.width / this.uiFileSize.height;
90
107
  }
91
108
  get addFileImgSrc() {
92
109
  return this.fileServiceConfig.addFileImgSrc;
@@ -144,7 +161,7 @@ export class UiFileUploaderComponent extends UiSimpleComponent {
144
161
  return;
145
162
  }
146
163
  if (!skipCustomValidation && this.fileServiceConfig.fileValidation) {
147
- this.fileServiceConfig.fileValidation(this.fileSize, $event.file).then(valid => {
164
+ this.fileServiceConfig.fileValidation(this.uiFileSize, $event.file).then(valid => {
148
165
  if (valid) {
149
166
  this.onUploadOutput($event, true);
150
167
  }
@@ -239,7 +256,7 @@ export class UiFileUploaderComponent extends UiSimpleComponent {
239
256
  // (this.files.length > 0 ? this.files[0] : null));
240
257
  }
241
258
  beforeSave() {
242
- return new Promise((res, rej) => {
259
+ return new Promise((res) => {
243
260
  this.files.forEach(f => {
244
261
  if (f.$newFile && f.$newFile.progress.status === 2) {
245
262
  f.$newFile.progress.status = 0;
@@ -344,15 +361,17 @@ export class UiFileUploaderComponent extends UiSimpleComponent {
344
361
  f.$newFile.size = f.$newFile.nativeFile.size;
345
362
  f.$newFile.type = f.$newFile.nativeFile.type;
346
363
  this.imagesDone[id] = true;
347
- console.log(f);
348
364
  }
349
365
  }
366
+ uploadImgSrc() {
367
+ return this.addFileImgSrc(this.uiFileSize);
368
+ }
350
369
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: UiFileUploaderComponent, deps: [{ token: UI_FILESERVICE, optional: true }, { token: UI_TRANSLATESERVICE }, { token: i1.ControlContainer, host: true, optional: true, skipSelf: true }, { token: i2.UiFileService }], target: i0.ɵɵFactoryTarget.Component }); }
351
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.2", type: UiFileUploaderComponent, selector: "ui-file-uploader", inputs: { maxFiles: "maxFiles", multiple: "multiple", crop: "crop", cropRounded: "cropRounded", cropMaxWidth: "cropMaxWidth", fileSize: "fileSize", customFileMenu: "customFileMenu", addHint: "addHint", newFilePosition: "newFilePosition", templates: "templates", previewPosition: "previewPosition" }, outputs: { imageCropped: "imageCropped", fileEvent: "fileEvent" }, providers: [{
370
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.2", type: UiFileUploaderComponent, selector: "ui-file-uploader", inputs: { fileSize: "fileSize", maxFiles: "maxFiles", multiple: "multiple", crop: "crop", cropRounded: "cropRounded", cropMaxWidth: "cropMaxWidth", customFileMenu: "customFileMenu", addHint: "addHint", newFilePosition: "newFilePosition", templates: "templates", previewPosition: "previewPosition" }, outputs: { imageCropped: "imageCropped", fileEvent: "fileEvent" }, providers: [{
352
371
  provide: NG_VALUE_ACCESSOR,
353
372
  multi: true,
354
373
  useExisting: UiFileUploaderComponent,
355
- }], usesInheritance: true, ngImport: i0, template: "<div class=\"label\" *ngIf=\"label\">\r\n <div class=\"text-container\" [matTooltip]=\"required ? translateService.instant('ui.controls.validation.required') : undefined\" [matTooltipPosition]=\"'above'\">\r\n <div class=\"text\">{{label}}</div>\r\n <div *ngIf=\"required\" class=\"required\">*</div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"files-container\" [ngClass]=\"{dragging: dragging, disabled: uploading || !editable}\">\r\n\r\n <div class=\"existing-files\">\r\n\r\n <div class=\"file-container\" *ngFor=\"let f of files\">\r\n\r\n <div class=\"file-menu\" (click)=\"toggleMenuVisibility(f)\" *ngIf=\"!customFileMenu && editable && !uploading\">\r\n <mat-icon>menu</mat-icon>\r\n </div>\r\n <div class=\"file-menu-container mat-elevation-z2\" [ngClass]=\"{visible: f === fileMenuOpened}\" (click)=\"menuClick()\" (mouseleave)=\"menuClick()\">\r\n <ng-container *ngIf=\"!menuTemplate\">\r\n <label class=\"menu-item\">{{ translateService.instant('ui.controls.ui-file-uploader.menu.change') }}\r\n <input *ngIf=\"!refreshAddInput\" style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\" (change)=\"fileChangeEvent($event, f)\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\">\r\n </label>\r\n <div class=\"menu-item\" (click)=\"remove(f)\">{{ translateService.instant('ui.controls.ui-file-uploader.menu.delete') }}</div>\r\n </ng-container>\r\n <ng-container *ngIf=\"menuTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"menuTemplate\" [ngTemplateOutletContext]=\"{fileInput: fileInput}\"></ng-template>\r\n <ng-template #fileInput>\r\n <input style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\" (change)=\"fileChangeEvent($event, f)\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\">\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"crop && !cropDone(f)\" (mouseenter)=\"startCropPreview(f.$newFile.id)\" (mouseleave)=\"stopCropPreview(f.$newFile.id)\">\r\n <div class=\"crop-container\" [ngStyle]=\"ngAddStyle\">\r\n\r\n <ui-file *ngIf=\"false && files.length > 0 && !cropSourceImages\" [fileSize]=\"fileSize\" [srcData]=\"files[0].custom\" [ngClass]=\"{rounded: cropRounded}\"></ui-file>\r\n\r\n <mat-spinner *ngIf=\"!cropperImageLoaded[f.$newFile.id] && cropSourceImages[f.$newFile.id]\" [diameter]=\"75\"></mat-spinner>\r\n\r\n <image-cropper *ngIf=\"cropSourceImages[f.$newFile.id]\"\r\n [imageFile]=\"cropSourceImages[f.$newFile.id]\"\r\n [maintainAspectRatio]=\"true\"\r\n [containWithinAspectRatio]=\"false\"\r\n [aspectRatio]=\"aspectRatio\"\r\n [resizeToWidth]=\"cropMaxWidth\"\r\n [onlyScaleDown]=\"false\"\r\n [roundCropper]=\"cropRounded\"\r\n [canvasRotation]=\"canvasRotation[f.$newFile.id]\"\r\n [transform]=\"transform[f.$newFile.id]\"\r\n [alignImage]=\"'center'\"\r\n [style.display]=\"showCropper ? null : 'none'\"\r\n [format]=\"'png'\"\r\n (imageCropped)=\"onImageCropped($event, f.$newFile.id)\"\r\n (imageLoaded)=\"imageLoaded(f.$newFile.id)\"\r\n (cropperReady)=\"cropperReady($event, f.$newFile.id)\"\r\n (loadImageFailed)=\"loadImageFailed()\"\r\n ></image-cropper>\r\n\r\n <div class=\"crop-preview mat-elevation-z2\" [class]=\"previewPosition\" *ngIf=\"true || (showCropPreview[f.$newFile.id] && cropperImageLoaded[f.$newFile.id])\">\r\n <div class=\"crop-menu\">\r\n <mat-icon (click)=\"zoomCroppedImage(.1, f.$newFile.id)\">zoom_in</mat-icon>\r\n <mat-icon (click)=\"zoomCroppedImage(- .1, f.$newFile.id)\">zoom_out</mat-icon>\r\n <mat-icon (click)=\"rotateCroppedImage(-1, f.$newFile.id)\">rotate_left</mat-icon>\r\n <mat-icon (click)=\"rotateCroppedImage(1, f.$newFile.id)\">rotate_right</mat-icon>\r\n <div style=\"flex: 1 1 100%\"></div>\r\n <label class=\"menu-item\">\r\n <mat-icon>upload_file</mat-icon>\r\n <input style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\" (change)=\"fileChangeEvent($event, f)\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\">\r\n </label>\r\n <mat-icon (click)=\"remove(f)\">delete_outline</mat-icon>\r\n <div style=\"flex: 1 1 100%\"></div>\r\n <mat-icon (click)=\"cropperDone(f.$newFile.id)\">done</mat-icon>\r\n </div>\r\n <img *ngIf=\"croppedImages[f.$newFile.id]\" [src]=\"croppedImages[f.$newFile.id].objectUrl\" [ngClass]=\"{rounded: cropRounded}\"/>\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n\r\n </div>\r\n\r\n <ng-container *ngIf=\"!crop || cropDone(f)\">\r\n <ng-container *ngIf=\"fileTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"fileTemplate\" [ngTemplateOutletContext]=\"{file: f, fileInput: fileInput2}\"></ng-template>\r\n <ng-template #fileInput2>\r\n <input style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\" (change)=\"fileChangeEvent($event, f)\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\">\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ui-file *ngIf=\"!fileTemplate\" [fileSize]=\"fileSize\" [srcData]=\"f.$newFile ? f.$newFile: f.custom\" [ngClass]=\"{rounded: crop && cropRounded}\">\r\n </ui-file>\r\n\r\n <ng-container *ngIf=\"f.$newFile\">\r\n <div *ngIf=\"f.$newFile.responseStatus && f.$newFile.responseStatus !== 200\" class=\"progress-container error\">\r\n {{ translateService.instant('ui.controls.ui-file-uploader.uploadError', f.$newFile.response) }}\r\n </div>\r\n <div *ngIf=\"!f.$newFile.responseStatus && f.$newFile.progress.status === 1\" class=\"progress-container\">\r\n <div class=\"progress\" [ngStyle]=\"{width: f.$newFile.progress.data.percentage + '%'}\"></div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"file-container add\" ngFileDrop [options]=\"uploadOptions\" (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\" [ngClass]=\"{visible: files.length < maxFiles || maxFiles === 0}\" [ngStyle]=\"addFileTemplate ? {} : ngAddStyle\">\r\n <label>\r\n <ng-container *ngIf=\"addFileTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"addFileTemplate\"></ng-template>\r\n </ng-container>\r\n <ng-container *ngIf=\"!addFileTemplate\">\r\n <div class=\"upload-image-container\"></div>\r\n <img [src]=\"addFileImgSrc\" [ngClass]=\"{'with-hint': addHint}\" />\r\n <div *ngIf=\"addHint\" class=\"add-hint\">{{addHint}}</div>\r\n </ng-container>\r\n <input style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\" (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\" [multiple]=\"maxFiles === 0 && multiple\">\r\n </label>\r\n </div>\r\n\r\n</div>\r\n", styles: [":host{display:flex;flex-wrap:wrap}:host .label .text{font-size:.9em;line-height:1em;padding:6px 0 4px}:host .files-container{display:flex;flex-wrap:wrap;border-style:solid}:host .files-container .existing-files{display:flex;flex-wrap:wrap}:host .files-container.dragging .add label{border:2px dashed grey;background-color:#0000001a}:host .files-container.disabled .add{opacity:.5;pointer-events:none}:host .file-container{max-width:100%;max-height:100%;position:relative;display:flex;align-items:center;justify-content:center}:host .file-container .progress-container{position:absolute;bottom:0;left:1px;right:1px;height:20%;max-height:20px;background-color:#0000001a}:host .file-container .progress-container.error{background-color:red;color:#fff;display:flex;align-items:center;justify-content:center}:host .file-container .progress-container .progress{background-color:#0000004d;height:100%}:host .file-container.add{display:flex;align-items:center;flex-direction:column;transition:opacity .25s;cursor:pointer}:host .file-container.add:not(.visible){display:none}:host .file-container.add img{max-width:100%;max-height:100%}:host .file-container.add img.with-hint{max-height:75%}:host .file-container.add .add-hint{margin-top:8px;font-size:80%;text-align:center}:host .file-container.add label{position:absolute;inset:0;cursor:pointer;z-index:10;display:flex;flex-direction:column;align-items:center;justify-content:center}:host .file-container.add .upload-image-container{display:none}:host .file-container .file-menu-container{display:none;position:absolute;left:calc(100% - 45px);top:27px;z-index:1000}:host .file-container .file-menu-container ::ng-deep .menu-item{position:relative;padding:12px 24px;cursor:pointer;display:block}:host .file-container .file-menu-container.visible{display:block}:host .file-container .file-menu{display:flex;position:absolute;flex-direction:column;align-items:center;justify-content:center;padding:12px;right:10px;top:10px;background-color:#fff9;border-radius:50%;cursor:pointer;transition:all .25s;z-index:999}:host .file-container:hover .file-menu{background-color:#fff;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}:host .file-container mat-progress-bar{position:absolute;bottom:0;height:6px;left:0;right:0;z-index:1000}:host image-cropper{padding:0}:host ui-file.rounded ::ng-deep img{border-radius:50%}:host .crop-container{display:flex;align-items:center;justify-content:center;position:relative}:host .crop-container mat-spinner{position:absolute;z-index:1}:host .crop-container .crop-preview{position:absolute;top:100%;left:0;right:0;padding:6px;border:1px solid transparent;display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:1000;max-width:350px;margin-right:auto;margin-left:auto}:host .crop-container .crop-preview.left{right:calc(100% + 6px);left:unset;top:0}:host .crop-container .crop-preview.above{bottom:100%;top:unset}:host .crop-container .crop-preview .crop-menu{width:100%;flex:0 0 auto;display:flex}:host .crop-container .crop-preview .crop-menu mat-icon{margin:0 3px;width:calc(1em + 6px);height:1em;font-size:2em;cursor:pointer;-webkit-user-select:none;user-select:none;flex:1 1 100%}:host .crop-container .crop-preview img{margin:16px 0;max-width:256px;max-height:256px}:host .crop-container .crop-preview img.rounded{border-radius:50%}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i6.NgFileDropDirective, selector: "[ngFileDrop]", inputs: ["options", "uploadInput"], outputs: ["uploadOutput"] }, { kind: "directive", type: i6.NgFileSelectDirective, selector: "[ngFileSelect]", inputs: ["options", "uploadInput"], outputs: ["uploadOutput"] }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i8.ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "imageAltText", "cropperFrameAriaLabel", "output", "format", "transform", "maintainAspectRatio", "aspectRatio", "resetCropOnAspectRatioChange", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "autoCrop", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "allowMoveImage", "cropper", "alignImage", "disabled", "hidden"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed", "transformChange"] }, { kind: "component", type: i9.FileComponent, selector: "ui-file", inputs: ["fileSize", "srcOptions", "srcData", "srcUrl"] }] }); }
374
+ }], usesInheritance: true, ngImport: i0, template: "<div class=\"label\" *ngIf=\"label\">\r\n <div class=\"text-container\"\r\n [matTooltip]=\"required ? translateService.instant('ui.controls.validation.required') : undefined\"\r\n [matTooltipPosition]=\"'above'\">\r\n <div class=\"text\">{{ label }}</div>\r\n <div *ngIf=\"required\" class=\"required\">*</div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"files-container\" [ngClass]=\"{dragging: dragging, disabled: uploading || !editable}\">\r\n\r\n <div class=\"existing-files\">\r\n\r\n <div class=\"file-container\" *ngFor=\"let f of files\">\r\n\r\n @if (customContentTemplate) {\r\n <ng-template [ngTemplateOutlet]=\"customContentTemplate\" [ngTemplateOutletContext]=\"{fileUploader: this, file: f}\"></ng-template>\r\n }\r\n\r\n <div class=\"file-menu\" (click)=\"toggleMenuVisibility(f)\" *ngIf=\"!customFileMenu && editable && !uploading\">\r\n <mat-icon>menu</mat-icon>\r\n </div>\r\n <div class=\"file-menu-container mat-elevation-z2\" [ngClass]=\"{visible: f === fileMenuOpened}\"\r\n (click)=\"menuClick()\" (mouseleave)=\"menuClick()\">\r\n <ng-container *ngIf=\"!menuTemplate\">\r\n <label class=\"menu-item\">{{ translateService.instant('ui.controls.ui-file-uploader.menu.change') }}\r\n <input *ngIf=\"!refreshAddInput\" style=\"display: none;\" type=\"file\" ngFileSelect\r\n [options]=\"uploadOptions\" (change)=\"fileChangeEvent($event, f)\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\">\r\n </label>\r\n <div class=\"menu-item\"\r\n (click)=\"remove(f)\">{{ translateService.instant('ui.controls.ui-file-uploader.menu.delete') }}\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"menuTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"menuTemplate\"\r\n [ngTemplateOutletContext]=\"{fileInput: fileInput}\"></ng-template>\r\n <ng-template #fileInput>\r\n <input style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\"\r\n (change)=\"fileChangeEvent($event, f)\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\">\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"crop && !cropDone(f)\" (mouseenter)=\"startCropPreview(f.$newFile.id)\"\r\n (mouseleave)=\"stopCropPreview(f.$newFile.id)\">\r\n <div class=\"crop-container\" [ngStyle]=\"ngAddStyle\">\r\n\r\n <ui-file *ngIf=\"false && files.length > 0 && !cropSourceImages\" [fileSize]=\"null\"\r\n [srcData]=\"files[0].custom\" [ngClass]=\"{rounded: cropRounded}\"></ui-file>\r\n\r\n <mat-spinner *ngIf=\"!cropperImageLoaded[f.$newFile.id] && cropSourceImages[f.$newFile.id]\"\r\n [diameter]=\"75\"></mat-spinner>\r\n\r\n <image-cropper *ngIf=\"cropSourceImages[f.$newFile.id]\"\r\n [imageFile]=\"cropSourceImages[f.$newFile.id]\"\r\n [maintainAspectRatio]=\"true\"\r\n [containWithinAspectRatio]=\"false\"\r\n [aspectRatio]=\"aspectRatio\"\r\n [resizeToWidth]=\"cropMaxWidth\"\r\n [onlyScaleDown]=\"false\"\r\n [roundCropper]=\"cropRounded\"\r\n [canvasRotation]=\"canvasRotation[f.$newFile.id]\"\r\n [transform]=\"transform[f.$newFile.id]\"\r\n [alignImage]=\"'center'\"\r\n [style.display]=\"showCropper ? null : 'none'\"\r\n [format]=\"'png'\"\r\n (imageCropped)=\"onImageCropped($event, f.$newFile.id)\"\r\n (imageLoaded)=\"imageLoaded(f.$newFile.id)\"\r\n (cropperReady)=\"cropperReady($event, f.$newFile.id)\"\r\n (loadImageFailed)=\"loadImageFailed()\"\r\n ></image-cropper>\r\n\r\n <div class=\"crop-preview mat-elevation-z2\" [class]=\"previewPosition\"\r\n *ngIf=\"true || (showCropPreview[f.$newFile.id] && cropperImageLoaded[f.$newFile.id])\">\r\n <div class=\"crop-menu\">\r\n <mat-icon (click)=\"zoomCroppedImage(.1, f.$newFile.id)\">zoom_in</mat-icon>\r\n <mat-icon (click)=\"zoomCroppedImage(- .1, f.$newFile.id)\">zoom_out</mat-icon>\r\n <mat-icon (click)=\"rotateCroppedImage(-1, f.$newFile.id)\">rotate_left</mat-icon>\r\n <mat-icon (click)=\"rotateCroppedImage(1, f.$newFile.id)\">rotate_right</mat-icon>\r\n <div style=\"flex: 1 1 100%\"></div>\r\n <label class=\"menu-item\">\r\n <mat-icon>upload_file</mat-icon>\r\n <input style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\"\r\n (change)=\"fileChangeEvent($event, f)\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\">\r\n </label>\r\n <mat-icon (click)=\"remove(f)\">delete_outline</mat-icon>\r\n <div style=\"flex: 1 1 100%\"></div>\r\n <mat-icon (click)=\"cropperDone(f.$newFile.id)\">done</mat-icon>\r\n </div>\r\n <img *ngIf=\"croppedImages[f.$newFile.id]\" [src]=\"croppedImages[f.$newFile.id].objectUrl\"\r\n [ngClass]=\"{rounded: cropRounded}\"/>\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n <ng-container *ngIf=\"!crop || cropDone(f)\">\r\n <ng-container *ngIf=\"fileTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"fileTemplate\"\r\n [ngTemplateOutletContext]=\"{file: f, fileInput: fileInput2}\"></ng-template>\r\n <ng-template #fileInput2>\r\n <input style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\"\r\n (change)=\"fileChangeEvent($event, f)\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\">\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ui-file *ngIf=\"!fileTemplate\" [fileSize]=\"_fileSize\" [srcData]=\"f.$newFile ? f.$newFile: f.custom\"\r\n [ngClass]=\"{rounded: crop && cropRounded}\">\r\n </ui-file>\r\n\r\n <ng-container *ngIf=\"f.$newFile\">\r\n <div *ngIf=\"f.$newFile.responseStatus && f.$newFile.responseStatus !== 200\"\r\n class=\"progress-container error\">\r\n {{ translateService.instant('ui.controls.ui-file-uploader.uploadError', f.$newFile.response) }}\r\n </div>\r\n <div *ngIf=\"!f.$newFile.responseStatus && f.$newFile.progress.status === 1\"\r\n class=\"progress-container\">\r\n <div class=\"progress\" [ngStyle]=\"{width: f.$newFile.progress.data.percentage + '%'}\"></div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"file-container add\" ngFileDrop [options]=\"uploadOptions\" (uploadOutput)=\"onUploadOutput($event)\"\r\n [uploadInput]=\"uploadInput\" [ngClass]=\"{visible: files.length < maxFiles || maxFiles === 0}\"\r\n [ngStyle]=\"addFileTemplate ? {} : ngAddStyle\">\r\n <label>\r\n @if (addFileTemplate) {\r\n <ng-template [ngTemplateOutlet]=\"addFileTemplate\"></ng-template>\r\n } @else {\r\n <div class=\"upload-image-container\"></div>\r\n <img [src]=\"uploadImgSrc()\" [ngClass]=\"{'with-hint': addHint}\"/>\r\n <div *ngIf=\"addHint\" class=\"add-hint\">{{ addHint }}</div>\r\n }\r\n <input style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\"\r\n [multiple]=\"maxFiles === 0 && multiple\">\r\n </label>\r\n </div>\r\n\r\n</div>\r\n", styles: [":host{display:flex;flex-wrap:wrap}:host .label .text{font-size:.9em;line-height:1em;padding:6px 0 4px}:host .files-container{display:flex;flex-wrap:wrap;border-style:solid}:host .files-container .existing-files{display:flex;flex-wrap:wrap}:host .files-container.dragging .add label{border:2px dashed grey;background-color:#0000001a}:host .files-container.disabled .add{opacity:.5;pointer-events:none}:host .file-container{max-width:100%;max-height:100%;position:relative;display:flex;align-items:center;justify-content:center}:host .file-container .progress-container{position:absolute;bottom:0;left:1px;right:1px;height:20%;max-height:20px;background-color:#0000001a}:host .file-container .progress-container.error{background-color:red;color:#fff;display:flex;align-items:center;justify-content:center}:host .file-container .progress-container .progress{background-color:#0000004d;height:100%}:host .file-container.add{display:flex;align-items:center;flex-direction:column;transition:opacity .25s;cursor:pointer}:host .file-container.add:not(.visible){display:none}:host .file-container.add img{max-width:100%;max-height:100%}:host .file-container.add img.with-hint{max-height:75%}:host .file-container.add .add-hint{margin-top:8px;font-size:80%;text-align:center}:host .file-container.add label{cursor:pointer;z-index:10;display:flex;flex-direction:column;align-items:center;justify-content:center}:host .file-container.add .upload-image-container{display:none}:host .file-container .file-menu-container{display:none;position:absolute;left:calc(100% - 45px);top:27px;z-index:1000}:host .file-container .file-menu-container ::ng-deep .menu-item{position:relative;padding:12px 24px;cursor:pointer;display:block}:host .file-container .file-menu-container.visible{display:block}:host .file-container .file-menu{display:flex;position:absolute;flex-direction:column;align-items:center;justify-content:center;padding:12px;right:10px;top:10px;background-color:#fff9;border-radius:50%;cursor:pointer;transition:all .25s;z-index:999}:host .file-container:hover .file-menu{background-color:#fff;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}:host .file-container mat-progress-bar{position:absolute;bottom:0;height:6px;left:0;right:0;z-index:1000}:host image-cropper{padding:0;--cropper-outline-color: rgba(255, 255, 255, .8)}:host ui-file.rounded ::ng-deep img{border-radius:50%}:host .crop-container{display:flex;align-items:center;justify-content:center;position:relative}:host .crop-container mat-spinner{position:absolute;z-index:1}:host .crop-container .crop-preview{position:absolute;top:100%;left:0;right:0;padding:6px;border:1px solid transparent;display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:1000;max-width:350px;margin-right:auto;margin-left:auto}:host .crop-container .crop-preview.left{right:calc(100% + 6px);left:unset;top:0}:host .crop-container .crop-preview.above{bottom:100%;top:unset}:host .crop-container .crop-preview .crop-menu{width:100%;flex:0 0 auto;display:flex}:host .crop-container .crop-preview .crop-menu mat-icon{margin:0 3px;width:calc(1em + 6px);height:1em;font-size:2em;cursor:pointer;-webkit-user-select:none;user-select:none;flex:1 1 100%}:host .crop-container .crop-preview img{margin:16px 0;max-width:256px;max-height:256px}:host .crop-container .crop-preview img.rounded{border-radius:50%}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: i6.NgFileDropDirective, selector: "[ngFileDrop]", inputs: ["options", "uploadInput"], outputs: ["uploadOutput"] }, { kind: "directive", type: i6.NgFileSelectDirective, selector: "[ngFileSelect]", inputs: ["options", "uploadInput"], outputs: ["uploadOutput"] }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i8.ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "imageAltText", "cropperFrameAriaLabel", "output", "format", "transform", "maintainAspectRatio", "aspectRatio", "resetCropOnAspectRatioChange", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "autoCrop", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "allowMoveImage", "cropper", "alignImage", "disabled", "hidden"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed", "transformChange"] }, { kind: "component", type: i9.FileComponent, selector: "ui-file", inputs: ["fileSize", "srcOptions", "srcData", "srcUrl"] }] }); }
356
375
  }
357
376
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: UiFileUploaderComponent, decorators: [{
358
377
  type: Component,
@@ -360,7 +379,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
360
379
  provide: NG_VALUE_ACCESSOR,
361
380
  multi: true,
362
381
  useExisting: UiFileUploaderComponent,
363
- }], template: "<div class=\"label\" *ngIf=\"label\">\r\n <div class=\"text-container\" [matTooltip]=\"required ? translateService.instant('ui.controls.validation.required') : undefined\" [matTooltipPosition]=\"'above'\">\r\n <div class=\"text\">{{label}}</div>\r\n <div *ngIf=\"required\" class=\"required\">*</div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"files-container\" [ngClass]=\"{dragging: dragging, disabled: uploading || !editable}\">\r\n\r\n <div class=\"existing-files\">\r\n\r\n <div class=\"file-container\" *ngFor=\"let f of files\">\r\n\r\n <div class=\"file-menu\" (click)=\"toggleMenuVisibility(f)\" *ngIf=\"!customFileMenu && editable && !uploading\">\r\n <mat-icon>menu</mat-icon>\r\n </div>\r\n <div class=\"file-menu-container mat-elevation-z2\" [ngClass]=\"{visible: f === fileMenuOpened}\" (click)=\"menuClick()\" (mouseleave)=\"menuClick()\">\r\n <ng-container *ngIf=\"!menuTemplate\">\r\n <label class=\"menu-item\">{{ translateService.instant('ui.controls.ui-file-uploader.menu.change') }}\r\n <input *ngIf=\"!refreshAddInput\" style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\" (change)=\"fileChangeEvent($event, f)\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\">\r\n </label>\r\n <div class=\"menu-item\" (click)=\"remove(f)\">{{ translateService.instant('ui.controls.ui-file-uploader.menu.delete') }}</div>\r\n </ng-container>\r\n <ng-container *ngIf=\"menuTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"menuTemplate\" [ngTemplateOutletContext]=\"{fileInput: fileInput}\"></ng-template>\r\n <ng-template #fileInput>\r\n <input style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\" (change)=\"fileChangeEvent($event, f)\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\">\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"crop && !cropDone(f)\" (mouseenter)=\"startCropPreview(f.$newFile.id)\" (mouseleave)=\"stopCropPreview(f.$newFile.id)\">\r\n <div class=\"crop-container\" [ngStyle]=\"ngAddStyle\">\r\n\r\n <ui-file *ngIf=\"false && files.length > 0 && !cropSourceImages\" [fileSize]=\"fileSize\" [srcData]=\"files[0].custom\" [ngClass]=\"{rounded: cropRounded}\"></ui-file>\r\n\r\n <mat-spinner *ngIf=\"!cropperImageLoaded[f.$newFile.id] && cropSourceImages[f.$newFile.id]\" [diameter]=\"75\"></mat-spinner>\r\n\r\n <image-cropper *ngIf=\"cropSourceImages[f.$newFile.id]\"\r\n [imageFile]=\"cropSourceImages[f.$newFile.id]\"\r\n [maintainAspectRatio]=\"true\"\r\n [containWithinAspectRatio]=\"false\"\r\n [aspectRatio]=\"aspectRatio\"\r\n [resizeToWidth]=\"cropMaxWidth\"\r\n [onlyScaleDown]=\"false\"\r\n [roundCropper]=\"cropRounded\"\r\n [canvasRotation]=\"canvasRotation[f.$newFile.id]\"\r\n [transform]=\"transform[f.$newFile.id]\"\r\n [alignImage]=\"'center'\"\r\n [style.display]=\"showCropper ? null : 'none'\"\r\n [format]=\"'png'\"\r\n (imageCropped)=\"onImageCropped($event, f.$newFile.id)\"\r\n (imageLoaded)=\"imageLoaded(f.$newFile.id)\"\r\n (cropperReady)=\"cropperReady($event, f.$newFile.id)\"\r\n (loadImageFailed)=\"loadImageFailed()\"\r\n ></image-cropper>\r\n\r\n <div class=\"crop-preview mat-elevation-z2\" [class]=\"previewPosition\" *ngIf=\"true || (showCropPreview[f.$newFile.id] && cropperImageLoaded[f.$newFile.id])\">\r\n <div class=\"crop-menu\">\r\n <mat-icon (click)=\"zoomCroppedImage(.1, f.$newFile.id)\">zoom_in</mat-icon>\r\n <mat-icon (click)=\"zoomCroppedImage(- .1, f.$newFile.id)\">zoom_out</mat-icon>\r\n <mat-icon (click)=\"rotateCroppedImage(-1, f.$newFile.id)\">rotate_left</mat-icon>\r\n <mat-icon (click)=\"rotateCroppedImage(1, f.$newFile.id)\">rotate_right</mat-icon>\r\n <div style=\"flex: 1 1 100%\"></div>\r\n <label class=\"menu-item\">\r\n <mat-icon>upload_file</mat-icon>\r\n <input style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\" (change)=\"fileChangeEvent($event, f)\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\">\r\n </label>\r\n <mat-icon (click)=\"remove(f)\">delete_outline</mat-icon>\r\n <div style=\"flex: 1 1 100%\"></div>\r\n <mat-icon (click)=\"cropperDone(f.$newFile.id)\">done</mat-icon>\r\n </div>\r\n <img *ngIf=\"croppedImages[f.$newFile.id]\" [src]=\"croppedImages[f.$newFile.id].objectUrl\" [ngClass]=\"{rounded: cropRounded}\"/>\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n\r\n </div>\r\n\r\n <ng-container *ngIf=\"!crop || cropDone(f)\">\r\n <ng-container *ngIf=\"fileTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"fileTemplate\" [ngTemplateOutletContext]=\"{file: f, fileInput: fileInput2}\"></ng-template>\r\n <ng-template #fileInput2>\r\n <input style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\" (change)=\"fileChangeEvent($event, f)\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\">\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ui-file *ngIf=\"!fileTemplate\" [fileSize]=\"fileSize\" [srcData]=\"f.$newFile ? f.$newFile: f.custom\" [ngClass]=\"{rounded: crop && cropRounded}\">\r\n </ui-file>\r\n\r\n <ng-container *ngIf=\"f.$newFile\">\r\n <div *ngIf=\"f.$newFile.responseStatus && f.$newFile.responseStatus !== 200\" class=\"progress-container error\">\r\n {{ translateService.instant('ui.controls.ui-file-uploader.uploadError', f.$newFile.response) }}\r\n </div>\r\n <div *ngIf=\"!f.$newFile.responseStatus && f.$newFile.progress.status === 1\" class=\"progress-container\">\r\n <div class=\"progress\" [ngStyle]=\"{width: f.$newFile.progress.data.percentage + '%'}\"></div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"file-container add\" ngFileDrop [options]=\"uploadOptions\" (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\" [ngClass]=\"{visible: files.length < maxFiles || maxFiles === 0}\" [ngStyle]=\"addFileTemplate ? {} : ngAddStyle\">\r\n <label>\r\n <ng-container *ngIf=\"addFileTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"addFileTemplate\"></ng-template>\r\n </ng-container>\r\n <ng-container *ngIf=\"!addFileTemplate\">\r\n <div class=\"upload-image-container\"></div>\r\n <img [src]=\"addFileImgSrc\" [ngClass]=\"{'with-hint': addHint}\" />\r\n <div *ngIf=\"addHint\" class=\"add-hint\">{{addHint}}</div>\r\n </ng-container>\r\n <input style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\" (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\" [multiple]=\"maxFiles === 0 && multiple\">\r\n </label>\r\n </div>\r\n\r\n</div>\r\n", styles: [":host{display:flex;flex-wrap:wrap}:host .label .text{font-size:.9em;line-height:1em;padding:6px 0 4px}:host .files-container{display:flex;flex-wrap:wrap;border-style:solid}:host .files-container .existing-files{display:flex;flex-wrap:wrap}:host .files-container.dragging .add label{border:2px dashed grey;background-color:#0000001a}:host .files-container.disabled .add{opacity:.5;pointer-events:none}:host .file-container{max-width:100%;max-height:100%;position:relative;display:flex;align-items:center;justify-content:center}:host .file-container .progress-container{position:absolute;bottom:0;left:1px;right:1px;height:20%;max-height:20px;background-color:#0000001a}:host .file-container .progress-container.error{background-color:red;color:#fff;display:flex;align-items:center;justify-content:center}:host .file-container .progress-container .progress{background-color:#0000004d;height:100%}:host .file-container.add{display:flex;align-items:center;flex-direction:column;transition:opacity .25s;cursor:pointer}:host .file-container.add:not(.visible){display:none}:host .file-container.add img{max-width:100%;max-height:100%}:host .file-container.add img.with-hint{max-height:75%}:host .file-container.add .add-hint{margin-top:8px;font-size:80%;text-align:center}:host .file-container.add label{position:absolute;inset:0;cursor:pointer;z-index:10;display:flex;flex-direction:column;align-items:center;justify-content:center}:host .file-container.add .upload-image-container{display:none}:host .file-container .file-menu-container{display:none;position:absolute;left:calc(100% - 45px);top:27px;z-index:1000}:host .file-container .file-menu-container ::ng-deep .menu-item{position:relative;padding:12px 24px;cursor:pointer;display:block}:host .file-container .file-menu-container.visible{display:block}:host .file-container .file-menu{display:flex;position:absolute;flex-direction:column;align-items:center;justify-content:center;padding:12px;right:10px;top:10px;background-color:#fff9;border-radius:50%;cursor:pointer;transition:all .25s;z-index:999}:host .file-container:hover .file-menu{background-color:#fff;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}:host .file-container mat-progress-bar{position:absolute;bottom:0;height:6px;left:0;right:0;z-index:1000}:host image-cropper{padding:0}:host ui-file.rounded ::ng-deep img{border-radius:50%}:host .crop-container{display:flex;align-items:center;justify-content:center;position:relative}:host .crop-container mat-spinner{position:absolute;z-index:1}:host .crop-container .crop-preview{position:absolute;top:100%;left:0;right:0;padding:6px;border:1px solid transparent;display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:1000;max-width:350px;margin-right:auto;margin-left:auto}:host .crop-container .crop-preview.left{right:calc(100% + 6px);left:unset;top:0}:host .crop-container .crop-preview.above{bottom:100%;top:unset}:host .crop-container .crop-preview .crop-menu{width:100%;flex:0 0 auto;display:flex}:host .crop-container .crop-preview .crop-menu mat-icon{margin:0 3px;width:calc(1em + 6px);height:1em;font-size:2em;cursor:pointer;-webkit-user-select:none;user-select:none;flex:1 1 100%}:host .crop-container .crop-preview img{margin:16px 0;max-width:256px;max-height:256px}:host .crop-container .crop-preview img.rounded{border-radius:50%}\n"] }]
382
+ }], template: "<div class=\"label\" *ngIf=\"label\">\r\n <div class=\"text-container\"\r\n [matTooltip]=\"required ? translateService.instant('ui.controls.validation.required') : undefined\"\r\n [matTooltipPosition]=\"'above'\">\r\n <div class=\"text\">{{ label }}</div>\r\n <div *ngIf=\"required\" class=\"required\">*</div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"files-container\" [ngClass]=\"{dragging: dragging, disabled: uploading || !editable}\">\r\n\r\n <div class=\"existing-files\">\r\n\r\n <div class=\"file-container\" *ngFor=\"let f of files\">\r\n\r\n @if (customContentTemplate) {\r\n <ng-template [ngTemplateOutlet]=\"customContentTemplate\" [ngTemplateOutletContext]=\"{fileUploader: this, file: f}\"></ng-template>\r\n }\r\n\r\n <div class=\"file-menu\" (click)=\"toggleMenuVisibility(f)\" *ngIf=\"!customFileMenu && editable && !uploading\">\r\n <mat-icon>menu</mat-icon>\r\n </div>\r\n <div class=\"file-menu-container mat-elevation-z2\" [ngClass]=\"{visible: f === fileMenuOpened}\"\r\n (click)=\"menuClick()\" (mouseleave)=\"menuClick()\">\r\n <ng-container *ngIf=\"!menuTemplate\">\r\n <label class=\"menu-item\">{{ translateService.instant('ui.controls.ui-file-uploader.menu.change') }}\r\n <input *ngIf=\"!refreshAddInput\" style=\"display: none;\" type=\"file\" ngFileSelect\r\n [options]=\"uploadOptions\" (change)=\"fileChangeEvent($event, f)\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\">\r\n </label>\r\n <div class=\"menu-item\"\r\n (click)=\"remove(f)\">{{ translateService.instant('ui.controls.ui-file-uploader.menu.delete') }}\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"menuTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"menuTemplate\"\r\n [ngTemplateOutletContext]=\"{fileInput: fileInput}\"></ng-template>\r\n <ng-template #fileInput>\r\n <input style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\"\r\n (change)=\"fileChangeEvent($event, f)\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\">\r\n </ng-template>\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"crop && !cropDone(f)\" (mouseenter)=\"startCropPreview(f.$newFile.id)\"\r\n (mouseleave)=\"stopCropPreview(f.$newFile.id)\">\r\n <div class=\"crop-container\" [ngStyle]=\"ngAddStyle\">\r\n\r\n <ui-file *ngIf=\"false && files.length > 0 && !cropSourceImages\" [fileSize]=\"null\"\r\n [srcData]=\"files[0].custom\" [ngClass]=\"{rounded: cropRounded}\"></ui-file>\r\n\r\n <mat-spinner *ngIf=\"!cropperImageLoaded[f.$newFile.id] && cropSourceImages[f.$newFile.id]\"\r\n [diameter]=\"75\"></mat-spinner>\r\n\r\n <image-cropper *ngIf=\"cropSourceImages[f.$newFile.id]\"\r\n [imageFile]=\"cropSourceImages[f.$newFile.id]\"\r\n [maintainAspectRatio]=\"true\"\r\n [containWithinAspectRatio]=\"false\"\r\n [aspectRatio]=\"aspectRatio\"\r\n [resizeToWidth]=\"cropMaxWidth\"\r\n [onlyScaleDown]=\"false\"\r\n [roundCropper]=\"cropRounded\"\r\n [canvasRotation]=\"canvasRotation[f.$newFile.id]\"\r\n [transform]=\"transform[f.$newFile.id]\"\r\n [alignImage]=\"'center'\"\r\n [style.display]=\"showCropper ? null : 'none'\"\r\n [format]=\"'png'\"\r\n (imageCropped)=\"onImageCropped($event, f.$newFile.id)\"\r\n (imageLoaded)=\"imageLoaded(f.$newFile.id)\"\r\n (cropperReady)=\"cropperReady($event, f.$newFile.id)\"\r\n (loadImageFailed)=\"loadImageFailed()\"\r\n ></image-cropper>\r\n\r\n <div class=\"crop-preview mat-elevation-z2\" [class]=\"previewPosition\"\r\n *ngIf=\"true || (showCropPreview[f.$newFile.id] && cropperImageLoaded[f.$newFile.id])\">\r\n <div class=\"crop-menu\">\r\n <mat-icon (click)=\"zoomCroppedImage(.1, f.$newFile.id)\">zoom_in</mat-icon>\r\n <mat-icon (click)=\"zoomCroppedImage(- .1, f.$newFile.id)\">zoom_out</mat-icon>\r\n <mat-icon (click)=\"rotateCroppedImage(-1, f.$newFile.id)\">rotate_left</mat-icon>\r\n <mat-icon (click)=\"rotateCroppedImage(1, f.$newFile.id)\">rotate_right</mat-icon>\r\n <div style=\"flex: 1 1 100%\"></div>\r\n <label class=\"menu-item\">\r\n <mat-icon>upload_file</mat-icon>\r\n <input style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\"\r\n (change)=\"fileChangeEvent($event, f)\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\">\r\n </label>\r\n <mat-icon (click)=\"remove(f)\">delete_outline</mat-icon>\r\n <div style=\"flex: 1 1 100%\"></div>\r\n <mat-icon (click)=\"cropperDone(f.$newFile.id)\">done</mat-icon>\r\n </div>\r\n <img *ngIf=\"croppedImages[f.$newFile.id]\" [src]=\"croppedImages[f.$newFile.id].objectUrl\"\r\n [ngClass]=\"{rounded: cropRounded}\"/>\r\n </div>\r\n\r\n </div>\r\n\r\n\r\n </div>\r\n\r\n <ng-container *ngIf=\"!crop || cropDone(f)\">\r\n <ng-container *ngIf=\"fileTemplate\">\r\n <ng-template [ngTemplateOutlet]=\"fileTemplate\"\r\n [ngTemplateOutletContext]=\"{file: f, fileInput: fileInput2}\"></ng-template>\r\n <ng-template #fileInput2>\r\n <input style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\"\r\n (change)=\"fileChangeEvent($event, f)\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\">\r\n </ng-template>\r\n </ng-container>\r\n\r\n <ui-file *ngIf=\"!fileTemplate\" [fileSize]=\"_fileSize\" [srcData]=\"f.$newFile ? f.$newFile: f.custom\"\r\n [ngClass]=\"{rounded: crop && cropRounded}\">\r\n </ui-file>\r\n\r\n <ng-container *ngIf=\"f.$newFile\">\r\n <div *ngIf=\"f.$newFile.responseStatus && f.$newFile.responseStatus !== 200\"\r\n class=\"progress-container error\">\r\n {{ translateService.instant('ui.controls.ui-file-uploader.uploadError', f.$newFile.response) }}\r\n </div>\r\n <div *ngIf=\"!f.$newFile.responseStatus && f.$newFile.progress.status === 1\"\r\n class=\"progress-container\">\r\n <div class=\"progress\" [ngStyle]=\"{width: f.$newFile.progress.data.percentage + '%'}\"></div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n\r\n <div class=\"file-container add\" ngFileDrop [options]=\"uploadOptions\" (uploadOutput)=\"onUploadOutput($event)\"\r\n [uploadInput]=\"uploadInput\" [ngClass]=\"{visible: files.length < maxFiles || maxFiles === 0}\"\r\n [ngStyle]=\"addFileTemplate ? {} : ngAddStyle\">\r\n <label>\r\n @if (addFileTemplate) {\r\n <ng-template [ngTemplateOutlet]=\"addFileTemplate\"></ng-template>\r\n } @else {\r\n <div class=\"upload-image-container\"></div>\r\n <img [src]=\"uploadImgSrc()\" [ngClass]=\"{'with-hint': addHint}\"/>\r\n <div *ngIf=\"addHint\" class=\"add-hint\">{{ addHint }}</div>\r\n }\r\n <input style=\"display: none;\" type=\"file\" ngFileSelect [options]=\"uploadOptions\"\r\n (uploadOutput)=\"onUploadOutput($event)\" [uploadInput]=\"uploadInput\"\r\n [multiple]=\"maxFiles === 0 && multiple\">\r\n </label>\r\n </div>\r\n\r\n</div>\r\n", styles: [":host{display:flex;flex-wrap:wrap}:host .label .text{font-size:.9em;line-height:1em;padding:6px 0 4px}:host .files-container{display:flex;flex-wrap:wrap;border-style:solid}:host .files-container .existing-files{display:flex;flex-wrap:wrap}:host .files-container.dragging .add label{border:2px dashed grey;background-color:#0000001a}:host .files-container.disabled .add{opacity:.5;pointer-events:none}:host .file-container{max-width:100%;max-height:100%;position:relative;display:flex;align-items:center;justify-content:center}:host .file-container .progress-container{position:absolute;bottom:0;left:1px;right:1px;height:20%;max-height:20px;background-color:#0000001a}:host .file-container .progress-container.error{background-color:red;color:#fff;display:flex;align-items:center;justify-content:center}:host .file-container .progress-container .progress{background-color:#0000004d;height:100%}:host .file-container.add{display:flex;align-items:center;flex-direction:column;transition:opacity .25s;cursor:pointer}:host .file-container.add:not(.visible){display:none}:host .file-container.add img{max-width:100%;max-height:100%}:host .file-container.add img.with-hint{max-height:75%}:host .file-container.add .add-hint{margin-top:8px;font-size:80%;text-align:center}:host .file-container.add label{cursor:pointer;z-index:10;display:flex;flex-direction:column;align-items:center;justify-content:center}:host .file-container.add .upload-image-container{display:none}:host .file-container .file-menu-container{display:none;position:absolute;left:calc(100% - 45px);top:27px;z-index:1000}:host .file-container .file-menu-container ::ng-deep .menu-item{position:relative;padding:12px 24px;cursor:pointer;display:block}:host .file-container .file-menu-container.visible{display:block}:host .file-container .file-menu{display:flex;position:absolute;flex-direction:column;align-items:center;justify-content:center;padding:12px;right:10px;top:10px;background-color:#fff9;border-radius:50%;cursor:pointer;transition:all .25s;z-index:999}:host .file-container:hover .file-menu{background-color:#fff;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}:host .file-container mat-progress-bar{position:absolute;bottom:0;height:6px;left:0;right:0;z-index:1000}:host image-cropper{padding:0;--cropper-outline-color: rgba(255, 255, 255, .8)}:host ui-file.rounded ::ng-deep img{border-radius:50%}:host .crop-container{display:flex;align-items:center;justify-content:center;position:relative}:host .crop-container mat-spinner{position:absolute;z-index:1}:host .crop-container .crop-preview{position:absolute;top:100%;left:0;right:0;padding:6px;border:1px solid transparent;display:flex;flex-direction:column;align-items:center;justify-content:center;z-index:1000;max-width:350px;margin-right:auto;margin-left:auto}:host .crop-container .crop-preview.left{right:calc(100% + 6px);left:unset;top:0}:host .crop-container .crop-preview.above{bottom:100%;top:unset}:host .crop-container .crop-preview .crop-menu{width:100%;flex:0 0 auto;display:flex}:host .crop-container .crop-preview .crop-menu mat-icon{margin:0 3px;width:calc(1em + 6px);height:1em;font-size:2em;cursor:pointer;-webkit-user-select:none;user-select:none;flex:1 1 100%}:host .crop-container .crop-preview img{margin:16px 0;max-width:256px;max-height:256px}:host .crop-container .crop-preview img.rounded{border-radius:50%}\n"] }]
364
383
  }], ctorParameters: () => [{ type: undefined, decorators: [{
365
384
  type: Optional
366
385
  }, {
@@ -375,7 +394,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
375
394
  type: Host
376
395
  }, {
377
396
  type: SkipSelf
378
- }] }, { type: i2.UiFileService }], propDecorators: { maxFiles: [{
397
+ }] }, { type: i2.UiFileService }], propDecorators: { fileSize: [{
398
+ type: Input,
399
+ args: [{ required: true }]
400
+ }], maxFiles: [{
379
401
  type: Input
380
402
  }], multiple: [{
381
403
  type: Input
@@ -385,8 +407,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
385
407
  type: Input
386
408
  }], cropMaxWidth: [{
387
409
  type: Input
388
- }], fileSize: [{
389
- type: Input
390
410
  }], customFileMenu: [{
391
411
  type: Input
392
412
  }], addHint: [{
@@ -402,4 +422,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
402
422
  }], fileEvent: [{
403
423
  type: Output
404
424
  }] } });
405
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktZmlsZS11cGxvYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2ZpbGUtdXBsb2FkZXIvdWktZmlsZS11cGxvYWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2ZpbGUtdXBsb2FkZXIvdWktZmlsZS11cGxvYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixJQUFJLEVBQ0osTUFBTSxFQUNOLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFFBQVEsRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQW9CLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckUsT0FBTyxFQUEwQyxjQUFjLEVBQWlCLE1BQU0sNkJBQTZCLENBQUM7QUFFcEgsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDMUUsT0FBTyxFQUF1QixtQkFBbUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOzs7Ozs7Ozs7OztBQTJCNUYsTUFBTSxPQUFPLHVCQUF3QixTQUFRLGlCQUFpQjtJQWM1RCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUUsWUFBWSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQztJQUN0QyxDQUFDO0lBd0NELFlBQXdELGlCQUFpQyxFQUN6QyxnQkFBcUMsRUFDL0IsZ0JBQWtDLEVBQ3BFLFdBQTBCO1FBRTVDLEtBQUssQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLENBQUMs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dGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSG9zdCxcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPcHRpb25hbCxcclxuICBPdXRwdXQsXHJcbiAgU2tpcFNlbGZcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbENvbnRhaW5lciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFVwbG9hZGVyT3B0aW9ucywgVXBsb2FkRmlsZSwgVXBsb2FkSW5wdXQsIFVwbG9hZE91dHB1dCB9IGZyb20gJ25neC11cGxvYWRlcic7XHJcbmltcG9ydCB7IElVaUZpbGVTZXJ2aWNlLCBJVWlGaWxlU2VydmljZU1lc3NhZ2VzLCBVSV9GSUxFU0VSVklDRSwgVWlGaWxlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3VpLWZpbGUuc2VydmljZSc7XHJcbmltcG9ydCB7IERpbWVuc2lvbnMsIEltYWdlQ3JvcHBlZEV2ZW50LCBJbWFnZVRyYW5zZm9ybSB9IGZyb20gJ25neC1pbWFnZS1jcm9wcGVyJztcclxuaW1wb3J0IHsgVWlTaW1wbGVDb21wb25lbnQgfSBmcm9tICcuLi9sYXlvdXRzL3NpbXBsZS91aS1zaW1wbGUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgSVVpVHJhbnNsYXRlU2VydmljZSwgVUlfVFJBTlNMQVRFU0VSVklDRSB9IGZyb20gJy4uL3NlcnZpY2VzL3VpLXRyYW5zbGF0ZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgc2tpcCB9IGZyb20gJ3J4anMnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBVcGxvYWRPdXRwdXRFeCBleHRlbmRzIFVwbG9hZE91dHB1dCB7XHJcbiAgZmlsZTogVXBsb2FkRmlsZUV4O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFVwbG9hZEZpbGVFeCBleHRlbmRzIFVwbG9hZEZpbGUge1xyXG4gIGltYWdlUHJldmlldz86IGFueTtcclxuICBiYXNlNjQ/OiBhbnk7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVVpVXBsb2FkZXJVc2VyTWVzc2FnZSB7XHJcbiAgbWVzc2FnZTogSVVpRmlsZVNlcnZpY2VNZXNzYWdlcyxcclxuICBkYXRhOiBhbnlcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd1aS1maWxlLXVwbG9hZGVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdWktZmlsZS11cGxvYWRlci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbICcuL3VpLWZpbGUtdXBsb2FkZXIuY29tcG9uZW50LnNjc3MnXSxcclxuICBwcm92aWRlcnM6IFt7XHJcbiAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgIG11bHRpOiB0cnVlLFxyXG4gICAgdXNlRXhpc3Rpbmc6IFVpRmlsZVVwbG9hZGVyQ29tcG9uZW50LFxyXG4gIH1dXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVaUZpbGVVcGxvYWRlckNvbXBvbmVudCBleHRlbmRzIFVpU2ltcGxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICBASW5wdXQoKSBtYXhGaWxlcyA9IDE7XHJcbiAgQElucHV0KCkgbXVsdGlwbGUgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGNyb3AgPSBmYWxzZTtcclxuICBASW5wdXQoKSBjcm9wUm91bmRlZCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGNyb3BNYXhXaWR0aDtcclxuICBASW5wdXQoKSBmaWxlU2l6ZSA9ICdkZWZhdWx0JztcclxuICBASW5wdXQoKSBjdXN0b21GaWxlTWVudSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGFkZEhpbnQ7XHJcbiAgQElucHV0KCkgbmV3RmlsZVBvc2l0aW9uOiAnZmlyc3QnIHwgJ2xhc3QnID0gJ2xhc3QnO1xyXG5cclxuICBASW5wdXQoKSB0ZW1wbGF0ZXM6IHsgbWVudVRlbXBsYXRlPzogYW55LCBhZGRGaWxlVGVtcGxhdGU/OiBhbnksIGZpbGVUZW1wbGF0ZT86IGFueSB9ID0ge31cclxuXHJcbiAgZ2V0IG1lbnVUZW1wbGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlcz8ubWVudVRlbXBsYXRlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGFkZEZpbGVUZW1wbGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlcz8uYWRkRmlsZVRlbXBsYXRlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGZpbGVUZW1wbGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlcz8uZmlsZVRlbXBsYXRlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgcHJldmlld1Bvc2l0aW9uOiAnbGVmdCcgfCAnYm90dG9tJyB8ICdhYm92ZScgPSAnYm90dG9tJztcclxuXHJcbiAgQE91dHB1dCgpIGltYWdlQ3JvcHBlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgZmlsZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxJVWlVcGxvYWRlclVzZXJNZXNzYWdlPigpO1xyXG5cclxuICB1cGxvYWRPcHRpb25zOiBVcGxvYWRlck9wdGlvbnMgPSB7XHJcbiAgICBjb25jdXJyZW5jeTogdGhpcy5maWxlU2VydmljZUNvbmZpZy5jb25jdXJyZW50VXBsb2Fkc1xyXG4gIH07XHJcblxyXG4gIHB1YmxpYyB1cGxvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgY2hhbmdlRmlsZUluZGV4O1xyXG5cclxuICBzaG93Q3JvcHBlciA9IGZhbHNlO1xyXG4gIG1lbnVWaXNpYmxlOiBhbnk7XHJcbiAgc2hvd0Nyb3BQcmV2aWV3ID0ge307XHJcbiAgY3JvcFByZXZpZXdUaW1lb3V0cyA9IHt9O1xyXG4gIGNyb3BTb3VyY2VJbWFnZXMgPSB7fTtcclxuICBjcm9wcGVySW1hZ2VMb2FkZWQgPSB7fTtcclxuICBpbWFnZXNEb25lID0ge307XHJcbiAgdHJhbnNmb3JtOiBJbWFnZVRyYW5zZm9ybSA9IHt9O1xyXG4gIGNhbnZhc1JvdGF0aW9uID0ge31cclxuXHJcbiAgcHVibGljIGZpbGVzIDogeyBjdXN0b20/OiBhbnksICRuZXdGaWxlPzogVXBsb2FkRmlsZSB9W107XHJcblxyXG4gIHB1YmxpYyByZXNwb25zZUZpbGVzO1xyXG5cclxuICByZWZyZXNoQWRkSW5wdXQgPSBmYWxzZTtcclxuXHJcbiAgZmlsZU1lbnVPcGVuZWQ7XHJcblxyXG4gIHBhdGNoaW5nVmFsdWVzID0gZmFsc2U7XHJcblxyXG4gIGlucHV0QXJyYXkgPSBmYWxzZTtcclxuICBkcmFnZ2luZyA9IGZhbHNlO1xyXG5cclxuICB1cGxvYWRlcklkID0gTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogMTAwMDAwMCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBJbmplY3QoVUlfRklMRVNFUlZJQ0UpIHByaXZhdGUgZmlsZVNlcnZpY2VDb25maWc6IElVaUZpbGVTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIEBJbmplY3QoVUlfVFJBTlNMQVRFU0VSVklDRSkgcHVibGljIHRyYW5zbGF0ZVNlcnZpY2U6IElVaVRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEhvc3QoKSBAU2tpcFNlbGYoKSBwcm90ZWN0ZWQgY29udHJvbENvbnRhaW5lcjogQ29udHJvbENvbnRhaW5lcixcclxuICAgICAgICAgICAgICBwcml2YXRlIGZpbGVTZXJ2aWNlOiBVaUZpbGVTZXJ2aWNlKSB7XHJcblxyXG4gICAgc3VwZXIobnVsbCwgY29udHJvbENvbnRhaW5lcik7XHJcblxyXG4gICAgdGhpcy5maWxlU2VydmljZS51cGxvYWRTdWJzY3JpcHRpb24ubmV4dCh7YWN0aW9uOiAncmVnaXN0ZXInLCBkYXRhOiB0aGlzfSk7XHJcblxyXG4gICAgdGhpcy5maWxlU2VydmljZS51cGxvYWRTdWJzY3JpcHRpb24uc3Vic2NyaWJlKCh2OiBhbnkpID0+IHtcclxuICAgICAgc3dpdGNoICh2LmFjdGlvbikge1xyXG4gICAgICAgIGNhc2UgJ3VwbG9hZFN0YXJ0ZWQnOiB0aGlzLnVwbG9hZGluZyA9IHRydWU7IGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ3VwbG9hZEZhaWxlZCc6XHJcbiAgICAgICAgY2FzZSAndXBsb2FkU3VjY2Vzcyc6XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy51cGxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdGhpcy5wYXRjaFZhbHVlcygpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldCB1cGxvYWRJbnB1dCgpOiBFdmVudEVtaXR0ZXI8VXBsb2FkSW5wdXQ+IHtcclxuICAgIHJldHVybiB0aGlzLmZpbGVTZXJ2aWNlLnVwbG9hZElucHV0O1xyXG4gIH1cclxuXHJcbiAgY3JvcHBlZEltYWdlcyA9IHt9O1xyXG5cclxuICBnZXQgZWRpdGFibGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnRGb3JtQ29udHJvbC5lbmFibGVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG5nQWRkU3R5bGUoKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB3aWR0aDogTWF0aC5hYnModGhpcy5maWxlU2VydmljZUNvbmZpZy5pbWFnZVNpemVzW3RoaXMuZmlsZVNpemVdWzBdKSArICdweCcsXHJcbiAgICAgIGhlaWdodDogTWF0aC5hYnModGhpcy5maWxlU2VydmljZUNvbmZpZy5pbWFnZVNpemVzW3RoaXMuZmlsZVNpemVdWzFdKSArICdweCcsXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgYXNwZWN0UmF0aW8oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5maWxlU2VydmljZUNvbmZpZy5pbWFnZVNpemVzW3RoaXMuZmlsZVNpemVdWzBdIC8gdGhpcy5maWxlU2VydmljZUNvbmZpZy5pbWFnZVNpemVzW3RoaXMuZmlsZVNpemVdWzFdO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGFkZEZpbGVJbWdTcmMoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5maWxlU2VydmljZUNvbmZpZy5hZGRGaWxlSW1nU3JjO1xyXG4gIH1cclxuXHJcbiAgY3JvcERvbmUoZikge1xyXG4gICAgcmV0dXJuICFmLiRuZXdGaWxlIHx8IHRoaXMuaW1hZ2VzRG9uZVtmLiRuZXdGaWxlLmlkXTtcclxuICB9XHJcblxyXG4gIC8vIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gIC8vICAgc3VwZXIubmdPbkluaXQoKTtcclxuICAvLyB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5maWxlU2VydmljZS51cGxvYWRTdWJzY3JpcHRpb24ubmV4dCh7YWN0aW9uOiAnZGVzdHJveScsIGRhdGE6IHRoaXN9KTtcclxuICB9XHJcblxyXG4gIHJlbW92ZShmOiBhbnkpOiB2b2lkIHtcclxuICAgIGlmIChmLiRuZXdGaWxlKSB7XHJcbiAgICAgIHRoaXMudXBsb2FkSW5wdXQuZW1pdCh7dHlwZTogJ3JlbW92ZScsIGlkOiBmLiRuZXdGaWxlLmlkfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZpbGVzLnNwbGljZSh0aGlzLmZpbGVzLmluZGV4T2YoZiksIDEpO1xyXG4gICAgdGhpcy5wcmVwYXJlUmVzcG9uc2UoKTtcclxuICAgIC8vIHRoaXMub25DaGFuZ2UodGhpcy5pbnB1dEFycmF5ID8gdGhpcy5maWxlcyA6ICh0aGlzLmZpbGVzLmxlbmd0aCA+IDAgPyB0aGlzLmZpbGVzWzBdIDogbnVsbCkpO1xyXG4gICAgdGhpcy5maWxlRXZlbnQuZW1pdCh7IG1lc3NhZ2U6ICdmaWxlUmVtb3ZlZCcsIGRhdGE6IGYgfSk7XHJcbi8vICAgICB0aGlzLnBhdGNoVmFsdWVzKCk7XHJcbiAgfVxyXG5cclxuICBwYXRjaFZhbHVlcygpOiB2b2lkIHtcclxuICAgIHRoaXMucGF0Y2hpbmdWYWx1ZXMgPSB0cnVlO1xyXG4gICAgLy8gaWYgKHRoaXMuaW5wdXRBcnJheSkge1xyXG4gICAgLy8gICB0aGlzLmNvbXBvbmVudEZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMuZmlsZXMubWFwKGYgPT4gZi5jdXN0b20pKTtcclxuICAgIC8vIH0gZWxzZSB7XHJcbiAgICAvLyAgIHRoaXMuY29tcG9uZW50Rm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5maWxlcy5sZW5ndGggPT09IDAgPyBudWxsIDogdGhpcy5maWxlc1swXS5jdXN0b20pO1xyXG4gICAgLy8gfVxyXG4gICAgdGhpcy5wYXRjaGluZ1ZhbHVlcyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc0ZpbGVzVG9VcGxvYWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLmZpbGVzLmZpbmQoZiA9PiBmLiRuZXdGaWxlICYmIGYuJG5ld0ZpbGUucHJvZ3Jlc3Muc3RhdHVzICE9PSAyKTtcclxuICB9XHJcblxyXG4gIGNhbkltYWdlUHJldmlldyh0eXBlOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpIHx8IHR5cGUuc3RhcnRzV2l0aCgndmlkZW8vJyk7XHJcbiAgfVxyXG5cclxuICBvblVwbG9hZE91dHB1dCgkZXZlbnQ6IFVwbG9hZE91dHB1dCwgc2tpcEN1c3RvbVZhbGlkYXRpb24gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgLy8gY29uc29sZS5sb2coJGV2ZW50KTtcclxuICAgIHN3aXRjaCAoJGV2ZW50LnR5cGUpIHtcclxuICAgICAgY2FzZSAnc3RhcnQnOlxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnZHJhZ092ZXInOlxyXG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdkcmFnT3V0JzpcclxuICAgICAgY2FzZSAnZHJvcCc6XHJcbiAgICAgICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSAnYWRkZWRUb1F1ZXVlJzpcclxuICAgICAgICBpZiAodGhpcy5jcm9wICYmICEkZXZlbnQuZmlsZS50eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpKSB7XHJcbiAgICAgICAgICB0aGlzLnVwbG9hZElucHV0LmVtaXQoeyB0eXBlOiAncmVtb3ZlJywgaWQ6ICRldmVudC5maWxlLmlkIH0pO1xyXG4gICAgICAgICAgdGhpcy5maWxlRXZlbnQuZW1pdCh7IG1lc3NhZ2U6ICdjcm9wSW52YWxpZEZpbGVUeXBlJywgZGF0YTogJGV2ZW50LmZpbGUgfSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXNraXBDdXN0b21WYWxpZGF0aW9uICYmIHRoaXMuZmlsZVNlcnZpY2VDb25maWcuZmlsZVZhbGlkYXRpb24pIHtcclxuICAgICAgICAgIHRoaXMuZmlsZVNlcnZpY2VDb25maWcuZmlsZVZhbGlkYXRpb24odGhpcy5maWxlU2l6ZSwgJGV2ZW50LmZpbGUpLnRoZW4odmFsaWQgPT4ge1xyXG4gICAgICAgICAgICBpZiAodmFsaWQpIHtcclxuICAgICAgICAgICAgICB0aGlzLm9uVXBsb2FkT3V0cHV0KCRldmVudCwgdHJ1ZSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLnVwbG9hZElucHV0LmVtaXQoeyB0eXBlOiAncmVtb3ZlJywgaWQ6ICRldmVudC5maWxlLmlkIH0pO1xyXG4gICAgICAgICAgICAgIC8vIHRoaXMuZmlsZUV2ZW50LmVtaXQoeyBtZXNzYWdlOiAnY3JvcEludmFsaWRGaWxlVHlwZScsIGRhdGE6ICRldmVudC5maWxlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgZjtcclxuICAgICAgICAgIGlmICh0aGlzLmNoYW5nZUZpbGVJbmRleCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGYgPSB0aGlzLmZpbGVzW3RoaXMuY2hhbmdlRmlsZUluZGV4XTtcclxuICAgICAgICAgICAgaWYgKGYuJG5ld0ZpbGUpIHtcclxuICAgICAgICAgICAgICB0aGlzLnVwbG9hZElucHV0LmVtaXQoeyB0eXBlOiAncmVtb3ZlJywgaWQ6IGYuJG5ld0ZpbGUuaWQgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZi4kbmV3RmlsZSA9ICRldmVudC5maWxlO1xyXG4gICAgICAgICAgICBmLmN1c3RvbSA9ICRldmVudC5maWxlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZUZpbGVJbmRleCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGYgPSB7IGN1c3RvbTogJGV2ZW50LmZpbGUsICRuZXdGaWxlOiAkZXZlbnQuZmlsZSB9O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5uZXdGaWxlUG9zaXRpb24gPT09ICdsYXN0Jykge1xyXG4gICAgICAgICAgICAgIHRoaXMuZmlsZXMucHVzaChmKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLmZpbGVzLnVuc2hpZnQoZik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0aGlzLmNhbkltYWdlUHJldmlldygkZXZlbnQuZmlsZS50eXBlKSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jcm9wKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYW52YXNSb3RhdGlvblskZXZlbnQuZmlsZS5pZF0gPSAwO1xyXG4gICAgICAgICAgICAgIHRoaXMuY3JvcFNvdXJjZUltYWdlc1skZXZlbnQuZmlsZS5pZF0gPSAkZXZlbnQuZmlsZS5uYXRpdmVGaWxlO1xyXG4gICAgICAgICAgICAgIHRoaXMuY3JvcHBlckltYWdlTG9hZGVkWyRldmVudC5maWxlLmlkXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnByZXBhcmVSZXNwb25zZSgpO1xyXG4gICAgICAgICAgdGhpcy5maWxlRXZlbnQuZW1pdCh7IG1lc3NhZ2U6ICdmaWxlQWRkZWQnLCBkYXRhOiBmIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ2RvbmUnOlxyXG4gICAgICAgIGNvbnN0IGRmID0gdGhpcy5maWxlcy5maW5kKGYgPT4gZi4kbmV3RmlsZSA9PT0gJGV2ZW50LmZpbGUpO1xyXG4gICAgICAgIGlmIChkZikge1xyXG4gICAgICAgICAgaWYgKGRmLiRuZXdGaWxlLnJlc3BvbnNlU3RhdHVzID09PSAyMDApIHtcclxuICAgICAgICAgICAgdGhpcy5maWxlc1t0aGlzLmZpbGVzLmluZGV4T2YoZGYpXS5jdXN0b20gPSBkZi4kbmV3RmlsZS5yZXNwb25zZTtcclxuICAgICAgICAgICAgZGYuJG5ld0ZpbGUgPSBudWxsO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2Vycm9yIG9uIHVwbG9hZCcsIGRmLiRldmVudCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5oYXNGaWxlc1RvVXBsb2FkKSB7XHJcbiAgICAgICAgICB0aGlzLnByZXBhcmVSZXNwb25zZShmYWxzZSk7XHJcbiAgICAgICAgICB0aGlzLmZpbGVTZXJ2aWNlLnVwbG9hZFN1YnNjcmlwdGlvbi5uZXh0KHtcclxuICAgICAgICAgICAgYWN0aW9uOiB0aGlzLmZpbGVzLmZpbmQoZiA9PiAhIWYuJG5ld0ZpbGUpID8gJ3VwbG9hZENvbnRyb2xGYWlsZWQnIDogJ3VwbG9hZENvbnRyb2xTdWNjZXNzJ1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJlcGFyZVJlc3BvbnNlKGRvZW1pdCA9IHRydWUpIHtcclxuICAgIGlmICh0aGlzLmlucHV0QXJyYXkpIHtcclxuICAgICAgaWYgKCF0aGlzLnJlc3BvbnNlRmlsZXMpIHtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRmlsZXMgPSBbXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnJlc3BvbnNlRmlsZXMubGVuZ3RoID0gMDtcclxuICAgICAgdGhpcy5maWxlcy5mb3JFYWNoKGYgPT4gdGhpcy5yZXNwb25zZUZpbGVzLnB1c2goey4uLmYuY3VzdG9tLCAkbmV3RmlsZTogZi4kbmV3RmlsZX0pKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLmZpbGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2VGaWxlcyA9IG51bGw7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJlc3BvbnNlRmlsZXMpIHtcclxuICAgICAgICAgIHRoaXMucmVzcG9uc2VGaWxlcyA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZpbGVzWzBdLmN1c3RvbSkuZm9yRWFjaChrID0+IHtcclxuICAgICAgICAgIHRoaXMucmVzcG9uc2VGaWxlc1trXSA9IHRoaXMuZmlsZXNbMF0uY3VzdG9tW2tdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2VGaWxlcy4kbmV3RmlsZSA9IHRoaXMuZmlsZXNbMF0uJG5ld0ZpbGU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChkb2VtaXQpIHtcclxuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnJlc3BvbnNlRmlsZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNvbnNvbGUubG9nKCdlbWl0JywgdGhpcy5maWxlc1sxXSwgeyAuLi50aGlzLmZpbGVzWzFdLmN1c3RvbSwgJG5ld0ZpbGU6IHRoaXMuZmlsZXNbMV0uJG5ld0ZpbGUgfSk7XHJcbiAgICAvLyB0aGlzLm9uQ2hhbmdlKHRoaXMuaW5wdXRBcnJheSA/XHJcbiAgICAvLyAgIHRoaXMuZmlsZXMubWFwKGYgPT4gKHsgLi4uZi5jdXN0b20sICRuZXdGaWxlOiBmLiRuZXdGaWxlfSkpIDpcclxuICAgIC8vICAgKHRoaXMuZmlsZXMubGVuZ3RoID4gMCA/IHsgLi4udGhpcy5maWxlc1swXS5jdXN0b20sICRuZXdGaWxlOiB0aGlzLmZpbGVzWzBdLiRuZXdGaWxlIH0gOiBudWxsKSk7XHJcbiAgICAvLyB0aGlzLm9uQ2hhbmdlKHRoaXMuaW5wdXRBcnJheSA/XHJcbiAgICAvLyAgIHRoaXMuZmlsZXMgOlxyXG4gICAgLy8gICAodGhpcy5maWxlcy5sZW5ndGggPiAwID8gdGhpcy5maWxlc1swXSA6IG51bGwpKTtcclxuICB9XHJcblxyXG4gIGJlZm9yZVNhdmUoKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XHJcbiAgICAgIHRoaXMuZmlsZXMuZm9yRWFjaChmID0+IHtcclxuICAgICAgICBpZiAoZi4kbmV3RmlsZSAmJiBmLiRuZXdGaWxlLnByb2dyZXNzLnN0YXR1cyA9PT0gMikge1xyXG4gICAgICAgICAgZi4kbmV3RmlsZS5wcm9ncmVzcy5zdGF0dXMgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5jcm9wICYmIGYuJG5ld0ZpbGUgJiYgIXRoaXMuaW1hZ2VzRG9uZVtmLiRuZXdGaWxlLmlkXSkge1xyXG4gICAgICAgICAgdGhpcy5jcm9wcGVyRG9uZShmLiRuZXdGaWxlLmlkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHJlcygnZG9uZScpO1xyXG4gICAgICB9LCAyNTApO1xyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGZpbGVDaGFuZ2VFdmVudChldmVudDogYW55LCBmOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuY2hhbmdlRmlsZUluZGV4ID0gdGhpcy5maWxlcy5pbmRleE9mKGYpO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRDcm9wUHJldmlldyhpZCkge1xyXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuY3JvcFByZXZpZXdUaW1lb3V0c1tpZF0pO1xyXG4gICAgdGhpcy5zaG93Q3JvcFByZXZpZXdbaWRdID0gISF0aGlzLmNyb3BTb3VyY2VJbWFnZXNbaWRdO1xyXG4gIH1cclxuXHJcbiAgc3RvcENyb3BQcmV2aWV3KGlkKSB7XHJcbiAgICB0aGlzLmNyb3BQcmV2aWV3VGltZW91dHNbaWRdID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd0Nyb3BQcmV2aWV3W2lkXSA9IGZhbHNlO1xyXG4gICAgfSwgMjUwKTtcclxuICB9XHJcblxyXG4gIHpvb21Dcm9wcGVkSW1hZ2UoZGlyLCBpZCkge1xyXG4gICAgbGV0IHNjYWxlID0gdGhpcy50cmFuc2Zvcm1baWRdLnNjYWxlO1xyXG4gICAgc2NhbGUgKz0gZGlyO1xyXG4gICAgaWYgKHNjYWxlIDwgMC4xKSB7XHJcbiAgICAgIHNjYWxlID0gMC4xO1xyXG4gICAgfVxyXG4gICAgdGhpcy50cmFuc2Zvcm1baWRdID0ge1xyXG4gICAgICAuLi50aGlzLnRyYW5zZm9ybVtpZF0sXHJcbiAgICAgIHNjYWxlXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcm90YXRlQ3JvcHBlZEltYWdlKGRpciwgaWQpIHtcclxuICAgIHRoaXMuY2FudmFzUm90YXRpb25baWRdICs9IGRpcjtcclxuICAgIGNvbnN0IGZsaXBwZWRIID0gdGhpcy50cmFuc2Zvcm1baWRdLmZsaXBIO1xyXG4gICAgY29uc3QgZmxpcHBlZFYgPSB0aGlzLnRyYW5zZm9ybVtpZF0uZmxpcFY7XHJcbiAgICB0aGlzLnRyYW5zZm9ybVtpZF0gPSB7XHJcbiAgICAgIC4uLnRoaXMudHJhbnNmb3JtW2lkXSxcclxuICAgICAgZmxpcEg6IGZsaXBwZWRWLFxyXG4gICAgICBmbGlwVjogZmxpcHBlZEhcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBvbkltYWdlQ3JvcHBlZChldmVudDogSW1hZ2VDcm9wcGVkRXZlbnQsIGlkKSB7XHJcbiAgICB0aGlzLmNyb3BwZWRJbWFnZXNbaWRdID0gZXZlbnQ7XHJcbiAgICB0aGlzLmltYWdlQ3JvcHBlZC5lbWl0KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIGltYWdlTG9hZGVkKGlkKSB7XHJcbiAgICB0aGlzLnNob3dDcm9wcGVyID0gdHJ1ZTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnRyYW5zZm9ybVtpZF0gPSB7XHJcbiAgICAgICAgc2NhbGU6IDFcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY3JvcHBlclJlYWR5KHNvdXJjZUltYWdlRGltZW5zaW9uczogRGltZW5zaW9ucywgaWQpIHtcclxuICAgIHRoaXMuY3JvcHBlckltYWdlTG9hZGVkW2lkXSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBsb2FkSW1hZ2VGYWlsZWQoKSB7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVNZW51VmlzaWJpbGl0eShmKSB7XHJcbiAgICB0aGlzLmZpbGVNZW51T3BlbmVkID0gZjtcclxuICB9XHJcblxyXG4gIG1lbnVDbGljaygpIHtcclxuICAgIHRoaXMuZmlsZU1lbnVPcGVuZWQgPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgd3JpdGVWYWx1ZShvYmo6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5pbnB1dEFycmF5ID0gb2JqIGluc3RhbmNlb2YgQXJyYXk7XHJcbiAgICBpZiAodGhpcy5pbnB1dEFycmF5KSB7XHJcbiAgICAgIHRoaXMuZmlsZXMgPSBvYmoubWFwKGYgPT4gKHsgY3VzdG9tOiBmLCAkbmV3RmlsZTogbnVsbCB9KSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZpbGVzID0gb2JqID8gWyB7IGN1c3RvbTpvYmosICRuZXdGaWxlOiBudWxsfSBdIDogW107XHJcbiAgICB9XHJcbiAgICB0aGlzLmNyb3BTb3VyY2VJbWFnZXMgPSB7fTtcclxuICB9XHJcblxyXG4gIGNyb3BwZXJEb25lKGlkKSB7XHJcbiAgICBjb25zdCBmID0gdGhpcy5maWxlcy5maW5kKGZ4ID0+IGZ4LiRuZXdGaWxlICYmIGZ4LiRuZXdGaWxlLmlkID09PSBpZCk7XHJcbiAgICBpZiAoZikge1xyXG4gICAgICAvLyBjb25zdCB1cmwgPSB0aGlzLmNyb3BwZWRJbWFnZXNbaWRdO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyh1cmwpO1xyXG4gICAgICAvLyBmZXRjaCh1cmwpXHJcbiAgICAgIC8vICAgLnRoZW4ocmVzID0+IHJlcy5ibG9iKCkpXHJcbiAgICAgIC8vICAgLnRoZW4oYmxvYiA9PiB7XHJcbiAgICAgIC8vICAgICBmLiRuZXdGaWxlLm5hdGl2ZUZpbGUgPSBuZXcgRmlsZShbIGJsb2IgXSwgJ2Nyb3AucG5nJywge1xyXG4gICAgICAvLyAgICAgICB0eXBlOiAnaW1hZ2UvcG5nJ1xyXG4gICAgICAvLyAgICAgfSk7XHJcbiAgICAgIC8vICAgICBmLiRuZXdGaWxlLm5hbWUgPSAnY3JvcC5wbmcnO1xyXG4gICAgICAvLyAgICAgZi4kbmV3RmlsZS5zaXplID0gZi4kbmV3RmlsZS5uYXRpdmVGaWxlLnNpemU7XHJcbiAgICAgIC8vICAgICBmLiRuZXdGaWxlLnR5cGUgPSBmLiRuZXdGaWxlLm5hdGl2ZUZpbGUudHlwZTtcclxuICAgICAgLy8gICAgIHRoaXMuaW1hZ2VzRG9uZVtpZF0gPSB0cnVlO1xyXG4gICAgICAvLyAgICAgY29uc29sZS5sb2coZik7XHJcbiAgICAgIC8vICAgfSlcclxuICAgICAgY29uc3QgY3JvcHBlZEltYWdlID0gdGhpcy5jcm9wcGVkSW1hZ2VzW2lkXTtcclxuICAgICAgZi4kbmV3RmlsZS5uYXRpdmVGaWxlID0gbmV3IEZpbGUoWyBjcm9wcGVkSW1hZ2UuYmxvYiBdLCAnY3JvcC5wbmcnLCB7XHJcbiAgICAgICAgdHlwZTogJ2ltYWdlL3BuZydcclxuICAgICAgfSk7XHJcbiAgICAgIGYuJG5ld0ZpbGUubmFtZSA9ICdjcm9wLnBuZyc7XHJcbiAgICAgIGYuJG5ld0ZpbGUuc2l6ZSA9IGYuJG5ld0ZpbGUubmF0aXZlRmlsZS5zaXplO1xyXG4gICAgICBmLiRuZXdGaWxlLnR5cGUgPSBmLiRuZXdGaWxlLm5hdGl2ZUZpbGUudHlwZTtcclxuICAgICAgdGhpcy5pbWFnZXNEb25lW2lkXSA9IHRydWU7XHJcbiAgICAgIGNvbnNvbGUubG9nKGYpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwibGFiZWxcIiAqbmdJZj1cImxhYmVsXCI+XHJcbiAgPGRpdiBjbGFzcz1cInRleHQtY29udGFpbmVyXCIgW21hdFRvb2x0aXBdPVwicmVxdWlyZWQgPyB0cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3VpLmNvbnRyb2xzLnZhbGlkYXRpb24ucmVxdWlyZWQnKSA6IHVuZGVmaW5lZFwiIFttYXRUb29sdGlwUG9zaXRpb25dPVwiJ2Fib3ZlJ1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cInRleHRcIj57e2xhYmVsfX08L2Rpdj5cclxuICAgIDxkaXYgKm5nSWY9XCJyZXF1aXJlZFwiIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cImZpbGVzLWNvbnRhaW5lclwiIFtuZ0NsYXNzXT1cIntkcmFnZ2luZzogZHJhZ2dpbmcsIGRpc2FibGVkOiB1cGxvYWRpbmcgfHwgIWVkaXRhYmxlfVwiPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiZXhpc3RpbmctZmlsZXNcIj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZmlsZS1jb250YWluZXJcIiAqbmdGb3I9XCJsZXQgZiBvZiBmaWxlc1wiPlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImZpbGUtbWVudVwiIChjbGljayk9XCJ0b2dnbGVNZW51VmlzaWJpbGl0eShmKVwiICpuZ0lmPVwiIWN1c3RvbUZpbGVNZW51ICYmIGVkaXRhYmxlICYmICF1cGxvYWRpbmdcIj5cclxuICAgICAgICA8bWF0LWljb24+bWVudTwvbWF0LWljb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsZS1tZW51LWNvbnRhaW5lciBtYXQtZWxldmF0aW9uLXoyXCIgW25nQ2xhc3NdPVwie3Zpc2libGU6IGYgPT09IGZpbGVNZW51T3BlbmVkfVwiIChjbGljayk9XCJtZW51Q2xpY2soKVwiIChtb3VzZWxlYXZlKT1cIm1lbnVDbGljaygpXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtZW51VGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm1lbnUtaXRlbVwiPnt7IHRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgndWkuY29udHJvbHMudWktZmlsZS11cGxvYWRlci5tZW51LmNoYW5nZScpIH19XHJcbiAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cIiFyZWZyZXNoQWRkSW5wdXRcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgdHlwZT1cImZpbGVcIiBuZ0ZpbGVTZWxlY3QgW29wdGlvbnNdPVwidXBsb2FkT3B0aW9uc1wiIChjaGFuZ2UpPVwiZmlsZUNoYW5nZUV2ZW50KCRldmVudCwgZilcIlxyXG4gICAgICAgICAgICAgICAgICAgKHVwbG9hZE91dHB1dCk9XCJvblVwbG9hZE91dHB1dCgkZXZlbnQpXCIgW3VwbG9hZElucHV0XT1cInVwbG9hZElucHV0XCI+XHJcbiAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1lbnUtaXRlbVwiIChjbGljayk9XCJyZW1vdmUoZilcIj57eyB0cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3VpLmNvbnRyb2xzLnVpLWZpbGUtdXBsb2FkZXIubWVudS5kZWxldGUnKSB9fTwvZGl2PlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZW51VGVtcGxhdGVcIj5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJtZW51VGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2ZpbGVJbnB1dDogZmlsZUlucHV0fVwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2ZpbGVJbnB1dD5cclxuICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgdHlwZT1cImZpbGVcIiBuZ0ZpbGVTZWxlY3QgW29wdGlvbnNdPVwidXBsb2FkT3B0aW9uc1wiIChjaGFuZ2UpPVwiZmlsZUNoYW5nZUV2ZW50KCRldmVudCwgZilcIlxyXG4gICAgICAgICAgICAgICAgICh1cGxvYWRPdXRwdXQpPVwib25VcGxvYWRPdXRwdXQoJGV2ZW50KVwiIFt1cGxvYWRJbnB1dF09XCJ1cGxvYWRJbnB1dFwiPlxyXG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiY3JvcCAmJiAhY3JvcERvbmUoZilcIiAobW91c2VlbnRlcik9XCJzdGFydENyb3BQcmV2aWV3KGYuJG5ld0ZpbGUuaWQpXCIgKG1vdXNlbGVhdmUpPVwic3RvcENyb3BQcmV2aWV3KGYuJG5ld0ZpbGUuaWQpXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNyb3AtY29udGFpbmVyXCIgW25nU3R5bGVdPVwibmdBZGRTdHlsZVwiPlxyXG5cclxuICAgICAgICAgIDx1aS1maWxlICpuZ0lmPVwiZmFsc2UgJiYgZmlsZXMubGVuZ3RoID4gMCAmJiAhY3JvcFNvdXJjZUltYWdlc1wiIFtmaWxlU2l6ZV09XCJmaWxlU2l6ZVwiIFtzcmNEYXRhXT1cImZpbGVzWzBdLmN1c3RvbVwiIFtuZ0NsYXNzXT1cIntyb3VuZGVkOiBjcm9wUm91bmRlZH1cIj48L3VpLWZpbGU+XHJcblxyXG4gICAgICAgICAgPG1hdC1zcGlubmVyICpuZ0lmPVwiIWNyb3BwZXJJbWFnZUxvYWRlZFtmLiRuZXdGaWxlLmlkXSAmJiBjcm9wU291cmNlSW1hZ2VzW2YuJG5ld0ZpbGUuaWRdXCIgW2RpYW1ldGVyXT1cIjc1XCI+PC9tYXQtc3Bpbm5lcj5cclxuXHJcbiAgICAgICAgICA8aW1hZ2UtY3JvcHBlciAqbmdJZj1cImNyb3BTb3VyY2VJbWFnZXNbZi4kbmV3RmlsZS5pZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2ltYWdlRmlsZV09XCJjcm9wU291cmNlSW1hZ2VzW2YuJG5ld0ZpbGUuaWRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFttYWludGFpbkFzcGVjdFJhdGlvXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpb109XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbYXNwZWN0UmF0aW9dPVwiYXNwZWN0UmF0aW9cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc2l6ZVRvV2lkdGhdPVwiY3JvcE1heFdpZHRoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtvbmx5U2NhbGVEb3duXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtyb3VuZENyb3BwZXJdPVwiY3JvcFJvdW5kZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW2NhbnZhc1JvdGF0aW9uXT1cImNhbnZhc1JvdGF0aW9uW2YuJG5ld0ZpbGUuaWRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFt0cmFuc2Zvcm1dPVwidHJhbnNmb3JtW2YuJG5ld0ZpbGUuaWRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFthbGlnbkltYWdlXT1cIidjZW50ZXInXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5kaXNwbGF5XT1cInNob3dDcm9wcGVyID8gbnVsbCA6ICdub25lJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybWF0XT1cIidwbmcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgIChpbWFnZUNyb3BwZWQpPVwib25JbWFnZUNyb3BwZWQoJGV2ZW50LCBmLiRuZXdGaWxlLmlkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoaW1hZ2VMb2FkZWQpPVwiaW1hZ2VMb2FkZWQoZi4kbmV3RmlsZS5pZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGNyb3BwZXJSZWFkeSk9XCJjcm9wcGVyUmVhZHkoJGV2ZW50LCBmLiRuZXdGaWxlLmlkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAobG9hZEltYWdlRmFpbGVkKT1cImxvYWRJbWFnZUZhaWxlZCgpXCJcclxuICAgICAgICAgID48L2ltYWdlLWNyb3BwZXI+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNyb3AtcHJldmlldyBtYXQtZWxldmF0aW9uLXoyXCIgW2NsYXNzXT1cInByZXZpZXdQb3NpdGlvblwiICpuZ0lmPVwidHJ1ZSB8fCAoc2hvd0Nyb3BQcmV2aWV3W2YuJG5ld0ZpbGUuaWRdICYmIGNyb3BwZXJJbWFnZUxvYWRlZFtmLiRuZXdGaWxlLmlkXSlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNyb3AtbWVudVwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbiAoY2xpY2spPVwiem9vbUNyb3BwZWRJbWFnZSguMSwgZi4kbmV3RmlsZS5pZClcIj56b29tX2luPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8bWF0LWljb24gKGNsaWNrKT1cInpvb21Dcm9wcGVkSW1hZ2UoLSAuMSwgZi4kbmV3RmlsZS5pZClcIj56b29tX291dDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPG1hdC1pY29uIChjbGljayk9XCJyb3RhdGVDcm9wcGVkSW1hZ2UoLTEsIGYuJG5ld0ZpbGUuaWQpXCI+cm90YXRlX2xlZnQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbiAoY2xpY2spPVwicm90YXRlQ3JvcHBlZEltYWdlKDEsIGYuJG5ld0ZpbGUuaWQpXCI+cm90YXRlX3JpZ2h0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMSAxIDEwMCVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtZW51LWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj51cGxvYWRfZmlsZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIHR5cGU9XCJmaWxlXCIgbmdGaWxlU2VsZWN0IFtvcHRpb25zXT1cInVwbG9hZE9wdGlvbnNcIiAoY2hhbmdlKT1cImZpbGVDaGFuZ2VFdmVudCgkZXZlbnQsIGYpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAodXBsb2FkT3V0cHV0KT1cIm9uVXBsb2FkT3V0cHV0KCRldmVudClcIiBbdXBsb2FkSW5wdXRdPVwidXBsb2FkSW5wdXRcIj5cclxuICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbiAoY2xpY2spPVwicmVtb3ZlKGYpXCI+ZGVsZXRlX291dGxpbmU8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxIDEgMTAwJVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgIDxtYXQtaWNvbiAoY2xpY2spPVwiY3JvcHBlckRvbmUoZi4kbmV3RmlsZS5pZClcIj5kb25lPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJjcm9wcGVkSW1hZ2VzW2YuJG5ld0ZpbGUuaWRdXCIgW3NyY109XCJjcm9wcGVkSW1hZ2VzW2YuJG5ld0ZpbGUuaWRdLm9iamVjdFVybFwiIFtuZ0NsYXNzXT1cIntyb3VuZGVkOiBjcm9wUm91bmRlZH1cIi8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjcm9wIHx8IGNyb3BEb25lKGYpXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbGVUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZpbGVUZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ZmlsZTogZiwgZmlsZUlucHV0OiBmaWxlSW5wdXQyfVwiPjwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2ZpbGVJbnB1dDI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgdHlwZT1cImZpbGVcIiBuZ0ZpbGVTZWxlY3QgW29wdGlvbnNdPVwidXBsb2FkT3B0aW9uc1wiIChjaGFuZ2UpPVwiZmlsZUNoYW5nZUV2ZW50KCRldmVudCwgZilcIlxyXG4gICAgICAgICAgICAgICAgICAgKHVwbG9hZE91dHB1dCk9XCJvblVwbG9hZE91dHB1dCgkZXZlbnQpXCIgW3VwbG9hZElucHV0XT1cInVwbG9hZElucHV0XCI+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8dWktZmlsZSAqbmdJZj1cIiFmaWxlVGVtcGxhdGVcIiBbZmlsZVNpemVdPVwiZmlsZVNpemVcIiBbc3JjRGF0YV09XCJmLiRuZXdGaWxlID8gZi4kbmV3RmlsZTogZi5jdXN0b21cIiBbbmdDbGFzc109XCJ7cm91bmRlZDogY3JvcCAmJiBjcm9wUm91bmRlZH1cIj5cclxuICAgICAgICA8L3VpLWZpbGU+XHJcblxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmLiRuZXdGaWxlXCI+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZi4kbmV3RmlsZS5yZXNwb25zZVN0YXR1cyAmJiBmLiRuZXdGaWxlLnJlc3BvbnNlU3RhdHVzICE9PSAyMDBcIiBjbGFzcz1cInByb2dyZXNzLWNvbnRhaW5lciBlcnJvclwiPlxyXG4gICAgICAgICAgICB7eyB0cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3VpLmNvbnRyb2xzLnVpLWZpbGUtdXBsb2FkZXIudXBsb2FkRXJyb3InLCBmLiRuZXdGaWxlLnJlc3BvbnNlKSB9fVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWYuJG5ld0ZpbGUucmVzcG9uc2VTdGF0dXMgJiYgZi4kbmV3RmlsZS5wcm9ncmVzcy5zdGF0dXMgPT09IDFcIiBjbGFzcz1cInByb2dyZXNzLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3NcIiBbbmdTdHlsZV09XCJ7d2lkdGg6IGYuJG5ld0ZpbGUucHJvZ3Jlc3MuZGF0YS5wZXJjZW50YWdlICsgJyUnfVwiPjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiZmlsZS1jb250YWluZXIgYWRkXCIgbmdGaWxlRHJvcCAgW29wdGlvbnNdPVwidXBsb2FkT3B0aW9uc1wiICh1cGxvYWRPdXRwdXQpPVwib25VcGxvYWRPdXRwdXQoJGV2ZW50KVwiIFt1cGxvYWRJbnB1dF09XCJ1cGxvYWRJbnB1dFwiIFtuZ0NsYXNzXT1cInt2aXNpYmxlOiBmaWxlcy5sZW5ndGggPCBtYXhGaWxlcyB8fCBtYXhGaWxlcyA9PT0gMH1cIiBbbmdTdHlsZV09XCJhZGRGaWxlVGVtcGxhdGUgPyB7fSA6IG5nQWRkU3R5bGVcIj5cclxuICAgIDxsYWJlbD5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFkZEZpbGVUZW1wbGF0ZVwiPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJhZGRGaWxlVGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFhZGRGaWxlVGVtcGxhdGVcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidXBsb2FkLWltYWdlLWNvbnRhaW5lclwiPjwvZGl2PlxyXG4gICAgICAgIDxpbWcgW3NyY109XCJhZGRGaWxlSW1nU3JjXCIgW25nQ2xhc3NdPVwieyd3aXRoLWhpbnQnOiBhZGRIaW50fVwiIC8+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImFkZEhpbnRcIiBjbGFzcz1cImFkZC1oaW50XCI+e3thZGRIaW50fX08L2Rpdj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDxpbnB1dCBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgdHlwZT1cImZpbGVcIiBuZ0ZpbGVTZWxlY3QgW29wdGlvbnNdPVwidXBsb2FkT3B0aW9uc1wiICh1cGxvYWRPdXRwdXQpPVwib25VcGxvYWRPdXRwdXQoJGV2ZW50KVwiIFt1cGxvYWRJbnB1dF09XCJ1cGxvYWRJbnB1dFwiIFttdWx0aXBsZV09XCJtYXhGaWxlcyA9PT0gMCAmJiBtdWx0aXBsZVwiPlxyXG4gICAgPC9sYWJlbD5cclxuICA8L2Rpdj5cclxuXHJcbjwvZGl2PlxyXG4iXX0=
425
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktZmlsZS11cGxvYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2ZpbGUtdXBsb2FkZXIvdWktZmlsZS11cGxvYWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS9zcmMvbGliL2ZpbGUtdXBsb2FkZXIvdWktZmlsZS11cGxvYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixJQUFJLEVBQ0osTUFBTSxFQUNOLEtBQUssRUFHTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFFBQVEsRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQW9CLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFckUsT0FBTyxFQUdMLGNBQWMsRUFHZixNQUFNLDZCQUE2QixDQUFDO0FBRXJDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzFFLE9BQU8sRUFBdUIsbUJBQW1CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7Ozs7Ozs7Ozs7QUEwQjVGLE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxpQkFBaUI7SUFLNUQsSUFDSSxRQUFRLENBQUMsRUFBd0I7UUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxPQUFPLEVBQUUsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMzQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNQLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEdBQUcsRUFBRSxD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bUI7OzBCQUMxQixRQUFROzswQkFBSSxJQUFJOzswQkFBSSxRQUFRO3FFQWpGckMsUUFBUTtzQkFEWCxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFlaEIsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQWtCRyxlQUFlO3NCQUF2QixLQUFLO2dCQUVJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBIb3N0LFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE9wdGlvbmFsLFxyXG4gIE91dHB1dCxcclxuICBTa2lwU2VsZlxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sQ29udGFpbmVyLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVXBsb2FkZXJPcHRpb25zLCBVcGxvYWRGaWxlLCBVcGxvYWRJbnB1dCwgVXBsb2FkT3V0cHV0IH0gZnJvbSAnbmd4LXVwbG9hZGVyJztcclxuaW1wb3J0IHtcclxuICBJVWlGaWxlU2VydmljZSxcclxuICBJVWlGaWxlU2VydmljZU1lc3NhZ2VzLFxyXG4gIFVJX0ZJTEVTRVJWSUNFLFxyXG4gIFVpRmlsZVNlcnZpY2UsXHJcbiAgSVVpRmlsZVNpemVcclxufSBmcm9tICcuLi9zZXJ2aWNlcy91aS1maWxlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEaW1lbnNpb25zLCBJbWFnZUNyb3BwZWRFdmVudCwgSW1hZ2VUcmFuc2Zvcm0gfSBmcm9tICduZ3gtaW1hZ2UtY3JvcHBlcic7XHJcbmltcG9ydCB7IFVpU2ltcGxlQ29tcG9uZW50IH0gZnJvbSAnLi4vbGF5b3V0cy9zaW1wbGUvdWktc2ltcGxlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IElVaVRyYW5zbGF0ZVNlcnZpY2UsIFVJX1RSQU5TTEFURVNFUlZJQ0UgfSBmcm9tICcuLi9zZXJ2aWNlcy91aS10cmFuc2xhdGUuc2VydmljZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFVwbG9hZE91dHB1dEV4IGV4dGVuZHMgVXBsb2FkT3V0cHV0IHtcclxuICBmaWxlOiBVcGxvYWRGaWxlRXg7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVXBsb2FkRmlsZUV4IGV4dGVuZHMgVXBsb2FkRmlsZSB7XHJcbiAgaW1hZ2VQcmV2aWV3PzogYW55O1xyXG4gIGJhc2U2ND86IGFueTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJVWlVcGxvYWRlclVzZXJNZXNzYWdlIHtcclxuICBtZXNzYWdlOiBJVWlGaWxlU2VydmljZU1lc3NhZ2VzLFxyXG4gIGRhdGE6IGFueVxyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3VpLWZpbGUtdXBsb2FkZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi91aS1maWxlLXVwbG9hZGVyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsgJy4vdWktZmlsZS11cGxvYWRlci5jb21wb25lbnQuc2NzcyddLFxyXG4gIHByb3ZpZGVyczogW3tcclxuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgbXVsdGk6IHRydWUsXHJcbiAgICB1c2VFeGlzdGluZzogVWlGaWxlVXBsb2FkZXJDb21wb25lbnQsXHJcbiAgfV1cclxufSlcclxuZXhwb3J0IGNsYXNzIFVpRmlsZVVwbG9hZGVyQ29tcG9uZW50IGV4dGVuZHMgVWlTaW1wbGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gIHByaXZhdGUgdWlGaWxlU2l6ZTogSVVpRmlsZVNpemU7XHJcbiAgX2ZpbGVTaXplOiBzdHJpbmcgfCBJVWlGaWxlU2l6ZTtcclxuXHJcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcclxuICBzZXQgZmlsZVNpemUoZnM6IHN0cmluZyB8IElVaUZpbGVTaXplKSB7XHJcbiAgICB0aGlzLl9maWxlU2l6ZSA9IGZzO1xyXG4gICAgaWYgKHR5cGVvZiBmcyA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgY29uc3QgZiA9IHRoaXMuZmlsZVNlcnZpY2VDb25maWcuaW1hZ2VTaXplcy5maW5kKG4gPT4gbi5uYW1lID09PSBmcyk7XHJcbiAgICAgIGlmICghZikge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ01pc3NpbmcgZmlsZXNpemUgZm9yICcgKyBmcyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy51aUZpbGVTaXplID0gZjtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy51aUZpbGVTaXplID0gZnM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBtYXhGaWxlcyA9IDE7XHJcbiAgQElucHV0KCkgbXVsdGlwbGUgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGNyb3AgPSBmYWxzZTtcclxuICBASW5wdXQoKSBjcm9wUm91bmRlZCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGNyb3BNYXhXaWR0aDtcclxuICBASW5wdXQoKSBjdXN0b21GaWxlTWVudSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGFkZEhpbnQ7XHJcbiAgQElucHV0KCkgbmV3RmlsZVBvc2l0aW9uOiAnZmlyc3QnIHwgJ2xhc3QnID0gJ2xhc3QnO1xyXG5cclxuICBASW5wdXQoKSB0ZW1wbGF0ZXM6IHsgbWVudVRlbXBsYXRlPzogYW55LCBhZGRGaWxlVGVtcGxhdGU/OiBhbnksIGZpbGVUZW1wbGF0ZT86IGFueSwgY3VzdG9tQ29udGVudFRlbXBsYXRlPzogYW55IH0gPSB7fVxyXG5cclxuICBnZXQgbWVudVRlbXBsYXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVzPy5tZW51VGVtcGxhdGU7XHJcbiAgfVxyXG5cclxuICBnZXQgYWRkRmlsZVRlbXBsYXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVzPy5hZGRGaWxlVGVtcGxhdGU7XHJcbiAgfVxyXG5cclxuICBnZXQgY3VzdG9tQ29udGVudFRlbXBsYXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVzPy5jdXN0b21Db250ZW50VGVtcGxhdGU7XHJcbiAgfVxyXG5cclxuICBnZXQgZmlsZVRlbXBsYXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGVzPy5maWxlVGVtcGxhdGU7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBwcmV2aWV3UG9zaXRpb246ICdsZWZ0JyB8ICdib3R0b20nIHwgJ2Fib3ZlJyA9ICdib3R0b20nO1xyXG5cclxuICBAT3V0cHV0KCkgaW1hZ2VDcm9wcGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBmaWxlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPElVaVVwbG9hZGVyVXNlck1lc3NhZ2U+KCk7XHJcblxyXG4gIHVwbG9hZE9wdGlvbnM6IFVwbG9hZGVyT3B0aW9ucyA9IHtcclxuICAgIGNvbmN1cnJlbmN5OiB0aGlzLmZpbGVTZXJ2aWNlQ29uZmlnLmNvbmN1cnJlbnRVcGxvYWRzXHJcbiAgfTtcclxuXHJcbiAgcHVibGljIHVwbG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICBjaGFuZ2VGaWxlSW5kZXg7XHJcblxyXG4gIHNob3dDcm9wcGVyID0gZmFsc2U7XHJcbiAgbWVudVZpc2libGU6IGFueTtcclxuICBzaG93Q3JvcFByZXZpZXcgPSB7fTtcclxuICBjcm9wUHJldmlld1RpbWVvdXRzID0ge307XHJcbiAgY3JvcFNvdXJjZUltYWdlcyA9IHt9O1xyXG4gIGNyb3BwZXJJbWFnZUxvYWRlZCA9IHt9O1xyXG4gIGltYWdlc0RvbmUgPSB7fTtcclxuICB0cmFuc2Zvcm06IEltYWdlVHJhbnNmb3JtID0ge307XHJcbiAgY2FudmFzUm90YXRpb24gPSB7fVxyXG5cclxuICBwdWJsaWMgZmlsZXMgOiB7IGN1c3RvbT86IGFueSwgJG5ld0ZpbGU/OiBVcGxvYWRGaWxlIH1bXTtcclxuXHJcbiAgcHVibGljIHJlc3BvbnNlRmlsZXM7XHJcblxyXG4gIHJlZnJlc2hBZGRJbnB1dCA9IGZhbHNlO1xyXG5cclxuICBmaWxlTWVudU9wZW5lZDtcclxuXHJcbiAgcGF0Y2hpbmdWYWx1ZXMgPSBmYWxzZTtcclxuXHJcbiAgaW5wdXRBcnJheSA9IGZhbHNlO1xyXG4gIGRyYWdnaW5nID0gZmFsc2U7XHJcblxyXG4gIHVwbG9hZGVySWQgPSBNYXRoLnJvdW5kKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKTtcclxuXHJcbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEluamVjdChVSV9GSUxFU0VSVklDRSkgcHJpdmF0ZSBmaWxlU2VydmljZUNvbmZpZzogSVVpRmlsZVNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgQEluamVjdChVSV9UUkFOU0xBVEVTRVJWSUNFKSBwdWJsaWMgdHJhbnNsYXRlU2VydmljZTogSVVpVHJhbnNsYXRlU2VydmljZSxcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASG9zdCgpIEBTa2lwU2VsZigpIHByb3RlY3RlZCBjb250cm9sQ29udGFpbmVyOiBDb250cm9sQ29udGFpbmVyLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgZmlsZVNlcnZpY2U6IFVpRmlsZVNlcnZpY2UpIHtcclxuXHJcbiAgICBzdXBlcihudWxsLCBjb250cm9sQ29udGFpbmVyKTtcclxuXHJcbiAgICB0aGlzLmZpbGVTZXJ2aWNlLnVwbG9hZFN1YnNjcmlwdGlvbi5uZXh0KHthY3Rpb246ICdyZWdpc3RlcicsIGRhdGE6IHRoaXN9KTtcclxuXHJcbiAgICB0aGlzLmZpbGVTZXJ2aWNlLnVwbG9hZFN1YnNjcmlwdGlvbi5zdWJzY3JpYmUoKHY6IGFueSkgPT4ge1xyXG4gICAgICBzd2l0Y2ggKHYuYWN0aW9uKSB7XHJcbiAgICAgICAgY2FzZSAndXBsb2FkU3RhcnRlZCc6IHRoaXMudXBsb2FkaW5nID0gdHJ1ZTsgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAndXBsb2FkRmFpbGVkJzpcclxuICAgICAgICBjYXNlICd1cGxvYWRTdWNjZXNzJzpcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnVwbG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICB0aGlzLnBhdGNoVmFsdWVzKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHVwbG9hZElucHV0KCk6IEV2ZW50RW1pdHRlcjxVcGxvYWRJbnB1dD4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsZVNlcnZpY2UudXBsb2FkSW5wdXQ7XHJcbiAgfVxyXG5cclxuICBjcm9wcGVkSW1hZ2VzID0ge307XHJcblxyXG4gIGdldCBlZGl0YWJsZSgpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudEZvcm1Db250cm9sLmVuYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBnZXQgbmdBZGRTdHlsZSgpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHdpZHRoOiBNYXRoLmFicyh0aGlzLnVpRmlsZVNpemUud2lkdGgpICsgJ3B4JyxcclxuICAgICAgaGVpZ2h0OiBNYXRoLmFicyh0aGlzLnVpRmlsZVNpemUuaGVpZ2h0KSArICdweCcsXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgYXNwZWN0UmF0aW8oKSB7XHJcbiAgICByZXR1cm4gdGhpcy51aUZpbGVTaXplLndpZHRoIC8gdGhpcy51aUZpbGVTaXplLmhlaWdodDtcclxuICB9XHJcblxyXG4gIGdldCBhZGRGaWxlSW1nU3JjKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZmlsZVNlcnZpY2VDb25maWcuYWRkRmlsZUltZ1NyYztcclxuICB9XHJcblxyXG4gIGNyb3BEb25lKGYpIHtcclxuICAgIHJldHVybiAhZi4kbmV3RmlsZSB8fCB0aGlzLmltYWdlc0RvbmVbZi4kbmV3RmlsZS5pZF07XHJcbiAgfVxyXG5cclxuICAvLyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAvLyAgIHN1cGVyLm5nT25Jbml0KCk7XHJcbiAgLy8gfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZmlsZVNlcnZpY2UudXBsb2FkU3Vic2NyaXB0aW9uLm5leHQoe2FjdGlvbjogJ2Rlc3Ryb3knLCBkYXRhOiB0aGlzfSk7XHJcbiAgfVxyXG5cclxuICByZW1vdmUoZjogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoZi4kbmV3RmlsZSkge1xyXG4gICAgICB0aGlzLnVwbG9hZElucHV0LmVtaXQoe3R5cGU6ICdyZW1vdmUnLCBpZDogZi4kbmV3RmlsZS5pZH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5maWxlcy5zcGxpY2UodGhpcy5maWxlcy5pbmRleE9mKGYpLCAxKTtcclxuICAgIHRoaXMucHJlcGFyZVJlc3BvbnNlKCk7XHJcbiAgICAvLyB0aGlzLm9uQ2hhbmdlKHRoaXMuaW5wdXRBcnJheSA/IHRoaXMuZmlsZXMgOiAodGhpcy5maWxlcy5sZW5ndGggPiAwID8gdGhpcy5maWxlc1swXSA6IG51bGwpKTtcclxuICAgIHRoaXMuZmlsZUV2ZW50LmVtaXQoeyBtZXNzYWdlOiAnZmlsZVJlbW92ZWQnLCBkYXRhOiBmIH0pO1xyXG4vLyAgICAgdGhpcy5wYXRjaFZhbHVlcygpO1xyXG4gIH1cclxuXHJcbiAgcGF0Y2hWYWx1ZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnBhdGNoaW5nVmFsdWVzID0gdHJ1ZTtcclxuICAgIC8vIGlmICh0aGlzLmlucHV0QXJyYXkpIHtcclxuICAgIC8vICAgdGhpcy5jb21wb25lbnRGb3JtQ29udHJvbC5zZXRWYWx1ZSh0aGlzLmZpbGVzLm1hcChmID0+IGYuY3VzdG9tKSk7XHJcbiAgICAvLyB9IGVsc2Uge1xyXG4gICAgLy8gICB0aGlzLmNvbXBvbmVudEZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMuZmlsZXMubGVuZ3RoID09PSAwID8gbnVsbCA6IHRoaXMuZmlsZXNbMF0uY3VzdG9tKTtcclxuICAgIC8vIH1cclxuICAgIHRoaXMucGF0Y2hpbmdWYWx1ZXMgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGdldCBoYXNGaWxlc1RvVXBsb2FkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhdGhpcy5maWxlcy5maW5kKGYgPT4gZi4kbmV3RmlsZSAmJiBmLiRuZXdGaWxlLnByb2dyZXNzLnN0YXR1cyAhPT0gMik7XHJcbiAgfVxyXG5cclxuICBjYW5JbWFnZVByZXZpZXcodHlwZTogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKSB8fCB0eXBlLnN0YXJ0c1dpdGgoJ3ZpZGVvLycpO1xyXG4gIH1cclxuXHJcbiAgb25VcGxvYWRPdXRwdXQoJGV2ZW50OiBVcGxvYWRPdXRwdXQsIHNraXBDdXN0b21WYWxpZGF0aW9uID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIC8vIGNvbnNvbGUubG9nKCRldmVudCk7XHJcbiAgICBzd2l0Y2ggKCRldmVudC50eXBlKSB7XHJcbiAgICAgIGNhc2UgJ3N0YXJ0JzpcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ2RyYWdPdmVyJzpcclxuICAgICAgICB0aGlzLmRyYWdnaW5nID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnZHJhZ091dCc6XHJcbiAgICAgIGNhc2UgJ2Ryb3AnOlxyXG4gICAgICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ2FkZGVkVG9RdWV1ZSc6XHJcbiAgICAgICAgaWYgKHRoaXMuY3JvcCAmJiAhJGV2ZW50LmZpbGUudHlwZS5zdGFydHNXaXRoKCdpbWFnZS8nKSkge1xyXG4gICAgICAgICAgdGhpcy51cGxvYWRJbnB1dC5lbWl0KHsgdHlwZTogJ3JlbW92ZScsIGlkOiAkZXZlbnQuZmlsZS5pZCB9KTtcclxuICAgICAgICAgIHRoaXMuZmlsZUV2ZW50LmVtaXQoeyBtZXNzYWdlOiAnY3JvcEludmFsaWRGaWxlVHlwZScsIGRhdGE6ICRldmVudC5maWxlIH0pO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFza2lwQ3VzdG9tVmFsaWRhdGlvbiAmJiB0aGlzLmZpbGVTZXJ2aWNlQ29uZmlnLmZpbGVWYWxpZGF0aW9uKSB7XHJcbiAgICAgICAgICB0aGlzLmZpbGVTZXJ2aWNlQ29uZmlnLmZpbGVWYWxpZGF0aW9uKHRoaXMudWlGaWxlU2l6ZSwgJGV2ZW50LmZpbGUpLnRoZW4odmFsaWQgPT4ge1xyXG4gICAgICAgICAgICBpZiAodmFsaWQpIHtcclxuICAgICAgICAgICAgICB0aGlzLm9uVXBsb2FkT3V0cHV0KCRldmVudCwgdHJ1ZSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLnVwbG9hZElucHV0LmVtaXQoeyB0eXBlOiAncmVtb3ZlJywgaWQ6ICRldmVudC5maWxlLmlkIH0pO1xyXG4gICAgICAgICAgICAgIC8vIHRoaXMuZmlsZUV2ZW50LmVtaXQoeyBtZXNzYWdlOiAnY3JvcEludmFsaWRGaWxlVHlwZScsIGRhdGE6ICRldmVudC5maWxlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBsZXQgZjtcclxuICAgICAgICAgIGlmICh0aGlzLmNoYW5nZUZpbGVJbmRleCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGYgPSB0aGlzLmZpbGVzW3RoaXMuY2hhbmdlRmlsZUluZGV4XTtcclxuICAgICAgICAgICAgaWYgKGYuJG5ld0ZpbGUpIHtcclxuICAgICAgICAgICAgICB0aGlzLnVwbG9hZElucHV0LmVtaXQoeyB0eXBlOiAncmVtb3ZlJywgaWQ6IGYuJG5ld0ZpbGUuaWQgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZi4kbmV3RmlsZSA9ICRldmVudC5maWxlO1xyXG4gICAgICAgICAgICBmLmN1c3RvbSA9ICRldmVudC5maWxlO1xyXG4gICAgICAgICAgICB0aGlzLmNoYW5nZUZpbGVJbmRleCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGYgPSB7IGN1c3RvbTogJGV2ZW50LmZpbGUsICRuZXdGaWxlOiAkZXZlbnQuZmlsZSB9O1xyXG4gICAgICAgICAgICBpZiAodGhpcy5uZXdGaWxlUG9zaXRpb24gPT09ICdsYXN0Jykge1xyXG4gICAgICAgICAgICAgIHRoaXMuZmlsZXMucHVzaChmKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLmZpbGVzLnVuc2hpZnQoZik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0aGlzLmNhbkltYWdlUHJldmlldygkZXZlbnQuZmlsZS50eXBlKSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5jcm9wKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYW52YXNSb3RhdGlvblskZXZlbnQuZmlsZS5pZF0gPSAwO1xyXG4gICAgICAgICAgICAgIHRoaXMuY3JvcFNvdXJjZUltYWdlc1skZXZlbnQuZmlsZS5pZF0gPSAkZXZlbnQuZmlsZS5uYXRpdmVGaWxlO1xyXG4gICAgICAgICAgICAgIHRoaXMuY3JvcHBlckltYWdlTG9hZGVkWyRldmVudC5maWxlLmlkXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnByZXBhcmVSZXNwb25zZSgpO1xyXG4gICAgICAgICAgdGhpcy5maWxlRXZlbnQuZW1pdCh7IG1lc3NhZ2U6ICdmaWxlQWRkZWQnLCBkYXRhOiBmIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ2RvbmUnOlxyXG4gICAgICAgIGNvbnN0IGRmID0gdGhpcy5maWxlcy5maW5kKGYgPT4gZi4kbmV3RmlsZSA9PT0gJGV2ZW50LmZpbGUpO1xyXG4gICAgICAgIGlmIChkZikge1xyXG4gICAgICAgICAgaWYgKGRmLiRuZXdGaWxlLnJlc3BvbnNlU3RhdHVzID09PSAyMDApIHtcclxuICAgICAgICAgICAgdGhpcy5maWxlc1t0aGlzLmZpbGVzLmluZGV4T2YoZGYpXS5jdXN0b20gPSBkZi4kbmV3RmlsZS5yZXNwb25zZTtcclxuICAgICAgICAgICAgZGYuJG5ld0ZpbGUgPSBudWxsO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2Vycm9yIG9uIHVwbG9hZCcsIGRmLiRldmVudCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5oYXNGaWxlc1RvVXBsb2FkKSB7XHJcbiAgICAgICAgICB0aGlzLnByZXBhcmVSZXNwb25zZShmYWxzZSk7XHJcbiAgICAgICAgICB0aGlzLmZpbGVTZXJ2aWNlLnVwbG9hZFN1YnNjcmlwdGlvbi5uZXh0KHtcclxuICAgICAgICAgICAgYWN0aW9uOiB0aGlzLmZpbGVzLmZpbmQoZiA9PiAhIWYuJG5ld0ZpbGUpID8gJ3VwbG9hZENvbnRyb2xGYWlsZWQnIDogJ3VwbG9hZENvbnRyb2xTdWNjZXNzJ1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJlcGFyZVJlc3BvbnNlKGRvZW1pdCA9IHRydWUpIHtcclxuICAgIGlmICh0aGlzLmlucHV0QXJyYXkpIHtcclxuICAgICAgaWYgKCF0aGlzLnJlc3BvbnNlRmlsZXMpIHtcclxuICAgICAgICB0aGlzLnJlc3BvbnNlRmlsZXMgPSBbXTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnJlc3BvbnNlRmlsZXMubGVuZ3RoID0gMDtcclxuICAgICAgdGhpcy5maWxlcy5mb3JFYWNoKGYgPT4gdGhpcy5yZXNwb25zZUZpbGVzLnB1c2goey4uLmYuY3VzdG9tLCAkbmV3RmlsZTogZi4kbmV3RmlsZX0pKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLmZpbGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2VGaWxlcyA9IG51bGw7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJlc3BvbnNlRmlsZXMpIHtcclxuICAgICAgICAgIHRoaXMucmVzcG9uc2VGaWxlcyA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZpbGVzWzBdLmN1c3RvbSkuZm9yRWFjaChrID0+IHtcclxuICAgICAgICAgIHRoaXMucmVzcG9uc2VGaWxlc1trXSA9IHRoaXMuZmlsZXNbMF0uY3VzdG9tW2tdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucmVzcG9uc2VGaWxlcy4kbmV3RmlsZSA9IHRoaXMuZmlsZXNbMF0uJG5ld0ZpbGU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmIChkb2VtaXQpIHtcclxuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnJlc3BvbnNlRmlsZXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNvbnNvbGUubG9nKCdlbWl0JywgdGhpcy5maWxlc1sxXSwgeyAuLi50aGlzLmZpbGVzWzFdLmN1c3RvbSwgJG5ld0ZpbGU6IHRoaXMuZmlsZXNbMV0uJG5ld0ZpbGUgfSk7XHJcbiAgICAvLyB0aGlzLm9uQ2hhbmdlKHRoaXMuaW5wdXRBcnJheSA/XHJcbiAgICAvLyAgIHRoaXMuZmlsZXMubWFwKGYgPT4gKHsgLi4uZi5jdXN0b20sICRuZXdGaWxlOiBmLiRuZXdGaWxlfSkpIDpcclxuICAgIC8vICAgKHRoaXMuZmlsZXMubGVuZ3RoID4gMCA/IHsgLi4udGhpcy5maWxlc1swXS5jdXN0b20sICRuZXdGaWxlOiB0aGlzLmZpbGVzWzBdLiRuZXdGaWxlIH0gOiBudWxsKSk7XHJcbiAgICAvLyB0aGlzLm9uQ2hhbmdlKHRoaXMuaW5wdXRBcnJheSA/XHJcbiAgICAvLyAgIHRoaXMuZmlsZXMgOlxyXG4gICAgLy8gICAodGhpcy5maWxlcy5sZW5ndGggPiAwID8gdGhpcy5maWxlc1swXSA6IG51bGwpKTtcclxuICB9XHJcblxyXG4gIGJlZm9yZVNhdmUoKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlcykgPT4ge1xyXG4gICAgICB0aGlzLmZpbGVzLmZvckVhY2goZiA9PiB7XHJcbiAgICAgICAgaWYgKGYuJG5ld0ZpbGUgJiYgZi4kbmV3RmlsZS5wcm9ncmVzcy5zdGF0dXMgPT09IDIpIHtcclxuICAgICAgICAgIGYuJG5ld0ZpbGUucHJvZ3Jlc3Muc3RhdHVzID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY3JvcCAmJiBmLiRuZXdGaWxlICYmICF0aGlzLmltYWdlc0RvbmVbZi4kbmV3RmlsZS5pZF0pIHtcclxuICAgICAgICAgIHRoaXMuY3JvcHBlckRvbmUoZi4kbmV3RmlsZS5pZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICByZXMoJ2RvbmUnKTtcclxuICAgICAgfSwgMjUwKTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBmaWxlQ2hhbmdlRXZlbnQoZXZlbnQ6IGFueSwgZjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmNoYW5nZUZpbGVJbmRleCA9IHRoaXMuZmlsZXMuaW5kZXhPZihmKTtcclxuICB9XHJcblxyXG4gIHN0YXJ0Q3JvcFByZXZpZXcoaWQpIHtcclxuICAgIGNsZWFyVGltZW91dCh0aGlzLmNyb3BQcmV2aWV3VGltZW91dHNbaWRdKTtcclxuICAgIHRoaXMuc2hvd0Nyb3BQcmV2aWV3W2lkXSA9ICEhdGhpcy5jcm9wU291cmNlSW1hZ2VzW2lkXTtcclxuICB9XHJcblxyXG4gIHN0b3BDcm9wUHJldmlldyhpZCkge1xyXG4gICAgdGhpcy5jcm9wUHJldmlld1RpbWVvdXRzW2lkXSA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnNob3dDcm9wUHJldmlld1tpZF0gPSBmYWxzZTtcclxuICAgIH0sIDI1MCk7XHJcbiAgfVxyXG5cclxuICB6b29tQ3JvcHBlZEltYWdlKGRpciwgaWQpIHtcclxuICAgIGxldCBzY2FsZSA9IHRoaXMudHJhbnNmb3JtW2lkXS5zY2FsZTtcclxuICAgIHNjYWxlICs9IGRpcjtcclxuICAgIGlmIChzY2FsZSA8IDAuMSkge1xyXG4gICAgICBzY2FsZSA9IDAuMTtcclxuICAgIH1cclxuICAgIHRoaXMudHJhbnNmb3JtW2lkXSA9IHtcclxuICAgICAgLi4udGhpcy50cmFuc2Zvcm1baWRdLFxyXG4gICAgICBzY2FsZVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHJvdGF0ZUNyb3BwZWRJbWFnZShkaXIsIGlkKSB7XHJcbiAgICB0aGlzLmNhbnZhc1JvdGF0aW9uW2lkXSArPSBkaXI7XHJcbiAgICBjb25zdCBmbGlwcGVkSCA9IHRoaXMudHJhbnNmb3JtW2lkXS5mbGlwSDtcclxuICAgIGNvbnN0IGZsaXBwZWRWID0gdGhpcy50cmFuc2Zvcm1baWRdLmZsaXBWO1xyXG4gICAgdGhpcy50cmFuc2Zvcm1baWRdID0ge1xyXG4gICAgICAuLi50aGlzLnRyYW5zZm9ybVtpZF0sXHJcbiAgICAgIGZsaXBIOiBmbGlwcGVkVixcclxuICAgICAgZmxpcFY6IGZsaXBwZWRIXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgb25JbWFnZUNyb3BwZWQoZXZlbnQ6IEltYWdlQ3JvcHBlZEV2ZW50LCBpZCkge1xyXG4gICAgdGhpcy5jcm9wcGVkSW1hZ2VzW2lkXSA9IGV2ZW50O1xyXG4gICAgdGhpcy5pbWFnZUNyb3BwZWQuZW1pdChldmVudCk7XHJcbiAgfVxyXG5cclxuICBpbWFnZUxvYWRlZChpZCkge1xyXG4gICAgdGhpcy5zaG93Q3JvcHBlciA9IHRydWU7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy50cmFuc2Zvcm1baWRdID0ge1xyXG4gICAgICAgIHNjYWxlOiAxXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNyb3BwZXJSZWFkeShzb3VyY2VJbWFnZURpbWVuc2lvbnM6IERpbWVuc2lvbnMsIGlkKSB7XHJcbiAgICB0aGlzLmNyb3BwZXJJbWFnZUxvYWRlZFtpZF0gPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgbG9hZEltYWdlRmFpbGVkKCkge1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlTWVudVZpc2liaWxpdHkoZikge1xyXG4gICAgdGhpcy5maWxlTWVudU9wZW5lZCA9IGY7XHJcbiAgfVxyXG5cclxuICBtZW51Q2xpY2soKSB7XHJcbiAgICB0aGlzLmZpbGVNZW51T3BlbmVkID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcblxyXG4gIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5wdXRBcnJheSA9IG9iaiBpbnN0YW5jZW9mIEFycmF5O1xyXG4gICAgaWYgKHRoaXMuaW5wdXRBcnJheSkge1xyXG4gICAgICB0aGlzLmZpbGVzID0gb2JqLm1hcChmID0+ICh7IGN1c3RvbTogZiwgJG5ld0ZpbGU6IG51bGwgfSkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5maWxlcyA9IG9iaiA/IFsgeyBjdXN0b206b2JqLCAkbmV3RmlsZTogbnVsbH0gXSA6IFtdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jcm9wU291cmNlSW1hZ2VzID0ge307XHJcbiAgfVxyXG5cclxuICBjcm9wcGVyRG9uZShpZCkge1xyXG4gICAgY29uc3QgZiA9IHRoaXMuZmlsZXMuZmluZChmeCA9PiBmeC4kbmV3RmlsZSAmJiBmeC4kbmV3RmlsZS5pZCA9PT0gaWQpO1xyXG4gICAgaWYgKGYpIHtcclxuICAgICAgLy8gY29uc3QgdXJsID0gdGhpcy5jcm9wcGVkSW1hZ2VzW2lkXTtcclxuICAgICAgLy8gY29uc29sZS5sb2codXJsKTtcclxuICAgICAgLy8gZmV0Y2godXJsKVxyXG4gICAgICAvLyAgIC50aGVuKHJlcyA9PiByZXMuYmxvYigpKVxyXG4gICAgICAvLyAgIC50aGVuKGJsb2IgPT4ge1xyXG4gICAgICAvLyAgICAgZi4kbmV3RmlsZS5uYXRpdmVGaWxlID0gbmV3IEZpbGUoWyBibG9iIF0sICdjcm9wLnBuZycsIHtcclxuICAgICAgLy8gICAgICAgdHlwZTogJ2ltYWdlL3BuZydcclxuICAgICAgLy8gICAgIH0pO1xyXG4gICAgICAvLyAgICAgZi4kbmV3RmlsZS5uYW1lID0gJ2Nyb3AucG5nJztcclxuICAgICAgLy8gICAgIGYuJG5ld0ZpbGUuc2l6ZSA9IGYuJG5ld0ZpbGUubmF0aXZlRmlsZS5zaXplO1xyXG4gICAgICAvLyAgICAgZi4kbmV3RmlsZS50eXBlID0gZi4kbmV3RmlsZS5uYXRpdmVGaWxlLnR5cGU7XHJcbiAgICAgIC8vICAgICB0aGlzLmltYWdlc0RvbmVbaWRdID0gdHJ1ZTtcclxuICAgICAgLy8gICAgIGNvbnNvbGUubG9nKGYpO1xyXG4gICAgICAvLyAgIH0pXHJcbiAgICAgIGNvbnN0IGNyb3BwZWRJbWFnZSA9IHRoaXMuY3JvcHBlZEltYWdlc1tpZF07XHJcbiAgICAgIGYuJG5ld0ZpbGUubmF0aXZlRmlsZSA9IG5ldyBGaWxlKFsgY3JvcHBlZEltYWdlLmJsb2IgXSwgJ2Nyb3AucG5nJywge1xyXG4gICAgICAgIHR5cGU6ICdpbWFnZS9wbmcnXHJcbiAgICAgIH0pO1xyXG4gICAgICBmLiRuZXdGaWxlLm5hbWUgPSAnY3JvcC5wbmcnO1xyXG4gICAgICBmLiRuZXdGaWxlLnNpemUgPSBmLiRuZXdGaWxlLm5hdGl2ZUZpbGUuc2l6ZTtcclxuICAgICAgZi4kbmV3RmlsZS50eXBlID0gZi4kbmV3RmlsZS5uYXRpdmVGaWxlLnR5cGU7XHJcbiAgICAgIHRoaXMuaW1hZ2VzRG9uZVtpZF0gPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBsb2FkSW1nU3JjKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuYWRkRmlsZUltZ1NyYyh0aGlzLnVpRmlsZVNpemUpXHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJsYWJlbFwiICpuZ0lmPVwibGFiZWxcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNvbnRhaW5lclwiXHJcbiAgICAgICAgIFttYXRUb29sdGlwXT1cInJlcXVpcmVkID8gdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCd1aS5jb250cm9scy52YWxpZGF0aW9uLnJlcXVpcmVkJykgOiB1bmRlZmluZWRcIlxyXG4gICAgICAgICBbbWF0VG9vbHRpcFBvc2l0aW9uXT1cIidhYm92ZSdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dFwiPnt7IGxhYmVsIH19PC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInJlcXVpcmVkXCIgY2xhc3M9XCJyZXF1aXJlZFwiPio8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJmaWxlcy1jb250YWluZXJcIiBbbmdDbGFzc109XCJ7ZHJhZ2dpbmc6IGRyYWdnaW5nLCBkaXNhYmxlZDogdXBsb2FkaW5nIHx8ICFlZGl0YWJsZX1cIj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZXhpc3RpbmctZmlsZXNcIj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZpbGUtY29udGFpbmVyXCIgKm5nRm9yPVwibGV0IGYgb2YgZmlsZXNcIj5cclxuXHJcbiAgICAgICAgICAgIEBpZiAoY3VzdG9tQ29udGVudFRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwiY3VzdG9tQ29udGVudFRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntmaWxlVXBsb2FkZXI6IHRoaXMsIGZpbGU6IGZ9XCI+PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGUtbWVudVwiIChjbGljayk9XCJ0b2dnbGVNZW51VmlzaWJpbGl0eShmKVwiICpuZ0lmPVwiIWN1c3RvbUZpbGVNZW51ICYmIGVkaXRhYmxlICYmICF1cGxvYWRpbmdcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5tZW51PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlLW1lbnUtY29udGFpbmVyIG1hdC1lbGV2YXRpb24tejJcIiBbbmdDbGFzc109XCJ7dmlzaWJsZTogZiA9PT0gZmlsZU1lbnVPcGVuZWR9XCJcclxuICAgICAgICAgICAgICAgICAoY2xpY2spPVwibWVudUNsaWNrKClcIiAobW91c2VsZWF2ZSk9XCJtZW51Q2xpY2soKVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtZW51VGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJtZW51LWl0ZW1cIj57eyB0cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3VpLmNvbnRyb2xzLnVpLWZpbGUtdXBsb2FkZXIubWVudS5jaGFuZ2UnKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKm5nSWY9XCIhcmVmcmVzaEFkZElucHV0XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIHR5cGU9XCJmaWxlXCIgbmdGaWxlU2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJ1cGxvYWRPcHRpb25zXCIgKGNoYW5nZSk9XCJmaWxlQ2hhbmdlRXZlbnQoJGV2ZW50LCBmKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXBsb2FkT3V0cHV0KT1cIm9uVXBsb2FkT3V0cHV0KCRldmVudClcIiBbdXBsb2FkSW5wdXRdPVwidXBsb2FkSW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZW51LWl0ZW1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZShmKVwiPnt7IHRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgndWkuY29udHJvbHMudWktZmlsZS11cGxvYWRlci5tZW51LmRlbGV0ZScpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtZW51VGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibWVudVRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntmaWxlSW5wdXQ6IGZpbGVJbnB1dH1cIj48L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZmlsZUlucHV0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIHR5cGU9XCJmaWxlXCIgbmdGaWxlU2VsZWN0IFtvcHRpb25zXT1cInVwbG9hZE9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJmaWxlQ2hhbmdlRXZlbnQoJGV2ZW50LCBmKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXBsb2FkT3V0cHV0KT1cIm9uVXBsb2FkT3V0cHV0KCRldmVudClcIiBbdXBsb2FkSW5wdXRdPVwidXBsb2FkSW5wdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNyb3AgJiYgIWNyb3BEb25lKGYpXCIgKG1vdXNlZW50ZXIpPVwic3RhcnRDcm9wUHJldmlldyhmLiRuZXdGaWxlLmlkKVwiXHJcbiAgICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwic3RvcENyb3BQcmV2aWV3KGYuJG5ld0ZpbGUuaWQpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3JvcC1jb250YWluZXJcIiBbbmdTdHlsZV09XCJuZ0FkZFN0eWxlXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDx1aS1maWxlICpuZ0lmPVwiZmFsc2UgJiYgZmlsZXMubGVuZ3RoID4gMCAmJiAhY3JvcFNvdXJjZUltYWdlc1wiIFtmaWxlU2l6ZV09XCJudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3JjRGF0YV09XCJmaWxlc1swXS5jdXN0b21cIiBbbmdDbGFzc109XCJ7cm91bmRlZDogY3JvcFJvdW5kZWR9XCI+PC91aS1maWxlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LXNwaW5uZXIgKm5nSWY9XCIhY3JvcHBlckltYWdlTG9hZGVkW2YuJG5ld0ZpbGUuaWRdICYmIGNyb3BTb3VyY2VJbWFnZXNbZi4kbmV3RmlsZS5pZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlhbWV0ZXJdPVwiNzVcIj48L21hdC1zcGlubmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8aW1hZ2UtY3JvcHBlciAqbmdJZj1cImNyb3BTb3VyY2VJbWFnZXNbZi4kbmV3RmlsZS5pZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbWFnZUZpbGVdPVwiY3JvcFNvdXJjZUltYWdlc1tmLiRuZXdGaWxlLmlkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21haW50YWluQXNwZWN0UmF0aW9dPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpb109XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FzcGVjdFJhdGlvXT1cImFzcGVjdFJhdGlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVzaXplVG9XaWR0aF09XCJjcm9wTWF4V2lkdGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvbmx5U2NhbGVEb3duXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm91bmRDcm9wcGVyXT1cImNyb3BSb3VuZGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2FudmFzUm90YXRpb25dPVwiY2FudmFzUm90YXRpb25bZi4kbmV3RmlsZS5pZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0cmFuc2Zvcm1dPVwidHJhbnNmb3JtW2YuJG5ld0ZpbGUuaWRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWxpZ25JbWFnZV09XCInY2VudGVyJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmRpc3BsYXldPVwic2hvd0Nyb3BwZXIgPyBudWxsIDogJ25vbmUnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybWF0XT1cIidwbmcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW1hZ2VDcm9wcGVkKT1cIm9uSW1hZ2VDcm9wcGVkKCRldmVudCwgZi4kbmV3RmlsZS5pZClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbWFnZUxvYWRlZCk9XCJpbWFnZUxvYWRlZChmLiRuZXdGaWxlLmlkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNyb3BwZXJSZWFkeSk9XCJjcm9wcGVyUmVhZHkoJGV2ZW50LCBmLiRuZXdGaWxlLmlkKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvYWRJbWFnZUZhaWxlZCk9XCJsb2FkSW1hZ2VGYWlsZWQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvaW1hZ2UtY3JvcHBlcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNyb3AtcHJldmlldyBtYXQtZWxldmF0aW9uLXoyXCIgW2NsYXNzXT1cInByZXZpZXdQb3NpdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInRydWUgfHwgKHNob3dDcm9wUHJldmlld1tmLiRuZXdGaWxlLmlkXSAmJiBjcm9wcGVySW1hZ2VMb2FkZWRbZi4kbmV3RmlsZS5pZF0pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcm9wLW1lbnVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAoY2xpY2spPVwiem9vbUNyb3BwZWRJbWFnZSguMSwgZi4kbmV3RmlsZS5pZClcIj56b29tX2luPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAoY2xpY2spPVwiem9vbUNyb3BwZWRJbWFnZSgtIC4xLCBmLiRuZXdGaWxlLmlkKVwiPnpvb21fb3V0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAoY2xpY2spPVwicm90YXRlQ3JvcHBlZEltYWdlKC0xLCBmLiRuZXdGaWxlLmlkKVwiPnJvdGF0ZV9sZWZ0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAoY2xpY2spPVwicm90YXRlQ3JvcHBlZEltYWdlKDEsIGYuJG5ld0ZpbGUuaWQpXCI+cm90YXRlX3JpZ2h0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxIDEgMTAwJVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibWVudS1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPnVwbG9hZF9maWxlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIHR5cGU9XCJmaWxlXCIgbmdGaWxlU2VsZWN0IFtvcHRpb25zXT1cInVwbG9hZE9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cImZpbGVDaGFuZ2VFdmVudCgkZXZlbnQsIGYpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVwbG9hZE91dHB1dCk9XCJvblVwbG9hZE91dHB1dCgkZXZlbnQpXCIgW3VwbG9hZElucHV0XT1cInVwbG9hZElucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIChjbGljayk9XCJyZW1vdmUoZilcIj5kZWxldGVfb3V0bGluZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMSAxIDEwMCVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAoY2xpY2spPVwiY3JvcHBlckRvbmUoZi4kbmV3RmlsZS5pZClcIj5kb25lPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCJjcm9wcGVkSW1hZ2VzW2YuJG5ld0ZpbGUuaWRdXCIgW3NyY109XCJjcm9wcGVkSW1hZ2VzW2YuJG5ld0ZpbGUuaWRdLm9iamVjdFVybFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie3JvdW5kZWQ6IGNyb3BSb3VuZGVkfVwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY3JvcCB8fCBjcm9wRG9uZShmKVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbGVUZW1wbGF0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJmaWxlVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2ZpbGU6IGYsIGZpbGVJbnB1dDogZmlsZUlucHV0Mn1cIj48L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZmlsZUlucHV0Mj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiB0eXBlPVwiZmlsZVwiIG5nRmlsZVNlbGVjdCBbb3B0aW9uc109XCJ1cGxvYWRPcHRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiZmlsZUNoYW5nZUV2ZW50KCRldmVudCwgZilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVwbG9hZE91dHB1dCk9XCJvblVwbG9hZE91dHB1dCgkZXZlbnQpXCIgW3VwbG9hZElucHV0XT1cInVwbG9hZElucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgIDx1aS1maWxlICpuZ0lmPVwiIWZpbGVUZW1wbGF0ZVwiIFtmaWxlU2l6ZV09XCJfZmlsZVNpemVcIiBbc3JjRGF0YV09XCJmLiRuZXdGaWxlID8gZi4kbmV3RmlsZTogZi5jdXN0b21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie3JvdW5kZWQ6IGNyb3AgJiYgY3JvcFJvdW5kZWR9XCI+XHJcbiAgICAgICAgICAgICAgICA8L3VpLWZpbGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImYuJG5ld0ZpbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZi4kbmV3RmlsZS5yZXNwb25zZVN0YXR1cyAmJiBmLiRuZXdGaWxlLnJlc3BvbnNlU3RhdHVzICE9PSAyMDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwcm9ncmVzcy1jb250YWluZXIgZXJyb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCd1aS5jb250cm9scy51aS1maWxlLXVwbG9hZGVyLnVwbG9hZEVycm9yJywgZi4kbmV3RmlsZS5yZXNwb25zZSkgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWYuJG5ld0ZpbGUucmVzcG9uc2VTdGF0dXMgJiYgZi4kbmV3RmlsZS5wcm9ncmVzcy5zdGF0dXMgPT09IDFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwcm9ncmVzcy1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzXCIgW25nU3R5bGVdPVwie3dpZHRoOiBmLiRuZXdGaWxlLnByb2dyZXNzLmRhdGEucGVyY2VudGFnZSArICclJ31cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiZmlsZS1jb250YWluZXIgYWRkXCIgbmdGaWxlRHJvcCBbb3B0aW9uc109XCJ1cGxvYWRPcHRpb25zXCIgKHVwbG9hZE91dHB1dCk9XCJvblVwbG9hZE91dHB1dCgkZXZlbnQpXCJcclxuICAgICAgICAgW3VwbG9hZElucHV0XT1cInVwbG9hZElucHV0XCIgW25nQ2xhc3NdPVwie3Zpc2libGU6IGZpbGVzLmxlbmd0aCA8IG1heEZpbGVzIHx8IG1heEZpbGVzID09PSAwfVwiXHJcbiAgICAgICAgIFtuZ1N0eWxlXT1cImFkZEZpbGVUZW1wbGF0ZSA/IHt9IDogbmdBZGRTdHlsZVwiPlxyXG4gICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgQGlmIChhZGRGaWxlVGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJhZGRGaWxlVGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1cGxvYWQtaW1hZ2UtY29udGFpbmVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwidXBsb2FkSW1nU3JjKClcIiBbbmdDbGFzc109XCJ7J3dpdGgtaGludCc6IGFkZEhpbnR9XCIvPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImFkZEhpbnRcIiBjbGFzcz1cImFkZC1oaW50XCI+e3sgYWRkSGludCB9fTwvZGl2PlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDxpbnB1dCBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgdHlwZT1cImZpbGVcIiBuZ0ZpbGVTZWxlY3QgW29wdGlvbnNdPVwidXBsb2FkT3B0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAodXBsb2FkT3V0cHV0KT1cIm9uVXBsb2FkT3V0cHV0KCRldmVudClcIiBbdXBsb2FkSW5wdXRdPVwidXBsb2FkSW5wdXRcIlxyXG4gICAgICAgICAgICAgICAgICAgW211bHRpcGxlXT1cIm1heEZpbGVzID09PSAwICYmIG11bHRpcGxlXCI+XHJcbiAgICAgICAgPC9sYWJlbD5cclxuICAgIDwvZGl2PlxyXG5cclxuPC9kaXY+XHJcbiJdfQ==
@@ -39,7 +39,7 @@ export class UiFileService {
39
39
  upload() {
40
40
  const promises = [];
41
41
  this.controls.forEach(c => promises.push(c.beforeSave()));
42
- return new Promise((res, rej) => {
42
+ return new Promise((res) => {
43
43
  this.uploadSubscription.subscribe((v) => {
44
44
  if (v.action === 'uploadSuccess' || v.action === 'uploadFailed') {
45
45
  res(v.action);
@@ -47,9 +47,10 @@ export class UiFileService {
47
47
  });
48
48
  this.uploadSubscription.next({ action: 'uploadStarted' });
49
49
  Promise.all(promises).then((r) => {
50
+ console.log(r);
50
51
  const event = {
51
52
  type: 'uploadAll',
52
- url: this.fileServiceConfig.uploadUrl,
53
+ url: this.fileServiceConfig.uploadUrl(),
53
54
  method: 'POST',
54
55
  headers: this.fileServiceConfig.getAuthHeader()
55
56
  };
@@ -68,4 +69,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImpor
68
69
  type: Inject,
69
70
  args: [UI_FILESERVICE]
70
71
  }] }] });
71
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktZmlsZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9zZXJ2aWNlcy91aS1maWxlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0YsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUEwQi9CLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBaUIsZ0JBQWdCLENBQUMsQ0FBQztBQUVuRixzR0FBc0c7QUFHdEcsTUFBTSxPQUFPLGFBQWE7SUFTeEIsWUFBdUQsaUJBQWlDO1FBQWpDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBZ0I7UUFQeEYsZ0JBQVcsR0FBOEIsSUFBSSxZQUFZLEVBQWUsQ0FBQztRQUV6RSx1QkFBa0IsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRW5DLGtCQUFhLEdBQWEsRUFBRSxDQUFDO1FBQzdCLGFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBTyxDQUFDO1FBR3hCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtZQUMzQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDakIsS0FBSyxVQUFVO29CQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFBQyxPQUFPO2dCQUNuRCxLQUFLLFNBQVM7b0JBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUFDLE9BQU87Z0JBRXJELEtBQUssZUFBZTtvQkFDbEIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO29CQUNaLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDOUQsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUM7d0JBQ2QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUMsQ0FBQyxDQUFDO29CQUMxRCxDQUFDO29CQUNELE1BQU07Z0JBRVIsS0FBSyxxQkFBcUIsQ0FBQztnQkFDM0IsS0FBSyxzQkFBc0I7b0JBQ3pCLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztvQkFDYixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQy9ELElBQUksSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO3dCQUNmLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUMsQ0FBQyxDQUFDO29CQUNoSCxDQUFDO29CQUNELE1BQU07WUFDVixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sTUFBTTtRQUNYLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUUxRCxPQUFPLElBQUksT0FBTyxDQUFtQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUVoRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7Z0JBQzNDLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxlQUFlLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxjQUFjLEVBQUUsQ0FBQztvQkFDaEUsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDaEIsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUMsQ0FBQyxDQUFDO1lBRXhELE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBRS9CLE1BQU0sS0FBSyxHQUFnQjtvQkFDekIsSUFBSSxFQUFFLFdBQVc7b0JBQ2pCLEdBQUcsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUztvQkFDckMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsT0FBTyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUU7aUJBQ2hELENBQUM7Z0JBRUYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFL0IsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OEdBOURVLGFBQWEsa0JBU1EsY0FBYztrSEFUbkMsYUFBYTs7MkZBQWIsYUFBYTtrQkFEekIsVUFBVTs7MEJBVUksUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVcGxvYWRGaWxlLCBVcGxvYWRJbnB1dCB9IGZyb20gJ25neC11cGxvYWRlcic7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuLy8gaW1wb3J0IHsgVWlGaWxlVXBsb2FkZXJDb21wb25lbnQgfSBmcm9tICcuLi9maWxlLXVwbG9hZGVyL3VpLWZpbGUtdXBsb2FkZXIuY29tcG9uZW50JztcclxuXHJcbi8vIGV4cG9ydCBpbnRlcmZhY2UgSUdldEF1dGhIZWFkZXIge1xyXG4vLyAgIGdldEF1dGhIZWFkZXI6ICgpID0+IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XHJcbi8vIH1cclxuXHJcbmV4cG9ydCB0eXBlIElVaUZpbGVTZXJ2aWNlTWVzc2FnZXMgPSAnY3JvcEludmFsaWRGaWxlVHlwZScgfCAnZXh0ZW5zaW9uTm90QWxsb3dlZCcgfCAnZmlsZUFkZGVkJyB8ICdmaWxlUmVtb3ZlZCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElVaUZpbGVTZXJ2aWNlIHtcclxuICBnZXRBdXRoSGVhZGVyOiAoKSA9PiB7IFsga2V5OiBzdHJpbmcgXTogc3RyaW5nIH0sXHJcbiAgdXBsb2FkVXJsOiBzdHJpbmc7XHJcbiAgLy8gLy8gdXBsb2FkNjRVcmw6IHN0cmluZztcclxuICBnZXRNZWRpYVNyYzogKHNpemU6IHN0cmluZywgZGF0YTogYW55LCBvcHRpb25zOiBhbnkpID0+IHN0cmluZyxcclxuICBnZXRQcmV2aWV3VXJsOiAoc2l6ZTogc3RyaW5nLCBhbnkpID0+IHN0cmluZyxcclxuICBhZGRGaWxlSW1nU3JjOiBzdHJpbmc7XHJcbiAgZ2V0TWltZVR5cGU6IChkYXRhOiBhbnkpID0+IHN0cmluZztcclxuICBpbWFnZVNpemVzOiB7XHJcbiAgICBba2V5OiBzdHJpbmddOiBbbnVtYmVyLCBudW1iZXJdXHJcbiAgfTtcclxuICBjb25jdXJyZW50VXBsb2FkczogbnVtYmVyLFxyXG4gIHVzZVJldGluYVNyYzogYm9vbGVhbixcclxuXHJcbiAgZmlsZVZhbGlkYXRpb24/OiAoc2l6ZTogc3RyaW5nLCBmaWxlOiBVcGxvYWRGaWxlKSA9PiBQcm9taXNlPGJvb2xlYW4+XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBVSV9GSUxFU0VSVklDRSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxJVWlGaWxlU2VydmljZT4oJ0lVaUZpbGVTZXJ2aWNlJyk7XHJcblxyXG4vLyBleHBvcnQgY29uc3QgRmlsZVNlcnZpY2VDb25maWdTZXJ2aWNlID0gbmV3IEluamVjdGlvblRva2VuPEZpbGVTZXJ2aWNlQ29uZmlnPignRmlsZVNlcnZpY2VDb25maWcnKTtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFVpRmlsZVNlcnZpY2Uge1xyXG5cclxuICB1cGxvYWRJbnB1dDogRXZlbnRFbWl0dGVyPFVwbG9hZElucHV0PiA9IG5ldyBFdmVudEVtaXR0ZXI8VXBsb2FkSW5wdXQ+KCk7XHJcblxyXG4gIHVwbG9hZFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIGZpbGVzVG9SZW1vdmU6IHN0cmluZ1tdID0gW107XHJcbiAgY29udHJvbHMgPSBuZXcgU2V0PGFueT4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEluamVjdChVSV9GSUxFU0VSVklDRSkgcHVibGljIGZpbGVTZXJ2aWNlQ29uZmlnOiBJVWlGaWxlU2VydmljZSkge1xyXG4gICAgdGhpcy51cGxvYWRTdWJzY3JpcHRpb24uc3Vic2NyaWJlKCh2OiBhbnkpID0+IHtcclxuICAgICAgc3dpdGNoICh2LmFjdGlvbikge1xyXG4gICAgICAgIGNhc2UgJ3JlZ2lzdGVyJzogdGhpcy5jb250cm9scy5hZGQodi5kYXRhKTsgcmV0dXJuO1xyXG4gICAgICAgIGNhc2UgJ2Rlc3Ryb3knOiB0aGlzLmNvbnRyb2xzLmRlbGV0ZSh2LmRhdGEpOyByZXR1cm47XHJcblxyXG4gICAgICAgIGNhc2UgJ3VwbG9hZFN0YXJ0ZWQnOlxyXG4gICAgICAgICAgbGV0IGNudCA9IDA7XHJcbiAgICAgICAgICB0aGlzLmNvbnRyb2xzLmZvckVhY2goYyA9PiBjbnQgKz0gYy5oYXNGaWxlc1RvVXBsb2FkID8gMSA6IDApO1xyXG4gICAgICAgICAgaWYgKGNudCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnVwbG9hZFN1YnNjcmlwdGlvbi5uZXh0KHthY3Rpb246ICd1cGxvYWRTdWNjZXNzJ30pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgJ3VwbG9hZENvbnRyb2xGYWlsZWQnOlxyXG4gICAgICAgIGNhc2UgJ3VwbG9hZENvbnRyb2xTdWNjZXNzJzpcclxuICAgICAgICAgIGxldCBjbnQyID0gMDtcclxuICAgICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaChjID0+IGNudDIgKz0gYy5oYXNGaWxlc1RvVXBsb2FkID8gMSA6IDApO1xyXG4gICAgICAgICAgaWYgKGNudDIgPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy51cGxvYWRTdWJzY3JpcHRpb24ubmV4dCh7YWN0aW9uOiB2LmFjdGlvbiA9PT0gJ3VwbG9hZENvbnRyb2xGYWlsZWQnID8gJ3VwbG9hZEZhaWxlZCcgOiAndXBsb2FkU3VjY2Vzcyd9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGxvYWQoKTogUHJvbWlzZTwndXBsb2FkU3VjY2VzcycgfCAndXBsb2FkRmFpbGVkJz4ge1xyXG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcclxuICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaChjID0+IHByb21pc2VzLnB1c2goYy5iZWZvcmVTYXZlKCkpKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8J3VwbG9hZFN1Y2Nlc3MnIHwgJ3VwbG9hZEZhaWxlZCc+KChyZXMsIHJlaikgPT4ge1xyXG5cclxuICAgICAgdGhpcy51cGxvYWRTdWJzY3JpcHRpb24uc3Vic2NyaWJlKCh2OiBhbnkpID0+IHtcclxuICAgICAgICBpZiAodi5hY3Rpb24gPT09ICd1cGxvYWRTdWNjZXNzJyB8fCB2LmFjdGlvbiA9PT0gJ3VwbG9hZEZhaWxlZCcpIHtcclxuICAgICAgICAgIHJlcyh2LmFjdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMudXBsb2FkU3Vic2NyaXB0aW9uLm5leHQoe2FjdGlvbjogJ3VwbG9hZFN0YXJ0ZWQnfSk7XHJcblxyXG4gICAgICBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigocikgPT4ge1xyXG5cclxuICAgICAgICBjb25zdCBldmVudDogVXBsb2FkSW5wdXQgPSB7XHJcbiAgICAgICAgICB0eXBlOiAndXBsb2FkQWxsJyxcclxuICAgICAgICAgIHVybDogdGhpcy5maWxlU2VydmljZUNvbmZpZy51cGxvYWRVcmwsXHJcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgIGhlYWRlcnM6IHRoaXMuZmlsZVNlcnZpY2VDb25maWcuZ2V0QXV0aEhlYWRlcigpXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy51cGxvYWRJbnB1dC5lbWl0KGV2ZW50KTtcclxuXHJcbiAgICAgIH0pXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl19
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktZmlsZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWkvc3JjL2xpYi9zZXJ2aWNlcy91aS1maWxlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0YsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUErQi9CLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxJQUFJLGNBQWMsQ0FBaUIsZ0JBQWdCLENBQUMsQ0FBQztBQUVuRixzR0FBc0c7QUFHdEcsTUFBTSxPQUFPLGFBQWE7SUFTeEIsWUFBdUQsaUJBQWlDO1FBQWpDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBZ0I7UUFQeEYsZ0JBQVcsR0FBOEIsSUFBSSxZQUFZLEVBQWUsQ0FBQztRQUV6RSx1QkFBa0IsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRW5DLGtCQUFhLEdBQWEsRUFBRSxDQUFDO1FBQzdCLGFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBTyxDQUFDO1FBR3hCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtZQUMzQyxRQUFRLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDakIsS0FBSyxVQUFVO29CQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFBQyxPQUFPO2dCQUNuRCxLQUFLLFNBQVM7b0JBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUFDLE9BQU87Z0JBRXJELEtBQUssZUFBZTtvQkFDbEIsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO29CQUNaLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDOUQsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUM7d0JBQ2QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUMsQ0FBQyxDQUFDO29CQUMxRCxDQUFDO29CQUNELE1BQU07Z0JBRVIsS0FBSyxxQkFBcUIsQ0FBQztnQkFDM0IsS0FBSyxzQkFBc0I7b0JBQ3pCLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztvQkFDYixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQy9ELElBQUksSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDO3dCQUNmLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sS0FBSyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxlQUFlLEVBQUMsQ0FBQyxDQUFDO29CQUNoSCxDQUFDO29CQUNELE1BQU07WUFDVixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sTUFBTTtRQUNYLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUUxRCxPQUFPLElBQUksT0FBTyxDQUFtQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBRTNELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRTtnQkFDM0MsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLGVBQWUsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLGNBQWMsRUFBRSxDQUFDO29CQUNoRSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNoQixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUMsTUFBTSxFQUFFLGVBQWUsRUFBQyxDQUFDLENBQUM7WUFFeEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDL0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFZixNQUFNLEtBQUssR0FBZ0I7b0JBQ3pCLElBQUksRUFBRSxXQUFXO29CQUNqQixHQUFHLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRTtvQkFDdkMsTUFBTSxFQUFFLE1BQU07b0JBQ2QsT0FBTyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUU7aUJBQ2hELENBQUM7Z0JBRUYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFL0IsQ0FBQyxDQUFDLENBQUE7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OEdBL0RVLGFBQWEsa0JBU1EsY0FBYztrSEFUbkMsYUFBYTs7MkZBQWIsYUFBYTtrQkFEekIsVUFBVTs7MEJBVUksUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVcGxvYWRGaWxlLCBVcGxvYWRJbnB1dCB9IGZyb20gJ25neC11cGxvYWRlcic7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuLy8gaW1wb3J0IHsgVWlGaWxlVXBsb2FkZXJDb21wb25lbnQgfSBmcm9tICcuLi9maWxlLXVwbG9hZGVyL3VpLWZpbGUtdXBsb2FkZXIuY29tcG9uZW50JztcclxuXHJcbi8vIGV4cG9ydCBpbnRlcmZhY2UgSUdldEF1dGhIZWFkZXIge1xyXG4vLyAgIGdldEF1dGhIZWFkZXI6ICgpID0+IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XHJcbi8vIH1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVVpRmlsZVNpemUge1xyXG4gIG5hbWU6IHN0cmluZyxcclxuICB3aWR0aDogbnVtYmVyLFxyXG4gIGhlaWdodDogbnVtYmVyLFxyXG4gIGxpbWl0PzogJ2ZpdCcgfCAnbWF4V2lkdGgnIHwgJ21heEhlaWdodCdcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSVVpRmlsZVNlcnZpY2VNZXNzYWdlcyA9ICdjcm9wSW52YWxpZEZpbGVUeXBlJyB8ICdleHRlbnNpb25Ob3RBbGxvd2VkJyB8ICdmaWxlQWRkZWQnIHwgJ2ZpbGVSZW1vdmVkJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSVVpRmlsZVNlcnZpY2Uge1xyXG4gIGdldEF1dGhIZWFkZXI6ICgpID0+IHsgWyBrZXk6IHN0cmluZyBdOiBzdHJpbmcgfSxcclxuICB1cGxvYWRVcmw6IChzaXplPzogSVVpRmlsZVNpemUpID0+IHN0cmluZztcclxuICAvLyAvLyB1cGxvYWQ2NFVybDogc3RyaW5nO1xyXG4gIGdldE1lZGlhU3JjOiAoc2l6ZTogSVVpRmlsZVNpemUsIGRhdGE6IGFueSwgb3B0aW9uczogYW55KSA9PiBzdHJpbmcsXHJcbiAgZ2V0UHJldmlld1VybDogKHNpemU6IElVaUZpbGVTaXplLCBkYXRhOiBhbnkpID0+IHN0cmluZyxcclxuICBhZGRGaWxlSW1nU3JjOiAoc2l6ZTogSVVpRmlsZVNpemUpID0+IHN0cmluZyxcclxuICBnZXRNaW1lVHlwZTogKGRhdGE6IGFueSkgPT4gc3RyaW5nO1xyXG4gIGltYWdlU2l6ZXM6IElVaUZpbGVTaXplW107XHJcbiAgY29uY3VycmVudFVwbG9hZHM6IG51bWJlcixcclxuICB1c2VSZXRpbmFTcmM6IGJvb2xlYW4sXHJcblxyXG4gIGZpbGVWYWxpZGF0aW9uPzogKHNpemU6IElVaUZpbGVTaXplLCBmaWxlOiBVcGxvYWRGaWxlKSA9PiBQcm9taXNlPGJvb2xlYW4+XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBVSV9GSUxFU0VSVklDRSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxJVWlGaWxlU2VydmljZT4oJ0lVaUZpbGVTZXJ2aWNlJyk7XHJcblxyXG4vLyBleHBvcnQgY29uc3QgRmlsZVNlcnZpY2VDb25maWdTZXJ2aWNlID0gbmV3IEluamVjdGlvblRva2VuPEZpbGVTZXJ2aWNlQ29uZmlnPignRmlsZVNlcnZpY2VDb25maWcnKTtcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFVpRmlsZVNlcnZpY2Uge1xyXG5cclxuICB1cGxvYWRJbnB1dDogRXZlbnRFbWl0dGVyPFVwbG9hZElucHV0PiA9IG5ldyBFdmVudEVtaXR0ZXI8VXBsb2FkSW5wdXQ+KCk7XHJcblxyXG4gIHVwbG9hZFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIGZpbGVzVG9SZW1vdmU6IHN0cmluZ1tdID0gW107XHJcbiAgY29udHJvbHMgPSBuZXcgU2V0PGFueT4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEluamVjdChVSV9GSUxFU0VSVklDRSkgcHVibGljIGZpbGVTZXJ2aWNlQ29uZmlnOiBJVWlGaWxlU2VydmljZSkge1xyXG4gICAgdGhpcy51cGxvYWRTdWJzY3JpcHRpb24uc3Vic2NyaWJlKCh2OiBhbnkpID0+IHtcclxuICAgICAgc3dpdGNoICh2LmFjdGlvbikge1xyXG4gICAgICAgIGNhc2UgJ3JlZ2lzdGVyJzogdGhpcy5jb250cm9scy5hZGQodi5kYXRhKTsgcmV0dXJuO1xyXG4gICAgICAgIGNhc2UgJ2Rlc3Ryb3knOiB0aGlzLmNvbnRyb2xzLmRlbGV0ZSh2LmRhdGEpOyByZXR1cm47XHJcblxyXG4gICAgICAgIGNhc2UgJ3VwbG9hZFN0YXJ0ZWQnOlxyXG4gICAgICAgICAgbGV0IGNudCA9IDA7XHJcbiAgICAgICAgICB0aGlzLmNvbnRyb2xzLmZvckVhY2goYyA9PiBjbnQgKz0gYy5oYXNGaWxlc1RvVXBsb2FkID8gMSA6IDApO1xyXG4gICAgICAgICAgaWYgKGNudCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnVwbG9hZFN1YnNjcmlwdGlvbi5uZXh0KHthY3Rpb246ICd1cGxvYWRTdWNjZXNzJ30pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgIGNhc2UgJ3VwbG9hZENvbnRyb2xGYWlsZWQnOlxyXG4gICAgICAgIGNhc2UgJ3VwbG9hZENvbnRyb2xTdWNjZXNzJzpcclxuICAgICAgICAgIGxldCBjbnQyID0gMDtcclxuICAgICAgICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaChjID0+IGNudDIgKz0gYy5oYXNGaWxlc1RvVXBsb2FkID8gMSA6IDApO1xyXG4gICAgICAgICAgaWYgKGNudDIgPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy51cGxvYWRTdWJzY3JpcHRpb24ubmV4dCh7YWN0aW9uOiB2LmFjdGlvbiA9PT0gJ3VwbG9hZENvbnRyb2xGYWlsZWQnID8gJ3VwbG9hZEZhaWxlZCcgOiAndXBsb2FkU3VjY2Vzcyd9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGxvYWQoKTogUHJvbWlzZTwndXBsb2FkU3VjY2VzcycgfCAndXBsb2FkRmFpbGVkJz4ge1xyXG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcclxuICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaChjID0+IHByb21pc2VzLnB1c2goYy5iZWZvcmVTYXZlKCkpKTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2U8J3VwbG9hZFN1Y2Nlc3MnIHwgJ3VwbG9hZEZhaWxlZCc+KChyZXMpID0+IHtcclxuXHJcbiAgICAgIHRoaXMudXBsb2FkU3Vic2NyaXB0aW9uLnN1YnNjcmliZSgodjogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHYuYWN0aW9uID09PSAndXBsb2FkU3VjY2VzcycgfHwgdi5hY3Rpb24gPT09ICd1cGxvYWRGYWlsZWQnKSB7XHJcbiAgICAgICAgICByZXModi5hY3Rpb24pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLnVwbG9hZFN1YnNjcmlwdGlvbi5uZXh0KHthY3Rpb246ICd1cGxvYWRTdGFydGVkJ30pO1xyXG5cclxuICAgICAgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKHIpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhyKTtcclxuXHJcbiAgICAgICAgY29uc3QgZXZlbnQ6IFVwbG9hZElucHV0ID0ge1xyXG4gICAgICAgICAgdHlwZTogJ3VwbG9hZEFsbCcsXHJcbiAgICAgICAgICB1cmw6IHRoaXMuZmlsZVNlcnZpY2VDb25maWcudXBsb2FkVXJsKCksXHJcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgIGhlYWRlcnM6IHRoaXMuZmlsZVNlcnZpY2VDb25maWcuZ2V0QXV0aEhlYWRlcigpXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy51cGxvYWRJbnB1dC5lbWl0KGV2ZW50KTtcclxuXHJcbiAgICAgIH0pXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuIl19