@dignite-ng/expand.file-explorer 3.0.0-rc.8 → 3.0.1

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.
Files changed (55) hide show
  1. package/README.md +128 -24
  2. package/esm2022/config/dignite-ng-expand.file-explorer-config.mjs +1 -1
  3. package/esm2022/config/enums/index.mjs +1 -1
  4. package/esm2022/config/enums/route-names.mjs +1 -1
  5. package/esm2022/config/file-config.module.mjs +1 -1
  6. package/esm2022/config/providers/index.mjs +1 -1
  7. package/esm2022/config/providers/route.provider.mjs +1 -1
  8. package/esm2022/config/public-api.mjs +1 -1
  9. package/esm2022/dignite-ng-expand.file-explorer.mjs +1 -1
  10. package/esm2022/lib/components/dome/file-dome.component.mjs +2 -4
  11. package/esm2022/lib/components/dynamic-form/file-explorer/file-explorer-config.component.mjs +3 -2
  12. package/esm2022/lib/components/dynamic-form/file-explorer/file-explorer-config.mjs +1 -1
  13. package/esm2022/lib/components/dynamic-form/file-explorer/file-explorer-control.component.mjs +3 -3
  14. package/esm2022/lib/components/dynamic-form/file-explorer/file-explorer-view.component.mjs +3 -3
  15. package/esm2022/lib/components/dynamic-form/file-explorer/index.mjs +1 -1
  16. package/esm2022/lib/components/dynamic-form/form-control-group.mjs +1 -1
  17. package/esm2022/lib/components/file-edit/file-edit.component.mjs +34 -24
  18. package/esm2022/lib/components/file-modal/file-modal.component.mjs +293 -85
  19. package/esm2022/lib/components/file-modal-tree/file-modal-tree.component.mjs +135 -60
  20. package/esm2022/lib/components/file-picker/file-picker.component.mjs +20 -12
  21. package/esm2022/lib/components/index.mjs +1 -1
  22. package/esm2022/lib/file-explorer-routing.module.mjs +1 -1
  23. package/esm2022/lib/file-explorer.module.mjs +36 -11
  24. package/esm2022/lib/pipe/format-file-size.pipe.mjs +35 -0
  25. package/esm2022/lib/pipe/get-directory-name.pipe.mjs +20 -0
  26. package/esm2022/lib/previews/file-preview.component.mjs +2 -1
  27. package/esm2022/lib/previews/index.mjs +1 -1
  28. package/esm2022/lib/previews/models.mjs +1 -1
  29. package/esm2022/lib/proxy/dignite/file-explorer/directories/file-descriptor.service.mjs +2 -1
  30. package/esm2022/lib/proxy/dignite/file-explorer/directories/index.mjs +1 -1
  31. package/esm2022/lib/proxy/dignite/file-explorer/directories/models.mjs +1 -1
  32. package/esm2022/lib/proxy/dignite/file-explorer/files/file-descriptor.service.mjs +11 -3
  33. package/esm2022/lib/proxy/dignite/file-explorer/files/index.mjs +1 -1
  34. package/esm2022/lib/proxy/dignite/file-explorer/files/models.mjs +1 -1
  35. package/esm2022/lib/proxy/microsoft/asp-net-core/mvc/models.mjs +1 -1
  36. package/esm2022/lib/proxy/microsoft/extensions/primitives/models.mjs +1 -1
  37. package/esm2022/lib/proxy/microsoft/net/http/headers/models.mjs +1 -1
  38. package/esm2022/lib/proxy/volo/abp/content/models.mjs +1 -1
  39. package/esm2022/public-api.mjs +1 -3
  40. package/fesm2022/dignite-ng-expand.file-explorer-config.mjs.map +1 -1
  41. package/fesm2022/dignite-ng-expand.file-explorer.mjs +541 -238
  42. package/fesm2022/dignite-ng-expand.file-explorer.mjs.map +1 -1
  43. package/lib/components/dome/file-dome.component.d.ts +0 -1
  44. package/lib/components/file-edit/file-edit.component.d.ts +6 -4
  45. package/lib/components/file-modal/file-modal.component.d.ts +63 -25
  46. package/lib/components/file-modal-tree/file-modal-tree.component.d.ts +21 -12
  47. package/lib/components/file-picker/file-picker.component.d.ts +2 -3
  48. package/lib/file-explorer.module.d.ts +5 -1
  49. package/lib/pipe/format-file-size.pipe.d.ts +14 -0
  50. package/lib/pipe/get-directory-name.pipe.d.ts +7 -0
  51. package/lib/proxy/dignite/file-explorer/files/file-descriptor.service.d.ts +3 -1
  52. package/lib/proxy/dignite/file-explorer/files/models.d.ts +5 -2
  53. package/package.json +25 -7
  54. package/esm2022/lib/services/file-api.service.mjs +0 -68
  55. package/lib/services/file-api.service.d.ts +0 -14
@@ -1,12 +1,17 @@
1
- import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
1
+ /* eslint-disable @angular-eslint/component-selector */
2
+ import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';
3
+ import { GetImageLacolBase64urlService } from '@dignite-ng/expand.core';
4
+ import { FormatFileSizePipe } from '../../pipe/format-file-size.pipe';
2
5
  import * as i0 from "@angular/core";
