@smarterplan/ngx-smarterplan-admin 0.1.39 → 0.1.40

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.
@@ -67,8 +67,8 @@ export class TemplateComponent {
67
67
  }
68
68
  }
69
69
  initForm() {
70
- let startDate = '';
71
- let endDate = '';
70
+ let startDate = null;
71
+ let endDate = null;
72
72
  if (this.editTemplate) {
73
73
  if (this.editTemplate.startDateTime) {
74
74
  const date = DateTime.fromISO(this.editTemplate.startDateTime);
@@ -91,8 +91,8 @@ export class TemplateComponent {
91
91
  Validators.required,
92
92
  ],
93
93
  locale: [this.editTemplate.locale],
94
- startDate: [startDate, [floatValidator()]],
95
- endDate: [endDate, [floatValidator()]],
94
+ startDate: [startDate, [floatValidator(), Validators.required]],
95
+ endDate: [endDate, [floatValidator(), Validators.required]],
96
96
  });
97
97
  }
98
98
  else {
@@ -107,8 +107,8 @@ export class TemplateComponent {
107
107
  Validators.required,
108
108
  ],
109
109
  locale: [this.currentLocale],
110
- startDate: [startDate, [floatValidator()]],
111
- endDate: [endDate, [floatValidator()]],
110
+ startDate: [startDate, [floatValidator(), Validators.required]],
111
+ endDate: [endDate, [floatValidator(), Validators.required]],
112
112
  });
113
113
  }
114
114
  }
@@ -212,10 +212,10 @@ export class TemplateComponent {
212
212
  }
213
213
  }
214
214
  TemplateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: TemplateComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.FormBuilder }, { token: i3.BaseUserService }, { token: i3.SpaceService }, { token: i3.ZoneService }, { token: i4.Location }, { token: i3.HashtagService }, { token: i5.TranslateService }, { token: i3.TemplateService }, { token: i3.ValidatorsService }], target: i0.ɵɵFactoryTarget.Component });
