@smarterplan/ngx-smarterplan-admin 0.1.41 → 0.1.43

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.
@@ -27,6 +27,7 @@ export class FormMissionComponent {
27
27
  this.missionTimeEnd = 12 * 60 * 60000;
28
28
  this.addedHashtags = [];
29
29
  this.dateError = false;
30
+ this.errorForm = false;
30
31
  }
31
32
  async ngOnInit() {
32
33
  this.updateUserInfo();
@@ -143,40 +144,49 @@ export class FormMissionComponent {
143
144
  removeHashtag(hashtag) {
144
145
  this.addedHashtags.splice(this.addedHashtags.indexOf(hashtag), 1);
145
146
  }
146
- onSubmit() {
147
- const formValue = this.missionForm.value;
147
+ async onSubmit() {
148
148
  if (!this.missionForm.valid) {
149
- // this shows errors in the form
150
- this.missionForm.markAllAsTouched();
149
+ this.errorForm = true;
151
150
  return;
152
151
  }
153
- let startDateString;
154
- let endDateString;
155
- if (formValue.startDate) {
156
- const dateHourStartNumber = formValue.startDate + this.missionTimeStart;
157
- const startDate = DateTime.fromMillis(dateHourStartNumber);
158
- startDateString = startDate.toISO();
159
- }
160
- if (formValue.endDate) {
161
- const dateHourEndNumber = formValue.endDate + this.missionTimeEnd;
162
- const endDate = DateTime.fromMillis(dateHourEndNumber);
163
- endDateString = endDate.toISO();
164
- }
165
- if (endDateString && startDateString && (endDateString < startDateString)) {
152
+ const datesValues = await this.onVerifDate();
153
+ if (datesValues.error) {
166
154
  this.dateError = true;
155
+ this.errorForm = true;
167
156
  return;
168
157
  }
169
- else {
170
- this.dateError = false;
171
- }
158
+ const formValue = this.missionForm.value;
159
+ // if (!this.missionForm.valid) {
160
+ // // this shows errors in the form
161
+ // this.missionForm.markAllAsTouched();
162
+ // return;
163
+ // }
164
+ // let startDateString: string;
165
+ // let endDateString: string;
166
+ // if (formValue.startDate) {
167
+ // const dateHourStartNumber = formValue.startDate + this.missionTimeStart;
168
+ // const startDate = DateTime.fromMillis(dateHourStartNumber);
169
+ // startDateString = startDate.toISO();
170
+ // }
171
+ // if (formValue.endDate) {
172
+ // const dateHourEndNumber = formValue.endDate + this.missionTimeEnd;
173
+ // const endDate = DateTime.fromMillis(dateHourEndNumber);
174
+ // endDateString = endDate.toISO();
175
+ // }
176
+ // if (endDateString && startDateString && (endDateString < startDateString)) {
177
+ // this.dateError = true;
178
+ // return;
179
+ // } else {
180
+ // this.dateError = false;
181
+ // }
172
182
  const missionInput = {
173
183
  organisationID: formValue.organisationID,
174
184
  orderedOrganisationID: formValue.orderedOrganisationID,
175
185
  level: formValue.level,
176
186
  role: formValue.role,
177
187
  description: formValue.description,
178
- startDateTime: startDateString,
179
- endDateTime: endDateString,
188
+ startDateTime: datesValues.startDateString,
189
+ endDateTime: datesValues.endDateString,
180
190
  domains: formValue.domains,
181
191
  userID: this.userForMissionID,
182
192
  emailStatus: this.missionToEdit
@@ -199,12 +209,41 @@ export class FormMissionComponent {
199
209
  onCancel() {
200
210
  this.addedMissionInput.emit(null);
201
211
  }
212
+ isFormError(control) {
213
+ return control && control.invalid && this.errorForm;
214
+ }
215
+ onVerifDate() {
216
+ return new Promise((resolve) => {
217
+ const formValue = this.missionForm.getRawValue();
218
+ let startDateString;
219
+ let endDateString;
220
+ if (formValue.startDate) {
221
+ const dateHourStartNumber = formValue.startDate + this.missionTimeStart;
222
+ const startDate = DateTime.fromMillis(dateHourStartNumber);
223
+ startDateString = startDate.toISO();
224
+ }
225
+ if (formValue.endDate) {
226
+ const dateHourEndNumber = formValue.endDate + this.missionTimeEnd;
227
+ const endDate = DateTime.fromMillis(dateHourEndNumber);
228
+ endDateString = endDate.toISO();
229
+ }
230
+ if (endDateString && startDateString &&
231
+ endDateString <= startDateString) {
232
+ this.dateError = true;
233
+ resolve({ error: true });
234
+ }
235
+ else {
236
+ this.dateError = false;
237
+ resolve({ startDateString, endDateString });
238
+ }
239
+ });
240
+ }
202
241
  }
203
242
  FormMissionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: FormMissionComponent, deps: [{ token: i1.FormBuilder }, { token: i2.SpaceService }, { token: i2.BaseUserService }, { token: i2.DomainService }, { token: i2.OrganisationService }, { token: i2.ZoneService }, { token: i2.HashtagService }, { token: i2.LocaleService }, { token: i2.ValidatorsService }], target: i0.ɵɵFactoryTarget.Component });
204
- FormMissionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: FormMissionComponent, selector: "lib-form-mission", inputs: { missionToEdit: "missionToEdit", organisationForMission: "organisationForMission", isSP: "isSP", userForMissionID: "userForMissionID", currentUserOrganisation: "currentUserOrganisation" }, outputs: { addedMissionInput: "addedMissionInput" }, ngImport: i0, template: "<div class=\"form-containter\" *ngIf=\"missionForm\">\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'Mission details' | translate }}</h4>\r\n </div>\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"missionForm\">\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Organisation' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" data-testid=\"form-mission-organisation\" class=\"form-control\"\r\n formControlName=\"organisation\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\" *ngIf=\"isSP\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Ordered by' | translate }}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"orderedOrganisationID\">\r\n <option *ngFor=\"let org of allOrgs\" [ngValue]=\"org.id\">\r\n {{ org.name }}\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\">{{'Description' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <textarea class=\"form-control\" formControlName=\"description\" rows=\"10\"\r\n [class.is-invalid]=\"validatorsService.isControlError(missionForm.controls['description'])\"\r\n data-testid=\"form-mission-description\"></textarea>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-mission-description-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['description'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.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\">{{'Role' | translate}}*</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"role\" data-testid=\"form-mission-role\"\r\n [class.is-invalid]=\"validatorsService.isControlError(missionForm.controls['role'])\">\r\n <option *ngFor=\"let r of availableRoles\" [ngValue]=\"r\">\r\n {{ r }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-mission-role-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['role'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['role'])\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\"\r\n *ngIf=\"missionForm.get('role').value !== 'VISITOR_MUSEUM' && missionForm.get('role').value !== 'GUIDE_MUSEUM'\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Domains' | translate}}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"domains\">\r\n <select class=\"form-control\" multiple formControlName=\"domains\">\r\n <option *ngFor=\"let domain of domains\" [ngValue]=\"domain.id\">\r\n {{ domain.name }}\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\">{{'Access level' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"level\" data-testid=\"form-mission-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\">\r\n <select class=\"form-control\" required formControlName=\"space\" (change)=\"onSpaceClick()\"\r\n data-testid=\"form-mission-space\"\r\n [class.is-invalid]=\"validatorsService.isControlError(missionForm.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-mission-space-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['space'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.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>\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; else noSpace\">\r\n <select class=\"form-control\" formControlName=\"zone\" data-testid=\"form-mission-zone\">\r\n <option [ngValue]=\"defaultZone.id\">\r\n {{ 'All zones' | translate }}\r\n </option>\r\n <option *ngFor=\"let zone of zonesForSpace\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n </div>\r\n <ng-template #noSpace>\r\n <div class=\"col-sm-8 hint-container\">\r\n <p class=\"hint keywordsRules\">{{'You need to choose the location first' | translate}} </p>\r\n </div>\r\n </ng-template>\r\n </div>\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 <!-- Hashtags are available after Space is set -->\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}} </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 *ngFor=\"let hashtag of availableHashtags\"\r\n [class]=\"hashtagAdded(hashtag) ? 'keywordsItem added' : 'keywordsItem'\"\r\n (click)=\"onHashtagClick(hashtag)\" style=\"cursor: pointer;\"\r\n ngbTooltip=\"{{hashtagAdded(hashtag) ? ('Remove'|translate) : ('Add'|translate) }}\">\r\n {{hashtag.name}}\r\n </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 }}\r\n <a type=\"button\" class=\"closeButton\" (click)=\"removeHashtag(hashtag)\">\r\n <span class=\"crossItem\"></span>\r\n </a>\r\n </li>\r\n </div>\r\n </ul>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8 hint-container\" *ngIf=\"!spaceID.value\">\r\n <p class=\"hint 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\">{{'Mission 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 #d1=\"ngbDatepicker\" data-testid=\"form-mission-startDate\"\r\n [class.is-invalid]=\"validatorsService.isControlError(missionForm.controls['startDate'])|| dateError\">\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-mission-startDate-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['startDate'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['startDate'])\"></span>\r\n\r\n <span data-testid=\"form-template-startDate-invalid-verif\" translate=\"errorForm.date_start_end\"\r\n *ngIf=\"dateError\"></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\">{{'Mission Start Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8 timeZoneContainer\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeStart\" [ngModelOptions]=\"{standalone: true}\"></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\">{{'Mission End Date' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" ngbDatepicker #d2=\"ngbDatepicker\"\r\n formControlName=\"endDate\" data-testid=\"form-mission-endDate\"\r\n [class.is-invalid]=\"validatorsService.isControlError(missionForm.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-mission-endDate-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['endDate'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['endDate'])\"></span>\r\n \r\n <span data-testid=\"form-template-endDate-invalid-verif\"\r\n translate=\"errorForm.date_end_start\"\r\n *ngIf=\"dateError\"></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\">{{'Mission End Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8 timeZoneContainer\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeEnd\" [ngModelOptions]=\"{standalone: true}\"></ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n <div class=\"btn-control-div action-button-container\">\r\n <button type=\"submit\" [disabled]=\"missionForm.invalid\"\r\n class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n data-testid=\"form-mission-submit-btn\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" data-testid=\"form-mission-cancel-btn\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' |\r\n translate}}</button>\r\n </div>\r\n </form>\r\n</div>", styles: [".form-containter{padding:0rem 1rem;margin-bottom:2rem}.checkbox-apply{margin-top:calc(.375rem + 1px)}.keywordsDisplay{min-height:40px}.hint{margin:0!important}.hint-container{display:flex;align-items:center}.crossItem{margin:0;padding:0;border:0;background:none;position:relative;width:7px;height:20px}.crossItem:before,.crossItem:after{content:\"\";position:absolute;top:6.25px;left:0;right:0;height:1.5px;background:#fff;border-radius:1.5px}.crossItem:before{transform:rotate(45deg)}.crossItem:after{transform:rotate(-45deg)}.crossItem span{display:block}.btn-control-div .btn{width:8rem}.timeZoneContainer{align-items:center}.timeZoneContainer span{margin-left:5px}.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}\n"], components: [{ type: i3.NgbTimepicker, selector: "ngb-timepicker", inputs: ["meridian", "spinners", "seconds", "hourStep", "minuteStep", "secondStep", "readonlyInputs", "size"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i5.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { type: i1.SelectMultipleControlValueAccessor, selector: "select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]", inputs: ["compareWith"] }, { type: i3.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i3.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: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "translate": i5.TranslatePipe } });
243
+ FormMissionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: FormMissionComponent, selector: "lib-form-mission", inputs: { missionToEdit: "missionToEdit", organisationForMission: "organisationForMission", isSP: "isSP", userForMissionID: "userForMissionID", currentUserOrganisation: "currentUserOrganisation" }, outputs: { addedMissionInput: "addedMissionInput" }, ngImport: i0, template: "<div class=\"form-containter\" *ngIf=\"missionForm\">\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'Mission details' | translate }}</h4>\r\n </div>\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"missionForm\">\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Organisation' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" data-testid=\"form-mission-organisation\" class=\"form-control\"\r\n formControlName=\"organisation\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\" *ngIf=\"isSP\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Ordered by' | translate }}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"orderedOrganisationID\">\r\n <option *ngFor=\"let org of allOrgs\" [ngValue]=\"org.id\">\r\n {{ org.name }}\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\">{{'Description' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <textarea class=\"form-control\" formControlName=\"description\" rows=\"10\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['description'])|| isFormError(missionForm.controls['description'])} \"\r\n data-testid=\"form-mission-description\"></textarea>\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-mission-description-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['description']) \r\n || isFormError(missionForm.controls['description'])\">\r\n {{validatorsService.getError(missionForm.controls['description']) |\r\n translate}}\r\n </ngb-alert>\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\">{{'Role' | translate}}*</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"role\" data-testid=\"form-mission-role\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['role'])|| isFormError(missionForm.controls['role'])} \">\r\n <option *ngFor=\"let r of availableRoles\" [ngValue]=\"r\">\r\n {{ r }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-mission-role-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['role']) \r\n || isFormError(missionForm.controls['role'])\">\r\n {{validatorsService.getError(missionForm.controls['role']) |\r\n translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\"\r\n *ngIf=\"missionForm.get('role').value !== 'VISITOR_MUSEUM' && missionForm.get('role').value !== 'GUIDE_MUSEUM'\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Domains' | translate}}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"domains\">\r\n <select class=\"form-control\" multiple formControlName=\"domains\">\r\n <option *ngFor=\"let domain of domains\" [ngValue]=\"domain.id\">\r\n {{ domain.name }}\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\">{{'Access level' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"level\" data-testid=\"form-mission-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\">\r\n <select class=\"form-control\" required formControlName=\"space\" (change)=\"onSpaceClick()\"\r\n data-testid=\"form-mission-space\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['space'])|| isFormError(missionForm.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 <ngb-alert data-testid=\"form-mission-space-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['space']) \r\n || isFormError(missionForm.controls['space'])\">\r\n {{validatorsService.getError(missionForm.controls['space']) |\r\n translate}}\r\n </ngb-alert>\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>\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; else noSpace\">\r\n <select class=\"form-control\" formControlName=\"zone\" data-testid=\"form-mission-zone\">\r\n <option [ngValue]=\"defaultZone.id\">\r\n {{ 'All zones' | translate }}\r\n </option>\r\n <option *ngFor=\"let zone of zonesForSpace\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n </div>\r\n <ng-template #noSpace>\r\n <div class=\"col-sm-8 hint-container\">\r\n <p class=\"hint keywordsRules\">{{'You need to choose the location first' | translate}} </p>\r\n </div>\r\n </ng-template>\r\n </div>\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 <!-- Hashtags are available after Space is set -->\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}} </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 *ngFor=\"let hashtag of availableHashtags\"\r\n [class]=\"hashtagAdded(hashtag) ? 'keywordsItem added' : 'keywordsItem'\"\r\n (click)=\"onHashtagClick(hashtag)\" style=\"cursor: pointer;\"\r\n ngbTooltip=\"{{hashtagAdded(hashtag) ? ('Remove'|translate) : ('Add'|translate) }}\">\r\n {{hashtag.name}}\r\n </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 }}\r\n <a type=\"button\" class=\"closeButton\" (click)=\"removeHashtag(hashtag)\">\r\n <span class=\"crossItem\"></span>\r\n </a>\r\n </li>\r\n </div>\r\n </ul>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8 hint-container\" *ngIf=\"!spaceID.value\">\r\n <p class=\"hint 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\">{{'Mission 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 #d1=\"ngbDatepicker\" data-testid=\"form-mission-startDate\" (ngModelChange)=\"onVerifDate()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['startDate'])|| isFormError(missionForm.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 <ngb-alert data-testid=\"form-mission-startDate-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['startDate']) \r\n || isFormError(missionForm.controls['startDate'])\">\r\n {{validatorsService.getError(missionForm.controls['startDate']) |\r\n translate}}\r\n </ngb-alert>\r\n\r\n <ngb-alert data-testid=\"form-mission-startDate-invalid-verif\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"dateError\">\r\n {{'errorForm.date_start_end' |\r\n translate}}\r\n </ngb-alert>\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\">{{'Mission Start Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8 timeZoneContainer\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeStart\" [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onVerifDate()\"></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\">{{'Mission End Date' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" ngbDatepicker #d2=\"ngbDatepicker\"\r\n formControlName=\"endDate\" data-testid=\"form-mission-endDate\"\r\n [class.is-invalid]=\"validatorsService.isControlError(missionForm.controls['endDate'])\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['endDate'])|| isFormError(missionForm.controls['endDate'])} \"\r\n (ngModelChange)=\"onVerifDate()\">\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 <ngb-alert data-testid=\"form-mission-endDate-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['endDate']) \r\n || isFormError(missionForm.controls['endDate'])\">\r\n {{validatorsService.getError(missionForm.controls['endDate']) |\r\n translate}}\r\n </ngb-alert>\r\n\r\n <ngb-alert data-testid=\"form-mission-endDate-invalid-verif\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"dateError\">\r\n {{'errorForm.date_end_start' |\r\n translate}}\r\n </ngb-alert>\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\">{{'Mission End Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8 timeZoneContainer\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeEnd\" [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onVerifDate()\"></ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n <div class=\"btn-control-div action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n data-testid=\"form-mission-submit-btn\" [ngClass]=\"{'is-invalid' : errorForm }\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" data-testid=\"form-mission-cancel-btn\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' |\r\n translate}}</button>\r\n </div>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\r\n <ngb-alert data-testid=\"form-mission-invalid\" [dismissible]=\"false\" type=\"danger\">\r\n {{'errorForm.infoBtn' |translate}}\r\n </ngb-alert>\r\n </div>\r\n </form>\r\n</div>", styles: [".form-containter{padding:0rem 1rem;margin-bottom:2rem}.checkbox-apply{margin-top:calc(.375rem + 1px)}.keywordsDisplay{min-height:40px}.hint{margin:0!important}.hint-container{display:flex;align-items:center}.crossItem{margin:0;padding:0;border:0;background:none;position:relative;width:7px;height:20px}.crossItem:before,.crossItem:after{content:\"\";position:absolute;top:6.25px;left:0;right:0;height:1.5px;background:#fff;border-radius:1.5px}.crossItem:before{transform:rotate(45deg)}.crossItem:after{transform:rotate(-45deg)}.crossItem span{display:block}.btn-control-div .btn{width:8rem}.timeZoneContainer{align-items:center}.timeZoneContainer span{margin-left:5px}.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}\n"], components: [{ type: i3.NgbAlert, selector: "ngb-alert", inputs: ["animation", "dismissible", "type"], outputs: ["closed"], exportAs: ["ngbAlert"] }, { type: i3.NgbTimepicker, selector: "ngb-timepicker", inputs: ["meridian", "spinners", "seconds", "hourStep", "minuteStep", "secondStep", "readonlyInputs", "size"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.SelectMultipleControlValueAccessor, selector: "select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]", inputs: ["compareWith"] }, { type: i3.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i3.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: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "translate": i5.TranslatePipe } });
205
244
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: FormMissionComponent, decorators: [{
206
245
  type: Component,
207
- args: [{ selector: 'lib-form-mission', template: "<div class=\"form-containter\" *ngIf=\"missionForm\">\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'Mission details' | translate }}</h4>\r\n </div>\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"missionForm\">\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Organisation' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" data-testid=\"form-mission-organisation\" class=\"form-control\"\r\n formControlName=\"organisation\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\" *ngIf=\"isSP\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Ordered by' | translate }}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"orderedOrganisationID\">\r\n <option *ngFor=\"let org of allOrgs\" [ngValue]=\"org.id\">\r\n {{ org.name }}\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\">{{'Description' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <textarea class=\"form-control\" formControlName=\"description\" rows=\"10\"\r\n [class.is-invalid]=\"validatorsService.isControlError(missionForm.controls['description'])\"\r\n data-testid=\"form-mission-description\"></textarea>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-mission-description-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['description'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.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\">{{'Role' | translate}}*</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"role\" data-testid=\"form-mission-role\"\r\n [class.is-invalid]=\"validatorsService.isControlError(missionForm.controls['role'])\">\r\n <option *ngFor=\"let r of availableRoles\" [ngValue]=\"r\">\r\n {{ r }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-mission-role-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['role'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['role'])\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\"\r\n *ngIf=\"missionForm.get('role').value !== 'VISITOR_MUSEUM' && missionForm.get('role').value !== 'GUIDE_MUSEUM'\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Domains' | translate}}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"domains\">\r\n <select class=\"form-control\" multiple formControlName=\"domains\">\r\n <option *ngFor=\"let domain of domains\" [ngValue]=\"domain.id\">\r\n {{ domain.name }}\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\">{{'Access level' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"level\" data-testid=\"form-mission-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\">\r\n <select class=\"form-control\" required formControlName=\"space\" (change)=\"onSpaceClick()\"\r\n data-testid=\"form-mission-space\"\r\n [class.is-invalid]=\"validatorsService.isControlError(missionForm.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-mission-space-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['space'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.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>\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; else noSpace\">\r\n <select class=\"form-control\" formControlName=\"zone\" data-testid=\"form-mission-zone\">\r\n <option [ngValue]=\"defaultZone.id\">\r\n {{ 'All zones' | translate }}\r\n </option>\r\n <option *ngFor=\"let zone of zonesForSpace\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n </div>\r\n <ng-template #noSpace>\r\n <div class=\"col-sm-8 hint-container\">\r\n <p class=\"hint keywordsRules\">{{'You need to choose the location first' | translate}} </p>\r\n </div>\r\n </ng-template>\r\n </div>\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 <!-- Hashtags are available after Space is set -->\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}} </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 *ngFor=\"let hashtag of availableHashtags\"\r\n [class]=\"hashtagAdded(hashtag) ? 'keywordsItem added' : 'keywordsItem'\"\r\n (click)=\"onHashtagClick(hashtag)\" style=\"cursor: pointer;\"\r\n ngbTooltip=\"{{hashtagAdded(hashtag) ? ('Remove'|translate) : ('Add'|translate) }}\">\r\n {{hashtag.name}}\r\n </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 }}\r\n <a type=\"button\" class=\"closeButton\" (click)=\"removeHashtag(hashtag)\">\r\n <span class=\"crossItem\"></span>\r\n </a>\r\n </li>\r\n </div>\r\n </ul>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8 hint-container\" *ngIf=\"!spaceID.value\">\r\n <p class=\"hint 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\">{{'Mission 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 #d1=\"ngbDatepicker\" data-testid=\"form-mission-startDate\"\r\n [class.is-invalid]=\"validatorsService.isControlError(missionForm.controls['startDate'])|| dateError\">\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-mission-startDate-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['startDate'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['startDate'])\"></span>\r\n\r\n <span data-testid=\"form-template-startDate-invalid-verif\" translate=\"errorForm.date_start_end\"\r\n *ngIf=\"dateError\"></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\">{{'Mission Start Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8 timeZoneContainer\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeStart\" [ngModelOptions]=\"{standalone: true}\"></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\">{{'Mission End Date' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" ngbDatepicker #d2=\"ngbDatepicker\"\r\n formControlName=\"endDate\" data-testid=\"form-mission-endDate\"\r\n [class.is-invalid]=\"validatorsService.isControlError(missionForm.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-mission-endDate-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['endDate'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['endDate'])\"></span>\r\n \r\n <span data-testid=\"form-template-endDate-invalid-verif\"\r\n translate=\"errorForm.date_end_start\"\r\n *ngIf=\"dateError\"></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\">{{'Mission End Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8 timeZoneContainer\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeEnd\" [ngModelOptions]=\"{standalone: true}\"></ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n <div class=\"btn-control-div action-button-container\">\r\n <button type=\"submit\" [disabled]=\"missionForm.invalid\"\r\n class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n data-testid=\"form-mission-submit-btn\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" data-testid=\"form-mission-cancel-btn\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' |\r\n translate}}</button>\r\n </div>\r\n </form>\r\n</div>", styles: [".form-containter{padding:0rem 1rem;margin-bottom:2rem}.checkbox-apply{margin-top:calc(.375rem + 1px)}.keywordsDisplay{min-height:40px}.hint{margin:0!important}.hint-container{display:flex;align-items:center}.crossItem{margin:0;padding:0;border:0;background:none;position:relative;width:7px;height:20px}.crossItem:before,.crossItem:after{content:\"\";position:absolute;top:6.25px;left:0;right:0;height:1.5px;background:#fff;border-radius:1.5px}.crossItem:before{transform:rotate(45deg)}.crossItem:after{transform:rotate(-45deg)}.crossItem span{display:block}.btn-control-div .btn{width:8rem}.timeZoneContainer{align-items:center}.timeZoneContainer span{margin-left:5px}.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}\n"] }]
246
+ args: [{ selector: 'lib-form-mission', template: "<div class=\"form-containter\" *ngIf=\"missionForm\">\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'Mission details' | translate }}</h4>\r\n </div>\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"missionForm\">\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Organisation' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" data-testid=\"form-mission-organisation\" class=\"form-control\"\r\n formControlName=\"organisation\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\" *ngIf=\"isSP\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Ordered by' | translate }}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"orderedOrganisationID\">\r\n <option *ngFor=\"let org of allOrgs\" [ngValue]=\"org.id\">\r\n {{ org.name }}\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\">{{'Description' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <textarea class=\"form-control\" formControlName=\"description\" rows=\"10\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['description'])|| isFormError(missionForm.controls['description'])} \"\r\n data-testid=\"form-mission-description\"></textarea>\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-mission-description-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['description']) \r\n || isFormError(missionForm.controls['description'])\">\r\n {{validatorsService.getError(missionForm.controls['description']) |\r\n translate}}\r\n </ngb-alert>\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\">{{'Role' | translate}}*</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"role\" data-testid=\"form-mission-role\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['role'])|| isFormError(missionForm.controls['role'])} \">\r\n <option *ngFor=\"let r of availableRoles\" [ngValue]=\"r\">\r\n {{ r }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-mission-role-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['role']) \r\n || isFormError(missionForm.controls['role'])\">\r\n {{validatorsService.getError(missionForm.controls['role']) |\r\n translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\"\r\n *ngIf=\"missionForm.get('role').value !== 'VISITOR_MUSEUM' && missionForm.get('role').value !== 'GUIDE_MUSEUM'\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Domains' | translate}}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"domains\">\r\n <select class=\"form-control\" multiple formControlName=\"domains\">\r\n <option *ngFor=\"let domain of domains\" [ngValue]=\"domain.id\">\r\n {{ domain.name }}\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\">{{'Access level' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"level\" data-testid=\"form-mission-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\">\r\n <select class=\"form-control\" required formControlName=\"space\" (change)=\"onSpaceClick()\"\r\n data-testid=\"form-mission-space\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['space'])|| isFormError(missionForm.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 <ngb-alert data-testid=\"form-mission-space-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['space']) \r\n || isFormError(missionForm.controls['space'])\">\r\n {{validatorsService.getError(missionForm.controls['space']) |\r\n translate}}\r\n </ngb-alert>\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>\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; else noSpace\">\r\n <select class=\"form-control\" formControlName=\"zone\" data-testid=\"form-mission-zone\">\r\n <option [ngValue]=\"defaultZone.id\">\r\n {{ 'All zones' | translate }}\r\n </option>\r\n <option *ngFor=\"let zone of zonesForSpace\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n </div>\r\n <ng-template #noSpace>\r\n <div class=\"col-sm-8 hint-container\">\r\n <p class=\"hint keywordsRules\">{{'You need to choose the location first' | translate}} </p>\r\n </div>\r\n </ng-template>\r\n </div>\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 <!-- Hashtags are available after Space is set -->\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}} </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 *ngFor=\"let hashtag of availableHashtags\"\r\n [class]=\"hashtagAdded(hashtag) ? 'keywordsItem added' : 'keywordsItem'\"\r\n (click)=\"onHashtagClick(hashtag)\" style=\"cursor: pointer;\"\r\n ngbTooltip=\"{{hashtagAdded(hashtag) ? ('Remove'|translate) : ('Add'|translate) }}\">\r\n {{hashtag.name}}\r\n </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 }}\r\n <a type=\"button\" class=\"closeButton\" (click)=\"removeHashtag(hashtag)\">\r\n <span class=\"crossItem\"></span>\r\n </a>\r\n </li>\r\n </div>\r\n </ul>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8 hint-container\" *ngIf=\"!spaceID.value\">\r\n <p class=\"hint 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\">{{'Mission 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 #d1=\"ngbDatepicker\" data-testid=\"form-mission-startDate\" (ngModelChange)=\"onVerifDate()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['startDate'])|| isFormError(missionForm.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 <ngb-alert data-testid=\"form-mission-startDate-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['startDate']) \r\n || isFormError(missionForm.controls['startDate'])\">\r\n {{validatorsService.getError(missionForm.controls['startDate']) |\r\n translate}}\r\n </ngb-alert>\r\n\r\n <ngb-alert data-testid=\"form-mission-startDate-invalid-verif\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"dateError\">\r\n {{'errorForm.date_start_end' |\r\n translate}}\r\n </ngb-alert>\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\">{{'Mission Start Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8 timeZoneContainer\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeStart\" [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onVerifDate()\"></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\">{{'Mission End Date' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" ngbDatepicker #d2=\"ngbDatepicker\"\r\n formControlName=\"endDate\" data-testid=\"form-mission-endDate\"\r\n [class.is-invalid]=\"validatorsService.isControlError(missionForm.controls['endDate'])\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['endDate'])|| isFormError(missionForm.controls['endDate'])} \"\r\n (ngModelChange)=\"onVerifDate()\">\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 <ngb-alert data-testid=\"form-mission-endDate-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['endDate']) \r\n || isFormError(missionForm.controls['endDate'])\">\r\n {{validatorsService.getError(missionForm.controls['endDate']) |\r\n translate}}\r\n </ngb-alert>\r\n\r\n <ngb-alert data-testid=\"form-mission-endDate-invalid-verif\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"dateError\">\r\n {{'errorForm.date_end_start' |\r\n translate}}\r\n </ngb-alert>\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\">{{'Mission End Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8 timeZoneContainer\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeEnd\" [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onVerifDate()\"></ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n <div class=\"btn-control-div action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n data-testid=\"form-mission-submit-btn\" [ngClass]=\"{'is-invalid' : errorForm }\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" data-testid=\"form-mission-cancel-btn\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' |\r\n translate}}</button>\r\n </div>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\r\n <ngb-alert data-testid=\"form-mission-invalid\" [dismissible]=\"false\" type=\"danger\">\r\n {{'errorForm.infoBtn' |translate}}\r\n </ngb-alert>\r\n </div>\r\n </form>\r\n</div>", styles: [".form-containter{padding:0rem 1rem;margin-bottom:2rem}.checkbox-apply{margin-top:calc(.375rem + 1px)}.keywordsDisplay{min-height:40px}.hint{margin:0!important}.hint-container{display:flex;align-items:center}.crossItem{margin:0;padding:0;border:0;background:none;position:relative;width:7px;height:20px}.crossItem:before,.crossItem:after{content:\"\";position:absolute;top:6.25px;left:0;right:0;height:1.5px;background:#fff;border-radius:1.5px}.crossItem:before{transform:rotate(45deg)}.crossItem:after{transform:rotate(-45deg)}.crossItem span{display:block}.btn-control-div .btn{width:8rem}.timeZoneContainer{align-items:center}.timeZoneContainer span{margin-left:5px}.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}\n"] }]
208
247
  }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.SpaceService }, { type: i2.BaseUserService }, { type: i2.DomainService }, { type: i2.OrganisationService }, { type: i2.ZoneService }, { type: i2.HashtagService }, { type: i2.LocaleService }, { type: i2.ValidatorsService }]; }, propDecorators: { missionToEdit: [{
209
248
  type: Input
210
249
  }], organisationForMission: [{
@@ -218,4 +257,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImpor
218
257
  }], addedMissionInput: [{
219
258
  type: Output
220
259
  }] } });
221
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1taXNzaW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1hZG1pbi9zcmMvbGliL3VzZXIvZm9ybS1taXNzaW9uL2Zvcm0tbWlzc2lvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL2Zvcm0tbWlzc2lvbi9mb3JtLW1pc3Npb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvRSxPQUFPLEVBRUgsV0FBVyxFQUFVLE1BQU0sRUFDTyxXQUFXLEVBQUUsV0FBVyxFQUNKLGtCQUFrQixFQUMzRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBcUIsYUFBYSxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDOzs7Ozs7O0FBUXZILE1BQU0sT0FBTyxvQkFBb0I7SUE4QzdCLFlBQ1ksRUFBZSxFQUNmLFlBQTBCLEVBQzFCLFdBQTRCLEVBQzVCLGFBQTRCLEVBQzVCLG1CQUF3QyxFQUN4QyxXQUF3QixFQUN4QixjQUE4QixFQUM5QixhQUE0QixFQUM3QixpQkFBb0M7UUFSbkMsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hD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dGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUJ1aWxkZXIsIEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHtcclxuICAgIFpvbmUsIE1pc3Npb24sIE9yZ2FuaXNhdGlvbiwgU3BhY2UsIFJvbGVTdGF0dXMsXHJcbiAgICBMZXZlbFN0YXR1cywgRG9tYWluLCBMb2NhbGUsIEJhc2VVc2VyU2VydmljZSwgRG9tYWluU2VydmljZSxcclxuICAgIE9yZ2FuaXNhdGlvblNlcnZpY2UsIFpvbmVTZXJ2aWNlLCBlbnVtVG9BcnJheSwgRW1haWxTdGF0dXMsXHJcbiAgICBIYXNodGFnLCBTcGFjZVNlcnZpY2UsIExvY2FsZVNlcnZpY2UsIEhhc2h0YWdTZXJ2aWNlLCBzdHJpbmdMb2NhbGVUb0VudW1cclxufSBmcm9tICdAc21hcnRlcnBsYW4vbmd4LXNtYXJ0ZXJwbGFuLWNvcmUnO1xyXG5pbXBvcnQgeyBEYXRlVGltZSB9IGZyb20gXCJsdXhvblwiO1xyXG5pbXBvcnQgeyBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBWYWxpZGF0b3JzU2VydmljZSwgdGV4dFZhbGlkYXRvciwgbm9FbXB0eVZhbGlkYXRvciwgZmxvYXRWYWxpZGF0b3IgfSBmcm9tIFwiQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlXCI7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2xpYi1mb3JtLW1pc3Npb24nLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0tbWlzc2lvbi5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9mb3JtLW1pc3Npb24uY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRm9ybU1pc3Npb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICAgIEBJbnB1dCgpIG1pc3Npb25Ub0VkaXQ6IE1pc3Npb247XHJcblxyXG4gICAgQElucHV0KCkgb3JnYW5pc2F0aW9uRm9yTWlzc2lvbjogT3JnYW5pc2F0aW9uO1xyXG5cclxuICAgIEBJbnB1dCgpIGlzU1A6IGJvb2xlYW47XHJcblxyXG4gICAgQElucHV0KCkgdXNlckZvck1pc3Npb25JRDogc3RyaW5nO1xyXG5cclxuICAgIEBJbnB1dCgpIGN1cnJlbnRVc2VyT3JnYW5pc2F0aW9uOiBPcmdhbmlzYXRpb247XHJcblxyXG4gICAgbWlzc2lvbkZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgICBhdmFpbGFibGVTcGFjZXM6IFNwYWNlW107XHJcblxyXG4gICAgQE91dHB1dCgpIGFkZGVkTWlzc2lvbklucHV0ID0gbmV3IEV2ZW50RW1pdHRlcjxNaXNzaW9uPigpO1xyXG5cclxuICAgIGF2YWlsYWJsZVJvbGVzOiBSb2xlU3RhdHVzW107XHJcblxyXG4gICAgYXZhaWxhYmxlTGV2ZWxzOiBMZXZlbFN0YXR1c1tdO1xyXG5cclxuICAgIGF2YWlsYWJsZUhhc2h0YWdzOiBIYXNodGFnW10gPSBbXTtcclxuXHJcbiAgICBkb21haW5zOiBEb21haW5bXTtcclxuXHJcbiAgICBhbGxPcmdzOiBPcmdhbmlzYXRpb25bXTtcclxuXHJcbiAgICBpc0d1aWRlID0gZmFsc2U7XHJcblxyXG4gICAgem9uZXNGb3JTcGFjZTogWm9uZVtdO1xyXG5cclxuICAgIGRlZmF1bHRab25lOiBab25lO1xyXG5cclxuICAgIG1pc3Npb25UaW1lU3RhcnQ6IG51bWJlciA9IDEyICogNjAgKiA2MDAwMDsgLy8gbWlkZGF5IGluIG1pbGxpc2Vjb25kc1xyXG5cclxuICAgIG1pc3Npb25UaW1lRW5kOiBudW1iZXIgPSAxMiAqIDYwICogNjAwMDA7XHJcblxyXG4gICAgYWRkZWRIYXNodGFnczogSGFzaHRhZ1tdID0gW107XHJcblxyXG4gICAgY3VycmVudExvY2FsZTogTG9jYWxlO1xyXG5cclxuICAgIGxvY2FsZXM6IHN0cmluZ1tdO1xyXG5cclxuICAgIGRhdGVFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgICAgIHByaXZhdGUgc3BhY2VTZXJ2aWNlOiBTcGFjZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB1c2VyU2VydmljZTogQmFzZVVzZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgZG9tYWluU2VydmljZTogRG9tYWluU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG9yZ2FuaXNhdGlvblNlcnZpY2U6IE9yZ2FuaXNhdGlvblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB6b25lU2VydmljZTogWm9uZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBoYXNodGFnU2VydmljZTogSGFzaHRhZ1NlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBsb2NhbGVTZXJ2aWNlOiBMb2NhbGVTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyB2YWxpZGF0b3JzU2VydmljZTogVmFsaWRhdG9yc1NlcnZpY2VcclxuICAgICkgeyB9XHJcblxyXG4gICAgYXN5bmMgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVVc2VySW5mbygpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0RG9tYWlucygpO1xyXG4gICAgICAgIGlmICh0aGlzLmlzU1ApIHtcclxuICAgICAgICAgICAgdGhpcy5hbGxPcmdzID0gYXdhaXQgdGhpcy5vcmdhbmlzYXRpb25TZXJ2aWNlLmxpc3RPcmdhbmlzYXRpb25zKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3VycmVudExvY2FsZSA9IHN0cmluZ0xvY2FsZVRvRW51bSh0aGlzLmxvY2FsZVNlcnZpY2UuZ2V0TG9jYWxlKCkpOyAvLyB0byBtYXRjaCBlbnVtIExvY2FsZVxyXG4gICAgICAgIHRoaXMubG9jYWxlcyA9IGVudW1Ub0FycmF5KExvY2FsZSk7XHJcbiAgICAgICAgaWYgKHRoaXMubWlzc2lvblRvRWRpdCkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRGb3JtRm9yRWRpdCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdEVtcHR5Rm9ybSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVVc2VySW5mbygpIHtcclxuICAgICAgICB0aGlzLmF2YWlsYWJsZVJvbGVzID1cclxuICAgICAgICAgICAgdGhpcy51c2VyU2VydmljZS5nZXRBdmFpbGFibGVSb2xlc0ZvckN1cnJlbnRVc2VyKCk7XHJcbiAgICAgICAgdGhpcy5hdmFpbGFibGVMZXZlbHMgPVxyXG4gICAgICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlLmdldEF2YWxhYmxlTGV2ZWxzRm9yQ3VycmVudFVzZXIoKTtcclxuICAgICAgICB0aGlzLmlzR3VpZGUgPSB0aGlzLnVzZXJTZXJ2aWNlLmlzR3VpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZXREb21haW5zKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0d1aWRlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRvbWFpbnMgPVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kb21haW5TZXJ2aWNlLmdldERvbWFpbnNGb3JNaXNzaW9uc0Zvck9yZyhcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRVc2VyT3JnYW5pc2F0aW9uLmlkLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5kb21haW5zID0gZG9tYWlucztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2V0SGFzaHRhZ3Moc3BhY2VJRDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5hdmFpbGFibGVIYXNodGFncyA9IGF3YWl0IHRoaXMuaGFzaHRhZ1NlcnZpY2UuZ2V0SGFzaHRhZ3NGb3JTcGFjZShcclxuICAgICAgICAgICAgc3BhY2VJRCxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzcGFjZUlEKCk6IEFic3RyYWN0Q29udHJvbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubWlzc2lvbkZvcm0uZ2V0KFwic3BhY2VcIik7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJvbGUoKTogQWJzdHJhY3RDb250cm9sIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5taXNzaW9uRm9ybS5nZXQoXCJyb2xlXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXRGb3JtRm9yRWRpdCgpIHtcclxuICAgICAgICBsZXQgc3RhcnREYXRlOiBhbnkgPSBudWxsO1xyXG4gICAgICAgIGxldCBlbmREYXRlOiBhbnkgPSBudWxsO1xyXG5cclxuICAgICAgICBjb25zdCBtID0gdGhpcy5taXNzaW9uVG9FZGl0O1xyXG5cclxuICAgICAgICBpZiAobS5zdGFydERhdGVUaW1lKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBEYXRlVGltZS5mcm9tSVNPKG0uc3RhcnREYXRlVGltZSk7XHJcbiAgICAgICAgICAgIHRoaXMubWlzc2lvblRpbWVTdGFydCA9IChkYXRlLmhvdXIgKiA2MCArIGRhdGUubWludXRlKSAqIDYwICogMTAwMDtcclxuICAgICAgICAgICAgc3RhcnREYXRlID0gZGF0ZS50b01pbGxpcygpIC0gdGhpcy5taXNzaW9uVGltZVN0YXJ0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobS5lbmREYXRlVGltZSkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlID0gRGF0ZVRpbWUuZnJvbUlTTyhtLmVuZERhdGVUaW1lKTtcclxuICAgICAgICAgICAgdGhpcy5taXNzaW9uVGltZUVuZCA9IChkYXRlLmhvdXIgKiA2MCArIGRhdGUubWludXRlKSAqIDYwICogMTAwMDtcclxuICAgICAgICAgICAgZW5kRGF0ZSA9IGRhdGUudG9NaWxsaXMoKSAtIHRoaXMubWlzc2lvblRpbWVFbmQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnVzZXJGb3JNaXNzaW9uSUQgPSBtLnVzZXJJRDtcclxuICAgICAgICB0aGlzLmF2YWlsYWJsZVNwYWNlcyA9IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmdldEFsbG93ZWRTcGFjZXNGb3JPcmcoXHJcbiAgICAgICAgICAgIHRoaXMubWlzc2lvblRvRWRpdC5vcmdhbmlzYXRpb25JRCxcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50VXNlck9yZ2FuaXNhdGlvbi5pZCxcclxuICAgICAgICApO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0SGFzaHRhZ3MobS5zcGFjZUlEKTtcclxuICAgICAgICB0aGlzLm1pc3Npb25Gb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgIGlkOiBtLmlkLFxyXG4gICAgICAgICAgICBvcmdhbmlzYXRpb246IFt7IHZhbHVlOiBtLm9yZ2FuaXNhdGlvbi5uYW1lLCBkaXNhYmxlZDogdHJ1ZSB9XSxcclxuICAgICAgICAgICAgb3JnYW5pc2F0aW9uSUQ6IG0ub3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgICAgICAgIG9yZGVyZWRPcmdhbmlzYXRpb25JRDogbS5vcmRlcmVkT3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgICAgICAgIHJvbGU6IFttLnJvbGUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgICBsZXZlbDogW20ubGV2ZWxdLFxyXG4gICAgICAgICAgICBzcGFjZTogW20uc3BhY2VJRCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBbbS5kZXNjcmlwdGlvbiwgW3RleHRWYWxpZGF0b3IoKSwgbm9FbXB0eVZhbGlkYXRvcigpXV0sXHJcbiAgICAgICAgICAgIGRvbWFpbnM6IFttLmRvbWFpbnNdLFxyXG4gICAgICAgICAgICB6b25lOiBbbS56b25lSURdLFxyXG4gICAgICAgICAgICBsb2NhbGU6IFttLmxvY2FsZV0sXHJcbiAgICAgICAgICAgIHN0YXJ0RGF0ZTogW3N0YXJ0RGF0ZSwgW2Zsb2F0VmFsaWRhdG9yKCldXSxcclxuICAgICAgICAgICAgZW5kRGF0ZTogW2VuZERhdGUsIFtmbG9hdFZhbGlkYXRvcigpXV0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKG0uaGFzaHRhZ3MgJiYgbS5oYXNodGFncy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkZWRIYXNodGFncyA9IHRoaXMuYXZhaWxhYmxlSGFzaHRhZ3MuZmlsdGVyKChoYXNodGFnKSA9PlxyXG4gICAgICAgICAgICAgICAgbS5oYXNodGFncy5pbmNsdWRlcyhoYXNodGFnLmlkKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vblNwYWNlQ2xpY2soKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvblNwYWNlQ2xpY2soKSB7XHJcbiAgICAgICAgY29uc3Qgem9uZXMgPSBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLmdldFpvbmVzQnlTcGFjZShcclxuICAgICAgICAgICAgdGhpcy5zcGFjZUlELnZhbHVlLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5kZWZhdWx0Wm9uZSA9IHpvbmVzLmZpbmQoKHpvbmUpID0+ICF6b25lLnBhcmVudElEKTtcclxuICAgICAgICBjb25zdCBpbmRleE9mRGVmYXVsdFpvbmUgPSB6b25lcy5pbmRleE9mKHRoaXMuZGVmYXVsdFpvbmUpO1xyXG4gICAgICAgIHpvbmVzLnNwbGljZShpbmRleE9mRGVmYXVsdFpvbmUsIDEpO1xyXG4gICAgICAgIHRoaXMuem9uZXNGb3JTcGFjZSA9IHpvbmVzO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0SGFzaHRhZ3ModGhpcy5zcGFjZUlELnZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0RW1wdHlGb3JtKCkge1xyXG4gICAgICAgIHRoaXMuYXZhaWxhYmxlU3BhY2VzID0gYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UuZ2V0QWxsb3dlZFNwYWNlc0Zvck9yZyhcclxuICAgICAgICAgICAgdGhpcy5vcmdhbmlzYXRpb25Gb3JNaXNzaW9uLmlkLFxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRVc2VyT3JnYW5pc2F0aW9uLmlkLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5taXNzaW9uRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgICAgICByb2xlOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgICBsZXZlbDogW0xldmVsU3RhdHVzLk1JTklNVU1dLFxyXG4gICAgICAgICAgICBvcmdhbmlzYXRpb246IFtcclxuICAgICAgICAgICAgICAgIHsgdmFsdWU6IHRoaXMub3JnYW5pc2F0aW9uRm9yTWlzc2lvbi5uYW1lLCBkaXNhYmxlZDogdHJ1ZSB9LFxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICBvcmdhbmlzYXRpb25JRDogdGhpcy5vcmdhbmlzYXRpb25Gb3JNaXNzaW9uLmlkLFxyXG4gICAgICAgICAgICBvcmRlcmVkT3JnYW5pc2F0aW9uSUQ6IHRoaXMuY3VycmVudFVzZXJPcmdhbmlzYXRpb24uaWQsXHJcbiAgICAgICAgICAgIHNwYWNlOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgICB6b25lOiBbJyddLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogW1wiXCIsIFt0ZXh0VmFsaWRhdG9yKCksIG5vRW1wdHlWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgICAgICBkb21haW5zOiBbbnVsbF0sXHJcbiAgICAgICAgICAgIGxvY2FsZTogW3RoaXMuY3VycmVudExvY2FsZV0sXHJcbiAgICAgICAgICAgIHN0YXJ0RGF0ZTogW251bGwsIFtmbG9hdFZhbGlkYXRvcigpXV0sXHJcbiAgICAgICAgICAgIGVuZERhdGU6IFtudWxsLCBbZmxvYXRWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uSGFzaHRhZ0NsaWNrKGhhc2h0YWc6IEhhc2h0YWcpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGFzaHRhZ0FkZGVkKGhhc2h0YWcpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkZWRIYXNodGFncy5wdXNoKGhhc2h0YWcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkZWRIYXNodGFncy5zcGxpY2UodGhpcy5hZGRlZEhhc2h0YWdzLmluZGV4T2YoaGFzaHRhZyksIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBoYXNodGFnQWRkZWQoaGFzaHRhZzogSGFzaHRhZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIHRoaXMuYWRkZWRIYXNodGFncy5maW5kKFxyXG4gICAgICAgICAgICAgICAgKF9oYXNodGFnKSA9PiBfaGFzaHRhZy5pZCA9PT0gaGFzaHRhZy5pZCxcclxuICAgICAgICAgICAgKSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVIYXNodGFnKGhhc2h0YWc6IEhhc2h0YWcpIHtcclxuICAgICAgICB0aGlzLmFkZGVkSGFzaHRhZ3Muc3BsaWNlKHRoaXMuYWRkZWRIYXNodGFncy5pbmRleE9mKGhhc2h0YWcpLCAxKTtcclxuICAgIH1cclxuXHJcbiAgICBvblN1Ym1pdCgpIHtcclxuICAgICAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLm1pc3Npb25Gb3JtLnZhbHVlO1xyXG4gICAgICAgIGlmICghdGhpcy5taXNzaW9uRm9ybS52YWxpZCkge1xyXG4gICAgICAgICAgICAvLyB0aGlzIHNob3dzIGVycm9ycyBpbiB0aGUgZm9ybVxyXG4gICAgICAgICAgICB0aGlzLm1pc3Npb25Gb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgc3RhcnREYXRlU3RyaW5nOiBzdHJpbmc7XHJcbiAgICAgICAgbGV0IGVuZERhdGVTdHJpbmc6IHN0cmluZztcclxuICAgICAgICBpZiAoZm9ybVZhbHVlLnN0YXJ0RGF0ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlSG91clN0YXJ0TnVtYmVyID0gZm9ybVZhbHVlLnN0YXJ0RGF0ZSArIHRoaXMubWlzc2lvblRpbWVTdGFydDtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnREYXRlID0gRGF0ZVRpbWUuZnJvbU1pbGxpcyhkYXRlSG91clN0YXJ0TnVtYmVyKTtcclxuICAgICAgICAgICAgc3RhcnREYXRlU3RyaW5nID0gc3RhcnREYXRlLnRvSVNPKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmb3JtVmFsdWUuZW5kRGF0ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlSG91ckVuZE51bWJlciA9IGZvcm1WYWx1ZS5lbmREYXRlICsgdGhpcy5taXNzaW9uVGltZUVuZDtcclxuICAgICAgICAgICAgY29uc3QgZW5kRGF0ZSA9IERhdGVUaW1lLmZyb21NaWxsaXMoZGF0ZUhvdXJFbmROdW1iZXIpO1xyXG4gICAgICAgICAgICBlbmREYXRlU3RyaW5nID0gZW5kRGF0ZS50b0lTTygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVuZERhdGVTdHJpbmcgJiYgc3RhcnREYXRlU3RyaW5nICYmIChlbmREYXRlU3RyaW5nIDwgc3RhcnREYXRlU3RyaW5nKSkge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGVFcnJvciA9IHRydWU7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGVFcnJvciA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbWlzc2lvbklucHV0OiBNaXNzaW9uID0ge1xyXG4gICAgICAgICAgICBvcmdhbmlzYXRpb25JRDogZm9ybVZhbHVlLm9yZ2FuaXNhdGlvbklELFxyXG4gICAgICAgICAgICBvcmRlcmVkT3JnYW5pc2F0aW9uSUQ6IGZvcm1WYWx1ZS5vcmRlcmVkT3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgICAgICAgIGxldmVsOiBmb3JtVmFsdWUubGV2ZWwsXHJcbiAgICAgICAgICAgIHJvbGU6IGZvcm1WYWx1ZS5yb2xlLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogZm9ybVZhbHVlLmRlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgICBzdGFydERhdGVUaW1lOiBzdGFydERhdGVTdHJpbmcsXHJcbiAgICAgICAgICAgIGVuZERhdGVUaW1lOiBlbmREYXRlU3RyaW5nLFxyXG4gICAgICAgICAgICBkb21haW5zOiBmb3JtVmFsdWUuZG9tYWlucyxcclxuICAgICAgICAgICAgdXNlcklEOiB0aGlzLnVzZXJGb3JNaXNzaW9uSUQsXHJcbiAgICAgICAgICAgIGVtYWlsU3RhdHVzOiB0aGlzLm1pc3Npb25Ub0VkaXRcclxuICAgICAgICAgICAgICAgID8gdGhpcy5taXNzaW9uVG9FZGl0LmVtYWlsU3RhdHVzXHJcbiAgICAgICAgICAgICAgICA6IEVtYWlsU3RhdHVzLkNSRUFUSU9OX1RPX0RFTElWRVIsXHJcbiAgICAgICAgICAgIGxvY2FsZTogZm9ybVZhbHVlLmxvY2FsZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIG1pc3Npb25JbnB1dC5oYXNodGFncyA9IHRoaXMuYWRkZWRIYXNodGFncy5tYXAoKGgpID0+IGguaWQpO1xyXG4gICAgICAgIGlmIChmb3JtVmFsdWUuc3BhY2UpIHtcclxuICAgICAgICAgICAgbWlzc2lvbklucHV0LnNwYWNlSUQgPSBmb3JtVmFsdWUuc3BhY2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmb3JtVmFsdWUuem9uZSkge1xyXG4gICAgICAgICAgICBtaXNzaW9uSW5wdXQuem9uZUlEID0gZm9ybVZhbHVlLnpvbmU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm1pc3Npb25Ub0VkaXQpIHtcclxuICAgICAgICAgICAgbWlzc2lvbklucHV0LmlkID0gdGhpcy5taXNzaW9uVG9FZGl0LmlkO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFkZGVkTWlzc2lvbklucHV0LmVtaXQobWlzc2lvbklucHV0KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNhbmNlbCgpIHtcclxuICAgICAgICB0aGlzLmFkZGVkTWlzc2lvbklucHV0LmVtaXQobnVsbCk7XHJcbiAgICB9XHJcblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW50ZXJcIiAqbmdJZj1cIm1pc3Npb25Gb3JtXCI+XHJcbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTtcIj5cclxuICAgICAgICA8aDQ+e3sgJ01pc3Npb24gZGV0YWlscycgfCB0cmFuc2xhdGUgfX08L2g0PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8Zm9ybSAobmdTdWJtaXQpPVwib25TdWJtaXQoKVwiIFtmb3JtR3JvdXBdPVwibWlzc2lvbkZvcm1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydPcmdhbmlzYXRpb24nIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLW9yZ2FuaXNhdGlvblwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJvcmdhbmlzYXRpb25cIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiICpuZ0lmPVwiaXNTUFwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7ICdPcmRlcmVkIGJ5JyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJlcXVpcmVkIGZvcm1Db250cm9sTmFtZT1cIm9yZGVyZWRPcmdhbmlzYXRpb25JRFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9yZyBvZiBhbGxPcmdzXCIgW25nVmFsdWVdPVwib3JnLmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9yZy5uYW1lIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0Rlc2NyaXB0aW9uJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiIHJvd3M9XCIxMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwidmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ2Rlc2NyaXB0aW9uJ10pXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1kZXNjcmlwdGlvblwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLWRlc2NyaXB0aW9uLWludmFsaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdHJhbnNsYXRlXT1cInZhbGlkYXRvcnNTZXJ2aWNlLmdldEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydkZXNjcmlwdGlvbiddKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydkZXNjcmlwdGlvbiddKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snUm9sZScgfCB0cmFuc2xhdGV9fSo8L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByZXF1aXJlZCBmb3JtQ29udHJvbE5hbWU9XCJyb2xlXCIgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tcm9sZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwidmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ3JvbGUnXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCByIG9mIGF2YWlsYWJsZVJvbGVzXCIgW25nVmFsdWVdPVwiclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyByIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tcm9sZS1pbnZhbGlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RyYW5zbGF0ZV09XCJ2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1sncm9sZSddKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydyb2xlJ10pXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIlxyXG4gICAgICAgICAgICAqbmdJZj1cIm1pc3Npb25Gb3JtLmdldCgncm9sZScpLnZhbHVlICE9PSAnVklTSVRPUl9NVVNFVU0nICYmIG1pc3Npb25Gb3JtLmdldCgncm9sZScpLnZhbHVlICE9PSAnR1VJREVfTVVTRVVNJ1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0RvbWFpbnMnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cImRvbWFpbnNcIj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBtdWx0aXBsZSBmb3JtQ29udHJvbE5hbWU9XCJkb21haW5zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgZG9tYWluIG9mIGRvbWFpbnNcIiBbbmdWYWx1ZV09XCJkb21haW4uaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZG9tYWluLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snQWNjZXNzIGxldmVsJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVxdWlyZWQgZm9ybUNvbnRyb2xOYW1lPVwibGV2ZWxcIiBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1sZXZlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGxldmVsIG9mIGF2YWlsYWJsZUxldmVsc1wiIFtuZ1ZhbHVlXT1cImxldmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxldmVsIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7ICdBdXRob3JpemVkIGxvY2F0aW9uJyB8IHRyYW5zbGF0ZSB9fSo8L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cImF2YWlsYWJsZVNwYWNlc1wiPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJlcXVpcmVkIGZvcm1Db250cm9sTmFtZT1cInNwYWNlXCIgKGNoYW5nZSk9XCJvblNwYWNlQ2xpY2soKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tc3BhY2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cInZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydzcGFjZSddKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHNwYWNlIG9mIGF2YWlsYWJsZVNwYWNlc1wiIFtuZ1ZhbHVlXT1cInNwYWNlLmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNwYWNlLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1zcGFjZS1pbnZhbGlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RyYW5zbGF0ZV09XCJ2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snc3BhY2UnXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snc3BhY2UnXSlcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiICpuZ0lmPVwiIWF2YWlsYWJsZVNwYWNlc1wiPlxyXG4gICAgICAgICAgICAgICAge3sgJ05vIGxvY2F0aW9ucyBhdmFpbGFibGUnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7ICdBdXRob3JpemVkIHpvbmUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCIgKm5nSWY9XCJ6b25lc0ZvclNwYWNlOyBlbHNlIG5vU3BhY2VcIj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJ6b25lXCIgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tem9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwiZGVmYXVsdFpvbmUuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0FsbCB6b25lcycgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB6b25lIG9mIHpvbmVzRm9yU3BhY2VcIiBbbmdWYWx1ZV09XCJ6b25lLmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHpvbmUubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vU3BhY2U+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTggaGludC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImhpbnQga2V5d29yZHNSdWxlc1wiPnt7J1lvdSBuZWVkIHRvIGNob29zZSB0aGUgbG9jYXRpb24gZmlyc3QnIHwgdHJhbnNsYXRlfX0gPC9wPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snTGFuZ3VhZ2UnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJsb2NhbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cIm51bGxcIj57eydOb3QgYXBwbGljYWJsZScgfCB0cmFuc2xhdGV9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGxvY2FsZSBvZiBsb2NhbGVzXCIgW25nVmFsdWVdPVwibG9jYWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxvY2FsZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS0gSGFzaHRhZ3MgYXJlIGF2YWlsYWJsZSBhZnRlciBTcGFjZSBpcyBzZXQgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snSGFzaHRhZ3MnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cInNwYWNlSUQudmFsdWVcIj5cclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwia2V5d29yZHNSdWxlc1wiICpuZ0lmPVwiYXZhaWxhYmxlSGFzaHRhZ3MubGVuZ3RoID4gMFwiPnt7J0F2YWlsYWJsZSBoYXNodGFncycgfCB0cmFuc2xhdGV9fSA8L3A+XHJcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImtleXdvcmRzUnVsZXNcIiAqbmdJZj1cImF2YWlsYWJsZUhhc2h0YWdzLmxlbmd0aCA9PT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7J05vIGhhc2h0YWdzIGNyZWF0ZWQgZm9yIHRoaXMgbG9jYXRpb24nIHwgdHJhbnNsYXRlfX0gPC9wPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImF2YWlsYWJsZUhhc2h0YWdzLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJrZXl3b3Jkc0Rpc3BsYXkgbm8tYm9yZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrZXl3b3Jkc2Rpc3BsYXlDb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgaGFzaHRhZyBvZiBhdmFpbGFibGVIYXNodGFnc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImhhc2h0YWdBZGRlZChoYXNodGFnKSA/ICdrZXl3b3Jkc0l0ZW0gYWRkZWQnIDogJ2tleXdvcmRzSXRlbSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkhhc2h0YWdDbGljayhoYXNodGFnKVwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cInt7aGFzaHRhZ0FkZGVkKGhhc2h0YWcpID8gKCdSZW1vdmUnfHRyYW5zbGF0ZSkgOiAoJ0FkZCd8dHJhbnNsYXRlKSB9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aGFzaHRhZy5uYW1lfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJrZXl3b3Jkc1J1bGVzXCI+e3snQWRkZWQgaGFzaHRhZ3MnIHwgdHJhbnNsYXRlfX0gPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImtleXdvcmRzRGlzcGxheVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2V5d29yZHNkaXNwbGF5Q29udGFpbmVyXCIgKm5nSWY9XCJhZGRlZEhhc2h0YWdzLmxlbmd0aD4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwia2V5d29yZHNJdGVtXCIgKm5nRm9yPVwibGV0IGhhc2h0YWcgb2YgYWRkZWRIYXNodGFnc1wiPnt7IGhhc2h0YWcubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlQnV0dG9uXCIgKGNsaWNrKT1cInJlbW92ZUhhc2h0YWcoaGFzaHRhZylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcm9zc0l0ZW1cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04IGhpbnQtY29udGFpbmVyXCIgKm5nSWY9XCIhc3BhY2VJRC52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJoaW50IGtleXdvcmRzUnVsZXNcIj57eydZb3UgbmVlZCB0byBjaG9vc2UgdGhlIGxvY2F0aW9uIGZpcnN0JyB8IHRyYW5zbGF0ZX19IDwvcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J01pc3Npb24gU3RhcnQgRGF0ZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcGxhY2Vob2xkZXI9XCJkZC9tbS95eXl5XCIgZm9ybUNvbnRyb2xOYW1lPVwic3RhcnREYXRlXCIgbmdiRGF0ZXBpY2tlclxyXG4gICAgICAgICAgICAgICAgICAgICNkMT1cIm5nYkRhdGVwaWNrZXJcIiBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1zdGFydERhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cInZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydzdGFydERhdGUnXSl8fCBkYXRlRXJyb3JcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1hcHBlbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBjYWxlbmRhclwiIChjbGljayk9XCJkMS50b2dnbGUoKVwiIHR5cGU9XCJidXR0b25cIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1zdGFydERhdGUtaW52YWxpZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0cmFuc2xhdGVdPVwidmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ3N0YXJ0RGF0ZSddKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydzdGFydERhdGUnXSlcIj48L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtdGVzdGlkPVwiZm9ybS10ZW1wbGF0ZS1zdGFydERhdGUtaW52YWxpZC12ZXJpZlwiIHRyYW5zbGF0ZT1cImVycm9yRm9ybS5kYXRlX3N0YXJ0X2VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGF0ZUVycm9yXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydNaXNzaW9uIFN0YXJ0IFRpbWUnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgY29sLXNtLTggdGltZVpvbmVDb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDxuZ2ItdGltZXBpY2tlciBbKG5nTW9kZWwpXT1cIm1pc3Npb25UaW1lU3RhcnRcIiBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCI+PC9uZ2ItdGltZXBpY2tlcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J01pc3Npb24gRW5kIERhdGUnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHBsYWNlaG9sZGVyPVwiZGQvbW0veXl5eVwiIG5nYkRhdGVwaWNrZXIgI2QyPVwibmdiRGF0ZXBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZW5kRGF0ZVwiIGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLWVuZERhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cInZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydlbmREYXRlJ10pXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYXBwZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnkgY2FsZW5kYXJcIiAoY2xpY2spPVwiZDIudG9nZ2xlKClcIiB0eXBlPVwiYnV0dG9uXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tZW5kRGF0ZS1pbnZhbGlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RyYW5zbGF0ZV09XCJ2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snZW5kRGF0ZSddKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydlbmREYXRlJ10pXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS10ZXN0aWQ9XCJmb3JtLXRlbXBsYXRlLWVuZERhdGUtaW52YWxpZC12ZXJpZlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGU9XCJlcnJvckZvcm0uZGF0ZV9lbmRfc3RhcnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJkYXRlRXJyb3JcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J01pc3Npb24gRW5kIFRpbWUnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgY29sLXNtLTggdGltZVpvbmVDb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDxuZ2ItdGltZXBpY2tlciBbKG5nTW9kZWwpXT1cIm1pc3Npb25UaW1lRW5kXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPjwvbmdiLXRpbWVwaWNrZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWNvbnRyb2wtZGl2IGFjdGlvbi1idXR0b24tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIFtkaXNhYmxlZF09XCJtaXNzaW9uRm9ybS5pbnZhbGlkXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1yLTMgYWN0aW9uLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1zdWJtaXQtYnRuXCI+e3snU2F2ZScgfFxyXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIiBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1jYW5jZWwtYnRuXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIGFjdGlvbi1idXR0b25cIj57eydDYW5jZWwnIHxcclxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Zvcm0+XHJcbjwvZGl2PiJdfQ==
260
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1taXNzaW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1hZG1pbi9zcmMvbGliL3VzZXIvZm9ybS1taXNzaW9uL2Zvcm0tbWlzc2lvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL2Zvcm0tbWlzc2lvbi9mb3JtLW1pc3Npb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvRSxPQUFPLEVBRUgsV0FBVyxFQUFVLE1BQU0sRUFDTyxXQUFXLEVBQUUsV0FBVyxFQUNKLGtCQUFrQixFQUMzRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBcUIsYUFBYSxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDOzs7Ozs7O0FBUXZILE1BQU0sT0FBTyxvQkFBb0I7SUFnRDdCLFlBQ1ksRUFBZSxFQUNmLFlBQTBCLEVBQzFCLFdBQTRCLEVBQzVCLGFBQTRCLEVBQzVCLG1CQUF3QyxFQUN4QyxXQUF3QixFQUN4QixjQUE4QixFQUM5QixhQUE0QixFQUM3QixpQkFBb0M7UUFSbkMsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hD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LEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUMzRCxlQUFlLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQ3ZDO1lBQ0QsSUFBSSxTQUFTLENBQUMsT0FBTyxFQUFFO2dCQUNuQixNQUFNLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztnQkFDbEUsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO2dCQUN2RCxhQUFhLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQ25DO1lBRUQsSUFBSSxhQUFhLElBQUksZUFBZTtnQkFDaEMsYUFBYSxJQUFJLGVBQWUsRUFBRTtnQkFDbEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2FBQzVCO2lCQUFNO2dCQUNILElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixPQUFPLENBQUMsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQzthQUMvQztRQUVMLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQzs7aUhBeFRRLG9CQUFvQjtxR0FBcEIsb0JBQW9CLG1UQ2xCakMsNnlkQTJQTTsyRkR6T08sb0JBQW9CO2tCQUxoQyxTQUFTOytCQUNJLGtCQUFrQjs0VUFNbkIsYUFBYTtzQkFBckIsS0FBSztnQkFFRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUVHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBTUksaUJBQWlCO3NCQUExQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1CdWlsZGVyLCBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7XHJcbiAgICBab25lLCBNaXNzaW9uLCBPcmdhbmlzYXRpb24sIFNwYWNlLCBSb2xlU3RhdHVzLFxyXG4gICAgTGV2ZWxTdGF0dXMsIERvbWFpbiwgTG9jYWxlLCBCYXNlVXNlclNlcnZpY2UsIERvbWFpblNlcnZpY2UsXHJcbiAgICBPcmdhbmlzYXRpb25TZXJ2aWNlLCBab25lU2VydmljZSwgZW51bVRvQXJyYXksIEVtYWlsU3RhdHVzLFxyXG4gICAgSGFzaHRhZywgU3BhY2VTZXJ2aWNlLCBMb2NhbGVTZXJ2aWNlLCBIYXNodGFnU2VydmljZSwgc3RyaW5nTG9jYWxlVG9FbnVtXHJcbn0gZnJvbSAnQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlJztcclxuaW1wb3J0IHsgRGF0ZVRpbWUgfSBmcm9tIFwibHV4b25cIjtcclxuaW1wb3J0IHsgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVmFsaWRhdG9yc1NlcnZpY2UsIHRleHRWYWxpZGF0b3IsIG5vRW1wdHlWYWxpZGF0b3IsIGZsb2F0VmFsaWRhdG9yIH0gZnJvbSBcIkBzbWFydGVycGxhbi9uZ3gtc21hcnRlcnBsYW4tY29yZVwiO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdsaWItZm9ybS1taXNzaW9uJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9mb3JtLW1pc3Npb24uY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vZm9ybS1taXNzaW9uLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEZvcm1NaXNzaW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICBASW5wdXQoKSBtaXNzaW9uVG9FZGl0OiBNaXNzaW9uO1xyXG5cclxuICAgIEBJbnB1dCgpIG9yZ2FuaXNhdGlvbkZvck1pc3Npb246IE9yZ2FuaXNhdGlvbjtcclxuXHJcbiAgICBASW5wdXQoKSBpc1NQOiBib29sZWFuO1xyXG5cclxuICAgIEBJbnB1dCgpIHVzZXJGb3JNaXNzaW9uSUQ6IHN0cmluZztcclxuXHJcbiAgICBASW5wdXQoKSBjdXJyZW50VXNlck9yZ2FuaXNhdGlvbjogT3JnYW5pc2F0aW9uO1xyXG5cclxuICAgIG1pc3Npb25Gb3JtOiBGb3JtR3JvdXA7XHJcblxyXG4gICAgYXZhaWxhYmxlU3BhY2VzOiBTcGFjZVtdO1xyXG5cclxuICAgIEBPdXRwdXQoKSBhZGRlZE1pc3Npb25JbnB1dCA9IG5ldyBFdmVudEVtaXR0ZXI8TWlzc2lvbj4oKTtcclxuXHJcbiAgICBhdmFpbGFibGVSb2xlczogUm9sZVN0YXR1c1tdO1xyXG5cclxuICAgIGF2YWlsYWJsZUxldmVsczogTGV2ZWxTdGF0dXNbXTtcclxuXHJcbiAgICBhdmFpbGFibGVIYXNodGFnczogSGFzaHRhZ1tdID0gW107XHJcblxyXG4gICAgZG9tYWluczogRG9tYWluW107XHJcblxyXG4gICAgYWxsT3JnczogT3JnYW5pc2F0aW9uW107XHJcblxyXG4gICAgaXNHdWlkZSA9IGZhbHNlO1xyXG5cclxuICAgIHpvbmVzRm9yU3BhY2U6IFpvbmVbXTtcclxuXHJcbiAgICBkZWZhdWx0Wm9uZTogWm9uZTtcclxuXHJcbiAgICBtaXNzaW9uVGltZVN0YXJ0OiBudW1iZXIgPSAxMiAqIDYwICogNjAwMDA7IC8vIG1pZGRheSBpbiBtaWxsaXNlY29uZHNcclxuXHJcbiAgICBtaXNzaW9uVGltZUVuZDogbnVtYmVyID0gMTIgKiA2MCAqIDYwMDAwO1xyXG5cclxuICAgIGFkZGVkSGFzaHRhZ3M6IEhhc2h0YWdbXSA9IFtdO1xyXG5cclxuICAgIGN1cnJlbnRMb2NhbGU6IExvY2FsZTtcclxuXHJcbiAgICBsb2NhbGVzOiBzdHJpbmdbXTtcclxuXHJcbiAgICBkYXRlRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBlcnJvckZvcm06IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICAgICAgICBwcml2YXRlIHNwYWNlU2VydmljZTogU3BhY2VTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGRvbWFpblNlcnZpY2U6IERvbWFpblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBvcmdhbmlzYXRpb25TZXJ2aWNlOiBPcmdhbmlzYXRpb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgem9uZVNlcnZpY2U6IFpvbmVTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgaGFzaHRhZ1NlcnZpY2U6IEhhc2h0YWdTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbG9jYWxlU2VydmljZTogTG9jYWxlU2VydmljZSxcclxuICAgICAgICBwdWJsaWMgdmFsaWRhdG9yc1NlcnZpY2U6IFZhbGlkYXRvcnNTZXJ2aWNlXHJcbiAgICApIHsgfVxyXG5cclxuICAgIGFzeW5jIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlVXNlckluZm8oKTtcclxuICAgICAgICBhd2FpdCB0aGlzLnNldERvbWFpbnMoKTtcclxuICAgICAgICBpZiAodGhpcy5pc1NQKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWxsT3JncyA9IGF3YWl0IHRoaXMub3JnYW5pc2F0aW9uU2VydmljZS5saXN0T3JnYW5pc2F0aW9ucygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmN1cnJlbnRMb2NhbGUgPSBzdHJpbmdMb2NhbGVUb0VudW0odGhpcy5sb2NhbGVTZXJ2aWNlLmdldExvY2FsZSgpKTsgLy8gdG8gbWF0Y2ggZW51bSBMb2NhbGVcclxuICAgICAgICB0aGlzLmxvY2FsZXMgPSBlbnVtVG9BcnJheShMb2NhbGUpO1xyXG4gICAgICAgIGlmICh0aGlzLm1pc3Npb25Ub0VkaXQpIHtcclxuICAgICAgICAgICAgdGhpcy5pbml0Rm9ybUZvckVkaXQoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRFbXB0eUZvcm0oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlVXNlckluZm8oKSB7XHJcbiAgICAgICAgdGhpcy5hdmFpbGFibGVSb2xlcyA9XHJcbiAgICAgICAgICAgIHRoaXMudXNlclNlcnZpY2UuZ2V0QXZhaWxhYmxlUm9sZXNGb3JDdXJyZW50VXNlcigpO1xyXG4gICAgICAgIHRoaXMuYXZhaWxhYmxlTGV2ZWxzID1cclxuICAgICAgICAgICAgdGhpcy51c2VyU2VydmljZS5nZXRBdmFsYWJsZUxldmVsc0ZvckN1cnJlbnRVc2VyKCk7XHJcbiAgICAgICAgdGhpcy5pc0d1aWRlID0gdGhpcy51c2VyU2VydmljZS5pc0d1aWRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2V0RG9tYWlucygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNHdWlkZSkge1xyXG4gICAgICAgICAgICBjb25zdCBkb21haW5zID1cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZG9tYWluU2VydmljZS5nZXREb21haW5zRm9yTWlzc2lvbnNGb3JPcmcoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VXNlck9yZ2FuaXNhdGlvbi5pZCxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMuZG9tYWlucyA9IGRvbWFpbnM7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNldEhhc2h0YWdzKHNwYWNlSUQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuYXZhaWxhYmxlSGFzaHRhZ3MgPSBhd2FpdCB0aGlzLmhhc2h0YWdTZXJ2aWNlLmdldEhhc2h0YWdzRm9yU3BhY2UoXHJcbiAgICAgICAgICAgIHNwYWNlSUQsXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc3BhY2VJRCgpOiBBYnN0cmFjdENvbnRyb2wge1xyXG4gICAgICAgIHJldHVybiB0aGlzLm1pc3Npb25Gb3JtLmdldChcInNwYWNlXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCByb2xlKCk6IEFic3RyYWN0Q29udHJvbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubWlzc2lvbkZvcm0uZ2V0KFwicm9sZVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0Rm9ybUZvckVkaXQoKSB7XHJcbiAgICAgICAgbGV0IHN0YXJ0RGF0ZTogYW55ID0gbnVsbDtcclxuICAgICAgICBsZXQgZW5kRGF0ZTogYW55ID0gbnVsbDtcclxuXHJcbiAgICAgICAgY29uc3QgbSA9IHRoaXMubWlzc2lvblRvRWRpdDtcclxuXHJcbiAgICAgICAgaWYgKG0uc3RhcnREYXRlVGltZSkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlID0gRGF0ZVRpbWUuZnJvbUlTTyhtLnN0YXJ0RGF0ZVRpbWUpO1xyXG4gICAgICAgICAgICB0aGlzLm1pc3Npb25UaW1lU3RhcnQgPSAoZGF0ZS5ob3VyICogNjAgKyBkYXRlLm1pbnV0ZSkgKiA2MCAqIDEwMDA7XHJcbiAgICAgICAgICAgIHN0YXJ0RGF0ZSA9IGRhdGUudG9NaWxsaXMoKSAtIHRoaXMubWlzc2lvblRpbWVTdGFydDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG0uZW5kRGF0ZVRpbWUpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IERhdGVUaW1lLmZyb21JU08obS5lbmREYXRlVGltZSk7XHJcbiAgICAgICAgICAgIHRoaXMubWlzc2lvblRpbWVFbmQgPSAoZGF0ZS5ob3VyICogNjAgKyBkYXRlLm1pbnV0ZSkgKiA2MCAqIDEwMDA7XHJcbiAgICAgICAgICAgIGVuZERhdGUgPSBkYXRlLnRvTWlsbGlzKCkgLSB0aGlzLm1pc3Npb25UaW1lRW5kO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51c2VyRm9yTWlzc2lvbklEID0gbS51c2VySUQ7XHJcbiAgICAgICAgdGhpcy5hdmFpbGFibGVTcGFjZXMgPSBhd2FpdCB0aGlzLnNwYWNlU2VydmljZS5nZXRBbGxvd2VkU3BhY2VzRm9yT3JnKFxyXG4gICAgICAgICAgICB0aGlzLm1pc3Npb25Ub0VkaXQub3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFVzZXJPcmdhbmlzYXRpb24uaWQsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBhd2FpdCB0aGlzLnNldEhhc2h0YWdzKG0uc3BhY2VJRCk7XHJcbiAgICAgICAgdGhpcy5taXNzaW9uRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgICAgICBpZDogbS5pZCxcclxuICAgICAgICAgICAgb3JnYW5pc2F0aW9uOiBbeyB2YWx1ZTogbS5vcmdhbmlzYXRpb24ubmFtZSwgZGlzYWJsZWQ6IHRydWUgfV0sXHJcbiAgICAgICAgICAgIG9yZ2FuaXNhdGlvbklEOiBtLm9yZ2FuaXNhdGlvbklELFxyXG4gICAgICAgICAgICBvcmRlcmVkT3JnYW5pc2F0aW9uSUQ6IG0ub3JkZXJlZE9yZ2FuaXNhdGlvbklELFxyXG4gICAgICAgICAgICByb2xlOiBbbS5yb2xlLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgICAgbGV2ZWw6IFttLmxldmVsXSxcclxuICAgICAgICAgICAgc3BhY2U6IFttLnNwYWNlSUQsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogW20uZGVzY3JpcHRpb24sIFt0ZXh0VmFsaWRhdG9yKCksIG5vRW1wdHlWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgICAgICBkb21haW5zOiBbbS5kb21haW5zXSxcclxuICAgICAgICAgICAgem9uZTogW20uem9uZUlEXSxcclxuICAgICAgICAgICAgbG9jYWxlOiBbbS5sb2NhbGVdLFxyXG4gICAgICAgICAgICBzdGFydERhdGU6IFtzdGFydERhdGUsIFtmbG9hdFZhbGlkYXRvcigpXV0sXHJcbiAgICAgICAgICAgIGVuZERhdGU6IFtlbmREYXRlLCBbZmxvYXRWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChtLmhhc2h0YWdzICYmIG0uaGFzaHRhZ3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZGVkSGFzaHRhZ3MgPSB0aGlzLmF2YWlsYWJsZUhhc2h0YWdzLmZpbHRlcigoaGFzaHRhZykgPT5cclxuICAgICAgICAgICAgICAgIG0uaGFzaHRhZ3MuaW5jbHVkZXMoaGFzaHRhZy5pZCksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMub25TcGFjZUNsaWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TcGFjZUNsaWNrKCkge1xyXG4gICAgICAgIGNvbnN0IHpvbmVzID0gYXdhaXQgdGhpcy56b25lU2VydmljZS5nZXRab25lc0J5U3BhY2UoXHJcbiAgICAgICAgICAgIHRoaXMuc3BhY2VJRC52YWx1ZSxcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdFpvbmUgPSB6b25lcy5maW5kKCh6b25lKSA9PiAhem9uZS5wYXJlbnRJRCk7XHJcbiAgICAgICAgY29uc3QgaW5kZXhPZkRlZmF1bHRab25lID0gem9uZXMuaW5kZXhPZih0aGlzLmRlZmF1bHRab25lKTtcclxuICAgICAgICB6b25lcy5zcGxpY2UoaW5kZXhPZkRlZmF1bHRab25lLCAxKTtcclxuICAgICAgICB0aGlzLnpvbmVzRm9yU3BhY2UgPSB6b25lcztcclxuICAgICAgICBhd2FpdCB0aGlzLnNldEhhc2h0YWdzKHRoaXMuc3BhY2VJRC52YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdEVtcHR5Rm9ybSgpIHtcclxuICAgICAgICB0aGlzLmF2YWlsYWJsZVNwYWNlcyA9IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmdldEFsbG93ZWRTcGFjZXNGb3JPcmcoXHJcbiAgICAgICAgICAgIHRoaXMub3JnYW5pc2F0aW9uRm9yTWlzc2lvbi5pZCxcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50VXNlck9yZ2FuaXNhdGlvbi5pZCxcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMubWlzc2lvbkZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgICAgcm9sZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgICAgbGV2ZWw6IFtMZXZlbFN0YXR1cy5NSU5JTVVNXSxcclxuICAgICAgICAgICAgb3JnYW5pc2F0aW9uOiBbXHJcbiAgICAgICAgICAgICAgICB7IHZhbHVlOiB0aGlzLm9yZ2FuaXNhdGlvbkZvck1pc3Npb24ubmFtZSwgZGlzYWJsZWQ6IHRydWUgfSxcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgb3JnYW5pc2F0aW9uSUQ6IHRoaXMub3JnYW5pc2F0aW9uRm9yTWlzc2lvbi5pZCxcclxuICAgICAgICAgICAgb3JkZXJlZE9yZ2FuaXNhdGlvbklEOiB0aGlzLmN1cnJlbnRVc2VyT3JnYW5pc2F0aW9uLmlkLFxyXG4gICAgICAgICAgICBzcGFjZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgICAgem9uZTogWycnXSxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFtcIlwiLCBbdGV4dFZhbGlkYXRvcigpLCBub0VtcHR5VmFsaWRhdG9yKCldXSxcclxuICAgICAgICAgICAgZG9tYWluczogW251bGxdLFxyXG4gICAgICAgICAgICBsb2NhbGU6IFt0aGlzLmN1cnJlbnRMb2NhbGVdLFxyXG4gICAgICAgICAgICBzdGFydERhdGU6IFtudWxsLCBbZmxvYXRWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgICAgICBlbmREYXRlOiBbbnVsbCwgW2Zsb2F0VmFsaWRhdG9yKCldXSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkhhc2h0YWdDbGljayhoYXNodGFnOiBIYXNodGFnKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc2h0YWdBZGRlZChoYXNodGFnKSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZGVkSGFzaHRhZ3MucHVzaChoYXNodGFnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFkZGVkSGFzaHRhZ3Muc3BsaWNlKHRoaXMuYWRkZWRIYXNodGFncy5pbmRleE9mKGhhc2h0YWcpLCAxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaGFzaHRhZ0FkZGVkKGhhc2h0YWc6IEhhc2h0YWcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICB0aGlzLmFkZGVkSGFzaHRhZ3MuZmluZChcclxuICAgICAgICAgICAgICAgIChfaGFzaHRhZykgPT4gX2hhc2h0YWcuaWQgPT09IGhhc2h0YWcuaWQsXHJcbiAgICAgICAgICAgICkgIT09IHVuZGVmaW5lZFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlSGFzaHRhZyhoYXNodGFnOiBIYXNodGFnKSB7XHJcbiAgICAgICAgdGhpcy5hZGRlZEhhc2h0YWdzLnNwbGljZSh0aGlzLmFkZGVkSGFzaHRhZ3MuaW5kZXhPZihoYXNodGFnKSwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TdWJtaXQoKSB7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5taXNzaW9uRm9ybS52YWxpZCkge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yRm9ybSA9IHRydWU7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGRhdGVzVmFsdWVzID0gYXdhaXQgdGhpcy5vblZlcmlmRGF0ZSgpO1xyXG4gICAgICAgIGlmKGRhdGVzVmFsdWVzLmVycm9yKXtcclxuICAgICAgICAgICAgdGhpcy5kYXRlRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yRm9ybSA9IHRydWU7XHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5taXNzaW9uRm9ybS52YWx1ZTtcclxuICAgICAgICAvLyBpZiAoIXRoaXMubWlzc2lvbkZvcm0udmFsaWQpIHtcclxuICAgICAgICAvLyAgICAgLy8gdGhpcyBzaG93cyBlcnJvcnMgaW4gdGhlIGZvcm1cclxuICAgICAgICAvLyAgICAgdGhpcy5taXNzaW9uRm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgLy8gICAgIHJldHVybjtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gbGV0IHN0YXJ0RGF0ZVN0cmluZzogc3RyaW5nO1xyXG4gICAgICAgIC8vIGxldCBlbmREYXRlU3RyaW5nOiBzdHJpbmc7XHJcbiAgICAgICAgLy8gaWYgKGZvcm1WYWx1ZS5zdGFydERhdGUpIHtcclxuICAgICAgICAvLyAgICAgY29uc3QgZGF0ZUhvdXJTdGFydE51bWJlciA9IGZvcm1WYWx1ZS5zdGFydERhdGUgKyB0aGlzLm1pc3Npb25UaW1lU3RhcnQ7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IERhdGVUaW1lLmZyb21NaWxsaXMoZGF0ZUhvdXJTdGFydE51bWJlcik7XHJcbiAgICAgICAgLy8gICAgIHN0YXJ0RGF0ZVN0cmluZyA9IHN0YXJ0RGF0ZS50b0lTTygpO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBpZiAoZm9ybVZhbHVlLmVuZERhdGUpIHtcclxuICAgICAgICAvLyAgICAgY29uc3QgZGF0ZUhvdXJFbmROdW1iZXIgPSBmb3JtVmFsdWUuZW5kRGF0ZSArIHRoaXMubWlzc2lvblRpbWVFbmQ7XHJcbiAgICAgICAgLy8gICAgIGNvbnN0IGVuZERhdGUgPSBEYXRlVGltZS5mcm9tTWlsbGlzKGRhdGVIb3VyRW5kTnVtYmVyKTtcclxuICAgICAgICAvLyAgICAgZW5kRGF0ZVN0cmluZyA9IGVuZERhdGUudG9JU08oKTtcclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIC8vIGlmIChlbmREYXRlU3RyaW5nICYmIHN0YXJ0RGF0ZVN0cmluZyAmJiAoZW5kRGF0ZVN0cmluZyA8IHN0YXJ0RGF0ZVN0cmluZykpIHtcclxuICAgICAgICAvLyAgICAgdGhpcy5kYXRlRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgIC8vICAgICByZXR1cm47XHJcbiAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAvLyAgICAgdGhpcy5kYXRlRXJyb3IgPSBmYWxzZTtcclxuICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgIGNvbnN0IG1pc3Npb25JbnB1dDogTWlzc2lvbiA9IHtcclxuICAgICAgICAgICAgb3JnYW5pc2F0aW9uSUQ6IGZvcm1WYWx1ZS5vcmdhbmlzYXRpb25JRCxcclxuICAgICAgICAgICAgb3JkZXJlZE9yZ2FuaXNhdGlvbklEOiBmb3JtVmFsdWUub3JkZXJlZE9yZ2FuaXNhdGlvbklELFxyXG4gICAgICAgICAgICBsZXZlbDogZm9ybVZhbHVlLmxldmVsLFxyXG4gICAgICAgICAgICByb2xlOiBmb3JtVmFsdWUucm9sZSxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGZvcm1WYWx1ZS5kZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgc3RhcnREYXRlVGltZTogZGF0ZXNWYWx1ZXMuc3RhcnREYXRlU3RyaW5nLFxyXG4gICAgICAgICAgICBlbmREYXRlVGltZTogZGF0ZXNWYWx1ZXMuZW5kRGF0ZVN0cmluZyxcclxuICAgICAgICAgICAgZG9tYWluczogZm9ybVZhbHVlLmRvbWFpbnMsXHJcbiAgICAgICAgICAgIHVzZXJJRDogdGhpcy51c2VyRm9yTWlzc2lvbklELFxyXG4gICAgICAgICAgICBlbWFpbFN0YXR1czogdGhpcy5taXNzaW9uVG9FZGl0XHJcbiAgICAgICAgICAgICAgICA/IHRoaXMubWlzc2lvblRvRWRpdC5lbWFpbFN0YXR1c1xyXG4gICAgICAgICAgICAgICAgOiBFbWFpbFN0YXR1cy5DUkVBVElPTl9UT19ERUxJVkVSLFxyXG4gICAgICAgICAgICBsb2NhbGU6IGZvcm1WYWx1ZS5sb2NhbGUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBtaXNzaW9uSW5wdXQuaGFzaHRhZ3MgPSB0aGlzLmFkZGVkSGFzaHRhZ3MubWFwKChoKSA9PiBoLmlkKTtcclxuICAgICAgICBpZiAoZm9ybVZhbHVlLnNwYWNlKSB7XHJcbiAgICAgICAgICAgIG1pc3Npb25JbnB1dC5zcGFjZUlEID0gZm9ybVZhbHVlLnNwYWNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZm9ybVZhbHVlLnpvbmUpIHtcclxuICAgICAgICAgICAgbWlzc2lvbklucHV0LnpvbmVJRCA9IGZvcm1WYWx1ZS56b25lO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5taXNzaW9uVG9FZGl0KSB7XHJcbiAgICAgICAgICAgIG1pc3Npb25JbnB1dC5pZCA9IHRoaXMubWlzc2lvblRvRWRpdC5pZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hZGRlZE1pc3Npb25JbnB1dC5lbWl0KG1pc3Npb25JbnB1dCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DYW5jZWwoKSB7XHJcbiAgICAgICAgdGhpcy5hZGRlZE1pc3Npb25JbnB1dC5lbWl0KG51bGwpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBpc0Zvcm1FcnJvcihjb250cm9sKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbnRyb2wgJiYgY29udHJvbC5pbnZhbGlkICYmIHRoaXMuZXJyb3JGb3JtO1xyXG4gICAgfVxyXG5cclxuICAgIG9uVmVyaWZEYXRlKCk6IFByb21pc2U8eyBzdGFydERhdGVTdHJpbmc/OiBzdHJpbmcsIGVuZERhdGVTdHJpbmc/OiBzdHJpbmcsIGVycm9yPzogYm9vbGVhbiB9PiB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMubWlzc2lvbkZvcm0uZ2V0UmF3VmFsdWUoKTtcclxuICAgICAgICAgICAgbGV0IHN0YXJ0RGF0ZVN0cmluZzogc3RyaW5nO1xyXG4gICAgICAgICAgICBsZXQgZW5kRGF0ZVN0cmluZzogc3RyaW5nO1xyXG5cclxuXHJcbiAgICAgICAgICAgIGlmIChmb3JtVmFsdWUuc3RhcnREYXRlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlSG91clN0YXJ0TnVtYmVyID0gZm9ybVZhbHVlLnN0YXJ0RGF0ZSArIHRoaXMubWlzc2lvblRpbWVTdGFydDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IERhdGVUaW1lLmZyb21NaWxsaXMoZGF0ZUhvdXJTdGFydE51bWJlcik7XHJcbiAgICAgICAgICAgICAgICBzdGFydERhdGVTdHJpbmcgPSBzdGFydERhdGUudG9JU08oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZm9ybVZhbHVlLmVuZERhdGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVIb3VyRW5kTnVtYmVyID0gZm9ybVZhbHVlLmVuZERhdGUgKyB0aGlzLm1pc3Npb25UaW1lRW5kO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZW5kRGF0ZSA9IERhdGVUaW1lLmZyb21NaWxsaXMoZGF0ZUhvdXJFbmROdW1iZXIpO1xyXG4gICAgICAgICAgICAgICAgZW5kRGF0ZVN0cmluZyA9IGVuZERhdGUudG9JU08oKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGVuZERhdGVTdHJpbmcgJiYgc3RhcnREYXRlU3RyaW5nICYmXHJcbiAgICAgICAgICAgICAgICBlbmREYXRlU3RyaW5nIDw9IHN0YXJ0RGF0ZVN0cmluZykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlRXJyb3IgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7IGVycm9yOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlRXJyb3IgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoeyBzdGFydERhdGVTdHJpbmcsIGVuZERhdGVTdHJpbmcgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImZvcm0tY29udGFpbnRlclwiICpuZ0lmPVwibWlzc2lvbkZvcm1cIj5cclxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxcmVtO1wiPlxyXG4gICAgICAgIDxoND57eyAnTWlzc2lvbiBkZXRhaWxzJyB8IHRyYW5zbGF0ZSB9fTwvaDQ+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxmb3JtIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdCgpXCIgW2Zvcm1Hcm91cF09XCJtaXNzaW9uRm9ybVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J09yZ2FuaXNhdGlvbicgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tb3JnYW5pc2F0aW9uXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm9yZ2FuaXNhdGlvblwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCIgKm5nSWY9XCJpc1NQXCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3sgJ09yZGVyZWQgYnknIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVxdWlyZWQgZm9ybUNvbnRyb2xOYW1lPVwib3JkZXJlZE9yZ2FuaXNhdGlvbklEXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3JnIG9mIGFsbE9yZ3NcIiBbbmdWYWx1ZV09XCJvcmcuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgb3JnLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snRGVzY3JpcHRpb24nIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCIgcm93cz1cIjEwXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ2Rlc2NyaXB0aW9uJ10pfHwgaXNGb3JtRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ2Rlc2NyaXB0aW9uJ10pfSBcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLWRlc2NyaXB0aW9uXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1kZXNjcmlwdGlvbi1pbnZhbGlkXCIgW2Rpc21pc3NpYmxlXT1cImZhbHNlXCIgdHlwZT1cImRhbmdlclwiICpuZ0lmPVwiIHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydkZXNjcmlwdGlvbiddKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgIGlzRm9ybUVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydkZXNjcmlwdGlvbiddKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e3ZhbGlkYXRvcnNTZXJ2aWNlLmdldEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydkZXNjcmlwdGlvbiddKSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZ2ItYWxlcnQ+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J1JvbGUnIHwgdHJhbnNsYXRlfX0qPC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVxdWlyZWQgZm9ybUNvbnRyb2xOYW1lPVwicm9sZVwiIGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLXJvbGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaXMtaW52YWxpZCcgOiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1sncm9sZSddKXx8IGlzRm9ybUVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydyb2xlJ10pfSBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCByIG9mIGF2YWlsYWJsZVJvbGVzXCIgW25nVmFsdWVdPVwiclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyByIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1yb2xlLWludmFsaWRcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIiB0eXBlPVwiZGFuZ2VyXCIgKm5nSWY9XCIgdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ3JvbGUnXSkgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICBpc0Zvcm1FcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1sncm9sZSddKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e3ZhbGlkYXRvcnNTZXJ2aWNlLmdldEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydyb2xlJ10pIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCJcclxuICAgICAgICAgICAgKm5nSWY9XCJtaXNzaW9uRm9ybS5nZXQoJ3JvbGUnKS52YWx1ZSAhPT0gJ1ZJU0lUT1JfTVVTRVVNJyAmJiBtaXNzaW9uRm9ybS5nZXQoJ3JvbGUnKS52YWx1ZSAhPT0gJ0dVSURFX01VU0VVTSdcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydEb21haW5zJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCIgKm5nSWY9XCJkb21haW5zXCI+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgbXVsdGlwbGUgZm9ybUNvbnRyb2xOYW1lPVwiZG9tYWluc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGRvbWFpbiBvZiBkb21haW5zXCIgW25nVmFsdWVdPVwiZG9tYWluLmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRvbWFpbi5uYW1lIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0FjY2VzcyBsZXZlbCcgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJlcXVpcmVkIGZvcm1Db250cm9sTmFtZT1cImxldmVsXCIgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tbGV2ZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBsZXZlbCBvZiBhdmFpbGFibGVMZXZlbHNcIiBbbmdWYWx1ZV09XCJsZXZlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBsZXZlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eyAnQXV0aG9yaXplZCBsb2NhdGlvbicgfCB0cmFuc2xhdGUgfX0qPC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCIgKm5nSWY9XCJhdmFpbGFibGVTcGFjZXNcIj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByZXF1aXJlZCBmb3JtQ29udHJvbE5hbWU9XCJzcGFjZVwiIChjaGFuZ2UpPVwib25TcGFjZUNsaWNrKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLXNwYWNlXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ3NwYWNlJ10pfHwgaXNGb3JtRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ3NwYWNlJ10pfSBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBzcGFjZSBvZiBhdmFpbGFibGVTcGFjZXNcIiBbbmdWYWx1ZV09XCJzcGFjZS5pZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBzcGFjZS5uYW1lIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1zcGFjZS1pbnZhbGlkXCIgW2Rpc21pc3NpYmxlXT1cImZhbHNlXCIgdHlwZT1cImRhbmdlclwiICpuZ0lmPVwiIHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydzcGFjZSddKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgIGlzRm9ybUVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydzcGFjZSddKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e3ZhbGlkYXRvcnNTZXJ2aWNlLmdldEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydzcGFjZSddKSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZ2ItYWxlcnQ+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiICpuZ0lmPVwiIWF2YWlsYWJsZVNwYWNlc1wiPlxyXG4gICAgICAgICAgICAgICAge3sgJ05vIGxvY2F0aW9ucyBhdmFpbGFibGUnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7ICdBdXRob3JpemVkIHpvbmUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCIgKm5nSWY9XCJ6b25lc0ZvclNwYWNlOyBlbHNlIG5vU3BhY2VcIj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJ6b25lXCIgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tem9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwiZGVmYXVsdFpvbmUuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0FsbCB6b25lcycgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB6b25lIG9mIHpvbmVzRm9yU3BhY2VcIiBbbmdWYWx1ZV09XCJ6b25lLmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHpvbmUubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vU3BhY2U+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTggaGludC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImhpbnQga2V5d29yZHNSdWxlc1wiPnt7J1lvdSBuZWVkIHRvIGNob29zZSB0aGUgbG9jYXRpb24gZmlyc3QnIHwgdHJhbnNsYXRlfX0gPC9wPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snTGFuZ3VhZ2UnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJsb2NhbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cIm51bGxcIj57eydOb3QgYXBwbGljYWJsZScgfCB0cmFuc2xhdGV9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGxvY2FsZSBvZiBsb2NhbGVzXCIgW25nVmFsdWVdPVwibG9jYWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxvY2FsZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS0gSGFzaHRhZ3MgYXJlIGF2YWlsYWJsZSBhZnRlciBTcGFjZSBpcyBzZXQgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snSGFzaHRhZ3MnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cInNwYWNlSUQudmFsdWVcIj5cclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwia2V5d29yZHNSdWxlc1wiICpuZ0lmPVwiYXZhaWxhYmxlSGFzaHRhZ3MubGVuZ3RoID4gMFwiPnt7J0F2YWlsYWJsZSBoYXNodGFncycgfCB0cmFuc2xhdGV9fSA8L3A+XHJcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImtleXdvcmRzUnVsZXNcIiAqbmdJZj1cImF2YWlsYWJsZUhhc2h0YWdzLmxlbmd0aCA9PT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7J05vIGhhc2h0YWdzIGNyZWF0ZWQgZm9yIHRoaXMgbG9jYXRpb24nIHwgdHJhbnNsYXRlfX0gPC9wPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImF2YWlsYWJsZUhhc2h0YWdzLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJrZXl3b3Jkc0Rpc3BsYXkgbm8tYm9yZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrZXl3b3Jkc2Rpc3BsYXlDb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgaGFzaHRhZyBvZiBhdmFpbGFibGVIYXNodGFnc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImhhc2h0YWdBZGRlZChoYXNodGFnKSA/ICdrZXl3b3Jkc0l0ZW0gYWRkZWQnIDogJ2tleXdvcmRzSXRlbSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkhhc2h0YWdDbGljayhoYXNodGFnKVwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cInt7aGFzaHRhZ0FkZGVkKGhhc2h0YWcpID8gKCdSZW1vdmUnfHRyYW5zbGF0ZSkgOiAoJ0FkZCd8dHJhbnNsYXRlKSB9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aGFzaHRhZy5uYW1lfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJrZXl3b3Jkc1J1bGVzXCI+e3snQWRkZWQgaGFzaHRhZ3MnIHwgdHJhbnNsYXRlfX0gPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImtleXdvcmRzRGlzcGxheVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2V5d29yZHNkaXNwbGF5Q29udGFpbmVyXCIgKm5nSWY9XCJhZGRlZEhhc2h0YWdzLmxlbmd0aD4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwia2V5d29yZHNJdGVtXCIgKm5nRm9yPVwibGV0IGhhc2h0YWcgb2YgYWRkZWRIYXNodGFnc1wiPnt7IGhhc2h0YWcubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlQnV0dG9uXCIgKGNsaWNrKT1cInJlbW92ZUhhc2h0YWcoaGFzaHRhZylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcm9zc0l0ZW1cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04IGhpbnQtY29udGFpbmVyXCIgKm5nSWY9XCIhc3BhY2VJRC52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJoaW50IGtleXdvcmRzUnVsZXNcIj57eydZb3UgbmVlZCB0byBjaG9vc2UgdGhlIGxvY2F0aW9uIGZpcnN0JyB8IHRyYW5zbGF0ZX19IDwvcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J01pc3Npb24gU3RhcnQgRGF0ZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcGxhY2Vob2xkZXI9XCJkZC9tbS95eXl5XCIgZm9ybUNvbnRyb2xOYW1lPVwic3RhcnREYXRlXCIgbmdiRGF0ZXBpY2tlclxyXG4gICAgICAgICAgICAgICAgICAgICNkMT1cIm5nYkRhdGVwaWNrZXJcIiBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1zdGFydERhdGVcIiAobmdNb2RlbENoYW5nZSk9XCJvblZlcmlmRGF0ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ3N0YXJ0RGF0ZSddKXx8IGlzRm9ybUVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydzdGFydERhdGUnXSl9IFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWFwcGVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGNhbGVuZGFyXCIgKGNsaWNrKT1cImQxLnRvZ2dsZSgpXCIgdHlwZT1cImJ1dHRvblwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZ2ItYWxlcnQgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tc3RhcnREYXRlLWludmFsaWRcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIiB0eXBlPVwiZGFuZ2VyXCIgKm5nSWY9XCIgdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ3N0YXJ0RGF0ZSddKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgIGlzRm9ybUVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydzdGFydERhdGUnXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3t2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snc3RhcnREYXRlJ10pIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1zdGFydERhdGUtaW52YWxpZC12ZXJpZlwiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiIHR5cGU9XCJkYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRhdGVFcnJvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydlcnJvckZvcm0uZGF0ZV9zdGFydF9lbmQnIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snTWlzc2lvbiBTdGFydCBUaW1lJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGNvbC1zbS04IHRpbWVab25lQ29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICA8bmdiLXRpbWVwaWNrZXIgWyhuZ01vZGVsKV09XCJtaXNzaW9uVGltZVN0YXJ0XCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25WZXJpZkRhdGUoKVwiPjwvbmdiLXRpbWVwaWNrZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydNaXNzaW9uIEVuZCBEYXRlJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBwbGFjZWhvbGRlcj1cImRkL21tL3l5eXlcIiBuZ2JEYXRlcGlja2VyICNkMj1cIm5nYkRhdGVwaWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImVuZERhdGVcIiBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1lbmREYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJ2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snZW5kRGF0ZSddKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydpcy1pbnZhbGlkJyA6IHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydlbmREYXRlJ10pfHwgaXNGb3JtRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ2VuZERhdGUnXSl9IFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25WZXJpZkRhdGUoKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWFwcGVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGNhbGVuZGFyXCIgKGNsaWNrKT1cImQyLnRvZ2dsZSgpXCIgdHlwZT1cImJ1dHRvblwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZ2ItYWxlcnQgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tZW5kRGF0ZS1pbnZhbGlkXCIgW2Rpc21pc3NpYmxlXT1cImZhbHNlXCIgdHlwZT1cImRhbmdlclwiICpuZ0lmPVwiIHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydlbmREYXRlJ10pIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCAgaXNGb3JtRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ2VuZERhdGUnXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3t2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snZW5kRGF0ZSddKSB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZ2ItYWxlcnQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxuZ2ItYWxlcnQgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tZW5kRGF0ZS1pbnZhbGlkLXZlcmlmXCIgW2Rpc21pc3NpYmxlXT1cImZhbHNlXCIgdHlwZT1cImRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGF0ZUVycm9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J2Vycm9yRm9ybS5kYXRlX2VuZF9zdGFydCcgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmdiLWFsZXJ0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydNaXNzaW9uIEVuZCBUaW1lJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGNvbC1zbS04IHRpbWVab25lQ29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICA8bmdiLXRpbWVwaWNrZXIgWyhuZ01vZGVsKV09XCJtaXNzaW9uVGltZUVuZFwiIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uVmVyaWZEYXRlKClcIj48L25nYi10aW1lcGlja2VyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1jb250cm9sLWRpdiBhY3Rpb24tYnV0dG9uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtci0zIGFjdGlvbi1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tc3VibWl0LWJ0blwiIFtuZ0NsYXNzXT1cInsnaXMtaW52YWxpZCcgOiBlcnJvckZvcm0gfVwiPnt7J1NhdmUnIHxcclxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkNhbmNlbCgpXCIgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tY2FuY2VsLWJ0blwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBhY3Rpb24tYnV0dG9uXCI+e3snQ2FuY2VsJyB8XHJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCIgKm5nSWY9XCJlcnJvckZvcm1cIj5cclxuICAgICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1pbnZhbGlkXCIgW2Rpc21pc3NpYmxlXT1cImZhbHNlXCIgdHlwZT1cImRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAge3snZXJyb3JGb3JtLmluZm9CdG4nIHx0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICA8L25nYi1hbGVydD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZm9ybT5cclxuPC9kaXY+Il19