fabrikantencore 2.38.2 → 2.38.3

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.
@@ -207,6 +207,9 @@ class FabTextureConfiguratorComponent {
207
207
  ShowSticker(stone, option) {
208
208
  return this.GetSticker(stone, option) != "";
209
209
  }
210
+ ShowStickerSecond(stone, option) {
211
+ return this.GetStickerSecond(stone, option) != "";
212
+ }
210
213
  GetSticker(stone, option) {
211
214
  var steen = stone.GetStoneFormaatObject(option);
212
215
  var name = steen?.name + "";
@@ -218,6 +221,17 @@ class FabTextureConfiguratorComponent {
218
221
  return "";
219
222
  }
220
223
  }
224
+ GetStickerSecond(stone, option) {
225
+ var steen = stone.GetStoneFormaatObjectSecond(option);
226
+ var name = steen?.name + "";
227
+ if (this.IsAnders(name)) {
228
+ var type = name.substring(name.indexOf('(') + 1).replace(")", "");
229
+ return this.TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.CustomItem, undefined, type);
230
+ }
231
+ else {
232
+ return "";
233
+ }
234
+ }
221
235
  GetSelectedStones() {
222
236
  var stones = new Array();
223
237
  for (var i = 0; i < this.StoneRowObjects.length; i++) {
@@ -732,12 +746,12 @@ class FabTextureConfiguratorComponent {
732
746
  return false;
733
747
  }
734
748
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FabTextureConfiguratorComponent, deps: [{ token: i1.MobileService }, { token: i2.FabrikantenService }, { token: i3.TranslateService }, { token: i4.ActivatedRoute }, { token: i5.MatLegacyDialog }, { token: i6.TextureApiClient }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
735
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FabTextureConfiguratorComponent, selector: "app-fab-texture-configurator", ngImport: i0, template: "<div *ngIf=\"IsLoading()\" class=\"loader\">\r\n <mat-card class=\"loader-card\">\r\n <mat-card-content>\r\n <mat-spinner class=\"loader-spinner\" [diameter]=\"80\"></mat-spinner>\r\n </mat-card-content>\r\n <mat-card-subtitle class=\"loader-subtitle\" *ngIf=\"!FabrikantenService.IsStartingDownload()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ProductsLoading) }}\r\n </mat-card-subtitle>\r\n </mat-card>\r\n</div>\r\n\r\n<div *ngIf=\"!IsLoading()\" style=\"display: flex;\">\r\n <div style=\"flex:auto;\"></div>\r\n <div class=\"center-block\">\r\n <ng-container class=\"table-container\" *ngIf=\"!this.SingleStoneMode\">\r\n <table class=\"main-table\">\r\n <tr class=\"main-table-top-row\">\r\n <td class=\"main-table-top-row-first main-table-top-row-td\"></td>\r\n <ng-container *ngFor=\"let option of GetFormaat()\">\r\n <td class=\"main-table-top-row-other main-table-top-row-td\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, option.id) }}\r\n </td>\r\n </ng-container>\r\n </tr>\r\n <ng-container *ngFor=\"let stone of StoneRowObjects\">\r\n <tr class=\"main-table-row\">\r\n <td class=\"main-table-row-td main-table-row-td-first\">\r\n <div>\r\n <div class=\"main-table-row-td-name\">\r\n {{ stone.name }}\r\n </div>\r\n </div>\r\n </td>\r\n <ng-container *ngFor=\"let option of GetFormaat()\">\r\n <td class=\"main-table-row-td main-table-row-td-item\">\r\n <ng-container *ngIf=\"stone.HasStone(option)\">\r\n <div style=\"position: relative;\">\r\n <div class=\"stone-tile\" (click)=\"stone.Select(option)\" [class.selected]=\"stone.IsSelected(option)\" [class.not-selectable]=\"!stone.CanSelectStone(option)\">\r\n <div class=\"kern-div\" *ngIf=\"ShowKern(stone, option)\">{{ GetKern() }}</div>\r\n <div class=\"sticker-div\" *ngIf=\"ShowSticker(stone, option)\">{{ GetSticker(stone, option) }}</div>\r\n <img [src]=\"stone.GetImage(option)\" />\r\n </div>\r\n <div class=\"mix-block\" *ngIf=\"GetSelectedStoneObjects().length > 1 && stone.IsSelected(option)\">\r\n <ng-container *ngIf=\"!IsTextureMix25()\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n mix %\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"1\" max=\"100\" [(ngModel)]=\"stone.GetStone(option).mixRatio\">\r\n </mat-form-field>\r\n </ng-container>\r\n <ng-container *ngIf=\"IsTextureMix25()\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n mix %\r\n </mat-label>\r\n <ng-container *ngIf=\"stone.GetStoneFormaatObject(option) as formaat\">\r\n <mat-select [value]=\"formaat.mixRatio\"\r\n (selectionChange)=\"UpdateRatios(stone, option, $event.value)\">\r\n <mat-option [value]=\"25\">25%</mat-option>\r\n <mat-option *ngIf=\"Disable50()\" [value]=\"50\">50%</mat-option>\r\n <mat-option *ngIf=\"Disable75()\" [value]=\"75\">75%</mat-option>\r\n </mat-select>\r\n </ng-container>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"stone.IsDouvleAV(option)\" class=\"lsws-container\">\r\n <div class=\"lsws-item\" matTooltipClass=\"filter-tooltip\" matTooltip=\"{{ GetLSTooltip() }}\">\r\n <div class=\"lsws-item-text\">LS</div>\r\n <mat-icon>info</mat-icon>\r\n </div>\r\n <div class=\"lsws-item\">\r\n <mat-slide-toggle [(ngModel)]=\"stone.GetStoneFormaatObject(option).selecteddouble\" [disabled]=\"stone.DisableToggle()\"></mat-slide-toggle>\r\n </div>\r\n <div class=\"lsws-item\" matTooltipClass=\"filter-tooltip\" matTooltip=\"{{ GetWSTooltip() }}\">\r\n <div class=\"lsws-item-text\">WS</div>\r\n <mat-icon>info</mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </table>\r\n </ng-container>\r\n\r\n\r\n <div class=\"texture-container\" [class.texture-container-margin]=\"this.SingleStoneMode\">\r\n <div class=\"texture-container-fly\">\r\n <div class=\"displayflex\">\r\n <div class=\"component-block first-row\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Verband) }}\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"SelectedVerbandId\">\r\n <mat-select-trigger>\r\n <ng-container *ngIf=\"SelectedVerbandId as id\">\r\n <ng-container *ngIf=\"GetVerbandById(id) as v\">\r\n <span class=\"select-trigger-content\">\r\n <span class=\"filter-option-image-mini-div\" *ngIf=\"v.imagePath\">\r\n <img [src]=\"GetImagePathProduct(v)\" class=\"filter-option-image\" alt=\"\" />\r\n </span>\r\n <span class=\"select-trigger-content-text\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Product, TranslationSubCategory.Name, v.id) }}\r\n </span>\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select-trigger>\r\n\r\n <ng-container *ngFor=\"let verband of GetVerbanden()\">\r\n <mat-option [value]=\"verband.id\" class=\"select-mat-option\">\r\n <ng-container *ngIf=\"verband.imagePath != null && verband.imagePath != ''\">\r\n <div class=\"filter-option-image-mini-div\">\r\n <img src=\"{{ GetImagePathProduct(verband) }}\" class=\"filter-option-image\" />\r\n </div>\r\n </ng-container>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Product, TranslationSubCategory.Name, verband.id) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"component-block first-row\">\r\n <ng-container *ngIf=\"GetVoeg() != null\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Voeg) }}\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"SelectedVoegId\">\r\n <mat-select-trigger>\r\n <ng-container *ngIf=\"SelectedVoegId as id\">\r\n <ng-container *ngIf=\"GetVoegById(id) as v\">\r\n <span class=\"select-trigger-content\">\r\n <span class=\"filter-option-image-mini-div\" *ngIf=\"v.imagePath\">\r\n <img [src]=\"GetImagePathProduct(v)\" class=\"filter-option-image\" alt=\"\" />\r\n </span>\r\n <span class=\"select-trigger-content-text\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, v.id) }}\r\n </span>\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select-trigger>\r\n\r\n <ng-container *ngFor=\"let voeg of GetVoeg().filter.options\">\r\n <mat-option [value]=\"voeg.id\" class=\"select-mat-option\">\r\n <ng-container *ngIf=\"voeg.imagePath != null && voeg.imagePath != ''\">\r\n <div class=\"filter-option-image-mini-div\">\r\n <img src=\"{{ GetImagePath(voeg) }}\" class=\"filter-option-image\" />\r\n </div>\r\n </ng-container>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, voeg.id) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"component-block\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Stootvoeg) }}\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"{{ StootvoegMin }}\" max=\"{{ StootvoegMax }}\" [(ngModel)]=\"Stootvoeg\">\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"component-block\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Lintvoeg) }}\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"{{ LintvoegMin }}\" max=\"{{ LintvoegMax }}\" [(ngModel)]=\"Lintvoeg\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"slider-block\" *ngIf=\"!HiRes\">\r\n <div class=\"slider-block-name\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.AantalStenen) }}\r\n </div>\r\n <div class=\"slider-block-slider\">\r\n <mat-slider min=\"100\" max=\"2000\" step=\"50\" showTickMarks discrete style=\"width: 100%;\">\r\n <input matSliderThumb [(ngModel)]=\"AantalStenen\">\r\n </mat-slider>\r\n </div>\r\n <div class=\"slider-block-amount\">\r\n {{ AantalStenen }}\r\n </div>\r\n </div>\r\n\r\n <div class=\"high-res-checkbox-div\">\r\n <mat-checkbox [(ngModel)]=\"HiRes\" class=\"high-res-checkbox\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.HogeResolutie) }}\r\n </mat-checkbox>\r\n </div>\r\n\r\n <div class=\"high-res-checkbox-div\">\r\n <mat-checkbox [(ngModel)]=\"Shade\" class=\"high-res-checkbox\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Shaduw) }}\r\n </mat-checkbox>\r\n </div>\r\n\r\n <div class=\"buttonrow\">\r\n <button mat-raised-button (click)=\"SingleStoneMode = false;\" class=\"link textuur-knop\" *ngIf=\"SingleStoneMode\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Mix) }}\r\n </button>\r\n\r\n <button mat-raised-button (click)=\"TextuurGenereren()\" class=\"link textuur-knop\" [disabled]=\"GenerateDisabled()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.TextuurGenereren) }}\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"IsLoadingTextures()\" class=\"texture-loader\">\r\n <mat-spinner class=\"loader-spinner\" [diameter]=\"80\"></mat-spinner>\r\n </div>\r\n\r\n <div *ngIf=\"ShowTexture()\">\r\n <div class=\"image-row\">\r\n <div>\r\n <ng-container *ngIf=\"HasToFillForm()\">\r\n <div (click)=\"OpenForm()\">\r\n <img class=\"image image-patroon\" [src]=\"GetPatroonDownloadURL()\" />\r\n </div>\r\n <div>\r\n <button mat-raised-button class=\"link textuur-knop\" (click)=\"OpenForm()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadTexture) }}\r\n </button>\r\n </div>\r\n <div>\r\n <button mat-raised-button class=\"link textuur-knop\" (click)=\"OpenForm()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadBump) }}\r\n </button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!HasToFillForm()\">\r\n <div>\r\n <a [href]=\"GetPatroonDownloadURL()\" target=\"_blank\">\r\n <img class=\"image image-patroon\" [src]=\"GetPatroonDownloadURL()\" />\r\n </a>\r\n </div>\r\n <div>\r\n <a [href]=\"GetPatroonDownloadURLDownload()\" target=\"_blank\">\r\n <button mat-raised-button class=\"link textuur-knop\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadTexture) }}\r\n </button>\r\n </a>\r\n </div>\r\n <div>\r\n <a [href]=\"GetBumpDownloadURL()\" target=\"_blank\">\r\n <button mat-raised-button class=\"link textuur-knop\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadBump) }}\r\n </button>\r\n </a>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div style=\"flex:auto;\"></div>\r\n</div>\r\n", styles: ["app-fab-texture-configurator .mix-block .mat-form-field-wrapper{padding-bottom:0}app-fab-texture-configurator .mix-block .mat-form-field-underline{bottom:0}app-fab-texture-configurator .center-block{margin:auto;display:flex}app-fab-texture-configurator .texture-container{padding:30px;width:300px}app-fab-texture-configurator .texture-loader{padding-top:50px}app-fab-texture-configurator .texture-container-margin{margin:auto}app-fab-texture-configurator .texture-container-fly{position:fixed;width:300px}app-fab-texture-configurator .mix-block{width:125px;margin-left:auto;margin-right:auto;position:absolute;bottom:45px;left:15px;background:#fff}app-fab-texture-configurator .mix-block mat-form-field-wrapper{padding-bottom:0}app-fab-texture-configurator .kern-div{position:absolute;top:3px;left:3px;background-color:#f6d18d;border-radius:12px;font-size:12px;padding:3px 10px}app-fab-texture-configurator .sticker-div{position:absolute;top:3px;left:3px;background-color:#f6d18d;border-radius:12px;font-size:12px;padding:3px 10px}app-fab-texture-configurator .loader-card{margin:200px auto auto;width:300px}app-fab-texture-configurator .loader-subtitle{text-align:center}app-fab-texture-configurator .loader-spinner{margin:auto}app-fab-texture-configurator .stone-tile{cursor:pointer;border:2px solid #FFF;height:150px;width:150px;position:relative}app-fab-texture-configurator .stone-tile img{height:150px;width:150px}app-fab-texture-configurator .selected{border:2px solid #F00}app-fab-texture-configurator .not-selectable{cursor:default!important;opacity:.2}app-fab-texture-configurator .textuur-knop{width:100%}app-fab-texture-configurator .high-res-checkbox-div{padding-bottom:20px}app-fab-texture-configurator .image-patroon{width:100%;cursor:pointer}app-fab-texture-configurator .image-row{padding-top:30px}app-fab-texture-configurator .mat-form-field{width:100%}app-fab-texture-configurator .lsws-container{display:flex;position:absolute;bottom:4px;width:100%;background-color:#fff}app-fab-texture-configurator .lsws-item{padding:5px;display:flex}app-fab-texture-configurator .link{margin-bottom:10px}app-fab-texture-configurator .slider-block{display:flex}app-fab-texture-configurator .slider-block-name{line-height:48px}app-fab-texture-configurator .slider-block-amount{line-height:48px;width:40px;text-align:center}app-fab-texture-configurator .slider-block-slider{flex:auto;padding-right:20px;padding-left:10px}.filter-option-image-mini-div{max-height:40px;padding-right:4px}.filter-option-image-mini-div .filter-option-image{width:40px;height:40px}.select-mat-option{height:4em!important}.select-mat-option .mat-option-text:first-letter{text-transform:capitalize}.select-mat-option .mat-option-text{display:flex}.mat-slide-toggle.mat-checked .mat-slide-toggle-bar{background-color:#0000008a}.mat-slide-toggle.mat-checked .mat-slide-toggle-thumb{background-color:#000}.mat-select-value{padding-top:35px}.select-trigger-content-text{position:relative;bottom:10px}\n"], dependencies: [{ kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i8.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "directive", type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i10.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i10.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i11.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i12.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i13.MatSlider, selector: "mat-slider", inputs: ["color", "disableRipple", "disabled", "discrete", "showTickMarks", "min", "max", "step", "displayWith"], exportAs: ["matSlider"] }, { kind: "directive", type: i13.MatSliderThumb, selector: "input[matSliderThumb]", inputs: ["value"], outputs: ["valueChange", "dragStart", "dragEnd"], exportAs: ["matSliderThumb"] }, { kind: "component", type: i14.MatLegacyCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "directive", type: i14.MatLegacyCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { kind: "directive", type: i14.MatLegacyCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i16.MatLegacyCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i17.MatLegacySlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i18.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i19.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "directive", type: i19.MatLegacySelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i20.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }], encapsulation: i0.ViewEncapsulation.None });
749
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: FabTextureConfiguratorComponent, selector: "app-fab-texture-configurator", ngImport: i0, template: "<div *ngIf=\"IsLoading()\" class=\"loader\">\r\n <mat-card class=\"loader-card\">\r\n <mat-card-content>\r\n <mat-spinner class=\"loader-spinner\" [diameter]=\"80\"></mat-spinner>\r\n </mat-card-content>\r\n <mat-card-subtitle class=\"loader-subtitle\" *ngIf=\"!FabrikantenService.IsStartingDownload()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ProductsLoading) }}\r\n </mat-card-subtitle>\r\n </mat-card>\r\n</div>\r\n\r\n<div *ngIf=\"!IsLoading()\" style=\"display: flex;\">\r\n <div style=\"flex:auto;\"></div>\r\n <div class=\"center-block\">\r\n <ng-container class=\"table-container\" *ngIf=\"!this.SingleStoneMode\">\r\n <table class=\"main-table\">\r\n <tr class=\"main-table-top-row\">\r\n <td class=\"main-table-top-row-first main-table-top-row-td\"></td>\r\n <ng-container *ngFor=\"let option of GetFormaat()\">\r\n <td class=\"main-table-top-row-other main-table-top-row-td\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, option.id) }}\r\n </td>\r\n </ng-container>\r\n </tr>\r\n <ng-container *ngFor=\"let stone of StoneRowObjects\">\r\n <tr class=\"main-table-row\">\r\n <td class=\"main-table-row-td main-table-row-td-first\">\r\n <div>\r\n <div class=\"main-table-row-td-name\">\r\n {{ stone.name }}\r\n </div>\r\n </div>\r\n </td>\r\n <ng-container *ngFor=\"let option of GetFormaat()\">\r\n <td class=\"main-table-row-td main-table-row-td-item\">\r\n <ng-container *ngIf=\"stone.HasStone(option)\">\r\n <div style=\"position: relative;\">\r\n <div class=\"stone-tile\" (click)=\"stone.Select(option)\" [class.selected]=\"stone.IsSelected(option)\" [class.not-selectable]=\"!stone.CanSelectStone(option)\">\r\n <div class=\"kern-div\" *ngIf=\"ShowKern(stone, option)\">{{ GetKern() }}</div>\r\n <div class=\"sticker-div\" *ngIf=\"ShowSticker(stone, option)\">{{ GetSticker(stone, option) }}</div>\r\n <img [src]=\"stone.GetImage(option)\" />\r\n </div>\r\n <div class=\"mix-block\" *ngIf=\"GetSelectedStoneObjects().length > 1 && stone.IsSelected(option)\">\r\n <ng-container *ngIf=\"!IsTextureMix25()\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n mix %\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"1\" max=\"100\" [(ngModel)]=\"stone.GetStone(option).mixRatio\">\r\n </mat-form-field>\r\n </ng-container>\r\n <ng-container *ngIf=\"IsTextureMix25()\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n mix %\r\n </mat-label>\r\n <ng-container *ngIf=\"stone.GetStoneFormaatObject(option) as formaat\">\r\n <mat-select [value]=\"formaat.mixRatio\"\r\n (selectionChange)=\"UpdateRatios(stone, option, $event.value)\">\r\n <mat-option [value]=\"25\">25%</mat-option>\r\n <mat-option *ngIf=\"Disable50()\" [value]=\"50\">50%</mat-option>\r\n <mat-option *ngIf=\"Disable75()\" [value]=\"75\">75%</mat-option>\r\n </mat-select>\r\n </ng-container>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"stone.IsDouvleAV(option)\" class=\"lsws-container\">\r\n <div class=\"lsws-item\" matTooltipClass=\"filter-tooltip\" matTooltip=\"{{ GetLSTooltip() }}\">\r\n <div class=\"lsws-item-text\">LS</div>\r\n <mat-icon>info</mat-icon>\r\n </div>\r\n <div class=\"lsws-item\">\r\n <mat-slide-toggle [(ngModel)]=\"stone.GetStoneFormaatObject(option).selecteddouble\" [disabled]=\"stone.DisableToggle()\"></mat-slide-toggle>\r\n </div>\r\n <div class=\"lsws-item\" matTooltipClass=\"filter-tooltip\" matTooltip=\"{{ GetWSTooltip() }}\">\r\n <div class=\"lsws-item-text\">WS</div>\r\n <mat-icon>info</mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"stone.HasSecondStone(option)\">\r\n <div style=\"position: relative;\">\r\n <div class=\"stone-tile\" (click)=\"stone.SelectSecond(option)\" [class.selected]=\"stone.IsSelectedSecond(option)\" [class.not-selectable]=\"!stone.CanSelectStoneSecond(option)\">\r\n <div class=\"kern-div\" *ngIf=\"ShowKern(stone, option)\">{{ GetKern() }}</div>\r\n <div class=\"sticker-div\" *ngIf=\"ShowStickerSecond(stone, option)\">{{ GetStickerSecond(stone, option) }}</div>\r\n <img [src]=\"stone.GetImageSecond(option)\" />\r\n </div>\r\n \r\n <!--<div *ngIf=\"stone.IsDouvleAV(option)\" class=\"lsws-container\">\r\n <div class=\"lsws-item\" matTooltipClass=\"filter-tooltip\" matTooltip=\"{{ GetLSTooltip() }}\">\r\n <div class=\"lsws-item-text\">LS</div>\r\n <mat-icon>info</mat-icon>\r\n </div>\r\n <div class=\"lsws-item\">\r\n <mat-slide-toggle [(ngModel)]=\"stone.GetStoneFormaatObject(option).selecteddouble\" [disabled]=\"stone.DisableToggle()\"></mat-slide-toggle>\r\n </div>\r\n <div class=\"lsws-item\" matTooltipClass=\"filter-tooltip\" matTooltip=\"{{ GetWSTooltip() }}\">\r\n <div class=\"lsws-item-text\">WS</div>\r\n <mat-icon>info</mat-icon>\r\n </div>\r\n </div>-->\r\n </div>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </table>\r\n </ng-container>\r\n\r\n\r\n <div class=\"texture-container\" [class.texture-container-margin]=\"this.SingleStoneMode\">\r\n <div class=\"texture-container-fly\">\r\n <div class=\"displayflex\">\r\n <div class=\"component-block first-row\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Verband) }}\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"SelectedVerbandId\">\r\n <mat-select-trigger>\r\n <ng-container *ngIf=\"SelectedVerbandId as id\">\r\n <ng-container *ngIf=\"GetVerbandById(id) as v\">\r\n <span class=\"select-trigger-content\">\r\n <span class=\"filter-option-image-mini-div\" *ngIf=\"v.imagePath\">\r\n <img [src]=\"GetImagePathProduct(v)\" class=\"filter-option-image\" alt=\"\" />\r\n </span>\r\n <span class=\"select-trigger-content-text\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Product, TranslationSubCategory.Name, v.id) }}\r\n </span>\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select-trigger>\r\n\r\n <ng-container *ngFor=\"let verband of GetVerbanden()\">\r\n <mat-option [value]=\"verband.id\" class=\"select-mat-option\">\r\n <ng-container *ngIf=\"verband.imagePath != null && verband.imagePath != ''\">\r\n <div class=\"filter-option-image-mini-div\">\r\n <img src=\"{{ GetImagePathProduct(verband) }}\" class=\"filter-option-image\" />\r\n </div>\r\n </ng-container>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Product, TranslationSubCategory.Name, verband.id) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"component-block first-row\">\r\n <ng-container *ngIf=\"GetVoeg() != null\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Voeg) }}\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"SelectedVoegId\">\r\n <mat-select-trigger>\r\n <ng-container *ngIf=\"SelectedVoegId as id\">\r\n <ng-container *ngIf=\"GetVoegById(id) as v\">\r\n <span class=\"select-trigger-content\">\r\n <span class=\"filter-option-image-mini-div\" *ngIf=\"v.imagePath\">\r\n <img [src]=\"GetImagePathProduct(v)\" class=\"filter-option-image\" alt=\"\" />\r\n </span>\r\n <span class=\"select-trigger-content-text\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, v.id) }}\r\n </span>\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select-trigger>\r\n\r\n <ng-container *ngFor=\"let voeg of GetVoeg().filter.options\">\r\n <mat-option [value]=\"voeg.id\" class=\"select-mat-option\">\r\n <ng-container *ngIf=\"voeg.imagePath != null && voeg.imagePath != ''\">\r\n <div class=\"filter-option-image-mini-div\">\r\n <img src=\"{{ GetImagePath(voeg) }}\" class=\"filter-option-image\" />\r\n </div>\r\n </ng-container>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, voeg.id) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"component-block\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Stootvoeg) }}\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"{{ StootvoegMin }}\" max=\"{{ StootvoegMax }}\" [(ngModel)]=\"Stootvoeg\">\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"component-block\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Lintvoeg) }}\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"{{ LintvoegMin }}\" max=\"{{ LintvoegMax }}\" [(ngModel)]=\"Lintvoeg\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"slider-block\" *ngIf=\"!HiRes\">\r\n <div class=\"slider-block-name\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.AantalStenen) }}\r\n </div>\r\n <div class=\"slider-block-slider\">\r\n <mat-slider min=\"100\" max=\"2000\" step=\"50\" showTickMarks discrete style=\"width: 100%;\">\r\n <input matSliderThumb [(ngModel)]=\"AantalStenen\">\r\n </mat-slider>\r\n </div>\r\n <div class=\"slider-block-amount\">\r\n {{ AantalStenen }}\r\n </div>\r\n </div>\r\n\r\n <div class=\"high-res-checkbox-div\">\r\n <mat-checkbox [(ngModel)]=\"HiRes\" class=\"high-res-checkbox\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.HogeResolutie) }}\r\n </mat-checkbox>\r\n </div>\r\n\r\n <div class=\"high-res-checkbox-div\">\r\n <mat-checkbox [(ngModel)]=\"Shade\" class=\"high-res-checkbox\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Shaduw) }}\r\n </mat-checkbox>\r\n </div>\r\n\r\n <div class=\"buttonrow\">\r\n <button mat-raised-button (click)=\"SingleStoneMode = false;\" class=\"link textuur-knop\" *ngIf=\"SingleStoneMode\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Mix) }}\r\n </button>\r\n\r\n <button mat-raised-button (click)=\"TextuurGenereren()\" class=\"link textuur-knop\" [disabled]=\"GenerateDisabled()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.TextuurGenereren) }}\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"IsLoadingTextures()\" class=\"texture-loader\">\r\n <mat-spinner class=\"loader-spinner\" [diameter]=\"80\"></mat-spinner>\r\n </div>\r\n\r\n <div *ngIf=\"ShowTexture()\">\r\n <div class=\"image-row\">\r\n <div>\r\n <ng-container *ngIf=\"HasToFillForm()\">\r\n <div (click)=\"OpenForm()\">\r\n <img class=\"image image-patroon\" [src]=\"GetPatroonDownloadURL()\" />\r\n </div>\r\n <div>\r\n <button mat-raised-button class=\"link textuur-knop\" (click)=\"OpenForm()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadTexture) }}\r\n </button>\r\n </div>\r\n <div>\r\n <button mat-raised-button class=\"link textuur-knop\" (click)=\"OpenForm()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadBump) }}\r\n </button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!HasToFillForm()\">\r\n <div>\r\n <a [href]=\"GetPatroonDownloadURL()\" target=\"_blank\">\r\n <img class=\"image image-patroon\" [src]=\"GetPatroonDownloadURL()\" />\r\n </a>\r\n </div>\r\n <div>\r\n <a [href]=\"GetPatroonDownloadURLDownload()\" target=\"_blank\">\r\n <button mat-raised-button class=\"link textuur-knop\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadTexture) }}\r\n </button>\r\n </a>\r\n </div>\r\n <div>\r\n <a [href]=\"GetBumpDownloadURL()\" target=\"_blank\">\r\n <button mat-raised-button class=\"link textuur-knop\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadBump) }}\r\n </button>\r\n </a>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div style=\"flex:auto;\"></div>\r\n</div>\r\n", styles: ["app-fab-texture-configurator .mix-block .mat-form-field-wrapper{padding-bottom:0}app-fab-texture-configurator .mix-block .mat-form-field-underline{bottom:0}app-fab-texture-configurator .center-block{margin:auto;display:flex}app-fab-texture-configurator .texture-container{padding:30px;width:300px}app-fab-texture-configurator .texture-loader{padding-top:50px}app-fab-texture-configurator .texture-container-margin{margin:auto}app-fab-texture-configurator .texture-container-fly{position:fixed;width:300px}app-fab-texture-configurator .mix-block{width:125px;margin-left:auto;margin-right:auto;position:absolute;bottom:45px;left:15px;background:#fff}app-fab-texture-configurator .mix-block mat-form-field-wrapper{padding-bottom:0}app-fab-texture-configurator .kern-div{position:absolute;top:3px;left:3px;background-color:#f6d18d;border-radius:12px;font-size:12px;padding:3px 10px}app-fab-texture-configurator .sticker-div{position:absolute;top:3px;left:3px;background-color:#f6d18d;border-radius:12px;font-size:12px;padding:3px 10px}app-fab-texture-configurator .loader-card{margin:200px auto auto;width:300px}app-fab-texture-configurator .loader-subtitle{text-align:center}app-fab-texture-configurator .loader-spinner{margin:auto}app-fab-texture-configurator .stone-tile{cursor:pointer;border:2px solid #FFF;height:150px;width:150px;position:relative}app-fab-texture-configurator .stone-tile img{height:150px;width:150px}app-fab-texture-configurator .selected{border:2px solid #F00}app-fab-texture-configurator .not-selectable{cursor:default!important;opacity:.2}app-fab-texture-configurator .textuur-knop{width:100%}app-fab-texture-configurator .high-res-checkbox-div{padding-bottom:20px}app-fab-texture-configurator .image-patroon{width:100%;cursor:pointer}app-fab-texture-configurator .image-row{padding-top:30px}app-fab-texture-configurator .mat-form-field{width:100%}app-fab-texture-configurator .lsws-container{display:flex;position:absolute;bottom:4px;width:100%;background-color:#fff}app-fab-texture-configurator .lsws-item{padding:5px;display:flex}app-fab-texture-configurator .link{margin-bottom:10px}app-fab-texture-configurator .slider-block{display:flex}app-fab-texture-configurator .slider-block-name{line-height:48px}app-fab-texture-configurator .slider-block-amount{line-height:48px;width:40px;text-align:center}app-fab-texture-configurator .slider-block-slider{flex:auto;padding-right:20px;padding-left:10px}.filter-option-image-mini-div{max-height:40px;padding-right:4px}.filter-option-image-mini-div .filter-option-image{width:40px;height:40px}.select-mat-option{height:4em!important}.select-mat-option .mat-option-text:first-letter{text-transform:capitalize}.select-mat-option .mat-option-text{display:flex}.mat-slide-toggle.mat-checked .mat-slide-toggle-bar{background-color:#0000008a}.mat-slide-toggle.mat-checked .mat-slide-toggle-thumb{background-color:#000}.mat-select-value{padding-top:35px}.select-trigger-content-text{position:relative;bottom:10px}\n"], dependencies: [{ kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i8.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLegacyLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "directive", type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i10.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i10.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i11.MatLegacyTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "component", type: i12.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i13.MatSlider, selector: "mat-slider", inputs: ["color", "disableRipple", "disabled", "discrete", "showTickMarks", "min", "max", "step", "displayWith"], exportAs: ["matSlider"] }, { kind: "directive", type: i13.MatSliderThumb, selector: "input[matSliderThumb]", inputs: ["value"], outputs: ["valueChange", "dragStart", "dragEnd"], exportAs: ["matSliderThumb"] }, { kind: "component", type: i14.MatLegacyCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "directive", type: i14.MatLegacyCardContent, selector: "mat-card-content, [mat-card-content], [matCardContent]" }, { kind: "directive", type: i14.MatLegacyCardSubtitle, selector: "mat-card-subtitle, [mat-card-subtitle], [matCardSubtitle]" }, { kind: "component", type: i15.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i16.MatLegacyCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i17.MatLegacySlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i18.MatLegacyProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i19.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "directive", type: i19.MatLegacySelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i20.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }], encapsulation: i0.ViewEncapsulation.None });
736
750
  }
