@gsp-svc/formdoc-upload 0.1.39 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/bundles/gsp-svc-formdoc-upload.umd.js +315 -188
  2. package/bundles/gsp-svc-formdoc-upload.umd.js.map +1 -1
  3. package/bundles/gsp-svc-formdoc-upload.umd.min.js +1 -1
  4. package/bundles/gsp-svc-formdoc-upload.umd.min.js.map +1 -1
  5. package/esm2015/lib/i18n/language.resource.js +9 -5
  6. package/esm2015/lib/upload/download.service.js +9 -1
  7. package/esm2015/lib/upload/entity/completemultiuploadrequest.js +21 -0
  8. package/esm2015/lib/upload/entity/{gspdocsecuritynaseinfo.js → gspdocsecuritybaseinfo.js} +1 -1
  9. package/esm2015/lib/upload/entity/gspformstreamentity.js +25 -0
  10. package/esm2015/lib/upload/entity/gspformuploadentity.js +1 -1
  11. package/esm2015/lib/upload/entity/initmultiuploadrequest.js +19 -0
  12. package/esm2015/lib/upload/entity/multiuploadrequest.js +21 -0
  13. package/esm2015/lib/upload/entity/multiuploadresult.js +13 -0
  14. package/esm2015/lib/upload/entity/uploadlimit.js +1 -1
  15. package/esm2015/lib/upload/file-upload/file-upload.component.js +234 -129
  16. package/esm2015/lib/upload/upload.module.js +3 -3
  17. package/esm2015/lib/upload/upload.service.js +3 -22
  18. package/esm2015/lib/uploaddialog/uploaddialog.module.js +1 -3
  19. package/esm2015/public-api.js +2 -2
  20. package/esm5/lib/i18n/language.resource.js +9 -5
  21. package/esm5/lib/upload/download.service.js +14 -1
  22. package/esm5/lib/upload/entity/completemultiuploadrequest.js +25 -0
  23. package/esm5/lib/upload/entity/{gspdocsecuritynaseinfo.js → gspdocsecuritybaseinfo.js} +1 -1
  24. package/esm5/lib/upload/entity/gspformstreamentity.js +29 -0
  25. package/esm5/lib/upload/entity/gspformuploadentity.js +1 -1
  26. package/esm5/lib/upload/entity/initmultiuploadrequest.js +23 -0
  27. package/esm5/lib/upload/entity/multiuploadrequest.js +25 -0
  28. package/esm5/lib/upload/entity/multiuploadresult.js +17 -0
  29. package/esm5/lib/upload/entity/uploadlimit.js +1 -1
  30. package/esm5/lib/upload/file-upload/file-upload.component.js +248 -139
  31. package/esm5/lib/upload/upload.module.js +3 -3
  32. package/esm5/lib/upload/upload.service.js +3 -26
  33. package/esm5/lib/uploaddialog/uploaddialog.module.js +1 -3
  34. package/esm5/public-api.js +2 -2
  35. package/fesm2015/gsp-svc-formdoc-upload.js +287 -168
  36. package/fesm2015/gsp-svc-formdoc-upload.js.map +1 -1
  37. package/fesm5/gsp-svc-formdoc-upload.js +325 -189
  38. package/fesm5/gsp-svc-formdoc-upload.js.map +1 -1
  39. package/gsp-svc-formdoc-upload.metadata.json +1 -1
  40. package/lib/i18n/language.resource.d.ts +4 -0
  41. package/lib/upload/download.service.d.ts +1 -0
  42. package/lib/upload/entity/completemultiuploadrequest.d.ts +9 -0
  43. package/lib/upload/entity/gspformstreamentity.d.ts +12 -0
  44. package/lib/upload/entity/initmultiuploadrequest.d.ts +7 -0
  45. package/lib/upload/entity/multiuploadrequest.d.ts +8 -0
  46. package/lib/upload/entity/multiuploadresult.d.ts +4 -0
  47. package/lib/upload/entity/uploadlimit.d.ts +1 -1
  48. package/lib/upload/file-upload/file-upload.component.d.ts +9 -4
  49. package/lib/upload/upload.service.d.ts +2 -3
  50. package/package.json +1 -1
  51. package/public-api.d.ts +1 -1
  52. /package/lib/upload/entity/{gspdocsecuritynaseinfo.d.ts → gspdocsecuritybaseinfo.d.ts} +0 -0
@@ -4,22 +4,24 @@
4
4
  */
5
5
  import { Component, Input, ViewChild, TemplateRef, Injector, LOCALE_ID } from '@angular/core';
6
6
  import { DocType } from '../entity/doctype';
7
- import { GspFormDocInfo } from '../entity/gspformdocinfo';
8
7
  import { OperatingModes } from '../entity/operatingmodes';
9
8
  import { UploadService } from '../upload.service';
10
9
  import { UploadFileInfo } from '../entity/uploadfileinfo';
11
10
  import { MessagerService } from '@farris/ui-messager';
12
11
  import { catchError, map, tap } from 'rxjs/operators';
13
12
  import { of } from 'rxjs';
14
- import { GspFormUploadEntity } from '../entity/gspformuploadentity';
15
13
  import { UUID } from 'angular2-uuid';
16
14
  import { ExStorageFileInfo } from '../entity/extensionstoragefileinfo';
17
15
  import { LoadingService } from '@farris/ui-loading';
18
16
  import { DomSanitizer } from '@angular/platform-browser';
19
17
  import { FileState } from '../entity/filestate';
20
18
  import { LocalLangPipe } from '../../local.pipe';
21
- import { GspDocSecurityBaseInfo } from '../entity/gspdocsecuritynaseinfo';
19
+ import { GspDocSecurityBaseInfo } from '../entity/gspdocsecuritybaseinfo';
22
20
  import { HttpClient } from '@angular/common/http';
