imm-element-ui 2.6.8 → 2.7.0

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.
@@ -0,0 +1,240 @@
1
+ import { Component, inject } from '@angular/core';
2
+ import { HttpClient, HttpEventType, HttpRequest } from '@angular/common/http';
3
+ import { ButtonModule } from 'primeng/button';
4
+ import { FileUpload } from 'primeng/fileupload';
5
+ import { filter, forkJoin } from 'rxjs';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "primeng/button";
8
+ export class UploadRenderer {
9
+ constructor() {
10
+ this.http = inject(HttpClient);
11
+ this.uploadParams = {};
12
+ this.fileList = [];
13
+ this.loading = false;
14
+ }
15
+ agInit(params) {
16
+ this.refresh(params);
17
+ }
18
+ refresh(params) {
19
+ this.params = params;
20
+ this.uploadParams = this.resolveUploadParams(params);
21
+ this.fileList = this.toFileList(params.value);
22
+ return true;
23
+ }
24
+ choose(callback) {
25
+ if (this.isDisabled() || this.loading) {
26
+ return;
27
+ }
28
+ callback();
29
+ }
30
+ uploadHandler(event, fu) {
31
+ const files = Array.from(event.files || []);
32
+ if (!files.length || this.isDisabled()) {
33
+ return;
34
+ }
35
+ const uploadRequests = files.map((file) => this.uploadFile(file));
36
+ this.loading = true;
37
+ forkJoin(uploadRequests).subscribe({
38
+ next: (responses) => {
39
+ const uploadedFiles = responses.map((response) => response.body?.fileName).filter(Boolean);
40
+ this.fileList = [...this.fileList, ...uploadedFiles];
41
+ this.commitValue();
42
+ fu.clear();
43
+ },
44
+ error: () => {
45
+ this.loading = false;
46
+ fu.clear();
47
+ },
48
+ });
49
+ }
50
+ deleteHandler(file, index) {
51
+ if (this.isDisabled() || this.loading) {
52
+ return;
53
+ }
54
+ this.loading = true;
55
+ this.delFile(file).subscribe({
56
+ next: () => {
57
+ this.fileList = this.fileList.filter((_, fileIndex) => fileIndex !== index);
58
+ this.commitValue();
59
+ },
60
+ error: () => {
61
+ this.loading = false;
62
+ },
63
+ });
64
+ }
65
+ isDisabled() {
66
+ if (typeof this.uploadParams.disabled === 'function') {
67
+ return this.uploadParams.disabled(this.params);
68
+ }
69
+ if (this.uploadParams.disabled !== undefined) {
70
+ return this.uploadParams.disabled;
71
+ }
72
+ return Boolean(this.params.context?.gridDisabled?.());
73
+ }
74
+ getDownloadUrl(file) {
75
+ const baseUrl = this.uploadParams.downloadBaseUrl ?? 'https://file-filer.myfoodiepet.com/';
76
+ return `${baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`}${file}`;
77
+ }
78
+ uploadFile(file) {
79
+ const formData = new FormData();
80
+ formData.append('file', file);
81
+ return this.http
82
+ .request(new HttpRequest('POST', this.uploadParams.url ?? 'filerUpload', formData, {
83
+ reportProgress: true,
84
+ withCredentials: this.uploadParams.withCredentials ?? false,
85
+ }))
86
+ .pipe(filter((response) => response.type == HttpEventType.Response));
87
+ }
88
+ delFile(file) {
89
+ return this.http.post(this.uploadParams.deleteUrl ?? 'filerDelete', { fileName: file });
90
+ }
91
+ commitValue() {
92
+ this.loading = false;
93
+ const field = this.params.colDef?.field;
94
+ if (!field) {
95
+ return;
96
+ }
97
+ const oldValue = this.params.data?.[field];
98
+ const newValue = this.toValue(this.fileList);
99
+ const grid = this.params.context?.grid?.();
100
+ this.params.data[field] = newValue;
101
+ grid?.cellValueChanged({
102
+ colDef: this.params.colDef,
103
+ oldValue,
104
+ newValue,
105
+ rowIndex: this.params.node.rowIndex,
106
+ data: this.params.data,
107
+ });
108
+ setTimeout(() => this.params.api.resetRowHeights());
109
+ }
110
+ resolveUploadParams(params) {
111
+ if (typeof params.colDef?.cellRendererParams === 'function') {
112
+ return params.colDef.cellRendererParams(params) || {};
113
+ }
114
+ return params.colDef?.cellRendererParams || {};
115
+ }
116
+ toFileList(value) {
117
+ if (Array.isArray(value)) {
118
+ return value.filter(Boolean);
119
+ }
120
+ return typeof value === 'string' && value.length > 0 ? value.split(';').filter(Boolean) : [];
121
+ }
122
+ toValue(files) {
123
+ return files.join(';');
124
+ }
125
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UploadRenderer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
126
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: UploadRenderer, isStandalone: true, selector: "ng-component", ngImport: i0, template: `
127
+ <div class="upload-renderer">
128
+ @if (!isDisabled()) {
129
+ <p-fileUpload
130
+ #fu
131
+ auto
132
+ mode="advanced"
133
+ [name]="uploadParams.name || 'file'"
134
+ [multiple]="uploadParams.multiple ?? true"
135
+ [accept]="uploadParams.accept"
136
+ [maxFileSize]="uploadParams.maxFileSize"
137
+ [fileLimit]="uploadParams.fileLimit"
138
+ [withCredentials]="uploadParams.withCredentials ?? false"
139
+ [customUpload]="true"
140
+ [disabled]="loading"
141
+ [styleClass]="'upload-renderer-choose'"
142
+ (uploadHandler)="uploadHandler($event, fu)">
143
+ <ng-template
144
+ #header
145
+ let-chooseCallback="chooseCallback">
146
+ <p-button
147
+ icon="pi pi-cloud-upload"
148
+ [text]="true"
149
+ size="small"
150
+ [disabled]="loading"
151
+ (onClick)="choose(chooseCallback)" />
152
+ </ng-template>
153
+ </p-fileUpload>
154
+ }
155
+
156
+ <div class="upload-renderer-files">
157
+ @for (file of fileList; track index; let index = $index) {
158
+ <div class="upload-renderer-file">
159
+ <a
160
+ class="upload-renderer-file-name"
161
+ [href]="getDownloadUrl(file)"
162
+ [download]="file"
163
+ target="_blank"
164
+ (click)="$event.stopPropagation()"
165
+ >{{ file }}</a
166
+ >
167
+ @if (!isDisabled()) {
168
+ <p-button
169
+ icon="pi pi-times"
170
+ severity="danger"
171
+ size="small"
172
+ [text]="true"
173
+ [disabled]="loading"
174
+ (onClick)="deleteHandler(file, index)" />
175
+ }
176
+ </div>
177
+ }
178
+ </div>
179
+ </div>
180
+ `, isInline: true, styles: [".upload-renderer{display:flex;flex-direction:column;align-items:flex-start;justify-content:center;gap:2px;width:100%;min-width:0;padding:2px 0}:host ::ng-deep .upload-renderer-choose{display:inline-flex;align-items:center;width:28px;height:28px;border:0;background:transparent}:host ::ng-deep .upload-renderer-choose .p-fileupload-header{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:0;background:transparent}:host ::ng-deep .upload-renderer-choose .p-fileupload-content{display:none;padding:0;border:0}:host ::ng-deep .upload-renderer-choose .p-button,:host ::ng-deep .upload-renderer-choose p-button{width:28px;height:28px;padding:0}:host ::ng-deep .upload-renderer-choose .p-button-label{display:none}.upload-renderer-files{display:flex;flex-direction:column;align-items:stretch;gap:2px;width:100%;min-width:0;overflow:hidden}.upload-renderer-file{display:flex;align-items:center;justify-content:space-between;gap:4px;min-width:0;width:100%}.upload-renderer-file-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--p-primary-color);text-decoration:none}.upload-renderer-file-name:hover{text-decoration:underline}\n"], dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: FileUpload, selector: "p-fileupload, p-fileUpload", inputs: ["name", "url", "method", "multiple", "accept", "disabled", "auto", "withCredentials", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageDetail", "invalidFileLimitMessageSummary", "style", "styleClass", "previewWidth", "chooseLabel", "uploadLabel", "cancelLabel", "chooseIcon", "uploadIcon", "cancelIcon", "showUploadButton", "showCancelButton", "mode", "headers", "customUpload", "fileLimit", "uploadStyleClass", "cancelStyleClass", "removeStyleClass", "chooseStyleClass", "chooseButtonProps", "uploadButtonProps", "cancelButtonProps", "files"], outputs: ["onBeforeUpload", "onSend", "onUpload", "onError", "onClear", "onRemove", "onSelect", "onProgress", "uploadHandler", "onImageError", "onRemoveUploadedFile"] }] }); }
181
+ }
182
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UploadRenderer, decorators: [{
183
+ type: Component,
184
+ args: [{ standalone: true, imports: [ButtonModule, FileUpload], template: `
185
+ <div class="upload-renderer">
186
+ @if (!isDisabled()) {
187
+ <p-fileUpload
188
+ #fu
189
+ auto
190
+ mode="advanced"
191
+ [name]="uploadParams.name || 'file'"
192
+ [multiple]="uploadParams.multiple ?? true"
193
+ [accept]="uploadParams.accept"
194
+ [maxFileSize]="uploadParams.maxFileSize"
195
+ [fileLimit]="uploadParams.fileLimit"
196
+ [withCredentials]="uploadParams.withCredentials ?? false"
197
+ [customUpload]="true"
198
+ [disabled]="loading"
199
+ [styleClass]="'upload-renderer-choose'"
200
+ (uploadHandler)="uploadHandler($event, fu)">
201
+ <ng-template
202
+ #header
203
+ let-chooseCallback="chooseCallback">
204
+ <p-button
205
+ icon="pi pi-cloud-upload"
206
+ [text]="true"
207
+ size="small"
208
+ [disabled]="loading"
209
+ (onClick)="choose(chooseCallback)" />
210
+ </ng-template>
211
+ </p-fileUpload>
212
+ }
213
+
214
+ <div class="upload-renderer-files">
215
+ @for (file of fileList; track index; let index = $index) {
216
+ <div class="upload-renderer-file">
217
+ <a
218
+ class="upload-renderer-file-name"
219
+ [href]="getDownloadUrl(file)"
220
+ [download]="file"
221
+ target="_blank"
222
+ (click)="$event.stopPropagation()"
223
+ >{{ file }}</a
224
+ >
225
+ @if (!isDisabled()) {
226
+ <p-button
227
+ icon="pi pi-times"
228
+ severity="danger"
229
+ size="small"
230
+ [text]="true"
231
+ [disabled]="loading"
232
+ (onClick)="deleteHandler(file, index)" />
233
+ }
234
+ </div>
235
+ }
236
+ </div>
237
+ </div>
238
+ `, styles: [".upload-renderer{display:flex;flex-direction:column;align-items:flex-start;justify-content:center;gap:2px;width:100%;min-width:0;padding:2px 0}:host ::ng-deep .upload-renderer-choose{display:inline-flex;align-items:center;width:28px;height:28px;border:0;background:transparent}:host ::ng-deep .upload-renderer-choose .p-fileupload-header{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border:0;background:transparent}:host ::ng-deep .upload-renderer-choose .p-fileupload-content{display:none;padding:0;border:0}:host ::ng-deep .upload-renderer-choose .p-button,:host ::ng-deep .upload-renderer-choose p-button{width:28px;height:28px;padding:0}:host ::ng-deep .upload-renderer-choose .p-button-label{display:none}.upload-renderer-files{display:flex;flex-direction:column;align-items:stretch;gap:2px;width:100%;min-width:0;overflow:hidden}.upload-renderer-file{display:flex;align-items:center;justify-content:space-between;gap:4px;min-width:0;width:100%}.upload-renderer-file-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--p-primary-color);text-decoration:none}.upload-renderer-file-name:hover{text-decoration:underline}\n"] }]
239
+ }] });
240
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLXJlbmRlcmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaW1tLWVsZW1lbnQtdWkvc3JjL2xpYi9ncmlkL2NlbGwtcmVuZGVyL3VwbG9hZC1yZW5kZXJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFhLGFBQWEsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUl6RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFjLE1BQU0sTUFBTSxDQUFDOzs7QUFrSnBELE1BQU0sT0FBTyxjQUFjO0lBbkkzQjtRQW9JUyxTQUFJLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRWxDLGlCQUFZLEdBQXlCLEVBQUUsQ0FBQztRQUN4QyxhQUFRLEdBQWEsRUFBRSxDQUFDO1FBQ3hCLFlBQU8sR0FBRyxLQUFLLENBQUM7S0E4SGhCO0lBNUhBLE1BQU0sQ0FBQyxNQUEyQjtRQUNqQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxPQUFPLENBQUMsTUFBMkI7UUFDbEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QyxPQUFPLElBQUksQ0FBQztJQUNiLENBQUM7SUFFRCxNQUFNLENBQUMs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UUFDOUIsQ0FBQztRQUNELE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzlGLENBQUM7SUFFTyxPQUFPLENBQUMsS0FBZTtRQUM5QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEIsQ0FBQzsrR0FsSVcsY0FBYzttR0FBZCxjQUFjLHdFQWhJaEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXNEVCwwdkNBdkRTLFlBQVksa2JBQUUsVUFBVTs7NEZBaUl0QixjQUFjO2tCQW5JMUIsU0FBUztpQ0FDRyxJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLFlBQ3pCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFzRFQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEV2ZW50LCBIdHRwRXZlbnRUeXBlLCBIdHRwUmVxdWVzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB0eXBlIHsgSUNlbGxSZW5kZXJlckFuZ3VsYXJDb21wIH0gZnJvbSAnYWctZ3JpZC1hbmd1bGFyJztcbmltcG9ydCB0eXBlIHsgSUNlbGxSZW5kZXJlclBhcmFtcyB9IGZyb20gJ2FnLWdyaWQtY29tbXVuaXR5JztcbmltcG9ydCB7IEdyaWRDb21wb25lbnQgfSBmcm9tICcuLi9ncmlkL2dyaWQuY29tcG9uZW50JztcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcbmltcG9ydCB7IEZpbGVVcGxvYWQgfSBmcm9tICdwcmltZW5nL2ZpbGV1cGxvYWQnO1xuaW1wb3J0IHsgZmlsdGVyLCBmb3JrSm9pbiwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVwbG9hZFJlbmRlcmVyUGFyYW1zIHtcblx0dXJsPzogc3RyaW5nO1xuXHRkZWxldGVVcmw/OiBzdHJpbmc7XG5cdGRvd25sb2FkQmFzZVVybD86IHN0cmluZztcblx0bXVsdGlwbGU/OiBib29sZWFuO1xuXHRhY2NlcHQ/OiBzdHJpbmc7XG5cdG1heEZpbGVTaXplPzogbnVtYmVyO1xuXHRmaWxlTGltaXQ/OiBudW1iZXI7XG5cdG5hbWU/OiBzdHJpbmc7XG5cdHdpdGhDcmVkZW50aWFscz86IGJvb2xlYW47XG5cdGRpc2FibGVkPzogYm9vbGVhbiB8ICgocGFyYW1zOiBJQ2VsbFJlbmRlcmVyUGFyYW1zKSA9PiBib29sZWFuKTtcbn1cblxuQENvbXBvbmVudCh7XG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdGltcG9ydHM6IFtCdXR0b25Nb2R1bGUsIEZpbGVVcGxvYWRdLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxkaXYgY2xhc3M9XCJ1cGxvYWQtcmVuZGVyZXJcIj5cblx0XHRcdEBpZiAoIWlzRGlzYWJsZWQoKSkge1xuXHRcdFx0XHQ8cC1maWxlVXBsb2FkXG5cdFx0XHRcdFx0I2Z1XG5cdFx0XHRcdFx0YXV0b1xuXHRcdFx0XHRcdG1vZGU9XCJhZHZhbmNlZFwiXG5cdFx0XHRcdFx0W25hbWVdPVwidXBsb2FkUGFyYW1zLm5hbWUgfHwgJ2ZpbGUnXCJcblx0XHRcdFx0XHRbbXVsdGlwbGVdPVwidXBsb2FkUGFyYW1zLm11bHRpcGxlID8/IHRydWVcIlxuXHRcdFx0XHRcdFthY2NlcHRdPVwidXBsb2FkUGFyYW1zLmFjY2VwdFwiXG5cdFx0XHRcdFx0W21heEZpbGVTaXplXT1cInVwbG9hZFBhcmFtcy5tYXhGaWxlU2l6ZVwiXG5cdFx0XHRcdFx0W2ZpbGVMaW1pdF09XCJ1cGxvYWRQYXJhbXMuZmlsZUxpbWl0XCJcblx0XHRcdFx0XHRbd2l0aENyZWRlbnRpYWxzXT1cInVwbG9hZFBhcmFtcy53aXRoQ3JlZGVudGlhbHMgPz8gZmFsc2VcIlxuXHRcdFx0XHRcdFtjdXN0b21VcGxvYWRdPVwidHJ1ZVwiXG5cdFx0XHRcdFx0W2Rpc2FibGVkXT1cImxvYWRpbmdcIlxuXHRcdFx0XHRcdFtzdHlsZUNsYXNzXT1cIid1cGxvYWQtcmVuZGVyZXItY2hvb3NlJ1wiXG5cdFx0XHRcdFx0KHVwbG9hZEhhbmRsZXIpPVwidXBsb2FkSGFuZGxlcigkZXZlbnQsIGZ1KVwiPlxuXHRcdFx0XHRcdDxuZy10ZW1wbGF0ZVxuXHRcdFx0XHRcdFx0I2hlYWRlclxuXHRcdFx0XHRcdFx0bGV0LWNob29zZUNhbGxiYWNrPVwiY2hvb3NlQ2FsbGJhY2tcIj5cblx0XHRcdFx0XHRcdDxwLWJ1dHRvblxuXHRcdFx0XHRcdFx0XHRpY29uPVwicGkgcGktY2xvdWQtdXBsb2FkXCJcblx0XHRcdFx0XHRcdFx0W3RleHRdPVwidHJ1ZVwiXG5cdFx0XHRcdFx0XHRcdHNpemU9XCJzbWFsbFwiXG5cdFx0XHRcdFx0XHRcdFtkaXNhYmxlZF09XCJsb2FkaW5nXCJcblx0XHRcdFx0XHRcdFx0KG9uQ2xpY2spPVwiY2hvb3NlKGNob29zZUNhbGxiYWNrKVwiIC8+XG5cdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRcdFx0PC9wLWZpbGVVcGxvYWQ+XG5cdFx0XHR9XG5cblx0XHRcdDxkaXYgY2xhc3M9XCJ1cGxvYWQtcmVuZGVyZXItZmlsZXNcIj5cblx0XHRcdFx0QGZvciAoZmlsZSBvZiBmaWxlTGlzdDsgdHJhY2sgaW5kZXg7IGxldCBpbmRleCA9ICRpbmRleCkge1xuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ1cGxvYWQtcmVuZGVyZXItZmlsZVwiPlxuXHRcdFx0XHRcdFx0PGFcblx0XHRcdFx0XHRcdFx0Y2xhc3M9XCJ1cGxvYWQtcmVuZGVyZXItZmlsZS1uYW1lXCJcblx0XHRcdFx0XHRcdFx0W2hyZWZdPVwiZ2V0RG93bmxvYWRVcmwoZmlsZSlcIlxuXHRcdFx0XHRcdFx0XHRbZG93bmxvYWRdPVwiZmlsZVwiXG5cdFx0XHRcdFx0XHRcdHRhcmdldD1cIl9ibGFua1wiXG5cdFx0XHRcdFx0XHRcdChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuXHRcdFx0XHRcdFx0XHQ+e3sgZmlsZSB9fTwvYVxuXHRcdFx0XHRcdFx0PlxuXHRcdFx0XHRcdFx0QGlmICghaXNEaXNhYmxlZCgpKSB7XG5cdFx0XHRcdFx0XHRcdDxwLWJ1dHRvblxuXHRcdFx0XHRcdFx0XHRcdGljb249XCJwaSBwaS10aW1lc1wiXG5cdFx0XHRcdFx0XHRcdFx0c2V2ZXJpdHk9XCJkYW5nZXJcIlxuXHRcdFx0XHRcdFx0XHRcdHNpemU9XCJzbWFsbFwiXG5cdFx0XHRcdFx0XHRcdFx0W3RleHRdPVwidHJ1ZVwiXG5cdFx0XHRcdFx0XHRcdFx0W2Rpc2FibGVkXT1cImxvYWRpbmdcIlxuXHRcdFx0XHRcdFx0XHRcdChvbkNsaWNrKT1cImRlbGV0ZUhhbmRsZXIoZmlsZSwgaW5kZXgpXCIgLz5cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0fVxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+XG5cdGAsXG5cdHN0eWxlczogYFxuXHRcdC51cGxvYWQtcmVuZGVyZXIge1xuXHRcdFx0ZGlzcGxheTogZmxleDtcblx0XHRcdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdFx0XHRhbGlnbi1pdGVtczogZmxleC1zdGFydDtcblx0XHRcdGp1c3RpZnktY29udGVudDogY2VudGVyO1xuXHRcdFx0Z2FwOiAycHg7XG5cdFx0XHR3aWR0aDogMTAwJTtcblx0XHRcdG1pbi13aWR0aDogMDtcblx0XHRcdHBhZGRpbmc6IDJweCAwO1xuXHRcdH1cblx0XHQ6aG9zdCA6Om5nLWRlZXAgLnVwbG9hZC1yZW5kZXJlci1jaG9vc2Uge1xuXHRcdFx0ZGlzcGxheTogaW5saW5lLWZsZXg7XG5cdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRcdFx0d2lkdGg6IDI4cHg7XG5cdFx0XHRoZWlnaHQ6IDI4cHg7XG5cdFx0XHRib3JkZXI6IDA7XG5cdFx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0XHR9XG5cdFx0Omhvc3QgOjpuZy1kZWVwIC51cGxvYWQtcmVuZGVyZXItY2hvb3NlIC5wLWZpbGV1cGxvYWQtaGVhZGVyIHtcblx0XHRcdGRpc3BsYXk6IGZsZXg7XG5cdFx0XHRhbGlnbi1pdGVtczogY2VudGVyO1xuXHRcdFx0anVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG5cdFx0XHR3aWR0aDogMjhweDtcblx0XHRcdGhlaWdodDogMjhweDtcblx0XHRcdHBhZGRpbmc6IDA7XG5cdFx0XHRib3JkZXI6IDA7XG5cdFx0XHRiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcblx0XHR9XG5cdFx0Omhvc3QgOjpuZy1kZWVwIC51cGxvYWQtcmVuZGVyZXItY2hvb3NlIC5wLWZpbGV1cGxvYWQtY29udGVudCB7XG5cdFx0XHRkaXNwbGF5OiBub25lO1xuXHRcdFx0cGFkZGluZzogMDtcblx0XHRcdGJvcmRlcjogMDtcblx0XHR9XG5cdFx0Omhvc3QgOjpuZy1kZWVwIC51cGxvYWQtcmVuZGVyZXItY2hvb3NlIC5wLWJ1dHRvbixcblx0XHQ6aG9zdCA6Om5nLWRlZXAgLnVwbG9hZC1yZW5kZXJlci1jaG9vc2UgcC1idXR0b24ge1xuXHRcdFx0d2lkdGg6IDI4cHg7XG5cdFx0XHRoZWlnaHQ6IDI4cHg7XG5cdFx0XHRwYWRkaW5nOiAwO1xuXHRcdH1cblx0XHQ6aG9zdCA6Om5nLWRlZXAgLnVwbG9hZC1yZW5kZXJlci1jaG9vc2UgLnAtYnV0dG9uLWxhYmVsIHtcblx0XHRcdGRpc3BsYXk6IG5vbmU7XG5cdFx0fVxuXHRcdC51cGxvYWQtcmVuZGVyZXItZmlsZXMge1xuXHRcdFx0ZGlzcGxheTogZmxleDtcblx0XHRcdGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cdFx0XHRhbGlnbi1pdGVtczogc3RyZXRjaDtcblx0XHRcdGdhcDogMnB4O1xuXHRcdFx0d2lkdGg6IDEwMCU7XG5cdFx0XHRtaW4td2lkdGg6IDA7XG5cdFx0XHRvdmVyZmxvdzogaGlkZGVuO1xuXHRcdH1cblx0XHQudXBsb2FkLXJlbmRlcmVyLWZpbGUge1xuXHRcdFx0ZGlzcGxheTogZmxleDtcblx0XHRcdGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cdFx0XHRqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG5cdFx0XHRnYXA6IDRweDtcblx0XHRcdG1pbi13aWR0aDogMDtcblx0XHRcdHdpZHRoOiAxMDAlO1xuXHRcdH1cblx0XHQudXBsb2FkLXJlbmRlcmVyLWZpbGUtbmFtZSB7XG5cdFx0XHRtaW4td2lkdGg6IDA7XG5cdFx0XHRvdmVyZmxvdzogaGlkZGVuO1xuXHRcdFx0dGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG5cdFx0XHR3aGl0ZS1zcGFjZTogbm93cmFwO1xuXHRcdFx0Y29sb3I6IHZhcigtLXAtcHJpbWFyeS1jb2xvcik7XG5cdFx0XHR0ZXh0LWRlY29yYXRpb246IG5vbmU7XG5cdFx0fVxuXHRcdC51cGxvYWQtcmVuZGVyZXItZmlsZS1uYW1lOmhvdmVyIHtcblx0XHRcdHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuXHRcdH1cblx0YCxcbn0pXG5leHBvcnQgY2xhc3MgVXBsb2FkUmVuZGVyZXIgaW1wbGVtZW50cyBJQ2VsbFJlbmRlcmVyQW5ndWxhckNvbXAge1xuXHRwcml2YXRlIGh0dHAgPSBpbmplY3QoSHR0cENsaWVudCk7XG5cdHBhcmFtcyE6IElDZWxsUmVuZGVyZXJQYXJhbXM7XG5cdHVwbG9hZFBhcmFtczogVXBsb2FkUmVuZGVyZXJQYXJhbXMgPSB7fTtcblx0ZmlsZUxpc3Q6IHN0cmluZ1tdID0gW107XG5cdGxvYWRpbmcgPSBmYWxzZTtcblxuXHRhZ0luaXQocGFyYW1zOiBJQ2VsbFJlbmRlcmVyUGFyYW1zKTogdm9pZCB7XG5cdFx0dGhpcy5yZWZyZXNoKHBhcmFtcyk7XG5cdH1cblxuXHRyZWZyZXNoKHBhcmFtczogSUNlbGxSZW5kZXJlclBhcmFtcyk6IGJvb2xlYW4ge1xuXHRcdHRoaXMucGFyYW1zID0gcGFyYW1zO1xuXHRcdHRoaXMudXBsb2FkUGFyYW1zID0gdGhpcy5yZXNvbHZlVXBsb2FkUGFyYW1zKHBhcmFtcyk7XG5cdFx0dGhpcy5maWxlTGlzdCA9IHRoaXMudG9GaWxlTGlzdChwYXJhbXMudmFsdWUpO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Y2hvb3NlKGNhbGxiYWNrOiAoKSA9PiB2b2lkKSB7XG5cdFx0aWYgKHRoaXMuaXNEaXNhYmxlZCgpIHx8IHRoaXMubG9hZGluZykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjYWxsYmFjaygpO1xuXHR9XG5cblx0dXBsb2FkSGFuZGxlcihldmVudDogYW55LCBmdTogYW55KSB7XG5cdFx0Y29uc3QgZmlsZXMgPSBBcnJheS5mcm9tKGV2ZW50LmZpbGVzIHx8IFtdKSBhcyBGaWxlW107XG5cdFx0aWYgKCFmaWxlcy5sZW5ndGggfHwgdGhpcy5pc0Rpc2FibGVkKCkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgdXBsb2FkUmVxdWVzdHM6IE9ic2VydmFibGU8YW55PltdID0gZmlsZXMubWFwKChmaWxlKSA9PiB0aGlzLnVwbG9hZEZpbGUoZmlsZSkpO1xuXHRcdHRoaXMubG9hZGluZyA9IHRydWU7XG5cdFx0Zm9ya0pvaW4odXBsb2FkUmVxdWVzdHMpLnN1YnNjcmliZSh7XG5cdFx0XHRuZXh0OiAocmVzcG9uc2VzKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHVwbG9hZGVkRmlsZXMgPSByZXNwb25zZXMubWFwKChyZXNwb25zZTogYW55KSA9PiByZXNwb25zZS5ib2R5Py5maWxlTmFtZSkuZmlsdGVyKEJvb2xlYW4pO1xuXHRcdFx0XHR0aGlzLmZpbGVMaXN0ID0gWy4uLnRoaXMuZmlsZUxpc3QsIC4uLnVwbG9hZGVkRmlsZXNdO1xuXHRcdFx0XHR0aGlzLmNvbW1pdFZhbHVlKCk7XG5cdFx0XHRcdGZ1LmNsZWFyKCk7XG5cdFx0XHR9LFxuXHRcdFx0ZXJyb3I6ICgpID0+IHtcblx0XHRcdFx0dGhpcy5sb2FkaW5nID0gZmFsc2U7XG5cdFx0XHRcdGZ1LmNsZWFyKCk7XG5cdFx0XHR9LFxuXHRcdH0pO1xuXHR9XG5cblx0ZGVsZXRlSGFuZGxlcihmaWxlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpIHtcblx0XHRpZiAodGhpcy5pc0Rpc2FibGVkKCkgfHwgdGhpcy5sb2FkaW5nKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMubG9hZGluZyA9IHRydWU7XG5cdFx0dGhpcy5kZWxGaWxlKGZpbGUpLnN1YnNjcmliZSh7XG5cdFx0XHRuZXh0OiAoKSA9PiB7XG5cdFx0XHRcdHRoaXMuZmlsZUxpc3QgPSB0aGlzLmZpbGVMaXN0LmZpbHRlcigoXywgZmlsZUluZGV4KSA9PiBmaWxlSW5kZXggIT09IGluZGV4KTtcblx0XHRcdFx0dGhpcy5jb21taXRWYWx1ZSgpO1xuXHRcdFx0fSxcblx0XHRcdGVycm9yOiAoKSA9PiB7XG5cdFx0XHRcdHRoaXMubG9hZGluZyA9IGZhbHNlO1xuXHRcdFx0fSxcblx0XHR9KTtcblx0fVxuXG5cdGlzRGlzYWJsZWQoKTogYm9vbGVhbiB7XG5cdFx0aWYgKHR5cGVvZiB0aGlzLnVwbG9hZFBhcmFtcy5kaXNhYmxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0cmV0dXJuIHRoaXMudXBsb2FkUGFyYW1zLmRpc2FibGVkKHRoaXMucGFyYW1zKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMudXBsb2FkUGFyYW1zLmRpc2FibGVkICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLnVwbG9hZFBhcmFtcy5kaXNhYmxlZDtcblx0XHR9XG5cdFx0cmV0dXJuIEJvb2xlYW4odGhpcy5wYXJhbXMuY29udGV4dD8uZ3JpZERpc2FibGVkPy4oKSk7XG5cdH1cblxuXHRnZXREb3dubG9hZFVybChmaWxlOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGJhc2VVcmwgPSB0aGlzLnVwbG9hZFBhcmFtcy5kb3dubG9hZEJhc2VVcmwgPz8gJ2h0dHBzOi8vZmlsZS1maWxlci5teWZvb2RpZXBldC5jb20vJztcblx0XHRyZXR1cm4gYCR7YmFzZVVybC5lbmRzV2l0aCgnLycpID8gYmFzZVVybCA6IGAke2Jhc2VVcmx9L2B9JHtmaWxlfWA7XG5cdH1cblxuXHRwcml2YXRlIHVwbG9hZEZpbGUoZmlsZTogRmlsZSk6IE9ic2VydmFibGU8YW55PiB7XG5cdFx0Y29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcblx0XHRmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlKTtcblx0XHRyZXR1cm4gdGhpcy5odHRwXG5cdFx0XHQucmVxdWVzdChcblx0XHRcdFx0bmV3IEh0dHBSZXF1ZXN0KCdQT1NUJywgdGhpcy51cGxvYWRQYXJhbXMudXJsID8/ICdmaWxlclVwbG9hZCcsIGZvcm1EYXRhLCB7XG5cdFx0XHRcdFx0cmVwb3J0UHJvZ3Jlc3M6IHRydWUsXG5cdFx0XHRcdFx0d2l0aENyZWRlbnRpYWxzOiB0aGlzLnVwbG9hZFBhcmFtcy53aXRoQ3JlZGVudGlhbHMgPz8gZmFsc2UsXG5cdFx0XHRcdH0pLFxuXHRcdFx0KVxuXHRcdFx0LnBpcGUoZmlsdGVyKChyZXNwb25zZTogSHR0cEV2ZW50PGFueT4pID0+IHJlc3BvbnNlLnR5cGUgPT0gSHR0cEV2ZW50VHlwZS5SZXNwb25zZSkpO1xuXHR9XG5cblx0cHJpdmF0ZSBkZWxGaWxlKGZpbGU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5wb3N0KHRoaXMudXBsb2FkUGFyYW1zLmRlbGV0ZVVybCA/PyAnZmlsZXJEZWxldGUnLCB7IGZpbGVOYW1lOiBmaWxlIH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBjb21taXRWYWx1ZSgpIHtcblx0XHR0aGlzLmxvYWRpbmcgPSBmYWxzZTtcblx0XHRjb25zdCBmaWVsZCA9IHRoaXMucGFyYW1zLmNvbERlZj8uZmllbGQ7XG5cdFx0aWYgKCFmaWVsZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBvbGRWYWx1ZSA9IHRoaXMucGFyYW1zLmRhdGE/LltmaWVsZF07XG5cdFx0Y29uc3QgbmV3VmFsdWUgPSB0aGlzLnRvVmFsdWUodGhpcy5maWxlTGlzdCk7XG5cdFx0Y29uc3QgZ3JpZDogR3JpZENvbXBvbmVudCB8IHVuZGVmaW5lZCA9IHRoaXMucGFyYW1zLmNvbnRleHQ/LmdyaWQ/LigpO1xuXHRcdHRoaXMucGFyYW1zLmRhdGFbZmllbGRdID0gbmV3VmFsdWU7XG5cdFx0Z3JpZD8uY2VsbFZhbHVlQ2hhbmdlZCh7XG5cdFx0XHRjb2xEZWY6IHRoaXMucGFyYW1zLmNvbERlZixcblx0XHRcdG9sZFZhbHVlLFxuXHRcdFx0bmV3VmFsdWUsXG5cdFx0XHRyb3dJbmRleDogdGhpcy5wYXJhbXMubm9kZS5yb3dJbmRleCxcblx0XHRcdGRhdGE6IHRoaXMucGFyYW1zLmRhdGEsXG5cdFx0fSBhcyBhbnkpO1xuXHRcdHNldFRpbWVvdXQoKCkgPT4gdGhpcy5wYXJhbXMuYXBpLnJlc2V0Um93SGVpZ2h0cygpKTtcblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZVVwbG9hZFBhcmFtcyhwYXJhbXM6IElDZWxsUmVuZGVyZXJQYXJhbXMpOiBVcGxvYWRSZW5kZXJlclBhcmFtcyB7XG5cdFx0aWYgKHR5cGVvZiBwYXJhbXMuY29sRGVmPy5jZWxsUmVuZGVyZXJQYXJhbXMgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdHJldHVybiBwYXJhbXMuY29sRGVmLmNlbGxSZW5kZXJlclBhcmFtcyhwYXJhbXMpIHx8IHt9O1xuXHRcdH1cblx0XHRyZXR1cm4gcGFyYW1zLmNvbERlZj8uY2VsbFJlbmRlcmVyUGFyYW1zIHx8IHt9O1xuXHR9XG5cblx0cHJpdmF0ZSB0b0ZpbGVMaXN0KHZhbHVlOiBhbnkpOiBzdHJpbmdbXSB7XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWUuZmlsdGVyKEJvb2xlYW4pO1xuXHRcdH1cblx0XHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5sZW5ndGggPiAwID8gdmFsdWUuc3BsaXQoJzsnKS5maWx0ZXIoQm9vbGVhbikgOiBbXTtcblx0fVxuXG5cdHByaXZhdGUgdG9WYWx1ZShmaWxlczogc3RyaW5nW10pOiBzdHJpbmcge1xuXHRcdHJldHVybiBmaWxlcy5qb2luKCc7Jyk7XG5cdH1cbn1cbiJdfQ==