737
751
  export { FabTextureConfiguratorComponent };
738
752
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: FabTextureConfiguratorComponent, decorators: [{
739
753
  type: Component,
740
- args: [{ selector: 'app-fab-texture-configurator', encapsulation: ViewEncapsulation.None, template: "<div *ngIf=\"IsLoading()\" class=\"loader\">\r\n <mat-card class=\"loader-card\">\r\n <mat-card-content>\r\n <mat-spinner class=\"loader-spinner\" [diameter]=\"80\"></mat-spinner>\r\n </mat-card-content>\r\n <mat-card-subtitle class=\"loader-subtitle\" *ngIf=\"!FabrikantenService.IsStartingDownload()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ProductsLoading) }}\r\n </mat-card-subtitle>\r\n </mat-card>\r\n</div>\r\n\r\n<div *ngIf=\"!IsLoading()\" style=\"display: flex;\">\r\n <div style=\"flex:auto;\"></div>\r\n <div class=\"center-block\">\r\n <ng-container class=\"table-container\" *ngIf=\"!this.SingleStoneMode\">\r\n <table class=\"main-table\">\r\n <tr class=\"main-table-top-row\">\r\n <td class=\"main-table-top-row-first main-table-top-row-td\"></td>\r\n <ng-container *ngFor=\"let option of GetFormaat()\">\r\n <td class=\"main-table-top-row-other main-table-top-row-td\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, option.id) }}\r\n </td>\r\n </ng-container>\r\n </tr>\r\n <ng-container *ngFor=\"let stone of StoneRowObjects\">\r\n <tr class=\"main-table-row\">\r\n <td class=\"main-table-row-td main-table-row-td-first\">\r\n <div>\r\n <div class=\"main-table-row-td-name\">\r\n {{ stone.name }}\r\n </div>\r\n </div>\r\n </td>\r\n <ng-container *ngFor=\"let option of GetFormaat()\">\r\n <td class=\"main-table-row-td main-table-row-td-item\">\r\n <ng-container *ngIf=\"stone.HasStone(option)\">\r\n <div style=\"position: relative;\">\r\n <div class=\"stone-tile\" (click)=\"stone.Select(option)\" [class.selected]=\"stone.IsSelected(option)\" [class.not-selectable]=\"!stone.CanSelectStone(option)\">\r\n <div class=\"kern-div\" *ngIf=\"ShowKern(stone, option)\">{{ GetKern() }}</div>\r\n <div class=\"sticker-div\" *ngIf=\"ShowSticker(stone, option)\">{{ GetSticker(stone, option) }}</div>\r\n <img [src]=\"stone.GetImage(option)\" />\r\n </div>\r\n <div class=\"mix-block\" *ngIf=\"GetSelectedStoneObjects().length > 1 && stone.IsSelected(option)\">\r\n <ng-container *ngIf=\"!IsTextureMix25()\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n mix %\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"1\" max=\"100\" [(ngModel)]=\"stone.GetStone(option).mixRatio\">\r\n </mat-form-field>\r\n </ng-container>\r\n <ng-container *ngIf=\"IsTextureMix25()\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n mix %\r\n </mat-label>\r\n <ng-container *ngIf=\"stone.GetStoneFormaatObject(option) as formaat\">\r\n <mat-select [value]=\"formaat.mixRatio\"\r\n (selectionChange)=\"UpdateRatios(stone, option, $event.value)\">\r\n <mat-option [value]=\"25\">25%</mat-option>\r\n <mat-option *ngIf=\"Disable50()\" [value]=\"50\">50%</mat-option>\r\n <mat-option *ngIf=\"Disable75()\" [value]=\"75\">75%</mat-option>\r\n </mat-select>\r\n </ng-container>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"stone.IsDouvleAV(option)\" class=\"lsws-container\">\r\n <div class=\"lsws-item\" matTooltipClass=\"filter-tooltip\" matTooltip=\"{{ GetLSTooltip() }}\">\r\n <div class=\"lsws-item-text\">LS</div>\r\n <mat-icon>info</mat-icon>\r\n </div>\r\n <div class=\"lsws-item\">\r\n <mat-slide-toggle [(ngModel)]=\"stone.GetStoneFormaatObject(option).selecteddouble\" [disabled]=\"stone.DisableToggle()\"></mat-slide-toggle>\r\n </div>\r\n <div class=\"lsws-item\" matTooltipClass=\"filter-tooltip\" matTooltip=\"{{ GetWSTooltip() }}\">\r\n <div class=\"lsws-item-text\">WS</div>\r\n <mat-icon>info</mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </table>\r\n </ng-container>\r\n\r\n\r\n <div class=\"texture-container\" [class.texture-container-margin]=\"this.SingleStoneMode\">\r\n <div class=\"texture-container-fly\">\r\n <div class=\"displayflex\">\r\n <div class=\"component-block first-row\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Verband) }}\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"SelectedVerbandId\">\r\n <mat-select-trigger>\r\n <ng-container *ngIf=\"SelectedVerbandId as id\">\r\n <ng-container *ngIf=\"GetVerbandById(id) as v\">\r\n <span class=\"select-trigger-content\">\r\n <span class=\"filter-option-image-mini-div\" *ngIf=\"v.imagePath\">\r\n <img [src]=\"GetImagePathProduct(v)\" class=\"filter-option-image\" alt=\"\" />\r\n </span>\r\n <span class=\"select-trigger-content-text\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Product, TranslationSubCategory.Name, v.id) }}\r\n </span>\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select-trigger>\r\n\r\n <ng-container *ngFor=\"let verband of GetVerbanden()\">\r\n <mat-option [value]=\"verband.id\" class=\"select-mat-option\">\r\n <ng-container *ngIf=\"verband.imagePath != null && verband.imagePath != ''\">\r\n <div class=\"filter-option-image-mini-div\">\r\n <img src=\"{{ GetImagePathProduct(verband) }}\" class=\"filter-option-image\" />\r\n </div>\r\n </ng-container>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Product, TranslationSubCategory.Name, verband.id) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"component-block first-row\">\r\n <ng-container *ngIf=\"GetVoeg() != null\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Voeg) }}\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"SelectedVoegId\">\r\n <mat-select-trigger>\r\n <ng-container *ngIf=\"SelectedVoegId as id\">\r\n <ng-container *ngIf=\"GetVoegById(id) as v\">\r\n <span class=\"select-trigger-content\">\r\n <span class=\"filter-option-image-mini-div\" *ngIf=\"v.imagePath\">\r\n <img [src]=\"GetImagePathProduct(v)\" class=\"filter-option-image\" alt=\"\" />\r\n </span>\r\n <span class=\"select-trigger-content-text\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, v.id) }}\r\n </span>\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select-trigger>\r\n\r\n <ng-container *ngFor=\"let voeg of GetVoeg().filter.options\">\r\n <mat-option [value]=\"voeg.id\" class=\"select-mat-option\">\r\n <ng-container *ngIf=\"voeg.imagePath != null && voeg.imagePath != ''\">\r\n <div class=\"filter-option-image-mini-div\">\r\n <img src=\"{{ GetImagePath(voeg) }}\" class=\"filter-option-image\" />\r\n </div>\r\n </ng-container>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, voeg.id) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"component-block\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Stootvoeg) }}\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"{{ StootvoegMin }}\" max=\"{{ StootvoegMax }}\" [(ngModel)]=\"Stootvoeg\">\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"component-block\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Lintvoeg) }}\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"{{ LintvoegMin }}\" max=\"{{ LintvoegMax }}\" [(ngModel)]=\"Lintvoeg\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"slider-block\" *ngIf=\"!HiRes\">\r\n <div class=\"slider-block-name\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.AantalStenen) }}\r\n </div>\r\n <div class=\"slider-block-slider\">\r\n <mat-slider min=\"100\" max=\"2000\" step=\"50\" showTickMarks discrete style=\"width: 100%;\">\r\n <input matSliderThumb [(ngModel)]=\"AantalStenen\">\r\n </mat-slider>\r\n </div>\r\n <div class=\"slider-block-amount\">\r\n {{ AantalStenen }}\r\n </div>\r\n </div>\r\n\r\n <div class=\"high-res-checkbox-div\">\r\n <mat-checkbox [(ngModel)]=\"HiRes\" class=\"high-res-checkbox\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.HogeResolutie) }}\r\n </mat-checkbox>\r\n </div>\r\n\r\n <div class=\"high-res-checkbox-div\">\r\n <mat-checkbox [(ngModel)]=\"Shade\" class=\"high-res-checkbox\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Shaduw) }}\r\n </mat-checkbox>\r\n </div>\r\n\r\n <div class=\"buttonrow\">\r\n <button mat-raised-button (click)=\"SingleStoneMode = false;\" class=\"link textuur-knop\" *ngIf=\"SingleStoneMode\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Mix) }}\r\n </button>\r\n\r\n <button mat-raised-button (click)=\"TextuurGenereren()\" class=\"link textuur-knop\" [disabled]=\"GenerateDisabled()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.TextuurGenereren) }}\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"IsLoadingTextures()\" class=\"texture-loader\">\r\n <mat-spinner class=\"loader-spinner\" [diameter]=\"80\"></mat-spinner>\r\n </div>\r\n\r\n <div *ngIf=\"ShowTexture()\">\r\n <div class=\"image-row\">\r\n <div>\r\n <ng-container *ngIf=\"HasToFillForm()\">\r\n <div (click)=\"OpenForm()\">\r\n <img class=\"image image-patroon\" [src]=\"GetPatroonDownloadURL()\" />\r\n </div>\r\n <div>\r\n <button mat-raised-button class=\"link textuur-knop\" (click)=\"OpenForm()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadTexture) }}\r\n </button>\r\n </div>\r\n <div>\r\n <button mat-raised-button class=\"link textuur-knop\" (click)=\"OpenForm()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadBump) }}\r\n </button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!HasToFillForm()\">\r\n <div>\r\n <a [href]=\"GetPatroonDownloadURL()\" target=\"_blank\">\r\n <img class=\"image image-patroon\" [src]=\"GetPatroonDownloadURL()\" />\r\n </a>\r\n </div>\r\n <div>\r\n <a [href]=\"GetPatroonDownloadURLDownload()\" target=\"_blank\">\r\n <button mat-raised-button class=\"link textuur-knop\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadTexture) }}\r\n </button>\r\n </a>\r\n </div>\r\n <div>\r\n <a [href]=\"GetBumpDownloadURL()\" target=\"_blank\">\r\n <button mat-raised-button class=\"link textuur-knop\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadBump) }}\r\n </button>\r\n </a>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div style=\"flex:auto;\"></div>\r\n</div>\r\n", styles: ["app-fab-texture-configurator .mix-block .mat-form-field-wrapper{padding-bottom:0}app-fab-texture-configurator .mix-block .mat-form-field-underline{bottom:0}app-fab-texture-configurator .center-block{margin:auto;display:flex}app-fab-texture-configurator .texture-container{padding:30px;width:300px}app-fab-texture-configurator .texture-loader{padding-top:50px}app-fab-texture-configurator .texture-container-margin{margin:auto}app-fab-texture-configurator .texture-container-fly{position:fixed;width:300px}app-fab-texture-configurator .mix-block{width:125px;margin-left:auto;margin-right:auto;position:absolute;bottom:45px;left:15px;background:#fff}app-fab-texture-configurator .mix-block mat-form-field-wrapper{padding-bottom:0}app-fab-texture-configurator .kern-div{position:absolute;top:3px;left:3px;background-color:#f6d18d;border-radius:12px;font-size:12px;padding:3px 10px}app-fab-texture-configurator .sticker-div{position:absolute;top:3px;left:3px;background-color:#f6d18d;border-radius:12px;font-size:12px;padding:3px 10px}app-fab-texture-configurator .loader-card{margin:200px auto auto;width:300px}app-fab-texture-configurator .loader-subtitle{text-align:center}app-fab-texture-configurator .loader-spinner{margin:auto}app-fab-texture-configurator .stone-tile{cursor:pointer;border:2px solid #FFF;height:150px;width:150px;position:relative}app-fab-texture-configurator .stone-tile img{height:150px;width:150px}app-fab-texture-configurator .selected{border:2px solid #F00}app-fab-texture-configurator .not-selectable{cursor:default!important;opacity:.2}app-fab-texture-configurator .textuur-knop{width:100%}app-fab-texture-configurator .high-res-checkbox-div{padding-bottom:20px}app-fab-texture-configurator .image-patroon{width:100%;cursor:pointer}app-fab-texture-configurator .image-row{padding-top:30px}app-fab-texture-configurator .mat-form-field{width:100%}app-fab-texture-configurator .lsws-container{display:flex;position:absolute;bottom:4px;width:100%;background-color:#fff}app-fab-texture-configurator .lsws-item{padding:5px;display:flex}app-fab-texture-configurator .link{margin-bottom:10px}app-fab-texture-configurator .slider-block{display:flex}app-fab-texture-configurator .slider-block-name{line-height:48px}app-fab-texture-configurator .slider-block-amount{line-height:48px;width:40px;text-align:center}app-fab-texture-configurator .slider-block-slider{flex:auto;padding-right:20px;padding-left:10px}.filter-option-image-mini-div{max-height:40px;padding-right:4px}.filter-option-image-mini-div .filter-option-image{width:40px;height:40px}.select-mat-option{height:4em!important}.select-mat-option .mat-option-text:first-letter{text-transform:capitalize}.select-mat-option .mat-option-text{display:flex}.mat-slide-toggle.mat-checked .mat-slide-toggle-bar{background-color:#0000008a}.mat-slide-toggle.mat-checked .mat-slide-toggle-thumb{background-color:#000}.mat-select-value{padding-top:35px}.select-trigger-content-text{position:relative;bottom:10px}\n"] }]
754
+ args: [{ selector: 'app-fab-texture-configurator', encapsulation: ViewEncapsulation.None, template: "<div *ngIf=\"IsLoading()\" class=\"loader\">\r\n <mat-card class=\"loader-card\">\r\n <mat-card-content>\r\n <mat-spinner class=\"loader-spinner\" [diameter]=\"80\"></mat-spinner>\r\n </mat-card-content>\r\n <mat-card-subtitle class=\"loader-subtitle\" *ngIf=\"!FabrikantenService.IsStartingDownload()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.ProductsLoading) }}\r\n </mat-card-subtitle>\r\n </mat-card>\r\n</div>\r\n\r\n<div *ngIf=\"!IsLoading()\" style=\"display: flex;\">\r\n <div style=\"flex:auto;\"></div>\r\n <div class=\"center-block\">\r\n <ng-container class=\"table-container\" *ngIf=\"!this.SingleStoneMode\">\r\n <table class=\"main-table\">\r\n <tr class=\"main-table-top-row\">\r\n <td class=\"main-table-top-row-first main-table-top-row-td\"></td>\r\n <ng-container *ngFor=\"let option of GetFormaat()\">\r\n <td class=\"main-table-top-row-other main-table-top-row-td\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, option.id) }}\r\n </td>\r\n </ng-container>\r\n </tr>\r\n <ng-container *ngFor=\"let stone of StoneRowObjects\">\r\n <tr class=\"main-table-row\">\r\n <td class=\"main-table-row-td main-table-row-td-first\">\r\n <div>\r\n <div class=\"main-table-row-td-name\">\r\n {{ stone.name }}\r\n </div>\r\n </div>\r\n </td>\r\n <ng-container *ngFor=\"let option of GetFormaat()\">\r\n <td class=\"main-table-row-td main-table-row-td-item\">\r\n <ng-container *ngIf=\"stone.HasStone(option)\">\r\n <div style=\"position: relative;\">\r\n <div class=\"stone-tile\" (click)=\"stone.Select(option)\" [class.selected]=\"stone.IsSelected(option)\" [class.not-selectable]=\"!stone.CanSelectStone(option)\">\r\n <div class=\"kern-div\" *ngIf=\"ShowKern(stone, option)\">{{ GetKern() }}</div>\r\n <div class=\"sticker-div\" *ngIf=\"ShowSticker(stone, option)\">{{ GetSticker(stone, option) }}</div>\r\n <img [src]=\"stone.GetImage(option)\" />\r\n </div>\r\n <div class=\"mix-block\" *ngIf=\"GetSelectedStoneObjects().length > 1 && stone.IsSelected(option)\">\r\n <ng-container *ngIf=\"!IsTextureMix25()\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n mix %\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"1\" max=\"100\" [(ngModel)]=\"stone.GetStone(option).mixRatio\">\r\n </mat-form-field>\r\n </ng-container>\r\n <ng-container *ngIf=\"IsTextureMix25()\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n mix %\r\n </mat-label>\r\n <ng-container *ngIf=\"stone.GetStoneFormaatObject(option) as formaat\">\r\n <mat-select [value]=\"formaat.mixRatio\"\r\n (selectionChange)=\"UpdateRatios(stone, option, $event.value)\">\r\n <mat-option [value]=\"25\">25%</mat-option>\r\n <mat-option *ngIf=\"Disable50()\" [value]=\"50\">50%</mat-option>\r\n <mat-option *ngIf=\"Disable75()\" [value]=\"75\">75%</mat-option>\r\n </mat-select>\r\n </ng-container>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n <div *ngIf=\"stone.IsDouvleAV(option)\" class=\"lsws-container\">\r\n <div class=\"lsws-item\" matTooltipClass=\"filter-tooltip\" matTooltip=\"{{ GetLSTooltip() }}\">\r\n <div class=\"lsws-item-text\">LS</div>\r\n <mat-icon>info</mat-icon>\r\n </div>\r\n <div class=\"lsws-item\">\r\n <mat-slide-toggle [(ngModel)]=\"stone.GetStoneFormaatObject(option).selecteddouble\" [disabled]=\"stone.DisableToggle()\"></mat-slide-toggle>\r\n </div>\r\n <div class=\"lsws-item\" matTooltipClass=\"filter-tooltip\" matTooltip=\"{{ GetWSTooltip() }}\">\r\n <div class=\"lsws-item-text\">WS</div>\r\n <mat-icon>info</mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"stone.HasSecondStone(option)\">\r\n <div style=\"position: relative;\">\r\n <div class=\"stone-tile\" (click)=\"stone.SelectSecond(option)\" [class.selected]=\"stone.IsSelectedSecond(option)\" [class.not-selectable]=\"!stone.CanSelectStoneSecond(option)\">\r\n <div class=\"kern-div\" *ngIf=\"ShowKern(stone, option)\">{{ GetKern() }}</div>\r\n <div class=\"sticker-div\" *ngIf=\"ShowStickerSecond(stone, option)\">{{ GetStickerSecond(stone, option) }}</div>\r\n <img [src]=\"stone.GetImageSecond(option)\" />\r\n </div>\r\n \r\n <!--<div *ngIf=\"stone.IsDouvleAV(option)\" class=\"lsws-container\">\r\n <div class=\"lsws-item\" matTooltipClass=\"filter-tooltip\" matTooltip=\"{{ GetLSTooltip() }}\">\r\n <div class=\"lsws-item-text\">LS</div>\r\n <mat-icon>info</mat-icon>\r\n </div>\r\n <div class=\"lsws-item\">\r\n <mat-slide-toggle [(ngModel)]=\"stone.GetStoneFormaatObject(option).selecteddouble\" [disabled]=\"stone.DisableToggle()\"></mat-slide-toggle>\r\n </div>\r\n <div class=\"lsws-item\" matTooltipClass=\"filter-tooltip\" matTooltip=\"{{ GetWSTooltip() }}\">\r\n <div class=\"lsws-item-text\">WS</div>\r\n <mat-icon>info</mat-icon>\r\n </div>\r\n </div>-->\r\n </div>\r\n </ng-container>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </table>\r\n </ng-container>\r\n\r\n\r\n <div class=\"texture-container\" [class.texture-container-margin]=\"this.SingleStoneMode\">\r\n <div class=\"texture-container-fly\">\r\n <div class=\"displayflex\">\r\n <div class=\"component-block first-row\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Verband) }}\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"SelectedVerbandId\">\r\n <mat-select-trigger>\r\n <ng-container *ngIf=\"SelectedVerbandId as id\">\r\n <ng-container *ngIf=\"GetVerbandById(id) as v\">\r\n <span class=\"select-trigger-content\">\r\n <span class=\"filter-option-image-mini-div\" *ngIf=\"v.imagePath\">\r\n <img [src]=\"GetImagePathProduct(v)\" class=\"filter-option-image\" alt=\"\" />\r\n </span>\r\n <span class=\"select-trigger-content-text\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Product, TranslationSubCategory.Name, v.id) }}\r\n </span>\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select-trigger>\r\n\r\n <ng-container *ngFor=\"let verband of GetVerbanden()\">\r\n <mat-option [value]=\"verband.id\" class=\"select-mat-option\">\r\n <ng-container *ngIf=\"verband.imagePath != null && verband.imagePath != ''\">\r\n <div class=\"filter-option-image-mini-div\">\r\n <img src=\"{{ GetImagePathProduct(verband) }}\" class=\"filter-option-image\" />\r\n </div>\r\n </ng-container>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Product, TranslationSubCategory.Name, verband.id) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"component-block first-row\">\r\n <ng-container *ngIf=\"GetVoeg() != null\">\r\n <mat-form-field appearance=\"fill\" class=\"fullwidth\">\r\n <mat-label class=\"select-mat-label\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Voeg) }}\r\n </mat-label>\r\n <mat-select [(ngModel)]=\"SelectedVoegId\">\r\n <mat-select-trigger>\r\n <ng-container *ngIf=\"SelectedVoegId as id\">\r\n <ng-container *ngIf=\"GetVoegById(id) as v\">\r\n <span class=\"select-trigger-content\">\r\n <span class=\"filter-option-image-mini-div\" *ngIf=\"v.imagePath\">\r\n <img [src]=\"GetImagePathProduct(v)\" class=\"filter-option-image\" alt=\"\" />\r\n </span>\r\n <span class=\"select-trigger-content-text\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, v.id) }}\r\n </span>\r\n </span>\r\n </ng-container>\r\n </ng-container>\r\n </mat-select-trigger>\r\n\r\n <ng-container *ngFor=\"let voeg of GetVoeg().filter.options\">\r\n <mat-option [value]=\"voeg.id\" class=\"select-mat-option\">\r\n <ng-container *ngIf=\"voeg.imagePath != null && voeg.imagePath != ''\">\r\n <div class=\"filter-option-image-mini-div\">\r\n <img src=\"{{ GetImagePath(voeg) }}\" class=\"filter-option-image\" />\r\n </div>\r\n </ng-container>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.FilterOption, TranslationSubCategory.Name, voeg.id) }}\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n </mat-form-field>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"component-block\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Stootvoeg) }}\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"{{ StootvoegMin }}\" max=\"{{ StootvoegMax }}\" [(ngModel)]=\"Stootvoeg\">\r\n </mat-form-field>\r\n </div>\r\n\r\n <div class=\"component-block\">\r\n <mat-form-field appearance=\"fill\" class=\"small-input\">\r\n <mat-label>\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Lintvoeg) }}\r\n </mat-label>\r\n <input matInput type=\"number\" min=\"{{ LintvoegMin }}\" max=\"{{ LintvoegMax }}\" [(ngModel)]=\"Lintvoeg\">\r\n </mat-form-field>\r\n </div>\r\n </div>\r\n\r\n <div class=\"slider-block\" *ngIf=\"!HiRes\">\r\n <div class=\"slider-block-name\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.AantalStenen) }}\r\n </div>\r\n <div class=\"slider-block-slider\">\r\n <mat-slider min=\"100\" max=\"2000\" step=\"50\" showTickMarks discrete style=\"width: 100%;\">\r\n <input matSliderThumb [(ngModel)]=\"AantalStenen\">\r\n </mat-slider>\r\n </div>\r\n <div class=\"slider-block-amount\">\r\n {{ AantalStenen }}\r\n </div>\r\n </div>\r\n\r\n <div class=\"high-res-checkbox-div\">\r\n <mat-checkbox [(ngModel)]=\"HiRes\" class=\"high-res-checkbox\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.HogeResolutie) }}\r\n </mat-checkbox>\r\n </div>\r\n\r\n <div class=\"high-res-checkbox-div\">\r\n <mat-checkbox [(ngModel)]=\"Shade\" class=\"high-res-checkbox\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Shaduw) }}\r\n </mat-checkbox>\r\n </div>\r\n\r\n <div class=\"buttonrow\">\r\n <button mat-raised-button (click)=\"SingleStoneMode = false;\" class=\"link textuur-knop\" *ngIf=\"SingleStoneMode\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.Mix) }}\r\n </button>\r\n\r\n <button mat-raised-button (click)=\"TextuurGenereren()\" class=\"link textuur-knop\" [disabled]=\"GenerateDisabled()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.TextuurGenereren) }}\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"IsLoadingTextures()\" class=\"texture-loader\">\r\n <mat-spinner class=\"loader-spinner\" [diameter]=\"80\"></mat-spinner>\r\n </div>\r\n\r\n <div *ngIf=\"ShowTexture()\">\r\n <div class=\"image-row\">\r\n <div>\r\n <ng-container *ngIf=\"HasToFillForm()\">\r\n <div (click)=\"OpenForm()\">\r\n <img class=\"image image-patroon\" [src]=\"GetPatroonDownloadURL()\" />\r\n </div>\r\n <div>\r\n <button mat-raised-button class=\"link textuur-knop\" (click)=\"OpenForm()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadTexture) }}\r\n </button>\r\n </div>\r\n <div>\r\n <button mat-raised-button class=\"link textuur-knop\" (click)=\"OpenForm()\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadBump) }}\r\n </button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!HasToFillForm()\">\r\n <div>\r\n <a [href]=\"GetPatroonDownloadURL()\" target=\"_blank\">\r\n <img class=\"image image-patroon\" [src]=\"GetPatroonDownloadURL()\" />\r\n </a>\r\n </div>\r\n <div>\r\n <a [href]=\"GetPatroonDownloadURLDownload()\" target=\"_blank\">\r\n <button mat-raised-button class=\"link textuur-knop\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadTexture) }}\r\n </button>\r\n </a>\r\n </div>\r\n <div>\r\n <a [href]=\"GetBumpDownloadURL()\" target=\"_blank\">\r\n <button mat-raised-button class=\"link textuur-knop\">\r\n {{ TranslateService.GetActiveValue(TranslationCategory.Common, TranslationSubCategory.DownloadBump) }}\r\n </button>\r\n </a>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div style=\"flex:auto;\"></div>\r\n</div>\r\n", styles: ["app-fab-texture-configurator .mix-block .mat-form-field-wrapper{padding-bottom:0}app-fab-texture-configurator .mix-block .mat-form-field-underline{bottom:0}app-fab-texture-configurator .center-block{margin:auto;display:flex}app-fab-texture-configurator .texture-container{padding:30px;width:300px}app-fab-texture-configurator .texture-loader{padding-top:50px}app-fab-texture-configurator .texture-container-margin{margin:auto}app-fab-texture-configurator .texture-container-fly{position:fixed;width:300px}app-fab-texture-configurator .mix-block{width:125px;margin-left:auto;margin-right:auto;position:absolute;bottom:45px;left:15px;background:#fff}app-fab-texture-configurator .mix-block mat-form-field-wrapper{padding-bottom:0}app-fab-texture-configurator .kern-div{position:absolute;top:3px;left:3px;background-color:#f6d18d;border-radius:12px;font-size:12px;padding:3px 10px}app-fab-texture-configurator .sticker-div{position:absolute;top:3px;left:3px;background-color:#f6d18d;border-radius:12px;font-size:12px;padding:3px 10px}app-fab-texture-configurator .loader-card{margin:200px auto auto;width:300px}app-fab-texture-configurator .loader-subtitle{text-align:center}app-fab-texture-configurator .loader-spinner{margin:auto}app-fab-texture-configurator .stone-tile{cursor:pointer;border:2px solid #FFF;height:150px;width:150px;position:relative}app-fab-texture-configurator .stone-tile img{height:150px;width:150px}app-fab-texture-configurator .selected{border:2px solid #F00}app-fab-texture-configurator .not-selectable{cursor:default!important;opacity:.2}app-fab-texture-configurator .textuur-knop{width:100%}app-fab-texture-configurator .high-res-checkbox-div{padding-bottom:20px}app-fab-texture-configurator .image-patroon{width:100%;cursor:pointer}app-fab-texture-configurator .image-row{padding-top:30px}app-fab-texture-configurator .mat-form-field{width:100%}app-fab-texture-configurator .lsws-container{display:flex;position:absolute;bottom:4px;width:100%;background-color:#fff}app-fab-texture-configurator .lsws-item{padding:5px;display:flex}app-fab-texture-configurator .link{margin-bottom:10px}app-fab-texture-configurator .slider-block{display:flex}app-fab-texture-configurator .slider-block-name{line-height:48px}app-fab-texture-configurator .slider-block-amount{line-height:48px;width:40px;text-align:center}app-fab-texture-configurator .slider-block-slider{flex:auto;padding-right:20px;padding-left:10px}.filter-option-image-mini-div{max-height:40px;padding-right:4px}.filter-option-image-mini-div .filter-option-image{width:40px;height:40px}.select-mat-option{height:4em!important}.select-mat-option .mat-option-text:first-letter{text-transform:capitalize}.select-mat-option .mat-option-text{display:flex}.mat-slide-toggle.mat-checked .mat-slide-toggle-bar{background-color:#0000008a}.mat-slide-toggle.mat-checked .mat-slide-toggle-thumb{background-color:#000}.mat-select-value{padding-top:35px}.select-trigger-content-text{position:relative;bottom:10px}\n"] }]
741
755
  }], ctorParameters: function () { return [{ type: i1.MobileService }, { type: i2.FabrikantenService }, { type: i3.TranslateService }, { type: i4.ActivatedRoute }, { type: i5.MatLegacyDialog }, { type: i6.TextureApiClient }, { type: i0.ChangeDetectorRef }]; } });
742
756
  class StoneRowObject {
743
757
  name;
@@ -766,6 +780,35 @@ class StoneRowObject {
766
780
  }
767
781
  }
768
782
  this.FabTextureConfiguratorComponent.UpdateDisableDuitsWildverband();
