@gsp-svc/formdoc-upload 0.1.36 → 0.1.38
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.
- package/bundles/gsp-svc-formdoc-upload.umd.js +332 -199
- package/bundles/gsp-svc-formdoc-upload.umd.js.map +1 -1
- package/bundles/gsp-svc-formdoc-upload.umd.min.js +1 -1
- package/bundles/gsp-svc-formdoc-upload.umd.min.js.map +1 -1
- package/esm2015/gsp-svc-formdoc-upload.js +2 -2
- package/esm2015/lib/formdoc-upload.module.js +7 -4
- package/esm2015/lib/upload/entity/copyfilerequest.js +15 -0
- package/esm2015/lib/upload/entity/fileinfo.js +1 -1
- package/esm2015/lib/upload/file-upload/file-upload.component.js +273 -194
- package/esm2015/lib/upload/upload.module.js +6 -4
- package/esm2015/lib/upload/upload.service.js +28 -1
- package/esm2015/public-api.js +2 -1
- package/esm5/gsp-svc-formdoc-upload.js +2 -2
- package/esm5/lib/formdoc-upload.module.js +7 -4
- package/esm5/lib/upload/entity/copyfilerequest.js +19 -0
- package/esm5/lib/upload/entity/fileinfo.js +1 -1
- package/esm5/lib/upload/file-upload/file-upload.component.js +297 -198
- package/esm5/lib/upload/upload.module.js +6 -4
- package/esm5/lib/upload/upload.service.js +34 -1
- package/esm5/public-api.js +2 -1
- package/fesm2015/gsp-svc-formdoc-upload.js +311 -199
- package/fesm2015/gsp-svc-formdoc-upload.js.map +1 -1
- package/fesm5/gsp-svc-formdoc-upload.js +345 -204
- package/fesm5/gsp-svc-formdoc-upload.js.map +1 -1
- package/gsp-svc-formdoc-upload.metadata.json +1 -1
- package/lib/upload/entity/copyfilerequest.d.ts +5 -0
- package/lib/upload/entity/fileinfo.d.ts +1 -1
- package/lib/upload/file-upload/file-upload.component.d.ts +7 -1
- package/lib/upload/upload.service.d.ts +1 -0
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
|
@@ -9,7 +9,7 @@ import { OperatingModes } from '../entity/operatingmodes';
|
|
|
9
9
|
import { UploadService } from '../upload.service';
|
|
10
10
|
import { UploadFileInfo } from '../entity/uploadfileinfo';
|
|
11
11
|
import { MessagerService } from '@farris/ui-messager';
|
|
12
|
-
import { map } from 'rxjs/operators';
|
|
12
|
+
import { catchError, map, tap } from 'rxjs/operators';
|
|
13
13
|
import { of } from 'rxjs';
|
|
14
14
|
import { GspFormUploadEntity } from '../entity/gspformuploadentity';
|
|
15
15
|
import { UUID } from 'angular2-uuid';
|
|
@@ -19,6 +19,7 @@ import { DomSanitizer } from '@angular/platform-browser';
|
|
|
19
19
|
import { FileState } from '../entity/filestate';
|
|
20
20
|
import { LocalLangPipe } from '../../local.pipe';
|
|
21
21
|
import { GspDocSecurityBaseInfo } from '../entity/gspdocsecuritynaseinfo';
|
|
22
|
+
import { HttpClient } from '@angular/common/http';
|
|
22
23
|
export class FileUploadComponent {
|
|
23
24
|
/**
|
|
24
25
|
* @param {?} msgService
|
|
@@ -40,7 +41,7 @@ export class FileUploadComponent {
|
|
|
40
41
|
this.beyondFileList = [];
|
|
41
42
|
this.showType = 0;
|
|
42
43
|
this.mouseOn = false;
|
|
43
|
-
this.bufferSize = 1024 * 1024;
|
|
44
|
+
this.bufferSize = 10 * 1024 * 1024;
|
|
44
45
|
this.selectedFileCount = 0;
|
|
45
46
|
this.uploadIconAddress = '/platform/runtime/dfs/images/upload.svg';
|
|
46
47
|
this.uploadLittleIconAddress = '/platform/runtime/dfs/images/uploadIcon.svg';
|
|
@@ -75,6 +76,7 @@ export class FileUploadComponent {
|
|
|
75
76
|
this.totalLoad = null;
|
|
76
77
|
this.exStorageFileList = [];
|
|
77
78
|
if (this.injector) {
|
|
79
|
+
this.httpclient = this.injector.get(HttpClient);
|
|
78
80
|
this.localeid = localStorage.getItem("languageCode") || this.injector.get(LOCALE_ID);
|
|
79
81
|
this.localepipe = new LocalLangPipe(this.localeid);
|
|
80
82
|
}
|
|
@@ -345,6 +347,76 @@ export class FileUploadComponent {
|
|
|
345
347
|
showErrorMessage(file) {
|
|
346
348
|
this.msgService.error(this.localepipe.transform('uploadFailure') + file.errorMessage);
|
|
347
349
|
}
|
|
350
|
+
/**
|
|
351
|
+
* @param {?} uuid
|
|
352
|
+
* @param {?} selectedFile
|
|
353
|
+
* @param {?} fileName
|
|
354
|
+
* @return {?}
|
|
355
|
+
*/
|
|
356
|
+
handleFileInfo(uuid, selectedFile, fileName) {
|
|
357
|
+
return new Promise((/**
|
|
358
|
+
* @param {?} resolve
|
|
359
|
+
* @return {?}
|
|
360
|
+
*/
|
|
361
|
+
resolve => {
|
|
362
|
+
/** @type {?} */
|
|
363
|
+
let fileInfo;
|
|
364
|
+
fileInfo = {
|
|
365
|
+
id: uuid,
|
|
366
|
+
name: fileName,
|
|
367
|
+
type: selectedFile.type,
|
|
368
|
+
source: "",
|
|
369
|
+
size: this.getFileSize(selectedFile.size),
|
|
370
|
+
fileSize: selectedFile.size,
|
|
371
|
+
picListDisplayName: this.getPicListDisplayName(fileName),
|
|
372
|
+
queueListDisplayName: this.getQueueDisplayName(fileName),
|
|
373
|
+
//content: reader.result.toString(),
|
|
374
|
+
hasUploaded: false,
|
|
375
|
+
mouseOn: false,
|
|
376
|
+
selectd: false,
|
|
377
|
+
isUploading: true,
|
|
378
|
+
uploadResult: false,
|
|
379
|
+
uploadProcess: 0,
|
|
380
|
+
errorMessage: "",
|
|
381
|
+
extensionDropListId: 0,
|
|
382
|
+
extensionName: "",
|
|
383
|
+
securityDropListId: 0,
|
|
384
|
+
securityInfo: this.securityInfoList[0]
|
|
385
|
+
};
|
|
386
|
+
if (this.storageExtension != null)
|
|
387
|
+
fileInfo.extensionName = this.defaultPropertyName;
|
|
388
|
+
/** @type {?} */
|
|
389
|
+
let type = selectedFile.type;
|
|
390
|
+
if (type.includes("tiff")) {
|
|
391
|
+
this.addDocInfo(selectedFile, fileInfo, DocType.Other);
|
|
392
|
+
}
|
|
393
|
+
else if (type.includes("image")) {
|
|
394
|
+
this.addDocInfo(selectedFile, fileInfo, DocType.Image);
|
|
395
|
+
}
|
|
396
|
+
else if (type.includes("word")) {
|
|
397
|
+
this.addDocInfo(selectedFile, fileInfo, DocType.Word);
|
|
398
|
+
}
|
|
399
|
+
else if (type.includes("pdf")) {
|
|
400
|
+
this.addDocInfo(selectedFile, fileInfo, DocType.Pdf);
|
|
401
|
+
}
|
|
402
|
+
else if (type.includes("plain")) {
|
|
403
|
+
this.addDocInfo(selectedFile, fileInfo, DocType.Txt);
|
|
404
|
+
}
|
|
405
|
+
else if (type.includes("sheet") || type.includes("excel")) {
|
|
406
|
+
this.addDocInfo(selectedFile, fileInfo, DocType.Excel);
|
|
407
|
+
}
|
|
408
|
+
else if (type.includes("powerpoint") || type.includes("presentation")) {
|
|
409
|
+
this.addDocInfo(selectedFile, fileInfo, DocType.Powerpoint);
|
|
410
|
+
}
|
|
411
|
+
else {
|
|
412
|
+
this.addDocInfo(selectedFile, fileInfo, DocType.Other);
|
|
413
|
+
// let name: string = selectedFile.name;
|
|
414
|
+
// let errType = name.substring(selectedFile.name.lastIndexOf('.'));
|
|
415
|
+
// this.errTypeList.push(errType);
|
|
416
|
+
}
|
|
417
|
+
resolve(fileInfo);
|
|
418
|
+
}));
|
|
419
|
+
}
|
|
348
420
|
/**
|
|
349
421
|
* @param {?} uuid
|
|
350
422
|
* @param {?} selectedFile
|
|
@@ -353,159 +425,138 @@ export class FileUploadComponent {
|
|
|
353
425
|
* @return {?}
|
|
354
426
|
*/
|
|
355
427
|
uploadFile(uuid, selectedFile, fileName, state = FileState.New) {
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
fileInfo = {
|
|
362
|
-
id: uuid,
|
|
363
|
-
name: fileName,
|
|
364
|
-
type: selectedFile.type,
|
|
365
|
-
source: "",
|
|
366
|
-
size: this.getFileSize(selectedFile.size),
|
|
367
|
-
fileSize: selectedFile.size,
|
|
368
|
-
picListDisplayName: this.getPicListDisplayName(fileName),
|
|
369
|
-
queueListDisplayName: this.getQueueDisplayName(fileName),
|
|
370
|
-
//content: reader.result.toString(),
|
|
371
|
-
hasUploaded: false,
|
|
372
|
-
mouseOn: false,
|
|
373
|
-
selectd: false,
|
|
374
|
-
isUploading: true,
|
|
375
|
-
uploadResult: false,
|
|
376
|
-
uploadProcess: 0,
|
|
377
|
-
errorMessage: "",
|
|
378
|
-
extensionDropListId: 0,
|
|
379
|
-
extensionName: "",
|
|
380
|
-
securityDropListId: 0,
|
|
381
|
-
securityInfo: this.securityInfoList[0]
|
|
382
|
-
};
|
|
383
|
-
if (this.storageExtension != null)
|
|
384
|
-
fileInfo.extensionName = this.defaultPropertyName;
|
|
385
|
-
/** @type {?} */
|
|
386
|
-
let chunkTotal = Math.ceil(selectedFile.size / this.bufferSize);
|
|
387
|
-
/** @type {?} */
|
|
388
|
-
let chunkIndex = 0;
|
|
389
|
-
this.fileTotalChunk[uuid] = chunkTotal;
|
|
390
|
-
/** @type {?} */
|
|
391
|
-
let uploadFileInfo = new UploadFileInfo();
|
|
392
|
-
uploadFileInfo.metadataId = uuid;
|
|
393
|
-
uploadFileInfo.fileName = fileInfo.name;
|
|
394
|
-
uploadFileInfo.fileSize = fileInfo.size;
|
|
395
|
-
uploadFileInfo.state = state;
|
|
396
|
-
uploadFileInfo.securityInfo = this.securityInfoList[0];
|
|
397
|
-
while (chunkIndex < chunkTotal) {
|
|
398
|
-
/** @type {?} */
|
|
399
|
-
let uploadInfo = new GspFormUploadEntity;
|
|
400
|
-
uploadInfo.formId = this.formId;
|
|
401
|
-
uploadInfo.mode = OperatingModes.Temp;
|
|
402
|
-
uploadInfo.rootId = this.rootId;
|
|
428
|
+
this.handleFileInfo(uuid, selectedFile, fileName).then((/**
|
|
429
|
+
* @param {?} res
|
|
430
|
+
* @return {?}
|
|
431
|
+
*/
|
|
432
|
+
res => {
|
|
403
433
|
/** @type {?} */
|
|
404
|
-
let
|
|
405
|
-
docInfo.fileName = fileName;
|
|
406
|
-
docInfo.metadataId = uuid;
|
|
407
|
-
docInfo.total = chunkTotal;
|
|
408
|
-
this.uploadedChunk[docInfo.metadataId] = 0;
|
|
434
|
+
let fileInfo = res;
|
|
409
435
|
/** @type {?} */
|
|
410
|
-
let
|
|
436
|
+
let chunkTotal = Math.ceil(selectedFile.size / this.bufferSize);
|
|
411
437
|
/** @type {?} */
|
|
412
|
-
let
|
|
413
|
-
|
|
414
|
-
// reader.readAsBinaryString(fileData);
|
|
438
|
+
let chunkIndex = 0;
|
|
439
|
+
this.fileTotalChunk[uuid] = chunkTotal;
|
|
415
440
|
/** @type {?} */
|
|
416
|
-
let
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
441
|
+
let uploadFileInfo = new UploadFileInfo();
|
|
442
|
+
uploadFileInfo.metadataId = uuid;
|
|
443
|
+
uploadFileInfo.fileName = fileInfo.name;
|
|
444
|
+
uploadFileInfo.fileSize = fileInfo.size;
|
|
445
|
+
uploadFileInfo.state = state;
|
|
446
|
+
uploadFileInfo.securityInfo = this.securityInfoList[0];
|
|
447
|
+
while (chunkIndex < chunkTotal) {
|
|
448
|
+
/** @type {?} */
|
|
449
|
+
let uploadInfo = new GspFormUploadEntity;
|
|
450
|
+
uploadInfo.formId = this.formId;
|
|
451
|
+
uploadInfo.mode = OperatingModes.Temp;
|
|
452
|
+
uploadInfo.rootId = this.rootId;
|
|
453
|
+
/** @type {?} */
|
|
454
|
+
let docInfo = new GspFormDocInfo;
|
|
455
|
+
docInfo.fileName = fileName;
|
|
456
|
+
docInfo.metadataId = uuid;
|
|
457
|
+
docInfo.total = chunkTotal;
|
|
458
|
+
this.uploadedChunk[docInfo.metadataId] = 0;
|
|
459
|
+
/** @type {?} */
|
|
460
|
+
let nextSize = Math.min((chunkIndex + 1) * this.bufferSize, selectedFile.size);
|
|
461
|
+
/** @type {?} */
|
|
462
|
+
let fileData = selectedFile.slice(chunkIndex * this.bufferSize, nextSize);
|
|
463
|
+
// let reader = new FileReader();
|
|
464
|
+
// reader.readAsBinaryString(fileData);
|
|
465
|
+
/** @type {?} */
|
|
466
|
+
let innerIndex = chunkIndex;
|
|
467
|
+
// reader.onload = () => {
|
|
468
|
+
// docInfo.fileContent = btoa(reader.result.toString());
|
|
469
|
+
docInfo.size = selectedFile.size;
|
|
470
|
+
docInfo.index = innerIndex;
|
|
471
|
+
docInfo.fileContent = "";
|
|
472
|
+
//chunkIndex++;
|
|
473
|
+
if (this.haveExtensionProperty)
|
|
474
|
+
docInfo.exPropertyName = this.defaultPropertyName;
|
|
475
|
+
//docInfo.isLast = true;
|
|
476
|
+
uploadInfo.docInfo = docInfo;
|
|
477
|
+
// let info = uploadInfo;
|
|
478
|
+
// this.requestArray.push(this.uploadService.uploadFile(uploadInfo));
|
|
479
|
+
// this.requestBodyArray.push(info);
|
|
480
|
+
//封装请求formdata
|
|
481
|
+
/** @type {?} */
|
|
482
|
+
let formData = new FormData();
|
|
483
|
+
formData.append('uploadInfo', JSON.stringify(uploadInfo));
|
|
484
|
+
formData.append('docInfo', JSON.stringify(docInfo));
|
|
485
|
+
formData.append('file', fileData);
|
|
486
|
+
// }
|
|
487
|
+
//console.log(chunkIndex + 1);
|
|
488
|
+
chunkIndex = chunkIndex + 1;
|
|
489
|
+
}
|
|
431
490
|
/** @type {?} */
|
|
432
|
-
let
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
formData.append('file', fileData);
|
|
436
|
-
this.uploadService.uploadSliceFile(formData).subscribe((/**
|
|
437
|
-
* @param {?} res
|
|
491
|
+
let index = -1;
|
|
492
|
+
this.files.forEach((/**
|
|
493
|
+
* @param {?} x
|
|
438
494
|
* @return {?}
|
|
439
495
|
*/
|
|
440
|
-
|
|
441
|
-
if (
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
this.files[this.files.indexOf(fileInfo)].errorMessage = res.error.Message;
|
|
445
|
-
}
|
|
446
|
-
else {
|
|
447
|
-
this.uploadedChunk[docInfo.metadataId]++;
|
|
448
|
-
this.files[this.files.indexOf(fileInfo)].uploadProcess = Number.parseInt((this.uploadedChunk[docInfo.metadataId] / this.fileTotalChunk[docInfo.metadataId] * 100).toFixed(0));
|
|
449
|
-
if (this.uploadedChunk[docInfo.metadataId] == this.fileTotalChunk[docInfo.metadataId]) {
|
|
450
|
-
this.files[this.files.indexOf(fileInfo)].uploadResult = true;
|
|
451
|
-
this.files[this.files.indexOf(fileInfo)].isUploading = false;
|
|
452
|
-
this.uploadFileInfoList = this.uploadFileInfoList.concat(uploadFileInfo);
|
|
453
|
-
this.uploadedFileInfoList = this.uploadedFileInfoList.concat(uploadFileInfo);
|
|
454
|
-
this.uploadedFileTotal++;
|
|
455
|
-
}
|
|
496
|
+
x => {
|
|
497
|
+
if (x.name == fileInfo.name) {
|
|
498
|
+
if (index == -1)
|
|
499
|
+
index = this.files.indexOf(x);
|
|
456
500
|
}
|
|
457
501
|
}));
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
else if (type.includes("plain")) {
|
|
477
|
-
this.addDocInfo(selectedFile, fileInfo, DocType.Txt);
|
|
478
|
-
}
|
|
479
|
-
else if (type.includes("sheet") || type.includes("excel")) {
|
|
480
|
-
this.addDocInfo(selectedFile, fileInfo, DocType.Excel);
|
|
481
|
-
}
|
|
482
|
-
else if (type.includes("powerpoint") || type.includes("presentation")) {
|
|
483
|
-
this.addDocInfo(selectedFile, fileInfo, DocType.Powerpoint);
|
|
484
|
-
}
|
|
485
|
-
else {
|
|
486
|
-
this.addDocInfo(selectedFile, fileInfo, DocType.Other);
|
|
487
|
-
// let name: string = selectedFile.name;
|
|
488
|
-
// let errType = name.substring(selectedFile.name.lastIndexOf('.'));
|
|
489
|
-
// this.errTypeList.push(errType);
|
|
490
|
-
}
|
|
491
|
-
/** @type {?} */
|
|
492
|
-
let index = -1;
|
|
493
|
-
this.files.forEach((/**
|
|
494
|
-
* @param {?} x
|
|
502
|
+
if (index != -1 && index != this.files.length - 1) {
|
|
503
|
+
this.files.splice(index, 1);
|
|
504
|
+
this.uploadFileInfoList.splice(index, 1);
|
|
505
|
+
this.uploadedFileInfoList.splice(index, 1);
|
|
506
|
+
this.uploadedFileTotal--;
|
|
507
|
+
}
|
|
508
|
+
}));
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* @param {?} formData
|
|
512
|
+
* @param {?} fileInfo
|
|
513
|
+
* @param {?} docInfo
|
|
514
|
+
* @param {?} uploadFileInfo
|
|
515
|
+
* @return {?}
|
|
516
|
+
*/
|
|
517
|
+
sendUploadRequest(formData, fileInfo, docInfo, uploadFileInfo) {
|
|
518
|
+
this.uploadSliceFile(formData).subscribe((/**
|
|
519
|
+
* @param {?} res
|
|
495
520
|
* @return {?}
|
|
496
521
|
*/
|
|
497
|
-
|
|
498
|
-
if (
|
|
499
|
-
|
|
500
|
-
|
|
522
|
+
res => {
|
|
523
|
+
if (res != null) {
|
|
524
|
+
this.files[this.files.indexOf(fileInfo)].uploadResult = false;
|
|
525
|
+
this.files[this.files.indexOf(fileInfo)].isUploading = false;
|
|
526
|
+
this.files[this.files.indexOf(fileInfo)].errorMessage = res.error.Message;
|
|
527
|
+
}
|
|
528
|
+
else {
|
|
529
|
+
this.uploadedChunk[docInfo.metadataId]++;
|
|
530
|
+
this.files[this.files.indexOf(fileInfo)].uploadProcess = Number.parseInt((this.uploadedChunk[docInfo.metadataId] / this.fileTotalChunk[docInfo.metadataId] * 100).toFixed(0));
|
|
531
|
+
if (this.uploadedChunk[docInfo.metadataId] == this.fileTotalChunk[docInfo.metadataId]) {
|
|
532
|
+
this.files[this.files.indexOf(fileInfo)].uploadResult = true;
|
|
533
|
+
this.files[this.files.indexOf(fileInfo)].isUploading = false;
|
|
534
|
+
this.uploadFileInfoList = this.uploadFileInfoList.concat(uploadFileInfo);
|
|
535
|
+
this.uploadedFileInfoList = this.uploadedFileInfoList.concat(uploadFileInfo);
|
|
536
|
+
this.uploadedFileTotal++;
|
|
537
|
+
}
|
|
501
538
|
}
|
|
502
539
|
}));
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
540
|
+
}
|
|
541
|
+
/**
|
|
542
|
+
* @param {?} formdata
|
|
543
|
+
* @return {?}
|
|
544
|
+
*/
|
|
545
|
+
uploadSliceFile(formdata) {
|
|
546
|
+
/** @type {?} */
|
|
547
|
+
let url = "/api/runtime/dfs/v1.0/formdoc/slice";
|
|
548
|
+
//url = "/api/runtime/dfs/v1.0/formdoc/list";
|
|
549
|
+
return this.httpclient.post(url, formdata).pipe(tap((/**
|
|
550
|
+
* @param {?} res
|
|
551
|
+
* @return {?}
|
|
552
|
+
*/
|
|
553
|
+
res => { })), catchError((/**
|
|
554
|
+
* @param {?} error
|
|
555
|
+
* @return {?}
|
|
556
|
+
*/
|
|
557
|
+
(error) => {
|
|
558
|
+
return of(error);
|
|
559
|
+
})));
|
|
509
560
|
}
|
|
510
561
|
/**
|
|
511
562
|
* @return {?}
|
|
@@ -666,59 +717,85 @@ export class FileUploadComponent {
|
|
|
666
717
|
* @return {?}
|
|
667
718
|
*/
|
|
668
719
|
addDocInfo(selectdFile, fileInfo, docType) {
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
720
|
+
return new Promise((/**
|
|
721
|
+
* @param {?} resolve
|
|
722
|
+
* @return {?}
|
|
723
|
+
*/
|
|
724
|
+
resolve => {
|
|
725
|
+
switch (docType) {
|
|
726
|
+
case DocType.Word: {
|
|
727
|
+
fileInfo.source = "/platform/runtime/dfs/images/word.png";
|
|
728
|
+
this.files.push(fileInfo);
|
|
729
|
+
break;
|
|
730
|
+
}
|
|
731
|
+
case DocType.Pdf: {
|
|
732
|
+
fileInfo.source = "/platform/runtime/dfs/images/pdf.png";
|
|
733
|
+
this.files.push(fileInfo);
|
|
734
|
+
break;
|
|
735
|
+
}
|
|
736
|
+
case DocType.Excel: {
|
|
737
|
+
fileInfo.source = "/platform/runtime/dfs/images/excel.png";
|
|
738
|
+
this.files.push(fileInfo);
|
|
739
|
+
break;
|
|
740
|
+
}
|
|
741
|
+
case DocType.Txt: {
|
|
742
|
+
fileInfo.source = "/platform/runtime/dfs/images/txt.png";
|
|
743
|
+
this.files.push(fileInfo);
|
|
744
|
+
break;
|
|
745
|
+
}
|
|
746
|
+
case DocType.Powerpoint: {
|
|
747
|
+
fileInfo.source = "/platform/runtime/dfs/images/ppt.png";
|
|
748
|
+
this.files.push(fileInfo);
|
|
749
|
+
break;
|
|
750
|
+
}
|
|
751
|
+
case DocType.Other: {
|
|
752
|
+
fileInfo.source = "/platform/runtime/dfs/images/file.png";
|
|
753
|
+
this.files.push(fileInfo);
|
|
754
|
+
break;
|
|
755
|
+
}
|
|
756
|
+
case DocType.Image: {
|
|
757
|
+
this.getImageUrl(selectdFile).then((/**
|
|
758
|
+
* @param {?} res
|
|
759
|
+
* @return {?}
|
|
760
|
+
*/
|
|
761
|
+
res => {
|
|
762
|
+
fileInfo.source = res;
|
|
763
|
+
this.files.push(fileInfo);
|
|
764
|
+
resolve(fileInfo);
|
|
765
|
+
}));
|
|
766
|
+
}
|
|
699
767
|
}
|
|
700
|
-
|
|
768
|
+
resolve(fileInfo);
|
|
769
|
+
}));
|
|
770
|
+
}
|
|
771
|
+
/**
|
|
772
|
+
* @param {?} selectdFile
|
|
773
|
+
* @return {?}
|
|
774
|
+
*/
|
|
775
|
+
getImageUrl(selectdFile) {
|
|
776
|
+
return new Promise((/**
|
|
777
|
+
* @param {?} resolve
|
|
778
|
+
* @return {?}
|
|
779
|
+
*/
|
|
780
|
+
resolve => {
|
|
781
|
+
/** @type {?} */
|
|
782
|
+
let reader = new FileReader();
|
|
783
|
+
reader.readAsDataURL(selectdFile);
|
|
784
|
+
reader.onload = (/**
|
|
785
|
+
* @param {?} _event
|
|
786
|
+
* @return {?}
|
|
787
|
+
*/
|
|
788
|
+
(_event) => {
|
|
701
789
|
/** @type {?} */
|
|
702
|
-
let
|
|
703
|
-
|
|
704
|
-
reader.onload = (/**
|
|
705
|
-
* @param {?} _event
|
|
706
|
-
* @return {?}
|
|
707
|
-
*/
|
|
708
|
-
(_event) => {
|
|
790
|
+
let imgUrl = reader.result;
|
|
791
|
+
if (this.injector != null) {
|
|
709
792
|
/** @type {?} */
|
|
710
|
-
let
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
else
|
|
717
|
-
fileInfo.source = imgUrl;
|
|
718
|
-
this.files.push(fileInfo);
|
|
719
|
-
});
|
|
720
|
-
break;
|
|
721
|
-
}
|
|
793
|
+
let sanitizer = this.injector.get(DomSanitizer);
|
|
794
|
+
imgUrl = sanitizer.bypassSecurityTrustResourceUrl(imgUrl);
|
|
795
|
+
}
|
|
796
|
+
resolve(imgUrl);
|
|
797
|
+
});
|
|
798
|
+
}));
|
|
722
799
|
}
|
|
723
800
|
/**
|
|
724
801
|
* @param {?} strList
|
|
@@ -925,7 +1002,7 @@ FileUploadComponent.decorators = [
|
|
|
925
1002
|
{ type: Component, args: [{
|
|
926
1003
|
selector: 'app-file-upload',
|
|
927
1004
|
template: "<div *ngIf=\"hasSelectedFile\">\n\n <div class=\"farris-header\" style=\"height: 50px; width: 100%\">\n <div class=\"btn btn-secondary upload_button\">\n <img [src]=\"uploadLittleIconAddress\">\n <span>{{'uploadFile' | locale}} </span>\n <input type=\"file\" (focus)=\"showLoading()\" (change)=\"fileSelected($event)\" id=\"file\" multiple=\"multiple\"\n title=\"\" [accept]=\"fileType\">\n </div>\n\n\n <button *ngIf=\"showType==0 && !fileAllSelected && files.length >0 \" style=\"padding-left: 20px\"\n class=\"btn-link btn ng-star-inserted\" (click)=\"selectAllFile()\">{{'selectAll' | locale}}</button>\n <button *ngIf=\"showType==0 && fileAllSelected && files.length >0 \" style=\"padding-left: 20px\"\n class=\"btn-link btn ng-star-inserted\" (click)=\"selectAllFile()\">{{'selectNull' | locale}}</button>\n <button *ngIf=\"showType==0 && selectedFileCount>0\" style=\"padding-left: 20px\"\n class=\"btn-link btn ng-star-inserted\" (click)=\"listMultipleDeleteFile()\">{{'delete' | locale}}</button>\n\n <button *ngIf=\"showType==1 && selectedFileCount>0\" style=\"padding-left: 20px\"\n class=\"btn-link btn ng-star-inserted\" (click)=\"listMultipleDeleteFile()\">{{'delete' | locale}}</button>\n\n <kendo-buttongroup [selection]=\"'single'\" class=\"button_group_upload \"\n style=\"background-color: #ffffff; color: #388FFF;border: 1px solid #ddd;\" look=\"flat\">\n <button kendoButton [selected]=\"true\" [toggleable]=\"true\"\n [imageUrl]=\"'/platform/runtime/dfs/images/piclist.png'\" (click)=\"showByGroup()\"></button>\n <button kendoButton [toggleable]=\"true\" [imageUrl]=\"'/platform/runtime/dfs/images/queuelist.png'\"\n (click)=\"showByList()\"></button>\n </kendo-buttongroup>\n\n\n </div>\n\n <!-- <div class=\"progress\" style=\"height: 12px;\">\n <div class=\"progress-bar\" role=\"progressbar\" [ngStyle]=\"uploadProcess\"></div>\n </div> -->\n\n <div class=\"pic_list\" *ngIf=\"showType==0\">\n <ul *ngFor=\"let file of files\">\n <li (mouseenter)=\"mouseOver(file)\" (mouseleave)=\"mouseOut(file)\">\n <div *ngIf=\"file.isUploading\">\n <farris-progress [type]=\"'circle'\" [percent]=\"file.uploadProcess\" [strokeLinecap]=\"'square'\"\n [status]=\"'active'\"></farris-progress>\n </div>\n\n <table *ngIf=\"!file.uploadResult && !file.isUploading\"\n style=\"margin: 0 auto; border: 1px solid #ddd; width: 135px; height: 160px;\">\n <tr style=\"margin: 0 auto ; height: 80px;\">\n <td style=\"text-align: center\"><span class=\"f-icon f-icon-warn\"></span></td>\n </tr>\n <tr style=\"margin: 0 auto ; height: 30px;\">\n <td style=\"text-align: center\"> {{'uploadFailure' | locale}} </td>\n </tr>\n <tr>\n <td style=\"text-align: center\"><button style=\"margin: 0 auto ; height: 20px; \"\n class=\"btn-link btn ng-star-inserted\" (click)=\"showErrorMessage(file)\">{{'detail' |\n locale}}</button></td>\n </tr>\n </table>\n <div *ngIf=\"!file.isUploading && file.uploadResult\" style=\"border: 1px solid #ddd;\">\n <img [src]='file.source'>\n <div *ngIf=\"haveExtensionProperty\"\n style=\"width: 133px; height: 25px; background-color: white; position: absolute;bottom: 0; \">\n\n <div style=\"width: 100px;height: 25px;position:absolute;margin: 0 17px;\">\n <farris-combo-list [(ngModel)]=\"file.extensionDropListId\" [data]=\"propertiesNames\"\n [idField]=\"'id'\" [textField]=\"'name'\" (selectChange)=\"typeChange($event,file)\"\n [enableClear]=\"false\">\n <!-- <ng-template #itemTemp let-item>\n <div class=\"combo-list\">\n <span [class]=\"'combo-list-circle combo-list-'+item.state\"></span>\n <span class=\"combo-list-label\">{{item.label}}</span>\n </div>\n </ng-template> -->\n </farris-combo-list>\n </div>\n </div>\n <div *ngIf=\"haveSecurityInfo\"\n style=\"width: 133px; height: 25px; background-color: white; position: absolute;bottom: 0; \">\n\n <div style=\"width: 100px;height: 25px;position:absolute;margin: 0 17px;\">\n <farris-combo-list [(ngModel)]=\"file.extensionDropListId\" [data]=\"securityInfoList\"\n [idField]=\"'id'\" [textField]=\"'name'\" (selectChange)=\"securityChange($event,file)\"\n [enableClear]=\"false\">\n <!-- <ng-template #itemTemp let-item>\n <div class=\"combo-list\">\n <span [class]=\"'combo-list-circle combo-list-'+item.state\"></span>\n <span class=\"combo-list-label\">{{item.label}}</span>\n </div>\n </ng-template> -->\n </farris-combo-list>\n </div>\n </div>\n </div>\n <table *ngIf=\"!file.isUploading\">\n <tr style=\"height: 20px\">\n <td style=\"width: 15px; vertical-align: middle; text-align: center\">\n <!-- <input type=\"checkbox\" [id]=\"file.name\" (click)=\"checkoutSelectFile(file.name)\"> -->\n <div class=\"farris-input-wrap\" style=\"height: 20px\" (click)=\"checkoutSelectFile(file)\">\n <div class=\"custom-control custom-checkbox\" style=\"margin: 4px 0 0;height: 20px;\"\n [ngStyle]=\"checkboxPos\">\n <input class=\"custom-control-input\" type=\"checkbox\" [id]=\"file.name\"\n [(ngModel)]=\"file.selectd\">\n <label class=\"custom-control-label\"\n style=\"padding: 0 0 10px 0; position: relative; top: -8px;\"></label>\n </div>\n </div>\n </td>\n <td style=\"width: 120px; vertical-align: middle; text-align: center\" [title]=\"file.name\">\n {{file.picListDisplayName}}</td>\n </tr>\n </table>\n <!-- <span>{{file.picListDisplayName}}</span> -->\n <!-- <p class=\"filename\">{{file.picListDisplayName}}</p> -->\n <button *ngIf=\"!file.isUploading && file.mouseOn\"\n style=\"position: absolute; top: 0; right: 0px; width: 24px; height: 24px;\" kendoButton\n [icon]=\"'delete'\" (click)=\"listDeleteFile(file)\"></button>\n <!-- <button *ngIf=\"file.hasUploaded\" class=\"k-primary\" kendoButton [icon]=\"'check'\" [disabled]=\"true\"></button> -->\n </li>\n </ul>\n <br>\n </div>\n\n <div class=\"queue_list\" *ngIf=\"showType==1\">\n <table>\n <tr style=\"height: 50px; table-layout:fixed;\">\n <th style=\"width: 40px; vertical-align: middle; text-align: center\">\n <!-- <input type=\"checkbox\" id=\"allCheckBox\" (click)=\"selectAllFile()\"> -->\n <div class=\"farris-input-wrap\" (click)=\"selectAllFile()\">\n <div class=\"custom-control custom-checkbox\" style=\"margin: 4px 0 0\">\n <input class=\"custom-control-input\" type=\"checkbox\" id=\"allCheckBox\"\n [(ngModel)]=\"fileAllSelected\">\n <label class=\"custom-control-label\" style=\"padding: 0\"></label>\n </div>\n </div>\n </th>\n <th style=\"vertical-align: middle\" [ngStyle]=\"queueListStyle\">{{'fileName' | locale}}</th>\n <th style=\"width: 100px; vertical-align: middle\">{{'size' | locale}}</th>\n <th style=\"width: 170px; vertical-align: middle; text-align: center\">{{'state' | locale}}</th>\n <th *ngIf=\"haveExtensionProperty\" style=\"width: 100px; vertical-align: middle; text-align: center\">\n {{storageExtension.extensionName}}\n </th>\n <th style=\"width: 140px; vertical-align: middle; text-align: center\">{{'operation' | locale}}</th>\n </tr>\n </table>\n <div style=\"height: 370px; overflow: auto;\">\n <table>\n <tr *ngFor=\"let file of files\" style=\"height: 40px\">\n <td colspan=\"5\" *ngIf=\"file.isUploading\">\n <!-- <div style=\"width:100%; display: table-cell; vertical-align: middle; text-align: center; \"> -->\n <div style=\"width: 500px;margin:0 auto\">\n <farris-progress [percent]=\"file.uploadProcess\" [status]=\"'active'\">\n </farris-progress>\n </div>\n\n </td>\n <td *ngIf=\"!file.isUploading\" style=\" width: 40px; vertical-align: middle; text-align: center\">\n <!-- <input type=\"checkbox\" [id]=\"file.name\" (click)=\"checkoutSelectFile(file.name)\"> -->\n <div class=\"farris-input-wrap\" (click)=\"checkoutSelectFile(file)\">\n <div class=\"custom-control custom-checkbox\" style=\"margin: 4px 0 0\">\n <input class=\"custom-control-input\" type=\"checkbox\" [id]=\"file.name\"\n [(ngModel)]=\"file.selectd\">\n <label class=\"custom-control-label\" style=\"padding: 0\"></label>\n </div>\n </div>\n </td>\n <td *ngIf=\"!file.isUploading\" style=\"vertical-align: middle\" [ngStyle]=\"queueListStyle\">\n {{file.queueListDisplayName}}</td>\n <td *ngIf=\"!file.isUploading\" style=\"width: 100px; vertical-align: middle\">{{file.size}}</td>\n <td *ngIf=\"!file.isUploading\" style=\"text-align: center; width: 170px; vertical-align: middle;\">\n <table *ngIf=\"!file.uploadResult\" style=\"margin: 0 auto\">\n <tr style=\"margin: 0 auto\">\n <td><span class=\"f-icon f-icon-error\"></span></td>\n <td> {{'uploadFailure' | locale}} </td>\n <td><button style=\"height: 24px\" class=\"btn-link btn ng-star-inserted\"\n (click)=\"showErrorMessage(file)\">{{'detail' | locale}}</button></td>\n </tr>\n </table>\n <!-- <span *ngIf=\"!file.uploadResult\"><span class=\"f-icon f-icon-error\"></span> \u4E0A\u4F20\u5931\u8D25 <button\n class=\"btn-link btn ng-star-inserted\" (click)=\"showErrorMessage(file)\">\u8BE6\u60C5</button></span> -->\n <span *ngIf=\"file.uploadResult\"><span class=\"f-icon f-icon-success\"></span> {{'uploadSucceed' |\n locale}}</span>\n </td>\n <td *ngIf=\"!file.isUploading&&haveExtensionProperty\"\n style=\"text-align: center; width: 100px; vertical-align: middle;\">\n <farris-combo-list [(ngModel)]=\"file.extensionDropListId\" [data]=\"propertiesNames\"\n [idField]=\"'id'\" [textField]=\"'name'\" (selectChange)=\"typeChange($event,file)\"\n [enableClear]=\"false\">\n <!-- <ng-template #itemTemp let-item>\n <div class=\"combo-list\">\n <span [class]=\"'combo-list-circle combo-list-'+item.state\"></span>\n <span class=\"combo-list-label\">{{item.label}}</span>\n </div>\n </ng-template> -->\n </farris-combo-list>\n </td>\n <td *ngIf=\"!file.isUploading&&haveSecurityInfo\"\n style=\"text-align: center; width: 100px; vertical-align: middle;\">\n <farris-combo-list [(ngModel)]=\"file.extensionDropListId\" [data]=\"securityInfoList\"\n [idField]=\"'id'\" [textField]=\"'name'\" (selectChange)=\"securityChange($event,file)\"\n [enableClear]=\"false\">\n <!-- <ng-template #itemTemp let-item>\n <div class=\"combo-list\">\n <span [class]=\"'combo-list-circle combo-list-'+item.state\"></span>\n <span class=\"combo-list-label\">{{item.label}}</span>\n </div>\n </ng-template> -->\n </farris-combo-list>\n </td>\n\n <td *ngIf=\"!file.isUploading\" style=\"text-align: center; width: 140px; vertical-align: middle;\">\n <!-- <button *ngIf=\"file.uploadResult\" class=\"btn-link btn ng-star-inserted\" (click)=\"retryUploadFile(file.name)\">\u91CD\u8BD5</button> -->\n <button class=\"btn-link btn ng-star-inserted\" style=\"margin: 0 auto\"\n (click)=\"listDeleteFile(file)\">{{'delete' | locale}}</button>\n </td>\n\n </tr>\n </table>\n </div>\n </div>\n</div>\n\n<div *ngIf=\"!hasSelectedFile\" class='home_page'>\n <img [src]=\"uploadIconAddress\">\n <div>\n <span class=\"btn btn-primary btn-lg\">{{'uploadFile' | locale}} </span>\n <input type=\"file\" (change)=\"fileSelected($event)\" id=\"file\" multiple=\"multiple\" title=\"\" [accept]=\"fileType\">\n <!-- <input type=\"file\" (focus)=\"showLoading()\" (change)=\"fileSelected($event)\" id=\"file\" multiple=\"multiple\" title=\"\" [accept]=\"fileType\"> -->\n </div>\n</div>",
|
|
928
|
-
styles: [".home_page{text-align:center}.home_page img{position:absolute;top:180px;margin-left:-35px;width:70px;height:56px}.home_page div{position:absolute;left:50%;top:255px;margin-left:-75px;width:150px;height:32px;overflow:hidden}.home_page div span{width:150px;height:32px;position:absolute;z-index:10;left:0}.home_page div input{position:absolute;left:0;top:0;opacity:0;filter:'alpha(opacity=0)';z-index:11}.upload_button{width:110px;height:32px;overflow:hidden}.upload_button span{position:relative;right:-4px;top:4px;width:56px;height:22px;font-size:14px}.upload_button input{height:32px;width:110px;position:absolute;left:22px;top:12px;opacity:0;filter:'alpha(opacity=0)';overflow:hidden}.upload_button img{position:relative;left:-6px;top:3px;width:14px;height:14px}.button_group_upload{position:absolute;right:18px;top:12px;height:26px;width:53px}.button_group_upload button{height:26px;width:26px}.fileinput-button{position:absolute;right:60px;bottom:40px;overflow:hidden;width:24px;height:24px;border-radius:12px;transform:scale(2.5);-ms-transform:scale(2.5);-moz-transform:scale(2.5);-webkit-transform:scale(2.5);-o-transform:scale(2.5);color:#0686fd}.fileinput-button input{position:absolute;left:0;top:0;opacity:0;filter:'alpha(opacity=0)'}.pic-droplist{height:24px;color:#e0e1e2;background-color:#e0e1e2}.pic-droplist input-group{display:table-cell;width:100px;text-align:center;border:0}.pic-droplist input-group div{border:0}.pic-droplist input-group div div,.pic-droplist input-group div input{background-color:#e0e1e2}.pic_list{padding:0;height:
|
|
1005
|
+
styles: [".home_page{text-align:center}.home_page img{position:absolute;top:180px;margin-left:-35px;width:70px;height:56px}.home_page div{position:absolute;left:50%;top:255px;margin-left:-75px;width:150px;height:32px;overflow:hidden}.home_page div span{width:150px;height:32px;position:absolute;z-index:10;left:0}.home_page div input{position:absolute;left:0;top:0;opacity:0;filter:'alpha(opacity=0)';z-index:11}.upload_button{width:110px;height:32px;overflow:hidden}.upload_button span{position:relative;right:-4px;top:4px;width:56px;height:22px;font-size:14px}.upload_button input{height:32px;width:110px;position:absolute;left:22px;top:12px;opacity:0;filter:'alpha(opacity=0)';overflow:hidden}.upload_button img{position:relative;left:-6px;top:3px;width:14px;height:14px}.button_group_upload{position:absolute;right:18px;top:12px;height:26px;width:53px}.button_group_upload button{height:26px;width:26px}.fileinput-button{position:absolute;right:60px;bottom:40px;overflow:hidden;width:24px;height:24px;border-radius:12px;transform:scale(2.5);-ms-transform:scale(2.5);-moz-transform:scale(2.5);-webkit-transform:scale(2.5);-o-transform:scale(2.5);color:#0686fd}.fileinput-button input{position:absolute;left:0;top:0;opacity:0;filter:'alpha(opacity=0)'}.pic-droplist{height:24px;color:#e0e1e2;background-color:#e0e1e2}.pic-droplist input-group{display:table-cell;width:100px;text-align:center;border:0}.pic-droplist input-group div{border:0}.pic-droplist input-group div div,.pic-droplist input-group div input{background-color:#e0e1e2}.pic_list{padding:0;height:415px;overflow-y:auto;overflow-x:hidden}.pic_list ul{padding:0;list-style:none;width:100%;margin:20px 0 0 20px}.pic_list ul li{height:179px;width:135px;margin:8px 0 8px 12px;float:left;overflow:hidden;align-items:center;position:relative}.pic_list ul li div{width:135px;height:159px;margin:auto;display:table-cell;vertical-align:middle;text-align:center;position:relative}.pic_list ul li div img{max-width:120px;max-height:118px;align-items:center;margin:auto;vertical-align:middle;text-align:center}.pic_list ul li span.filename{width:100px;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.queue_list{display:block;height:420px;overflow-y:auto}.file_list{list-style:none;margin:0;padding:0;overflow-x:hidden;overflow-y:auto}.file_list li{height:50px;line-height:35px;font-size:16px;position:relative}.file_list li button{float:right;top:6px;right:10px;width:20px}.file_list li p.title{padding:0 0 0 6px;margin:0 210px 0 0}.file_list li p.size{position:absolute;width:100px;top:0;right:100px}"]
|
|
929
1006
|
}] }
|
|
930
1007
|
];
|
|
931
1008
|
/** @nocollapse */
|
|
@@ -1022,6 +1099,8 @@ if (false) {
|
|
|
1022
1099
|
/** @type {?} */
|
|
1023
1100
|
FileUploadComponent.prototype.localepipe;
|
|
1024
1101
|
/** @type {?} */
|
|
1102
|
+
FileUploadComponent.prototype.httpclient;
|
|
1103
|
+
/** @type {?} */
|
|
1025
1104
|
FileUploadComponent.prototype.checkboxPos;
|
|
1026
1105
|
/** @type {?} */
|
|
1027
1106
|
FileUploadComponent.prototype.formId;
|
|
@@ -1063,4 +1142,4 @@ if (false) {
|
|
|
1063
1142
|
FileUploadComponent.prototype.injector;
|
|
1064
1143
|
/* Skipping unhandled member: ;*/
|
|
1065
1144
|
}
|
|
1066
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGdzcC1zdmMvZm9ybWRvYy11cGxvYWQvIiwic291cmNlcyI6WyJsaWIvdXBsb2FkL2ZpbGUtdXBsb2FkL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBWSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWhILE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFckMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFFdkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxN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Q2hDLHdDQUErQjs7SUFDL0Isd0NBQWtDOztJQUNsQywyQ0FBcUQ7O0lBSXJELHFDQUE4Qzs7SUErRDlDLHdDQUFzQjs7SUE4ZHRCLGdEQUE0Qzs7Ozs7SUE3aUJoQyx5Q0FBbUM7Ozs7O0lBQUUsNENBQW9DOzs7OztJQUFFLDBDQUFtQzs7Ozs7SUFBRSx1Q0FBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIFZpZXdDaGlsZCwgVGVtcGxhdGVSZWYsIE9wdGlvbmFsLCBJbmplY3RvciwgTE9DQUxFX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGaWxlSW5mbyB9IGZyb20gJy4uL2VudGl0eS9maWxlaW5mbyc7XG5pbXBvcnQgeyBEb2NUeXBlIH0gZnJvbSAnLi4vZW50aXR5L2RvY3R5cGUnO1xuaW1wb3J0IHsgR3NwRm9ybURvY0luZm8gfSBmcm9tICcuLi9lbnRpdHkvZ3NwZm9ybWRvY2luZm8nO1xuaW1wb3J0IHsgT3BlcmF0aW5nTW9kZXMgfSBmcm9tICcuLi9lbnRpdHkvb3BlcmF0aW5nbW9kZXMnO1xuaW1wb3J0IHsgVXBsb2FkU2VydmljZSB9IGZyb20gJy4uL3VwbG9hZC5zZXJ2aWNlJztcbmltcG9ydCB7IFVwbG9hZEZpbGVJbmZvIH0gZnJvbSAnLi4vZW50aXR5L3VwbG9hZGZpbGVpbmZvJztcbmltcG9ydCB7IE1lc3NhZ2VyU2VydmljZSB9IGZyb20gJ0BmYXJyaXMvdWktbWVzc2FnZXInO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEdzcEZvcm1VcGxvYWRFbnRpdHkgfSBmcm9tICcuLi9lbnRpdHkvZ3NwZm9ybXVwbG9hZGVudGl0eSc7XG5pbXBvcnQgeyBVVUlEIH0gZnJvbSAnYW5ndWxhcjItdXVpZCc7XG5pbXBvcnQgeyBTdG9yYWdlRXh0ZW5zaW9uIH0gZnJvbSAnLi4vZW50aXR5L3N0b3JhZ2VleHRlbnNpb24nO1xuaW1wb3J0IHsgRXhTdG9yYWdlRmlsZUluZm8gfSBmcm9tICcuLi9lbnRpdHkvZXh0ZW5zaW9uc3RvcmFnZWZpbGVpbmZvJztcbmltcG9ydCB7IERyb3BMaXN0RW50aXR5IH0gZnJvbSAnLi4vZW50aXR5L2Ryb3BsaXN0ZW50aXR5JztcbmltcG9ydCB7IExvYWRpbmdTZXJ2aWNlIH0gZnJvbSAnQGZhcnJpcy91aS1sb2FkaW5nJztcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgZmlsbFByb3BlcnRpZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlL3NyYy91dGlsL3Byb3BlcnR5JztcbmltcG9ydCB7IEZpbGVTdGF0ZSB9IGZyb20gJy4uL2VudGl0eS9maWxlc3RhdGUnO1xuaW1wb3J0IHsgTG9jYWxMYW5nUGlwZSB9IGZyb20gJy4uLy4uL2xvY2FsLnBpcGUnO1xuaW1wb3J0IHsgR3NwRG9jU2VjdXJpdHlCYXNlSW5mbyB9IGZyb20gJy4uL2VudGl0eS9nc3Bkb2NzZWN1cml0eW5hc2VpbmZvJztcbmltcG9ydCB7IHN0YXRlIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBTZWN1cml0eUVudGl0eSB9IGZyb20gJy4uL2VudGl0eS9zZWN1cml0eWVudGl0eSc7XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWZpbGUtdXBsb2FkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZmlsZS11cGxvYWQuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBGaWxlVXBsb2FkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBmaWxlczogRmlsZUluZm9bXSA9IFtdO1xuICBtZXRhZGF0YUlkTGlzdDogc3RyaW5nW10gPSBbXTtcbiAgdXBsb2FkRmlsZUluZm9MaXN0OiBVcGxvYWRGaWxlSW5mb1tdID0gW107XG4gIGVyckZpbGVMaXN0OiBzdHJpbmdbXSA9IFtdO1xuICBlcnJUeXBlTGlzdDogc3RyaW5nW10gPSBbXTtcbiAgbnVsbEZpbGVMaXN0OiBzdHJpbmdbXSA9IFtdO1xuICBiZXlvbmRGaWxlTGlzdDogc3RyaW5nW10gPSBbXTtcbiAgc2hvd1R5cGU6IG51bWJlciA9IDA7XG4gIG1vdXNlT246IGJvb2xlYW4gPSBmYWxzZTtcbiAgYnVmZmVyU2l6ZSA9IDEwMjQgKiAxMDI0O1xuICBzZWxlY3RlZEZpbGVzOiBhbnk7XG5cbiAgc2VsZWN0ZWRGaWxlQ291bnQ6IG51bWJlciA9IDA7XG5cbiAgdXBsb2FkSWNvbkFkZHJlc3MgPSAnL3BsYXRmb3JtL3J1bnRpbWUvZGZzL2ltYWdlcy91cGxvYWQuc3ZnJztcbiAgdXBsb2FkTGl0dGxlSWNvbkFkZHJlc3MgPSAnL3BsYXRmb3JtL3J1bnRpbWUvZGZzL2ltYWdlcy91cGxvYWRJY29uLnN2Zyc7XG5cbiAgaGFzU2VsZWN0ZWRGaWxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZmlsZUFsbFNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgdXBsb2FkUHJvY2VzcyA9IHsgd2lkdGg6ICcwJScgfTtcblxuICBmaWxlVG90YWxDaHVuazogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAvL2ZpbGVVcGxvYWRTdGF0ZTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbiAgLy9mbGFnOiBudW1iZXIgPSAwO1xuICByZXF1ZXN0QXJyYXk6IEFycmF5PE9ic2VydmFibGU8YW55Pj4gPSBuZXcgQXJyYXk7XG5cbiAgcmVxdWVzdEJvZHlBcnJheTogQXJyYXk8R3NwRm9ybVVwbG9hZEVudGl0eT4gPSBuZXcgQXJyYXk7XG5cbiAgdXBsb2FkZWRDaHVuazogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICB1cGxvYWRlZFByb2Nlc3M6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcblxuICAvL2FsbFNlbGVjdGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgc3RvcmFnZUV4dGVuc2lvbjogU3RvcmFnZUV4dGVuc2lvbjtcblxuICBkZWZhdWx0UHJvcGVydHlOYW1lOiBzdHJpbmcgPSBcIlwiO1xuICBwcm9wZXJ0aWVzTmFtZXM6IERyb3BMaXN0RW50aXR5W10gPSBbXTtcblxuICBzZWN1cml0eUluZm9MaXN0OiBTZWN1cml0eUVudGl0eVtdID0gW107XG5cbiAgcXVldWVMaXN0U3R5bGUgPSB7IHdpZHRoOiAnNDgwcHgnIH07XG5cbiAgZHJvcExpc3RWYWx1ZTogc3RyaW5nID0gXCJcIjtcblxuICB1cGxvYWRlZEZpbGVUb3RhbDogbnVtYmVyID0gMDtcblxuICB2YWxpZGF0aW9uSWQ6IHN0cmluZztcblxuICBoYXZlRXh0ZW5zaW9uUHJvcGVydHk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBoYXZlU2VjdXJpdHlJbmZvOiBib29sZWFuID0gZmFsc2U7XG5cbiAgdXBsb2FkZWRGaWxlSW5mb0xpc3QgPSBbXTtcbiAgb2xkVXBsb2FkZWRGaWxlTGlzdCA9IFtdO1xuICAvL3VwbG9hZGVkTmFtZUxpc3QgPSBbXTtcblxuICBzYW1lTmFtZUFsbG93ZWQgPSB0cnVlO1xuICBtYXhGaWxlU2l6ZTogbnVtYmVyID0gMDs7XG4gIGxvY2FsZWlkOiBzdHJpbmc7XG4gIGxvY2FsZXBpcGU6IExvY2FsTGFuZ1BpcGU7XG5cbiAgY2hlY2tib3hQb3MgPSB7IHRvcDogJzBweCcgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbXNnU2VydmljZTogTWVzc2FnZXJTZXJ2aWNlLCBwcml2YXRlIHVwbG9hZFNlcnZpY2U6IFVwbG9hZFNlcnZpY2UsIHByaXZhdGUgbG9hZFNlcnZpY2U6IExvYWRpbmdTZXJ2aWNlLCBwcml2YXRlIGluamVjdG9yPzogSW5qZWN0b3IpIHtcbiAgICBpZiAodGhpcy5pbmplY3Rvcikge1xuXG4gICAgICB0aGlzLmxvY2FsZWlkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJsYW5ndWFnZUNvZGVcIikgfHwgdGhpcy5pbmplY3Rvci5nZXQoTE9DQUxFX0lEKTtcbiAgICAgIHRoaXMubG9jYWxlcGlwZSA9IG5ldyBMb2NhbExhbmdQaXBlKHRoaXMubG9jYWxlaWQpO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKSBmb3JtSWQ6IHN0cmluZztcbiAgQElucHV0KCkgcm9vdElkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZpbGVUeXBlOiBzdHJpbmcgPSBcIipcIjtcbiAgQElucHV0KCkgZmlsZUNvdW50OiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBvbGRJZExpc3Q6IHN0cmluZ1tdID0gW107XG4gIEBJbnB1dCgpIHNlY3VyaXR5SW5mbzogR3NwRG9jU2VjdXJpdHlCYXNlSW5mbyA9IG51bGw7XG5cbiAgLy9AT3V0cHV0KCkgb25DdXN0b21FdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQFZpZXdDaGlsZCgnb3BDZWxsJykgb3BDZWxsOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0ZpcmVmb3gnKSA+PSAwKVxuICAgICAgdGhpcy5jaGVja2JveFBvcy50b3AgPSAnMTRweCc7XG4gICAgLy9pZiAodGhpcy5zdG9yYWdlU2VydmljZSAhPSBudWxsKSB7XG4gICAgaWYgKHRoaXMuc2VjdXJpdHlJbmZvICE9IG51bGwpIHtcbiAgICAgIHRoaXMudXBsb2FkU2VydmljZS5nZXRTZWN1cml0eUluZm9MaXN0KHRoaXMuc2VjdXJpdHlJbmZvKS5zdWJzY3JpYmUoXG4gICAgICAgIHJlcyA9PiB7XG4gICAgICAgICAgdGhpcy5oYXZlU2VjdXJpdHlJbmZvID0gdHJ1ZTtcbiAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgcmVzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlY3VyaXR5SW5mb0xpc3QucHVzaCh7IGlkOiBpLnRvU3RyaW5nKCksIHNlY3VyaXR5SWQ6IGVsZW1lbnQuc2VjdXJpdHlJZCwgc2VjdXJpdHlMZXZlbDogZWxlbWVudC5zZWN1cml0eUxldmVsLCBuYW1lOiBlbGVtZW50Lm5hbWUgfSk7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG4gICAgdGhpcy51cGxvYWRTZXJ2aWNlLmdldFN0b3JhZ2VFeHRlbnNpb25JbmZvKCkuc3Vic2NyaWJlKFxuICAgICAgcmVzID0+IHtcbiAgICAgICAgaWYgKHJlcyAhPSBudWxsICYmIHJlcy5lcnJvciA9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5zdG9yYWdlRXh0ZW5zaW9uID0gcmVzO1xuICAgICAgICAgIHRoaXMuZGVmYXVsdFByb3BlcnR5TmFtZSA9IHRoaXMuc3RvcmFnZUV4dGVuc2lvbi5kZWZhdWx0UHJvcGVydHlOYW1lO1xuICAgICAgICAgIHRoaXMucHJvcGVydGllc05hbWVzLnB1c2goeyBpZDogXCIwXCIsIG5hbWU6IHRoaXMuc3RvcmFnZUV4dGVuc2lvbi5kZWZhdWx0UHJvcGVydHlOYW1lIH0pO1xuICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAvLyB0aGlzLnByb3BlcnRpZXNOYW1lcy5wdXNoKC4uLih0aGlzLnN0b3JhZ2VFeHRlbnNpb24uZXh0ZW5zaW9uUHJvcGVydHlOYW1lTGlzdCkpO1xuICAgICAgICAgIHRoaXMuc3RvcmFnZUV4dGVuc2lvbi5leHRlbnNpb25Qcm9wZXJ0eU5hbWVMaXN0LmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb3BlcnRpZXNOYW1lcy5wdXNoKHsgaWQ6ICgrK2kpLnRvU3RyaW5nKCksIG5hbWU6IGVsZW1lbnQgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5xdWV1ZUxpc3RTdHlsZS53aWR0aCA9ICczODBweCc7XG4gICAgICAgICAgdGhpcy5oYXZlRXh0ZW5zaW9uUHJvcGVydHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKVxuXG4gICAgdGhpcy51cGxvYWRTZXJ2aWNlLmdldFJvb3RTZXR0aW5nKHRoaXMucm9vdElkKS5zdWJzY3JpYmUoXG4gICAgICByZXMgPT4ge1xuICAgICAgICBpZiAocmVzICE9IG51bGwgJiYgcmVzLmVycm9yID09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLnNhbWVOYW1lQWxsb3dlZCA9IHJlcy5zYW1lTmFtZUFsbG93ZWQ7XG4gICAgICAgICAgdGhpcy52YWxpZGF0aW9uSWQgPSByZXMudmFsaWRhdGlvbklkO1xuICAgICAgICAgIGlmICghdGhpcy5zYW1lTmFtZUFsbG93ZWQpIHtcbiAgICAgICAgICAgIHRoaXMudXBsb2FkU2VydmljZS5nZXRVcGxvYWRlZEZpbGVJbmZvTGlzdCh0aGlzLmZvcm1JZCwgdGhpcy5yb290SWQpLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzICE9IG51bGwgJiYgcmVzLmVycm9yID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QgPSByZXM7XG4gICAgICAgICAgICAgICAgICB0aGlzLm9sZFVwbG9hZGVkRmlsZUxpc3QgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlcykpOztcblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy51cGxvYWRTZXJ2aWNlLmdldFZhbGlkYXRpb24odGhpcy52YWxpZGF0aW9uSWQpLnN1YnNjcmliZShcbiAgICAgICAgICAgIHJlcyA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubWF4RmlsZVNpemUgPSBwYXJzZUludChKU09OLnBhcnNlKHJlcy5jb25maWd1cmF0aW9uKS5tYXhGaWxlU2l6ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgKVxuICAgIGlmICh0aGlzLm9sZElkTGlzdCAhPSBudWxsICYmIHRoaXMub2xkSWRMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudXBsb2FkU2VydmljZS5jYW5jZWwodGhpcy5vbGRJZExpc3QsIHRoaXMucm9vdElkKS5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICB0b3RhbExvYWQ6IGFueSA9IG51bGw7XG5cbiAgc2hvd0xvYWRpbmcoKSB7XG4gICAgdGhpcy5oYXNTZWxlY3RlZEZpbGUgPSB0cnVlO1xuICAgIC8vIGlmICh0aGlzLnRvdGFsTG9hZCA9PSBudWxsKVxuICAgIC8vICAgdGhpcy50b3RhbExvYWQgPSB0aGlzLmxvYWRTZXJ2aWNlLnNob3coe1xuICAgIC8vICAgICBtZXNzYWdlOiB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCd1cGxvYWRpbmcnKVxuICAgIC8vICAgfSk7XG4gIH1cblxuXG4gIGZpbGVTZWxlY3RlZCgkZXZlbnQpIHtcblxuICAgIC8vIGNvbnN0IGxvYWRpbmcgPSB0aGlzLmxvYWRTZXJ2aWNlLnNob3coe1xuICAgIC8vICAgbWVzc2FnZTogdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgndXBsb2FkaW5nJylcbiAgICAvLyB9KTtcblxuICAgIC8vIHRoaXMudG90YWxMb2FkLmNsb3NlKCk7XG4gICAgLy8gdGhpcy50b3RhbExvYWQgPSBudWxsO1xuICAgIHRoaXMuaGFzU2VsZWN0ZWRGaWxlID0gdHJ1ZTtcbiAgICB0aGlzLnNlbGVjdGVkRmlsZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjZmlsZScpO1xuXG4gICAgaWYgKHRoaXMuZmlsZUNvdW50ID4gMCkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRGaWxlcy5maWxlcy5sZW5ndGggKyB0aGlzLmZpbGVzLmxlbmd0aCA+IHRoaXMuZmlsZUNvdW50KSB7XG4gICAgICAgIGxldCBzZWxlY3RlZE51bTogbnVtYmVyID0gKHRoaXMuc2VsZWN0ZWRGaWxlcy5maWxlcy5sZW5ndGggYXMgbnVtYmVyKSArIHRoaXMuZmlsZXMubGVuZ3RoO1xuICAgICAgICB0aGlzLm1zZ1NlcnZpY2Uud2FybmluZyh0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdzZWxlY3RlZENvdW50JykgKyBzZWxlY3RlZE51bSArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ2xpbWl0Q291bnQnKSArIHRoaXMuZmlsZUNvdW50ICsgdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgncmVjaG9vc2VGaWxlJykpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy90aGlzLmZsYWcgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWxlY3RlZEZpbGVzLmZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgc2VsZWN0ZWRGaWxlID0gdGhpcy5zZWxlY3RlZEZpbGVzLmZpbGVzW2ldO1xuICAgICAgLy9zZWxlY3RlZEZpbGUuc2xpY2VcbiAgICAgIGxldCB1dWlkID0gVVVJRC5VVUlEKCk7XG5cbiAgICAgIGlmIChzZWxlY3RlZEZpbGUuc2l6ZSA9PSAwKSB7XG4gICAgICAgIHRoaXMubnVsbEZpbGVMaXN0LnB1c2goc2VsZWN0ZWRGaWxlLm5hbWUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMubWF4RmlsZVNpemUgIT0gbnVsbCAmJiB0aGlzLm1heEZpbGVTaXplID4gMCkge1xuICAgICAgICBpZiAoc2VsZWN0ZWRGaWxlLnNpemUgPiB0aGlzLm1heEZpbGVTaXplICogMTAwMCkge1xuICAgICAgICAgIHRoaXMuYmV5b25kRmlsZUxpc3QucHVzaChzZWxlY3RlZEZpbGUubmFtZSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnNhbWVOYW1lQWxsb3dlZCkge1xuICAgICAgICBpZiAodGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5maW5kKHggPT4geC5maWxlTmFtZSA9PSBzZWxlY3RlZEZpbGUubmFtZSkgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIHRoaXMudXBsb2FkZWROYW1lTGlzdC5wdXNoKHNlbGVjdGVkRmlsZS5uYW1lKTtcbiAgICAgICAgICAvLyB0aGlzLm1zZ1NlcnZpY2UucXVlc3Rpb24oJ+S5i+WJjeW3suS4iuS8oOi/h+WQjOWQjeaWh+S7tjogJyArIHNlbGVjdGVkRmlsZS5uYW1lICsgJ++8jOmcgOimgeabv+aNouS5iO+8nycsICgpID0+IHtcbiAgICAgICAgICAvLyAgIHV1aWQgPSB0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LmZpbmQoeCA9PiB4LmZpbGVOYW1lID09IHNlbGVjdGVkRmlsZS5uYW1lKS5tZXRhZGF0YUlkO1xuICAgICAgICAgIC8vICAgdGhpcy51cGxvYWRGaWxlKHV1aWQsIHNlbGVjdGVkRmlsZSk7XG4gICAgICAgICAgLy8gfSlcbiAgICAgICAgICBjb25zdCBtc2cgPSB0aGlzLm1zZ1NlcnZpY2Uuc2hvdygnd2FybmluZycsIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ2hhdmVTYW1lTmFtZScpICsgc2VsZWN0ZWRGaWxlLm5hbWUsIHtcbiAgICAgICAgICAgIGluaXRpYWxTdGF0ZToge1xuICAgICAgICAgICAgICBidXR0b25zOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgncmVuYW1lJyksXG4gICAgICAgICAgICAgICAgICBjbHM6ICdidG4gYnRuLXNlY29uZGFyeScsXG4gICAgICAgICAgICAgICAgICBoYW5kbGU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9sZE5hbWU6IHN0cmluZyA9IHNlbGVjdGVkRmlsZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3TmFtZVxuICAgICAgICAgICAgICAgICAgICBsZXQgZmxhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpID0gMTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICBuZXdOYW1lID0gb2xkTmFtZS5zdWJzdHJpbmcoMCwgb2xkTmFtZS5sYXN0SW5kZXhPZignLicpKSArICcoJyArIGkgKyAnKScgKyBvbGROYW1lLnN1YnN0cmluZyhvbGROYW1lLmxhc3RJbmRleE9mKCcuJykpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LmZpbmQoeCA9PiB4LmZpbGVOYW1lID09IG5ld05hbWUpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRGaWxlKHV1aWQsIHNlbGVjdGVkRmlsZSwgbmV3TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIG1zZy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgncmVwbGFjZScpLFxuICAgICAgICAgICAgICAgICAgY2xzOiAnYnRuIGJ0bi1zZWNvbmRhcnknLFxuICAgICAgICAgICAgICAgICAgaGFuZGxlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHV1aWQgPSB0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LmZpbmQoeCA9PiB4LmZpbGVOYW1lID09IHNlbGVjdGVkRmlsZS5uYW1lKS5tZXRhZGF0YUlkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZEZpbGUodXVpZCwgc2VsZWN0ZWRGaWxlLCBzZWxlY3RlZEZpbGUubmFtZSwgRmlsZVN0YXRlLlVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlVG90YWwtLTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub2xkVXBsb2FkZWRGaWxlTGlzdC5maW5kKHggPT4geC5maWxlTmFtZSA9PSBzZWxlY3RlZEZpbGUubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZVRvdGFsKys7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5zcGxpY2UodGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5pbmRleE9mKHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuZmlsdGVyKHggPT4geC5maWxlTmFtZSA9PSBzZWxlY3RlZEZpbGUubmFtZSlbMF0pLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtc2cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ2NhbmNlbCcpLFxuICAgICAgICAgICAgICAgICAgY2xzOiAnYnRuIGJ0bi1zZWNvbmRhcnknLFxuICAgICAgICAgICAgICAgICAgaGFuZGxlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG1zZy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMudXBsb2FkRmlsZSh1dWlkLCBzZWxlY3RlZEZpbGUsIHNlbGVjdGVkRmlsZS5uYW1lKTtcblxuICAgIH1cbiAgICAvLyBpZiAodGhpcy51cGxvYWRlZE5hbWVMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAvLyAgIGxldCBuYW1lOiBzdHJpbmcgPSB0aGlzLmxpc3RUb1N0cmluZyh0aGlzLnVwbG9hZGVkTmFtZUxpc3QpO1xuICAgIC8vICAgdGhpcy5tc2dTZXJ2aWNlLndhcm5pbmcoJ+S5i+WJjeW3suS4iuS8oOi/h+WQjOWQjeaWh+S7tjogJyArIG5hbWUgKyAn6K+36YeN5paw6YCJ5oup5LiK5Lyg5paH5Lu244CCJyk7XG4gICAgLy8gICB0aGlzLnVwbG9hZGVkTmFtZUxpc3QgPSBbXTtcbiAgICAvLyB9XG5cbiAgICBpZiAodGhpcy5lcnJGaWxlTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgbmFtZTogc3RyaW5nID0gdGhpcy5saXN0VG9TdHJpbmcodGhpcy5lcnJGaWxlTGlzdCk7XG4gICAgICB0aGlzLm1zZ1NlcnZpY2Uud2FybmluZyh0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdoYXZlU2FtZU5hbWUnKSArIG5hbWUgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZWNob29zZUZpbGUnKSk7XG4gICAgICB0aGlzLmVyckZpbGVMaXN0ID0gW107XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubnVsbEZpbGVMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBuYW1lOiBzdHJpbmcgPSB0aGlzLmxpc3RUb1N0cmluZyh0aGlzLm51bGxGaWxlTGlzdCk7XG4gICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGggLSAxKTtcbiAgICAgIHRoaXMubXNnU2VydmljZS53YXJuaW5nKG5hbWUgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdzaXplWmVybycpICsgdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgncmVjaG9vc2VGaWxlJykpO1xuICAgICAgdGhpcy5udWxsRmlsZUxpc3QgPSBbXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5iZXlvbmRGaWxlTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgbmFtZTogc3RyaW5nID0gdGhpcy5saXN0VG9TdHJpbmcodGhpcy5iZXlvbmRGaWxlTGlzdCk7XG4gICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGggLSAxKTtcbiAgICAgIHRoaXMubXNnU2VydmljZS53YXJuaW5nKG5hbWUgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdzaXplTWF4JykgKyB0aGlzLm1heEZpbGVTaXplICsgXCJLQlwiICsgdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgncmVjaG9vc2VGaWxlJykpO1xuICAgICAgdGhpcy5iZXlvbmRGaWxlTGlzdCA9IFtdO1xuICAgIH1cbiAgICAvLyBpZiAodGhpcy5lcnJUeXBlTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgLy8gICBsZXQgdHlwZTogc3RyaW5nID0gdGhpcy5saXN0VG9TdHJpbmcodGhpcy5lcnJUeXBlTGlzdCk7XG4gICAgLy8gICB0aGlzLm1zZ1NlcnZpY2Uud2FybmluZygn5LiN5pSv5oyB5LiK5Lyg57G75Z6L5Li6ICcgKyB0eXBlICsgJ+eahOaWh+S7tuivt+mHjeaWsOmAieaLqeS4iuS8oOaWh+S7tuOAgicpO1xuICAgIC8vICAgdGhpcy5lcnJUeXBlTGlzdCA9IFtdO1xuICAgIC8vIH1cbiAgICB0aGlzLmZpbGVzID0gdGhpcy5maWxlcy5zbGljZSgpO1xuICAgIHRoaXMuZmlsZUFsbFNlbGVjdGVkID0gZmFsc2U7XG4gICAgJGV2ZW50LnRhcmdldC52YWx1ZSA9ICcnO1xuICAgIC8vIGxvYWRpbmcuY2xvc2UoKTtcbiAgfVxuXG4gIHNob3dFcnJvck1lc3NhZ2UoZmlsZSkge1xuICAgIHRoaXMubXNnU2VydmljZS5lcnJvcih0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCd1cGxvYWRGYWlsdXJlJykgKyBmaWxlLmVycm9yTWVzc2FnZSk7XG4gIH1cblxuXG4gIHVwbG9hZEZpbGUodXVpZDogc3RyaW5nLCBzZWxlY3RlZEZpbGUsIGZpbGVOYW1lOiBzdHJpbmcsIHN0YXRlOiBGaWxlU3RhdGUgPSBGaWxlU3RhdGUuTmV3KSB7XG4gICAgbGV0IGZpbGVJbmZvOiBGaWxlSW5mbztcbiAgICAvLyBsZXQgdXVpZCA9IFVVSUQuVVVJRCgpO1xuICAgIC8vcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyhzZWxlY3RlZEZpbGUpO1xuICAgIC8vcmVhZGVyLm9ubG9hZCA9IChlKSA9PiB7XG4gICAgZmlsZUluZm8gPSB7XG4gICAgICBpZDogdXVpZCxcbiAgICAgIG5hbWU6IGZpbGVOYW1lLFxuICAgICAgdHlwZTogc2VsZWN0ZWRGaWxlLnR5cGUsXG4gICAgICBzb3VyY2U6IFwiXCIsXG4gICAgICBzaXplOiB0aGlzLmdldEZpbGVTaXplKHNlbGVjdGVkRmlsZS5zaXplKSxcbiAgICAgIGZpbGVTaXplOiBzZWxlY3RlZEZpbGUuc2l6ZSxcbiAgICAgIHBpY0xpc3REaXNwbGF5TmFtZTogdGhpcy5nZXRQaWNMaXN0RGlzcGxheU5hbWUoZmlsZU5hbWUpLFxuICAgICAgcXVldWVMaXN0RGlzcGxheU5hbWU6IHRoaXMuZ2V0UXVldWVEaXNwbGF5TmFtZShmaWxlTmFtZSksXG4gICAgICAvL2NvbnRlbnQ6IHJlYWRlci5yZXN1bHQudG9TdHJpbmcoKSxcbiAgICAgIGhhc1VwbG9hZGVkOiBmYWxzZSxcbiAgICAgIG1vdXNlT246IGZhbHNlLFxuICAgICAgc2VsZWN0ZDogZmFsc2UsXG4gICAgICBpc1VwbG9hZGluZzogdHJ1ZSxcbiAgICAgIHVwbG9hZFJlc3VsdDogZmFsc2UsXG4gICAgICB1cGxvYWRQcm9jZXNzOiAwLFxuICAgICAgZXJyb3JNZXNzYWdlOiBcIlwiLFxuICAgICAgZXh0ZW5zaW9uRHJvcExpc3RJZDogMCxcbiAgICAgIGV4dGVuc2lvbk5hbWU6IFwiXCIsXG4gICAgICBzZWN1cml0eURyb3BMaXN0SWQ6IDAsXG4gICAgICBzZWN1cml0eUluZm86IHRoaXMuc2VjdXJpdHlJbmZvTGlzdFswXVxuICAgIH1cblxuICAgIGlmICh0aGlzLnN0b3JhZ2VFeHRlbnNpb24gIT0gbnVsbClcbiAgICAgIGZpbGVJbmZvLmV4dGVuc2lvbk5hbWUgPSB0aGlzLmRlZmF1bHRQcm9wZXJ0eU5hbWU7XG4gICAgbGV0IGNodW5rVG90YWw6IG51bWJlciA9IE1hdGguY2VpbChzZWxlY3RlZEZpbGUuc2l6ZSAvIHRoaXMuYnVmZmVyU2l6ZSk7XG4gICAgbGV0IGNodW5rSW5kZXg6IG51bWJlciA9IDA7XG5cblxuICAgIHRoaXMuZmlsZVRvdGFsQ2h1bmtbdXVpZF0gPSBjaHVua1RvdGFsO1xuXG4gICAgbGV0IHVwbG9hZEZpbGVJbmZvID0gbmV3IFVwbG9hZEZpbGVJbmZvKCk7XG5cbiAgICB1cGxvYWRGaWxlSW5mby5tZXRhZGF0YUlkID0gdXVpZDtcbiAgICB1cGxvYWRGaWxlSW5mby5maWxlTmFtZSA9IGZpbGVJbmZvLm5hbWU7XG4gICAgdXBsb2FkRmlsZUluZm8uZmlsZVNpemUgPSBmaWxlSW5mby5zaXplO1xuICAgIHVwbG9hZEZpbGVJbmZvLnN0YXRlID0gc3RhdGU7XG4gICAgdXBsb2FkRmlsZUluZm8uc2VjdXJpdHlJbmZvID0gdGhpcy5zZWN1cml0eUluZm9MaXN0WzBdO1xuXG5cbiAgICB3aGlsZSAoY2h1bmtJbmRleCA8IGNodW5rVG90YWwpIHtcbiAgICAgIGxldCB1cGxvYWRJbmZvID0gbmV3IEdzcEZvcm1VcGxvYWRFbnRpdHk7XG4gICAgICB1cGxvYWRJbmZvLmZvcm1JZCA9IHRoaXMuZm9ybUlkO1xuICAgICAgdXBsb2FkSW5mby5tb2RlID0gT3BlcmF0aW5nTW9kZXMuVGVtcDtcbiAgICAgIHVwbG9hZEluZm8ucm9vdElkID0gdGhpcy5yb290SWQ7XG5cbiAgICAgIGxldCBkb2NJbmZvOiBHc3BGb3JtRG9jSW5mbyA9IG5ldyBHc3BGb3JtRG9jSW5mbztcblxuICAgICAgZG9jSW5mby5maWxlTmFtZSA9IGZpbGVOYW1lO1xuICAgICAgZG9jSW5mby5tZXRhZGF0YUlkID0gdXVpZDtcbiAgICAgIGRvY0luZm8udG90YWwgPSBjaHVua1RvdGFsO1xuXG4gICAgICB0aGlzLnVwbG9hZGVkQ2h1bmtbZG9jSW5mby5tZXRhZGF0YUlkXSA9IDA7XG5cbiAgICAgIGxldCBuZXh0U2l6ZSA9IE1hdGgubWluKChjaHVua0luZGV4ICsgMSkgKiB0aGlzLmJ1ZmZlclNpemUsIHNlbGVjdGVkRmlsZS5zaXplKTtcbiAgICAgIGxldCBmaWxlRGF0YSA9IHNlbGVjdGVkRmlsZS5zbGljZShjaHVua0luZGV4ICogdGhpcy5idWZmZXJTaXplLCBuZXh0U2l6ZSk7XG5cbiAgICAgIC8vIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgLy8gcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyhmaWxlRGF0YSk7XG4gICAgICBsZXQgaW5uZXJJbmRleCA9IGNodW5rSW5kZXg7XG4gICAgICAvLyByZWFkZXIub25sb2FkID0gKCkgPT4ge1xuICAgICAgLy8gICBkb2NJbmZvLmZpbGVDb250ZW50ID0gYnRvYShyZWFkZXIucmVzdWx0LnRvU3RyaW5nKCkpO1xuICAgICAgZG9jSW5mby5zaXplID0gc2VsZWN0ZWRGaWxlLnNpemU7XG4gICAgICBkb2NJbmZvLmluZGV4ID0gaW5uZXJJbmRleDtcbiAgICAgIGRvY0luZm8uZmlsZUNvbnRlbnQgPSBcIlwiXG4gICAgICAvL2NodW5rSW5kZXgrKztcbiAgICAgIGlmICh0aGlzLmhhdmVFeHRlbnNpb25Qcm9wZXJ0eSlcbiAgICAgICAgZG9jSW5mby5leFByb3BlcnR5TmFtZSA9IHRoaXMuZGVmYXVsdFByb3BlcnR5TmFtZTtcblxuICAgICAgLy9kb2NJbmZvLmlzTGFzdCA9IHRydWU7XG4gICAgICB1cGxvYWRJbmZvLmRvY0luZm8gPSBkb2NJbmZvO1xuXG4gICAgICAvLyBsZXQgaW5mbyA9IHVwbG9hZEluZm87XG5cbiAgICAgIC8vIHRoaXMucmVxdWVzdEFycmF5LnB1c2godGhpcy51cGxvYWRTZXJ2aWNlLnVwbG9hZEZpbGUodXBsb2FkSW5mbykpO1xuICAgICAgLy8gdGhpcy5yZXF1ZXN0Qm9keUFycmF5LnB1c2goaW5mbyk7XG4gICAgICAvL+Wwgeijheivt+axgmZvcm1kYXRhXG4gICAgICBsZXQgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgndXBsb2FkSW5mbycsIEpTT04uc3RyaW5naWZ5KHVwbG9hZEluZm8pKTtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZG9jSW5mbycsIEpTT04uc3RyaW5naWZ5KGRvY0luZm8pKTtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGVEYXRhKTtcblxuICAgICAgdGhpcy51cGxvYWRTZXJ2aWNlLnVwbG9hZFNsaWNlRmlsZShmb3JtRGF0YSkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgIGlmIChyZXMgIT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0udXBsb2FkUmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5maWxlc1t0aGlzLmZpbGVzLmluZGV4T2YoZmlsZUluZm8pXS5pc1VwbG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0uZXJyb3JNZXNzYWdlID0gcmVzLmVycm9yLk1lc3NhZ2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy51cGxvYWRlZENodW5rW2RvY0luZm8ubWV0YWRhdGFJZF0rKztcbiAgICAgICAgICB0aGlzLmZpbGVzW3RoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyldLnVwbG9hZFByb2Nlc3MgPSBOdW1iZXIucGFyc2VJbnQoKHRoaXMudXBsb2FkZWRDaHVua1tkb2NJbmZvLm1ldGFkYXRhSWRdIC8gdGhpcy5maWxlVG90YWxDaHVua1tkb2NJbmZvLm1ldGFkYXRhSWRdICogMTAwKS50b0ZpeGVkKDApKTtcbiAgICAgICAgICBpZiAodGhpcy51cGxvYWRlZENodW5rW2RvY0luZm8ubWV0YWRhdGFJZF0gPT0gdGhpcy5maWxlVG90YWxDaHVua1tkb2NJbmZvLm1ldGFkYXRhSWRdKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVzW3RoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyldLnVwbG9hZFJlc3VsdCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmZpbGVzW3RoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyldLmlzVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdCA9IHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LmNvbmNhdCh1cGxvYWRGaWxlSW5mbyk7XG4gICAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0ID0gdGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5jb25jYXQodXBsb2FkRmlsZUluZm8pO1xuICAgICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVUb3RhbCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyB9XG4gICAgICAvL2NvbnNvbGUubG9nKGNodW5rSW5kZXggKyAxKTtcbiAgICAgIGNodW5rSW5kZXggPSBjaHVua0luZGV4ICsgMTtcbiAgICB9XG5cbiAgICBsZXQgdHlwZTogc3RyaW5nID0gc2VsZWN0ZWRGaWxlLnR5cGU7XG4gICAgaWYgKHR5cGUuaW5jbHVkZXMoXCJ0aWZmXCIpKSB7XG4gICAgICB0aGlzLmFkZERvY0luZm8oc2VsZWN0ZWRGaWxlLCBmaWxlSW5mbywgRG9jVHlwZS5PdGhlcik7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUuaW5jbHVkZXMoXCJpbWFnZVwiKSkge1xuICAgICAgdGhpcy5hZGREb2NJbmZvKHNlbGVjdGVkRmlsZSwgZmlsZUluZm8sIERvY1R5cGUuSW1hZ2UpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlLmluY2x1ZGVzKFwid29yZFwiKSkge1xuICAgICAgdGhpcy5hZGREb2NJbmZvKHNlbGVjdGVkRmlsZSwgZmlsZUluZm8sIERvY1R5cGUuV29yZCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUuaW5jbHVkZXMoXCJwZGZcIikpIHtcbiAgICAgIHRoaXMuYWRkRG9jSW5mbyhzZWxlY3RlZEZpbGUsIGZpbGVJbmZvLCBEb2NUeXBlLlBkZik7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUuaW5jbHVkZXMoXCJwbGFpblwiKSkge1xuICAgICAgdGhpcy5hZGREb2NJbmZvKHNlbGVjdGVkRmlsZSwgZmlsZUluZm8sIERvY1R5cGUuVHh0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZS5pbmNsdWRlcyhcInNoZWV0XCIpIHx8IHR5cGUuaW5jbHVkZXMoXCJleGNlbFwiKSkge1xuICAgICAgdGhpcy5hZGREb2NJbmZvKHNlbGVjdGVkRmlsZSwgZmlsZUluZm8sIERvY1R5cGUuRXhjZWwpXG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUuaW5jbHVkZXMoXCJwb3dlcnBvaW50XCIpIHx8IHR5cGUuaW5jbHVkZXMoXCJwcmVzZW50YXRpb25cIikpIHtcbiAgICAgIHRoaXMuYWRkRG9jSW5mbyhzZWxlY3RlZEZpbGUsIGZpbGVJbmZvLCBEb2NUeXBlLlBvd2VycG9pbnQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuYWRkRG9jSW5mbyhzZWxlY3RlZEZpbGUsIGZpbGVJbmZvLCBEb2NUeXBlLk90aGVyKTtcbiAgICAgIC8vIGxldCBuYW1lOiBzdHJpbmcgPSBzZWxlY3RlZEZpbGUubmFtZTtcbiAgICAgIC8vIGxldCBlcnJUeXBlID0gbmFtZS5zdWJzdHJpbmcoc2VsZWN0ZWRGaWxlLm5hbWUubGFzdEluZGV4T2YoJy4nKSk7XG4gICAgICAvLyB0aGlzLmVyclR5cGVMaXN0LnB1c2goZXJyVHlwZSk7XG4gICAgfVxuICAgIGxldCBpbmRleCA9IC0xO1xuICAgIHRoaXMuZmlsZXMuZm9yRWFjaCh4ID0+IHtcbiAgICAgIGlmICh4Lm5hbWUgPT0gZmlsZUluZm8ubmFtZSkge1xuICAgICAgICBpZiAoaW5kZXggPT0gLTEpXG4gICAgICAgICAgaW5kZXggPSB0aGlzLmZpbGVzLmluZGV4T2YoeCk7XG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoaW5kZXggIT0gLTEgJiYgaW5kZXggIT0gdGhpcy5maWxlcy5sZW5ndGggLSAxKSB7XG4gICAgICB0aGlzLmZpbGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgdGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgdGhpcy51cGxvYWRlZEZpbGVUb3RhbC0tO1xuICAgIH1cbiAgfVxuXG5cbiAgc2VsZWN0QWxsRmlsZSgpIHtcblxuICAgIGlmICghdGhpcy5maWxlQWxsU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuZmlsZXMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgLy8gbGV0IG9iajogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudC5uYW1lKTtcbiAgICAgICAgLy8gb2JqLmNoZWNrZWQgPSB0cnVlO1xuICAgICAgICBlbGVtZW50LnNlbGVjdGQgPSB0cnVlO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmZpbGVBbGxTZWxlY3RlZCA9IHRydWU7XG4gICAgICB0aGlzLnNlbGVjdGVkRmlsZUNvdW50ID0gdGhpcy5maWxlcy5sZW5ndGg7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWxlcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAvLyBsZXQgb2JqOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50Lm5hbWUpO1xuICAgICAgICAvLyBvYmouY2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICBlbGVtZW50LnNlbGVjdGQgPSBmYWxzZTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5maWxlQWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlQ291bnQgPSAwO1xuICAgIH1cbiAgfVxuXG5cbiAgY2hlY2tvdXRTZWxlY3RGaWxlKGZpbGU6IEZpbGVJbmZvKSB7XG4gICAgLy8gbGV0IG9iajogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZmlsZU5hbWUpO1xuICAgIGZpbGUuc2VsZWN0ZCA9ICFmaWxlLnNlbGVjdGQ7XG4gICAgaWYgKGZpbGUuc2VsZWN0ZClcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlQ291bnQrKztcbiAgICBlbHNlXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsZUNvdW50LS07XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGaWxlQ291bnQgPT0gdGhpcy5maWxlcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZmlsZUFsbFNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIC8vdGhpcy5pc0ZpbGVBbGxTZWxlY3RlZCgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuZmlsZUFsbFNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAvL3RoaXMuaXNGaWxlQWxsU2VsZWN0ZWQoKTtcbiAgICB9XG5cbiAgfVxuXG4gIGxpc3REZWxldGVGaWxlKGZpbGVJbmZvOiBGaWxlSW5mbykge1xuICAgIGlmIChmaWxlSW5mby5zZWxlY3RkKVxuICAgICAgdGhpcy5zZWxlY3RlZEZpbGVDb3VudC0tO1xuICAgIC8vY29uc29sZS5sb2coZmlsZU5hbWUpO1xuICAgIHRoaXMuZmlsZXMuc3BsaWNlKHRoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyksIDEpO1xuICAgIGlmIChmaWxlSW5mby51cGxvYWRSZXN1bHQpIHtcbiAgICAgIGxldCBpZExpc3Q6IHN0cmluZ1tdID0gW107XG4gICAgICBpZExpc3QucHVzaChmaWxlSW5mby5pZCk7XG4gICAgICB0aGlzLnVwbG9hZFNlcnZpY2UuY2FuY2VsKGlkTGlzdCwgdGhpcy5yb290SWQpLnN1YnNjcmliZSgpO1xuXG4gICAgICB0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdC5zcGxpY2UodGhpcy51cGxvYWRGaWxlSW5mb0xpc3QuaW5kZXhPZih0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdC5maWx0ZXIoeCA9PiB4LmZpbGVOYW1lID09IGZpbGVJbmZvLm5hbWUpWzBdKSwgMSk7XG4gICAgICB0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LnNwbGljZSh0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LmluZGV4T2YodGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5maWx0ZXIoeCA9PiB4LmZpbGVOYW1lID09IGZpbGVJbmZvLm5hbWUpWzBdKSwgMSk7XG4gICAgICB0aGlzLnVwbG9hZGVkRmlsZVRvdGFsLS07XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdGVkRmlsZUNvdW50ID09IDApXG4gICAgICB0aGlzLmZpbGVBbGxTZWxlY3RlZCA9IGZhbHNlO1xuICB9XG5cbiAgbGlzdE11bHRpcGxlRGVsZXRlRmlsZSgpIHtcbiAgICBsZXQgc2VsZWN0ZWRGaWxlOiBGaWxlSW5mb1tdID0gW107XG4gICAgdGhpcy5maWxlcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgbGV0IG9iajogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudC5uYW1lKTtcbiAgICAgIGlmIChvYmouY2hlY2tlZClcbiAgICAgICAgc2VsZWN0ZWRGaWxlLnB1c2goZWxlbWVudCk7XG4gICAgfSlcbiAgICBsZXQgbWV0YWRhdGFMaXN0OiBzdHJpbmdbXSA9IFtdO1xuICAgIHNlbGVjdGVkRmlsZS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgbWV0YWRhdGFMaXN0LnB1c2goZWxlbWVudC5pZCk7XG4gICAgICB0aGlzLmZpbGVzLnNwbGljZSh0aGlzLmZpbGVzLmluZGV4T2YoZWxlbWVudCksIDEpO1xuICAgICAgaWYgKGVsZW1lbnQudXBsb2FkUmVzdWx0KSB7XG4gICAgICAgIC8vIGxldCBpZExpc3Q6IHN0cmluZ1tdID0gW107XG4gICAgICAgIC8vIGlkTGlzdC5wdXNoKGZpbGVJbmZvLmlkKTtcbiAgICAgICAgLy8gdGhpcy51cGxvYWRTZXJ2aWNlLmNhbmNlbChpZExpc3QsIHRoaXMucm9vdElkKS5zdWJzY3JpYmUoKTtcblxuICAgICAgICB0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdC5zcGxpY2UodGhpcy51cGxvYWRGaWxlSW5mb0xpc3QuaW5kZXhPZih0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdC5maWx0ZXIoeCA9PiB4LmZpbGVOYW1lID09IGVsZW1lbnQubmFtZSlbMF0pLCAxKTtcbiAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5zcGxpY2UodGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5pbmRleE9mKHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuZmlsdGVyKHggPT4geC5maWxlTmFtZSA9PSBlbGVtZW50Lm5hbWUpWzBdKSwgMSk7XG4gICAgICAgIHRoaXMudXBsb2FkZWRGaWxlVG90YWwtLTtcbiAgICAgIH1cbiAgICB9KVxuICAgIHRoaXMudXBsb2FkU2VydmljZS5jYW5jZWwobWV0YWRhdGFMaXN0LCB0aGlzLnJvb3RJZCkuc3Vic2NyaWJlKCk7XG5cbiAgICBsZXQgYWxsQm94OiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFsbENoZWNrQm94XCIpO1xuICAgIGlmIChhbGxCb3ggIT0gbnVsbClcbiAgICAgIGFsbEJveC5jaGVja2VkID0gZmFsc2U7XG4gICAgdGhpcy5zZWxlY3RlZEZpbGVDb3VudCA9IDA7XG4gICAgdGhpcy5maWxlQWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgfVxuXG5cbiAgZ2V0UGljTGlzdERpc3BsYXlOYW1lKGZpbGVOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoZmlsZU5hbWUubGVuZ3RoIDw9IDEwKVxuICAgICAgcmV0dXJuIGZpbGVOYW1lO1xuICAgIGVsc2Uge1xuICAgICAgbGV0IGhlYWRDb250ZW50ID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIDIpO1xuICAgICAgbGV0IHRhaWxDb250ZW50ID0gZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgLSAyKTtcbiAgICAgIHJldHVybiBoZWFkQ29udGVudCArIFwi4oCmXCIgKyB0YWlsQ29udGVudDtcbiAgICB9XG4gIH1cblxuICBnZXRRdWV1ZURpc3BsYXlOYW1lKGZpbGVOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZmlsZU5hbWU7XG4gIH1cblxuICBhZGREb2NJbmZvKHNlbGVjdGRGaWxlLCBmaWxlSW5mbzogRmlsZUluZm8sIGRvY1R5cGU6IERvY1R5cGUpIHtcbiAgICBzd2l0Y2ggKGRvY1R5cGUpIHtcbiAgICAgIGNhc2UgRG9jVHlwZS5Xb3JkOiB7XG4gICAgICAgIGZpbGVJbmZvLnNvdXJjZSA9IFwiL3BsYXRmb3JtL3J1bnRpbWUvZGZzL2ltYWdlcy93b3JkLnBuZ1wiXG4gICAgICAgIHRoaXMuZmlsZXMucHVzaChmaWxlSW5mbyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIERvY1R5cGUuUGRmOiB7XG4gICAgICAgIGZpbGVJbmZvLnNvdXJjZSA9IFwiL3BsYXRmb3JtL3J1bnRpbWUvZGZzL2ltYWdlcy9wZGYucG5nXCJcbiAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGVJbmZvKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgRG9jVHlwZS5FeGNlbDoge1xuICAgICAgICBmaWxlSW5mby5zb3VyY2UgPSBcIi9wbGF0Zm9ybS9ydW50aW1lL2Rmcy9pbWFnZXMvZXhjZWwucG5nXCI7XG4gICAgICAgIHRoaXMuZmlsZXMucHVzaChmaWxlSW5mbyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIERvY1R5cGUuVHh0OiB7XG4gICAgICAgIGZpbGVJbmZvLnNvdXJjZSA9IFwiL3BsYXRmb3JtL3J1bnRpbWUvZGZzL2ltYWdlcy90eHQucG5nXCI7XG4gICAgICAgIHRoaXMuZmlsZXMucHVzaChmaWxlSW5mbyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIERvY1R5cGUuUG93ZXJwb2ludDoge1xuICAgICAgICBmaWxlSW5mby5zb3VyY2UgPSBcIi9wbGF0Zm9ybS9ydW50aW1lL2Rmcy9pbWFnZXMvcHB0LnBuZ1wiO1xuICAgICAgICB0aGlzLmZpbGVzLnB1c2goZmlsZUluZm8pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBEb2NUeXBlLk90aGVyOiB7XG4gICAgICAgIGZpbGVJbmZvLnNvdXJjZSA9IFwiL3BsYXRmb3JtL3J1bnRpbWUvZGZzL2ltYWdlcy9maWxlLnBuZ1wiO1xuICAgICAgICB0aGlzLmZpbGVzLnB1c2goZmlsZUluZm8pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBEb2NUeXBlLkltYWdlOlxuICAgICAgICBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcblxuICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChzZWxlY3RkRmlsZSk7XG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoX2V2ZW50KSA9PiB7XG4gICAgICAgICAgbGV0IGltZ1VybCA9IHJlYWRlci5yZXN1bHQ7XG4gICAgICAgICAgaWYgKHRoaXMuaW5qZWN0b3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHNhbml0aXplciA9IHRoaXMuaW5qZWN0b3IuZ2V0KERvbVNhbml0aXplcik7XG4gICAgICAgICAgICBmaWxlSW5mby5zb3VyY2UgPSBzYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKGltZ1VybCk7XG4gICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICBmaWxlSW5mby5zb3VyY2UgPSBpbWdVcmw7XG4gICAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGVJbmZvKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgfVxuXG4gIGxpc3RUb1N0cmluZyhzdHJMaXN0OiBzdHJpbmdbXSkge1xuICAgIGxldCBuYW1lOiBzdHJpbmcgPSBcIlwiO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgbmFtZSArPSBzdHJMaXN0W2ldICsgXCIsXCI7XG4gICAgfVxuICAgIHJldHVybiBuYW1lO1xuICB9XG5cbiAgc2VjdXJpdHlDaGFuZ2UoJGV2ZW50OiBhbnksIGZpbGU6IEZpbGVJbmZvKSB7XG4gICAgZmlsZS5zZWN1cml0eUluZm8gPSAkZXZlbnQuZGF0YTtcbiAgICBsZXQgdXBsb2FkRmlsZSA9IHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LmZpbHRlcih4ID0+IHgubWV0YWRhdGFJZCA9IGZpbGUuaWQpWzBdO1xuICAgIHVwbG9hZEZpbGUuc2VjdXJpdHlJbmZvID0gJGV2ZW50LmRhdGE7XG4gIH1cblxuXG4gIGV4U3RvcmFnZUZpbGVMaXN0OiBFeFN0b3JhZ2VGaWxlSW5mb1tdID0gW107XG5cbiAgdHlwZUNoYW5nZSgkZXZlbnQ6IGFueSwgZmlsZTogRmlsZUluZm8pIHtcbiAgICBmaWxlLmV4dGVuc2lvbk5hbWUgPSAkZXZlbnQuZGF0YS5uYW1lO1xuICAgIGxldCBleFN0b3JhZ2VGaWxlSW5mbzogRXhTdG9yYWdlRmlsZUluZm8gPSBuZXcgRXhTdG9yYWdlRmlsZUluZm87XG4gICAgaWYgKGZpbGUuZXh0ZW5zaW9uTmFtZSA9PSB0aGlzLnN0b3JhZ2VFeHRlbnNpb24uZGVmYXVsdFByb3BlcnR5TmFtZSkge1xuICAgICAgaWYgKHRoaXMuZXhTdG9yYWdlRmlsZUxpc3QuZmlsdGVyKHggPT4geC5tZXRhZGF0YUlkID09IGZpbGUuaWQpLmxlbmd0aCA+IDApXG4gICAgICAgIHRoaXMuZXhTdG9yYWdlRmlsZUxpc3Quc3BsaWNlKHRoaXMuZXhTdG9yYWdlRmlsZUxpc3QuZmluZEluZGV4KHggPT4geC5tZXRhZGF0YUlkID09IGZpbGUuaWQpLCAxKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5leFN0b3JhZ2VGaWxlTGlzdC5maWx0ZXIoeCA9PiB4Lm1ldGFkYXRhSWQgPT0gZmlsZS5pZCkubGVuZ3RoID4gMCkge1xuICAgICAgICBleFN0b3JhZ2VGaWxlSW5mbyA9IHRoaXMuZXhTdG9yYWdlRmlsZUxpc3QuZmlsdGVyKHggPT4geC5tZXRhZGF0YUlkID09IGZpbGUuaWQpWzBdO1xuICAgICAgICBleFN0b3JhZ2VGaWxlSW5mby5leFByb3BlcnR5TmFtZSA9IGZpbGUuZXh0ZW5zaW9uTmFtZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4U3RvcmFnZUZpbGVJbmZvLm1ldGFkYXRhSWQgPSBmaWxlLmlkO1xuICAgICAgICBleFN0b3JhZ2VGaWxlSW5mby5leFByb3BlcnR5TmFtZSA9IGZpbGUuZXh0ZW5zaW9uTmFtZTtcbiAgICAgICAgdGhpcy5leFN0b3JhZ2VGaWxlTGlzdC5wdXNoKGV4U3RvcmFnZUZpbGVJbmZvKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGxvYWQoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBpZiAodGhpcy51cGxvYWRlZEZpbGVUb3RhbCAhPSB0aGlzLmZpbGVzLmZpbHRlcih4ID0+IHguaXNVcGxvYWRpbmcgfHwgeC51cGxvYWRSZXN1bHQpLmxlbmd0aCkge1xuICAgICAgLy8gdGhpcy5ub3RpZnlTZXJ2aWNlLnN1Y2Nlc3MoPE5vdGlmeU9wdGlvbnM+e1xuICAgICAgLy8gICBtc2c6ICfkv53lrZjmiJDlip/vvIEnLCB0aW1lb3V0OiAzMDAwXG4gICAgICAvLyB9KTtcbiAgICAgIHRoaXMubXNnU2VydmljZS53YXJuaW5nKHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3dhaXQnKSk7XG4gICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXZlU2VjdXJpdHlJbmZvKSB7XG4gICAgICB0aGlzLnVwbG9hZFNlcnZpY2Uuc2F2ZVNlY3VyaXR5SW5mbyh0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdCwgdGhpcy5yb290SWQpLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdG9yYWdlRXh0ZW5zaW9uID09IG51bGwpXG4gICAgICByZXR1cm4gb2YodGhpcy51cGxvYWRGaWxlSW5mb0xpc3QpO1xuICAgIGVsc2Uge1xuICAgICAgaWYgKHRoaXMuZXhTdG9yYWdlRmlsZUxpc3QubGVuZ3RoID09IDApXG4gICAgICAgIHJldHVybiBvZih0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdCk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgbG9hZGluZyA9IHRoaXMubG9hZFNlcnZpY2Uuc2hvdyh7XG4gICAgICAgICAgbWVzc2FnZTogdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnc2F2ZVRvJykgKyB0aGlzLnN0b3JhZ2VFeHRlbnNpb24uZXh0ZW5zaW9uTmFtZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBsb2FkU2VydmljZS5jaGFuZ2VTdG9yYWdlSW5zdGFuY2UodGhpcy5leFN0b3JhZ2VGaWxlTGlzdCwgdGhpcy5yb290SWQpLnBpcGUoXG4gICAgICAgICAgbWFwKHJlcyA9PiB7XG4gICAgICAgICAgICAvLyBpZiAocmVzICE9IG51bGwpXG4gICAgICAgICAgICAvLyAgIHRoaXMubXNnU2VydmljZS5lcnJvcign5L+d5a2Y5YiwJyArIHRoaXMuc3RvcmFnZUV4dGVuc2lvbi5leHRlbnNpb25OYW1lICsgXCLlpLHotKXvvIzkuIrkvKDmlofku7boh6rliqjkv53lrZjliLBcIiArIHRoaXMuc3RvcmFnZUV4dGVuc2lvbi5kZWZhdWx0UHJvcGVydHlOYW1lICsgXCLlrZjlgqjjgIJcIiArIHJlcy5lcnJvci5NZXNzYWdlKTtcbiAgICAgICAgICAgIGxvYWRpbmcuY2xvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdDtcbiAgICAgICAgICB9KSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgaWYgKHRoaXMudXBsb2FkRmlsZUluZm9MaXN0Lmxlbmd0aCA9PSAwKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICB0aGlzLm1ldGFkYXRhSWRMaXN0LnB1c2goZWxlbWVudC5tZXRhZGF0YUlkKTtcbiAgICB9KVxuICAgIHRoaXMudXBsb2FkU2VydmljZS5jYW5jZWwodGhpcy5tZXRhZGF0YUlkTGlzdCwgdGhpcy5yb290SWQpLnN1YnNjcmliZSgpO1xuXG4gIH1cblxuICBnZXRVcGxvYWRGaWxlSW5mb0xpc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudXBsb2FkRmlsZUluZm9MaXN0O1xuICB9XG5cbiAgZGVsZXRlKGZpbGUpIHtcbiAgICB0aGlzLmZpbGVzLnNwbGljZSh0aGlzLmZpbGVzLmluZGV4T2YoZmlsZSksIDEpO1xuICAgIGlmIChmaWxlLnVwbG9hZFJlc3VsdClcbiAgICAgIHRoaXMudXBsb2FkZWRGaWxlVG90YWwtLTtcbiAgICBpZiAodGhpcy5leFN0b3JhZ2VGaWxlTGlzdC5maWx0ZXIoeCA9PiB4Lm1ldGFkYXRhSWQgPT0gZmlsZS5pZCkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5leFN0b3JhZ2VGaWxlTGlzdC5zcGxpY2UodGhpcy5leFN0b3JhZ2VGaWxlTGlzdC5maW5kSW5kZXgoeCA9PiB4Lm1ldGFkYXRhSWQgPT0gZmlsZS5pZCksIDEpO1xuICAgIH1cbiAgICAvLyB2YXIgb2JqOmFueSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNmaWxlJyk7XG4gICAgLy8gb2JqLmZpbGVzLnJlbW92ZSgpO1xuICAgIC8vb2JqLnZhbHVlPScnO1xuICB9XG5cbiAgZ2V0RmlsZVNpemUoc2l6ZTogbnVtYmVyKSB7XG4gICAgaWYgKHNpemUgPCAxMDI0MDApXG4gICAgICByZXR1cm4gKHNpemUgLyAxMDI0KS50b0ZpeGVkKDEpICsgXCJLXCI7XG4gICAgZWxzZSBpZiAoc2l6ZSA8IDEwMjQgKiAxMDI0KVxuICAgICAgcmV0dXJuIChzaXplIC8gMTAyNCkudG9GaXhlZCgwKSArIFwiS1wiO1xuICAgIGVsc2UgaWYgKHNpemUgPCAxMDAgKiAxMDI0ICogMTAyNClcbiAgICAgIHJldHVybiAoc2l6ZSAvIDEwMjQgLyAxMDI0KS50b0ZpeGVkKDEpICsgXCJNXCI7XG4gICAgZWxzZSBpZiAoc2l6ZSA8IDEwMjQgKiAxMDI0ICogMTAyNClcbiAgICAgIHJldHVybiAoc2l6ZSAvIDEwMjQgLyAxMDI0KS50b0ZpeGVkKDApICsgXCJNXCI7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIChzaXplIC8gMTAyNCAvIDEwMjQgLyAxMDI0KS50b0ZpeGVkKDEpICsgXCJHXCI7XG4gIH1cbiAgc2hvd0J5R3JvdXAoKSB7XG4gICAgdGhpcy5zaG93VHlwZSA9IDA7XG4gICAgLy8gdGhpcy5zZWxlY3RlZEZpbGVDb3VudCA9IDA7XG4gIH1cblxuICBzaG93QnlMaXN0KCkge1xuICAgIHRoaXMuc2hvd1R5cGUgPSAxO1xuICAgIC8vIHRoaXMuc2VsZWN0ZWRGaWxlQ291bnQgPSAwO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRmlsZUNvdW50ICE9IDAgJiYgdGhpcy5zZWxlY3RlZEZpbGVDb3VudCA9PSB0aGlzLmZpbGVzLmxlbmd0aCkge1xuICAgICAgdGhpcy5maWxlQWxsU2VsZWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIG1vdXNlT3ZlcihmaWxlKSB7XG4gICAgZmlsZS5tb3VzZU9uID0gdHJ1ZTtcbiAgfVxuICBtb3VzZU91dChmaWxlKSB7XG4gICAgZmlsZS5tb3VzZU9uID0gZmFsc2U7XG4gIH1cblxufVxuXG5cbiJdfQ==
|
|
1145
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGdzcC1zdmMvZm9ybWRvYy11cGxvYWQvIiwic291cmNlcyI6WyJsaWIvdXBsb2FkL2ZpbGUtdXBsb2FkL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBWSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWhILE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RELE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDcEUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVyQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUV2RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXpELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxP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O0lBRW5DLGtEQUFpQzs7SUFDakMsOENBQXVDOztJQUV2QywrQ0FBd0M7O0lBRXhDLDZDQUFvQzs7SUFFcEMsNENBQTJCOztJQUUzQixnREFBOEI7O0lBRTlCLDJDQUFxQjs7SUFFckIsb0RBQXVDOztJQUV2QywrQ0FBa0M7O0lBRWxDLG1EQUEwQjs7SUFDMUIsa0RBQXlCOztJQUd6Qiw4Q0FBdUI7O0lBQ3ZCLDBDQUF3Qjs7SUFDeEIsdUNBQWlCOztJQUNqQix5Q0FBMEI7O0lBQzFCLHlDQUF1Qjs7SUFDdkIsMENBQTRCOztJQVM1QixxQ0FBd0I7O0lBQ3hCLHFDQUF3Qjs7SUFDeEIsdUNBQWdDOztJQUNoQyx3Q0FBK0I7O0lBQy9CLHdDQUFrQzs7SUFDbEMsMkNBQXFEOztJQUlyRCxxQ0FBOEM7O0lBK0Q5Qyx3Q0FBc0I7O0lBZ2dCdEIsZ0RBQTRDOzs7OztJQS9rQmhDLHlDQUFtQzs7Ozs7SUFBRSw0Q0FBb0M7Ozs7O0lBQUUsMENBQW1DOzs7OztJQUFFLHVDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgVmlld0NoaWxkLCBUZW1wbGF0ZVJlZiwgT3B0aW9uYWwsIEluamVjdG9yLCBMT0NBTEVfSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZpbGVJbmZvIH0gZnJvbSAnLi4vZW50aXR5L2ZpbGVpbmZvJztcbmltcG9ydCB7IERvY1R5cGUgfSBmcm9tICcuLi9lbnRpdHkvZG9jdHlwZSc7XG5pbXBvcnQgeyBHc3BGb3JtRG9jSW5mbyB9IGZyb20gJy4uL2VudGl0eS9nc3Bmb3JtZG9jaW5mbyc7XG5pbXBvcnQgeyBPcGVyYXRpbmdNb2RlcyB9IGZyb20gJy4uL2VudGl0eS9vcGVyYXRpbmdtb2Rlcyc7XG5pbXBvcnQgeyBVcGxvYWRTZXJ2aWNlIH0gZnJvbSAnLi4vdXBsb2FkLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXBsb2FkRmlsZUluZm8gfSBmcm9tICcuLi9lbnRpdHkvdXBsb2FkZmlsZWluZm8nO1xuaW1wb3J0IHsgTWVzc2FnZXJTZXJ2aWNlIH0gZnJvbSAnQGZhcnJpcy91aS1tZXNzYWdlcic7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBHc3BGb3JtVXBsb2FkRW50aXR5IH0gZnJvbSAnLi4vZW50aXR5L2dzcGZvcm11cGxvYWRlbnRpdHknO1xuaW1wb3J0IHsgVVVJRCB9IGZyb20gJ2FuZ3VsYXIyLXV1aWQnO1xuaW1wb3J0IHsgU3RvcmFnZUV4dGVuc2lvbiB9IGZyb20gJy4uL2VudGl0eS9zdG9yYWdlZXh0ZW5zaW9uJztcbmltcG9ydCB7IEV4U3RvcmFnZUZpbGVJbmZvIH0gZnJvbSAnLi4vZW50aXR5L2V4dGVuc2lvbnN0b3JhZ2VmaWxlaW5mbyc7XG5pbXBvcnQgeyBEcm9wTGlzdEVudGl0eSB9IGZyb20gJy4uL2VudGl0eS9kcm9wbGlzdGVudGl0eSc7XG5pbXBvcnQgeyBMb2FkaW5nU2VydmljZSB9IGZyb20gJ0BmYXJyaXMvdWktbG9hZGluZyc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IGZpbGxQcm9wZXJ0aWVzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9zcmMvdXRpbC9wcm9wZXJ0eSc7XG5pbXBvcnQgeyBGaWxlU3RhdGUgfSBmcm9tICcuLi9lbnRpdHkvZmlsZXN0YXRlJztcbmltcG9ydCB7IExvY2FsTGFuZ1BpcGUgfSBmcm9tICcuLi8uLi9sb2NhbC5waXBlJztcbmltcG9ydCB7IEdzcERvY1NlY3VyaXR5QmFzZUluZm8gfSBmcm9tICcuLi9lbnRpdHkvZ3NwZG9jc2VjdXJpdHluYXNlaW5mbyc7XG5pbXBvcnQgeyBzdGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgU2VjdXJpdHlFbnRpdHkgfSBmcm9tICcuLi9lbnRpdHkvc2VjdXJpdHllbnRpdHknO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAndXJsJztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZmlsZS11cGxvYWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsZS11cGxvYWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9maWxlLXVwbG9hZC5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEZpbGVVcGxvYWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIGZpbGVzOiBGaWxlSW5mb1tdID0gW107XG4gIG1ldGFkYXRhSWRMaXN0OiBzdHJpbmdbXSA9IFtdO1xuICB1cGxvYWRGaWxlSW5mb0xpc3Q6IFVwbG9hZEZpbGVJbmZvW10gPSBbXTtcbiAgZXJyRmlsZUxpc3Q6IHN0cmluZ1tdID0gW107XG4gIGVyclR5cGVMaXN0OiBzdHJpbmdbXSA9IFtdO1xuICBudWxsRmlsZUxpc3Q6IHN0cmluZ1tdID0gW107XG4gIGJleW9uZEZpbGVMaXN0OiBzdHJpbmdbXSA9IFtdO1xuICBzaG93VHlwZTogbnVtYmVyID0gMDtcbiAgbW91c2VPbjogYm9vbGVhbiA9IGZhbHNlO1xuICBidWZmZXJTaXplID0gMTAgKiAxMDI0ICogMTAyNDtcbiAgc2VsZWN0ZWRGaWxlczogYW55O1xuXG4gIHNlbGVjdGVkRmlsZUNvdW50OiBudW1iZXIgPSAwO1xuXG4gIHVwbG9hZEljb25BZGRyZXNzID0gJy9wbGF0Zm9ybS9ydW50aW1lL2Rmcy9pbWFnZXMvdXBsb2FkLnN2Zyc7XG4gIHVwbG9hZExpdHRsZUljb25BZGRyZXNzID0gJy9wbGF0Zm9ybS9ydW50aW1lL2Rmcy9pbWFnZXMvdXBsb2FkSWNvbi5zdmcnO1xuXG4gIGhhc1NlbGVjdGVkRmlsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGZpbGVBbGxTZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHVwbG9hZFByb2Nlc3MgPSB7IHdpZHRoOiAnMCUnIH07XG5cbiAgZmlsZVRvdGFsQ2h1bms6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgLy9maWxlVXBsb2FkU3RhdGU6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG4gIC8vZmxhZzogbnVtYmVyID0gMDtcbiAgcmVxdWVzdEFycmF5OiBBcnJheTxPYnNlcnZhYmxlPGFueT4+ID0gbmV3IEFycmF5O1xuXG4gIHJlcXVlc3RCb2R5QXJyYXk6IEFycmF5PEdzcEZvcm1VcGxvYWRFbnRpdHk+ID0gbmV3IEFycmF5O1xuXG4gIHVwbG9hZGVkQ2h1bms6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgdXBsb2FkZWRQcm9jZXNzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG5cbiAgLy9hbGxTZWxlY3RlZDogYm9vbGVhbiA9IHRydWU7XG4gIHN0b3JhZ2VFeHRlbnNpb246IFN0b3JhZ2VFeHRlbnNpb247XG5cbiAgZGVmYXVsdFByb3BlcnR5TmFtZTogc3RyaW5nID0gXCJcIjtcbiAgcHJvcGVydGllc05hbWVzOiBEcm9wTGlzdEVudGl0eVtdID0gW107XG5cbiAgc2VjdXJpdHlJbmZvTGlzdDogU2VjdXJpdHlFbnRpdHlbXSA9IFtdO1xuXG4gIHF1ZXVlTGlzdFN0eWxlID0geyB3aWR0aDogJzQ4MHB4JyB9O1xuXG4gIGRyb3BMaXN0VmFsdWU6IHN0cmluZyA9IFwiXCI7XG5cbiAgdXBsb2FkZWRGaWxlVG90YWw6IG51bWJlciA9IDA7XG5cbiAgdmFsaWRhdGlvbklkOiBzdHJpbmc7XG5cbiAgaGF2ZUV4dGVuc2lvblByb3BlcnR5OiBib29sZWFuID0gZmFsc2U7XG5cbiAgaGF2ZVNlY3VyaXR5SW5mbzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHVwbG9hZGVkRmlsZUluZm9MaXN0ID0gW107XG4gIG9sZFVwbG9hZGVkRmlsZUxpc3QgPSBbXTtcbiAgLy91cGxvYWRlZE5hbWVMaXN0ID0gW107XG5cbiAgc2FtZU5hbWVBbGxvd2VkID0gdHJ1ZTtcbiAgbWF4RmlsZVNpemU6IG51bWJlciA9IDA7O1xuICBsb2NhbGVpZDogc3RyaW5nO1xuICBsb2NhbGVwaXBlOiBMb2NhbExhbmdQaXBlO1xuICBodHRwY2xpZW50OiBIdHRwQ2xpZW50O1xuICBjaGVja2JveFBvcyA9IHsgdG9wOiAnMHB4JyB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtc2dTZXJ2aWNlOiBNZXNzYWdlclNlcnZpY2UsIHByaXZhdGUgdXBsb2FkU2VydmljZTogVXBsb2FkU2VydmljZSwgcHJpdmF0ZSBsb2FkU2VydmljZTogTG9hZGluZ1NlcnZpY2UsIHByaXZhdGUgaW5qZWN0b3I/OiBJbmplY3Rvcikge1xuICAgIGlmICh0aGlzLmluamVjdG9yKSB7XG4gICAgICB0aGlzLmh0dHBjbGllbnQgPSB0aGlzLmluamVjdG9yLmdldChIdHRwQ2xpZW50KTtcbiAgICAgIHRoaXMubG9jYWxlaWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImxhbmd1YWdlQ29kZVwiKSB8fCB0aGlzLmluamVjdG9yLmdldChMT0NBTEVfSUQpO1xuICAgICAgdGhpcy5sb2NhbGVwaXBlID0gbmV3IExvY2FsTGFuZ1BpcGUodGhpcy5sb2NhbGVpZCk7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpIGZvcm1JZDogc3RyaW5nO1xuICBASW5wdXQoKSByb290SWQ6IHN0cmluZztcbiAgQElucHV0KCkgZmlsZVR5cGU6IHN0cmluZyA9IFwiKlwiO1xuICBASW5wdXQoKSBmaWxlQ291bnQ6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIG9sZElkTGlzdDogc3RyaW5nW10gPSBbXTtcbiAgQElucHV0KCkgc2VjdXJpdHlJbmZvOiBHc3BEb2NTZWN1cml0eUJhc2VJbmZvID0gbnVsbDtcblxuICAvL0BPdXRwdXQoKSBvbkN1c3RvbUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAVmlld0NoaWxkKCdvcENlbGwnKSBvcENlbGw6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRmlyZWZveCcpID49IDApXG4gICAgICB0aGlzLmNoZWNrYm94UG9zLnRvcCA9ICcxNHB4JztcbiAgICAvL2lmICh0aGlzLnN0b3JhZ2VTZXJ2aWNlICE9IG51bGwpIHtcbiAgICBpZiAodGhpcy5zZWN1cml0eUluZm8gIT0gbnVsbCkge1xuICAgICAgdGhpcy51cGxvYWRTZXJ2aWNlLmdldFNlY3VyaXR5SW5mb0xpc3QodGhpcy5zZWN1cml0eUluZm8pLnN1YnNjcmliZShcbiAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICB0aGlzLmhhdmVTZWN1cml0eUluZm8gPSB0cnVlO1xuICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICByZXMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2VjdXJpdHlJbmZvTGlzdC5wdXNoKHsgaWQ6IGkudG9TdHJpbmcoKSwgc2VjdXJpdHlJZDogZWxlbWVudC5zZWN1cml0eUlkLCBzZWN1cml0eUxldmVsOiBlbGVtZW50LnNlY3VyaXR5TGV2ZWwsIG5hbWU6IGVsZW1lbnQubmFtZSB9KTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cbiAgICB0aGlzLnVwbG9hZFNlcnZpY2UuZ2V0U3RvcmFnZUV4dGVuc2lvbkluZm8oKS5zdWJzY3JpYmUoXG4gICAgICByZXMgPT4ge1xuICAgICAgICBpZiAocmVzICE9IG51bGwgJiYgcmVzLmVycm9yID09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLnN0b3JhZ2VFeHRlbnNpb24gPSByZXM7XG4gICAgICAgICAgdGhpcy5kZWZhdWx0UHJvcGVydHlOYW1lID0gdGhpcy5zdG9yYWdlRXh0ZW5zaW9uLmRlZmF1bHRQcm9wZXJ0eU5hbWU7XG4gICAgICAgICAgdGhpcy5wcm9wZXJ0aWVzTmFtZXMucHVzaCh7IGlkOiBcIjBcIiwgbmFtZTogdGhpcy5zdG9yYWdlRXh0ZW5zaW9uLmRlZmF1bHRQcm9wZXJ0eU5hbWUgfSk7XG4gICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgIC8vIHRoaXMucHJvcGVydGllc05hbWVzLnB1c2goLi4uKHRoaXMuc3RvcmFnZUV4dGVuc2lvbi5leHRlbnNpb25Qcm9wZXJ0eU5hbWVMaXN0KSk7XG4gICAgICAgICAgdGhpcy5zdG9yYWdlRXh0ZW5zaW9uLmV4dGVuc2lvblByb3BlcnR5TmFtZUxpc3QuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJvcGVydGllc05hbWVzLnB1c2goeyBpZDogKCsraSkudG9TdHJpbmcoKSwgbmFtZTogZWxlbWVudCB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnF1ZXVlTGlzdFN0eWxlLndpZHRoID0gJzM4MHB4JztcbiAgICAgICAgICB0aGlzLmhhdmVFeHRlbnNpb25Qcm9wZXJ0eSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApXG5cbiAgICB0aGlzLnVwbG9hZFNlcnZpY2UuZ2V0Um9vdFNldHRpbmcodGhpcy5yb290SWQpLnN1YnNjcmliZShcbiAgICAgIHJlcyA9PiB7XG4gICAgICAgIGlmIChyZXMgIT0gbnVsbCAmJiByZXMuZXJyb3IgPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuc2FtZU5hbWVBbGxvd2VkID0gcmVzLnNhbWVOYW1lQWxsb3dlZDtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRpb25JZCA9IHJlcy52YWxpZGF0aW9uSWQ7XG4gICAgICAgICAgaWYgKCF0aGlzLnNhbWVOYW1lQWxsb3dlZCkge1xuICAgICAgICAgICAgdGhpcy51cGxvYWRTZXJ2aWNlLmdldFVwbG9hZGVkRmlsZUluZm9MaXN0KHRoaXMuZm9ybUlkLCB0aGlzLnJvb3RJZCkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICByZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gbnVsbCAmJiByZXMuZXJyb3IgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdCA9IHJlcztcbiAgICAgICAgICAgICAgICAgIHRoaXMub2xkVXBsb2FkZWRGaWxlTGlzdCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzKSk7O1xuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnVwbG9hZFNlcnZpY2UuZ2V0VmFsaWRhdGlvbih0aGlzLnZhbGlkYXRpb25JZCkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5tYXhGaWxlU2l6ZSA9IHBhcnNlSW50KEpTT04ucGFyc2UocmVzLmNvbmZpZ3VyYXRpb24pLm1heEZpbGVTaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApXG4gICAgaWYgKHRoaXMub2xkSWRMaXN0ICE9IG51bGwgJiYgdGhpcy5vbGRJZExpc3QubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy51cGxvYWRTZXJ2aWNlLmNhbmNlbCh0aGlzLm9sZElkTGlzdCwgdGhpcy5yb290SWQpLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHRvdGFsTG9hZDogYW55ID0gbnVsbDtcblxuICBzaG93TG9hZGluZygpIHtcbiAgICB0aGlzLmhhc1NlbGVjdGVkRmlsZSA9IHRydWU7XG4gICAgLy8gaWYgKHRoaXMudG90YWxMb2FkID09IG51bGwpXG4gICAgLy8gICB0aGlzLnRvdGFsTG9hZCA9IHRoaXMubG9hZFNlcnZpY2Uuc2hvdyh7XG4gICAgLy8gICAgIG1lc3NhZ2U6IHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3VwbG9hZGluZycpXG4gICAgLy8gICB9KTtcbiAgfVxuXG5cbiAgZmlsZVNlbGVjdGVkKCRldmVudCkge1xuXG4gICAgLy8gY29uc3QgbG9hZGluZyA9IHRoaXMubG9hZFNlcnZpY2Uuc2hvdyh7XG4gICAgLy8gICBtZXNzYWdlOiB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCd1cGxvYWRpbmcnKVxuICAgIC8vIH0pO1xuXG4gICAgLy8gdGhpcy50b3RhbExvYWQuY2xvc2UoKTtcbiAgICAvLyB0aGlzLnRvdGFsTG9hZCA9IG51bGw7XG4gICAgdGhpcy5oYXNTZWxlY3RlZEZpbGUgPSB0cnVlO1xuICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNmaWxlJyk7XG5cbiAgICBpZiAodGhpcy5maWxlQ291bnQgPiAwKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEZpbGVzLmZpbGVzLmxlbmd0aCArIHRoaXMuZmlsZXMubGVuZ3RoID4gdGhpcy5maWxlQ291bnQpIHtcbiAgICAgICAgbGV0IHNlbGVjdGVkTnVtOiBudW1iZXIgPSAodGhpcy5zZWxlY3RlZEZpbGVzLmZpbGVzLmxlbmd0aCBhcyBudW1iZXIpICsgdGhpcy5maWxlcy5sZW5ndGg7XG4gICAgICAgIHRoaXMubXNnU2VydmljZS53YXJuaW5nKHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3NlbGVjdGVkQ291bnQnKSArIHNlbGVjdGVkTnVtICsgdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnbGltaXRDb3VudCcpICsgdGhpcy5maWxlQ291bnQgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZWNob29zZUZpbGUnKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL3RoaXMuZmxhZyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkRmlsZXMuZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBzZWxlY3RlZEZpbGUgPSB0aGlzLnNlbGVjdGVkRmlsZXMuZmlsZXNbaV07XG4gICAgICAvL3NlbGVjdGVkRmlsZS5zbGljZVxuICAgICAgbGV0IHV1aWQgPSBVVUlELlVVSUQoKTtcblxuICAgICAgaWYgKHNlbGVjdGVkRmlsZS5zaXplID09IDApIHtcbiAgICAgICAgdGhpcy5udWxsRmlsZUxpc3QucHVzaChzZWxlY3RlZEZpbGUubmFtZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tYXhGaWxlU2l6ZSAhPSBudWxsICYmIHRoaXMubWF4RmlsZVNpemUgPiAwKSB7XG4gICAgICAgIGlmIChzZWxlY3RlZEZpbGUuc2l6ZSA+IHRoaXMubWF4RmlsZVNpemUgKiAxMDAwKSB7XG4gICAgICAgICAgdGhpcy5iZXlvbmRGaWxlTGlzdC5wdXNoKHNlbGVjdGVkRmlsZS5uYW1lKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuc2FtZU5hbWVBbGxvd2VkKSB7XG4gICAgICAgIGlmICh0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LmZpbmQoeCA9PiB4LmZpbGVOYW1lID09IHNlbGVjdGVkRmlsZS5uYW1lKSAhPSBudWxsKSB7XG4gICAgICAgICAgLy8gdGhpcy51cGxvYWRlZE5hbWVMaXN0LnB1c2goc2VsZWN0ZWRGaWxlLm5hbWUpO1xuICAgICAgICAgIC8vIHRoaXMubXNnU2VydmljZS5xdWVzdGlvbign5LmL5YmN5bey5LiK5Lyg6L+H5ZCM5ZCN5paH5Lu2OiAnICsgc2VsZWN0ZWRGaWxlLm5hbWUgKyAn77yM6ZyA6KaB5pu/5o2i5LmI77yfJywgKCkgPT4ge1xuICAgICAgICAgIC8vICAgdXVpZCA9IHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuZmluZCh4ID0+IHguZmlsZU5hbWUgPT0gc2VsZWN0ZWRGaWxlLm5hbWUpLm1ldGFkYXRhSWQ7XG4gICAgICAgICAgLy8gICB0aGlzLnVwbG9hZEZpbGUodXVpZCwgc2VsZWN0ZWRGaWxlKTtcbiAgICAgICAgICAvLyB9KVxuICAgICAgICAgIGNvbnN0IG1zZyA9IHRoaXMubXNnU2VydmljZS5zaG93KCd3YXJuaW5nJywgdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnaGF2ZVNhbWVOYW1lJykgKyBzZWxlY3RlZEZpbGUubmFtZSwge1xuICAgICAgICAgICAgaW5pdGlhbFN0YXRlOiB7XG4gICAgICAgICAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZW5hbWUnKSxcbiAgICAgICAgICAgICAgICAgIGNsczogJ2J0biBidG4tc2Vjb25kYXJ5JyxcbiAgICAgICAgICAgICAgICAgIGhhbmRsZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb2xkTmFtZTogc3RyaW5nID0gc2VsZWN0ZWRGaWxlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdOYW1lXG4gICAgICAgICAgICAgICAgICAgIGxldCBmbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAxO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZmxhZykge1xuICAgICAgICAgICAgICAgICAgICAgIG5ld05hbWUgPSBvbGROYW1lLnN1YnN0cmluZygwLCBvbGROYW1lLmxhc3RJbmRleE9mKCcuJykpICsgJygnICsgaSArICcpJyArIG9sZE5hbWUuc3Vic3RyaW5nKG9sZE5hbWUubGFzdEluZGV4T2YoJy4nKSk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuZmluZCh4ID0+IHguZmlsZU5hbWUgPT0gbmV3TmFtZSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZEZpbGUodXVpZCwgc2VsZWN0ZWRGaWxlLCBuZXdOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgbXNnLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZXBsYWNlJyksXG4gICAgICAgICAgICAgICAgICBjbHM6ICdidG4gYnRuLXNlY29uZGFyeScsXG4gICAgICAgICAgICAgICAgICBoYW5kbGU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdXVpZCA9IHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuZmluZCh4ID0+IHguZmlsZU5hbWUgPT0gc2VsZWN0ZWRGaWxlLm5hbWUpLm1ldGFkYXRhSWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkRmlsZSh1dWlkLCBzZWxlY3RlZEZpbGUsIHNlbGVjdGVkRmlsZS5uYW1lLCBGaWxlU3RhdGUuVXBkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVUb3RhbC0tO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vbGRVcGxvYWRlZEZpbGVMaXN0LmZpbmQoeCA9PiB4LmZpbGVOYW1lID09IHNlbGVjdGVkRmlsZS5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlVG90YWwrKztcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LnNwbGljZSh0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LmluZGV4T2YodGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5maWx0ZXIoeCA9PiB4LmZpbGVOYW1lID09IHNlbGVjdGVkRmlsZS5uYW1lKVswXSksIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1zZy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnY2FuY2VsJyksXG4gICAgICAgICAgICAgICAgICBjbHM6ICdidG4gYnRuLXNlY29uZGFyeScsXG4gICAgICAgICAgICAgICAgICBoYW5kbGU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbXNnLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy51cGxvYWRGaWxlKHV1aWQsIHNlbGVjdGVkRmlsZSwgc2VsZWN0ZWRGaWxlLm5hbWUpO1xuXG4gICAgfVxuICAgIC8vIGlmICh0aGlzLnVwbG9hZGVkTmFtZUxpc3QubGVuZ3RoID4gMCkge1xuICAgIC8vICAgbGV0IG5hbWU6IHN0cmluZyA9IHRoaXMubGlzdFRvU3RyaW5nKHRoaXMudXBsb2FkZWROYW1lTGlzdCk7XG4gICAgLy8gICB0aGlzLm1zZ1NlcnZpY2Uud2FybmluZygn5LmL5YmN5bey5LiK5Lyg6L+H5ZCM5ZCN5paH5Lu2OiAnICsgbmFtZSArICfor7fph43mlrDpgInmi6nkuIrkvKDmlofku7bjgIInKTtcbiAgICAvLyAgIHRoaXMudXBsb2FkZWROYW1lTGlzdCA9IFtdO1xuICAgIC8vIH1cblxuICAgIGlmICh0aGlzLmVyckZpbGVMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBuYW1lOiBzdHJpbmcgPSB0aGlzLmxpc3RUb1N0cmluZyh0aGlzLmVyckZpbGVMaXN0KTtcbiAgICAgIHRoaXMubXNnU2VydmljZS53YXJuaW5nKHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ2hhdmVTYW1lTmFtZScpICsgbmFtZSArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3JlY2hvb3NlRmlsZScpKTtcbiAgICAgIHRoaXMuZXJyRmlsZUxpc3QgPSBbXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5udWxsRmlsZUxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IG5hbWU6IHN0cmluZyA9IHRoaXMubGlzdFRvU3RyaW5nKHRoaXMubnVsbEZpbGVMaXN0KTtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCAtIDEpO1xuICAgICAgdGhpcy5tc2dTZXJ2aWNlLndhcm5pbmcobmFtZSArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3NpemVaZXJvJykgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZWNob29zZUZpbGUnKSk7XG4gICAgICB0aGlzLm51bGxGaWxlTGlzdCA9IFtdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJleW9uZEZpbGVMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBuYW1lOiBzdHJpbmcgPSB0aGlzLmxpc3RUb1N0cmluZyh0aGlzLmJleW9uZEZpbGVMaXN0KTtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCAtIDEpO1xuICAgICAgdGhpcy5tc2dTZXJ2aWNlLndhcm5pbmcobmFtZSArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3NpemVNYXgnKSArIHRoaXMubWF4RmlsZVNpemUgKyBcIktCXCIgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZWNob29zZUZpbGUnKSk7XG4gICAgICB0aGlzLmJleW9uZEZpbGVMaXN0ID0gW107XG4gICAgfVxuICAgIC8vIGlmICh0aGlzLmVyclR5cGVMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAvLyAgIGxldCB0eXBlOiBzdHJpbmcgPSB0aGlzLmxpc3RUb1N0cmluZyh0aGlzLmVyclR5cGVMaXN0KTtcbiAgICAvLyAgIHRoaXMubXNnU2VydmljZS53YXJuaW5nKCfkuI3mlK/mjIHkuIrkvKDnsbvlnovkuLogJyArIHR5cGUgKyAn55qE5paH5Lu26K+36YeN5paw6YCJ5oup5LiK5Lyg5paH5Lu244CCJyk7XG4gICAgLy8gICB0aGlzLmVyclR5cGVMaXN0ID0gW107XG4gICAgLy8gfVxuICAgIHRoaXMuZmlsZXMgPSB0aGlzLmZpbGVzLnNsaWNlKCk7XG4gICAgdGhpcy5maWxlQWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAkZXZlbnQudGFyZ2V0LnZhbHVlID0gJyc7XG4gICAgLy8gbG9hZGluZy5jbG9zZSgpO1xuICB9XG5cbiAgc2hvd0Vycm9yTWVzc2FnZShmaWxlKSB7XG4gICAgdGhpcy5tc2dTZXJ2aWNlLmVycm9yKHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3VwbG9hZEZhaWx1cmUnKSArIGZpbGUuZXJyb3JNZXNzYWdlKTtcbiAgfVxuXG4gIGhhbmRsZUZpbGVJbmZvKHV1aWQ6IHN0cmluZywgc2VsZWN0ZWRGaWxlLCBmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBsZXQgZmlsZUluZm86IEZpbGVJbmZvO1xuXG4gICAgICBmaWxlSW5mbyA9IHtcbiAgICAgICAgaWQ6IHV1aWQsXG4gICAgICAgIG5hbWU6IGZpbGVOYW1lLFxuICAgICAgICB0eXBlOiBzZWxlY3RlZEZpbGUudHlwZSxcbiAgICAgICAgc291cmNlOiBcIlwiLFxuICAgICAgICBzaXplOiB0aGlzLmdldEZpbGVTaXplKHNlbGVjdGVkRmlsZS5zaXplKSxcbiAgICAgICAgZmlsZVNpemU6IHNlbGVjdGVkRmlsZS5zaXplLFxuICAgICAgICBwaWNMaXN0RGlzcGxheU5hbWU6IHRoaXMuZ2V0UGljTGlzdERpc3BsYXlOYW1lKGZpbGVOYW1lKSxcbiAgICAgICAgcXVldWVMaXN0RGlzcGxheU5hbWU6IHRoaXMuZ2V0UXVldWVEaXNwbGF5TmFtZShmaWxlTmFtZSksXG4gICAgICAgIC8vY29udGVudDogcmVhZGVyLnJlc3VsdC50b1N0cmluZygpLFxuICAgICAgICBoYXNVcGxvYWRlZDogZmFsc2UsXG4gICAgICAgIG1vdXNlT246IGZhbHNlLFxuICAgICAgICBzZWxlY3RkOiBmYWxzZSxcbiAgICAgICAgaXNVcGxvYWRpbmc6IHRydWUsXG4gICAgICAgIHVwbG9hZFJlc3VsdDogZmFsc2UsXG4gICAgICAgIHVwbG9hZFByb2Nlc3M6IDAsXG4gICAgICAgIGVycm9yTWVzc2FnZTogXCJcIixcbiAgICAgICAgZXh0ZW5zaW9uRHJvcExpc3RJZDogMCxcbiAgICAgICAgZXh0ZW5zaW9uTmFtZTogXCJcIixcbiAgICAgICAgc2VjdXJpdHlEcm9wTGlzdElkOiAwLFxuICAgICAgICBzZWN1cml0eUluZm86IHRoaXMuc2VjdXJpdHlJbmZvTGlzdFswXVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zdG9yYWdlRXh0ZW5zaW9uICE9IG51bGwpXG4gICAgICAgIGZpbGVJbmZvLmV4dGVuc2lvbk5hbWUgPSB0aGlzLmRlZmF1bHRQcm9wZXJ0eU5hbWU7XG5cblxuICAgICAgbGV0IHR5cGU6IHN0cmluZyA9IHNlbGVjdGVkRmlsZS50eXBlO1xuICAgICAgaWYgKHR5cGUuaW5jbHVkZXMoXCJ0aWZmXCIpKSB7XG4gICAgICAgIHRoaXMuYWRkRG9jSW5mbyhzZWxlY3RlZEZpbGUsIGZpbGVJbmZvLCBEb2NUeXBlLk90aGVyKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHR5cGUuaW5jbHVkZXMoXCJpbWFnZVwiKSkge1xuICAgICAgICB0aGlzLmFkZERvY0luZm8oc2VsZWN0ZWRGaWxlLCBmaWxlSW5mbywgRG9jVHlwZS5JbWFnZSk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmICh0eXBlLmluY2x1ZGVzKFwid29yZFwiKSkge1xuICAgICAgICB0aGlzLmFkZERvY0luZm8oc2VsZWN0ZWRGaWxlLCBmaWxlSW5mbywgRG9jVHlwZS5Xb3JkKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHR5cGUuaW5jbHVkZXMoXCJwZGZcIikpIHtcbiAgICAgICAgdGhpcy5hZGREb2NJbmZvKHNlbGVjdGVkRmlsZSwgZmlsZUluZm8sIERvY1R5cGUuUGRmKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHR5cGUuaW5jbHVkZXMoXCJwbGFpblwiKSkge1xuICAgICAgICB0aGlzLmFkZERvY0luZm8oc2VsZWN0ZWRGaWxlLCBmaWxlSW5mbywgRG9jVHlwZS5UeHQpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodHlwZS5pbmNsdWRlcyhcInNoZWV0XCIpIHx8IHR5cGUuaW5jbHVkZXMoXCJleGNlbFwiKSkge1xuICAgICAgICB0aGlzLmFkZERvY0luZm8oc2VsZWN0ZWRGaWxlLCBmaWxlSW5mbywgRG9jVHlwZS5FeGNlbClcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHR5cGUuaW5jbHVkZXMoXCJwb3dlcnBvaW50XCIpIHx8IHR5cGUuaW5jbHVkZXMoXCJwcmVzZW50YXRpb25cIikpIHtcbiAgICAgICAgdGhpcy5hZGREb2NJbmZvKHNlbGVjdGVkRmlsZSwgZmlsZUluZm8sIERvY1R5cGUuUG93ZXJwb2ludCk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5hZGREb2NJbmZvKHNlbGVjdGVkRmlsZSwgZmlsZUluZm8sIERvY1R5cGUuT3RoZXIpO1xuICAgICAgICAvLyBsZXQgbmFtZTogc3RyaW5nID0gc2VsZWN0ZWRGaWxlLm5hbWU7XG4gICAgICAgIC8vIGxldCBlcnJUeXBlID0gbmFtZS5zdWJzdHJpbmcoc2VsZWN0ZWRGaWxlLm5hbWUubGFzdEluZGV4T2YoJy4nKSk7XG4gICAgICAgIC8vIHRoaXMuZXJyVHlwZUxpc3QucHVzaChlcnJUeXBlKTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoZmlsZUluZm8pO1xuICAgIH0pXG4gIH1cblxuICB1cGxvYWRGaWxlKHV1aWQ6IHN0cmluZywgc2VsZWN0ZWRGaWxlLCBmaWxlTmFtZTogc3RyaW5nLCBzdGF0ZTogRmlsZVN0YXRlID0gRmlsZVN0YXRlLk5ldykge1xuICAgIHRoaXMuaGFuZGxlRmlsZUluZm8odXVpZCwgc2VsZWN0ZWRGaWxlLCBmaWxlTmFtZSkudGhlbihyZXMgPT4ge1xuICAgICAgbGV0IGZpbGVJbmZvID0gcmVzO1xuICAgICAgbGV0IGNodW5rVG90YWw6IG51bWJlciA9IE1hdGguY2VpbChzZWxlY3RlZEZpbGUuc2l6ZSAvIHRoaXMuYnVmZmVyU2l6ZSk7XG4gICAgICBsZXQgY2h1bmtJbmRleDogbnVtYmVyID0gMDtcblxuICAgICAgdGhpcy5maWxlVG90YWxDaHVua1t1dWlkXSA9IGNodW5rVG90YWw7XG5cbiAgICAgIGxldCB1cGxvYWRGaWxlSW5mbyA9IG5ldyBVcGxvYWRGaWxlSW5mbygpO1xuXG4gICAgICB1cGxvYWRGaWxlSW5mby5tZXRhZGF0YUlkID0gdXVpZDtcbiAgICAgIHVwbG9hZEZpbGVJbmZvLmZpbGVOYW1lID0gZmlsZUluZm8ubmFtZTtcbiAgICAgIHVwbG9hZEZpbGVJbmZvLmZpbGVTaXplID0gZmlsZUluZm8uc2l6ZTtcbiAgICAgIHVwbG9hZEZpbGVJbmZvLnN0YXRlID0gc3RhdGU7XG4gICAgICB1cGxvYWRGaWxlSW5mby5zZWN1cml0eUluZm8gPSB0aGlzLnNlY3VyaXR5SW5mb0xpc3RbMF07XG5cblxuICAgICAgd2hpbGUgKGNodW5rSW5kZXggPCBjaHVua1RvdGFsKSB7XG4gICAgICAgIGxldCB1cGxvYWRJbmZvID0gbmV3IEdzcEZvcm1VcGxvYWRFbnRpdHk7XG4gICAgICAgIHVwbG9hZEluZm8uZm9ybUlkID0gdGhpcy5mb3JtSWQ7XG4gICAgICAgIHVwbG9hZEluZm8ubW9kZSA9IE9wZXJhdGluZ01vZGVzLlRlbXA7XG4gICAgICAgIHVwbG9hZEluZm8ucm9vdElkID0gdGhpcy5yb290SWQ7XG5cbiAgICAgICAgbGV0IGRvY0luZm86IEdzcEZvcm1Eb2NJbmZvID0gbmV3IEdzcEZvcm1Eb2NJbmZvO1xuXG4gICAgICAgIGRvY0luZm8uZmlsZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgICAgZG9jSW5mby5tZXRhZGF0YUlkID0gdXVpZDtcbiAgICAgICAgZG9jSW5mby50b3RhbCA9IGNodW5rVG90YWw7XG5cbiAgICAgICAgdGhpcy51cGxvYWRlZENodW5rW2RvY0luZm8ubWV0YWRhdGFJZF0gPSAwO1xuXG4gICAgICAgIGxldCBuZXh0U2l6ZSA9IE1hdGgubWluKChjaHVua0luZGV4ICsgMSkgKiB0aGlzLmJ1ZmZlclNpemUsIHNlbGVjdGVkRmlsZS5zaXplKTtcbiAgICAgICAgbGV0IGZpbGVEYXRhID0gc2VsZWN0ZWRGaWxlLnNsaWNlKGNodW5rSW5kZXggKiB0aGlzLmJ1ZmZlclNpemUsIG5leHRTaXplKTtcblxuICAgICAgICAvLyBsZXQgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgLy8gcmVhZGVyLnJlYWRBc0JpbmFyeVN0cmluZyhmaWxlRGF0YSk7XG4gICAgICAgIGxldCBpbm5lckluZGV4ID0gY2h1bmtJbmRleDtcbiAgICAgICAgLy8gcmVhZGVyLm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgLy8gICBkb2NJbmZvLmZpbGVDb250ZW50ID0gYnRvYShyZWFkZXIucmVzdWx0LnRvU3RyaW5nKCkpO1xuICAgICAgICBkb2NJbmZvLnNpemUgPSBzZWxlY3RlZEZpbGUuc2l6ZTtcbiAgICAgICAgZG9jSW5mby5pbmRleCA9IGlubmVySW5kZXg7XG4gICAgICAgIGRvY0luZm8uZmlsZUNvbnRlbnQgPSBcIlwiXG4gICAgICAgIC8vY2h1bmtJbmRleCsrO1xuICAgICAgICBpZiAodGhpcy5oYXZlRXh0ZW5zaW9uUHJvcGVydHkpXG4gICAgICAgICAgZG9jSW5mby5leFByb3BlcnR5TmFtZSA9IHRoaXMuZGVmYXVsdFByb3BlcnR5TmFtZTtcblxuICAgICAgICAvL2RvY0luZm8uaXNMYXN0ID0gdHJ1ZTtcbiAgICAgICAgdXBsb2FkSW5mby5kb2NJbmZvID0gZG9jSW5mbztcblxuICAgICAgICAvLyBsZXQgaW5mbyA9IHVwbG9hZEluZm87XG5cbiAgICAgICAgLy8gdGhpcy5yZXF1ZXN0QXJyYXkucHVzaCh0aGlzLnVwbG9hZFNlcnZpY2UudXBsb2FkRmlsZSh1cGxvYWRJbmZvKSk7XG4gICAgICAgIC8vIHRoaXMucmVxdWVzdEJvZHlBcnJheS5wdXNoKGluZm8pO1xuICAgICAgICAvL+Wwgeijheivt+axgmZvcm1kYXRhXG4gICAgICAgIGxldCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ3VwbG9hZEluZm8nLCBKU09OLnN0cmluZ2lmeSh1cGxvYWRJbmZvKSk7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZG9jSW5mbycsIEpTT04uc3RyaW5naWZ5KGRvY0luZm8pKTtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgZmlsZURhdGEpO1xuXG5cbiAgICAgICAgLy8gfVxuICAgICAgICAvL2NvbnNvbGUubG9nKGNodW5rSW5kZXggKyAxKTtcbiAgICAgICAgY2h1bmtJbmRleCA9IGNodW5rSW5kZXggKyAxO1xuICAgICAgfVxuXG5cbiAgICAgIGxldCBpbmRleCA9IC0xO1xuICAgICAgdGhpcy5maWxlcy5mb3JFYWNoKHggPT4ge1xuICAgICAgICBpZiAoeC5uYW1lID09IGZpbGVJbmZvLm5hbWUpIHtcbiAgICAgICAgICBpZiAoaW5kZXggPT0gLTEpXG4gICAgICAgICAgICBpbmRleCA9IHRoaXMuZmlsZXMuaW5kZXhPZih4KTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIGlmIChpbmRleCAhPSAtMSAmJiBpbmRleCAhPSB0aGlzLmZpbGVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgdGhpcy5maWxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHRoaXMudXBsb2FkZWRGaWxlVG90YWwtLTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgc2VuZFVwbG9hZFJlcXVlc3QoZm9ybURhdGE6IGFueSwgZmlsZUluZm86IGFueSwgZG9jSW5mbzogYW55LCB1cGxvYWRGaWxlSW5mbzogYW55KSB7XG4gICAgdGhpcy51cGxvYWRTbGljZUZpbGUoZm9ybURhdGEpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgaWYgKHJlcyAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0udXBsb2FkUmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0uaXNVcGxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5maWxlc1t0aGlzLmZpbGVzLmluZGV4T2YoZmlsZUluZm8pXS5lcnJvck1lc3NhZ2UgPSByZXMuZXJyb3IuTWVzc2FnZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXBsb2FkZWRDaHVua1tkb2NJbmZvLm1ldGFkYXRhSWRdKys7XG4gICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0udXBsb2FkUHJvY2VzcyA9IE51bWJlci5wYXJzZUludCgodGhpcy51cGxvYWRlZENodW5rW2RvY0luZm8ubWV0YWRhdGFJZF0gLyB0aGlzLmZpbGVUb3RhbENodW5rW2RvY0luZm8ubWV0YWRhdGFJZF0gKiAxMDApLnRvRml4ZWQoMCkpO1xuICAgICAgICBpZiAodGhpcy51cGxvYWRlZENodW5rW2RvY0luZm8ubWV0YWRhdGFJZF0gPT0gdGhpcy5maWxlVG90YWxDaHVua1tkb2NJbmZvLm1ldGFkYXRhSWRdKSB7XG4gICAgICAgICAgdGhpcy5maWxlc1t0aGlzLmZpbGVzLmluZGV4T2YoZmlsZUluZm8pXS51cGxvYWRSZXN1bHQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0uaXNVcGxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdCA9IHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LmNvbmNhdCh1cGxvYWRGaWxlSW5mbyk7XG4gICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdCA9IHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuY29uY2F0KHVwbG9hZEZpbGVJbmZvKTtcbiAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZVRvdGFsKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHVwbG9hZFNsaWNlRmlsZShmb3JtZGF0YTogRm9ybURhdGEpOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgbGV0IHVybCA9IFwiL2FwaS9ydW50aW1lL2Rmcy92MS4wL2Zvcm1kb2Mvc2xpY2VcIjtcbiAgICAvL3VybCA9IFwiL2FwaS9ydW50aW1lL2Rmcy92MS4wL2Zvcm1kb2MvbGlzdFwiO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cGNsaWVudC5wb3N0KHVybCwgZm9ybWRhdGEpLnBpcGUoXG4gICAgICB0YXAocmVzID0+IHsgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICAgICAgcmV0dXJuIG9mKGVycm9yKTtcbiAgICAgIH0pKTtcbiAgfVxuXG4gIHNlbGVjdEFsbEZpbGUoKSB7XG5cbiAgICBpZiAoIXRoaXMuZmlsZUFsbFNlbGVjdGVkKSB7XG4gICAgICB0aGlzLmZpbGVzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIC8vIGxldCBvYmo6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQubmFtZSk7XG4gICAgICAgIC8vIG9iai5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgZWxlbWVudC5zZWxlY3RkID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5maWxlQWxsU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5zZWxlY3RlZEZpbGVDb3VudCA9IHRoaXMuZmlsZXMubGVuZ3RoO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmlsZXMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgLy8gbGV0IG9iajogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudC5uYW1lKTtcbiAgICAgICAgLy8gb2JqLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgZWxlbWVudC5zZWxlY3RkID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZmlsZUFsbFNlbGVjdGVkID0gZmFsc2U7XG4gICAgICB0aGlzLnNlbGVjdGVkRmlsZUNvdW50ID0gMDtcbiAgICB9XG4gIH1cblxuXG4gIGNoZWNrb3V0U2VsZWN0RmlsZShmaWxlOiBGaWxlSW5mbykge1xuICAgIC8vIGxldCBvYmo6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZpbGVOYW1lKTtcbiAgICBmaWxlLnNlbGVjdGQgPSAhZmlsZS5zZWxlY3RkO1xuICAgIGlmIChmaWxlLnNlbGVjdGQpXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsZUNvdW50Kys7XG4gICAgZWxzZVxuICAgICAgdGhpcy5zZWxlY3RlZEZpbGVDb3VudC0tO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRmlsZUNvdW50ID09IHRoaXMuZmlsZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmZpbGVBbGxTZWxlY3RlZCA9IHRydWU7XG4gICAgICAvL3RoaXMuaXNGaWxlQWxsU2VsZWN0ZWQoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmZpbGVBbGxTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgLy90aGlzLmlzRmlsZUFsbFNlbGVjdGVkKCk7XG4gICAgfVxuXG4gIH1cblxuICBsaXN0RGVsZXRlRmlsZShmaWxlSW5mbzogRmlsZUluZm8pIHtcbiAgICBpZiAoZmlsZUluZm8uc2VsZWN0ZClcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlQ291bnQtLTtcbiAgICAvL2NvbnNvbGUubG9nKGZpbGVOYW1lKTtcbiAgICB0aGlzLmZpbGVzLnNwbGljZSh0aGlzLmZpbGVzLmluZGV4T2YoZmlsZUluZm8pLCAxKTtcbiAgICBpZiAoZmlsZUluZm8udXBsb2FkUmVzdWx0KSB7XG4gICAgICBsZXQgaWRMaXN0OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgaWRMaXN0LnB1c2goZmlsZUluZm8uaWQpO1xuICAgICAgdGhpcy51cGxvYWRTZXJ2aWNlLmNhbmNlbChpZExpc3QsIHRoaXMucm9vdElkKS5zdWJzY3JpYmUoKTtcblxuICAgICAgdGhpcy51cGxvYWRGaWxlSW5mb0xpc3Quc3BsaWNlKHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LmluZGV4T2YodGhpcy51cGxvYWRGaWxlSW5mb0xpc3QuZmlsdGVyKHggPT4geC5maWxlTmFtZSA9PSBmaWxlSW5mby5uYW1lKVswXSksIDEpO1xuICAgICAgdGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5zcGxpY2UodGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5pbmRleE9mKHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuZmlsdGVyKHggPT4geC5maWxlTmFtZSA9PSBmaWxlSW5mby5uYW1lKVswXSksIDEpO1xuICAgICAgdGhpcy51cGxvYWRlZEZpbGVUb3RhbC0tO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RlZEZpbGVDb3VudCA9PSAwKVxuICAgICAgdGhpcy5maWxlQWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGxpc3RNdWx0aXBsZURlbGV0ZUZpbGUoKSB7XG4gICAgbGV0IHNlbGVjdGVkRmlsZTogRmlsZUluZm9bXSA9IFtdO1xuICAgIHRoaXMuZmlsZXMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGxldCBvYmo6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQubmFtZSk7XG4gICAgICBpZiAob2JqLmNoZWNrZWQpXG4gICAgICAgIHNlbGVjdGVkRmlsZS5wdXNoKGVsZW1lbnQpO1xuICAgIH0pXG4gICAgbGV0IG1ldGFkYXRhTGlzdDogc3RyaW5nW10gPSBbXTtcbiAgICBzZWxlY3RlZEZpbGUuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIG1ldGFkYXRhTGlzdC5wdXNoKGVsZW1lbnQuaWQpO1xuICAgICAgdGhpcy5maWxlcy5zcGxpY2UodGhpcy5maWxlcy5pbmRleE9mKGVsZW1lbnQpLCAxKTtcbiAgICAgIGlmIChlbGVtZW50LnVwbG9hZFJlc3VsdCkge1xuICAgICAgICAvLyBsZXQgaWRMaXN0OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAvLyBpZExpc3QucHVzaChmaWxlSW5mby5pZCk7XG4gICAgICAgIC8vIHRoaXMudXBsb2FkU2VydmljZS5jYW5jZWwoaWRMaXN0LCB0aGlzLnJvb3RJZCkuc3Vic2NyaWJlKCk7XG5cbiAgICAgICAgdGhpcy51cGxvYWRGaWxlSW5mb0xpc3Quc3BsaWNlKHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LmluZGV4T2YodGhpcy51cGxvYWRGaWxlSW5mb0xpc3QuZmlsdGVyKHggPT4geC5maWxlTmFtZSA9PSBlbGVtZW50Lm5hbWUpWzBdKSwgMSk7XG4gICAgICAgIHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3Quc3BsaWNlKHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuaW5kZXhPZih0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LmZpbHRlcih4ID0+IHguZmlsZU5hbWUgPT0gZWxlbWVudC5uYW1lKVswXSksIDEpO1xuICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZVRvdGFsLS07XG4gICAgICB9XG4gICAgfSlcbiAgICB0aGlzLnVwbG9hZFNlcnZpY2UuY2FuY2VsKG1ldGFkYXRhTGlzdCwgdGhpcy5yb290SWQpLnN1YnNjcmliZSgpO1xuXG4gICAgbGV0IGFsbEJveDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhbGxDaGVja0JveFwiKTtcbiAgICBpZiAoYWxsQm94ICE9IG51bGwpXG4gICAgICBhbGxCb3guY2hlY2tlZCA9IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0ZWRGaWxlQ291bnQgPSAwO1xuICAgIHRoaXMuZmlsZUFsbFNlbGVjdGVkID0gZmFsc2U7XG4gIH1cblxuXG4gIGdldFBpY0xpc3REaXNwbGF5TmFtZShmaWxlTmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKGZpbGVOYW1lLmxlbmd0aCA8PSAxMClcbiAgICAgIHJldHVybiBmaWxlTmFtZTtcbiAgICBlbHNlIHtcbiAgICAgIGxldCBoZWFkQ29udGVudCA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCAyKTtcbiAgICAgIGxldCB0YWlsQ29udGVudCA9IGZpbGVOYW1lLnN1YnN0cmluZyhmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpIC0gMik7XG4gICAgICByZXR1cm4gaGVhZENvbnRlbnQgKyBcIuKAplwiICsgdGFpbENvbnRlbnQ7XG4gICAgfVxuICB9XG5cbiAgZ2V0UXVldWVEaXNwbGF5TmFtZShmaWxlTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGZpbGVOYW1lO1xuICB9XG5cbiAgYWRkRG9jSW5mbyhzZWxlY3RkRmlsZSwgZmlsZUluZm86IEZpbGVJbmZvLCBkb2NUeXBlOiBEb2NUeXBlKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBzd2l0Y2ggKGRvY1R5cGUpIHtcbiAgICAgICAgY2FzZSBEb2NUeXBlLldvcmQ6IHtcbiAgICAgICAgICBmaWxlSW5mby5zb3VyY2UgPSBcIi9wbGF0Zm9ybS9ydW50aW1lL2Rmcy9pbWFnZXMvd29yZC5wbmdcIlxuICAgICAgICAgIHRoaXMuZmlsZXMucHVzaChmaWxlSW5mbyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIERvY1R5cGUuUGRmOiB7XG4gICAgICAgICAgZmlsZUluZm8uc291cmNlID0gXCIvcGxhdGZvcm0vcnVudGltZS9kZnMvaW1hZ2VzL3BkZi5wbmdcIlxuICAgICAgICAgIHRoaXMuZmlsZXMucHVzaChmaWxlSW5mbyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIERvY1R5cGUuRXhjZWw6IHtcbiAgICAgICAgICBmaWxlSW5mby5zb3VyY2UgPSBcIi9wbGF0Zm9ybS9ydW50aW1lL2Rmcy9pbWFnZXMvZXhjZWwucG5nXCI7XG4gICAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGVJbmZvKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgRG9jVHlwZS5UeHQ6IHtcbiAgICAgICAgICBmaWxlSW5mby5zb3VyY2UgPSBcIi9wbGF0Zm9ybS9ydW50aW1lL2Rmcy9pbWFnZXMvdHh0LnBuZ1wiO1xuICAgICAgICAgIHRoaXMuZmlsZXMucHVzaChmaWxlSW5mbyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIERvY1R5cGUuUG93ZXJwb2ludDoge1xuICAgICAgICAgIGZpbGVJbmZvLnNvdXJjZSA9IFwiL3BsYXRmb3JtL3J1bnRpbWUvZGZzL2ltYWdlcy9wcHQucG5nXCI7XG4gICAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGVJbmZvKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgRG9jVHlwZS5PdGhlcjoge1xuICAgICAgICAgIGZpbGVJbmZvLnNvdXJjZSA9IFwiL3BsYXRmb3JtL3J1bnRpbWUvZGZzL2ltYWdlcy9maWxlLnBuZ1wiO1xuICAgICAgICAgIHRoaXMuZmlsZXMucHVzaChmaWxlSW5mbyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIERvY1R5cGUuSW1hZ2U6IHtcbiAgICAgICAgICB0aGlzLmdldEltYWdlVXJsKHNlbGVjdGRGaWxlKS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICBmaWxlSW5mby5zb3VyY2UgPSByZXM7XG4gICAgICAgICAgICB0aGlzLmZpbGVzLnB1c2goZmlsZUluZm8pO1xuICAgICAgICAgICAgcmVzb2x2ZShmaWxlSW5mbyk7XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICB9XG4gICAgICByZXNvbHZlKGZpbGVJbmZvKTtcbiAgICB9KVxuICB9XG5cbiAgZ2V0SW1hZ2VVcmwoc2VsZWN0ZEZpbGU6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChzZWxlY3RkRmlsZSk7XG4gICAgICByZWFkZXIub25sb2FkID0gKF9ldmVudCkgPT4ge1xuICAgICAgICBsZXQgaW1nVXJsID0gcmVhZGVyLnJlc3VsdDtcbiAgICAgICAgaWYgKHRoaXMuaW5qZWN0b3IgIT0gbnVsbCkge1xuICAgICAgICAgIGxldCBzYW5pdGl6ZXIgPSB0aGlzLmluamVjdG9yLmdldChEb21TYW5pdGl6ZXIpO1xuICAgICAgICAgIGltZ1VybCA9IHNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoaW1nVXJsKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKGltZ1VybCk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGxpc3RUb1N0cmluZyhzdHJMaXN0OiBzdHJpbmdbXSkge1xuICAgIGxldCBuYW1lOiBzdHJpbmcgPSBcIlwiO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgbmFtZSArPSBzdHJMaXN0W2ldICsgXCIsXCI7XG4gICAgfVxuICAgIHJldHVybiBuYW1lO1xuICB9XG5cbiAgc2VjdXJpdHlDaGFuZ2UoJGV2ZW50OiBhbnksIGZpbGU6IEZpbGVJbmZvKSB7XG4gICAgZmlsZS5zZWN1cml0eUluZm8gPSAkZXZlbnQuZGF0YTtcbiAgICBsZXQgdXBsb2FkRmlsZSA9IHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LmZpbHRlcih4ID0+IHgubWV0YWRhdGFJZCA9IGZpbGUuaWQpWzBdO1xuICAgIHVwbG9hZEZpbGUuc2VjdXJpdHlJbmZvID0gJGV2ZW50LmRhdGE7XG4gIH1cblxuXG4gIGV4U3RvcmFnZUZpbGVMaXN0OiBFeFN0b3JhZ2VGaWxlSW5mb1tdID0gW107XG5cbiAgdHlwZUNoYW5nZSgkZXZlbnQ6IGFueSwgZmlsZTogRmlsZUluZm8pIHtcbiAgICBmaWxlLmV4dGVuc2lvbk5hbWUgPSAkZXZlbnQuZGF0YS5uYW1lO1xuICAgIGxldCBleFN0b3JhZ2VGaWxlSW5mbzogRXhTdG9yYWdlRmlsZUluZm8gPSBuZXcgRXhTdG9yYWdlRmlsZUluZm87XG4gICAgaWYgKGZpbGUuZXh0ZW5zaW9uTmFtZSA9PSB0aGlzLnN0b3JhZ2VFeHRlbnNpb24uZGVmYXVsdFByb3BlcnR5TmFtZSkge1xuICAgICAgaWYgKHRoaXMuZXhTdG9yYWdlRmlsZUxpc3QuZmlsdGVyKHggPT4geC5tZXRhZGF0YUlkID09IGZpbGUuaWQpLmxlbmd0aCA+IDApXG4gICAgICAgIHRoaXMuZXhTdG9yYWdlRmlsZUxpc3Quc3BsaWNlKHRoaXMuZXhTdG9yYWdlRmlsZUxpc3QuZmluZEluZGV4KHggPT4geC5tZXRhZGF0YUlkID09IGZpbGUuaWQpLCAxKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5leFN0b3JhZ2VGaWxlTGlzdC5maWx0ZXIoeCA9PiB4Lm1ldGFkYXRhSWQgPT0gZmlsZS5pZCkubGVuZ3RoID4gMCkge1xuICAgICAgICBleFN0b3JhZ2VGaWxlSW5mbyA9IHRoaXMuZXhTdG9yYWdlRmlsZUxpc3QuZmlsdGVyKHggPT4geC5tZXRhZGF0YUlkID09IGZpbGUuaWQpWzBdO1xuICAgICAgICBleFN0b3JhZ2VGaWxlSW5mby5leFByb3BlcnR5TmFtZSA9IGZpbGUuZXh0ZW5zaW9uTmFtZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4U3RvcmFnZUZpbGVJbmZvLm1ldGFkYXRhSWQgPSBmaWxlLmlkO1xuICAgICAgICBleFN0b3JhZ2VGaWxlSW5mby5leFByb3BlcnR5TmFtZSA9IGZpbGUuZXh0ZW5zaW9uTmFtZTtcbiAgICAgICAgdGhpcy5leFN0b3JhZ2VGaWxlTGlzdC5wdXNoKGV4U3RvcmFnZUZpbGVJbmZvKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGxvYWQoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBpZiAodGhpcy51cGxvYWRlZEZpbGVUb3RhbCAhPSB0aGlzLmZpbGVzLmZpbHRlcih4ID0+IHguaXNVcGxvYWRpbmcgfHwgeC51cGxvYWRSZXN1bHQpLmxlbmd0aCkge1xuICAgICAgLy8gdGhpcy5ub3RpZnlTZXJ2aWNlLnN1Y2Nlc3MoPE5vdGlmeU9wdGlvbnM+e1xuICAgICAgLy8gICBtc2c6ICfkv53lrZjmiJDlip/vvIEnLCB0aW1lb3V0OiAzMDAwXG4gICAgICAvLyB9KTtcbiAgICAgIHRoaXMubXNnU2VydmljZS53YXJuaW5nKHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3dhaXQnKSk7XG4gICAgICByZXR1cm4gb2YoZmFsc2UpO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYXZlU2VjdXJpdHlJbmZvKSB7XG4gICAgICB0aGlzLnVwbG9hZFNlcnZpY2Uuc2F2ZVNlY3VyaXR5SW5mbyh0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdCwgdGhpcy5yb290SWQpLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdG9yYWdlRXh0ZW5zaW9uID09IG51bGwpXG4gICAgICByZXR1cm4gb2YodGhpcy51cGxvYWRGaWxlSW5mb0xpc3QpO1xuICAgIGVsc2Uge1xuICAgICAgaWYgKHRoaXMuZXhTdG9yYWdlRmlsZUxpc3QubGVuZ3RoID09IDApXG4gICAgICAgIHJldHVybiBvZih0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdCk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgbG9hZGluZyA9IHRoaXMubG9hZFNlcnZpY2Uuc2hvdyh7XG4gICAgICAgICAgbWVzc2FnZTogdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnc2F2ZVRvJykgKyB0aGlzLnN0b3JhZ2VFeHRlbnNpb24uZXh0ZW5zaW9uTmFtZVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBsb2FkU2VydmljZS5jaGFuZ2VTdG9yYWdlSW5zdGFuY2UodGhpcy5leFN0b3JhZ2VGaWxlTGlzdCwgdGhpcy5yb290SWQpLnBpcGUoXG4gICAgICAgICAgbWFwKHJlcyA9PiB7XG4gICAgICAgICAgICAvLyBpZiAocmVzICE9IG51bGwpXG4gICAgICAgICAgICAvLyAgIHRoaXMubXNnU2VydmljZS5lcnJvcign5L+d5a2Y5YiwJyArIHRoaXMuc3RvcmFnZUV4dGVuc2lvbi5leHRlbnNpb25OYW1lICsgXCLlpLHotKXvvIzkuIrkvKDmlofku7boh6rliqjkv53lrZjliLBcIiArIHRoaXMuc3RvcmFnZUV4dGVuc2lvbi5kZWZhdWx0UHJvcGVydHlOYW1lICsgXCLlrZjlgqjjgIJcIiArIHJlcy5lcnJvci5NZXNzYWdlKTtcbiAgICAgICAgICAgIGxvYWRpbmcuY2xvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdDtcbiAgICAgICAgICB9KSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjYW5jZWwoKSB7XG4gICAgaWYgKHRoaXMudXBsb2FkRmlsZUluZm9MaXN0Lmxlbmd0aCA9PSAwKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICB0aGlzLm1ldGFkYXRhSWRMaXN0LnB1c2goZWxlbWVudC5tZXRhZGF0YUlkKTtcbiAgICB9KVxuICAgIHRoaXMudXBsb2FkU2VydmljZS5jYW5jZWwodGhpcy5tZXRhZGF0YUlkTGlzdCwgdGhpcy5yb290SWQpLnN1YnNjcmliZSgpO1xuXG4gIH1cblxuICBnZXRVcGxvYWRGaWxlSW5mb0xpc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMudXBsb2FkRmlsZUluZm9MaXN0O1xuICB9XG5cbiAgZGVsZXRlKGZpbGUpIHtcbiAgICB0aGlzLmZpbGVzLnNwbGljZSh0aGlzLmZpbGVzLmluZGV4T2YoZmlsZSksIDEpO1xuICAgIGlmIChmaWxlLnVwbG9hZFJlc3VsdClcbiAgICAgIHRoaXMudXBsb2FkZWRGaWxlVG90YWwtLTtcbiAgICBpZiAodGhpcy5leFN0b3JhZ2VGaWxlTGlzdC5maWx0ZXIoeCA9PiB4Lm1ldGFkYXRhSWQgPT0gZmlsZS5pZCkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5leFN0b3JhZ2VGaWxlTGlzdC5zcGxpY2UodGhpcy5leFN0b3JhZ2VGaWxlTGlzdC5maW5kSW5kZXgoeCA9PiB4Lm1ldGFkYXRhSWQgPT0gZmlsZS5pZCksIDEpO1xuICAgIH1cbiAgICAvLyB2YXIgb2JqOmFueSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNmaWxlJyk7XG4gICAgLy8gb2JqLmZpbGVzLnJlbW92ZSgpO1xuICAgIC8vb2JqLnZhbHVlPScnO1xuICB9XG5cbiAgZ2V0RmlsZVNpemUoc2l6ZTogbnVtYmVyKSB7XG4gICAgaWYgKHNpemUgPCAxMDI0MDApXG4gICAgICByZXR1cm4gKHNpemUgLyAxMDI0KS50b0ZpeGVkKDEpICsgXCJLXCI7XG4gICAgZWxzZSBpZiAoc2l6ZSA8IDEwMjQgKiAxMDI0KVxuICAgICAgcmV0dXJuIChzaXplIC8gMTAyNCkudG9GaXhlZCgwKSArIFwiS1wiO1xuICAgIGVsc2UgaWYgKHNpemUgPCAxMDAgKiAxMDI0ICogMTAyNClcbiAgICAgIHJldHVybiAoc2l6ZSAvIDEwMjQgLyAxMDI0KS50b0ZpeGVkKDEpICsgXCJNXCI7XG4gICAgZWxzZSBpZiAoc2l6ZSA8IDEwMjQgKiAxMDI0ICogMTAyNClcbiAgICAgIHJldHVybiAoc2l6ZSAvIDEwMjQgLyAxMDI0KS50b0ZpeGVkKDApICsgXCJNXCI7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIChzaXplIC8gMTAyNCAvIDEwMjQgLyAxMDI0KS50b0ZpeGVkKDEpICsgXCJHXCI7XG4gIH1cbiAgc2hvd0J5R3JvdXAoKSB7XG4gICAgdGhpcy5zaG93VHlwZSA9IDA7XG4gICAgLy8gdGhpcy5zZWxlY3RlZEZpbGVDb3VudCA9IDA7XG4gIH1cblxuICBzaG93QnlMaXN0KCkge1xuICAgIHRoaXMuc2hvd1R5cGUgPSAxO1xuICAgIC8vIHRoaXMuc2VsZWN0ZWRGaWxlQ291bnQgPSAwO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRmlsZUNvdW50ICE9IDAgJiYgdGhpcy5zZWxlY3RlZEZpbGVDb3VudCA9PSB0aGlzLmZpbGVzLmxlbmd0aCkge1xuICAgICAgdGhpcy5maWxlQWxsU2VsZWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIG1vdXNlT3ZlcihmaWxlKSB7XG4gICAgZmlsZS5tb3VzZU9uID0gdHJ1ZTtcbiAgfVxuICBtb3VzZU91dChmaWxlKSB7XG4gICAgZmlsZS5tb3VzZU9uID0gZmFsc2U7XG4gIH1cblxufVxuXG5cbiJdfQ==
|