3
- import * as i1 from "../../services/file-api.service";
4
- import * as i2 from "@angular/common";
5
- import * as i3 from "@abp/ng.core";
6
- import * as i4 from "../../previews/file-preview.component";
6
+ import * as i1 from "../../pipe/format-file-size.pipe";
7
+ import * as i2 from "@dignite-ng/expand.core";
8
+ import * as i3 from "@angular/common";
9
+ import * as i4 from "@abp/ng.core";
10
+ import * as i5 from "../../previews/file-preview.component";
7
11
  export class FileEditComponent {
8
- constructor(_FileApiService) {
9
- this._FileApiService = _FileApiService;
12
+ constructor(_FormatFileSizePipe, _GetImageLacolBase64urlService) {
13
+ this._FormatFileSizePipe = _FormatFileSizePipe;
14
+ this._GetImageLacolBase64urlService = _GetImageLacolBase64urlService;
10
15
  /**是否多选 */
11
16
  this._multiple = true;
12
17
  /**文件数据--已上传的数据 */
@@ -15,7 +20,7 @@ export class FileEditComponent {
15
20
  this.fileDataChange = new EventEmitter();
16
21
  /**文件大小限制
17
22
  * @param 1mb
18
- */
23
+ */
19
24
  this.sizeLimit = 1048576;
20
25
  /**文件表格数据 */
21
26
  this.filesTableData = [];
@@ -24,7 +29,7 @@ export class FileEditComponent {
24
29
  }
25
30
  set multiple(v) {
26
31
  this._multiple = v;
27
- if (v) { }
32
+ // if (v) { }
28
33
  }
29
34
  set fileData(v) {
30
35
  this._fileData = v;
@@ -37,15 +42,16 @@ export class FileEditComponent {
37
42
  }
38
43
  /**获取文件信息改变 */
39
44
  async getFileChange(event) {
40
- let files = new Array(...event.target.files);
45
+ const files = new Array(...event.target.files);
41
46
  /**需要等待setfileSizeUnits执行完后在执行其他方法--需要完善 */
42
47
  await this.waitFileToAddTable(files);
43
48
  this.fileHandling();
44
49
  }
45
50
  /**等待将文件数据加入到文件表格数据中 */
46
51
  waitFileToAddTable(files) {
47
- return new Promise(async (resolve, rejects) => {
48
- this.filesTableData.push(...await this.setfileSizeUnits(files));
52
+ // eslint-disable-next-line no-async-promise-executor
53
+ return new Promise(async (resolve) => {
54
+ this.filesTableData.push(...(await this.setfileSizeUnits(files)));
49
55
  resolve(true);
50
56
  });
51
57
  }
@@ -59,32 +65,36 @@ export class FileEditComponent {
59
65
  }
60
66
  /**文件处理-调用回调函数 */
61
67
  fileHandling() {
62
- let theFilesToBeUploaded = this.filesTableData.filter(el => !el.id);
68
+ const theFilesToBeUploaded = this.filesTableData.filter(el => !el.id);
63
69
  //判断图片大小是否超过限制-用于判断表单是否允许提交
64
- let isSubmit = !this.filesTableData.some(el => el.size > this.sizeLimit);
65
- this.fileDataChange.emit({ theFilesToBeUploaded, deleteTheUploadedFiles: this.deleteTheUploadedFiles, isSubmit });
70
+ const isSubmit = !this.filesTableData.some(el => el.size > this.sizeLimit);
71
+ this.fileDataChange.emit({
72
+ theFilesToBeUploaded,
73
+ deleteTheUploadedFiles: this.deleteTheUploadedFiles,
74
+ isSubmit,
75
+ });
66
76
  }
67
77
  /**设置值文件大小单位/ */
68
78
  async setfileSizeUnits(files) {
69
- return new Promise((resolve, rejects) => {
70
- let formattedFiles = [];
79
+ return new Promise((resolve) => {
80
+ const formattedFiles = [];
71
81
  files.forEach(async (file) => {
72
- file.fileSize = this._FileApiService.formatFileSize(file.size);
82
+ file.fileSize = this._FormatFileSizePipe.transform(file.size);
73
83
  formattedFiles.push(file);
74
84
  //设置选择图片的本地url
75
85
  if (!file.src)
76
- file.src = await this._FileApiService.getImageLacolBase64Url(file);
86
+ file.src = await this._GetImageLacolBase64urlService.get(file);
77
87
  });
78
88
  resolve(files);
79
89
  });
80
90
  }
81
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.5", ngImport: i0, type: FileEditComponent, deps: [{ token: i1.FileApiService }], target: i0.ɵɵFactoryTarget.Component }); }
82
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.5", type: FileEditComponent, selector: "fe-file-edit", inputs: { multiple: "multiple", fileData: "fileData", limit: "limit" }, outputs: { fileDataChange: "fileDataChange" }, viewQueries: [{ propertyName: "fileEdit", first: true, predicate: ["fileEdit"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"input-group mb-3\">\n <input type=\"file\" class=\"form-control\" #fileEdit [multiple]=\"_multiple\" (change)=\"getFileChange($event)\">\n</div>\n\n<table class=\"table\" *ngIf=\"filesTableData.length>0\">\n <thead>\n <tr>\n <th scope=\"col\"></th>\n <th scope=\"col\">{{'FileExplorer::FileName' | abpLocalization}}</th>\n <th scope=\"col\">{{'FileExplorer::FileSize' | abpLocalization}}</th>\n <th scope=\"col\"></th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let item of filesTableData;let i =index\">\n <tr>\n <td>\n <fe-file-preview [width]=\"'80px'\" [src]=\"item.src\" [name]=\"item.name\" [type]=\"item.type\" [preview]=\"true\"></fe-file-preview>\n </td>\n <th scope=\"row\">\n <div>{{item.name}}</div>\n <div class=\"form-text text-danger\" *ngIf=\"item.size > sizeLimit\">\n {{'FileExplorer::ExceedsMaximumSize' |\n abpLocalization:_FileApiService.formatFileSize(sizeLimit)}}</div>\n </th>\n <td>{{item.fileSize}}</td>\n <td>\n <button class=\"btn btn-sm p-0 btn-light \" (click.stop)=\"deleteFileTableItem(i,item)\">\n <i class=\"fas fa-trash p-2\"></i>\n </button>\n </td>\n </tr>\n </ng-container>\n </tbody>\n</table>", styles: [""], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.StopPropagationDirective, selector: "[click.stop]", outputs: ["click.stop"] }, { kind: "component", type: i4.FilePreviewComponent, selector: "fe-file-preview", inputs: ["width", "src", "preview", "type", "name", "className"] }, { kind: "pipe", type: i3.LocalizationPipe, name: "abpLocalization" }] }); }
91
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.5", ngImport: i0, type: FileEditComponent, deps: [{ token: i1.FormatFileSizePipe }, { token: i2.GetImageLacolBase64urlService }], target: i0.ɵɵFactoryTarget.Component }); }
92
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.1.5", type: FileEditComponent, selector: "fe-file-edit", inputs: { multiple: "multiple", fileData: "fileData", limit: "limit" }, outputs: { fileDataChange: "fileDataChange" }, viewQueries: [{ propertyName: "fileEdit", first: true, predicate: ["fileEdit"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"input-group mb-3\">\n <input type=\"file\" class=\"form-control\" #fileEdit [multiple]=\"_multiple\" (change)=\"getFileChange($event)\">\n</div>\n\n<table class=\"table\" *ngIf=\"filesTableData.length>0\">\n <thead>\n <tr>\n <th scope=\"col\"></th>\n <th scope=\"col\">{{'FileExplorer::FileName' | abpLocalization}}</th>\n <th scope=\"col\">{{'FileExplorer::FileSize' | abpLocalization}}</th>\n <th scope=\"col\"></th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let item of filesTableData;let i =index\">\n <tr>\n <td>\n <fe-file-preview [width]=\"'80px'\" [src]=\"item.src\" [name]=\"item.name\" [type]=\"item.type\" [preview]=\"true\"></fe-file-preview>\n </td>\n <th scope=\"row\">\n <div>{{item.name}}</div>\n <div class=\"form-text text-danger\" *ngIf=\"item.size > sizeLimit\">\n {{'FileExplorer::ExceedsMaximumSize' |\n abpLocalization:(sizeLimit|formatFileSize)}}</div>\n </th>\n <td>{{item.fileSize}}</td>\n <td>\n <button class=\"btn btn-sm p-0 btn-light \" (click.stop)=\"deleteFileTableItem(i,item)\">\n <i class=\"fas fa-trash p-2\"></i>\n </button>\n </td>\n </tr>\n </ng-container>\n </tbody>\n</table>", styles: [""], dependencies: [{ 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: i4.StopPropagationDirective, selector: "[click.stop]", outputs: ["click.stop"] }, { kind: "component", type: i5.FilePreviewComponent, selector: "fe-file-preview", inputs: ["width", "src", "preview", "type", "name", "className"] }, { kind: "pipe", type: i4.LocalizationPipe, name: "abpLocalization" }, { kind: "pipe", type: i1.FormatFileSizePipe, name: "formatFileSize" }] }); }
83
93
  }