783
+ break;
784
+ }
785
+ }
786
+ this.FabTextureConfiguratorComponent.SetMixRatios();
787
+ }
788
+ }
789
+ SelectSecond(option) {
790
+ if (this.CanSelectStoneSecond(option)) {
791
+ var hitFirst = false;
792
+ for (var i = 0; i < this.options.length; i++) {
793
+ var name = this.options[i].name;
794
+ if ((name != null && option.name != null && name.toLowerCase().indexOf(option.name.toLowerCase()) != -1 && name.toLowerCase().indexOf("dubbel") == -1) ||
795
+ (option.name.toLowerCase() == "anders" && (this.FabTextureConfiguratorComponent.IsAnders(name)))) {
796
+ if (hitFirst) {
797
+ this.options[i].selected = !this.options[i].selected;
798
+ this.options[i].selecteddouble = false;
799
+ if (this.options[i].selected) {
800
+ this.FabTextureConfiguratorComponent.SelectedFormaat = option;
801
+ }
802
+ else {
803
+ if (this.FabTextureConfiguratorComponent.NoStoneSelected()) {
804
+ this.FabTextureConfiguratorComponent.SelectedFormaat = null;
805
+ }
806
+ }
807
+ this.FabTextureConfiguratorComponent.UpdateDisableDuitsWildverband();
808
+ }
809
+ else {
810
+ hitFirst = true;
811
+ }
769
812
  }
770
813
  }
771
814
  this.FabTextureConfiguratorComponent.SetMixRatios();
@@ -805,6 +848,20 @@ class StoneRowObject {
805
848
  return false;
806
849
  }
807
850
  }
851
+ CanSelectStoneSecond(option) {
852
+ var amount = this.FabTextureConfiguratorComponent.GetSelectedAmount();
853
+ var other = this.FabTextureConfiguratorComponent.IsOtherSelected();
854
+ if (amount == 4 || other) {
855
+ return this.IsSelectedSecond(option);
856
+ }
857
+ else {
858
+ if (this.FabTextureConfiguratorComponent.SelectedFormaat == null ||
859
+ this.FabTextureConfiguratorComponent.SelectedFormaat.id == option.id) {
860
+ return true;
861
+ }
862
+ return false;
863
+ }
864
+ }
808
865
  DisableToggle() {
809
866
  var stones = this.FabTextureConfiguratorComponent.GetSelectedStoneObjects();
810
867
  return stones.length == 4;
@@ -834,6 +891,23 @@ class StoneRowObject {
834
891
  }
835
892
  return null;
836
893
  }
894
+ GetStoneFormaatObjectSecond(option) {
895
+ var hitFirst = false;
896
+ for (var i = 0; i < this.options.length; i++) {
897
+ var name = this.options[i].name;
898
+ if (option.name.toLowerCase() == "anders") {
899
+ if (name != null) {
900
+ if (this.FabTextureConfiguratorComponent.IsAnders(name)) {
901
+ if (!hitFirst)
902
+ hitFirst = true;
903
+ else
904
+ return this.options[i];
905
+ }
906
+ }
907
+ }
908
+ }
909
+ return null;
910
+ }
837
911
  HasStone(option) {
838
912
  var stone = this.GetStoneFormaatObject(option);
839
913
  if (stone != null) {
@@ -841,6 +915,13 @@ class StoneRowObject {
841
915
  }
842
916
  return false;
843
917
  }
918
+ HasSecondStone(option) {
919
+ var stone = this.GetStoneFormaatObjectSecond(option);
920
+ if (stone != null) {
921
+ return true;
922
+ }
923
+ return false;
924
+ }
844
925
  IsDouvleAV(option) {
845
926
  for (var i = 0; i < this.options.length; i++) {
846
927
  var name = this.options[i].name;
@@ -873,6 +954,13 @@ class StoneRowObject {
873
954
  }
874
955
  return false;
875
956
  }
957
+ IsSelectedSecond(option) {
958
+ var stone = this.GetStoneFormaatObjectSecond(option);
959
+ if (stone != null) {
960
+ return stone.selected;
961
+ }
962
+ return false;
963
+ }
876
964
  GetImage(option) {
877
965
  var stone = this.GetStone(option);
878
966
  if (stone.id != 0) {
@@ -886,6 +974,19 @@ class StoneRowObject {
886
974
  }
887
975
  return "";
888
976
  }
977
+ GetImageSecond(option) {
978
+ var stone = this.GetStoneSecond(option);
979
+ if (stone.id != 0) {
980
+ var value = stone.imagePath + "";
981
+ if (value.indexOf("#BCB#") != -1) {
982
+ var bcburl = this.FabrikantenService.FabrikantenSettingsViewModel.bcbWebserviceURLBase + "";
983
+ bcburl = bcburl.substring(0, bcburl.length - 1);
984
+ value = value.replace("#BCB#", bcburl);
985
+ }
986
+ return value;
987
+ }
988
+ return "";
989
+ }
889
990
  GetStone(option) {
890
991
  var stone = this.GetStoneFormaatObject(option);
891
992
  if (stone != null) {
@@ -893,6 +994,13 @@ class StoneRowObject {
893
994
  }
894
995
  return new FabrikantenFilterOptionViewModel();
895
996
  }
997
+ GetStoneSecond(option) {
998
+ var stone = this.GetStoneFormaatObjectSecond(option);
999
+ if (stone != null) {
1000
+ return stone.options[0];
1001
+ }
1002
+ return new FabrikantenFilterOptionViewModel();
1003
+ }
896
1004
  GetSelectedStones(stones) {
897
1005
  for (var i = 0; i < this.options.length; i++) {
898
1006
  this.options[i].GetSelectedStones(stones);
@@ -949,4 +1057,4 @@ class StoneFormaatObject {
949
1057
  }
950
1058
  }
951
1059
  }
952
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFiLXRleHR1cmUtY29uZmlndXJhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9mYWJyaWthbnRlbmNvcmUvY29tcG9uZW50cy9mYWItdGV4dHVyZS1jb25maWd1cmF0b3IvZmFiLXRleHR1cmUtY29uZmlndXJhdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9mYWJyaWthbnRlbmNvcmUvY29tcG9uZW50cy9mYWItdGV4dHVyZS1jb25maWd1cmF0b3IvZmFiLXRleHR1cmUtY29uZmlndXJhdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQXFCLFNBQVMsRUFBMEMsTUFBTSxlQUFlLENBQUM7QUFNckcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLHNCQUFzQixFQUF5SSxtQkFBbUIsRUFBeUUsZ0NBQWdDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUvVixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUV0RixNQU1hLCtCQUErQjtJQXVDakM7SUFDQTtJQUNBO0lBQ0M7SUFDRDtJQUNDO0lBQ0E7SUEzQ1YsSUFBVyxtQkFBbUI7UUFDNUIsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBVyxzQkFBc0I7UUFDL0IsT0FBTyxzQkFBc0IsQ0FBQztJQUNoQyxDQUFDO0lBRU0saUJBQWlCLEdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDL0IsY0FBYyxHQUFXLENBQUMsQ0FBQyxDQUFDO0lBQzVCLFFBQVEsR0FBVyxFQUFFLENBQUM7SUFDdEIsV0FBVyxHQUFXLENBQUMsQ0FBQztJQUN4QixXQUFXLEdBQVcs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Q0FBQzthQUM5QjtTQUNGO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgT25DaGFuZ2VzLCBEb0NoZWNrLCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdExlZ2FjeURpYWxvZyBhcyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgRmFicmlrYW50ZW5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmFicmlrYW50ZW4uc2VydmljZSc7XG5pbXBvcnQgeyBNb2JpbGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbW9iaWxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RyYW5zbGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRyYW5zbGF0aW9uQ2F0ZWdvcnksIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnksIEZhYnJpa2FudGVuVGV4dHVyZUJhc2VWaWV3TW9kZWwsIEZhYnJpa2FudGVuRmlsdGVyVmlld01vZGVsLCBGYWJyaWthbnRlbklucHV0Vmlld01vZGVsLCBGYWJyaWthbnRlblByb2R1Y3RWaWV3TW9kZWwsIFRleHR1cmVBcGlDbGllbnQsIFRleHR1cmVSZXF1ZXN0TW9kZWwsIFRleHR1cmVSZXNwb25zZU1vZGVsLCBUZXh0dXJlTWl4UmVzcG9uc2VNb2RlbCwgVGV4dHVyZU1peFJlcXVlc3RNb2RlbCwgRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwgfSBmcm9tICcuLi8uLi9zd2FnZ2VyL1N3YWdnZXJDbGllbnQnO1xuaW1wb3J0IHsgRmFiRGlzcGxheVBob3RvRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vZmFiLWRpc3BsYXktcGhvdG8tZGlhbG9nL2ZhYi1kaXNwbGF5LXBob3RvLWRpYWxvZy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBGYWJGb3JtRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vZmFiLWZvcm0tZGlhbG9nL2ZhYi1mb3JtLWRpYWxvZy5jb21wb25lbnQnO1xyXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1mYWItdGV4dHVyZS1jb25maWd1cmF0b3InLFxuICB0ZW1wbGF0ZVVybDogJy4vZmFiLXRleHR1cmUtY29uZmlndXJhdG9yLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZmFiLXRleHR1cmUtY29uZmlndXJhdG9yLmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgRG9DaGVjayB7XG5cbiAgcHVibGljIGdldCBUcmFuc2xhdGlvbkNhdGVnb3J5KCkge1xuICAgIHJldHVybiBUcmFuc2xhdGlvbkNhdGVnb3J5O1xuICB9XG5cbiAgcHVibGljIGdldCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5KCkge1xuICAgIHJldHVybiBUcmFuc2xhdGlvblN1YkNhdGVnb3J5O1xuICB9XG5cbiAgcHVibGljIFNlbGVjdGVkVmVyYmFuZElkOiBudW1iZXIgPSAtMTtcbiAgcHVibGljIFNlbGVjdGVkVm9lZ0lkOiBudW1iZXIgPSAtMTtcbiAgcHVibGljIExpbnR2b2VnOiBudW1iZXIgPSAxMjtcbiAgcHVibGljIExpbnR2b2VnTWluOiBudW1iZXIgPSA2O1xuICBwdWJsaWMgTGludHZvZWdNYXg6IG51bWJlciA9IDE0O1xuICBwdWJsaWMgU3Rvb3R2b2VnOiBudW1iZXIgPSAxMDtcbiAgcHVibGljIFN0b290dm9lZ01pbjogbnVtYmVyID0gMDtcbiAgcHVibGljIFN0b290dm9lZ01heDogbnVtYmVyID0gMTQ7XG5cbiAgcHVibGljIEFhbnRhbFN0ZW5lbjogbnVtYmVyID0gMTAwO1xuXG4gIHB1YmxpYyBIaVJlczogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgU2hhZGU6IGJvb2xlYW4gPSB0cnVlO1xuICBwdWJsaWMgTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgU2luZ2xlU3RvbmVNb2RlOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBEaXNhYmxlRHVpdHNXaWxkdmVyYmFuZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgTWl4UmF0aW9TZWxlY3Q6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgVGV4dHVyZVJlc3BvbnNlTW9kZWw6IFRleHR1cmVSZXNwb25zZU1vZGVsIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBUZXh0dXJlTWl4UmVzcG9uc2VNb2RlbDogVGV4dHVyZU1peFJlc3BvbnNlTW9kZWwgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIEtlcm46IHN0cmluZ1tdIHwgbnVsbCA9IG51bGw7XG5cbiAgLy9wdWJsaWMgU3RhdGVEaXNwbGF5Rm9ybTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyBTZWxlY3RlZEZvcm1hYXQ6IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsIHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIFN0b25lUm93T2JqZWN0czogQXJyYXk8U3RvbmVSb3dPYmplY3Q+ID0gbmV3IEFycmF5PFN0b25lUm93T2JqZWN0PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBNb2JpbGVTZXJ2aWNlOiBNb2JpbGVTZXJ2aWNlLFxuICAgIHB1YmxpYyBGYWJyaWthbnRlblNlcnZpY2U6IEZhYnJpa2FudGVuU2VydmljZSxcbiAgICBwdWJsaWMgVHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIEFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwdWJsaWMgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBUZXh0dXJlQXBpQ2xpZW50OiBUZXh0dXJlQXBpQ2xpZW50LFxuICAgIHByaXZhdGUgQ2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHRoaXMuVHJhbnNsYXRlU2VydmljZS5Qcm9jZXNzUGFyYW1ldGVycyh0aGlzLkFjdGl2YXRlZFJvdXRlLCB0aGlzLkNoYW5nZURldGVjdG9yUmVmKTtcbiAgfVxuXG4gIG5nRG9DaGVjaygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5Jc0xvYWRpbmcoKSkge1xyXG4gICAgICBpZiAodGhpcy5TdG9uZVJvd09iamVjdHMubGVuZ3RoID09IDApIHtcclxuICAgICAgICB0aGlzLkZpbGxBcnJheXMoKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuU2VsZWN0ZWRWZXJiYW5kSWQgPT0gLTEpIHtcclxuICAgICAgICB2YXIgdmVyYmFuZGVuID0gdGhpcy5HZXRWZXJiYW5kZW4oKVxyXG4gICAgICAgIHRoaXMuU2VsZWN0ZWRWZXJiYW5kSWQgPSB2ZXJiYW5kZW5bMF0uaWQ7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmVyYmFuZGVuLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBpZiAodmVyYmFuZGVuW2ldLmdyb3VwID09IFwiZGVmYXVsdFwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuU2VsZWN0ZWRWZXJiYW5kSWQgPSB2ZXJiYW5kZW5baV0uaWQ7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLlNlbGVjdGVkVm9lZ0lkID09IC0xKSB7XHJcbiAgICAgICAgdmFyIHZvZWcgPSB0aGlzLkdldFZvZWcoKTtcclxuXHJcbiAgICAgICAgaWYgKHZvZWc/LmZpbHRlcj8ub3B0aW9ucyAhPSBudWxsKSB7XHJcbiAgICAgICAgICB0aGlzLlNlbGVjdGVkVm9lZ0lkID0gdm9lZy5maWx0ZXIub3B0aW9uc1swXS5pZDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5UZXh0dXJlQXBpQ2xpZW50LmdldEtlcm4oKS5zdWJzY3JpYmUoKG1vZGVsOiBzdHJpbmdbXSkgPT4ge1xyXG4gICAgICB0aGlzLktlcm4gPSBtb2RlbDtcclxuICAgIH0pO1xuXG4gICAgdGhpcy5GYWJyaWthbnRlblNlcnZpY2UuTG9hZEZhYnJpa2FudGVuVmlld01vZGVsKHRoaXMuQ2hhbmdlRGV0ZWN0b3JSZWYsIHRoaXMuQWN0aXZhdGVkUm91dGUsICgpID0+IHtcbiAgICAgIHRoaXMuRmlsbEFycmF5cygpO1xuXG4gICAgICB2YXIgc3RvbmUgPSB0aGlzLkFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldCgnc3RvbmUnKTtcclxuICAgICAgdmFyIGZvcm1hdCA9IHRoaXMuQWN0aXZhdGVkUm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KCdmb3JtYXQnKTtcclxuXHJcbiAgICAgIGlmIChzdG9uZSAhPSBudWxsKSB7XHJcbiAgICAgICAgdmFyIHN0b25lX2Zvcm1hdCA9IHN0b25lICsgXCJfXCIgKyBmb3JtYXQ7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5TdG9uZVJvd09iamVjdHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5TdG9uZVJvd09iamVjdHNbaV0ub3B0aW9ucy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgICAgICBmb3IgKHZhciBvID0gMDsgbyA8IHRoaXMuU3RvbmVSb3dPYmplY3RzW2ldLm9wdGlvbnNbal0ub3B0aW9ucy5sZW5ndGg7IG8rKykge1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLlN0b25lUm93T2JqZWN0c1tpXS5vcHRpb25zW2pdLm9wdGlvbnNbb10udXJsTmFtZSA9PSBzdG9uZV9mb3JtYXQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuU3RvbmVSb3dPYmplY3RzW2ldLlNlbGVjdCh0aGlzLlN0b25lUm93T2JqZWN0c1tpXS5vcHRpb25zW2pdLm9wdGlvbnNbb10pO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBmb3JtYXRzID0gdGhpcy5HZXRGb3JtYWF0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCBmb3JtYXRzLmxlbmd0aDsgcCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXRzW3BdLnVybE5hbWUgPT0gZm9ybWF0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5TdG9uZVJvd09iamVjdHNbaV0uRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudC5TZWxlY3RlZEZvcm1hYXQgPSBmb3JtYXRzW3BdO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5TaW5nbGVTdG9uZU1vZGUgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBIYXNUb0ZpbGxGb3JtKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblNldHRpbmdzVmlld01vZGVsLmRvd25sb2FkRm9ybUVuYWJsZWQgJiYgIXRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsLmhhc0ZpbGxlZEZvcm1zICYmICF0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblZpZXdNb2RlbC5za2lwRm9ybXMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XG5cbiAgcHVibGljIElzTG9hZGluZygpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5GYWJyaWthbnRlblNlcnZpY2UuSXNMb2FkaW5nU21hbGwoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxuXG4gIHB1YmxpYyBJc0xvYWRpbmdUZXh0dXJlcygpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5Mb2FkaW5nKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XG5cbiAgcHVibGljIElzVGV4dHVyZU1peDI1KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblNldHRpbmdzVmlld01vZGVsPy50ZXh0dXJlQ29uZmlndXJhdG9yRW5hYmxlTWl4MjUgPT0gdHJ1ZTtcclxuICB9XG5cbiAgcHVibGljIE5vU3RvbmVTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuU3RvbmVSb3dPYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5TdG9uZVJvd09iamVjdHNbaV0uSGFzU3RvbmVTZWxlY3RlZCgpKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XG5cbiAgcHVibGljIEdldFN0ZWVuKCk6IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsW10ge1xuICAgIGlmICh0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblZpZXdNb2RlbD8uaW5wdXRzICE9IHVuZGVmaW5lZCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblZpZXdNb2RlbC5pbnB1dHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB2YXIgZmlsdGVyID0gdGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5WaWV3TW9kZWwuaW5wdXRzW2ldLmZpbHRlcjtcclxuICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwgJiYgZmlsdGVyLm5hbWUgPT0gXCJTdGVlbiAxXCIpIHtcclxuICAgICAgICAgIHZhciBvcHRpb25zID0gZmlsdGVyLm9wdGlvbnM7XHJcblxyXG4gICAgICAgICAgaWYgKG9wdGlvbnMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cblxuICAgIHJldHVybiBuZXcgQXJyYXk8RmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWw+KCk7XHJcbiAgfVxuXG4gIHB1YmxpYyBHZW5lcmF0ZURpc2FibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuU2VsZWN0ZWRWZXJiYW5kSWQgPT0gLTEpIHtcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLlNlbGVjdGVkVm9lZ0lkID09IC0xKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5Mb2FkaW5nKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgc3RvbmVzID0gdGhpcy5HZXRTZWxlY3RlZFN0b25lcygpO1xuXG4gICAgaWYgKHN0b25lcy5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxuXG4gIHB1YmxpYyBTaG93VGV4dHVyZSgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLklzTG9hZGluZ1RleHR1cmVzKCkpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLlRleHR1cmVSZXNwb25zZU1vZGVsICE9IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cblxuICBwdWJsaWMgU2hvd0tlcm4oc3RvbmU6IFN0b25lUm93T2JqZWN0LCBvcHRpb246IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuS2VybiAhPSBudWxsKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuS2Vybi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmICh0aGlzLktlcm5baV0udG9Mb3dlckNhc2UoKS5pbmRleE9mKHN0b25lLm5hbWUudG9Mb3dlckNhc2UoKSkgIT0gLTEgJiZcclxuICAgICAgICAgIHRoaXMuS2VybltpXS50b0xvd2VyQ2FzZSgpLmluZGV4T2Yob3B0aW9uLm5hbWUhLnRvTG93ZXJDYXNlKCkpICE9IC0xKSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy92YXIgc3RyaW5nID0gb3B0aW9uLm5hbWU7XHJcbiAgICAgICAgLy90aGlzLktlcm5baV06IFwiQWx0IEJlcmxpbiBGTyAobm9ybWFhbGZvcm1hYXQpXCJcclxuICAgICAgICAvL29wdGlvbi5uYW1lOiBcIk5vcm1hYWxmb3JtYWF0XCJcclxuICAgICAgICAvL3N0b25lLm5hbWU6IFwiQWx0IEJlcmxpbiBGTyBcIlxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cblxuICBwdWJsaWMgU2hvd1N0aWNrZXIoc3RvbmU6IFN0b25lUm93T2JqZWN0LCBvcHRpb246IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5HZXRTdGlja2VyKHN0b25lLCBvcHRpb24pICE9IFwiXCI7XHJcbiAgfVxuXG4gIHB1YmxpYyBHZXRTdGlja2VyKHN0b25lOiBTdG9uZVJvd09iamVjdCwgb3B0aW9uOiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCk6IHN0cmluZyB7XG4gICAgdmFyIHN0ZWVuID0gc3RvbmUuR2V0U3RvbmVGb3JtYWF0T2JqZWN0KG9wdGlvbik7XHJcblxyXG4gICAgdmFyIG5hbWU6IHN0cmluZyA9IHN0ZWVuPy5uYW1lICsgXCJcIjtcclxuXHJcbiAgICBpZiAodGhpcy5Jc0FuZGVycyhuYW1lKSkge1xyXG4gICAgICB2YXIgdHlwZSA9IG5hbWUuc3Vic3RyaW5nKG5hbWUuaW5kZXhPZignKCcpICsgMSkucmVwbGFjZShcIilcIiwgXCJcIik7XHJcbiAgICAgIHJldHVybiB0aGlzLlRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuQ3VzdG9tSXRlbSwgdW5kZWZpbmVkLCB0eXBlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gXCJcIjtcclxuICAgIH1cclxuICB9XG5cbiAgcHVibGljIEdldFNlbGVjdGVkU3RvbmVzKCk6IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsW10ge1xuICAgIHZhciBzdG9uZXMgPSBuZXcgQXJyYXk8RmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWw+KCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuU3RvbmVSb3dPYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLlN0b25lUm93T2JqZWN0c1tpXS5HZXRTZWxlY3RlZFN0b25lcyhzdG9uZXMpO1xyXG4gICAgfVxuXG4gICAgcmV0dXJuIHN0b25lcztcclxuICB9XG5cbiAgcHVibGljIEdldFNlbGVjdGVkU3RvbmVPYmplY3RzKCk6IFN0b25lRm9ybWFhdE9iamVjdFtdIHtcbiAgICB2YXIgc3RvbmVzID0gbmV3IEFycmF5PFN0b25lRm9ybWFhdE9iamVjdD4oKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5TdG9uZVJvd09iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuU3RvbmVSb3dPYmplY3RzW2ldLkdldFNlbGVjdGVkU3RvbmVPYmplY3RzKHN0b25lcyk7XHJcbiAgICB9XG5cbiAgICByZXR1cm4gc3RvbmVzO1xyXG4gIH1cblxuICBwdWJsaWMgR2V0U2VsZWN0ZWRBbW91bnQoKTogbnVtYmVyIHtcbiAgICB2YXIgY291bnQgPSAwO1xuICAgIHZhciBzdG9uZXMgPSBuZXcgQXJyYXk8U3RvbmVGb3JtYWF0T2JqZWN0PigpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLlN0b25lUm93T2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5TdG9uZVJvd09iamVjdHNbaV0uR2V0U2VsZWN0ZWRTdG9uZU9iamVjdHMoc3RvbmVzKTtcclxuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RvbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb3VudCsrO1xuXG4gICAgICBpZiAoc3RvbmVzW2ldLnNlbGVjdGVkZG91YmxlKSB7XHJcbiAgICAgICAgY291bnQrKztcclxuICAgICAgfVxyXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvdW50O1xyXG4gIH1cblxuICBwdWJsaWMgSXNPdGhlclNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHZhciBzdG9uZXMgPSBuZXcgQXJyYXk8U3RvbmVGb3JtYWF0T2JqZWN0PigpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLlN0b25lUm93T2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5TdG9uZVJvd09iamVjdHNbaV0uR2V0U2VsZWN0ZWRTdG9uZU9iamVjdHMoc3RvbmVzKTtcclxuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RvbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5Jc0FuZGVycyhzdG9uZXNbaV0ubmFtZSkpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cblxuICBwdWJsaWMgR2V0Rm9ybWFhdCgpOiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbFtdIHtcbiAgICBpZiAodGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5WaWV3TW9kZWw/LmlucHV0cyAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5WaWV3TW9kZWwuaW5wdXRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdmFyIGZpbHRlciA9IHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsLmlucHV0c1tpXS5maWx0ZXI7XHJcbiAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsICYmIGZpbHRlci5uYW1lID09IFwiRm9ybWFhdFwiKSB7XHJcbiAgICAgICAgICB2YXIgb3B0aW9ucyA9IGZpbHRlci5vcHRpb25zO1xyXG5cclxuICAgICAgICAgIGlmIChvcHRpb25zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEFycmF5PEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsPigpO1xyXG4gIH1cblxuICBwdWJsaWMgR2V0Vm9lZygpOiBGYWJyaWthbnRlbklucHV0Vmlld01vZGVsIHwgbnVsbCB7XHJcbiAgICBpZiAodGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5WaWV3TW9kZWw/LmlucHV0cyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblZpZXdNb2RlbC5pbnB1dHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAodGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5WaWV3TW9kZWwuaW5wdXRzW2ldLmZpbHRlcj8ubmFtZSA9PSBcIlZvZWdcIikge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsLmlucHV0c1tpXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBHZXRWb2VnQnlJZChpZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5HZXRWb2VnKCk/LmZpbHRlcj8ub3B0aW9uczsgLy8gb2YgY2FjaGUgZGV6ZSBsaWpzdCBpbiBlZW4gcHJvcGVydHlcclxuICAgIHJldHVybiBsaXN0Py5maW5kKHYgPT4gdi5pZCA9PT0gaWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIEdldFZlcmJhbmRlbigpOiBGYWJyaWthbnRlblByb2R1Y3RWaWV3TW9kZWxbXSB7XHJcbiAgICBpZiAodGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5WaWV3TW9kZWw/LnByb2R1Y3RzICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAodGhpcy5EaXNhYmxlRHVpdHNXaWxkdmVyYmFuZCkge1xyXG4gICAgICAgIHZhciBhcnJheSA9IG5ldyBBcnJheTxGYWJyaWthbnRlblByb2R1Y3RWaWV3TW9kZWw+KCk7XHJcblxyXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5WaWV3TW9kZWwucHJvZHVjdHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlmICh0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblZpZXdNb2RlbC5wcm9kdWN0c1tpXS5uYW1lIS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJkdWl0c1wiKSA9PSAtMSkge1xyXG4gICAgICAgICAgICBhcnJheS5wdXNoKHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsLnByb2R1Y3RzW2ldKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBhcnJheTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5WaWV3TW9kZWwucHJvZHVjdHM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gbmV3IEFycmF5PEZhYnJpa2FudGVuUHJvZHVjdFZpZXdNb2RlbD4oKTtcclxuICAgIH1cclxuXHJcbiAgfVxuXG4gIHB1YmxpYyBHZXRWZXJiYW5kQnlJZChpZDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5HZXRWZXJiYW5kZW4oKTsgLy8gb2YgY2FjaGUgZGV6ZSBsaWpzdCBpbiBlZW4gcHJvcGVydHlcclxuICAgIHJldHVybiBsaXN0Py5maW5kKHYgPT4gdi5pZCA9PT0gaWQpO1xyXG4gIH1cblxuICBwdWJsaWMgR2V0SW1hZ2VQYXRoKG9wdGlvbjogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwpOiBzdHJpbmcge1xyXG4gICAgdmFyIHZhbHVlID0gb3B0aW9uLmltYWdlUGF0aCArIFwiXCI7XHJcblxyXG4gICAgaWYgKHZhbHVlLmluZGV4T2YoXCIjQkNCI1wiKSAhPSAtMSkge1xyXG4gICAgICB2YXIgYmNidXJsID0gdGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5TZXR0aW5nc1ZpZXdNb2RlbC5iY2JXZWJzZXJ2aWNlVVJMQmFzZSArIFwiXCI7XHJcbiAgICAgIGJjYnVybCA9IGJjYnVybC5zdWJzdHJpbmcoMCwgYmNidXJsLmxlbmd0aCAtIDEpO1xyXG5cclxuICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKFwiI0JDQiNcIiwgYmNidXJsKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0SW1hZ2VQYXRoUHJvZHVjdChvcHRpb246IEZhYnJpa2FudGVuUHJvZHVjdFZpZXdNb2RlbCk6IHN0cmluZyB7XHJcbiAgICB2YXIgdmFsdWUgPSBvcHRpb24uaW1hZ2VQYXRoICsgXCJcIjtcclxuXHJcbiAgICBpZiAodmFsdWUuaW5kZXhPZihcIiNCQ0IjXCIpICE9IC0xKSB7XHJcbiAgICAgIHZhciBiY2J1cmwgPSB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblNldHRpbmdzVmlld01vZGVsLmJjYldlYnNlcnZpY2VVUkxCYXNlICsgXCJcIjtcclxuICAgICAgYmNidXJsID0gYmNidXJsLnN1YnN0cmluZygwLCBiY2J1cmwubGVuZ3RoIC0gMSk7XHJcblxyXG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoXCIjQkNCI1wiLCBiY2J1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XG5cbiAgcHVibGljIEdldFBhdHJvb25Eb3dubG9hZFVSTCgpOiBzdHJpbmcge1xyXG5cclxuICAgIHZhciB1cmwgPSB0aGlzLlRleHR1cmVSZXNwb25zZU1vZGVsPy5wYXRyb29uVVJMICsgXCJcIjtcclxuXHJcbiAgICB1cmwgPSB1cmwucmVwbGFjZSh0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblNldHRpbmdzVmlld01vZGVsLmJjYldlYnNlcnZpY2VVUkxCYXNlICsgXCJcIiwgXCJcIik7XHJcblxyXG4gICAgdmFyIHRlbXAgPSBcIi9Eb3dubG9hZC9HZXRJbWFnZUZyb21CQ0JTZXJ2ZXI/cEZpbGU9XCIgKyBlbmNvZGVVUklDb21wb25lbnQodXJsKSArIFwiJnBUYXJnZXQ9XCIgKyBlbmNvZGVVUklDb21wb25lbnQodGhpcy5HZXREb3dubG9hZE5hbWUoKSArIFwiLnBuZ1wiKTtcclxuXHJcbiAgICByZXR1cm4gdGVtcDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBHZXRQYXRyb29uRG93bmxvYWRVUkxEb3dubG9hZCgpOiBzdHJpbmcge1xyXG5cclxuICAgIHZhciB1cmwgPSB0aGlzLlRleHR1cmVSZXNwb25zZU1vZGVsPy5wYXRyb29uVVJMICsgXCJcIjtcclxuXHJcbiAgICB1cmwgPSB1cmwucmVwbGFjZSh0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblNldHRpbmdzVmlld01vZGVsLmJjYldlYnNlcnZpY2VVUkxCYXNlICsgXCJcIiwgXCJcIik7XHJcblxyXG4gICAgdmFyIHRlbXAgPVxyXG4gICAgICB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblNldHRpbmdzVmlld01vZGVsLmJjYldlYnNlcnZpY2VVUkxCYXNlICtcclxuICAgICAgXCJEb3dubG9hZC5hc3B4P2ZpbGU9XCIgK1xyXG4gICAgICB1cmwgK1xyXG4gICAgICBcIiZkb2VsPVwiICtcclxuICAgICAgdGhpcy5HZXREb3dubG9hZE5hbWUoKSArXHJcbiAgICAgIFwiLnBuZ1wiO1xyXG5cclxuICAgIHJldHVybiB0ZW1wO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIEdldEJ1bXBEb3dubG9hZFVSTCgpOiBzdHJpbmcge1xyXG4gICAgdmFyIHVybCA9IHRoaXMuVGV4dHVyZVJlc3BvbnNlTW9kZWw/LmJ1bXBVUkwgKyBcIlwiO1xyXG5cclxuICAgIHVybCA9IHVybC5yZXBsYWNlKHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuU2V0dGluZ3NWaWV3TW9kZWwuYmNiV2Vic2VydmljZVVSTEJhc2UgKyBcIlwiLCBcIlwiKTtcclxuXHJcbiAgICB2YXIgdGVtcCA9XHJcbiAgICAgIHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuU2V0dGluZ3NWaWV3TW9kZWwuYmNiV2Vic2VydmljZVVSTEJhc2UgK1xyXG4gICAgICBcIkRvd25sb2FkLmFzcHg/ZmlsZT1cIiArXHJcbiAgICAgIHVybCArXHJcbiAgICAgIFwiJmRvZWw9XCIgK1xyXG4gICAgICB0aGlzLkdldERvd25sb2FkTmFtZSgpICtcclxuICAgICAgXCJfYnVtcC5wbmdcIjtcclxuXHJcbiAgICByZXR1cm4gdGVtcDtcclxuICB9XG5cbiAgcHVibGljIEdldERvd25sb2FkTmFtZSgpOiBzdHJpbmcge1xyXG4gICAgdmFyIGJvbmQgPSB0aGlzLkdldFZlcmJhbmRCeUlkKHRoaXMuU2VsZWN0ZWRWZXJiYW5kSWQpO1xyXG4gICAgdmFyIGJvbmRfc3RyID0gdGhpcy5UcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuUHJvZHVjdCwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5OYW1lLCBib25kPy5pZCkudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICB2YXIgdm9lZyA9IHRoaXMuR2V0Vm9lZ0J5SWQodGhpcy5TZWxlY3RlZFZvZWdJZCk7XHJcbiAgICB2YXIgdm9lZ19zdHIgPSB0aGlzLlRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5GaWx0ZXJPcHRpb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuTmFtZSwgdm9lZz8uaWQpLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgdmFyIHJlc28gPSBcIkxRXCI7XHJcblxyXG4gICAgaWYgKHRoaXMuSGlSZXMpIHtcclxuICAgICAgcmVzbyA9IFwiSFFcIjtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgc3RvbmVzID0gdGhpcy5HZXRTZWxlY3RlZFN0b25lcygpO1xyXG4gICAgdmFyIHN0ZWVuID0gXCJcIjtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0b25lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoc3RlZW4gIT0gXCJcIikge1xyXG4gICAgICAgIHN0ZWVuICs9IFwiX1wiO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzdGVlbiArPSAoc3RvbmVzW2ldLnVybE5hbWUgKyBcIlwiKS5yZXBsYWNlKFwiX1wiLCBcIiBcIik7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGVuZCA9IFwiX1wiICsgdGhpcy5HZXREaW1lbnNpb24oKSArIFwiX1wiICsgYm9uZF9zdHIgKyBcIl9cIiArIHZvZWdfc3RyICsgXCJfXCIgKyByZXNvXHJcblxyXG4gICAgdmFyIGxlZnQgPSAyNTAgLSBlbmQubGVuZ3RoO1xyXG5cclxuICAgIGlmIChzdGVlbi5sZW5ndGggPiBsZWZ0KSB7XHJcbiAgICAgIHN0ZWVuID0gc3RlZW4uc3Vic3RyaW5nKDAsIGxlZnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdGVlbiArIGVuZDtcclxuICB9XG5cbiAgcHVibGljIEdldEFjdGl2ZVN0ZWVuKCk6IHN0cmluZyB7XHJcbiAgICB2YXIgc3RvbmVzID0gdGhpcy5HZXRTZWxlY3RlZFN0b25lcygpO1xyXG5cclxuICAgIGlmIChzdG9uZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm4gc3RvbmVzWzBdLnVybE5hbWUgKyBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBcIlwiO1xyXG4gIH1cblxuICBwdWJsaWMgRmlsbEFycmF5cygpIHtcbiAgICB0aGlzLlN0b25lUm93T2JqZWN0cyA9IG5ldyBBcnJheTxTdG9uZVJvd09iamVjdD4oKTtcclxuXHJcbiAgICB2YXIgZm9ybWFhdCA9IHRoaXMuR2V0U3RlZW4oKTtcclxuXHJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvcm1hYXQubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdmFyIG5hbWU6IHN0cmluZyA9IGZvcm1hYXRbaV0ubmFtZSArIFwiXCI7XHJcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmluZGV4T2YoJygnKSkgKyBcIlwiO1xyXG5cclxuICAgICAgdmFyIHN0b25lcm93b2JqZWN0OiBTdG9uZVJvd09iamVjdCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLlN0b25lUm93T2JqZWN0cy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGlmICh0aGlzLlN0b25lUm93T2JqZWN0c1tqXS5uYW1lID09IG5hbWUpIHtcclxuICAgICAgICAgIHN0b25lcm93b2JqZWN0ID0gdGhpcy5TdG9uZVJvd09iamVjdHNbal07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc3RvbmVyb3dvYmplY3QgPT0gbnVsbCkge1xyXG4gICAgICAgIHN0b25lcm93b2JqZWN0ID0gbmV3IFN0b25lUm93T2JqZWN0KG5hbWUsIHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLCB0aGlzKTtcclxuICAgICAgICB0aGlzLlN0b25lUm93T2JqZWN0cy5wdXNoKHN0b25lcm93b2JqZWN0KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgc3RvbmVyb3dvYmplY3QuQWRkT3B0aW9uKGZvcm1hYXRbaV0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuU3RvbmVSb3dPYmplY3RzLnNvcnQoZnVuY3Rpb24gKHN0b25lMSwgc3RvbmUyKSB7IHJldHVybiBzdG9uZTEubmFtZS5sb2NhbGVDb21wYXJlKHN0b25lMi5uYW1lKSB9KTtcclxuICB9XG5cbiAgcHVibGljIElzUmF0aW9CbG9ja2luZygpOiBib29sZWFuIHtcbiAgICB2YXIgdmVyYmFuZCA9IHRoaXMuR2V0VmVyYmFuZEJ5SWQodGhpcy5TZWxlY3RlZFZlcmJhbmRJZCk7XG5cbiAgICBpZiAodmVyYmFuZD8uaW5mbyAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgdmFyIG9iamVjdCA9IEpTT04ucGFyc2UodmVyYmFuZC5pbmZvKTtcclxuICAgICAgdmFyIHN0ciA9IHRoaXMuR2V0TGVuZ3RlKCkgKyBcIiA9PSBcIiArICgyICogdGhpcy5HZXRCcmVlZHRlKCkpICsgXCIgKyBcIiArIHRoaXMuU3Rvb3R2b2VnO1xyXG4gICAgICAvL2FsZXJ0KG9iamVjdC5yYXRpbyArIFwiOiBcIiArIHN0ciArIFwiIDogXCIgKyBldmFsKHN0cikpO1xyXG4gICAgICB2YXIgZXZhbFN0ciA9IG9iamVjdC5yYXRpbyArIFwiXCI7XHJcbiAgICAgIGV2YWxTdHIgPSBldmFsU3RyLnJlcGxhY2UoXCJicmVlZHRlXCIsIHRoaXMuR2V0QnJlZWR0ZSgpLnRvU3RyaW5nKCkpO1xyXG4gICAgICBldmFsU3RyID0gZXZhbFN0ci5yZXBsYWNlKFwibGVuZ3RlXCIsIHRoaXMuR2V0TGVuZ3RlKCkudG9TdHJpbmcoKSk7XHJcbiAgICAgIGV2YWxTdHIgPSBldmFsU3RyLnJlcGxhY2UoXCJ2b2VnYnJlZWR0ZVwiLCB0aGlzLlN0b290dm9lZy50b1N0cmluZygpKTtcclxuXHJcbiAgICAgIGlmIChldmFsKGV2YWxTdHIpKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHZhciBtZXNzYWdlID0gdGhpcy5UcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LlJhdGlvV2FybmluZyk7XHJcbiAgICAgICAgbWVzc2FnZSArPSBcIlxcclxcblwiO1xyXG4gICAgICAgIG1lc3NhZ2UgKz0gXCJcXHJcXG5cIjtcclxuICAgICAgICBtZXNzYWdlICs9IHRoaXMuVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5QaWNrZWRCb25kKSArIFwiOiBcIiArIHRoaXMuVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LlByb2R1Y3QsIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuTmFtZSwgdmVyYmFuZC5pZCk7XHJcbiAgICAgICAgbWVzc2FnZSArPSBcIlxcclxcblwiO1xyXG4gICAgICAgIG1lc3NhZ2UgKz0gdGhpcy5UcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LlJhdGlvQm9uZCkgKyBcIjogXCIgKyBvYmplY3QucmF0aW87XHJcbiAgICAgICAgbWVzc2FnZSArPSBcIlxcclxcblwiO1xyXG4gICAgICAgIG1lc3NhZ2UgKz0gXCJcXHJcXG5cIjtcclxuICAgICAgICBtZXNzYWdlICs9IHRoaXMuVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5TdG9uZUxlbmd0ZSkgKyBcIjogXCIgKyB0aGlzLkdldExlbmd0ZSgpO1xyXG4gICAgICAgIG1lc3NhZ2UgKz0gXCJcXHJcXG5cIjtcclxuICAgICAgICBtZXNzYWdlICs9IHRoaXMuVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5TdG9uZVdpZHRoKSArIFwiOiBcIiArIHRoaXMuR2V0QnJlZWR0ZSgpO1xyXG4gICAgICAgIG1lc3NhZ2UgKz0gXCJcXHJcXG5cIjtcclxuICAgICAgICBtZXNzYWdlICs9IHRoaXMuVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5TdG9vdHZvZWcpICsgXCI6IFwiICsgdGhpcy5TdG9vdHZvZWc7XHJcbiAgICAgICAgbWVzc2FnZSArPSBcIlxcclxcblwiO1xyXG4gICAgICAgIG1lc3NhZ2UgKz0gXCJcXHJcXG5cIjtcclxuICAgICAgICBtZXNzYWdlICs9IHRoaXMuVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5TdG9uZUNvbXBsZXRlKSArIFwiOiBcIiArIGV2YWxTdHI7XHJcblxyXG4gICAgICAgIGFsZXJ0KG1lc3NhZ2UpO1xyXG5cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cblxuICBwdWJsaWMgVGV4dHV1ckdlbmVyZXJlbigpOiB2b2lkIHtcclxuXHJcbiAgICB2YXIgdmFsaWQgPSB0cnVlO1xyXG5cclxuICAgIGlmICh0aGlzLklzUmF0aW9CbG9ja2luZygpKSB7XHJcbiAgICAgIHZhbGlkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHZhbGlkKSB7XHJcbiAgICAgIHZhciBzdG9uZXMgPSB0aGlzLkdldFNlbGVjdGVkU3RvbmVPYmplY3RzKCk7XHJcbiAgICAgIHZhciBhbGxzdG9uZXMgPSBuZXcgQXJyYXk8RmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWw+KCk7XHJcblxyXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0b25lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmIChzdG9uZXNbaV0uc2VsZWN0ZWRkb3VibGUpIHtcclxuICAgICAgICAgIGlmIChzdG9uZXMubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAgICAgc3RvbmVzW2ldLm9wdGlvbnNbMF0ubWl4UmF0aW8gPSA1MDtcclxuICAgICAgICAgICAgc3RvbmVzW2ldLm9wdGlvbnNbMV0ubWl4UmF0aW8gPSA1MDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBzdG9uZXNbaV0ub3B0aW9uc1swXS5taXhSYXRpbyA9IHN0b25lc1tpXS5taXhSYXRpbyAvIDI7XHJcbiAgICAgICAgICAgIHN0b25lc1tpXS5vcHRpb25zWzFdLm1peFJhdGlvID0gc3RvbmVzW2ldLm1peFJhdGlvIC8gMjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBpZiAoc3RvbmVzLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgICAgIHN0b25lc1tpXS5vcHRpb25zWzBdLm1peFJhdGlvID0gMTAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHN0b25lc1tpXS5vcHRpb25zWzBdLm1peFJhdGlvID0gc3RvbmVzW2ldLm1peFJhdGlvO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYWxsc3RvbmVzLnB1c2goc3RvbmVzW2ldLm9wdGlvbnNbMF0pO1xyXG5cclxuICAgICAgICBpZiAoc3RvbmVzW2ldLnNlbGVjdGVkZG91YmxlKSB7XHJcbiAgICAgICAgICBhbGxzdG9uZXMucHVzaChzdG9uZXNbaV0ub3B0aW9uc1sxXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoYWxsc3RvbmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLkxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHZhciByZXF1ZXN0ID0gbmV3IFRleHR1cmVSZXF1ZXN0TW9kZWwoKTtcclxuXHJcbiAgICAgICAgcmVxdWVzdC52ZXJiYW5kSWQgPSB0aGlzLlNlbGVjdGVkVmVyYmFuZElkO1xyXG4gICAgICAgIHJlcXVlc3Quc3RlZW5JZCA9IGFsbHN0b25lc1swXS5pZDtcclxuICAgICAgICByZXF1ZXN0LnN0ZWVuUmF0aW8gPSBhbGxzdG9uZXNbMF0ubWl4UmF0aW87XHJcbiAgICAgICAgcmVxdWVzdC52b2VnSWQgPSB0aGlzLlNlbGVjdGVkVm9lZ0lkO1xyXG4gICAgICAgIHJlcXVlc3QuaGlnaFJlc29sdXRpb24gPSB0aGlzLkhpUmVzO1xyXG4gICAgICAgIHJlcXVlc3Quc2hhZHV3ID0gdGhpcy5TaGFkZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuSGlSZXMpIHtcclxuICAgICAgICAgIHJlcXVlc3QubWluQWFudGFsQml0bWFwID0gMTAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHJlcXVlc3QubWluQWFudGFsQml0bWFwID0gdGhpcy5BYW50YWxTdGVuZW47XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgaWYgKGFsbHN0b25lcy5sZW5ndGggPCAyKSB7XHJcbiAgICAgICAgICByZXF1ZXN0LnN0ZWVuMklkID0gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgcmVxdWVzdC5zdGVlbjJJZCA9IGFsbHN0b25lc1sxXS5pZDtcclxuICAgICAgICAgIHJlcXVlc3Quc3RlZW4yUmF0aW8gPSBhbGxzdG9uZXNbMV0ubWl4UmF0aW87XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYWxsc3RvbmVzLmxlbmd0aCA8IDMpIHtcclxuICAgICAgICAgIHJlcXVlc3Quc3RlZW4zSWQgPSAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICByZXF1ZXN0LnN0ZWVuM0lkID0gYWxsc3RvbmVzWzJdLmlkO1xyXG4gICAgICAgICAgcmVxdWVzdC5zdGVlbjNSYXRpbyA9IGFsbHN0b25lc1syXS5taXhSYXRpbztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhbGxzdG9uZXMubGVuZ3RoIDwgNCkge1xyXG4gICAgICAgICAgcmVxdWVzdC5zdGVlbjRJZCA9IC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHJlcXVlc3Quc3RlZW40SWQgPSBhbGxzdG9uZXNbM10uaWQ7XHJcbiAgICAgICAgICByZXF1ZXN0LnN0ZWVuNFJhdGlvID0gYWxsc3RvbmVzWzNdLm1peFJhdGlvO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGFsbHN0b25lcy5sZW5ndGggPCA1KSB7XHJcbiAgICAgICAgICByZXF1ZXN0LnN0ZWVuNUlkID0gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgcmVxdWVzdC5zdGVlbjVJZCA9IGFsbHN0b25lc1s0XS5pZDtcclxuICAgICAgICAgIHJlcXVlc3Quc3RlZW41UmF0aW8gPSBhbGxzdG9uZXNbNF0ubWl4UmF0aW87XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5TdG9vdHZvZWcgPCB0aGlzLlN0b290dm9lZ01pbikge1xyXG4gICAgICAgICAgdGhpcy5TdG9vdHZvZWcgPSB0aGlzLlN0b290dm9lZ01pbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLlN0b290dm9lZyA+IHRoaXMuU3Rvb3R2b2VnTWF4KSB7XHJcbiAgICAgICAgICB0aGlzLlN0b290dm9lZyA9IHRoaXMuU3Rvb3R2b2VnTWF4O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVxdWVzdC5icmVlZHRlU3Rvb3R2b2VnID0gdGhpcy5TdG9vdHZvZWc7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLkxpbnR2b2VnIDwgdGhpcy5MaW50dm9lZ01pbikge1xyXG4gICAgICAgICAgdGhpcy5MaW50dm9lZyA9IHRoaXMuTGludHZvZWdNaW47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5MaW50dm9lZyA+IHRoaXMuTGludHZvZWdNYXgpIHtcclxuICAgICAgICAgIHRoaXMuTGludHZvZWcgPSB0aGlzLkxpbnR2b2VnTWF4O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVxdWVzdC5ob29ndGVMaW50dm9lZyA9IHRoaXMuTGludHZvZWc7XHJcblxyXG4gICAgICAgIHRoaXMuVGV4dHVyZUFwaUNsaWVudC5nZXRUZXh0dXJlKHJlcXVlc3QpLnN1YnNjcmliZSgobW9kZWw6IFRleHR1cmVSZXNwb25zZU1vZGVsKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLlRleHR1cmVSZXNwb25zZU1vZGVsID0gbW9kZWw7XHJcbiAgICAgICAgICB0aGlzLkxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9LCAoZXJyb3I6IFJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IDQwMClcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IuanNvbigpKTtcclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cmVkJyk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLkxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cblxuICBwdWJsaWMgT3BlbkZvcm0oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuSGFzVG9GaWxsRm9ybSgpKSB7XHJcbiAgICAgIHZhciBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKEZhYkZvcm1EaWFsb2dDb21wb25lbnQsIHtcclxuICAgICAgICBkYXRhOiB7XHJcbiAgICAgICAgICBmb3JtOiB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblNldHRpbmdzVmlld01vZGVsLmRvd25sb2FkRm9ybVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblZpZXdNb2RlbC5oYXNGaWxsZWRGb3Jtcykge1xyXG5cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cblxuICBwdWJsaWMgU2V0TWl4UmF0aW9zKCk6IHZvaWQge1xuICAgIHRoaXMuVXBkYXRlUmF0aW9zKG51bGwsIG51bGwsIG51bGwpO1xyXG4gIH1cblxuICBwdWJsaWMgRGlzYWJsZTc1KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLkdldFNlbGVjdGVkU3RvbmVPYmplY3RzKCkubGVuZ3RoIDwgMztcclxuICB9XG5cbiAgcHVibGljIERpc2FibGU1MCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5HZXRTZWxlY3RlZFN0b25lT2JqZWN0cygpLmxlbmd0aCA8IDQ7XHJcbiAgfVxuXG4gIHB1YmxpYyBVcGRhdGVSYXRpb3Moc3RvbmU6IFN0b25lUm93T2JqZWN0IHwgbnVsbCwgb3B0aW9uOiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCB8IG51bGwsIHZhbHVlOiBhbnkgfCBudWxsKTogdm9pZCB7XG4gICAgdmFyIHN0b25lcyA9IHRoaXMuR2V0U2VsZWN0ZWRTdG9uZU9iamVjdHMoKTtcbiAgICB0aGlzLk1peFJhdGlvU2VsZWN0ID0gdHJ1ZTtcblxuICAgIHZhciBzdGVlbiA9IG51bGw7XG4gICAgdmFyIHNlbGVjdGVkcmF0aW8gPSBudWxsO1xuXG4gICAgaWYgKHN0b25lICE9IG51bGwgJiYgb3B0aW9uICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgc3RlZW4gPSBzdG9uZS5HZXRTdG9uZUZvcm1hYXRPYmplY3Qob3B0aW9uKTtcclxuXHJcbiAgICAgIGlmIChzdGVlbiAhPSBudWxsKSB7XHJcbiAgICAgICAgc3RlZW4ubWl4UmF0aW8gPSB2YWx1ZTtcclxuICAgICAgICBzZWxlY3RlZHJhdGlvID0gc3RlZW4ubWl4UmF0aW87XHJcbiAgICAgIH1cclxuICAgIH1cblxuICAgIGlmIChzdG9uZXMubGVuZ3RoICE9IDApIHtcbiAgICAgIGlmICh0aGlzLklzVGV4dHVyZU1peDI1KCkpIHtcbiAgICAgICAgaWYgKHN0b25lcy5sZW5ndGggPiAzKSB7XHJcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0b25lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBzdG9uZXNbaV0ubWl4UmF0aW8gPSAyNTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLk1peFJhdGlvU2VsZWN0ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHN0b25lcy5sZW5ndGggPT0gMykge1xyXG4gICAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0b25lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoc3RvbmVzW2ldICE9IHN0ZWVuKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkcmF0aW8gPT0gNTApIHtcclxuICAgICAgICAgICAgICAgIHN0b25lc1tpXS5taXhSYXRpbyA9IDI1O1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChmaXJzdCkge1xyXG4gICAgICAgICAgICAgICAgICBzdG9uZXNbaV0ubWl4UmF0aW8gPSA1MDtcclxuICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBzdG9uZXNbaV0ubWl4UmF0aW8gPSAyNTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLk1peFJhdGlvU2VsZWN0ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHN0b25lcy5sZW5ndGggPT0gMikge1xyXG4gICAgICAgICAgdmFyIGZpcnN0ID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0b25lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoc3RvbmVzW2ldICE9IHN0ZWVuKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkcmF0aW8gPT0gNzUpIHtcclxuICAgICAgICAgICAgICAgIHN0b25lc1tpXS5taXhSYXRpbyA9IDI1O1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIGlmIChzZWxlY3RlZHJhdGlvID09IDUwKSB7XHJcbiAgICAgICAgICAgICAgICBzdG9uZXNbaV0ubWl4UmF0aW8gPSA1MDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSBpZiAoc2VsZWN0ZWRyYXRpbyA9PSAyNSkge1xyXG4gICAgICAgICAgICAgICAgc3RvbmVzW2ldLm1peFJhdGlvID0gNzU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3RvbmVzW2ldLm1peFJhdGlvID0gNTA7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5NaXhSYXRpb1NlbGVjdCA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIC8vZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLlN0b25lUm93T2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLlN0b25lUm93T2JqZWN0c1tpXS5vcHRpb25zLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgLy8gICAgZm9yICh2YXIgcyA9IDA7IHMgPCBzdG9uZXMubGVuZ3RoOyBzKyspIHtcclxuICAgICAgICAvLyAgICAgIGlmICh0aGlzLlN0b25lUm93T2JqZWN0c1tpXS5vcHRpb25zW2pdLkNvbnRhaW5zKHN0b25lc1tzXS5pZCkpIHtcclxuICAgICAgICAvLyAgICAgICAgdGhpcy5TdG9uZVJvd09iamVjdHNbaV0ub3B0aW9uc1tqXS5taXhSYXRpbyA9IE1hdGgucm91bmQoMTAwIC8gc3RvbmVzLmxlbmd0aCk7XHJcbiAgICAgICAgLy8gICAgICB9XHJcbiAgICAgICAgLy8gICAgfVxyXG4gICAgICAgIC8vICB9XHJcbiAgICAgICAgLy99XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XG5cbiAgcHVibGljIFVwZGF0ZURpc2FibGVEdWl0c1dpbGR2ZXJiYW5kKCk6IHZvaWQge1xyXG4gICAgdGhpcy5EaXNhYmxlRHVpdHNXaWxkdmVyYmFuZCA9IGZhbHNlO1xyXG5cclxuICAgIGlmICh0aGlzLlNlbGVjdGVkRm9ybWFhdD8ubmFtZSAhPSBudWxsKSB7XHJcbiAgICAgIGlmICh0aGlzLlNlbGVjdGVkRm9ybWFhdC5uYW1lPy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJtb2R1dWxcIikgIT0gLTEpIHtcclxuICAgICAgICB0aGlzLkRpc2FibGVEdWl0c1dpbGR2ZXJiYW5kID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuU2VsZWN0ZWRWZXJiYW5kSWQgPT0gNzApIHtcclxuICAgICAgICAgIHRoaXMuU2VsZWN0ZWRWZXJiYW5kSWQgPSA2MjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XG5cbiAgcHVibGljIEdldEZvcm1hYXRTdHIoKTogc3RyaW5nIHtcbiAgICB2YXIgc3RvbmVzID0gdGhpcy5HZXRTZWxlY3RlZFN0b25lcygpO1xuXG4gICAgaWYgKHN0b25lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHZhciBuYW1lOiBzdHJpbmcgPSBzdG9uZXNbMF0ubmFtZSArIFwiXCI7XHJcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhuYW1lLmluZGV4T2YoJygnKSkgKyBcIlwiO1xyXG5cclxuICAgICAgaWYgKG5hbWUuaW5kZXhPZihcInZvb3J6aWpkZVwiKSAhPSAtMSkge1xyXG4gICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoXCIgKHZvb3J6aWpkZSlcIiwgXCJcIik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChuYW1lLmluZGV4T2YoXCJhY2h0ZXJ6aWpkZVwiKSAhPSAtMSkge1xyXG4gICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoXCIgKGFjaHRlcnppamRlKVwiLCBcIlwiKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIG5hbWU7XHJcbiAgICB9XG5cclxuICAgIHJldHVybiBcIlwiO1xyXG4gIH1cblxuICBwdWJsaWMgR2V0RGltZW5zaW9uKCk6IHN0cmluZyB7XG4gICAgdmFyIGZvcm1hYXQgPSB0aGlzLkdldEZvcm1hYXRTdHIoKTtcblxuICAgIHN3aXRjaCAoZm9ybWFhdCkge1xuICAgICAgY2FzZSBcIihub3JtYWFsZm9ybWFhdClcIjpcclxuICAgICAgICByZXR1cm4gXCIyNDB4MTE1eDcxXCI7XHJcbiAgICAgIGNhc2UgXCIoZHVubmZvcm1hYXQpXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiMjQweDExNXg1MlwiO1xyXG4gICAgICBjYXNlIFwiKG1vZHV1bGZvcm1hYXQgNTIpXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiMjkweDkweDUyXCI7XHJcbiAgICAgIGNhc2UgXCIod2FhbGZvcm1hYXQpXCI6XHJcbiAgICAgICAgcmV0dXJuIFwiMjEweDEwMHg1MlwiO1xyXG4gICAgfVxuXG4gICAgcmV0dXJuIFwiXCI7XHJcbiAgfVxuXG4gIHB1YmxpYyBHZXRLZXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5DdXN0b21JdGVtLCB1bmRlZmluZWQsIFwiS2VyblwiKTtcclxuICB9XG5cbiAgcHVibGljIEdldExTVG9vbHRpcCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLlRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuQ3VzdG9tSXRlbSwgdW5kZWZpbmVkLCBcIkxTXCIpO1xyXG4gIH1cblxuICBwdWJsaWMgR2V0V1NUb29sdGlwKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5DdXN0b21JdGVtLCB1bmRlZmluZWQsIFwiV1NcIik7XHJcbiAgfVxuXG4gIHB1YmxpYyBHZXRMZW5ndGUoKTogbnVtYmVyIHtcbiAgICB2YXIgZm9ybWFhdCA9IHRoaXMuR2V0Rm9ybWFhdFN0cigpO1xuXG4gICAgc3dpdGNoIChmb3JtYWF0KSB7XG4gICAgICBjYXNlIFwiKG5vcm1hYWxmb3JtYWF0KVwiOlxyXG4gICAgICAgIHJldHVybiAyNDA7XHJcbiAgICAgIGNhc2UgXCIoZHVubmZvcm1hYXQpXCI6XHJcbiAgICAgICAgcmV0dXJuIDI0MDtcclxuICAgICAgY2FzZSBcIihtb2R1dWxmb3JtYWF0IDUyKVwiOlxyXG4gICAgICAgIHJldHVybiAyOTA7XHJcbiAgICAgIGNhc2UgXCIod2FhbGZvcm1hYXQpXCI6XHJcbiAgICAgICAgcmV0dXJuIDIxMDtcclxuICAgIH1cblxuICAgIHJldHVybiAtMTtcclxuICB9XG5cbiAgcHVibGljIEdldEJyZWVkdGUoKTogbnVtYmVyIHtcbiAgICB2YXIgZm9ybWFhdCA9IHRoaXMuR2V0Rm9ybWFhdFN0cigpO1xuXG4gICAgc3dpdGNoIChmb3JtYWF0KSB7XG4gICAgICBjYXNlIFwiKG5vcm1hYWxmb3JtYWF0KVwiOlxyXG4gICAgICAgIHJldHVybiAxMTU7XHJcbiAgICAgIGNhc2UgXCIoZHVubmZvcm1hYXQpXCI6XHJcbiAgICAgICAgcmV0dXJuIDExNTtcclxuICAgICAgY2FzZSBcIihtb2R1dWxmb3JtYWF0IDUyKVwiOlxyXG4gICAgICAgIHJldHVybiA5MDtcclxuICAgICAgY2FzZSBcIih3YWFsZm9ybWFhdClcIjpcclxuICAgICAgICByZXR1cm4gMTAwO1xyXG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xyXG4gIH1cblxuICBwdWJsaWMgSXNBbmRlcnMobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBpZiAobmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJkdWJiZWxcIikgIT0gLTEpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwiMzY1XCIpICE9IC0xKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChuYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcIm1vZHV1bGZvcm1hYXQgNDBcIikgIT0gLTEpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cbn1cblxuY2xhc3MgU3RvbmVSb3dPYmplY3Qge1xuICBuYW1lOiBzdHJpbmc7XHJcblxyXG4gIG9wdGlvbnM6IFN0b25lRm9ybWFhdE9iamVjdFtdID0gbmV3IEFycmF5PFN0b25lRm9ybWFhdE9iamVjdD4oKTtcclxuXHJcbiAgcHJpdmF0ZSBGYWJyaWthbnRlblNlcnZpY2U6IEZhYnJpa2FudGVuU2VydmljZTtcclxuICBwdWJsaWMgRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudDogRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudDtcclxuXHJcbiAgY29uc3RydWN0b3IobmFtZTogc3RyaW5nLCBGYWJyaWthbnRlblNlcnZpY2U6IEZhYnJpa2FudGVuU2VydmljZSwgRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudDogRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudCkge1xyXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcclxuICAgIHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlID0gRmFicmlrYW50ZW5TZXJ2aWNlO1xyXG4gICAgdGhpcy5GYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50ID0gRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBTZWxlY3Qob3B0aW9uOiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLkNhblNlbGVjdFN0b25lKG9wdGlvbikpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdmFyIG5hbWUgPSB0aGlzLm9wdGlvbnNbaV0ubmFtZTtcclxuXHJcbiAgICAgICAgaWYgKChuYW1lICE9IG51bGwgJiYgb3B0aW9uLm5hbWUgIT0gbnVsbCAmJiBuYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihvcHRpb24ubmFtZS50b0xvd2VyQ2FzZSgpKSAhPSAtMSAmJiBuYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcImR1YmJlbFwiKSA9PSAtMSkgfHxcclxuICAgICAgICAgIChvcHRpb24ubmFtZSEudG9Mb3dlckNhc2UoKSA9PSBcImFuZGVyc1wiICYmICh0aGlzLkZhYlRleHR1cmVDb25maWd1cmF0b3JDb21wb25lbnQuSXNBbmRlcnMobmFtZSkpKSkge1xyXG5cclxuICAgICAgICAgIHRoaXMub3B0aW9uc1tpXS5zZWxlY3RlZCA9ICF0aGlzLm9wdGlvbnNbaV0uc2VsZWN0ZWQ7XHJcbiAgICAgICAgICB0aGlzLm9wdGlvbnNbaV0uc2VsZWN0ZWRkb3VibGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zW2ldLnNlbGVjdGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudC5TZWxlY3RlZEZvcm1hYXQgPSBvcHRpb247XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudC5Ob1N0b25lU2VsZWN0ZWQoKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudC5TZWxlY3RlZEZvcm1hYXQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5GYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50LlVwZGF0ZURpc2FibGVEdWl0c1dpbGR2ZXJiYW5kKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLkZhYlRleHR1cmVDb25maWd1cmF0b3JDb21wb25lbnQuU2V0TWl4UmF0aW9zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgQWRkT3B0aW9uKG9wdGlvbjogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwpOiB2b2lkIHtcbiAgICB2YXIgbmFtZSA9IG9wdGlvbi5uYW1lICsgXCJcIjtcblxuICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoXCIodm9vcnppamRlKVwiLCBcIlwiKTtcbiAgICBuYW1lID0gbmFtZS5yZXBsYWNlKFwiKGFjaHRlcnppamRlKVwiLCBcIlwiKTtcbiAgICBuYW1lID0gbmFtZS50cmltKCk7XG5cbiAgICB2YXIgc3RvbmVyb3cgPSBudWxsO1xuICAgIGlmIChuYW1lICE9IG51bGwpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uc1tpXS5uYW1lID09IG5hbWUpIHtcclxuICAgICAgICAgIHN0b25lcm93ID0gdGhpcy5vcHRpb25zW2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxuXG4gICAgaWYgKHN0b25lcm93ID09IG51bGwpIHtcbiAgICAgIHN0b25lcm93ID0gbmV3IFN0b25lRm9ybWFhdE9iamVjdCgpO1xyXG4gICAgICBzdG9uZXJvdy5uYW1lID0gbmFtZSArIFwiXCI7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5wdXNoKHN0b25lcm93KTtcclxuICAgIH1cblxuICAgIHN0b25lcm93LkFkZFN0b25lKG9wdGlvbik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgQ2FuU2VsZWN0U3RvbmUob3B0aW9uOiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCk6IGJvb2xlYW4ge1xuICAgIHZhciBhbW91bnQgPSB0aGlzLkZhYlRleHR1cmVDb25maWd1cmF0b3JDb21wb25lbnQuR2V0U2VsZWN0ZWRBbW91bnQoKTtcbiAgICB2YXIgb3RoZXIgPSB0aGlzLkZhYlRleHR1cmVDb25maWd1cmF0b3JDb21wb25lbnQuSXNPdGhlclNlbGVjdGVkKCk7XG5cbiAgICBpZiAoYW1vdW50ID09IDQgfHwgb3RoZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLklzU2VsZWN0ZWQob3B0aW9uKTtcclxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmICh0aGlzLkZhYlRleHR1cmVDb25maWd1cmF0b3JDb21wb25lbnQuU2VsZWN0ZWRGb3JtYWF0ID09IG51bGwgfHxcbiAgICAgICAgdGhpcy5GYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50LlNlbGVjdGVkRm9ybWFhdC5pZCA9PSBvcHRpb24uaWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIERpc2FibGVUb2dnbGUoKTogYm9vbGVhbiB7XG4gICAgdmFyIHN0b25lcyA9IHRoaXMuRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudC5HZXRTZWxlY3RlZFN0b25lT2JqZWN0cygpO1xuXG4gICAgcmV0dXJuIHN0b25lcy5sZW5ndGggPT0gNDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBHZXRTZWxlY3RlZFN0b25lT2JqZWN0cyhzdG9uZXM6IEFycmF5PFN0b25lRm9ybWFhdE9iamVjdD4pOiB2b2lkIHtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XG5cclxuICAgICAgaWYgKHRoaXMub3B0aW9uc1tpXS5zZWxlY3RlZCkge1xyXG4gICAgICAgIHN0b25lcy5wdXNoKHRoaXMub3B0aW9uc1tpXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBHZXRTdG9uZUZvcm1hYXRPYmplY3Qob3B0aW9uOiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCk6IFN0b25lRm9ybWFhdE9iamVjdCB8IG51bGwge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHZhciBuYW1lID0gdGhpcy5vcHRpb25zW2ldLm5hbWU7XHJcbiAgICAgIGlmIChvcHRpb24ubmFtZSEudG9Mb3dlckNhc2UoKSA9PSBcImFuZGVyc1wiKSB7XHJcbiAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudC5Jc0FuZGVycyhuYW1lKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zW2ldO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBpZiAobmFtZSAhPSBudWxsICYmIG9wdGlvbi5uYW1lICE9IG51bGwgJiYgbmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2Yob3B0aW9uLm5hbWUudG9Mb3dlckNhc2UoKSkgIT0gLTEgJiYgbmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJkdWJiZWxcIikgPT0gLTEpIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNbaV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBIYXNTdG9uZShvcHRpb246IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsKTogYm9vbGVhbiB7XG4gICAgdmFyIHN0b25lID0gdGhpcy5HZXRTdG9uZUZvcm1hYXRPYmplY3Qob3B0aW9uKTtcblxuICAgIGlmIChzdG9uZSAhPSBudWxsKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBJc0RvdXZsZUFWKG9wdGlvbjogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwpOiBib29sZWFuIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICB2YXIgbmFtZSA9IHRoaXMub3B0aW9uc1tpXS5uYW1lO1xyXG4gICAgICBpZiAobmFtZSAhPSBudWxsICYmIG9wdGlvbi5uYW1lICE9IG51bGwgJiYgbmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2Yob3B0aW9uLm5hbWUudG9Mb3dlckNhc2UoKSkgIT0gLTEpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zW2ldLmRvdWJsZWF2O1xyXG4gICAgICB9XHJcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgSGFzU3RvbmVTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAodGhpcy5vcHRpb25zW2ldLnNlbGVjdGVkKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBJc0FueVNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnNbaV0uc2VsZWN0ZWQpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIElzU2VsZWN0ZWQob3B0aW9uOiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCk6IGJvb2xlYW4ge1xuICAgIHZhciBzdG9uZSA9IHRoaXMuR2V0U3RvbmVGb3JtYWF0T2JqZWN0KG9wdGlvbik7XG5cbiAgICBpZiAoc3RvbmUgIT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gc3RvbmUuc2VsZWN0ZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIEdldEltYWdlKG9wdGlvbjogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwpOiBzdHJpbmcge1xuICAgIHZhciBzdG9uZSA9IHRoaXMuR2V0U3RvbmUob3B0aW9uKTtcblxuICAgIGlmIChzdG9uZS5pZCAhPSAwKSB7XG4gICAgICB2YXIgdmFsdWUgPSBzdG9uZS5pbWFnZVBhdGggKyBcIlwiO1xyXG5cclxuICAgICAgaWYgKHZhbHVlLmluZGV4T2YoXCIjQkNCI1wiKSAhPSAtMSkge1xyXG4gICAgICAgIHZhciBiY2J1cmwgPSB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblNldHRpbmdzVmlld01vZGVsLmJjYldlYnNlcnZpY2VVUkxCYXNlICsgXCJcIjtcclxuICAgICAgICBiY2J1cmwgPSBiY2J1cmwuc3Vic3RyaW5nKDAsIGJjYnVybC5sZW5ndGggLSAxKTtcclxuXHJcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKFwiI0JDQiNcIiwgYmNidXJsKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBcIlwiO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIEdldFN0b25lKG9wdGlvbjogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwpOiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCB7XG4gICAgdmFyIHN0b25lID0gdGhpcy5HZXRTdG9uZUZvcm1hYXRPYmplY3Qob3B0aW9uKTtcblxuICAgIGlmIChzdG9uZSAhPSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBzdG9uZS5vcHRpb25zWzBdO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBHZXRTZWxlY3RlZFN0b25lcyhzdG9uZXM6IEFycmF5PEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsPik6IHZvaWQge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMub3B0aW9uc1tpXS5HZXRTZWxlY3RlZFN0b25lcyhzdG9uZXMpO1xyXG4gICAgfVxyXG4gIH1cclxufVxuXG5jbGFzcyBTdG9uZUZvcm1hYXRPYmplY3Qge1xuICBwdWJsaWMgbmFtZTogc3RyaW5nID0gXCJcIjtcclxuICBwdWJsaWMgbWl4UmF0aW86IG51bWJlciA9IDA7XHJcbiAgcHVibGljIHNlbGVjdGVkTWl4UmF0aW86IG51bWJlciA9IDA7XHJcbiAgcHVibGljIHNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIG9wdGlvbnM6IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsW10gPSBuZXcgQXJyYXk8RmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWw+KCk7XHJcbiAgcHVibGljIGRvdWJsZWF2OiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHNlbGVjdGVkZG91YmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgcHVibGljIENvbnRhaW5zKGlkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnNbaV0uaWQgPT0gaWQpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBBZGRTdG9uZShzdG9uZTogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwpOiB2b2lkIHtcclxuICAgIHRoaXMub3B0aW9ucy5wdXNoKHN0b25lKTtcclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmxlbmd0aCA+IDEpIHtcclxuICAgICAgdGhpcy5kb3VibGVhdiA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sZW5ndGggPiAxKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgLy8gcmV0dXJuIDwgMCDihpIgYSB2w7PDs3IgYlxyXG4gICAgICAgIC8vIHJldHVybiA+IDAg4oaSIGEgbsOhIGJcclxuICAgICAgICAvLyByZXR1cm4gMCDihpIgZ2VsaWprXHJcbiAgICAgICAgaWYgKChhLm5hbWUgKyBcIlwiKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJhY2h0ZXJ6aWpkZVwiKSAhPSAtMSkge1xyXG4gICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0U2VsZWN0ZWRTdG9uZXMoc3RvbmVzOiBBcnJheTxGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbD4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZCkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRkb3VibGUpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgc3RvbmVzLnB1c2godGhpcy5vcHRpb25zW2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBzdG9uZXMucHVzaCh0aGlzLm9wdGlvbnNbMF0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XG4iLCI8ZGl2ICpuZ0lmPVwiSXNMb2FkaW5nKClcIiBjbGFzcz1cImxvYWRlclwiPlxyXG4gIDxtYXQtY2FyZCBjbGFzcz1cImxvYWRlci1jYXJkXCI+XHJcbiAgICA8bWF0LWNhcmQtY29udGVudD5cclxuICAgICAgPG1hdC1zcGlubmVyIGNsYXNzPVwibG9hZGVyLXNwaW5uZXJcIiBbZGlhbWV0ZXJdPVwiODBcIj48L21hdC1zcGlubmVyPlxyXG4gICAgPC9tYXQtY2FyZC1jb250ZW50PlxyXG4gICAgPG1hdC1jYXJkLXN1YnRpdGxlIGNsYXNzPVwibG9hZGVyLXN1YnRpdGxlXCIgKm5nSWY9XCIhRmFicmlrYW50ZW5TZXJ2aWNlLklzU3RhcnRpbmdEb3dubG9hZCgpXCI+XHJcbiAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuUHJvZHVjdHNMb2FkaW5nKSB9fVxyXG4gICAgPC9tYXQtY2FyZC1zdWJ0aXRsZT5cclxuICA8L21hdC1jYXJkPlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgKm5nSWY9XCIhSXNMb2FkaW5nKClcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XHJcbiAgPGRpdiBzdHlsZT1cImZsZXg6YXV0bztcIj48L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiY2VudGVyLWJsb2NrXCI+XHJcbiAgICA8bmctY29udGFpbmVyIGNsYXNzPVwidGFibGUtY29udGFpbmVyXCIgKm5nSWY9XCIhdGhpcy5TaW5nbGVTdG9uZU1vZGVcIj5cclxuICAgICAgPHRhYmxlIGNsYXNzPVwibWFpbi10YWJsZVwiPlxyXG4gICAgICAgIDx0ciBjbGFzcz1cIm1haW4tdGFibGUtdG9wLXJvd1wiPlxyXG4gICAgICAgICAgPHRkIGNsYXNzPVwibWFpbi10YWJsZS10b3Atcm93LWZpcnN0IG1haW4tdGFibGUtdG9wLXJvdy10ZFwiPjwvdGQ+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgR2V0Rm9ybWFhdCgpXCI+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cIm1haW4tdGFibGUtdG9wLXJvdy1vdGhlciBtYWluLXRhYmxlLXRvcC1yb3ctdGRcIj5cclxuICAgICAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuRmlsdGVyT3B0aW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5Lk5hbWUsIG9wdGlvbi5pZCkgfX1cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3RvbmUgb2YgU3RvbmVSb3dPYmplY3RzXCI+XHJcbiAgICAgICAgICA8dHIgY2xhc3M9XCJtYWluLXRhYmxlLXJvd1wiPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJtYWluLXRhYmxlLXJvdy10ZCBtYWluLXRhYmxlLXJvdy10ZC1maXJzdFwiPlxyXG4gICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFpbi10YWJsZS1yb3ctdGQtbmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBzdG9uZS5uYW1lIH19XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIEdldEZvcm1hYXQoKVwiPlxyXG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cIm1haW4tdGFibGUtcm93LXRkIG1haW4tdGFibGUtcm93LXRkLWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdG9uZS5IYXNTdG9uZShvcHRpb24pXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0b25lLXRpbGVcIiAoY2xpY2spPVwic3RvbmUuU2VsZWN0KG9wdGlvbilcIiBbY2xhc3Muc2VsZWN0ZWRdPVwic3RvbmUuSXNTZWxlY3RlZChvcHRpb24pXCIgW2NsYXNzLm5vdC1zZWxlY3RhYmxlXT1cIiFzdG9uZS5DYW5TZWxlY3RTdG9uZShvcHRpb24pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2Vybi1kaXZcIiAqbmdJZj1cIlNob3dLZXJuKHN0b25lLCBvcHRpb24pXCI+e3sgR2V0S2VybigpIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RpY2tlci1kaXZcIiAqbmdJZj1cIlNob3dTdGlja2VyKHN0b25lLCBvcHRpb24pXCI+e3sgR2V0U3RpY2tlcihzdG9uZSwgb3B0aW9uKSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cInN0b25lLkdldEltYWdlKG9wdGlvbilcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaXgtYmxvY2tcIiAqbmdJZj1cIkdldFNlbGVjdGVkU3RvbmVPYmplY3RzKCkubGVuZ3RoID4gMSAmJiBzdG9uZS5Jc1NlbGVjdGVkKG9wdGlvbilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhSXNUZXh0dXJlTWl4MjUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIiBjbGFzcz1cInNtYWxsLWlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peCAlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJudW1iZXJcIiBtaW49XCIxXCIgbWF4PVwiMTAwXCIgWyhuZ01vZGVsKV09XCJzdG9uZS5HZXRTdG9uZShvcHRpb24pLm1peFJhdGlvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJJc1RleHR1cmVNaXgyNSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiIGNsYXNzPVwiZnVsbHdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbCBjbGFzcz1cInNlbGVjdC1tYXQtbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peCAlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN0b25lLkdldFN0b25lRm9ybWFhdE9iamVjdChvcHRpb24pIGFzIGZvcm1hYXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IFt2YWx1ZV09XCJmb3JtYWF0Lm1peFJhdGlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiVXBkYXRlUmF0aW9zKHN0b25lLCBvcHRpb24sICRldmVudC52YWx1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjI1XCI+MjUlPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cIkRpc2FibGU1MCgpXCIgW3ZhbHVlXT1cIjUwXCI+NTAlPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cIkRpc2FibGU3NSgpXCIgW3ZhbHVlXT1cIjc1XCI+NzUlPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInN0b25lLklzRG91dmxlQVYob3B0aW9uKVwiIGNsYXNzPVwibHN3cy1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsc3dzLWl0ZW1cIiBtYXRUb29sdGlwQ2xhc3M9XCJmaWx0ZXItdG9vbHRpcFwiIG1hdFRvb2x0aXA9XCJ7eyBHZXRMU1Rvb2x0aXAoKSB9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibHN3cy1pdGVtLXRleHRcIj5MUzwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+aW5mbzwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsc3dzLWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGUgWyhuZ01vZGVsKV09XCJzdG9uZS5HZXRTdG9uZUZvcm1hYXRPYmplY3Qob3B0aW9uKS5zZWxlY3RlZGRvdWJsZVwiIFtkaXNhYmxlZF09XCJzdG9uZS5EaXNhYmxlVG9nZ2xlKClcIj48L21hdC1zbGlkZS10b2dnbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsc3dzLWl0ZW1cIiBtYXRUb29sdGlwQ2xhc3M9XCJmaWx0ZXItdG9vbHRpcFwiIG1hdFRvb2x0aXA9XCJ7eyBHZXRXU1Rvb2x0aXAoKSB9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibHN3cy1pdGVtLXRleHRcIj5XUzwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+aW5mbzwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgPGRpdiBjbGFzcz1cInRleHR1cmUtY29udGFpbmVyXCIgW2NsYXNzLnRleHR1cmUtY29udGFpbmVyLW1hcmdpbl09XCJ0aGlzLlNpbmdsZVN0b25lTW9kZVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidGV4dHVyZS1jb250YWluZXItZmx5XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImRpc3BsYXlmbGV4XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcG9uZW50LWJsb2NrIGZpcnN0LXJvd1wiPlxyXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIiBjbGFzcz1cImZ1bGx3aWR0aFwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJzZWxlY3QtbWF0LWxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LlZlcmJhbmQpIH19XHJcbiAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJTZWxlY3RlZFZlcmJhbmRJZFwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QtdHJpZ2dlcj5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIlNlbGVjdGVkVmVyYmFuZElkIGFzIGlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIkdldFZlcmJhbmRCeUlkKGlkKSBhcyB2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdC10cmlnZ2VyLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWx0ZXItb3B0aW9uLWltYWdlLW1pbmktZGl2XCIgKm5nSWY9XCJ2LmltYWdlUGF0aFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJHZXRJbWFnZVBhdGhQcm9kdWN0KHYpXCIgY2xhc3M9XCJmaWx0ZXItb3B0aW9uLWltYWdlXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdC10cmlnZ2VyLWNvbnRlbnQtdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Qcm9kdWN0LCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5Lk5hbWUsIHYuaWQpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3QtdHJpZ2dlcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2ZXJiYW5kIG9mIEdldFZlcmJhbmRlbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJ2ZXJiYW5kLmlkXCIgY2xhc3M9XCJzZWxlY3QtbWF0LW9wdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2ZXJiYW5kLmltYWdlUGF0aCAhPSBudWxsICYmIHZlcmJhbmQuaW1hZ2VQYXRoICE9ICcnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLW9wdGlvbi1pbWFnZS1taW5pLWRpdlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cInt7IEdldEltYWdlUGF0aFByb2R1Y3QodmVyYmFuZCkgfX1cIiBjbGFzcz1cImZpbHRlci1vcHRpb24taW1hZ2VcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LlByb2R1Y3QsIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuTmFtZSwgdmVyYmFuZC5pZCkgfX1cclxuICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBvbmVudC1ibG9jayBmaXJzdC1yb3dcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIkdldFZvZWcoKSAhPSBudWxsXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCIgY2xhc3M9XCJmdWxsd2lkdGhcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWwgY2xhc3M9XCJzZWxlY3QtbWF0LWxhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuVm9lZykgfX1cclxuICAgICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgWyhuZ01vZGVsKV09XCJTZWxlY3RlZFZvZWdJZFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdC10cmlnZ2VyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJTZWxlY3RlZFZvZWdJZCBhcyBpZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIkdldFZvZWdCeUlkKGlkKSBhcyB2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0LXRyaWdnZXItY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsdGVyLW9wdGlvbi1pbWFnZS1taW5pLWRpdlwiICpuZ0lmPVwidi5pbWFnZVBhdGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgW3NyY109XCJHZXRJbWFnZVBhdGhQcm9kdWN0KHYpXCIgY2xhc3M9XCJmaWx0ZXItb3B0aW9uLWltYWdlXCIgYWx0PVwiXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3QtdHJpZ2dlci1jb250ZW50LXRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5GaWx0ZXJPcHRpb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuTmFtZSwgdi5pZCkgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3QtdHJpZ2dlcj5cclxuXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHZvZWcgb2YgR2V0Vm9lZygpLmZpbHRlci5vcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cInZvZWcuaWRcIiBjbGFzcz1cInNlbGVjdC1tYXQtb3B0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidm9lZy5pbWFnZVBhdGggIT0gbnVsbCAmJiB2b2VnLmltYWdlUGF0aCAhPSAnJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLW9wdGlvbi1pbWFnZS1taW5pLWRpdlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwie3sgR2V0SW1hZ2VQYXRoKHZvZWcpIH19XCIgY2xhc3M9XCJmaWx0ZXItb3B0aW9uLWltYWdlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5GaWx0ZXJPcHRpb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuTmFtZSwgdm9lZy5pZCkgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBvbmVudC1ibG9ja1wiPlxyXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIiBjbGFzcz1cInNtYWxsLWlucHV0XCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuU3Rvb3R2b2VnKSB9fVxyXG4gICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwie3sgU3Rvb3R2b2VnTWluIH19XCIgbWF4PVwie3sgU3Rvb3R2b2VnTWF4IH19XCIgWyhuZ01vZGVsKV09XCJTdG9vdHZvZWdcIj5cclxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wb25lbnQtYmxvY2tcIj5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCIgY2xhc3M9XCJzbWFsbC1pbnB1dFwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LkxpbnR2b2VnKSB9fVxyXG4gICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwie3sgTGludHZvZWdNaW4gfX1cIiBtYXg9XCJ7eyBMaW50dm9lZ01heCB9fVwiIFsobmdNb2RlbCldPVwiTGludHZvZWdcIj5cclxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2xpZGVyLWJsb2NrXCIgKm5nSWY9XCIhSGlSZXNcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbGlkZXItYmxvY2stbmFtZVwiPlxyXG4gICAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LkFhbnRhbFN0ZW5lbikgfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNsaWRlci1ibG9jay1zbGlkZXJcIj5cclxuICAgICAgICAgICAgPG1hdC1zbGlkZXIgbWluPVwiMTAwXCIgbWF4PVwiMjAwMFwiIHN0ZXA9XCI1MFwiIHNob3dUaWNrTWFya3MgZGlzY3JldGUgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cclxuICAgICAgICAgICAgICA8aW5wdXQgbWF0U2xpZGVyVGh1bWIgWyhuZ01vZGVsKV09XCJBYW50YWxTdGVuZW5cIj5cclxuICAgICAgICAgICAgPC9tYXQtc2xpZGVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2xpZGVyLWJsb2NrLWFtb3VudFwiPlxyXG4gICAgICAgICAgICB7eyBBYW50YWxTdGVuZW4gfX1cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGlnaC1yZXMtY2hlY2tib3gtZGl2XCI+XHJcbiAgICAgICAgICA8bWF0LWNoZWNrYm94IFsobmdNb2RlbCldPVwiSGlSZXNcIiBjbGFzcz1cImhpZ2gtcmVzLWNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuSG9nZVJlc29sdXRpZSkgfX1cclxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGlnaC1yZXMtY2hlY2tib3gtZGl2XCI+XHJcbiAgICAgICAgICA8bWF0LWNoZWNrYm94IFsobmdNb2RlbCldPVwiU2hhZGVcIiBjbGFzcz1cImhpZ2gtcmVzLWNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuU2hhZHV3KSB9fVxyXG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b25yb3dcIj5cclxuICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cIlNpbmdsZVN0b25lTW9kZSA9IGZhbHNlO1wiIGNsYXNzPVwibGluayB0ZXh0dXVyLWtub3BcIiAqbmdJZj1cIlNpbmdsZVN0b25lTW9kZVwiPlxyXG4gICAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5Lk1peCkgfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cIlRleHR1dXJHZW5lcmVyZW4oKVwiIGNsYXNzPVwibGluayB0ZXh0dXVyLWtub3BcIiBbZGlzYWJsZWRdPVwiR2VuZXJhdGVEaXNhYmxlZCgpXCI+XHJcbiAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuVGV4dHV1ckdlbmVyZXJlbikgfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiSXNMb2FkaW5nVGV4dHVyZXMoKVwiIGNsYXNzPVwidGV4dHVyZS1sb2FkZXJcIj5cclxuICAgICAgICAgIDxtYXQtc3Bpbm5lciBjbGFzcz1cImxvYWRlci1zcGlubmVyXCIgW2RpYW1ldGVyXT1cIjgwXCI+PC9tYXQtc3Bpbm5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIlNob3dUZXh0dXJlKClcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbWFnZS1yb3dcIj5cclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiSGFzVG9GaWxsRm9ybSgpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJPcGVuRm9ybSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWFnZSBpbWFnZS1wYXRyb29uXCIgW3NyY109XCJHZXRQYXRyb29uRG93bmxvYWRVUkwoKVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY2xhc3M9XCJsaW5rIHRleHR1dXIta25vcFwiIChjbGljayk9XCJPcGVuRm9ybSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5Eb3dubG9hZFRleHR1cmUpIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNsYXNzPVwibGluayB0ZXh0dXVyLWtub3BcIiAoY2xpY2spPVwiT3BlbkZvcm0oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuRG93bmxvYWRCdW1wKSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhSGFzVG9GaWxsRm9ybSgpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8YSBbaHJlZl09XCJHZXRQYXRyb29uRG93bmxvYWRVUkwoKVwiIHRhcmdldD1cIl9ibGFua1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJpbWFnZSBpbWFnZS1wYXRyb29uXCIgW3NyY109XCJHZXRQYXRyb29uRG93bmxvYWRVUkwoKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgPGEgW2hyZWZdPVwiR2V0UGF0cm9vbkRvd25sb2FkVVJMRG93bmxvYWQoKVwiIHRhcmdldD1cIl9ibGFua1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gY2xhc3M9XCJsaW5rIHRleHR1dXIta25vcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3sgVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5Eb3dubG9hZFRleHR1cmUpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgPGEgW2hyZWZdPVwiR2V0QnVtcERvd25sb2FkVVJMKClcIiB0YXJnZXQ9XCJfYmxhbmtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNsYXNzPVwibGluayB0ZXh0dXVyLWtub3BcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuRG93bmxvYWRCdW1wKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IHN0eWxlPVwiZmxleDphdXRvO1wiPjwvZGl2PlxyXG48L2Rpdj5cclxuIl19
1060
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFiLXRleHR1cmUtY29uZmlndXJhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9mYWJyaWthbnRlbmNvcmUvY29tcG9uZW50cy9mYWItdGV4dHVyZS1jb25maWd1cmF0b3IvZmFiLXRleHR1cmUtY29uZmlndXJhdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy9mYWJyaWthbnRlbmNvcmUvY29tcG9uZW50cy9mYWItdGV4dHVyZS1jb25maWd1cmF0b3IvZmFiLXRleHR1cmUtY29uZmlndXJhdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQXFCLFNBQVMsRUFBMEMsTUFBTSxlQUFlLENBQUM7QUFNckcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLHNCQUFzQixFQUF5SSxtQkFBbUIsRUFBeUUsZ0NBQWdDLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUvVixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUV0RixNQU1hLCtCQUErQjtJQXVDakM7SUFDQTtJQUNBO0lBQ0M7SUFDRDtJQUNDO0lBQ0E7SUEzQ1YsSUFBVyxtQkFBbUI7UUFDNUIsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBVyxzQkFBc0I7UUFDL0IsT0FBTyxzQkFBc0IsQ0FBQztJQUNoQyxDQUFDO0lBRU0saUJBQWlCLEdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDL0IsY0FBYyxHQUFXLENBQUMsQ0FBQyxDQUFDO0lBQzVCLFFBQVEsR0FBVyxFQUFFLENBQUM7SUFDdEIsV0FBVyxHQUFXLENBQUMsQ0FBQztJQUN4QixXQUFXLEdBQVcs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Q0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDOUI7YUFDRjtpQkFDSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDaEMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDOUI7U0FDRjtJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIE9uQ2hhbmdlcywgRG9DaGVjaywgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRMZWdhY3lEaWFsb2cgYXMgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LWRpYWxvZyc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEZhYnJpa2FudGVuU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2ZhYnJpa2FudGVuLnNlcnZpY2UnO1xuaW1wb3J0IHsgTW9iaWxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21vYmlsZS5zZXJ2aWNlJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90cmFuc2xhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGlvbkNhdGVnb3J5LCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LCBGYWJyaWthbnRlblRleHR1cmVCYXNlVmlld01vZGVsLCBGYWJyaWthbnRlbkZpbHRlclZpZXdNb2RlbCwgRmFicmlrYW50ZW5JbnB1dFZpZXdNb2RlbCwgRmFicmlrYW50ZW5Qcm9kdWN0Vmlld01vZGVsLCBUZXh0dXJlQXBpQ2xpZW50LCBUZXh0dXJlUmVxdWVzdE1vZGVsLCBUZXh0dXJlUmVzcG9uc2VNb2RlbCwgVGV4dHVyZU1peFJlc3BvbnNlTW9kZWwsIFRleHR1cmVNaXhSZXF1ZXN0TW9kZWwsIEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsIH0gZnJvbSAnLi4vLi4vc3dhZ2dlci9Td2FnZ2VyQ2xpZW50JztcbmltcG9ydCB7IEZhYkRpc3BsYXlQaG90b0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL2ZhYi1kaXNwbGF5LXBob3RvLWRpYWxvZy9mYWItZGlzcGxheS1waG90by1kaWFsb2cuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRmFiRm9ybURpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL2ZhYi1mb3JtLWRpYWxvZy9mYWItZm9ybS1kaWFsb2cuY29tcG9uZW50JztcclxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZmFiLXRleHR1cmUtY29uZmlndXJhdG9yJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZhYi10ZXh0dXJlLWNvbmZpZ3VyYXRvci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZhYi10ZXh0dXJlLWNvbmZpZ3VyYXRvci5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIEZhYlRleHR1cmVDb25maWd1cmF0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIERvQ2hlY2sge1xuXG4gIHB1YmxpYyBnZXQgVHJhbnNsYXRpb25DYXRlZ29yeSgpIHtcbiAgICByZXR1cm4gVHJhbnNsYXRpb25DYXRlZ29yeTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgVHJhbnNsYXRpb25TdWJDYXRlZ29yeSgpIHtcbiAgICByZXR1cm4gVHJhbnNsYXRpb25TdWJDYXRlZ29yeTtcbiAgfVxuXG4gIHB1YmxpYyBTZWxlY3RlZFZlcmJhbmRJZDogbnVtYmVyID0gLTE7XG4gIHB1YmxpYyBTZWxlY3RlZFZvZWdJZDogbnVtYmVyID0gLTE7XG4gIHB1YmxpYyBMaW50dm9lZzogbnVtYmVyID0gMTI7XG4gIHB1YmxpYyBMaW50dm9lZ01pbjogbnVtYmVyID0gNjtcbiAgcHVibGljIExpbnR2b2VnTWF4OiBudW1iZXIgPSAxNDtcbiAgcHVibGljIFN0b290dm9lZzogbnVtYmVyID0gMTA7XG4gIHB1YmxpYyBTdG9vdHZvZWdNaW46IG51bWJlciA9IDA7XG4gIHB1YmxpYyBTdG9vdHZvZWdNYXg6IG51bWJlciA9IDE0O1xuXG4gIHB1YmxpYyBBYW50YWxTdGVuZW46IG51bWJlciA9IDEwMDtcblxuICBwdWJsaWMgSGlSZXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIFNoYWRlOiBib29sZWFuID0gdHJ1ZTtcbiAgcHVibGljIExvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIFNpbmdsZVN0b25lTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgRGlzYWJsZUR1aXRzV2lsZHZlcmJhbmQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIE1peFJhdGlvU2VsZWN0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHVibGljIFRleHR1cmVSZXNwb25zZU1vZGVsOiBUZXh0dXJlUmVzcG9uc2VNb2RlbCB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgVGV4dHVyZU1peFJlc3BvbnNlTW9kZWw6IFRleHR1cmVNaXhSZXNwb25zZU1vZGVsIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBLZXJuOiBzdHJpbmdbXSB8IG51bGwgPSBudWxsO1xuXG4gIC8vcHVibGljIFN0YXRlRGlzcGxheUZvcm06IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgU2VsZWN0ZWRGb3JtYWF0OiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBTdG9uZVJvd09iamVjdHM6IEFycmF5PFN0b25lUm93T2JqZWN0PiA9IG5ldyBBcnJheTxTdG9uZVJvd09iamVjdD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgTW9iaWxlU2VydmljZTogTW9iaWxlU2VydmljZSxcbiAgICBwdWJsaWMgRmFicmlrYW50ZW5TZXJ2aWNlOiBGYWJyaWthbnRlblNlcnZpY2UsXG4gICAgcHVibGljIFRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBBY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgVGV4dHVyZUFwaUNsaWVudDogVGV4dHVyZUFwaUNsaWVudCxcbiAgICBwcml2YXRlIENoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICB0aGlzLlRyYW5zbGF0ZVNlcnZpY2UuUHJvY2Vzc1BhcmFtZXRlcnModGhpcy5BY3RpdmF0ZWRSb3V0ZSwgdGhpcy5DaGFuZ2VEZXRlY3RvclJlZik7XG4gIH1cblxuICBuZ0RvQ2hlY2soKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuSXNMb2FkaW5nKCkpIHtcclxuICAgICAgaWYgKHRoaXMuU3RvbmVSb3dPYmplY3RzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgdGhpcy5GaWxsQXJyYXlzKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0aGlzLlNlbGVjdGVkVmVyYmFuZElkID09IC0xKSB7XHJcbiAgICAgICAgdmFyIHZlcmJhbmRlbiA9IHRoaXMuR2V0VmVyYmFuZGVuKClcclxuICAgICAgICB0aGlzLlNlbGVjdGVkVmVyYmFuZElkID0gdmVyYmFuZGVuWzBdLmlkO1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZlcmJhbmRlbi5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKHZlcmJhbmRlbltpXS5ncm91cCA9PSBcImRlZmF1bHRcIikge1xyXG4gICAgICAgICAgICB0aGlzLlNlbGVjdGVkVmVyYmFuZElkID0gdmVyYmFuZGVuW2ldLmlkO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5TZWxlY3RlZFZvZWdJZCA9PSAtMSkge1xyXG4gICAgICAgIHZhciB2b2VnID0gdGhpcy5HZXRWb2VnKCk7XHJcblxyXG4gICAgICAgIGlmICh2b2VnPy5maWx0ZXI/Lm9wdGlvbnMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgdGhpcy5TZWxlY3RlZFZvZWdJZCA9IHZvZWcuZmlsdGVyLm9wdGlvbnNbMF0uaWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuVGV4dHVyZUFwaUNsaWVudC5nZXRLZXJuKCkuc3Vic2NyaWJlKChtb2RlbDogc3RyaW5nW10pID0+IHtcclxuICAgICAgdGhpcy5LZXJuID0gbW9kZWw7XHJcbiAgICB9KTtcblxuICAgIHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkxvYWRGYWJyaWthbnRlblZpZXdNb2RlbCh0aGlzLkNoYW5nZURldGVjdG9yUmVmLCB0aGlzLkFjdGl2YXRlZFJvdXRlLCAoKSA9PiB7XG4gICAgICB0aGlzLkZpbGxBcnJheXMoKTtcblxuICAgICAgdmFyIHN0b25lID0gdGhpcy5BY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoJ3N0b25lJyk7XHJcbiAgICAgIHZhciBmb3JtYXQgPSB0aGlzLkFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnBhcmFtTWFwLmdldCgnZm9ybWF0Jyk7XHJcblxyXG4gICAgICBpZiAoc3RvbmUgIT0gbnVsbCkge1xyXG4gICAgICAgIHZhciBzdG9uZV9mb3JtYXQgPSBzdG9uZSArIFwiX1wiICsgZm9ybWF0O1xyXG5cclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuU3RvbmVSb3dPYmplY3RzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuU3RvbmVSb3dPYmplY3RzW2ldLm9wdGlvbnMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgbyA9IDA7IG8gPCB0aGlzLlN0b25lUm93T2JqZWN0c1tpXS5vcHRpb25zW2pdLm9wdGlvbnMubGVuZ3RoOyBvKyspIHtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5TdG9uZVJvd09iamVjdHNbaV0ub3B0aW9uc1tqXS5vcHRpb25zW29dLnVybE5hbWUgPT0gc3RvbmVfZm9ybWF0KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLlN0b25lUm93T2JqZWN0c1tpXS5TZWxlY3QodGhpcy5TdG9uZVJvd09iamVjdHNbaV0ub3B0aW9uc1tqXS5vcHRpb25zW29dKTtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgZm9ybWF0cyA9IHRoaXMuR2V0Rm9ybWFhdCgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAodmFyIHAgPSAwOyBwIDwgZm9ybWF0cy5sZW5ndGg7IHArKykge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0c1twXS51cmxOYW1lID09IGZvcm1hdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuU3RvbmVSb3dPYmplY3RzW2ldLkZhYlRleHR1cmVDb25maWd1cmF0b3JDb21wb25lbnQuU2VsZWN0ZWRGb3JtYWF0ID0gZm9ybWF0c1twXTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuU2luZ2xlU3RvbmVNb2RlID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgSGFzVG9GaWxsRm9ybSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5TZXR0aW5nc1ZpZXdNb2RlbC5kb3dubG9hZEZvcm1FbmFibGVkICYmICF0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblZpZXdNb2RlbC5oYXNGaWxsZWRGb3JtcyAmJiAhdGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5WaWV3TW9kZWwuc2tpcEZvcm1zKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxuXG4gIHB1YmxpYyBJc0xvYWRpbmcoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLklzTG9hZGluZ1NtYWxsKCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cblxuICBwdWJsaWMgSXNMb2FkaW5nVGV4dHVyZXMoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuTG9hZGluZykge1xuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxuXG4gIHB1YmxpYyBJc1RleHR1cmVNaXgyNSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5TZXR0aW5nc1ZpZXdNb2RlbD8udGV4dHVyZUNvbmZpZ3VyYXRvckVuYWJsZU1peDI1ID09IHRydWU7XHJcbiAgfVxuXG4gIHB1YmxpYyBOb1N0b25lU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLlN0b25lUm93T2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHRoaXMuU3RvbmVSb3dPYmplY3RzW2ldLkhhc1N0b25lU2VsZWN0ZWQoKSkge1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxuXG4gIHB1YmxpYyBHZXRTdGVlbigpOiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbFtdIHtcbiAgICBpZiAodGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5WaWV3TW9kZWw/LmlucHV0cyAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5WaWV3TW9kZWwuaW5wdXRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdmFyIGZpbHRlciA9IHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsLmlucHV0c1tpXS5maWx0ZXI7XHJcbiAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsICYmIGZpbHRlci5uYW1lID09IFwiU3RlZW4gMVwiKSB7XHJcbiAgICAgICAgICB2YXIgb3B0aW9ucyA9IGZpbHRlci5vcHRpb25zO1xyXG5cclxuICAgICAgICAgIGlmIChvcHRpb25zICE9IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEFycmF5PEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsPigpO1xyXG4gIH1cblxuICBwdWJsaWMgR2VuZXJhdGVEaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLlNlbGVjdGVkVmVyYmFuZElkID09IC0xKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5TZWxlY3RlZFZvZWdJZCA9PSAtMSkge1xuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuTG9hZGluZykge1xuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHN0b25lcyA9IHRoaXMuR2V0U2VsZWN0ZWRTdG9uZXMoKTtcblxuICAgIGlmIChzdG9uZXMubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cblxuICBwdWJsaWMgU2hvd1RleHR1cmUoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5Jc0xvYWRpbmdUZXh0dXJlcygpKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5UZXh0dXJlUmVzcG9uc2VNb2RlbCAhPSBudWxsKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XG5cbiAgcHVibGljIFNob3dLZXJuKHN0b25lOiBTdG9uZVJvd09iamVjdCwgb3B0aW9uOiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLktlcm4gIT0gbnVsbCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLktlcm4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAodGhpcy5LZXJuW2ldLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzdG9uZS5uYW1lLnRvTG93ZXJDYXNlKCkpICE9IC0xICYmXHJcbiAgICAgICAgICB0aGlzLktlcm5baV0udG9Mb3dlckNhc2UoKS5pbmRleE9mKG9wdGlvbi5uYW1lIS50b0xvd2VyQ2FzZSgpKSAhPSAtMSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vdmFyIHN0cmluZyA9IG9wdGlvbi5uYW1lO1xyXG4gICAgICAgIC8vdGhpcy5LZXJuW2ldOiBcIkFsdCBCZXJsaW4gRk8gKG5vcm1hYWxmb3JtYWF0KVwiXHJcbiAgICAgICAgLy9vcHRpb24ubmFtZTogXCJOb3JtYWFsZm9ybWFhdFwiXHJcbiAgICAgICAgLy9zdG9uZS5uYW1lOiBcIkFsdCBCZXJsaW4gRk8gXCJcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XG5cbiAgcHVibGljIFNob3dTdGlja2VyKHN0b25lOiBTdG9uZVJvd09iamVjdCwgb3B0aW9uOiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuR2V0U3RpY2tlcihzdG9uZSwgb3B0aW9uKSAhPSBcIlwiO1xyXG4gIH1cblxuICBwdWJsaWMgU2hvd1N0aWNrZXJTZWNvbmQoc3RvbmU6IFN0b25lUm93T2JqZWN0LCBvcHRpb246IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5HZXRTdGlja2VyU2Vjb25kKHN0b25lLCBvcHRpb24pICE9IFwiXCI7XHJcbiAgfVxuXG4gIHB1YmxpYyBHZXRTdGlja2VyKHN0b25lOiBTdG9uZVJvd09iamVjdCwgb3B0aW9uOiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCk6IHN0cmluZyB7XG4gICAgdmFyIHN0ZWVuID0gc3RvbmUuR2V0U3RvbmVGb3JtYWF0T2JqZWN0KG9wdGlvbik7XHJcblxyXG4gICAgdmFyIG5hbWU6IHN0cmluZyA9IHN0ZWVuPy5uYW1lICsgXCJcIjtcclxuXHJcbiAgICBpZiAodGhpcy5Jc0FuZGVycyhuYW1lKSkge1xyXG4gICAgICB2YXIgdHlwZSA9IG5hbWUuc3Vic3RyaW5nKG5hbWUuaW5kZXhPZignKCcpICsgMSkucmVwbGFjZShcIilcIiwgXCJcIik7XHJcbiAgICAgIHJldHVybiB0aGlzLlRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuQ3VzdG9tSXRlbSwgdW5kZWZpbmVkLCB0eXBlKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gXCJcIjtcclxuICAgIH1cclxuICB9XG5cbiAgcHVibGljIEdldFN0aWNrZXJTZWNvbmQoc3RvbmU6IFN0b25lUm93T2JqZWN0LCBvcHRpb246IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsKTogc3RyaW5nIHtcbiAgICB2YXIgc3RlZW4gPSBzdG9uZS5HZXRTdG9uZUZvcm1hYXRPYmplY3RTZWNvbmQob3B0aW9uKTtcclxuXHJcbiAgICB2YXIgbmFtZTogc3RyaW5nID0gc3RlZW4/Lm5hbWUgKyBcIlwiO1xyXG5cclxuICAgIGlmICh0aGlzLklzQW5kZXJzKG5hbWUpKSB7XHJcbiAgICAgIHZhciB0eXBlID0gbmFtZS5zdWJzdHJpbmcobmFtZS5pbmRleE9mKCcoJykgKyAxKS5yZXBsYWNlKFwiKVwiLCBcIlwiKTtcclxuICAgICAgcmV0dXJuIHRoaXMuVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5DdXN0b21JdGVtLCB1bmRlZmluZWQsIHR5cGUpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiBcIlwiO1xyXG4gICAgfVxyXG4gIH1cblxuICBwdWJsaWMgR2V0U2VsZWN0ZWRTdG9uZXMoKTogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWxbXSB7XG4gICAgdmFyIHN0b25lcyA9IG5ldyBBcnJheTxGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbD4oKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5TdG9uZVJvd09iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuU3RvbmVSb3dPYmplY3RzW2ldLkdldFNlbGVjdGVkU3RvbmVzKHN0b25lcyk7XHJcbiAgICB9XG5cbiAgICByZXR1cm4gc3RvbmVzO1xyXG4gIH1cblxuICBwdWJsaWMgR2V0U2VsZWN0ZWRTdG9uZU9iamVjdHMoKTogU3RvbmVGb3JtYWF0T2JqZWN0W10ge1xuICAgIHZhciBzdG9uZXMgPSBuZXcgQXJyYXk8U3RvbmVGb3JtYWF0T2JqZWN0PigpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLlN0b25lUm93T2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5TdG9uZVJvd09iamVjdHNbaV0uR2V0U2VsZWN0ZWRTdG9uZU9iamVjdHMoc3RvbmVzKTtcclxuICAgIH1cblxuICAgIHJldHVybiBzdG9uZXM7XHJcbiAgfVxuXG4gIHB1YmxpYyBHZXRTZWxlY3RlZEFtb3VudCgpOiBudW1iZXIge1xuICAgIHZhciBjb3VudCA9IDA7XG4gICAgdmFyIHN0b25lcyA9IG5ldyBBcnJheTxTdG9uZUZvcm1hYXRPYmplY3Q+KCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuU3RvbmVSb3dPYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLlN0b25lUm93T2JqZWN0c1tpXS5HZXRTZWxlY3RlZFN0b25lT2JqZWN0cyhzdG9uZXMpO1xyXG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdG9uZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvdW50Kys7XG5cbiAgICAgIGlmIChzdG9uZXNbaV0uc2VsZWN0ZWRkb3VibGUpIHtcclxuICAgICAgICBjb3VudCsrO1xyXG4gICAgICB9XHJcbiAgICB9XG5cbiAgICByZXR1cm4gY291bnQ7XHJcbiAgfVxuXG4gIHB1YmxpYyBJc090aGVyU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgdmFyIHN0b25lcyA9IG5ldyBBcnJheTxTdG9uZUZvcm1hYXRPYmplY3Q+KCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuU3RvbmVSb3dPYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLlN0b25lUm93T2JqZWN0c1tpXS5HZXRTZWxlY3RlZFN0b25lT2JqZWN0cyhzdG9uZXMpO1xyXG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdG9uZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLklzQW5kZXJzKHN0b25lc1tpXS5uYW1lKSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxuXG4gIHB1YmxpYyBHZXRGb3JtYWF0KCk6IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsW10ge1xuICAgIGlmICh0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblZpZXdNb2RlbD8uaW5wdXRzICE9IHVuZGVmaW5lZCkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblZpZXdNb2RlbC5pbnB1dHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB2YXIgZmlsdGVyID0gdGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5WaWV3TW9kZWwuaW5wdXRzW2ldLmZpbHRlcjtcclxuICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwgJiYgZmlsdGVyLm5hbWUgPT0gXCJGb3JtYWF0XCIpIHtcclxuICAgICAgICAgIHZhciBvcHRpb25zID0gZmlsdGVyLm9wdGlvbnM7XHJcblxyXG4gICAgICAgICAgaWYgKG9wdGlvbnMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cblxuICAgIHJldHVybiBuZXcgQXJyYXk8RmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWw+KCk7XHJcbiAgfVxuXG4gIHB1YmxpYyBHZXRWb2VnKCk6IEZhYnJpa2FudGVuSW5wdXRWaWV3TW9kZWwgfCBudWxsIHtcclxuICAgIGlmICh0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblZpZXdNb2RlbD8uaW5wdXRzICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsLmlucHV0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmICh0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblZpZXdNb2RlbC5pbnB1dHNbaV0uZmlsdGVyPy5uYW1lID09IFwiVm9lZ1wiKSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5WaWV3TW9kZWwuaW5wdXRzW2ldO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIEdldFZvZWdCeUlkKGlkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGxpc3QgPSB0aGlzLkdldFZvZWcoKT8uZmlsdGVyPy5vcHRpb25zOyAvLyBvZiBjYWNoZSBkZXplIGxpanN0IGluIGVlbiBwcm9wZXJ0eVxyXG4gICAgcmV0dXJuIGxpc3Q/LmZpbmQodiA9PiB2LmlkID09PSBpZCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0VmVyYmFuZGVuKCk6IEZhYnJpa2FudGVuUHJvZHVjdFZpZXdNb2RlbFtdIHtcclxuICAgIGlmICh0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblZpZXdNb2RlbD8ucHJvZHVjdHMgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGlmICh0aGlzLkRpc2FibGVEdWl0c1dpbGR2ZXJiYW5kKSB7XHJcbiAgICAgICAgdmFyIGFycmF5ID0gbmV3IEFycmF5PEZhYnJpa2FudGVuUHJvZHVjdFZpZXdNb2RlbD4oKTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblZpZXdNb2RlbC5wcm9kdWN0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsLnByb2R1Y3RzW2ldLm5hbWUhLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcImR1aXRzXCIpID09IC0xKSB7XHJcbiAgICAgICAgICAgIGFycmF5LnB1c2godGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5WaWV3TW9kZWwucHJvZHVjdHNbaV0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGFycmF5O1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblZpZXdNb2RlbC5wcm9kdWN0cztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiBuZXcgQXJyYXk8RmFicmlrYW50ZW5Qcm9kdWN0Vmlld01vZGVsPigpO1xyXG4gICAgfVxyXG5cclxuICB9XG5cbiAgcHVibGljIEdldFZlcmJhbmRCeUlkKGlkOiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGxpc3QgPSB0aGlzLkdldFZlcmJhbmRlbigpOyAvLyBvZiBjYWNoZSBkZXplIGxpanN0IGluIGVlbiBwcm9wZXJ0eVxyXG4gICAgcmV0dXJuIGxpc3Q/LmZpbmQodiA9PiB2LmlkID09PSBpZCk7XHJcbiAgfVxuXG4gIHB1YmxpYyBHZXRJbWFnZVBhdGgob3B0aW9uOiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCk6IHN0cmluZyB7XHJcbiAgICB2YXIgdmFsdWUgPSBvcHRpb24uaW1hZ2VQYXRoICsgXCJcIjtcclxuXHJcbiAgICBpZiAodmFsdWUuaW5kZXhPZihcIiNCQ0IjXCIpICE9IC0xKSB7XHJcbiAgICAgIHZhciBiY2J1cmwgPSB0aGlzLkZhYnJpa2FudGVuU2VydmljZS5GYWJyaWthbnRlblNldHRpbmdzVmlld01vZGVsLmJjYldlYnNlcnZpY2VVUkxCYXNlICsgXCJcIjtcclxuICAgICAgYmNidXJsID0gYmNidXJsLnN1YnN0cmluZygwLCBiY2J1cmwubGVuZ3RoIC0gMSk7XHJcblxyXG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoXCIjQkNCI1wiLCBiY2J1cmwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBHZXRJbWFnZVBhdGhQcm9kdWN0KG9wdGlvbjogRmFicmlrYW50ZW5Qcm9kdWN0Vmlld01vZGVsKTogc3RyaW5nIHtcclxuICAgIHZhciB2YWx1ZSA9IG9wdGlvbi5pbWFnZVBhdGggKyBcIlwiO1xyXG5cclxuICAgIGlmICh2YWx1ZS5pbmRleE9mKFwiI0JDQiNcIikgIT0gLTEpIHtcclxuICAgICAgdmFyIGJjYnVybCA9IHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuU2V0dGluZ3NWaWV3TW9kZWwuYmNiV2Vic2VydmljZVVSTEJhc2UgKyBcIlwiO1xyXG4gICAgICBiY2J1cmwgPSBiY2J1cmwuc3Vic3RyaW5nKDAsIGJjYnVybC5sZW5ndGggLSAxKTtcclxuXHJcbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShcIiNCQ0IjXCIsIGJjYnVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHZhbHVlO1xyXG4gIH1cblxuICBwdWJsaWMgR2V0UGF0cm9vbkRvd25sb2FkVVJMKCk6IHN0cmluZyB7XHJcblxyXG4gICAgdmFyIHVybCA9IHRoaXMuVGV4dHVyZVJlc3BvbnNlTW9kZWw/LnBhdHJvb25VUkwgKyBcIlwiO1xyXG5cclxuICAgIHVybCA9IHVybC5yZXBsYWNlKHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuU2V0dGluZ3NWaWV3TW9kZWwuYmNiV2Vic2VydmljZVVSTEJhc2UgKyBcIlwiLCBcIlwiKTtcclxuXHJcbiAgICB2YXIgdGVtcCA9IFwiL0Rvd25sb2FkL0dldEltYWdlRnJvbUJDQlNlcnZlcj9wRmlsZT1cIiArIGVuY29kZVVSSUNvbXBvbmVudCh1cmwpICsgXCImcFRhcmdldD1cIiArIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLkdldERvd25sb2FkTmFtZSgpICsgXCIucG5nXCIpO1xyXG5cclxuICAgIHJldHVybiB0ZW1wO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIEdldFBhdHJvb25Eb3dubG9hZFVSTERvd25sb2FkKCk6IHN0cmluZyB7XHJcblxyXG4gICAgdmFyIHVybCA9IHRoaXMuVGV4dHVyZVJlc3BvbnNlTW9kZWw/LnBhdHJvb25VUkwgKyBcIlwiO1xyXG5cclxuICAgIHVybCA9IHVybC5yZXBsYWNlKHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuU2V0dGluZ3NWaWV3TW9kZWwuYmNiV2Vic2VydmljZVVSTEJhc2UgKyBcIlwiLCBcIlwiKTtcclxuXHJcbiAgICB2YXIgdGVtcCA9XHJcbiAgICAgIHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuU2V0dGluZ3NWaWV3TW9kZWwuYmNiV2Vic2VydmljZVVSTEJhc2UgK1xyXG4gICAgICBcIkRvd25sb2FkLmFzcHg/ZmlsZT1cIiArXHJcbiAgICAgIHVybCArXHJcbiAgICAgIFwiJmRvZWw9XCIgK1xyXG4gICAgICB0aGlzLkdldERvd25sb2FkTmFtZSgpICtcclxuICAgICAgXCIucG5nXCI7XHJcblxyXG4gICAgcmV0dXJuIHRlbXA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0QnVtcERvd25sb2FkVVJMKCk6IHN0cmluZyB7XHJcbiAgICB2YXIgdXJsID0gdGhpcy5UZXh0dXJlUmVzcG9uc2VNb2RlbD8uYnVtcFVSTCArIFwiXCI7XHJcblxyXG4gICAgdXJsID0gdXJsLnJlcGxhY2UodGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5TZXR0aW5nc1ZpZXdNb2RlbC5iY2JXZWJzZXJ2aWNlVVJMQmFzZSArIFwiXCIsIFwiXCIpO1xyXG5cclxuICAgIHZhciB0ZW1wID1cclxuICAgICAgdGhpcy5GYWJyaWthbnRlblNlcnZpY2UuRmFicmlrYW50ZW5TZXR0aW5nc1ZpZXdNb2RlbC5iY2JXZWJzZXJ2aWNlVVJMQmFzZSArXHJcbiAgICAgIFwiRG93bmxvYWQuYXNweD9maWxlPVwiICtcclxuICAgICAgdXJsICtcclxuICAgICAgXCImZG9lbD1cIiArXHJcbiAgICAgIHRoaXMuR2V0RG93bmxvYWROYW1lKCkgK1xyXG4gICAgICBcIl9idW1wLnBuZ1wiO1xyXG5cclxuICAgIHJldHVybiB0ZW1wO1xyXG4gIH1cblxuICBwdWJsaWMgR2V0RG93bmxvYWROYW1lKCk6IHN0cmluZyB7XHJcbiAgICB2YXIgYm9uZCA9IHRoaXMuR2V0VmVyYmFuZEJ5SWQodGhpcy5TZWxlY3RlZFZlcmJhbmRJZCk7XHJcbiAgICB2YXIgYm9uZF9zdHIgPSB0aGlzLlRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Qcm9kdWN0LCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5Lk5hbWUsIGJvbmQ/LmlkKS50b0xvd2VyQ2FzZSgpO1xyXG5cclxuICAgIHZhciB2b2VnID0gdGhpcy5HZXRWb2VnQnlJZCh0aGlzLlNlbGVjdGVkVm9lZ0lkKTtcclxuICAgIHZhciB2b2VnX3N0ciA9IHRoaXMuVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkZpbHRlck9wdGlvbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5OYW1lLCB2b2VnPy5pZCkudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICB2YXIgcmVzbyA9IFwiTFFcIjtcclxuXHJcbiAgICBpZiAodGhpcy5IaVJlcykge1xyXG4gICAgICByZXNvID0gXCJIUVwiO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBzdG9uZXMgPSB0aGlzLkdldFNlbGVjdGVkU3RvbmVzKCk7XHJcbiAgICB2YXIgc3RlZW4gPSBcIlwiO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RvbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChzdGVlbiAhPSBcIlwiKSB7XHJcbiAgICAgICAgc3RlZW4gKz0gXCJfXCI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHN0ZWVuICs9IChzdG9uZXNbaV0udXJsTmFtZSArIFwiXCIpLnJlcGxhY2UoXCJfXCIsIFwiIFwiKTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgZW5kID0gXCJfXCIgKyB0aGlzLkdldERpbWVuc2lvbigpICsgXCJfXCIgKyBib25kX3N0ciArIFwiX1wiICsgdm9lZ19zdHIgKyBcIl9cIiArIHJlc29cclxuXHJcbiAgICB2YXIgbGVmdCA9IDI1MCAtIGVuZC5sZW5ndGg7XHJcblxyXG4gICAgaWYgKHN0ZWVuLmxlbmd0aCA+IGxlZnQpIHtcclxuICAgICAgc3RlZW4gPSBzdGVlbi5zdWJzdHJpbmcoMCwgbGVmdCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHN0ZWVuICsgZW5kO1xyXG4gIH1cblxuICBwdWJsaWMgR2V0QWN0aXZlU3RlZW4oKTogc3RyaW5nIHtcclxuICAgIHZhciBzdG9uZXMgPSB0aGlzLkdldFNlbGVjdGVkU3RvbmVzKCk7XHJcblxyXG4gICAgaWYgKHN0b25lcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiBzdG9uZXNbMF0udXJsTmFtZSArIFwiXCI7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFwiXCI7XHJcbiAgfVxuXG4gIHB1YmxpYyBGaWxsQXJyYXlzKCkge1xuICAgIHRoaXMuU3RvbmVSb3dPYmplY3RzID0gbmV3IEFycmF5PFN0b25lUm93T2JqZWN0PigpO1xyXG5cclxuICAgIHZhciBmb3JtYWF0ID0gdGhpcy5HZXRTdGVlbigpO1xyXG5cclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm9ybWFhdC5sZW5ndGg7IGkrKykge1xyXG4gICAgICB2YXIgbmFtZTogc3RyaW5nID0gZm9ybWFhdFtpXS5uYW1lICsgXCJcIjtcclxuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUuaW5kZXhPZignKCcpKSArIFwiXCI7XHJcblxyXG4gICAgICB2YXIgc3RvbmVyb3dvYmplY3Q6IFN0b25lUm93T2JqZWN0IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuU3RvbmVSb3dPYmplY3RzLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuU3RvbmVSb3dPYmplY3RzW2pdLm5hbWUgPT0gbmFtZSkge1xyXG4gICAgICAgICAgc3RvbmVyb3dvYmplY3QgPSB0aGlzLlN0b25lUm93T2JqZWN0c1tqXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzdG9uZXJvd29iamVjdCA9PSBudWxsKSB7XHJcbiAgICAgICAgc3RvbmVyb3dvYmplY3QgPSBuZXcgU3RvbmVSb3dPYmplY3QobmFtZSwgdGhpcy5GYWJyaWthbnRlblNlcnZpY2UsIHRoaXMpO1xyXG4gICAgICAgIHRoaXMuU3RvbmVSb3dPYmplY3RzLnB1c2goc3RvbmVyb3dvYmplY3QpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzdG9uZXJvd29iamVjdC5BZGRPcHRpb24oZm9ybWFhdFtpXSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5TdG9uZVJvd09iamVjdHMuc29ydChmdW5jdGlvbiAoc3RvbmUxLCBzdG9uZTIpIHsgcmV0dXJuIHN0b25lMS5uYW1lLmxvY2FsZUNvbXBhcmUoc3RvbmUyLm5hbWUpIH0pO1xyXG4gIH1cblxuICBwdWJsaWMgSXNSYXRpb0Jsb2NraW5nKCk6IGJvb2xlYW4ge1xuICAgIHZhciB2ZXJiYW5kID0gdGhpcy5HZXRWZXJiYW5kQnlJZCh0aGlzLlNlbGVjdGVkVmVyYmFuZElkKTtcblxuICAgIGlmICh2ZXJiYW5kPy5pbmZvICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICB2YXIgb2JqZWN0ID0gSlNPTi5wYXJzZSh2ZXJiYW5kLmluZm8pO1xyXG4gICAgICB2YXIgc3RyID0gdGhpcy5HZXRMZW5ndGUoKSArIFwiID09IFwiICsgKDIgKiB0aGlzLkdldEJyZWVkdGUoKSkgKyBcIiArIFwiICsgdGhpcy5TdG9vdHZvZWc7XHJcbiAgICAgIC8vYWxlcnQob2JqZWN0LnJhdGlvICsgXCI6IFwiICsgc3RyICsgXCIgOiBcIiArIGV2YWwoc3RyKSk7XHJcbiAgICAgIHZhciBldmFsU3RyID0gb2JqZWN0LnJhdGlvICsgXCJcIjtcclxuICAgICAgZXZhbFN0ciA9IGV2YWxTdHIucmVwbGFjZShcImJyZWVkdGVcIiwgdGhpcy5HZXRCcmVlZHRlKCkudG9TdHJpbmcoKSk7XHJcbiAgICAgIGV2YWxTdHIgPSBldmFsU3RyLnJlcGxhY2UoXCJsZW5ndGVcIiwgdGhpcy5HZXRMZW5ndGUoKS50b1N0cmluZygpKTtcclxuICAgICAgZXZhbFN0ciA9IGV2YWxTdHIucmVwbGFjZShcInZvZWdicmVlZHRlXCIsIHRoaXMuU3Rvb3R2b2VnLnRvU3RyaW5nKCkpO1xyXG5cclxuICAgICAgaWYgKGV2YWwoZXZhbFN0cikpIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSB0aGlzLlRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuUmF0aW9XYXJuaW5nKTtcclxuICAgICAgICBtZXNzYWdlICs9IFwiXFxyXFxuXCI7XHJcbiAgICAgICAgbWVzc2FnZSArPSBcIlxcclxcblwiO1xyXG4gICAgICAgIG1lc3NhZ2UgKz0gdGhpcy5UcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LlBpY2tlZEJvbmQpICsgXCI6IFwiICsgdGhpcy5UcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuUHJvZHVjdCwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5OYW1lLCB2ZXJiYW5kLmlkKTtcclxuICAgICAgICBtZXNzYWdlICs9IFwiXFxyXFxuXCI7XHJcbiAgICAgICAgbWVzc2FnZSArPSB0aGlzLlRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuUmF0aW9Cb25kKSArIFwiOiBcIiArIG9iamVjdC5yYXRpbztcclxuICAgICAgICBtZXNzYWdlICs9IFwiXFxyXFxuXCI7XHJcbiAgICAgICAgbWVzc2FnZSArPSBcIlxcclxcblwiO1xyXG4gICAgICAgIG1lc3NhZ2UgKz0gdGhpcy5UcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LlN0b25lTGVuZ3RlKSArIFwiOiBcIiArIHRoaXMuR2V0TGVuZ3RlKCk7XHJcbiAgICAgICAgbWVzc2FnZSArPSBcIlxcclxcblwiO1xyXG4gICAgICAgIG1lc3NhZ2UgKz0gdGhpcy5UcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LlN0b25lV2lkdGgpICsgXCI6IFwiICsgdGhpcy5HZXRCcmVlZHRlKCk7XHJcbiAgICAgICAgbWVzc2FnZSArPSBcIlxcclxcblwiO1xyXG4gICAgICAgIG1lc3NhZ2UgKz0gdGhpcy5UcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LlN0b290dm9lZykgKyBcIjogXCIgKyB0aGlzLlN0b290dm9lZztcclxuICAgICAgICBtZXNzYWdlICs9IFwiXFxyXFxuXCI7XHJcbiAgICAgICAgbWVzc2FnZSArPSBcIlxcclxcblwiO1xyXG4gICAgICAgIG1lc3NhZ2UgKz0gdGhpcy5UcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LlN0b25lQ29tcGxldGUpICsgXCI6IFwiICsgZXZhbFN0cjtcclxuXHJcbiAgICAgICAgYWxlcnQobWVzc2FnZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxuXG4gIHB1YmxpYyBUZXh0dXVyR2VuZXJlcmVuKCk6IHZvaWQge1xyXG5cclxuICAgIHZhciB2YWxpZCA9IHRydWU7XHJcblxyXG4gICAgaWYgKHRoaXMuSXNSYXRpb0Jsb2NraW5nKCkpIHtcclxuICAgICAgdmFsaWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodmFsaWQpIHtcclxuICAgICAgdmFyIHN0b25lcyA9IHRoaXMuR2V0U2VsZWN0ZWRTdG9uZU9iamVjdHMoKTtcclxuICAgICAgdmFyIGFsbHN0b25lcyA9IG5ldyBBcnJheTxGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbD4oKTtcclxuXHJcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RvbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKHN0b25lc1tpXS5zZWxlY3RlZGRvdWJsZSkge1xyXG4gICAgICAgICAgaWYgKHN0b25lcy5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgICBzdG9uZXNbaV0ub3B0aW9uc1swXS5taXhSYXRpbyA9IDUwO1xyXG4gICAgICAgICAgICBzdG9uZXNbaV0ub3B0aW9uc1sxXS5taXhSYXRpbyA9IDUwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHN0b25lc1tpXS5vcHRpb25zWzBdLm1peFJhdGlvID0gc3RvbmVzW2ldLm1peFJhdGlvIC8gMjtcclxuICAgICAgICAgICAgc3RvbmVzW2ldLm9wdGlvbnNbMV0ubWl4UmF0aW8gPSBzdG9uZXNbaV0ubWl4UmF0aW8gLyAyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGlmIChzdG9uZXMubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAgICAgc3RvbmVzW2ldLm9wdGlvbnNbMF0ubWl4UmF0aW8gPSAxMDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgc3RvbmVzW2ldLm9wdGlvbnNbMF0ubWl4UmF0aW8gPSBzdG9uZXNbaV0ubWl4UmF0aW87XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhbGxzdG9uZXMucHVzaChzdG9uZXNbaV0ub3B0aW9uc1swXSk7XHJcblxyXG4gICAgICAgIGlmIChzdG9uZXNbaV0uc2VsZWN0ZWRkb3VibGUpIHtcclxuICAgICAgICAgIGFsbHN0b25lcy5wdXNoKHN0b25lc1tpXS5vcHRpb25zWzFdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChhbGxzdG9uZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMuTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgdmFyIHJlcXVlc3QgPSBuZXcgVGV4dHVyZVJlcXVlc3RNb2RlbCgpO1xyXG5cclxuICAgICAgICByZXF1ZXN0LnZlcmJhbmRJZCA9IHRoaXMuU2VsZWN0ZWRWZXJiYW5kSWQ7XHJcbiAgICAgICAgcmVxdWVzdC5zdGVlbklkID0gYWxsc3RvbmVzWzBdLmlkO1xyXG4gICAgICAgIHJlcXVlc3Quc3RlZW5SYXRpbyA9IGFsbHN0b25lc1swXS5taXhSYXRpbztcclxuICAgICAgICByZXF1ZXN0LnZvZWdJZCA9IHRoaXMuU2VsZWN0ZWRWb2VnSWQ7XHJcbiAgICAgICAgcmVxdWVzdC5oaWdoUmVzb2x1dGlvbiA9IHRoaXMuSGlSZXM7XHJcbiAgICAgICAgcmVxdWVzdC5zaGFkdXcgPSB0aGlzLlNoYWRlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5IaVJlcykge1xyXG4gICAgICAgICAgcmVxdWVzdC5taW5BYW50YWxCaXRtYXAgPSAxMDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgcmVxdWVzdC5taW5BYW50YWxCaXRtYXAgPSB0aGlzLkFhbnRhbFN0ZW5lbjtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBpZiAoYWxsc3RvbmVzLmxlbmd0aCA8IDIpIHtcclxuICAgICAgICAgIHJlcXVlc3Quc3RlZW4ySWQgPSAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICByZXF1ZXN0LnN0ZWVuMklkID0gYWxsc3RvbmVzWzFdLmlkO1xyXG4gICAgICAgICAgcmVxdWVzdC5zdGVlbjJSYXRpbyA9IGFsbHN0b25lc1sxXS5taXhSYXRpbztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChhbGxzdG9uZXMubGVuZ3RoIDwgMykge1xyXG4gICAgICAgICAgcmVxdWVzdC5zdGVlbjNJZCA9IC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHJlcXVlc3Quc3RlZW4zSWQgPSBhbGxzdG9uZXNbMl0uaWQ7XHJcbiAgICAgICAgICByZXF1ZXN0LnN0ZWVuM1JhdGlvID0gYWxsc3RvbmVzWzJdLm1peFJhdGlvO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGFsbHN0b25lcy5sZW5ndGggPCA0KSB7XHJcbiAgICAgICAgICByZXF1ZXN0LnN0ZWVuNElkID0gLTE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgcmVxdWVzdC5zdGVlbjRJZCA9IGFsbHN0b25lc1szXS5pZDtcclxuICAgICAgICAgIHJlcXVlc3Quc3RlZW40UmF0aW8gPSBhbGxzdG9uZXNbM10ubWl4UmF0aW87XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoYWxsc3RvbmVzLmxlbmd0aCA8IDUpIHtcclxuICAgICAgICAgIHJlcXVlc3Quc3RlZW41SWQgPSAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICByZXF1ZXN0LnN0ZWVuNUlkID0gYWxsc3RvbmVzWzRdLmlkO1xyXG4gICAgICAgICAgcmVxdWVzdC5zdGVlbjVSYXRpbyA9IGFsbHN0b25lc1s0XS5taXhSYXRpbztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLlN0b290dm9lZyA8IHRoaXMuU3Rvb3R2b2VnTWluKSB7XHJcbiAgICAgICAgICB0aGlzLlN0b290dm9lZyA9IHRoaXMuU3Rvb3R2b2VnTWluO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuU3Rvb3R2b2VnID4gdGhpcy5TdG9vdHZvZWdNYXgpIHtcclxuICAgICAgICAgIHRoaXMuU3Rvb3R2b2VnID0gdGhpcy5TdG9vdHZvZWdNYXg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXF1ZXN0LmJyZWVkdGVTdG9vdHZvZWcgPSB0aGlzLlN0b290dm9lZztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuTGludHZvZWcgPCB0aGlzLkxpbnR2b2VnTWluKSB7XHJcbiAgICAgICAgICB0aGlzLkxpbnR2b2VnID0gdGhpcy5MaW50dm9lZ01pbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLkxpbnR2b2VnID4gdGhpcy5MaW50dm9lZ01heCkge1xyXG4gICAgICAgICAgdGhpcy5MaW50dm9lZyA9IHRoaXMuTGludHZvZWdNYXg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXF1ZXN0Lmhvb2d0ZUxpbnR2b2VnID0gdGhpcy5MaW50dm9lZztcclxuXHJcbiAgICAgICAgdGhpcy5UZXh0dXJlQXBpQ2xpZW50LmdldFRleHR1cmUocmVxdWVzdCkuc3Vic2NyaWJlKChtb2RlbDogVGV4dHVyZVJlc3BvbnNlTW9kZWwpID0+IHtcclxuICAgICAgICAgIHRoaXMuVGV4dHVyZVJlc3BvbnNlTW9kZWwgPSBtb2RlbDtcclxuICAgICAgICAgIHRoaXMuTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0sIChlcnJvcjogUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gNDAwKVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvci5qc29uKCkpO1xyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VyZWQnKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxuXG4gIHB1YmxpYyBPcGVuRm9ybSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5IYXNUb0ZpbGxGb3JtKCkpIHtcclxuICAgICAgdmFyIGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRmFiRm9ybURpYWxvZ0NvbXBvbmVudCwge1xyXG4gICAgICAgIGRhdGE6IHtcclxuICAgICAgICAgIGZvcm06IHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuU2V0dGluZ3NWaWV3TW9kZWwuZG93bmxvYWRGb3JtXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuVmlld01vZGVsLmhhc0ZpbGxlZEZvcm1zKSB7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxuXG4gIHB1YmxpYyBTZXRNaXhSYXRpb3MoKTogdm9pZCB7XG4gICAgdGhpcy5VcGRhdGVSYXRpb3MobnVsbCwgbnVsbCwgbnVsbCk7XHJcbiAgfVxuXG4gIHB1YmxpYyBEaXNhYmxlNzUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuR2V0U2VsZWN0ZWRTdG9uZU9iamVjdHMoKS5sZW5ndGggPCAzO1xyXG4gIH1cblxuICBwdWJsaWMgRGlzYWJsZTUwKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLkdldFNlbGVjdGVkU3RvbmVPYmplY3RzKCkubGVuZ3RoIDwgNDtcclxuICB9XG5cbiAgcHVibGljIFVwZGF0ZVJhdGlvcyhzdG9uZTogU3RvbmVSb3dPYmplY3QgfCBudWxsLCBvcHRpb246IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsIHwgbnVsbCwgdmFsdWU6IGFueSB8IG51bGwpOiB2b2lkIHtcbiAgICB2YXIgc3RvbmVzID0gdGhpcy5HZXRTZWxlY3RlZFN0b25lT2JqZWN0cygpO1xuICAgIHRoaXMuTWl4UmF0aW9TZWxlY3QgPSB0cnVlO1xuXG4gICAgdmFyIHN0ZWVuID0gbnVsbDtcbiAgICB2YXIgc2VsZWN0ZWRyYXRpbyA9IG51bGw7XG5cbiAgICBpZiAoc3RvbmUgIT0gbnVsbCAmJiBvcHRpb24gIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBzdGVlbiA9IHN0b25lLkdldFN0b25lRm9ybWFhdE9iamVjdChvcHRpb24pO1xyXG5cclxuICAgICAgaWYgKHN0ZWVuICE9IG51bGwpIHtcclxuICAgICAgICBzdGVlbi5taXhSYXRpbyA9IHZhbHVlO1xyXG4gICAgICAgIHNlbGVjdGVkcmF0aW8gPSBzdGVlbi5taXhSYXRpbztcclxuICAgICAgfVxyXG4gICAgfVxuXG4gICAgaWYgKHN0b25lcy5sZW5ndGggIT0gMCkge1xuICAgICAgaWYgKHRoaXMuSXNUZXh0dXJlTWl4MjUoKSkge1xuICAgICAgICBpZiAoc3RvbmVzLmxlbmd0aCA+IDMpIHtcclxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RvbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIHN0b25lc1tpXS5taXhSYXRpbyA9IDI1O1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuTWl4UmF0aW9TZWxlY3QgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc3RvbmVzLmxlbmd0aCA9PSAzKSB7XHJcbiAgICAgICAgICB2YXIgZmlyc3QgPSB0cnVlO1xyXG5cclxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RvbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChzdG9uZXNbaV0gIT0gc3RlZW4pIHtcclxuICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRyYXRpbyA9PSA1MCkge1xyXG4gICAgICAgICAgICAgICAgc3RvbmVzW2ldLm1peFJhdGlvID0gMjU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7XHJcbiAgICAgICAgICAgICAgICAgIHN0b25lc1tpXS5taXhSYXRpbyA9IDUwO1xyXG4gICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHN0b25lc1tpXS5taXhSYXRpbyA9IDI1O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuTWl4UmF0aW9TZWxlY3QgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoc3RvbmVzLmxlbmd0aCA9PSAyKSB7XHJcbiAgICAgICAgICB2YXIgZmlyc3QgPSB0cnVlO1xyXG5cclxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RvbmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChzdG9uZXNbaV0gIT0gc3RlZW4pIHtcclxuICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRyYXRpbyA9PSA3NSkge1xyXG4gICAgICAgICAgICAgICAgc3RvbmVzW2ldLm1peFJhdGlvID0gMjU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2UgaWYgKHNlbGVjdGVkcmF0aW8gPT0gNTApIHtcclxuICAgICAgICAgICAgICAgIHN0b25lc1tpXS5taXhSYXRpbyA9IDUwO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBlbHNlIGlmIChzZWxlY3RlZHJhdGlvID09IDI1KSB7XHJcbiAgICAgICAgICAgICAgICBzdG9uZXNbaV0ubWl4UmF0aW8gPSA3NTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzdG9uZXNbaV0ubWl4UmF0aW8gPSA1MDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLk1peFJhdGlvU2VsZWN0ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgLy9mb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuU3RvbmVSb3dPYmplY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuU3RvbmVSb3dPYmplY3RzW2ldLm9wdGlvbnMubGVuZ3RoOyBqKyspIHtcclxuICAgICAgICAvLyAgICBmb3IgKHZhciBzID0gMDsgcyA8IHN0b25lcy5sZW5ndGg7IHMrKykge1xyXG4gICAgICAgIC8vICAgICAgaWYgKHRoaXMuU3RvbmVSb3dPYmplY3RzW2ldLm9wdGlvbnNbal0uQ29udGFpbnMoc3RvbmVzW3NdLmlkKSkge1xyXG4gICAgICAgIC8vICAgICAgICB0aGlzLlN0b25lUm93T2JqZWN0c1tpXS5vcHRpb25zW2pdLm1peFJhdGlvID0gTWF0aC5yb3VuZCgxMDAgLyBzdG9uZXMubGVuZ3RoKTtcclxuICAgICAgICAvLyAgICAgIH1cclxuICAgICAgICAvLyAgICB9XHJcbiAgICAgICAgLy8gIH1cclxuICAgICAgICAvL31cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cblxuICBwdWJsaWMgVXBkYXRlRGlzYWJsZUR1aXRzV2lsZHZlcmJhbmQoKTogdm9pZCB7XHJcbiAgICB0aGlzLkRpc2FibGVEdWl0c1dpbGR2ZXJiYW5kID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuU2VsZWN0ZWRGb3JtYWF0Py5uYW1lICE9IG51bGwpIHtcclxuICAgICAgaWYgKHRoaXMuU2VsZWN0ZWRGb3JtYWF0Lm5hbWU/LnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcIm1vZHV1bFwiKSAhPSAtMSkge1xyXG4gICAgICAgIHRoaXMuRGlzYWJsZUR1aXRzV2lsZHZlcmJhbmQgPSB0cnVlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5TZWxlY3RlZFZlcmJhbmRJZCA9PSA3MCkge1xyXG4gICAgICAgICAgdGhpcy5TZWxlY3RlZFZlcmJhbmRJZCA9IDYyO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cblxuICBwdWJsaWMgR2V0Rm9ybWFhdFN0cigpOiBzdHJpbmcge1xuICAgIHZhciBzdG9uZXMgPSB0aGlzLkdldFNlbGVjdGVkU3RvbmVzKCk7XG5cbiAgICBpZiAoc3RvbmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdmFyIG5hbWU6IHN0cmluZyA9IHN0b25lc1swXS5uYW1lICsgXCJcIjtcclxuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKG5hbWUuaW5kZXhPZignKCcpKSArIFwiXCI7XHJcblxyXG4gICAgICBpZiAobmFtZS5pbmRleE9mKFwidm9vcnppamRlXCIpICE9IC0xKSB7XHJcbiAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZShcIiAodm9vcnppamRlKVwiLCBcIlwiKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKG5hbWUuaW5kZXhPZihcImFjaHRlcnppamRlXCIpICE9IC0xKSB7XHJcbiAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZShcIiAoYWNodGVyemlqZGUpXCIsIFwiXCIpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gbmFtZTtcclxuICAgIH1cblxyXG4gICAgcmV0dXJuIFwiXCI7XHJcbiAgfVxuXG4gIHB1YmxpYyBHZXREaW1lbnNpb24oKTogc3RyaW5nIHtcbiAgICB2YXIgZm9ybWFhdCA9IHRoaXMuR2V0Rm9ybWFhdFN0cigpO1xuXG4gICAgc3dpdGNoIChmb3JtYWF0KSB7XG4gICAgICBjYXNlIFwiKG5vcm1hYWxmb3JtYWF0KVwiOlxyXG4gICAgICAgIHJldHVybiBcIjI0MHgxMTV4NzFcIjtcclxuICAgICAgY2FzZSBcIihkdW5uZm9ybWFhdClcIjpcclxuICAgICAgICByZXR1cm4gXCIyNDB4MTE1eDUyXCI7XHJcbiAgICAgIGNhc2UgXCIobW9kdXVsZm9ybWFhdCA1MilcIjpcclxuICAgICAgICByZXR1cm4gXCIyOTB4OTB4NTJcIjtcclxuICAgICAgY2FzZSBcIih3YWFsZm9ybWFhdClcIjpcclxuICAgICAgICByZXR1cm4gXCIyMTB4MTAweDUyXCI7XHJcbiAgICB9XG5cbiAgICByZXR1cm4gXCJcIjtcclxuICB9XG5cbiAgcHVibGljIEdldEtlcm4oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5UcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LkN1c3RvbUl0ZW0sIHVuZGVmaW5lZCwgXCJLZXJuXCIpO1xyXG4gIH1cblxuICBwdWJsaWMgR2V0TFNUb29sdGlwKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5DdXN0b21JdGVtLCB1bmRlZmluZWQsIFwiTFNcIik7XHJcbiAgfVxuXG4gIHB1YmxpYyBHZXRXU1Rvb2x0aXAoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5UcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LkN1c3RvbUl0ZW0sIHVuZGVmaW5lZCwgXCJXU1wiKTtcclxuICB9XG5cbiAgcHVibGljIEdldExlbmd0ZSgpOiBudW1iZXIge1xuICAgIHZhciBmb3JtYWF0ID0gdGhpcy5HZXRGb3JtYWF0U3RyKCk7XG5cbiAgICBzd2l0Y2ggKGZvcm1hYXQpIHtcbiAgICAgIGNhc2UgXCIobm9ybWFhbGZvcm1hYXQpXCI6XHJcbiAgICAgICAgcmV0dXJuIDI0MDtcclxuICAgICAgY2FzZSBcIihkdW5uZm9ybWFhdClcIjpcclxuICAgICAgICByZXR1cm4gMjQwO1xyXG4gICAgICBjYXNlIFwiKG1vZHV1bGZvcm1hYXQgNTIpXCI6XHJcbiAgICAgICAgcmV0dXJuIDI5MDtcclxuICAgICAgY2FzZSBcIih3YWFsZm9ybWFhdClcIjpcclxuICAgICAgICByZXR1cm4gMjEwO1xyXG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xyXG4gIH1cblxuICBwdWJsaWMgR2V0QnJlZWR0ZSgpOiBudW1iZXIge1xuICAgIHZhciBmb3JtYWF0ID0gdGhpcy5HZXRGb3JtYWF0U3RyKCk7XG5cbiAgICBzd2l0Y2ggKGZvcm1hYXQpIHtcbiAgICAgIGNhc2UgXCIobm9ybWFhbGZvcm1hYXQpXCI6XHJcbiAgICAgICAgcmV0dXJuIDExNTtcclxuICAgICAgY2FzZSBcIihkdW5uZm9ybWFhdClcIjpcclxuICAgICAgICByZXR1cm4gMTE1O1xyXG4gICAgICBjYXNlIFwiKG1vZHV1bGZvcm1hYXQgNTIpXCI6XHJcbiAgICAgICAgcmV0dXJuIDkwO1xyXG4gICAgICBjYXNlIFwiKHdhYWxmb3JtYWF0KVwiOlxyXG4gICAgICAgIHJldHVybiAxMDA7XHJcbiAgICB9XG5cbiAgICByZXR1cm4gLTE7XHJcbiAgfVxuXG4gIHB1YmxpYyBJc0FuZGVycyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGlmIChuYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcImR1YmJlbFwiKSAhPSAtMSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAobmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCIzNjVcIikgIT0gLTEpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwibW9kdXVsZm9ybWFhdCA0MFwiKSAhPSAtMSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxufVxuXG5jbGFzcyBTdG9uZVJvd09iamVjdCB7XG4gIG5hbWU6IHN0cmluZztcclxuXHJcbiAgb3B0aW9uczogU3RvbmVGb3JtYWF0T2JqZWN0W10gPSBuZXcgQXJyYXk8U3RvbmVGb3JtYWF0T2JqZWN0PigpO1xyXG5cclxuICBwcml2YXRlIEZhYnJpa2FudGVuU2VydmljZTogRmFicmlrYW50ZW5TZXJ2aWNlO1xyXG4gIHB1YmxpYyBGYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50OiBGYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50O1xyXG5cclxuICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIEZhYnJpa2FudGVuU2VydmljZTogRmFicmlrYW50ZW5TZXJ2aWNlLCBGYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50OiBGYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50KSB7XHJcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xyXG4gICAgdGhpcy5GYWJyaWthbnRlblNlcnZpY2UgPSBGYWJyaWthbnRlblNlcnZpY2U7XHJcbiAgICB0aGlzLkZhYlRleHR1cmVDb25maWd1cmF0b3JDb21wb25lbnQgPSBGYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIFNlbGVjdChvcHRpb246IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuQ2FuU2VsZWN0U3RvbmUob3B0aW9uKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB2YXIgbmFtZSA9IHRoaXMub3B0aW9uc1tpXS5uYW1lO1xyXG5cclxuICAgICAgICBpZiAoKG5hbWUgIT0gbnVsbCAmJiBvcHRpb24ubmFtZSAhPSBudWxsICYmIG5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKG9wdGlvbi5uYW1lLnRvTG93ZXJDYXNlKCkpICE9IC0xICYmIG5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKFwiZHViYmVsXCIpID09IC0xKSB8fFxyXG4gICAgICAgICAgKG9wdGlvbi5uYW1lIS50b0xvd2VyQ2FzZSgpID09IFwiYW5kZXJzXCIgJiYgKHRoaXMuRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudC5Jc0FuZGVycyhuYW1lKSkpKSB7XHJcblxyXG4gICAgICAgICAgdGhpcy5vcHRpb25zW2ldLnNlbGVjdGVkID0gIXRoaXMub3B0aW9uc1tpXS5zZWxlY3RlZDtcclxuICAgICAgICAgIHRoaXMub3B0aW9uc1tpXS5zZWxlY3RlZGRvdWJsZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnNbaV0uc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5GYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50LlNlbGVjdGVkRm9ybWFhdCA9IG9wdGlvbjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5GYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50Lk5vU3RvbmVTZWxlY3RlZCgpKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5GYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50LlNlbGVjdGVkRm9ybWFhdCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLkZhYlRleHR1cmVDb25maWd1cmF0b3JDb21wb25lbnQuVXBkYXRlRGlzYWJsZUR1aXRzV2lsZHZlcmJhbmQoKTtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudC5TZXRNaXhSYXRpb3MoKTtcclxuICAgIH1cclxuICB9XG5cbiAgcHVibGljIFNlbGVjdFNlY29uZChvcHRpb246IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuQ2FuU2VsZWN0U3RvbmVTZWNvbmQob3B0aW9uKSkge1xuICAgICAgdmFyIGhpdEZpcnN0ID0gZmFsc2U7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdmFyIG5hbWUgPSB0aGlzLm9wdGlvbnNbaV0ubmFtZTtcclxuXHJcbiAgICAgICAgaWYgKChuYW1lICE9IG51bGwgJiYgb3B0aW9uLm5hbWUgIT0gbnVsbCAmJiBuYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihvcHRpb24ubmFtZS50b0xvd2VyQ2FzZSgpKSAhPSAtMSAmJiBuYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcImR1YmJlbFwiKSA9PSAtMSkgfHxcclxuICAgICAgICAgIChvcHRpb24ubmFtZSEudG9Mb3dlckNhc2UoKSA9PSBcImFuZGVyc1wiICYmICh0aGlzLkZhYlRleHR1cmVDb25maWd1cmF0b3JDb21wb25lbnQuSXNBbmRlcnMobmFtZSkpKSkge1xyXG5cclxuICAgICAgICAgIGlmIChoaXRGaXJzdCkge1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnNbaV0uc2VsZWN0ZWQgPSAhdGhpcy5vcHRpb25zW2ldLnNlbGVjdGVkO1xyXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnNbaV0uc2VsZWN0ZWRkb3VibGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnNbaV0uc2VsZWN0ZWQpIHtcclxuICAgICAgICAgICAgICB0aGlzLkZhYlRleHR1cmVDb25maWd1cmF0b3JDb21wb25lbnQuU2VsZWN0ZWRGb3JtYWF0ID0gb3B0aW9uO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLkZhYlRleHR1cmVDb25maWd1cmF0b3JDb21wb25lbnQuTm9TdG9uZVNlbGVjdGVkKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudC5TZWxlY3RlZEZvcm1hYXQgPSBudWxsO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5GYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50LlVwZGF0ZURpc2FibGVEdWl0c1dpbGR2ZXJiYW5kKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaGl0Rmlyc3QgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5GYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50LlNldE1peFJhdGlvcygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIEFkZE9wdGlvbihvcHRpb246IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsKTogdm9pZCB7XG4gICAgdmFyIG5hbWUgPSBvcHRpb24ubmFtZSArIFwiXCI7XG5cbiAgICBuYW1lID0gbmFtZS5yZXBsYWNlKFwiKHZvb3J6aWpkZSlcIiwgXCJcIik7XG4gICAgbmFtZSA9IG5hbWUucmVwbGFjZShcIihhY2h0ZXJ6aWpkZSlcIiwgXCJcIik7XG4gICAgbmFtZSA9IG5hbWUudHJpbSgpO1xuXG4gICAgdmFyIHN0b25lcm93ID0gbnVsbDtcbiAgICBpZiAobmFtZSAhPSBudWxsKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnNbaV0ubmFtZSA9PSBuYW1lKSB7XHJcbiAgICAgICAgICBzdG9uZXJvdyA9IHRoaXMub3B0aW9uc1tpXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cblxuICAgIGlmIChzdG9uZXJvdyA9PSBudWxsKSB7XG4gICAgICBzdG9uZXJvdyA9IG5ldyBTdG9uZUZvcm1hYXRPYmplY3QoKTtcclxuICAgICAgc3RvbmVyb3cubmFtZSA9IG5hbWUgKyBcIlwiO1xyXG4gICAgICB0aGlzLm9wdGlvbnMucHVzaChzdG9uZXJvdyk7XHJcbiAgICB9XG5cbiAgICBzdG9uZXJvdy5BZGRTdG9uZShvcHRpb24pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIENhblNlbGVjdFN0b25lKG9wdGlvbjogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwpOiBib29sZWFuIHtcbiAgICB2YXIgYW1vdW50ID0gdGhpcy5GYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50LkdldFNlbGVjdGVkQW1vdW50KCk7XG4gICAgdmFyIG90aGVyID0gdGhpcy5GYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50LklzT3RoZXJTZWxlY3RlZCgpO1xuXG4gICAgaWYgKGFtb3VudCA9PSA0IHx8IG90aGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5Jc1NlbGVjdGVkKG9wdGlvbik7XHJcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpZiAodGhpcy5GYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50LlNlbGVjdGVkRm9ybWFhdCA9PSBudWxsIHx8XG4gICAgICAgIHRoaXMuRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudC5TZWxlY3RlZEZvcm1hYXQuaWQgPT0gb3B0aW9uLmlkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBDYW5TZWxlY3RTdG9uZVNlY29uZChvcHRpb246IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsKTogYm9vbGVhbiB7XG4gICAgdmFyIGFtb3VudCA9IHRoaXMuRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudC5HZXRTZWxlY3RlZEFtb3VudCgpO1xuICAgIHZhciBvdGhlciA9IHRoaXMuRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudC5Jc090aGVyU2VsZWN0ZWQoKTtcblxuICAgIGlmIChhbW91bnQgPT0gNCB8fCBvdGhlcikge1xuICAgICAgcmV0dXJuIHRoaXMuSXNTZWxlY3RlZFNlY29uZChvcHRpb24pO1xyXG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaWYgKHRoaXMuRmFiVGV4dHVyZUNvbmZpZ3VyYXRvckNvbXBvbmVudC5TZWxlY3RlZEZvcm1hYXQgPT0gbnVsbCB8fFxuICAgICAgICB0aGlzLkZhYlRleHR1cmVDb25maWd1cmF0b3JDb21wb25lbnQuU2VsZWN0ZWRGb3JtYWF0LmlkID09IG9wdGlvbi5pZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgRGlzYWJsZVRvZ2dsZSgpOiBib29sZWFuIHtcbiAgICB2YXIgc3RvbmVzID0gdGhpcy5GYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50LkdldFNlbGVjdGVkU3RvbmVPYmplY3RzKCk7XG5cbiAgICByZXR1cm4gc3RvbmVzLmxlbmd0aCA9PSA0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIEdldFNlbGVjdGVkU3RvbmVPYmplY3RzKHN0b25lczogQXJyYXk8U3RvbmVGb3JtYWF0T2JqZWN0Pik6IHZvaWQge1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMubGVuZ3RoOyBpKyspIHtcblxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zW2ldLnNlbGVjdGVkKSB7XHJcbiAgICAgICAgc3RvbmVzLnB1c2godGhpcy5vcHRpb25zW2ldKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIEdldFN0b25lRm9ybWFhdE9iamVjdChvcHRpb246IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsKTogU3RvbmVGb3JtYWF0T2JqZWN0IHwgbnVsbCB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdmFyIG5hbWUgPSB0aGlzLm9wdGlvbnNbaV0ubmFtZTtcclxuICAgICAgaWYgKG9wdGlvbi5uYW1lIS50b0xvd2VyQ2FzZSgpID09IFwiYW5kZXJzXCIpIHtcclxuICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5GYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50LklzQW5kZXJzKG5hbWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNbaV07XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgb3B0aW9uLm5hbWUgIT0gbnVsbCAmJiBuYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihvcHRpb24ubmFtZS50b0xvd2VyQ2FzZSgpKSAhPSAtMSAmJiBuYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcImR1YmJlbFwiKSA9PSAtMSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9uc1tpXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIEdldFN0b25lRm9ybWFhdE9iamVjdFNlY29uZChvcHRpb246IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsKTogU3RvbmVGb3JtYWF0T2JqZWN0IHwgbnVsbCB7XG4gICAgdmFyIGhpdEZpcnN0ID0gZmFsc2U7XHJcblxyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdmFyIG5hbWUgPSB0aGlzLm9wdGlvbnNbaV0ubmFtZTtcclxuICAgICAgaWYgKG9wdGlvbi5uYW1lIS50b0xvd2VyQ2FzZSgpID09IFwiYW5kZXJzXCIpIHtcclxuICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5GYWJUZXh0dXJlQ29uZmlndXJhdG9yQ29tcG9uZW50LklzQW5kZXJzKG5hbWUpKSB7XHJcbiAgICAgICAgICAgIGlmICghaGl0Rmlyc3QpXHJcbiAgICAgICAgICAgICAgaGl0Rmlyc3QgPSB0cnVlO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9uc1tpXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIEhhc1N0b25lKG9wdGlvbjogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwpOiBib29sZWFuIHtcbiAgICB2YXIgc3RvbmUgPSB0aGlzLkdldFN0b25lRm9ybWFhdE9iamVjdChvcHRpb24pO1xuXG4gICAgaWYgKHN0b25lICE9IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIEhhc1NlY29uZFN0b25lKG9wdGlvbjogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwpOiBib29sZWFuIHtcbiAgICB2YXIgc3RvbmUgPSB0aGlzLkdldFN0b25lRm9ybWFhdE9iamVjdFNlY29uZChvcHRpb24pO1xuXG4gICAgaWYgKHN0b25lICE9IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIElzRG91dmxlQVYob3B0aW9uOiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCk6IGJvb2xlYW4ge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHZhciBuYW1lID0gdGhpcy5vcHRpb25zW2ldLm5hbWU7XHJcbiAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgb3B0aW9uLm5hbWUgIT0gbnVsbCAmJiBuYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihvcHRpb24ubmFtZS50b0xvd2VyQ2FzZSgpKSAhPSAtMSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNbaV0uZG91YmxlYXY7XHJcbiAgICAgIH1cclxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBIYXNTdG9uZVNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnNbaV0uc2VsZWN0ZWQpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIElzQW55U2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9wdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgaWYgKHRoaXMub3B0aW9uc1tpXS5zZWxlY3RlZCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgSXNTZWxlY3RlZChvcHRpb246IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsKTogYm9vbGVhbiB7XG4gICAgdmFyIHN0b25lID0gdGhpcy5HZXRTdG9uZUZvcm1hYXRPYmplY3Qob3B0aW9uKTtcblxuICAgIGlmIChzdG9uZSAhPSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBzdG9uZS5zZWxlY3RlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgSXNTZWxlY3RlZFNlY29uZChvcHRpb246IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsKTogYm9vbGVhbiB7XG4gICAgdmFyIHN0b25lID0gdGhpcy5HZXRTdG9uZUZvcm1hYXRPYmplY3RTZWNvbmQob3B0aW9uKTtcblxuICAgIGlmIChzdG9uZSAhPSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBzdG9uZS5zZWxlY3RlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0SW1hZ2Uob3B0aW9uOiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCk6IHN0cmluZyB7XG4gICAgdmFyIHN0b25lID0gdGhpcy5HZXRTdG9uZShvcHRpb24pO1xuXG4gICAgaWYgKHN0b25lLmlkICE9IDApIHtcbiAgICAgIHZhciB2YWx1ZSA9IHN0b25lLmltYWdlUGF0aCArIFwiXCI7XHJcblxyXG4gICAgICBpZiAodmFsdWUuaW5kZXhPZihcIiNCQ0IjXCIpICE9IC0xKSB7XHJcbiAgICAgICAgdmFyIGJjYnVybCA9IHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuU2V0dGluZ3NWaWV3TW9kZWwuYmNiV2Vic2VydmljZVVSTEJhc2UgKyBcIlwiO1xyXG4gICAgICAgIGJjYnVybCA9IGJjYnVybC5zdWJzdHJpbmcoMCwgYmNidXJsLmxlbmd0aCAtIDEpO1xyXG5cclxuICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoXCIjQkNCI1wiLCBiY2J1cmwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIFwiXCI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0SW1hZ2VTZWNvbmQob3B0aW9uOiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCk6IHN0cmluZyB7XG4gICAgdmFyIHN0b25lID0gdGhpcy5HZXRTdG9uZVNlY29uZChvcHRpb24pO1xuXG4gICAgaWYgKHN0b25lLmlkICE9IDApIHtcbiAgICAgIHZhciB2YWx1ZSA9IHN0b25lLmltYWdlUGF0aCArIFwiXCI7XHJcblxyXG4gICAgICBpZiAodmFsdWUuaW5kZXhPZihcIiNCQ0IjXCIpICE9IC0xKSB7XHJcbiAgICAgICAgdmFyIGJjYnVybCA9IHRoaXMuRmFicmlrYW50ZW5TZXJ2aWNlLkZhYnJpa2FudGVuU2V0dGluZ3NWaWV3TW9kZWwuYmNiV2Vic2VydmljZVVSTEJhc2UgKyBcIlwiO1xyXG4gICAgICAgIGJjYnVybCA9IGJjYnVybC5zdWJzdHJpbmcoMCwgYmNidXJsLmxlbmd0aCAtIDEpO1xyXG5cclxuICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoXCIjQkNCI1wiLCBiY2J1cmwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIFwiXCI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0U3RvbmUob3B0aW9uOiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCk6IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsIHtcbiAgICB2YXIgc3RvbmUgPSB0aGlzLkdldFN0b25lRm9ybWFhdE9iamVjdChvcHRpb24pO1xuXG4gICAgaWYgKHN0b25lICE9IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHN0b25lLm9wdGlvbnNbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIEdldFN0b25lU2Vjb25kKG9wdGlvbjogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwpOiBGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbCB7XG4gICAgdmFyIHN0b25lID0gdGhpcy5HZXRTdG9uZUZvcm1hYXRPYmplY3RTZWNvbmQob3B0aW9uKTtcblxuICAgIGlmIChzdG9uZSAhPSBudWxsKSB7XHJcbiAgICAgIHJldHVybiBzdG9uZS5vcHRpb25zWzBdO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBHZXRTZWxlY3RlZFN0b25lcyhzdG9uZXM6IEFycmF5PEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsPik6IHZvaWQge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRoaXMub3B0aW9uc1tpXS5HZXRTZWxlY3RlZFN0b25lcyhzdG9uZXMpO1xyXG4gICAgfVxyXG4gIH1cclxufVxuXG5jbGFzcyBTdG9uZUZvcm1hYXRPYmplY3Qge1xuICBwdWJsaWMgbmFtZTogc3RyaW5nID0gXCJcIjtcclxuICBwdWJsaWMgbWl4UmF0aW86IG51bWJlciA9IDA7XHJcbiAgcHVibGljIHNlbGVjdGVkTWl4UmF0aW86IG51bWJlciA9IDA7XHJcbiAgcHVibGljIHNlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIG9wdGlvbnM6IEZhYnJpa2FudGVuRmlsdGVyT3B0aW9uVmlld01vZGVsW10gPSBuZXcgQXJyYXk8RmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWw+KCk7XHJcbiAgcHVibGljIGRvdWJsZWF2OiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHNlbGVjdGVkZG91YmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgY29uc3RydWN0b3IoKSB7XHJcblxyXG4gIH1cclxuXHJcbiAgcHVibGljIENvbnRhaW5zKGlkOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLm9wdGlvbnNbaV0uaWQgPT0gaWQpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBBZGRTdG9uZShzdG9uZTogRmFicmlrYW50ZW5GaWx0ZXJPcHRpb25WaWV3TW9kZWwpOiB2b2lkIHtcclxuICAgIHRoaXMub3B0aW9ucy5wdXNoKHN0b25lKTtcclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLmxlbmd0aCA+IDEpIHtcclxuICAgICAgdGhpcy5kb3VibGVhdiA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5sZW5ndGggPiAxKSB7XHJcbiAgICAgIHRoaXMub3B0aW9ucy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgLy8gcmV0dXJuIDwgMCDihpIgYSB2w7PDs3IgYlxyXG4gICAgICAgIC8vIHJldHVybiA+IDAg4oaSIGEgbsOhIGJcclxuICAgICAgICAvLyByZXR1cm4gMCDihpIgZ2VsaWprXHJcbiAgICAgICAgaWYgKChhLm5hbWUgKyBcIlwiKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJhY2h0ZXJ6aWpkZVwiKSAhPSAtMSkge1xyXG4gICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgR2V0U2VsZWN0ZWRTdG9uZXMoc3RvbmVzOiBBcnJheTxGYWJyaWthbnRlbkZpbHRlck9wdGlvblZpZXdNb2RlbD4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZCkge1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRkb3VibGUpIHtcclxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMub3B0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgc3RvbmVzLnB1c2godGhpcy5vcHRpb25zW2ldKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBzdG9uZXMucHVzaCh0aGlzLm9wdGlvbnNbMF0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XG4iLCI8ZGl2ICpuZ0lmPVwiSXNMb2FkaW5nKClcIiBjbGFzcz1cImxvYWRlclwiPlxyXG4gIDxtYXQtY2FyZCBjbGFzcz1cImxvYWRlci1jYXJkXCI+XHJcbiAgICA8bWF0LWNhcmQtY29udGVudD5cclxuICAgICAgPG1hdC1zcGlubmVyIGNsYXNzPVwibG9hZGVyLXNwaW5uZXJcIiBbZGlhbWV0ZXJdPVwiODBcIj48L21hdC1zcGlubmVyPlxyXG4gICAgPC9tYXQtY2FyZC1jb250ZW50PlxyXG4gICAgPG1hdC1jYXJkLXN1YnRpdGxlIGNsYXNzPVwibG9hZGVyLXN1YnRpdGxlXCIgKm5nSWY9XCIhRmFicmlrYW50ZW5TZXJ2aWNlLklzU3RhcnRpbmdEb3dubG9hZCgpXCI+XHJcbiAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuUHJvZHVjdHNMb2FkaW5nKSB9fVxyXG4gICAgPC9tYXQtY2FyZC1zdWJ0aXRsZT5cclxuICA8L21hdC1jYXJkPlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgKm5nSWY9XCIhSXNMb2FkaW5nKClcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XHJcbiAgPGRpdiBzdHlsZT1cImZsZXg6YXV0bztcIj48L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiY2VudGVyLWJsb2NrXCI+XHJcbiAgICA8bmctY29udGFpbmVyIGNsYXNzPVwidGFibGUtY29udGFpbmVyXCIgKm5nSWY9XCIhdGhpcy5TaW5nbGVTdG9uZU1vZGVcIj5cclxuICAgICAgPHRhYmxlIGNsYXNzPVwibWFpbi10YWJsZVwiPlxyXG4gICAgICAgIDx0ciBjbGFzcz1cIm1haW4tdGFibGUtdG9wLXJvd1wiPlxyXG4gICAgICAgICAgPHRkIGNsYXNzPVwibWFpbi10YWJsZS10b3Atcm93LWZpcnN0IG1haW4tdGFibGUtdG9wLXJvdy10ZFwiPjwvdGQ+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgR2V0Rm9ybWFhdCgpXCI+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cIm1haW4tdGFibGUtdG9wLXJvdy1vdGhlciBtYWluLXRhYmxlLXRvcC1yb3ctdGRcIj5cclxuICAgICAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuRmlsdGVyT3B0aW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5Lk5hbWUsIG9wdGlvbi5pZCkgfX1cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3RvbmUgb2YgU3RvbmVSb3dPYmplY3RzXCI+XHJcbiAgICAgICAgICA8dHIgY2xhc3M9XCJtYWluLXRhYmxlLXJvd1wiPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJtYWluLXRhYmxlLXJvdy10ZCBtYWluLXRhYmxlLXJvdy10ZC1maXJzdFwiPlxyXG4gICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFpbi10YWJsZS1yb3ctdGQtbmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBzdG9uZS5uYW1lIH19XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIEdldEZvcm1hYXQoKVwiPlxyXG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cIm1haW4tdGFibGUtcm93LXRkIG1haW4tdGFibGUtcm93LXRkLWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdG9uZS5IYXNTdG9uZShvcHRpb24pXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0b25lLXRpbGVcIiAoY2xpY2spPVwic3RvbmUuU2VsZWN0KG9wdGlvbilcIiBbY2xhc3Muc2VsZWN0ZWRdPVwic3RvbmUuSXNTZWxlY3RlZChvcHRpb24pXCIgW2NsYXNzLm5vdC1zZWxlY3RhYmxlXT1cIiFzdG9uZS5DYW5TZWxlY3RTdG9uZShvcHRpb24pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2Vybi1kaXZcIiAqbmdJZj1cIlNob3dLZXJuKHN0b25lLCBvcHRpb24pXCI+e3sgR2V0S2VybigpIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RpY2tlci1kaXZcIiAqbmdJZj1cIlNob3dTdGlja2VyKHN0b25lLCBvcHRpb24pXCI+e3sgR2V0U3RpY2tlcihzdG9uZSwgb3B0aW9uKSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cInN0b25lLkdldEltYWdlKG9wdGlvbilcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaXgtYmxvY2tcIiAqbmdJZj1cIkdldFNlbGVjdGVkU3RvbmVPYmplY3RzKCkubGVuZ3RoID4gMSAmJiBzdG9uZS5Jc1NlbGVjdGVkKG9wdGlvbilcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhSXNUZXh0dXJlTWl4MjUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cImZpbGxcIiBjbGFzcz1cInNtYWxsLWlucHV0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peCAlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJudW1iZXJcIiBtaW49XCIxXCIgbWF4PVwiMTAwXCIgWyhuZ01vZGVsKV09XCJzdG9uZS5HZXRTdG9uZShvcHRpb24pLm1peFJhdGlvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJJc1RleHR1cmVNaXgyNSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiIGNsYXNzPVwiZnVsbHdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbCBjbGFzcz1cInNlbGVjdC1tYXQtbGFiZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peCAlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInN0b25lLkdldFN0b25lRm9ybWFhdE9iamVjdChvcHRpb24pIGFzIGZvcm1hYXRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IFt2YWx1ZV09XCJmb3JtYWF0Lm1peFJhdGlvXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiVXBkYXRlUmF0aW9zKHN0b25lLCBvcHRpb24sICRldmVudC52YWx1ZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjI1XCI+MjUlPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cIkRpc2FibGU1MCgpXCIgW3ZhbHVlXT1cIjUwXCI+NTAlPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cIkRpc2FibGU3NSgpXCIgW3ZhbHVlXT1cIjc1XCI+NzUlPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInN0b25lLklzRG91dmxlQVYob3B0aW9uKVwiIGNsYXNzPVwibHN3cy1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsc3dzLWl0ZW1cIiBtYXRUb29sdGlwQ2xhc3M9XCJmaWx0ZXItdG9vbHRpcFwiIG1hdFRvb2x0aXA9XCJ7eyBHZXRMU1Rvb2x0aXAoKSB9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibHN3cy1pdGVtLXRleHRcIj5MUzwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+aW5mbzwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsc3dzLWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGUgWyhuZ01vZGVsKV09XCJzdG9uZS5HZXRTdG9uZUZvcm1hYXRPYmplY3Qob3B0aW9uKS5zZWxlY3RlZGRvdWJsZVwiIFtkaXNhYmxlZF09XCJzdG9uZS5EaXNhYmxlVG9nZ2xlKClcIj48L21hdC1zbGlkZS10b2dnbGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsc3dzLWl0ZW1cIiBtYXRUb29sdGlwQ2xhc3M9XCJmaWx0ZXItdG9vbHRpcFwiIG1hdFRvb2x0aXA9XCJ7eyBHZXRXU1Rvb2x0aXAoKSB9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibHN3cy1pdGVtLXRleHRcIj5XUzwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+aW5mbzwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzdG9uZS5IYXNTZWNvbmRTdG9uZShvcHRpb24pXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmU7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0b25lLXRpbGVcIiAoY2xpY2spPVwic3RvbmUuU2VsZWN0U2Vjb25kKG9wdGlvbilcIiBbY2xhc3Muc2VsZWN0ZWRdPVwic3RvbmUuSXNTZWxlY3RlZFNlY29uZChvcHRpb24pXCIgW2NsYXNzLm5vdC1zZWxlY3RhYmxlXT1cIiFzdG9uZS5DYW5TZWxlY3RTdG9uZVNlY29uZChvcHRpb24pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2Vybi1kaXZcIiAqbmdJZj1cIlNob3dLZXJuKHN0b25lLCBvcHRpb24pXCI+e3sgR2V0S2VybigpIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RpY2tlci1kaXZcIiAqbmdJZj1cIlNob3dTdGlja2VyU2Vjb25kKHN0b25lLCBvcHRpb24pXCI+e3sgR2V0U3RpY2tlclNlY29uZChzdG9uZSwgb3B0aW9uKSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cInN0b25lLkdldEltYWdlU2Vjb25kKG9wdGlvbilcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLTxkaXYgKm5nSWY9XCJzdG9uZS5Jc0RvdXZsZUFWKG9wdGlvbilcIiBjbGFzcz1cImxzd3MtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibHN3cy1pdGVtXCIgbWF0VG9vbHRpcENsYXNzPVwiZmlsdGVyLXRvb2x0aXBcIiBtYXRUb29sdGlwPVwie3sgR2V0TFNUb29sdGlwKCkgfX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxzd3MtaXRlbS10ZXh0XCI+TFM8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmluZm88L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibHN3cy1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlIFsobmdNb2RlbCldPVwic3RvbmUuR2V0U3RvbmVGb3JtYWF0T2JqZWN0KG9wdGlvbikuc2VsZWN0ZWRkb3VibGVcIiBbZGlzYWJsZWRdPVwic3RvbmUuRGlzYWJsZVRvZ2dsZSgpXCI+PC9tYXQtc2xpZGUtdG9nZ2xlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibHN3cy1pdGVtXCIgbWF0VG9vbHRpcENsYXNzPVwiZmlsdGVyLXRvb2x0aXBcIiBtYXRUb29sdGlwPVwie3sgR2V0V1NUb29sdGlwKCkgfX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxzd3MtaXRlbS10ZXh0XCI+V1M8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmluZm88L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+LS0+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L3RhYmxlPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJ0ZXh0dXJlLWNvbnRhaW5lclwiIFtjbGFzcy50ZXh0dXJlLWNvbnRhaW5lci1tYXJnaW5dPVwidGhpcy5TaW5nbGVTdG9uZU1vZGVcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInRleHR1cmUtY29udGFpbmVyLWZseVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaXNwbGF5ZmxleFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBvbmVudC1ibG9jayBmaXJzdC1yb3dcIj5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCIgY2xhc3M9XCJmdWxsd2lkdGhcIj5cclxuICAgICAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwic2VsZWN0LW1hdC1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAge3sgVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5WZXJiYW5kKSB9fVxyXG4gICAgICAgICAgICAgIDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwiU2VsZWN0ZWRWZXJiYW5kSWRcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0LXRyaWdnZXI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJTZWxlY3RlZFZlcmJhbmRJZCBhcyBpZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJHZXRWZXJiYW5kQnlJZChpZCkgYXMgdlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3QtdHJpZ2dlci1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsdGVyLW9wdGlvbi1pbWFnZS1taW5pLWRpdlwiICpuZ0lmPVwidi5pbWFnZVBhdGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiR2V0SW1hZ2VQYXRoUHJvZHVjdCh2KVwiIGNsYXNzPVwiZmlsdGVyLW9wdGlvbi1pbWFnZVwiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZWxlY3QtdHJpZ2dlci1jb250ZW50LXRleHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuUHJvZHVjdCwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5OYW1lLCB2LmlkKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0LXRyaWdnZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmVyYmFuZCBvZiBHZXRWZXJiYW5kZW4oKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwidmVyYmFuZC5pZFwiIGNsYXNzPVwic2VsZWN0LW1hdC1vcHRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidmVyYmFuZC5pbWFnZVBhdGggIT0gbnVsbCAmJiB2ZXJiYW5kLmltYWdlUGF0aCAhPSAnJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci1vcHRpb24taW1hZ2UtbWluaS1kaXZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCJ7eyBHZXRJbWFnZVBhdGhQcm9kdWN0KHZlcmJhbmQpIH19XCIgY2xhc3M9XCJmaWx0ZXItb3B0aW9uLWltYWdlXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Qcm9kdWN0LCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5Lk5hbWUsIHZlcmJhbmQuaWQpIH19XHJcbiAgICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wb25lbnQtYmxvY2sgZmlyc3Qtcm93XCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJHZXRWb2VnKCkgIT0gbnVsbFwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiIGNsYXNzPVwiZnVsbHdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsIGNsYXNzPVwic2VsZWN0LW1hdC1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LlZvZWcpIH19XHJcbiAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IFsobmdNb2RlbCldPVwiU2VsZWN0ZWRWb2VnSWRcIj5cclxuICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QtdHJpZ2dlcj5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiU2VsZWN0ZWRWb2VnSWQgYXMgaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJHZXRWb2VnQnlJZChpZCkgYXMgdlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNlbGVjdC10cmlnZ2VyLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbHRlci1vcHRpb24taW1hZ2UtbWluaS1kaXZcIiAqbmdJZj1cInYuaW1hZ2VQYXRoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiR2V0SW1hZ2VQYXRoUHJvZHVjdCh2KVwiIGNsYXNzPVwiZmlsdGVyLW9wdGlvbi1pbWFnZVwiIGFsdD1cIlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VsZWN0LXRyaWdnZXItY29udGVudC10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuRmlsdGVyT3B0aW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5Lk5hbWUsIHYuaWQpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0LXRyaWdnZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2b2VnIG9mIEdldFZvZWcoKS5maWx0ZXIub3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJ2b2VnLmlkXCIgY2xhc3M9XCJzZWxlY3QtbWF0LW9wdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZvZWcuaW1hZ2VQYXRoICE9IG51bGwgJiYgdm9lZy5pbWFnZVBhdGggIT0gJydcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlci1vcHRpb24taW1hZ2UtbWluaS1kaXZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz1cInt7IEdldEltYWdlUGF0aCh2b2VnKSB9fVwiIGNsYXNzPVwiZmlsdGVyLW9wdGlvbi1pbWFnZVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuRmlsdGVyT3B0aW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5Lk5hbWUsIHZvZWcuaWQpIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb21wb25lbnQtYmxvY2tcIj5cclxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCIgY2xhc3M9XCJzbWFsbC1pbnB1dFwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LlN0b290dm9lZykgfX1cclxuICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cInt7IFN0b290dm9lZ01pbiB9fVwiIG1heD1cInt7IFN0b290dm9lZ01heCB9fVwiIFsobmdNb2RlbCldPVwiU3Rvb3R2b2VnXCI+XHJcbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcG9uZW50LWJsb2NrXCI+XHJcbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiIGNsYXNzPVwic21hbGwtaW5wdXRcIj5cclxuICAgICAgICAgICAgICA8bWF0LWxhYmVsPlxyXG4gICAgICAgICAgICAgICAge3sgVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5MaW50dm9lZykgfX1cclxuICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cInt7IExpbnR2b2VnTWluIH19XCIgbWF4PVwie3sgTGludHZvZWdNYXggfX1cIiBbKG5nTW9kZWwpXT1cIkxpbnR2b2VnXCI+XHJcbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNsaWRlci1ibG9ja1wiICpuZ0lmPVwiIUhpUmVzXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2xpZGVyLWJsb2NrLW5hbWVcIj5cclxuICAgICAgICAgICAge3sgVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5BYW50YWxTdGVuZW4pIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbGlkZXItYmxvY2stc2xpZGVyXCI+XHJcbiAgICAgICAgICAgIDxtYXQtc2xpZGVyIG1pbj1cIjEwMFwiIG1heD1cIjIwMDBcIiBzdGVwPVwiNTBcIiBzaG93VGlja01hcmtzIGRpc2NyZXRlIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+XHJcbiAgICAgICAgICAgICAgPGlucHV0IG1hdFNsaWRlclRodW1iIFsobmdNb2RlbCldPVwiQWFudGFsU3RlbmVuXCI+XHJcbiAgICAgICAgICAgIDwvbWF0LXNsaWRlcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNsaWRlci1ibG9jay1hbW91bnRcIj5cclxuICAgICAgICAgICAge3sgQWFudGFsU3RlbmVuIH19XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImhpZ2gtcmVzLWNoZWNrYm94LWRpdlwiPlxyXG4gICAgICAgICAgPG1hdC1jaGVja2JveCBbKG5nTW9kZWwpXT1cIkhpUmVzXCIgY2xhc3M9XCJoaWdoLXJlcy1jaGVja2JveFwiPlxyXG4gICAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LkhvZ2VSZXNvbHV0aWUpIH19XHJcbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImhpZ2gtcmVzLWNoZWNrYm94LWRpdlwiPlxyXG4gICAgICAgICAgPG1hdC1jaGVja2JveCBbKG5nTW9kZWwpXT1cIlNoYWRlXCIgY2xhc3M9XCJoaWdoLXJlcy1jaGVja2JveFwiPlxyXG4gICAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LlNoYWR1dykgfX1cclxuICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9ucm93XCI+XHJcbiAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJTaW5nbGVTdG9uZU1vZGUgPSBmYWxzZTtcIiBjbGFzcz1cImxpbmsgdGV4dHV1ci1rbm9wXCIgKm5nSWY9XCJTaW5nbGVTdG9uZU1vZGVcIj5cclxuICAgICAgICAgICAge3sgVHJhbnNsYXRlU2VydmljZS5HZXRBY3RpdmVWYWx1ZShUcmFuc2xhdGlvbkNhdGVnb3J5LkNvbW1vbiwgVHJhbnNsYXRpb25TdWJDYXRlZ29yeS5NaXgpIH19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJUZXh0dXVyR2VuZXJlcmVuKClcIiBjbGFzcz1cImxpbmsgdGV4dHV1ci1rbm9wXCIgW2Rpc2FibGVkXT1cIkdlbmVyYXRlRGlzYWJsZWQoKVwiPlxyXG4gICAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LlRleHR1dXJHZW5lcmVyZW4pIH19XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIklzTG9hZGluZ1RleHR1cmVzKClcIiBjbGFzcz1cInRleHR1cmUtbG9hZGVyXCI+XHJcbiAgICAgICAgICA8bWF0LXNwaW5uZXIgY2xhc3M9XCJsb2FkZXItc3Bpbm5lclwiIFtkaWFtZXRlcl09XCI4MFwiPjwvbWF0LXNwaW5uZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJTaG93VGV4dHVyZSgpXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW1hZ2Utcm93XCI+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIkhhc1RvRmlsbEZvcm0oKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwiT3BlbkZvcm0oKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1hZ2UgaW1hZ2UtcGF0cm9vblwiIFtzcmNdPVwiR2V0UGF0cm9vbkRvd25sb2FkVVJMKClcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNsYXNzPVwibGluayB0ZXh0dXVyLWtub3BcIiAoY2xpY2spPVwiT3BlbkZvcm0oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuRG93bmxvYWRUZXh0dXJlKSB9fVxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjbGFzcz1cImxpbmsgdGV4dHV1ci1rbm9wXCIgKGNsaWNrKT1cIk9wZW5Gb3JtKClcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LkRvd25sb2FkQnVtcCkgfX1cclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIUhhc1RvRmlsbEZvcm0oKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgPGEgW2hyZWZdPVwiR2V0UGF0cm9vbkRvd25sb2FkVVJMKClcIiB0YXJnZXQ9XCJfYmxhbmtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW1nIGNsYXNzPVwiaW1hZ2UgaW1hZ2UtcGF0cm9vblwiIFtzcmNdPVwiR2V0UGF0cm9vbkRvd25sb2FkVVJMKClcIiAvPlxyXG4gICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxhIFtocmVmXT1cIkdldFBhdHJvb25Eb3dubG9hZFVSTERvd25sb2FkKClcIiB0YXJnZXQ9XCJfYmxhbmtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNsYXNzPVwibGluayB0ZXh0dXVyLWtub3BcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7IFRyYW5zbGF0ZVNlcnZpY2UuR2V0QWN0aXZlVmFsdWUoVHJhbnNsYXRpb25DYXRlZ29yeS5Db21tb24sIFRyYW5zbGF0aW9uU3ViQ2F0ZWdvcnkuRG93bmxvYWRUZXh0dXJlKSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgIDxhIFtocmVmXT1cIkdldEJ1bXBEb3dubG9hZFVSTCgpXCIgdGFyZ2V0PVwiX2JsYW5rXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjbGFzcz1cImxpbmsgdGV4dHV1ci1rbm9wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7eyBUcmFuc2xhdGVTZXJ2aWNlLkdldEFjdGl2ZVZhbHVlKFRyYW5zbGF0aW9uQ2F0ZWdvcnkuQ29tbW9uLCBUcmFuc2xhdGlvblN1YkNhdGVnb3J5LkRvd25sb2FkQnVtcCkgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBzdHlsZT1cImZsZXg6YXV0bztcIj48L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==