215
- TemplateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: TemplateComponent, selector: "lib-template", inputs: { currentOrg: "currentOrg", editTemplate: "editTemplate", zoneID: "zoneID" }, outputs: { updatedTemplate: "updatedTemplate", createdTemplate: "createdTemplate" }, ngImport: i0, template: "<div class=\"form-container\" *ngIf=\"form\">\r\n <div>\r\n <h4>{{ 'Visit Template' | translate }}</h4>\r\n </div>\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Visit Title' | translate}} *</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\"\r\n placeholder=\"Edvard Munch - \u00AB Un po\u00E8me d\u2019amour, de vie et de mort \u00BB\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['title'])\"\r\n formControlName=\"title\" data-testid=\"form-template-title\">\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-title-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['title'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['title'])\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Description' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <textarea class=\"form-control\" formControlName=\"description\" style=\"height:200px\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['description'])\"\r\n data-testid=\"form-template-description\"\r\n placeholder=\"Cette visite d\u20191h30 vous pr\u00E9sentera les \u0153uvres embl\u00E9matiques du c\u00E9l\u00E8bre peintre norv\u00E9gien Edvard Munch (1863-1944)...\"></textarea>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-description-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['description'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['description'])\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Language' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" formControlName=\"locale\">\r\n <option [ngValue]=\"null\">{{'Not applicable' | translate}}</option>\r\n <option *ngFor=\"let locale of locales\" [ngValue]=\"locale\">\r\n {{ locale }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Level' | translate}}*</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" formControlName=\"level\">\r\n <option *ngFor=\"let level of availableLevels\" [ngValue]=\"level\">\r\n {{ level }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized location' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"availableSpaces && !inputZone\">\r\n <select class=\"form-control\" formControlName=\"space\" (change)=\"onSpaceClick()\"\r\n data-testid=\"form-template-space\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['space'])\">\r\n <option *ngFor=\"let space of availableSpaces\" [ngValue]=\"space.id\">\r\n {{ space.name }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-space-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['space'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['space'])\"></span>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!availableSpaces\">\r\n {{ 'No locations available' | translate}}\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"inputZone\">\r\n <input type=\"text\" class=\"form-control\" [value]=\"inputZone.space.name\" disabled>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized zone' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace && zonesForSpace.length > 0 && !inputZone\">\r\n <select class=\"form-control\" required formControlName=\"zone\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['zone'])\"\r\n data-testid=\"form-template-zone\">\r\n <option *ngFor=\"let zone of zonesForSpace\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-zone-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['zone'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['zone'])\"></span>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace && zonesForSpace.length === 0 && !inputZone\">\r\n <p class=\"warning col-form-label\">{{\"No Museum Zones found for this location\"| translate}}</p>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"inputZone\">\r\n <input type=\"text\" class=\"form-control\" [value]=\"inputZone.name\" disabled>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Hashtags' | translate}}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"spaceID.value\">\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length > 0\">{{'Available hashtags' | translate}}\r\n </p>\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length === 0\">\r\n {{'No hashtags created for this location' | translate}} </p>\r\n <div *ngIf=\"availableHashtags.length > 0\">\r\n <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li [class]=\"addedHashtags.includes(hashtag) ? 'keywordsItem added' : 'keywordsItem'\"\r\n *ngFor=\"let hashtag of availableHashtags\" (click)=\"onHashtagClick(hashtag)\"\r\n style=\"cursor: pointer;\"\r\n ngbTooltip=\"{{addedHashtags.includes(hashtag) ? ('Remove'|translate) : ('Add'|translate) }}\">\r\n {{hashtag.name}}</li>\r\n </div>\r\n </ul>\r\n <p class=\"keywordsRules\">{{'Added hashtags' | translate}} </p>\r\n <ul class=\"keywordsDisplay\">\r\n <div class=\"keywordsdisplayContainer\" *ngIf=\"addedHashtags.length> 0\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of addedHashtags\">{{ hashtag.name }}</li>\r\n </div>\r\n </ul>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!spaceID.value\">\r\n <p class=\"keywordsRules\">{{'You need to choose the location first' | translate}} </p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Start Date' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" formControlName=\"startDate\" ngbDatepicker\r\n data-testid=\"form-template-startDate\" #d1=\"ngbDatepicker\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['startDate'])\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d1.toggle()\" type=\"button\"></button>\r\n </div>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-startDate-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['startDate'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['startDate'])\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Start Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeStart\" [ngModelOptions]=\"{standalone: true}\">\r\n </ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'End Date' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" formControlName=\"endDate\" ngbDatepicker\r\n #d2=\"ngbDatepicker\" data-testid=\"form-template-endDate\" [class.is-invalid]=\"validatorsService.isControlError(form.controls['endDate'])\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d2.toggle()\" type=\"button\"></button>\r\n </div>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-endDate-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['endDate'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['endDate'])\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'End Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeEnd\" [ngModelOptions]=\"{standalone: true}\"></ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"btn-control-div action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"this.working || form.invalid\" data-testid=\"form-template-submit-btn\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" [disabled]=\"this.working\" data-testid=\"form-template-cancel-btn\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n\r\n </form>\r\n</div>", styles: [".form-container{margin:2rem 0rem}.form-container .btn-control-div .btn{width:8rem}.warning{margin:0;color:red}.keywordsDisplay{min-height:40px}.keywordsRules{margin-bottom:2px}.form-group{margin:1.5rem 0}label.col-sm-4.col-form-label{width:200px;min-width:200px}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px!important}\n"], components: [{ type: i6.NgbTimepicker, selector: "ngb-timepicker", inputs: ["meridian", "spinners", "seconds", "hourStep", "minuteStep", "secondStep", "readonlyInputs", "size"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i5.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i6.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i6.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "translate": i5.TranslatePipe } });
215
+ TemplateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: TemplateComponent, selector: "lib-template", inputs: { currentOrg: "currentOrg", editTemplate: "editTemplate", zoneID: "zoneID" }, outputs: { updatedTemplate: "updatedTemplate", createdTemplate: "createdTemplate" }, ngImport: i0, template: "<div class=\"form-container\" *ngIf=\"form\">\r\n <div>\r\n <h4>{{ 'Visit Template' | translate }}</h4>\r\n </div>\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Visit Title' | translate}} *</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\"\r\n placeholder=\"Edvard Munch - \u00AB Un po\u00E8me d\u2019amour, de vie et de mort \u00BB\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['title'])\"\r\n formControlName=\"title\" data-testid=\"form-template-title\">\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-title-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['title'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['title'])\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Description' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <textarea class=\"form-control\" formControlName=\"description\" style=\"height:200px\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['description'])\"\r\n data-testid=\"form-template-description\"\r\n placeholder=\"Cette visite d\u20191h30 vous pr\u00E9sentera les \u0153uvres embl\u00E9matiques du c\u00E9l\u00E8bre peintre norv\u00E9gien Edvard Munch (1863-1944)...\"></textarea>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-description-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['description'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['description'])\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Language' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" formControlName=\"locale\">\r\n <option [ngValue]=\"null\">{{'Not applicable' | translate}}</option>\r\n <option *ngFor=\"let locale of locales\" [ngValue]=\"locale\">\r\n {{ locale }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Level' | translate}}*</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" formControlName=\"level\">\r\n <option *ngFor=\"let level of availableLevels\" [ngValue]=\"level\">\r\n {{ level }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized location' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"availableSpaces && !inputZone\">\r\n <select class=\"form-control\" formControlName=\"space\" (change)=\"onSpaceClick()\"\r\n data-testid=\"form-template-space\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['space'])\">\r\n <option *ngFor=\"let space of availableSpaces\" [ngValue]=\"space.id\">\r\n {{ space.name }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-space-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['space'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['space'])\"></span>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!availableSpaces\">\r\n {{ 'No locations available' | translate}}\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"inputZone\">\r\n <input type=\"text\" class=\"form-control\" [value]=\"inputZone.space.name\" disabled>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized zone' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace && zonesForSpace.length > 0 && !inputZone\">\r\n <select class=\"form-control\" required formControlName=\"zone\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['zone'])\"\r\n data-testid=\"form-template-zone\">\r\n <option *ngFor=\"let zone of zonesForSpace\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-zone-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['zone'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['zone'])\"></span>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace && zonesForSpace.length === 0 && !inputZone\">\r\n <p class=\"warning col-form-label\">{{\"No Museum Zones found for this location\"| translate}}</p>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"inputZone\">\r\n <input type=\"text\" class=\"form-control\" [value]=\"inputZone.name\" disabled>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Hashtags' | translate}}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"spaceID.value\">\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length > 0\">{{'Available hashtags' | translate}}\r\n </p>\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length === 0\">\r\n {{'No hashtags created for this location' | translate}} </p>\r\n <div *ngIf=\"availableHashtags.length > 0\">\r\n <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li [class]=\"addedHashtags.includes(hashtag) ? 'keywordsItem added' : 'keywordsItem'\"\r\n *ngFor=\"let hashtag of availableHashtags\" (click)=\"onHashtagClick(hashtag)\"\r\n style=\"cursor: pointer;\"\r\n ngbTooltip=\"{{addedHashtags.includes(hashtag) ? ('Remove'|translate) : ('Add'|translate) }}\">\r\n {{hashtag.name}}</li>\r\n </div>\r\n </ul>\r\n <p class=\"keywordsRules\">{{'Added hashtags' | translate}} </p>\r\n <ul class=\"keywordsDisplay\">\r\n <div class=\"keywordsdisplayContainer\" *ngIf=\"addedHashtags.length> 0\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of addedHashtags\">{{ hashtag.name }}</li>\r\n </div>\r\n </ul>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!spaceID.value\">\r\n <p class=\"keywordsRules\">{{'You need to choose the location first' | translate}} </p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Start Date' | translate}} *</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" formControlName=\"startDate\" ngbDatepicker\r\n data-testid=\"form-template-startDate\" #d1=\"ngbDatepicker\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['startDate'])\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d1.toggle()\" type=\"button\"></button>\r\n </div>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-startDate-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['startDate'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['startDate'])\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Start Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeStart\" [ngModelOptions]=\"{standalone: true}\">\r\n </ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'End Date' | translate}} *</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" formControlName=\"endDate\" ngbDatepicker\r\n #d2=\"ngbDatepicker\" data-testid=\"form-template-endDate\" [class.is-invalid]=\"validatorsService.isControlError(form.controls['endDate'])\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d2.toggle()\" type=\"button\"></button>\r\n </div>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-endDate-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['endDate'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['endDate'])\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'End Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeEnd\" [ngModelOptions]=\"{standalone: true}\"></ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"btn-control-div action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"this.working || form.invalid\" data-testid=\"form-template-submit-btn\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" [disabled]=\"this.working\" data-testid=\"form-template-cancel-btn\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n\r\n </form>\r\n</div>", styles: [".form-container{margin:2rem 0rem}.form-container .btn-control-div .btn{width:8rem}.warning{margin:0;color:red}.keywordsDisplay{min-height:40px}.keywordsRules{margin-bottom:2px}.form-group{margin:1.5rem 0}label.col-sm-4.col-form-label{width:200px;min-width:200px}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px!important}\n"], components: [{ type: i6.NgbTimepicker, selector: "ngb-timepicker", inputs: ["meridian", "spinners", "seconds", "hourStep", "minuteStep", "secondStep", "readonlyInputs", "size"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i5.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i6.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i6.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "translate": i5.TranslatePipe } });
216
216
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: TemplateComponent, decorators: [{
217
217
  type: Component,
218
- args: [{ selector: 'lib-template', template: "<div class=\"form-container\" *ngIf=\"form\">\r\n <div>\r\n <h4>{{ 'Visit Template' | translate }}</h4>\r\n </div>\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Visit Title' | translate}} *</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\"\r\n placeholder=\"Edvard Munch - \u00AB Un po\u00E8me d\u2019amour, de vie et de mort \u00BB\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['title'])\"\r\n formControlName=\"title\" data-testid=\"form-template-title\">\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-title-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['title'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['title'])\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Description' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <textarea class=\"form-control\" formControlName=\"description\" style=\"height:200px\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['description'])\"\r\n data-testid=\"form-template-description\"\r\n placeholder=\"Cette visite d\u20191h30 vous pr\u00E9sentera les \u0153uvres embl\u00E9matiques du c\u00E9l\u00E8bre peintre norv\u00E9gien Edvard Munch (1863-1944)...\"></textarea>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-description-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['description'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['description'])\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Language' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" formControlName=\"locale\">\r\n <option [ngValue]=\"null\">{{'Not applicable' | translate}}</option>\r\n <option *ngFor=\"let locale of locales\" [ngValue]=\"locale\">\r\n {{ locale }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Level' | translate}}*</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" formControlName=\"level\">\r\n <option *ngFor=\"let level of availableLevels\" [ngValue]=\"level\">\r\n {{ level }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized location' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"availableSpaces && !inputZone\">\r\n <select class=\"form-control\" formControlName=\"space\" (change)=\"onSpaceClick()\"\r\n data-testid=\"form-template-space\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['space'])\">\r\n <option *ngFor=\"let space of availableSpaces\" [ngValue]=\"space.id\">\r\n {{ space.name }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-space-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['space'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['space'])\"></span>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!availableSpaces\">\r\n {{ 'No locations available' | translate}}\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"inputZone\">\r\n <input type=\"text\" class=\"form-control\" [value]=\"inputZone.space.name\" disabled>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized zone' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace && zonesForSpace.length > 0 && !inputZone\">\r\n <select class=\"form-control\" required formControlName=\"zone\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['zone'])\"\r\n data-testid=\"form-template-zone\">\r\n <option *ngFor=\"let zone of zonesForSpace\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-zone-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['zone'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['zone'])\"></span>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace && zonesForSpace.length === 0 && !inputZone\">\r\n <p class=\"warning col-form-label\">{{\"No Museum Zones found for this location\"| translate}}</p>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"inputZone\">\r\n <input type=\"text\" class=\"form-control\" [value]=\"inputZone.name\" disabled>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Hashtags' | translate}}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"spaceID.value\">\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length > 0\">{{'Available hashtags' | translate}}\r\n </p>\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length === 0\">\r\n {{'No hashtags created for this location' | translate}} </p>\r\n <div *ngIf=\"availableHashtags.length > 0\">\r\n <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li [class]=\"addedHashtags.includes(hashtag) ? 'keywordsItem added' : 'keywordsItem'\"\r\n *ngFor=\"let hashtag of availableHashtags\" (click)=\"onHashtagClick(hashtag)\"\r\n style=\"cursor: pointer;\"\r\n ngbTooltip=\"{{addedHashtags.includes(hashtag) ? ('Remove'|translate) : ('Add'|translate) }}\">\r\n {{hashtag.name}}</li>\r\n </div>\r\n </ul>\r\n <p class=\"keywordsRules\">{{'Added hashtags' | translate}} </p>\r\n <ul class=\"keywordsDisplay\">\r\n <div class=\"keywordsdisplayContainer\" *ngIf=\"addedHashtags.length> 0\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of addedHashtags\">{{ hashtag.name }}</li>\r\n </div>\r\n </ul>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!spaceID.value\">\r\n <p class=\"keywordsRules\">{{'You need to choose the location first' | translate}} </p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Start Date' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" formControlName=\"startDate\" ngbDatepicker\r\n data-testid=\"form-template-startDate\" #d1=\"ngbDatepicker\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['startDate'])\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d1.toggle()\" type=\"button\"></button>\r\n </div>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-startDate-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['startDate'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['startDate'])\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Start Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeStart\" [ngModelOptions]=\"{standalone: true}\">\r\n </ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'End Date' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" formControlName=\"endDate\" ngbDatepicker\r\n #d2=\"ngbDatepicker\" data-testid=\"form-template-endDate\" [class.is-invalid]=\"validatorsService.isControlError(form.controls['endDate'])\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d2.toggle()\" type=\"button\"></button>\r\n </div>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-endDate-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['endDate'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['endDate'])\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'End Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeEnd\" [ngModelOptions]=\"{standalone: true}\"></ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"btn-control-div action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"this.working || form.invalid\" data-testid=\"form-template-submit-btn\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" [disabled]=\"this.working\" data-testid=\"form-template-cancel-btn\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n\r\n </form>\r\n</div>", styles: [".form-container{margin:2rem 0rem}.form-container .btn-control-div .btn{width:8rem}.warning{margin:0;color:red}.keywordsDisplay{min-height:40px}.keywordsRules{margin-bottom:2px}.form-group{margin:1.5rem 0}label.col-sm-4.col-form-label{width:200px;min-width:200px}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px!important}\n"] }]
218
+ args: [{ selector: 'lib-template', template: "<div class=\"form-container\" *ngIf=\"form\">\r\n <div>\r\n <h4>{{ 'Visit Template' | translate }}</h4>\r\n </div>\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Visit Title' | translate}} *</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\"\r\n placeholder=\"Edvard Munch - \u00AB Un po\u00E8me d\u2019amour, de vie et de mort \u00BB\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['title'])\"\r\n formControlName=\"title\" data-testid=\"form-template-title\">\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-title-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['title'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['title'])\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Description' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <textarea class=\"form-control\" formControlName=\"description\" style=\"height:200px\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['description'])\"\r\n data-testid=\"form-template-description\"\r\n placeholder=\"Cette visite d\u20191h30 vous pr\u00E9sentera les \u0153uvres embl\u00E9matiques du c\u00E9l\u00E8bre peintre norv\u00E9gien Edvard Munch (1863-1944)...\"></textarea>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-description-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['description'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['description'])\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Language' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" formControlName=\"locale\">\r\n <option [ngValue]=\"null\">{{'Not applicable' | translate}}</option>\r\n <option *ngFor=\"let locale of locales\" [ngValue]=\"locale\">\r\n {{ locale }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Level' | translate}}*</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" formControlName=\"level\">\r\n <option *ngFor=\"let level of availableLevels\" [ngValue]=\"level\">\r\n {{ level }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized location' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"availableSpaces && !inputZone\">\r\n <select class=\"form-control\" formControlName=\"space\" (change)=\"onSpaceClick()\"\r\n data-testid=\"form-template-space\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['space'])\">\r\n <option *ngFor=\"let space of availableSpaces\" [ngValue]=\"space.id\">\r\n {{ space.name }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-space-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['space'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['space'])\"></span>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!availableSpaces\">\r\n {{ 'No locations available' | translate}}\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"inputZone\">\r\n <input type=\"text\" class=\"form-control\" [value]=\"inputZone.space.name\" disabled>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized zone' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace && zonesForSpace.length > 0 && !inputZone\">\r\n <select class=\"form-control\" required formControlName=\"zone\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['zone'])\"\r\n data-testid=\"form-template-zone\">\r\n <option *ngFor=\"let zone of zonesForSpace\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-zone-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['zone'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['zone'])\"></span>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace && zonesForSpace.length === 0 && !inputZone\">\r\n <p class=\"warning col-form-label\">{{\"No Museum Zones found for this location\"| translate}}</p>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"inputZone\">\r\n <input type=\"text\" class=\"form-control\" [value]=\"inputZone.name\" disabled>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Hashtags' | translate}}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"spaceID.value\">\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length > 0\">{{'Available hashtags' | translate}}\r\n </p>\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length === 0\">\r\n {{'No hashtags created for this location' | translate}} </p>\r\n <div *ngIf=\"availableHashtags.length > 0\">\r\n <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li [class]=\"addedHashtags.includes(hashtag) ? 'keywordsItem added' : 'keywordsItem'\"\r\n *ngFor=\"let hashtag of availableHashtags\" (click)=\"onHashtagClick(hashtag)\"\r\n style=\"cursor: pointer;\"\r\n ngbTooltip=\"{{addedHashtags.includes(hashtag) ? ('Remove'|translate) : ('Add'|translate) }}\">\r\n {{hashtag.name}}</li>\r\n </div>\r\n </ul>\r\n <p class=\"keywordsRules\">{{'Added hashtags' | translate}} </p>\r\n <ul class=\"keywordsDisplay\">\r\n <div class=\"keywordsdisplayContainer\" *ngIf=\"addedHashtags.length> 0\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of addedHashtags\">{{ hashtag.name }}</li>\r\n </div>\r\n </ul>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!spaceID.value\">\r\n <p class=\"keywordsRules\">{{'You need to choose the location first' | translate}} </p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Start Date' | translate}} *</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" formControlName=\"startDate\" ngbDatepicker\r\n data-testid=\"form-template-startDate\" #d1=\"ngbDatepicker\"\r\n [class.is-invalid]=\"validatorsService.isControlError(form.controls['startDate'])\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d1.toggle()\" type=\"button\"></button>\r\n </div>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-startDate-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['startDate'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['startDate'])\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Start Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeStart\" [ngModelOptions]=\"{standalone: true}\">\r\n </ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'End Date' | translate}} *</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" formControlName=\"endDate\" ngbDatepicker\r\n #d2=\"ngbDatepicker\" data-testid=\"form-template-endDate\" [class.is-invalid]=\"validatorsService.isControlError(form.controls['endDate'])\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d2.toggle()\" type=\"button\"></button>\r\n </div>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-template-endDate-invalid\"\r\n [translate]=\"validatorsService.getError(form.controls['endDate'])\"\r\n *ngIf=\" validatorsService.isControlError(form.controls['endDate'])\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'End Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeEnd\" [ngModelOptions]=\"{standalone: true}\"></ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"btn-control-div action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n [disabled]=\"this.working || form.invalid\" data-testid=\"form-template-submit-btn\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" [disabled]=\"this.working\" data-testid=\"form-template-cancel-btn\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n\r\n </form>\r\n</div>", styles: [".form-container{margin:2rem 0rem}.form-container .btn-control-div .btn{width:8rem}.warning{margin:0;color:red}.keywordsDisplay{min-height:40px}.keywordsRules{margin-bottom:2px}.form-group{margin:1.5rem 0}label.col-sm-4.col-form-label{width:200px;min-width:200px}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px!important}\n"] }]
219
219
  }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.FormBuilder }, { type: i3.BaseUserService }, { type: i3.SpaceService }, { type: i3.ZoneService }, { type: i4.Location }, { type: i3.HashtagService }, { type: i5.TranslateService }, { type: i3.TemplateService }, { type: i3.ValidatorsService }]; }, propDecorators: { currentOrg: [{
220
220
  type: Input
221
221
  }], editTemplate: [{
@@ -227,4 +227,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImpor
227
227
  }], createdTemplate: [{
228
228
  type: Output
229
229
  }] } });