84
94
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImport: i0, type: FileEditComponent, decorators: [{
85
95
  type: Component,
86
- args: [{ selector: 'fe-file-edit', template: "<div class=\"input-group mb-3\">\n <input type=\"file\" class=\"form-control\" #fileEdit [multiple]=\"_multiple\" (change)=\"getFileChange($event)\">\n</div>\n\n<table class=\"table\" *ngIf=\"filesTableData.length>0\">\n <thead>\n <tr>\n <th scope=\"col\"></th>\n <th scope=\"col\">{{'FileExplorer::FileName' | abpLocalization}}</th>\n <th scope=\"col\">{{'FileExplorer::FileSize' | abpLocalization}}</th>\n <th scope=\"col\"></th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let item of filesTableData;let i =index\">\n <tr>\n <td>\n <fe-file-preview [width]=\"'80px'\" [src]=\"item.src\" [name]=\"item.name\" [type]=\"item.type\" [preview]=\"true\"></fe-file-preview>\n </td>\n <th scope=\"row\">\n <div>{{item.name}}</div>\n <div class=\"form-text text-danger\" *ngIf=\"item.size > sizeLimit\">\n {{'FileExplorer::ExceedsMaximumSize' |\n abpLocalization:_FileApiService.formatFileSize(sizeLimit)}}</div>\n </th>\n <td>{{item.fileSize}}</td>\n <td>\n <button class=\"btn btn-sm p-0 btn-light \" (click.stop)=\"deleteFileTableItem(i,item)\">\n <i class=\"fas fa-trash p-2\"></i>\n </button>\n </td>\n </tr>\n </ng-container>\n </tbody>\n</table>" }]
87
- }], ctorParameters: () => [{ type: i1.FileApiService }], propDecorators: { multiple: [{
96
+ args: [{ selector: 'fe-file-edit', template: "<div class=\"input-group mb-3\">\n <input type=\"file\" class=\"form-control\" #fileEdit [multiple]=\"_multiple\" (change)=\"getFileChange($event)\">\n</div>\n\n<table class=\"table\" *ngIf=\"filesTableData.length>0\">\n <thead>\n <tr>\n <th scope=\"col\"></th>\n <th scope=\"col\">{{'FileExplorer::FileName' | abpLocalization}}</th>\n <th scope=\"col\">{{'FileExplorer::FileSize' | abpLocalization}}</th>\n <th scope=\"col\"></th>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let item of filesTableData;let i =index\">\n <tr>\n <td>\n <fe-file-preview [width]=\"'80px'\" [src]=\"item.src\" [name]=\"item.name\" [type]=\"item.type\" [preview]=\"true\"></fe-file-preview>\n </td>\n <th scope=\"row\">\n <div>{{item.name}}</div>\n <div class=\"form-text text-danger\" *ngIf=\"item.size > sizeLimit\">\n {{'FileExplorer::ExceedsMaximumSize' |\n abpLocalization:(sizeLimit|formatFileSize)}}</div>\n </th>\n <td>{{item.fileSize}}</td>\n <td>\n <button class=\"btn btn-sm p-0 btn-light \" (click.stop)=\"deleteFileTableItem(i,item)\">\n <i class=\"fas fa-trash p-2\"></i>\n </button>\n </td>\n </tr>\n </ng-container>\n </tbody>\n</table>" }]
97
+ }], ctorParameters: () => [{ type: i1.FormatFileSizePipe }, { type: i2.GetImageLacolBase64urlService }], propDecorators: { multiple: [{
88
98
  type: Input
89
99
  }], fileData: [{
90
100
  type: Input
@@ -96,4 +106,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.5", ngImpor
96
106
  type: ViewChild,
97
107
  args: ['fileEdit', { static: true }]
98
108
  }] } });
