@adlfe/campaign-management-library 2.15.6 → 2.15.7

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.
@@ -345,6 +345,9 @@ var GeneralInformationWAComponent = /** @class */ (function () {
345
345
  if (messageType === 'utility') {
346
346
  parameterList.push(this.initParam('isDirectSend', true, 'string'));
347
347
  }
348
+ else {
349
+ parameterList.push(this.initParam('isDirectSend', false, 'string'));
350
+ }
348
351
  var subs = this.apiAdapterService
349
352
  .executeApiRequest(parameterList, '/message/template', 'GET')
350
353
  .subscribe(function (resp) {
@@ -470,6 +473,29 @@ var GeneralInformationWAComponent = /** @class */ (function () {
470
473
  enumerable: true,
471
474
  configurable: true
472
475
  });
476
+ Object.defineProperty(GeneralInformationWAComponent.prototype, "hasAnyCarouselVariables", {
477
+ get: function () {
478
+ var _this = this;
479
+ var carouselArray = this.form.get('paramCarousel');
480
+ if (!carouselArray || carouselArray.length === 0)
481
+ return false;
482
+ return carouselArray.controls.some(function (_, cIndex) { return _this.checkCardHasVariables(cIndex); });
483
+ },
484
+ enumerable: true,
485
+ configurable: true
486
+ });
487
+ GeneralInformationWAComponent.prototype.checkCardHasVariables = function (cIndex) {
488
+ var _a;
489
+ var bodyLen = ((_a = this.getCarouselBodyParams(cIndex)) === null || _a === void 0 ? void 0 : _a.controls.length) || 0;
490
+ var buttonGroups = this.form.get('paramCarousel')
491
+ .at(cIndex)
492
+ .get('buttonParams');
493
+ var hasBtnInput = false;
494
+ if (buttonGroups) {
495
+ hasBtnInput = buttonGroups.controls.some(function (btnGroup) { return btnGroup.length > 0; });
496
+ }
497
+ return bodyLen > 0 || hasBtnInput;
498
+ };
473
499
  GeneralInformationWAComponent.prototype.getCarouselButtons = function (cardIndex) {
474
500
  var _a, _b, _c, _d;
475
501
  var templateValue = (_a = this.form.get('template')) === null || _a === void 0 ? void 0 : _a.value;
@@ -571,7 +597,7 @@ var GeneralInformationWAComponent = /** @class */ (function () {
571
597
  });
572
598
  GeneralInformationWAComponent.prototype.updateTemplate = function (template) {
573
599
  var _this = this;
574
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47;
600
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48;
575
601
  this.isShowParameter = false;
576
602
  if (!template)
577
603
  return;
@@ -654,6 +680,7 @@ var GeneralInformationWAComponent = /** @class */ (function () {
654
680
  this.variables.clear();
655
681
  if (((_36 = template.body) === null || _36 === void 0 ? void 0 : _36.examples) && template.body.examples.length > 0) {
656
682
  var isSavedTemplateMatches_1 = ((_38 = (_37 = formStorage) === null || _37 === void 0 ? void 0 : _37.template) === null || _38 === void 0 ? void 0 : _38.name) === template.name;
683
+ var isUtilityTemplate_1 = ((_39 = template.category) === null || _39 === void 0 ? void 0 : _39.toUpperCase()) === 'UTILITY';
657
684
  template.body.examples.forEach(function (exampleValue, index) {
658
685
  var _a, _b, _c, _d, _e, _f, _g;
659
686
  var savedVariable = '';
@@ -665,13 +692,13 @@ var GeneralInformationWAComponent = /** @class */ (function () {
665
692
  paramName: new FormControl({
666
693
  value: finalValue,
667
694
  disabled: _this.isReadOnlyMode,
668
- }),
695
+ }, isUtilityTemplate_1 ? Validators.required : null),
669
696
  }));
670
697
  });
671
698
  }
672
- if ((_39 = template.body) === null || _39 === void 0 ? void 0 : _39.text) {
673
- (_40 = this.getControl('text')) === null || _40 === void 0 ? void 0 : _40.setValue(template.body.text);
674
- (_41 = this.getControl('text')) === null || _41 === void 0 ? void 0 : _41.updateValueAndValidity();
699
+ if ((_40 = template.body) === null || _40 === void 0 ? void 0 : _40.text) {
700
+ (_41 = this.getControl('text')) === null || _41 === void 0 ? void 0 : _41.setValue(template.body.text);
701
+ (_42 = this.getControl('text')) === null || _42 === void 0 ? void 0 : _42.updateValueAndValidity();
675
702
  }
676
703
  // ==========================================================
677
704
  // ==========================================================
@@ -679,11 +706,11 @@ var GeneralInformationWAComponent = /** @class */ (function () {
679
706
  // ==========================================================
680
707
  var carouselArray = this.form.get('paramCarousel');
681
708
  carouselArray.clear();
682
- var isUsingUpload = (_42 = this.getControl('isUpload')) === null || _42 === void 0 ? void 0 : _42.value;
709
+ var isUsingUpload = (_43 = this.getControl('isUpload')) === null || _43 === void 0 ? void 0 : _43.value;
683
710
  var dynamicValidator = isUsingUpload ? null : Validators.required;
684
711
  if (template.carousel && template.carousel.length > 0) {
685
- var isSavedTemplateMatches = ((_44 = (_43 = formStorage) === null || _43 === void 0 ? void 0 : _43.template) === null || _44 === void 0 ? void 0 : _44.name) === template.name;
686
- var savedUserInputs_1 = isSavedTemplateMatches ? (_45 = formStorage) === null || _45 === void 0 ? void 0 : _45.paramCarousel : null;
712
+ var isSavedTemplateMatches = ((_45 = (_44 = formStorage) === null || _44 === void 0 ? void 0 : _44.template) === null || _45 === void 0 ? void 0 : _45.name) === template.name;
713
+ var savedUserInputs_1 = isSavedTemplateMatches ? (_46 = formStorage) === null || _46 === void 0 ? void 0 : _46.paramCarousel : null;
687
714
  template.carousel.forEach(function (card, cardIdx) {
688
715
  var _a, _b, _c, _d, _e;
689
716
  var cardGroup = new FormGroup({
@@ -731,7 +758,7 @@ var GeneralInformationWAComponent = /** @class */ (function () {
731
758
  carouselArray.push(cardGroup);
732
759
  });
733
760
  }
734
- (_46 = template.buttons) === null || _46 === void 0 ? void 0 : _46.forEach(function (each, index) {
761
+ (_47 = template.buttons) === null || _47 === void 0 ? void 0 : _47.forEach(function (each, index) {
735
762
  var _a, _b, _c, _d;
736
763
  _this.addParamButton();
737
764
  var button = _this.getButton;
@@ -763,7 +790,7 @@ var GeneralInformationWAComponent = /** @class */ (function () {
763
790
  (_b = ctrl.get('name')) === null || _b === void 0 ? void 0 : _b.updateValueAndValidity();
764
791
  });
765
792
  paramBodyArray.updateValueAndValidity();
766
- this.toggleExcelValidation((_47 = this.form.get('isUpload')) === null || _47 === void 0 ? void 0 : _47.value);
793
+ this.toggleExcelValidation((_48 = this.form.get('isUpload')) === null || _48 === void 0 ? void 0 : _48.value);
767
794
  };
768
795
  GeneralInformationWAComponent.prototype.updateMediaType = function (_mediaType) {
769
796
  if (_mediaType === EnumData.MEDIA_TYPE_LOCATION)
@@ -1047,11 +1074,11 @@ var GeneralInformationWAComponent = /** @class */ (function () {
1047
1074
  GeneralInformationWAComponent = __decorate([
1048
1075
  Component({
1049
1076
  selector: 'lib-general-information-wa',
1050
- template: "<form autocomplete=\"off\" [formGroup]=\"form\">\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">Message Type</mat-label>\r\n <mat-select placeholder=\"Select message type\" formControlName=\"channel\">\r\n <mat-option\r\n *ngFor=\"let option of msgTypeWAOption\"\r\n [value]=\"option.code\"\r\n (click)=\"formReset()\"\r\n >\r\n {{ option.name }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.channel\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('channel')?.touched && form.get('channel')?.hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n\r\n <div\r\n *ngIf=\"!getIsTemplate\"\r\n role=\"alert\"\r\n class=\"alert alert-warning d-flex align-items-center\"\r\n style=\"margin-top: 16px; border: 1px solid rgb(243, 124, 44)\"\r\n >\r\n <mat-icon style=\"margin-right: 10px !important\">error_outline</mat-icon>\r\n <div *ngIf=\"!getIsUtility\">\r\n If you select this channel, keep in mind that the message might not be delivered to\r\n all selected customers. This is because the customer must have had a conversation\r\n previously with BSP.\r\n </div>\r\n\r\n <div *ngIf=\"getIsUtility\">\r\n You can send directly a utility message. You can choose between existing utility\r\n templates or creating a new one. If you create a new template, the system may check\r\n whether the content already exists as a template.\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"getIsText\">\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">From</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"from\"\r\n placeholder=\"Select from\"\r\n [complete]=\"isHaveNextAccountOption === false\"\r\n [compareWith]=\"accountSelectedDisplay\"\r\n (infiniteScroll)=\"getNextAccountBatch()\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('from').value?.name\"\r\n (searchRes)=\"updateSearchAccount($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name + ' (' + option.accountNo + ')' }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingAccountOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.from\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('from').touched && form.get('from').hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label class=\"asterix--after\">Text</mat-label>\r\n\r\n <textarea\r\n matInput\r\n rows=\"6\"\r\n cols=\"50\"\r\n cdkTextareaAutosize\r\n cdkAutosizeMinRows=\"2\"\r\n cdkAutosizeMaxRows=\"15\"\r\n formControlName=\"text\"\r\n placeholder=\"Enter text\"\r\n #autosize=\"cdkTextareaAutosize\"\r\n ></textarea>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.text\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('text')?.touched && form.get('text')?.hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"getIsMedia\">\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">Media Type</mat-label>\r\n\r\n <mat-select\r\n placeholder=\"Select media type\"\r\n formControlName=\"media\"\r\n (selectionChange)=\"updateMediaType($event.value)\"\r\n >\r\n <mat-option *ngFor=\"let option of mediaTypeOption\" [value]=\"option.code\">\r\n {{ option.name }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.media\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('media').touched && form.get('media').hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">From</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"from\"\r\n placeholder=\"Select from\"\r\n [complete]=\"isHaveNextAccountOption === false\"\r\n [compareWith]=\"accountSelectedDisplay\"\r\n (infiniteScroll)=\"getNextAccountBatch()\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('from').value?.name\"\r\n (searchRes)=\"updateSearchAccount($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name + ' (' + option.accountNo + ')' }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingAccountOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.from\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('from').touched && form.get('from').hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <ng-container *ngIf=\"form.get('media').value?.toLowerCase() !== 'location'\">\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">File</mat-label>\r\n\r\n <input\r\n matInput\r\n type=\"text\"\r\n autocomplete=\"off\"\r\n (click)=\"filePicker.click()\"\r\n formControlName=\"fileName\"\r\n />\r\n\r\n <button\r\n mat-button\r\n matSuffix\r\n mat-icon-button\r\n aria-label=\"Choose File\"\r\n (click)=\"filePicker.click()\"\r\n >\r\n <mat-icon>attach_file</mat-icon>\r\n </button>\r\n\r\n <input\r\n #filePicker\r\n hidden\r\n type=\"file\"\r\n [accept]=\"extFileAccepted\"\r\n (change)=\"onFileSelected($event)\"\r\n />\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.fileName\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('fileName').touched &&\r\n form.get('fileName').hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"form.get('media').value?.toLowerCase() === 'location'\">\r\n <div class=\"w-100\">\r\n <h4 class=\"asterix--after\">Location</h4>\r\n\r\n <div class=\"w-100\">\r\n <agm-map\r\n style=\"width: 100%; height: 400px\"\r\n [latitude]=\"maps.latitude\"\r\n [longitude]=\"maps.longitude\"\r\n [disableDoubleClickZoom]=\"maps.isDoubleClickZoom\"\r\n [zoom]=\"maps.zoom\"\r\n >\r\n <agm-marker\r\n [latitude]=\"maps.latitude\"\r\n [longitude]=\"maps.longitude\"\r\n [markerDraggable]=\"maps.isDraggable\"\r\n (dragEnd)=\"markerDragEnd($event)\"\r\n ></agm-marker>\r\n </agm-map>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label>Location</mat-label>\r\n\r\n <input\r\n #mapSearch\r\n matInput\r\n type=\"text\"\r\n maxlength=\"100\"\r\n placeholder=\"Enter location here\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"getIsTemplate\">\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">From</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"from\"\r\n placeholder=\"Select from\"\r\n [complete]=\"isHaveNextAccountOption === false\"\r\n [compareWith]=\"accountSelectedDisplay\"\r\n (infiniteScroll)=\"getNextAccountBatch()\"\r\n (selectionChange)=\"getTemplateOptionService($event.value)\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('from').value?.name\"\r\n (searchRes)=\"updateSearchAccount($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name + ' (' + option.accountNo + ')' }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingAccountOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.from\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('from')?.touched && form.get('from')?.hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">Template</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"template\"\r\n placeholder=\"Select template\"\r\n [complete]=\"isHaveNextTemplateOption === false\"\r\n [compareWith]=\"templateSelectedDisplay\"\r\n (infiniteScroll)=\"getNextTemplateBatch()\"\r\n (selectionChange)=\"updateTemplate($event.value)\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('template').value?.name\"\r\n (searchRes)=\"updateSearch($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of templateOption\" [value]=\"option\">\r\n {{ option.name }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingTemplateOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.template\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('template')?.touched &&\r\n form.get('template')?.hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div *ngIf=\"isHaveTemplateParam\" class=\"d-flex justify-content-end\">\r\n <mat-checkbox\r\n labelPosition=\"before\"\r\n formControlName=\"isUpload\"\r\n (change)=\"updateDownloadCSV($event.checked)\"\r\n >\r\n Using Download XLSX\r\n </mat-checkbox>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!form.get('isUpload')?.value\">\r\n <div\r\n *ngIf=\"form.get('template')?.value?.category === 'AUTHENTICATION'\"\r\n class=\"form-group\"\r\n >\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label> OTP Value </mat-label>\r\n\r\n <input matInput type=\"text\" formControlName=\"otpValue\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <ng-container *ngIf=\"getParamHeader?.length > 0\">\r\n <p class=\"font-16px font-PoppinsBold\">Header Parameter</p>\r\n\r\n <div\r\n *ngFor=\"let param of getParamHeader; let paramHeaderIndex = index\"\r\n class=\"form-group\"\r\n >\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label>Parameter {{ paramHeaderIndex + 1 }}</mat-label>\r\n\r\n <input\r\n matInput\r\n type=\"text\"\r\n [placeholder]=\"'Parameter ' + (paramHeaderIndex + 1)\"\r\n [formControl]=\"param.get('name')\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"getParamBody?.length > 0\">\r\n <p class=\"font-16px font-PoppinsBold mt-3\">Body Parameter</p>\r\n\r\n <div\r\n *ngFor=\"let param of getParamBody; let paramBodyIndex = index\"\r\n class=\"form-group\"\r\n >\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label>Parameter {{ paramBodyIndex + 1 }}</mat-label>\r\n\r\n <input\r\n matInput\r\n type=\"text\"\r\n [placeholder]=\"'Parameter ' + (paramBodyIndex + 1)\"\r\n [formControl]=\"param.get('name')\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </ng-container>\r\n <!-- rizal -->\r\n <h5\r\n class=\"mb-3 font-weight-bold mt-4\"\r\n *ngIf=\"(!isUsingExcelBulk && buttonParamsControls.length > 0) || isShowParameter\"\r\n >\r\n Button Parameter\r\n </h5>\r\n <div\r\n class=\"button-parameter-section\"\r\n *ngIf=\"buttonParamsControls.length > 0 && !isUsingExcelBulk\"\r\n >\r\n <div formArrayName=\"buttonParams\">\r\n <div\r\n *ngFor=\"let btnControl of buttonParamsControls; let i = index\"\r\n [formGroupName]=\"i\"\r\n >\r\n <p class=\"font-14px font-PoppinsBold mt-3\">Button {{ i + 1 }}</p>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label>Parameter 1</mat-label>\r\n <input\r\n matInput\r\n type=\"text\"\r\n formControlName=\"payload\"\r\n placeholder=\"Parameter 1\"\r\n maxlength=\"256\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- titus -->\r\n <ng-container *ngIf=\"isShowParameter\">\r\n <ng-container *ngFor=\"let button of getButton; let buttonIndex = index\">\r\n <ng-container *ngIf=\"getParamButton(buttonIndex)?.length > 0\">\r\n <p class=\"font-14px font-PoppinsBold mt-3\">Button {{ buttonIndex + 1 }}</p>\r\n\r\n <div\r\n *ngFor=\"\r\n let param of getParamButton(buttonIndex);\r\n let paramIndex = index\r\n \"\r\n class=\"form-group\"\r\n >\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label>Parameter {{ paramIndex + 1 }}</mat-label>\r\n\r\n <input\r\n matInput\r\n type=\"text\"\r\n [placeholder]=\"'Parameter ' + (paramIndex + 1)\"\r\n [formControl]=\"param.get('name')\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container\r\n *ngIf=\"\r\n ['image', 'video', 'document'].includes(\r\n form.get('template')?.value?.header?.type?.toLowerCase()\r\n )\r\n \"\r\n >\r\n <p class=\"font-16px font-PoppinsBold mt-3\">File</p>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">File</mat-label>\r\n\r\n <input\r\n matInput\r\n type=\"text\"\r\n autocomplete=\"off\"\r\n (click)=\"filePicker.click()\"\r\n formControlName=\"fileName\"\r\n />\r\n\r\n <button\r\n mat-button\r\n matSuffix\r\n mat-icon-button\r\n aria-label=\"Choose File\"\r\n (click)=\"filePicker.click()\"\r\n >\r\n <mat-icon>attach_file</mat-icon>\r\n </button>\r\n\r\n <input\r\n #filePicker\r\n hidden\r\n type=\"file\"\r\n [accept]=\"extFileAccepted\"\r\n (change)=\"onFileSelected($event)\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </ng-container>\r\n <!-- ========================================== -->\r\n <!-- CAROUSEL DYNAMIC VARIABLES -->\r\n <!-- ========================================== -->\r\n <div\r\n class=\"existing-template-variables mt-4\"\r\n *ngIf=\"!form.get('isUpload')?.value && getCarouselControls.length > 0\"\r\n >\r\n <p class=\"font-16px font-PoppinsBold mt-3\">Carousel Configuration</p>\r\n <div formArrayName=\"paramCarousel\">\r\n <div\r\n *ngFor=\"let card of getCarouselControls; let cIndex = index\"\r\n [formGroupName]=\"cIndex\"\r\n class=\"card-container mb-4 p-3\"\r\n style=\"border: 1px solid #e0e0e0; border-radius: 8px\"\r\n >\r\n <div class=\"font-bold font-14px mb-3\">Card {{ cIndex + 1 }}</div>\r\n <div *ngIf=\"getCarouselBodyParams(cIndex).controls.length > 0\" class=\"mb-3\">\r\n <div class=\"font-bold font-12px mb-2\">Body Variables</div>\r\n <div formArrayName=\"bodyParams\">\r\n <div\r\n *ngFor=\"\r\n let bParam of getCarouselBodyParams(cIndex).controls;\r\n let bIndex = index\r\n \"\r\n [formGroupName]=\"bIndex\"\r\n class=\"form-group mb-3\"\r\n >\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100 custom-variable-field\"\r\n >\r\n <mat-label\r\n >Body {{ '{' + '{' + (bIndex + 1) + '}' + '}' }}</mat-label\r\n >\r\n <input\r\n matInput\r\n type=\"text\"\r\n formControlName=\"paramName\"\r\n placeholder=\"Input value here...\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n <div formArrayName=\"buttonParams\">\r\n <div *ngFor=\"let btn of getCarouselButtons(cIndex); let btnIndex = index\">\r\n <div\r\n *ngIf=\"getCarouselBtnParams(cIndex, btnIndex).controls.length > 0\"\r\n [formGroupName]=\"btnIndex\"\r\n class=\"mt-2\"\r\n >\r\n <div class=\"font-bold font-12px mb-2\">Button: {{ btn.text }}</div>\r\n <div\r\n *ngFor=\"\r\n let pBtn of getCarouselBtnParams(cIndex, btnIndex).controls;\r\n let pBtnIdx = index\r\n \"\r\n [formGroupName]=\"pBtnIdx\"\r\n class=\"form-group mb-3\"\r\n >\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100 custom-variable-field\"\r\n >\r\n <mat-label>\r\n {{\r\n btn.type === 'QUICK_REPLY'\r\n ? 'Payload'\r\n : btn.type === 'URL'\r\n ? 'URL Variable ' + (pBtnIdx + 1)\r\n : 'Param ' + (pBtnIdx + 1)\r\n }}\r\n </mat-label>\r\n\r\n <!-- Input khusus untuk QUICK_REPLY (binding ke formControlName=\"payload\") -->\r\n <input\r\n *ngIf=\"btn.type === 'QUICK_REPLY'\"\r\n matInput\r\n type=\"text\"\r\n formControlName=\"payload\"\r\n placeholder=\"Input payload value...\"\r\n />\r\n\r\n <!-- Input khusus untuk Variable Biasa / URL (binding ke formControlName=\"paramName\") -->\r\n <input\r\n *ngIf=\"btn.type !== 'QUICK_REPLY'\"\r\n matInput\r\n type=\"text\"\r\n formControlName=\"paramName\"\r\n placeholder=\"Input value here...\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"getIsCatalogue\">\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">From</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"from\"\r\n placeholder=\"Select from\"\r\n [complete]=\"isHaveNextAccountOption === false\"\r\n [compareWith]=\"accountSelectedDisplay\"\r\n (infiniteScroll)=\"getNextAccountBatch()\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('from').value?.name\"\r\n (searchRes)=\"updateSearchAccount($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name + ' (' + option.accountNo + ')' }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingAccountOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.from\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('from')?.touched && form.get('from')?.hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">Category</mat-label>\r\n\r\n <mat-select formControlName=\"category\" placeholder=\"Select category\">\r\n <mat-option *ngFor=\"let option of categoryOption\" [value]=\"option.value\">\r\n {{ option.label }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.category\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('category')?.touched &&\r\n form.get('category')?.hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">Catalog</mat-label>\r\n\r\n <mat-select formControlName=\"catalogue\" placeholder=\"Select catalog\">\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.catalogue\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('catalogue')?.touched &&\r\n form.get('catalogue')?.hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"form.get('category')?.value === 'product'\"\r\n style=\"padding: 8px; border-radius: 8px; border: 1px solid #6177c4\"\r\n >\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">Product</mat-label>\r\n\r\n <mat-select formControlName=\"product\" placeholder=\"Select product\">\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.product\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('product')?.touched &&\r\n form.get('product')?.hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label>Body</mat-label>\r\n\r\n <input\r\n matInput\r\n type=\"text\"\r\n maxlength=\"100\"\r\n formControlName=\"body\"\r\n placeholder=\"Enter body\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"getIsUtility\">\r\n <div style=\"display: grid; gap: 0.5rem\">\r\n <mat-label class=\"asterix--after\">Template</mat-label>\r\n <mat-radio-group\r\n style=\"display: flex; gap: 0.5rem; flex-wrap: wrap\"\r\n formControlName=\"isUseExistingTemplate\"\r\n (change)=\"handleChangeTemplate($event.value)\"\r\n >\r\n <mat-radio-button\r\n [value]=\"option.value\"\r\n *ngFor=\"let option of templates\"\r\n color=\"primary\"\r\n >\r\n {{ option.label }}\r\n </mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">From</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"from\"\r\n placeholder=\"Select from\"\r\n [complete]=\"isHaveNextAccountOption === false\"\r\n [compareWith]=\"accountSelectedDisplay\"\r\n (infiniteScroll)=\"getNextAccountBatch()\"\r\n (selectionChange)=\"handleChangeFrom($event.value)\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('from').value?.name\"\r\n (searchRes)=\"updateSearchAccount($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name + ' (' + option.accountNo + ')' }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingAccountOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.from\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('from')?.touched && form.get('from')?.hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!form.get('isUseExistingTemplate')?.value; else existingTmpl\">\r\n <ng-container *ngTemplateOutlet=\"stageAlertTmpl\"></ng-container>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label class=\"asterix--after\">Body</mat-label>\r\n\r\n <textarea\r\n matInput\r\n rows=\"6\"\r\n cols=\"50\"\r\n cdkTextareaAutosize\r\n cdkAutosizeMinRows=\"2\"\r\n cdkAutosizeMaxRows=\"15\"\r\n formControlName=\"text\"\r\n placeholder=\"Enter text\"\r\n #autosize=\"cdkTextareaAutosize\"\r\n ></textarea>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.text\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('text').touched && form.get('text').hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <app-input\r\n type=\"numeric\"\r\n formControlName=\"ttl\"\r\n label=\"TTL\"\r\n placeholder=\"Enter ttl\"\r\n [trimLeadingZeros]=\"true\"\r\n suffix=\"seconds\"\r\n hint=\"The default TTL is 30 days (2,592,000 seconds) if no value is provided.\"\r\n ></app-input>\r\n </div>\r\n\r\n <div *ngIf=\"!isReadOnlyMode\">\r\n <mat-checkbox formControlName=\"isNeedSave\">\r\n Save this message as future template\r\n </mat-checkbox>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- VARIABLES START -->\r\n <ng-container *ngIf=\"!form.get('isDownloadVariableXLS')?.value\">\r\n <div class=\"template-container mt-5\" *ngIf=\"!form.get('isUseExistingTemplate')?.value\">\r\n <div class=\"add-variable-wrapper\">\r\n <button mat-button class=\"btn-add-variable\" (click)=\"addVariable()\">\r\n <mat-icon class=\"icon-small\">add</mat-icon> Add Variable\r\n </button>\r\n </div>\r\n\r\n <div class=\"body-content-wrapper\">\r\n <h3 class=\"body-content-title\">Body Content</h3>\r\n <p class=\"body-content-subtitle\">\r\n Input the parameter to show during the preview\r\n </p>\r\n\r\n <div class=\"variables-list\" formArrayName=\"variables\">\r\n <div\r\n class=\"variable-row d-flex align-items-start mb-3\"\r\n *ngFor=\"let variable of variables.controls; let i = index\"\r\n [formGroupName]=\"i\"\r\n >\r\n <div class=\"variable-sequence mr-3\">\r\n {{ '{' + '{' + (i + 1) + '}' + '}' }}\r\n </div>\r\n <div class=\"variable-input-wrapper flex-grow-1\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100 bg-white-field\"\r\n >\r\n <mat-label>Variable {{ i + 1 }}</mat-label>\r\n <!-- Tambahin label biar cakep -->\r\n <input\r\n matInput\r\n type=\"text\"\r\n formControlName=\"paramName\"\r\n placeholder=\"e.g. Name, Verification code\"\r\n />\r\n </mat-form-field>\r\n\r\n <ng-container\r\n *ngFor=\"let validation of validationMessages?.paramName\"\r\n >\r\n <div\r\n class=\"custom-error-text text-right\"\r\n *ngIf=\"\r\n variable.get('paramName')?.hasError(validation.type) &&\r\n (variable.get('paramName')?.touched ||\r\n variable.get('paramName')?.dirty)\r\n \"\r\n >\r\n <span class=\"font-12px m-0\">{{ validation.message }}</span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"btn-delete ml-3\"\r\n (click)=\"removeVariable(i)\"\r\n >\r\n <mat-icon color=\"warn\">delete_outline</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- ====================================================== -->\r\n <!-- VIEW 2: USE EXISTING TEMPLATE (UI Clean, cuma input) -->\r\n <!-- ====================================================== -->\r\n <div\r\n class=\"existing-template-variables mt-4\"\r\n *ngIf=\"form.get('isUseExistingTemplate')?.value && variables.controls.length > 0\"\r\n >\r\n <div class=\"font-bold mb-3\">Variables</div>\r\n <!-- Looping array yang sama persis, tapi tanpa ornamen -->\r\n <div formArrayName=\"variables\">\r\n <div\r\n class=\"form-group mb-3\"\r\n *ngFor=\"let variable of variables.controls; let i = index\"\r\n [formGroupName]=\"i\"\r\n >\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100 custom-variable-field\"\r\n >\r\n <!-- Label dinamis: {{1}}, {{2}}, dst -->\r\n <mat-label>{{ '{' + '{' + (i + 1) + '}' + '}' }}</mat-label>\r\n <input\r\n matInput\r\n type=\"text\"\r\n formControlName=\"paramName\"\r\n placeholder=\"Input value here...\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- Validasi Error -->\r\n <ng-container *ngFor=\"let validation of validationMessages?.paramName\">\r\n <div\r\n class=\"custom-error-text text-right\"\r\n *ngIf=\"\r\n variable.get('paramName')?.hasError(validation.type) &&\r\n (variable.get('paramName')?.touched ||\r\n variable.get('paramName')?.dirty)\r\n \"\r\n >\r\n <span class=\"font-12px m-0\">{{ validation.message }}</span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div\r\n class=\"d-flex justify-content-end\"\r\n *ngIf=\"variables.controls.length > 0 || form.get('isDownloadVariableXLS')?.value\"\r\n >\r\n <mat-checkbox\r\n labelPosition=\"before\"\r\n formControlName=\"isDownloadVariableXLS\"\r\n (change)=\"updateVariableDownloadXLS($event.checked)\"\r\n >\r\n Using Download XLSX\r\n </mat-checkbox>\r\n </div>\r\n <!--VARIABLES END -->\r\n\r\n <ng-template #existingTmpl>\r\n <ng-container *ngTemplateOutlet=\"stageAlertTmpl\"></ng-container>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">Template</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"template\"\r\n placeholder=\"Select template\"\r\n [complete]=\"isHaveNextTemplateOption === false\"\r\n [compareWith]=\"templateSelectedDisplay\"\r\n (infiniteScroll)=\"getNextTemplateBatch()\"\r\n (selectionChange)=\"updateTemplate($event.value)\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('template').value?.name\"\r\n (searchRes)=\"updateSearch($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of templateOption\" [value]=\"option\">\r\n {{ option.name }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingTemplateOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.template\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('template')?.touched &&\r\n form.get('template')?.hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <app-input\r\n type=\"numeric\"\r\n formControlName=\"ttl\"\r\n label=\"TTL\"\r\n placeholder=\"Enter ttl\"\r\n [trimLeadingZeros]=\"true\"\r\n suffix=\"Seconds\"\r\n hint=\"The default TTL is 30 days (2,592,000 seconds) if no value is provided.\"\r\n ></app-input>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n</form>\r\n\r\n<ng-template #stageAlertTmpl>\r\n <div\r\n role=\"alert\"\r\n class=\"alert alert-warning d-flex align-items-center\"\r\n style=\"margin-top: 8px; border: 1px solid rgb(243, 124, 44)\"\r\n *ngIf=\"form.get('from')?.value && form.get('from')?.value?.directSendRestrictionStage > 0\"\r\n >\r\n <mat-icon style=\"margin-right: 10px !important\">error_outline</mat-icon>\r\n\r\n <div *ngIf=\"form.get('from')?.value?.directSendRestrictionStage === 1\">\r\n Direct Send misuse detected. Please review your messaging practices.\r\n </div>\r\n <div *ngIf=\"form.get('from')?.value?.directSendRestrictionStage === 2\">\r\n Direct Send access restricted for 7 days due to continued misuse.\r\n </div>\r\n\r\n <div *ngIf=\"form.get('from')?.value?.directSendRestrictionStage === 3\">\r\n Direct Send access restricted for 30 days due to continued misuse. Final warning before\r\n permanent revocation.\r\n </div>\r\n\r\n <div *ngIf=\"form.get('from')?.value?.directSendRestrictionStage === 4\">\r\n Direct Send access has been permanently revoked.\r\n </div>\r\n </div>\r\n</ng-template>\r\n",
1077
+ template: "<form autocomplete=\"off\" [formGroup]=\"form\">\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">Message Type</mat-label>\r\n <mat-select placeholder=\"Select message type\" formControlName=\"channel\">\r\n <mat-option\r\n *ngFor=\"let option of msgTypeWAOption\"\r\n [value]=\"option.code\"\r\n (click)=\"formReset()\"\r\n >\r\n {{ option.name }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.channel\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('channel')?.touched && form.get('channel')?.hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n\r\n <div\r\n *ngIf=\"!getIsTemplate\"\r\n role=\"alert\"\r\n class=\"alert alert-warning d-flex align-items-center\"\r\n style=\"margin-top: 16px; border: 1px solid rgb(243, 124, 44)\"\r\n >\r\n <mat-icon style=\"margin-right: 10px !important\">error_outline</mat-icon>\r\n <div *ngIf=\"!getIsUtility\">\r\n If you select this channel, keep in mind that the message might not be delivered to\r\n all selected customers. This is because the customer must have had a conversation\r\n previously with BSP.\r\n </div>\r\n\r\n <div *ngIf=\"getIsUtility\">\r\n You can send directly a utility message. You can choose between existing utility\r\n templates or creating a new one. If you create a new template, the system may check\r\n whether the content already exists as a template.\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <ng-container *ngIf=\"getIsText\">\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">From</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"from\"\r\n placeholder=\"Select from\"\r\n [complete]=\"isHaveNextAccountOption === false\"\r\n [compareWith]=\"accountSelectedDisplay\"\r\n (infiniteScroll)=\"getNextAccountBatch()\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('from').value?.name\"\r\n (searchRes)=\"updateSearchAccount($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name + ' (' + option.accountNo + ')' }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingAccountOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.from\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('from').touched && form.get('from').hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label class=\"asterix--after\">Text</mat-label>\r\n\r\n <textarea\r\n matInput\r\n rows=\"6\"\r\n cols=\"50\"\r\n cdkTextareaAutosize\r\n cdkAutosizeMinRows=\"2\"\r\n cdkAutosizeMaxRows=\"15\"\r\n formControlName=\"text\"\r\n placeholder=\"Enter text\"\r\n #autosize=\"cdkTextareaAutosize\"\r\n ></textarea>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.text\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('text')?.touched && form.get('text')?.hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"getIsMedia\">\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">Media Type</mat-label>\r\n\r\n <mat-select\r\n placeholder=\"Select media type\"\r\n formControlName=\"media\"\r\n (selectionChange)=\"updateMediaType($event.value)\"\r\n >\r\n <mat-option *ngFor=\"let option of mediaTypeOption\" [value]=\"option.code\">\r\n {{ option.name }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.media\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('media').touched && form.get('media').hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">From</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"from\"\r\n placeholder=\"Select from\"\r\n [complete]=\"isHaveNextAccountOption === false\"\r\n [compareWith]=\"accountSelectedDisplay\"\r\n (infiniteScroll)=\"getNextAccountBatch()\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('from').value?.name\"\r\n (searchRes)=\"updateSearchAccount($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name + ' (' + option.accountNo + ')' }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingAccountOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.from\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('from').touched && form.get('from').hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <ng-container *ngIf=\"form.get('media').value?.toLowerCase() !== 'location'\">\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">File</mat-label>\r\n\r\n <input\r\n matInput\r\n type=\"text\"\r\n autocomplete=\"off\"\r\n (click)=\"filePicker.click()\"\r\n formControlName=\"fileName\"\r\n />\r\n\r\n <button\r\n mat-button\r\n matSuffix\r\n mat-icon-button\r\n aria-label=\"Choose File\"\r\n (click)=\"filePicker.click()\"\r\n >\r\n <mat-icon>attach_file</mat-icon>\r\n </button>\r\n\r\n <input\r\n #filePicker\r\n hidden\r\n type=\"file\"\r\n [accept]=\"extFileAccepted\"\r\n (change)=\"onFileSelected($event)\"\r\n />\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.fileName\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('fileName').touched &&\r\n form.get('fileName').hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"form.get('media').value?.toLowerCase() === 'location'\">\r\n <div class=\"w-100\">\r\n <h4 class=\"asterix--after\">Location</h4>\r\n\r\n <div class=\"w-100\">\r\n <agm-map\r\n style=\"width: 100%; height: 400px\"\r\n [latitude]=\"maps.latitude\"\r\n [longitude]=\"maps.longitude\"\r\n [disableDoubleClickZoom]=\"maps.isDoubleClickZoom\"\r\n [zoom]=\"maps.zoom\"\r\n >\r\n <agm-marker\r\n [latitude]=\"maps.latitude\"\r\n [longitude]=\"maps.longitude\"\r\n [markerDraggable]=\"maps.isDraggable\"\r\n (dragEnd)=\"markerDragEnd($event)\"\r\n ></agm-marker>\r\n </agm-map>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label>Location</mat-label>\r\n\r\n <input\r\n #mapSearch\r\n matInput\r\n type=\"text\"\r\n maxlength=\"100\"\r\n placeholder=\"Enter location here\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"getIsTemplate\">\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">From</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"from\"\r\n placeholder=\"Select from\"\r\n [complete]=\"isHaveNextAccountOption === false\"\r\n [compareWith]=\"accountSelectedDisplay\"\r\n (infiniteScroll)=\"getNextAccountBatch()\"\r\n (selectionChange)=\"getTemplateOptionService($event.value)\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('from').value?.name\"\r\n (searchRes)=\"updateSearchAccount($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name + ' (' + option.accountNo + ')' }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingAccountOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.from\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('from')?.touched && form.get('from')?.hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">Template</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"template\"\r\n placeholder=\"Select template\"\r\n [complete]=\"isHaveNextTemplateOption === false\"\r\n [compareWith]=\"templateSelectedDisplay\"\r\n (infiniteScroll)=\"getNextTemplateBatch()\"\r\n (selectionChange)=\"updateTemplate($event.value)\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('template').value?.name\"\r\n (searchRes)=\"updateSearch($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of templateOption\" [value]=\"option\">\r\n {{ option.name }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingTemplateOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.template\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('template')?.touched &&\r\n form.get('template')?.hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div *ngIf=\"isHaveTemplateParam\" class=\"d-flex justify-content-end\">\r\n <mat-checkbox\r\n labelPosition=\"before\"\r\n formControlName=\"isUpload\"\r\n (change)=\"updateDownloadCSV($event.checked)\"\r\n >\r\n Using Download XLSX\r\n </mat-checkbox>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!form.get('isUpload')?.value\">\r\n <div\r\n *ngIf=\"form.get('template')?.value?.category === 'AUTHENTICATION'\"\r\n class=\"form-group\"\r\n >\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label> OTP Value </mat-label>\r\n\r\n <input matInput type=\"text\" formControlName=\"otpValue\" />\r\n </mat-form-field>\r\n </div>\r\n\r\n <ng-container *ngIf=\"getParamHeader?.length > 0\">\r\n <p class=\"font-16px font-PoppinsBold\">Header Parameter</p>\r\n\r\n <div\r\n *ngFor=\"let param of getParamHeader; let paramHeaderIndex = index\"\r\n class=\"form-group\"\r\n >\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label>Parameter {{ paramHeaderIndex + 1 }}</mat-label>\r\n\r\n <input\r\n matInput\r\n type=\"text\"\r\n [placeholder]=\"'Parameter ' + (paramHeaderIndex + 1)\"\r\n [formControl]=\"param.get('name')\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"getParamBody?.length > 0\">\r\n <p class=\"font-16px font-PoppinsBold mt-3\">Body Parameter</p>\r\n\r\n <div\r\n *ngFor=\"let param of getParamBody; let paramBodyIndex = index\"\r\n class=\"form-group\"\r\n >\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label>Parameter {{ paramBodyIndex + 1 }}</mat-label>\r\n\r\n <input\r\n matInput\r\n type=\"text\"\r\n [placeholder]=\"'Parameter ' + (paramBodyIndex + 1)\"\r\n [formControl]=\"param.get('name')\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </ng-container>\r\n <!-- rizal -->\r\n <h5\r\n class=\"mb-3 font-weight-bold mt-4\"\r\n *ngIf=\"(!isUsingExcelBulk && buttonParamsControls.length > 0) || isShowParameter\"\r\n >\r\n Button Parameter\r\n </h5>\r\n <div\r\n class=\"button-parameter-section\"\r\n *ngIf=\"buttonParamsControls.length > 0 && !isUsingExcelBulk\"\r\n >\r\n <div formArrayName=\"buttonParams\">\r\n <div\r\n *ngFor=\"let btnControl of buttonParamsControls; let i = index\"\r\n [formGroupName]=\"i\"\r\n >\r\n <p class=\"font-14px font-PoppinsBold mt-3\">Button {{ i + 1 }}</p>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label>Parameter 1</mat-label>\r\n <input\r\n matInput\r\n type=\"text\"\r\n formControlName=\"payload\"\r\n placeholder=\"Parameter 1\"\r\n maxlength=\"256\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- titus -->\r\n <ng-container *ngIf=\"isShowParameter\">\r\n <ng-container *ngFor=\"let button of getButton; let buttonIndex = index\">\r\n <ng-container *ngIf=\"getParamButton(buttonIndex)?.length > 0\">\r\n <p class=\"font-14px font-PoppinsBold mt-3\">Button {{ buttonIndex + 1 }}</p>\r\n\r\n <div\r\n *ngFor=\"\r\n let param of getParamButton(buttonIndex);\r\n let paramIndex = index\r\n \"\r\n class=\"form-group\"\r\n >\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label>Parameter {{ paramIndex + 1 }}</mat-label>\r\n\r\n <input\r\n matInput\r\n type=\"text\"\r\n [placeholder]=\"'Parameter ' + (paramIndex + 1)\"\r\n [formControl]=\"param.get('name')\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container\r\n *ngIf=\"\r\n ['image', 'video', 'document'].includes(\r\n form.get('template')?.value?.header?.type?.toLowerCase()\r\n )\r\n \"\r\n >\r\n <p class=\"font-16px font-PoppinsBold mt-3\">File</p>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">File</mat-label>\r\n\r\n <input\r\n matInput\r\n type=\"text\"\r\n autocomplete=\"off\"\r\n (click)=\"filePicker.click()\"\r\n formControlName=\"fileName\"\r\n />\r\n\r\n <button\r\n mat-button\r\n matSuffix\r\n mat-icon-button\r\n aria-label=\"Choose File\"\r\n (click)=\"filePicker.click()\"\r\n >\r\n <mat-icon>attach_file</mat-icon>\r\n </button>\r\n\r\n <input\r\n #filePicker\r\n hidden\r\n type=\"file\"\r\n [accept]=\"extFileAccepted\"\r\n (change)=\"onFileSelected($event)\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </ng-container>\r\n <!-- ========================================== -->\r\n <!-- CAROUSEL DYNAMIC VARIABLES -->\r\n <!-- ========================================== -->\r\n <div\r\n class=\"existing-template-variables mt-4\"\r\n *ngIf=\"!form.get('isUpload')?.value && hasAnyCarouselVariables\"\r\n >\r\n <p class=\"font-16px font-PoppinsBold mt-3\">Carousel Configuration</p>\r\n <div formArrayName=\"paramCarousel\">\r\n <ng-container *ngFor=\"let card of getCarouselControls; let cIndex = index\">\r\n <div\r\n *ngIf=\"checkCardHasVariables(cIndex)\"\r\n [formGroupName]=\"cIndex\"\r\n class=\"card-container mb-4 p-3\"\r\n style=\"border: 1px solid #e0e0e0; border-radius: 8px\"\r\n >\r\n <div class=\"font-bold font-14px mb-3\">Card {{ cIndex + 1 }}</div>\r\n\r\n <div *ngIf=\"getCarouselBodyParams(cIndex).controls.length > 0\" class=\"mb-3\">\r\n <div class=\"font-bold font-12px mb-2\">Body Variables</div>\r\n <div formArrayName=\"bodyParams\">\r\n <div\r\n *ngFor=\"\r\n let bParam of getCarouselBodyParams(cIndex).controls;\r\n let bIndex = index\r\n \"\r\n [formGroupName]=\"bIndex\"\r\n class=\"form-group mb-3\"\r\n >\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100 custom-variable-field\"\r\n >\r\n <mat-label\r\n >Body\r\n {{ '{' + '{' + (bIndex + 1) + '}' + '}' }}</mat-label\r\n >\r\n <input\r\n matInput\r\n type=\"text\"\r\n formControlName=\"paramName\"\r\n placeholder=\"Input value here...\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n <div formArrayName=\"buttonParams\">\r\n <div\r\n *ngFor=\"let btn of getCarouselButtons(cIndex); let btnIndex = index\"\r\n >\r\n <div\r\n *ngIf=\"\r\n getCarouselBtnParams(cIndex, btnIndex).controls.length > 0\r\n \"\r\n [formGroupName]=\"btnIndex\"\r\n class=\"mt-2\"\r\n >\r\n <div class=\"font-bold font-12px mb-2\">\r\n Button: {{ btn.text }}\r\n </div>\r\n <div\r\n *ngFor=\"\r\n let pBtn of getCarouselBtnParams(cIndex, btnIndex)\r\n .controls;\r\n let pBtnIdx = index\r\n \"\r\n [formGroupName]=\"pBtnIdx\"\r\n class=\"form-group mb-3\"\r\n >\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100 custom-variable-field\"\r\n >\r\n <mat-label>\r\n {{\r\n btn.type === 'QUICK_REPLY'\r\n ? 'Payload'\r\n : btn.type === 'URL'\r\n ? 'URL Variable ' + (pBtnIdx + 1)\r\n : 'Param ' + (pBtnIdx + 1)\r\n }}\r\n </mat-label>\r\n\r\n <!-- Input khusus untuk QUICK_REPLY (binding ke formControlName=\"payload\") -->\r\n <input\r\n *ngIf=\"btn.type === 'QUICK_REPLY'\"\r\n matInput\r\n type=\"text\"\r\n formControlName=\"payload\"\r\n placeholder=\"Input payload value...\"\r\n />\r\n\r\n <!-- Input khusus untuk Variable Biasa / URL (binding ke formControlName=\"paramName\") -->\r\n <input\r\n *ngIf=\"btn.type !== 'QUICK_REPLY'\"\r\n matInput\r\n type=\"text\"\r\n formControlName=\"paramName\"\r\n placeholder=\"Input value here...\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"getIsCatalogue\">\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">From</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"from\"\r\n placeholder=\"Select from\"\r\n [complete]=\"isHaveNextAccountOption === false\"\r\n [compareWith]=\"accountSelectedDisplay\"\r\n (infiniteScroll)=\"getNextAccountBatch()\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('from').value?.name\"\r\n (searchRes)=\"updateSearchAccount($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name + ' (' + option.accountNo + ')' }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingAccountOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.from\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('from')?.touched && form.get('from')?.hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">Category</mat-label>\r\n\r\n <mat-select formControlName=\"category\" placeholder=\"Select category\">\r\n <mat-option *ngFor=\"let option of categoryOption\" [value]=\"option.value\">\r\n {{ option.label }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.category\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('category')?.touched &&\r\n form.get('category')?.hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">Catalog</mat-label>\r\n\r\n <mat-select formControlName=\"catalogue\" placeholder=\"Select catalog\">\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.catalogue\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('catalogue')?.touched &&\r\n form.get('catalogue')?.hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div\r\n *ngIf=\"form.get('category')?.value === 'product'\"\r\n style=\"padding: 8px; border-radius: 8px; border: 1px solid #6177c4\"\r\n >\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">Product</mat-label>\r\n\r\n <mat-select formControlName=\"product\" placeholder=\"Select product\">\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.product\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('product')?.touched &&\r\n form.get('product')?.hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label>Body</mat-label>\r\n\r\n <input\r\n matInput\r\n type=\"text\"\r\n maxlength=\"100\"\r\n formControlName=\"body\"\r\n placeholder=\"Enter body\"\r\n />\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"getIsUtility\">\r\n <div style=\"display: grid; gap: 0.5rem\">\r\n <mat-label class=\"asterix--after\">Template</mat-label>\r\n <mat-radio-group\r\n style=\"display: flex; gap: 0.5rem; flex-wrap: wrap\"\r\n formControlName=\"isUseExistingTemplate\"\r\n (change)=\"handleChangeTemplate($event.value)\"\r\n >\r\n <mat-radio-button\r\n [value]=\"option.value\"\r\n *ngFor=\"let option of templates\"\r\n color=\"primary\"\r\n >\r\n {{ option.label }}\r\n </mat-radio-button>\r\n </mat-radio-group>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100\"\r\n style=\"margin-bottom: 20\"\r\n >\r\n <mat-label class=\"asterix--after\">From</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"from\"\r\n placeholder=\"Select from\"\r\n [complete]=\"isHaveNextAccountOption === false\"\r\n [compareWith]=\"accountSelectedDisplay\"\r\n (infiniteScroll)=\"getNextAccountBatch()\"\r\n (selectionChange)=\"handleChangeFrom($event.value)\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('from').value?.name\"\r\n (searchRes)=\"updateSearchAccount($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of accountOption\" [value]=\"option\">\r\n {{ option.name + ' (' + option.accountNo + ')' }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingAccountOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.from\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"form.get('from')?.touched && form.get('from')?.hasError(validation.type)\"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <ng-container *ngIf=\"!form.get('isUseExistingTemplate')?.value; else existingTmpl\">\r\n <ng-container *ngTemplateOutlet=\"stageAlertTmpl\"></ng-container>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label class=\"asterix--after\">Body</mat-label>\r\n\r\n <textarea\r\n matInput\r\n rows=\"6\"\r\n cols=\"50\"\r\n cdkTextareaAutosize\r\n cdkAutosizeMinRows=\"2\"\r\n cdkAutosizeMaxRows=\"15\"\r\n formControlName=\"text\"\r\n placeholder=\"Enter text\"\r\n #autosize=\"cdkTextareaAutosize\"\r\n ></textarea>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.text\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('text').touched && form.get('text').hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <app-input\r\n type=\"numeric\"\r\n formControlName=\"ttl\"\r\n label=\"TTL\"\r\n placeholder=\"Enter ttl\"\r\n [trimLeadingZeros]=\"true\"\r\n suffix=\"seconds\"\r\n hint=\"The default TTL is 30 days (2,592,000 seconds) if no value is provided.\"\r\n ></app-input>\r\n </div>\r\n\r\n <div *ngIf=\"!isReadOnlyMode\">\r\n <mat-checkbox formControlName=\"isNeedSave\">\r\n Save this message as future template\r\n </mat-checkbox>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- VARIABLES START -->\r\n <ng-container *ngIf=\"!form.get('isDownloadVariableXLS')?.value\">\r\n <div class=\"template-container mt-5\" *ngIf=\"!form.get('isUseExistingTemplate')?.value\">\r\n <div class=\"add-variable-wrapper\">\r\n <button mat-button class=\"btn-add-variable\" (click)=\"addVariable()\">\r\n <mat-icon class=\"icon-small\">add</mat-icon> Add Variable\r\n </button>\r\n </div>\r\n\r\n <div class=\"body-content-wrapper\">\r\n <h3 class=\"body-content-title\">Body Content</h3>\r\n <p class=\"body-content-subtitle\">\r\n Input the parameter to show during the preview\r\n </p>\r\n\r\n <div class=\"variables-list\" formArrayName=\"variables\">\r\n <div\r\n class=\"variable-row d-flex align-items-start mb-3\"\r\n *ngFor=\"let variable of variables.controls; let i = index\"\r\n [formGroupName]=\"i\"\r\n >\r\n <div class=\"variable-sequence mr-3\">\r\n {{ '{' + '{' + (i + 1) + '}' + '}' }}\r\n </div>\r\n <div class=\"variable-input-wrapper flex-grow-1\">\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100 bg-white-field\"\r\n >\r\n <mat-label>Variable {{ i + 1 }}</mat-label>\r\n <!-- Tambahin label biar cakep -->\r\n <input\r\n matInput\r\n type=\"text\"\r\n formControlName=\"paramName\"\r\n placeholder=\"e.g. Name, Verification code\"\r\n />\r\n </mat-form-field>\r\n\r\n <ng-container\r\n *ngFor=\"let validation of validationMessages?.paramName\"\r\n >\r\n <div\r\n class=\"custom-error-text text-right\"\r\n *ngIf=\"\r\n variable.get('paramName')?.hasError(validation.type) &&\r\n (variable.get('paramName')?.touched ||\r\n variable.get('paramName')?.dirty)\r\n \"\r\n >\r\n <span class=\"font-12px m-0\">{{ validation.message }}</span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"btn-delete ml-3\"\r\n (click)=\"removeVariable(i)\"\r\n >\r\n <mat-icon color=\"warn\">delete_outline</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- ====================================================== -->\r\n <!-- VIEW 2: USE EXISTING TEMPLATE (UI Clean, cuma input) -->\r\n <!-- ====================================================== -->\r\n <div\r\n class=\"existing-template-variables mt-4\"\r\n *ngIf=\"form.get('isUseExistingTemplate')?.value && variables.controls.length > 0\"\r\n >\r\n <div class=\"font-bold mb-3\">Variables</div>\r\n <!-- Looping array yang sama persis, tapi tanpa ornamen -->\r\n <div formArrayName=\"variables\">\r\n <div\r\n class=\"form-group mb-3\"\r\n *ngFor=\"let variable of variables.controls; let i = index\"\r\n [formGroupName]=\"i\"\r\n >\r\n <mat-form-field\r\n appearance=\"outline\"\r\n floatLabel=\"always\"\r\n class=\"w-100 custom-variable-field\"\r\n >\r\n <!-- Label dinamis: {{1}}, {{2}}, dst -->\r\n <mat-label>{{ '{' + '{' + (i + 1) + '}' + '}' }}</mat-label>\r\n <input\r\n matInput\r\n type=\"text\"\r\n formControlName=\"paramName\"\r\n placeholder=\"Input value here...\"\r\n />\r\n </mat-form-field>\r\n\r\n <!-- Validasi Error -->\r\n <ng-container *ngFor=\"let validation of validationMessages?.paramName\">\r\n <div\r\n class=\"custom-error-text text-right\"\r\n *ngIf=\"\r\n variable.get('paramName')?.hasError(validation.type) &&\r\n (variable.get('paramName')?.touched ||\r\n variable.get('paramName')?.dirty)\r\n \"\r\n >\r\n <span class=\"font-12px m-0\">{{ validation.message }}</span>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <div\r\n class=\"d-flex justify-content-end\"\r\n *ngIf=\"variables.controls.length > 0 || form.get('isDownloadVariableXLS')?.value\"\r\n >\r\n <mat-checkbox\r\n labelPosition=\"before\"\r\n formControlName=\"isDownloadVariableXLS\"\r\n (change)=\"updateVariableDownloadXLS($event.checked)\"\r\n >\r\n Using Download XLSX\r\n </mat-checkbox>\r\n </div>\r\n <!--VARIABLES END -->\r\n\r\n <ng-template #existingTmpl>\r\n <ng-container *ngTemplateOutlet=\"stageAlertTmpl\"></ng-container>\r\n\r\n <div class=\"form-group\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\" class=\"w-100\">\r\n <mat-label class=\"asterix--after\">Template</mat-label>\r\n\r\n <mat-select\r\n matSelectInfiniteScroll\r\n formControlName=\"template\"\r\n placeholder=\"Select template\"\r\n [complete]=\"isHaveNextTemplateOption === false\"\r\n [compareWith]=\"templateSelectedDisplay\"\r\n (infiniteScroll)=\"getNextTemplateBatch()\"\r\n (selectionChange)=\"updateTemplate($event.value)\"\r\n >\r\n <div style=\"margin: 20px\">\r\n <lib-search\r\n [placeholder]=\"'Search'\"\r\n [currentValue]=\"form?.get('template').value?.name\"\r\n (searchRes)=\"updateSearch($event)\"\r\n ></lib-search>\r\n </div>\r\n\r\n <mat-option *ngFor=\"let option of templateOption\" [value]=\"option\">\r\n {{ option.name }}\r\n </mat-option>\r\n <mat-option *ngIf=\"isLoadingTemplateOption\">Loading...</mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n\r\n <mat-error align=\"end\" *ngFor=\"let validation of validationMessages.template\">\r\n <p\r\n class=\"font-12px mb-0\"\r\n *ngIf=\"\r\n form.get('template')?.touched &&\r\n form.get('template')?.hasError(validation.type)\r\n \"\r\n >\r\n {{ validation.message }}\r\n </p>\r\n </mat-error>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <app-input\r\n type=\"numeric\"\r\n formControlName=\"ttl\"\r\n label=\"TTL\"\r\n placeholder=\"Enter ttl\"\r\n [trimLeadingZeros]=\"true\"\r\n suffix=\"Seconds\"\r\n hint=\"The default TTL is 30 days (2,592,000 seconds) if no value is provided.\"\r\n ></app-input>\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n</form>\r\n\r\n<ng-template #stageAlertTmpl>\r\n <div\r\n role=\"alert\"\r\n class=\"alert alert-warning d-flex align-items-center\"\r\n style=\"margin-top: 8px; border: 1px solid rgb(243, 124, 44)\"\r\n *ngIf=\"form.get('from')?.value && form.get('from')?.value?.directSendRestrictionStage > 0\"\r\n >\r\n <mat-icon style=\"margin-right: 10px !important\">error_outline</mat-icon>\r\n\r\n <div *ngIf=\"form.get('from')?.value?.directSendRestrictionStage === 1\">\r\n Direct Send misuse detected. Please review your messaging practices.\r\n </div>\r\n <div *ngIf=\"form.get('from')?.value?.directSendRestrictionStage === 2\">\r\n Direct Send access restricted for 7 days due to continued misuse.\r\n </div>\r\n\r\n <div *ngIf=\"form.get('from')?.value?.directSendRestrictionStage === 3\">\r\n Direct Send access restricted for 30 days due to continued misuse. Final warning before\r\n permanent revocation.\r\n </div>\r\n\r\n <div *ngIf=\"form.get('from')?.value?.directSendRestrictionStage === 4\">\r\n Direct Send access has been permanently revoked.\r\n </div>\r\n </div>\r\n</ng-template>\r\n",
1051
1078
  styles: [".asterix--after:after{content:\"*\";color:red}.template-container{background-color:#fff;border-radius:.5rem;width:100%;max-width:56rem;box-sizing:border-box}.template-container .variable-wapper{margin-bottom:.5rem;display:flex;align-items:center}.template-container .add-variable-wrapper{display:flex;align-items:center;justify-content:flex-end;margin-bottom:.5rem}.template-container .add-variable-wrapper .btn-add-variable{color:#3b82f6!important}.template-container .body-content-wrapper{background-color:#d1e4fd;border-radius:.5rem;padding:1.5rem;margin-bottom:.5rem}.template-container .body-content-wrapper .body-content-title{color:#1e293b;font-size:1.125rem;font-weight:700;margin:0 0 .5rem}.template-container .body-content-wrapper .body-content-subtitle{color:#6b7280;font-size:.875rem;margin:0 0 1.25rem}.template-container .body-content-wrapper .predefined-variable-wrapper{margin-bottom:1.5rem}.template-container .body-content-wrapper .predefined-variable-wrapper .btn-predefined{display:inline-flex;align-items:center;background-color:#22c55e;color:#fff;font-size:.75rem;font-weight:600;padding:.375rem .75rem;border-radius:9999px;cursor:grab;transition:background-color .2s}.template-container .body-content-wrapper .predefined-variable-wrapper .btn-predefined:hover{background-color:#16a34a}.template-container .body-content-wrapper .predefined-variable-wrapper .btn-predefined .icon-small{font-size:16px;width:16px;height:16px;margin-right:.25rem;line-height:16px}.template-container .body-content-wrapper .bg-white-field ::ng-deep .mat-form-field-flex{background-color:#fff;border-radius:4px}.template-container .body-content-wrapper .bg-white-field ::ng-deep .mat-form-field-wrapper{padding-bottom:0!important;margin-bottom:0!important}.template-container .body-content-wrapper .custom-error-text{color:#f44336;margin-top:4px;padding-right:12px}.template-container .body-content-wrapper .variable-sequence{background-color:#fff;border:1px solid #e2e8f0;color:#4b5563;border-radius:5px;font-weight:500;min-width:3.5rem;text-align:center;height:58px;display:flex;align-items:center;justify-content:center;margin-top:0}.template-container .body-content-wrapper .btn-delete{background:0 0;border:none;cursor:pointer;padding:0;display:flex;align-items:center;justify-content:center;height:51px;margin-top:0;transition:transform .2s}.template-container .body-content-wrapper .btn-delete:hover{transform:scale(1.1)}.template-container .checkbox-wrapper{display:flex;justify-content:flex-end;margin-top:.5rem}.template-container .checkbox-wrapper .checkbox-xlsx{font-size:.875rem;font-weight:500;color:#374151}"]
1052
1079
  })
1053
1080
  ], GeneralInformationWAComponent);
1054
1081
  return GeneralInformationWAComponent;
1055
1082
  }());
1056
1083
  export { GeneralInformationWAComponent };
1057
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhbC1pbmZvcm1hdGlvbi13YS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYWRsZmUvY2FtcGFpZ24tbWFuYWdlbWVudC1saWJyYXJ5LyIsInNvdXJjZXMiOlsibGliL2NhbXBhaWduLW1hbmFnZW1lbnQvbW9kdWxlcy9uZXctY2FtcGFpZ24vY29tcG9uZW50cy9nZW5lcmFsLWluZm9ybWF0aW9uLXdhL2dlbmVyYWwtaW5mb3JtYXRpb24td2EuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQ0gsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUVILFNBQVMsRUFFVCxXQUFXLEVBQ1gsU0FBUyxFQUNULFVBQVUsR0FDYixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFM0MsT0FBTyxFQUNILDBDQUEwQyxFQUMxQyxvQkFBb0IsRUFDcEIsb0JBQW9CLEdBQ3ZCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFJaEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLElBQUksZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQWV4RTtJQStD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QUFFLFFBQVEsT0FBQyxVQUFVLDBDQUFFLElBQUksRUFBRTtRQUNwRCxNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLDBDQUFFLFFBQVEsT0FBQyxVQUFVLDBDQUFFLFNBQVMsRUFBRTtRQUM5RCxNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLDBDQUFFLFFBQVEsYUFDakMsVUFBVSwwQ0FBRSxRQUFRLDZDQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLDBDQUFFLEtBQUssSUFDN0Q7UUFDRixNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLDBDQUFFLFFBQVEsT0FBQyxVQUFVLDBDQUFFLFFBQVEsRUFBRTtRQUM1RCxNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLDBDQUFFLFFBQVEsT0FBQyxVQUFVLDBDQUFFLFFBQVEsRUFBRTtRQUM1RCxNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLDBDQUFFLFFBQVEsT0FBQyxVQUFVLDBDQUFFLE1BQU0sRUFBRTtRQUN4RCxNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLDBDQUFFLFFBQVEsT0FBQyxVQUFVLDBDQUFFLFFBQVEsRUFBRTtRQUM1RCxNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsdUJBQXVCLENBQUMsMENBQUUsUUFBUSxDQUM5QyxPQUFBLFVBQVUsMENBQUUscUJBQXFCLE1BQUssU0FBUztZQUMzQyxDQUFDLENBQUMsVUFBVSxDQUFDLHFCQUFxQjtZQUNsQyxDQUFDLENBQUMsQ0FBQyxjQUFDLFVBQVUsMENBQUUsUUFBUSwwQ0FBRSxJQUFJLENBQUEsRUFDcEM7UUFDRixNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLDBDQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQUMsVUFBVSwwQ0FBRSxVQUFVLENBQUEsRUFBRTtRQUNsRSxNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsdUJBQXVCLENBQUMsMENBQUUsUUFBUSxPQUFDLFVBQVUsMENB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QUMsVUFBVSxDQUFDLFVBQVUsQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFDckMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFDdEMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFDckMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFDakMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFDckMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFDdEMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFDckMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFDckMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFDcEMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFDdEMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFDakMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFDckMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFFdEMsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQXFCLENBQUM7UUFDdkUsSUFBSSxXQUFXLEVBQUU7WUFDYixXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDcEIsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ3ZCO1FBRUQsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVB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RSw0QkFBNEI7WUFDdEMsdzBqREFBc0Q7O1NBRXpELENBQUM7T0FDVyw2QkFBNkIsQ0ErbkN6QztJQUFELG9DQUFDO0NBQUEsQUEvbkNELElBK25DQztTQS9uQ1ksNkJBQTZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWFwc0FQSUxvYWRlciB9IGZyb20gJ0BhZ20vY29yZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7XHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgRXZlbnRFbWl0dGVyLFxyXG4gICAgSW5wdXQsXHJcbiAgICBOZ1pvbmUsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBPbkluaXQsXHJcbiAgICBPdXRwdXQsXHJcbiAgICBWaWV3Q2hpbGQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgICBBYnN0cmFjdENvbnRyb2wsXHJcbiAgICBGb3JtQXJyYXksXHJcbiAgICBGb3JtQnVpbGRlcixcclxuICAgIEZvcm1Db250cm9sLFxyXG4gICAgRm9ybUdyb3VwLFxyXG4gICAgVmFsaWRhdG9ycyxcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7XHJcbiAgICBHZW5lcmFsSW5mb3JtYXRpb25XQU1lc3NhZ2VWYWxpZGF0aW9uQ29uc3QsXHJcbiAgICBNZWRpYVR5cGVPcHRpb25Db25zdCxcclxuICAgIE1zZ1R5cGVXQU9wdGlvbkNvbnN0LFxyXG59IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvcmUvY29uc3QnO1xyXG5pbXBvcnQgeyBQcm9kdWN0Q2F0ZWdvcnlFbnVtIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29yZS9lbnVtcyc7XHJcbmltcG9ydCB7IEJhc2VPcHRpb25Nb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvcmUvbW9kZWxzJztcclxuaW1wb3J0IHsgUGFyYW1ldGVyIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29yZS9tb2RlbHMvdXRpbC9hcGktYWRhcHRlci1zZXJ2aWNlLW1vZGVscyc7XHJcbmltcG9ydCB7IEFwcFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29yZS9tb2RlbHMvdXRpbC9hcGktZHRvL3Jlc3BvbnNlLW1vZGVscyc7XHJcbmltcG9ydCB7IEFwaUFkYXB0ZXJTZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvcmUvc2VydmljZXMnO1xyXG5pbXBvcnQgeyBnZW5lcmF0ZUVudW1PcHRpb24gfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9jb3JlL3V0aWwnO1xyXG5pbXBvcnQgeyBUZW1wbGF0ZVdBTW9kZWwsIFdoYXRzQXBwQWNjb3VudER0byB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscyc7XHJcbmltcG9ydCB7IEVudW1EYXRhIH0gZnJvbSAnLi4vLi4vLi4vLi4vdXRpbC9lbnVtcyc7XHJcbmltcG9ydCB7IFZhbGlkYXRvcnMgYXMgQ3VzdG9tVmFsaWRhdG9ycyB9IGZyb20gJy4uLy4uLy4uLy4uL3ZhbGlkYXRvcnMnO1xyXG5cclxuaW50ZXJmYWNlIElNYXBzIHtcclxuICAgIHpvb206IG51bWJlcjtcclxuICAgIGxhdGl0dWRlOiBudW1iZXIgfCBudWxsO1xyXG4gICAgbG9uZ2l0dWRlOiBudW1iZXIgfCBudWxsO1xyXG4gICAgaXNEcmFnZ2FibGU6IGJvb2xlYW47XHJcbiAgICBpc0RvdWJsZUNsaWNrWm9vbTogYm9vbGVhbjtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2xpYi1nZW5lcmFsLWluZm9ybWF0aW9uLXdhJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9nZW5lcmFsLWluZm9ybWF0aW9uLXdhLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2dlbmVyYWwtaW5mb3JtYXRpb24td2EuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEdlbmVyYWxJbmZvcm1hdGlvbldBQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgQE91dHB1dCgpXHJcbiAgICBwdWJsaWMgdXBkYXRlR2VuZXJhbEluZm9ybWF0aW9uRm9ybTogRXZlbnRFbWl0dGVyPEZvcm1Hcm91cD47XHJcblxyXG4gICAgcHVibGljIGZvcm0hOiBGb3JtR3JvdXA7XHJcbiAgICBwdWJsaWMgbXNnVHlwZVdBT3B0aW9uOiBhbnlbXSA9IFtdO1xyXG4gICAgcHVibGljIG1lZGlhVHlwZU9wdGlvbjogYW55W10gPSBbXTtcclxuICAgIHB1YmxpYyBjYXRlZ29yeU9wdGlvbiE6IEJhc2VPcHRpb25Nb2RlbFtdO1xyXG4gICAgcHVibGljIGFjY291bnRPcHRpb246IFdoYXRzQXBwQWNjb3VudER0b1tdID0gW107XHJcbiAgICBwdWJsaWMgaXNIYXZlTmV4dEFjY291bnRPcHRpb246IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHVibGljIGlzTG9hZGluZ0FjY291bnRPcHRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyB0ZW1wbGF0ZU9wdGlvbjogVGVtcGxhdGVXQU1vZGVsW10gPSBbXTtcclxuICAgIHB1YmxpYyBpc0hhdmVOZXh0VGVtcGxhdGVPcHRpb246IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgcHVibGljIGlzTG9hZGluZ1RlbXBsYXRlT3B0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgaXNIYXZlVGVtcGxhdGVQYXJhbTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIGlzU2hvd1BhcmFtZXRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIHZhbGlkYXRpb25NZXNzYWdlczogYW55O1xyXG4gICAgcHVibGljIGV4dEZpbGVBY2NlcHRlZDogc3RyaW5nID0gJ2ltYWdlLyonO1xyXG4gICAgcHVibGljIG1hcHMhOiBJTWFwcztcclxuXHJcbiAgICBwcml2YXRlIHBhZ2VOb0FjY291bnRPcHRpb246IG51bWJlciA9IDE7XHJcbiAgICBwcml2YXRlIHBhZ2VOb1RlbXBsYXRlT3B0aW9uOiBudW1iZXIgPSAxO1xyXG4gICAgcHJpdmF0ZSBzdWJzY3JpYmVyczogU3Vic2NyaXB0aW9uW10gPSBbXTtcclxuICAgIHByaXZhdGUgZ2VvQ29kZXI6IGFueTtcclxuXHJcbiAgICBwdWJsaWMgdGVtcGxhdGVzID0gW1xyXG4gICAgICAgIHsgbGFiZWw6ICdDcmVhdGUgTmV3JywgdmFsdWU6IGZhbHNlIH0sXHJcbiAgICAgICAgeyBsYWJlbDogJ1VzZSBleGlzdGluZyB0ZW1wbGF0ZScsIHZhbHVlOiB0cnVlIH0sXHJcbiAgICBdO1xyXG5cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBpc1JlYWRPbmx5TW9kZSE6IGJvb2xlYW47XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIHNldCBpc1RvdWNoZWRGb3JtKHN0YXR1czogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICghdGhpcy51cGRhdGVHZW5lcmFsSW5mb3JtYXRpb25Gb3JtKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUdlbmVyYWxJbmZvcm1hdGlvbkZvcm0uZW1pdCh0aGlzLmZvcm0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ21hcFNlYXJjaCcpIG1hcFNlYXJjaFJlZiE6IEVsZW1lbnRSZWY7XHJcblxyXG4gICAgcHVibGljIGlzQ2hlY2tVdGlsaXR5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcclxuICAgICAgICBwcml2YXRlIG1hcHNBUElMb2FkZXI6IE1hcHNBUElMb2FkZXIsXHJcbiAgICAgICAgcHJpdmF0ZSBhcGlBZGFwdGVyU2VydmljZTogQXBpQWRhcHRlclNlcnZpY2VTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgaHR0cENsaWVudDogSHR0cENsaWVudFxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVHZW5lcmFsSW5mb3JtYXRpb25Gb3JtID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubXNnVHlwZVdBT3B0aW9uID0gTXNnVHlwZVdBT3B0aW9uQ29uc3Q7XHJcbiAgICAgICAgdGhpcy5tZWRpYVR5cGVPcHRpb24gPSBNZWRpYVR5cGVPcHRpb25Db25zdDtcclxuICAgICAgICB0aGlzLmNhdGVnb3J5T3B0aW9uID0gZ2VuZXJhdGVFbnVtT3B0aW9uKFByb2R1Y3RDYXRlZ29yeUVudW0pO1xyXG4gICAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzID0gR2VuZXJhbEluZm9ybWF0aW9uV0FNZXNzYWdlVmFsaWRhdGlvbkNvbnN0O1xyXG4gICAgICAgIHRoaXMubWFwcyA9IHtcclxuICAgICAgICAgICAgem9vbTogMTUsXHJcbiAgICAgICAgICAgIGxhdGl0dWRlOiBudWxsLFxyXG4gICAgICAgICAgICBsb25naXR1ZGU6IG51bGwsXHJcbiAgICAgICAgICAgIGlzRHJhZ2dhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgICBpc0RvdWJsZUNsaWNrWm9vbTogdHJ1ZSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLmluaXRGb3JtKCk7XHJcbiAgICAgICAgdGhpcy5pbml0RGlzYWJsZSgpO1xyXG4gICAgICAgIHRoaXMuaW5pdEVkaXQoKTtcclxuICAgICAgICB0aGlzLmluaXRWYWxpZGF0aW9uKCk7XHJcbiAgICAgICAgdGhpcy5nZXRBY2NvdW50T3B0aW9uU2VydmljZShcclxuICAgICAgICAgICAgdGhpcy5nZXRDYW1wYWlnblN0b3JhZ2U/LmdlbmVyYWxJbmZvcm1hdGlvbj8uZm9ybT8ubWVkaXVtID09PSAnV0EnXHJcbiAgICAgICAgICAgICAgICA/IHRoaXMuZ2V0Q2FtcGFpZ25TdG9yYWdlPy5nZW5lcmFsSW5mb3JtYXRpb24/LmZvcm0/LmZyb20/Lm5hbWVcclxuICAgICAgICAgICAgICAgIDogJydcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvLyBMaXN0ZW4gdGV4dCB0byBjaGFuZ2VzIGluIHRoZSBmb3JtXHJcbiAgICAgICAgY29uc3QgdGV4dENvbnRyb2xGb3JTeW5jID0gdGhpcy5nZXRDb250cm9sKCd0ZXh0Jyk7XHJcblxyXG4gICAgICAgIGlmICh0ZXh0Q29udHJvbEZvclN5bmMpIHtcclxuICAgICAgICAgICAgY29uc3QgdGV4dFN1YnMgPSB0ZXh0Q29udHJvbEZvclN5bmMudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3luY1ZhcmlhYmxlc0Zyb21UZXh0KHZhbHVlKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzLnB1c2godGV4dFN1YnMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgZ2V0Q2FtcGFpZ25TdG9yYWdlKCk6IGFueSB7XHJcbiAgICAgICAgY29uc3QgY2FtcGFpZ25EYXRhID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RlbGluLmNhbXBhaWduJyk7XHJcbiAgICAgICAgcmV0dXJuIGNhbXBhaWduRGF0YSA/IEpTT04ucGFyc2UoY2FtcGFpZ25EYXRhKSA6IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdEZvcm0oKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5mb3JtID0gbmV3IEZvcm1Hcm91cCh7XHJcbiAgICAgICAgICAgIGNoYW5uZWw6IG5ldyBGb3JtQ29udHJvbChudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcclxuICAgICAgICAgICAgbWVkaWE6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcclxuICAgICAgICAgICAgZnJvbTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgICAgICAgICB0ZXh0OiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgICAgICAgIGZpbGVOYW1lOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgICAgICAgIHRhcmdldFVSTDogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgICAgICAgICBmaWxlVHlwZTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgICAgICAgICBmaWxlOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgICAgICAgIGxhdGl0dWRlOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgICAgICAgIGxvbmdpdHVkZTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgICAgICAgICBwYXJhbUhlYWRlcjogbmV3IEZvcm1BcnJheShbXSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXHJcbiAgICAgICAgICAgIHBhcmFtQm9keTogbmV3IEZvcm1BcnJheShbXSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXHJcbiAgICAgICAgICAgIHBhcmFtQnV0dG9uOiBuZXcgRm9ybUFycmF5KFtdLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcclxuICAgICAgICAgICAgb3RwVmFsdWU6IG5ldyBGb3JtQ29udHJvbCgnJyksXHJcbiAgICAgICAgICAgIGlzVXBsb2FkOiBuZXcgRm9ybUNvbnRyb2woZmFsc2UpLFxyXG4gICAgICAgICAgICBmaWxlSWQ6IG5ldyBGb3JtQ29udHJvbCgnJyksXHJcbiAgICAgICAgICAgIGNhdGVnb3J5OiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgICAgICAgIHByb2R1Y3Q6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcclxuICAgICAgICAgICAgY2F0YWxvZ3VlOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgICAgICAgIGJvZHk6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcclxuICAgICAgICAgICAgaXNVc2VFeGlzdGluZ1RlbXBsYXRlOiBuZXcgRm9ybUNvbnRyb2woZmFsc2UpLFxyXG4gICAgICAgICAgICBpc05lZWRTYXZlOiBuZXcgRm9ybUNvbnRyb2woZmFsc2UpLFxyXG4gICAgICAgICAgICB0dGw6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcclxuICAgICAgICAgICAgaXNEb3dubG9hZFZhcmlhYmxlWExTOiBuZXcgRm9ybUNvbnRyb2woZmFsc2UpLFxyXG4gICAgICAgICAgICB2YXJpYWJsZXM6IG5ldyBGb3JtQXJyYXkoW10pLFxyXG4gICAgICAgICAgICB1c2VYbHN4OiBuZXcgRm9ybUNvbnRyb2woZmFsc2UpLFxyXG4gICAgICAgICAgICBidXR0b25QYXJhbXM6IG5ldyBGb3JtQXJyYXkoW10pLFxyXG4gICAgICAgICAgICBwYXJhbUNhcm91c2VsOiBuZXcgRm9ybUFycmF5KFtdKSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5mb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlR2VuZXJhbEluZm9ybWF0aW9uRm9ybS5lbWl0KHRoaXMuZm9ybSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuZm9ybS5nZXQoJ2lzVXBsb2FkJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUV4Y2VsVmFsaWRhdGlvbih2YWwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdERpc2FibGUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzUmVhZE9ubHlNb2RlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZm9ybS5kaXNhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0RWRpdCgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzdG9yYWdlRGF0YSA9IHRoaXMuZ2V0Q2FtcGFpZ25TdG9yYWdlO1xyXG4gICAgICAgIGNvbnN0IGZvcm1WYWx1ZXMgPSBzdG9yYWdlRGF0YT8uZ2VuZXJhbEluZm9ybWF0aW9uPy5mb3JtO1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgIXN0b3JhZ2VEYXRhIHx8XHJcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHN0b3JhZ2VEYXRhKS5sZW5ndGggPT09IDAgfHxcclxuICAgICAgICAgICAgZm9ybVZhbHVlcz8ubWVkaXVtICE9PSAnV0EnXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCdjaGFubmVsJyk/LnNldFZhbHVlKGZvcm1WYWx1ZXM/LmNoYW5uZWwpO1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnbWVkaWEnKT8uc2V0VmFsdWUoZm9ybVZhbHVlcz8ubWVkaWEpO1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnZnJvbScpPy5zZXRWYWx1ZShmb3JtVmFsdWVzPy5mcm9tKTtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ3RleHQnKT8uc2V0VmFsdWUoZm9ybVZhbHVlcz8udGV4dCk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0YXJnZXRVUkwnKT8uc2V0VmFsdWUoZm9ybVZhbHVlcz8udGFyZ2V0VVJMKTtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ2ZpbGVOYW1lJyk/LnNldFZhbHVlKFxyXG4gICAgICAgICAgICBmb3JtVmFsdWVzPy5maWxlTmFtZSA/PyB0aGlzLmdldENvbnRyb2woJ3RhcmdldFVSTCcpPy52YWx1ZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0ZW1wbGF0ZScpPy5zZXRWYWx1ZShmb3JtVmFsdWVzPy50ZW1wbGF0ZSk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCdpc1VwbG9hZCcpPy5zZXRWYWx1ZShmb3JtVmFsdWVzPy5pc1VwbG9hZCk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCdmaWxlSWQnKT8uc2V0VmFsdWUoZm9ybVZhbHVlcz8uZmlsZUlkKTtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ290cFZhbHVlJyk/LnNldFZhbHVlKGZvcm1WYWx1ZXM/Lm90cFZhbHVlKTtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ2lzVXNlRXhpc3RpbmdUZW1wbGF0ZScpPy5zZXRWYWx1ZShcclxuICAgICAgICAgICAgZm9ybVZhbHVlcz8uaXNVc2VFeGlzdGluZ1RlbXBsYXRlICE9PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgID8gZm9ybVZhbHVlcy5pc1VzZUV4aXN0aW5nVGVtcGxhdGVcclxuICAgICAgICAgICAgICAgIDogISFmb3JtVmFsdWVzPy50ZW1wbGF0ZT8ubmFtZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCdpc05lZWRTYXZlJyk/LnNldFZhbHVlKCEhZm9ybVZhbHVlcz8uaXNOZWVkU2F2ZSk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCdpc0Rvd25sb2FkVmFyaWFibGVYTFMnKT8uc2V0VmFsdWUoZm9ybVZhbHVlcz8uaXNEb3dubG9hZFZhcmlhYmxlWExTKTtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ3R0bCcpPy5zZXRWYWx1ZShmb3JtVmFsdWVzPy50dGwpO1xyXG5cclxuICAgICAgICBjb25zdCBzYXZlZFZhcmlhYmxlcyA9IGZvcm1WYWx1ZXM/LnZhcmlhYmxlcztcclxuICAgICAgICBpZiAoc2F2ZWRWYXJpYWJsZXMgJiYgQXJyYXkuaXNBcnJheShzYXZlZFZhcmlhYmxlcykgJiYgc2F2ZWRWYXJpYWJsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnZhcmlhYmxlcy5jbGVhcigpO1xyXG5cclxuICAgICAgICAgICAgc2F2ZWRWYXJpYWJsZXMuZm9yRWFjaCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhcmlhYmxlcy5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWU6IG5ldyBGb3JtQ29udHJvbCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbS5wYXJhbU5hbWUgfHwgJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogdGhpcy5pc1JlYWRPbmx5TW9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pc0hhdmVUZW1wbGF0ZVBhcmFtID0gdGhpcy5nZXRDb250cm9sKCdpc1VwbG9hZCcpPy52YWx1ZTtcclxuICAgICAgICB0aGlzLmdldFRlbXBsYXRlT3B0aW9uU2VydmljZShudWxsLCB0aGlzLmdldENvbnRyb2woJ3RlbXBsYXRlJyk/LnZhbHVlPy5uYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRWYWxpZGF0aW9uKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5mb3JtKSByZXR1cm47XHJcblxyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZm9ybS5jb250cm9scykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mb3JtLmNvbnRyb2xzW2tleV0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9sc1trZXldLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW2tleV0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ2NoYW5uZWwnKT8uc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZ2V0SXNUZXh0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnZnJvbScpPy5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3RleHQnKT8uc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdmcm9tJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0ZXh0Jyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0SXNNZWRpYSkge1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ21lZGlhJyk/LnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnZnJvbScpPy5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2ZpbGVOYW1lJyk/LnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnbWVkaWEnKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2Zyb20nKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2ZpbGVOYW1lJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0SXNUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2Zyb20nKT8uc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0ZW1wbGF0ZScpPy5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3BhcmFtSGVhZGVyJyk/LnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgncGFyYW1Cb2R5Jyk/LnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgncGFyYW1CdXR0b24nKT8uc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdmcm9tJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0ZW1wbGF0ZScpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgncGFyYW1IZWFkZXInKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3BhcmFtQm9keScpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgncGFyYW1CdXR0b24nKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRJc0NhdGFsb2d1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2Zyb20nKT8uc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdjYXRlZ29yeScpPy5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2NhdGFsb2d1ZScpPy5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3Byb2R1Y3QnKT8uc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdib2R5Jyk/LnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTAwKSk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnZnJvbScpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnY2F0ZWdvcnknKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2NhdGFsb2d1ZScpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgncHJvZHVjdCcpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnYm9keScpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdldElzVXRpbGl0eSkge1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2Zyb20nKT8uc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0ZXh0Jyk/LnNldFZhbGlkYXRvcnMoW1xyXG4gICAgICAgICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgICAgICAgICAgIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEwMjQpLFxyXG4gICAgICAgICAgICBdKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0dGwnKT8uc2V0VmFsaWRhdG9ycyhbXHJcbiAgICAgICAgICAgICAgICBDdXN0b21WYWxpZGF0b3JzLm1pbigzMCwgJ01pbmltdW0gVFRMIDMwJyksXHJcbiAgICAgICAgICAgICAgICBDdXN0b21WYWxpZGF0b3JzLm1heCg0MzIwMCwgJ01heGltdW0gVFRMIDQzMjAwJyksXHJcbiAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2Zyb20nKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3RleHQnKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3R0bCcpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgndmFyaWFibGVzJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2Zyb20nKT8uc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0ZXh0Jyk/LnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnZnJvbScpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgndGV4dCcpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBmb3JtUmVzZXQoX2lzTWVkaWFUeXBlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIV9pc01lZGlhVHlwZSkge1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ21lZGlhJyk/LnJlc2V0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnZnJvbScpPy5yZXNldCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0ZXh0Jyk/LnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCdmaWxlTmFtZScpPy5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgndGFyZ2V0VVJMJyk/LnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCdmaWxlVHlwZScpPy5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnZmlsZScpPy5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnbGF0aXR1ZGUnKT8ucmVzZXQoKTtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ2xvbmdpdHVkZScpPy5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgndGVtcGxhdGUnKT8ucmVzZXQoKTtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ2NhdGVnb3J5Jyk/LnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCdwcm9kdWN0Jyk/LnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCdjYXRhbG9ndWUnKT8ucmVzZXQoKTtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ2JvZHknKT8ucmVzZXQoKTtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ290cFZhbHVlJyk/LnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCd2YXJpYWJsZXMnKT8ucmVzZXQoKTtcclxuXHJcbiAgICAgICAgY29uc3QgcGFyYW1IZWFkZXIgPSB0aGlzLmdldENvbnRyb2woJ3BhcmFtSGVhZGVyJykgYXMgRm9ybUFycmF5IHwgbnVsbDtcclxuICAgICAgICBpZiAocGFyYW1IZWFkZXIpIHtcclxuICAgICAgICAgICAgcGFyYW1IZWFkZXIuY2xlYXIoKTtcclxuICAgICAgICAgICAgcGFyYW1IZWFkZXIucmVzZXQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcmFtQm9keSA9IHRoaXMuZ2V0Q29udHJvbCgncGFyYW1Cb2R5JykgYXMgRm9ybUFycmF5IHwgbnVsbDtcclxuICAgICAgICBpZiAocGFyYW1Cb2R5KSB7XHJcbiAgICAgICAgICAgIHBhcmFtQm9keS5jbGVhcigpO1xyXG4gICAgICAgICAgICBwYXJhbUJvZHkucmVzZXQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcmFtQnV0dG9uID0gdGhpcy5nZXRDb250cm9sKCdwYXJhbUJ1dHRvbicpIGFzIEZvcm1BcnJheSB8IG51bGw7XHJcbiAgICAgICAgaWYgKHBhcmFtQnV0dG9uKSB7XHJcbiAgICAgICAgICAgIHBhcmFtQnV0dG9uLmNsZWFyKCk7XHJcbiAgICAgICAgICAgIHBhcmFtQnV0dG9uLnJlc2V0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmluaXRWYWxpZGF0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRDb250cm9sKGNvbnRyb2xOYW1lOiBzdHJpbmcpOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtID8gdGhpcy5mb3JtLmdldChjb250cm9sTmFtZSkgOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFBhcmFtKF9uYW1lOiBzdHJpbmcsIF92YWx1ZTogYW55LCBfdHlwZTogc3RyaW5nKTogUGFyYW1ldGVyIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBuYW1lOiBfbmFtZSxcclxuICAgICAgICAgICAgdmFsdWU6IF92YWx1ZSxcclxuICAgICAgICAgICAgaW46ICdxdWVyeScsXHJcbiAgICAgICAgICAgIHR5cGU6IF90eXBlLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRBY2NvdW50T3B0aW9uU2VydmljZShmaWx0ZXI6IHN0cmluZyA9ICcnLCBpc0luZmluaXRlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZ0FjY291bnRPcHRpb24gPSB0cnVlO1xyXG5cclxuICAgICAgICBjb25zdCBwYXJhbWV0ZXJMaXN0OiBBcnJheTxQYXJhbWV0ZXI+ID0gW1xyXG4gICAgICAgICAgICB0aGlzLmluaXRQYXJhbSgncGFnZU5vJywgdGhpcy5wYWdlTm9BY2NvdW50T3B0aW9uLCAnbnVtYmVyJyksXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFBhcmFtKCdyb3dQZXJQYWdlJywgMjAsICdudW1iZXInKSxcclxuICAgICAgICAgICAgdGhpcy5pbml0UGFyYW0oJ3BsYXRmb3JtJywgJ1dBJywgJ3N0cmluZycpLFxyXG4gICAgICAgICAgICB0aGlzLmluaXRQYXJhbSgnc3RhdHVzJywgJ0FQUFJPVkVEJywgJ3N0cmluZycpLFxyXG4gICAgICAgICAgICB0aGlzLmluaXRQYXJhbSgnZmlsdGVyJywgZmlsdGVyLCAnc3RyaW5nJyksXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgY29uc3Qgc3VicyA9IHRoaXMuYXBpQWRhcHRlclNlcnZpY2VcclxuICAgICAgICAgICAgLmV4ZWN1dGVBcGlSZXF1ZXN0KHBhcmFtZXRlckxpc3QsICcvYWRtaW4vYWNjb3VudCcsICdHRVQnKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyZXNwOiBBcHBSZXNwb25zZTxXaGF0c0FwcEFjY291bnREdG9bXT4pID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghcmVzcC5kYXRhKSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5hY2NvdW50T3B0aW9uID0gaXNJbmZpbml0ZSA/IFsuLi50aGlzLmFjY291bnRPcHRpb24sIC4uLnJlc3AuZGF0YV0gOiByZXNwLmRhdGE7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzSGF2ZU5leHRBY2NvdW50T3B0aW9uID0gcmVzcC5oYXZlTmV4dCA/PyB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmdBY2NvdW50T3B0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnN1YnNjcmliZXJzLnB1c2goc3Vicyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGdldFRlbXBsYXRlT3B0aW9uU2VydmljZShcclxuICAgICAgICBldmVudDogc3RyaW5nID0gbnVsbCxcclxuICAgICAgICBmaWx0ZXI6IHN0cmluZyA9ICcnLFxyXG4gICAgICAgIGlzSW5maW5pdGU6IGJvb2xlYW4gPSBmYWxzZVxyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmdUZW1wbGF0ZU9wdGlvbiA9IHRydWU7XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcmFtZXRlckxpc3Q6IEFycmF5PFBhcmFtZXRlcj4gPSBbXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFBhcmFtKCdwYWdlTm8nLCB0aGlzLnBhZ2VOb1RlbXBsYXRlT3B0aW9uLCAnbnVtYmVyJyksXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFBhcmFtKCdyb3dQZXJQYWdlJywgMjAsICdudW1iZXInKSxcclxuICAgICAgICAgICAgdGhpcy5pbml0UGFyYW0oJ3BsYXRmb3JtJywgJ1dBJywgJ3N0cmluZycpLFxyXG4gICAgICAgICAgICB0aGlzLmluaXRQYXJhbSgndGVtcGxhdGVUeXBlJywgJ2FsbCcsICdzdHJpbmcnKSxcclxuICAgICAgICAgICAgdGhpcy5pbml0UGFyYW0oJ2ZpbHRlcicsIGZpbHRlciwgJ3N0cmluZycpLFxyXG4gICAgICAgICAgICB0aGlzLmluaXRQYXJhbSgnc3RhdHVzJywgJ0FQUFJPVkVEJywgJ3N0cmluZycpLFxyXG4gICAgICAgICAgICB0aGlzLmluaXRQYXJhbSgnY2xpZW50SWQnLCB0aGlzLmdldENvbnRyb2woJ2Zyb20nKT8udmFsdWU/LmNsaWVudElkID8/ICcnLCAnc3RyaW5nJyksXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFBhcmFtKCd3YWJhSWQnLCB0aGlzLmdldENvbnRyb2woJ2Zyb20nKT8udmFsdWU/LndhYmFJZCA/PyAnJywgJ3N0cmluZycpLFxyXG4gICAgICAgIF07XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzUmVhZE9ubHlNb2RlKSBwYXJhbWV0ZXJMaXN0LnB1c2godGhpcy5pbml0UGFyYW0oJ3N1bW1hcnknLCB0cnVlLCAnc3RyaW5nJykpO1xyXG5cclxuICAgICAgICBjb25zdCBtZXNzYWdlVHlwZSA9IHRoaXMuZm9ybS52YWx1ZT8uY2hhbm5lbDtcclxuXHJcbiAgICAgICAgaWYgKG1lc3NhZ2VUeXBlID09PSAndXRpbGl0eScpIHtcclxuICAgICAgICAgICAgcGFyYW1ldGVyTGlzdC5wdXNoKHRoaXMuaW5pdFBhcmFtKCdpc0RpcmVjdFNlbmQnLCB0cnVlLCAnc3RyaW5nJykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc3VicyA9IHRoaXMuYXBpQWRhcHRlclNlcnZpY2VcclxuICAgICAgICAgICAgLmV4ZWN1dGVBcGlSZXF1ZXN0KHBhcmFtZXRlckxpc3QsICcvbWVzc2FnZS90ZW1wbGF0ZScsICdHRVQnKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyZXNwOiBBcHBSZXNwb25zZTxUZW1wbGF0ZVdBTW9kZWxbXT4pID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRPcHRpb25zID0gdGhpcy50ZW1wbGF0ZU9wdGlvbiB8fCBbXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0RhdGEgPSByZXNwLmRhdGEgfHwgW107XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlT3B0aW9uID0gaXNJbmZpbml0ZSA/IFsuLi5jdXJyZW50T3B0aW9ucywgLi4ubmV3RGF0YV0gOiBuZXdEYXRhO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuaXNIYXZlTmV4dFRlbXBsYXRlT3B0aW9uID0gcmVzcC5oYXZlTmV4dCA/PyB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmdUZW1wbGF0ZU9wdGlvbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZU9wdGlvbj8uZmluZChcclxuICAgICAgICAgICAgICAgICAgICAodCkgPT4gdC5JRCA9PT0gdGhpcy5nZXRDb250cm9sKCd0ZW1wbGF0ZScpPy52YWx1ZT8uSURcclxuICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0ZW1wbGF0ZScpPy5wYXRjaFZhbHVlKHRlbXBsYXRlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0Q29udHJvbCgnaXNVcGxvYWQnKT8udmFsdWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZURvd25sb2FkQ1NWKHRoaXMuZ2V0Q29udHJvbCgnaXNVcGxvYWQnKT8udmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVUZW1wbGF0ZSh0aGlzLmdldENvbnRyb2woJ3RlbXBsYXRlJyk/LnZhbHVlKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlcnMucHVzaChzdWJzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRQYXJhbWV0ZXIoaXNCdXR0b246IGJvb2xlYW4gPSBmYWxzZSwgdmFsdWU6IHN0cmluZyA9ICcnKTogRm9ybUdyb3VwIHtcclxuICAgICAgICBjb25zdCBmb3JtID0gaXNCdXR0b25cclxuICAgICAgICAgICAgPyBuZXcgRm9ybUdyb3VwKHtcclxuICAgICAgICAgICAgICAgICAgbmFtZTogbmV3IEZvcm1BcnJheShbXSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgOiBuZXcgRm9ybUdyb3VwKHtcclxuICAgICAgICAgICAgICAgICAgbmFtZTogbmV3IEZvcm1Db250cm9sKFxyXG4gICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogdGhpcy5pc1JlYWRPbmx5TW9kZSB8fCBbJyRVbnN1YnNjcmliZUFjY291bnQnXS5pbmNsdWRlcyh2YWx1ZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gZm9ybTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZ2V0UGFyYW1IZWFkZXIoKTogRm9ybUdyb3VwW10ge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5mb3JtLmdldCgncGFyYW1IZWFkZXInKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzIGFzIEZvcm1Hcm91cFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRQYXJhbUhlYWRlcih2YWx1ZTogc3RyaW5nID0gJycpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBmb3JtID0gdGhpcy5pbml0UGFyYW1ldGVyKGZhbHNlLCB2YWx1ZSk7XHJcbiAgICAgICAgKHRoaXMuZm9ybS5nZXQoJ3BhcmFtSGVhZGVyJykgYXMgRm9ybUFycmF5KS5wdXNoKGZvcm0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBnZXRQYXJhbUJvZHkoKTogRm9ybUdyb3VwW10ge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5mb3JtLmdldCgncGFyYW1Cb2R5JykgYXMgRm9ybUFycmF5KS5jb250cm9scyBhcyBGb3JtR3JvdXBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkUGFyYW1Cb2R5KHZhbHVlOiBzdHJpbmcgPSAnJyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmluaXRQYXJhbWV0ZXIoZmFsc2UsIHZhbHVlKTtcclxuICAgICAgICAodGhpcy5mb3JtLmdldCgncGFyYW1Cb2R5JykgYXMgRm9ybUFycmF5KS5wdXNoKGZvcm0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBnZXRCdXR0b24oKTogRm9ybUdyb3VwW10ge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5mb3JtLmdldCgncGFyYW1CdXR0b24nKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzIGFzIEZvcm1Hcm91cFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRQYXJhbUJ1dHRvbihpbmRleDogbnVtYmVyKTogRm9ybUdyb3VwW10ge1xyXG4gICAgICAgIGNvbnN0IGZvcm0gPSAodGhpcy5mb3JtLmdldCgncGFyYW1CdXR0b24nKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzIGFzIEZvcm1Hcm91cFtdO1xyXG4gICAgICAgIHJldHVybiAoZm9ybVtpbmRleF0uZ2V0KCduYW1lJykgYXMgRm9ybUFycmF5KS5jb250cm9scyBhcyBGb3JtR3JvdXBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkUGFyYW1CdXR0b24oKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZm9ybSA9IHRoaXMuaW5pdFBhcmFtZXRlcih0cnVlKTtcclxuICAgICAgICAodGhpcy5mb3JtLmdldCgncGFyYW1CdXR0b24nKSBhcyBGb3JtQXJyYXkpLnB1c2goZm9ybSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGdldElzVGV4dCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2NoYW5uZWwnKT8udmFsdWUgJiZcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdjaGFubmVsJyk/LnZhbHVlPy50b0xvd2VyQ2FzZSgpID09PSAndGV4dCdcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBnZXRJc01lZGlhKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnY2hhbm5lbCcpPy52YWx1ZSAmJlxyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2NoYW5uZWwnKT8udmFsdWU/LnRvTG93ZXJDYXNlKCkgPT09ICdtZWRpYSdcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBnZXRJc1RlbXBsYXRlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnY2hhbm5lbCcpPy52YWx1ZSAmJlxyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2NoYW5uZWwnKT8udmFsdWU/LnRvTG93ZXJDYXNlKCkgPT09ICd0ZW1wbGF0ZSdcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBnZXRJc0NhdGFsb2d1ZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2NoYW5uZWwnKT8udmFsdWUgJiZcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdjaGFubmVsJyk/LnZhbHVlPy50b0xvd2VyQ2FzZSgpID09PSAnY2F0YWxvZ3VlJ1xyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGdldElzVXRpbGl0eSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2NoYW5uZWwnKT8udmFsdWUgJiZcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdjaGFubmVsJyk/LnZhbHVlPy50b0xvd2VyQ2FzZSgpID09PSAndXRpbGl0eSdcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBnZXRDYXJvdXNlbENvbnRyb2xzKCkge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5mb3JtLmdldCgncGFyYW1DYXJvdXNlbCcpIGFzIEZvcm1BcnJheSkuY29udHJvbHMgYXMgRm9ybUdyb3VwW107XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q2Fyb3VzZWxCdXR0b25zKGNhcmRJbmRleDogbnVtYmVyKTogYW55W10ge1xyXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlVmFsdWUgPSB0aGlzLmZvcm0uZ2V0KCd0ZW1wbGF0ZScpPy52YWx1ZTtcclxuICAgICAgICByZXR1cm4gdGVtcGxhdGVWYWx1ZT8uY2Fyb3VzZWw/LltjYXJkSW5kZXhdPy5idXR0b25zIHx8IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENhcm91c2VsQm9keVBhcmFtcyhjYXJkSW5kZXg6IG51bWJlcik6IEZvcm1BcnJheSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2Fyb3VzZWxDb250cm9sc1tjYXJkSW5kZXhdLmdldCgnYm9keVBhcmFtcycpIGFzIEZvcm1BcnJheTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDYXJvdXNlbEJ0blBhcmFtcyhjYXJkSW5kZXg6IG51bWJlciwgYnRuSW5kZXg6IG51bWJlcik6IEZvcm1BcnJheSB7XHJcbiAgICAgICAgY29uc3QgYnRuUGFyYW1zQXJyYXkgPSB0aGlzLmdldENhcm91c2VsQ29udHJvbHNbY2FyZEluZGV4XS5nZXQoJ2J1dHRvblBhcmFtcycpIGFzIEZvcm1BcnJheTtcclxuICAgICAgICByZXR1cm4gYnRuUGFyYW1zQXJyYXkuYXQoYnRuSW5kZXgpIGFzIEZvcm1BcnJheTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TmV4dEFjY291bnRCYXRjaCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNIYXZlTmV4dEFjY291bnRPcHRpb24pIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5wYWdlTm9BY2NvdW50T3B0aW9uICs9IDE7XHJcbiAgICAgICAgdGhpcy5nZXRBY2NvdW50T3B0aW9uU2VydmljZSgnJywgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFjY291bnRTZWxlY3RlZERpc3BsYXkoXHJcbiAgICAgICAgYXR0cmlidXRlMTogV2hhdHNBcHBBY2NvdW50RHRvLFxyXG4gICAgICAgIGF0dHJpYnV0ZTI6IFdoYXRzQXBwQWNjb3VudER0b1xyXG4gICAgKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gYXR0cmlidXRlMSAmJiBhdHRyaWJ1dGUyICYmIGF0dHJpYnV0ZTEuaWQgPT0gYXR0cmlidXRlMi5pZFxyXG4gICAgICAgICAgICA/IGAke2F0dHJpYnV0ZTEubmFtZX0gKCR7YXR0cmlidXRlMS5hY2NvdW50Tm99KWBcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0TmV4dFRlbXBsYXRlQmF0Y2goKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSGF2ZU5leHRUZW1wbGF0ZU9wdGlvbikgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLnBhZ2VOb1RlbXBsYXRlT3B0aW9uICs9IDE7XHJcbiAgICAgICAgdGhpcy5nZXRUZW1wbGF0ZU9wdGlvblNlcnZpY2UobnVsbCwgJycsIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB0ZW1wbGF0ZVNlbGVjdGVkRGlzcGxheShcclxuICAgICAgICBhdHRyaWJ1dGUxOiBUZW1wbGF0ZVdBTW9kZWwsXHJcbiAgICAgICAgYXR0cmlidXRlMjogVGVtcGxhdGVXQU1vZGVsXHJcbiAgICApOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBhdHRyaWJ1dGUxICYmIGF0dHJpYnV0ZTIgJiYgYXR0cmlidXRlMS5uYW1lID09IGF0dHJpYnV0ZTIubmFtZVxyXG4gICAgICAgICAgICA/IGAke2F0dHJpYnV0ZTEubmFtZX1gXHJcbiAgICAgICAgICAgIDogJyc7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uRmlsZVNlbGVjdGVkKGV2ZW50OiBFdmVudCkge1xyXG4gICAgICAgIGNvbnN0IGZpbGU6IEZpbGVMaXN0ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KS5maWxlcztcclxuICAgICAgICBjb25zdCBhY2NlcHQgPSB0aGlzLmV4dEZpbGVBY2NlcHRlZC5zcGxpdCgnLycpO1xyXG4gICAgICAgIGxldCBtYXRjaFR5cGUgPSBhY2NlcHRbMF07XHJcblxyXG4gICAgICAgIGlmIChmaWxlLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5leHRGaWxlQWNjZXB0ZWQgPT09ICdhcHBsaWNhdGlvbi9wZGYnKSBtYXRjaFR5cGUgPSBhY2NlcHRbMV07XHJcblxyXG4gICAgICAgIGlmICghZmlsZVswXS50eXBlLmluY2x1ZGVzKG1hdGNoVHlwZSkpIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1NvcnJ5LCB0aGUgZmlsZSB5b3UgYXJlIHVwbG9hZGluZyBpcyBub3TCoGFsbG93ZWQnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGZpbGVbMF0uc2l6ZSA+IDEwMDAwMDAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVcGxvYWQgbWVkaWEgZmFpbGVkLCBtYXggc2l6ZSAxMG1iJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnZmlsZScpPy5zZXRWYWx1ZShmaWxlWzBdKTtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ2ZpbGVUeXBlJyk/LnNldFZhbHVlKCdpbWFnZScpO1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnZmlsZU5hbWUnKT8uc2V0VmFsdWUoZmlsZVswXS5uYW1lKTtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ3RhcmdldFVSTCcpPy5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgndGFyZ2V0VVJMJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuXHJcbiAgICAgICAgaWYgKGZpbGVbMF0udHlwZS5pbmRleE9mKCd2aWRlbycpID4gLTEpIHRoaXMuZ2V0Q29udHJvbCgnZmlsZVR5cGUnKT8uc2V0VmFsdWUoJ3ZpZGVvJyk7XHJcblxyXG4gICAgICAgIHRoaXMudXBsb2FkTWVkaWFTZXJ2aWNlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGxvYWRNZWRpYVNlcnZpY2UoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgcGFyYW1ldGVyTGlzdDogQXJyYXk8UGFyYW1ldGVyPiA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbmFtZTogJ2ZpbGUnLFxyXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuZ2V0Q29udHJvbCgnZmlsZScpPy52YWx1ZSxcclxuICAgICAgICAgICAgICAgIGluOiAnZm9ybURhdGEnLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogJ29iamVjdCcsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgY29uc3Qgc3VicyA9IHRoaXMuYXBpQWRhcHRlclNlcnZpY2VcclxuICAgICAgICAgICAgLmV4ZWN1dGVBcGlSZXF1ZXN0KHBhcmFtZXRlckxpc3QsICcvbWVzc2FnZS9tZWRpYScsICdQT1NUJylcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgocmVzcDogQXBwUmVzcG9uc2U8YW55PikgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0YXJnZXRVUkwnKT8uY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3RhcmdldFVSTCcpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3RhcmdldFVSTCcpPy5zZXRWYWx1ZShyZXNwLmRhdGEudGFyZ2V0VVJMKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnZmlsZScpPy5yZXNldCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MoJ1VwbG9hZCBtZWRpYSBzdWNjZXNzJyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnN1YnNjcmliZXJzLnB1c2goc3Vicyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGJ1dHRvblBhcmFtc0NvbnRyb2xzKCkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmZvcm0uZ2V0KCdidXR0b25QYXJhbXMnKSBhcyBGb3JtQXJyYXk7XHJcbiAgICAgICAgcmV0dXJuIGNvbnRyb2wgPyBjb250cm9sLmNvbnRyb2xzIDogW107XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzVXNpbmdFeGNlbEJ1bGsoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29udHJvbCgnaXNVcGxvYWQnKT8udmFsdWUgfHwgZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVdBTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmlzU2hvd1BhcmFtZXRlciA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoIXRlbXBsYXRlKSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IGZvcm1TdG9yYWdlID0gdGhpcy5nZXRDYW1wYWlnblN0b3JhZ2U/LmdlbmVyYWxJbmZvcm1hdGlvbj8uZm9ybTtcclxuXHJcbiAgICAgICAgY29uc3QgYnV0dG9uUGFyYW1zQXJyYXkgPSB0aGlzLmZvcm0uZ2V0KCdidXR0b25QYXJhbXMnKSBhcyBGb3JtQXJyYXk7XHJcbiAgICAgICAgYnV0dG9uUGFyYW1zQXJyYXkuY2xlYXIoKTtcclxuXHJcbiAgICAgICAgaWYgKHRlbXBsYXRlICYmIHRlbXBsYXRlLmJ1dHRvbnMgJiYgdGVtcGxhdGUuYnV0dG9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBxckluZGV4TG9jYWwgPSAwO1xyXG5cclxuICAgICAgICAgICAgdGVtcGxhdGUuYnV0dG9ucy5mb3JFYWNoKChidG46IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGJ0bi50eXBlID09PSAnUVVJQ0tfUkVQTFknKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGV4aXN0aW5nUGF5bG9hZCA9ICcnO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBTS0VOQVJJTyAxOiBEYXRhIGRhcmkgTG9jYWwgU3RhdGVcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybVN0b3JhZ2U/LmJ1dHRvblBhcmFtcyAmJiBmb3JtU3RvcmFnZS5idXR0b25QYXJhbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1BheWxvYWQgPSBmb3JtU3RvcmFnZS5idXR0b25QYXJhbXNbcXJJbmRleExvY2FsXT8ucGF5bG9hZCB8fCAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgcXJJbmRleExvY2FsKys7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNLRU5BUklPIDI6IERhdGEgZGFyaSBCRVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtU3RvcmFnZT8ucGFyYW1CdXR0b24gJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShmb3JtU3RvcmFnZS5wYXJhbUJ1dHRvbltpbmRleF0pXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUGF5bG9hZCA9IGZvcm1TdG9yYWdlLnBhcmFtQnV0dG9uW2luZGV4XVswXSB8fCAnJztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvblBhcmFtc0FycmF5LnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IG5ldyBGb3JtQ29udHJvbChidG4udGV4dCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiBuZXcgRm9ybUNvbnRyb2woXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZXhpc3RpbmdQYXlsb2FkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogdGhpcy5pc1JlYWRPbmx5TW9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtWYWxpZGF0b3JzLm1heExlbmd0aCgyNTYpXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaXNIYXZlVGVtcGxhdGVQYXJhbSA9XHJcbiAgICAgICAgICAgICh0ZW1wbGF0ZS5oZWFkZXI/LmV4YW1wbGVzPy5sZW5ndGggPz8gMCkgPiAwIHx8XHJcbiAgICAgICAgICAgICh0ZW1wbGF0ZS5ib2R5Py5leGFtcGxlcz8ubGVuZ3RoID8/IDApID4gMCB8fFxyXG4gICAgICAgICAgICAodGVtcGxhdGUuYnV0dG9ucz8ubGVuZ3RoID8/IDApID4gMCB8fFxyXG4gICAgICAgICAgICAodGVtcGxhdGUuY2Fyb3VzZWw/Lmxlbmd0aCA/PyAwKSA+IDA7XHJcblxyXG4gICAgICAgIGlmIChbJ2ltYWdlJywgJ3ZpZGVvJywgJ2RvY3VtZW50J10uaW5jbHVkZXModGVtcGxhdGU/LmhlYWRlcj8udHlwZT8udG9Mb3dlckNhc2UoKSkpIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdmaWxlTmFtZScpPy5zZXRWYWx1ZShcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2FtcGFpZ25TdG9yYWdlPy5nZW5lcmFsSW5mb3JtYXRpb24/LmZvcm0uZmlsZU5hbWUgPz9cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENhbXBhaWduU3RvcmFnZT8uZ2VuZXJhbEluZm9ybWF0aW9uPy5mb3JtLnRhcmdldFVSTCA/P1xyXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLmhlYWRlci51cmxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0YXJnZXRVUkwnKT8uc2V0VmFsdWUoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldENhbXBhaWduU3RvcmFnZT8uZ2VuZXJhbEluZm9ybWF0aW9uPy5mb3JtLnRhcmdldFVSTCA/PyB0ZW1wbGF0ZS5oZWFkZXIudXJsXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZpbGVUeXBlQ2hhbmdlKHRlbXBsYXRlPy5oZWFkZXI/LnR5cGU/LnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgKHRlbXBsYXRlLmhlYWRlci5leGFtcGxlcz8ubGVuZ3RoID8/IDApID4gMFxyXG4gICAgICAgICAgICA/IHRoaXMuZ2V0Q29udHJvbCgncGFyYW1IZWFkZXInKT8uc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKVxyXG4gICAgICAgICAgICA6IHRoaXMuZ2V0Q29udHJvbCgncGFyYW1IZWFkZXInKT8uY2xlYXJWYWxpZGF0b3JzKCk7XHJcblxyXG4gICAgICAgICh0ZW1wbGF0ZS5ib2R5LmV4YW1wbGVzPy5sZW5ndGggPz8gMCkgPiAwXHJcbiAgICAgICAgICAgID8gdGhpcy5nZXRDb250cm9sKCdwYXJhbUJvZHknKT8uc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKVxyXG4gICAgICAgICAgICA6IHRoaXMuZ2V0Q29udHJvbCgncGFyYW1Cb2R5Jyk/LmNsZWFyVmFsaWRhdG9ycygpO1xyXG5cclxuICAgICAgICAodGVtcGxhdGUuYnV0dG9ucz8ubGVuZ3RoID8/IDApID4gMFxyXG4gICAgICAgICAgICA/IHRoaXMuZ2V0Q29udHJvbCgncGFyYW1CdXR0b24nKT8uc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKVxyXG4gICAgICAgICAgICA6IHRoaXMuZ2V0Q29udHJvbCgncGFyYW1CdXR0b24nKT8uY2xlYXJWYWxpZGF0b3JzKCk7XHJcblxyXG4gICAgICAgICh0aGlzLmZvcm0uZ2V0KCdwYXJhbUhlYWRlcicpIGFzIEZvcm1BcnJheSkuY29udHJvbHMgPSBbXTtcclxuICAgICAgICAodGhpcy5mb3JtLmdldCgncGFyYW1IZWFkZXInKSBhcyBGb3JtQXJyYXkpLnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCdwYXJhbUhlYWRlcicpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgKHRoaXMuZm9ybS5nZXQoJ3BhcmFtQm9keScpIGFzIEZvcm1BcnJheSkuY29udHJvbHMgPSBbXTtcclxuICAgICAgICAodGhpcy5mb3JtLmdldCgncGFyYW1Cb2R5JykgYXMgRm9ybUFycmF5KS5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgncGFyYW1Cb2R5Jyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAodGhpcy5mb3JtLmdldCgncGFyYW1CdXR0b24nKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzID0gW107XHJcbiAgICAgICAgKHRoaXMuZm9ybS5nZXQoJ3BhcmFtQnV0dG9uJykgYXMgRm9ybUFycmF5KS5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgncGFyYW1CdXR0b24nKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnb3RwVmFsdWUnKT8uc2V0VmFsdWUoJycpO1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnb3RwVmFsdWUnKT8uY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCdvdHBWYWx1ZScpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblxyXG4gICAgICAgIGlmICh0ZW1wbGF0ZS5jYXRlZ29yeSA9PT0gJ0FVVEhFTlRJQ0FUSU9OJykge1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ290cFZhbHVlJyk/LnNldFZhbHVlKFxyXG4gICAgICAgICAgICAgICAgZm9ybVN0b3JhZ2U/Lm90cFZhbHVlID8/XHJcbiAgICAgICAgICAgICAgICAgICAgWy4uLihmb3JtU3RvcmFnZT8udGVtcGxhdGU/LmJvZHk/LmV4YW1wbGVzID8/IFtdKV0/LnBvcCgpID8/XHJcbiAgICAgICAgICAgICAgICAgICAgJydcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnb3RwVmFsdWUnKT8uc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdvdHBWYWx1ZScpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0ZW1wbGF0ZS5oZWFkZXIuZXhhbXBsZXM/LmZvckVhY2goKGVhY2gsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkUGFyYW1IZWFkZXIoXHJcbiAgICAgICAgICAgICAgICBmb3JtU3RvcmFnZT8ucGFyYW1IZWFkZXI/LltpbmRleF0/Lm5hbWUgPz8gZm9ybVN0b3JhZ2U/LnBhcmFtSGVhZGVyPy5baW5kZXhdID8/ICcnXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRlbXBsYXRlLmJvZHkuZXhhbXBsZXM/LmZvckVhY2goKGVhY2gsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBwYXJhbVZhbHVlID1cclxuICAgICAgICAgICAgICAgIGZvcm1TdG9yYWdlPy5wYXJhbUJvZHk/LltpbmRleF0/Lm5hbWUgPz8gZm9ybVN0b3JhZ2U/LnBhcmFtQm9keT8uW2luZGV4XSA/PyAnJztcclxuXHJcbiAgICAgICAgICAgIGlmIChbJyRVbnN1YnNjcmliZUFjY291bnQnXS5pbmNsdWRlcyhlYWNoKSkgcGFyYW1WYWx1ZSA9IGVhY2g7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmFkZFBhcmFtQm9keShwYXJhbVZhbHVlKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgICAgIC8vIFRBTUJBSEFOOiBHZW5lcmF0ZSBWYXJpYWJsZSBEaW5hbWlzIGRhcmkgdGVtcGxhdGUuYm9keS5leGFtcGxlc1xyXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgICAgICB0aGlzLnZhcmlhYmxlcy5jbGVhcigpO1xyXG4gICAgICAgIGlmICh0ZW1wbGF0ZS5ib2R5Py5leGFtcGxlcyAmJiB0ZW1wbGF0ZS5ib2R5LmV4YW1wbGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgaXNTYXZlZFRlbXBsYXRlTWF0Y2hlcyA9IGZvcm1TdG9yYWdlPy50ZW1wbGF0ZT8ubmFtZSA9PT0gdGVtcGxhdGUubmFtZTtcclxuXHJcbiAgICAgICAgICAgIHRlbXBsYXRlLmJvZHkuZXhhbXBsZXMuZm9yRWFjaCgoZXhhbXBsZVZhbHVlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBzYXZlZFZhcmlhYmxlID0gJyc7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNTYXZlZFRlbXBsYXRlTWF0Y2hlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHNhdmVkVmFyaWFibGUgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtU3RvcmFnZT8udmFyaWFibGVzPy5baW5kZXhdPy5wYXJhbU5hbWUgPz9cclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVN0b3JhZ2U/LnRlbXBsYXRlPy5kYXRhPy5baW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbmFsVmFsdWUgPSBzYXZlZFZhcmlhYmxlID8gc2F2ZWRWYXJpYWJsZSA6ICcnO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMudmFyaWFibGVzLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgbmV3IEZvcm1Hcm91cCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogbmV3IEZvcm1Db250cm9sKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmaW5hbFZhbHVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IHRoaXMuaXNSZWFkT25seU1vZGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0ZW1wbGF0ZS5ib2R5Py50ZXh0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgndGV4dCcpPy5zZXRWYWx1ZSh0ZW1wbGF0ZS5ib2R5LnRleHQpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3RleHQnKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcblxyXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgICAgICAvLyBUQU1CQUhBTjogR2VuZXJhdGUgRm9ybSBDYXJvdXNlbCBEaW5hbWlzXHJcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgICAgIGNvbnN0IGNhcm91c2VsQXJyYXkgPSB0aGlzLmZvcm0uZ2V0KCdwYXJhbUNhcm91c2VsJykgYXMgRm9ybUFycmF5O1xyXG4gICAgICAgIGNhcm91c2VsQXJyYXkuY2xlYXIoKTtcclxuXHJcbiAgICAgICAgY29uc3QgaXNVc2luZ1VwbG9hZCA9IHRoaXMuZ2V0Q29udHJvbCgnaXNVcGxvYWQnKT8udmFsdWU7XHJcbiAgICAgICAgY29uc3QgZHluYW1pY1ZhbGlkYXRvciA9IGlzVXNpbmdVcGxvYWQgPyBudWxsIDogVmFsaWRhdG9ycy5yZXF1aXJlZDtcclxuXHJcbiAgICAgICAgaWYgKHRlbXBsYXRlLmNhcm91c2VsICYmIHRlbXBsYXRlLmNhcm91c2VsLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgaXNTYXZlZFRlbXBsYXRlTWF0Y2hlcyA9IGZvcm1TdG9yYWdlPy50ZW1wbGF0ZT8ubmFtZSA9PT0gdGVtcGxhdGUubmFtZTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNhdmVkVXNlcklucHV0cyA9IGlzU2F2ZWRUZW1wbGF0ZU1hdGNoZXMgPyBmb3JtU3RvcmFnZT8ucGFyYW1DYXJvdXNlbCA6IG51bGw7XHJcblxyXG4gICAgICAgICAgICB0ZW1wbGF0ZS5jYXJvdXNlbC5mb3JFYWNoKChjYXJkOiBhbnksIGNhcmRJZHg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2FyZEdyb3VwID0gbmV3IEZvcm1Hcm91cCh7XHJcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyVVJMOiBuZXcgRm9ybUNvbnRyb2woY2FyZC5oZWFkZXI/LnVybCA/PyAnJyksXHJcbiAgICAgICAgICAgICAgICAgICAgYm9keVBhcmFtczogbmV3IEZvcm1BcnJheShbXSksXHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uUGFyYW1zOiBuZXcgRm9ybUFycmF5KFtdKSxcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIDEuIFNldHVwIEJvZHkgUGFyYW1zXHJcbiAgICAgICAgICAgICAgICBpZiAoY2FyZC5ib2R5Py5leGFtcGxlcz8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhcmQuYm9keS5leGFtcGxlcy5mb3JFYWNoKChfOiBhbnksIGJvZHlJZHg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBBTUJJTCBWQUxVRSBEQVJJIElOUFVUQU4gU0VCRUxVTU5ZQVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzYXZlZEJvZHlWYWwgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWRVc2VySW5wdXRzPy5bY2FyZElkeF0/LmJvZHlQYXJhbXM/Lltib2R5SWR4XT8ucGFyYW1OYW1lID8/ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2FyZEdyb3VwLmdldCgnYm9keVBhcmFtcycpIGFzIEZvcm1BcnJheSkucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogbmV3IEZvcm1Db250cm9sKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHZhbHVlOiBzYXZlZEJvZHlWYWwsIGRpc2FibGVkOiB0aGlzLmlzUmVhZE9ubHlNb2RlIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNWYWxpZGF0b3JcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoY2FyZC5idXR0b25zPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FyZC5idXR0b25zLmZvckVhY2goKGJ0bjogYW55LCBidG5JZHg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBidG5QYXJhbUFycmF5ID0gbmV3IEZvcm1BcnJheShbXSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTS0VOQVJJTyAxOiBCdXR0b24gZGVuZ2FuIHZhcmlhYmVsIChjb250b2ggVVJMIC8gUGhvbmUgZGVuZ2FuIHt7MX19KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnRuLmV4YW1wbGVzPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidG4uZXhhbXBsZXMuZm9yRWFjaCgoXzogYW55LCBwYXJhbUlkeDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2F2ZWRCdG5WYWwgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZFVzZXJJbnB1dHM/LltjYXJkSWR4XT8uYnV0dG9uUGFyYW1zPy5bYnRuSWR4XT8uW3BhcmFtSWR4XVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5wYXJhbU5hbWUgPz8gJyc7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0blBhcmFtQXJyYXkucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZvcm1Hcm91cCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWU6IG5ldyBGb3JtQ29udHJvbChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHZhbHVlOiBzYXZlZEJ0blZhbCwgZGlzYWJsZWQ6IHRoaXMuaXNSZWFkT25seU1vZGUgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljVmFsaWRhdG9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTS0VOQVJJTyAyOiBCdXR0b24gYmVydGlwZSBRVUlDS19SRVBMWSAoQnV0dWggaW5wdXQgUGF5bG9hZCBzdGF0aXMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJ0bi50eXBlID09PSAnUVVJQ0tfUkVQTFknKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzYXZlZFBheWxvYWRWYWwgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkVXNlcklucHV0cz8uW2NhcmRJZHhdPy5idXR0b25QYXJhbXM/LltidG5JZHhdPy5bMF0/LnBheWxvYWQgPz9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidG5QYXJhbUFycmF5LnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZvcm1Hcm91cCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IG5ldyBGb3JtQ29udHJvbChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdmFsdWU6IHNhdmVkUGF5bG9hZFZhbCwgZGlzYWJsZWQ6IHRoaXMuaXNSZWFkT25seU1vZGUgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JzLm1heExlbmd0aCgyNTYpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihpc1VzaW5nVXBsb2FkID8gW10gOiBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2FyZEdyb3VwLmdldCgnYnV0dG9uUGFyYW1zJykgYXMgRm9ybUFycmF5KS5wdXNoKGJ0blBhcmFtQXJyYXkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNhcm91c2VsQXJyYXkucHVzaChjYXJkR3JvdXApO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRlbXBsYXRlLmJ1dHRvbnM/LmZvckVhY2goKGVhY2gsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkUGFyYW1CdXR0b24oKTtcclxuICAgICAgICAgICAgY29uc3QgYnV0dG9uID0gdGhpcy5nZXRCdXR0b247XHJcblxyXG4gICAgICAgICAgICBpZiAoZWFjaC5leGFtcGxlcz8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgZWFjaC5leGFtcGxlcy5mb3JFYWNoKChfLCBwYXJhbUluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZvcm0gPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWFjaC50eXBlID09PSAnRkxPVycpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybSA9IHRoaXMuaW5pdFBhcmFtZXRlcihmYWxzZSwgZWFjaC5mbG93X2lkKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU2hvd1BhcmFtZXRlciA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0gPSB0aGlzLmluaXRQYXJhbWV0ZXIoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1TdG9yYWdlPy5wYXJhbUJ1dHRvbj8uW2luZGV4XT8ubmFtZT8uW3BhcmFtSW5kZXhdPy5uYW1lID8/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVN0b3JhZ2U/LnBhcmFtQnV0dG9uPy5baW5kZXhdPy5uYW1lPy5bcGFyYW1JbmRleF0gPz9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtU3RvcmFnZT8ucGFyYW1CdXR0b24/LltpbmRleF0/LltwYXJhbUluZGV4XSA/P1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAoYnV0dG9uW2J1dHRvbi5sZW5ndGggLSAxXS5nZXQoJ25hbWUnKSBhcyBGb3JtQXJyYXkpLnB1c2goZm9ybSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RDb250cm9sID0gYnV0dG9uW2J1dHRvbi5sZW5ndGggLSAxXT8uZ2V0KCduYW1lJyk7XHJcbiAgICAgICAgICAgICAgICBsYXN0Q29udHJvbD8uY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICAgICAgICBsYXN0Q29udHJvbD8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcmFtQm9keUFycmF5ID0gdGhpcy5mb3JtLmdldCgncGFyYW1Cb2R5JykgYXMgRm9ybUFycmF5O1xyXG5cclxuICAgICAgICBwYXJhbUJvZHlBcnJheS5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICBwYXJhbUJvZHlBcnJheS5jb250cm9scy5mb3JFYWNoKChjdHJsKSA9PiB7XHJcbiAgICAgICAgICAgIGN0cmwuZ2V0KCduYW1lJyk/LmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgICBjdHJsLmdldCgnbmFtZScpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHBhcmFtQm9keUFycmF5LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB0aGlzLnRvZ2dsZUV4Y2VsVmFsaWRhdGlvbih0aGlzLmZvcm0uZ2V0KCdpc1VwbG9hZCcpPy52YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZU1lZGlhVHlwZShfbWVkaWFUeXBlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBpZiAoX21lZGlhVHlwZSA9PT0gRW51bURhdGEuTUVESUFfVFlQRV9MT0NBVElPTikgdGhpcy5pbml0TWFwcztcclxuXHJcbiAgICAgICAgdGhpcy5mb3JtUmVzZXQodHJ1ZSk7XHJcbiAgICAgICAgdGhpcy5maWxlVHlwZUNoYW5nZShfbWVkaWFUeXBlLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZmlsZVR5cGVDaGFuZ2UodHlwZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5leHRGaWxlQWNjZXB0ZWQgPSAnaW1hZ2UvKic7XHJcblxyXG4gICAgICAgIGlmICh0eXBlID09PSBFbnVtRGF0YS5NRURJQV9UWVBFX1ZJREVPLnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5leHRGaWxlQWNjZXB0ZWQgPSAndmlkZW8vKic7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBFbnVtRGF0YS5NRURJQV9UWVBFX0RPQ1VNRU5ULnRvTG93ZXJDYXNlKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5leHRGaWxlQWNjZXB0ZWQgPSAnYXBwbGljYXRpb24vcGRmJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHVwZGF0ZVNlYXJjaChzZWFyY2hWYWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wYWdlTm9UZW1wbGF0ZU9wdGlvbiA9IDE7XHJcbiAgICAgICAgdGhpcy5nZXRUZW1wbGF0ZU9wdGlvblNlcnZpY2UobnVsbCwgc2VhcmNoVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVTZWFyY2hBY2NvdW50KHNlYXJjaFZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnBhZ2VOb0FjY291bnRPcHRpb24gPSAxO1xyXG4gICAgICAgIHRoaXMuZ2V0QWNjb3VudE9wdGlvblNlcnZpY2Uoc2VhcmNoVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdE1hcHMoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5tYXBzQVBJTG9hZGVyLmxvYWQoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZXRDdXJyZW50TG9jYXRpb24oKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZ2VvQ29kZXIgPSBuZXcgZ29vZ2xlLm1hcHMuR2VvY29kZXIoKTtcclxuICAgICAgICAgICAgY29uc3QgYXV0b2NvbXBsZXRlID0gbmV3IGdvb2dsZS5tYXBzLnBsYWNlcy5BdXRvY29tcGxldGUoXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1hcFNlYXJjaFJlZi5uYXRpdmVFbGVtZW50XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZS5hZGRMaXN0ZW5lcigncGxhY2VfY2hhbmdlZCcsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGxhY2U6IGdvb2dsZS5tYXBzLnBsYWNlcy5QbGFjZVJlc3VsdCA9IGF1dG9jb21wbGV0ZS5nZXRQbGFjZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYWNlLmdlb21ldHJ5KSByZXR1cm47XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFwcy5sYXRpdHVkZSA9IHBsYWNlLmdlb21ldHJ5LmxvY2F0aW9uLmxhdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFwcy5sb25naXR1ZGUgPSBwbGFjZS5nZW9tZXRyeS5sb2NhdGlvbi5sbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2xhdGl0dWRlJyk/LnNldFZhbHVlKHRoaXMubWFwcy5sYXRpdHVkZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdsb25naXR1ZGUnKT8uc2V0VmFsdWUodGhpcy5tYXBzLmxvbmdpdHVkZSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRDdXJyZW50TG9jYXRpb24oKSB7XHJcbiAgICAgICAgaWYgKCdnZW9sb2NhdGlvbicgaW4gbmF2aWdhdG9yKSB7XHJcbiAgICAgICAgICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oKHBvc2l0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZ2V0Q29udHJvbCgnbG9uZ2l0dWRlJyk/LnZhbHVlICYmICF0aGlzLmdldENvbnRyb2woJ2xhdGl0dWRlJyk/LnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBzLmxhdGl0dWRlID0gcG9zaXRpb24uY29vcmRzLmxhdGl0dWRlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFwcy5sb25naXR1ZGUgPSBwb3NpdGlvbi5jb29yZHMubG9uZ2l0dWRlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnbGF0aXR1ZGUnKT8uc2V0VmFsdWUodGhpcy5tYXBzLmxhdGl0dWRlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2xvbmdpdHVkZScpPy5zZXRWYWx1ZSh0aGlzLm1hcHMubG9uZ2l0dWRlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBtYXJrZXJEcmFnRW5kKGV2ZW50OiBnb29nbGUubWFwcy5Nb3VzZUV2ZW50KSB7XHJcbiAgICAgICAgaWYgKGV2ZW50LmxhdExuZykge1xyXG4gICAgICAgICAgICB0aGlzLm1hcHMubGF0aXR1ZGUgPSBldmVudC5sYXRMbmcubGF0KCk7XHJcbiAgICAgICAgICAgIHRoaXMubWFwcy5sb25naXR1ZGUgPSBldmVudC5sYXRMbmcubG5nKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnbGF0aXR1ZGUnKT8uc2V0VmFsdWUodGhpcy5tYXBzLmxhdGl0dWRlKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdsb25naXR1ZGUnKT8uc2V0VmFsdWUodGhpcy5tYXBzLmxvbmdpdHVkZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVEb3dubG9hZENTVihpc0NoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ2lzVXBsb2FkJyk/LnNldFZhbHVlKGlzQ2hlY2tlZCk7XHJcblxyXG4gICAgICAgIGlmIChpc0NoZWNrZWQpIHtcclxuICAgICAgICAgICAgKHRoaXMuZ2V0Q29udHJvbCgncGFyYW1IZWFkZXInKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzID0gW107XHJcbiAgICAgICAgICAgICh0aGlzLmdldENvbnRyb2woJ3BhcmFtSGVhZGVyJykgYXMgRm9ybUFycmF5KS5yZXNldCgpO1xyXG4gICAgICAgICAgICAodGhpcy5nZXRDb250cm9sKCdwYXJhbUJvZHknKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzID0gW107XHJcbiAgICAgICAgICAgICh0aGlzLmdldENvbnRyb2woJ3BhcmFtQm9keScpIGFzIEZvcm1BcnJheSkucmVzZXQoKTtcclxuICAgICAgICAgICAgKHRoaXMuZ2V0Q29udHJvbCgncGFyYW1CdXR0b24nKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzID0gW107XHJcbiAgICAgICAgICAgICh0aGlzLmdldENvbnRyb2woJ3BhcmFtQnV0dG9uJykgYXMgRm9ybUFycmF5KS5yZXNldCgpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3BhcmFtSGVhZGVyJyk/LmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3BhcmFtQm9keScpPy5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdwYXJhbUJ1dHRvbicpPy5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdwYXJhbUhlYWRlcicpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgncGFyYW1Cb2R5Jyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdwYXJhbUJ1dHRvbicpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnb3RwVmFsdWUnKT8ucmVzZXQoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdvdHBWYWx1ZScpPy5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdvdHBWYWx1ZScpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMudmFyaWFibGVzLmNvbnRyb2xzLmZvckVhY2goKGN0cmwpID0+IHtcclxuICAgICAgICAgICAgICAgIGN0cmwuZ2V0KCdwYXJhbU5hbWUnKT8uY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICAgICAgICBjdHJsLmdldCgncGFyYW1OYW1lJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhcm91c2VsQXJyYXkgPSB0aGlzLmZvcm0uZ2V0KCdwYXJhbUNhcm91c2VsJykgYXMgRm9ybUFycmF5O1xyXG4gICAgICAgICAgICBpZiAoY2Fyb3VzZWxBcnJheSkge1xyXG4gICAgICAgICAgICAgICAgY2Fyb3VzZWxBcnJheS5jb250cm9scy5mb3JFYWNoKChjYXJkOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5UGFyYW1zID0gY2FyZC5nZXQoJ2JvZHlQYXJhbXMnKSBhcyBGb3JtQXJyYXk7XHJcbiAgICAgICAgICAgICAgICAgICAgYm9keVBhcmFtcz8uY29udHJvbHMuZm9yRWFjaCgoYkN0cmwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYkN0cmwuZ2V0KCdwYXJhbU5hbWUnKT8uY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJDdHJsLmdldCgncGFyYW1OYW1lJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRuUGFyYW1zID0gY2FyZC5nZXQoJ2J1dHRvblBhcmFtcycpIGFzIEZvcm1BcnJheTtcclxuICAgICAgICAgICAgICAgICAgICBidG5QYXJhbXM/LmNvbnRyb2xzLmZvckVhY2goKGJ0bkdyb3VwOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGJ0bkdyb3VwIGFzIEZvcm1BcnJheSkuY29udHJvbHMuZm9yRWFjaCgocEJ0bkN0cmwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdG5DdHJsLmdldCgncGFyYW1OYW1lJyk/LmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ0bkN0cmwuZ2V0KCdwYXJhbU5hbWUnKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ0bkN0cmwuZ2V0KCdwYXlsb2FkJyk/LmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJ0bkN0cmwuZ2V0KCdwYXlsb2FkJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMudXBkYXRlVGVtcGxhdGUodGhpcy5nZXRDb250cm9sKCd0ZW1wbGF0ZScpPy52YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhbmRsZUNoYW5nZVRlbXBsYXRlKHVzZUV4aXN0aW5nOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCdpc0Rvd25sb2FkVmFyaWFibGVYTFMnKT8uc2V0VmFsdWUoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMudmFyaWFibGVzLmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVWYXJpYWJsZURvd25sb2FkWExTKGZhbHNlKTtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ3RleHQnKT8uc2V0VmFsdWUoJycpO1xyXG4gICAgICAgIGlmICh1c2VFeGlzdGluZykge1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3RlbXBsYXRlJyk/LnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgndGV4dCcpPy5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0ZXh0Jyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0ZW1wbGF0ZScpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0ZW1wbGF0ZScpPy5yZXNldCgpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3RlbXBsYXRlJyk/LmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3RleHQnKT8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXgoMTAyNCldKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgndGV4dCcpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgndGVtcGxhdGUnKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgaGFuZGxlQ2hhbmdlRnJvbSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgeyBpc1VzZUV4aXN0aW5nVGVtcGxhdGUgfSA9IHRoaXMuZm9ybS52YWx1ZTtcclxuICAgICAgICBpZiAoIWlzVXNlRXhpc3RpbmdUZW1wbGF0ZSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuZ2V0VGVtcGxhdGVPcHRpb25TZXJ2aWNlKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgdmFyaWFibGVzKCk6IEZvcm1BcnJheSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29udHJvbCgndmFyaWFibGVzJykgYXMgRm9ybUFycmF5O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3luY1ZhcmlhYmxlc0Zyb21UZXh0KHRleHQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0ZXh0ID09PSBudWxsIHx8IHRleHQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgY291bnRlciA9IDE7XHJcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFRleHQgPSB0ZXh0LnJlcGxhY2UoL1xce1xce1xccypcXGQrXFxzKlxcfVxcfS9nLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcGxhY2VtZW50ID0gYHt7JHtjb3VudGVyfX19YDtcclxuICAgICAgICAgICAgY291bnRlcisrO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGNvbnN0IHRhcmdldFZhcmlhYmxlQ291bnQgPSBjb3VudGVyIC0gMTtcclxuICAgICAgICBpZiAodGV4dCAhPT0gbm9ybWFsaXplZFRleHQpIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0ZXh0Jyk/LnNldFZhbHVlKG5vcm1hbGl6ZWRUZXh0LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb3VudCA9IHRoaXMudmFyaWFibGVzLmxlbmd0aDtcclxuXHJcbiAgICAgICAgaWYgKHRhcmdldFZhcmlhYmxlQ291bnQgPiBjdXJyZW50Q291bnQpIHtcclxuICAgICAgICAgICAgY29uc3QgZGlmZiA9IHRhcmdldFZhcmlhYmxlQ291bnQgLSBjdXJyZW50Q291bnQ7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZjsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnZhcmlhYmxlcy5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWU6IG5ldyBGb3JtQ29udHJvbChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdmFsdWU6ICcnLCBkaXNhYmxlZDogdGhpcy5pc1JlYWRPbmx5TW9kZSB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0YXJnZXRWYXJpYWJsZUNvdW50IDwgY3VycmVudENvdW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpZmYgPSBjdXJyZW50Q291bnQgLSB0YXJnZXRWYXJpYWJsZUNvdW50O1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpZmY7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YXJpYWJsZXMucmVtb3ZlQXQodGhpcy52YXJpYWJsZXMubGVuZ3RoIC0gMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYWRkVmFyaWFibGUoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdGV4dENvbnRyb2wgPSB0aGlzLmdldENvbnRyb2woJ3RleHQnKTtcclxuXHJcbiAgICAgICAgaWYgKHRleHRDb250cm9sKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRCb2R5ID0gdGV4dENvbnRyb2wudmFsdWUgfHwgJyc7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBuZXh0U2VxdWVuY2UgPSB0aGlzLnZhcmlhYmxlcy5sZW5ndGggKyAxO1xyXG4gICAgICAgICAgICBjb25zdCBuZXdTZXF1ZW5jZSA9IGB7eyR7bmV4dFNlcXVlbmNlfX19YDtcclxuXHJcbiAgICAgICAgICAgIHRleHRDb250cm9sLnNldFZhbHVlKGAke2N1cnJlbnRCb2R5fSR7bmV3U2VxdWVuY2V9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZVZhcmlhYmxlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnZhcmlhYmxlcy5yZW1vdmVBdChpbmRleCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnZhcmlhYmxlcy5jb250cm9scy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCd1c2VYbHN4Jyk/LnNldFZhbHVlKGZhbHNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHRleHRDb250cm9sID0gdGhpcy5nZXRDb250cm9sKCd0ZXh0Jyk7XHJcblxyXG4gICAgICAgIGlmICh0ZXh0Q29udHJvbCAmJiB0ZXh0Q29udHJvbC52YWx1ZSkge1xyXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRTZXF1ZW5jZSA9IGluZGV4ICsgMTtcclxuICAgICAgICAgICAgbGV0IGN1cnJlbnRCb2R5ID0gdGV4dENvbnRyb2wudmFsdWU7XHJcblxyXG4gICAgICAgICAgICBjb25zdCByZW1vdmVSZWdleCA9IG5ldyBSZWdFeHAoYFxcXFxzKlxcXFx7XFxcXHske3RhcmdldFNlcXVlbmNlfVxcXFx9XFxcXH1gLCAnZycpO1xyXG4gICAgICAgICAgICBjdXJyZW50Qm9keSA9IGN1cnJlbnRCb2R5LnJlcGxhY2UocmVtb3ZlUmVnZXgsICcnKTtcclxuXHJcbiAgICAgICAgICAgIGN1cnJlbnRCb2R5ID0gY3VycmVudEJvZHkucmVwbGFjZSgvXFx7XFx7KFxcZCspXFx9XFx9L2csIChtYXRjaDogbnVtYmVyLCBudW1TdHI6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbnVtID0gcGFyc2VJbnQobnVtU3RyLCAxMCk7XHJcbiAgICAgICAgICAgICAgICBpZiAobnVtID4gdGFyZ2V0U2VxdWVuY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYHt7JHtudW0gLSAxfX19YDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaDtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0ZXh0Q29udHJvbC5zZXRWYWx1ZShjdXJyZW50Qm9keS50cmltKCkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVWYXJpYWJsZURvd25sb2FkWExTKGlzQ2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHZhcmlhYmxlc0FycmF5ID0gdGhpcy52YXJpYWJsZXM7XHJcbiAgICAgICAgaWYgKGlzQ2hlY2tlZCkge1xyXG4gICAgICAgICAgICB2YXJpYWJsZXNBcnJheS5jb250cm9scy5mb3JFYWNoKChjb250cm9sKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLmdldCgncGFyYW1OYW1lJyk/LmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5nZXQoJ3BhcmFtTmFtZScpPy5zZXRWYWx1ZSgnJyk7XHJcbiAgICAgICAgICAgICAgICBjb250cm9sLmdldCgncGFyYW1OYW1lJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmFyaWFibGVzQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5nZXQoJ3BhcmFtTmFtZScpPy5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5nZXQoJ3BhcmFtTmFtZScpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5mb3JtLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdG9nZ2xlRXhjZWxWYWxpZGF0aW9uKGlzVXBsb2FkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgY3VycmVudFZhbGlkYXRvciA9IGlzVXBsb2FkID8gbnVsbCA6IFZhbGlkYXRvcnMucmVxdWlyZWQ7XHJcblxyXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgICAgICAvLyAyLiBVUERBVEUgVkFMSURBU0kgQ0FST1VTRUwgVkFSSUFCTEVTXHJcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgICAgIGNvbnN0IGNhcm91c2VsQXJyYXkgPSB0aGlzLmZvcm0uZ2V0KCdwYXJhbUNhcm91c2VsJykgYXMgRm9ybUFycmF5O1xyXG4gICAgICAgIGlmIChjYXJvdXNlbEFycmF5KSB7XHJcbiAgICAgICAgICAgIGNhcm91c2VsQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoY2FyZDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBib2R5UGFyYW1zID0gY2FyZC5nZXQoJ2JvZHlQYXJhbXMnKSBhcyBGb3JtQXJyYXk7XHJcbiAgICAgICAgICAgICAgICBib2R5UGFyYW1zPy5jb250cm9scy5mb3JFYWNoKChiQ3RybDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgYkN0cmwuZ2V0KCdwYXJhbU5hbWUnKT8uc2V0VmFsaWRhdG9ycyhjdXJyZW50VmFsaWRhdG9yKTtcclxuICAgICAgICAgICAgICAgICAgICBiQ3RybC5nZXQoJ3BhcmFtTmFtZScpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGJ0blBhcmFtcyA9IGNhcmQuZ2V0KCdidXR0b25QYXJhbXMnKSBhcyBGb3JtQXJyYXk7XHJcbiAgICAgICAgICAgICAgICBidG5QYXJhbXM/LmNvbnRyb2xzLmZvckVhY2goKGJ0bkdyb3VwOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAoYnRuR3JvdXAgYXMgRm9ybUFycmF5KS5jb250cm9scy5mb3JFYWNoKChwQnRuQ3RybDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBCdG5DdHJsLmdldCgncGFyYW1OYW1lJyk/LnNldFZhbGlkYXRvcnMoY3VycmVudFZhbGlkYXRvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBCdG5DdHJsLmdldCgncGFyYW1OYW1lJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgY2Fyb3VzZWxBcnJheS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mb3JtLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnN1YnNjcmliZXJzLmZvckVhY2goKGVhY2gpID0+IGVhY2gudW5zdWJzY3JpYmUoKSk7XHJcbiAgICB9XHJcbn1cclxuIl19
1084
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhbC1pbmZvcm1hdGlvbi13YS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYWRsZmUvY2FtcGFpZ24tbWFuYWdlbWVudC1saWJyYXJ5LyIsInNvdXJjZXMiOlsibGliL2NhbXBhaWduLW1hbmFnZW1lbnQvbW9kdWxlcy9uZXctY2FtcGFpZ24vY29tcG9uZW50cy9nZW5lcmFsLWluZm9ybWF0aW9uLXdhL2dlbmVyYWwtaW5mb3JtYXRpb24td2EuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQ0gsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsTUFBTSxFQUNOLE1BQU0sRUFDTixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUVILFNBQVMsRUFFVCxXQUFXLEVBQ1gsU0FBUyxFQUNULFVBQVUsR0FDYixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFM0MsT0FBTyxFQUNILDBDQUEwQyxFQUMxQyxvQkFBb0IsRUFDcEIsb0JBQW9CLEdBQ3ZCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFJaEUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2xELE9BQU8sRUFBRSxVQUFVLElBQUksZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQWV4RTtJQStDSSx1Q0FDWSxNQUFjLEVBQ2QsYUFBNEIsRUFDNUIsaUJBQTJDLEVBQzNDLE1BQXFCLEVBQ3JCLFVBQXNCO1FBSnRCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQTBCO1FBQzNDLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQS9DM0Isb0JBQWUsR0FBVSxFQUFFLENBQUM7UUFDNUIsb0JBQWUsR0FBVSxFQUFFLENBQUM7UUFFNUIsa0JBQWEsR0FBeUIsRUFBRSxDQUFDO1FBQ3pDLDRCQUF1QixHQUFZLElBQUksQ0FBQztRQUN4QywyQkFBc0IsR0FBWSxLQUFLLENBQUM7UUFDeEMsbUJBQWMsR0FBc0IsRUFBRSxDQUFDO1FBQ3ZDLDZCQUF3QixHQUFZLElBQUksQ0FBQztRQUN6Qyw0QkFBdUIsR0FBWSxLQUFLLENBQUM7UUFDekMsd0JBQW1CLEdBQVksS0FBSyxDQUFDO1FBQ3JDLG9CQUFlLEdBQVksS0FBSyxDQUFDO1FBRWpDLG9CQUFlLEdBQVcsU0FBUyxDQUFDO1FBR25DLHdCQUFtQixHQUFXLENBQUMsQ0FBQztRQUNoQyx5QkFBb0IsR0FBVyxDQUFDLENBQUM7UUFDakMsZ0JBQVcsR0FBbUIsRUFBRSxDQUFDO1FBR2xDLGNBQVMsR0FBRztZQUNmLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFO1lBQ3JDLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7U0FDbEQsQ0FBQztRQWlCSyxtQkFBYyxHQUFZLEtBQUssQ0FBQztRQVNuQyxJQUFJLENBQUMsNEJBQTRCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQUMzRCxDQUFDO0lBdEJELHNCQUFJLHdEQUFhO2FBQWpCLFVBQWtCLE1BQWU7WUFEakMsaUJBU0M7WUFQRyxJQUFJLENBQUMsSUFBSSxDQUFDLDRCQUE0QixFQUFFO2dCQUNwQyxPQUFPO2FBQ1Y7WUFFRCxVQUFVLENBQUM7Z0JBQ1AsS0FBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxLQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDOzs7T0FBQTtJQWdCRCxnREFBUSxHQUFSO1FBQUEsaUJBaUNDOztRQWhDRyxJQUFJLENBQUMsZUFBZSxHQUFHLG9CQUFvQixDQUFDO1FBQzVDLElBQUksQ0FBQyxlQUFlLEdBQUcsb0JBQW9CLENBQUM7UUFDNUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxrQkFBa0IsR0FBRywwQ0FBMEMsQ0FBQztRQUNyRSxJQUFJLENBQUMsSUFBSSxHQUFHO1lBQ1IsSUFBSSxFQUFFLEVBQUU7WUFDUixRQUFRLEVBQUUsSUFBSTtZQUNkLFNBQVMsRUFBRSxJQUFJO1lBQ2YsV0FBVyxFQUFFLElBQUk7WUFDakIsaUJBQWlCLEVBQUUsSUFBSTtTQUMxQixDQUFDO1FBRUYsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyx1QkFBdUIsQ0FDeEIsbUJBQUEsSUFBSSxDQUFDLGtCQUFrQiwwQ0FBRSxrQkFBa0IsMENBQUUsSUFBSSwwQ0FBRSxNQUFNLE1BQUssSUFBSTtZQUM5RCxDQUFDLHlCQUFDLElBQUksQ0FBQyxrQkFBa0IsMENBQUUsa0JBQWtCLDBDQUFFLElBQUksMENBQUUsSUFBSSwwQ0FBRSxJQUFJLENBQy9ELENBQUMsQ0FBQyxFQUFFLENBQ1gsQ0FBQztRQUVGLHFDQUFxQztRQUNyQyxJQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFbkQsSUFBSSxrQkFBa0IsRUFBRTtZQUNwQixJQUFNLFFBQVEsR0FBRyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFVBQUMsS0FBSztnQkFDN0QsS0FBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDbkM7SUFDTCxDQUFDO0lBRUQsc0JBQUksNkRBQWtCO2FBQXRCO1lBQ0ksSUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzVELE9BQU8sWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDeEQsQ0FBQzs7O09BQUE7SUFFTyxnREFBUSxHQUFoQjtRQUFBLGlCQXlDQzs7UUF4Q0csSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQztZQUN0QixPQUFPLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDbkQsS0FBSyxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQztZQUM1QixJQUFJLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQzNCLElBQUksRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDM0IsUUFBUSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQztZQUMvQixTQUFTLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQ2hDLFFBQVEsRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDL0IsSUFBSSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQztZQUMzQixRQUFRLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQy9CLFNBQVMsRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDaEMsUUFBUSxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQztZQUMvQixXQUFXLEVBQUUsSUFBSSxTQUFTLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDbkQsU0FBUyxFQUFFLElBQUksU0FBUyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ2pELFdBQVcsRUFBRSxJQUFJLFNBQVMsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNuRCxRQUFRLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQzdCLFFBQVEsRUFBRSxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUM7WUFDaEMsTUFBTSxFQUFFLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUMzQixRQUFRLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQy9CLE9BQU8sRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDOUIsU0FBUyxFQUFFLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQztZQUNoQyxJQUFJLEVBQUUsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDO1lBQzNCLHFCQUFxQixFQUFFLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQztZQUM3QyxVQUFVLEVBQUUsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQ2xDLEdBQUcsRUFBRSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDMUIscUJBQXFCLEVBQUUsSUFBSSxXQUFXLENBQUMsS0FBSyxDQUFDO1lBQzdDLFNBQVMsRUFBRSxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDNUIsT0FBTyxFQUFFLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQztZQUMvQixZQUFZLEVBQUUsSUFBSSxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQy9CLGFBQWEsRUFBRSxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUM7U0FDbkMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDO1lBQzdCLFVBQVUsQ0FBQztnQkFDUCxLQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0RCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBQSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsMENBQUUsWUFBWSxDQUFDLFNBQVMsQ0FBQyxVQUFDLEdBQUc7WUFDbEQsS0FBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLENBQUMsRUFBRTtJQUNQLENBQUM7SUFFTyxtREFBVyxHQUFuQjtRQUNJLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3RCLE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVPLGdEQUFRLEdBQWhCO1FBQUEsaUJBaURDOztRQWhERyxJQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7UUFDNUMsSUFBTSxVQUFVLGVBQUcsV0FBVywwQ0FBRSxrQkFBa0IsMENBQUUsSUFBSSxDQUFDO1FBQ3pELElBQ0ksQ0FBQyxXQUFXO1lBQ1osTUFBTSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUN4QyxPQUFBLFVBQVUsMENBQUUsTUFBTSxNQUFLLElBQUksRUFDN0I7WUFDRSxPQUFPO1NBQ1Y7UUFDRCxNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLDBDQUFFLFFBQVEsT0FBQyxVQUFVLDBDQUFFLE9BQU8sRUFBRTtRQUMxRCxNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLDBDQUFFLFFBQVEsT0FBQyxVQUFVLDBDQUFFLEtBQUssRUFBRTtRQUN0RCxNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLDBDQUFFLFFBQVEsT0FBQyxVQUFVLDBDQUFFLElBQUksRUFBRTtRQUNwRCxNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLDBDQUFFLFFBQVEsT0FBQyxVQUFVLDBDQUFFLElBQUksRUFBRTtRQUNwRCxNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLDBDQUFFLFFBQVEsT0FBQyxVQUFVLDBDQUFFLFNBQVMsRUFBRTtRQUM5RCxNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLDBDQUFFLFFBQVEsYUFDakMsVUFBVSwwQ0FBRSxRQUFRLDZDQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLDBDQUFFLEtBQUssSUFDN0Q7UUFDRixNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLDBDQUFFLFFBQVEsT0FBQyxVQUFVLDBDQUFFLFFBQVEsRUFBRTtRQUM1RCxNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLDBDQUFFLFFBQVEsT0FBQyxVQUFVLDBDQUFFLFFBQVEsRUFBRTtRQUM1RCxNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLDBDQUFFLFFBQVEsT0FBQyxVQUFVLDBDQUFFLE1BQU0sRUFBRTtRQUN4RCxNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLDBDQUFFLFFBQVEsT0FBQyxVQUFVLDBDQUFFLFFBQVEsRUFBRTtRQUM1RCxNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsdUJBQXVCLENBQUMsMENBQUUsUUFBUSxDQUM5QyxPQUFBLFVBQVUsMENBQUUscUJBQXFCLE1BQUssU0FBUztZQUMzQyxDQUFDLENBQUMsVUFBVSxDQUFDLHFCQUFxQjtZQUNsQyxDQUFDLENBQUMsQ0FBQyxjQUFDLFVBQVUsMENBQUUsUUFBUSwwQ0FBRSxJQUFJLENBQUEsRUFDcEM7UUFDRixNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLDBDQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQUMsVUFBVSwwQ0FBRSxVQUFVLENBQUEsRUFBRTtRQUNsRSxNQUFBLElBQUksQ0FBQyxVQUFVLENBQUMsdUJBQXVCLENBQUMsMENBQUUsUUFBUSxPQUFDLFVBQVUsMENB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QUMsVUFBVSxDQUFDLFVBQVUsQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFDckMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFDdEMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFDckMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFDakMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFDckMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFDdEMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFDckMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFDckMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFDcEMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFDdEMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFDakMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFDckMsTUFBQSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQywwQ0FBRSxLQUFLLEdBQUc7UUFFdEMsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQXFCLENBQUM7UUFDdkUsSUFBSSxXQUFXLEVBQUU7WUFDYixXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDcEIsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ3ZCO1FBRUQsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVB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R3pDO1FBREMsS0FBSyxFQUFFO3NFQVNQO0lBRXVCO1FBQXZCLFNBQVMsQ0FBQyxXQUFXLENBQUM7dUVBQTJCO0lBM0N6Qyw2QkFBNkI7UUFMekMsU0FBUyxDQUFDO1lBQ1AsUUFBUSxFQUFFLDRCQUE0QjtZQUN0QyxnbWxEQUFzRDs7U0FFekQsQ0FBQztPQUNXLDZCQUE2QixDQTBwQ3pDO0lBQUQsb0NBQUM7Q0FBQSxBQTFwQ0QsSUEwcENDO1NBMXBDWSw2QkFBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXBzQVBJTG9hZGVyIH0gZnJvbSAnQGFnbS9jb3JlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCxcclxuICAgIEVsZW1lbnRSZWYsXHJcbiAgICBFdmVudEVtaXR0ZXIsXHJcbiAgICBJbnB1dCxcclxuICAgIE5nWm9uZSxcclxuICAgIE9uRGVzdHJveSxcclxuICAgIE9uSW5pdCxcclxuICAgIE91dHB1dCxcclxuICAgIFZpZXdDaGlsZCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICAgIEFic3RyYWN0Q29udHJvbCxcclxuICAgIEZvcm1BcnJheSxcclxuICAgIEZvcm1CdWlsZGVyLFxyXG4gICAgRm9ybUNvbnRyb2wsXHJcbiAgICBGb3JtR3JvdXAsXHJcbiAgICBWYWxpZGF0b3JzLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtcclxuICAgIEdlbmVyYWxJbmZvcm1hdGlvbldBTWVzc2FnZVZhbGlkYXRpb25Db25zdCxcclxuICAgIE1lZGlhVHlwZU9wdGlvbkNvbnN0LFxyXG4gICAgTXNnVHlwZVdBT3B0aW9uQ29uc3QsXHJcbn0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29yZS9jb25zdCc7XHJcbmltcG9ydCB7IFByb2R1Y3RDYXRlZ29yeUVudW0gfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9jb3JlL2VudW1zJztcclxuaW1wb3J0IHsgQmFzZU9wdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29yZS9tb2RlbHMnO1xyXG5pbXBvcnQgeyBQYXJhbWV0ZXIgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9jb3JlL21vZGVscy91dGlsL2FwaS1hZGFwdGVyLXNlcnZpY2UtbW9kZWxzJztcclxuaW1wb3J0IHsgQXBwUmVzcG9uc2UgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9jb3JlL21vZGVscy91dGlsL2FwaS1kdG8vcmVzcG9uc2UtbW9kZWxzJztcclxuaW1wb3J0IHsgQXBpQWRhcHRlclNlcnZpY2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vY29yZS9zZXJ2aWNlcyc7XHJcbmltcG9ydCB7IGdlbmVyYXRlRW51bU9wdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2NvcmUvdXRpbCc7XHJcbmltcG9ydCB7IFRlbXBsYXRlV0FNb2RlbCwgV2hhdHNBcHBBY2NvdW50RHRvIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzJztcclxuaW1wb3J0IHsgRW51bURhdGEgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlsL2VudW1zJztcclxuaW1wb3J0IHsgVmFsaWRhdG9ycyBhcyBDdXN0b21WYWxpZGF0b3JzIH0gZnJvbSAnLi4vLi4vLi4vLi4vdmFsaWRhdG9ycyc7XHJcblxyXG5pbnRlcmZhY2UgSU1hcHMge1xyXG4gICAgem9vbTogbnVtYmVyO1xyXG4gICAgbGF0aXR1ZGU6IG51bWJlciB8IG51bGw7XHJcbiAgICBsb25naXR1ZGU6IG51bWJlciB8IG51bGw7XHJcbiAgICBpc0RyYWdnYWJsZTogYm9vbGVhbjtcclxuICAgIGlzRG91YmxlQ2xpY2tab29tOiBib29sZWFuO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbGliLWdlbmVyYWwtaW5mb3JtYXRpb24td2EnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2dlbmVyYWwtaW5mb3JtYXRpb24td2EuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vZ2VuZXJhbC1pbmZvcm1hdGlvbi13YS5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgR2VuZXJhbEluZm9ybWF0aW9uV0FDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgICBAT3V0cHV0KClcclxuICAgIHB1YmxpYyB1cGRhdGVHZW5lcmFsSW5mb3JtYXRpb25Gb3JtOiBFdmVudEVtaXR0ZXI8Rm9ybUdyb3VwPjtcclxuXHJcbiAgICBwdWJsaWMgZm9ybSE6IEZvcm1Hcm91cDtcclxuICAgIHB1YmxpYyBtc2dUeXBlV0FPcHRpb246IGFueVtdID0gW107XHJcbiAgICBwdWJsaWMgbWVkaWFUeXBlT3B0aW9uOiBhbnlbXSA9IFtdO1xyXG4gICAgcHVibGljIGNhdGVnb3J5T3B0aW9uITogQmFzZU9wdGlvbk1vZGVsW107XHJcbiAgICBwdWJsaWMgYWNjb3VudE9wdGlvbjogV2hhdHNBcHBBY2NvdW50RHRvW10gPSBbXTtcclxuICAgIHB1YmxpYyBpc0hhdmVOZXh0QWNjb3VudE9wdGlvbjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwdWJsaWMgaXNMb2FkaW5nQWNjb3VudE9wdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIHRlbXBsYXRlT3B0aW9uOiBUZW1wbGF0ZVdBTW9kZWxbXSA9IFtdO1xyXG4gICAgcHVibGljIGlzSGF2ZU5leHRUZW1wbGF0ZU9wdGlvbjogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBwdWJsaWMgaXNMb2FkaW5nVGVtcGxhdGVPcHRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIHB1YmxpYyBpc0hhdmVUZW1wbGF0ZVBhcmFtOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgaXNTaG93UGFyYW1ldGVyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgdmFsaWRhdGlvbk1lc3NhZ2VzOiBhbnk7XHJcbiAgICBwdWJsaWMgZXh0RmlsZUFjY2VwdGVkOiBzdHJpbmcgPSAnaW1hZ2UvKic7XHJcbiAgICBwdWJsaWMgbWFwcyE6IElNYXBzO1xyXG5cclxuICAgIHByaXZhdGUgcGFnZU5vQWNjb3VudE9wdGlvbjogbnVtYmVyID0gMTtcclxuICAgIHByaXZhdGUgcGFnZU5vVGVtcGxhdGVPcHRpb246IG51bWJlciA9IDE7XHJcbiAgICBwcml2YXRlIHN1YnNjcmliZXJzOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG4gICAgcHJpdmF0ZSBnZW9Db2RlcjogYW55O1xyXG5cclxuICAgIHB1YmxpYyB0ZW1wbGF0ZXMgPSBbXHJcbiAgICAgICAgeyBsYWJlbDogJ0NyZWF0ZSBOZXcnLCB2YWx1ZTogZmFsc2UgfSxcclxuICAgICAgICB7IGxhYmVsOiAnVXNlIGV4aXN0aW5nIHRlbXBsYXRlJywgdmFsdWU6IHRydWUgfSxcclxuICAgIF07XHJcblxyXG4gICAgQElucHV0KCkgcHVibGljIGlzUmVhZE9ubHlNb2RlITogYm9vbGVhbjtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IGlzVG91Y2hlZEZvcm0oc3RhdHVzOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVwZGF0ZUdlbmVyYWxJbmZvcm1hdGlvbkZvcm0pIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlR2VuZXJhbEluZm9ybWF0aW9uRm9ybS5lbWl0KHRoaXMuZm9ybSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnbWFwU2VhcmNoJykgbWFwU2VhcmNoUmVmITogRWxlbWVudFJlZjtcclxuXHJcbiAgICBwdWJsaWMgaXNDaGVja1V0aWxpdHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxyXG4gICAgICAgIHByaXZhdGUgbWFwc0FQSUxvYWRlcjogTWFwc0FQSUxvYWRlcixcclxuICAgICAgICBwcml2YXRlIGFwaUFkYXB0ZXJTZXJ2aWNlOiBBcGlBZGFwdGVyU2VydmljZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB0b2FzdHI6IFRvYXN0clNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBodHRwQ2xpZW50OiBIdHRwQ2xpZW50XHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZUdlbmVyYWxJbmZvcm1hdGlvbkZvcm0gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5tc2dUeXBlV0FPcHRpb24gPSBNc2dUeXBlV0FPcHRpb25Db25zdDtcclxuICAgICAgICB0aGlzLm1lZGlhVHlwZU9wdGlvbiA9IE1lZGlhVHlwZU9wdGlvbkNvbnN0O1xyXG4gICAgICAgIHRoaXMuY2F0ZWdvcnlPcHRpb24gPSBnZW5lcmF0ZUVudW1PcHRpb24oUHJvZHVjdENhdGVnb3J5RW51bSk7XHJcbiAgICAgICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMgPSBHZW5lcmFsSW5mb3JtYXRpb25XQU1lc3NhZ2VWYWxpZGF0aW9uQ29uc3Q7XHJcbiAgICAgICAgdGhpcy5tYXBzID0ge1xyXG4gICAgICAgICAgICB6b29tOiAxNSxcclxuICAgICAgICAgICAgbGF0aXR1ZGU6IG51bGwsXHJcbiAgICAgICAgICAgIGxvbmdpdHVkZTogbnVsbCxcclxuICAgICAgICAgICAgaXNEcmFnZ2FibGU6IHRydWUsXHJcbiAgICAgICAgICAgIGlzRG91YmxlQ2xpY2tab29tOiB0cnVlLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdEZvcm0oKTtcclxuICAgICAgICB0aGlzLmluaXREaXNhYmxlKCk7XHJcbiAgICAgICAgdGhpcy5pbml0RWRpdCgpO1xyXG4gICAgICAgIHRoaXMuaW5pdFZhbGlkYXRpb24oKTtcclxuICAgICAgICB0aGlzLmdldEFjY291bnRPcHRpb25TZXJ2aWNlKFxyXG4gICAgICAgICAgICB0aGlzLmdldENhbXBhaWduU3RvcmFnZT8uZ2VuZXJhbEluZm9ybWF0aW9uPy5mb3JtPy5tZWRpdW0gPT09ICdXQSdcclxuICAgICAgICAgICAgICAgID8gdGhpcy5nZXRDYW1wYWlnblN0b3JhZ2U/LmdlbmVyYWxJbmZvcm1hdGlvbj8uZm9ybT8uZnJvbT8ubmFtZVxyXG4gICAgICAgICAgICAgICAgOiAnJ1xyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIExpc3RlbiB0ZXh0IHRvIGNoYW5nZXMgaW4gdGhlIGZvcm1cclxuICAgICAgICBjb25zdCB0ZXh0Q29udHJvbEZvclN5bmMgPSB0aGlzLmdldENvbnRyb2woJ3RleHQnKTtcclxuXHJcbiAgICAgICAgaWYgKHRleHRDb250cm9sRm9yU3luYykge1xyXG4gICAgICAgICAgICBjb25zdCB0ZXh0U3VicyA9IHRleHRDb250cm9sRm9yU3luYy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zeW5jVmFyaWFibGVzRnJvbVRleHQodmFsdWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlcnMucHVzaCh0ZXh0U3Vicyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBnZXRDYW1wYWlnblN0b3JhZ2UoKTogYW55IHtcclxuICAgICAgICBjb25zdCBjYW1wYWlnbkRhdGEgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndGVsaW4uY2FtcGFpZ24nKTtcclxuICAgICAgICByZXR1cm4gY2FtcGFpZ25EYXRhID8gSlNPTi5wYXJzZShjYW1wYWlnbkRhdGEpIDoge307XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0Rm9ybSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcclxuICAgICAgICAgICAgY2hhbm5lbDogbmV3IEZvcm1Db250cm9sKG51bGwsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxyXG4gICAgICAgICAgICBtZWRpYTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgICAgICAgICBmcm9tOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgICAgICAgIHRleHQ6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcclxuICAgICAgICAgICAgZmlsZU5hbWU6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcclxuICAgICAgICAgICAgdGFyZ2V0VVJMOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgICAgICAgIGZpbGVUeXBlOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgICAgICAgIGZpbGU6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcclxuICAgICAgICAgICAgbGF0aXR1ZGU6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcclxuICAgICAgICAgICAgbG9uZ2l0dWRlOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiBuZXcgRm9ybUNvbnRyb2wobnVsbCksXHJcbiAgICAgICAgICAgIHBhcmFtSGVhZGVyOiBuZXcgRm9ybUFycmF5KFtdLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcclxuICAgICAgICAgICAgcGFyYW1Cb2R5OiBuZXcgRm9ybUFycmF5KFtdLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcclxuICAgICAgICAgICAgcGFyYW1CdXR0b246IG5ldyBGb3JtQXJyYXkoW10sIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxyXG4gICAgICAgICAgICBvdHBWYWx1ZTogbmV3IEZvcm1Db250cm9sKCcnKSxcclxuICAgICAgICAgICAgaXNVcGxvYWQ6IG5ldyBGb3JtQ29udHJvbChmYWxzZSksXHJcbiAgICAgICAgICAgIGZpbGVJZDogbmV3IEZvcm1Db250cm9sKCcnKSxcclxuICAgICAgICAgICAgY2F0ZWdvcnk6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcclxuICAgICAgICAgICAgcHJvZHVjdDogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgICAgICAgICBjYXRhbG9ndWU6IG5ldyBGb3JtQ29udHJvbChudWxsKSxcclxuICAgICAgICAgICAgYm9keTogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgICAgICAgICBpc1VzZUV4aXN0aW5nVGVtcGxhdGU6IG5ldyBGb3JtQ29udHJvbChmYWxzZSksXHJcbiAgICAgICAgICAgIGlzTmVlZFNhdmU6IG5ldyBGb3JtQ29udHJvbChmYWxzZSksXHJcbiAgICAgICAgICAgIHR0bDogbmV3IEZvcm1Db250cm9sKG51bGwpLFxyXG4gICAgICAgICAgICBpc0Rvd25sb2FkVmFyaWFibGVYTFM6IG5ldyBGb3JtQ29udHJvbChmYWxzZSksXHJcbiAgICAgICAgICAgIHZhcmlhYmxlczogbmV3IEZvcm1BcnJheShbXSksXHJcbiAgICAgICAgICAgIHVzZVhsc3g6IG5ldyBGb3JtQ29udHJvbChmYWxzZSksXHJcbiAgICAgICAgICAgIGJ1dHRvblBhcmFtczogbmV3IEZvcm1BcnJheShbXSksXHJcbiAgICAgICAgICAgIHBhcmFtQ2Fyb3VzZWw6IG5ldyBGb3JtQXJyYXkoW10pLFxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVHZW5lcmFsSW5mb3JtYXRpb25Gb3JtLmVtaXQodGhpcy5mb3JtKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5mb3JtLmdldCgnaXNVcGxvYWQnKT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlRXhjZWxWYWxpZGF0aW9uKHZhbCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0RGlzYWJsZSgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNSZWFkT25seU1vZGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5mb3JtLmRpc2FibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRFZGl0KCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHN0b3JhZ2VEYXRhID0gdGhpcy5nZXRDYW1wYWlnblN0b3JhZ2U7XHJcbiAgICAgICAgY29uc3QgZm9ybVZhbHVlcyA9IHN0b3JhZ2VEYXRhPy5nZW5lcmFsSW5mb3JtYXRpb24/LmZvcm07XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAhc3RvcmFnZURhdGEgfHxcclxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoc3RvcmFnZURhdGEpLmxlbmd0aCA9PT0gMCB8fFxyXG4gICAgICAgICAgICBmb3JtVmFsdWVzPy5tZWRpdW0gIT09ICdXQSdcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ2NoYW5uZWwnKT8uc2V0VmFsdWUoZm9ybVZhbHVlcz8uY2hhbm5lbCk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCdtZWRpYScpPy5zZXRWYWx1ZShmb3JtVmFsdWVzPy5tZWRpYSk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCdmcm9tJyk/LnNldFZhbHVlKGZvcm1WYWx1ZXM/LmZyb20pO1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgndGV4dCcpPy5zZXRWYWx1ZShmb3JtVmFsdWVzPy50ZXh0KTtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ3RhcmdldFVSTCcpPy5zZXRWYWx1ZShmb3JtVmFsdWVzPy50YXJnZXRVUkwpO1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnZmlsZU5hbWUnKT8uc2V0VmFsdWUoXHJcbiAgICAgICAgICAgIGZvcm1WYWx1ZXM/LmZpbGVOYW1lID8/IHRoaXMuZ2V0Q29udHJvbCgndGFyZ2V0VVJMJyk/LnZhbHVlXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ3RlbXBsYXRlJyk/LnNldFZhbHVlKGZvcm1WYWx1ZXM/LnRlbXBsYXRlKTtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ2lzVXBsb2FkJyk/LnNldFZhbHVlKGZvcm1WYWx1ZXM/LmlzVXBsb2FkKTtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ2ZpbGVJZCcpPy5zZXRWYWx1ZShmb3JtVmFsdWVzPy5maWxlSWQpO1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnb3RwVmFsdWUnKT8uc2V0VmFsdWUoZm9ybVZhbHVlcz8ub3RwVmFsdWUpO1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnaXNVc2VFeGlzdGluZ1RlbXBsYXRlJyk/LnNldFZhbHVlKFxyXG4gICAgICAgICAgICBmb3JtVmFsdWVzPy5pc1VzZUV4aXN0aW5nVGVtcGxhdGUgIT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgPyBmb3JtVmFsdWVzLmlzVXNlRXhpc3RpbmdUZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgOiAhIWZvcm1WYWx1ZXM/LnRlbXBsYXRlPy5uYW1lXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ2lzTmVlZFNhdmUnKT8uc2V0VmFsdWUoISFmb3JtVmFsdWVzPy5pc05lZWRTYXZlKTtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ2lzRG93bmxvYWRWYXJpYWJsZVhMUycpPy5zZXRWYWx1ZShmb3JtVmFsdWVzPy5pc0Rvd25sb2FkVmFyaWFibGVYTFMpO1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgndHRsJyk/LnNldFZhbHVlKGZvcm1WYWx1ZXM/LnR0bCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHNhdmVkVmFyaWFibGVzID0gZm9ybVZhbHVlcz8udmFyaWFibGVzO1xyXG4gICAgICAgIGlmIChzYXZlZFZhcmlhYmxlcyAmJiBBcnJheS5pc0FycmF5KHNhdmVkVmFyaWFibGVzKSAmJiBzYXZlZFZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFyaWFibGVzLmNsZWFyKCk7XHJcblxyXG4gICAgICAgICAgICBzYXZlZFZhcmlhYmxlcy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMudmFyaWFibGVzLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgbmV3IEZvcm1Hcm91cCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogbmV3IEZvcm1Db250cm9sKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpdGVtLnBhcmFtTmFtZSB8fCAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiB0aGlzLmlzUmVhZE9ubHlNb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmlzSGF2ZVRlbXBsYXRlUGFyYW0gPSB0aGlzLmdldENvbnRyb2woJ2lzVXBsb2FkJyk/LnZhbHVlO1xyXG4gICAgICAgIHRoaXMuZ2V0VGVtcGxhdGVPcHRpb25TZXJ2aWNlKG51bGwsIHRoaXMuZ2V0Q29udHJvbCgndGVtcGxhdGUnKT8udmFsdWU/Lm5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaW5pdFZhbGlkYXRpb24oKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmZvcm0pIHJldHVybjtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5mb3JtLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmZvcm0uY29udHJvbHNba2V5XSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW2tleV0uY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNba2V5XS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnY2hhbm5lbCcpPy5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5nZXRJc1RleHQpIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdmcm9tJyk/LnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgndGV4dCcpPy5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2Zyb20nKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3RleHQnKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRJc01lZGlhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnbWVkaWEnKT8uc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdmcm9tJyk/LnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnZmlsZU5hbWUnKT8uc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdtZWRpYScpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnZnJvbScpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnZmlsZU5hbWUnKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXRJc1RlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnZnJvbScpPy5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3RlbXBsYXRlJyk/LnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgncGFyYW1IZWFkZXInKT8uc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdwYXJhbUJvZHknKT8uc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdwYXJhbUJ1dHRvbicpPy5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2Zyb20nKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3RlbXBsYXRlJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdwYXJhbUhlYWRlcicpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgncGFyYW1Cb2R5Jyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdwYXJhbUJ1dHRvbicpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmdldElzQ2F0YWxvZ3VlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnZnJvbScpPy5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2NhdGVnb3J5Jyk/LnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnY2F0YWxvZ3VlJyk/LnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgncHJvZHVjdCcpPy5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2JvZHknKT8uc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLm1heExlbmd0aCgxMDApKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdmcm9tJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdjYXRlZ29yeScpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnY2F0YWxvZ3VlJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdwcm9kdWN0Jyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdib2R5Jyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZ2V0SXNVdGlsaXR5KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnZnJvbScpPy5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3RleHQnKT8uc2V0VmFsaWRhdG9ycyhbXHJcbiAgICAgICAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICAgICAgICAgICAgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTAyNCksXHJcbiAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3R0bCcpPy5zZXRWYWxpZGF0b3JzKFtcclxuICAgICAgICAgICAgICAgIEN1c3RvbVZhbGlkYXRvcnMubWluKDMwLCAnTWluaW11bSBUVEwgMzAnKSxcclxuICAgICAgICAgICAgICAgIEN1c3RvbVZhbGlkYXRvcnMubWF4KDQzMjAwLCAnTWF4aW11bSBUVEwgNDMyMDAnKSxcclxuICAgICAgICAgICAgXSk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnZnJvbScpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgndGV4dCcpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgndHRsJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCd2YXJpYWJsZXMnKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnZnJvbScpPy5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3RleHQnKT8uc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdmcm9tJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0ZXh0Jyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGZvcm1SZXNldChfaXNNZWRpYVR5cGU6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICghX2lzTWVkaWFUeXBlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnbWVkaWEnKT8ucmVzZXQoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdmcm9tJyk/LnJlc2V0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ3RleHQnKT8ucmVzZXQoKTtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ2ZpbGVOYW1lJyk/LnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0YXJnZXRVUkwnKT8ucmVzZXQoKTtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ2ZpbGVUeXBlJyk/LnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCdmaWxlJyk/LnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCdsYXRpdHVkZScpPy5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnbG9uZ2l0dWRlJyk/LnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0ZW1wbGF0ZScpPy5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnY2F0ZWdvcnknKT8ucmVzZXQoKTtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ3Byb2R1Y3QnKT8ucmVzZXQoKTtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ2NhdGFsb2d1ZScpPy5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnYm9keScpPy5yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnb3RwVmFsdWUnKT8ucmVzZXQoKTtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ3ZhcmlhYmxlcycpPy5yZXNldCgpO1xyXG5cclxuICAgICAgICBjb25zdCBwYXJhbUhlYWRlciA9IHRoaXMuZ2V0Q29udHJvbCgncGFyYW1IZWFkZXInKSBhcyBGb3JtQXJyYXkgfCBudWxsO1xyXG4gICAgICAgIGlmIChwYXJhbUhlYWRlcikge1xyXG4gICAgICAgICAgICBwYXJhbUhlYWRlci5jbGVhcigpO1xyXG4gICAgICAgICAgICBwYXJhbUhlYWRlci5yZXNldCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcGFyYW1Cb2R5ID0gdGhpcy5nZXRDb250cm9sKCdwYXJhbUJvZHknKSBhcyBGb3JtQXJyYXkgfCBudWxsO1xyXG4gICAgICAgIGlmIChwYXJhbUJvZHkpIHtcclxuICAgICAgICAgICAgcGFyYW1Cb2R5LmNsZWFyKCk7XHJcbiAgICAgICAgICAgIHBhcmFtQm9keS5yZXNldCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcGFyYW1CdXR0b24gPSB0aGlzLmdldENvbnRyb2woJ3BhcmFtQnV0dG9uJykgYXMgRm9ybUFycmF5IHwgbnVsbDtcclxuICAgICAgICBpZiAocGFyYW1CdXR0b24pIHtcclxuICAgICAgICAgICAgcGFyYW1CdXR0b24uY2xlYXIoKTtcclxuICAgICAgICAgICAgcGFyYW1CdXR0b24ucmVzZXQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdFZhbGlkYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldENvbnRyb2woY29udHJvbE5hbWU6IHN0cmluZyk6IEFic3RyYWN0Q29udHJvbCB8IG51bGwge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0gPyB0aGlzLmZvcm0uZ2V0KGNvbnRyb2xOYW1lKSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0UGFyYW0oX25hbWU6IHN0cmluZywgX3ZhbHVlOiBhbnksIF90eXBlOiBzdHJpbmcpOiBQYXJhbWV0ZXIge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIG5hbWU6IF9uYW1lLFxyXG4gICAgICAgICAgICB2YWx1ZTogX3ZhbHVlLFxyXG4gICAgICAgICAgICBpbjogJ3F1ZXJ5JyxcclxuICAgICAgICAgICAgdHlwZTogX3R5cGUsXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEFjY291bnRPcHRpb25TZXJ2aWNlKGZpbHRlcjogc3RyaW5nID0gJycsIGlzSW5maW5pdGU6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nQWNjb3VudE9wdGlvbiA9IHRydWU7XHJcblxyXG4gICAgICAgIGNvbnN0IHBhcmFtZXRlckxpc3Q6IEFycmF5PFBhcmFtZXRlcj4gPSBbXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFBhcmFtKCdwYWdlTm8nLCB0aGlzLnBhZ2VOb0FjY291bnRPcHRpb24sICdudW1iZXInKSxcclxuICAgICAgICAgICAgdGhpcy5pbml0UGFyYW0oJ3Jvd1BlclBhZ2UnLCAyMCwgJ251bWJlcicpLFxyXG4gICAgICAgICAgICB0aGlzLmluaXRQYXJhbSgncGxhdGZvcm0nLCAnV0EnLCAnc3RyaW5nJyksXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFBhcmFtKCdzdGF0dXMnLCAnQVBQUk9WRUQnLCAnc3RyaW5nJyksXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFBhcmFtKCdmaWx0ZXInLCBmaWx0ZXIsICdzdHJpbmcnKSxcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICBjb25zdCBzdWJzID0gdGhpcy5hcGlBZGFwdGVyU2VydmljZVxyXG4gICAgICAgICAgICAuZXhlY3V0ZUFwaVJlcXVlc3QocGFyYW1ldGVyTGlzdCwgJy9hZG1pbi9hY2NvdW50JywgJ0dFVCcpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3A6IEFwcFJlc3BvbnNlPFdoYXRzQXBwQWNjb3VudER0b1tdPikgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFyZXNwLmRhdGEpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmFjY291bnRPcHRpb24gPSBpc0luZmluaXRlID8gWy4uLnRoaXMuYWNjb3VudE9wdGlvbiwgLi4ucmVzcC5kYXRhXSA6IHJlc3AuZGF0YTtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNIYXZlTmV4dEFjY291bnRPcHRpb24gPSByZXNwLmhhdmVOZXh0ID8/IHRydWU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZ0FjY291bnRPcHRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlcnMucHVzaChzdWJzKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0VGVtcGxhdGVPcHRpb25TZXJ2aWNlKFxyXG4gICAgICAgIGV2ZW50OiBzdHJpbmcgPSBudWxsLFxyXG4gICAgICAgIGZpbHRlcjogc3RyaW5nID0gJycsXHJcbiAgICAgICAgaXNJbmZpbml0ZTogYm9vbGVhbiA9IGZhbHNlXHJcbiAgICApOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZ1RlbXBsYXRlT3B0aW9uID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgY29uc3QgcGFyYW1ldGVyTGlzdDogQXJyYXk8UGFyYW1ldGVyPiA9IFtcclxuICAgICAgICAgICAgdGhpcy5pbml0UGFyYW0oJ3BhZ2VObycsIHRoaXMucGFnZU5vVGVtcGxhdGVPcHRpb24sICdudW1iZXInKSxcclxuICAgICAgICAgICAgdGhpcy5pbml0UGFyYW0oJ3Jvd1BlclBhZ2UnLCAyMCwgJ251bWJlcicpLFxyXG4gICAgICAgICAgICB0aGlzLmluaXRQYXJhbSgncGxhdGZvcm0nLCAnV0EnLCAnc3RyaW5nJyksXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFBhcmFtKCd0ZW1wbGF0ZVR5cGUnLCAnYWxsJywgJ3N0cmluZycpLFxyXG4gICAgICAgICAgICB0aGlzLmluaXRQYXJhbSgnZmlsdGVyJywgZmlsdGVyLCAnc3RyaW5nJyksXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFBhcmFtKCdzdGF0dXMnLCAnQVBQUk9WRUQnLCAnc3RyaW5nJyksXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdFBhcmFtKCdjbGllbnRJZCcsIHRoaXMuZ2V0Q29udHJvbCgnZnJvbScpPy52YWx1ZT8uY2xpZW50SWQgPz8gJycsICdzdHJpbmcnKSxcclxuICAgICAgICAgICAgdGhpcy5pbml0UGFyYW0oJ3dhYmFJZCcsIHRoaXMuZ2V0Q29udHJvbCgnZnJvbScpPy52YWx1ZT8ud2FiYUlkID8/ICcnLCAnc3RyaW5nJyksXHJcbiAgICAgICAgXTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNSZWFkT25seU1vZGUpIHBhcmFtZXRlckxpc3QucHVzaCh0aGlzLmluaXRQYXJhbSgnc3VtbWFyeScsIHRydWUsICdzdHJpbmcnKSk7XHJcblxyXG4gICAgICAgIGNvbnN0IG1lc3NhZ2VUeXBlID0gdGhpcy5mb3JtLnZhbHVlPy5jaGFubmVsO1xyXG4gICAgICAgIGlmIChtZXNzYWdlVHlwZSA9PT0gJ3V0aWxpdHknKSB7XHJcbiAgICAgICAgICAgIHBhcmFtZXRlckxpc3QucHVzaCh0aGlzLmluaXRQYXJhbSgnaXNEaXJlY3RTZW5kJywgdHJ1ZSwgJ3N0cmluZycpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwYXJhbWV0ZXJMaXN0LnB1c2godGhpcy5pbml0UGFyYW0oJ2lzRGlyZWN0U2VuZCcsIGZhbHNlLCAnc3RyaW5nJykpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3Qgc3VicyA9IHRoaXMuYXBpQWRhcHRlclNlcnZpY2VcclxuICAgICAgICAgICAgLmV4ZWN1dGVBcGlSZXF1ZXN0KHBhcmFtZXRlckxpc3QsICcvbWVzc2FnZS90ZW1wbGF0ZScsICdHRVQnKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyZXNwOiBBcHBSZXNwb25zZTxUZW1wbGF0ZVdBTW9kZWxbXT4pID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRPcHRpb25zID0gdGhpcy50ZW1wbGF0ZU9wdGlvbiB8fCBbXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0RhdGEgPSByZXNwLmRhdGEgfHwgW107XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlT3B0aW9uID0gaXNJbmZpbml0ZSA/IFsuLi5jdXJyZW50T3B0aW9ucywgLi4ubmV3RGF0YV0gOiBuZXdEYXRhO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuaXNIYXZlTmV4dFRlbXBsYXRlT3B0aW9uID0gcmVzcC5oYXZlTmV4dCA/PyB0cnVlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmdUZW1wbGF0ZU9wdGlvbiA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZU9wdGlvbj8uZmluZChcclxuICAgICAgICAgICAgICAgICAgICAodCkgPT4gdC5JRCA9PT0gdGhpcy5nZXRDb250cm9sKCd0ZW1wbGF0ZScpPy52YWx1ZT8uSURcclxuICAgICAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0ZW1wbGF0ZScpPy5wYXRjaFZhbHVlKHRlbXBsYXRlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0Q29udHJvbCgnaXNVcGxvYWQnKT8udmFsdWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZURvd25sb2FkQ1NWKHRoaXMuZ2V0Q29udHJvbCgnaXNVcGxvYWQnKT8udmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVUZW1wbGF0ZSh0aGlzLmdldENvbnRyb2woJ3RlbXBsYXRlJyk/LnZhbHVlKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlcnMucHVzaChzdWJzKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRQYXJhbWV0ZXIoaXNCdXR0b246IGJvb2xlYW4gPSBmYWxzZSwgdmFsdWU6IHN0cmluZyA9ICcnKTogRm9ybUdyb3VwIHtcclxuICAgICAgICBjb25zdCBmb3JtID0gaXNCdXR0b25cclxuICAgICAgICAgICAgPyBuZXcgRm9ybUdyb3VwKHtcclxuICAgICAgICAgICAgICAgICAgbmFtZTogbmV3IEZvcm1BcnJheShbXSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgOiBuZXcgRm9ybUdyb3VwKHtcclxuICAgICAgICAgICAgICAgICAgbmFtZTogbmV3IEZvcm1Db250cm9sKFxyXG4gICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDogdGhpcy5pc1JlYWRPbmx5TW9kZSB8fCBbJyRVbnN1YnNjcmliZUFjY291bnQnXS5pbmNsdWRlcyh2YWx1ZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZFxyXG4gICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gZm9ybTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZ2V0UGFyYW1IZWFkZXIoKTogRm9ybUdyb3VwW10ge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5mb3JtLmdldCgncGFyYW1IZWFkZXInKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzIGFzIEZvcm1Hcm91cFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBhZGRQYXJhbUhlYWRlcih2YWx1ZTogc3RyaW5nID0gJycpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBmb3JtID0gdGhpcy5pbml0UGFyYW1ldGVyKGZhbHNlLCB2YWx1ZSk7XHJcbiAgICAgICAgKHRoaXMuZm9ybS5nZXQoJ3BhcmFtSGVhZGVyJykgYXMgRm9ybUFycmF5KS5wdXNoKGZvcm0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBnZXRQYXJhbUJvZHkoKTogRm9ybUdyb3VwW10ge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5mb3JtLmdldCgncGFyYW1Cb2R5JykgYXMgRm9ybUFycmF5KS5jb250cm9scyBhcyBGb3JtR3JvdXBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkUGFyYW1Cb2R5KHZhbHVlOiBzdHJpbmcgPSAnJyk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGZvcm0gPSB0aGlzLmluaXRQYXJhbWV0ZXIoZmFsc2UsIHZhbHVlKTtcclxuICAgICAgICAodGhpcy5mb3JtLmdldCgncGFyYW1Cb2R5JykgYXMgRm9ybUFycmF5KS5wdXNoKGZvcm0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBnZXRCdXR0b24oKTogRm9ybUdyb3VwW10ge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5mb3JtLmdldCgncGFyYW1CdXR0b24nKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzIGFzIEZvcm1Hcm91cFtdO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXRQYXJhbUJ1dHRvbihpbmRleDogbnVtYmVyKTogRm9ybUdyb3VwW10ge1xyXG4gICAgICAgIGNvbnN0IGZvcm0gPSAodGhpcy5mb3JtLmdldCgncGFyYW1CdXR0b24nKSBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzIGFzIEZvcm1Hcm91cFtdO1xyXG4gICAgICAgIHJldHVybiAoZm9ybVtpbmRleF0uZ2V0KCduYW1lJykgYXMgRm9ybUFycmF5KS5jb250cm9scyBhcyBGb3JtR3JvdXBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWRkUGFyYW1CdXR0b24oKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZm9ybSA9IHRoaXMuaW5pdFBhcmFtZXRlcih0cnVlKTtcclxuICAgICAgICAodGhpcy5mb3JtLmdldCgncGFyYW1CdXR0b24nKSBhcyBGb3JtQXJyYXkpLnB1c2goZm9ybSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGdldElzVGV4dCgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2NoYW5uZWwnKT8udmFsdWUgJiZcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdjaGFubmVsJyk/LnZhbHVlPy50b0xvd2VyQ2FzZSgpID09PSAndGV4dCdcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBnZXRJc01lZGlhKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnY2hhbm5lbCcpPy52YWx1ZSAmJlxyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2NoYW5uZWwnKT8udmFsdWU/LnRvTG93ZXJDYXNlKCkgPT09ICdtZWRpYSdcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBnZXRJc1RlbXBsYXRlKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnY2hhbm5lbCcpPy52YWx1ZSAmJlxyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2NoYW5uZWwnKT8udmFsdWU/LnRvTG93ZXJDYXNlKCkgPT09ICd0ZW1wbGF0ZSdcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBnZXRJc0NhdGFsb2d1ZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2NoYW5uZWwnKT8udmFsdWUgJiZcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdjaGFubmVsJyk/LnZhbHVlPy50b0xvd2VyQ2FzZSgpID09PSAnY2F0YWxvZ3VlJ1xyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGdldElzVXRpbGl0eSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2NoYW5uZWwnKT8udmFsdWUgJiZcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdjaGFubmVsJyk/LnZhbHVlPy50b0xvd2VyQ2FzZSgpID09PSAndXRpbGl0eSdcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBnZXRDYXJvdXNlbENvbnRyb2xzKCkge1xyXG4gICAgICAgIHJldHVybiAodGhpcy5mb3JtLmdldCgncGFyYW1DYXJvdXNlbCcpIGFzIEZvcm1BcnJheSkuY29udHJvbHMgYXMgRm9ybUdyb3VwW107XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGhhc0FueUNhcm91c2VsVmFyaWFibGVzKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IGNhcm91c2VsQXJyYXkgPSB0aGlzLmZvcm0uZ2V0KCdwYXJhbUNhcm91c2VsJykgYXMgRm9ybUFycmF5O1xyXG4gICAgICAgIGlmICghY2Fyb3VzZWxBcnJheSB8fCBjYXJvdXNlbEFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICByZXR1cm4gY2Fyb3VzZWxBcnJheS5jb250cm9scy5zb21lKChfLCBjSW5kZXgpID0+IHRoaXMuY2hlY2tDYXJkSGFzVmFyaWFibGVzKGNJbmRleCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrQ2FyZEhhc1ZhcmlhYmxlcyhjSW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IGJvZHlMZW4gPSB0aGlzLmdldENhcm91c2VsQm9keVBhcmFtcyhjSW5kZXgpPy5jb250cm9scy5sZW5ndGggfHwgMDtcclxuICAgICAgICBjb25zdCBidXR0b25Hcm91cHMgPSAodGhpcy5mb3JtLmdldCgncGFyYW1DYXJvdXNlbCcpIGFzIEZvcm1BcnJheSlcclxuICAgICAgICAgICAgLmF0KGNJbmRleClcclxuICAgICAgICAgICAgLmdldCgnYnV0dG9uUGFyYW1zJykgYXMgRm9ybUFycmF5O1xyXG4gICAgICAgIGxldCBoYXNCdG5JbnB1dCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoYnV0dG9uR3JvdXBzKSB7XHJcbiAgICAgICAgICAgIGhhc0J0bklucHV0ID0gYnV0dG9uR3JvdXBzLmNvbnRyb2xzLnNvbWUoXHJcbiAgICAgICAgICAgICAgICAoYnRuR3JvdXApID0+IChidG5Hcm91cCBhcyBGb3JtQXJyYXkpLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBib2R5TGVuID4gMCB8fCBoYXNCdG5JbnB1dDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDYXJvdXNlbEJ1dHRvbnMoY2FyZEluZGV4OiBudW1iZXIpOiBhbnlbXSB7XHJcbiAgICAgICAgY29uc3QgdGVtcGxhdGVWYWx1ZSA9IHRoaXMuZm9ybS5nZXQoJ3RlbXBsYXRlJyk/LnZhbHVlO1xyXG4gICAgICAgIHJldHVybiB0ZW1wbGF0ZVZhbHVlPy5jYXJvdXNlbD8uW2NhcmRJbmRleF0/LmJ1dHRvbnMgfHwgW107XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q2Fyb3VzZWxCb2R5UGFyYW1zKGNhcmRJbmRleDogbnVtYmVyKTogRm9ybUFycmF5IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRDYXJvdXNlbENvbnRyb2xzW2NhcmRJbmRleF0uZ2V0KCdib2R5UGFyYW1zJykgYXMgRm9ybUFycmF5O1xyXG4gICAgfVxyXG5cclxuICAgIGdldENhcm91c2VsQnRuUGFyYW1zKGNhcmRJbmRleDogbnVtYmVyLCBidG5JbmRleDogbnVtYmVyKTogRm9ybUFycmF5IHtcclxuICAgICAgICBjb25zdCBidG5QYXJhbXNBcnJheSA9IHRoaXMuZ2V0Q2Fyb3VzZWxDb250cm9sc1tjYXJkSW5kZXhdLmdldCgnYnV0dG9uUGFyYW1zJykgYXMgRm9ybUFycmF5O1xyXG4gICAgICAgIHJldHVybiBidG5QYXJhbXNBcnJheS5hdChidG5JbmRleCkgYXMgRm9ybUFycmF5O1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXROZXh0QWNjb3VudEJhdGNoKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0hhdmVOZXh0QWNjb3VudE9wdGlvbikgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLnBhZ2VOb0FjY291bnRPcHRpb24gKz0gMTtcclxuICAgICAgICB0aGlzLmdldEFjY291bnRPcHRpb25TZXJ2aWNlKCcnLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYWNjb3VudFNlbGVjdGVkRGlzcGxheShcclxuICAgICAgICBhdHRyaWJ1dGUxOiBXaGF0c0FwcEFjY291bnREdG8sXHJcbiAgICAgICAgYXR0cmlidXRlMjogV2hhdHNBcHBBY2NvdW50RHRvXHJcbiAgICApOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBhdHRyaWJ1dGUxICYmIGF0dHJpYnV0ZTIgJiYgYXR0cmlidXRlMS5pZCA9PSBhdHRyaWJ1dGUyLmlkXHJcbiAgICAgICAgICAgID8gYCR7YXR0cmlidXRlMS5uYW1lfSAoJHthdHRyaWJ1dGUxLmFjY291bnROb30pYFxyXG4gICAgICAgICAgICA6ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBnZXROZXh0VGVtcGxhdGVCYXRjaCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNIYXZlTmV4dFRlbXBsYXRlT3B0aW9uKSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMucGFnZU5vVGVtcGxhdGVPcHRpb24gKz0gMTtcclxuICAgICAgICB0aGlzLmdldFRlbXBsYXRlT3B0aW9uU2VydmljZShudWxsLCAnJywgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHRlbXBsYXRlU2VsZWN0ZWREaXNwbGF5KFxyXG4gICAgICAgIGF0dHJpYnV0ZTE6IFRlbXBsYXRlV0FNb2RlbCxcclxuICAgICAgICBhdHRyaWJ1dGUyOiBUZW1wbGF0ZVdBTW9kZWxcclxuICAgICk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZTEgJiYgYXR0cmlidXRlMiAmJiBhdHRyaWJ1dGUxLm5hbWUgPT0gYXR0cmlidXRlMi5uYW1lXHJcbiAgICAgICAgICAgID8gYCR7YXR0cmlidXRlMS5uYW1lfWBcclxuICAgICAgICAgICAgOiAnJztcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgb25GaWxlU2VsZWN0ZWQoZXZlbnQ6IEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgZmlsZTogRmlsZUxpc3QgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmZpbGVzO1xyXG4gICAgICAgIGNvbnN0IGFjY2VwdCA9IHRoaXMuZXh0RmlsZUFjY2VwdGVkLnNwbGl0KCcvJyk7XHJcbiAgICAgICAgbGV0IG1hdGNoVHlwZSA9IGFjY2VwdFswXTtcclxuXHJcbiAgICAgICAgaWYgKGZpbGUubGVuZ3RoID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmV4dEZpbGVBY2NlcHRlZCA9PT0gJ2FwcGxpY2F0aW9uL3BkZicpIG1hdGNoVHlwZSA9IGFjY2VwdFsxXTtcclxuXHJcbiAgICAgICAgaWYgKCFmaWxlWzBdLnR5cGUuaW5jbHVkZXMobWF0Y2hUeXBlKSkge1xyXG4gICAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignU29ycnksIHRoZSBmaWxlIHlvdSBhcmUgdXBsb2FkaW5nIGlzIG5vdMKgYWxsb3dlZCcpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZmlsZVswXS5zaXplID4gMTAwMDAwMDApIHtcclxuICAgICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VwbG9hZCBtZWRpYSBmYWlsZWQsIG1heCBzaXplIDEwbWInKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCdmaWxlJyk/LnNldFZhbHVlKGZpbGVbMF0pO1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnZmlsZVR5cGUnKT8uc2V0VmFsdWUoJ2ltYWdlJyk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCdmaWxlTmFtZScpPy5zZXRWYWx1ZShmaWxlWzBdLm5hbWUpO1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgndGFyZ2V0VVJMJyk/LnNldFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0YXJnZXRVUkwnKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG5cclxuICAgICAgICBpZiAoZmlsZVswXS50eXBlLmluZGV4T2YoJ3ZpZGVvJykgPiAtMSkgdGhpcy5nZXRDb250cm9sKCdmaWxlVHlwZScpPy5zZXRWYWx1ZSgndmlkZW8nKTtcclxuXHJcbiAgICAgICAgdGhpcy51cGxvYWRNZWRpYVNlcnZpY2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwbG9hZE1lZGlhU2VydmljZSgpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBwYXJhbWV0ZXJMaXN0OiBBcnJheTxQYXJhbWV0ZXI+ID0gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiAnZmlsZScsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5nZXRDb250cm9sKCdmaWxlJyk/LnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgaW46ICdmb3JtRGF0YScsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnb2JqZWN0JyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICBdO1xyXG5cclxuICAgICAgICBjb25zdCBzdWJzID0gdGhpcy5hcGlBZGFwdGVyU2VydmljZVxyXG4gICAgICAgICAgICAuZXhlY3V0ZUFwaVJlcXVlc3QocGFyYW1ldGVyTGlzdCwgJy9tZXNzYWdlL21lZGlhJywgJ1BPU1QnKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyZXNwOiBBcHBSZXNwb25zZTxhbnk+KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3RhcmdldFVSTCcpPy5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgndGFyZ2V0VVJMJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgndGFyZ2V0VVJMJyk/LnNldFZhbHVlKHJlc3AuZGF0YS50YXJnZXRVUkwpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdmaWxlJyk/LnJlc2V0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdHIuc3VjY2VzcygnVXBsb2FkIG1lZGlhIHN1Y2Nlc3MnKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlcnMucHVzaChzdWJzKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgYnV0dG9uUGFyYW1zQ29udHJvbHMoKSB7XHJcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZm9ybS5nZXQoJ2J1dHRvblBhcmFtcycpIGFzIEZvcm1BcnJheTtcclxuICAgICAgICByZXR1cm4gY29udHJvbCA/IGNvbnRyb2wuY29udHJvbHMgOiBbXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXNVc2luZ0V4Y2VsQnVsaygpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRDb250cm9sKCdpc1VwbG9hZCcpPy52YWx1ZSB8fCBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlVGVtcGxhdGUodGVtcGxhdGU6IFRlbXBsYXRlV0FNb2RlbCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaXNTaG93UGFyYW1ldGVyID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICghdGVtcGxhdGUpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgZm9ybVN0b3JhZ2UgPSB0aGlzLmdldENhbXBhaWduU3RvcmFnZT8uZ2VuZXJhbEluZm9ybWF0aW9uPy5mb3JtO1xyXG5cclxuICAgICAgICBjb25zdCBidXR0b25QYXJhbXNBcnJheSA9IHRoaXMuZm9ybS5nZXQoJ2J1dHRvblBhcmFtcycpIGFzIEZvcm1BcnJheTtcclxuICAgICAgICBidXR0b25QYXJhbXNBcnJheS5jbGVhcigpO1xyXG5cclxuICAgICAgICBpZiAodGVtcGxhdGUgJiYgdGVtcGxhdGUuYnV0dG9ucyAmJiB0ZW1wbGF0ZS5idXR0b25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgbGV0IHFySW5kZXhMb2NhbCA9IDA7XHJcblxyXG4gICAgICAgICAgICB0ZW1wbGF0ZS5idXR0b25zLmZvckVhY2goKGJ0bjogYW55LCBpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYnRuLnR5cGUgPT09ICdRVUlDS19SRVBMWScpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZXhpc3RpbmdQYXlsb2FkID0gJyc7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNLRU5BUklPIDE6IERhdGEgZGFyaSBMb2NhbCBTdGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtU3RvcmFnZT8uYnV0dG9uUGFyYW1zICYmIGZvcm1TdG9yYWdlLmJ1dHRvblBhcmFtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUGF5bG9hZCA9IGZvcm1TdG9yYWdlLmJ1dHRvblBhcmFtc1txckluZGV4TG9jYWxdPy5wYXlsb2FkIHx8ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBxckluZGV4TG9jYWwrKztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gU0tFTkFSSU8gMjogRGF0YSBkYXJpIEJFXHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1TdG9yYWdlPy5wYXJhbUJ1dHRvbiAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KGZvcm1TdG9yYWdlLnBhcmFtQnV0dG9uW2luZGV4XSlcclxuICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdQYXlsb2FkID0gZm9ybVN0b3JhZ2UucGFyYW1CdXR0b25baW5kZXhdWzBdIHx8ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uUGFyYW1zQXJyYXkucHVzaChcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZvcm1Hcm91cCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogbmV3IEZvcm1Db250cm9sKGJ0bi50ZXh0KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IG5ldyBGb3JtQ29udHJvbChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBleGlzdGluZ1BheWxvYWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiB0aGlzLmlzUmVhZE9ubHlNb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDI1NildXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pc0hhdmVUZW1wbGF0ZVBhcmFtID1cclxuICAgICAgICAgICAgKHRlbXBsYXRlLmhlYWRlcj8uZXhhbXBsZXM/Lmxlbmd0aCA/PyAwKSA+IDAgfHxcclxuICAgICAgICAgICAgKHRlbXBsYXRlLmJvZHk/LmV4YW1wbGVzPy5sZW5ndGggPz8gMCkgPiAwIHx8XHJcbiAgICAgICAgICAgICh0ZW1wbGF0ZS5idXR0b25zPy5sZW5ndGggPz8gMCkgPiAwIHx8XHJcbiAgICAgICAgICAgICh0ZW1wbGF0ZS5jYXJvdXNlbD8ubGVuZ3RoID8/IDApID4gMDtcclxuXHJcbiAgICAgICAgaWYgKFsnaW1hZ2UnLCAndmlkZW8nLCAnZG9jdW1lbnQnXS5pbmNsdWRlcyh0ZW1wbGF0ZT8uaGVhZGVyPy50eXBlPy50b0xvd2VyQ2FzZSgpKSkge1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2ZpbGVOYW1lJyk/LnNldFZhbHVlKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRDYW1wYWlnblN0b3JhZ2U/LmdlbmVyYWxJbmZvcm1hdGlvbj8uZm9ybS5maWxlTmFtZSA/P1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2FtcGFpZ25TdG9yYWdlPy5nZW5lcmFsSW5mb3JtYXRpb24/LmZvcm0udGFyZ2V0VVJMID8/XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUuaGVhZGVyLnVybFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3RhcmdldFVSTCcpPy5zZXRWYWx1ZShcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2FtcGFpZ25TdG9yYWdlPy5nZW5lcmFsSW5mb3JtYXRpb24/LmZvcm0udGFyZ2V0VVJMID8/IHRlbXBsYXRlLmhlYWRlci51cmxcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZmlsZVR5cGVDaGFuZ2UodGVtcGxhdGU/LmhlYWRlcj8udHlwZT8udG9Mb3dlckNhc2UoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAodGVtcGxhdGUuaGVhZGVyLmV4YW1wbGVzPy5sZW5ndGggPz8gMCkgPiAwXHJcbiAgICAgICAgICAgID8gdGhpcy5nZXRDb250cm9sKCdwYXJhbUhlYWRlcicpPy5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpXHJcbiAgICAgICAgICAgIDogdGhpcy5nZXRDb250cm9sKCdwYXJhbUhlYWRlcicpPy5jbGVhclZhbGlkYXRvcnMoKTtcclxuXHJcbiAgICAgICAgKHRlbXBsYXRlLmJvZHkuZXhhbXBsZXM/Lmxlbmd0aCA/PyAwKSA+IDBcclxuICAgICAgICAgICAgPyB0aGlzLmdldENvbnRyb2woJ3BhcmFtQm9keScpPy5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpXHJcbiAgICAgICAgICAgIDogdGhpcy5nZXRDb250cm9sKCdwYXJhbUJvZHknKT8uY2xlYXJWYWxpZGF0b3JzKCk7XHJcblxyXG4gICAgICAgICh0ZW1wbGF0ZS5idXR0b25zPy5sZW5ndGggPz8gMCkgPiAwXHJcbiAgICAgICAgICAgID8gdGhpcy5nZXRDb250cm9sKCdwYXJhbUJ1dHRvbicpPy5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpXHJcbiAgICAgICAgICAgIDogdGhpcy5nZXRDb250cm9sKCdwYXJhbUJ1dHRvbicpPy5jbGVhclZhbGlkYXRvcnMoKTtcclxuXHJcbiAgICAgICAgKHRoaXMuZm9ybS5nZXQoJ3BhcmFtSGVhZGVyJykgYXMgRm9ybUFycmF5KS5jb250cm9scyA9IFtdO1xyXG4gICAgICAgICh0aGlzLmZvcm0uZ2V0KCdwYXJhbUhlYWRlcicpIGFzIEZvcm1BcnJheSkucmVzZXQoKTtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ3BhcmFtSGVhZGVyJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAodGhpcy5mb3JtLmdldCgncGFyYW1Cb2R5JykgYXMgRm9ybUFycmF5KS5jb250cm9scyA9IFtdO1xyXG4gICAgICAgICh0aGlzLmZvcm0uZ2V0KCdwYXJhbUJvZHknKSBhcyBGb3JtQXJyYXkpLnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCdwYXJhbUJvZHknKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICh0aGlzLmZvcm0uZ2V0KCdwYXJhbUJ1dHRvbicpIGFzIEZvcm1BcnJheSkuY29udHJvbHMgPSBbXTtcclxuICAgICAgICAodGhpcy5mb3JtLmdldCgncGFyYW1CdXR0b24nKSBhcyBGb3JtQXJyYXkpLnJlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCdwYXJhbUJ1dHRvbicpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCdvdHBWYWx1ZScpPy5zZXRWYWx1ZSgnJyk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCdvdHBWYWx1ZScpPy5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICB0aGlzLmdldENvbnRyb2woJ290cFZhbHVlJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuXHJcbiAgICAgICAgaWYgKHRlbXBsYXRlLmNhdGVnb3J5ID09PSAnQVVUSEVOVElDQVRJT04nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnb3RwVmFsdWUnKT8uc2V0VmFsdWUoXHJcbiAgICAgICAgICAgICAgICBmb3JtU3RvcmFnZT8ub3RwVmFsdWUgPz9cclxuICAgICAgICAgICAgICAgICAgICBbLi4uKGZvcm1TdG9yYWdlPy50ZW1wbGF0ZT8uYm9keT8uZXhhbXBsZXMgPz8gW10pXT8ucG9wKCkgPz9cclxuICAgICAgICAgICAgICAgICAgICAnJ1xyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdvdHBWYWx1ZScpPy5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ290cFZhbHVlJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRlbXBsYXRlLmhlYWRlci5leGFtcGxlcz8uZm9yRWFjaCgoZWFjaCwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hZGRQYXJhbUhlYWRlcihcclxuICAgICAgICAgICAgICAgIGZvcm1TdG9yYWdlPy5wYXJhbUhlYWRlcj8uW2luZGV4XT8ubmFtZSA/PyBmb3JtU3RvcmFnZT8ucGFyYW1IZWFkZXI/LltpbmRleF0gPz8gJydcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGVtcGxhdGUuYm9keS5leGFtcGxlcz8uZm9yRWFjaCgoZWFjaCwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgbGV0IHBhcmFtVmFsdWUgPVxyXG4gICAgICAgICAgICAgICAgZm9ybVN0b3JhZ2U/LnBhcmFtQm9keT8uW2luZGV4XT8ubmFtZSA/PyBmb3JtU3RvcmFnZT8ucGFyYW1Cb2R5Py5baW5kZXhdID8/ICcnO1xyXG5cclxuICAgICAgICAgICAgaWYgKFsnJFVuc3Vic2NyaWJlQWNjb3VudCddLmluY2x1ZGVzKGVhY2gpKSBwYXJhbVZhbHVlID0gZWFjaDtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuYWRkUGFyYW1Cb2R5KHBhcmFtVmFsdWUpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAgICAgLy8gVEFNQkFIQU46IEdlbmVyYXRlIFZhcmlhYmxlIERpbmFtaXMgZGFyaSB0ZW1wbGF0ZS5ib2R5LmV4YW1wbGVzXHJcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4gICAgICAgIHRoaXMudmFyaWFibGVzLmNsZWFyKCk7XHJcbiAgICAgICAgaWYgKHRlbXBsYXRlLmJvZHk/LmV4YW1wbGVzICYmIHRlbXBsYXRlLmJvZHkuZXhhbXBsZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBjb25zdCBpc1NhdmVkVGVtcGxhdGVNYXRjaGVzID0gZm9ybVN0b3JhZ2U/LnRlbXBsYXRlPy5uYW1lID09PSB0ZW1wbGF0ZS5uYW1lO1xyXG4gICAgICAgICAgICBjb25zdCBpc1V0aWxpdHlUZW1wbGF0ZSA9IHRlbXBsYXRlLmNhdGVnb3J5Py50b1VwcGVyQ2FzZSgpID09PSAnVVRJTElUWSc7XHJcbiAgICAgICAgICAgIHRlbXBsYXRlLmJvZHkuZXhhbXBsZXMuZm9yRWFjaCgoZXhhbXBsZVZhbHVlOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBzYXZlZFZhcmlhYmxlID0gJyc7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNTYXZlZFRlbXBsYXRlTWF0Y2hlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIHNhdmVkVmFyaWFibGUgPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtU3RvcmFnZT8udmFyaWFibGVzPy5baW5kZXhdPy5wYXJhbU5hbWUgPz9cclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVN0b3JhZ2U/LnRlbXBsYXRlPy5kYXRhPy5baW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGZpbmFsVmFsdWUgPSBzYXZlZFZhcmlhYmxlID8gc2F2ZWRWYXJpYWJsZSA6ICcnO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMudmFyaWFibGVzLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgbmV3IEZvcm1Hcm91cCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogbmV3IEZvcm1Db250cm9sKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmaW5hbFZhbHVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiB0aGlzLmlzUmVhZE9ubHlNb2RlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVXRpbGl0eVRlbXBsYXRlID8gVmFsaWRhdG9ycy5yZXF1aXJlZCA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGVtcGxhdGUuYm9keT8udGV4dCkge1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3RleHQnKT8uc2V0VmFsdWUodGVtcGxhdGUuYm9keS50ZXh0KTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0ZXh0Jyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAgICAgLy8gVEFNQkFIQU46IEdlbmVyYXRlIEZvcm0gQ2Fyb3VzZWwgRGluYW1pc1xyXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgICAgICBjb25zdCBjYXJvdXNlbEFycmF5ID0gdGhpcy5mb3JtLmdldCgncGFyYW1DYXJvdXNlbCcpIGFzIEZvcm1BcnJheTtcclxuICAgICAgICBjYXJvdXNlbEFycmF5LmNsZWFyKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGlzVXNpbmdVcGxvYWQgPSB0aGlzLmdldENvbnRyb2woJ2lzVXBsb2FkJyk/LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IGR5bmFtaWNWYWxpZGF0b3IgPSBpc1VzaW5nVXBsb2FkID8gbnVsbCA6IFZhbGlkYXRvcnMucmVxdWlyZWQ7XHJcblxyXG4gICAgICAgIGlmICh0ZW1wbGF0ZS5jYXJvdXNlbCAmJiB0ZW1wbGF0ZS5jYXJvdXNlbC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzU2F2ZWRUZW1wbGF0ZU1hdGNoZXMgPSBmb3JtU3RvcmFnZT8udGVtcGxhdGU/Lm5hbWUgPT09IHRlbXBsYXRlLm5hbWU7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzYXZlZFVzZXJJbnB1dHMgPSBpc1NhdmVkVGVtcGxhdGVNYXRjaGVzID8gZm9ybVN0b3JhZ2U/LnBhcmFtQ2Fyb3VzZWwgOiBudWxsO1xyXG5cclxuICAgICAgICAgICAgdGVtcGxhdGUuY2Fyb3VzZWwuZm9yRWFjaCgoY2FyZDogYW55LCBjYXJkSWR4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNhcmRHcm91cCA9IG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlclVSTDogbmV3IEZvcm1Db250cm9sKGNhcmQuaGVhZGVyPy51cmwgPz8gJycpLFxyXG4gICAgICAgICAgICAgICAgICAgIGJvZHlQYXJhbXM6IG5ldyBGb3JtQXJyYXkoW10pLFxyXG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvblBhcmFtczogbmV3IEZvcm1BcnJheShbXSksXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyAxLiBTZXR1cCBCb2R5IFBhcmFtc1xyXG4gICAgICAgICAgICAgICAgaWYgKGNhcmQuYm9keT8uZXhhbXBsZXM/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXJkLmJvZHkuZXhhbXBsZXMuZm9yRWFjaCgoXzogYW55LCBib2R5SWR4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQU1CSUwgVkFMVUUgREFSSSBJTlBVVEFOIFNFQkVMVU1OWUFcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2F2ZWRCb2R5VmFsID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkVXNlcklucHV0cz8uW2NhcmRJZHhdPy5ib2R5UGFyYW1zPy5bYm9keUlkeF0/LnBhcmFtTmFtZSA/PyAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNhcmRHcm91cC5nZXQoJ2JvZHlQYXJhbXMnKSBhcyBGb3JtQXJyYXkpLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRm9ybUdyb3VwKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWU6IG5ldyBGb3JtQ29udHJvbChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB2YWx1ZTogc2F2ZWRCb2R5VmFsLCBkaXNhYmxlZDogdGhpcy5pc1JlYWRPbmx5TW9kZSB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljVmFsaWRhdG9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGNhcmQuYnV0dG9ucz8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhcmQuYnV0dG9ucy5mb3JFYWNoKChidG46IGFueSwgYnRuSWR4OiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYnRuUGFyYW1BcnJheSA9IG5ldyBGb3JtQXJyYXkoW10pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU0tFTkFSSU8gMTogQnV0dG9uIGRlbmdhbiB2YXJpYWJlbCAoY29udG9oIFVSTCAvIFBob25lIGRlbmdhbiB7ezF9fSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ0bi5leGFtcGxlcz8ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRuLmV4YW1wbGVzLmZvckVhY2goKF86IGFueSwgcGFyYW1JZHg6IG51bWJlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNhdmVkQnRuVmFsID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWRVc2VySW5wdXRzPy5bY2FyZElkeF0/LmJ1dHRvblBhcmFtcz8uW2J0bklkeF0/LltwYXJhbUlkeF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ucGFyYW1OYW1lID8/ICcnO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidG5QYXJhbUFycmF5LnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lOiBuZXcgRm9ybUNvbnRyb2woXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB2YWx1ZTogc2F2ZWRCdG5WYWwsIGRpc2FibGVkOiB0aGlzLmlzUmVhZE9ubHlNb2RlIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY1ZhbGlkYXRvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU0tFTkFSSU8gMjogQnV0dG9uIGJlcnRpcGUgUVVJQ0tfUkVQTFkgKEJ1dHVoIGlucHV0IFBheWxvYWQgc3RhdGlzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChidG4udHlwZSA9PT0gJ1FVSUNLX1JFUExZJykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2F2ZWRQYXlsb2FkVmFsID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZFVzZXJJbnB1dHM/LltjYXJkSWR4XT8uYnV0dG9uUGFyYW1zPy5bYnRuSWR4XT8uWzBdPy5wYXlsb2FkID8/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyc7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnRuUGFyYW1BcnJheS5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiBuZXcgRm9ybUNvbnRyb2woXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHZhbHVlOiBzYXZlZFBheWxvYWRWYWwsIGRpc2FibGVkOiB0aGlzLmlzUmVhZE9ubHlNb2RlIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjU2KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oaXNVc2luZ1VwbG9hZCA/IFtdIDogW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNhcmRHcm91cC5nZXQoJ2J1dHRvblBhcmFtcycpIGFzIEZvcm1BcnJheSkucHVzaChidG5QYXJhbUFycmF5KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBjYXJvdXNlbEFycmF5LnB1c2goY2FyZEdyb3VwKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0ZW1wbGF0ZS5idXR0b25zPy5mb3JFYWNoKChlYWNoLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmFkZFBhcmFtQnV0dG9uKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IHRoaXMuZ2V0QnV0dG9uO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVhY2guZXhhbXBsZXM/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIGVhY2guZXhhbXBsZXMuZm9yRWFjaCgoXywgcGFyYW1JbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmb3JtID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVhY2gudHlwZSA9PT0gJ0ZMT1cnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0gPSB0aGlzLmluaXRQYXJhbWV0ZXIoZmFsc2UsIGVhY2guZmxvd19pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1Nob3dQYXJhbWV0ZXIgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtID0gdGhpcy5pbml0UGFyYW1ldGVyKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtU3RvcmFnZT8ucGFyYW1CdXR0b24/LltpbmRleF0/Lm5hbWU/LltwYXJhbUluZGV4XT8ubmFtZSA/P1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1TdG9yYWdlPy5wYXJhbUJ1dHRvbj8uW2luZGV4XT8ubmFtZT8uW3BhcmFtSW5kZXhdID8/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybVN0b3JhZ2U/LnBhcmFtQnV0dG9uPy5baW5kZXhdPy5bcGFyYW1JbmRleF0gPz9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgKGJ1dHRvbltidXR0b24ubGVuZ3RoIC0gMV0uZ2V0KCduYW1lJykgYXMgRm9ybUFycmF5KS5wdXNoKGZvcm0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0Q29udHJvbCA9IGJ1dHRvbltidXR0b24ubGVuZ3RoIC0gMV0/LmdldCgnbmFtZScpO1xyXG4gICAgICAgICAgICAgICAgbGFzdENvbnRyb2w/LmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgICAgICAgbGFzdENvbnRyb2w/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBwYXJhbUJvZHlBcnJheSA9IHRoaXMuZm9ybS5nZXQoJ3BhcmFtQm9keScpIGFzIEZvcm1BcnJheTtcclxuXHJcbiAgICAgICAgcGFyYW1Cb2R5QXJyYXkuY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgcGFyYW1Cb2R5QXJyYXkuY29udHJvbHMuZm9yRWFjaCgoY3RybCkgPT4ge1xyXG4gICAgICAgICAgICBjdHJsLmdldCgnbmFtZScpPy5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgICAgY3RybC5nZXQoJ25hbWUnKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBwYXJhbUJvZHlBcnJheS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgdGhpcy50b2dnbGVFeGNlbFZhbGlkYXRpb24odGhpcy5mb3JtLmdldCgnaXNVcGxvYWQnKT8udmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVNZWRpYVR5cGUoX21lZGlhVHlwZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKF9tZWRpYVR5cGUgPT09IEVudW1EYXRhLk1FRElBX1RZUEVfTE9DQVRJT04pIHRoaXMuaW5pdE1hcHM7XHJcblxyXG4gICAgICAgIHRoaXMuZm9ybVJlc2V0KHRydWUpO1xyXG4gICAgICAgIHRoaXMuZmlsZVR5cGVDaGFuZ2UoX21lZGlhVHlwZS50b0xvd2VyQ2FzZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGZpbGVUeXBlQ2hhbmdlKHR5cGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZXh0RmlsZUFjY2VwdGVkID0gJ2ltYWdlLyonO1xyXG5cclxuICAgICAgICBpZiAodHlwZSA9PT0gRW51bURhdGEuTUVESUFfVFlQRV9WSURFTy50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0RmlsZUFjY2VwdGVkID0gJ3ZpZGVvLyonO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gRW51bURhdGEuTUVESUFfVFlQRV9ET0NVTUVOVC50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXh0RmlsZUFjY2VwdGVkID0gJ2FwcGxpY2F0aW9uL3BkZic7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyB1cGRhdGVTZWFyY2goc2VhcmNoVmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucGFnZU5vVGVtcGxhdGVPcHRpb24gPSAxO1xyXG4gICAgICAgIHRoaXMuZ2V0VGVtcGxhdGVPcHRpb25TZXJ2aWNlKG51bGwsIHNlYXJjaFZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlU2VhcmNoQWNjb3VudChzZWFyY2hWYWx1ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5wYWdlTm9BY2NvdW50T3B0aW9uID0gMTtcclxuICAgICAgICB0aGlzLmdldEFjY291bnRPcHRpb25TZXJ2aWNlKHNlYXJjaFZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluaXRNYXBzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMubWFwc0FQSUxvYWRlci5sb2FkKCkudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0Q3VycmVudExvY2F0aW9uKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmdlb0NvZGVyID0gbmV3IGdvb2dsZS5tYXBzLkdlb2NvZGVyKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGF1dG9jb21wbGV0ZSA9IG5ldyBnb29nbGUubWFwcy5wbGFjZXMuQXV0b2NvbXBsZXRlKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5tYXBTZWFyY2hSZWYubmF0aXZlRWxlbWVudFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBhdXRvY29tcGxldGUuYWRkTGlzdGVuZXIoJ3BsYWNlX2NoYW5nZWQnLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlOiBnb29nbGUubWFwcy5wbGFjZXMuUGxhY2VSZXN1bHQgPSBhdXRvY29tcGxldGUuZ2V0UGxhY2UoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwbGFjZS5nZW9tZXRyeSkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcHMubGF0aXR1ZGUgPSBwbGFjZS5nZW9tZXRyeS5sb2NhdGlvbi5sYXQoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcHMubG9uZ2l0dWRlID0gcGxhY2UuZ2VvbWV0cnkubG9jYXRpb24ubG5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdsYXRpdHVkZScpPy5zZXRWYWx1ZSh0aGlzLm1hcHMubGF0aXR1ZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnbG9uZ2l0dWRlJyk/LnNldFZhbHVlKHRoaXMubWFwcy5sb25naXR1ZGUpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0Q3VycmVudExvY2F0aW9uKCkge1xyXG4gICAgICAgIGlmICgnZ2VvbG9jYXRpb24nIGluIG5hdmlnYXRvcikge1xyXG4gICAgICAgICAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKChwb3NpdGlvbikgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmdldENvbnRyb2woJ2xvbmdpdHVkZScpPy52YWx1ZSAmJiAhdGhpcy5nZXRDb250cm9sKCdsYXRpdHVkZScpPy52YWx1ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFwcy5sYXRpdHVkZSA9IHBvc2l0aW9uLmNvb3Jkcy5sYXRpdHVkZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcHMubG9uZ2l0dWRlID0gcG9zaXRpb24uY29vcmRzLmxvbmdpdHVkZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2xhdGl0dWRlJyk/LnNldFZhbHVlKHRoaXMubWFwcy5sYXRpdHVkZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdsb25naXR1ZGUnKT8uc2V0VmFsdWUodGhpcy5tYXBzLmxvbmdpdHVkZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgbWFya2VyRHJhZ0VuZChldmVudDogZ29vZ2xlLm1hcHMuTW91c2VFdmVudCkge1xyXG4gICAgICAgIGlmIChldmVudC5sYXRMbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXBzLmxhdGl0dWRlID0gZXZlbnQubGF0TG5nLmxhdCgpO1xyXG4gICAgICAgICAgICB0aGlzLm1hcHMubG9uZ2l0dWRlID0gZXZlbnQubGF0TG5nLmxuZygpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ2xhdGl0dWRlJyk/LnNldFZhbHVlKHRoaXMubWFwcy5sYXRpdHVkZSk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnbG9uZ2l0dWRlJyk/LnNldFZhbHVlKHRoaXMubWFwcy5sb25naXR1ZGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgdXBkYXRlRG93bmxvYWRDU1YoaXNDaGVja2VkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCdpc1VwbG9hZCcpPy5zZXRWYWx1ZShpc0NoZWNrZWQpO1xyXG5cclxuICAgICAgICBpZiAoaXNDaGVja2VkKSB7XHJcbiAgICAgICAgICAgICh0aGlzLmdldENvbnRyb2woJ3BhcmFtSGVhZGVyJykgYXMgRm9ybUFycmF5KS5jb250cm9scyA9IFtdO1xyXG4gICAgICAgICAgICAodGhpcy5nZXRDb250cm9sKCdwYXJhbUhlYWRlcicpIGFzIEZvcm1BcnJheSkucmVzZXQoKTtcclxuICAgICAgICAgICAgKHRoaXMuZ2V0Q29udHJvbCgncGFyYW1Cb2R5JykgYXMgRm9ybUFycmF5KS5jb250cm9scyA9IFtdO1xyXG4gICAgICAgICAgICAodGhpcy5nZXRDb250cm9sKCdwYXJhbUJvZHknKSBhcyBGb3JtQXJyYXkpLnJlc2V0KCk7XHJcbiAgICAgICAgICAgICh0aGlzLmdldENvbnRyb2woJ3BhcmFtQnV0dG9uJykgYXMgRm9ybUFycmF5KS5jb250cm9scyA9IFtdO1xyXG4gICAgICAgICAgICAodGhpcy5nZXRDb250cm9sKCdwYXJhbUJ1dHRvbicpIGFzIEZvcm1BcnJheSkucmVzZXQoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdwYXJhbUhlYWRlcicpPy5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCdwYXJhbUJvZHknKT8uY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgncGFyYW1CdXR0b24nKT8uY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgncGFyYW1IZWFkZXInKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3BhcmFtQm9keScpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgncGFyYW1CdXR0b24nKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ290cFZhbHVlJyk/LnJlc2V0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnb3RwVmFsdWUnKT8uY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnb3RwVmFsdWUnKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLnZhcmlhYmxlcy5jb250cm9scy5mb3JFYWNoKChjdHJsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjdHJsLmdldCgncGFyYW1OYW1lJyk/LmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgICAgICAgY3RybC5nZXQoJ3BhcmFtTmFtZScpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjb25zdCBjYXJvdXNlbEFycmF5ID0gdGhpcy5mb3JtLmdldCgncGFyYW1DYXJvdXNlbCcpIGFzIEZvcm1BcnJheTtcclxuICAgICAgICAgICAgaWYgKGNhcm91c2VsQXJyYXkpIHtcclxuICAgICAgICAgICAgICAgIGNhcm91c2VsQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoY2FyZDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keVBhcmFtcyA9IGNhcmQuZ2V0KCdib2R5UGFyYW1zJykgYXMgRm9ybUFycmF5O1xyXG4gICAgICAgICAgICAgICAgICAgIGJvZHlQYXJhbXM/LmNvbnRyb2xzLmZvckVhY2goKGJDdHJsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJDdHJsLmdldCgncGFyYW1OYW1lJyk/LmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBiQ3RybC5nZXQoJ3BhcmFtTmFtZScpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ0blBhcmFtcyA9IGNhcmQuZ2V0KCdidXR0b25QYXJhbXMnKSBhcyBGb3JtQXJyYXk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnRuUGFyYW1zPy5jb250cm9scy5mb3JFYWNoKChidG5Hcm91cDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChidG5Hcm91cCBhcyBGb3JtQXJyYXkpLmNvbnRyb2xzLmZvckVhY2goKHBCdG5DdHJsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQnRuQ3RybC5nZXQoJ3BhcmFtTmFtZScpPy5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdG5DdHJsLmdldCgncGFyYW1OYW1lJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdG5DdHJsLmdldCgncGF5bG9hZCcpPy5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCdG5DdHJsLmdldCgncGF5bG9hZCcpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnVwZGF0ZVRlbXBsYXRlKHRoaXMuZ2V0Q29udHJvbCgndGVtcGxhdGUnKT8udmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBoYW5kbGVDaGFuZ2VUZW1wbGF0ZSh1c2VFeGlzdGluZzogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuZ2V0Q29udHJvbCgnaXNEb3dubG9hZFZhcmlhYmxlWExTJyk/LnNldFZhbHVlKGZhbHNlKTtcclxuICAgICAgICB0aGlzLnZhcmlhYmxlcy5jbGVhcigpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlVmFyaWFibGVEb3dubG9hZFhMUyhmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0ZXh0Jyk/LnNldFZhbHVlKCcnKTtcclxuICAgICAgICBpZiAodXNlRXhpc3RpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0ZW1wbGF0ZScpPy5zZXRWYWxpZGF0b3JzKFZhbGlkYXRvcnMucmVxdWlyZWQpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3RleHQnKT8uY2xlYXJWYWxpZGF0b3JzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgndGV4dCcpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgndGVtcGxhdGUnKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgndGVtcGxhdGUnKT8ucmVzZXQoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0ZW1wbGF0ZScpPy5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgICAgdGhpcy5nZXRDb250cm9sKCd0ZXh0Jyk/LnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4KDEwMjQpXSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3RleHQnKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB0aGlzLmdldENvbnRyb2woJ3RlbXBsYXRlJyk/LnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGhhbmRsZUNoYW5nZUZyb20odmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHsgaXNVc2VFeGlzdGluZ1RlbXBsYXRlIH0gPSB0aGlzLmZvcm0udmFsdWU7XHJcbiAgICAgICAgaWYgKCFpc1VzZUV4aXN0aW5nVGVtcGxhdGUpIHJldHVybjtcclxuICAgICAgICB0aGlzLmdldFRlbXBsYXRlT3B0aW9uU2VydmljZSh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHZhcmlhYmxlcygpOiBGb3JtQXJyYXkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldENvbnRyb2woJ3ZhcmlhYmxlcycpIGFzIEZvcm1BcnJheTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHN5bmNWYXJpYWJsZXNGcm9tVGV4dCh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGV4dCA9PT0gbnVsbCB8fCB0ZXh0ID09PSB1bmRlZmluZWQpIHJldHVybjtcclxuXHJcbiAgICAgICAgbGV0IGNvdW50ZXIgPSAxO1xyXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUZXh0ID0gdGV4dC5yZXBsYWNlKC9cXHtcXHtcXHMqXFxkK1xccypcXH1cXH0vZywgKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCByZXBsYWNlbWVudCA9IGB7eyR7Y291bnRlcn19fWA7XHJcbiAgICAgICAgICAgIGNvdW50ZXIrKztcclxuICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXRWYXJpYWJsZUNvdW50ID0gY291bnRlciAtIDE7XHJcbiAgICAgICAgaWYgKHRleHQgIT09IG5vcm1hbGl6ZWRUZXh0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgndGV4dCcpPy5zZXRWYWx1ZShub3JtYWxpemVkVGV4dCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjdXJyZW50Q291bnQgPSB0aGlzLnZhcmlhYmxlcy5sZW5ndGg7XHJcblxyXG4gICAgICAgIGlmICh0YXJnZXRWYXJpYWJsZUNvdW50ID4gY3VycmVudENvdW50KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRpZmYgPSB0YXJnZXRWYXJpYWJsZUNvdW50IC0gY3VycmVudENvdW50O1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpZmY7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy52YXJpYWJsZXMucHVzaChcclxuICAgICAgICAgICAgICAgICAgICBuZXcgRm9ybUdyb3VwKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lOiBuZXcgRm9ybUNvbnRyb2woXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHZhbHVlOiAnJywgZGlzYWJsZWQ6IHRoaXMuaXNSZWFkT25seU1vZGUgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0VmFyaWFibGVDb3VudCA8IGN1cnJlbnRDb3VudCkge1xyXG4gICAgICAgICAgICBjb25zdCBkaWZmID0gY3VycmVudENvdW50IC0gdGFyZ2V0VmFyaWFibGVDb3VudDtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaWZmOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudmFyaWFibGVzLnJlbW92ZUF0KHRoaXMudmFyaWFibGVzLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFkZFZhcmlhYmxlKCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHRleHRDb250cm9sID0gdGhpcy5nZXRDb250cm9sKCd0ZXh0Jyk7XHJcblxyXG4gICAgICAgIGlmICh0ZXh0Q29udHJvbCkge1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50Qm9keSA9IHRleHRDb250cm9sLnZhbHVlIHx8ICcnO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgbmV4dFNlcXVlbmNlID0gdGhpcy52YXJpYWJsZXMubGVuZ3RoICsgMTtcclxuICAgICAgICAgICAgY29uc3QgbmV3U2VxdWVuY2UgPSBge3ske25leHRTZXF1ZW5jZX19fWA7XHJcblxyXG4gICAgICAgICAgICB0ZXh0Q29udHJvbC5zZXRWYWx1ZShgJHtjdXJyZW50Qm9keX0ke25ld1NlcXVlbmNlfWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVWYXJpYWJsZShpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy52YXJpYWJsZXMucmVtb3ZlQXQoaW5kZXgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy52YXJpYWJsZXMuY29udHJvbHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udHJvbCgndXNlWGxzeCcpPy5zZXRWYWx1ZShmYWxzZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB0ZXh0Q29udHJvbCA9IHRoaXMuZ2V0Q29udHJvbCgndGV4dCcpO1xyXG5cclxuICAgICAgICBpZiAodGV4dENvbnRyb2wgJiYgdGV4dENvbnRyb2wudmFsdWUpIHtcclxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0U2VxdWVuY2UgPSBpbmRleCArIDE7XHJcbiAgICAgICAgICAgIGxldCBjdXJyZW50Qm9keSA9IHRleHRDb250cm9sLnZhbHVlO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcmVtb3ZlUmVnZXggPSBuZXcgUmVnRXhwKGBcXFxccypcXFxce1xcXFx7JHt0YXJnZXRTZXF1ZW5jZX1cXFxcfVxcXFx9YCwgJ2cnKTtcclxuICAgICAgICAgICAgY3VycmVudEJvZHkgPSBjdXJyZW50Qm9keS5yZXBsYWNlKHJlbW92ZVJlZ2V4LCAnJyk7XHJcblxyXG4gICAgICAgICAgICBjdXJyZW50Qm9keSA9IGN1cnJlbnRCb2R5LnJlcGxhY2UoL1xce1xceyhcXGQrKVxcfVxcfS9nLCAobWF0Y2g6IG51bWJlciwgbnVtU3RyOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IHBhcnNlSW50KG51bVN0ciwgMTApO1xyXG4gICAgICAgICAgICAgICAgaWYgKG51bSA+IHRhcmdldFNlcXVlbmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGB7eyR7bnVtIC0gMX19fWA7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2g7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGV4dENvbnRyb2wuc2V0VmFsdWUoY3VycmVudEJvZHkudHJpbSgpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlVmFyaWFibGVEb3dubG9hZFhMUyhpc0NoZWNrZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB2YXJpYWJsZXNBcnJheSA9IHRoaXMudmFyaWFibGVzO1xyXG4gICAgICAgIGlmIChpc0NoZWNrZWQpIHtcclxuICAgICAgICAgICAgdmFyaWFibGVzQXJyYXkuY29udHJvbHMuZm9yRWFjaCgoY29udHJvbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5nZXQoJ3BhcmFtTmFtZScpPy5jbGVhclZhbGlkYXRvcnMoKTtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCdwYXJhbU5hbWUnKT8uc2V0VmFsdWUoJycpO1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5nZXQoJ3BhcmFtTmFtZScpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhcmlhYmxlc0FycmF5LmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCdwYXJhbU5hbWUnKT8uc2V0VmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wuZ2V0KCdwYXJhbU5hbWUnKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZm9ybS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHRvZ2dsZUV4Y2VsVmFsaWRhdGlvbihpc1VwbG9hZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWxpZGF0b3IgPSBpc1VwbG9hZCA/IG51bGwgOiBWYWxpZGF0b3JzLnJlcXVpcmVkO1xyXG5cclxuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XHJcbiAgICAgICAgLy8gMi4gVVBEQVRFIFZBTElEQVNJIENBUk9VU0VMIFZBUklBQkxFU1xyXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgICAgICBjb25zdCBjYXJvdXNlbEFycmF5ID0gdGhpcy5mb3JtLmdldCgncGFyYW1DYXJvdXNlbCcpIGFzIEZvcm1BcnJheTtcclxuICAgICAgICBpZiAoY2Fyb3VzZWxBcnJheSkge1xyXG4gICAgICAgICAgICBjYXJvdXNlbEFycmF5LmNvbnRyb2xzLmZvckVhY2goKGNhcmQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYm9keVBhcmFtcyA9IGNhcmQuZ2V0KCdib2R5UGFyYW1zJykgYXMgRm9ybUFycmF5O1xyXG4gICAgICAgICAgICAgICAgYm9keVBhcmFtcz8uY29udHJvbHMuZm9yRWFjaCgoYkN0cmw6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGJDdHJsLmdldCgncGFyYW1OYW1lJyk/LnNldFZhbGlkYXRvcnMoY3VycmVudFZhbGlkYXRvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgYkN0cmwuZ2V0KCdwYXJhbU5hbWUnKT8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBidG5QYXJhbXMgPSBjYXJkLmdldCgnYnV0dG9uUGFyYW1zJykgYXMgRm9ybUFycmF5O1xyXG4gICAgICAgICAgICAgICAgYnRuUGFyYW1zPy5jb250cm9scy5mb3JFYWNoKChidG5Hcm91cDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgKGJ0bkdyb3VwIGFzIEZvcm1BcnJheSkuY29udHJvbHMuZm9yRWFjaCgocEJ0bkN0cmw6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwQnRuQ3RybC5nZXQoJ3BhcmFtTmFtZScpPy5zZXRWYWxpZGF0b3JzKGN1cnJlbnRWYWxpZGF0b3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwQnRuQ3RybC5nZXQoJ3BhcmFtTmFtZScpPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGNhcm91c2VsQXJyYXkudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZm9ybS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zdWJzY3JpYmVycy5mb3JFYWNoKChlYWNoKSA9PiBlYWNoLnVuc3Vic2NyaWJlKCkpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==