valtech-components 2.0.416 → 2.0.418

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.
@@ -1,421 +0,0 @@
1
- /**
2
- * Storage Service
3
- *
4
- * Servicio para operaciones de Firebase Storage.
5
- * Soporta upload con tracking de progreso, download y gestión de archivos.
6
- */
7
- import { inject, Injectable } from '@angular/core';
8
- import { deleteObject, getDownloadURL, getMetadata, listAll, ref, Storage, uploadBytesResumable, } from '@angular/fire/storage';
9
- import { BehaviorSubject } from 'rxjs';
10
- import * as i0 from "@angular/core";
11
- /**
12
- * Servicio para Firebase Storage.
13
- *
14
- * @example
15
- * ```typescript
16
- * @Component({...})
17
- * export class FileUploadComponent {
18
- * private storage = inject(StorageService);
19
- *
20
- * uploadProgress = signal<number>(0);
21
- * downloadUrl = signal<string | null>(null);
22
- *
23
- * async onFileSelected(event: Event) {
24
- * const file = (event.target as HTMLInputElement).files?.[0];
25
- * if (!file) return;
26
- *
27
- * // Upload con progreso
28
- * this.storage.upload(`uploads/${file.name}`, file).subscribe({
29
- * next: (progress) => this.uploadProgress.set(progress.percentage),
30
- * complete: async () => {
31
- * const url = await this.storage.getDownloadUrl(`uploads/${file.name}`);
32
- * this.downloadUrl.set(url);
33
- * }
34
- * });
35
- * }
36
- * }
37
- * ```
38
- */
39
- export class StorageService {
40
- constructor() {
41
- this.storage = inject(Storage);
42
- }
43
- // ===========================================================================
44
- // UPLOAD
45
- // ===========================================================================
46
- /**
47
- * Sube un archivo con tracking de progreso.
48
- *
49
- * @param path - Ruta en Storage donde guardar el archivo
50
- * @param file - Archivo a subir (File o Blob)
51
- * @param metadata - Metadata opcional (contentType, customMetadata)
52
- * @returns Observable que emite el progreso y completa cuando termina
53
- *
54
- * @example
55
- * ```typescript
56
- * // Upload básico
57
- * storage.upload('images/photo.jpg', file).subscribe({
58
- * next: (progress) => console.log(`${progress.percentage}%`),
59
- * complete: () => console.log('Upload completado')
60
- * });
61
- *
62
- * // Con metadata
63
- * storage.upload('docs/report.pdf', file, {
64
- * contentType: 'application/pdf',
65
- * customMetadata: { uploadedBy: 'user123' }
66
- * }).subscribe(...);
67
- * ```
68
- */
69
- upload(path, file, metadata) {
70
- const storageRef = ref(this.storage, path);
71
- const uploadMetadata = {
72
- contentType: metadata?.contentType || (file instanceof File ? file.type : undefined),
73
- customMetadata: metadata?.customMetadata,
74
- cacheControl: metadata?.cacheControl,
75
- };
76
- const task = uploadBytesResumable(storageRef, file, uploadMetadata);
77
- const progress$ = new BehaviorSubject({
78
- bytesTransferred: 0,
79
- totalBytes: file.size,
80
- percentage: 0,
81
- state: 'running',
82
- });
83
- task.on('state_changed', (snapshot) => {
84
- progress$.next({
85
- bytesTransferred: snapshot.bytesTransferred,
86
- totalBytes: snapshot.totalBytes,
87
- percentage: Math.round((snapshot.bytesTransferred / snapshot.totalBytes) * 100),
88
- state: this.mapTaskState(snapshot.state),
89
- });
90
- }, (error) => {
91
- progress$.next({
92
- bytesTransferred: 0,
93
- totalBytes: file.size,
94
- percentage: 0,
95
- state: 'error',
96
- });
97
- progress$.error(this.getErrorMessage(error));
98
- }, () => {
99
- progress$.next({
100
- bytesTransferred: file.size,
101
- totalBytes: file.size,
102
- percentage: 100,
103
- state: 'success',
104
- });
105
- progress$.complete();
106
- });
107
- return progress$.asObservable();
108
- }
109
- /**
110
- * Sube un archivo y retorna la URL de descarga al completar.
111
- *
112
- * @param path - Ruta en Storage
113
- * @param file - Archivo a subir
114
- * @param metadata - Metadata opcional
115
- * @returns Resultado del upload con URL de descarga
116
- *
117
- * @example
118
- * ```typescript
119
- * const result = await storage.uploadAndGetUrl('avatars/user123.jpg', file);
120
- * console.log('URL:', result.downloadUrl);
121
- * ```
122
- */
123
- async uploadAndGetUrl(path, file, metadata) {
124
- return new Promise((resolve, reject) => {
125
- this.upload(path, file, metadata).subscribe({
126
- complete: async () => {
127
- try {
128
- const storageRef = ref(this.storage, path);
129
- const downloadUrl = await getDownloadURL(storageRef);
130
- const storedMetadata = await getMetadata(storageRef);
131
- resolve({
132
- downloadUrl,
133
- fullPath: storedMetadata.fullPath,
134
- name: storedMetadata.name,
135
- size: storedMetadata.size,
136
- contentType: storedMetadata.contentType || 'application/octet-stream',
137
- metadata: storedMetadata.customMetadata || {},
138
- });
139
- }
140
- catch (error) {
141
- reject(this.getErrorMessage(error));
142
- }
143
- },
144
- error: (error) => reject(error),
145
- });
146
- });
147
- }
148
- /**
149
- * Sube un archivo desde una Data URL (base64).
150
- *
151
- * @param path - Ruta en Storage
152
- * @param dataUrl - Data URL (ej: 'data:image/png;base64,...')
153
- * @param metadata - Metadata opcional
154
- * @returns Resultado del upload
155
- *
156
- * @example
157
- * ```typescript
158
- * // Desde canvas
159
- * const dataUrl = canvas.toDataURL('image/png');
160
- * const result = await storage.uploadFromDataUrl('images/drawing.png', dataUrl);
161
- * ```
162
- */
163
- async uploadFromDataUrl(path, dataUrl, metadata) {
164
- // Extraer content type y datos base64
165
- const matches = dataUrl.match(/^data:([^;]+);base64,(.+)$/);
166
- if (!matches) {
167
- throw new Error('Data URL inválida');
168
- }
169
- const contentType = matches[1];
170
- const base64Data = matches[2];
171
- // Convertir base64 a Blob
172
- const byteCharacters = atob(base64Data);
173
- const byteNumbers = new Array(byteCharacters.length);
174
- for (let i = 0; i < byteCharacters.length; i++) {
175
- byteNumbers[i] = byteCharacters.charCodeAt(i);
176
- }
177
- const byteArray = new Uint8Array(byteNumbers);
178
- const blob = new Blob([byteArray], { type: contentType });
179
- return this.uploadAndGetUrl(path, blob, {
180
- contentType,
181
- ...metadata,
182
- });
183
- }
184
- // ===========================================================================
185
- // DOWNLOAD
186
- // ===========================================================================
187
- /**
188
- * Obtiene la URL de descarga de un archivo.
189
- *
190
- * @param path - Ruta del archivo en Storage
191
- * @returns URL de descarga
192
- *
193
- * @example
194
- * ```typescript
195
- * const url = await storage.getDownloadUrl('images/photo.jpg');
196
- * // Usar en <img [src]="url">
197
- * ```
198
- */
199
- async getDownloadUrl(path) {
200
- try {
201
- const storageRef = ref(this.storage, path);
202
- return await getDownloadURL(storageRef);
203
- }
204
- catch (error) {
205
- throw new Error(this.getErrorMessage(error));
206
- }
207
- }
208
- /**
209
- * Obtiene la metadata de un archivo.
210
- *
211
- * @param path - Ruta del archivo
212
- * @returns Metadata del archivo
213
- */
214
- async getMetadata(path) {
215
- try {
216
- const storageRef = ref(this.storage, path);
217
- const metadata = await getMetadata(storageRef);
218
- return {
219
- contentType: metadata.contentType,
220
- customMetadata: metadata.customMetadata,
221
- cacheControl: metadata.cacheControl,
222
- size: metadata.size,
223
- name: metadata.name,
224
- };
225
- }
226
- catch (error) {
227
- throw new Error(this.getErrorMessage(error));
228
- }
229
- }
230
- // ===========================================================================
231
- // DELETE
232
- // ===========================================================================
233
- /**
234
- * Elimina un archivo.
235
- *
236
- * @param path - Ruta del archivo a eliminar
237
- *
238
- * @example
239
- * ```typescript
240
- * await storage.delete('images/old-photo.jpg');
241
- * ```
242
- */
243
- async delete(path) {
244
- try {
245
- const storageRef = ref(this.storage, path);
246
- await deleteObject(storageRef);
247
- }
248
- catch (error) {
249
- throw new Error(this.getErrorMessage(error));
250
- }
251
- }
252
- /**
253
- * Elimina múltiples archivos.
254
- *
255
- * @param paths - Array de rutas a eliminar
256
- *
257
- * @example
258
- * ```typescript
259
- * await storage.deleteMultiple([
260
- * 'images/photo1.jpg',
261
- * 'images/photo2.jpg'
262
- * ]);
263
- * ```
264
- */
265
- async deleteMultiple(paths) {
266
- await Promise.all(paths.map((path) => this.delete(path)));
267
- }
268
- // ===========================================================================
269
- // LIST
270
- // ===========================================================================
271
- /**
272
- * Lista archivos en un directorio.
273
- *
274
- * @param path - Ruta del directorio
275
- * @returns Lista de rutas de archivos
276
- *
277
- * @example
278
- * ```typescript
279
- * const result = await storage.list('images/');
280
- * console.log(result.items); // ['images/photo1.jpg', 'images/photo2.jpg']
281
- * ```
282
- */
283
- async list(path) {
284
- try {
285
- const storageRef = ref(this.storage, path);
286
- const result = await listAll(storageRef);
287
- return {
288
- items: result.items.map((item) => item.fullPath),
289
- nextPageToken: undefined, // listAll no soporta paginación
290
- };
291
- }
292
- catch (error) {
293
- throw new Error(this.getErrorMessage(error));
294
- }
295
- }
296
- // ===========================================================================
297
- // UTILIDADES
298
- // ===========================================================================
299
- /**
300
- * Genera un nombre de archivo único con timestamp.
301
- *
302
- * @param originalName - Nombre original del archivo
303
- * @param prefix - Prefijo opcional
304
- * @returns Nombre único
305
- *
306
- * @example
307
- * ```typescript
308
- * const uniqueName = storage.generateFileName('photo.jpg', 'user123');
309
- * // => 'user123_1703091234567_photo.jpg'
310
- * ```
311
- */
312
- generateFileName(originalName, prefix) {
313
- const timestamp = Date.now();
314
- const sanitizedName = originalName.replace(/[^a-zA-Z0-9.-]/g, '_');
315
- if (prefix) {
316
- return `${prefix}_${timestamp}_${sanitizedName}`;
317
- }
318
- return `${timestamp}_${sanitizedName}`;
319
- }
320
- /**
321
- * Genera una ruta única para un archivo.
322
- *
323
- * @param directory - Directorio base
324
- * @param originalName - Nombre original
325
- * @param prefix - Prefijo opcional
326
- * @returns Ruta completa única
327
- *
328
- * @example
329
- * ```typescript
330
- * const path = storage.generatePath('uploads', 'photo.jpg', 'user123');
331
- * // => 'uploads/user123_1703091234567_photo.jpg'
332
- * ```
333
- */
334
- generatePath(directory, originalName, prefix) {
335
- const fileName = this.generateFileName(originalName, prefix);
336
- const cleanDir = directory.replace(/\/+$/, ''); // Remover / final
337
- return `${cleanDir}/${fileName}`;
338
- }
339
- /**
340
- * Obtiene la extensión de un archivo.
341
- *
342
- * @param filename - Nombre del archivo
343
- * @returns Extensión (sin el punto)
344
- */
345
- getExtension(filename) {
346
- const parts = filename.split('.');
347
- return parts.length > 1 ? parts.pop().toLowerCase() : '';
348
- }
349
- /**
350
- * Verifica si un archivo es una imagen basándose en su extensión.
351
- */
352
- isImage(filename) {
353
- const ext = this.getExtension(filename);
354
- return ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'bmp'].includes(ext);
355
- }
356
- /**
357
- * Verifica si un archivo es un documento.
358
- */
359
- isDocument(filename) {
360
- const ext = this.getExtension(filename);
361
- return ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'txt'].includes(ext);
362
- }
363
- // ===========================================================================
364
- // MÉTODOS PRIVADOS
365
- // ===========================================================================
366
- /**
367
- * Mapea el estado de la tarea de upload
368
- */
369
- mapTaskState(state) {
370
- switch (state) {
371
- case 'running':
372
- return 'running';
373
- case 'paused':
374
- return 'paused';
375
- case 'success':
376
- return 'success';
377
- case 'canceled':
378
- return 'canceled';
379
- case 'error':
380
- return 'error';
381
- default:
382
- return 'running';
383
- }
384
- }
385
- /**
386
- * Convierte errores de Storage a mensajes en español
387
- */
388
- getErrorMessage(error) {
389
- if (error instanceof Error) {
390
- const code = error.code;
391
- switch (code) {
392
- case 'storage/object-not-found':
393
- return 'El archivo no existe';
394
- case 'storage/unauthorized':
395
- return 'No tienes permiso para acceder a este archivo';
396
- case 'storage/canceled':
397
- return 'La operación fue cancelada';
398
- case 'storage/quota-exceeded':
399
- return 'Se ha excedido la cuota de almacenamiento';
400
- case 'storage/invalid-checksum':
401
- return 'El archivo está corrupto';
402
- case 'storage/retry-limit-exceeded':
403
- return 'Error de conexión. Intenta de nuevo';
404
- case 'storage/invalid-url':
405
- return 'URL de archivo inválida';
406
- case 'storage/invalid-argument':
407
- return 'Argumento inválido';
408
- default:
409
- return error.message || 'Error de almacenamiento desconocido';
410
- }
411
- }
412
- return 'Error de almacenamiento desconocido';
413
- }
414
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StorageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
415
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StorageService, providedIn: 'root' }); }
416
- }
417
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StorageService, decorators: [{
418
- type: Injectable,
419
- args: [{ providedIn: 'root' }]
420
- }] });
421
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9maXJlYmFzZS9zdG9yYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsWUFBWSxFQUNaLGNBQWMsRUFDZCxXQUFXLEVBQ1gsT0FBTyxFQUNQLEdBQUcsRUFDSCxPQUFPLEVBQ1Asb0JBQW9CLEdBR3JCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQzs7QUFJbkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUVILE1BQU0sT0FBTyxjQUFjO0lBRDNCO1FBRVUsWUFBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztLQTRabkM7SUExWkMsOEVBQThFO0lBQzlFLFNBQVM7SUFDVCw4RUFBOEU7SUFFOUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FzQkc7SUFDSCxNQUFNLENBQUMsSUFBWSxFQUFFLElBQWlCLEVBQUUsUUFBMEI7UUFDaEUsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0MsTUFBTSxjQUFjLEdBQW1CO1lBQ3JDLFdBQVcsRUFBRSxRQUFRLEVBQUUsV0FBVyxJQUFJLENBQUMsSUFBSSxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3BGLGNBQWMsRUFBRSxRQUFRLEVBQUUsY0FBYztZQUN4QyxZQUFZLEVBQUUsUUFBUSxFQUFFLFlBQVk7U0FDckMsQ0FBQztRQUVGLE1BQU0sSUFBSSxHQUFHLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDcEUsTUFBTSxTQUFTLEdBQUcsSUFBSSxlQUFlLENBQWlCO1lBQ3BELGdCQUFnQixFQUFFLENBQUM7WUFDbkIsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ3JCLFVBQVUsRUFBRSxDQUFDO1lBQ2IsS0FBSyxFQUFFLFNBQVM7U0FDakIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLEVBQUUsQ0FDTCxlQUFlLEVBQ2YsQ0FBQyxRQUE0QixFQUFFLEVBQUU7WUFDL0IsU0FBUyxDQUFDLElBQUksQ0FBQztnQkFDYixnQkFBZ0IsRUFBRSxRQUFRLENBQUMsZ0JBQWdCO2dCQUMzQyxVQUFVLEVBQUUsUUFBUSxDQUFDLFVBQVU7Z0JBQy9CLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxHQUFHLENBQUM7Z0JBQy9FLEtBQUssRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7YUFDekMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxFQUNELENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDUixTQUFTLENBQUMsSUFBSSxDQUFDO2dCQUNiLGdCQUFnQixFQUFFLENBQUM7Z0JBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDckIsVUFBVSxFQUFFLENBQUM7Z0JBQ2IsS0FBSyxFQUFFLE9BQU87YUFDZixDQUFDLENBQUM7WUFDSCxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMvQyxDQUFDLEVBQ0QsR0FBRyxFQUFFO1lBQ0gsU0FBUyxDQUFDLElBQUksQ0FBQztnQkFDYixnQkFBZ0IsRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDM0IsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJO2dCQUNyQixVQUFVLEVBQUUsR0FBRztnQkFDZixLQUFLLEVBQUUsU0FBUzthQUNqQixDQUFDLENBQUM7WUFDSCxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdkIsQ0FBQyxDQUNGLENBQUM7UUFFRixPQUFPLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNILEtBQUssQ0FBQyxlQUFlLENBQ25CLElBQVksRUFDWixJQUFpQixFQUNqQixRQUEwQjtRQUUxQixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQzFDLFFBQVEsRUFBRSxLQUFLLElBQUksRUFBRTtvQkFDbkIsSUFBSSxDQUFDO3dCQUNILE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUMzQyxNQUFNLFdBQVcsR0FBRyxNQUFNLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDckQsTUFBTSxjQUFjLEdBQUcsTUFBTSxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBRXJELE9BQU8sQ0FBQzs0QkFDTixXQUFXOzRCQUNYLFFBQVEsRUFBRSxjQUFjLENBQUMsUUFBUTs0QkFDakMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxJQUFJOzRCQUN6QixJQUFJLEVBQUUsY0FBYyxDQUFDLElBQUk7NEJBQ3pCLFdBQVcsRUFBRSxjQUFjLENBQUMsV0FBVyxJQUFJLDBCQUEwQjs0QkFDckUsUUFBUSxFQUFFLGNBQWMsQ0FBQyxjQUFjLElBQUksRUFBRTt5QkFDOUMsQ0FBQyxDQUFDO29CQUNMLENBQUM7b0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQzt3QkFDZixNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUN0QyxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2FBQ2hDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ0gsS0FBSyxDQUFDLGlCQUFpQixDQUNyQixJQUFZLEVBQ1osT0FBZSxFQUNmLFFBQTBCO1FBRTFCLHNDQUFzQztRQUN0QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDNUQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTlCLDBCQUEwQjtRQUMxQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDL0MsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUNELE1BQU0sU0FBUyxHQUFHLElBQUksVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUUxRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRTtZQUN0QyxXQUFXO1lBQ1gsR0FBRyxRQUFRO1NBQ1osQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxXQUFXO0lBQ1gsOEVBQThFO0lBRTlFOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFZO1FBQy9CLElBQUksQ0FBQztZQUNILE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzNDLE9BQU8sTUFBTSxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMvQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFZO1FBQzVCLElBQUksQ0FBQztZQUNILE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzNDLE1BQU0sUUFBUSxHQUFHLE1BQU0sV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQy9DLE9BQU87Z0JBQ0wsV0FBVyxFQUFFLFFBQVEsQ0FBQyxXQUFXO2dCQUNqQyxjQUFjLEVBQUUsUUFBUSxDQUFDLGNBQWM7Z0JBQ3ZDLFlBQVksRUFBRSxRQUFRLENBQUMsWUFBWTtnQkFDbkMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUNuQixJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7YUFDcEIsQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNILENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsU0FBUztJQUNULDhFQUE4RTtJQUU5RTs7Ozs7Ozs7O09BU0c7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLElBQVk7UUFDdkIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDM0MsTUFBTSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMvQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQUMsS0FBZTtRQUNsQyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxPQUFPO0lBQ1AsOEVBQThFO0lBRTlFOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFZO1FBQ3JCLElBQUksQ0FBQztZQUNILE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzNDLE1BQU0sTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRXpDLE9BQU87Z0JBQ0wsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO2dCQUNoRCxhQUFhLEVBQUUsU0FBUyxFQUFFLGdDQUFnQzthQUMzRCxDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMvQyxDQUFDO0lBQ0gsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxhQUFhO0lBQ2IsOEVBQThFO0lBRTlFOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILGdCQUFnQixDQUFDLFlBQW9CLEVBQUUsTUFBZTtRQUNwRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDN0IsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUVuRSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsT0FBTyxHQUFHLE1BQU0sSUFBSSxTQUFTLElBQUksYUFBYSxFQUFFLENBQUM7UUFDbkQsQ0FBQztRQUNELE9BQU8sR0FBRyxTQUFTLElBQUksYUFBYSxFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSCxZQUFZLENBQUMsU0FBaUIsRUFBRSxZQUFvQixFQUFFLE1BQWU7UUFDbkUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM3RCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGtCQUFrQjtRQUNsRSxPQUFPLEdBQUcsUUFBUSxJQUFJLFFBQVEsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFlBQVksQ0FBQyxRQUFnQjtRQUMzQixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzVELENBQUM7SUFFRDs7T0FFRztJQUNILE9BQU8sQ0FBQyxRQUFnQjtRQUN0QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVEOztPQUVHO0lBQ0gsVUFBVSxDQUFDLFFBQWdCO1FBQ3pCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxtQkFBbUI7SUFDbkIsOEVBQThFO0lBRTlFOztPQUVHO0lBQ0ssWUFBWSxDQUFDLEtBQWE7UUFDaEMsUUFBUSxLQUFLLEVBQUUsQ0FBQztZQUNkLEtBQUssU0FBUztnQkFDWixPQUFPLFNBQVMsQ0FBQztZQUNuQixLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxRQUFRLENBQUM7WUFDbEIsS0FBSyxTQUFTO2dCQUNaLE9BQU8sU0FBUyxDQUFDO1lBQ25CLEtBQUssVUFBVTtnQkFDYixPQUFPLFVBQVUsQ0FBQztZQUNwQixLQUFLLE9BQU87Z0JBQ1YsT0FBTyxPQUFPLENBQUM7WUFDakI7Z0JBQ0UsT0FBTyxTQUFTLENBQUM7UUFDckIsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLGVBQWUsQ0FBQyxLQUFjO1FBQ3BDLElBQUksS0FBSyxZQUFZLEtBQUssRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxHQUFJLEtBQTJCLENBQUMsSUFBSSxDQUFDO1lBRS9DLFFBQVEsSUFBSSxFQUFFLENBQUM7Z0JBQ2IsS0FBSywwQkFBMEI7b0JBQzdCLE9BQU8sc0JBQXNCLENBQUM7Z0JBQ2hDLEtBQUssc0JBQXNCO29CQUN6QixPQUFPLCtDQUErQyxDQUFDO2dCQUN6RCxLQUFLLGtCQUFrQjtvQkFDckIsT0FBTyw0QkFBNEIsQ0FBQztnQkFDdEMsS0FBSyx3QkFBd0I7b0JBQzNCLE9BQU8sMkNBQTJDLENBQUM7Z0JBQ3JELEtBQUssMEJBQTBCO29CQUM3QixPQUFPLDBCQUEwQixDQUFDO2dCQUNwQyxLQUFLLDhCQUE4QjtvQkFDakMsT0FBTyxxQ0FBcUMsQ0FBQztnQkFDL0MsS0FBSyxxQkFBcUI7b0JBQ3hCLE9BQU8seUJBQXlCLENBQUM7Z0JBQ25DLEtBQUssMEJBQTBCO29CQUM3QixPQUFPLG9CQUFvQixDQUFDO2dCQUM5QjtvQkFDRSxPQUFPLEtBQUssQ0FBQyxPQUFPLElBQUkscUNBQXFDLENBQUM7WUFDbEUsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLHFDQUFxQyxDQUFDO0lBQy9DLENBQUM7K0dBNVpVLGNBQWM7bUhBQWQsY0FBYyxjQURELE1BQU07OzRGQUNuQixjQUFjO2tCQUQxQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3RvcmFnZSBTZXJ2aWNlXG4gKlxuICogU2VydmljaW8gcGFyYSBvcGVyYWNpb25lcyBkZSBGaXJlYmFzZSBTdG9yYWdlLlxuICogU29wb3J0YSB1cGxvYWQgY29uIHRyYWNraW5nIGRlIHByb2dyZXNvLCBkb3dubG9hZCB5IGdlc3Rpw7NuIGRlIGFyY2hpdm9zLlxuICovXG5cbmltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgZGVsZXRlT2JqZWN0LFxuICBnZXREb3dubG9hZFVSTCxcbiAgZ2V0TWV0YWRhdGEsXG4gIGxpc3RBbGwsXG4gIHJlZixcbiAgU3RvcmFnZSxcbiAgdXBsb2FkQnl0ZXNSZXN1bWFibGUsXG4gIFVwbG9hZE1ldGFkYXRhLFxuICBVcGxvYWRUYXNrU25hcHNob3QsXG59IGZyb20gJ0Bhbmd1bGFyL2ZpcmUvc3RvcmFnZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgU3RvcmFnZUxpc3RSZXN1bHQsIFN0b3JhZ2VNZXRhZGF0YSwgVXBsb2FkUHJvZ3Jlc3MsIFVwbG9hZFJlc3VsdCwgVXBsb2FkU3RhdGUgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBTZXJ2aWNpbyBwYXJhIEZpcmViYXNlIFN0b3JhZ2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBDb21wb25lbnQoey4uLn0pXG4gKiBleHBvcnQgY2xhc3MgRmlsZVVwbG9hZENvbXBvbmVudCB7XG4gKiAgIHByaXZhdGUgc3RvcmFnZSA9IGluamVjdChTdG9yYWdlU2VydmljZSk7XG4gKlxuICogICB1cGxvYWRQcm9ncmVzcyA9IHNpZ25hbDxudW1iZXI+KDApO1xuICogICBkb3dubG9hZFVybCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAqXG4gKiAgIGFzeW5jIG9uRmlsZVNlbGVjdGVkKGV2ZW50OiBFdmVudCkge1xuICogICAgIGNvbnN0IGZpbGUgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmZpbGVzPy5bMF07XG4gKiAgICAgaWYgKCFmaWxlKSByZXR1cm47XG4gKlxuICogICAgIC8vIFVwbG9hZCBjb24gcHJvZ3Jlc29cbiAqICAgICB0aGlzLnN0b3JhZ2UudXBsb2FkKGB1cGxvYWRzLyR7ZmlsZS5uYW1lfWAsIGZpbGUpLnN1YnNjcmliZSh7XG4gKiAgICAgICBuZXh0OiAocHJvZ3Jlc3MpID0+IHRoaXMudXBsb2FkUHJvZ3Jlc3Muc2V0KHByb2dyZXNzLnBlcmNlbnRhZ2UpLFxuICogICAgICAgY29tcGxldGU6IGFzeW5jICgpID0+IHtcbiAqICAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgdGhpcy5zdG9yYWdlLmdldERvd25sb2FkVXJsKGB1cGxvYWRzLyR7ZmlsZS5uYW1lfWApO1xuICogICAgICAgICB0aGlzLmRvd25sb2FkVXJsLnNldCh1cmwpO1xuICogICAgICAgfVxuICogICAgIH0pO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBTdG9yYWdlU2VydmljZSB7XG4gIHByaXZhdGUgc3RvcmFnZSA9IGluamVjdChTdG9yYWdlKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVVBMT0FEXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBTdWJlIHVuIGFyY2hpdm8gY29uIHRyYWNraW5nIGRlIHByb2dyZXNvLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFJ1dGEgZW4gU3RvcmFnZSBkb25kZSBndWFyZGFyIGVsIGFyY2hpdm9cbiAgICogQHBhcmFtIGZpbGUgLSBBcmNoaXZvIGEgc3ViaXIgKEZpbGUgbyBCbG9iKVxuICAgKiBAcGFyYW0gbWV0YWRhdGEgLSBNZXRhZGF0YSBvcGNpb25hbCAoY29udGVudFR5cGUsIGN1c3RvbU1ldGFkYXRhKVxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHF1ZSBlbWl0ZSBlbCBwcm9ncmVzbyB5IGNvbXBsZXRhIGN1YW5kbyB0ZXJtaW5hXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gVXBsb2FkIGLDoXNpY29cbiAgICogc3RvcmFnZS51cGxvYWQoJ2ltYWdlcy9waG90by5qcGcnLCBmaWxlKS5zdWJzY3JpYmUoe1xuICAgKiAgIG5leHQ6IChwcm9ncmVzcykgPT4gY29uc29sZS5sb2coYCR7cHJvZ3Jlc3MucGVyY2VudGFnZX0lYCksXG4gICAqICAgY29tcGxldGU6ICgpID0+IGNvbnNvbGUubG9nKCdVcGxvYWQgY29tcGxldGFkbycpXG4gICAqIH0pO1xuICAgKlxuICAgKiAvLyBDb24gbWV0YWRhdGFcbiAgICogc3RvcmFnZS51cGxvYWQoJ2RvY3MvcmVwb3J0LnBkZicsIGZpbGUsIHtcbiAgICogICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL3BkZicsXG4gICAqICAgY3VzdG9tTWV0YWRhdGE6IHsgdXBsb2FkZWRCeTogJ3VzZXIxMjMnIH1cbiAgICogfSkuc3Vic2NyaWJlKC4uLik7XG4gICAqIGBgYFxuICAgKi9cbiAgdXBsb2FkKHBhdGg6IHN0cmluZywgZmlsZTogRmlsZSB8IEJsb2IsIG1ldGFkYXRhPzogU3RvcmFnZU1ldGFkYXRhKTogT2JzZXJ2YWJsZTxVcGxvYWRQcm9ncmVzcz4ge1xuICAgIGNvbnN0IHN0b3JhZ2VSZWYgPSByZWYodGhpcy5zdG9yYWdlLCBwYXRoKTtcbiAgICBjb25zdCB1cGxvYWRNZXRhZGF0YTogVXBsb2FkTWV0YWRhdGEgPSB7XG4gICAgICBjb250ZW50VHlwZTogbWV0YWRhdGE/LmNvbnRlbnRUeXBlIHx8IChmaWxlIGluc3RhbmNlb2YgRmlsZSA/IGZpbGUudHlwZSA6IHVuZGVmaW5lZCksXG4gICAgICBjdXN0b21NZXRhZGF0YTogbWV0YWRhdGE/LmN1c3RvbU1ldGFkYXRhLFxuICAgICAgY2FjaGVDb250cm9sOiBtZXRhZGF0YT8uY2FjaGVDb250cm9sLFxuICAgIH07XG5cbiAgICBjb25zdCB0YXNrID0gdXBsb2FkQnl0ZXNSZXN1bWFibGUoc3RvcmFnZVJlZiwgZmlsZSwgdXBsb2FkTWV0YWRhdGEpO1xuICAgIGNvbnN0IHByb2dyZXNzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VXBsb2FkUHJvZ3Jlc3M+KHtcbiAgICAgIGJ5dGVzVHJhbnNmZXJyZWQ6IDAsXG4gICAgICB0b3RhbEJ5dGVzOiBmaWxlLnNpemUsXG4gICAgICBwZXJjZW50YWdlOiAwLFxuICAgICAgc3RhdGU6ICdydW5uaW5nJyxcbiAgICB9KTtcblxuICAgIHRhc2sub24oXG4gICAgICAnc3RhdGVfY2hhbmdlZCcsXG4gICAgICAoc25hcHNob3Q6IFVwbG9hZFRhc2tTbmFwc2hvdCkgPT4ge1xuICAgICAgICBwcm9ncmVzcyQubmV4dCh7XG4gICAgICAgICAgYnl0ZXNUcmFuc2ZlcnJlZDogc25hcHNob3QuYnl0ZXNUcmFuc2ZlcnJlZCxcbiAgICAgICAgICB0b3RhbEJ5dGVzOiBzbmFwc2hvdC50b3RhbEJ5dGVzLFxuICAgICAgICAgIHBlcmNlbnRhZ2U6IE1hdGgucm91bmQoKHNuYXBzaG90LmJ5dGVzVHJhbnNmZXJyZWQgLyBzbmFwc2hvdC50b3RhbEJ5dGVzKSAqIDEwMCksXG4gICAgICAgICAgc3RhdGU6IHRoaXMubWFwVGFza1N0YXRlKHNuYXBzaG90LnN0YXRlKSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIHByb2dyZXNzJC5uZXh0KHtcbiAgICAgICAgICBieXRlc1RyYW5zZmVycmVkOiAwLFxuICAgICAgICAgIHRvdGFsQnl0ZXM6IGZpbGUuc2l6ZSxcbiAgICAgICAgICBwZXJjZW50YWdlOiAwLFxuICAgICAgICAgIHN0YXRlOiAnZXJyb3InLFxuICAgICAgICB9KTtcbiAgICAgICAgcHJvZ3Jlc3MkLmVycm9yKHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSk7XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICBwcm9ncmVzcyQubmV4dCh7XG4gICAgICAgICAgYnl0ZXNUcmFuc2ZlcnJlZDogZmlsZS5zaXplLFxuICAgICAgICAgIHRvdGFsQnl0ZXM6IGZpbGUuc2l6ZSxcbiAgICAgICAgICBwZXJjZW50YWdlOiAxMDAsXG4gICAgICAgICAgc3RhdGU6ICdzdWNjZXNzJyxcbiAgICAgICAgfSk7XG4gICAgICAgIHByb2dyZXNzJC5jb21wbGV0ZSgpO1xuICAgICAgfVxuICAgICk7XG5cbiAgICByZXR1cm4gcHJvZ3Jlc3MkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YmUgdW4gYXJjaGl2byB5IHJldG9ybmEgbGEgVVJMIGRlIGRlc2NhcmdhIGFsIGNvbXBsZXRhci5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBSdXRhIGVuIFN0b3JhZ2VcbiAgICogQHBhcmFtIGZpbGUgLSBBcmNoaXZvIGEgc3ViaXJcbiAgICogQHBhcmFtIG1ldGFkYXRhIC0gTWV0YWRhdGEgb3BjaW9uYWxcbiAgICogQHJldHVybnMgUmVzdWx0YWRvIGRlbCB1cGxvYWQgY29uIFVSTCBkZSBkZXNjYXJnYVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2UudXBsb2FkQW5kR2V0VXJsKCdhdmF0YXJzL3VzZXIxMjMuanBnJywgZmlsZSk7XG4gICAqIGNvbnNvbGUubG9nKCdVUkw6JywgcmVzdWx0LmRvd25sb2FkVXJsKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyB1cGxvYWRBbmRHZXRVcmwoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGZpbGU6IEZpbGUgfCBCbG9iLFxuICAgIG1ldGFkYXRhPzogU3RvcmFnZU1ldGFkYXRhXG4gICk6IFByb21pc2U8VXBsb2FkUmVzdWx0PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMudXBsb2FkKHBhdGgsIGZpbGUsIG1ldGFkYXRhKS5zdWJzY3JpYmUoe1xuICAgICAgICBjb21wbGV0ZTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzdG9yYWdlUmVmID0gcmVmKHRoaXMuc3RvcmFnZSwgcGF0aCk7XG4gICAgICAgICAgICBjb25zdCBkb3dubG9hZFVybCA9IGF3YWl0IGdldERvd25sb2FkVVJMKHN0b3JhZ2VSZWYpO1xuICAgICAgICAgICAgY29uc3Qgc3RvcmVkTWV0YWRhdGEgPSBhd2FpdCBnZXRNZXRhZGF0YShzdG9yYWdlUmVmKTtcblxuICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgIGRvd25sb2FkVXJsLFxuICAgICAgICAgICAgICBmdWxsUGF0aDogc3RvcmVkTWV0YWRhdGEuZnVsbFBhdGgsXG4gICAgICAgICAgICAgIG5hbWU6IHN0b3JlZE1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgICAgIHNpemU6IHN0b3JlZE1ldGFkYXRhLnNpemUsXG4gICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBzdG9yZWRNZXRhZGF0YS5jb250ZW50VHlwZSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyxcbiAgICAgICAgICAgICAgbWV0YWRhdGE6IHN0b3JlZE1ldGFkYXRhLmN1c3RvbU1ldGFkYXRhIHx8IHt9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJlamVjdCh0aGlzLmdldEVycm9yTWVzc2FnZShlcnJvcikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6IChlcnJvcikgPT4gcmVqZWN0KGVycm9yKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YmUgdW4gYXJjaGl2byBkZXNkZSB1bmEgRGF0YSBVUkwgKGJhc2U2NCkuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gUnV0YSBlbiBTdG9yYWdlXG4gICAqIEBwYXJhbSBkYXRhVXJsIC0gRGF0YSBVUkwgKGVqOiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LC4uLicpXG4gICAqIEBwYXJhbSBtZXRhZGF0YSAtIE1ldGFkYXRhIG9wY2lvbmFsXG4gICAqIEByZXR1cm5zIFJlc3VsdGFkbyBkZWwgdXBsb2FkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gRGVzZGUgY2FudmFzXG4gICAqIGNvbnN0IGRhdGFVcmwgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc3RvcmFnZS51cGxvYWRGcm9tRGF0YVVybCgnaW1hZ2VzL2RyYXdpbmcucG5nJywgZGF0YVVybCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgdXBsb2FkRnJvbURhdGFVcmwoXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGRhdGFVcmw6IHN0cmluZyxcbiAgICBtZXRhZGF0YT86IFN0b3JhZ2VNZXRhZGF0YVxuICApOiBQcm9taXNlPFVwbG9hZFJlc3VsdD4ge1xuICAgIC8vIEV4dHJhZXIgY29udGVudCB0eXBlIHkgZGF0b3MgYmFzZTY0XG4gICAgY29uc3QgbWF0Y2hlcyA9IGRhdGFVcmwubWF0Y2goL15kYXRhOihbXjtdKyk7YmFzZTY0LCguKykkLyk7XG4gICAgaWYgKCFtYXRjaGVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEgVVJMIGludsOhbGlkYScpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gbWF0Y2hlc1sxXTtcbiAgICBjb25zdCBiYXNlNjREYXRhID0gbWF0Y2hlc1syXTtcblxuICAgIC8vIENvbnZlcnRpciBiYXNlNjQgYSBCbG9iXG4gICAgY29uc3QgYnl0ZUNoYXJhY3RlcnMgPSBhdG9iKGJhc2U2NERhdGEpO1xuICAgIGNvbnN0IGJ5dGVOdW1iZXJzID0gbmV3IEFycmF5KGJ5dGVDaGFyYWN0ZXJzLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlQ2hhcmFjdGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgYnl0ZU51bWJlcnNbaV0gPSBieXRlQ2hhcmFjdGVycy5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICBjb25zdCBieXRlQXJyYXkgPSBuZXcgVWludDhBcnJheShieXRlTnVtYmVycyk7XG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtieXRlQXJyYXldLCB7IHR5cGU6IGNvbnRlbnRUeXBlIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMudXBsb2FkQW5kR2V0VXJsKHBhdGgsIGJsb2IsIHtcbiAgICAgIGNvbnRlbnRUeXBlLFxuICAgICAgLi4ubWV0YWRhdGEsXG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRE9XTkxPQURcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbGEgVVJMIGRlIGRlc2NhcmdhIGRlIHVuIGFyY2hpdm8uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gUnV0YSBkZWwgYXJjaGl2byBlbiBTdG9yYWdlXG4gICAqIEByZXR1cm5zIFVSTCBkZSBkZXNjYXJnYVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHVybCA9IGF3YWl0IHN0b3JhZ2UuZ2V0RG93bmxvYWRVcmwoJ2ltYWdlcy9waG90by5qcGcnKTtcbiAgICogLy8gVXNhciBlbiA8aW1nIFtzcmNdPVwidXJsXCI+XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0RG93bmxvYWRVcmwocGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmFnZVJlZiA9IHJlZih0aGlzLnN0b3JhZ2UsIHBhdGgpO1xuICAgICAgcmV0dXJuIGF3YWl0IGdldERvd25sb2FkVVJMKHN0b3JhZ2VSZWYpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5nZXRFcnJvck1lc3NhZ2UoZXJyb3IpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT2J0aWVuZSBsYSBtZXRhZGF0YSBkZSB1biBhcmNoaXZvLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFJ1dGEgZGVsIGFyY2hpdm9cbiAgICogQHJldHVybnMgTWV0YWRhdGEgZGVsIGFyY2hpdm9cbiAgICovXG4gIGFzeW5jIGdldE1ldGFkYXRhKHBhdGg6IHN0cmluZyk6IFByb21pc2U8U3RvcmFnZU1ldGFkYXRhICYgeyBzaXplOiBudW1iZXI7IG5hbWU6IHN0cmluZyB9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0b3JhZ2VSZWYgPSByZWYodGhpcy5zdG9yYWdlLCBwYXRoKTtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gYXdhaXQgZ2V0TWV0YWRhdGEoc3RvcmFnZVJlZik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50VHlwZTogbWV0YWRhdGEuY29udGVudFR5cGUsXG4gICAgICAgIGN1c3RvbU1ldGFkYXRhOiBtZXRhZGF0YS5jdXN0b21NZXRhZGF0YSxcbiAgICAgICAgY2FjaGVDb250cm9sOiBtZXRhZGF0YS5jYWNoZUNvbnRyb2wsXG4gICAgICAgIHNpemU6IG1ldGFkYXRhLnNpemUsXG4gICAgICAgIG5hbWU6IG1ldGFkYXRhLm5hbWUsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5nZXRFcnJvck1lc3NhZ2UoZXJyb3IpKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gREVMRVRFXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBFbGltaW5hIHVuIGFyY2hpdm8uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gUnV0YSBkZWwgYXJjaGl2byBhIGVsaW1pbmFyXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgc3RvcmFnZS5kZWxldGUoJ2ltYWdlcy9vbGQtcGhvdG8uanBnJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yYWdlUmVmID0gcmVmKHRoaXMuc3RvcmFnZSwgcGF0aCk7XG4gICAgICBhd2FpdCBkZWxldGVPYmplY3Qoc3RvcmFnZVJlZik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcih0aGlzLmdldEVycm9yTWVzc2FnZShlcnJvcikpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbGltaW5hIG3Dumx0aXBsZXMgYXJjaGl2b3MuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRocyAtIEFycmF5IGRlIHJ1dGFzIGEgZWxpbWluYXJcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCBzdG9yYWdlLmRlbGV0ZU11bHRpcGxlKFtcbiAgICogICAnaW1hZ2VzL3Bob3RvMS5qcGcnLFxuICAgKiAgICdpbWFnZXMvcGhvdG8yLmpwZydcbiAgICogXSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZGVsZXRlTXVsdGlwbGUocGF0aHM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocGF0aHMubWFwKChwYXRoKSA9PiB0aGlzLmRlbGV0ZShwYXRoKSkpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIExJU1RcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIExpc3RhIGFyY2hpdm9zIGVuIHVuIGRpcmVjdG9yaW8uXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gUnV0YSBkZWwgZGlyZWN0b3Jpb1xuICAgKiBAcmV0dXJucyBMaXN0YSBkZSBydXRhcyBkZSBhcmNoaXZvc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2UubGlzdCgnaW1hZ2VzLycpO1xuICAgKiBjb25zb2xlLmxvZyhyZXN1bHQuaXRlbXMpOyAvLyBbJ2ltYWdlcy9waG90bzEuanBnJywgJ2ltYWdlcy9waG90bzIuanBnJ11cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBsaXN0KHBhdGg6IHN0cmluZyk6IFByb21pc2U8U3RvcmFnZUxpc3RSZXN1bHQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmFnZVJlZiA9IHJlZih0aGlzLnN0b3JhZ2UsIHBhdGgpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbGlzdEFsbChzdG9yYWdlUmVmKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXRlbXM6IHJlc3VsdC5pdGVtcy5tYXAoKGl0ZW0pID0+IGl0ZW0uZnVsbFBhdGgpLFxuICAgICAgICBuZXh0UGFnZVRva2VuOiB1bmRlZmluZWQsIC8vIGxpc3RBbGwgbm8gc29wb3J0YSBwYWdpbmFjacOzblxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycm9yKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFVUSUxJREFERVNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEdlbmVyYSB1biBub21icmUgZGUgYXJjaGl2byDDum5pY28gY29uIHRpbWVzdGFtcC5cbiAgICpcbiAgICogQHBhcmFtIG9yaWdpbmFsTmFtZSAtIE5vbWJyZSBvcmlnaW5hbCBkZWwgYXJjaGl2b1xuICAgKiBAcGFyYW0gcHJlZml4IC0gUHJlZmlqbyBvcGNpb25hbFxuICAgKiBAcmV0dXJucyBOb21icmUgw7puaWNvXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdW5pcXVlTmFtZSA9IHN0b3JhZ2UuZ2VuZXJhdGVGaWxlTmFtZSgncGhvdG8uanBnJywgJ3VzZXIxMjMnKTtcbiAgICogLy8gPT4gJ3VzZXIxMjNfMTcwMzA5MTIzNDU2N19waG90by5qcGcnXG4gICAqIGBgYFxuICAgKi9cbiAgZ2VuZXJhdGVGaWxlTmFtZShvcmlnaW5hbE5hbWU6IHN0cmluZywgcHJlZml4Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHNhbml0aXplZE5hbWUgPSBvcmlnaW5hbE5hbWUucmVwbGFjZSgvW15hLXpBLVowLTkuLV0vZywgJ18nKTtcblxuICAgIGlmIChwcmVmaXgpIHtcbiAgICAgIHJldHVybiBgJHtwcmVmaXh9XyR7dGltZXN0YW1wfV8ke3Nhbml0aXplZE5hbWV9YDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3RpbWVzdGFtcH1fJHtzYW5pdGl6ZWROYW1lfWA7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhIHVuYSBydXRhIMO6bmljYSBwYXJhIHVuIGFyY2hpdm8uXG4gICAqXG4gICAqIEBwYXJhbSBkaXJlY3RvcnkgLSBEaXJlY3RvcmlvIGJhc2VcbiAgICogQHBhcmFtIG9yaWdpbmFsTmFtZSAtIE5vbWJyZSBvcmlnaW5hbFxuICAgKiBAcGFyYW0gcHJlZml4IC0gUHJlZmlqbyBvcGNpb25hbFxuICAgKiBAcmV0dXJucyBSdXRhIGNvbXBsZXRhIMO6bmljYVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHBhdGggPSBzdG9yYWdlLmdlbmVyYXRlUGF0aCgndXBsb2FkcycsICdwaG90by5qcGcnLCAndXNlcjEyMycpO1xuICAgKiAvLyA9PiAndXBsb2Fkcy91c2VyMTIzXzE3MDMwOTEyMzQ1NjdfcGhvdG8uanBnJ1xuICAgKiBgYGBcbiAgICovXG4gIGdlbmVyYXRlUGF0aChkaXJlY3Rvcnk6IHN0cmluZywgb3JpZ2luYWxOYW1lOiBzdHJpbmcsIHByZWZpeD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZmlsZU5hbWUgPSB0aGlzLmdlbmVyYXRlRmlsZU5hbWUob3JpZ2luYWxOYW1lLCBwcmVmaXgpO1xuICAgIGNvbnN0IGNsZWFuRGlyID0gZGlyZWN0b3J5LnJlcGxhY2UoL1xcLyskLywgJycpOyAvLyBSZW1vdmVyIC8gZmluYWxcbiAgICByZXR1cm4gYCR7Y2xlYW5EaXJ9LyR7ZmlsZU5hbWV9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGxhIGV4dGVuc2nDs24gZGUgdW4gYXJjaGl2by5cbiAgICpcbiAgICogQHBhcmFtIGZpbGVuYW1lIC0gTm9tYnJlIGRlbCBhcmNoaXZvXG4gICAqIEByZXR1cm5zIEV4dGVuc2nDs24gKHNpbiBlbCBwdW50bylcbiAgICovXG4gIGdldEV4dGVuc2lvbihmaWxlbmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJ0cyA9IGZpbGVuYW1lLnNwbGl0KCcuJyk7XG4gICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA+IDEgPyBwYXJ0cy5wb3AoKSEudG9Mb3dlckNhc2UoKSA6ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIHVuIGFyY2hpdm8gZXMgdW5hIGltYWdlbiBiYXPDoW5kb3NlIGVuIHN1IGV4dGVuc2nDs24uXG4gICAqL1xuICBpc0ltYWdlKGZpbGVuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBleHQgPSB0aGlzLmdldEV4dGVuc2lvbihmaWxlbmFtZSk7XG4gICAgcmV0dXJuIFsnanBnJywgJ2pwZWcnLCAncG5nJywgJ2dpZicsICd3ZWJwJywgJ3N2ZycsICdibXAnXS5pbmNsdWRlcyhleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIHVuIGFyY2hpdm8gZXMgdW4gZG9jdW1lbnRvLlxuICAgKi9cbiAgaXNEb2N1bWVudChmaWxlbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZXh0ID0gdGhpcy5nZXRFeHRlbnNpb24oZmlsZW5hbWUpO1xuICAgIHJldHVybiBbJ3BkZicsICdkb2MnLCAnZG9jeCcsICd4bHMnLCAneGxzeCcsICdwcHQnLCAncHB0eCcsICd0eHQnXS5pbmNsdWRlcyhleHQpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE3DiVRPRE9TIFBSSVZBRE9TXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBNYXBlYSBlbCBlc3RhZG8gZGUgbGEgdGFyZWEgZGUgdXBsb2FkXG4gICAqL1xuICBwcml2YXRlIG1hcFRhc2tTdGF0ZShzdGF0ZTogc3RyaW5nKTogVXBsb2FkU3RhdGUge1xuICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgIGNhc2UgJ3J1bm5pbmcnOlxuICAgICAgICByZXR1cm4gJ3J1bm5pbmcnO1xuICAgICAgY2FzZSAncGF1c2VkJzpcbiAgICAgICAgcmV0dXJuICdwYXVzZWQnO1xuICAgICAgY2FzZSAnc3VjY2Vzcyc6XG4gICAgICAgIHJldHVybiAnc3VjY2Vzcyc7XG4gICAgICBjYXNlICdjYW5jZWxlZCc6XG4gICAgICAgIHJldHVybiAnY2FuY2VsZWQnO1xuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICByZXR1cm4gJ2Vycm9yJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAncnVubmluZyc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZpZXJ0ZSBlcnJvcmVzIGRlIFN0b3JhZ2UgYSBtZW5zYWplcyBlbiBlc3Bhw7FvbFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRFcnJvck1lc3NhZ2UoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBjb25zdCBjb2RlID0gKGVycm9yIGFzIHsgY29kZT86IHN0cmluZyB9KS5jb2RlO1xuXG4gICAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgY2FzZSAnc3RvcmFnZS9vYmplY3Qtbm90LWZvdW5kJzpcbiAgICAgICAgICByZXR1cm4gJ0VsIGFyY2hpdm8gbm8gZXhpc3RlJztcbiAgICAgICAgY2FzZSAnc3RvcmFnZS91bmF1dGhvcml6ZWQnOlxuICAgICAgICAgIHJldHVybiAnTm8gdGllbmVzIHBlcm1pc28gcGFyYSBhY2NlZGVyIGEgZXN0ZSBhcmNoaXZvJztcbiAgICAgICAgY2FzZSAnc3RvcmFnZS9jYW5jZWxlZCc6XG4gICAgICAgICAgcmV0dXJuICdMYSBvcGVyYWNpw7NuIGZ1ZSBjYW5jZWxhZGEnO1xuICAgICAgICBjYXNlICdzdG9yYWdlL3F1b3RhLWV4Y2VlZGVkJzpcbiAgICAgICAgICByZXR1cm4gJ1NlIGhhIGV4Y2VkaWRvIGxhIGN1b3RhIGRlIGFsbWFjZW5hbWllbnRvJztcbiAgICAgICAgY2FzZSAnc3RvcmFnZS9pbnZhbGlkLWNoZWNrc3VtJzpcbiAgICAgICAgICByZXR1cm4gJ0VsIGFyY2hpdm8gZXN0w6EgY29ycnVwdG8nO1xuICAgICAgICBjYXNlICdzdG9yYWdlL3JldHJ5LWxpbWl0LWV4Y2VlZGVkJzpcbiAgICAgICAgICByZXR1cm4gJ0Vycm9yIGRlIGNvbmV4acOzbi4gSW50ZW50YSBkZSBudWV2byc7XG4gICAgICAgIGNhc2UgJ3N0b3JhZ2UvaW52YWxpZC11cmwnOlxuICAgICAgICAgIHJldHVybiAnVVJMIGRlIGFyY2hpdm8gaW52w6FsaWRhJztcbiAgICAgICAgY2FzZSAnc3RvcmFnZS9pbnZhbGlkLWFyZ3VtZW50JzpcbiAgICAgICAgICByZXR1cm4gJ0FyZ3VtZW50byBpbnbDoWxpZG8nO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBlcnJvci5tZXNzYWdlIHx8ICdFcnJvciBkZSBhbG1hY2VuYW1pZW50byBkZXNjb25vY2lkbyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICdFcnJvciBkZSBhbG1hY2VuYW1pZW50byBkZXNjb25vY2lkbyc7XG4gIH1cbn1cbiJdfQ==
@@ -1,8 +0,0 @@
1
- /**
2
- * Firebase Types
3
- *
4
- * Tipos e interfaces para la integración de Firebase en valtech-components.
5
- * Todos los modelos de Firestore deben extender FirestoreDocument.
6
- */
7
- export {};
8
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2ZpcmViYXNlL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGaXJlYmFzZSBUeXBlc1xuICpcbiAqIFRpcG9zIGUgaW50ZXJmYWNlcyBwYXJhIGxhIGludGVncmFjacOzbiBkZSBGaXJlYmFzZSBlbiB2YWx0ZWNoLWNvbXBvbmVudHMuXG4gKiBUb2RvcyBsb3MgbW9kZWxvcyBkZSBGaXJlc3RvcmUgZGViZW4gZXh0ZW5kZXIgRmlyZXN0b3JlRG9jdW1lbnQuXG4gKi9cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ09ORklHVVJBQ0nDk05cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDb25maWd1cmFjacOzbiBkZSBGaXJlYmFzZSAodmFsb3JlcyBkZSBmaXJlYmFzZUNvbmZpZylcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaXJlYmFzZUNvbmZpZyB7XG4gIGFwaUtleTogc3RyaW5nO1xuICBhdXRoRG9tYWluOiBzdHJpbmc7XG4gIHByb2plY3RJZDogc3RyaW5nO1xuICBzdG9yYWdlQnVja2V0OiBzdHJpbmc7XG4gIG1lc3NhZ2luZ1NlbmRlcklkOiBzdHJpbmc7XG4gIGFwcElkOiBzdHJpbmc7XG4gIG1lYXN1cmVtZW50SWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhY2nDs24gZGUgZW11bGFkb3JlcyBwYXJhIGRlc2Fycm9sbG8gbG9jYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXVsYXRvckNvbmZpZyB7XG4gIGZpcmVzdG9yZT86IHtcbiAgICBob3N0OiBzdHJpbmc7XG4gICAgcG9ydDogbnVtYmVyO1xuICB9O1xuICBhdXRoPzoge1xuICAgIGhvc3Q6IHN0cmluZztcbiAgICBwb3J0OiBudW1iZXI7XG4gIH07XG4gIHN0b3JhZ2U/OiB7XG4gICAgaG9zdDogc3RyaW5nO1xuICAgIHBvcnQ6IG51bWJlcjtcbiAgfTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmFjacOzbiBjb21wbGV0YSBkZSBWYWx0ZWNoIEZpcmViYXNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsdGVjaEZpcmViYXNlQ29uZmlnIHtcbiAgLyoqIENvbmZpZ3VyYWNpw7NuIGRlIEZpcmViYXNlICovXG4gIGZpcmViYXNlOiBGaXJlYmFzZUNvbmZpZztcbiAgLyoqIENvbmZpZ3VyYWNpw7NuIGRlIGVtdWxhZG9yZXMgKG9wY2lvbmFsLCBwYXJhIGRlc2Fycm9sbG8pICovXG4gIGVtdWxhdG9yPzogRW11bGF0b3JDb25maWc7XG4gIC8qKiBIYWJpbGl0YXIgcGVyc2lzdGVuY2lhIG9mZmxpbmUgZGUgRmlyZXN0b3JlIChkZWZhdWx0OiBmYWxzZSkgKi9cbiAgcGVyc2lzdGVuY2U/OiBib29sZWFuO1xuICAvKiogSGFiaWxpdGFyIEZpcmViYXNlIENsb3VkIE1lc3NhZ2luZyAoZGVmYXVsdDogZmFsc2UpIC0gcmVxdWllcmUgU2VydmljZSBXb3JrZXIgKi9cbiAgZW5hYmxlTWVzc2FnaW5nPzogYm9vbGVhbjtcbiAgLyoqIFZBUElEIGtleSBwYXJhIEZpcmViYXNlIENsb3VkIE1lc3NhZ2luZyAqL1xuICBtZXNzYWdpbmdWYXBpZEtleT86IHN0cmluZztcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRklSRVNUT1JFIC0gRE9DVU1FTlRPU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEludGVyZmFjZSBiYXNlIHBhcmEgdG9kb3MgbG9zIGRvY3VtZW50b3MgZGUgRmlyZXN0b3JlLlxuICogVG9kb3MgbG9zIG1vZGVsb3MgZGViZW4gZXh0ZW5kZXIgZXN0YSBpbnRlcmZhY2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIGludGVyZmFjZSBVc2VyIGV4dGVuZHMgRmlyZXN0b3JlRG9jdW1lbnQge1xuICogICBuYW1lOiBzdHJpbmc7XG4gKiAgIGVtYWlsOiBzdHJpbmc7XG4gKiB9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlyZXN0b3JlRG9jdW1lbnQge1xuICAvKiogSUQgZGVsIGRvY3VtZW50byAoYXNpZ25hZG8gcG9yIEZpcmVzdG9yZSkgKi9cbiAgaWQ/OiBzdHJpbmc7XG4gIC8qKiBGZWNoYSBkZSBjcmVhY2nDs24gKG1hbmVqYWRhIGF1dG9tw6F0aWNhbWVudGUpICovXG4gIGNyZWF0ZWRBdD86IERhdGU7XG4gIC8qKiBGZWNoYSBkZSDDumx0aW1hIGFjdHVhbGl6YWNpw7NuIChtYW5lamFkYSBhdXRvbcOhdGljYW1lbnRlKSAqL1xuICB1cGRhdGVkQXQ/OiBEYXRlO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBGSVJFU1RPUkUgLSBRVUVSSUVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogT3BlcmFkb3JlcyBkaXNwb25pYmxlcyBwYXJhIGNsw6F1c3VsYXMgd2hlcmVcbiAqL1xuZXhwb3J0IHR5cGUgV2hlcmVPcGVyYXRvciA9XG4gIHwgJz09J1xuICB8ICchPSdcbiAgfCAnPCdcbiAgfCAnPD0nXG4gIHwgJz4nXG4gIHwgJz49J1xuICB8ICdhcnJheS1jb250YWlucydcbiAgfCAnYXJyYXktY29udGFpbnMtYW55J1xuICB8ICdpbidcbiAgfCAnbm90LWluJztcblxuLyoqXG4gKiBDbMOhdXN1bGEgd2hlcmUgcGFyYSBmaWx0cmFyIGRvY3VtZW50b3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXaGVyZUNsYXVzZSB7XG4gIC8qKiBDYW1wbyBhIGZpbHRyYXIgKi9cbiAgZmllbGQ6IHN0cmluZztcbiAgLyoqIE9wZXJhZG9yIGRlIGNvbXBhcmFjacOzbiAqL1xuICBvcGVyYXRvcjogV2hlcmVPcGVyYXRvcjtcbiAgLyoqIFZhbG9yIGEgY29tcGFyYXIgKi9cbiAgdmFsdWU6IHVua25vd247XG59XG5cbi8qKlxuICogRGlyZWNjacOzbiBkZSBvcmRlbmFtaWVudG9cbiAqL1xuZXhwb3J0IHR5cGUgT3JkZXJEaXJlY3Rpb24gPSAnYXNjJyB8ICdkZXNjJztcblxuLyoqXG4gKiBDbMOhdXN1bGEgb3JkZXJCeSBwYXJhIG9yZGVuYXIgcmVzdWx0YWRvc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE9yZGVyQnlDbGF1c2Uge1xuICAvKiogQ2FtcG8gcG9yIGVsIGN1YWwgb3JkZW5hciAqL1xuICBmaWVsZDogc3RyaW5nO1xuICAvKiogRGlyZWNjacOzbiBkZWwgb3JkZW5hbWllbnRvICovXG4gIGRpcmVjdGlvbjogT3JkZXJEaXJlY3Rpb247XG59XG5cbi8qKlxuICogT3BjaW9uZXMgcGFyYSBxdWVyaWVzIGRlIEZpcmVzdG9yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5T3B0aW9ucyB7XG4gIC8qKiBGaWx0cm9zIHdoZXJlIChBTkQgZW50cmUgdG9kb3MpICovXG4gIHdoZXJlPzogV2hlcmVDbGF1c2VbXTtcbiAgLyoqIE9yZGVuYW1pZW50byBkZSByZXN1bHRhZG9zICovXG4gIG9yZGVyQnk/OiBPcmRlckJ5Q2xhdXNlW107XG4gIC8qKiBMw61taXRlIGRlIGRvY3VtZW50b3MgYSByZXRvcm5hciAqL1xuICBsaW1pdD86IG51bWJlcjtcbiAgLyoqIEN1cnNvciBwYXJhIHBhZ2luYWNpw7NuOiBlbXBlemFyIGRlc3B1w6lzIGRlIGVzdGUgZG9jdW1lbnRvICovXG4gIHN0YXJ0QWZ0ZXI/OiB1bmtub3duO1xuICAvKiogQ3Vyc29yIHBhcmEgcGFnaW5hY2nDs246IGVtcGV6YXIgZW4gZXN0ZSBkb2N1bWVudG8gKi9cbiAgc3RhcnRBdD86IHVua25vd247XG4gIC8qKiBDdXJzb3IgcGFyYSBwYWdpbmFjacOzbjogdGVybWluYXIgYW50ZXMgZGUgZXN0ZSBkb2N1bWVudG8gKi9cbiAgZW5kQmVmb3JlPzogdW5rbm93bjtcbiAgLyoqIEN1cnNvciBwYXJhIHBhZ2luYWNpw7NuOiB0ZXJtaW5hciBlbiBlc3RlIGRvY3VtZW50byAqL1xuICBlbmRBdD86IHVua25vd247XG59XG5cbi8qKlxuICogT3BjaW9uZXMgYWRpY2lvbmFsZXMgcGFyYSBzdWJzY3JpcGNpb25lcyByZWFsLXRpbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdWJzY3JpcHRpb25PcHRpb25zIGV4dGVuZHMgUXVlcnlPcHRpb25zIHtcbiAgLyoqIEluY2x1aXIgY2FtYmlvcyBkZSBtZXRhZGF0YSAoZWo6IHBlbmRpbmdXcml0ZXMpICovXG4gIGluY2x1ZGVNZXRhZGF0YUNoYW5nZXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJlc3VsdGFkbyBkZSB1bmEgcXVlcnkgcGFnaW5hZGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYWdpbmF0ZWRSZXN1bHQ8VD4ge1xuICAvKiogRG9jdW1lbnRvcyBkZSBsYSBww6FnaW5hIGFjdHVhbCAqL1xuICBkYXRhOiBUW107XG4gIC8qKiBJbmRpY2Egc2kgaGF5IG3DoXMgcMOhZ2luYXMgZGlzcG9uaWJsZXMgKi9cbiAgaGFzTW9yZTogYm9vbGVhbjtcbiAgLyoqIEN1cnNvciBwYXJhIGxhIHNpZ3VpZW50ZSBww6FnaW5hIChwYXNhciBhIHN0YXJ0QWZ0ZXIpICovXG4gIGxhc3REb2M6IHVua25vd247XG4gIC8qKiBUb3RhbCBkZSBkb2N1bWVudG9zIChvcGNpb25hbCwgcmVxdWllcmUgcXVlcnkgYWRpY2lvbmFsKSAqL1xuICB0b3RhbD86IG51bWJlcjtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU1RPUkFHRVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEVzdGFkbyBkZSB1bmEgb3BlcmFjacOzbiBkZSB1cGxvYWRcbiAqL1xuZXhwb3J0IHR5cGUgVXBsb2FkU3RhdGUgPSAncnVubmluZycgfCAncGF1c2VkJyB8ICdzdWNjZXNzJyB8ICdjYW5jZWxlZCcgfCAnZXJyb3InO1xuXG4vKipcbiAqIFByb2dyZXNvIGRlIHVwbG9hZCBkZSBhcmNoaXZvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBsb2FkUHJvZ3Jlc3Mge1xuICAvKiogQnl0ZXMgdHJhbnNmZXJpZG9zIGhhc3RhIGFob3JhICovXG4gIGJ5dGVzVHJhbnNmZXJyZWQ6IG51bWJlcjtcbiAgLyoqIFRvdGFsIGRlIGJ5dGVzIGEgdHJhbnNmZXJpciAqL1xuICB0b3RhbEJ5dGVzOiBudW1iZXI7XG4gIC8qKiBQb3JjZW50YWplIGNvbXBsZXRhZG8gKDAtMTAwKSAqL1xuICBwZXJjZW50YWdlOiBudW1iZXI7XG4gIC8qKiBFc3RhZG8gYWN0dWFsIGRlbCB1cGxvYWQgKi9cbiAgc3RhdGU6IFVwbG9hZFN0YXRlO1xufVxuXG4vKipcbiAqIFJlc3VsdGFkbyBkZSB1biB1cGxvYWQgY29tcGxldGFkb1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVwbG9hZFJlc3VsdCB7XG4gIC8qKiBVUkwgZGUgZGVzY2FyZ2EgZGVsIGFyY2hpdm8gKi9cbiAgZG93bmxvYWRVcmw6IHN0cmluZztcbiAgLyoqIFJ1dGEgY29tcGxldGEgZW4gU3RvcmFnZSAqL1xuICBmdWxsUGF0aDogc3RyaW5nO1xuICAvKiogTm9tYnJlIGRlbCBhcmNoaXZvICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIFRhbWHDsW8gZW4gYnl0ZXMgKi9cbiAgc2l6ZTogbnVtYmVyO1xuICAvKiogVGlwbyBNSU1FIGRlbCBhcmNoaXZvICovXG4gIGNvbnRlbnRUeXBlOiBzdHJpbmc7XG4gIC8qKiBNZXRhZGF0YSBwZXJzb25hbGl6YWRhICovXG4gIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG4vKipcbiAqIE1ldGFkYXRhIHBhcmEgYXJjaGl2b3MgZW4gU3RvcmFnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JhZ2VNZXRhZGF0YSB7XG4gIC8qKiBUaXBvIE1JTUUgZGVsIGFyY2hpdm8gKi9cbiAgY29udGVudFR5cGU/OiBzdHJpbmc7XG4gIC8qKiBNZXRhZGF0YSBwZXJzb25hbGl6YWRhIChrZXktdmFsdWUpICovXG4gIGN1c3RvbU1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIENvbnRyb2wgZGUgY2FjaMOpIEhUVFAgKi9cbiAgY2FjaGVDb250cm9sPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc3VsdGFkbyBkZSBsaXN0YXIgYXJjaGl2b3MgZW4gU3RvcmFnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JhZ2VMaXN0UmVzdWx0IHtcbiAgLyoqIFJ1dGFzIGRlIGxvcyBhcmNoaXZvcyBlbmNvbnRyYWRvcyAqL1xuICBpdGVtczogc3RyaW5nW107XG4gIC8qKiBUb2tlbiBwYXJhIGxhIHNpZ3VpZW50ZSBww6FnaW5hIChzaSBoYXkgbcOhcykgKi9cbiAgbmV4dFBhZ2VUb2tlbj86IHN0cmluZztcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQVVUSCAvIFNFU1NJT05cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBJbmZvcm1hY2nDs24gZGVsIHVzdWFyaW8gZGUgRmlyZWJhc2UgKHNpbXBsaWZpY2FkYSlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaXJlYmFzZVVzZXIge1xuICAvKiogVUlEIMO6bmljbyBkZWwgdXN1YXJpbyAqL1xuICB1aWQ6IHN0cmluZztcbiAgLyoqIEVtYWlsIGRlbCB1c3VhcmlvICovXG4gIGVtYWlsOiBzdHJpbmcgfCBudWxsO1xuICAvKiogTm9tYnJlIHBhcmEgbW9zdHJhciAqL1xuICBkaXNwbGF5TmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFVSTCBkZSBmb3RvIGRlIHBlcmZpbCAqL1xuICBwaG90b1VSTDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIEVtYWlsIHZlcmlmaWNhZG8gKi9cbiAgZW1haWxWZXJpZmllZDogYm9vbGVhbjtcbiAgLyoqIFVzdWFyaW8gYW7Ds25pbW8gKi9cbiAgaXNBbm9ueW1vdXM6IGJvb2xlYW47XG4gIC8qKiBQcm92ZWVkb3IgZGUgYXV0ZW50aWNhY2nDs24gKi9cbiAgcHJvdmlkZXJJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEVzdGFkbyBkZSBsYSBzZXNpw7NuIGRlIEZpcmViYXNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvblN0YXRlIHtcbiAgLyoqIFVzdWFyaW8gYWN0dWFsIChudWxsIHNpIG5vIGF1dGVudGljYWRvKSAqL1xuICB1c2VyOiBGaXJlYmFzZVVzZXIgfCBudWxsO1xuICAvKiogSW5kaWNhIHNpIGVsIHVzdWFyaW8gZXN0w6EgYXV0ZW50aWNhZG8gKi9cbiAgaXNBdXRoZW50aWNhdGVkOiBib29sZWFuO1xuICAvKiogSW5kaWNhIHNpIHNlIGVzdMOhIGNhcmdhbmRvIGVsIGVzdGFkbyBkZSBhdXRoICovXG4gIGlzTG9hZGluZzogYm9vbGVhbjtcbiAgLyoqIEVycm9yIGRlIGF1dGVudGljYWNpw7NuIChzaSBsbyBoYXkpICovXG4gIGVycm9yOiBFcnJvciB8IG51bGw7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIE1FU1NBR0lORyAoRkNNKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEVzdGFkbyBkZWwgcGVybWlzbyBkZSBub3RpZmljYWNpb25lc1xuICovXG5leHBvcnQgdHlwZSBOb3RpZmljYXRpb25QZXJtaXNzaW9uID0gJ2dyYW50ZWQnIHwgJ2RlbmllZCcgfCAnZGVmYXVsdCc7XG5cbi8qKlxuICogUGF5bG9hZCBkZSB1bmEgbm90aWZpY2FjacOzbiBwdXNoXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTm90aWZpY2F0aW9uUGF5bG9hZCB7XG4gIC8qKiBUw610dWxvIGRlIGxhIG5vdGlmaWNhY2nDs24gKi9cbiAgdGl0bGU/OiBzdHJpbmc7XG4gIC8qKiBDdWVycG8gZGVsIG1lbnNhamUgKi9cbiAgYm9keT86IHN0cmluZztcbiAgLyoqIFVSTCBkZSBpbWFnZW4gKi9cbiAgaW1hZ2U/OiBzdHJpbmc7XG4gIC8qKiBEYXRvcyBwZXJzb25hbGl6YWRvcyAqL1xuICBkYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIElEIGRlbCBtZW5zYWplIGRlIEZDTSAqL1xuICBtZXNzYWdlSWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQWNjacOzbiBkZSBuYXZlZ2FjacOzbiBkZXNkZSB1bmEgbm90aWZpY2FjacOzblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vdGlmaWNhdGlvbkFjdGlvbiB7XG4gIC8qKiBSdXRhIGludGVybmEgZGUgbGEgYXBwIChlajogJy9vcmRlcnMvMTIzJykgKi9cbiAgcm91dGU/OiBzdHJpbmc7XG4gIC8qKiBVUkwgZXh0ZXJuYSAoZWo6ICdodHRwczovL2V4YW1wbGUuY29tJykgKi9cbiAgdXJsPzogc3RyaW5nO1xuICAvKiogUGFyw6FtZXRyb3MgZGUgcXVlcnkgc3RyaW5nICovXG4gIHF1ZXJ5UGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIFRpcG8gZGUgYWNjacOzbiBwZXJzb25hbGl6YWRhICovXG4gIGFjdGlvblR5cGU/OiBzdHJpbmc7XG4gIC8qKiBEYXRvcyBhZGljaW9uYWxlcyBwYXJhIGxhIGFjY2nDs24gKi9cbiAgYWN0aW9uRGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKipcbiAqIEV2ZW50byBkZSBjbGljayBlbiB1bmEgbm90aWZpY2FjacOzblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5vdGlmaWNhdGlvbkNsaWNrRXZlbnQge1xuICAvKiogUGF5bG9hZCBvcmlnaW5hbCBkZSBsYSBub3RpZmljYWNpw7NuICovXG4gIG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uUGF5bG9hZDtcbiAgLyoqIEFjY2nDs24gZGUgbmF2ZWdhY2nDs24gZXh0cmHDrWRhICovXG4gIGFjdGlvbjogTm90aWZpY2F0aW9uQWN0aW9uO1xuICAvKiogVGltZXN0YW1wIGRlbCBjbGljayAqL1xuICB0aW1lc3RhbXA6IERhdGU7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVSUk9SRVNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDw7NkaWdvcyBkZSBlcnJvciBkZSBGaXJlYmFzZVxuICovXG5leHBvcnQgdHlwZSBGaXJlYmFzZUVycm9yQ29kZSA9XG4gIHwgJ3Blcm1pc3Npb24tZGVuaWVkJ1xuICB8ICdub3QtZm91bmQnXG4gIHwgJ2FscmVhZHktZXhpc3RzJ1xuICB8ICdyZXNvdXJjZS1leGhhdXN0ZWQnXG4gIHwgJ2NhbmNlbGxlZCdcbiAgfCAndW5rbm93bidcbiAgfCAnaW52YWxpZC1hcmd1bWVudCdcbiAgfCAnZGVhZGxpbmUtZXhjZWVkZWQnXG4gIHwgJ3VuYXV0aGVudGljYXRlZCc7XG5cbi8qKlxuICogRXJyb3IgZGUgRmlyZWJhc2UgdGlwYWRvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlyZWJhc2VFcnJvciB7XG4gIC8qKiBDw7NkaWdvIGRlbCBlcnJvciAqL1xuICBjb2RlOiBGaXJlYmFzZUVycm9yQ29kZTtcbiAgLyoqIE1lbnNhamUgZGUgZXJyb3IgKGVuIGVzcGHDsW9sKSAqL1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIC8qKiBFcnJvciBvcmlnaW5hbCBkZSBGaXJlYmFzZSAqL1xuICBvcmlnaW5hbEVycm9yPzogdW5rbm93bjtcbn1cbiJdfQ==