21
+ import { InitMultiUploadRequest } from '../entity/initmultiuploadrequest';
22
+ import { CompleteMultiUploadRequest } from '../entity/completemultiuploadrequest';
23
+ import { GspFormStreamEntity } from '../entity/gspformstreamentity';
24
+ import { MultiUploadRequest } from '../entity/multiuploadrequest';
23
25
  var FileUploadComponent = /** @class */ (function () {
24
26
  function FileUploadComponent(msgService, uploadService, loadService, injector) {
25
27
  this.msgService = msgService;
@@ -35,7 +37,7 @@ var FileUploadComponent = /** @class */ (function () {
35
37
  this.beyondFileList = [];
36
38
  this.showType = 0;
37
39
  this.mouseOn = false;
38
- this.bufferSize = 10 * 1024 * 1024;
40
+ this.bufferSize = 5 * 1024 * 1024;
39
41
  this.selectedFileCount = 0;
40
42
  this.uploadIconAddress = '/platform/runtime/dfs/images/upload.svg';
41
43
  this.uploadLittleIconAddress = '/platform/runtime/dfs/images/uploadIcon.svg';
@@ -43,8 +45,6 @@ var FileUploadComponent = /** @class */ (function () {
43
45
  this.fileAllSelected = false;
44
46
  this.uploadProcess = { width: '0%' };
45
47
  this.fileTotalChunk = {};
46
- //fileUploadState: { [key: string]: boolean } = {};
47
- //flag: number = 0;
48
48
  this.requestArray = new Array;
49
49
  this.requestBodyArray = new Array;
50
50
  this.uploadedChunk = {};
@@ -129,14 +129,15 @@ var FileUploadComponent = /** @class */ (function () {
129
129
  _this.haveExtensionProperty = true;
130
130
  }
131
131
  }));
132
- this.uploadService.getRootSetting(this.rootId).subscribe((/**
132
+ this.uploadService.getUploadInfo(this.rootId).subscribe((/**
133
133
  * @param {?} res
134
134
  * @return {?}
135
135
  */
136
136
  function (res) {
137
137
  if (res != null && res.error == null) {
138
138
  _this.sameNameAllowed = res.sameNameAllowed;
139
- _this.validationId = res.validationId;
139
+ _this.maxFileSize = parseInt(JSON.parse(res.validateConfiguration).maxFileSize);
140
+ _this.allowedMultiUpload = res.allowedMultiUpload;
140
141
  if (!_this.sameNameAllowed) {
141
142
  _this.uploadService.getUploadedFileInfoList(_this.formId, _this.rootId).subscribe((/**
142
143
  * @param {?} res
@@ -150,18 +151,12 @@ var FileUploadComponent = /** @class */ (function () {
150
151
  }
151
152
  }));
152
153
  }
153
- _this.uploadService.getValidation(_this.validationId).subscribe((/**
154
- * @param {?} res
155
- * @return {?}
156
- */
157
- function (res) {
158
- _this.maxFileSize = parseInt(JSON.parse(res.configuration).maxFileSize);
159
- }));
160
154
  }
161
155
  }));
162
156
  if (this.oldIdList != null && this.oldIdList.length > 0) {
163
- this.uploadService.cancel(this.oldIdList, this.rootId).subscribe();
157
+ // this.uploadService.cancel(this.oldIdList, this.rootId).subscribe();
164
158
  }
159
+ this.radioButtonGroupValue = 'showByGroup';
165
160
  };
166
161
  /**
167
162
  * @return {?}
@@ -185,12 +180,7 @@ var FileUploadComponent = /** @class */ (function () {
185
180
  * @return {?}
186
181
  */
187
182
  function ($event) {
188
- // const loading = this.loadService.show({
189
- // message: this.localepipe.transform('uploading')
190
- // });
191
183
  var _this = this;
192
- // this.totalLoad.close();
193
- // this.totalLoad = null;
194
184
  this.hasSelectedFile = true;
195
185
  this.selectedFiles = document.querySelector('#file');
196
186
  if (this.fileCount > 0) {
@@ -223,11 +213,6 @@ var FileUploadComponent = /** @class */ (function () {
223
213
  * @return {?}
224
214
  */
225
215
  function (x) { return x.fileName == selectedFile.name; })) != null) {
226
- // this.uploadedNameList.push(selectedFile.name);
227
- // this.msgService.question('之前已上传过同名文件: ' + selectedFile.name + ',需要替换么?', () => {
228
- // uuid = this.uploadedFileInfoList.find(x => x.fileName == selectedFile.name).metadataId;
229
- // this.uploadFile(uuid, selectedFile);
230
- // })
231
216
  /** @type {?} */
232
217
  var msg_1 = this_1.msgService.show('warning', this_1.localepipe.transform('haveSameName') + selectedFile.name, {
233
218
  initialState: {
@@ -315,11 +300,6 @@ var FileUploadComponent = /** @class */ (function () {
315
300
  for (var i = 0; i < this.selectedFiles.files.length; i++) {
316
301
  _loop_1(i);
317
302
  }
318
- // if (this.uploadedNameList.length > 0) {
319
- // let name: string = this.listToString(this.uploadedNameList);
320
- // this.msgService.warning('之前已上传过同名文件: ' + name + '请重新选择上传文件。');
321
- // this.uploadedNameList = [];
322
- // }
323
303
  if (this.errFileList.length > 0) {
324
304
  /** @type {?} */
325
305
  var name_1 = this.listToString(this.errFileList);
@@ -340,11 +320,6 @@ var FileUploadComponent = /** @class */ (function () {
340
320
  this.msgService.warning(name_3 + this.localepipe.transform('sizeMax') + this.maxFileSize + "KB" + this.localepipe.transform('rechooseFile'));
341
321
  this.beyondFileList = [];
342
322
  }
343
- // if (this.errTypeList.length > 0) {
344
- // let type: string = this.listToString(this.errTypeList);
345
- // this.msgService.warning('不支持上传类型为 ' + type + '的文件请重新选择上传文件。');
346
- // this.errTypeList = [];
347
- // }
348
323
  this.files = this.files.slice();
349
324
  this.fileAllSelected = false;
350
325
  $event.target.value = '';
@@ -451,60 +426,145 @@ var FileUploadComponent = /** @class */ (function () {
451
426
  /** @type {?} */
452
427
  var fileInfo = this.handleFileInfo(uuid, selectedFile, fileName);
453
428
  /** @type {?} */
454
- var chunkTotal = Math.ceil(selectedFile.size / this.bufferSize);
455
- /** @type {?} */
456
- var chunkIndex = 0;
457
- this.fileTotalChunk[uuid] = chunkTotal;
458
- /** @type {?} */
459
429
  var uploadFileInfo = new UploadFileInfo();
460
430
  uploadFileInfo.metadataId = uuid;
461
431
  uploadFileInfo.fileName = fileInfo.name;
462
- uploadFileInfo.fileSize = fileInfo.size;
432
+ uploadFileInfo.fileSize = fileInfo.fileSize;
463
433
  uploadFileInfo.state = state;
464
434
  uploadFileInfo.securityInfo = this.securityInfoList[0];
465
- while (chunkIndex < chunkTotal) {
466
- /** @type {?} */
467
- var uploadInfo = new GspFormUploadEntity;
468
- uploadInfo.formId = this.formId;
469
- uploadInfo.mode = OperatingModes.Temp;
470
- uploadInfo.rootId = this.rootId;
471
- /** @type {?} */
472
- var docInfo = new GspFormDocInfo;
473
- docInfo.fileName = fileName;
474
- docInfo.metadataId = uuid;
475
- docInfo.total = chunkTotal;
476
- this.uploadedChunk[docInfo.metadataId] = 0;
435
+ //判断是否支持分片上传
436
+ if (this.allowedMultiUpload) {
437
+ //支持分片上传
477
438
  /** @type {?} */
478
- var nextSize = Math.min((chunkIndex + 1) * this.bufferSize, selectedFile.size);
479
- /** @type {?} */
480
- var fileData = selectedFile.slice(chunkIndex * this.bufferSize, nextSize);
481
- // let reader = new FileReader();
482
- // reader.readAsBinaryString(fileData);
439
+ var initRequest = new InitMultiUploadRequest;
440
+ initRequest.path = this.formId;
441
+ initRequest.metadataId = uuid;
442
+ initRequest.rootId = this.rootId;
443
+ initRequest.size = fileInfo.fileSize;
444
+ initRequest.fileName = fileName;
445
+ //初始化分片
446
+ this.initMultiUpload(initRequest).subscribe((/**
447
+ * @param {?} res
448
+ * @return {?}
449
+ */
450
+ function (res) {
451
+ if (res.error != null) {
452
+ _this.files[_this.files.indexOf(fileInfo)].uploadResult = false;
453
+ _this.files[_this.files.indexOf(fileInfo)].isUploading = false;
454
+ _this.files[_this.files.indexOf(fileInfo)].errorMessage = res.error.Message;
455
+ }
456
+ else {
457
+ /** @type {?} */
458
+ var uploadId_1 = res.uploadId;
459
+ /** @type {?} */
460
+ var chunkTotal = Math.ceil(selectedFile.size / _this.bufferSize);
461
+ /** @type {?} */
462
+ var chunkIndex = 0;
463
+ /** @type {?} */
464
+ var multiResultList_1 = [];
465
+ _this.fileTotalChunk[uuid] = chunkTotal;
466
+ _this.uploadedChunk[uuid] = 0;
467
+ while (chunkIndex < chunkTotal) {
468
+ /** @type {?} */
469
+ var nextSize = Math.min((chunkIndex + 1) * _this.bufferSize, selectedFile.size);
470
+ /** @type {?} */
471
+ var fileData = selectedFile.slice(chunkIndex * _this.bufferSize, nextSize);
472
+ /** @type {?} */
473
+ var multiRequest = new MultiUploadRequest;
474
+ multiRequest.metadataId = uuid;
475
+ multiRequest.rootId = _this.rootId;
476
+ multiRequest.uploadId = uploadId_1;
477
+ multiRequest.index = chunkIndex;
478
+ multiRequest.total = chunkTotal;
479
+ multiRequest.size = fileData.size;
480
+ /** @type {?} */
481
+ var formData = new FormData();
482
+ formData.append('multiRequest', JSON.stringify(multiRequest));
483
+ formData.append('file', fileData);
484
+ _this.multiUpload(formData).subscribe((/**
485
+ * @param {?} res
486
+ * @return {?}
487
+ */
488
+ function (res) {
489
+ if (res.error != null) {
490
+ _this.files[_this.files.indexOf(fileInfo)].uploadResult = false;
491
+ _this.files[_this.files.indexOf(fileInfo)].isUploading = false;
492
+ _this.files[_this.files.indexOf(fileInfo)].errorMessage = res.error.Message;
493
+ }
494
+ else {
495
+ multiResultList_1.push(res.result);
496
+ _this.uploadedChunk[uuid]++;
497
+ _this.files[_this.files.indexOf(fileInfo)].uploadProcess = Number.parseInt((_this.uploadedChunk[uuid] / _this.fileTotalChunk[uuid] * 100).toFixed(0));
498
+ if (_this.uploadedChunk[uuid] == _this.fileTotalChunk[uuid]) {
499
+ if (multiResultList_1.length == _this.fileTotalChunk[uuid]) {
500
+ _this.files[_this.files.indexOf(fileInfo)].uploadResult = true;
501
+ _this.files[_this.files.indexOf(fileInfo)].isUploading = false;
502
+ _this.uploadFileInfoList = _this.uploadFileInfoList.concat(uploadFileInfo);
503
+ _this.uploadedFileInfoList = _this.uploadedFileInfoList.concat(uploadFileInfo);
504
+ _this.uploadedFileTotal++;
505
+ /** @type {?} */
506
+ var completeMultiUploadRequest = new CompleteMultiUploadRequest;
507
+ completeMultiUploadRequest.metadataId = uuid;
508
+ completeMultiUploadRequest.partList = multiResultList_1;
509
+ completeMultiUploadRequest.rootId = _this.rootId;
510
+ completeMultiUploadRequest.uploadId = uploadId_1;
511
+ completeMultiUploadRequest.size = fileInfo.fileSize;
512
+ if (_this.haveExtensionProperty)
513
+ completeMultiUploadRequest.exPropertyName = _this.defaultPropertyName;
514
+ _this.completeMultiUpload(completeMultiUploadRequest).subscribe((/**
515
+ * @param {?} res
516
+ * @return {?}
517
+ */
518
+ function (res) {
519
+ }));
520
+ //后台异步拼接文档
521
+ }
522
+ else {
523
+ _this.files[_this.files.indexOf(fileInfo)].uploadResult = false;
524
+ _this.files[_this.files.indexOf(fileInfo)].isUploading = false;
525
+ _this.files[_this.files.indexOf(fileInfo)].errorMessage = _this.localepipe.transform('mismatchChunkSize');
526
+ }
527
+ }
528
+ }
529
+ }));
530
+ chunkIndex = chunkIndex + 1;
531
+ }
532
+ }
533
+ }));
534
+ }
535
+ else {
483
536
  /** @type {?} */
484
- var innerIndex = chunkIndex;
485
- // reader.onload = () => {
486
- // docInfo.fileContent = btoa(reader.result.toString());
487
- docInfo.size = selectedFile.size;
488
- docInfo.index = innerIndex;
489
- docInfo.fileContent = "";
490
- //chunkIndex++;
537
+ var entity = new GspFormStreamEntity;
538
+ entity.formId = this.formId;
539
+ entity.metadataId = uuid;
540
+ entity.mode = OperatingModes.Temp;
541
+ entity.rootId = this.rootId;
542
+ entity.size = selectedFile.size;
543
+ entity.fileName = fileName;
491
544
  if (this.haveExtensionProperty)
492
- docInfo.exPropertyName = this.defaultPropertyName;
493
- //docInfo.isLast = true;
494
- uploadInfo.docInfo = docInfo;
495
- // let info = uploadInfo;
496
- // this.requestArray.push(this.uploadService.uploadFile(uploadInfo));
497
- // this.requestBodyArray.push(info);
498
- //封装请求formdata
545
+ entity.exPropertyName = this.defaultPropertyName;
499
546
  /** @type {?} */
500
547
  var formData = new FormData();
501
- formData.append('uploadInfo', JSON.stringify(uploadInfo));
502
- formData.append('docInfo', JSON.stringify(docInfo));
503
- formData.append('file', fileData);
504
- this.sendUploadRequest(formData, fileInfo, docInfo, uploadFileInfo);
505
- // }
506
- //console.log(chunkIndex + 1);
507
- chunkIndex = chunkIndex + 1;
548
+ formData.append('uploadEntity', JSON.stringify(entity));
549
+ formData.append('file', selectedFile);
550
+ this.uploadSingleFile(formData).subscribe((/**
551
+ * @param {?} res
552
+ * @return {?}
553
+ */
554
+ function (res) {
555
+ if (res != null) {
556
+ _this.files[_this.files.indexOf(fileInfo)].uploadResult = false;
557
+ _this.files[_this.files.indexOf(fileInfo)].isUploading = false;
558
+ _this.files[_this.files.indexOf(fileInfo)].errorMessage = res.error.Message;
559
+ }
560
+ else {
561
+ _this.files[_this.files.indexOf(fileInfo)].uploadResult = true;
562
+ _this.files[_this.files.indexOf(fileInfo)].isUploading = false;
563
+ _this.uploadFileInfoList = _this.uploadFileInfoList.concat(uploadFileInfo);
564
+ _this.uploadedFileInfoList = _this.uploadedFileInfoList.concat(uploadFileInfo);
565
+ _this.uploadedFileTotal++;
566
+ }
567
+ }));
508
568
  }
509
569
  /** @type {?} */
510
570
  var index = -1;
@@ -522,47 +582,31 @@ var FileUploadComponent = /** @class */ (function () {
522
582
  this.files.splice(index, 1);
523
583
  this.uploadFileInfoList.splice(index, 1);
524
584
  this.uploadedFileInfoList.splice(index, 1);
525
- this.uploadedFileTotal--;
585
+ //this.uploadedFileTotal--;
526
586
  }
527
587
  };
528
588
  /**
529
- * @param {?} formData
530
- * @param {?} fileInfo
531
- * @param {?} docInfo
532
- * @param {?} uploadFileInfo
589
+ * @param {?} formdata
533
590
  * @return {?}
534
591
  */
535
- FileUploadComponent.prototype.sendUploadRequest = /**
536
- * @param {?} formData
537
- * @param {?} fileInfo
538
- * @param {?} docInfo
539
- * @param {?} uploadFileInfo
592
+ FileUploadComponent.prototype.uploadSingleFile = /**
593
+ * @param {?} formdata
540
594
  * @return {?}
541
595
  */
542
- function (formData, fileInfo, docInfo, uploadFileInfo) {
543
- var _this = this;
544
- this.uploadSliceFile(formData).subscribe((/**
596
+ function (formdata) {
597
+ /** @type {?} */
598
+ var url = "/api/runtime/dfs/v1.0/formdoc/single";
599
+ return this.httpclient.post(url, formdata).pipe(tap((/**
545
600
  * @param {?} res
546
601
  * @return {?}
547
602
  */
548
- function (res) {
549
- if (res != null) {
550
- _this.files[_this.files.indexOf(fileInfo)].uploadResult = false;
551
- _this.files[_this.files.indexOf(fileInfo)].isUploading = false;
552
- _this.files[_this.files.indexOf(fileInfo)].errorMessage = res.error.Message;
553
- }
554
- else {
555
- _this.uploadedChunk[docInfo.metadataId]++;
556
- _this.files[_this.files.indexOf(fileInfo)].uploadProcess = Number.parseInt((_this.uploadedChunk[docInfo.metadataId] / _this.fileTotalChunk[docInfo.metadataId] * 100).toFixed(0));
557
- if (_this.uploadedChunk[docInfo.metadataId] == _this.fileTotalChunk[docInfo.metadataId]) {
558
- _this.files[_this.files.indexOf(fileInfo)].uploadResult = true;
559
- _this.files[_this.files.indexOf(fileInfo)].isUploading = false;
560
- _this.uploadFileInfoList = _this.uploadFileInfoList.concat(uploadFileInfo);
561
- _this.uploadedFileInfoList = _this.uploadedFileInfoList.concat(uploadFileInfo);
562
- _this.uploadedFileTotal++;
563
- }
564
- }
565
- }));
603
+ function (res) { })), catchError((/**
604
+ * @param {?} error
605
+ * @return {?}
606
+ */
607
+ function (error) {
608
+ return of(error);
609
+ })));
566
610
  };
567
611
  /**
568
612
  * @param {?} formdata
@@ -575,7 +619,6 @@ var FileUploadComponent = /** @class */ (function () {
575
619
  function (formdata) {
576
620
  /** @type {?} */
577
621
  var url = "/api/runtime/dfs/v1.0/formdoc/slice";
578
- //url = "/api/runtime/dfs/v1.0/formdoc/list";
579
622
  return this.httpclient.post(url, formdata).pipe(tap((/**
580
623
  * @param {?} res
581
624
  * @return {?}
@@ -588,6 +631,75 @@ var FileUploadComponent = /** @class */ (function () {
588
631
  return of(error);
589
632
  })));
590
633
  };
634
+ /**
635
+ * @param {?} request
636
+ * @return {?}
637
+ */
638
+ FileUploadComponent.prototype.initMultiUpload = /**
639
+ * @param {?} request
640
+ * @return {?}
641
+ */
642
+ function (request) {
643
+ /** @type {?} */
644
+ var url = "/api/runtime/dfs/v1.0/formdoc/multi/init";
645
+ return this.httpclient.post(url, request).pipe(tap((/**
646
+ * @param {?} res
647
+ * @return {?}
648
+ */
649
+ function (res) { })), catchError((/**
650
+ * @param {?} error
651
+ * @return {?}
652
+ */
653
+ function (error) {
654
+ return of(error);
655
+ })));
656
+ };
657
+ /**
658
+ * @param {?} formdata
659
+ * @return {?}
660
+ */
661
+ FileUploadComponent.prototype.multiUpload = /**
662
+ * @param {?} formdata
663
+ * @return {?}
664
+ */
665
+ function (formdata) {
666
+ /** @type {?} */
667
+ var url = "/api/runtime/dfs/v1.0/formdoc/multi/upload";
668
+ return this.httpclient.post(url, formdata).pipe(tap((/**
669
+ * @param {?} res
670
+ * @return {?}
671
+ */
672
+ function (res) { })), catchError((/**
673
+ * @param {?} error
674
+ * @return {?}
675
+ */
676
+ function (error) {
677
+ return of(error);
678
+ })));
679
+ };
680
+ /**
681
+ * @param {?} request
682
+ * @return {?}
683
+ */
684
+ FileUploadComponent.prototype.completeMultiUpload = /**
685
+ * @param {?} request
686
+ * @return {?}
687
+ */
688
+ function (request) {
689
+ /** @type {?} */
690
+ var url = "/api/runtime/dfs/v1.0/formdoc/multi/complete";
691
+ return this.httpclient.post(url, request).pipe(tap((/**
692
+ * @param {?} res
693
+ * @return {?}
694
+ */
695
+ function (res) { })), catchError((/**
696
+ * @param {?} error
697
+ * @return {?}
698
+ */
699
+ function (error) {
700
+ return of(error);
701
+ })));
702
+ };
591
703
  /**
592
704
  * @return {?}
593
705
  */
@@ -601,8 +713,6 @@ var FileUploadComponent = /** @class */ (function () {
601
713
  * @return {?}
602
714
  */
603
715
  function (element) {
604
- // let obj: any = document.getElementById(element.name);
605
- // obj.checked = true;
606
716
  element.selectd = true;
607
717
  }));
608
718
  this.fileAllSelected = true;
@@ -614,8 +724,6 @@ var FileUploadComponent = /** @class */ (function () {
614
724
  * @return {?}
615
725
  */
616
726
  function (element) {
617
- // let obj: any = document.getElementById(element.name);
618
- // obj.checked = false;
619
727
  element.selectd = false;
620
728
  }));
621
729
  this.fileAllSelected = false;
@@ -709,9 +817,6 @@ var FileUploadComponent = /** @class */ (function () {
709
817
  metadataList.push(element.id);
710
818
  _this.files.splice(_this.files.indexOf(element), 1);
711
819
  if (element.uploadResult) {
712
- // let idList: string[] = [];
713
- // idList.push(fileInfo.id);
714
- // this.uploadService.cancel(idList, this.rootId).subscribe();
715
820
  _this.uploadFileInfoList.splice(_this.uploadFileInfoList.indexOf(_this.uploadFileInfoList.filter((/**
716
821
  * @param {?} x
717
822
  * @return {?}
@@ -826,20 +931,28 @@ var FileUploadComponent = /** @class */ (function () {
826
931
  }
827
932
  fileInfo.source = imgUrl;
828
933
  _this.files.push(fileInfo);
934
+ //因为异步处理的差异,补偿一次删除
935
+ /** @type {?} */
936
+ var index = -1;
937
+ _this.files.forEach((/**
938
+ * @param {?} x
939
+ * @return {?}
940
+ */
941
+ function (x) {
942
+ if (x.name == fileInfo.name) {
943
+ if (index == -1)
944
+ index = _this.files.indexOf(x);
945
+ }
946
+ }));
947
+ if (index != -1 && index != _this.files.length - 1) {
948
+ _this.files.splice(index, 1);
949
+ _this.uploadFileInfoList.splice(index, 1);
950
+ _this.uploadedFileInfoList.splice(index, 1);
951
+ }
829
952
  });
830
953
  }
831
954
  }
832
955
  };
833
- /**
834
- * @param {?} selectdFile
835
- * @return {?}
836
- */
837
- FileUploadComponent.prototype.getImageUrl = /**
838
- * @param {?} selectdFile
839
- * @return {?}
840
- */
841
- function (selectdFile) {
842
- };
843
956
  /**
844
957
  * @param {?} strList
845
958
  * @return {?}
@@ -935,9 +1048,6 @@ var FileUploadComponent = /** @class */ (function () {
935
1048
  * @return {?}
936
1049
  */
937
1050
  function (x) { return x.isUploading || x.uploadResult; })).length) {
938
- // this.notifyService.success(<NotifyOptions>{
939
- // msg: '保存成功!', timeout: 3000
940
- // });
941
1051
  this.msgService.warning(this.localepipe.transform('wait'));
942
1052
  return of(false);
943
1053
  }
@@ -1018,9 +1128,6 @@ var FileUploadComponent = /** @class */ (function () {
1018
1128
  */
1019
1129
  function (x) { return x.metadataId == file.id; })), 1);
1020
1130
  }
1021
- // var obj:any = document.querySelector('#file');
1022
- // obj.files.remove();
1023
- //obj.value='';
1024
1131
  };
1025
1132
  /**
1026
1133
  * @param {?} size
@@ -1090,8 +1197,8 @@ var FileUploadComponent = /** @class */ (function () {
1090
1197
  FileUploadComponent.decorators = [
1091
1198
  { type: Component, args: [{
1092
1199
  selector: 'app-file-upload',
1093
- 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>",
1094
- 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}"]
1200
+ 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 <farris-radio-group class=\"button_group_upload\" [(model)]=\"radioButtonGroupValue\" [horizontal]=\"false\">\n <farris-radio-button [label]=\"'showByGroup'\" (click)=\"showByGroup()\">\n <span class=\"f-icon f-icon-sudoku-new\"> </span>\n </farris-radio-button>\n <farris-radio-button [label]=\"'showByList'\" (click)=\"showByList()\">\n <span class=\"f-icon f-icon-page-title-define\"> </span>\n </farris-radio-button>\n\n </farris-radio-group>\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; border: none;\"\n (click)=\"listDeleteFile(file)\">\n <span style=\"position: relative; right: 2px; \" class=\"f-icon f-icon-delete\"> </span>\n </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>",
1201
+ 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:90px}.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}"]
1095
1202
  }] }
1096
1203
  ];
1097
1204
  /** @nocollapse */
@@ -1137,6 +1244,8 @@ if (false) {
1137
1244
  /** @type {?} */
1138
1245
  FileUploadComponent.prototype.selectedFiles;
1139
1246
  /** @type {?} */
1247
+ FileUploadComponent.prototype.radioButtonGroupValue;
1248
+ /** @type {?} */
1140
1249
  FileUploadComponent.prototype.selectedFileCount;
1141
1250
  /** @type {?} */
1142
1251
  FileUploadComponent.prototype.uploadIconAddress;
@@ -1173,7 +1282,7 @@ if (false) {
1173
1282
  /** @type {?} */
1174
1283
  FileUploadComponent.prototype.uploadedFileTotal;
1175
1284
  /** @type {?} */
1176
- FileUploadComponent.prototype.validationId;
1285
+ FileUploadComponent.prototype.allowedMultiUpload;
1177
1286
  /** @type {?} */
1178
1287
  FileUploadComponent.prototype.haveExtensionProperty;
1179
1288
  /** @type {?} */
@@ -1234,4 +1343,4 @@ if (false) {
1234
1343
  FileUploadComponent.prototype.injector;
1235
1344
  /* Skipping unhandled member: ;*/
1236
1345
  }
1237
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGdzcC1zdmMvZm9ybWRvYy11cGxvYWQvIiwic291cmNlcyI6WyJsaWIvdXBsb2FkL2ZpbGUtdXBsb2FkL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBWSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRWhILE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RELE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDcEUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVyQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUV2RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXpELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxP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O0lBRXBDLDRDQUEyQjs7SUFFM0IsZ0RBQThCOztJQUU5QiwyQ0FBcUI7O0lBRXJCLG9EQUF1Qzs7SUFFdkMsK0NBQWtDOztJQUVsQyxtREFBMEI7O0lBQzFCLGtEQUF5Qjs7SUFHekIsOENBQXVCOztJQUN2QiwwQ0FBd0I7O0lBQ3hCLHVDQUFpQjs7SUFDakIseUNBQTBCOztJQUMxQix5Q0FBdUI7O0lBQ3ZCLDBDQUE0Qjs7SUFTNUIscUNBQXdCOztJQUN4QixxQ0FBd0I7O0lBQ3hCLHVDQUFnQzs7SUFDaEMsd0NBQStCOztJQUMvQix3Q0FBa0M7O0lBQ2xDLDJDQUFxRDs7SUFJckQscUNBQThDOztJQStEOUMsd0NBQXNCOztJQTZmdEIsZ0RBQTRDOzs7OztJQTVrQmhDLHlDQUFtQzs7Ozs7SUFBRSw0Q0FBb0M7Ozs7O0lBQUUsMENBQW1DOzs7OztJQUFFLHVDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgVmlld0NoaWxkLCBUZW1wbGF0ZVJlZiwgT3B0aW9uYWwsIEluamVjdG9yLCBMT0NBTEVfSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZpbGVJbmZvIH0gZnJvbSAnLi4vZW50aXR5L2ZpbGVpbmZvJztcbmltcG9ydCB7IERvY1R5cGUgfSBmcm9tICcuLi9lbnRpdHkvZG9jdHlwZSc7XG5pbXBvcnQgeyBHc3BGb3JtRG9jSW5mbyB9IGZyb20gJy4uL2VudGl0eS9nc3Bmb3JtZG9jaW5mbyc7XG5pbXBvcnQgeyBPcGVyYXRpbmdNb2RlcyB9IGZyb20gJy4uL2VudGl0eS9vcGVyYXRpbmdtb2Rlcyc7XG5pbXBvcnQgeyBVcGxvYWRTZXJ2aWNlIH0gZnJvbSAnLi4vdXBsb2FkLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXBsb2FkRmlsZUluZm8gfSBmcm9tICcuLi9lbnRpdHkvdXBsb2FkZmlsZWluZm8nO1xuaW1wb3J0IHsgTWVzc2FnZXJTZXJ2aWNlIH0gZnJvbSAnQGZhcnJpcy91aS1tZXNzYWdlcic7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBHc3BGb3JtVXBsb2FkRW50aXR5IH0gZnJvbSAnLi4vZW50aXR5L2dzcGZvcm11cGxvYWRlbnRpdHknO1xuaW1wb3J0IHsgVVVJRCB9IGZyb20gJ2FuZ3VsYXIyLXV1aWQnO1xuaW1wb3J0IHsgU3RvcmFnZUV4dGVuc2lvbiB9IGZyb20gJy4uL2VudGl0eS9zdG9yYWdlZXh0ZW5zaW9uJztcbmltcG9ydCB7IEV4U3RvcmFnZUZpbGVJbmZvIH0gZnJvbSAnLi4vZW50aXR5L2V4dGVuc2lvbnN0b3JhZ2VmaWxlaW5mbyc7XG5pbXBvcnQgeyBEcm9wTGlzdEVudGl0eSB9IGZyb20gJy4uL2VudGl0eS9kcm9wbGlzdGVudGl0eSc7XG5pbXBvcnQgeyBMb2FkaW5nU2VydmljZSB9IGZyb20gJ0BmYXJyaXMvdWktbG9hZGluZyc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IGZpbGxQcm9wZXJ0aWVzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9zcmMvdXRpbC9wcm9wZXJ0eSc7XG5pbXBvcnQgeyBGaWxlU3RhdGUgfSBmcm9tICcuLi9lbnRpdHkvZmlsZXN0YXRlJztcbmltcG9ydCB7IExvY2FsTGFuZ1BpcGUgfSBmcm9tICcuLi8uLi9sb2NhbC5waXBlJztcbmltcG9ydCB7IEdzcERvY1NlY3VyaXR5QmFzZUluZm8gfSBmcm9tICcuLi9lbnRpdHkvZ3NwZG9jc2VjdXJpdHluYXNlaW5mbyc7XG5pbXBvcnQgeyBzdGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgU2VjdXJpdHlFbnRpdHkgfSBmcm9tICcuLi9lbnRpdHkvc2VjdXJpdHllbnRpdHknO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSAndXJsJztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZmlsZS11cGxvYWQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsZS11cGxvYWQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9maWxlLXVwbG9hZC5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEZpbGVVcGxvYWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIGZpbGVzOiBGaWxlSW5mb1tdID0gW107XG4gIG1ldGFkYXRhSWRMaXN0OiBzdHJpbmdbXSA9IFtdO1xuICB1cGxvYWRGaWxlSW5mb0xpc3Q6IFVwbG9hZEZpbGVJbmZvW10gPSBbXTtcbiAgZXJyRmlsZUxpc3Q6IHN0cmluZ1tdID0gW107XG4gIGVyclR5cGVMaXN0OiBzdHJpbmdbXSA9IFtdO1xuICBudWxsRmlsZUxpc3Q6IHN0cmluZ1tdID0gW107XG4gIGJleW9uZEZpbGVMaXN0OiBzdHJpbmdbXSA9IFtdO1xuICBzaG93VHlwZTogbnVtYmVyID0gMDtcbiAgbW91c2VPbjogYm9vbGVhbiA9IGZhbHNlO1xuICBidWZmZXJTaXplID0gMTAgKiAxMDI0ICogMTAyNDtcbiAgc2VsZWN0ZWRGaWxlczogYW55O1xuXG4gIHNlbGVjdGVkRmlsZUNvdW50OiBudW1iZXIgPSAwO1xuXG4gIHVwbG9hZEljb25BZGRyZXNzID0gJy9wbGF0Zm9ybS9ydW50aW1lL2Rmcy9pbWFnZXMvdXBsb2FkLnN2Zyc7XG4gIHVwbG9hZExpdHRsZUljb25BZGRyZXNzID0gJy9wbGF0Zm9ybS9ydW50aW1lL2Rmcy9pbWFnZXMvdXBsb2FkSWNvbi5zdmcnO1xuXG4gIGhhc1NlbGVjdGVkRmlsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGZpbGVBbGxTZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHVwbG9hZFByb2Nlc3MgPSB7IHdpZHRoOiAnMCUnIH07XG5cbiAgZmlsZVRvdGFsQ2h1bms6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgLy9maWxlVXBsb2FkU3RhdGU6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9ID0ge307XG4gIC8vZmxhZzogbnVtYmVyID0gMDtcbiAgcmVxdWVzdEFycmF5OiBBcnJheTxPYnNlcnZhYmxlPGFueT4+ID0gbmV3IEFycmF5O1xuXG4gIHJlcXVlc3RCb2R5QXJyYXk6IEFycmF5PEdzcEZvcm1VcGxvYWRFbnRpdHk+ID0gbmV3IEFycmF5O1xuXG4gIHVwbG9hZGVkQ2h1bms6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgdXBsb2FkZWRQcm9jZXNzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG5cbiAgLy9hbGxTZWxlY3RlZDogYm9vbGVhbiA9IHRydWU7XG4gIHN0b3JhZ2VFeHRlbnNpb246IFN0b3JhZ2VFeHRlbnNpb247XG5cbiAgZGVmYXVsdFByb3BlcnR5TmFtZTogc3RyaW5nID0gXCJcIjtcbiAgcHJvcGVydGllc05hbWVzOiBEcm9wTGlzdEVudGl0eVtdID0gW107XG5cbiAgc2VjdXJpdHlJbmZvTGlzdDogU2VjdXJpdHlFbnRpdHlbXSA9IFtdO1xuXG4gIHF1ZXVlTGlzdFN0eWxlID0geyB3aWR0aDogJzQ4MHB4JyB9O1xuXG4gIGRyb3BMaXN0VmFsdWU6IHN0cmluZyA9IFwiXCI7XG5cbiAgdXBsb2FkZWRGaWxlVG90YWw6IG51bWJlciA9IDA7XG5cbiAgdmFsaWRhdGlvbklkOiBzdHJpbmc7XG5cbiAgaGF2ZUV4dGVuc2lvblByb3BlcnR5OiBib29sZWFuID0gZmFsc2U7XG5cbiAgaGF2ZVNlY3VyaXR5SW5mbzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHVwbG9hZGVkRmlsZUluZm9MaXN0ID0gW107XG4gIG9sZFVwbG9hZGVkRmlsZUxpc3QgPSBbXTtcbiAgLy91cGxvYWRlZE5hbWVMaXN0ID0gW107XG5cbiAgc2FtZU5hbWVBbGxvd2VkID0gdHJ1ZTtcbiAgbWF4RmlsZVNpemU6IG51bWJlciA9IDA7O1xuICBsb2NhbGVpZDogc3RyaW5nO1xuICBsb2NhbGVwaXBlOiBMb2NhbExhbmdQaXBlO1xuICBodHRwY2xpZW50OiBIdHRwQ2xpZW50O1xuICBjaGVja2JveFBvcyA9IHsgdG9wOiAnMHB4JyB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtc2dTZXJ2aWNlOiBNZXNzYWdlclNlcnZpY2UsIHByaXZhdGUgdXBsb2FkU2VydmljZTogVXBsb2FkU2VydmljZSwgcHJpdmF0ZSBsb2FkU2VydmljZTogTG9hZGluZ1NlcnZpY2UsIHByaXZhdGUgaW5qZWN0b3I/OiBJbmplY3Rvcikge1xuICAgIGlmICh0aGlzLmluamVjdG9yKSB7XG4gICAgICB0aGlzLmh0dHBjbGllbnQgPSB0aGlzLmluamVjdG9yLmdldChIdHRwQ2xpZW50KTtcbiAgICAgIHRoaXMubG9jYWxlaWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImxhbmd1YWdlQ29kZVwiKSB8fCB0aGlzLmluamVjdG9yLmdldChMT0NBTEVfSUQpO1xuICAgICAgdGhpcy5sb2NhbGVwaXBlID0gbmV3IExvY2FsTGFuZ1BpcGUodGhpcy5sb2NhbGVpZCk7XG4gICAgfVxuICB9XG4gIEBJbnB1dCgpIGZvcm1JZDogc3RyaW5nO1xuICBASW5wdXQoKSByb290SWQ6IHN0cmluZztcbiAgQElucHV0KCkgZmlsZVR5cGU6IHN0cmluZyA9IFwiKlwiO1xuICBASW5wdXQoKSBmaWxlQ291bnQ6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIG9sZElkTGlzdDogc3RyaW5nW10gPSBbXTtcbiAgQElucHV0KCkgc2VjdXJpdHlJbmZvOiBHc3BEb2NTZWN1cml0eUJhc2VJbmZvID0gbnVsbDtcblxuICAvL0BPdXRwdXQoKSBvbkN1c3RvbUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAVmlld0NoaWxkKCdvcENlbGwnKSBvcENlbGw6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRmlyZWZveCcpID49IDApXG4gICAgICB0aGlzLmNoZWNrYm94UG9zLnRvcCA9ICcxNHB4JztcbiAgICAvL2lmICh0aGlzLnN0b3JhZ2VTZXJ2aWNlICE9IG51bGwpIHtcbiAgICBpZiAodGhpcy5zZWN1cml0eUluZm8gIT0gbnVsbCkge1xuICAgICAgdGhpcy51cGxvYWRTZXJ2aWNlLmdldFNlY3VyaXR5SW5mb0xpc3QodGhpcy5zZWN1cml0eUluZm8pLnN1YnNjcmliZShcbiAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICB0aGlzLmhhdmVTZWN1cml0eUluZm8gPSB0cnVlO1xuICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICByZXMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2VjdXJpdHlJbmZvTGlzdC5wdXNoKHsgaWQ6IGkudG9TdHJpbmcoKSwgc2VjdXJpdHlJZDogZWxlbWVudC5zZWN1cml0eUlkLCBzZWN1cml0eUxldmVsOiBlbGVtZW50LnNlY3VyaXR5TGV2ZWwsIG5hbWU6IGVsZW1lbnQubmFtZSB9KTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cbiAgICB0aGlzLnVwbG9hZFNlcnZpY2UuZ2V0U3RvcmFnZUV4dGVuc2lvbkluZm8oKS5zdWJzY3JpYmUoXG4gICAgICByZXMgPT4ge1xuICAgICAgICBpZiAocmVzICE9IG51bGwgJiYgcmVzLmVycm9yID09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLnN0b3JhZ2VFeHRlbnNpb24gPSByZXM7XG4gICAgICAgICAgdGhpcy5kZWZhdWx0UHJvcGVydHlOYW1lID0gdGhpcy5zdG9yYWdlRXh0ZW5zaW9uLmRlZmF1bHRQcm9wZXJ0eU5hbWU7XG4gICAgICAgICAgdGhpcy5wcm9wZXJ0aWVzTmFtZXMucHVzaCh7IGlkOiBcIjBcIiwgbmFtZTogdGhpcy5zdG9yYWdlRXh0ZW5zaW9uLmRlZmF1bHRQcm9wZXJ0eU5hbWUgfSk7XG4gICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgIC8vIHRoaXMucHJvcGVydGllc05hbWVzLnB1c2goLi4uKHRoaXMuc3RvcmFnZUV4dGVuc2lvbi5leHRlbnNpb25Qcm9wZXJ0eU5hbWVMaXN0KSk7XG4gICAgICAgICAgdGhpcy5zdG9yYWdlRXh0ZW5zaW9uLmV4dGVuc2lvblByb3BlcnR5TmFtZUxpc3QuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIHRoaXMucHJvcGVydGllc05hbWVzLnB1c2goeyBpZDogKCsraSkudG9TdHJpbmcoKSwgbmFtZTogZWxlbWVudCB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnF1ZXVlTGlzdFN0eWxlLndpZHRoID0gJzM4MHB4JztcbiAgICAgICAgICB0aGlzLmhhdmVFeHRlbnNpb25Qcm9wZXJ0eSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApXG5cbiAgICB0aGlzLnVwbG9hZFNlcnZpY2UuZ2V0Um9vdFNldHRpbmcodGhpcy5yb290SWQpLnN1YnNjcmliZShcbiAgICAgIHJlcyA9PiB7XG4gICAgICAgIGlmIChyZXMgIT0gbnVsbCAmJiByZXMuZXJyb3IgPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuc2FtZU5hbWVBbGxvd2VkID0gcmVzLnNhbWVOYW1lQWxsb3dlZDtcbiAgICAgICAgICB0aGlzLnZhbGlkYXRpb25JZCA9IHJlcy52YWxpZGF0aW9uSWQ7XG4gICAgICAgICAgaWYgKCF0aGlzLnNhbWVOYW1lQWxsb3dlZCkge1xuICAgICAgICAgICAgdGhpcy51cGxvYWRTZXJ2aWNlLmdldFVwbG9hZGVkRmlsZUluZm9MaXN0KHRoaXMuZm9ybUlkLCB0aGlzLnJvb3RJZCkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICByZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gbnVsbCAmJiByZXMuZXJyb3IgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdCA9IHJlcztcbiAgICAgICAgICAgICAgICAgIHRoaXMub2xkVXBsb2FkZWRGaWxlTGlzdCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocmVzKSk7O1xuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnVwbG9hZFNlcnZpY2UuZ2V0VmFsaWRhdGlvbih0aGlzLnZhbGlkYXRpb25JZCkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5tYXhGaWxlU2l6ZSA9IHBhcnNlSW50KEpTT04ucGFyc2UocmVzLmNvbmZpZ3VyYXRpb24pLm1heEZpbGVTaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApXG4gICAgaWYgKHRoaXMub2xkSWRMaXN0ICE9IG51bGwgJiYgdGhpcy5vbGRJZExpc3QubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy51cGxvYWRTZXJ2aWNlLmNhbmNlbCh0aGlzLm9sZElkTGlzdCwgdGhpcy5yb290SWQpLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHRvdGFsTG9hZDogYW55ID0gbnVsbDtcblxuICBzaG93TG9hZGluZygpIHtcbiAgICB0aGlzLmhhc1NlbGVjdGVkRmlsZSA9IHRydWU7XG4gICAgLy8gaWYgKHRoaXMudG90YWxMb2FkID09IG51bGwpXG4gICAgLy8gICB0aGlzLnRvdGFsTG9hZCA9IHRoaXMubG9hZFNlcnZpY2Uuc2hvdyh7XG4gICAgLy8gICAgIG1lc3NhZ2U6IHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3VwbG9hZGluZycpXG4gICAgLy8gICB9KTtcbiAgfVxuXG5cbiAgZmlsZVNlbGVjdGVkKCRldmVudCkge1xuXG4gICAgLy8gY29uc3QgbG9hZGluZyA9IHRoaXMubG9hZFNlcnZpY2Uuc2hvdyh7XG4gICAgLy8gICBtZXNzYWdlOiB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCd1cGxvYWRpbmcnKVxuICAgIC8vIH0pO1xuXG4gICAgLy8gdGhpcy50b3RhbExvYWQuY2xvc2UoKTtcbiAgICAvLyB0aGlzLnRvdGFsTG9hZCA9IG51bGw7XG4gICAgdGhpcy5oYXNTZWxlY3RlZEZpbGUgPSB0cnVlO1xuICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNmaWxlJyk7XG5cbiAgICBpZiAodGhpcy5maWxlQ291bnQgPiAwKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEZpbGVzLmZpbGVzLmxlbmd0aCArIHRoaXMuZmlsZXMubGVuZ3RoID4gdGhpcy5maWxlQ291bnQpIHtcbiAgICAgICAgbGV0IHNlbGVjdGVkTnVtOiBudW1iZXIgPSAodGhpcy5zZWxlY3RlZEZpbGVzLmZpbGVzLmxlbmd0aCBhcyBudW1iZXIpICsgdGhpcy5maWxlcy5sZW5ndGg7XG4gICAgICAgIHRoaXMubXNnU2VydmljZS53YXJuaW5nKHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3NlbGVjdGVkQ291bnQnKSArIHNlbGVjdGVkTnVtICsgdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnbGltaXRDb3VudCcpICsgdGhpcy5maWxlQ291bnQgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZWNob29zZUZpbGUnKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL3RoaXMuZmxhZyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkRmlsZXMuZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBzZWxlY3RlZEZpbGUgPSB0aGlzLnNlbGVjdGVkRmlsZXMuZmlsZXNbaV07XG4gICAgICAvL3NlbGVjdGVkRmlsZS5zbGljZVxuICAgICAgbGV0IHV1aWQgPSBVVUlELlVVSUQoKTtcblxuICAgICAgaWYgKHNlbGVjdGVkRmlsZS5zaXplID09IDApIHtcbiAgICAgICAgdGhpcy5udWxsRmlsZUxpc3QucHVzaChzZWxlY3RlZEZpbGUubmFtZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tYXhGaWxlU2l6ZSAhPSBudWxsICYmIHRoaXMubWF4RmlsZVNpemUgPiAwKSB7XG4gICAgICAgIGlmIChzZWxlY3RlZEZpbGUuc2l6ZSA+IHRoaXMubWF4RmlsZVNpemUgKiAxMDAwKSB7XG4gICAgICAgICAgdGhpcy5iZXlvbmRGaWxlTGlzdC5wdXNoKHNlbGVjdGVkRmlsZS5uYW1lKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuc2FtZU5hbWVBbGxvd2VkKSB7XG4gICAgICAgIGlmICh0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LmZpbmQoeCA9PiB4LmZpbGVOYW1lID09IHNlbGVjdGVkRmlsZS5uYW1lKSAhPSBudWxsKSB7XG4gICAgICAgICAgLy8gdGhpcy51cGxvYWRlZE5hbWVMaXN0LnB1c2goc2VsZWN0ZWRGaWxlLm5hbWUpO1xuICAgICAgICAgIC8vIHRoaXMubXNnU2VydmljZS5xdWVzdGlvbign5LmL5YmN5bey5LiK5Lyg6L+H5ZCM5ZCN5paH5Lu2OiAnICsgc2VsZWN0ZWRGaWxlLm5hbWUgKyAn77yM6ZyA6KaB5pu/5o2i5LmI77yfJywgKCkgPT4ge1xuICAgICAgICAgIC8vICAgdXVpZCA9IHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuZmluZCh4ID0+IHguZmlsZU5hbWUgPT0gc2VsZWN0ZWRGaWxlLm5hbWUpLm1ldGFkYXRhSWQ7XG4gICAgICAgICAgLy8gICB0aGlzLnVwbG9hZEZpbGUodXVpZCwgc2VsZWN0ZWRGaWxlKTtcbiAgICAgICAgICAvLyB9KVxuICAgICAgICAgIGNvbnN0IG1zZyA9IHRoaXMubXNnU2VydmljZS5zaG93KCd3YXJuaW5nJywgdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnaGF2ZVNhbWVOYW1lJykgKyBzZWxlY3RlZEZpbGUubmFtZSwge1xuICAgICAgICAgICAgaW5pdGlhbFN0YXRlOiB7XG4gICAgICAgICAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZW5hbWUnKSxcbiAgICAgICAgICAgICAgICAgIGNsczogJ2J0biBidG4tc2Vjb25kYXJ5JyxcbiAgICAgICAgICAgICAgICAgIGhhbmRsZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb2xkTmFtZTogc3RyaW5nID0gc2VsZWN0ZWRGaWxlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdOYW1lXG4gICAgICAgICAgICAgICAgICAgIGxldCBmbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAxO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZmxhZykge1xuICAgICAgICAgICAgICAgICAgICAgIG5ld05hbWUgPSBvbGROYW1lLnN1YnN0cmluZygwLCBvbGROYW1lLmxhc3RJbmRleE9mKCcuJykpICsgJygnICsgaSArICcpJyArIG9sZE5hbWUuc3Vic3RyaW5nKG9sZE5hbWUubGFzdEluZGV4T2YoJy4nKSk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuZmluZCh4ID0+IHguZmlsZU5hbWUgPT0gbmV3TmFtZSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZEZpbGUodXVpZCwgc2VsZWN0ZWRGaWxlLCBuZXdOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgbXNnLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZXBsYWNlJyksXG4gICAgICAgICAgICAgICAgICBjbHM6ICdidG4gYnRuLXNlY29uZGFyeScsXG4gICAgICAgICAgICAgICAgICBoYW5kbGU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdXVpZCA9IHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuZmluZCh4ID0+IHguZmlsZU5hbWUgPT0gc2VsZWN0ZWRGaWxlLm5hbWUpLm1ldGFkYXRhSWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkRmlsZSh1dWlkLCBzZWxlY3RlZEZpbGUsIHNlbGVjdGVkRmlsZS5uYW1lLCBGaWxlU3RhdGUuVXBkYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVUb3RhbC0tO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5vbGRVcGxvYWRlZEZpbGVMaXN0LmZpbmQoeCA9PiB4LmZpbGVOYW1lID09IHNlbGVjdGVkRmlsZS5uYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlVG90YWwrKztcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LnNwbGljZSh0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LmluZGV4T2YodGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5maWx0ZXIoeCA9PiB4LmZpbGVOYW1lID09IHNlbGVjdGVkRmlsZS5uYW1lKVswXSksIDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1zZy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnY2FuY2VsJyksXG4gICAgICAgICAgICAgICAgICBjbHM6ICdidG4gYnRuLXNlY29uZGFyeScsXG4gICAgICAgICAgICAgICAgICBoYW5kbGU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbXNnLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy51cGxvYWRGaWxlKHV1aWQsIHNlbGVjdGVkRmlsZSwgc2VsZWN0ZWRGaWxlLm5hbWUpO1xuXG4gICAgfVxuICAgIC8vIGlmICh0aGlzLnVwbG9hZGVkTmFtZUxpc3QubGVuZ3RoID4gMCkge1xuICAgIC8vICAgbGV0IG5hbWU6IHN0cmluZyA9IHRoaXMubGlzdFRvU3RyaW5nKHRoaXMudXBsb2FkZWROYW1lTGlzdCk7XG4gICAgLy8gICB0aGlzLm1zZ1NlcnZpY2Uud2FybmluZygn5LmL5YmN5bey5LiK5Lyg6L+H5ZCM5ZCN5paH5Lu2OiAnICsgbmFtZSArICfor7fph43mlrDpgInmi6nkuIrkvKDmlofku7bjgIInKTtcbiAgICAvLyAgIHRoaXMudXBsb2FkZWROYW1lTGlzdCA9IFtdO1xuICAgIC8vIH1cblxuICAgIGlmICh0aGlzLmVyckZpbGVMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBuYW1lOiBzdHJpbmcgPSB0aGlzLmxpc3RUb1N0cmluZyh0aGlzLmVyckZpbGVMaXN0KTtcbiAgICAgIHRoaXMubXNnU2VydmljZS53YXJuaW5nKHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ2hhdmVTYW1lTmFtZScpICsgbmFtZSArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3JlY2hvb3NlRmlsZScpKTtcbiAgICAgIHRoaXMuZXJyRmlsZUxpc3QgPSBbXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5udWxsRmlsZUxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IG5hbWU6IHN0cmluZyA9IHRoaXMubGlzdFRvU3RyaW5nKHRoaXMubnVsbEZpbGVMaXN0KTtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCAtIDEpO1xuICAgICAgdGhpcy5tc2dTZXJ2aWNlLndhcm5pbmcobmFtZSArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3NpemVaZXJvJykgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZWNob29zZUZpbGUnKSk7XG4gICAgICB0aGlzLm51bGxGaWxlTGlzdCA9IFtdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJleW9uZEZpbGVMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBuYW1lOiBzdHJpbmcgPSB0aGlzLmxpc3RUb1N0cmluZyh0aGlzLmJleW9uZEZpbGVMaXN0KTtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCAtIDEpO1xuICAgICAgdGhpcy5tc2dTZXJ2aWNlLndhcm5pbmcobmFtZSArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3NpemVNYXgnKSArIHRoaXMubWF4RmlsZVNpemUgKyBcIktCXCIgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZWNob29zZUZpbGUnKSk7XG4gICAgICB0aGlzLmJleW9uZEZpbGVMaXN0ID0gW107XG4gICAgfVxuICAgIC8vIGlmICh0aGlzLmVyclR5cGVMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAvLyAgIGxldCB0eXBlOiBzdHJpbmcgPSB0aGlzLmxpc3RUb1N0cmluZyh0aGlzLmVyclR5cGVMaXN0KTtcbiAgICAvLyAgIHRoaXMubXNnU2VydmljZS53YXJuaW5nKCfkuI3mlK/mjIHkuIrkvKDnsbvlnovkuLogJyArIHR5cGUgKyAn55qE5paH5Lu26K+36YeN5paw6YCJ5oup5LiK5Lyg5paH5Lu244CCJyk7XG4gICAgLy8gICB0aGlzLmVyclR5cGVMaXN0ID0gW107XG4gICAgLy8gfVxuICAgIHRoaXMuZmlsZXMgPSB0aGlzLmZpbGVzLnNsaWNlKCk7XG4gICAgdGhpcy5maWxlQWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAkZXZlbnQudGFyZ2V0LnZhbHVlID0gJyc7XG4gICAgLy8gbG9hZGluZy5jbG9zZSgpO1xuICB9XG5cbiAgc2hvd0Vycm9yTWVzc2FnZShmaWxlKSB7XG4gICAgdGhpcy5tc2dTZXJ2aWNlLmVycm9yKHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3VwbG9hZEZhaWx1cmUnKSArIGZpbGUuZXJyb3JNZXNzYWdlKTtcbiAgfVxuXG4gIGhhbmRsZUZpbGVJbmZvKHV1aWQ6IHN0cmluZywgc2VsZWN0ZWRGaWxlLCBmaWxlTmFtZTogc3RyaW5nKTphbnl7XG5cbiAgICAgIGxldCBmaWxlSW5mbzogRmlsZUluZm87XG5cbiAgICAgIGZpbGVJbmZvID0ge1xuICAgICAgICBpZDogdXVpZCxcbiAgICAgICAgbmFtZTogZmlsZU5hbWUsXG4gICAgICAgIHR5cGU6IHNlbGVjdGVkRmlsZS50eXBlLFxuICAgICAgICBzb3VyY2U6IFwiXCIsXG4gICAgICAgIHNpemU6IHRoaXMuZ2V0RmlsZVNpemUoc2VsZWN0ZWRGaWxlLnNpemUpLFxuICAgICAgICBmaWxlU2l6ZTogc2VsZWN0ZWRGaWxlLnNpemUsXG4gICAgICAgIHBpY0xpc3REaXNwbGF5TmFtZTogdGhpcy5nZXRQaWNMaXN0RGlzcGxheU5hbWUoZmlsZU5hbWUpLFxuICAgICAgICBxdWV1ZUxpc3REaXNwbGF5TmFtZTogdGhpcy5nZXRRdWV1ZURpc3BsYXlOYW1lKGZpbGVOYW1lKSxcbiAgICAgICAgLy9jb250ZW50OiByZWFkZXIucmVzdWx0LnRvU3RyaW5nKCksXG4gICAgICAgIGhhc1VwbG9hZGVkOiBmYWxzZSxcbiAgICAgICAgbW91c2VPbjogZmFsc2UsXG4gICAgICAgIHNlbGVjdGQ6IGZhbHNlLFxuICAgICAgICBpc1VwbG9hZGluZzogdHJ1ZSxcbiAgICAgICAgdXBsb2FkUmVzdWx0OiBmYWxzZSxcbiAgICAgICAgdXBsb2FkUHJvY2VzczogMCxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBcIlwiLFxuICAgICAgICBleHRlbnNpb25Ecm9wTGlzdElkOiAwLFxuICAgICAgICBleHRlbnNpb25OYW1lOiBcIlwiLFxuICAgICAgICBzZWN1cml0eURyb3BMaXN0SWQ6IDAsXG4gICAgICAgIHNlY3VyaXR5SW5mbzogdGhpcy5zZWN1cml0eUluZm9MaXN0WzBdXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnN0b3JhZ2VFeHRlbnNpb24gIT0gbnVsbClcbiAgICAgICAgZmlsZUluZm8uZXh0ZW5zaW9uTmFtZSA9IHRoaXMuZGVmYXVsdFByb3BlcnR5TmFtZTtcblxuXG4gICAgICBsZXQgdHlwZTogc3RyaW5nID0gc2VsZWN0ZWRGaWxlLnR5cGU7XG4gICAgICBpZiAodHlwZS5pbmNsdWRlcyhcInRpZmZcIikpIHtcbiAgICAgICAgdGhpcy5hZGREb2NJbmZvKHNlbGVjdGVkRmlsZSwgZmlsZUluZm8sIERvY1R5cGUuT3RoZXIpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodHlwZS5pbmNsdWRlcyhcImltYWdlXCIpKSB7XG4gICAgICAgIHRoaXMuYWRkRG9jSW5mbyhzZWxlY3RlZEZpbGUsIGZpbGVJbmZvLCBEb2NUeXBlLkltYWdlKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHR5cGUuaW5jbHVkZXMoXCJ3b3JkXCIpKSB7XG4gICAgICAgIHRoaXMuYWRkRG9jSW5mbyhzZWxlY3RlZEZpbGUsIGZpbGVJbmZvLCBEb2NUeXBlLldvcmQpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodHlwZS5pbmNsdWRlcyhcInBkZlwiKSkge1xuICAgICAgICB0aGlzLmFkZERvY0luZm8oc2VsZWN0ZWRGaWxlLCBmaWxlSW5mbywgRG9jVHlwZS5QZGYpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodHlwZS5pbmNsdWRlcyhcInBsYWluXCIpKSB7XG4gICAgICAgIHRoaXMuYWRkRG9jSW5mbyhzZWxlY3RlZEZpbGUsIGZpbGVJbmZvLCBEb2NUeXBlLlR4dCk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmICh0eXBlLmluY2x1ZGVzKFwic2hlZXRcIikgfHwgdHlwZS5pbmNsdWRlcyhcImV4Y2VsXCIpKSB7XG4gICAgICAgIHRoaXMuYWRkRG9jSW5mbyhzZWxlY3RlZEZpbGUsIGZpbGVJbmZvLCBEb2NUeXBlLkV4Y2VsKVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAodHlwZS5pbmNsdWRlcyhcInBvd2VycG9pbnRcIikgfHwgdHlwZS5pbmNsdWRlcyhcInByZXNlbnRhdGlvblwiKSkge1xuICAgICAgICB0aGlzLmFkZERvY0luZm8oc2VsZWN0ZWRGaWxlLCBmaWxlSW5mbywgRG9jVHlwZS5Qb3dlcnBvaW50KTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLmFkZERvY0luZm8oc2VsZWN0ZWRGaWxlLCBmaWxlSW5mbywgRG9jVHlwZS5PdGhlcik7XG4gICAgICAgIC8vIGxldCBuYW1lOiBzdHJpbmcgPSBzZWxlY3RlZEZpbGUubmFtZTtcbiAgICAgICAgLy8gbGV0IGVyclR5cGUgPSBuYW1lLnN1YnN0cmluZyhzZWxlY3RlZEZpbGUubmFtZS5sYXN0SW5kZXhPZignLicpKTtcbiAgICAgICAgLy8gdGhpcy5lcnJUeXBlTGlzdC5wdXNoKGVyclR5cGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZpbGVJbmZvO1xuICB9XG5cbiAgdXBsb2FkRmlsZSh1dWlkOiBzdHJpbmcsIHNlbGVjdGVkRmlsZSwgZmlsZU5hbWU6IHN0cmluZywgc3RhdGU6IEZpbGVTdGF0ZSA9IEZpbGVTdGF0ZS5OZXcpIHtcbiAgICBcbiAgICAgIGxldCBmaWxlSW5mbyA9IHRoaXMuaGFuZGxlRmlsZUluZm8odXVpZCwgc2VsZWN0ZWRGaWxlLCBmaWxlTmFtZSk7XG4gICAgICBsZXQgY2h1bmtUb3RhbDogbnVtYmVyID0gTWF0aC5jZWlsKHNlbGVjdGVkRmlsZS5zaXplIC8gdGhpcy5idWZmZXJTaXplKTtcbiAgICAgIGxldCBjaHVua0luZGV4OiBudW1iZXIgPSAwO1xuXG4gICAgICB0aGlzLmZpbGVUb3RhbENodW5rW3V1aWRdID0gY2h1bmtUb3RhbDtcblxuICAgICAgbGV0IHVwbG9hZEZpbGVJbmZvID0gbmV3IFVwbG9hZEZpbGVJbmZvKCk7XG5cbiAgICAgIHVwbG9hZEZpbGVJbmZvLm1ldGFkYXRhSWQgPSB1dWlkO1xuICAgICAgdXBsb2FkRmlsZUluZm8uZmlsZU5hbWUgPSBmaWxlSW5mby5uYW1lO1xuICAgICAgdXBsb2FkRmlsZUluZm8uZmlsZVNpemUgPSBmaWxlSW5mby5zaXplO1xuICAgICAgdXBsb2FkRmlsZUluZm8uc3RhdGUgPSBzdGF0ZTtcbiAgICAgIHVwbG9hZEZpbGVJbmZvLnNlY3VyaXR5SW5mbyA9IHRoaXMuc2VjdXJpdHlJbmZvTGlzdFswXTtcblxuXG4gICAgICB3aGlsZSAoY2h1bmtJbmRleCA8IGNodW5rVG90YWwpIHtcbiAgICAgICAgbGV0IHVwbG9hZEluZm8gPSBuZXcgR3NwRm9ybVVwbG9hZEVudGl0eTtcbiAgICAgICAgdXBsb2FkSW5mby5mb3JtSWQgPSB0aGlzLmZvcm1JZDtcbiAgICAgICAgdXBsb2FkSW5mby5tb2RlID0gT3BlcmF0aW5nTW9kZXMuVGVtcDtcbiAgICAgICAgdXBsb2FkSW5mby5yb290SWQgPSB0aGlzLnJvb3RJZDtcblxuICAgICAgICBsZXQgZG9jSW5mbzogR3NwRm9ybURvY0luZm8gPSBuZXcgR3NwRm9ybURvY0luZm87XG5cbiAgICAgICAgZG9jSW5mby5maWxlTmFtZSA9IGZpbGVOYW1lO1xuICAgICAgICBkb2NJbmZvLm1ldGFkYXRhSWQgPSB1dWlkO1xuICAgICAgICBkb2NJbmZvLnRvdGFsID0gY2h1bmtUb3RhbDtcblxuICAgICAgICB0aGlzLnVwbG9hZGVkQ2h1bmtbZG9jSW5mby5tZXRhZGF0YUlkXSA9IDA7XG5cbiAgICAgICAgbGV0IG5leHRTaXplID0gTWF0aC5taW4oKGNodW5rSW5kZXggKyAxKSAqIHRoaXMuYnVmZmVyU2l6ZSwgc2VsZWN0ZWRGaWxlLnNpemUpO1xuICAgICAgICBsZXQgZmlsZURhdGEgPSBzZWxlY3RlZEZpbGUuc2xpY2UoY2h1bmtJbmRleCAqIHRoaXMuYnVmZmVyU2l6ZSwgbmV4dFNpemUpO1xuXG4gICAgICAgIC8vIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICAvLyByZWFkZXIucmVhZEFzQmluYXJ5U3RyaW5nKGZpbGVEYXRhKTtcbiAgICAgICAgbGV0IGlubmVySW5kZXggPSBjaHVua0luZGV4O1xuICAgICAgICAvLyByZWFkZXIub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAvLyAgIGRvY0luZm8uZmlsZUNvbnRlbnQgPSBidG9hKHJlYWRlci5yZXN1bHQudG9TdHJpbmcoKSk7XG4gICAgICAgIGRvY0luZm8uc2l6ZSA9IHNlbGVjdGVkRmlsZS5zaXplO1xuICAgICAgICBkb2NJbmZvLmluZGV4ID0gaW5uZXJJbmRleDtcbiAgICAgICAgZG9jSW5mby5maWxlQ29udGVudCA9IFwiXCJcbiAgICAgICAgLy9jaHVua0luZGV4Kys7XG4gICAgICAgIGlmICh0aGlzLmhhdmVFeHRlbnNpb25Qcm9wZXJ0eSlcbiAgICAgICAgICBkb2NJbmZvLmV4UHJvcGVydHlOYW1lID0gdGhpcy5kZWZhdWx0UHJvcGVydHlOYW1lO1xuXG4gICAgICAgIC8vZG9jSW5mby5pc0xhc3QgPSB0cnVlO1xuICAgICAgICB1cGxvYWRJbmZvLmRvY0luZm8gPSBkb2NJbmZvO1xuXG4gICAgICAgIC8vIGxldCBpbmZvID0gdXBsb2FkSW5mbztcblxuICAgICAgICAvLyB0aGlzLnJlcXVlc3RBcnJheS5wdXNoKHRoaXMudXBsb2FkU2VydmljZS51cGxvYWRGaWxlKHVwbG9hZEluZm8pKTtcbiAgICAgICAgLy8gdGhpcy5yZXF1ZXN0Qm9keUFycmF5LnB1c2goaW5mbyk7XG4gICAgICAgIC8v5bCB6KOF6K+35rGCZm9ybWRhdGFcbiAgICAgICAgbGV0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgndXBsb2FkSW5mbycsIEpTT04uc3RyaW5naWZ5KHVwbG9hZEluZm8pKTtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdkb2NJbmZvJywgSlNPTi5zdHJpbmdpZnkoZG9jSW5mbykpO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlRGF0YSk7XG5cbiAgICAgICAgdGhpcy5zZW5kVXBsb2FkUmVxdWVzdChmb3JtRGF0YSxmaWxlSW5mbyxkb2NJbmZvLHVwbG9hZEZpbGVJbmZvKTtcblxuICAgICAgICAvLyB9XG4gICAgICAgIC8vY29uc29sZS5sb2coY2h1bmtJbmRleCArIDEpO1xuICAgICAgICBjaHVua0luZGV4ID0gY2h1bmtJbmRleCArIDE7XG4gICAgICB9XG5cblxuICAgICAgbGV0IGluZGV4ID0gLTE7XG4gICAgICB0aGlzLmZpbGVzLmZvckVhY2goeCA9PiB7XG4gICAgICAgIGlmICh4Lm5hbWUgPT0gZmlsZUluZm8ubmFtZSkge1xuICAgICAgICAgIGlmIChpbmRleCA9PSAtMSlcbiAgICAgICAgICAgIGluZGV4ID0gdGhpcy5maWxlcy5pbmRleE9mKHgpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgaWYgKGluZGV4ICE9IC0xICYmIGluZGV4ICE9IHRoaXMuZmlsZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICB0aGlzLmZpbGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3Quc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVUb3RhbC0tO1xuICAgICAgfVxuICAgIFxuICB9XG5cbiAgc2VuZFVwbG9hZFJlcXVlc3QoZm9ybURhdGE6IGFueSwgZmlsZUluZm86IGFueSwgZG9jSW5mbzogYW55LCB1cGxvYWRGaWxlSW5mbzogYW55KSB7XG4gICAgdGhpcy51cGxvYWRTbGljZUZpbGUoZm9ybURhdGEpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgaWYgKHJlcyAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0udXBsb2FkUmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0uaXNVcGxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5maWxlc1t0aGlzLmZpbGVzLmluZGV4T2YoZmlsZUluZm8pXS5lcnJvck1lc3NhZ2UgPSByZXMuZXJyb3IuTWVzc2FnZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXBsb2FkZWRDaHVua1tkb2NJbmZvLm1ldGFkYXRhSWRdKys7XG4gICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0udXBsb2FkUHJvY2VzcyA9IE51bWJlci5wYXJzZUludCgodGhpcy51cGxvYWRlZENodW5rW2RvY0luZm8ubWV0YWRhdGFJZF0gLyB0aGlzLmZpbGVUb3RhbENodW5rW2RvY0luZm8ubWV0YWRhdGFJZF0gKiAxMDApLnRvRml4ZWQoMCkpO1xuICAgICAgICBpZiAodGhpcy51cGxvYWRlZENodW5rW2RvY0luZm8ubWV0YWRhdGFJZF0gPT0gdGhpcy5maWxlVG90YWxDaHVua1tkb2NJbmZvLm1ldGFkYXRhSWRdKSB7XG4gICAgICAgICAgdGhpcy5maWxlc1t0aGlzLmZpbGVzLmluZGV4T2YoZmlsZUluZm8pXS51cGxvYWRSZXN1bHQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0uaXNVcGxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdCA9IHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LmNvbmNhdCh1cGxvYWRGaWxlSW5mbyk7XG4gICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdCA9IHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuY29uY2F0KHVwbG9hZEZpbGVJbmZvKTtcbiAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZVRvdGFsKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHVwbG9hZFNsaWNlRmlsZShmb3JtZGF0YTogRm9ybURhdGEpOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgbGV0IHVybCA9IFwiL2FwaS9ydW50aW1lL2Rmcy92MS4wL2Zvcm1kb2Mvc2xpY2VcIjtcbiAgICAvL3VybCA9IFwiL2FwaS9ydW50aW1lL2Rmcy92MS4wL2Zvcm1kb2MvbGlzdFwiO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cGNsaWVudC5wb3N0KHVybCwgZm9ybWRhdGEpLnBpcGUoXG4gICAgICB0YXAocmVzID0+IHsgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICAgICAgcmV0dXJuIG9mKGVycm9yKTtcbiAgICAgIH0pKTtcbiAgfVxuXG4gIHNlbGVjdEFsbEZpbGUoKSB7XG5cbiAgICBpZiAoIXRoaXMuZmlsZUFsbFNlbGVjdGVkKSB7XG4gICAgICB0aGlzLmZpbGVzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIC8vIGxldCBvYmo6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQubmFtZSk7XG4gICAgICAgIC8vIG9iai5jaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgZWxlbWVudC5zZWxlY3RkID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5maWxlQWxsU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5zZWxlY3RlZEZpbGVDb3VudCA9IHRoaXMuZmlsZXMubGVuZ3RoO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmlsZXMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgLy8gbGV0IG9iajogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudC5uYW1lKTtcbiAgICAgICAgLy8gb2JqLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgZWxlbWVudC5zZWxlY3RkID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZmlsZUFsbFNlbGVjdGVkID0gZmFsc2U7XG4gICAgICB0aGlzLnNlbGVjdGVkRmlsZUNvdW50ID0gMDtcbiAgICB9XG4gIH1cblxuXG4gIGNoZWNrb3V0U2VsZWN0RmlsZShmaWxlOiBGaWxlSW5mbykge1xuICAgIC8vIGxldCBvYmo6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZpbGVOYW1lKTtcbiAgICBmaWxlLnNlbGVjdGQgPSAhZmlsZS5zZWxlY3RkO1xuICAgIGlmIChmaWxlLnNlbGVjdGQpXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsZUNvdW50Kys7XG4gICAgZWxzZVxuICAgICAgdGhpcy5zZWxlY3RlZEZpbGVDb3VudC0tO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRmlsZUNvdW50ID09IHRoaXMuZmlsZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmZpbGVBbGxTZWxlY3RlZCA9IHRydWU7XG4gICAgICAvL3RoaXMuaXNGaWxlQWxsU2VsZWN0ZWQoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmZpbGVBbGxTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgLy90aGlzLmlzRmlsZUFsbFNlbGVjdGVkKCk7XG4gICAgfVxuXG4gIH1cblxuICBsaXN0RGVsZXRlRmlsZShmaWxlSW5mbzogRmlsZUluZm8pIHtcbiAgICBpZiAoZmlsZUluZm8uc2VsZWN0ZClcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlQ291bnQtLTtcbiAgICAvL2NvbnNvbGUubG9nKGZpbGVOYW1lKTtcbiAgICB0aGlzLmZpbGVzLnNwbGljZSh0aGlzLmZpbGVzLmluZGV4T2YoZmlsZUluZm8pLCAxKTtcbiAgICBpZiAoZmlsZUluZm8udXBsb2FkUmVzdWx0KSB7XG4gICAgICBsZXQgaWRMaXN0OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgaWRMaXN0LnB1c2goZmlsZUluZm8uaWQpO1xuICAgICAgdGhpcy51cGxvYWRTZXJ2aWNlLmNhbmNlbChpZExpc3QsIHRoaXMucm9vdElkKS5zdWJzY3JpYmUoKTtcblxuICAgICAgdGhpcy51cGxvYWRGaWxlSW5mb0xpc3Quc3BsaWNlKHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LmluZGV4T2YodGhpcy51cGxvYWRGaWxlSW5mb0xpc3QuZmlsdGVyKHggPT4geC5maWxlTmFtZSA9PSBmaWxlSW5mby5uYW1lKVswXSksIDEpO1xuICAgICAgdGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5zcGxpY2UodGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5pbmRleE9mKHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuZmlsdGVyKHggPT4geC5maWxlTmFtZSA9PSBmaWxlSW5mby5uYW1lKVswXSksIDEpO1xuICAgICAgdGhpcy51cGxvYWRlZEZpbGVUb3RhbC0tO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RlZEZpbGVDb3VudCA9PSAwKVxuICAgICAgdGhpcy5maWxlQWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGxpc3RNdWx0aXBsZURlbGV0ZUZpbGUoKSB7XG4gICAgbGV0IHNlbGVjdGVkRmlsZTogRmlsZUluZm9bXSA9IFtdO1xuICAgIHRoaXMuZmlsZXMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGxldCBvYmo6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnQubmFtZSk7XG4gICAgICBpZiAob2JqLmNoZWNrZWQpXG4gICAgICAgIHNlbGVjdGVkRmlsZS5wdXNoKGVsZW1lbnQpO1xuICAgIH0pXG4gICAgbGV0IG1ldGFkYXRhTGlzdDogc3RyaW5nW10gPSBbXTtcbiAgICBzZWxlY3RlZEZpbGUuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIG1ldGFkYXRhTGlzdC5wdXNoKGVsZW1lbnQuaWQpO1xuICAgICAgdGhpcy5maWxlcy5zcGxpY2UodGhpcy5maWxlcy5pbmRleE9mKGVsZW1lbnQpLCAxKTtcbiAgICAgIGlmIChlbGVtZW50LnVwbG9hZFJlc3VsdCkge1xuICAgICAgICAvLyBsZXQgaWRMaXN0OiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAvLyBpZExpc3QucHVzaChmaWxlSW5mby5pZCk7XG4gICAgICAgIC8vIHRoaXMudXBsb2FkU2VydmljZS5jYW5jZWwoaWRMaXN0LCB0aGlzLnJvb3RJZCkuc3Vic2NyaWJlKCk7XG5cbiAgICAgICAgdGhpcy51cGxvYWRGaWxlSW5mb0xpc3Quc3BsaWNlKHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LmluZGV4T2YodGhpcy51cGxvYWRGaWxlSW5mb0xpc3QuZmlsdGVyKHggPT4geC5maWxlTmFtZSA9PSBlbGVtZW50Lm5hbWUpWzBdKSwgMSk7XG4gICAgICAgIHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3Quc3BsaWNlKHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuaW5kZXhPZih0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LmZpbHRlcih4ID0+IHguZmlsZU5hbWUgPT0gZWxlbWVudC5uYW1lKVswXSksIDEpO1xuICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZVRvdGFsLS07XG4gICAgICB9XG4gICAgfSlcbiAgICB0aGlzLnVwbG9hZFNlcnZpY2UuY2FuY2VsKG1ldGFkYXRhTGlzdCwgdGhpcy5yb290SWQpLnN1YnNjcmliZSgpO1xuXG4gICAgbGV0IGFsbEJveDogYW55ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhbGxDaGVja0JveFwiKTtcbiAgICBpZiAoYWxsQm94ICE9IG51bGwpXG4gICAgICBhbGxCb3guY2hlY2tlZCA9IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0ZWRGaWxlQ291bnQgPSAwO1xuICAgIHRoaXMuZmlsZUFsbFNlbGVjdGVkID0gZmFsc2U7XG4gIH1cblxuXG4gIGdldFBpY0xpc3REaXNwbGF5TmFtZShmaWxlTmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKGZpbGVOYW1lLmxlbmd0aCA8PSAxMClcbiAgICAgIHJldHVybiBmaWxlTmFtZTtcbiAgICBlbHNlIHtcbiAgICAgIGxldCBoZWFkQ29udGVudCA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCAyKTtcbiAgICAgIGxldCB0YWlsQ29udGVudCA9IGZpbGVOYW1lLnN1YnN0cmluZyhmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpIC0gMik7XG4gICAgICByZXR1cm4gaGVhZENvbnRlbnQgKyBcIuKAplwiICsgdGFpbENvbnRlbnQ7XG4gICAgfVxuICB9XG5cbiAgZ2V0UXVldWVEaXNwbGF5TmFtZShmaWxlTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGZpbGVOYW1lO1xuICB9XG5cbiAgYWRkRG9jSW5mbyhzZWxlY3RkRmlsZSwgZmlsZUluZm86IEZpbGVJbmZvLCBkb2NUeXBlOiBEb2NUeXBlKSB7XG5cbiAgICBzd2l0Y2ggKGRvY1R5cGUpIHtcbiAgICAgIGNhc2UgRG9jVHlwZS5Xb3JkOiB7XG4gICAgICAgIGZpbGVJbmZvLnNvdXJjZSA9IFwiL3BsYXRmb3JtL3J1bnRpbWUvZGZzL2ltYWdlcy93b3JkLnBuZ1wiXG4gICAgICAgIHRoaXMuZmlsZXMucHVzaChmaWxlSW5mbyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIERvY1R5cGUuUGRmOiB7XG4gICAgICAgIGZpbGVJbmZvLnNvdXJjZSA9IFwiL3BsYXRmb3JtL3J1bnRpbWUvZGZzL2ltYWdlcy9wZGYucG5nXCJcbiAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGVJbmZvKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgRG9jVHlwZS5FeGNlbDoge1xuICAgICAgICBmaWxlSW5mby5zb3VyY2UgPSBcIi9wbGF0Zm9ybS9ydW50aW1lL2Rmcy9pbWFnZXMvZXhjZWwucG5nXCI7XG4gICAgICAgIHRoaXMuZmlsZXMucHVzaChmaWxlSW5mbyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIERvY1R5cGUuVHh0OiB7XG4gICAgICAgIGZpbGVJbmZvLnNvdXJjZSA9IFwiL3BsYXRmb3JtL3J1bnRpbWUvZGZzL2ltYWdlcy90eHQucG5nXCI7XG4gICAgICAgIHRoaXMuZmlsZXMucHVzaChmaWxlSW5mbyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIERvY1R5cGUuUG93ZXJwb2ludDoge1xuICAgICAgICBmaWxlSW5mby5zb3VyY2UgPSBcIi9wbGF0Zm9ybS9ydW50aW1lL2Rmcy9pbWFnZXMvcHB0LnBuZ1wiO1xuICAgICAgICB0aGlzLmZpbGVzLnB1c2goZmlsZUluZm8pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBEb2NUeXBlLk90aGVyOiB7XG4gICAgICAgIGZpbGVJbmZvLnNvdXJjZSA9IFwiL3BsYXRmb3JtL3J1bnRpbWUvZGZzL2ltYWdlcy9maWxlLnBuZ1wiO1xuICAgICAgICB0aGlzLmZpbGVzLnB1c2goZmlsZUluZm8pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBEb2NUeXBlLkltYWdlOiB7XG4gICAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChzZWxlY3RkRmlsZSk7XG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoX2V2ZW50KSA9PiB7XG4gICAgICAgICAgbGV0IGltZ1VybCA9IHJlYWRlci5yZXN1bHQ7XG4gICAgICAgICAgaWYgKHRoaXMuaW5qZWN0b3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IHNhbml0aXplciA9IHRoaXMuaW5qZWN0b3IuZ2V0KERvbVNhbml0aXplcik7XG4gICAgICAgICAgICBpbWdVcmwgPSBzYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKGltZ1VybCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpbGVJbmZvLnNvdXJjZSA9IGltZ1VybDtcbiAgICAgICAgICB0aGlzLmZpbGVzLnB1c2goZmlsZUluZm8pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9XG5cblxuICB9XG5cbiAgZ2V0SW1hZ2VVcmwoc2VsZWN0ZEZpbGU6IGFueSkge1xuXG5cbiAgfVxuXG5cbiAgbGlzdFRvU3RyaW5nKHN0ckxpc3Q6IHN0cmluZ1tdKSB7XG4gICAgbGV0IG5hbWU6IHN0cmluZyA9IFwiXCI7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBuYW1lICs9IHN0ckxpc3RbaV0gKyBcIixcIjtcbiAgICB9XG4gICAgcmV0dXJuIG5hbWU7XG4gIH1cblxuICBzZWN1cml0eUNoYW5nZSgkZXZlbnQ6IGFueSwgZmlsZTogRmlsZUluZm8pIHtcbiAgICBmaWxlLnNlY3VyaXR5SW5mbyA9ICRldmVudC5kYXRhO1xuICAgIGxldCB1cGxvYWRGaWxlID0gdGhpcy51cGxvYWRGaWxlSW5mb0xpc3QuZmlsdGVyKHggPT4geC5tZXRhZGF0YUlkID0gZmlsZS5pZClbMF07XG4gICAgdXBsb2FkRmlsZS5zZWN1cml0eUluZm8gPSAkZXZlbnQuZGF0YTtcbiAgfVxuXG5cbiAgZXhTdG9yYWdlRmlsZUxpc3Q6IEV4U3RvcmFnZUZpbGVJbmZvW10gPSBbXTtcblxuICB0eXBlQ2hhbmdlKCRldmVudDogYW55LCBmaWxlOiBGaWxlSW5mbykge1xuICAgIGZpbGUuZXh0ZW5zaW9uTmFtZSA9ICRldmVudC5kYXRhLm5hbWU7XG4gICAgbGV0IGV4U3RvcmFnZUZpbGVJbmZvOiBFeFN0b3JhZ2VGaWxlSW5mbyA9IG5ldyBFeFN0b3JhZ2VGaWxlSW5mbztcbiAgICBpZiAoZmlsZS5leHRlbnNpb25OYW1lID09IHRoaXMuc3RvcmFnZUV4dGVuc2lvbi5kZWZhdWx0UHJvcGVydHlOYW1lKSB7XG4gICAgICBpZiAodGhpcy5leFN0b3JhZ2VGaWxlTGlzdC5maWx0ZXIoeCA9PiB4Lm1ldGFkYXRhSWQgPT0gZmlsZS5pZCkubGVuZ3RoID4gMClcbiAgICAgICAgdGhpcy5leFN0b3JhZ2VGaWxlTGlzdC5zcGxpY2UodGhpcy5leFN0b3JhZ2VGaWxlTGlzdC5maW5kSW5kZXgoeCA9PiB4Lm1ldGFkYXRhSWQgPT0gZmlsZS5pZCksIDEpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmV4U3RvcmFnZUZpbGVMaXN0LmZpbHRlcih4ID0+IHgubWV0YWRhdGFJZCA9PSBmaWxlLmlkKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGV4U3RvcmFnZUZpbGVJbmZvID0gdGhpcy5leFN0b3JhZ2VGaWxlTGlzdC5maWx0ZXIoeCA9PiB4Lm1ldGFkYXRhSWQgPT0gZmlsZS5pZClbMF07XG4gICAgICAgIGV4U3RvcmFnZUZpbGVJbmZvLmV4UHJvcGVydHlOYW1lID0gZmlsZS5leHRlbnNpb25OYW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhTdG9yYWdlRmlsZUluZm8ubWV0YWRhdGFJZCA9IGZpbGUuaWQ7XG4gICAgICAgIGV4U3RvcmFnZUZpbGVJbmZvLmV4UHJvcGVydHlOYW1lID0gZmlsZS5leHRlbnNpb25OYW1lO1xuICAgICAgICB0aGlzLmV4U3RvcmFnZUZpbGVMaXN0LnB1c2goZXhTdG9yYWdlRmlsZUluZm8pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwbG9hZCgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGlmICh0aGlzLnVwbG9hZGVkRmlsZVRvdGFsICE9IHRoaXMuZmlsZXMuZmlsdGVyKHggPT4geC5pc1VwbG9hZGluZyB8fCB4LnVwbG9hZFJlc3VsdCkubGVuZ3RoKSB7XG4gICAgICAvLyB0aGlzLm5vdGlmeVNlcnZpY2Uuc3VjY2Vzcyg8Tm90aWZ5T3B0aW9ucz57XG4gICAgICAvLyAgIG1zZzogJ+S/neWtmOaIkOWKn++8gScsIHRpbWVvdXQ6IDMwMDBcbiAgICAgIC8vIH0pO1xuICAgICAgdGhpcy5tc2dTZXJ2aWNlLndhcm5pbmcodGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnd2FpdCcpKTtcbiAgICAgIHJldHVybiBvZihmYWxzZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhdmVTZWN1cml0eUluZm8pIHtcbiAgICAgIHRoaXMudXBsb2FkU2VydmljZS5zYXZlU2VjdXJpdHlJbmZvKHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LCB0aGlzLnJvb3RJZCkuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0b3JhZ2VFeHRlbnNpb24gPT0gbnVsbClcbiAgICAgIHJldHVybiBvZih0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdCk7XG4gICAgZWxzZSB7XG4gICAgICBpZiAodGhpcy5leFN0b3JhZ2VGaWxlTGlzdC5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuIG9mKHRoaXMudXBsb2FkRmlsZUluZm9MaXN0KTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBsb2FkaW5nID0gdGhpcy5sb2FkU2VydmljZS5zaG93KHtcbiAgICAgICAgICBtZXNzYWdlOiB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdzYXZlVG8nKSArIHRoaXMuc3RvcmFnZUV4dGVuc2lvbi5leHRlbnNpb25OYW1lXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy51cGxvYWRTZXJ2aWNlLmNoYW5nZVN0b3JhZ2VJbnN0YW5jZSh0aGlzLmV4U3RvcmFnZUZpbGVMaXN0LCB0aGlzLnJvb3RJZCkucGlwZShcbiAgICAgICAgICBtYXAocmVzID0+IHtcbiAgICAgICAgICAgIC8vIGlmIChyZXMgIT0gbnVsbClcbiAgICAgICAgICAgIC8vICAgdGhpcy5tc2dTZXJ2aWNlLmVycm9yKCfkv53lrZjliLAnICsgdGhpcy5zdG9yYWdlRXh0ZW5zaW9uLmV4dGVuc2lvbk5hbWUgKyBcIuWksei0pe+8jOS4iuS8oOaWh+S7tuiHquWKqOS/neWtmOWIsFwiICsgdGhpcy5zdG9yYWdlRXh0ZW5zaW9uLmRlZmF1bHRQcm9wZXJ0eU5hbWUgKyBcIuWtmOWCqOOAglwiICsgcmVzLmVycm9yLk1lc3NhZ2UpO1xuICAgICAgICAgICAgbG9hZGluZy5jbG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBsb2FkRmlsZUluZm9MaXN0O1xuICAgICAgICAgIH0pKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNhbmNlbCgpIHtcbiAgICBpZiAodGhpcy51cGxvYWRGaWxlSW5mb0xpc3QubGVuZ3RoID09IDApXG4gICAgICByZXR1cm47XG4gICAgdGhpcy51cGxvYWRGaWxlSW5mb0xpc3QuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIHRoaXMubWV0YWRhdGFJZExpc3QucHVzaChlbGVtZW50Lm1ldGFkYXRhSWQpO1xuICAgIH0pXG4gICAgdGhpcy51cGxvYWRTZXJ2aWNlLmNhbmNlbCh0aGlzLm1ldGFkYXRhSWRMaXN0LCB0aGlzLnJvb3RJZCkuc3Vic2NyaWJlKCk7XG5cbiAgfVxuXG4gIGdldFVwbG9hZEZpbGVJbmZvTGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy51cGxvYWRGaWxlSW5mb0xpc3Q7XG4gIH1cblxuICBkZWxldGUoZmlsZSkge1xuICAgIHRoaXMuZmlsZXMuc3BsaWNlKHRoaXMuZmlsZXMuaW5kZXhPZihmaWxlKSwgMSk7XG4gICAgaWYgKGZpbGUudXBsb2FkUmVzdWx0KVxuICAgICAgdGhpcy51cGxvYWRlZEZpbGVUb3RhbC0tO1xuICAgIGlmICh0aGlzLmV4U3RvcmFnZUZpbGVMaXN0LmZpbHRlcih4ID0+IHgubWV0YWRhdGFJZCA9PSBmaWxlLmlkKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmV4U3RvcmFnZUZpbGVMaXN0LnNwbGljZSh0aGlzLmV4U3RvcmFnZUZpbGVMaXN0LmZpbmRJbmRleCh4ID0+IHgubWV0YWRhdGFJZCA9PSBmaWxlLmlkKSwgMSk7XG4gICAgfVxuICAgIC8vIHZhciBvYmo6YW55ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ZpbGUnKTtcbiAgICAvLyBvYmouZmlsZXMucmVtb3ZlKCk7XG4gICAgLy9vYmoudmFsdWU9Jyc7XG4gIH1cblxuICBnZXRGaWxlU2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICBpZiAoc2l6ZSA8IDEwMjQwMClcbiAgICAgIHJldHVybiAoc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMSkgKyBcIktcIjtcbiAgICBlbHNlIGlmIChzaXplIDwgMTAyNCAqIDEwMjQpXG4gICAgICByZXR1cm4gKHNpemUgLyAxMDI0KS50b0ZpeGVkKDApICsgXCJLXCI7XG4gICAgZWxzZSBpZiAoc2l6ZSA8IDEwMCAqIDEwMjQgKiAxMDI0KVxuICAgICAgcmV0dXJuIChzaXplIC8gMTAyNCAvIDEwMjQpLnRvRml4ZWQoMSkgKyBcIk1cIjtcbiAgICBlbHNlIGlmIChzaXplIDwgMTAyNCAqIDEwMjQgKiAxMDI0KVxuICAgICAgcmV0dXJuIChzaXplIC8gMTAyNCAvIDEwMjQpLnRvRml4ZWQoMCkgKyBcIk1cIjtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gKHNpemUgLyAxMDI0IC8gMTAyNCAvIDEwMjQpLnRvRml4ZWQoMSkgKyBcIkdcIjtcbiAgfVxuICBzaG93QnlHcm91cCgpIHtcbiAgICB0aGlzLnNob3dUeXBlID0gMDtcbiAgICAvLyB0aGlzLnNlbGVjdGVkRmlsZUNvdW50ID0gMDtcbiAgfVxuXG4gIHNob3dCeUxpc3QoKSB7XG4gICAgdGhpcy5zaG93VHlwZSA9IDE7XG4gICAgLy8gdGhpcy5zZWxlY3RlZEZpbGVDb3VudCA9IDA7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGaWxlQ291bnQgIT0gMCAmJiB0aGlzLnNlbGVjdGVkRmlsZUNvdW50ID09IHRoaXMuZmlsZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmZpbGVBbGxTZWxlY3RlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgbW91c2VPdmVyKGZpbGUpIHtcbiAgICBmaWxlLm1vdXNlT24gPSB0cnVlO1xuICB9XG4gIG1vdXNlT3V0KGZpbGUpIHtcbiAgICBmaWxlLm1vdXNlT24gPSBmYWxzZTtcbiAgfVxuXG59XG5cblxuIl19
1346
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGdzcC1zdmMvZm9ybWRvYy11cGxvYWQvIiwic291cmNlcyI6WyJsaWIvdXBsb2FkL2ZpbGUtdXBsb2FkL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXRHLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUU1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXJDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXZFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUUxRSxPQUFPLEVBQUUsVUFBVSxFQUFxQixNQUFNLHNCQUFzQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBSWxFO0lBc0VFLDZCQUFvQixVQUEyQixFQUFVLGFBQTRCLEVBQVUsV0FBMkIsRUFBVSxRQUFtQjtRQUFuSSxlQUFVLEdBQVYsVUFBVSxDQUFpQjtRQUFVLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQS9EdkosVUFBSyxHQUFlLEVBQUUsQ0FBQztRQUN2QixtQkFBYyxHQUFhLEVBQUUsQ0FBQztRQUM5Qix1QkFBa0IsR0FBcUIsRUFBRSxDQUFDO1FBQzFDLGdCQUFXLEdBQWEsRUFBRSxDQUFDO1FBQzNCLGdCQUFXLEdBQWEsRUFBRSxDQUFDO1FBQzNCLGlCQUFZLEdBQWEsRUFBRSxDQUFDO1FBQzVCLG1CQUFjLEdBQWEsRUFBRSxDQUFDO1FBQzlCLGFBQVEsR0FBVyxDQUFDLENBQUM7UUFDckIsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUN6QixlQUFVLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7UUFHN0Isc0JBQWlCLEdBQVcsQ0FBQyxDQUFDO1FBRTlCLHNCQUFpQixHQUFHLHlDQUF5QyxDQUFDO1FBQzlELDRCQUF1QixHQUFHLDZDQUE2QyxDQUFDO1FBRXhFLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBRWpDLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBRWpDLGtCQUFhLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFaEMsbUJBQWMsR0FBOEIsRUFBRSxDQUFDO1FBRS9DLGlCQUFZLEdBQTJCLElBQUksS0FBSyxDQUFDO1FBRWpELHFCQUFnQixHQUErQixJQUFJLEtBQUssQ0FBQztRQUV6RCxrQkFBYSxHQUE4QixFQUFFLENBQUM7UUFDOUMsb0JBQWUsR0FBOEIsRUFBRSxDQUFDO1FBS2hELHdCQUFtQixHQUFXLEVBQUUsQ0FBQztRQUNqQyxvQkFBZSxHQUFxQixFQUFFLENBQUM7UUFFdkMscUJBQWdCLEdBQXFCLEVBQUUsQ0FBQztRQUV4QyxtQkFBYyxHQUFHLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBRXBDLGtCQUFhLEdBQVcsRUFBRSxDQUFDO1FBRTNCLHNCQUFpQixHQUFXLENBQUMsQ0FBQztRQUk5QiwwQkFBcUIsR0FBWSxLQUFLLENBQUM7UUFFdkMscUJBQWdCLEdBQVksS0FBSyxDQUFDO1FBRWxDLHlCQUFvQixHQUFHLEVBQUUsQ0FBQztRQUMxQix3QkFBbUIsR0FBRyxFQUFFLENBQUM7O1FBR3pCLG9CQUFlLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLGdCQUFXLEdBQVcsQ0FBQyxDQUFDO1FBSXhCLGdCQUFXLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUE7UUFXbkIsYUFBUSxHQUFXLEdBQUcsQ0FBQztRQUN2QixjQUFTLEdBQVcsQ0FBQyxDQUFDO1FBQ3RCLGNBQVMsR0FBYSxFQUFFLENBQUM7UUFDekIsaUJBQVksR0FBMkIsSUFBSSxDQUFDO1FBZ0VyRCxjQUFTLEdBQVEsSUFBSSxDQUFDO1FBMmtCdEIsc0JBQWlCLEdBQXdCLEVBQUUsQ0FBQztRQXRwQjFDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2hELElBQUksQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyRixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNwRDtJQUNILENBQUM7SUFadUIsQ0FBQzs7OztJQXNCekIsc0NBQVE7OztJQUFSO1FBQUEsaUJBMERDO1FBekRDLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztZQUM3QyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUM7UUFDaEMsb0NBQW9DO1FBQ3BDLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLEVBQUU7WUFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsU0FBUzs7OztZQUNqRSxVQUFBLEdBQUc7Z0JBQ0QsS0FBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQzs7b0JBQ3pCLENBQUMsR0FBRyxDQUFDO2dCQUNULEdBQUcsQ0FBQyxPQUFPOzs7O2dCQUFDLFVBQUEsT0FBTztvQkFDakIsS0FBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsYUFBYSxFQUFFLE9BQU8sQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUMzSSxDQUFDLEVBQUUsQ0FBQztnQkFDTixDQUFDLEVBQUMsQ0FBQztZQUNMLENBQUMsRUFDRixDQUFBO1NBQ0Y7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLHVCQUF1QixFQUFFLENBQUMsU0FBUzs7OztRQUNwRCxVQUFBLEdBQUc7WUFDRCxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUU7Z0JBQ3BDLEtBQUksQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7Z0JBQzVCLEtBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFJLENBQUMsZ0JBQWdCLENBQUMsbUJBQW1CLENBQUM7Z0JBQ3JFLEtBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQzs7b0JBQ3BGLEdBQUMsR0FBRyxDQUFDO2dCQUNULG1GQUFtRjtnQkFDbkYsS0FBSSxDQUFDLGdCQUFnQixDQUFDLHlCQUF5QixDQUFDLE9BQU87Ozs7Z0JBQUMsVUFBQSxPQUFPO29CQUM3RCxLQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ3JFLENBQUMsRUFBQyxDQUFDO2dCQUNILEtBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztnQkFDcEMsS0FBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQzthQUNuQztRQUNILENBQUMsRUFDRixDQUFBO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVM7Ozs7UUFDckQsVUFBQSxHQUFHO1lBQ0QsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO2dCQUNwQyxLQUFJLENBQUMsZUFBZSxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUM7Z0JBQzNDLEtBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQy9FLEtBQUksQ0FBQyxrQkFBa0IsR0FBRyxHQUFHLENBQUMsa0JBQWtCLENBQUM7Z0JBQ2pELElBQUksQ0FBQyxLQUFJLENBQUMsZUFBZSxFQUFFO29CQUN6QixLQUFJLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLEtBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVM7Ozs7b0JBQzVFLFVBQUEsR0FBRzt3QkFDRCxJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUU7NEJBQ3BDLEtBQUksQ0FBQyxvQkFBb0IsR0FBRyxHQUFHLENBQUM7NEJBQ2hDLEtBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzs0QkFBQSxDQUFDO3lCQUU3RDtvQkFDSCxDQUFDLEVBQUMsQ0FBQTtpQkFDTDthQUVGO1FBQ0gsQ0FBQyxFQUNGLENBQUE7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN2RCxzRUFBc0U7U0FDdkU7UUFFRCxJQUFJLENBQUMscUJBQXFCLEdBQUMsYUFBYSxDQUFDO0lBQzNDLENBQUM7Ozs7SUFJRCx5Q0FBVzs7O0lBQVg7UUFDRSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM1Qiw4QkFBOEI7UUFDOUIsNkNBQTZDO1FBQzdDLHNEQUFzRDtRQUN0RCxRQUFRO0lBQ1YsQ0FBQzs7Ozs7SUFHRCwwQ0FBWTs7OztJQUFaLFVBQWEsTUFBTTtRQUFuQixpQkFnSEM7UUE5R0MsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXJELElBQUksSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUU7WUFDdEIsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRTs7b0JBQ3BFLFdBQVcsR0FBVyxDQUFDLG1CQUFBLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO2dCQUN6RixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO2dCQUN6TCxPQUFPO2FBQ1I7U0FDRjtnQ0FHUSxDQUFDOztnQkFDSixZQUFZLEdBQUcsT0FBSyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzs7O2dCQUUxQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRTtZQUV0QixJQUFJLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFO2dCQUMxQixPQUFLLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDOzthQUUzQztZQUVELElBQUksT0FBSyxXQUFXLElBQUksSUFBSSxJQUFJLE9BQUssV0FBVyxHQUFHLENBQUMsRUFBRTtnQkFDcEQsSUFBSSxZQUFZLENBQUMsSUFBSSxHQUFHLE9BQUssV0FBVyxHQUFHLElBQUksRUFBRTtvQkFDL0MsT0FBSyxjQUFjLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQzs7aUJBRTdDO2FBQ0Y7WUFFRCxJQUFJLENBQUMsT0FBSyxlQUFlLEVBQUU7Z0JBQ3pCLElBQUksT0FBSyxvQkFBb0IsQ0FBQyxJQUFJOzs7O2dCQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFFBQVEsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUEvQixDQUErQixFQUFDLElBQUksSUFBSSxFQUFFOzt3QkFFMUUsS0FBRyxHQUFHLE9BQUssVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBSyxVQUFVLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxJQUFJLEVBQUU7d0JBQ3pHLFlBQVksRUFBRTs0QkFDWixPQUFPLEVBQUU7Z0NBQ1A7b0NBQ0UsSUFBSSxFQUFFLE9BQUssVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUM7b0NBQ3pDLEdBQUcsRUFBRSxtQkFBbUI7b0NBQ3hCLE1BQU07OztvQ0FBRTs7NENBQ0YsT0FBTyxHQUFXLFlBQVksQ0FBQyxJQUFJOzs0Q0FDbkMsT0FBTzs7NENBQ1AsSUFBSSxHQUFHLElBQUk7OzRDQUNYLENBQUMsR0FBRyxDQUFDO3dDQUNULE9BQU8sSUFBSSxFQUFFOzRDQUNYLE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7NENBQ3ZILElBQUksS0FBSSxDQUFDLG9CQUFvQixDQUFDLElBQUk7Ozs7NENBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsUUFBUSxJQUFJLE9BQU8sRUFBckIsQ0FBcUIsRUFBQyxJQUFJLElBQUksRUFBRTtnREFDdEUsQ0FBQyxFQUFFLENBQUM7NkNBQ0w7O2dEQUVDLElBQUksR0FBRyxLQUFLLENBQUM7eUNBQ2hCO3dDQUVELEtBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQzt3Q0FDN0MsS0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO29DQUNkLENBQUMsQ0FBQTtpQ0FDRjtnQ0FDRDtvQ0FDRSxJQUFJLEVBQUUsT0FBSyxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQztvQ0FDMUMsR0FBRyxFQUFFLG1CQUFtQjtvQ0FDeEIsTUFBTTs7O29DQUFFO3dDQUNOLElBQUksR0FBRyxLQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSTs7Ozt3Q0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxRQUFRLElBQUksWUFBWSxDQUFDLElBQUksRUFBL0IsQ0FBK0IsRUFBQyxDQUFDLFVBQVUsQ0FBQzt3Q0FDdkYsS0FBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLFlBQVksQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dDQUN6RSxLQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzt3Q0FDekIsSUFBSSxLQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSTs7Ozt3Q0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxRQUFRLElBQUksWUFBWSxDQUFDLElBQUksRUFBL0IsQ0FBK0IsRUFBQyxFQUFFOzRDQUN2RSxLQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzs0Q0FDekIsS0FBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxLQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNOzs7OzRDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFFBQVEsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUEvQixDQUErQixFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzt5Q0FDbko7d0NBQ0QsS0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO29DQUNkLENBQUMsQ0FBQTtpQ0FDRjtnQ0FDRDtvQ0FDRSxJQUFJLEVBQUUsT0FBSyxVQUFVLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQztvQ0FDekMsR0FBRyxFQUFFLG1CQUFtQjtvQ0FDeEIsTUFBTTs7O29DQUFFO3dDQUNOLEtBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQ0FDZCxDQUFDLENBQUE7aUNBQ0Y7NkJBQ0Y7eUJBQ0Y7cUJBQ0YsQ0FBQzs7aUJBRUg7YUFDRjtZQUNELE9BQUssVUFBVSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDOzs7UUF4RXpELGdCQUFnQjtRQUNoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtvQkFBL0MsQ0FBQztTQXlFVDtRQUVELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOztnQkFDM0IsTUFBSSxHQUFXLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUN0RCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsR0FBRyxNQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztZQUN0SCxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztTQUN2QjtRQUVELElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOztnQkFDNUIsTUFBSSxHQUFXLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUN2RCxNQUFJLEdBQUcsTUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsTUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztZQUNsSCxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztTQUN4QjtRQUVELElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOztnQkFDOUIsTUFBSSxHQUFXLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUN6RCxNQUFJLEdBQUcsTUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsTUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztZQUMzSSxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztTQUMxQjtRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDekIsbUJBQW1CO0lBQ3JCLENBQUM7Ozs7O0lBRUQsOENBQWdCOzs7O0lBQWhCLFVBQWlCLElBQUk7UUFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3hGLENBQUM7Ozs7Ozs7SUFFRCw0Q0FBYzs7Ozs7O0lBQWQsVUFBZSxJQUFZLEVBQUUsWUFBWSxFQUFFLFFBQWdCOztZQUVyRCxRQUFrQjtRQUV0QixRQUFRLEdBQUc7WUFDVCxFQUFFLEVBQUUsSUFBSTtZQUNSLElBQUksRUFBRSxRQUFRO1lBQ2QsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJO1lBQ3ZCLE1BQU0sRUFBRSxFQUFFO1lBQ1YsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztZQUN6QyxRQUFRLEVBQUUsWUFBWSxDQUFDLElBQUk7WUFDM0Isa0JBQWtCLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQztZQUN4RCxvQkFBb0IsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDOztZQUV4RCxXQUFXLEVBQUUsS0FBSztZQUNsQixPQUFPLEVBQUUsS0FBSztZQUNkLE9BQU8sRUFBRSxLQUFLO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsYUFBYSxFQUFFLENBQUM7WUFDaEIsWUFBWSxFQUFFLEVBQUU7WUFDaEIsbUJBQW1CLEVBQUUsQ0FBQztZQUN0QixhQUFhLEVBQUUsRUFBRTtZQUNqQixrQkFBa0IsRUFBRSxDQUFDO1lBQ3JCLFlBQVksRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDLENBQUE7UUFFRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJO1lBQy9CLFFBQVEsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDOztZQUdoRCxJQUFJLEdBQVcsWUFBWSxDQUFDLElBQUk7UUFDcEMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3pCLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDeEQ7YUFDSSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDL0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN4RDthQUNJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM5QixJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3ZEO2FBQ0ksSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDdEQ7YUFDSSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDL0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN0RDthQUNJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3pELElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7U0FDdkQ7YUFDSSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUNyRSxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQzdEO2FBQ0k7WUFDSCxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZELHdDQUF3QztZQUN4QyxvRUFBb0U7WUFDcEUsa0NBQWtDO1NBQ25DO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQzs7Ozs7Ozs7SUFFRCx3Q0FBVTs7Ozs7OztJQUFWLFVBQVcsSUFBWSxFQUFFLFlBQVksRUFBRSxRQUFnQixFQUFFLEtBQWdDO1FBQXpGLGlCQXVKQztRQXZKd0Qsc0JBQUEsRUFBQSxRQUFtQixTQUFTLENBQUMsR0FBRzs7WUFFbkYsUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUM7O1lBRTVELGNBQWMsR0FBRyxJQUFJLGNBQWMsRUFBRTtRQUV6QyxjQUFjLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUNqQyxjQUFjLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFDeEMsY0FBYyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQzVDLGNBQWMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQzdCLGNBQWMsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBR3ZELFlBQVk7UUFDWixJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTs7O2dCQUd2QixXQUFXLEdBQTJCLElBQUksc0JBQXNCO1lBRXBFLFdBQVcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUMvQixXQUFXLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUM5QixXQUFXLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDakMsV0FBVyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO1lBQ3JDLFdBQVcsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1lBRWhDLE9BQU87WUFDUCxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFNBQVM7Ozs7WUFBQyxVQUFBLEdBQUc7Z0JBQzdDLElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxJQUFJLEVBQUU7b0JBQ3JCLEtBQUksQ0FBQyxLQUFLLENBQUMsS0FBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO29CQUM5RCxLQUFJLENBQUMsS0FBSyxDQUFDLEtBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztvQkFDN0QsS0FBSSxDQUFDLEtBQUssQ0FBQyxLQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztpQkFDM0U7cUJBQU07O3dCQUNELFVBQVEsR0FBRyxHQUFHLENBQUMsUUFBUTs7d0JBQ3ZCLFVBQVUsR0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEdBQUcsS0FBSSxDQUFDLFVBQVUsQ0FBQzs7d0JBQ25FLFVBQVUsR0FBVyxDQUFDOzt3QkFFdEIsaUJBQWUsR0FBd0IsRUFBRTtvQkFFN0MsS0FBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUM7b0JBQ3ZDLEtBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUU3QixPQUFPLFVBQVUsR0FBRyxVQUFVLEVBQUU7OzRCQUUxQixRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFJLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxJQUFJLENBQUM7OzRCQUMxRSxRQUFRLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsS0FBSSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUM7OzRCQUVyRSxZQUFZLEdBQUcsSUFBSSxrQkFBa0I7d0JBQ3pDLFlBQVksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO3dCQUMvQixZQUFZLENBQUMsTUFBTSxHQUFHLEtBQUksQ0FBQyxNQUFNLENBQUM7d0JBQ2xDLFlBQVksQ0FBQyxRQUFRLEdBQUcsVUFBUSxDQUFDO3dCQUNqQyxZQUFZLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQzt3QkFDaEMsWUFBWSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUM7d0JBQ2hDLFlBQVksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQzs7NEJBRTlCLFFBQVEsR0FBRyxJQUFJLFFBQVEsRUFBRTt3QkFDN0IsUUFBUSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO3dCQUM5RCxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQzt3QkFFbEMsS0FBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTOzs7O3dCQUFDLFVBQUEsR0FBRzs0QkFDdEMsSUFBSSxHQUFHLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRTtnQ0FDckIsS0FBSSxDQUFDLEtBQUssQ0FBQyxLQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7Z0NBQzlELEtBQUksQ0FBQyxLQUFLLENBQUMsS0FBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO2dDQUM3RCxLQUFJLENBQUMsS0FBSyxDQUFDLEtBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDOzZCQUMzRTtpQ0FBTTtnQ0FDTCxpQkFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7Z0NBQ2pDLEtBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQ0FDM0IsS0FBSSxDQUFDLEtBQUssQ0FBQyxLQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUNsSixJQUFJLEtBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQ0FDekQsSUFBSSxpQkFBZSxDQUFDLE1BQU0sSUFBSSxLQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFO3dDQUN2RCxLQUFJLENBQUMsS0FBSyxDQUFDLEtBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQzt3Q0FDN0QsS0FBSSxDQUFDLEtBQUssQ0FBQyxLQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7d0NBQzdELEtBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO3dDQUN6RSxLQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQzt3Q0FDN0UsS0FBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7OzRDQUVyQiwwQkFBMEIsR0FBK0IsSUFBSSwwQkFBMEI7d0NBQzNGLDBCQUEwQixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7d0NBQzdDLDBCQUEwQixDQUFDLFFBQVEsR0FBRyxpQkFBZSxDQUFDO3dDQUN0RCwwQkFBMEIsQ0FBQyxNQUFNLEdBQUcsS0FBSSxDQUFDLE1BQU0sQ0FBQzt3Q0FDaEQsMEJBQTBCLENBQUMsUUFBUSxHQUFHLFVBQVEsQ0FBQzt3Q0FDL0MsMEJBQTBCLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7d0NBQ3BELElBQUksS0FBSSxDQUFDLHFCQUFxQjs0Q0FDNUIsMEJBQTBCLENBQUMsY0FBYyxHQUFHLEtBQUksQ0FBQyxtQkFBbUIsQ0FBQzt3Q0FDdkUsS0FBSSxDQUFDLG1CQUFtQixDQUFDLDBCQUEwQixDQUFDLENBQUMsU0FBUzs7Ozt3Q0FBQyxVQUFBLEdBQUc7d0NBRWxFLENBQUMsRUFBQyxDQUFBO3dDQUNGLFVBQVU7cUNBQ1g7eUNBQU07d0NBQ0wsS0FBSSxDQUFDLEtBQUssQ0FBQyxLQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7d0NBQzlELEtBQUksQ0FBQyxLQUFLLENBQUMsS0FBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO3dDQUM3RCxLQUFJLENBQUMsS0FBSyxDQUFDLEtBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLEtBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7cUNBQ3hHO2lDQUVGOzZCQUNGO3dCQUNILENBQUMsRUFBQyxDQUFBO3dCQUVGLFVBQVUsR0FBRyxVQUFVLEdBQUcsQ0FBQyxDQUFDO3FCQUM3QjtpQkFDRjtZQUVILENBQUMsRUFBQyxDQUFBO1NBRUg7YUFBTTs7Z0JBQ0QsTUFBTSxHQUFHLElBQUksbUJBQW1CO1lBQ3BDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUM1QixNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztZQUN6QixNQUFNLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUM7WUFDbEMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzVCLE1BQU0sQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQztZQUNoQyxNQUFNLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUMzQixJQUFJLElBQUksQ0FBQyxxQkFBcUI7Z0JBQzVCLE1BQU0sQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDOztnQkFFL0MsUUFBUSxHQUFHLElBQUksUUFBUSxFQUFFO1lBQzdCLFFBQVEsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN4RCxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQztZQUV0QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUzs7OztZQUFDLFVBQUEsR0FBRztnQkFDM0MsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO29CQUNmLEtBQUksQ0FBQyxLQUFLLENBQUMsS0FBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO29CQUM5RCxLQUFJLENBQUMsS0FBSyxDQUFDLEtBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztvQkFDN0QsS0FBSSxDQUFDLEtBQUssQ0FBQyxLQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztpQkFDM0U7cUJBQU07b0JBQ0wsS0FBSSxDQUFDLEtBQUssQ0FBQyxLQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7b0JBQzdELEtBQUksQ0FBQyxLQUFLLENBQUMsS0FBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO29CQUM3RCxLQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDekUsS0FBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7b0JBQzdFLEtBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO2lCQUUxQjtZQUNILENBQUMsRUFBQyxDQUFBO1NBRUg7O1lBSUcsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTzs7OztRQUFDLFVBQUEsQ0FBQztZQUNsQixJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksRUFBRTtnQkFDM0IsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO29CQUNiLEtBQUssR0FBRyxLQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNqQztRQUNILENBQUMsRUFBQyxDQUFBO1FBQ0YsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDekMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0MsMkJBQTJCO1NBQzVCO0lBRUgsQ0FBQzs7Ozs7SUFHRCw4Q0FBZ0I7Ozs7SUFBaEIsVUFBaUIsUUFBa0I7O1lBRTdCLEdBQUcsR0FBRyxzQ0FBc0M7UUFFaEQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUM3QyxHQUFHOzs7O1FBQUMsVUFBQSxHQUFHLElBQU0sQ0FBQyxFQUFDLEVBQ2YsVUFBVTs7OztRQUFDLFVBQUMsS0FBd0I7WUFDbEMsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkIsQ0FBQyxFQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7Ozs7O0lBRUQsNkNBQWU7Ozs7SUFBZixVQUFnQixRQUFrQjs7WUFFNUIsR0FBRyxHQUFHLHFDQUFxQztRQUUvQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQzdDLEdBQUc7Ozs7UUFBQyxVQUFBLEdBQUcsSUFBTSxDQUFDLEVBQUMsRUFDZixVQUFVOzs7O1FBQUMsVUFBQyxLQUF3QjtZQUNsQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQixDQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQzs7Ozs7SUFFRCw2Q0FBZTs7OztJQUFmLFVBQWdCLE9BQStCOztZQUV6QyxHQUFHLEdBQUcsMENBQTBDO1FBRXBELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FDNUMsR0FBRzs7OztRQUFDLFVBQUEsR0FBRyxJQUFNLENBQUMsRUFBQyxFQUNmLFVBQVU7Ozs7UUFBQyxVQUFDLEtBQXdCO1lBQ2xDLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25CLENBQUMsRUFBQyxDQUFDLENBQUM7SUFDUixDQUFDOzs7OztJQUVELHlDQUFXOzs7O0lBQVgsVUFBWSxRQUFrQjs7WUFFeEIsR0FBRyxHQUFHLDRDQUE0QztRQUV0RCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQzdDLEdBQUc7Ozs7UUFBQyxVQUFBLEdBQUcsSUFBTSxDQUFDLEVBQUMsRUFDZixVQUFVOzs7O1FBQUMsVUFBQyxLQUF3QjtZQUNsQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQixDQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQzs7Ozs7SUFFRCxpREFBbUI7Ozs7SUFBbkIsVUFBb0IsT0FBbUM7O1lBRWpELEdBQUcsR0FBRyw4Q0FBOEM7UUFFeEQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUM1QyxHQUFHOzs7O1FBQUMsVUFBQSxHQUFHLElBQU0sQ0FBQyxFQUFDLEVBQ2YsVUFBVTs7OztRQUFDLFVBQUMsS0FBd0I7WUFDbEMsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkIsQ0FBQyxFQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7Ozs7SUFJRCwyQ0FBYTs7O0lBQWI7UUFFRSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87Ozs7WUFBQyxVQUFBLE9BQU87Z0JBRXhCLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLENBQUMsRUFBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1NBRTVDO2FBQU07WUFDTCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87Ozs7WUFBQyxVQUFBLE9BQU87Z0JBRXhCLE9BQU8sQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQzFCLENBQUMsRUFBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7WUFDN0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQztTQUM1QjtJQUNILENBQUM7Ozs7O0lBR0QsZ0RBQWtCOzs7O0lBQWxCLFVBQW1CLElBQWM7UUFDL0Isb0RBQW9EO1FBQ3BELElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzdCLElBQUksSUFBSSxDQUFDLE9BQU87WUFDZCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzs7WUFFekIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDM0IsSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDL0MsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7WUFDNUIsMkJBQTJCO1NBQzVCO2FBQ0k7WUFDSCxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztZQUM3QiwyQkFBMkI7U0FDNUI7SUFFSCxDQUFDOzs7OztJQUVELDRDQUFjOzs7O0lBQWQsVUFBZSxRQUFrQjtRQUMvQixJQUFJLFFBQVEsQ0FBQyxPQUFPO1lBQ2xCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzNCLHdCQUF3QjtRQUN4QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNuRCxJQUFJLFFBQVEsQ0FBQyxZQUFZLEVBQUU7O2dCQUNyQixNQUFNLEdBQWEsRUFBRTtZQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBRTNELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTTs7OztZQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUEzQixDQUEyQixFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4SSxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU07Ozs7WUFBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLElBQUksRUFBM0IsQ0FBMkIsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDOUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7U0FDMUI7UUFDRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDO1lBQzdCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQ2pDLENBQUM7Ozs7SUFFRCxvREFBc0I7OztJQUF0QjtRQUFBLGlCQXlCQzs7WUF4QkssWUFBWSxHQUFlLEVBQUU7UUFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPOzs7O1FBQUMsVUFBQSxPQUFPOztnQkFDcEIsR0FBRyxHQUFRLFFBQVEsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztZQUNwRCxJQUFJLEdBQUcsQ0FBQyxPQUFPO2dCQUNiLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0IsQ0FBQyxFQUFDLENBQUE7O1lBQ0UsWUFBWSxHQUFhLEVBQUU7UUFDL0IsWUFBWSxDQUFDLE9BQU87Ozs7UUFBQyxVQUFBLE9BQU87WUFDMUIsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDOUIsS0FBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbEQsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFO2dCQUV4QixLQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEtBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsS0FBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU07Ozs7Z0JBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQTFCLENBQTBCLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN2SSxLQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsS0FBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU07Ozs7Z0JBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQTFCLENBQTBCLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM3SSxLQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzthQUMxQjtRQUNILENBQUMsRUFBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7WUFFN0QsTUFBTSxHQUFRLFFBQVEsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDO1FBQ3hELElBQUksTUFBTSxJQUFJLElBQUk7WUFDaEIsTUFBTSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUMvQixDQUFDOzs7OztJQUdELG1EQUFxQjs7OztJQUFyQixVQUFzQixRQUFnQjtRQUNwQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksRUFBRTtZQUN2QixPQUFPLFFBQVEsQ0FBQzthQUNiOztnQkFDQyxXQUFXLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDOztnQkFDdEMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkUsT0FBTyxXQUFXLEdBQUcsR0FBRyxHQUFHLFdBQVcsQ0FBQztTQUN4QztJQUNILENBQUM7Ozs7O0lBRUQsaURBQW1COzs7O0lBQW5CLFVBQW9CLFFBQWdCO1FBQ2xDLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Ozs7Ozs7SUFFRCx3Q0FBVTs7Ozs7O0lBQVYsVUFBVyxXQUFXLEVBQUUsUUFBa0IsRUFBRSxPQUFnQjtRQUE1RCxpQkFxRUM7UUFuRUMsUUFBUSxPQUFPLEVBQUU7WUFDZixLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDakIsUUFBUSxDQUFDLE1BQU0sR0FBRyx1Q0FBdUMsQ0FBQTtnQkFDekQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzFCLE1BQU07YUFDUDtZQUVELEtBQUssT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNoQixRQUFRLENBQUMsTUFBTSxHQUFHLHNDQUFzQyxDQUFBO2dCQUN4RCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDMUIsTUFBTTthQUNQO1lBRUQsS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2xCLFFBQVEsQ0FBQyxNQUFNLEdBQUcsd0NBQXdDLENBQUM7Z0JBQzNELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMxQixNQUFNO2FBQ1A7WUFFRCxLQUFLLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsUUFBUSxDQUFDLE1BQU0sR0FBRyxzQ0FBc0MsQ0FBQztnQkFDekQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzFCLE1BQU07YUFDUDtZQUVELEtBQUssT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN2QixRQUFRLENBQUMsTUFBTSxHQUFHLHNDQUFzQyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDMUIsTUFBTTthQUNQO1lBRUQsS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2xCLFFBQVEsQ0FBQyxNQUFNLEdBQUcsdUNBQXVDLENBQUM7Z0JBQzFELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMxQixNQUFNO2FBQ1A7WUFFRCxLQUFLLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQzs7b0JBQ2QsUUFBTSxHQUFHLElBQUksVUFBVSxFQUFFO2dCQUM3QixRQUFNLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNsQyxRQUFNLENBQUMsTUFBTTs7OztnQkFBRyxVQUFDLE1BQU07O3dCQUNqQixNQUFNLEdBQUcsUUFBTSxDQUFDLE1BQU07b0JBQzFCLElBQUksS0FBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUU7OzRCQUNyQixTQUFTLEdBQUcsS0FBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO3dCQUMvQyxNQUFNLEdBQUcsU0FBUyxDQUFDLDhCQUE4QixDQUFDLE1BQU0sQ0FBQyxDQUFDO3FCQUMzRDtvQkFDRCxRQUFRLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztvQkFDekIsS0FBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Ozt3QkFHdEIsS0FBSyxHQUFHLENBQUMsQ0FBQztvQkFDZCxLQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87Ozs7b0JBQUMsVUFBQSxDQUFDO3dCQUNsQixJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksRUFBRTs0QkFDM0IsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO2dDQUNiLEtBQUssR0FBRyxLQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDakM7b0JBQ0gsQ0FBQyxFQUFDLENBQUE7b0JBQ0YsSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLEtBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3QkFDakQsS0FBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO3dCQUM1QixLQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDekMsS0FBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7cUJBQzVDO2dCQUNILENBQUMsQ0FBQSxDQUFBO2FBQ0Y7U0FFRjtJQUVILENBQUM7Ozs7O0lBRUQsMENBQVk7Ozs7SUFBWixVQUFhLE9BQWlCOztZQUN4QixJQUFJLEdBQVcsRUFBRTtRQUNyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN2QyxJQUFJLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztTQUMxQjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzs7Ozs7O0lBRUQsNENBQWM7Ozs7O0lBQWQsVUFBZSxNQUFXLEVBQUUsSUFBYztRQUN4QyxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7O1lBQzVCLFVBQVUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTTs7OztRQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUF0QixDQUFzQixFQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9FLFVBQVUsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztJQUN4QyxDQUFDOzs7Ozs7SUFLRCx3Q0FBVTs7Ozs7SUFBVixVQUFXLE1BQVcsRUFBRSxJQUFjO1FBQ3BDLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7O1lBQ2xDLGlCQUFpQixHQUFzQixJQUFJLGlCQUFpQjtRQUNoRSxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixFQUFFO1lBQ25FLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU07Ozs7WUFBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLEVBQUUsRUFBdkIsQ0FBdUIsRUFBQyxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUN4RSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTOzs7O2dCQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsRUFBRSxFQUF2QixDQUF1QixFQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7U0FDbkc7YUFBTTtZQUNMLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU07Ozs7WUFBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLEVBQUUsRUFBdkIsQ0FBdUIsRUFBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzFFLGlCQUFpQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNOzs7O2dCQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsRUFBRSxFQUF2QixDQUF1QixFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ25GLGlCQUFpQixDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO2FBQ3ZEO2lCQUFNO2dCQUNMLGlCQUFpQixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxpQkFBaUIsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztnQkFDdEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2FBQ2hEO1NBQ0Y7SUFDSCxDQUFDOzs7O0lBRUQsb0NBQU07OztJQUFOO1FBQUEsaUJBMkJDO1FBMUJDLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTs7OztRQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsWUFBWSxFQUEvQixDQUErQixFQUFDLENBQUMsTUFBTSxFQUFFO1lBRTVGLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDM0QsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDbEI7UUFDRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN6QixJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDdkY7UUFDRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJO1lBQy9CLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2FBQ2hDO1lBQ0gsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxJQUFJLENBQUM7Z0JBQ3BDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2lCQUNoQzs7b0JBQ0csU0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO29CQUNwQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWE7aUJBQ25GLENBQUM7Z0JBQ0YsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUN2RixHQUFHOzs7O2dCQUFDLFVBQUEsR0FBRztvQkFDTCxtQkFBbUI7b0JBQ25CLGlLQUFpSztvQkFDakssU0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNoQixPQUFPLEtBQUksQ0FBQyxrQkFBa0IsQ0FBQztnQkFDakMsQ0FBQyxFQUFDLENBQUMsQ0FBQTthQUNOO1NBQ0Y7SUFDSCxDQUFDOzs7O0lBRUQsb0NBQU07OztJQUFOO1FBQUEsaUJBUUM7UUFQQyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLElBQUksQ0FBQztZQUNyQyxPQUFPO1FBQ1QsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU87Ozs7UUFBQyxVQUFBLE9BQU87WUFDckMsS0FBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLENBQUMsRUFBQyxDQUFBO1FBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7SUFFMUUsQ0FBQzs7OztJQUVELG1EQUFxQjs7O0lBQXJCO1FBQ0UsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDakMsQ0FBQzs7Ozs7SUFFRCxvQ0FBTTs7OztJQUFOLFVBQU8sSUFBSTtRQUNULElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQy9DLElBQUksSUFBSSxDQUFDLFlBQVk7WUFDbkIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDM0IsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTTs7OztRQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsRUFBRSxFQUF2QixDQUF1QixFQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMxRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTOzs7O1lBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxFQUFFLEVBQXZCLENBQXVCLEVBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNsRztJQUVILENBQUM7Ozs7O0lBRUQseUNBQVc7Ozs7SUFBWCxVQUFZLElBQVk7UUFDdEIsSUFBSSxJQUFJLEdBQUcsTUFBTTtZQUNmLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQzthQUNuQyxJQUFJLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSTtZQUN6QixPQUFPLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7YUFDbkMsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJO1lBQy9CLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7YUFDMUMsSUFBSSxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJO1lBQ2hDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7O1lBRTdDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3hELENBQUM7Ozs7SUFDRCx5Q0FBVzs7O0lBQVg7UUFDRSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNsQiw4QkFBOEI7SUFDaEMsQ0FBQzs7OztJQUVELHdDQUFVOzs7SUFBVjtRQUNFLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLDhCQUE4QjtRQUM5QixJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQzlFLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1NBQzdCO0lBQ0gsQ0FBQzs7Ozs7SUFFRCx1Q0FBUzs7OztJQUFULFVBQVUsSUFBSTtRQUNaLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLENBQUM7Ozs7O0lBQ0Qsc0NBQVE7Ozs7SUFBUixVQUFTLElBQUk7UUFDWCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN2QixDQUFDOztnQkFwMEJGLFNBQVMsU0FBQztvQkFDVCxRQUFRLEVBQUUsaUJBQWlCO29CQUMzQiw2aWZBQTJDOztpQkFFNUM7Ozs7Z0JBMUJRLGVBQWU7Z0JBRmYsYUFBYTtnQkFVYixjQUFjO2dCQWZvQyxRQUFROzs7eUJBMEdoRSxLQUFLO3lCQUNMLEtBQUs7MkJBQ0wsS0FBSzs0QkFDTCxLQUFLOzRCQUNMLEtBQUs7K0JBQ0wsS0FBSzt5QkFFTCxTQUFTLFNBQUMsUUFBUTs7SUFrdkJyQiwwQkFBQztDQUFBLEFBdDBCRCxJQXMwQkM7U0FqMEJZLG1CQUFtQjs7O0lBRTlCLG9DQUF1Qjs7SUFDdkIsNkNBQThCOztJQUM5QixpREFBMEM7O0lBQzFDLDBDQUEyQjs7SUFDM0IsMENBQTJCOztJQUMzQiwyQ0FBNEI7O0lBQzVCLDZDQUE4Qjs7SUFDOUIsdUNBQXFCOztJQUNyQixzQ0FBeUI7O0lBQ3pCLHlDQUE2Qjs7SUFDN0IsNENBQW1COztJQUNuQixvREFBc0I7O0lBQ3RCLGdEQUE4Qjs7SUFFOUIsZ0RBQThEOztJQUM5RCxzREFBd0U7O0lBRXhFLDhDQUFpQzs7SUFFakMsOENBQWlDOztJQUVqQyw0Q0FBZ0M7O0lBRWhDLDZDQUErQzs7SUFFL0MsMkNBQWlEOztJQUVqRCwrQ0FBeUQ7O0lBRXpELDRDQUE4Qzs7SUFDOUMsOENBQWdEOztJQUdoRCwrQ0FBbUM7O0lBRW5DLGtEQUFpQzs7SUFDakMsOENBQXVDOztJQUV2QywrQ0FBd0M7O0lBRXhDLDZDQUFvQzs7SUFFcEMsNENBQTJCOztJQUUzQixnREFBOEI7O0lBRTlCLGlEQUE0Qjs7SUFFNUIsb0RBQXVDOztJQUV2QywrQ0FBa0M7O0lBRWxDLG1EQUEwQjs7SUFDMUIsa0RBQXlCOztJQUd6Qiw4Q0FBdUI7O0lBQ3ZCLDBDQUF3Qjs7SUFDeEIsdUNBQWlCOztJQUNqQix5Q0FBMEI7O0lBQzFCLHlDQUF1Qjs7SUFDdkIsMENBQTRCOztJQVM1QixxQ0FBd0I7O0lBQ3hCLHFDQUF3Qjs7SUFDeEIsdUNBQWdDOztJQUNoQyx3Q0FBK0I7O0lBQy9CLHdDQUFrQzs7SUFDbEMsMkNBQXFEOztJQUVyRCxxQ0FBOEM7O0lBOEQ5Qyx3Q0FBc0I7O0lBMmtCdEIsZ0RBQTRDOzs7OztJQXZwQmhDLHlDQUFtQzs7Ozs7SUFBRSw0Q0FBb0M7Ozs7O0lBQUUsMENBQW1DOzs7OztJQUFFLHVDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgVmlld0NoaWxkLCBUZW1wbGF0ZVJlZiwgSW5qZWN0b3IsIExPQ0FMRV9JRCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmlsZUluZm8gfSBmcm9tICcuLi9lbnRpdHkvZmlsZWluZm8nO1xuaW1wb3J0IHsgRG9jVHlwZSB9IGZyb20gJy4uL2VudGl0eS9kb2N0eXBlJztcbmltcG9ydCB7IEdzcEZvcm1Eb2NJbmZvIH0gZnJvbSAnLi4vZW50aXR5L2dzcGZvcm1kb2NpbmZvJztcbmltcG9ydCB7IE9wZXJhdGluZ01vZGVzIH0gZnJvbSAnLi4vZW50aXR5L29wZXJhdGluZ21vZGVzJztcbmltcG9ydCB7IFVwbG9hZFNlcnZpY2UgfSBmcm9tICcuLi91cGxvYWQuc2VydmljZSc7XG5pbXBvcnQgeyBVcGxvYWRGaWxlSW5mbyB9IGZyb20gJy4uL2VudGl0eS91cGxvYWRmaWxlaW5mbyc7XG5pbXBvcnQgeyBNZXNzYWdlclNlcnZpY2UgfSBmcm9tICdAZmFycmlzL3VpLW1lc3NhZ2VyJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEdzcEZvcm1VcGxvYWRFbnRpdHkgfSBmcm9tICcuLi9lbnRpdHkvZ3NwZm9ybXVwbG9hZGVudGl0eSc7XG5pbXBvcnQgeyBVVUlEIH0gZnJvbSAnYW5ndWxhcjItdXVpZCc7XG5pbXBvcnQgeyBTdG9yYWdlRXh0ZW5zaW9uIH0gZnJvbSAnLi4vZW50aXR5L3N0b3JhZ2VleHRlbnNpb24nO1xuaW1wb3J0IHsgRXhTdG9yYWdlRmlsZUluZm8gfSBmcm9tICcuLi9lbnRpdHkvZXh0ZW5zaW9uc3RvcmFnZWZpbGVpbmZvJztcbmltcG9ydCB7IERyb3BMaXN0RW50aXR5IH0gZnJvbSAnLi4vZW50aXR5L2Ryb3BsaXN0ZW50aXR5JztcbmltcG9ydCB7IExvYWRpbmdTZXJ2aWNlIH0gZnJvbSAnQGZhcnJpcy91aS1sb2FkaW5nJztcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgRmlsZVN0YXRlIH0gZnJvbSAnLi4vZW50aXR5L2ZpbGVzdGF0ZSc7XG5pbXBvcnQgeyBMb2NhbExhbmdQaXBlIH0gZnJvbSAnLi4vLi4vbG9jYWwucGlwZSc7XG5pbXBvcnQgeyBHc3BEb2NTZWN1cml0eUJhc2VJbmZvIH0gZnJvbSAnLi4vZW50aXR5L2dzcGRvY3NlY3VyaXR5YmFzZWluZm8nO1xuaW1wb3J0IHsgU2VjdXJpdHlFbnRpdHkgfSBmcm9tICcuLi9lbnRpdHkvc2VjdXJpdHllbnRpdHknO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbml0TXVsdGlVcGxvYWRSZXF1ZXN0IH0gZnJvbSAnLi4vZW50aXR5L2luaXRtdWx0aXVwbG9hZHJlcXVlc3QnO1xuaW1wb3J0IHsgQ29tcGxldGVNdWx0aVVwbG9hZFJlcXVlc3QgfSBmcm9tICcuLi9lbnRpdHkvY29tcGxldGVtdWx0aXVwbG9hZHJlcXVlc3QnO1xuaW1wb3J0IHsgR3NwRm9ybVN0cmVhbUVudGl0eSB9IGZyb20gJy4uL2VudGl0eS9nc3Bmb3Jtc3RyZWFtZW50aXR5JztcbmltcG9ydCB7IE11bHRpVXBsb2FkUmVxdWVzdCB9IGZyb20gJy4uL2VudGl0eS9tdWx0aXVwbG9hZHJlcXVlc3QnO1xuaW1wb3J0IHsgTXVsdGlVcGxvYWRSZXN1bHQgfSBmcm9tICcuLi9lbnRpdHkvbXVsdGl1cGxvYWRyZXN1bHQnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1maWxlLXVwbG9hZCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9maWxlLXVwbG9hZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbGUtdXBsb2FkLmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgRmlsZVVwbG9hZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgZmlsZXM6IEZpbGVJbmZvW10gPSBbXTtcbiAgbWV0YWRhdGFJZExpc3Q6IHN0cmluZ1tdID0gW107XG4gIHVwbG9hZEZpbGVJbmZvTGlzdDogVXBsb2FkRmlsZUluZm9bXSA9IFtdO1xuICBlcnJGaWxlTGlzdDogc3RyaW5nW10gPSBbXTtcbiAgZXJyVHlwZUxpc3Q6IHN0cmluZ1tdID0gW107XG4gIG51bGxGaWxlTGlzdDogc3RyaW5nW10gPSBbXTtcbiAgYmV5b25kRmlsZUxpc3Q6IHN0cmluZ1tdID0gW107XG4gIHNob3dUeXBlOiBudW1iZXIgPSAwO1xuICBtb3VzZU9uOiBib29sZWFuID0gZmFsc2U7XG4gIGJ1ZmZlclNpemUgPSA1ICogMTAyNCAqIDEwMjQ7XG4gIHNlbGVjdGVkRmlsZXM6IGFueTtcbiAgcmFkaW9CdXR0b25Hcm91cFZhbHVlO1xuICBzZWxlY3RlZEZpbGVDb3VudDogbnVtYmVyID0gMDtcblxuICB1cGxvYWRJY29uQWRkcmVzcyA9ICcvcGxhdGZvcm0vcnVudGltZS9kZnMvaW1hZ2VzL3VwbG9hZC5zdmcnO1xuICB1cGxvYWRMaXR0bGVJY29uQWRkcmVzcyA9ICcvcGxhdGZvcm0vcnVudGltZS9kZnMvaW1hZ2VzL3VwbG9hZEljb24uc3ZnJztcblxuICBoYXNTZWxlY3RlZEZpbGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBmaWxlQWxsU2VsZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICB1cGxvYWRQcm9jZXNzID0geyB3aWR0aDogJzAlJyB9O1xuXG4gIGZpbGVUb3RhbENodW5rOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG5cbiAgcmVxdWVzdEFycmF5OiBBcnJheTxPYnNlcnZhYmxlPGFueT4+ID0gbmV3IEFycmF5O1xuXG4gIHJlcXVlc3RCb2R5QXJyYXk6IEFycmF5PEdzcEZvcm1VcGxvYWRFbnRpdHk+ID0gbmV3IEFycmF5O1xuXG4gIHVwbG9hZGVkQ2h1bms6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgdXBsb2FkZWRQcm9jZXNzOiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9ID0ge307XG5cbiAgLy9hbGxTZWxlY3RlZDogYm9vbGVhbiA9IHRydWU7XG4gIHN0b3JhZ2VFeHRlbnNpb246IFN0b3JhZ2VFeHRlbnNpb247XG5cbiAgZGVmYXVsdFByb3BlcnR5TmFtZTogc3RyaW5nID0gXCJcIjtcbiAgcHJvcGVydGllc05hbWVzOiBEcm9wTGlzdEVudGl0eVtdID0gW107XG5cbiAgc2VjdXJpdHlJbmZvTGlzdDogU2VjdXJpdHlFbnRpdHlbXSA9IFtdO1xuXG4gIHF1ZXVlTGlzdFN0eWxlID0geyB3aWR0aDogJzQ4MHB4JyB9O1xuXG4gIGRyb3BMaXN0VmFsdWU6IHN0cmluZyA9IFwiXCI7XG5cbiAgdXBsb2FkZWRGaWxlVG90YWw6IG51bWJlciA9IDA7XG5cbiAgYWxsb3dlZE11bHRpVXBsb2FkOiBib29sZWFuO1xuXG4gIGhhdmVFeHRlbnNpb25Qcm9wZXJ0eTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGhhdmVTZWN1cml0eUluZm86IGJvb2xlYW4gPSBmYWxzZTtcblxuICB1cGxvYWRlZEZpbGVJbmZvTGlzdCA9IFtdO1xuICBvbGRVcGxvYWRlZEZpbGVMaXN0ID0gW107XG4gIC8vdXBsb2FkZWROYW1lTGlzdCA9IFtdO1xuXG4gIHNhbWVOYW1lQWxsb3dlZCA9IHRydWU7XG4gIG1heEZpbGVTaXplOiBudW1iZXIgPSAwOztcbiAgbG9jYWxlaWQ6IHN0cmluZztcbiAgbG9jYWxlcGlwZTogTG9jYWxMYW5nUGlwZTtcbiAgaHR0cGNsaWVudDogSHR0cENsaWVudDtcbiAgY2hlY2tib3hQb3MgPSB7IHRvcDogJzBweCcgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbXNnU2VydmljZTogTWVzc2FnZXJTZXJ2aWNlLCBwcml2YXRlIHVwbG9hZFNlcnZpY2U6IFVwbG9hZFNlcnZpY2UsIHByaXZhdGUgbG9hZFNlcnZpY2U6IExvYWRpbmdTZXJ2aWNlLCBwcml2YXRlIGluamVjdG9yPzogSW5qZWN0b3IpIHtcbiAgICBpZiAodGhpcy5pbmplY3Rvcikge1xuICAgICAgdGhpcy5odHRwY2xpZW50ID0gdGhpcy5pbmplY3Rvci5nZXQoSHR0cENsaWVudCk7XG4gICAgICB0aGlzLmxvY2FsZWlkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJsYW5ndWFnZUNvZGVcIikgfHwgdGhpcy5pbmplY3Rvci5nZXQoTE9DQUxFX0lEKTtcbiAgICAgIHRoaXMubG9jYWxlcGlwZSA9IG5ldyBMb2NhbExhbmdQaXBlKHRoaXMubG9jYWxlaWQpO1xuICAgIH1cbiAgfVxuICBASW5wdXQoKSBmb3JtSWQ6IHN0cmluZztcbiAgQElucHV0KCkgcm9vdElkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGZpbGVUeXBlOiBzdHJpbmcgPSBcIipcIjtcbiAgQElucHV0KCkgZmlsZUNvdW50OiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBvbGRJZExpc3Q6IHN0cmluZ1tdID0gW107XG4gIEBJbnB1dCgpIHNlY3VyaXR5SW5mbzogR3NwRG9jU2VjdXJpdHlCYXNlSW5mbyA9IG51bGw7XG5cbiAgQFZpZXdDaGlsZCgnb3BDZWxsJykgb3BDZWxsOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0ZpcmVmb3gnKSA+PSAwKVxuICAgICAgdGhpcy5jaGVja2JveFBvcy50b3AgPSAnMTRweCc7XG4gICAgLy9pZiAodGhpcy5zdG9yYWdlU2VydmljZSAhPSBudWxsKSB7XG4gICAgaWYgKHRoaXMuc2VjdXJpdHlJbmZvICE9IG51bGwpIHtcbiAgICAgIHRoaXMudXBsb2FkU2VydmljZS5nZXRTZWN1cml0eUluZm9MaXN0KHRoaXMuc2VjdXJpdHlJbmZvKS5zdWJzY3JpYmUoXG4gICAgICAgIHJlcyA9PiB7XG4gICAgICAgICAgdGhpcy5oYXZlU2VjdXJpdHlJbmZvID0gdHJ1ZTtcbiAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgcmVzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlY3VyaXR5SW5mb0xpc3QucHVzaCh7IGlkOiBpLnRvU3RyaW5nKCksIHNlY3VyaXR5SWQ6IGVsZW1lbnQuc2VjdXJpdHlJZCwgc2VjdXJpdHlMZXZlbDogZWxlbWVudC5zZWN1cml0eUxldmVsLCBuYW1lOiBlbGVtZW50Lm5hbWUgfSk7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG4gICAgdGhpcy51cGxvYWRTZXJ2aWNlLmdldFN0b3JhZ2VFeHRlbnNpb25JbmZvKCkuc3Vic2NyaWJlKFxuICAgICAgcmVzID0+IHtcbiAgICAgICAgaWYgKHJlcyAhPSBudWxsICYmIHJlcy5lcnJvciA9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5zdG9yYWdlRXh0ZW5zaW9uID0gcmVzO1xuICAgICAgICAgIHRoaXMuZGVmYXVsdFByb3BlcnR5TmFtZSA9IHRoaXMuc3RvcmFnZUV4dGVuc2lvbi5kZWZhdWx0UHJvcGVydHlOYW1lO1xuICAgICAgICAgIHRoaXMucHJvcGVydGllc05hbWVzLnB1c2goeyBpZDogXCIwXCIsIG5hbWU6IHRoaXMuc3RvcmFnZUV4dGVuc2lvbi5kZWZhdWx0UHJvcGVydHlOYW1lIH0pO1xuICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAvLyB0aGlzLnByb3BlcnRpZXNOYW1lcy5wdXNoKC4uLih0aGlzLnN0b3JhZ2VFeHRlbnNpb24uZXh0ZW5zaW9uUHJvcGVydHlOYW1lTGlzdCkpO1xuICAgICAgICAgIHRoaXMuc3RvcmFnZUV4dGVuc2lvbi5leHRlbnNpb25Qcm9wZXJ0eU5hbWVMaXN0LmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICB0aGlzLnByb3BlcnRpZXNOYW1lcy5wdXNoKHsgaWQ6ICgrK2kpLnRvU3RyaW5nKCksIG5hbWU6IGVsZW1lbnQgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5xdWV1ZUxpc3RTdHlsZS53aWR0aCA9ICczODBweCc7XG4gICAgICAgICAgdGhpcy5oYXZlRXh0ZW5zaW9uUHJvcGVydHkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKVxuXG4gICAgdGhpcy51cGxvYWRTZXJ2aWNlLmdldFVwbG9hZEluZm8odGhpcy5yb290SWQpLnN1YnNjcmliZShcbiAgICAgIHJlcyA9PiB7XG4gICAgICAgIGlmIChyZXMgIT0gbnVsbCAmJiByZXMuZXJyb3IgPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuc2FtZU5hbWVBbGxvd2VkID0gcmVzLnNhbWVOYW1lQWxsb3dlZDtcbiAgICAgICAgICB0aGlzLm1heEZpbGVTaXplID0gcGFyc2VJbnQoSlNPTi5wYXJzZShyZXMudmFsaWRhdGVDb25maWd1cmF0aW9uKS5tYXhGaWxlU2l6ZSk7XG4gICAgICAgICAgdGhpcy5hbGxvd2VkTXVsdGlVcGxvYWQgPSByZXMuYWxsb3dlZE11bHRpVXBsb2FkO1xuICAgICAgICAgIGlmICghdGhpcy5zYW1lTmFtZUFsbG93ZWQpIHtcbiAgICAgICAgICAgIHRoaXMudXBsb2FkU2VydmljZS5nZXRVcGxvYWRlZEZpbGVJbmZvTGlzdCh0aGlzLmZvcm1JZCwgdGhpcy5yb290SWQpLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgcmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzICE9IG51bGwgJiYgcmVzLmVycm9yID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QgPSByZXM7XG4gICAgICAgICAgICAgICAgICB0aGlzLm9sZFVwbG9hZGVkRmlsZUxpc3QgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlcykpOztcblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIClcbiAgICBpZiAodGhpcy5vbGRJZExpc3QgIT0gbnVsbCAmJiB0aGlzLm9sZElkTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAvLyB0aGlzLnVwbG9hZFNlcnZpY2UuY2FuY2VsKHRoaXMub2xkSWRMaXN0LCB0aGlzLnJvb3RJZCkuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5yYWRpb0J1dHRvbkdyb3VwVmFsdWU9J3Nob3dCeUdyb3VwJztcbiAgfVxuXG4gIHRvdGFsTG9hZDogYW55ID0gbnVsbDtcblxuICBzaG93TG9hZGluZygpIHtcbiAgICB0aGlzLmhhc1NlbGVjdGVkRmlsZSA9IHRydWU7XG4gICAgLy8gaWYgKHRoaXMudG90YWxMb2FkID09IG51bGwpXG4gICAgLy8gICB0aGlzLnRvdGFsTG9hZCA9IHRoaXMubG9hZFNlcnZpY2Uuc2hvdyh7XG4gICAgLy8gICAgIG1lc3NhZ2U6IHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3VwbG9hZGluZycpXG4gICAgLy8gICB9KTtcbiAgfVxuXG5cbiAgZmlsZVNlbGVjdGVkKCRldmVudCkge1xuXG4gICAgdGhpcy5oYXNTZWxlY3RlZEZpbGUgPSB0cnVlO1xuICAgIHRoaXMuc2VsZWN0ZWRGaWxlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNmaWxlJyk7XG5cbiAgICBpZiAodGhpcy5maWxlQ291bnQgPiAwKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEZpbGVzLmZpbGVzLmxlbmd0aCArIHRoaXMuZmlsZXMubGVuZ3RoID4gdGhpcy5maWxlQ291bnQpIHtcbiAgICAgICAgbGV0IHNlbGVjdGVkTnVtOiBudW1iZXIgPSAodGhpcy5zZWxlY3RlZEZpbGVzLmZpbGVzLmxlbmd0aCBhcyBudW1iZXIpICsgdGhpcy5maWxlcy5sZW5ndGg7XG4gICAgICAgIHRoaXMubXNnU2VydmljZS53YXJuaW5nKHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3NlbGVjdGVkQ291bnQnKSArIHNlbGVjdGVkTnVtICsgdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnbGltaXRDb3VudCcpICsgdGhpcy5maWxlQ291bnQgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZWNob29zZUZpbGUnKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL3RoaXMuZmxhZyA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbGVjdGVkRmlsZXMuZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBzZWxlY3RlZEZpbGUgPSB0aGlzLnNlbGVjdGVkRmlsZXMuZmlsZXNbaV07XG4gICAgICAvL3NlbGVjdGVkRmlsZS5zbGljZVxuICAgICAgbGV0IHV1aWQgPSBVVUlELlVVSUQoKTtcblxuICAgICAgaWYgKHNlbGVjdGVkRmlsZS5zaXplID09IDApIHtcbiAgICAgICAgdGhpcy5udWxsRmlsZUxpc3QucHVzaChzZWxlY3RlZEZpbGUubmFtZSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tYXhGaWxlU2l6ZSAhPSBudWxsICYmIHRoaXMubWF4RmlsZVNpemUgPiAwKSB7XG4gICAgICAgIGlmIChzZWxlY3RlZEZpbGUuc2l6ZSA+IHRoaXMubWF4RmlsZVNpemUgKiAxMDAwKSB7XG4gICAgICAgICAgdGhpcy5iZXlvbmRGaWxlTGlzdC5wdXNoKHNlbGVjdGVkRmlsZS5uYW1lKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuc2FtZU5hbWVBbGxvd2VkKSB7XG4gICAgICAgIGlmICh0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LmZpbmQoeCA9PiB4LmZpbGVOYW1lID09IHNlbGVjdGVkRmlsZS5uYW1lKSAhPSBudWxsKSB7XG5cbiAgICAgICAgICBjb25zdCBtc2cgPSB0aGlzLm1zZ1NlcnZpY2Uuc2hvdygnd2FybmluZycsIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ2hhdmVTYW1lTmFtZScpICsgc2VsZWN0ZWRGaWxlLm5hbWUsIHtcbiAgICAgICAgICAgIGluaXRpYWxTdGF0ZToge1xuICAgICAgICAgICAgICBidXR0b25zOiBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgncmVuYW1lJyksXG4gICAgICAgICAgICAgICAgICBjbHM6ICdidG4gYnRuLXNlY29uZGFyeScsXG4gICAgICAgICAgICAgICAgICBoYW5kbGU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9sZE5hbWU6IHN0cmluZyA9IHNlbGVjdGVkRmlsZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3TmFtZVxuICAgICAgICAgICAgICAgICAgICBsZXQgZmxhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpID0gMTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICBuZXdOYW1lID0gb2xkTmFtZS5zdWJzdHJpbmcoMCwgb2xkTmFtZS5sYXN0SW5kZXhPZignLicpKSArICcoJyArIGkgKyAnKScgKyBvbGROYW1lLnN1YnN0cmluZyhvbGROYW1lLmxhc3RJbmRleE9mKCcuJykpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LmZpbmQoeCA9PiB4LmZpbGVOYW1lID09IG5ld05hbWUpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRGaWxlKHV1aWQsIHNlbGVjdGVkRmlsZSwgbmV3TmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIG1zZy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgncmVwbGFjZScpLFxuICAgICAgICAgICAgICAgICAgY2xzOiAnYnRuIGJ0bi1zZWNvbmRhcnknLFxuICAgICAgICAgICAgICAgICAgaGFuZGxlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHV1aWQgPSB0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LmZpbmQoeCA9PiB4LmZpbGVOYW1lID09IHNlbGVjdGVkRmlsZS5uYW1lKS5tZXRhZGF0YUlkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZEZpbGUodXVpZCwgc2VsZWN0ZWRGaWxlLCBzZWxlY3RlZEZpbGUubmFtZSwgRmlsZVN0YXRlLlVwZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlVG90YWwtLTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub2xkVXBsb2FkZWRGaWxlTGlzdC5maW5kKHggPT4geC5maWxlTmFtZSA9PSBzZWxlY3RlZEZpbGUubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZVRvdGFsKys7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5zcGxpY2UodGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5pbmRleE9mKHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuZmlsdGVyKHggPT4geC5maWxlTmFtZSA9PSBzZWxlY3RlZEZpbGUubmFtZSlbMF0pLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtc2cuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ2NhbmNlbCcpLFxuICAgICAgICAgICAgICAgICAgY2xzOiAnYnRuIGJ0bi1zZWNvbmRhcnknLFxuICAgICAgICAgICAgICAgICAgaGFuZGxlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG1zZy5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMudXBsb2FkRmlsZSh1dWlkLCBzZWxlY3RlZEZpbGUsIHNlbGVjdGVkRmlsZS5uYW1lKTtcblxuICAgIH1cblxuICAgIGlmICh0aGlzLmVyckZpbGVMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBuYW1lOiBzdHJpbmcgPSB0aGlzLmxpc3RUb1N0cmluZyh0aGlzLmVyckZpbGVMaXN0KTtcbiAgICAgIHRoaXMubXNnU2VydmljZS53YXJuaW5nKHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ2hhdmVTYW1lTmFtZScpICsgbmFtZSArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3JlY2hvb3NlRmlsZScpKTtcbiAgICAgIHRoaXMuZXJyRmlsZUxpc3QgPSBbXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5udWxsRmlsZUxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IG5hbWU6IHN0cmluZyA9IHRoaXMubGlzdFRvU3RyaW5nKHRoaXMubnVsbEZpbGVMaXN0KTtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCAtIDEpO1xuICAgICAgdGhpcy5tc2dTZXJ2aWNlLndhcm5pbmcobmFtZSArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3NpemVaZXJvJykgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZWNob29zZUZpbGUnKSk7XG4gICAgICB0aGlzLm51bGxGaWxlTGlzdCA9IFtdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJleW9uZEZpbGVMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBuYW1lOiBzdHJpbmcgPSB0aGlzLmxpc3RUb1N0cmluZyh0aGlzLmJleW9uZEZpbGVMaXN0KTtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCAtIDEpO1xuICAgICAgdGhpcy5tc2dTZXJ2aWNlLndhcm5pbmcobmFtZSArIHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3NpemVNYXgnKSArIHRoaXMubWF4RmlsZVNpemUgKyBcIktCXCIgKyB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdyZWNob29zZUZpbGUnKSk7XG4gICAgICB0aGlzLmJleW9uZEZpbGVMaXN0ID0gW107XG4gICAgfVxuICAgIHRoaXMuZmlsZXMgPSB0aGlzLmZpbGVzLnNsaWNlKCk7XG4gICAgdGhpcy5maWxlQWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAkZXZlbnQudGFyZ2V0LnZhbHVlID0gJyc7XG4gICAgLy8gbG9hZGluZy5jbG9zZSgpO1xuICB9XG5cbiAgc2hvd0Vycm9yTWVzc2FnZShmaWxlKSB7XG4gICAgdGhpcy5tc2dTZXJ2aWNlLmVycm9yKHRoaXMubG9jYWxlcGlwZS50cmFuc2Zvcm0oJ3VwbG9hZEZhaWx1cmUnKSArIGZpbGUuZXJyb3JNZXNzYWdlKTtcbiAgfVxuXG4gIGhhbmRsZUZpbGVJbmZvKHV1aWQ6IHN0cmluZywgc2VsZWN0ZWRGaWxlLCBmaWxlTmFtZTogc3RyaW5nKTogYW55IHtcblxuICAgIGxldCBmaWxlSW5mbzogRmlsZUluZm87XG5cbiAgICBmaWxlSW5mbyA9IHtcbiAgICAgIGlkOiB1dWlkLFxuICAgICAgbmFtZTogZmlsZU5hbWUsXG4gICAgICB0eXBlOiBzZWxlY3RlZEZpbGUudHlwZSxcbiAgICAgIHNvdXJjZTogXCJcIixcbiAgICAgIHNpemU6IHRoaXMuZ2V0RmlsZVNpemUoc2VsZWN0ZWRGaWxlLnNpemUpLFxuICAgICAgZmlsZVNpemU6IHNlbGVjdGVkRmlsZS5zaXplLFxuICAgICAgcGljTGlzdERpc3BsYXlOYW1lOiB0aGlzLmdldFBpY0xpc3REaXNwbGF5TmFtZShmaWxlTmFtZSksXG4gICAgICBxdWV1ZUxpc3REaXNwbGF5TmFtZTogdGhpcy5nZXRRdWV1ZURpc3BsYXlOYW1lKGZpbGVOYW1lKSxcbiAgICAgIC8vY29udGVudDogcmVhZGVyLnJlc3VsdC50b1N0cmluZygpLFxuICAgICAgaGFzVXBsb2FkZWQ6IGZhbHNlLFxuICAgICAgbW91c2VPbjogZmFsc2UsXG4gICAgICBzZWxlY3RkOiBmYWxzZSxcbiAgICAgIGlzVXBsb2FkaW5nOiB0cnVlLFxuICAgICAgdXBsb2FkUmVzdWx0OiBmYWxzZSxcbiAgICAgIHVwbG9hZFByb2Nlc3M6IDAsXG4gICAgICBlcnJvck1lc3NhZ2U6IFwiXCIsXG4gICAgICBleHRlbnNpb25Ecm9wTGlzdElkOiAwLFxuICAgICAgZXh0ZW5zaW9uTmFtZTogXCJcIixcbiAgICAgIHNlY3VyaXR5RHJvcExpc3RJZDogMCxcbiAgICAgIHNlY3VyaXR5SW5mbzogdGhpcy5zZWN1cml0eUluZm9MaXN0WzBdXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RvcmFnZUV4dGVuc2lvbiAhPSBudWxsKVxuICAgICAgZmlsZUluZm8uZXh0ZW5zaW9uTmFtZSA9IHRoaXMuZGVmYXVsdFByb3BlcnR5TmFtZTtcblxuXG4gICAgbGV0IHR5cGU6IHN0cmluZyA9IHNlbGVjdGVkRmlsZS50eXBlO1xuICAgIGlmICh0eXBlLmluY2x1ZGVzKFwidGlmZlwiKSkge1xuICAgICAgdGhpcy5hZGREb2NJbmZvKHNlbGVjdGVkRmlsZSwgZmlsZUluZm8sIERvY1R5cGUuT3RoZXIpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlLmluY2x1ZGVzKFwiaW1hZ2VcIikpIHtcbiAgICAgIHRoaXMuYWRkRG9jSW5mbyhzZWxlY3RlZEZpbGUsIGZpbGVJbmZvLCBEb2NUeXBlLkltYWdlKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZS5pbmNsdWRlcyhcIndvcmRcIikpIHtcbiAgICAgIHRoaXMuYWRkRG9jSW5mbyhzZWxlY3RlZEZpbGUsIGZpbGVJbmZvLCBEb2NUeXBlLldvcmQpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlLmluY2x1ZGVzKFwicGRmXCIpKSB7XG4gICAgICB0aGlzLmFkZERvY0luZm8oc2VsZWN0ZWRGaWxlLCBmaWxlSW5mbywgRG9jVHlwZS5QZGYpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlLmluY2x1ZGVzKFwicGxhaW5cIikpIHtcbiAgICAgIHRoaXMuYWRkRG9jSW5mbyhzZWxlY3RlZEZpbGUsIGZpbGVJbmZvLCBEb2NUeXBlLlR4dCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUuaW5jbHVkZXMoXCJzaGVldFwiKSB8fCB0eXBlLmluY2x1ZGVzKFwiZXhjZWxcIikpIHtcbiAgICAgIHRoaXMuYWRkRG9jSW5mbyhzZWxlY3RlZEZpbGUsIGZpbGVJbmZvLCBEb2NUeXBlLkV4Y2VsKVxuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlLmluY2x1ZGVzKFwicG93ZXJwb2ludFwiKSB8fCB0eXBlLmluY2x1ZGVzKFwicHJlc2VudGF0aW9uXCIpKSB7XG4gICAgICB0aGlzLmFkZERvY0luZm8oc2VsZWN0ZWRGaWxlLCBmaWxlSW5mbywgRG9jVHlwZS5Qb3dlcnBvaW50KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmFkZERvY0luZm8oc2VsZWN0ZWRGaWxlLCBmaWxlSW5mbywgRG9jVHlwZS5PdGhlcik7XG4gICAgICAvLyBsZXQgbmFtZTogc3RyaW5nID0gc2VsZWN0ZWRGaWxlLm5hbWU7XG4gICAgICAvLyBsZXQgZXJyVHlwZSA9IG5hbWUuc3Vic3RyaW5nKHNlbGVjdGVkRmlsZS5uYW1lLmxhc3RJbmRleE9mKCcuJykpO1xuICAgICAgLy8gdGhpcy5lcnJUeXBlTGlzdC5wdXNoKGVyclR5cGUpO1xuICAgIH1cbiAgICByZXR1cm4gZmlsZUluZm87XG4gIH1cblxuICB1cGxvYWRGaWxlKHV1aWQ6IHN0cmluZywgc2VsZWN0ZWRGaWxlLCBmaWxlTmFtZTogc3RyaW5nLCBzdGF0ZTogRmlsZVN0YXRlID0gRmlsZVN0YXRlLk5ldykge1xuXG4gICAgbGV0IGZpbGVJbmZvID0gdGhpcy5oYW5kbGVGaWxlSW5mbyh1dWlkLCBzZWxlY3RlZEZpbGUsIGZpbGVOYW1lKTtcblxuICAgIGxldCB1cGxvYWRGaWxlSW5mbyA9IG5ldyBVcGxvYWRGaWxlSW5mbygpO1xuXG4gICAgdXBsb2FkRmlsZUluZm8ubWV0YWRhdGFJZCA9IHV1aWQ7XG4gICAgdXBsb2FkRmlsZUluZm8uZmlsZU5hbWUgPSBmaWxlSW5mby5uYW1lO1xuICAgIHVwbG9hZEZpbGVJbmZvLmZpbGVTaXplID0gZmlsZUluZm8uZmlsZVNpemU7XG4gICAgdXBsb2FkRmlsZUluZm8uc3RhdGUgPSBzdGF0ZTtcbiAgICB1cGxvYWRGaWxlSW5mby5zZWN1cml0eUluZm8gPSB0aGlzLnNlY3VyaXR5SW5mb0xpc3RbMF07XG5cblxuICAgIC8v5Yik5pat5piv5ZCm5pSv5oyB5YiG54mH5LiK5LygXG4gICAgaWYgKHRoaXMuYWxsb3dlZE11bHRpVXBsb2FkKSB7XG5cbiAgICAgIC8v5pSv5oyB5YiG54mH5LiK5LygXG4gICAgICBsZXQgaW5pdFJlcXVlc3Q6IEluaXRNdWx0aVVwbG9hZFJlcXVlc3QgPSBuZXcgSW5pdE11bHRpVXBsb2FkUmVxdWVzdDtcblxuICAgICAgaW5pdFJlcXVlc3QucGF0aCA9IHRoaXMuZm9ybUlkO1xuICAgICAgaW5pdFJlcXVlc3QubWV0YWRhdGFJZCA9IHV1aWQ7XG4gICAgICBpbml0UmVxdWVzdC5yb290SWQgPSB0aGlzLnJvb3RJZDtcbiAgICAgIGluaXRSZXF1ZXN0LnNpemUgPSBmaWxlSW5mby5maWxlU2l6ZTtcbiAgICAgIGluaXRSZXF1ZXN0LmZpbGVOYW1lID0gZmlsZU5hbWU7XG5cbiAgICAgIC8v5Yid5aeL5YyW5YiG54mHXG4gICAgICB0aGlzLmluaXRNdWx0aVVwbG9hZChpbml0UmVxdWVzdCkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgIGlmIChyZXMuZXJyb3IgIT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0udXBsb2FkUmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5maWxlc1t0aGlzLmZpbGVzLmluZGV4T2YoZmlsZUluZm8pXS5pc1VwbG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0uZXJyb3JNZXNzYWdlID0gcmVzLmVycm9yLk1lc3NhZ2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IHVwbG9hZElkID0gcmVzLnVwbG9hZElkO1xuICAgICAgICAgIGxldCBjaHVua1RvdGFsOiBudW1iZXIgPSBNYXRoLmNlaWwoc2VsZWN0ZWRGaWxlLnNpemUgLyB0aGlzLmJ1ZmZlclNpemUpO1xuICAgICAgICAgIGxldCBjaHVua0luZGV4OiBudW1iZXIgPSAwO1xuXG4gICAgICAgICAgbGV0IG11bHRpUmVzdWx0TGlzdDogTXVsdGlVcGxvYWRSZXN1bHRbXSA9IFtdO1xuXG4gICAgICAgICAgdGhpcy5maWxlVG90YWxDaHVua1t1dWlkXSA9IGNodW5rVG90YWw7XG4gICAgICAgICAgdGhpcy51cGxvYWRlZENodW5rW3V1aWRdID0gMDtcblxuICAgICAgICAgIHdoaWxlIChjaHVua0luZGV4IDwgY2h1bmtUb3RhbCkge1xuXG4gICAgICAgICAgICBsZXQgbmV4dFNpemUgPSBNYXRoLm1pbigoY2h1bmtJbmRleCArIDEpICogdGhpcy5idWZmZXJTaXplLCBzZWxlY3RlZEZpbGUuc2l6ZSk7XG4gICAgICAgICAgICBsZXQgZmlsZURhdGEgPSBzZWxlY3RlZEZpbGUuc2xpY2UoY2h1bmtJbmRleCAqIHRoaXMuYnVmZmVyU2l6ZSwgbmV4dFNpemUpO1xuXG4gICAgICAgICAgICBsZXQgbXVsdGlSZXF1ZXN0ID0gbmV3IE11bHRpVXBsb2FkUmVxdWVzdDtcbiAgICAgICAgICAgIG11bHRpUmVxdWVzdC5tZXRhZGF0YUlkID0gdXVpZDtcbiAgICAgICAgICAgIG11bHRpUmVxdWVzdC5yb290SWQgPSB0aGlzLnJvb3RJZDtcbiAgICAgICAgICAgIG11bHRpUmVxdWVzdC51cGxvYWRJZCA9IHVwbG9hZElkO1xuICAgICAgICAgICAgbXVsdGlSZXF1ZXN0LmluZGV4ID0gY2h1bmtJbmRleDtcbiAgICAgICAgICAgIG11bHRpUmVxdWVzdC50b3RhbCA9IGNodW5rVG90YWw7XG4gICAgICAgICAgICBtdWx0aVJlcXVlc3Quc2l6ZSA9IGZpbGVEYXRhLnNpemU7XG5cbiAgICAgICAgICAgIGxldCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdtdWx0aVJlcXVlc3QnLCBKU09OLnN0cmluZ2lmeShtdWx0aVJlcXVlc3QpKTtcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGVEYXRhKTtcblxuICAgICAgICAgICAgdGhpcy5tdWx0aVVwbG9hZChmb3JtRGF0YSkuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICAgIGlmIChyZXMuZXJyb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0udXBsb2FkUmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlc1t0aGlzLmZpbGVzLmluZGV4T2YoZmlsZUluZm8pXS5pc1VwbG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0uZXJyb3JNZXNzYWdlID0gcmVzLmVycm9yLk1lc3NhZ2U7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbXVsdGlSZXN1bHRMaXN0LnB1c2gocmVzLnJlc3VsdCk7XG4gICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZENodW5rW3V1aWRdKys7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlc1t0aGlzLmZpbGVzLmluZGV4T2YoZmlsZUluZm8pXS51cGxvYWRQcm9jZXNzID0gTnVtYmVyLnBhcnNlSW50KCh0aGlzLnVwbG9hZGVkQ2h1bmtbdXVpZF0gLyB0aGlzLmZpbGVUb3RhbENodW5rW3V1aWRdICogMTAwKS50b0ZpeGVkKDApKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy51cGxvYWRlZENodW5rW3V1aWRdID09IHRoaXMuZmlsZVRvdGFsQ2h1bmtbdXVpZF0pIHtcbiAgICAgICAgICAgICAgICAgIGlmIChtdWx0aVJlc3VsdExpc3QubGVuZ3RoID09IHRoaXMuZmlsZVRvdGFsQ2h1bmtbdXVpZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlc1t0aGlzLmZpbGVzLmluZGV4T2YoZmlsZUluZm8pXS51cGxvYWRSZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVzW3RoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyldLmlzVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBsb2FkRmlsZUluZm9MaXN0ID0gdGhpcy51cGxvYWRGaWxlSW5mb0xpc3QuY29uY2F0KHVwbG9hZEZpbGVJbmZvKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdCA9IHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuY29uY2F0KHVwbG9hZEZpbGVJbmZvKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVUb3RhbCsrO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21wbGV0ZU11bHRpVXBsb2FkUmVxdWVzdDogQ29tcGxldGVNdWx0aVVwbG9hZFJlcXVlc3QgPSBuZXcgQ29tcGxldGVNdWx0aVVwbG9hZFJlcXVlc3Q7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlTXVsdGlVcGxvYWRSZXF1ZXN0Lm1ldGFkYXRhSWQgPSB1dWlkO1xuICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZU11bHRpVXBsb2FkUmVxdWVzdC5wYXJ0TGlzdCA9IG11bHRpUmVzdWx0TGlzdDtcbiAgICAgICAgICAgICAgICAgICAgY29tcGxldGVNdWx0aVVwbG9hZFJlcXVlc3Qucm9vdElkID0gdGhpcy5yb290SWQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlTXVsdGlVcGxvYWRSZXF1ZXN0LnVwbG9hZElkID0gdXBsb2FkSWQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlTXVsdGlVcGxvYWRSZXF1ZXN0LnNpemUgPSBmaWxlSW5mby5maWxlU2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGF2ZUV4dGVuc2lvblByb3BlcnR5KVxuICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlTXVsdGlVcGxvYWRSZXF1ZXN0LmV4UHJvcGVydHlOYW1lID0gdGhpcy5kZWZhdWx0UHJvcGVydHlOYW1lO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRlTXVsdGlVcGxvYWQoY29tcGxldGVNdWx0aVVwbG9hZFJlcXVlc3QpLnN1YnNjcmliZShyZXMgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC8v5ZCO5Y+w5byC5q2l5ou85o6l5paH5qGjXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVzW3RoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyldLnVwbG9hZFJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGVzW3RoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyldLmlzVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0uZXJyb3JNZXNzYWdlID0gdGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnbWlzbWF0Y2hDaHVua1NpemUnKTtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgY2h1bmtJbmRleCA9IGNodW5rSW5kZXggKyAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICB9KVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBlbnRpdHkgPSBuZXcgR3NwRm9ybVN0cmVhbUVudGl0eTtcbiAgICAgIGVudGl0eS5mb3JtSWQgPSB0aGlzLmZvcm1JZDtcbiAgICAgIGVudGl0eS5tZXRhZGF0YUlkID0gdXVpZDtcbiAgICAgIGVudGl0eS5tb2RlID0gT3BlcmF0aW5nTW9kZXMuVGVtcDtcbiAgICAgIGVudGl0eS5yb290SWQgPSB0aGlzLnJvb3RJZDtcbiAgICAgIGVudGl0eS5zaXplID0gc2VsZWN0ZWRGaWxlLnNpemU7XG4gICAgICBlbnRpdHkuZmlsZU5hbWUgPSBmaWxlTmFtZTtcbiAgICAgIGlmICh0aGlzLmhhdmVFeHRlbnNpb25Qcm9wZXJ0eSlcbiAgICAgICAgZW50aXR5LmV4UHJvcGVydHlOYW1lID0gdGhpcy5kZWZhdWx0UHJvcGVydHlOYW1lO1xuXG4gICAgICBsZXQgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCgndXBsb2FkRW50aXR5JywgSlNPTi5zdHJpbmdpZnkoZW50aXR5KSk7XG4gICAgICBmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBzZWxlY3RlZEZpbGUpO1xuXG4gICAgICB0aGlzLnVwbG9hZFNpbmdsZUZpbGUoZm9ybURhdGEpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICBpZiAocmVzICE9IG51bGwpIHtcbiAgICAgICAgICB0aGlzLmZpbGVzW3RoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyldLnVwbG9hZFJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0uaXNVcGxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmZpbGVzW3RoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyldLmVycm9yTWVzc2FnZSA9IHJlcy5lcnJvci5NZXNzYWdlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZmlsZXNbdGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKV0udXBsb2FkUmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLmZpbGVzW3RoaXMuZmlsZXMuaW5kZXhPZihmaWxlSW5mbyldLmlzVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy51cGxvYWRGaWxlSW5mb0xpc3QgPSB0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdC5jb25jYXQodXBsb2FkRmlsZUluZm8pO1xuICAgICAgICAgIHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QgPSB0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LmNvbmNhdCh1cGxvYWRGaWxlSW5mbyk7XG4gICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVUb3RhbCsrO1xuXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICB9XG5cblxuXG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgdGhpcy5maWxlcy5mb3JFYWNoKHggPT4ge1xuICAgICAgaWYgKHgubmFtZSA9PSBmaWxlSW5mby5uYW1lKSB7XG4gICAgICAgIGlmIChpbmRleCA9PSAtMSlcbiAgICAgICAgICBpbmRleCA9IHRoaXMuZmlsZXMuaW5kZXhPZih4KTtcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmIChpbmRleCAhPSAtMSAmJiBpbmRleCAhPSB0aGlzLmZpbGVzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHRoaXMuZmlsZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LnNwbGljZShpbmRleCwgMSk7XG4gICAgICB0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LnNwbGljZShpbmRleCwgMSk7XG4gICAgICAvL3RoaXMudXBsb2FkZWRGaWxlVG90YWwtLTtcbiAgICB9XG5cbiAgfVxuXG5cbiAgdXBsb2FkU2luZ2xlRmlsZShmb3JtZGF0YTogRm9ybURhdGEpOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgbGV0IHVybCA9IFwiL2FwaS9ydW50aW1lL2Rmcy92MS4wL2Zvcm1kb2Mvc2luZ2xlXCI7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwY2xpZW50LnBvc3QodXJsLCBmb3JtZGF0YSkucGlwZShcbiAgICAgIHRhcChyZXMgPT4geyB9KSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xuICAgICAgICByZXR1cm4gb2YoZXJyb3IpO1xuICAgICAgfSkpO1xuICB9XG5cbiAgdXBsb2FkU2xpY2VGaWxlKGZvcm1kYXRhOiBGb3JtRGF0YSk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICBsZXQgdXJsID0gXCIvYXBpL3J1bnRpbWUvZGZzL3YxLjAvZm9ybWRvYy9zbGljZVwiO1xuXG4gICAgcmV0dXJuIHRoaXMuaHR0cGNsaWVudC5wb3N0KHVybCwgZm9ybWRhdGEpLnBpcGUoXG4gICAgICB0YXAocmVzID0+IHsgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICAgICAgcmV0dXJuIG9mKGVycm9yKTtcbiAgICAgIH0pKTtcbiAgfVxuXG4gIGluaXRNdWx0aVVwbG9hZChyZXF1ZXN0OiBJbml0TXVsdGlVcGxvYWRSZXF1ZXN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgIGxldCB1cmwgPSBcIi9hcGkvcnVudGltZS9kZnMvdjEuMC9mb3JtZG9jL211bHRpL2luaXRcIjtcblxuICAgIHJldHVybiB0aGlzLmh0dHBjbGllbnQucG9zdCh1cmwsIHJlcXVlc3QpLnBpcGUoXG4gICAgICB0YXAocmVzID0+IHsgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcbiAgICAgICAgcmV0dXJuIG9mKGVycm9yKTtcbiAgICAgIH0pKTtcbiAgfVxuXG4gIG11bHRpVXBsb2FkKGZvcm1kYXRhOiBGb3JtRGF0YSk6IE9ic2VydmFibGU8YW55PiB7XG5cbiAgICBsZXQgdXJsID0gXCIvYXBpL3J1bnRpbWUvZGZzL3YxLjAvZm9ybWRvYy9tdWx0aS91cGxvYWRcIjtcblxuICAgIHJldHVybiB0aGlzLmh0dHBjbGllbnQucG9zdCh1cmwsIGZvcm1kYXRhKS5waXBlKFxuICAgICAgdGFwKHJlcyA9PiB7IH0pLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHJldHVybiBvZihlcnJvcik7XG4gICAgICB9KSk7XG4gIH1cblxuICBjb21wbGV0ZU11bHRpVXBsb2FkKHJlcXVlc3Q6IENvbXBsZXRlTXVsdGlVcGxvYWRSZXF1ZXN0KTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgIGxldCB1cmwgPSBcIi9hcGkvcnVudGltZS9kZnMvdjEuMC9mb3JtZG9jL211bHRpL2NvbXBsZXRlXCI7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwY2xpZW50LnBvc3QodXJsLCByZXF1ZXN0KS5waXBlKFxuICAgICAgdGFwKHJlcyA9PiB7IH0pLFxuICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHJldHVybiBvZihlcnJvcik7XG4gICAgICB9KSk7XG4gIH1cblxuXG5cbiAgc2VsZWN0QWxsRmlsZSgpIHtcblxuICAgIGlmICghdGhpcy5maWxlQWxsU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuZmlsZXMuZm9yRWFjaChlbGVtZW50ID0+IHtcblxuICAgICAgICBlbGVtZW50LnNlbGVjdGQgPSB0cnVlO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmZpbGVBbGxTZWxlY3RlZCA9IHRydWU7XG4gICAgICB0aGlzLnNlbGVjdGVkRmlsZUNvdW50ID0gdGhpcy5maWxlcy5sZW5ndGg7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWxlcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuXG4gICAgICAgIGVsZW1lbnQuc2VsZWN0ZCA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmZpbGVBbGxTZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5zZWxlY3RlZEZpbGVDb3VudCA9IDA7XG4gICAgfVxuICB9XG5cblxuICBjaGVja291dFNlbGVjdEZpbGUoZmlsZTogRmlsZUluZm8pIHtcbiAgICAvLyBsZXQgb2JqOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChmaWxlTmFtZSk7XG4gICAgZmlsZS5zZWxlY3RkID0gIWZpbGUuc2VsZWN0ZDtcbiAgICBpZiAoZmlsZS5zZWxlY3RkKVxuICAgICAgdGhpcy5zZWxlY3RlZEZpbGVDb3VudCsrO1xuICAgIGVsc2VcbiAgICAgIHRoaXMuc2VsZWN0ZWRGaWxlQ291bnQtLTtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZpbGVDb3VudCA9PSB0aGlzLmZpbGVzLmxlbmd0aCkge1xuICAgICAgdGhpcy5maWxlQWxsU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgLy90aGlzLmlzRmlsZUFsbFNlbGVjdGVkKCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5maWxlQWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgIC8vdGhpcy5pc0ZpbGVBbGxTZWxlY3RlZCgpO1xuICAgIH1cblxuICB9XG5cbiAgbGlzdERlbGV0ZUZpbGUoZmlsZUluZm86IEZpbGVJbmZvKSB7XG4gICAgaWYgKGZpbGVJbmZvLnNlbGVjdGQpXG4gICAgICB0aGlzLnNlbGVjdGVkRmlsZUNvdW50LS07XG4gICAgLy9jb25zb2xlLmxvZyhmaWxlTmFtZSk7XG4gICAgdGhpcy5maWxlcy5zcGxpY2UodGhpcy5maWxlcy5pbmRleE9mKGZpbGVJbmZvKSwgMSk7XG4gICAgaWYgKGZpbGVJbmZvLnVwbG9hZFJlc3VsdCkge1xuICAgICAgbGV0IGlkTGlzdDogc3RyaW5nW10gPSBbXTtcbiAgICAgIGlkTGlzdC5wdXNoKGZpbGVJbmZvLmlkKTtcbiAgICAgIHRoaXMudXBsb2FkU2VydmljZS5jYW5jZWwoaWRMaXN0LCB0aGlzLnJvb3RJZCkuc3Vic2NyaWJlKCk7XG5cbiAgICAgIHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LnNwbGljZSh0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdC5pbmRleE9mKHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LmZpbHRlcih4ID0+IHguZmlsZU5hbWUgPT0gZmlsZUluZm8ubmFtZSlbMF0pLCAxKTtcbiAgICAgIHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3Quc3BsaWNlKHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuaW5kZXhPZih0aGlzLnVwbG9hZGVkRmlsZUluZm9MaXN0LmZpbHRlcih4ID0+IHguZmlsZU5hbWUgPT0gZmlsZUluZm8ubmFtZSlbMF0pLCAxKTtcbiAgICAgIHRoaXMudXBsb2FkZWRGaWxlVG90YWwtLTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGaWxlQ291bnQgPT0gMClcbiAgICAgIHRoaXMuZmlsZUFsbFNlbGVjdGVkID0gZmFsc2U7XG4gIH1cblxuICBsaXN0TXVsdGlwbGVEZWxldGVGaWxlKCkge1xuICAgIGxldCBzZWxlY3RlZEZpbGU6IEZpbGVJbmZvW10gPSBbXTtcbiAgICB0aGlzLmZpbGVzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBsZXQgb2JqOiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50Lm5hbWUpO1xuICAgICAgaWYgKG9iai5jaGVja2VkKVxuICAgICAgICBzZWxlY3RlZEZpbGUucHVzaChlbGVtZW50KTtcbiAgICB9KVxuICAgIGxldCBtZXRhZGF0YUxpc3Q6IHN0cmluZ1tdID0gW107XG4gICAgc2VsZWN0ZWRGaWxlLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBtZXRhZGF0YUxpc3QucHVzaChlbGVtZW50LmlkKTtcbiAgICAgIHRoaXMuZmlsZXMuc3BsaWNlKHRoaXMuZmlsZXMuaW5kZXhPZihlbGVtZW50KSwgMSk7XG4gICAgICBpZiAoZWxlbWVudC51cGxvYWRSZXN1bHQpIHtcblxuICAgICAgICB0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdC5zcGxpY2UodGhpcy51cGxvYWRGaWxlSW5mb0xpc3QuaW5kZXhPZih0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdC5maWx0ZXIoeCA9PiB4LmZpbGVOYW1lID09IGVsZW1lbnQubmFtZSlbMF0pLCAxKTtcbiAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5zcGxpY2UodGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5pbmRleE9mKHRoaXMudXBsb2FkZWRGaWxlSW5mb0xpc3QuZmlsdGVyKHggPT4geC5maWxlTmFtZSA9PSBlbGVtZW50Lm5hbWUpWzBdKSwgMSk7XG4gICAgICAgIHRoaXMudXBsb2FkZWRGaWxlVG90YWwtLTtcbiAgICAgIH1cbiAgICB9KVxuICAgIHRoaXMudXBsb2FkU2VydmljZS5jYW5jZWwobWV0YWRhdGFMaXN0LCB0aGlzLnJvb3RJZCkuc3Vic2NyaWJlKCk7XG5cbiAgICBsZXQgYWxsQm94OiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImFsbENoZWNrQm94XCIpO1xuICAgIGlmIChhbGxCb3ggIT0gbnVsbClcbiAgICAgIGFsbEJveC5jaGVja2VkID0gZmFsc2U7XG4gICAgdGhpcy5zZWxlY3RlZEZpbGVDb3VudCA9IDA7XG4gICAgdGhpcy5maWxlQWxsU2VsZWN0ZWQgPSBmYWxzZTtcbiAgfVxuXG5cbiAgZ2V0UGljTGlzdERpc3BsYXlOYW1lKGZpbGVOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoZmlsZU5hbWUubGVuZ3RoIDw9IDEwKVxuICAgICAgcmV0dXJuIGZpbGVOYW1lO1xuICAgIGVsc2Uge1xuICAgICAgbGV0IGhlYWRDb250ZW50ID0gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIDIpO1xuICAgICAgbGV0IHRhaWxDb250ZW50ID0gZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgLSAyKTtcbiAgICAgIHJldHVybiBoZWFkQ29udGVudCArIFwi4oCmXCIgKyB0YWlsQ29udGVudDtcbiAgICB9XG4gIH1cblxuICBnZXRRdWV1ZURpc3BsYXlOYW1lKGZpbGVOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZmlsZU5hbWU7XG4gIH1cblxuICBhZGREb2NJbmZvKHNlbGVjdGRGaWxlLCBmaWxlSW5mbzogRmlsZUluZm8sIGRvY1R5cGU6IERvY1R5cGUpIHtcblxuICAgIHN3aXRjaCAoZG9jVHlwZSkge1xuICAgICAgY2FzZSBEb2NUeXBlLldvcmQ6IHtcbiAgICAgICAgZmlsZUluZm8uc291cmNlID0gXCIvcGxhdGZvcm0vcnVudGltZS9kZnMvaW1hZ2VzL3dvcmQucG5nXCJcbiAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGVJbmZvKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgRG9jVHlwZS5QZGY6IHtcbiAgICAgICAgZmlsZUluZm8uc291cmNlID0gXCIvcGxhdGZvcm0vcnVudGltZS9kZnMvaW1hZ2VzL3BkZi5wbmdcIlxuICAgICAgICB0aGlzLmZpbGVzLnB1c2goZmlsZUluZm8pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgY2FzZSBEb2NUeXBlLkV4Y2VsOiB7XG4gICAgICAgIGZpbGVJbmZvLnNvdXJjZSA9IFwiL3BsYXRmb3JtL3J1bnRpbWUvZGZzL2ltYWdlcy9leGNlbC5wbmdcIjtcbiAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGVJbmZvKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgRG9jVHlwZS5UeHQ6IHtcbiAgICAgICAgZmlsZUluZm8uc291cmNlID0gXCIvcGxhdGZvcm0vcnVudGltZS9kZnMvaW1hZ2VzL3R4dC5wbmdcIjtcbiAgICAgICAgdGhpcy5maWxlcy5wdXNoKGZpbGVJbmZvKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgRG9jVHlwZS5Qb3dlcnBvaW50OiB7XG4gICAgICAgIGZpbGVJbmZvLnNvdXJjZSA9IFwiL3BsYXRmb3JtL3J1bnRpbWUvZGZzL2ltYWdlcy9wcHQucG5nXCI7XG4gICAgICAgIHRoaXMuZmlsZXMucHVzaChmaWxlSW5mbyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIERvY1R5cGUuT3RoZXI6IHtcbiAgICAgICAgZmlsZUluZm8uc291cmNlID0gXCIvcGxhdGZvcm0vcnVudGltZS9kZnMvaW1hZ2VzL2ZpbGUucG5nXCI7XG4gICAgICAgIHRoaXMuZmlsZXMucHVzaChmaWxlSW5mbyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYXNlIERvY1R5cGUuSW1hZ2U6IHtcbiAgICAgICAgbGV0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKHNlbGVjdGRGaWxlKTtcbiAgICAgICAgcmVhZGVyLm9ubG9hZCA9IChfZXZlbnQpID0+IHtcbiAgICAgICAgICBsZXQgaW1nVXJsID0gcmVhZGVyLnJlc3VsdDtcbiAgICAgICAgICBpZiAodGhpcy5pbmplY3RvciAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgc2FuaXRpemVyID0gdGhpcy5pbmplY3Rvci5nZXQoRG9tU2FuaXRpemVyKTtcbiAgICAgICAgICAgIGltZ1VybCA9IHNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwoaW1nVXJsKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmlsZUluZm8uc291cmNlID0gaW1nVXJsO1xuICAgICAgICAgIHRoaXMuZmlsZXMucHVzaChmaWxlSW5mbyk7XG5cbiAgICAgICAgICAvL+WboOS4uuW8guatpeWkhOeQhueahOW3ruW8gu+8jOihpeWBv+S4gOasoeWIoOmZpFxuICAgICAgICAgIGxldCBpbmRleCA9IC0xO1xuICAgICAgICAgIHRoaXMuZmlsZXMuZm9yRWFjaCh4ID0+IHtcbiAgICAgICAgICAgIGlmICh4Lm5hbWUgPT0gZmlsZUluZm8ubmFtZSkge1xuICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gLTEpXG4gICAgICAgICAgICAgICAgaW5kZXggPSB0aGlzLmZpbGVzLmluZGV4T2YoeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICBpZiAoaW5kZXggIT0gLTEgJiYgaW5kZXggIT0gdGhpcy5maWxlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy51cGxvYWRlZEZpbGVJbmZvTGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgfVxuXG4gIH1cblxuICBsaXN0VG9TdHJpbmcoc3RyTGlzdDogc3RyaW5nW10pIHtcbiAgICBsZXQgbmFtZTogc3RyaW5nID0gXCJcIjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ckxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5hbWUgKz0gc3RyTGlzdFtpXSArIFwiLFwiO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZTtcbiAgfVxuXG4gIHNlY3VyaXR5Q2hhbmdlKCRldmVudDogYW55LCBmaWxlOiBGaWxlSW5mbykge1xuICAgIGZpbGUuc2VjdXJpdHlJbmZvID0gJGV2ZW50LmRhdGE7XG4gICAgbGV0IHVwbG9hZEZpbGUgPSB0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdC5maWx0ZXIoeCA9PiB4Lm1ldGFkYXRhSWQgPSBmaWxlLmlkKVswXTtcbiAgICB1cGxvYWRGaWxlLnNlY3VyaXR5SW5mbyA9ICRldmVudC5kYXRhO1xuICB9XG5cblxuICBleFN0b3JhZ2VGaWxlTGlzdDogRXhTdG9yYWdlRmlsZUluZm9bXSA9IFtdO1xuXG4gIHR5cGVDaGFuZ2UoJGV2ZW50OiBhbnksIGZpbGU6IEZpbGVJbmZvKSB7XG4gICAgZmlsZS5leHRlbnNpb25OYW1lID0gJGV2ZW50LmRhdGEubmFtZTtcbiAgICBsZXQgZXhTdG9yYWdlRmlsZUluZm86IEV4U3RvcmFnZUZpbGVJbmZvID0gbmV3IEV4U3RvcmFnZUZpbGVJbmZvO1xuICAgIGlmIChmaWxlLmV4dGVuc2lvbk5hbWUgPT0gdGhpcy5zdG9yYWdlRXh0ZW5zaW9uLmRlZmF1bHRQcm9wZXJ0eU5hbWUpIHtcbiAgICAgIGlmICh0aGlzLmV4U3RvcmFnZUZpbGVMaXN0LmZpbHRlcih4ID0+IHgubWV0YWRhdGFJZCA9PSBmaWxlLmlkKS5sZW5ndGggPiAwKVxuICAgICAgICB0aGlzLmV4U3RvcmFnZUZpbGVMaXN0LnNwbGljZSh0aGlzLmV4U3RvcmFnZUZpbGVMaXN0LmZpbmRJbmRleCh4ID0+IHgubWV0YWRhdGFJZCA9PSBmaWxlLmlkKSwgMSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuZXhTdG9yYWdlRmlsZUxpc3QuZmlsdGVyKHggPT4geC5tZXRhZGF0YUlkID09IGZpbGUuaWQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZXhTdG9yYWdlRmlsZUluZm8gPSB0aGlzLmV4U3RvcmFnZUZpbGVMaXN0LmZpbHRlcih4ID0+IHgubWV0YWRhdGFJZCA9PSBmaWxlLmlkKVswXTtcbiAgICAgICAgZXhTdG9yYWdlRmlsZUluZm8uZXhQcm9wZXJ0eU5hbWUgPSBmaWxlLmV4dGVuc2lvbk5hbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleFN0b3JhZ2VGaWxlSW5mby5tZXRhZGF0YUlkID0gZmlsZS5pZDtcbiAgICAgICAgZXhTdG9yYWdlRmlsZUluZm8uZXhQcm9wZXJ0eU5hbWUgPSBmaWxlLmV4dGVuc2lvbk5hbWU7XG4gICAgICAgIHRoaXMuZXhTdG9yYWdlRmlsZUxpc3QucHVzaChleFN0b3JhZ2VGaWxlSW5mbyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBsb2FkKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgaWYgKHRoaXMudXBsb2FkZWRGaWxlVG90YWwgIT0gdGhpcy5maWxlcy5maWx0ZXIoeCA9PiB4LmlzVXBsb2FkaW5nIHx8IHgudXBsb2FkUmVzdWx0KS5sZW5ndGgpIHtcblxuICAgICAgdGhpcy5tc2dTZXJ2aWNlLndhcm5pbmcodGhpcy5sb2NhbGVwaXBlLnRyYW5zZm9ybSgnd2FpdCcpKTtcbiAgICAgIHJldHVybiBvZihmYWxzZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhdmVTZWN1cml0eUluZm8pIHtcbiAgICAgIHRoaXMudXBsb2FkU2VydmljZS5zYXZlU2VjdXJpdHlJbmZvKHRoaXMudXBsb2FkRmlsZUluZm9MaXN0LCB0aGlzLnJvb3RJZCkuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0b3JhZ2VFeHRlbnNpb24gPT0gbnVsbClcbiAgICAgIHJldHVybiBvZih0aGlzLnVwbG9hZEZpbGVJbmZvTGlzdCk7XG4gICAgZWxzZSB7XG4gICAgICBpZiAodGhpcy5leFN0b3JhZ2VGaWxlTGlzdC5sZW5ndGggPT0gMClcbiAgICAgICAgcmV0dXJuIG9mKHRoaXMudXBsb2FkRmlsZUluZm9MaXN0KTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBsb2FkaW5nID0gdGhpcy5sb2FkU2VydmljZS5zaG93KHtcbiAgICAgICAgICBtZXNzYWdlOiB0aGlzLmxvY2FsZXBpcGUudHJhbnNmb3JtKCdzYXZlVG8nKSArIHRoaXMuc3RvcmFnZUV4dGVuc2lvbi5leHRlbnNpb25OYW1lXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy51cGxvYWRTZXJ2aWNlLmNoYW5nZVN0b3JhZ2VJbnN0YW5jZSh0aGlzLmV4U3RvcmFnZUZpbGVMaXN0LCB0aGlzLnJvb3RJZCkucGlwZShcbiAgICAgICAgICBtYXAocmVzID0+IHtcbiAgICAgICAgICAgIC8vIGlmIChyZXMgIT0gbnVsbClcbiAgICAgICAgICAgIC8vICAgdGhpcy5tc2dTZXJ2aWNlLmVycm9yKCfkv53lrZjliLAnICsgdGhpcy5zdG9yYWdlRXh0ZW5zaW9uLmV4dGVuc2lvbk5hbWUgKyBcIuWksei0pe+8jOS4iuS8oOaWh+S7tuiHquWKqOS/neWtmOWIsFwiICsgdGhpcy5zdG9yYWdlRXh0ZW5zaW9uLmRlZmF1bHRQcm9wZXJ0eU5hbWUgKyBcIuWtmOWCqOOAglwiICsgcmVzLmVycm9yLk1lc3NhZ2UpO1xuICAgICAgICAgICAgbG9hZGluZy5jbG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudXBsb2FkRmlsZUluZm9MaXN0O1xuICAgICAgICAgIH0pKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNhbmNlbCgpIHtcbiAgICBpZiAodGhpcy51cGxvYWRGaWxlSW5mb0xpc3QubGVuZ3RoID09IDApXG4gICAgICByZXR1cm47XG4gICAgdGhpcy51cGxvYWRGaWxlSW5mb0xpc3QuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIHRoaXMubWV0YWRhdGFJZExpc3QucHVzaChlbGVtZW50Lm1ldGFkYXRhSWQpO1xuICAgIH0pXG4gICAgdGhpcy51cGxvYWRTZXJ2aWNlLmNhbmNlbCh0aGlzLm1ldGFkYXRhSWRMaXN0LCB0aGlzLnJvb3RJZCkuc3Vic2NyaWJlKCk7XG5cbiAgfVxuXG4gIGdldFVwbG9hZEZpbGVJbmZvTGlzdCgpIHtcbiAgICByZXR1cm4gdGhpcy51cGxvYWRGaWxlSW5mb0xpc3Q7XG4gIH1cblxuICBkZWxldGUoZmlsZSkge1xuICAgIHRoaXMuZmlsZXMuc3BsaWNlKHRoaXMuZmlsZXMuaW5kZXhPZihmaWxlKSwgMSk7XG4gICAgaWYgKGZpbGUudXBsb2FkUmVzdWx0KVxuICAgICAgdGhpcy51cGxvYWRlZEZpbGVUb3RhbC0tO1xuICAgIGlmICh0aGlzLmV4U3RvcmFnZUZpbGVMaXN0LmZpbHRlcih4ID0+IHgubWV0YWRhdGFJZCA9PSBmaWxlLmlkKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmV4U3RvcmFnZUZpbGVMaXN0LnNwbGljZSh0aGlzLmV4U3RvcmFnZUZpbGVMaXN0LmZpbmRJbmRleCh4ID0+IHgubWV0YWRhdGFJZCA9PSBmaWxlLmlkKSwgMSk7XG4gICAgfVxuXG4gIH1cblxuICBnZXRGaWxlU2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICBpZiAoc2l6ZSA8IDEwMjQwMClcbiAgICAgIHJldHVybiAoc2l6ZSAvIDEwMjQpLnRvRml4ZWQoMSkgKyBcIktcIjtcbiAgICBlbHNlIGlmIChzaXplIDwgMTAyNCAqIDEwMjQpXG4gICAgICByZXR1cm4gKHNpemUgLyAxMDI0KS50b0ZpeGVkKDApICsgXCJLXCI7XG4gICAgZWxzZSBpZiAoc2l6ZSA8IDEwMCAqIDEwMjQgKiAxMDI0KVxuICAgICAgcmV0dXJuIChzaXplIC8gMTAyNCAvIDEwMjQpLnRvRml4ZWQoMSkgKyBcIk1cIjtcbiAgICBlbHNlIGlmIChzaXplIDwgMTAyNCAqIDEwMjQgKiAxMDI0KVxuICAgICAgcmV0dXJuIChzaXplIC8gMTAyNCAvIDEwMjQpLnRvRml4ZWQoMCkgKyBcIk1cIjtcbiAgICBlbHNlXG4gICAgICByZXR1cm4gKHNpemUgLyAxMDI0IC8gMTAyNCAvIDEwMjQpLnRvRml4ZWQoMSkgKyBcIkdcIjtcbiAgfVxuICBzaG93QnlHcm91cCgpIHtcbiAgICB0aGlzLnNob3dUeXBlID0gMDtcbiAgICAvLyB0aGlzLnNlbGVjdGVkRmlsZUNvdW50ID0gMDtcbiAgfVxuXG4gIHNob3dCeUxpc3QoKSB7XG4gICAgdGhpcy5zaG93VHlwZSA9IDE7XG4gICAgLy8gdGhpcy5zZWxlY3RlZEZpbGVDb3VudCA9IDA7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGaWxlQ291bnQgIT0gMCAmJiB0aGlzLnNlbGVjdGVkRmlsZUNvdW50ID09IHRoaXMuZmlsZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmZpbGVBbGxTZWxlY3RlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgbW91c2VPdmVyKGZpbGUpIHtcbiAgICBmaWxlLm1vdXNlT24gPSB0cnVlO1xuICB9XG4gIG1vdXNlT3V0KGZpbGUpIHtcbiAgICBmaWxlLm1vdXNlT24gPSBmYWxzZTtcbiAgfVxuXG59XG5cblxuIl19