230
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWFkbWluL3NyYy9saWIvdmlzaXRvci90ZW1wbGF0ZS90ZW1wbGF0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi92aXNpdG9yL3RlbXBsYXRlL3RlbXBsYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUEwQixVQUFVLEVBQW1CLE1BQU0sZ0JBQWdCLENBQUM7QUFHckYsT0FBTyxFQUFxQixhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdkgsT0FBTyxFQUFnQixXQUFXLEVBQXdCLE1BQU0sRUFBOEMsa0JBQWtCLEVBQUUsV0FBVyxFQUFjLHdCQUF3QixFQUEyRCxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hSLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFFakMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7O0FBTzdDLE1BQU0sT0FBTyxpQkFBaUI7SUFvQzFCLFlBQ1ksS0FBcUIsRUFDckIsRUFBZSxFQUNmLFdBQTRCLEVBQzVCLFlBQTBCLEVBQzFCLFdBQXdCLEVBQ3hCLFFBQWtCLEVBQ2xCLGNBQThCLEVBQzlCLFNBQTJCLEVBQzNCLGVBQWdDLEVBQ2pDLGlCQUFvQztRQVRuQyxVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUNyQixPQUFFLEdBQUYsRUFB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bml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMsIEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IFZhbGlkYXRvcnNTZXJ2aWNlLCB0ZXh0VmFsaWRhdG9yLCBub0VtcHR5VmFsaWRhdG9yLCBmbG9hdFZhbGlkYXRvciB9IGZyb20gXCJAc21hcnRlcnBsYW4vbmd4LXNtYXJ0ZXJwbGFuLWNvcmVcIjtcclxuaW1wb3J0IHsgT3JnYW5pc2F0aW9uLCBMZXZlbFN0YXR1cywgWm9uZSwgU3BhY2UsIEhhc2h0YWcsIExvY2FsZSwgQmFzZVVzZXJTZXJ2aWNlLCBTcGFjZVNlcnZpY2UsIFpvbmVTZXJ2aWNlLCBzdHJpbmdMb2NhbGVUb0VudW0sIGVudW1Ub0FycmF5LCBSb2xlU3RhdHVzLCBzb3J0QWxwaGFiZXRpY2FsbHlPbk5hbWUsIEhhc2h0YWdTZXJ2aWNlLCBNaXNzaW9uLCBWaXNpdFRlbXBsYXRlLCBUZW1wbGF0ZVNlcnZpY2UgfSBmcm9tICdAc21hcnRlcnBsYW4vbmd4LXNtYXJ0ZXJwbGFuLWNvcmUnO1xyXG5pbXBvcnQgeyBEYXRlVGltZSB9IGZyb20gXCJsdXhvblwiO1xyXG5pbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdsaWItdGVtcGxhdGUnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RlbXBsYXRlLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL3RlbXBsYXRlLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICAgIEBJbnB1dCgpIGN1cnJlbnRPcmc6IE9yZ2FuaXNhdGlvbjtcclxuXHJcbiAgICBASW5wdXQoKSBlZGl0VGVtcGxhdGU6IFZpc2l0VGVtcGxhdGU7XHJcblxyXG4gICAgQElucHV0KCkgem9uZUlEOiBzdHJpbmc7XHJcblxyXG4gICAgQE91dHB1dCgpIHVwZGF0ZWRUZW1wbGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8VmlzaXRUZW1wbGF0ZT4oKTtcclxuXHJcbiAgICBAT3V0cHV0KCkgY3JlYXRlZFRlbXBsYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxWaXNpdFRlbXBsYXRlPigpO1xyXG5cclxuICAgIGZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgICB3b3JraW5nID0gZmFsc2U7XHJcblxyXG4gICAgem9uZXNGb3JTcGFjZTogWm9uZVtdO1xyXG5cclxuICAgIGF2YWlsYWJsZUxldmVsczogTGV2ZWxTdGF0dXNbXTtcclxuXHJcbiAgICBhdmFpbGFibGVTcGFjZXM6IFNwYWNlW107XHJcblxyXG4gICAgbWlzc2lvblRpbWVTdGFydDogbnVtYmVyID0gMTIgKiA2MCAqIDYwMDAwOyAvLyBtaWRkYXkgaW4gbWlsbGlzZWNvbmRzXHJcblxyXG4gICAgbWlzc2lvblRpbWVFbmQ6IG51bWJlciA9IDEyICogNjAgKiA2MDAwMDtcclxuXHJcbiAgICBpbnB1dFpvbmU6IFpvbmU7XHJcblxyXG4gICAgYXZhaWxhYmxlSGFzaHRhZ3M6IEhhc2h0YWdbXSA9IFtdO1xyXG5cclxuICAgIGFkZGVkSGFzaHRhZ3M6IEhhc2h0YWdbXSA9IFtdO1xyXG5cclxuICAgIGN1cnJlbnRMb2NhbGU6IExvY2FsZTtcclxuXHJcbiAgICBsb2NhbGVzOiBzdHJpbmdbXTtcclxuXHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICAgICAgcHJpdmF0ZSB1c2VyU2VydmljZTogQmFzZVVzZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgc3BhY2VTZXJ2aWNlOiBTcGFjZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB6b25lU2VydmljZTogWm9uZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBsb2NhdGlvbjogTG9jYXRpb24sXHJcbiAgICAgICAgcHJpdmF0ZSBoYXNodGFnU2VydmljZTogSGFzaHRhZ1NlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB0ZW1wbGF0ZVNlcnZpY2U6IFRlbXBsYXRlU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgdmFsaWRhdG9yc1NlcnZpY2U6IFZhbGlkYXRvcnNTZXJ2aWNlXHJcblxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy51c2VyU2VydmljZS5pc0NoYW5nZWQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVVc2VySW5mbygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuc2V0dXAoKTtcclxuICAgICAgICBjb25zdCBsYW5nID0gdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmdcclxuICAgICAgICAgICAgPyB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZ1xyXG4gICAgICAgICAgICA6IHRoaXMudHJhbnNsYXRlLmRlZmF1bHRMYW5nO1xyXG5cclxuICAgICAgICAvKiogVHJhbnNmb3JtZSAnX2ZyJyB0byAnZnInICovXHJcbiAgICAgICAgdGhpcy5jdXJyZW50TG9jYWxlID0gc3RyaW5nTG9jYWxlVG9FbnVtKGxhbmcuc2xpY2UoMSkpOyAvLyB0byBtYXRjaCBlbnVtIExvY2FsZVxyXG4gICAgICAgIHRoaXMubG9jYWxlcyA9IGVudW1Ub0FycmF5KExvY2FsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2V0dXAoKSB7XHJcbiAgICAgICAgLy8gcmVzcGVjdCB0aGUgb3JkZXIgb2YgZnVuY3Rpb25zIGhlcmUgISFcclxuICAgICAgICBpZiAodGhpcy56b25lSUQpIHtcclxuICAgICAgICAgICAgdGhpcy5pbnB1dFpvbmUgPSBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLmdldFpvbmUodGhpcy56b25lSUQpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldEhhc2h0YWdzKHRoaXMuaW5wdXRab25lLnNwYWNlSUQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmluaXRGb3JtKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuZWRpdFRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgIC8vIHdlIGFyZSBlZGl0aW5nIGEgdGVtcGxhdGVcclxuICAgICAgICAgICAgdGhpcy5vblNwYWNlQ2xpY2sodGhpcy5lZGl0VGVtcGxhdGUuc3BhY2VJRCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlVXNlckluZm8oKTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdXBkYXRlVXNlckluZm8oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudXNlclNlcnZpY2UuY3UpIHtcclxuICAgICAgICAgICAgdGhpcy5hdmFpbGFibGVMZXZlbHMgPVxyXG4gICAgICAgICAgICAgICAgdGhpcy51c2VyU2VydmljZS5nZXRBdmFsYWJsZUxldmVsc0ZvckN1cnJlbnRVc2VyKCk7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE9yZyA9IHRoaXMudXNlclNlcnZpY2UuY3VycmVudE9yZ2FuaXNhdGlvbigpO1xyXG4gICAgICAgICAgICB0aGlzLmF2YWlsYWJsZVNwYWNlcyA9IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmdldFNwYWNlc0Zvck9yZyhcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE9yZy5pZCxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdEZvcm0oKSB7XHJcbiAgICAgICAgbGV0IHN0YXJ0RGF0ZTogYW55ID0gJyc7XHJcbiAgICAgICAgbGV0IGVuZERhdGU6IGFueSA9ICcnO1xyXG4gICAgICAgIGlmICh0aGlzLmVkaXRUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5lZGl0VGVtcGxhdGUuc3RhcnREYXRlVGltZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IERhdGVUaW1lLmZyb21JU08odGhpcy5lZGl0VGVtcGxhdGUuc3RhcnREYXRlVGltZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1pc3Npb25UaW1lU3RhcnQgPSAoZGF0ZS5ob3VyICogNjAgKyBkYXRlLm1pbnV0ZSkgKiA2MCAqIDEwMDA7XHJcbiAgICAgICAgICAgICAgICBzdGFydERhdGUgPSBkYXRlLnRvTWlsbGlzKCkgLSB0aGlzLm1pc3Npb25UaW1lU3RhcnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuZWRpdFRlbXBsYXRlLmVuZERhdGVUaW1lKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlID0gRGF0ZVRpbWUuZnJvbUlTTyh0aGlzLmVkaXRUZW1wbGF0ZS5lbmREYXRlVGltZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1pc3Npb25UaW1lRW5kID0gKGRhdGUuaG91ciAqIDYwICsgZGF0ZS5taW51dGUpICogNjAgKiAxMDAwO1xyXG4gICAgICAgICAgICAgICAgZW5kRGF0ZSA9IGRhdGUudG9NaWxsaXMoKSAtIHRoaXMubWlzc2lvblRpbWVFbmQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6IFt0aGlzLmVkaXRUZW1wbGF0ZS50aXRsZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDI1NSksIHRleHRWYWxpZGF0b3IoKSwgbm9FbXB0eVZhbGlkYXRvcigpXV0sXHJcbiAgICAgICAgICAgICAgICBsZXZlbDogW3RoaXMuZWRpdFRlbXBsYXRlLmxldmVsXSxcclxuICAgICAgICAgICAgICAgIG9yZ2FuaXNhdGlvbklEOiBbdGhpcy5lZGl0VGVtcGxhdGUub3JnYW5pc2F0aW9uSURdLFxyXG4gICAgICAgICAgICAgICAgc3BhY2U6IFt0aGlzLmVkaXRUZW1wbGF0ZS5zcGFjZUlELCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBbdGhpcy5lZGl0VGVtcGxhdGUuZGVzY3JpcHRpb24sIFt0ZXh0VmFsaWRhdG9yKCksIG5vRW1wdHlWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgICAgICAgICAgem9uZTogW1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdFRlbXBsYXRlLnpvbmVJRCxcclxuICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgIGxvY2FsZTogW3RoaXMuZWRpdFRlbXBsYXRlLmxvY2FsZV0sXHJcbiAgICAgICAgICAgICAgICBzdGFydERhdGU6IFtzdGFydERhdGUsIFtmbG9hdFZhbGlkYXRvcigpXV0sXHJcbiAgICAgICAgICAgICAgICBlbmREYXRlOiBbZW5kRGF0ZSwgW2Zsb2F0VmFsaWRhdG9yKCldXSxcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6IFtudWxsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjU1KSwgdGV4dFZhbGlkYXRvcigpLCBub0VtcHR5VmFsaWRhdG9yKCldXSxcclxuICAgICAgICAgICAgICAgIGxldmVsOiBbTGV2ZWxTdGF0dXMuTUlOSU1VTV0sXHJcbiAgICAgICAgICAgICAgICBvcmdhbmlzYXRpb25JRDogdGhpcy5jdXJyZW50T3JnLmlkLFxyXG4gICAgICAgICAgICAgICAgc3BhY2U6IFt0aGlzLmlucHV0Wm9uZSA/IHRoaXMuaW5wdXRab25lLnNwYWNlSUQgOiBudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBbJycsIFt0ZXh0VmFsaWRhdG9yKCksIG5vRW1wdHlWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgICAgICAgICAgem9uZTogW1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRab25lID8gdGhpcy5pbnB1dFpvbmUuaWQgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgbG9jYWxlOiBbdGhpcy5jdXJyZW50TG9jYWxlXSxcclxuICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZTogW3N0YXJ0RGF0ZSwgW2Zsb2F0VmFsaWRhdG9yKCldXSxcclxuICAgICAgICAgICAgICAgIGVuZERhdGU6IFtlbmREYXRlLCBbZmxvYXRWYWxpZGF0b3IoKV1dLFxyXG5cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uU3VibWl0KCkge1xyXG4gICAgICAgIHRoaXMud29ya2luZyA9IHRydWU7XHJcbiAgICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5mb3JtLmdldFJhd1ZhbHVlKCk7XHJcbiAgICAgICAgbGV0IHN0YXJ0RGF0ZVN0cmluZzogc3RyaW5nO1xyXG4gICAgICAgIGxldCBlbmREYXRlU3RyaW5nOiBzdHJpbmc7XHJcblxyXG4gICAgICAgIGlmIChmb3JtVmFsdWUuc3RhcnREYXRlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGVIb3VyU3RhcnROdW1iZXIgPSBmb3JtVmFsdWUuc3RhcnREYXRlICsgdGhpcy5taXNzaW9uVGltZVN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydERhdGUgPSBEYXRlVGltZS5mcm9tTWlsbGlzKGRhdGVIb3VyU3RhcnROdW1iZXIpO1xyXG4gICAgICAgICAgICBzdGFydERhdGVTdHJpbmcgPSBzdGFydERhdGUudG9JU08oKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coc3RhcnREYXRlU3RyaW5nKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZm9ybVZhbHVlLmVuZERhdGUpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZUhvdXJFbmROdW1iZXIgPSBmb3JtVmFsdWUuZW5kRGF0ZSArIHRoaXMubWlzc2lvblRpbWVFbmQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZERhdGUgPSBEYXRlVGltZS5mcm9tTWlsbGlzKGRhdGVIb3VyRW5kTnVtYmVyKTtcclxuICAgICAgICAgICAgZW5kRGF0ZVN0cmluZyA9IGVuZERhdGUudG9JU08oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZWRpdFRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGVcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlOiBWaXNpdFRlbXBsYXRlID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLmVkaXRUZW1wbGF0ZS5pZCxcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogZm9ybVZhbHVlLnRpdGxlLFxyXG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiBmb3JtVmFsdWUubGV2ZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGZvcm1WYWx1ZS5kZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBvcmdhbmlzYXRpb25JRDogZm9ybVZhbHVlLm9yZ2FuaXNhdGlvbklELFxyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZVRpbWU6IHN0YXJ0RGF0ZVN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICBlbmREYXRlVGltZTogZW5kRGF0ZVN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICBoYXNodGFnczogdGhpcy5hZGRlZEhhc2h0YWdzLm1hcCgoaGFzaHRhZykgPT4gaGFzaHRhZy5pZCksXHJcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxlOiBmb3JtVmFsdWUubG9jYWxlLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGlmIChmb3JtVmFsdWUuc3BhY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5zcGFjZUlEID0gZm9ybVZhbHVlLnNwYWNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1WYWx1ZS56b25lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUuem9uZUlEID0gZm9ybVZhbHVlLnpvbmU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZWRUZW1wbGF0ZS5lbWl0KHRlbXBsYXRlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vY3JlYXRlXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50T3JnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVtcGxhdGU6IFZpc2l0VGVtcGxhdGUgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBmb3JtVmFsdWUudGl0bGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yZ2FuaXNhdGlvbklEOiB0aGlzLmN1cnJlbnRPcmcuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBmb3JtVmFsdWUubGV2ZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBmb3JtVmFsdWUuZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZVRpbWU6IHN0YXJ0RGF0ZVN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kRGF0ZVRpbWU6IGVuZERhdGVTdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc2h0YWdzOiB0aGlzLmFkZGVkSGFzaHRhZ3MubWFwKChoYXNodGFnKSA9PiBoYXNodGFnLmlkKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlOiBmb3JtVmFsdWUubG9jYWxlLFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1WYWx1ZS5zcGFjZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5zcGFjZUlEID0gZm9ybVZhbHVlLnNwYWNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybVZhbHVlLnpvbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUuem9uZUlEID0gZm9ybVZhbHVlLnpvbmU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlZFRlbXBsYXRlLmVtaXQodGVtcGxhdGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uQ2FuY2VsKCkge1xyXG4gICAgICAgIHRoaXMuZm9ybSA9IG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuZWRpdFRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlZFRlbXBsYXRlLmVtaXQobnVsbCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVkVGVtcGxhdGUuZW1pdChudWxsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHRpdGxlKCk6IEFic3RyYWN0Q29udHJvbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoXCJ0aXRsZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc3BhY2VJRCgpOiBBYnN0cmFjdENvbnRyb2wge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KFwic3BhY2VcIik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TcGFjZUNsaWNrKHNwYWNlSUQ6IHN0cmluZyA9IG51bGwpIHtcclxuICAgICAgICBsZXQgaW5wdXRTcGFjZUlEID0gc3BhY2VJRCA/IHNwYWNlSUQgOiB0aGlzLnNwYWNlSUQudmFsdWU7XHJcbiAgICAgICAgY29uc3Qgem9uZXMgPSBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLmdldFpvbmVzQnlTcGFjZShcclxuICAgICAgICAgICAgaW5wdXRTcGFjZUlELFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgbXVzZXVtWm9uZXMgPSB6b25lcy5maWx0ZXIoKHpvbmUpID0+IHpvbmUuaXNNdXNldW1WaXNpdFpvbmUpO1xyXG4gICAgICAgIHRoaXMuem9uZXNGb3JTcGFjZSA9IHNvcnRBbHBoYWJldGljYWxseU9uTmFtZShtdXNldW1ab25lcyk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRIYXNodGFncyhpbnB1dFNwYWNlSUQpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uSGFzaHRhZ0NsaWNrKGhhc2h0YWc6IEhhc2h0YWcpIHtcclxuICAgICAgICBpZiAoIXRoaXMuYWRkZWRIYXNodGFncy5pbmNsdWRlcyhoYXNodGFnKSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZGVkSGFzaHRhZ3MucHVzaChoYXNodGFnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFkZGVkSGFzaHRhZ3Muc3BsaWNlKHRoaXMuYWRkZWRIYXNodGFncy5pbmRleE9mKGhhc2h0YWcpLCAxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2V0SGFzaHRhZ3Moc3BhY2VJRDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5hdmFpbGFibGVIYXNodGFncyA9IGF3YWl0IHRoaXMuaGFzaHRhZ1NlcnZpY2UuZ2V0SGFzaHRhZ3NGb3JTcGFjZShcclxuICAgICAgICAgICAgc3BhY2VJRCxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW5lclwiICpuZ0lmPVwiZm9ybVwiPlxyXG4gICAgPGRpdj5cclxuICAgICAgICA8aDQ+e3sgJ1Zpc2l0IFRlbXBsYXRlJyB8IHRyYW5zbGF0ZSB9fTwvaDQ+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxmb3JtIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdCgpXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J1Zpc2l0IFRpdGxlJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVkdmFyZCBNdW5jaCAtIMKrIFVuIHBvw6htZSBk4oCZYW1vdXIsIGRlIHZpZSBldCBkZSBtb3J0IMK7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwidmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1sndGl0bGUnXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIGRhdGEtdGVzdGlkPVwiZm9ybS10ZW1wbGF0ZS10aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtdGVzdGlkPVwiZm9ybS10ZW1wbGF0ZS10aXRsZS1pbnZhbGlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0cmFuc2xhdGVdPVwidmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1sndGl0bGUnXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIgdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1sndGl0bGUnXSlcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydEZXNjcmlwdGlvbicgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiIHN0eWxlPVwiaGVpZ2h0OjIwMHB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwidmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snZGVzY3JpcHRpb24nXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImZvcm0tdGVtcGxhdGUtZGVzY3JpcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkNldHRlIHZpc2l0ZSBk4oCZMWgzMCB2b3VzIHByw6lzZW50ZXJhIGxlcyDFk3V2cmVzIGVtYmzDqW1hdGlxdWVzIGR1IGPDqWzDqGJyZSBwZWludHJlIG5vcnbDqWdpZW4gRWR2YXJkIE11bmNoICgxODYzLTE5NDQpLi4uXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLXRlc3RpZD1cImZvcm0tdGVtcGxhdGUtZGVzY3JpcHRpb24taW52YWxpZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHJhbnNsYXRlXT1cInZhbGlkYXRvcnNTZXJ2aWNlLmdldEVycm9yKGZvcm0uY29udHJvbHNbJ2Rlc2NyaXB0aW9uJ10pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ2Rlc2NyaXB0aW9uJ10pXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0xhbmd1YWdlJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJsb2NhbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJudWxsXCI+e3snTm90IGFwcGxpY2FibGUnIHwgdHJhbnNsYXRlfX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbG9jYWxlIG9mIGxvY2FsZXNcIiBbbmdWYWx1ZV09XCJsb2NhbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxvY2FsZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydMZXZlbCcgfCB0cmFuc2xhdGV9fSo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImxldmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGxldmVsIG9mIGF2YWlsYWJsZUxldmVsc1wiIFtuZ1ZhbHVlXT1cImxldmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsZXZlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eyAnQXV0aG9yaXplZCBsb2NhdGlvbicgfCB0cmFuc2xhdGUgfX0qPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiICpuZ0lmPVwiYXZhaWxhYmxlU3BhY2VzICYmICFpbnB1dFpvbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwic3BhY2VcIiAoY2hhbmdlKT1cIm9uU3BhY2VDbGljaygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJmb3JtLXRlbXBsYXRlLXNwYWNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwidmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snc3BhY2UnXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgc3BhY2Ugb2YgYXZhaWxhYmxlU3BhY2VzXCIgW25nVmFsdWVdPVwic3BhY2UuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNwYWNlLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS10ZXN0aWQ9XCJmb3JtLXRlbXBsYXRlLXNwYWNlLWludmFsaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RyYW5zbGF0ZV09XCJ2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihmb3JtLmNvbnRyb2xzWydzcGFjZSddKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydzcGFjZSddKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCIgKm5nSWY9XCIhYXZhaWxhYmxlU3BhY2VzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgJ05vIGxvY2F0aW9ucyBhdmFpbGFibGUnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCIgKm5nSWY9XCJpbnB1dFpvbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFt2YWx1ZV09XCJpbnB1dFpvbmUuc3BhY2UubmFtZVwiIGRpc2FibGVkPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7ICdBdXRob3JpemVkIHpvbmUnIHwgdHJhbnNsYXRlIH19KjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cInpvbmVzRm9yU3BhY2UgJiYgem9uZXNGb3JTcGFjZS5sZW5ndGggPiAwICYmICFpbnB1dFpvbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVxdWlyZWQgZm9ybUNvbnRyb2xOYW1lPVwiem9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cInZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ3pvbmUnXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImZvcm0tdGVtcGxhdGUtem9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB6b25lIG9mIHpvbmVzRm9yU3BhY2VcIiBbbmdWYWx1ZV09XCJ6b25lLmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB6b25lLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS10ZXN0aWQ9XCJmb3JtLXRlbXBsYXRlLXpvbmUtaW52YWxpZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHJhbnNsYXRlXT1cInZhbGlkYXRvcnNTZXJ2aWNlLmdldEVycm9yKGZvcm0uY29udHJvbHNbJ3pvbmUnXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIgdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snem9uZSddKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCIgKm5nSWY9XCJ6b25lc0ZvclNwYWNlICYmIHpvbmVzRm9yU3BhY2UubGVuZ3RoID09PSAwICYmICFpbnB1dFpvbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIndhcm5pbmcgY29sLWZvcm0tbGFiZWxcIj57e1wiTm8gTXVzZXVtIFpvbmVzIGZvdW5kIGZvciB0aGlzIGxvY2F0aW9uXCJ8IHRyYW5zbGF0ZX19PC9wPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cImlucHV0Wm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW3ZhbHVlXT1cImlucHV0Wm9uZS5uYW1lXCIgZGlzYWJsZWQ+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snSGFzaHRhZ3MnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCIgKm5nSWY9XCJzcGFjZUlELnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJrZXl3b3Jkc1J1bGVzXCIgKm5nSWY9XCJhdmFpbGFibGVIYXNodGFncy5sZW5ndGggPiAwXCI+e3snQXZhaWxhYmxlIGhhc2h0YWdzJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwia2V5d29yZHNSdWxlc1wiICpuZ0lmPVwiYXZhaWxhYmxlSGFzaHRhZ3MubGVuZ3RoID09PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J05vIGhhc2h0YWdzIGNyZWF0ZWQgZm9yIHRoaXMgbG9jYXRpb24nIHwgdHJhbnNsYXRlfX0gPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhdmFpbGFibGVIYXNodGFncy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImtleXdvcmRzRGlzcGxheSBuby1ib3JkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrZXl3b3Jkc2Rpc3BsYXlDb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgW2NsYXNzXT1cImFkZGVkSGFzaHRhZ3MuaW5jbHVkZXMoaGFzaHRhZykgPyAna2V5d29yZHNJdGVtIGFkZGVkJyA6ICdrZXl3b3Jkc0l0ZW0nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGhhc2h0YWcgb2YgYXZhaWxhYmxlSGFzaHRhZ3NcIiAoY2xpY2spPVwib25IYXNodGFnQ2xpY2soaGFzaHRhZylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwie3thZGRlZEhhc2h0YWdzLmluY2x1ZGVzKGhhc2h0YWcpID8gKCdSZW1vdmUnfHRyYW5zbGF0ZSkgOiAoJ0FkZCd8dHJhbnNsYXRlKSB9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2hhc2h0YWcubmFtZX19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImtleXdvcmRzUnVsZXNcIj57eydBZGRlZCBoYXNodGFncycgfCB0cmFuc2xhdGV9fSA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImtleXdvcmRzRGlzcGxheVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleXdvcmRzZGlzcGxheUNvbnRhaW5lclwiICpuZ0lmPVwiYWRkZWRIYXNodGFncy5sZW5ndGg+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJrZXl3b3Jkc0l0ZW1cIiAqbmdGb3I9XCJsZXQgaGFzaHRhZyBvZiBhZGRlZEhhc2h0YWdzXCI+e3sgaGFzaHRhZy5uYW1lIH19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cIiFzcGFjZUlELnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJrZXl3b3Jkc1J1bGVzXCI+e3snWW91IG5lZWQgdG8gY2hvb3NlIHRoZSBsb2NhdGlvbiBmaXJzdCcgfCB0cmFuc2xhdGV9fSA8L3A+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snU3RhcnQgRGF0ZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBwbGFjZWhvbGRlcj1cImRkL21tL3l5eXlcIiBmb3JtQ29udHJvbE5hbWU9XCJzdGFydERhdGVcIiBuZ2JEYXRlcGlja2VyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZm9ybS10ZW1wbGF0ZS1zdGFydERhdGVcIiAjZDE9XCJuZ2JEYXRlcGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwidmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snc3RhcnREYXRlJ10pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWFwcGVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBjYWxlbmRhclwiIChjbGljayk9XCJkMS50b2dnbGUoKVwiIHR5cGU9XCJidXR0b25cIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLXRlc3RpZD1cImZvcm0tdGVtcGxhdGUtc3RhcnREYXRlLWludmFsaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RyYW5zbGF0ZV09XCJ2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihmb3JtLmNvbnRyb2xzWydzdGFydERhdGUnXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIgdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snc3RhcnREYXRlJ10pXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J1N0YXJ0IFRpbWUnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nYi10aW1lcGlja2VyIFsobmdNb2RlbCldPVwibWlzc2lvblRpbWVTdGFydFwiIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nYi10aW1lcGlja2VyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0VuZCBEYXRlJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHBsYWNlaG9sZGVyPVwiZGQvbW0veXl5eVwiIGZvcm1Db250cm9sTmFtZT1cImVuZERhdGVcIiBuZ2JEYXRlcGlja2VyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAjZDI9XCJuZ2JEYXRlcGlja2VyXCIgZGF0YS10ZXN0aWQ9XCJmb3JtLXRlbXBsYXRlLWVuZERhdGVcIiBbY2xhc3MuaXMtaW52YWxpZF09XCJ2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydlbmREYXRlJ10pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWFwcGVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBjYWxlbmRhclwiIChjbGljayk9XCJkMi50b2dnbGUoKVwiIHR5cGU9XCJidXR0b25cIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLXRlc3RpZD1cImZvcm0tdGVtcGxhdGUtZW5kRGF0ZS1pbnZhbGlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0cmFuc2xhdGVdPVwidmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1snZW5kRGF0ZSddKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydlbmREYXRlJ10pXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0VuZCBUaW1lJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZ2ItdGltZXBpY2tlciBbKG5nTW9kZWwpXT1cIm1pc3Npb25UaW1lRW5kXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPjwvbmdiLXRpbWVwaWNrZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJidG4tY29udHJvbC1kaXYgYWN0aW9uLWJ1dHRvbi1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgYWN0aW9uLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidGhpcy53b3JraW5nIHx8IGZvcm0uaW52YWxpZFwiIGRhdGEtdGVzdGlkPVwiZm9ybS10ZW1wbGF0ZS1zdWJtaXQtYnRuXCI+e3snU2F2ZScgfFxyXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIiBbZGlzYWJsZWRdPVwidGhpcy53b3JraW5nXCIgZGF0YS10ZXN0aWQ9XCJmb3JtLXRlbXBsYXRlLWNhbmNlbC1idG5cIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgYWN0aW9uLWJ1dHRvblwiPnt7J0NhbmNlbCcgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZm9ybT5cclxuPC9kaXY+Il19
230
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWFkbWluL3NyYy9saWIvdmlzaXRvci90ZW1wbGF0ZS90ZW1wbGF0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi92aXNpdG9yL3RlbXBsYXRlL3RlbXBsYXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUEwQixVQUFVLEVBQW1CLE1BQU0sZ0JBQWdCLENBQUM7QUFHckYsT0FBTyxFQUFxQixhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdkgsT0FBTyxFQUFnQixXQUFXLEVBQXdCLE1BQU0sRUFBOEMsa0JBQWtCLEVBQUUsV0FBVyxFQUFjLHdCQUF3QixFQUEyRCxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hSLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFFakMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7Ozs7O0FBTzdDLE1BQU0sT0FBTyxpQkFBaUI7SUFvQzFCLFlBQ1ksS0FBcUIsRUFDckIsRUFBZSxFQUNmLFdBQTRCLEVBQzVCLFlBQTBCLEVBQzFCLFdBQXdCLEVBQ3hCLFFBQWtCLEVBQ2xCLGNBQThCLEVBQzlCLFNBQTJCLEVBQzNCLGVBQWdDLEVBQ2pDLGlCQUFvQztRQVRuQyxVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUNyQixPQUFFLEdBQUYsRUFB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ZTtzQkFBeEIsTUFBTTtnQkFFRyxlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycywgQWJzdHJhY3RDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgVmFsaWRhdG9yc1NlcnZpY2UsIHRleHRWYWxpZGF0b3IsIG5vRW1wdHlWYWxpZGF0b3IsIGZsb2F0VmFsaWRhdG9yIH0gZnJvbSBcIkBzbWFydGVycGxhbi9uZ3gtc21hcnRlcnBsYW4tY29yZVwiO1xyXG5pbXBvcnQgeyBPcmdhbmlzYXRpb24sIExldmVsU3RhdHVzLCBab25lLCBTcGFjZSwgSGFzaHRhZywgTG9jYWxlLCBCYXNlVXNlclNlcnZpY2UsIFNwYWNlU2VydmljZSwgWm9uZVNlcnZpY2UsIHN0cmluZ0xvY2FsZVRvRW51bSwgZW51bVRvQXJyYXksIFJvbGVTdGF0dXMsIHNvcnRBbHBoYWJldGljYWxseU9uTmFtZSwgSGFzaHRhZ1NlcnZpY2UsIE1pc3Npb24sIFZpc2l0VGVtcGxhdGUsIFRlbXBsYXRlU2VydmljZSB9IGZyb20gJ0BzbWFydGVycGxhbi9uZ3gtc21hcnRlcnBsYW4tY29yZSc7XHJcbmltcG9ydCB7IERhdGVUaW1lIH0gZnJvbSBcImx1eG9uXCI7XHJcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2xpYi10ZW1wbGF0ZScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vdGVtcGxhdGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vdGVtcGxhdGUuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gICAgQElucHV0KCkgY3VycmVudE9yZzogT3JnYW5pc2F0aW9uO1xyXG5cclxuICAgIEBJbnB1dCgpIGVkaXRUZW1wbGF0ZTogVmlzaXRUZW1wbGF0ZTtcclxuXHJcbiAgICBASW5wdXQoKSB6b25lSUQ6IHN0cmluZztcclxuXHJcbiAgICBAT3V0cHV0KCkgdXBkYXRlZFRlbXBsYXRlID0gbmV3IEV2ZW50RW1pdHRlcjxWaXNpdFRlbXBsYXRlPigpO1xyXG5cclxuICAgIEBPdXRwdXQoKSBjcmVhdGVkVGVtcGxhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPFZpc2l0VGVtcGxhdGU+KCk7XHJcblxyXG4gICAgZm9ybTogRm9ybUdyb3VwO1xyXG5cclxuICAgIHdvcmtpbmcgPSBmYWxzZTtcclxuXHJcbiAgICB6b25lc0ZvclNwYWNlOiBab25lW107XHJcblxyXG4gICAgYXZhaWxhYmxlTGV2ZWxzOiBMZXZlbFN0YXR1c1tdO1xyXG5cclxuICAgIGF2YWlsYWJsZVNwYWNlczogU3BhY2VbXTtcclxuXHJcbiAgICBtaXNzaW9uVGltZVN0YXJ0OiBudW1iZXIgPSAxMiAqIDYwICogNjAwMDA7IC8vIG1pZGRheSBpbiBtaWxsaXNlY29uZHNcclxuXHJcbiAgICBtaXNzaW9uVGltZUVuZDogbnVtYmVyID0gMTIgKiA2MCAqIDYwMDAwO1xyXG5cclxuICAgIGlucHV0Wm9uZTogWm9uZTtcclxuXHJcbiAgICBhdmFpbGFibGVIYXNodGFnczogSGFzaHRhZ1tdID0gW107XHJcblxyXG4gICAgYWRkZWRIYXNodGFnczogSGFzaHRhZ1tdID0gW107XHJcblxyXG4gICAgY3VycmVudExvY2FsZTogTG9jYWxlO1xyXG5cclxuICAgIGxvY2FsZXM6IHN0cmluZ1tdO1xyXG5cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICAgICAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBzcGFjZVNlcnZpY2U6IFNwYWNlU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHpvbmVTZXJ2aWNlOiBab25lU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbixcclxuICAgICAgICBwcml2YXRlIGhhc2h0YWdTZXJ2aWNlOiBIYXNodGFnU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHRlbXBsYXRlU2VydmljZTogVGVtcGxhdGVTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyB2YWxpZGF0b3JzU2VydmljZTogVmFsaWRhdG9yc1NlcnZpY2VcclxuXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlLmlzQ2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVVzZXJJbmZvKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zZXR1cCgpO1xyXG4gICAgICAgIGNvbnN0IGxhbmcgPSB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZ1xyXG4gICAgICAgICAgICA/IHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nXHJcbiAgICAgICAgICAgIDogdGhpcy50cmFuc2xhdGUuZGVmYXVsdExhbmc7XHJcblxyXG4gICAgICAgIC8qKiBUcmFuc2Zvcm1lICdfZnInIHRvICdmcicgKi9cclxuICAgICAgICB0aGlzLmN1cnJlbnRMb2NhbGUgPSBzdHJpbmdMb2NhbGVUb0VudW0obGFuZy5zbGljZSgxKSk7IC8vIHRvIG1hdGNoIGVudW0gTG9jYWxlXHJcbiAgICAgICAgdGhpcy5sb2NhbGVzID0gZW51bVRvQXJyYXkoTG9jYWxlKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZXR1cCgpIHtcclxuICAgICAgICAvLyByZXNwZWN0IHRoZSBvcmRlciBvZiBmdW5jdGlvbnMgaGVyZSAhIVxyXG4gICAgICAgIGlmICh0aGlzLnpvbmVJRCkge1xyXG4gICAgICAgICAgICB0aGlzLmlucHV0Wm9uZSA9IGF3YWl0IHRoaXMuem9uZVNlcnZpY2UuZ2V0Wm9uZSh0aGlzLnpvbmVJRCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0SGFzaHRhZ3ModGhpcy5pbnB1dFpvbmUuc3BhY2VJRCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaW5pdEZvcm0oKTtcclxuICAgICAgICBpZiAodGhpcy5lZGl0VGVtcGxhdGUpIHtcclxuICAgICAgICAgICAgLy8gd2UgYXJlIGVkaXRpbmcgYSB0ZW1wbGF0ZVxyXG4gICAgICAgICAgICB0aGlzLm9uU3BhY2VDbGljayh0aGlzLmVkaXRUZW1wbGF0ZS5zcGFjZUlEKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy51cGRhdGVVc2VySW5mbygpO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB1cGRhdGVVc2VySW5mbygpIHtcclxuICAgICAgICBpZiAodGhpcy51c2VyU2VydmljZS5jdSkge1xyXG4gICAgICAgICAgICB0aGlzLmF2YWlsYWJsZUxldmVscyA9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlLmdldEF2YWxhYmxlTGV2ZWxzRm9yQ3VycmVudFVzZXIoKTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50T3JnID0gdGhpcy51c2VyU2VydmljZS5jdXJyZW50T3JnYW5pc2F0aW9uKCk7XHJcbiAgICAgICAgICAgIHRoaXMuYXZhaWxhYmxlU3BhY2VzID0gYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UuZ2V0U3BhY2VzRm9yT3JnKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50T3JnLmlkLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbml0Rm9ybSgpIHtcclxuICAgICAgICBsZXQgc3RhcnREYXRlOiBhbnkgPSBudWxsO1xyXG4gICAgICAgIGxldCBlbmREYXRlOiBhbnkgPSBudWxsO1xyXG4gICAgICAgIGlmICh0aGlzLmVkaXRUZW1wbGF0ZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5lZGl0VGVtcGxhdGUuc3RhcnREYXRlVGltZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0ZSA9IERhdGVUaW1lLmZyb21JU08odGhpcy5lZGl0VGVtcGxhdGUuc3RhcnREYXRlVGltZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1pc3Npb25UaW1lU3RhcnQgPSAoZGF0ZS5ob3VyICogNjAgKyBkYXRlLm1pbnV0ZSkgKiA2MCAqIDEwMDA7XHJcbiAgICAgICAgICAgICAgICBzdGFydERhdGUgPSBkYXRlLnRvTWlsbGlzKCkgLSB0aGlzLm1pc3Npb25UaW1lU3RhcnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRoaXMuZWRpdFRlbXBsYXRlLmVuZERhdGVUaW1lKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlID0gRGF0ZVRpbWUuZnJvbUlTTyh0aGlzLmVkaXRUZW1wbGF0ZS5lbmREYXRlVGltZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1pc3Npb25UaW1lRW5kID0gKGRhdGUuaG91ciAqIDYwICsgZGF0ZS5taW51dGUpICogNjAgKiAxMDAwO1xyXG4gICAgICAgICAgICAgICAgZW5kRGF0ZSA9IGRhdGUudG9NaWxsaXMoKSAtIHRoaXMubWlzc2lvblRpbWVFbmQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6IFt0aGlzLmVkaXRUZW1wbGF0ZS50aXRsZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDI1NSksIHRleHRWYWxpZGF0b3IoKSwgbm9FbXB0eVZhbGlkYXRvcigpXV0sXHJcbiAgICAgICAgICAgICAgICBsZXZlbDogW3RoaXMuZWRpdFRlbXBsYXRlLmxldmVsXSxcclxuICAgICAgICAgICAgICAgIG9yZ2FuaXNhdGlvbklEOiBbdGhpcy5lZGl0VGVtcGxhdGUub3JnYW5pc2F0aW9uSURdLFxyXG4gICAgICAgICAgICAgICAgc3BhY2U6IFt0aGlzLmVkaXRUZW1wbGF0ZS5zcGFjZUlELCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBbdGhpcy5lZGl0VGVtcGxhdGUuZGVzY3JpcHRpb24sIFt0ZXh0VmFsaWRhdG9yKCksIG5vRW1wdHlWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgICAgICAgICAgem9uZTogW1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdFRlbXBsYXRlLnpvbmVJRCxcclxuICAgICAgICAgICAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgICAgIGxvY2FsZTogW3RoaXMuZWRpdFRlbXBsYXRlLmxvY2FsZV0sXHJcbiAgICAgICAgICAgICAgICBzdGFydERhdGU6IFtzdGFydERhdGUsIFtmbG9hdFZhbGlkYXRvcigpLCBWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgICAgICAgICAgICBlbmREYXRlOiBbZW5kRGF0ZSwgW2Zsb2F0VmFsaWRhdG9yKCksIFZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6IFtudWxsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjU1KSwgdGV4dFZhbGlkYXRvcigpLCBub0VtcHR5VmFsaWRhdG9yKCldXSxcclxuICAgICAgICAgICAgICAgIGxldmVsOiBbTGV2ZWxTdGF0dXMuTUlOSU1VTV0sXHJcbiAgICAgICAgICAgICAgICBvcmdhbmlzYXRpb25JRDogdGhpcy5jdXJyZW50T3JnLmlkLFxyXG4gICAgICAgICAgICAgICAgc3BhY2U6IFt0aGlzLmlucHV0Wm9uZSA/IHRoaXMuaW5wdXRab25lLnNwYWNlSUQgOiBudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBbJycsIFt0ZXh0VmFsaWRhdG9yKCksIG5vRW1wdHlWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgICAgICAgICAgem9uZTogW1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRab25lID8gdGhpcy5pbnB1dFpvbmUuaWQgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgbG9jYWxlOiBbdGhpcy5jdXJyZW50TG9jYWxlXSxcclxuICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZTogW3N0YXJ0RGF0ZSwgW2Zsb2F0VmFsaWRhdG9yKCksIFZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgICAgICAgICAgIGVuZERhdGU6IFtlbmREYXRlLCBbZmxvYXRWYWxpZGF0b3IoKSwgVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG5cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uU3VibWl0KCkge1xyXG4gICAgICAgIHRoaXMud29ya2luZyA9IHRydWU7XHJcbiAgICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5mb3JtLmdldFJhd1ZhbHVlKCk7XHJcbiAgICAgICAgbGV0IHN0YXJ0RGF0ZVN0cmluZzogc3RyaW5nO1xyXG4gICAgICAgIGxldCBlbmREYXRlU3RyaW5nOiBzdHJpbmc7XHJcblxyXG4gICAgICAgIGlmIChmb3JtVmFsdWUuc3RhcnREYXRlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGVIb3VyU3RhcnROdW1iZXIgPSBmb3JtVmFsdWUuc3RhcnREYXRlICsgdGhpcy5taXNzaW9uVGltZVN0YXJ0O1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydERhdGUgPSBEYXRlVGltZS5mcm9tTWlsbGlzKGRhdGVIb3VyU3RhcnROdW1iZXIpO1xyXG4gICAgICAgICAgICBzdGFydERhdGVTdHJpbmcgPSBzdGFydERhdGUudG9JU08oKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coc3RhcnREYXRlU3RyaW5nKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZm9ybVZhbHVlLmVuZERhdGUpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZUhvdXJFbmROdW1iZXIgPSBmb3JtVmFsdWUuZW5kRGF0ZSArIHRoaXMubWlzc2lvblRpbWVFbmQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZERhdGUgPSBEYXRlVGltZS5mcm9tTWlsbGlzKGRhdGVIb3VyRW5kTnVtYmVyKTtcclxuICAgICAgICAgICAgZW5kRGF0ZVN0cmluZyA9IGVuZERhdGUudG9JU08oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZWRpdFRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGVcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlOiBWaXNpdFRlbXBsYXRlID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLmVkaXRUZW1wbGF0ZS5pZCxcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogZm9ybVZhbHVlLnRpdGxlLFxyXG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiBmb3JtVmFsdWUubGV2ZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGZvcm1WYWx1ZS5kZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBvcmdhbmlzYXRpb25JRDogZm9ybVZhbHVlLm9yZ2FuaXNhdGlvbklELFxyXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZVRpbWU6IHN0YXJ0RGF0ZVN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICBlbmREYXRlVGltZTogZW5kRGF0ZVN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICBoYXNodGFnczogdGhpcy5hZGRlZEhhc2h0YWdzLm1hcCgoaGFzaHRhZykgPT4gaGFzaHRhZy5pZCksXHJcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxlOiBmb3JtVmFsdWUubG9jYWxlLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGlmIChmb3JtVmFsdWUuc3BhY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5zcGFjZUlEID0gZm9ybVZhbHVlLnNwYWNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGZvcm1WYWx1ZS56b25lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUuem9uZUlEID0gZm9ybVZhbHVlLnpvbmU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZWRUZW1wbGF0ZS5lbWl0KHRlbXBsYXRlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vY3JlYXRlXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50T3JnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVtcGxhdGU6IFZpc2l0VGVtcGxhdGUgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBmb3JtVmFsdWUudGl0bGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yZ2FuaXNhdGlvbklEOiB0aGlzLmN1cnJlbnRPcmcuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiBmb3JtVmFsdWUubGV2ZWwsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBmb3JtVmFsdWUuZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF0ZVRpbWU6IHN0YXJ0RGF0ZVN0cmluZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kRGF0ZVRpbWU6IGVuZERhdGVTdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc2h0YWdzOiB0aGlzLmFkZGVkSGFzaHRhZ3MubWFwKChoYXNodGFnKSA9PiBoYXNodGFnLmlkKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlOiBmb3JtVmFsdWUubG9jYWxlLFxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1WYWx1ZS5zcGFjZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5zcGFjZUlEID0gZm9ybVZhbHVlLnNwYWNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybVZhbHVlLnpvbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUuem9uZUlEID0gZm9ybVZhbHVlLnpvbmU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlZFRlbXBsYXRlLmVtaXQodGVtcGxhdGUpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uQ2FuY2VsKCkge1xyXG4gICAgICAgIHRoaXMuZm9ybSA9IG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuZWRpdFRlbXBsYXRlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlZFRlbXBsYXRlLmVtaXQobnVsbCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVkVGVtcGxhdGUuZW1pdChudWxsKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHRpdGxlKCk6IEFic3RyYWN0Q29udHJvbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoXCJ0aXRsZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc3BhY2VJRCgpOiBBYnN0cmFjdENvbnRyb2wge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KFwic3BhY2VcIik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TcGFjZUNsaWNrKHNwYWNlSUQ6IHN0cmluZyA9IG51bGwpIHtcclxuICAgICAgICBsZXQgaW5wdXRTcGFjZUlEID0gc3BhY2VJRCA/IHNwYWNlSUQgOiB0aGlzLnNwYWNlSUQudmFsdWU7XHJcbiAgICAgICAgY29uc3Qgem9uZXMgPSBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLmdldFpvbmVzQnlTcGFjZShcclxuICAgICAgICAgICAgaW5wdXRTcGFjZUlELFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgbXVzZXVtWm9uZXMgPSB6b25lcy5maWx0ZXIoKHpvbmUpID0+IHpvbmUuaXNNdXNldW1WaXNpdFpvbmUpO1xyXG4gICAgICAgIHRoaXMuem9uZXNGb3JTcGFjZSA9IHNvcnRBbHBoYWJldGljYWxseU9uTmFtZShtdXNldW1ab25lcyk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZXRIYXNodGFncyhpbnB1dFNwYWNlSUQpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uSGFzaHRhZ0NsaWNrKGhhc2h0YWc6IEhhc2h0YWcpIHtcclxuICAgICAgICBpZiAoIXRoaXMuYWRkZWRIYXNodGFncy5pbmNsdWRlcyhoYXNodGFnKSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZGVkSGFzaHRhZ3MucHVzaChoYXNodGFnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFkZGVkSGFzaHRhZ3Muc3BsaWNlKHRoaXMuYWRkZWRIYXNodGFncy5pbmRleE9mKGhhc2h0YWcpLCAxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2V0SGFzaHRhZ3Moc3BhY2VJRDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5hdmFpbGFibGVIYXNodGFncyA9IGF3YWl0IHRoaXMuaGFzaHRhZ1NlcnZpY2UuZ2V0SGFzaHRhZ3NGb3JTcGFjZShcclxuICAgICAgICAgICAgc3BhY2VJRCxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW5lclwiICpuZ0lmPVwiZm9ybVwiPlxyXG4gICAgPGRpdj5cclxuICAgICAgICA8aDQ+e3sgJ1Zpc2l0IFRlbXBsYXRlJyB8IHRyYW5zbGF0ZSB9fTwvaDQ+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxmb3JtIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdCgpXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J1Zpc2l0IFRpdGxlJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVkdmFyZCBNdW5jaCAtIMKrIFVuIHBvw6htZSBk4oCZYW1vdXIsIGRlIHZpZSBldCBkZSBtb3J0IMK7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwidmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1sndGl0bGUnXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIGRhdGEtdGVzdGlkPVwiZm9ybS10ZW1wbGF0ZS10aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtdGVzdGlkPVwiZm9ybS10ZW1wbGF0ZS10aXRsZS1pbnZhbGlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0cmFuc2xhdGVdPVwidmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1sndGl0bGUnXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIgdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1sndGl0bGUnXSlcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydEZXNjcmlwdGlvbicgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiIHN0eWxlPVwiaGVpZ2h0OjIwMHB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwidmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snZGVzY3JpcHRpb24nXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImZvcm0tdGVtcGxhdGUtZGVzY3JpcHRpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkNldHRlIHZpc2l0ZSBk4oCZMWgzMCB2b3VzIHByw6lzZW50ZXJhIGxlcyDFk3V2cmVzIGVtYmzDqW1hdGlxdWVzIGR1IGPDqWzDqGJyZSBwZWludHJlIG5vcnbDqWdpZW4gRWR2YXJkIE11bmNoICgxODYzLTE5NDQpLi4uXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLXRlc3RpZD1cImZvcm0tdGVtcGxhdGUtZGVzY3JpcHRpb24taW52YWxpZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHJhbnNsYXRlXT1cInZhbGlkYXRvcnNTZXJ2aWNlLmdldEVycm9yKGZvcm0uY29udHJvbHNbJ2Rlc2NyaXB0aW9uJ10pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ2Rlc2NyaXB0aW9uJ10pXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0xhbmd1YWdlJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJsb2NhbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJudWxsXCI+e3snTm90IGFwcGxpY2FibGUnIHwgdHJhbnNsYXRlfX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbG9jYWxlIG9mIGxvY2FsZXNcIiBbbmdWYWx1ZV09XCJsb2NhbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxvY2FsZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydMZXZlbCcgfCB0cmFuc2xhdGV9fSo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImxldmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGxldmVsIG9mIGF2YWlsYWJsZUxldmVsc1wiIFtuZ1ZhbHVlXT1cImxldmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBsZXZlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eyAnQXV0aG9yaXplZCBsb2NhdGlvbicgfCB0cmFuc2xhdGUgfX0qPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiICpuZ0lmPVwiYXZhaWxhYmxlU3BhY2VzICYmICFpbnB1dFpvbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwic3BhY2VcIiAoY2hhbmdlKT1cIm9uU3BhY2VDbGljaygpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJmb3JtLXRlbXBsYXRlLXNwYWNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwidmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snc3BhY2UnXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgc3BhY2Ugb2YgYXZhaWxhYmxlU3BhY2VzXCIgW25nVmFsdWVdPVwic3BhY2UuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNwYWNlLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS10ZXN0aWQ9XCJmb3JtLXRlbXBsYXRlLXNwYWNlLWludmFsaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RyYW5zbGF0ZV09XCJ2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihmb3JtLmNvbnRyb2xzWydzcGFjZSddKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydzcGFjZSddKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCIgKm5nSWY9XCIhYXZhaWxhYmxlU3BhY2VzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3sgJ05vIGxvY2F0aW9ucyBhdmFpbGFibGUnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCIgKm5nSWY9XCJpbnB1dFpvbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFt2YWx1ZV09XCJpbnB1dFpvbmUuc3BhY2UubmFtZVwiIGRpc2FibGVkPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7ICdBdXRob3JpemVkIHpvbmUnIHwgdHJhbnNsYXRlIH19KjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cInpvbmVzRm9yU3BhY2UgJiYgem9uZXNGb3JTcGFjZS5sZW5ndGggPiAwICYmICFpbnB1dFpvbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVxdWlyZWQgZm9ybUNvbnRyb2xOYW1lPVwiem9uZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cInZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ3pvbmUnXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImZvcm0tdGVtcGxhdGUtem9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB6b25lIG9mIHpvbmVzRm9yU3BhY2VcIiBbbmdWYWx1ZV09XCJ6b25lLmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB6b25lLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS10ZXN0aWQ9XCJmb3JtLXRlbXBsYXRlLXpvbmUtaW52YWxpZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHJhbnNsYXRlXT1cInZhbGlkYXRvcnNTZXJ2aWNlLmdldEVycm9yKGZvcm0uY29udHJvbHNbJ3pvbmUnXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIgdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snem9uZSddKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCIgKm5nSWY9XCJ6b25lc0ZvclNwYWNlICYmIHpvbmVzRm9yU3BhY2UubGVuZ3RoID09PSAwICYmICFpbnB1dFpvbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIndhcm5pbmcgY29sLWZvcm0tbGFiZWxcIj57e1wiTm8gTXVzZXVtIFpvbmVzIGZvdW5kIGZvciB0aGlzIGxvY2F0aW9uXCJ8IHRyYW5zbGF0ZX19PC9wPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cImlucHV0Wm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW3ZhbHVlXT1cImlucHV0Wm9uZS5uYW1lXCIgZGlzYWJsZWQ+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snSGFzaHRhZ3MnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCIgKm5nSWY9XCJzcGFjZUlELnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJrZXl3b3Jkc1J1bGVzXCIgKm5nSWY9XCJhdmFpbGFibGVIYXNodGFncy5sZW5ndGggPiAwXCI+e3snQXZhaWxhYmxlIGhhc2h0YWdzJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwia2V5d29yZHNSdWxlc1wiICpuZ0lmPVwiYXZhaWxhYmxlSGFzaHRhZ3MubGVuZ3RoID09PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J05vIGhhc2h0YWdzIGNyZWF0ZWQgZm9yIHRoaXMgbG9jYXRpb24nIHwgdHJhbnNsYXRlfX0gPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhdmFpbGFibGVIYXNodGFncy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImtleXdvcmRzRGlzcGxheSBuby1ib3JkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrZXl3b3Jkc2Rpc3BsYXlDb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgW2NsYXNzXT1cImFkZGVkSGFzaHRhZ3MuaW5jbHVkZXMoaGFzaHRhZykgPyAna2V5d29yZHNJdGVtIGFkZGVkJyA6ICdrZXl3b3Jkc0l0ZW0nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGhhc2h0YWcgb2YgYXZhaWxhYmxlSGFzaHRhZ3NcIiAoY2xpY2spPVwib25IYXNodGFnQ2xpY2soaGFzaHRhZylcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwie3thZGRlZEhhc2h0YWdzLmluY2x1ZGVzKGhhc2h0YWcpID8gKCdSZW1vdmUnfHRyYW5zbGF0ZSkgOiAoJ0FkZCd8dHJhbnNsYXRlKSB9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2hhc2h0YWcubmFtZX19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImtleXdvcmRzUnVsZXNcIj57eydBZGRlZCBoYXNodGFncycgfCB0cmFuc2xhdGV9fSA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImtleXdvcmRzRGlzcGxheVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleXdvcmRzZGlzcGxheUNvbnRhaW5lclwiICpuZ0lmPVwiYWRkZWRIYXNodGFncy5sZW5ndGg+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJrZXl3b3Jkc0l0ZW1cIiAqbmdGb3I9XCJsZXQgaGFzaHRhZyBvZiBhZGRlZEhhc2h0YWdzXCI+e3sgaGFzaHRhZy5uYW1lIH19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cIiFzcGFjZUlELnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJrZXl3b3Jkc1J1bGVzXCI+e3snWW91IG5lZWQgdG8gY2hvb3NlIHRoZSBsb2NhdGlvbiBmaXJzdCcgfCB0cmFuc2xhdGV9fSA8L3A+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snU3RhcnQgRGF0ZScgfCB0cmFuc2xhdGV9fSAqPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHBsYWNlaG9sZGVyPVwiZGQvbW0veXl5eVwiIGZvcm1Db250cm9sTmFtZT1cInN0YXJ0RGF0ZVwiIG5nYkRhdGVwaWNrZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJmb3JtLXRlbXBsYXRlLXN0YXJ0RGF0ZVwiICNkMT1cIm5nYkRhdGVwaWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJ2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydzdGFydERhdGUnXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYXBwZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGNhbGVuZGFyXCIgKGNsaWNrKT1cImQxLnRvZ2dsZSgpXCIgdHlwZT1cImJ1dHRvblwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtdGVzdGlkPVwiZm9ybS10ZW1wbGF0ZS1zdGFydERhdGUtaW52YWxpZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHJhbnNsYXRlXT1cInZhbGlkYXRvcnNTZXJ2aWNlLmdldEVycm9yKGZvcm0uY29udHJvbHNbJ3N0YXJ0RGF0ZSddKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydzdGFydERhdGUnXSlcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snU3RhcnQgVGltZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmdiLXRpbWVwaWNrZXIgWyhuZ01vZGVsKV09XCJtaXNzaW9uVGltZVN0YXJ0XCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmdiLXRpbWVwaWNrZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snRW5kIERhdGUnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBwbGFjZWhvbGRlcj1cImRkL21tL3l5eXlcIiBmb3JtQ29udHJvbE5hbWU9XCJlbmREYXRlXCIgbmdiRGF0ZXBpY2tlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgI2QyPVwibmdiRGF0ZXBpY2tlclwiIGRhdGEtdGVzdGlkPVwiZm9ybS10ZW1wbGF0ZS1lbmREYXRlXCIgW2NsYXNzLmlzLWludmFsaWRdPVwidmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snZW5kRGF0ZSddKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1hcHBlbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnkgY2FsZW5kYXJcIiAoY2xpY2spPVwiZDIudG9nZ2xlKClcIiB0eXBlPVwiYnV0dG9uXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS10ZXN0aWQ9XCJmb3JtLXRlbXBsYXRlLWVuZERhdGUtaW52YWxpZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHJhbnNsYXRlXT1cInZhbGlkYXRvcnNTZXJ2aWNlLmdldEVycm9yKGZvcm0uY29udHJvbHNbJ2VuZERhdGUnXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIgdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snZW5kRGF0ZSddKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydFbmQgVGltZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmdiLXRpbWVwaWNrZXIgWyhuZ01vZGVsKV09XCJtaXNzaW9uVGltZUVuZFwiIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIj48L25nYi10aW1lcGlja2VyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWNvbnRyb2wtZGl2IGFjdGlvbi1idXR0b24tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIGFjdGlvbi1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRoaXMud29ya2luZyB8fCBmb3JtLmludmFsaWRcIiBkYXRhLXRlc3RpZD1cImZvcm0tdGVtcGxhdGUtc3VibWl0LWJ0blwiPnt7J1NhdmUnIHxcclxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkNhbmNlbCgpXCIgW2Rpc2FibGVkXT1cInRoaXMud29ya2luZ1wiIGRhdGEtdGVzdGlkPVwiZm9ybS10ZW1wbGF0ZS1jYW5jZWwtYnRuXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIGFjdGlvbi1idXR0b25cIj57eydDYW5jZWwnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICA8L2Zvcm0+XHJcbjwvZGl2PiJdfQ==