99
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1lZGl0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ZpbGUtZXhwbG9yZXIvc3JjL2xpYi9jb21wb25lbnRzL2ZpbGUtZWRpdC9maWxlLWVkaXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZmlsZS1leHBsb3Jlci9zcmMvbGliL2NvbXBvbmVudHMvZmlsZS1lZGl0L2ZpbGUtZWRpdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBUTlGLE1BQU0sT0FBTyxpQkFBaUI7SUFDNUIsWUFDUyxlQUErQjtRQUEvQixvQkFBZSxHQUFmLGVBQWUsQ0FBZ0I7UUFHeEMsVUFBVTtRQUNWLGNBQVMsR0FBWSxJQUFJLENBQUE7UUFNekIsa0JBQWtCO1FBQ2xCLGNBQVMsR0FBVSxFQUFFLENBQUE7UUFRckIsZ0NBQWdDO1FBQ3RCLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQTtRQUU3Qzs7VUFFRTtRQUNGLGNBQVMsR0FBVyxPQUFPLENBQUE7UUFNM0IsWUFBWTtRQUNaLG1CQUFjLEdBQVUsRUFBRSxDQUFBO1FBQzFCLGdCQUFnQjtRQUNoQiwyQkFBc0IsR0FBVSxFQUFFLENBQUE7SUFqQzlCLENBQUM7SUFJTCxJQUNXLFFBQVEsQ0FBQyxDQUFVO1FBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1osQ0FBQztJQUdELElBQ1csUUFBUSxDQUFDLENBQVE7UUFDMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFB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QWlCLCtSQ1I5QixnZ0RBa0NROzsyRkQxQkssaUJBQWlCO2tCQUw3QixTQUFTOytCQUNFLGNBQWM7bUZBWWIsUUFBUTtzQkFEbEIsS0FBSztnQkFRSyxRQUFRO3NCQURsQixLQUFLO2dCQVFJLGNBQWM7c0JBQXZCLE1BQU07Z0JBT0ksS0FBSztzQkFEZixLQUFLO2dCQVdtQyxRQUFRO3NCQUFoRCxTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGaWxlQXBpU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZpbGUtYXBpLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmZS1maWxlLWVkaXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsZS1lZGl0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZmlsZS1lZGl0LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRmlsZUVkaXRDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgX0ZpbGVBcGlTZXJ2aWNlOiBGaWxlQXBpU2VydmljZSxcbiAgKSB7IH1cblxuICAvKirmmK/lkKblpJrpgIkgKi9cbiAgX211bHRpcGxlOiBib29sZWFuID0gdHJ1ZVxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IG11bHRpcGxlKHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9tdWx0aXBsZSA9IHY7XG4gICAgaWYgKHYpIHsgfVxuICB9XG4gIC8qKuaWh+S7tuaVsOaNri0t5bey5LiK5Lyg55qE5pWw5o2uICovXG4gIF9maWxlRGF0YTogYW55W10gPSBbXVxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGZpbGVEYXRhKHY6IGFueVtdKSB7XG4gICAgdGhpcy5fZmlsZURhdGEgPSB2O1xuICAgIGlmICh2Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZ2V0RmlsZUNoYW5nZSh7IHRhcmdldDogeyBmaWxlczogdiB9IH0pXG4gICAgfVxuICB9XG4gIC8qKiDot5/pmo/ooajljZXmj5DkuqQtLeW3suaPkOS6pOeahOaVsOaNru+8jOaIlumAieaLqeeahOaVsOaNrua6kC0t5Zue6LCDKi9cbiAgQE91dHB1dCgpIGZpbGVEYXRhQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpXG5cbiAgLyoq5paH5Lu25aSn5bCP6ZmQ5Yi2IFxuICAgKiBAcGFyYW0gMW1iXG4gICovXG4gIHNpemVMaW1pdDogbnVtYmVyID0gMTA0ODU3NlxuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGxpbWl0KHY6IG51bWJlcikge1xuICAgIHRoaXMuc2l6ZUxpbWl0ID0gdjtcbiAgfVxuXG4gIC8qKuaWh+S7tuihqOagvOaVsOaNriAqL1xuICBmaWxlc1RhYmxlRGF0YTogYW55W10gPSBbXVxuICAvKiog5b6F5Yig6Zmk5bey5LiK5Lyg55qE5paH5Lu25LusKi9cbiAgZGVsZXRlVGhlVXBsb2FkZWRGaWxlczogYW55W10gPSBbXVxuXG4gIC8qKuiOt+WPluaWh+S7tumAieaLqeahhueahOWFg+e0oCAqL1xuICBAVmlld0NoaWxkKCdmaWxlRWRpdCcsIHsgc3RhdGljOiB0cnVlIH0pIGZpbGVFZGl0OiBFbGVtZW50UmVmO1xuXG5cbiAgLyoq6I635Y+W5paH5Lu25L+h5oGv5pS55Y+YICovXG4gIGFzeW5jIGdldEZpbGVDaGFuZ2UoZXZlbnQpIHtcbiAgICBsZXQgZmlsZXMgPSBuZXcgQXJyYXkoLi4uZXZlbnQudGFyZ2V0LmZpbGVzKVxuICAgIC8qKumcgOimgeetieW+hXNldGZpbGVTaXplVW5pdHPmiafooYzlrozlkI7lnKjmiafooYzlhbbku5bmlrnms5UtLemcgOimgeWujOWWhCAqL1xuICAgIGF3YWl0IHRoaXMud2FpdEZpbGVUb0FkZFRhYmxlKGZpbGVzKVxuICAgIHRoaXMuZmlsZUhhbmRsaW5nKClcbiAgfVxuXG4gIC8qKuetieW+heWwhuaWh+S7tuaVsOaNruWKoOWFpeWIsOaWh+S7tuihqOagvOaVsOaNruS4rSAqL1xuICB3YWl0RmlsZVRvQWRkVGFibGUoZmlsZXMpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdHMpID0+IHtcbiAgICAgIHRoaXMuZmlsZXNUYWJsZURhdGEucHVzaCguLi5hd2FpdCB0aGlzLnNldGZpbGVTaXplVW5pdHMoZmlsZXMpKVxuICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgIH0pXG4gIH1cblxuICAvKirliKDpmaTmlofku7booajmoLznmoTpobkgKi9cbiAgZGVsZXRlRmlsZVRhYmxlSXRlbShpbmRleCwgaXRlbSkge1xuICAgIHRoaXMuZmlsZXNUYWJsZURhdGEuc3BsaWNlKGluZGV4LCAxKVxuICAgIGlmIChpdGVtLmlkKSB7XG4gICAgICB0aGlzLmRlbGV0ZVRoZVVwbG9hZGVkRmlsZXMucHVzaChpdGVtKVxuICAgIH1cbiAgICB0aGlzLmZpbGVIYW5kbGluZygpXG4gIH1cblxuICAvKirmlofku7blpITnkIYt6LCD55So5Zue6LCD5Ye95pWwICovXG4gIGZpbGVIYW5kbGluZygpIHtcbiAgICBsZXQgdGhlRmlsZXNUb0JlVXBsb2FkZWQgPSB0aGlzLmZpbGVzVGFibGVEYXRhLmZpbHRlcihlbCA9PiAhZWwuaWQpXG4gICAgLy/liKTmlq3lm77niYflpKflsI/mmK/lkKbotoXov4fpmZDliLYt55So5LqO5Yik5pat6KGo5Y2V5piv5ZCm5YWB6K645o+Q5LqkXG4gICAgbGV0IGlzU3VibWl0ID0gIXRoaXMuZmlsZXNUYWJsZURhdGEuc29tZShlbCA9PiBlbC5zaXplID4gdGhpcy5zaXplTGltaXQpO1xuICAgIHRoaXMuZmlsZURhdGFDaGFuZ2UuZW1pdCh7IHRoZUZpbGVzVG9CZVVwbG9hZGVkLCBkZWxldGVUaGVVcGxvYWRlZEZpbGVzOiB0aGlzLmRlbGV0ZVRoZVVwbG9hZGVkRmlsZXMsIGlzU3VibWl0IH0pXG4gIH1cblxuICAvKirorr7nva7lgLzmlofku7blpKflsI/ljZXkvY0vICovXG4gIGFzeW5jIHNldGZpbGVTaXplVW5pdHMoZmlsZXM6IEZpbGVbXSB8IGFueVtdKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdHMpID0+IHtcbiAgICAgIGxldCBmb3JtYXR0ZWRGaWxlcyA9IFtdXG4gICAgICBmaWxlcy5mb3JFYWNoKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICAgIGZpbGUuZmlsZVNpemUgPSB0aGlzLl9GaWxlQXBpU2VydmljZS5mb3JtYXRGaWxlU2l6ZShmaWxlLnNpemUpXG4gICAgICAgIGZvcm1hdHRlZEZpbGVzLnB1c2goZmlsZSlcbiAgICAgICAgLy/orr7nva7pgInmi6nlm77niYfnmoTmnKzlnLB1cmxcbiAgICAgICAgaWYgKCFmaWxlLnNyYykgZmlsZS5zcmMgPSBhd2FpdCB0aGlzLl9GaWxlQXBpU2VydmljZS5nZXRJbWFnZUxhY29sQmFzZTY0VXJsKGZpbGUpO1xuICAgICAgfSk7XG4gICAgICByZXNvbHZlKGZpbGVzKVxuICAgIH0pXG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIG1iLTNcIj5cbiAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiICNmaWxlRWRpdCBbbXVsdGlwbGVdPVwiX211bHRpcGxlXCIgKGNoYW5nZSk9XCJnZXRGaWxlQ2hhbmdlKCRldmVudClcIj5cbjwvZGl2PlxuXG48dGFibGUgY2xhc3M9XCJ0YWJsZVwiICpuZ0lmPVwiZmlsZXNUYWJsZURhdGEubGVuZ3RoPjBcIj5cbiAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPjwvdGg+XG4gICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj57eydGaWxlRXhwbG9yZXI6OkZpbGVOYW1lJyB8IGFicExvY2FsaXphdGlvbn19PC90aD5cbiAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPnt7J0ZpbGVFeHBsb3Jlcjo6RmlsZVNpemUnIHwgYWJwTG9jYWxpemF0aW9ufX08L3RoPlxuICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+PC90aD5cbiAgICAgICAgPC90cj5cbiAgICA8L3RoZWFkPlxuICAgIDx0Ym9keT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWxlc1RhYmxlRGF0YTtsZXQgaSA9aW5kZXhcIj5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgICAgIDxmZS1maWxlLXByZXZpZXcgW3dpZHRoXT1cIic4MHB4J1wiIFtzcmNdPVwiaXRlbS5zcmNcIiBbbmFtZV09XCJpdGVtLm5hbWVcIiBbdHlwZV09XCJpdGVtLnR5cGVcIiBbcHJldmlld109XCJ0cnVlXCI+PC9mZS1maWxlLXByZXZpZXc+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8dGggc2NvcGU9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj57e2l0ZW0ubmFtZX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXRleHQgdGV4dC1kYW5nZXJcIiAqbmdJZj1cIml0ZW0uc2l6ZSA+IHNpemVMaW1pdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3snRmlsZUV4cGxvcmVyOjpFeGNlZWRzTWF4aW11bVNpemUnIHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFicExvY2FsaXphdGlvbjpfRmlsZUFwaVNlcnZpY2UuZm9ybWF0RmlsZVNpemUoc2l6ZUxpbWl0KX19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8dGQ+e3tpdGVtLmZpbGVTaXplfX08L3RkPlxuICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gcC0wIGJ0bi1saWdodCBcIiAoY2xpY2suc3RvcCk9XCJkZWxldGVGaWxlVGFibGVJdGVtKGksaXRlbSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRyYXNoIHAtMlwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvdGJvZHk+XG48L3RhYmxlPiJdfQ==
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1lZGl0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2ZpbGUtZXhwbG9yZXIvc3JjL2xpYi9jb21wb25lbnRzL2ZpbGUtZWRpdC9maWxlLWVkaXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZmlsZS1leHBsb3Jlci9zcmMvbGliL2NvbXBvbmVudHMvZmlsZS1lZGl0L2ZpbGUtZWRpdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx1REFBdUQ7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDOzs7Ozs7O0FBT3RFLE1BQU0sT0FBTyxpQkFBaUI7SUFDNUIsWUFDUyxtQkFBdUMsRUFDdEMsOEJBQTZEO1FBRDlELHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBb0I7UUFDdEMsbUNBQThCLEdBQTlCLDhCQUE4QixDQUErQjtRQUd2RSxVQUFVO1FBQ1YsY0FBUyxHQUFHLElBQUksQ0FBQztRQU1qQixrQkFBa0I7UUFDbEIsY0FBUyxHQUFVLEVBQUUsQ0FBQztRQVF0QixnQ0FBZ0M7UUFDdEIsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRTlDOztXQUVHO1FBQ0gsY0FBUyxHQUFHLE9BQU8sQ0FBQztRQU1wQixZQUFZO1FBQ1osbUJBQWMsR0FBVSxFQUFFLENBQUM7UUFDM0IsZ0JBQWdCO1FBQ2hCLDJCQUFzQixHQUFVLEVBQUUsQ0FBQztJQWpDaEMsQ0FBQztJQUlKLElBQ1csUUFBUSxDQUFDLENBQVU7UUFDNUIsSUFBSSxD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SUFBSSxDQUFDLDhCQUE4QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoRixDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7OEdBNUZVLGlCQUFpQjtrR0FBakIsaUJBQWlCLCtSQ1Y5QixpL0NBa0NROzsyRkR4QkssaUJBQWlCO2tCQUw3QixTQUFTOytCQUNFLGNBQWM7bUlBYWIsUUFBUTtzQkFEbEIsS0FBSztnQkFRSyxRQUFRO3NCQURsQixLQUFLO2dCQVFJLGNBQWM7c0JBQXZCLE1BQU07Z0JBT0ksS0FBSztzQkFEZixLQUFLO2dCQVdtQyxRQUFRO3NCQUFoRCxTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yICovXG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBHZXRJbWFnZUxhY29sQmFzZTY0dXJsU2VydmljZSB9IGZyb20gJ0BkaWduaXRlLW5nL2V4cGFuZC5jb3JlJztcbmltcG9ydCB7IEZvcm1hdEZpbGVTaXplUGlwZSB9IGZyb20gJy4uLy4uL3BpcGUvZm9ybWF0LWZpbGUtc2l6ZS5waXBlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZmUtZmlsZS1lZGl0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZpbGUtZWRpdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbGUtZWRpdC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBGaWxlRWRpdENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBfRm9ybWF0RmlsZVNpemVQaXBlOiBGb3JtYXRGaWxlU2l6ZVBpcGUsXG4gICAgcHJpdmF0ZSBfR2V0SW1hZ2VMYWNvbEJhc2U2NHVybFNlcnZpY2U6IEdldEltYWdlTGFjb2xCYXNlNjR1cmxTZXJ2aWNlLFxuICApIHt9XG5cbiAgLyoq5piv5ZCm5aSa6YCJICovXG4gIF9tdWx0aXBsZSA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgbXVsdGlwbGUodjogYm9vbGVhbikge1xuICAgIHRoaXMuX211bHRpcGxlID0gdjtcbiAgICAvLyBpZiAodikgeyB9XG4gIH1cbiAgLyoq5paH5Lu25pWw5o2uLS3lt7LkuIrkvKDnmoTmlbDmja4gKi9cbiAgX2ZpbGVEYXRhOiBhbnlbXSA9IFtdO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGZpbGVEYXRhKHY6IGFueVtdKSB7XG4gICAgdGhpcy5fZmlsZURhdGEgPSB2O1xuICAgIGlmICh2Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZ2V0RmlsZUNoYW5nZSh7IHRhcmdldDogeyBmaWxlczogdiB9IH0pO1xuICAgIH1cbiAgfVxuICAvKiog6Lef6ZqP6KGo5Y2V5o+Q5LqkLS3lt7Lmj5DkuqTnmoTmlbDmja7vvIzmiJbpgInmi6nnmoTmlbDmja7mupAtLeWbnuiwgyovXG4gIEBPdXRwdXQoKSBmaWxlRGF0YUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAvKirmlofku7blpKflsI/pmZDliLZcbiAgICogQHBhcmFtIDFtYlxuICAgKi9cbiAgc2l6ZUxpbWl0ID0gMTA0ODU3NjtcbiAgQElucHV0KClcbiAgcHVibGljIHNldCBsaW1pdCh2OiBudW1iZXIpIHtcbiAgICB0aGlzLnNpemVMaW1pdCA9IHY7XG4gIH1cblxuICAvKirmlofku7booajmoLzmlbDmja4gKi9cbiAgZmlsZXNUYWJsZURhdGE6IGFueVtdID0gW107XG4gIC8qKiDlvoXliKDpmaTlt7LkuIrkvKDnmoTmlofku7bku6wqL1xuICBkZWxldGVUaGVVcGxvYWRlZEZpbGVzOiBhbnlbXSA9IFtdO1xuXG4gIC8qKuiOt+WPluaWh+S7tumAieaLqeahhueahOWFg+e0oCAqL1xuICBAVmlld0NoaWxkKCdmaWxlRWRpdCcsIHsgc3RhdGljOiB0cnVlIH0pIGZpbGVFZGl0OiBFbGVtZW50UmVmO1xuXG4gIC8qKuiOt+WPluaWh+S7tuS/oeaBr+aUueWPmCAqL1xuICBhc3luYyBnZXRGaWxlQ2hhbmdlKGV2ZW50KSB7XG4gICAgY29uc3QgZmlsZXMgPSBuZXcgQXJyYXkoLi4uZXZlbnQudGFyZ2V0LmZpbGVzKTtcbiAgICAvKirpnIDopoHnrYnlvoVzZXRmaWxlU2l6ZVVuaXRz5omn6KGM5a6M5ZCO5Zyo5omn6KGM5YW25LuW5pa55rOVLS3pnIDopoHlrozlloQgKi9cbiAgICBhd2FpdCB0aGlzLndhaXRGaWxlVG9BZGRUYWJsZShmaWxlcyk7XG4gICAgdGhpcy5maWxlSGFuZGxpbmcoKTtcbiAgfVxuXG4gIC8qKuetieW+heWwhuaWh+S7tuaVsOaNruWKoOWFpeWIsOaWh+S7tuihqOagvOaVsOaNruS4rSAqL1xuICB3YWl0RmlsZVRvQWRkVGFibGUoZmlsZXMpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5maWxlc1RhYmxlRGF0YS5wdXNoKC4uLihhd2FpdCB0aGlzLnNldGZpbGVTaXplVW5pdHMoZmlsZXMpKSk7XG4gICAgICByZXNvbHZlKHRydWUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoq5Yig6Zmk5paH5Lu26KGo5qC855qE6aG5ICovXG4gIGRlbGV0ZUZpbGVUYWJsZUl0ZW0oaW5kZXgsIGl0ZW0pIHtcbiAgICB0aGlzLmZpbGVzVGFibGVEYXRhLnNwbGljZShpbmRleCwgMSk7XG4gICAgaWYgKGl0ZW0uaWQpIHtcbiAgICAgIHRoaXMuZGVsZXRlVGhlVXBsb2FkZWRGaWxlcy5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgICB0aGlzLmZpbGVIYW5kbGluZygpO1xuICB9XG5cbiAgLyoq5paH5Lu25aSE55CGLeiwg+eUqOWbnuiwg+WHveaVsCAqL1xuICBmaWxlSGFuZGxpbmcoKSB7XG4gICAgY29uc3QgdGhlRmlsZXNUb0JlVXBsb2FkZWQgPSB0aGlzLmZpbGVzVGFibGVEYXRhLmZpbHRlcihlbCA9PiAhZWwuaWQpO1xuICAgIC8v5Yik5pat5Zu+54mH5aSn5bCP5piv5ZCm6LaF6L+H6ZmQ5Yi2LeeUqOS6juWIpOaWreihqOWNleaYr+WQpuWFgeiuuOaPkOS6pFxuICAgIGNvbnN0IGlzU3VibWl0ID0gIXRoaXMuZmlsZXNUYWJsZURhdGEuc29tZShlbCA9PiBlbC5zaXplID4gdGhpcy5zaXplTGltaXQpO1xuICAgIHRoaXMuZmlsZURhdGFDaGFuZ2UuZW1pdCh7XG4gICAgICB0aGVGaWxlc1RvQmVVcGxvYWRlZCxcbiAgICAgIGRlbGV0ZVRoZVVwbG9hZGVkRmlsZXM6IHRoaXMuZGVsZXRlVGhlVXBsb2FkZWRGaWxlcyxcbiAgICAgIGlzU3VibWl0LFxuICAgIH0pO1xuICB9XG5cbiAgLyoq6K6+572u5YC85paH5Lu25aSn5bCP5Y2V5L2NLyAqL1xuICBhc3luYyBzZXRmaWxlU2l6ZVVuaXRzKGZpbGVzOiBGaWxlW10gfCBhbnlbXSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCBmb3JtYXR0ZWRGaWxlcyA9IFtdO1xuICAgICAgZmlsZXMuZm9yRWFjaChhc3luYyBmaWxlID0+IHtcbiAgICAgICAgZmlsZS5maWxlU2l6ZSA9IHRoaXMuX0Zvcm1hdEZpbGVTaXplUGlwZS50cmFuc2Zvcm0oZmlsZS5zaXplKTtcbiAgICAgICAgZm9ybWF0dGVkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgLy/orr7nva7pgInmi6nlm77niYfnmoTmnKzlnLB1cmxcbiAgICAgICAgaWYgKCFmaWxlLnNyYykgZmlsZS5zcmMgPSBhd2FpdCB0aGlzLl9HZXRJbWFnZUxhY29sQmFzZTY0dXJsU2VydmljZS5nZXQoZmlsZSk7XG4gICAgICB9KTtcbiAgICAgIHJlc29sdmUoZmlsZXMpO1xuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgbWItM1wiPlxuICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgI2ZpbGVFZGl0IFttdWx0aXBsZV09XCJfbXVsdGlwbGVcIiAoY2hhbmdlKT1cImdldEZpbGVDaGFuZ2UoJGV2ZW50KVwiPlxuPC9kaXY+XG5cbjx0YWJsZSBjbGFzcz1cInRhYmxlXCIgKm5nSWY9XCJmaWxlc1RhYmxlRGF0YS5sZW5ndGg+MFwiPlxuICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+PC90aD5cbiAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiPnt7J0ZpbGVFeHBsb3Jlcjo6RmlsZU5hbWUnIHwgYWJwTG9jYWxpemF0aW9ufX08L3RoPlxuICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+e3snRmlsZUV4cGxvcmVyOjpGaWxlU2l6ZScgfCBhYnBMb2NhbGl6YXRpb259fTwvdGg+XG4gICAgICAgICAgICA8dGggc2NvcGU9XCJjb2xcIj48L3RoPlxuICAgICAgICA8L3RyPlxuICAgIDwvdGhlYWQ+XG4gICAgPHRib2R5PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbGVzVGFibGVEYXRhO2xldCBpID1pbmRleFwiPlxuICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgIDx0ZD5cbiAgICAgICAgICAgICAgICAgICAgPGZlLWZpbGUtcHJldmlldyBbd2lkdGhdPVwiJzgwcHgnXCIgW3NyY109XCJpdGVtLnNyY1wiIFtuYW1lXT1cIml0ZW0ubmFtZVwiIFt0eXBlXT1cIml0ZW0udHlwZVwiIFtwcmV2aWV3XT1cInRydWVcIj48L2ZlLWZpbGUtcHJldmlldz5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7aXRlbS5uYW1lfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tdGV4dCB0ZXh0LWRhbmdlclwiICpuZ0lmPVwiaXRlbS5zaXplID4gc2l6ZUxpbWl0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eydGaWxlRXhwbG9yZXI6OkV4Y2VlZHNNYXhpbXVtU2l6ZScgfFxuICAgICAgICAgICAgICAgICAgICAgICAgYWJwTG9jYWxpemF0aW9uOihzaXplTGltaXR8Zm9ybWF0RmlsZVNpemUpfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgIDx0ZD57e2l0ZW0uZmlsZVNpemV9fTwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBwLTAgYnRuLWxpZ2h0IFwiIChjbGljay5zdG9wKT1cImRlbGV0ZUZpbGVUYWJsZUl0ZW0oaSxpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdHJhc2ggcC0yXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC90Ym9keT5cbjwvdGFibGU+Il19